From octave-sources-request at bevo dot che dot wisc dot edu Mon Sep 20 00:47:44 1999 Subject: Re: Median filtering From: Olli Saarela To: octave-sources at bevo dot che dot wisc dot edu Date: Mon, 20 Sep 1999 08:46:50 +0300 This is a multi-part message in MIME format. --------------48C59F411C6 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Sorry, I forgot the attachement... -- Olli Saarela KCL Development Oy Olli dot Saarela at kcl dot fi tel. +358-9-4371538 (office) Tekniikantie 2, Espoo-Otaniemi fax. +358-9-464305 P.O. Box 70, FIN-02151 Espoo, Finland --------------48C59F411C6 Content-Type: application/x-tar; name="medfilt1.tar" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="medfilt1.tar" bGlib2N0YXZlL01FREZJTFQxLmNjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA2NDQA MDAwMDM1MQAwMDAwMTU2ADAwMDAwMDIyMTIzADA2NzcwNDM1MTEzADAwMTQyNzUAMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMG9qcwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2NsZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAwMDAwMDAwADAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgoKQ29weXJpZ2h0IChDKSAxOTk5IE9sbGkg U2FhcmVsYQoKVGhpcyBmaWxlIGlzIG5vdCAoeWV0PykgcGFydCBvZiBPY3RhdmUuCgpPY3Rh dmUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeSBpdAp1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQpsYXRlciB2ZXJzaW9uLgoK T2N0YXZlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk IHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgpGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKZm9yIG1v cmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggT2N0YXZlOyBzZWUgdGhlIGZp bGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKU29mdHdhcmUgRm91bmRh dGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0x MzA3LCBVU0EuCgoqLwoKLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgb25lLWRpbWVuc2lvbmFs IG1lZGlhbiBmaWx0ZXJpbmcuIEEgZGF0YQovLyB3aW5kb3cgaXMgbW92ZWQgb3ZlciB0aGUg aW5wdXQgZGF0YSBzZXF1ZW5jZS4gVGhlIG1lZGlhbiB2YWx1ZSBvZgovLyB0aGUgZGF0YSB3 aXRoaW4gdGhlIHdpbmRvdyBpcyB0YWtlbiBhcyB0aGUgZmlsdGVyIG91dHB1dC4KLy8KLy8g QXMgZm9yIHRoZSBoYW5kbGluZyBvZiB0aGUgZWRnZSBlZmZlY3RzICh2YWx1ZXMgYmVmb3Jl IGFuZCBhZnRlcgovLyB0aGUgc2NvcGUgb2YgdGhlIGF2YWlsYWJsZSBkYXRhKSwgdGhlIHJl cGV0aXRpb24gb2YgdGhlIGZpcnN0IGFuZAovLyB0aGUgbGFzdCBkYXRhIHZhbHVlcyAoeCgx KSBhbmQgeChsZW5ndGgoeCkpIGFyZSBhc3N1bWVkLgovLwovLyBJbiBteSBvcGluaW9uIHJl cGVhdGluZyB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IHZhbHVlcyBpcyBhIGJldHRlcgovLyBj aG9pY2UgdGhhbiB1c2luZyB6ZXJvIHZhbHVlcywgd2hpY2ggc29tZWJvZHkgZWxzZSBtaWdo dCBwcmVmZXIuCi8vIE9uZSBtYXRoZW1hdGljYWwgcHJvcGVydHkgb2YgbWVkaWFuIGZpbHRl cmluZyBpcyB0aGF0IGl0IHBhc3NlcyBhCi8vIG1vbm90b25vdXMgcmFtcCB0aHJvdWdoIHVu dG91Y2hlZC4gIFRoZSBmb3JtZXIgY2hvaWNlIGlzCi8vIGNvbnNpc3RlbnQgd2l0aCB0aGlz IHByb3BlcnR5LgovLwovLyAgICAlIHgoMSkgYW5kIHgobGVuZ3RoKHgpKSBmb3IgZWRnZXMK Ly8gICAgbWVkZmlsdDEoMTo1LCAzKSAgICAgICAgCi8vICAgICAgICAgICAtLT4gWzEgMiAz IDQgNV0KLy8KLy8gICAgJSB6ZXJvcyBmb3IgZWRnZXMKLy8gICAgbWVkZmlsdDEoMTo1LCAz KQovLyAgICAgICAgICAgLS0+IFsxIDIgMyA0IDRdCi8vCi8vIEFueSBkZXNpcmVkIGVkZ2Ug aGFuZGxpbmcgY2FuIGJlIGVhc2lseSBpbXBsZW1lbnRlZCBpbiB3aXRoIGEKLy8gd3JhcHBl ciBpbiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlLgovLwovLyBUaGUgaW1wbGVtZW50YXRpb24g aXMgaW4gQysrIGZvciBleGVjdXRpb24gc3BlZWQuICBJZiBzb21lYm9keQovLyBjb21lcyB1 cCB3aXRoIGEgZmFzdCBzY3JpcHQgaW1wbGVtZW50YXRpb24sIGFsbCB0aGUgYmV0dGVyLiAg VGhlCi8vIGJlc3Qgc2NyaXB0IGltcGxlbWVudGF0aW9ucyBJIGhhdmUgY29tZSB1cCB3aXRo IGFyZSB2YXJpYXRpb25zIG9mCi8vIHRoZSB0aGVtZSAodGhpcyBkb2Vzbid0IHdvcmssIGJ1 dCB5b3UgZ2V0IHRoZSBpZGVhKToKLy8KLy8gICBpZHggPSAoLXdpbmRvd19sZW5ndGgvMik6 KHdpbmRvd19sZW5ndGgvMik7Ci8vICAgZm9yIGo9MTpsZW5ndGgoeCkKLy8gICAgICAgeShq KSA9IG1lZGlhbih4KGogKyBpZHgpKTsKLy8gICBlbmQ7Ci8vCi8vIHdoaWNoIGdlbmVyYXRl cyBhIGxvdCBvZiBvdmVyaGVhZC4KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlIDxj b25maWcuaD4KI2VuZGlmCgojaW5jbHVkZSAiTUVERklMVC5oIgojaW5jbHVkZSAibWFwcGVy cy5oIgoKCnR5cGVkZWYgaW50ICgqY29tcGFyZWZ1bikgKGNvbnN0IHZvaWQgKiwgY29uc3Qg dm9pZCAqKTsKCgpzdGF0aWMgaW50Cm1lZGZpbHRfY29tcGFyZSAoY29uc3QgZG91YmxlICp4 LCBjb25zdCBkb3VibGUgKnkpCnsKICAvLyBOYU4gdmFsdWVzIGFyZSBzb3J0ZWQgdG8gdGhl IGVuZCBvZiB0aGUgYXJyYXkuCiAgCiAgLy8gSW4gdHdvIG91dCBvZiB0aHJlZSBDKysgY29t cGlsZXJzIEkgaGF2ZSB1c2VkIHRoZXJlIGhhdmUgYmVlbgogIC8vIGNvbXBpbGVyIGJ1Z3Mg cmVsYXRlZCB0byBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucy4gIEZvciBleGFtcGxlLAog IC8vIGFueSBmbG9hdGluZyBwb2ludCBpbmVxdWFsaXR5ICg8ID4gPD0gPj0pIHdpdGggZWl0 aGVyIG9yIGJvdGgKICAvLyBvcGVyYW5kcyBOYU4gaXMgZGVmaW5lZCB0byBldmFsdWF0ZSB0 byBGQUxTRS4gIEhvd2V2ZXIsIHdpdGgKICAvLyBjZXJ0YWluIGNvbXBpbGVycywgYXJjaGl0 ZWN0dXJlcywgYW5kIG9wdGltaXNhdGlvbiBmbGFncywgc29tZQogIC8vIG9mIHRoZXNlIGNv bXBhcmlzb25zIGV2YWx1YXRlIHRvIFRSVUUuICBOb3Qga25vd2luZyBhbGwgdGhlCiAgLy8g ZW52aXJvbm1lbnRzIHdoZXJlIE9jdGF2ZSB3aWxsIGJlIGNvbXBpbGVkLCAgSSBwcmVmZXIg c2FmZXR5IG92ZXIKICAvLyBzcGVlZCwgYW5kIHRlc3QgZm9yIE5hTiB2YWx1ZXMgYmVmb3Jl IGFueSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zLgoKICBpZiAoeGlzbmFuICgqeCkpCiAgICBy ZXR1cm4geGlzbmFuICgqeSkgPyAwIDogMTsKICBpZiAoeGlzbmFuICgqeSkpCiAgICByZXR1 cm4gLTE7CgogIGlmICgqeCA+ICp5KQogICAgcmV0dXJuIDE7CiAgaWYgKCp5ID4gKngpCiAg ICByZXR1cm4gLTE7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKbWVkZmlsdF9jb21wYXJl IChjb25zdCBDb21wbGV4ICp4LCBjb25zdCBDb21wbGV4ICp5KQp7CiAgZG91YmxlIGFic3gg PSBzdGQ6OmFicyAoKngpOwogIGRvdWJsZSBhYnN5ID0gc3RkOjphYnMgKCp5KTsKICByZXR1 cm4gbWVkZmlsdF9jb21wYXJlICgmYWJzeCwgJmFic3kpOwp9CgpzdGF0aWMgaW5saW5lIGRv dWJsZSoKbWVkZmlsdF9zZWFyY2ggKGRvdWJsZSAqd2luZG93LCBjb25zdCBsb25nIHdsZW4s IGNvbnN0IGRvdWJsZSBvdXQpCnsKICAvLyBTZWxlY3QgdGhlIHByb3BlciBvdmVybG9hZC4K ICBpbnQgKCpmdW4pIChjb25zdCBkb3VibGUgKiwgY29uc3QgZG91YmxlICopID0gbWVkZmls dF9jb21wYXJlOwogIHJldHVybiAoZG91YmxlKikgYnNlYXJjaCAoJm91dCwgd2luZG93LCB3 bGVuLCBzaXplb2YgKGRvdWJsZSksIChjb21wYXJlZnVuKSBmdW4pOwp9CgpzdGF0aWMgaW5s aW5lIENvbXBsZXgqCm1lZGZpbHRfc2VhcmNoIChDb21wbGV4ICp3aW5kb3csIGNvbnN0IGxv bmcgd2xlbiwgY29uc3QgQ29tcGxleCBvdXQpCnsKICAvLyBhbWJpZ3VvdXMgc29ydCBvcmRl ciBmb3IgY29tcGxleCB2YWx1ZXMgCiAgLy8gLSBzb3J0aW5nIGJhc2VkIG9uIGFicygpCiAg Ly8gLSBubyBwcm9wZXIgaGFuZGxpbmcgZm9yICJzZW1pLU5hTiIgdmFsdWVzLCBlLmcuLCAo MyxOYU4pIHZzLiAoTmFOLDMpCiAgLy8gLS0tPiBwZXJmb3JtIGEgZnVsbCBzZWFyY2gKICBm b3IgKGxvbmcgaiA9IDA7IGogPCB3bGVuOyBqKyspCiAgICBpZiAoMCA9PSBtZW1jbXAgKCZv dXQsIHdpbmRvdyArIGosIHNpemVvZiAoQ29tcGxleCkpKQogICAgICByZXR1cm4gd2luZG93 ICsgajsKICByZXR1cm4gTlVMTDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0YXRpYyB2b2lk Cm1lZGZpbHRfdXBkYXRlX3NvcnRlZCAoVCAqd2luZG93LCBjb25zdCBsb25nIHdsZW4sIGNv bnN0IFQgb3V0LCBjb25zdCBUIGluKQp7CiAgVCAqaW5wLCAqb3V0cCwgKmVuZHA7CgogIG91 dHAgPSBtZWRmaWx0X3NlYXJjaCAod2luZG93LCB3bGVuLCBvdXQpOwogIGFzc2VydCAob3V0 cCAhPSBOVUxMKTsKICBpbnAgID0gb3V0cDsKCiAgc3dpdGNoIChtZWRmaWx0X2NvbXBhcmUg KCZpbiwgJm91dCkpCiAgICB7CiAgICBjYXNlIDA6IC8vIHJlcGxhY2UgaW4gcGxhY2UKICAg ICAgYnJlYWs7CgogICAgY2FzZSAxOiAvLyByZXBsYWNlIGFmdGVyCiAgICAgIGVuZHAgPSB3 aW5kb3cgKyB3bGVuOwogICAgICB3aGlsZSAoaW5wKzEgPCBlbmRwICYmIG1lZGZpbHRfY29t cGFyZSAoJmluLCBpbnArMSkgPT0gMSkKCXsKCSAgKmlucCA9ICooaW5wICsgMSk7CgkgIGlu cCsrOwoJfQogICAgICBicmVhazsKCiAgICBjYXNlIC0xOiAvLyByZXBsYWNlIGJlZm9yZQog ICAgICB3aGlsZSAoaW5wID4gd2luZG93ICYmIG1lZGZpbHRfY29tcGFyZSAoJmluLCBpbnAt MSkgPT0gLTEpCgl7CgkgICppbnAgPSAqKGlucCAtIDEpOwoJICBpbnAtLTsKCX0KCiAgICB9 CgogICppbnAgPSBpbjsKfQoKdGVtcGxhdGUgc3RhdGljIHZvaWQKbWVkZmlsdF91cGRhdGVf c29ydGVkIChkb3VibGUgKndpbmRvdywgY29uc3QgbG9uZyB3bGVuLCBjb25zdCBkb3VibGUg b3V0LCBjb25zdCBkb3VibGUgaW4pOwoKdGVtcGxhdGUgc3RhdGljIHZvaWQKbWVkZmlsdF91 cGRhdGVfc29ydGVkIChDb21wbGV4ICp3aW5kb3csIGNvbnN0IGxvbmcgd2xlbiwgY29uc3Qg Q29tcGxleCBvdXQsIGNvbnN0IENvbXBsZXggaW4pOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0 YXRpYyB2b2lkCm1lZGZpbHQxX2ZpbHRlciAoY29uc3QgVCAqaW5hcnIsIFQgKm91dGFyciwg Y29uc3QgbG9uZyBhcnJsZW4sIGNvbnN0IGxvbmcgd2xlbikKewogIGludCAgICAgb2RkID0g d2xlbiAlIDI7CiAgbG9uZyAgICBqLCB3bGVuMjEsIGluaiwgb3V0ajsKICBUICAgICAgICp3 aW5kb3cgPSBuZXcgVCBbd2xlbl07CiAgaW50ICgqZnVuKSAoY29uc3QgVCAqLCBjb25zdCBU ICopID0gbWVkZmlsdF9jb21wYXJlOyAvLyBTZWxlY3QgdGhlIHByb3BlciBvdmVybG9hZC4K CiAgaWYgKG9kZCkKICAgIHdsZW4yMSA9ICh3bGVuIC0gMSkgLyAyOyAvLyBvZGQKICBlbHNl CiAgICB3bGVuMjEgPSB3bGVuIC8gMjsgICAgICAgLy8gZXZlbgoKICAvLyB0cml2aWFsIGNh c2VzIChub3QgaGFuZGxlZCBwcm9wZXJseSBieSB0aGUgYWxnb3JpdGhtIGJlbG93KQogIGlm IChhcnJsZW4gPD0gMSB8fCB3bGVuIDw9IDEpCiAgICB7CiAgICAgIGZvciAoaiA9IDA7IGog PCBhcnJsZW47IGorKykKCW91dGFycltqXSA9IGluYXJyW2pdOwogICAgICByZXR1cm47CiAg ICB9CgogIC8vIGluaXRpYWxpc2UgdGhlIG1lZGlhbiB3aW5kb3cKICAvLyAtIGFzIHRoZSBl ZGdlIGNvbmRpdGlvbnMgKHZhbHVlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkYXRhIHNlcXVl bmNlCiAgLy8gICBhdmFpbGFibGUpLCBhc3N1bWUgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCB2 YWx1ZSBhdmFpbGFibGUgdG8gYmUKICAvLyAgIHJlcGVhdGVkCiAgaW5qID0gLXdsZW4yMS0x OwogIGZvciAoaiA9IDA7IGogPCB3bGVuOyBqKyspCiAgICB7CiAgICAgIGlmIChpbmogPCAw KQoJd2luZG93W2pdID0gaW5hcnJbMF07IC8vIHJlcGVhdCBmaXJzdCBkYXRhIHBvaW50CiAg ICAgIGVsc2UgaWYgKGluaiA+PSBhcnJsZW4pCgl3aW5kb3dbal0gPSBpbmFyclthcnJsZW4g LSAxXTsgLy8gcmVwZWF0IGxhc3QgZGF0YSBwb2ludAogICAgICBlbHNlCgl3aW5kb3dbal0g PSBpbmFycltpbmpdOwogICAgICBpbmorKzsKICAgIH0KICBxc29ydCAod2luZG93LCB3bGVu LCBzaXplb2YoVCksIChjb21wYXJlZnVuKSBmdW4pOwogIAogIC8vIGZpbHRlcmluZwogIGlm IChvZGQpCiAgICBpbmogPSB3bGVuMjE7IC8vIG9kZAogIGVsc2UKICAgIGluaiA9IHdsZW4y MS0xOyAvLyBldmVuCiAgb3V0aiA9IC13bGVuMjEtMTsKICBmb3IgKGogPSAwOyBqIDwgYXJy bGVuOyBqKyspCiAgICB7CiAgICAgIG1lZGZpbHRfdXBkYXRlX3NvcnRlZCh3aW5kb3csIHds ZW4sCgkJCSAgICAob3V0aiA8IDApICAgICAgPyBpbmFyclswXSAgIDogaW5hcnJbb3V0al0s CgkJCSAgICAoaW5qICA8IGFycmxlbikgPyBpbmFycltpbmpdIDogaW5hcnJbYXJybGVuIC0g MV0pOwogICAgICAvLyBhIE5hTiB2YWx1ZSBwb2xsdXRlcyB0aGUgb3V0cHV0CiAgICAgIGlm ICh4aXNuYW4gKHdpbmRvd1t3bGVuIC0gMV0pKSAvLyBOYU4gdmFsdWVzIHNvcnRlZCB0byB0 aGUgZW5kIG9mIHRoZSBtZWRpYW4gd2luZG93CglvdXRhcnJbal0gPSB3aW5kb3dbd2xlbiAt IDFdOwogICAgICBlbHNlIGlmIChvZGQpCglvdXRhcnJbal0gPSB3aW5kb3dbd2xlbjIxXTsK ICAgICAgZWxzZQoJb3V0YXJyW2pdID0gKHdpbmRvd1t3bGVuMjEgLSAxXSArIHdpbmRvd1t3 bGVuMjFdKSAvIDIuMDsKICAgICAgLy8KICAgICAgaW5qKys7CiAgICAgIG91dGorKzsKICAg IH0KICBkZWxldGUgW10gd2luZG93Owp9Cgp0ZW1wbGF0ZSBzdGF0aWMgdm9pZAptZWRmaWx0 MV9maWx0ZXIgKGNvbnN0IGRvdWJsZSAqaW5hcnIsIGRvdWJsZSAqb3V0YXJyLCBjb25zdCBs b25nIGFycmxlbiwgY29uc3QgbG9uZyB3bGVuKTsKCnRlbXBsYXRlIHN0YXRpYyB2b2lkCm1l ZGZpbHQxX2ZpbHRlciAoY29uc3QgQ29tcGxleCAqaW5hcnIsIENvbXBsZXggKm91dGFyciwg Y29uc3QgbG9uZyBhcnJsZW4sIGNvbnN0IGxvbmcgd2xlbik7Cgp0ZW1wbGF0ZSA8Y2xhc3Mg VHZlYywgY2xhc3MgVGVsZW0+CnN0YXRpYyBUdmVjCm1lZGZpbHQxX2ZpbHRlcl92ZWN0b3Ig KGNvbnN0IFR2ZWMgJngsIGNvbnN0IGxvbmcgd2xlbikKewogIGxvbmcgeGxlbiA9IHgubGVu Z3RoICgpOwogIFR2ZWMgeSAoeGxlbik7CgogIFRlbGVtICpweSA9IHkuZm9ydHJhbl92ZWMg KCk7CiAgY29uc3QgVGVsZW0gKnB4ID0geC5kYXRhICgpOwoKICBtZWRmaWx0MV9maWx0ZXIg KHB4LCBweSwgeGxlbiwgd2xlbik7CiAgcmV0dXJuIHk7Cn0KCnRlbXBsYXRlIHN0YXRpYyBD b2x1bW5WZWN0b3IKbWVkZmlsdDFfZmlsdGVyX3ZlY3RvcjxDb2x1bW5WZWN0b3IsIGRvdWJs ZT4gKGNvbnN0IENvbHVtblZlY3RvciAmeCwgY29uc3QgbG9uZyB3bGVuKTsKCnRlbXBsYXRl IHN0YXRpYyBSb3dWZWN0b3IKbWVkZmlsdDFfZmlsdGVyX3ZlY3RvcjxSb3dWZWN0b3IsIGRv dWJsZT4gKGNvbnN0IFJvd1ZlY3RvciAmeCwgY29uc3QgbG9uZyB3bGVuKTsKCnRlbXBsYXRl IHN0YXRpYyBDb21wbGV4Q29sdW1uVmVjdG9yCm1lZGZpbHQxX2ZpbHRlcl92ZWN0b3I8Q29t cGxleENvbHVtblZlY3RvciwgQ29tcGxleD4gKGNvbnN0IENvbXBsZXhDb2x1bW5WZWN0b3Ig JngsIGNvbnN0IGxvbmcgd2xlbik7Cgp0ZW1wbGF0ZSBzdGF0aWMgQ29tcGxleFJvd1ZlY3Rv cgptZWRmaWx0MV9maWx0ZXJfdmVjdG9yPENvbXBsZXhSb3dWZWN0b3IsIENvbXBsZXg+IChj b25zdCBDb21wbGV4Um93VmVjdG9yICZ4LCBjb25zdCBsb25nIHdsZW4pOwoKCnRlbXBsYXRl IDxjbGFzcyBUbWF0LCBjbGFzcyBUdmVjLCBjbGFzcyBUZWxlbT4Kc3RhdGljIFRtYXQKbWVk ZmlsdDFfZmlsdGVyX21hdHJpeCAoY29uc3QgVG1hdCAmeCwgY29uc3QgbG9uZyB3bGVuKQp7 CiAgbG9uZyBuciA9IHgucm93cyAoKTsKICBsb25nIG5jID0geC5jb2x1bW5zICgpOwogIFRt YXQgeSAobnIsIG5jKTsKCiAgaWYgKG5yID09IDEgfHwgbmMgPT0gMSkKICAgIHsKICAgICAg VGVsZW0gKnB5ID0geS5mb3J0cmFuX3ZlYyAoKTsKICAgICAgY29uc3QgVGVsZW0gKnB4ID0g eC5kYXRhICgpOwogICAgICAKICAgICAgbWVkZmlsdDFfZmlsdGVyIChweCwgcHksIG5yKm5j LCB3bGVuKTsKICAgIH0KCiAgZWxzZQogICAgewogICAgICBUdmVjICB5Y29sIChucik7CiAg ICAgIFRlbGVtICpweSA9IHkuZm9ydHJhbl92ZWMgKCk7CgogICAgICBmb3IgKGxvbmcgaiA9 IDA7IGogPCBuYzsgaisrKQoJewoJICBjb25zdCBUdmVjIHhjb2wgPSB4LmNvbHVtbiAoaik7 CgkgIGNvbnN0IFRlbGVtICpweCA9IHhjb2wuZGF0YSAoKTsKCgkgIG1lZGZpbHQxX2ZpbHRl ciAocHgsIHB5LCBuciwgd2xlbik7CgkgIHkuaW5zZXJ0ICh5Y29sLCAwLCBqKTsKCX0KICAg IH0KCiAgcmV0dXJuIHk7Cn0KCnRlbXBsYXRlIHN0YXRpYyBNYXRyaXgKbWVkZmlsdDFfZmls dGVyX21hdHJpeDxNYXRyaXgsIENvbHVtblZlY3RvciwgZG91YmxlPiAoY29uc3QgTWF0cml4 ICZ4LCBjb25zdCBsb25nIHdsZW4pOwoKdGVtcGxhdGUgc3RhdGljIENvbXBsZXhNYXRyaXgK bWVkZmlsdDFfZmlsdGVyX21hdHJpeDxDb21wbGV4TWF0cml4LCBDb21wbGV4Q29sdW1uVmVj dG9yLCBDb21wbGV4PiAoY29uc3QgQ29tcGxleE1hdHJpeCAmeCwKCQkJCQkJCQkgICAgIGNv bnN0IGxvbmcgd2xlbik7CgoKQ29sdW1uVmVjdG9yCk1FREZJTFQxOjpmaWx0ZXIgKGNvbnN0 IENvbHVtblZlY3RvciAmeCkgY29uc3QKewogIHJldHVybiBtZWRmaWx0MV9maWx0ZXJfdmVj dG9yPENvbHVtblZlY3RvciwgZG91YmxlPiAoeCwgd2xlbik7Cn0KClJvd1ZlY3RvcgpNRURG SUxUMTo6ZmlsdGVyIChjb25zdCBSb3dWZWN0b3IgJngpIGNvbnN0CnsKICByZXR1cm4gbWVk ZmlsdDFfZmlsdGVyX3ZlY3RvcjxSb3dWZWN0b3IsIGRvdWJsZT4gKHgsIHdsZW4pOwp9CgpD b21wbGV4Q29sdW1uVmVjdG9yCk1FREZJTFQxOjpmaWx0ZXIgKGNvbnN0IENvbXBsZXhDb2x1 bW5WZWN0b3IgJngpIGNvbnN0CnsKICByZXR1cm4gbWVkZmlsdDFfZmlsdGVyX3ZlY3RvcjxD b21wbGV4Q29sdW1uVmVjdG9yLCBDb21wbGV4PiAoeCwgd2xlbik7Cn0KCkNvbXBsZXhSb3dW ZWN0b3IKTUVERklMVDE6OmZpbHRlciAoY29uc3QgQ29tcGxleFJvd1ZlY3RvciAmeCkgY29u c3QKewogIHJldHVybiBtZWRmaWx0MV9maWx0ZXJfdmVjdG9yPENvbXBsZXhSb3dWZWN0b3Is IENvbXBsZXg+ICh4LCB3bGVuKTsKfQoKCgpNYXRyaXgKTUVERklMVDE6OmZpbHRlciAoY29u c3QgTWF0cml4ICZ4KSBjb25zdAp7CiAgcmV0dXJuIG1lZGZpbHQxX2ZpbHRlcl9tYXRyaXg8 TWF0cml4LCBDb2x1bW5WZWN0b3IsIGRvdWJsZT4gKHgsIHdsZW4pOwp9CgpDb21wbGV4TWF0 cml4IApNRURGSUxUMTo6ZmlsdGVyIChjb25zdCBDb21wbGV4TWF0cml4ICZ4KSBjb25zdAp7 CiAgcmV0dXJuIG1lZGZpbHQxX2ZpbHRlcl9tYXRyaXg8Q29tcGxleE1hdHJpeCwgQ29tcGxl eENvbHVtblZlY3RvciwgQ29tcGxleD4gKHgsIHdsZW4pOwp9CikgY29uc3QKewogIHJldHVy biBtZWRmaWx0MV9maWx0ZXJfdmVjdG9yPENvbXBsZXhDb2x1bW5WZWN0b3IsIENvbXBsZXg+ ICh4LCB3bGVuKTsKfQoKQ29tcGxleFJvd1ZlY3RvcgpNRURGSUxUMTo6ZmlsdGVyIChjb25z dCBDb21wbGV4Um93VmVjdG9yICZ4KSBjb25zdAp7CiAgcmV0dXJuIG1lZGZpbHQxX2ZpbHRl cl92ZWN0b3I8Q29tcGxleFJvd1ZlY3RvciwgQ29tcGxleD4gKHgsIHdsZW4pOwp9CgoKCk1h dHJpeApNRURGSUxUMTo6ZmlsdGVyIChjb25zdCBNYXRyaXggJngpIGNvbnN0CnsKICByZXR1 cm4gbWVkZmlsdDFfZmlsdGVyX21hdHJpeDxNYXRyaXgsIENvbHVtblZlY3RvciwgZG91Ymxl PiAoeCwgd2xlbik7Cn0KCkNvbXBsZXhNYXRyaXggCk1FREZJTFQxOjpmaWx0ZXIgKGNvbnN0 IENvbXBsZXhNYXRyaXggJngpIGNvbnN0CnsKICByZXR1cmxpYm9jdGF2ZS9NRURGSUxUMS5o AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNjQ0ADAwMDAzNTEAMDAwMDE1NgAwMDAw MDAwMzYwMQAwNjc3MDQzNTEzMQAwMDE0MTM3ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBvanMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAGtjbGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwMAAwMDAwMDAw AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAALyoKCkNvcHlyaWdodCAoQykgMTk5OSBPbGxpIFNhYXJlbGEKClRoaXMgZmlsZSBp cyBub3QgKHlldD8pIHBhcnQgb2YgT2N0YXZlLgoKT2N0YXZlIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlCkZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0 IHlvdXIgb3B0aW9uKSBhbnkKbGF0ZXIgdmVyc2lvbi4KCk9jdGF2ZSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVApBTlkg V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO VEFCSUxJVFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQphbG9uZyB3aXRoIE9jdGF2ZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3Qs IHdyaXRlIHRvIHRoZSBGcmVlClNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFj ZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgoKKi8KCiNpZiAh ZGVmaW5lZCAob2N0YXZlX01FREZJTFRfaCkKI2RlZmluZSBvY3RhdmVfTUVERklMVF9oIDEK CiNpbmNsdWRlICJkUm93VmVjdG9yLmgiCiNpbmNsdWRlICJkQ29sVmVjdG9yLmgiCiNpbmNs dWRlICJkTWF0cml4LmgiCiNpbmNsdWRlICJDUm93VmVjdG9yLmgiCiNpbmNsdWRlICJDQ29s VmVjdG9yLmgiCiNpbmNsdWRlICJDTWF0cml4LmgiCgpjbGFzcwpNRURGSUxUMQp7CnB1Ymxp YzoKCiAgTUVERklMVDEgKHZvaWQpCiAgICA6IHdsZW4gKDMpIHsgfQoKICBNRURGSUxUMSAo Y29uc3QgbG9uZyB3aW5kb3dfbGVuZ3RoKQogICAgOiB3bGVuICh3aW5kb3dfbGVuZ3RoKSB7 IH0KCiAgTUVERklMVDEgKGNvbnN0IE1FREZJTFQxJiBhKQogICAgOiB3bGVuIChhLndsZW4p IHsgfQoKICBNRURGSUxUMSYgb3BlcmF0b3IgPSAoY29uc3QgTUVERklMVDEmIGEpCiAgICB7 CiAgICAgIHdsZW4gPSBhLndsZW47CiAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgfk1F REZJTFQxICh2b2lkKSB7IH0KCiAgbG9uZyB3aW5kb3dfbGVuZ3RoICh2b2lkKSBjb25zdCB7 IHJldHVybiB3bGVuOyB9CgogIHZvaWQgc2V0X3dpbmRvd19sZW5ndGggKGNvbnN0IGxvbmcg bGVuKSB7IHdsZW4gPSBsZW47IH0KCiAgLy8gT25lLWRpbWVuc2lvbmFsIG1lZGlhbiBmaWx0 ZXJpbmcgZm9yIHZlY3RvcnMgYW5kIG1hdHJpY2VzLgogIC8vIElmIGEgbWF0cml4IGhhcyAo cm93cz4xICYmIGNvbHVtbnM+MSksIGVhY2ggY29sdW1uIGlzIGZpbHRlcmVkIHNlcGFyYXRl bHkuCgogIENvbHVtblZlY3RvciBmaWx0ZXIgKGNvbnN0IENvbHVtblZlY3RvciAmeCkgY29u c3Q7CgogIFJvd1ZlY3RvciBmaWx0ZXIgKGNvbnN0IFJvd1ZlY3RvciAmeCkgY29uc3Q7Cgog IENvbXBsZXhDb2x1bW5WZWN0b3IgZmlsdGVyIChjb25zdCBDb21wbGV4Q29sdW1uVmVjdG9y ICZ4KSBjb25zdDsKCiAgQ29tcGxleFJvd1ZlY3RvciBmaWx0ZXIgKGNvbnN0IENvbXBsZXhS b3dWZWN0b3IgJngpIGNvbnN0OwoKICBNYXRyaXggZmlsdGVyIChjb25zdCBNYXRyaXggJngp IGNvbnN0OwoKICBDb21wbGV4TWF0cml4IGZpbHRlciAoY29uc3QgQ29tcGxleE1hdHJpeCAm eCkgY29uc3Q7CgoKcHJvdGVjdGVkOgoKICBsb25nIHdsZW47IC8vIFRoZSBsZW5ndGggb2Yg dGhlIG1vdmluZyBtZWRpYW4gd2luZG93Lgp9OwoKI2VuZGlmCmVjdG9ycyBhbmQgbWF0cmlj ZXMuCiAgLy8gSWYgYSBtYXRyaXggaGFzIChyb3dzPjEgJiYgY29sdW1ucz4xKSwgZWFjaCBj b2x1bW4gaXMgZmlsdGVyZWQgc2VwYXJhdGVseS4KCiAgQ29sdW1uVmVjdG9yIGZpbHRlciAo Y29zcmMvbWVkZmlsdDEuY2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDY0 NAAwMDAwMzUxADAwMDAxNTYAMDAwMDAwMDYwMDAAMDY3NzA0MzE0NzcAMDAxMzQ2MQAwAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwb2pz AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrY2xkAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAADAwMDAwMDAAMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCgpDb3B5cmlnaHQgKEMpIDE5OTkgT2xs aSBTYWFyZWxhCgpUaGlzIGZpbGUgaXMgbm90ICh5ZXQ/KSBwYXJ0IG9mIE9jdGF2ZS4KCk9j dGF2ZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5IGl0CnVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CmxhdGVyIHZlcnNpb24u CgpPY3RhdmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwgYnV0IFdJVEhPVVQKQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp ZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCkZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpmb3Ig bW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCBPY3RhdmU7IHNlZSB0aGUg ZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQpTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTEx LTEzMDcsIFVTQS4KCiovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmln Lmg+CiNlbmRpZgoKI2luY2x1ZGUgIk1FREZJTFQuaCIKCiNpbmNsdWRlICJkZWZ1bi1kbGQu aCIKI2luY2x1ZGUgImVycm9yLmgiCiNpbmNsdWRlICJvY3Qtb2JqLmgiCiNpbmNsdWRlICJo ZWxwLmgiCiNpbmNsdWRlICJ1dGlscy5oIgojaW5jbHVkZSAibWFwcGVycy5oIgojaW5jbHVk ZSAiZ3JpcGVzLmgiCgpERUZVTl9ETEQgKG1lZGZpbHQxLCBhcmdzLCBuYXJnb3V0LAogICJt ZWRmaWx0MSAoWCwgTik6IE1lZGlhbiBmaWx0ZXJcblwKXG5cCklmIFggaXMgYSB2ZWN0b3Is IGl0IGlzIGZpbHRlcmVkIHdpdGggbW92aW5nIG1lZGlhbiBvZiBsZW5ndGggTi5cblwKSWYg WCBpcyBhIG1hdHJpeCwgZWFjaCBjb2x1bW4gaXMgZmlsdGVyZWQgc2VwYXJhdGVseS4gVGhl IHZhbHVlXG5cCnJldHVybmVkIGlzIHRoZSBzYW1lIHNpemUgYXMgWC4gIFRoZSBkZWZhdWx0 IHZhbHVlIGZvciBOIGlzIDMuXG5cClxuXApGb3IgdGhlIGVkZ2UgcG9pbnRzLCBjb25zdGFu dCB2YWx1ZXMgWCgxKSBhbmQgWChsZW5ndGgoWCkpIGFyZVxuXAphc3N1bWVkIGJlZm9yZSBh bmQgYWZ0ZXIgdGhlIHNjb3BlIG9mIFgsIGNvcnJlc3BvbmRpbmdseS5cblwKXG5cCkFuIG9w dGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlzIGFjY2VwdGVkIChhbmQgaWdub3JlZCkgZm9yXG4K Y29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucy5cbiIpCnsKICBNRURG SUxUMSAgICAgbWZpbHQ7CiAgb2N0YXZlX3ZhbHVlIHJldHZhbDsKCiAgaW50IG5hcmdpbiAg PSBhcmdzLmxlbmd0aCAoKTsKCiAgLy8gQWxsb3cgYSBkdW1teSB0aGlyZCBhcmd1bWVudCBm b3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUKICAvLyBtLWZpbGUgaW1wbGVtZW50YXRpb25z ICh3aGljaCB1c2UgdGhhdCBhcmd1bWVudCBmb3IKICAvLyBwZXJmb3JtYW5jZSB0dW5pbmcg YmV0d2VlbiB0aW1lIGFuZCBzcGFjZSkuCiAgaWYgKG5hcmdpbiA8IDEgfHwgbmFyZ2luID4g MyB8fCBuYXJnb3V0ID4gMSkKICAgIHsKICAgICAgcHJpbnRfdXNhZ2UgKCJtZWRmaWx0MSIp OwogICAgICByZXR1cm4gcmV0dmFsOwogICAgfQoKICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBm aWx0ZXIgd2luZG93LgogIGlmIChuYXJnaW4gPiAxKQogICAgewogICAgICBpZiAoICEoYXJn cygxKS5pc19yZWFsX3NjYWxhciAoKSkKCSAgIHx8IHhpc25hbihhcmdzKDEpLmRvdWJsZV92 YWx1ZSAoKSkKCSAgIHx8IGFyZ3MoMSkuZG91YmxlX3ZhbHVlICgpIDwgMSkKCXsKCSAgZXJy b3IgKCJtZWRmaWx0MTogdGhlIG1lZGlhbiB3aW5kb3cgbGVuZ3RoIG11c3QgYmUgPj0gMSIp OwoJICByZXR1cm4gcmV0dmFsOwoJfQogICAgICBlbHNlCgltZmlsdC5zZXRfd2luZG93X2xl bmd0aCAoTklOVCAoYXJncygxKS5kb3VibGVfdmFsdWUgKCkpKTsKICAgIH0KCiAgLy8gRGF0 YSB0byBiZSBmaWx0ZXJlZAogIGlmICghKGFyZ3MoMCkuaXNfbnVtZXJpY190eXBlICgpIHx8 IGFyZ3MoMCkuaXNfcmFuZ2UgKCkpKQogICAgewogICAgICBncmlwZV93cm9uZ190eXBlX2Fy ZyAoIm1lZGZpbHQxIiwgYXJncygwKSk7CiAgICB9CgogIGVsc2UgaWYgKGFyZ3MoMCkuaXNf c2NhbGFyX3R5cGUgKCkgfHwgYXJncygwKS5pc19lbXB0eSAoKSkKICAgIHsKICAgICAgcmV0 dmFsID0gYXJncygwKTsKICAgICAgcmV0dmFsLm1ha2VfdW5pcXVlICgpOwogICAgfQoKICBl bHNlIGlmIChhcmdzKDApLmlzX3JlYWxfdHlwZSAoKSkKICAgIHsKICAgICAgTWF0cml4IHgg PSBhcmdzKDApLm1hdHJpeF92YWx1ZSAoKTsKICAgICAgaWYgKGVycm9yX3N0YXRlKQoJZXJy b3IgKCJtZWRmaWx0MTogdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2ZWN0b3Igb3Ig YSBtYXRyaXgiKTsKICAgICAgZWxzZQoJcmV0dmFsID0gbWZpbHQuZmlsdGVyICh4KTsKICAg IH0KCiAgZWxzZSBpZiAoYXJncygwKS5pc19jb21wbGV4X3R5cGUgKCkpCiAgICB7CiAgICAg IENvbXBsZXhNYXRyaXggeCA9IGFyZ3MoMCkuY29tcGxleF9tYXRyaXhfdmFsdWUgKCk7CiAg ICAgIGlmIChlcnJvcl9zdGF0ZSkKCWVycm9yICgibWVkZmlsdDE6IHRoZSBmaXJzdCBhcmd1 bWVudCBtdXN0IGJlIGEgdmVjdG9yIG9yIGEgbWF0cml4Iik7CiAgICAgIGVsc2UKCXJldHZh bCA9IG1maWx0LmZpbHRlciAoeCk7CiAgICB9CgogIGVsc2UKICAgIHsKICAgICAgZ3JpcGVf d3JvbmdfdHlwZV9hcmcgKCJtZWRmaWx0MSIsIGFyZ3MoMCkpOwogICAgfQoKICByZXR1cm4g cmV0dmFsOwp9CgoKLyoKOzs7IExvY2FsIFZhcmlhYmxlczogKioqCjs7OyBtb2RlOiBDKysg KioqCjs7OyBFbmQ6ICoqKgoqLyAgCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAB1dGFyciwgY29uc3QgbG9uZyBhcnJsZW4sIGNvbnN0IGxv bmcgd2xlbik7Cgp0ZW1wbGF0ZSBzdGF0aWMgdm9pZAptZWRmaWx0MV9maWx0ZXIgKGNvbnN0 IENvbXBsZXggKmluYXJyLCBDb21wbGV4ICpvdXRhcnIsIGNvbnN0IGxvbmcgYXJybGVuLCBj b25zdCBsb25nIHdsZW4pOwoKdGVtcGxhdGUgPGNsYXNzIFR2ZWMsIGNsYXNzIFRlbGVtPgpz dGF0aWMgVHZlYwptZWRmaWx0MV9maWx0ZXJfdmVjdG9yIChjb25zdCBUdmVjICZ4LCBjb25z dCBsb25nIHdsZW4pCnsKICBsb25nIHhsZW4gPSB4Lmxlbmd0aCAoKTsKICBUdmVjIHkgKHhs ZW4pOwoKICBUZWxlbSAqcHkgPSB5LmZvcnRyYW5fdmVjICgpOwogIGNvbnN0IFRlbGVtICpw eCA9IHguZGF0YSAoKTsKCiAgbWVkZmlsdDFfZmlsdGVyIChweCwgcHksIHhsZW4sIHdsZW4p OwogIHJldHVybiB5Owp9Cgp0ZW1wbGF0ZSBzdGF0aWMgQ29sdW1uVmVjdG9yCm1lZGZpbHQx X2ZpbHRlcl92ZWN0b3I8Q29sdW1uVmVjdG9yLCBkb3VibGU+IChjb25zdCBDb2x1bW5WZWN0 b3IgJngsIGNvbnN0IGxvbmcgd2xlbik7Cgp0ZW1wbGF0ZSBzdGF0aWMgUm93VmVjdG9yCm1l ZGZpbHQxX2ZpbHRlcl92ZWN0b3I8Um93VmVjdG9yLCBkb3VibGU+IChjb25zdCBSb3dWZWN0 b3IgJngsIGNvbnN0IGxvbmcgd2xlbik7Cgp0ZW1wbGF0ZSBzdGF0aWMgQ29tcGxleENvbHVt blZlY3RvcgptZWRmaWx0MV9maWx0ZXJfdmVjdG9yPENvbXBsZXhDb2x1bW5WZWN0b3IsIENv bXBsZXg+IChjb25zdCBDb21wbGV4Q29sdW1uVmVjdG9yICZ4LCBjb25zdCBsb25nIHdsZW4p OwoKdGVtcGxhdGUgc3RhdGljIENvbXBsZXhSb3dWZWN0b3IKbWVkZmlsdDFfZmlsdGVyX3Zl Y3RvcjxDb21wbGV4Um93VmVjdG9yLCBDb21wbGV4PiAoY29uc3QgQ29tcGxleFJvd1ZlY3Rv ciAmeCwgY29uc3QgbG9uZyB3bGVuKTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgVG1hdCwgY2xhc3Mg VHZlYywgY2xhc3MgVGVsZW0+CnN0YXRpYyBUbWF0Cm1lZGZpbHQxX2ZpbHRlcl9tYXRyaXgg KGNvbnN0IFRtYXQgJngsIGNvbnN0IGxvbmcgd2xlbikKewogIGxvbmcgbnIgPSB4LnJvd3Mg KCk7CiAgbG9uZyBuYyA9IHguY29sdW1ucyAoKTsKICBUbWF0IHkgKG5yLCBuYyk7CgogIGlm IChuciA9PSAxIHx8IG5jID09IDEpCiAgICB7CiAgICAgIFRlbGVtICpweSA9IHkuZm9ydHJh bl92ZWMgKCk7CiAgICAgIGNvbnN0IFRlbGVtICpweCA9IHguZGF0YSAoKTsKICAgICAgCiAg ICAgIG1lZGZpbHQxX2ZpbHRlciAocHgsIHB5LCBucipuYywgd2xlbik7CiAgICB9CgogIGVs c2UKICAgIHsKICAgICAgVHZlYyAgeWNvbCAobnIpOwogICAgICBUZWxlbSAqcHkgPSB5LmZv cnRyYW5fdmVjICgpOwoKICAgICAgZm9yIChsb25nIGogPSAwOyBqIDwgbmM7IGorKykKCXsK CSAgY29uc3QgVHZlYyB4Y29sID0geC5jb2x1bW4gKGopOwoJICBjb25zdCBUZWxlbSAqcHgg PSB4Y29sLmRhdGEgKCk7CgoJICBtZWRmaWx0MV9maWx0ZXIgKHB4LCBweSwgbnIsIHdsZW4p OwoJICB5Lmluc2VydCAoeWNvbCwgMCwgaik7Cgl9CiAgICB9CgogIHJldHVybiB5Owp9Cgp0 ZW1wbGF0ZSBzdGF0aWMgTWF0cml4Cm1lZGZpbHQxX2ZpbHRlcl9tYXRyaXg8TWF0cml4LCBD b2x1bW5WZWN0b3IsIGRvdWJsZT4gKGNvbnN0IE1hdHJpeCAmeCwgY29uc3QgbG9uZyB3bGVu KTsKCnRlbXBsYXRlIHN0YXRpYyBDb21wbGV4TWF0cml4Cm1lZGZpbHQxX2ZpbHRlcl9tYXRy aXg8Q29tcGxleE1hdHJpeCwgQ29tcGxleENvbHVtblZlY3RvciwgQ29tcGxleD4gKGNvbnN0 IENvbXBsZXhNYXRyaXggJngsCgkJCQkJCQkJICAgICBjb25zdCBsb25nIHdsZW4pOwoKCkNv bHVtblZlY3RvcgpNRURGSUxUMTo6ZmlsdGVyIChjb25zdCBDb2x1bW5WZWN0b3IgJngpIGNv bnN0CnsKICByZXR1cm4gbWVkZmlsdDFfZmlsdGVyX3ZlY3RvcjxDb2x1bW5WZWN0b3IsIGRv dWJsZT4gKHgsIHdsZW4pOwp9CgpSb3dWZWN0b3IKTUVERklMVDE6OmZpbHRlciAoY29uc3Qg Um93VmVjdG9yICZ4KSBjb25zdAp7CiAgcmV0dXJuIG1lZGZpbHQxX2ZpbHRlcl92ZWN0b3I8 Um93VmVjdG9yLCBkb3VibGU+ICh4LCB3bGVuKTsKfQoKQ29tcGxleENvbHVtblZlY3RvcgpN RURGSUxUMTo6ZmlsdGVyIChjb25zdCBDb21wbGV4Q29sdW1uVmVjdG9yICZ4KSBjb25zdAp7 CiAgcmV0dXJuIG1lZGZpbHQxX2ZpbHRlcl92ZWN0b3I8Q29tcGxleENvbHVtblZlY3Rvciwg Q29tcGxleD4gKHgsIHdsZW4pOwp9CgpDb21wbGV4Um93VmVjdG9yCk1FREZJTFQxOjpmaWx0 ZXIgKGNvbnN0IENvbXBsZXhSb3dWZWN0b3IgJngpIGNvbnN0CnsKICByZXR1cm4gbWVkZmls dDFfZmlsdGVyX3ZlY3RvcjxDb21wbGV4Um93VmVjdG9yLCBDb21wbGV4PiAoeCwgd2xlbik7 Cn0KCgoKTWF0cml4Ck1FREZJTFQxOjpmaWx0ZXIgKGNvbnN0IE1hdHJpeCAmeCkgY29uc3QK ewogIHJldHVybiBtZWRmaWx0MV9maWx0ZXJfbWF0cml4PE1hdHJpeCwgQ29sdW1uVmVjdG9y LCBkb3VibGU+ICh4LCB3bGVuKTsKfQoKQ29tcGxleE1hdHJpeCAKTUVERklMVDE6OmZpbHRl ciAoY29uc3QgQ29tcGxleE1hdHJpeCAmeCkgY29uc3QKewogIHJldHVybiBtZWRmaWx0MV9m aWx0ZXJfbWF0cml4PENvbXBsZXhNYXRyaXgsIENvbXBsZXhDb2x1bW5WZWN0b3IsIENvbXBs ZXg+ICh4LCB3bGVuKTsKfQopIGNvbnN0CnsKICByZXR1cm4gbWVkZmlsdDFfZmlsdGVyX3Zl Y3RvcjxDb21wbGV4Q29sdW1uVmVjdG9yLCBDb21wbGV4PiAoeCwgd2xlbik7Cn0KCkNvbXBs ZXhSb3dWZWN0b3IKTUVERklMVDE6OmZpbHRlciAoY29uc3QgQ29tcGxleFJvd1ZlY3RvciAm eCkgY29uc3QKewogIHJldHVybiBtZWRmaWx0MV9maWx0ZXJfdmVjdG9yPENvbXBsZXhSb3dW ZWN0b3IsIENvbXBsZXg+ICh4LCB3bGVuKTsKfQoKCgpNYXRyaXgKTUVERklMVDE6OmZpbHRl ciAoY29uc3QgTWF0cml4ICZ4KSBjb25zdAp7CiAgcmV0dXJuIG1lZGZpbHQxX2ZpbHRlcl9t YXRyaXg8TWF0cml4LCBDb2x1bW5WZWN0b3IsIGRvdWJsZT4gKHgsIHdsZW4pOwp9CgpDb21w bGV4TWF0cml4IApNRURGSUxUMTo6ZmlsdGVyIChjb25zdCBDb21wbGV4TWF0cml4ICZ4KSBj b25zdAp7CiAgcmV0dXI= --------------48C59F411C6--