LyoKICogRGlyZWN0M0Qgc3RhdGUgbWFuYWdlbWVudAogKgogKiBDb3B5cmlnaHQgMjAwMiBMaW9uZWwgVWxtZXIKICogQ29weXJpZ2h0IDIwMDItMjAwNSBKYXNvbiBFZG1lYWRlcwogKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJhcGhhZWwgSnVucXVlaXJhCiAqIENvcHlyaWdodCAyMDA0IENocmlzdGlhbiBDb3N0YQogKiBDb3B5cmlnaHQgMjAwNSBPbGl2ZXIgU3RpZWJlcgogKiBDb3B5cmlnaHQgMjAwNiBIZW5yaSBWZXJiZWV0CiAqIENvcHlyaWdodCAyMDA2LTIwMDggU3RlZmFuIET2c2luZ2VyIGZvciBDb2RlV2VhdmVycwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9GTE9BVF9ICiMgaW5jbHVkZSA8ZmxvYXQuaD4KI2VuZGlmCiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGQzZF9zaGFkZXIpOwoKI2RlZmluZSBHTElORk9fTE9DQVRJT04gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+YWRhcHRlci0+Z2xfaW5mbwoKc3RhdGljIHZvaWQgc3RhdGVfYmxlbmRvcChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpOwoKc3RhdGljIHZvaWQgc3RhdGVfbm9nbChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFVzZWQgZm9yIHN0YXRlcyB3aGljaCBhcmUgbm90IG1hcHBlZCB0byBhIGdsIHN0YXRlIGFzLWlzLCBidXQgdXNlZCBzb21laG93IGRpZmZlcmVudCwKICAgICAqIGUuZyBhcyBhIHBhcmFtZXRlciBmb3IgZHJhd2luZywgb3Igd2hpY2ggYXJlIHVuaW1wbGVtZW50ZWQgaW4gd2luZG93cyBkM2QKICAgICAqLwogICAgaWYoU1RBVEVfSVNfUkVOREVSKHN0YXRlKSkgewogICAgICAgIFdJTkVEM0RSRU5ERVJTVEFURVRZUEUgUmVuZGVyU3RhdGUgPSBzdGF0ZSAtIFNUQVRFX1JFTkRFUigwKTsKICAgICAgICBUUkFDRSgiKCVzLCVkKSBubyBkaXJlY3QgbWFwcGluZyB0byBnbFxuIiwgZGVidWdfZDNkcmVuZGVyc3RhdGUoUmVuZGVyU3RhdGUpLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtSZW5kZXJTdGF0ZV0pOwogICAgfSBlbHNlIHsKICAgICAgICAvKiBTaG91bGRuJ3QgaGF2ZSBhbiB1bmtub3duIHR5cGUgaGVyZSAqLwogICAgICAgIEZJWE1FKCIlZCBubyBkaXJlY3QgbWFwcGluZyB0byBnbCBvZiBzdGF0ZSB3aXRoIHVua25vd24gdHlwZVxuIiwgc3RhdGUpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV91bmRlZmluZWQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBQcmludCBhIFdBUk4sIHRoaXMgYWxsb3dzIHRoZSBzdGF0ZWJsb2NrIGNvZGUgdG8gbG9vcCBvdmVyIGFsbCBzdGF0ZXMgdG8gZ2VuZXJhdGUgYSBkaXNwbGF5CiAgICAgKiBsaXN0IHdpdGhvdXQgY2F1c2luZyBjb25mdXNpbmcgdGVybWluYWwgb3V0cHV0LiBEZWxpYmVyYXRlbHkgbm8gc3BlY2lhbCBkZWJ1ZyBuYW1lIGhlcmUKICAgICAqIGJlY2F1c2UgaXRzIHVuZGVmaW5lZC4KICAgICAqLwogICAgV0FSTigidW5kZWZpbmVkIHN0YXRlICVkXG4iLCBzdGF0ZSk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2ZpbGxtb2RlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgV0lORUQzREZJTExNT0RFIFZhbHVlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZJTExNT0RFXTsKCiAgICBzd2l0Y2goVmFsdWUpIHsKICAgICAgICBjYXNlIFdJTkVEM0RGSUxMX1BPSU5UOgogICAgICAgICAgICBnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9QT0lOVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9QT0lOVCkiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNERklMTF9XSVJFRlJBTUU6CiAgICAgICAgICAgIGdsUG9seWdvbk1vZGUoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0xJTkUpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2x5Z29uTW9kZShHTF9GUk9OVF9BTkRfQkFDSywgR0xfTElORSkiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNERklMTF9TT0xJRDoKICAgICAgICAgICAgZ2xQb2x5Z29uTW9kZShHTF9GUk9OVF9BTkRfQkFDSywgR0xfRklMTCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvbHlnb25Nb2RlKEdMX0ZST05UX0FORF9CQUNLLCBHTF9GSUxMKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIFdJTkVEM0RSU19GSUxMTU9ERSB2YWx1ZSAlZFxuIiwgVmFsdWUpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9saWdodGluZyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIEJPT0wgdHJhbnNmb3JtZWQ7CgogICAgLyogTGlnaHRpbmcgaXMgbm90IGVuYWJsZWQgaWYgdHJhbnNmb3JtZWQgdmVydGljZXMgYXJlIGRyYXduCiAgICAgKiBidXQgbGlnaHRpbmcgZG9lcyBub3QgYWZmZWN0IHRoZSBzdHJlYW0gc291cmNlcywgc28gaXQgaXMgbm90IGdyb3VwZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgKiBUaGlzIHN0YXRlIHJlYWRzIHRoZSBkZWNvZGVkIHZlcnRleCBkZWNsYXJhdGlvbiwgc28gaWYgaXQgaXMgZGlydHkgZG9uJ3QgZG8gYW55dGhpbmcuIFRoZQogICAgICogdmVydGV4IGRlY2xhcmF0aW9uIGFwcGx5aW5nIGZ1bmN0aW9uIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIHVwZGF0aW5nCiAgICAgKi8KCiAgICBpZihpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkRFQ0wpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRyYW5zZm9ybWVkID0gKChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnBvc2l0aW9uLmxwRGF0YSAhPSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy5wb3NpdGlvbi5WQk8gIT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnBvc2l0aW9uX3RyYW5zZm9ybWVkKSA/IFRSVUUgOiBGQUxTRTsKCiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0xJR0hUSU5HXSAmJiAhdHJhbnNmb3JtZWQpIHsKICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0xJR0hUSU5HIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9MSUdIVElORyIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV96ZW5hYmxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgLyogTm8geiB0ZXN0IHdpdGhvdXQgZGVwdGggc3RlbmNpbCBidWZmZXJzICovCiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdGVuY2lsQnVmZmVyVGFyZ2V0ID09IE5VTEwpIHsKICAgICAgICBUUkFDRSgiTm8gWiBidWZmZXIgLSBkaXNhYmxpbmcgZGVwdGggdGVzdFxuIik7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOyAvKiBUaGlzIGFsc28gZGlzYWJsZXMgeiB3cml0aW5nIGluIGdsICovCiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9ERVBUSF9URVNUIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN3aXRjaCAoKFdJTkVEM0RaQlVGRkVSVFlQRSkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1pFTkFCTEVdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEWkJfRkFMU0U6CiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9ERVBUSF9URVNUIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRFpCX1RSVUU6CiAgICAgICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfREVQVEhfVEVTVCIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RaQl9VU0VXOgogICAgICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0RFUFRIX1RFU1QiKTsKICAgICAgICAgICAgRklYTUUoIlcgYnVmZmVyIGlzIG5vdCB3ZWxsIGhhbmRsZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkIEQzRFpCVUZGRVJUWVBFIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfWkVOQUJMRV0pOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9jdWxsbW9kZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIGdsRnJvbnRGYWNlKCkgaXMgc2V0IGluIGNvbnRleHQuYyBhdCBjb250ZXh0IGluaXQgYW5kIG9uIGFuIG9mZnNjcmVlbiAvIG9uc2NyZWVuIHJlbmRlcmluZwogICAgICogc3dpdGNoCiAgICAgKi8KICAgIHN3aXRjaCAoKFdJTkVEM0RDVUxMKSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ1VMTE1PREVdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEQ1VMTF9OT05FOgogICAgICAgICAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9DVUxMX0ZBQ0UiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQ1VMTF9DVzoKICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0NVTExfRkFDRSIpOwogICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQ3VsbEZhY2UoR0xfRlJPTlQpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzRENVTExfQ0NXOgogICAgICAgICAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfQ1VMTF9GQUNFIik7CiAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEN1bGxGYWNlKEdMX0JBQ0spIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQvVW5oYW5kbGVkIFdJTkVEM0RDVUxMIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ1VMTE1PREVdKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfc2hhZGVtb2RlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgc3dpdGNoICgoV0lORUQzRFNIQURFTU9ERSkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NIQURFTU9ERV0pIHsKICAgICAgICBjYXNlIFdJTkVEM0RTSEFERV9GTEFUOgogICAgICAgICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFNoYWRlTW9kZWwoR0xfRkxBVCkiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEU0hBREVfR09VUkFVRDoKICAgICAgICAgICAgZ2xTaGFkZU1vZGVsKEdMX1NNT09USCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFNoYWRlTW9kZWwoR0xfU01PT1RIKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RTSEFERV9QSE9ORzoKICAgICAgICAgICAgRklYTUUoIldJTkVEM0RTSEFERV9QSE9ORyBpc24ndCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5yZWNvZ25pemVkL1VuaGFuZGxlZCBXSU5FRDNEU0hBREVNT0RFIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU0hBREVNT0RFXSk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2RpdGhlcmVuYWJsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRElUSEVSRU5BQkxFXSkgewogICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0RJVEhFUiIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0RJVEhFUiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV96d3JpdGVuYWJsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFRPRE86IFRlc3QgaWYgaW4gZDNkIHogd3JpdGluZyBpcyBlbmFibGVkIGV2ZW4gaWYgWkVOQUJMRSBpcyBvZmYuIElmIHllcywKICAgICAqIHRoaXMgaGFzIHRvIGJlIG1lcmdlZCB3aXRoIFpFTkFCTEUgYW5kIFpGVU5DCiAgICAgKi8KICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfWldSSVRFRU5BQkxFXSkgewogICAgICAgIGdsRGVwdGhNYXNrKDEpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERlcHRoTWFzaygxKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERlcHRoTWFzaygwKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEZXB0aE1hc2soMCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfemZ1bmMoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpbnQgZ2xQYXJtID0gQ29tcGFyZUZ1bmMoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1pGVU5DXSk7CgogICAgaWYoZ2xQYXJtKSB7CiAgICAgICAgaWYoZ2xQYXJtID09IEdMX0VRVUFMIHx8IGdsUGFybSA9PSBHTF9OT1RFUVVBTCkgewogICAgICAgICAgICBzdGF0aWMgQk9PTCBvbmNlID0gRkFMU0U7CiAgICAgICAgICAgIC8qIFRoZXJlIGFyZSBhIGZldyBpc3N1ZXMgd2l0aCB0aGlzOiBGaXJzdCwgb3VyIGluYWJpbGl0eSB0bwogICAgICAgICAgICAgKiBzZWxlY3QgYSBwcm9wZXIgWiBkZXB0aCwgbW9zdCBvZiB0aGUgdGltZSB3ZSdyZSBzdHVjayB3aXRoCiAgICAgICAgICAgICAqIEQyNFM4LCBldmVuIGlmIHRoZSBhcHAgc2VsZWN0cyBEMzIgb3IgRDE2LiBUaGVyZSBzZWVtIHRvIGJlCiAgICAgICAgICAgICAqIHNvbWUgb3RoZXIgcHJlY2lzaW9uIHByb2JsZW1zIHdoaWNoIGhhdmUgdG8gYmUgZGVidWdnZWQgdG8KICAgICAgICAgICAgICogbWFrZSBOT1RFUVVBTCBhbmQgRVFVQUwgd29yayBwcm9wZXJseQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoIW9uY2UpIHsKICAgICAgICAgICAgICAgIG9uY2UgPSBUUlVFOwogICAgICAgICAgICAgICAgRklYTUUoIkQzRENNUF9OT1RFUVVBTCBhbmQgRDNEQ01QX0VRVUFMIGRvIG5vdCB3b3JrIGNvcnJlY3RseSB5ZXRcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBnbERlcHRoRnVuYyhnbFBhcm0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERlcHRoRnVuYyIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9hbWJpZW50KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgZmxvYXQgY29sWzRdOwogICAgRDNEQ09MT1JUT0dMRkxPQVQ0KHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTUJJRU5UXSwgY29sKTsKCiAgICBUUkFDRSgiU2V0dGluZyBhbWJpZW50IHRvICglZiwlZiwlZiwlZilcbiIsIGNvbFswXSwgY29sWzFdLCBjb2xbMl0sIGNvbFszXSk7CiAgICBnbExpZ2h0TW9kZWxmdihHTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBjb2wpOwogICAgY2hlY2tHTGNhbGwoImdsTGlnaHRNb2RlbCBmb3IgTU9ERUxfQU1CSUVOVCIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9ibGVuZChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGludCBzcmNCbGVuZCA9IEdMX1pFUk87CiAgICBpbnQgZHN0QmxlbmQgPSBHTF9aRVJPOwogICAgY29uc3QgU3RhdGljUGl4ZWxGb3JtYXREZXNjICpydEZvcm1hdDsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnRhcmdldCA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl90YXJnZXRzWzBdOwoKICAgIC8qIEdMX0xJTkVfU01PT1RIIG5lZWRzIEdMX0JMRU5EIHRvIHdvcmssIGFjY29yZGluZyB0byB0aGUgcmVkIGJvb2ssIGFuZCBzcGVjaWFsIGJsZW5kaW5nIHBhcmFtcyAqLwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFXSAgICAgIHx8CiAgICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0VER0VBTlRJQUxJQVNdICAgICAgICAgfHwKICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU5USUFMSUFTRURMSU5FRU5BQkxFXSkgewogICAgICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICAgICAgZ2V0Rm9ybWF0RGVzY0VudHJ5KHRhcmdldC0+cmVzb3VyY2UuZm9ybWF0LCAmR0xJTkZPX0xPQ0FUSU9OLCAmZ2xEZXNjKTsKCiAgICAgICAgLyogRGlzYWJsZSBibGVuZGluZyBpbiBhbGwgY2FzZXMgZXZlbiB3aXRob3V0IHBpeGVsc2hhZGVycy4gV2l0aCBibGVuZGluZyBvbiB3ZSBjb3VsZCBmYWNlIGEgYmlnIHBlcmZvcm1hbmNlIHBlbmFsdHkuCiAgICAgICAgICogVGhlIGQzZDkgdmlzdWFsIHRlc3QgY29uZmlybXMgdGhlIGJlaGF2aW9yLiAqLwogICAgICAgIGlmKCEoZ2xEZXNjLT5GbGFncyAmIFdJTkVEM0RGTVRfRkxBR19QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcpKSB7CiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfQkxFTkQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX0JMRU5EIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfQkxFTkQiKTsKICAgICAgICAvKiBOb3RoaW5nIG1vcmUgdG8gZG8gLSBnZXQgb3V0ICovCiAgICAgICAgcmV0dXJuOwogICAgfTsKCiAgICBzd2l0Y2ggKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19ERVNUQkxFTkRdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfWkVSTyAgICAgICAgICAgICAgIDogZHN0QmxlbmQgPSBHTF9aRVJPOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfT05FICAgICAgICAgICAgICAgIDogZHN0QmxlbmQgPSBHTF9PTkU7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNDT0xPUiAgICAgICAgICAgOiBkc3RCbGVuZCA9IEdMX1NSQ19DT0xPUjsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVlNSQ0NPTE9SICAgICAgICA6IGRzdEJsZW5kID0gR0xfT05FX01JTlVTX1NSQ19DT0xPUjsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1NSQ0FMUEhBICAgICAgICAgICA6IGRzdEJsZW5kID0gR0xfU1JDX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WU1JDQUxQSEEgICAgICAgIDogZHN0QmxlbmQgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfREVTVENPTE9SICAgICAgICAgIDogZHN0QmxlbmQgPSBHTF9EU1RfQ09MT1I7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZERVNUQ09MT1IgICAgICAgOiBkc3RCbGVuZCA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7ICBicmVhazsKCiAgICAgICAgLyogVG8gY29tcGVuc2F0ZSB0aGUgbGFjayBvZiBmb3JtYXQgc3dpdGNoaW5nIHdpdGggYmFja2J1ZmZlciBvZmZzY3JlZW4gcmVuZGVyaW5nLAogICAgICAgICAqIGFuZCB3aXRoIG9uc2NyZWVuIHJlbmRlcmluZywgd2UgbW9kaWZ5IHRoZSBhbHBoYSB0ZXN0IHBhcmFtZXRlcnMgZm9yIChJTlYpREVTVEFMUEhBCiAgICAgICAgICogaWYgdGhlIHJlbmRlciB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IGFscGhhIGJsZW5kaW5nLiBBIG5vbmV4aXN0ZW50IGFscGhhIGNoYW5uZWwKICAgICAgICAgKiByZXR1cm5zIDEuMCwgc28gRDNEQkxFTkRfREVTVEFMUEhBIGlzIEdMX09ORSwgYW5kIEQzREJMRU5EX0lOVkRFU1RBTFBIQSBpcyBHTF9aRVJPCiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfREVTVEFMUEhBICAgICAgICAgIDoKICAgICAgICAgICAgcnRGb3JtYXQgPSBnZXRGb3JtYXREZXNjRW50cnkodGFyZ2V0LT5yZXNvdXJjZS5mb3JtYXQsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICBkc3RCbGVuZCA9IHJ0Rm9ybWF0LT5hbHBoYU1hc2sgPyBHTF9EU1RfQUxQSEEgOiBHTF9PTkU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkRFU1RBTFBIQSAgICAgICA6CiAgICAgICAgICAgIHJ0Rm9ybWF0ID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KHRhcmdldC0+cmVzb3VyY2UuZm9ybWF0LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgZHN0QmxlbmQgPSBydEZvcm1hdC0+YWxwaGFNYXNrID8gR0xfT05FX01JTlVTX0RTVF9BTFBIQSA6IEdMX1pFUk87CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNBTFBIQVNBVCAgICAgICAgOgogICAgICAgICAgICBkc3RCbGVuZCA9IEdMX1NSQ19BTFBIQV9TQVRVUkFURTsKICAgICAgICAgICAgV0FSTigiQXBwbGljYXRpb24gdXNlcyBTUkNBTFBIQVNBVCBhcyBkZXN0IGJsZW5kIGZhY3RvciwgZXhwZWN0IHByb2JsZW1zXG4iKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qIFdJTkVEM0RCTEVORF9CT1RIU1JDQUxQSEEgYW5kIFdJTkVEM0RCTEVORF9CT1RISU5WU1JDQUxQSEEgYXJlIGxlZ2FjeSBzb3VyY2UgYmxlbmRpbmcKICAgICAgICAgKiB2YWx1ZXMgd2hpY2ggYXJlIHN0aWxsIHZhbGlkIHVwIHRvIGQzZDkuIFRoZXkgc2hvdWxkIG5vdCBvY2N1ciBhcyBkZXN0IGJsZW5kIHZhbHVlcwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0JPVEhTUkNBTFBIQSAgICAgICA6IGRzdEJsZW5kID0gR0xfU1JDX0FMUEhBOwogICAgICAgICAgICBzcmNCbGVuZCA9IEdMX1NSQ19BTFBIQTsKICAgICAgICAgICAgRklYTUUoIldJTkVEM0RSU19ERVNUQkxFTkQgPSBXSU5FRDNEQkxFTkRfQk9USFNSQ0FMUEhBLCB3aGF0IHRvIGRvP1xuIik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CT1RISU5WU1JDQUxQSEEgICAgOiBkc3RCbGVuZCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CiAgICAgICAgICAgIHNyY0JsZW5kID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKICAgICAgICAgICAgRklYTUUoIldJTkVEM0RSU19ERVNUQkxFTkQgPSBXSU5FRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBLCB3aGF0IHRvIGRvP1xuIik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CTEVOREZBQ1RPUiAgICAgICAgOiBkc3RCbGVuZCA9IEdMX0NPTlNUQU5UX0NPTE9SOyAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkJMRU5ERkFDVE9SICAgICA6IGRzdEJsZW5kID0gR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCBkc3QgYmxlbmQgdmFsdWUgJWRcbiIsIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19ERVNUQkxFTkRdKTsKICAgIH0KCiAgICBzd2l0Y2ggKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUkNCTEVORF0pIHsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9aRVJPICAgICAgICAgICAgICAgOiBzcmNCbGVuZCA9IEdMX1pFUk87ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9PTkUgICAgICAgICAgICAgICAgOiBzcmNCbGVuZCA9IEdMX09ORTsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1NSQ0NPTE9SICAgICAgICAgICA6IHNyY0JsZW5kID0gR0xfU1JDX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WU1JDQ09MT1IgICAgICAgIDogc3JjQmxlbmQgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfU1JDQUxQSEEgICAgICAgICAgIDogc3JjQmxlbmQgPSBHTF9TUkNfQUxQSEE7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZTUkNBTFBIQSAgICAgICAgOiBzcmNCbGVuZCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7ICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9ERVNUQ09MT1IgICAgICAgICAgOiBzcmNCbGVuZCA9IEdMX0RTVF9DT0xPUjsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkRFU1RDT0xPUiAgICAgICA6IHNyY0JsZW5kID0gR0xfT05FX01JTlVTX0RTVF9DT0xPUjsgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1NSQ0FMUEhBU0FUICAgICAgICA6IHNyY0JsZW5kID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOyAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0RFU1RBTFBIQSAgICAgICAgICA6CiAgICAgICAgICAgIHJ0Rm9ybWF0ID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KHRhcmdldC0+cmVzb3VyY2UuZm9ybWF0LCBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgc3JjQmxlbmQgPSBydEZvcm1hdC0+YWxwaGFNYXNrID8gR0xfRFNUX0FMUEhBIDogR0xfT05FOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZERVNUQUxQSEEgICAgICAgOgogICAgICAgICAgICBydEZvcm1hdCA9IGdldEZvcm1hdERlc2NFbnRyeSh0YXJnZXQtPnJlc291cmNlLmZvcm1hdCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIHNyY0JsZW5kID0gcnRGb3JtYXQtPmFscGhhTWFzayA/IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgOiBHTF9aRVJPOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfQk9USFNSQ0FMUEhBICAgICAgIDogc3JjQmxlbmQgPSBHTF9TUkNfQUxQSEE7CiAgICAgICAgICAgIGRzdEJsZW5kID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQSAgICA6IHNyY0JsZW5kID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKICAgICAgICAgICAgZHN0QmxlbmQgPSBHTF9TUkNfQUxQSEE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CTEVOREZBQ1RPUiAgICAgICAgOiBzcmNCbGVuZCA9IEdMX0NPTlNUQU5UX0NPTE9SOyAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkJMRU5ERkFDVE9SICAgICA6IHNyY0JsZW5kID0gR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCBzcmMgYmxlbmQgdmFsdWUgJWRcbiIsIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUkNCTEVORF0pOwogICAgfQoKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19FREdFQU5USUFMSUFTXSB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0FOVElBTElBU0VETElORUVOQUJMRV0pIHsKICAgICAgICBnbEVuYWJsZShHTF9MSU5FX1NNT09USCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX0xJTkVfU01PT1RIKSIpOwogICAgICAgIGlmKHNyY0JsZW5kICE9IEdMX1NSQ19BTFBIQSkgewogICAgICAgICAgICBXQVJOKCJXSU5FRDNEUlNfRURHRUFOVElBTElBUyBlbmFibGVkLCBidXQgdW5leHBlY3RlZCBzcmMgYmxlbmRpbmcgcGFyYW1cbiIpOwogICAgICAgIH0KICAgICAgICBpZihkc3RCbGVuZCAhPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICYmIGRzdEJsZW5kICE9IEdMX09ORSkgewogICAgICAgICAgICBXQVJOKCJXSU5FRDNEUlNfRURHRUFOVElBTElBUyBlbmFibGVkLCBidXQgdW5leHBlY3RlZCBkc3QgYmxlbmRpbmcgcGFyYW1cbiIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0xJTkVfU01PT1RIKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX0xJTkVfU01PT1RIKSIpOwogICAgfQoKICAgIC8qIFJlLWFwcGx5IEJMRU5ET1AoQUxQSEEpIGJlY2F1c2Ugb2YgYSBwb3NzaWJsZSBTRVBBUkFURUFMUEhBQkxFTkRFTkFCTEUgY2hhbmdlICovCiAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQkxFTkRPUCkpKSB7CiAgICAgICAgc3RhdGVfYmxlbmRvcChTVEFURV9SRU5ERVIoV0lORUQzRFJTX0JMRU5ET1BBTFBIQSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQoKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEVdKSB7CiAgICAgICAgaW50IHNyY0JsZW5kQWxwaGEgPSBHTF9aRVJPOwogICAgICAgIGludCBkc3RCbGVuZEFscGhhID0gR0xfWkVSTzsKCiAgICAgICAgLyogU2VwYXJhdGUgYWxwaGEgYmxlbmRpbmcgcmVxdWlyZXMgR0xfRVhUX2JsZW5kX2Z1bmN0aW9uX3NlcGFyYXRlLCBzbyBtYWtlIHN1cmUgaXQgaXMgYXJvdW5kICovCiAgICAgICAgaWYoIUdMX1NVUFBPUlQoRVhUX0JMRU5EX0ZVTkNfU0VQQVJBVEUpKSB7CiAgICAgICAgICAgIFdBUk4oIlVuc3VwcG9ydGVkIGluIGxvY2FsIE9wZW5HTCBpbXBsZW1lbnRhdGlvbjogZ2xCbGVuZEZ1bmNTZXBhcmF0ZUVYVFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0RFU1RCTEVOREFMUEhBXSkgewogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9aRVJPICAgICAgICAgICAgICAgOiBkc3RCbGVuZEFscGhhID0gR0xfWkVSTzsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9PTkUgICAgICAgICAgICAgICAgOiBkc3RCbGVuZEFscGhhID0gR0xfT05FOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1NSQ0NPTE9SICAgICAgICAgICA6IGRzdEJsZW5kQWxwaGEgPSBHTF9TUkNfQ09MT1I7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WU1JDQ09MT1IgICAgICAgIDogZHN0QmxlbmRBbHBoYSA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfU1JDQUxQSEEgICAgICAgICAgIDogZHN0QmxlbmRBbHBoYSA9IEdMX1NSQ19BTFBIQTsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZTUkNBTFBIQSAgICAgICAgOiBkc3RCbGVuZEFscGhhID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9ERVNUQ09MT1IgICAgICAgICAgOiBkc3RCbGVuZEFscGhhID0gR0xfRFNUX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkRFU1RDT0xPUiAgICAgICA6IGRzdEJsZW5kQWxwaGEgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0RFU1RBTFBIQSAgICAgICAgICA6IGRzdEJsZW5kQWxwaGEgPSBHTF9EU1RfQUxQSEE7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WREVTVEFMUEhBICAgICAgIDogZHN0QmxlbmRBbHBoYSA9IEdMX0RTVF9BTFBIQTsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNBTFBIQVNBVCAgICAgICAgOgogICAgICAgICAgICAgICAgZHN0QmxlbmQgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CiAgICAgICAgICAgICAgICBXQVJOKCJBcHBsaWNhdGlvbiB1c2VzIFNSQ0FMUEhBU0FUIGFzIGRlc3QgYmxlbmQgZmFjdG9yLCBleHBlY3QgcHJvYmxlbXNcbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8qIFdJTkVEM0RCTEVORF9CT1RIU1JDQUxQSEEgYW5kIFdJTkVEM0RCTEVORF9CT1RISU5WU1JDQUxQSEEgYXJlIGxlZ2FjeSBzb3VyY2UgYmxlbmRpbmcKICAgICAgICAgICAgKiB2YWx1ZXMgd2hpY2ggYXJlIHN0aWxsIHZhbGlkIHVwIHRvIGQzZDkuIFRoZXkgc2hvdWxkIG5vdCBvY2N1ciBhcyBkZXN0IGJsZW5kIHZhbHVlcwogICAgICAgICAgICAqLwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CT1RIU1JDQUxQSEEgICAgICAgOgogICAgICAgICAgICAgICAgZHN0QmxlbmRBbHBoYSA9IEdMX1NSQ19BTFBIQTsKICAgICAgICAgICAgICAgIHNyY0JsZW5kQWxwaGEgPSBHTF9TUkNfQUxQSEE7CiAgICAgICAgICAgICAgICBGSVhNRSgiV0lORUQzRFJTX0RFU1RCTEVOREFMUEhBID0gV0lORUQzREJMRU5EX0JPVEhTUkNBTFBIQSwgd2hhdCB0byBkbz9cbiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQSAgICA6CiAgICAgICAgICAgICAgICBkc3RCbGVuZEFscGhhID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKICAgICAgICAgICAgICAgIHNyY0JsZW5kQWxwaGEgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOwogICAgICAgICAgICAgICAgRklYTUUoIldJTkVEM0RSU19ERVNUQkxFTkRBTFBIQSA9IFdJTkVEM0RCTEVORF9CT1RISU5WU1JDQUxQSEEsIHdoYXQgdG8gZG8/XG4iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CTEVOREZBQ1RPUiAgICAgICAgOiBkc3RCbGVuZEFscGhhID0gR0xfQ09OU1RBTlRfQ09MT1I7ICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkJMRU5ERkFDVE9SICAgICA6IGRzdEJsZW5kQWxwaGEgPSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I7ICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEZJWE1FKCJVbnJlY29nbml6ZWQgZHN0IGJsZW5kIGFscGhhIHZhbHVlICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfREVTVEJMRU5EQUxQSEFdKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NSQ0JMRU5EQUxQSEFdKSB7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX1pFUk8gICAgICAgICAgICAgICA6IHNyY0JsZW5kQWxwaGEgPSBHTF9aRVJPOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX09ORSAgICAgICAgICAgICAgICA6IHNyY0JsZW5kQWxwaGEgPSBHTF9PTkU7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfU1JDQ09MT1IgICAgICAgICAgIDogc3JjQmxlbmRBbHBoYSA9IEdMX1NSQ19DT0xPUjsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9JTlZTUkNDT0xPUiAgICAgICAgOiBzcmNCbGVuZEFscGhhID0gR0xfT05FX01JTlVTX1NSQ19DT0xPUjsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9TUkNBTFBIQSAgICAgICAgICAgOiBzcmNCbGVuZEFscGhhID0gR0xfU1JDX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVlNSQ0FMUEhBICAgICAgICA6IHNyY0JsZW5kQWxwaGEgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0RFU1RDT0xPUiAgICAgICAgICA6IHNyY0JsZW5kQWxwaGEgPSBHTF9EU1RfQ09MT1I7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WREVTVENPTE9SICAgICAgIDogc3JjQmxlbmRBbHBoYSA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfU1JDQUxQSEFTQVQgICAgICAgIDogc3JjQmxlbmRBbHBoYSA9IEdMX1NSQ19BTFBIQV9TQVRVUkFURTsgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9ERVNUQUxQSEEgICAgICAgICAgOiBzcmNCbGVuZEFscGhhID0gR0xfRFNUX0FMUEhBOyAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0lOVkRFU1RBTFBIQSAgICAgICA6IHNyY0JsZW5kQWxwaGEgPSBHTF9EU1RfQUxQSEE7ICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfQk9USFNSQ0FMUEhBICAgICAgIDoKICAgICAgICAgICAgICAgIHNyY0JsZW5kQWxwaGEgPSBHTF9TUkNfQUxQSEE7CiAgICAgICAgICAgICAgICBkc3RCbGVuZEFscGhhID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFdJTkVEM0RCTEVORF9CT1RISU5WU1JDQUxQSEEgICAgOgogICAgICAgICAgICAgICAgc3JjQmxlbmRBbHBoYSA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CiAgICAgICAgICAgICAgICBkc3RCbGVuZEFscGhhID0gR0xfU1JDX0FMUEhBOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREJMRU5EX0JMRU5ERkFDVE9SICAgICAgICA6IHNyY0JsZW5kQWxwaGEgPSBHTF9DT05TVEFOVF9DT0xPUjsgICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1IgICAgIDogc3JjQmxlbmRBbHBoYSA9IEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUjsgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCBzcmMgYmxlbmQgYWxwaGEgdmFsdWUgJWRcbiIsIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUkNCTEVOREFMUEhBXSk7CiAgICAgICAgfQoKICAgICAgICBHTF9FWFRDQUxMKGdsQmxlbmRGdW5jU2VwYXJhdGVFWFQoc3JjQmxlbmQsIGRzdEJsZW5kLCBzcmNCbGVuZEFscGhhLCBkc3RCbGVuZEFscGhhKSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQmxlbmRGdW5jU2VwYXJhdGVFWFQiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgVFJBQ0UoImdsQmxlbmRGdW5jIHNyYz0leCwgZHN0PSV4XG4iLCBzcmNCbGVuZCwgZHN0QmxlbmQpOwogICAgICAgIGdsQmxlbmRGdW5jKHNyY0JsZW5kLCBkc3RCbGVuZCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQmxlbmRGdW5jIik7CiAgICB9CgogICAgLyogY29sb3JrZXkgZml4dXAgZm9yIHN0YWdlIDAgYWxwaGFvcCBkZXBlbmRzIG9uIFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHN0YXRlLAogICAgICAgIHNvIGl0IG1heSBuZWVkIHVwZGF0aW5nICovCiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SS0VZRU5BQkxFXSkgewogICAgICAgIGNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5ICpTdGF0ZVRhYmxlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+U3RhdGVUYWJsZTsKICAgICAgICBTdGF0ZVRhYmxlW1NUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBT1ApXS5hcHBseShTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19BTFBIQU9QKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2JsZW5kZmFjdG9yKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgZmxvYXQgY29sWzRdOwoKICAgIGlmKCFHTF9TVVBQT1JUKEVYVF9CTEVORF9DT0xPUikpIHsKICAgICAgICBXQVJOKCJVbnN1cHBvcnRlZCBpbiBsb2NhbCBPcGVuR0wgaW1wbGVtZW50YXRpb246IGdsQmxlbmRDb2xvckVYVFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFRSQUNFKCJTZXR0aW5nIEJsZW5kRmFjdG9yIHRvICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQkxFTkRGQUNUT1JdKTsKICAgIEQzRENPTE9SVE9HTEZMT0FUNChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQkxFTkRGQUNUT1JdLCBjb2wpOwogICAgR0xfRVhUQ0FMTChnbEJsZW5kQ29sb3JFWFQgKGNvbFswXSxjb2xbMV0sY29sWzJdLGNvbFszXSkpOwogICAgY2hlY2tHTGNhbGwoImdsQmxlbmRDb2xvciIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9hbHBoYShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGludCBnbFBhcm0gPSAwOwogICAgZmxvYXQgcmVmOwogICAgQk9PTCBlbmFibGVfY2tleSA9IEZBTFNFOwoKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnN1cmY7CgogICAgLyogRmluZCBvdXQgaWYgdGhlIHRleHR1cmUgb24gdGhlIGZpcnN0IHN0YWdlIGhhcyBhIGNrZXkgc2V0CiAgICAgKiBUaGUgYWxwaGEgc3RhdGUgZnVuYyByZWFkcyB0aGUgdGV4dHVyZSBzZXR0aW5ncywgZXZlbiB0aG91Z2ggYWxwaGEgYW5kIHRleHR1cmUgYXJlIG5vdCBncm91cGVkCiAgICAgKiB0b2dldGhlci4gVGhpcyBpcyB0byBhdm9pZCBtYWtpbmcgYSBodWdlIGFscGhhK3RleHR1cmUrdGV4dHVyZSBzdGFnZStja2V5IGJsb2NrIGR1ZSB0byB0aGUgaGFyZGx5CiAgICAgKiB1c2VkIFdJTkVEM0RSU19DT0xPUktFWUVOQUJMRSBzdGF0ZSh3aGljaCBpcyBkM2QgPD0gMyBvbmx5KS4gVGhlIHRleHR1cmUgZnVuY3Rpb24gd2lsbCBjYWxsIGFscGhhCiAgICAgKiBpbiBjYXNlIGl0IGZpbmRzIHNvbWUgdGV4dHVyZStjb2xvcmtleWVuYWJsZSBjb21iaW5hdGlvbiB3aGljaCBuZWVkcyBleHRyYSBjYXJlLgogICAgICovCiAgICBpZihzdGF0ZWJsb2NrLT50ZXh0dXJlc1swXSAmJiAoCiAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1swXSA9PSBHTF9URVhUVVJFXzJEIHx8CiAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1swXSA9PSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpKSB7CiAgICAgICAgc3VyZiA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopICgoSVdpbmVEM0RUZXh0dXJlSW1wbCAqKXN0YXRlYmxvY2stPnRleHR1cmVzWzBdKS0+c3VyZmFjZXNbMF07CgogICAgICAgIGlmKHN1cmYtPkNLZXlGbGFncyAmIFdJTkVERFNEX0NLU1JDQkxUKSB7CiAgICAgICAgICAgIGNvbnN0IFN0YXRpY1BpeGVsRm9ybWF0RGVzYyAqZm10ID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KHN1cmYtPnJlc291cmNlLmZvcm1hdCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgIC8qIFRoZSBzdXJmYWNlIGNvbnZlcnNpb24gZG9lcyBub3QgZG8gY29sb3Iga2V5aW5nIGNvbnZlcnNpb24gZm9yIHN1cmZhY2VzIHRoYXQgaGF2ZSBhbiBhbHBoYQogICAgICAgICAgICAgKiBjaGFubmVsIG9uIHRoZWlyIG93bi4gTGlrZXdpc2UsIHRoZSBhbHBoYSB0ZXN0IHNob3VsZG4ndCBiZSBzZXQgdXAgZm9yIGNvbG9yIGtleWluZyBpZiB0aGUKICAgICAgICAgICAgICogc3VyZmFjZSBoYXMgYWxwaGEgYml0cwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoZm10LT5hbHBoYU1hc2sgPT0gMHgwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgZW5hYmxlX2NrZXkgPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmKGVuYWJsZV9ja2V5IHx8IGNvbnRleHQtPmxhc3Rfd2FzX2NrZXkpIHsKICAgICAgICBjb25zdCBzdHJ1Y3QgU3RhdGVFbnRyeSAqU3RhdGVUYWJsZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPlN0YXRlVGFibGU7CiAgICAgICAgU3RhdGVUYWJsZVtTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19BTFBIQU9QKV0uYXBwbHkoU1RBVEVfVEVYVFVSRVNUQUdFKDAsIFdJTkVEM0RUU1NfQUxQSEFPUCksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQogICAgY29udGV4dC0+bGFzdF93YXNfY2tleSA9IGVuYWJsZV9ja2V5OwoKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFURVNURU5BQkxFXSB8fAogICAgICAgIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEVdICYmIGVuYWJsZV9ja2V5KSkgewogICAgICAgIGdsRW5hYmxlKEdMX0FMUEhBX1RFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZSBHTF9BTFBIQV9URVNUIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0FMUEhBX1RFU1QiKTsKICAgICAgICAvKiBBbHBoYSB0ZXN0IGlzIGRpc2FibGVkLCBkb24ndCBib3RoZXIgc2V0dGluZyB0aGUgcGFyYW1zIC0gaXQgd2lsbCBoYXBwZW4gb24gdGhlIG5leHQKICAgICAgICAgKiBlbmFibGUgY2FsbAogICAgICAgICAqLwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEVdICYmIGVuYWJsZV9ja2V5KSB7CiAgICAgICAgZ2xQYXJtID0gR0xfTk9URVFVQUw7CiAgICAgICAgcmVmID0gMC4wOwogICAgfSBlbHNlIHsKICAgICAgICByZWYgPSAoKGZsb2F0KSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFSRUZdKSAvIDI1NS4wZjsKICAgICAgICBnbFBhcm0gPSBDb21wYXJlRnVuYyhzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFGVU5DXSk7CiAgICB9CiAgICBpZihnbFBhcm0pIHsKICAgICAgICBnbEFscGhhRnVuYyhnbFBhcm0sIHJlZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQWxwaGFGdW5jIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2NsaXBwaW5nKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgZW5hYmxlICA9IDB4RkZGRkZGRkY7CiAgICBEV09SRCBkaXNhYmxlID0gMHgwMDAwMDAwMDsKCiAgICBpZiAodXNlX3ZzKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UpKSB7CiAgICAgICAgLyogVGhlIHNwZWMgc2F5cyB0aGF0IG9wZW5nbCBjbGlwcGluZyBwbGFuZXMgYXJlIGRpc2FibGVkIHdoZW4gdXNpbmcgc2hhZGVycy4gRGlyZWN0M0QgcGxhbmVzIGFyZW4ndCwKICAgICAgICAgKiBzbyB0aGF0IGlzIGFuIGlzc3VlLiBUaGUgTWFjT1MgQVRJIGRyaXZlciBrZWVwcyBjbGlwcGluZyBwbGFuZXMgYWN0aXZhdGVkIHdpdGggc2hhZGVycyBpbiBzb21lCiAgICAgICAgICogY29uZGl0aW9ucyBJIGdvdCBzaWNrIG9mIHRyYWNraW5nIGRvd24uIFRoZSBzaGFkZXIgc3RhdGUgaGFuZGxlciBkaXNhYmxlcyBhbGwgY2xpcCBwbGFuZXMgYmVjYXVzZQogICAgICAgICAqIG9mIHRoYXQgLSBkb24ndCBkbyBhbnl0aGluZyBoZXJlIGFuZCBrZWVwIHRoZW0gZGlzYWJsZWQKICAgICAgICAgKi8KICAgICAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ0xJUFBMQU5FRU5BQkxFXSkgewogICAgICAgICAgICBzdGF0aWMgQk9PTCB3YXJuZWQgPSBGQUxTRTsKICAgICAgICAgICAgaWYoIXdhcm5lZCkgewogICAgICAgICAgICAgICAgRklYTUUoIkNsaXBwaW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCB2ZXJ0ZXggc2hhZGVyc1xuIik7CiAgICAgICAgICAgICAgICB3YXJuZWQgPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBUT0RPOiBLZWVwIHRyYWNrIG9mIHByZXZpb3VzbHkgZW5hYmxlZCBjbGlwcGxhbmVzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHJlc2V0dGluZwogICAgICogb2YgYWxyZWFkeSBzZXQgdmFsdWVzCiAgICAgKi8KCiAgICAvKiBJZiBlbmFibGluZyAvIGRpc2FibGluZyBhbGwKICAgICAqIFRPRE86IElzIHRoaXMgY29ycmVjdD8gRG9lc24ndCBEM0RSU19DTElQUElORyBkaXNhYmxlIGNsaXBwaW5nIG9uIHRoZSB2aWV3cG9ydCBmcnVzdHJ1bT8KICAgICAqLwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DTElQUElOR10pIHsKICAgICAgICBlbmFibGUgID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRV07CiAgICAgICAgZGlzYWJsZSA9IH5zdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ0xJUFBMQU5FRU5BQkxFXTsKICAgICAgICBpZihHTF9TVVBQT1JUKE5WX0RFUFRIX0NMQU1QKSkgewogICAgICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfQ0xBTVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX0RFUFRIX0NMQU1QX05WKSIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZGlzYWJsZSA9IDB4ZmZmZmZmZmY7CiAgICAgICAgZW5hYmxlICA9IDB4MDA7CiAgICAgICAgaWYoR0xfU1VQUE9SVChOVl9ERVBUSF9DTEFNUCkpIHsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfQ0xBTVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfREVQVEhfQ0xBTVBfTlYpIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChlbmFibGUgJiBXSU5FRDNEQ0xJUFBMQU5FMCkgIHsgZ2xFbmFibGUoR0xfQ0xJUF9QTEFORTApOyAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKGNsaXAgcGxhbmUgMCkiKTsgfQogICAgaWYgKGVuYWJsZSAmIFdJTkVEM0RDTElQUExBTkUxKSAgeyBnbEVuYWJsZShHTF9DTElQX1BMQU5FMSk7ICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoY2xpcCBwbGFuZSAxKSIpOyB9CiAgICBpZiAoZW5hYmxlICYgV0lORUQzRENMSVBQTEFORTIpICB7IGdsRW5hYmxlKEdMX0NMSVBfUExBTkUyKTsgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShjbGlwIHBsYW5lIDIpIik7IH0KICAgIGlmIChlbmFibGUgJiBXSU5FRDNEQ0xJUFBMQU5FMykgIHsgZ2xFbmFibGUoR0xfQ0xJUF9QTEFORTMpOyAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKGNsaXAgcGxhbmUgMykiKTsgfQogICAgaWYgKGVuYWJsZSAmIFdJTkVEM0RDTElQUExBTkU0KSAgeyBnbEVuYWJsZShHTF9DTElQX1BMQU5FNCk7ICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoY2xpcCBwbGFuZSA0KSIpOyB9CiAgICBpZiAoZW5hYmxlICYgV0lORUQzRENMSVBQTEFORTUpICB7IGdsRW5hYmxlKEdMX0NMSVBfUExBTkU1KTsgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShjbGlwIHBsYW5lIDUpIik7IH0KCiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUwKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMCk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAwKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUxKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMSk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAxKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUyKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMik7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAyKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkUzKSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMyk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAzKSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkU0KSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FNCk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSA0KSIpOyB9CiAgICBpZiAoZGlzYWJsZSAmIFdJTkVEM0RDTElQUExBTkU1KSB7IGdsRGlzYWJsZShHTF9DTElQX1BMQU5FNSk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSA1KSIpOyB9CgogICAgLyoqIHVwZGF0ZSBjbGlwcGluZyBzdGF0dXMgKi8KICAgIGlmIChlbmFibGUpIHsKICAgICAgICBzdGF0ZWJsb2NrLT5jbGlwX3N0YXR1cy5DbGlwVW5pb24gPSAwOwogICAgICAgIHN0YXRlYmxvY2stPmNsaXBfc3RhdHVzLkNsaXBJbnRlcnNlY3Rpb24gPSAweEZGRkZGRkZGOwogICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZWJsb2NrLT5jbGlwX3N0YXR1cy5DbGlwVW5pb24gPSAwOwogICAgICAgIHN0YXRlYmxvY2stPmNsaXBfc3RhdHVzLkNsaXBJbnRlcnNlY3Rpb24gPSAwOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9ibGVuZG9wKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaW50IGJsZW5kRXF1YXRpb24gPSBHTF9GVU5DX0FERDsKICAgIGludCBibGVuZEVxdWF0aW9uQWxwaGEgPSBHTF9GVU5DX0FERDsKCiAgICBpZighR0xfU1VQUE9SVChFWFRfQkxFTkRfTUlOTUFYKSkgewogICAgICAgIFdBUk4oIlVuc3VwcG9ydGVkIGluIGxvY2FsIE9wZW5HTCBpbXBsZW1lbnRhdGlvbjogZ2xCbGVuZEVxdWF0aW9uXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQkxFTkRPUEFMUEhBIHJlcXVpcmVzIEdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSwgc28gbWFrZSBzdXJlIGl0IGlzIGFyb3VuZCAqLwogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ET1BBTFBIQV0gJiYgIUdMX1NVUFBPUlQoRVhUX0JMRU5EX0VRVUFUSU9OX1NFUEFSQVRFKSkgewogICAgICAgIFdBUk4oIlVuc3VwcG9ydGVkIGluIGxvY2FsIE9wZW5HTCBpbXBsZW1lbnRhdGlvbjogZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzd2l0Y2ggKChXSU5FRDNEQkxFTkRPUCkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ET1BdKSB7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9BREQgICAgICAgICAgICAgIDogYmxlbmRFcXVhdGlvbiA9IEdMX0ZVTkNfQUREOyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9TVUJUUkFDVCAgICAgICAgIDogYmxlbmRFcXVhdGlvbiA9IEdMX0ZVTkNfU1VCVFJBQ1Q7ICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9SRVZTVUJUUkFDVCAgICAgIDogYmxlbmRFcXVhdGlvbiA9IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVDsgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9NSU4gICAgICAgICAgICAgIDogYmxlbmRFcXVhdGlvbiA9IEdMX01JTjsgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9NQVggICAgICAgICAgICAgIDogYmxlbmRFcXVhdGlvbiA9IEdMX01BWDsgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZC9VbmhhbmRsZWQgRDNEQkxFTkRPUCB2YWx1ZSAlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ET1BdKTsKICAgIH0KCiAgICBzd2l0Y2ggKChXSU5FRDNEQkxFTkRPUCkgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ET1BBTFBIQV0pIHsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORE9QX0FERCAgICAgICAgICAgICAgOiBibGVuZEVxdWF0aW9uQWxwaGEgPSBHTF9GVU5DX0FERDsgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5ET1BfU1VCVFJBQ1QgICAgICAgICA6IGJsZW5kRXF1YXRpb25BbHBoYSA9IEdMX0ZVTkNfU1VCVFJBQ1Q7ICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBXSU5FRDNEQkxFTkRPUF9SRVZTVUJUUkFDVCAgICAgIDogYmxlbmRFcXVhdGlvbkFscGhhID0gR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUOyBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RCTEVORE9QX01JTiAgICAgICAgICAgICAgOiBibGVuZEVxdWF0aW9uQWxwaGEgPSBHTF9NSU47ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREJMRU5ET1BfTUFYICAgICAgICAgICAgICA6IGJsZW5kRXF1YXRpb25BbHBoYSA9IEdMX01BWDsgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZC9VbmhhbmRsZWQgRDNEQkxFTkRPUCB2YWx1ZSAlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0JMRU5ET1BBTFBIQV0pOwogICAgfQoKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEVdKSB7CiAgICAgICAgVFJBQ0UoImdsQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUKCV4LCAleClcbiIsIGJsZW5kRXF1YXRpb24sIGJsZW5kRXF1YXRpb25BbHBoYSk7CiAgICAgICAgR0xfRVhUQ0FMTChnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZUVYVChibGVuZEVxdWF0aW9uLCBibGVuZEVxdWF0aW9uQWxwaGEpKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFQiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgVFJBQ0UoImdsQmxlbmRFcXVhdGlvbigleClcbiIsIGJsZW5kRXF1YXRpb24pOwogICAgICAgIEdMX0VYVENBTEwoZ2xCbGVuZEVxdWF0aW9uRVhUKGJsZW5kRXF1YXRpb24pKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xCbGVuZEVxdWF0aW9uIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCnN0YXRlX3NwZWN1bGFyZW5hYmxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgLyogT3JpZ2luYWxseSB0aGlzIHVzZWQgZ2xMaWdodE1vZGVsaShHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MLEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SKQogICAgICogYW5kIChHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MLEdMX1NJTkdMRV9DT0xPUikgdG8gc3dhcCBiZXR3ZWVuIGVuYWJsZWQvZGlzYWJsZWQKICAgICAqIHNwZWN1bGFyIGNvbG9yLiBUaGlzIGlzIHdyb25nOgogICAgICogU2VwYXJhdGUgc3BlY3VsYXIgY29sb3IgbWVhbnMgdGhlIHNwZWN1bGFyIGNvbG91ciBpcyBtYWludGFpbmVkIHNlcGFyYXRlbHksIHdoZXJlYXMKICAgICAqIHNpbmdsZSBjb2xvciBtZWFucyBpdCBpcyBtZXJnZWQgaW4uIEhvd2V2ZXIgaW4gYm90aCBjYXNlcyB0aGV5IGFyZSBiZWluZyB1c2VkIHRvCiAgICAgKiBzb21lIGV4dGVudC4KICAgICAqIFRvIGRpc2FibGUgc3BlY3VsYXIgY29sb3IsIHNldCBpdCBleHBsaWNpdGx5IHRvIGJsYWNrIGFuZCB0dXJuIG9mZiBHTF9DT0xPUl9TVU1fRVhUCiAgICAgKiBOT1RFOiBJZiBub3Qgc3VwcG9ydGVkIGRvbid0IGdpdmUgRklYTUVzIHRoZSBpbXBhY3QgaXMgcmVhbGx5IG1pbmltYWwgYW5kIHZlcnkgZmV3IHBlb3BsZSBhcmUKICAgICAqIHJ1bm5pbmcgMS40IHlldCEKICAgICAqCiAgICAgKgogICAgICogSWYgcmVnaXN0ZXIgY29tYmluZXJzIGFyZSBlbmFibGVkLCBlbmFibGluZyAvIGRpc2FibGluZyBHTF9DT0xPUl9TVU0gaGFzIG5vIGVmZmVjdC4KICAgICAqIEluc3RlYWQsIHdlIG5lZWQgdG8gc2V0dXAgdGhlIEZpbmFsQ29tYmluZXIgcHJvcGVybHkuCiAgICAgKgogICAgICogVGhlIGRlZmF1bHQgc2V0dXAgZm9yIHRoZSBGaW5hbENvbWJpbmVyIGlzOgogICAgICoKICAgICAqIDx2YXJpYWJsZT4gICAgICAgPGlucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hcHBpbmc+ICAgICAgICAgICAgICAgPHVzYWdlPgogICAgICogR0xfVkFSSUFCTEVfQV9OViBHTF9GT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9JREVOVElUWV9OViBHTF9BTFBIQQogICAgICogR0xfVkFSSUFCTEVfQl9OViBHTF9TUEFSRTBfUExVU19TRUNPTkRBUllfQ09MT1JfTlYgICBHTF9VTlNJR05FRF9JREVOVElUWV9OViBHTF9SR0IKICAgICAqIEdMX1ZBUklBQkxFX0NfTlYgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfSURFTlRJVFlfTlYgR0xfUkdCCiAgICAgKiBHTF9WQVJJQUJMRV9EX05WIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0lERU5USVRZX05WIEdMX1JHQgogICAgICogR0xfVkFSSUFCTEVfRV9OViBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9JREVOVElUWV9OViBHTF9SR0IKICAgICAqIEdMX1ZBUklBQkxFX0ZfTlYgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfSURFTlRJVFlfTlYgR0xfUkdCCiAgICAgKiBHTF9WQVJJQUJMRV9HX05WIEdMX1NQQVJFMF9OViAgICAgICAgICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0lERU5USVRZX05WIEdMX0FMUEhBCiAgICAgKgogICAgICogVGhhdCdzIHByZXR0eSBtdWNoIGZpbmUgYXMgaXQgaXMsIGV4Y2VwdCBmb3IgdmFyaWFibGUgQiwgd2hpY2ggbmVlZHMgdG8gdGFrZQogICAgICogZWl0aGVyIEdMX1NQQVJFMF9QTFVTX1NFQ09OREFSWV9DT0xPUl9OViBvciBHTF9TUEFSRTBfTlYsIGRlcGVuZGluZyBvbgogICAgICogd2hldGhlciBXSU5FRDNEUlNfU1BFQ1VMQVJFTkFCTEUgaXMgZW5hYmxlZCBvciBub3QuCiAgICAgKi8KCiAgICBUUkFDRSgiU2V0dGluZyBzcGVjdWxhciBlbmFibGUgc3RhdGUgYW5kIG1hdGVyaWFsc1xuIik7CiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSRU5BQkxFXSkgewogICAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIChmbG9hdCopICZzdGF0ZWJsb2NrLT5tYXRlcmlhbC5TcGVjdWxhcik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdiIpOwoKICAgICAgICBpZihzdGF0ZWJsb2NrLT5tYXRlcmlhbC5Qb3dlciA+IEdMX0xJTUlUUyhzaGluaW5lc3MpKSB7CiAgICAgICAgICAgIC8qIGdsTWF0ZXJpYWxmIG1hbiBwYWdlIHNheXMgdGhhdCB0aGUgbWF0ZXJpYWwgc2F5cyB0aGF0IEdMX1NISU5JTkVTUyBtdXN0IGJlIGJldHdlZW4gMC4wCiAgICAgICAgICAgICAqIGFuZCAxMjguMCwgYWx0aG91Z2ggaW4gZDNkIG5laXRoZXIgLTEgbm9yIDEyOSBwcm9kdWNlIGFuIGVycm9yLiBHTF9OVl9tYXhfbGlnaHRfZXhwb25lbnQKICAgICAgICAgICAgICogYWxsb3dzIGJpZ2dlciB2YWx1ZXMuIElmIHRoZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkLCBHTF9MSU1JVFMoc2hpbmluZXNzKSBjb250YWlucyB0aGUKICAgICAgICAgICAgICogdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIGV4dGVuc2lvbiwgb3RoZXJ3aXNlIDEyOC4gRm9yIHZhbHVlcyA+IEdMX0xJTUlUUyhzaGluaW5lc3MpIGNsYW1wCiAgICAgICAgICAgICAqIHRoZW0sIGl0IHNob3VsZCBiZSBzYWZlIHRvIGRvIHNvIHdpdGhvdXQgbWFqb3IgdmlzdWFsIGRpc3RvcnRpb25zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgV0FSTigiTWF0ZXJpYWwgcG93ZXIgPSAlZiwgbGltaXQgJWZcbiIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLlBvd2VyLCBHTF9MSU1JVFMoc2hpbmluZXNzKSk7CiAgICAgICAgICAgIGdsTWF0ZXJpYWxmKEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIEdMX0xJTUlUUyhzaGluaW5lc3MpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbE1hdGVyaWFsZihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5Qb3dlcik7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbE1hdGVyaWFsZihHTF9TSElOSU5FU1MpIik7CgogICAgICAgIGlmIChHTF9TVVBQT1JUKEVYVF9TRUNPTkRBUllfQ09MT1IpKSB7CiAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NPTE9SX1NVTV9FWFQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRSQUNFKCJTcGVjdWxhciBjb2xvcnMgY2Fubm90IGJlIGVuYWJsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIG9wZW5nbFxuIik7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9DT0xPUl9TVU0pIik7CgogICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX1JFR0lTVEVSX0NPTUJJTkVSUykpIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEZpbmFsQ29tYmluZXJJbnB1dE5WKEdMX1ZBUklBQkxFX0JfTlYsIEdMX1NQQVJFMF9QTFVTX1NFQ09OREFSWV9DT0xPUl9OViwgR0xfVU5TSUdORURfSURFTlRJVFlfTlYsIEdMX1JHQikpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGaW5hbENvbWJpbmVySW5wdXROVigpIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmbG9hdCBibGFja1s0XSA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKCiAgICAgICAgLyogZm9yIHRoZSBjYXNlIG9mIGVuYWJsZWQgbGlnaHRpbmc6ICovCiAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgJmJsYWNrWzBdKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CgogICAgICAgIC8qIGZvciB0aGUgY2FzZSBvZiBkaXNhYmxlZCBsaWdodGluZzogKi8KICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgICAgICBnbERpc2FibGUoR0xfQ09MT1JfU1VNX0VYVCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVFJBQ0UoIlNwZWN1bGFyIGNvbG9ycyBjYW5ub3QgYmUgZGlzYWJsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIG9wZW5nbFxuIik7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfQ09MT1JfU1VNKSIpOwoKICAgICAgICBpZiAoR0xfU1VQUE9SVChOVl9SRUdJU1RFUl9DT01CSU5FUlMpKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xGaW5hbENvbWJpbmVySW5wdXROVihHTF9WQVJJQUJMRV9CX05WLCBHTF9TUEFSRTBfTlYsIEdMX1VOU0lHTkVEX0lERU5USVRZX05WLCBHTF9SR0IpKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRmluYWxDb21iaW5lcklucHV0TlYoKSIpOwogICAgICAgIH0KICAgIH0KCiAgICBUUkFDRSgiKCVwKSA6IERpZmZ1c2UgKCVmLCVmLCVmLCVmKVxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgc3RhdGVibG9jay0+bWF0ZXJpYWwuRGlmZnVzZS5yLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5EaWZmdXNlLmcsCiAgICAgICAgICBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5EaWZmdXNlLmIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLkRpZmZ1c2UuYSk7CiAgICBUUkFDRSgiKCVwKSA6IEFtYmllbnQgKCVmLCVmLCVmLCVmKVxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgc3RhdGVibG9jay0+bWF0ZXJpYWwuQW1iaWVudC5yLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5BbWJpZW50LmcsCiAgICAgICAgICBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5BbWJpZW50LmIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLkFtYmllbnQuYSk7CiAgICBUUkFDRSgiKCVwKSA6IFNwZWN1bGFyICglZiwlZiwlZiwlZilcbiIsIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIHN0YXRlYmxvY2stPm1hdGVyaWFsLlNwZWN1bGFyLnIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLlNwZWN1bGFyLmcsCiAgICAgICAgICBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5TcGVjdWxhci5iLCBzdGF0ZWJsb2NrLT5tYXRlcmlhbC5TcGVjdWxhci5hKTsKICAgIFRSQUNFKCIoJXApIDogRW1pc3NpdmUgKCVmLCVmLCVmLCVmKVxuIiwgc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgc3RhdGVibG9jay0+bWF0ZXJpYWwuRW1pc3NpdmUuciwgc3RhdGVibG9jay0+bWF0ZXJpYWwuRW1pc3NpdmUuZywKICAgICAgICAgIHN0YXRlYmxvY2stPm1hdGVyaWFsLkVtaXNzaXZlLmIsIHN0YXRlYmxvY2stPm1hdGVyaWFsLkVtaXNzaXZlLmEpOwoKICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVCwgKGZsb2F0KikgJnN0YXRlYmxvY2stPm1hdGVyaWFsLkFtYmllbnQpOwogICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdihHTF9BTUJJRU5UKSIpOwogICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFLCAoZmxvYXQqKSAmc3RhdGVibG9jay0+bWF0ZXJpYWwuRGlmZnVzZSk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2KEdMX0RJRkZVU0UpIik7CiAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0VNSVNTSU9OLCAoZmxvYXQqKSAmc3RhdGVibG9jay0+bWF0ZXJpYWwuRW1pc3NpdmUpOwogICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdihHTF9FTUlTU0lPTikiKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfdGV4ZmFjdG9yKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5zaWduZWQgaW50IGk7CgogICAgLyogTm90ZSB0aGUgdGV4dHVyZSBjb2xvciBhcHBsaWVzIHRvIGFsbCB0ZXh0dXJlcyB3aGVyZWFzCiAgICAgKiBHTF9URVhUVVJFX0VOVl9DT0xPUiBhcHBsaWVzIHRvIGFjdGl2ZSBvbmx5CiAgICAgKi8KICAgIGZsb2F0IGNvbFs0XTsKICAgIEQzRENPTE9SVE9HTEZMT0FUNChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfVEVYVFVSRUZBQ1RPUl0sIGNvbCk7CgogICAgaWYgKCFHTF9TVVBQT1JUKE5WX1JFR0lTVEVSX0NPTUJJTkVSUykpIHsKICAgICAgICAvKiBBbmQgbm93IHRoZSBkZWZhdWx0IHRleHR1cmUgY29sb3IgYXMgd2VsbCAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBHTF9MSU1JVFModGV4dHVyZV9zdGFnZXMpOyBpKyspIHsKICAgICAgICAgICAgLyogTm90ZSB0aGUgV0lORUQzRFJTIHZhbHVlIGFwcGxpZXMgdG8gYWxsIHRleHR1cmVzLCBidXQgR0wgaGFzIG9uZQogICAgICAgICAgICAgKiBwZXIgdGV4dHVyZSwgc28gYXBwbHkgaXQgbm93IHJlYWR5IHRvIGJlIHVzZWQhCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgaSkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGk+MCkgewogICAgICAgICAgICAgICAgRklYTUUoIlByb2dyYW0gdXNpbmcgbXVsdGlwbGUgY29uY3VycmVudCB0ZXh0dXJlcyB3aGljaCB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnRcbiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnbFRleEVudmZ2KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9DT0xPUiwgJmNvbFswXSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmZ2KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9DT0xPUiwgY29sb3IpOyIpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyUGFyYW1ldGVyZnZOVihHTF9DT05TVEFOVF9DT0xPUjBfTlYsICZjb2xbMF0pKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKcmVuZGVyc3RhdGVfc3RlbmNpbF90d29zaWRlZChJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBHTGludCBmYWNlLCBHTGludCBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrLCBHTGludCBzdGVuY2lsRmFpbCwgR0xpbnQgZGVwdGhGYWlsLCBHTGludCBzdGVuY2lsUGFzcyApIHsKICAgIGdsRW5hYmxlKEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQpOwogICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQpIik7CiAgICBHTF9FWFRDQUxMKGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQoZmFjZSkpOwogICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlU3RlbmNpbEZhY2VFWFQoLi4uKSIpOwogICAgZ2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOwogICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbEZ1bmMoLi4uKSIpOwogICAgZ2xTdGVuY2lsT3Aoc3RlbmNpbEZhaWwsIGRlcHRoRmFpbCwgc3RlbmNpbFBhc3MpOwogICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbE9wKC4uLikiKTsKfQoKc3RhdGljIHZvaWQKc3RhdGVfc3RlbmNpbChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIG9uZXNpZGVkX2VuYWJsZSA9IEZBTFNFOwogICAgRFdPUkQgdHdvc2lkZWRfZW5hYmxlID0gRkFMU0U7CiAgICBHTGludCBmdW5jID0gR0xfQUxXQVlTOwogICAgR0xpbnQgZnVuY19jY3cgPSBHTF9BTFdBWVM7CiAgICBHTGludCByZWYgPSAwOwogICAgR0x1aW50IG1hc2sgPSAwOwogICAgR0xpbnQgc3RlbmNpbEZhaWwgPSBHTF9LRUVQOwogICAgR0xpbnQgZGVwdGhGYWlsID0gR0xfS0VFUDsKICAgIEdMaW50IHN0ZW5jaWxQYXNzID0gR0xfS0VFUDsKICAgIEdMaW50IHN0ZW5jaWxGYWlsX2NjdyA9IEdMX0tFRVA7CiAgICBHTGludCBkZXB0aEZhaWxfY2N3ID0gR0xfS0VFUDsKICAgIEdMaW50IHN0ZW5jaWxQYXNzX2NjdyA9IEdMX0tFRVA7CgogICAgLyogTm8gc3RlbmNpbCB0ZXN0IHdpdGhvdXQgYSBzdGVuY2lsIGJ1ZmZlciAqLwogICAgaWYoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RlbmNpbEJ1ZmZlclRhcmdldCA9PSBOVUxMKSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9TVEVOQ0lMX1RFU1QiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgb25lc2lkZWRfZW5hYmxlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NURU5DSUxFTkFCTEVdOwogICAgdHdvc2lkZWRfZW5hYmxlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1RXT1NJREVEU1RFTkNJTE1PREVdOwogICAgaWYoICEoIGZ1bmMgPSBDb21wYXJlRnVuYyhzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTEZVTkNdKSApICkKICAgICAgICBmdW5jID0gR0xfQUxXQVlTOwogICAgaWYoICEoIGZ1bmNfY2N3ID0gQ29tcGFyZUZ1bmMoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NDV19TVEVOQ0lMRlVOQ10pICkgKQogICAgICAgIGZ1bmNfY2N3ID0gR0xfQUxXQVlTOwogICAgcmVmID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NURU5DSUxSRUZdOwogICAgbWFzayA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVEVOQ0lMTUFTS107CiAgICBzdGVuY2lsRmFpbCA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTEZBSUxdKTsKICAgIGRlcHRoRmFpbCA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTFpGQUlMXSk7CiAgICBzdGVuY2lsUGFzcyA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RFTkNJTFBBU1NdKTsKICAgIHN0ZW5jaWxGYWlsX2NjdyA9IFN0ZW5jaWxPcChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ0NXX1NURU5DSUxGQUlMXSk7CiAgICBkZXB0aEZhaWxfY2N3ID0gU3RlbmNpbE9wKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DQ1dfU1RFTkNJTFpGQUlMXSk7CiAgICBzdGVuY2lsUGFzc19jY3cgPSBTdGVuY2lsT3Aoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NDV19TVEVOQ0lMUEFTU10pOwoKICAgIFRSQUNFKCIob25lc2lkZWQgJWQsIHR3b3NpZGVkICVkLCByZWYgJXgsIG1hc2sgJXgsICIKICAgICAgICAgICJHTF9GUk9OVDogZnVuYzogJXgsIGZhaWwgJXgsIHpmYWlsICV4LCB6cGFzcyAleCAiCiAgICAgICAgICAiR0xfQkFDSzogZnVuYzogJXgsIGZhaWwgJXgsIHpmYWlsICV4LCB6cGFzcyAleCApXG4iLAogICAgb25lc2lkZWRfZW5hYmxlLCB0d29zaWRlZF9lbmFibGUsIHJlZiwgbWFzaywKICAgIGZ1bmMsIHN0ZW5jaWxGYWlsLCBkZXB0aEZhaWwsIHN0ZW5jaWxQYXNzLAogICAgZnVuY19jY3csIHN0ZW5jaWxGYWlsX2NjdywgZGVwdGhGYWlsX2Njdywgc3RlbmNpbFBhc3NfY2N3KTsKCiAgICBpZiAodHdvc2lkZWRfZW5hYmxlICYmIG9uZXNpZGVkX2VuYWJsZSkgewogICAgICAgIGdsRW5hYmxlKEdMX1NURU5DSUxfVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIEdMX1NURU5DSUxfVEVTVCIpOwoKICAgICAgICBpZihHTF9TVVBQT1JUKEVYVF9TVEVOQ0lMX1RXT19TSURFKSkgewogICAgICAgICAgICAvKiBBcHBseSBiYWNrIGZpcnN0LCB0aGVuIGZyb250LiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQsCiAgICAgICAgICAgICAqIHdoaWNoIGhhcyBhbiBlZmZlY3Qgb24gdGhlIGNvZGUgYmVsb3cgdG9vLiBJZiB3ZSBhcHBseSB0aGUgZnJvbnQgZmFjZQogICAgICAgICAgICAgKiBhZnRlcndhcmRzLCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhY3RpdmUgc3RlbmNpbCBmYWNlIGlzIHNldCB0byBmcm9udCwKICAgICAgICAgICAgICogYW5kIG90aGVyIHN0ZW5jaWwgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCB1c2UgdHdvIHNpZGVkIHN0ZW5jaWwgZG8gbm90IGhhdmUKICAgICAgICAgICAgICogdG8gc2V0IGl0IGJhY2sKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlbmRlcnN0YXRlX3N0ZW5jaWxfdHdvc2lkZWQoc3RhdGVibG9jaywgR0xfQkFDSywgZnVuY19jY3csIHJlZiwgbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVuY2lsRmFpbF9jY3csIGRlcHRoRmFpbF9jY3csIHN0ZW5jaWxQYXNzX2Njdyk7CiAgICAgICAgICAgIHJlbmRlcnN0YXRlX3N0ZW5jaWxfdHdvc2lkZWQoc3RhdGVibG9jaywgR0xfRlJPTlQsIGZ1bmMsIHJlZiwgbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVuY2lsRmFpbCwgZGVwdGhGYWlsLCBzdGVuY2lsUGFzcyk7CiAgICAgICAgfSBlbHNlIGlmKEdMX1NVUFBPUlQoQVRJX1NFUEFSQVRFX1NURU5DSUwpKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xTdGVuY2lsRnVuY1NlcGFyYXRlQVRJKGZ1bmMsIGZ1bmNfY2N3LCByZWYsIG1hc2spKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbEZ1bmNTZXBhcmF0ZUFUSSguLi4pIik7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xTdGVuY2lsT3BTZXBhcmF0ZUFUSShHTF9GUk9OVCwgc3RlbmNpbEZhaWwsIGRlcHRoRmFpbCwgc3RlbmNpbFBhc3MpKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbE9wU2VwYXJhdGVBVEkoR0xfRlJPTlQsIC4uLikiKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJKEdMX0JBQ0ssIHN0ZW5jaWxGYWlsX2NjdywgZGVwdGhGYWlsX2Njdywgc3RlbmNpbFBhc3NfY2N3KSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJKEdMX0JBQ0ssIC4uLikiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBFUlIoIlNlcGFyYXRlICh0d28gc2lkZWQpIHN0ZW5jaWwgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHZlcnNpb24gb2Ygb3BlbmdsLiBDYXBzIHdlcmVuJ3QgaG9ub3JlZD9cbiIpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZihvbmVzaWRlZF9lbmFibGUpIHsKICAgICAgICBpZihHTF9TVVBQT1JUKEVYVF9TVEVOQ0lMX1RXT19TSURFKSkgewogICAgICAgICAgICBnbERpc2FibGUoR0xfU1RFTkNJTF9URVNUX1RXT19TSURFX0VYVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfU1RFTkNJTF9URVNUX1RXT19TSURFX0VYVCkiKTsKICAgICAgICB9CgogICAgICAgIC8qIFRoaXMgY29kZSBkaXNhYmxlcyB0aGUgQVRJIGV4dGVuc2lvbiBhcyB3ZWxsLCBzaW5jZSB0aGUgc3RhbmRhcmQgc3RlbmNpbCBmdW5jdGlvbnMgYXJlIGVxdWFsCiAgICAgICAgICogdG8gY2FsbGluZyB0aGUgQVRJIGZ1bmN0aW9ucyB3aXRoIEdMX0ZST05UX0FORF9CQUNLIGFzIGZhY2UgcGFyYW1ldGVyCiAgICAgICAgICovCiAgICAgICAgZ2xFbmFibGUoR0xfU1RFTkNJTF9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfU1RFTkNJTF9URVNUIik7CiAgICAgICAgZ2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFN0ZW5jaWxGdW5jKC4uLikiKTsKICAgICAgICBnbFN0ZW5jaWxPcChzdGVuY2lsRmFpbCwgZGVwdGhGYWlsLCBzdGVuY2lsUGFzcyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsU3RlbmNpbE9wKC4uLikiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9TVEVOQ0lMX1RFU1QiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfc3RlbmNpbHdyaXRlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgbWFzazsKCiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdGVuY2lsQnVmZmVyVGFyZ2V0KSB7CiAgICAgICAgbWFzayA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVEVOQ0lMV1JJVEVNQVNLXTsKICAgIH0gZWxzZSB7CiAgICAgICAgbWFzayA9IDA7CiAgICB9CgogICAgaWYoR0xfU1VQUE9SVChFWFRfU1RFTkNJTF9UV09fU0lERSkpIHsKICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQoR0xfQkFDSykpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKEdMX0JBQ0spIik7CiAgICAgICAgZ2xTdGVuY2lsTWFzayhtYXNrKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xTdGVuY2lsTWFzayIpOwogICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVTdGVuY2lsRmFjZUVYVChHTF9GUk9OVCkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKEdMX0ZST05UKSIpOwogICAgICAgIGdsU3RlbmNpbE1hc2sobWFzayk7CiAgICB9IGVsc2UgewogICAgICAgIGdsU3RlbmNpbE1hc2sobWFzayk7CiAgICB9CiAgICBjaGVja0dMY2FsbCgiZ2xTdGVuY2lsTWFzayIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9mb2coRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBUT0RPOiBQdXQgdGhpcyBpbnRvIHRoZSB2ZXJ0ZXggdHlwZSBibG9jayBvbmNlIHRoYXQgaXMgaW4gdGhlIHN0YXRlIHRhYmxlICovCiAgICBCT09MIGZvZ2VuYWJsZSA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dFTkFCTEVdOwogICAgQk9PTCBpc19wczMgPSB1c2VfcHMoc3RhdGVibG9jay0+d2luZUQzRERldmljZSkKICAgICAgICAgICAgICAgICAgJiYgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKXN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKS0+YmFzZVNoYWRlci5oZXhfdmVyc2lvbiA+PSBXSU5FRDNEUFNfVkVSU0lPTigzLDApOwogICAgZmxvYXQgZm9nc3RhcnQsIGZvZ2VuZDsKCiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSB0bXB2YWx1ZTsKCiAgICBpZiAoIWZvZ2VuYWJsZSkgewogICAgICAgIC8qIE5vIGZvZz8gRGlzYWJsZSBpdCwgYW5kIHdlJ3JlIGRvbmUgOi0pICovCiAgICAgICAgZ2xEaXNhYmxlKEdMX0ZPRyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9GT0ciKTsKICAgICAgICBpZiggdXNlX3BzKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UpCiAgICAgICAgICAgICAgICAmJiAoKElXaW5lRDNEUGl4ZWxTaGFkZXJJbXBsICopc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIpLT5iYXNlU2hhZGVyLmhleF92ZXJzaW9uIDwgV0lORUQzRFBTX1ZFUlNJT04oMywwKSApIHsKICAgICAgICAgICAgLyogZGlzYWJsZSBmb2cgaW4gdGhlIHBpeGVsIHNoYWRlcgogICAgICAgICAgICAgKiBOT1RFOiBGb3IgcGl4ZWwgc2hhZGVyLCBHTF9GT0dfU1RBUlQgYW5kIEdMX0ZPR19FTkQgZG9uJ3QgaG9sZCBmb2cgc3RhcnQgcyBhbmQgZW5kIGUgYnV0CiAgICAgICAgICAgICAqIC0xLyhlLXMpIGFuZCBlLyhlLXMpIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfU1RBUlQsIDAuMGYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19TVEFSVCwgZm9nc3RhcnQpIik7CiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfRU5ELCAxLjBmKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9nZihHTF9GT0dfRU5ELCBmb2dlbmQpIik7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1NUQVJUXTsKICAgIGZvZ3N0YXJ0ID0gdG1wdmFsdWUuZjsKICAgIHRtcHZhbHVlLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HRU5EXTsKICAgIGZvZ2VuZCA9IHRtcHZhbHVlLmY7CgogICAgLyogRm9nIFJ1bGVzOgogICAgICoKICAgICAqIFdpdGggZml4ZWQgZnVuY3Rpb24gdmVydGV4IHByb2Nlc3NpbmcsIERpcmVjdDNEIGtub3dzIDIgZGlmZmVyZW50IGZvZyBpbnB1dCBzb3VyY2VzLgogICAgICogSXQgY2FuIHVzZSB0aGUgWiB2YWx1ZSBvZiB0aGUgdmVydGV4LCBvciB0aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBzcGVjdWxhciBjb2xvci4KICAgICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgZm9nIHZlcnRleCwgZm9nIHRhYmxlIGFuZCB0aGUgdmVydGV4IGRlY2xhcmF0aW9uLiBJZiB0aGUgWiB2YWx1ZQogICAgICogaXMgdXNlZCwgZm9nc3RhcnQsIGZvZ2VuZCBhbmQgdGhlIGVxdWF0aW9uIHR5cGUgYXJlIHVzZWQsIG90aGVyd2lzZSBsaW5lYXIgZm9nIHdpdGgKICAgICAqIHN0YXJ0ID0gMjU1LCBlbmQgPSAwIGlzIHVzZWQuIE9idmlvdXNseSB0aGUgbXNkbiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGF0LgogICAgICoKICAgICAqIEZPR1RBQkxFTU9ERSAhPSBOT05FOgogICAgICogIFRoZSBaIHZhbHVlIGlzIHVzZWQsIHdpdGggdGhlIGVxdWF0aW9uIHNwZWNpZmllZCwgbm8gbWF0dGVyIHdoYXQgdmVydGV4IHR5cGUuCiAgICAgKgogICAgICogRk9HVEFCTEVNT0RFID09IE5PTkUsIEZPR1ZFUlRFWE1PREUgIT0gTk9ORSwgdW50cmFuc2Zvcm1lZDoKICAgICAqICBQZXIgdmVydGV4IGZvZyBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZm9nIGVxdWF0aW9uIGFuZCB0aGUgcGFyYW1ldGVycwogICAgICoKICAgICAqIEZPR1RBQkxFTU9ERSA9PSBOT05FLCBGT0dWRVJURVhNT0RFICE9IE5PTkUsIHRyYW5zZm9ybWVkLCBPUgogICAgICogRk9HVEFCTEVNT0RFID09IE5PTkUsIEZPR1ZFUlRFWE1PREUgPT0gTk9ORSwgdW50cmFuc2Zvcm1lZDoKICAgICAqICBMaW5lYXIgZm9nIHdpdGggc3RhcnQgPSAyNTUuMCwgZW5kID0gMC4wLCBpbnB1dCBjb21lcyBmcm9tIHRoZSBzcGVjdWxhciBjb2xvcgogICAgICoKICAgICAqCiAgICAgKiBSdWxlcyBmb3IgdmVydGV4IGZvZyB3aXRoIHNoYWRlcnM6CiAgICAgKgogICAgICogV2hlbiBtaXhpbmcgZml4ZWQgZnVuY3Rpb24gZnVuY3Rpb25hbGl0eSB3aXRoIHRoZSBwcm9ncmFtbWFibGUgcGlwZWxpbmUsIEQzRCBleHBlY3RzCiAgICAgKiB0aGUgZm9nIGNvbXB1dGF0aW9uIHRvIGhhcHBlbiBkdXJpbmcgdHJhbnNmb3JtYXRpb24gd2hpbGUgb3BlbkdMIGV4cGVjdHMgaXQgdG8gaGFwcGVuCiAgICAgKiBkdXJpbmcgcmFzdGVyaXphdGlvbi4gQWxzbywgcHJpb3IgdG8gcGl4ZWwgc2hhZGVyIDMuMCBEM0QgaGFuZGxlcyBmb2cgYmxlbmRpbmcgYWZ0ZXIKICAgICAqIHRoZSBwaXhlbCBzaGFkZXIgd2hpbGUgb3BlbkdMIGFsd2F5cyBleHBlY3RzIHRoZSBwaXhlbCBzaGFkZXIgdG8gaGFuZGxlIHRoZSBibGVuZGluZy4KICAgICAqIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgV2luZUQzRCBkb2VzOgogICAgICogMSkgaW1wbGVtZW50IGEgbGluZWFyIGZvZyBlcXVhdGlvbiBhbmQgZm9nIGJsZW5kaW5nIGF0IHRoZSBlbmQgb2YgZXZlcnkgcHJlIDMuMCBwaXhlbAogICAgICogc2hhZGVyLAogICAgICogYW5kIDIpIGRpc2FibGVzIHRoZSBmb2cgY29tcHV0YXRpb24gKGluIGVpdGhlciB0aGUgZml4ZWQgZnVuY3Rpb24gb3IgcHJvZ3JhbW1hYmxlCiAgICAgKiByYXN0ZXJpemVyKSBpZiB1c2luZyBhIHZlcnRleCBwcm9ncmFtLgogICAgICoKICAgICAqCiAgICAgKiBJZiBhIGZvZ3RhYmxlbW9kZSBhbmQgYSBmb2d2ZXJ0ZXhtb2RlIGFyZSBzcGVjaWZpZWQsIHRhYmxlIGZvZyBpcyBhcHBsaWVkICh3aXRoIG9yCiAgICAgKiB3aXRob3V0IHNoYWRlcnMpLgogICAgICovCgogICAgaWYoIGlzX3BzMyApIHsKICAgICAgICBpZiggIXVzZV92cyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKQogICAgICAgICAgICAgICAgJiYgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1RBQkxFTU9ERV0gPT0gV0lORUQzREZPR19OT05FICkgewogICAgICAgICAgICBGSVhNRSgiSW1wbGVtZW50IHZlcnRleCBmb2cgZm9yIHBpeGVsIHNoYWRlciA+PSAzLjAgYW5kIGZpeGVkIGZ1bmN0aW9uIHBpcGVsaW5lXG4iKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVzZV92cyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKQogICAgICAgICAgICAmJiAoKElXaW5lRDNEVmVydGV4U2hhZGVySW1wbCAqKXN0YXRlYmxvY2stPnZlcnRleFNoYWRlciktPmJhc2VTaGFkZXIucmVnX21hcHMuZm9nKSB7CiAgICAgICAgaWYoIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dUQUJMRU1PREVdICE9IFdJTkVEM0RGT0dfTk9ORSApIHsKICAgICAgICAgICAgaWYoIWlzX3BzMykgRklYTUUoIkltcGxlbWVudCB0YWJsZSBmb2cgZm9yIGZvZ2d5IHZlcnRleCBzaGFkZXJcbiIpOwogICAgICAgICAgICAvKiBEaXNhYmxlIGZvZyAqLwogICAgICAgICAgICBmb2dlbmFibGUgPSBGQUxTRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBTZXQgZm9nIGNvbXB1dGF0aW9uIGluIHRoZSByYXN0ZXJpemVyIHRvIHBhc3MgdGhyb3VnaCB0aGUgdmFsdWUgKGp1c3QgYmxlbmQgaXQpICovCiAgICAgICAgICAgIGdsRm9naShHTF9GT0dfTU9ERSwgR0xfTElORUFSKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfTU9ERSwgR0xfTElORUFSKSIpOwogICAgICAgICAgICBmb2dzdGFydCA9IDEuMDsKICAgICAgICAgICAgZm9nZW5kID0gMC4wOwogICAgICAgIH0KCiAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKSIpOwogICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfZm9nZ3lfc2hhZGVyID0gVFJVRTsKICAgIH0KICAgIGVsc2UgaWYoIHVzZV9wcyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKSApIHsKICAgICAgICAvKiBOT1RFOiBGb3IgcGl4ZWwgc2hhZGVyLCBHTF9GT0dfU1RBUlQgYW5kIEdMX0ZPR19FTkQgZG9uJ3QgaG9sZCBmb2cgc3RhcnQgcyBhbmQgZW5kIGUgYnV0CiAgICAgICAgICogLTEvKGUtcykgYW5kIGUvKGUtcykgcmVzcGVjdGl2ZWx5IHRvIHNpbXBsaWZ5IGZvZyBjb21wdXRhdGlvbiBpbiB0aGUgc2hhZGVyLgogICAgICAgICAqLwogICAgICAgIFdJTkVEM0RGT0dNT0RFIG1vZGU7CiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfZm9nZ3lfc2hhZGVyID0gRkFMU0U7CgogICAgICAgIC8qIElmIGJvdGggZm9nbW9kZXMgYXJlIHNldCB1c2UgdGhlIHRhYmxlIGZvZyBtb2RlICovCiAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1RBQkxFTU9ERV0gPT0gV0lORUQzREZPR19OT05FKQogICAgICAgICAgICBtb2RlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR1ZFUlRFWE1PREVdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbW9kZSA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dUQUJMRU1PREVdOwoKICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDI6CiAgICAgICAgICAgICAgICBpZighaXNfcHMzKSBGSVhNRSgiSW1wbGVtZW50IG5vbiBsaW5lYXIgZm9nIGZvciBwaXhlbCBzaGFkZXIgPCAzLjBcbiIpOwogICAgICAgICAgICAgICAgLyogRGlzYWJsZSBmb2cgKi8KICAgICAgICAgICAgICAgIGZvZ2VuYWJsZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfTElORUFSOgogICAgICAgICAgICAgICAgZm9nc3RhcnQgPSAtMS4wZi8oZm9nZW5kLWZvZ3N0YXJ0KTsKICAgICAgICAgICAgICAgIGZvZ2VuZCAqPSAtZm9nc3RhcnQ7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzREZPR19OT05FOgogICAgICAgICAgICAgICAgaWYoIWlzX3BzMykgRklYTUUoIkltcGxlbWVudCBzb2Z0d2FyZSB2ZXJ0ZXggZm9nIGZvciBwaXhlbCBzaGFkZXIgPCAzLjBcbiIpOwogICAgICAgICAgICAgICAgLyogRGlzYWJsZSBmb2cgKi8KICAgICAgICAgICAgICAgIGZvZ2VuYWJsZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IEZJWE1FKCJVbmV4cGVjdGVkIFdJTkVEM0RSU19GT0dWRVJURVhNT0RFICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERV0pOwogICAgICAgIH0KCiAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKSIpOwogICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICB9CiAgICB9CiAgICAvKiBEWCA3IHNkazogIklmIGJvdGggcmVuZGVyIHN0YXRlcyh2ZXJ0ZXggYW5kIHRhYmxlIGZvZykgYXJlIHNldCB0byB2YWxpZCBtb2RlcywKICAgICAqIHRoZSBzeXN0ZW0gd2lsbCBhcHBseSBvbmx5IHBpeGVsKD10YWJsZSkgZm9nIGVmZmVjdHMuIgogICAgICovCiAgICBlbHNlIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dUQUJMRU1PREVdID09IFdJTkVEM0RGT0dfTk9ORSkgewogICAgICAgIGdsSGludChHTF9GT0dfSElOVCwgR0xfRkFTVEVTVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsSGludChHTF9GT0dfSElOVCwgR0xfRkFTVEVTVCkiKTsKICAgICAgICBjb250ZXh0LT5sYXN0X3dhc19mb2dneV9zaGFkZXIgPSBGQUxTRTsKCiAgICAgICAgc3dpdGNoIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERV0pIHsKICAgICAgICAgICAgLyogSWYgcHJvY2Vzc2VkIHZlcnRpY2VzIGFyZSB1c2VkLCBmYWxsIHRocm91Z2ggdG8gdGhlIE5PTkUgY2FzZSAqLwogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfRVhQOiAgewogICAgICAgICAgICAgICAgaWYoIWNvbnRleHQtPmxhc3Rfd2FzX3JodykgewogICAgICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfTU9ERSwgR0xfRVhQKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFApIik7CiAgICAgICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKSIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDI6IHsKICAgICAgICAgICAgICAgIGlmKCFjb250ZXh0LT5sYXN0X3dhc19yaHcpIHsKICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUDIpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUDIpIik7CiAgICAgICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKSIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0xJTkVBUjogewogICAgICAgICAgICAgICAgaWYoIWNvbnRleHQtPmxhc3Rfd2FzX3JodykgewogICAgICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfTU9ERSwgR0xfTElORUFSKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9MSU5FQVIpIik7CiAgICAgICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKSIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX05PTkU6IHsKICAgICAgICAgICAgICAgIC8qIEJvdGggYXJlIG5vbmU/IEFjY29yZGluZyB0byBtc2RuIHRoZSBhbHBoYSBjaGFubmVsIG9mIHRoZSBzcGVjdWxhcgogICAgICAgICAgICAgICAgICogY29sb3IgY29udGFpbnMgYSBmb2cgZmFjdG9yLiBTZXQgaXQgaW4gZHJhd1N0cmlkZWRTbG93LgogICAgICAgICAgICAgICAgICogU2FtZSBoYXBwZW5zIHdpdGggVmVydGV4Zm9nIG9uIHRyYW5zZm9ybWVkIHZlcnRpY2VzCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX0ZPR19DT09SRCkpIHsKICAgICAgICAgICAgICAgICAgICBpZihjb250ZXh0LT5mb2dfY29vcmQgPT0gRkFMU0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZPR19DT09SRElOQVRFX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRk9HX0NPT1JESU5BVEVfRVhUKSIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUik7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfTU9ERSwgR0xfTElORUFSKSIpOwogICAgICAgICAgICAgICAgICAgIGZvZ3N0YXJ0ID0gMHhmZjsKICAgICAgICAgICAgICAgICAgICBmb2dlbmQgPSAweDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgR0wgZm9nLCBoYW5kbGUgdGhpcyBpbiBzb2Z0d2FyZSBpbiBkcmF3U3RyaWRlZFNsb3cgKi8KICAgICAgICAgICAgICAgICAgICBmb2dlbmFibGUgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQ6IEZJWE1FKCJVbmV4cGVjdGVkIFdJTkVEM0RSU19GT0dWRVJURVhNT0RFICVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERV0pOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZ2xIaW50KEdMX0ZPR19ISU5ULCBHTF9OSUNFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEhpbnQoR0xfRk9HX0hJTlQsIEdMX05JQ0VTVCkiKTsKICAgICAgICBjb250ZXh0LT5sYXN0X3dhc19mb2dneV9zaGFkZXIgPSBGQUxTRTsKCiAgICAgICAgc3dpdGNoIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HVEFCTEVNT0RFXSkgewogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfRVhQOgogICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9FWFApOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfTU9ERSwgR0xfRVhQKSIpOwogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSAmJiBjb250ZXh0LT5mb2dfY29vcmQpIHsKICAgICAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCkiKTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5mb2dfY29vcmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk9HX0VYUDI6CiAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0VYUDIpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfTU9ERSwgR0xfRVhQMikiKTsKICAgICAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoRVhUX0ZPR19DT09SRCkgJiYgY29udGV4dC0+Zm9nX2Nvb3JkKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRV9FWFQsIEdMX0ZSQUdNRU5UX0RFUFRIX0VYVCk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQpIik7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+Zm9nX2Nvb3JkID0gRkFMU0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzREZPR19MSU5FQVI6CiAgICAgICAgICAgICAgICBnbEZvZ2koR0xfRk9HX01PREUsIEdMX0xJTkVBUik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19NT0RFLCBHTF9MSU5FQVIpIik7CiAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKEVYVF9GT0dfQ09PUkQpICYmIGNvbnRleHQtPmZvZ19jb29yZCkgewogICAgICAgICAgICAgICAgICAgIGdsRm9naShHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhULCBHTF9GUkFHTUVOVF9ERVBUSF9FWFQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFX0VYVCwgR0xfRlJBR01FTlRfREVQVEhfRVhUKSIpOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmZvZ19jb29yZCA9IEZBTFNFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGT0dfTk9ORTogICAvKiBXb24ndCBoYXBwZW4gKi8KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEZJWE1FKCJVbmV4cGVjdGVkIFdJTkVEM0RSU19GT0dUQUJMRU1PREUgJWRcbiIsIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19GT0dUQUJMRU1PREVdKTsKICAgICAgICB9CiAgICB9CgogICAgaWYoZm9nZW5hYmxlKSB7CiAgICAgICAgZ2xFbmFibGUoR0xfRk9HKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfRk9HIik7CgogICAgICAgIGlmKGZvZ3N0YXJ0ICE9IGZvZ2VuZCkKICAgICAgICB7CiAgICAgICAgICAgIGdsRm9nZnYoR0xfRk9HX1NUQVJULCAmZm9nc3RhcnQpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19TVEFSVCwgZm9nc3RhcnQpIik7CiAgICAgICAgICAgIFRSQUNFKCJGb2cgU3RhcnQgPT0gJWZcbiIsIGZvZ3N0YXJ0KTsKCiAgICAgICAgICAgIGdsRm9nZnYoR0xfRk9HX0VORCwgJmZvZ2VuZCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2YoR0xfRk9HX0VORCwgZm9nZW5kKSIpOwogICAgICAgICAgICBUUkFDRSgiRm9nIEVuZCA9PSAlZlxuIiwgZm9nZW5kKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgZ2xGb2dmKEdMX0ZPR19TVEFSVCwgLTEuMCAvIDAuMCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2YoR0xfRk9HX1NUQVJULCBmb2dzdGFydCkiKTsKICAgICAgICAgICAgVFJBQ0UoIkZvZyBTdGFydCA9PSAlZlxuIiwgZm9nc3RhcnQpOwoKICAgICAgICAgICAgZ2xGb2dmKEdMX0ZPR19FTkQsIDAuMCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2YoR0xfRk9HX0VORCwgZm9nZW5kKSIpOwogICAgICAgICAgICBUUkFDRSgiRm9nIEVuZCA9PSAlZlxuIiwgZm9nZW5kKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9GT0cpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfRk9HIik7CiAgICAgICAgaWYoIHVzZV9wcyhzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlKSApIHsKICAgICAgICAgICAgLyogZGlzYWJsZSBmb2cgaW4gdGhlIHBpeGVsIHNoYWRlcgogICAgICAgICAgICAgKiBOT1RFOiBGb3IgcGl4ZWwgc2hhZGVyLCBHTF9GT0dfU1RBUlQgYW5kIEdMX0ZPR19FTkQgZG9uJ3QgaG9sZCBmb2cgc3RhcnQgcyBhbmQgZW5kIGUgYnV0CiAgICAgICAgICAgICAqIC0xLyhlLXMpIGFuZCBlLyhlLXMpIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfU1RBUlQsIDAuMGYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dmKEdMX0ZPR19TVEFSVCwgZm9nc3RhcnQpIik7CiAgICAgICAgICAgIGdsRm9nZihHTF9GT0dfRU5ELCAxLjBmKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRm9nZihHTF9GT0dfRU5ELCBmb2dlbmQpIik7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9yYW5nZWZvZyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19SQU5HRUZPR0VOQUJMRV0pIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChOVl9GT0dfRElTVEFOQ0UpKSB7CiAgICAgICAgICAgIGdsRm9naShHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViwgR0xfRVlFX1JBRElBTF9OVik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEZvZ2koR0xfRk9HX0RJU1RBTkNFX01PREVfTlYsIEdMX0VZRV9SQURJQUxfTlYpIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgV0FSTigiUmFuZ2UgZm9nIGVuYWJsZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgb3BlbmdsIGltcGxlbWVudGF0aW9uXG4iKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX0ZPR19ESVNUQU5DRSkpIHsKICAgICAgICAgICAgZ2xGb2dpKEdMX0ZPR19ESVNUQU5DRV9NT0RFX05WLCBHTF9FWUVfUExBTkVfQUJTT0xVVEVfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xGb2dpKEdMX0ZPR19ESVNUQU5DRV9NT0RFX05WLCBHTF9FWUVfUExBTkVfQUJTT0xVVEVfTlYpIik7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9mb2djb2xvcihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGZsb2F0IGNvbFs0XTsKICAgIEQzRENPTE9SVE9HTEZMT0FUNChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRk9HQ09MT1JdLCBjb2wpOwogICAgZ2xGb2dmdihHTF9GT0dfQ09MT1IsICZjb2xbMF0pOwogICAgY2hlY2tHTGNhbGwoImdsRm9nIEdMX0ZPR19DT0xPUiIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9mb2dkZW5zaXR5KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CiAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZPR0RFTlNJVFldOwogICAgZ2xGb2dmdihHTF9GT0dfREVOU0lUWSwgJnRtcHZhbHVlLmYpOwogICAgY2hlY2tHTGNhbGwoImdsRm9nZihHTF9GT0dfREVOU0lUWSwgKGZsb2F0KSBWYWx1ZSkiKTsKfQoKLyogVE9ETzogTWVyZ2Ugd2l0aCBwcmltaXRpdmUgdHlwZSArIGluaXRfbWF0ZXJpYWxzKCkhISAqLwpzdGF0aWMgdm9pZCBzdGF0ZV9jb2xvcm1hdChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2aWNlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZTsKICAgIEdMZW51bSBQYXJtID0gMDsKICAgIFdpbmVEaXJlY3QzRFN0cmlkZWREYXRhICpkaWZmdXNlID0gJmRldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy5kaWZmdXNlOwogICAgQk9PTCBpc0RpZmZ1c2VTdXBwbGllZDsKCiAgICAvKiBEZXBlbmRzIG9uIHRoZSBkZWNvZGVkIHZlcnRleCBkZWNsYXJhdGlvbiB0byByZWFkIHRoZSBleGlzdGVuY2Ugb2YgZGlmZnVzZSBkYXRhLgogICAgICogVGhlIHZlcnRleCBkZWNsYXJhdGlvbiB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGUgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgaXMgdXNlZC4KICAgICAqLwoKICAgIGlmKGlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WREVDTCkpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaXNEaWZmdXNlU3VwcGxpZWQgPSBkaWZmdXNlLT5scERhdGEgfHwgZGlmZnVzZS0+VkJPOwoKICAgIGNvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzID0gMDsKICAgIGlmIChpc0RpZmZ1c2VTdXBwbGllZCAmJiBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JWRVJURVhdKSB7CiAgICAgICAgVFJBQ0UoImRpZmYgJWQsIGFtYiAlZCwgZW1pcyAlZCwgc3BlYyAlZFxuIiwKICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRElGRlVTRU1BVEVSSUFMU09VUkNFXSwKICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFXSwKICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRV0sCiAgICAgICAgICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0VdKTsKCiAgICAgICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19ESUZGVVNFTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICAgICAgUGFybSA9IEdMX0FNQklFTlRfQU5EX0RJRkZVU0U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBQYXJtID0gR0xfRElGRlVTRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRV0gPT0gV0lORUQzRE1DU19DT0xPUjEpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQtPnVudHJhY2tlZF9tYXRlcmlhbHNbY29udGV4dC0+bnVtX3VudHJhY2tlZF9tYXRlcmlhbHNdID0gR0xfRU1JU1NJT047CiAgICAgICAgICAgICAgICBjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFscysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICAgICAgY29udGV4dC0+dW50cmFja2VkX21hdGVyaWFsc1tjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFsc10gPSBHTF9TUEVDVUxBUjsKICAgICAgICAgICAgICAgIGNvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0VdID09IFdJTkVEM0RNQ1NfQ09MT1IxKSB7CiAgICAgICAgICAgIFBhcm0gPSBHTF9BTUJJRU5UOwogICAgICAgICAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRV0gPT0gV0lORUQzRE1DU19DT0xPUjEpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQtPnVudHJhY2tlZF9tYXRlcmlhbHNbY29udGV4dC0+bnVtX3VudHJhY2tlZF9tYXRlcmlhbHNdID0gR0xfRU1JU1NJT047CiAgICAgICAgICAgICAgICBjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFscysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICAgICAgY29udGV4dC0+dW50cmFja2VkX21hdGVyaWFsc1tjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFsc10gPSBHTF9TUEVDVUxBUjsKICAgICAgICAgICAgICAgIGNvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICBQYXJtID0gR0xfRU1JU1NJT047CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICAgICAgY29udGV4dC0+dW50cmFja2VkX21hdGVyaWFsc1tjb250ZXh0LT5udW1fdW50cmFja2VkX21hdGVyaWFsc10gPSBHTF9TUEVDVUxBUjsKICAgICAgICAgICAgICAgIGNvbnRleHQtPm51bV91bnRyYWNrZWRfbWF0ZXJpYWxzKys7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TUEVDVUxBUk1BVEVSSUFMU09VUkNFXSA9PSBXSU5FRDNETUNTX0NPTE9SMSkgewogICAgICAgICAgICBQYXJtID0gR0xfU1BFQ1VMQVI7CiAgICAgICAgfQogICAgfQoKICAgIC8qIE5vdGhpbmcgY2hhbmdlZCwgcmV0dXJuLiAqLwogICAgaWYgKFBhcm0gPT0gY29udGV4dC0+dHJhY2tpbmdfcGFybSkgcmV0dXJuOwoKICAgIGlmKCFQYXJtKSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0NPTE9SX01BVEVSSUFMIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsQ29sb3JNYXRlcmlhbChHTF9GUk9OVF9BTkRfQkFDSywgUGFybSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQ29sb3JNYXRlcmlhbChHTF9GUk9OVF9BTkRfQkFDSywgUGFybSkiKTsKICAgICAgICBnbEVuYWJsZShHTF9DT0xPUl9NQVRFUklBTCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKSIpOwogICAgfQoKICAgIC8qIEFwcGFyZW50bHkgY2FsbHMgdG8gZ2xNYXRlcmlhbGZ2IGFyZSBpZ25vcmVkIGZvciBwcm9wZXJ0aWVzIHdlJ3JlCiAgICAgKiB0cmFja2luZyB3aXRoIGdsQ29sb3JNYXRlcmlhbCwgc28gYXBwbHkgdGhvc2UgaGVyZS4gKi8KICAgIHN3aXRjaCAoY29udGV4dC0+dHJhY2tpbmdfcGFybSkgewogICAgICAgIGNhc2UgR0xfQU1CSUVOVF9BTkRfRElGRlVTRToKICAgICAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCAoZmxvYXQqKSZkZXZpY2UtPnVwZGF0ZVN0YXRlQmxvY2stPm1hdGVyaWFsLkFtYmllbnQpOwogICAgICAgICAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIChmbG9hdCopJmRldmljZS0+dXBkYXRlU3RhdGVCbG9jay0+bWF0ZXJpYWwuRGlmZnVzZSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE1hdGVyaWFsZnYiKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgR0xfRElGRlVTRToKICAgICAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFLCAoZmxvYXQqKSZkZXZpY2UtPnVwZGF0ZVN0YXRlQmxvY2stPm1hdGVyaWFsLkRpZmZ1c2UpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEdMX0FNQklFTlQ6CiAgICAgICAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVCwgKGZsb2F0KikmZGV2aWNlLT51cGRhdGVTdGF0ZUJsb2NrLT5tYXRlcmlhbC5BbWJpZW50KTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTWF0ZXJpYWxmdiIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBHTF9FTUlTU0lPTjoKICAgICAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgKGZsb2F0KikmZGV2aWNlLT51cGRhdGVTdGF0ZUJsb2NrLT5tYXRlcmlhbC5FbWlzc2l2ZSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbE1hdGVyaWFsZnYiKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgR0xfU1BFQ1VMQVI6CiAgICAgICAgICAgIC8qIE9ubHkgY2hhbmdlIG1hdGVyaWFsIGNvbG9yIGlmIHNwZWN1bGFyIGlzIGVuYWJsZWQsIG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gYmxhY2sgKi8KICAgICAgICAgICAgaWYgKGRldmljZS0+c3RhdGVCbG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NQRUNVTEFSRU5BQkxFXSkgewogICAgICAgICAgICAgICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgKGZsb2F0KikmZGV2aWNlLT51cGRhdGVTdGF0ZUJsb2NrLT5tYXRlcmlhbC5TcGVjdWxhcik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmbG9hdCBibGFja1s0XSA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKICAgICAgICAgICAgICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsICZibGFja1swXSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xNYXRlcmlhbGZ2Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY29udGV4dC0+dHJhY2tpbmdfcGFybSA9IFBhcm07Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2xpbmVwYXR0ZXJuKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5pb24gewogICAgICAgIERXT1JEICAgICAgICAgICAgICAgICBkOwogICAgICAgIFdJTkVEM0RMSU5FUEFUVEVSTiAgICBscDsKICAgIH0gdG1wcGF0dGVybjsKICAgIHRtcHBhdHRlcm4uZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19MSU5FUEFUVEVSTl07CgogICAgVFJBQ0UoIkxpbmUgcGF0dGVybjogcmVwZWF0ICVkIGJpdHMgJXhcbiIsIHRtcHBhdHRlcm4ubHAud1JlcGVhdEZhY3RvciwgdG1wcGF0dGVybi5scC53TGluZVBhdHRlcm4pOwoKICAgIGlmICh0bXBwYXR0ZXJuLmxwLndSZXBlYXRGYWN0b3IpIHsKICAgICAgICBnbExpbmVTdGlwcGxlKHRtcHBhdHRlcm4ubHAud1JlcGVhdEZhY3RvciwgdG1wcGF0dGVybi5scC53TGluZVBhdHRlcm4pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpbmVTdGlwcGxlKHJlcGVhdCwgbGluZXBhdHRlcm4pIik7CiAgICAgICAgZ2xFbmFibGUoR0xfTElORV9TVElQUExFKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfTElORV9TVElQUExFKTsiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX0xJTkVfU1RJUFBMRSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9MSU5FX1NUSVBQTEUpOyIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV96YmlhcyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHVuaW9uIHsKICAgICAgICBEV09SRCBkOwogICAgICAgIGZsb2F0IGY7CiAgICB9IHRtcHZhbHVlOwoKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfWkJJQVNdKSB7CiAgICAgICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19aQklBU107CiAgICAgICAgVFJBQ0UoIlpCaWFzIHZhbHVlICVmXG4iLCB0bXB2YWx1ZS5mKTsKICAgICAgICBnbFBvbHlnb25PZmZzZXQoMCwgLXRtcHZhbHVlLmYpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvbHlnb25PZmZzZXQoMCwgLVZhbHVlKSIpOwogICAgICAgIGdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9QT0xZR09OX09GRlNFVF9GSUxMKTsiKTsKICAgICAgICBnbEVuYWJsZShHTF9QT0xZR09OX09GRlNFVF9MSU5FKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfUE9MWUdPTl9PRkZTRVRfTElORSk7Iik7CiAgICAgICAgZ2xFbmFibGUoR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9QT0xZR09OX09GRlNFVF9QT0lOVCk7Iik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9QT0xZR09OX09GRlNFVF9GSUxMKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpOyIpOwogICAgICAgIGdsRGlzYWJsZShHTF9QT0xZR09OX09GRlNFVF9MSU5FKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUpOyIpOwogICAgICAgIGdsRGlzYWJsZShHTF9QT0xZR09OX09GRlNFVF9QT0lOVCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9QT0xZR09OX09GRlNFVF9QT0lOVCk7Iik7CiAgICB9Cn0KCgpzdGF0aWMgdm9pZCBzdGF0ZV9ub3JtYWxpemUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkRFQ0wpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgLyogV2l0aG91dCB2ZXJ0ZXggbm9ybWFscywgd2Ugc2V0IHRoZSBjdXJyZW50IG5vcm1hbCB0byAwLzAvMCB0byByZW1vdmUgdGhlIGRpZmZ1c2UgZmFjdG9yCiAgICAgKiBmcm9tIHRoZSBvcGVuZ2wgbGlnaHRpbmcgZXF1YXRpb24sIGFzIGQzZCBkb2VzLiBOb3JtYWxpemF0aW9uIG9mIDAvMC8wIGNhbiBsZWFkIHRvIGEgZGl2aXNpb24KICAgICAqIGJ5IHplcm8gYW5kIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkIGluIG9wZW5nbCwgc28gYXZvaWQgaXQKICAgICAqLwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19OT1JNQUxJWkVOT1JNQUxTXSAmJiAoCiAgICAgICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy5ub3JtYWwubHBEYXRhIHx8CiAgICAgICAgc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy5ub3JtYWwuVkJPKSkgewogICAgICAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX05PUk1BTElaRSk7Iik7CiAgICB9IGVsc2UgewogICAgICAgIGdsRGlzYWJsZShHTF9OT1JNQUxJWkUpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfTk9STUFMSVpFKTsiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcHNpemVtaW4oRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSB0bXB2YWx1ZTsKCiAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPSU5UU0laRV9NSU5dOwogICAgaWYoR0xfU1VQUE9SVChBUkJfUE9JTlRfUEFSQU1FVEVSUykpIHsKICAgICAgICBHTF9FWFRDQUxMKGdsUG9pbnRQYXJhbWV0ZXJmQVJCKShHTF9QT0lOVF9TSVpFX01JTl9BUkIsIHRtcHZhbHVlLmYpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvaW50UGFyYW1ldGVyZkFSQiguLi4pIik7CiAgICB9CiAgICBlbHNlIGlmKEdMX1NVUFBPUlQoRVhUX1BPSU5UX1BBUkFNRVRFUlMpKSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbFBvaW50UGFyYW1ldGVyZkVYVCkoR0xfUE9JTlRfU0laRV9NSU5fRVhULCB0bXB2YWx1ZS5mKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2ludFBhcmFtZXRlcmZFWFQoLi4uKSIpOwogICAgfSBlbHNlIGlmKHRtcHZhbHVlLmYgIT0gMS4wKSB7CiAgICAgICAgRklYTUUoIldJTkVEM0RSU19QT0lOVFNJWkVfTUlOIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBvcGVuZ2wsIHZhbHVlIGlzICVmXG4iLCB0bXB2YWx1ZS5mKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcHNpemVtYXgoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSB0bXB2YWx1ZTsKCiAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPSU5UU0laRV9NQVhdOwogICAgaWYoR0xfU1VQUE9SVChBUkJfUE9JTlRfUEFSQU1FVEVSUykpIHsKICAgICAgICBHTF9FWFRDQUxMKGdsUG9pbnRQYXJhbWV0ZXJmQVJCKShHTF9QT0lOVF9TSVpFX01BWF9BUkIsIHRtcHZhbHVlLmYpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvaW50UGFyYW1ldGVyZkFSQiguLi4pIik7CiAgICB9CiAgICBlbHNlIGlmKEdMX1NVUFBPUlQoRVhUX1BPSU5UX1BBUkFNRVRFUlMpKSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbFBvaW50UGFyYW1ldGVyZkVYVCkoR0xfUE9JTlRfU0laRV9NQVhfRVhULCB0bXB2YWx1ZS5mKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2ludFBhcmFtZXRlcmZFWFQoLi4uKSIpOwogICAgfSBlbHNlIGlmKHRtcHZhbHVlLmYgIT0gNjQuMCkgewogICAgICAgIEZJWE1FKCJXSU5FRDNEUlNfUE9JTlRTSVpFX01BWCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgb3BlbmdsLCB2YWx1ZSBpcyAlZlxuIiwgdG1wdmFsdWUuZik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3BzY2FsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFRPRE86IEdyb3VwIHRoaXMgd2l0aCB0aGUgdmlld3BvcnQgKi8KICAgIC8qCiAgICAgKiBQT0lOVFNDQUxFRU5BQkxFIGNvbnRyb2xzIGhvdyBwb2ludCBzaXplIHZhbHVlIGlzIHRyZWF0ZWQuIElmIHNldCB0bwogICAgICogdHJ1ZSwgdGhlIHBvaW50IHNpemUgaXMgc2NhbGVkIHdpdGggcmVzcGVjdCB0byBoZWlnaHQgb2Ygdmlld3BvcnQuCiAgICAgKiBXaGVuIHNldCB0byBmYWxzZSBwb2ludCBzaXplIGlzIGluIHBpeGVscy4KICAgICAqLwoKICAgIC8qIERlZmF1bHQgdmFsdWVzICovCiAgICBHTGZsb2F0IGF0dFszXSA9IHsxLjBmLCAwLjBmLCAwLjBmfTsKICAgIHVuaW9uIHsKICAgICAgICBEV09SRCBkOwogICAgICAgIGZsb2F0IGY7CiAgICB9IHBvaW50U2l6ZSwgQSwgQiwgQzsKCiAgICBwb2ludFNpemUuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QT0lOVFNJWkVdOwogICAgQS5kID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPSU5UU0NBTEVfQV07CiAgICBCLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9JTlRTQ0FMRV9CXTsKICAgIEMuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QT0lOVFNDQUxFX0NdOwoKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QT0lOVFNDQUxFRU5BQkxFXSkgewogICAgICAgIEdMZmxvYXQgc2NhbGVGYWN0b3I7CiAgICAgICAgZmxvYXQgaCA9IHN0YXRlYmxvY2stPnZpZXdwb3J0LkhlaWdodDsKCiAgICAgICAgaWYocG9pbnRTaXplLmYgPCBHTF9MSU1JVFMocG9pbnRzaXplbWluKSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBNaW5pbXVtIHZhbGlkIHBvaW50IHNpemUgZm9yIE9wZW5HTCBpcyBkcml2ZXIgc3BlY2lmaWMuIEZvciBEaXJlY3QzRCBpdCBpcwogICAgICAgICAgICAgKiAwLjBmLiBUaGlzIG1lYW5zIHRoYXQgT3BlbkdMIHdpbGwgY2xhbXAgcmVhbGx5IHNtYWxsIHBvaW50IHNpemVzIHRvIHRoZQogICAgICAgICAgICAgKiBkcml2ZXIgbWluaW11bS4gVG8gY29ycmVjdCBmb3IgdGhpcyB3ZSBuZWVkIHRvIG11bHRpcGx5IGJ5IHRoZSBzY2FsZSBmYWN0b3Igd2hlbiBzaXplcwogICAgICAgICAgICAgKiBhcmUgbGVzcyB0aGFuIDEuMGYuIHNjYWxlX2ZhY3RvciA9ICAxLjBmIC8gcG9pbnRfc2l6ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gcG9pbnRTaXplLmYgLyBHTF9MSU1JVFMocG9pbnRzaXplbWluKTsKICAgICAgICAgICAgLyogQ2xhbXAgdGhlIHBvaW50IHNpemUsIGRvbid0IHJlbHkgb24gdGhlIGRyaXZlciB0byBkbyBpdC4gTWFjT1Mgc2F5cyBtaW4gcG9pbnQgc2l6ZQogICAgICAgICAgICAgKiBpcyAxLjAsIGJ1dCB0aGVuIGFjY2VwdHMgcG9pbnRzIGJlbG93IHRoYXQgYW5kIGRyYXdzIHRvbyBzbWFsbCBwb2ludHMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBvaW50U2l6ZS5mID0gR0xfTElNSVRTKHBvaW50c2l6ZW1pbik7CiAgICAgICAgfSBlbHNlIGlmKHBvaW50U2l6ZS5mID4gR0xfTElNSVRTKHBvaW50c2l6ZSkpIHsKICAgICAgICAgICAgLyogZ2wgYWxyZWFkeSBzY2FsZXMgdGhlIGlucHV0IHRvIGdsUG9pbnRTaXplLAogICAgICAgICAgICAgKiBkM2Qgc2NhbGVzIHRoZSByZXN1bHQgYWZ0ZXIgdGhlIHBvaW50IHNpemUgc2NhbGUuCiAgICAgICAgICAgICAqIElmIHRoZSBwb2ludCBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXggc2l6ZSwgdXNlIHRoZQogICAgICAgICAgICAgKiBzY2FsaW5nIHRvIHNjYWxlIGl0IGJpZ2dlciwgYW5kIHNldCB0aGUgZ2wgcG9pbnQgc2l6ZSB0byBtYXgKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gcG9pbnRTaXplLmYgLyBHTF9MSU1JVFMocG9pbnRzaXplKTsKICAgICAgICAgICAgVFJBQ0UoInNjYWxlOiAlZlxuIiwgc2NhbGVGYWN0b3IpOwogICAgICAgICAgICBwb2ludFNpemUuZiA9IEdMX0xJTUlUUyhwb2ludHNpemUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gMS4wZjsKICAgICAgICB9CiAgICAgICAgc2NhbGVGYWN0b3IgPSBwb3coaCAqIHNjYWxlRmFjdG9yLCAyKTsKCiAgICAgICAgYXR0WzBdID0gQS5mIC8gc2NhbGVGYWN0b3I7CiAgICAgICAgYXR0WzFdID0gQi5mIC8gc2NhbGVGYWN0b3I7CiAgICAgICAgYXR0WzJdID0gQy5mIC8gc2NhbGVGYWN0b3I7CiAgICB9CgogICAgaWYoR0xfU1VQUE9SVChBUkJfUE9JTlRfUEFSQU1FVEVSUykpIHsKICAgICAgICBHTF9FWFRDQUxMKGdsUG9pbnRQYXJhbWV0ZXJmdkFSQikoR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCBhdHQpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFBvaW50UGFyYW1ldGVyZnZBUkIoR0xfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCAuLi4pIik7CiAgICB9CiAgICBlbHNlIGlmKEdMX1NVUFBPUlQoRVhUX1BPSU5UX1BBUkFNRVRFUlMpKSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbFBvaW50UGFyYW1ldGVyZnZFWFQpKEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCwgYXR0KTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2ludFBhcmFtZXRlcmZ2RVhUKEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCwgLi4uKSIpOwogICAgfSBlbHNlIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QT0lOVFNDQUxFRU5BQkxFXSkgewogICAgICAgIFdBUk4oIlBPSU5UX1BBUkFNRVRFUlMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2Ygb3BlbmdsXG4iKTsKICAgIH0KCiAgICBnbFBvaW50U2l6ZShwb2ludFNpemUuZik7CiAgICBjaGVja0dMY2FsbCgiZ2xQb2ludFNpemUoLi4uKTsiKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfY29sb3J3cml0ZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIFZhbHVlID0gc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEVdOwoKICAgIFRSQUNFKCJDb2xvciBtYXNrOiByKCVkKSBnKCVkKSBiKCVkKSBhKCVkKVxuIiwKICAgICAgICBWYWx1ZSAmIFdJTkVEM0RDT0xPUldSSVRFRU5BQkxFX1JFRCAgID8gMSA6IDAsCiAgICAgICAgVmFsdWUgJiBXSU5FRDNEQ09MT1JXUklURUVOQUJMRV9HUkVFTiA/IDEgOiAwLAogICAgICAgIFZhbHVlICYgV0lORUQzRENPTE9SV1JJVEVFTkFCTEVfQkxVRSAgPyAxIDogMCwKICAgICAgICBWYWx1ZSAmIFdJTkVEM0RDT0xPUldSSVRFRU5BQkxFX0FMUEhBID8gMSA6IDApOwogICAgZ2xDb2xvck1hc2soVmFsdWUgJiBXSU5FRDNEQ09MT1JXUklURUVOQUJMRV9SRUQgICA/IEdMX1RSVUUgOiBHTF9GQUxTRSwKICAgICAgICAgICAgICAgIFZhbHVlICYgV0lORUQzRENPTE9SV1JJVEVFTkFCTEVfR1JFRU4gPyBHTF9UUlVFIDogR0xfRkFMU0UsCiAgICAgICAgICAgICAgICBWYWx1ZSAmIFdJTkVEM0RDT0xPUldSSVRFRU5BQkxFX0JMVUUgID8gR0xfVFJVRSA6IEdMX0ZBTFNFLAogICAgICAgICAgICAgICAgVmFsdWUgJiBXSU5FRDNEQ09MT1JXUklURUVOQUJMRV9BTFBIQSA/IEdMX1RSVUUgOiBHTF9GQUxTRSk7CiAgICBjaGVja0dMY2FsbCgiZ2xDb2xvck1hc2soLi4uKSIpOwoKICAgIC8qIGRlcGVuZHMgb24gV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUuICovCiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTFdICE9IDB4MDAwMDAwMEYgfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMl0gIT0gMHgwMDAwMDAwRiB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUzXSAhPSAweDAwMDAwMDBGICkgewogICAgICAgIEVSUigiKFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMS8yLzMsJWQsJWQsJWQpIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIE1pc3Npbmcgb2YgY2FwIEQzRFBNSVNDQ0FQU19JTkRFUEVOREVOVFdSSVRFTUFTS1Mgd2Fzbid0IGhvbm9yZWQ/XG4iLAogICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTFdLAogICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTJdLAogICAgICAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTNdKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfbG9jYWx2aWV3ZXIoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTE9DQUxWSUVXRVJdKSB7CiAgICAgICAgZ2xMaWdodE1vZGVsaShHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsIDEpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUiwgMSkiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xMaWdodE1vZGVsaShHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsIDApOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUiwgMCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfbGFzdHBpeGVsKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0xBU1RQSVhFTF0pIHsKICAgICAgICBUUkFDRSgiTGFzdCBQaXhlbCBEcmF3aW5nIEVuYWJsZWRcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBzdGF0aWMgQk9PTCBmaXJzdCA9IFRSVUU7CiAgICAgICAgaWYoZmlyc3QpIHsKICAgICAgICAgICAgRklYTUUoIkxhc3QgUGl4ZWwgRHJhd2luZyBEaXNhYmxlZCwgbm90IGhhbmRsZWQgeWV0XG4iKTsKICAgICAgICAgICAgZmlyc3QgPSBGQUxTRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRSgiTGFzdCBQaXhlbCBEcmF3aW5nIERpc2FibGVkLCBub3QgaGFuZGxlZCB5ZXRcbiIpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcG9pbnRzcHJpdGUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICAvKiBUT0RPOiBOVl9QT0lOVF9TUFJJVEUgKi8KICAgIGlmICghR0xfU1VQUE9SVChBUkJfUE9JTlRfU1BSSVRFKSkgewogICAgICAgIFRSQUNFKCJQb2ludCBzcHJpdGVzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFXSkgewogICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9BUkIpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9QT0lOVF9TUFJJVEVfQVJCKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX0FSQik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEVfQVJCKSIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV93cmFwKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgLyoqCiAgICAgaHR0cDovL3d3dy5jb3NjLmJyb2NrdS5jYS9PZmZlcmluZ3MvM1A5OC9jb3Vyc2UvbGVjdHVyZXMvdGV4dHVyZS8KICAgICBodHRwOi8vd3d3LmdhbWVkZXYubmV0L3JlZmVyZW5jZS9wcm9ncmFtbWluZy9mZWF0dXJlcy9yZW5kZXJlcmRsbDMvcGFnZTIuYXNwCiAgICAgRGlzY3Vzc2lvbiBvbiB0aGUgd2F5cyB0byB0dXJuIG9uIFdSQVBpbmcgdG8gc29sdmUgYW4gT3BlbkdMIGNvbnZlcnNpb24gcHJvYmxlbS4KICAgICBodHRwOi8vd3d3LmZsaXBjb2RlLm9yZy9jZ2ktYmluL2ZjbXNnLmNnaT90aHJlYWRfc2hvdz0xMDI0OAoKICAgICBzbyBmYXIgYXMgSSBjYW4gdGVsbCwgd3JhcHBpbmcgYW5kIHRleHR1cmUtY29vcmRpbmF0ZSBnZW5lcmF0ZSBnbyBoYW5kIGluIGhhbmQsCiAgICAgKi8KICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMF0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMV0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMl0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQM10gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQNF0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQNV0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQNl0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQN10gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQOF0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQOV0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMTBdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfV1JBUDExXSB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1dSQVAxMl0gfHwKICAgICAgIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19XUkFQMTNdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfV1JBUDE0XSB8fAogICAgICAgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1dSQVAxNV0gKSB7CiAgICAgICAgRklYTUUoIihXSU5FRDNEUlNfV1JBUDApIFRleHR1cmUgd3JhcGluZyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX211bHRpc2FtcGxlYWEoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZiggR0xfU1VQUE9SVChBUkJfTVVMVElTQU1QTEUpICkgewogICAgICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBU10pIHsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfTVVMVElTQU1QTEVfQVJCKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX01VTFRJU0FNUExFX0FSQikiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbERpc2FibGUoR0xfTVVMVElTQU1QTEVfQVJCKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9NVUxUSVNBTVBMRV9BUkIpIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVNdKSB7CiAgICAgICAgICAgIFdBUk4oIk11bHRpc2FtcGxlIGFudGlhbGlhc2luZyBub3Qgc3VwcG9ydGVkIGJ5IGdsXG4iKTsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3NjaXNzb3IoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU0NJU1NPUlRFU1RFTkFCTEVdKSB7CiAgICAgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfZGVwdGhiaWFzKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CgogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NMT1BFU0NBTEVERVBUSEJJQVNdIHx8CiAgICAgICBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfREVQVEhCSUFTXSkgewogICAgICAgIHRtcHZhbHVlLmQgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU0xPUEVTQ0FMRURFUFRIQklBU107CiAgICAgICAgZ2xFbmFibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpIik7CiAgICAgICAgZ2xQb2x5Z29uT2Zmc2V0KHRtcHZhbHVlLmYsICooKGZsb2F0Kikmc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0RFUFRIQklBU10pKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xQb2x5Z29uT2Zmc2V0KC4uLikiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfUE9MWUdPTl9PRkZTRVRfRklMTCkiKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcGVyc3BlY3RpdmUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1RFWFRVUkVQRVJTUEVDVElWRV0pIHsKICAgICAgICBnbEhpbnQoR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTF9OSUNFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEhpbnQoR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTF9OSUNFU1QpIik7CiAgICB9IGVsc2UgewogICAgICAgIGdsSGludChHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsIEdMX0ZBU1RFU1QpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEhpbnQoR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTF9GQVNURVNUKSIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9zdGlwcGxlZGFscGhhKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVElQUExFREFMUEhBXSkKICAgICAgICBGSVhNRSgiIFN0aXBwbGVkIEFscGhhIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2FudGlhbGlhcyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU5USUFMSUFTXSkKICAgICAgICBGSVhNRSgiIEFudGlhbGlhcyBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9tdWx0aXNhbXBtYXNrKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19NVUxUSVNBTVBMRU1BU0tdICE9IDB4RkZGRkZGRkYpCiAgICAgICAgRklYTUUoIihXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLLCVkKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLXSk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3BhdGNoZWRnZXN0eWxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QQVRDSEVER0VTVFlMRV0gIT0gV0lORUQzRFBBVENIRURHRV9ESVNDUkVURSkKICAgICAgICBGSVhNRSgiKFdJTkVEM0RSU19QQVRDSEVER0VTVFlMRSwlZCkgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BBVENIRURHRVNUWUxFXSk7Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3BhdGNoc2VnbWVudHMoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICB1bmlvbiB7CiAgICAgICAgRFdPUkQgZDsKICAgICAgICBmbG9hdCBmOwogICAgfSB0bXB2YWx1ZTsKICAgIHRtcHZhbHVlLmYgPSAxLjBmOwoKICAgIFRSQUNFKCJTdHViXG4iKTsKICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUEFUQ0hTRUdNRU5UU10gIT0gdG1wdmFsdWUuZCkKICAgIHsKICAgICAgICBzdGF0aWMgQk9PTCBkaXNwbGF5ZWQgPSBGQUxTRTsKCiAgICAgICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QQVRDSFNFR01FTlRTXTsKICAgICAgICBpZighZGlzcGxheWVkKQogICAgICAgICAgICBGSVhNRSgiKFdJTkVEM0RSU19QQVRDSFNFR01FTlRTLCVmKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCB0bXB2YWx1ZS5mKTsKCiAgICAgICAgZGlzcGxheWVkID0gVFJVRTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcG9zaXRpb25kZWdyZWUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBUUkFDRSgiU3R1YlxuIik7CiAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFXSAhPSBXSU5FRDNEREVHUkVFX0NVQklDKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFLCVkKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfUE9TSVRJT05ERUdSRUVdKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfbm9ybWFsZGVncmVlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVFJBQ0UoIlN0dWJcbiIpOwogICAgaWYgKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19OT1JNQUxERUdSRUVdICE9IFdJTkVEM0RERUdSRUVfTElORUFSKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX05PUk1BTERFR1JFRSwlZCkgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwgc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX05PUk1BTERFR1JFRV0pOwp9CgpzdGF0aWMgdm9pZCBzdGF0ZV90ZXNzZWxsYXRpb24oRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBUUkFDRSgiU3R1YlxuIik7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU5BQkxFQURBUFRJVkVURVNTRUxMQVRJT05dKQogICAgICAgIEZJWE1FKCIoV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OLCVkKSBub3QgeWV0IGltcGxlbWVudGVkXG4iLCBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfRU5BQkxFQURBUFRJVkVURVNTRUxMQVRJT05dKTsKfQoKc3RhdGljIHZvaWQgc3RhdGVfd3JhcHUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfV1JBUFVdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfV1JBUFUgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3dyYXB2KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1dSQVBWXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX1dSQVBWIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9tb25vZW5hYmxlKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX01PTk9FTkFCTEVdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfTU9OT0VOQUJMRSBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfcm9wMihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19ST1AyXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX1JPUDIgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3BsYW5lbWFzayhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19QTEFORU1BU0tdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfUExBTkVNQVNLIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9zdWJwaXhlbChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19TVUJQSVhFTF0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19TVUJQSVhFTCBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfc3VicGl4ZWx4KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1NVQlBJWEVMWF0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19TVUJQSVhFTFggbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX3N0aXBwbGVlbmFibGUoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfU1RJUFBMRUVOQUJMRV0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19TVElQUExFRU5BQkxFIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9ib3JkZXJjb2xvcihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19CT1JERVJDT0xPUl0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19CT1JERVJDT0xPUiBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfbWlwbWFwbG9kYmlhcyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19NSVBNQVBMT0RCSUFTXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX01JUE1BUExPREJJQVMgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2FuaXNvdHJvcHkoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQU5JU09UUk9QWV0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19BTklTT1RST1BZIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzdGF0ZV9mbHVzaGJhdGNoKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0ZMVVNIQkFUQ0hdKSB7CiAgICAgICAgRklYTUUoIlJlbmRlciBzdGF0ZSBXSU5FRDNEUlNfRkxVU0hCQVRDSCBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfdHJhbnNsdWNlbnRzaShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19UUkFOU0xVQ0VOVFNPUlRJTkRFUEVOREVOVF0pIHsKICAgICAgICBGSVhNRSgiUmVuZGVyIHN0YXRlIFdJTkVEM0RSU19UUkFOU0xVQ0VOVFNPUlRJTkRFUEVOREVOVCBub3QgaW1wbGVtZW50ZWQgeWV0XG4iKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfZXh0ZW50cyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19FWFRFTlRTXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX0VYVEVOVFMgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHN0YXRlX2NrZXlibGVuZChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DT0xPUktFWUJMRU5ERU5BQkxFXSkgewogICAgICAgIEZJWE1FKCJSZW5kZXIgc3RhdGUgV0lORUQzRFJTX0NPTE9SS0VZQkxFTkRFTkFCTEUgbm90IGltcGxlbWVudGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRleF9jb2xvcm9wKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgc3RhZ2UgPSAoc3RhdGUgLSBTVEFURV9URVhUVVJFU1RBR0UoMCwgMCkpIC8gV0lORUQzRF9ISUdIRVNUX1RFWFRVUkVfU1RBVEU7CiAgICBEV09SRCBtYXBwZWRfc3RhZ2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT50ZXhVbml0TWFwW3N0YWdlXTsKICAgIEJPT0wgdGV4X3VzZWQgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5maXhlZF9mdW5jdGlvbl91c2FnZV9tYXBbc3RhZ2VdOwoKICAgIFRSQUNFKCJTZXR0aW5nIGNvbG9yIG9wIGZvciBzdGFnZSAlZFxuIiwgc3RhZ2UpOwoKICAgIGlmIChzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciAmJiBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5wc19zZWxlY3RlZF9tb2RlICE9IFNIQURFUl9OT05FICYmCiAgICAgICAgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKXN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKS0+YmFzZVNoYWRlci5mdW5jdGlvbikgewogICAgICAgIC8qIFVzaW5nIGEgcGl4ZWwgc2hhZGVyPyBEb24ndCBjYXJlIGZvciBhbnl0aGluZyBoZXJlLCB0aGUgc2hhZGVyIGFwcGx5aW5nIGRvZXMgaXQgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHN0YWdlICE9IG1hcHBlZF9zdGFnZSkgV0FSTigiVXNpbmcgbm9uIDE6MSBtYXBwaW5nOiAlZCAtPiAlZCFcbiIsIHN0YWdlLCBtYXBwZWRfc3RhZ2UpOwoKICAgIGlmIChtYXBwZWRfc3RhZ2UgIT0gLTEpIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICBpZiAodGV4X3VzZWQgJiYgbWFwcGVkX3N0YWdlID49IEdMX0xJTUlUUyh0ZXh0dXJlcykpIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJBdHRlbXB0IHRvIGVuYWJsZSB1bnN1cHBvcnRlZCBzdGFnZSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICAgICAgfSBlbHNlIGlmIChzdGFnZSA+IDApIHsKICAgICAgICAgICAgV0FSTigiUHJvZ3JhbSB1c2luZyBtdWx0aXBsZSBjb25jdXJyZW50IHRleHR1cmVzIHdoaWNoIHRoaXMgb3BlbmdsIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKEdMX1NVUFBPUlQoTlZfUkVHSVNURVJfQ09NQklORVJTKSkgewogICAgICAgIGlmKHN0YXRlYmxvY2stPmxvd2VzdF9kaXNhYmxlZF9zdGFnZSA+IDApIHsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfUkVHSVNURVJfQ09NQklORVJTX05WKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENvbWJpbmVyUGFyYW1ldGVyaU5WKEdMX05VTV9HRU5FUkFMX0NPTUJJTkVSU19OViwgc3RhdGVibG9jay0+bG93ZXN0X2Rpc2FibGVkX3N0YWdlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1JFR0lTVEVSX0NPTUJJTkVSU19OVik7CiAgICAgICAgfQogICAgfQogICAgaWYoc3RhZ2UgPj0gc3RhdGVibG9jay0+bG93ZXN0X2Rpc2FibGVkX3N0YWdlKSB7CiAgICAgICAgVFJBQ0UoIlN0YWdlIGRpc2FibGVkXG4iKTsKICAgICAgICBpZiAobWFwcGVkX3N0YWdlICE9IC0xKSB7CiAgICAgICAgICAgIC8qIERpc2FibGUgZXZlcnl0aGluZyBoZXJlICovCiAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFXzJEKSIpOwogICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8zRCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfVEVYVFVSRV8zRCkiKTsKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9DVUJFX01BUCkpIHsKICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0NVQkVfTUFQX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfUkVDVEFOR0xFKSkgewogICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQikiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikgJiYgbWFwcGVkX3N0YWdlIDwgR0xfTElNSVRTKHRleHR1cmVzKSkgewogICAgICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9TSEFERVJfT1BFUkFUSU9OX05WLCBHTF9OT05FKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBBbGwgZG9uZSAqLwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBUaGUgc2FtcGxlciB3aWxsIGFsc28gYWN0aXZhdGUgdGhlIGNvcnJlY3QgdGV4dHVyZSBkaW1lbnNpb25zLCBzbyBubyBuZWVkIHRvIGRvIGl0IGhlcmUKICAgICAqIGlmIHRoZSBzYW1wbGVyIGZvciB0aGlzIHN0YWdlIGlzIGRpcnR5CiAgICAgKi8KICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfU0FNUExFUihzdGFnZSkpKSB7CiAgICAgICAgaWYgKHRleF91c2VkKSB0ZXh0dXJlX2FjdGl2YXRlX2RpbWVuc2lvbnMoc3RhZ2UsIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQoKICAgIC8qIFNldCB0aGUgdGV4dHVyZSBjb21iaW5lcnMgKi8KICAgIGlmIChHTF9TVVBQT1JUKE5WX1JFR0lTVEVSX0NPTUJJTkVSUykpIHsKICAgICAgICBzZXRfdGV4X29wX252cmMoKElXaW5lRDNERGV2aWNlICopc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgRkFMU0UsIHN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9ST1BdLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQ09MT1JBUkcyXSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19DT0xPUkFSRzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3N0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX1JFU1VMVEFSR10pOwoKICAgICAgICAvKiBJbiByZWdpc3RlciBjb21iaW5lcnMgYnVtcCBtYXBwaW5nIGlzIGRvbmUgaW4gdGhlIHN0YWdlIEFGVEVSIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGJ1bXAgbWFwIG9wZXJhdGlvbiBzZXQsCiAgICAgICAgICogdGh1cyB0aGUgdGV4dHVyZSBzaGFkZXIgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZAogICAgICAgICAqLwogICAgICAgIGlmKEdMX1NVUFBPUlQoTlZfVEVYVFVSRV9TSEFERVIyKSkgewogICAgICAgICAgICBCT09MIHVzZXNCdW1wID0gKHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19DT0xPUk9QXSA9PSBXSU5FRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0UgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQ09MT1JPUF0gPT0gV0lORUQzRFRPUF9CVU1QRU5WTUFQKSA/IFRSVUUgOiBGQUxTRTsKICAgICAgICAgICAgQk9PTCB1c2VkQnVtcCA9IChjb250ZXh0LT50ZXhTaGFkZXJCdW1wTWFwICYgMSA8PCAoc3RhZ2UgKyAxKSkgPyBUUlVFIDogRkFMU0U7CiAgICAgICAgICAgIGlmKHVzZXNCdW1wICE9IHVzZWRCdW1wKSB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBtYXBwZWRfc3RhZ2UgKyAxKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICAgICAgICAgICAgICB0ZXh0dXJlX2FjdGl2YXRlX2RpbWVuc2lvbnMoc3RhZ2UgKyAxLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBzZXRfdGV4X29wKChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIEZBTFNFLCBzdGFnZSwKICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQ09MT1JPUF0sCiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMV0sCiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMl0sCiAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0NPTE9SQVJHMF0pOwogICAgfQp9CgpzdGF0aWMgdm9pZCB0ZXhfYWxwaGFvcChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHN0YWdlID0gKHN0YXRlIC0gU1RBVEVfVEVYVFVSRVNUQUdFKDAsIDApKSAvIFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFOwogICAgRFdPUkQgbWFwcGVkX3N0YWdlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dGV4VW5pdE1hcFtzdGFnZV07CiAgICBCT09MIHRleF91c2VkID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+Zml4ZWRfZnVuY3Rpb25fdXNhZ2VfbWFwW3N0YWdlXTsKICAgIERXT1JEIG9wLCBhcmcxLCBhcmcyLCBhcmcwOwoKICAgIFRSQUNFKCJTZXR0aW5nIGFscGhhIG9wIGZvciBzdGFnZSAlZFxuIiwgc3RhZ2UpOwogICAgLyogRG8gbm90IGNhcmUgZm9yIGVuYWJsZWQgLyBkaXNhYmxlZCBzdGFnZXMsIGp1c3QgYXNzaWduIHRoZSBzZXR0aW5ncy4gY29sb3JvcCBkaXNhYmxlcyAvIGVuYWJsZXMgcmVxdWlyZWQgc3R1ZmYgKi8KICAgIGlmIChtYXBwZWRfc3RhZ2UgIT0gLTEpIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICBpZiAodGV4X3VzZWQgJiYgbWFwcGVkX3N0YWdlID49IEdMX0xJTUlUUyh0ZXh0dXJlcykpIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJBdHRlbXB0IHRvIGVuYWJsZSB1bnN1cHBvcnRlZCBzdGFnZSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICAgICAgfSBlbHNlIGlmIChzdGFnZSA+IDApIHsKICAgICAgICAgICAgLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSAqLwogICAgICAgICAgICBXQVJOKCJQcm9ncmFtIHVzaW5nIG11bHRpcGxlIGNvbmN1cnJlbnQgdGV4dHVyZXMgd2hpY2ggdGhpcyBvcGVuZ2wgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBvcCA9IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19BTFBIQU9QXTsKICAgIGFyZzEgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQUxQSEFBUkcxXTsKICAgIGFyZzIgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQUxQSEFBUkcyXTsKICAgIGFyZzAgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQUxQSEFBUkcwXTsKCiAgICBpZihzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEVdICYmIHN0YWdlID09IDAgJiYKICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVzWzBdICYmCiAgICAgICAoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbMF0gPT0gR0xfVEVYVFVSRV8yRCB8fCBzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1swXSA9PSBHTF9URVhUVVJFX1JFQ1RBTkdMRV9BUkIpKSB7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlSW1wbCAqc3VyZiA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopICgoSVdpbmVEM0RUZXh0dXJlSW1wbCAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1swXSktPnN1cmZhY2VzWzBdOwoKICAgICAgICBpZihzdXJmLT5DS2V5RmxhZ3MgJiBXSU5FRERTRF9DS1NSQ0JMVCAmJgogICAgICAgICAgIGdldEZvcm1hdERlc2NFbnRyeShzdXJmLT5yZXNvdXJjZS5mb3JtYXQsIE5VTEwsIE5VTEwpLT5hbHBoYU1hc2sgPT0gMHgwMDAwMDAwMCkgewoKICAgICAgICAgICAgLyogQ29sb3Iga2V5aW5nIG5lZWRzIHRvIHBhc3MgYWxwaGEgdmFsdWVzIGZyb20gdGhlIHRleHR1cmUgdGhyb3VnaCB0byBoYXZlIHRoZSBhbHBoYSB0ZXN0IHdvcmsgcHJvcGVybHkuCiAgICAgICAgICAgICAqIE9uIHRoZSBvdGhlciBoYW5kIGFwcGxpY2F0aW9ucyBjYW4gc3RpbGwgdXNlIHRleHR1cmUgY29tYmluZXJzIGFwcGFyZW50bHkuIFRoaXMgY29kZSB0YWtlcyBjYXJlIHRoYXQgYXBwcwogICAgICAgICAgICAgKiBjYW5ub3QgcmVtb3ZlIHRoZSB0ZXh0dXJlJ3MgYWxwaGEgY2hhbm5lbCBlbnRpcmVseS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVGhlIGZpeHVwIGlzIHJlcXVpcmVkIGZvciBQcmluY2Ugb2YgUGVyc2lhIDNEKHByaXNvbiBiYXJzKSwgd2hpbGUgTW90byByYWNlciAyIHJlcXVpcmVzIEQzRFRPUF9NT0RVTEFURSB0byB3b3JrCiAgICAgICAgICAgICAqIG9uIGNvbG9yIGtleWVkIHN1cmZhY2VzLiBBbGllbnMgdnMgUHJlZGF0b3IgMSB1c2VzIGNvbG9yIGtleWVkIHRleHR1cmVzIGFuZCBhbHBoYSBjb21wb25lbnQgb2YgZGlmZnVzZSBjb2xvciB0bwogICAgICAgICAgICAgKiBkcmF3IHRoaW5ncyBsaWtlIHRyYW5zbHVjZW50IHRleHQgYW5kIHBlcmZvcm0gb3RoZXIgYmxlbmRpbmcgZWZmZWN0cy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQWxpZW5zIHZzIFByZWRhdG9yIDEgcmVsaWVzIG9uIGRpZmZ1c2UgYWxwaGEgaGF2aW5nIGFuIGVmZmVjdCwgc28gaXQgY2Fubm90IGJlIGlnbm9yZWQuIFRvIHByb3ZpZGUgdGhlCiAgICAgICAgICAgICAqIGJlaGF2aW9yIGV4cGVjdGVkIGJ5IHRoZSBnYW1lLCB3aGlsZSBlbXVsYXRpbmcgdGhlIGNvbG9ya2V5LCBkaWZmdXNlIGFscGhhIG11c3QgYmUgbW9kdWxhdGVkIHdpdGggdGV4dHVyZSBhbHBoYS4KICAgICAgICAgICAgICogT1RPSCwgTW90byByYWNlciAyIGF0IHNvbWUgcG9pbnRzIHNldHMgYWxwaGFvcC9hbHBoYWFyZyB0byBTRUxFQ1RBUkcvQ1VSUkVOVCwgeWV0IHB1dHMgZ2FyYmFnZSBpbiBkaWZmdXNlIGFscGhhCiAgICAgICAgICAgICAqICh6ZXJvZXMpLiBUaGlzIHdvcmtzIG9uIG5hdGl2ZSwgYmVjYXVzZSB0aGUgZ2FtZSBkaXNhYmxlcyBhbHBoYSB0ZXN0IGFuZCBhbHBoYSBibGVuZGluZy4gQWxwaGEgdGVzdCBpcyBvdmVyd3JpdHRlbiBieQogICAgICAgICAgICAgKiB3aW5lJ3MgZm9yIHB1cnBvc2VzIG9mIGNvbG9yLWtleWluZyB0aG91Z2gsIHNvIHRoaXMgd2lsbCBsZWFkIHRvIG1pc3NpbmcgZ2VvbWV0cnkgaWYgdGV4dHVyZSBhbHBoYSBpcyBtb2R1bGF0ZWQKICAgICAgICAgICAgICogKHBpeGVscyBmYWlsIGFscGhhIHRlc3QpLiBUbyBnZXQgYXJvdW5kIHRoaXMsIEFMUEhBQkxFTkRFTkFCTEUgc3RhdGUgaXMgY2hlY2tlZDogaWYgdGhlIGFwcCBlbmFibGVzIGFscGhhIGJsZW5kaW5nLAogICAgICAgICAgICAgKiBpdCBjYW4gYmUgZXhwZWN0ZWQgdG8gcHJvdmlkZSBtZWFuaW5nZnVsIHZhbHVlcyBpbiBkaWZmdXNlIGFscGhhLCBzbyBpdCBzaG91bGQgYmUgbW9kdWxhdGVkIHdpdGggdGV4dHVyZSBhbHBoYTsKICAgICAgICAgICAgICogb3RoZXJ3aXNlLCBzZWxlY3RpbmcgZGlmZnVzZSBhbHBoYSBpcyBpZ25vcmVkIGluIGZhdm91ciBvZiB0ZXh0dXJlIGFscGhhLgoKICAgICAgICAgICAgICogV2hhdCB0byBkbyB3aXRoIG11bHRpdGV4dHVyaW5nPyBTbyBmYXIgbm8gYXBwIGhhcyBiZWVuIGZvdW5kIHRoYXQgdXNlcyBjb2xvciBrZXlpbmcgd2l0aCBtdWx0aXRleHR1cmluZwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYob3AgPT0gV0lORUQzRFRPUF9ESVNBQkxFKSB7CiAgICAgICAgICAgICAgICBhcmcxID0gV0lORUQzRFRBX1RFWFRVUkU7CiAgICAgICAgICAgICAgICBvcCA9IFdJTkVEM0RUT1BfU0VMRUNUQVJHMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmKG9wID09IFdJTkVEM0RUT1BfU0VMRUNUQVJHMSAmJiBhcmcxICE9IFdJTkVEM0RUQV9URVhUVVJFKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEVdKSB7CiAgICAgICAgICAgICAgICAgICAgYXJnMiA9IFdJTkVEM0RUQV9URVhUVVJFOwogICAgICAgICAgICAgICAgICAgIG9wID0gV0lORUQzRFRPUF9NT0RVTEFURTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgYXJnMSA9IFdJTkVEM0RUQV9URVhUVVJFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYob3AgPT0gV0lORUQzRFRPUF9TRUxFQ1RBUkcyICYmIGFyZzIgIT0gV0lORUQzRFRBX1RFWFRVUkUpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRV0pIHsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gV0lORUQzRFRBX1RFWFRVUkU7CiAgICAgICAgICAgICAgICAgICAgb3AgPSBXSU5FRDNEVE9QX01PRFVMQVRFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBhcmcyID0gV0lORUQzRFRBX1RFWFRVUkU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgVFJBQ0UoIlNldHRpbmcgYWxwaGEgb3AgZm9yIHN0YWdlICVkXG4iLCBzdGFnZSk7CiAgICBpZiAoR0xfU1VQUE9SVChOVl9SRUdJU1RFUl9DT01CSU5FUlMpKSB7CiAgICAgICAgc2V0X3RleF9vcF9udnJjKChJV2luZUQzRERldmljZSAqKXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIFRSVUUsIHN0YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgb3AsIGFyZzEsIGFyZzIsIGFyZzAsCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfc3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfUkVTVUxUQVJHXSk7CiAgICB9IGVsc2UgewogICAgICAgIHNldF90ZXhfb3AoKElXaW5lRDNERGV2aWNlICopc3RhdGVibG9jay0+d2luZUQzRERldmljZSwgVFJVRSwgc3RhZ2UsCiAgICAgICAgICAgICAgICAgICAgb3AsIGFyZzEsIGFyZzIsIGFyZzApOwogICAgfQp9CgpzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fdGV4dHVyZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHRleFVuaXQgPSBzdGF0ZSAtIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTApOwogICAgRFdPUkQgbWFwcGVkX3N0YWdlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dGV4VW5pdE1hcFt0ZXhVbml0XTsKICAgIEJPT0wgZ2VuZXJhdGVkOwoKICAgIC8qIElnbm9yZSB0aGlzIHdoZW4gYSB2ZXJ0ZXggc2hhZGVyIGlzIHVzZWQsIG9yIGlmIHRoZSBzdHJlYW1zIGFyZW4ndCBzb3J0ZWQgb3V0IHlldCAqLwogICAgaWYodXNlX3ZzKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UpIHx8CiAgICAgICBpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkRFQ0wpKSB7CiAgICAgICAgVFJBQ0UoIlVzaW5nIGEgdmVydGV4IHNoYWRlciwgb3Igc3RyZWFtIHNvdXJjZXMgbm90IHNvcnRlZCBvdXQgeWV0LCBza2lwcGluZ1xuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChtYXBwZWRfc3RhZ2UgPT0gLTEpIHJldHVybjsKCiAgICBpZiAoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgIGlmKG1hcHBlZF9zdGFnZSA+PSBHTF9MSU1JVFModGV4dHVyZXMpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgbWFwcGVkX3N0YWdlKSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgfSBlbHNlIGlmIChtYXBwZWRfc3RhZ2UgPiAwKSB7CiAgICAgICAgLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSAqLwogICAgICAgIFdBUk4oIlByb2dyYW0gdXNpbmcgbXVsdGlwbGUgY29uY3VycmVudCB0ZXh0dXJlcyB3aGljaCB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGdlbmVyYXRlZCA9IChzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbdGV4VW5pdF1bV0lORUQzRFRTU19URVhDT09SRElOREVYXSAmIDB4RkZGRjAwMDApICE9IFdJTkVEM0RUU1NfVENJX1BBU1NUSFJVOwoKICAgIHNldF90ZXh0dXJlX21hdHJpeCgmc3RhdGVibG9jay0+dHJhbnNmb3Jtc1tXSU5FRDNEVFNfVEVYVFVSRTAgKyB0ZXhVbml0XS51Lm1bMF1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVt0ZXhVbml0XVtXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHU10sCiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bGFzdF93YXNfcmh3LAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnRleENvb3Jkc1t0ZXhVbml0XS5kd1N0cmlkZSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5zdHJpZGVkX3N0cmVhbXMudS5zLnRleENvb3Jkc1t0ZXhVbml0XS5kd1R5cGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVDTFRZUEVfVU5VU0VEKTsKCiAgICAvKiBUaGUgc2FtcGxlciBhcHBseWluZyBmdW5jdGlvbiBjYWxscyB1cyBpZiB0aGlzIGNoYW5nZXMgKi8KICAgIGlmKGNvbnRleHQtPmxhc3RXYXNQb3cyVGV4dHVyZVt0ZXhVbml0XSAmJiBzdGF0ZWJsb2NrLT50ZXh0dXJlc1t0ZXhVbml0XSkgewogICAgICAgIGlmKGdlbmVyYXRlZCkgewogICAgICAgICAgICBGSVhNRSgiTm9uLXBvd2VyMiB0ZXh0dXJlIGJlaW5nIHVzZWQgd2l0aCBnZW5lcmF0ZWQgdGV4dHVyZSBjb29yZHNcbiIpOwogICAgICAgIH0KICAgICAgICBUUkFDRSgiTm9uIHBvd2VyIHR3byBtYXRyaXggbXVsdGlwbHkgZml4dXBcbiIpOwogICAgICAgIGdsTXVsdE1hdHJpeGYoKChJV2luZUQzRFRleHR1cmVJbXBsICopIHN0YXRlYmxvY2stPnRleHR1cmVzW3RleFVuaXRdKS0+YmFzZVRleHR1cmUucG93Mk1hdHJpeCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHVubG9hZFRleENvb3JkcyhJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrKSB7CiAgICBpbnQgdGV4dHVyZV9pZHg7CgogICAgZm9yICh0ZXh0dXJlX2lkeCA9IDA7IHRleHR1cmVfaWR4IDwgR0xfTElNSVRTKHRleHR1cmVfc3RhZ2VzKTsgKyt0ZXh0dXJlX2lkeCkgewogICAgICAgIEdMX0VYVENBTEwoZ2xDbGllbnRBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIHRleHR1cmVfaWR4KSk7CiAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGxvYWRUZXhDb29yZHMoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZURpcmVjdDNEVmVydGV4U3RyaWRlZERhdGEgKnNkLCBHTGludCAqY3VyVkJPKSB7CiAgICBVSU5UICpvZmZzZXQgPSBzdGF0ZWJsb2NrLT5zdHJlYW1PZmZzZXQ7CiAgICB1bnNpZ25lZCBpbnQgbWFwcGVkX3N0YWdlID0gMDsKICAgIHVuc2lnbmVkIGludCB0ZXh0dXJlTm8gPSAwOwoKICAgIC8qIFRoZSBjb2RlIGJlbG93IHVzZXMgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIGFuZCBnbE11bHRpVGV4Q29vcmQqIHdoaWNoIGFyZSBhbGwgcGFydCBvZiB0aGUgR0xfQVJCX211bHRpdGV4dHVyZSBleHRlbnNpb24uICovCiAgICAvKiBBYm9ydCBpZiB3ZSBkb24ndCBzdXBwb3J0IHRoZSBleHRlbnNpb24uICovCiAgICBpZiAoIUdMX1NVUFBPUlQoQVJCX01VTFRJVEVYVFVSRSkpIHsKICAgICAgICBGSVhNRSgiUHJvZ3JhbSB1c2luZyBtdWx0aXBsZSBjb25jdXJyZW50IHRleHR1cmVzIHdoaWNoIHRoaXMgb3BlbmdsIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciAodGV4dHVyZU5vID0gMDsgdGV4dHVyZU5vIDwgR0xfTElNSVRTKHRleHR1cmVfc3RhZ2VzKTsgKyt0ZXh0dXJlTm8pIHsKICAgICAgICBpbnQgY29vcmRJZHggPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbdGV4dHVyZU5vXVtXSU5FRDNEVFNTX1RFWENPT1JESU5ERVhdOwoKICAgICAgICBtYXBwZWRfc3RhZ2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT50ZXhVbml0TWFwW3RleHR1cmVOb107CiAgICAgICAgaWYgKG1hcHBlZF9zdGFnZSA9PSAtMSkgY29udGludWU7CgogICAgICAgIGlmIChjb29yZElkeCA8IE1BWF9URVhUVVJFUyAmJiAoc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLmxwRGF0YSB8fCBzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uVkJPKSkgewogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyB1cCB0ZXh0dXJlICV1LCBpZHggJWQsIGNvcmRpbmR4ICV1LCBkYXRhICVwXG4iLAogICAgICAgICAgICAgICAgICAgIHRleHR1cmVObywgbWFwcGVkX3N0YWdlLCBjb29yZElkeCwgc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLmxwRGF0YSk7CgogICAgICAgICAgICBpZiAoKmN1clZCTyAhPSBzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uVkJPKSB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9BUlJBWV9CVUZGRVJfQVJCLCBzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uVkJPKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgICAgICAqY3VyVkJPID0gc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLlZCTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbENsaWVudEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgbWFwcGVkX3N0YWdlKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbENsaWVudEFjdGl2ZVRleHR1cmVBUkIiKTsKCiAgICAgICAgICAgIC8qIFRoZSBjb29yZHMgdG8gc3VwcGx5IGRlcGVuZCBjb21wbGV0ZWx5IG9uIHRoZSBmdmYgLyB2ZXJ0ZXggc2hhZGVyICovCiAgICAgICAgICAgIGdsVGV4Q29vcmRQb2ludGVyKAogICAgICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX1NJWkUoc2QtPnUucy50ZXhDb29yZHNbY29vcmRJZHhdLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5kd1R5cGUpLAogICAgICAgICAgICAgICAgICAgIHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5kd1N0cmlkZSwKICAgICAgICAgICAgICAgICAgICBzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0ubHBEYXRhICsgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHNkLT51LnMudGV4Q29vcmRzW2Nvb3JkSWR4XS5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLnRleENvb3Jkc1tjb29yZElkeF0uc3RyZWFtTm9dKTsKICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBHTF9FWFRDQUxMKGdsTXVsdGlUZXhDb29yZDRmQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSwgMCwgMCwgMCwgMSkpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChHTF9TVVBQT1JUKE5WX1JFR0lTVEVSX0NPTUJJTkVSUykpIHsKICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRoZSBtYXBwZWQgc3RhZ2VzIGluY3JlYXNlcyBtb25vdG9uaWNhbGx5LCBzbyBpdCdzIGZpbmUgdG8gdXNlIHRoZSBsYXN0IHVzZWQgb25lICovCiAgICAgICAgZm9yICh0ZXh0dXJlTm8gPSBtYXBwZWRfc3RhZ2UgKyAxOyB0ZXh0dXJlTm8gPCBHTF9MSU1JVFModGV4dHVyZXMpOyArK3RleHR1cmVObykgewogICAgICAgICAgICBHTF9FWFRDQUxMKGdsTXVsdGlUZXhDb29yZDRmQVJCKEdMX1RFWFRVUkUwX0FSQiArIHRleHR1cmVObywgMCwgMCwgMCwgMSkpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgdGV4X2Nvb3JkaW5kZXgoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBEV09SRCBzdGFnZSA9IChzdGF0ZSAtIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCAwKSkgLyBXSU5FRDNEX0hJR0hFU1RfVEVYVFVSRV9TVEFURTsKICAgIERXT1JEIG1hcHBlZF9zdGFnZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnRleFVuaXRNYXBbc3RhZ2VdOwoKICAgIGlmIChtYXBwZWRfc3RhZ2UgPT0gLTEpIHsKICAgICAgICBUUkFDRSgiTm8gdGV4dHVyZSB1bml0IG1hcHBlZCB0byBzdGFnZSAlZC4gU2tpcHBpbmcgdGV4dHVyZSBjb29yZGluYXRlcy5cbiIsIHN0YWdlKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKEdMX1NVUFBPUlQoQVJCX01VTFRJVEVYVFVSRSkpIHsKICAgICAgICBpZihtYXBwZWRfc3RhZ2UgPj0gR0xfTElNSVRTKGZyYWdtZW50X3NhbXBsZXJzKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEFjdGl2ZVRleHR1cmVBUkIiKTsKICAgIH0gZWxzZSBpZiAoc3RhZ2UgPiAwKSB7CiAgICAgICAgLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSAqLwogICAgICAgIFdBUk4oIlByb2dyYW0gdXNpbmcgbXVsdGlwbGUgY29uY3VycmVudCB0ZXh0dXJlcyB3aGljaCB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBWYWx1ZXMgMC03IGFyZSBpbmRleGVzIGludG8gdGhlIEZWRiB0ZXggY29vcmRzIC0gU2VlIGNvbW1lbnRzIGluIERyYXdQcmltaXRpdmUKICAgICAqCiAgICAgKiBGSVhNRTogRnJvbSBNU0ROOiBUaGUgV0lORUQzRFRTU19UQ0lfKiBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBJZiB5b3UgaW5jbHVkZQogICAgICogb25lIGZsYWcsIHlvdSBjYW4gc3RpbGwgc3BlY2lmeSBhbiBpbmRleCB2YWx1ZSwgd2hpY2ggdGhlIHN5c3RlbSB1c2VzIHRvCiAgICAgKiBkZXRlcm1pbmUgdGhlIHRleHR1cmUgd3JhcHBpbmcgbW9kZS4KICAgICAqIGVnLiBTZXRUZXh0dXJlU3RhZ2VTdGF0ZSggMCwgV0lORUQzRFRTU19URVhDT09SRElOREVYLCBXSU5FRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OIHwgMSApOwogICAgICogbWVhbnMgdXNlIHRoZSB2ZXJ0ZXggcG9zaXRpb24gKGNhbWVyYS1zcGFjZSkgYXMgdGhlIGlucHV0IHRleHR1cmUgY29vcmRpbmF0ZXMKICAgICAqIGZvciB0aGlzIHRleHR1cmUgc3RhZ2UsIGFuZCB0aGUgd3JhcCBtb2RlIHNldCBpbiB0aGUgV0lORUQzRFJTX1dSQVAxIHJlbmRlcgogICAgICogc3RhdGUuIFdlIGRvIG5vdCAoeWV0KSBzdXBwb3J0IHRoZSBXSU5FRDNEUkVOREVSU1RBVEVfV1JBUHggdmFsdWVzLCBub3IgdGllIHRoZW0gdXAKICAgICAqIHRvIHRoZSBURVhDT09SRElOREVYIHZhbHVlCiAgICAgKi8KCiAgICAvKgogICAgICogQmUgY2FyZWZ1bCB0aGUgdmFsdWUgb2YgdGhlIG1hc2sgMHhGMDAwMCBjb21lIGZyb20gZDNkOHR5cGVzLmggaW5mb3MKICAgICAqLwogICAgc3dpdGNoIChzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWF0gJiAweEZGRkYwMDAwKSB7CiAgICBjYXNlIFdJTkVEM0RUU1NfVENJX1BBU1NUSFJVOgogICAgICAgIC8qVXNlIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBjb29yZGluYXRlcyBjb250YWluZWQgd2l0aGluIHRoZSB2ZXJ0ZXggZm9ybWF0LiBUaGlzIHZhbHVlIHJlc29sdmVzIHRvIHplcm8uKi8KICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUyk7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1QpOwogICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9URVhUVVJFX0dFTl9TLFQsUixRKSIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0lORUQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VQT1NJVElPTjoKICAgICAgICAvKiBDYW1lcmFTcGFjZVBvc2l0aW9uIG1lYW5zIHVzZSB0aGUgdmVydGV4IHBvc2l0aW9uLCB0cmFuc2Zvcm1lZCB0byBjYW1lcmEgc3BhY2UsCiAgICAgICAgICogYXMgdGhlIGlucHV0IHRleHR1cmUgY29vcmRpbmF0ZXMgZm9yIHRoaXMgc3RhZ2UncyB0ZXh0dXJlIHRyYW5zZm9ybWF0aW9uLiBUaGlzCiAgICAgICAgICogZXF1YXRlcyByb3VnaGx5IHRvIEVZRV9MSU5FQVIKICAgICAgICAgKi8KICAgICAgICB7CiAgICAgICAgICAgIGZsb2F0IHNfcGxhbmVbXSA9IHsgMS4wLCAwLjAsIDAuMCwgMC4wIH07CiAgICAgICAgICAgIGZsb2F0IHRfcGxhbmVbXSA9IHsgMC4wLCAxLjAsIDAuMCwgMC4wIH07CiAgICAgICAgICAgIGZsb2F0IHJfcGxhbmVbXSA9IHsgMC4wLCAwLjAsIDEuMCwgMC4wIH07CiAgICAgICAgICAgIGZsb2F0IHFfcGxhbmVbXSA9IHsgMC4wLCAwLjAsIDAuMCwgMS4wIH07CiAgICAgICAgICAgIFRSQUNFKCJXSU5FRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OIC0gU2V0IGV5ZSBwbGFuZVxuIik7CgogICAgICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7CiAgICAgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICAgICAgICAgIGdsVGV4R2VuZnYoR0xfUywgR0xfRVlFX1BMQU5FLCBzX3BsYW5lKTsKICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9ULCBHTF9FWUVfUExBTkUsIHRfcGxhbmUpOwogICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1IsIEdMX0VZRV9QTEFORSwgcl9wbGFuZSk7CiAgICAgICAgICAgIGdsVGV4R2VuZnYoR0xfUSwgR0xfRVlFX1BMQU5FLCBxX3BsYW5lKTsKICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKCiAgICAgICAgICAgIFRSQUNFKCJXSU5FRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OIC0gU2V0IEdMX1RFWFRVUkVfR0VOX3ggYW5kIEdMX3gsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX0VZRV9MSU5FQVJcbiIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9TKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1MpIik7CiAgICAgICAgICAgIGdsVGV4R2VuaShHTF9TLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9TLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKSIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9UKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1QpIik7CiAgICAgICAgICAgIGdsVGV4R2VuaShHTF9ULCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9ULCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKSIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1IpIik7CiAgICAgICAgICAgIGdsVGV4R2VuaShHTF9SLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9SLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9FWUVfTElORUFSKSIpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFdJTkVEM0RUU1NfVENJX0NBTUVSQVNQQUNFTk9STUFMOgogICAgICAgIHsKICAgICAgICAgICAgaWYgKEdMX1NVUFBPUlQoTlZfVEVYR0VOX1JFRkxFQ1RJT04pKSB7CiAgICAgICAgICAgICAgICBmbG9hdCBzX3BsYW5lW10gPSB7IDEuMCwgMC4wLCAwLjAsIDAuMCB9OwogICAgICAgICAgICAgICAgZmxvYXQgdF9wbGFuZVtdID0geyAwLjAsIDEuMCwgMC4wLCAwLjAgfTsKICAgICAgICAgICAgICAgIGZsb2F0IHJfcGxhbmVbXSA9IHsgMC4wLCAwLjAsIDEuMCwgMC4wIH07CiAgICAgICAgICAgICAgICBmbG9hdCBxX3BsYW5lW10gPSB7IDAuMCwgMC4wLCAwLjAsIDEuMCB9OwogICAgICAgICAgICAgICAgVFJBQ0UoIldJTkVEM0RUU1NfVENJX0NBTUVSQVNQQUNFTk9STUFMIC0gU2V0IGV5ZSBwbGFuZVxuIik7CgogICAgICAgICAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgICAgICAgICAgICBnbFB1c2hNYXRyaXgoKTsKICAgICAgICAgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICAgICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1MsIEdMX0VZRV9QTEFORSwgc19wbGFuZSk7CiAgICAgICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1QsIEdMX0VZRV9QTEFORSwgdF9wbGFuZSk7CiAgICAgICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1IsIEdMX0VZRV9QTEFORSwgcl9wbGFuZSk7CiAgICAgICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1EsIEdMX0VZRV9QTEFORSwgcV9wbGFuZSk7CiAgICAgICAgICAgICAgICBnbFBvcE1hdHJpeCgpOwoKICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1MpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1MpIik7CiAgICAgICAgICAgICAgICBnbFRleEdlbmkoR0xfUywgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfTk9STUFMX01BUF9OVik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1MsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX05PUk1BTF9NQVBfTlYpIik7CiAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9UKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9UKSIpOwogICAgICAgICAgICAgICAgZ2xUZXhHZW5pKEdMX1QsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX05PUk1BTF9NQVBfTlYpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9ULCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9OT1JNQUxfTUFQX05WKSIpOwogICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUikiKTsKICAgICAgICAgICAgICAgIGdsVGV4R2VuaShHTF9SLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9OT1JNQUxfTUFQX05WKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEdlbmkoR0xfUiwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfTk9STUFMX01BUF9OVikiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFdJTkVEM0RUU1NfVENJX0NBTUVSQVNQQUNFUkVGTEVDVElPTlZFQ1RPUjoKICAgICAgICB7CiAgICAgICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX1RFWEdFTl9SRUZMRUNUSU9OKSkgewogICAgICAgICAgICBmbG9hdCBzX3BsYW5lW10gPSB7IDEuMCwgMC4wLCAwLjAsIDAuMCB9OwogICAgICAgICAgICBmbG9hdCB0X3BsYW5lW10gPSB7IDAuMCwgMS4wLCAwLjAsIDAuMCB9OwogICAgICAgICAgICBmbG9hdCByX3BsYW5lW10gPSB7IDAuMCwgMC4wLCAxLjAsIDAuMCB9OwogICAgICAgICAgICBmbG9hdCBxX3BsYW5lW10gPSB7IDAuMCwgMC4wLCAwLjAsIDEuMCB9OwogICAgICAgICAgICBUUkFDRSgiV0lORUQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VSRUZMRUNUSU9OVkVDVE9SIC0gU2V0IGV5ZSBwbGFuZVxuIik7CgogICAgICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKICAgICAgICAgICAgZ2xQdXNoTWF0cml4KCk7CiAgICAgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICAgICAgICAgIGdsVGV4R2VuZnYoR0xfUywgR0xfRVlFX1BMQU5FLCBzX3BsYW5lKTsKICAgICAgICAgICAgZ2xUZXhHZW5mdihHTF9ULCBHTF9FWUVfUExBTkUsIHRfcGxhbmUpOwogICAgICAgICAgICBnbFRleEdlbmZ2KEdMX1IsIEdMX0VZRV9QTEFORSwgcl9wbGFuZSk7CiAgICAgICAgICAgIGdsVGV4R2VuZnYoR0xfUSwgR0xfRVlFX1BMQU5FLCBxX3BsYW5lKTsKICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKCiAgICAgICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1MpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUykiKTsKICAgICAgICAgICAgZ2xUZXhHZW5pKEdMX1MsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX1JFRkxFQ1RJT05fTUFQX05WKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4R2VuaShHTF9TLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9SRUZMRUNUSU9OX01BUF9OVikiKTsKICAgICAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9UKSIpOwogICAgICAgICAgICBnbFRleEdlbmkoR0xfVCwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfUkVGTEVDVElPTl9NQVBfTlYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhHZW5pKEdMX1QsIEdMX1RFWFRVUkVfR0VOX01PREUsIEdMX1JFRkxFQ1RJT05fTUFQX05WKSIpOwogICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1IpIik7CiAgICAgICAgICAgIGdsVGV4R2VuaShHTF9SLCBHTF9URVhUVVJFX0dFTl9NT0RFLCBHTF9SRUZMRUNUSU9OX01BUF9OVik7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEdlbmkoR0xfUiwgR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0xfUkVGTEVDVElPTl9NQVBfTlYpIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgLyogVW5oYW5kbGVkIHR5cGVzOiAqLwogICAgZGVmYXVsdDoKICAgICAgICAvKiBUb2RvOiAqLwogICAgICAgIC8qID8gZGlzYWJsZSBHTF9URVhUVVJFX0dFTl9uID8gKi8KICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUyk7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1QpOwogICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUSk7CiAgICAgICAgRklYTUUoIlVuaGFuZGxlZCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggJXhcbiIsIHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19URVhDT09SRElOREVYXSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogVXBkYXRlIHRoZSB0ZXh0dXJlIG1hdHJpeCAqLwogICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUwICsgc3RhZ2UpKSkgewogICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTAgKyBzdGFnZSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgfQoKICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkRFQ0wpICYmIGNvbnRleHQtPm5hbWVkQXJyYXlzTG9hZGVkKSB7CiAgICAgICAgLyogUmVsb2FkIHRoZSBhcnJheXMgaWYgd2UgYXJlIHVzaW5nIGZpeGVkIGZ1bmN0aW9uIGFycmF5cyB0byByZWZsZWN0IHRoZSBzZWxlY3RlZCBjb29yZCBpbnB1dAogICAgICAgICAqIHNvdXJjZS4gQ2FsbCBsb2FkVGV4Q29vcmRzIGRpcmVjdGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBhcnNlIHRoZSB2ZXJ0ZXggZGVjbGFyYXRpb24KICAgICAgICAgKiBhbmQgZG8gYWxsIHRoZSB0aGluZ3MgbGlua2VkIHRvIGl0CiAgICAgICAgICogVE9ETzogVGlkeSB0aGF0IHVwIHRvIHJlbG9hZCBvbmx5IHRoZSBhcnJheXMgb2YgdGhlIGNoYW5nZWQgdW5pdAogICAgICAgICAqLwogICAgICAgIEdMaW50IGN1clZCTyA9IEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CVUZGRVJfT0JKRUNUKSA/IC0xIDogMDsKCiAgICAgICAgdW5sb2FkVGV4Q29vcmRzKHN0YXRlYmxvY2spOwogICAgICAgIGxvYWRUZXhDb29yZHMoc3RhdGVibG9jaywgJnN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnN0cmlkZWRfc3RyZWFtcywgJmN1clZCTyk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHNoYWRlcmNvbnN0YW50KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgSVdpbmVEM0REZXZpY2VJbXBsICpkZXZpY2UgPSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlOwoKICAgIC8qIFZlcnRleCBhbmQgcGl4ZWwgc2hhZGVyIHN0YXRlcyB3aWxsIGNhbGwgYSBzaGFkZXIgdXBsb2FkLCBkb24ndCBkbyBhbnl0aGluZyBhcyBsb25nIG9uZSBvZiB0aGVtCiAgICAgKiBoYXMgYW4gdXBkYXRlIHBlbmRpbmcKICAgICAqLwogICAgaWYoaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1ZERUNMKSB8fAogICAgICAgaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSKSkgewogICAgICAgcmV0dXJuOwogICAgfQoKICAgIGRldmljZS0+c2hhZGVyX2JhY2tlbmQtPnNoYWRlcl9sb2FkX2NvbnN0YW50cygoSVdpbmVEM0REZXZpY2UgKikgZGV2aWNlLCB1c2VfcHMoZGV2aWNlKSwgdXNlX3ZzKGRldmljZSkpOwp9CgpzdGF0aWMgdm9pZCB0ZXhfYnVtcGVudmxzY2FsZShEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHN0YWdlID0gKHN0YXRlIC0gU1RBVEVfVEVYVFVSRVNUQUdFKDAsIDApKSAvIFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFOwogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CgogICAgaWYoc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIgJiYgc3RhZ2UgIT0gMCAmJgogICAgICAgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKSBzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciktPmJhc2VTaGFkZXIucmVnX21hcHMubHVtaW5hbmNlcGFyYW1zW3N0YWdlXSkgewogICAgICAgIC8qIFRoZSBwaXhlbCBzaGFkZXIgaGFzIHRvIGtub3cgdGhlIGx1bWluYW5jZSBzY2FsZS4gRG8gYSBjb25zdGFudHMgdXBkYXRlIGlmIGl0CiAgICAgICAgICogaXNuJ3Qgc2NoZWR1bGVkIGFueXdheQogICAgICAgICAqLwogICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUElYRUxTSEFERVJDT05TVEFOVCkgJiYKICAgICAgICAgICAhaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSKSkgewogICAgICAgICAgICBzaGFkZXJjb25zdGFudChTVEFURV9QSVhFTFNIQURFUkNPTlNUQU5ULCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgdG1wdmFsdWUuZCA9IHN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFXTsKICAgIGlmKHRtcHZhbHVlLmYgIT0gMC4wKSB7CiAgICAgICAgRklYTUUoIldJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSBub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRleF9idW1wZW52bG9mZnNldChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIERXT1JEIHN0YWdlID0gKHN0YXRlIC0gU1RBVEVfVEVYVFVSRVNUQUdFKDAsIDApKSAvIFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFOwogICAgdW5pb24gewogICAgICAgIERXT1JEIGQ7CiAgICAgICAgZmxvYXQgZjsKICAgIH0gdG1wdmFsdWU7CgogICAgaWYoc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIgJiYgc3RhZ2UgIT0gMCAmJgogICAgICAgKChJV2luZUQzRFBpeGVsU2hhZGVySW1wbCAqKSBzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciktPmJhc2VTaGFkZXIucmVnX21hcHMubHVtaW5hbmNlcGFyYW1zW3N0YWdlXSkgewogICAgICAgIC8qIFRoZSBwaXhlbCBzaGFkZXIgaGFzIHRvIGtub3cgdGhlIGx1bWluYW5jZSBvZmZzZXQuIERvIGEgY29uc3RhbnRzIHVwZGF0ZSBpZiBpdAogICAgICAgICAqIGlzbid0IHNjaGVkdWxlZCBhbnl3YXkKICAgICAgICAgKi8KICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSQ09OU1RBTlQpICYmCiAgICAgICAgICAgIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9QSVhFTFNIQURFUikpIHsKICAgICAgICAgICAgc2hhZGVyY29uc3RhbnQoU1RBVEVfUElYRUxTSEFERVJDT05TVEFOVCwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQogICAgfQoKICAgIHRtcHZhbHVlLmQgPSBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVRdOwogICAgaWYodG1wdmFsdWUuZiAhPSAwLjApIHsKICAgICAgICBGSVhNRSgiV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCBub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHNhbXBsZXIoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBEV09SRCBzYW1wbGVyID0gc3RhdGUgLSBTVEFURV9TQU1QTEVSKDApOwogICAgRFdPUkQgbWFwcGVkX3N0YWdlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dGV4VW5pdE1hcFtzYW1wbGVyXTsKICAgIHVuaW9uIHsKICAgICAgICBmbG9hdCBmOwogICAgICAgIERXT1JEIGQ7CiAgICB9IHRtcHZhbHVlOwoKICAgIFRSQUNFKCJTYW1wbGVyOiAlZFxuIiwgc2FtcGxlcik7CiAgICAvKiBFbmFibGluZyBhbmQgZGlzYWJsaW5nIHRleHR1cmUgZGltZW5zaW9ucyBpcyBkb25lIGJ5IHRleHR1cmUgc3RhZ2Ugc3RhdGUgLyBwaXhlbCBzaGFkZXIgc2V0dXAsIHRoaXMgZnVuY3Rpb24KICAgICAqIG9ubHkgaGFzIHRvIGJpbmQgdGV4dHVyZXMgYW5kIHNldCB0aGUgcGVyIHRleHR1cmUgc3RhdGVzCiAgICAgKi8KCiAgICBpZiAobWFwcGVkX3N0YWdlID09IC0xKSB7CiAgICAgICAgVFJBQ0UoIk5vIHNhbXBsZXIgbWFwcGVkIHRvIHN0YWdlICVkLiBSZXR1cm5pbmcuXG4iLCBzYW1wbGVyKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKEdMX1NVUFBPUlQoQVJCX01VTFRJVEVYVFVSRSkpIHsKICAgICAgICBpZiAobWFwcGVkX3N0YWdlID49IEdMX0xJTUlUUyhjb21iaW5lZF9zYW1wbGVycykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBtYXBwZWRfc3RhZ2UpKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CiAgICB9IGVsc2UgaWYgKHNhbXBsZXIgPiAwKSB7CiAgICAgICAgLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgaGVyZSAqLwogICAgICAgIFdBUk4oIlByb2dyYW0gdXNpbmcgbXVsdGlwbGUgY29uY3VycmVudCB0ZXh0dXJlcyB3aGljaCB0aGlzIG9wZW5nbCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnRcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZihzdGF0ZWJsb2NrLT50ZXh0dXJlc1tzYW1wbGVyXSkgewogICAgICAgIEJPT0wgdGV4SXNQb3cyID0gRkFMU0U7CgogICAgICAgIC8qIFRoZSBmaXhlZCBmdW5jdGlvbiBucDIgdGV4dHVyZSBlbXVsYXRpb24gdXNlcyB0aGUgdGV4dHVyZSBtYXRyaXggdG8gZml4IHVwIHRoZSBjb29yZGluYXRlcwogICAgICAgICAqIElXaW5lRDNEQmFzZVRleHR1cmU6OkFwcGx5U3RhdGVDaGFuZ2VzIG11bHRpcGxpZXMgdGhlIHNldCBtYXRyaXggd2l0aCBhIGZpeHVwIG1hdHJpeC4gQmVmb3JlIHRoZQogICAgICAgICAqIHNjYWxpbmcgaXMgcmVhcHBsaWVkIG9yIHJlbW92ZWQsIHRoZSB0ZXh0dXJlIG1hdHJpeCBoYXMgdG8gYmUgcmVhcHBsaWVkCiAgICAgICAgICovCiAgICAgICAgaWYoIUdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfTk9OX1BPV0VSX09GX1RXTykgJiYgc2FtcGxlciA8IE1BWF9URVhUVVJFUykgewogICAgICAgICAgICBpZihzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1tzYW1wbGVyXSA9PSBHTF9URVhUVVJFXzJEIHx8CiAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnRleHR1cmVEaW1lbnNpb25zW3NhbXBsZXJdID09IEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQikgewogICAgICAgICAgICAgICAgaWYoKChJV2luZUQzRFRleHR1cmVJbXBsICopIHN0YXRlYmxvY2stPnRleHR1cmVzW3NhbXBsZXJdKS0+YmFzZVRleHR1cmUucG93Mk1hdHJpeFswXSAhPSAxLjAgfHwKICAgICAgICAgICAgICAgICAgICgoSVdpbmVEM0RUZXh0dXJlSW1wbCAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1tzYW1wbGVyXSktPmJhc2VUZXh0dXJlLnBvdzJNYXRyaXhbNV0gIT0gMS4wICkgewogICAgICAgICAgICAgICAgICAgIHRleElzUG93MiA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihzdGF0ZWJsb2NrLT50ZXh0dXJlRGltZW5zaW9uc1tzYW1wbGVyXSA9PSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSQikgewogICAgICAgICAgICAgICAgaWYoKChJV2luZUQzREN1YmVUZXh0dXJlSW1wbCAqKSBzdGF0ZWJsb2NrLT50ZXh0dXJlc1tzYW1wbGVyXSktPmJhc2VUZXh0dXJlLnBvdzJNYXRyaXhbMF0gIT0gMS4wKSB7CiAgICAgICAgICAgICAgICAgICAgdGV4SXNQb3cyID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYodGV4SXNQb3cyIHx8IGNvbnRleHQtPmxhc3RXYXNQb3cyVGV4dHVyZVtzYW1wbGVyXSkgewogICAgICAgICAgICAgICAgY29udGV4dC0+bGFzdFdhc1BvdzJUZXh0dXJlW3NhbXBsZXJdID0gdGV4SXNQb3cyOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMCArIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnRleFVuaXRNYXBbc2FtcGxlcl0pLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgSVdpbmVEM0RCYXNlVGV4dHVyZV9QcmVMb2FkKHN0YXRlYmxvY2stPnRleHR1cmVzW3NhbXBsZXJdKTsKICAgICAgICBJV2luZUQzREJhc2VUZXh0dXJlX0FwcGx5U3RhdGVDaGFuZ2VzKHN0YXRlYmxvY2stPnRleHR1cmVzW3NhbXBsZXJdLCBzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc2FtcGxlcl0sIHN0YXRlYmxvY2stPnNhbXBsZXJTdGF0ZVtzYW1wbGVyXSk7CgogICAgICAgIGlmIChHTF9TVVBQT1JUKEVYVF9URVhUVVJFX0xPRF9CSUFTKSkgewogICAgICAgICAgICB0bXB2YWx1ZS5kID0gc3RhdGVibG9jay0+c2FtcGxlclN0YXRlW3NhbXBsZXJdW1dJTkVEM0RTQU1QX01JUE1BUExPREJJQVNdOwogICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTF9FWFQsCiAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0xPRF9CSUFTX0VYVCwKICAgICAgICAgICAgICAgICAgICAgIHRtcHZhbHVlLmYpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xUZXhFbnZpKEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhULCAuLi4pIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+cHNfc2VsZWN0ZWRfbW9kZSAhPSBTSEFERVJfTk9ORSAmJiBzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciAmJgogICAgICAgICAgICAoKElXaW5lRDNEUGl4ZWxTaGFkZXJJbXBsICopc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIpLT5iYXNlU2hhZGVyLmZ1bmN0aW9uKSB7CiAgICAgICAgICAgIC8qIFVzaW5nIGEgcGl4ZWwgc2hhZGVyPyBWZXJpZnkgdGhlIHNhbXBsZXIgdHlwZXMgKi8KCiAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXh0dXJlIGRpbWVuc2lvbnMgYXJlIGVuYWJsZWQuIEkgZG9uJ3QgaGF2ZSB0byBkaXNhYmxlIHRoZSBvdGhlcgogICAgICAgICAgICAgKiBkaW1lbnNpb25zIGJlY2F1c2UgdGhlIHNoYWRlciBrbm93cyBmcm9tIHdoaWNoIHRleHR1cmUgdHlwZSB0byBzYW1wbGUgZnJvbS4gRm9yIHRoZSBzYWtlIG9mCiAgICAgICAgICAgICAqIGRlYnVnZ2luZyBhbGwgZGltZW5zaW9ucyBjb3VsZCBiZSBlbmFibGVkIGFuZCBhIHRleHR1cmUgd2l0aCBzb21lIHVnbHkgcGluayBib3VuZCB0byB0aGUgdW51c2VkCiAgICAgICAgICAgICAqIGRpbWVuc2lvbnMuIFRoaXMgc2hvdWxkIG1ha2Ugd3Jvbmcgc2FtcGxpbmcgc291cmNlcyB2aXNpYmxlIDotKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2xFbmFibGUoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbc2FtcGxlcl0pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoc3RhdGVibG9jay0+dGV4dHVyZURpbWVuc2lvbnNbc2FtcGxlcl0pIik7CiAgICAgICAgfSBlbHNlIGlmKHNhbXBsZXIgPCBzdGF0ZWJsb2NrLT5sb3dlc3RfZGlzYWJsZWRfc3RhZ2UpIHsKICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9URVhUVVJFU1RBR0Uoc2FtcGxlciwgV0lORUQzRFRTU19DT0xPUk9QKSkpIHsKICAgICAgICAgICAgICAgIHRleHR1cmVfYWN0aXZhdGVfZGltZW5zaW9ucyhzYW1wbGVyLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SS0VZRU5BQkxFXSAmJiBzYW1wbGVyID09IDApIHsKICAgICAgICAgICAgICAgIC8qIElmIGNvbG9yIGtleWluZyBpcyBlbmFibGVkIHVwZGF0ZSB0aGUgYWxwaGEgdGVzdCwgaXQgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlCiAgICAgICAgICAgICAgICAgKiBvZiBhIGNvbG9yIGtleSBpbiBzdGFnZSAwCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHN0YXRlX2FscGhhKFdJTkVEM0RSU19DT0xPUktFWUVOQUJMRSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYobWFwcGVkX3N0YWdlIDwgR0xfTElNSVRTKHRleHR1cmVzKSkgewogICAgICAgIGlmKHNhbXBsZXIgPCBzdGF0ZWJsb2NrLT5sb3dlc3RfZGlzYWJsZWRfc3RhZ2UpIHsKICAgICAgICAgICAgLyogVE9ETzogV2hhdCBzaG91bGQgSSBkbyB3aXRoIHBpeGVsIHNoYWRlcnMgaGVyZSA/Pz8gKi8KICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9URVhUVVJFU1RBR0Uoc2FtcGxlciwgV0lORUQzRFRTU19DT0xPUk9QKSkpIHsKICAgICAgICAgICAgICAgIHRleHR1cmVfYWN0aXZhdGVfZGltZW5zaW9ucyhzYW1wbGVyLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX0NPTE9SS0VZRU5BQkxFXSAmJiBzYW1wbGVyID09IDApIHsKICAgICAgICAgICAgICAgIC8qIElmIGNvbG9yIGtleWluZyBpcyBlbmFibGVkIHVwZGF0ZSB0aGUgYWxwaGEgdGVzdCwgaXQgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlCiAgICAgICAgICAgICAgICAqIG9mIGEgY29sb3Iga2V5IGluIHN0YWdlIDAKICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBzdGF0ZV9hbHBoYShXSU5FRDNEUlNfQ09MT1JLRVlFTkFCTEUsIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSAvKiBPdGhlcndpc2UgdGV4X2NvbG9yb3AgZGlzYWJsZXMgdGhlIHN0YWdlICovCiAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5kdW1teVRleHR1cmVOYW1lW3NhbXBsZXJdKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5kdW1teVRleHR1cmVOYW1lW3NhbXBsZXJdKSIpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBwaXhlbHNoYWRlcihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2aWNlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZTsKICAgIEJPT0wgdXNlX3BzaGFkZXIgPSB1c2VfcHMoZGV2aWNlKTsKICAgIEJPT0wgdXNlX3ZzaGFkZXIgPSB1c2VfdnMoZGV2aWNlKTsKICAgIEJPT0wgdXBkYXRlX2ZvZyA9IEZBTFNFOwogICAgaW50IGk7CgogICAgaWYgKHVzZV9wc2hhZGVyKSB7CiAgICAgICAgaWYoIWNvbnRleHQtPmxhc3Rfd2FzX3BzaGFkZXIpIHsKICAgICAgICAgICAgLyogRm9ybWVyIGRyYXcgd2l0aG91dCBhIHBpeGVsIHNoYWRlciwgc29tZSBzYW1wbGVycwogICAgICAgICAgICAgKiBtYXkgYmUgZGlzYWJsZWQgYmVjYXVzZSBvZiBXSU5FRDNEVFNTX0NPTE9ST1AgPSBXSU5FRDNEVE9QX0RJU0FCTEUKICAgICAgICAgICAgICogbWFrZSBzdXJlIHRvIGVuYWJsZSB0aGVtCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb3IoaT0wOyBpIDwgTUFYX0ZSQUdNRU5UX1NBTVBMRVJTOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfU0FNUExFUihpKSkpIHsKICAgICAgICAgICAgICAgICAgICBzYW1wbGVyKFNUQVRFX1NBTVBMRVIoaSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZV9mb2cgPSBUUlVFOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLyogT3RoZXJ3aXNlIGFsbCBzYW1wbGVycyB3ZXJlIGFjdGl2YXRlZCBieSB0aGUgY29kZSBhYm92ZSBpbiBlYXJsaWVyIGRyYXdzLCBvciBieSBzYW1wbGVyKCkKICAgICAgICAgICAgKiBpZiBhIGRpZmZlcmVudCB0ZXh0dXJlIHdhcyBib3VuZC4gSSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLgogICAgICAgICAgICAqLwogICAgICAgIH0KCiAgICAgICAgLyogQ29tcGlsZSBhbmQgYmluZCB0aGUgc2hhZGVyICovCiAgICAgICAgSVdpbmVEM0RQaXhlbFNoYWRlcl9Db21waWxlU2hhZGVyKHN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogRGlzYWJsZWQgdGhlIHBpeGVsIHNoYWRlciAtIGNvbG9yIG9wcyB3ZXJlbid0IGFwcGxpZWQKICAgICAgICAgKiB3aGlsZSBpdCB3YXMgZW5hYmxlZCwgc28gcmUtYXBwbHkgdGhlbS4KICAgICAgICAgKi8KICAgICAgICBmb3IoaT0wOyBpIDwgTUFYX1RFWFRVUkVTOyBpKyspIHsKICAgICAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9URVhUVVJFU1RBR0UoaSwgV0lORUQzRFRTU19DT0xPUk9QKSkpIHsKICAgICAgICAgICAgICAgIHRleF9jb2xvcm9wKFNUQVRFX1RFWFRVUkVTVEFHRShpLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihjb250ZXh0LT5sYXN0X3dhc19wc2hhZGVyKQogICAgICAgICAgICB1cGRhdGVfZm9nID0gVFJVRTsKICAgIH0KCiAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIEZGUFN0YXRlVGFibGVbU1RBVEVfVlNIQURFUl0ucmVwcmVzZW50YXRpdmUpKSB7CiAgICAgICAgZGV2aWNlLT5zaGFkZXJfYmFja2VuZC0+c2hhZGVyX3NlbGVjdCgoSVdpbmVEM0REZXZpY2UgKilzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLCB1c2VfcHNoYWRlciwgdXNlX3ZzaGFkZXIpOwoKICAgICAgICBpZiAoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WRVJURVhTSEFERVJDT05TVEFOVCkgJiYgKHVzZV92c2hhZGVyIHx8IHVzZV9wc2hhZGVyKSkgewogICAgICAgICAgICBzaGFkZXJjb25zdGFudChTVEFURV9WRVJURVhTSEFERVJDT05TVEFOVCwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQogICAgfQoKICAgIGlmKHVwZGF0ZV9mb2cpCiAgICAgICAgc3RhdGVfZm9nKHN0YXRlLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKCiAgICBjb250ZXh0LT5sYXN0X3dhc19wc2hhZGVyID0gdXNlX3BzaGFkZXI7Cn0KCnN0YXRpYyB2b2lkIHRleF9idW1wZW52bWF0KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgRFdPUkQgc3RhZ2UgPSAoc3RhdGUgLSBTVEFURV9URVhUVVJFU1RBR0UoMCwgMCkpIC8gV0lORUQzRF9ISUdIRVNUX1RFWFRVUkVfU1RBVEU7CiAgICBmbG9hdCBtYXRbMl1bMl07CiAgICBpZihzdGF0ZWJsb2NrLT5waXhlbFNoYWRlciAmJiBzdGFnZSAhPSAwICYmCiAgICAgICAoKElXaW5lRDNEUGl4ZWxTaGFkZXJJbXBsICopIHN0YXRlYmxvY2stPnBpeGVsU2hhZGVyKS0+YmFzZVNoYWRlci5yZWdfbWFwcy5idW1wbWF0W3N0YWdlXSkgewogICAgICAgIC8qIFRoZSBwaXhlbCBzaGFkZXIgaGFzIHRvIGtub3cgdGhlIGJ1bXAgZW52IG1hdHJpeC4gRG8gYSBjb25zdGFudHMgdXBkYXRlIGlmIGl0IGlzbid0IHNjaGVkdWxlZAogICAgICAgICAqIGFueXdheQogICAgICAgICAqLwogICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUElYRUxTSEFERVJDT05TVEFOVCkgJiYKICAgICAgICAgICAhaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSKSkgewogICAgICAgICAgICBzaGFkZXJjb25zdGFudChTVEFURV9QSVhFTFNIQURFUkNPTlNUQU5ULCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgaWYoR0xfU1VQUE9SVChBVElfRU5WTUFQX0JVTVBNQVApKSB7CiAgICAgICAgaWYoc3RhZ2UgPj0gR0xfTElNSVRTKHRleHR1cmVfc3RhZ2VzKSkgewogICAgICAgICAgICBXQVJOKCJCdW1wIGVudiBtYXRyaXggb2YgdW5zdXBwb3J0ZWQgc3RhZ2Ugc2V0XG4iKTsKICAgICAgICB9IGVsc2UgaWYoR0xfU1VQUE9SVChBUkJfTVVMVElURVhUVVJFKSkgewogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBzdGFnZSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgc3RhZ2UpKSIpOwogICAgICAgIH0KICAgICAgICBtYXRbMF1bMF0gPSAqKChmbG9hdCAqKSAmc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMF0pOwogICAgICAgIG1hdFsxXVswXSA9ICooKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDAxXSk7CiAgICAgICAgbWF0WzBdWzFdID0gKigoZmxvYXQgKikgJnN0YXRlYmxvY2stPnRleHR1cmVTdGF0ZVtzdGFnZV1bV0lORUQzRFRTU19CVU1QRU5WTUFUMTBdKTsKICAgICAgICBtYXRbMV1bMV0gPSAqKChmbG9hdCAqKSAmc3RhdGVibG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMV0pOwogICAgICAgIEdMX0VYVENBTEwoZ2xUZXhCdW1wUGFyYW1ldGVyZnZBVEkoR0xfQlVNUF9ST1RfTUFUUklYX0FUSSwgKGZsb2F0ICopIG1hdCkpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSIpOwogICAgfSBlbHNlIGlmKEdMX1NVUFBPUlQoTlZfVEVYVFVSRV9TSEFERVIyKSkgewogICAgICAgIC8qIERpcmVjdDNEIHNldHMgdGhlIG1hdHJpeCBpbiB0aGUgc3RhZ2UgcmVhZGluZyB0aGUgcGVydHVyYmF0aW9uIG1hcC4gVGhlIHJlc3VsdCBpcyB1c2VkIHRvCiAgICAgICAgICogb2Zmc2V0IHRoZSBkZXN0aW5hdGlvbiBzdGFnZShhbHdheXMgc3RhZ2UgKyAxIGluIGQzZCkuIEluIEdMX05WX3RleHR1cmVfc2hhZGVyLCB0aGUgYnVtcAogICAgICAgICAqIG1hcCBvZmZzZXR0aW5nIGlzIGRvbmUgaW4gdGhlIHN0YWdlIHJlYWRpbmcgdGhlIGJ1bXAgbWFwcGVkIHRleHR1cmUsIGFuZCB0aGUgcGVydHVyYmF0aW9uCiAgICAgICAgICogbWFwIGlzIHJlYWQgZnJvbSBhIHNwZWNpZmllZCBzb3VyY2Ugc3RhZ2UoYWx3YXlzIHN0YWdlIC0gMSBmb3IgZDNkKS4gVGh1cyBzZXQgdGhlIG1hdHJpeAogICAgICAgICAqIGZvciBzdGFnZSArIDEuIEtlZXAgdGhlIG52cmMgdGV4IHVuaXQgbWFwcGluZyBpbiBtaW5kIHRvbwogICAgICAgICAqLwogICAgICAgIERXT1JEIG1hcHBlZF9zdGFnZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnRleFVuaXRNYXBbc3RhZ2UgKyAxXTsKCiAgICAgICAgaWYobWFwcGVkX3N0YWdlIDwgR0xfTElNSVRTKHRleHR1cmVzKSkgewogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQWN0aXZlVGV4dHVyZUFSQihHTF9URVhUVVJFMF9BUkIgKyBtYXBwZWRfc3RhZ2UpKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoIkdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIG1hcHBlZF9zdGFnZSkpIik7CgogICAgICAgICAgICAvKiBXZSBjYW4ndCBqdXN0IHBhc3MgYSBwb2ludGVyIHRvIHRoZSBzdGF0ZWJsb2NrIHRvIEdMIGR1ZSB0byB0aGUgZGlmZmVyZW50IG1hdHJpeAogICAgICAgICAgICAgKiBmb3JtYXQoY29sdW1uIG1ham9yIHZzIHJvdyBtYWpvcikKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG1hdFswXVswXSA9ICooKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDAwXSk7CiAgICAgICAgICAgIG1hdFsxXVswXSA9ICooKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDAxXSk7CiAgICAgICAgICAgIG1hdFswXVsxXSA9ICooKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDEwXSk7CiAgICAgICAgICAgIG1hdFsxXVsxXSA9ICooKGZsb2F0ICopICZzdGF0ZWJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDExXSk7CiAgICAgICAgICAgIGdsVGV4RW52ZnYoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX09GRlNFVF9URVhUVVJFX01BVFJJWF9OViwgKGZsb2F0ICopIG1hdCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmZ2KEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9PRkZTRVRfVEVYVFVSRV9NQVRSSVhfTlYsIG1hdCkiKTsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRyYW5zZm9ybV93b3JsZChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRyYW5zZm9ybV92aWV3IGJlbG93IGlmIHRoZSB2aWV3IG1hdHJpeCB3YXMgY2hhbmdlZCB0b28KICAgICAqCiAgICAgKiBEZWxpYmVyYXRlbHkgbm8gY2hlY2sgaWYgdGhlIHZlcnRleCBkZWNsYXJhdGlvbiBpcyBkaXJ0eSBiZWNhdXNlIHRoZSB2ZGVjbCBzdGF0ZQogICAgICogZG9lcyBub3QgYWx3YXlzIHVwZGF0ZSB0aGUgd29ybGQgbWF0cml4LCBvbmx5IG9uIGEgc3dpdGNoIGJldHdlZW4gdHJhbnNmb3JtZWQKICAgICAqIGFuZCB1bnRyYW5zZm9ybWVkIGRyYXdzLiBJdCAqbWF5KiBoYXBwZW4gdGhhdCB0aGUgd29ybGQgbWF0cml4IGlzIHNldCAyIHRpbWVzIGR1cmluZyBvbmUKICAgICAqIGRyYXcsIGJ1dCB0aGF0IHNob3VsZCBiZSByYXRoZXIgcmFyZSBhbmQgY2hlYXBlciBpbiB0b3RhbC4KICAgICAqLwogICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRyaXhNb2RlIik7CgogICAgaWYoY29udGV4dC0+bGFzdF93YXNfcmh3KSB7CiAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xMb2FkSWRlbnRpdHkoKSIpOwogICAgfSBlbHNlIHsKICAgICAgICAvKiBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgdmlldyBtYXRyaXggaXMgdGhlIGlkZW50aXR5IG1hdHJpeCAqLwogICAgICAgIGlmIChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT52aWV3X2lkZW50KSB7CiAgICAgICAgICAgIGdsTG9hZE1hdHJpeGYoJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1dPUkxETUFUUklYKDApXS51Lm1bMF1bMF0pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMb2FkTWF0cml4ZiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsTG9hZE1hdHJpeGYoJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1ZJRVddLnUubVswXVswXSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRNYXRyaXhmIik7CiAgICAgICAgICAgIGdsTXVsdE1hdHJpeGYoJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1dPUkxETUFUUklYKDApXS51Lm1bMF1bMF0pOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xNdWx0TWF0cml4ZiIpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgY2xpcHBsYW5lKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVUlOVCBpbmRleCA9IHN0YXRlIC0gU1RBVEVfQ0xJUFBMQU5FKDApOwoKICAgIGlmKGlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1ZJRVcpKSB8fCBpbmRleCA+PSBHTF9MSU1JVFMoY2xpcHBsYW5lcykpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2xpcCBQbGFuZSBzZXR0aW5ncyBhcmUgYWZmZWN0ZWQgYnkgdGhlIG1vZGVsIHZpZXcgaW4gT3BlbkdMLCB0aGUgVmlldyB0cmFuc2Zvcm0gaW4gZGlyZWN0M2QgKi8KICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwogICAgZ2xQdXNoTWF0cml4KCk7CiAgICBnbExvYWRNYXRyaXhmKCZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwoKICAgIFRSQUNFKCJDbGlwcGxhbmUgWyVmLCVmLCVmLCVmXVxuIiwKICAgICAgICAgIHN0YXRlYmxvY2stPmNsaXBwbGFuZVtpbmRleF1bMF0sCiAgICAgICAgICBzdGF0ZWJsb2NrLT5jbGlwcGxhbmVbaW5kZXhdWzFdLAogICAgICAgICAgc3RhdGVibG9jay0+Y2xpcHBsYW5lW2luZGV4XVsyXSwKICAgICAgICAgIHN0YXRlYmxvY2stPmNsaXBwbGFuZVtpbmRleF1bM10pOwogICAgZ2xDbGlwUGxhbmUoR0xfQ0xJUF9QTEFORTAgKyBpbmRleCwgc3RhdGVibG9jay0+Y2xpcHBsYW5lW2luZGV4XSk7CiAgICBjaGVja0dMY2FsbCgiZ2xDbGlwUGxhbmUiKTsKCiAgICBnbFBvcE1hdHJpeCgpOwp9CgpzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fd29ybGRleChEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIFVJTlQgbWF0cml4ID0gc3RhdGUgLSBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKTsKICAgIEdMZW51bSBnbE1hdDsKICAgIFRSQUNFKCJTZXR0aW5nIHdvcmxkIG1hdHJpeCAlZFxuIiwgbWF0cml4KTsKCiAgICBpZihtYXRyaXggPj0gR0xfTElNSVRTKGJsZW5kcykpIHsKICAgICAgICBXQVJOKCJVbnN1cHBvcnRlZCBibGVuZCBtYXRyaXggc2V0XG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgaWYoaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVklFVykpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIEdMX01PREVMVklFVzBfQVJCOiAgMHgxNzAwCiAgICAgKiBHTF9NT0RFTFZJRVcxX0FSQjogIDB4MHg4NTBhCiAgICAgKiBHTF9NT0RFTFZJRVcyX0FSQjogIDB4ODcyMgogICAgICogR0xfTU9ERUxWSUVXM19BUkI6ICAweDg3MjMKICAgICAqIGV0YwogICAgICogR0xfTU9ERUxWSUVXMzFfQVJCOiAweDg3M0YKICAgICAqLwogICAgaWYobWF0cml4ID09IDEpIGdsTWF0ID0gR0xfTU9ERUxWSUVXMV9BUkI7CiAgICBlbHNlIGdsTWF0ID0gR0xfTU9ERUxWSUVXMl9BUkIgLSAyICsgbWF0cml4OwoKICAgIGdsTWF0cml4TW9kZShnbE1hdCk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRyaXhNb2RlKGdsTWF0KSIpOwoKICAgIC8qIFdvcmxkIG1hdHJpeCAwIGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgdmlldyBtYXRyaXggYmVjYXVzZSBkM2QgdXNlcyAzIG1hdHJpY2VzIHdoaWxlIGdsIHVzZXMgb25seSAyLiBUbyBhdm9pZAogICAgICogd2VpZ2h0aW5nIHRoZSB2aWV3IG1hdHJpeCBpbmNvcnJlY3RseSBpdCBoYXMgdG8gYmUgbXVsdGlwbGllZCBpbnRvIGV2ZXJ5IGdsIG1vZGVsdmlldyBtYXRyaXgKICAgICAqLwogICAgaWYoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dmlld19pZGVudCkgewogICAgICAgIGdsTG9hZE1hdHJpeGYoJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1dPUkxETUFUUklYKG1hdHJpeCldLnUubVswXVswXSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTG9hZE1hdHJpeGYiKQogICAgfSBlbHNlIHsKICAgICAgICBnbExvYWRNYXRyaXhmKCZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19WSUVXXS51Lm1bMF1bMF0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRNYXRyaXhmIikKICAgICAgICBnbE11bHRNYXRyaXhmKCZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19XT1JMRE1BVFJJWChtYXRyaXgpXS51Lm1bMF1bMF0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbE11bHRNYXRyaXhmIikKICAgIH0KfQoKc3RhdGljIHZvaWQgc3RhdGVfdmVydGV4YmxlbmQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBXSU5FRDNEVkVSVEVYQkxFTkRGTEFHUyB2YWwgPSBzdGF0ZWJsb2NrLT5yZW5kZXJTdGF0ZVtXSU5FRDNEUlNfVkVSVEVYQkxFTkRdOwoKICAgIHN3aXRjaCh2YWwpIHsKICAgICAgICBjYXNlIFdJTkVEM0RWQkZfMVdFSUdIVFM6CiAgICAgICAgY2FzZSBXSU5FRDNEVkJGXzJXRUlHSFRTOgogICAgICAgIGNhc2UgV0lORUQzRFZCRl8zV0VJR0hUUzoKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JMRU5EKSkgewogICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfVkVSVEVYX0JMRU5EX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVkVSVEVYX0JMRU5EX0FSQikiKTsKCiAgICAgICAgICAgICAgICAvKiBEM0QgYWRkcyBvbmUgbW9yZSBtYXRyaXggd2hpY2ggaGFzIHdlaWdodCAoMSAtIHN1bSh3ZWlnaHRzKSkuIFRoaXMgaXMgZW5hYmxlZCBhdCBjb250ZXh0CiAgICAgICAgICAgICAgICAgKiBjcmVhdGlvbiB3aXRoIGVuYWJsaW5nIEdMX1dFSUdIVF9TVU1fVU5JVFlfQVJCLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QmxlbmRBUkIoc3RhdGVibG9jay0+cmVuZGVyU3RhdGVbV0lORUQzRFJTX1ZFUlRFWEJMRU5EXSArIDEpKTsKCiAgICAgICAgICAgICAgICBpZighc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+dmVydGV4QmxlbmRVc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgR0xfTElNSVRTKGJsZW5kcyk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZighaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoaSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dvcmxkZXgoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWChpKSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnZlcnRleEJsZW5kVXNlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0aWMgQk9PTCBvbmNlID0gRkFMU0U7CiAgICAgICAgICAgICAgICBpZighb25jZSkgewogICAgICAgICAgICAgICAgICAgIG9uY2UgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IEltcGxlbWVudCB2ZXJ0ZXggYmxlbmRpbmcgaW4gZHJhd1N0cmlkZWRTbG93ICovCiAgICAgICAgICAgICAgICAgICAgRklYTUUoIlZlcnRleCBibGVuZGluZyBlbmFibGVkLCBidXQgbm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZVxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzRFZCRl9ESVNBQkxFOgogICAgICAgIGNhc2UgV0lORUQzRFZCRl8wV0VJR0hUUzogLyogZm9yIEluZGV4ZWQgdmVydGV4IGJsZW5kaW5nIC0gbm90IHN1cHBvcnRlZCAqLwogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9WRVJURVhfQkxFTkQpKSB7CiAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfVkVSVEVYX0JMRU5EX0FSQik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1ZFUlRFWF9CTEVORF9BUkIpIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUUkFDRSgiVmVydGV4IGJsZW5kaW5nIGRpc2FibGVkXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNEVkJGX1RXRUVOSU5HOgogICAgICAgICAgICAvKiBKdXN0IHNldCB0aGUgdmVydGV4IHdlaWdodCBmb3Igd2VpZ2h0IDAsIGVuYWJsZSB2ZXJ0ZXggYmxlbmRpbmcgYW5kIGhvcGUgdGhlIGFwcCBkb2Vzbid0IGhhdmUKICAgICAgICAgICAgICogdmVydGV4IHdlaWdodHMgaW4gdGhlIHZlcnRpY2VzPwogICAgICAgICAgICAgKiBGb3Igbm93IHdlIGRvbid0IHJlcG9ydCB0aGF0IGFzIHN1cHBvcnRlZCwgc28gYSB3YXJuIHNob3VsZCBzdWZmaWNlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBXQVJOKCJUd2VlbmluZyBub3Qgc3VwcG9ydGVkIHlldFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9CgpzdGF0aWMgdm9pZCB0cmFuc2Zvcm1fdmlldyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHVuc2lnbmVkIGludCBrOwoKICAgIC8qIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgVmlldyBtYXRyaXgsIHJlc2V0IHRoZSBsaWdodCBhbmQgY2xpcHBpbmcgcGxhbmVzIHRvIHRoZSBuZXcgdmlldwogICAgICogTk9URTogV2UgaGF2ZSB0byByZXNldCB0aGUgcG9zaXRpb25zIGV2ZW4gaWYgdGhlIGxpZ2h0L3BsYW5lIGlzIG5vdCBjdXJyZW50bHkKICAgICAqICAgICAgIGVuYWJsZWQsIHNpbmNlIHRoZSBjYWxsIHRvIGVuYWJsZSBpdCB3aWxsIG5vdCByZXNldCB0aGUgcG9zaXRpb24uCiAgICAgKiBOT1RFMjogQXBwYXJlbnRseSB0ZXh0dXJlIHRyYW5zZm9ybXMgZG8gTk9UIG5lZWQgcmVhcHBseWluZwogICAgICovCgogICAgUExJR0hUSU5GT0VMICpsaWdodCA9IE5VTEw7CgogICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVykiKTsKICAgIGdsTG9hZE1hdHJpeGYoJnN0YXRlYmxvY2stPnRyYW5zZm9ybXNbV0lORUQzRFRTX1ZJRVddLnUubVswXVswXSk7CiAgICBjaGVja0dMY2FsbCgiZ2xMb2FkTWF0cml4ZiguLi4pIik7CgogICAgLyogUmVzZXQgbGlnaHRzLiBUT0RPOiBDYWxsIGxpZ2h0IGFwcGx5IGZ1bmMgKi8KICAgIGZvcihrID0gMDsgayA8IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPm1heENvbmN1cnJlbnRMaWdodHM7IGsrKykgewogICAgICAgIGxpZ2h0ID0gc3RhdGVibG9jay0+YWN0aXZlTGlnaHRzW2tdOwogICAgICAgIGlmKCFsaWdodCkgY29udGludWU7CiAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGxpZ2h0LT5nbEluZGV4LCBHTF9QT1NJVElPTiwgbGlnaHQtPmxpZ2h0UG9zbik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiBwb3NuIik7CiAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIGxpZ2h0LT5nbEluZGV4LCBHTF9TUE9UX0RJUkVDVElPTiwgbGlnaHQtPmxpZ2h0RGlybik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiBkaXJuIik7CiAgICB9CgogICAgLyogUmVzZXQgQ2xpcHBpbmcgUGxhbmVzICAqLwogICAgZm9yIChrID0gMDsgayA8IEdMX0xJTUlUUyhjbGlwcGxhbmVzKTsgaysrKSB7CiAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9DTElQUExBTkUoaykpKSB7CiAgICAgICAgICAgIGNsaXBwbGFuZShTVEFURV9DTElQUExBTkUoayksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgIH0KICAgIH0KCiAgICBpZihjb250ZXh0LT5sYXN0X3dhc19yaHcpIHsKICAgICAgICBnbExvYWRJZGVudGl0eSgpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSgpIik7CiAgICAgICAgLyogTm8gbmVlZCB0byB1cGRhdGUgdGhlIHdvcmxkIG1hdHJpeCwgdGhlIGlkZW50aXR5IGlzIGZpbmUgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogQ2FsbCB0aGUgd29ybGQgbWF0cml4IHN0YXRlLCB0aGlzIHdpbGwgYXBwbHkgdGhlIGNvbWJpbmVkIFdPUkxEICsgVklFVyBtYXRyaXgKICAgICAqIE5vIG5lZWQgdG8gZG8gaXQgaGVyZSBpZiB0aGUgc3RhdGUgaXMgc2NoZWR1bGVkIGZvciB1cGRhdGUuCiAgICAgKi8KICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSkpKSB7CiAgICAgICAgdHJhbnNmb3JtX3dvcmxkKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMCkpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KCiAgICAvKiBBdm9pZCBsb29waW5nIG92ZXIgYSBudW1iZXIgb2YgbWF0cmljZXMgaWYgdGhlIGFwcCBuZXZlciB1c2VkIHRoZSBmdW5jdGlvbmFsaXR5ICovCiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT52ZXJ0ZXhCbGVuZFVzZWQpIHsKICAgICAgICBmb3IoayA9IDE7IGsgPCBHTF9MSU1JVFMoYmxlbmRzKTsgaysrKSB7CiAgICAgICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWChrKSkpKSB7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleChTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKGspKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHRyYW5zZm9ybV9wcm9qZWN0aW9uKERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwogICAgY2hlY2tHTGNhbGwoImdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKSIpOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSIpOwoKICAgIGlmKGNvbnRleHQtPmxhc3Rfd2FzX3JodykgewogICAgICAgIGRvdWJsZSBYLCBZLCBoZWlnaHQsIHdpZHRoLCBtaW5aLCBtYXhaOwoKICAgICAgICBYICAgICAgPSBzdGF0ZWJsb2NrLT52aWV3cG9ydC5YOwogICAgICAgIFkgICAgICA9IHN0YXRlYmxvY2stPnZpZXdwb3J0Llk7CiAgICAgICAgaGVpZ2h0ID0gc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0OwogICAgICAgIHdpZHRoICA9IHN0YXRlYmxvY2stPnZpZXdwb3J0LldpZHRoOwogICAgICAgIG1pblogICA9IHN0YXRlYmxvY2stPnZpZXdwb3J0Lk1pblo7CiAgICAgICAgbWF4WiAgID0gc3RhdGVibG9jay0+dmlld3BvcnQuTWF4WjsKCiAgICAgICAgaWYoIXN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnVudHJhbnNmb3JtZWQpIHsKICAgICAgICAgICAgLyogVHJhbnNmb3JtZWQgdmVydGljZXMgYXJlIHN1cHBvc2VkIHRvIGJ5cGFzcyB0aGUgd2hvbGUgdHJhbnNmb3JtIHBpcGVsaW5lIGluY2x1ZGluZwogICAgICAgICAgICAgKiBmcnVzdHVtIGNsaXBwaW5nLiBUaGlzIGNhbid0IGJlIGRvbmUgaW4gb3BlbmdsLCBzbyB0aGlzIGNvZGUgYWRqdXN0cyB0aGUgWiByYW5nZSB0bwogICAgICAgICAgICAgKiBzdXBwcmVzcyBkZXB0aCBjbGlwcGluZy4gVGhpcyBjYW4gYmUgZG9uZSBiZWNhdXNlIGl0IGlzIGFuIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBhbmQKICAgICAgICAgICAgICogdGhlIFogY29vcmRpbmF0ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIHNpemUgb2YgdGhlIHByaW1pdGl2ZXMuIEhhbGYgTGlmZSAxIGFuZCBQcmluY2Ugb2YKICAgICAgICAgICAgICogUGVyc2lhIDNEIG5lZWQgdGhpcy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogTm90ZSB0aGF0IHVzaW5nIG1pblogYW5kIG1heFogaGVyZSBkb2Vzbid0IGVudGlyZWx5IGZpeCB0aGUgcHJvYmxlbSwgc2luY2UgdmlldyBmcnVzdHVtCiAgICAgICAgICAgICAqIGNsaXBwaW5nIGlzIHN0aWxsIGVuYWJsZWQsIGJ1dCBpdCBzZWVtcyB0byBmaXggaXQgZm9yIGFsbCBhcHBzIHRlc3RlZCBzbyBmYXIuIEEgbWlub3IKICAgICAgICAgICAgICogcHJvYmxlbSBjYW4gYmUgd2l0bmVzc2VkIGluIGhhbGYtbGlmZSAxIGVuZ2luZSBiYXNlZCBnYW1lcywgdGhlIHdlYXBvbiBpcyBjbGlwcGVkIGNsb3NlCiAgICAgICAgICAgICAqIHRvIHRoZSB2aWV3ZXIuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEFsc28gbm90ZSB0aGF0IHRoaXMgYnJlYWtzIHogY29tcGFyaXNvbiBhZ2FpbnN0IHogdmFsdWVzIGZpbGxlZCBpbiB3aXRoIGNsZWFyLAogICAgICAgICAgICAgKiBidXQgbm8gYXBwIGRlcGVuZGluZyBvbiB0aGF0IGFuZCBkaXNhYmxlZCBjbGlwcGluZyBoYXMgYmVlbiBmb3VuZCB5ZXQuIENvbXBhcmluZwogICAgICAgICAgICAgKiBwcmltaXRpdmVzIGFnYWluc3QgdGhlbXNlbHZlcyB3b3Jrcywgc28gdGhlIFogYnVmZmVyIGlzIHN0aWxsIGludGFjdCBmb3Igbm9ybWFsIGhpZGRlbgogICAgICAgICAgICAgKiBzdXJmYWNlIHJlbW92YWwuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFdlIGNvdWxkIGRpc2FibGUgY2xpcHBpbmcgZW50aXJlbHkgYnkgc2V0dGluZyB0aGUgbmVhciB0byBpbmZpbml0eSBhbmQgZmFyIHRvIC1pbmZpbml0eSwKICAgICAgICAgICAgICogYnV0IHRoaXMgd291bGQgYnJlYWsgWiBidWZmZXIgb3BlcmF0aW9uLiBSYWlzaW5nIHRoZSByYW5nZSB0byBzb21ldGhpbmcgbGVzcyB0aGFuCiAgICAgICAgICAgICAqIGluZmluaXR5IHdvdWxkIGhlbHAgYSBiaXQgYXQgdGhlIGNvc3Qgb2YgWiBwcmVjaXNpb24sIGJ1dCBpdCB3b3VsZG4ndCBlbGltaW5hdGUgdGhlCiAgICAgICAgICAgICAqIHByb2JsZW0gZWl0aGVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgVFJBQ0UoIkNhbGxpbmcgZ2xPcnRobyB3aXRoICVmLCAlZiwgJWYsICVmXG4iLCB3aWR0aCwgaGVpZ2h0LCAtbWluWiwgLW1heFopOwogICAgICAgICAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgICAgICAgICBnbE9ydGhvKFgsIFggKyB3aWR0aCwgLVksIC1ZIC0gaGVpZ2h0LCAtbWluWiwgLW1heFopOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2xPcnRobyhYLCBYICsgd2lkdGgsIFkgKyBoZWlnaHQsIFksIC1taW5aLCAtbWF4Wik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBJZiB0aGUgYXBwIG1peGVzIHRyYW5zZm9ybWVkIGFuZCB1bnRyYW5zZm9ybWVkIHByaW1pdGl2ZXMgd2UgY2FuJ3QgdXNlIHRoZSBjb29yZGluYXRlIHN5c3RlbQogICAgICAgICAgICAgKiB0cmljayBhYm92ZSBiZWNhdXNlIHRoaXMgd291bGQgbWVzcyB1cCB0cmFuc2Zvcm1lZCBhbmQgdW50cmFuc2Zvcm1lZCBaIG9yZGVyLiBQYXNzIHRoZSB6IHBvc2l0aW9uCiAgICAgICAgICAgICAqIHVubW9kaWZpZWQgdG8gb3BlbmdsLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB0aGUgYXBwIGRlcGVuZHMgb24gbWl4ZWQgdHlwZXMgYW5kIGRpc2FibGVkIGNsaXBwaW5nIHdlJ3JlIG91dCBvZiBsdWNrIHdpdGhvdXQgYSBwaXBlbGluZQogICAgICAgICAgICAgKiByZXBsYWNlbWVudCBzaGFkZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBUUkFDRSgiQ2FsbGluZyBnbE9ydGhvIHdpdGggJWYsICVmLCAlZiwgJWZcbiIsIHdpZHRoLCBoZWlnaHQsIDEuMCwgLTEuMCk7CiAgICAgICAgICAgIGlmKHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnJlbmRlcl9vZmZzY3JlZW4pIHsKICAgICAgICAgICAgICAgIGdsT3J0aG8oWCwgWCArIHdpZHRoLCAtWSwgLVkgLSBoZWlnaHQsIDAuMCwgLTEuMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBnbE9ydGhvKFgsIFggKyB3aWR0aCwgWSArIGhlaWdodCwgWSwgMC4wLCAtMS4wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjaGVja0dMY2FsbCgiZ2xPcnRobyIpOwoKICAgICAgICAvKiBXaW5kb3cgQ29vcmQgMCBpcyB0aGUgbWlkZGxlIG9mIHRoZSBmaXJzdCBwaXhlbCwgc28gdHJhbnNsYXRlIGJ5IDEvMiBwaXhlbHMgKi8KICAgICAgICBnbFRyYW5zbGF0ZWYoMC41LCAwLjUsIDApOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFRyYW5zbGF0ZWYoMC41LCAwLjUsIDApIik7CiAgICAgICAgLyogRDNEIHRleHR1cmUgY29vcmRpbmF0ZXMgYXJlIGZsaXBwZWQgY29tcGFyZWQgdG8gT3BlbkdMIG9uZXMsIHNvCiAgICAgICAgICogcmVuZGVyIGV2ZXJ5dGhpbmcgdXBzaWRlIGRvd24gd2hlbiByZW5kZXJpbmcgb2Zmc2NyZWVuLiAqLwogICAgICAgIGlmIChzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgICAgIGdsU2NhbGVmKDEuMCwgLTEuMCwgMS4wKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsU2NhbGVmIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBUaGUgcnVsZSBpcyB0aGF0IHRoZSB3aW5kb3cgY29vcmRpbmF0ZSAwIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlCiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgZmlyc3QgcGl4ZWwsIGJ1dCB0aGUgY2VudGVyIG9mIHRoZSBmaXJzdCBwaXhlbC4KICAgICAgICAgICAgQXMgYSBjb25zZXF1ZW5jZSBpZiB5b3Ugd2FudCB0byBjb3JyZWN0bHkgZHJhdyBvbmUgbGluZSBleGFjdGx5IGZyb20KICAgICAgICAgICAgdGhlIGxlZnQgdG8gdGhlIHJpZ2h0IGVuZCBvZiB0aGUgdmlld3BvcnQgKHdpdGggYWxsIG1hdHJpY2VzIHNldCB0bwogICAgICAgICAgICBiZSBpZGVudGl0eSksIHRoZSB4IGNvb3JkcyBvZiBib3RoIGVuZHMgb2YgdGhlIGxpbmUgd291bGQgYmUgbm90CiAgICAgICAgICAgIC0xIGFuZCAxIHJlc3BlY3RpdmVseSBidXQgKC0xLTEvdmlld3BvcnRfd2lkaCkgYW5kICgxLTEvdmlld3BvcnRfd2lkdGgpCiAgICAgICAgICAgIGluc3RlYWQuCgogICAgICAgICAgICAxLjAgLyBXaWR0aCBpcyB1c2VkIGJlY2F1c2UgdGhlIGNvb3JkIHJhbmdlIGdvZXMgZnJvbSAtMS4wIHRvIDEuMCwgdGhlbiB3ZQogICAgICAgICAgICBkaXZpZGUgYnkgdGhlIFdpZHRoL0hlaWdodCwgc28gd2UgbmVlZCB0aGUgaGFsZiByYW5nZSgxLjApIHRvIHRyYW5zbGF0ZSBieQogICAgICAgICAgICBoYWxmIGEgcGl4ZWwuCgogICAgICAgICAgICBUaGUgb3RoZXIgZnVuIGlzIHRoYXQgZDNkJ3Mgb3V0cHV0IHogcmFuZ2UgYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIFswOzFdLAogICAgICAgICAgICBidXQgb3BlbmdsJ3MgaXMgWy0xOzFdLiBTaW5jZSB0aGUgeiBidWZmZXIgaXMgaW4gcmFuZ2UgWzA7MV0gZm9yIGJvdGgsIGdsCiAgICAgICAgICAgIHNjYWxlcyBbLTE7MV0gdG8gWzA7MV0uIFRoaXMgd291bGQgbWVhbiB0aGF0IHdlIGVuZCB1cCBpbiBbMC41OzFdIGFuZCBsb29zZSBhIGxvdAogICAgICAgICAgICBvZiBaIGJ1ZmZlciBwcmVjaXNpb24gYW5kIHRoZSBjbGVhciB2YWx1ZXMgZG8gbm90IG1hdGNoIGluIHRoZSB6IHRlc3QuIFRodXMgc2NhbGUKICAgICAgICAgICAgWzA7MV0gdG8gWy0xOzFdLCBzbyB3aGVuIGdsIHVuZG9lcyB0aGF0IHdlIHV0aWxpemUgdGhlIGZ1bGwgeiByYW5nZQogICAgICAgICAqLwogICAgICAgIGdsVHJhbnNsYXRlZigxLjAgLyBzdGF0ZWJsb2NrLT52aWV3cG9ydC5XaWR0aCwgLTEuMC8gc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0LCAtMS4wKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xUcmFuc2xhdGVmICgxLjAgLyB3aWR0aCwgLTEuMCAvIGhlaWdodCwgLTEuMCkiKTsKICAgICAgICBpZiAoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+cmVuZGVyX29mZnNjcmVlbikgewogICAgICAgICAgICAvKiBEM0QgdGV4dHVyZSBjb29yZGluYXRlcyBhcmUgZmxpcHBlZCBjb21wYXJlZCB0byBPcGVuR0wgb25lcywgc28KICAgICAgICAgICAgICogcmVuZGVyIGV2ZXJ5dGhpbmcgdXBzaWRlIGRvd24gd2hlbiByZW5kZXJpbmcgb2Zmc2NyZWVuLiAqLwogICAgICAgICAgICBnbFNjYWxlZigxLjAsIC0xLjAsIDIuMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xTY2FsZWYoMS4wLCAxLjAsIDIuMCk7CiAgICAgICAgfQogICAgICAgIGNoZWNrR0xjYWxsKCJnbFNjYWxlZiIpOwoKICAgICAgICBnbE11bHRNYXRyaXhmKCZzdGF0ZWJsb2NrLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19QUk9KRUNUSU9OXS51Lm1bMF1bMF0pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExvYWRNYXRyaXhmIik7CiAgICB9Cn0KCi8qIFRoaXMgc2hvdWxkIG1hdGNoIGFueSBhcnJheXMgbG9hZGVkIGluIGxvYWRWZXJ0ZXhEYXRhLgogKiBzdGF0ZWJsb2NrIGltcGwgaXMgcmVxdWlyZWQgZm9yIEdMX1NVUFBPUlQKICogVE9ETzogT25seSBsb2FkIC8gdW5sb2FkIGFycmF5cyBpZiB3ZSBoYXZlIHRvLgogKi8Kc3RhdGljIGlubGluZSB2b2lkIHVubG9hZFZlcnRleERhdGEoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaykgewogICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CiAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CiAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9FWFQpOwogICAgfQogICAgaWYgKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CTEVORCkpIHsKICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9XRUlHSFRfQVJSQVlfQVJCKTsKICAgIH0gZWxzZSBpZiAoR0xfU1VQUE9SVChFWFRfVkVSVEVYX1dFSUdIVElORykpIHsKICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCk7CiAgICB9CiAgICB1bmxvYWRUZXhDb29yZHMoc3RhdGVibG9jayk7Cn0KCi8qIFRoaXMgc2hvdWxkIG1hdGNoIGFueSBhcnJheXMgbG9hZGVkIGluIGxvYWROdW1iZXJlZEFycmF5cwogKiBUT0RPOiBPbmx5IGxvYWQgLyB1bmxvYWQgYXJyYXlzIGlmIHdlIGhhdmUgdG8uCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2FkTnVtYmVyZWRBcnJheXMoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaykgewogICAgLyogZGlzYWJsZSBhbnkgYXR0cmlicyAodGhpcyBpcyB0aGUgc2FtZSBmb3IgYm90aCBHTFNMIGFuZCBBUkIgbW9kZXMpICovCiAgICBHTGludCBtYXhBdHRyaWJzID0gMTY7CiAgICBpbnQgaTsKCiAgICAvKiBMZWF2ZSBhbGwgdGhlIGF0dHJpYnMgZGlzYWJsZWQgKi8KICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZFUlRFWF9BVFRSSUJTX0FSQiwgJm1heEF0dHJpYnMpOwogICAgLyogTUVTQSBkb2VzIG5vdCBzdXBwb3J0IGl0IHJpZ2h0IG5vdCAqLwogICAgaWYgKGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUikKICAgICAgICBtYXhBdHRyaWJzID0gMTY7CiAgICBmb3IgKGkgPSAwOyBpIDwgbWF4QXR0cmliczsgKytpKSB7CiAgICAgICAgR0xfRVhUQ0FMTChnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQihpKSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCKHJlZykiKTsKICAgICAgICAvKiBTb21lIFdpbmRvd3MgZHJpdmVycyhOViBHRiA3KSB1c2UgdGhlIGxhdGVzdCB2YWx1ZSB0aGF0IHdhcyB1c2VkIHdoZW4gZHJhd2luZyB3aXRoIHRoZSBub3cKICAgICAgICAgKiBkZWFjdGl2YXRlZCBzdHJlYW0gZGlzYWJsZWQsIHNvbWUgb3RoZXIgZHJpdmVycyhBVEksIE5WIEdGIDgpIHNldCB0aGUgdW5kZWZpbmVkIHZhbHVlcyB0byAweDAwLgogICAgICAgICAqIExldCdzIHNldCB0aGVtIHRvIDB4MDAgdG8gYXZvaWQgaGl0dGluZyBzb21lIHVuZGVmaW5lZCBhc3BlY3RzIG9mIE9wZW5HTC4gQWxsIHRoYXQgaXMgcmVhbGx5CiAgICAgICAgICogaW1wb3J0YW50IGhlcmUgaXMgdGhlIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCIGNhbGwgYWJvdmUuIFRoZSB0ZXN0IHNob3dzIHRoYXQgdGhlIHJlZnJhc3QKICAgICAgICAgKiBrZWVwcyBkZXJlZmVyZW5jaW5nIHRoZSBwb2ludGVycywgd2hpY2ggd291bGQgY2F1c2UgY3Jhc2hlcyBpbiBzb21lIGdhbWVzIGxpa2UgSGFsZiBMaWZlIDI6IEVwaXNvZGUgVHdvLgogICAgICAgICAqLwogICAgICAgIEdMX0VYVENBTEwoZ2xWZXJ0ZXhBdHRyaWI0TnViQVJCKGksIDAsIDAsIDAsIDApKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xWZXJ0ZXhBdHRyaWI0TnViQVJCKGksIDAsIDAsIDAsIDApIik7CiAgICB9Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkTnVtYmVyZWRBcnJheXMoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZURpcmVjdDNEVmVydGV4U3RyaWRlZERhdGEgKnN0cmlkZWQpIHsKICAgIEdMaW50IGN1clZCTyA9IEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CVUZGRVJfT0JKRUNUKSA/IC0xIDogMDsKICAgIGludCBpOwogICAgVUlOVCAqb2Zmc2V0ID0gc3RhdGVibG9jay0+c3RyZWFtT2Zmc2V0OwogICAgSVdpbmVEM0RWZXJ0ZXhCdWZmZXJJbXBsICp2YjsKICAgIERXT1JEX1BUUiBzaGlmdF9pbmRleDsKCiAgICAvKiBEZWZhdWx0IHRvIG5vIGluc3RhbmNpbmcgKi8KICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPmluc3RhbmNlZERyYXcgPSBGQUxTRTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0FUVFJJQlM7IGkrKykgewoKICAgICAgICBpZiAoIXN0cmlkZWQtPnUuaW5wdXRbaV0ubHBEYXRhICYmICFzdHJpZGVkLT51LmlucHV0W2ldLlZCTykKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIERvIG5vdCBsb2FkIGluc3RhbmNlIGRhdGEuIEl0IHdpbGwgYmUgc3BlY2lmaWVkIHVzaW5nIGdsVGV4Q29vcmQgYnkgZHJhd3ByaW0gKi8KICAgICAgICBpZihzdGF0ZWJsb2NrLT5zdHJlYW1GbGFnc1tzdHJpZGVkLT51LmlucHV0W2ldLnN0cmVhbU5vXSAmIFdJTkVEM0RTVFJFQU1TT1VSQ0VfSU5TVEFOQ0VEQVRBKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIoaSkpOwogICAgICAgICAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5pbnN0YW5jZWREcmF3ID0gVFJVRTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBUUkFDRV8oZDNkX3NoYWRlcikoIkxvYWRpbmcgYXJyYXkgJXUgW1ZCTz0ldV1cbiIsIGksIHN0cmlkZWQtPnUuaW5wdXRbaV0uVkJPKTsKCiAgICAgICAgaWYoc3RyaWRlZC0+dS5pbnB1dFtpXS5kd1N0cmlkZSkgewogICAgICAgICAgICBpZihjdXJWQk8gIT0gc3RyaWRlZC0+dS5pbnB1dFtpXS5WQk8pIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0FSUkFZX0JVRkZFUl9BUkIsIHN0cmlkZWQtPnUuaW5wdXRbaV0uVkJPKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgICAgICBjdXJWQk8gPSBzdHJpZGVkLT51LmlucHV0W2ldLlZCTzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YiA9IChJV2luZUQzRFZlcnRleEJ1ZmZlckltcGwgKikgc3RhdGVibG9jay0+c3RyZWFtU291cmNlW3N0cmlkZWQtPnUuaW5wdXRbaV0uc3RyZWFtTm9dOwogICAgICAgICAgICAvKiBVc2UgdGhlIFZCTyB0byBmaW5kIG91dCBpZiBhIHZlcnRleCBidWZmZXIgZXhpc3RzLCBub3QgdGhlIHZiIHBvaW50ZXIuIHZiIGNhbiBwb2ludCB0byBhCiAgICAgICAgICAgICAqIHVzZXIgcG9pbnRlciBkYXRhIGJsb2IuIEluIHRoYXQgY2FzZSBjdXJWQk8gd2lsbCBiZSAwLiBJZiB0aGVyZSBpcyBhIHZlcnRleCBidWZmZXIgYnV0IG5vCiAgICAgICAgICAgICAqIHZibyB3ZSB3b24ndCBiZSBsb2FkIGNvbnZlcnRlZCBhdHRyaWJ1dGVzIGFueXdheQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoY3VyVkJPICYmIHZiLT5jb252X3NoaWZ0KSB7CiAgICAgICAgICAgICAgICBUUkFDRSgiTG9hZGluZyBhdHRyaWJ1dGUgZnJvbSBzaGlmdGVkIGJ1ZmZlclxuIik7CiAgICAgICAgICAgICAgICBUUkFDRSgiQXR0cmliICVkIGhhcyBvcmlnaW5hbCBzdHJpZGUgJWQsIG5ldyBzdHJpZGUgJWRcbiIsIGksIHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdTdHJpZGUsIHZiLT5jb252X3N0cmlkZSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiT3JpZ2luYWwgb2Zmc2V0ICVwLCBhZGRpdGlvbmFsIG9mZnNldCAweCUwOHhcbiIsc3RyaWRlZC0+dS5pbnB1dFtpXS5scERhdGEsIHZiLT5jb252X3NoaWZ0WyhEV09SRF9QVFIpIHN0cmlkZWQtPnUuaW5wdXRbaV0ubHBEYXRhXSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiT3BlbmdsIHR5cGUgJXhcbiIsIFdJTkVEM0RfQVRSX0dMVFlQRShzdHJpZGVkLT51LmlucHV0W2ldLmR3VHlwZSkpOwogICAgICAgICAgICAgICAgc2hpZnRfaW5kZXggPSAoKERXT1JEX1BUUikgc3RyaWRlZC0+dS5pbnB1dFtpXS5scERhdGEgKyBvZmZzZXRbc3RyaWRlZC0+dS5pbnB1dFtpXS5zdHJlYW1Ob10pOwogICAgICAgICAgICAgICAgc2hpZnRfaW5kZXggPSBzaGlmdF9pbmRleCAlIHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdTdHJpZGU7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliUG9pbnRlckFSQihpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX1NJWkUoc3RyaWRlZC0+dS5pbnB1dFtpXS5kd1R5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX0dMVFlQRShzdHJpZGVkLT51LmlucHV0W2ldLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfTk9STUFMSVpFRChzdHJpZGVkLT51LmlucHV0W2ldLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmItPmNvbnZfc3RyaWRlLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVkLT51LmlucHV0W2ldLmxwRGF0YSArIHZiLT5jb252X3NoaWZ0W3NoaWZ0X2luZGV4XSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdTdHJpZGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFtzdHJpZGVkLT51LmlucHV0W2ldLnN0cmVhbU5vXSkpOwoKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyQVJCKGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfU0laRShzdHJpZGVkLT51LmlucHV0W2ldLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9OT1JNQUxJWkVEKHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVkLT51LmlucHV0W2ldLmR3U3RyaWRlLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGVkLT51LmlucHV0W2ldLmxwRGF0YSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdTdHJpZGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFtzdHJpZGVkLT51LmlucHV0W2ldLnN0cmVhbU5vXSkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCKGkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBTdHJpZGUgPSAwIG1lYW5zIGFsd2F5cyB0aGUgc2FtZSB2YWx1ZXMuIGdsVmVydGV4QXR0cmliUG9pbnRlckFSQiBkb2Vzbid0IGRvIHRoYXQuIEluc3RlYWQgZGlzYWJsZSB0aGUgcG9pbnRlciBhbmQKICAgICAgICAgICAgICogc2V0IHVwIHRoZSBhdHRyaWJ1dGUgc3RhdGljYWxseS4gQnV0IHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgc3lzdGVtIG1lbW9yeSBhZGRyZXNzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgQllURSAqcHRyID0gc3RyaWRlZC0+dS5pbnB1dFtpXS5scERhdGEgKyBvZmZzZXRbc3RyaWRlZC0+dS5pbnB1dFtpXS5zdHJlYW1Ob107CiAgICAgICAgICAgIGlmKHN0cmlkZWQtPnUuaW5wdXRbaV0uVkJPKSB7CiAgICAgICAgICAgICAgICB2YiA9IChJV2luZUQzRFZlcnRleEJ1ZmZlckltcGwgKikgc3RhdGVibG9jay0+c3RyZWFtU291cmNlW3N0cmlkZWQtPnUuaW5wdXRbaV0uc3RyZWFtTm9dOwogICAgICAgICAgICAgICAgcHRyICs9IChsb25nKSB2Yi0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIoaSkpOwoKICAgICAgICAgICAgc3dpdGNoKHN0cmlkZWQtPnUuaW5wdXRbaV0uZHdUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDE6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjFmdkFSQihpLCAoZmxvYXQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDI6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjJmdkFSQihpLCAoZmxvYXQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDM6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjNmdkFSQihpLCAoZmxvYXQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDQ6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjRmdkFSQihpLCAoZmxvYXQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfVUJZVEU0OgogICAgICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xWZXJ0ZXhBdHRyaWI0TnVidkFSQihpLCBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1VCWVRFNE46CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9EM0RDT0xPUjoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNE51YnZBUkIoaSwgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfU0hPUlQyOgogICAgICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xWZXJ0ZXhBdHRyaWI0c3ZBUkIoaSwgKEdMc2hvcnQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9TSE9SVDQ6CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjRzdkFSQihpLCAoR0xzaG9ydCAqKSBwdHIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9TSE9SVDJOOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEdMc2hvcnQgc1s0XSA9IHsoKHNob3J0ICopIHB0cilbMF0sICgoc2hvcnQgKikgcHRyKVsxXSwgMCwgMX07CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjROc3ZBUkIoaSwgcykpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfVVNIT1JUMk46CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgR0x1c2hvcnQgc1s0XSA9IHsoKHVuc2lnbmVkIHNob3J0ICopIHB0cilbMF0sICgodW5zaWduZWQgc2hvcnQgKikgcHRyKVsxXSwgMCwgMX07CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjROdXN2QVJCKGksIHMpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1NIT1JUNE46CiAgICAgICAgICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEF0dHJpYjROc3ZBUkIoaSwgKEdMc2hvcnQgKikgcHRyKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9VU0hPUlQ0TjoKICAgICAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4QXR0cmliNE51c3ZBUkIoaSwgKEdMdXNob3J0ICopIHB0cikpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1VERUMzOgogICAgICAgICAgICAgICAgICAgIEZJWE1FKCJVbnN1cmUgYWJvdXQgV0lORUQzRERFQ0xUWVBFX1VERUMzXG4iKTsKICAgICAgICAgICAgICAgICAgICAvKmdsVmVydGV4QXR0cmliM3VzdkFSQihpLCAoR0x1c2hvcnQgKikgcHRyKTsgRG9lcyBub3QgZXhpc3QgKi8KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX0RFQzNOOgogICAgICAgICAgICAgICAgICAgIEZJWE1FKCJVbnN1cmUgYWJvdXQgV0lORUQzRERFQ0xUWVBFX0RFQzNOXG4iKTsKICAgICAgICAgICAgICAgICAgICAvKmdsVmVydGV4QXR0cmliM051c3ZBUkIoaSwgKEdMdXNob3J0ICopIHB0cik7IERvZXMgbm90IGV4aXN0ICovCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl8yOgogICAgICAgICAgICAgICAgICAgIC8qIEFyZSB0aG9zZSAxNiBiaXQgZmxvYXRzLiBDIGRvZXNuJ3QgaGF2ZSBhIDE2IGJpdCBmbG9hdCB0eXBlLiBJIGNvdWxkIHJlYWQgdGhlIHNpbmdsZSBiaXRzIGFuZCBjYWxjdWxhdGUgYSA0CiAgICAgICAgICAgICAgICAgICAgICogYnl0ZSBmbG9hdCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgc3RhbmRhcmQKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfMlxuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzQ6CiAgICAgICAgICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIFdJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzRcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgV0lORUQzRERFQ0xUWVBFX1VOVVNFRDoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIGRlY2xhcmF0aW9uIGluIHN0cmlkZSAwIGF0dHJpYnV0ZXNcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNoZWNrR0xjYWxsKCJMb2FkaW5nIG51bWJlcmVkIGFycmF5cyIpOwp9CgovKiBVc2VkIGZyb20gMiBkaWZmZXJlbnQgZnVuY3Rpb25zLCBhbmQgdG9vIGJpZyB0byBqdXN0aWZ5IG1ha2luZyBpdCBpbmxpbmVkICovCnN0YXRpYyB2b2lkIGxvYWRWZXJ0ZXhEYXRhKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEaXJlY3QzRFZlcnRleFN0cmlkZWREYXRhICpzZCkgewogICAgVUlOVCAqb2Zmc2V0ID0gc3RhdGVibG9jay0+c3RyZWFtT2Zmc2V0OwogICAgR0xpbnQgY3VyVkJPID0gR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JVRkZFUl9PQkpFQ1QpID8gLTEgOiAwOwoKICAgIFRSQUNFKCJVc2luZyBmYXN0IHZlcnRleCBhcnJheSBjb2RlXG4iKTsKCiAgICAvKiBUaGlzIGlzIGZpeGVkIGZ1bmN0aW9uIHBpcGVsaW5lIG9ubHksIGFuZCB0aGUgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgZG9lc24ndCBkbyBpbnN0YW5jaW5nICovCiAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5pbnN0YW5jZWREcmF3ID0gRkFMU0U7CgogICAgLyogQmxlbmQgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICBpZiggKHNkLT51LnMuYmxlbmRXZWlnaHRzLmxwRGF0YSkgfHwgKHNkLT51LnMuYmxlbmRXZWlnaHRzLlZCTykgfHwKICAgICAgICAoc2QtPnUucy5ibGVuZE1hdHJpeEluZGljZXMubHBEYXRhKSB8fCAoc2QtPnUucy5ibGVuZE1hdHJpeEluZGljZXMuVkJPKSApIHsKCiAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CTEVORCkpIHsKICAgICAgICAgICAgVFJBQ0UoIkJsZW5kICVkICVwICVkXG4iLCBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSksCiAgICAgICAgICAgICAgICBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5ibGVuZFdlaWdodHMuZHdTdHJpZGUsIHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3U3RyaWRlICsgb2Zmc2V0W3NkLT51LnMuYmxlbmRXZWlnaHRzLnN0cmVhbU5vXSk7CgogICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1dFSUdIVF9BUlJBWV9BUkIpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9XRUlHSFRfQVJSQVlfQVJCKSIpOwoKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFZlcnRleEJsZW5kQVJCKFdJTkVEM0RfQVRSX1NJWkUoc2QtPnUucy5ibGVuZFdlaWdodHMuZHdUeXBlKSArIDEpKTsKCiAgICAgICAgICAgIFZUUkFDRSgoImdsV2VpZ2h0UG9pbnRlckFSQiglZCwgR0xfRkxPQVQsICVkLCAlcClcbiIsCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSkgLAogICAgICAgICAgICAgICAgc2QtPnUucy5ibGVuZFdlaWdodHMuZHdTdHJpZGUsCiAgICAgICAgICAgICAgICBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5ibGVuZFdlaWdodHMuZHdTdHJpZGUgKyBvZmZzZXRbc2QtPnUucy5ibGVuZFdlaWdodHMuc3RyZWFtTm9dKSk7CgogICAgICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5ibGVuZFdlaWdodHMuVkJPKSB7CiAgICAgICAgICAgICAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9BUlJBWV9CVUZGRVJfQVJCLCBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5WQk8pKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEJpbmRCdWZmZXJBUkIiKTsKICAgICAgICAgICAgICAgIGN1clZCTyA9IHNkLT51LnMuYmxlbmRXZWlnaHRzLlZCTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFdlaWdodFBvaW50ZXJBUkIpKAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfU0laRShzZC0+dS5zLmJsZW5kV2VpZ2h0cy5kd1R5cGUpLAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSksCiAgICAgICAgICAgICAgICBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5kd1N0cmlkZSwKICAgICAgICAgICAgICAgIHNkLT51LnMuYmxlbmRXZWlnaHRzLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLmJsZW5kV2VpZ2h0cy5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLmJsZW5kV2VpZ2h0cy5zdHJlYW1Ob10pOwoKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsV2VpZ2h0UG9pbnRlckFSQiIpOwoKICAgICAgICAgICAgaWYoKHNkLT51LnMuYmxlbmRNYXRyaXhJbmRpY2VzLmxwRGF0YSkgfHwgKHNkLT51LnMuYmxlbmRNYXRyaXhJbmRpY2VzLlZCTykpewogICAgICAgICAgICAgICAgc3RhdGljIEJPT0wgc2hvd2ZpeG1lID0gVFJVRTsKICAgICAgICAgICAgICAgIGlmKHNob3dmaXhtZSl7CiAgICAgICAgICAgICAgICAgICAgRklYTUUoImJsZW5kTWF0cml4SW5kaWNlcyBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICBzaG93Zml4bWUgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoR0xfU1VQUE9SVChFWFRfVkVSVEVYX1dFSUdIVElORykpIHsKICAgICAgICAgICAgLyogRklYTUUoIlRPRE9cbiIpOyovCiNpZiAwCgogICAgICAgICAgICBHTF9FWFRDQUxMKGdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVCkoCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3VHlwZSksCiAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc2QtPnUucy5ibGVuZFdlaWdodHMuZHdUeXBlKSwKICAgICAgICAgICAgICAgIHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgc2QtPnUucy5ibGVuZFdlaWdodHMubHBEYXRhICsgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHNkLT51LnMuYmxlbmRXZWlnaHRzLmR3U3RyaWRlKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVChudW1CbGVuZHMsIC4uLikiKTsKICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfRVhUKSIpOwojZW5kaWYKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogVE9ETzogc3VwcG9ydCBibGVuZHMgaW4gZHJhd1N0cmlkZWRTbG93CiAgICAgICAgICAgICAqIE5vIG5lZWQgdG8gd3JpdGUgYSBGSVhNRSBoZXJlLCB0aGlzIGlzIGRvbmUgYWZ0ZXIgdGhlIGdlbmVyYWwgdmVydGV4IGRlY2wgZGVjb2RpbmcKICAgICAgICAgICAgICovCiAgICAgICAgICAgIFdBUk4oInVuc3VwcG9ydGVkIGJsZW5kaW5nIGluIG9wZW5HbFxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JMRU5EKSkgewogICAgICAgICAgICBzdGF0aWMgY29uc3QgR0xieXRlIG9uZSA9IDE7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xXZWlnaHRidkFSQigxLCAmb25lKSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFdlaWdodGl2QVJCKEdMX0xJTUlUUyhibGVuZHMpLCB3ZWlnaHRzKSIpOwogICAgICAgIH0KICAgIH0KCiNpZiAwIC8qIEZPRyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoc2QtPnUucy5mb2cubHBEYXRhIHx8IHNkLT51LnMuZm9nLlZCTykgewogICAgICAgIC8qIFRPRE86IGZvZyovCiAgICBpZiAoR0xfU1VQUE9SVChFWFRfRk9HX0NPT1JEKSB7CiAgICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX0ZPR19DT09SRElOQVRFX0VYVCk7CiAgICAgICAgICAgIChHTF9FWFRDQUxMKShGb2dDb29yZFBvaW50ZXJFWFQpKAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuZm9nLmR3VHlwZSksCiAgICAgICAgICAgICAgICBzZC0+dS5zLmZvZy5kd1N0cmlkZSwKICAgICAgICAgICAgICAgIHNkLT51LnMuZm9nLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLmZvZy5kd1N0cmlkZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogZG9uJ3QgYm90aGVyIGZhbGxpbmcgYmFjayB0byAnc2xvdycgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBzb2Z0d2FyZSBGT0cgeWV0LiAqLwogICAgICAgICAgICAvKiBGSVhNRTogZml4bWUgb25jZSAqLwogICAgICAgICAgICBUUkFDRSgiSGFyZHdhcmUgc3VwcG9ydCBmb3IgRk9HIGlzIG5vdCBhdmFpYWJsZSwgRk9HIGRpc2FibGVkLlxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUFJUKEVYVF9GT1JfQ09PUkQpIHsKICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBmb2cgaXMgZGlzYWJsZWQgKi8KICAgICAgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0ZPR19DT09SRElOQVRFX0VYVCk7CiAgICAgICAgfQogICAgfQojZW5kaWYKCiNpZiAwIC8qIHRhbmdlbnRzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmIChzZC0+dS5zLnRhbmdlbnQubHBEYXRhIHx8IHNkLT51LnMudGFuZ2VudC5WQk8gfHwKICAgICAgICBzZC0+dS5zLmJpbm9ybWFsLmxwRGF0YSB8fCBzZC0+dS5zLmJpbm9ybWFsLlZCTykgewogICAgICAgIC8qIFRPRE86IHRhbmdlbnRzKi8KICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfQ09PUkRJTkFURV9GUkFNRSkgewogICAgICAgICAgICBpZiAoc2QtPnUucy50YW5nZW50LmxwRGF0YSB8fCBzZC0+dS5zLnRhbmdlbnQuVkJPKSB7CiAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9UQU5HRU5UX0FSUkFZX0VYVCk7CiAgICAgICAgICAgICAgICAoR0xfRVhUQ0FMTCkoVGFuZ2VudFBvaW50ZXJFWFQpKAogICAgICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX0dMVFlQRShzZC0+dS5zLnRhbmdlbnQuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICBzZC0+dS5zLnRhbmdlbnQuZHdTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgc2QtPnUucy50YW5nZW50LmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLnRhbmdlbnQuZHdTdHJpZGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9UQU5HRU5UX0FSUkFZX0VYVCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNkLT51LnMuYmlub3JtYWwubHBEYXRhIHx8IHNkLT51LnMuYmlub3JtYWwuVkJPKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfQklOT1JNQUxfQVJSQVlfRVhUKTsKICAgICAgICAgICAgICAgICAgICAoR0xfRVhUQ0FMTCkoQmlub3JtYWxQb2ludGVyRVhUKSgKICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuYmlub3JtYWwuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5iaW5vcm1hbC5kd1N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5iaW5vcm1hbC5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5iaW5vcm1hbC5kd1N0cmlkZSk7CiAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfQklOT1JNQUxfQVJSQVlfRVhUKTsKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBkb24ndCBib3RoZXIgZmFsbGluZyBiYWNrIHRvICdzbG93JyBhcyB3ZSBkb24ndCBzdXBwb3J0IHNvZnR3YXJlIHRhbmdlbnRzIGFuZCBiaW5vcm1hbHMgeWV0IC4gKi8KICAgICAgICAgICAgLyogRklYTUU6IGZpeG1lIG9uY2UgKi8KICAgICAgICAgICAgVFJBQ0UoIkhhcmR3YXJlIHN1cHBvcnQgZm9yIHRhbmdlbnRzIGFuZCBiaW5vcm1hbHMgaXMgbm90IGF2YWlhYmxlLCB0YW5nZW50cyBhbmQgYmlub3JtYWxzIGRpc2FibGVkLlxuIik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfQ09PUkRJTkFURV9GUkFNRSkgewogICAgICAgICAgICAgLyogbWFrZSBzdXJlIGZvZyBpcyBkaXNhYmxlZCAqLwogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RBTkdFTlRfQVJSQVlfRVhUKTsKICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CSU5PUk1BTF9BUlJBWV9FWFQpOwogICAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgLyogUG9pbnQgU2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmIChzZC0+dS5zLnBTaXplLmxwRGF0YSB8fCBzZC0+dS5zLnBTaXplLlZCTykgewoKICAgICAgICAvKiBubyBzdWNoIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIGZpeGVkIGZ1bmN0aW9uIEdMIHBpcGVsaW5lICovCiAgICAgICAgVFJBQ0UoIkNhbm5vdCBjaGFuZ2UgcHRTaXplIGhlcmUgaW4gb3BlbkdsXG4iKTsKICAgICAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBpbiB1c2luZyBzaGFkZXJzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSAqLwoKICAgIH0KCiAgICAvKiBWZXJ0ZXggUG9pbnRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKHNkLT51LnMucG9zaXRpb24ubHBEYXRhICE9IE5VTEwgfHwgc2QtPnUucy5wb3NpdGlvbi5WQk8gIT0gMCkgewogICAgICAgIC8qIE5vdGUgZHdUeXBlID09IGZsb2F0MyBvciBmbG9hdDQgPT0gMiBvciAzICovCiAgICAgICAgVlRSQUNFKCgiZ2xWZXJ0ZXhQb2ludGVyKCVkLCBHTF9GTE9BVCwgJWQsICVwKVxuIiwKICAgICAgICAgICAgICAgIHNkLT51LnMucG9zaXRpb24uZHdTdHJpZGUsCiAgICAgICAgICAgICAgICBzZC0+dS5zLnBvc2l0aW9uLmR3VHlwZSArIDEsCiAgICAgICAgICAgICAgICBzZC0+dS5zLnBvc2l0aW9uLmxwRGF0YSkpOwoKICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5wb3NpdGlvbi5WQk8pIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfQVJSQVlfQlVGRkVSX0FSQiwgc2QtPnUucy5wb3NpdGlvbi5WQk8pKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQmluZEJ1ZmZlckFSQiIpOwogICAgICAgICAgICBjdXJWQk8gPSBzZC0+dS5zLnBvc2l0aW9uLlZCTzsKICAgICAgICB9CgogICAgICAgIC8qIG1pbihXSU5FRDNEX0FUUl9TSVpFKHBvc2l0aW9uKSwzKSB0byBEaXNhYmxlIFJIVyBtb2RlIGFzICd3JyBjb29yZAogICAgICAgICAgIGhhbmRsaW5nIGZvciByaHcgbW9kZSBzaG91bGQgbm90IGltcGFjdCBzY3JlZW4gcG9zaXRpb24gd2hlcmVhcyBpbiBHTCBpdCBkb2VzLgogICAgICAgICAgIFRoaXMgbWF5IHJlc3VsdCBpbiB2ZXJ5IHNsaWdodGx5IGRpc3RvcnRlZCB0ZXh0dXJlcyBpbiByaHcgbW9kZS4KICAgICAgICAgICBUaGVyZSdzIGFsd2F5cyB0aGUgb3RoZXIgb3B0aW9uIG9mIGZpeGluZyB0aGUgdmlldyBtYXRyaXggdG8KICAgICAgICAgICBwcmV2ZW50IHcgZnJvbSBoYXZpbmcgYW55IGVmZmVjdC4KCiAgICAgICAgICAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gdXNlciBwb2ludGVyIHNvdXJjZXMsIGluIFZCT3MgdGhlIHZlcnRpY2VzIGFyZSBmaXhlZCB1cAogICAgICAgICAqLwogICAgICAgIGlmKHNkLT51LnMucG9zaXRpb24uVkJPID09IDApIHsKICAgICAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDMgLyogbWluKFdJTkVEM0RfQVRSX1NJWkUoc2QtPnUucy5wb3NpdGlvbi5kd1R5cGUpLDMpICovLAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMucG9zaXRpb24uZHdUeXBlKSwKICAgICAgICAgICAgICAgIHNkLT51LnMucG9zaXRpb24uZHdTdHJpZGUsIHNkLT51LnMucG9zaXRpb24ubHBEYXRhICsgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHNkLT51LnMucG9zaXRpb24uZHdTdHJpZGUgKyBvZmZzZXRbc2QtPnUucy5wb3NpdGlvbi5zdHJlYW1Ob10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsVmVydGV4UG9pbnRlcigKICAgICAgICAgICAgICAgIFdJTkVEM0RfQVRSX1NJWkUoc2QtPnUucy5wb3NpdGlvbi5kd1R5cGUpLAogICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMucG9zaXRpb24uZHdUeXBlKSwKICAgICAgICAgICAgICAgIHNkLT51LnMucG9zaXRpb24uZHdTdHJpZGUsIHNkLT51LnMucG9zaXRpb24ubHBEYXRhICsgc3RhdGVibG9jay0+bG9hZEJhc2VWZXJ0ZXhJbmRleCAqIHNkLT51LnMucG9zaXRpb24uZHdTdHJpZGUgKyBvZmZzZXRbc2QtPnUucy5wb3NpdGlvbi5zdHJlYW1Ob10pOwogICAgICAgIH0KICAgICAgICBjaGVja0dMY2FsbCgiZ2xWZXJ0ZXhQb2ludGVyKC4uLikiKTsKICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKSIpOwogICAgfQoKICAgIC8qIE5vcm1hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoc2QtPnUucy5ub3JtYWwubHBEYXRhIHx8IHNkLT51LnMubm9ybWFsLlZCTykgewogICAgICAgIC8qIE5vdGUgZHdUeXBlID09IGZsb2F0MyBvciBmbG9hdDQgPT0gMiBvciAzICovCiAgICAgICAgVlRSQUNFKCgiZ2xOb3JtYWxQb2ludGVyKEdMX0ZMT0FULCAlZCwgJXApXG4iLAogICAgICAgICAgICAgICAgc2QtPnUucy5ub3JtYWwuZHdTdHJpZGUsCiAgICAgICAgICAgICAgICBzZC0+dS5zLm5vcm1hbC5scERhdGEpKTsKICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5ub3JtYWwuVkJPKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0FSUkFZX0JVRkZFUl9BUkIsIHNkLT51LnMubm9ybWFsLlZCTykpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgIGN1clZCTyA9IHNkLT51LnMubm9ybWFsLlZCTzsKICAgICAgICB9CiAgICAgICAgZ2xOb3JtYWxQb2ludGVyKAogICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc2QtPnUucy5ub3JtYWwuZHdUeXBlKSwKICAgICAgICAgICAgc2QtPnUucy5ub3JtYWwuZHdTdHJpZGUsCiAgICAgICAgICAgIHNkLT51LnMubm9ybWFsLmxwRGF0YSArIHN0YXRlYmxvY2stPmxvYWRCYXNlVmVydGV4SW5kZXggKiBzZC0+dS5zLm5vcm1hbC5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLm5vcm1hbC5zdHJlYW1Ob10pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbE5vcm1hbFBvaW50ZXIoLi4uKSIpOwogICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpIik7CgogICAgfSBlbHNlIHsKICAgICAgICBnbE5vcm1hbDNmKDAsIDAsIDApOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbE5vcm1hbDNmKDAsIDAsIDApIik7CiAgICB9CgogICAgLyogRGlmZnVzZSBDb2xvdXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgLyogIFdBUk5JTkc6IERhdGEgaGVyZSBNVVNUIGJlIGluIFJHQkEgZm9ybWF0LCBzbyBjYW5ub3QgICAgICAqLwogICAgLyogICAgIGdvIGRpcmVjdGx5IGludG8gZmFzdCBtb2RlIGZyb20gYXBwIHBnbSwgYmVjYXVzZSAgICAgICAqLwogICAgLyogICAgIGRpcmVjdHggcmVxdWlyZXMgZGF0YSBpbiBCR1JBIGZvcm1hdC4gICAgICAgICAgICAgICAgICAqLwogICAgLyogY3VycmVudGx5IGZpeHVwVmVydGljZXMgc3dpenpsZXMgdGhlIGZvcm1hdCwgYnV0IHRoaXMgaXNuJ3QqLwogICAgLyogdmVyeSBwcmFjdGljYWwgd2hlbiB1c2luZyBWQk9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogTk9URTogVW5sZXNzIHdlIHdyaXRlIGEgdmVydGV4IHNoYWRlciB0byBzd2l6emxlIHRoZSBjb2xvdXIqLwogICAgLyogLCBvciB0aGUgdXNlciBkb2Vzbid0IGNhcmUgYW5kIHdhbnRzIHRoZSBzcGVlZCBhZHZhbnRhZ2UgICAqLwoKICAgIGlmIChzZC0+dS5zLmRpZmZ1c2UubHBEYXRhIHx8IHNkLT51LnMuZGlmZnVzZS5WQk8pIHsKICAgICAgICAvKiBOb3RlIGR3VHlwZSA9PSBmbG9hdDMgb3IgZmxvYXQ0ID09IDIgb3IgMyAqLwogICAgICAgIFZUUkFDRSgoImdsQ29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsICVkLCAlcClcbiIsCiAgICAgICAgICAgICAgICBzZC0+dS5zLmRpZmZ1c2UuZHdTdHJpZGUsCiAgICAgICAgICAgICAgICBzZC0+dS5zLmRpZmZ1c2UubHBEYXRhKSk7CgogICAgICAgIGlmKGN1clZCTyAhPSBzZC0+dS5zLmRpZmZ1c2UuVkJPKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0FSUkFZX0JVRkZFUl9BUkIsIHNkLT51LnMuZGlmZnVzZS5WQk8pKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsQmluZEJ1ZmZlckFSQiIpOwogICAgICAgICAgICBjdXJWQk8gPSBzZC0+dS5zLmRpZmZ1c2UuVkJPOwogICAgICAgIH0KCiAgICAgICAgZ2xDb2xvclBvaW50ZXIoV0lORUQzRF9BVFJfU0laRShzZC0+dS5zLmRpZmZ1c2UuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEX0FUUl9HTFRZUEUoc2QtPnUucy5kaWZmdXNlLmR3VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5kaWZmdXNlLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgIHNkLT51LnMuZGlmZnVzZS5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5kaWZmdXNlLmR3U3RyaWRlICsgb2Zmc2V0W3NkLT51LnMuZGlmZnVzZS5zdHJlYW1Ob10pOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAuLi4pIik7CiAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpIik7CgogICAgfSBlbHNlIHsKICAgICAgICBnbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQ29sb3I0ZigxLCAxLCAxLCAxKSIpOwogICAgfQoKICAgIC8qIFNwZWN1bGFyIENvbG91ciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKHNkLT51LnMuc3BlY3VsYXIubHBEYXRhIHx8IHNkLT51LnMuc3BlY3VsYXIuVkJPKSB7CiAgICAgICAgVFJBQ0UoInNldHRpbmcgc3BlY3VsYXIgY29sb3VyXG4iKTsKICAgICAgICAvKiBOb3RlIGR3VHlwZSA9PSBmbG9hdDMgb3IgZmxvYXQ0ID09IDIgb3IgMyAqLwogICAgICAgIFZUUkFDRSgoImdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyKDQsIEdMX1VOU0lHTkVEX0JZVEUsICVkLCAlcClcbiIsCiAgICAgICAgICAgICAgICBzZC0+dS5zLnNwZWN1bGFyLmR3U3RyaWRlLAogICAgICAgICAgICAgICAgc2QtPnUucy5zcGVjdWxhci5scERhdGEpKTsKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgICAgICBpZihjdXJWQk8gIT0gc2QtPnUucy5zcGVjdWxhci5WQk8pIHsKICAgICAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX0FSUkFZX0JVRkZFUl9BUkIsIHNkLT51LnMuc3BlY3VsYXIuVkJPKSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xCaW5kQnVmZmVyQVJCIik7CiAgICAgICAgICAgICAgICBjdXJWQk8gPSBzZC0+dS5zLnNwZWN1bGFyLlZCTzsKICAgICAgICAgICAgfQogICAgICAgICAgICBHTF9FWFRDQUxMKGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUKShXSU5FRDNEX0FUUl9TSVpFKHNkLT51LnMuc3BlY3VsYXIuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRF9BVFJfR0xUWVBFKHNkLT51LnMuc3BlY3VsYXIuZHdUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5zcGVjdWxhci5kd1N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QtPnUucy5zcGVjdWxhci5scERhdGEgKyBzdGF0ZWJsb2NrLT5sb2FkQmFzZVZlcnRleEluZGV4ICogc2QtPnUucy5zcGVjdWxhci5kd1N0cmlkZSArIG9mZnNldFtzZC0+dS5zLnNwZWN1bGFyLnN0cmVhbU5vXSk7CiAgICAgICAgICAgIHZjaGVja0dMY2FsbCgiZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXJFWFQoNCwgR0xfVU5TSUdORURfQllURSwgLi4uKSIpOwogICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9FWFQpOwogICAgICAgICAgICB2Y2hlY2tHTGNhbGwoImdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0VYVCkiKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAvKiBNaXNzaW5nIHNwZWN1bGFyIGNvbG9yIGlzIG5vdCBjcml0aWNhbCwgbm8gd2FybmluZ3MgKi8KICAgICAgICBWVFJBQ0UoKCJTcGVjdWxhciBjb2xvdXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIEdMIGltcGxlbWVudGF0aW9uXG4iKSk7CiAgICAgICAgfQoKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKEdMX1NVUFBPUlQoRVhUX1NFQ09OREFSWV9DT0xPUikpIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbFNlY29uZGFyeUNvbG9yM2ZFWFQpKDAsIDAsIDApOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xTZWNvbmRhcnlDb2xvcjNmRVhUKDAsIDAsIDApIik7CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIC8qIE1pc3Npbmcgc3BlY3VsYXIgY29sb3IgaXMgbm90IGNyaXRpY2FsLCBubyB3YXJuaW5ncyAqLwogICAgICAgICAgICBWVFJBQ0UoKCJTcGVjdWxhciBjb2xvdXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIEdMIGltcGxlbWVudGF0aW9uXG4iKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFRleHR1cmUgY29vcmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgbG9hZFRleENvb3JkcyhzdGF0ZWJsb2NrLCBzZCwgJmN1clZCTyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBkcmF3UHJpbWl0aXZlVHJhY2VEYXRhTG9jYXRpb25zKAogICAgV2luZURpcmVjdDNEVmVydGV4U3RyaWRlZERhdGEgKmRhdGFMb2NhdGlvbnMpIHsKCiAgICAvKiBEdW1wIG91dCB3aGF0IHBhcnRzIHdlIGhhdmUgc3VwcGxpZWQgKi8KICAgIFRSQUNFKCJTdHJpZGVkIERhdGE6XG4iKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBwb3NpdGlvbik7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgYmxlbmRXZWlnaHRzKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBibGVuZE1hdHJpeEluZGljZXMpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIG5vcm1hbCk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgcFNpemUpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIGRpZmZ1c2UpOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHNwZWN1bGFyKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0ZXhDb29yZHNbMF0pOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRleENvb3Jkc1sxXSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgdGV4Q29vcmRzWzJdKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0ZXhDb29yZHNbM10pOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRleENvb3Jkc1s0XSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgdGV4Q29vcmRzWzVdKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0ZXhDb29yZHNbNl0pOwogICAgVFJBQ0VfU1RSSURFRCgoZGF0YUxvY2F0aW9ucyksIHRleENvb3Jkc1s3XSk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgcG9zaXRpb24yKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBub3JtYWwyKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCB0YW5nZW50KTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBiaW5vcm1hbCk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgdGVzc0ZhY3Rvcik7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgZm9nKTsKICAgIFRSQUNFX1NUUklERUQoKGRhdGFMb2NhdGlvbnMpLCBkZXB0aCk7CiAgICBUUkFDRV9TVFJJREVEKChkYXRhTG9jYXRpb25zKSwgc2FtcGxlKTsKCiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkIHN0cmVhbXNyYyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2aWNlID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZTsKICAgIEJPT0wgZml4dXAgPSBGQUxTRTsKICAgIFdpbmVEaXJlY3QzRFZlcnRleFN0cmlkZWREYXRhICpkYXRhTG9jYXRpb25zID0gJmRldmljZS0+c3RyaWRlZF9zdHJlYW1zOwogICAgQk9PTCB1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbjsKCiAgICBpZiAoZGV2aWNlLT52c19zZWxlY3RlZF9tb2RlICE9IFNIQURFUl9OT05FICYmIHN0YXRlYmxvY2stPnZlcnRleFNoYWRlciAmJgogICAgICAgICgoSVdpbmVEM0RWZXJ0ZXhTaGFkZXJJbXBsICopc3RhdGVibG9jay0+dmVydGV4U2hhZGVyKS0+YmFzZVNoYWRlci5mdW5jdGlvbiAhPSBOVUxMKSB7CiAgICAgICAgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24gPSBUUlVFOwogICAgfSBlbHNlIHsKICAgICAgICB1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiA9IEZBTFNFOwogICAgfQoKCiAgICBpZihkZXZpY2UtPnVwX3N0cmlkZWQpIHsKICAgICAgICAvKiBOb3RlOiB0aGlzIGlzIGEgZGRyYXcgZml4ZWQtZnVuY3Rpb24gY29kZSBwYXRoICovCiAgICAgICAgVFJBQ0UoIj09PT09PT09PT09PT09PT0gU3RyaWRlZCBJbnB1dCA9PT09PT09PT09PT09PT09PT09XG4iKTsKICAgICAgICBtZW1jcHkoZGF0YUxvY2F0aW9ucywgZGV2aWNlLT51cF9zdHJpZGVkLCBzaXplb2YoKmRhdGFMb2NhdGlvbnMpKTsKCiAgICAgICAgaWYoVFJBQ0VfT04oZDNkKSkgewogICAgICAgICAgICBkcmF3UHJpbWl0aXZlVHJhY2VEYXRhTG9jYXRpb25zKGRhdGFMb2NhdGlvbnMpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogTm90ZTogVGhpcyBpcyBhIGZpeGVkIGZ1bmN0aW9uIG9yIHNoYWRlciBjb2RlcGF0aC4KICAgICAgICAgKiBUaGlzIG1lYW5zIGl0IG11c3QgaGFuZGxlIGJvdGggdHlwZXMgb2Ygc3RyaWRlZCBkYXRhLgogICAgICAgICAqIFNoYWRlcnMgbXVzdCBnbyB0aHJvdWdoIGhlcmUgdG8gemVybyB0aGUgc3RyaWRlZCBkYXRhLCBldmVuIGlmIHRoZXkKICAgICAgICAgKiBkb24ndCBzZXQgYW55IGRlY2xhcmF0aW9uIGF0IGFsbAogICAgICAgICAqLwogICAgICAgIFRSQUNFKCI9PT09PT09PT09PT09PT09IFZlcnRleCBEZWNsYXJhdGlvbiAgPT09PT09PT09PT09PT09PT09PVxuIik7CiAgICAgICAgbWVtc2V0KGRhdGFMb2NhdGlvbnMsIDAsIHNpemVvZigqZGF0YUxvY2F0aW9ucykpOwogICAgICAgIHByaW1pdGl2ZURlY2xhcmF0aW9uQ29udmVydFRvU3RyaWRlZERhdGEoKElXaW5lRDNERGV2aWNlICopIGRldmljZSwKICAgICAgICAgICAgICAgIHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uLCBkYXRhTG9jYXRpb25zLCAmZml4dXApOwogICAgfQoKICAgIGlmIChkYXRhTG9jYXRpb25zLT51LnMucG9zaXRpb25fdHJhbnNmb3JtZWQpIHsKICAgICAgICB1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiA9IEZBTFNFOwogICAgfQoKICAgIC8qIFVubG9hZCB0aGUgb2xkIGFycmF5cyBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IG9uZXMgdG8gZ2V0IG9sZCBqdW5rIG91dCAqLwogICAgaWYoY29udGV4dC0+bnVtYmVyZWRBcnJheXNMb2FkZWQpIHsKICAgICAgICB1bmxvYWROdW1iZXJlZEFycmF5cyhzdGF0ZWJsb2NrKTsKICAgICAgICBjb250ZXh0LT5udW1iZXJlZEFycmF5c0xvYWRlZCA9IEZBTFNFOwogICAgfQogICAgaWYoY29udGV4dC0+bmFtZWRBcnJheXNMb2FkZWQpIHsKICAgICAgICB1bmxvYWRWZXJ0ZXhEYXRhKHN0YXRlYmxvY2spOwogICAgICAgIGNvbnRleHQtPm5hbWVkQXJyYXlzTG9hZGVkID0gRkFMU0U7CiAgICB9CgogICAgaWYodXNlVmVydGV4U2hhZGVyRnVuY3Rpb24pIHsKICAgICAgICBpZigoKElXaW5lRDNEVmVydGV4RGVjbGFyYXRpb25JbXBsICopIHN0YXRlYmxvY2stPnZlcnRleERlY2wpLT5oYWxmX2Zsb2F0X2NvbnZfbmVlZGVkICYmICFmaXh1cCkgewogICAgICAgICAgICBUUkFDRSgiVXNpbmcgZHJhd1N0cmlkZWRTbG93IHdpdGggdmVydGV4IHNoYWRlcnMgZm9yIEZMT0FUMTYgY29udmVyc2lvblxuIik7CiAgICAgICAgICAgIGRldmljZS0+dXNlRHJhd1N0cmlkZWRTbG93ID0gVFJVRTsKICAgICAgICAgICAgY29udGV4dC0+bnVtYmVyZWRBcnJheXNMb2FkZWQgPSBGQUxTRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRSgiTG9hZGluZyBudW1iZXJlZCBhcnJheXNcbiIpOwogICAgICAgICAgICBsb2FkTnVtYmVyZWRBcnJheXMoc3RhdGVibG9jaywgZGF0YUxvY2F0aW9ucyk7CiAgICAgICAgICAgIGRldmljZS0+dXNlRHJhd1N0cmlkZWRTbG93ID0gRkFMU0U7CiAgICAgICAgICAgIGNvbnRleHQtPm51bWJlcmVkQXJyYXlzTG9hZGVkID0gVFJVRTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKGZpeHVwIHx8CiAgICAgICAgICAgICAgIChkYXRhTG9jYXRpb25zLT51LnMucFNpemUubHBEYXRhID09IE5VTEwgJiYKICAgICAgICAgICAgICAgIGRhdGFMb2NhdGlvbnMtPnUucy5kaWZmdXNlLmxwRGF0YSA9PSBOVUxMICYmCiAgICAgICAgICAgICAgICBkYXRhTG9jYXRpb25zLT51LnMuc3BlY3VsYXIubHBEYXRhID09IE5VTEwpKSB7CiAgICAgICAgLyogTG9hZCB0aGUgdmVydGV4IGRhdGEgdXNpbmcgbmFtZWQgYXJyYXlzICovCiAgICAgICAgVFJBQ0UoIkxvYWRpbmcgdmVydGV4IGRhdGFcbiIpOwogICAgICAgIGxvYWRWZXJ0ZXhEYXRhKHN0YXRlYmxvY2ssIGRhdGFMb2NhdGlvbnMpOwogICAgICAgIGRldmljZS0+dXNlRHJhd1N0cmlkZWRTbG93ID0gRkFMU0U7CiAgICAgICAgY29udGV4dC0+bmFtZWRBcnJheXNMb2FkZWQgPSBUUlVFOwogICAgfSBlbHNlIHsKICAgICAgICBUUkFDRSgiTm90IGxvYWRpbmcgdmVydGV4IGRhdGFcbiIpOwogICAgICAgIGRldmljZS0+dXNlRHJhd1N0cmlkZWRTbG93ID0gVFJVRTsKICAgIH0KCi8qIEdlbmVyYXRlIHNvbWUgZml4bWUncyBpZiB1bnN1cHBvcnRlZCBmdW5jdGlvbmFsaXR5IGlzIGJlaW5nIHVzZWQgKi8KI2RlZmluZSBCVUZGRVJfT1JfREFUQShfYXR0cmlidXRlKSBkYXRhTG9jYXRpb25zLT51LnMuX2F0dHJpYnV0ZS5scERhdGEKICAgIC8qIFRPRE86IEVpdGhlciBzdXBwb3J0IG1pc3NpbmcgZnVuY3Rpb25hbGl0eSBpbiBmaXh1cFZlcnRpY2VzIG9yIGJ5IGNyZWF0aW5nIGEgc2hhZGVyIHRvIHJlcGxhY2UgdGhlIHBpcGVsaW5lLiAqLwogICAgaWYgKCF1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiAmJiAoQlVGRkVSX09SX0RBVEEocG9zaXRpb24yKSB8fCBCVUZGRVJfT1JfREFUQShub3JtYWwyKSkpIHsKICAgICAgICBGSVhNRSgiVHdlZW5pbmcgaXMgb25seSB2YWxpZCB3aXRoIHZlcnRleCBzaGFkZXJzXG4iKTsKICAgIH0KICAgIGlmICghdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24gJiYgKEJVRkZFUl9PUl9EQVRBKHRhbmdlbnQpIHx8IEJVRkZFUl9PUl9EQVRBKGJpbm9ybWFsKSkpIHsKICAgICAgICBGSVhNRSgiVGFuZ2VudCBhbmQgYmlub3JtYWwgYnVtcCBtYXBwaW5nIGlzIG9ubHkgdmFsaWQgd2l0aCB2ZXJ0ZXggc2hhZGVyc1xuIik7CiAgICB9CiAgICBpZiAoIXVzZVZlcnRleFNoYWRlckZ1bmN0aW9uICYmIChCVUZGRVJfT1JfREFUQSh0ZXNzRmFjdG9yKSB8fCBCVUZGRVJfT1JfREFUQShmb2cpIHx8IEJVRkZFUl9PUl9EQVRBKGRlcHRoKSB8fCBCVUZGRVJfT1JfREFUQShzYW1wbGUpKSkgewogICAgICAgIEZJWE1FKCJFeHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBvbmx5IHZhbGlkIHdpdGggdmVydGV4IHNoYWRlcnNcbiIpOwogICAgfQojdW5kZWYgQlVGRkVSX09SX0RBVEEKfQoKc3RhdGljIHZvaWQgdmVydGV4ZGVjbGFyYXRpb24oRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBCT09MIHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uID0gRkFMU0UsIHVwZGF0ZUZvZyA9IEZBTFNFOwogICAgQk9PTCB1c2VQaXhlbFNoYWRlckZ1bmN0aW9uID0gc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+cHNfc2VsZWN0ZWRfbW9kZSAhPSBTSEFERVJfTk9ORSAmJiBzdGF0ZWJsb2NrLT5waXhlbFNoYWRlcgogICAgICAgICAgICAmJiAoKElXaW5lRDNEUGl4ZWxTaGFkZXJJbXBsICopc3RhdGVibG9jay0+cGl4ZWxTaGFkZXIpLT5iYXNlU2hhZGVyLmZ1bmN0aW9uOwogICAgQk9PTCB0cmFuc2Zvcm1lZDsKICAgIC8qIFNvbWUgc3R1ZmYgaXMgaW4gdGhlIGRldmljZSB1bnRpbCB3ZSBoYXZlIHBlciBjb250ZXh0IHRyYWNraW5nICovCiAgICBJV2luZUQzRERldmljZUltcGwgKmRldmljZSA9IHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2U7CiAgICBCT09MIHdhc3JodyA9IGNvbnRleHQtPmxhc3Rfd2FzX3JodzsKCiAgICAvKiBTaGFkZXJzIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZyBBUkJfUFJPR1JBTSwgR0xTTCwgb3Igc29mdHdhcmUgLQogICAgICogaGVyZSBzaW1wbHkgY2hlY2sgd2hldGhlciBhIHNoYWRlciB3YXMgc2V0LCBvciB0aGUgdXNlciBkaXNhYmxlZCBzaGFkZXJzCiAgICAgKi8KICAgIGlmICh1c2VfdnMoZGV2aWNlKSkgewogICAgICAgIHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uID0gVFJVRTsKCiAgICAgICAgaWYoKChJV2luZUQzRFZlcnRleFNoYWRlckltcGwgKilzdGF0ZWJsb2NrLT52ZXJ0ZXhTaGFkZXIpLT5iYXNlU2hhZGVyLnJlZ19tYXBzLmZvZyAhPSBjb250ZXh0LT5sYXN0X3dhc19mb2dneV9zaGFkZXIpIHsKICAgICAgICAgICAgdXBkYXRlRm9nID0gVFJVRTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYoY29udGV4dC0+bGFzdF93YXNfZm9nZ3lfc2hhZGVyKSB7CiAgICAgICAgdXBkYXRlRm9nID0gVFJVRTsKICAgIH0KCiAgICB0cmFuc2Zvcm1lZCA9IGRldmljZS0+c3RyaWRlZF9zdHJlYW1zLnUucy5wb3NpdGlvbl90cmFuc2Zvcm1lZDsKICAgIGlmICh0cmFuc2Zvcm1lZCkgdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24gPSBGQUxTRTsKCiAgICBpZih0cmFuc2Zvcm1lZCAhPSBjb250ZXh0LT5sYXN0X3dhc19yaHcgJiYgIXVzZVZlcnRleFNoYWRlckZ1bmN0aW9uKSB7CiAgICAgICAgdXBkYXRlRm9nID0gVFJVRTsKICAgIH0KCiAgICAvKiBSZWFwcGx5IGxpZ2h0aW5nIGlmIGl0IGlzIG5vdCBzY2hlZHVsZWQgZm9yIHJlYXBwbGljYXRpb24gYWxyZWFkeSAqLwogICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0xJR0hUSU5HKSkpIHsKICAgICAgICBzdGF0ZV9saWdodGluZyhTVEFURV9SRU5ERVIoV0lORUQzRFJTX0xJR0hUSU5HKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICB9CgogICAgaWYgKHRyYW5zZm9ybWVkKSB7CiAgICAgICAgY29udGV4dC0+bGFzdF93YXNfcmh3ID0gVFJVRTsKICAgIH0gZWxzZSB7CgogICAgICAgIC8qIFVudHJhbnNmb3JtZWQsIHNvIHJlbGllcyBvbiB0aGUgdmlldyBhbmQgcHJvamVjdGlvbiBtYXRyaWNlcyAqLwogICAgICAgIGNvbnRleHQtPmxhc3Rfd2FzX3JodyA9IEZBTFNFOwogICAgICAgIC8qIFRoaXMgdHVybnMgb2ZmIHRoZSBaIHNjYWxlIHRyaWNrIHRvICdkaXNhYmxlJyB2aWV3cG9ydCBmcnVzdHVtIGNsaXBwaW5nIGluIHJodyBtb2RlKi8KICAgICAgICBkZXZpY2UtPnVudHJhbnNmb3JtZWQgPSBUUlVFOwoKICAgICAgICAvKiBUb2RvIGZvciBzdyBzaGFkZXJzOiBWZXJ0ZXggU2hhZGVyIG91dHB1dCBpcyBhbHJlYWR5IHRyYW5zZm9ybWVkLCBzbyBzZXQgdXAgaWRlbnRpdHkgbWF0cmljZXMKICAgICAgICAgKiBOb3QgbmVlZGVkIGFzIGxvbmcgYXMgb25seSBodyBzaGFkZXJzIGFyZSBzdXBwb3J0ZWQKICAgICAgICAgKi8KCiAgICAgICAgLyogVGhpcyBzZXRzIHRoZSBzaGFkZXIgb3V0cHV0IHBvc2l0aW9uIGNvcnJlY3Rpb24gY29uc3RhbnRzLgogICAgICAgICAqIFRPRE86IE1vdmUgdG8gdGhlIHZpZXdwb3J0IHN0YXRlCiAgICAgICAgICovCiAgICAgICAgaWYgKHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGRldmljZS0+cG9zRml4dXBbMV0gPSBkZXZpY2UtPnJlbmRlcl9vZmZzY3JlZW4gPyAtMS4wIDogMS4wOwogICAgICAgICAgICBkZXZpY2UtPnBvc0ZpeHVwWzNdID0gLWRldmljZS0+cG9zRml4dXBbMV0gLyBzdGF0ZWJsb2NrLT52aWV3cG9ydC5IZWlnaHQ7CiAgICAgICAgfQogICAgfQoKICAgIC8qIERvbid0IGhhdmUgdG8gYXBwbHkgdGhlIG1hdHJpY2VzIHdoZW4gdmVydGV4IHNoYWRlcnMgYXJlIHVzZWQuIFdoZW4gdnNoYWRlcnMgYXJlIHR1cm5lZAogICAgICogb2ZmIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gYW55d2F5IHRvIG1ha2Ugc3VyZSB0aGV5J3JlIHByb3Blcmx5IHNldAogICAgICovCiAgICBpZighdXNlVmVydGV4U2hhZGVyRnVuY3Rpb24pIHsKICAgICAgICAvKiBUT0RPOiBNb3ZlIHRoaXMgbWFpbmx5IHRvIHRoZSB2aWV3cG9ydCBzdGF0ZSBhbmQgb25seSBhcHBseSB3aGVuIHRoZSB2cCBoYXMgY2hhbmdlZAogICAgICAgICAqIG9yIHRyYW5zZm9ybWVkIC8gdW50cmFuc2Zvcm1lZCB3YXMgc3dpdGNoZWQKICAgICAgICAgKi8KICAgICAgIGlmKHdhc3JodyAhPSBjb250ZXh0LT5sYXN0X3dhc19yaHcgJiYKICAgICAgICAgICFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19QUk9KRUNUSU9OKSkgJiYKICAgICAgICAgICFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVklFV1BPUlQpKSB7CiAgICAgICAgICAgIHRyYW5zZm9ybV9wcm9qZWN0aW9uKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfUFJPSkVDVElPTiksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgICAvKiBXb3JsZCBtYXRyaXggbmVlZHMgcmVhcHBsaWNhdGlvbiBoZXJlIG9ubHkgaWYgd2UncmUgc3dpdGNoaW5nIGJldHdlZW4gcmh3IGFuZCBub24tcmh3CiAgICAgICAgICogbW9kZS4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgdmVydGV4IHNoYWRlciBpcyB1c2VkLCB0aGUgd29ybGQgbWF0cml4IGNoYW5nZWQgYW5kIHRoZW4gdmVydGV4IHNoYWRlciB1bmJvdW5kCiAgICAgICAgICogdGhpcyBjaGVjayB3aWxsIGZhaWwgYW5kIHRoZSBtYXRyaXggbm90IGFwcGxpZWQgYWdhaW4uIFRoaXMgaXMgT0sgYmVjYXVzZSBhIHNpbXBsZQogICAgICAgICAqIHdvcmxkIG1hdHJpeCBjaGFuZ2UgcmVhcHBsaWVzIHRoZSBtYXRyaXggLSBUaGVzZSBjaGVja3MgaGVyZSBhcmUgb25seSB0byBzYXRpc2Z5IHRoZQogICAgICAgICAqIG5lZWRzIG9mIHRoZSB2ZXJ0ZXggZGVjbGFyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBXb3JsZCBhbmQgdmlldyBtYXRyaXggZ28gaW50byB0aGUgc2FtZSBnbCBtYXRyaXgsIHNvIG9ubHkgYXBwbHkgdGhlbSB3aGVuIG5laXRoZXIgaXMKICAgICAgICAgKiBkaXJ0eQogICAgICAgICAqLwogICAgICAgIGlmKHRyYW5zZm9ybWVkICE9IHdhc3JodyAmJgogICAgICAgICAgICFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSkpICYmCiAgICAgICAgICAgIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1ZJRVcpKSkgewogICAgICAgICAgICB0cmFuc2Zvcm1fd29ybGQoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgIH0KCiAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSkpIHsKICAgICAgICAgICAgc3RhdGVfY29sb3JtYXQoU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DT0xPUlZFUlRFWCksIHN0YXRlYmxvY2ssIGNvbnRleHQpOwogICAgICAgIH0KCiAgICAgICAgaWYoY29udGV4dC0+bGFzdF93YXNfdnNoYWRlciAmJiAhaXNTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQ0xJUFBMQU5FRU5BQkxFKSkpIHsKICAgICAgICAgICAgc3RhdGVfY2xpcHBpbmcoU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DTElQUExBTkVFTkFCTEUpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgaWYoIWlzU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX05PUk1BTElaRU5PUk1BTFMpKSkgewogICAgICAgICAgICBzdGF0ZV9ub3JtYWxpemUoU1RBVEVfUkVOREVSKFdJTkVEM0RSU19OT1JNQUxJWkVOT1JNQUxTKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBXZSBjb21waWxlIHRoZSBzaGFkZXIgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdGhlIHZlcnRleCBkZWNsYXJhdGlvbgogICAgICAgICAqIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGRvIGFueSBzd2l6emxpbmcgZm9yIEQzRENPTE9SCiAgICAgICAgICogcmVnaXN0ZXJzLiBJZiB0aGUgc2hhZGVyIGlzIGFscmVhZHkgY29tcGlsZWQgdGhpcyBjYWxsIHdpbGwgZG8gbm90aGluZy4gKi8KICAgICAgICBJV2luZUQzRFZlcnRleFNoYWRlcl9Db21waWxlU2hhZGVyKHN0YXRlYmxvY2stPnZlcnRleFNoYWRlcik7CgogICAgICAgIGlmKCFjb250ZXh0LT5sYXN0X3dhc192c2hhZGVyKSB7CiAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICBzdGF0aWMgQk9PTCB3YXJuZWQgPSBGQUxTRTsKICAgICAgICAgICAgLyogRGlzYWJsZSBhbGwgY2xpcCBwbGFuZXMgdG8gZ2V0IGRlZmluZWQgcmVzdWx0cyBvbiBhbGwgZHJpdmVycy4gU2VlIGNvbW1lbnQgaW4gdGhlCiAgICAgICAgICAgICAqIHN0YXRlX2NsaXBwaW5nIHN0YXRlIGhhbmRsZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IEdMX0xJTUlUUyhjbGlwcGxhbmVzKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfQ0xJUF9QTEFORTAgKyBpKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfQ0xJUF9QTEFORTAgKyBpKSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZighd2FybmVkICYmIHN0YXRlYmxvY2stPnJlbmRlclN0YXRlW1dJTkVEM0RSU19DTElQUExBTkVFTkFCTEVdKSB7CiAgICAgICAgICAgICAgICBGSVhNRSgiQ2xpcHBpbmcgbm90IHN1cHBvcnRlZCB3aXRoIHZlcnRleCBzaGFkZXJzXG4iKTsKICAgICAgICAgICAgICAgIHdhcm5lZCA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYod2Fzcmh3KSB7CiAgICAgICAgICAgICAgICAvKiBBcHBseSB0aGUgdHJhbnNmb3JtIG1hdHJpY2VzIHdoZW4gc3dpdGNoaW5nIGZyb20gcmh3IGRyYXdpbmcgdG8gdmVydGV4IHNoYWRlcnMuIFZlcnRleAogICAgICAgICAgICAgICAgICogc2hhZGVycyB0aGVtc2VsdmVzIGRvIG5vdCBuZWVkIGl0LCBidXQgdGhlIG1hdHJpY2VzIGFyZSBub3QgcmVhcHBsaWVkIGF1dG9tYXRpY2FsbHkgd2hlbgogICAgICAgICAgICAgICAgICogc3dpdGNoaW5nIGJhY2sgZnJvbSB2ZXJ0ZXggc2hhZGVycyB0byBmaXhlZCBmdW5jdGlvbiBwcm9jZXNzaW5nLiBTbyBtYWtlIHN1cmUgd2UgbGVhdmUgdGhlCiAgICAgICAgICAgICAgICAgKiBmaXhlZCBmdW5jdGlvbiB2ZXJ0ZXggcHJvY2Vzc2luZyBzdGF0ZXMgYmFjayBpbiBhIHNhbmUgc3RhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzaGFkZXJzCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19QUk9KRUNUSU9OKSkpIHsKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fcHJvamVjdGlvbihTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19XT1JMRE1BVFJJWCgwKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dvcmxkKFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMCkpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBWZXJ0ZXggYW5kIHBpeGVsIHNoYWRlcnMgYXJlIGFwcGxpZWQgdG9nZXRoZXIgZm9yIG5vdywgc28gbGV0IHRoZSBsYXN0IGRpcnR5IHN0YXRlIGRvIHRoZQogICAgICogYXBwbGljYXRpb24KICAgICAqLwogICAgaWYgKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUElYRUxTSEFERVIpKSB7CiAgICAgICAgZGV2aWNlLT5zaGFkZXJfYmFja2VuZC0+c2hhZGVyX3NlbGVjdCgoSVdpbmVEM0REZXZpY2UgKilkZXZpY2UsIHVzZVBpeGVsU2hhZGVyRnVuY3Rpb24sIHVzZVZlcnRleFNoYWRlckZ1bmN0aW9uKTsKCiAgICAgICAgaWYgKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkVSVEVYU0hBREVSQ09OU1RBTlQpICYmICh1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbiB8fCB1c2VQaXhlbFNoYWRlckZ1bmN0aW9uKSkgewogICAgICAgICAgICBzaGFkZXJjb25zdGFudChTVEFURV9WRVJURVhTSEFERVJDT05TVEFOVCwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnRleHQtPmxhc3Rfd2FzX3ZzaGFkZXIgPSB1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbjsKCiAgICBpZih1cGRhdGVGb2cpIHsKICAgICAgICBzdGF0ZV9mb2coU1RBVEVfUkVOREVSKFdJTkVEM0RSU19GT0dFTkFCTEUpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KICAgIGlmKCF1c2VWZXJ0ZXhTaGFkZXJGdW5jdGlvbikgewogICAgICAgIGludCBpOwogICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9URVhUVVJFUzsgaSsrKSB7CiAgICAgICAgICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMCArIGkpKSkgewogICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUoU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMCArIGkpLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgdmlld3BvcnQoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBVSU5UIHdpZHRoLCBoZWlnaHQ7CiAgICBJV2luZUQzRFN1cmZhY2VJbXBsICp0YXJnZXQ7CgogICAgZ2xEZXB0aFJhbmdlKHN0YXRlYmxvY2stPnZpZXdwb3J0Lk1pblosIHN0YXRlYmxvY2stPnZpZXdwb3J0Lk1heFopOwogICAgY2hlY2tHTGNhbGwoImdsRGVwdGhSYW5nZSIpOwogICAgLyogTm90ZTogR0wgcmVxdWlyZXMgbG93ZXIgbGVmdCwgRGlyZWN0WCBzdXBwbGllcyB1cHBlciBsZWZ0LiBUaGlzIGlzIHJldmVyc2VkIHdoZW4gdXNpbmcgb2Zmc2NyZWVuIHJlbmRlcmluZwogICAgICovCiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgZ2xWaWV3cG9ydChzdGF0ZWJsb2NrLT52aWV3cG9ydC5YLAogICAgICAgICAgICAgICAgICAgc3RhdGVibG9jay0+dmlld3BvcnQuWSwKICAgICAgICAgICAgICAgICAgIHN0YXRlYmxvY2stPnZpZXdwb3J0LldpZHRoLCBzdGF0ZWJsb2NrLT52aWV3cG9ydC5IZWlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgICB0YXJnZXQgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfdGFyZ2V0c1swXTsKICAgICAgICB0YXJnZXQtPmdldF9kcmF3YWJsZV9zaXplKHRhcmdldCwgJndpZHRoLCAmaGVpZ2h0KTsKCiAgICAgICAgZ2xWaWV3cG9ydChzdGF0ZWJsb2NrLT52aWV3cG9ydC5YLAogICAgICAgICAgICAgICAgICAgKGhlaWdodCAtIChzdGF0ZWJsb2NrLT52aWV3cG9ydC5ZICsgc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0KSksCiAgICAgICAgICAgICAgICAgICBzdGF0ZWJsb2NrLT52aWV3cG9ydC5XaWR0aCwgc3RhdGVibG9jay0+dmlld3BvcnQuSGVpZ2h0KTsKICAgIH0KCiAgICBjaGVja0dMY2FsbCgiZ2xWaWV3cG9ydCIpOwoKICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPnBvc0ZpeHVwWzJdID0gMS4wIC8gc3RhdGVibG9jay0+dmlld3BvcnQuV2lkdGg7CiAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5wb3NGaXh1cFszXSA9IC1zdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5wb3NGaXh1cFsxXSAvIHN0YXRlYmxvY2stPnZpZXdwb3J0LkhlaWdodDsKICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19QUk9KRUNUSU9OKSkpIHsKICAgICAgICB0cmFuc2Zvcm1fcHJvamVjdGlvbihTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIH0KICAgIGlmKCFpc1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19QT0lOVFNDQUxFRU5BQkxFKSkpIHsKICAgICAgICBzdGF0ZV9wc2NhbGUoU1RBVEVfUkVOREVSKFdJTkVEM0RSU19QT0lOVFNDQUxFRU5BQkxFKSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGxpZ2h0KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVUlOVCBJbmRleCA9IHN0YXRlIC0gU1RBVEVfQUNUSVZFTElHSFQoMCk7CiAgICBQTElHSFRJTkZPRUwgKmxpZ2h0SW5mbyA9IHN0YXRlYmxvY2stPmFjdGl2ZUxpZ2h0c1tJbmRleF07CgogICAgaWYoIWxpZ2h0SW5mbykgewogICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVDAgKyBJbmRleCk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShHTF9MSUdIVDAgKyBJbmRleCkiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZmxvYXQgcXVhZF9hdHQ7CiAgICAgICAgZmxvYXQgY29sUkdCQVtdID0gezAuMCwgMC4wLCAwLjAsIDAuMH07CgogICAgICAgIC8qIExpZ2h0IHNldHRpbmdzIGFyZSBhZmZlY3RlZCBieSB0aGUgbW9kZWwgdmlldyBpbiBPcGVuR0wsIHRoZSBWaWV3IHRyYW5zZm9ybSBpbiBkaXJlY3QzZCovCiAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgICAgZ2xQdXNoTWF0cml4KCk7CiAgICAgICAgZ2xMb2FkTWF0cml4Zigmc3RhdGVibG9jay0+dHJhbnNmb3Jtc1tXSU5FRDNEVFNfVklFV10udS5tWzBdWzBdKTsKCiAgICAgICAgLyogRGlmZnVzZTogKi8KICAgICAgICBjb2xSR0JBWzBdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkRpZmZ1c2UucjsKICAgICAgICBjb2xSR0JBWzFdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkRpZmZ1c2UuZzsKICAgICAgICBjb2xSR0JBWzJdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkRpZmZ1c2UuYjsKICAgICAgICBjb2xSR0JBWzNdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkRpZmZ1c2UuYTsKICAgICAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgSW5kZXgsIEdMX0RJRkZVU0UsIGNvbFJHQkEpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYiKTsKCiAgICAgICAgLyogU3BlY3VsYXIgKi8KICAgICAgICBjb2xSR0JBWzBdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlNwZWN1bGFyLnI7CiAgICAgICAgY29sUkdCQVsxXSA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5TcGVjdWxhci5nOwogICAgICAgIGNvbFJHQkFbMl0gPSBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuU3BlY3VsYXIuYjsKICAgICAgICBjb2xSR0JBWzNdID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlNwZWN1bGFyLmE7CiAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIEluZGV4LCBHTF9TUEVDVUxBUiwgY29sUkdCQSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiIpOwoKICAgICAgICAvKiBBbWJpZW50ICovCiAgICAgICAgY29sUkdCQVswXSA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BbWJpZW50LnI7CiAgICAgICAgY29sUkdCQVsxXSA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BbWJpZW50Lmc7CiAgICAgICAgY29sUkdCQVsyXSA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BbWJpZW50LmI7CiAgICAgICAgY29sUkdCQVszXSA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BbWJpZW50LmE7CiAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIEluZGV4LCBHTF9BTUJJRU5ULCBjb2xSR0JBKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGZ2Iik7CgogICAgICAgIGlmICgobGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlJhbmdlICpsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuUmFuZ2UpID49IEZMVF9NSU4pIHsKICAgICAgICAgICAgcXVhZF9hdHQgPSAxLjQvKGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5SYW5nZSAqbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLlJhbmdlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBxdWFkX2F0dCA9IDA7IC8qICAwIG9yICBNQVg/ICAoMCBzZWVtcyB0byBiZSBvaykgKi8KICAgICAgICB9CgogICAgICAgIC8qIERvIG5vdCBhc3NpZ24gYXR0ZW51YXRpb24gdmFsdWVzIGZvciBsaWdodHMgdGhhdCBkbyBub3QgdXNlIHRoZW0uIEQzRCBhcHBzIGFyZSBmcmVlIHRvIHBhc3MgYW55IGp1bmssCiAgICAgICAgICogYnV0IGdsIGRyaXZlcnMgdXNlIHRoZW0gYW5kIG1heSBjcmFzaCBkdWUgdG8gYmFkIEF0dGVudWF0aW9uIHZhbHVlcy4gTmVlZCBmb3IgU3BlZWQgbW9zdCB3YW50ZWQgc2V0cwogICAgICAgICAqIEF0dGVudWF0aW9uMCB0byBOYU4gYW5kIGNyYXNoZXMgaW4gdGhlIGdsIGxpYgogICAgICAgICAqLwoKICAgICAgICBzd2l0Y2ggKGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5UeXBlKSB7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRExJR0hUX1BPSU5UOgogICAgICAgICAgICAgICAgLyogUG9zaXRpb24gKi8KICAgICAgICAgICAgICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBJbmRleCwgR0xfUE9TSVRJT04sICZsaWdodEluZm8tPmxpZ2h0UG9zblswXSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGZ2Iik7CiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfU1BPVF9DVVRPRkYsIGxpZ2h0SW5mby0+Y3V0b2ZmKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgLyogQXR0ZW51YXRpb24gLSBBcmUgdGhlc2UgcmlnaHQ/IGd1ZXNzaW5nLi4uICovCiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sICBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuQXR0ZW51YXRpb24wKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX0xJTkVBUl9BVFRFTlVBVElPTiwgICAgbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkF0dGVudWF0aW9uMSk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGYiKTsKICAgICAgICAgICAgICAgIGlmIChxdWFkX2F0dCA8IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BdHRlbnVhdGlvbjIpIHF1YWRfYXR0ID0gbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkF0dGVudWF0aW9uMjsKICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04sIHF1YWRfYXR0KTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgLyogRklYTUU6IFJhbmdlICovCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgV0lORUQzRExJR0hUX1NQT1Q6CiAgICAgICAgICAgICAgICAvKiBQb3NpdGlvbiAqLwogICAgICAgICAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIEluZGV4LCBHTF9QT1NJVElPTiwgJmxpZ2h0SW5mby0+bGlnaHRQb3NuWzBdKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYiKTsKICAgICAgICAgICAgICAgIC8qIERpcmVjdGlvbiAqLwogICAgICAgICAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIEluZGV4LCBHTF9TUE9UX0RJUkVDVElPTiwgJmxpZ2h0SW5mby0+bGlnaHREaXJuWzBdKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZnYiKTsKICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9TUE9UX0VYUE9ORU5ULCBsaWdodEluZm8tPmV4cG9uZW50KTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1NQT1RfQ1VUT0ZGLCBsaWdodEluZm8tPmN1dG9mZik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGYiKTsKICAgICAgICAgICAgICAgIC8qIEF0dGVudWF0aW9uIC0gQXJlIHRoZXNlIHJpZ2h0PyBndWVzc2luZy4uLiAqLwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLCAgbGlnaHRJbmZvLT5PcmlnaW5hbFBhcm1zLkF0dGVudWF0aW9uMCk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGYiKTsKICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9MSU5FQVJfQVRURU5VQVRJT04sICAgIGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BdHRlbnVhdGlvbjEpOwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmIik7CiAgICAgICAgICAgICAgICBpZiAocXVhZF9hdHQgPCBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuQXR0ZW51YXRpb24yKSBxdWFkX2F0dCA9IGxpZ2h0SW5mby0+T3JpZ2luYWxQYXJtcy5BdHRlbnVhdGlvbjI7CiAgICAgICAgICAgICAgICBnbExpZ2h0ZihHTF9MSUdIVDAgKyBJbmRleCwgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OLCBxdWFkX2F0dCk7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGYiKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBSYW5nZSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RMSUdIVF9ESVJFQ1RJT05BTDoKICAgICAgICAgICAgICAgIC8qIERpcmVjdGlvbiAqLwogICAgICAgICAgICAgICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIEluZGV4LCBHTF9QT1NJVElPTiwgJmxpZ2h0SW5mby0+bGlnaHRQb3NuWzBdKTsgLyogTm90ZSBnbCB1c2VzIHcgcG9zaXRpb24gb2YgMCBmb3IgZGlyZWN0aW9uISAqLwogICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsTGlnaHRmdiIpOwogICAgICAgICAgICAgICAgZ2xMaWdodGYoR0xfTElHSFQwICsgSW5kZXgsIEdMX1NQT1RfQ1VUT0ZGLCBsaWdodEluZm8tPmN1dG9mZik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xMaWdodGYiKTsKICAgICAgICAgICAgICAgIGdsTGlnaHRmKEdMX0xJR0hUMCArIEluZGV4LCBHTF9TUE9UX0VYUE9ORU5ULCAwLjBmKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0ZiIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgRklYTUUoIlVucmVjb2duaXplZCBsaWdodCB0eXBlICVkXG4iLCBsaWdodEluZm8tPk9yaWdpbmFsUGFybXMuVHlwZSk7CiAgICAgICAgfQoKICAgICAgICAvKiBSZXN0b3JlIHRoZSBtb2RlbHZpZXcgbWF0cml4ICovCiAgICAgICAgZ2xQb3BNYXRyaXgoKTsKCiAgICAgICAgZ2xFbmFibGUoR0xfTElHSFQwICsgSW5kZXgpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9MSUdIVDAgKyBJbmRleCkiKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCnN0YXRpYyB2b2lkIHNjaXNzb3JyZWN0KERXT1JEIHN0YXRlLCBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpzdGF0ZWJsb2NrLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgUkVDVCAqcFJlY3QgPSAmc3RhdGVibG9jay0+c2Npc3NvclJlY3Q7CiAgICBVSU5UIGhlaWdodDsKICAgIFVJTlQgd2lkdGg7CiAgICBJV2luZUQzRFN1cmZhY2VJbXBsICp0YXJnZXQgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfdGFyZ2V0c1swXTsKCiAgICB0YXJnZXQtPmdldF9kcmF3YWJsZV9zaXplKHRhcmdldCwgJndpZHRoLCAmaGVpZ2h0KTsKICAgIC8qIFdhcm5pbmc6IGdsU2Npc3NvciB1c2VzIHdpbmRvdyBjb29yZGluYXRlcywgbm90IHZpZXdwb3J0IGNvb3JkaW5hdGVzLCBzbyBvdXIgdmlld3BvcnQgY29ycmVjdGlvbiBkb2VzIG5vdCBhcHBseQogICAgICogV2FybmluZzI6IEV2ZW4gaW4gd2luZG93ZWQgbW9kZSB0aGUgY29vcmRzIGFyZSByZWxhdGl2ZSB0byB0aGUgd2luZG93LCBub3QgdGhlIHNjcmVlbgogICAgICovCiAgICBUUkFDRSgiKCVwKSBTZXR0aW5nIG5ldyBTY2lzc29yIFJlY3QgdG8gJWQ6JWQtJWQ6JWRcbiIsIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+Ym90dG9tIC0gaGVpZ2h0LAogICAgICAgICAgcFJlY3QtPnJpZ2h0IC0gcFJlY3QtPmxlZnQsIHBSZWN0LT5ib3R0b20gLSBwUmVjdC0+dG9wKTsKCiAgICBpZiAoc3RhdGVibG9jay0+d2luZUQzRERldmljZS0+cmVuZGVyX29mZnNjcmVlbikgewogICAgICAgIGdsU2Npc3NvcihwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPnJpZ2h0IC0gcFJlY3QtPmxlZnQsIHBSZWN0LT5ib3R0b20gLSBwUmVjdC0+dG9wKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZ2xTY2lzc29yKHBSZWN0LT5sZWZ0LCBoZWlnaHQgLSBwUmVjdC0+Ym90dG9tLCBwUmVjdC0+cmlnaHQgLSBwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSAtIHBSZWN0LT50b3ApOwogICAgfQogICAgY2hlY2tHTGNhbGwoImdsU2Npc3NvciIpOwp9CgpzdGF0aWMgdm9pZCBpbmRleGJ1ZmZlcihEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIGlmKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9CVUZGRVJfT0JKRUNUKSkgewogICAgICAgIGlmKHN0YXRlYmxvY2stPnN0cmVhbUlzVVAgfHwgc3RhdGVibG9jay0+cEluZGV4RGF0YSA9PSBOVUxMICkgewogICAgICAgICAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsIDApKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbCAqaWIgPSAoSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKikgc3RhdGVibG9jay0+cEluZGV4RGF0YTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQVJCLCBpYi0+dmJvKSk7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBmcm9udGZhY2UoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBpZihzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5yZW5kZXJfb2Zmc2NyZWVuKSB7CiAgICAgICAgZ2xGcm9udEZhY2UoR0xfQ0NXKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xGcm9udEZhY2UoR0xfQ0NXKSIpOwogICAgfSBlbHNlIHsKICAgICAgICBnbEZyb250RmFjZShHTF9DVyk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRnJvbnRGYWNlKEdMX0NXKSIpOwogICAgfQp9Cgpjb25zdCBzdHJ1Y3QgU3RhdGVFbnRyeSBGRlBTdGF0ZVRhYmxlW10gPQp7CiAgICAgIC8qIFN0YXRlIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseSBmdW5jdGlvbiAqLwogICAgeyAvKiAwLCAgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxLCAgV0lORUQzRFJTX1RFWFRVUkVIQU5ETEUgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyLCAgV0lORUQzRFJTX0FOVElBTElBUyAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FOVElBTElBUyksICAgICAgICAgICAgICAgICAgc3RhdGVfYW50aWFsaWFzICAgICB9LAogICAgeyAvKiAzLCAgV0lORUQzRFJTX1RFWFRVUkVBRERSRVNTICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0LCAgV0lORUQzRFJTX1RFWFRVUkVQRVJTUEVDVElWRSAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1RFWFRVUkVQRVJTUEVDVElWRSksICAgICAgICAgc3RhdGVfcGVyc3BlY3RpdmUgICB9LAogICAgeyAvKiA1LCAgV0lORUQzRFJTX1dSQVBVICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVBVKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcHUgICAgICAgICB9LAogICAgeyAvKiA2LCAgV0lORUQzRFJTX1dSQVBWICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVBWKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcHYgICAgICAgICB9LAogICAgeyAvKiA3LCAgV0lORUQzRFJTX1pFTkFCTEUgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1pFTkFCTEUpLCAgICAgICAgICAgICAgICAgICAgc3RhdGVfemVuYWJsZSAgICAgICB9LAogICAgeyAvKiA4LCAgV0lORUQzRFJTX0ZJTExNT0RFICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZJTExNT0RFKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfZmlsbG1vZGUgICAgICB9LAogICAgeyAvKiA5LCAgV0lORUQzRFJTX1NIQURFTU9ERSAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NIQURFTU9ERSksICAgICAgICAgICAgICAgICAgc3RhdGVfc2hhZGVtb2RlICAgICB9LAogICAgeyAvKiAxMCwgV0lORUQzRFJTX0xJTkVQQVRURVJOICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0xJTkVQQVRURVJOKSwgICAgICAgICAgICAgICAgc3RhdGVfbGluZXBhdHRlcm4gICB9LAogICAgeyAvKiAxMSwgV0lORUQzRFJTX01PTk9FTkFCTEUgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX01PTk9FTkFCTEUpLCAgICAgICAgICAgICAgICAgc3RhdGVfbW9ub2VuYWJsZSAgICB9LAogICAgeyAvKiAxMiwgV0lORUQzRFJTX1JPUDIgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1JPUDIpLCAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfcm9wMiAgICAgICAgICB9LAogICAgeyAvKiAxMywgV0lORUQzRFJTX1BMQU5FTUFTSyAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BMQU5FTUFTSyksICAgICAgICAgICAgICAgICAgc3RhdGVfcGxhbmVtYXNrICAgICB9LAogICAgeyAvKiAxNCwgV0lORUQzRFJTX1pXUklURUVOQUJMRSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1pXUklURUVOQUJMRSksICAgICAgICAgICAgICAgc3RhdGVfendyaXRlbmFibGUgICB9LAogICAgeyAvKiAxNSwgV0lORUQzRFJTX0FMUEhBVEVTVEVOQUJMRSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBVEVTVEVOQUJMRSksICAgICAgICAgICAgc3RhdGVfYWxwaGEgICAgICAgICB9LAogICAgeyAvKiAxNiwgV0lORUQzRFJTX0xBU1RQSVhFTCAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0xBU1RQSVhFTCksICAgICAgICAgICAgICAgICAgc3RhdGVfbGFzdHBpeGVsICAgICB9LAogICAgeyAvKiAxNywgV0lORUQzRFJTX1RFWFRVUkVNQUcgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxOCwgV0lORUQzRFJTX1RFWFRVUkVNSU4gICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAxOSwgV0lORUQzRFJTX1NSQ0JMRU5EICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiAyMCwgV0lORUQzRFJTX0RFU1RCTEVORCAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiAyMSwgV0lORUQzRFJTX1RFWFRVUkVNQVBCTEVORCAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEhhbmRsZWQgaW4gZGRyYXcgKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiAyMiwgV0lORUQzRFJTX0NVTExNT0RFICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NVTExNT0RFKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfY3VsbG1vZGUgICAgICB9LAogICAgeyAvKiAyMywgV0lORUQzRFJTX1pGVU5DICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1pGVU5DKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfemZ1bmMgICAgICAgICB9LAogICAgeyAvKiAyNCwgV0lORUQzRFJTX0FMUEhBUkVGICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBVEVTVEVOQUJMRSksICAgICAgICAgICAgc3RhdGVfYWxwaGEgICAgICAgICB9LAogICAgeyAvKiAyNSwgV0lORUQzRFJTX0FMUEhBRlVOQyAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBVEVTVEVOQUJMRSksICAgICAgICAgICAgc3RhdGVfYWxwaGEgICAgICAgICB9LAogICAgeyAvKiAyNiwgV0lORUQzRFJTX0RJVEhFUkVOQUJMRSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0RJVEhFUkVOQUJMRSksICAgICAgICAgICAgICAgc3RhdGVfZGl0aGVyZW5hYmxlICB9LAogICAgeyAvKiAyNywgV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiAyOCwgV0lORUQzRFJTX0ZPR0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0VOQUJMRSksICAgICAgICAgICAgICAgICAgc3RhdGVfZm9nICAgICAgICAgICB9LAogICAgeyAvKiAyOSwgV0lORUQzRFJTX1NQRUNVTEFSRU5BQkxFICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NQRUNVTEFSRU5BQkxFKSwgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiAzMCwgV0lORUQzRFJTX1pWSVNJQkxFICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIE5vdCBzdXBwb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBtc2RuICovLCAgICAgICAgc3RhdGVfbm9nbCAgICAgICAgICB9LAogICAgeyAvKiAzMSwgV0lORUQzRFJTX1NVQlBJWEVMICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NVQlBJWEVMKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfc3VicGl4ZWwgICAgICB9LAogICAgeyAvKiAzMiwgV0lORUQzRFJTX1NVQlBJWEVMWCAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NVQlBJWEVMWCksICAgICAgICAgICAgICAgICAgc3RhdGVfc3VicGl4ZWx4ICAgICB9LAogICAgeyAvKiAzMywgV0lORUQzRFJTX1NUSVBQTEVEQUxQSEEgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NUSVBQTEVEQUxQSEEpLCAgICAgICAgICAgICAgc3RhdGVfc3RpcHBsZWRhbHBoYSB9LAogICAgeyAvKiAzNCwgV0lORUQzRFJTX0ZPR0NPTE9SICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0NPTE9SKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfZm9nY29sb3IgICAgICB9LAogICAgeyAvKiAzNSwgV0lORUQzRFJTX0ZPR1RBQkxFTU9ERSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0VOQUJMRSksICAgICAgICAgICAgICAgICAgc3RhdGVfZm9nICAgICAgICAgICB9LAogICAgeyAvKiAzNiwgV0lORUQzRFJTX0ZPR1NUQVJUICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0VOQUJMRSksICAgICAgICAgICAgICAgICAgc3RhdGVfZm9nICAgICAgICAgICB9LAogICAgeyAvKiAzNywgV0lORUQzRFJTX0ZPR0VORCAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0VOQUJMRSksICAgICAgICAgICAgICAgICAgc3RhdGVfZm9nICAgICAgICAgICB9LAogICAgeyAvKiAzOCwgV0lORUQzRFJTX0ZPR0RFTlNJVFkgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0RFTlNJVFkpLCAgICAgICAgICAgICAgICAgc3RhdGVfZm9nZGVuc2l0eSAgICB9LAogICAgeyAvKiAzOSwgV0lORUQzRFJTX1NUSVBQTEVFTkFCTEUgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NUSVBQTEVFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RpcHBsZWVuYWJsZSB9LAogICAgeyAvKiA0MCwgV0lORUQzRFJTX0VER0VBTlRJQUxJQVMgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiA0MSwgV0lORUQzRFJTX0NPTE9SS0VZRU5BQkxFICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBVEVTVEVOQUJMRSksICAgICAgICAgICAgc3RhdGVfYWxwaGEgICAgICAgICB9LAogICAgeyAvKiA0MiwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0MywgV0lORUQzRFJTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0JPUkRFUkNPTE9SKSwgICAgICAgICAgICAgICAgc3RhdGVfYm9yZGVyY29sb3IgICB9LAogICAgeyAvKiA0NCwgV0lORUQzRFJTX1RFWFRVUkVBRERSRVNTVSAgICAgICAgICAgICAgKi8gICAgICAwLCAvKiBIYW5kbGVkIGluIGRkcmF3ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0NSwgV0lORUQzRFJTX1RFWFRVUkVBRERSRVNTViAgICAgICAgICAgICAgKi8gICAgICAwLCAvKiBIYW5kbGVkIGluIGRkcmF3ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA0NiwgV0lORUQzRFJTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX01JUE1BUExPREJJQVMpLCAgICAgICAgICAgICAgc3RhdGVfbWlwbWFwbG9kYmlhcyB9LAogICAgeyAvKiA0NywgV0lORUQzRFJTX1pCSUFTICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1pCSUFTKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfemJpYXMgICAgICAgICB9LAogICAgeyAvKiA0OCwgV0lORUQzRFJTX1JBTkdFRk9HRU5BQkxFICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1JBTkdFRk9HRU5BQkxFKSwgICAgICAgICAgICAgc3RhdGVfcmFuZ2Vmb2cgICAgICB9LAogICAgeyAvKiA0OSwgV0lORUQzRFJTX0FOSVNPVFJPUFkgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FOSVNPVFJPUFkpLCAgICAgICAgICAgICAgICAgc3RhdGVfYW5pc290cm9weSAgICB9LAogICAgeyAvKiA1MCwgV0lORUQzRFJTX0ZMVVNIQkFUQ0ggICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZMVVNIQkFUQ0gpLCAgICAgICAgICAgICAgICAgc3RhdGVfZmx1c2hiYXRjaCAgICB9LAogICAgeyAvKiA1MSwgV0lORUQzRFJTX1RSQU5TTFVDRU5UU09SVElOREVQRU5ERU5UICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1RSQU5TTFVDRU5UU09SVElOREVQRU5ERU5UKSwgc3RhdGVfdHJhbnNsdWNlbnRzaSB9LAogICAgeyAvKiA1MiwgV0lORUQzRFJTX1NURU5DSUxFTkFCTEUgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1MywgV0lORUQzRFJTX1NURU5DSUxGQUlMICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1NCwgV0lORUQzRFJTX1NURU5DSUxaRkFJTCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1NSwgV0lORUQzRFJTX1NURU5DSUxQQVNTICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1NiwgV0lORUQzRFJTX1NURU5DSUxGVU5DICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1NywgV0lORUQzRFJTX1NURU5DSUxSRUYgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1OCwgV0lORUQzRFJTX1NURU5DSUxNQVNLICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxFTkFCTEUpLCAgICAgICAgICAgICAgc3RhdGVfc3RlbmNpbCAgICAgICB9LAogICAgeyAvKiA1OSwgV0lORUQzRFJTX1NURU5DSUxXUklURU1BU0sgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NURU5DSUxXUklURU1BU0spLCAgICAgICAgICAgc3RhdGVfc3RlbmNpbHdyaXRlICB9LAogICAgeyAvKiA2MCwgV0lORUQzRFJTX1RFWFRVUkVGQUNUT1IgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1RFWFRVUkVGQUNUT1IpLCAgICAgICAgICAgICAgc3RhdGVfdGV4ZmFjdG9yICAgICB9LAogICAgeyAvKiA2MSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2MiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2MywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDAgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDEgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgaGUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NiwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDIgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2NywgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDMgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2OCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDQgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA2OSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDUgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDYgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDcgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MiwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDggICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3MywgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMDkgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTAgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTEgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NiwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTIgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3NywgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTMgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3OCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTQgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA3OSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTUgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTYgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTcgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MiwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTggICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4MywgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMTkgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjAgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjEgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NiwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjIgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4NywgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjMgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4OCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjQgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA4OSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjUgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjYgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjcgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MiwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjggICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5MywgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMjkgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NCwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMzAgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NSwgV0lORUQzRFJTX1NUSVBQTEVQQVRURVJOMzEgICAgICAgICAgICAgKi8gICAgICAwIC8qIE9ic29sZXRlLCBzaG91bGQgYmUgaGFuZGxlZCBieSBkZHJhdyAqLywgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5NywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5OCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKiA5OSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwMywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwNywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwOCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEwOSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExMywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExNywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExOCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjExOSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyMywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNiwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEyNywgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgLyogQmlnIGhvbGUgZW5kcyAqLwogICAgeyAvKjEyOCwgV0lORUQzRFJTX1dSQVAwICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEyOSwgV0lORUQzRFJTX1dSQVAxICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzMCwgV0lORUQzRFJTX1dSQVAyICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzMSwgV0lORUQzRFJTX1dSQVAzICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzMiwgV0lORUQzRFJTX1dSQVA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzMywgV0lORUQzRFJTX1dSQVA1ICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzNCwgV0lORUQzRFJTX1dSQVA2ICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzNSwgV0lORUQzRFJTX1dSQVA3ICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1dSQVAwKSwgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfd3JhcCAgICAgICAgICB9LAogICAgeyAvKjEzNiwgV0lORUQzRFJTX0NMSVBQSU5HICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NMSVBQSU5HKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfY2xpcHBpbmcgICAgICB9LAogICAgeyAvKjEzNywgV0lORUQzRFJTX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0xJR0hUSU5HKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfbGlnaHRpbmcgICAgICB9LAogICAgeyAvKjEzOCwgV0lORUQzRFJTX0VYVEVOVFMgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VYVEVOVFMpLCAgICAgICAgICAgICAgICAgICAgc3RhdGVfZXh0ZW50cyAgICAgICB9LAogICAgeyAvKjEzOSwgV0lORUQzRFJTX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FNQklFTlQpLCAgICAgICAgICAgICAgICAgICAgc3RhdGVfYW1iaWVudCAgICAgICB9LAogICAgeyAvKjE0MCwgV0lORUQzRFJTX0ZPR1ZFUlRFWE1PREUgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0ZPR0VOQUJMRSksICAgICAgICAgICAgICAgICAgc3RhdGVfZm9nICAgICAgICAgICB9LAogICAgeyAvKjE0MSwgV0lORUQzRFJTX0NPTE9SVkVSVEVYICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSwgICAgICAgICAgICAgICAgc3RhdGVfY29sb3JtYXQgICAgICB9LAogICAgeyAvKjE0MiwgV0lORUQzRFJTX0xPQ0FMVklFV0VSICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0xPQ0FMVklFV0VSKSwgICAgICAgICAgICAgICAgc3RhdGVfbG9jYWx2aWV3ZXIgICB9LAogICAgeyAvKjE0MywgV0lORUQzRFJTX05PUk1BTElaRU5PUk1BTFMgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX05PUk1BTElaRU5PUk1BTFMpLCAgICAgICAgICAgc3RhdGVfbm9ybWFsaXplICAgICB9LAogICAgeyAvKjE0NCwgV0lORUQzRFJTX0NPTE9SS0VZQkxFTkRFTkFCTEUgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SS0VZQkxFTkRFTkFCTEUpLCAgICAgICAgc3RhdGVfY2tleWJsZW5kICAgICB9LAogICAgeyAvKjE0NSwgV0lORUQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSwgICAgICAgICAgICAgICAgc3RhdGVfY29sb3JtYXQgICAgICB9LAogICAgeyAvKjE0NiwgV0lORUQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0UgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSwgICAgICAgICAgICAgICAgc3RhdGVfY29sb3JtYXQgICAgICB9LAogICAgeyAvKjE0NywgV0lORUQzRFJTX0FNQklFTlRNQVRFUklBTFNPVVJDRSAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSwgICAgICAgICAgICAgICAgc3RhdGVfY29sb3JtYXQgICAgICB9LAogICAgeyAvKjE0OCwgV0lORUQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SVkVSVEVYKSwgICAgICAgICAgICAgICAgc3RhdGVfY29sb3JtYXQgICAgICB9LAogICAgeyAvKjE0OSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1MCwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE1MSwgV0lORUQzRFJTX1ZFUlRFWEJMRU5EICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1ZFUlRFWEJMRU5EKSwgICAgICAgICAgICAgICAgc3RhdGVfdmVydGV4YmxlbmQgICB9LAogICAgeyAvKjE1MiwgV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NMSVBQSU5HKSwgICAgICAgICAgICAgICAgICAgc3RhdGVfY2xpcHBpbmcgICAgICB9LAogICAgeyAvKjE1MywgV0lORUQzRFJTX1NPRlRXQVJFVkVSVEVYUFJPQ0VTU0lORyAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfbm9nbCAgICAgICAgICB9LAogICAgeyAvKjE1NCwgV0lORUQzRFJTX1BPSU5UU0laRSAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfcHNjYWxlICAgICAgICB9LAogICAgeyAvKjE1NSwgV0lORUQzRFJTX1BPSU5UU0laRV9NSU4gICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0laRV9NSU4pLCAgICAgICAgICAgICAgc3RhdGVfcHNpemVtaW4gICAgICB9LAogICAgeyAvKjE1NiwgV0lORUQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFKSwgICAgICAgICAgc3RhdGVfcG9pbnRzcHJpdGUgICB9LAogICAgeyAvKjE1NywgV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfcHNjYWxlICAgICAgICB9LAogICAgeyAvKjE1OCwgV0lORUQzRFJTX1BPSU5UU0NBTEVfQSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfcHNjYWxlICAgICAgICB9LAogICAgeyAvKjE1OSwgV0lORUQzRFJTX1BPSU5UU0NBTEVfQiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfcHNjYWxlICAgICAgICB9LAogICAgeyAvKjE2MCwgV0lORUQzRFJTX1BPSU5UU0NBTEVfQyAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0NBTEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfcHNjYWxlICAgICAgICB9LAogICAgeyAvKjE2MSwgV0lORUQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTKSwgICAgICAgc3RhdGVfbXVsdGlzYW1wbGVhYSB9LAogICAgeyAvKjE2MiwgV0lORUQzRFJTX01VTFRJU0FNUExFTUFTSyAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX01VTFRJU0FNUExFTUFTSyksICAgICAgICAgICAgc3RhdGVfbXVsdGlzYW1wbWFzayB9LAogICAgeyAvKjE2MywgV0lORUQzRFJTX1BBVENIRURHRVNUWUxFICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BBVENIRURHRVNUWUxFKSwgICAgICAgICAgICAgc3RhdGVfcGF0Y2hlZGdlc3R5bGV9LAogICAgeyAvKjE2NCwgV0lORUQzRFJTX1BBVENIU0VHTUVOVFMgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BBVENIU0VHTUVOVFMpLCAgICAgICAgICAgICAgc3RhdGVfcGF0Y2hzZWdtZW50cyB9LAogICAgeyAvKjE2NSwgV0lORUQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOKSwgICAgICAgICAgc3RhdGVfbm9nbCAgICAgICAgICB9LAogICAgeyAvKjE2NiwgV0lORUQzRFJTX1BPSU5UU0laRV9NQVggICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPSU5UU0laRV9NQVgpLCAgICAgICAgICAgICAgc3RhdGVfcHNpemVtYXggICAgICB9LAogICAgeyAvKjE2NywgV0lORUQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRSAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfbm9nbCAgICAgICAgICB9LAogICAgeyAvKjE2OCwgV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfY29sb3J3cml0ZSAgICB9LAogICAgeyAvKjE2OSwgVW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjE3MCwgV0lORUQzRFJTX1RXRUVORkFDVE9SICAgICAgICAgICAgICAgICAgKi8gICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfbm9nbCAgICAgICAgICB9LAogICAgeyAvKjE3MSwgV0lORUQzRFJTX0JMRU5ET1AgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0JMRU5ET1ApLCAgICAgICAgICAgICAgICAgICAgc3RhdGVfYmxlbmRvcCAgICAgICB9LAogICAgeyAvKjE3MiwgV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFKSwgICAgICAgICAgICAgc3RhdGVfcG9zaXRpb25kZWdyZWV9LAogICAgeyAvKjE3MywgV0lORUQzRFJTX05PUk1BTERFR1JFRSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9SRU5ERVIoV0lORUQzRFJTX05PUk1BTERFR1JFRSksICAgICAgICAgICAgICAgc3RhdGVfbm9ybWFsZGVncmVlICB9LAogICAgICAvKjE3MiwgV0lORUQzRFJTX1BPU0lUSU9OT1JERVIgICAgICAgICAgICAgICAgKi8gICAgICAvKiBWYWx1ZSBhc3NpZ25lZCB0byAyIHN0YXRlIG5hbWVzICovCiAgICAgIC8qMTczLCBXSU5FRDNEUlNfTk9STUFMT1JERVIgICAgICAgICAgICAgICAgICAqLyAgICAgIC8qIFZhbHVlIGFzc2lnbmVkIHRvIDIgc3RhdGUgbmFtZXMgKi8KICAgIHsgLyoxNzQsIFdJTkVEM0RSU19TQ0lTU09SVEVTVEVOQUJMRSAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TQ0lTU09SVEVTVEVOQUJMRSksICAgICAgICAgIHN0YXRlX3NjaXNzb3IgICAgICAgfSwKICAgIHsgLyoxNzUsIFdJTkVEM0RSU19TTE9QRVNDQUxFREVQVEhCSUFTICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19ERVBUSEJJQVMpLCAgICAgICAgICAgICAgICAgIHN0YXRlX2RlcHRoYmlhcyAgICAgfSwKICAgIHsgLyoxNzYsIFdJTkVEM0RSU19BTlRJQUxJQVNFRExJTkVFTkFCTEUgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyoxNzcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzgsIFdJTkVEM0RSU19NSU5URVNTRUxMQVRJT05MRVZFTCAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxNzksIFdJTkVEM0RSU19NQVhURVNTRUxMQVRJT05MRVZFTCAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxODAsIFdJTkVEM0RSU19BREFQVElWRVRFU1NfWCAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxODEsIFdJTkVEM0RSU19BREFQVElWRVRFU1NfWSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxODIsIFdJTkVEM0RSU19BREFQVElWRVRFU1NfWiAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxODMsIFdJTkVEM0RSU19BREFQVElWRVRFU1NfVyAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxODQsIFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19FTkFCTEVBREFQVElWRVRFU1NFTExBVElPTiksIHN0YXRlX3Rlc3NlbGxhdGlvbiAgfSwKICAgIHsgLyoxODUsIFdJTkVEM0RSU19UV09TSURFRFNURU5DSUxNT0RFICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TVEVOQ0lMRU5BQkxFKSwgICAgICAgICAgICAgIHN0YXRlX3N0ZW5jaWwgICAgICAgfSwKICAgIHsgLyoxODYsIFdJTkVEM0RSU19DQ1dfU1RFTkNJTEZBSUwgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TVEVOQ0lMRU5BQkxFKSwgICAgICAgICAgICAgIHN0YXRlX3N0ZW5jaWwgICAgICAgfSwKICAgIHsgLyoxODcsIFdJTkVEM0RSU19DQ1dfU1RFTkNJTFpGQUlMICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TVEVOQ0lMRU5BQkxFKSwgICAgICAgICAgICAgIHN0YXRlX3N0ZW5jaWwgICAgICAgfSwKICAgIHsgLyoxODgsIFdJTkVEM0RSU19DQ1dfU1RFTkNJTFBBU1MgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TVEVOQ0lMRU5BQkxFKSwgICAgICAgICAgICAgIHN0YXRlX3N0ZW5jaWwgICAgICAgfSwKICAgIHsgLyoxODksIFdJTkVEM0RSU19DQ1dfU1RFTkNJTEZVTkMgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TVEVOQ0lMRU5BQkxFKSwgICAgICAgICAgICAgIHN0YXRlX3N0ZW5jaWwgICAgICAgfSwKICAgIHsgLyoxOTAsIFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMSAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFKSwgICAgICAgICAgIHN0YXRlX2NvbG9yd3JpdGUgICAgfSwKICAgIHsgLyoxOTEsIFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMiAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFKSwgICAgICAgICAgIHN0YXRlX2NvbG9yd3JpdGUgICAgfSwKICAgIHsgLyoxOTIsIFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMyAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFKSwgICAgICAgICAgIHN0YXRlX2NvbG9yd3JpdGUgICAgfSwKICAgIHsgLyoxOTMsIFdJTkVEM0RSU19CTEVOREZBQ1RPUiAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19CTEVOREZBQ1RPUiksICAgICAgICAgICAgICAgIHN0YXRlX2JsZW5kZmFjdG9yICAgfSwKICAgIHsgLyoxOTQsIFdJTkVEM0RSU19TUkdCV1JJVEVFTkFCTEUgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUElYRUxTSEFERVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc2hhZGVyICAgICAgICAgfSwKICAgIHsgLyoxOTUsIFdJTkVEM0RSU19ERVBUSEJJQVMgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19ERVBUSEJJQVMpLCAgICAgICAgICAgICAgICAgIHN0YXRlX2RlcHRoYmlhcyAgICAgfSwKICAgIHsgLyoxOTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTgsIFdJTkVEM0RSU19XUkFQOCAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoxOTksIFdJTkVEM0RSU19XUkFQOSAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDAsIFdJTkVEM0RSU19XUkFQMTAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDEsIFdJTkVEM0RSU19XUkFQMTEgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDIsIFdJTkVEM0RSU19XUkFQMTIgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDMsIFdJTkVEM0RSU19XUkFQMTMgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDQsIFdJTkVEM0RSU19XUkFQMTQgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDUsIFdJTkVEM0RSU19XUkFQMTUgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19XUkFQMCksICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3dyYXAgICAgICAgICAgfSwKICAgIHsgLyoyMDYsIFdJTkVEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEUgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyoyMDcsIFdJTkVEM0RSU19TUkNCTEVOREFMUEhBICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyoyMDgsIFdJTkVEM0RSU19ERVNUQkxFTkRBTFBIQSAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyoyMDksIFdJTkVEM0RSU19CTEVORE9QQUxQSEEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIC8qIFRleHR1cmUgc3RhZ2Ugc3RhdGVzICovCiAgICB7IC8qMCwgMDEsIFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMDIsIFdJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMDMsIFdJTkVEM0RUU1NfQ09MT1JBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMDQsIFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMDUsIFdJTkVEM0RUU1NfQUxQSEFBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMDYsIFdJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMDcsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMCwgMDgsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAxICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMCwgMDksIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMCwgMTAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMCwgMTEsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVgpLCAgICB0ZXhfY29vcmRpbmRleCAgICAgIH0sCiAgICB7IC8qMCwgMTIsIFdJTkVEM0RUU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTMsIFdJTkVEM0RUU1NfQUREUkVTU1UgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTQsIFdJTkVEM0RUU1NfQUREUkVTU1YgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTUsIFdJTkVEM0RUU1NfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTYsIFdJTkVEM0RUU1NfTUFHRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTcsIFdJTkVEM0RUU1NfTUlORklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTgsIFdJTkVEM0RUU1NfTUlQRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMTksIFdJTkVEM0RUU1NfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMjAsIFdJTkVEM0RUU1NfTUFYTUlQTEVWRUwgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMjEsIFdJTkVEM0RUU1NfTUFYQU5JU09UUk9QWSAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMjIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUpLCAgICB0ZXhfYnVtcGVudmxzY2FsZSAgIH0sCiAgICB7IC8qMCwgMjMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKSwgICB0ZXhfYnVtcGVudmxvZmZzZXQgIH0sCiAgICB7IC8qMCwgMjQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTApLCAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZSAgIH0sCiAgICB7IC8qMCwgMjUsIFdJTkVEM0RUU1NfQUREUkVTU1cgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMjYsIFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMjcsIFdJTkVEM0RUU1NfQUxQSEFBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMjgsIFdJTkVEM0RUU1NfUkVTVUxUQVJHICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgwLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMCwgMzIsIFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogQXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEQzRFRBX0NPTlNUQU5UICovLCBzdGF0ZV9ub2dsICAgICAgICAgIH0sCgogICAgeyAvKjEsIDAxLCBXSU5FRDNEVFNTX0NPTE9ST1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjEsIDAyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjEsIDAzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjEsIDA0LCBXSU5FRDNEVFNTX0FMUEhBT1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjEsIDA1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjEsIDA2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjEsIDA3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjEsIDA4LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjEsIDA5LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjEsIDEwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjEsIDExLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19URVhDT09SRElOREVYKSwgICAgdGV4X2Nvb3JkaW5kZXggICAgICB9LAogICAgeyAvKjEsIDEyLCBXSU5FRDNEVFNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDEzLCBXSU5FRDNEVFNTX0FERFJFU1NVICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDE0LCBXSU5FRDNEVFNTX0FERFJFU1NWICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDE1LCBXSU5FRDNEVFNTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDE2LCBXSU5FRDNEVFNTX01BR0ZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDE3LCBXSU5FRDNEVFNTX01JTkZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDE4LCBXSU5FRDNEVFNTX01JUEZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDE5LCBXSU5FRDNEVFNTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDIwLCBXSU5FRDNEVFNTX01BWE1JUExFVkVMICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDIxLCBXSU5FRDNEVFNTX01BWEFOSVNPVFJPUFkgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDIyLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFKSwgICAgdGV4X2J1bXBlbnZsc2NhbGUgICB9LAogICAgeyAvKjEsIDIzLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCksICAgdGV4X2J1bXBlbnZsb2Zmc2V0ICB9LAogICAgeyAvKjEsIDI0LCBXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkUxKSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKjEsIDI1LCBXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDI2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjEsIDI3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjAsIDI4LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoMSwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjEsIDI5LCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDMwLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDMxLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjEsIDMyLCBXSU5FRDNEVFNTX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBEM0RUQV9DT05TVEFOVCAqLywgc3RhdGVfbm9nbCAgICAgICAgICB9LAoKICAgIHsgLyoyLCAwMSwgV0lORUQzRFRTU19DT0xPUk9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyoyLCAwMiwgV0lORUQzRFRTU19DT0xPUkFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyoyLCAwMywgV0lORUQzRFRTU19DT0xPUkFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyoyLCAwNCwgV0lORUQzRFRTU19BTFBIQU9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyoyLCAwNSwgV0lORUQzRFRTU19BTFBIQUFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyoyLCAwNiwgV0lORUQzRFRTU19BTFBIQUFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyoyLCAwNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyoyLCAwOCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyoyLCAwOSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyoyLCAxMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyoyLCAxMSwgV0lORUQzRFRTU19URVhDT09SRElOREVYICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCksICAgIHRleF9jb29yZGluZGV4ICAgICAgfSwKICAgIHsgLyoyLCAxMiwgV0lORUQzRFRTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxMywgV0lORUQzRFRTU19BRERSRVNTVSAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxNCwgV0lORUQzRFRTU19BRERSRVNTViAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxNSwgV0lORUQzRFRTU19CT1JERVJDT0xPUiAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxNiwgV0lORUQzRFRTU19NQUdGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxNywgV0lORUQzRFRTU19NSU5GSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxOCwgV0lORUQzRFRTU19NSVBGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAxOSwgV0lORUQzRFRTU19NSVBNQVBMT0RCSUFTICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAyMCwgV0lORUQzRFRTU19NQVhNSVBMRVZFTCAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAyMSwgV0lORUQzRFRTU19NQVhBTklTT1RST1BZICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAyMiwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSksICAgIHRleF9idW1wZW52bHNjYWxlICAgfSwKICAgIHsgLyoyLCAyMywgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQpLCAgIHRleF9idW1wZW52bG9mZnNldCAgfSwKICAgIHsgLyoyLCAyNCwgV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMiksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyoyLCAyNSwgV0lORUQzRFRTU19BRERSRVNTVyAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAyNiwgV0lORUQzRFRTU19DT0xPUkFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyoyLCAyNywgV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyowLCAyOCwgV0lORUQzRFRTU19SRVNVTFRBUkcgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDIsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyoyLCAyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyLCAzMiwgV0lORUQzRFRTU19DT05TVEFOVCAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiBBcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgRDNEVEFfQ09OU1RBTlQgKi8sIHN0YXRlX25vZ2wgICAgICAgICAgfSwKCiAgICB7IC8qMywgMDEsIFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMDIsIFdJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMDMsIFdJTkVEM0RUU1NfQ09MT1JBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMDQsIFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMDUsIFdJTkVEM0RUU1NfQUxQSEFBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMDYsIFdJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMDcsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMywgMDgsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAxICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMywgMDksIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMywgMTAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qMywgMTEsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVgpLCAgICB0ZXhfY29vcmRpbmRleCAgICAgIH0sCiAgICB7IC8qMywgMTIsIFdJTkVEM0RUU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTMsIFdJTkVEM0RUU1NfQUREUkVTU1UgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTQsIFdJTkVEM0RUU1NfQUREUkVTU1YgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTUsIFdJTkVEM0RUU1NfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTYsIFdJTkVEM0RUU1NfTUFHRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTcsIFdJTkVEM0RUU1NfTUlORklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTgsIFdJTkVEM0RUU1NfTUlQRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMTksIFdJTkVEM0RUU1NfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMjAsIFdJTkVEM0RUU1NfTUFYTUlQTEVWRUwgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMjEsIFdJTkVEM0RUU1NfTUFYQU5JU09UUk9QWSAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMjIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUpLCAgICB0ZXhfYnVtcGVudmxzY2FsZSAgIH0sCiAgICB7IC8qMywgMjMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKSwgICB0ZXhfYnVtcGVudmxvZmZzZXQgIH0sCiAgICB7IC8qMywgMjQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTMpLCAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZSAgIH0sCiAgICB7IC8qMywgMjUsIFdJTkVEM0RUU1NfQUREUkVTU1cgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMjYsIFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMjcsIFdJTkVEM0RUU1NfQUxQSEFBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMjgsIFdJTkVEM0RUU1NfUkVTVUxUQVJHICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSgzLCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qMywgMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qMywgMzIsIFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogQXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEQzRFRBX0NPTlNUQU5UICovLCBzdGF0ZV9ub2dsICAgICAgICAgIH0sCgogICAgeyAvKjQsIDAxLCBXSU5FRDNEVFNTX0NPTE9ST1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjQsIDAyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjQsIDAzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjQsIDA0LCBXSU5FRDNEVFNTX0FMUEhBT1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjQsIDA1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjQsIDA2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjQsIDA3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjQsIDA4LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjQsIDA5LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjQsIDEwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjQsIDExLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19URVhDT09SRElOREVYKSwgICAgdGV4X2Nvb3JkaW5kZXggICAgICB9LAogICAgeyAvKjQsIDEyLCBXSU5FRDNEVFNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDEzLCBXSU5FRDNEVFNTX0FERFJFU1NVICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDE0LCBXSU5FRDNEVFNTX0FERFJFU1NWICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDE1LCBXSU5FRDNEVFNTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDE2LCBXSU5FRDNEVFNTX01BR0ZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDE3LCBXSU5FRDNEVFNTX01JTkZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDE4LCBXSU5FRDNEVFNTX01JUEZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDE5LCBXSU5FRDNEVFNTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDIwLCBXSU5FRDNEVFNTX01BWE1JUExFVkVMICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDIxLCBXSU5FRDNEVFNTX01BWEFOSVNPVFJPUFkgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDIyLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFKSwgICAgdGV4X2J1bXBlbnZsc2NhbGUgICB9LAogICAgeyAvKjQsIDIzLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCksICAgdGV4X2J1bXBlbnZsb2Zmc2V0ICB9LAogICAgeyAvKjQsIDI0LCBXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU0KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKjQsIDI1LCBXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDI2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjQsIDI3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjAsIDI4LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNCwgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjQsIDI5LCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDMwLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDMxLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjQsIDMyLCBXSU5FRDNEVFNTX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBEM0RUQV9DT05TVEFOVCAqLywgc3RhdGVfbm9nbCAgICAgICAgICB9LAoKICAgIHsgLyo1LCAwMSwgV0lORUQzRFRTU19DT0xPUk9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo1LCAwMiwgV0lORUQzRFRTU19DT0xPUkFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo1LCAwMywgV0lORUQzRFRTU19DT0xPUkFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo1LCAwNCwgV0lORUQzRFRTU19BTFBIQU9QICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo1LCAwNSwgV0lORUQzRFRTU19BTFBIQUFSRzEgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo1LCAwNiwgV0lORUQzRFRTU19BTFBIQUFSRzIgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyo1LCAwNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo1LCAwOCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMDEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo1LCAwOSwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo1LCAxMCwgV0lORUQzRFRTU19CVU1QRU5WTUFUMTEgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwKSwgICAgIHRleF9idW1wZW52bWF0ICAgICAgfSwKICAgIHsgLyo1LCAxMSwgV0lORUQzRFRTU19URVhDT09SRElOREVYICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCksICAgIHRleF9jb29yZGluZGV4ICAgICAgfSwKICAgIHsgLyo1LCAxMiwgV0lORUQzRFRTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxMywgV0lORUQzRFRTU19BRERSRVNTVSAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxNCwgV0lORUQzRFRTU19BRERSRVNTViAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxNSwgV0lORUQzRFRTU19CT1JERVJDT0xPUiAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxNiwgV0lORUQzRFRTU19NQUdGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxNywgV0lORUQzRFRTU19NSU5GSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxOCwgV0lORUQzRFRTU19NSVBGSUxURVIgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAxOSwgV0lORUQzRFRTU19NSVBNQVBMT0RCSUFTICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAyMCwgV0lORUQzRFRTU19NQVhNSVBMRVZFTCAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAyMSwgV0lORUQzRFRTU19NQVhBTklTT1RST1BZICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAyMiwgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSksICAgIHRleF9idW1wZW52bHNjYWxlICAgfSwKICAgIHsgLyo1LCAyMywgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQpLCAgIHRleF9idW1wZW52bG9mZnNldCAgfSwKICAgIHsgLyo1LCAyNCwgV0lORUQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFNSksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyo1LCAyNSwgV0lORUQzRFRTU19BRERSRVNTVyAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAyNiwgV0lORUQzRFRTU19DT0xPUkFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo1LCAyNywgV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQUxQSEFPUCksICAgICAgICAgIHRleF9hbHBoYW9wICAgICAgICAgfSwKICAgIHsgLyowLCAyOCwgV0lORUQzRFRTU19SRVNVTFRBUkcgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVEVYVFVSRVNUQUdFKDUsIFdJTkVEM0RUU1NfQ09MT1JPUCksICAgICAgICAgIHRleF9jb2xvcm9wICAgICAgICAgfSwKICAgIHsgLyo1LCAyOSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAzMCwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAzMSwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiAtPiBzYW1wbGVyIHN0YXRlIGluIGRkcmF3IC8gZDNkOCAqLywgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyo1LCAzMiwgV0lORUQzRFRTU19DT05TVEFOVCAgICAgICAgICAgICAgICAgICovICAgICAgMCAvKiBBcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgRDNEVEFfQ09OU1RBTlQgKi8sIHN0YXRlX25vZ2wgICAgICAgICAgfSwKCiAgICB7IC8qNiwgMDEsIFdJTkVEM0RUU1NfQ09MT1JPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMDIsIFdJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMDMsIFdJTkVEM0RUU1NfQ09MT1JBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMDQsIFdJTkVEM0RUU1NfQUxQSEFPUCAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMDUsIFdJTkVEM0RUU1NfQUxQSEFBUkcxICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMDYsIFdJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMDcsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNiwgMDgsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDAxICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNiwgMDksIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNiwgMTAsIFdJTkVEM0RUU1NfQlVNUEVOVk1BVDExICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCksICAgICB0ZXhfYnVtcGVudm1hdCAgICAgIH0sCiAgICB7IC8qNiwgMTEsIFdJTkVEM0RUU1NfVEVYQ09PUkRJTkRFWCAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVgpLCAgICB0ZXhfY29vcmRpbmRleCAgICAgIH0sCiAgICB7IC8qNiwgMTIsIFdJTkVEM0RUU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTMsIFdJTkVEM0RUU1NfQUREUkVTU1UgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTQsIFdJTkVEM0RUU1NfQUREUkVTU1YgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTUsIFdJTkVEM0RUU1NfQk9SREVSQ09MT1IgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTYsIFdJTkVEM0RUU1NfTUFHRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTcsIFdJTkVEM0RUU1NfTUlORklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTgsIFdJTkVEM0RUU1NfTUlQRklMVEVSICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMTksIFdJTkVEM0RUU1NfTUlQTUFQTE9EQklBUyAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMjAsIFdJTkVEM0RUU1NfTUFYTUlQTEVWRUwgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMjEsIFdJTkVEM0RUU1NfTUFYQU5JU09UUk9QWSAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMjIsIFdJTkVEM0RUU1NfQlVNUEVOVkxTQ0FMRSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUpLCAgICB0ZXhfYnVtcGVudmxzY2FsZSAgIH0sCiAgICB7IC8qNiwgMjMsIFdJTkVEM0RUU1NfQlVNUEVOVkxPRkZTRVQgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUKSwgICB0ZXhfYnVtcGVudmxvZmZzZXQgIH0sCiAgICB7IC8qNiwgMjQsIFdJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTYpLCAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fdGV4dHVyZSAgIH0sCiAgICB7IC8qNiwgMjUsIFdJTkVEM0RUU1NfQUREUkVTU1cgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMjYsIFdJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMjcsIFdJTkVEM0RUU1NfQUxQSEFBUkcwICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0FMUEhBT1ApLCAgICAgICAgICB0ZXhfYWxwaGFvcCAgICAgICAgIH0sCiAgICB7IC8qMCwgMjgsIFdJTkVEM0RUU1NfUkVTVUxUQVJHICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RFWFRVUkVTVEFHRSg2LCBXSU5FRDNEVFNTX0NPTE9ST1ApLCAgICAgICAgICB0ZXhfY29sb3JvcCAgICAgICAgIH0sCiAgICB7IC8qNiwgMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogLT4gc2FtcGxlciBzdGF0ZSBpbiBkZHJhdyAvIGQzZDggKi8sICAgICAgICAgICBzdGF0ZV91bmRlZmluZWQgICAgIH0sCiAgICB7IC8qNiwgMzIsIFdJTkVEM0RUU1NfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAqLyAgICAgIDAgLyogQXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEQzRFRBX0NPTlNUQU5UICovLCBzdGF0ZV9ub2dsICAgICAgICAgIH0sCgogICAgeyAvKjcsIDAxLCBXSU5FRDNEVFNTX0NPTE9ST1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjcsIDAyLCBXSU5FRDNEVFNTX0NPTE9SQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjcsIDAzLCBXSU5FRDNEVFNTX0NPTE9SQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjcsIDA0LCBXSU5FRDNEVFNTX0FMUEhBT1AgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjcsIDA1LCBXSU5FRDNEVFNTX0FMUEhBQVJHMSAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjcsIDA2LCBXSU5FRDNEVFNTX0FMUEhBQVJHMiAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjcsIDA3LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjcsIDA4LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjcsIDA5LCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMCAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjcsIDEwLCBXSU5FRDNEVFNTX0JVTVBFTlZNQVQxMSAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTUFUMDApLCAgICAgdGV4X2J1bXBlbnZtYXQgICAgICB9LAogICAgeyAvKjcsIDExLCBXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19URVhDT09SRElOREVYKSwgICAgdGV4X2Nvb3JkaW5kZXggICAgICB9LAogICAgeyAvKjcsIDEyLCBXSU5FRDNEVFNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDEzLCBXSU5FRDNEVFNTX0FERFJFU1NVICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDE0LCBXSU5FRDNEVFNTX0FERFJFU1NWICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDE1LCBXSU5FRDNEVFNTX0JPUkRFUkNPTE9SICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDE2LCBXSU5FRDNEVFNTX01BR0ZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDE3LCBXSU5FRDNEVFNTX01JTkZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDE4LCBXSU5FRDNEVFNTX01JUEZJTFRFUiAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDE5LCBXSU5FRDNEVFNTX01JUE1BUExPREJJQVMgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDIwLCBXSU5FRDNEVFNTX01BWE1JUExFVkVMICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDIxLCBXSU5FRDNEVFNTX01BWEFOSVNPVFJPUFkgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDIyLCBXSU5FRDNEVFNTX0JVTVBFTlZMU0NBTEUgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFKSwgICAgdGV4X2J1bXBlbnZsc2NhbGUgICB9LAogICAgeyAvKjcsIDIzLCBXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19CVU1QRU5WTE9GRlNFVCksICAgdGV4X2J1bXBlbnZsb2Zmc2V0ICB9LAogICAgeyAvKjcsIDI0LCBXSU5FRDNEVFNTX1RFWFRVUkVUUkFOU0ZPUk1GTEFHUyAgICAgKi8gICAgICBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1RFWFRVUkU3KSwgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3RleHR1cmUgICB9LAogICAgeyAvKjcsIDI1LCBXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDI2LCBXSU5FRDNEVFNTX0NPTE9SQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjcsIDI3LCBXSU5FRDNEVFNTX0FMUEhBQVJHMCAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19BTFBIQU9QKSwgICAgICAgICAgdGV4X2FscGhhb3AgICAgICAgICB9LAogICAgeyAvKjAsIDI4LCBXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9URVhUVVJFU1RBR0UoNywgV0lORUQzRFRTU19DT0xPUk9QKSwgICAgICAgICAgdGV4X2NvbG9yb3AgICAgICAgICB9LAogICAgeyAvKjcsIDI5LCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDMwLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDMxLCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIC0+IHNhbXBsZXIgc3RhdGUgaW4gZGRyYXcgLyBkM2Q4ICovLCAgICAgICAgICAgc3RhdGVfdW5kZWZpbmVkICAgICB9LAogICAgeyAvKjcsIDMyLCBXSU5FRDNEVFNTX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgKi8gICAgICAwIC8qIEFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBEM0RUQV9DT05TVEFOVCAqLywgc3RhdGVfbm9nbCAgICAgICAgICB9LAogICAgLyogU2FtcGxlciBzdGF0ZXMgKi8KICAgIHsgLyogMCwgU2FtcGxlciAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogMSwgU2FtcGxlciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogMiwgU2FtcGxlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogMywgU2FtcGxlciAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogNCwgU2FtcGxlciAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUig0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogNSwgU2FtcGxlciA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUig1KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogNiwgU2FtcGxlciA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUig2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogNywgU2FtcGxlciA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUig3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogOCwgU2FtcGxlciA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUig4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyogOSwgU2FtcGxlciA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUig5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxMCwgU2FtcGxlciAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxMSwgU2FtcGxlciAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxMiwgU2FtcGxlciAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxMywgU2FtcGxlciAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxMyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxNCwgU2FtcGxlciAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxNSwgU2FtcGxlciAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxNiwgVmVydGV4IHNhbXBsZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxNywgVmVydGV4IHNhbXBsZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxOCwgVmVydGV4IHNhbXBsZXIgMiAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIHsgLyoxOSwgVmVydGV4IHNhbXBsZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfU0FNUExFUigxOSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXIgICAgICAgICAgICAgfSwKICAgIC8qIFBpeGVsIHNoYWRlciAqLwogICAgeyAvKiAgLCBQaXhlbCBTaGFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9QSVhFTFNIQURFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzaGFkZXIgICAgICAgICB9LAogICAgICAvKiBUcmFuc2Zvcm0gc3RhdGVzIGZvbGxvdyAgICAgICAgICAgICAgICAgICAgKi8KICAgIHsgLyogIDEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogIDIsIFdJTkVEM0RUU19WSUVXICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19WSUVXKSwgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV92aWV3ICAgICAgfSwKICAgIHsgLyogIDMsIFdJTkVEM0RUU19QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19QUk9KRUNUSU9OKSwgICAgICAgICAgICAgIHRyYW5zZm9ybV9wcm9qZWN0aW9ufSwKICAgIHsgLyogIDQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogIDUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogIDYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogIDcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogIDgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogIDksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMTYsIFdJTkVEM0RUU19URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMCksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMTcsIFdJTkVEM0RUU19URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMSksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMTgsIFdJTkVEM0RUU19URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMiksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMTksIFdJTkVEM0RUU19URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFMyksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMjAsIFdJTkVEM0RUU19URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFNCksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMjEsIFdJTkVEM0RUU19URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFNSksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMjIsIFdJTkVEM0RUU19URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFNiksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgIHsgLyogMjMsIFdJTkVEM0RUU19URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVFJBTlNGT1JNKFdJTkVEM0RUU19URVhUVVJFNyksICAgICAgICAgICAgICAgIHRyYW5zZm9ybV90ZXh0dXJlICAgfSwKICAgICAgLyogQSBodWdlIGdhcCBiZXR3ZWVuIFRFWFRVUkU3IGFuZCBXT1JMRE1BVFJJWCgwKSA6LSggQnV0IGVudHJpZXMgYXJlIG5lZWRlZCB0byBjYXRjaCB0aGVuIGlmIGEgYnJva2VuIGFwcCBzZXRzIHRoZW0gKi8KICAgIHsgLyogMjQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMjUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMjYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMjcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMjgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogMzksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNDksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNTksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogNzksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogODksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyogOTksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMDksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMTksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxMzksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNDksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNTksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxNzksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxODksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoxOTksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMDksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMTksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMjksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyMzksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDYsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDcsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDgsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNDksIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNTAsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNTEsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNTIsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNTMsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNTQsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgIHsgLyoyNTUsIHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX3VuZGVmaW5lZCAgICAgfSwKICAgICAgLyogRW5kIGh1Z2UgZ2FwICovCiAgICB7IC8qMjU2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMCkgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMCkpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGQgICAgIH0sCiAgICB7IC8qMjU3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMSkgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMSkpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjU4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMikgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMikpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjU5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMykgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMykpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjYwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNCkgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNCkpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjYxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNSkgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNSkpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjYyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNikgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNikpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjYzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNykgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNykpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjY0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOCkgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOCkpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjY1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOSkgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOSkpLCAgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjY2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjY3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjY4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjY5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjcwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjcxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjcyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjczLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjc0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjc1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjc2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjc3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjc4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjc5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjgwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjgxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjgyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjgzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjg0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjg1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjg2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjg3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjg4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjg5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjkwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjkxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjkyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjkzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjk0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjk1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMzkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMzkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjk2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjk3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjk4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMjk5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzAwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzAxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzAyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzAzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzA0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzA1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNDkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNDkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzA2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzA3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzA4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzA5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzEwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzExLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzEyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzEzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzE0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzE1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNTkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNTkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzE2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzE3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzE4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzE5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzIwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzIxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzIyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzIzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzI0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzI1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNjgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNjkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzI2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzI3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzI4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzI5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzMwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzMxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzMyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzMzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzM0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzM1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoNzkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoNzkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzM2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoODApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzM3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoODEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzM4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoODIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzM5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoODMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoODQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoODUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoODYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoODcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQ0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoODgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQ1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoODkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoODkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQ2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTApICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTApKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQ3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTEpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTEpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQ4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTIpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTIpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzQ5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTMpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTMpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzUwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTQpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTQpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzUxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTUpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTUpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzUyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTYpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTYpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzUzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTcpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTcpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTgpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTgpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoOTkpICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoOTkpKSwgICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTAwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTAwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTAxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTAxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTAyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTAyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTAzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTAzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzYwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTA0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTA0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzYxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTA1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTA1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzYyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTA2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTA2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzYzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTA3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTA3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzY0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTA4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTA4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzY1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTA5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTA5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzY2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTEwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTEwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzY3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTExKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTExKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzY4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTEyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTEyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzY5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTEzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTEzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzcwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTE0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTE0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzcxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTE1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTE1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzcyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTE2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTE2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzczLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTE3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTE3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzc0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTE4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTE4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzc1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTE5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTE5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzc2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTIwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTIwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzc3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTIxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTIxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzc4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTIyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTIyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzc5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTIzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTIzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzgwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTI0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTI0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzgxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTI1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTI1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzgyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTI2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTI2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzgzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTI3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTI3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzg0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTI4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTI4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzg1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTI5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTI5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzg2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTMwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTMwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzg3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTMxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTMxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzg4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTMyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTMyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzg5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTMzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTMzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzkwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTM0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTM0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzkxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTM1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTM1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzkyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTM2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTM2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzkzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTM3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTM3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzk0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTM4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTM4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzk1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTM5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTM5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzk2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzk3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzk4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzk5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDAwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDAxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDAyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDAzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDA0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDA1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTQ5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDA2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTUwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTUwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDA3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTUxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTUxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDA4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTUyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTUyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDA5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTUzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTUzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDEwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTU0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTU0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDExLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTU1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTU1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDEyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTU2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTU2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDEzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTU3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTU3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDE0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTU4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTU4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDE1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTU5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTU5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDE2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTYwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTYwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDE3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTYxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTYxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDE4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTYyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTYyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDE5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTYzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTYzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDIwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTY0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTY0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDIxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTY1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTY1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDIyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTY2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTY2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDIzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTY3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTY3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDI0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTY4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTY4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDI1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTY4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTY5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDI2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTcwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTcwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDI3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTcxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTcxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDI4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTcyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTcyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDI5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTczKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTczKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDMwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTc0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTc0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDMxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTc1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTc1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDMyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTc2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTc2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDMzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTc3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTc3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDM0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTc4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTc4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDM1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTc5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTc5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDM2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTgwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTgwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDM3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTgxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTgxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDM4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTgyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTgyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDM5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTgzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTgzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTg0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTg0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTg1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTg1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTg2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTg2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTg3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTg3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQ0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTg4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTg4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQ1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTg5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTg5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQ2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTkwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTkwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQ3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTkxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTkxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQ4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTkyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTkyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDQ5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTkzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTkzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDUwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTk0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTk0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDUxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTk1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTk1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDUyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTk2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTk2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDUzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTk3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTk3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDU0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTk4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTk4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDU1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMTk5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMTk5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qMzU2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjAwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjAwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDU3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjAxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjAxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDU4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjAyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjAyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDU5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjAzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjAzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDYwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjA0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjA0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDYxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjA1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjA1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDYyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjA2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjA2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDYzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjA3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjA3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDY0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjA4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjA4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDY1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjA5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjA5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDY2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjEwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjEwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDY3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjExKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjExKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDY4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjEyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjEyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDY5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjEzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjEzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDcwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjE0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjE0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDcxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjE1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjE1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDcyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjE2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjE2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDczLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjE3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjE3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDc0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjE4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjE4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDc1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjE5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjE5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDc2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjIwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjIwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDc3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjIxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjIxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDc4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjIyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjIyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDc5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjIzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjIzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDgwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjI0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjI0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDgxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjI1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjI1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDgyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjI2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjI2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDgzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjI3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjI3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDg0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjI4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjI4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDg1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjI5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjI5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDg2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjMwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjMwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDg3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjMxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjMxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDg4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjMyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjMyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDg5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjMzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjMzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDkwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjM0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjM0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDkxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjM1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjM1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDkyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjM2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjM2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDkzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjM3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjM3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDk0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjM4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjM4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDk1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjM5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjM5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDk2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDk3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDk4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNDk5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTAwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTAxLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTAyLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ2KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ2KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTAzLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ3KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ3KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTA0LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ4KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ4KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTA1LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ5KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjQ5KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTA2LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjUwKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjUwKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTA3LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjUxKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjUxKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTA4LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjUyKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjUyKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTA5LCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjUzKSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjUzKSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTEwLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjU0KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjU0KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICB7IC8qNTExLCBXSU5FRDNEVFNfV09STERNQVRSSVgoMjU1KSAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfV09STERNQVRSSVgoMjU1KSksICAgICAgICB0cmFuc2Zvcm1fd29ybGRleCAgIH0sCiAgICAgIC8qIFZhcmlvdXMgVmVydGV4IHN0YXRlcyBmb2xsb3cgKi8KICAgIHsgLyogICAsIFNUQVRFX1NUUkVBTVNSQyAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVkRFQ0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX0lOREVYQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfSU5ERVhCVUZGRVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4YnVmZmVyICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX1ZERUNMICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVkRFQ0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX1ZTSEFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVkRFQ0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVklFV1BPUlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0ICAgICAgICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX1ZFUlRFWFNIQURFUkNPTlNUQU5UICAgICAgICAgICAgICovICAgICAgU1RBVEVfVkVSVEVYU0hBREVSQ09OU1RBTlQsICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcmNvbnN0YW50ICAgICAgfSwKICAgIHsgLyogICAsIFNUQVRFX1BJWEVMU0hBREVSQ09OU1RBTlQgICAgICAgICAgICAgICovICAgICAgU1RBVEVfVkVSVEVYU0hBREVSQ09OU1RBTlQsICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcmNvbnN0YW50ICAgICAgfSwKICAgICAgLyogTGlnaHRzICovCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCgwKSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCgxKSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCgyKSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCgzKSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCg0KSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCg1KSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCg2KSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCiAgICB7IC8qICAgLCBTVEFURV9BQ1RJVkVMSUdIVCg3KSAgICAgICAgICAgICAgICAgICAqLyAgICAgIFNUQVRFX0FDVElWRUxJR0hUKDcpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgICAgIH0sCgogICAgeyAvKiBTY2lzc29yIHJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9TQ0lTU09SUkVDVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgICAvKiBDbGlwIHBsYW5lcyAqLwogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMCkgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMikgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMykgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoNCkgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoNSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoNikgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoNiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoNykgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoOCkgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoOSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoOSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTApICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTEpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTIpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTMpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTQpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTUpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTYpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTcpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTcpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTgpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMTkpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMTkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjApICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjEpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjIpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjMpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjQpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjUpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjYpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjcpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjcpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjgpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMjkpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMjkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMzApICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMzApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAogICAgeyAvKiBTVEFURV9DTElQUExBTkUoMzEpICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICBTVEFURV9DTElQUExBTkUoMzEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgICAgICB9LAoKICAgIHsgLyogU1RBVEVfTUFURVJJQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TUEVDVUxBUkVOQUJMRSksICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKICAgIHsgLyogU1RBVEVfRlJPTlRGQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAgICAgU1RBVEVfRlJPTlRGQUNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgICAgICAgICAgICAgICAgfSwKfTsKCmNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5VGVtcGxhdGUgbWlzY19zdGF0ZV90ZW1wbGF0ZVtdID0gewogICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NSQ0JMRU5EKSwgICAgICAgICAgICAgICAgICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfYmxlbmQgICAgICAgICB9fSwKICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19ERVNUQkxFTkQpLCAgICAgICAgICAgICAgICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIHN0YXRlX2JsZW5kICAgICAgICAgfX0sCiAgICB7IFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICB7IFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH19LAogICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0VER0VBTlRJQUxJQVMpLCAgICAgICAgICAgICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfYmxlbmQgICAgICAgICB9fSwKICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTlRJQUxJQVNFRExJTkVFTkFCTEUpLCAgICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIHN0YXRlX2JsZW5kICAgICAgICAgfX0sCiAgICB7IFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU0VQQVJBVEVBTFBIQUJMRU5ERU5BQkxFKSwgICB7IFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH19LAogICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NSQ0JMRU5EQUxQSEEpLCAgICAgICAgICAgICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfYmxlbmQgICAgICAgICB9fSwKICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19ERVNUQkxFTkRBTFBIQSksICAgICAgICAgICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQUJMRU5ERU5BQkxFKSwgICAgICAgICAgIHN0YXRlX2JsZW5kICAgICAgICAgfX0sCiAgICB7IFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfREVTVEJMRU5EQUxQSEEpLCAgICAgICAgICAgICB7IFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSksICAgICAgICAgICBzdGF0ZV9ibGVuZCAgICAgICAgIH19LAogICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0JMRU5ET1BBTFBIQSksICAgICAgICAgICAgICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0FMUEhBQkxFTkRFTkFCTEUpLCAgICAgICAgICAgc3RhdGVfYmxlbmQgICAgICAgICB9fSwKICAgIHsgU1RBVEVfU1RSRUFNU1JDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfVkRFQ0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNyYyAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX1ZERUNMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX1ZERUNMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zcmMgICAgICAgICAgIH19LAogICAgeyBTVEFURV9GUk9OVEZBQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9GUk9OVEZBQ0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRmYWNlICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfU0NJU1NPUlJFQ1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfU0NJU1NPUlJFQ1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaXNzb3JyZWN0ICAgICAgICAgfX0sCiAgICB7MCAvKiBUZXJtaW5hdGUgKi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgIH19LAp9OwoKY29uc3Qgc3RydWN0IFN0YXRlRW50cnlUZW1wbGF0ZSBmZnBfdmVydGV4c3RhdGVfdGVtcGxhdGVbXSA9IHsKICAgIHsgU1RBVEVfVkRFQ0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfVkRFQ0wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleGRlY2xhcmF0aW9uICAgfX0sCiAgICB7IFNUQVRFX1ZTSEFERVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX1ZERUNMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhkZWNsYXJhdGlvbiAgIH19LAogICAgeyBTVEFURV9NQVRFUklBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1NQRUNVTEFSRU5BQkxFKSwgICAgICAgICAgICAgc3RhdGVfc3BlY3VsYXJlbmFibGV9fSwKICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TUEVDVUxBUkVOQUJMRSksICAgICAgICAgICAgIHsgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19TUEVDVUxBUkVOQUJMRSksICAgICAgICAgICAgIHN0YXRlX3NwZWN1bGFyZW5hYmxlfX0sCiAgICAgIC8qIENsaXAgcGxhbmVzICovCiAgICB7IFNUQVRFX0NMSVBQTEFORSgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSg2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSg2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSg5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSg5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMTApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMTApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDExKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDExKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgxMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgxMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMTMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMTMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgxNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgxNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDE3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDE3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgxOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgxOCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMTkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMTkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDIwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDIwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgyMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgyMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMjIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMjIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDIzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDIzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgyNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgyNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMjUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMjUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDI2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDI2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgyNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgyNyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMjgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMjgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDI5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQ0xJUFBMQU5FKDI5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBwbGFuZSAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0NMSVBQTEFORSgzMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0NMSVBQTEFORSgzMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGxhbmUgICAgICAgICAgIH19LAogICAgeyBTVEFURV9DTElQUExBTkUoMzEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9DTElQUExBTkUoMzEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcHBsYW5lICAgICAgICAgICB9fSwKICAgICAgLyogTGlnaHRzICovCiAgICB7IFNUQVRFX0FDVElWRUxJR0hUKDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0FDVElWRUxJR0hUKDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodCAgICAgICAgICAgICAgIH19LAogICAgeyBTVEFURV9BQ1RJVkVMSUdIVCgxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9BQ1RJVkVMSUdIVCgxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHQgICAgICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQUNUSVZFTElHSFQoMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQUNUSVZFTElHSFQoMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0FDVElWRUxJR0hUKDMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0FDVElWRUxJR0hUKDMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodCAgICAgICAgICAgICAgIH19LAogICAgeyBTVEFURV9BQ1RJVkVMSUdIVCg0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9BQ1RJVkVMSUdIVCg0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHQgICAgICAgICAgICAgICB9fSwKICAgIHsgU1RBVEVfQUNUSVZFTElHSFQoNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgU1RBVEVfQUNUSVZFTElHSFQoNSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0ICAgICAgICAgICAgICAgfX0sCiAgICB7IFNUQVRFX0FDVElWRUxJR0hUKDYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFNUQVRFX0FDVElWRUxJR0hUKDYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodCAgICAgICAgICAgICAgIH19LAogICAgeyBTVEFURV9BQ1RJVkVMSUdIVCg3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTVEFURV9BQ1RJVkVMSUdIVCg3KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHQgICAgICAgICAgICAgICB9fSwKICAgIHswIC8qIFRlcm1pbmF0ZSAqLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgfX0sCn07CgpzdGF0aWMgaW50IG51bV9oYW5kbGVycyhBUFBMWVNUQVRFRlVOQyAqZnVuY3MpIHsKICAgIHVuc2lnbmVkIGludCBpOwogICAgZm9yKGkgPSAwOyBmdW5jc1tpXTsgaSsrKTsKICAgIHJldHVybiBpOwp9CgpzdGF0aWMgdm9pZCBtdWx0aXN0YXRlX2FwcGx5XzIoRFdPUkQgc3RhdGUsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKnN0YXRlYmxvY2ssIFdpbmVEM0RDb250ZXh0ICpjb250ZXh0KSB7CiAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5tdWx0aXN0YXRlX2Z1bmNzW3N0YXRlXVswXShzdGF0ZSwgc3RhdGVibG9jaywgY29udGV4dCk7CiAgICBzdGF0ZWJsb2NrLT53aW5lRDNERGV2aWNlLT5tdWx0aXN0YXRlX2Z1bmNzW3N0YXRlXVsxXShzdGF0ZSwgc3RhdGVibG9jaywgY29udGV4dCk7Cn0KCnN0YXRpYyB2b2lkIG11bHRpc3RhdGVfYXBwbHlfMyhEV09SRCBzdGF0ZSwgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqc3RhdGVibG9jaywgV2luZUQzRENvbnRleHQgKmNvbnRleHQpIHsKICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPm11bHRpc3RhdGVfZnVuY3Nbc3RhdGVdWzBdKHN0YXRlLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPm11bHRpc3RhdGVfZnVuY3Nbc3RhdGVdWzFdKHN0YXRlLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKICAgIHN0YXRlYmxvY2stPndpbmVEM0REZXZpY2UtPm11bHRpc3RhdGVfZnVuY3Nbc3RhdGVdWzJdKHN0YXRlLCBzdGF0ZWJsb2NrLCBjb250ZXh0KTsKfQoKdm9pZCBjb21waWxlX3N0YXRlX3RhYmxlKHN0cnVjdCBTdGF0ZUVudHJ5ICpTdGF0ZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgQVBQTFlTVEFURUZVTkMgKipkZXZfbXVsdGlzdGF0ZV9mdW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5VGVtcGxhdGUgKnZlcnRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5VGVtcGxhdGUgKmZyYWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFN0YXRlRW50cnlUZW1wbGF0ZSAqbWlzYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBTdGF0ZUVudHJ5ICp0ZW1wdGFibGUgLyogVE9ETzogUmVtb3ZlIHRoaXMgKi8pIHsKICAgIHVuc2lnbmVkIGludCBpLCB0eXBlLCBoYW5kbGVyczsKICAgIEFQUExZU1RBVEVGVU5DIG11bHRpc3RhdGVfZnVuY3NbU1RBVEVfSElHSEVTVCArIDFdWzNdOwogICAgY29uc3Qgc3RydWN0IFN0YXRlRW50cnlUZW1wbGF0ZSAqY3VyOwoKICAgIC8qIFRPRE86IFJlbW92ZSB0aGlzIG9uY2UgYWxsIHN0YXRlcyBhcmUgcHJvdmlkZWQgYnkgdGVtcGxhdGVzICovCiAgICBCT09MIHNldFtTVEFURV9ISUdIRVNUICsgMV07CiAgICBtZW1zZXQoc2V0LCAwLCBzaXplb2Yoc2V0KSk7CgogICAgbWVtc2V0KG11bHRpc3RhdGVfZnVuY3MsIDAsIHNpemVvZihtdWx0aXN0YXRlX2Z1bmNzKSk7CgogICAgZm9yKHR5cGUgPSAwOyB0eXBlIDwgMzsgdHlwZSsrKSB7CiAgICAgICAgLyogVGhpcyBzd2l0Y2ggZGVjaWRlcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHN0YXRlcyBhcmUgYXBwbGllZCAqLwogICAgICAgIHN3aXRjaCh0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgMDogY3VyID0gbWlzYzsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTogY3VyID0gZnJhZ21lbnQ7IGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6IGN1ciA9IHZlcnRleDsgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IGN1ciA9IE5VTEw7IC8qIFN0dXBpZCBjb21waWxlciAqLwogICAgICAgIH0KICAgICAgICBpZighY3VyKSBjb250aW51ZTsKCiAgICAgICAgZm9yKGkgPSAwOyBjdXJbaV0uc3RhdGU7IGkrKykgewogICAgICAgICAgICBzZXRbY3VyW2ldLnN0YXRlXSA9IFRSVUU7IC8qIFRPRE86IFJlbW92ZSB3aGVuIGRvbmUgd2l0aCB0aGUgbW92ZSAqLwogICAgICAgICAgICBoYW5kbGVycyA9IG51bV9oYW5kbGVycyhtdWx0aXN0YXRlX2Z1bmNzW2N1cltpXS5zdGF0ZV0pOwogICAgICAgICAgICBtdWx0aXN0YXRlX2Z1bmNzW2N1cltpXS5zdGF0ZV1baGFuZGxlcnNdID0gY3VyW2ldLmNvbnRlbnQuYXBwbHk7CiAgICAgICAgICAgIHN3aXRjaChoYW5kbGVycykgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIFN0YXRlVGFibGVbY3VyW2ldLnN0YXRlXS5hcHBseSA9IGN1cltpXS5jb250ZW50LmFwcGx5OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIFN0YXRlVGFibGVbY3VyW2ldLnN0YXRlXS5hcHBseSA9IG11bHRpc3RhdGVfYXBwbHlfMjsKICAgICAgICAgICAgICAgICAgICBkZXZfbXVsdGlzdGF0ZV9mdW5jc1tjdXJbaV0uc3RhdGVdID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCoqZGV2X211bHRpc3RhdGVfZnVuY3MpICogMik7CiAgICAgICAgICAgICAgICAgICAgZGV2X211bHRpc3RhdGVfZnVuY3NbY3VyW2ldLnN0YXRlXVswXSA9IG11bHRpc3RhdGVfZnVuY3NbY3VyW2ldLnN0YXRlXVswXTsKICAgICAgICAgICAgICAgICAgICBkZXZfbXVsdGlzdGF0ZV9mdW5jc1tjdXJbaV0uc3RhdGVdWzFdID0gbXVsdGlzdGF0ZV9mdW5jc1tjdXJbaV0uc3RhdGVdWzFdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIFN0YXRlVGFibGVbY3VyW2ldLnN0YXRlXS5hcHBseSA9IG11bHRpc3RhdGVfYXBwbHlfMzsKICAgICAgICAgICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtdWx0aXN0YXRlX2Z1bmNzW2N1cltpXS5zdGF0ZV0pOwogICAgICAgICAgICAgICAgICAgIGRldl9tdWx0aXN0YXRlX2Z1bmNzW2N1cltpXS5zdGF0ZV0gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKipkZXZfbXVsdGlzdGF0ZV9mdW5jcykgKiAzKTsKICAgICAgICAgICAgICAgICAgICBkZXZfbXVsdGlzdGF0ZV9mdW5jc1tjdXJbaV0uc3RhdGVdWzBdID0gbXVsdGlzdGF0ZV9mdW5jc1tjdXJbaV0uc3RhdGVdWzBdOwogICAgICAgICAgICAgICAgICAgIGRldl9tdWx0aXN0YXRlX2Z1bmNzW2N1cltpXS5zdGF0ZV1bMV0gPSBtdWx0aXN0YXRlX2Z1bmNzW2N1cltpXS5zdGF0ZV1bMV07CiAgICAgICAgICAgICAgICAgICAgZGV2X211bHRpc3RhdGVfZnVuY3NbY3VyW2ldLnN0YXRlXVsyXSA9IG11bHRpc3RhdGVfZnVuY3NbY3VyW2ldLnN0YXRlXVsyXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmV4cGVjdGVkIGFtb3VudCBvZiBzdGF0ZSBoYW5kbGVycyBmb3Igc3RhdGUgJXU6ICV1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICBjdXJbaV0uc3RhdGUsIGhhbmRsZXJzICsgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKFN0YXRlVGFibGVbY3VyW2ldLnN0YXRlXS5yZXByZXNlbnRhdGl2ZSAmJgogICAgICAgICAgICBTdGF0ZVRhYmxlW2N1cltpXS5zdGF0ZV0ucmVwcmVzZW50YXRpdmUgIT0gY3VyW2ldLmNvbnRlbnQucmVwcmVzZW50YXRpdmUpIHsKICAgICAgICAgICAgICAgIEZJWE1FKCJTdGF0ZSAldSBoYXMgZGlmZmVyZW50IHJlcHJlc2VudGF0aXZlcyBpbiBkaWZmZXJlbnQgcGlwZWxpbmUgcGFydHNcbiIsCiAgICAgICAgICAgICAgICAgICAgY3VyW2ldLnN0YXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTdGF0ZVRhYmxlW2N1cltpXS5zdGF0ZV0ucmVwcmVzZW50YXRpdmUgPSBjdXJbaV0uY29udGVudC5yZXByZXNlbnRhdGl2ZTsKICAgICAgICB9CiAgICB9CgogICAgLyogVE9ETyBSZW1vdmUgdGhpcyBhZnRlciB0aGUgc3RhdGUgbW92ZSBpcyBkb25lICovCiAgICBmb3IoaSA9IDA7IGkgPCBTVEFURV9ISUdIRVNUICsgMTsgaSsrKSB7CiAgICAgICAgaWYoc2V0W2ldKSBjb250aW51ZTsKICAgICAgICBTdGF0ZVRhYmxlW2ldID0gdGVtcHRhYmxlW2ldOwogICAgfQp9Cg==