LyoKICogZW50aXRpZXMuYyA6IGltcGxlbWVudGF0aW9uIGZvciB0aGUgWE1MIGVudGl0aWVzIGhhbmRraW5nCiAqCiAqIFNlZSBDb3B5cmlnaHQgZm9yIHRoZSBzdGF0dXMgb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogRGFuaWVsLlZlaWxsYXJkQHczLm9yZwogKi8KCiNpZmRlZiBXSU4zMgojaW5jbHVkZSAid2luMzJjb25maWcuaCIKI2Vsc2UKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZmRlZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaWJ4bWwveG1sbWVtb3J5Lmg+CiNpbmNsdWRlIDxsaWJ4bWwvaGFzaC5oPgojaW5jbHVkZSA8bGlieG1sL2VudGl0aWVzLmg+CiNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiNpbmNsdWRlIDxsaWJ4bWwveG1sZXJyb3IuaD4KCiNkZWZpbmUgREVCVUdfRU5UX1JFRiAvKiBkZWJ1Z2dpbmcgb2YgY3Jvc3MgZW50aXRpZXMgZGVwZW5kYW5jaWVzICovCiNkZWZpbmUgRU5USVRZX0hBU0hfU0laRSAyNTYgLyogbW9kaWZ5IHhtbEVudGl0eUNvbXB1dGVIYXNoIGFjY29yZGluZ2x5ICovCgovKgogKiB4bWxFbnRpdHlDb21wdXRlSGFzaDoKICoKICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoaXMgZ2l2ZW4gZW50aXR5CiAqLwppbnQKeG1sRW50aXR5Q29tcHV0ZUhhc2goY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqY3VyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZTsKICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdmFsID0gMDsKCiAgICBpZiAobmFtZSA9PSBOVUxMKQoJcmV0dXJuKHZhbCk7CiAgICB3aGlsZSAoKmN1cikgdmFsICs9ICpjdXIrKzsKICAgIHJldHVybih2YWwpOwp9CgovKgogKiBUaGUgWE1MIHByZWRlZmluZWQgZW50aXRpZXMuCiAqLwoKc3RydWN0IHhtbFByZWRlZmluZWRFbnRpdHlWYWx1ZSB7CiAgICBjb25zdCBjaGFyICpuYW1lOwogICAgY29uc3QgY2hhciAqdmFsdWU7Cn07CnN0cnVjdCB4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWUgeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tdID0gewogICAgeyAibHQiLCAiPCIgfSwKICAgIHsgImd0IiwgIj4iIH0sCiAgICB7ICJhcG9zIiwgIiciIH0sCiAgICB7ICJxdW90IiwgIlwiIiB9LAogICAgeyAiYW1wIiwgIiYiIH0KfTsKCi8qCiAqIFRPRE86ICEhISEhISEgVGhpcyBpcyBHUk9TUywgYWxsb2NhdGlvbiBvZiBhIDI1NiBlbnRyeSBoYXNoIGZvcgogKiAgICAgICAgICAgICAgIGEgZml4ZWQgbnVtYmVyIG9mIDQgZWxlbWVudHMgIQogKi8KeG1sSGFzaFRhYmxlUHRyIHhtbFByZWRlZmluZWRFbnRpdGllcyA9IE5VTEw7CgovKgogKiB4bWxGcmVlRW50aXR5IDogY2xlYW4tdXAgYW4gZW50aXR5IHJlY29yZC4KICovCnZvaWQgeG1sRnJlZUVudGl0eSh4bWxFbnRpdHlQdHIgZW50aXR5KSB7CiAgICBpZiAoZW50aXR5ID09IE5VTEwpIHJldHVybjsKCiAgICBpZiAoZW50aXR5LT5jaGlsZHJlbikKCXhtbEZyZWVOb2RlTGlzdChlbnRpdHktPmNoaWxkcmVuKTsKICAgIGlmIChlbnRpdHktPm5hbWUgIT0gTlVMTCkKCXhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5uYW1lKTsKICAgIGlmIChlbnRpdHktPkV4dGVybmFsSUQgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+RXh0ZXJuYWxJRCk7CiAgICBpZiAoZW50aXR5LT5TeXN0ZW1JRCAhPSBOVUxMKQogICAgICAgIHhtbEZyZWUoKGNoYXIgKikgZW50aXR5LT5TeXN0ZW1JRCk7CiAgICBpZiAoZW50aXR5LT5VUkkgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+VVJJKTsKICAgIGlmIChlbnRpdHktPmNvbnRlbnQgIT0gTlVMTCkKICAgICAgICB4bWxGcmVlKChjaGFyICopIGVudGl0eS0+Y29udGVudCk7CiAgICBpZiAoZW50aXR5LT5vcmlnICE9IE5VTEwpCiAgICAgICAgeG1sRnJlZSgoY2hhciAqKSBlbnRpdHktPm9yaWcpOwogICAgTUVNX0NMRUFOVVAoZW50aXR5LCBzaXplb2YoeG1sRW50aXR5KSk7CiAgICB4bWxGcmVlKGVudGl0eSk7Cn0KCi8qCiAqIHhtbEFkZEVudGl0eSA6IHJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgYW4gZW50aXRpZXMgdGFibGUuCiAqLwpzdGF0aWMgeG1sRW50aXR5UHRyCnhtbEFkZEVudGl0eSh4bWxEdGRQdHIgZHRkLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUgPSBOVUxMOwogICAgeG1sRW50aXR5UHRyIHJldDsKCiAgICBpZiAobmFtZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFk6CiAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfR0VORVJBTF9QQVJTRURfRU5USVRZOgogICAgICAgIGNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZOgoJICAgIGlmIChkdGQtPmVudGl0aWVzID09IE5VTEwpCgkJZHRkLT5lbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoMCk7CgkgICAgdGFibGUgPSBkdGQtPmVudGl0aWVzOwoJICAgIGJyZWFrOwogICAgICAgIGNhc2UgWE1MX0lOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CiAgICAgICAgY2FzZSBYTUxfRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCSAgICBpZiAoZHRkLT5wZW50aXRpZXMgPT0gTlVMTCkKCQlkdGQtPnBlbnRpdGllcyA9IHhtbEhhc2hDcmVhdGUoMCk7CgkgICAgdGFibGUgPSBkdGQtPnBlbnRpdGllczsKCSAgICBicmVhazsKICAgICAgICBjYXNlIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWToKCSAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpCgkJeG1sUHJlZGVmaW5lZEVudGl0aWVzID0geG1sSGFzaENyZWF0ZSg4KTsKCSAgICB0YWJsZSA9IHhtbFByZWRlZmluZWRFbnRpdGllczsKICAgIH0KICAgIGlmICh0YWJsZSA9PSBOVUxMKQoJcmV0dXJuKE5VTEwpOwogICAgcmV0ID0gKHhtbEVudGl0eVB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxFbnRpdHkpKTsKICAgIGlmIChyZXQgPT0gTlVMTCkgewoJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJInhtbEFkZEVudGl0eTogb3V0IG9mIG1lbW9yeVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBtZW1zZXQocmV0LCAwLCBzaXplb2YoeG1sRW50aXR5KSk7CiAgICByZXQtPnR5cGUgPSBYTUxfRU5USVRZX0RFQ0w7CgogICAgLyoKICAgICAqIGZpbGwgdGhlIHN0cnVjdHVyZS4KICAgICAqLwogICAgcmV0LT5uYW1lID0geG1sU3RyZHVwKG5hbWUpOwogICAgcmV0LT5ldHlwZSA9ICh4bWxFbnRpdHlUeXBlKSB0eXBlOwogICAgaWYgKEV4dGVybmFsSUQgIT0gTlVMTCkKCXJldC0+RXh0ZXJuYWxJRCA9IHhtbFN0cmR1cChFeHRlcm5hbElEKTsKICAgIGlmIChTeXN0ZW1JRCAhPSBOVUxMKQoJcmV0LT5TeXN0ZW1JRCA9IHhtbFN0cmR1cChTeXN0ZW1JRCk7CiAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7CiAgICAgICAgcmV0LT5sZW5ndGggPSB4bWxTdHJsZW4oY29udGVudCk7CglyZXQtPmNvbnRlbnQgPSB4bWxTdHJuZHVwKGNvbnRlbnQsIHJldC0+bGVuZ3RoKTsKICAgICB9IGVsc2UgewogICAgICAgIHJldC0+bGVuZ3RoID0gMDsKICAgICAgICByZXQtPmNvbnRlbnQgPSBOVUxMOwogICAgfQogICAgcmV0LT5VUkkgPSBOVUxMOyAvKiB0byBiZSBjb21wdXRlZCBieSB0aGUgbGF5ZXIga25vd2luZwoJCQl0aGUgZGVmaW5pbmcgZW50aXR5ICovCiAgICByZXQtPm9yaWcgPSBOVUxMOwoKICAgIGlmICh4bWxIYXNoQWRkRW50cnkodGFibGUsIG5hbWUsIHJldCkpIHsKCS8qCgkgKiBlbnRpdHkgd2FzIGFscmVhZHkgZGVmaW5lZCBhdCBhbm90aGVyIGxldmVsLgoJICovCiAgICAgICAgeG1sRnJlZUVudGl0eShyZXQpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgcmV0dXJuKHJldCk7Cn0KCi8qKgogKiB4bWxJbml0aWFsaXplUHJlZGVmaW5lZEVudGl0aWVzOgogKgogKiBTZXQgdXAgdGhlIHByZWRlZmluZWQgZW50aXRpZXMuCiAqLwp2b2lkIHhtbEluaXRpYWxpemVQcmVkZWZpbmVkRW50aXRpZXModm9pZCkgewogICAgaW50IGk7CiAgICB4bWxDaGFyIG5hbWVbNTBdOwogICAgeG1sQ2hhciB2YWx1ZVs1MF07CiAgICBjb25zdCBjaGFyICppbjsKICAgIHhtbENoYXIgKm91dDsKCiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzICE9IE5VTEwpIHJldHVybjsKCiAgICB4bWxQcmVkZWZpbmVkRW50aXRpZXMgPSB4bWxDcmVhdGVFbnRpdGllc1RhYmxlKCk7CiAgICBmb3IgKGkgPSAwO2kgPCBzaXplb2YoeG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlcykgLyAKICAgICAgICAgICAgICAgICAgIHNpemVvZih4bWxQcmVkZWZpbmVkRW50aXR5VmFsdWVzWzBdKTtpKyspIHsKICAgICAgICBpbiA9IHhtbFByZWRlZmluZWRFbnRpdHlWYWx1ZXNbaV0ubmFtZTsKCW91dCA9ICZuYW1lWzBdOwoJZm9yICg7KCpvdXQrKyA9ICh4bWxDaGFyKSAqaW4pOylpbisrOwogICAgICAgIGluID0geG1sUHJlZGVmaW5lZEVudGl0eVZhbHVlc1tpXS52YWx1ZTsKCW91dCA9ICZ2YWx1ZVswXTsKCWZvciAoOygqb3V0KysgPSAoeG1sQ2hhcikgKmluKTspaW4rKzsKCiAgICAgICAgeG1sQWRkRW50aXR5KE5VTEwsIChjb25zdCB4bWxDaGFyICopICZuYW1lWzBdLAoJICAgICAgICAgICAgIFhNTF9JTlRFUk5BTF9QUkVERUZJTkVEX0VOVElUWSwgTlVMTCwgTlVMTCwKCQkgICAgICZ2YWx1ZVswXSk7CiAgICB9Cn0KCi8qKgogKiB4bWxDbGVhbnVwUHJlZGVmaW5lZEVudGl0aWVzOgogKgogKiBDbGVhbnVwIHVwIHRoZSBwcmVkZWZpbmVkIGVudGl0aWVzIHRhYmxlLgogKi8Kdm9pZCB4bWxDbGVhbnVwUHJlZGVmaW5lZEVudGl0aWVzKHZvaWQpIHsKICAgIGlmICh4bWxQcmVkZWZpbmVkRW50aXRpZXMgPT0gTlVMTCkgcmV0dXJuOwoKICAgIHhtbEZyZWVFbnRpdGllc1RhYmxlKHhtbFByZWRlZmluZWRFbnRpdGllcyk7CiAgICB4bWxQcmVkZWZpbmVkRW50aXRpZXMgPSBOVUxMOwp9CgovKioKICogeG1sR2V0UHJlZGVmaW5lZEVudGl0eToKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogQ2hlY2sgd2hldGhlciB0aGlzIG5hbWUgaXMgYW4gcHJlZGVmaW5lZCBlbnRpdHkuCiAqCiAqIFJldHVybnMgTlVMTCBpZiBub3QsIG90aGVydmlzZSB0aGUgZW50aXR5CiAqLwp4bWxFbnRpdHlQdHIKeG1sR2V0UHJlZGVmaW5lZEVudGl0eShjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpCiAgICAgICAgeG1sSW5pdGlhbGl6ZVByZWRlZmluZWRFbnRpdGllcygpOwogICAgcmV0dXJuKCh4bWxFbnRpdHlQdHIpIHhtbEhhc2hMb29rdXAoeG1sUHJlZGVmaW5lZEVudGl0aWVzLCBuYW1lKSk7Cn0KCi8qKgogKiB4bWxBZGREdGRFbnRpdHk6CiAqIEBkb2M6ICB0aGUgZG9jdW1lbnQKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICogQHR5cGU6ICB0aGUgZW50aXR5IHR5cGUgWE1MX3h4eF95eXlfRU5USVRZCiAqIEBFeHRlcm5hbElEOiAgdGhlIGVudGl0eSBleHRlcm5hbCBJRCBpZiBhdmFpbGFibGUKICogQFN5c3RlbUlEOiAgdGhlIGVudGl0eSBzeXN0ZW0gSUQgaWYgYXZhaWxhYmxlCiAqIEBjb250ZW50OiAgdGhlIGVudGl0eSBjb250ZW50CiAqCiAqIFJlZ2lzdGVyIGEgbmV3IGVudGl0eSBmb3IgdGhpcyBkb2N1bWVudCBEVEQgZXh0ZXJuYWwgc3Vic2V0LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogKi8KeG1sRW50aXR5UHRyCnhtbEFkZER0ZEVudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkJY29uc3QgeG1sQ2hhciAqY29udGVudCkgewogICAgeG1sRW50aXR5UHRyIHJldDsKICAgIHhtbER0ZFB0ciBkdGQ7CgogICAgaWYgKGRvYyA9PSBOVUxMKSB7CiAgICAgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkgICAgICAgICJ4bWxBZGREdGRFbnRpdHk6IGRvYyA9PSBOVUxMICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgaWYgKGRvYy0+ZXh0U3Vic2V0ID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAgICAgInhtbEFkZER0ZEVudGl0eTogZG9jdW1lbnQgd2l0aG91dCBleHRlcm5hbCBzdWJzZXQgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBkdGQgPSBkb2MtPmV4dFN1YnNldDsKICAgIHJldCA9IHhtbEFkZEVudGl0eShkdGQsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEdGQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CiAgICAgICAgZHRkLT5sYXN0LT5uZXh0ID0gKHhtbE5vZGVQdHIpIHJldDsKCXJldC0+cHJldiA9IGR0ZC0+bGFzdDsKCWR0ZC0+bGFzdCA9ICh4bWxOb2RlUHRyKSByZXQ7CiAgICB9CiAgICByZXR1cm4ocmV0KTsKfQoKLyoqCiAqIHhtbEFkZERvY0VudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudAogKiBAbmFtZTogIHRoZSBlbnRpdHkgbmFtZQogKiBAdHlwZTogIHRoZSBlbnRpdHkgdHlwZSBYTUxfeHh4X3l5eV9FTlRJVFkKICogQEV4dGVybmFsSUQ6ICB0aGUgZW50aXR5IGV4dGVybmFsIElEIGlmIGF2YWlsYWJsZQogKiBAU3lzdGVtSUQ6ICB0aGUgZW50aXR5IHN5c3RlbSBJRCBpZiBhdmFpbGFibGUKICogQGNvbnRlbnQ6ICB0aGUgZW50aXR5IGNvbnRlbnQKICoKICogUmVnaXN0ZXIgYSBuZXcgZW50aXR5IGZvciB0aGlzIGRvY3VtZW50LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgogKi8KeG1sRW50aXR5UHRyCnhtbEFkZERvY0VudGl0eSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICpuYW1lLCBpbnQgdHlwZSwKCSAgICAgICAgY29uc3QgeG1sQ2hhciAqRXh0ZXJuYWxJRCwgY29uc3QgeG1sQ2hhciAqU3lzdGVtSUQsCgkgICAgICAgIGNvbnN0IHhtbENoYXIgKmNvbnRlbnQpIHsKICAgIHhtbEVudGl0eVB0ciByZXQ7CiAgICB4bWxEdGRQdHIgZHRkOwoKICAgIGlmIChkb2MgPT0gTlVMTCkgewogICAgICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJICAgICAgICAieG1sQWRkRG9jRW50aXR5OiBkb2N1bWVudCBpcyBOVUxMICFcbiIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgaWYgKGRvYy0+aW50U3Vic2V0ID09IE5VTEwpIHsKICAgICAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAgICAgInhtbEFkZER0ZEVudGl0eTogZG9jdW1lbnQgd2l0aG91dCBpbnRlcm5hbCBzdWJzZXQgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBkdGQgPSBkb2MtPmludFN1YnNldDsKICAgIHJldCA9IHhtbEFkZEVudGl0eShkdGQsIG5hbWUsIHR5cGUsIEV4dGVybmFsSUQsIFN5c3RlbUlELCBjb250ZW50KTsKICAgIGlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwoKICAgIC8qCiAgICAgKiBMaW5rIGl0IHRvIHRoZSBEdGQKICAgICAqLwogICAgcmV0LT5wYXJlbnQgPSBkdGQ7CiAgICByZXQtPmRvYyA9IGR0ZC0+ZG9jOwogICAgaWYgKGR0ZC0+bGFzdCA9PSBOVUxMKSB7CglkdGQtPmNoaWxkcmVuID0gZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0gZWxzZSB7CglkdGQtPmxhc3QtPm5leHQgPSAoeG1sTm9kZVB0cikgcmV0OwoJcmV0LT5wcmV2ID0gZHRkLT5sYXN0OwoJZHRkLT5sYXN0ID0gKHhtbE5vZGVQdHIpIHJldDsKICAgIH0KICAgIHJldHVybihyZXQpOwp9CgovKioKICogeG1sR2V0RW50aXR5RnJvbVRhYmxlOgogKiBAdGFibGU6ICBhbiBlbnRpdHkgdGFibGUKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICogQHBhcmFtZXRlcjogIGxvb2sgZm9yIHBhcmFtZXRlciBlbnRpdGllcwogKgogKiBEbyBhbiBlbnRpdHkgbG9va3VwIGluIHRoZSB0YWJsZS4KICogcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgZW50aXR5LCBpZiBmb3VuZC4KICogCiAqIFJldHVybnMgQSBwb2ludGVyIHRvIHRoZSBlbnRpdHkgc3RydWN0dXJlIG9yIE5VTEwgaWYgbm90IGZvdW5kLgogKi8KeG1sRW50aXR5UHRyCnhtbEdldEVudGl0eUZyb21UYWJsZSh4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlLCBjb25zdCB4bWxDaGFyICpuYW1lKSB7CiAgICByZXR1cm4oKHhtbEVudGl0eVB0cikgeG1sSGFzaExvb2t1cCh0YWJsZSwgbmFtZSkpOwp9CgovKioKICogeG1sR2V0UGFyYW1ldGVyRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHN1YnNldHMgYW5kCiAqIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGVudGl0eSwgaWYgZm91bmQuCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXRQYXJhbWV0ZXJFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZTsKICAgIHhtbEVudGl0eVB0ciByZXQ7CgogICAgaWYgKChkb2MtPmludFN1YnNldCAhPSBOVUxMKSAmJiAoZG9jLT5pbnRTdWJzZXQtPnBlbnRpdGllcyAhPSBOVUxMKSkgewoJdGFibGUgPSAoeG1sRW50aXRpZXNUYWJsZVB0cikgZG9jLT5pbnRTdWJzZXQtPnBlbnRpdGllczsKCXJldCA9IHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSk7CglpZiAocmV0ICE9IE5VTEwpCgkgICAgcmV0dXJuKHJldCk7CiAgICB9CiAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldC0+cGVudGl0aWVzICE9IE5VTEwpKSB7Cgl0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmV4dFN1YnNldC0+cGVudGl0aWVzOwoJcmV0dXJuKHhtbEdldEVudGl0eUZyb21UYWJsZSh0YWJsZSwgbmFtZSkpOwogICAgfQogICAgcmV0dXJuKE5VTEwpOwp9CgovKioKICogeG1sR2V0RHRkRW50aXR5OgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IHJlZmVyZW5jaW5nIHRoZSBlbnRpdHkKICogQG5hbWU6ICB0aGUgZW50aXR5IG5hbWUKICoKICogRG8gYW4gZW50aXR5IGxvb2t1cCBpbiB0aGUgRHRkIGVudGl0eSBoYXNoIHRhYmxlIGFuZAogKiByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGVudGl0eSwgaWYgZm91bmQuCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXREdGRFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZTsKCiAgICBpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCXRhYmxlID0gKHhtbEVudGl0aWVzVGFibGVQdHIpIGRvYy0+ZXh0U3Vic2V0LT5lbnRpdGllczsKCXJldHVybih4bWxHZXRFbnRpdHlGcm9tVGFibGUodGFibGUsIG5hbWUpKTsKICAgIH0KICAgIHJldHVybihOVUxMKTsKfQoKLyoqCiAqIHhtbEdldERvY0VudGl0eToKICogQGRvYzogIHRoZSBkb2N1bWVudCByZWZlcmVuY2luZyB0aGUgZW50aXR5CiAqIEBuYW1lOiAgdGhlIGVudGl0eSBuYW1lCiAqCiAqIERvIGFuIGVudGl0eSBsb29rdXAgaW4gdGhlIGRvY3VtZW50IGVudGl0eSBoYXNoIHRhYmxlIGFuZAogKiByZXR1cm5zIHRoZSBjb3Jyc3BvbmRpbmcgZW50aXR5LCBvdGhlcndpc2UgYSBsb29rdXAgaXMgZG9uZQogKiBpbiB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcyB0b28uCiAqIAogKiBSZXR1cm5zIEEgcG9pbnRlciB0byB0aGUgZW50aXR5IHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmb3VuZC4KICovCnhtbEVudGl0eVB0cgp4bWxHZXREb2NFbnRpdHkoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sQ2hhciAqbmFtZSkgewogICAgeG1sRW50aXR5UHRyIGN1cjsKICAgIHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGU7CgogICAgaWYgKGRvYyAhPSBOVUxMKSB7CglpZiAoKGRvYy0+aW50U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmludFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCSAgICB0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmludFN1YnNldC0+ZW50aXRpZXM7CgkgICAgY3VyID0geG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lKTsKCSAgICBpZiAoY3VyICE9IE5VTEwpCgkJcmV0dXJuKGN1cik7Cgl9CglpZiAoKGRvYy0+ZXh0U3Vic2V0ICE9IE5VTEwpICYmIChkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXMgIT0gTlVMTCkpIHsKCSAgICB0YWJsZSA9ICh4bWxFbnRpdGllc1RhYmxlUHRyKSBkb2MtPmV4dFN1YnNldC0+ZW50aXRpZXM7CgkgICAgY3VyID0geG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lKTsKCSAgICBpZiAoY3VyICE9IE5VTEwpCgkJcmV0dXJuKGN1cik7Cgl9CiAgICB9CiAgICBpZiAoeG1sUHJlZGVmaW5lZEVudGl0aWVzID09IE5VTEwpCiAgICAgICAgeG1sSW5pdGlhbGl6ZVByZWRlZmluZWRFbnRpdGllcygpOwogICAgdGFibGUgPSB4bWxQcmVkZWZpbmVkRW50aXRpZXM7CiAgICByZXR1cm4oeG1sR2V0RW50aXR5RnJvbVRhYmxlKHRhYmxlLCBuYW1lKSk7Cn0KCi8qCiAqIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdCiAqICAgICAgICAgICAgICAgICAgfCBbI3gxMDAwMC0jeDEwRkZGRl0KICogYW55IFVuaWNvZGUgY2hhcmFjdGVyLCBleGNsdWRpbmcgdGhlIHN1cnJvZ2F0ZSBibG9ja3MsIEZGRkUsIGFuZCBGRkZGLgogKi8KI2RlZmluZSBJU19DSEFSKGMpCQkJCQkJCVwKICAgICgoKGMpID09IDB4MDkpIHx8ICgoYykgPT0gMHgwYSkgfHwgKChjKSA9PSAweDBkKSB8fAkJCVwKICAgICAoKChjKSA+PSAweDIwKSAmJiAoKGMpICE9IDB4RkZGRSkgJiYgKChjKSAhPSAweEZGRkYpKSkKCi8qCiAqIEEgYnVmZmVyIHVzZWQgZm9yIGNvbnZlcnRpbmcgZW50aXRpZXMgdG8gdGhlaXIgZXF1aXZhbGVudCBhbmQgYmFjay4KICovCnN0YXRpYyBpbnQgYnVmZmVyX3NpemUgPSAwOwpzdGF0aWMgeG1sQ2hhciAqYnVmZmVyID0gTlVMTDsKCmludCBncm93QnVmZmVyKHZvaWQpIHsKICAgIGJ1ZmZlcl9zaXplICo9IDI7CiAgICBidWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxSZWFsbG9jKGJ1ZmZlciwgYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwogICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgcGVycm9yKCJyZWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKC0xKTsKICAgIH0KICAgIHJldHVybigwKTsKfQoKCi8qKgogKiB4bWxFbmNvZGVFbnRpdGllczoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogYW5kIG5vbiBBU0NJSSB2YWx1ZXMgd2l0aCB0aGVpciBlbnRpdGllcyBhbmQgQ2hhclJlZiBjb3VudGVycGFydHMuCiAqCiAqIFRPRE86IHJlbW92ZSB4bWxFbmNvZGVFbnRpdGllcywgb25jZSB3ZSBhcmUgbm90IGFmcmFpZCBvZiBicmVha2luZyBiaW5hcnkKICogICAgICAgY29tcGF0aWJpbGl0eQogKgogKiBQZW9wbGUgbXVzdCBtaWdyYXRlIHRoZWlyIGNvZGUgdG8geG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQgIQogKiBUaGlzIHJvdXRpbmUgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBlbmNvdW50ZXJlZC4KICogCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KY29uc3QgeG1sQ2hhciAqCnhtbEVuY29kZUVudGl0aWVzKHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKm91dCA9IGJ1ZmZlcjsKICAgIHN0YXRpYyBpbnQgd2FybmluZyA9IDE7CiAgICBpbnQgaHRtbCA9IDA7CgoKICAgIGlmICh3YXJuaW5nKSB7CiAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCSAgICAiRGVwcmVjYXRlZCBBUEkgeG1sRW5jb2RlRW50aXRpZXMoKSB1c2VkXG4iKTsKICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJICAgICIgICBjaGFuZ2UgY29kZSB0byB1c2UgeG1sRW5jb2RlRW50aXRpZXNSZWVudHJhbnQoKVxuIik7CiAgICB3YXJuaW5nID0gMDsKICAgIH0KCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewogICAgICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgICAgICBidWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxNYWxsb2MoYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwoJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CgkgICAgcGVycm9yKCJtYWxsb2MgZmFpbGVkIik7CiAgICAgICAgICAgIHJldHVybihOVUxMKTsKCX0KCW91dCA9IGJ1ZmZlcjsKICAgIH0KICAgIHdoaWxlICgqY3VyICE9ICdcMCcpIHsKICAgICAgICBpZiAob3V0IC0gYnVmZmVyID4gYnVmZmVyX3NpemUgLSAxMDApIHsKCSAgICBpbnQgaW5kZXggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXIoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZGV4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgoKmN1ciA9PSAnXCcnKSAmJiAoIWh0bWwpKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJ28nOwoJICAgICpvdXQrKyA9ICdzJzsKCSAgICAqb3V0KysgPSAnOyc7Cgl9IGVsc2UgaWYgKCgoKmN1ciA+PSAweDIwKSAmJiAoKmN1ciA8IDB4ODApKSB8fAoJICAgICgqY3VyID09ICdcbicpIHx8ICgqY3VyID09ICdccicpIHx8ICgqY3VyID09ICdcdCcpKSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIGp1c3QgY29weSAhCgkgICAgICovCgkgICAgKm91dCsrID0gKmN1cjsKI2lmbmRlZiBVU0VfVVRGXzgKCX0gZWxzZSBpZiAoKHNpemVvZih4bWxDaGFyKSA9PSAxKSAmJiAoKmN1ciA+PSAweDgwKSkgewoJICAgIGNoYXIgYnVmWzEwXSwgKnB0cjsKCiNpZmRlZiBIQVZFX1NOUFJJTlRGCgkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CiNlbHNlCgkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKICAgICAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogICAgICAgICAgICBwdHIgPSBidWY7CgkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwojZW5kaWYKCX0gZWxzZSBpZiAoSVNfQ0hBUigqY3VyKSkgewoJICAgIGNoYXIgYnVmWzEwXSwgKnB0cjsKCiNpZmRlZiBIQVZFX1NOUFJJTlRGCgkgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiYjJWQ7IiwgKmN1cik7CiNlbHNlCgkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKICAgICAgICAgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogICAgICAgICAgICBwdHIgPSBidWY7CgkgICAgd2hpbGUgKCpwdHIgIT0gMCkgKm91dCsrID0gKnB0cisrOwoJfQojaWYgMAoJZWxzZSB7CgkgICAgLyoKCSAgICAgKiBkZWZhdWx0IGNhc2UsIHRoaXMgaXMgbm90IGEgdmFsaWQgY2hhciAhCgkgICAgICogU2tpcCBpdC4uLgoJICAgICAqLwoJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJCSAgICAieG1sRW5jb2RlRW50aXRpZXM6IGludmFsaWQgY2hhciAlZFxuIiwgKGludCkgKmN1cik7Cgl9CiNlbmRpZgoJY3VyKys7CiAgICB9CiAgICAqb3V0KysgPSAwOwogICAgcmV0dXJuKGJ1ZmZlcik7Cn0KCi8qCiAqIE1hY3JvIHVzZWQgdG8gZ3JvdyB0aGUgY3VycmVudCBidWZmZXIuCiAqLwojZGVmaW5lIGdyb3dCdWZmZXJSZWVudHJhbnQoKSB7CQkJCQkJXAogICAgYnVmZmVyX3NpemUgKj0gMjsJCQkJCQkJXAogICAgYnVmZmVyID0gKHhtbENoYXIgKikJCQkJCQlcCiAgICAJCXhtbFJlYWxsb2MoYnVmZmVyLCBidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CVwKICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewkJCQkJCVwKCXBlcnJvcigicmVhbGxvYyBmYWlsZWQiKTsJCQkJCVwKCXJldHVybihOVUxMKTsJCQkJCQkJXAogICAgfQkJCQkJCQkJCVwKfQoKCi8qKgogKiB4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudDoKICogQGRvYzogIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBzdHJpbmcKICogQGlucHV0OiAgQSBzdHJpbmcgdG8gY29udmVydCB0byBYTUwuCiAqCiAqIERvIGEgZ2xvYmFsIGVuY29kaW5nIG9mIGEgc3RyaW5nLCByZXBsYWNpbmcgdGhlIHByZWRlZmluZWQgZW50aXRpZXMKICogYW5kIG5vbiBBU0NJSSB2YWx1ZXMgd2l0aCB0aGVpciBlbnRpdGllcyBhbmQgQ2hhclJlZiBjb3VudGVycGFydHMuCiAqIENvbnRyYXJ5IHRvIHhtbEVuY29kZUVudGl0aWVzLCB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0CiAqIG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50KHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbENoYXIgKmlucHV0KSB7CiAgICBjb25zdCB4bWxDaGFyICpjdXIgPSBpbnB1dDsKICAgIHhtbENoYXIgKmJ1ZmZlciA9IE5VTEw7CiAgICB4bWxDaGFyICpvdXQgPSBOVUxMOwogICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKICAgIGludCBodG1sID0gMDsKCiAgICBpZiAoaW5wdXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOwogICAgaWYgKGRvYyAhPSBOVUxMKQogICAgICAgIGh0bWwgPSAoZG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpOwoKICAgIC8qCiAgICAgKiBhbGxvY2F0ZSBhbiB0cmFuc2xhdGlvbiBidWZmZXIuCiAgICAgKi8KICAgIGJ1ZmZlcl9zaXplID0gMTAwMDsKICAgIGJ1ZmZlciA9ICh4bWxDaGFyICopIHhtbE1hbGxvYyhidWZmZXJfc2l6ZSAqIHNpemVvZih4bWxDaGFyKSk7CiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKCXBlcnJvcigibWFsbG9jIGZhaWxlZCIpOwoJcmV0dXJuKE5VTEwpOwogICAgfQogICAgb3V0ID0gYnVmZmVyOwoKICAgIHdoaWxlICgqY3VyICE9ICdcMCcpIHsKICAgICAgICBpZiAob3V0IC0gYnVmZmVyID4gYnVmZmVyX3NpemUgLSAxMDApIHsKCSAgICBpbnQgaW5kZXggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZGV4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwojaWYgMAoJfSBlbHNlIGlmICgoKmN1ciA9PSAnXCcnKSAmJiAoIWh0bWwpKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdhJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJ28nOwoJICAgICpvdXQrKyA9ICdzJzsKCSAgICAqb3V0KysgPSAnOyc7CiNlbmRpZgoJfSBlbHNlIGlmICgoKCpjdXIgPj0gMHgyMCkgJiYgKCpjdXIgPCAweDgwKSkgfHwKCSAgICAoKmN1ciA9PSAnXG4nKSB8fCAoKmN1ciA9PSAnXHInKSB8fCAoKmN1ciA9PSAnXHQnKSkgewoJICAgIC8qCgkgICAgICogZGVmYXVsdCBjYXNlLCBqdXN0IGNvcHkgIQoJICAgICAqLwoJICAgICpvdXQrKyA9ICpjdXI7Cgl9IGVsc2UgaWYgKCpjdXIgPj0gMHg4MCkgewoJICAgIGlmICgoZG9jLT5lbmNvZGluZyAhPSBOVUxMKSB8fCAoaHRtbCkpIHsKCQkvKgoJCSAqIEJq+HJuIFJlZXNlIDxickBzc2V1c2EuY29tPiBwcm92aWRlZCB0aGUgcGF0Y2gKCSAgICAgICAgeG1sQ2hhciB4YzsKCSAgICAgICAgeGMgPSAoKmN1ciAmIDB4M0YpIDw8IDY7CgkgICAgICAgIGlmIChjdXJbMV0gIT0gMCkgewoJCSAgICB4YyArPSAqKCsrY3VyKSAmIDB4M0Y7CgkJICAgICpvdXQrKyA9IHhjOwoJICAgICAgICB9IGVsc2UKCQkgKi8KCQkgICAgKm91dCsrID0gKmN1cjsKCSAgICB9IGVsc2UgewoJCS8qCgkJICogV2UgYXNzdW1lIHdlIGhhdmUgVVRGLTggaW5wdXQuCgkJICovCgkJY2hhciBidWZbMTBdLCAqcHRyOwoJCWludCB2YWwgPSAwLCBsID0gMTsKCgkJaWYgKCpjdXIgPCAweEMwKSB7CgkJICAgIHhtbEdlbmVyaWNFcnJvcih4bWxHZW5lcmljRXJyb3JDb250ZXh0LAoJCQkgICAgInhtbEVuY29kZUVudGl0aWVzUmVlbnRyYW50IDogaW5wdXQgbm90IFVURi04XG4iKTsKCQkgICAgZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwojaWZkZWYgSEFWRV9TTlBSSU5URgoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKI2Vsc2UKCQkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKCQkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCSAgICBwdHIgPSBidWY7CgkJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQkgICAgY29udGludWU7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhFMCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgxRjsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICBsID0gMjsKCQl9IGVsc2UgaWYgKCpjdXIgPCAweEYwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsID0gKGN1clswXSkgJiAweDBGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzFdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbMl0pICYgMHgzRjsKCQkgICAgbCA9IDM7CgkJfSBlbHNlIGlmICgqY3VyIDwgMHhGOCkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9IChjdXJbMF0pICYgMHgwNzsKCQkgICAgdmFsIDw8PSA2OwoJCSAgICB2YWwgfD0gKGN1clsxXSkgJiAweDNGOwoJCSAgICB2YWwgPDw9IDY7CgkJICAgIHZhbCB8PSAoY3VyWzJdKSAmIDB4M0Y7CgkJICAgIHZhbCA8PD0gNjsKCQkgICAgdmFsIHw9IChjdXJbM10pICYgMHgzRjsKCQkgICAgbCA9IDQ7CgkJfQoJCWlmICgobCA9PSAxKSB8fCAoIUlTX0NIQVIodmFsKSkpIHsKCQkgICAgeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJCSJ4bWxFbmNvZGVFbnRpdGllc1JlZW50cmFudCA6IGNoYXIgb3V0IG9mIHJhbmdlXG4iKTsKCQkgICAgZG9jLT5lbmNvZGluZyA9IHhtbFN0cmR1cChCQURfQ0FTVCAiSVNPLTg4NTktMSIpOwojaWZkZWYgSEFWRV9TTlBSSU5URgoJCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKI2Vsc2UKCQkgICAgc3ByaW50ZihidWYsICImIyVkOyIsICpjdXIpOwojZW5kaWYKCQkgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCSAgICBwdHIgPSBidWY7CgkJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCQkgICAgY3VyKys7CgkJICAgIGNvbnRpbnVlOwoJCX0KCQkvKgoJCSAqIFdlIGNvdWxkIGRvIG11bHRpcGxlIHRoaW5ncyBoZXJlLiBKdXN0IHNhdmUgYXMgYSBjaGFyIHJlZgoJCSAqLwojaWZkZWYgSEFWRV9TTlBSSU5URgoJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICImI3glWDsiLCB2YWwpOwojZWxzZQoJCXNwcmludGYoYnVmLCAiJiN4JVg7IiwgdmFsKTsKI2VuZGlmCgkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwoJCXB0ciA9IGJ1ZjsKCQl3aGlsZSAoKnB0ciAhPSAwKSAqb3V0KysgPSAqcHRyKys7CgkJY3VyICs9IGw7CgkJY29udGludWU7CgkgICAgfQoJfSBlbHNlIGlmIChJU19DSEFSKCpjdXIpKSB7CgkgICAgY2hhciBidWZbMTBdLCAqcHRyOwoKI2lmZGVmIEhBVkVfU05QUklOVEYKCSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJiMlZDsiLCAqY3VyKTsKI2Vsc2UKCSAgICBzcHJpbnRmKGJ1ZiwgIiYjJWQ7IiwgKmN1cik7CiNlbmRpZgoJICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKICAgICAgICAgICAgcHRyID0gYnVmOwoJICAgIHdoaWxlICgqcHRyICE9IDApICpvdXQrKyA9ICpwdHIrKzsKCX0KI2lmIDAKCWVsc2UgewoJICAgIC8qCgkgICAgICogZGVmYXVsdCBjYXNlLCB0aGlzIGlzIG5vdCBhIHZhbGlkIGNoYXIgIQoJICAgICAqIFNraXAgaXQuLi4KCSAgICAgKi8KCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCQkgICAgInhtbEVuY29kZUVudGl0aWVzOiBpbnZhbGlkIGNoYXIgJWRcbiIsIChpbnQpICpjdXIpOwoJfQojZW5kaWYKCWN1cisrOwogICAgfQogICAgKm91dCsrID0gMDsKICAgIHJldHVybihidWZmZXIpOwp9CgovKioKICogeG1sRW5jb2RlU3BlY2lhbENoYXJzOgogKiBAZG9jOiAgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIHN0cmluZwogKiBAaW5wdXQ6ICBBIHN0cmluZyB0byBjb252ZXJ0IHRvIFhNTC4KICoKICogRG8gYSBnbG9iYWwgZW5jb2Rpbmcgb2YgYSBzdHJpbmcsIHJlcGxhY2luZyB0aGUgcHJlZGVmaW5lZCBlbnRpdGllcwogKiB0aGlzIHJvdXRpbmUgaXMgcmVlbnRyYW50LCBhbmQgcmVzdWx0IG11c3QgYmUgZGVhbGxvY2F0ZWQuCiAqCiAqIFJldHVybnMgQSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBkb25lLgogKi8KeG1sQ2hhciAqCnhtbEVuY29kZVNwZWNpYWxDaGFycyh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxDaGFyICppbnB1dCkgewogICAgY29uc3QgeG1sQ2hhciAqY3VyID0gaW5wdXQ7CiAgICB4bWxDaGFyICpidWZmZXIgPSBOVUxMOwogICAgeG1sQ2hhciAqb3V0ID0gTlVMTDsKICAgIGludCBidWZmZXJfc2l6ZSA9IDA7CiAgICBpbnQgaHRtbCA9IDA7CgogICAgaWYgKGlucHV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKICAgIGlmIChkb2MgIT0gTlVMTCkKICAgICAgICBodG1sID0gKGRvYy0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKTsKCiAgICAvKgogICAgICogYWxsb2NhdGUgYW4gdHJhbnNsYXRpb24gYnVmZmVyLgogICAgICovCiAgICBidWZmZXJfc2l6ZSA9IDEwMDA7CiAgICBidWZmZXIgPSAoeG1sQ2hhciAqKSB4bWxNYWxsb2MoYnVmZmVyX3NpemUgKiBzaXplb2YoeG1sQ2hhcikpOwogICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CglwZXJyb3IoIm1hbGxvYyBmYWlsZWQiKTsKCXJldHVybihOVUxMKTsKICAgIH0KICAgIG91dCA9IGJ1ZmZlcjsKCiAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7CiAgICAgICAgaWYgKG91dCAtIGJ1ZmZlciA+IGJ1ZmZlcl9zaXplIC0gMTApIHsKCSAgICBpbnQgaW5kZXggPSBvdXQgLSBidWZmZXI7CgoJICAgIGdyb3dCdWZmZXJSZWVudHJhbnQoKTsKCSAgICBvdXQgPSAmYnVmZmVyW2luZGV4XTsKCX0KCgkvKgoJICogQnkgZGVmYXVsdCBvbmUgaGF2ZSB0byBlbmNvZGUgYXQgbGVhc3QgJzwnLCAnPicsICciJyBhbmQgJyYnICEKCSAqLwoJaWYgKCpjdXIgPT0gJzwnKSB7CgkgICAgKm91dCsrID0gJyYnOwoJICAgICpvdXQrKyA9ICdsJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICc+JykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAnZyc7CgkgICAgKm91dCsrID0gJ3QnOwoJICAgICpvdXQrKyA9ICc7JzsKCX0gZWxzZSBpZiAoKmN1ciA9PSAnJicpIHsKCSAgICAqb3V0KysgPSAnJic7CgkgICAgKm91dCsrID0gJ2EnOwoJICAgICpvdXQrKyA9ICdtJzsKCSAgICAqb3V0KysgPSAncCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIGlmICgqY3VyID09ICciJykgewoJICAgICpvdXQrKyA9ICcmJzsKCSAgICAqb3V0KysgPSAncSc7CgkgICAgKm91dCsrID0gJ3UnOwoJICAgICpvdXQrKyA9ICdvJzsKCSAgICAqb3V0KysgPSAndCc7CgkgICAgKm91dCsrID0gJzsnOwoJfSBlbHNlIHsKCSAgICAvKgoJICAgICAqIFdvcmtzIGJlY2F1c2Ugb24gVVRGLTgsIGFsbCBleHRlbmRlZCBzZXF1ZW5jZXMgY2Fubm90CgkgICAgICogcmVzdWx0IGluIGJ5dGVzIGluIHRoZSBBU0NJSSByYW5nZS4KCSAgICAgKi8KCSAgICAqb3V0KysgPSAqY3VyOwoJfQoJY3VyKys7CiAgICB9CiAgICAqb3V0KysgPSAwOwogICAgcmV0dXJuKGJ1ZmZlcik7Cn0KCi8qKgogKiB4bWxDcmVhdGVFbnRpdGllc1RhYmxlOgogKgogKiBjcmVhdGUgYW5kIGluaXRpYWxpemUgYW4gZW1wdHkgZW50aXRpZXMgaGFzaCB0YWJsZS4KICoKICogUmV0dXJucyB0aGUgeG1sRW50aXRpZXNUYWJsZVB0ciBqdXN0IGNyZWF0ZWQgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXRpZXNUYWJsZVB0cgp4bWxDcmVhdGVFbnRpdGllc1RhYmxlKHZvaWQpIHsKICAgIHJldHVybigoeG1sRW50aXRpZXNUYWJsZVB0cikgeG1sSGFzaENyZWF0ZSgwKSk7Cn0KCi8qKgogKiB4bWxGcmVlRW50aXRpZXNUYWJsZToKICogQHRhYmxlOiAgQW4gZW50aXR5IHRhYmxlCiAqCiAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IGFuIGVudGl0aWVzIGhhc2ggdGFibGUuCiAqLwp2b2lkCnhtbEZyZWVFbnRpdGllc1RhYmxlKHhtbEVudGl0aWVzVGFibGVQdHIgdGFibGUpIHsKICAgIHhtbEhhc2hGcmVlKHRhYmxlLCAoeG1sSGFzaERlYWxsb2NhdG9yKSB4bWxGcmVlRW50aXR5KTsKfQoKLyoqCiAqIHhtbENvcHlFbnRpdHk6CiAqIEBlbnQ6ICBBbiBlbnRpdHkKICoKICogQnVpbGQgYSBjb3B5IG9mIGFuIGVudGl0eQogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzUHRyIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KICovCnhtbEVudGl0eVB0cgp4bWxDb3B5RW50aXR5KHhtbEVudGl0eVB0ciBlbnQpIHsKICAgIHhtbEVudGl0eVB0ciBjdXI7CgogICAgY3VyID0gKHhtbEVudGl0eVB0cikgeG1sTWFsbG9jKHNpemVvZih4bWxFbnRpdHkpKTsKICAgIGlmIChjdXIgPT0gTlVMTCkgewoJeG1sR2VuZXJpY0Vycm9yKHhtbEdlbmVyaWNFcnJvckNvbnRleHQsCgkJInhtbENvcHlFbnRpdHk6IG91dCBvZiBtZW1vcnkgIVxuIik7CglyZXR1cm4oTlVMTCk7CiAgICB9CiAgICBtZW1zZXQoY3VyLCAwLCBzaXplb2YoeG1sRW50aXR5KSk7CiAgICBjdXItPnR5cGUgPSBYTUxfRUxFTUVOVF9ERUNMOwoKICAgIGN1ci0+ZXR5cGUgPSBlbnQtPmV0eXBlOwogICAgaWYgKGVudC0+bmFtZSAhPSBOVUxMKQoJY3VyLT5uYW1lID0geG1sU3RyZHVwKGVudC0+bmFtZSk7CiAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpCgljdXItPkV4dGVybmFsSUQgPSB4bWxTdHJkdXAoZW50LT5FeHRlcm5hbElEKTsKICAgIGlmIChlbnQtPlN5c3RlbUlEICE9IE5VTEwpCgljdXItPlN5c3RlbUlEID0geG1sU3RyZHVwKGVudC0+U3lzdGVtSUQpOwogICAgaWYgKGVudC0+Y29udGVudCAhPSBOVUxMKQoJY3VyLT5jb250ZW50ID0geG1sU3RyZHVwKGVudC0+Y29udGVudCk7CiAgICBpZiAoZW50LT5vcmlnICE9IE5VTEwpCgljdXItPm9yaWcgPSB4bWxTdHJkdXAoZW50LT5vcmlnKTsKICAgIHJldHVybihjdXIpOwp9CgovKioKICogeG1sQ29weUVudGl0aWVzVGFibGU6CiAqIEB0YWJsZTogIEFuIGVudGl0eSB0YWJsZQogKgogKiBCdWlsZCBhIGNvcHkgb2YgYW4gZW50aXR5IHRhYmxlLgogKiAKICogUmV0dXJucyB0aGUgbmV3IHhtbEVudGl0aWVzVGFibGVQdHIgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogKi8KeG1sRW50aXRpZXNUYWJsZVB0cgp4bWxDb3B5RW50aXRpZXNUYWJsZSh4bWxFbnRpdGllc1RhYmxlUHRyIHRhYmxlKSB7CiAgICByZXR1cm4oeG1sSGFzaENvcHkodGFibGUsICh4bWxIYXNoQ29waWVyKSB4bWxDb3B5RW50aXR5KSk7Cn0KCi8qKgogKiB4bWxEdW1wRW50aXR5RGVjbDoKICogQGJ1ZjogIEFuIFhNTCBidWZmZXIuCiAqIEBlbnQ6ICBBbiBlbnRpdHkgdGFibGUKICoKICogVGhpcyB3aWxsIGR1bXAgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGl0eSB0YWJsZSBhcyBhbiBYTUwgRFREIGRlZmluaXRpb24KICovCnZvaWQKeG1sRHVtcEVudGl0eURlY2woeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sRW50aXR5UHRyIGVudCkgewogICAgc3dpdGNoIChlbnQtPmV0eXBlKSB7CgljYXNlIFhNTF9JTlRFUk5BTF9HRU5FUkFMX0VOVElUWToKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFFTlRJVFkgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJICAgIGlmIChlbnQtPm9yaWcgIT0gTlVMTCkKCQl4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+b3JpZyk7CgkgICAgZWxzZQoJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5jb250ZW50KTsKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPlxuIik7CgkgICAgYnJlYWs7CgljYXNlIFhNTF9FWFRFUk5BTF9HRU5FUkFMX1BBUlNFRF9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICIpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ0hBUihidWYsIGVudC0+bmFtZSk7CgkgICAgaWYgKGVudC0+RXh0ZXJuYWxJRCAhPSBOVUxMKSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgUFVCTElDICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+RXh0ZXJuYWxJRCk7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfSBlbHNlIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBTWVNURU0gIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5TeXN0ZW1JRCk7CgkgICAgfQoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0VYVEVSTkFMX0dFTkVSQUxfVU5QQVJTRURfRU5USVRZOgoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI8IUVOVElUWSAiKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm5hbWUpOwoJICAgIGlmIChlbnQtPkV4dGVybmFsSUQgIT0gTlVMTCkgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFBVQkxJQyAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPkV4dGVybmFsSUQpOwoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0gZWxzZSB7CgkJIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgU1lTVEVNICIpOwoJCSB4bWxCdWZmZXJXcml0ZVF1b3RlZFN0cmluZyhidWYsIGVudC0+U3lzdGVtSUQpOwoJICAgIH0KCSAgICBpZiAoZW50LT5jb250ZW50ICE9IE5VTEwpIHsgLyogU2hvdWxkIGJlIHRydWUgISAqLwoJCXhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgTkRBVEEgIik7CgkJaWYgKGVudC0+b3JpZyAhPSBOVUxMKQoJCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm9yaWcpOwoJCWVsc2UKCQkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5jb250ZW50KTsKCSAgICB9CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIj5cbiIpOwoJICAgIGJyZWFrOwoJY2FzZSBYTUxfSU5URVJOQUxfUEFSQU1FVEVSX0VOVElUWToKCSAgICB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiPCFFTlRJVFkgJSAiKTsKCSAgICB4bWxCdWZmZXJXcml0ZUNIQVIoYnVmLCBlbnQtPm5hbWUpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICIgIik7CgkgICAgaWYgKGVudC0+b3JpZyA9PSBOVUxMKQoJCXhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5jb250ZW50KTsKCSAgICBlbHNlCgkJeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPm9yaWcpOwoJICAgIHhtbEJ1ZmZlcldyaXRlQ2hhcihidWYsICI+XG4iKTsKCSAgICBicmVhazsKCWNhc2UgWE1MX0VYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFk6CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIjwhRU5USVRZICUgIik7CgkgICAgeG1sQnVmZmVyV3JpdGVDSEFSKGJ1ZiwgZW50LT5uYW1lKTsKCSAgICBpZiAoZW50LT5FeHRlcm5hbElEICE9IE5VTEwpIHsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiBQVUJMSUMgIik7CgkJIHhtbEJ1ZmZlcldyaXRlUXVvdGVkU3RyaW5nKGJ1ZiwgZW50LT5FeHRlcm5hbElEKTsKCQkgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIiAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9IGVsc2UgewoJCSB4bWxCdWZmZXJXcml0ZUNoYXIoYnVmLCAiIFNZU1RFTSAiKTsKCQkgeG1sQnVmZmVyV3JpdGVRdW90ZWRTdHJpbmcoYnVmLCBlbnQtPlN5c3RlbUlEKTsKCSAgICB9CgkgICAgeG1sQnVmZmVyV3JpdGVDaGFyKGJ1ZiwgIj5cbiIpOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICB4bWxHZW5lcmljRXJyb3IoeG1sR2VuZXJpY0Vycm9yQ29udGV4dCwKCQkieG1sRHVtcEVudGl0aWVzVGFibGU6IGludGVybmFsOiB1bmtub3duIHR5cGUgJWRcbiIsCgkJICAgIGVudC0+ZXR5cGUpOwogICAgfQp9CgovKioKICogeG1sRHVtcEVudGl0aWVzVGFibGU6CiAqIEBidWY6ICBBbiBYTUwgYnVmZmVyLgogKiBAdGFibGU6ICBBbiBlbnRpdHkgdGFibGUKICoKICogVGhpcyB3aWxsIGR1bXAgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGl0eSB0YWJsZSBhcyBhbiBYTUwgRFREIGRlZmluaXRpb24KICovCnZvaWQKeG1sRHVtcEVudGl0aWVzVGFibGUoeG1sQnVmZmVyUHRyIGJ1ZiwgeG1sRW50aXRpZXNUYWJsZVB0ciB0YWJsZSkgewogICAgeG1sSGFzaFNjYW4odGFibGUsICh4bWxIYXNoU2Nhbm5lcil4bWxEdW1wRW50aXR5RGVjbCwgYnVmKTsKfQo=