LyotCiAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MwogKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQogKiBEYXZpZCBIaXR6IG9mIEF1c3BleCBTeXN0ZW1zLCBJbmMuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQogKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CiAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCiAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiAvKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICAqLwoKLyoKICogbG9vayAtLSBmaW5kIGxpbmVzIGluIGEgc29ydGVkIGxpc3QuCiAqCiAqIFRoZSBtYW4gcGFnZSBzYWlkIHRoYXQgVEFCcyBhbmQgU1BBQ0VzIHBhcnRpY2lwYXRlIGluIC1kIGNvbXBhcmlzb25zLgogKiBJbiBmYWN0LCB0aGV5IHdlcmUgaWdub3JlZC4gIFRoaXMgaW1wbGVtZW50cyBoaXN0b3JpYyBwcmFjdGljZSwgbm90CiAqIHRoZSBtYW51YWwgcGFnZS4KICovCgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvbW1hbi5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlICJwYXRobmFtZXMuaCIKI2luY2x1ZGUgIm5scy5oIgoKI2RlZmluZQlFUVVBTAkJMAojZGVmaW5lCUdSRUFURVIJCTEKI2RlZmluZQlMRVNTCQkoLTEpCgppbnQgZGZsYWcsIGZmbGFnOwovKiB1Z2xpZmllZCB0aGUgc291cmNlIGEgYml0IHdpdGggZ2xvYmFscywgc28gdGhhdCB3ZSBvbmx5IG5lZWQKICAgdG8gYWxsb2NhdGUgY29tcGFyYnVmIG9uY2UgKi8KaW50IHN0cmluZ2xlbjsKY2hhciAqc3RyaW5nOwpjaGFyICpjb21wYXJidWY7CgpzdGF0aWMgY2hhciAqYmluYXJ5X3NlYXJjaCAoY2hhciAqLCBjaGFyICopOwpzdGF0aWMgaW50IGNvbXBhcmUgKGNoYXIgKiwgY2hhciAqKTsKc3RhdGljIHZvaWQgZXJyIChjb25zdCBjaGFyICpmbXQsIC4uLik7CnN0YXRpYyBjaGFyICpsaW5lYXJfc2VhcmNoIChjaGFyICosIGNoYXIgKik7CnN0YXRpYyBpbnQgbG9vayAoY2hhciAqLCBjaGFyICopOwpzdGF0aWMgdm9pZCBwcmludF9mcm9tIChjaGFyICosIGNoYXIgKik7CnN0YXRpYyB2b2lkIHVzYWdlICh2b2lkKTsKCmludAptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCXN0cnVjdCBzdGF0IHNiOwoJaW50IGNoLCBmZCwgdGVybWNoYXI7CgljaGFyICpiYWNrLCAqZmlsZSwgKmZyb250LCAqcDsKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7CgliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwoJdGV4dGRvbWFpbihQQUNLQUdFKTsKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7CgoJZmlsZSA9IF9QQVRIX1dPUkRTOwoJdGVybWNoYXIgPSAnXDAnOwoJc3RyaW5nID0gTlVMTDsJCS8qIGp1c3QgZm9yIGdjYyAqLwoKCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImFkZnQ6IikpICE9IC0xKQoJCXN3aXRjaChjaCkgewoJCWNhc2UgJ2EnOgogICAJCSAgICAgICAgZmlsZSA9IF9QQVRIX1dPUkRTX0FMVDsKCQkgICAgICAgIGJyZWFrOwoJCWNhc2UgJ2QnOgoJCQlkZmxhZyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ2YnOgoJCQlmZmxhZyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3QnOgoJCQl0ZXJtY2hhciA9ICpvcHRhcmc7CgkJCWJyZWFrOwoJCWNhc2UgJz8nOgoJCWRlZmF1bHQ6CgkJCXVzYWdlKCk7CgkJfQoJYXJnYyAtPSBvcHRpbmQ7Cglhcmd2ICs9IG9wdGluZDsKCglzd2l0Y2ggKGFyZ2MpIHsKCWNhc2UgMjoJCQkJLyogRG9uJ3Qgc2V0IC1kZiBmb3IgdXNlci4gKi8KCQlzdHJpbmcgPSAqYXJndisrOwoJCWZpbGUgPSAqYXJndjsKCQlicmVhazsKCWNhc2UgMToJCQkJLyogQnV0IHNldCAtZGYgYnkgZGVmYXVsdC4gKi8KCQlkZmxhZyA9IGZmbGFnID0gMTsKCQlzdHJpbmcgPSAqYXJndjsKCQlicmVhazsKCWRlZmF1bHQ6CgkJdXNhZ2UoKTsKCX0KCglpZiAodGVybWNoYXIgIT0gJ1wwJyAmJiAocCA9IHN0cmNocihzdHJpbmcsIHRlcm1jaGFyKSkgIT0gTlVMTCkKCQkqKytwID0gJ1wwJzsKCglpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSwgMCkpIDwgMCB8fCBmc3RhdChmZCwgJnNiKSkKCQllcnIoIiVzOiAlcyIsIGZpbGUsIHN0cmVycm9yKGVycm5vKSk7Cglmcm9udCA9IG1tYXAoTlVMTCwgKHNpemVfdCkgc2Iuc3Rfc2l6ZSwgUFJPVF9SRUFELAojaWZkZWYgTUFQX0ZJTEUKCQkgICAgIE1BUF9GSUxFIHwKI2VuZGlmCgkJICAgICBNQVBfU0hBUkVELCBmZCwgKG9mZl90KSAwKTsKCWlmCiNpZmRlZiBNQVBfRkFJTEVECgkgICAoZnJvbnQgPT0gTUFQX0ZBSUxFRCkKI2Vsc2UKCSAgICgodm9pZCAqKShmcm9udCkgPD0gKHZvaWQgKikwKQojZW5kaWYKCQllcnIoIiVzOiAlcyIsIGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CgojaWYgMAoJLyogd29ya2Fyb3VuZCBmb3IgbW1hcCBwcm9ibGVtIChybWlsbGVyQGR1c2tnbG93LmNvbSkgKi8KCWlmIChmcm9udCA9PSAodm9pZCAqKTApCgkJcmV0dXJuIDE7CiNlbmRpZgoKCWJhY2sgPSBmcm9udCArIHNiLnN0X3NpemU7CglyZXR1cm4gbG9vayhmcm9udCwgYmFjayk7Cn0KCmludApsb29rKGNoYXIgKmZyb250LCBjaGFyICpiYWNrKQp7CglpbnQgY2g7CgljaGFyICpyZWFkcCwgKndyaXRlcDsKCgkvKiBSZWZvcm1hdCBzdHJpbmcgc3RyaW5nIHRvIGF2b2lkIGRvaW5nIGl0IG11bHRpcGxlIHRpbWVzIGxhdGVyLiAqLwoJaWYgKGRmbGFnKSB7CgkJZm9yIChyZWFkcCA9IHdyaXRlcCA9IHN0cmluZzsgKGNoID0gKnJlYWRwKyspICE9IDA7KSB7CgkJCWlmIChpc2FsbnVtKGNoKSkKCQkJCSood3JpdGVwKyspID0gY2g7CgkJfQoJCSp3cml0ZXAgPSAnXDAnOwoJCXN0cmluZ2xlbiA9IHdyaXRlcCAtIHN0cmluZzsKCX0gZWxzZQoJCXN0cmluZ2xlbiA9IHN0cmxlbihzdHJpbmcpOwoKCWNvbXBhcmJ1ZiA9IG1hbGxvYyhzdHJpbmdsZW4rMSk7CglpZiAoY29tcGFyYnVmID09IE5VTEwpCgkJZXJyKF8oIk91dCBvZiBtZW1vcnkiKSk7CgoJZnJvbnQgPSBiaW5hcnlfc2VhcmNoKGZyb250LCBiYWNrKTsKCWZyb250ID0gbGluZWFyX3NlYXJjaChmcm9udCwgYmFjayk7CgoJaWYgKGZyb250KQoJCXByaW50X2Zyb20oZnJvbnQsIGJhY2spOwoJcmV0dXJuIChmcm9udCA/IDAgOiAxKTsKfQoKCi8qCiAqIEJpbmFyeSBzZWFyY2ggZm9yICJzdHJpbmciIGluIG1lbW9yeSBiZXR3ZWVuICJmcm9udCIgYW5kICJiYWNrIi4KICoKICogVGhpcyByb3V0aW5lIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgbGluZSBhdAogKiAqb3IgYmVmb3JlKiB0aGUgZmlyc3Qgd29yZCBtYXRjaGluZyAic3RyaW5nIi4gIFJlbGF4aW5nIHRoZSBjb25zdHJhaW50CiAqIHRoaXMgd2F5IHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobS4KICoKICogSW52YXJpYW50czoKICogCWZyb250IHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBhdCBvciBiZWZvcmUgdGhlIGZpcnN0CiAqCW1hdGNoaW5nIHN0cmluZy4KICoKICogCWJhY2sgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGF0IG9yIGFmdGVyIHRoZSBmaXJzdAogKgltYXRjaGluZyBsaW5lLgogKgogKiBBZHZhbmNpbmcgdGhlIEludmFyaWFudHM6CiAqCiAqIAlwID0gZmlyc3QgbmV3bGluZSBhZnRlciBoYWxmd2F5IHBvaW50IGZyb20gZnJvbnQgdG8gYmFjay4KICoKICogCUlmIHRoZSBzdHJpbmcgYXQgInAiIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIHN0cmluZyB0byBtYXRjaCwKICoJcCBpcyB0aGUgbmV3IGZyb250LiAgT3RoZXJ3aXNlIGl0IGlzIHRoZSBuZXcgYmFjay4KICoKICogVGVybWluYXRpb246CiAqCiAqIAlUaGUgZGVmaW5pdGlvbiBvZiB0aGUgcm91dGluZSBhbGxvd3MgaXQgcmV0dXJuIGF0IGFueSBwb2ludCwKICoJc2luY2UgZnJvbnQgaXMgYWx3YXlzIGF0IG9yIGJlZm9yZSB0aGUgbGluZSB0byBwcmludC4KICoKICogCUluIGZhY3QsIGl0IHJldHVybnMgd2hlbiB0aGUgY2hvc2VuICJwIiBlcXVhbHMgImJhY2siLiAgVGhpcwogKglpbXBsaWVzIHRoYXQgdGhlcmUgZXhpc3RzIGEgc3RyaW5nIGlzIGxlYXN0IGhhbGYgYXMgbG9uZyBhcwogKgkoYmFjayAtIGZyb250KSwgd2hpY2ggaW4gdHVybiBpbXBsaWVzIHRoYXQgYSBsaW5lYXIgc2VhcmNoIHdpbGwKICoJYmUgbm8gbW9yZSBleHBlbnNpdmUgdGhhbiB0aGUgY29zdCBvZiBzaW1wbHkgcHJpbnRpbmcgYSBzdHJpbmcgb3IgdHdvLgogKgogKiAJVHJ5aW5nIHRvIGNvbnRpbnVlIHdpdGggYmluYXJ5IHNlYXJjaCBhdCB0aGlzIHBvaW50IHdvdWxkIGJlCiAqCW1vcmUgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguCiAqLwojZGVmaW5lCVNLSVBfUEFTVF9ORVdMSU5FKHAsIGJhY2spIFwKCXdoaWxlIChwIDwgYmFjayAmJiAqcCsrICE9ICdcbicpOwoKY2hhciAqCmJpbmFyeV9zZWFyY2goY2hhciAqZnJvbnQsIGNoYXIgKmJhY2spCnsKCWNoYXIgKnA7CgoJcCA9IGZyb250ICsgKGJhY2sgLSBmcm9udCkgLyAyOwoJU0tJUF9QQVNUX05FV0xJTkUocCwgYmFjayk7CgoJLyoKCSAqIElmIHRoZSBmaWxlIGNoYW5nZXMgdW5kZXJuZWF0aCB1cywgbWFrZSBzdXJlIHdlIGRvbid0CgkgKiBpbmZpbml0ZWx5IGxvb3AuCgkgKi8KCXdoaWxlIChwIDwgYmFjayAmJiBiYWNrID4gZnJvbnQpIHsKCQlpZiAoY29tcGFyZShwLCBiYWNrKSA9PSBHUkVBVEVSKQoJCQlmcm9udCA9IHA7CgkJZWxzZQoJCQliYWNrID0gcDsKCQlwID0gZnJvbnQgKyAoYmFjayAtIGZyb250KSAvIDI7CgkJU0tJUF9QQVNUX05FV0xJTkUocCwgYmFjayk7Cgl9CglyZXR1cm4gKGZyb250KTsKfQoKLyoKICogRmluZCB0aGUgZmlyc3QgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIHN0cmluZywgbGluZWFybHkgc2VhcmNoaW5nIGZyb20gZnJvbnQKICogdG8gYmFjay4KICoKICogUmV0dXJuIE5VTEwgZm9yIG5vIHN1Y2ggbGluZS4KICoKICogVGhpcyByb3V0aW5lIGFzc3VtZXM6CiAqCiAqIAlvIGZyb250IHBvaW50cyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIGEgbGluZS4KICoJbyBmcm9udCBpcyBiZWZvcmUgb3IgYXQgdGhlIGZpcnN0IGxpbmUgdG8gYmUgcHJpbnRlZC4KICovCmNoYXIgKgpsaW5lYXJfc2VhcmNoKGNoYXIgKmZyb250LCBjaGFyICpiYWNrKQp7Cgl3aGlsZSAoZnJvbnQgPCBiYWNrKSB7CgkJc3dpdGNoIChjb21wYXJlKGZyb250LCBiYWNrKSkgewoJCWNhc2UgRVFVQUw6CQkvKiBGb3VuZCBpdC4gKi8KCQkJcmV0dXJuIChmcm9udCk7CgkJCWJyZWFrOwoJCWNhc2UgTEVTUzoJCS8qIE5vIHN1Y2ggc3RyaW5nLiAqLwoJCQlyZXR1cm4gKE5VTEwpOwoJCQlicmVhazsKCQljYXNlIEdSRUFURVI6CQkvKiBLZWVwIGdvaW5nLiAqLwoJCQlicmVhazsKCQl9CgkJU0tJUF9QQVNUX05FV0xJTkUoZnJvbnQsIGJhY2spOwoJfQoJcmV0dXJuIChOVUxMKTsKfQoKLyoKICogUHJpbnQgYXMgbWFueSBsaW5lcyBhcyBtYXRjaCBzdHJpbmcsIHN0YXJ0aW5nIGF0IGZyb250LgogKi8Kdm9pZApwcmludF9mcm9tKGNoYXIgKmZyb250LCBjaGFyICpiYWNrKQp7CglpbnQgZW9sOwoKCXdoaWxlIChmcm9udCA8IGJhY2sgJiYgY29tcGFyZShmcm9udCwgYmFjaykgPT0gRVFVQUwpIHsKCQlpZiAoY29tcGFyZShmcm9udCwgYmFjaykgPT0gRVFVQUwpIHsKCQkJZW9sID0gMDsKCQkJd2hpbGUgKGZyb250IDwgYmFjayAmJiAhZW9sKSB7CgkJCQlpZiAocHV0Y2hhcigqZnJvbnQpID09IEVPRikKCQkJCQllcnIoInN0ZG91dDogJXMiLCBzdHJlcnJvcihlcnJubykpOwoJCQkJaWYgKCpmcm9udCsrID09ICdcbicpCgkJCQkJZW9sID0gMTsKCQkJfQoJCX0gZWxzZQoJCQlTS0lQX1BBU1RfTkVXTElORShmcm9udCwgYmFjayk7Cgl9Cn0KCi8qCiAqIFJldHVybiBMRVNTLCBHUkVBVEVSLCBvciBFUVVBTCBkZXBlbmRpbmcgb24gaG93ICBzdHJpbmcgIGNvbXBhcmVzIHdpdGgKICogc3RyaW5nMiAoczEgPz8/IHMyKS4KICoKICogCW8gTWF0Y2hlcyB1cCB0byBsZW4oczEpIGFyZSBFUVVBTC4KICoJbyBNYXRjaGVzIHVwIHRvIGxlbihzMikgYXJlIEdSRUFURVIuCiAqCiAqIENvbXBhcmUgdW5kZXJzdGFuZHMgYWJvdXQgdGhlIC1mIGFuZCAtZCBmbGFncywgYW5kIHRyZWF0cyBjb21wYXJpc29ucwogKiBhcHByb3ByaWF0ZWx5LgogKgogKiBUaGUgc3RyaW5nICJzdHJpbmciIGlzIG51bGwgdGVybWluYXRlZC4gIFRoZSBzdHJpbmcgInMyIiBpcyAnXG4nIHRlcm1pbmF0ZWQKICogKG9yICJzMmVuZCIgdGVybWluYXRlZCkuCiAqCiAqIFdlIHVzZSBzdHJjYXNlY21wIGV0Yywgc2luY2UgaXQga25vd3MgaG93IHRvIGlnbm9yZSBjYXNlIGFsc28KICogaW4gb3RoZXIgbG9jYWxlcy4KICovCmludApjb21wYXJlKGNoYXIgKnMyLCBjaGFyICpzMmVuZCkgewoJaW50IGk7CgljaGFyICpwOwoKCS8qIGNvcHksIGlnbm9yaW5nIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkICovCglwID0gY29tcGFyYnVmOwoJaSA9IHN0cmluZ2xlbjsKCXdoaWxlKHMyIDwgczJlbmQgJiYgKnMyICE9ICdcbicgJiYgaSkgewoJCWlmICghZGZsYWcgfHwgaXNhbG51bSgqczIpKQoJCXsKCQkJKnArKyA9ICpzMjsKCQkJaS0tOwoJCX0KCQlzMisrOwoJfQoJKnAgPSAwOwoKCS8qIGFuZCBjb21wYXJlICovCglpZiAoZmZsYWcpCgkJaSA9IHN0cm5jYXNlY21wKGNvbXBhcmJ1Ziwgc3RyaW5nLCBzdHJpbmdsZW4pOwoJZWxzZQoJCWkgPSBzdHJuY21wKGNvbXBhcmJ1Ziwgc3RyaW5nLCBzdHJpbmdsZW4pOwoKCXJldHVybiAoKGkgPiAwKSA/IExFU1MgOiAoaSA8IDApID8gR1JFQVRFUiA6IEVRVUFMKTsKfQoKc3RhdGljIHZvaWQKdXNhZ2UoKQp7Cgkodm9pZClmcHJpbnRmKHN0ZGVyciwgXygidXNhZ2U6IGxvb2sgWy1kZmFdIFstdCBjaGFyXSBzdHJpbmcgW2ZpbGVdXG4iKSk7CglleGl0KDIpOwp9CgojaWYgX19TVERDX18KI2luY2x1ZGUgPHN0ZGFyZy5oPgojZWxzZQojaW5jbHVkZSA8dmFyYXJncy5oPgojZW5kaWYKCnZvaWQKI2lmIF9fU1REQ19fCmVycihjb25zdCBjaGFyICpmbXQsIC4uLikKI2Vsc2UKZXJyKGZtdCwgdmFfYWxpc3QpCgljaGFyICpmbXQ7Cgl2YV9kY2wKI2VuZGlmCnsKCXZhX2xpc3QgYXA7CiNpZiBfX1NURENfXwoJdmFfc3RhcnQoYXAsIGZtdCk7CiNlbHNlCgl2YV9zdGFydChhcCk7CiNlbmRpZgoJKHZvaWQpZnByaW50ZihzdGRlcnIsICJsb29rOiAiKTsKCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7Cgl2YV9lbmQoYXApOwoJKHZvaWQpZnByaW50ZihzdGRlcnIsICJcbiIpOwoJZXhpdCgyKTsKCS8qIE5PVFJFQUNIRUQgKi8KfQo=