LyoKICogUlBDIGJpbmRpbmcgQVBJCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDAzIE1pa2UgSGVhcm4KICogQ29weXJpZ2h0IDIwMDQgRmlsaXAgTmF2YXJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBUT0RPOgogKiAgLSBhIHdob2xlIGxvdAogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCgojaW5jbHVkZSAicnBjLmgiCiNpbmNsdWRlICJycGNuZHIuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgojaW5jbHVkZSAicnBjX2JpbmRpbmcuaCIKI2luY2x1ZGUgInJwY19tZXNzYWdlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChycGMpOwoKTFBTVFIgUlBDUlQ0X3N0cm5kdXBBKExQQ1NUUiBzcmMsIElOVCBzbGVuKQp7CiAgRFdPUkQgbGVuOwogIExQU1RSIHM7CiAgaWYgKCFzcmMpIHJldHVybiBOVUxMOwogIGlmIChzbGVuID09IC0xKSBzbGVuID0gc3RybGVuKHNyYyk7CiAgbGVuID0gc2xlbjsKICBzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbisxKTsKICBtZW1jcHkocywgc3JjLCBsZW4pOwogIHNbbGVuXSA9IDA7CiAgcmV0dXJuIHM7Cn0KCkxQU1RSIFJQQ1JUNF9zdHJkdXBXdG9BKExQV1NUUiBzcmMpCnsKICBEV09SRCBsZW47CiAgTFBTVFIgczsKICBpZiAoIXNyYykgcmV0dXJuIE5VTEw7CiAgbGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHNyYywgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwogIHMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuKTsKICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgc3JjLCAtMSwgcywgbGVuLCBOVUxMLCBOVUxMKTsKICByZXR1cm4gczsKfQoKTFBXU1RSIFJQQ1JUNF9zdHJkdXBBdG9XKExQU1RSIHNyYykKewogIERXT1JEIGxlbjsKICBMUFdTVFIgczsKICBpZiAoIXNyYykgcmV0dXJuIE5VTEw7CiAgbGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHNyYywgLTEsIE5VTEwsIDApOwogIHMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuKnNpemVvZihXQ0hBUikpOwogIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzcmMsIC0xLCBzLCBsZW4pOwogIHJldHVybiBzOwp9CgpMUFdTVFIgUlBDUlQ0X3N0cm5kdXBXKExQV1NUUiBzcmMsIElOVCBzbGVuKQp7CiAgRFdPUkQgbGVuOwogIExQV1NUUiBzOwogIGlmICghc3JjKSByZXR1cm4gTlVMTDsKICBpZiAoc2xlbiA9PSAtMSkgc2xlbiA9IHN0cmxlblcoc3JjKTsKICBsZW4gPSBzbGVuOwogIHMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKGxlbisxKSpzaXplb2YoV0NIQVIpKTsKICBtZW1jcHkocywgc3JjLCBsZW4qc2l6ZW9mKFdDSEFSKSk7CiAgc1tsZW5dID0gMDsKICByZXR1cm4gczsKfQoKdm9pZCBSUENSVDRfc3RyZnJlZShMUFNUUiBzcmMpCnsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmMpOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9DcmVhdGVDb25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qKiBDb25uZWN0aW9uLCBCT09MIHNlcnZlciwgTFBTVFIgUHJvdHNlcSwgTFBTVFIgTmV0d29ya0FkZHIsIExQU1RSIEVuZHBvaW50LCBMUFNUUiBOZXR3b3JrT3B0aW9ucywgUnBjQmluZGluZyogQmluZGluZykKewogIFJwY0Nvbm5lY3Rpb24qIE5ld0Nvbm5lY3Rpb247CgogIE5ld0Nvbm5lY3Rpb24gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFJwY0Nvbm5lY3Rpb24pKTsKICBOZXdDb25uZWN0aW9uLT5zZXJ2ZXIgPSBzZXJ2ZXI7CiAgTmV3Q29ubmVjdGlvbi0+UHJvdHNlcSA9IFJQQ1JUNF9zdHJkdXBBKFByb3RzZXEpOwogIE5ld0Nvbm5lY3Rpb24tPk5ldHdvcmtBZGRyID0gUlBDUlQ0X3N0cmR1cEEoTmV0d29ya0FkZHIpOwogIE5ld0Nvbm5lY3Rpb24tPkVuZHBvaW50ID0gUlBDUlQ0X3N0cmR1cEEoRW5kcG9pbnQpOwogIE5ld0Nvbm5lY3Rpb24tPlVzZWQgPSBCaW5kaW5nOwogIE5ld0Nvbm5lY3Rpb24tPk1heFRyYW5zbWlzc2lvblNpemUgPSBSUENfTUFYX1BBQ0tFVF9TSVpFOwoKICBUUkFDRSgiY29ubmVjdGlvbjogJXBcbiIsIE5ld0Nvbm5lY3Rpb24pOwogICpDb25uZWN0aW9uID0gTmV3Q29ubmVjdGlvbjsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKQp7CiAgVFJBQ0UoImNvbm5lY3Rpb246ICVwXG4iLCBDb25uZWN0aW9uKTsKCiAgUlBDUlQ0X0Nsb3NlQ29ubmVjdGlvbihDb25uZWN0aW9uKTsKICBSUENSVDRfc3RyZnJlZShDb25uZWN0aW9uLT5FbmRwb2ludCk7CiAgUlBDUlQ0X3N0cmZyZWUoQ29ubmVjdGlvbi0+TmV0d29ya0FkZHIpOwogIFJQQ1JUNF9zdHJmcmVlKENvbm5lY3Rpb24tPlByb3RzZXEpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIENvbm5lY3Rpb24pOwogIHJldHVybiBSUENfU19PSzsKfQoKc3RhdGljIFJQQ19TVEFUVVMgcnBjcnQ0X2Nvbm5lY3RfcGlwZShScGNDb25uZWN0aW9uICpDb25uZWN0aW9uLCBMUENTVFIgcG5hbWUpCnsKICBUUkFDRSgibGlzdGVuaW5nIG9uICVzXG4iLCBwbmFtZSk7CgogIENvbm5lY3Rpb24tPmNvbm4gPSBDcmVhdGVOYW1lZFBpcGVBKHBuYW1lLCBQSVBFX0FDQ0VTU19EVVBMRVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9UWVBFX01FU1NBR0UgfCBQSVBFX1JFQURNT0RFX01FU1NBR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ19NQVhfUEFDS0VUX1NJWkUsIFJQQ19NQVhfUEFDS0VUX1NJWkUsIDUwMDAsIE5VTEwpOwogIG1lbXNldCgmQ29ubmVjdGlvbi0+b3ZsLCAwLCBzaXplb2YoQ29ubmVjdGlvbi0+b3ZsKSk7CiAgQ29ubmVjdGlvbi0+b3ZsLmhFdmVudCA9IENyZWF0ZUV2ZW50VyhOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CiAgaWYgKENvbm5lY3ROYW1lZFBpcGUoQ29ubmVjdGlvbi0+Y29ubiwgJkNvbm5lY3Rpb24tPm92bCkpCiAgICAgcmV0dXJuIFJQQ19TX09LOwoKICBXQVJOKCJDb3VsZG4ndCBDb25uZWN0TmFtZWRQaXBlIChlcnJvciB3YXMgJWxkKVxuIiwgR2V0TGFzdEVycm9yKCkpOwogIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9QSVBFX0NPTk5FQ1RFRCkgewogICAgU2V0RXZlbnQoQ29ubmVjdGlvbi0+b3ZsLmhFdmVudCk7CiAgICByZXR1cm4gUlBDX1NfT0s7CiAgfQogIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JT19QRU5ESU5HKSB7CiAgICAvKiBGSVhNRTogbG9va3MgbGlrZSB3ZSBuZWVkIHRvIEdldE92ZXJsYXBwZWRSZXN1bHQgaGVyZT8gKi8KICAgIHJldHVybiBSUENfU19PSzsKICB9CiAgcmV0dXJuIFJQQ19TX1NFUlZFUl9VTkFWQUlMQUJMRTsKfQoKc3RhdGljIFJQQ19TVEFUVVMgcnBjcnQ0X29wZW5fcGlwZShScGNDb25uZWN0aW9uICpDb25uZWN0aW9uLCBMUENTVFIgcG5hbWUsIEJPT0wgd2FpdCkKewogIEhBTkRMRSBjb25uOwogIERXT1JEIGVyciwgZHdNb2RlOwoKICBUUkFDRSgiY29ubmVjdGluZyB0byAlc1xuIiwgcG5hbWUpOwoKICB3aGlsZSAoVFJVRSkgewogICAgY29ubiA9IENyZWF0ZUZpbGVBKHBuYW1lLCBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwgMCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCAwLCAwKTsKICAgIGlmIChjb25uICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSBicmVhazsKICAgIGVyciA9IEdldExhc3RFcnJvcigpOwogICAgaWYgKGVyciA9PSBFUlJPUl9QSVBFX0JVU1kpIHsKICAgICAgVFJBQ0UoImNvbm5lY3Rpb24gZmFpbGVkLCBlcnJvcj0lbHhcbiIsIGVycik7CiAgICAgIHJldHVybiBSUENfU19TRVJWRVJfVE9PX0JVU1k7CiAgICB9CiAgICBpZiAoIXdhaXQpCiAgICAgIHJldHVybiBSUENfU19TRVJWRVJfVU5BVkFJTEFCTEU7CiAgICBpZiAoIVdhaXROYW1lZFBpcGVBKHBuYW1lLCBOTVBXQUlUX1dBSVRfRk9SRVZFUikpIHsKICAgICAgZXJyID0gR2V0TGFzdEVycm9yKCk7CiAgICAgIFdBUk4oImNvbm5lY3Rpb24gZmFpbGVkLCBlcnJvcj0lbHhcbiIsIGVycik7CiAgICAgIHJldHVybiBSUENfU19TRVJWRVJfVU5BVkFJTEFCTEU7CiAgICB9CiAgfQoKICAvKiBzdWNjZXNzICovCiAgbWVtc2V0KCZDb25uZWN0aW9uLT5vdmwsIDAsIHNpemVvZihDb25uZWN0aW9uLT5vdmwpKTsKICAvKiBwaXBlIGlzIGNvbm5lY3RlZDsgY2hhbmdlIHRvIG1lc3NhZ2UtcmVhZCBtb2RlLiAqLwogIGR3TW9kZSA9IFBJUEVfUkVBRE1PREVfTUVTU0FHRTsgCiAgU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoY29ubiwgJmR3TW9kZSwgTlVMTCwgTlVMTCk7CiAgQ29ubmVjdGlvbi0+b3ZsLmhFdmVudCA9IENyZWF0ZUV2ZW50VyhOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CiAgQ29ubmVjdGlvbi0+Y29ubiA9IGNvbm47CgogIHJldHVybiBSUENfU19PSzsKfQoKUlBDX1NUQVRVUyBSUENSVDRfT3BlbkNvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbikKewogIFJQQ19TVEFUVVMgciA9IFJQQ19TX09LOwoKICBUUkFDRSgiKENvbm5lY3Rpb24gPT0gXiVwKVxuIiwgQ29ubmVjdGlvbik7CgogIC8qIGFscmVhZHkgY29ubmVjdGVkPyAqLwogIGlmIChDb25uZWN0aW9uLT5jb25uKQogICAgIHJldHVybiByOwoKICAvKiBwcm90c2VxPW5jYWxycGM6IHN1cHBvc2VkIHRvIHVzZSBOVCBMUEMgcG9ydHMsCiAgICogYnV0IHdlJ2xsIGltcGxlbWVudCBpdCB3aXRoIG5hbWVkIHBpcGVzIGZvciBub3cgKi8KICBpZiAoc3RyY21wKENvbm5lY3Rpb24tPlByb3RzZXEsICJuY2FscnBjIikgPT0gMCkgewogICAgc3RhdGljIExQQ1NUUiBwcmVmaXggPSAiXFxcXC5cXHBpcGVcXGxycGNcXCI7CiAgICBMUFNUUiBwbmFtZTsKICAgIHBuYW1lID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKENvbm5lY3Rpb24tPkVuZHBvaW50KSArIDEpOwogICAgc3RyY2F0KHN0cmNweShwbmFtZSwgcHJlZml4KSwgQ29ubmVjdGlvbi0+RW5kcG9pbnQpOwoKICAgIGlmIChDb25uZWN0aW9uLT5zZXJ2ZXIpCiAgICAgIHIgPSBycGNydDRfY29ubmVjdF9waXBlKENvbm5lY3Rpb24sIHBuYW1lKTsKICAgIGVsc2UKICAgICAgciA9IHJwY3J0NF9vcGVuX3BpcGUoQ29ubmVjdGlvbiwgcG5hbWUsIFRSVUUpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcG5hbWUpOwogIH0KICAvKiBwcm90c2VxPW5jYWNuX25wOiBuYW1lZCBwaXBlcyAqLwogIGVsc2UgaWYgKHN0cmNtcChDb25uZWN0aW9uLT5Qcm90c2VxLCAibmNhY25fbnAiKSA9PSAwKSB7CiAgICBzdGF0aWMgTFBDU1RSIHByZWZpeCA9ICJcXFxcLiI7CiAgICBMUFNUUiBwbmFtZTsKICAgIHBuYW1lID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmxlbihwcmVmaXgpICsgc3RybGVuKENvbm5lY3Rpb24tPkVuZHBvaW50KSArIDEpOwogICAgc3RyY2F0KHN0cmNweShwbmFtZSwgcHJlZml4KSwgQ29ubmVjdGlvbi0+RW5kcG9pbnQpOwogICAgaWYgKENvbm5lY3Rpb24tPnNlcnZlcikKICAgICAgciA9IHJwY3J0NF9jb25uZWN0X3BpcGUoQ29ubmVjdGlvbiwgcG5hbWUpOwogICAgZWxzZQogICAgICByID0gcnBjcnQ0X29wZW5fcGlwZShDb25uZWN0aW9uLCBwbmFtZSwgRkFMU0UpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcG5hbWUpOwogIH0KICBlbHNlIHsKICAgIEVSUigicHJvdHNlcSAlcyBub3Qgc3VwcG9ydGVkXG4iLCBDb25uZWN0aW9uLT5Qcm90c2VxKTsKICAgIHIgPSBSUENfU19QUk9UU0VRX05PVF9TVVBQT1JURUQ7CiAgfQogCiAgcmV0dXJuIHI7Cn0KClJQQ19TVEFUVVMgUlBDUlQ0X0Nsb3NlQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKQp7CiAgVFJBQ0UoIihDb25uZWN0aW9uID09IF4lcClcbiIsIENvbm5lY3Rpb24pOwogIGlmIChDb25uZWN0aW9uLT5jb25uKSB7CiAgICBGbHVzaEZpbGVCdWZmZXJzKENvbm5lY3Rpb24tPmNvbm4pOwogICAgQ2xvc2VIYW5kbGUoQ29ubmVjdGlvbi0+Y29ubik7CiAgICBDb25uZWN0aW9uLT5jb25uID0gMDsKICB9CiAgaWYgKENvbm5lY3Rpb24tPm92bC5oRXZlbnQpIHsKICAgIENsb3NlSGFuZGxlKENvbm5lY3Rpb24tPm92bC5oRXZlbnQpOwogICAgQ29ubmVjdGlvbi0+b3ZsLmhFdmVudCA9IDA7CiAgfQogIHJldHVybiBSUENfU19PSzsKfQoKUlBDX1NUQVRVUyBSUENSVDRfU3Bhd25Db25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qKiBDb25uZWN0aW9uLCBScGNDb25uZWN0aW9uKiBPbGRDb25uZWN0aW9uKQp7CiAgUnBjQ29ubmVjdGlvbiogTmV3Q29ubmVjdGlvbjsKICBSUENfU1RBVFVTIGVyciA9IFJQQ1JUNF9DcmVhdGVDb25uZWN0aW9uKCZOZXdDb25uZWN0aW9uLCBPbGRDb25uZWN0aW9uLT5zZXJ2ZXIsIE9sZENvbm5lY3Rpb24tPlByb3RzZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRDb25uZWN0aW9uLT5OZXR3b3JrQWRkciwgT2xkQ29ubmVjdGlvbi0+RW5kcG9pbnQsIE5VTEwsIE5VTEwpOwogIGlmIChlcnIgPT0gUlBDX1NfT0spIHsKICAgIC8qIGJlY2F1c2Ugb2YgdGhlIHdheSBuYW1lZCBwaXBlcyB3b3JrLCB3ZSdsbCB0cmFuc2ZlciB0aGUgY29ubmVjdGVkIHBpcGUKICAgICAqIHRvIHRoZSBjaGlsZCwgdGhlbiByZW9wZW4gdGhlIHNlcnZlciBiaW5kaW5nIHRvIGNvbnRpbnVlIGxpc3RlbmluZyAqLwogICAgTmV3Q29ubmVjdGlvbi0+Y29ubiA9IE9sZENvbm5lY3Rpb24tPmNvbm47CiAgICBOZXdDb25uZWN0aW9uLT5vdmwgPSBPbGRDb25uZWN0aW9uLT5vdmw7CiAgICBPbGRDb25uZWN0aW9uLT5jb25uID0gMDsKICAgIG1lbXNldCgmT2xkQ29ubmVjdGlvbi0+b3ZsLCAwLCBzaXplb2YoT2xkQ29ubmVjdGlvbi0+b3ZsKSk7CiAgICAqQ29ubmVjdGlvbiA9IE5ld0Nvbm5lY3Rpb247CiAgICBSUENSVDRfT3BlbkNvbm5lY3Rpb24oT2xkQ29ubmVjdGlvbik7CiAgfQogIHJldHVybiBlcnI7Cn0KCnN0YXRpYyBSUENfU1RBVFVTIFJQQ1JUNF9BbGxvY0JpbmRpbmcoUnBjQmluZGluZyoqIEJpbmRpbmcsIEJPT0wgc2VydmVyKQp7CiAgUnBjQmluZGluZyogTmV3QmluZGluZzsKCiAgTmV3QmluZGluZyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoUnBjQmluZGluZykpOwogIE5ld0JpbmRpbmctPnJlZnMgPSAxOwogIE5ld0JpbmRpbmctPnNlcnZlciA9IHNlcnZlcjsKCiAgKkJpbmRpbmcgPSBOZXdCaW5kaW5nOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KClJQQ19TVEFUVVMgUlBDUlQ0X0NyZWF0ZUJpbmRpbmdBKFJwY0JpbmRpbmcqKiBCaW5kaW5nLCBCT09MIHNlcnZlciwgTFBTVFIgUHJvdHNlcSkKewogIFJwY0JpbmRpbmcqIE5ld0JpbmRpbmc7CgogIFJQQ1JUNF9BbGxvY0JpbmRpbmcoJk5ld0JpbmRpbmcsIHNlcnZlcik7CiAgTmV3QmluZGluZy0+UHJvdHNlcSA9IFJQQ1JUNF9zdHJkdXBBKFByb3RzZXEpOwoKICBUUkFDRSgiYmluZGluZzogJXBcbiIsIE5ld0JpbmRpbmcpOwogICpCaW5kaW5nID0gTmV3QmluZGluZzsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9DcmVhdGVCaW5kaW5nVyhScGNCaW5kaW5nKiogQmluZGluZywgQk9PTCBzZXJ2ZXIsIExQV1NUUiBQcm90c2VxKQp7CiAgUnBjQmluZGluZyogTmV3QmluZGluZzsKCiAgUlBDUlQ0X0FsbG9jQmluZGluZygmTmV3QmluZGluZywgc2VydmVyKTsKICBOZXdCaW5kaW5nLT5Qcm90c2VxID0gUlBDUlQ0X3N0cmR1cFd0b0EoUHJvdHNlcSk7CgogIFRSQUNFKCJiaW5kaW5nOiAlcFxuIiwgTmV3QmluZGluZyk7CiAgKkJpbmRpbmcgPSBOZXdCaW5kaW5nOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KClJQQ19TVEFUVVMgUlBDUlQ0X0NvbXBsZXRlQmluZGluZ0EoUnBjQmluZGluZyogQmluZGluZywgTFBTVFIgTmV0d29ya0FkZHIsICBMUFNUUiBFbmRwb2ludCwgIExQU1RSIE5ldHdvcmtPcHRpb25zKQp7CiAgVFJBQ0UoIihScGNCaW5kaW5nID09IF4lcCwgTmV0d29ya0FkZHIgPT0gXCIlc1wiLCBFbmRQb2ludCA9PSBcIiVzXCIsIE5ldHdvcmtPcHRpb25zID09IFwiJXNcIilcbiIsIEJpbmRpbmcsCiAgIGRlYnVnc3RyX2EoTmV0d29ya0FkZHIpLCBkZWJ1Z3N0cl9hKEVuZHBvaW50KSwgZGVidWdzdHJfYShOZXR3b3JrT3B0aW9ucykpOwoKICBSUENSVDRfc3RyZnJlZShCaW5kaW5nLT5OZXR3b3JrQWRkcik7CiAgQmluZGluZy0+TmV0d29ya0FkZHIgPSBSUENSVDRfc3RyZHVwQShOZXR3b3JrQWRkcik7CiAgUlBDUlQ0X3N0cmZyZWUoQmluZGluZy0+RW5kcG9pbnQpOwogIGlmIChFbmRwb2ludCkgewogICAgQmluZGluZy0+RW5kcG9pbnQgPSBSUENSVDRfc3RyZHVwQShFbmRwb2ludCk7CiAgfSBlbHNlIHsKICAgIEJpbmRpbmctPkVuZHBvaW50ID0gUlBDUlQ0X3N0cmR1cEEoIiIpOwogIH0KICBpZiAoIUJpbmRpbmctPkVuZHBvaW50KSBFUlIoIm91dCBvZiBtZW1vcnk/XG4iKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9Db21wbGV0ZUJpbmRpbmdXKFJwY0JpbmRpbmcqIEJpbmRpbmcsIExQV1NUUiBOZXR3b3JrQWRkciwgTFBXU1RSIEVuZHBvaW50LCBMUFdTVFIgTmV0d29ya09wdGlvbnMpCnsKICBUUkFDRSgiKFJwY0JpbmRpbmcgPT0gXiVwLCBOZXR3b3JrQWRkciA9PSBcIiVzXCIsIEVuZFBvaW50ID09IFwiJXNcIiwgTmV0d29ya09wdGlvbnMgPT0gXCIlc1wiKVxuIiwgQmluZGluZywgCiAgIGRlYnVnc3RyX3coTmV0d29ya0FkZHIpLCBkZWJ1Z3N0cl93KEVuZHBvaW50KSwgZGVidWdzdHJfdyhOZXR3b3JrT3B0aW9ucykpOwoKICBSUENSVDRfc3RyZnJlZShCaW5kaW5nLT5OZXR3b3JrQWRkcik7CiAgQmluZGluZy0+TmV0d29ya0FkZHIgPSBSUENSVDRfc3RyZHVwV3RvQShOZXR3b3JrQWRkcik7CiAgUlBDUlQ0X3N0cmZyZWUoQmluZGluZy0+RW5kcG9pbnQpOwogIGlmIChFbmRwb2ludCkgewogICAgQmluZGluZy0+RW5kcG9pbnQgPSBSUENSVDRfc3RyZHVwV3RvQShFbmRwb2ludCk7CiAgfSBlbHNlIHsKICAgIEJpbmRpbmctPkVuZHBvaW50ID0gUlBDUlQ0X3N0cmR1cEEoIiIpOwogIH0KICBpZiAoIUJpbmRpbmctPkVuZHBvaW50KSBFUlIoIm91dCBvZiBtZW1vcnk/XG4iKTsKCiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9SZXNvbHZlQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBMUFNUUiBFbmRwb2ludCkKewogIFRSQUNFKCIoUnBjQmluZGluZyA9PSBeJXAsIEVuZFBvaW50ID09IFwiJXNcIlxuIiwgQmluZGluZywgRW5kcG9pbnQpOwoKICBSUENSVDRfc3RyZnJlZShCaW5kaW5nLT5FbmRwb2ludCk7CiAgQmluZGluZy0+RW5kcG9pbnQgPSBSUENSVDRfc3RyZHVwQShFbmRwb2ludCk7CgogIHJldHVybiBSUENfU19PSzsKfQoKUlBDX1NUQVRVUyBSUENSVDRfU2V0QmluZGluZ09iamVjdChScGNCaW5kaW5nKiBCaW5kaW5nLCBVVUlEKiBPYmplY3RVdWlkKQp7CiAgVFJBQ0UoIigqUnBjQmluZGluZyA9PSBeJXAsIFVVSUQgPT0gJXMpXG4iLCBCaW5kaW5nLCBkZWJ1Z3N0cl9ndWlkKE9iamVjdFV1aWQpKTsgCiAgaWYgKE9iamVjdFV1aWQpIG1lbWNweSgmQmluZGluZy0+T2JqZWN0VXVpZCwgT2JqZWN0VXVpZCwgc2l6ZW9mKFVVSUQpKTsKICBlbHNlIFV1aWRDcmVhdGVOaWwoJkJpbmRpbmctPk9iamVjdFV1aWQpOwogIHJldHVybiBSUENfU19PSzsKfQoKUlBDX1NUQVRVUyBSUENSVDRfTWFrZUJpbmRpbmcoUnBjQmluZGluZyoqIEJpbmRpbmcsIFJwY0Nvbm5lY3Rpb24qIENvbm5lY3Rpb24pCnsKICBScGNCaW5kaW5nKiBOZXdCaW5kaW5nOwogIFRSQUNFKCIoUnBjQmluZGluZyA9PSBeJXAsIENvbm5lY3Rpb24gPT0gXiVwKVxuIiwgQmluZGluZywgQ29ubmVjdGlvbik7CgogIFJQQ1JUNF9BbGxvY0JpbmRpbmcoJk5ld0JpbmRpbmcsIENvbm5lY3Rpb24tPnNlcnZlcik7CiAgTmV3QmluZGluZy0+UHJvdHNlcSA9IFJQQ1JUNF9zdHJkdXBBKENvbm5lY3Rpb24tPlByb3RzZXEpOwogIE5ld0JpbmRpbmctPk5ldHdvcmtBZGRyID0gUlBDUlQ0X3N0cmR1cEEoQ29ubmVjdGlvbi0+TmV0d29ya0FkZHIpOwogIE5ld0JpbmRpbmctPkVuZHBvaW50ID0gUlBDUlQ0X3N0cmR1cEEoQ29ubmVjdGlvbi0+RW5kcG9pbnQpOwogIE5ld0JpbmRpbmctPkZyb21Db25uID0gQ29ubmVjdGlvbjsKCiAgVFJBQ0UoImJpbmRpbmc6ICVwXG4iLCBOZXdCaW5kaW5nKTsKICAqQmluZGluZyA9IE5ld0JpbmRpbmc7CgogIHJldHVybiBSUENfU19PSzsKfQoKUlBDX1NUQVRVUyBSUENSVDRfRXhwb3J0QmluZGluZyhScGNCaW5kaW5nKiogQmluZGluZywgUnBjQmluZGluZyogT2xkQmluZGluZykKewogIEludGVybG9ja2VkSW5jcmVtZW50KCZPbGRCaW5kaW5nLT5yZWZzKTsKICAqQmluZGluZyA9IE9sZEJpbmRpbmc7CiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9EZXN0cm95QmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nKQp7CiAgaWYgKEludGVybG9ja2VkRGVjcmVtZW50KCZCaW5kaW5nLT5yZWZzKSkKICAgIHJldHVybiBSUENfU19PSzsKCiAgVFJBQ0UoImJpbmRpbmc6ICVwXG4iLCBCaW5kaW5nKTsKICAvKiBGSVhNRTogcmVsZWFzZSBjb25uZWN0aW9ucyAqLwogIFJQQ1JUNF9zdHJmcmVlKEJpbmRpbmctPkVuZHBvaW50KTsKICBSUENSVDRfc3RyZnJlZShCaW5kaW5nLT5OZXR3b3JrQWRkcik7CiAgUlBDUlQ0X3N0cmZyZWUoQmluZGluZy0+UHJvdHNlcSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgQmluZGluZyk7CiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9PcGVuQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiogQ29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJQQ19TWU5UQVhfSURFTlRJRklFUiBUcmFuc2ZlclN5bnRheCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJQQ19TWU5UQVhfSURFTlRJRklFUiBJbnRlcmZhY2VJZCkKewogIFJwY0Nvbm5lY3Rpb24qIE5ld0Nvbm5lY3Rpb247CiAgUlBDX1NUQVRVUyBzdGF0dXM7CgogIFRSQUNFKCIoQmluZGluZyA9PSBeJXApXG4iLCBCaW5kaW5nKTsKCiAgLyogaWYgd2UgdHJ5IHRvIGJpbmQgYSBuZXcgaW50ZXJmYWNlIGFuZCB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG9wZW5lZCwKICAgKiBjbG9zZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIGFuZCBjcmVhdGUgYSBuZXcgd2l0aCB0aGUgbmV3IGJpbmRpbmcuICovIAogIGlmICghQmluZGluZy0+c2VydmVyICYmIEJpbmRpbmctPkZyb21Db25uICYmCiAgICAgIG1lbWNtcCgmQmluZGluZy0+RnJvbUNvbm4tPkFjdGl2ZUludGVyZmFjZSwgSW50ZXJmYWNlSWQsCiAgICAgICAgICAgICBzaXplb2YoUlBDX1NZTlRBWF9JREVOVElGSUVSKSkpIHsKCiAgICBUUkFDRSgicmVsZWFzaW5nIHByZS1leGlzdGluZyBjb25uZWN0aW9uXG4iKTsKICAgIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbihCaW5kaW5nLT5Gcm9tQ29ubik7CiAgICBCaW5kaW5nLT5Gcm9tQ29ubiA9IE5VTEw7CiAgfSBlbHNlIHsKICAgIC8qIHdlIGFscmVhZHkgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCBhY2NlcHRhYmxlIGJpbmRpbmcsIHNvIHVzZSBpdCAqLwogICAgaWYgKEJpbmRpbmctPkZyb21Db25uKSB7CiAgICAgICpDb25uZWN0aW9uID0gQmluZGluZy0+RnJvbUNvbm47CiAgICAgIHJldHVybiBSUENfU19PSzsKICAgIH0KICB9CiAgCiAgLyogY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gKi8KICBSUENSVDRfQ3JlYXRlQ29ubmVjdGlvbigmTmV3Q29ubmVjdGlvbiwgQmluZGluZy0+c2VydmVyLCBCaW5kaW5nLT5Qcm90c2VxLCBCaW5kaW5nLT5OZXR3b3JrQWRkciwgQmluZGluZy0+RW5kcG9pbnQsIE5VTEwsIEJpbmRpbmcpOwogICpDb25uZWN0aW9uID0gTmV3Q29ubmVjdGlvbjsKICBzdGF0dXMgPSBSUENSVDRfT3BlbkNvbm5lY3Rpb24oTmV3Q29ubmVjdGlvbik7CiAgaWYgKHN0YXR1cyAhPSBSUENfU19PSykgewogICAgcmV0dXJuIHN0YXR1czsKICB9CgogIC8qIHdlIG5lZWQgdG8gc2VuZCBhIGJpbmRpbmcgcGFja2V0IGlmIHdlIGFyZSBjbGllbnQuICovCiAgaWYgKCEoKkNvbm5lY3Rpb24pLT5zZXJ2ZXIpIHsKICAgIFJwY1BrdEhkciAqaGRyOwogICAgTE9ORyBjb3VudDsKICAgIEJZVEUgKnJlc3BvbnNlOwogICAgUnBjUGt0SGRyICpyZXNwb25zZV9oZHI7CgogICAgVFJBQ0UoInNlbmRpbmcgYmluZCByZXF1ZXN0IHRvIHNlcnZlclxuIik7CgogICAgaGRyID0gUlBDUlQ0X0J1aWxkQmluZEhlYWRlcihORFJfTE9DQUxfREFUQV9SRVBSRVNFTlRBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX01BWF9QQUNLRVRfU0laRSwgUlBDX01BWF9QQUNLRVRfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlSWQsIFRyYW5zZmVyU3ludGF4KTsKCiAgICBzdGF0dXMgPSBSUENSVDRfU2VuZCgqQ29ubmVjdGlvbiwgaGRyLCBOVUxMLCAwKTsKICAgIGlmIChzdGF0dXMgIT0gUlBDX1NfT0spIHsKICAgICAgUlBDUlQ0X0Rlc3Ryb3lDb25uZWN0aW9uKCpDb25uZWN0aW9uKTsKICAgICAgcmV0dXJuIHN0YXR1czsKICAgIH0KCiAgICByZXNwb25zZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBSUENfTUFYX1BBQ0tFVF9TSVpFKTsKICAgIGlmIChyZXNwb25zZSA9PSBOVUxMKSB7CiAgICAgIFdBUk4oIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgYmluZGluZyByZXNwb25zZVxuIik7CiAgICAgIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbigqQ29ubmVjdGlvbik7CiAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwogICAgfQoKICAgIGNvdW50ID0gcnBjcnQ0X2Nvbm5fcmVhZChOZXdDb25uZWN0aW9uLCByZXNwb25zZSwgUlBDX01BWF9QQUNLRVRfU0laRSk7CiAgICBpZiAoY291bnQgPCBzaXplb2YocmVzcG9uc2VfaGRyLT5jb21tb24pKSB7CiAgICAgIFdBUk4oInJlY2VpdmVkIGludmFsaWQgaGVhZGVyXG4iKTsKICAgICAgUlBDUlQ0X0Rlc3Ryb3lDb25uZWN0aW9uKCpDb25uZWN0aW9uKTsKICAgICAgcmV0dXJuIFJQQ19TX1BST1RPQ09MX0VSUk9SOwogICAgfQoKICAgIHJlc3BvbnNlX2hkciA9IChScGNQa3RIZHIqKXJlc3BvbnNlOwoKICAgIGlmIChyZXNwb25zZV9oZHItPmNvbW1vbi5ycGNfdmVyICE9IFJQQ19WRVJfTUFKT1IgfHwKICAgICAgICByZXNwb25zZV9oZHItPmNvbW1vbi5ycGNfdmVyX21pbm9yICE9IFJQQ19WRVJfTUlOT1IgfHwKICAgICAgICByZXNwb25zZV9oZHItPmNvbW1vbi5wdHlwZSAhPSBQS1RfQklORF9BQ0spIHsKICAgICAgV0FSTigiaW52YWxpZCBwcm90b2NvbCB2ZXJzaW9uIG9yIHJlamVjdGlvbiBwYWNrZXRcbiIpOwogICAgICBSUENSVDRfRGVzdHJveUNvbm5lY3Rpb24oKkNvbm5lY3Rpb24pOwogICAgICByZXR1cm4gUlBDX1NfUFJPVE9DT0xfRVJST1I7CiAgICB9CgogICAgaWYgKHJlc3BvbnNlX2hkci0+YmluZF9hY2subWF4X3RzaXplIDwgUlBDX01JTl9QQUNLRVRfU0laRSkgewogICAgICBXQVJOKCJzZXJ2ZXIgZG9lc24ndCBhbGxvdyBsYXJnZSBlbm91Z2ggcGFja2V0c1xuIik7CiAgICAgIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbigqQ29ubmVjdGlvbik7CiAgICAgIHJldHVybiBSUENfU19QUk9UT0NPTF9FUlJPUjsKICAgIH0KCiAgICAvKiBGSVhNRTogZG8gbW9yZSBjaGVja3M/ICovCgogICAgKCpDb25uZWN0aW9uKS0+TWF4VHJhbnNtaXNzaW9uU2l6ZSA9IHJlc3BvbnNlX2hkci0+YmluZF9hY2subWF4X3RzaXplOwogICAgKCpDb25uZWN0aW9uKS0+QWN0aXZlSW50ZXJmYWNlID0gKkludGVyZmFjZUlkOwogIH0KCiAgcmV0dXJuIFJQQ19TX09LOwp9CgpSUENfU1RBVFVTIFJQQ1JUNF9DbG9zZUJpbmRpbmcoUnBjQmluZGluZyogQmluZGluZywgUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbikKewogIFRSQUNFKCIoQmluZGluZyA9PSBeJXApXG4iLCBCaW5kaW5nKTsKICBpZiAoIUNvbm5lY3Rpb24pIHJldHVybiBSUENfU19PSzsKICBpZiAoQmluZGluZy0+RnJvbUNvbm4gPT0gQ29ubmVjdGlvbikgcmV0dXJuIFJQQ19TX09LOwogIHJldHVybiBSUENSVDRfRGVzdHJveUNvbm5lY3Rpb24oQ29ubmVjdGlvbik7Cn0KCi8qIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdHJpbmcgY29tcG9zaW5nIGFuZCBwYXJzaW5nICovCnN0YXRpYyB1bnNpZ25lZCBSUENSVDRfc3RyY29weUEoTFBTVFIgZGF0YSwgTFBDU1RSIHNyYykKewogIHVuc2lnbmVkIGxlbiA9IHN0cmxlbihzcmMpOwogIG1lbWNweShkYXRhLCBzcmMsIGxlbipzaXplb2YoQ0hBUikpOwogIHJldHVybiBsZW47Cn0KCnN0YXRpYyB1bnNpZ25lZCBSUENSVDRfc3RyY29weVcoTFBXU1RSIGRhdGEsIExQQ1dTVFIgc3JjKQp7CiAgdW5zaWduZWQgbGVuID0gc3RybGVuVyhzcmMpOwogIG1lbWNweShkYXRhLCBzcmMsIGxlbipzaXplb2YoV0NIQVIpKTsKICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgTFBTVFIgUlBDUlQ0X3N0cmNvbmNhdEEoTFBTVFIgZHN0LCBMUENTVFIgc3JjKQp7CiAgRFdPUkQgbGVuID0gc3RybGVuKGRzdCksIHNsZW4gPSBzdHJsZW4oc3JjKTsKICBMUFNUUiBuZHN0ID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0LCAobGVuK3NsZW4rMikqc2l6ZW9mKENIQVIpKTsKICBpZiAoIW5kc3QpCiAgewogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0KTsKICAgIHJldHVybiBOVUxMOwogIH0KICBuZHN0W2xlbl0gPSAnLCc7CiAgbWVtY3B5KG5kc3QrbGVuKzEsIHNyYywgc2xlbisxKTsKICByZXR1cm4gbmRzdDsKfQoKc3RhdGljIExQV1NUUiBSUENSVDRfc3RyY29uY2F0VyhMUFdTVFIgZHN0LCBMUENXU1RSIHNyYykKewogIERXT1JEIGxlbiA9IHN0cmxlblcoZHN0KSwgc2xlbiA9IHN0cmxlblcoc3JjKTsKICBMUFdTVFIgbmRzdCA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdCwgKGxlbitzbGVuKzIpKnNpemVvZihXQ0hBUikpOwogIGlmICghbmRzdCkgCiAgewogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0KTsKICAgIHJldHVybiBOVUxMOwogIH0KICBuZHN0W2xlbl0gPSAnLCc7CiAgbWVtY3B5KG5kc3QrbGVuKzEsIHNyYywgKHNsZW4rMSkqc2l6ZW9mKFdDSEFSKSk7CiAgcmV0dXJuIG5kc3Q7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU3RyaW5nQmluZGluZ0NvbXBvc2VBIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1N0cmluZ0JpbmRpbmdDb21wb3NlQSh1bnNpZ25lZCBjaGFyICpPYmpVdWlkLCB1bnNpZ25lZCBjaGFyICpQcm90c2VxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqTmV0d29ya0FkZHIsIHVuc2lnbmVkIGNoYXIgKkVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqT3B0aW9ucywgdW5zaWduZWQgY2hhcioqIFN0cmluZ0JpbmRpbmcgKQp7CiAgRFdPUkQgbGVuID0gMTsKICBMUFNUUiBkYXRhOwoKICBUUkFDRSggIiglcywlcywlcywlcywlcywlcClcbiIsCiAgICAgICAgZGVidWdzdHJfYSggKGNoYXIqKU9ialV1aWQgKSwgZGVidWdzdHJfYSggKGNoYXIqKVByb3RzZXEgKSwKICAgICAgICBkZWJ1Z3N0cl9hKCAoY2hhciopTmV0d29ya0FkZHIgKSwgZGVidWdzdHJfYSggKGNoYXIqKUVuZHBvaW50ICksCiAgICAgICAgZGVidWdzdHJfYSggKGNoYXIqKU9wdGlvbnMgKSwgU3RyaW5nQmluZGluZyApOwoKICBpZiAoT2JqVXVpZCAmJiAqT2JqVXVpZCkgbGVuICs9IHN0cmxlbigoY2hhciopT2JqVXVpZCkgKyAxOwogIGlmIChQcm90c2VxICYmICpQcm90c2VxKSBsZW4gKz0gc3RybGVuKChjaGFyKilQcm90c2VxKSArIDE7CiAgaWYgKE5ldHdvcmtBZGRyICYmICpOZXR3b3JrQWRkcikgbGVuICs9IHN0cmxlbigoY2hhciopTmV0d29ya0FkZHIpOwogIGlmIChFbmRwb2ludCAmJiAqRW5kcG9pbnQpIGxlbiArPSBzdHJsZW4oKGNoYXIqKUVuZHBvaW50KSArIDI7CiAgaWYgKE9wdGlvbnMgJiYgKk9wdGlvbnMpIGxlbiArPSBzdHJsZW4oKGNoYXIqKU9wdGlvbnMpICsgMjsKCiAgZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4pOwogICpTdHJpbmdCaW5kaW5nID0gKHVuc2lnbmVkIGNoYXIqKWRhdGE7CgogIGlmIChPYmpVdWlkICYmICpPYmpVdWlkKSB7CiAgICBkYXRhICs9IFJQQ1JUNF9zdHJjb3B5QShkYXRhLCAoY2hhciopT2JqVXVpZCk7CiAgICAqZGF0YSsrID0gJ0AnOwogIH0KICBpZiAoUHJvdHNlcSAmJiAqUHJvdHNlcSkgewogICAgZGF0YSArPSBSUENSVDRfc3RyY29weUEoZGF0YSwgKGNoYXIqKVByb3RzZXEpOwogICAgKmRhdGErKyA9ICc6JzsKICB9CiAgaWYgKE5ldHdvcmtBZGRyICYmICpOZXR3b3JrQWRkcikKICAgIGRhdGEgKz0gUlBDUlQ0X3N0cmNvcHlBKGRhdGEsIChjaGFyKilOZXR3b3JrQWRkcik7CgogIGlmICgoRW5kcG9pbnQgJiYgKkVuZHBvaW50KSB8fAogICAgICAoT3B0aW9ucyAmJiAqT3B0aW9ucykpIHsKICAgICpkYXRhKysgPSAnWyc7CiAgICBpZiAoRW5kcG9pbnQgJiYgKkVuZHBvaW50KSB7CiAgICAgIGRhdGEgKz0gUlBDUlQ0X3N0cmNvcHlBKGRhdGEsIChjaGFyKilFbmRwb2ludCk7CiAgICAgIGlmIChPcHRpb25zICYmICpPcHRpb25zKSAqZGF0YSsrID0gJywnOwogICAgfQogICAgaWYgKE9wdGlvbnMgJiYgKk9wdGlvbnMpIHsKICAgICAgZGF0YSArPSBSUENSVDRfc3RyY29weUEoZGF0YSwgKGNoYXIqKU9wdGlvbnMpOwogICAgfQogICAgKmRhdGErKyA9ICddJzsKICB9CiAgKmRhdGEgPSAwOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTdHJpbmdCaW5kaW5nQ29tcG9zZVcgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjU3RyaW5nQmluZGluZ0NvbXBvc2VXKCBMUFdTVFIgT2JqVXVpZCwgTFBXU1RSIFByb3RzZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIE5ldHdvcmtBZGRyLCBMUFdTVFIgRW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIE9wdGlvbnMsIExQV1NUUiogU3RyaW5nQmluZGluZyApCnsKICBEV09SRCBsZW4gPSAxOwogIExQV1NUUiBkYXRhOwoKICBUUkFDRSgiKCVzLCVzLCVzLCVzLCVzLCVwKVxuIiwKICAgICAgIGRlYnVnc3RyX3coIE9ialV1aWQgKSwgZGVidWdzdHJfdyggUHJvdHNlcSApLAogICAgICAgZGVidWdzdHJfdyggTmV0d29ya0FkZHIgKSwgZGVidWdzdHJfdyggRW5kcG9pbnQgKSwKICAgICAgIGRlYnVnc3RyX3coIE9wdGlvbnMgKSwgU3RyaW5nQmluZGluZyk7CgogIGlmIChPYmpVdWlkICYmICpPYmpVdWlkKSBsZW4gKz0gc3RybGVuVyhPYmpVdWlkKSArIDE7CiAgaWYgKFByb3RzZXEgJiYgKlByb3RzZXEpIGxlbiArPSBzdHJsZW5XKFByb3RzZXEpICsgMTsKICBpZiAoTmV0d29ya0FkZHIgJiYgKk5ldHdvcmtBZGRyKSBsZW4gKz0gc3RybGVuVyhOZXR3b3JrQWRkcik7CiAgaWYgKEVuZHBvaW50ICYmICpFbmRwb2ludCkgbGVuICs9IHN0cmxlblcoRW5kcG9pbnQpICsgMjsKICBpZiAoT3B0aW9ucyAmJiAqT3B0aW9ucykgbGVuICs9IHN0cmxlblcoT3B0aW9ucykgKyAyOwoKICBkYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbipzaXplb2YoV0NIQVIpKTsKICAqU3RyaW5nQmluZGluZyA9IGRhdGE7CgogIGlmIChPYmpVdWlkICYmICpPYmpVdWlkKSB7CiAgICBkYXRhICs9IFJQQ1JUNF9zdHJjb3B5VyhkYXRhLCBPYmpVdWlkKTsKICAgICpkYXRhKysgPSAnQCc7CiAgfQogIGlmIChQcm90c2VxICYmICpQcm90c2VxKSB7CiAgICBkYXRhICs9IFJQQ1JUNF9zdHJjb3B5VyhkYXRhLCBQcm90c2VxKTsKICAgICpkYXRhKysgPSAnOic7CiAgfQogIGlmIChOZXR3b3JrQWRkciAmJiAqTmV0d29ya0FkZHIpIHsKICAgIGRhdGEgKz0gUlBDUlQ0X3N0cmNvcHlXKGRhdGEsIE5ldHdvcmtBZGRyKTsKICB9CiAgaWYgKChFbmRwb2ludCAmJiAqRW5kcG9pbnQpIHx8CiAgICAgIChPcHRpb25zICYmICpPcHRpb25zKSkgewogICAgKmRhdGErKyA9ICdbJzsKICAgIGlmIChFbmRwb2ludCAmJiAqRW5kcG9pbnQpIHsKICAgICAgZGF0YSArPSBSUENSVDRfc3RyY29weVcoZGF0YSwgRW5kcG9pbnQpOwogICAgICBpZiAoT3B0aW9ucyAmJiAqT3B0aW9ucykgKmRhdGErKyA9ICcsJzsKICAgIH0KICAgIGlmIChPcHRpb25zICYmICpPcHRpb25zKSB7CiAgICAgIGRhdGEgKz0gUlBDUlQ0X3N0cmNvcHlXKGRhdGEsIE9wdGlvbnMpOwogICAgfQogICAgKmRhdGErKyA9ICddJzsKICB9CiAgKmRhdGEgPSAwOwoKICByZXR1cm4gUlBDX1NfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjU3RyaW5nQmluZGluZ1BhcnNlQSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNTdHJpbmdCaW5kaW5nUGFyc2VBKCB1bnNpZ25lZCBjaGFyICpTdHJpbmdCaW5kaW5nLCB1bnNpZ25lZCBjaGFyICoqT2JqVXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKlByb3RzZXEsIHVuc2lnbmVkIGNoYXIgKipOZXR3b3JrQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKkVuZHBvaW50LCB1bnNpZ25lZCBjaGFyICoqT3B0aW9ucykKewogIENIQVIgKmRhdGEsICpuZXh0OwogIHN0YXRpYyBjb25zdCBjaGFyIGVwX29wdFtdID0gImVuZHBvaW50PSI7CgogIFRSQUNFKCIoJXMsJXAsJXAsJXAsJXAsJXApXG4iLCBkZWJ1Z3N0cl9hKChjaGFyKilTdHJpbmdCaW5kaW5nKSwKICAgICAgIE9ialV1aWQsIFByb3RzZXEsIE5ldHdvcmtBZGRyLCBFbmRwb2ludCwgT3B0aW9ucyk7CgogIGlmIChPYmpVdWlkKSAqT2JqVXVpZCA9IE5VTEw7CiAgaWYgKFByb3RzZXEpICpQcm90c2VxID0gTlVMTDsKICBpZiAoTmV0d29ya0FkZHIpICpOZXR3b3JrQWRkciA9IE5VTEw7CiAgaWYgKEVuZHBvaW50KSAqRW5kcG9pbnQgPSBOVUxMOwogIGlmIChPcHRpb25zKSAqT3B0aW9ucyA9IE5VTEw7CgogIGRhdGEgPSAoY2hhciopIFN0cmluZ0JpbmRpbmc7CgogIG5leHQgPSBzdHJjaHIoZGF0YSwgJ0AnKTsKICBpZiAobmV4dCkgewogICAgaWYgKE9ialV1aWQpICpPYmpVdWlkID0gKHVuc2lnbmVkIGNoYXIqKVJQQ1JUNF9zdHJuZHVwQShkYXRhLCBuZXh0IC0gZGF0YSk7CiAgICBkYXRhID0gbmV4dCsxOwogIH0KCiAgbmV4dCA9IHN0cmNocihkYXRhLCAnOicpOwogIGlmIChuZXh0KSB7CiAgICBpZiAoUHJvdHNlcSkgKlByb3RzZXEgPSAodW5zaWduZWQgY2hhciopUlBDUlQ0X3N0cm5kdXBBKGRhdGEsIG5leHQgLSBkYXRhKTsKICAgIGRhdGEgPSBuZXh0KzE7CiAgfQoKICBuZXh0ID0gc3RyY2hyKGRhdGEsICdbJyk7CiAgaWYgKG5leHQpIHsKICAgIENIQVIgKmNsb3NlLCAqb3B0OwoKICAgIGlmIChOZXR3b3JrQWRkcikgKk5ldHdvcmtBZGRyID0gKHVuc2lnbmVkIGNoYXIqKVJQQ1JUNF9zdHJuZHVwQShkYXRhLCBuZXh0IC0gZGF0YSk7CiAgICBkYXRhID0gbmV4dCsxOwogICAgY2xvc2UgPSBzdHJjaHIoZGF0YSwgJ10nKTsKICAgIGlmICghY2xvc2UpIGdvdG8gZmFpbDsKCiAgICAvKiB0b2tlbml6ZSBvcHRpb25zICovCiAgICB3aGlsZSAoZGF0YSA8IGNsb3NlKSB7CiAgICAgIG5leHQgPSBzdHJjaHIoZGF0YSwgJywnKTsKICAgICAgaWYgKCFuZXh0IHx8IG5leHQgPiBjbG9zZSkgbmV4dCA9IGNsb3NlOwogICAgICAvKiBGSVhNRTogdGhpcyBpcyBraW5kIG9mIGluZWZmaWNpZW50ICovCiAgICAgIG9wdCA9IFJQQ1JUNF9zdHJuZHVwQShkYXRhLCBuZXh0IC0gZGF0YSk7CiAgICAgIGRhdGEgPSBuZXh0KzE7CgogICAgICAvKiBwYXJzZSBvcHRpb24gKi8KICAgICAgbmV4dCA9IHN0cmNocihvcHQsICc9Jyk7CiAgICAgIGlmICghbmV4dCkgewogICAgICAgIC8qIG5vdCBhbiBvcHRpb24sIG11c3QgYmUgYW4gZW5kcG9pbnQgKi8KICAgICAgICBpZiAoKkVuZHBvaW50KSBnb3RvIGZhaWw7CiAgICAgICAgKkVuZHBvaW50ID0gKHVuc2lnbmVkIGNoYXIqKSBvcHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHN0cm5jbXAob3B0LCBlcF9vcHQsIHN0cmxlbihlcF9vcHQpKSA9PSAwKSB7CiAgICAgICAgICAvKiBlbmRwb2ludCBvcHRpb24gKi8KICAgICAgICAgIGlmICgqRW5kcG9pbnQpIGdvdG8gZmFpbDsKICAgICAgICAgICpFbmRwb2ludCA9ICh1bnNpZ25lZCBjaGFyKikgUlBDUlQ0X3N0cmR1cEEobmV4dCsxKTsKICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9wdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8qIG5ldHdvcmsgb3B0aW9uICovCiAgICAgICAgICBpZiAoKk9wdGlvbnMpIHsKICAgICAgICAgICAgLyogRklYTUU6IHRoaXMgaXMga2luZCBvZiBpbmVmZmljaWVudCAqLwogICAgICAgICAgICAqT3B0aW9ucyA9ICh1bnNpZ25lZCBjaGFyKikgUlBDUlQ0X3N0cmNvbmNhdEEoIChjaGFyKikqT3B0aW9ucywgb3B0KTsKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb3B0KTsKICAgICAgICAgIH0gZWxzZSAKCSAgICAqT3B0aW9ucyA9ICh1bnNpZ25lZCBjaGFyKikgb3B0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGRhdGEgPSBjbG9zZSsxOwogICAgaWYgKCpkYXRhKSBnb3RvIGZhaWw7CiAgfQogIGVsc2UgaWYgKE5ldHdvcmtBZGRyKSAKICAgICpOZXR3b3JrQWRkciA9ICh1bnNpZ25lZCBjaGFyKilSUENSVDRfc3RyZHVwQShkYXRhKTsKCiAgcmV0dXJuIFJQQ19TX09LOwoKZmFpbDoKICBpZiAoT2JqVXVpZCkgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKilPYmpVdWlkKTsKICBpZiAoUHJvdHNlcSkgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKilQcm90c2VxKTsKICBpZiAoTmV0d29ya0FkZHIpIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopTmV0d29ya0FkZHIpOwogIGlmIChFbmRwb2ludCkgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKilFbmRwb2ludCk7CiAgaWYgKE9wdGlvbnMpIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopT3B0aW9ucyk7CiAgcmV0dXJuIFJQQ19TX0lOVkFMSURfU1RSSU5HX0JJTkRJTkc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNTdHJpbmdCaW5kaW5nUGFyc2VXIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY1N0cmluZ0JpbmRpbmdQYXJzZVcoIExQV1NUUiBTdHJpbmdCaW5kaW5nLCBMUFdTVFIgKk9ialV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiAqUHJvdHNlcSwgTFBXU1RSICpOZXR3b3JrQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSICpFbmRwb2ludCwgTFBXU1RSICpPcHRpb25zKQp7CiAgV0NIQVIgKmRhdGEsICpuZXh0OwogIHN0YXRpYyBjb25zdCBXQ0hBUiBlcF9vcHRbXSA9IHsnZScsJ24nLCdkJywncCcsJ28nLCdpJywnbicsJ3QnLCc9JywwfTsKCiAgVFJBQ0UoIiglcywlcCwlcCwlcCwlcCwlcClcbiIsIGRlYnVnc3RyX3coU3RyaW5nQmluZGluZyksCiAgICAgICBPYmpVdWlkLCBQcm90c2VxLCBOZXR3b3JrQWRkciwgRW5kcG9pbnQsIE9wdGlvbnMpOwoKICBpZiAoT2JqVXVpZCkgKk9ialV1aWQgPSBOVUxMOwogIGlmIChQcm90c2VxKSAqUHJvdHNlcSA9IE5VTEw7CiAgaWYgKE5ldHdvcmtBZGRyKSAqTmV0d29ya0FkZHIgPSBOVUxMOwogIGlmIChFbmRwb2ludCkgKkVuZHBvaW50ID0gTlVMTDsKICBpZiAoT3B0aW9ucykgKk9wdGlvbnMgPSBOVUxMOwoKICBkYXRhID0gU3RyaW5nQmluZGluZzsKCiAgbmV4dCA9IHN0cmNoclcoZGF0YSwgJ0AnKTsKICBpZiAobmV4dCkgewogICAgaWYgKE9ialV1aWQpICpPYmpVdWlkID0gUlBDUlQ0X3N0cm5kdXBXKGRhdGEsIG5leHQgLSBkYXRhKTsKICAgIGRhdGEgPSBuZXh0KzE7CiAgfQoKICBuZXh0ID0gc3RyY2hyVyhkYXRhLCAnOicpOwogIGlmIChuZXh0KSB7CiAgICBpZiAoUHJvdHNlcSkgKlByb3RzZXEgPSBSUENSVDRfc3RybmR1cFcoZGF0YSwgbmV4dCAtIGRhdGEpOwogICAgZGF0YSA9IG5leHQrMTsKICB9CgogIG5leHQgPSBzdHJjaHJXKGRhdGEsICdbJyk7CiAgaWYgKG5leHQpIHsKICAgIFdDSEFSICpjbG9zZSwgKm9wdDsKCiAgICBpZiAoTmV0d29ya0FkZHIpICpOZXR3b3JrQWRkciA9IFJQQ1JUNF9zdHJuZHVwVyhkYXRhLCBuZXh0IC0gZGF0YSk7CiAgICBkYXRhID0gbmV4dCsxOwogICAgY2xvc2UgPSBzdHJjaHJXKGRhdGEsICddJyk7CiAgICBpZiAoIWNsb3NlKSBnb3RvIGZhaWw7CgogICAgLyogdG9rZW5pemUgb3B0aW9ucyAqLwogICAgd2hpbGUgKGRhdGEgPCBjbG9zZSkgewogICAgICBuZXh0ID0gc3RyY2hyVyhkYXRhLCAnLCcpOwogICAgICBpZiAoIW5leHQgfHwgbmV4dCA+IGNsb3NlKSBuZXh0ID0gY2xvc2U7CiAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIGtpbmQgb2YgaW5lZmZpY2llbnQgKi8KICAgICAgb3B0ID0gUlBDUlQ0X3N0cm5kdXBXKGRhdGEsIG5leHQgLSBkYXRhKTsKICAgICAgZGF0YSA9IG5leHQrMTsKCiAgICAgIC8qIHBhcnNlIG9wdGlvbiAqLwogICAgICBuZXh0ID0gc3RyY2hyVyhvcHQsICc9Jyk7CiAgICAgIGlmICghbmV4dCkgewogICAgICAgIC8qIG5vdCBhbiBvcHRpb24sIG11c3QgYmUgYW4gZW5kcG9pbnQgKi8KICAgICAgICBpZiAoKkVuZHBvaW50KSBnb3RvIGZhaWw7CiAgICAgICAgKkVuZHBvaW50ID0gb3B0OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJuY21wVyhvcHQsIGVwX29wdCwgc3RybGVuVyhlcF9vcHQpKSA9PSAwKSB7CiAgICAgICAgICAvKiBlbmRwb2ludCBvcHRpb24gKi8KICAgICAgICAgIGlmICgqRW5kcG9pbnQpIGdvdG8gZmFpbDsKICAgICAgICAgICpFbmRwb2ludCA9IFJQQ1JUNF9zdHJkdXBXKG5leHQrMSk7CiAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvKiBuZXR3b3JrIG9wdGlvbiAqLwogICAgICAgICAgaWYgKCpPcHRpb25zKSB7CiAgICAgICAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIGtpbmQgb2YgaW5lZmZpY2llbnQgKi8KICAgICAgICAgICAgKk9wdGlvbnMgPSBSUENSVDRfc3RyY29uY2F0VygqT3B0aW9ucywgb3B0KTsKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb3B0KTsKICAgICAgICAgIH0gZWxzZSAKCSAgICAqT3B0aW9ucyA9IG9wdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBkYXRhID0gY2xvc2UrMTsKICAgIGlmICgqZGF0YSkgZ290byBmYWlsOwogIH0gZWxzZSBpZiAoTmV0d29ya0FkZHIpIAogICAgKk5ldHdvcmtBZGRyID0gUlBDUlQ0X3N0cmR1cFcoZGF0YSk7CgogIHJldHVybiBSUENfU19PSzsKCmZhaWw6CiAgaWYgKE9ialV1aWQpIFJwY1N0cmluZ0ZyZWVXKE9ialV1aWQpOwogIGlmIChQcm90c2VxKSBScGNTdHJpbmdGcmVlVyhQcm90c2VxKTsKICBpZiAoTmV0d29ya0FkZHIpIFJwY1N0cmluZ0ZyZWVXKE5ldHdvcmtBZGRyKTsKICBpZiAoRW5kcG9pbnQpIFJwY1N0cmluZ0ZyZWVXKEVuZHBvaW50KTsKICBpZiAoT3B0aW9ucykgUnBjU3RyaW5nRnJlZVcoT3B0aW9ucyk7CiAgcmV0dXJuIFJQQ19TX0lOVkFMSURfU1RSSU5HX0JJTkRJTkc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNCaW5kaW5nRnJlZSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNCaW5kaW5nRnJlZSggUlBDX0JJTkRJTkdfSEFORExFKiBCaW5kaW5nICkKewogIFJQQ19TVEFUVVMgc3RhdHVzOwogIFRSQUNFKCIoJXApID0gJXBcbiIsIEJpbmRpbmcsICpCaW5kaW5nKTsKICBzdGF0dXMgPSBSUENSVDRfRGVzdHJveUJpbmRpbmcoKkJpbmRpbmcpOwogIGlmIChzdGF0dXMgPT0gUlBDX1NfT0spICpCaW5kaW5nID0gMDsKICByZXR1cm4gc3RhdHVzOwp9CiAgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNCaW5kaW5nVmVjdG9yRnJlZSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNCaW5kaW5nVmVjdG9yRnJlZSggUlBDX0JJTkRJTkdfVkVDVE9SKiogQmluZGluZ1ZlY3RvciApCnsKICBSUENfU1RBVFVTIHN0YXR1czsKICB1bnNpZ25lZCBsb25nIGM7CgogIFRSQUNFKCIoJXApXG4iLCBCaW5kaW5nVmVjdG9yKTsKICBmb3IgKGM9MDsgYzwoKkJpbmRpbmdWZWN0b3IpLT5Db3VudDsgYysrKSB7CiAgICBzdGF0dXMgPSBScGNCaW5kaW5nRnJlZSgmKCpCaW5kaW5nVmVjdG9yKS0+QmluZGluZ0hbY10pOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAqQmluZGluZ1ZlY3Rvcik7CiAgKkJpbmRpbmdWZWN0b3IgPSBOVUxMOwogIHJldHVybiBSUENfU19PSzsKfQogIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjQmluZGluZ0lucU9iamVjdCAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNCaW5kaW5nSW5xT2JqZWN0KCBSUENfQklORElOR19IQU5ETEUgQmluZGluZywgVVVJRCogT2JqZWN0VXVpZCApCnsKICBScGNCaW5kaW5nKiBiaW5kID0gKFJwY0JpbmRpbmcqKUJpbmRpbmc7CgogIFRSQUNFKCIoJXAsJXApID0gJXNcbiIsIEJpbmRpbmcsIE9iamVjdFV1aWQsIGRlYnVnc3RyX2d1aWQoJmJpbmQtPk9iamVjdFV1aWQpKTsKICBtZW1jcHkoT2JqZWN0VXVpZCwgJmJpbmQtPk9iamVjdFV1aWQsIHNpemVvZihVVUlEKSk7CiAgcmV0dXJuIFJQQ19TX09LOwp9CiAgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNCaW5kaW5nU2V0T2JqZWN0IChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY0JpbmRpbmdTZXRPYmplY3QoIFJQQ19CSU5ESU5HX0hBTkRMRSBCaW5kaW5nLCBVVUlEKiBPYmplY3RVdWlkICkKewogIFJwY0JpbmRpbmcqIGJpbmQgPSAoUnBjQmluZGluZyopQmluZGluZzsKCiAgVFJBQ0UoIiglcCwlcylcbiIsIEJpbmRpbmcsIGRlYnVnc3RyX2d1aWQoT2JqZWN0VXVpZCkpOwogIGlmIChiaW5kLT5zZXJ2ZXIpIHJldHVybiBSUENfU19XUk9OR19LSU5EX09GX0JJTkRJTkc7CiAgcmV0dXJuIFJQQ1JUNF9TZXRCaW5kaW5nT2JqZWN0KEJpbmRpbmcsIE9iamVjdFV1aWQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjQmluZGluZ0Zyb21TdHJpbmdCaW5kaW5nQSAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNCaW5kaW5nRnJvbVN0cmluZ0JpbmRpbmdBKCB1bnNpZ25lZCBjaGFyICpTdHJpbmdCaW5kaW5nLCBSUENfQklORElOR19IQU5ETEUqIEJpbmRpbmcgKQp7CiAgUlBDX1NUQVRVUyByZXQ7CiAgUnBjQmluZGluZyogYmluZCA9IE5VTEw7CiAgdW5zaWduZWQgY2hhciAqT2JqZWN0VXVpZCwgKlByb3RzZXEsICpOZXR3b3JrQWRkciwgKkVuZHBvaW50LCAqT3B0aW9uczsKICBVVUlEIFV1aWQ7CgogIFRSQUNFKCIoJXMsJXApXG4iLCBkZWJ1Z3N0cl9hKChjaGFyKilTdHJpbmdCaW5kaW5nKSwgQmluZGluZyk7CgogIHJldCA9IFJwY1N0cmluZ0JpbmRpbmdQYXJzZUEoU3RyaW5nQmluZGluZywgJk9iamVjdFV1aWQsICZQcm90c2VxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV0d29ya0FkZHIsICZFbmRwb2ludCwgJk9wdGlvbnMpOwogIGlmIChyZXQgIT0gUlBDX1NfT0spIHJldHVybiByZXQ7CgogIHJldCA9IFV1aWRGcm9tU3RyaW5nQShPYmplY3RVdWlkLCAmVXVpZCk7CgogIGlmIChyZXQgPT0gUlBDX1NfT0spCiAgICByZXQgPSBSUENSVDRfQ3JlYXRlQmluZGluZ0EoJmJpbmQsIEZBTFNFLCAoY2hhciopUHJvdHNlcSk7CiAgaWYgKHJldCA9PSBSUENfU19PSykKICAgIHJldCA9IFJQQ1JUNF9TZXRCaW5kaW5nT2JqZWN0KGJpbmQsICZVdWlkKTsKICBpZiAocmV0ID09IFJQQ19TX09LKQogICAgcmV0ID0gUlBDUlQ0X0NvbXBsZXRlQmluZGluZ0EoYmluZCwgKGNoYXIqKU5ldHdvcmtBZGRyLCAoY2hhciopRW5kcG9pbnQsIChjaGFyKilPcHRpb25zKTsKCiAgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKikmT3B0aW9ucyk7CiAgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKikmRW5kcG9pbnQpOwogIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopJk5ldHdvcmtBZGRyKTsKICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZQcm90c2VxKTsKICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZPYmplY3RVdWlkKTsKCiAgaWYgKHJldCA9PSBSUENfU19PSykgCiAgICAqQmluZGluZyA9IChSUENfQklORElOR19IQU5ETEUpYmluZDsKICBlbHNlIAogICAgUlBDUlQ0X0Rlc3Ryb3lCaW5kaW5nKGJpbmQpOwoKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjQmluZGluZ0Zyb21TdHJpbmdCaW5kaW5nVyAoUlBDUlQ0LkApCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNCaW5kaW5nRnJvbVN0cmluZ0JpbmRpbmdXKCBMUFdTVFIgU3RyaW5nQmluZGluZywgUlBDX0JJTkRJTkdfSEFORExFKiBCaW5kaW5nICkKewogIFJQQ19TVEFUVVMgcmV0OwogIFJwY0JpbmRpbmcqIGJpbmQgPSBOVUxMOwogIExQV1NUUiBPYmplY3RVdWlkLCBQcm90c2VxLCBOZXR3b3JrQWRkciwgRW5kcG9pbnQsIE9wdGlvbnM7CiAgVVVJRCBVdWlkOwoKICBUUkFDRSgiKCVzLCVwKVxuIiwgZGVidWdzdHJfdyhTdHJpbmdCaW5kaW5nKSwgQmluZGluZyk7CgogIHJldCA9IFJwY1N0cmluZ0JpbmRpbmdQYXJzZVcoU3RyaW5nQmluZGluZywgJk9iamVjdFV1aWQsICZQcm90c2VxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV0d29ya0FkZHIsICZFbmRwb2ludCwgJk9wdGlvbnMpOwogIGlmIChyZXQgIT0gUlBDX1NfT0spIHJldHVybiByZXQ7CgogIHJldCA9IFV1aWRGcm9tU3RyaW5nVyhPYmplY3RVdWlkLCAmVXVpZCk7CgogIGlmIChyZXQgPT0gUlBDX1NfT0spCiAgICByZXQgPSBSUENSVDRfQ3JlYXRlQmluZGluZ1coJmJpbmQsIEZBTFNFLCBQcm90c2VxKTsKICBpZiAocmV0ID09IFJQQ19TX09LKQogICAgcmV0ID0gUlBDUlQ0X1NldEJpbmRpbmdPYmplY3QoYmluZCwgJlV1aWQpOwogIGlmIChyZXQgPT0gUlBDX1NfT0spCiAgICByZXQgPSBSUENSVDRfQ29tcGxldGVCaW5kaW5nVyhiaW5kLCBOZXR3b3JrQWRkciwgRW5kcG9pbnQsIE9wdGlvbnMpOwoKICBScGNTdHJpbmdGcmVlVygmT3B0aW9ucyk7CiAgUnBjU3RyaW5nRnJlZVcoJkVuZHBvaW50KTsKICBScGNTdHJpbmdGcmVlVygmTmV0d29ya0FkZHIpOwogIFJwY1N0cmluZ0ZyZWVXKCZQcm90c2VxKTsKICBScGNTdHJpbmdGcmVlVygmT2JqZWN0VXVpZCk7CgogIGlmIChyZXQgPT0gUlBDX1NfT0spCiAgICAqQmluZGluZyA9IChSUENfQklORElOR19IQU5ETEUpYmluZDsKICBlbHNlCiAgICBSUENSVDRfRGVzdHJveUJpbmRpbmcoYmluZCk7CgogIHJldHVybiByZXQ7Cn0KICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY0JpbmRpbmdUb1N0cmluZ0JpbmRpbmdBIChSUENSVDQuQCkKICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY0JpbmRpbmdUb1N0cmluZ0JpbmRpbmdBKCBSUENfQklORElOR19IQU5ETEUgQmluZGluZywgdW5zaWduZWQgY2hhcioqIFN0cmluZ0JpbmRpbmcgKQp7CiAgUlBDX1NUQVRVUyByZXQ7CiAgUnBjQmluZGluZyogYmluZCA9IChScGNCaW5kaW5nKilCaW5kaW5nOwogIExQU1RSIE9iamVjdFV1aWQ7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBCaW5kaW5nLCBTdHJpbmdCaW5kaW5nKTsKCiAgcmV0ID0gVXVpZFRvU3RyaW5nQSgmYmluZC0+T2JqZWN0VXVpZCwgKHVuc2lnbmVkIGNoYXIqKikmT2JqZWN0VXVpZCk7CiAgaWYgKHJldCAhPSBSUENfU19PSykgcmV0dXJuIHJldDsKCiAgcmV0ID0gUnBjU3RyaW5nQmluZGluZ0NvbXBvc2VBKCh1bnNpZ25lZCBjaGFyKikgT2JqZWN0VXVpZCwgKHVuc2lnbmVkIGNoYXIqKWJpbmQtPlByb3RzZXEsICh1bnNpZ25lZCBjaGFyKikgYmluZC0+TmV0d29ya0FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikgYmluZC0+RW5kcG9pbnQsIE5VTEwsIFN0cmluZ0JpbmRpbmcpOwoKICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZPYmplY3RVdWlkKTsKCiAgcmV0dXJuIHJldDsKfQogIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjQmluZGluZ1RvU3RyaW5nQmluZGluZ1cgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjQmluZGluZ1RvU3RyaW5nQmluZGluZ1coIFJQQ19CSU5ESU5HX0hBTkRMRSBCaW5kaW5nLCB1bnNpZ25lZCBzaG9ydCoqIFN0cmluZ0JpbmRpbmcgKQp7CiAgUlBDX1NUQVRVUyByZXQ7CiAgdW5zaWduZWQgY2hhciAqc3RyID0gTlVMTDsKICBUUkFDRSgiKCVwLCVwKVxuIiwgQmluZGluZywgU3RyaW5nQmluZGluZyk7CiAgcmV0ID0gUnBjQmluZGluZ1RvU3RyaW5nQmluZGluZ0EoQmluZGluZywgJnN0cik7CiAgKlN0cmluZ0JpbmRpbmcgPSBSUENSVDRfc3RyZHVwQXRvVygoY2hhciopc3RyKTsKICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZzdHIpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBJX1JwY0JpbmRpbmdTZXRBc3luYyAoUlBDUlQ0LkApCiAqIE5PVEVTCiAqICBFeGlzdHMgaW4gd2luOXggYW5kIHdpbk5ULCBidXQgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIGFyZ3VtZW50cwogKiAgKDl4IHZlcnNpb24gaGFzIDMgYXJndW1lbnRzLCBOVCBoYXMgMikuCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBJX1JwY0JpbmRpbmdTZXRBc3luYyggUlBDX0JJTkRJTkdfSEFORExFIEJpbmRpbmcsIFJQQ19CTE9DS0lOR19GTiBCbG9ja2luZ0ZuKQp7CiAgUnBjQmluZGluZyogYmluZCA9IChScGNCaW5kaW5nKilCaW5kaW5nOwoKICBUUkFDRSggIiglcCwlcCk6IHN0dWJcbiIsIEJpbmRpbmcsIEJsb2NraW5nRm4gKTsKCiAgYmluZC0+QmxvY2tpbmdGbiA9IEJsb2NraW5nRm47CgogIHJldHVybiBSUENfU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY05ldHdvcmtJc1Byb3RzZXFWYWxpZEEgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjTmV0d29ya0lzUHJvdHNlcVZhbGlkQSh1bnNpZ25lZCBjaGFyICpwcm90c2VxKSB7CiAgVU5JQ09ERV9TVFJJTkcgcHJvdHNlcVc7CgogIGlmICghcHJvdHNlcSkgcmV0dXJuIFJQQ19TX0lOVkFMSURfUlBDX1BST1RTRVE7IC8qID8gKi8KICAKICBpZiAoUnRsQ3JlYXRlVW5pY29kZVN0cmluZ0Zyb21Bc2NpaXooJnByb3RzZXFXLCAoY2hhciopcHJvdHNlcSkpIHsKICAgIFJQQ19TVEFUVVMgcmV0ID0gUnBjTmV0d29ya0lzUHJvdHNlcVZhbGlkVyhwcm90c2VxVy5CdWZmZXIpOwogICAgUnRsRnJlZVVuaWNvZGVTdHJpbmcoJnByb3RzZXFXKTsKICAgIHJldHVybiByZXQ7CiAgfSBlbHNlIHJldHVybiBSUENfU19PVVRfT0ZfTUVNT1JZOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjTmV0d29ya0lzUHJvdHNlcVZhbGlkVyAoUlBDUlQ0LkApCiAqIAogKiBDaGVja3MgaWYgdGhlIGdpdmVuIHByb3RvY29sIHNlcXVlbmNlIGlzIGtub3duIGJ5IHRoZSBSUEMgc3lzdGVtLgogKiBJZiBpdCBpcywgcmV0dXJucyBSUENfU19PSywgb3RoZXJ3aXNlIFJQQ19TX1BST1RTRVFfTk9UX1NVUFBPUlRFRC4KICoKICogV2UgY3VycmVudGx5IHN1cHBvcnQ6CiAqICAgbmNhbHJwYyAgIGxvY2FsLW9ubHkgcnBjIG92ZXIgTFBDIChMUEMgaXMgbm90IHJlYWxseSB1c2VkKQogKiAgIG5jYWNuX25wICBycGMgb3ZlciBuYW1lZCBwaXBlcwogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjTmV0d29ya0lzUHJvdHNlcVZhbGlkVyhMUFdTVFIgcHJvdHNlcSkgewogIHN0YXRpYyBjb25zdCBXQ0hBUiBwcm90c2Vxc1dbXVsxNV0gPSB7IAogICAgeyduJywnYycsJ2EnLCdsJywncicsJ3AnLCdjJywwfSwKICAgIHsnbicsJ2MnLCdhJywnYycsJ24nLCdfJywnbicsJ3AnLDB9CiAgfTsKICBzdGF0aWMgY29uc3QgaW50IGNvdW50ID0gc2l6ZW9mKHByb3RzZXFzVykgLyBzaXplb2YocHJvdHNlcXNXWzBdKTsKICBpbnQgaTsKCiAgaWYgKCFwcm90c2VxKSByZXR1cm4gUlBDX1NfSU5WQUxJRF9SUENfUFJPVFNFUTsgLyogPyAqLwoKICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgaWYgKCFzdHJjbXBXKHByb3RzZXEsIHByb3RzZXFzV1tpXSkpIHJldHVybiBSUENfU19PSzsKICB9CiAgCiAgRklYTUUoIlVua25vd24gcHJvdHNlcSAlcyAtIHdlIHByb2JhYmx5IG5lZWQgdG8gaW1wbGVtZW50IGl0IG9uZSBkYXlcbiIsIGRlYnVnc3RyX3cocHJvdHNlcSkpOwogIHJldHVybiBSUENfU19QUk9UU0VRX05PVF9TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNJbXBlcnNvbmF0ZUNsaWVudCAoUlBDUlQ0LkApCiAqCiAqIEltcGVyc29uYXRlcyB0aGUgY2xpZW50IGNvbm5lY3RlZCB2aWEgYSBiaW5kaW5nIGhhbmRsZSBzbyB0aGF0IHNlY3VyaXR5CiAqIGNoZWNrcyBhcmUgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY2xpZW50LgogKgogKiBQQVJBTVMKICogIEJpbmRpbmdIYW5kbGUgW0ldIEhhbmRsZSB0byB0aGUgYmluZGluZyB0byB0aGUgY2xpZW50LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBSUFNfU19PSy4KICogIEZhaWx1cmU6IFJQQ19TVEFUVVMgdmFsdWUuCiAqCiAqIE5PVEVTCiAqCiAqIElmIEJpbmRpbmdIYW5kbGUgaXMgTlVMTCB0aGVuIHRoZSBmdW5jdGlvbiBpbXBlcnNvbmF0ZXMgdGhlIGNsaWVudAogKiBjb25uZWN0ZWQgdG8gdGhlIGJpbmRpbmcgaGFuZGxlIG9mIHRoZSBjdXJyZW50IHRocmVhZC4KICovClJQQ19TVEFUVVMgV0lOQVBJIFJwY0ltcGVyc29uYXRlQ2xpZW50KFJQQ19CSU5ESU5HX0hBTkRMRSBCaW5kaW5nSGFuZGxlKQp7CiAgICBGSVhNRSgiKCVwKTogc3R1YlxuIiwgQmluZGluZ0hhbmRsZSk7CiAgICByZXR1cm4gUlBDX1NfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNSZXZlcnRUb1NlbGZFeCAoUlBDUlQ0LkApCiAqCiAqIFN0b3BzIGltcGVyc29uYXRpbmcgdGhlIGNsaWVudCBjb25uZWN0ZWQgdG8gdGhlIGJpbmRpbmcgaGFuZGxlIHNvIHRoYXQgc2VjdXJpdHkKICogY2hlY2tzIGFyZSBubyBsb25nZXIgZG9uZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY2xpZW50LgogKgogKiBQQVJBTVMKICogIEJpbmRpbmdIYW5kbGUgW0ldIEhhbmRsZSB0byB0aGUgYmluZGluZyB0byB0aGUgY2xpZW50LgogKgogKiBSRVRVUk5TCiAqICBTdWNjZXNzOiBSUFNfU19PSy4KICogIEZhaWx1cmU6IFJQQ19TVEFUVVMgdmFsdWUuCiAqCiAqIE5PVEVTCiAqCiAqIElmIEJpbmRpbmdIYW5kbGUgaXMgTlVMTCB0aGVuIHRoZSBmdW5jdGlvbiBzdG9wcyBpbXBlcnNvbmF0aW5nIHRoZSBjbGllbnQKICogY29ubmVjdGVkIHRvIHRoZSBiaW5kaW5nIGhhbmRsZSBvZiB0aGUgY3VycmVudCB0aHJlYWQuCiAqLwpSUENfU1RBVFVTIFdJTkFQSSBScGNSZXZlcnRUb1NlbGZFeChSUENfQklORElOR19IQU5ETEUgQmluZGluZ0hhbmRsZSkKewogICAgRklYTUUoIiglcCk6IHN0dWJcbiIsIEJpbmRpbmdIYW5kbGUpOwogICAgcmV0dXJuIFJQQ19TX09LOwp9Cg==