LyoKICogMkQgU3VyZmFjZSBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IE9wZW5HTAogKgogKiBDb3B5cmlnaHQgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgMTk5OC0yMDAwIExpb25lbCBVbG1lcgogKiBDb3B5cmlnaHQgMjAwMC0yMDAxIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcyBJbmMuCiAqIENvcHlyaWdodCAyMDAyLTIwMDUgSmFzb24gRWRtZWFkZXMKICogQ29weXJpZ2h0IDIwMDItMjAwMyBSYXBoYWVsIEp1bnF1ZWlyYQogKiBDb3B5cmlnaHQgMjAwNCBDaHJpc3RpYW4gQ29zdGEKICogQ29weXJpZ2h0IDIwMDUgT2xpdmVyIFN0aWViZXIKICogQ29weXJpZ2h0IDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgojaW5jbHVkZSAid2luZWQzZF9wcml2YXRlLmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKLyogVXNlIHRoZSBkM2Rfc3VyZmFjZSBkZWJ1ZyBjaGFubmVsIHRvIGhhdmUgb25lIGNoYW5uZWwgZm9yIGFsbCBzdXJmYWNlcyAqLwpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Rfc3VyZmFjZSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogeDExX2NvcHlfdG9fc2NyZWVuCiAqCiAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGJsdHMgdGhlIGZyb250IGJ1ZmZlciBjb250ZW50cyB0byB0aGUgdGFyZ2V0IHdpbmRvdwogKgogKiBQYXJhbXM6CiAqICBUaGlzOiBTdXJmYWNlIHRvIGNvcHkgZnJvbQogKiAgcmM6IFJlY3RhbmdsZSB0byBjb3B5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKeDExX2NvcHlfdG9fc2NyZWVuKElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMsCiAgICAgICAgICAgICAgICAgICBMUFJFQ1QgcmMpCnsKICAgIGlmKFRoaXMtPnJlc291cmNlLnVzYWdlICYgV0lORUQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKICAgIHsKICAgICAgICBQT0lOVCBvZmZzZXQgPSB7MCwwfTsKICAgICAgICBIV05EIGhEaXNwbGF5V25kOwogICAgICAgIEhEQyBoRGlzcGxheURDOwogICAgICAgIEhEQyBoU3VyZmFjZURDID0gMDsKICAgICAgICBSRUNUIGRyYXdyZWN0OwogICAgICAgIFRSQUNFKCIoJXApLT4oJXApOiBDb3B5aW5nIHRvIHNjcmVlblxuIiwgVGhpcywgcmMpOwoKICAgICAgICBoU3VyZmFjZURDID0gVGhpcy0+aERDOwoKICAgICAgICBoRGlzcGxheVduZCA9IFRoaXMtPnJlc291cmNlLndpbmVEM0REZXZpY2UtPmRkcmF3X3dpbmRvdzsKICAgICAgICBoRGlzcGxheURDID0gR2V0RENFeChoRGlzcGxheVduZCwgMCwgRENYX0NMSVBTSUJMSU5HU3xEQ1hfQ0FDSEUpOwogICAgICAgIGlmKHJjKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoIiBjb3B5aW5nIHJlY3QgKCVsZCwlbGQpLT4oJWxkLCVsZCksIG9mZnNldCAoJWxkLCVsZClcbiIsCiAgICAgICAgICAgIHJjLT5sZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQsIHJjLT5ib3R0b20sIG9mZnNldC54LCBvZmZzZXQueSk7CiAgICAgICAgfQojaWYgMAogICAgICAgIC8qIEZJWE1FOiB0aGlzIGRvZXNuJ3Qgd29yay4uLiBpZiB1c2VycyByZWFsbHkgd2FudCB0byBydW4KICAgICAgICAqIFggaW4gOGJwcCwgdGhlbiB3ZSBuZWVkIHRvIGNhbGwgZGlyZWN0bHkgaW50byBkaXNwbGF5LmRydgogICAgICAgICogKG9yIFdpbmUncyBlcXVpdmFsZW50KSwgYW5kIGZvcmNlIGEgcHJpdmF0ZSBjb2xvcm1hcAogICAgICAgICogd2l0aG91dCBkZWZhdWx0IGVudHJpZXMuICovCiAgICAgICAgaWYgKFRoaXMtPnBhbGV0dGUpIHsKICAgICAgICAgICAgU2VsZWN0UGFsZXR0ZShoRGlzcGxheURDLCBUaGlzLT5wYWxldHRlLT5ocGFsLCBGQUxTRSk7CiAgICAgICAgICAgIFJlYWxpemVQYWxldHRlKGhEaXNwbGF5REMpOyAvKiBzZW5kcyBtZXNzYWdlcyA9PiBkZWFkbG9ja3MgKi8KICAgICAgICB9CiNlbmRpZgogICAgICAgIGRyYXdyZWN0LmxlZnQJPSAwOwogICAgICAgIGRyYXdyZWN0LnJpZ2h0CT0gVGhpcy0+Y3VycmVudERlc2MuV2lkdGg7CiAgICAgICAgZHJhd3JlY3QudG9wCT0gMDsKICAgICAgICBkcmF3cmVjdC5ib3R0b20JPSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQ7CgojaWYgMAogICAgICAgIC8qIFRPRE86IFN1cHBvcnQgY2xpcHBlcnMgKi8KICAgICAgICBpZiAoVGhpcy0+Y2xpcHBlcikKICAgICAgICB7CiAgICAgICAgICAgIFJFQ1QgeHJjOwogICAgICAgICAgICBIV05EIGh3bmQgPSBUaGlzLT5jbGlwcGVyLT5oV25kOwogICAgICAgICAgICBpZiAoaHduZCAmJiBHZXRDbGllbnRSZWN0KGh3bmQsJnhyYykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE9mZnNldFJlY3QoJnhyYyxvZmZzZXQueCxvZmZzZXQueSk7CiAgICAgICAgICAgICAgICBJbnRlcnNlY3RSZWN0KCZkcmF3cmVjdCwmZHJhd3JlY3QsJnhyYyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgogICAgICAgIGlmIChyYykKICAgICAgICB7CiAgICAgICAgICAgIEludGVyc2VjdFJlY3QoJmRyYXdyZWN0LCZkcmF3cmVjdCxyYyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIE9ubHkgdXNlIHRoaXMgaWYgdGhlIGNhbGxlciBkaWQgbm90IHBhc3MgYSByZWN0YW5nbGUsIHNpbmNlCiAgICAgICAgICAgICAqIGR1ZSB0byBkb3VibGUgbG9ja2luZyB0aGlzIGNvdWxkIGJlIHRoZSB3cm9uZyBvbmUgLi4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoVGhpcy0+bG9ja2VkUmVjdC5sZWZ0ICE9IFRoaXMtPmxvY2tlZFJlY3QucmlnaHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEludGVyc2VjdFJlY3QoJmRyYXdyZWN0LCZkcmF3cmVjdCwmVGhpcy0+bG9ja2VkUmVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEJpdEJsdChoRGlzcGxheURDLAogICAgICAgICAgICAgICBkcmF3cmVjdC5sZWZ0LW9mZnNldC54LCBkcmF3cmVjdC50b3Atb2Zmc2V0LnksCiAgICAgICAgICAgICAgIGRyYXdyZWN0LnJpZ2h0LWRyYXdyZWN0LmxlZnQsIGRyYXdyZWN0LmJvdHRvbS1kcmF3cmVjdC50b3AsCiAgICAgICAgICAgICAgIGhTdXJmYWNlREMsCiAgICAgICAgICAgICAgIGRyYXdyZWN0LmxlZnQsIGRyYXdyZWN0LnRvcCwKICAgICAgICAgICAgICAgU1JDQ09QWSk7CiAgICAgICAgUmVsZWFzZURDKGhEaXNwbGF5V25kLCBoRGlzcGxheURDKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEU3VyZmFjZTo6UHJlTG9hZCwgR0RJIHZlcnNpb24KICoKICogVGhpcyBjYWxsIGlzIHVuc3VwcG9ydGVkIG9uIEdESSBzdXJmYWNlcywgaWYgaXQncyBjYWxsZWQgc29tZXRoaW5nIHdlbnQKICogd3JvbmcgaW4gdGhlIHBhcmVudCBsaWJyYXJ5LiBXcml0ZSBhbiBpbmZvcm1hdGl2ZSB3YXJuaW5nCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBXSU5BUEkKSVdpbmVHRElTdXJmYWNlSW1wbF9QcmVMb2FkKElXaW5lRDNEU3VyZmFjZSAqaWZhY2UpCnsKICAgIEVSUigiKCVwKTogUHJlTG9hZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFgxMSBzdXJmYWNlcyFcbiIsIGlmYWNlKTsKICAgIEVSUigiKCVwKTogTW9zdCBsaWtlbHkgdGhlIHBhcmVudCBsaWJyYXJ5IGRpZCBzb21ldGhpbmcgd3JvbmcuXG4iLCBpZmFjZSk7CiAgICBFUlIoIiglcCk6IFBsZWFzZSByZXBvcnQgdG8gd2luZS1kZXZlbFxuIiwgaWZhY2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0RTdXJmYWNlOjpMb2NrUmVjdCwgR0RJIHZlcnNpb24KICoKICogTG9ja3MgdGhlIHN1cmZhY2UgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdXJmYWNlIG1lbW9yeQogKgogKiBQYXJhbXM6CiAqICBwTG9ja2VkUmVjdDogQWRkcmVzcyB0byByZXR1cm4gdGhlIGxvY2tpbmcgaW5mbyBhdAogKiAgcFJlY3Q6IFJlY3RhbmdsZSB0byBsb2NrCiAqICBGbGFnczogU29tZSBmbGFncwogKgogKiBSZXR1cm5zOgogKiAgV0lORUQzRF9PSyBvbiBzdWNjZXNzCiAqICBXSU5FRDNERVJSX0lOVkFMSURDQUxMIG9uIGVycm9ycwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhSRVNVTFQgV0lOQVBJCklXaW5lR0RJU3VyZmFjZUltcGxfTG9ja1JlY3QoSVdpbmVEM0RTdXJmYWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNETE9DS0VEX1JFQ1QqIHBMb2NrZWRSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUIFJFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzKQp7CiAgICBJV2luZUQzRFN1cmZhY2VJbXBsICpUaGlzID0gKElXaW5lRDNEU3VyZmFjZUltcGwgKilpZmFjZTsKCiAgICAvKiBBbHJlYWR5IGxvY2tlZD8gKi8KICAgIGlmKFRoaXMtPkZsYWdzICYgU0ZMQUdfTE9DS0VEKQogICAgewogICAgICAgIEVSUigiKCVwKSBTdXJmYWNlIGFscmVhZHkgbG9ja2VkXG4iLCBUaGlzKTsKICAgICAgICAvKiBXaGF0IHNob3VsZCBJIHJldHVybiBoZXJlPyAqLwogICAgICAgIHJldHVybiBEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgaWYgKCEoVGhpcy0+RmxhZ3MgJiBTRkxBR19MT0NLQUJMRSkpCiAgICB7CiAgICAgICAgLyogVGhpcyBpcyBzb21lIEdMIHNwZWNpZmljIHRoaW5nLCBzZWUgdGhlIE9wZW5HTCB2ZXJzaW9uIG9mCiAgICAgICAgICogdGhpcyBtZXRob2QsIGJ1dCBjaGVjayBmb3IgdGhlIGZsYWcgYW5kIHdyaXRlIGEgdHJhY2UKICAgICAgICAgKi8KICAgICAgICBUUkFDRSgiV2FybmluZzogdHJ5aW5nIHRvIGxvY2sgdW5sb2NrYWJsZSBzdXJmQCVwXG4iLCBUaGlzKTsKICAgIH0KCiAgICBUUkFDRSgiKCVwKSA6IHJlY3RAJXAgZmxhZ3MoJTA4bHgpLCBvdXRwdXQgbG9ja2VkUmVjdEAlcCwgbWVtb3J5QCVwXG4iLAogICAgICAgICAgVGhpcywgcFJlY3QsIEZsYWdzLCBwTG9ja2VkUmVjdCwgVGhpcy0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5KTsKCiAgICBwTG9ja2VkUmVjdC0+UGl0Y2ggPSBJV2luZUQzRFN1cmZhY2VfR2V0UGl0Y2goaWZhY2UpOwoKICAgIGlmIChOVUxMID09IHBSZWN0KQogICAgewogICAgICAgIHBMb2NrZWRSZWN0LT5wQml0cyA9IFRoaXMtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeTsKICAgICAgICBUaGlzLT5sb2NrZWRSZWN0LmxlZnQgICA9IDA7CiAgICAgICAgVGhpcy0+bG9ja2VkUmVjdC50b3AgICAgPSAwOwogICAgICAgIFRoaXMtPmxvY2tlZFJlY3QucmlnaHQgID0gVGhpcy0+Y3VycmVudERlc2MuV2lkdGg7CiAgICAgICAgVGhpcy0+bG9ja2VkUmVjdC5ib3R0b20gPSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQ7CgogICAgICAgIFRSQUNFKCJMb2NrZWQgUmVjdCAoJXApID0gbCAlbGQsIHQgJWxkLCByICVsZCwgYiAlbGRcbiIsCiAgICAgICAgJlRoaXMtPmxvY2tlZFJlY3QsIFRoaXMtPmxvY2tlZFJlY3QubGVmdCwgVGhpcy0+bG9ja2VkUmVjdC50b3AsCiAgICAgICAgVGhpcy0+bG9ja2VkUmVjdC5yaWdodCwgVGhpcy0+bG9ja2VkUmVjdC5ib3R0b20pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFRSQUNFKCJMb2NrIFJlY3QgKCVwKSA9IGwgJWxkLCB0ICVsZCwgciAlbGQsIGIgJWxkXG4iLAogICAgICAgICAgICAgIHBSZWN0LCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPnJpZ2h0LCBwUmVjdC0+Ym90dG9tKTsKCiAgICAgICAgaWYgKFRoaXMtPnJlc291cmNlLmZvcm1hdCA9PSBXSU5FRDNERk1UX0RYVDEpCiAgICAgICAgewogICAgICAgICAgICAvKiBEWFQxIGlzIGhhbGYgYnl0ZSBwZXIgcGl4ZWwgKi8KICAgICAgICAgICAgcExvY2tlZFJlY3QtPnBCaXRzID0gVGhpcy0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTG9ja2VkUmVjdC0+UGl0Y2ggKiBwUmVjdC0+dG9wKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBSZWN0LT5sZWZ0ICogVGhpcy0+Ynl0ZXNQZXJQaXhlbCAvIDIpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcExvY2tlZFJlY3QtPnBCaXRzID0gVGhpcy0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBMb2NrZWRSZWN0LT5QaXRjaCAqIHBSZWN0LT50b3ApICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSZWN0LT5sZWZ0ICogVGhpcy0+Ynl0ZXNQZXJQaXhlbCk7CiAgICAgICAgfQogICAgICAgIFRoaXMtPmxvY2tlZFJlY3QubGVmdCAgID0gcFJlY3QtPmxlZnQ7CiAgICAgICAgVGhpcy0+bG9ja2VkUmVjdC50b3AgICAgPSBwUmVjdC0+dG9wOwogICAgICAgIFRoaXMtPmxvY2tlZFJlY3QucmlnaHQgID0gcFJlY3QtPnJpZ2h0OwogICAgICAgIFRoaXMtPmxvY2tlZFJlY3QuYm90dG9tID0gcFJlY3QtPmJvdHRvbTsKICAgIH0KCiAgICAvKiBObyBkaXJ0aWZ5aW5nIGlzIG5lZWRlZCBmb3IgdGhpcyBzdXJmYWNlIGltcGxlbWVudGF0aW9uICovCiAgICBUUkFDRSgicmV0dXJuaW5nIG1lbW9yeUAlcCwgcGl0Y2goJWQpXG4iLCBwTG9ja2VkUmVjdC0+cEJpdHMsIHBMb2NrZWRSZWN0LT5QaXRjaCk7CgogICAgVGhpcy0+RmxhZ3MgfD0gU0ZMQUdfTE9DS0VEOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEU3VyZmFjZTo6VW5sb2NrUmVjdCwgR0RJIHZlcnNpb24KICoKICogVW5sb2NrcyBhIHN1cmZhY2UuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBtdWNoLCBleGNlcHQgdXBkYXRpbmcKICogdGhlIHdpbmRvdyBpZiB0aGUgZnJvbnQgYnVmZmVyIGlzIHVubG9ja2VkCiAqCiAqIFJldHVybnM6CiAqICBXSU5FRDNEX09LIG9uIHN1Y2Nlc3MKICogIFdJTkVEM0RFUlJfSU5WQUxJRENBTEwgb24gZmFpbHVyZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhSRVNVTFQgV0lOQVBJCklXaW5lR0RJU3VyZmFjZUltcGxfVW5sb2NrUmVjdChJV2luZUQzRFN1cmZhY2UgKmlmYWNlKQp7CiAgICBJV2luZUQzRFN1cmZhY2VJbXBsICpUaGlzID0gKElXaW5lRDNEU3VyZmFjZUltcGwgKilpZmFjZTsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2ID0gKElXaW5lRDNERGV2aWNlSW1wbCAqKSBUaGlzLT5yZXNvdXJjZS53aW5lRDNERGV2aWNlOwogICAgVFJBQ0UoIiglcClcbiIsIFRoaXMpOwoKICAgIGlmICghKFRoaXMtPkZsYWdzICYgU0ZMQUdfTE9DS0VEKSkKICAgIHsKICAgICAgICBXQVJOKCJ0cnlpbmcgdG8gVW5sb2NrIGFuIHVubG9ja2VkIHN1cmZAJXBcbiIsIFRoaXMpOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgfQoKICAgIC8qIENhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyAqLwojaWYgMAogICAgICAgIHsKICAgICAgICAgICAgc3RhdGljIHVuc2lnbmVkIGludCBnZW4gPSAwOwogICAgICAgICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKICAgICAgICAgICAgKytnZW47CiAgICAgICAgICAgIGlmICgoZ2VuICUgMTApID09IDApIHsKICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIvdG1wL3N1cmZhY2UlcF90eXBlJXVfbGV2ZWwldV8ldS5wcG0iLCBUaGlzLCBUaGlzLT5nbERlc2NyaXB0aW9uLnRhcmdldCwgVGhpcy0+Z2xEZXNjcmlwdGlvbi5sZXZlbCwgZ2VuKTsKICAgICAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZUltcGxfU2F2ZVNuYXBzaG90KGlmYWNlLCBidWZmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlYnVnZ2luZyBjcmFzaCBjb2RlCiAgICAgICAgICAgIGlmIChnZW4gPT0gMjUwKSB7CiAgICAgICAgICAgICAgdm9pZCoqIHRlc3QgPSBOVUxMOwogICAgICAgICAgICAgICp0ZXN0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0KI2VuZGlmCgogICAgLyogVXBkYXRlIHRoZSBzY3JlZW4gKi8KICAgIGlmKFRoaXMgPT0gKElXaW5lRDNEU3VyZmFjZUltcGwgKikgZGV2LT5kZHJhd19wcmltYXJ5KQogICAgewogICAgICAgIHgxMV9jb3B5X3RvX3NjcmVlbihUaGlzLCAmVGhpcy0+bG9ja2VkUmVjdCk7CiAgICB9CgogICAgVGhpcy0+RmxhZ3MgJj0gflNGTEFHX0xPQ0tFRDsKICAgIG1lbXNldCgmVGhpcy0+bG9ja2VkUmVjdCwgMCwgc2l6ZW9mKFJFQ1QpKTsKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0RTdXJmYWNlOjpGbGlwLCBHREkgdmVyc2lvbgogKgogKiBGbGlwcyAyIGZsaXBwaW5nIGVuYWJsZWQgc3VyZmFjZXMuIERldGVybWluaW5nIHRoZSAyIHRhcmdldHMgaXMgZG9uZSBieQogKiB0aGUgcGFyZW50IGxpYnJhcnkuIFRoaXMgaW1wbGVtZW50YXRpb24gY2hhbmdlcyB0aGUgZGF0YSBwb2ludGVycyBvZiB0aGUKICogc3VyZmFjZXMgYW5kIGNvcGllcyB0aGUgbmV3IGZyb250IGJ1ZmZlciBjb250ZW50IHRvIHRoZSBzY3JlZW4KICoKICogUGFyYW1zOgogKiAgb3ZlcnJpZGU6IEZsaXBwaW5nIHRhcmdldChlLmcuIGJhY2sgYnVmZmVyKQogKgogKiBSZXR1cm5zOgogKiAgV0lORUQzRF9PSyBvbiBzdWNjZXNzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSFJFU1VMVCBXSU5BUEkKSVdpbmVHRElTdXJmYWNlSW1wbF9GbGlwKElXaW5lRDNEU3VyZmFjZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBJV2luZUQzRFN1cmZhY2UgKm92ZXJyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MpCnsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBpZmFjZTsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlRhcmdldCA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIG92ZXJyaWRlOwogICAgVFJBQ0UoIiglcCktPiglcCwlbHgpXG4iLCBUaGlzLCBvdmVycmlkZSwgRmxhZ3MpOwoKICAgIFRSQUNFKCIoJXApIEZsaXBwaW5nIHRvIHN1cmZhY2UgJXBcbiIsIFRoaXMsIFRhcmdldCk7CgogICAgaWYoVGFyZ2V0ID09IE5VTEwpCiAgICB7CiAgICAgICAgRVJSKCIoJXApOiBDYW4ndCBmbGlwIHdpdGhvdXQgYSB0YXJnZXRcbiIsIFRoaXMpOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgfQoKICAgIC8qIEZsaXAgdGhlIERDICovCiAgICB7CiAgICAgICAgSERDIHRtcDsKICAgICAgICB0bXAgPSBUaGlzLT5oREM7CiAgICAgICAgVGhpcy0+aERDID0gVGFyZ2V0LT5oREM7CiAgICAgICAgVGFyZ2V0LT5oREMgPSB0bXA7CiAgICB9CgogICAgLyogRmxpcCB0aGUgRElCc2VjdGlvbiAqLwogICAgewogICAgICAgIEhCSVRNQVAgdG1wOwogICAgICAgIHRtcCA9IFRoaXMtPmRpYi5ESUJzZWN0aW9uOwogICAgICAgIFRoaXMtPmRpYi5ESUJzZWN0aW9uID0gVGFyZ2V0LT5kaWIuRElCc2VjdGlvbjsKICAgICAgICBUYXJnZXQtPmRpYi5ESUJzZWN0aW9uID0gdG1wOwogICAgfQoKICAgIC8qIEZsaXAgdGhlIHN1cmZhY2UgZGF0YSAqLwogICAgewogICAgICAgIHZvaWQqIHRtcDsKCiAgICAgICAgdG1wID0gVGhpcy0+ZGliLmJpdG1hcF9kYXRhOwogICAgICAgIFRoaXMtPmRpYi5iaXRtYXBfZGF0YSA9IFRhcmdldC0+ZGliLmJpdG1hcF9kYXRhOwogICAgICAgIFRhcmdldC0+ZGliLmJpdG1hcF9kYXRhID0gdG1wOwoKICAgICAgICB0bXAgPSBUaGlzLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnk7CiAgICAgICAgVGhpcy0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5ID0gVGFyZ2V0LT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnk7CiAgICAgICAgVGFyZ2V0LT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnkgPSB0bXA7CiAgICB9CgogICAgLyogY2xpZW50X21lbW9yeSBzaG91bGQgbm90IGJlIGRpZmZlcmVudCwgYnV0IGp1c3QgaW4gY2FzZSAqLwogICAgewogICAgICAgIEJPT0wgdG1wOwogICAgICAgIHRtcCA9IFRoaXMtPmRpYi5jbGllbnRfbWVtb3J5OwogICAgICAgIFRoaXMtPmRpYi5jbGllbnRfbWVtb3J5ID0gVGFyZ2V0LT5kaWIuY2xpZW50X21lbW9yeTsKICAgICAgICBUYXJnZXQtPmRpYi5jbGllbnRfbWVtb3J5ID0gdG1wOwogICAgfQoKICAgIC8qIFVzZWZ1bCBmb3IgZGVidWdnaW5nICovCiNpZiAwCiAgICAgICAgewogICAgICAgICAgICBzdGF0aWMgdW5zaWduZWQgaW50IGdlbiA9IDA7CiAgICAgICAgICAgIGNoYXIgYnVmZmVyWzQwOTZdOwogICAgICAgICAgICArK2dlbjsKICAgICAgICAgICAgaWYgKChnZW4gJSAxMCkgPT0gMCkgewogICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIi90bXAvc3VyZmFjZSVwX3R5cGUldV9sZXZlbCV1XyV1LnBwbSIsIFRoaXMsIFRoaXMtPmdsRGVzY3JpcHRpb24udGFyZ2V0LCBUaGlzLT5nbERlc2NyaXB0aW9uLmxldmVsLCBnZW4pOwogICAgICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9TYXZlU25hcHNob3QoaWZhY2UsIGJ1ZmZlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGVidWdnaW5nIGNyYXNoIGNvZGUKICAgICAgICAgICAgaWYgKGdlbiA9PSAyNTApIHsKICAgICAgICAgICAgICB2b2lkKiogdGVzdCA9IE5VTEw7CiAgICAgICAgICAgICAgKnRlc3QgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICovCiAgICAgICAgfQojZW5kaWYKCiAgICAvKiBVcGRhdGUgdGhlIHNjcmVlbiAqLwogICAgeDExX2NvcHlfdG9fc2NyZWVuKFRoaXMsIE5VTEwpOwoKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogX0JsdF9Db2xvckZpbGwKICoKICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgZmlsbHMgYSBtZW1vcnkgYXJlYSB3aXRoIGEgc3BlY2lmaWMgY29sb3IKICoKICogUGFyYW1zOgogKiAgYnVmOiBtZW1vcnkgYWRkcmVzcyB0byBzdGFydCBmaWxsaW5nIGF0CiAqICB3aWR0aCwgaGVpZ2h0OiBEaW1lbnNpb25zIG9mIHRoZSBhcmVhIHRvIGZpbGwKICogIGJwcDogQml0IGRlcHRoIG9mIHRoZSBzdXJmYWNlCiAqICBsUGl0Y2g6IHBpdGNoIG9mIHRoZSBzdXJmYWNlCiAqICBjb2xvcjogQ29sb3IgdG8gZmlsbCB3aXRoCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQKX0JsdF9Db2xvckZpbGwoQllURSAqYnVmLAogICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgIGludCBicHAsIExPTkcgbFBpdGNoLAogICAgICAgICAgICAgICBEV09SRCBjb2xvcikKewogICAgaW50IHgsIHk7CiAgICBMUEJZVEUgZmlyc3Q7CgogICAgLyogRG8gZmlyc3Qgcm93ICovCgojZGVmaW5lIENPTE9SRklMTF9ST1codHlwZSkgXAp7IFwKICAgIHR5cGUgKmQgPSAodHlwZSAqKSBidWY7IFwKICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSBcCglkW3hdID0gKHR5cGUpIGNvbG9yOyBcCiAgICBicmVhazsgXAp9CiAgICBzd2l0Y2goYnBwKQogICAgewogICAgICAgIGNhc2UgMTogQ09MT1JGSUxMX1JPVyhCWVRFKQogICAgICAgIGNhc2UgMjogQ09MT1JGSUxMX1JPVyhXT1JEKQogICAgICAgIGNhc2UgMzoKICAgICAgICB7CiAgICAgICAgICAgIEJZVEUgKmQgPSAoQllURSAqKSBidWY7CiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrLGQrPTMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRbMF0gPSAoY29sb3IgICAgKSAmIDB4RkY7CiAgICAgICAgICAgICAgICBkWzFdID0gKGNvbG9yPj4gOCkgJiAweEZGOwogICAgICAgICAgICAgICAgZFsyXSA9IChjb2xvcj4+MTYpICYgMHhGRjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSA0OiBDT0xPUkZJTExfUk9XKERXT1JEKQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJDb2xvciBmaWxsIG5vdCBpbXBsZW1lbnRlZCBmb3IgYnBwICVkIVxuIiwgYnBwKjgpOwogICAgICAgICAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7CiAgICB9CgojdW5kZWYgQ09MT1JGSUxMX1JPVwoKICAgIC8qIE5vdyBjb3B5IGZpcnN0IHJvdyAqLwogICAgZmlyc3QgPSBidWY7CiAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspCiAgICB7CiAgICAgICAgYnVmICs9IGxQaXRjaDsKICAgICAgICBtZW1jcHkoYnVmLCBmaXJzdCwgd2lkdGggKiBicHApOwogICAgfQogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0RTdXJmYWNlOjpCbHQsIEdESSB2ZXJzaW9uCiAqCiAqIFBlcmZvcm1zIGJsaXRzIHRvIGEgc3VyZmFjZSwgZWlnaHRlciBmcm9tIGEgc291cmNlIG9mIHNvdXJjZS1sZXNzIGJsdHMKICogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIERpcmVjdERyYXcKICoKICogUGFyYW1zOgogKiAgRGVzdFJlY3Q6IERlc3RpbmF0aW9uIHJlY3RhbmdsZSB0byB3cml0ZSB0bwogKiAgU3JjU3VyZmFjZTogU291cmNlIHN1cmZhY2UsIGNhbiBiZSBOVUxMCiAqICBTcmNSZWN0OiBTb3VyY2UgcmVjdGFuZ2xlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSFJFU1VMVCBXSU5BUEkKSVdpbmVHRElTdXJmYWNlSW1wbF9CbHQoSVdpbmVEM0RTdXJmYWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCAqRGVzdFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZSAqU3JjU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCAqU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIEREQkxURlggKkREQmx0RngpCnsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBpZmFjZTsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlNyYyA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIFNyY1N1cmZhY2U7CiAgICBSRUNUCQl4ZHN0LHhzcmM7CiAgICBIUkVTVUxUCQlyZXQgPSBERF9PSzsKICAgIFdJTkVEM0RMT0NLRURfUkVDVCAgZGxvY2ssIHNsb2NrOwogICAgV0lORUQzREZPUk1BVCAgICAgICBkZm10ID0gV0lORUQzREZNVF9VTktOT1dOLCBzZm10ID0gV0lORUQzREZNVF9VTktOT1dOOwogICAgaW50IGJwcCwgc3JjaGVpZ2h0LCBzcmN3aWR0aCwgZHN0aGVpZ2h0LCBkc3R3aWR0aCwgd2lkdGg7CiAgICBpbnQgeCwgeTsKICAgIExQQllURSBkYnVmLCBzYnVmOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcCwlbHgsJXApXG4iLCBUaGlzLCBEZXN0UmVjdCwgU3JjLCBTcmNSZWN0LCBGbGFncywgRERCbHRGeCk7CgogICAgaWYgKFRSQUNFX09OKGQzZF9zdXJmYWNlKSkKICAgIHsKICAgICAgICBpZiAoRGVzdFJlY3QpIFRSQUNFKCJcdGRlc3RyZWN0IDolbGR4JWxkLSVsZHglbGRcbiIsCiAgICAgICAgRGVzdFJlY3QtPmxlZnQsIERlc3RSZWN0LT50b3AsIERlc3RSZWN0LT5yaWdodCwgRGVzdFJlY3QtPmJvdHRvbSk7CiAgICAgICAgaWYgKFNyY1JlY3QpIFRSQUNFKCJcdHNyY3JlY3QgIDolbGR4JWxkLSVsZHglbGRcbiIsCiAgICAgICAgU3JjUmVjdC0+bGVmdCwgU3JjUmVjdC0+dG9wLCBTcmNSZWN0LT5yaWdodCwgU3JjUmVjdC0+Ym90dG9tKTsKI2lmIDAKICAgICAgICBUUkFDRSgiXHRmbGFnczogIik7CiAgICAgICAgRERSQVdfZHVtcF9EREJMVChGbGFncyk7CiAgICAgICAgaWYgKEZsYWdzICYgRERCTFRfRERGWCkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJcdGJsaXRmeDogIik7CiAgICAgICAgICAgIEREUkFXX2R1bXBfRERCTFRGWChEREJsdEZ4LT5kd0RERlgpOwogICAgICAgIH0KI2VuZGlmCiAgICB9CgogICAgaWYgKCAoVGhpcy0+RmxhZ3MgJiBTRkxBR19MT0NLRUQpIHx8ICgoU3JjICE9IE5VTEwpICYmIChTcmMtPkZsYWdzICYgU0ZMQUdfTE9DS0VEKSkpCiAgICB7CiAgICAgICAgV0FSTigiIFN1cmZhY2UgaXMgYnVzeSwgcmV0dXJuaW5nIERERVJSX1NVUkZBQ0VCVVNZXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfU1VSRkFDRUJVU1k7CiAgICB9CgogICAgaWYgKFNyYyA9PSBUaGlzKQogICAgewogICAgICAgIElXaW5lRDNEU3VyZmFjZV9Mb2NrUmVjdChpZmFjZSwgJmRsb2NrLCBOVUxMLCAwKTsKICAgICAgICBkZm10ID0gVGhpcy0+cmVzb3VyY2UuZm9ybWF0OwogICAgICAgIHNsb2NrID0gZGxvY2s7CiAgICAgICAgc2ZtdCA9IGRmbXQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKFNyYykKICAgICAgICB7CiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9Mb2NrUmVjdChTcmNTdXJmYWNlLCAmc2xvY2ssIE5VTEwsIEQzRExPQ0tfUkVBRE9OTFkpOwogICAgICAgICAgICBzZm10ID0gU3JjLT5yZXNvdXJjZS5mb3JtYXQ7CiAgICAgICAgfQogICAgICAgIGRmbXQgPSBUaGlzLT5yZXNvdXJjZS5mb3JtYXQ7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KGlmYWNlLCAmZGxvY2ssTlVMTCwwKTsKICAgIH0KCiAgICBpZiAoIUREQmx0RnggfHwgIShEREJsdEZ4LT5kd0RERlgpKSBGbGFncyAmPSB+RERCTFRfRERGWDsKCiAgICBpZiAoaXNGb3VyY2Moc2ZtdCkgJiYgaXNGb3VyY2MoZGZtdCkpCiAgICB7CiAgICAgICAgaWYgKHNmbXQgIT0gZGZtdCkKICAgICAgICB7CiAgICAgICAgICAgIEZJWE1FKCJGT1VSQ0MtPkZPVVJDQyBjb3B5IG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgc2FtZSB0eXBlIG9mIHN1cmZhY2VcbiIpOwogICAgICAgICAgICByZXQgPSBEREVSUl9JTlZBTElEUElYRUxGT1JNQVQ7CiAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICAgICB9CiAgICAgICAgVFJBQ0UoIkZvdXJjYy0+Rm91cmNjIGNvcHkpXG4iKTsKICAgICAgICBtZW1jcHkoZGxvY2sucEJpdHMsIHNsb2NrLnBCaXRzLCBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQgKiBkbG9jay5QaXRjaCk7CiAgICAgICAgZ290byByZWxlYXNlOwogICAgfQoKICAgIGlmIChpc0ZvdXJjYyhzZm10KSAmJgogICAgICAgICghaXNGb3VyY2MoZGZtdCkpKQogICAgewogICAgICAgIEZJWE1FKCJEWFRDIGRlY29tcHJlc3Npb24gbm90IHN1cHBvcnRlZCByaWdodCBub3dcbiIpOwogICAgICAgIGdvdG8gcmVsZWFzZTsKICAgIH0KCiAgICBpZiAoRGVzdFJlY3QpCiAgICB7CiAgICAgICAgbWVtY3B5KCZ4ZHN0LERlc3RSZWN0LHNpemVvZih4ZHN0KSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgeGRzdC50b3AJPSAwOwogICAgICAgIHhkc3QuYm90dG9tCT0gVGhpcy0+Y3VycmVudERlc2MuSGVpZ2h0OwogICAgICAgIHhkc3QubGVmdAk9IDA7CiAgICAgICAgeGRzdC5yaWdodAk9IFRoaXMtPmN1cnJlbnREZXNjLldpZHRoOwogICAgfQoKICAgIGlmIChTcmNSZWN0KQogICAgewogICAgICAgIG1lbWNweSgmeHNyYyxTcmNSZWN0LHNpemVvZih4c3JjKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKFNyYykKICAgICAgICB7CiAgICAgICAgICAgIHhzcmMudG9wCT0gMDsKICAgICAgICAgICAgeHNyYy5ib3R0b20JPSBTcmMtPmN1cnJlbnREZXNjLkhlaWdodDsKICAgICAgICAgICAgeHNyYy5sZWZ0CT0gMDsKICAgICAgICAgICAgeHNyYy5yaWdodAk9IFNyYy0+Y3VycmVudERlc2MuV2lkdGg7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIG1lbXNldCgmeHNyYywwLHNpemVvZih4c3JjKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEZpcnN0IGNoZWNrIGZvciB0aGUgdmFsaWRpdHkgb2Ygc291cmNlIC8gZGVzdGluYXRpb24gcmVjdGFuZ2xlcy4gVGhpcyB3YXMKICAgICAgdmVyaWZpZWQgdXNpbmcgYSB0ZXN0IGFwcGxpY2F0aW9uICsgYnkgTVNETi4KICAgICovCiAgICBpZiAoKFNyYyAhPSBOVUxMKSAmJgogICAgICAgICgoeHNyYy5ib3R0b20gPiBTcmMtPmN1cnJlbnREZXNjLkhlaWdodCkgfHwgKHhzcmMuYm90dG9tIDwgMCkgfHwKICAgICAgICAoeHNyYy50b3AgICAgID4gU3JjLT5jdXJyZW50RGVzYy5IZWlnaHQpIHx8ICh4c3JjLnRvcCAgICA8IDApIHx8CiAgICAgICAgKHhzcmMubGVmdCAgICA+IFNyYy0+Y3VycmVudERlc2MuV2lkdGgpICB8fCAoeHNyYy5sZWZ0ICAgPCAwKSB8fAogICAgICAgICh4c3JjLnJpZ2h0ICAgPiBTcmMtPmN1cnJlbnREZXNjLldpZHRoKSAgfHwgKHhzcmMucmlnaHQgIDwgMCkgfHwKICAgICAgICAoeHNyYy5yaWdodCAgIDwgeHNyYy5sZWZ0KSAgICAgICAgICAgICAgIHx8ICh4c3JjLmJvdHRvbSA8IHhzcmMudG9wKSkpCiAgICB7CiAgICAgICAgV0FSTigiQXBwbGljYXRpb24gZ2F2ZSB1cyBiYWQgc291cmNlIHJlY3RhbmdsZSBmb3IgQmx0LlxuIik7CiAgICAgICAgcmV0ID0gRERFUlJfSU5WQUxJRFJFQ1Q7CiAgICAgICAgZ290byByZWxlYXNlOwogICAgfQogICAgLyogRm9yIHRoZSBEZXN0aW5hdGlvbiByZWN0LCBpdCBjYW4gYmUgb3V0IG9mIGJvdW5kcyBvbiB0aGUgY29uZGl0aW9uIHRoYXQgYSBjbGlwcGVyCiAgICAgIGlzIHNldCBmb3IgdGhlIGdpdmVuIHN1cmZhY2UuCiAgICAqLwogICAgaWYgKCgvKlRoaXMtPmNsaXBwZXIgPT0gTlVMTCovIFRSVUUpICYmCiAgICAgICAgKCh4ZHN0LmJvdHRvbSAgPiBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQpIHx8ICh4ZHN0LmJvdHRvbSA8IDApIHx8CiAgICAgICAgKHhkc3QudG9wICAgICAgPiBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQpIHx8ICh4ZHN0LnRvcCAgICA8IDApIHx8CiAgICAgICAgKHhkc3QubGVmdCAgICAgPiBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aCkgIHx8ICh4ZHN0LmxlZnQgICA8IDApIHx8CiAgICAgICAgKHhkc3QucmlnaHQgICAgPiBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aCkgIHx8ICh4ZHN0LnJpZ2h0ICA8IDApIHx8CiAgICAgICAgKHhkc3QucmlnaHQgICAgPCB4ZHN0LmxlZnQpICAgICAgICAgICAgICAgIHx8ICh4ZHN0LmJvdHRvbSA8IHhkc3QudG9wKSkpCiAgICB7CiAgICAgICAgV0FSTigiQXBwbGljYXRpb24gZ2F2ZSB1cyBiYWQgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGZvciBCbHQgd2l0aG91dCBhIGNsaXBwZXIgc2V0LlxuIik7CiAgICAgICAgcmV0ID0gRERFUlJfSU5WQUxJRFJFQ1Q7CiAgICAgICAgZ290byByZWxlYXNlOwogICAgfQoKICAgIC8qIE5vdyBoYW5kbGUgbmVnYXRpdmUgdmFsdWVzIGluIHRoZSByZWN0YW5nbGVzLiBXYXJuaW5nOiBvbmx5IHN1cHBvcnRlZCBmb3Igbm93CiAgICAgIGluIHRoZSAnc2ltcGxlJyBjYXNlcyAoaWUgbm90IGluIGFueSBzdHJldGNoaW5nIC8gcm90YXRpb24gY2FzZXMpLgoKICAgICAgRmlyc3QsIHRoZSBjYXNlIHdoZXJlIG5vdGhpbmcgaXMgdG8gYmUgZG9uZS4KICAgICovCiAgICBpZiAoKCh4ZHN0LmJvdHRvbSA8PSAwKSB8fCAoeGRzdC5yaWdodCA8PSAwKSAgICAgICAgIHx8CiAgICAgICAgICh4ZHN0LnRvcCAgICA+PSAoaW50KSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQpIHx8CiAgICAgICAgICh4ZHN0LmxlZnQgICA+PSAoaW50KSBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aCkpIHx8CiAgICAgICAgKChTcmMgIT0gTlVMTCkgJiYKICAgICAgICAoKHhzcmMuYm90dG9tIDw9IDApIHx8ICh4c3JjLnJpZ2h0IDw9IDApICAgICB8fAogICAgICAgICAoeHNyYy50b3AgPj0gKGludCkgU3JjLT5jdXJyZW50RGVzYy5IZWlnaHQpIHx8CiAgICAgICAgICh4c3JjLmxlZnQgPj0gKGludCkgU3JjLT5jdXJyZW50RGVzYy5XaWR0aCkpICApKQogICAgewogICAgICAgIFRSQUNFKCJOb3RoaW5nIHRvIGJlIGRvbmUgIVxuIik7CiAgICAgICAgZ290byByZWxlYXNlOwogICAgfQoKICAgIC8qIFRoZSBlYXN5IGNhc2UgOiB0aGUgc291cmNlLWxlc3MgYmxpdHMuLi4uICovCiAgICBpZiAoU3JjID09IE5VTEwpCiAgICB7CiAgICAgICAgUkVDVCBmdWxsX3JlY3Q7CiAgICAgICAgUkVDVCB0ZW1wX3JlY3Q7IC8qIE5vIGlkZWEgaWYgaW50ZXJzZWN0IHJlY3QgY2FuIGJlIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgc291cmNlIHJlY3QgKi8KCiAgICAgICAgZnVsbF9yZWN0LmxlZnQgICA9IDA7CiAgICAgICAgZnVsbF9yZWN0LnRvcCAgICA9IDA7CiAgICAgICAgZnVsbF9yZWN0LnJpZ2h0ICA9IFRoaXMtPmN1cnJlbnREZXNjLldpZHRoOwogICAgICAgIGZ1bGxfcmVjdC5ib3R0b20gPSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQ7CiAgICAgICAgSW50ZXJzZWN0UmVjdCgmdGVtcF9yZWN0LCAmZnVsbF9yZWN0LCAmeGRzdCk7CiAgICAgICAgeGRzdCA9IHRlbXBfcmVjdDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBPbmx5IGhhbmRsZSBjbGlwcGluZyBvbiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlICovCiAgICAgICAgaW50IGNsaXBfaG9yaXogPSAoeGRzdC5sZWZ0IDwgMCkgfHwgKHhkc3QucmlnaHQgID4gKGludCkgVGhpcy0+Y3VycmVudERlc2MuV2lkdGggKTsKICAgICAgICBpbnQgY2xpcF92ZXJ0ICA9ICh4ZHN0LnRvcCAgPCAwKSB8fCAoeGRzdC5ib3R0b20gPiAoaW50KSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQpOwogICAgICAgIGlmIChjbGlwX3ZlcnQgfHwgY2xpcF9ob3JpeikKICAgICAgICB7CiAgICAgICAgICAgIC8qIE5vdyBjaGVjayBpZiB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9yIG5vdC4uLiAqLwogICAgICAgICAgICBpZiAoKCgoeGRzdC5ib3R0b20gLSB4ZHN0LnRvcCApICE9ICh4c3JjLmJvdHRvbSAtIHhzcmMudG9wICkpICYmIGNsaXBfdmVydCApIHx8CiAgICAgICAgICAgICAgICAoKCh4ZHN0LnJpZ2h0ICAtIHhkc3QubGVmdCkgIT0gKHhzcmMucmlnaHQgIC0geHNyYy5sZWZ0KSkgJiYgY2xpcF9ob3JpeikgfHwKICAgICAgICAgICAgICAgIChGbGFncyAmIEREQkxUX0RERlgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBXQVJOKCJPdXQgb2Ygc2NyZWVuIHJlY3RhbmdsZSBpbiBzcGVjaWFsIGNhc2UuIE5vdCBoYW5kbGVkIHJpZ2h0IG5vdy5cbiIpOwogICAgICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoY2xpcF9ob3JpeikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHhkc3QubGVmdCA8IDApIHsgeHNyYy5sZWZ0IC09IHhkc3QubGVmdDsgeGRzdC5sZWZ0ID0gMDsgfQogICAgICAgICAgICAgICAgaWYgKHhkc3QucmlnaHQgPiBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB4c3JjLnJpZ2h0IC09ICh4ZHN0LnJpZ2h0IC0gKGludCkgVGhpcy0+Y3VycmVudERlc2MuV2lkdGgpOwogICAgICAgICAgICAgICAgICAgIHhkc3QucmlnaHQgPSAoaW50KSBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xpcF92ZXJ0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoeGRzdC50b3AgPCAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHhzcmMudG9wIC09IHhkc3QudG9wOwogICAgICAgICAgICAgICAgICAgIHhkc3QudG9wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh4ZHN0LmJvdHRvbSA+IFRoaXMtPmN1cnJlbnREZXNjLkhlaWdodCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB4c3JjLmJvdHRvbSAtPSAoeGRzdC5ib3R0b20gLSAoaW50KSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHhkc3QuYm90dG9tID0gKGludCkgVGhpcy0+Y3VycmVudERlc2MuSGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEFuZCBjaGVjayBpZiBhZnRlciBjbGlwcGluZyBzb21ldGhpbmcgaXMgc3RpbGwgdG8gYmUgZG9uZS4uLiAqLwogICAgICAgICAgICBpZiAoKHhkc3QuYm90dG9tIDw9IDApICAgfHwgKHhkc3QucmlnaHQgPD0gMCkgICAgICAgfHwKICAgICAgICAgICAgICAgICh4ZHN0LnRvcCAgID49IChpbnQpIFRoaXMtPmN1cnJlbnREZXNjLkhlaWdodCkgIHx8CiAgICAgICAgICAgICAgICAoeGRzdC5sZWZ0ICA+PSAoaW50KSBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aCkgICB8fAogICAgICAgICAgICAgICAgKHhzcmMuYm90dG9tIDw9IDApICAgfHwgKHhzcmMucmlnaHQgPD0gMCkgICAgICAgfHwKICAgICAgICAgICAgICAgICh4c3JjLnRvcCA+PSAoaW50KSBTcmMtPmN1cnJlbnREZXNjLkhlaWdodCkgICAgIHx8CiAgICAgICAgICAgICAgICAoeHNyYy5sZWZ0ID49IChpbnQpIFNyYy0+Y3VycmVudERlc2MuV2lkdGgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiTm90aGluZyB0byBiZSBkb25lIGFmdGVyIGNsaXBwaW5nICFcbiIpOwogICAgICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGJwcCA9IFRoaXMtPmJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNoZWlnaHQgPSB4c3JjLmJvdHRvbSAtIHhzcmMudG9wOwogICAgc3Jjd2lkdGggPSB4c3JjLnJpZ2h0IC0geHNyYy5sZWZ0OwogICAgZHN0aGVpZ2h0ID0geGRzdC5ib3R0b20gLSB4ZHN0LnRvcDsKICAgIGRzdHdpZHRoID0geGRzdC5yaWdodCAtIHhkc3QubGVmdDsKICAgIHdpZHRoID0gKHhkc3QucmlnaHQgLSB4ZHN0LmxlZnQpICogYnBwOwoKICAgIGFzc2VydCh3aWR0aCA8PSBkbG9jay5QaXRjaCk7CgogICAgZGJ1ZiA9IChCWVRFKilkbG9jay5wQml0cysoeGRzdC50b3AqZGxvY2suUGl0Y2gpKyh4ZHN0LmxlZnQqYnBwKTsKCiAgICBpZiAoRmxhZ3MgJiBEREJMVF9XQUlUKQogICAgewogICAgICAgIHN0YXRpYyBCT09MIGRpc3BsYXllZCA9IEZBTFNFOwogICAgICAgIGlmICghZGlzcGxheWVkKQogICAgICAgICAgICBGSVhNRSgiQ2FuJ3QgaGFuZGxlIEREQkxUX1dBSVQgZmxhZyByaWdodCBub3cuXG4iKTsKICAgICAgICBkaXNwbGF5ZWQgPSBUUlVFOwogICAgICAgIEZsYWdzICY9IH5EREJMVF9XQUlUOwogICAgfQogICAgaWYgKEZsYWdzICYgRERCTFRfQVNZTkMpCiAgICB7CiAgICAgICAgc3RhdGljIEJPT0wgZGlzcGxheWVkID0gRkFMU0U7CiAgICAgICAgaWYgKCFkaXNwbGF5ZWQpCiAgICAgICAgICAgIEZJWE1FKCJDYW4ndCBoYW5kbGUgRERCTFRfQVNZTkMgZmxhZyByaWdodCBub3cuXG4iKTsKICAgICAgICBkaXNwbGF5ZWQgPSBUUlVFOwogICAgICAgIEZsYWdzICY9IH5EREJMVF9BU1lOQzsKICAgIH0KICAgIGlmIChGbGFncyAmIEREQkxUX0RPTk9UV0FJVCkKICAgIHsKICAgICAgICAvKiBEREJMVF9ET05PVFdBSVQgYXBwZWFyZWQgaW4gRFg3ICovCiAgICAgICAgc3RhdGljIEJPT0wgZGlzcGxheWVkID0gRkFMU0U7CiAgICAgICAgaWYgKCFkaXNwbGF5ZWQpCiAgICAgICAgICAgIEZJWE1FKCJDYW4ndCBoYW5kbGUgRERCTFRfRE9OT1RXQUlUIGZsYWcgcmlnaHQgbm93LlxuIik7CiAgICAgICAgZGlzcGxheWVkID0gVFJVRTsKICAgICAgICBGbGFncyAmPSB+RERCTFRfRE9OT1RXQUlUOwogICAgfQoKICAgIC8qIEZpcnN0LCBhbGwgdGhlICdzb3VyY2UtbGVzcycgYmxpdHMgKi8KICAgIGlmIChGbGFncyAmIEREQkxUX0NPTE9SRklMTCkKICAgIHsKICAgICAgICByZXQgPSBfQmx0X0NvbG9yRmlsbChkYnVmLCBkc3R3aWR0aCwgZHN0aGVpZ2h0LCBicHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbG9jay5QaXRjaCwgRERCbHRGeC0+dTUuZHdGaWxsQ29sb3IpOwogICAgICAgIEZsYWdzICY9IH5EREJMVF9DT0xPUkZJTEw7CiAgICB9CgogICAgaWYgKEZsYWdzICYgRERCTFRfREVQVEhGSUxMKQogICAgewogICAgICAgIEZJWE1FKCJEREJMVF9ERVBUSEZJTEwgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQhXG4iKTsKICAgIH0KICAgIGlmIChGbGFncyAmIEREQkxUX1JPUCkKICAgIHsKICAgICAgICAvKiBDYXRjaCBzb21lIGRlZ2VuZXJhdGUgY2FzZXMgaGVyZSAqLwogICAgICAgIHN3aXRjaChEREJsdEZ4LT5kd1JPUCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgQkxBQ0tORVNTOgogICAgICAgICAgICAgICAgcmV0ID0gX0JsdF9Db2xvckZpbGwoZGJ1Zixkc3R3aWR0aCxkc3RoZWlnaHQsYnBwLGRsb2NrLlBpdGNoLDApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHhBQTAwMjk6IC8qIE5vLW9wICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSElURU5FU1M6CiAgICAgICAgICAgICAgICByZXQgPSBfQmx0X0NvbG9yRmlsbChkYnVmLGRzdHdpZHRoLGRzdGhlaWdodCxicHAsZGxvY2suUGl0Y2gsfjApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgU1JDQ09QWTogLyogd2VsbCwgd2UgZG8gdGhhdCBiZWxvdyA/ICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEZJWE1FKCJVbnN1cHBvcnRlZCByYXN0ZXIgb3A6ICUwOGx4ICBQYXR0ZXJuOiAlcFxuIiwgRERCbHRGeC0+ZHdST1AsIEREQmx0RngtPnU1LmxwRERTUGF0dGVybik7CiAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KICAgICAgICBGbGFncyAmPSB+RERCTFRfUk9QOwogICAgfQogICAgaWYgKEZsYWdzICYgRERCTFRfRERST1BTKQogICAgewogICAgICAgIEZJWE1FKCJcdERkcmF3IFJhc3RlciBPcHM6ICUwOGx4ICBQYXR0ZXJuOiAlcFxuIiwgRERCbHRGeC0+ZHdERFJPUCwgRERCbHRGeC0+dTUubHBERFNQYXR0ZXJuKTsKICAgIH0KICAgIC8qIE5vdyB0aGUgJ3dpdGggc291cmNlJyBibGl0cyAqLwogICAgaWYgKFNyYykKICAgIHsKICAgICAgICBMUEJZVEUgc2Jhc2U7CiAgICAgICAgaW50IHN4LCB4aW5jLCBzeSwgeWluYzsKCiAgICAgICAgaWYgKCFkc3R3aWR0aCB8fCAhZHN0aGVpZ2h0KSAvKiBobW0uLi4gc3R1cGlkIHByb2dyYW0gPyAqLwogICAgICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgICAgc2Jhc2UgPSAoQllURSopc2xvY2sucEJpdHMrKHhzcmMudG9wKnNsb2NrLlBpdGNoKSt4c3JjLmxlZnQqYnBwOwogICAgICAgIHhpbmMgPSAoc3Jjd2lkdGggPDwgMTYpIC8gZHN0d2lkdGg7CiAgICAgICAgeWluYyA9IChzcmNoZWlnaHQgPDwgMTYpIC8gZHN0aGVpZ2h0OwoKICAgICAgICBpZiAoIUZsYWdzKQogICAgICAgIHsKICAgICAgICAgICAgLyogTm8gZWZmZWN0cywgd2UgY2FuIGNoZWF0IGhlcmUgKi8KICAgICAgICAgICAgaWYgKGRzdHdpZHRoID09IHNyY3dpZHRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZHN0aGVpZ2h0ID09IHNyY2hlaWdodCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAvKiBObyBzdHJldGNoaW5nIGluIGVpdGhlciBkaXJlY3Rpb24uIFRoaXMgbmVlZHMgdG8gYmUgYXMKICAgICAgICAgICAgICAgICAgICAqIGZhc3QgYXMgcG9zc2libGUgKi8KICAgICAgICAgICAgICAgICAgICBzYnVmID0gc2Jhc2U7CgogICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBvdmVybGFwcGluZyBzdXJmYWNlcyAqLwogICAgICAgICAgICAgICAgICAgIGlmIChTcmNTdXJmYWNlICE9IGlmYWNlIHx8IHhkc3QudG9wIDwgeHNyYy50b3AgfHwKICAgICAgICAgICAgICAgICAgICAgICAgeGRzdC5yaWdodCA8PSB4c3JjLmxlZnQgfHwgeHNyYy5yaWdodCA8PSB4ZHN0LmxlZnQpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBvdmVybGFwLCBvciBkc3QgYWJvdmUgc3JjLCBzbyBjb3B5IGZyb20gdG9wIGRvd253YXJkcyAqLwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkYnVmLCBzYnVmLCB3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnVmICs9IHNsb2NrLlBpdGNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJ1ZiArPSBkbG9jay5QaXRjaDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4ZHN0LnRvcCA+IHhzcmMudG9wKSAgLyogY29weSBmcm9tIGJvdHRvbSB1cHdhcmRzICovCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzYnVmICs9IChzbG9jay5QaXRjaCpkc3RoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBkYnVmICs9IChkbG9jay5QaXRjaCpkc3RoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNidWYgLT0gc2xvY2suUGl0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVmIC09IGRsb2NrLlBpdGNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRidWYsIHNidWYsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIHNyYyBhbmQgZHN0IG92ZXJsYXBwaW5nIG9uIHRoZSBzYW1lIGxpbmUsIHVzZSBtZW1tb3ZlICovCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZGJ1Ziwgc2J1Ziwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2J1ZiArPSBzbG9jay5QaXRjaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRidWYgKz0gZGxvY2suUGl0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIFN0cmV0Y2hpbmcgaW4gWSBkaXJlY3Rpb24gb25seSAqLwogICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IHN5ID0gMDsgeSA8IGRzdGhlaWdodDsgeSsrLCBzeSArPSB5aW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNidWYgPSBzYmFzZSArIChzeSA+PiAxNikgKiBzbG9jay5QaXRjaDsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRidWYsIHNidWYsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGJ1ZiArPSBkbG9jay5QaXRjaDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBTdHJldGNoaW5nIGluIFggZGlyZWN0aW9uICovCiAgICAgICAgICAgICAgICBpbnQgbGFzdF9zeSA9IC0xOwogICAgICAgICAgICAgICAgZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2J1ZiA9IHNiYXNlICsgKHN5ID4+IDE2KSAqIHNsb2NrLlBpdGNoOwoKICAgICAgICAgICAgICAgICAgICBpZiAoKHN5ID4+IDE2KSA9PSAobGFzdF9zeSA+PiAxNikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIHNvdXJjZXJvdyBpcyB0aGUgc2FtZSBhcyBsYXN0IHNvdXJjZXJvdyAtCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvcHkgYWxyZWFkeSBzdHJldGNoZWQgcm93CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZGJ1ZiwgZGJ1ZiAtIGRsb2NrLlBpdGNoLCB3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiNkZWZpbmUgU1RSRVRDSF9ST1codHlwZSkgeyBcCiAgICAgICAgICAgICAgICAgICAgdHlwZSAqcyA9ICh0eXBlICopIHNidWYsICpkID0gKHR5cGUgKikgZGJ1ZjsgXAogICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IHN4ID0gMDsgeCA8IGRzdHdpZHRoOyB4KyssIHN4ICs9IHhpbmMpIFwKICAgICAgICAgICAgICAgICAgICBkW3hdID0gc1tzeCA+PiAxNl07IFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgfQoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYnBwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBTVFJFVENIX1JPVyhCWVRFKQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IFNUUkVUQ0hfUk9XKFdPUkQpCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogU1RSRVRDSF9ST1coRFdPUkQpCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBCWVRFIHMsZCA9IGRidWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSBzeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBzeCs9IHhpbmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgcGl4ZWw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzYnVmKzMqKHN4Pj4xNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBzWzBdfChzWzFdPDw4KXwoc1syXTw8MTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSAocGl4ZWwgICAgKSYweGZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbMV0gPSAocGl4ZWw+PiA4KSYweGZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbMl0gPSAocGl4ZWw+PjE2KSYweGZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgRklYTUUoIlN0cmV0Y2hlZCBibGl0IG5vdCBpbXBsZW1lbnRlZCBmb3IgYnBwICVkIVxuIiwgYnBwKjgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBEREVSUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICB9CiN1bmRlZiBTVFJFVENIX1JPVwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYnVmICs9IGRsb2NrLlBpdGNoOwogICAgICAgICAgICAgICAgICAgIGxhc3Rfc3kgPSBzeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgTE9ORyBkc3R5aW5jID0gZGxvY2suUGl0Y2gsIGRzdHhpbmMgPSBicHA7CiAgICAgICAgICBEV09SRCBrZXlsb3cgPSAweEZGRkZGRkZGLCBrZXloaWdoID0gMCwga2V5bWFzayA9IDB4RkZGRkZGRkY7CiAgICAgICAgICBpZiAoRmxhZ3MgJiAoRERCTFRfS0VZU1JDIHwgRERCTFRfS0VZREVTVCB8IEREQkxUX0tFWVNSQ09WRVJSSURFIHwgRERCTFRfS0VZREVTVE9WRVJSSURFKSkKICAgICAgICAgIHsKCiAgICAgICAgICAgICAgaWYgKEZsYWdzICYgRERCTFRfS0VZU1JDKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleWxvdyAgPSBTcmMtPlNyY0JsdENLZXkuZHdDb2xvclNwYWNlTG93VmFsdWU7CiAgICAgICAgICAgICAgICBrZXloaWdoID0gU3JjLT5TcmNCbHRDS2V5LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSBpZiAoRmxhZ3MgJiBEREJMVF9LRVlERVNUKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleWxvdyAgPSBUaGlzLT5EZXN0Qmx0Q0tleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKICAgICAgICAgICAgICAgIGtleWhpZ2ggPSBUaGlzLT5EZXN0Qmx0Q0tleS5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgaWYgKEZsYWdzICYgRERCTFRfS0VZU1JDT1ZFUlJJREUpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5bG93ICA9IEREQmx0RngtPmRkY2tTcmNDb2xvcmtleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKICAgICAgICAgICAgICAgIGtleWhpZ2ggPSBEREJsdEZ4LT5kZGNrU3JjQ29sb3JrZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5bG93ICA9IEREQmx0RngtPmRkY2tEZXN0Q29sb3JrZXkuZHdDb2xvclNwYWNlTG93VmFsdWU7CiAgICAgICAgICAgICAgICBrZXloaWdoID0gRERCbHRGeC0+ZGRja0Rlc3RDb2xvcmtleS5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmKGJwcCA9PSAxKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAga2V5bWFzayA9IDB4ZmY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGtleW1hc2sgPSBnZXRfYml0bWFza19yZWQoU3JjLT5yZXNvdXJjZS5mb3JtYXQpICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdG1hc2tfZ3JlZW4oU3JjLT5yZXNvdXJjZS5mb3JtYXQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRtYXNrX2JsdWUoU3JjLT5yZXNvdXJjZS5mb3JtYXQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBGbGFncyAmPSB+KEREQkxUX0tFWVNSQyB8IEREQkxUX0tFWURFU1QgfCBEREJMVF9LRVlTUkNPVkVSUklERSB8IEREQkxUX0tFWURFU1RPVkVSUklERSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKEZsYWdzICYgRERCTFRfRERGWCkKICAgICAgICAgIHsKICAgICAgICAgICAgICBMUEJZVEUgZFRvcExlZnQsIGRUb3BSaWdodCwgZEJvdHRvbUxlZnQsIGRCb3R0b21SaWdodCwgdG1wOwogICAgICAgICAgICAgIExPTkcgdG1weHk7CiAgICAgICAgICAgICAgZFRvcExlZnQgICAgID0gZGJ1ZjsKICAgICAgICAgICAgICBkVG9wUmlnaHQgICAgPSBkYnVmKygoZHN0d2lkdGgtMSkqYnBwKTsKICAgICAgICAgICAgICBkQm90dG9tTGVmdCAgPSBkVG9wTGVmdCsoKGRzdGhlaWdodC0xKSpkbG9jay5QaXRjaCk7CiAgICAgICAgICAgICAgZEJvdHRvbVJpZ2h0ID0gZEJvdHRvbUxlZnQrKChkc3R3aWR0aC0xKSpicHApOwoKICAgICAgICAgICAgICBpZiAoRERCbHRGeC0+ZHdEREZYICYgRERCTFRGWF9BUklUSFNUUkVUQ0hZKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGlzIGZsYWcgKi8KICAgICAgICAgICAgICAgIFdBUk4oIkZsYWdzPUREQkxUX0RERlggbm90aGluZyBkb25lIGZvciBEREJMVEZYX0FSSVRIU1RSRVRDSFlcbiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoRERCbHRGeC0+ZHdEREZYICYgRERCTFRGWF9NSVJST1JMRUZUUklHSFQpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG1wICAgICAgICAgID0gZFRvcFJpZ2h0OwogICAgICAgICAgICAgICAgZFRvcFJpZ2h0ICAgID0gZFRvcExlZnQ7CiAgICAgICAgICAgICAgICBkVG9wTGVmdCAgICAgPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBkQm90dG9tUmlnaHQ7CiAgICAgICAgICAgICAgICBkQm90dG9tUmlnaHQgPSBkQm90dG9tTGVmdDsKICAgICAgICAgICAgICAgIGRCb3R0b21MZWZ0ICA9IHRtcDsKICAgICAgICAgICAgICAgIGRzdHhpbmMgPSBkc3R4aW5jICotMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKEREQmx0RngtPmR3RERGWCAmIEREQkxURlhfTUlSUk9SVVBET1dOKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRtcCAgICAgICAgICA9IGRUb3BMZWZ0OwogICAgICAgICAgICAgICAgZFRvcExlZnQgICAgID0gZEJvdHRvbUxlZnQ7CiAgICAgICAgICAgICAgICBkQm90dG9tTGVmdCAgPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBkVG9wUmlnaHQ7CiAgICAgICAgICAgICAgICBkVG9wUmlnaHQgICAgPSBkQm90dG9tUmlnaHQ7CiAgICAgICAgICAgICAgICBkQm90dG9tUmlnaHQgPSB0bXA7CiAgICAgICAgICAgICAgICBkc3R5aW5jID0gZHN0eWluYyAqLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChEREJsdEZ4LT5kd0RERlggJiBEREJMVEZYX05PVEVBUklORykKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgYWJvdXQgdGhpcyBmbGFnICovCiAgICAgICAgICAgICAgICBXQVJOKCJGbGFncz1EREJMVF9EREZYIG5vdGhpbmcgZG9uZSBmb3IgRERCTFRGWF9OT1RFQVJJTkdcbiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoRERCbHRGeC0+ZHdEREZYICYgRERCTFRGWF9ST1RBVEUxODApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG1wICAgICAgICAgID0gZEJvdHRvbVJpZ2h0OwogICAgICAgICAgICAgICAgZEJvdHRvbVJpZ2h0ID0gZFRvcExlZnQ7CiAgICAgICAgICAgICAgICBkVG9wTGVmdCAgICAgPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBkQm90dG9tTGVmdDsKICAgICAgICAgICAgICAgIGRCb3R0b21MZWZ0ICA9IGRUb3BSaWdodDsKICAgICAgICAgICAgICAgIGRUb3BSaWdodCAgICA9IHRtcDsKICAgICAgICAgICAgICAgIGRzdHhpbmMgPSBkc3R4aW5jICogLTE7CiAgICAgICAgICAgICAgICBkc3R5aW5jID0gZHN0eWluYyAqIC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoRERCbHRGeC0+ZHdEREZYICYgRERCTFRGWF9ST1RBVEUyNzApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG1wICAgICAgICAgID0gZFRvcExlZnQ7CiAgICAgICAgICAgICAgICBkVG9wTGVmdCAgICAgPSBkQm90dG9tTGVmdDsKICAgICAgICAgICAgICAgIGRCb3R0b21MZWZ0ICA9IGRCb3R0b21SaWdodDsKICAgICAgICAgICAgICAgIGRCb3R0b21SaWdodCA9IGRUb3BSaWdodDsKICAgICAgICAgICAgICAgIGRUb3BSaWdodCAgICA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcHh5ICAgPSBkc3R4aW5jOwogICAgICAgICAgICAgICAgZHN0eGluYyA9IGRzdHlpbmM7CiAgICAgICAgICAgICAgICBkc3R5aW5jID0gdG1weHk7CiAgICAgICAgICAgICAgICBkc3R4aW5jID0gZHN0eGluYyAqIC0xOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoRERCbHRGeC0+ZHdEREZYICYgRERCTFRGWF9ST1RBVEU5MCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBkVG9wTGVmdDsKICAgICAgICAgICAgICAgIGRUb3BMZWZ0ICAgICA9IGRUb3BSaWdodDsKICAgICAgICAgICAgICAgIGRUb3BSaWdodCAgICA9IGRCb3R0b21SaWdodDsKICAgICAgICAgICAgICAgIGRCb3R0b21SaWdodCA9IGRCb3R0b21MZWZ0OwogICAgICAgICAgICAgICAgZEJvdHRvbUxlZnQgID0gdG1wOwogICAgICAgICAgICAgICAgdG1weHkgICA9IGRzdHhpbmM7CiAgICAgICAgICAgICAgICBkc3R4aW5jID0gZHN0eWluYzsKICAgICAgICAgICAgICAgIGRzdHlpbmMgPSB0bXB4eTsKICAgICAgICAgICAgICAgIGRzdHlpbmMgPSBkc3R5aW5jICogLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChEREJsdEZ4LT5kd0RERlggJiBEREJMVEZYX1pCVUZGRVJCQVNFREVTVCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgYWJvdXQgdGhpcyBmbGFnICovCiAgICAgICAgICAgICAgICBXQVJOKCJGbGFncz1EREJMVF9EREZYIG5vdGhpbmcgZG9uZSBmb3IgRERCTFRGWF9aQlVGRkVSQkFTRURFU1RcbiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkYnVmID0gZFRvcExlZnQ7CiAgICAgICAgICAgICAgRmxhZ3MgJj0gfihEREJMVF9EREZYKTsKICAgICAgICAgIH0KCiNkZWZpbmUgQ09QWV9DT0xPUktFWV9GWCh0eXBlKSB7IFwKICAgICAgICAgICAgdHlwZSAqcywgKmQgPSAodHlwZSAqKSBkYnVmLCAqZHgsIHRtcDsgXAogICAgICAgICAgICBmb3IgKHkgPSBzeSA9IDA7IHkgPCBkc3RoZWlnaHQ7IHkrKywgc3kgKz0geWluYykgeyBcCiAgICAgICAgICAgICAgcyA9ICh0eXBlKikoc2Jhc2UgKyAoc3kgPj4gMTYpICogc2xvY2suUGl0Y2gpOyBcCiAgICAgICAgICAgICAgZHggPSBkOyBcCiAgICAgICAgICAgICAgZm9yICh4ID0gc3ggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgc3ggKz0geGluYykgeyBcCiAgICAgICAgICAgICAgICAgIHRtcCA9IHNbc3ggPj4gMTZdOyBcCiAgICAgICAgICAgICAgICAgIGlmICgodG1wICYga2V5bWFzaykgPCBrZXlsb3cgfHwgKHRtcCAmIGtleW1hc2spID4ga2V5aGlnaCkgZHhbMF0gPSB0bXA7IFwKICAgICAgICAgICAgICAgICAgZHggPSAodHlwZSopKCgoTFBCWVRFKWR4KStkc3R4aW5jKTsgXAogICAgICAgICAgICAgIH0gXAogICAgICAgICAgICAgIGQgPSAodHlwZSopKCgoTFBCWVRFKWQpK2RzdHlpbmMpOyBcCiAgICAgICAgICAgIH0gXAogICAgICAgICAgICBicmVhazsgfQoKICAgICAgICAgICAgc3dpdGNoIChicHApIHsKICAgICAgICAgICAgY2FzZSAxOiBDT1BZX0NPTE9SS0VZX0ZYKEJZVEUpCiAgICAgICAgICAgIGNhc2UgMjogQ09QWV9DT0xPUktFWV9GWChXT1JEKQogICAgICAgICAgICBjYXNlIDQ6IENPUFlfQ09MT1JLRVlfRlgoRFdPUkQpCiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTFBCWVRFIHMsZCA9IGRidWYsIGR4OwogICAgICAgICAgICAgICAgZm9yICh5ID0gc3kgPSAwOyB5IDwgZHN0aGVpZ2h0OyB5KyssIHN5ICs9IHlpbmMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2J1ZiA9IHNiYXNlICsgKHN5ID4+IDE2KSAqIHNsb2NrLlBpdGNoOwogICAgICAgICAgICAgICAgICAgIGR4ID0gZDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSBzeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBzeCs9IHhpbmMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBwaXhlbDsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHNidWYrMyooc3g+PjE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBzWzBdfChzWzFdPDw4KXwoc1syXTw8MTYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBpeGVsICYga2V5bWFzaykgPCBrZXlsb3cgfHwgKHBpeGVsICYga2V5bWFzaykgPiBrZXloaWdoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeFswXSA9IChwaXhlbCAgICApJjB4ZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeFsxXSA9IChwaXhlbD4+IDgpJjB4ZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeFsyXSA9IChwaXhlbD4+MTYpJjB4ZmY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZHgrPSBkc3R4aW5jOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkICs9IGRzdHlpbmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIEZJWE1FKCIlcyBjb2xvci1rZXllZCBibGl0IG5vdCBpbXBsZW1lbnRlZCBmb3IgYnBwICVkIVxuIiwKICAgICAgICAgICAgICAgICAgKEZsYWdzICYgRERCTFRfS0VZU1JDKSA/ICJTb3VyY2UiIDogIkRlc3RpbmF0aW9uIiwgYnBwKjgpOwogICAgICAgICAgICAgICAgICByZXQgPSBEREVSUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKI3VuZGVmIENPUFlfQ09MT1JLRVlfRlgKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCmVycm9yOgogICAgaWYgKEZsYWdzICYmIEZJWE1FX09OKGQzZF9zdXJmYWNlKSkKICAgIHsKICAgICAgICBGSVhNRSgiXHRVbnN1cHBvcnRlZCBmbGFnczogJTA4bHgiLCBGbGFncyk7CiAgICB9CgpyZWxlYXNlOgogICAgSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3QoaWZhY2UpOwogICAgaWYgKFNyY1N1cmZhY2UgJiYgU3JjU3VyZmFjZSAhPSBpZmFjZSkgSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3QoU3JjU3VyZmFjZSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0RTdXJmYWNlOjpCbHRGYXN0LCBHREkgdmVyc2lvbgogKgogKiBUaGlzIGlzIHRoZSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiBvZiBCbHRGYXN0LCBhcyB1c2VkIGJ5IEdESSBzdXJmYWNlcwogKiBhbmQgYXMgYSBmYWxsYmFjayBmb3IgT3BlbkdMIHN1cmZhY2VzLiBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSB0aGUgb2xkCiAqIERpcmVjdERyYXcgY29kZSwgYW5kIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgVHJhbnNHYW1pbmcuCiAqCiAqIFBhcmFtczoKICogIGRzdHg6CiAqICBkc3R5OgogKiAgU291cmNlOiBTb3VyY2Ugc3VyZmFjZSB0byBjb3B5IGZyb20KICogIHJzcmM6IFNvdXJjZSByZWN0YW5nbGUKICogIHRyYW5zOiBTb21lIEZsYWdzCiAqCiAqIFJldHVybnM6CiAqICBXSU5FRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIUkVTVUxUIFdJTkFQSQpJV2luZUdESVN1cmZhY2VJbXBsX0JsdEZhc3QoSVdpbmVEM0RTdXJmYWNlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRzdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkc3R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlICpTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUICpyc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgdHJhbnMpCnsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBpZmFjZTsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlNyYyA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIFNvdXJjZTsKCiAgICBpbnQgICAgICAgICAgICAgICAgIGJwcCwgdywgaCwgeCwgeTsKICAgIFdJTkVEM0RMT0NLRURfUkVDVCAgZGxvY2ssc2xvY2s7CiAgICBIUkVTVUxUICAgICAgICAgICAgIHJldCA9IEREX09LOwogICAgUkVDVCAgICAgICAgICAgICAgICByc3JjMjsKICAgIFJFQ1QgICAgICAgICAgICAgICAgbG9ja19zcmMsIGxvY2tfZHN0LCBsb2NrX3VuaW9uOwogICAgQllURSAgICAgICAgICAgICAgICAqc2J1ZiwgKmRidWY7CgogICAgaWYgKFRSQUNFX09OKGQzZF9zdXJmYWNlKSkKICAgIHsKICAgICAgICBUUkFDRSgiKCVwKS0+KCVsZCwlbGQsJXAsJXAsJTA4bHgpXG4iLCBUaGlzLGRzdHgsZHN0eSxTcmMscnNyYyx0cmFucyk7CgogICAgICAgIGlmIChyc3JjKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoIlx0c3JjcmVjdDogJWxkeCVsZC0lbGR4JWxkXG4iLHJzcmMtPmxlZnQscnNyYy0+dG9wLAogICAgICAgICAgICAgICAgICByc3JjLT5yaWdodCxyc3JjLT5ib3R0b20pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiIHNyY3JlY3Q6IE5VTExcbiIpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoKFRoaXMtPkZsYWdzICYgU0ZMQUdfTE9DS0VEKSB8fAogICAgICAgICgoU3JjICE9IE5VTEwpICYmIChTcmMtPkZsYWdzICYgU0ZMQUdfTE9DS0VEKSkpCiAgICB7CiAgICAgICAgV0FSTigiIFN1cmZhY2UgaXMgYnVzeSwgcmV0dXJuaW5nIERERVJSX1NVUkZBQ0VCVVNZXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfU1VSRkFDRUJVU1k7CiAgICB9CgogICAgaWYgKCFyc3JjKQogICAgewogICAgICAgIFdBUk4oInJzcmMgaXMgTlVMTCFcbiIpOwogICAgICAgIHJzcmMgPSAmcnNyYzI7CiAgICAgICAgcnNyYy0+bGVmdCA9IDA7CiAgICAgICAgcnNyYy0+dG9wID0gMDsKICAgICAgICByc3JjLT5yaWdodCA9IFNyYy0+Y3VycmVudERlc2MuV2lkdGg7CiAgICAgICAgcnNyYy0+Ym90dG9tID0gU3JjLT5jdXJyZW50RGVzYy5IZWlnaHQ7CiAgICB9CgogICAgLyogQ2hlY2sgc291cmNlIHJlY3QgZm9yIHZhbGlkaXR5LiBDb3BpZWQgZnJvbSBub3JtYWwgQmx0LiBGaXhlcyBCYWxkdXIncyBHYXRlLiovCiAgICBpZiAoKHJzcmMtPmJvdHRvbSA+IFNyYy0+Y3VycmVudERlc2MuSGVpZ2h0KSB8fCAocnNyYy0+Ym90dG9tIDwgMCkgfHwKICAgICAgICAocnNyYy0+dG9wICAgID4gU3JjLT5jdXJyZW50RGVzYy5IZWlnaHQpIHx8IChyc3JjLT50b3AgICAgPCAwKSB8fAogICAgICAgIChyc3JjLT5sZWZ0ICAgPiBTcmMtPmN1cnJlbnREZXNjLldpZHRoKSAgfHwgKHJzcmMtPmxlZnQgICA8IDApIHx8CiAgICAgICAgKHJzcmMtPnJpZ2h0ICA+IFNyYy0+Y3VycmVudERlc2MuV2lkdGgpICB8fCAocnNyYy0+cmlnaHQgIDwgMCkgfHwKICAgICAgICAocnNyYy0+cmlnaHQgIDwgcnNyYy0+bGVmdCkgICAgICAgICAgICAgIHx8IChyc3JjLT5ib3R0b20gPCByc3JjLT50b3ApKQogICAgewogICAgICAgIFdBUk4oIkFwcGxpY2F0aW9uIGdhdmUgdXMgYmFkIHNvdXJjZSByZWN0YW5nbGUgZm9yIEJsdEZhc3QuXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFJFQ1Q7CiAgICB9CgogICAgaCA9IHJzcmMtPmJvdHRvbSAtIHJzcmMtPnRvcDsKICAgIGlmIChoID4gVGhpcy0+Y3VycmVudERlc2MuSGVpZ2h0LWRzdHkpIGggPSBUaGlzLT5jdXJyZW50RGVzYy5IZWlnaHQtZHN0eTsKICAgIGlmIChoID4gU3JjLT5jdXJyZW50RGVzYy5IZWlnaHQtcnNyYy0+dG9wKSBoPVNyYy0+Y3VycmVudERlc2MuSGVpZ2h0LXJzcmMtPnRvcDsKICAgIGlmIChoIDw9IDApIHJldHVybiBEREVSUl9JTlZBTElEUkVDVDsKCiAgICB3ID0gcnNyYy0+cmlnaHQgLSByc3JjLT5sZWZ0OwogICAgaWYgKHcgPiBUaGlzLT5jdXJyZW50RGVzYy5XaWR0aC1kc3R4KSB3ID0gVGhpcy0+Y3VycmVudERlc2MuV2lkdGgtZHN0eDsKICAgIGlmICh3ID4gU3JjLT5jdXJyZW50RGVzYy5XaWR0aC1yc3JjLT5sZWZ0KSB3ID0gU3JjLT5jdXJyZW50RGVzYy5XaWR0aC1yc3JjLT5sZWZ0OwogICAgaWYgKHcgPD0gMCkgcmV0dXJuIERERVJSX0lOVkFMSURSRUNUOwoKICAgIC8qIE5vdyBjb21wdXRlIHRoZSBsb2NraW5nIHJlY3RhbmdsZS4uLiAqLwogICAgbG9ja19zcmMubGVmdCA9IHJzcmMtPmxlZnQ7CiAgICBsb2NrX3NyYy50b3AgPSByc3JjLT50b3A7CiAgICBsb2NrX3NyYy5yaWdodCA9IGxvY2tfc3JjLmxlZnQgKyB3OwogICAgbG9ja19zcmMuYm90dG9tID0gbG9ja19zcmMudG9wICsgaDsKCiAgICBsb2NrX2RzdC5sZWZ0ID0gZHN0eDsKICAgIGxvY2tfZHN0LnRvcCA9IGRzdHk7CiAgICBsb2NrX2RzdC5yaWdodCA9IGRzdHggKyB3OwogICAgbG9ja19kc3QuYm90dG9tID0gZHN0eSArIGg7CgogICAgYnBwID0gVGhpcy0+Ynl0ZXNQZXJQaXhlbDsKCiAgICAvKiBXZSBuZWVkIHRvIGxvY2sgdGhlIHN1cmZhY2VzLCBvciB3ZSB3b24ndCBnZXQgcmVmcmVzaGVzIHdoZW4gZG9uZS4gKi8KICAgIGlmIChTcmMgPT0gVGhpcykKICAgIHsKICAgICAgICBpbnQgcGl0Y2g7CgogICAgICAgIFVuaW9uUmVjdCgmbG9ja191bmlvbiwgJmxvY2tfc3JjLCAmbG9ja19kc3QpOwoKICAgICAgICAvKiBMb2NrIHRoZSB1bmlvbiBvZiB0aGUgdHdvIHJlY3RhbmdsZXMgKi8KICAgICAgICByZXQgPSBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3QoaWZhY2UsICZkbG9jaywgJmxvY2tfdW5pb24sIDApOwogICAgICAgIGlmKHJldCAhPSBEM0RfT0spIGdvdG8gZXJyb3I7CgogICAgICAgIHBpdGNoID0gZGxvY2suUGl0Y2g7CiAgICAgICAgc2xvY2suUGl0Y2ggPSBkbG9jay5QaXRjaDsKCiAgICAgICAgLyogU2luY2Ugc2xvY2sgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhpcyBzdXJmYWNlJ3MgZGVzY3JpcHRpb24sIHdlIGNhbiBqdXN0IHJldXNlIGl0ICovCiAgICAgICAgYXNzZXJ0KFRoaXMtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeSAhPSBOVUxMKTsKICAgICAgICBzYnVmID0gKEJZVEUgKilUaGlzLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnkgKyBsb2NrX3NyYy50b3AgKiBwaXRjaCArIGxvY2tfc3JjLmxlZnQgKiBicHA7IAogICAgICAgIGRidWYgPSAoQllURSAqKVRoaXMtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeSArIGxvY2tfZHN0LnRvcCAqIHBpdGNoICsgbG9ja19kc3QubGVmdCAqIGJwcDsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmV0ID0gSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KFNvdXJjZSwgJnNsb2NrLCAmbG9ja19zcmMsIEQzRExPQ0tfUkVBRE9OTFkpOwogICAgICAgIGlmKHJldCAhPSBEM0RfT0spIGdvdG8gZXJyb3I7CiAgICAgICAgcmV0ID0gSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KGlmYWNlLCAmZGxvY2ssICZsb2NrX2RzdCwgMCk7CiAgICAgICAgaWYocmV0ICE9IEQzRF9PSykgZ290byBlcnJvcjsKCiAgICAgICAgc2J1ZiA9IHNsb2NrLnBCaXRzOwogICAgICAgIGRidWYgPSBkbG9jay5wQml0czsKICAgICAgICBUUkFDRSgiRHN0IGlzIGF0ICVwLCBTcmMgaXMgYXQgJXBcbiIsIGRidWYsIHNidWYpOwogICAgfQoKICAgIC8qIEhhbmRsZSBmaXJzdCB0aGUgRk9VUkNDIHN1cmZhY2VzLi4uICovCiAgICBpZiAoaXNGb3VyY2MoU3JjLT5yZXNvdXJjZS5mb3JtYXQpICYmIGlzRm91cmNjKFRoaXMtPnJlc291cmNlLmZvcm1hdCkpCiAgICB7CiAgICAgICAgVFJBQ0UoIkZvdXJjYyAtPiBGb3VyY2MgY29weVxuIik7CiAgICAgICAgaWYgKHRyYW5zKQogICAgICAgICAgICBGSVhNRSgidHJhbnMgYXJnIG5vdCBzdXBwb3J0ZWQgd2hlbiBhIEZPVVJDQyBzdXJmYWNlIGlzIGludm9sdmVkXG4iKTsKICAgICAgICBpZiAoZHN0eCB8fCBkc3R5KQogICAgICAgICAgICBGSVhNRSgib2Zmc2V0IGZvciBkZXN0aW5hdGlvbiBzdXJmYWNlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIGlmIChTcmMtPnJlc291cmNlLmZvcm1hdCAhPSBUaGlzLT5yZXNvdXJjZS5mb3JtYXQpCiAgICAgICAgewogICAgICAgICAgICBGSVhNRSgiRk9VUkNDLT5GT1VSQ0MgY29weSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIHNhbWUgdHlwZSBvZiBzdXJmYWNlXG4iKTsKICAgICAgICAgICAgcmV0ID0gRERFUlJfSU5WQUxJRFBJWEVMRk9STUFUOwogICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgIH0KICAgICAgICAvKiBGSVhNRTogV2F0Y2ggb3V0IHRoYXQgdGhlIHNpemUgaXMgY29ycmVjdCBmb3IgRk9VUkNDIHN1cmZhY2VzICovCiAgICAgICAgbWVtY3B5KGRidWYsIHNidWYsIFRoaXMtPnJlc291cmNlLnNpemUpOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBpZiAoKGlzRm91cmNjKFNyYy0+cmVzb3VyY2UuZm9ybWF0KSkgJiYKICAgICAgICAoIWlzRm91cmNjKFRoaXMtPnJlc291cmNlLmZvcm1hdCkpKQogICAgewogICAgICAgIC8qIFRPRE86IFVzZSB0aGUgbGlidHhjX2R4dG4uc28gc2hhcmVkIGxpYnJhcnkgdG8gZG8KICAgICAgICAgKiBzb2Z0d2FyZSBkZWNvbXByZXNzaW9uCiAgICAgICAgICovCiAgICAgICAgRVJSKCJEWFRDIGRlY29tcHJlc3Npb24gbm90IHN1cHBvcnRlZCBieSBub3dcbiIpOwogICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CgogICAgaWYgKHRyYW5zICYgKEREQkxURkFTVF9TUkNDT0xPUktFWSB8IEREQkxURkFTVF9ERVNUQ09MT1JLRVkpKQogICAgewogICAgICAgIERXT1JEIGtleWxvdywga2V5aGlnaDsKICAgICAgICBUUkFDRSgiQ29sb3Iga2V5ZWQgY29weVxuIik7CiAgICAgICAgaWYgKHRyYW5zICYgRERCTFRGQVNUX1NSQ0NPTE9SS0VZKQogICAgICAgIHsKICAgICAgICAgICAga2V5bG93ICA9IFNyYy0+U3JjQmx0Q0tleS5kd0NvbG9yU3BhY2VMb3dWYWx1ZTsKICAgICAgICAgICAga2V5aGlnaCA9IFNyYy0+U3JjQmx0Q0tleS5kd0NvbG9yU3BhY2VIaWdoVmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGNvcnJlY3QgKi8KICAgICAgICAgICAgRklYTUUoIkREQkxURkFTVF9ERVNUQ09MT1JLRVkgbm90IGZ1bGx5IHN1cHBvcnRlZCB5ZXQuXG4iKTsKICAgICAgICAgICAga2V5bG93ICA9IFRoaXMtPkRlc3RCbHRDS2V5LmR3Q29sb3JTcGFjZUxvd1ZhbHVlOwogICAgICAgICAgICBrZXloaWdoID0gVGhpcy0+RGVzdEJsdENLZXkuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwogICAgICAgIH0KCiNkZWZpbmUgQ09QWUJPWF9DT0xPUktFWSh0eXBlKSB7IFwKICAgICAgICAgICAgdHlwZSAqZCwgKnMsIHRtcDsgXAogICAgICAgICAgICBzID0gKHR5cGUgKikgc2J1ZjsgXAogICAgICAgICAgICBkID0gKHR5cGUgKikgZGJ1ZjsgXAogICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7IFwKICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsgXAogICAgICAgICAgICAgICAgICAgIHRtcCA9IHNbeF07IFwKICAgICAgICAgICAgICAgICAgICBpZiAodG1wIDwga2V5bG93IHx8IHRtcCA+IGtleWhpZ2gpIGRbeF0gPSB0bXA7IFwKICAgICAgICAgICAgICAgIH0gXAogICAgICAgICAgICAgICAgcyA9ICh0eXBlICopKChCWVRFICopcyArIHNsb2NrLlBpdGNoKTsgXAogICAgICAgICAgICAgICAgZCA9ICh0eXBlICopKChCWVRFICopZCArIGRsb2NrLlBpdGNoKTsgXAogICAgICAgICAgICB9IFwKICAgICAgICAgICAgYnJlYWs7IFwKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoYnBwKSB7CiAgICAgICAgICAgIGNhc2UgMTogQ09QWUJPWF9DT0xPUktFWShCWVRFKQogICAgICAgICAgICBjYXNlIDI6IENPUFlCT1hfQ09MT1JLRVkoV09SRCkKICAgICAgICAgICAgY2FzZSA0OiBDT1BZQk9YX0NPTE9SS0VZKERXT1JEKQogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEJZVEUgKmQsICpzOwogICAgICAgICAgICAgICAgRFdPUkQgdG1wOwogICAgICAgICAgICAgICAgcyA9IChCWVRFICopIHNidWY7CiAgICAgICAgICAgICAgICBkID0gKEJZVEUgKikgZGJ1ZjsKICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHcgKiAzOyB4ICs9IDMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoRFdPUkQpc1t4XSArICgoRFdPUkQpc1t4ICsgMV0gPDwgOCkgKyAoKERXT1JEKXNbeCArIDJdIDw8IDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA8IGtleWxvdyB8fCB0bXAgPiBrZXloaWdoKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkW3ggKyAwXSA9IHNbeCArIDBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZFt4ICsgMV0gPSBzW3ggKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbeCArIDJdID0gc1t4ICsgMl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcyArPSBzbG9jay5QaXRjaDsKICAgICAgICAgICAgICAgICAgICBkICs9IGRsb2NrLlBpdGNoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEZJWE1FKCJTb3VyY2UgY29sb3Iga2V5IGJsaXR0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIGJwcCAlZFxuIixicHAqOCk7CiAgICAgICAgICAgICAgICByZXQgPSBEREVSUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgfQojdW5kZWYgQ09QWUJPWF9DT0xPUktFWQogICAgICAgIFRSQUNFKCJDb3B5IERvbmVcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGludCB3aWR0aCA9IHcgKiBicHA7CiAgICAgICAgVFJBQ0UoIk5PIGNvbG9yIGtleSBjb3B5XG4iKTsKICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgLyogVGhpcyBpcyBwcmV0dHkgZWFzeSwgYSBsaW5lIGZvciBsaW5lIG1lbWNweSAqLwogICAgICAgICAgICBtZW1jcHkoZGJ1Ziwgc2J1Ziwgd2lkdGgpOwogICAgICAgICAgICBzYnVmICs9IHNsb2NrLlBpdGNoOwogICAgICAgICAgICBkYnVmICs9IGRsb2NrLlBpdGNoOwogICAgICAgIH0KICAgICAgICBUUkFDRSgiQ29weSBkb25lXG4iKTsKICAgIH0KCmVycm9yOgogICAgaWYgKFNyYyA9PSBUaGlzKQogICAgewogICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KGlmYWNlKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBJV2luZUQzRFN1cmZhY2VfVW5sb2NrUmVjdChpZmFjZSk7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3QoU291cmNlKTsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0RTdXJmYWNlOjpMb2FkVGV4dHVyZSwgR0RJIHZlcnNpb24KICoKICogVGhpcyBpcyBtdXR1YWxseSB1bnN1cHBvcnRlZCBieSBHREkgc3VyZmFjZXMKICoKICogUmV0dXJuczoKICogIEQzREVSUl9JTlZBTElEQ0FMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhSRVNVTFQgV0lOQVBJCklXaW5lR0RJU3VyZmFjZUltcGxfTG9hZFRleHR1cmUoSVdpbmVEM0RTdXJmYWNlICppZmFjZSkKewogICAgRVJSKCJVbnN1cHBvcnRlZCBvbiBYMTEgc3VyZmFjZXNcbiIpOwogICAgcmV0dXJuIEQzREVSUl9JTlZBTElEQ0FMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEU3VyZmFjZTo6U2F2ZVNuYXBzaG90LCBHREkgdmVyc2lvbgogKgogKiBUaGlzIG1ldGhvZCB3cml0ZXMgdGhlIHN1cmZhY2UncyBjb250ZW50cyB0byB0aGUgaW4gdGdhIGZvcm1hdCB0byB0aGUKICogZmlsZSBzcGVjaWZpZWQgaW4gZmlsZW5hbWUuCiAqCiAqIFBhcmFtczoKICogIGZpbGVuYW1lOiBGaWxlIHRvIHdyaXRlIHRvCiAqCiAqIFJldHVybnM6CiAqICBXSU5FRDNERVJSX0lOVkFMSURDQUxMIGlmIHRoZSBmaWxlIGNvdWxkbid0IGJlIG9wZW5lZAogKiAgV0lORUQzRF9PSyBvbiBzdWNjZXNzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludCBnZXRfc2hpZnQoRFdPUkQgY29sb3JfbWFzaykgewogICAgaW50IHNoaWZ0ID0gMDsKICAgIHdoaWxlIChjb2xvcl9tYXNrID4gMHhGRikgewogICAgICAgIGNvbG9yX21hc2sgPj49IDE7CiAgICAgICAgc2hpZnQgKz0gMTsKICAgIH0KICAgIHdoaWxlICgoY29sb3JfbWFzayAmIDB4ODApID09IDApIHsKICAgICAgICBjb2xvcl9tYXNrIDw8PSAxOwogICAgICAgIHNoaWZ0IC09IDE7CiAgICB9CiAgICByZXR1cm4gc2hpZnQ7Cn0KCgpIUkVTVUxUIFdJTkFQSQpJV2luZUdESVN1cmZhY2VJbXBsX1NhdmVTbmFwc2hvdChJV2luZUQzRFN1cmZhY2UgKmlmYWNlLApjb25zdCBjaGFyKiBmaWxlbmFtZSkKewogICAgRklMRSogZiA9IE5VTEw7CiAgICBVSU5UIHkgPSAwLCB4ID0gMDsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKWlmYWNlOwogICAgc3RhdGljIGNoYXIgKm91dHB1dCA9IE5VTEw7CiAgICBzdGF0aWMgaW50IHNpemUgPSAwOwoKICAgIGlmIChUaGlzLT5wb3cyV2lkdGggPiBzaXplKSB7CiAgICAgICAgb3V0cHV0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIFRoaXMtPnBvdzJXaWR0aCAqIDMpOwogICAgICAgIHNpemUgPSBUaGlzLT5wb3cyV2lkdGg7CiAgICB9CgoKICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgIncrIik7CiAgICBpZiAoTlVMTCA9PSBmKSB7CiAgICAgICAgRVJSKCJvcGVuaW5nIG9mICVzIGZhaWxlZCB3aXRoXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CiAgICBmcHJpbnRmKGYsICJQNlxuJWQgJWRcbjI1NVxuIiwgVGhpcy0+cG93MldpZHRoLCBUaGlzLT5wb3cySGVpZ2h0KTsKCiAgICBpZiAoVGhpcy0+cmVzb3VyY2UuZm9ybWF0ID09IFdJTkVEM0RGTVRfUDgpIHsKICAgICAgICB1bnNpZ25lZCBjaGFyIHRhYmxlWzI1Nl1bM107CiAgICAgICAgaW50IGk7CgogICAgICAgIGlmIChUaGlzLT5wYWxldHRlID09IE5VTEwpIHsKICAgICAgICAgICAgZmNsb3NlKGYpOwogICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgICAgIHRhYmxlW2ldWzBdID0gVGhpcy0+cGFsZXR0ZS0+cGFsZW50c1tpXS5wZVJlZDsKICAgICAgICAgICAgdGFibGVbaV1bMV0gPSBUaGlzLT5wYWxldHRlLT5wYWxlbnRzW2ldLnBlR3JlZW47CiAgICAgICAgICAgIHRhYmxlW2ldWzJdID0gVGhpcy0+cGFsZXR0ZS0+cGFsZW50c1tpXS5wZUJsdWU7CiAgICAgICAgfQogICAgICAgIGZvciAoeSA9IDA7IHkgPCBUaGlzLT5wb3cySGVpZ2h0OyB5KyspIHsKICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgVGhpcy0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5ICsgKHkgKiAxICogSVdpbmVEM0RTdXJmYWNlX0dldFBpdGNoKGlmYWNlKSk7CiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBUaGlzLT5wb3cyV2lkdGg7IHgrKykgewogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjb2xvciA9ICpzcmM7CiAgICAgICAgICAgICAgICBzcmMgKz0gMTsKCiAgICAgICAgICAgICAgICBvdXRwdXRbMyAqIHggKyAwXSA9IHRhYmxlW2NvbG9yXVswXTsKICAgICAgICAgICAgICAgIG91dHB1dFszICogeCArIDFdID0gdGFibGVbY29sb3JdWzFdOwogICAgICAgICAgICAgICAgb3V0cHV0WzMgKiB4ICsgMl0gPSB0YWJsZVtjb2xvcl1bMl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZndyaXRlKG91dHB1dCwgMyAqIFRoaXMtPnBvdzJXaWR0aCwgMSwgZik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpbnQgcmVkX3NoaWZ0LCBncmVlbl9zaGlmdCwgYmx1ZV9zaGlmdCwgcGl4X3dpZHRoOwoKICAgICAgICBwaXhfd2lkdGggPSBUaGlzLT5ieXRlc1BlclBpeGVsOwoKICAgICAgICByZWRfc2hpZnQgPSBnZXRfc2hpZnQoZ2V0X2JpdG1hc2tfcmVkKFRoaXMtPnJlc291cmNlLmZvcm1hdCkpOwogICAgICAgIGdyZWVuX3NoaWZ0ID0gZ2V0X3NoaWZ0KGdldF9iaXRtYXNrX2dyZWVuKFRoaXMtPnJlc291cmNlLmZvcm1hdCkpOwogICAgICAgIGJsdWVfc2hpZnQgPSBnZXRfc2hpZnQoZ2V0X2JpdG1hc2tfYmx1ZShUaGlzLT5yZXNvdXJjZS5mb3JtYXQpKTsKCiAgICAgICAgZm9yICh5ID0gMDsgeSA8IFRoaXMtPnBvdzJIZWlnaHQ7IHkrKykgewogICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBUaGlzLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnkgKyAoeSAqIDEgKiBJV2luZUQzRFN1cmZhY2VfR2V0UGl0Y2goaWZhY2UpKTsKICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IFRoaXMtPnBvdzJXaWR0aDsgeCsrKSB7CSAgICAKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb2xvcjsKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb21wOwogICAgICAgICAgICAgICAgaW50IGk7CgogICAgICAgICAgICAgICAgY29sb3IgPSAwOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeF93aWR0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29sb3IgfD0gc3JjW2ldIDw8ICg4ICogaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzcmMgKz0gMSAqIHBpeF93aWR0aDsKCiAgICAgICAgICAgICAgICBjb21wID0gY29sb3IgJiBnZXRfYml0bWFza19yZWQoVGhpcy0+cmVzb3VyY2UuZm9ybWF0KTsKICAgICAgICAgICAgICAgIG91dHB1dFszICogeCArIDBdID0gcmVkX3NoaWZ0ID4gMCA/IGNvbXAgPj4gcmVkX3NoaWZ0IDogY29tcCA8PCAtcmVkX3NoaWZ0OwogICAgICAgICAgICAgICAgY29tcCA9IGNvbG9yICYgZ2V0X2JpdG1hc2tfZ3JlZW4oVGhpcy0+cmVzb3VyY2UuZm9ybWF0KTsKICAgICAgICAgICAgICAgIG91dHB1dFszICogeCArIDFdID0gZ3JlZW5fc2hpZnQgPiAwID8gY29tcCA+PiBncmVlbl9zaGlmdCA6IGNvbXAgPDwgLWdyZWVuX3NoaWZ0OwogICAgICAgICAgICAgICAgY29tcCA9IGNvbG9yICYgZ2V0X2JpdG1hc2tfYmx1ZShUaGlzLT5yZXNvdXJjZS5mb3JtYXQpOwogICAgICAgICAgICAgICAgb3V0cHV0WzMgKiB4ICsgMl0gPSBibHVlX3NoaWZ0ID4gMCA/IGNvbXAgPj4gYmx1ZV9zaGlmdCA6IGNvbXAgPDwgLWJsdWVfc2hpZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZndyaXRlKG91dHB1dCwgMyAqIFRoaXMtPnBvdzJXaWR0aCwgMSwgZik7CiAgICAgICAgfQogICAgfQogICAgZmNsb3NlKGYpOwogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJV2luZUQzRFN1cmZhY2U6OlByaXZhdGVTZXR1cCwgR0RJIHZlcnNpb24KICoKICogSW5pdGlhbGl6ZXMgdGhlIEdESSBzdXJmYWNlLCBha2EgY3JlYXRlcyB0aGUgRElCIHNlY3Rpb24gd2UgcmVuZGVyIHRvCiAqIFRoZSBESUIgc2VjdGlvbiBjcmVhdGlvbiBpcyBkb25lIGJ5IGNhbGxpbmcgR2V0REMsIHdoaWNoIHdpbGwgY3JlYXRlIHRoZQogKiBzZWN0aW9uIGFuZCByZWxlYXNpbmcgdGhlIGRjIHRvIGFsbG93IHRoZSBhcHAgdG8gdXNlIGl0LiBUaGUgZGliIHNlY3Rpb24KICogd2lsbCBzdGF5IHVudGlsIHRoZSBzdXJmYWNlIGlzIHJlbGVhc2VkCiAqCiAqIEdESSBzdXJmYWNlcyBkbyBub3QgbmVlZCB0byBiZSBhIHBvd2VyIG9mIDIgaW4gc2l6ZSwgc28gdGhlIHBvdzIgc2l6ZXMKICogYXJlIHNldCB0byB0aGUgcmVhbCBzaXplcyB0byBzYXZlIG1lbW9yeS4gVGhlIE5PTlBPVzIgZmxhZyBpcyB1bnNldCB0bwogKiBhdm9pZCBjb25mdXNpb24gaW4gdGhlIHNoYXJlZCBzdXJmYWNlIGNvZGUuCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgVGhlIHJldHVybiB2YWx1ZXMgb2YgY2FsbGVkIG1ldGhvZHMgb24gZmFpbHVyZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhSRVNVTFQgV0lOQVBJCklXaW5lR0RJU3VyZmFjZUltcGxfUHJpdmF0ZVNldHVwKElXaW5lRDNEU3VyZmFjZSAqaWZhY2UpCnsKICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBpZmFjZTsKICAgIEhSRVNVTFQgaHI7CiAgICBIREMgaGRjOwogICAgbG9uZyBvbGRzaXplID0gVGhpcy0+cmVzb3VyY2Uuc2l6ZTsKCiAgICAvKiBTeXNtZW0gdGV4dHVyZXMgaGF2ZSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgLQogICAgICogcmVsZWFzZSBpdCwgdGhpcyBhdm9pZHMgYW4gdW5uZWNlc3NhcnkgbWVtY3B5CiAgICAgKi8KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeSk7CiAgICBUaGlzLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnkgPSBOVUxMOwoKICAgIC8qIFdlIGRvbid0IG1pbmQgdGhlIG5vbnBvdzIgc3R1ZmYgaW4gR0RJICovCiAgICBUaGlzLT5yZXNvdXJjZS5zaXplID0gVGhpcy0+Y3VycmVudERlc2MuV2lkdGggKiBEM0RGbXRHZXRCcHAoVGhpcy0+cmVzb3VyY2Uud2luZUQzRERldmljZSwgVGhpcy0+cmVzb3VyY2UuZm9ybWF0KSAqIFRoaXMtPmN1cnJlbnREZXNjLldpZHRoOwogICAgVGhpcy0+cG93MlNpemUgPSBUaGlzLT5yZXNvdXJjZS5zaXplOwogICAgVGhpcy0+cG93MldpZHRoID0gVGhpcy0+Y3VycmVudERlc2MuV2lkdGg7CiAgICBUaGlzLT5wb3cySGVpZ2h0ID0gVGhpcy0+Y3VycmVudERlc2MuSGVpZ2h0OwogICAgVGhpcy0+RmxhZ3MgJj0gflNGTEFHX05PTlBPVzI7CgogICAgLyogQWRqdXN0IHRoZSBvcGVuZ2wgbWVtIGNvdW50ZXIgKi8KICAgIGdsb2JhbENoYW5nZUdsUmFtKFRoaXMtPnJlc291cmNlLnNpemUgLSBvbGRzaXplKTsKCiAgICAvKiBDYWxsIEdldERDIHRvIGNyZWF0ZSBhIERJQiBzZWN0aW9uLiBXZSB3aWxsIHVzZSB0aGF0CiAgICAgKiBESUIgc2VjdGlvbiBmb3IgcmVuZGVyaW5nCiAgICAgKgogICAgICogUmVsZWFzZSB0aGUgREMgYWZ0ZXJ3YXJkcyB0byBhbGxvdyB0aGUgYXBwIHRvIHVzZSBpdAogICAgICovCiAgICBociA9IElXaW5lRDNEU3VyZmFjZV9HZXREQyhpZmFjZSwgJmhkYyk7CiAgICBpZihGQUlMRUQoaHIpKQogICAgewogICAgICAgIEVSUigiKCVwKSBJV2luZUQzRFN1cmZhY2U6OkdldERDIGZhaWxlZCB3aXRoIGhyICUwOGx4XG4iLCBUaGlzLCBocik7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQogICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfUmVsZWFzZURDKGlmYWNlLCBoZGMpOwogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICBFUlIoIiglcCkgSVdpbmVEM0RTdXJmYWNlOjpSZWxlYXNlREMgZmFpbGVkIHdpdGggaHIgJTA4bHhcbiIsIFRoaXMsIGhyKTsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCmNvbnN0IElXaW5lRDNEU3VyZmFjZVZ0YmwgSVdpbmVHRElTdXJmYWNlX1Z0YmwgPQp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfQWRkUmVmLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9SZWxlYXNlLAogICAgLyogSVdpbmVEM0RSZXNvdXJjZSAqLwogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9HZXRQYXJlbnQsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX0dldERldmljZSwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfU2V0UHJpdmF0ZURhdGEsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX0dldFByaXZhdGVEYXRhLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9GcmVlUHJpdmF0ZURhdGEsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX1NldFByaW9yaXR5LAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9HZXRQcmlvcml0eSwKICAgIElXaW5lR0RJU3VyZmFjZUltcGxfUHJlTG9hZCwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfR2V0VHlwZSwKICAgIC8qIElXaW5lRDNEU3VyZmFjZSAqLwogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9HZXRDb250YWluZXJQYXJlbnQsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX0dldENvbnRhaW5lciwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfR2V0RGVzYywKICAgIElXaW5lR0RJU3VyZmFjZUltcGxfTG9ja1JlY3QsCiAgICBJV2luZUdESVN1cmZhY2VJbXBsX1VubG9ja1JlY3QsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX0dldERDLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9SZWxlYXNlREMsCiAgICBJV2luZUdESVN1cmZhY2VJbXBsX0ZsaXAsCiAgICBJV2luZUdESVN1cmZhY2VJbXBsX0JsdCwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfR2V0Qmx0U3RhdHVzLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9HZXRGbGlwU3RhdHVzLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9Jc0xvc3QsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX1Jlc3RvcmUsCiAgICBJV2luZUdESVN1cmZhY2VJbXBsX0JsdEZhc3QsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX1NldFBpeGVsRm9ybWF0LAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9HZXRQYWxldHRlLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9TZXRQYWxldHRlLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9SZWFsaXplUGFsZXR0ZSwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfU2V0Q29sb3JLZXksCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX0dldFBpdGNoLAogICAgLyogSW50ZXJuYWwgdXNlOiAqLwogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9DbGVhbkRpcnR5UmVjdCwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfQWRkRGlydHlSZWN0LAogICAgSVdpbmVHRElTdXJmYWNlSW1wbF9Mb2FkVGV4dHVyZSwKICAgIElXaW5lR0RJU3VyZmFjZUltcGxfU2F2ZVNuYXBzaG90LAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9TZXRDb250YWluZXIsCiAgICBJV2luZUQzRFN1cmZhY2VJbXBsX1NldFBCdWZmZXJTdGF0ZSwKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfU2V0R2xUZXh0dXJlRGVzYywKICAgIElXaW5lRDNEU3VyZmFjZUltcGxfR2V0R2xEZXNjLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9HZXREYXRhLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbF9TZXRGb3JtYXQsCiAgICBJV2luZUdESVN1cmZhY2VJbXBsX1ByaXZhdGVTZXR1cAp9Owo=