LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gUnVubmluZyBTb2Z0d2FyZSBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGhyX3N3cnVuLmMKICogICAgICAoYWxzbyBpbmNsdWRlcyBSdW5uaW5nIFNvZnR3YXJlIFBlcmZvcm1hbmNlIGdyb3VwICkKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxmY250bC5oPgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2lmIEhBVkVfU1lTX1BTVEFUX0gKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1VTRVJfSAojaWZkZWYgc29sYXJpczIKI2luY2x1ZGUgPGxpYmdlbi5oPgojZGVmaW5lIF9LTUVNVVNFUgojZW5kaWYKI2luY2x1ZGUgPHN5cy91c2VyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUFJPQ19ICiNpbmNsdWRlIDxzeXMvcHJvYy5oPgojZW5kaWYKI2lmIEhBVkVfS1ZNX0gKI2luY2x1ZGUgPGt2bS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9ESVJFTlRfSCAmJiAhZGVmaW5lZChjeWd3aW4pCiNpbmNsdWRlIDxkaXJlbnQuaD4KI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGlmIEhBVkVfU1lTX05ESVJfSAojICBpbmNsdWRlIDxzeXMvbmRpci5oPgojIGVuZGlmCiMgaWYgSEFWRV9TWVNfRElSX0gKIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgojIGVuZGlmCiMgaWYgSEFWRV9ORElSX0gKIyAgaW5jbHVkZSA8bmRpci5oPgojIGVuZGlmCiNlbmRpZgojaWZkZWYgY3lnd2luCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzeXMvY3lnd2luLmg+CiNpbmNsdWRlIDx0bGhlbHAzMi5oPgojaW5jbHVkZSA8cHNhcGkuaD4KI2VuZGlmCgojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwojaW5jbHVkZSA8cHJvY2ZzLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgImhvc3RfcmVzLmgiCiNpbmNsdWRlICJocl9zd3J1bi5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgojaW5jbHVkZSAia2VybmVsLmgiCiNpZmRlZiBzb2xhcmlzMgojaWYgX1NMQVNIX1BST0NfTUVUSE9EXyAmJiBkZWZpbmVkIF9JTFAzMgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvY2FjaGVfaGFuZGxlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvaGFyZHdhcmUvbWVtb3J5Lmg+CiNlbmRpZgoKI2luY2x1ZGUgImtlcm5lbF9zdW5vczUuaCIKI2VuZGlmCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiNpbmNsdWRlIDxwcm9jaW5mby5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEluaXRpYWxpc2F0aW9uICYgY29tbW9uIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgICAgICAgICAgICBJbml0X0hSX1NXUnVuKHZvaWQpOwppbnQgICAgICAgICAgICAgR2V0X05leHRfSFJfU1dSdW4odm9pZCk7CnZvaWQgICAgICAgICAgICBFbmRfSFJfU1dSdW4odm9pZCk7CmludCAgICAgICAgICAgICBoZWFkZXJfaHJzd3J1bihzdHJ1Y3QgdmFyaWFibGUgKiwgb2lkICosIHNpemVfdCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiopOwppbnQgICAgICAgICAgICAgaGVhZGVyX2hyc3dydW5FbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiwgb2lkICosIHNpemVfdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKik7CgojaWZkZWYgZHluaXgKcGlkX3QgICAgICAgICAgIG5leHRwcm9jOwpzdGF0aWMgcHJwc2luZm9fdCBsb3dwc2luZm8sIG15cHNpbmZvOwojZW5kaWYKI2lmZGVmIGN5Z3dpbgpzdGF0aWMgc3RydWN0IGV4dGVybmFsX3BpbmZvICpjdXJwcm9jOwpzdGF0aWMgc3RydWN0IGV4dGVybmFsX3BpbmZvIGxvd3Byb2M7CiNlbGlmICFkZWZpbmVkKGxpbnV4KQpzdGF0aWMgaW50ICAgICAgTG93UHJvY0luZGV4OwojZW5kaWYKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKc3RydWN0IHBzdF9zdGF0dXMgKnByb2NfdGFibGU7CnN0cnVjdCBwc3RfZHluYW1pYyBwc3RfZHluOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgpzdHJ1Y3Qga2luZm9fcHJvYzIgKnByb2NfdGFibGU7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCnN0cnVjdCBraW5mb19wcm9jICpwcm9jX3RhYmxlOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQppbnQgICAgICAgICAgICAqcHJvY190YWJsZTsKI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQpzdHJ1Y3QgcHJvY3NpbmZvICpwcm9jX3RhYmxlOwojZWxzZQpzdHJ1Y3QgcHJvYyAgICAqcHJvY190YWJsZTsKI2VuZGlmCiNpZm5kZWYgZHluaXgKaW50ICAgICAgICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeTsKI2VuZGlmCgoKI2RlZmluZQlIUlNXUlVOX09TSU5ERVgJCTEKCiNkZWZpbmUJSFJTV1JVTl9JTkRFWAkJMgojZGVmaW5lCUhSU1dSVU5fTkFNRQkJMwojZGVmaW5lCUhSU1dSVU5fSUQJCTQKI2RlZmluZQlIUlNXUlVOX1BBVEgJCTUKI2RlZmluZQlIUlNXUlVOX1BBUkFNUwkJNgojZGVmaW5lCUhSU1dSVU5fVFlQRQkJNwojZGVmaW5lCUhSU1dSVU5fU1RBVFVTCQk4CgojZGVmaW5lCUhSU1dSVU5QRVJGX0NQVQkJOQojZGVmaW5lCUhSU1dSVU5QRVJGX01FTQkJMTAKCnN0cnVjdCB2YXJpYWJsZTQgaHJzd3J1bl92YXJpYWJsZXNbXSA9IHsKICAgIHtIUlNXUlVOX09TSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzd3J1biwgMSwgezF9fSwKICAgIHtIUlNXUlVOX0lOREVYLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCAxfX0sCiAgICB7SFJTV1JVTl9OQU1FLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzd3J1biwgMywgezIsIDEsIDJ9fSwKICAgIHtIUlNXUlVOX0lELCBBU05fT0JKRUNUX0lELCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzd3J1biwgMywgezIsIDEsIDN9fSwKICAgIHtIUlNXUlVOX1BBVEgsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MiwgMSwgNH19LAogICAge0hSU1dSVU5fUEFSQU1TLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzd3J1biwgMywgezIsIDEsIDV9fSwKICAgIHtIUlNXUlVOX1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzd3J1biwgMywgezIsIDEsIDZ9fSwKICAgIHtIUlNXUlVOX1NUQVRVUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MiwgMSwgN319Cn07CgpzdHJ1Y3QgdmFyaWFibGU0IGhyc3dydW5wZXJmX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1dSVU5QRVJGX0NQVSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MSwgMSwgMX19LAogICAge0hSU1dSVU5QRVJGX01FTSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MSwgMSwgMn19Cn07CgpvaWQgICAgICAgICAgICAgaHJzd3J1bl92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCA0IH07Cm9pZCAgICAgICAgICAgICBocnN3cnVucGVyZl92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCA1IH07CgojaWZkZWYgY3lnd2luCgovKgogKiBhIGxvdCBvZiB0aGlzIGlzICJzdG9sZW4iIGZyb20gY3lnd2luIHBzLmNjCiAqLwoKdHlwZWRlZiAgICAgICAgIEJPT0woV0lOQVBJICogRU5VTVBST0NFU1NNT0RVTEVTKSAoSEFORExFIGhQcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITU9EVUxFICogbHBoTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGNiTmVlZGVkKTsKCnR5cGVkZWYgICAgICAgICBEV09SRChXSU5BUEkgKiBHRVRNT0RVTEVGSUxFTkFNRSkgKEhBTkRMRSBoUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1PRFVMRSBoTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRTVFIgbHBzdHJGSWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgblNpemUpOwoKdHlwZWRlZiAgICAgICAgIERXT1JEKFdJTkFQSSAqIEdFVFBST0NFU1NNRU1PUllJTkZPKSAoSEFORExFIGhQcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1jLCBEV09SRCBuU2l6ZSk7Cgp0eXBlZGVmICAgICAgICAgSEFORExFKFdJTkFQSSAqIENSRUFURVNOQVBTSE9UKSAoRFdPUkQgZHdGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHRoMzJQcm9jZXNzSUQpOwoKdHlwZWRlZiAgICAgICAgIEJPT0woV0lOQVBJICogUFJPQ0VTU1dBTEspIChIQU5ETEUgaFNuYXBzaG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU0VOVFJZMzIgbHBwZSk7CgpFTlVNUFJPQ0VTU01PRFVMRVMgbXlFbnVtUHJvY2Vzc01vZHVsZXM7CkdFVE1PRFVMRUZJTEVOQU1FIG15R2V0TW9kdWxlRmlsZU5hbWVFeDsKQ1JFQVRFU05BUFNIT1QgIG15Q3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90OwpQUk9DRVNTV0FMSyAgICAgbXlQcm9jZXNzMzJGaXJzdDsKUFJPQ0VTU1dBTEsgICAgIG15UHJvY2VzczMyTmV4dDsKR0VUUFJPQ0VTU01FTU9SWUlORk8gbXlHZXRQcm9jZXNzTWVtb3J5SW5mbyA9IE5VTEw7CmN5Z3dpbl9nZXRpbmZvX3R5cGVzIHF1ZXJ5ID0gQ1dfR0VUUElORk87CgpzdGF0aWMgQk9PTCBXSU5BUEkKZHVtbXlwcm9jZXNzbW9kdWxlcyhIQU5ETEUgaFByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgSE1PRFVMRSAqIGxwaE1vZHVsZSwgRFdPUkQgY2IsIExQRFdPUkQgbHBjYk5lZWRlZCkKewogICAgbHBoTW9kdWxlWzBdID0gKEhNT0RVTEUpICogbHBjYk5lZWRlZDsKICAgICpscGNiTmVlZGVkID0gMTsKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgRFdPUkQgV0lOQVBJCkdldE1vZHVsZUZpbGVOYW1lRXg5NShIQU5ETEUgaFByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICBITU9EVUxFIGhNb2R1bGUsIExQVFNUUiBscHN0ckZpbGVOYW1lLCBEV09SRCBuKQp7CiAgICBIQU5ETEUgICAgICAgICAgaDsKICAgIERXT1JEICAgICAgICAgICBwaWQgPSAoRFdPUkQpIGhNb2R1bGU7CiAgICBQUk9DRVNTRU5UUlkzMiAgcHJvYzsKCiAgICBoID0gbXlDcmVhdGVUb29saGVscDMyU25hcHNob3QoVEgzMkNTX1NOQVBQUk9DRVNTLCAwKTsKICAgIGlmICghaCkKICAgICAgICByZXR1cm4gMDsKICAgIHByb2MuZHdTaXplID0gc2l6ZW9mKHByb2MpOwogICAgaWYgKG15UHJvY2VzczMyRmlyc3QoaCwgJnByb2MpKQogICAgICAgIGRvCiAgICAgICAgICAgIGlmIChwcm9jLnRoMzJQcm9jZXNzSUQgPT0gcGlkKSB7CiAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShoKTsKICAgICAgICAgICAgICAgIHN0cmNweShscHN0ckZpbGVOYW1lLCBwcm9jLnN6RXhlRmlsZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgIHdoaWxlIChteVByb2Nlc3MzMk5leHQoaCwgJnByb2MpKTsKICAgIENsb3NlSGFuZGxlKGgpOwogICAgcmV0dXJuIDA7Cn0KCiNkZWZpbmUgRkFDVE9SICgweDE5ZGIxZGVkNTNlYTcxMExMKQojZGVmaW5lIE5TUEVSU0VDIDEwMDAwMDAwTEwKI2RlZmluZSBOU1BFUk1TRUMgMTAwMDBMTAoKc3RhdGljIHRpbWVfdCAgIF9fc3RkY2FsbAp0b190aW1lX3QoUEZJTEVUSU1FIHB0cikKewogICAgbG9uZyAgICAgICAgICAgIHJlbTsKICAgIGxvbmcgbG9uZyAgICAgICB4ID0KICAgICAgICAoKGxvbmcgbG9uZykgcHRyLT5kd0hpZ2hEYXRlVGltZSA8PCAzMikgKwogICAgICAgICgodW5zaWduZWQpIHB0ci0+ZHdMb3dEYXRlVGltZSk7CiAgICB4IC09IEZBQ1RPUjsKICAgIHJlbSA9IHggJSBOU1BFUlNFQzsKICAgIHJlbSArPSBOU1BFUlNFQyAvIDI7CiAgICB4IC89IE5TUEVSU0VDOwogICAgeCArPSByZW0gLyBOU1BFUlNFQzsKICAgIHJldHVybiB4Owp9CgpzdGF0aWMgbG9uZwp0b19tc2VjKFBGSUxFVElNRSBwdHIpCnsKICAgIGxvbmcgbG9uZyAgICAgICB4ID0KICAgICAgICAoKGxvbmcgbG9uZykgcHRyLT5kd0hpZ2hEYXRlVGltZSA8PCAzMikgKwogICAgICAgICh1bnNpZ25lZCkgcHRyLT5kd0xvd0RhdGVUaW1lOwogICAgeCAvPSBOU1BFUk1TRUM7CiAgICByZXR1cm4geDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeWd3aW4gKi8KCgp2b2lkCmluaXRfaHJfc3dydW4odm9pZCkKewojaWZkZWYgY3lnd2luCiAgICBPU1ZFUlNJT05JTkZPICAgdmVyOwogICAgSE1PRFVMRSAgICAgICAgIGg7CgogICAgbWVtc2V0KCZ2ZXIsIDAsIHNpemVvZiB2ZXIpOwogICAgdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YgdmVyOwogICAgR2V0VmVyc2lvbkV4KCZ2ZXIpOwoKICAgIGlmICh2ZXIuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCkgewogICAgICAgIGggPSBMb2FkTGlicmFyeSgicHNhcGkuZGxsIik7CiAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgbXlFbnVtUHJvY2Vzc01vZHVsZXMgPQogICAgICAgICAgICAgICAgKEVOVU1QUk9DRVNTTU9EVUxFUykgR2V0UHJvY0FkZHJlc3MoaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtUHJvY2Vzc01vZHVsZXMiKTsKICAgICAgICAgICAgbXlHZXRNb2R1bGVGaWxlTmFtZUV4ID0KICAgICAgICAgICAgICAgIChHRVRNT0RVTEVGSUxFTkFNRSkgR2V0UHJvY0FkZHJlc3MoaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldE1vZHVsZUZpbGVOYW1lRXhBIik7CiAgICAgICAgICAgIG15R2V0UHJvY2Vzc01lbW9yeUluZm8gPQogICAgICAgICAgICAgICAgKEdFVFBST0NFU1NNRU1PUllJTkZPKSBHZXRQcm9jQWRkcmVzcyhoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0UHJvY2Vzc01lbW9yeUluZm8iKTsKICAgICAgICAgICAgaWYgKG15RW51bVByb2Nlc3NNb2R1bGVzICYmIG15R2V0TW9kdWxlRmlsZU5hbWVFeCkKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gQ1dfR0VUUElORk9fRlVMTDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImhyX3N3cnVuIGZhaWxlZCBOVCBpbml0XG4iKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImhyX3N3cnVuIGZhaWxlZCB0byBsb2FkIHBzYXBpLmRsbFxuIik7CiAgICB9IGVsc2UgewogICAgICAgIGggPSBHZXRNb2R1bGVIYW5kbGUoIktFUk5FTDMyLkRMTCIpOwogICAgICAgIG15Q3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90ID0KICAgICAgICAgICAgKENSRUFURVNOQVBTSE9UKSBHZXRQcm9jQWRkcmVzcyhoLCAiQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90Iik7CiAgICAgICAgbXlQcm9jZXNzMzJGaXJzdCA9CiAgICAgICAgICAgIChQUk9DRVNTV0FMSykgR2V0UHJvY0FkZHJlc3MoaCwgIlByb2Nlc3MzMkZpcnN0Iik7CiAgICAgICAgbXlQcm9jZXNzMzJOZXh0ID0gKFBST0NFU1NXQUxLKSBHZXRQcm9jQWRkcmVzcyhoLCAiUHJvY2VzczMyTmV4dCIpOwogICAgICAgIG15RW51bVByb2Nlc3NNb2R1bGVzID0gZHVtbXlwcm9jZXNzbW9kdWxlczsKICAgICAgICBteUdldE1vZHVsZUZpbGVOYW1lRXggPSBHZXRNb2R1bGVGaWxlTmFtZUV4OTU7CiAgICAgICAgaWYgKG15Q3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90ICYmIG15UHJvY2VzczMyRmlyc3QKICAgICAgICAgICAgJiYgbXlQcm9jZXNzMzJOZXh0KQojaWYgMAogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBUaGlzIGRvZXNuJ3Qgd29yayBhZnRlciBhbGwgb24gV2luOTggU0UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBxdWVyeSA9IENXX0dFVFBJTkZPX0ZVTEw7CiNlbHNlCiAgICAgICAgICAgIHF1ZXJ5ID0gQ1dfR0VUUElORk87CiNlbmRpZgogICAgICAgIGVsc2UKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImhyX3N3cnVuIGZhaWxlZCBub24tTlQgaW5pdFxuIik7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3lnd2luICovCiNpZmRlZiBQUk9DX1NZTUJPTAogICAgYXV0b19ubGlzdChQUk9DX1NZTUJPTCwgMCwgMCk7CiNlbmRpZgojaWZkZWYgTlBST0NfU1lNQk9MCiAgICBhdXRvX25saXN0KE5QUk9DX1NZTUJPTCwgMCwgMCk7CiNlbmRpZgoKICAgIHByb2NfdGFibGUgPSBOVUxMOwoKICAgIFJFR0lTVEVSX01JQigiaG9zdC9ocl9zd3J1biIsIGhyc3dydW5fdmFyaWFibGVzLCB2YXJpYWJsZTQsCiAgICAgICAgICAgICAgICAgaHJzd3J1bl92YXJpYWJsZXNfb2lkKTsKICAgIFJFR0lTVEVSX01JQigiaG9zdC9ocl9zd3J1biIsIGhyc3dydW5wZXJmX3ZhcmlhYmxlcywgdmFyaWFibGU0LAogICAgICAgICAgICAgICAgIGhyc3dydW5wZXJmX3ZhcmlhYmxlc19vaWQpOwp9CgovKgogKiBoZWFkZXJfaHJzd3J1biguLi4KICogQXJndW1lbnRzOgogKiB2cCAgICAgSU4gICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgZW50cnkgdGhhdCBwb2ludHMgaGVyZQogKiBuYW1lICAgIElOL09VVCAgLSBJTi9uYW1lIHJlcXVlc3RlZCwgT1VUL25hbWUgZm91bmQKICogbGVuZ3RoICBJTi9PVVQgIC0gbGVuZ3RoIG9mIElOL09VVCBvaWQncyAKICogZXhhY3QgICBJTiAgICAgIC0gVFJVRSBpZiBhbiBleGFjdCBtYXRjaCB3YXMgcmVxdWVzdGVkCiAqIHZhcl9sZW4gT1VUICAgICAtIGxlbmd0aCBvZiB2YXJpYWJsZSBvciAwIGlmIGZ1bmN0aW9uIHJldHVybmVkCiAqIHdyaXRlX21ldGhvZAogKiAKICovCgppbnQKaGVhZGVyX2hyc3dydW4oc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewojZGVmaW5lIEhSU1dSVU5fTkFNRV9MRU5HVEgJOQogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICJ2YXJfaHJzd3J1bjogIikpOwogICAgREVCVUdNU0dPSUQoKCJob3N0L2hyX3N3cnVuIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N3cnVuIiwgIiAlZFxuIiwgZXhhY3QpKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmV3bmFtZSwgKGNoYXIgKikgdnAtPm5hbWUsIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgbmV3bmFtZVtIUlNXUlVOX05BTUVfTEVOR1RIXSA9IDA7CiAgICByZXN1bHQgPSBzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIG5ld25hbWUsIHZwLT5uYW1lbGVuICsgMSk7CiAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgIT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA+PSAwKSkpCiAgICAgICAgcmV0dXJuIChNQVRDSF9GQUlMRUQpOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIG5ld25hbWUsCiAgICAgICAgICAgKHZwLT5uYW1lbGVuICsgMSkgKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gdnAtPm5hbWVsZW4gKyAxOwoKICAgICp3cml0ZV9tZXRob2QgPSAoV3JpdGVNZXRob2QqKTA7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nKTsgICAgLyogZGVmYXVsdCB0byAnbG9uZycgcmVzdWx0cyAqLwogICAgcmV0dXJuIChNQVRDSF9TVUNDRUVERUQpOwp9CgppbnQKaGVhZGVyX2hyc3dydW5FbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBIUlNXUlVOX0VOVFJZX05BTUVfTEVOR1RICTExCiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICBpbnQgICAgICAgICAgICAgcGlkLCBMb3dQaWQgPSAtMTsKICAgIGludCAgICAgICAgICAgICByZXN1bHQ7CgogICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW4iLCAidmFyX2hyc3dydW5FbnRyeTogIikpOwogICAgREVCVUdNU0dPSUQoKCJob3N0L2hyX3N3cnVuIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N3cnVuIiwgIiAlZFxuIiwgZXhhY3QpKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmV3bmFtZSwgKGNoYXIgKikgdnAtPm5hbWUsIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIC8qCiAgICAgKiAgRmluZCB0aGUgIm5leHQiIHJ1bm5pbmcgcHJvY2VzcwogICAgICovCiAgICBJbml0X0hSX1NXUnVuKCk7CiAgICBmb3IgKDs7KSB7CiAgICAgICAgcGlkID0gR2V0X05leHRfSFJfU1dSdW4oKTsKI2lmbmRlZiBsaW51eAojaWZuZGVmIGR5bml4CiAgICAgICAgREVCVUdNU0coKCJob3N0L2hyX3N3cnVuIiwKICAgICAgICAgICAgICAgICAgIihpbmRleCAlZCAoZW50cnkgIyVkKSAuLi4uIiwgcGlkLCBjdXJyZW50X3Byb2NfZW50cnkpKTsKI2Vsc2UKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAicGlkICVkOyBuZXh0cHJvYyAlZCAuLi4uIiwgcGlkLAogICAgICAgICAgICAgICAgICBuZXh0cHJvYykpOwojZW5kaWYKI2VuZGlmCiAgICAgICAgaWYgKHBpZCA9PSAtMSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbmV3bmFtZVtIUlNXUlVOX0VOVFJZX05BTUVfTEVOR1RIXSA9IHBpZDsKICAgICAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3dydW4iLCBuZXduYW1lLCAqbGVuZ3RoKSk7CiAgICAgICAgREVCVUdNU0coKCJob3N0L2hyX3N3cnVuIiwgIlxuIikpOwogICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgICAgICBpZiAoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgewogICAgICAgICAgICBMb3dQaWQgPSBwaWQ7CiNpZmRlZiBjeWd3aW4KICAgICAgICAgICAgbG93cHJvYyA9ICpjdXJwcm9jOwojZWxpZiAgZHluaXgKICAgICAgICAgICAgbWVtY3B5KCZsb3dwc2luZm8sICZteXBzaW5mbywgc2l6ZW9mKHBycHNpbmZvX3QpKTsKI2VsaWYgIWRlZmluZWQobGludXgpCiAgICAgICAgICAgIExvd1Byb2NJbmRleCA9IGN1cnJlbnRfcHJvY19lbnRyeSAtIDE7CiNlbmRpZgogICAgICAgICAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICIgc2F2ZWRcbiIpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogU2F2ZSBwcm9jZXNzIHN0YXR1cyBpbmZvcm1hdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpICYmIChMb3dQaWQgPT0gLTEgfHwgcGlkIDwgTG93UGlkKSkgewogICAgICAgICAgICBMb3dQaWQgPSBwaWQ7CiNpZmRlZiBjeWd3aW4KICAgICAgICAgICAgbG93cHJvYyA9ICpjdXJwcm9jOwojZWxpZiAhZGVmaW5lZChsaW51eCkKICAgICAgICAgICAgTG93UHJvY0luZGV4ID0gY3VycmVudF9wcm9jX2VudHJ5IC0gMTsKI2VuZGlmCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFNhdmUgcHJvY2VzcyBzdGF0dXMgaW5mb3JtYXRpb24gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiIHNhdmVkIikpOwogICAgICAgIH0KICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiXG4iKSk7CiAgICB9CiAgICBFbmRfSFJfU1dSdW4oKTsKCiAgICBpZiAoTG93UGlkID09IC0xKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW4iLCAiLi4uIGluZGV4IG91dCBvZiByYW5nZVxuIikpOwogICAgICAgIHJldHVybiAoTUFUQ0hfRkFJTEVEKTsKICAgIH0KCiAgICBuZXduYW1lW0hSU1dSVU5fRU5UUllfTkFNRV9MRU5HVEhdID0gTG93UGlkOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIG5ld25hbWUsCiAgICAgICAgICAgKHZwLT5uYW1lbGVuICsgMSkgKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gdnAtPm5hbWVsZW4gKyAxOwogICAgKndyaXRlX21ldGhvZCA9IChXcml0ZU1ldGhvZCopMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCgogICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW4iLCAiLi4uIGdldCBwcm9jZXNzIHN0YXRzICIpKTsKICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9zd3J1biIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICJcbiIpKTsKICAgIHJldHVybiBMb3dQaWQ7Cn0KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKGxpbnV4KQpzdGF0aWMgY2hhciAgICAgKgpza2lwX3RvX25leHRfZmllbGQoY2hhciAqY3ApCnsKICAgIHdoaWxlICgqY3AgJiYgISBpc3NwYWNlKCpjcCkpIC8qIHNraXAgcGFzdCBub24tc3BhY2UgKi8KCSsrY3A7CiAgICB3aGlsZSAoKmNwICYmIGlzc3BhY2UoKmNwKSkgLyogc2tpcCBwYXN0IHNwYWNlICovCgkrK2NwOwogICAgcmV0dXJuIGNwOwoKfQoKc3RhdGljIGNoYXIgICAgICoKZ2V0X3Byb2NfZmlsZV9saW5lKGNoYXIgKmZtdCwKCQkgICAgaW50IHBpZCwKCQkgICAgY2hhciAqYnVmLAoJCSAgICBpbnQgYnVmbGVuICkKewogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMDI0XTsKICAgIEZJTEUgKmZwOwogICAgKmJ1ZiA9ICdcMCc7CiAgICBzcHJpbnRmKHN0cmluZyxmbXQscGlkKTsKICAgIGlmICggICAoKGZwID0gZm9wZW4oc3RyaW5nLCAiciIpKSA9PSBOVUxMKQoJfHwgKGZnZXRzKGJ1ZiwgYnVmbGVuLCBmcCkgPT0gTlVMTCkgKSB7CglpZiAoZnApCgkgICAgZmNsb3NlKGZwKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgZmNsb3NlKGZwKTsKICAgIHJldHVybiBidWY7Cn0KCnN0YXRpYyBjaGFyICAgICAqCmdldF9wcm9jX3N0YXRfZmllbGQoaW50IHBpZCwKCQkgICAgY2hhciAqYnVmLAoJCSAgICBpbnQgYnVmbGVuLAoJCSAgICBpbnQgc2tpcCApCnsKICAgIGludCBpOwogICAgY2hhciAqY3A7CgogICAgaWYgKChjcCA9IGdldF9wcm9jX2ZpbGVfbGluZSgiL3Byb2MvJWQvc3RhdCIsIHBpZCwgYnVmLCBidWZsZW4pKSA9PSBOVUxMICkKCXJldHVybiBOVUxMOwogICAgZm9yIChpID0gMDsgKmNwICYmIGkgPCBza2lwOyArK2kpIHsKICAgICAgICAvKgogICAgICAgICAqIFRoZSBzZWNvbmQgZmllbGQgaXMgJ2NvbW0nIGFuZCBjYW4gY29udGFpbiBzcGFjZXMuIEhlbmNlIHNraXAgdG8KICAgICAgICAgKiB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcy4KICAgICAgICAgKi8KICAgICAgICBpZiAoaSA9PSAxICYmICpjcCA9PSAnKCcpCiAgICAgICAgICAgIGNwID0gc3RycmNocihjcCwgJyknKTsKCWNwID0gc2tpcF90b19uZXh0X2ZpZWxkKGNwKTsKICAgIH0KICAgIHJldHVybiBjcDsKfQoKc3RhdGljIGNoYXIgKgpnZXRfcHJvY19uYW1lX2Zyb21fY21kbGluZShpbnQgcGlkLAoJCQkgICAgY2hhciAqYnVmLAoJCQkgICAgaW50IGJ1ZmxlbiApCnsKICAgIHJldHVybiBnZXRfcHJvY19maWxlX2xpbmUoIi9wcm9jLyVkL2NtZGxpbmUiLCBwaWQsIGJ1ZiwgYnVmbGVuKTsKfQoKc3RhdGljIGNoYXIgKgpnZXRfcHJvY19uYW1lX2Zyb21fc3RhdHVzKGludCBwaWQsCgkgICAgY2hhciAqYnVmLAoJICAgIGludCBidWZsZW4gKQp7CiAgICBjaGFyICpjcCwqY3AyOwogICAgaWYgKChjcCA9IGdldF9wcm9jX2ZpbGVfbGluZSgiL3Byb2MvJWQvc3RhdHVzIiwgcGlkLCBidWYsIGJ1ZmxlbikpID09IE5VTEwgKQoJcmV0dXJuIE5VTEw7CiAgICBjcCA9IHN0cmNocihjcCwgJzonKTsKICAgIGlmICggY3AgPT0gTlVMTCApIHsKCXJldHVybiBOVUxMOyAgICAvKiB0aGUgcHJvY2VzcyBmaWxlIGlzIG1hbGZvcm1lZCAqLwogICAgfQogICAgY3AgPSBza2lwX3RvX25leHRfZmllbGQoY3ApOwogICAgY3AyID0gc3RyY2hyKGNwLCAnXG4nKTsKICAgIGlmIChjcDIpCgkqY3AyID0gMDsKICAgIHJldHVybiBjcDsKfQojZW5kaWYKCnVfY2hhciAgICAgICAgICoKdmFyX2hyc3dydW4oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBwaWQgPSAwOwogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMDI0XTsKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgIHN0cnVjdCBwc3Rfc3RhdHVzIHByb2NfYnVmOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgc3RhdGljIHBzaW5mb190IHBzaW5mbzsKICAgIHN0YXRpYyBwc2luZm9fdCAqcHJvY19idWY7CiAgICBpbnQgICAgICAgICAgICAgcHJvY2ZkOwogICAgaW50ICAgICAgICAgICAgIHJldDsKICAgIGNoYXIgICAgICAgICAgICBwcm9jZm5bc2l6ZW9mICIvcHJvYy8wMDAwMC9wc2luZm8iXTsKI2Vsc2UKICAgIHN0YXRpYyBzdHJ1Y3QgcHJvYyAqcHJvY19idWY7CiAgICBjaGFyICAgICAgICAgICAqY3AxOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9TTEFTSF9QUk9DX01FVEhPRF8gKi8KICAgIHN0YXRpYyB0aW1lX3QgICB3aGVuID0gMDsKICAgIHRpbWVfdCAgICAgICAgICBub3c7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkcGlkID0gLTE7CiNlbmRpZgojaWYgKGRlZmluZWQoSEFWRV9LVk1fR0VUUFJPQ1MpIHx8IGRlZmluZWQoSEFWRV9LVk1fR0VUUFJPQzIpKQogICAgY2hhciAgICAgICAgICAqKmFyZ3Y7CiNlbmRpZgojaWZkZWYgbGludXgKICAgIEZJTEUgICAgICAgICAgICpmcDsKICAgIGNoYXIgICAgICAgICAgICBidWZbMTAyNF07CiAgICBpbnQgICAgICAgICAgICAgaTsKI2VuZGlmCiAgICBjaGFyICAgICAgICAgICAqY3A7CgogICAgaWYgKHZwLT5tYWdpYyA9PSBIUlNXUlVOX09TSU5ERVgpIHsKICAgICAgICBpZiAoaGVhZGVyX2hyc3dydW4odnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkKICAgICAgICAgICAgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CgogICAgICAgIHBpZCA9CiAgICAgICAgICAgIGhlYWRlcl9ocnN3cnVuRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbWV0aG9kKTsKICAgICAgICBpZiAocGlkID09IE1BVENIX0ZBSUxFRCkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgaWYgKHBzdGF0X2dldHByb2MoJnByb2NfYnVmLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0dXMpLCAwLCBwaWQpID09IC0xKQogICAgICAgIHJldHVybiBOVUxMOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAgdGltZSgmbm93KTsKICAgIGlmIChwaWQgPT0gb2xkcGlkKSB7CiAgICAgICAgaWYgKG5vdyAhPSB3aGVuKQogICAgICAgICAgICBvbGRwaWQgPSAtMTsKICAgIH0KICAgIGlmIChvbGRwaWQgIT0gcGlkIHx8IHByb2NfYnVmID09IE5VTEwpIHsKI2lmIF9TTEFTSF9QUk9DX01FVEhPRF8KICAgICAgICBwcm9jX2J1ZiA9ICZwc2luZm87CiAgICAgICAgc3ByaW50Zihwcm9jZm4sICIvcHJvYy8lLjVkL3BzaW5mbyIsIHBpZCk7CiAgICAgICAgaWYgKChwcm9jZmQgPSBvcGVuKHByb2NmbiwgT19SRE9OTFkpKSAhPSAtMSkgewogICAgICAgICAgICByZXQgPSAgcmVhZChwcm9jZmQsIHByb2NfYnVmLCBzaXplb2YoKnByb2NfYnVmKSk7CiAgICAgICAgICAgIGNsb3NlKHByb2NmZCk7CiAgICAgICAgICAgIGlmIChyZXQgIT0gc2l6ZW9mKCpwcm9jX2J1ZikpCiAgICAgICAgICAgICAgICBwcm9jX2J1ZiA9IE5VTEw7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHByb2NfYnVmID0gIE5VTEw7CiNlbHNlCiAgICAgICAgaWYgKGtkID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGlmICgocHJvY19idWYgPSBrdm1fZ2V0cHJvYyhrZCwgcGlkKSkgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIG9sZHBpZCA9IHBpZDsKICAgICAgICB3aGVuID0gbm93OwogICAgfQojZW5kaWYKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBIUlNXUlVOX09TSU5ERVg6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZWxzZQogICAgICAgIC8qIAogICAgICAgICAqIHBlciBkdHMsIG9uIGNvZGVyczoKICAgICAgICAgKiBjb3MgKGluIGdlbmVyYWwpIHdlIHdvbid0IGtub3cgd2hpY2ggcHJvY2VzcyBzaG91bGQKICAgICAgICAgKiBiZSByZWdhcmRlZCBhcyAidGhlIHByaW1hcnkgTy9TIHByb2Nlc3MiLgogICAgICAgICAqIFRoZSBtb3N0IG9idmlvdXMgY2FuZGlkYXRlIG9uIGEgVW5peCBib3ggaXMgcHJvYmFibHkgJ2luaXQnCiAgICAgICAgICogd2hpY2ggaXMgdHlwaWNhbGx5IChhbHdheXM/KSBwcm9jZXNzICMxLgogICAgICAgICAqLwogICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgICAgIC8qIFByb2JhYmx5ISAqLwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbmRpZgoKICAgIGNhc2UgSFJTV1JVTl9JTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IHBpZDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNXUlVOX05BTUU6CiNpZmRlZiBIQVZFX1NZU19QU1RBVF9ICiAgICAgICAgc3RybGNweShzdHJpbmcsIHByb2NfYnVmLnBzdF9jbWQsIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIGRlZmluZWQoZHluaXgpCiAgICAgICAgc3RybGNweShzdHJpbmcsIGxvd3BzaW5mby5wcl9mbmFtZSwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKI2lmIF9TTEFTSF9QUk9DX01FVEhPRF8KICAgICAgICBpZiAocHJvY19idWYpIHsgCiAgICAgICAgICAgIGNoYXIgKnBvcz1zdHJjaHIocHJvY19idWYtPnByX3BzYXJncywnICcpOwogICAgICAgICAgICBpZiAocG9zICE9IE5VTEwpICpwb3MgPSAnXDAnOwogICAgICAgICAgICBzdHJsY3B5KHN0cmluZywgYmFzZW5hbWUocHJvY19idWYtPnByX3BzYXJncyksIHNpemVvZihzdHJpbmcpKTsKICAgICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKSAqcG9zPScgJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJsY3B5KHN0cmluZywgIjxleGl0ZWQ+Iiwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIH0KI2Vsc2UKICAgICAgICBzdHJsY3B5KHN0cmluZywgcHJvY19idWYtPnBfdXNlci51X2NvbW0sIHNpemVvZihzdHJpbmcpKTsKI2VuZGlmCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBzdHJsY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX2NvbW0sIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICAgICAgc3RybGNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2NvbW0sIHNpemVvZihzdHJpbmcpKTsKICAgICAgICAvKiBwcm9jZXNzIG5hbWU6IHRydW5jYXRlIHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IHNwYWNlICovCiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9jb21tKTsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9jb21tKTsKICAgICNlbGlmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgc3RyY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfY29tbSk7CiAgICAjZWxzZQogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9wcm9jLnBfY29tbSk7CiAgICAjZW5kaWYKI2VsaWYgZGVmaW5lZChsaW51eCkKCWlmKCAoY3A9Z2V0X3Byb2NfbmFtZV9mcm9tX3N0YXR1cyhwaWQsYnVmLHNpemVvZihidWYpKSkgPT0gTlVMTCApIHsKICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIjxleGl0ZWQ+Iik7CiAgICAgICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgICAgICB9CiAgICAgICAgc3RyY3B5KHN0cmluZywgY3ApOwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICAvKiBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgKFBJRF9aT01CSUUgfCBQSURfRVhJVEVEKSkgKi8KICAgICAgICBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgUElEX0VYSVRFRCB8fCAobG93cHJvYy5leGl0Y29kZSAmIH4weGZmZmYpKQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiPGRlZnVuY3Q+Iik7CiAgICAgICAgZWxzZSBpZiAobG93cHJvYy5wcGlkKSB7CiAgICAgICAgICAgIGN5Z3dpbl9jb252X3RvX3Bvc2l4X3BhdGgobG93cHJvYy5wcm9nbmFtZSwgc3RyaW5nKTsKICAgICAgICAgICAgY3AgPSBzdHJyY2hyKHN0cmluZywgJy8nKTsKICAgICAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgY3AgKyAxKTsKICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5ID09IENXX0dFVFBJTkZPX0ZVTEwpIHsKICAgICAgICAgICAgRFdPUkQgICAgICAgICAgIG4gPSBsb3dwcm9jLmR3UHJvY2Vzc0lkICYgMHhmZmZmOwogICAgICAgICAgICBIQU5ETEUgICAgICAgICAgaCA9CiAgICAgICAgICAgICAgICBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OIHwgUFJPQ0VTU19WTV9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIG4pOwoKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIEhNT0RVTEUgICAgICAgICBobVsxMDAwXTsKICAgICAgICAgICAgICAgIGlmICghbXlFbnVtUHJvY2Vzc01vZHVsZXMoaCwgaG0sIHNpemVvZiBobSwgJm4pKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0RFQlVHLCAibm8gbW9kdWxlIGhhbmRsZSBmb3IgJWx1XG4iLCBuKTsKICAgICAgICAgICAgICAgICAgICBuID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuCiAgICAgICAgICAgICAgICAgICAgJiYgbXlHZXRNb2R1bGVGaWxlTmFtZUV4KGgsIGhtWzBdLCBzdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBzdHJpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgY3AgPSBzdHJyY2hyKHN0cmluZywgJ1xcJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCArIDEpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIioqKiB1bmtub3duIik7CiAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAibm8gcHJvY2VzcyBoYW5kbGUgZm9yICVsdVxuIiwgbik7CiAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiogdW5rbm93biIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICIqIHVua25vd24iKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICdcMCcpIC0gNDsKICAgICAgICBpZiAoY3AgPiBzdHJpbmcgJiYgc3RyY2FzZWNtcChjcCwgIi5leGUiKSA9PSAwKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICJwcm9jZXNzIG5hbWUiKTsKI2VuZGlmCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICAgICAvKgogICAgICAgICAqIHJlbW92ZSB0cmFpbGluZyBuZXdsaW5lIAogICAgICAgICAqLwogICAgICAgIGlmICgqdmFyX2xlbikgewogICAgICAgICAgICBjcCA9IHN0cmluZyArICp2YXJfbGVuIC0gMTsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnXG4nKQogICAgICAgICAgICAgICAgLS0oKnZhcl9sZW4pOwogICAgICAgIH0KICAgICAgICBpZiAoKnZhcl9sZW4gPiA2NCkgeyAvKiBNSUIgbGltaXQgKi8KICAgICAgICAgICAgKnZhcl9sZW4gPSA2NDsKICAgICAgICAgICAgc3RyaW5nWzY0XSA9ICdcMCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgIGNhc2UgSFJTV1JVTl9JRDoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGNhc2UgSFJTV1JVTl9QQVRIOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgICAgIC8qCiAgICAgICAgICogUGF0aCBub3QgYXZhaWxhYmxlIC0gdXNlIGFyZ3ZbMF0gCiAgICAgICAgICovCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICIlcyIsIHByb2NfYnVmLnBzdF9jbWQpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICAvKgogICAgICAgICAqIFBhdGggbm90IGF2YWlsYWJsZSAtIHVzZSBhcmd2WzBdIAogICAgICAgICAqLwogICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBsb3dwc2luZm8ucHJfcHNhcmdzKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZmRlZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgaWYgKHByb2NfYnVmKQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX2J1Zi0+cHJfcHNhcmdzKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiPGV4aXRlZD4iKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAqY3AgPSAwOwojZWxzZQogICAgICAgIGNwID0gcHJvY19idWYtPnBfdXNlci51X3BzYXJnczsKICAgICAgICBjcDEgPSBzdHJpbmc7CiAgICAgICAgd2hpbGUgKCpjcCAmJiAqY3AgIT0gJyAnKQogICAgICAgICAgICAqY3AxKysgPSAqY3ArKzsKICAgICAgICAqY3AxID0gMDsKI2VuZGlmCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBzdHJsY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX2NvbW0sIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICAgICAgLyogU2hvdWxkIGJlIHBhdGgsIGJ1dCB0aGlzIGlzIG5vdCBhdmFpbGFibGUsIGp1c3QgdXNlIGFyZ3ZbMF0gYWdhaW4gKi8KICAgICAgICBzdHJsY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfY29tbSwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICNpZiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfY29tbSk7CiAgICAjZWxpZiBkZWZpbmVkKGRyYWdvbmZseSkgJiYgX19EcmFnb25GbHlfdmVyc2lvbiA+PSAxOTAwMDAKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfY29tbSk7CiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2NvbW0pOwogICAgI2Vsc2UKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX2NvbW0pOwogICAgI2VuZGlmCiNlbGlmIGRlZmluZWQobGludXgpCiAgICAgICAgY3AgPSBnZXRfcHJvY19uYW1lX2Zyb21fY21kbGluZShwaWQsYnVmLHNpemVvZihidWYpLTEpOwogICAgICAgIGlmIChjcCAhPSBOVUxMICYmICpjcCkgICAgLyogYXJndlswXSAnXDAnIGFyZ3ZbMV0gJ1wwJyAuLi4uICovCiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogc3dhcHBlZCBvdXQgLSBubyBjbWRsaW5lIAogICAgICAgICAgICAgKi8KCSAgICBpZiggKGNwPWdldF9wcm9jX25hbWVfZnJvbV9zdGF0dXMocGlkLGJ1ZixzaXplb2YoYnVmKS0xKSkgPT0gTlVMTCApIHsKCQlzdHJjcHkoc3RyaW5nLCAiPGV4aXRlZD4iKTsKCQkqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwoJCXJldHVybiAodV9jaGFyICopIHN0cmluZzsKCSAgICB9CiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwKTsKICAgICAgICB9CiNlbGlmIGRlZmluZWQoY3lnd2luKQogICAgICAgIC8qIGlmIChsb3dwcm9jLnByb2Nlc3Nfc3RhdGUgJiAoUElEX1pPTUJJRSB8IFBJRF9FWElURUQpKSAqLwogICAgICAgIGlmIChsb3dwcm9jLnByb2Nlc3Nfc3RhdGUgJiBQSURfRVhJVEVEIHx8IChsb3dwcm9jLmV4aXRjb2RlICYgfjB4ZmZmZikpCiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICI8ZGVmdW5jdD4iKTsKICAgICAgICBlbHNlIGlmIChsb3dwcm9jLnBwaWQpCiAgICAgICAgICAgIGN5Z3dpbl9jb252X3RvX3Bvc2l4X3BhdGgobG93cHJvYy5wcm9nbmFtZSwgc3RyaW5nKTsKICAgICAgICBlbHNlIGlmIChxdWVyeSA9PSBDV19HRVRQSU5GT19GVUxMKSB7CiAgICAgICAgICAgIERXT1JEICAgICAgICAgICBuID0gbG93cHJvYy5kd1Byb2Nlc3NJZCAmIDB4RkZGRjsKICAgICAgICAgICAgSEFORExFICAgICAgICAgIGggPQogICAgICAgICAgICAgICAgT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiB8IFBST0NFU1NfVk1fUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBuKTsKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIEhNT0RVTEUgICAgICAgICBobVsxMDAwXTsKICAgICAgICAgICAgICAgIGlmICghbXlFbnVtUHJvY2Vzc01vZHVsZXMoaCwgaG0sIHNpemVvZiBobSwgJm4pKQogICAgICAgICAgICAgICAgICAgIG4gPSAwOwogICAgICAgICAgICAgICAgaWYgKCFuCiAgICAgICAgICAgICAgICAgICAgfHwgIW15R2V0TW9kdWxlRmlsZU5hbWVFeChoLCBobVswXSwgc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIHN0cmluZykpCiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIioqKiB1bmtub3duIik7CiAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShoKTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiogdW5rbm93biIpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiB1bmtub3duIik7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBzcHJpbnRmKHN0cmluZywgIi9iaW4vd29tYmF0Iik7CiNlbmRpZgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgaWYgKCp2YXJfbGVuID4gMTI4KSB7IC8qIE1JQiBsaW1pdCAqLwogICAgICAgICAgICAqdmFyX2xlbiA9IDEyODsKICAgICAgICAgICAgc3RyaW5nWzEyOF0gPSAnXDAnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CiAgICBjYXNlIEhSU1dSVU5fUEFSQU1TOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgICAgIGNwID0gc3RyY2hyKHByb2NfYnVmLnBzdF9jbWQsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpIHsKICAgICAgICAgICAgY3ArKzsKICAgICAgICAgICAgc3ByaW50ZihzdHJpbmcsICIlcyIsIGNwKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3RyaW5nWzBdID0gJ1wwJzsKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBjcCA9IHN0cmNocihsb3dwc2luZm8ucHJfcHNhcmdzLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBjcCk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmluZ1swXSA9ICdcMCc7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZmRlZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgaWYgKHByb2NfYnVmKSB7CiAgICAgICAgICAgIGNwID0gc3RyY2hyKHByb2NfYnVmLT5wcl9wc2FyZ3MsICcgJyk7CiAgICAgICAgICAgIGlmIChjcCkKICAgICAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwICsgMSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHN0cmluZ1swXSA9IDA7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmluZ1swXSA9IDA7CiNlbHNlCiAgICAgICAgY3AgPSBwcm9jX2J1Zi0+cF91c2VyLnVfcHNhcmdzOwogICAgICAgIHdoaWxlICgqY3AgJiYgKmNwICE9ICcgJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBpZiAoKmNwID09ICcgJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCk7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgY3AgPSBzdHJjaHIocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX2NvbW0sICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpIHsKICAgICAgICAgICAgY3ArKzsKICAgICAgICAgICAgc3ByaW50ZihzdHJpbmcsICIlcyIsIGNwKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3RyaW5nWzBdID0gJ1wwJzsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQzIKICAgICAgICBzdHJpbmdbMF0gPSAwOwogICAgICAgIGFyZ3YgPSBrdm1fZ2V0YXJndjIoa2QsIHByb2NfdGFibGUgKyBMb3dQcm9jSW5kZXgsIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBpZiAoYXJndikKICAgICAgICAgICAgYXJndisrOwogICAgICAgIHdoaWxlIChhcmd2ICYmICphcmd2KSB7CiAgICAgICAgICAgIGlmIChzdHJpbmdbMF0gIT0gMCkKICAgICAgICAgICAgICAgIHN0cmNhdChzdHJpbmcsICIgIik7CiAgICAgICAgICAgIHN0cmNhdChzdHJpbmcsICphcmd2KTsKICAgICAgICAgICAgYXJndisrOwogICAgICAgIH0KI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICAgICBzdHJpbmdbMF0gPSAwOwogICAgICAgIGFyZ3YgPSBrdm1fZ2V0YXJndihrZCwgcHJvY190YWJsZSArIExvd1Byb2NJbmRleCwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGlmIChhcmd2KQogICAgICAgICAgICBhcmd2Kys7CiAgICAgICAgd2hpbGUgKGFyZ3YgJiYgKmFyZ3YpIHsKICAgICAgICAgICAgaWYgKHN0cmluZ1swXSAhPSAwKQogICAgICAgICAgICAgICAgc3RyY2F0KHN0cmluZywgIiAiKTsKICAgICAgICAgICAgc3RyY2F0KHN0cmluZywgKmFyZ3YpOwogICAgICAgICAgICBhcmd2Kys7CiAgICAgICAgfQojZWxpZiBkZWZpbmVkKGxpbnV4KQogICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKCWlmKCAoY3A9Z2V0X3Byb2NfbmFtZV9mcm9tX2NtZGxpbmUocGlkLGJ1ZixzaXplb2YoYnVmKS0yKSkgPT0gTlVMTCApIHsKICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIiIpOwogICAgICAgICAgICAqdmFyX2xlbiA9IDA7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogU2tpcCBvdmVyIGFyZ3ZbMF0gCiAgICAgICAgICovCiAgICAgICAgY3AgPSBidWY7CiAgICAgICAgd2hpbGUgKCpjcCkKICAgICAgICAgICAgKytjcDsKICAgICAgICArK2NwOwogICAgICAgIC8qCiAgICAgICAgICogTm93IGpvaW4gdG9nZXRoZXIgc2VwYXJhdGUgYXJndW1lbnRzLiAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICB3aGlsZSAoKmNwKQogICAgICAgICAgICAgICAgKytjcDsKICAgICAgICAgICAgaWYgKCooY3AgKyAxKSA9PSAnXDAnKQogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qICdcMCcnXDAnID0+IEVuZCBvZiBjb21tYW5kIGxpbmUgKi8KICAgICAgICAgICAgKmNwID0gJyAnOwogICAgICAgIH0KCiAgICAgICAgY3AgPSBidWY7CiAgICAgICAgd2hpbGUgKCpjcCkKICAgICAgICAgICAgKytjcDsKICAgICAgICArK2NwOwogICAgICAgIHN0cmNweShzdHJpbmcsIGNwKTsKI2VsaWYgZGVmaW5lZChjeWd3aW4pCiAgICAgICAgc3RyaW5nWzBdID0gMDsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIHNwcmludGYoc3RyaW5nLCAiLWggLXEgLXYiKTsKI2VuZGlmCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICAgICBpZiAoKnZhcl9sZW4gPiAxMjgpIHsgLyogTUlCIGxpbWl0ICovCiAgICAgICAgICAgICp2YXJfbGVuID0gMTI4OwogICAgICAgICAgICBzdHJpbmdbMTI4XSA9ICdcMCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgIGNhc2UgSFJTV1JVTl9UWVBFOgojaWZkZWYgUElEX01BWFNZUwogICAgICAgIGlmIChwaWQgPCBQSURfTUFYU1lTKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qIG9wZXJhdGluZ1N5c3RlbSAqLwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAvKiBhcHBsaWNhdGlvbiAqLwojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCgkJaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9mbGFncyAmIFNLUFJPQykgewoJCQlsb25nX3JldHVybiA9IDI7CS8qIGtlcm5lbCBwcm9jZXNzICovCgkJfSBlbHNlCgkJCWxvbmdfcmV0dXJuID0gNDsJLyogYXBwbGljYXRpb24gKi8KI2VsaWYgSEFWRV9LVk1fR0VUUFJPQzIKICAgICAgICBpZiAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfZmxhZyAmIFBfU1lTVEVNKQoJICAgIGxvbmdfcmV0dXJuID0gMjsJLyogb3BlcmF0aW5nU3lzdGVtICovCgllbHNlCgkgICAgbG9uZ19yZXR1cm4gPSA0OwkvKiBhcHBsaWNhdGlvbiAqLwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAoJaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9mbGFnICYgUF9TWVNURU0pIHsKCSAgICBpZiAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3ByaS5wcmlfY2xhc3MgPT0gUFJJX0lUSEQpCgkJbG9uZ19yZXR1cm4gPSAzOy8qIGRldmljZURyaXZlciAqLwoJICAgIGVsc2UKCQlsb25nX3JldHVybiA9IDI7Lyogb3BlcmF0aW5nU3lzdGVtICovCgl9IGVsc2UKCSAgICBsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIGlmIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9mbGFnICYgUF9TWVNURU0pCgkgICAgbG9uZ19yZXR1cm4gPSAyOwkvKiBvcGVyYXRpbmdTeXN0ZW0gKi8KCWVsc2UKCSAgICBsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiAgICAjZWxzZQogICAgICAjaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9mbGFncyAmIFBfU1lTVEVNKQogICAgICAjZWxzZQogICAgICAgIGlmIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX2ZsYWcgJiBQX1NZU1RFTSkKICAgICAgI2VuZGlmCgkgICAgbG9uZ19yZXR1cm4gPSAyOwkvKiBvcGVyYXRpbmdTeXN0ZW0gKi8KCWVsc2UKCSAgICBsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiAgICAjZW5kaWYKI2Vsc2UKCWxvbmdfcmV0dXJuID0gNDsJLyogYXBwbGljYXRpb24gKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTV1JVTl9TVEFUVVM6CiNpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgUElEX1NUT1BQRUQpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgLyogbm90UnVubmFibGUgKi8KICAgICAgICAvKiBlbHNlIGlmIChsb3dwcm9jLnByb2Nlc3Nfc3RhdGUgJiBQSURfWk9NQklFKSAqLwogICAgICAgIGVsc2UgaWYgKGxvd3Byb2MuZXhpdGNvZGUgJiB+MHhmZmZmKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgIC8qIGludmFsaWQgKi8KICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgLyogcnVubmluZyAqLwojZWxpZiAhZGVmaW5lZChsaW51eCkKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBzd2l0Y2ggKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wc3Rfc3RhdCkgewogICAgICAgIGNhc2UgUFNfU1RPUDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAvKiBub3RSdW5uYWJsZSAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFBTX1NMRUVQOgogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qIHJ1bm5hYmxlICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUFNfUlVOOgogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgIC8qIHJ1bm5pbmcgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQU19aT01CSUU6CiAgICAgICAgY2FzZSBQU19JRExFOgogICAgICAgIGNhc2UgUFNfT1RIRVI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAvKiBpbnZhbGlkICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2Vsc2UKI2lmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9zdGF0KSB7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICAjaWYgZGVmaW5lZChmcmVlYnNkNSkgJiYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDE0CiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfc3RhdCkgewogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3Bfc3RhdCkgewogICAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBzd2l0Y2ggKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0YXQpIHsKICAgICNlbHNlCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX3N0YXQpIHsKICAgICNlbmRpZgojZWxpZiBkZWZpbmVkKGR5bml4KQogICAgICAgIHN3aXRjaCAobG93cHNpbmZvLnByX3N0YXRlKSB7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgc3dpdGNoIChwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl9sd3AucHJfc3RhdGUgOiBTSURMKSB7CiNlbHNlCiAgICAgICAgc3dpdGNoIChwcm9jX2J1Zi0+cF9zdGF0KSB7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfc3RhdGUpIHsKI2Vsc2UKICAgICAgICBzd2l0Y2ggKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0YXQpIHsKI2VuZGlmCiAgICAgICAgY2FzZSBTU1RPUDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAvKiBub3RSdW5uYWJsZSAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDA6CiNpZmRlZiBTU1dBUAogICAgICAgIGNhc2UgU1NXQVA6CiNlbmRpZgojaWZkZWYgU1NMRUVQCiAgICAgICAgY2FzZSBTU0xFRVA6CiNlbmRpZgojaWZkZWYgU1dBSVQKICAgICAgICBjYXNlIFNXQUlUOgojZW5kaWYKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiBydW5uYWJsZSAqLwogICAgICAgICAgICBicmVhazsKI2lmZGVmIFNBQ1RJVkUKICAgICAgICBjYXNlIFNBQ1RJVkU6CiNlbmRpZgojaWZkZWYgU1JVTgogICAgICAgIGNhc2UgU1JVTjoKI2VuZGlmCiNpZmRlZiBTT05QUk9DCiAgICAgICAgY2FzZSBTT05QUk9DOgojZW5kaWYKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBydW5uaW5nICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU0lETDoKICAgICAgICBjYXNlIFNaT01COgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgLyogaW52YWxpZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNlbmRpZgojZWxzZQoJaWYgKChjcCA9IGdldF9wcm9jX3N0YXRfZmllbGQocGlkLGJ1ZixzaXplb2YoYnVmKSwyKSkgIT0gTlVMTCApIHsKICAgICAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgICAgICAvKiBydW5uaW5nICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgICAgICAvKiBydW5uYWJsZSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgICBjYXNlICdUJzoKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgICAgIC8qIG5vdFJ1bm5hYmxlICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnWic6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgICAgICAvKiBpbnZhbGlkICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgIC8qIGludmFsaWQgKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIEhSU1dSVU5QRVJGX0NQVToKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmLnBzdF9jcHRpY2tzdG90YWw7CiAgICAgICAgLyoKICAgICAgICAgKiBOb3QgY29udmluY2VkIHRoaXMgaXMgcmlnaHQsIGJ1dC4uLi4KICAgICAgICAgKi8KI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBsb25nX3JldHVybiA9IGxvd3BzaW5mby5wcl90aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIGxvd3BzaW5mby5wcl90aW1lLnR2X25zZWMgLyAxMDAwMDAwMDsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKI2lmIF9TTEFTSF9QUk9DX01FVEhPRF8KICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmID8gcHJvY19idWYtPnByX3RpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgcHJvY19idWYtPnByX3RpbWUudHZfbnNlYyAvIDEwMDAwMDAwIDogMDsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmLT5wX3V0aW1lICogMTAwICsgcHJvY19idWYtPnBfc3RpbWUgKiAxMDA7CiNlbmRpZgojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdXRpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfc3RpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfaXRpY2tzOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoTk9UX0RFRklORUQpICYmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAogICAgICAgIC8qIFhYWDogQWNjZXNzaW5nIGtpX3BhZGRyIGNhdXNlcyBzaWcxMCAuLi4KICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9wYWRkci0+cF91dGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfcGFkZHItPnBfc3RpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3BhZGRyLT5wX2l0aWNrczsgKi8KICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAjZWxpZiBkZWZpbmVkKGZyZWVic2Q1KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3J1bnRpbWUgLyAxMDAwMDA7CiAgICAjZWxpZiBkZWZpbmVkKGRyYWdvbmZseSkgJiYgX19EcmFnb25GbHlfdmVyc2lvbiA+PSAxOTAwMDAKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9sd3Aua2xfdXRpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2x3cC5rbF9zdGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfbHdwLmtsX2l0aWNrczsKICAgICNlbGlmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF91dGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9zdGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9pdGlja3M7CiAgICAjZWxpZiBkZWZpbmVkKGRyYWdvbmZseSkKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9lcHJvYy5lX3V0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9lcHJvYy5lX3N0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9lcHJvYy5lX2l0aWNrczsKICAgICNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX3V0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9wcm9jLnBfc3RpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3Byb2MucF9pdGlja3M7CiAgICAjZW5kaWYKI2VsaWYgZGVmaW5lZChsaW51eCkKCWlmICgoY3AgPSBnZXRfcHJvY19zdGF0X2ZpZWxkKHBpZCxidWYsc2l6ZW9mKGJ1ZiksMTMpKSA9PSBOVUxMICkgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb25nX3JldHVybiA9IGF0b2koY3ApOyAvKiB1dGltZSAqLwoKICAgICAgICBjcCA9IHNraXBfdG9fbmV4dF9maWVsZChjcCk7CgogICAgICAgIGxvbmdfcmV0dXJuICs9IGF0b2koY3ApOyAgICAgICAgLyogKyBzdGltZSAqLwojZWxpZiBkZWZpbmVkKHN1bm9zNCkKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3RpbWU7CiNlbGlmIGRlZmluZWQoY3lnd2luKQogICAgICAgIHsKICAgICAgICAgICAgRFdPUkQgICAgICAgICAgIG4gPSBsb3dwcm9jLmR3UHJvY2Vzc0lkOwogICAgICAgICAgICBIQU5ETEUgICAgICAgICAgaCA9CiAgICAgICAgICAgICAgICBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OIHwgUFJPQ0VTU19WTV9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIG4pOwogICAgICAgICAgICBGSUxFVElNRSAgICAgICAgY3QsIGV0LCBrdCwgdXQ7CgogICAgICAgICAgICBpZiAoaCkgewogICAgICAgICAgICAgICAgaWYgKEdldFByb2Nlc3NUaW1lcyhoLCAmY3QsICZldCwgJmt0LCAmdXQpKQogICAgICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHRvX21zZWMoJmt0KSArIHRvX21zZWMoJnV0KSkgLyAxMDsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAibm8gcHJvY2VzcyB0aW1lcyBmb3IgJWx1ICglbHUpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd3Byb2MucGlkLCBuKTsKICAgICAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAibm8gcHJvY2VzcyBoYW5kbGUgZm9yICVsdSAoJWx1KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxvd3Byb2MucGlkLCBuKTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3J1LnJ1X3V0aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9ydS5ydV91dGltZS50dl91c2VjIC8gMTAwMDAwMDAgKyAvKiBuYW5vc2Vjb25kcyAqLwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfcnUucnVfc3RpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3J1LnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwMDAwMDsgLyogbmFub3NlY29uZHMgKi8KI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3V0aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3V0aW1lLnR2X3VzZWMgLyAxMDAwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0aW1lLnR2X3VzZWMgLyAxMDAwMDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTV1JVTlBFUkZfTUVNOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAojIGlmZGVmIFBHU0hJRlQKICAgICAgICBsb25nX3JldHVybiA9IChwcm9jX2J1Zi5wc3RfcnNzaXplIDw8IFBHU0hJRlQpIC8gMTAyNDsKIyBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1Zi5wc3RfcnNzaXplICogZ2V0cGFnZXNpemUoKSAvIDEwMjQ7CiMgZW5kaWYKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBsb25nX3JldHVybiA9IChsb3dwc2luZm8ucHJfcnNzaXplICogTU1VX1BBR0VTSVpFKSAvIDEwMjQ7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiNpZmRlZiBfSUxQMzIKICAgICAgICBpZihOVUxMICE9IHByb2NfYnVmICYmIDAgPT0gcHJvY19idWYtPnByX3Jzc2l6ZSkKICAgICAgICB7IC8qIE9kZHMgb24gdGhhdCB3ZSBhcmUgbG9va2luZyB3aXRoIGEgMzIgYml0IGFwcCBhdCBhIDY0IGJpdCBwc2luZm8uKi8KICAgICAgICAgICAgbmV0c25tcF9tZW1vcnlfaW5mbyAqbWVtOwogICAgICAgICAgICBuZXRzbm1wX21lbW9yeV9sb2FkKCk7CiAgICAgICAgICAgIG1lbSA9IG5ldHNubXBfbWVtb3J5X2dldF9ieUlkeCggTkVUU05NUF9NRU1fVFlQRV9QSFlTTUVNLCAwICk7CiAgICAgICAgICAgIGlmICghbWVtKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJuZXRzbm1wX21lbW9yeV9nZXRfYnlJZHggcmV0dXJuZWQgTlVMTCBwb2ludGVyXG4iKTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsvKiBUcmllZCBteSBiZXN0LCBnaXZpbmcgdXAuKi8KICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgey8qIDB4ODAwMCBpcyB0aGUgbWF4aW11bSByYW5nZSBvZiBwcl9wY3RtZW0uIGRldmlzaW9uIG9mIDEwMjQgaXMgdG8gZ28gZnJvbSBCIHRvIGtCKi8KICAgICAgICAgICAgICAgIHVpbnQzMl90IHBjdF91bml0ID0gKG1lbS0+c2l6ZS8weDgwMDApICogKG1lbS0+dW5pdHMvMTAyNCk7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmID8gcHJvY19idWYtPnByX3BjdG1lbSAqIHBjdF91bml0IDogMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgeyAgICAKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl9yc3NpemUgOiAwOwogICAgICAgIAogICAgICAgIH0KI2Vsc2UgLypfTFA2NCovCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl9yc3NpemUgOiAwOwojZW5kaWYgLypfTFA2NCovCgojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY19idWYtPnBfc3dyc3M7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfc2l6ZSAqIGdldHBhZ2VzaXplKCkgLyAxMDI0OwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdm1fdHNpemUgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF92bV9zc2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3ZtX2RzaXplOwogICAgICAgIGxvbmdfcmV0dXJuID0gbG9uZ19yZXR1cm4gKiAoZ2V0cGFnZXNpemUoKSAvIDEwMjQpOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUyAmJiAhZGVmaW5lZChkYXJ3aW44KQogICNpZiBkZWZpbmVkKE5PVF9ERUZJTkVEKSAmJiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKCSAgICAvKiBYWFgKCSAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV92bXNwYWNlLT52bV90c2l6ZSArCgkJCSAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3Ztc3BhY2UtPnZtX3NzaXplICsKCQkJICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfdm1zcGFjZS0+dm1fZHNpemU7CgkgICAgbG9uZ19yZXR1cm4gPSBsb25nX3JldHVybiAqIChnZXRwYWdlc2l6ZSgpIC8gMTAyNCk7ICovCgkgICAgbG9uZ19yZXR1cm4gPSAwOwogICNlbGlmIGRlZmluZWQoZnJlZWJzZDMpICYmICFkZWZpbmVkKGRhcndpbikKICAgICAgICBsb25nX3JldHVybiA9CiAgICAjaWYgZGVmaW5lZChmcmVlYnNkNSkKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3NpemUgLyAxMDI0OwogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF92bV9tYXBfc2l6ZSAvIDEwMjQ7CiAgICAjZWxzZQogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV92bS52bV9tYXAuc2l6ZSAvIDEwMjQ7CiAgICAjZW5kaWYKICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdm1fdHNpemUgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF92bV9zc2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3ZtX2RzaXplOwogICAgICAgIGxvbmdfcmV0dXJuID0gbG9uZ19yZXR1cm4gKiAoZ2V0cGFnZXNpemUoKSAvIDEwMjQpOwogICNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV92bS52bV90c2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9lcHJvYy5lX3ZtLnZtX3NzaXplICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfdm0udm1fZHNpemU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBsb25nX3JldHVybiAqIChnZXRwYWdlc2l6ZSgpIC8gMTAyNCk7CiAgI2VuZGlmCiNlbGlmIGRlZmluZWQobGludXgpCglpZiAoKGNwID0gZ2V0X3Byb2Nfc3RhdF9maWVsZChwaWQsYnVmLHNpemVvZihidWYpLDIzKSkgPT0gTlVMTCApIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsb25nX3JldHVybiA9IGF0b2koY3ApICogKGdldHBhZ2VzaXplKCkgLyAxMDI0KTsgICAgICAgIC8qIHJzcyAqLwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICB7CiAgICAgICAgICAgIERXT1JEICAgICAgICAgICBuID0gbG93cHJvYy5kd1Byb2Nlc3NJZDsKICAgICAgICAgICAgSEFORExFICAgICAgICAgIGggPQogICAgICAgICAgICAgICAgT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiB8IFBST0NFU1NfVk1fUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBuKTsKICAgICAgICAgICAgUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMgcG1jOwoKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIGlmIChteUdldFByb2Nlc3NNZW1vcnlJbmZvCiAgICAgICAgICAgICAgICAgICAgJiYgbXlHZXRQcm9jZXNzTWVtb3J5SW5mbyhoLCAmcG1jLCBzaXplb2YgcG1jKSkKICAgICAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IHBtYy5Xb3JraW5nU2V0U2l6ZSAvIDEwMjQ7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgdGltZXMgZm9yICVsdSAoJWx1KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwcm9jLnBpZCwgbik7CiAgICAgICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgaGFuZGxlIGZvciAlbHUgKCVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwcm9jLnBpZCwgbik7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDE2ICogMTAyNDsgICAgICAgIC8qIFhYWCAtIDE2TSEgKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9ocnN3cnVuXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKGxpbnV4KQoKRElSICAgICAgICAgICAgKnByb2NkaXIgPSBOVUxMOwpzdHJ1Y3QgZGlyZW50ICAqcHJvY2VudHJ5X3A7Cgp2b2lkCkluaXRfSFJfU1dSdW4odm9pZCkKewogICAgaWYgKHByb2NkaXIgIT0gTlVMTCkKICAgICAgICBjbG9zZWRpcihwcm9jZGlyKTsKICAgIHByb2NkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOwp9CgppbnQKR2V0X05leHRfSFJfU1dSdW4odm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHBpZDsKICAgIGlmIChwcm9jZGlyID09IE5VTEwpCiAgICAgIHJldHVybiAtMTsKICAgIHByb2NlbnRyeV9wID0gcmVhZGRpcihwcm9jZGlyKTsKCiAgICBpZiAocHJvY2VudHJ5X3AgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CgogICAgcGlkID0gYXRvaShwcm9jZW50cnlfcC0+ZF9uYW1lKTsKICAgIGlmIChwaWQgPT0gMCkKICAgICAgICByZXR1cm4gKEdldF9OZXh0X0hSX1NXUnVuKCkpOwogICAgcmV0dXJuIHBpZDsKfQoKdm9pZApFbmRfSFJfU1dSdW4odm9pZCkKewogICAgaWYgKHByb2NkaXIpCiAgICAgICAgY2xvc2VkaXIocHJvY2Rpcik7CiAgICBwcm9jZGlyID0gTlVMTDsKfQoKI2VsaWYgZGVmaW5lZChjeWd3aW4pCgpzdGF0aWMgcGlkX3QgICAgY3VycGlkOwoKdm9pZApJbml0X0hSX1NXUnVuKHZvaWQpCnsKICAgIGN5Z3dpbl9pbnRlcm5hbChDV19MT0NLX1BJTkZPLCAxMDAwKTsKICAgIGN1cnBpZCA9IDA7Cn0KCmludApHZXRfTmV4dF9IUl9TV1J1bih2b2lkKQp7CiAgICBjdXJwcm9jID0KICAgICAgICAoc3RydWN0IGV4dGVybmFsX3BpbmZvICopIGN5Z3dpbl9pbnRlcm5hbChxdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJwaWQgfCBDV19ORVhUUElEKTsKICAgIGlmIChjdXJwcm9jKQogICAgICAgIGN1cnBpZCA9IGN1cnByb2MtPnBpZDsKICAgIGVsc2UgewogICAgICAgIGN1cnBpZCA9IC0xOwogICAgfQogICAgcmV0dXJuIGN1cnBpZDsKfQoKdm9pZApFbmRfSFJfU1dSdW4odm9pZCkKewogICAgY3lnd2luX2ludGVybmFsKENXX1VOTE9DS19QSU5GTyk7Cn0KCiNlbGlmIGRlZmluZWQoZHluaXgpCgp2b2lkCkluaXRfSFJfU1dSdW4odm9pZCkKewogICAgbmV4dHByb2MgPSAwOwp9CgppbnQKR2V0X05leHRfSFJfU1dSdW4odm9pZCkKewogICAgZ2V0cHJwc2luZm9fdCAgKnNlbGVjdCA9IDA7CgogICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW46OkdldE5leHRIUl9TV1J1biIsCiAgICAgICAgICAgICAgICAibmV4dHByb2MgPT0gJWQuLi4gJm5leHRwcm9jID0gJXVcbiIsIG5leHRwcm9jLAogICAgICAgICAgICAgICAgJm5leHRwcm9jKSk7CiAgICBpZiAoKG5leHRwcm9jID0gZ2V0cHJwc2luZm8obmV4dHByb2MsIHNlbGVjdCwgJm15cHNpbmZvKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1bjo6R2V0TmV4dEhSX1NXUnVuIiwKICAgICAgICAgICAgICAgICAgICAiZ2V0cHJwc2luZm8gcmV0dXJuZWQgJWRcbiIsIG5leHRwcm9jKSk7CiAgICAgICAgcmV0dXJuIG15cHNpbmZvLnByX3BpZDsKICAgIH0KCn0KCnZvaWQKRW5kX0hSX1NXUnVuKHZvaWQpCnsKICAgIC8qCiAgICAgKiBqdXN0IGEgc3R1Yi4uLiBiZWNhdXNlIGl0J3MgZGVjbGFyZWQgCiAgICAgKi8KfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwoKc3RhdGljIGludCAgICAgIG5wcm9jOwoKdm9pZApJbml0X0hSX1NXUnVuKHZvaWQpCnsKICAgIHNpemVfdCAgICAgICAgICBieXRlczsKICAgIHN0YXRpYyB0aW1lX3QgICBpd2hlbiA9IDA7CiAgICB0aW1lX3QgICAgICAgICAgbm93OwoKICAgIHRpbWUoJm5vdyk7CiAgICBpZiAobm93ID09IGl3aGVuKSB7CiAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5ID0gMDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpd2hlbiA9IG5vdzsKCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICBwc3RhdF9nZXRkeW5hbWljKCZwc3RfZHluLCBzaXplb2Yoc3RydWN0IHBzdF9keW5hbWljKSwgMSwgMCk7CiAgICBucHJvYyA9IHBzdF9keW4ucHNkX2FjdGl2ZXByb2NzOwogICAgYnl0ZXMgPSBucHJvYyAqIHNpemVvZihzdHJ1Y3QgcHN0X3N0YXR1cyk7CiAgICBpZiAoKHByb2NfdGFibGUgPQogICAgICAgICAoc3RydWN0IHBzdF9zdGF0dXMgKikgcmVhbGxvYyhwcm9jX3RhYmxlLCBieXRlcykpID09IE5VTEwpIHsKICAgICAgICBjdXJyZW50X3Byb2NfZW50cnkgPSBucHJvYyArIDE7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcHN0YXRfZ2V0cHJvYyhwcm9jX3RhYmxlLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0dXMpLCBucHJvYywgMCk7CgojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAgaWYgKGdldEtzdGF0SW50KCJ1bml4IiwgInN5c3RlbV9taXNjIiwgIm5wcm9jIiwgJm5wcm9jKSkgewogICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IG5wcm9jICsgMTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBieXRlcyA9IG5wcm9jICogc2l6ZW9mKGludCk7CiAgICBpZiAoKHByb2NfdGFibGUgPSAoaW50ICopIHJlYWxsb2MocHJvY190YWJsZSwgYnl0ZXMpKSA9PSBOVUxMKSB7CiAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5ID0gbnByb2MgKyAxOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHsKICAgICAgICBESVIgICAgICAgICAgICAqZjsKICAgICAgICBzdHJ1Y3QgZGlyZW50ICAqZHA7CiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfID09IDAKICAgICAgICBpZiAoa2QgPT0gTlVMTCkgewogICAgICAgICAgICBjdXJyZW50X3Byb2NfZW50cnkgPSBucHJvYyArIDE7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZgogICAgICAgIGYgPSBvcGVuZGlyKCIvcHJvYyIpOwogICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDA7CiAgICAgICAgd2hpbGUgKChkcCA9IHJlYWRkaXIoZikpICE9IE5VTEwgJiYgY3VycmVudF9wcm9jX2VudHJ5IDwgbnByb2MpCiAgICAgICAgICAgIGlmIChkcC0+ZF9uYW1lWzBdICE9ICcuJykKICAgICAgICAgICAgICAgIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdID0gYXRvaShkcC0+ZF9uYW1lKTsKICAgICAgICAvKgogICAgICAgICAqIGlmIHdlIGFyZSBpbiBhIFNvbGFyaXMgem9uZSwgbnByb2MgPiBjdXJyZW50X3Byb2NfZW50cnkgIQogICAgICAgICAqIGJ1dCB3ZSBvbmx5IHdhbnQgdGhlIHByb2Nlc3NlcyBmcm9tIHRoZSBsb2NhbCB6b25lCiAgICAgICAgICovCiAgICAgICAgaWYgKGN1cnJlbnRfcHJvY19lbnRyeSAhPSBucHJvYykKICAgICAgICAgICAgbnByb2MgPSBjdXJyZW50X3Byb2NfZW50cnk7CiAgICAgICAgY2xvc2VkaXIoZik7CiAgICB9CiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgIHsKCQlwaWRfdCBwcm9jX2luZGV4ID0gMDsKCQlpbnQgYXZhaWwgPSAxMDI0OwoJCWlmIChwcm9jX3RhYmxlKSB7CgkJCWZyZWUocHJvY190YWJsZSk7CgkJfQoJCW5wcm9jID0gMDsKCQlwcm9jX3RhYmxlID0gbWFsbG9jKHNpemVvZihwcm9jX3RhYmxlWzBdKSAqIGF2YWlsKTsKCQlmb3IgKDs7KSB7CgkJCWludCBnb3Q7CgkJCWlmICghcHJvY190YWJsZSkgewoJCQkJbnByb2MgPSAwOwoJCQkJc25tcF9sb2dfcGVycm9yKCJJbml0X0hSX1NXUnVuLW1hbGxvYyIpOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWdvdCA9IGdldHByb2NzKHByb2NfdGFibGUgKyBucHJvYywgc2l6ZW9mKHByb2NfdGFibGVbMF0pLAoJCQkJCQkgICAwLCBzaXplb2Yoc3RydWN0IGZkc2luZm8pLAoJCQkJCQkgICAmcHJvY19pbmRleCwgYXZhaWwgLSBucHJvYyk7CgkJCW5wcm9jICs9IGdvdDsKCQkJaWYgKG5wcm9jIDwgYXZhaWwpIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWF2YWlsICs9IDEwMjQ7CgkJCXByb2NfdGFibGUgPSByZWFsbG9jKHByb2NfdGFibGUsIGF2YWlsICogc2l6ZW9mKHByb2NfdGFibGVbMF0pKTsKCQl9CiAgICB9CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICB7CiAgICAgICAgaWYgKGtkID09IE5VTEwpIHsKICAgICAgICAgICAgbnByb2MgPSAwOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHByb2NfdGFibGUgPSBrdm1fZ2V0cHJvYzIoa2QsIEtFUk5fUFJPQ19BTEwsIDAsIHNpemVvZiAoc3RydWN0IGtpbmZvX3Byb2MyKSwgJm5wcm9jKTsKICAgIH0KI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgIHsKICAgICAgICBpZiAoa2QgPT0gTlVMTCkgewogICAgICAgICAgICBucHJvYyA9IDA7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgI2lmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgcHJvY190YWJsZSA9IGt2bV9nZXRwcm9jcyhrZCwgS0VSTl9QUk9DX0FMTCwgMCwgc2l6ZW9mIChzdHJ1Y3Qga2luZm9fcHJvYyksICZucHJvYyk7CiAgI2Vsc2UKICAgICAgICBwcm9jX3RhYmxlID0ga3ZtX2dldHByb2NzKGtkLCBLRVJOX1BST0NfQUxMLCAwLCAmbnByb2MpOwogICNlbmRpZgogICAgfQojZWxzZQoKICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDE7CiNpZm5kZWYgYnNkaTIKICAgIG5wcm9jID0gMDsKCiAgICBpZiAoYXV0b19ubGlzdChOUFJPQ19TWU1CT0wsIChjaGFyICopICZucHJvYywgc2l6ZW9mKGludCkpID09IDApIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIkluaXRfSFJfU1dSdW4tYXV0b19ubGlzdCBOUFJPQyIpOwogICAgICAgIHJldHVybjsKICAgIH0KI2VuZGlmCiAgICBieXRlcyA9IG5wcm9jICogc2l6ZW9mKHN0cnVjdCBwcm9jKTsKCiAgICBpZiAocHJvY190YWJsZSkKICAgICAgICBmcmVlKChjaGFyICopIHByb2NfdGFibGUpOwogICAgaWYgKChwcm9jX3RhYmxlID0gKHN0cnVjdCBwcm9jICopIG1hbGxvYyhieXRlcykpID09IE5VTEwpIHsKICAgICAgICBucHJvYyA9IDA7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCJJbml0X0hSX1NXUnVuLW1hbGxvYyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHByb2NfdGFibGVfYmFzZTsKICAgICAgICBpZiAoYXV0b19ubGlzdAogICAgICAgICAgICAoUFJPQ19TWU1CT0wsIChjaGFyICopICZwcm9jX3RhYmxlX2Jhc2UsCiAgICAgICAgICAgICBzaXplb2YocHJvY190YWJsZV9iYXNlKSkgPT0gMCkgewogICAgICAgICAgICBucHJvYyA9IDA7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigiSW5pdF9IUl9TV1J1bi1hdXRvX25saXN0IFBST0MiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoTkVUU05NUF9LTE9PS1VQKHByb2NfdGFibGVfYmFzZSwgKGNoYXIgKikgcHJvY190YWJsZSwgYnl0ZXMpID09IDApIHsKICAgICAgICAgICAgbnByb2MgPSAwOwogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIkluaXRfSFJfU1dSdW4ta2xvb2t1cCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojZW5kaWYKICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDA7Cn0KCmludApHZXRfTmV4dF9IUl9TV1J1bih2b2lkKQp7CiAgICB3aGlsZSAoY3VycmVudF9wcm9jX2VudHJ5IDwgbnByb2MpIHsKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ucHN0X3BpZDsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK107CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5wX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLnBfcGlkOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAogICAgICAgIGlmIChwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeV0ua2lfc3RhdCAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ua2lfcGlkOwogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5rcF9zdGF0ICE9IDApCiAgICAgICAgICAgIHJldHVybiBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXS5rcF9waWQ7CiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIGlmIChwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeV0ucF9zdGF0ICE9IDApCiAgICAgICAgICAgIHJldHVybiBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXS5wX3BpZDsKICAgICNlbHNlCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5rcF9wcm9jLnBfc3RhdCAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ua3BfcHJvYy5wX3BpZDsKICAgICNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5waV9zdGF0ZSAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ucGlfcGlkOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKytjdXJyZW50X3Byb2NfZW50cnk7CiNlbHNlCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5wX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLnBfcGlkOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKytjdXJyZW50X3Byb2NfZW50cnk7CiNlbmRpZgoKICAgIH0KICAgIHJldHVybiAtMTsKfQoKdm9pZApFbmRfSFJfU1dSdW4odm9pZCkKewogICAgY3VycmVudF9wcm9jX2VudHJ5ID0gbnByb2MgKyAxOwp9CiNlbmRpZgoKaW50CmNvdW50X3Byb2Nlc3Nlcyh2b2lkKQp7CiNpZiAhKGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoY3lnd2luKSB8fCBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpIHx8IGRlZmluZWQoc29sYXJpczIpIHx8IEhBVkVfS1ZNX0dFVFBST0NTIHx8IEhBVkVfS1ZNX0dFVFBST0MyIHx8IGRlZmluZWQoZHluaXgpKQogICAgaW50ICAgICAgICAgICAgIGk7CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIHRvdGFsID0gMDsKCiAgICBJbml0X0hSX1NXUnVuKCk7CiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpIHx8IEhBVkVfS1ZNX0dFVFBST0NTIHx8IEhBVkVfS1ZNX0dFVFBST0MyIHx8IGRlZmluZWQoc29sYXJpczIpCiAgICB0b3RhbCA9IG5wcm9jOwojZWxzZQojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyArK2kpIHsKICAgICAgICBpZiAocHJvY190YWJsZVtpXS5waV9zdGF0ZSAhPSAwKQojZWxpZiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoY3lnd2luKSAmJiAhZGVmaW5lZChkeW5peCkKICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgKytpKSB7CiAgICAgICAgaWYgKHByb2NfdGFibGVbaV0ucF9zdGF0ICE9IDApCiNlbHNlCiAgICB3aGlsZSAoR2V0X05leHRfSFJfU1dSdW4oKSAhPSAtMSkgewojZW5kaWYKICAgICAgICArK3RvdGFsOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFocHV4MTAgJiYgIWhwdXgxMSAmJiAhSEFWRV9LVk1fR0VUUFJPQ1MgJiYgIUhBVkVfS1ZNX0dFVFBST0MyICYmICFzb2xhcmlzMiAqLwogICAgRW5kX0hSX1NXUnVuKCk7CiAgICByZXR1cm4gdG90YWw7Cn0K