From mboxrd@z Thu Jan 1 00:00:00 1970 From: Derek Morton Subject: [PATCH i-g-t v3] lib/igt_core.c: Expand --run-subtest functionality. Date: Thu, 4 Feb 2016 12:06:57 +0000 Message-ID: <1454587617-33962-1-git-send-email-derek.j.morton@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id B38FA6E0FE for ; Thu, 4 Feb 2016 04:07:26 -0800 (PST) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: daniel.vetter@ffwll.ch List-Id: intel-gfx@lists.freedesktop.org QWRkZWQgZXh0ZW5kZWQgd2lsZGNhcmQgc3VwcG9ydCB3aGVuIHNwZWNpZnlpbmcgLS1ydW4tc3Vi dGVzdC4KCldpbGRjYXJkIGZvcm1hdCBpcyBhcyBzcGVjaWZpZWQgaW4gcmZjMzk3NyBhbmQgdGhl IHV3aWxkbWF0KCkgaW1wbGVtZW50YXRpb24KaXMgdGFrZW4gZnJvbSBsaWJpbm4uClNlZSBodHRw czovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk3NyNzZWN0aW9uLTQgZm9yIGEgZGVzY3JpcHRp b24gb2YKYWxsb3dlZCB3aWxkY2FyZCBleHByZXNzaW9ucy4KCnYyOiBVc2UgY29tbWEgYXMgbGlz dCBzZXBhcmF0b3IgKFZpbGxlIFN5cmphbGEpCnN1cHBvcnQgYm90aCBeIGFuZCAhIGFzIG5vdCBv cGVyYXRvcnMgKERhdmUgR29yZG9uKQoKdjM6IFVwZGF0ZWQgdG8gdXNlIHV3aWxkbWF0KCkgKERh dmUgR29yZG9uKQoKU2lnbmVkLW9mZi1ieTogRGVyZWsgTW9ydG9uIDxkZXJlay5qLm1vcnRvbkBp bnRlbC5jb20+Ci0tLQogQ09QWUlORyAgICAgICAgICAgICAgICAgfCAgMjEgKysrCiBsaWIvTWFr ZWZpbGUuc291cmNlcyAgICB8ICAgMiArCiBsaWIvaWd0X2NvcmUuYyAgICAgICAgICB8ICAxNyAr LQogbGliL3V3aWxkbWF0L3V3aWxkbWF0LmMgfCA0NzQgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCiBsaWIvdXdpbGRtYXQvdXdpbGRtYXQuaCB8ICAyNCAr KysKIDUgZmlsZXMgY2hhbmdlZCwgNTM2IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCiBj cmVhdGUgbW9kZSAxMDA2NDQgbGliL3V3aWxkbWF0L3V3aWxkbWF0LmMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBsaWIvdXdpbGRtYXQvdXdpbGRtYXQuaAoKZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZ SU5HCmluZGV4IGI4ZjY3NTMuLjE2Mzc1ZjIgMTAwNjQ0Ci0tLSBhL0NPUFlJTkcKKysrIGIvQ09Q WUlORwpAQCAtMTA2LDMgKzEwNiwyNCBAQCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogTElBQklMSVRZLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ TkcKIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRI RSBVU0UgT1IgT1RIRVIgREVBTElOR1MKIElOIFRIRSBTT0ZUV0FSRS4KKworQ29weXJpZ2h0IChj KSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyLAor ICAgIDIwMTMsIDIwMTQgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVND IikKK0NvcHlyaWdodCAoYykgMTk5MSwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5 OSwgMjAwMCwgMjAwMSwKKyAgICAyMDAyLCAyMDAzIGJ5IFRoZSBJbnRlcm5ldCBTb2Z0d2FyZSBD b25zb3J0aXVtIGFuZCBSaWNoIFNhbHoKKworVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0 d2FyZSBjb250cmlidXRlZCB0byB0aGUgSW50ZXJuZXQgU29mdHdhcmUKK0NvbnNvcnRpdW0gYnkg UmljaCBTYWx6LgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJp YnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKK3B1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBp cyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisKK1RI RSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJS QU5USUVTIFdJVEgKK1JFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElF RCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVO VCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUiBBTlkKK1NQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1Qs IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworV0hBVFNPRVZFUiBSRVNV TFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCitB Q1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBB UklTSU5HIE9VVCBPRgorT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFO Q0UgT0YgVEhJUyBTT0ZUV0FSRS4KKwpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlLnNvdXJjZXMg Yi9saWIvTWFrZWZpbGUuc291cmNlcwppbmRleCA0OTk5ODY4Li5lMzM4NjFlIDEwMDY0NAotLS0g YS9saWIvTWFrZWZpbGUuc291cmNlcworKysgYi9saWIvTWFrZWZpbGUuc291cmNlcwpAQCAtNjAs NiArNjAsOCBAQCBsaWJpbnRlbF90b29sc19sYV9TT1VSQ0VTID0gCVwKIAlpZ3RfY29yZS5oCQlc CiAJaWd0X2RyYXcuYwkJXAogCWlndF9kcmF3LmgJCVwKKwl1d2lsZG1hdC91d2lsZG1hdC5oCVwK Kwl1d2lsZG1hdC91d2lsZG1hdC5jCVwKIAkkKE5VTEwpCiAKIC5QSE9OWTogdmVyc2lvbi5oLnRt cApkaWZmIC0tZ2l0IGEvbGliL2lndF9jb3JlLmMgYi9saWIvaWd0X2NvcmUuYwppbmRleCA2YjY5 YmI3Li44ZTBiZDJlIDEwMDY0NAotLS0gYS9saWIvaWd0X2NvcmUuYworKysgYi9saWIvaWd0X2Nv cmUuYwpAQCAtNTYsNyArNTYsNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8bGlt aXRzLmg+CiAjaW5jbHVkZSA8bG9jYWxlLmg+Ci0jaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1 ZGUgPHV3aWxkbWF0L3V3aWxkbWF0Lmg+CiAKICNpbmNsdWRlICJkcm10ZXN0LmgiCiAjaW5jbHVk ZSAiaW50ZWxfY2hpcHNldC5oIgpAQCAtMjA5LDYgKzIwOSwxOSBAQAogICogaW50ZWwgZ3B1IHRv IGJlIHByZXNlbnQpLiBUaGVuIGluZGl2aWR1YWwgc3VidGVzdHMgY2FuIGJlIHJ1biB3aXRoCiAg KiAiLS1ydW4tc3VidGVzdCIuIFVzYWdlIGhlbHAgZm9yIHRlc3RzIHdpdGggc3VidGVzdHMgY2Fu IGJlIG9idGFpbmVkIHdpdGggdGhlCiAgKiAiLS1oZWxwIiBjb21tYW5kIGxpbmUgb3B0aW9uLgor ICoKKyAqIEEgd2lsZGNhcmQgZXhwcmVzc2lvbiBjYW4gYmUgZ2l2ZW4gdG8gLS1ydW4tc3VidGVz dCB0byBzcGVjaWZ5IGEgc3Vic2V0IG9mCisgKiBzdWJ0ZXN0cyB0byBydW4uIFNlZSBodHRwczov L3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk3NyNzZWN0aW9uLTQgZm9yIGEKKyAqIGRlc2NyaXB0 aW9uIG9mIGFsbG93ZWQgd2lsZGNhcmQgZXhwcmVzc2lvbnMuCisgKiBTb21lIGV4YW1wbGVzIG9m IGFsbG93ZWQgd2lsZGNhcmQgZXhwcmVzc2lvbnMgYXJlOgorICoKKyAqIC0gJypiYXNpYyonIG1h dGNoIGFueSBzdWJ0ZXN0IGNvbnRhaW5pbmcgYmFzaWMKKyAqIC0gJ2Jhc2ljLT8/PycgbWF0Y2gg YW55IHN1YnRlc3QgbmFtZWQgYmFzaWMtIHdpdGggMyBjaGFyYWN0ZXJzIGFmdGVyIC0KKyAqIC0g J2Jhc2ljLVswLTldJyBtYXRjaCBhbnkgc3VidGVzdCBuYW1lZCBiYXNpYy0gd2l0aCBhIHNpbmds ZSBudW1iZXIgYWZ0ZXIgLQorICogLSAnYmFzaWMtW14wLTldJyBtYXRjaCBhbnkgc3VidGVzdCBu YW1lZCBiYXNpYy0gd2l0aCBhIHNpbmdsZSBub24gbnVtZXJpY2FsIGNoYXJhY3RlciBhZnRlciAt CisgKiAtICdiYXNpYyosYWR2YW5jZWQqJyBtYXRjaCBhbnkgc3VidGVzdCBzdGFydGluZyBiYXNp YyBvciBhZHZhbmNlZAorICogLSAnKiwhYmFzaWMqJyBtYXRjaCBhbnkgc3VidGVzdCBub3Qgc3Rh cnRpbmcgYmFzaWMKKyAqIC0gJ2Jhc2ljKiwhYmFzaWMtcmVuZGVyKicgbWF0Y2ggYW55IHN1YnRl c3Qgc3RhcnRpbmcgYmFzaWMgYnV0IG5vdCBzdGFydGluZyBiYXNpYy1yZW5kZXIKICAqLwogCiBz dGF0aWMgdW5zaWduZWQgaW50IGV4aXRfaGFuZGxlcl9jb3VudDsKQEAgLTgxNCw3ICs4MjcsNyBA QCBib29sIF9faWd0X3J1bl9zdWJ0ZXN0KGNvbnN0IGNoYXIgKnN1YnRlc3RfbmFtZSkKIAl9CiAK IAlpZiAocnVuX3NpbmdsZV9zdWJ0ZXN0KSB7Ci0JCWlmIChmbm1hdGNoKHJ1bl9zaW5nbGVfc3Vi dGVzdCwgc3VidGVzdF9uYW1lLCAwKSAhPSAwKQorCQlpZiAodXdpbGRtYXQoc3VidGVzdF9uYW1l LCBydW5fc2luZ2xlX3N1YnRlc3QpID09IDApCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWVsc2UKIAkJ CXJ1bl9zaW5nbGVfc3VidGVzdF9mb3VuZCA9IHRydWU7CmRpZmYgLS1naXQgYS9saWIvdXdpbGRt YXQvdXdpbGRtYXQuYyBiL2xpYi91d2lsZG1hdC91d2lsZG1hdC5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjJkMzQ3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdXdpbGRt YXQvdXdpbGRtYXQuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyogdXdpbGRtYXQuYyBpcyByZXVzZWQg ZnJvbSBsaWJpbm4gLSBodHRwczovL2xhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvaW5uMi8y LjUuNC0xCisKK1RoaXMgcHJvdmlkZXMgd2lsZCBjYXJkIG1hdGNoaW5nIG9yaWdpbmFsbHkgdXNl ZCBpbiBJbnRlck5ldE5ld3MgYW5kIGlzCitkZXNjcmliZWQgaW4gaHR0cHM6Ly90b29scy5pZXRm Lm9yZy9odG1sL3JmYzM5Nzcjc2VjdGlvbi00CisKK0lOTiBsaWNlbmNlOgorSU5OIGFzIGEgd2hv bGUgYW5kIGFsbCBjb2RlIGNvbnRhaW5lZCBpbiBpdCBub3Qgb3RoZXJ3aXNlIG1hcmtlZCB3aXRo CitkaWZmZXJlbnQgbGljZW5zZXMgYW5kL29yIGNvcHlyaWdodHMgaXMgY292ZXJlZCBieSB0aGUg Zm9sbG93aW5nIGNvcHlyaWdodAorYW5kIGxpY2Vuc2U6CisKKyAgIENvcHlyaWdodCAoYykgMjAw NCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwKKyAgICAg ICAyMDEzLCAyMDE0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIp CisgICBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5 OTksIDIwMDAsIDIwMDEsCisgICAgICAgMjAwMiwgMjAwMyBieSBUaGUgSW50ZXJuZXQgU29mdHdh cmUgQ29uc29ydGl1bSBhbmQgUmljaCBTYWx6CisKKyAgIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZy b20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gdGhlIEludGVybmV0IFNvZnR3YXJlCisgICBDb25z b3J0aXVtIGJ5IFJpY2ggU2Fsei4KKworICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgICBwdXJwb3NlIHdpdGgg b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3Zl CisgICBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp biBhbGwgY29waWVzLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQg SVNDIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRICisgICBSRUdBUkQgVE8gVEhJUyBTT0ZU V0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklM SVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IgQU5Z CisgICBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg T1IgQU5ZIERBTUFHRVMKKyAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0Us IERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICAgQUNUSU9OIE9GIENPTlRSQUNULCBO RUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAgIE9S IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdB UkUuCisKKyovCisKKy8qICAkSWQ6IHV3aWxkbWF0LmMgODkxOCAyMDEwLTAxLTIyIDIzOjI4OjI4 WiBpdWxpdXMgJAorKioKKyoqICB3aWxkbWF0IHBhdHRlcm4gbWF0Y2hpbmcgd2l0aCBVbmljb2Rl IFVURi04IGV4dGVuc2lvbnMuCisqKgorKiogIERvIHNoZWxsLXN0eWxlIHBhdHRlcm4gbWF0Y2hp bmcgZm9yID8sIFwsIFtdLCBhbmQgKiBjaGFyYWN0ZXJzLiAgTWlnaHQgbm90CisqKiAgYmUgcm9i dXN0IGluIGZhY2Ugb2YgbWFsZm9ybWVkIHBhdHRlcm5zOyBlLmcuLCAiZm9vW2EtIiBjb3VsZCBj YXVzZSBhCisqKiAgc2VnbWVudGF0aW9uIHZpb2xhdGlvbi4gIEl0IGlzIDgtYml0IGNsZWFuLiAg KFJvYnVzdG5lc3MgaG9wZWZ1bGx5IGZpeGVkCisqKiAgSnVseSAyMDAwOyBhbGwgbWFsZm9ybWVk IHBhdHRlcm5zIHNob3VsZCBub3cganVzdCBmYWlsIHRvIG1hdGNoIGFueXRoaW5nLikKKyoqCisq KiAgT3JpZ2luYWwgYnkgUmljaCAkYWx6LCBtaXJyb3IhcnMsIFdlZCBOb3YgMjYgMTk6MDM6MTcg RVNUIDE5ODYuCisqKiAgUmljaCAkYWx6IGlzIG5vdyA8cnNhbHpAb3NmLm9yZz4uCisqKgorKiog IEFwcmlsLCAxOTkxOiAgUmVwbGFjZWQgbXV0dWFsbHktcmVjdXJzaXZlIGNhbGxzIHdpdGggaW4t bGluZSBjb2RlIGZvciB0aGUKKyoqICBzdGFyIGNoYXJhY3Rlci4KKyoqCisqKiAgU3BlY2lhbCB0 aGFua3MgdG8gTGFycyBNYXRoaWVzZW4gPHRob3Jpbm5AZGlrdS5kaz4gZm9yIHRoZSBBQk9SVCBj b2RlLgorKiogIFRoaXMgY2FuIGdyZWF0bHkgc3BlZWQgdXAgZmFpbGluZyB3aWxkY2FyZCBwYXR0 ZXJucy4gIEZvciBleGFtcGxlOgorKioKKyoqCXBhdHRlcm46IC0qLSotKi0qLSotKi0xMi0qLSot Ki1tLSotKi0qCisqKgl0ZXh0IDE6CSAtYWRvYmUtY291cmllci1ib2xkLW8tbm9ybWFsLS0xMi0x MjAtNzUtNzUtbS03MC1pc284ODU5LTEKKyoqCXRleHQgMjoJIC1hZG9iZS1jb3VyaWVyLWJvbGQt by1ub3JtYWwtLTEyLTEyMC03NS03NS1YLTcwLWlzbzg4NTktMQorKioKKyoqICBUZXh0IDEgbWF0 Y2hlcyB3aXRoIDUxIGNhbGxzLCB3aGlsZSB0ZXh0IDIgZmFpbHMgd2l0aCA1NCBjYWxscy4gIFdp dGhvdXQKKyoqICB0aGUgQUJPUlQgY29kZSwgaXQgdGFrZXMgMjIzMTAgY2FsbHMgdG8gZmFpbC4g IFVnaC4gIFRoZSBmb2xsb3dpbmcKKyoqICBleHBsYW5hdGlvbiBpcyBmcm9tIExhcnM6CisqKgor KiogIFRoZSBwcmVjb25kaXRpb24gdGhhdCBtdXN0IGJlIGZ1bGZpbGxlZCBpcyB0aGF0IERvTWF0 Y2ggd2lsbCBjb25zdW1lIGF0CisqKiAgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0ZXh0LiAgVGhp cyBpcyB0cnVlIGlmICpwIGlzIG5laXRoZXIgJyonIG5vciAnXDAnLikKKyoqICBUaGUgbGFzdCBy ZXR1cm4gaGFzIEFCT1JUIGluc3RlYWQgb2YgZmFsc2UgdG8gYXZvaWQgcXVhZHJhdGljIGJlaGF2 aW91ciBpbgorKiogIGNhc2VzIGxpa2UgcGF0dGVybiAiKmEqYipjKmQiIHdpdGggdGV4dCAiYWJj eHh4eHgiLiAgV2l0aCBmYWxzZSwgZWFjaAorKiogIHN0YXItbG9vcCBoYXMgdG8gcnVuIHRvIHRo ZSBlbmQgb2YgdGhlIHRleHQ7IHdpdGggQUJPUlQgb25seSB0aGUgbGFzdCBvbmUKKyoqICBkb2Vz LgorKioKKyoqICBPbmNlIHRoZSBjb250cm9sIG9mIG9uZSBpbnN0YW5jZSBvZiBEb01hdGNoIGVu dGVycyB0aGUgc3Rhci1sb29wLCB0aGF0CisqKiAgaW5zdGFuY2Ugd2lsbCByZXR1cm4gZWl0aGVy IHRydWUgb3IgQUJPUlQsIGFuZCBhbnkgY2FsbGluZyBpbnN0YW5jZSB3aWxsCisqKiAgdGhlcmVm b3JlIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciAod2l0aG91dCBjYWxsaW5nIHJlY3Vyc2l2ZWx5 IGFnYWluKS4KKyoqICBJbiBlZmZlY3QsIG9ubHkgb25lIHN0YXItbG9vcCBpcyBldmVyIGFjdGl2 ZS4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvCisqKiAgbW9kaWZ5IHRoZSBjb2RlIHRvIG1haW50 YWluIHRoaXMgY29udGV4dCBleHBsaWNpdGx5LCBlbGltaW5hdGluZyBhbGwKKyoqICByZWN1cnNp dmUgY2FsbHMgYXQgdGhlIGNvc3Qgb2Ygc29tZSBjb21wbGljYXRpb24gYW5kIGxvc3Mgb2YgY2xh cml0eSAoYW5kCisqKiAgdGhlIEFCT1JUIHN0dWZmIHNlZW1zIHRvIGJlIHVuY2xlYXIgZW5vdWdo IGJ5IGl0c2VsZikuICBJIHRoaW5rIGl0IHdvdWxkCisqKiAgYmUgdW53aXNlIHRvIHRyeSB0byBn ZXQgdGhpcyBpbnRvIGEgcmVsZWFzZWQgdmVyc2lvbiB1bmxlc3MgeW91IGhhdmUgYQorKiogIGdv b2QgdGVzdCBkYXRhIGJhc2UgdG8gdHJ5IGl0IG91dCBvbi4KKyoqCisqKiAgSnVuZSwgMTk5MTog IFJvYmVydCBFbHogPGtyZUBtdW5uYXJpLm96LmF1PiBhZGRlZCBtaW51cyBhbmQgY2xvc2UgYnJh Y2tldAorKiogIGhhbmRsaW5nIGZvciBjaGFyYWN0ZXIgc2V0cy4KKyoqCisqKiAgSnVseSwgMjAw MDogIExhcmdlbHkgcmV3cml0dGVuIGJ5IFJ1c3MgQWxsYmVyeSA8cnJhQHN0YW5mb3JkLmVkdT4g dG8gYWRkCisqKiAgc3VwcG9ydCBmb3IgJywnLCAnIScsIGFuZCBvcHRpb25hbGx5ICdAJyB0byB0 aGUgY29yZSB3aWxkbWF0IHJvdXRpbmUuCisqKiAgQnJva2UgdGhlIGNoYXJhY3RlciBjbGFzcyBt YXRjaGluZyBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gZm9yIGNsYXJpdHkKKyoqICBzaW5jZSBp dCdzIGluZnJlcXVlbnRseSB1c2VkIGluIHByYWN0aWNlLCBhbmQgYWRkZWQgc29tZSBzaW1wbGUg bG9va2FoZWFkCisqKiAgdG8gc2lnbmlmaWNhbnRseSBkZWNyZWFzZSB0aGUgcmVjdXJzaXZlIGNh bGxzIGluIHRoZSAnKicgbWF0Y2hpbmcgY29kZS4KKyoqICBBZGRlZCBzdXBwb3J0IGZvciBVVEYt OCBhcyB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGZvciBhbnkgaGlnaC1iaXQKKyoqICBjaGFy YWN0ZXJzLgorKioKKyoqICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBVVEYtOCwgc2VlIFJGQyAz NjI5LgorKioKKyoqICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmlsZSBpcyBpbnRlbnRpb25hbGx5 IHdyaXR0ZW4gc28gdGhhdCBjb25kaXRpb25hbGx5CisqKiAgZXhlY3V0ZWQgZXhwcmVzc2lvbnMg YXJlIG9uIHNlcGFyYXRlIGxpbmVzIGZyb20gdGhlIGNvbmRpdGlvbiB0bworKiogIGZhY2lsaXRh dGUgYW5hbHlzaXMgb2YgdGhlIGNvdmVyYWdlIG9mIHRoZSB0ZXN0IHN1aXRlIHVzaW5nIHB1cmVj b3YuCisqKiAgUGxlYXNlIHByZXNlcnZlIHRoaXMuICBBcyBvZiBNYXJjaCAxMSwgMjAwMSwgcHVy ZWNvdiByZXBvcnRzIHRoYXQgdGhlCisqKiAgYWNjb21wYW55aW5nIHRlc3Qgc3VpdGUgYWNoaWV2 ZXMgMTAwJSBjb3ZlcmFnZSBvZiB0aGlzIGZpbGUuCisqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+ CisjaW5jbHVkZSAidXdpbGRtYXQuaCIKKworI2RlZmluZSBBQk9SVCAtMQorCisvKiBXaGV0aGVy IG9yIG5vdCBhbiBvY3RldCBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiBhIFVURi04IGNoYXJhY3Rl ci4gKi8KKyNkZWZpbmUgSVNVVEY4KGMpICAgICAgICgoKGMpICYgMHhjMCkgPT0gMHhjMCkKKwor CisvKgorKiogIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBp biBvY3RldHMgKGZvciBhZHZhbmNpbmcKKyoqICBwb2ludGVycyB3aGVuIHNraXBwaW5nIG92ZXIg Y2hhcmFjdGVycykuICBUYWtlcyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mCisqKiAgdGhlIGNo YXJhY3RlciBhbmQgdG8gdGhlIGxhc3Qgb2N0ZXQgb2YgdGhlIHN0cmluZy4gIElmIGVuZCBpcyBO VUxMLCBleHBlY3QKKyoqICB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgc3RhcnQgdG8gYmUgbnVs LXRlcm1pbmF0ZWQuICBJZiB0aGUgY2hhcmFjdGVyIGlzCisqKiAgbWFsZm9ybWVkIFVURi04LCBy ZXR1cm4gMSB0byB0cmVhdCBpdCBsaWtlIGFuIGVpZ2h0LWJpdCBsb2NhbCBjaGFyYWN0ZXIuCisq Lworc3RhdGljIGludAordXRmOF9sZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQsIGNv bnN0IHVuc2lnbmVkIGNoYXIgKmVuZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG1hc2sgPSAweDgw OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAg aW50IGxlZnQ7CisKKyAgICBmb3IgKDsgbWFzayA+IDAgJiYgKCpzdGFydCAmIG1hc2spID09IG1h c2s7IG1hc2sgPj49IDEpCisgICAgICAgIGxlbmd0aCsrOworICAgIGlmIChsZW5ndGggPCAyIHx8 IGxlbmd0aCA+IDYpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChlbmQgIT0gTlVMTCAmJiAo ZW5kIC0gc3RhcnQgKyAxKSA8IGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgbGVmdCA9 IGxlbmd0aCAtIDE7CisgICAgZm9yIChwID0gc3RhcnQgKyAxOyBsZWZ0ID4gMCAmJiAoKnAgJiAw eGMwKSA9PSAweDgwOyBwKyspCisgICAgICAgIGxlZnQtLTsKKyAgICByZXR1cm4gKGxlZnQgPT0g MCkgPyBsZW5ndGggOiAxOworfQorCisKKy8qCisqKiAgQ2hlY2sgd2hldGhlciBhIHN0cmluZyBj b250YWlucyBvbmx5IHZhbGlkIFVURi04IGNoYXJhY3RlcnMuCisqLworYm9vbAoraXNfdmFsaWRf dXRmOChjb25zdCBjaGFyICp0ZXh0KQoreworICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKKyAgICBj b25zdCB1bnNpZ25lZCBjaGFyICpwOworICAgIGludCBsZW5ndGg7CisgICAgaW50IGxlZnQ7CisK KyAgICBmb3IgKHAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXRleHQ7ICpwICE9ICdcMCc7KSB7 CisgICAgICAgIG1hc2sgPSAweDgwOworICAgICAgICBsZW5ndGggPSAwOworCisgICAgICAgIC8q IEZpbmQgb3V0IHRoZSBleHBlY3RlZCBsZW5ndGggb2YgdGhlIGNoYXJhY3Rlci4gKi8KKyAgICAg ICAgZm9yICg7IG1hc2sgPiAwICYmICgqcCAmIG1hc2spID09IG1hc2s7IG1hc2sgPj49IDEpCisg ICAgICAgICAgICBsZW5ndGgrKzsKKworICAgICAgICBwKys7CisKKyAgICAgICAgLyogVmFsaWQg QVNDSUkuICovCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVl OworICAgICAgICAKKyAgICAgICAgLyogSW52YWxpZCBsZW5ndGguICovCisgICAgICAgIGlmIChs ZW5ndGggPCAyIHx8IGxlbmd0aCA+IDYpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg ICAgICAgLyogQ2hlY2sgdGhhdCBlYWNoIGJ5dGUgbG9va3MgbGlrZSAxMHh4eHh4eCwgZXhjZXB0 IGZvciB0aGUgZmlyc3QuICovCisgICAgICAgIGxlZnQgPSBsZW5ndGggLSAxOworICAgICAgICBm b3IgKDsgbGVmdCA+IDAgJiYgKCpwICYgMHhjMCkgPT0gMHg4MDsgcCsrKQorICAgICAgICAgICAg bGVmdC0tOworCisgICAgICAgIGlmIChsZWZ0ID4gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKgorKiogIENvbnZlcnQgYSBV VEYtOCBjaGFyYWN0ZXIgdG8gVUNTLTQuICBUYWtlcyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9m IHRoZQorKiogIGNoYXJhY3RlciBhbmQgdG8gdGhlIGxhc3Qgb2N0ZXQgb2YgdGhlIHN0cmluZywg YW5kIHRvIGEgdWludDMyX3QgaW50bworKiogIHdoaWNoIHRvIHB1dCB0aGUgZGVjb2RlZCBVQ1Mt NCB2YWx1ZS4gIElmIGVuZCBpcyBOVUxMLCBleHBlY3QgdGhlIHN0cmluZworKiogIHBvaW50ZWQg dG8gYnkgc3RhcnQgdG8gYmUgbnVsLXRlcm1pbmF0ZWQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2Yg b2N0ZXRzIGluCisqKiAgdGhlIFVURi04IGVuY29kaW5nLiAgSWYgdGhlIFVURi04IGNoYXJhY3Rl ciBpcyBtYWxmb3JtZWQsIHNldCByZXN1bHQgdG8KKyoqICB0aGUgZGVjaW1hbCB2YWx1ZSBvZiB0 aGUgZmlyc3Qgb2N0ZXQ7IHRoaXMgaXMgd3JvbmcsIGJ1dCBpdCB3aWxsIGdlbmVyYWxseQorKiog IGNhdXNlIHRoZSByZXN0IG9mIHRoZSB3aWxkbWF0IG1hdGNoaW5nIHRvIGRvIHRoZSByaWdodCB0 aGluZyBmb3Igbm9uLVVURi04CisqKiAgaW5wdXQuCisqLworc3RhdGljIGludAordXRmOF9kZWNv ZGUoY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCwK KyAgICAgICAgICAgIHVpbnQzMl90ICpyZXN1bHQpCit7CisgICAgdWludDMyX3QgdmFsdWUgPSAw OworICAgIGludCBsZW5ndGgsIGk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHN0YXJ0 OworICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKKworICAgIGxlbmd0aCA9IHV0ZjhfbGVuZ3RoKHN0 YXJ0LCBlbmQpOworICAgIGlmIChsZW5ndGggPCAyKSB7CisgICAgICAgICpyZXN1bHQgPSAqc3Rh cnQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBtYXNrID0gKDEgPDwgKDcgLSBsZW5n dGgpKSAtIDE7CisgICAgdmFsdWUgPSAqcCAmIG1hc2s7CisgICAgcCsrOworICAgIGZvciAoaSA9 IGxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgNikg fCAoKnAgJiAweDNmKTsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICAqcmVzdWx0ID0gdmFsdWU7 CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworCisvKgorKiogIE1hdGNoIGEgY2hhcmFjdGVyIGNs YXNzIGFnYWluc3QgdGV4dCwgYSBVQ1MtNCBjaGFyYWN0ZXIuICBzdGFydCBpcyBhCisqKiAgcG9p bnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBjaGFyYWN0ZXIgY2xhc3MsIGVuZCBh IHBvaW50ZXIgdG8KKyoqICB0aGUgbGFzdC4gIFJldHVybnMgd2hldGhlciB0aGUgY2xhc3MgbWF0 Y2hlcyB0aGF0IGNoYXJhY3Rlci4KKyovCitzdGF0aWMgYm9vbAorbWF0Y2hfY2xhc3ModWludDMy X3QgdGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQsCisgICAgICAgICAgICBjb25zdCB1 bnNpZ25lZCBjaGFyICplbmQpCit7CisgICAgYm9vbCByZXZlcnNlZCwgYWxsb3dyYW5nZTsKKyAg ICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gc3RhcnQ7CisgICAgdWludDMyX3QgZmlyc3QgPSAw OworICAgIHVpbnQzMl90IGxhc3Q7CisKKyAgICAvKiBDaGVjayBmb3IgYW4gaW52ZXJ0ZWQgY2hh cmFjdGVyIGNsYXNzIChzdGFydGluZyB3aXRoIF4pLiAgSWYgdGhlCisgICAgICAgY2hhcmFjdGVy IG1hdGNoZXMgdGhlIGNoYXJhY3RlciBjbGFzcywgd2UgcmV0dXJuICFyZXZlcnNlZDsgdGhhdCB3 YXksCisgICAgICAgd2UgcmV0dXJuIHRydWUgaWYgaXQncyBhIHJlZ3VsYXIgY2hhcmFjdGVyIGNs YXNzIGFuZCBmYWxzZSBpZiBpdCdzIGEKKyAgICAgICByZXZlcnNlZCBvbmUuICBJZiB0aGUgY2hh cmFjdGVyIGRvZXNuJ3QgbWF0Y2gsIHdlIHJldHVybiByZXZlcnNlZC4gKi8KKyAgICByZXZlcnNl ZCA9ICgqcCA9PSAnXicpOworICAgIGlmIChyZXZlcnNlZCkKKyAgICAgICAgcCsrOworCisgICAg LyogV2FsayB0aHJvdWdoIHRoZSBjaGFyYWN0ZXIgY2xhc3MgdW50aWwgd2UgcmVhY2ggdGhlIGVu ZCBvciBmaW5kIGEKKyAgICAgICBtYXRjaCwgaGFuZGxpbmcgY2hhcmFjdGVyIHJhbmdlcyBhcyB3 ZSBnby4gIE9ubHkgcGVybWl0IGEgcmFuZ2UgdG8KKyAgICAgICBzdGFydCB3aGVuIGFsbG93cmFu Z2UgaXMgdHJ1ZTsgdGhpcyBhbGxvd3MgLSB0byBiZSB0cmVhdGVkIGxpa2UgYQorICAgICAgIG5v cm1hbCBjaGFyYWN0ZXIgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY2xhc3MgYW5kIGNh dGNoZXMKKyAgICAgICBtYWxmb3JtZWQgcmFuZ2VzIGxpa2UgYS1lLW4uICBXZSB0cmVhdCB0aGUg Y2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICBvZiBhIHJhbmdlIGFzIGJvdGggYSBy ZWd1bGFyIG1lbWJlciBvZiB0aGUgY2xhc3MgYW5kIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgICB0 aGUgcmFuZ2U7IHRoaXMgaXMgaGFybWxlc3MgKGFsdGhvdWdoIGl0IG1lYW5zIHRoYXQgbWFsZm9y bWVkIHJhbmdlcworICAgICAgIGxpa2UgbS1hIHdpbGwgbWF0Y2ggbSBhbmQgbm90aGluZyBlbHNl KS4gKi8KKyAgICBhbGxvd3JhbmdlID0gZmFsc2U7CisgICAgd2hpbGUgKHAgPD0gZW5kKSB7Cisg ICAgICAgIGlmIChhbGxvd3JhbmdlICYmICpwID09ICctJyAmJiBwIDwgZW5kKSB7CisgICAgICAg ICAgICBwKys7CisgICAgICAgICAgICBwICs9IHV0ZjhfZGVjb2RlKHAsIGVuZCwgJmxhc3QpOwor ICAgICAgICAgICAgaWYgKHRleHQgPj0gZmlyc3QgJiYgdGV4dCA8PSBsYXN0KQorICAgICAgICAg ICAgICAgIHJldHVybiAhcmV2ZXJzZWQ7CisgICAgICAgICAgICBhbGxvd3JhbmdlID0gZmFsc2U7 CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwICs9IHV0ZjhfZGVjb2RlKHAsIGVuZCwg JmZpcnN0KTsKKyAgICAgICAgICAgIGlmICh0ZXh0ID09IGZpcnN0KQorICAgICAgICAgICAgICAg IHJldHVybiAhcmV2ZXJzZWQ7CisgICAgICAgICAgICBhbGxvd3JhbmdlID0gdHJ1ZTsKKyAgICAg ICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV2ZXJzZWQ7Cit9CisKKworLyoKKyoqICBNYXRjaCB0 aGUgdGV4dCBhZ2FpbnN0IHRoZSBwYXR0ZXJuIGJldHdlZW4gc3RhcnQgYW5kIGVuZC4gIFRoaXMg aXMgYQorKiogIHNpbmdsZSBwYXR0ZXJuOyBhIGxlYWRpbmcgISBvciBAIG11c3QgYWxyZWFkeSBi ZSB0YWtlbiBjYXJlIG9mLCBhbmQKKyoqICBjb21tYXMgbXVzdCBiZSBkZWFsdCB3aXRoIG91dHNp ZGUgb2YgdGhpcyByb3V0aW5lLgorKi8KK3N0YXRpYyBpbnQKK21hdGNoX3BhdHRlcm4oY29uc3Qg dW5zaWduZWQgY2hhciAqdGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQsCisgICAgICAg ICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBj aGFyICpxLCAqZW5kY2xhc3M7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHN0YXJ0Owor ICAgIGJvb2wgaXNtZXRhOworICAgIGludCBtYXRjaGVkLCB3aWR0aDsKKyAgICB1aW50MzJfdCBj OworCisgICAgZm9yICg7IHAgPD0gZW5kOyBwKyspIHsKKyAgICAgICAgaWYgKCEqdGV4dCAmJiAq cCAhPSAnKicpCisgICAgICAgICAgICByZXR1cm4gQUJPUlQ7CisKKyAgICAgICAgc3dpdGNoICgq cCkgeworICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICBpZiAoISorK3ApCisgICAgICAg ICAgICAgICAgcmV0dXJuIEFCT1JUOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoLiAqLwor CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKnRleHQrKyAhPSAqcCkKKyAgICAg ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBj YXNlICc/JzoKKyAgICAgICAgICAgIHRleHQgKz0gSVNVVEY4KCp0ZXh0KSA/IHV0ZjhfbGVuZ3Ro KHRleHQsIE5VTEwpIDogMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyon OgorICAgICAgICAgICAgLyogQ29uc2VjdXRpdmUgc3RhcnMgYXJlIGVxdWl2YWxlbnQgdG8gb25l LiAgQWR2YW5jZSBwYXR0ZXJuIHRvCisgICAgICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFmdGVy IHRoZSBzdGFyLiAqLworICAgICAgICAgICAgZm9yICgrK3A7ICpwID09ICcqJzsgcCsrKQorICAg ICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgLyogQSB0cmFpbGluZyBzdGFyIHdpbGwgbWF0 Y2ggYW55dGhpbmcuICovCisgICAgICAgICAgICBpZiAocCA+IGVuZCkKKyAgICAgICAgICAgICAg ICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLyogQmFzaWMgYWxnb3JpdGhtOiBSZWN1cnNl IGF0IGVhY2ggcG9pbnQgd2hlcmUgdGhlICogY291bGQKKyAgICAgICAgICAgICAgIHBvc3NpYmx5 IG1hdGNoLiAgSWYgdGhlIG1hdGNoIHN1Y2NlZWRzIG9yIGFib3J0cywgcmV0dXJuCisgICAgICAg ICAgICAgICBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCB0cnkgdGhlIG5leHQgcG9zaXRpb24uCisK KyAgICAgICAgICAgICAgIE9wdGltaXphdGlvbjogSWYgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUg KiBpbiB0aGUgcGF0dGVybgorICAgICAgICAgICAgICAgaXNuJ3QgYSBtZXRhY2hhcmFjdGVyICh0 aGUgY29tbW9uIGNhc2UpLCB0aGVuIHRoZSAqIGhhcyB0bworICAgICAgICAgICAgICAgY29uc3Vt ZSBjaGFyYWN0ZXJzIGF0IGxlYXN0IHVwIHRvIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhhdAor ICAgICAgICAgICAgICAgY2hhcmFjdGVyIGluIHRoZSB0ZXh0LiAgU2NhbiBmb3J3YXJkIGZvciB0 aG9zZSBwb2ludHMgcmF0aGVyCisgICAgICAgICAgICAgICB0aGFuIHJlY3Vyc2luZyBhdCBldmVy eSBwb3NzaWJsZSBwb2ludCB0byBzYXZlIHRoZSBleHRyYQorICAgICAgICAgICAgICAgZnVuY3Rp b24gY2FsbCBvdmVyaGVhZC4gKi8KKyAgICAgICAgICAgIGlzbWV0YSA9ICgqcCA9PSAnWycgfHwg KnAgPT0gJz8nIHx8ICpwID09ICdcXCcpOworICAgICAgICAgICAgd2hpbGUgKCp0ZXh0KSB7Cisg ICAgICAgICAgICAgICAgd2lkdGggPSBJU1VURjgoKnRleHQpID8gdXRmOF9sZW5ndGgodGV4dCwg TlVMTCkgOiAxOworICAgICAgICAgICAgICAgIGlmIChpc21ldGEpIHsKKyAgICAgICAgICAgICAg ICAgICAgbWF0Y2hlZCA9IG1hdGNoX3BhdHRlcm4odGV4dCwgcCwgZW5kKTsKKyAgICAgICAgICAg ICAgICAgICAgdGV4dCArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAg ICAgICAgICAgICAgICB3aGlsZSAoKnRleHQgJiYgKnRleHQgIT0gKnApIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgIHRleHQgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0 aCA9IElTVVRGOCgqdGV4dCkgPyB1dGY4X2xlbmd0aCh0ZXh0LCBOVUxMKSA6IDE7CisgICAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqdGV4dCkKKyAgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiBBQk9SVDsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hl ZCA9IG1hdGNoX3BhdHRlcm4oKyt0ZXh0LCBwICsgMSwgZW5kKTsKKyAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQgIT0gZmFsc2UpCisgICAgICAgICAgICAgICAg ICAgIHJldHVybiBtYXRjaGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFC T1JUOworCisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgLyogRmluZCB0aGUgZW5kIG9m IHRoZSBjaGFyYWN0ZXIgY2xhc3MsIG1ha2luZyBzdXJlIG5vdCB0byBwaWNrCisgICAgICAgICAg ICAgICB1cCBhIGNsb3NlIGJyYWNrZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2xhc3MuICov CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBxID0gcCArICgqcCA9PSAnXicpICsgMTsK KyAgICAgICAgICAgIGlmIChxID4gZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBBQk9SVDsK KyAgICAgICAgICAgIGVuZGNsYXNzID0gbWVtY2hyKHEsICddJywgKHNpemVfdCkgKGVuZCAtIHEg KyAxKSk7CisgICAgICAgICAgICBpZiAoIWVuZGNsYXNzKQorICAgICAgICAgICAgICAgIHJldHVy biBBQk9SVDsKKworICAgICAgICAgICAgLyogRG8gdGhlIGhlYXZ5IGxpZnRpbmcgaW4gYW5vdGhl ciBmdW5jdGlvbiBmb3IgY2xhcml0eSwgc2luY2UKKyAgICAgICAgICAgICAgIGNoYXJhY3RlciBj bGFzc2VzIGFyZSBhbiB1bmNvbW1vbiBjYXNlLiAqLworICAgICAgICAgICAgdGV4dCArPSB1dGY4 X2RlY29kZSh0ZXh0LCBOVUxMLCAmYyk7CisgICAgICAgICAgICBpZiAoIW1hdGNoX2NsYXNzKGMs IHAsIGVuZGNsYXNzIC0gMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg ICAgICAgcCA9IGVuZGNsYXNzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9 CisKKyAgICByZXR1cm4gKCp0ZXh0ID09ICdcMCcpOworfQorCisKKy8qCisqKiAgVGFrZXMgdGV4 dCBhbmQgYSB3aWxkbWF0IGV4cHJlc3Npb247IGEgd2lsZG1hdCBleHByZXNzaW9uIGlzIGEKKyoq ICBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3aWxkbWF0IHBhdHRlcm5zLCBvcHRpb25hbGx5IHBy ZWNlZGVkIGJ5ICEgdG8KKyoqICBpbnZlcnQgdGhlIHNlbnNlIG9mIHRoZSBleHByZXNzaW9uLiAg UmV0dXJucyBVV0lMRE1BVF9NQVRDSCBpZiB0aGF0CisqKiAgZXhwcmVzc2lvbiBtYXRjaGVzIHRo ZSB0ZXh0LCBVV0lMRE1BVF9GQUlMIG90aGVyd2lzZS4gIElmIGFsbG93cG9pc29uIGlzCisqKiAg c2V0LCBhbGxvdyBAIHRvIGludHJvZHVjZSBhIHBvaXNvbiBleHByZXNzaW9uICh0aGUgc2FtZSBh cyAhLCBidXQgaWYgaXQKKyoqICB0cmlnZ2VycyB0aGUgZmFpbGVkIG1hdGNoIHRoZSByb3V0aW5l IHJldHVybnMgVVdJTERNQVRfUE9JU09OIGluc3RlYWQpLgorKi8KK3N0YXRpYyBlbnVtIHV3aWxk bWF0CittYXRjaF9leHByZXNzaW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRleHQsIGNvbnN0IHVu c2lnbmVkIGNoYXIgKnN0YXJ0LAorICAgICAgICAgICAgICAgICBib29sIGFsbG93cG9pc29uKQor eworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCwgKnNwbGl0OworICAgIGNvbnN0IHVuc2ln bmVkIGNoYXIgKnAgPSBzdGFydDsKKyAgICBib29sIHJldmVyc2UsIGVzY2FwZWQ7CisgICAgYm9v bCBtYXRjaCA9IGZhbHNlOworICAgIGJvb2wgcG9pc29uID0gZmFsc2U7CisgICAgYm9vbCBwb2lz b25lZCA9IGZhbHNlOworCisgICAgLyogSGFuZGxlIHRoZSBlbXB0eSBleHByZXNzaW9uIHNlcGFy YXRlbHksIHNpbmNlIG90aGVyd2lzZSBlbmQgd2lsbCBiZQorICAgICAgIHNldCB0byBhbiBpbnZh bGlkIHBvaW50ZXIuICovCisgICAgaWYgKCEqcCkKKyAgICAgICAgcmV0dXJuICEqdGV4dCA/IFVX SUxETUFUX01BVENIIDogVVdJTERNQVRfRkFJTDsKKyAgICBlbmQgPSBzdGFydCArIHN0cmxlbigo Y29uc3QgY2hhciAqKSBzdGFydCkgLSAxOworCisgICAgLyogTWFpbiBtYXRjaCBsb29wLiAgRmlu ZCBlYWNoIGNvbW1hIHRoYXQgc2VwYXJhdGVzIHBhdHRlcm5zLCBhbmQgYXR0ZW1wdCAKKyAgICAg ICB0byBtYXRjaCB0aGUgdGV4dCB3aXRoIGVhY2ggcGF0dGVybiBpbiBvcmRlci4gIFRoZSBsYXN0 IG1hdGNoaW5nCisgICAgICAgcGF0dGVybiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHdob2xlIGV4 cHJlc3Npb24gbWF0Y2hlcy4gKi8KKyAgICBmb3IgKDsgcCA8PSBlbmQgKyAxOyBwID0gc3BsaXQg KyAxKSB7CisgICAgICAgIGlmIChhbGxvd3BvaXNvbikKKyAgICAgICAgICAgIHBvaXNvbiA9ICgq cCA9PSAnQCcpOworICAgICAgICByZXZlcnNlID0gKCpwID09ICchJykgfHwgcG9pc29uOworICAg ICAgICBpZiAocmV2ZXJzZSkKKyAgICAgICAgICAgIHArKzsKKworICAgICAgICAvKiBGaW5kIHRo ZSBmaXJzdCB1bmVzY2FwZWQgY29tbWEsIGlmIGFueS4gIElmIHRoZXJlIGlzIG5vbmUsIHNwbGl0 CisgICAgICAgICAgIHdpbGwgYmUgb25lIGdyZWF0ZXIgdGhhbiBlbmQgYW5kIHBvaW50IGF0IHRo ZSBudWwgYXQgdGhlIGVuZCBvZgorICAgICAgICAgICB0aGUgc3RyaW5nLiAqLworICAgICAgICBm b3IgKGVzY2FwZWQgPSBmYWxzZSwgc3BsaXQgPSBwOyBzcGxpdCA8PSBlbmQ7IHNwbGl0KyspIHsK KyAgICAgICAgICAgIGlmICgqc3BsaXQgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgc3BsaXQr KzsKKyAgICAgICAgICAgICAgICBpZiAoKnNwbGl0ID09ICddJykKKyAgICAgICAgICAgICAgICAg ICAgc3BsaXQrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3BsaXQgPD0gZW5kICYmICpzcGxp dCAhPSAnXScpCisgICAgICAgICAgICAgICAgICAgIHNwbGl0Kys7CisgICAgICAgICAgICB9Cisg ICAgICAgICAgICBpZiAoKnNwbGl0ID09ICcsJyAmJiAhZXNjYXBlZCkKKyAgICAgICAgICAgICAg ICBicmVhazsKKyAgICAgICAgICAgIGVzY2FwZWQgPSAoKnNwbGl0ID09ICdcXCcpID8gIWVzY2Fw ZWQgOiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9wdGltaXphdGlvbjogSWYgbWF0 Y2ggPT0gIXJldmVyc2UgYW5kIHBvaXNvbiA9PSBwb2lzb25lZCwgdGhpcworICAgICAgICAgICBw YXR0ZXJuIGNhbid0IGNoYW5nZSB0aGUgcmVzdWx0LCBzbyBkb24ndCBkbyBhbnkgd29yay4gKi8K KyAgICAgICAgaWYgKG1hdGNoID09ICFyZXZlcnNlICYmIHBvaXNvbiA9PSBwb2lzb25lZCkKKyAg ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobWF0Y2hfcGF0dGVybih0ZXh0LCBwLCBz cGxpdCAtIDEpID09IHRydWUpIHsKKyAgICAgICAgICAgIHBvaXNvbmVkID0gcG9pc29uOworICAg ICAgICAgICAgbWF0Y2ggPSAhcmV2ZXJzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocG9p c29uZWQpCisgICAgICAgIHJldHVybiBVV0lMRE1BVF9QT0lTT047CisgICAgcmV0dXJuIG1hdGNo ID8gVVdJTERNQVRfTUFUQ0ggOiBVV0lMRE1BVF9GQUlMOworfQorCisKKy8qCisqKiAgVXNlci1s ZXZlbCByb3V0aW5lIHVzZWQgZm9yIHdpbGRtYXRzIHdoZXJlIEAgc2hvdWxkIGJlIHRyZWF0ZWQg YXMgYQorKiogIHJlZ3VsYXIgY2hhcmFjdGVyLgorKi8KK2Jvb2wKK3V3aWxkbWF0KGNvbnN0IGNo YXIgKnRleHQsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1 dGV4dCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHRleHQ7CisgICAgY29uc3QgdW5zaWduZWQg Y2hhciAqdXBhdCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHBhdDsKKworICAgIGlmICh1cGF0 WzBdID09ICcqJyAmJiB1cGF0WzFdID09ICdcMCcpCisgICAgICAgIHJldHVybiB0cnVlOworICAg IGVsc2UKKyAgICAgICAgcmV0dXJuIChtYXRjaF9leHByZXNzaW9uKHV0ZXh0LCB1cGF0LCBmYWxz ZSkgPT0gVVdJTERNQVRfTUFUQ0gpOworfQorCisKKy8qCisqKiAgVXNlci1sZXZlbCByb3V0aW5l IHVzZWQgZm9yIHdpbGRtYXRzIHRoYXQgc3VwcG9ydCBwb2lzb24gbWF0Y2hlcy4KKyovCitlbnVt IHV3aWxkbWF0Cit1d2lsZG1hdF9wb2lzb24oY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAq cGF0KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnV0ZXh0ID0gKGNvbnN0IHVuc2lnbmVk IGNoYXIgKikgdGV4dDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1cGF0ID0gKGNvbnN0IHVu c2lnbmVkIGNoYXIgKikgcGF0OworCisgICAgaWYgKHVwYXRbMF0gPT0gJyonICYmIHVwYXRbMV0g PT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIFVXSUxETUFUX01BVENIOworICAgIGVsc2UKKyAgICAg ICAgcmV0dXJuIG1hdGNoX2V4cHJlc3Npb24odXRleHQsIHVwYXQsIHRydWUpOworfQorCisKKy8q CisqKiAgVXNlci1sZXZlbCByb3V0aW5lIGZvciBzaW1wbGUgZXhwcmVzc2lvbnMgKG5laXRoZXIg LCBub3IgISBhcmUgc3BlY2lhbCkuCisqLworYm9vbAordXdpbGRtYXRfc2ltcGxlKGNvbnN0IGNo YXIgKnRleHQsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1 dGV4dCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHRleHQ7CisgICAgY29uc3QgdW5zaWduZWQg Y2hhciAqdXBhdCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHBhdDsKKyAgICBzaXplX3QgbGVu Z3RoOworCisgICAgaWYgKHVwYXRbMF0gPT0gJyonICYmIHVwYXRbMV0gPT0gJ1wwJykKKyAgICAg ICAgcmV0dXJuIHRydWU7CisgICAgZWxzZSB7CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwYXQp OworICAgICAgICByZXR1cm4gKG1hdGNoX3BhdHRlcm4odXRleHQsIHVwYXQsIHVwYXQgKyBsZW5n dGggLSAxKSA9PSB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvdXdpbGRtYXQvdXdp bGRtYXQuaCBiL2xpYi91d2lsZG1hdC91d2lsZG1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjJlNDcxODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvdXdpbGRtYXQvdXdp bGRtYXQuaApAQCAtMCwwICsxLDI0IEBACisKKyNpZm5kZWYgVVdJTERNQVRfSAorI2RlZmluZSBV V0lMRE1BVF9IIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvKgorKiogIFdJTERNQVQgTUFUQ0hJTkcKKyovCitl bnVtIHV3aWxkbWF0IHsKKyAgICBVV0lMRE1BVF9GQUlMICAgPSAwLAorICAgIFVXSUxETUFUX01B VENIICA9IDEsCisgICAgVVdJTERNQVRfUE9JU09OCit9OworCitleHRlcm4gYm9vbCAgICAgICAg ICAgICBpc192YWxpZF91dGY4KGNvbnN0IGNoYXIgKnN0YXJ0KTsKK2V4dGVybiBib29sICAgICAg ICAgICAgIHV3aWxkbWF0KGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IGNoYXIgKnBhdCk7CitleHRl cm4gYm9vbCAgICAgICAgICAgICB1d2lsZG1hdF9zaW1wbGUoY29uc3QgY2hhciAqdGV4dCwgY29u c3QgY2hhciAqcGF0KTsKK2V4dGVybiBlbnVtIHV3aWxkbWF0ICAgIHV3aWxkbWF0X3BvaXNvbihj b25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpwYXQpOworCisKKyNlbmRpZiAvKiBVV0lMRE1B VF9IICovCi0tIAoxLjkuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRl bC1nZngK