LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgIHJwbmcyLXguYwoKICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCiAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCiAgIEl0IHN1cHBvcnRzIGdhbW1hIGNvcnJlY3Rpb24sIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3JzLCBhbmQgdXNlci0KICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCiAgIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgdGhlIGF1dGhvciB1bmRlciBVbml4IGFuZCBieSBNYXJ0aW4KICAgWmluc2VyIHVuZGVyIE9wZW5WTVM7IG1heSB3b3JrIHVuZGVyIE9TLzIgd2l0aCBhIGxpdHRsZSB0d2Vha2luZykuCgogICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiCiAgIGFuZCAicmFkaWFsIHdhdmVzIiBwYXR0ZXJucywgcmVzcGVjdGl2ZWx5LgoKICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKICAgIC0gZml4IGV4cG9zZS9yZWRyYXcgY29kZTogIGRvbid0IGRyYXcgZW50aXJlIHJvdyBpZiBvbmx5IHBhcnQgZXhwb3NlZAogICAgLSA4LWJpdCAoY29sb3JtYXBwZWQpIFggc3VwcG9ydAogICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQogICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgQ2hhbmdlbG9nOgogICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQogICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgY2hhci91Y2hhciBtaXNtYXRjaAogICAgLSAxLjEwOiAgYWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsczsgZml4ZWQgWCBwaXhlbC1jb252ZXJzaW9uCiAgICAtIDEuMTE6ICBhZGRlZCAtdXNsZWVwIG9wdGlvbiBmb3IgZGVtb3M7IGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwogICAgLSAxLjEyOiAgYWRkZWQgLXBhdXNlIG9wdGlvbiBmb3IgZGVtb3MgYW5kIHRlc3RpbmcKICAgIC0gMS4yMDogIGFkZGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgbmV3IC1tbXgqIG9wdGlvbnMKICAgIC0gMS4yMTogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCiAgICAtIDEuMjI6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCiAgICAtIDEuMjM6ICBhZGRlZCAtYmdwYXQgMCBtb2RlIChzdGQgd2hpdGUvZ3JheSBjaGVja2VyYm9hcmQsIDh4OCBzcXVhcmVzKQogICAgLSAxLjMwOiAgYWRkZWQgLWxvb3Agb3B0aW9uIGZvciAtYmdwYXQgKGlmZGVmIEZFQVRVUkVfTE9PUCk7IGZpeGVkIGJwcCA9CiAgICAgICAgICAgICAgMjQ7IGFkZGVkIHN1cHBvcnQgZm9yIFggcmVzb3VyY2VzICh0aGFua3MgdG8gR2VyaGFyZCBOaWtsYXNjaCkKICAgIC0gMS4zMTogIGFkZGVkIGNvZGUgdG8gc2tpcCB1bnVzZWQgY2h1bmtzICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQogICAgLSAxLjMyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXyk7IGFkZGVkIGJhc2ljIGV4cG9zZS9yZWRyYXcKICAgICAgICAgICAgICBoYW5kbGluZwogICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmM7IGZpeGVkIC1wYXVzZSB1c2FnZSBkZXNjcmlwdGlvbgogICAgLSAyLjAyOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpOyBmaXhlZAogICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXM7IGZpeGVkIFRyYWNlKCkgY3V0LWFuZC0KICAgICAgICAgICAgICBwYXN0ZSBidWdzCiAgICAtIDIuMDM6ICBkZWxldGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucwogICAgLSAyLjA0OiAgQWRkZWQgInZvaWQoZm9vKTsiIHN0YXRlbWVudHMgdG8gcXVpZXQgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3MKICAgICAgICAgICAgIGFib3V0IHVudXNlZCB2YXJpYWJsZXMgKEdSLVApCiAgICAtIDIuMDU6ICBVc2UgbmFub3NsZWVwKCkgaW5zdGVhZCBvZiB1c2xlZXAoKSwgd2hpY2ggaXMgZGVwcmVjYXRlZCAoR1ItUCkuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCwgMjAxNC0yMDE1IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCiAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCiAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCiAgICAgIHRoaXMgc29mdHdhcmUuCgogICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCiAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQogICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CgoKICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKCiAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCiAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQogICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CgogICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwogICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgogICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCgoKICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKCiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXgiCiNkZWZpbmUgTE9OR05BTUUgICJQcm9ncmVzc2l2ZSBQTkcgVmlld2VyIGZvciBYIgojZGVmaW5lIFZFUlNJT04gICAiMi4wNCBvZiAxNSBKdW5lIDIwMTQiCiNkZWZpbmUgUkVTTkFNRSAgICJycG5nMiIgICAgICAgLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLwojZGVmaW5lIFJFU0NMQVNTICAiUnBuZyIgICAgICAgLyogb3VyIFggcmVzb3VyY2UgY2xhc3MgbmFtZSAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHNldGptcC5oPiAgICAgICAvKiBmb3Igam1wYnVmIGRlY2xhcmF0aW9uIGluIHJlYWRwbmcyLmggKi8KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAvKiBvbmx5IGZvciBQdmRNIGJhY2tncm91bmQgY29kZSAqLwojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaW5jbHVkZSA8WDExL1hvcy5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPiAgIC8qIGRlZmluZXMgWEtfKiBtYWNyb3MgKi8KCiNpZiBfUE9TSVhfQ19TT1VSQ0UgPj0gMTk5MzA5TCAvKiBoYXZlIG5hbm9zbGVlcCgpICovCiMgdW5kZWYgdXNsZWVwCiMgZGVmaW5lIHVzbGVlcCh1c2VjKSB7ICAgICAgICBcCiAgIHN0cnVjdCB0aW1lc3BlYyB0czsgICAgICAgICBcCiAgIHRzLnR2X3NlYyA9IDA7ICAgICAgICAgICAgICBcCiAgIHRzLnR2X25zZWMgPSAodXNlYykgKiAxMDAwOyBcCiAgIG5hbm9zbGVlcCgmdHMsIE5VTEwpOyB9CiMgIGVuZGlmCgojaWZuZGVmIHVzbGVlcCAvKiBoYXZlIG5laXRoZXIgbmFub3NsZWVwKCkgbm9yIHVzbGVlcCgpICovCiMgIGRlZmluZSB1c2xlZXAoeCkgc2xlZXAoKCh4KSs0OTk5OTkpLzEwMDAwMDApCiNlbmRpZgoKI2lmZGVmIFZNUwojICBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCgovKiBhbGwgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlOiAqLwojaWZuZGVmIFBJCiMgIGRlZmluZSBQSSAgICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzOAojZW5kaWYKI2RlZmluZSBQSV8yICAgICAgICAgICAgIChQSSowLjUpCiNkZWZpbmUgSU5WX1BJXzM2MCAgICAgICAoMzYwLjAgLyBQSSkKI2RlZmluZSBNQVgoYSxiKSAgICAgICAgIChhPmI/YTpiKQojZGVmaW5lIE1JTihhLGIpICAgICAgICAgKGE8Yj9hOmIpCiNkZWZpbmUgQ0xJUChhLG1pbixtYXgpICBNQVgobWluLE1JTigoYSksbWF4KSkKI2RlZmluZSBBQlMoYSkgICAgICAgICAgICgoYSk8MD8tKGEpOihhKSkKI2RlZmluZSBDTElQOFAoYykgICAgICAgIE1BWCgwLChNSU4oKGMpLDI1NSkpKSAgIC8qIDgtYml0IHBvcy4gaW50ZWdlciAodWNoKSAqLwojZGVmaW5lIFJPVU5ERihmKSAgICAgICAgKChpbnQpKGYgKyAwLjUpKQoKI2RlZmluZSBRVUlUKGUsaykgKChlLnR5cGUgPT0gQnV0dG9uUHJlc3MgJiYgZS54YnV0dG9uLmJ1dHRvbiA9PSBCdXR0b24xKSB8fCAgXAogICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzICYmICAgLyogIHYtLS0gb3IgMSBmb3Igc2hpZnRlZCBrZXlzICovICBcCiAgICAgICAgICAgICAgICAgICgoayA9IFhMb29rdXBLZXlzeW0oJmUueGtleSwgMCkpID09IFhLX3EgfHwgayA9PSBYS19Fc2NhcGUpKSkKCiNkZWZpbmUgTk9fMjRCSVRfTUFTS1MgLyogdW5kZWYgY2FzZSBub3QgZnVsbHkgd3JpdHRlbi0tb25seSBmb3IgcmVkaXNwbGF5KCkgKi8KCiNkZWZpbmUgcmdiMV9tYXggICBiZ19mcmVxCiNkZWZpbmUgcmdiMV9taW4gICBiZ19ncmF5CiNkZWZpbmUgcmdiMl9tYXggICBiZ19ic2F0CiNkZWZpbmUgcmdiMl9taW4gICBiZ19icm90CgovKiAjZGVmaW5lIERFQlVHICovICAgICAvKiB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCgojaW5jbHVkZSAicmVhZHBuZzIuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZzIgcHJvdG90eXBlcyAqLwoKCi8qIGNvdWxkIGp1c3QgaW5jbHVkZSBwbmcuaCwgYnV0IHRoaXMgbWFjcm8gaXMgdGhlIG9ubHkgdGhpbmcgd2UgbmVlZAogKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAogKiAidXNoIGFjb3B5ID0gKGFscGhhKTsiKSAqLwoKI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAogICAgdXNoIHRlbXAgPSAoKHVzaCkoZmcpKih1c2gpKGFscGhhKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAp9CgoKI2RlZmluZSBJTkJVRlNJWkUgNDA5NiAgIC8qIHdpdGggcHNldWRvLXRpbWluZyBvbiAoMSBzZWMgZGVsYXkvYmxvY2spLCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYmxvY2sgc2l6ZSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGEgZG93bmxvYWQKICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzcGVlZCAxMCUgZmFzdGVyIHRoYW4gdGhlb3JldGljYWwgMzMuNksgbWF4aW11bQogICAgICAgICAgICAgICAgICAgICAgICAgICogIChhc3N1bWluZyA4IGRhdGEgYml0cywgMSBzdG9wIGJpdCBhbmQgbm8gb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAqICBvdmVyaGVhZCkgKi8KCi8qIGxvY2FsIHByb3RvdHlwZXMgKi8Kc3RhdGljIHZvaWQgcnBuZzJfeF9pbml0ICh2b2lkKTsKc3RhdGljIGludCAgcnBuZzJfeF9jcmVhdGVfd2luZG93ICh2b2lkKTsKc3RhdGljIGludCAgcnBuZzJfeF9sb2FkX2JnX2ltYWdlICh2b2lkKTsKc3RhdGljIHZvaWQgcnBuZzJfeF9kaXNwbGF5X3JvdyAodWxnIHJvdyk7CnN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkgKHZvaWQpOwpzdGF0aWMgdm9pZCBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpOwojaWZkZWYgRkVBVFVSRV9MT09QCnN0YXRpYyB2b2lkIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlICh2b2lkKTsKc3RhdGljIGludCAgaXNfbnVtYmVyIChjaGFyICpwKTsKI2VuZGlmCnN0YXRpYyB2b2lkIHJwbmcyX3hfY2xlYW51cCAodm9pZCk7CnN0YXRpYyBpbnQgIHJwbmcyX3hfbXNiICh1bGcgdTMydmFsKTsKCgpzdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XSwgKndpbmRvd19uYW1lID0gdGl0bGViYXI7CnN0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7CnN0YXRpYyBjaGFyICppY29uX25hbWUgPSBQUk9HTkFNRTsKc3RhdGljIGNoYXIgKnJlc19uYW1lID0gUkVTTkFNRTsKc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOwpzdGF0aWMgY2hhciAqZmlsZW5hbWU7CnN0YXRpYyBGSUxFICppbmZpbGU7CgpzdGF0aWMgbWFpbnByb2dfaW5mbyBycG5nMl9pbmZvOwoKc3RhdGljIHVjaCBpbmJ1ZltJTkJVRlNJWkVdOwpzdGF0aWMgaW50IGluY291bnQ7CgpzdGF0aWMgaW50IHBhdCA9IDY7ICAgICAgICAvKiBtdXN0IGJlIGxlc3MgdGhhbiBudW1fYmdwYXQgKi8Kc3RhdGljIGludCBiZ19pbWFnZSA9IDA7CnN0YXRpYyBpbnQgYmdzY2FsZSwgYmdzY2FsZV9kZWZhdWx0ID0gMTY7CnN0YXRpYyB1bGcgYmdfcm93Ynl0ZXM7CnN0YXRpYyB1Y2ggKmJnX2RhdGE7CgppbnQgcGF1c2VfYWZ0ZXJfcGFzcyA9IEZBTFNFOwppbnQgZGVtb190aW1pbmcgPSBGQUxTRTsKdWxnIHVzbGVlcF9kdXJhdGlvbiA9IDBMOwoKc3RhdGljIHN0cnVjdCByZ2JfY29sb3IgewogICAgdWNoIHIsIGcsIGI7Cn0gcmdiW10gPSB7CiAgICB7ICAwLCAgIDAsICAgMH0sICAgIC8qICAwOiAgYmxhY2sgKi8KICAgIHsyNTUsIDI1NSwgMjU1fSwgICAgLyogIDE6ICB3aGl0ZSAqLwogICAgezE3MywgMTMyLCAgNTd9LCAgICAvKiAgMjogIHRhbiAqLwogICAgeyA2NCwgMTMyLCAgIDB9LCAgICAvKiAgMzogIG1lZGl1bSBncmVlbiAqLwogICAgezE4OSwgMTE3LCAgIDF9LCAgICAvKiAgNDogIGdvbGQgKi8KICAgIHsyNTMsIDI0OSwgICAxfSwgICAgLyogIDU6ICB5ZWxsb3cgKi8KICAgIHsgIDAsICAgMCwgMjU1fSwgICAgLyogIDY6ICBibHVlICovCiAgICB7ICAwLCAgIDAsIDEyMH0sICAgIC8qICA3OiAgbWVkaXVtIGJsdWUgKi8KICAgIHsyNTUsICAgMCwgMjU1fSwgICAgLyogIDg6ICBtYWdlbnRhICovCiAgICB7IDY0LCAgIDAsICA2NH0sICAgIC8qICA5OiAgZGFyayBtYWdlbnRhICovCiAgICB7MjU1LCAgIDAsICAgMH0sICAgIC8qIDEwOiAgcmVkICovCiAgICB7IDY0LCAgIDAsICAgMH0sICAgIC8qIDExOiAgZGFyayByZWQgKi8KICAgIHsyNTUsIDEyNywgICAwfSwgICAgLyogMTI6ICBvcmFuZ2UgKi8KICAgIHsxOTIsICA5NiwgICAwfSwgICAgLyogMTM6ICBkYXJrZXIgb3JhbmdlICovCiAgICB7IDI0LCAgNjAsICAgMH0sICAgIC8qIDE0OiAgZGFyayBncmVlbi15ZWxsb3cgKi8KICAgIHsgODUsIDEyNSwgMjAwfSwgICAgLyogMTU6ICBpY2UgYmx1ZSAqLwogICAgezE5MiwgMTkyLCAxOTJ9ICAgICAvKiAxNjogIE5ldHNjYXBlL01vc2FpYyBncmF5ICovCn07Ci8qIG5vdCB1c2VkIGZvciBub3csIGJ1dCBzaG91bGQgYmUgZm9yIGVycm9yLWNoZWNraW5nOgpzdGF0aWMgaW50IG51bV9yZ2IgPSBzaXplb2YocmdiKSAvIHNpemVvZihzdHJ1Y3QgcmdiX2NvbG9yKTsKICovCgovKgogICAgVGhpcyB3aG9sZSBzdHJ1Y3QgaXMgYSBmYWlybHkgY2hlZXN5IHdheSB0byBrZWVwIHRoZSBudW1iZXIgb2YKICAgIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgbWluaW11bS4gIFRoZSByYWRpYWwtd2F2ZXMgYmFja2dyb3VuZAogICAgdHlwZSBpcyBhIHBhcnRpY3VsYXJseSBwb29yIGZpdCB0byB0aGUgaW50ZWdlciBlbGVtZW50cyBvZiB0aGUKICAgIHN0cnVjdC4uLmJ1dCBhIGZldyBtYWNyb3MgYW5kIGEgbGl0dGxlIGZpeGVkLXBvaW50IG1hdGggd2lsbCBkbwogICAgd29uZGVycyBmb3IgeWEuCgogICAgdHlwZSBiaXRzOgogICAgICAgRiBFIEQgQyBCIEEgOSA4IDcgNiA1IDQgMyAyIDEgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8IHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCArLSstKy0tIDAgPSBzaGFycC1lZGdlZCBjaGVja2VyYm9hcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgICAxID0gc29mdCBkaWFtb25kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDIgPSByYWRpYWwgd2F2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgMy03ID0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCArLS0gZ3JhZGllbnQgIzIgaW52ZXJ0ZWQ/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIGFsdGVybmF0aW5nIGNvbHVtbnMgaW52ZXJ0ZWQ/CiAqLwpzdGF0aWMgc3RydWN0IGJhY2tncm91bmRfcGF0dGVybiB7CiAgICB1c2ggdHlwZTsKICAgIGludCByZ2IxX21heCwgcmdiMV9taW47ICAgICAvKiBvciBiZ19mcmVxLCBiZ19ncmF5ICovCiAgICBpbnQgcmdiMl9tYXgsIHJnYjJfbWluOyAgICAgLyogb3IgYmdfYnNhdCwgYmdfYnJvdCAoYm90aCBzY2FsZWQgYnkgMTApKi8KfSBiZ1tdID0gewogICAgezAsICAgICAxLDEsIDE2LDE2fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHdoaXRlIHZzLiBsaWdodCBncmF5IChiYXNpYykgKi8KICAgIHswKzgsICAgMiwwLCAgMSwxNX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2ljZSBibHVlICovCiAgICB7MCsyNCwgIDIsMCwgIDEsMH0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9ibGFjayAqLwogICAgezArOCwgICA0LDUsICAwLDJ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay90YW4gKi8KICAgIHswKzgsICAgNCw1LCAgMCw2fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svYmx1ZSAqLwogICAgezAsICAgICA3LDAsICA4LDl9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwogICAgezArOCwgIDEzLDAsICA1LDE0fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIG9yYW5nZS9ibGFjayB2cy4geWVsbG93ICovCiAgICB7MCs4LCAgMTIsMCwgMTAsMTF9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiByZWQgKi8KICAgIHsxLCAgICAgNywwLCAgOCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwogICAgezEsICAgIDEyLDAsIDExLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgb3JhbmdlIHZzLiBkYXJrIHJlZCAqLwogICAgezEsICAgIDEwLDAsICA3LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgcmVkIHZzLiBtZWRpdW0gYmx1ZSAqLwogICAgezEsICAgICA0LDAsICA1LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZ29sZCB2cy4geWVsbG93ICovCiAgICB7MSwgICAgIDMsMCwgIDAsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBtZWRpdW0gZ3JlZW4gdnMuIGJsYWNrICovCiAgICB7MiwgICAgMTYsIDEwMCwgIDIwLCAgIDB9LCAgLyogcmFkaWFsOiAgfmhhcmQgcmFkaWFsIGNvbG9yLWJlYW1zICovCiAgICB7MiwgICAgMTgsIDEwMCwgIDEwLCAgIDJ9LCAgLyogcmFkaWFsOiAgc29mdCwgY3VydmVkIHJhZGlhbCBjb2xvci1iZWFtcyAqLwogICAgezIsICAgIDE2LCAyNTYsIDEwMCwgMjUwfSwgIC8qIHJhZGlhbDogIHZlcnkgdGlnaHQgc3BpcmFsICovCiAgICB7MiwgMTAwMDAsIDI1NiwgIDExLCAgIDB9ICAgLyogcmFkaWFsOiAgZGlwb2xlLW1vaXJlJyAoYWxtb3N0IGZyYWN0YWwpICovCn07CnN0YXRpYyBpbnQgbnVtX2JncGF0ID0gc2l6ZW9mKGJnKSAvIHNpemVvZihzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuKTsKCgovKiBYLXNwZWNpZmljIHZhcmlhYmxlcyAqLwpzdGF0aWMgY2hhciAqZGlzcGxheW5hbWU7CnN0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKc3RhdGljIERpc3BsYXkgKmRpc3BsYXk7CnN0YXRpYyBpbnQgZGVwdGg7CnN0YXRpYyBWaXN1YWwgKnZpc3VhbDsKc3RhdGljIFhWaXN1YWxJbmZvICp2aXN1YWxfbGlzdDsKc3RhdGljIGludCBSU2hpZnQsIEdTaGlmdCwgQlNoaWZ0OwpzdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7CnN0YXRpYyBXaW5kb3cgd2luZG93OwpzdGF0aWMgR0MgZ2M7CnN0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKCnN0YXRpYyBpbnQgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKc3RhdGljIGludCBoYXZlX3dpbmRvdyA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfZ2MgPSBGQUxTRTsKCgoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewojaWZkZWYgc2dpCiAgICBjaGFyIHRtcGxpbmVbODBdOwojZW5kaWYKICAgIGNoYXIgKnAsICpiZ3N0ciA9IE5VTEw7CiAgICBpbnQgcmMsIGFsZW4sIGZsZW47CiAgICBpbnQgZXJyb3IgPSAwOwogICAgaW50IHRpbWluZyA9IEZBTFNFOwogICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKI2lmZGVmIEZFQVRVUkVfTE9PUAogICAgaW50IGxvb3AgPSBGQUxTRTsKICAgIGxvbmcgbG9vcF9pbnRlcnZhbCA9IC0xOyAgICAgICAgICAgIC8qIHNlY29uZHMgKDEwMCwwMDAgbWF4KSAqLwojZW5kaWYKICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwogICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwogICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KICAgIFhFdmVudCBlOwogICAgS2V5U3ltIGs7CgoKICAgIC8qIEZpcnN0IGluaXRpYWxpemUgYSBmZXcgdGhpbmdzLCBqdXN0IHRvIGJlIHN1cmUtLW1lbXNldCB0YWtlcyBjYXJlIG9mCiAgICAgKiBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgKGJsYWNrKSwgYm9vbGVhbnMgKEZBTFNFKSwgcG9pbnRlcnMgKE5VTEwpLAogICAgICogZXRjLiAqLwoKICAgIGRpc3BsYXluYW1lID0gKGNoYXIgKilOVUxMOwogICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7CiAgICBtZW1zZXQoJnJwbmcyX2luZm8sIDAsIHNpemVvZihtYWlucHJvZ19pbmZvKSk7CgoKICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCB0aGUKICAgICAqIHByb2R1Y3Qgb2YgdGhlIENSVCBleHBvbmVudCBhbmQgdGhlIGV4cG9uZW50IGNvcnJlc3BvbmRpbmcgdG8KICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCiAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCiAgICAgKiBvbmVzKSwgYnV0IGl0IHNob3VsZCBjb3ZlciA5OSUgb2YgdGhlIGN1cnJlbnQgcG9zc2liaWxpdGllcy4gKi8KCiNpZiBkZWZpbmVkKE5lWFQpCiAgICAvKiB0aGlyZC1wYXJ0eSB1dGlsaXRpZXMgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdCBMVVQgZXhwb25lbnQgKi8KICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKICAgIC8qCiAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCiAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKICAgICAqLwojZWxpZiBkZWZpbmVkKHNnaSkKICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bwogICAgICogZ2V0IHRoZSAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7CiAgICBpZiAoaW5maWxlKSB7CiAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKCiAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7CiAgICAgICAgZmNsb3NlKGluZmlsZSk7CiAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQogICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7CiAgICB9CiNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQogICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKICAgIC8qCiAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQogICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7CiAgICAgKi8KI2Vsc2UKICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KI2VuZGlmCgogICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCiAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7CgoKICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCiAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5CiAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCgogICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwogICAgZWxzZQogICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKCgogICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCgogICAgd2hpbGUgKCorK2FyZ3YgJiYgIWVycm9yKSB7CiAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWRpc3BsYXkiLCAyKSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9ICphcmd2OwogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YoKmFyZ3YpOwogICAgICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA8PSAwLjApCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYmdzdHIpICE9IDcgfHwgYmdzdHJbMF0gIT0gJyMnKQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ3BhdCIsIDQpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcGF0ID0gYXRvaSgqYXJndik7CiAgICAgICAgICAgICAgICBpZiAocGF0ID49IDAgJiYgcGF0IDwgbnVtX2JncGF0KSB7CiAgICAgICAgICAgICAgICAgICAgYmdfaW1hZ2UgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXVzbGVlcCIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXNsZWVwX2R1cmF0aW9uID0gKHVsZylhdG9sKCphcmd2KTsKICAgICAgICAgICAgICAgIGRlbW9fdGltaW5nID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItcGF1c2UiLCAyKSkgewogICAgICAgICAgICBwYXVzZV9hZnRlcl9wYXNzID0gVFJVRTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXRpbWluZyIsIDIpKSB7CiAgICAgICAgICAgIHRpbWluZyA9IFRSVUU7CiNpZmRlZiBGRUFUVVJFX0xPT1AKICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWxvb3AiLCAyKSkgewogICAgICAgICAgICBsb29wID0gVFJVRTsKICAgICAgICAgICAgaWYgKCFhcmd2WzFdIHx8ICFpc19udW1iZXIoYXJndlsxXSkpCiAgICAgICAgICAgICAgICBsb29wX2ludGVydmFsID0gMjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICArK2FyZ3Y7CiAgICAgICAgICAgICAgICBsb29wX2ludGVydmFsID0gYXRvbCgqYXJndik7CiAgICAgICAgICAgICAgICBpZiAobG9vcF9pbnRlcnZhbCA8IDApCiAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsb29wX2ludGVydmFsID4gMTAwMDAwKSAgIC8qIGJpdCBtb3JlIHRoYW4gb25lIGRheSAqLwogICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAxMDAwMDA7CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7CiAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLwogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCiAgICAgICAgfQogICAgfQoKICAgIGlmICghZmlsZW5hbWUpCiAgICAgICAgKytlcnJvcjsKCgogICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwoKICAgIGlmIChlcnJvcikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG5cbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKICAgICAgICByZWFkcG5nMl92ZXJzaW9uX2luZm8oKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgogICAgICAgICAgIlVzYWdlOiAgICIpOwogICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgIiVzIFstZGlzcGxheSB4ZHB5XSBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF1cbiIKICAgICAgICAgICIgICAgICAgICUqcyBbLXVzbGVlcCBkdXIgfCAtdGltaW5nXSBbLXBhdXNlXVxuIiwKICAgICAgICAgIFBST0dOQU1FLCAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIik7CiAgICAgICAgZnByaW50ZihzdGRlcnIsCiNpZmRlZiBGRUFUVVJFX0xPT1AKICAgICAgICAgICIgICAgICAgIFstbG9vcCBbc2VjXV0iCiNlbmRpZgogICAgICAgICAgIiBmaWxlLnBuZ1xuXG4iKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICIgICAgeGRweVx0bmFtZSBvZiB0aGUgdGFyZ2V0IFggZGlzcGxheSAoZS5nLiwgYGBob3N0bmFtZTowJycpXG4iCiAgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBkaXNwbGF5XG4iCiAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgogICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIsCiAgICAgICAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQpOwogICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCiAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0XG4iCiAgICAgICAgICAiICAgIHBhdCBcdGRlc2lyZWQgYmFja2dyb3VuZCBwYXR0ZXJuIG51bWJlciAoMC0lZCk7IHVzZWQgd2l0aFxuIgogICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yXG4iLAogICAgICAgICAgbnVtX2JncGF0LTEpOwojaWZkZWYgRkVBVFVSRV9MT09QCiAgICAgICAgZnByaW50ZihzdGRlcnIsIAogICAgICAgICAgIiAgICAtbG9vcFx0bG9vcHMgdGhyb3VnaCBiYWNrZ3JvdW5kIGltYWdlcyBhZnRlciBpbml0aWFsIGRpc3BsYXlcbiIKICAgICAgICAgICJcdFx0ICBpcyBjb21wbGV0ZSAoZGVwZW5kcyBvbiAtYmdwYXQpXG4iCiAgICAgICAgICAiICAgIHNlYyBcdHNlY29uZHMgdG8gZGlzcGxheSBlYWNoIGJhY2tncm91bmQgaW1hZ2UgKGRlZmF1bHQgPSAyKVxuIik7CiNlbmRpZgogICAgICAgIGZwcmludGYoc3RkZXJyLCAKICAgICAgICAgICIgICAgZHVyIFx0ZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzIHRvIHdhaXQgYWZ0ZXIgZGlzcGxheWluZyBlYWNoXG4iCiAgICAgICAgICAiXHRcdCAgcm93IChmb3IgZGVtbyBwdXJwb3NlcylcbiIKICAgICAgICAgICIgICAgLXRpbWluZ1x0ZW5hYmxlcyBkZWxheSBmb3IgZXZlcnkgYmxvY2sgcmVhZCwgdG8gc2ltdWxhdGUgbW9kZW1cbiIKICAgICAgICAgICJcdFx0ICBkb3dubG9hZCBvZiBpbWFnZSAofjM2IEticHMpXG4iCiAgICAgICAgICAiICAgIC1wYXVzZVx0cGF1c2VzIGFmdGVyIGRpc3BsYXlpbmcgZWFjaCBwYXNzIHVudGlsIG1vdXNlIGNsaWNrZWRcbiIKICAgICAgICAgICJcblByZXNzIFEsIEVzYyBvciBtb3VzZSBidXR0b24gMSAod2l0aGluIGltYWdlIHdpbmRvdywgYWZ0ZXIgaW1hZ2VcbiIKICAgICAgICAgICJpcyBkaXNwbGF5ZWQpIHRvIHF1aXQuXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwogICAgICAgICsrZXJyb3I7CiAgICB9IGVsc2UgewogICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOwogICAgICAgIGlmIChpbmNvdW50IDwgOCB8fCAhcmVhZHBuZzJfY2hlY2tfc2lnKGluYnVmLCA4KSkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAiOiAgWyVzXSBpcyBub3QgYSBQTkcgZmlsZTogaW5jb3JyZWN0IHNpZ25hdHVyZVxuIiwKICAgICAgICAgICAgICBmaWxlbmFtZSk7CiAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgfSBlbHNlIGlmICgocmMgPSByZWFkcG5nMl9pbml0KCZycG5nMl9pbmZvKSkgIT0gMCkgewogICAgICAgICAgICBzd2l0Y2ggKHJjKSB7CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgICAgICAgICAiOiAgWyVzXSBoYXMgYmFkIElIRFIgKGxpYnBuZyBsb25nam1wKVxuIiwgZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5zdWZmaWNpZW50IG1lbW9yeVxuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICAgICAgICAgIjogIHVua25vd24gcmVhZHBuZzJfaW5pdCgpIGVycm9yXG4iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICArK2Vycm9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIFhPcGVuRGlzcGxheSgpXG4iKSkKICAgICAgICAgICAgZGlzcGxheSA9IFhPcGVuRGlzcGxheShkaXNwbGF5bmFtZSk7CiAgICAgICAgICAgIGlmICghZGlzcGxheSkgewogICAgICAgICAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gWCBkaXNwbGF5IFslc11cbiIsCiAgICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lPyBkaXNwbGF5bmFtZSA6ICJkZWZhdWx0Iik7CiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgZmNsb3NlKGluZmlsZSk7CiAgICB9CgoKICAgIGlmIChlcnJvcikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgYWJvcnRpbmcuXG4iKTsKICAgICAgICBleGl0KDIpOwogICAgfQoKCiAgICAvKiBzZXQgdGhlIHRpdGxlLWJhciBzdHJpbmcsIGJ1dCBtYWtlIHN1cmUgYnVmZmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KCiAgICBhbGVuID0gc3RybGVuKGFwcG5hbWUpOwogICAgZmxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CiAgICBpZiAoYWxlbiArIGZsZW4gKyAzID4gMTAyMykKICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAuLi4lcyIsIGFwcG5hbWUsIGZpbGVuYW1lKyhhbGVuK2ZsZW4rNi0xMDIzKSk7CiAgICBlbHNlCiAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSk7CgoKICAgIC8qIHNldCBzb21lIGZpbmFsIHJwbmcyX2luZm8gdmFyaWFibGVzIGJlZm9yZSBlbnRlcmluZyBtYWluIGRhdGEgbG9vcCAqLwoKICAgIGlmIChoYXZlX2JnKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsgICAvKiB0aGlzIGFwcHJvYWNoIHF1aWV0cyBjb21waWxlciB3YXJuaW5ncyAqLwoKICAgICAgICBzc2NhbmYoYmdzdHIrMSwgIiUyeCUyeCUyeCIsICZyLCAmZywgJmIpOwogICAgICAgIHJwbmcyX2luZm8uYmdfcmVkICAgPSAodWNoKXI7CiAgICAgICAgcnBuZzJfaW5mby5iZ19ncmVlbiA9ICh1Y2gpZzsKICAgICAgICBycG5nMl9pbmZvLmJnX2JsdWUgID0gKHVjaCliOwogICAgfSBlbHNlCiAgICAgICAgcnBuZzJfaW5mby5uZWVkX2JnY29sb3IgPSBUUlVFOwoKICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrUHJlSW5pdDsKICAgIHJwbmcyX2luZm8ubWFpbnByb2dfaW5pdCA9IHJwbmcyX3hfaW5pdDsKICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZGlzcGxheV9yb3cgPSBycG5nMl94X2Rpc3BsYXlfcm93OwogICAgcnBuZzJfaW5mby5tYWlucHJvZ19maW5pc2hfZGlzcGxheSA9IHJwbmcyX3hfZmluaXNoX2Rpc3BsYXk7CgoKICAgIC8qIE9LLCB0aGlzIGlzIHRoZSBmdW4gcGFydDogIGNhbGwgcmVhZHBuZzJfZGVjb2RlX2RhdGEoKSBhdCB0aGUgc3RhcnQgb2YKICAgICAqIHRoZSBsb29wIHRvIGRlYWwgd2l0aCBvdXIgZmlyc3QgYnVmZmVyIG9mIGRhdGEgKHJlYWQgaW4gYWJvdmUgdG8gdmVyaWZ5CiAgICAgKiB0aGF0IHRoZSBmaWxlIGlzIGEgUE5HIGltYWdlKSwgdGhlbiBsb29wIHRocm91Z2ggdGhlIGZpbGUgYW5kIGNvbnRpbnVlCiAgICAgKiBjYWxsaW5nIHRoZSBzYW1lIHJvdXRpbmUgdG8gaGFuZGxlIGVhY2ggY2h1bmsgb2YgZGF0YS4gIEl0IGluIHR1cm4KICAgICAqIHBhc3NlcyB0aGUgZGF0YSB0byBsaWJwbmcsIHdoaWNoIHdpbGwgaW52b2tlIG9uZSBvciBtb3JlIG9mIG91ciBjYWxsLQogICAgICogYmFja3MgYXMgZGVjb2RlZCBkYXRhIGJlY29tZSBhdmFpbGFibGUuICBXZSBvcHRpb25hbGx5IGNhbGwgc2xlZXAoKSBmb3IKICAgICAqIG9uZSBzZWNvbmQgcGVyIGl0ZXJhdGlvbiB0byBzaW11bGF0ZSBkb3dubG9hZGluZyB0aGUgaW1hZ2UgdmlhIGFuIGFuYWxvZwogICAgICogbW9kZW0uICovCgogICAgZm9yICg7OykgewogICAgICAgIFRyYWNlKChzdGRlcnIsICJhYm91dCB0byBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQogICAgICAgIGlmIChyZWFkcG5nMl9kZWNvZGVfZGF0YSgmcnBuZzJfaW5mbywgaW5idWYsIGluY291bnQpKQogICAgICAgICAgICArK2Vycm9yOwogICAgICAgIFRyYWNlKChzdGRlcnIsICJkb25lIHdpdGggcmVhZHBuZzJfZGVjb2RlX2RhdGEoKVxuIikpCgogICAgICAgIGlmIChlcnJvciB8fCBpbmNvdW50ICE9IElOQlVGU0laRSB8fCBycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7CiAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID09IGtEb25lKSB7CiAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSBkZWNvZGluZyBQTkcgaW1hZ2VcbiIpKQogICAgICAgICAgICB9IGVsc2UgaWYgKGZlcnJvcihpbmZpbGUpKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgIjogIGVycm9yIHdoaWxlIHJlYWRpbmcgUE5HIGltYWdlIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgZXhpdCgzKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChmZW9mKGluZmlsZSkpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgZW5kIG9mIGZpbGUgcmVhY2hlZCAiCiAgICAgICAgICAgICAgICAgICIodW5leHBlY3RlZGx5KSB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKICAgICAgICAgICAgICAgIGV4aXQoMyk7CiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoZXJyb3IpICovIHsKICAgICAgICAgICAgICAgIC8qIHdpbGwgcHJpbnQgZXJyb3IgbWVzc2FnZSBiZWxvdyAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRpbWluZykKICAgICAgICAgICAgc2xlZXAoMSk7CgogICAgICAgIGluY291bnQgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZTSVpFLCBpbmZpbGUpOwogICAgfQoKCiAgICAvKiBjbGVhbiB1cCBQTkcgc3R1ZmYgYW5kIHJlcG9ydCBhbnkgZGVjb2RpbmcgZXJyb3JzICovCgogICAgZmNsb3NlKGluZmlsZSk7CiAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9jbGVhbnVwKClcbiIpKQogICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBsaWJwbmcgZXJyb3Igd2hpbGUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKTsKICAgICAgICBleGl0KDMpOwogICAgfQoKCiNpZmRlZiBGRUFUVVJFX0xPT1AKCiAgICBpZiAobG9vcCAmJiBiZ19pbWFnZSkgewogICAgICAgIFRyYWNlKChzdGRlcnIsICJlbnRlcmluZyAtbG9vcCBsb29wIChGRUFUVVJFX0xPT1ApXG4iKSkKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGludCBpLCB1c2Vfc2xlZXA7CiAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIG5vdywgdGhlbjsKCiAgICAgICAgICAgIC8qIGdldCBjdXJyZW50IHRpbWUgYW5kIGFkZCBsb29wX2ludGVydmFsIHRvIGdldCB0YXJnZXQgdGltZSAqLwogICAgICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0aGVuLCBOVUxMKSA9PSAwKSB7CiAgICAgICAgICAgICAgICB0aGVuLnR2X3NlYyArPSBsb29wX2ludGVydmFsOwogICAgICAgICAgICAgICAgdXNlX3NsZWVwID0gRkFMU0U7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgdXNlX3NsZWVwID0gVFJVRTsKCiAgICAgICAgICAgIC8qIGRvIHF1aWNrIGNoZWNrIGZvciBhIHF1aXQgZXZlbnQgYnV0IGRvbid0IHdhaXQgZm9yIGl0ICovCiAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBzaG91bGQgYWxzbyBjaGVjayBmb3IgRXhwb3NlIGV2ZW50cyBhbmQgcmVkcmF3Li4uICovCiAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrLCAmZSkpCiAgICAgICAgICAgICAgICBpZiAoUVVJVChlLGspKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgLyogZ2VuZXJhdGUgbmV4dCBiYWNrZ3JvdW5kIGltYWdlICovCiAgICAgICAgICAgIGlmICgrK3BhdCA+PSBudW1fYmdwYXQpCiAgICAgICAgICAgICAgICBwYXQgPSAwOwogICAgICAgICAgICBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSgpOwoKICAgICAgICAgICAgLyogd2FpdCBmb3IgdGltZW91dCwgdXNpbmcgd2hhdGV2ZXIgbWVhbnMgYXJlIGF2YWlsYWJsZSAqLwogICAgICAgICAgICBpZiAodXNlX3NsZWVwIHx8IGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBsb29wX2ludGVydmFsOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgYWxzbyBuZWVkIHRvIGNoZWNrIGZvciBFeHBvc2UgKGFuZCByZWRyYXchKSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChYQ2hlY2tNYXNrRXZlbnQoZGlzcGxheSwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAmZSkgJiYgUVVJVChlLGspKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIFkyMDM4IEJVRyEgKi8KICAgICAgICAgICAgICAgIGlmIChub3cudHZfc2VjIDwgdGhlbi50dl9zZWMgfHwKICAgICAgICAgICAgICAgICAgICAobm93LnR2X3NlYyA9PSB0aGVuLnR2X3NlYyAmJiBub3cudHZfdXNlYyA8IHRoZW4udHZfdXNlYykpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IHF1aXQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICBsb25nIHNlY29uZHNfdG9fZ28gPSB0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWM7CiAgICAgICAgICAgICAgICAgICAgbG9uZyB1c2xlZXBfdXNlYzsKCiAgICAgICAgICAgICAgICAgICAgLyogYmFzaWNhbGx5IGNoZXcgdXAgbW9zdCBvZiByZW1haW5pbmcgbG9vcC1pbnRlcnZhbCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICogIGNhbGxzIHRvIHNsZWVwKDEpIGludGVybGVhdmVkIHdpdGggY2hlY2tzIGZvciBxdWl0CiAgICAgICAgICAgICAgICAgICAgICogIGV2ZW50cywgYnV0IGFsc28gcmVjYWxjIHRpbWUtdG8tZ28gcGVyaW9kaWNhbGx5OyB3aGVuCiAgICAgICAgICAgICAgICAgICAgICogIGRvbmUsIGNsZWFuIHVwIGFueSByZW1haW5pbmcgdGltZSB3aXRoIHVzbGVlcCgpIGNhbGwKICAgICAgICAgICAgICAgICAgICAgKiAgKGNvdWxkIGFsc28gdXNlIFNJR0FMUk0sIGJ1dCBzaWduYWxzIGFyZSBhIHBhaW4uLi4pICovCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlY29uZHNfdG9fZ28tLSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY29uZHNfZG9uZSA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzZWNvbmRzX3RvX2dvOyAgaSA+IDAgJiYgIXF1aXQ7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRzogIG5lZWQgdG8gY2hlY2sgZm9yIEV4cG9zZSBhbmQgcmVkcmF3ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWENoZWNrTWFza0V2ZW50KGRpc3BsYXksIEtleVByZXNzTWFzayB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uUHJlc3NNYXNrLCAmZSkgJiYgUVVJVChlLGspKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2Vjb25kc19kb25lID4gMTAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvKiB0aW1lIHRvIHJlZG8gc2Vjb25kc190b19nbyBtZWFzLiAqLwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWl0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBPSywgbW9yZSB0aGFuIDEwMDAgc2Vjb25kcyBzaW5jZSBsYXN0IGNoZWNrOgogICAgICAgICAgICAgICAgICAgICAgICAgKiAgY29ycmVjdCB0aGUgdGltZS10by1nbyBtZWFzdXJlbWVudCBmb3IgZHJpZnQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93LnR2X3NlYyA+PSB0aGVuLnR2X3NlYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNfdG9fZ28gPSB0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzZWNvbmRzX3RvX2dvOyAgLyogcmVzdG9yZSB3aGF0IHdlIHN1YnRyYWN0ZWQgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8qIGJyZWFrcyBvdXRlciBkby1sb29wLCBza2lwcyByZWRpc3BsYXkgKi8KCiAgICAgICAgICAgICAgICAgICAgLyogc2luY2UgZGlmZmVyZW5jZSBiZXR3ZWVuICJub3ciIGFuZCAidGhlbiIgaXMgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICAqICBlYXRlbiB1cCB0byB3aXRoaW4gYSBjb3VwbGUgb2Ygc2Vjb25kcywgZG9uJ3QgbmVlZCB0bwogICAgICAgICAgICAgICAgICAgICAqICB3b3JyeSBhYm91dCBvdmVyZmxvdy0tYnV0IG1pZ2h0IGhhdmUgb3ZlcnNob3QgKG5lZy4pICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcF91c2VjID0gMTAwMDAwMEwqKHRoZW4udHZfc2VjIC0gbm93LnR2X3NlYykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4udHZfdXNlYyAtIG5vdy50dl91c2VjOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNsZWVwX3VzZWMgPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKCh1bGcpdXNsZWVwX3VzZWMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogY29tcG9zaXRlIGltYWdlIGFnYWluc3QgbmV3IGJhY2tncm91bmQgYW5kIGRpc3BsYXkgKG5vdGUgdGhhdAogICAgICAgICAgICAgKiAgd2UgZG8gbm90IHRha2UgaW50byBhY2NvdW50IHRoZSB0aW1lIHNwZW50IGRvaW5nIHRoaXMuLi4pICovCiAgICAgICAgICAgIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlICgwLCAwLCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodCk7CiAgICAgICAgfQoKICAgIH0gZWxzZSAvKiBGQUxMIFRIUk9VR0ggYW5kIGRvIHRoZSBub3JtYWwgdGhpbmcgKi8KCiNlbmRpZiAvKiBGRUFUVVJFX0xPT1AgKi8KCiAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwoKICAgIGlmIChycG5nMl9pbmZvLnN0YXRlID49IGtXaW5kb3dJbml0KSB7CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImVudGVyaW5nIGZpbmFsIHdhaXQtZm9yLXF1aXQtZXZlbnQgbG9vcFxuIikpCiAgICAgICAgZG8gewogICAgICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKICAgICAgICAgICAgaWYgKGUudHlwZSA9PSBFeHBvc2UpIHsKICAgICAgICAgICAgICAgIFhFeHBvc2VFdmVudCAqZXggPSAoWEV4cG9zZUV2ZW50ICopJmU7CiAgICAgICAgICAgICAgICBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAoZXgtPngsIGV4LT55LCBleC0+d2lkdGgsIGV4LT5oZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoIVFVSVQoZSxrKSk7CiAgICB9IGVsc2UgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgaW5pdCBjYWxsYmFjayBuZXZlciBjYWxsZWQ6ICBwcm9iYWJsZSAiCiAgICAgICAgICAibGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBtZXRhZGF0YVxuIik7CiAgICAgICAgZXhpdCg0KTsKICAgIH0KCgogICAgLyogd2UncmUgZG9uZTogIGNsZWFuIHVwIGFsbCBpbWFnZSBhbmQgWCByZXNvdXJjZXMgYW5kIGdvIGF3YXkgKi8KCiAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCBycG5nMl94X2NsZWFudXAoKVxuIikpCiAgICBycG5nMl94X2NsZWFudXAoKTsKCiAgICAodm9pZClhcmdjOyAvKiBVbnVzZWQgKi8KCiAgICByZXR1cm4gMDsKfQoKCgoKCi8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHJlYWRwbmcyX2luZm9fY2FsbGJhY2soKSBpbiByZWFkcG5nMi5jLCB3aGljaAogKiBpbiB0dXJuIGlzIGNhbGxlZCBieSBsaWJwbmcgYWZ0ZXIgYWxsIG9mIHRoZSBwcmUtSURBVCBjaHVua3MgaGF2ZSBiZWVuCiAqIHJlYWQgYW5kIHByb2Nlc3NlZC0taS5lLiwgd2Ugbm93IGhhdmUgZW5vdWdoIGluZm8gdG8gZmluaXNoIGluaXRpYWxpemluZyAqLwoKc3RhdGljIHZvaWQgcnBuZzJfeF9pbml0KHZvaWQpCnsKICAgIHVsZyBpOwogICAgdWxnIHJvd2J5dGVzID0gcnBuZzJfaW5mby5yb3dieXRlczsKCiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfaW5pdCgpXG4iKSkKICAgIFRyYWNlKChzdGRlcnIsICIgIHJvd2J5dGVzID0gJWRcbiIsIHJwbmcyX2luZm8ucm93Ynl0ZXMpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgd2lkdGggID0gJWxkXG4iLCBycG5nMl9pbmZvLndpZHRoKSkKICAgIFRyYWNlKChzdGRlcnIsICIgIGhlaWdodCA9ICVsZFxuIiwgcnBuZzJfaW5mby5oZWlnaHQpKQoKICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9ICh1Y2ggKiltYWxsb2Mocm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7CiAgICBpZiAoIXJwbmcyX2luZm8uaW1hZ2VfZGF0YSkgewogICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9ICh1Y2ggKiopbWFsbG9jKHJwbmcyX2luZm8uaGVpZ2h0ICogc2l6ZW9mKHVjaCAqKSk7CiAgICBpZiAoIXJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7CiAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwogICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7CiAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK2kpCiAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbaV0gPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyBpKnJvd2J5dGVzOwoKCiAgICAvKiBkbyB0aGUgYmFzaWMgWCBpbml0aWFsaXphdGlvbiBzdHVmZiwgbWFrZSB0aGUgd2luZG93LCBhbmQgZmlsbCBpdCB3aXRoCiAgICAgKiB0aGUgdXNlci1zcGVjaWZpZWQsIGZpbGUtc3BlY2lmaWVkIG9yIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvcgogICAgICogcGF0dGVybiAqLwoKICAgIGlmIChycG5nMl94X2NyZWF0ZV93aW5kb3coKSkgewoKICAgICAgICAvKiBHUlIgVEVNUE9SQVJZIEhBQ0s6ICB0aGlzIGlzIGZ1bmRhbWVudGFsbHkgbm8gZGlmZmVyZW50IGZyb20gY2FzZXMKICAgICAgICAgKiBhYm92ZTsgbGlicG5nIHNob3VsZCBjYWxsIG91ciBlcnJvciBoYW5kbGVyIHRvIGxvbmdqbXAoKSBiYWNrIHRvIHVzCiAgICAgICAgICogd2hlbiBwbmdfcHRyIGdvZXMgYXdheS4gIElmIHdlL2l0IHNlZ2ZhdWx0IGluc3RlYWQsIHNlZW1zIGxpa2UgYQogICAgICAgICAqIGxpYnBuZyBidWcuLi4gKi8KCiAgICAgICAgLyogd2UncmUgaGVyZSB2aWEgbGlicG5nIGNhbGxiYWNrLCBzbyBpZiB3aW5kb3cgZmFpbHMsIGNsZWFuIGFuZCBiYWlsICovCiAgICAgICAgcmVhZHBuZzJfY2xlYW51cCgmcnBuZzJfaW5mbyk7CiAgICAgICAgcnBuZzJfeF9jbGVhbnVwKCk7CiAgICAgICAgZXhpdCgyKTsKICAgIH0KCiAgICBycG5nMl9pbmZvLnN0YXRlID0ga1dpbmRvd0luaXQ7Cn0KCgoKCgpzdGF0aWMgaW50IHJwbmcyX3hfY3JlYXRlX3dpbmRvdyh2b2lkKQp7CiAgICB1bGcgYmdfcmVkICAgPSBycG5nMl9pbmZvLmJnX3JlZDsKICAgIHVsZyBiZ19ncmVlbiA9IHJwbmcyX2luZm8uYmdfZ3JlZW47CiAgICB1bGcgYmdfYmx1ZSAgPSBycG5nMl9pbmZvLmJnX2JsdWU7CiAgICB1bGcgYmdfcGl4ZWwgPSAwTDsKICAgIHVsZyBhdHRybWFzazsKICAgIGludCBuZWVkX2NvbG9ybWFwID0gRkFMU0U7CiAgICBpbnQgc2NyZWVuLCBwYWQ7CiAgICB1Y2ggKnhkYXRhOwogICAgV2luZG93IHJvb3Q7CiAgICBYRXZlbnQgZTsKICAgIFhHQ1ZhbHVlcyBnY3ZhbHVlczsKICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7CiAgICBYVGV4dFByb3BlcnR5IHdpbmRvd05hbWUsICpwV2luZG93TmFtZSA9ICZ3aW5kb3dOYW1lOwogICAgWFRleHRQcm9wZXJ0eSBpY29uTmFtZSwgKnBJY29uTmFtZSA9ICZpY29uTmFtZTsKICAgIFhWaXN1YWxJbmZvIHZpc3VhbF9pbmZvOwogICAgWFNpemVIaW50cyAqc2l6ZV9oaW50czsKICAgIFhXTUhpbnRzICp3bV9oaW50czsKICAgIFhDbGFzc0hpbnQgKmNsYXNzX2hpbnRzOwoKCiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpXG4iKSkKCiAgICBzY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRpc3BsYXkpOwogICAgZGVwdGggPSBEaXNwbGF5UGxhbmVzKGRpc3BsYXksIHNjcmVlbik7CiAgICByb290ID0gUm9vdFdpbmRvdyhkaXNwbGF5LCBzY3JlZW4pOwoKI2lmZGVmIERFQlVHCiAgICBYU3luY2hyb25pemUoZGlzcGxheSwgVHJ1ZSk7CiNlbmRpZgoKICAgIGlmIChkZXB0aCAhPSAxNiAmJiBkZXB0aCAhPSAyNCAmJiBkZXB0aCAhPSAzMikgewogICAgICAgIGludCB2aXN1YWxzX21hdGNoZWQgPSAwOwoKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZGVmYXVsdCBkZXB0aCBpcyAlZDogIGNoZWNraW5nIG90aGVyIHZpc3VhbHNcbiIsCiAgICAgICAgICBkZXB0aCkpCgogICAgICAgIC8qIDI0LWJpdCBmaXJzdCAqLwogICAgICAgIHZpc3VhbF9pbmZvLnNjcmVlbiA9IHNjcmVlbjsKICAgICAgICB2aXN1YWxfaW5mby5kZXB0aCA9IDI0OwogICAgICAgIHZpc3VhbF9saXN0ID0gWEdldFZpc3VhbEluZm8oZGlzcGxheSwKICAgICAgICAgIFZpc3VhbFNjcmVlbk1hc2sgfCBWaXN1YWxEZXB0aE1hc2ssICZ2aXN1YWxfaW5mbywgJnZpc3VhbHNfbWF0Y2hlZCk7CiAgICAgICAgaWYgKHZpc3VhbHNfbWF0Y2hlZCA9PSAwKSB7Ci8qIEdSUjogIGFkZCAxNS0sIDE2LSBhbmQgMzItYml0IFRydWVDb2xvciB2aXN1YWxzIChhbHNvIERpcmVjdENvbG9yPykgKi8KICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZhdWx0IHNjcmVlbiBkZXB0aCAlZCBub3Qgc3VwcG9ydGVkLCBhbmQgbm8iCiAgICAgICAgICAgICAgIiAyNC1iaXQgdmlzdWFscyBmb3VuZFxuIiwgZGVwdGgpOwogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CiAgICAgICAgVHJhY2UoKHN0ZGVyciwgIlhHZXRWaXN1YWxJbmZvKCkgcmV0dXJuZWQgJWQgMjQtYml0IHZpc3VhbHNcbiIsCiAgICAgICAgICB2aXN1YWxzX21hdGNoZWQpKQogICAgICAgIHZpc3VhbCA9IHZpc3VhbF9saXN0WzBdLnZpc3VhbDsKICAgICAgICBkZXB0aCA9IHZpc3VhbF9saXN0WzBdLmRlcHRoOwovKgogICAgICAgIGNvbG9ybWFwX3NpemUgPSB2aXN1YWxfbGlzdFswXS5jb2xvcm1hcF9zaXplOwogICAgICAgIHZpc3VhbF9jbGFzcyA9IHZpc3VhbC0+Y2xhc3M7CiAgICAgICAgdmlzdWFsSUQgPSBYVmlzdWFsSURGcm9tVmlzdWFsKHZpc3VhbCk7CiAqLwogICAgICAgIGhhdmVfbm9uZGVmYXVsdF92aXN1YWwgPSBUUlVFOwogICAgICAgIG5lZWRfY29sb3JtYXAgPSBUUlVFOwogICAgfSBlbHNlIHsKICAgICAgICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIHNjcmVlbiwgZGVwdGgsIFRydWVDb2xvciwgJnZpc3VhbF9pbmZvKTsKICAgICAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7CiAgICB9CgogICAgUk1hc2sgPSB2aXN1YWwtPnJlZF9tYXNrOwogICAgR01hc2sgPSB2aXN1YWwtPmdyZWVuX21hc2s7CiAgICBCTWFzayA9IHZpc3VhbC0+Ymx1ZV9tYXNrOwoKLyogR1JSOiAgYWRkL2NoZWNrIDgtYml0IHN1cHBvcnQgKi8KICAgIGlmIChkZXB0aCA9PSA4IHx8IG5lZWRfY29sb3JtYXApIHsKICAgICAgICBjb2xvcm1hcCA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LCByb290LCB2aXN1YWwsIEFsbG9jTm9uZSk7CiAgICAgICAgaWYgKCFjb2xvcm1hcCkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVDb2xvcm1hcCgpIGZhaWxlZFxuIik7CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBoYXZlX2NvbG9ybWFwID0gVFJVRTsKICAgICAgICBpZiAoZGVwdGggPT0gOCkKICAgICAgICAgICAgYmdfaW1hZ2UgPSBGQUxTRTsgICAvKiBncmFkaWVudCBqdXN0IHdhc3RlcyBwYWxldHRlIGVudHJpZXMgKi8KICAgIH0KICAgIGlmIChkZXB0aCA9PSAxNSB8fCBkZXB0aCA9PSAxNikgewogICAgICAgIFJTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoUk1hc2spOyAgICAvKiB0aGVzZSBhcmUgcmlnaHQtc2hpZnRzICovCiAgICAgICAgR1NoaWZ0ID0gMTUgLSBycG5nMl94X21zYihHTWFzayk7CiAgICAgICAgQlNoaWZ0ID0gMTUgLSBycG5nMl94X21zYihCTWFzayk7CiAgICB9IGVsc2UgaWYgKGRlcHRoID4gMTYpIHsKICAgICAgICBSU2hpZnQgPSBycG5nMl94X21zYihSTWFzaykgLSA3OyAgICAgLyogdGhlc2UgYXJlIGxlZnQtc2hpZnRzICovCiAgICAgICAgR1NoaWZ0ID0gcnBuZzJfeF9tc2IoR01hc2spIC0gNzsKICAgICAgICBCU2hpZnQgPSBycG5nMl94X21zYihCTWFzaykgLSA3OwogICAgfQogICAgaWYgKGRlcHRoID49IDE1ICYmIChSU2hpZnQgPCAwIHx8IEdTaGlmdCA8IDAgfHwgQlNoaWZ0IDwgMCkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJwbmcyIGludGVybmFsIGxvZ2ljIGVycm9yOiAgbmVnYXRpdmUgWCBzaGlmdChzKSFcbiIpOwogICAgICAgIHJldHVybiAyOwogICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZpbmFsbHksIGNyZWF0ZSB0aGUgd2luZG93LgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgYXR0ci5iYWNraW5nX3N0b3JlID0gQWx3YXlzOwogICAgYXR0ci5ldmVudF9tYXNrID0gRXhwb3N1cmVNYXNrIHwgS2V5UHJlc3NNYXNrIHwgQnV0dG9uUHJlc3NNYXNrOwogICAgYXR0cm1hc2sgPSBDV0JhY2tpbmdTdG9yZSB8IENXRXZlbnRNYXNrOwogICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpIHsKICAgICAgICBhdHRyLmNvbG9ybWFwID0gY29sb3JtYXA7CiAgICAgICAgYXR0ci5iYWNrZ3JvdW5kX3BpeGVsID0gMDsKICAgICAgICBhdHRyLmJvcmRlcl9waXhlbCA9IDE7CiAgICAgICAgYXR0cm1hc2sgfD0gQ1dDb2xvcm1hcCB8IENXQmFja1BpeGVsIHwgQ1dCb3JkZXJQaXhlbDsKICAgIH0KCiAgICB3aW5kb3cgPSBYQ3JlYXRlV2luZG93KGRpc3BsYXksIHJvb3QsIDAsIDAsIHJwbmcyX2luZm8ud2lkdGgsCiAgICAgIHJwbmcyX2luZm8uaGVpZ2h0LCAwLCBkZXB0aCwgSW5wdXRPdXRwdXQsIHZpc3VhbCwgYXR0cm1hc2ssICZhdHRyKTsKCiAgICBpZiAod2luZG93ID09IE5vbmUpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVXaW5kb3coKSBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiAyOwogICAgfSBlbHNlCiAgICAgICAgaGF2ZV93aW5kb3cgPSBUUlVFOwoKICAgIGlmIChkZXB0aCA9PSA4KQogICAgICAgIFhTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LCB3aW5kb3csIGNvbG9ybWFwKTsKCiAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCiAgICAgICAgcFdpbmRvd05hbWUgPSBOVUxMOwogICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZpY29uX25hbWUsIDEsIHBJY29uTmFtZSkpCiAgICAgICAgcEljb25OYW1lID0gTlVMTDsKCiAgICAvKiBPSyBpZiBlaXRoZXIgaGludHMgYWxsb2NhdGlvbiBmYWlsczsgWFNldFdNUHJvcGVydGllcygpIGFsbG93cyBOVUxMcyAqLwoKICAgIGlmICgoc2l6ZV9oaW50cyA9IFhBbGxvY1NpemVIaW50cygpKSAhPSBOVUxMKSB7CiAgICAgICAgLyogd2luZG93IHdpbGwgbm90IGJlIHJlc2l6YWJsZSAqLwogICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKICAgICAgICBzaXplX2hpbnRzLT5taW5fd2lkdGggPSBzaXplX2hpbnRzLT5tYXhfd2lkdGggPSAoaW50KXJwbmcyX2luZm8ud2lkdGg7CiAgICAgICAgc2l6ZV9oaW50cy0+bWluX2hlaWdodCA9IHNpemVfaGludHMtPm1heF9oZWlnaHQgPQogICAgICAgICAgKGludClycG5nMl9pbmZvLmhlaWdodDsKICAgIH0KCiAgICBpZiAoKHdtX2hpbnRzID0gWEFsbG9jV01IaW50cygpKSAhPSBOVUxMKSB7CiAgICAgICAgd21faGludHMtPmluaXRpYWxfc3RhdGUgPSBOb3JtYWxTdGF0ZTsKICAgICAgICB3bV9oaW50cy0+aW5wdXQgPSBUcnVlOwogICAgIC8qIHdtX2hpbnRzLT5pY29uX3BpeG1hcCA9IGljb25fcGl4bWFwOyAqLwogICAgICAgIHdtX2hpbnRzLT5mbGFncyA9IFN0YXRlSGludCB8IElucHV0SGludCAgLyogfCBJY29uUGl4bWFwSGludCAqLyA7CiAgICB9CgogICAgaWYgKChjbGFzc19oaW50cyA9IFhBbGxvY0NsYXNzSGludCgpKSAhPSBOVUxMKSB7CiAgICAgICAgY2xhc3NfaGludHMtPnJlc19uYW1lID0gcmVzX25hbWU7CiAgICAgICAgY2xhc3NfaGludHMtPnJlc19jbGFzcyA9IHJlc19jbGFzczsKICAgIH0KCiAgICBYU2V0V01Qcm9wZXJ0aWVzKGRpc3BsYXksIHdpbmRvdywgcFdpbmRvd05hbWUsIHBJY29uTmFtZSwgTlVMTCwgMCwKICAgICAgc2l6ZV9oaW50cywgd21faGludHMsIGNsYXNzX2hpbnRzKTsKCiAgICAvKiB2YXJpb3VzIHByb3BlcnRpZXMgYW5kIGhpbnRzIG5vIGxvbmdlciBuZWVkZWQ7IGZyZWUgbWVtb3J5ICovCiAgICBpZiAocFdpbmRvd05hbWUpCiAgICAgICBYRnJlZShwV2luZG93TmFtZS0+dmFsdWUpOwogICAgaWYgKHBJY29uTmFtZSkKICAgICAgIFhGcmVlKHBJY29uTmFtZS0+dmFsdWUpOwogICAgaWYgKHNpemVfaGludHMpCiAgICAgICAgWEZyZWUoc2l6ZV9oaW50cyk7CiAgICBpZiAod21faGludHMpCiAgICAgICBYRnJlZSh3bV9oaW50cyk7CiAgICBpZiAoY2xhc3NfaGludHMpCiAgICAgICBYRnJlZShjbGFzc19oaW50cyk7CgogICAgWE1hcFdpbmRvdyhkaXNwbGF5LCB3aW5kb3cpOwoKICAgIGdjID0gWENyZWF0ZUdDKGRpc3BsYXksIHdpbmRvdywgMCwgJmdjdmFsdWVzKTsKICAgIGhhdmVfZ2MgPSBUUlVFOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFgtIGFuZCBkaXNwbGF5LXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGltYWdlLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDQqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7CiAgICAgICAgcGFkID0gMzI7CiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDIqcnBuZzJfaW5mby53aWR0aCpycG5nMl9pbmZvLmhlaWdodCk7CiAgICAgICAgcGFkID0gMTY7CiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKHJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOwogICAgICAgIHBhZCA9IDg7CiAgICB9CgogICAgaWYgKCF4ZGF0YSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGFsbG9jYXRlIGltYWdlIG1lbW9yeVxuIik7CiAgICAgICAgcmV0dXJuIDQ7CiAgICB9CgogICAgeGltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIHZpc3VhbCwgZGVwdGgsIFpQaXhtYXAsIDAsCiAgICAgIChjaGFyICopeGRhdGEsIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8uaGVpZ2h0LCBwYWQsIDApOwoKICAgIGlmICgheGltYWdlKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBYQ3JlYXRlSW1hZ2UoKSBmYWlsZWRcbiIpOwogICAgICAgIGZyZWUoeGRhdGEpOwogICAgICAgIHJldHVybiAzOwogICAgfQoKICAgIC8qIHRvIGF2b2lkIHRlc3RpbmcgdGhlIGJ5dGUgb3JkZXIgZXZlcnkgcGl4ZWwgKG9yIGRvdWJsaW5nIHRoZSBzaXplIG9mCiAgICAgKiB0aGUgZHJhd2luZyByb3V0aW5lIHdpdGggYSBnaWFudCBpZi10ZXN0KSwgd2UgYXJiaXRyYXJpbHkgc2V0IHRoZSBieXRlCiAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCiAgICAgKiBlbmRpYW4gbWFjaGluZXMgKGUuZy4sIExpbnV4L3g4Niwgb2xkIFZBWGVuLCBldGMuKS0tdGhpcyBpcyBub3QgdGhlCiAgICAgKiBtb3N0IGVmZmljaWVudCBhcHByb2FjaCAodGhlIGdpYW50IGlmLXRlc3Qgd291bGQgYmUgYmV0dGVyKSwgYnV0IGluCiAgICAgKiB0aGUgaW50ZXJlc3Qgb2YgY2xhcml0eSwgd2UnbGwgdGFrZSB0aGUgZWFzeSB3YXkgb3V0Li4uICovCgogICAgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmlsbCB3aW5kb3cgd2l0aCB0aGUgc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3IgKGRlZmF1bHQgaXMgYmxhY2spIG9yCiAgICBmYWtlZCAiYmFja2dyb3VuZCBpbWFnZSIgKGJ1dCBsYXR0ZXIgaXMgZGlzYWJsZWQgaWYgOC1iaXQ7IGdyYWRpZW50cwogICAganVzdCB3YXN0ZSBwYWxldHRlIGVudHJpZXMpLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGJnX2ltYWdlKQogICAgICAgIHJwbmcyX3hfbG9hZF9iZ19pbWFnZSgpOyAgICAvKiByZXNldHMgYmdfaW1hZ2UgaWYgZmFpbHMgKi8KCiAgICBpZiAoIWJnX2ltYWdlKSB7CiAgICAgICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgICAgIGJnX3BpeGVsID0gKGJnX3JlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgIChiZ19ncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAoYmdfYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgICAgIGJnX3BpeGVsID0gKCgoYmdfcmVkICAgPDwgOCkgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgKCgoYmdfZ3JlZW4gPDwgOCkgPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgKCgoYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgICAgICB9CiAgICAgICAgWFNldEZvcmVncm91bmQoZGlzcGxheSwgZ2MsIGJnX3BpeGVsKTsKICAgICAgICBYRmlsbFJlY3RhbmdsZShkaXNwbGF5LCB3aW5kb3csIGdjLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAogICAgICAgICAgcnBuZzJfaW5mby5oZWlnaHQpOwogICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFdhaXQgZm9yIGZpcnN0IEV4cG9zZSBldmVudCB0byBkbyBhbnkgZHJhd2luZywgdGhlbiBmbHVzaCBhbmQgcmV0dXJuLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgZG8KICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKICAgIHdoaWxlIChlLnR5cGUgIT0gRXhwb3NlIHx8IGUueGV4cG9zZS5jb3VudCk7CgogICAgWEZsdXNoKGRpc3BsYXkpOwoKICAgIHJldHVybiAwOwoKfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9jcmVhdGVfd2luZG93KCkgKi8KCgoKCgpzdGF0aWMgaW50IHJwbmcyX3hfbG9hZF9iZ19pbWFnZSh2b2lkKQp7CiAgICB1Y2ggKnNyYzsKICAgIGNoYXIgKmRlc3Q7CiAgICB1Y2ggcjEsIHIyLCBnMSwgZzIsIGIxLCBiMjsKICAgIHVjaCByMV9pbnYsIHIyX2ludiwgZzFfaW52LCBnMl9pbnYsIGIxX2ludiwgYjJfaW52OwogICAgaW50IGssIGhtYXgsIG1heDsKICAgIGludCB4aWR4LCB5aWR4LCB5aWR4X21heDsKICAgIGludCBldmVuX29kZF92ZXJ0LCBldmVuX29kZF9ob3JpeiwgZXZlbl9vZGQ7CiAgICBpbnQgaW52ZXJ0X2dyYWRpZW50MiA9IChiZ1twYXRdLnR5cGUgJiAweDA4KTsKICAgIGludCBpbnZlcnRfY29sdW1uOwogICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CiAgICB1bGcgaSwgcm93OwogICAgdWxnIHBpeGVsOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFsbG9jYXRlIGJ1ZmZlciBmb3IgZmFrZSBiYWNrZ3JvdW5kIGltYWdlIHRvIGJlIHVzZWQgd2l0aCB0cmFuc3BhcmVudAogICAgaW1hZ2VzOyBpZiB0aGlzIGZhaWxzLCByZXZlcnQgdG8gcGxhaW4gYmFja2dyb3VuZCBjb2xvci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGJnX3Jvd2J5dGVzID0gMyAqIHJwbmcyX2luZm8ud2lkdGg7CiAgICBiZ19kYXRhID0gKHVjaCAqKW1hbGxvYyhiZ19yb3dieXRlcyAqIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgIGlmICghYmdfZGF0YSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2tncm91bmQgaW1hZ2VcbiIpOwogICAgICAgIGJnX2ltYWdlID0gMDsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKICAgIHlpZHhfbWF4ID0gYmdzY2FsZSAtIDE7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVmVydGljYWwgZ3JhZGllbnRzIChyYW1wcykgaW4gTnhOIHNxdWFyZXMsIGFsdGVybmF0aW5nIGRpcmVjdGlvbiBhbmQKICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgewogICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7CiAgICAgICAgdWNoIGcxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uZzsKICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOwogICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7CiAgICAgICAgdWNoIGcyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uZzsKICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOwogICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47CiAgICAgICAgaW50IGcxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZyAtIGcxX21pbjsKICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOwogICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47CiAgICAgICAgaW50IGcyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZyAtIGcyX21pbjsKICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwoKICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMSA9IGIxX21pbiArIChiMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMV9pbnYgPSBiMV9taW4gKyAoYjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMiA9IGcyX21pbiArIChnMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMl9pbnYgPSBnMl9taW4gKyAoZzJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CgogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwogICAgICAgICAgICAgICAgZXZlbl9vZGQgPSBldmVuX29kZF92ZXJ0IF4gZXZlbl9vZGRfaG9yaXo7CiAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbl9vZGQgPT0gMCkgeyAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICghaW52ZXJ0X2NvbHVtbiAmJiAhaW52ZXJ0X2dyYWRpZW50MikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzI7ICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNvZnQgZ3JhZGllbnQtZGlhbW9uZHMgd2l0aCBzY2FsZSA9IGJnc2NhbGUuICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFkYW0KICAgIE0uIENvc3RlbGxvLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgewoKICAgICAgICBobWF4ID0gKGJnc2NhbGUtMSkvMjsgICAvKiBoYWxmIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCgogICAgICAgIHIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnI7CiAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwogICAgICAgIHIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnI7CiAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQogICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKICAgICAgICAgICAgfQogICAgICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCiAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKICAgICAgICB1Y2ggY2g7CiAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OwogICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7CiAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7CiAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKCiAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIGNvbXB1dGluZyByYWRpYWwgYmFja2dyb3VuZC4uLiIsCiAgICAgICAgICBQUk9HTkFNRSk7CiAgICAgICAgZmZsdXNoKHN0ZGVycik7CgogICAgICAgIGhoID0gKGludCkocnBuZzJfaW5mby5oZWlnaHQgLyAyKTsKICAgICAgICBodyA9IChpbnQpKHJwbmcyX2luZm8ud2lkdGggLyAyKTsKCiAgICAgICAgLyogdmFyaWFibGVzIGZvciByYWRpYWwgd2F2ZXM6CiAgICAgICAgICogICBhb2Zmc2V0OiAgbnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIGh1ZSBbQ1VSUkVOVExZIE5PVCBVU0VEXQogICAgICAgICAqICAgZnJlcTogIG51bWJlciBvZiBjb2xvciBiZWFtcyBvcmlnaW5hdGluZyBmcm9tIHRoZSBjZW50ZXIKICAgICAgICAgKiAgIGdyYXlzcG90OiAgc2l6ZSBvZiB0aGUgZ3JheWluZyBjZW50ZXIgYXJlYSAoYW50aS1hbGlhcykKICAgICAgICAgKiAgIHJvdGF0ZTogIHJvdGF0aW9uIG9mIHRoZSBiZWFtcyBhcyBhIGZ1bmN0aW9uIG9mIHJhZGl1cwogICAgICAgICAqICAgc2F0dXJhdGU6ICBzYXR1cmF0aW9uIG9mIGJlYW1zJyBzaGFwZSBhemltdXRoYWxseQogICAgICAgICAqLwogICAgICAgIGFuZ2xlID0gQ0xJUChhbmdsZSwgMC4wLCAzNjAuMCk7CiAgICAgICAgZ3JheXNwb3QgPSBDTElQKGJnW3BhdF0uYmdfZ3JheSwgMSwgKGhoICsgaHcpKTsKICAgICAgICBmcmVxID0gTUFYKChkb3VibGUpYmdbcGF0XS5iZ19mcmVxLCAwLjApOwogICAgICAgIHNhdHVyYXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2JzYXQgKiAwLjE7CiAgICAgICAgcm90YXRlID0gKGRvdWJsZSliZ1twYXRdLmJnX2Jyb3QgKiAwLjE7CiAgICAgICAgZ3JheSA9IDAuMDsKICAgICAgICBpbnRlbnNpdHkgPSAwLjA7CiAgICAgICAgbWF4RGlzdCA9IChkb3VibGUpKChodypodykgKyAoaGgqaGgpKTsKCiAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICB5ID0gKGludCkocm93IC0gaGgpOwogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIHggPSAoaW50KShpIC0gaHcpOwogICAgICAgICAgICAgICAgYW5nbGUgPSAoeCA9PSAwKT8gUElfMiA6IGF0YW4oKGRvdWJsZSl5IC8gKGRvdWJsZSl4KTsKICAgICAgICAgICAgICAgIGdyYXkgPSAoZG91YmxlKU1BWChBQlMoeSksIEFCUyh4KSkgLyBncmF5c3BvdDsKICAgICAgICAgICAgICAgIGdyYXkgPSBNSU4oMS4wLCBncmF5KTsKICAgICAgICAgICAgICAgIGRpc3QgPSAoZG91YmxlKSgoeCp4KSArICh5KnkpKSAvIG1heERpc3Q7CiAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSBjb3MoKGFuZ2xlKyhyb3RhdGUqZGlzdCpQSSkpICogZnJlcSkgKgogICAgICAgICAgICAgICAgICBncmF5ICogc2F0dXJhdGU7CiAgICAgICAgICAgICAgICBpbnRlbnNpdHkgPSAoTUFYKE1JTihpbnRlbnNpdHksMS4wKSwtMS4wKSArIDEuMCkgKiAwLjU7CiAgICAgICAgICAgICAgICBodWUgPSAoYW5nbGUgKyBQSSkgKiBJTlZfUElfMzYwICsgYW9mZnNldDsKICAgICAgICAgICAgICAgIHMgPSBncmF5ICogKChkb3VibGUpKEFCUyh4KStBQlMoeSkpIC8gKGRvdWJsZSkoaHcgKyBoaCkpOwogICAgICAgICAgICAgICAgcyA9IE1JTihNQVgocywwLjApLCAxLjApOwogICAgICAgICAgICAgICAgdiA9IE1JTihNQVgoaW50ZW5zaXR5LDAuMCksIDEuMCk7CgogICAgICAgICAgICAgICAgaWYgKHMgPT0gMC4wKSB7CiAgICAgICAgICAgICAgICAgICAgY2ggPSAodWNoKSh2ICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKGh1ZSA8IDAuMCkgfHwgKGh1ZSA+PSAzNjAuMCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGh1ZSAtPSAoKChpbnQpKGh1ZSAvIDM2MC4wKSkgKiAzNjAuMCk7CiAgICAgICAgICAgICAgICAgICAgaHVlIC89IDYwLjA7CiAgICAgICAgICAgICAgICAgICAgaWkgPSAoaW50KWh1ZTsKICAgICAgICAgICAgICAgICAgICBmID0gaHVlIC0gKGRvdWJsZSlpaTsKICAgICAgICAgICAgICAgICAgICBwID0gKDEuMCAtIHMpICogdjsKICAgICAgICAgICAgICAgICAgICBxID0gKDEuMCAtIChzICogZikpICogdjsKICAgICAgICAgICAgICAgICAgICB0ID0gKDEuMCAtIChzICogKDEuMCAtIGYpKSkgKiB2OwogICAgICAgICAgICAgICAgICAgIGlmICAgICAgKGlpID09IDApIHsgcmVkID0gdjsgZ3JlZW4gPSB0OyBibHVlID0gcDsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDEpIHsgcmVkID0gcTsgZ3JlZW4gPSB2OyBibHVlID0gcDsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDIpIHsgcmVkID0gcDsgZ3JlZW4gPSB2OyBibHVlID0gdDsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDMpIHsgcmVkID0gcDsgZ3JlZW4gPSBxOyBibHVlID0gdjsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDQpIHsgcmVkID0gdDsgZ3JlZW4gPSBwOyBibHVlID0gdjsgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlpID09IDUpIHsgcmVkID0gdjsgZ3JlZW4gPSBwOyBibHVlID0gcTsgfQogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShyZWQgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGdyZWVuICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShibHVlICogMjU1LjApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZwcmludGYoc3RkZXJyLCAiZG9uZS5cbiIpOwogICAgICAgIGZmbHVzaChzdGRlcnIpOwogICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEJsYXN0IGJhY2tncm91bmQgaW1hZ2UgdG8gZGlzcGxheSBidWZmZXIgYmVmb3JlIGJlZ2lubmluZyBQTkcgZGVjb2RlLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CiAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsgICAgLyogc2xpZ2h0bHkgb3B0aW1pemVkIHZlcnNpb24gKi8KICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7CiAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwogICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewoKICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgIH0KCiAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAwLCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAogICAgICBycG5nMl9pbmZvLmhlaWdodCk7CgogICAgcmV0dXJuIDA7Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKSAqLwoKCgoKCnN0YXRpYyB2b2lkIHJwbmcyX3hfZGlzcGxheV9yb3codWxnIHJvdykKewogICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7CiAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwogICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwogICAgdWNoICpzcmMsICpzcmMyPU5VTEw7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIsIGcsIGIsIGE7CiAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKICAgIHVsZyBpLCBwaXhlbDsKICAgIHN0YXRpYyBpbnQgcm93cz0wLCBwcmV2cGFzcz0oLTEpOwogICAgc3RhdGljIHVsZyBmaXJzdHJvdzsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICByb3dzIGFuZCBmaXJzdHJvdyBzaW1wbHkgdHJhY2sgaG93IG1hbnkgcm93cyAoYW5kIHdoaWNoIG9uZXMpIGhhdmUgbm90CiAgICB5ZXQgYmVlbiBkaXNwbGF5ZWQ7IGFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGNhbGwgWFB1dEltYWdlKCkgZm9yIGV2ZXJ5CiAgICByb3cgYW5kIG5vdCBib3RoZXIgd2l0aCB0aGUgcmVjb3Jkcy1rZWVwaW5nLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2Rpc3BsYXlfcm93KClcbiIpKQoKICAgIGlmIChycG5nMl9pbmZvLnBhc3MgIT0gcHJldnBhc3MpIHsKICAgICAgICBpZiAocGF1c2VfYWZ0ZXJfcGFzcyAmJiBycG5nMl9pbmZvLnBhc3MgPiAwKSB7CiAgICAgICAgICAgIFhFdmVudCBlOwogICAgICAgICAgICBLZXlTeW0gazsKCiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICIlczogIGVuZCBvZiBwYXNzICVkIG9mIDc7IGNsaWNrIGluIGltYWdlIHdpbmRvdyB0byBjb250aW51ZVxuIiwKICAgICAgICAgICAgICBQUk9HTkFNRSwgcHJldnBhc3MgKyAxKTsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIFhOZXh0RXZlbnQoZGlzcGxheSwgJmUpOwogICAgICAgICAgICB3aGlsZSAoIVFVSVQoZSxrKSk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBwYXNzICVkIG9mIDdcciIsIFBST0dOQU1FLCBycG5nMl9pbmZvLnBhc3MgKyAxKTsKICAgICAgICBmZmx1c2goc3RkZXJyKTsKICAgICAgICBwcmV2cGFzcyA9IHJwbmcyX2luZm8ucGFzczsKICAgIH0KCiAgICBpZiAocm93cyA9PSAwKQogICAgICAgIGZpcnN0cm93ID0gcm93OyAgIC8qIGZpcnN0IHJvdyB0aGF0IGlzIG5vdCB5ZXQgZGlzcGxheWVkICovCgogICAgKytyb3dzOyAgIC8qIGNvdW50IG9mIHJvd3MgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgZGlzcGxheWVkICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQXNpZGUgZnJvbSB0aGUgdXNlIG9mIHRoZSBycG5nMl9pbmZvIHN0cnVjdCwgdGhlIGxhY2sgb2YgYW4gb3V0ZXIgbG9vcAogICAgKG92ZXIgcm93cykgYW5kIG1vdmluZyB0aGUgWFB1dEltYWdlKCkgY2FsbCBvdXRzaWRlIHRoZSAiaWYgKGRlcHRoKSIKICAgIHRlc3RzLCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIHRvIHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkgaW4gdGhlIG5vbi0KICAgIHByb2dyZXNzaXZlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKCiAgICAgICAgc3JjID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgcm93KnJwbmcyX2luZm8ucm93Ynl0ZXM7CiAgICAgICAgaWYgKGJnX2ltYWdlKQogICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwogICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9IHI7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBiZ19ncmVlbjsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IGJnX2JsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZQogICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHJlZCwgICByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShncmVlbiwgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAzMikgewogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwoKICAgICAgICBzcmMgPSBycG5nMl9pbmZvLnJvd19wb2ludGVyc1tyb3ddOwogICAgICAgIGlmIChiZ19pbWFnZSkKICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewogICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByID0gKnNyYysrOwogICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBhID0gKnNyYysrOwogICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgIGJnX2dyZWVuID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBEaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IHJvd3Mgb3Igd2hlbiBvbiBvbmUgb2YgbGFzdCB0d28gcm93cy4gIChSZWdpb24KICAgIG1heSBpbmNsdWRlIHByZXZpb3VzbHkgZGlzcGxheWVkIGxpbmVzIGR1ZSB0byBpbnRlcmxhY2luZy0taS5lLiwgbm90CiAgICBjb250aWd1b3VzLiAgQWxzbywgc2Vjb25kLXRvLWxhc3Qgcm93IGlzIGZpbmFsIG9uZSBpbiBpbnRlcmxhY2VkIGltYWdlcwogICAgd2l0aCBvZGQgbnVtYmVyIG9mIHJvd3MuKSAgRm9yIGRlbW9zLCBmbHVzaCAoYW5kIGRlbGF5KSBhZnRlciBldmVyeSAxNnRoCiAgICByb3cgc28gInNwYXJzZSIgcGFzc2VzIGRvbid0IGdvIHR3aWNlIGFzIGZhc3QuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVtb190aW1pbmcgJiYgKHJvdyAtIGZpcnN0cm93ID49IDE2IHx8IHJvdyA+PSBycG5nMl9pbmZvLmhlaWdodC0yKSkgewogICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpZmlyc3Ryb3csIDAsCiAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwogICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgICAgICByb3dzID0gMDsKICAgICAgICB1c2xlZXAodXNsZWVwX2R1cmF0aW9uKTsKICAgIH0gZWxzZQogICAgaWYgKCFkZW1vX3RpbWluZyAmJiAoKHJvd3MgJiAweGYpID09IDAgfHwgcm93ID49IHJwbmcyX2luZm8uaGVpZ2h0LTIpKSB7CiAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClmaXJzdHJvdywgMCwKICAgICAgICAgIChpbnQpZmlyc3Ryb3csIHJwbmcyX2luZm8ud2lkdGgsIHJvdyAtIGZpcnN0cm93ICsgMSk7CiAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgIHJvd3MgPSAwOwogICAgfQoKfQoKCgoKCnN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkodm9pZCkKewogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2ZpbmlzaF9kaXNwbGF5KClcbiIpKQoKICAgIC8qIGxhc3Qgcm93IGhhcyBhbHJlYWR5IGJlZW4gZGlzcGxheWVkIGJ5IHJwbmcyX3hfZGlzcGxheV9yb3coKSwgc28gd2UKICAgICAqIGhhdmUgbm90aGluZyB0byBkbyBoZXJlIGV4Y2VwdCBzZXQgYSBmbGFnIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0CiAgICAgKiB0aGUgaW1hZ2UgaXMgZG9uZSAqLwoKICAgIHJwbmcyX2luZm8uc3RhdGUgPSBrRG9uZTsKICAgIHByaW50ZigKICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iKTsKICAgIGZmbHVzaChzdGRvdXQpOwp9CgoKCgoKc3RhdGljIHZvaWQgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsZyB3aWR0aCwgdWxnIGhlaWdodCkKewogICAgdWNoIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7CiAgICB1Y2ggYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwogICAgdWNoIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwogICAgdWNoICpzcmMsICpzcmMyPU5VTEw7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIsIGcsIGIsIGE7CiAgICB1bGcgaSwgcm93LCBsYXN0cm93ID0gMDsKICAgIHVsZyBwaXhlbDsKICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwoKCiAgICBUcmFjZSgoc3RkZXJyLCAiYmVnaW5uaW5nIGRpc3BsYXkgbG9vcCAoaW1hZ2VfY2hhbm5lbHMgPT0gJWQpXG4iLAogICAgICBycG5nMl9pbmZvLmNoYW5uZWxzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAod2lkdGggPSAlbGQsIHJvd2J5dGVzID0gJWQsIHhpbWFnZV9yb3dieXRlcyA9ICVkKVxuIiwKICAgICAgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5yb3dieXRlcywgeGltYWdlX3Jvd2J5dGVzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnBwID0gJWQpXG4iLCB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsKSkKICAgIFRyYWNlKChzdGRlcnIsICIgICAoYnl0ZV9vcmRlciA9ICVzKVxuIiwgeGltYWdlLT5ieXRlX29yZGVyID09IE1TQkZpcnN0PwogICAgICAiTVNCRmlyc3QiIDogKHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBMU0JGaXJzdD8gIkxTQkZpcnN0IiA6ICJ1bmtub3duIikpKQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFzaWRlIGZyb20gdGhlIHVzZSBvZiB0aGUgcnBuZzJfaW5mbyBzdHJ1Y3QgYW5kIG9mIHNyYzIgKGZvciBiYWNrZ3JvdW5kCiAgICBpbWFnZSksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgdG8gcnBuZ194X2Rpc3BsYXlfaW1hZ2UoKSBpbiB0aGUgbm9uLQogICAgcHJvZ3Jlc3NpdmUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbS0tZm9yIHRoZSBzaW1wbGUgcmVhc29uIHRoYXQgcmVkaXNwbGF5CiAgICBvZiB0aGUgaW1hZ2UgYWdhaW5zdCBhIG5ldyBiYWNrZ3JvdW5kIGhhcHBlbnMgYWZ0ZXIgdGhlIGltYWdlIGlzIGZ1bGx5CiAgICBkZWNvZGVkIGFuZCB0aGVyZWZvcmUgaXMsIGJ5IGRlZmluaXRpb24sIG5vbi1wcm9ncmVzc2l2ZS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwogICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOwoKICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSBzdGFydHJvdzsgIHJvdyA8IHN0YXJ0cm93K2hlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHNyYyA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIHJvdypycG5nMl9pbmZvLnJvd2J5dGVzOwogICAgICAgICAgICBpZiAoYmdfaW1hZ2UpCiAgICAgICAgICAgICAgICBzcmMyID0gYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKnNyYysrOwojaWZkZWYgTk9fMjRCSVRfTUFTS1MKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfQojZWxzZQogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQojaWZkZWYgTk9fMjRCSVRfTUFTS1MKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfQojZWxzZQogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKFJTaGlmdCA8IDApPyByZWQgICA8PCAoLVJTaGlmdCkgOiByZWQgICA+PiBSU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoR1NoaWZ0IDwgMCk/IGdyZWVuIDw8ICgtR1NoaWZ0KSA6IGdyZWVuID4+IEdTaGlmdDsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IChCU2hpZnQgPCAwKT8gYmx1ZSAgPDwgKC1CU2hpZnQpIDogYmx1ZSAgPj4gQlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAmIFJNYXNrKSB8IChncmVlbiAmIEdNYXNrKSB8IChibHVlICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0L1JNYXNrL2V0Yy4gaGVyZSwgdG9vKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwogICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7CiAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgdXNoIHJlZCwgZ3JlZW4sIGJsdWU7CgogICAgICAgIGZvciAobGFzdHJvdyA9IHJvdyA9IHN0YXJ0cm93OyAgcm93IDwgc3RhcnRyb3craGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbcm93XTsKICAgICAgICAgICAgaWYgKGJnX2ltYWdlKQogICAgICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgLyogaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoYmdfaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfcmVkICAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX2JsdWUgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCliZ19yZWQgICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliZ19ibHVlICA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGJhY2sgaW50bwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgYXJndW1lbnQgKD09IGZnIGJ5dGUgaGVyZTogIHNhZmUpICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZywgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYiwgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaClnIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwogICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCAxNik7CiAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKICAgIGlmIChsYXN0cm93IDwgc3RhcnRyb3craGVpZ2h0KSB7CiAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAogICAgICAgICAgKGludClsYXN0cm93LCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodC1sYXN0cm93KTsKICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICB9CgogICAgKHZvaWQpc3RhcnRjb2w7CiAgICAodm9pZCl3aWR0aDsKCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlKCkgKi8KCgoKCgojaWZkZWYgRkVBVFVSRV9MT09QCgpzdGF0aWMgdm9pZCBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSh2b2lkKQp7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7CiAgICB1Y2ggcjFfaW52LCByMl9pbnYsIGcxX2ludiwgZzJfaW52LCBiMV9pbnYsIGIyX2ludjsKICAgIGludCBrLCBobWF4LCBtYXg7CiAgICBpbnQgeGlkeCwgeWlkeCwgeWlkeF9tYXg7CiAgICBpbnQgZXZlbl9vZGRfdmVydCwgZXZlbl9vZGRfaG9yaXosIGV2ZW5fb2RkOwogICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7CiAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKICAgIHVsZyBpLCByb3c7CgoKICAgIGJnc2NhbGUgPSAocGF0ID09IDApPyA4IDogYmdzY2FsZV9kZWZhdWx0OwogICAgeWlkeF9tYXggPSBiZ3NjYWxlIC0gMTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBWZXJ0aWNhbCBncmFkaWVudHMgKHJhbXBzKSBpbiBOeE4gc3F1YXJlcywgYWx0ZXJuYXRpbmcgZGlyZWN0aW9uIGFuZAogICAgY29sb3JzIChOID09IGJnc2NhbGUpLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAwKSB7CiAgICAgICAgdWNoIHIxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0ucjsKICAgICAgICB1Y2ggZzFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5nOwogICAgICAgIHVjaCBiMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmI7CiAgICAgICAgdWNoIHIyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0ucjsKICAgICAgICB1Y2ggZzJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5nOwogICAgICAgIHVjaCBiMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmI7CiAgICAgICAgaW50IHIxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uciAtIHIxX21pbjsKICAgICAgICBpbnQgZzFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nIC0gZzFfbWluOwogICAgICAgIGludCBiMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmIgLSBiMV9taW47CiAgICAgICAgaW50IHIyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uciAtIHIyX21pbjsKICAgICAgICBpbnQgZzJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nIC0gZzJfbWluOwogICAgICAgIGludCBiMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmIgLSBiMl9taW47CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwogICAgICAgICAgICBldmVuX29kZF92ZXJ0ID0gKGludCkoKHJvdyAvIGJnc2NhbGUpICYgMSk7CgogICAgICAgICAgICByMSA9IHIxX21pbiArIChyMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzEgPSBnMV9taW4gKyAoZzFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIxID0gYjFfbWluICsgKGIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICByMV9pbnYgPSByMV9taW4gKyAocjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzFfaW52ID0gZzFfbWluICsgKGcxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIxX2ludiA9IGIxX21pbiArIChiMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwoKICAgICAgICAgICAgcjIgPSByMl9taW4gKyAocjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcyID0gZzJfbWluICsgKGcyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMiA9IGIyX21pbiArIChiMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjJfaW52ID0gcjJfbWluICsgKHIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcyX2ludiA9IGcyX21pbiArIChnMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMl9pbnYgPSBiMl9taW4gKyAoYjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgZXZlbl9vZGRfaG9yaXogPSAoaW50KSgoaSAvIGJnc2NhbGUpICYgMSk7CiAgICAgICAgICAgICAgICBldmVuX29kZCA9IGV2ZW5fb2RkX3ZlcnQgXiBldmVuX29kZF9ob3JpejsKICAgICAgICAgICAgICAgIGludmVydF9jb2x1bW4gPQogICAgICAgICAgICAgICAgICAoZXZlbl9vZGRfaG9yaXogJiYgKGJnW3BhdF0udHlwZSAmIDB4MTApKTsKICAgICAgICAgICAgICAgIGlmIChldmVuX29kZCA9PSAwKSB7ICAgICAgICAvKiBncmFkaWVudCAjMSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpbnZlcnRfY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMV9pbnY7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzE7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogZ3JhZGllbnQgIzIgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKGludmVydF9jb2x1bW4gJiYgaW52ZXJ0X2dyYWRpZW50MikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnZlcnRfY29sdW1uICYmICFpbnZlcnRfZ3JhZGllbnQyKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMjsgICAgICAgLyogbm90IGludmVydGVkIG9yICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMjsgICAgICAgLyogIGRvdWJseSBpbnZlcnRlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyX2ludjsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyX2ludjsgICAvKiBzaW5nbHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyX2ludjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU29mdCBncmFkaWVudC1kaWFtb25kcyB3aXRoIHNjYWxlID0gYmdzY2FsZS4gIENvZGUgY29udHJpYnV0ZWQgYnkgQWRhbQogICAgTS4gQ29zdGVsbG8uCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAxKSB7CgogICAgICAgIGhtYXggPSAoYmdzY2FsZS0xKS8yOyAgIC8qIGhhbGYgdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwogICAgICAgIG1heCA9IDIqaG1heDsgICAgICAgICAgIC8qIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KCiAgICAgICAgcjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0ucjsKICAgICAgICBnMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5nOwogICAgICAgIGIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmI7CiAgICAgICAgcjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0ucjsKICAgICAgICBnMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5nOwogICAgICAgIGIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmI7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeWlkeCA9IChpbnQpKHJvdyAlIGJnc2NhbGUpOwogICAgICAgICAgICBpZiAoeWlkeCA+IGhtYXgpCiAgICAgICAgICAgICAgICB5aWR4ID0gYmdzY2FsZS0xIC0geWlkeDsKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICB4aWR4ID0gKGludCkoaSAlIGJnc2NhbGUpOwogICAgICAgICAgICAgICAgaWYgKHhpZHggPiBobWF4KQogICAgICAgICAgICAgICAgICAgIHhpZHggPSBiZ3NjYWxlLTEgLSB4aWR4OwogICAgICAgICAgICAgICAgayA9IHhpZHggKyB5aWR4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKnIxICsgKG1heC1rKSpyMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqZzEgKyAobWF4LWspKmcyKSAvIG1heDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypiMSArIChtYXgtaykqYjIpIC8gbWF4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJhZGlhbCAic3RhcmJ1cnN0IiB3aXRoIGF6aW11dGhhbCBzaW51c29pZHM7IFtldmVudHVhbGx5IG51bWJlciBvZiBzaW51LQogICAgc29pZHMgd2lsbCBlcXVhbCBiZ3NjYWxlP10uICBUaGlzIG9uZSBpcyBzbG93IGJ1dCB2ZXJ5IGNvb2wuICBDb2RlIGNvbi0KICAgIHRyaWJ1dGVkIGJ5IFBpZXRlciBTLiB2YW4gZGVyIE1ldWxlbiAob3JpZ2luYWxseSBpbiBTbWFsbHRhbGspLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMikgewogICAgICAgIHVjaCBjaDsKICAgICAgICBpbnQgaWksIHgsIHksIGh3LCBoaCwgZ3JheXNwb3Q7CiAgICAgICAgZG91YmxlIGZyZXEsIHJvdGF0ZSwgc2F0dXJhdGUsIGdyYXksIGludGVuc2l0eTsKICAgICAgICBkb3VibGUgYW5nbGU9MC4wLCBhb2Zmc2V0PTAuMCwgbWF4RGlzdCwgZGlzdDsKICAgICAgICBkb3VibGUgcmVkPTAuMCwgZ3JlZW49MC4wLCBibHVlPTAuMCwgaHVlLCBzLCB2LCBmLCBwLCBxLCB0OwoKICAgICAgICBoaCA9IChpbnQpKHJwbmcyX2luZm8uaGVpZ2h0IC8gMik7CiAgICAgICAgaHcgPSAoaW50KShycG5nMl9pbmZvLndpZHRoIC8gMik7CgogICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgcmFkaWFsIHdhdmVzOgogICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCiAgICAgICAgICogICBncmF5c3BvdDogIHNpemUgb2YgdGhlIGdyYXlpbmcgY2VudGVyIGFyZWEgKGFudGktYWxpYXMpCiAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKICAgICAgICAgKi8KICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOwogICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7CiAgICAgICAgZnJlcSA9IE1BWCgoZG91YmxlKWJnW3BhdF0uYmdfZnJlcSwgMC4wKTsKICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOwogICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwogICAgICAgIGdyYXkgPSAwLjA7CiAgICAgICAgaW50ZW5zaXR5ID0gMC4wOwogICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeSA9IChpbnQpKHJvdyAtIGhoKTsKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICB4ID0gKGludCkoaSAtIGh3KTsKICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7CiAgICAgICAgICAgICAgICBncmF5ID0gKGRvdWJsZSlNQVgoQUJTKHkpLCBBQlMoeCkpIC8gZ3JheXNwb3Q7CiAgICAgICAgICAgICAgICBncmF5ID0gTUlOKDEuMCwgZ3JheSk7CiAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwogICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gY29zKChhbmdsZSsocm90YXRlKmRpc3QqUEkpKSAqIGZyZXEpICoKICAgICAgICAgICAgICAgICAgZ3JheSAqIHNhdHVyYXRlOwogICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwogICAgICAgICAgICAgICAgaHVlID0gKGFuZ2xlICsgUEkpICogSU5WX1BJXzM2MCArIGFvZmZzZXQ7CiAgICAgICAgICAgICAgICBzID0gZ3JheSAqICgoZG91YmxlKShBQlMoeCkrQUJTKHkpKSAvIChkb3VibGUpKGh3ICsgaGgpKTsKICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKICAgICAgICAgICAgICAgIHYgPSBNSU4oTUFYKGludGVuc2l0eSwwLjApLCAxLjApOwoKICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewogICAgICAgICAgICAgICAgICAgIGNoID0gKHVjaCkodiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQogICAgICAgICAgICAgICAgICAgICAgICBodWUgLT0gKCgoaW50KShodWUgLyAzNjAuMCkpICogMzYwLjApOwogICAgICAgICAgICAgICAgICAgIGh1ZSAvPSA2MC4wOwogICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7CiAgICAgICAgICAgICAgICAgICAgZiA9IGh1ZSAtIChkb3VibGUpaWk7CiAgICAgICAgICAgICAgICAgICAgcCA9ICgxLjAgLSBzKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgdCA9ICgxLjAgLSAocyAqICgxLjAgLSBmKSkpICogdjsKICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpaSA9PSAwKSB7IHJlZCA9IHY7IGdyZWVuID0gdDsgYmx1ZSA9IHA7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAyKSB7IHJlZCA9IHA7IGdyZWVuID0gdjsgYmx1ZSA9IHQ7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAzKSB7IHJlZCA9IHA7IGdyZWVuID0gcTsgYmx1ZSA9IHY7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA1KSB7IHJlZCA9IHY7IGdyZWVuID0gcDsgYmx1ZSA9IHE7IH0KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkocmVkICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoYmx1ZSAqIDI1NS4wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlKCkgKi8KCgoKCgpzdGF0aWMgaW50IGlzX251bWJlcihjaGFyICpwKQp7CiAgICB3aGlsZSAoKnApIHsKICAgICAgICBpZiAoIWlzZGlnaXQoKnApKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgKytwOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCiNlbmRpZiAvKiBGRUFUVVJFX0xPT1AgKi8KCgoKCgpzdGF0aWMgdm9pZCBycG5nMl94X2NsZWFudXAodm9pZCkKewogICAgaWYgKGJnX2ltYWdlICYmIGJnX2RhdGEpIHsKICAgICAgICBmcmVlKGJnX2RhdGEpOwogICAgICAgIGJnX2RhdGEgPSBOVUxMOwogICAgfQoKICAgIGlmIChycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKICAgICAgICBmcmVlKHJwbmcyX2luZm8uaW1hZ2VfZGF0YSk7CiAgICAgICAgcnBuZzJfaW5mby5pbWFnZV9kYXRhID0gTlVMTDsKICAgIH0KCiAgICBpZiAocnBuZzJfaW5mby5yb3dfcG9pbnRlcnMpIHsKICAgICAgICBmcmVlKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKTsKICAgICAgICBycG5nMl9pbmZvLnJvd19wb2ludGVycyA9IE5VTEw7CiAgICB9CgogICAgaWYgKHhpbWFnZSkgewogICAgICAgIGlmICh4aW1hZ2UtPmRhdGEpIHsKICAgICAgICAgICAgZnJlZSh4aW1hZ2UtPmRhdGEpOyAgICAgICAgICAgLyogd2UgYWxsb2NhdGVkIGl0LCBzbyB3ZSBmcmVlIGl0ICovCiAgICAgICAgICAgIHhpbWFnZS0+ZGF0YSA9IChjaGFyICopTlVMTDsgIC8qICBpbnN0ZWFkIG9mIFhEZXN0cm95SW1hZ2UoKSAqLwogICAgICAgIH0KICAgICAgICBYRGVzdHJveUltYWdlKHhpbWFnZSk7CiAgICAgICAgeGltYWdlID0gTlVMTDsKICAgIH0KCiAgICBpZiAoaGF2ZV9nYykKICAgICAgICBYRnJlZUdDKGRpc3BsYXksIGdjKTsKCiAgICBpZiAoaGF2ZV93aW5kb3cpCiAgICAgICAgWERlc3Ryb3lXaW5kb3coZGlzcGxheSwgd2luZG93KTsKCiAgICBpZiAoaGF2ZV9jb2xvcm1hcCkKICAgICAgICBYRnJlZUNvbG9ybWFwKGRpc3BsYXksIGNvbG9ybWFwKTsKCiAgICBpZiAoaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCkKICAgICAgICBYRnJlZSh2aXN1YWxfbGlzdCk7Cn0KCgoKCgpzdGF0aWMgaW50IHJwbmcyX3hfbXNiKHVsZyB1MzJ2YWwpCnsKICAgIGludCBpOwoKICAgIGZvciAoaSA9IDMxOyAgaSA+PSAwOyAgLS1pKSB7CiAgICAgICAgaWYgKHUzMnZhbCAmIDB4ODAwMDAwMDBMKQogICAgICAgICAgICBicmVhazsKICAgICAgICB1MzJ2YWwgPDw9IDE7CiAgICB9CiAgICByZXR1cm4gaTsKfQo=