LyoKICogQ29weXJpZ2h0IChjKSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMaW1pdGVkLCBVSwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgV2FsZG8gQmFzdGlhbiA8d2FsZG8uYmFzdGlhbkBpbnRlbC5jb20+CiAqICAgIExpIFplbmcgPGxpLnplbmdAaW50ZWwuY29tPgogKgogKi8KCiNpbmNsdWRlICJwbndfTVBFRzIuaCIKI2luY2x1ZGUgInRuZ192bGRfZGVjLmgiCiNpbmNsdWRlICJwc2JfZGVmLmgiCiNpbmNsdWRlICJwc2JfZHJ2X2RlYnVnLmgiCiNpbmNsdWRlICJwbndfcm90YXRlLmgiCgojaW5jbHVkZSAiaHdkZWZzL3JlZ19pbzIuaCIKI2luY2x1ZGUgImh3ZGVmcy9tc3ZkeF9vZmZzZXRzLmgiCiNpbmNsdWRlICJod2RlZnMvbXN2ZHhfY21kc19pbzIuaCIKI2luY2x1ZGUgImh3ZGVmcy9tc3ZkeF92ZWNfcmVnX2lvMi5oIgojaW5jbHVkZSAiaHdkZWZzL21zdmR4X3ZlY19tcGVnMl9yZWdfaW8yLmgiCiNpbmNsdWRlICJod2RlZnMvZHh2YV9md19jdHJsLmgiCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBHRVRfU1VSRkFDRV9JTkZPX2lzX2RlZmluZWQocHNiX3N1cmZhY2UpICgoaW50KSAocHNiX3N1cmZhY2UtPmV4dHJhX2luZm9bMF0pKQojZGVmaW5lIFNFVF9TVVJGQUNFX0lORk9faXNfZGVmaW5lZChwc2Jfc3VyZmFjZSwgdmFsKSBwc2Jfc3VyZmFjZS0+ZXh0cmFfaW5mb1swXSA9ICh1aW50MzJfdCkgdmFsOwojZGVmaW5lIEdFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9zdHJ1Y3R1cmUocHNiX3N1cmZhY2UpIChwc2Jfc3VyZmFjZS0+ZXh0cmFfaW5mb1sxXSkKI2RlZmluZSBTRVRfU1VSRkFDRV9JTkZPX3BpY3R1cmVfc3RydWN0dXJlKHBzYl9zdXJmYWNlLCB2YWwpIHBzYl9zdXJmYWNlLT5leHRyYV9pbmZvWzFdID0gdmFsOwojZGVmaW5lIEdFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9jb2RpbmdfdHlwZShwc2Jfc3VyZmFjZSkgKChpbnQpIChwc2Jfc3VyZmFjZS0+ZXh0cmFfaW5mb1syXSkpCiNkZWZpbmUgU0VUX1NVUkZBQ0VfSU5GT19waWN0dXJlX2NvZGluZ190eXBlKHBzYl9zdXJmYWNlLCB2YWwpIHBzYl9zdXJmYWNlLT5leHRyYV9pbmZvWzJdID0gKHVpbnQzMl90KSB2YWw7CgojZGVmaW5lIFNMSUNFREFUQV9CVUZGRVJfVFlQRSh0eXBlKSAoKHR5cGU9PVZBU2xpY2VEYXRhQnVmZmVyVHlwZSk/IlZBU2xpY2VEYXRhQnVmZmVyVHlwZSI6IlZBUHJvdGVjdGVkU2xpY2VEYXRhQnVmZmVyVHlwZSIpCgovKgogKiBGcmFtZSB0eXBlcyAtIGZvcm1hdCBkZXBlbmRhbnQhCiAqLwojZGVmaW5lIFBJQ1RVUkVfQ09ESU5HX0kgICAgMHgwMQojZGVmaW5lIFBJQ1RVUkVfQ09ESU5HX1AgICAgMHgwMgojZGVmaW5lIFBJQ1RVUkVfQ09ESU5HX0IgICAgMHgwMwovKiBBIHNwZWNpYWwgc3ludGF4IGlzIGRlZmluZWQgZm9yIEQtcGljdHVyZXMgKHBpY3R1cmVfY29kaW5nX3R5cGUgPSA0KS4gRC1waWN0dXJlcyBhcmUgbGlrZSBJLXBpY3R1cmVzIHdpdGggb25seSBJbnRyYS1EQyBjb2VmZmljaWVudHMsCiAgIG5vIEVuZCBvZiBCbG9jaywgYW5kIGEgc3BlY2lhbCBlbmRfb2ZfbWFjcm9ibG9jayBjb2RlICcxJy4gUElDVFVSRV9DT0RJTkdfRCBpcyBub3QgYWxsb3dlZCBpbiBNUEVHMiAqLwojZGVmaW5lIFBJQ1RVUkVfQ09ESU5HX0QgICAgMHgwNAoKI2RlZmluZSBIV19TVVBQT1JURURfTUFYX1BJQ1RVUkVfV0lEVEhfTVBFRzJfTVAgMTkyMAojZGVmaW5lIEhXX1NVUFBPUlRFRF9NQVhfUElDVFVSRV9IRUlHSFRfTVBFRzJfTVAgMTA4OAoKI2RlZmluZSBIV19TVVBQT1JURURfTUFYX1BJQ1RVUkVfV0lEVEhfTVBFRzJfU1AgMzUyCiNkZWZpbmUgSFdfU1VQUE9SVEVEX01BWF9QSUNUVVJFX0hFSUdIVF9NUEVHMl9TUCAyODgKCiNkZWZpbmUgQ0FDSEVfUkVGX09GRlNFVCAgICAgICAgNzIKI2RlZmluZSBDQUNIRV9ST1dfT0ZGU0VUICAgICAgICA0CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICBWYXJpYWJsZSBsZW5ndGggY29kZXMgaW4gJ3BhY2tlZCcgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBGb3JtYXQgaXM6IG9wY29kZSwgd2lkdGgsIHN5bWJvbC4gQWxsIFZMQyB0YWJsZXMgYXJlIGNvbmNhdGVuYXRlZC4gSW5kZXggICAgICAgICAgICAqLwovKiBpbmZvbWF0aW9uIGlzIHN0b3JlZCBpbiBndWkxNm1wZWcyVmxjSW5kZXhEYXRhW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFZMQ19QQUNLKGEsYixjKSAgICAgICAgICggKCAoYSkgPDwgMTIgKSB8ICggKGIpIDw8IDkgICkgfCAoYykgKQpzdGF0aWMgY29uc3QgSU1HX1VJTlQxNiBnYXVpMTZtcGVnMlZsY1RhYmxlRGF0YVBhY2tlZFtdID0gewogICAgVkxDX1BBQ0soNiAsIDAgLCAwKSAsCiAgICBWTENfUEFDSygwICwgMCAsIDYpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgNCkgLAogICAgVkxDX1BBQ0soNCAsIDMgLCA1KSAsCiAgICBWTENfUEFDSyg0ICwgNCAsIDYpICwKICAgIFZMQ19QQUNLKDQgLCA1ICwgNykgLAogICAgVkxDX1BBQ0soMSAsIDEgLCAzKSAsCiAgICBWTENfUEFDSyg0ICwgMCAsIDApICwKICAgIFZMQ19QQUNLKDQgLCAwICwgMykgLAogICAgVkxDX1BBQ0soNCAsIDAgLCA4KSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDkpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAwKSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDIpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgMykgLAogICAgVkxDX1BBQ0soNCAsIDMgLCA0KSAsCiAgICBWTENfUEFDSyg0ICwgNCAsIDUpICwKICAgIFZMQ19QQUNLKDQgLCA1ICwgNikgLAogICAgVkxDX1BBQ0soMSAsIDIgLCAxKSAsCiAgICBWTENfUEFDSyg0ICwgMCAsIDcpICwKICAgIFZMQ19QQUNLKDQgLCAxICwgOCkgLAogICAgVkxDX1BBQ0soNCAsIDIgLCA5KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDUpICwKICAgIFZMQ19QQUNLKDAgLCAyICwgMTYpICwKICAgIFZMQ19QQUNLKDAgLCAxICwgODcpICwKICAgIFZMQ19QQUNLKDIgLCAzICwgOTApICwKICAgIFZMQ19QQUNLKDAgLCAwICwgOTgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2NikgLAogICAgVkxDX1BBQ0soNCAsIDMgLCAzODApICwKICAgIFZMQ19QQUNLKDQgLCAzICwgMzgxKSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDUwOCkgLAogICAgVkxDX1BBQ0soNCAsIDEgLCA1MDgpICwKICAgIFZMQ19QQUNLKDQgLCAxICwgNTA4KSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDUwOCkgLAogICAgVkxDX1BBQ0soNCAsIDEgLCA1MDkpICwKICAgIFZMQ19QQUNLKDQgLCAxICwgNTA5KSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDUwOSkgLAogICAgVkxDX1BBQ0soNCAsIDEgLCA1MDkpICwKICAgIFZMQ19QQUNLKDAgLCA0ICwgOCkgLAogICAgVkxDX1BBQ0soMCAsIDIgLCA2MykgLAogICAgVkxDX1BBQ0soNCAsIDEgLCAyNTUpICwKICAgIFZMQ19QQUNLKDQgLCAxICwgMjU1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2NSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NzApICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUxKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ3MSkgLAogICAgVkxDX1BBQ0soMyAsIDQgLCAwKSAsCiAgICBWTENfUEFDSygwICwgMSAsIDMxKSAsCiAgICBWTENfUEFDSygwICwgMCAsIDQwKSAsCiAgICBWTENfUEFDSygyICwgMiAsIDQxKSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIyNCkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAyMjgpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMjMyKSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIzNikgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0MzcpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgMzkpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgNDApICwKICAgIFZMQ19QQUNLKDAgLCAwICwgNDEpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgMjQxKSAsCiAgICBWTENfUEFDSygwICwgMCAsIDQxKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQ1NCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0NTYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQ0KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQzOSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQ1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2MykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMjUpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDU4KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ1OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNDYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ2MSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxODYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU2KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0NykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMzMpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYyKSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDE3MykgLAogICAgVkxDX1BBQ0soMiAsIDEgLCAzKSAsCiAgICBWTENfUEFDSygxICwgMSAsIDUpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgNDQ5KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQzMikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0MzEpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzMyKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQzNCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0MzYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDQ4KSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIxNSkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAyMTkpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMTgwKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDE3OCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxNzcpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjIzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0MCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNTUpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzYyKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4NCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxODUpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0MykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NTMpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0MSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNDgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzY0KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4NykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NjQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDY1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMjYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzM0KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDIpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUyKSAsCiAgICBWTENfUEFDSygwICwgMSAsIDQpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgNDY3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NjYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4OCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNTApICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDY5KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM1MCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNTgpICwKICAgIFZMQ19QQUNLKDAgLCAyICwgMTYpICwKICAgIFZMQ19QQUNLKDAgLCAxICwgODcpICwKICAgIFZMQ19QQUNLKDIgLCAzICwgOTApICwKICAgIFZMQ19QQUNLKDAgLCAwICwgOTgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2NikgLAogICAgVkxDX1BBQ0soNCAsIDMgLCAzODApICwKICAgIFZMQ19QQUNLKDQgLCAzICwgMzgxKSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDI1NCkgLAogICAgVkxDX1BBQ0soNCAsIDEgLCAyNTQpICwKICAgIFZMQ19QQUNLKDQgLCAxICwgMjU0KSAsCiAgICBWTENfUEFDSyg0ICwgMSAsIDI1NCkgLAogICAgVkxDX1BBQ0soNCAsIDIgLCA1MDgpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgNTA4KSAsCiAgICBWTENfUEFDSyg0ICwgMiAsIDUwOSkgLAogICAgVkxDX1BBQ0soNCAsIDIgLCA1MDkpICwKICAgIFZMQ19QQUNLKDAgLCA0ICwgOCkgLAogICAgVkxDX1BBQ0soMCAsIDIgLCA2MykgLAogICAgVkxDX1BBQ0soNCAsIDEgLCAyNTUpICwKICAgIFZMQ19QQUNLKDQgLCAxICwgMjU1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2NSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NzApICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUxKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ3MSkgLAogICAgVkxDX1BBQ0soMyAsIDQgLCAwKSAsCiAgICBWTENfUEFDSygwICwgMSAsIDMxKSAsCiAgICBWTENfUEFDSygwICwgMCAsIDQwKSAsCiAgICBWTENfUEFDSygyICwgMiAsIDQxKSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIyNCkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAyMjgpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMjMyKSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIzNikgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0MzcpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgMzkpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgNDApICwKICAgIFZMQ19QQUNLKDAgLCAwICwgNDEpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgMjQxKSAsCiAgICBWTENfUEFDSygwICwgMCAsIDQxKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQ1NCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0NTYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQ0KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQzOSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQ1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2MykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMjUpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDU4KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ1OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNDYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ2MSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxODYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU2KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0NykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMzMpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYyKSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDE3MykgLAogICAgVkxDX1BBQ0soMiAsIDEgLCAzKSAsCiAgICBWTENfUEFDSygxICwgMSAsIDUpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgNDQ5KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQzMikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0MzEpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzMyKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQzNCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0MzYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDQ4KSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIxNSkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAyMTkpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMTgwKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDE3OCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxNzcpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjIzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0MCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNTUpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzYyKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4NCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxODUpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0MykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NTMpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0MSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNDgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzY0KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4NykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NjQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDY1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMjYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzM0KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDIpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUyKSAsCiAgICBWTENfUEFDSygwICwgMSAsIDQpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgNDY3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NjYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4OCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNTApICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDY5KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM1MCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNTgpICwKICAgIFZMQ19QQUNLKDIgLCAyICwgMzIpICwKICAgIFZMQ19QQUNLKDAgLCAxICwgODcpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgMjQ4KSAsCiAgICBWTENfUEFDSygwICwgMCAsIDg5KSAsCiAgICBWTENfUEFDSygxICwgMiAsIDkwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2NikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxODkpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU4KSAsCiAgICBWTENfUEFDSyg0ICwgMyAsIDM4MCkgLAogICAgVkxDX1BBQ0soNCAsIDMgLCAzODApICwKICAgIFZMQ19QQUNLKDQgLCAzICwgMzgxKSAsCiAgICBWTENfUEFDSyg0ICwgMyAsIDM4MSkgLAogICAgVkxDX1BBQ0soNCAsIDMgLCAyNTQpICwKICAgIFZMQ19QQUNLKDQgLCAzICwgMjU0KSAsCiAgICBWTENfUEFDSyg0ICwgNCAsIDUwNCkgLAogICAgVkxDX1BBQ0soNCAsIDQgLCA1MDUpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgNTA4KSAsCiAgICBWTENfUEFDSyg0ICwgMiAsIDUwOCkgLAogICAgVkxDX1BBQ0soNCAsIDIgLCA1MDgpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgNTA4KSAsCiAgICBWTENfUEFDSyg0ICwgMiAsIDUwOSkgLAogICAgVkxDX1BBQ0soNCAsIDIgLCA1MDkpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgNTA5KSAsCiAgICBWTENfUEFDSyg0ICwgMiAsIDUwOSkgLAogICAgVkxDX1BBQ0soNCAsIDMgLCA1MDYpICwKICAgIFZMQ19QQUNLKDQgLCAzICwgNTA2KSAsCiAgICBWTENfUEFDSyg0ICwgMyAsIDUwNykgLAogICAgVkxDX1BBQ0soNCAsIDMgLCA1MDcpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjUxKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI1MCkgLAogICAgVkxDX1BBQ0soMCAsIDEgLCA3MSkgLAogICAgVkxDX1BBQ0soMCAsIDIgLCA3NCkgLAogICAgVkxDX1BBQ0soNCAsIDAgLCAyNTUpICwKICAgIFZMQ19QQUNLKDAgLCAxICwgMykgLAogICAgVkxDX1BBQ0soMCAsIDIgLCA4KSAsCiAgICBWTENfUEFDSygwICwgMyAsIDE3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM0MSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NjUpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgMikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NjQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzYzKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ2MykgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0MzgpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgMzQ4KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDMyNCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0NTgpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgNDU5KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQ2MSkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCAzNTYpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgMSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMzMpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDYyKSAsCiAgICBWTENfUEFDSygzICwgMyAsIDApICwKICAgIFZMQ19QQUNLKDAgLCAxICwgMTUpICwKICAgIFZMQ19QQUNLKDAgLCAwICwgMjQpICwKICAgIFZMQ19QQUNLKDIgLCAyICwgMjUpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMjI0KSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDIyOCkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAyMzIpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMjM2KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQzNykgLAogICAgVkxDX1BBQ0soMCAsIDAgLCAyMykgLAogICAgVkxDX1BBQ0soMCAsIDAgLCAyNCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCAxODUpICwKICAgIFZMQ19QQUNLKDMgLCAzICwgMCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0NTIpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgNDU0KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDQ1NikgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAxNzMpICwKICAgIFZMQ19QQUNLKDIgLCAxICwgMykgLAogICAgVkxDX1BBQ0soMSAsIDEgLCA1KSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDQ0OSkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0MzIpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDMxKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDMzMikgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0MzQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDM2KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ0OCkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAyMTUpICwKICAgIFZMQ19QQUNLKDUgLCAyICwgMjE5KSAsCiAgICBWTENfUEFDSyg1ICwgMiAsIDE4MCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCAxNzgpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMTc3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDIyMykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDApICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2MikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxODQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzI2KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ3MSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzMzQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzY1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM1MCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDIpICwKICAgIFZMQ19QQUNLKDIgLCAxICwgNCkgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA0NjYpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMzU3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4NykgLAogICAgVkxDX1BBQ0soNSAsIDEgLCAyNDQpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgNDY4KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDE4NikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA0NzApICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMTg4KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDQ2OSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNDcpICwKICAgIFZMQ19QQUNLKDQgLCAyICwgNDkyKSAsCiAgICBWTENfUEFDSyg0ICwgMiAsIDQ5MykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAyNDMpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQyKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDM2NCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAzNDkpICwKICAgIFZMQ19QQUNLKDUgLCAwICwgMjQxKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0MCkgLAogICAgVkxDX1BBQ0soNCAsIDAgLCAzMCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxNCkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxMykgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAxMikgLAogICAgVkxDX1BBQ0soMCAsIDAgLCAzKSAsCiAgICBWTENfUEFDSygyICwgMiAsIDQpICwKICAgIFZMQ19QQUNLKDAgLCAxICwgNykgLAogICAgVkxDX1BBQ0soNSAsIDEgLCA5KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDExKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDgpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgNikgLAogICAgVkxDX1BBQ0soNSAsIDAgLCA1KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDMpICwKICAgIFZMQ19QQUNLKDMgLCAxICwgMCkgLAogICAgVkxDX1BBQ0soMiAsIDIgLCAzKSAsCiAgICBWTENfUEFDSygzICwgMSAsIDApICwKICAgIFZMQ19QQUNLKDIgLCAxICwgNSkgLAogICAgVkxDX1BBQ0soMyAsIDIgLCAwKSAsCiAgICBWTENfUEFDSygzICwgMiAsIDApICwKICAgIFZMQ19QQUNLKDMgLCAyICwgMCkgLAogICAgVkxDX1BBQ0soNCAsIDIgLCAyMjYpICwKICAgIFZMQ19QQUNLKDUgLCAxICwgMSkgLAogICAgVkxDX1BBQ0soNSAsIDAgLCAwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDMxKSAsCiAgICBWTENfUEFDSyg0ICwgMCAsIDYyKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDMwKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI5KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI4KSAsCiAgICBWTENfUEFDSygwICwgMCAsIDMpICwKICAgIFZMQ19QQUNLKDIgLCAyICwgNCkgLAogICAgVkxDX1BBQ0soMSAsIDEgLCA3KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDI1KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI3KSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDI0KSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDIyKSAsCiAgICBWTENfUEFDSyg1ICwgMCAsIDIxKSAsCiAgICBWTENfUEFDSyg1ICwgMSAsIDE5KSAsCiAgICBWTENfUEFDSygzICwgMSAsIDApICwKICAgIFZMQ19QQUNLKDMgLCAxICwgMCkgLAogICAgVkxDX1BBQ0soNSAsIDIgLCAxNSkKfTsKCiNkZWZpbmUgTUFYX1FVQU5UX1RBQkxFUyAgICAoMikgLyogb25seSAyIHRhYmxlcyBmb3IgNDoyOjAgZGVjb2RlICovCgpzdGF0aWMgaW50IHNjYW4wWzY0XSA9IHsgLy8gc3BlYywgZmlnIDctMgogICAgLyp1IDAgIC4uLi4uICAgICAgICAgICAgICAgICAgIDcqLwogICAgMCwgIDEsICA1LCAgNiwgIDE0LCAxNSwgMjcsIDI4LCAgLyogdiA9IDAgKi8KICAgIDIsICA0LCAgNywgIDEzLCAxNiwgMjYsIDI5LCA0MiwKICAgIDMsICA4LCAgMTIsIDE3LCAyNSwgMzAsIDQxLCA0MywKICAgIDksICAxMSwgMTgsIDI0LCAzMSwgNDAsIDQ0LCA1MywKICAgIDEwLCAxOSwgMjMsIDMyLCAzOSwgNDUsIDUyLCA1NCwKICAgIDIwLCAyMiwgMzMsIDM4LCA0NiwgNTEsIDU1LCA2MCwKICAgIDIxLCAzNCwgMzcsIDQ3LCA1MCwgNTYsIDU5LCA2MSwKICAgIDM1LCAzNiwgNDgsIDQ5LCA1NywgNTgsIDYyLCA2MyAgLyogdiA9IDcgKi8KfTsKCnR5cGVkZWYgZW51bSB7CiAgICBOT05JTlRSQV9MVU1BX1EgPSAwLAogICAgSU5UUkFfTFVNQV9RID0gMQp9IFFVQU5UX0lEWDsKCnN0cnVjdCBjb250ZXh0X01QRUcyX3MgewogICAgc3RydWN0IGNvbnRleHRfREVDX3MgZGVjX2N0eDsKICAgIG9iamVjdF9jb250ZXh0X3Agb2JqX2NvbnRleHQ7IC8qIGJhY2sgcmVmZXJlbmNlICovCgogICAgLyogUGljdHVyZSBwYXJhbWV0ZXJzICovCiAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqcGljX3BhcmFtczsKICAgIG9iamVjdF9zdXJmYWNlX3AgZm9yd2FyZF9yZWZfc3VyZmFjZTsKICAgIG9iamVjdF9zdXJmYWNlX3AgYmFja3dhcmRfcmVmX3N1cmZhY2U7CgogICAgdWludDMyX3QgY29kZWRfcGljdHVyZV93aWR0aDsgICAgLyogaW4gcGl4ZWxzICovCiAgICB1aW50MzJfdCBjb2RlZF9waWN0dXJlX2hlaWdodDsgICAgLyogaW4gcGl4ZWxzICovCgogICAgdWludDMyX3QgcGljdHVyZV93aWR0aF9tYjsgICAgICAgIC8qIGluIG1hY3JvYmxvY2tzICovCiAgICB1aW50MzJfdCBwaWN0dXJlX2hlaWdodF9tYjsgICAgICAgIC8qIGluIG1hY3JvYmxvY2tzICovCiAgICB1aW50MzJfdCBzaXplX21iOyAgICAgICAgICAgICAgICAvKiBpbiBtYWNyb2Jsb2NrcyAqLwoKICAgIHVpbnQzMl90IGNvZGVkX3BpY3R1cmVfc2l6ZTsgICAgLyogTVNWRFggZm9ybWF0ICovCiAgICB1aW50MzJfdCBkaXNwbGF5X3BpY3R1cmVfc2l6ZTsgICAgLyogTVNWRFggZm9ybWF0ICovCgogICAgdWludDMyX3QgQkVfUFBTMDsKICAgIHVpbnQzMl90IEJFX1BQUzE7CiAgICB1aW50MzJfdCBCRV9QUFMyOwogICAgdWludDMyX3QgQkVfU1BTMDsKICAgIHVpbnQzMl90IEJFX1NQUzE7CiAgICB1aW50MzJfdCBGRV9QUFMwOwogICAgdWludDMyX3QgRkVfUFBTMTsKCiAgICB1aW50MzJfdCBzbGljZV9jb3VudDsKCiAgICAvKiBJUSBNYXRyaXggKi8KICAgIHVpbnQzMl90IHFtYXRyaXhfZGF0YVtNQVhfUVVBTlRfVEFCTEVTXVsxNl07CiAgICBpbnQgZ290X2lxX21hdHJpeDsKCiAgICAvKiBWTEMgcGFja2VkIGRhdGEgKi8KICAgIHN0cnVjdCBwc2JfYnVmZmVyX3MgdmxjX3BhY2tlZF90YWJsZTsKCiAgICAvKiBNaXNjICovCiAgICB1bnNpZ25lZCBpbnQgcHJldmlvdXNfc2xpY2VfdmVydGljYWxfcG9zaXRpb247Cn07Cgp0eXBlZGVmIHN0cnVjdCBjb250ZXh0X01QRUcyX3MgKmNvbnRleHRfTVBFRzJfcDsKCiNkZWZpbmUgSU5JVF9DT05URVhUX01QRUcyICAgIGNvbnRleHRfTVBFRzJfcCBjdHggPSAoY29udGV4dF9NUEVHMl9wKSBvYmpfY29udGV4dC0+Zm9ybWF0X2RhdGE7CgojZGVmaW5lIFNVUkZBQ0UoaWQpICAgICgob2JqZWN0X3N1cmZhY2VfcCkgb2JqZWN0X2hlYXBfbG9va3VwKCAmY3R4LT5vYmpfY29udGV4dC0+ZHJpdmVyX2RhdGEtPnN1cmZhY2VfaGVhcCwgaWQgKSkKCgpzdGF0aWMgdm9pZCBwbndfTVBFRzJfUXVlcnlDb25maWdBdHRyaWJ1dGVzKAogICAgVkFQcm9maWxlIF9fbWF5YmVfdW51c2VkIHByb2ZpbGUsCiAgICBWQUVudHJ5cG9pbnQgX19tYXliZV91bnVzZWQgZW50cnlwb2ludCwKICAgIFZBQ29uZmlnQXR0cmliIF9fbWF5YmVfdW51c2VkICogYXR0cmliX2xpc3QsCiAgICBpbnQgX19tYXliZV91bnVzZWQgbnVtX2F0dHJpYnMpCnsKICAgIGludCBpOwogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAicG53X01QRUcyX1F1ZXJ5Q29uZmlnQXR0cmlidXRlc1xuIik7CgogICAgZm9yIChpID0gMDsgaSA8IG51bV9hdHRyaWJzOyBpKyspIHsKICAgICAgICBzd2l0Y2ggKGF0dHJpYl9saXN0W2ldLnR5cGUpIHsKICAgICAgICBjYXNlIFZBQ29uZmlnQXR0cmliTWF4UGljdHVyZVdpZHRoOgogICAgICAgICAgICBpZiAoZW50cnlwb2ludCA9PSBWQUVudHJ5cG9pbnRWTEQpIHsKICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IFZBUHJvZmlsZU1QRUcyU2ltcGxlKQogICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2ldLnZhbHVlID0gSFdfU1VQUE9SVEVEX01BWF9QSUNUVVJFX1dJRFRIX01QRUcyX1NQOwogICAgICAgICAgICAgICAgZWxzZSBpZihwcm9maWxlID09IFZBUHJvZmlsZU1QRUcyTWFpbikKICAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpXS52YWx1ZSA9IEhXX1NVUFBPUlRFRF9NQVhfUElDVFVSRV9XSURUSF9NUEVHMl9NUDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpXS52YWx1ZSA9IFZBX0FUVFJJQl9OT1RfU1VQUE9SVEVEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2ldLnZhbHVlID0gVkFfQVRUUklCX05PVF9TVVBQT1JURUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVkFDb25maWdBdHRyaWJNYXhQaWN0dXJlSGVpZ2h0OgogICAgICAgICAgICBpZiAoZW50cnlwb2ludCA9PSBWQUVudHJ5cG9pbnRWTEQpIHsKICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IFZBUHJvZmlsZU1QRUcyU2ltcGxlKQogICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2ldLnZhbHVlID0gSFdfU1VQUE9SVEVEX01BWF9QSUNUVVJFX0hFSUdIVF9NUEVHMl9TUDsKICAgICAgICAgICAgICAgIGVsc2UgaWYocHJvZmlsZSA9PSBWQVByb2ZpbGVNUEVHMk1haW4pCiAgICAgICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaV0udmFsdWUgPSBIV19TVVBQT1JURURfTUFYX1BJQ1RVUkVfSEVJR0hUX01QRUcyX01QOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2ldLnZhbHVlID0gVkFfQVRUUklCX05PVF9TVVBQT1JURUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCn0KCnN0YXRpYyBWQVN0YXR1cyBwbndfTVBFRzJfVmFsaWRhdGVDb25maWcoCiAgICBvYmplY3RfY29uZmlnX3Agb2JqX2NvbmZpZykKewogICAgaW50IGk7CiAgICAvKiBDaGVjayBhbGwgYXR0cmlidXRlcyAqLwogICAgZm9yIChpID0gMDsgaSA8IG9ial9jb25maWctPmF0dHJpYl9jb3VudDsgaSsrKSB7CiAgICAgICAgc3dpdGNoIChvYmpfY29uZmlnLT5hdHRyaWJfbGlzdFtpXS50eXBlKSB7CiAgICAgICAgY2FzZSBWQUNvbmZpZ0F0dHJpYlJURm9ybWF0OgogICAgICAgICAgICAvKiBJZ25vcmUgKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfQVRUUl9OT1RfU1VQUE9SVEVEOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCnN0YXRpYyBWQVN0YXR1cyBwc2JfX01QRUcyX2NoZWNrX2xlZ2FsX3BpY3R1cmUob2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCwgb2JqZWN0X2NvbmZpZ19wIG9ial9jb25maWcpCnsKICAgIFZBU3RhdHVzIHZhU3RhdHVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7CgogICAgQ0hFQ0tfQ09OVEVYVChvYmpfY29udGV4dCk7CiAgICBDSEVDS19DT05GSUcob2JqX2NvbmZpZyk7CgogICAgLyogTVNWRFggZGVjb2RlIGNhcGFiaWxpdHkgZm9yIE1QRUcyOgogICAgICogICAgIE1QQEhMCiAgICAgKgogICAgICogUmVmZXIgdG8gVGFibGUgOC0xMSAoVXBwZXIgYm91bmRzIGZvciBsdW1pbmFuY2Ugc2FtcGxlIHJhdGUpIG9mIElTTy9JRUMgMTM4MTgtMjogMTk5NShFKSwKICAgICAqIGFuZCB0aGUgIk1TVkRYIE1QRUcyIGRlY29kZSBjYXBhYmlsaXR5IiB0YWJsZSBvZiAiUG91bHNibyBNZWRpYSBTb2Z0d2FyZSBPdmVydmlldyIKICAgICAqLwoKICAgIHN3aXRjaCAob2JqX2NvbmZpZy0+cHJvZmlsZSkgewogICAgY2FzZSBWQVByb2ZpbGVNUEVHMlNpbXBsZToKICAgICAgICBpZiAoKG9ial9jb250ZXh0LT5waWN0dXJlX3dpZHRoIDw9IDApIHx8IChvYmpfY29udGV4dC0+cGljdHVyZV93aWR0aCA+IDM1MikKICAgICAgICAgICAgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX2hlaWdodCA8PSAwKSB8fCAob2JqX2NvbnRleHQtPnBpY3R1cmVfaGVpZ2h0ID4gMjg4KSkgewogICAgICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9SRVNPTFVUSU9OX05PVF9TVVBQT1JURUQ7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgVkFQcm9maWxlTVBFRzJNYWluOgogICAgICAgIGlmICgob2JqX2NvbnRleHQtPnBpY3R1cmVfd2lkdGggPD0gMCkgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX3dpZHRoID4gMTkyMCkKICAgICAgICAgICAgfHwgKG9ial9jb250ZXh0LT5waWN0dXJlX2hlaWdodCA8PSAwKSB8fCAob2JqX2NvbnRleHQtPnBpY3R1cmVfaGVpZ2h0ID4gMTA4OCkpIHsKICAgICAgICAgICAgdmFTdGF0dXMgPSBWQV9TVEFUVVNfRVJST1JfUkVTT0xVVElPTl9OT1RfU1VQUE9SVEVEOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX1VOU1VQUE9SVEVEX1BST0ZJTEU7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpzdGF0aWMgdm9pZCBwbndfTVBFRzJfRGVzdHJveUNvbnRleHQob2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCk7CnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfcHJvY2Vzc19zbGljZV9kYXRhKGNvbnRleHRfREVDX3AgZGVjX2N0eCwgVkFTbGljZVBhcmFtZXRlckJ1ZmZlckJhc2UgKnZsZF9zbGljZV9wYXJhbSk7CnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfZW5kX3NsaWNlKGNvbnRleHRfREVDX3AgZGVjX2N0eCk7CnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfYmVnaW5fc2xpY2UoY29udGV4dF9ERUNfcCBkZWNfY3R4LCBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyQmFzZSAqdmxkX3NsaWNlX3BhcmFtKTsKc3RhdGljIFZBU3RhdHVzIHBud19NUEVHMl9wcm9jZXNzX2J1ZmZlcihjb250ZXh0X0RFQ19wIGRlY19jdHgsIG9iamVjdF9idWZmZXJfcCBidWZmZXIpOwoKc3RhdGljIFZBU3RhdHVzIHBud19NUEVHMl9DcmVhdGVDb250ZXh0KAogICAgb2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCwKICAgIG9iamVjdF9jb25maWdfcCBvYmpfY29uZmlnKQp7CiAgICBWQVN0YXR1cyB2YVN0YXR1cyA9IFZBX1NUQVRVU19TVUNDRVNTOwogICAgY29udGV4dF9NUEVHMl9wIGN0eDsKICAgIC8qIFZhbGlkYXRlIGZsYWcgKi8KICAgIC8qIFZhbGlkYXRlIHBpY3R1cmUgZGltZW5zaW9ucyAqLwogICAgdmFTdGF0dXMgPSBwc2JfX01QRUcyX2NoZWNrX2xlZ2FsX3BpY3R1cmUob2JqX2NvbnRleHQsIG9ial9jb25maWcpOwogICAgQ0hFQ0tfVkFTVEFUVVMoKTsKCiAgICBDSEVDS19JTlZBTElEX1BBUkFNKG9ial9jb250ZXh0LT5udW1fcmVuZGVyX3RhcmdldHMgPCAxKTsKCiAgICBjdHggPSAoY29udGV4dF9NUEVHMl9wKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBjb250ZXh0X01QRUcyX3MpKTsKICAgIENIRUNLX0FMTE9DQVRJT04oY3R4KTsKCiAgICBvYmpfY29udGV4dC0+Zm9ybWF0X2RhdGEgPSAodm9pZCopIGN0eDsKICAgIGN0eC0+b2JqX2NvbnRleHQgPSBvYmpfY29udGV4dDsKICAgIGN0eC0+cGljX3BhcmFtcyA9IE5VTEw7CiAgICBjdHgtPmdvdF9pcV9tYXRyaXggPSBGQUxTRTsKICAgIGN0eC0+cHJldmlvdXNfc2xpY2VfdmVydGljYWxfcG9zaXRpb24gPSB+MTsKCiAgICBjdHgtPmRlY19jdHguYmVnaW5fc2xpY2UgPSBwc2JfX01QRUcyX2JlZ2luX3NsaWNlOwogICAgY3R4LT5kZWNfY3R4LnByb2Nlc3Nfc2xpY2UgPSBwc2JfX01QRUcyX3Byb2Nlc3Nfc2xpY2VfZGF0YTsKICAgIGN0eC0+ZGVjX2N0eC5lbmRfc2xpY2UgPSBwc2JfX01QRUcyX2VuZF9zbGljZTsKICAgIGN0eC0+ZGVjX2N0eC5wcm9jZXNzX2J1ZmZlciA9ICBwbndfTVBFRzJfcHJvY2Vzc19idWZmZXI7CiAgICBjdHgtPmRlY19jdHgucHJlbG9hZF9idWZmZXIgPSBOVUxMOwoKICAgIGlmICh2YVN0YXR1cyA9PSBWQV9TVEFUVVNfU1VDQ0VTUykgewogICAgICAgIHZhU3RhdHVzID0gcHNiX2J1ZmZlcl9jcmVhdGUob2JqX2NvbnRleHQtPmRyaXZlcl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdhdWkxNm1wZWcyVmxjVGFibGVEYXRhUGFja2VkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzYl9idF9jcHVfdnB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dmxjX3BhY2tlZF90YWJsZSk7CiAgICAgICAgREVCVUdfRkFJTFVSRTsKICAgIH0KICAgIGlmICh2YVN0YXR1cyA9PSBWQV9TVEFUVVNfU1VDQ0VTUykgewogICAgICAgIHVuc2lnbmVkIGNoYXIgKnZsY19wYWNrZWRfZGF0YV9hZGRyZXNzOwogICAgICAgIGlmICgwID09ICBwc2JfYnVmZmVyX21hcCgmY3R4LT52bGNfcGFja2VkX3RhYmxlLCAmdmxjX3BhY2tlZF9kYXRhX2FkZHJlc3MpKSB7CiAgICAgICAgICAgIG1lbWNweSh2bGNfcGFja2VkX2RhdGFfYWRkcmVzcywgZ2F1aTE2bXBlZzJWbGNUYWJsZURhdGFQYWNrZWQsIHNpemVvZihnYXVpMTZtcGVnMlZsY1RhYmxlRGF0YVBhY2tlZCkpOwogICAgICAgICAgICBwc2JfYnVmZmVyX3VubWFwKCZjdHgtPnZsY19wYWNrZWRfdGFibGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhU3RhdHVzID0gVkFfU1RBVFVTX0VSUk9SX0FMTE9DQVRJT05fRkFJTEVEOwogICAgICAgICAgICBERUJVR19GQUlMVVJFOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodmFTdGF0dXMgPT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICB2YVN0YXR1cyA9IHZsZF9kZWNfQ3JlYXRlQ29udGV4dCgmY3R4LT5kZWNfY3R4LCBvYmpfY29udGV4dCk7CiAgICAgICAgREVCVUdfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAodmFTdGF0dXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICBwbndfTVBFRzJfRGVzdHJveUNvbnRleHQob2JqX2NvbnRleHQpOwogICAgfQoKICAgIHJldHVybiB2YVN0YXR1czsKfQoKc3RhdGljIHZvaWQgcG53X01QRUcyX0Rlc3Ryb3lDb250ZXh0KAogICAgb2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCkKewogICAgSU5JVF9DT05URVhUX01QRUcyCgogICAgdmxkX2RlY19EZXN0cm95Q29udGV4dCgmY3R4LT5kZWNfY3R4KTsKCiAgICBwc2JfYnVmZmVyX2Rlc3Ryb3koJmN0eC0+dmxjX3BhY2tlZF90YWJsZSk7CgogICAgaWYgKGN0eC0+cGljX3BhcmFtcykgewogICAgICAgIGZyZWUoY3R4LT5waWNfcGFyYW1zKTsKICAgICAgICBjdHgtPnBpY19wYXJhbXMgPSBOVUxMOwogICAgfQoKICAgIGZyZWUob2JqX2NvbnRleHQtPmZvcm1hdF9kYXRhKTsKICAgIG9ial9jb250ZXh0LT5mb3JtYXRfZGF0YSA9IE5VTEw7Cn0KCnN0YXRpYyBWQVN0YXR1cyBwc2JfX01QRUcyX3Byb2Nlc3NfcGljdHVyZV9wYXJhbShjb250ZXh0X01QRUcyX3AgY3R4LCBvYmplY3RfYnVmZmVyX3Agb2JqX2J1ZmZlcikKewogICAgb2JqZWN0X3N1cmZhY2VfcCBvYmpfc3VyZmFjZSA9IGN0eC0+b2JqX2NvbnRleHQtPmN1cnJlbnRfcmVuZGVyX3RhcmdldDsKICAgIEFTU0VSVChvYmpfYnVmZmVyLT50eXBlID09IFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclR5cGUpOwogICAgQVNTRVJUKG9ial9idWZmZXItPm51bV9lbGVtZW50cyA9PSAxKTsKICAgIEFTU0VSVChvYmpfYnVmZmVyLT5zaXplID09IHNpemVvZihWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMikpOwoKICAgIGlmICgob2JqX2J1ZmZlci0+bnVtX2VsZW1lbnRzICE9IDEpIHx8CiAgICAgICAgKG9ial9idWZmZXItPnNpemUgIT0gc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyKSkpIHsKICAgICAgICByZXR1cm4gVkFfU1RBVFVTX0VSUk9SX1VOS05PV047CiAgICB9CgogICAgLyogVHJhbnNmZXIgb3duZXJzaGlwIG9mIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyIGRhdGEgKi8KICAgIGlmIChjdHgtPnBpY19wYXJhbXMpIHsKICAgICAgICBmcmVlKGN0eC0+cGljX3BhcmFtcyk7CiAgICB9CiAgICBjdHgtPnBpY19wYXJhbXMgPSAoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKikgb2JqX2J1ZmZlci0+YnVmZmVyX2RhdGE7CiAgICBvYmpfYnVmZmVyLT5idWZmZXJfZGF0YSA9IE5VTEw7CiAgICBvYmpfYnVmZmVyLT5zaXplID0gMDsKCiAgICAvKiBMb29rdXAgc3VyZmFjZXMgZm9yIGJhY2t3YXJkL2ZvcndhcmQgcmVmZXJlbmNlcyAqLwogICAgc3dpdGNoIChjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX3R5cGUpIHsKICAgIGNhc2UgUElDVFVSRV9DT0RJTkdfSToKICAgICAgICBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UgPSBOVUxMOwogICAgICAgIGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UgPSBOVUxMOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUElDVFVSRV9DT0RJTkdfUDoKICAgICAgICBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UgPSBTVVJGQUNFKGN0eC0+cGljX3BhcmFtcy0+Zm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSk7CiAgICAgICAgY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZSA9IE5VTEw7CiAgICAgICAgaWYgKE5VTEwgPT0gY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlKSB7CiAgICAgICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfSU5WQUxJRF9TVVJGQUNFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFBJQ1RVUkVfQ09ESU5HX0I6CiAgICAgICAgY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlID0gU1VSRkFDRShjdHgtPnBpY19wYXJhbXMtPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUpOwogICAgICAgIGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UgPSBTVVJGQUNFKGN0eC0+cGljX3BhcmFtcy0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUpOwogICAgICAgIGlmICgoTlVMTCA9PSBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UpIHx8CiAgICAgICAgICAgIChOVUxMID09IGN0eC0+YmFja3dhcmRfcmVmX3N1cmZhY2UpKSB7CiAgICAgICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfSU5WQUxJRF9TVVJGQUNFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKICAgIH0KCiAgICBjdHgtPnBpY3R1cmVfd2lkdGhfbWIgPSAoY3R4LT5waWNfcGFyYW1zLT5ob3Jpem9udGFsX3NpemUgKyAxNSkgLyAxNjsKICAgIGlmIChjdHgtPm9ial9jb250ZXh0LT52YV9mbGFncyAmIFZBX1BST0dSRVNTSVZFKSB7CiAgICAgICAgY3R4LT5waWN0dXJlX2hlaWdodF9tYiA9IChjdHgtPnBpY19wYXJhbXMtPnZlcnRpY2FsX3NpemUgKyAxNSkgLyAxNjsKICAgIH0gZWxzZSB7CiAgICAgICAgY3R4LT5waWN0dXJlX2hlaWdodF9tYiA9IChjdHgtPnBpY19wYXJhbXMtPnZlcnRpY2FsX3NpemUgKyAzMSkgLyAzMjsKICAgICAgICBjdHgtPnBpY3R1cmVfaGVpZ2h0X21iICo9IDI7CiAgICB9CiAgICBjdHgtPmNvZGVkX3BpY3R1cmVfd2lkdGggPSBjdHgtPnBpY3R1cmVfd2lkdGhfbWIgKiAxNjsKICAgIGN0eC0+Y29kZWRfcGljdHVyZV9oZWlnaHQgPSBjdHgtPnBpY3R1cmVfaGVpZ2h0X21iICogMTY7CgogICAgaWYgKG9ial9zdXJmYWNlLT5zaGFyZV9pbmZvKSB7CiAgICAgICAgb2JqX3N1cmZhY2UtPnNoYXJlX2luZm8tPmNvZGVkX3dpZHRoID0gY3R4LT5jb2RlZF9waWN0dXJlX3dpZHRoOwogICAgICAgIG9ial9zdXJmYWNlLT5zaGFyZV9pbmZvLT5jb2RlZF9oZWlnaHQgPSBjdHgtPmNvZGVkX3BpY3R1cmVfaGVpZ2h0OwogICAgfQoKICAgIGN0eC0+c2l6ZV9tYiA9IGN0eC0+cGljdHVyZV93aWR0aF9tYiAqIGN0eC0+cGljdHVyZV9oZWlnaHRfbWI7CgogICAgLyogRGlzcGxheSBwaWN0dXJlIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgY3R4LT5kaXNwbGF5X3BpY3R1cmVfc2l6ZSA9IDA7CiAgICAvKgogICAgICogY29kZWRfcGljdHVyZV93aWR0aC9oZWlnaHQgaXMgYWxpZ25lZCB0byB0aGUgc2l6ZSBvZiBhIG1hY3JvYmxvY2suLgogICAgICogQm90aCBjb2RlZF9waWN0dXJlX2hlaWdodCBvciB2ZXJ0aWNhbF9zaXplIGNhbiBiZSB1c2VkIGZvciBESVNQTEFZX1NJWkUgYW5kIGJvdGggZ2l2ZSBjb3JyZWN0IHJlc3VsdHMsCiAgICAgKiBob3dldmVyIFZpc3RhIGRyaXZlciAvIHRlc3QgYXBwIHVzZXMgdGhlIGFsaWduZWQgdmFsdWUgdGhhdCdzIGluIGNvZGVkX3BpY3R1cmVfaGVpZ2h0IHNvIHdlIGRvIHRvby4KICAgICAqIFNlZSBlLmcuIGxvdzQubTJ2IGZvciBhbiBleGFtcGxlIGNsaXAgd2hlcmUgdmVydGljYWxfc2l6ZSB3aWxsIGRpZmZlciBmcm9tIGNvZGVkX3BpY3R1cmVfaGVpZ2h0CiAgICAgKi8KI2lmIDAKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5kaXNwbGF5X3BpY3R1cmVfc2l6ZSwgTVNWRFhfQ01EUywgRElTUExBWV9QSUNUVVJFX1NJWkUsIERJU1BMQVlfUElDVFVSRV9IRUlHSFQsIGN0eC0+cGljX3BhcmFtcy0+dmVydGljYWxfc2l6ZSAtIDEpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPmRpc3BsYXlfcGljdHVyZV9zaXplLCBNU1ZEWF9DTURTLCBESVNQTEFZX1BJQ1RVUkVfU0laRSwgRElTUExBWV9QSUNUVVJFX1dJRFRILCBjdHgtPnBpY19wYXJhbXMtPmhvcml6b250YWxfc2l6ZSAtIDEpOwojZWxzZQogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPmRpc3BsYXlfcGljdHVyZV9zaXplLCBNU1ZEWF9DTURTLCBESVNQTEFZX1BJQ1RVUkVfU0laRSwgRElTUExBWV9QSUNUVVJFX0hFSUdIVCwgY3R4LT5jb2RlZF9waWN0dXJlX2hlaWdodCAtIDEpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPmRpc3BsYXlfcGljdHVyZV9zaXplLCBNU1ZEWF9DTURTLCBESVNQTEFZX1BJQ1RVUkVfU0laRSwgRElTUExBWV9QSUNUVVJFX1dJRFRILCBjdHgtPmNvZGVkX3BpY3R1cmVfd2lkdGggLSAxKTsKI2VuZGlmCgogICAgLyogQ29kZWQgcGljdHVyZSBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGN0eC0+Y29kZWRfcGljdHVyZV9zaXplID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5jb2RlZF9waWN0dXJlX3NpemUsIE1TVkRYX0NNRFMsIENPREVEX1BJQ1RVUkVfU0laRSwgQ09ERURfUElDVFVSRV9IRUlHSFQsIGN0eC0+Y29kZWRfcGljdHVyZV9oZWlnaHQgLSAxKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5jb2RlZF9waWN0dXJlX3NpemUsIE1TVkRYX0NNRFMsIENPREVEX1BJQ1RVUkVfU0laRSwgQ09ERURfUElDVFVSRV9XSURUSCwgY3R4LT5jb2RlZF9waWN0dXJlX3dpZHRoIC0gMSk7CgogICAgY3R4LT5CRV9TUFMwID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9TUFMwLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9TUFMwLCBCRV9IT1JJWk9OVEFMX1NJWkVfTUlOVVMxLCBjdHgtPnBpY3R1cmVfd2lkdGhfbWIgLSAxKTsKCiAgICBjdHgtPkJFX1NQUzEgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkJFX1NQUzEsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0JFX1NQUzEsIEJFX1ZFUlRJQ0FMX1NJWkVfTUlOVVMxLCBjdHgtPnBpY3R1cmVfaGVpZ2h0X21iKTsKCiAgICBjdHgtPkZFX1BQUzAgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkZFX1BQUzAsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzAsIEZFX0FMVEVSTkFURV9TQ0FOLCAgICAgICAgICAgICAgICAgISEoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5hbHRlcm5hdGVfc2NhbikpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkZFX1BQUzAsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzAsIEZFX1FfU0NBTEVfVFlQRSwgICAgICAgICAgICAgICAgICEhKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucV9zY2FsZV90eXBlKSk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+RkVfUFBTMCwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfRkVfUFBTMCwgRkVfSU5UUkFfRENfUFJFQ0lTSU9OLCAgICAgICAgICAgICAgICBjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmludHJhX2RjX3ByZWNpc2lvbik7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+RkVfUFBTMCwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfRkVfUFBTMCwgRkVfVE9QX0ZJRUxEX0ZJUlNULCAgICAgICAgICAgICAhIShjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnRvcF9maWVsZF9maXJzdCkpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkZFX1BQUzAsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzAsIEZFX0NPTkNFQUxNRU5UX01PVElPTl9WRUNUT1JTLCAgISEoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycykpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkZFX1BQUzAsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzAsIEZFX0ZSQU1FX1BSRURfRlJBTUVfRENULCAgICAgICAgICEhKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuZnJhbWVfcHJlZF9mcmFtZV9kY3QpKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5GRV9QUFMwLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9GRV9QUFMwLCBGRV9QSUNUVVJFX1NUUlVDVFVSRSwgICAgICAgICAgICAgICAgY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5waWN0dXJlX3N0cnVjdHVyZSk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+RkVfUFBTMCwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfRkVfUFBTMCwgRkVfSU5UUkFfVkxDX0ZPUk1BVCwgICAgICAgICAgICAgISEoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5pbnRyYV92bGNfZm9ybWF0KSk7CgogICAgY3R4LT5GRV9QUFMxID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5GRV9QUFMxLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9GRV9QUFMxLCBGRV9QSUNUVVJFX0NPRElOR19UWVBFLCBjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX3R5cGUpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkZFX1BQUzEsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzEsIEZFX0ZfQ09ERTAwLCAoY3R4LT5waWNfcGFyYW1zLT5mX2NvZGUgPj4gMTIpICYgMHgwRik7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+RkVfUFBTMSwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfRkVfUFBTMSwgRkVfRl9DT0RFMDEsIChjdHgtPnBpY19wYXJhbXMtPmZfY29kZSA+PiAgOCkgJiAweDBGKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5GRV9QUFMxLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9GRV9QUFMxLCBGRV9GX0NPREUxMCwgKGN0eC0+cGljX3BhcmFtcy0+Zl9jb2RlID4+ICA0KSAmIDB4MEYpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkZFX1BQUzEsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzEsIEZFX0ZfQ09ERTExLCAoY3R4LT5waWNfcGFyYW1zLT5mX2NvZGUgPj4gIDApICYgMHgwRik7CgogICAgLyogVkVDIENvbnRyb2wgcmVnaXN0ZXI6IEJhY2stRW5kIE1QRUcyIFBQUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgY3R4LT5CRV9QUFMwID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9QUFMwLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9QUFMwLCBCRV9GUkFNRV9QUkVEX0ZSQU1FX0RDVCwgICAgISEoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5mcmFtZV9wcmVkX2ZyYW1lX2RjdCkpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkJFX1BQUzAsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0JFX1BQUzAsIEJFX0lOVFJBX0RDX1BSRUNJU0lPTiwgICAgICAgICAgIGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaW50cmFfZGNfcHJlY2lzaW9uKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9QUFMwLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9QUFMwLCBCRV9RX1NDQUxFX1RZUEUsICAgICAgICAgICAgISEoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5xX3NjYWxlX3R5cGUpKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9QUFMwLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9QUFMwLCBCRV9BTFRFUk5BVEVfU0NBTiwgICAgICAgICAgICAhIShjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmFsdGVybmF0ZV9zY2FuKSk7CgogICAgY3R4LT5CRV9QUFMxID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9QUFMxLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9QUFMxLCBCRV9GX0NPREUwMCwgKGN0eC0+cGljX3BhcmFtcy0+Zl9jb2RlID4+IDEyKSAmIDB4MEYpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPkJFX1BQUzEsIE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0JFX1BQUzEsIEJFX0ZfQ09ERTAxLCAoY3R4LT5waWNfcGFyYW1zLT5mX2NvZGUgPj4gIDgpICYgMHgwRik7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+QkVfUFBTMSwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfQkVfUFBTMSwgQkVfRl9DT0RFMTAsIChjdHgtPnBpY19wYXJhbXMtPmZfY29kZSA+PiAgNCkgJiAweDBGKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9QUFMxLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9QUFMxLCBCRV9GX0NPREUxMSwgKGN0eC0+cGljX3BhcmFtcy0+Zl9jb2RlID4+ICAwKSAmIDB4MEYpOwoKICAgIC8qIFZFQyBDb250cm9sIHJlZ2lzdGVyOiBCYWNrLUVuZCBNUEVHMiBQUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGN0eC0+QkVfUFBTMiA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+QkVfUFBTMiwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfQkVfUFBTMiwgQkVfUElDVFVSRV9DT0RJTkdfVFlQRSwgICAgICAgICAgIGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfdHlwZSk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+QkVfUFBTMiwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfQkVfUFBTMiwgQkVfVE9QX0ZJRUxEX0ZJUlNULCAgICAgICAgICAgICEhKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMudG9wX2ZpZWxkX2ZpcnN0KSk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+QkVfUFBTMiwgTVNWRFhfVkVDX01QRUcyLCBDUl9WRUNfTVBFRzJfQkVfUFBTMiwgQkVfQ09OQ0VBTE1FTlRfTU9USU9OX1ZFQ1RPUlMsICEhKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuY29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnMpKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5CRV9QUFMyLCBNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9CRV9QUFMyLCBCRV9QSUNUVVJFX1NUUlVDVFVSRSwgICAgICAgICAgICAgICBjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnBpY3R1cmVfc3RydWN0dXJlKTsKCiAgICBjdHgtPm9ial9jb250ZXh0LT5vcGVyYXRpbmdfbW9kZSA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+b2JqX2NvbnRleHQtPm9wZXJhdGluZ19tb2RlLCBNU1ZEWF9DTURTLCBPUEVSQVRJTkdfTU9ERSwgQ0hST01BX0lOVEVSTEVBVkVELCAwKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY3R4LT5vYmpfY29udGV4dC0+b3BlcmF0aW5nX21vZGUsIE1TVkRYX0NNRFMsIE9QRVJBVElOR19NT0RFLCBST1dfU1RSSURFLCBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQtPnBzYl9zdXJmYWNlLT5zdHJpZGVfbW9kZSk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+b2JqX2NvbnRleHQtPm9wZXJhdGluZ19tb2RlLCBNU1ZEWF9DTURTLCBPUEVSQVRJTkdfTU9ERSwgQ09ERUNfUFJPRklMRSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVBFRzIgcHJvZmlsZSAgICAgICAgICAgICovCiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGN0eC0+b2JqX2NvbnRleHQtPm9wZXJhdGluZ19tb2RlLCBNU1ZEWF9DTURTLCBPUEVSQVRJTkdfTU9ERSwgQ09ERUNfTU9ERSwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVBFRzIgbW9kZSAgICAgICAgICAgICAgICAqLwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPm9ial9jb250ZXh0LT5vcGVyYXRpbmdfbW9kZSwgTVNWRFhfQ01EUywgT1BFUkFUSU5HX01PREUsIEFTWU5DX01PREUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZETUMgb25seSAgICAgICAgICAgICAgICAqLwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjdHgtPm9ial9jb250ZXh0LT5vcGVyYXRpbmdfbW9kZSwgTVNWRFhfQ01EUywgT1BFUkFUSU5HX01PREUsIENIUk9NQV9GT1JNQVQsIDEpOwoKICAgIHBzYl9DaGVja0ludGVybGFjZVJvdGF0ZShjdHgtPm9ial9jb250ZXh0LCAodW5zaWduZWQgY2hhciopY3R4LT5waWNfcGFyYW1zKTsKICAgIHJldHVybiBWQV9TVEFUVVNfU1VDQ0VTUzsKfQoKc3RhdGljIHZvaWQgcHNiX19NUEVHMl9jb252ZXJ0X2lxX21hdHJpeCh1aW50MzJfdCAqZGVzdDMyLCB1bnNpZ25lZCBjaGFyICpzcmMpCnsKICAgIGludCBpOwogICAgaW50ICppZHggPSBzY2FuMDsKICAgIHVpbnQ4X3QgKmRlc3Q4ID0gKHVpbnQ4X3QqKSBkZXN0MzI7CgogICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgICAqZGVzdDgrKyA9IHNyY1sqaWR4KytdOwogICAgfQp9CgpzdGF0aWMgVkFTdGF0dXMgcHNiX19NUEVHMl9wcm9jZXNzX2lxX21hdHJpeChjb250ZXh0X01QRUcyX3AgY3R4LCBvYmplY3RfYnVmZmVyX3Agb2JqX2J1ZmZlcikKewogICAgVkFJUU1hdHJpeEJ1ZmZlck1QRUcyICppcV9tYXRyaXggPSAoVkFJUU1hdHJpeEJ1ZmZlck1QRUcyICopIG9ial9idWZmZXItPmJ1ZmZlcl9kYXRhOwogICAgQVNTRVJUKG9ial9idWZmZXItPnR5cGUgPT0gVkFJUU1hdHJpeEJ1ZmZlclR5cGUpOwogICAgQVNTRVJUKG9ial9idWZmZXItPm51bV9lbGVtZW50cyA9PSAxKTsKICAgIEFTU0VSVChvYmpfYnVmZmVyLT5zaXplID09IHNpemVvZihWQUlRTWF0cml4QnVmZmVyTVBFRzIpKTsKCiAgICBpZiAoKG9ial9idWZmZXItPm51bV9lbGVtZW50cyAhPSAxKSB8fAogICAgICAgIChvYmpfYnVmZmVyLT5zaXplICE9IHNpemVvZihWQUlRTWF0cml4QnVmZmVyTVBFRzIpKSkgewogICAgICAgIHJldHVybiBWQV9TVEFUVVNfRVJST1JfVU5LTk9XTjsKICAgIH0KCiAgICAvKiBPbmx5IHVwZGF0ZSB0aGUgcW1hdHJpeCBkYXRhIGlmIHRoZSBsb2FkIGZsYWcgaXMgc2V0ICovCiAgICBpZiAoaXFfbWF0cml4LT5sb2FkX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4KSB7CiAgICAgICAgcHNiX19NUEVHMl9jb252ZXJ0X2lxX21hdHJpeChjdHgtPnFtYXRyaXhfZGF0YVtOT05JTlRSQV9MVU1BX1FdLCBpcV9tYXRyaXgtPm5vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4KTsKICAgIH0KICAgIGlmIChpcV9tYXRyaXgtPmxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCkgewogICAgICAgIHBzYl9fTVBFRzJfY29udmVydF9pcV9tYXRyaXgoY3R4LT5xbWF0cml4X2RhdGFbSU5UUkFfTFVNQV9RXSwgaXFfbWF0cml4LT5pbnRyYV9xdWFudGlzZXJfbWF0cml4KTsKICAgIH0KICAgIC8qIFdlIGlnbm9yZSB0aGUgQ2hyb21hIHRhYmxlcyBiZWNhdXNlIHRob3NlIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggVkFfUlRfRk9STUFUX1lVVjQyMCAqLwogICAgY3R4LT5nb3RfaXFfbWF0cml4ID0gVFJVRTsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qIFByZWNhbGN1bGF0ZWQgdmFsdWVzICovCiNkZWZpbmUgQUREUjAgICAgICAgKDB4MDAwMDYwMDApCiNkZWZpbmUgQUREUjEgICAgICAgKDB4MDAwM2YwMTcpCiNkZWZpbmUgQUREUjIgICAgICAgKDB4MDAwYWIwZTUpCiNkZWZpbmUgQUREUjMgICAgICAgKDB4MDAwMDAxNmUpCiNkZWZpbmUgV0lEVEgwICAgICAgKDB4MDAxNmM2ZWQpCiNkZWZpbmUgT1BDT0RFMCAgICAgKDB4MDAwMDI4MDUpCgpzdGF0aWMgdm9pZCBwc2JfX01QRUcyX3dyaXRlX1ZMQ190YWJsZXMoY29udGV4dF9NUEVHMl9wIGN0eCkKewogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKCiAgICBwc2JfY21kYnVmX3NraXBfc3RhcnRfYmxvY2soY21kYnVmLCBTS0lQX09OX0NPTlRFWFRfU1dJVENIKTsKICAgIC8qIFZMQyBUYWJsZSAqLwogICAgLyogV3JpdGUgYSBMTERNQSBDbWQgdG8gdHJhbnNmZXIgVkxEIFRhYmxlIGRhdGEgKi8KICAgIHBzYl9jbWRidWZfZG1hX3dyaXRlX2NtZGJ1ZihjbWRidWYsICZjdHgtPnZsY19wYWNrZWRfdGFibGUsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZ2F1aTE2bXBlZzJWbGNUYWJsZURhdGFQYWNrZWQpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX1RZUEVfVkxDX1RBQkxFKTsKCiAgICAvKiBXcml0ZSB0aGUgdmVjIHJlZ2lzdGVycyB3aXRoIHRoZSBpbmRleCBkYXRhIGZvciBlYWNoIG9mIHRoZSB0YWJsZXMgYW5kIHRoZW4gd3JpdGUgICAgKi8KICAgIC8qIHRoZSBhY3R1YWwgdGFibGUgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHBzYl9jbWRidWZfcmVnX3N0YXJ0X2Jsb2NrKGNtZGJ1ZiwgMCk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIwKSwgICAgICAgICAgICBBRERSMCk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIxKSwgICAgICAgICAgICBBRERSMSk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIyKSwgICAgICAgICAgICBBRERSMik7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0FERFIzKSwgICAgICAgICAgICBBRERSMyk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfVkVDLCBDUl9WRUNfVkxDX1RBQkxFX0lOSVRJQUxfV0lEVEgwKSwgICAgV0lEVEgwKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUMsIENSX1ZFQ19WTENfVEFCTEVfSU5JVElBTF9PUENPREUwKSwgT1BDT0RFMCk7CiAgICBwc2JfY21kYnVmX3JlZ19lbmRfYmxvY2soY21kYnVmKTsKCiAgICBwc2JfY21kYnVmX3NraXBfZW5kX2Jsb2NrKGNtZGJ1Zik7Cn0KCnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfc2V0X29wZXJhdGluZ19tb2RlKGNvbnRleHRfTVBFRzJfcCBjdHgpCnsKICAgIHBzYl9jbWRidWZfcCBjbWRidWYgPSBjdHgtPm9ial9jb250ZXh0LT5jbWRidWY7CiAgICBwc2Jfc3VyZmFjZV9wIHRhcmdldF9zdXJmYWNlID0gY3R4LT5vYmpfY29udGV4dC0+Y3VycmVudF9yZW5kZXJfdGFyZ2V0LT5wc2Jfc3VyZmFjZTsKCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgRElTUExBWV9QSUNUVVJFX1NJWkUpKTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY3R4LT5kaXNwbGF5X3BpY3R1cmVfc2l6ZSk7CiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGN0eC0+Y29kZWRfcGljdHVyZV9zaXplKTsKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY3R4LT5vYmpfY29udGV4dC0+b3BlcmF0aW5nX21vZGUpOwoKICAgIC8qIExVTUFfUkVDT05TVFJVQ1RFRF9QSUNUVVJFX0JBU0VfQUREUkVTU0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICAvKiBDSFJPTUFfUkVDT05TVFJVQ1RFRF9QSUNUVVJFX0JBU0VfQUREUkVTU0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzICsgdGFyZ2V0X3N1cmZhY2UtPmNocm9tYV9vZmZzZXQpOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX2VuZChjbWRidWYpOwoKICAgIHZsZF9kZWNfc2V0dXBfYWx0ZXJuYXRpdmVfZnJhbWUoY3R4LT5vYmpfY29udGV4dCk7Cgp9CgpzdGF0aWMgdm9pZCBwc2JfX01QRUcyX3NldF9yZWZlcmVuY2VfcGljdHVyZXMoY29udGV4dF9NUEVHMl9wIGN0eCkKewogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKICAgIHBzYl9zdXJmYWNlX3AgdGFyZ2V0X3N1cmZhY2UgPSBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQtPnBzYl9zdXJmYWNlOwoKICAgIGlmIChjdHgtPnNsaWNlX2NvdW50ICE9IDApIHsKICAgICAgICBwc2JfY21kYnVmX3NraXBfc3RhcnRfYmxvY2soY21kYnVmLCBTS0lQX09OX0NPTlRFWFRfU1dJVENIKTsKICAgIH0KICAgIHBzYl9jbWRidWZfcmVuZGVjX3N0YXJ0KGNtZGJ1ZiwgUkVOREVDX1JFR0lTVEVSX09GRlNFVChNU1ZEWF9DTURTLCBSRUZFUkVOQ0VfUElDVFVSRV9CQVNFX0FERFJFU1NFUykpOwoKICAgIC8qIEluIE1QRUcyLCB0aGUgcmVnaXN0ZXJzIGF0IE49MCBhcmUgYWx3YXlzIHVzZWQgdG8gc3RvcmUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbHVtYSBhbmQgY2hyb21hIGJ1ZmZlcnMKICAgICAgICBvZiB0aGUgbW9zdCByZWNlbnRseSBkZWNvZGVkIHJlZmVyZW5jZSBwaWN0dXJlLiBUaGUgcmVnaXN0ZXJzIGF0IE49MSBhcmUgdXNlZCB0byBzdG9yZSB0aGUgYmFzZSBhZGRyZXNzCiAgICAgICAgb2YgdGhlIGx1bWEgYW5kIGNocm9tYSBidWZmZXJzIG9mIHRoZSBvbGRlciByZWZlcmVuY2UgcGljdHVyZSwgaWYgbW9yZSB0aGFuIG9uZSByZWZlcmVuY2UgcGljdHVyZSBpcyB1c2VkLgogICAgICAgIFRoaXMgbWVhbnMgdGhhdCB3aGVuIGRlY29kaW5nIGEgUCBwaWN0dXJlIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBwaWN0dXJlknMgYWRkcmVzcyBpcyBhdCBpbmRleCAwLgogICAgICAgIFdoZW4gZGVjb2RpbmcgYSBCLXBpY3R1cmUgdGhlIGJhY2t3YXJkIHJlZmVyZW5jZSBwaWN0dXJlknMgYWRkcmVzcyBpcyBhdCBpbmRleCAwIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKICAgICAgICBmb3J3YXJkIHJlZmVyZW5jZSBwaWN0dXJlIJYgd2hpY2ggd2FzIGRlY29kZWQgZWFybGllciB0aGFuIHRoZSBiYWNrd2FyZCByZWZlcmVuY2UgliBpcyBhdCBpbmRleCAxLgogICAgKi8KCiAgICBzd2l0Y2ggKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfdHlwZSkgewogICAgY2FzZSBQSUNUVVJFX0NPRElOR19JOgogICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIiAgICBJLUZyYW1lXG4iKTsKICAgICAgICAvKiBObyByZWZlcmVuY2UgcGljdHVyZXMgKi8KICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIDApOwogICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgMCk7CiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCAwKTsKICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIDApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUElDVFVSRV9DT0RJTkdfUDoKICAgICAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICIgICAgUC1GcmFtZVxuIik7CiAgICAgICAgaWYgKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaXNfZmlyc3RfZmllbGQpIHsKICAgICAgICAgICAgLyogZm9yd2FyZCByZWZlcmVuY2UgcGljdHVyZSAqLwogICAgICAgICAgICAvKiBMVU1BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAqLwogICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZV9hZGRyZXNzKGNtZGJ1ZiwgJmN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZiwgY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLmJ1ZmZlcl9vZnMpOwoKICAgICAgICAgICAgLyogQ0hST01BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAqLwogICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZV9hZGRyZXNzKGNtZGJ1ZiwgJmN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZiwgIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2VcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5idWYuYnVmZmVyX29mcyArIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmNocm9tYV9vZmZzZXQpOwoKICAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVmZXJlbmNlIHBpY3R1cmUgKi8KICAgICAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCAwKTsKICAgICAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBiYWNrd2FyZCByZWZlcmVuY2UgcGljdHVyZSAqLwogICAgICAgICAgICAvKiBMVU1BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICAgICAgICAgIC8qIENIUk9NQV9SRUNPTlNUUlVDVEVEX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZV9hZGRyZXNzKGNtZGJ1ZiwgJnRhcmdldF9zdXJmYWNlLT5idWYsIHRhcmdldF9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyArIHRhcmdldF9zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0KTsKCiAgICAgICAgICAgIC8qIGZvcndhcmQgcmVmZXJlbmNlIHBpY3R1cmUgKi8KICAgICAgICAgICAgLyogTFVNQV9SRUNPTlNUUlVDVEVEX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZV9hZGRyZXNzKGNtZGJ1ZiwgJmN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZiwgY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLmJ1ZmZlcl9vZnMpOwoKICAgICAgICAgICAgLyogQ0hST01BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLCBjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyArIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmNocm9tYV9vZmZzZXQpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFBJQ1RVUkVfQ09ESU5HX0I6CiAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiICAgIEItRnJhbWVcbiIpOwogICAgICAgIC8qIGJhY2t3YXJkIHJlZmVyZW5jZSBwaWN0dXJlICovCiAgICAgICAgLyogTFVNQV9SRUNPTlNUUlVDVEVEX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlX2FkZHJlc3MoY21kYnVmLCAmY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1ZiwgY3R4LT5iYWNrd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICAgICAgLyogQ0hST01BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLCBjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+YnVmLmJ1ZmZlcl9vZnMgKyBjdHgtPmJhY2t3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+Y2hyb21hX29mZnNldCk7CgogICAgICAgIC8qIGZvcndhcmQgcmVmZXJlbmNlIHBpY3R1cmUgKi8KICAgICAgICAvKiBMVU1BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlLT5idWYsIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICAgICAgLyogQ0hST01BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGVfYWRkcmVzcyhjbWRidWYsICZjdHgtPmZvcndhcmRfcmVmX3N1cmZhY2UtPnBzYl9zdXJmYWNlLT5idWYsIGN0eC0+Zm9yd2FyZF9yZWZfc3VyZmFjZS0+cHNiX3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzICsgY3R4LT5mb3J3YXJkX3JlZl9zdXJmYWNlLT5wc2Jfc3VyZmFjZS0+Y2hyb21hX29mZnNldCk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfZW5kKGNtZGJ1Zik7CgogICAgaWYgKGN0eC0+c2xpY2VfY291bnQgIT0gMCkgewogICAgICAgIHBzYl9jbWRidWZfc2tpcF9lbmRfYmxvY2soY21kYnVmKTsKICAgIH0KfQoKc3RhdGljIHZvaWQgcHNiX19NUEVHMl9zZXRfcGljdHVyZV9oZWFkZXIoY29udGV4dF9NUEVHMl9wIGN0eCwgVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUcyICpzbGljZV9wYXJhbSkKewogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKICAgIHBzYl9zdXJmYWNlX3AgdGFyZ2V0X3N1cmZhY2UgPSBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQtPnBzYl9zdXJmYWNlOwogICAgdWludDMyX3QgRkVfc2xpY2U7CiAgICB1aW50MzJfdCBCRV9zbGljZTsKCiAgICBwc2JfY21kYnVmX3JlZ19zdGFydF9ibG9jayhjbWRidWYsIDApOwoKICAgIC8qIFZFQyBDb250cm9sIHJlZ2lzdGVyOiBGcm9udC1FbmQgTVBFRzIgUFBTMCAqLwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQ19NUEVHMiwgQ1JfVkVDX01QRUcyX0ZFX1BQUzApICwgY3R4LT5GRV9QUFMwKTsKCiAgICAvKiBWRUMgQ29udHJvbCByZWdpc3RlcjogRnJvbnQtRW5kIE1QRUcyIFBQUzEgKi8KICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9GRV9QUFMxKSAsIGN0eC0+RkVfUFBTMSk7CgogICAgLyogU2xpY2UgbGV2ZWwgKi8KICAgIEZFX3NsaWNlID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKEZFX3NsaWNlLAogICAgICAgICAgICAgICAgICAgICAgTVNWRFhfVkVDX01QRUcyLAogICAgICAgICAgICAgICAgICAgICAgQ1JfVkVDX01QRUcyX0ZFX1NMSUNFLAogICAgICAgICAgICAgICAgICAgICAgRkVfRklSU1RfSU5fUk9XLAogICAgICAgICAgICAgICAgICAgICAgKGN0eC0+cHJldmlvdXNfc2xpY2VfdmVydGljYWxfcG9zaXRpb24gIT0gc2xpY2VfcGFyYW0tPnNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uKSk7CgogICAgUkVHSU9fV1JJVEVfRklFTEQoRkVfc2xpY2UsCiAgICAgICAgICAgICAgICAgICAgICBNU1ZEWF9WRUNfTVBFRzIsCiAgICAgICAgICAgICAgICAgICAgICBDUl9WRUNfTVBFRzJfRkVfU0xJQ0UsCiAgICAgICAgICAgICAgICAgICAgICBGRV9TTElDRV9WRVJUSUNBTF9QT1NJVElPTl9NSU5VUzEsCiAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24pOwoKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKEZFX3NsaWNlLAogICAgICAgICAgICAgICAgICAgICAgTVNWRFhfVkVDX01QRUcyLAogICAgICAgICAgICAgICAgICAgICAgQ1JfVkVDX01QRUcyX0ZFX1NMSUNFLAogICAgICAgICAgICAgICAgICAgICAgRkVfUVVBTlRJU0VSX1NDQUxFX0NPREUsCiAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS0+cXVhbnRpc2VyX3NjYWxlX2NvZGUpOwoKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9GRV9TTElDRSkgLCBGRV9zbGljZSk7CgogICAgRkVfc2xpY2UgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShGRV9zbGljZSwKICAgICAgICAgICAgICAgICAgICAgIE1TVkRYX1ZFQ19NUEVHMiwKICAgICAgICAgICAgICAgICAgICAgIENSX1ZFQ19NUEVHMl9GRV9TUFMwLAogICAgICAgICAgICAgICAgICAgICAgRkVfSE9SSVpPTlRBTF9TSVpFX01JTlVTMSwKICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGljdHVyZV93aWR0aF9tYiAtIDEpOwoKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUNfTVBFRzIsIENSX1ZFQ19NUEVHMl9GRV9TUFMwKSAsIEZFX3NsaWNlKTsKCiAgICBwc2JfY21kYnVmX3JlZ19lbmRfYmxvY2soY21kYnVmKTsKCgogICAgLyogQkUgU2VjdGlvbiAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfc3RhcnQoY21kYnVmLCBSRU5ERUNfUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgTVBFRzJfQ1JfVkVDX01QRUcyX0JFX1NQUzApKTsKCiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGN0eC0+QkVfU1BTMCk7CiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGN0eC0+QkVfU1BTMSk7CiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGN0eC0+QkVfUFBTMCk7ICAgLyogVkVDIENvbnRyb2wgcmVnaXN0ZXI6IEJhY2stRW5kIE1QRUcyIFBQUzAgKi8KICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY3R4LT5CRV9QUFMxKTsgICAvKiBWRUMgQ29udHJvbCByZWdpc3RlcjogQmFjay1FbmQgTVBFRzIgUFBTMSAqLwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjdHgtPkJFX1BQUzIpOyAgIC8qIFZFQyBDb250cm9sIHJlZ2lzdGVyOiBCYWNrLUVuZCBNUEVHMiBQUFMyICovCgogICAgQkVfc2xpY2UgPSAwOwogICAgaWYgKCFjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmlzX2ZpcnN0X2ZpZWxkKSB7CiAgICAgICAgLyoKICAgICAgICAgICAgQkVfSVBfUEFJUl9GTEFHIGlzIDEgaWYgdGhlIGN1cnJlbnQgcGljdHVyZV9kYXRhIGlzIGEgUC1jb2RlZCBmaWVsZCB3aGljaCBpcyB0aGUgMm5kIGZpZWxkIG9mIGEgZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB3aGljaCB1c2VzIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgZnJhbWUgKHdoaWNoIHdhcyBJLWNvZGVkKSBhcyBhIHJlZmVyZW5jZS4gMCBvdGhlcndpc2UuCiAgICAgICAgICAgIEJFX0lQX1BBSVJfRkxBRyB3aWxsIG9ubHkgYmUgMSBpZiBCRV9TRUNPTkRfRklFTERfRkxBRyBpcyAxLCBhbmQgdGhlIGNvbmRpdGlvbgogICAgICAgICAgICAgICAgb2YgInRoaXMgaXMgYSBQLWZpZWxkIHdoaWNoIHVzZXMgdGhlIGFjY29tcGFueWluZyBJLWZpZWxkIGFzIGEgcmVmZXJlbmNlIiBpcyBtZXQuCiAgICAgICAgKi8KICAgICAgICBpZiAoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ190eXBlID09IFBJQ1RVUkVfQ09ESU5HX1ApIHsKICAgICAgICAgICAgaWYgKEdFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9jb2RpbmdfdHlwZSh0YXJnZXRfc3VyZmFjZSkgPT0gUElDVFVSRV9DT0RJTkdfSSkgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKEJFX3NsaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1ZEWF9WRUNfTVBFRzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSX1ZFQ19NUEVHMl9CRV9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfSVBfUEFJUl9GTEFHLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgUkVHSU9fV1JJVEVfRklFTERfTElURShCRV9zbGljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVkRYX1ZFQ19NUEVHMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSX1ZFQ19NUEVHMl9CRV9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFX1NFQ09ORF9GSUVMRF9GTEFHLCAgICAgMSk7CgogICAgfSBlbHNlIHsKICAgICAgICAvLyBCRV9JUF9QQUlSX0ZMQUcgPSAwOwogICAgICAgIC8vIEJFX1NFQ09ORF9GSUVMRF9GTEFHID0gMDsKCiAgICAgICAgLyogIFVwZGF0ZSB3aXRoIGN1cnJlbnQgc2V0dGluZ3MgZmlyc3QgZmllbGQgKi8KICAgICAgICBTRVRfU1VSRkFDRV9JTkZPX2lzX2RlZmluZWQodGFyZ2V0X3N1cmZhY2UsIFRSVUUpOwogICAgICAgIFNFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9zdHJ1Y3R1cmUodGFyZ2V0X3N1cmZhY2UsIGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmUpOwogICAgICAgIFNFVF9TVVJGQUNFX0lORk9fcGljdHVyZV9jb2RpbmdfdHlwZSh0YXJnZXRfc3VyZmFjZSwgY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ190eXBlKTsKICAgIH0KCiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKEJFX3NsaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNU1ZEWF9WRUNfTVBFRzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENSX1ZFQ19NUEVHMl9CRV9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfRklSU1RfSU5fUk9XLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5wcmV2aW91c19zbGljZV92ZXJ0aWNhbF9wb3NpdGlvbiAhPSBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24pKTsKCiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKEJFX3NsaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNU1ZEWF9WRUNfTVBFRzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENSX1ZFQ19NUEVHMl9CRV9TTElDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVfU0xJQ0VfVkVSVElDQUxfUE9TSVRJT05fTUlOVVMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24pOwoKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoQkVfc2xpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVkRYX1ZFQ19NUEVHMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JfVkVDX01QRUcyX0JFX1NMSUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCRV9RVUFOVElTRVJfU0NBTEVfQ09ERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfcGFyYW0tPnF1YW50aXNlcl9zY2FsZV9jb2RlKTsKCiAgICBkcnZfZGVidWdfbXNnKFZJREVPX0RFQlVHX0dFTkVSQUwsICJCRV9zbGljZSA9ICUwOHggZmlyc3RfZmllbGQgPSAlZFxuIiwgQkVfc2xpY2UsIGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaXNfZmlyc3RfZmllbGQpOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgQkVfc2xpY2UpOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX2VuZChjbWRidWYpOwoKICAgIGN0eC0+cHJldmlvdXNfc2xpY2VfdmVydGljYWxfcG9zaXRpb24gPSBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb247Cn0KCnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfc2V0X3NsaWNlX3BhcmFtcyhjb250ZXh0X01QRUcyX3AgY3R4KQp7CiAgICBwc2JfY21kYnVmX3AgY21kYnVmID0gY3R4LT5vYmpfY29udGV4dC0+Y21kYnVmOwoKICAgIHVpbnQzMl90IGNtZF9kYXRhOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX3N0YXJ0KGNtZGJ1ZiwgUkVOREVDX1JFR0lTVEVSX09GRlNFVChNU1ZEWF9DTURTLCBTTElDRV9QQVJBTVMpKTsKCiAgICBjbWRfZGF0YSA9IDA7ICAgIC8qIEJ1aWxkIHNsaWNlIHBhcmFtZXRlcnMgKi8KICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgTVNWRFhfQ01EUywKICAgICAgICAgICAgICAgICAgICAgIFNMSUNFX1BBUkFNUywKICAgICAgICAgICAgICAgICAgICAgIFNMSUNFX0ZJRUxEX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnBpY3R1cmVfc3RydWN0dXJlIC0gMSk7CgogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICBNU1ZEWF9DTURTLAogICAgICAgICAgICAgICAgICAgICAgU0xJQ0VfUEFSQU1TLAogICAgICAgICAgICAgICAgICAgICAgU0xJQ0VfQ09ERV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgUElDVFVSRV9DT0RJTkdfRCA9PSBjdHgtPnBpY19wYXJhbXMtPnBpY3R1cmVfY29kaW5nX3R5cGUgPyAwIDogY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ190eXBlIC0gMSk7CgogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWRfZGF0YSk7CgogICAgKmN0eC0+ZGVjX2N0eC5wX3NsaWNlX3BhcmFtcyA9IGNtZF9kYXRhOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX2VuZChjbWRidWYpOwp9CgpzdGF0aWMgdm9pZCBwc2JfX01QRUcyX3dyaXRlX3FtYXRyaWNlcyhjb250ZXh0X01QRUcyX3AgY3R4KQp7CiAgICBwc2JfY21kYnVmX3AgY21kYnVmID0gY3R4LT5vYmpfY29udGV4dC0+Y21kYnVmOwogICAgaW50IGk7CgogICAgLyogU2luY2Ugd2Ugb25seSBkZWNvZGUgNDoyOjAgV2Ugb25seSBuZWVkIHRvIHRoZSBJbnRyYSB0YWJsZXMuCiAgICBDaHJvbWEgcXVhbnQgdGFibGVzIGFyZSBvbmx5IHVzZWQgaW4gTXBlZyA0OjI6MiBhbmQgNDo0OjQuCiAgICBUaGUgaGFyZHdhcmUgd2FudHMgbm9uLWludHJhIGZvbGxvd2VkIGJ5IGludHJhICovCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFR19NU1ZEWF9WRUNfSVFSQU1fT0ZGU0VUKTsKCiAgICAvKiB0b2RvIDogb3B0aW1pc2F0aW9uIGhlcmUgaXMgdG8gb25seSBsb2FkIHRoZSBuZWVkIHRhYmxlICovCgogICAgLyogIE5PTklOVFJBX0xVTUFfUSAtLT4gUkVHX01TVkRYX1ZFQ19JUVJBTV9PRkZTRVQgKyAwICovCiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgIHBzYl9jbWRidWZfcmVuZGVjX3dyaXRlKGNtZGJ1ZiwgY3R4LT5xbWF0cml4X2RhdGFbTk9OSU5UUkFfTFVNQV9RXVtpXSk7Ci8vIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgIk5PTklOVFJBX0xVTUFfUVtpXSA9ICUwOHhcbiIsIGN0eC0+cW1hdHJpeF9kYXRhW05PTklOVFJBX0xVTUFfUV1baV0pOwogICAgfQogICAgLyogIElOVFJBX0xVTUFfUSAtLT4gUkVHX01TVkRYX1ZFQ19JUVJBTV9PRkZTRVQgKyAoMTYqNCkgKi8KICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjdHgtPnFtYXRyaXhfZGF0YVtJTlRSQV9MVU1BX1FdW2ldKTsKLy8gZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAiSU5UUkFfTFVNQV9RW2ldID0gJTA4eFxuIiwgY3R4LT5xbWF0cml4X2RhdGFbSU5UUkFfTFVNQV9RXVtpXSk7CiAgICB9CgogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfZW5kKGNtZGJ1Zik7Cn0KCnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfc2V0X2VudF9kZWMoY29udGV4dF9NUEVHMl9wIGN0eCkKewogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKCiAgICB1aW50MzJfdCBjbWRfZGF0YTsKCiAgICBwc2JfY21kYnVmX3JlZ19zdGFydF9ibG9jayhjbWRidWYsIDApOwoKICAgIGNtZF9kYXRhID0gMDsgICAgIC8qIEVudGRlYyBGcm9udC1FbmQgY29udHJvbHMgICAgKi8KICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY21kX2RhdGEsIE1TVkRYX1ZFQywgIENSX1ZFQ19FTlRERUNfRkVfQ09OVFJPTCwgIEVOVERFQ19GRV9QUk9GSUxFLCAxKTsgLyogTVBFRzIgTWFpbiBQcm9maWxlICovCiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGNtZF9kYXRhLCBNU1ZEWF9WRUMsICBDUl9WRUNfRU5UREVDX0ZFX0NPTlRST0wsICBFTlRERUNfRkVfTU9ERSwgICAgICAgMyk7IC8qIFNldCBNUEVHMiBtb2RlICovCgogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX1ZFQywgQ1JfVkVDX0VOVERFQ19GRV9DT05UUk9MKSwgY21kX2RhdGEpOwoKICAgIHBzYl9jbWRidWZfcmVnX2VuZF9ibG9jayhjbWRidWYpOwoKICAgIHBzYl9jbWRidWZfcmVuZGVjX3N0YXJ0KGNtZGJ1ZiwgUkVOREVDX1JFR0lTVEVSX09GRlNFVChNU1ZEWF9WRUMsIENSX1ZFQ19FTlRERUNfQkVfQ09OVFJPTCkpOwoKICAgIGNtZF9kYXRhID0gMDsgICAgIC8qIEVudGRlYyBCYWNrLUVuZCBjb250cm9scyAgICAqLwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICBNU1ZEWF9WRUMsCiAgICAgICAgICAgICAgICAgICAgICBDUl9WRUNfRU5UREVDX0JFX0NPTlRST0wsCiAgICAgICAgICAgICAgICAgICAgICBFTlRERUNfQkVfUFJPRklMRSwKICAgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTVBFRzIgTWFpbiBQcm9maWxlICAgICAgICAqLwoKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgTVNWRFhfVkVDLAogICAgICAgICAgICAgICAgICAgICAgQ1JfVkVDX0VOVERFQ19CRV9DT05UUk9MLAogICAgICAgICAgICAgICAgICAgICAgRU5UREVDX0JFX01PREUsCiAgICAgICAgICAgICAgICAgICAgICAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBNUEVHMiBtb2RlICAgICAgICAgICAgKi8KCiAgICBwc2JfY21kYnVmX3JlbmRlY193cml0ZShjbWRidWYsIGNtZF9kYXRhKTsKCiAgICBwc2JfY21kYnVmX3JlbmRlY19lbmQoY21kYnVmKTsKCiAgICBwc2JfY21kYnVmX3JlbmRlY19zdGFydChjbWRidWYsIFJFTkRFQ19SRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgTUNfQ0FDSEVfQ09ORklHVVJBVElPTikpOwogICAgY21kX2RhdGEgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjbWRfZGF0YSwgTVNWRFhfQ01EUywgTUNfQ0FDSEVfQ09ORklHVVJBVElPTiwgQ09ORklHX1JFRl9PRkZTRVQsIENBQ0hFX1JFRl9PRkZTRVQpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjbWRfZGF0YSwgTVNWRFhfQ01EUywgTUNfQ0FDSEVfQ09ORklHVVJBVElPTiwgQ09ORklHX1JPV19PRkZTRVQsIENBQ0hFX1JPV19PRkZTRVQpOwogICAgcHNiX2NtZGJ1Zl9yZW5kZWNfd3JpdGUoY21kYnVmLCBjbWRfZGF0YSk7CiAgICBwc2JfY21kYnVmX3JlbmRlY19lbmQoY21kYnVmKTsKCn0KCnN0YXRpYyB2b2lkIHBzYl9fTVBFRzJfYmVnaW5fc2xpY2UoY29udGV4dF9ERUNfcCBkZWNfY3R4LCBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyQmFzZSAqdmxkX3NsaWNlX3BhcmFtKQp7CiAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKnNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqKSB2bGRfc2xpY2VfcGFyYW07CiAgICBjb250ZXh0X01QRUcyX3AgY3R4ID0gKGNvbnRleHRfTVBFRzJfcClkZWNfY3R4OwoKICAgIHBzYl9fTVBFRzJfd3JpdGVfVkxDX3RhYmxlcyhjdHgpOwoKICAgIGRlY19jdHgtPmJpdHNfb2Zmc2V0ID0gc2xpY2VfcGFyYW0tPm1hY3JvYmxvY2tfb2Zmc2V0OwogICAgZGVjX2N0eC0+U1JfZmxhZ3MgPSBDTURfU1JfVkVSSUZZX1NUQVJUQ09ERTsKfQpzdGF0aWMgdm9pZCBwc2JfX01QRUcyX3Byb2Nlc3Nfc2xpY2VfZGF0YShjb250ZXh0X0RFQ19wIGRlY19jdHgsIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJCYXNlICp2bGRfc2xpY2VfcGFyYW0pCnsKICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUcyICopIHZsZF9zbGljZV9wYXJhbTsKICAgIGNvbnRleHRfTVBFRzJfcCBjdHggPSAoY29udGV4dF9NUEVHMl9wKWRlY19jdHg7CgogICAgY3R4LT5vYmpfY29udGV4dC0+Zmlyc3RfbWIgPSAwOwogICAgY3R4LT5vYmpfY29udGV4dC0+Zmlyc3RfbWIgPSBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24gPDwgODsKCiAgICBwc2JfX01QRUcyX3NldF9vcGVyYXRpbmdfbW9kZShjdHgpOwogICAgcHNiX19NUEVHMl9zZXRfcmVmZXJlbmNlX3BpY3R1cmVzKGN0eCk7CiAgICBwc2JfX01QRUcyX3NldF9waWN0dXJlX2hlYWRlcihjdHgsIHNsaWNlX3BhcmFtKTsKICAgIHBzYl9fTVBFRzJfc2V0X3NsaWNlX3BhcmFtcyhjdHgpOwogICAgcHNiX19NUEVHMl93cml0ZV9xbWF0cmljZXMoY3R4KTsKICAgIHBzYl9fTVBFRzJfc2V0X2VudF9kZWMoY3R4KTsKfQoKc3RhdGljIHZvaWQgcHNiX19NUEVHMl9lbmRfc2xpY2UoY29udGV4dF9ERUNfcCBkZWNfY3R4KQp7CiAgICBjb250ZXh0X01QRUcyX3AgY3R4ID0gKGNvbnRleHRfTVBFRzJfcClkZWNfY3R4OwogICAgY3R4LT5vYmpfY29udGV4dC0+ZmxhZ3MgPSBGV19WQV9SRU5ERVJfSVNfVkxEX05PVF9NQzsKCiAgICBpZiAoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5wcm9ncmVzc2l2ZV9mcmFtZSkKICAgICAgICBjdHgtPm9ial9jb250ZXh0LT5sYXN0X21iID0gKChjdHgtPnBpY3R1cmVfaGVpZ2h0X21iIC0gMSkgPDwgOCkgfCAoY3R4LT5waWN0dXJlX3dpZHRoX21iIC0gMSk7CiAgICBlbHNlCiAgICAgICAgY3R4LT5vYmpfY29udGV4dC0+bGFzdF9tYiA9ICgoY3R4LT5waWN0dXJlX2hlaWdodF9tYiAvIDIgLSAxKSA8PCA4KSB8IChjdHgtPnBpY3R1cmVfd2lkdGhfbWIgLSAxKTsKCiAgICAqKGN0eC0+ZGVjX2N0eC5zbGljZV9maXJzdF9waWNfbGFzdCkgPSAoY3R4LT5vYmpfY29udGV4dC0+Zmlyc3RfbWIgPDwgMTYpIHwgKGN0eC0+b2JqX2NvbnRleHQtPmxhc3RfbWIpOwoKICAgIGN0eC0+c2xpY2VfY291bnQrKzsKfQoKc3RhdGljIHZvaWQgcHNiX19NRVBHMl9zZW5kX2hpZ2hsZXZlbF9jbWQoY29udGV4dF9NUEVHMl9wIGN0eCkKewogICAgdWludDMyX3QgY21kOwogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKICAgIHBzYl9zdXJmYWNlX3AgdGFyZ2V0X3N1cmZhY2UgPSBjdHgtPm9ial9jb250ZXh0LT5jdXJyZW50X3JlbmRlcl90YXJnZXQtPnBzYl9zdXJmYWNlOwogICAgcHNiX3N1cmZhY2VfcCByb3RhdGVfc3VyZmFjZSA9IGN0eC0+b2JqX2NvbnRleHQtPmN1cnJlbnRfcmVuZGVyX3RhcmdldC0+b3V0X2xvb3Bfc3VyZmFjZTsKCiAgICBwc2JfY21kYnVmX3JlZ19zdGFydF9ibG9jayhjbWRidWYsIDApOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX0NNRFMsIERJU1BMQVlfUElDVFVSRV9TSVpFKSwgY3R4LT5kaXNwbGF5X3BpY3R1cmVfc2l6ZSk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXQoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgQ09ERURfUElDVFVSRV9TSVpFKSwgY3R4LT5jb2RlZF9waWN0dXJlX3NpemUpOwoKICAgIGNtZCA9IDA7CiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX0NNRFMsIE9QRVJBVElOR19NT0RFLCBDSFJPTUFfRk9STUFULCAxKTsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEKGNtZCwgTVNWRFhfQ01EUywgT1BFUkFUSU5HX01PREUsIEFTWU5DX01PREUsIDEpOyAvLyAwID0gVkRNQyBhbmQgVkRFQiBhY3RpdmUuICAxID0gVkRFQiBwYXNzLXRocnUuCiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX0NNRFMsIE9QRVJBVElOR19NT0RFLCBDT0RFQ19NT0RFLCAzKTsgICAgICAgIC8vIE1QRUcyCiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX0NNRFMsIE9QRVJBVElOR19NT0RFLCBDT0RFQ19QUk9GSUxFLCAxKTsgLy8gTUFJTgogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9DTURTLCBPUEVSQVRJTkdfTU9ERSwgUk9XX1NUUklERSwgdGFyZ2V0X3N1cmZhY2UtPnN0cmlkZV9tb2RlKTsKICAgIHBzYl9jbWRidWZfcmVnX3NldChjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9DTURTLCBPUEVSQVRJTkdfTU9ERSksIGNtZCk7CgogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0X1JFTE9DKGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX0NNRFMsIExVTUFfUkVDT05TVFJVQ1RFRF9QSUNUVVJFX0JBU0VfQUREUkVTU0VTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICBwc2JfY21kYnVmX3JlZ19zZXRfUkVMT0MoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgQ0hST01BX1JFQ09OU1RSVUNURURfUElDVFVSRV9CQVNFX0FERFJFU1NFUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldF9zdXJmYWNlLT5idWYsIHRhcmdldF9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyArIHRhcmdldF9zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0KTsKCiAgICBwc2JfY21kYnVmX3JlZ19zZXRfUkVMT0MoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgUkVGRVJFTkNFX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMpICsgKDAgKiA4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICBwc2JfY21kYnVmX3JlZ19zZXRfUkVMT0MoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgUkVGRVJFTkNFX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMpICsgNCArICgwICogOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldF9zdXJmYWNlLT5idWYsIHRhcmdldF9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyArIHRhcmdldF9zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0KTsKCiAgICBwc2JfY21kYnVmX3JlZ19zZXRfUkVMT0MoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgUkVGRVJFTkNFX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMpICsgKDEgKiA4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0X3N1cmZhY2UtPmJ1ZiwgdGFyZ2V0X3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzKTsKCiAgICBwc2JfY21kYnVmX3JlZ19zZXRfUkVMT0MoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgUkVGRVJFTkNFX1BJQ1RVUkVfQkFTRV9BRERSRVNTRVMpICsgNCArICgxICogOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldF9zdXJmYWNlLT5idWYsIHRhcmdldF9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyArIHRhcmdldF9zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0KTsKCiAgICBjbWQgPSAwOwogICAgUkVHSU9fV1JJVEVfRklFTEQoY21kLCBNU1ZEWF9DTURTLCBTTElDRV9QQVJBTVMsIFNMSUNFX0ZJRUxEX1RZUEUsICAgMik7IC8qIEZSQU1FIFBJQ1RVUkUgLS0gdWk4U2xpY2VGbGRUeXBlICovCiAgICBSRUdJT19XUklURV9GSUVMRChjbWQsIE1TVkRYX0NNRFMsIFNMSUNFX1BBUkFNUywgU0xJQ0VfQ09ERV9UWVBFLCAgICAxKTsgLyogUCBQSUNUVVJFIC0tICh1aThQaWNUeXBlID09IFdNRl9QVFlQRV9CSSkgPyBXTUZfUFRZUEVfSSA6ICh1aThQaWNUeXBlICYgMHgzKSAqLwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX0NNRFMsIFNMSUNFX1BBUkFNUyksIGNtZCk7CiAgICAqY3R4LT5kZWNfY3R4LnBfc2xpY2VfcGFyYW1zID0gY21kOwogICAgcHNiX2NtZGJ1Zl9yZWdfZW5kX2Jsb2NrKGNtZGJ1Zik7CgoKICAgIHBzYl9jbWRidWZfcmVnX3N0YXJ0X2Jsb2NrKGNtZGJ1ZiwgMCk7CiAgICBwc2JfY21kYnVmX3JlZ19zZXRfUkVMT0MoY21kYnVmLCBSRUdJU1RFUl9PRkZTRVQoTVNWRFhfQ01EUywgVkMxX0xVTUFfUkFOR0VfTUFQUElOR19CQVNFX0FERFJFU1MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3RhdGVfc3VyZmFjZS0+YnVmLCByb3RhdGVfc3VyZmFjZS0+YnVmLmJ1ZmZlcl9vZnMpOwoKICAgIHBzYl9jbWRidWZfcmVnX3NldF9SRUxPQyhjbWRidWYsIFJFR0lTVEVSX09GRlNFVChNU1ZEWF9DTURTLCBWQzFfQ0hST01BX1JBTkdFX01BUFBJTkdfQkFTRV9BRERSRVNTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm90YXRlX3N1cmZhY2UtPmJ1Ziwgcm90YXRlX3N1cmZhY2UtPmJ1Zi5idWZmZXJfb2ZzICsgcm90YXRlX3N1cmZhY2UtPmNocm9tYV9vZmZzZXQpOwogICAgcHNiX2NtZGJ1Zl9yZWdfZW5kX2Jsb2NrKGNtZGJ1Zik7CgogICAgUkVMT0MoKmN0eC0+ZGVjX2N0eC5wX3JhbmdlX21hcHBpbmdfYmFzZTAsIHJvdGF0ZV9zdXJmYWNlLT5idWYuYnVmZmVyX29mcywgJnJvdGF0ZV9zdXJmYWNlLT5idWYpOwogICAgUkVMT0MoKmN0eC0+ZGVjX2N0eC5wX3JhbmdlX21hcHBpbmdfYmFzZTEsIHJvdGF0ZV9zdXJmYWNlLT5idWYuYnVmZmVyX29mcyArIHJvdGF0ZV9zdXJmYWNlLT5jaHJvbWFfb2Zmc2V0LCAmcm90YXRlX3N1cmZhY2UtPmJ1Zik7Cn0KCnN0YXRpYyB2b2lkIHBzYl9fTUVQRzJfc2VuZF9ibGl0X2NtZChjb250ZXh0X01QRUcyX3AgY3R4KQp7CiAgICB1aW50MzJfdCBjbWQ7CiAgICBwc2JfY21kYnVmX3AgY21kYnVmID0gY3R4LT5vYmpfY29udGV4dC0+Y21kYnVmOwogICAgcHNiX3N1cmZhY2VfcCByb3RhdGVfc3VyZmFjZSA9IGN0eC0+b2JqX2NvbnRleHQtPmN1cnJlbnRfcmVuZGVyX3RhcmdldC0+b3V0X2xvb3Bfc3VyZmFjZTsKCiAgICBwc2JfY21kYnVmX3JlZ19zdGFydF9ibG9jayhjbWRidWYsIDApOwogICAgY21kID0gMDsKICAgIFJFR0lPX1dSSVRFX0ZJRUxEX0xJVEUoY21kLCBNU1ZEWF9DTURTLCBBTFRFUk5BVElWRV9PVVRQVVRfUElDVFVSRV9ST1RBVElPTiAsIEFMVF9QSUNUVVJFX0VOQUJMRSwgMSk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGNtZCwgTVNWRFhfQ01EUywgQUxURVJOQVRJVkVfT1VUUFVUX1BJQ1RVUkVfUk9UQVRJT04gLCBST1RBVElPTl9ST1dfU1RSSURFLCByb3RhdGVfc3VyZmFjZS0+c3RyaWRlX21vZGUpOwogICAgUkVHSU9fV1JJVEVfRklFTERfTElURShjbWQsIE1TVkRYX0NNRFMsIEFMVEVSTkFUSVZFX09VVFBVVF9QSUNUVVJFX1JPVEFUSU9OICwgUkVDT05fV1JJVEVfRElTQUJMRSwgMCk7CiAgICBSRUdJT19XUklURV9GSUVMRF9MSVRFKGNtZCwgTVNWRFhfQ01EUywgQUxURVJOQVRJVkVfT1VUUFVUX1BJQ1RVUkVfUk9UQVRJT04gLCBST1RBVElPTl9NT0RFLCBHRVRfU1VSRkFDRV9JTkZPX3JvdGF0ZShyb3RhdGVfc3VyZmFjZSkpOwogICAgcHNiX2NtZGJ1Zl9yZWdfc2V0KGNtZGJ1ZiwgUkVHSVNURVJfT0ZGU0VUKE1TVkRYX0NNRFMsIEFMVEVSTkFUSVZFX09VVFBVVF9QSUNUVVJFX1JPVEFUSU9OKSwgY21kKTsKICAgIHBzYl9jbWRidWZfcmVnX2VuZF9ibG9jayhjbWRidWYpOwoKICAgICpjbWRidWYtPmNtZF9pZHgrKyA9IDB4NDAwMDAwMDA7IC8qIENNRF9CTElUX0NNRCAqLwogICAgKmNtZGJ1Zi0+Y21kX2lkeCsrID0gY3R4LT5waWN0dXJlX3dpZHRoX21iOwogICAgKmNtZGJ1Zi0+Y21kX2lkeCsrID0gY3R4LT5waWN0dXJlX2hlaWdodF9tYjsgLyogRklYTUUgKi8KICAgICpjbWRidWYtPmNtZF9pZHgrKyA9IENNRF9DT01QTEVUSU9OOwp9CgpzdGF0aWMgdm9pZCBwc2JfX01QRUcyX2luc2VydF9ibGl0X2NtZF90b19yb3RhdGUoY29udGV4dF9NUEVHMl9wIGN0eCkKewogICAgcHNiX2NtZGJ1Zl9wIGNtZGJ1ZiA9IGN0eC0+b2JqX2NvbnRleHQtPmNtZGJ1ZjsKCiAgICAvKiBTZWUgUkVOREVSX0JVRkZFUl9IRUFERVIgKi8KICAgICpjbWRidWYtPmNtZF9pZHgrKyA9IENNRF9IRUFERVJfVkMxOwoKICAgIGN0eC0+ZGVjX2N0eC5wX3JhbmdlX21hcHBpbmdfYmFzZTAgPSBjbWRidWYtPmNtZF9pZHgrKzsKICAgIGN0eC0+ZGVjX2N0eC5wX3JhbmdlX21hcHBpbmdfYmFzZTEgPSBjbWRidWYtPmNtZF9pZHgrKzsKCiAgICAqY3R4LT5kZWNfY3R4LnBfcmFuZ2VfbWFwcGluZ19iYXNlMCA9IDA7CiAgICAqY3R4LT5kZWNfY3R4LnBfcmFuZ2VfbWFwcGluZ19iYXNlMSA9IDA7CgogICAgY3R4LT5kZWNfY3R4LnBfc2xpY2VfcGFyYW1zID0gY21kYnVmLT5jbWRfaWR4OwogICAgKmNtZGJ1Zi0+Y21kX2lkeCsrID0gMDsgLyogdWkzMlNsaWNlUGFyYW1zICovCgogICAgKmNtZGJ1Zi0+Y21kX2lkeCsrID0gMDsgLyogc2tpcCB0d28gbGxkbWEgYWRkciBmaWVsZCAqLwogICAgKmNtZGJ1Zi0+Y21kX2lkeCsrID0gMDsKCiAgICBjdHgtPmRlY19jdHguc2xpY2VfZmlyc3RfcGljX2xhc3QgPSBjbWRidWYtPmNtZF9pZHgrKzsKICAgICpjdHgtPmRlY19jdHguc2xpY2VfZmlyc3RfcGljX2xhc3QgPSAwOwoKICAgIHBzYl9fTUVQRzJfc2VuZF9oaWdobGV2ZWxfY21kKGN0eCk7CiAgICBwc2JfX01FUEcyX3NlbmRfYmxpdF9jbWQoY3R4KTsKCiAgICBjdHgtPm9ial9jb250ZXh0LT52aWRlb19vcCA9IHBzYl92aWRlb19tYzsKICAgIGN0eC0+b2JqX2NvbnRleHQtPmZsYWdzID0gRldfVkFfUkVOREVSX0lTX0xBU1RfU0xJQ0U7CgogICAgaWYgKHBzYl9jb250ZXh0X3N1Ym1pdF9jbWRidWYoY3R4LT5vYmpfY29udGV4dCkpIHsKICAgICAgICBBU1NFUlQoMCk7CiAgICB9Cn0KCnN0YXRpYyBWQVN0YXR1cyBwbndfTVBFRzJfQmVnaW5QaWN0dXJlKAogICAgb2JqZWN0X2NvbnRleHRfcCBvYmpfY29udGV4dCkKewogICAgSU5JVF9DT05URVhUX01QRUcyCgogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAicG53X01QRUcyX0JlZ2luUGljdHVyZVxuIik7CiAgICBpZiAoY3R4LT5waWNfcGFyYW1zKSB7CiAgICAgICAgZnJlZShjdHgtPnBpY19wYXJhbXMpOwogICAgICAgIGN0eC0+cGljX3BhcmFtcyA9IE5VTEw7CiAgICB9CiAgICBjdHgtPnByZXZpb3VzX3NsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uID0gfjE7CiAgICBjdHgtPnNsaWNlX2NvdW50ID0gMDsKCiAgICByZXR1cm4gVkFfU1RBVFVTX1NVQ0NFU1M7Cn0KCnN0YXRpYyBWQVN0YXR1cyBwbndfTVBFRzJfcHJvY2Vzc19idWZmZXIoCiAgICBjb250ZXh0X0RFQ19wIGRlY19jdHgsCiAgICBvYmplY3RfYnVmZmVyX3AgYnVmZmVyKQp7CiAgICBjb250ZXh0X01QRUcyX3AgY3R4ID0gKGNvbnRleHRfTVBFRzJfcClkZWNfY3R4OwogICAgVkFTdGF0dXMgdmFTdGF0dXMgPSBWQV9TVEFUVVNfU1VDQ0VTUzsKICAgIG9iamVjdF9idWZmZXJfcCBvYmpfYnVmZmVyID0gYnVmZmVyOwoKICAgIHN3aXRjaCAob2JqX2J1ZmZlci0+dHlwZSkgewogICAgY2FzZSBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlOgogICAgICAgIGRydl9kZWJ1Z19tc2coVklERU9fREVCVUdfR0VORVJBTCwgInBud19NUEVHMl9SZW5kZXJQaWN0dXJlIGdvdCBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJcbiIpOwogICAgICAgIHZhU3RhdHVzID0gcHNiX19NUEVHMl9wcm9jZXNzX3BpY3R1cmVfcGFyYW0oY3R4LCBvYmpfYnVmZmVyKTsKICAgICAgICBERUJVR19GQUlMVVJFOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgVkFJUU1hdHJpeEJ1ZmZlclR5cGU6CiAgICAgICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCJwbndfTVBFRzJfUmVuZGVyUGljdHVyZSBnb3QgVkFJUU1hdHJpeEJ1ZmZlclR5cGVcbiIpOwogICAgICAgIHZhU3RhdHVzID0gcHNiX19NUEVHMl9wcm9jZXNzX2lxX21hdHJpeChjdHgsIG9ial9idWZmZXIpOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9VTktOT1dOOwogICAgICAgIERFQlVHX0ZBSUxVUkU7CiAgICB9CgogICAgcmV0dXJuIHZhU3RhdHVzOwp9CgpzdGF0aWMgVkFTdGF0dXMgcG53X01QRUcyX0VuZFBpY3R1cmUoCiAgICBvYmplY3RfY29udGV4dF9wIG9ial9jb250ZXh0KQp7CiAgICBWQVN0YXR1cyB2YVN0YXR1cyA9IFZBX1NUQVRVU19TVUNDRVNTOwogICAgSU5JVF9DT05URVhUX01QRUcyCgogICAgZHJ2X2RlYnVnX21zZyhWSURFT19ERUJVR19HRU5FUkFMLCAicG53X01QRUcyX0VuZFBpY3R1cmVcbiIpOwoKICAgIGlmIChDT05URVhUX1JPVEFURShjdHgtPm9ial9jb250ZXh0KSkgewogICAgICAgIGlmICghKGN0eC0+cGljX3BhcmFtcy0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucHJvZ3Jlc3NpdmVfZnJhbWUpICYmCiAgICAgICAgICAgICEoY3R4LT5waWNfcGFyYW1zLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5pc19maXJzdF9maWVsZCkpCiAgICAgICAgICAgIHBzYl9fTVBFRzJfaW5zZXJ0X2JsaXRfY21kX3RvX3JvdGF0ZShjdHgpOwogICAgfQoKICAgIGlmIChwc2JfY29udGV4dF9mbHVzaF9jbWRidWYoY3R4LT5vYmpfY29udGV4dCkpIHsKICAgICAgICB2YVN0YXR1cyA9IFZBX1NUQVRVU19FUlJPUl9VTktOT1dOOwogICAgfQoKICAgIGlmIChjdHgtPnBpY19wYXJhbXMpIHsKICAgICAgICBmcmVlKGN0eC0+cGljX3BhcmFtcyk7CiAgICAgICAgY3R4LT5waWNfcGFyYW1zID0gTlVMTDsKICAgIH0KCiAgICBjdHgtPnNsaWNlX2NvdW50ID0gMDsKCiAgICByZXR1cm4gdmFTdGF0dXM7Cn0KCnN0cnVjdCBmb3JtYXRfdnRhYmxlX3MgcG53X01QRUcyX3Z0YWJsZSA9IHsKcXVlcnlDb25maWdBdHRyaWJ1dGVzOgogICAgcG53X01QRUcyX1F1ZXJ5Q29uZmlnQXR0cmlidXRlcywKdmFsaWRhdGVDb25maWc6CiAgICBwbndfTVBFRzJfVmFsaWRhdGVDb25maWcsCmNyZWF0ZUNvbnRleHQ6CiAgICBwbndfTVBFRzJfQ3JlYXRlQ29udGV4dCwKZGVzdHJveUNvbnRleHQ6CiAgICBwbndfTVBFRzJfRGVzdHJveUNvbnRleHQsCmJlZ2luUGljdHVyZToKICAgIHBud19NUEVHMl9CZWdpblBpY3R1cmUsCnJlbmRlclBpY3R1cmU6CiAgICB2bGRfZGVjX1JlbmRlclBpY3R1cmUsCmVuZFBpY3R1cmU6CiAgICBwbndfTVBFRzJfRW5kUGljdHVyZQp9Owo=