U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCklzc3VlICMgbnVtYmVycyBtZW50aW9uZWQgYmVsb3cgY2FuIGJlIGZvdW5kIG9uIEdpdGh1Yi4gRm9yIG1vcmUgZGV0YWlscywgYWRkCnRoZSBpc3N1ZSBudW1iZXIgdG8gdGhlIGVuZCBvZiB0aGUgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy8KClZlcnNpb24gNC4wLjIgKDggSnVuIDIwMjApCj09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDIwLTA2LTA3ICB2aWdzdGVya3IKICAgICAgICAgICAgW1J1YnldICMxNzE3IE5pbCBmaXggbWFuZ2xpbmcgc3RyaW5ncwoKMjAyMC0wNi0wNyAgdmFkegogICAgICAgICAgICAjMTc0OCBGaXggZG94eWdlbiBjb21tZW50cyBxdW90aW5nIGlzc3VlCgoyMDIwLTA2LTA3ICBtdW5vYWgKICAgICAgICAgICAgIzE4MDAgRXNjYXBlIHNwYWNlcyBpbiBmaWxlIHBhdGhzIGZvciBkZXBlbmRlbmNpZXMgKC1NIC1NTSBldGMpCgoyMDIwLTA2LTA2ICBhbmRyZWFzLXNjaHdhYgogICAgICAgICAgICBbUnVieV0gIzE4MDEgRml4IGVuY29kaW5nIG9uIGJpZyBlbmRpYW4gc3lzdGVtcyB3aGVuIHdyYXBwaW5nIHN0ZDo6d3N0cmluZy4KCjIwMjAtMDUtMzEgIGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gIzE3ODkgZXJyb3IgaGFuZGxpbmcgaW1wcm92ZW1lbnRzIGFuZCByZXR1cm4gZXJyb3IgY29kZSBvbiBleGl0IGZvciBTV0lHIHdyYXBwZWQgbW9kdWxlcy4KCjIwMjAtMDUtMzAgIG1zdGVpbmJlY2sKICAgICAgICAgICAgW0RdICMxNTkzIFJlcGxhY2UgYnJva2VuIGltcG9ydHMgd2hlbiB1c2luZyBuZXdlciB2ZXJzaW9ucyBvZiBELgoKMjAyMC0wNS0yOTogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtQeXRob25dICMxNzE2IFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBjb252ZXJ0aW5nIHN0cmluZ3Mgd2hlbiB1c2luZyBQeXRob24gPj0gMy4zLgoKMjAyMC0wNS0yODogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNzc2IFF1aXRlIGRyYW1hdGljYWxseSBkZWNyZWFzZSBydW4gdGltZXMgd2hlbiBnZW5lcmF0aW5nIHZlcnkgbGFyZ2UgaW50ZXJmYWNlIGZpbGVzIGJ5IGNoYW5naW5nCiAgICAgICAgICAgIHNvbWUgaW50ZXJuYWwgbWVtb3J5IHBvb2wgc2l6ZXMuCgoyMDIwLTA1LTI4OiBtY2ZhcmxqbQogICAgICAgICAgICAjMTc4OCBGaXggaGFuZGxpbmcgb2YgRG94eWdlbiBcZW5kbGluayBjb21tYW5kLgoKMjAyMC0wNS0yNDogdmFwaWVyCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTc5NiBGaXggcGtnLWNvbmZpZyBpbnZvY2F0aW9uIGluIGNvbmZpZ3VyZS4KCjIwMjAtMDQtMzA6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGV4Y2VwdGlvbiByYWlzaW5nIGZvciBuZXdlciBPY3RhdmUgdmVyc2lvbnMKICAgICAgICAgICAgU2luY2UgKGF0IGxlYXN0KSBPY3RhdmUgNS4xLjAsIHRoZSBPY3RhdmUgZXJyb3IoKSBmdW5jdGlvbiBub3cgcmFpc2VzIGEgQysrIGV4Y2VwdGlvbiwKICAgICAgICAgICAgd2hpY2ggaWYgdW5jYXVnaHQgaW1tZWRpYXRlbHkgZXhpdHMgYSBTV0lHIHdyYXBwZXIgZnVuY3Rpb24sIGJ5cGFzc2luZyBhbnkgY2xlYW51cCBjb2RlCiAgICAgICAgICAgIHRoYXQgbWF5IGFwcGVhciBhZnRlciBhICJmYWlsOiIgbGFiZWwuIFRoaXMgcGF0Y2ggYWRkcyBhICJ0cnkgeyAuLi4gfSBjYXRjaCguLi4pIHsgfSIKICAgICAgICAgICAgYmxvY2sgYXJvdW5kIHRoZSBjb250ZW50cyBvZiBTV0lHIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGZpcnN0IGV4ZWN1dGUgdGhlIGNsZWFudXAgY29kZQogICAgICAgICAgICBiZWZvcmUgcmV0aHJvd2luZyBhbnkgZXhjZXB0aW9uIHJhaXNlZC4gSXQgaXMgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMKICAgICAgICAgICAgb2YgT2N0YXZlIHdoZXJlIGVycm9yKCkgZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uLCB3aGljaCB3aWxsIHN0aWxsIGJyYW5jaCB0byB0aGUKICAgICAgICAgICAgImZhaWw6IiBibG9jayB0byBleGVjdXRlIGNsZWFudXAgY29kZSBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgbmV3ICJ0cnkgeyAuLi4gfSBjYXRjaCguLi4pIHsgfSIgYmxvY2sgd2lsbCBsb2NhbGlzZSBhbnkgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIHVzZWQgaW4gdHlwZW1hcHMgdGhhdCB3ZXJlIE5PVCBkZWNsYXJlZCB0aHJvdWdoIFNXSUcncyAldHlwZW1hcCguLi4pIHN5bnRheCwgc28gaXQncwogICAgICAgICAgICBwb3NzaWJsZSB0aGlzIGNvdWxkIGJyZWFrIGV4aXN0aW5nIFNXSUcgd3JhcHBlcnMgd2hpY2ggd2VyZSBpbXBsaWNpdGx5IHNoYXJpbmcgbG9jYWwKICAgICAgICAgICAgdmFyaWFibGVzIGJldHdlZW4gdHlwZW1hcHMuIFRoaXMgY2FuIGJlIGZpeGVkLCBob3dldmVyLCBieSBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIHdoaWNoIG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4gdHlwZW1hcHMgdGhyb3VnaCBTV0lHJ3MgJXR5cGVtYXAoLi4uKSBzeW50YXguCgoyMDIwLTAyLTE4OiByeWFubmV2ZWxsCiAgICAgICAgICAgIFtMdWFdICMxNzI4IEFkZCBzdXBwb3J0IGZvciBMVUEgbGlnaHR1c2VyZGF0YSB0byBTV0lHX0x1YV9Db252ZXJ0UHRyLgoKMjAyMC0wMi0xODogZG1hY2gKICAgICAgICAgICAgW1J1YnldICMxNzI1IEZpeCBnY2MgLVdjYXRjaC12YWx1ZSB3YXJuaW5ncy4KCjIwMjAtMDItMTQ6IHRyZWl0bWF5cgogICAgICAgICAgICAjMTcyNCBGaXggd3JhcHBpbmcgb2YgYWJzdHJhY3QgdXNlci1kZWZpbmVkIGNvbnZlcnNpb24gb3BlcmF0b3JzLgoKMjAyMC0wMi0xMzogZGR1cmhhbTIKICAgICAgICAgICAgW1B5dGhvbl0gIzE1MTIgRml4IG1lbWxlYWsgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvZiBzaGFyZWRfcHRyIG9iamVjdHMuCgoyMDIwLTAyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTY3MyAjMTY3NCBGaXggc2V0dGluZyAndGhpcycgd2hlbiBleHRlbmRpbmcgYSBwcm94eSBjbGFzcyB3aXRoIF9fc2xvdHNfXy4KCjIwMjAtMDEtMzE6IHZhZHoKICAgICAgICAgICAgW1J1YnldICMxNjUxIEFkZCBzdGQ6OmF1dG9fcHRyPD4gdHlwZW1hcHMuCgoyMDIwLTAxLTMxOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW1B5dGhvbl0gIzE3MDAgTW9yZSByb2J1c3QgZXJyb3IgY2hlY2tpbmcgZm9yIGZhaWx1cmVzIGluIGNhbGxzIHRvIFB5dGhvbiBDIEFQSToKICAgICAgICAgICAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUoKSBhbmQgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKCkuCgoyMDIwLTAxLTMxOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dICMxNzEwIEZpeCBjcmFzaCBwYXJzaW5nIGVtcHR5IGRvY3N0cmluZ3MuCgoyMDIwLTAxLTMwOiBBbHphdGhhcgogICAgICAgICAgICBbUl0gIzkxMCAjOTE0IEZpeCBSIG1lbW9yeSBsZWFrIG9uIGV4Y2VwdGlvbi4KCjIwMjAtMDEtMzA6IHJpY2hhcmRiZWFyZQogICAgICAgICAgICBbUl0gIzE1MTEgRml4IGJ1ZyB3cmFwcGluZyBmdW5jdGlvbnMuIFRoZXNlIHdlcmUgcHJldmlvdXNseSBpbmNvcnJlY3RseSB3cmFwcGVkIGFzIGlmCiAgICAgICAgICAgIHRoZXkgd2VyZSB2YXJpYWJsZXMuIFRoaXMgaGFwcGVuZWQgd2hlbiAnZ2V0JyBvciAnc2V0JyB3YXMgaW4gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIG9yIG1ldGhvZCwgYnV0IHNvbWV0aW1lcyBhbHNvIGluIHNvbWUgb3RoZXIgY2lyY3Vtc3RhbmNlcy4gSWYgeW91IHdlcmUgdXNpbmcgUgogICAgICAgICAgICBhdHRyaWJ1dGUgc3ludGF4IHRvIGFjY2VzcyB0aGVzZSBtZXRob2RzLCB5b3UnbGwgbmVlZCB0byBzd2l0Y2ggdG8gY2FsbGluZyB0aGVtIGFzIFIKICAgICAgICAgICAgbWV0aG9kcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAyMC0wMS0yNDogZXRzZS1kaWduaXRhcywgd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhXSAjMTUzMyBGaXggdXBjYXN0aW5nIGZvciBzaGFyZWRfcHRyJ3Mgb2YgdGVtcGxhdGVkIHR5cGVzLgoKMjAyMC0wMS0xNjogbWNmYXJsam0KICAgICAgICAgICAgIzE2NDMgIzE2NTQgV2hlbiB1c2luZyAtZG94eWdlbiwgZml4IHNlZ2ZhdWx0IHdoZW4gbmFtZWxlc3MgcGFyYW1ldGVycyBvciB2YXJhcmcgcGFyYW1ldGVycwogICAgICAgICAgICBhcmUgdXNlZC4KCjIwMjAtMDEtMTY6IG1jZmFybGptCiAgICAgICAgICAgICMxNjMyICMxNjU5IEZpeCBuZXdsaW5lIGhhbmRsaW5nIGZvciBkb3h5Z2VuICIvLy8iIGNvbW1lbnRzLgoKMjAyMC0wMS0xNDogbWNmYXJsam0KICAgICAgICAgICAgIzE2NDcgIzE2NTYgRml4IGNyYXNoIGhhbmRsaW5nIGVtcHR5IGRveHlnZW4gY29tbWVudHMuCgoyMDIwLTAxLTE0OiBtY2ZhcmxqbQogICAgICAgICAgICAjMTYwOCBJbXByb3ZlIGRveHlnZW4gc3VwcG9ydC4KICAgICAgICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgXHBhcmFtW10gY29tbWFuZHMgc3VjaCBhczogXHBhcmFtW2luXS4KICAgICAgICAgICAgLSBPcHRpb25hbCBhcmd1bWVudHMgYXJlIG1hcmtlZCBhcyAnb3B0aW9uYWwnIGluIHB5ZG9jLgogICAgICAgICAgICAtIEltcHJvdmUgc3VwcG9ydCBmb3IgXGNvZGUgY29tbWFuZHMgc28gdGhhdCBvdGhlciBsYW5ndWFnZXMgYXJlIHN1cHBvcnRlZCBhcyBjb2RlIGJsb2Nrcy4KICAgICAgICAgICAgICBTdXBwb3J0IGFkZGVkIGZvciBqYXZhLCBjIGFuZCBweS4gIEZvciBleGFtcGxlIFB5dGhvbjogXGNvZGV7LnB5fSAuLi4gXGVuZGNvZGUKICAgICAgICAgICAgLSBGaXggZG94eWdlbiBoYW5kbGluZyBvZiBcZW0gYW5kIFxwIHRhZ3MgZm9yIFB5dGhvbi4KCjIwMjAtMDEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNTk1IFB5dGhvbiAtYnVpbHRpbiBjb25zdHJ1Y3RvcnMgc2lsZW50bHkgaWdub3JlZCBrZXl3b3JkIGFyZ3VtZW50cy4KICAgICAgICAgICAgSW5zdGVhZCBvZiBzaWxlbnR5IGlnbm9yaW5nIHRoZW0sIG5vdyBhICJUeXBlRXJyb3I6IGYoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50cyIKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgdXNlZC4gSGVuY2UgY29uc3RydWN0b3JzIGFuZCBub3JtYWwgbWV0aG9kcy8KICAgICAgICAgICAgZnVuY3Rpb25zIGJlaGF2ZSBpbiB0aGUgc2FtZSB3YXkuIE5vdGUsIC1rZXl3b3JkIHNob3VsZCBiZSB1c2VkIHdpdGggLWJ1aWx0aW4gdG8gb2J0YWluCiAgICAgICAgICAgIGtleXdvcmQgYXJndW1lbnQgc3VwcG9ydC4KCjIwMjAtMDEtMDU6IGpzY2h1ZWxsZXIgc2hhZGNoaW4KICAgICAgICAgICAgW1B5dGhvbl0gIzE2NzAgIzE2OTYgQWRkIG1pc3NpbmcgZmllbGQgaW5pdGlhbGl6ZXJzIGludHJvZHVjZWQgaW4gcHl0aG9uIDMuODoKICAgICAgICAgICAgdHBfdmVjdG9yY2FsbCBhbmQgdHBfcHJpbnQuCgoyMDIwLTAxLTA1OiBmcmllZHJpY2hhdGdjCiAgICAgICAgICAgIFtPY3RhdmVdICMxNjg4IENoYW5nZSBzd2lnX3RoaXMoKSB0byB1c2Ugc2l6ZV90IGluc3RlYWQgb2YgbG9uZyBmb3IgY29tcGF0aWJpbGl0eQogICAgICAgICAgICB3aXRoIFdpbmRvd3MgNjQgYml0LgoKMjAyMC0wMS0wNTogdHJlaXRtYXlyCiAgICAgICAgICAgIFtSdWJ5XSAjMTY5MiAjMTY4OSBBZGQgc3VwcG9ydCBmb3IgUnVieSAyLjcKCjIwMTktMTItMzA6IHRyZWl0bWF5cgogICAgICAgICAgICBbUnVieV0gIzE2NTMgIzE2NjggRml4IGNvZGUgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgLWdsb2JhbG1vZHVsZSBvcHRpb24uCgoyMDE5LTEyLTI5OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTY4NiBGaXggY29tcGlsYXRpb24gZXJyb3JzIHdpdGggT0NhbWwgNC4wOS4wLgoKMjAxOS0xMi0xMDogd3NmdWx0b24KICAgICAgICAgICAgIzE2NzkgRml4IHBhcnNpbmcgb2YgQysrMTEgaWRlbnRpZmllcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmcgKGZpbmFsIGFuZCBvdmVycmlkZSkgd2hlbgogICAgICAgICAgICB0aGV5IGFyZSB1c2VkIGFzIHBhcnQgb2YgdGhlIHNjb3BlIG5hbWUgb2YgYW4gaWRlbnRpZmllciwgc3VjaCBhcyBhIG5hbWVzcGFjZSBuYW1lLgoKMjAxOS0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjMTYyOCAnb3V0JyBvciAncmVmJyB1c2VkIGluIGEgY3N0eXBlIHR5cGVtYXAgd2FzIG5vdCBhbHdheXMgc3RyaXBwZWQgb3V0IGluIHBhcnRzCiAgICAgICAgICAgIG9mIGRpcmVjdG9yIGNvZGUgZ2VuZXJhdGlvbi4KCjIwMTktMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxNTk1IEZpeCBidWcgaW4gc3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgKGt3YXJncyBmZWF0dXJlIG9yIC1rZXl3b3JkKQogICAgICAgICAgICB3aGVuIHVzaW5nIC1idWlsdGluLiBUaGUgZml4IGlzIGluIHRoZSBhcmd1bWVudCBlcnJvciBjaGVja2luZyB3aGVuIHdyYXBwaW5nIHplcm8KICAgICAgICAgICAgYXJndW1lbnQgY29uc3RydWN0b3JzIG9ubHkuCgpWZXJzaW9uIDQuMC4xICgyMSBBdWcgMjAxOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE5LTA4LTIwOiBUZWt1Q29uY2VwdAogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzE1MzUgQWRkICVuYXRpdmUgc3VwcG9ydCB0byBKYXZhc2NyaXB0LgoKMjAxOS0wOC0yMDogYmtvdHp6CiAgICAgICAgICAgIFtKYXZhXSAjMTYxNiBBZGQgU1dJR19KYXZhSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRvIHN1cHBvcnQgdGhyb3dpbmcKICAgICAgICAgICAgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmcm9tIEpOSSBjb2RlLgoKMjAxOS0wOC0xOTogc2ptbAogICAgICAgICAgICBbTHVhXSAjMTU5NiB0b3N0cmluZyBvdXRwdXQgY2hhbmdlcyB0byBzaG93IHRoZSB1bmRlcmx5aW5nIEMvQysrIHBvaW50ZXIuCgoyMDE5LTA4LTA4OiByb2t1cHMKICAgICAgICAgICAgW0MjLCBKYXZhXSAjMTYwMSBGaXggaW52YWxpZCBjb2RlIGdlbmVyYXRlZCBmb3IgIiVjb25zdGFudCBlbnVtIEVudW1UeXBlLgoKMjAxOS0wOC0wNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IG1ldGhvZCBvdmVybG9hZGluZyBvZiBtZXRob2RzIHRoYXQgdGFrZSBTVEwgY29udGFpbmVycyBvZiBkaWZmZXJlbnQKICAgICAgICAgICAgdHlwZXMuIFRoZSBmb2xsb3dpbmcgdXNhZ2UgKHVzaW5nIHN0ZDo6dmVjdG9yKSB3b3VsZCBmYWlsIHdoZW4gdXNpbmcgLWJ1aWx0aW46CgogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF92ZWN0b3IuaT4KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIHN0cnVjdCBYIHt9OwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JYKSBzdGQ6OnZlY3RvcjxYPjsKICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdG9ySW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICBzdHJpbmcgVmVjdG9yT3ZlcmxvYWQodmVjdG9yPFg+IHYpOwogICAgICAgICAgICAgIHN0cmluZyBWZWN0b3JPdmVybG9hZCh2ZWN0b3I8aW50PiB2KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB3b3VsZCBpbmNvcnJlY3RseSBmYWlsOgoKICAgICAgICAgICAgICBzID0gVmVjdG9yT3ZlcmxvYWQoWzEsIDIsIDNdKQoKICAgICAgICAgICAgV2l0aDoKCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgICAgICAgRmlsZSAicnVubWUzLnB5IiwgbGluZSAyMCwgaW4gPG1vZHVsZT4KICAgICAgICAgICAgICAgICAgcmV0ID0gVmVjdG9yT3ZlcmxvYWQoWzEsIDIsIDNdKQogICAgICAgICAgICAgIFR5cGVFcnJvcjogV3JvbmcgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9uICdWZWN0b3JPdmVybG9hZCcuCiAgICAgICAgICAgICAgICBQb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGFyZToKICAgICAgICAgICAgICAgICAgVmVjdG9yT3ZlcmxvYWQoc3RkOjp2ZWN0b3I8IE51bWJlcixzdGQ6OmFsbG9jYXRvcjwgTnVtYmVyID4gPikKICAgICAgICAgICAgICAgICAgVmVjdG9yT3ZlcmxvYWQoc3RkOjp2ZWN0b3I8IGludCxzdGQ6OmFsbG9jYXRvcjwgaW50ID4gPikKCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIHdhcyBkdWUgdG8gc29tZSBlcnJvciBoYW5kbGluZyB0aGF0IHdhcyBub3QgY2xlYXJlZCBkdXJpbmcgdHlwZWhlY2tpbmcuCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSBhbiBlcnJvciB3YXMgbm90IGNsZWFyZWQgd2hlbiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QgZmFpbGVkIHRoZQogICAgICAgICAgICB0eXBlY2hlY2sgZm9yIGNvbnZlcnRpbmcgdG8gWC4gT25seSBvY2N1cnMgaW4gUHl0aG9uIDMrLgoKICAgICAgICAgICAgSW4gc29tZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzLCB0aGUgZm9sbG93aW5nIHR5cGUgb2YgZXJyb3IgbWVzc2FnZSB3b3VsZAogICAgICAgICAgICBvY2N1cjoKCiAgICAgICAgICAgICAgUnVudGltZUVycm9yOiBpbiBzZXF1ZW5jZSBlbGVtZW50IDAKCiAgICAgICAgICAgICAgVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgICAgICAgRmlsZSAicnVubWUzLnB5IiwgbGluZSAyMywgaW4gPG1vZHVsZT4KICAgICAgICAgICAgICAgICAgY2hlY2soVmVjdG9yT3ZlcmxvYWQodiksICJ2ZWN0b3I8WD4iKQogICAgICAgICAgICAgIFN5c3RlbUVycm9yOiA8YnVpbHQtaW4gZnVuY3Rpb24gVmVjdG9yT3ZlcmxvYWQ+IHJldHVybmVkIGEgcmVzdWx0IHdpdGggYW4gZXJyb3Igc2V0CgoyMDE5LTA4LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICAjMTYwMiBGaXggcmVncmVzc2lvbiBpbiA0LjAuMCB3aGVyZSBhIHRlbXBsYXRlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgYSBwYXJhbWV0ZXIKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBmdW5jdGlvbiBuYW1lIGxlZCB0byB0aGUgcGFyYW1ldGVyIG5hbWUgdXNlZCBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIGJlaW5nIGluY29ycmVjdGx5IG1vZGlmaWVkLgoKMjAxOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMgb24gZXJyb3IuIFByZXZpb3VzbHkgZ2VuZXJhdGVkIGZpbGVzIHdlcmUgbm90IHJlbW92ZWQsCiAgICAgICAgICAgIHBvdGVudGlhbGx5IGJyZWFraW5nIE1ha2VmaWxlcyB1c2luZyBmaWxlIGRlcGVuZGVuY2llcywgZXNwZWNpYWxseSB3aGVuIC1XZXJyb3IKICAgICAgICAgICAgKHdhcm5pbmdzIGFzIGVycm9ycykgd2FzIHVzZWQuCgoyMDE5LTA3LTIzOiBzbWl0aHgKICAgICAgICAgICAgW0MjXSAjMTUzMCAjMTUzMiBGaXggbWFyc2hhbGxpbmcgb2Ygc3RkOjp3c3RyaW5nIHRvIEMjLgoKMjAxOS0wNy0xODogZ2ljbW8KICAgICAgICAgICAgW1B5dGhvbl0gIzE1ODcgUHl0aG9uIDMuOCBzdXBwb3J0IC0gcmVtb3ZlIHVzZSBvZiBkZXByZWNhdGVkIFB5T2JqZWN0X0dDX1VuVHJhY2suCgoyMDE5LTA3LTE4OiBjaGVyLW5vdgogICAgICAgICAgICBbUHl0aG9uXSAjMTU3MyBHZW5lcmF0ZWQgUHl0aG9uIGNvZGUgdXNlcyBjb25zaXN0ZW50IHN0cmluZyBxdW90aW5nIHN0eWxlIC0gZG91YmxlCiAgICAgICAgICAgIHF1b3Rlcy4KCjIwMTktMDctMTY6IGdlZWZyCiAgICAgICAgICAgIFtDI10gIzYxNiAjMTU3NiBGaXggQyMgYm9vbCBJTlBVVFtdLCBib29sIE9VVFBVVFtdLCBib29sIElOT1VUW10gdHlwZW1hcHMgdG8gbWFyc2hhbGwKICAgICAgICAgICAgYXMgMS1ieXRlLgoKMjAxOS0wNy0xMjogdmFkegogICAgICAgICAgICBbQyMsIEphdmFdICMxNTY4ICMxNTgzIEZpeCBzdGQ6OnNldDw+IHR5cGVtYXBzIGZvciBwcmltaXRpdmUgdHlwZXMuCgoyMDE5LTA3LTEyOiB2YWR6CiAgICAgICAgICAgICMxNTY2ICMxNTg0IFJlZ3Jlc3Npb24gaW4gNC4wLjAgLSBmaXggbWlzc2luZyB2YWx1ZSBmb3IgZmlyc3QgaXRlbSBvZiBlbnVtcyB3aXRoCiAgICAgICAgICAgIHRyYWlsaW5nIGNvbW1hLgoKMjAxOS0wNy0xMTogbWNmYXJsam0KICAgICAgICAgICAgIzE1NDggIzE1NzggRml4IHNlZ2ZhdWx0IGluIERveHlnZW4gcGFyc2VyIHBhcnNpbmcgZW1wdHkgbGluZXMgaW4gc29tZSBjb21tYW5kcyBsaWtlCiAgICAgICAgICAgIFxjb2RlLgoKMjAxOS0wNy0wOTogSXNhYWNQYXNjdWFsCiAgICAgICAgICAgIFtDIywgSmF2YV0gIzE1NzAgRml4IG5hbWUgb2YgZ2VuZXJhdGVkIEMjL0phdmEgY2xhc3NlcyBmb3IgJWludGVyZmFjZSBtYWNyb3MKICAgICAgICAgICAgaW4gc3dpZ2ludGVyZmFjZS5pIHdoZW4gd3JhcHBpbmcgbmVzdGVkIEMrKyBjbGFzc2VzLgoKMjAxOS0wNy0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzE1NDcgV2hpdGVzcGFjZSBmaXhlcyBpbiBEb3h5Z2VuIHRyYW5zbGF0ZWQgY29tbWVudHMgaW50byBweWRvYyBjb21tZW50cwogICAgICAgICAgICBmb3IgU3BoaW54IGNvbXBhdGliaWxpdHkuCgoyMDE5LTA2LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWUsIE9DYW1sXSAjMTU1OSAkYXJnIGFuZCAkaW5wdXQgd2VyZSBpbmNvcnJlY3RseSBzdWJzdGl0dXRlZCBpbiB0aGUKICAgICAgICAgICAgYXJnb3V0IHR5cGVtYXAgd2hlbiB0d28gb3IgbW9yZSBhcmd1bWVudHMgd2VyZSBwcmVzZW50LgoKMjAxOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieV0gIzE1MzggUmVtb3ZlIHRoZSBVbmtub3duRXhjZXB0aW9uSGFuZGxlciBjbGFzcyBpbiBvcmRlciB0byBiZQogICAgICAgICAgICBDKysxNyBjb21wbGlhbnQgYXMgaXQgdXNlcyBzdGQ6OnVuZXhwZWN0ZWRfaGFuZGxlciB3aGljaCB3YXMgcmVtb3ZlZCBpbiBDKysxNy4KICAgICAgICAgICAgVGhpcyBjbGFzcyB3YXMgaW50ZW5kZWQgZm9yIGRpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBidXQgd2FzIG5ldmVyIHVzZWQgYnkKICAgICAgICAgICAgU1dJRyBhbmQgd2FzIG5ldmVyIGRvY3VtZW50ZWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDYtMDY6IGJrb3R6egogICAgICAgICAgICBbSmF2YV0gIzE1NTIgSW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBKYXZhIHN0ZDo6dmVjdG9yIGNvbnN0cnVjdG9yIHdyYXBwZXIgdGhhdCB0YWtlcwogICAgICAgICAgICBhIG5hdGl2ZSBKYXZhIGFycmF5IGFzIGlucHV0LgoKMjAxOS0wNi0wMzogb2xseQoJICAgIFtQeXRob25dIEZpeCByZWdyZXNzaW9uIGluIGltcGxpY2l0X2NvbnYgaGFuZGxpbmcgb2YgdHVwbGVzLAoJICAgIGludHJvZHVjZWQgaW4gU1dJRyA0LjAuMC4gIEZpeGVzICMxNTUzLCByZXBvcnRlZCBieSBBbGV4YW5kcmUKCSAgICBEdXJldC1MdXR6LgoKMjAxOS0wNS0yNDogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gRml4IGRldGVjdGlvbiBvZiBPY3RhdmUgb24gTWFjT1MuCgoyMDE5LTA1LTI0OiBvcG9wbGF3c2tpCiAgICAgICAgICAgIFtPY3RhdmVdICMxNTIyIEFkYXB0IE9DVEFWRV9MREZMQUdTIGZvciBPY3RhdmUgNS4xLgoKMjAxOS0wNS0yMjogZmVyZHluYXRvcgoJICAgIFtQSFBdICMxNTI4IERvbid0IGFkZCBhIGNsb3NpbmcgJz8+JyBQSFAgdGFnIHRvIGdlbmVyYXRlZCBmaWxlcy4KCSAgICBQU1ItMiBzYXlzIGl0IE1VU1QgYmUgb21pdHRlZCBmb3IgZmlsZXMgY29udGFpbmluZyBvbmx5IFBIUC4KVmVyc2lvbiA0LjAuMCAoMjcgQXByIDIwMTkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxOS0wNC0yNDogdmFkegogICAgICAgICAgICAjMTUxNyBGaXggY3Jhc2ggaWYgIkByZXR1cm4iIERveHlnZW4gdGFnIHdhcyB1c2VkIG9uIGEgbm9kZSB3aXRob3V0IGFueSByZXR1cm4gdHlwZS4KCjIwMTktMDQtMjQ6IHZhZHoKICAgICAgICAgICAgIzE1MTUgRml4IHBhcnNpbmcgb2YgZW51bXMgd2l0aCB0cmFpbGluZyBjb21tYSB3aGVuIHVzaW5nIC1kb3h5Z2VuLgoKMjAxOS0wNC0xOTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSAjMTA1NSBXaGVuIGdlbmVyYXRpbmcgR28gY29kZSwgbWFrZSAtY2dvIHRoZSBkZWZhdWx0LiBBZGQgbmV3IC1uby1jZ28gb3B0aW9uCiAgICAgICAgICAgIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQuCgoyMDE5LTA0LTE5OiBwYmVjaGVyZXIKICAgICAgICAgICAgW1RjbF0gIzE1MDggRml4IFZpc3VhbCBTdHVkaW8gMjAxNSBhbmQgbGF0ZXIgY29tcGlsYXRpb24gZXJyb3JzIGR1ZSB0byBzbnByaW50ZiBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9uLgoKMjAxOS0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggRnhDb3Agd2FybmluZyBDQTIwMDIgaW4gU1dJR1BlbmRpbmdFeGNlcHRpb24gLSBhIGxvY2sgb24gYSByZWZlcmVuY2Ugb2YKICAgICAgICAgICAgdHlwZSAnVHlwZScuCgoyMDE5LTAzLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgRF0gQWRkIHRoZSBwYXJhbWV0ZXJzIHR5cGVtYXAgYXR0cmlidXRlIHRvIHRoZSBqYXZhZGVzdHJ1Y3QsCiAgICAgICAgICAgIGphdmFkZXN0cnVjdF9kZXJpdmVkLCBkZGlzcG9zZSwgZGRpc3Bvc2VfZGVyaXZlZCB0eXBlbWFwcyB0byBtaXJyb3IgZW5oYW5jZWQKICAgICAgICAgICAgZmxleGliaWxpdHkgaW4gdGhlIGNzZGlzcG9zaW5nIGFuZCBjc2Rpc3Bvc2luZ19kZXJpdmVkIChDIykgdHlwZW1hcHMuIElmIHByb3ZpZGVkCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBhcmUgZ2VuZXJhdGVkIGFzIHRoZSBkZWxldGUvZGlzcG9zZSBtZXRob2QncyBwYXJhbWV0ZXJzIGRlY2xhcmF0aW9uLgoKMjAxOS0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjNDIxIEZpeCBGeENvcCB3YXJuaW5nIENBMTA2MyBieSBpbXBsZW1lbnRpbmcgdGhlIHJlY29tbWVuZGVkIERpc3Bvc2UgbWV0aG9kcyBmb3IKICAgICAgICAgICAgdGhlIElEaXNwb3NhYmxlIGludGVyZmFjZS4gUHJldmlvdXNseSBqdXN0IHRoZSBEaXNwb3NlKCkgbWV0aG9kIHdhcyBnZW5lcmF0ZWQuCiAgICAgICAgICAgIE5vdyB0aGUgRGlzcG9zZSgpIGFuZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKSBtZXRob2RzIGFyZSBnZW5lcmF0ZWQuCiAgICAgICAgICAgIENoYW5nZXMgYXJlIHJlcXVpcmVkIGlmIGN1c3RvbSAiY3NmaW5hbGl6ZSIsICJjc2Rlc3RydWN0IiBvciAiY3NkZXN0cnVjdF9kZXJpdmVkIgogICAgICAgICAgICB0eXBlbWFwcyBhcmUgYmVpbmcgdXNlZC4gRGV0YWlscyBpbiAjNDIxIG9uIEdpdGh1Yi4gU1dJRyB3aWxsIGVycm9yIG91dCBpZiBvbmUgb2YKICAgICAgICAgICAgdGhlICJjc2ZpbmFsaXplLCAiY3NkZXN0cnVjdCIgb3IgImNzZGVzdHJ1Y3RfZGVyaXZlZCIgdHlwZW1hcHMgYXJlIGZvdW5kLiBFeGFtcGxlCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2U6CgogICAgICAgICAgICAgIGZvby5oOjYwOiBFcnJvcjogQSBkZXByZWNhdGVkIGNzZmluYWxpemUgdHlwZW1hcCB3YXMgZm91bmQgZm9yIEZvbywgcGxlYXNlIHJlbW92ZQogICAgICAgICAgICAgIGl0IGFuZCByZXBsYWNlIGFsbCBjc2Rlc3RydWN0LCBjc2Rlc3RydWN0X2Rlcml2ZWQgYW5kIGNzZmluYWxpemUgdHlwZW1hcHMgYnkgdGhlCiAgICAgICAgICAgICAgY3NkaXNwb3NlLCBjc2Rpc3Bvc2VfZGVyaXZlZCwgY3NkaXNwb3NpbmcgYW5kIGNzZGlzcG9zaW5nX2Rlcml2ZWQgdHlwZW1hcHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDMtMjU6IExpcnluYQogICAgICAgICAgICBbQyNdICMxMTQzIEFkZCBzdGRfbGlzdC5pIGZvciBzdGQ6Omxpc3Qgc3VwcG9ydC4KICAgICAgICAgICAgVGhlIEMjIHN0ZDo6bGlzdDxUPiB3cmFwcGVycyBhcmUgbWFkZSB0byBsb29rIGFuZCBmZWVsIGxpa2UgYSBDIwogICAgICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaW5rZWRMaXN0PD4gY29sbGVjdGlvbi4KICAgICAgICAgICAgVGhlIElFbnVtZXJhYmxlPD4gaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGluIHRoZSBwcm94eSBjbGFzcy4KICAgICAgICAgICAgVGhlIElDb2xsZWN0aW9uPD4gaW50ZXJmYWNlIGNhbiBhbHNvIGJlIGltcGxlbWVudGVkIHRvIHByb3ZpZGUgZW5oYW5jZWQgZnVuY3Rpb25hbGl0eQogICAgICAgICAgICB3aGVuZXZlciBhIEMrKyBvcGVyYXRvcj09IGlzIGF2YWlsYWJsZS4gVGhpcyBpcyB0aGUgY2FzZSBmb3Igd2hlbiBUIGlzIGEKICAgICAgICAgICAgcHJpbWl0aXZlIHR5cGUgb3IgYSBwb2ludGVyLiBJZiBUIGRvZXMgZGVmaW5lIGFuIG9wZXJhdG9yPT0sIHRoZW4gdXNlIHRoZQogICAgICAgICAgICBTV0lHX1NURF9MSVNUX0VOSEFOQ0VEIG1hY3JvIHRvIG9idGFpbiB0aGlzIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX1NURF9MSVNUX0VOSEFOQ0VEKFNvbWVOYW1lc3BhY2U6OktsYXNzKQogICAgICAgICAgICAgICV0ZW1wbGF0ZShMaXN0S2xhc3MpIHN0ZDo6bGlzdDxTb21lTmFtZXNwYWNlOjpLbGFzcz47CgoyMDE5LTAzLTE4OiByaWNoYXJkYmVhcmUKICAgICAgICAgICAgW1JdICMxMzI4IE5vbi10cml2aWFsIGVudW1zIGFyZSB3b3JraW5nIG5vdy4gVGhlIGVudW0gdmFsdWVzIGFyZSBub3cgb2J0YWluZWQgZnJvbQogICAgICAgICAgICB0aGUgQy9DKysgbGF5ZXIuIGNvbnN0IHJlZmVyZW5jZSBlbnVtcyBhbmQgQysrMTEgZW51bSBjbGFzc2VzIGFyZSBhbHNvIG5vdyB3b3JraW5nLgoKMjAxOS0wMy0xNDogbW9jaGl6awogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzE1MDAgRml4IGNvbXBpbGF0aW9uIGVycm9ycyBkdWUgdG8gZGVwcmVjYXRpbmcgVjggQVBJIGluIE5vZGUuanMuCiAgICAgICAgICAgIE5ldyBWOCBBUEkgaXMgdXNlZCBpZiBub2RlLmpzID49IHYxMC4xMiwgb3IgaWYgVjggPj0gdjcuMC4KCjIwMTktMDMtMTI6IHZhZHoKICAgICAgICAgICAgW0MjXSAjMTQ5NSBBZGQgc3RkX3NldC5pIGZvciBzdGQ6OnNldCBzdXBwb3J0LgoKMjAxOS0wMy0xMTogZGlydGVhdCxvcG9wbGF3c2tpCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBjb21waWxhdGlvbiBlcnJvcnMgaW4gT2N0YXZlIDUuMS4KCiAgICAgICAgICAgICAgZXJyb3I6IGZvcm1hdCBub3QgYSBzdHJpbmcgbGl0ZXJhbCBhbmQgbm8gZm9ybWF0IGFyZ3VtZW50cyBbLVdlcnJvcj1mb3JtYXQtc2VjdXJpdHldCgoyMDE5LTAyLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp2ZWN0b3IgaW1wcm92ZW1lbnRzIGZvciB0eXBlcyB0aGF0IGRvIG5vdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIFRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycyBoYXZlIGJlZW4gY2hhbmdlZCB0byB3b3JrIGJ5IGRlZmF1bHQgZm9yIGVsZW1lbnRzIHRoYXQgYXJlCiAgICAgICAgICAgIG5vdCBkZWZhdWx0IGluc2VydGFibGUsIGkuZS4gaGF2ZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBUaGlzIGhhcyBiZWVuIGFjaGlldmVkIGJ5CiAgICAgICAgICAgIG5vdCB3cmFwcGluZzoKCiAgICAgICAgICAgICAgdmVjdG9yKHNpemVfdHlwZSBuKTsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIGFib3ZlIGhhZCB0byBiZSBpZ25vcmVkIHZpYSAlaWdub3JlLgoKICAgICAgICAgICAgSWYgdGhlIGFib3ZlIGNvbnN0cnVjdG9yIGlzIHN0aWxsIHJlcXVpcmVkIGl0IGNhbiBiZSBhZGRlZCBiYWNrIGluIGFnYWluIHZpYSAlZXh0ZW5kOgoKICAgICAgICAgICAgICAlZXh0ZW5kIHN0ZDo6dmVjdG9yIHsKICAgICAgICAgICAgICAgIHZlY3RvcihzaXplX3R5cGUgY291bnQpIHsgcmV0dXJuIG5ldyBzdGQ6OnZlY3RvcjwgVCA+KGNvdW50KTsgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBmb2xsb3dpbmcgd3JhcHBlZCBjb25zdHJ1Y3RvciBjb3VsZCBiZSB1c2VkIGFzIGl0IHByb3ZpZGVzIG5lYXItZW5vdWdoCiAgICAgICAgICAgIGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eToKCiAgICAgICAgICAgICAgdmVjdG9yKGppbnQgY291bnQsIGNvbnN0IHZhbHVlX3R5cGUmIHZhbHVlKTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMi0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGNvbXBpbGUgZXJyb3JzIHdyYXBwaW5nIG92ZXJsb2FkZWQgZnVuY3Rpb25zL2NvbnN0cnVjdG9ycyB3aGVyZSBhIHZhcmFyZwogICAgICAgICAgICBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhZnRlciBhIG5vbi12YXJhcmcgZnVuY3Rpb24uCgoyMDE5LTAyLTIzOiB6cGhlbnNsZXk0MgogICAgICAgICAgICBVc2UgZnVsbHkgcXVhbGlmaWVkIG5hbWUgJ2phdmEubGFuZy5PYmplY3QnIGluc3RlYWQgb2YgJ09iamVjdCcgaW4gZ2VuZXJhdGVkIGNvZGUgdG8KICAgICAgICAgICAgYXZvaWQgY2xhc2hlcyB3aXRoIHdyYXBwZWQgQysrIGNsYXNzZXMgY2FsbGVkICdPYmplY3QnLgoKMjAxOS0wMi0yMzogZ3RiWAogICAgICAgICAgICBbSmF2YV0gIzEwMzUgQWRkIChjb25zdCBjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIGluIGFkZGl0aW9uIHRvIHRoZSBub24tY29uc3QKICAgICAgICAgICAgdHlwZW1hcHMgKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgd2hpY2ggZG9lcyBub3QgYXR0ZW1wdCB0byB3cml0ZSBiYWNrIHRvIHRoZSBjb25zdAogICAgICAgICAgICBzdHJpbmcuCgoyMDE5LTAyLTIyOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5ODQgQWRkIHN1cHBvcnQgZm9yIFJUeXBlZERhdGEgaW50cm9kdWNlZCBpbiBSdWJ5IDEuOS4zLgoKMjAxOS0wMi0yMjogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNDgzIEZpeCBjb21waWxhdGlvbiBmYWlsdXJlcyB3aGVuIGEgZGlyZWN0b3IgY2xhc3MgaGFzIGZpbmFsIG1ldGhvZHMuCgoyMDE5LTAyLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzEyNDAgU3VwcHJlc3MgSmF2YSA5IGRlcHJlY2F0aW9uIHdhcm5pbmdzIG9uIGZpbmFsaXplIG1ldGhvZC4KCjIwMTktMDItMjE6IFphY2tlcnlTcHl0egogICAgICAgICAgICAjMTQ4MCBGaXggc29tZSByZWplY3Rpb25zIG9mIHZhbGlkIGZsb2F0aW5nLXBvaW50IGxpdGVyYWxzLgoKMjAxOS0wMi0xOTogd3NmdWx0b24KICAgICAgICAgICAgIzE0NzUgRml4IHJlZ3Jlc3Npb24gcGFyc2luZyBnY2MgcHJlcHJvY2Vzc29yIGxpbmVtYXJrZXJzIGluIHRoZSBmb3JtOgoKICAgICAgICAgICAgIyBsaW5lbnVtIGZpbGVuYW1lIGZsYWdzCgoyMDE5LTAyLTE4OiBqYWtlY29iYgogICAgICAgICAgICBbUHl0aG9uXSAjOTQ1ICMxMjM0IEVsZW1lbnRzIGluIHN0ZDo6dmVjdG9yIG1lbW9yeSBhY2Nlc3MgZml4LgoKICAgICAgICAgICAgQWNjZXNzaW5nIGFuIGVsZW1lbnQgaW4gYSBzdGQ6OnZlY3RvciBvYnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHZpYSBhbgogICAgICAgICAgICBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLiBJZiB0aGUgdmVjdG9yIGlzIGdhcmJhZ2UgY29sbGVjdGVkLAogICAgICAgICAgICB0aGUgU1dJRyB3cmFwcGVyIGNvbnRhaW5pbmcgdGhlIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgYmVjb21lcyBpbnZhbGlkLiBUaGUgZml4IGlzCiAgICAgICAgICAgIHRvIG9idGFpbiBhIGJhY2stcmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIgYnkgdGhlIHdyYXBwZXIgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgICBsYXllciB0byBwcmV2ZW50IHRoZSBnYXJiYWdlIGNvbGxlY3RvciBmcm9tIGRlc3Ryb3lpbmcgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyLgoKMjAxOS0wMi0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGVtYXAgbWF0Y2hpbmcgdG8gZXhwYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2hlbiB0aGUgbmFtZSBjb250YWlucwogICAgICAgICAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiBJbiB0aGUgJXR5cGVtYXAgYmVsb3cgdGhlIHR5cGUgaXMgVCBhbmQgdGhlIG5hbWUgaXMgWDxUPjo6bWFrZQogICAgICAgICAgICBhbmQgdGhlIG5hbWUgbm93IGV4cGFuZHMgY29ycmVjdGx5IHRvIFg8IGludCA+OjptYWtlCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgVCBYPFQ+OjptYWtlICIuLi4iCiAgICAgICAgICAgICAgICBUIG1ha2UoKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoWGludCkgWDxpbnQ+OwoKMjAxOS0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNlciBlcnJvciBjb250YWluaW5nIG11bHRpcGxlICNkZWZpbmUgc3RhdGVtZW50cyBpbnNpZGUgYW4gZW51bS4KCiAgICAgICAgICAgIFRoZSBzZWNvbmQgI2RlZmluZSBmYWlscyB0byBwYXJzZToKCiAgICAgICAgICAgICAgZW51bSBGb29FbnVtIHsKICAgICAgICAgICAgICAgIEVOVU0xID0gMCwKICAgICAgICAgICAgICAgIEVOVU0yID0gMSwKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNST19ERUYxICJIZWxsbyIKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPX0RFRjIgIldvcmxkISIKCiAgICAgICAgICAgICAgICBFTlVNMyA9IDIsCiAgICAgICAgICAgICAgICBFTlVNNCA9IDMsCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1ZyBtZW50aW9uZWQgYXQgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL3BhdGNoZXMvMzMzLwoKMjAxOS0wMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHNvbWUgbWlzc2luZyBjb3B5IGNvbnN0cnVjdG9ycyBpbnRvIFNUTCBjb250YWluZXJzLgoKMjAxOS0wMi0xNDogYmtvdHp6CiAgICAgICAgICAgIFtKYXZhXSAjMTM1NiBBZGQgU1RMIGNvbnRhaW5lcnM6CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0CiAgICAgICAgICAgICAgc3RkOjpzZXQKCjIwMTktMDItMTQ6IGJrb3R6egogICAgICAgICAgICBbSmF2YV0gIzEzNTYgc3RkOjptYXAgd3JhcHBlcnMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBOb3cgdGhlIEphdmEgcHJveHkgY2xhc3MKICAgICAgICAgICAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAuIFRoZSBzdGQ6Om1hcCBjb250YWluZXIgbG9va3MgYW5kIGZlZWxzIG11Y2ggbGlrZQogICAgICAgICAgICBhIGphdmEudXRpbC5IYXNoTWFwIGZyb20gSmF2YS4KCiAgICAgICAgICAgIEEgZmV3IG1lbWJlcnMgaGF2ZSBjaGFuZ2VkIHRoZWlyIG5hbWVzLiBJZiB0aGUgb2xkIG1ldGhvZCBzaWduYXR1cmVzIGFyZSBuZWVkZWQsCiAgICAgICAgICAgIHRoZW4gY29weSBzdGRfbWFwLmkgZnJvbSBzd2lnLTMuMC4xMiBhbmQgdXNlIHRoYXQgaW5zdGVhZC4gQWx0ZXJuYXRpdmVseSwKICAgICAgICAgICAgYWRkIHRoZSBvbGQgbWlzc2luZyBtZXRob2RzIHRvIHRoZSBuZXcgbWV0aG9kcyBieSB1c2luZyB0aGUgZm9sbG93aW5nICVwcm94eWNvZGU6CgogICAgICAgICAgICAgICVleHRlbmQgc3RkOjptYXAgewogICAgICAgICAgICAgICVwcm94eWNvZGUgJXsKICAgICAgICAgICAgICAgIC8vIE9sZCBBUEkKICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVtcHR5KCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gaXNFbXB0eSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KCR0eXBlbWFwKGpib3h0eXBlLCBLKSBrZXksICR0eXBlbWFwKGpib3h0eXBlLCBUKSB4KSB7CiAgICAgICAgICAgICAgICAgIHB1dChrZXksIHgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZGVsKCR0eXBlbWFwKGpib3h0eXBlLCBLKSBrZXkpIHsKICAgICAgICAgICAgICAgICAgcmVtb3ZlKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNfa2V5KCR0eXBlbWFwKGpib3h0eXBlLCBLKSBrZXkpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zS2V5KGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDItMTM6IFphY2tlcnlTcHl0egogICAgICAgICAgICAjMTQ2OSBBZGQgc3VwcG9ydCBmb3IgQysrMTcgaGV4YWRlY2ltYWwgZmxvYXRpbmcgbGl0ZXJhbHMuCgoyMDE5LTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbT0NhbWxdICMxNDM3IE9DYW1sIGhhcyBiZWVuIGdpdmUgdGhlICdFeHBlcmltZW50YWwnIGxhbmd1YWdlIHN0YXR1cy4gVGhlIGV4YW1wbGVzIHdvcmsKICAgICAgICAgICAgYW5kIG1vc3Qgb2YgdGhlIHRlc3Qtc3VpdGUgaXMgYWxzbyB3b3JraW5nLCBzbyBpdCBpcyBxdWl0ZSBjbG9zZSB0byBiZWluZyBhICdTdXBwb3J0ZWQnIGxhbmd1YWdlLgoKMjAxOS0wMi0xMDogWmFja2VyeVNweXR6CgkgICAgIzE0NjQgQWRkIHN1cHBvcnQgZm9yIEMrKzE0IGJpbmFyeSBpbnRlZ2VyIGxpdGVyYWxzLgoKMjAxOS0wMi0xMDogWmFja2VyeVNweXR6CgkgICAgIzE0NTAgQWRkIHN1cHBvcnQgZm9yIEMrKzExIFVDUy0yIGFuZCBVQ1MtNCBjaGFyYWN0ZXIgbGl0ZXJhbHMuIEFsc28sIGFkZCBzdXBwb3J0IGZvcgogICAgICAgICAgICBDKysxNyBVVEYtOCBjaGFyYWN0ZXIgbGl0ZXJhbHMuCgoyMDE5LTAyLTEwOiB3c2Z1bHRvbgoJICAgIFtNelNjaGVtZV0gIzE0MzcgTXpTY2hlbWUvUmFja2V0IGlzIG5vdyBhbiAnRXhwZXJpbWVudGFsJyBsYW5ndWFnZS4gVGhlIGV4YW1wbGVzIHdvcmsKICAgICAgICAgICAgYW5kIGEgbGFyZ2UgcG9ydGlvbiBvZiB0aGUgdGVzdC1zdWl0ZSBpcyBhbHNvIHdvcmtpbmcuCgoyMDE5LTAyLTEwOiB3c2Z1bHRvbgoJICAgIFtNelNjaGVtZV0gRGVzdHJ1Y3RvciB3cmFwcGVycyB3ZXJlIG5vdCBiZWluZyBnZW5lcmF0ZWQuCgoyMDE5LTAyLTEwOiB3c2Z1bHRvbgoJICAgIFtNelNjaGVtZV0gU3RhdGljIHZhcmlhYmxlIHdyYXBwZXJzIGZpeGVkIC0gJGFyZ251bSB3YXMgbm90IGV4cGFuZGVkLgoKMjAxOS0wMi0xMDogc2V0aHJqCgkgICAgIzE0NTIgRml4ICVhcHBseSBmb3IgYW5vbnltb3VzIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zCgoyMDE5LTAyLTA5OiBvbGx5CgkgICAgW1BIUF0gRml4IGFjY2VzcyB0byBhbHJlYWR5IHJlbGVhc2VkIG1lbW9yeSBkdXJpbmcgUEhQIG1vZHVsZQoJICAgIHNodXRkb3duLCB3aGljaCBvZnRlbiBkaWRuJ3QgY2F1c2UgdmlzaWJsZSBwcm9ibGVtcywgYnV0IGNvdWxkCgkgICAgcmVzdWx0IGluIHNlZ21lbnRhdGlvbiBmYXVsdHMsIGJ1cyBlcnJvcnMsIGV0Yy4gIEZpeGVzICMxMTcwLAoJICAgIHJlcG9ydGVkIGJ5IEppdGthIFBsZXNu7WtvduEuCgoyMDE5LTAyLTA5OiBvbGx5CgkgICAgW1BIUF0gQSByZW5hbWVkIGNvbnN0cnVjdG9yIGlzIG5vdyB3cmFwcGVkIGFzIGEgc3RhdGljIG1ldGhvZCBpbgoJICAgIFBIUC4KCjIwMTktMDItMDg6IG9sbHkKCSAgICBbUEhQXSBEb24ndCBnZW5lcmF0ZSBjb2RlIHdoaWNoIHJlZmVyZW5jZXMgJHIgd2hlbiAkciBoYXNuJ3QgYmVlbgoJICAgIGRlZmluZWQuICBUaGlzIGNvdWxkIGhhcHBlbiBpbiBvdmVybG9hZGVkIG1ldGhvZHMgd2hpY2ggcmV0dXJuZWQKCSAgICB2b2lkIGFuZCB0b29rIGF0IGxlYXN0IG9uZSBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVyLgoKMjAxOS0wMi0wODogb2xseQoJICAgIFtQSFBdIFRoZSBnZW5lcmF0ZWQgY29kZSBpcyBub3cgY29tcGF0aWJsZSB3aXRoIFBIUCA3LjMsIGFuZCB0aGUKCSAgICB0ZXN0c3VpdGUgbm93IHJ1bnMgY2xlYW5seSB3aXRoIHRoaXMgdmVyc2lvbiB0b28uCgoyMDE5LTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTQzNyBTV0lHIG5vdyBjbGFzc2lmaWVzIHRoZSBzdGF0dXMgb2YgdGFyZ2V0IGxhbmd1YWdlcyBpbnRvIGVpdGhlciAnRXhwZXJpbWVudGFsJyBvcgogICAgICAgICAgICAnU3VwcG9ydGVkJy4gVGhpcyBzdGF0dXMgaXMgcHJvdmlkZWQgdG8gaW5kaWNhdGUgdGhlIGxldmVsIG9mIG1hdHVyaXR5IHRvIGV4cGVjdCB3aGVuIHVzaW5nCiAgICAgICAgICAgIGEgcGFydGljdWxhciB0YXJnZXQgbGFuZ3VhZ2UgYXMgbm90IGFsbCB0YXJnZXQgbGFuZ3VhZ2VzIGFyZSBmdWxseSBkZXZlbG9wZWQuIERldGFpbHMgYXJlCiAgICAgICAgICAgIGluIHRoZSBJbnRyb2R1Y3Rpb24uaHRtbCBjaGFwdGVyIG9mIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbQ0ZGSV0gIzE0NDcgQ29tbW9uIExpc3AgQ0ZGSSBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdICMxNDQ3IEFsbGVncm8gQ29tbW9uIExpc3AgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbQ2hpY2tlbl0gIzE0NDcgQ0hJQ0tFTiBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtDTElTUF0gIzE0NDcgR05VIENvbW1vbiBMaXNwIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW1MtRVhQXSAjMTQ0NyBDb21tb24gTGlzcCBTLUV4cCBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtVRkZJXSAjMTQ0NyBDb21tb24gTGlzcCBVRkZJIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW1Bpa2VdICMxNDQ3IFBpa2UgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbTW9kdWxhM10gIzE0NDcgTW9kdWxhMyBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTAyOiBhaG5vbGRzCgkgICAgW1B5dGhvbl0gRG9jdW1lbnRhdGlvbiBlbmhhbmNlbWVudHMgZm9yIFB5dGhvbjoKCiAgICAgICAgICAgICM3MjggRml4ZWQgdGhlIGhhbmRsaW5nIG9mIGF1dG9kb2Mgd2hlbiB1c2luZyAtZmFzdHByb3h5LgoKICAgICAgICAgICAgIzEzNjcgQWRkZWQgZG9jdW1lbnRhdGlvbiB0byB3cmFwcGVkIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlCiAgICAgICAgICAgIHByb3BlcnR5KC4uLiBkb2M9Ii4uLiIpIGNvbnN0cnVjdC4KCiAgICAgICAgICAgIE9ubHkgc2hvdyBhIHNpbmdsZSBkb2N1bWVudGF0aW9uIGVudHJ5IGZvciBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB3aGVuCiAgICAgICAgICAgIHVzaW5nIGF1dG9kb2MuCgogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aGVyZSBhIGNhY2hlZCBkb3h5Z2VuIGRvY3N0cmluZyBjb3VsZCBiZSBkZWxldGVkIHdoaWxlIHN0aWxsIGluIHVzZSwKICAgICAgICAgICAgY2F1c2luZyBzd2lnIHRvIHNlZ2ZhdWx0LgoKMjAxOS0wMS0zMTogb2xseQoJICAgIFNXSUcgbm93IHJlcXVpcmVzIGEgdGFyZ2V0IGxhbmd1YWdlIHRvIGJlIHNwZWNpZmllZCBpbnN0ZWFkIG9mCgkgICAgZGVmYXVsdGluZyB0byB3cmFwcGluZyBmb3IgVGNsLiAgU3BlY2lmeWluZyBzd2lnIC0taGVscCB3aXRob3V0CgkgICAgYSB0YXJnZXQgbGFuZ3VhZ2Ugbm93IGp1c3Qgc2hvd3MgdGhlIGdlbmVyaWMgaGVscC4gIFRoZSAtbm9sYW5nCgkgICAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuCgoyMDE5LTAxLTI4OiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTQyOSBSZW1vdmUgc3VwcG9ydCBmb3IgT0NhbWwgdmVyc2lvbnMgPCAzLjEyLjAuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTktMDEtMjI6IHZhZHoKICAgICAgICAgICAgW1J1YnksIE9jdGF2ZV0gIzE0MjQgSW1wcm92ZSBhdXRvZG9jIHBhcmFtZXRlciBuYW1pbmcuCgoyMDE5LTAxLTIyOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dICMxMjcxICMxNDIzIEFsd2F5cyBpbmNsdWRlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBpbiBhdXRvZG9jIHN0cmluZ3MuCgoyMDE5LTAxLTE5OiB2YWR6CiAgICAgICAgICAgICMxMjcyLCAjMTQyMSBXaGVuIGEgZnVuY3Rpb24ncyBwYXJhbWV0ZXIgaXMgYSBrZXl3b3JkLCB0aGUgbmFtZSBvZiB0aGUgcGFyYW1hdGVyIGlzCiAgICAgICAgICAgIG5vIGxvbmdlciBzaW1wbHkgY2hhbmdlZCB0byBhcmdOLCB3aGVyZSBOIGlzIHRoZSBhcmd1bWVudCBudW1iZXIuIEluc3RlYWQgdGhlCiAgICAgICAgICAgIHBhcmFtZXRlciBuYW1lIGlzIGNoYW5nZWQgdG8gdGhlIHJlbmFtaW5nIHJ1bGVzIGZvciBrZXl3b3JkcyB0aGF0IG5vcm1hbGx5IGFwcGx5IHRvCiAgICAgICAgICAgIHN5bWJvbHMgc3VjaCBhcyBjbGFzc2VzL2Z1bmN0aW9ucyBldGMuIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgc3ltYm9sIHJlbmFtaW5nLAogICAgICAgICAgICBwYXJhbWV0ZXIgcmVuYW1pbmcgZG9lcyBub3QgaXNzdWUgYSB3YXJuaW5nIHdoZW4gdGhlIHBhcmFtZXRlciBpcyByZW5hbWVkLiBUaGlzCiAgICAgICAgICAgIGNoYW5nZSBvbmx5IGFmZmVjdHMgbGFuZ3VhZ2VzIHdoZXJlIHRoZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIGFjdHVhbGx5IHVzZWQsIGZvciBleGFtcGxlLAogICAgICAgICAgICBKYXZhIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0cyBpbiB0aGUgcHJveHkgY2xhc3Mgb3IgUHl0aG9uIGRvY3VtZW50YXRpb24gY29tbWVudHMuCgoyMDE5LTAxLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTQyMCBGaXggZ2RiIGRlYnVnZ2VyIGZ1bmN0aW9ucyAnc3dpZ3ByaW50JyBhbmQgJ2xvY3N3aWdwcmludCcgZnJvbSBzd2lnLmdkYiB0bwogICAgICAgICAgICB3b3JrIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgZ2RiLTguIEZpeGVzIGVycm9ycyB3aGVuIGRlYnVnZ2luZyBTV0lHIHNvdXJjZSB3aXRoIGdkYjoKCiAgICAgICAgICAgICAgKGdkYikgc3dpZ3ByaW50IG4KICAgICAgICAgICAgICBVbmRlZmluZWQgY29tbWFuZDogIlByaW50ZiIuICBUcnkgImhlbHAiLgoKMjAxOS0wMS0xNjogd3NmdWx0b24KICAgICAgICAgICAgUHl0aG9uIHN0YXRpYyBtZXRob2Qgd3JhcHBlciBjaGFuZ2VzCgogICAgICAgICAgICAtIFN0YXRpYyBtZXRob2Qgd3JhcHBlcnMgd2VyZSB1c2luZyB0aGUgJ2Zhc3Rwcm94eScgYXBwcm9hY2ggYnkgZGVmYXVsdC4KICAgICAgICAgICAgICBUaGlzIGlzIGluY29uc2lzdGVudCB3aXRoIGluc3RhbmNlIG1ldGhvZCB3cmFwcGVycy4gVGhlIGZhc3Rwcm94eSBhcHByb2FjaAogICAgICAgICAgICAgIGlzIG5vdyB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQgdG8gYmUgY29uc2lzdGVudCB3aXRoIGluc3RhbmNlIG1ldGhvZHMuCiAgICAgICAgICAgICAgU3RhdGljIG1ldGhvZCB3cmFwcGVycyBjYW4gbm93IGFsc28gYmUgY29udHJvbGxlZCB1c2luZyB0aGUgLWZhc3Rwcm94eSBhbmQKICAgICAgICAgICAgICAtb2xkZGVmcyBvcHRpb25zLgoKICAgICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzcyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgc3RhdG1ldGhvZChpbnQgYSA9IDIpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgZ2VuZXJhdGVzIGJ5IGRlZmF1bHQ6CgogICAgICAgICAgICAgIGNsYXNzIEtsYXNzKG9iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgICAgICAgICAgIGRlZiBzdGF0bWV0aG9kKGE9Mik6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V4YW1wbGUuS2xhc3Nfc3RhdG1ldGhvZChhKQoKICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgKHdoaWNoIGNhbiBiZSByZXN0b3JlZCBieSB1c2luZyAtZmFzdHByb3h5KToKCiAgICAgICAgICAgICAgICBjbGFzcyBLbGFzcyhvYmplY3QpOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgc3RhdG1ldGhvZCA9IHN0YXRpY21ldGhvZChfZXhhbXBsZS5LbGFzc19zdGF0bWV0aG9kKQoKICAgICAgICAgICAgICAtIE1vZGVybmlzZSB3cmFwcGVycyBmb3Igc3RhdGljIG1ldGhvZHMgdG8gdXNlIGRlY29yYXRvciBzeW50YXggLSBAc3RhdGljbWV0aG9kLgoKICAgICAgICAgICAgICAtIEFkZCBtaXNzaW5nIHJ1bnRpbWUgdGVzdCBmb3Igc3RhdGljIGNsYXNzIG1ldGhvZHMgYW5kIHVzaW5nIHRoZSBhY3R1YWwgY2xhc3MgbWV0aG9kLgoKMjAxOS0wMS0xMjogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MDMgIzExOTQgRml4IGNvbXBpbGF0aW9uIHByb2JsZW1zIGZvciBPQ2FtbCA+PSA0LjAzLjAgZHVlIHRvIE9DYW1sIHVzaW5nCiAgICAgICAgICAgIGludDY0X3QgaW5zdGVhZCBvZiBpbnQ2NC4KCjIwMTktMDEtMTE6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxNDAwIEZpeCB0aGUgZ2V0dGVycyBhbmQgc2V0dGVycyBvZiBub24tc3RhdGljIG1lbWJlciB2YXJpYWJsZXMuCgoyMDE5LTAxLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICAjMzU4IEFkZCBWT0lEIHRvIHdpbmRvd3MuaQoKMjAxOS0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgIzk0OCAjMTAxOSAjMTI3MyBGaXggZm9yIEMrKzExIHJhdyBzdHJpbmdzIHdoZXJlIHRoZSBkZWxpbWl0ZXJzIHdlcmUgbWlzdGFrZW5seSBsZWZ0CiAgICAgICAgICAgIGluIHRoZSBzdHJpbmcgY29udGVudHMgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgc3RyaW5nIHdhcyBjb3BpZWQgaW50byBnZW5lcmF0ZWQgY29kZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsICVjb25zdGFudCwgdGhlICJkb2NzdHJpbmciIGZlYXR1cmUgYW5kIGZvciBDIy9KYXZhL0QgY29uc3RhbnRzIHR1cm5lZCBvbgogICAgICAgICAgICB3aXRoICVqYXZhY29uc3QvJWNzY29uc3QvJWRtYW5pZmVzdGNvbnN0LgoKMjAxOS0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldICM1MzguIEZpeCBSdWJ5IHN1cHBvcnQgZm9yICVmZWF0dXJlKCJkb2NzdHJpbmciKS4KCjIwMTktMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgICMxMjAyIEZpeCBvdmVybG9hZGluZyBvZiBub24tcG9pbnRlciBjbGFzcyB0eXBlcyBpbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdoZW4gb3ZlcmxvYWRlZAogICAgICAgICAgICB3aXRoIGEgcG9pbnRlciBhbmQgYSBOVUxMIHNjcmlwdGluZyBsYW5ndWFnZSBlcXVpdmFsZW50IGlzIHVzZWQsIGVnIE5vbmUgaW4gUHl0aG9uLgoKICAgICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZXMgdGhlIFNXSUdUWVBFLCBTV0lHVFlQRSYgYW5kIFNXSUdUWVBFJiYgdHlwZWNoZWNrIHR5cGVtYXBzIHRvCiAgICAgICAgICAgIHByZXZlbnQgYWNjZXB0aW5nIGEgY29udmVyc2lvbiB0byBhIE5VTEwgcG9pbnRlci4KCjIwMTktMDEtMDM6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxMzg2IEZpeCB0aGUgT0NhbWwgZXhhbXBsZXMgYW5kIHRlc3Qgc3VpdGUgZm9yIG91dC1vZi1zb3VyY2UgYnVpbGRzLgoKMjAxOS0wMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzYzOSByZW1vdmUgZHVwbGljYXRlIHByb3h5IG1ldGhvZCBkZWZpbml0aW9ucyBmb3IgZ2xvYmFsIGZ1bmN0aW9uIHdyYXBwZXJzLgoKICAgICAgICAgICAgR2xvYmFsIGZ1bmN0aW9ucyBwcmV2aW91c2x5IGdlbmVyYXRlZCB0d28gZGVmaW5pdGlvbnMsIGVnOgoKICAgICAgICAgICAgICBkZWYgZm9vKCk6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfZXhhbXBsZS5mb28oKQogICAgICAgICAgICAgIGZvbyA9IF9leGFtcGxlLmZvbwoKICAgICAgICAgICAgVGhlIGZpcnN0IGRlZmluaXRpb24gaXMgcmVwbGFjZWQgYnkgdGhlIHNlY29uZCBkZWZpbml0aW9uIGFuZCBzbyB0aGUgc2Vjb25kIGRlZmluaXRpb24KICAgICAgICAgICAgaXMgdGhlIG9uZSB1c2VkIHdoZW4gdGhlIG1ldGhvZCBpcyBhY3R1YWxseSBjYWxsZWQuIE5vdyBqdXN0IHRoZSBmaXJzdCBkZWZpbml0aW9uIGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBieSBkZWZhdWx0IGFuZCBpZiB0aGUgLWZhc3Rwcm94eSBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHVzZWQsIGp1c3QgdGhlIHNlY29uZAogICAgICAgICAgICBkZWZpbml0aW9uIGlzIGdlbmVyYXRlZC4gVGhlIHNlY29uZCBkZWZpbml0aW9uIGlzIGZhc3RlciBhcyBpdCBhdm9pZHMgdGhlIHByb3h5IFB5dGhvbgogICAgICAgICAgICBtZXRob2QgYXMgaXQgY2FsbHMgdGhlIGxvdy1sZXZlbCBDIHdyYXBwZXIgZGlyZWN0bHkuIFVzaW5nIGJvdGggLWZhc3Rwcm94eSBhbmQgLW9sZGRlZnMKICAgICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbnMgd2lsbCByZXN0b3JlIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBjb2RlIGFzIGl0IHdpbGwgZ2VuZXJhdGUgYm90aAogICAgICAgICAgICBtZXRob2QgZGVmaW5pdGlvbnMuCgogICAgICAgICAgICBXaXRoIHRoaXMgY2hhbmdlLCB0aGUgd3JhcHBlcnMgZm9yIGdsb2JhbCBDL0MrKyBmdW5jdGlvbnMgYW5kIEMrKyBjbGFzcyBtZXRob2RzIG5vdyB3b3JrCiAgICAgICAgICAgIGluIHRoZSBzYW1lIHdheSB3cnQgdG8gZ2VuZXJhdGluZyBqdXN0IGEgcHJveHkgbWV0aG9kIGJ5IGRlZmF1bHQgYW5kIGNvbnRyb2wgdmlhCiAgICAgICAgICAgIC1mYXN0cHJveHkvLW9sZGRlZnMgb3B0aW9ucy4KCjIwMTgtMTItMjA6IGhhc2lub2ZmLHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTMzNCBTZXQgSmF2YSB0aHJlYWQgbmFtZSB0byBuYXRpdmUgdGhyZWFkIG5hbWUgd2hlbiB1c2luZyBkaXJlY3RvcnMuCgogICAgICAgICAgICBEZWZhdWx0IGlzIHRvIHVzZSBuYW1lICJUaHJlYWQtWFhYIiBhbmQgaXMgc3RpbGwgd29ya3MgbGlrZSB0aGlzIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsCiAgICAgICAgICAgIGFkZGluZyB0aGUgZm9sbG93aW5nIHdpbGwgdHVybiBvbiB0aGUgdGhyZWFkIG5hbWUgc2V0dGluZyAod29ya3MgZm9yIG1vcmUgcmVjZW50CiAgICAgICAgICAgIHZlcnNpb25zIG9mIExpbnV4IGFuZCBNYWNPUyk6CgogICAgICAgICAgICAlYmVnaW4gJXsKICAgICAgICAgICAgI2RlZmluZSBTV0lHX0pBVkFfVVNFX1RIUkVBRF9OQU1FCiAgICAgICAgICAgICV9CgoyMDE4LTEyLTIwOiBjaGxhbmRzaQogICAgICAgICAgICBbUHl0aG9uXSAjMTM1Ny4gRml4IG92ZXJyaWRpbmcgX19uZXdfXyBpbiBQeXRob24gMy42LgoKICAgICAgICAgICAgRml4ZXMgU3lzdGVtRXJyb3I6IE9iamVjdHMvdHVwbGVvYmplY3QuYzo4MTogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIgoKMjAxOC0xMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzg0OCAjMTM0MyBUaGUgbW9kdWxlIGltcG9ydCBsb2dpYyBoYXMgY2hhbmdlZCB0byBzdG9wIG9iZnVzY2F0aW5nIHJlYWwgSW1wb3J0RXJyb3IKICAgICAgICAgICAgcHJvYmxlbXMuIE9ubHkgb25lIGltcG9ydCBvZiB0aGUgbG93LWxldmVsIEMvQysrIG1vZHVsZSBmcm9tIHRoZSBwdXJlIFB5dGhvbiBtb2R1bGUgaXMKICAgICAgICAgICAgYXR0ZW1wdGVkIG5vdy4gUHJldmlvdXNseSBhIHNlY29uZCBpbXBvcnQgb2YgdGhlIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgd2FzIGF0dGVtcHRlZAogICAgICAgICAgICBhZnRlciBhbiBJbXBvcnRFcnJvciBvY2N1cnJlZCBhbmQgd2FzIGRvbmUgdG8gc3VwcG9ydCAnc3BsaXQgbW9kdWxlcycuIEEgJ3NwbGl0IG1vZHVsZScgaXMKICAgICAgICAgICAgYSBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSBwdXJlIFB5dGhvbiBtb2R1bGUgaXMgYSBtb2R1bGUgd2l0aGluIGEgUHl0aG9uIHBhY2thZ2UgYW5kIHRoZQogICAgICAgICAgICBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIGlzIGEgZ2xvYmFsIFB5dGhvbiBtb2R1bGUuIE5vdyBhICdzcGxpdCBtb2R1bGUnIGNvbmZpZ3VyYXRpb24gaXMKICAgICAgICAgICAgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBkZWZhdWx0LiBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHN1cHBvcnRlZCB3aXRoIGEgc2ltcGxlCiAgICAgICAgICAgIGN1c3RvbWl6YXRpb24sIHN1Y2ggYXM6CgogICAgICAgICAgICAgICVtb2R1bGUocGFja2FnZT0ibXlwYWNrYWdlIiwgbW9kdWxlaW1wb3J0PSJpbXBvcnQgJG1vZHVsZSIpIGZvbwoKICAgICAgICAgICAgb3IgaWYgdXNpbmcgLWJ1aWx0aW46CgogICAgICAgICAgICAgICVtb2R1bGUocGFja2FnZT0ibXlwYWNrYWdlIiwgbW9kdWxlaW1wb3J0PSJmcm9tICRtb2R1bGUgaW1wb3J0ICoiKSBmb28KCiAgICAgICAgICAgIGluc3RlYWQgb2YKCiAgICAgICAgICAgICAgJW1vZHVsZShwYWNrYWdlPSJteXBhY2thZ2UiKSBmb28KCiAgICAgICAgICAgIFNlZSB0aGUgdXBkYXRlZCBQeXRob24gY2hhcHRlciB0aXRsZWQgIkxvY2F0aW9uIG9mIG1vZHVsZXMiIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAxOC0xMi0xMTogdGxieQogICAgICAgICAgICBbUGVybF0gIzEzNzQgcmVwYWlyIEVYVEVORCgpIGhhbmRsaW5nIGluIHR5cGVtYXBzCgoyMDE4LTEyLTA2OiB2YWR6CiAgICAgICAgICAgICMxMzU5ICMxMzY0IEFkZCBtaXNzaW5nIG5lc3RlZCBjbGFzcyBkZXN0cnVjdG9yIHdyYXBwZXIgd2hlbiB0aGUgbmVzdGVkIGNsYXNzIGlzCiAgICAgICAgICAgIGluc2lkZSBhIHRlbXBsYXRlLiBSZW1vdmVzIGFzc29jaWF0ZWQgYm9ndXMgJ0lsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lJyB3YXJuaW5nLiBPbmx5CiAgICAgICAgICAgIG9jY3VycmVkIHdoZW4gdGhlIG5lc3RlZCBjbGFzcycgZGVzdHJ1Y3RvciBpcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KCjIwMTgtMTItMDQ6IGFkcjI2CiAgICAgICAgICAgIFtQeXRob25dICMxMzY4ICMxMzY5IEFjY2VzcyBWaW9sYXRpb24gaW4gdHBfcHJpbnQgY2F1c2VkIGJ5IG1pc21hdGNoZWQgUHl0aG9uL2V4dGVuc2lvbgogICAgICAgICAgICBDUlQgdXNhZ2UKCiAgICAgICAgICAgIFJlbW92ZSBhbGwgdXNlIG9mIHRwX3ByaW50LCBhcyB0aGlzIEFQSSB1c2VzIGEgRklMRSosIHdoaWNoIGNhbiBiZQogICAgICAgICAgICBtaXNtYXRjaGVkIHdoZW4gbW9kdWxlcyBhcmUgYnVpbHQgd2l0aCBkaWZmZXJlbnQgQyBsaWJyYXJpZXMgZnJvbQogICAgICAgICAgICB0aGUgbWFpbiBweXRob24gZXhlY3V0YWJsZS4KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gYnJpbmdzIGNvbnNpc3RlbnQgb3V0cHV0IGJldHdlZW4gUHl0aG9uIDIgYW5kIDMgZm9yIHRoZSAnY3ZhcicgU1dJRwogICAgICAgICAgICBvYmplY3QgKHRoYXQgY29udGFpbnMgdGhlIGdsb2JhbCB2YXJpYWJsZXMpIGFuZCBTV0lHIHBhY2tlZCBvYmplY3RzIChzdWNoIGFzIGNhbGxiYWNrCiAgICAgICAgICAgIGNvbnN0YW50cykuCgoyMDE4LTEyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI4MiBGaXggcnVubmluZyAncHl0aG9uIC1tJyAgd2hlbiB1c2luZyAnc3dpZyAtYnVpbHRpbicKCiAgICAgICAgICAgIFNpbWlsYXIgdG8gdGhlIGVhcmxpZXIgUEVQIDM2NiBjb25mb3JtaW5nIGZpeCBmb3Igbm9uLWJ1aWx0aW4uCgoyMDE4LTExLTI5OiBhZHIyNgogICAgICAgICAgICBbUHl0aG9uXSAjMTM2MCBMZWFrIG9mIFNXSUcgdmFyIGxpbmsgb2JqZWN0CgogICAgICAgICAgICBGaXggcmVmZXJlbmNlIGNvdW50aW5nIG9uIF9TV0lHX2dsb2JhbHMgdG8gYWxsb3cgdmFyIGxpbmsgdG8gYmUgZnJlZWQgb24gbW9kdWxlIHVubG9hZC4KCjIwMTgtMTEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gdXNpbmcgLWJ1aWx0aW4sIHRoZSB0d28gc3RlcCBDLWV4dGVuc2lvbiBtb2R1bGUgaW1wb3J0IGlzIG5vdwogICAgICAgICAgICBvbmUgc3RlcCBhbmQgdGhlIHdyYXBwZWQgQVBJIGlzIG9ubHkgYXZhaWxhYmxlIG9uY2UgYW5kIG5vdCBpbiBhbiB1bmRlcmx5aW5nCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgbGlrZSBpdCBpcyB3aXRob3V0IC1idWlsdGluLiBUbyB1bmRlcnN0YW5kIHRoaXMsIGNvbnNpZGVyIGEKICAgICAgICAgICAgbW9kdWxlIG5hbWVkICdleGFtcGxlJyAodXNpbmc6ICVtb2R1bGUgZXhhbXBsZSkuIFRoZSBDLWV4dGVuc2lvbiBpcyBjb21waWxlZCBpbnRvCiAgICAgICAgICAgIGEgUHl0aG9uIG1vZHVsZSBjYWxsZWQgJ19leGFtcGxlJyBhbmQgYSBwdXJlIFB5dGhvbiBtb2R1bGUgcHJvdmlkZXMgdGhlIGFjdHVhbAogICAgICAgICAgICBBUEkgZnJvbSB0aGUgbW9kdWxlIGNhbGxlZCAnZXhhbXBsZScuIEl0IHdhcyBwcmV2aW91c2x5IHBvc3NpYmxlIHRvIGFkZGl0aW9uYWxseQogICAgICAgICAgICBhY2Nlc3MgdGhlIEFQSSBmcm9tIHRoZSBtb2R1bGUgYXR0cmlidXRlICdleGFtcGxlLl9leGFtcGxlJy4gVGhlIGxhdHRlciB3YXMgYW4KICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlLiBJdCBzaG91bGRuJ3QgaGF2ZSBiZWVuIHVzZWQsIGJ1dAogICAgICAgICAgICBpZiBuZWNlc3NhcnkgaXQgY2FuIGJlIHJlc3VycmVjdGVkIHVzaW5nIHRoZSBtb2R1bGVpbXBvcnQgYXR0cmlidXRlIGRlc2NyaWJlZCBpbiB0aGUKICAgICAgICAgICAgUHl0aG9uIGNoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24uIElmIGJvdGggbW9kdWxlcyBhcmUgcHJvdmlkZWQgaW4gYSBQeXRob24KICAgICAgICAgICAgcGFja2FnZSwgdHJ5OgoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iZnJvbSAuIGltcG9ydCBfZXhhbXBsZVxuZnJvbSAuX2V4YW1wbGUgaW1wb3J0ICoiKSBleGFtcGxlCiAgICAgICAgICAgIG9yIG1vcmUgZ2VuZXJpY2FsbHk6CiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImZyb20gLiBpbXBvcnQgJG1vZHVsZVxuZnJvbSAuJG1vZHVsZSBpbXBvcnQgKiIpIGV4YW1wbGUKCiAgICAgICAgICAgIGFuZCBpZiBib3RoIGFyZSBwcm92aWRlZCBhcyBnbG9iYWwgbW9kdWxlcywgdHJ5OgoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0IF9leGFtcGxlXG5mcm9tIF9leGFtcGxlIGltcG9ydCAqIikgZXhhbXBsZQogICAgICAgICAgICBvciBtb3JlIGdlbmVyaWNhbGx5OgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgJG1vZHVsZVxuZnJvbSAkbW9kdWxlIGltcG9ydCAqIikgZXhhbXBsZQoKICAgICAgICAgICAgVGhlIG1vZHVsZSBpbXBvcnQgY29kZSBzaG93biB3aWxsIGFwcGVhciBpbiB0aGUgZXhhbXBsZS5weSBmaWxlLgoKMjAxOC0xMS0yNDogdmFkegogICAgICAgICAgICAjMTM1OCBGaXggaGFuZGxpbmcgb2YgYWJzdHJhY3QgYmFzZSBjbGFzc2VzIG5lc3RlZCBpbnNpZGUgdGVtcGxhdGVzCgogICAgICAgICAgICBDb3JyZWN0IGRldGVjdGluZyBvZiB3aGV0aGVyIGEgZGVyaXZlZCBjbGFzcyBtZXRob2Qgb3ZlcnJpZGVzIGEgcHVyZSB2aXJ0dWFsCiAgICAgICAgICAgIGJhc2UgY2xhc3MgbWV0aG9kIHdoZW4gYm90aCBjbGFzc2VzIGFyZSBuZXN0ZWQgaW5zaWRlIGEgdGVtcGxhdGUgY2xhc3M6IHRoaXMKICAgICAgICAgICAgbm90YWJseSBkaWRuJ3Qgd29yayBjb3JyZWN0bHkgZm9yIG1ldGhvZHMgdGFraW5nIHBhcmFtZXRlcnMgb2YgdGhlIGJhc2UgY2xhc3MKICAgICAgICAgICAgdHlwZS4KCjIwMTgtMTEtMjI6IHJ1cGVydG5hc2gKICAgICAgICAgICAgW1B5dGhvbl0gIzEyODIgTWFrZSBnZW5lcmF0ZWQgbW9kdWxlIHJ1bm5hYmxlIHZpYSBweXRob24gLW0gKFBFUCAzNjYgY29uZm9ybWluZykKCiAgICAgICAgICAgIFByZXZpb3VzbHkgYW55IFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgaW4gYSBwYWNrYWdlIHdvdWxkIGZhaWwgd2l0aCBhbiBJbXBvcnRFcnJvcgogICAgICAgICAgICB3aGVuIHVzaW5nICdweXRob24gLW0nIGZvciBleGFtcGxlICdweXRob24gLW0gbXlwa2cubXltb2R1bGUnLgoKICAgICAgICAgICAgVGhpcyBmaXggYWxzbyBhbGxvd3MgdGhlIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZSB0byBiZSBwbGFjZWQgaW50byBhIGRpcmVjdG9yeSBhbmQKICAgICAgICAgICAgdGhlbiByZW5hbWVkIF9faW5pdF9fLnB5IHRvIGNvbnZlcnQgdGhlIG1vZHVsZSBpbnRvIGEgcGFja2FnZSBhZ2Fpbi4gVGhpcyBhYmlsaXR5CiAgICAgICAgICAgIHN0b3BwZWQgd29ya2luZyBpbiBzd2lnLTMuMC45LiBIb3dldmVyLCBvbmx5IFB5dGhvbiAyLjcgb3IgMy4zIGFuZCBsYXRlciB3b3JrLiBJZgogICAgICAgICAgICBQeXRob24gMy4yIHN1cHBvcnQgaXMgbmVlZGVkLCB1c2UgbW9kdWxlaW1wb3J0IGluICVtb2R1bGUgdG8gY3VzdG9taXNlIHRoZSBpbXBvcnQKICAgICAgICAgICAgY29kZS4KCjIwMTgtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgICMxMzQwIFJlbW92ZSAtY3BwY2FzdCBhbmQgLW5vY3BwY2FzdCBjb21tYW5kIGxpbmUgb3B0aW9ucyAodGhpcyB3YXMgYW4gb3B0aW9uCiAgICAgICAgICAgIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIHRhcmdldHMpLgoKICAgICAgICAgICAgVGhlIC1jcHBjYXN0IG9wdGlvbiBpcyBzdGlsbCB0dXJuZWQgb24gYnkgZGVmYXVsdC4gVGhlIC1ub2NwcGNhc3Qgb3B0aW9uCiAgICAgICAgICAgIHRvIHR1cm4gb2ZmIHRoZSB1c2Ugb2YgYysrIGNhc3RzIChjb25zdF9jYXN0LCBzdGF0aWNfY2FzdCBldGMpIGhhcyBiZWVuCiAgICAgICAgICAgIHJlbW92ZWQuIEhvd2V2ZXIsIGRlZmluaW5nIFNXSUdfTk9fQ1BMVVNQTFVTX0NBU1Qgd2lsbCBzdGlsbCBnZW5lcmF0ZSBDIGNhc3RzCiAgICAgICAgICAgIGluc3RlYWQgb2YgQysrIGNhc3RzIGZvciBDKysgd3JhcHBlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMzQwIFJlbW92ZSAtb3V0cHV0dHVwbGUgYW5kIC1ub291dHB1dHR1cGxlIGNvbW1hbmQgbGluZSBvcHRpb25zLgoKICAgICAgICAgICAgQm90aCB0aGUgY29tbWFuZCBsaW5lIGFuZCAlbW9kdWxlIG9wdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBoYXZlIGJlZW4KICAgICAgICAgICAgcmVtb3ZlZC4gVGhlc2Ugd2VyZSB1bmRvY3VtZW50ZWQuIFRoZSAtb3V0cHV0dHVwbGUgb3B0aW9uIHJldHVybmVkIGEKICAgICAgICAgICAgUHl0aG9uIHR1cGxlIGluc3RlYWQgb2YgYSBsaXN0LCBtb3N0bHkgdHlwaWNhbGx5IGluIHRoZSBPVVRQVVQKICAgICAgICAgICAgdHlwZW1hcCBpbXBsZW1lbnRhdGlvbnMuCgogICAgICAgICAgICBJdCB1bmNsZWFyIHdoeSBhIHR1cGxlIGluc3RlYWQgb2YgYSBsaXN0IHJldHVybiB0eXBlIGlzIG5lZWRlZCBhbmQKICAgICAgICAgICAgaGVuY2UgdGhpcyBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhcyBwYXJ0IG9mIHRoZSBzaW1wbGlmaWNhdGlvbiBvZgogICAgICAgICAgICB0aGUgU1dJRyBQeXRob24gY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIFNXSUcgNC4KCjIwMTgtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMzQwIFJlbW92ZSAtbm9wcm94eWltcG9ydCBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgVGhpcyBvcHRpb24gdHVybmVkIG9mZiB0aGUgaW5zZXJ0aW9uIG9mIFB5dGhvbiBpbXBvcnQgc3RhdGVtZW50cwogICAgICAgICAgICBkZXJpdmVkIGZyb20gYSAlaW1wb3J0IGRpcmVjdGl2ZS4gRm9yIGV4YW1wbGUgZ2l2ZW46CgogICAgICAgICAgICAgICVtb2R1bGUgbW9kdWxlX2IKICAgICAgICAgICAgICAlaW1wb3J0ICJtb2R1bGVfYS5pIgoKICAgICAgICAgICAgdGhlbiBtb2R1bGVfYi5weSB3aWxsIGNvbnRhaW46CgogICAgICAgICAgICAgIGltcG9ydCBtb2R1bGVfYQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTEwLTI5OiBBbGV4YW5kZXJHYWJyaWVsCgkgICAgW1BIUF0gVGhlIGZvbGxvd2luZyBQSFA3IHJlc2VydmVkIGtleXdvcmRzIGFyZSBub3cgb25seSByZW5hbWVkIGJ5CgkgICAgU1dJRyB3aGVuIHVzZWQgYXMgZnVuY3Rpb24gbmFtZXMgaW4gdGhlIEFQSSBiZWluZyB3cmFwcGVyOgoJICAgIF9faGFsdF9jb21waWxlciBhcnJheSBkaWUgZWNobyBlbXB0eSBldmFsIGV4aXQgaW5jbHVkZSBpbmNsdWRlX29uY2UKCSAgICBpc3NldCBsaXN0IHByaW50IHJlcXVpcmUgcmVxdWlyZV9vbmNlIHJldHVybiB1bnNldAoKMjAxOC0xMC0yMjogb2xseSx3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI2MSAjMTM0MCBUdXJuIG9uIG1hbnkgb3B0aW1pc2F0aW9uIG9wdGlvbnMgYnkgZGVmYXVsdCBhbmQgcmF0aW9uYWxpc2UgdGhlCiAgICAgICAgICAgIG51bWJlciBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucy4KCiAgICAgICAgICAgIFRoZXJlIHdlcmUgYW4gdW5uZWNlc3NhcnkgbnVtYmVyIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBtYW55IG9mIHRoZXNlIGhhdmUgbm93CiAgICAgICAgICAgIGJlZW4gcmVtb3ZlZCBpbiBhIGRyaXZlIGZvciBzaW1wbGlmaWNhdGlvbi4gU29tZSB3ZXJlIG5lZWRlZCB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zCiAgICAgICAgICAgIG9mIFB5dGhvbiAoMi42IGFuZCBlYXJsaWVyKS4KCiAgICAgICAgICAgIE1hbnkgb2YgdGhlIG9wdGlvbnMgY291bGQgYmUgdHVybmVkIG9uIGluZGl2aWR1YWxseSBhbmQgd2hlbiB1c2luZyAtTy4gUHJldmlvdXNseSAtTwogICAgICAgICAgICByZXN1bHRlZCBpbiB0dXJuaW5nIG9uIGEgc2V0IG9mIG9wdGlvbnM6CgogICAgICAgICAgICAgIC1tb2Rlcm4gLWZhc3RkaXNwYXRjaCAtbm9zYWZlY3N0cmluZ3MgLWZ2aXJ0dWFsIC1ub3Byb3h5ZGVsCiAgICAgICAgICAgICAgLWZhc3Rwcm94eSAtZmFzdGluaXQgLWZhc3R1bnBhY2sgLWZhc3RxdWVyeSAtbW9kZXJuYXJncyAtbm9idWlsZG5vbmUKCiAgICAgICAgICAgIE5vdyAtTyByZXN1bHRzIGluIHR1cm5pbmcgb24gdGhpcyByZWR1Y2VkIHNldDoKCiAgICAgICAgICAgICAgLWZhc3RkaXNwYXRjaCAtZmFzdHByb3h5IC1mdmlydHVhbAoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBub3cgb24gYnkgZGVmYXVsdCwgYSBkZXByZWNhdGVkIHdhcm5pbmcgaXMgZGlzcGxheWVkIGlmIHRoZXkKICAgICAgICAgICAgYXJlIHVzZWQ6CiAgICAgICAgICAgICAgLWZhc3Rpbml0ICAgICBDbGFzcyBpbml0aWFsaXNhdGlvbiBjb2RlIGRvbmUgaW4gQy9DKysgcmF0aGVyIHRoYW4gaW4gUHl0aG9uIGNvZGUuCiAgICAgICAgICAgICAgLWZhc3RxdWVyeSAgICBQeXRob24gZGljdGlvbmFyeSB1c2VkIGZvciBsb29rdXAgb2YgdHlwZXMuCiAgICAgICAgICAgICAgLWZhc3R1bnBhY2sgICBGYXN0ZXIgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiBDL0MrKyB3cmFwcGVycy4KICAgICAgICAgICAgICAtbW9kZXJuICAgICAgIFVzZSBQeXRob24gMi4zIGZlYXR1cmVzIHN1Y2ggYXMgb2JqZWN0IGFuZCBwcm9wZXJ0eS4KICAgICAgICAgICAgICAtbW9kZXJuYXJncyAgIFVzZSBQeXRob24gMi4zIEMgQVBJcyBmb3IgdW5wYWNraW5nIGFyZ3VtZW50cyBpbiB0dXBsZXMuCiAgICAgICAgICAgICAgLW5vcHJveHlkZWwgICBTdG9wIGdlbmVyYXRpbmcgYSBwcm94eSBfX2RlbF9fIG1ldGhvZCBmb3IgYmFja3dhcmRzIGNvbXBhdGlibGl0eS4KICAgICAgICAgICAgICAtc2FmZWNzdHJpbmdzIE5vIGRpc2Nlcm5hYmxlIGRpZmZlcmVuY2UKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZCBhbHRvZ2V0aGVyOgogICAgICAgICAgICAgIC1hbGlhc29iajAKICAgICAgICAgICAgICAtYnVpbGRub25lCiAgICAgICAgICAgICAgLWNsYXNzcHRyCiAgICAgICAgICAgICAgLW5ld19yZXByCiAgICAgICAgICAgICAgLW5ld3JlcHIKICAgICAgICAgICAgICAtbm9hbGlhc29iajAKICAgICAgICAgICAgICAtbm9idWlsZG5vbmUKICAgICAgICAgICAgICAtbm9jYXN0bW9kZQogICAgICAgICAgICAgIC1ub2RpcnZ0YWJsZQogICAgICAgICAgICAgIC1ub2V4dHJhbmF0aXZlCiAgICAgICAgICAgICAgLW5vZmFzdGluaXQKICAgICAgICAgICAgICAtbm9mYXN0cHJveHkKICAgICAgICAgICAgICAtbm9mYXN0cXVlcnkKICAgICAgICAgICAgICAtbm9tb2Rlcm4KICAgICAgICAgICAgICAtbm9tb2Rlcm5hcmdzCiAgICAgICAgICAgICAgLW5vb3V0cHV0dHVwbGUKICAgICAgICAgICAgICAtbm9zYWZlY3N0cmluZ3MKICAgICAgICAgICAgICAtb2xkX3JlcHIKICAgICAgICAgICAgICAtb2xkcmVwcgogICAgICAgICAgICAgIC1wcm94eWRlbAoKICAgICAgICAgICAgLW5ld192d20gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIHRoZSAtbmV3dndtIGFsaWFzIGluc3RlYWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMTAtMjI6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gIzEyNjEgUmVtb3ZlIGNvbW1hbmQgbGluZSBvcHRpb24gbm8gbG9uZ2VyIG5lZWRlZCBhcyBQeXRob24gMi4zIGFuZCBlYXJsaWVyCiAgICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkOgoKICAgICAgICAgICAgICAtY2xhc3NpYwoKMjAxOC0xMC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0QsIEdvLCBHdWlsZSwgTHVhLCBNenNjaGVtZSwgT2NhbWwsIFBlcmw1LCBQaHAsIFNjaWxhYiwgVGNsXQogICAgICAgICAgICBBbGxvdyB3cmFwcGluZyBvZiBzdGQ6Om1hcCB1c2luZyBub24tZGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uLgoKMjAxOC0xMC0wOTogdmFkegogICAgICAgICAgICBbSmF2YV0gIzEyNzQgQWxsb3cgd3JhcHBpbmcgb2Ygc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTgtMTAtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMTI2IEZpeCBDIGRlZmF1bHQgYXJndW1lbnRzIHdpdGggLWJ1aWx0aW4gYW5kIC1mYXN0dW5wYWNrIGFuZCAtbW9kZXJuYXJncy4KICAgICAgICAgICAgUHJvYmxlbSBvY2N1cnJlZCB3aGVuIHRoZXJlIGlzIGp1c3Qgb25lIChkZWZhdWx0ZWQpIHBhcmFtZXRlciBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCgoyMDE4LTA5LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTMxOSBDKysxMSBoYXNoIHRhYmxlcyBpbXBsZW1lbnRhdGlvbiBpcyBmaW5pc2hlZCBub3cgKGluY2x1ZGluZyBmb3IgLWJ1aWx0aW4pOgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQKCjIwMTgtMDktMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCB3aGVuIHVzaW5nIC1idWlsdGluIGFuZCB3cmFwcGluZyBzdGQ6Om1hcCwgc3RkOjpzZXQsIHN0ZDo6dW5vcmRlcmVkX21hcCBvcgogICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQgdG8gZW5zdXJlIF9fY29udGFpbnNfXyBpcyBjYWxsZWQuIFRoaXMgaXMgYSB3cmFwcGVyIGZvciB0aGUgU1RMCiAgICAgICAgICAgIGNvbnRhaW5lcidzIGZpbmQgbWV0aG9kLiBXaXRob3V0IGl0LCBQeXRob24gd2lsbCBkbyBpdHMgb3duIHNsb3dlciBzZXF1ZW5jZSBzZWFyY2guCgoyMDE4LTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggZnVuY3RvcnMgKHdyYXBwZWQgYXMgX19jYWxsX18pIHdoZW4gdXNpbmcgLWJ1aWx0aW4gLW1vZGVybiAtZmFzdHVucGFjay4KCjIwMTgtMDktMDI6IGFuZHJlYXMuZ2FlZXIsdGtyYXNudWtoYQogICAgICAgICAgICBbUHl0aG9uXSAjMTMyMSBGaXggYXNzZXJ0IGluIFB5VHVwbGVfR0VUX1NJWkUgaW4gZGVidWcgaW50ZXJwcmV0ZXIgYnVpbGRzIG9mIHB5dGhvbi0zLjcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRwX25ldy4KCjIwMTgtMDktMDE6IENocmlzdG9waGVySG9nYW4KICAgICAgICAgICAgW0d1aWxlXSAjMTI4OCBGaXggZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBndWlsZSA+PSAyLjAuMTIuCgoyMDE4LTA4LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTMxOSBDKysxMSBoYXNoIHRhYmxlcyBzdXBwb3J0OgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQKICAgICAgICAgICAgaXMgbm93IGNvbXBpbGluZyBhbmQgd29ya2luZyAoc29ydGluZyB1c2luZyAtYnVpbHRpbiBub3QgZnVsbHkgZnVuY3Rpb25hbCB5ZXQgdGhvdWdoKS4KCjIwMTgtMDgtMjA6IHdrYWxpbmluCiAgICAgICAgICAgICMxMzA1IEZpeCBuZXN0ZWQgc3RydWN0dXJlIHN5bWJvbCB0YWJsZXMgaW4gQyBtb2RlIHRvIGZpeCBtZW1iZXIgbmFtZSBjb25mbGljdHMKICAgICAgICAgICAgaW4gZGlmZmVyZW50IHN0cnVjdHMgd2l0aCB0aGUgc2FtZSBuZXN0ZWQgc3RydWN0IG1lbWJlciBuYW1lLgoKMjAxOC0wOC0xODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzY4OCBGaXggbWFrZWZpbGUgcmVjdXJzaW9uIHdoZW4gcnVubmluZyBweXRob24gdGVzdC1zdWl0ZS4KCjIwMTgtMDgtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMzEwIFJlLWltcGxlbWVudCBQeXRob24gLWZhc3Rwcm94eSBvcHRpb24uCgogICAgICAgICAgICBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gZmFpbGVkIHdpdGggUHl0aG9uIDMgYW5kIGFic3RyYWN0IGJhc2UgY2xhc2VzLgogICAgICAgICAgICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHJlcGxhY2VzIHRoZSBQeXRob24gMiBpbXBsZW1lbnRhdGlvbiB1c2luZwogICAgICAgICAgICBuZXcuaW5zdGFuY2VtZXRob2Qgd2l0aCB0aGUgQyBBUEkgUHlNZXRob2RfTmV3IHRvIG1hdGNoIHRoZSBlcXVpdmFsZW50IFB5dGhvbiAzCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoaWNoIHVzZXMgUHlJbnN0YW5jZU1ldGhvZF9OZXcuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHJ1bnMgc2xpZ2h0bHkgZmFzdGVyLiBTZWUgIzEzMTAuCgoyMDE4LTA4LTEyOiBnbWF6emFtdXRvCiAgICAgICAgICAgIFtQeXRob25dICMxMjgzIFVwZGF0ZSBweWJ1ZmZlci5pIGxpYnJhcnkgdG8gdXNlIG5ldy1zdHlsZSBQeXRob24gYnVmZmVyIEMgQVBJLgoKMjAxOC0wOC0xMjogYnJpYW5oYXR3b29kLHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTMwMyAjMTMwNCBGaXggY3Jhc2ggaW4gZGlyZWN0b3JzIHdoZW4gdXNpbmcgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGFuZAogICAgICAgICAgICBwYXNzaW5nIE5VTEwgcG9pbnRlcnMgaW4gQysrIHRvIGRpcmVjdG9yIG1ldGhvZCBvdmVybG9hZGVkIGFuZCBpbXBsZW1lbnRlZCBpbiBKYXZhLgoKMjAxOC0wOC0xMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyOTMgSW1wcm92ZSBUeXBlRXJyb3IgbWVzc2FnZSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBkZWZhdWx0IGFuZCBmYXN0ZGlzcGF0Y2gKICAgICAgICAgICAgbW9kZSB3aGVuIGhhbmRsaW5nIG92ZXJsb2FkZWQgQysrIGZ1bmN0aW9ucy4gUHJldmlvdXNseSB0aGUgZXJyb3IgbWVzc2FnZSBkaWQgbm90IGFsd2F5cwogICAgICAgICAgICBkaXNwbGF5IHRoZSBwb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGluIGZhc3RkaXNwYXRjaCBtb2RlLgoKMjAxOC0wOC0wMjogZnVyeWx5bngsamFjb2J3Z2lsbGVzcGllLHAyawogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzEyOTAsICM5NjguIEFkZCBzdXBwb3J0IGZvciBOb2RlSlMgdmVyc2lvbnMgMi0xMC4KCjIwMTgtMDctMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjkzIE92ZXJsb2FkZWQgQysrIGZ1bmN0aW9uIHdyYXBwZXJzIG5vdyByYWlzZSBhIFR5cGVFcnJvciBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE5vdEltcGxlbWVudGVkRXJyb3Igd2hlbiB0aGUgdHlwZXMgcGFzc2VkIGFyZSBpbmNvcnJlY3QuIFRoaXMgY2hhbmdlIG1lYW5zCiAgICAgICAgICAgIHRoZXJlIGlzIG5vdyBjb25zaXN0ZW5jeSB3aXRoIG5vbi1vdmVybG9hZGVkIGZ1bmN0aW9uIHdyYXBwZXJzIHdoaWNoIGhhdmUgYWx3YXlzCiAgICAgICAgICAgIHJhaXNlZCBUeXBlRXJyb3Igd2hlbiB0aGUgaW5jb3JyZWN0IHR5cGVzIGFyZSBwYXNzZWQuIFRoZSBlcnJvciBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgdGhlIHNhbWUgYW5kIGlzIGZvciBleGFtcGxlIG5vdzoKCiAgICAgICAgICAgICAgVHlwZUVycm9yOiBXcm9uZyBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ2YnLgogICAgICAgICAgICAgICAgUG9zc2libGUgQy9DKysgcHJvdG90eXBlcyBhcmU6CiAgICAgICAgICAgICAgICAgIGYoaW50KQogICAgICAgICAgICAgICAgICBmKGNoYXIgY29uc3QgKikKCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CgogICAgICAgICAgICAgIE5vdEltcGxlbWVudGVkRXJyb3I6IFdyb25nIG51bWJlciBvciB0eXBlIG9mIGFyZ3VtZW50cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbiAnZicuCiAgICAgICAgICAgICAgICBQb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGFyZToKICAgICAgICAgICAgICAgICAgZihpbnQpCiAgICAgICAgICAgICAgICAgIGYoY2hhciBjb25zdCAqKQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzE4IEZpeCBweXRob25ub25keW5hbWljIGZlYXR1cmUgZm9yIG1vZGVybiBjbGFzc2VzCgogICAgICAgICAgICBGaXhlcyBub25keW5hbWljIG1vZGUgd2hlbiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzZXQgd2l0aCB0aGUgc2FtZQogICAgICAgICAgICBuYW1lIGFzIGEgY2xhc3MgdmFyaWFibGUgaW4gYSBjbGFzcyBkZXJpdmVkIGZyb20gYSBTV0lHIHByb3h5IGNsYXNzLgogICAgICAgICAgICBUaGlzIGNvcm5lciBjYXNlIHNldCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gQXR0cmlidXRlRXJyb3IuCgogICAgICAgICAgICBBbHNvIGZpeCAlcHl0aG9ubm9uZHluYW1pYyBpbiBQeXRob24gMyB3aXRoIC1tb2Rlcm4uIFRoZSBtZXRhY2xhc3MKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgaW1wbGVtZW50YXRpb24gd2FzIHByZXZpb3VzbHkgbm90IGJlaW5nIGFwcGxpZWQgaW4gUHl0aG9uIDMuCgoyMDE4LTA3LTE3OiBwZXRybWl0cmljaGV2LHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjc1ICMxMjc5IEluaXRpYWxpemUgZnVuY3Rpb24tbG9jYWwgc3RhdGljcyAoc2luZ2xldG9ucykgdGhhdCBjYWxsIFB5dGhvbgogICAgICAgICAgICBjb2RlIGR1cmluZyBQeXRob24gbW9kdWxlIGluaXRpYWxpemF0aW9uIGluIG9yZGVyIHRvIGF2b2lkIGRlYWRsb2NrcyB3aXRoIHN1YnNlcXVlbnQKICAgICAgICAgICAgbXVsdGktdGhyZWFkZWQgdXNhZ2UuCgoyMDE4LTA2LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2VnIGZhdWx0IHVzaW5nIFB5dGhvbiAyIHdoZW4gcGFzc2luZyBhIFB5dGhvbiBzdHJpbmcsIGNvbnRhaW5pbmcKICAgICAgICAgICAgaW52YWxpZCB1dGYtOCBjb250ZW50LCB0byBhIHdzdHJpbmcgb3Igd2NoYXIgKiBwYXJhbWV0ZXIuIEEgVHlwZUVycm9yIGlzIHRocm93biBpbnN0ZWFkLCBlZzoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF93c3RyaW5nLmk+CiAgICAgICAgICAgICAgdm9pZCBpbnN0cmluZyhjb25zdCBzdGQ6OndzdHJpbmcmIHMpOwoKICAgICAgICAgICAgICBpbnN0cmluZyhiImhceGU5bGxvb28iKSAjIFB5dGhvbgoKMjAxOC0wNi0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuNyBzdXBwb3J0OiBSZXBsYWNlIHVzZSBvZiBkZXByZWNhdGVkIFB5VW5pY29kZV9HZXRTaXplIHdpdGgKICAgICAgICAgICAgUHlVbmljb2RlX0dldExlbmd0aCB0byByZW1vdmUgZGVwcmVjYXRlZCB3YXJuaW5ncyBjb21waWxpbmcgdGhlIEMvQysrIHdyYXBwZXJzLgoKMjAxOC0wNi0xMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuNyBzdXBwb3J0OiBUaGUgJXB5dGhvbmFiYyBmZWF0dXJlIGluIHB5YWJjLmkgbm93IHVzZXMgYmFzZSBjbGFzc2VzCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZQogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZwogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0CiAgICAgICAgICAgIGluc3RlYWQgb2YKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlU2VxdWVuY2UKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZwogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLk11dGFibGVTZXQKICAgICAgICAgICAgYXMgdGhlIGxhdHRlciBhcmUgZGVwcmVjYXRlZCBpbiBQeXRob24gMy43IGFuZCBhcmUgZHVlIHRvIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4KICAgICAgICAgICAgVGhlIGNsYXNzZXMgaW4gY29sbGVjdGlvbnMuYWJjLiogYXJlIGF2YWlsYWJsZSBmcm9tIFB5dGhvbiAzLjMgb253YXJkcy4gSWYgeW91CiAgICAgICAgICAgIHJlcXVpcmUgc3VwcG9ydCBmb3IgUHl0aG9uIDMuMiwgdGhlbiBjb3B5IHRoZSBweWFiYy5pIGZpbGUgYW5kIG1vZGlmeSBieSByZW1vdmluZwogICAgICAgICAgICB0aGUgZmV3IGluc3RhbmNlcyBvZiB0aGUgLmFiYyBzdWItbW9kdWxlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTEyOiBvbGx5LHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM3MDEgUmVtb3ZlIHN1cHBvcnQgZm9yIFB5dGhvbiB2ZXJzaW9ucyA8IDIuNyBhbmQgMy4wIGFuZCAzLjEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMTE6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IG5ldyBHQ0M4IHdhcm5pbmdzIGluIGdlbmVyYXRlZCBjb2RlIGJ5IGF2b2lkaW5nIGNhc3RzCiAgICAgICAgICAgIGJldHdlZW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9uIHR5cGVzIHdoZXJlIHBvc3NpYmxlLCBhbmQgYnkKICAgICAgICAgICAgc3VwcHJlc3NpbmcgdGhlIHdhcm5pbmcgd2hlbiBpdCdzIGR1ZSB0byB0aGUgZGVzaWduIG9mIFB5dGhvbidzIEMKICAgICAgICAgICAgQVBJLiAgRml4ZXMgIzEyNTkuCgoyMDE4LTA2LTA4OiBwaGlsaXBwa3JhZnQKCSAgICBbUHl0aG9uXSBTdG9wIGV4cG9zaW5nIDxDTEFTUz5fc3dpZ3JlZ2lzdGVyIHRvIFB5dGhvbi4gIEl0J3Mgbm90CgkgICAgdXNlZnVsIGZvciB1c2VyIFB5dGhvbiBjb2RlIHRvIGNhbGwgdGhpcywgYW5kIGl0IGp1c3QgY2x1dHRlcnMgdGhlCgkgICAgQVBJIHVubmVjZXNzYXJpbHkuICBGaXhlcyAjMTIyNS4KCjIwMTgtMDYtMDc6IGNtZm9pbCwga2FiYmksIEphbWllIEtpcmtwYXRyaWNrLCBtYXJrb2szMTQsIHZhZHosIHdzZnVsdG9uLCBZYW5uIERpb3JjZXQKICAgICAgICAgICAgIzE3MCBEb3h5Z2VuIGRvY3VtZW50YXRpb24gc3VwcG9ydCBhZGRlZC4gVGhpcyBhbGxvd3MgdHJhbnNsYXRpb24gb2YgRG94eWdlbiBjb21tZW50cwogICAgICAgICAgICBpbnRvIEphdmFEb2MgYW5kIFB5RG9jIGRvY3VtZW50YXRpb24uIEl0IGlzIGVuYWJsZWQgdmlhIHRoZSAtZG94eWdlbiBjb21tYW5kIGxpbmUKICAgICAgICAgICAgb3B0aW9uLiBTZWUgdGhlIERveHlnZW4uaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgoKMjAxOC0wNi0wNzogb2xseQoJICAgIFtQSFBdIFdlJ3ZlIGZpbmFsbHkgcmVtb3ZlZCBzdXBwb3J0IGZvciAlcHJhZ21hKHBocDQpIHdoaWNoIHdhcwoJICAgIGRlcHJlY2F0ZWQgYmFjayBpbiAyMDA4LiAgVXNlICVwcmFnbWEocGhwKSBpbnN0ZWFkLCB3aGljaCBoYXMgYmVlbgoJICAgIHN1cHBvcnRlZCBzaW5jZSBhdCBsZWFzdCAyMDA1LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE4LTA2LTA3OiBvbGx5CgkgICAgW1BIUDVdIFN1cHBvcnQgZm9yIFBIUDUgaGFzIGJlZW4gcmVtb3ZlZC4gIFBIUDUgaXMgbm8gbG9uZ2VyCgkgICAgYWN0aXZlbHkgc3VwcG9ydGVkIGJ5IHRoZSBQSFAgZGV2ZWxvcGVycyBhbmQgc2VjdXJpdHkgc3VwcG9ydCBmb3IKCSAgICBpdCBlbmRzIGNvbXBsZXRlbHkgYXQgdGhlIGVuZCBvZiAyMDE4LCBzbyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UKCSAgICB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGl0IGluIHRoZSB1cGNvbWluZyBTV0lHIDQuMC4wIHJlbGVhc2UuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMDY6IG9sbHkKCSAgICBbTHVhXSBJbXByb3ZlIGNvbmZpZ3VyZSBwcm9iZXMgZm9yIEx1YSBoZWFkZXJzIGFuZCBsaWJzIHVzZWQgaW4gdGVzdHN1aXRlLgoKMjAxOC0wNS0xNToga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBhZGQgc3VwcG9ydCBmb3IgdmVyc2lvbiA0LjQKICAgICAgICAgICAgLSBTaG91bGQgbm90IGludHJvZHVjZSBhbnkgdXNlci12aXNpYmxlIGluY29tcGF0aWJpbGl0aWVzCgoyMDE4LTA1LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEphdmFdIEZpeCBsb29rdXAgb2YgY3Njb25zdHJ1Y3QsIGRjb25zdHJ1Y3QgYW5kIGphdmFjb25zdHJ1Y3QgdHlwZW1hcHMuCiAgICAgICAgICAgIFRoZSBDKysgbmFtZXNwYWNlIHdhcyBwcmV2aW91c2x5IGlnbm9yZWQgd2hlbiBsb29raW5nIHVwIHRoZSB0eXBlbWFwLgoKMjAxOC0wNS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFzY3JpcHRdIEZpeCBnZW5lcmF0ZWQgQysrIGNvZGUgd2hlbiB1c2luZyAlbnNwYWNlIG9uIG5hbWVzcGFjZXMgdGhhdCBhcmUgbW9yZQogICAgICAgICAgICB0aGFuIHR3byBsZXZlbHMgZGVlcC4KCjIwMTgtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMjUxIEFkZCBzdXBwb3J0IGZvciBDKysxNyBuZXN0ZWQgbmFtZXNwYWNlIGRlZmluaXRpb25zLAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBuYW1lc3BhY2UgQTo6QiB7IC4uLiB9CgoyMDE4LTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEphdmFdIEFkZCBzdXBwb3J0IHNvIHRoYXQgdGhlICVjc21ldGhvZG1vZGlmaWVycywgJWRtZXRob2Rtb2RpZmllcnMsCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGNhbiBtb2RpZnkgdGhlIG1ldGhvZCBtb2RpZmllcnMgZm9yIHRoZSBkZXN0cnVjdG9yIHdyYXBwZXJzCiAgICAgICAgICAgIGluIHRoZSBwcm94eSBjbGFzczogZGlzcG9zZSwgRGlzcG9zZSwgZGVsZXRlLiBXaXRoIHRoaXMgZmVhdHVyZSwgaXQgaXMgbm93IHBvc3NpYmxlCiAgICAgICAgICAgIHRvIG1ha2UgYSBDIyBwcm94eSBjbGFzcyBzZWFsZWQsIGVnIHdoZW4gd3JhcHBpbmcgYSBjbGFzcyBYLCB0aGUgdmlydHVhbCBtZXRob2QgbW9kaWZpZXJzCiAgICAgICAgICAgIGNhbiBiZSByZW1vdmVkIHVzaW5nOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSBYICJwdWJsaWMgc2VhbGVkIGNsYXNzIgogICAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBYOjp+WCAicHVibGljIC8qdmlydHVhbCovIjsKCjIwMTgtMDQtMTg6IG9sbHkKCSAgICBbUHl0aG9uXSBTdXBwcmVzcyBuZXcgcHljb2Rlc3R5bGUgd2FybmluZzoKCSAgICBFMjUyIG1pc3Npbmcgd2hpdGVzcGFjZSBhcm91bmQgcGFyYW1ldGVyIGVxdWFscwoKMjAxOC0wNC0wNzogZ29hdHNocmllawogICAgICAgICAgICBbUnVieV0gIzEyMTMgRml4IHJ1YnkgJWFsaWFzIGRpcmVjdGl2ZSBmb3IgZ2xvYmFsIEMvQysrIGZ1bmN0aW9ucy4KCjIwMTgtMDQtMDM6IG9sbHkKCSAgICBbUnVieV0gRml4IHRvIHBhc3MgUW5pbCBpbnN0ZWFkIG9mIE5VTEwgdG8gcmJfZnVuY2FsbCgpLCB3aGljaCBzaWxlbmNlcyBHQ0MKCSAgICAtV2NvbnZlcnNpb24tbnVsbCB3YXJuaW5nIChvbiBieSBkZWZhdWx0IHdpdGggcmVjZW50IEdDQykuCgoyMDE4LTAzLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzExODQgRml4IHN3aWdSZWxlYXNlT3duZXJzaGlwKCkgYW5kIHN3aWdUYWtlT3duZXJzaGlwKCkgcmVncmVzc2lvbgogICAgICAgICAgICBmb3Igbm9uLWRpcmVjdG9yIGNsYXNzZXMuIFJlc3RvcmVzIGEgZHluYW1pY19jYXN0IHdoaWNoIHdhcyBwcmV2aW91c2x5IHJlbW92ZWQuCgoyMDE4LTAzLTA3OiBsbG9uZ2kKCSAgICBHaXRodWIgUFIgIzExNjYgLSBGaXggcHJlcHJvY2Vzc29yIGhhbmRsaW5nIG9mIG1hY3JvcyB3aXRoIGNvbW1hcwoJICAgIGluIGEgLy8gY29tbWVudC4KCjIwMTgtMDItMTg6IEpQRVdkZXYKICAgICAgICAgICAgUGF0Y2ggIzExNjQgLSBBZGQgc3VwcG9ydCBmb3IgYSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmaWxlLCBhbHNvIHNvbWV0aW1lcwogICAgICAgICAgICBjYWxsZWQgYSByZXNwb25zZSBmaWxlLiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgZXhjZWVkCiAgICAgICAgICAgIHRoZSBzeXN0ZW0gY29tbWFuZC1saW5lIGxlbmd0aCBsaW1pdC4gVG8gdXNlLCBwdXQgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zCiAgICAgICAgICAgIGludG8gYSBmaWxlLCB0aGVuIHByb3ZpZGUgdGhlIGZpbGUgbmFtZSBwcmVmaXhlZCB3aXRoIEAsIGZvciBleGFtcGxlIHVzaW5nCiAgICAgICAgICAgIGEgZmlsZSBjYWxsZWQgYXJncy50eHQ6CgogICAgICAgICAgICAgIHN3aWcgQGFyZ3MudHh0CgoyMDE4LTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gIzExODcgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdyYXBwaW5nIHN0ZDo6Y29tcGxleCB2aWEKICAgICAgICAgICAgc3RkX2NvbXBsZXguaS4KCjIwMTgtMDEtMzA6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gYWRkIHR5cGUgbmFtZSBhcmd1bWVudCBpbiBTV0lHX3B0cigpIGZ1bmN0aW9uIHRvIGNhc3QgZnJvbSBwb2ludGVyIGFkZHJlc3MgdG8gdHlwZWQgcG9pbnRlcnMKCjIwMTgtMDEtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4cHJlc3Npb25zIGZvbGxvd2luZyBhIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgbXVzdCBub3cgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UKICAgICAgICAgICAgb3Igbm9uLW51bWVyaWMgY2hhcmFjdGVycy4gVGhpcyBzeW50YXggY2hhbmdlIG1ha2VzIHRoZSBTV0lHIHByZXByb2Nlc3NvciB3b3JrIGxpa2UKICAgICAgICAgICAgdGhlIEMgcHJlcHJvY2Vzc29yIGluIHRoaXMgYXJlYS4KCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgdXNlZCBiZSBhY2NlcHRlZCBhcyB2YWxpZCBzeW50YXg6CiAgICAgICAgICAgICAgI2lmMQogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDEyMwogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgTm93IHlvdSBnZXQgYW4gZXJyb3I6CiAgICAgICAgICAgICAgZXhhbXBsZS5oOjE6IEVycm9yOiBVbmtub3duIFNXSUcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZTogaWYxIChpZiB0aGlzIGlzIGEgYmxvY2sgb2YKICAgICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgY29kZSwgZGVsaW1pdCBpdCB3aXRoICV7IGFuZCAlfSkKICAgICAgICAgICAgICBleGFtcGxlLmg6MzogRXJyb3I6IEV4dHJhbmVvdXMgI2VuZGlmLgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyB0aGUgY29ycmVjdCBzeW50YXg6CiAgICAgICAgICAgICAgI2lmIDEKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAxMjMKICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgb2YgY291cnNlIGFsc28gd29ya3M6CiAgICAgICAgICAgICAgI2lmKDEpCiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMTIzCiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpc3N1ZSAjMTE4My4gRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGV2YWx1YXRpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiBkaXZpc2lvbiBieSB6ZXJvLgoKMjAxOC0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMxMTcyLiBTZWcgZmF1bHQgcGFyc2luZyBpbnZhbGlkIGV4cG9uZW50cyBpbiB0aGUgcHJlcHJvY2Vzc29yLgoKMjAxOC0wMS0xMjogTGlyeW5hCiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzExMjguIEFkZCBUb0FycmF5IGZ1bmN0aW9uIHRvIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLgoKMjAxOC0wMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBpc3N1ZSAjMTE1Ni4gQWRkIG1pc3NpbmcgdGhyb3dzIGNsYXVzZSBmb3IgaW50ZXJmYWNlcyB3aGVuIHVzaW5nIHRoZQogICAgICAgICAgICAlaW50ZXJmYWNlIGZhbWlseSBvZiBtYWNyb3MuCgoyMDE4LTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGVmYXVsdCBhcmd1bWVudHMgdXNpbmcgZXhwcmVzc2lvbnMgY29udGFpbmluZyAtPiBzeW50YXggZXJyb3IuIFByb2JsZW0gcmVwb3J0ZWQgb24KICAgICAgICAgICAgc3dpZy11c2VyIG1haWxpbmcgbGlzdC4KCjIwMTctMTItMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlcGxhY2UgcGVwOCB3aXRoIHB5Y29kZXN0eWxlIGZvciBjaGVja2luZyB0aGUgUHl0aG9uIGNvZGUgc3R5bGUgd2hlbgogICAgICAgICAgICBydW5uaW5nIFB5dGhvbiB0ZXN0cy4KCjIwMTctMTItMzA6IGRhdmVkaXNzaWFuCiAgICAgICAgICAgIEZpeGVkIGEgc3ltYm9sIGxvb2t1cCBpc3N1ZSB3aGVuIGVuY291bnRlcmluZyBhIHR5cGVkZWYgb2YgYSBzeW1ib2wgZnJvbSB0aGUgdGFnCiAgICAgICAgICAgIG5hbWVzcGFjZSB0byB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB3aGVuIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLCBzdWNoIGFzICd0eXBlZGVmCiAgICAgICAgICAgIHN0cnVjdCBGb28gRm9vOycuCgoyMDE3LTEyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gYWRkIG1pc3Npbmcgc3VwcG9ydCBmb3IgZGlyZWN0b3JmcmVlIHR5cGVtYXBzLgoKMjAxNy0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzExNjcgRml4IGRpcmVjdG9yb3V0IHR5cGVtYXBzIHdoaWNoIHdlcmUgY2F1c2luZyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4KICAgICAgICAgICAgcmV0dXJuaW5nIHBvaW50ZXJzIGJ5IHJlZmVyZW5jZS4KCjIwMTctMTItMDg6IG9sbHkKCSAgICBbUEhQXSBVc2UgWkVORF9NT0RVTEVfR0xPQkFMU19BQ0NFU1NPUiB0byBhY2Nlc3MgZ2xvYmFscyBzbyB0aGUKCSAgICBnZW5lcmF0ZWQgY29kZSBidWlsZHMgd2hlbiBQSFAgd2FzIGJ1aWx0IHdpdGggWlRTIGVuYWJsZWQuCgoyMDE3LTEyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBjaGVja3MgZm9yIGZhaWx1cmVzIGluIGNhbGxzIHRvIFB5VW5pY29kZV9Bc1VURjhTdHJpbmcuIFByZXZpb3VzbHkgYQogICAgICAgICAgICBzZWcgZmF1bHQgY291bGQgb2NjdXIgd2hlbiBwYXNzaW5nIGludmFsaWQgVVRGOCBzdHJpbmdzIChsb3cgc3Vycm9nYXRlcyksIGVnIHBhc3NpbmcKICAgICAgICAgICAgdSJcdWRjZmYiIHRvIHRoZSBDIGxheWVyIChQeXRob24gMykuCgoyMDE3LTExLTI0OiBqb2VxdWFudAoJICAgIFtSXSBGaXggIzExMjQgYW5kIHJldHVybiBSX05pbFZhbHVlIGZvciBudWxsIHBvaW50ZXJzCgoyMDE3LTExLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gZGlyZWN0b3IgZXhjZXB0aW9uIGhhbmRsaW5nIGltcHJvdmVtZW50cy4KCiAgICAgICAgICAgIFdoZW4gYSBkaXJlY3RvciBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhbmQgaXQgaXMgY2F1Z2h0IGJ5IERpcmVjdG9yRXhjZXB0aW9uCiAgICAgICAgICAgIGFuZCBwYXNzZWQgYmFjayB0byBKYXZhIHVzaW5nIFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uOjp0aHJvd0V4Y2VwdGlvbiwgdGhlIEphdmEKICAgICAgICAgICAgc3RhY2sgdHJhY2Ugbm93IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgbGluZSB0aGF0IHRocmV3IHRoZSBleGNlcHRpb24uCgogICAgICAgICAgICBEZXByZWNhdGUgU3dpZzo6RGlyZWN0b3JFeGNlcHRpb246OnJhaXNlSmF2YUV4Y2VwdGlvbiwgcGxlYXNlIHJlcGxhY2UgdXNhZ2Ugd2l0aAogICAgICAgICAgICBTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbjo6dGhyb3dFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBDKysxMSByZWYtcXVhbGlmaWVycyB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTctMTAtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgY29kZSB3aGVuIHVzaW5nIGRpcmVjdG9ycyBhbmQgbWV0aG9kcyByZXR1cm5pbmcgY29uc3QgcmVmIHBvaW50ZXJzLgoKMjAxNy0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBELCBKYXZhLCBPY3RhdmUsIFIsIFNjaWxhYl0gUG9ydCBkaXJlY3RvciB0eXBlbWFwcyB0byB0aGVzZSBhZGRpdGlvbmFsIGxhbmd1YWdlcy4KICAgICAgICAgICAgSXNzdWUgIzcwMC4KCjIwMTctMTAtMjY6IHJhZGFyc2F0MQogICAgICAgICAgICBbUnVieSBQeXRob25dIFBhdGNoICMxMDI5IC0gQ29ycmVjdCBoYW5kbGluZyBvZiBudWxsIHVzaW5nIGRpcmVjdG9ycyBhbmQgc2hhcmVkX3B0ci4KCjIwMTctMTAtMTA6IGpvZXF1YW50CgkgICAgW1JdIHBhc3MgZW51bSBleHByZXNzaW9ucyB0byBSLiAgVGhpcyB3aWxsIGdlbmVyYXRlCgkgICAgaW5jb3JyZWN0IGZpbGVzIHdoZW4gdGhlcmUgaXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uCgkgICAgaW4gdGhlIGVudW0sIGJ1dCB0aGlzIGlzIGJldHRlciB0aGFuIHNpbGVudGx5IGdlbmVyYXRpbmcKCSAgICBpbmNvcnJlY3QgY29kZQoKMjAxNy0xMC0wOTogb2xseQoJICAgIFtQSFBdIEZpeCBpbmNvcnJlY3Qgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCB3aGVuIHRoZXJlJ3MgYQoJICAgIGNvbWJpbmF0aW9uIG9mIG92ZXJsb2FkaW5nLCBwYXJhbWV0ZXJzIHdpdGggYSBkZWZhdWx0IHZhbHVlCgkgICAgYW5kICVuZXdvYmplY3QuICBGaXhlcyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy8xMzUwLwoKMjAxNy0xMC0wOTogb2xseQoJICAgIFJlbW92ZSBHQ0ogc3VwcG9ydC4gIEl0IGlzbid0IGluIGEgZ29vZCBzdGF0ZSBhbmQgZG9lc24ndCBzZWVtIHRvCgkgICAgYmUgdXNlZCwgYW5kIEdDQzcgZHJvcHBlZCBHQ0ouICBDbG9zZXMKCSAgICBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvYnVncy84MjMvCgoyMDE3LTEwLTA3OiBvbGx5CgkgICAgRml4IHByZXByb2Nlc3NvciBoYW5kbGluZyBvZiBlbXB0eSBtYWNybyBhcmd1bWVudHMgdG8gbWF0Y2ggdGhhdCBvZgoJICAgIEMvQysrIGNvbXBpbGVycy4gIEZpeGVzIGlzc3VlICMxMTExIGFuZAoJICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzgyNi8KCjIwMTctMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICMxMTA4LiBGaXggcGxhdGZvcm0gaW5jb25zaXN0ZW5jeSBpbiBQeXRob24gZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICAgMzIgYml0IGFuZCA2NCBiaXQgY29tcGlsZWQgdmVyc2lvbnMgb2YgU1dJRyBnZW5lcmF0ZWQgZGlmZmVyZW50IFB5dGhvbiBmaWxlcwogICAgICAgICAgICB3aGVuIGRlZmF1bHQgYXJndW1lbnRzIHdlcmUgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgMzIgYml0IHNpZ25lZCBpbnRlZ2Vycy4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXJndW1lbnRzIHNwZWNpZmllZCBpbiBQeXRob24gYXJlIG5vdyBvbmx5IHRob3NlIHRoYXQgYXJlIGluIHRoZQogICAgICAgICAgICByYW5nZSBvZiBhIDMyIGJpdCBzaWduZWQgaW50ZWdlciwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGlzIG9idGFpbmVkIGZyb20gQy9DKysgY29kZS4KCjIwMTctMTAtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHN0ZDo6Y29tcGxleCB0eXBlcyBwYXNzZWQgYnkgdmFsdWUuCgoyMDE3LTEwLTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YXNjcmlwdCwgUHl0aG9uLCBSdWJ5XSBJc3N1ZSAjNzMyIC0gTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBzdGQ6OmNvbXBsZXgKICAgICAgICAgICAgaW4gc3RkX2NvbXBsZXguaSBtZWFudCB0aGF0IHByZXZpb3VzbHkgc3RkOjpjb21wbGV4IGFsd2F5cyBoYWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIGJlIHdyYXBwZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHlwZW1hcHMuCgoyMDE3LTEwLTAxOiBqb2VxdWFudAogICAgICAgICAgICBhbGxvdyBSIHBhY2thZ2UgbmFtZXMgd2l0aCBkb2NzCgkgICAgYWxsb3dpbmcgbXVsdGlwbGUgZ2V0IGFjY2Vzc29ycyBpbiBSCgkgICAgZml4IHNtYXJ0LXBvaW50ZXIgYW5kIE5BTUVTUEFDRSBzdXBwb3J0CgkgICAgY29uc3RydWN0b3JzIG5vdyByZXR1cm5pbmcgc21hcnQgcG9pbnRlcnMgKGlmIGNsYXNzCgkgICAgZGVjbGFyZWQgYXMgc3VjaCkKCSAgICBzbWFydC1wb2ludGVyIGNsYXNzZXMgZGVyaXZpbmcgZnJvbSBwYXJlbnQgc21hcnQtcG9pbnRlcnMKCjIwMTctMDktMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMTAwIC0gQWxsb3cgYW4gaW5zdGFudGlhdGVkIHRlbXBsYXRlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBpbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGFzIHRoZSBDKysgdGVtcGxhdGUgbmFtZSwgZm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IHBvc3NpYmxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IC4uLiB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShYKSBYPGludD47CgoyMDE3LTA5LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTA5OC4gRml4IG92ZXJsb2FkaW5nIG9mIHNoYXJlZF9wdHIgd2l0aCB1bmRlcmx5aW5nIHBvaW50ZXIgdHlwZXMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIG0oc3RkOjpzaGFyZWRfcHRyPFQ+IHApOwogICAgICAgICAgICAgIHZvaWQgbShUICZwKTsKICAgICAgICAgICAgICB2b2lkIG0oVCAqcCk7CgogICAgICAgICAgICBPbmx5IHRoZSBmaXJzdCBtZXRob2QgaXMgd3JhcHBlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC9zaGFkb3dlZC4KICAgICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUgdmlhIGEgbmV3IGF0dHJpYnV0ZSBpbiB0aGUgJ3R5cGVjaGVjaycgdHlwZW1hcCBjYWxsZWQKICAgICAgICAgICAgJ2VxdWl2YWxlbnQnLiBJZiBzcGVjaWZpZWQsIGl0IG11c3QgY29udGFpbiB0aGUgZXF1aXZhbGVudCBwb2ludGVyIHR5cGUgZm9yIG92ZXJsb2FkaW5nCiAgICAgICAgICAgIGFuZCBjYW4gb25seSBiZSB1c2VkIGZvciB0aGUgc3BlY2lhbCBTV0lHX1RZUEVDSEVDS19QT0lOVEVSIHByZWNlZGVuY2UgbGV2ZWwuCiAgICAgICAgICAgIFRoZSBzaGFyZWRfcHRyICd0eXBlY2hlY2snIHR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCBhY2NvcmRpbmdseS4KICAgICAgICAgICAgSGVyZSBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbjoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLCBwcmVjZWRlbmNlPVNXSUdfVFlQRUNIRUNLX1BPSU5URVIsIGVxdWl2YWxlbnQ9IlQgKiIpCiAgICAgICAgICAgICAgICBULAogICAgICAgICAgICAgICAgVCBDT05TVCAmLAogICAgICAgICAgICAgICAgVCBDT05TVCAqLAogICAgICAgICAgICAgICAgVCAqQ09OU1QmLAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4sCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8IFQgPiAmLAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4gKiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+IComCiAgICAgICAgICAgICAgICB7IC4uLiB9CgogICAgICAgICAgICBPdmVybG9hZGluZyB3aXRoIGFueSBvZiB0aGVzZSB0eXBlcyB3aWxsIHJlc3VsdCBpbiBTV0lHIGlnbm9yaW5nIGFsbCBidXQgdGhlIGZpcnN0CiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kIGJ5IGRlZmF1bHQuIFdpdGhvdXQgdGhlICdlcXVpdmFsZW50JyBhdHRyaWJ1dGUsIHdyYXBwaW5nIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgIG1ldGhvZHMgcmVzdWx0ZWQgaW4gdHlwZXMgYmVpbmcgc2hhZG93ZWQgKHNjcmlwdGluZyBsYW5ndWFnZXMpIG9yIGNvZGUgdGhhdCBkaWQgbm90CiAgICAgICAgICAgIGNvbXBpbGUgKHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzKS4KCjIwMTctMDktMTk6IGZ1dGF0dWtpCiAgICAgICAgICAgIFtQeXRob25dICMxMDAzIEFkZCAtLXdpdGgtMnRvMz0vcGF0aC90by8ydG8zIG9wdGlvbiB0byBjb25maWd1cmUuCgoyMDE3LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZSBwcm9tb3Rpb24gd3JhcHBpbmcgY29uc3RhbnQgZXhwcmVzc2lvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgIyBkZWZpbmUgRVhQUl9NSVhFRDEgICAgKDB4ODAgKyAxMS4xKSAtIDEKICAgICAgICAgICAgVGhpcyB3YXMgcHJldmlvdXNseSBhbiBpbnRlZ3JhbCB0eXBlIGluc3RlYWQgb2YgYSBmbG9hdGluZyBwb2ludCB0eXBlLgoKMjAxNy0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBjb2RlIGZvciBjb25zdGFudCBleHByZXNzaW9ucyBjb250YWluaW5nIHdjaGFyX3QgTCBsaXRlcmFscyBzdWNoIGFzOgogICAgICAgICAgICAgICMgZGVmaW5lIF9fV0NIQVJfTUFYICAgICgweDdmZmZmZmZmICsgTCdcMCcpCiAgICAgICAgICAgICAgIyBkZWZpbmUgX19XQ0hBUl9NSU4gICAgKC1fX1dDSEFSX01BWCAtIDEpCgoyMDE3LTA5LTEwOiBtbGFtYXJyZQogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMTA4My4gRGVmaW5lX0RFQlVHIHRvIDEgdG8gZG8gZXhhY3RseSBsaWtlIFZpc3VhbCBTdHVkaW8KICAgICAgICAgICAgL0xEZCwgL01EZCBvciAvTVRkIGNvbXBpbGVyIG9wdGlvbnMuCgoyMDE3LTA4LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTA1OS4gQWRkIHN1cHBvcnQgZm9yIEMrKzExIHJlZi1xdWFsaWZpZXJzIG9uIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgTWVtYmVycyB3aXRoIGx2YWx1ZSByZWYtcXVhbGlmaWVycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUlEgewogICAgICAgICAgICAgICAgdm9pZCBtMShpbnQgeCkgJjsKICAgICAgICAgICAgICAgIHZvaWQgbTIoaW50IHgpIGNvbnN0ICY7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFyZSB3cmFwcGVkIGxpa2UgYW55IG90aGVyIG1lbWJlciBmdW5jdGlvbi4gTWVtYmVyIGZ1bmN0aW9ucyB3aXRoIHJ2YWx1ZSByZWYtcXVhbGlmaWVycwogICAgICAgICAgICBhcmUgaWdub3JlZCBieSBkZWZhdWx0LCBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUlEgewogICAgICAgICAgICAgICAgdm9pZCBtMyhpbnQgeCkgJiY7CiAgICAgICAgICAgICAgICB2b2lkIG00KGludCB4KSBjb25zdCAmJjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBleGFtcGxlLmk6NzogV2FybmluZyA0MDU6IE1ldGhvZCB3aXRoIHJ2YWx1ZSByZWYtcXVhbGlmaWVyIG0zKGludCkgJiYgaWdub3JlZC4KICAgICAgICAgICAgICBleGFtcGxlLmk6ODogV2FybmluZyA0MDU6IE1ldGhvZCB3aXRoIHJ2YWx1ZSByZWYtcXVhbGlmaWVyIG00KGludCkgY29uc3QgJiYgaWdub3JlZC4KCiAgICAgICAgICAgIFRoZXNlIGNhbiBiZSB1bmlnbm9yZWQgYW5kIGV4cG9zZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSwgc2VlIGZ1cnRoZXIgZG9jdW1lbnRhdGlvbiBpbgogICAgICAgICAgICBDUGx1c1BsdXMxMS5odG1sLgoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDYzLiBBZGQgdXNpbmcgZGVjbGFyYXRpb25zIHRvIHRlbXBsYXRlcyBpbnRvIHR5cGVkZWYgdGFibGUuCgogICAgICAgICAgICBVc2luZyBkZWNsYXJhdGlvbnMgdG8gdGVtcGxhdGVzIHdlcmUgbWlzc2luZyBpbiBTV0lHJ3MgaW50ZXJuYWwgdHlwZWRlZiB0YWJsZXMuCiAgICAgICAgICAgIFRoaXMgbGVkIHRvIGEgZmV3IHByb2JsZW1zLCBzdWNoIGFzLCB0ZW1wbGF0ZXMgdGhhdCBkaWQgbm90IGluc3RhbnRpYXRlIGFuZCBnZW5lcmF0ZWQKICAgICAgICAgICAgQysrIGNvZGUgdGhhdCBkaWQgbm90IGNvbXBpbGUgYXMgU1dJRyBkaWQgbm90IGtub3cgd2hhdCBzY29wZSB0aGUgdGVtcGxhdGUgd2FzCiAgICAgICAgICAgIGluLiBUaGlzIGhhcHBlbmVkIG1vc3RseSB3aGVuIGEgdXNpbmcgZGVjbGFyYXRpb24gd2FzIHVzZWQgb24gYSB0ZW1wbGF0ZSB0eXBlIGluIGEKICAgICAgICAgICAgY29tcGxldGVseSB1bnJlbGF0ZWQgbmFtZXNwYWNlLgoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHR5cGUgbG9va3VwIGluIHRoZSBwcmVzZW5jZSBvZiB1c2luZyBkaXJlY3RpdmVzIGFuZCB1c2luZyBkZWNsYXJhdGlvbnMuCgogICAgICAgICAgICBGaXggc29tZSBjYXNlcyBvZiB0eXBlIGxvb2t1cCBmYWlsdXJlIHZpYSBhIGNvbWJpbmF0aW9uIG9mIGJvdGggdXNpbmcgZGlyZWN0aXZlcyBhbmQKICAgICAgICAgICAgdXNpbmcgZGVjbGFyYXRpb25zIHJlc3VsdGluZyBpbiBDKysgY29kZSB0aGF0IGRpZCBub3QgY29tcGlsZSBhcyB0aGUgZ2VuZXJhdGVkIHR5cGUgd2FzCiAgICAgICAgICAgIG5vdCBmdWxseSBxdWFsaWZpZWQgZm9yIHVzZSBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gRXhhbXBsZSBiZWxvdzoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlNSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3ViU3BhY2U1IHsKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIFN1YlN1YlNwYWNlNSB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEYge307CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBTdWJTcGFjZTU7CiAgICAgICAgICAgICAgICB1c2luZyBTdWJTdWJTcGFjZTU6OkY7CiAgICAgICAgICAgICAgICB2b2lkIGZ1bmMoU3ViU3ViU3BhY2U1OjpGIGYpOwogICAgICAgICAgICAgIH0KCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMDUxLiAldGVtcGxhdGUgc2NvcGUgZW5mb3JjZW1lbnQgYW5kIGNsYXNzIGRlZmluaXRpb24gZml4ZXMuCgogICAgICAgICAgICBUaGUgc2NvcGluZyBydWxlcyBhcm91bmQgJXRlbXBsYXRlIGhhdmUgYmVlbiBzcGVjaWZpZWQgYW5kIGVuZm9yY2VkLgogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBmb3IgYSBjbGFzcyB0ZW1wbGF0ZSBpcyB0aGUgZXF1aXZhbGVudCB0byBhbgogICAgICAgICAgICBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIGEgQysrIGNsYXNzIHRlbXBsYXRlLiBUaGUgc2NvcGUgZm9yIGEgdmFsaWQKICAgICAgICAgICAgJXRlbXBsYXRlIGluc3RhbnRpYXRpb24gaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBzY29wZSByZXF1aXJlZCBmb3IgYQogICAgICAgICAgICB2YWxpZCBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIGEgQysrIHRlbXBsYXRlLiBBIGRlZmluaXRpb24gb2YgdGhlCiAgICAgICAgICAgIHRlbXBsYXRlIGZvciB0aGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBtdXN0IGJlIGluIHNjb3BlIHdoZXJlIHRoZQogICAgICAgICAgICBpbnN0YW50aWF0aW9uIGlzIGRlY2xhcmVkIGFuZCBtdXN0IG5vdCBiZSBlbmNsb3NlZCB3aXRoaW4gYSBkaWZmZXJlbnQKICAgICAgICAgICAgbmFtZXNwYWNlLgoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGEgZmV3ICV0ZW1wbGF0ZSBhbmQgQysrIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIHN0ZDo6dmVjdG9yCiAgICAgICAgICAgIGFyZSBzaG93biBiZWxvdzoKCiAgICAgICAgICAgICAgLy8gdmFsaWQKICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyB2YWxpZAogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CgogICAgICAgICAgICAgIC8vIHZhbGlkCiAgICAgICAgICAgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gaWxsLWZvcm1lZAogICAgICAgICAgICAgIG5hbWVzcGFjZSB1bnJlbGF0ZWQgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIGlsbC1mb3JtZWQKICAgICAgICAgICAgICBuYW1lc3BhY2UgdW5yZWxhdGVkIHsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHN0ZDo6dmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdoZW4gdGhlIHNjb3BlIGlzIGluY29ycmVjdCwgYW4gZXJyb3Igbm93IG9jY3VycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBjcHBfdGVtcGxhdGVfc2NvcGUuaTozNDogRXJyb3I6ICd2ZWN0b3InIHJlc29sdmVzIHRvICdzdGQ6OnZlY3RvcicgYW5kCiAgICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IGluc3RhbnRpYXRlZCBpbiBzY29wZSAndW5yZWxhdGVkJyBpbnN0ZWFkIG9mIHdpdGhpbiBzY29wZSAnc3RkJy4KCiAgICAgICAgICAgIFByZXZpb3VzbHkgU1dJRyBhY2NlcHRlZCB0aGUgaWxsLWZvcm1lZCBleGFtcGxlcyBhYm92ZSBidXQgdGhpcyBsZWQgdG8KICAgICAgICAgICAgbnVtZXJvdXMgc3VidGxlIHRlbXBsYXRlIHNjb3BlIHByb2JsZW1zIGVzcGVjaWFsbHkgaW4gdGhlIHByZXNlbmNlIG9mCiAgICAgICAgICAgIHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgdXNpbmcgZGlyZWN0aXZlcyBhcyB3ZWxsIGFzIHdpdGggJWZlYXR1cmUgYW5kICV0eXBlbWFwLgoKICAgICAgICAgICAgQWN0dWFsbHksIGEgdmFsaWQgaW5zdGFudGlhdGlvbiBpcyBvbmUgd2hpY2ggY29uZm9ybXMgdG8gdGhlIEMrKzAzCiAgICAgICAgICAgIHN0YW5kYXJkIGFzIEMrKzExIG1hZGUgYSBjaGFuZ2UgdG8gZGlzYWxsb3cgdXNpbmcgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgICB1c2luZyBkaXJlY3RpdmVzIHRvIGZpbmQgYSB0ZW1wbGF0ZS4KCiAgICAgICAgICAgICAgLy8gdmFsaWQgQysrMDMsIGlsbC1mb3JtZWQgQysrMTEKICAgICAgICAgICAgICB1c2luZyBzdGQ6OnZlY3RvcjsKICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNpbWlsYXIgZml4ZXMgZm9yIGRlZmluaW5nIGNsYXNzZXMgdXNpbmcgZm9yd2FyZCBjbGFzcyByZWZlcmVuY2VzIGhhdmUKICAgICAgICAgICAgYWxzbyBiZWVuIHB1dCBpbiBwbGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgc3RydWN0IEE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgc3RydWN0IFNwYWNlMTo6QSB7CiAgICAgICAgICAgICAgICAgIHZvaWQgeCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgbm93IGVycm9yIG91dCB3aXRoOgoKICAgICAgICAgICAgICBjcHBfY2xhc3NfZGVmaW5pdGlvbi5pOjU6IEVycm9yOiAnU3BhY2UxOjpBJyByZXNvbHZlcyB0byAnU3BhY2UxOjpBJyBhbmQKICAgICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIGluIHNjb3BlICdTcGFjZTInIGluc3RlYWQgb2Ygd2l0aGluIHNjb3BlICdTcGFjZTEnLgoKICAgICAgICAgICAgUHJldmlvdXNseSBzb21lIHN5bWJvbHMgd291bGQgaGF2ZSBiZWVuIGluc3RhbnRpYXRlZCBpbiB0aGUgd3Jvbmcgc2NvcGUgYW5kIGxlZAogICAgICAgICAgICB0byBsb3RzIG9mIHNjb3BlIHByb2JsZW1zIGludm9sdmluZyBTV0lHIHR5cGVtYXBzLCBmZWF0dXJlcywgcmVuYW1lcyBldGMuCiAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gY29ycmVjdCB0aGUgc2NvcGUgdXNlZCBpbiBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgd2hpY2ggZG8gbm90CiAgICAgICAgICAgIHN1cHBvcnQgJ3VzaW5nIGRlY2xhcmF0aW9ucycgYW5kICd1c2luZyBkaXJlY3RpdmVzJy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBwcmV2aW91c2x5IGhhZDoKCiAgICAgICAgICAgICAgJXJlbmFtZShaYXApIHZlY3RvcjxpbnQ+OjpjbGVhcjsKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JJbnQpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgUHJpb3IgdmVyc2lvbnMgb2YgU1dJRyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQgdmVjdG9yPGludD4gaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKICAgICAgICAgICAgYW5kIHNvIHRoZSAlcmVuYW1lIG1hdGNoZWQuIE5vdyB0aGUgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkIGluIHRoZSBjb3JyZWN0IG5hbWVzcGFjZSwKICAgICAgICAgICAgc28gaXMgZnVsbHkgcXVhbGlmaWVkIGFzIHN0ZDo6dmVjdG9yPGludD4uIFRoZSBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgbmVlZCBjb3JyZWN0aW5nIGFzCiAgICAgICAgICAgIHRoZXkgZG8gbm90IGZvbGxvdyAndXNpbmcgZGVjbGFyYXRpb25zJyBhbmQgJ3VzaW5nIGRpcmVjdGl2ZXMnLiBDaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICVyZW5hbWUoWmFwKSBzdGQ6OnZlY3RvcjxpbnQ+OjpjbGVhcjsKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwoKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNjb3BlIGxvb2t1cCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyBjb250YWluaW5nIHVuYXJ5IHNjb3BlIG9wZXJhdG9ycy4KCiAgICAgICAgICAgIEZpeGVzIGNhc2VzIGxpa2U6CgogICAgICAgICAgICBuYW1lc3BhY2UgQWxsb2MgewogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZWJpbmQgewogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICV0ZW1wbGF0ZShSZWJpbmRCdWNrZXQpIEFsbG9jOjpSZWJpbmQ8IEJ1Y2tldCA+OwogICAgICAgICAgICBPUgogICAgICAgICAgICAldGVtcGxhdGUoUmViaW5kQnVja2V0KSBBbGxvYzo6UmViaW5kPCA6OkJ1Y2tldCA+OwoKICAgICAgICAgICAgQWxsb2M6OlJlYmluZDwgQnVja2V0ID46OkludGVnZXIgQnVja2V0MSgpOwogICAgICAgICAgICBBbGxvYzo6UmViaW5kPCA6OkJ1Y2tldCA+OjpJbnRlZ2VyIEJ1Y2tldDIoKTsKICAgICAgICAgICAgQWxsb2M6OlJlYmluZDw6OnRlbXBsYXRlIFRlbXBsYXRlQnVja2V0PGRvdWJsZT4+OjpJbnRlZ2VyIEJ1Y2tldDMoKTsKCjIwMTctMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZvciB0ZW1wbGF0ZXMgb25seSwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGZ1bGx5IHJlc29sdmVkIHdoZW4KICAgICAgICAgICAgaGFuZGxpbmcgdHlwZW1hcHMuIFdpdGhvdXQgdGhpcywgaXQgaXMgdG9vIGhhcmQgdG8gaGF2ZSBkZWNlbnQgcnVsZXMKICAgICAgICAgICAgdG8gYXBwbHkgdHlwZW1hcHMgd2hlbiBwYXJhbWV0ZXIgdHlwZXMgYXJlIHR5cGVkZWYnZCBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycyBoYXZlIGRlZmF1bHQgdmFsdWVzLgoKICAgICAgICAgICAgRml4ZXMgJWNsZWFyIGZvciB0eXBlZGVmcyBpbiB0ZW1wbGF0ZXMsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcCgiaW4iKSBYWFg8aW50Pjo6TG9uZyAiLi4uIgogICAgICAgICAgICAgIHRlbXBsYXRlIHR5cGVuYW1lPFQ+IHN0cnVjdCBYWFggewogICAgICAgICAgICAgICAgdHlwZWRlZiBsb25nIExvbmc7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlY2xlYXIgWFhYPGludD46Okxvbmc7CgogICAgICAgICAgICBhcyB0aGUgdHlwZW1hcCB3YXMgcHJldmlvdXNseSBpbmNvcnJlY3RseSBzdG9yZWQgYXMgYSB0eXBlbWFwIGZvciBsb25nCiAgICAgICAgICAgIGluc3RlYWQgb2YgWFhYPGludD46OkxvbmcuCgoyMDE3LTA4LTA1OiBvbGx5CgkgICAgW0MrKzExXSBBbGxvdyBzdGF0aWNfYXNzZXJ0IGF0IHRoZSB0b3AgbGV2ZWwgKGFuZCBkaXNhbGxvdyBpdCByaWdodAoJICAgIGFmdGVyIHRlbXBsYXRlPFQ+KS4gIEZpeGVzIGlzc3VlIDEwMzEgcmVwb3J0ZWQgYnkgQXJ0ZW0gViBMLgoKMjAxNy0wOC0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdGx5IHNob3duIHdhcm5pbmcgd2hlbiBhbiBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHdhcyB1c2VkIG9uIGEKICAgICAgICAgICAgY2xhc3MgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYW5kIHRoYXQgYmFzZSBjbGFzcyB3YXMgZXhwbGljaXRseSBpZ25vcmVkIHdpdGggJWlnbm9yZS4KICAgICAgICAgICAgRXhhbXBsZSBvZiB0aGUgd2FybmluZyB3aGljaCB3aWxsIG5vIGxvbmdlciBhcHBlYXI6CgogICAgICAgICAgICAgIFdhcm5pbmcgNDAxOiBCYXNlIGNsYXNzICdGdW5jdG9yPCBpbnQsaW50ID4nIGhhcyBubyBuYW1lIGFzIGl0IGlzIGFuIGVtcHR5CiAgICAgICAgICAgICAgdGVtcGxhdGUgaW5zdGFudGlhdGVkIHdpdGggJyV0ZW1wbGF0ZSgpJy4gSWdub3JlZC4KCjIwMTctMDctMTc6IGZmbGV4bwogICAgICAgICAgICBbSmF2YV0gIzY3NCBBZGQgc3RkX2xpc3QuaSB0byBhZGQgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lcnMuIFRoZSBKYXZhIHByb3h5CiAgICAgICAgICAgIGV4dGVuZHMgamF2YS51dGlsLkFic3RyYWN0U2VxdWVudGlhbExpc3QgYW5kIG1ha2VzIHRoZSBDKysgc3RkOjpsaXN0IGNvbnRhaW5lciBsb29rCiAgICAgICAgICAgIGFuZCBmZWVsIG11Y2ggbGlrZSBhIGphdmEudXRpbC5MaW5rZWRMaXN0IGZyb20gSmF2YS4KCjIwMTctMDctMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBkaXNwbGF5IG9mIGRvY3VtZW50ZWQgdGVtcGxhdGUgdHlwZXMgd2hlbiB1c2luZyB0aGUgYXV0b2RvYwogICAgICAgICAgICBmZWF0dXJlLiBGb3IgZXhhbXBsZSB3aGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYXV0b2RvYyIpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFg+IHN0cnVjdCBUIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShUSW50ZWdlcikgVDxpbnQ+OwoKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGNvbnRhaW5zOgogICAgICAgICAgICAgICIiIlByb3h5IG9mIEMrKyBUPCBpbnQgPiBjbGFzcy4iIiIKICAgICAgICAgICAgaW5zdGVhZCBvZjoKICAgICAgICAgICAgICAiIiJQcm94eSBvZiBDKysgVDwoaW50KT4gY2xhc3MuIiIiCiAgICAgICAgICAgIGFuZAogICAgICAgICAgICAgICIiIl9faW5pdF9fKFRJbnRlZ2VyIHNlbGYpIC0+IFRJbnRlZ2VyIiIiCiAgICAgICAgICAgIGluc3RlYWQgb2YKICAgICAgICAgICAgICAiIiJfX2luaXRfXyhUPChpbnQpPiBzZWxmKSAtPiBUSW50ZWdlciIiIgoKMjAxNy0wNi0yNzogbmloYWxuCgkgICAgW1BIUF0gVXBkYXRlIHRoZSBPVVRQVVQgVHlwZW1hcCB0byBhZGQgcmV0dXJuIHN0YXRlbWVudCB0byB0aGUKCSAgICBQSFAgV3JhcHBlci4KCjIwMTctMDYtMjc6IG5paGFsbgoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgZW51bSBhbmQgdmFsdWUgZXhhbXBsZXMgdG8gdXNlIHRoZSBPTyB3cmFwcGVycwoJICAgIHJhdGhlciB0aGFuIHRoZSBmbGF0IGZ1bmN0aW9ucyBwcm9kdWNlZCB3aXRoIC1ub3Byb3h5LiAgVGhlcmUncwoJICAgIG5vdCBiZWVuIGEgZ29vZCByZWFzb24gdG8gdXNlIC1ub3Byb3h5IGZvciBzaW5jZSBQSFA1IE9PIHdyYXBwaW5nCgkgICAgd2FzIGZpeGVkIGJhY2sgaW4gMjAwNS4KCjIwMTctMDYtMjM6IG03dGhvbgogICAgICAgICAgICBbUHl0aG9uXSBmaXggYW5kIGltcHJvdmUgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZzoKCiAgICAgICAgICAgIDEuIEZpeCBuZWdhdGl2ZSBvY3RhbHMuIEN1cnJlbnRseSBub3QgaGFuZGxlZCBjb3JyZWN0bHkgYnkgYC1weTNgCiAgICAgICAgICAgICAgICh1bnVzdWFsIGNhc2UsIGJ1dCBpbmNvcnJlY3QpLgogICAgICAgICAgICAyLiBGaXggYXJndW1lbnRzIG9mIHR5cGUgIm9jdGFsICsgc29tZXRoaW5nIiAoZS5nLiBgMDY0MCB8IDA0YCkuCiAgICAgICAgICAgICAgIEN1cnJlbnRseSBkcm9wcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBvY3RhbC4gTmFzdHkhCiAgICAgICAgICAgIDMuIEZpeCBib29sIGFyZ3VtZW50cyAiMCArIHNvbWV0aGluZyIgKGUuZy4gYDAgfCAxYCkgYXJlIGFsd2F5cwogICAgICAgICAgICAgICAiRmFsc2UiICh1bnVzdWFsIGNhc2UsIGJ1dCBpbmNvcnJlY3QpLgogICAgICAgICAgICA0LiBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiAiVFJVRSIgYW5kICJGQUxTRSIgZnJvbQogICAgICAgICAgICAgICBgY29udmVydFZhbHVlYCBzaW5jZSB0aGVyZSdzIG5vIHJlYXNvbiB0aGVzZSBoYXZlIHRvIG1hdGNoCiAgICAgICAgICAgICAgICJ0cnVlIiBhbmQgImZhbHNlIi4KICAgICAgICAgICAgNS4gUmVtb3ZlIHRoZSBQeXRob24gMiB2cy4gUHl0aG9uIDMgZGlzdGluY3Rpb24gYmFzZWQgb24gdGhlCiAgICAgICAgICAgICAgIGAtcHkzYCBmbGFnLiBOb3cgdGhlIHNhbWUgcHl0aG9uIGNvZGUgaXMgcHJvZHVjZWQgZm9yIGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnRzIGZvciBQeXRob24gMiBhbmQgUHl0aG9uIDMuIEZvciB0aGlzLCBvY3RhbCBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50cywgZS5nLiAwNjQ0LCBhcmUgbm93IHdyYXBwZWQgYXMgYGludCgnNjQ0JywgOClgLiBUaGlzCiAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkLCBhcyBQeXRob24gMiBhbmQgUHl0aG9uIDMgaGF2ZSBpbmNvbXBhdGlibGUgc3ludGF4CiAgICAgICAgICAgICAgIGZvciBvY3RhbCBsaXRlcmFscy4KCiAgICAgICAgICAgIEZpeGVzICM3MDcKCjIwMTctMDYtMjE6IGZ1dGF0dWtpCiAgICAgICAgICAgICMxMDA0IC0gRml4IGNjYWNoZS1zd2lnIGV4ZWN1dGFibGUgbmFtZSB0byByZXNwZWN0IGNvbmZpZ3VyZSdzIC0tcHJvZ3JhbS1wcmVmaXggYW5kCiAgICAgICAgICAgIC0tcHJvZ3JhbS1zdWZmaXggdmFsdWVzIGlmIHVzZWQuCgoyMDE3LTA2LTIxOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5MTEgLSBBZGQgc3RkOjp3c3RyaW5nIHN1cHBvcnQuCgoyMDE3LTA2LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggaGFuZGxpbmcgb2YgcmljaCBjb21wYXJpc29ucyB3aGVuIHdyYXBwaW5nIG92ZXJsb2FkZWQgb3BlcmF0b3JzOgoKICAgICAgICAgICAgICBvcGVyYXRvcjwgIG9wZXJhdG9yPD0gIG9wZXJhdG9yPiAgb3BlcmF0b3I+PSAgb3BlcmF0b3I9PSAgb3BlcmF0b3IhPQoKICAgICAgICAgICAgUHJldmlvdXNseSBhIFR5cGVFcnJvciB3YXMgYWx3YXlzIHRocm93biBpZiB0aGUgdHlwZSB3YXMgbm90IGNvcnJlY3QuIE5vdEltcGxlbWVudGVkCiAgICAgICAgICAgIGlzIG5vdyByZXR1cm5lZCBmcm9tIHRoZXNlIHdyYXBwZWQgZnVuY3Rpb25zIGlmIHRoZSB0eXBlIGJlaW5nIGNvbXBhcmVkIHdpdGggaXMKICAgICAgICAgICAgbm90IGNvcnJlY3QuIFRoZSBzdWJzZXF1ZW50IGJlaGF2aW91ciB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uCiAgICAgICAgICAgIGFuZCB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBiZWluZyB1c2VkLCBidXQgaXMgbm93IGNvbnNpc3RlbnQgd2l0aCBub3JtYWwgUHl0aG9uCiAgICAgICAgICAgIGJlaGF2aW91ci4gRm9yIGV4YW1wbGUsIGZvciB0aGUgZmlyc3QgNCBvcGVyYXRvciBvdmVybG9hZHMgYWJvdmUsIGEgVHlwZUVycm9yCiAgICAgICAgICAgICd1bm9yZGVyYWJsZSB0eXBlcycgaXMgdGhyb3duIGluIFB5dGhvbiAzLCBidXQgUHl0aG9uIDIgd2lsbCByZXR1cm4gVHJ1ZSBvciBGYWxzZS4KICAgICAgICAgICAgTm90SW1wbGVtZW50ZWQgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIGNvbXBhcmlzb24gY2Fubm90IGJlIGRvbmUsIHNlZSBQRVAgMjA3IGFuZAogICAgICAgICAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvY29uc3RhbnRzLmh0bWwjTm90SW1wbGVtZW50ZWQKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgYnVnIHdhcyBvbmx5IHByZXNlbnQgd2hlbiBvdmVybG9hZGVkIG9wZXJhdG9ycyBkaWQgbm90IGFsc28gaGF2ZSBhCiAgICAgICAgICAgIGZ1bmN0aW9uIG92ZXJsb2FkLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnICMxMjA4ICgzNDQxMjYyKSBhbmQgU0YgcGF0Y2ggIzMwMy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wNi0xNzogZmFicmljZTEwMgogICAgICAgICAgICBbR29dIEZpeCBHbyBjYWxsYmFjayBleGFtcGxlLiAgRml4ZXMgZ2l0aHViICM2MDAsICM5NTUsICMxMDAwLgoKMjAxNy0wNi0xNjogd3NmdWx0b24KICAgICAgICAgICAgTWFrZSBzdXJlIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIGFyZSBub3Qgc3BsaXQgdXAgYnkgb3RoZXIgcHJvY2Vzc2VzIHdyaXRpbmcgdG8KICAgICAgICAgICAgc3Rkb3V0IGF0IHRoZSBzYW1lIHRpbWUuCgoyMDE3LTA2LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHdyYXBwaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbnRhaW5pbmcgcnZhbHVlIGFuZCBsdmFsdWUgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCgoyMDE3LTA2LTEzOiBvbGx5CgkgICAgW1BlcmxdIEZpeCB0ZXN0c3VpdGUgdG8gd29yayB3aXRob3V0IC4gaW4gQElOQyAtIGl0IHdhcyByZW1vdmVkIGluCgkgICAgUGVybCA1LjI2IGZvciBzZWN1cml0eSByZWFzb25zLCBhbmQgaGFzIGFsc28gYmVlbiByZW1vdmVkIGZyb20KCSAgICBvbGRlciB2ZXJzaW9ucyBpbiBzb21lIGRpc3Ryb3MuICBGaXhlcyAjOTk3IHJlcG9ydGVkIGJ5IGxmYW0uCgoyMDE3LTA2LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWltcG9ydCBvbiBhIGZpbGUgY29udGFpbmluZyBhIGZpbGUgc2NvcGUgJWZyYWdtZW50IGZvcmNlZCBpbmNsdXNpb24gdG8gbm90CiAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBmcmFnbWVudCBjb250ZW50cyBhcyAlaW1wb3J0IHNob3VsZCBub3QgcmVzdWx0IGluIGNvZGUgYmVpbmcgZ2VuZXJhdGVkLgogICAgICAgICAgICBUaGUgYmVoYXZpb3VyIGlzIG5vdyB0aGUgc2FtZSBhcyBpbXBvcnRpbmcgY29kZSBpbnNlcnRpb24gYmxvY2tzLgogICAgICAgICAgICBXcmFwcGluZyBGaWxlQy5pIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3aWxsIHJlc3VsdCBpbiBubyBnZW5lcmF0ZWQgY29kZSwgd2hlcmVhcwogICAgICAgICAgICBwcmV2aW91c2x5ICIjaW5jbHVkZSA8bGltaXRzLmg+IiB3YXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAvLyBGaWxlQS5pCiAgICAgICAgICAgICAgJWZyYWdtZW50KCI8bGltaXRzLmg+IiwgImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAjaW5jbHVkZSA8bGltaXRzLmg+CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPgogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWZyYWdtZW50KCI8bGltaXRzLmg+Iik7CgogICAgICAgICAgICAgIC8vIEZpbGVDLmkKICAgICAgICAgICAgICAlaW1wb3J0ICJGaWxlQS5pIgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTA1LTI2OiBWb2xrZXIgRGllbHMtR3JhYnNjaCwgdmFkegogICAgICAgICAgICBbSmF2YV0gIzg0MiBFeHRlbmQgZnJvbSBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0PD4gYW5kIGltcGxlbWVudCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzIGZvcgogICAgICAgICAgICBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhpcyBub3RhYmx5IGFsbG93cyB0byBpdGVyYXRlIG92ZXIgd3JhcHBlZCB2ZWN0b3JzIGluIGEgbmF0dXJhbCB3YXkuCiAgICAgICAgICAgIE5vdGUgdGhhdCBib3hlZCB0eXBlcyBhcmUgbm93IHVzZWQgaW4gdGhlIEphdmEgbGF5ZXIgd2hlbiB3cmFwcGluZyB2ZWN0b3Igb2YgQyBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMsIGZvciBleGFtcGxlLiBUaGlzIG1heSBpbnRyb2R1Y2Ugc29tZSBzdWJ0bGUgaW5jb21wYXRpYmlsaXRpZXMgZHVlIHRvIHNvbWUKICAgICAgICAgICAgZGlmZmVyZW5jZXMgaW4gaG93IEphdmEgY29udmVydHMgYm94ZWQgdHlwZXMgYW5kIHVuYm94ZWQgdHlwZXMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICBpbnQgaT0wOwogICAgICAgICAgICAgIGRvdWJsZSBkMSA9IGk7IC8vIG9rCiAgICAgICAgICAgICAgRG91YmxlIGQyID0gaTsgLy8gZXJyb3I6IGluY29tcGF0aWJsZSB0eXBlczogaW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gRG91YmxlCgogICAgICAgICAgICBUaGlzIGNhbiBiZSBhIHByb2JsZW0gd2hlbiBjYWxsaW5nIHRoZSBhZGQgYW5kIHNldCBmdW5jdGlvbnMuIEEgc3VnZ2VzdGVkIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmxlIHdvcmthcm91bmQgaXMgdG8gdXNlIHNvbWV0aGluZyBsaWtlIChzaG93biBmb3Igc3RkOjp2ZWN0b3I8ZG91YmxlPjoKCiAgICAgICAgICAgICAgI2lmIGRlZmluZWQoU1dJR0pBVkEpCiAgICAgICAgICAgICAgLy8gQWRkIGluIG9sZCBhcGkgdGhhdCB1c2VzIG5vbi1ib3hlZCB0eXBlcwogICAgICAgICAgICAgICVleHRlbmQgc3RkOjp2ZWN0b3I8ZG91YmxlPiB7CiAgICAgICAgICAgICAgJXByb3h5Y29kZSAlewogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkKGRvdWJsZSB4KSB7CiAgICAgICAgICAgICAgICAgIGFkZChEb3VibGUudmFsdWVPZih4KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGksIGRvdWJsZSB2YWwpIHsKICAgICAgICAgICAgICAgICAgc2V0KGksIERvdWJsZS52YWx1ZU9mKHZhbCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JEb3VibGUpIHN0ZDo6dmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDUtMzA6IGRhdmlkY2wKICAgICAgICAgICAgW1NjaWxhYl0gIzk5NCBVbmRlZmluZWQgc3ltYm9sIGVycm9yIHdoZW4gbG9hZGluZyBpbiBTY2lsYWIgNgoKMjAxNy0wNS0yNTogYXNpYnJvc3MKICAgICAgICAgICAgW0phdmFdICMzNzAgIzQxNyBNaXNzaW5nIHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBkaXJlY3RvciBleHRyYSBtZXRob2RzCiAgICAgICAgICAgIHN3aWdSZWxlYXNlT3duZXJzaGlwKCkgYW5kIHN3aWdUYWtlT3duZXJzaGlwKCkuCgoyMDE3LTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gIzIzMCAjNzU5IEZpeCBKYXZhIHNoYXJlZF9wdHIgYW5kIGRpcmVjdG9ycyBmb3IgZGVyaXZlZCBjbGFzc2VzIGphdmEgY29tcGlsYXRpb24KICAgICAgICAgICAgZXJyb3IuCgogICAgICAgICAgICBGb3Igc2hhcmVkX3B0ciBwcm94eSBwcm94eSBjbGFzc2VzLCBhZGQgYSBwcm90ZWN0ZWQgbWV0aG9kIHN3aWdTZXRDTWVtT3duIGZvciBtb2RpZnlpbmcKICAgICAgICAgICAgdGhlIHN3aWdDTWVtT3duIGFuZCBzd2lnQ01lbU93bkRlcml2ZWQgbWVtYmVyIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBieSB2YXJpb3VzIG90aGVyCiAgICAgICAgICAgIG1ldGhvZHMgZm9yIGNvbnRyb2xsaW5nIG1lbW9yeSBvd25lcnNoaXAuCgoyMDE3LTA1LTIxOiBTZ2hpcmF0ZQogICAgICAgICAgICBbSmF2YSwgQyMsIERdICM0NDkgUmVtb3ZlIHVubmVjZXNzYXJ5IHVzZSBvZiBkeW5hbWljX2Nhc3QgaW4gZGlyZWN0b3JzIHRvIGVuYWJsZQogICAgICAgICAgICBub24tUlRUSSBjb21waWxhdGlvbi4KCjIwMTctMDUtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM5OTMgRml4IGhhbmRsaW5nIG9mIGRlZmF1bHQgLXZlIHVuc2lnbmVkIHZhbHVlcywgc3VjaCBhczoKICAgICAgICAgICAgICB2b2lkIGYodW5zaWduZWQgPSAtMVUpOwoKMjAxNy0wNS0yMDoganNjaHVlbGxlcgogICAgICAgICAgICBbUHl0aG9uXSAjOTkxIEZpeCBFNzMxIFBFUDggd2FybmluZzogZG8gbm90IGFzc2lnbiBhIGxhbWJkYSBleHByZXNzaW9uCgoyMDE3LTA1LTE2OiBuaWhhbDk1CiAgICAgICAgICAgIFtQSFBdIEFkZCAlcHJhZ21hIHZlcnNpb24gZGlyZWN0aXZlIHRvIGFsbG93IHRoZSB2ZXJzaW9uIG9mIHRoZQogICAgICAgICAgICBleHRlbnNpb24gdG8gYmUgc2V0LiAgUGF0Y2ggIzk3MCwgZml4ZXMgIzM2MC4KCjIwMTctMDUtMTM6IHlhZzAwCiAgICAgICAgICAgIFBhdGNoICM5NzUgLSBBZGQgc3VwcG9ydCBmb3Igbm9leGNlcHQgb24gZGlyZWN0b3IgbWV0aG9kcy4KCjIwMTctMDQtMjc6IHJlZGJyYWluCiAgICAgICAgICAgIElzc3VlICM5NzQsIFBhdGNoICM5NzYgLSBGaXggcHJlcHJvY2Vzc29yIGhhbmRsaW5nIG9mIG1hY3JvcyB3aXRoIGNvbW1hcyBpbiBhIGNvbW1lbnQuCgoyMDE3LTA0LTI1OiBqbGV2ZXF1ZQogICAgICAgICAgICBbTHVhXSAjOTU5IC0gRml4IFZpc3VhbCBTdHVkaW8gQzQyNDQgY29udmVyc2lvbiB3YXJuaW5ncyBpbiBMdWEgd3JhcHBlcnMuCgoyMDE3LTA0LTIxOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5NjQgLSBBZGQgc2hhcmVkX3B0ciBkaXJlY3RvciB0eXBlbWFwcy4KCjIwMTctMDQtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSAjNTg2LCAjOTM1IEFkZCBhc3NlcnQgZm9yIGludmFsaWQgTlVMTCB0eXBlIHBhcmFtZXRlciB3aGVuIGNhbGxpbmcgU1dJR19SdWJ5X05ld1BvaW50ZXJPYmouCgoyMDE3LTA0LTIwOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM5MzAsICM5MzcgLSBGaXggY29udGFpbmVycyBvZiBzdGQ6OnNoYXJlZF9wdHIuCiAgICAgICAgICAgIFVwY2FzdGluZywgY29uc3QgdHlwZXMgKGVnIHZlY3RvcjxzaGFyZWRfcHRyPGNvbnN0IFQ+PikgYW5kIE5VTEwvbnVsbHB0ciBzdXBwb3J0IGFkZGVkLgoKMjAxNy0wNC0xMjogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBOZXcgcGFyYW1ldGVyIHRhcmdldHZlcnNpb24gdG8gc3BlY2lmeSB0aGUgU2NpbGFiIHRhcmdldCB2ZXJzaW9uICg1LCA2LCAuLikgZm9yIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgICBXaXRoIFNjaWxhYiA2IHRhcmdldCBzcGVjaWZpZWQsIGlkZW50aWZpZXIgbmFtZXMgdHJ1bmNhdGlvbiBpcyBkaXNhYmxlZCAobm8gbG9uZ2VyIG5lY2Vzc2FyeSkKCjIwMTctMDMtMjQ6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gRml4ICM5MzkgLSBXcmFwcGluZyBzdGQ6OnZlY3Rvcjxib29sPiBmaXggZHVlIHRvIGluY29ycmVjdCBudWxsIGNoZWNrcwogICAgICAgICAgICBvbiBWQUxVRSBvYmouCgoyMDE3LTAzLTE3OiB2YWR6CiAgICAgICAgICAgIFtDI10gIzk0NyBBZGQgc3VwcG9ydCBmb3Igc3RkOjpjb21wbGV4PFQ+CgoyMDE3LTAzLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBoYW5kbGluZyBvZiB0eXBlZGVmJ2QgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIHR5cGVkZWYnZCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMKICAgICAgICAgICAgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpGblB0cl90ZCkoaW50LCBpbnQpOwogICAgICAgICAgICAgIGludCBkb19vcChpbnQgeCwgaW50IHksIEZuUHRyX3RkIG9wKTsKCjIwMTctMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBtZW1iZXIgY29uc3QgZnVuY3Rpb24gcG9pbnRlcnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgaW50IGZuKHNob3J0IChGdW5jczo6KiBwYXJtKShib29sKSkgY29uc3Q7CgogICAgICAgICAgICBBbHNvIGZpeCBwYXJzaW5nIG9mIHJlZmVyZW5jZXMvcG9pbnRlcnMgYW5kIHF1YWxpZmllcnMgdG8gbWVtYmVyCiAgICAgICAgICAgIHBvaW50ZXJzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGludCBmbihzaG9ydCAoRnVuY3M6OiogY29uc3QgcGFybSkoYm9vbCkpOwogICAgICAgICAgICAgIGludCBmbihzaG9ydCAoRnVuY3M6OiogJiBwYXJtKShib29sKSk7CgoyMDE3LTAzLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBFeHRlbmQgQysrMTEgYWx0ZXJuYXRlIGZ1bmN0aW9uIHN5bnRheCBwYXJzaW5nIHRvIHN1cHBvcnQgY29uc3QgYW5kIG5vZXhjZXB0LCBzdWNoIGFzOgoKICAgICAgICAgICAgICBhdXRvIHN1bTEoaW50IHgsIGludCB5KSBjb25zdCAtPiBpbnQgeyByZXR1cm4geCArIHk7IH0KICAgICAgICAgICAgICBhdXRvIHN1bTIoaW50IHgsIGludCB5KSBub2V4Y2VwdCAtPiBpbnQgeyByZXR1cm4geCArIHk7IH0KCjIwMTctMDItMjk6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzkxNyAtIEFkZCBFbnVtZXJhYmxlIG1vZHVsZSB0byBhbGwgY29udGFpbmVyIGNsYXNzIHdyYXBwZXJzLiBJdCB3YXMgbWlzc2luZwogICAgICAgICAgICBmb3Igc3RkOjpsaXN0LCBzdGQ6Om11bHRpc2V0LCBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldCBhbmQgc3RkOjp1bm9yZGVyZWRfbWFwLgoKMjAxNy0wMi0yNzogYXNzYW1iYXIKICAgICAgICAgICAgW0MrKzExXSBFeHRlbmQgcGFyc2VyIHRvIHN1cHBvcnQgdGhyb3cgc3BlY2lmaWVyIGluIGNvbWJpbmF0aW9uCiAgICAgICAgICAgIHdpdGggb3ZlcnJpZGUgYW5kL29yIGZpbmFsLgoKMjAxNy0wMi0xMDogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjODgzIC0gQWRkIHN1cHBvcnQgZm9yIEMrKzExIGhhc2ggdGFibGVzOgogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldAogICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQKCjIwMTctMDItMDg6IGpjc2hhcnAKICAgICAgICAgICAgW0MjXSAjODg3IEltcHJvdmUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlciBjb25zdHJ1Y3RvcnMgLQogICAgICAgICAgICBSZXBsYWNlIGNvbnN0cnVjdG9yIHRha2luZyBJQ29sbGVjdGlvbiB3aXRoIElFbnVtZXJhYmxlIGFuZCBhbHNvIGFkZCBJRW51bWVyYWJsZTxUPgogICAgICAgICAgICBjb25zdHJ1Y3RvciB0byBhdm9pZCB0aGUgYm94aW5nIGFuZCB1bmJveGluZyBvdmVyaGVhZCBvZiB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IsCiAgICAgICAgICAgIHdoZW4gdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGEgdmFsdWUgdHlwZS4KClZlcnNpb24gMy4wLjEyICgyNyBKYW4gMjAxNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNy0wMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjODgyIEZpeCBtaXNzaW5nIGZpbGVuYW1lIGluIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtCiAgICAgICAgICAgIHdyaXRpbmcgb3V0IEMjIGZpbGVzLgoKMjAxNy0wMS0yNzogYnJpYW5jYWluZQogICAgICAgICAgICBbR3VpbGVdICM3NDQgRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBHdWlsZSB3cmFwcGVycyAtIHJlZ3Jlc3Npb24KICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTMuMC4xMS4KCjIwMTctMDEtMjQ6IGFuZHJleS1zdGFyb2R1YnRzZXYKICAgICAgICAgICAgW0phdmFdIEFwcGx5ICM3MDQgLSBkaXJlY3RvciB0eXBlbWFwIGltcHJvdmVtZW50cy4KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4ZXMsIGFkZCBzdXBwb3J0IGZvciAiZGlyZWN0b3JhcmdvdXQiIHR5cGVtYXAgYW5kCiAgICAgICAgICAgIGFkZCBkaXJlY3RvciBzdXBwb3J0IHRvIHR5cGVtYXBzLmkuCgoyMDE3LTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBFbmhhbmNlICVleHRlbmQgdG8gZXh0ZW5kIGEgY2xhc3Mgd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICAgICAgICBGb28oaW50IGEsIFQgYikgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vKSBGb286OkZvbzxkb3VibGU+OwoKMjAxNy0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzg3NiBFbmhhbmNlICVleHRlbmQgdG8gZXh0ZW5kIGEgY2xhc3Mgd2l0aCB0ZW1wbGF0ZSBtZXRob2RzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICAgdm9pZCBkb19zdHVmZihpbnQgYSwgVCBiKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShkb19zdHVmZl9pbnN0KSBGb286OmRvX3N0dWZmPGRvdWJsZT47CgogICAgICAgICAgICAgIFNpbWlsYXJseSBmb3Igc3RhdGljIHRlbXBsYXRlIG1ldGhvZHMuCgoyMDE3LTAxLTIyOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGFkZCBzdXBwb3J0IGZvciB2ZXJzaW9uIDQuMgogICAgICAgICAgICAtIFRoZSBPY3RhdmUgQVBJIG5vdyB1c2VzIHNvbWUgQysrMTEgZmVhdHVyZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQogICAgICAgICAgICAgIHRoZSBta29jdGZpbGUgcHJvZ3JhbSBzdXBwbGllZCBieSBPY3RhdmUgdG8gY29tcGlsZSB0aGUgU1dJRy1nZW5lcmF0ZWQKICAgICAgICAgICAgICB3cmFwcGVyIGNvZGUsIGFzIG1rb2N0ZmlsZSB3aWxsIGVuc3VyZSB0aGUgY29ycmVjdCBDKysgY29tcGlsZXIvb3B0aW9ucwogICAgICAgICAgICAgIGFyZSB1c2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgbWtvY3RmaWxlIC1wIENYWGAgc2hvdWxkIGJlIHBhcnNlZAogICAgICAgICAgICAgIGZvciBhbnkgLXN0ZD0qIGZsYWdzIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQuCiAgICAgICAgICAgIC0gT2N0YXZlIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yIDw8IGFuZCA+PiBvcGVyYXRvcnMsIHNvIFNXSUcgbm93CiAgICAgICAgICAgICAgaWdub3JlcyB0aGVtLgogICAgICAgICAgICAtIFRoZSBPY3RhdmUgZXJyb3IoKSBmdW5jdGlvbiBub3cgcmFpc2VzIEMrKyBleGNlcHRpb25zIHRvIHByb3BhZ2F0ZQogICAgICAgICAgICAgIE9jdGF2ZSBlcnJvcnMsIHNvICVleGNlcHRpb24gZGlyZWN0aXZlcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgICAgICAgICBGb3IgY29udmVuaWVuY2UgdGhlIFNXSUdfUkVUSFJPV19PQ1RBVkVfRVhDRVBUSU9OUyBtYWNybyBjYW4gYmUgdXNlZAogICAgICAgICAgICAgIHRvIHJldGhyb3cgYW55IE9jdGF2ZSBleGNlcHRpb25zIGZvciBPY3RhdmUgaXRzZWxmIHRvIGhhbmRsZSwgZS5nLjoKCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGNhbGwgZXJyb3IoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU1dJR19SRVRIUk9XX09DVEFWRV9FWENFUFRJT05TICAgLy8gZXJyb3IoKSBleGNlcHRpb25zIGFyZSByZXRocm93bgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTAxLTE2OiB3a2FsaW5pbgogICAgICAgICAgICBbQyNdIEZpeCAjNzMzIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgogICAgICAgICAgICBNaXNzaW5nIHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGUgaW4gQyMgbGF5ZXIgd2hlbiB1c2luZyAlaW1wb3J0LgoKMjAxNy0wMS0xNjogZnNjaGxpbWIKICAgICAgICAgICAgRml4ICM4MTMgdGVtcGxhdGUgc3ltYm9sIG5hbWUgbG9va3VwIGJ1ZyB3aGVuIHR5cGVkZWYgbmFtZXMgYXJlIHRoZSBzYW1lIGJ1dCBpbiBkaWZmZXJlbnQKICAgICAgICAgICAgbmFtZXNwYWNlcy4KCjIwMTctMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBEIEphdmFdCiAgICAgICAgICAgIFRoZSBTV0lHIGxpYnJhcnkgbm8gbG9uZ2VyIHVzZXMgdGhlIGphdmF0eXBlLCBkdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMsIHRoZXJlYnkKICAgICAgICAgICAgY29tcGxldGVseSBmcmVlaW5nIHRoZW0gdXAgZm9yIHVzZXJzIHRvIHVzZSB3aXRob3V0IGhhdmluZyB0byByZXBsaWNhdGUgdGhlIGxpYnJhcnkKICAgICAgICAgICAgY29kZSB0aGF0IHRoZXkgcHJldmlvdXNseSBhZGRlZC4gVGhlIGNvZGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgYnkgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG5ldyAlcHJveHljb2RlIGRpcmVjdGl2ZS4gVGhlaXIgdXNlIGluIHRoZSBsaWJyYXJ5IGNvZGUKICAgICAgICAgICAgd2FzIGZhaXJseSBtaW5pbWFsOgoKICAgICAgICAgICAgICBDIyAgIGNzdHlwZTogICBzdGRfYXJyYXkuaSBzdGRfbWFwLmkgc3RkX3ZlY3Rvci5pCiAgICAgICAgICAgICAgRCAgICBkdHlwZTogICAgc3RkX3ZlY3Rvci5pCiAgICAgICAgICAgICAgSmF2YSBqYXZhdHlwZTogYXJyYXlzX2phdmEuaQoKMjAxNy0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlICVleHRlbmQgZGlyZWN0aXZlIGNhbiBub3cgb3B0aW9uYWxseSBzdXBwb3J0IG9uZSBvZiB0aGUgJ2NsYXNzJywgJ3N0cnVjdCcgb3IgJ3VuaW9uJwogICAgICAgICAgICBrZXl3b3JkcyBiZWZvcmUgdGhlIGlkZW50aWZpZXIgbmFtZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHsgLi4uIH07CiAgICAgICAgICAgICAgJWV4dGVuZCBzdHJ1Y3QgWCB7IC4uLiB9CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoaXMgaGFkIHRvIHNwZWNpZmllZCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFggeyAuLi4gfTsKICAgICAgICAgICAgICAlZXh0ZW5kIFggeyAuLi4gfQoKMjAxNy0wMS0xMzogd3NmdWx0b24KCSAgICBbQyMgRCBKYXZhXSBBZGQgbmV3ICVwcm94eWNvZGUgZGlyZWN0aXZlIHdoaWNoIGlzIGEgbWFjcm8gZm9yICVpbnNlcnQoInByb3h5Y29kZSIpLgogICAgICAgICAgICBUaGlzIGlzIGEgd2F5IG9mIGFkZGluZyBwdXJlIEMjL0QvSmF2YSBjb2RlIGludG8gdGhlIGFwcHJvcHJpYXRlIHByb3h5IGNsYXNzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBQcm94eTIgewogICAgICAgICAgICAgICVwcm94eWNvZGUgJXsKICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJveHljb2RlMihpbnQgaSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gaSsyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgc3RydWN0IFByb3h5MiB7fTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgd2lsbCB0aGVuIGJlIGEgcHVyZSBKYXZhL0MjL0QgbWV0aG9kIGNhbGxlZCBwcm94eWNvZGUyIGluIHRoZSBQcm94eTIgY2xhc3MuCgoyMDE2LTEyLTMxOiBhanJoZWFkaW5nMQoJICAgIElzc3VlICM4NjAgLSBSZW1vdmUgdXNlIG9mIHN0ZDo6dW5hcnlfZnVuY3Rpb24gYW5kIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uCiAgICAgICAgICAgIHdoaWNoIGlzIGRlcHJlY2F0ZWQgaW4gQysrMTEuCgoyMDE2LTEyLTMwOiBvbGx5CgkgICAgW1BIUDddIFJlZ2lzdGVyIGludGVybmFsICdzd2lnX3J1bnRpbWVfZGF0YV90eXBlX3BvaW50ZXInIGNvbnN0YW50CgkgICAgYXMgIkNPTlNUX1BFUlNJU1RFTlQiIHRvIGF2b2lkIHNlZ21lbnRhdGlvbiBmYXVsdCBvbiBtb2R1bGUgdW5sb2FkLgoJICAgIEZpeGVzICM4NTkgcmVwb3J0ZWQgYnkgVGltb3RoZXVzIFBva29ycmEuIFRoYW5rcyBhbHNvIHRvIEphdmllciBUb3JyZXMKCSAgICBmb3IgYSBtaW5pbWFsIHJlcHJvZHVjZXIuCgpWZXJzaW9uIDMuMC4xMSAoMjkgRGVjIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMTItMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkICVmZWF0dXJlKCJjc2RpcmVjdG9yZGVsZWdhdGVtb2RpZmllcnMiKSB0byBlbmFibGUgY3VzdG9taXphdGlvbgogICAgICAgICAgICBvZiB0aGUgZGVsZWdhdGUgYWNjZXNzIG1vZGlmaWVycyBnZW5lcmF0ZWQgaW4gZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRml4ZXMgaXNzdWUgIzc0OC4KCjIwMTYtMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBidWlsdGluICJweXRob246c2xvdCIgZmVhdHVyZSBmYWlsaW5nIGZvciB0cF9oYXNoIHdoZW4gdXNpbmcKICAgICAgICAgICAgaGFzaGZ1bmMgY2xvc3VyZSB3aXRoIGEgIldyb25nIHR5cGUgZm9yIGhhc2ggZnVuY3Rpb24iIGZvciBQeXRob24gMi4KICAgICAgICAgICAgSXNzdWUgIzg0My4KCjIwMTYtMTItMjE6IGpvZXF1YW10CiAgICAgICAgICAgIENoYW5nZWQgZ2VuZXJhdGlvbiBvZiBmdW5jdGlvbnMgc28gdGhhdCBvbmx5IGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IGVuZCBpbiBfc2V0IGdlbmVyYXRlIGFjY2Vzc29yIGZ1bmN0aW9ucyByYXRoZXIgdGhhbgoJICAgIGxvb2tpbmcgZm9yICJzZXQiLgoJICAgIENoYW5nZSBnZW5lcmF0aW9uIG9mIG9wZXJhdG9ycyB0byBub3QgaGF2ZSB1bmRlcnNjb3JlcwoJICAgIHRvIHN0YXJ0IGluIFIuIFVzZXJzIG5lZWQgdG8gcHJvdmlkZSBjdXN0b20gbmFtZXMgZm9yIHRoZXNlIG9wZXJhdG9yIG92ZXJsb2Fkcy4KCjIwMTYtMTItMjE6IG9sbHkKCSAgICBGaXggaXNmaW5pdGUoKSBjaGVja3MgdG8gd29yayB3aXRoIGFsbCBDKysxMSBjb21waWxlcnMuCgkgICAgRml4ZXMgaXNzdWVzICM2MTUsICM3ODggYW5kICM4NDkuCgoyMDE2LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICAlbmFtZXdhcm4gdW5uZWNlc3NhcmlseSBjYXVzZWQga2V5d29yZCB3YXJuaW5ncyBmb3Igbm9uLWluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBjbGFzc2VzCiAgICAgICAgICAgIGFuZCBkdXBsaWNhdGUgd2FybmluZ3MgZm9yIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdoZW4ga2V5d29yZHMgd2VyZSB1c2VkLgogICAgICAgICAgICBJc3N1ZSAjODQ1LgoKMjAxNi0xMi0xODogZXpyYWxhbmdsb2lzIAogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmVdIE1lbW9yeSBsZWFrIGZpeCBvbiBlcnJvciBpbiBzdGQ6OnBhaXIgd3JhcHBlcnMuCiAgICAgICAgICAgIElzc3VlICM4NTEuCgoyMDE2LTEyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBaZXJvIGluaXRpYWxpemUgYXJyYXlzIHdoZW4gdXNpbmcgJWFycmF5X2NsYXNzIGFuZCAlYXJyYXlfZnVuY3Rpb25zLgoKMjAxNi0xMi0xODogdC1pa2VnYW1pCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjNDQ2CiAgICAgICAgICAgIFB5dGhvbiAlYXJyYXlfY2xhc3Mgb2YgY2FycmF5cy5pIGZhaWxlZCB3aXRoIC1idWlsdGluIG9wdGlvbi4KCjIwMTYtMTItMTY6IGJyaWFuY2FpbmUKICAgICAgICAgICAgW0d1aWxlXSBQYXRjaCAjNzQ0IEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlJ3MgbmF0aXZlIHBvaW50ZXIgZnVuY3Rpb25hbGl0eQoKMjAxNi0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzc2OS4KICAgICAgICAgICAgQWRkIG9wdGlvbmFsIG1vZHVsZWltcG9ydCBhdHRyaWJ1dGUgdG8gJW1vZHVsZSBzbyB0aGF0IHRoZQogICAgICAgICAgICBkZWZhdWx0IG1vZHVsZSBpbXBvcnQgY29kZSBjYW4gYmUgb3ZlcnJpZGRlbi4gU2VlIHRoZSAiU2VhcmNoaW5nIGZvciB0aGUgd3JhcHBlciBtb2R1bGUiCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gaW4gUHl0aG9uLmh0bWwuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgX2ZvbyIpIGZvbwoKICAgICAgICAgICAgJG1vZHVsZSBhbHNvIGV4cGFuZHMgdG8gdGhlIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgbmFtZSwgc28gdGhlIGZvbGxvd2luZyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyBhYm92ZQoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGUiKSBmb28KCjIwMTYtMTEtMzA6IG9sbHkKCSAgICBbUEhQXSBBZGQgc3VwcG9ydCBmb3IgUEhQNy4gIFBIUDUncyBDIGV4dGVuc2lvbiBBUEkgaGFzIGNoYW5nZWQKCSAgICBzdWJzdGFudGlhbGx5IHNvIHlvdSBuZWVkIHRvIHVzZSAtcGhwNyB0byBzcGVjaWZ5IHlvdSB3YW50IFBIUDcKCSAgICBjb21wYXRpYmxlIHdyYXBwZXJzLiAgVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBnZW5lcmF0ZWQgd3JhcHBlcnMKCSAgICBpcyBub3cgLmN4eCAodG8gbWF0Y2ggU1dJRydzIGRlZmF1bHQgZm9yIGV2ZXJ5IG90aGVyIGxhbmd1YWdlIC0gdG8KCSAgICBnZW5lcmF0ZSBmb29fd3JhcC5jcHAgeW91IGNhbiBydW4gU1dJRyB3aXRoIC1jcHBleHQgY3BwKS4gIEZpeGVzCgkgICAgaXNzdWUgIzU3MS4KCgkgICAgQXMgcGFydCBvZiB0aGlzIGNoYW5nZSwgdGhlIGxhbmd1YWdlIHN1YmRpcmVjdG9yeSBmb3IgUEhQNSBoYXMKCSAgICBjaGFuZ2VkIGZyb20gInBocCIgdG8gInBocDUiIC0gaWYgeW91IGFyZSBtYWtpbmcgdXNlIG9mIHRoZSBzZWFyY2gKCSAgICBwYXRoIGZlYXR1cmUgd2hlcmUgdGhlIGxhbmd1YWdlIHN1YmRpcmVjdG9yeSBvZiBlYWNoIGRpcmVjdG9yeQoJICAgIGlzIGFsc28gc2VhcmNoZWQsIHlvdSdsbCBuZWVkIHRvIHVwZGF0ZSB5b3VyIGJpbmRpbmdzLiAgQSBzaW1wbGUKCSAgICBmaXggd2hpY2ggd29ya3MgZm9yIG9sZGVyIGFuZCBuZXdlciBTV0lHIGlzIHRvIGFkZCBhIHN5bWxpbms6CgkgICAgbG4gLXMgcGhwIHBocDUKCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTExLTMwOiBvbGx5CgkgICAgW1BIUF0gT25seSBlbWl0IG9uZSBjb3B5IG9mIGVhY2ggZGlzdGluY3QgYXJnaW5mby4gIFByZXZpb3VzbHkgd2UKCSAgICBlbWl0dGVkIGEgc2VwYXJhdGUgb25lIGZvciBldmVyeSB3cmFwcGVkIGZ1bmN0aW9uLCBidXQgdHlwaWNhbGx5CgkgICAgbWFueSBmdW5jdGlvbnMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgY29tYmluYXRpb25zCgkgICAgb2YgcGFyYW1ldGVycyBwYXNzZWQgYnkgcmVmZXJlbmNlIG9yIG5vdC4KCgkgICAgVGhpcyBjaGFuZ2Ugc2lnbmlmaWNhbnRseSByZWR1Y2VzIGJvdGggdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZAoJICAgIHdyYXBwZXIsIGFuZCBvZiB0aGUgY29tcGlsZWQgUEhQIGV4dGVuc2lvbiBtb2R1bGUgKGUuZy4gYnkgfjYlIGZvcgoJICAgIHRoZSBzdHJpcHBlZCBleHRlbnNpb24gbW9kdWxlIGZvciBYYXBpYW4ncyBQSFA3IGJpbmRpbmdzKS4KCjIwMTYtMTEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlcmVuYW1lIG92ZXJyaWRlIG9mIHdpbGRjYXJkICVyZW5hbWUgZm9yIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoR2xvYmFsSW50T3BlcmF0b3IpICo6Om9wZXJhdG9yIGJvb2w7IC8vIHdpbGRjYXJkICVyZW5hbWUKCiAgICAgICAgICAgICAgJXJlbmFtZShYSW50T3BlcmF0b3IpIFg6Om9wZXJhdG9yIGJvb2w7IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGZpcnN0ICVyZW5hbWUgYWJvdmUKICAgICAgICAgICAgICBPUgogICAgICAgICAgICAgICVyZW5hbWUoWEludE9wZXJhdG9yKSBYPGludD46Om9wZXJhdG9yIGJvb2w7IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGZpcnN0ICVyZW5hbWUgYWJvdmUKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggewogICAgICAgICAgICAgICAgb3BlcmF0b3IgYm9vbCgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoWGludCkgWDxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzICVyZW5hbWUgb3ZlcnJpZGUgb2YgZ2xvYmFsICVyZW5hbWUgZm9yIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8vIEdsb2JhbCByZW5hbWUgdG8gbWFrZSBhbGwgZnVuY3Rpb25zIHN0YXJ0IHdpdGggYSBsb3dlciBjYXNlIGxldHRlcgogICAgICAgICAgICAgICVyZW5hbWUoIiUoZmlyc3Rsb3dlcmNhc2UpcyIsICUkaXNmdW5jdGlvbiApICIiOwogICAgICAgICAgICAgICVyZW5hbWUod29vaG9vKSBXOjpXb287IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGFib3ZlICVyZW5hbWUKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFcgewogICAgICAgICAgICAgICAgVyBXb28oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFdpbnQpIFc8aW50PjsKCiAgICAgICAgICAgIFRoZSBhYm92ZSBhbHNvIGludHJvZHVjZXMgYSBwb3NzaWJseSB1bmV4cGVjdGVkIGNoYW5nZS4gTWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgcHJvdmlkZWQgYnkgU1dJRyB1c2UgJXJlbmFtZSB0byByZW5hbWUgc29tZSBtZXRob2RzLCBlZyBpbiBzdGQ6OnZlY3RvciwgcHVzaF9iYWNrCiAgICAgICAgICAgIGlzIHJlbmFtZWQgdG8gYWRkIGluIEphdmEuIFByZXZpb3VzbHkgdGhpcyBpbnRlbmRlZCByZW5hbWUgZGlkIG5vdCBoYXBwZW4gd2hlbiB1c2luZwogICAgICAgICAgICB1c2luZyBnbG9iYWwgJXJlbmFtZSBydWxlcyBhbmQgdGhlIG1ldGhvZCB3b3VsZCByZW1haW4gYXMgcHVzaF9iYWNrLCBidXQgaXMgbm93CiAgICAgICAgICAgIHJlbmFtZWQgdG8gYWRkLiBTb21lIG1vcmUgaW5mbyBpbiBpc3N1ZSAjODU2LgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMTEtMjY6IG03dGhvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjNzA5IC0gaW1wcm92ZWQgd3JhcHBpbmcgb2YgZGl2aXNpb24gb3BlcmF0b3JzCiAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyBub3cgd29ya3MgaW4gUHl0aG9uIDIgd2hldGhlciBvciBub3QgdGhlCiAgICAgICAgICAgIC1weTMgZmxhZyBpcyB1c2VkLgoKMjAxNi0xMS0xMjogam9lcXVhbnQKICAgICAgICAgICAgW1JdIElzc3VlICM2OTcgLSBmaXggY29tbWEgaXNzdWUgd2l0aCBvdmVybG9hZCBtZXRob2RzCgoyMDE2LTExLTEyOiBqb2VxdWFudAoJICAgIFtSXSBJc3N1ZSAjNTU1IC0gUiBydW50aW1lIG5lZWRzIHN0ZGlvLmgKCjIwMTYtMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM4MTYgLSBmaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyAtZXh0cmFuYXRpdmUgYW5kIC1idWlsdGluLgoKMjAxNi0xMS0wMjogbGlvcmdvbGQKICAgICAgICAgICAgUGF0Y2ggIzc0MSAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSBhbGlhcyB0ZW1wbGF0ZXMsIHNlZSB1cGRhdGVkIENQbHVzUGx1czExLmh0bWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KCjIwMTYtMTAtMzA6IG15ZDczNDkKICAgICAgICAgICAgW0MjXSBQYXRjaCAjNzQwIEFkZCBzdGRfYXJyYXkuaSBmb3IgQyMgZm9yIHdyYXBwaW5nIHN0ZDo6YXJyYXkuCgogICAgICAgICAgICBQYXRjaCBhbHNvIGVuaGFuY2VzIHN0ZDo6dmVjdG9yPHN0ZDo6d3N0cmluZz4gQyMgd3JhcHBlcnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9ucwogICAgICAgICAgICAoQ29udGFpbnMsIEluZGV4T2YsIExhc3RJbmRleE9mIGFuZCBSZW1vdmUpLgoKMjAxNi0xMC0zMDogdG9iaWxhdQogICAgICAgICAgICBbSmF2YV0gRml4IHdyYXBwZXJzIGZvciB3c3RyaW5nIHBhcmFtZXRlcnMgaW4gZGlyZWN0b3IgbWV0aG9kcyB0byBjbGVhbnVwIGxvY2FsCiAgICAgICAgICAgIHJlZiBhZnRlciBkaXJlY3RvciBjYWxsYmFjayBoYXMgZmluaXNoZWQuCgoyMDE2LTEwLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBtaXNzaW5nIGNzZGlyZWN0b3JpbiBWT0lEX0lOVF9QVFIgYW5kIGNzZGlyZWN0b3JvdXQgVk9JRF9JTlRfUFRSIHR5cGVtYXBzLgoKMjAxNi0xMC0yMzogaml1bG9uZ3cKICAgICAgICAgICAgUGF0Y2ggIzc4MSAtIEZpeCB3cmFwcGluZyBvZiBDIGNvbXBvdW5kIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgY2hhciBjb25zdGFudHMKICAgICAgICAgICAgaW4gcXVvdGVzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICNkZWZpbmUgSF9TVVBQUkVTU19TQ0FMSU5HX01BR0lDICgoJ3MnPDwyNCkgfCAoJ3UnPDwxNikgfCAoJ3AnPDw4KSB8ICdwJykKCiAgICAgICAgICAgICAgZW51bSBEaWZmZXJlbnRUeXBlcyB7CiAgICAgICAgICAgICAgICB0eXBlY2hhcmNvbXBvdW5kPSdBJysxLAogICAgICAgICAgICAgICAgdHlwZWNoYXJjb21wb3VuZDI9J0InIDw8IDIKICAgICAgICAgICAgICB9OwoKMjAxNi0xMC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzgwOCAtIGZpeCBQeXRob24gcGlja2xpbmcgYW5kIG1ldGFjbGFzcyBmb3IgYnVpbHRpbiB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSBtZXRhY2xhc3MgKFN3aWdQeU9iamVjdFR5cGUpIGZvciBTV0lHIG9iamVjdHMgd2FzIG5vdCBkZWZpbmVkIGluCiAgICAgICAgICAgIGEgd2F5IHRoYXQgbGV0IGltcG9ydGxpYiBzdWNjZXNzZnVsbHkgaW1wb3J0IHRoZSBQeXRob24gd3JhcHBlcnMuCiAgICAgICAgICAgIFRoZSBwaWNrbGUgbW9kdWxlIHByZXZpb3VzbHkgZmFpbGVkIHRvIHBpY2tsZSBvYmplY3RzIGJlY2F1c2UgaXQgY291bGRuJ3QKICAgICAgICAgICAgZGV0ZXJtaW5lIHdoYXQgbW9kdWxlIHRoZSBTV0lHIHdyYXBwZWQgb2JqZWN0cyB3ZXJlIGluLgoKMjAxNi0wOS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0FsbGVncm9jbCwgQ0ZGSSwgR08sIEphdmFzY3JpcHQsIE9jYW1sLCBSLCBTY2lsYWJdCiAgICAgICAgICAgIEFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIHRoZSAicmV0IiB0eXBlbWFwIGluIGEgZmV3IHRhcmdldCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGFsc28gbm93IGhhcyBpbmZvIG9uIHRoZSAicmV0IiB0eXBlbWFwLgoKMjAxNi0wOS0yNzogYWhtZWQtdXNtYW4KICAgICAgICAgICAgW3htbF0gSGFuZGxlIHRlbXBsYXRlIHBhcmFtZXRlcnMgY29ycmVjdGx5LgoKMjAxNi0wOS0yNzogZG9udHBhbmljOTIKICAgICAgICAgICAgW0dvXSBGaXggYXJndW1lbnQgbmFtZXMgaW4gaW5oZXJpdGVkIGZ1bmN0aW9ucyB0YWtpbmcgbW9yZSB0aGFuIDgKICAgICAgICAgICAgcGFyYW1ldGVycy4gIEZpeGVzICM3OTUuCgoyMDE2LTA5LTI2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIG1saXN0cyB0aGF0IG1hcCBwb2ludGVycyBjYW4gYmUgZ2l2ZW4gYSBjdXN0b20gdHlwZSBuYW1lLgoKMjAxNi0wOS0yNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzc5MyBmcm9tIHEtcCB0byBleHBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nIHRvIGluY2x1ZGUgc3RkOjpiYWRfY2FzdAogICAgICAgICAgICBpbiBzdGRfZXhjZXB0LmkuCgoyMDE2LTA5LTI0OiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCBjb2RlIGdlbmVyYXRlZCBmb3IgZmVhdHVyZSgiZGlyZWN0b3I6ZXhjZXB0IikgLQogICAgICAgICAgICBwcmV2aW91c2x5IHRoZSByZXR1cm4gdmFsdWUgb2YgY2FsbF91c2VyX2Z1bmN0aW9uKCkgd2FzIGlnbm9yZWQgYW5kCiAgICAgICAgICAgIHdlIGNoZWNrZWQgYW4gdW5pbml0aWFsaXNlZCB2YWx1ZSBpbnN0ZWFkLiAgRml4ZXMgIzYyNy4gIEJhc2VkIG9uCiAgICAgICAgICAgIHBhdGNoIGZyb20gU2VyZ2V5IFNlcm9zaHRhbi4KCjIwMTYtMDktMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1vcmUgZmxleGlibGUgcHl0aG9uIGJ1aWx0aW4gc2xvdHMgZm9yIG92ZXJsb2FkZWQgQysrIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIGNsb3N1cmUgbmFtZXMgdXNlZCBmb3IgYnVpbHRpbiBzbG90cyBhcmUgbWFuZ2xlZCB3aXRoIHRoZWlyIGZ1bmN0eXBlIHNvCiAgICAgICAgICAgIHRoYXQgb3ZlcmxvYWRlZCBDKysgbWV0aG9kIG5hbWVzIGNhbiBiZSB1c2VkIGZvciBtdWx0aXBsZSBzbG90cy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246c2xvdCIsICJtcF9zdWJzY3JpcHQiLCBmdW5jdHlwZT0iYmluYXJ5ZnVuYyIpIFNpbXBsZUFycmF5OjpfX2dldGl0ZW1fXzsKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOnNsb3QiLCAic3FfaXRlbSIsIGZ1bmN0eXBlPSJzc2l6ZWFyZ2Z1bmMiKSBTaW1wbGVBcnJheTo6X19nZXRpdGVtX18oUHlfc3NpemVfdCBuKTsKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgY2xvc3VyZXM6CgogICAgICAgICAgICAgIFNXSUdQWV9TU0laRUFSR0ZVTkNfQ0xPU1VSRShfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fXykgLyogZGVmaW5lcyBfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fX19zc2l6ZWFyZ2Z1bmNfY2xvc3VyZSAqLwogICAgICAgICAgICAgIFNXSUdQWV9CSU5BUllGVU5DX0NMT1NVUkUoX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX18pIC8qIGRlZmluZXMgX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX19fYmluYXJ5ZnVuY19jbG9zdXJlICovCgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgb25lIG5hbWUgd2FzIGRlZmluZWQ6IF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fX2Nsb3N1cmUuCiAgICAgICAgICAgIEhlbmNlIHRoZSBvdmVybG9hZGVkIF9fZ2V0aXRlbV9fIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGJvdGggbXBfc3Vic2NyaXB0IGFuZCBzcV9pdGVtIHNsb3RzLgoKMjAxNi0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGl0ZXJhdG9ycyBmb3IgY29udGFpbmVycyBvZiBOVUxMIHBvaW50ZXJzIChvciBQeXRob24gTm9uZSkgd2hlbiB1c2luZwogICAgICAgICAgICAtYnVpbHRpbi4gUHJldmlvdXNseSBpdGVyYXRpb24gd291bGQgc3RvcCBhdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHdhcyBOVUxMLgoKMjAxNi0wOS0xNjogb2xseQogICAgICAgICAgICBbSmF2YXNjcmlwdF0gRml4IFNXSUdfZXhjZXB0aW9uKCkgbWFjcm8gdG8gcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQKICAgICAgICAgICAgZnVuY3Rpb24uICBGaXhlcyAjNzg5LCByZXBvcnRlZCBieSBKdWxpZW4gRHV0cmlhdXguCgoyMDE2LTA5LTE2OiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCBTV0lHX2V4Y2VwdGlvbigpIG1hY3JvIHRvIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgogICAgICAgICAgICBGaXhlcyAjMjQwLCByZXBvcnRlZCBieSBTZXJnZXkgU2Vyb3NodGFuLgoKMjAxNi0wOS0xMjogeHlwcm9uCiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzc4NiBLZXl3b3JkIHJlbmFtZSB0byBiZSBDTFMgY29tcGxpYW50IGJ5IGFkZGluZyBhbiB1bmRlcnNjb3JlCiAgICAgICAgICAgIHN1ZmZpeCBpbnN0ZWFkIG9mIGFuIHVuZGVyc2NvcmUgcHJlZml4IHRvIHRoZSBDIHN5bWJvbCBuYW1lLiBQbGVhc2UgdXNlIGFuIGV4cGxpY2l0CiAgICAgICAgICAgICVyZW5hbWUgdG8gcmVuYW1lIHRoZSBzeW1ib2wgd2l0aCBhIF8gcHJlZml4IGlmIHlvdSB3YW50IHRoZSBvbGQgc3ltYm9sIG5hbWUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMDktMDk6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IGltcG9ydCBoYW5kbGluZyBmb3IgUHl0aG9uIDIuNiB0byB3b3JrIGluIGEgZnJvemVuCiAgICAgICAgICAgIGFwcGxpY2F0aW9uLiAgRml4ZXMgIzE0NSwgcmVwb3J0ZWQgYnkgVGhvbWFzIEtsdXl2ZXIuCgoyMDE2LTA5LTAyOiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIFBvaW50ZXJzIGFyZSBtYXBwZWQgdG8gbWxpc3QgaW5zdGVhZCBvZiB0bGlzdAogICAgICAgICAgICAobWxpc3QgYmV0dGVyIGZvciBzY2lsYWIgb3ZlcmxvYWRpbmcpCgoyMDE2LTA5LTAyOiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCAib3V0IiB0eXBlbWFwIGZvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgYW5kICJpbiIKICAgICAgICAgICAgdHlwZW1hcCBmb3IgY2hhciBJTlBVVFtBTlldLgoKMjAxNi0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gTW9yZSBlZmZpY2llbnQgUHl0aG9uIHNsaWNpbmcuCiAgICAgICAgICAgIENhbGwgcmVzZXJ2ZSBmb3IgY29udGFpbmVyIHR5cGVzIHRoYXQgc3VwcG9ydCBpdCB0byBhdm9pZCByZXBlYXRlZAogICAgICAgICAgICBtZW1vcnkgcmVhbGxvY2F0aW9ucyBmb3IgbmV3IHNsaWNlcyBvciBzbGljZXMgdGhhdCBncm93IGluIHNpemUuCgoyMDE2LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzcxIC0gTWFrZSBidWlsdGluIHR5cGVzIGhhc2hhYmxlIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIERlZmF1bHQgaGFzaCBpcyB0aGUgdW5kZXJseWluZyBDL0MrKyBwb2ludGVyLiBUaGlzIG1hdGNoZXMgdXAgd2l0aCB0ZXN0aW5nIGZvcgogICAgICAgICAgICBlcXVpdmFsZW5jZSAoUHlfRVEgaW4gU3dpZ1B5T2JqZWN0X3JpY2hjb21wYXJlKSB3aGljaCBjb21wYXJlcyB0aGUgcG9pbnRlcnMuCgoyMDE2LTA4LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaGUgZm9sbG93aW5nIGJ1aWx0aW4gc2xvdHMgY2FuIGJlIGN1c3RvbWl6ZWQgbGlrZSBvdGhlciBzbG90cyB2aWEgdGhlCiAgICAgICAgICAgICJweXRob246PHg+IiBhbmQgInB5dGhvbjpzbG90IiBmZWF0dXJlcyB3aGVyZSA8eD4gaXMgdGhlIGFwcHJvcHJpYXRlIHNsb3QgbmFtZToKICAgICAgICAgICAgICB0cF9hbGxvY3MKICAgICAgICAgICAgICB0cF9iYXNlcwogICAgICAgICAgICAgIHRwX2Jhc2ljc2l6ZQogICAgICAgICAgICAgIHRwX2NhY2hlCiAgICAgICAgICAgICAgdHBfZGVsCiAgICAgICAgICAgICAgdHBfZGVhbGxvYwogICAgICAgICAgICAgIHRwX2ZsYWdzCiAgICAgICAgICAgICAgdHBfZnJlZXMKICAgICAgICAgICAgICB0cF9nZXRzZXQKICAgICAgICAgICAgICB0cF9pc19nYwogICAgICAgICAgICAgIHRwX21heGFsbG9jCiAgICAgICAgICAgICAgdHBfbWV0aG9kcwogICAgICAgICAgICAgIHRwX21ybwogICAgICAgICAgICAgIHRwX25ldwogICAgICAgICAgICAgIHRwX25leHQKICAgICAgICAgICAgICB0cF9wcmV2CiAgICAgICAgICAgICAgdHBfcmljaGNvbXBhcmUKICAgICAgICAgICAgICB0cF9zdWJjbGFzc2VzCiAgICAgICAgICAgICAgdHBfd2Vha2xpc3QKICAgICAgICAgICAgICB3YXNfc3FfYXNzX3NsaWNlCiAgICAgICAgICAgICAgd2FzX3NxX3NsaWNlCgogICAgICAgICAgICBBIGZldyBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyBmb3Igc2xvdCBjdXN0b21pemF0aW9uLgoKMjAxNi0wOC0wOTogam9lcXVhbnQKICAgICAgICAgICAgW1JdIFBhdGNoICM3NjUgRml4IGV4dGVybiAiQyIgaGVhZGVyIGluY2x1ZGVzIGZvciBDKysgY29kZS4KCjIwMTYtMDgtMDU6IG9sbHkKICAgICAgICAgICAgW3htbF0gRml4IGhvdyB0aGUgb3V0cHV0IGZpbGVuYW1lIGlzIGJ1aWx0IHRvIGF2b2lkIHByb2JsZW1zIHdoZW4KICAgICAgICAgICAgaXQgY29udGFpbnMgdGhlIGVtYmVkZGVkIHN0cmluZ3MgIi5jIiwgIi5jcHAiIG9yICIuY3h4Ii4KICAgICAgICAgICAgRml4ZXMgIzU0MCByZXBvcnRlZCBieSBkamFjazQyLgoKMjAxNi0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvcm5lciBjYXNlIG9mIHdyYXBwaW5nIHN0ZDo6dmVjdG9yIG9mIFQgcG9pbnRlcnMgd2hlcmUgYSBwb2ludGVyIHRvIGEgcG9pbnRlciBvZiBUCiAgICAgICAgICAgIGFsc28gZXhpc3RzIGluIHRoZSB3cmFwcGVkIGNvZGUuIFNGIEJ1ZyAyMzU5NDE3ICg5NjcpLgoKMjAxNi0wNi0yNjogd2thbGluaW4KICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCAjNjgxIEZpeCBzZWcgZmF1bHQgd2hlbiBpZ25vcmluZyBuZXN0ZWQgY2xhc3Nlcy4KCjIwMTYtMDYtMjU6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dICM3MTEgRml4IC1jYXN0bW9kZSBhbmQgY29udmVyc2lvbiBvZiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIFNlZSAyMDE1LTEyLTIzIENIQU5HRVMgZW50cnkgZm9yIGRldGFpbHMgb2YgdGhlc2UgaW1wcm92ZW1lbnRzIHdoZW4gdGhleSB3ZXJlCiAgICAgICAgICAgIGltcGxlbWVudGVkIGZvciB0aGUgZGVmYXVsdCBvcHRpb25zIChpZSBub3QgdXNpbmcgLWNhc3Rtb2RlKS4KCjIwMTYtMDYtMjU6IGFobm9sZHMKICAgICAgICAgICAgUGF0Y2ggIzczMCAtIEZpeCAlaW1wbGljaXRjb252IGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aGVuIHVzaW5nCiAgICAgICAgICAgIC1jYXN0bW9kZSBvciAtZmFzdGRpc3BhdGNoIG9wdGlvbnMuCgogICAgICAgICAgICBUaGUgcmVzdWx0IGlzIHRoYXQgaW4gYWxsIG92ZXJsb2FkIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpbGwgZmlyc3QgY2hlY2sgZm9yCiAgICAgICAgICAgIGV4YWN0IChha2Egbm9uIGltcGxpY2l0KSBtYXRjaGVzLCBhbmQgdGhlbiBzdWJzZXF1ZW50bHkgY2hlY2sgZm9yIGltcGxpY2l0CiAgICAgICAgICAgIGNhc3RpbmcgbWF0Y2hlcy4gVGhpcyB3YXMgYWxyZWFkeSBoYXBwZW5pbmcgaW4gdGhlIG5vcm1hbCBkaXNwYXRjaCBzaXR1YXRpb24sCiAgICAgICAgICAgIGFuZCBpbiB0aGUgLWZhc3RkaXNwYXRjaCBjYXNlIHR3byBwYXNzZXMgdGhyb3VnaCB0aGUgY2FuZGlkYXRlcyB3ZXJlIGhhcHBlbmluZywKICAgICAgICAgICAganVzdCB3aXRoIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WIGFsd2F5cyBzZXQuIEFmdGVyIHRoaXMgcGF0Y2gsIGl0IGlzIG5vdCBzZXQKICAgICAgICAgICAgb24gdGhlIGZpcnN0IHBhc3MsIGFuZCB0aGVuIHNldCBvbiB0aGUgc2Vjb25kIHBhc3MuCgoyMDE2LTA2LTI1OiBsaW9yZ29sZAogICAgICAgICAgICBQYXRjaCAjNzI3IC0gQWRkIHN1cHBvcnQgZm9yIEMrKzExIHR5cGUgYWxpYXNpbmcuCgpWZXJzaW9uIDMuMC4xMCAoMTIgSnVuIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMDYtMDY6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2OTguIEFkZCBzdXBwb3J0IGZvciAtcmVsYXRpdmVpbXBvcnQgZm9yIHB5dGhvbiAyLjcsIHNvIC1weTMgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIGFsc28gcmVxdWlyZWQgZm9yIHJlbGF0aXZlIGltcG9ydCBzdXBwb3J0LgoKMjAxNi0wNi0wNTogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzY5NCAtIEZpeCBwYWNrYWdlIGltcG9ydCByZWdyZXNzaW9ucyBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjkuCgogICAgICAgICAgICAxKSBUaGUgY29kZSBpbiAzLjAuOSBkaWQgbm90IGZhbGwgYmFjayB0byAnaW1wb3J0IF9mb28nIGlmICdpbXBvcnQgYmFyLl9mb28nIGZhaWxlZAogICAgICAgICAgICAoYXNzdW1pbmcgYmFyLmZvbyB3YXMgdGhlIG1haW4gbW9kdWxlKS4gRXZlcnkgcGxhY2UgX2ZvbyBpcyBpbXBvcnRlZCBub3cgZmlyc3QgdHJpZXMKICAgICAgICAgICAgaXQgZnJvbSB0aGUgcGFja2FnZSB3aGVyZSBmb28gd2FzIGZvdW5kIGFuZCBpZiB0aGF0IGZhaWxzIHRyaWVzIF9mb28gYXMgYSBnbG9iYWwgbW9kdWxlLgoKICAgICAgICAgICAgMikgVGhlIHNlcGFyYXRlIGJsb2NrIG9mIFB5dGhvbiBjb2RlIHRoYXQgaW5qZWN0ZWQgY29kZSB0byBwdWxsIGluIHRoZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZyb20gX2ZvbyB3aGVuIC1idWlsdGluIGlzIHVzZWQgbWFkZSB1c2Ugb2YgdGhlIC1weTMgc3dpdGNoIHRvIGVpdGhlciBkbwogICAgICAgICAgICAnZnJvbSAuX2ZvbyBpbXBvcnQgKicgb3IgImZyb20gX2ZvbyBpbXBvcnQgKiIuIFRoaXMgYmxvY2sgb2YgY29kZSBubyBsb25nZXIgZG9lcyB0aGlzCiAgICAgICAgICAgIGFuZCBpbnN0ZWFkIGNoZWNrcyB0aGUgUHl0aG9uIHZlcnNpb24gYXQgcnVudGltZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSwgc3dpZy0zLjAuMTAgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZWFzZSB0aGUgY3JlYXRpb24gb2Ygd3JhcHBlciBtb2R1bGVzCiAgICAgICAgICAgIHRoYXQgY2FuIGJlIGZ1bGx5IG1hZGUgcGFydCBvZiBhIFB5dGhvbiBwYWNrYWdlLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgYXNzdW1lcyB0aGUgZHluYW1pY2FsbHkgbGlua2VkIEMgbW9kdWxlIGlzIGEgZ2xvYmFsIG1vZHVsZS4KICAgICAgICAgICAgVGhlIGR5bmFtaWMgbW9kdWxlIGNhbiBub3cgYmUgcGxhY2VkIGludG8gZWl0aGVyIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHB1cmUgUHl0aG9uCiAgICAgICAgICAgIG1vZHVsZSBvciBhcyBhIGdsb2JhbCBtb2R1bGUuICBCb3RoIGxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgUHl0aG9uIHdyYXBwZXIgdG8KICAgICAgICAgICAgbG9jYXRlIHRoZSBDIG1vZHVsZS4KCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgY291bGQgY2F1c2UgYSBiYWNrd2FyZHMgaW5jb21wYXRpYmlsaXR5IHdpdGggc29tZSBjb2RlCiAgICAgICAgICAgIHRoYXQgd2FzIHJlbHlpbmcgb24gdGhlIGFiaWxpdHkgb2YgImZyb20gcGFja2FnZSBpbXBvcnQgX21vZHVsZSIgdG8KICAgICAgICAgICAgcHVsbCBhdHRyaWJ1dGVzIG91dCBvZiB0aGUgcGFja2FnZSBkaXJlY3RseS4gIElmIHlvdXIgY29kZSBwb3B1bGF0ZXMgYQogICAgICAgICAgICBtb2R1bGUgKHdoaWNoIGlzIGFsc28gYSBwYWNrYWdlKSB3aXRoIGF0dHJpYnV0ZXMgdGhhdCBhcmUgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB3aGljaCB3ZXJlIG5vdCBsb2FkZWQgaW4gYSBjb252ZW50aW9uYWwgd2F5LAogICAgICAgICAgICBzd2lnLTMuMC44IGFuZCBlYXJsaWVyIG1heSBoYXZlIHdvcmtlZCBkdWUgdG8gJ2Zyb20gcGFja2FnZSBpbXBvcnQKICAgICAgICAgICAgX21vZHVsZScgYnlwYXNzaW5nIGEgcmVhbCBpbXBvcnQgYW5kIHB1bGxpbmcgeW91ciBtb2R1bGUgaW4gYXMgYW4KICAgICAgICAgICAgYXR0cmlidXRlLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuICBTaW5jZSB0aGlzIGlzIG5vdCBhIGNvbW1vbiAob3IKICAgICAgICAgICAgZXZlbiByZWNvbW1lbmRlZCkgcHJhY3RpY2UsIG1vc3QgZm9sayBzaG91bGQgbm90IGJlIGFmZmVjdGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTA1LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzY5MCAtIFNtYXJ0IHBvaW50ZXIgdG8gJWlnbm9yZWQgY2xhc3MgZG9lc24ndCBleHBvc2UgaW5oZXJpdGVkIG1ldGhvZHMuCiAgICAgICAgICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgoKVmVyc2lvbiAzLjAuOSAoMjkgTWF5IDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNi0wNS0yNDogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMiAtIEFkZCBzdXBwb3J0IGZvciBQeXRob24ncyBpbXBsaWNpdCBuYW1lc3BhY2UgcGFja2FnZXMuCgoyMDE2LTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICM2MDIgLSBFcnJvciBoYW5kbGluZyByZWdyZXNzaW9uIG9mIG9wYXF1ZSBwb2ludGVycyBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIHN3aWctMy4wLjggd2hlbiBDIGZ1bmN0aW9ucyBleHBsaWNpdGx5IHJlc2V0IGEgcG9pbnRlciB1c2luZyAnREFUQV9QVFIoc2VsZikgPSAwJy4KICAgICAgICAgICAgQW4gT2JqZWN0UHJldmlvdXNseURlbGV0ZWQgZXJyb3Igd2FzIGluY29ycmVjdGx5IHRocm93biB3aGVuIHRoZSBwb2ludGVyIHdhcyB1c2VkCiAgICAgICAgICAgIGFzIGEgcGFyYW1ldGVyLgoKMjAxNi0wNS0xNzogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNjUxIC0gQ29ycmVjdCBvdmVybG9hZGVkIGZ1bmN0aW9uIGVycm9yIG1lc3NhZ2Ugd2hlbiBmdW5jdGlvbiBpcwogICAgICAgICAgICB1c2luZyAlbmV3b2JqZWN0LgoKMjAxNi0wNS0xNzogYXVyZWxqCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNTgyIC0gYWRkIHN1cHBvcnQgZm9yIGRvY3N0cmluZyBvcHRpb24gaW4gJW1vZHVsZSgpCgoyMDE2LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQzNCAtIFBhc3NpbmcgY2xhc3NlcyBieSB2YWx1ZSBhcyBwYXJhbWV0ZXJzIGluIGRpcmVjdG9yIG1ldGhvZHMgZGlkIG5vdCBjcmVhdGUKICAgICAgICAgICAgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCBsZWFkaW5nIHRvIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzIGlmIHRoZSBvYmplY3Qgd2FzIHVzZWQKICAgICAgICAgICAgYWZ0ZXIgdGhlIHVwY2FsbCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFBhc3NpbmcgYXJndW1lbnRzIGJ5IHZhbHVlIHNob3VsZG4ndCBnaXZlCiAgICAgICAgICAgIHJpc2UgdG8gdGhlc2Ugc29ydHMgb2YgbWVtb3J5IHByb2JsZW1zIGFuZCBzbyB0aGUgb2JqZWN0cyBhcmUgbm93IGNvcGllZCBhbmQgb3duZXJzaGlwCiAgICAgICAgICAgIG9mIHRoZWlyIGxpZmV0aW1lIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTYtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjExLiBGaXggYXNzZXJ0aW9uIGhhbmRsaW5nIGRlZmF1bHRhcmdzIHdoZW4gdXNpbmcgJWV4dGVuZCBmb3IgYSB0ZW1wbGF0ZQogICAgICAgICAgICBjbGFzcyBhbmQgdGhlIGV4dGVuZGVkIG1ldGhvZHMgY29udGFpbiBkZWZhdWx0IGFyZ3VtZW50cy4KCjIwMTYtMDUtMDU6IGVqdWxpYW4KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxNy4gRml4IG9wZXJhdG9yLyB3cmFwcGVycy4KCjIwMTYtMDUtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjY5LiBEb24ndCBpc3N1ZSB3YXJuaW5nIGFib3V0IGlnbm9yaW5nIGJhc2UgY2xhc3NlcyB3aGVuIHRoZSBkZXJpdmVkIGNsYXNzIGlzCiAgICAgICAgICAgIGl0c2VsZiBpZ25vcmVkLgoKMjAxNi0wNC0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeCB1c2Ugb2YgZ29vdXQgdHlwZW1hcCB3aGVuIGNhbGxpbmcgYmFzZSBtZXRob2QgYnkKCSAgICBmb3JjaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlIHRvIHRoZSB2YWx1ZSB3ZSBuZWVkLgoKMjAxNi0wNC0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeGVzIGZvciBHbyAxLjY6IGF2b2lkIHJldHVybmluZyBHbyBwb2ludGVycyBmcm9tCgkgICAgZGlyZWN0b3JzIHRoYXQgcmV0dXJuIHN0cmluZyB2YWx1ZXM7IGFkZCBhIHRyYWlsaW5nIDAgYnl0ZQoJICAgIHdoZW4gdHJlYXRpbmcgR28gc3RyaW5nIGFzIEMgY2hhciouCgoyMDE2LTA0LTA2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdICM1NTIgTWFrZSBTY2lsYWIgcnVudGltZSBrZWVwIHRyYWNrIG9mIHBvaW50ZXIgdHlwZXMKICAgICAgICAgICAgSW5zdGVhZCBvZiBhIFNjaWxhYiBwb2ludGVyIHdoaWNoIGhhcyBubyB0eXBlLCBTV0lHIFNjaWxhYiBtYXBzIGEKICAgICAgICAgICAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0bGlzdCBjb250YWluaW5nIHRoZSBwb2ludGVyIGFkcmVzcyBhbmQgaXRzIHR5cGUuCgoyMDE2LTA0LTAyOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5ICM1OTguIEZpeCBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYSBub24tZXhpc3RlbnQKICAgICAgICAgICAgYXR0cmlidXRlLiBUaGUgcHJldmlvdXMgY3J5cHRpYyBlcnJvciBtZXNzYWdlOgogICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiB0eXBlIG9iamVjdCAnb2JqZWN0JyBoYXMgbm8gYXR0cmlidXRlICdfX2dldGF0dHJfXycKICAgICAgICAgICAgaXMgbm93IHJlcGxhY2VkIHdpdGggb25lIG1lbnRpb25pbmcgdGhlIGF0dHJpYnV0ZSBuYW1lLCBlZzoKICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogJ0Zvbycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ2JhcicKCjIwMTYtMDQtMDI6IGRlcmt1Y2kKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMCB0byBmaXggIzYwNy4KICAgICAgICAgICAgRml4IHNpbmdsZSBhcmd1bWVudHMgd2hlbiB1c2luZyBweXRob24gLWJ1aWx0aW4gLU8gd2l0aCAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikKCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzICM1OTQuIEZpeCBhc3NlcnRpb24gZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZW4gd3JhcHBpbmcgYSBDKysxMSBlbnVtIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgcHJpdmF0ZSBpbiBhIGNsYXNzLgoKICAgICAgICAgICAgQWxzbyBkb24ndCB3cmFwIHByaXZhdGUgZW51bXMgZm9yIGEgZmV3IGxhbmd1YWdlcyB0aGF0IGF0dGVtcHRlZCB0byBkbyBzby4KCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSB1bnNpZ25lZCBsb25nIGxvbmcgbWFyc2hhbGxpbmcgaW1wcm92ZW1lbnRzIHdoZW4gYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgICAgICAgaXMgcGFzc2VkIGZyb20gSmF2YSB0byBDLiBBIGNhc3QgdG8gc2lnbmVkIGxvbmcgbG9uZyBpbiB0aGUgQyBsYXllciB3aWxsIG5vdwogICAgICAgICAgICByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIHZhbHVlLiBObyBjaGFuZ2UgZm9yIHBvc2l0aXZlIG51bWJlcnMgcGFzc2VkIHRvIEMuCiAgICAgICAgICAgIEZpeGVzICM2MjMuCgoyMDE2LTAzLTIyOiBhbGV4d2FyZwoJICAgIFtMdWFdICMzOTggRml4IGx1YSBfX2dldGl0ZW0gKyBpbmhlcml0YW5jZQogICAgICAgICAgICBUaGUgbmV3IGhhbmRsaW5nIG9mIGNsYXNzZXMgaW4gTHVhIChub3QgbWVyZ2luZyBtZXRob2RzIGludG8gdGhlIGRlcml2ZWQgY2xhc3NlcykKICAgICAgICAgICAgYnJlYWtzIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhIF9fZ2V0aXRlbSBmdW5jdGlvbi4gVGhlIF9fZ2V0aXRlbSBmdW5jdGlvbgogICAgICAgICAgICBwcmV2ZW50cyBtZXRob2QgY2FsbHMgdG8gYW55IG1ldGhvZCBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcy4gVGhpcyBmaXggY2FsbHMKICAgICAgICAgICAgX19nZXRpdGVtIG9ubHkgaWYgdGhlIG1lbWJlciBpcyBub3QgZm91bmQgdXNpbmcgcmVjdXJzaXZlIGxvb2t1cC4KCjIwMTYtMDMtMTg6IHB0b211bGlrCgkgICAgW1B5dGhvbl0gIzU2MyBTdG9wIGdlbmVyYXRpbmcgdW5uZWNlc3NhcnkgX3N3aWdjb25zdGFudCBoZWxwZXJzLgoKMjAxNi0wMy0xNjogcmljaGFyZGJlYXJlCgkgICAgW1JdICM2MzYgQWRkIGV4dHJhIHN0ZDo6dmVjdG9yIG51bWVyaWMgdHlwZXMKCjIwMTYtMDMtMTQ6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBzdGRfYXJyYXkuaSBmb3IgQysrMTEgc3RkOjphcnJheSBzdXBwb3J0LgoKMjAxNi0wMy0xMjogd3NmdWx0b24KCSAgICBbSmF2YSwgQyMsIERdIEZpeCBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZXJzIHdpdGggJWphdmFjb25zdCgxKQogICAgICAgICAgICAlY3Njb25zdCgxKSBvciAlZG1hbmlmZXN0Y29uc3QuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgdGhlIGNhc2Ugd2hlbiBhbiBpbnRlZ2VyIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxpemVyLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVyB7IHN0YXRpYyBjb25zdCBjaGFyIHcgPSAxMDA7IH07CgoJICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBwYXJzaW5nIGVudW0gdmFsdWVzIHVzaW5nIGNoYXIgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICB3aGVuIHRoZXNlIHZhbHVlcyBhcHBlYXIgaW4gdGhlIEphdmEgY29kZSAodXN1YWxseSB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkpCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGVudW0gWCB7IHgxID0gJ1xuJywgeDIgPSAnXDEnIH07CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgY2hhciB2YXJpYWJsZXMgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFkgeyBzdGF0aWMgY29uc3QgY2hhciB5ID0gJ1xuJzsgfQoKICAgICAgICAgICAgTGlrZXdpc2UgZm9yIEQgYW5kICVkbWFuaWZlc3Rjb25zdGFudC4gRm9yIEMjIGFuZCAlY3Njb25zdCgxKSwgY2hhcgogICAgICAgICAgICB2YWx1ZXMgaW4gQyMgYXJlIG5vdyBoZXggZXNjYXBlZCBhcyBDIyBkb2Vzbid0IHN1cHBvcnQgQyBvY3RhbCBlc2NhcGluZy4KCjIwMTYtMDMtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBBZGQgc3VwcG9ydCBmb3IgdHJlYXRpbmcgQysrIGJhc2UgY2xhc3NlcyBhcyBKYXZhIGludGVyZmFjZXMKICAgICAgICAgICAgaW5zdGVhZCBvZiBKYXZhIHByb3h5IGNsYXNzZXMuIFRoaXMgZW5hYmxlIHNvbWUgc29ydCBvZiBzdXBwb3J0IGZvcgogICAgICAgICAgICBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIHN3aWdpbnRlcmZhY2UuaSBhbmQKICAgICAgICAgICAgcHJvdmlkZXMgYWRkaXRpb25hbCBtYWNyb3MgKHNlZSBKYXZhLmh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbik6CgogICAgICAgICAgICAgICVpbnRlcmZhY2UoQ1RZUEUpCiAgICAgICAgICAgICAgJWludGVyZmFjZV9pbXBsKENUWVBFKQogICAgICAgICAgICAgICVpbnRlcmZhY2VfY3VzdG9tKCJQUk9YWSIsICJJTlRFUkZBQ0UiLCBDVFlQRSkKCjIwMTYtMDMtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCByc3RyaXAgZW5jb2RlciBmb3IgdXNlIGluICVyZW5hbWUuIFRoaXMgaXMgbGlrZSB0aGUgc3RyaXAgZW5jb2RlciBidXQKICAgICAgICAgICAgc3RyaXBzIHRoZSBzeW1ib2wncyBzdWZmaXggaW5zdGVhZCBvZiB0aGUgcHJlZml4LiBUaGUgZXhhbXBsZSBiZWxvdwogICAgICAgICAgICB3aWxsIHJlbmFtZSBTb21lVGhpbmdDbHMgdG8gU29tZVRoaW5nIGFuZCBBbm90aGVyVGhpbmdDbHMgdG8gQW5vdGhlclRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHJzdHJpcDpbQ2xzXSlzIikgIiI7CgogICAgICAgICAgICAgIGNsYXNzIFNvbWVUaGluZ0NscyB7fTsKICAgICAgICAgICAgICBzdHJ1Y3QgQW5vdGhlclRoaW5nQ2xzIHt9OwoKMjAxNi0wMy0wMTogb2xseQoJICAgIEZpeCBpc2Zpbml0ZSgpIGNoZWNrIHRvIHdvcmsgd2l0aCBHQ0M2LiAgRml4ZXMKCSAgICBpc3N1ZSAjNjE1IHJlcG9ydGVkIGJ5IGpwbGVzbmlrLgoKMjAxNi0wMi0xNzogb2xseQoJICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGtleXdvcmRzICdhcycgYW5kICd3aXRoJyB0byBweXRob25rdy5zd2cuCgoyMDE2LTAyLTA3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHJlY29nbmlzZSB2YXJpb3VzIHVuYXJ5IGZ1bmN0aW9ucwogICAgICAgICAgICAqIFVzZSBfX2Zsb2F0X18oKSBmb3IgbnVtZXJpYyBjb252ZXJzaW9ucywgZS5nLiB3aGVuIGNhbGxpbmcgZG91YmxlKCkKICAgICAgICAgICAgKiBNYXAgdmFyaW91cyB1bmFyeSBmdW5jdGlvbnMsIGUuZy4gYWJzKCkgdG8gX19hYnNfXygpLCBzZWUgZnVsbCBsaXN0CiAgICAgICAgICAgICAgaW4gc2VjdGlvbiAzMi4zLjEwIG9mIG1hbnVhbDsgb25seSBhdmFpbGFibGUgaW4gT2N0YXZlIDMuOC4wIG9yIGxhdGVyCgoyMDE2LTAyLTA3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGV4cG9ydCBmdW5jdGlvbiBzd2lnX29jdGF2ZV9wcmVyZXEoKSBmb3IgdGVzdGluZyBPY3RhdmUgdmVyc2lvbgoKMjAxNi0wMi0wNjogcGpvaGFuZ3VzdGF2c3NvbgogICAgICAgICAgICBbQyNdIEZpeCBkdXBsaWNhdGUgc3ltYm9sIHByb2JsZW1zIHdoZW4gbGlua2luZyB0aGUgc291cmNlIGdlbmVyYXRlZAogICAgICAgICAgICBmcm9tIG11bHRpcGxlIFNXSUcgbW9kdWxlcyBpbnRvIG9uZSBzaGFyZWQgbGlicmFyeSBmb3IgdGhlIC1uYW1lc3BhY2UKICAgICAgICAgICAgb3B0aW9uLiBUaGUgbmFtZXNwYWNlIGlzIG5vdyBtYW5nbGVkIGludG8gdGhlIGdsb2JhbCBQSW52b2tlIGZ1bmN0aW9uCiAgICAgICAgICAgIG5hbWVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTAxLTI3OiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIFB5dGhvbiBCeXRlcwogICAgICAgICAgICBhbmQgVW5pY29kZSBvYmplY3RzIHVzaW5nIGJ5IGRlZmluaW5nIFNXSUdfUFlUSE9OX1NUUklDVF9CWVRFX0NIQVIKICAgICAgICAgICAgYW5kIFNXSUdfUFlUSE9OX1NUUklDVF9VTklDT0RFX1dDSEFSLgoKMjAxNi0wMS0yNzogc3RlZXZlCiAgICAgICAgICAgIFtHb10gRW5zdXJlIHN0cnVjdHMgYXJlIHByb3Blcmx5IHBhY2tlZCBiZXR3ZWVuIGdjIGFuZCBHQ0MvY2xhbmcuCgoyMDE2LTAxLTI1OiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIFN1cHBvcnQgdGhlIGZ1bGwgUHl0aG9uIHRlc3Qgc3VpdGUgaW4gLWNsYXNzaWMgbW9kZQogICAgICAgICAgICAqIENvbnZlcnQgbG9uZy91bnNpZ25lZCBsb25nL2xvbmcgbG9uZy91bnNpZ25lZCBsb25nIGxvbmcgdG8gUHlJbnQKICAgICAgICAgICAgICByYXRoZXIgdGhhbiBQeUxvbmcgd2hlbiBwb3NzaWJsZS4gQ2VydGFpbiBweXRob24gZnVuY3Rpb25zIGxpa2UKICAgICAgICAgICAgICBsZW4oKSByZXF1aXJlIGEgUHlJbnQgd2hlbiBvcGVyYXRpbmcgb24gb2xkLXN0eWxlIGNsYXNzZXMuCiAgICAgICAgICAgICogQWRkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZXRob2RzIGluIGNsYXNzaWMgbW9kZSwgaW5jbHVkaW5nIHN1cHBvcnQKICAgICAgICAgICAgICBmb3IgcHl0aG9uYXBwZW5kLCBweXRob25wcmVwZW5kLCBhbmQgZG9jc3RyaW5ncy4KICAgICAgICAgICAgKiBSZW1vdmluZyB0aGUgdXNlIG9mIF9fc3dpZ19nZXRtZXRob2RzX18gZm9yIHN0YXRpYyBtZW1iZXIgbWV0aG9kcwogICAgICAgICAgICAgIHNpbmNlIHRoZXkgd2lsbCBhbHdheXMgYmUgZm91bmQgYnkgdGhlIHN0YW5kYXJkIGFyZ3VtZW50IGxvb2t1cAogICAgICAgICAgICAqIEZpeCBhIGJ1ZyB3aGVyZSB0aGUgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24gd2FzIGNhdWdodCB3aGVuCiAgICAgICAgICAgICAgY2hlY2tpbmcgZm9yIG5ldy1zdHlsZSBjbGFzcyBzdXBwb3J0CgoyMDE2LTAxLTIzOiBhaG5vbGRzCiAgICAgICAgICAgIFtHb10gRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBHbyB0ZXN0LXN1aXRlIG9uIE9TWDoKICAgICAgICAgICAgKiBUaGUgbGlua2VyIG9uIE9TWCByZXF1aXJlcyB0aGF0IGFsbCBzeW1ib2xzIChldmVuIHdlYWsgc3ltYm9scykKICAgICAgICAgICAgICBhcmUgZGVmaW5lZCBhdCBsaW5rIHRpbWUuIEJlY2F1c2UgdGhlIGZ1bmN0aW9uIF9jZ29fdG9wb2ZzdGFjayBpcwogICAgICAgICAgICAgIG9ubHkgZGVmaW5lZCBzdGFydGluZyBpbiBHbyB2ZXJzaW9uIDEuNCwgd2UgZXhwbGljaXRseSBtYXJrIGl0IGFzCiAgICAgICAgICAgICAgdW5kZWZpbmVkIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBHbyBvbiBPU1guCiAgICAgICAgICAgICogQXZvaWQgd3JpdGluZyBlbXB0eSBzd2lnYXJncyBzdHJ1Y3RzLCBzaW5jZSBlbXB0eSBzdHJ1Y3RzIGFyZSBub3QKICAgICAgICAgICAgICBhbGxvd2VkIGluIGV4dGVybiAiQyIgYmxvY2tzLgoKMjAxNi0wMS0xMjogb2xseQoJICAgIFtKYXZhc2NyaXB0XSBMb29rIGZvciAibm9kZWpzIiBhcyB3ZWxsIGFzICJub2RlIiwgYXMgaXQncyBwYWNrYWdlZAoJICAgIGFzIHRoZSBmb3JtZXIgb24gRGViaWFuLgoKMjAxNi0wMS0xMjogb2xseQoJICAgIFtKYXZhc2NyaXB0XSBGb3IgdjggPj0gNC4zLjAsIHVzZSBWOF9NQUpPUl9WRVJTSU9OLgoJICAgIEZpeGVzIGlzc3VlIDU2MS4KCjIwMTYtMDEtMTA6IGFobm9sZHMKICAgICAgICAgICAgSW1wcm92ZWQgc2l6ZV90IGFuZCBwdHJkaWZmX3QgdHlwZW1hcHMgdG8gc3VwcG9ydCBsYXJnZSB2YWx1ZXMKICAgICAgICAgICAgb24gcGxhdGZvcm1zIHdoZXJlIHNpemVvZihzaXplX3QpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIGFuZAogICAgICAgICAgICBzaXplb2YocHRyZGlmZl90KSA+IHNpemVvZihsb25nKS4KClZlcnNpb24gMy4wLjggKDMxIERlYyAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMTItMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBwZGYgZG9jdW1lbnRhdGlvbiBpcyBub3cgZ2VuZXJhdGVkIGJ5IHdraHRtbHRvcGRmIGFuZCBoYXMgY29sb3VyCiAgICAgICAgICAgIGZvciB0aGUgY29kZSBzbmlwcGV0cyBqdXN0IGxpa2UgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbiEKCjIwMTUtMTItMjM6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZXMgZm9yIGNvbnZlcnNpb24gb2Ygc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzOgoKICAgICAgICAgICAgTm8gbG9uZ2VyIGNoZWNrIGZvciBQeUludCBvYmplY3RzIGluIFB5dGhvbjMuIEJlY2F1c2UgUHlJbnRfQ2hlY2sKICAgICAgICAgICAgYW5kIGZyaWVuZHMgYXJlICNkZWZpbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5TG9uZyBtZXRob2RzLCB0aGlzCiAgICAgICAgICAgIGhhZCBjYXVzZWQgZXJyb3JzIGluIFB5dGhvbjMgd2hlcmUgdmFsdWVzIGdyZWF0ZXIgdGhhbiB3aGF0IGNvdWxkIGJlCiAgICAgICAgICAgIHN0b3JlZCBpbiBhIGxvbmcgd2VyZSBpbmNvcnJlY3RseSBpbnRlcnByZXRlZCBhcyB0aGUgdmFsdWUgLTEgd2l0aAogICAgICAgICAgICB0aGUgUHl0aG9uIGVycm9yIGluZGljYXRvciBzZXQgdG8gT3ZlcmZsb3dFcnJvci4gVGhpcyBhcHBsaWVzIHRvCiAgICAgICAgICAgIGJvdGggdGhlIGNvbnZlcnNpb25zIFB5TG9uZy0+bG9uZyBhbmQgUHlMb25nLT5kb3VibGUuCgogICAgICAgICAgICBDb252ZXJzaW9uIGZyb20gUHlMb25nIHRvIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcgbG9uZywgYW5kCiAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBub3cgcmFpc2UgT3ZlcmZsb3dFcnJvciBpbnN0ZWFkIG9mIFR5cGVFcnJvciBpbgogICAgICAgICAgICBib3RoIFB5dGhvbjIgYW5kIFB5dGhvbjMgZm9yIFB5TG9uZyB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UKICAgICAgICAgICAgZXhwcmVzc2libGUgYnkgdGhlIGNvcnJlc3BvbmRpbmcgQyB0eXBlLiBUaGlzIG1hdGNoZXMgdGhlIGV4aXN0aW5nCiAgICAgICAgICAgIGJlaGF2aW9yIGZvciBvdGhlciBpbnRlZ3JhbCB0eXBlcyAoc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzLCBzaG9ydHMsCiAgICAgICAgICAgIGFuZCBjaGFycyksIGFzIHdlbGwgYXMgdGhlIGNvbnZlcnNpb24gZm9yIFB5SW50IHRvIGFsbCBudW1lcmljCiAgICAgICAgICAgIHR5cGVzLiBUaGlzIGFsc28gaW5kaXJlY3RseSBhcHBsaWVzIHRvIHRoZSBzaXplX3QgYW5kIHB0cmRpZmZfdAogICAgICAgICAgICB0eXBlcywgd2hpY2ggZGVwZW5kIG9uIHRoZSBjb252ZXJzaW9ucyBmb3IgdW5zaWduZWQgbG9uZyBhbmQgbG9uZy4KCjIwMTUtMTItMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAyIFVuaWNvZGUgVVRGLTggc3RyaW5ncyBjYW4gYmUgdXNlZCBhcyBpbnB1dHMgdG8gY2hhciAqIG9yCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVzIGlmIHRoZSBnZW5lcmF0ZWQgQy9DKysgY29kZSBoYXMgU1dJR19QWVRIT05fMl9VTklDT0RFIGRlZmluZWQuCgoyMDE1LTEyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZXMgIzI4NiwgIzEyOAogICAgICAgICAgICBSZW1vdmUgY2NhY2hlLXN3aWcuMSBtYW4gcGFnZSAtIHBsZWFzZSB1c2UgdGhlIENDYWNoZS5odG1sIGRvY3MgaW5zdGVhZC4KICAgICAgICAgICAgVGhlIHlvZGwybWFuIGFuZCB5b2RsMmh0bWwgdG9vbHMgYXJlIG5vIGxvbmdlciB1c2VkIGFuZCBzbyBTV0lHIG5vCiAgICAgICAgICAgIGxvbmdlciBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoZXNlIHBhY2thZ2VzIHdoaWNoIHdlcmUgcmVxdWlyZWQgd2hlbgogICAgICAgICAgICBidWlsZGluZyBmcm9tIGdpdC4KCjIwMTUtMTItMTY6IHp0dXJuZXIvY29sZWIKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbjMuNSBpbnRlcnByZXRlciBhc3NlcnRpb25zIHdoZW4gb2JqZWN0cyBhcmUgYmVpbmcKICAgICAgICAgICAgZGVsZXRlZCBkdWUgdG8gYW4gZXhpc3RpbmcgZXhjZXB0aW9uLiBNb3N0IG5vdGFibHkgaW4gZ2VuZXJhdG9ycwogICAgICAgICAgICB3aGljaCB0ZXJtaW5hdGUgdXNpbmcgYSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbi4gRml4ZXMgIzU1OSAjNTYwICM1NzMuCiAgICAgICAgICAgIElmIGEgZnVydGhlciBleGNlcHRpb24gaXMgcmFpc2VkIGR1cmluZyBhbiBvYmplY3QgZGVzdHJ1Y3Rpb24sCiAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSBpcyB1c2VkIG9uIHRoaXMgc2Vjb25kIGV4Y2VwdGlvbiBhbmQgdGhlCiAgICAgICAgICAgIG9yaWdpbmFsIGV4Y2VwdGlvbiBidWJibGVzIHRocm91Z2guCgoyMDE1LTEyLTE0OiBhaG5vbGRzL3dzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBpbiBtaXNzaW5nIGluaXRpYWxpemVycyBmb3IgdHBfZmluYWxpemUsCiAgICAgICAgICAgIG5iX21hdHJpeF9tdWx0aXBseSwgbmJfaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHksIGh0X3F1YWxuYW1lCiAgICAgICAgICAgIGh0X2NhY2hlZF9rZXlzIGFuZCB0cF9wcmV2LgoKMjAxNS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNUTCB3cmFwcGVycyB0byBub3QgZ2VuZXJhdGUgPDogZGlncmFwaHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHN0ZDo6dmVjdG9yPDo6WDo6WT4gd2FzIHNvbWV0aW1lcyBnZW5lcmF0ZWQsIG5vdwogICAgICAgICAgICBjb3JyZWN0ZWQgdG8gc3RkOjp2ZWN0b3I8IDo6WDo6WSA+LgoKMjAxNS0xMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNUTCByYW5nZXMgYW5kIHNsaWNlcyBmaXhlcy4KCiAgICAgICAgICAgIFJ1YnkgU1RMIGNvbnRhaW5lciBzZXR0aW5nIHNsaWNlcyBmaXhlczoKCiAgICAgICAgICAgIFNldHRpbmcgYW4gU1RMIGNvbnRhaW5lciB3cmFwcGVyIHNsaWNlIGJldHRlciBtYXRjaGVzIHRoZSB3YXkgUnVieQogICAgICAgICAgICBhcnJheXMgd29yay4gVGhlIGJlaGF2aW91ciBpcyBub3cgdGhlIHNhbWUgYXMgUnVieSBhcnJheXMuIFRoZSBvbmx5CiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkIHdoZW4gZXhwYW5kaW5nIGEgY29udGFpbmVyCiAgICAgICAgICAgIGNhbm5vdCBiZSBuaWwgYXMgdGhpcyBpcyBub3QgYSB2YWxpZCB0eXBlL3ZhbHVlIGZvciBDKysgY29udGFpbmVyCiAgICAgICAgICAgIGVsZW1lbnRzLgoKICAgICAgICAgICAgT2J0YWluaW5nIGEgUnVieSBTVEwgY29udGFpbmVyIHJhbmdlcyBhbmQgc2xpY2VzIGZpeGVzOgoKICAgICAgICAgICAgQWNjZXNzIHZpYSByYW5nZXMgYW5kIHNsaWNlcyBub3cgYmVoYXZlIGlkZW50aWNhbGx5IHRvIFJ1YnkgYXJyYXlzLgogICAgICAgICAgICBUaGUgZml4ZXMgYXJlIG1vc3RseSBmb3Igb3V0IG9mIHJhbmdlIGluZGljZXMgYW5kIGxlbmd0aHMuCiAgICAgICAgICAgIC0gWmVybyBsZW5ndGggc2xpY2UgcmVxdWVzdHMgcmV0dXJuIGFuIGVtcHR5IGNvbnRhaW5lciBpbnN0ZWFkIG9mIG5pbC4KICAgICAgICAgICAgLSBTbGljZXMgd2hpY2ggcmVxdWVzdCBhIGxlbmd0aCBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lcgogICAgICAgICAgICAgIG5vIGxvbmdlciBjaG9wIG9mZiB0aGUgbGFzdCBlbGVtZW50LgogICAgICAgICAgICAtIFJhbmdlcyB3aGljaCB1c2VkIHRvIHJldHVybiBuaWwgbm93IHJldHVybiBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZQogICAgICAgICAgICAgIHRoZSBzdGFydCBlbGVtZW50IGlzIGEgdmFsaWQgaW5kZXguCgogICAgICAgICAgICBSdWJ5IFNUTCBjb250YWluZXIgbmVnYXRpdmUgaW5kZXhpbmcgc3VwcG9ydCBpbXByb3ZlZC4KCiAgICAgICAgICAgIFVzaW5nIG5lZ2F0aXZlIGluZGV4ZXMgdG8gc2V0IHZhbHVlcyB3b3JrcyB0aGUgc2FtZSBhcyBSdWJ5IGFycmF5cywgZWcKCiAgICAgICAgICAgICV0ZW1wbGF0ZShJbnRWZWN0b3IpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBpdiA9IEludFZlY3Rvci5uZXcoWzEsMiwzLDRdKQogICAgICAgICAgICBpdlstNF0gPSA5ICMgPT4gWzEsMiwzLDldCiAgICAgICAgICAgIGl2Wy01XSA9IDkgIyA9PiBJbmRleEVycm9yCgoyMDE1LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBBZGQgc3RkOjphcnJheSBjb250YWluZXIgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGVzZSB3b3JrIG11Y2ggbGlrZSBhbnkgb2YgdGhlIG90aGVyIFNUTCBjb250YWluZXJzIGV4Y2VwdCBQeXRob24vUnVieSBzbGljaW5nCiAgICAgICAgICAgIGlzIHNvbWV3aGF0IGxpbWl0ZWQgYmVjYXVzZSB0aGUgYXJyYXkgaXMgYSBmaXhlZCBzaXplLiBPbmx5IHNsaWNlcyBvZgogICAgICAgICAgICB0aGUgZnVsbCBzaXplIGFyZSBzdXBwb3J0ZWQuCgoyMDE1LTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNTM5IC0gU3VwcG9ydCBQeXRob24gMy41IGFuZCAtYnVpbHRpbi4gIFB5QXN5bmNNZXRob2RzIGlzIGEgbmV3CiAgICAgICAgICAgIG1lbWJlciBpbiBQeUhlYXBUeXBlT2JqZWN0LgoKMjAxNS0xMC0wNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IGVtaXQgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYSBkaXJlY3RvcgoJICAgIGNsYXNzIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLCBzaW5jZSB0aGUgZnVuY3Rpb24gd2lsbAoJICAgIGFsd2F5cyBwYW5pYy4KCjIwMTUtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlc2hhcmVkX3B0ciBzdXBwb3J0IGZvciBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IFdhcm5pbmcgNTIwOiBEZXJpdmVkIGNsYXNzICdEZXJpdmVkJyBvZiAnQmFzZScKICAgICAgICAgICAgICBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgLSBEbyBub3QgZ2VuZXJhdGUgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGNhc3QgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluIGluIHRoZQogICAgICAgICAgICAgIHR5cGUgc3lzdGVtIHJ1bnRpbWUgaW4gc3VjaCBjYXNlcyBhcyBpdCBkb2Vzbid0IGNvbXBpbGUgYW5kIGNhbid0IGJlIHVzZWQuCiAgICAgICAgICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB3YXJuaW5nIDUyMCBmb3IgJXNoYXJlZF9wdHIgd2hlbiB0aGUgYmFzZSBjbGFzcyBpcyBpZ25vcmVkLgoKMjAxNS0xMC0wMTogdmthbGluaW4KICAgICAgICAgICAgRml4ICM1MDg6IEZpeCBzZWdmYXVsdCBwYXJzaW5nIGFub255bW91cyB0eXBlZGVmIG5lc3RlZCBjbGFzc2VzLgoKMjAxNS0wOS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFkZCBzaGFyZWRfcHRyIHN1cHBvcnQKCjIwMTUtMDktMTM6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIFJlc29sdmUgdHJhY2tpbmcgYnVnIC0gaXNzdWUgIzIyNS4KICAgICAgICAgICAgVGhlIGJ1ZyBpcyB0aGF0IHRoZSB0cmFja2luZyBjb2RlIHVzZXMgYSBydWJ5IGhhc2ggYW5kIHRodXMgbWF5CiAgICAgICAgICAgIGFsbG9jYXRlIG9iamVjdHMgKEJpZ251bSkgd2hpbGUgcnVubmluZyB0aGUgR0MuIFRoaXMgd2FzIHRvbGVyYXRlZCBpbgogICAgICAgICAgICAxLjggYnV0IGlzIGludmFsaWQgKHJhaXNlcyBhbiBleGNlcHRpb24pIGluIDEuOS4KICAgICAgICAgICAgVGhlIHBhdGNoIHVzZXMgYSBDIGhhc2ggKGFsc28gdXNlZCBieSBydWJ5KSBpbnN0ZWFkLgoKMjAxNS0wOS0wOTogbHl6ZQogICAgICAgICAgICBbQ0ZGSV0gRXh0ZW5kIHRoZSAiZXhwb3J0IiBmZWF0dXJlIGluIHRoZSBDRkZJIG1vZHVsZSB0byBzdXBwb3J0CiAgICAgICAgICAgIGV4cG9ydGluZyB0byBhIHNwZWNpZmllZCBwYWNrYWdlLgoKMjAxNS0wOS0wNDogb2xseQoJICAgIFtQeXRob25dIEZpeCBkb2NzdHJpbmdzIGZvciAlY2FsbGJhY2sgZnVuY3Rpb25zLgoKMjAxNS0wOS0wMzogZGVtaS1ybHVkZHkKICAgICAgICAgICAgW0dvXSBSZW1vdmVkIGdvbGFuZyBzdHJpbmdpbmcgZm9yIHNpZ25lZC91bnNpZ25lZCBjaGFyCgogICAgICAgICAgICBDaGFuZ2VkIGRlZmF1bHQgaGFuZGxpbmcgb2Ygc2lnbmVkIGNoYXIqIGFuZCB1bnNpZ25lZCBjaGFyKiB0byBiZQogICAgICAgICAgICBvcGFxdWUgcG9pbnRlcnMgcmF0aGVyIHRoYW4gc3RyaW5ncywgc2ltaWxhcmx5IHRvIGhvdyBvdGhlcgogICAgICAgICAgICBsYW5ndWFnZXMgd29yay4KCiAgICAgICAgICAgIEFueSBleGlzdGluZyBjb2RlIHJlbHlpbmcgb24gdHJlYXRpbmcgc2lnbmVkIGNoYXIqIG9yIHVuc2lnbmVkCiAgICAgICAgICAgIGNoYXIqIGFzIGEgc3RyaW5nIGNhbiByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3Igd2l0aCB0eXBlbWFwcy5pIGJ5CiAgICAgICAgICAgIHVzaW5nICVhcHBseSB0byBjb3B5IHRoZSBbdW5jaGFuZ2VkXSBjaGFyKiBiZWhhdmlvci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNS0wOC0wNzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIHRpZHkgLVd0YXV0b2xvZ2ljYWwtY29uc3RhbnQtb3V0LW9mLXJhbmdlLWNvbXBhcmUgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZSB1bmRlciBjbGFuZwoKMjAxNS0wOC0wNzogeGFudGFyZXMKICAgICAgICAgICAgW1B5dGhvbl0gcGVwMjU3ICYgbnVtcHlkb2MgY29uZm9ybWluZyBkb2NzdHJpbmdzOgogICAgICAgICAgICAtIE1vbm8tbGluZSBtb2R1bGUgZG9jc3N0cmluZwogICAgICAgICAgICAtIFJld3JpdGUgYXV0b2RvYyBwYXJhbWV0ZXJzIHNlY3Rpb24gaW4gbnVtcHlkb2Mgc3R5bGU6CiAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL251bXB5L251bXB5L2Jsb2IvbWFzdGVyL2RvYy9IT1dUT19ET0NVTUVOVC5yc3QudHh0CiAgICAgICAgICAgIC0gT25lIGxpbmUgc3VtbWFyeSBzaG91bGQgZW5kIHdpdGggIi4iCiAgICAgICAgICAgIC0gQWRkcyBhIGJsYW5rIGxpbmUgYWZ0ZXIgY2xhc3MgZG9jc3RyaW5nCgoyMDE1LTA4LTA1OiB2YWR6CiAgICAgICAgICAgIFtKYXZhXSBNYWtlIChjaGFyKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHVzYWJsZSBmb3IKICAgICAgICAgICAgc3RyaW5ncyBvZiBvdGhlciB0eXBlcywgZS5nLiAidW5zaWduZWQgY2hhcioiLgoKVmVyc2lvbiAzLjAuNyAoMyBBdWcgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDgtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggcG90ZW50aWFsIHNlY3VyaXR5IGV4cGxvaXQgaW4gZ2VuZXJhdGVkIEphdmEgY2xhc3Nlcy4KICAgICAgICAgICAgVGhlIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgSmF2YQogICAgICAgICAgICBjbGFzc2VzIGFyZSBub3cgZGVjbGFyZWQgJ3RyYW5zaWVudCcgYnkgZGVmYXVsdC4gRnVydGhlciBkZXRhaWxzIG9mIHRoZSBleHBsb2l0CiAgICAgICAgICAgIGluIEFuZHJvaWQgaXMgYmVpbmcgcHVibGlzaGVkIGluIGFuIGFjYWRlbWljIHBhcGVyIGFzIHBhcnQgb2YgVVNFTklYIFdPT1QgJzE1OgogICAgICAgICAgICBodHRwczovL3d3dy51c2VuaXgub3JnL2NvbmZlcmVuY2Uvd29vdDE1L3dvcmtzaG9wLXByb2dyYW0vcHJlc2VudGF0aW9uL3BlbGVzLgoKICAgICAgICAgICAgSW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgeW91IGFyZSByZWx5aW5nIG9uIHRoZXNlIG1lbWJlcnMgYmVpbmcgc2VyaWFsaXphYmxlLAogICAgICAgICAgICB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMKICAgICAgICAgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBnZW5lcmF0ZWQgY29kZS4gVGhlIHJlbGV2YW50IHR5cGVtYXBzIGFyZSBpbiB0aGUgTGliIGRpcmVjdG9yeQogICAgICAgICAgICBpbiB0aGUgamF2YS5zd2csIGJvb3N0X3NoYXJlZF9wdHIuaSBhbmQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGZpbGVzLiBDb3B5IHRoZQogICAgICAgICAgICByZWxldmFudCBkZWZhdWx0IHR5cGVtYXBzIGludG8geW91ciBpbnRlcmZhY2UgZmlsZSBhbmQgcmVtb3ZlIHRoZSAndHJhbnNpZW50JyBrZXl3b3JkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE1LTA4LTAxOiB2YWR6CiAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiBtb3JlIHVzZWZ1bDogaXQgY2FuIG5vdyBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgLS13aXRoLXh4eCBvcHRpb25zLCBhbGxvd2luZyB0byBlYXNpbHkgZW5hYmxlIGp1c3Qgb25lIG9yIHR3byBsYW5ndWFnZXMuCgoyMDE1LTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ0MCAtIEluaXRpYWxpc2UgYWxsIG5ld2x5IGNyZWF0ZWQgYXJyYXlzIHdoZW4gdXNpbmcgJWFycmF5X2Z1bmN0aW9ucyBhbmQgJWFycmF5X2NsYXNzCiAgICAgICAgICAgIGluIHRoZSBjYXJyYXlzLmkgbGlicmFyeSAtIGJ1ZyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgQysrLgoKMjAxNS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSW1wcm92ZSBpbmRlbnRhdGlvbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBmb3IgY29kZSBpbiB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVweXRob25wcmVwZW5kCiAgICAgICAgICAgICAgJXB5dGhvbmFwcGVuZAogICAgICAgICAgICAgICVweXRob25jb2RlCiAgICAgICAgICAgICAgJXB5dGhvbmJlZ2luCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpCgogICAgICAgICAgICBPbGQgZXJyb3IgZXhhbXBsZToKICAgICAgICAgICAgICBFcnJvcjogTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKGxpbmUgMyBvZiBweXRob25jb2RlKQoKICAgICAgICAgICAgTmV3IGVycm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgRXJyb3I6IExpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkIChsaW5lIDMgb2YgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCiAgICAgICAgICAgICAgYXMgbm8gbGluZSBzaG91bGQgYmUgaW5kZW50ZWQgbGVzcyB0aGFuIHRoZSBpbmRlbnRhdGlvbiBpbiBsaW5lIDEKCiAgICAgICAgICAgIE9sZCB3YXJuaW5nIGV4YW1wbGU6CiAgICAgICAgICAgICAgV2FybmluZyA3NDA6IFdoaXRlc3BhY2UgcHJlZml4IGRvZXNuJ3QgbWF0Y2ggKGxpbmUgMiBvZiAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKCiAgICAgICAgICAgIE5ldyB3YXJuaW5nIGV4YW1wbGU6CiAgICAgICAgICAgICAgV2FybmluZyA3NDA6IFdoaXRlc3BhY2UgaW5kZW50YXRpb24gaXMgaW5jb25zaXN0ZW50IGNvbXBhcmVkIHRvIGVhcmxpZXIgbGluZXMgKGxpbmUgMyBvZgogICAgICAgICAgICAgICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQoKICAgICAgICAgICAgCjIwMTUtMDctMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjNDc1LiBJbXByb3ZlIGRvY3N0cmluZyBpbmRlbnRhdGlvbiBoYW5kbGluZy4KICAgICAgICAgICAgCiAgICAgICAgICAgIFNXSUctMy4wLjUgYW5kIGVhcmxpZXIgc29tZXRpbWVzIHRydW5jYXRlZCB0ZXh0IHByb3ZpZGVkIGluIHRoZSBkb2NzdHJpbmcgZmVhdHVyZS4KICAgICAgICAgICAgVGhpcyBvY2N1cnJlZCB3aGVuIHRoZSBpbmRlbnRhdGlvbiAod2hpdGVzcGFjZSkgaW4gdGhlIGRvY3N0cmluZyB3YXMgbGVzcyBpbiB0aGUKICAgICAgICAgICAgc2Vjb25kIG9yIGxhdGVyIGxpbmVzIHdoZW4gY29tcGFyZWQgdG8gdGhlIGZpcnN0IGxpbmUuCiAgICAgICAgICAgIFNXSUctMy4wLjYgZ2F2ZSBhICdMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCcgZXJyb3IgaW5zdGVhZCBvZiB0cnVuY2F0aW5nCiAgICAgICAgICAgIHRoZSBkb2NzdHJpbmcgdGV4dC4KICAgICAgICAgICAgTm93IHRoZSBpbmRlbnRhdGlvbiBmb3IgdGhlICdkb2NzdHJpbmcnIGZlYXR1cmUgaXMgc21hcnRlciBhbmQgaXMgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBhZGp1c3RlZCBzbyB0aGF0IG5vIHRydW5jYXRpb24gb2NjdXJzLgoKMjAxNS0wNy0yMjogd3NmdWx0b24KICAgICAgICAgICAgU3VwcG9ydCBmb3Igc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24gaW4gdHlwZW1hcCBhdHRyaWJ1dGVzLiBFeGFtcGxlIHVzYWdlIGV4cGFuc2lvbgogICAgICAgICAgICBpbiB0aGUgJ291dCcgYXR0cmlidXRlIChDIyBzcGVjaWZpYyk6CgogICAgICAgICAgICAgICV0eXBlbWFwKGN0eXBlLCBvdXQ9IiQqMV9sdHlwZSIpIHVuc2lnbmVkIGludCYgIiQqMV9sdHlwZSIKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBhcyAkKjFfbHR5cGUgZXhwYW5kcyB0byAndW5zaWduZWQgaW50JzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3R5cGUsIG91dD0idW5zaWduZWQgaW50IikgdW5zaWduZWQgaW50JiAidW5zaWduZWQgaW50IgoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgd2l0aGluIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvby4gRXhhbXBsZSB1c2FnZSBleHBhbnNpb246CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgdW5zaWduZWQgaW50ICJ1aW50IgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsICQqMV9sdHlwZSkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsICQqMV9sdHlwZSkiCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgZmlyc3QgYW5kIGhlbmNlIHRoZSBhYm92ZSBpcyBlcXVpdmFsZW50IHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIgoKICAgICAgICAgICAgd2hpY2ggdGhlbiBleHBhbmRzIHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0idWludCIpIHVuc2lnbmVkIGludCYgInVpbnQiCgoyMDE1LTA3LTIyOiBsaW5kbGV5ZgoJICAgIEFwcGx5IHBhdGNoICM0MzkgLSBzdXBwb3J0IGZvciAkdHlwZW1hcCgpIChha2EgZW1iZWRkZWQgdHlwZW1hcHMgb3Igc3BlY2lhbCB2YXJpYWJsZQogICAgICAgICAgICBtYWNyb3MpIGluIHR5cGVtYXAgYXR0cmlidXRlcy4gQSBzaW1wbGUgZXhhbXBsZSB3aGVyZSAkdHlwZW1hcCgpIGlzIGV4cGFuZGVkIGluIHRoZQogICAgICAgICAgICAnb3V0JyBhdHRyaWJ1dGUgKEMjIHNwZWNpZmljKToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSB1bnNpZ25lZCBpbnQgInVpbnQiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSJ1aW50IikgdW5zaWduZWQgaW50JiAidWludCIKCjIwMTUtMDctMTg6IG03dGhvbgoJICAgIFtQeXRob25dIERvY3N0cmluZ3MgcHJvdmlkZWQgdmlhICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93IHF1b3RlZCBhbmQgYWRkZWQgdG8KICAgICAgICAgICAgdGhlIHRwX2RvYyBzbG90IHdoZW4gdXNpbmcgcHl0aG9uIGJ1aWx0aW4gY2xhc3NlcyAoLWJ1aWx0aW4pLiBXaGVuIG5vIGRvY3N0cmluZyBpcwogICAgICAgICAgICBwcm92aWRlZCwgdGhlIHRwX2RvYyBzbG90IGlzIHNldCB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGNsYXNzIG5hbWUuCiAgICAgICAgICAgIEdpdGh1YiBpc3N1ZXMgIzQ0NSBhbmQgIzQ2MS4KCjIwMTUtMDctMTc6IGt3d2V0dGUKICAgICAgICAgICAgW29jdGF2ZV0gU3VwcG9ydCBPY3RhdmUgdmVyc2lvbiA0LjAuMCAodGhhbmtzIHRvIHBhdGNoZXMgZnJvbSBPcmlvbiBQb3BsYXdza2kpLgoKMjAxNS0wNy0wNzogd3NmdWx0b24KCSAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSB3cmFwcGVyIGZvciBhIGNsYXNzJyBjb25zdHJ1Y3RvciBpZiB0aGF0IGNsYXNzIGhhcwogICAgICAgICAgICBhbnkgYmFzZSBjbGFzcyB3aXRoIGEgcHJpdmF0ZSBkZXN0cnVjdG9yLiBUaGlzIGlzIGJlY2F1c2UgeW91ciBjb21waWxlciBzaG91bGQKICAgICAgICAgICAgbm90IGFsbG93IGEgY2xhc3MgdG8gYmUgaW5zdGFudGlhdGVkIGlmIGEgYmFzZSBoYXMgYSBwcml2YXRlIGRlc3RydWN0b3IuIFNvbWUKICAgICAgICAgICAgY29tcGlsZXJzIGRvLCBzbyBpZiB5b3UgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciwgdXNlIHRoZSAibm90YWJzdHJhY3QiIGZlYXR1cmUsIGVnOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSBEZXJpdmVkOwogICAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgICAgfkJhc2UoKSB7fQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHt9OwoKVmVyc2lvbiAzLjAuNiAoNSBKdWwgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDctMDI6IHdzZnVsdG9uCgkgICAgRml4IHN5bnRheCBlcnJvciB3aGVuIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkIGlzIHVzZWQgaW4gdHlwZXMsIGVnOgoKICAgICAgICAgICAgICBzdGQ6OnRlbXBsYXRlIHZlY3RvcjxpbnQ+IHY7CgoyMDE1LTA3LTAyOiBuZ2xhZGl0egoJICAgIFtMdWFdIFB1c2ggY2hhcmFjdGVycyBhcyB1bmZvcm1hdHRlZCAxLWNoYXJhY3RlciBzdHJpbmdzIHRvIGF2b2lkCgkgICAgdW5wcmludGFibGUgY2hhcmFjdGVycyBzdWNoIGFzIChjaGFyKTEyNyBiZWluZyBjb252ZXJ0ZWQgdG8KCSAgICAiPFwxMjc+IiB3aXRoIEx1YSA1LjMgYW5kIGxhdGVyLiAgKGdpdGh1YiBQUiAjNDUyKQoKMjAxNS0wNi0yOTogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSBpbiAlcHl0aG9uY29kZS4KCgkgICAgUHJldmlvdXNseSBTV0lHIGxvb2tlZCBhdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IGxpbmUgYW5kCgkgICAgcmVtb3ZlZCB0aGF0IG1hbnkgY2hhcmFjdGVycyBmcm9tIGVhY2ggc3Vic2VxdWVudCBsaW5lLCByZWdhcmRsZXNzCgkgICAgb2Ygd2hhdCB0aG9zZSBjaGFyYWN0ZXJzIHdlcmUuICBUaGlzIHdhcyBtYWRlIHdvcnNlIGJlY2F1c2UgU1dJRydzCgkgICAgcHJlcHJvY2Vzc29yIHJlbW92ZXMgYW55IHdoaXRlc3BhY2UgYmVmb3JlIGEgJyMnLiAgRml4ZXMgZ2l0aHViCgkgICAgaXNzdWUgIzM3OSwgcmVwb3J0ZWQgYnkgSm9lIE9ydG9uLgoKMjAxNS0wNi0xMjogd3NmdWx0b24KCSAgICBbUl0gRml4ICM0MzAgLSBjYWxsIHRvIFNXSUdfY3JlYXRlTmV3UmVmIGluIGNvcHlUb0Mgd2FzIGluY29ycmVjdGx5IG5hbWVkLgoKMjAxNS0wNi0xMTogc2doaXJhdGUKCSAgICBbQyNdIFBhdGNoICM0MjcgYWRkcyBpbiBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtb3V0ZmlsZSB0byBjb21iaW5lIGFsbCB0aGUKICAgICAgICAgICAgZ2VuZXJhdGVkIEMjIGNvZGUgaW50byBhIHNpbmdsZSBmaWxlLgoKMjAxNS0wNi0wOTogd3NmdWx0b24KCSAgICBGaXggc2VnIGZhdWx0IHByb2Nlc3NpbmcgQysrMTEgdHlwZSBhbGlhc2luZy4gSXNzdWUgIzQyNC4KCjIwMTUtMDUtMjg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQWRkIG5ldyBmZWF0dXJlICJweXRob246Y2RlZmF1bHRhcmdzIiB0byBjb250cm9sIGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uLiBCeSBkZWZhdWx0LCBTV0lHIGF0dGVtcHRzIHRvIGNvbnZlcnQgQy9DKysgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMKICAgICAgICAgICAgaW50byBQeXRob24gdmFsdWVzIGFuZCBnZW5lcmF0ZXMgY29kZSBpbnRvIHRoZSBQeXRob24gbGF5ZXIgd2l0aCB0aGVzZSB2YWx1ZXMuCiAgICAgICAgICAgIFJlY2VudCB2ZXJzaW9ucyBvZiBTV0lHIGFyZSBhYmxlIHRvIGNvbnZlcnQgbW9yZSBvZiB0aGVzZSB2YWx1ZXMsIGhvd2V2ZXIsIHRoZQogICAgICAgICAgICBuZXcgYmVoYXZpb3VyIGNhbiBiZSBjaXJjdW12ZW50ZWQgaWYgZGVzaXJlZCB2aWEgdGhpcyBuZXcgZmVhdHVyZSwgc3VjaCB0aGF0CiAgICAgICAgICAgIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgQyBsYXllciBhbmQgbm90IHRoZSBQeXRob24gbGF5ZXIuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0RBIHsKICAgICAgICAgICAgICAgIGludCBmZmYoaW50IGEgPSAxLCBib29sIGIgPSBmYWxzZSk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgUHl0aG9uIGxheWVyIGlzOgoKICAgICAgICAgICAgICBjbGFzcyBDREEoX29iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBkZWYgZmZmKHNlbGYsIGE9MSwgYj1GYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRfYXJncy5DREFfZmZmKHNlbGYsIGEsIGIpCgogICAgICAgICAgICBBZGRpbmcgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246Y2RlZmF1bHRhcmdzIikgQ0RBOjpmZmY7CgogICAgICAgICAgICBSZXN1bHRzIGluOgoKICAgICAgICAgICAgICBjbGFzcyBDREEoX29iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBkZWYgZmZmKHNlbGYsICphcmdzKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdF9hcmdzLkNEQV9mZmYoc2VsZiwgKmFyZ3MpCgogICAgICAgICAgICBTb21lIGNvZGUgZ2VuZXJhdGlvbiBtb2RlcywgZWcgLWJ1aWx0aW4gYW5kIC1mYXN0cHJveHksIGFyZSB1bmFmZmVjdGVkIGJ5IHRoaXMgYXMKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhbHdheXMgb2J0YWluZWQgZnJvbSB0aGUgQyBsYXllci4KCjIwMTUtMDUtMjc6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRGVhbCB3aXRoIGFuIGludGVnZXIgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSB0eXBlZGVmIHRvIGJvb2wKCSAgICBwYXJhbWV0ZXIgaW4gdGhlIEMrKyBwcm90b3R5cGUuICBTZWUgIzMyNy4gUmVncmVzc2lvbiBmcm9tIDMuMC4wIG9ud2FyZHMuCgoyMDE1LTA1LTE5OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUgd2l0aCBNU1ZDLgoJICAgIChGaXhlcyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvcGF0Y2hlcy8zNTEvIHJlcG9ydGVkIGJ5CgkgICAgTWF0ZXVzeiBTenltYb9za2kpLgoKMjAxNS0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCB3cmFwcGluZyBzaGFyZWRfcHRyIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIAogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgdGhlICJ1bnJlZiIgZmVhdHVyZSB3aGVuIHVzZWQgb24gY2xhc3NlcyB3aXRoIHByaXZhdGUgZGVzdHJ1Y3RvcnMuCgoyMDE1LTA1LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpCiAgICAgICAgICAgIHNvIHRoYXQgdGhleSBjYW4gYmUgYXBwbGllZCB0byBhIHdpZGVyIHJhbmdlIG9mIHR5cGVzLiBGaXhlcyAjMzg1LgoKMjAxNS0wNS0wNzogb2xseQoJICAgIFtQeXRob25dIERlYWwgd2l0aCBhbiBpbnRlZ2VyIGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgYm9vbAoJICAgIHBhcmFtZXRlciBpbiB0aGUgQysrIHByb3RvdHlwZS4gIEZpeGVzIGdpdGh1YiAjMzI3LCByZXBvcnRlZCBieQoJICAgIEdyZWcgQWxsZW4uCgoyMDE1LTA1LTA3OiBMaW5kbGV5RgoJICAgIFtKYXZhXSBBbGxvdyBmZWF0dXJlKCJkaXJlY3RvciIpIGFuZCBmZWF0dXJlKCJyZWYiKSB0byBiZSB1c2VkCgkgICAgdG9nZXRoZXIuICBHaXRodWIgUFIjNDAzLgoKMjAxNS0wNS0wNTogb2xseQoJICAgIFN1cHByZXNzIHdhcm5pbmcgMzI1ICJOZXN0ZWQgY2xhc3Mgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKEZvbwoJICAgIGlnbm9yZWQpIiB3aGVuIEZvbyBoYXMgYWxyZWFkeSBiZWVuIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoICIlaWdub3JlIi4KCjIwMTUtMDUtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBmcmllbmQgdGVtcGxhdGVzLCBpbmNsdWRpbmcgb3BlcmF0b3Igb3ZlcmxvYWRpbmcgLSBmaXhlcyAjMTk2LiBDb25zaWRlcmluZwogICAgICAgICAgICB0aGUgZXhhbXBsZSBiZWxvdywgcHJldmlvdXNseSB0aGUgb3BlcmF0b3IgZ2F2ZSBhIHN5bnRheCBlcnJvciBhbmQgZnJpZW5kZnVuYyBpbmNvcnJlY3RseQogICAgICAgICAgICB3YXJuZWQgd2l0aDoKCiAgICAgICAgICAgICAiV2FybmluZyA1MDM6IENhbid0IHdyYXAgJ2ZyaWVuZGZ1bmM8KFR5cGUpPicgdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLiIKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFR5cGU+IGNsYXNzIE15Q2xhc3MgewogICAgICAgICAgICAgICAgZnJpZW5kIGludCBmcmllbmRmdW5jIDxUeXBlPihkb3VibGUgaXMsIE15Q2xhc3MgPFR5cGU+ICYgeCk7CiAgICAgICAgICAgICAgICBmcmllbmQgaW50IG9wZXJhdG9yPDwgPFR5cGU+KGRvdWJsZSB1biwgY29uc3QgTXlDbGFzcyA8VHlwZT4gJngpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGFsc28gcHJldmlvdXNseSBpbmNvcnJlY3RseSB3YXJuZWQgd2l0aDoKCiAgICAgICAgICAgICAgIldhcm5pbmcgMzAyOiBJZGVudGlmaWVyICd0ZW1wbGF0ZV9mcmllbmQnIHJlZGVmaW5lZCAoaWdub3JlZCksIgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIHRlbXBsYXRlX2ZyaWVuZChUKTsKICAgICAgICAgICAgICBzdHJ1Y3QgTXlUZW1wbGF0ZSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgVCB0ZW1wbGF0ZV9mcmllbmQoVCk7CiAgICAgICAgICAgICAgfTsKCjIwMTUtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBoYW5kbGluZyBvZiBjb252ZXJzaW9uIG9wZXJhdG9ycyB3aGVyZSB0aGUgb3BlcmF0b3IgaXMgc3BsaXQgb3ZlciBtdWx0aXBsZQogICAgICAgICAgICBsaW5lcyBvciBoYXMgY29tbWVudHMgd2l0aGluIHRoZSBvcGVyYXRvciB0eXBlLiBGaXhlcyAjNDAxLgoKICAgICAgICAgICAgQWxzbyBmaXggc2ltaWxhciBwcm9ibGVtIHdpdGggbm9ybWFsIG9wZXJhdG9ycyB3aGljaCBnYXZlIGEgc3ludGF4IGVycm9yIGlmIHNwbGl0IG92ZXIKICAgICAgICAgICAgbXVsdGlwbGUgbGluZXMgb3IgaGFkIGEgY29tbWVudCB3aXRoaW4gdGhlIG9wZXJhdG9yIGRlY2xhcmF0aW9uLgoKMjAxNS0wNC0zMDogb2xseQoJICAgIElnbm9yZSB1bmtub3duIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHdoaWNoIGFyZSBpbnNpZGUgYW4gaW5hY3RpdmUKCSAgICBjb25kaXRpb25hbCAoZ2l0aHViIGlzc3VlICMzOTQsIHJlcG9ydGVkIGJ5IERhbiBXaWxjb3gpLgoJICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAzLjAuMy4KCjIwMTUtMDQtMjc6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICJkZWZhdWx0IiB0eXBlbWFwIHVzZWQgYWZ0ZXIgYW4gYXJndW1lbnQgd2l0aCAibnVtaW5wdXRzPTAiICgjMzc3KS4KCjIwMTUtMDQtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjU2LiBDb2RlIGdlbmVyYXRlZCB3aXRoICctYnVpbHRpbiAtbW9kZXJuYXJncycgc2VnZmF1bHRzIGZvciBhbnkKICAgICAgICAgICAgbWV0aG9kIHRha2luZyB6ZXJvIGFyZ3VtZW50cy4KCiAgICAgICAgICAgIEFsc28gZml4ZXM6ICJTeXN0ZW1FcnJvcjogZXJyb3IgcmV0dXJuIHdpdGhvdXQgZXhjZXB0aW9uIHNldCIgZHVyaW5nIGVycm9yIGNoZWNraW5nCiAgICAgICAgICAgIHdoZW4gdXNpbmcganVzdCAtYnVpbHRpbiBhbmQgdGhlIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIGlzIHBhc3NlZCB0byBhIGNsYXNzCiAgICAgICAgICAgIG1ldGhvZCBleHBlY3RpbmcgemVybyBhcmd1bWVudHMuCgoyMDE1LTA0LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMzODYgLSBNZW1vcnkgbGVhayBmaXggaW4gKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMuCgoyMDE1LTA0LTIzOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIE1ha2UgImRlZmF1bHQiIHR5cGVtYXAgd29yayBhZ2FpbiAoIzMzMCwgIzM3NykuCgoyMDE1LTA0LTIzOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgdXNlIG9mIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcG9pbnRlciB0eXBlcyAoIzM2NSwgIzM3NikuCgoyMDE1LTA0LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJ21ha2UgY2hlY2stY2NhY2hlJyB3aGljaCBpcyBwYXJ0IG9mICdtYWtlIGNoZWNrJyB3aGVuIG9uZSBvZiB0aGUgQ0NBQ0hFXwogICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGZvciBleGFtcGxlIENDQUNIRV9ESVNBQkxFLCBpcyBzZXQuCgoyMDE1LTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBDbGVhcmVyIHdhcm5pbmcgbWVzc2FnZSBmb3IgYmFkbHkgY29uc3RydWN0ZWQgdHlwZWNoZWNrIHR5cGVtYXBzLiBGb3IgZXhhbXBsZSwgd2FzOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzogV2FybmluZyA0Njc6IE92ZXJsb2FkZWQgZm9vKGludCkgbm90IHN1cHBvcnRlZCAobm8gdHlwZSBjaGVja2luZwogICAgICAgICAgICAgIHJ1bGUgZm9yICdpbnQnKS4KCiAgICAgICAgICAgIE5vdzoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgNDY3OiBPdmVybG9hZGVkIGZvbyhpbnQpIG5vdCBzdXBwb3J0ZWQgKGluY29tcGxldGUgdHlwZSBjaGVja2luZwogICAgICAgICAgICAgIHJ1bGUgLSBubyBwcmVjZWRlbmNlIGxldmVsIGluIHR5cGVjaGVjayB0eXBlbWFwIGZvciAnaW50JykuCgoyMDE1LTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMzNTMgLSBMaW5rZXIgbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiAnRXhjZXB0aW9uTWF0Y2hlcycgd2hlbgogICAgICAgICAgICB1c2luZyBkaXJlY3RvcnMgYW5kIG11bHRpcGxlIG1vZHVsZXMuCgoyMDE1LTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNZXJnZSAjMzIwIC0gTWFrZSBfX2RpY3RfXyBhY2Nlc3NpYmxlIGZvciBQeXRob24gYnVpbHRpbiBjbGFzc2VzLgoKMjAxNS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNzUgLSBwYXJzaW5nIG9mIGV4dGVybiAiQyIgYW5kIHR5cGVkZWYgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgZXh0ZXJuICJDIiB0eXBlZGVmIHZvaWQgKCpIb29rMl90KShpbnQsIGNvbnN0IGNoYXIgKik7CiAgICAgICAgICAgICAgZXh0ZXJuICJDIiB0eXBlZGVmIGludCBJbnRlZ2VyOwoKMjAxNS0wMy0xMjogb2xseQoJICAgIC1EU1dJR19ESVJFQ1RPUl9TVEFUSUMgaXMgbm93IHN1cHBvcnRlZCBmb3IgYWxsIGxhbmd1YWdlcyB3aXRoCgkgICAgZGlyZWN0b3Igc3VwcG9ydCwgbm90IG9ubHkgUHl0aG9uIGFuZCBQSFAuCgoyMDE1LTAzLTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIC1jZ28gb3B0aW9uLCByZXF1aXJlZCBmb3IgR28gdmVyc2lvbnMgMS41IGFuZAoJICAgIGxhdGVyLgoKMjAxNS0wMi0yNjogb2xseQoJICAgIEZpeCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiB0b3A9PU5VTEwsIGludHJvZHVjZWQgYnkgbmVzdGVkIGNsYXNzCgkgICAgaGFuZGxpbmcgKHJlcG9ydGVkIGluIGlzc3VlIzM0NiBieSBQYXdlvyBUb211bGlrKS4KCjIwMTUtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHdWlsZV0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdoZW4KICAgICAgICAgICAgZGVmaW5lZCBhbmQgZGVjbGFyZWQgaW5saW5lLgoKMjAxNS0wMi0wOTogbWlzaGFzCiAgICAgICAgICAgIFtHb10gRml4ICVpbXBvcnQgb2YgZmlsZXMgaW4gc3ViIGRpcmVjdG9yaWVzLgoKMjAxNS0wMi0wNTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBJZ25vcmUgR28gc3BlY2lmaWMgdHlwZSBtYXBzIChnb2luLCBnb291dCwgZXRjLikgaWYgdGhleSBhcmUgZW1wdHkuCgoyMDE1LTAyLTA1OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIEdlbmVyYXRlZCBHbyBjb2RlIG5vIGxvbmdlciBjYWxscyBfc3dpZ19nb2FsbG9jYXRlIG9yCiAgICAgICAgICAgIF9zd2lnX21ha2Vnb3N0cmluZywgYXMgdGhleSB3aWxsIG5vIGxvbmdlciB3b3JrIGFzIG9mIEdvIDEuNS4KClZlcnNpb24gMy4wLjUgKDMxIEphbiAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gLWNsYXNzaWMgYW5kIHByb3BlcnR5IHNldHRpbmcuIFNldHRpbmcgcHJvcGVydGllcyBvbiBjbGFzc2ljIGNsYXNzZXMKICAgICAgICAgICAgd2FzIGJyb2tlbiBpbiBzd2lnLTMuMC4zIGJ5IGF0dGVtcHRpbmcgdG8gdXNlIF9fc2V0YXR0cl9fLiBUaGlzIHJlZ3Jlc3Npb24gaXMgZml4ZWQgbm93CiAgICAgICAgICAgIGJ5IHVzaW5nIF9fZGljdF9fIGFnYWluIHdoZW4gdXNpbmcgLWNsYXNzaWMuCiAgICAgICAgICAgIEZpeGVzIHBhdGNoICMyMzIuCgoyMDE1LTAxLTI3OiBzbWFyY2hldHRvCgkgICAgW1NjaWxhYl0gU3VwcG9ydCBmb3IgdGhlIFNjaWxhYiBsYW5ndWFnZSBoYXMgYmVlbiBhZGRlZAoKMjAxNS0wMS0yMzogb2xseQoJICAgIFtQSFBdIFdoZW4gd3JhcHBpbmcgYSByZXR1cm5lZCByZXNvdXJjZSBhcyBhbiBvYmplY3QsIGNoZWNrIGlmIGFsbAoJICAgIGNhc2VzIHdyYXAgaXQgaW4gdGhlIHNhbWUgY2xhc3MsIGFuZCBpZiBzbyBlbGltaW5hdGUgdGhlIHBvaW50bGVzcwoJICAgIHN3aXRjaCBzdGF0ZW1lbnQgd3JhcHBlciB3ZSBwcmV2aW91c2x5IGdlbmVyYXRlZC4KCjIwMTUtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIE1lcmdlIHBhdGNoICMyOTcgZm9yIFNGIGJ1ZyAjMTI3NyAtIE9jdGF2ZSBzaGFyZWRfcHRyIHN1cHBvcnQKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1lcmdlIHBhdGNoICMyNTAgLSBGaXhlcyBmb3IgdXNpbmcgJWNvbnN0YW50IGFuZCBvYmplY3RzIChub24tcHJpbWl0aXZlIHR5cGVzKQoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIEdvXSBNZXJnZSBwYXRjaCAjMzA4IGFuZCBmaXggIzMwNyAtIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW0gc3VwcG9ydAogICAgICAgICAgICBpbiBkaXJlY3RvcnMKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNlY29uZCBmaXggZm9yICMyOTQgIzI5NiAtIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBTV0lHLTMuMC4zIHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMsIHRoaXMgdGltZSB3aGVuIHVzaW5nIGt3YXJncy4KClZlcnNpb24gMy4wLjQgKDE0IEphbiAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDEtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgaW4gZGlyZWN0b3IgdXBjYWxsIGNoZWNrIHdoZW4gdXNpbmcgUEhQIGJ1aWx0IHdpdGgKCSAgICBaVFMgZW5hYmxlZC4gIEZpeGVzICMxNTUsIHJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZS4KCjIwMTUtMDEtMTI6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTQgIzI5NiAtIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBTV0lHLTMuMC4zIHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuIEludmFsaWQgb3IgbWlzc2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyB3ZXJlIHNvbWV0aW1lcyBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgcHl0aG9uIGxheWVyLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEFsbG93IEMrKzExICJleHBsaWNpdCBjb25zdGV4cHIiLiAgRml4ZXMgZ2l0aHViIGlzc3VlICMyODQgcmVwb3J0ZWQKCSAgICBieSBQYXdlbCBUb211bGlrLiAgQWxzbyBoYW5kbGUgImNvbnN0ZXhwciBleHBsaWNpdCIgYW5kICJjb25zdGV4cHIKCSAgICBzdGF0aWMiLgoKMjAxNS0wMS0wODogb2xseQoJICAgIFdoZW4gcmVwb3J0aW5nIGFuIGVycm9yIGZvciBhIGNvbnN0cnVjdCB3aGljaCBoYXNuJ3QgYmVlbgoJICAgIHRlcm1pbmF0ZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQsIHJlcG9ydCBpdCBhdCB0aGUKCSAgICBzdGFydCBsaW5lIHJhdGhlciB0aGFuICJFT0YiIGFzIHRoZW4gdG9vbHMgbGlrZSBlZGl0b3JzIGFuZCBJREVzCgkgICAgd2lsbCB0YWtlIHlvdSB0byBhIGdlbmVyYWxseSBtb3JlIHVzZWZ1bCBwbGFjZSBmb3IgZml4aW5nIHRoZQoJICAgIHByb2JsZW0uCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgSW1wcm92ZSBlcnJvciBtZXNzYWdlcyBmb3IgYSBmZXcgY2FzZXMgd2hpY2ggcHJldmlvdXNseSBnYXZlIHRoZQoJICAgIG9uZSBvZiB0aGUgY3J5cHRpYyBjYXRjaC1hbGwgZXJyb3JzICJTeW50YXggZXJyb3IgaW4gaW5wdXQiLgoKMjAxNS0wMS0wODogb2xseQoJICAgIFByb3ZpZGUgLWNwcGV4dCBhcyBhIGdlbmVyYWwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3Igc2V0dGluZyB0aGUKCSAgICBleHRlbnNpb24gdXNlZCBmb3IgZ2VuZXJhdGVkIEMrKyBmaWxlcyAocHJldmlvdXNseSBpdCB3YXMgc3BlY2lmaWMKCSAgICB0byB0aGUgUEhQIGJhY2tlbmQpLiAgRGVwcmVjYXRlIHRoZSBlcXVpdmFsZW50IC1zdWZmaXggb3B0aW9uCgkgICAgcHJvdmlkZWQgYnkgdGhlIE9jYW1sIGJhY2tlbmQsIGJ1dCBjb250aW51ZSB0byBzdXBwb3J0IHRoYXQgZm9yCgkgICAgbm93LgoKVmVyc2lvbiAzLjAuMyAoMzAgRGVjIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0xMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODAgLSBhYm9ydCB1c2luZyBhbGwgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGhpbiBvdGhlciB0ZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzLgoKMjAxNC0xMi0yNzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIElzc3VlICMyODIgcGVybDUgYXJjaGxpYiB2cyBhcmNobGliZXhwCiAgICAgICAgICAgIFtQZXJsXSB0aWR5ICJ3YXJuaW5nOiBkdXBsaWNhdGUgJ2V4dGVybicgZGVjbGFyYXRpb24gc3BlY2lmaWVyIiB3aGVuIGJ1aWxkaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIGNsYW5nCgoyMDE0LTEyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgJWNvbnN0YW50IGFuZCBzdHJ1Y3RzL2NsYXNzZXMgLSBpc3N1ZSAjMjcyCgoyMDE0LTEyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0NSAtIHJlZ3Jlc3Npb24gKHNpbmNlIHN3aWctMy4wLjApIGluIHRlbXBsYXRlZCBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFRlbXBsYXRlZCBjb25zdHJ1Y3RvcnMgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCAtIHRoZXkgd2VyZSBpbmNvcnJlY3RseSBpZ25vcmVkIHdpdGggYSB3YXJuaW5nIDUwNDoKICAgICAgICAgICAgIkZ1bmN0aW9uOiB4eXogbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUuIElnbm9yZWQuIgoKMjAxNC0xMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW1lcmF0aW9ucy4KCjIwMTQtMTEtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggbXVsdGlwbHkgZGVmaW5lZCBlcnJvciB3aGVuIHVzaW5nICVyZW5hbWUgb2YgZW51bSBpdGVtcyB3aGVuIHVzaW5nIHRoZSAic2ltcGxlIGVudW0iCiAgICAgICAgICAgIHdyYXBwZXJzLgoKMjAxNC0xMC0yODogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjAxIFRoZSBnZW5lcmF0ZWQgLnB5IGZpbGUgbm8gbG9uZ2VyIHVzZXMgKmFyZ3MgZm9yIGFsbCBQeXRob24gcGFyYW1ldGVycy4KICAgICAgICAgICAgSW5zdGVhZCwgdGhlIHBhcmFtZXRlcnMgYXJlIG5hbWVkIHVzaW5nIHRoZSBDKysgcGFyYW1ldGVyIG5hbWVzLgoKICAgICAgICAgICAgImNvbXBhY3RkZWZhdWx0YXJncyIgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCB0byByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3VyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE0LTEwLTI0OiB0aW1vdGhlZWNvdXIKICAgICAgICAgICAgW0RdIFBhdGNoICMyMDQgVXNlIGNvcmUuYXRvbWljLmF0b21pY09wIHRvIG11dGF0ZSBzaGFyZWQgdmFyaWFibGVzCgoyMDE0LTEwLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaXNzdWUgIzI0MiAtIFVzZSBvZiB0aGUgImt3YXJncyIgZmVhdHVyZSBubyBsb25nZXIgYXV0b21hdGljYWxseSB0dXJucyBvbiB0aGUKICAgICAgICAgICAgImNvbXBhY3RkZWZhdWx0YXJncyIgZmVhdHVyZSBpZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGRvZXMgbm90IHN1cHBvcnQga3dhcmdzLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhZmZlY3RzIGFsbCBsYW5ndWFnZXMgZXhjZXB0IFB5dGhvbiBhbmQgUnVieS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMTAtMTA6IGRpb3JjZXR5CiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMzIgRml4IHByb3BlcnR5IGFjY2VzcyB1c2luZyBkaXJlY3RvcnMKCjIwMTQtMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIHdoZW4gdXNpbmcgLWJ1aWx0aW4gYW5kIHN0ZDo6dmVjdG9yL3N0ZDo6bGlzdCB3cmFwcGVycyB0byBhbGxvdyBkZWxldGlvbgogICAgICAgICAgICBvZiBzaW5nbGUgZWxlbWVudHMsIHN1Y2ggYXMgJ2RlbCB2ZWNbMF0nLgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzIxNiBieSBSaWNoaWU3NjUgLSBBZGRlZCBzdXBwb3J0IGZvciBtYW55IHZlcnNpb25zIG9mIHY4IGphdmFzY3JpcHQuCgoyMDE0LTA5LTMwOiBvbGl2ZXJiCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBNZXJnZSBwYXRjaCAjMTk1IGJ5IHppdHRpeCAtIEZpeGVkIEpTQ2xhc3NSZWYgZGVjbGFyYXRpb24gbm90IHVzaW5nIHRoZSBzdGF0aWMgb25lLgoKMjAxNC0wOS0zMDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEluIGNvbmZpZ3VyZSBzY3JpcHQsIHJlcXVpcmUgR28gMS4xIG9yIGxhdGVyLgoKMjAxNC0wOS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwNyAtIEZpeCBObyBtb2R1bGUgZXJyb3Igd2l0aCAtcmVsYXRpdmVpbXBvcnQgd2hlbiB1c2luZyBzaW5nbGUKICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW1wb3J0LgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzIwOCAtIEluaXRpYWxpc2UgbmV3bHkgY3JlYXRlZCBhcnJheSB3aGVuIHVzaW5nIGFycmF5X2Z1bmN0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2FycmF5cy5pIGxpYnJhcnkgKEMrKyB1c2FnZSkuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzE4NyAtIEZpeCBjcmFzaCBvbiBzaHV0ZG93biBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBpZiBtb3JlIHRoYW4gb25lCiAgICAgICAgICAgIG1vZHVsZSB3YXMgbG9hZGVkIGF0IGEgdGltZSB3aGVuIGRhdGEgaXMgYmVpbmcgc2hhcmVkIGJldHdlZW4gbW9kdWxlcy4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTY4IC0gRml4IGxlYWsgaW4gSmF2YSBkaXJlY3RvciBzdHJpbmcgaGFuZGxpbmcgYWZ0ZXIgdGhlIEphdmEKICAgICAgICAgICAgdXBjYWxsIHdoZW4gY2FsbGVkIGZyb20gYSBuYXRpdmUgdGhyZWFkLgoKMjAxNC0wOS0yNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkanVzdCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggdXBjb21pbmcgR28gMS40CgkgICAgcmVsZWFzZS4KCjIwMTQtMDktMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBwYXRjaCBmcm9tIFRob21hcyBNYXNsYWNoIHRvIGZpeCBjcmFzaCBpbiB3cmFwcGVycyB3aGVuIHVzaW5nIC10aHJlYWRzIGluCiAgICAgICAgICAgIHRoZSBTVEwgaXRlcmF0b3JzIChTd2lnUHlJdGVyYXRvciBkZXN0cnVjdG9yKS4KCjIwMTQtMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIyOSBmcm9tIGNvbnRyZSAtIEFkZCBib29sIGFycmF5IHR5cGVzIHRvIGFycmF5c19jc2hhcnAuaQoKMjAxNC0wOS0xMjogb2xseQoJICAgIFtQSFBdIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFueSBQSFAgaW50ZXJmYWNlcyBhIHdyYXBwZWQgY2xhc3MKCSAgICBpbXBsZW1lbnRzLCBlLmcuOiAldHlwZW1hcCgicGhwaW50ZXJmYWNlcyIpIE15SXRlcmF0b3IgIkl0ZXJhdG9yIjsKCjIwMTQtMDktMTE6IG9sbHkKCSAgICBbUEhQXSBGaXggdGhyb3dpbmcgYSBQSFAgZXhjZXB0aW9uIHRocm91Z2ggQysrIGZyb20gYSBzdWJjbGFzc2VkCgkgICAgZGlyZWN0b3IgbWV0aG9kIC0gUEhQIE5VTEwgZ2V0cyByZXR1cm5lZCBieSB0aGUgc3ViY2xhc3NlZCBtZXRob2QKCSAgICBpbiB0aGlzIGNhc2UsIHNvIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwIG5lZWRzIHRvIGFsbG93IHRoYXQgKGF0CgkgICAgbGVhc3QgaWYgYW4gZXhjZXB0aW9uIGlzIGFjdGl2ZSkuCgoyMDE0LTA5LTA5OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGdvYXJnb3V0IHR5cGVtYXAuCgoyMDE0LTA5LTA5OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ21lbnRhdGlvbiBmYXVsdHMgd2l0aCBkaXJlY3RvcnMgaW4gUEhQID49IDUuNCwgYW5kCgkgICAgcmVlbmFibGUgcnVubWUgdGVzdHMgZm9yIGRpcmVjdG9yX2Jhc2ljIHRlc3RjYXNlLiAgRml4IGZyb20KCSAgICBwYXZlbC1jaGFydmF0IGluIGlzc3VlIzE2NC4KCjIwMTQtMDktMDU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgaW10eXBlLCBnb2luLCBnb291dCwgZ29kaXJlY3RvcmluLCBhbmQKCSAgICBnb2RpcmVjdG9yb3V0IHR5cGVtYXBzLCB0byBzdXBwb3J0IHdyaXRpbmcgR28gY29kZSB0bwoJICAgIGNvbnZlcnQgYmV0d2VlbiB0eXBlcy4KCjIwMTQtMDktMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcmVncmVzc2lvbiBpbiBpbmRlbnRhdGlvbiBvZiBweXRob24gY29kZSBwcm9kdWNlZCB3aXRoCgkgICAgLW1vZGVybiwgaW50cm9kdWNlZCBieSBjaGFuZ2VzIGluICMxODguICBSZXBvcnRlZCBieSBmYWJpZW5jYXN0YW4KCSAgICBpbiAjMjE4LgoKMjAxNC0wOS0wMTogb2xseQoJICAgIElzc3VlIGFuIGVycm9yIGZvciB1bmtub3duIFNXSUcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsIHJhdGhlcgoJICAgIHRoYW4gcXVpZXRseSBpZ25vcmluZyB0aGVtLiAgUmVwb3J0ZWQgYnkganJoZWxzZXkgaW4gaXNzdWUjMjE3LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wOC0xNTogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEluY2x1ZGUgZ3VhcmQgZml4IGZvciBuZXN0ZWQgbW9kdWxlcyBmcm9tIEFudGhvbnkgSGVhZGluZyAoU0YgUGF0Y2ggIzM1MCkuCgoyMDE0LTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMDAgZnJvbSBncGV0cm91IC0gQ2hhbmdlZCBDU2hhcnAgbGljZW5zZSBoZWFkZXIgdG8gaW5jbHVkZSBhdXRvLWdlbmVyYXRlZAogICAgICAgICAgICB0YWcgc28gdGhhdCBTdHlsZUNvcCBpZ25vcmVzIHRoZSBmaWxlcy4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBNZXJnZSBwYXRjaCAjMTk4IGZyb20gWXV2YWwgS2FzaHRhbiAtIFN1cHBvcnQgZm9yIGphdmEubmlvLkJ5dGVCdWZmZXIgbWFwcGluZyB0bwogICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogaW4gdmFyaW91cy5pIGluIE5JT0JVRkZFUiB0eXBlbWFwcy4KCjIwMTQtMDctMTQ6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBDaGFuZ2Ugc3RydWN0IGRlZmluaXRpb24gdG8gdXNlIHZvaWQgKiwgbm90IHVpbnQ4LCBzbwoJICAgIHRoYXQgdGhlIHR5cGUgaXMgcmVjb3JkZWQgYXMgcG9zc2libHkgY29udGFpbmluZwoJICAgIHBvaW50ZXJzLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIDEuMyBnYXJiYWdlIGNvbGxlY3RvcgoJICAgIGRvZXMgbm90IGNvbGxlY3QgcG9pbnRlcnMgcGFzc2VkIHRvIEMrKyBjb2RlLgoKMjAxNC0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGIEJ1ZyAjMTM3NSAtIEV4cGFuc2lvbiBvZiB0aGUgJHBhcmVudGNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGluY29ycmVjdGx5IGNvbnRhaW5zCiAgICAgICAgICAgIGJyYWNrZXRzIGluIHRoZSBleHBhbmRlZCBuYW1lLgoKVmVyc2lvbiAzLjAuMiAoNCBKdW4gMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDYtMDI6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBQdWxsIHJlcXVlc3QgIzE3NjoKICAgICAgICAgICAgSWYgY2xhc3MgaGFzIG5vIF9fZXEgaW1wbGVtZW50ZWQsIHRoZW4gZGVmYXVsdCBfX2VxIGlzIGdlbmVyYXRlZC4gCiAgICAgICAgICAgIERlZmF1bHQgX19lcSBjb21wYXJlcyBhY3R1YWwgcG9pbnRlcnMgc3RvcmVkIGluc2lkZSBMdWEgdXNlcmRhdGEuCgoyMDE0LTA2LTAyOiB2a2FsaW5pbgogICAgICAgICAgICBGaXggIzE4MyAtICVleHRlbmQgYW5kIHVubmFtZWQgbmVzdGVkIHN0cnVjdHMKCjIwMTQtMDUtMjg6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGluc3RhbGwgZmFpbHVyZSB3aGVuIHVzaW5nIGFuICdvdXQgb2Ygc291cmNlJyBidWlsZCB1c2luZyB0aGUgc2hpcHBlZAogICAgICAgICAgICB0YXJiYWxsIC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjEuCgoyMDE0LTA1LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSBkZXByZWNhdGVkIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKClZlcnNpb24gMy4wLjEgKDI3IE1heSAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDUtMjU6IGhmYWxjaWMKCSAgICBbUHl0aG9uXSBQeXRob24gMyBieXRlIHN0cmluZyBvdXRwdXQ6IHVzZSBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIKICAgICAgICAgICAgaWYgYXZhaWxhYmxlIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0J3MgaW4gdXNlLiBUaGlzIGFsbG93cwogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGUgc3RyaW5nIChhbmQgcG90ZW50aWFsbHkgdHJ5aW5nIGEgZmFsbGJhY2sKICAgICAgICAgICAgZW5jb2RpbmcpIGlmIHRoZSBieXRlcyBjYW4ndCBiZSBkZWNvZGVkIGFzIFVURi04LgoKICAgICAgICAgICAgUHJldmlvdXNseSwgYSBVbmljb2RlRGVjb2RlRXJyb3Igd291bGQgYmUgcmFpc2VkIHdpdGggbm8gd2F5IHRvIHRyZWF0CiAgICAgICAgICAgIHRoZSBkYXRhIGFzIGJ5dGVzIG9yIHRyeSBhbm90aGVyIGNvZGVjLgoKMjAxNC0wNS0xODogdmthbGluaW4KCSAgICBCdWcgIzE3NSAtIFJlc3RvcmUgJWV4dGVuZCB0byB3b3JrIGZvciB1bm5hbWVkIG5lc3RlZCBzdHJ1Y3R1cmVzIGJ5IHVzaW5nIGEgQwogICAgICAgICAgICBzeW1ib2wgY29tcHJpc2luZyB0aGUgb3V0ZXIgc3RydWN0dXJlIG5hbWUgYW5kIHVubmFtZWQgdmFyaWFibGUgaW5zdGFuY2UgbmFtZS4KCjIwMTQtMDUtMTU6IGt3d2V0dGUKCSAgICBBZGQgIzE2NiAtICdtYWtlIGNoZWNrJyBub3cgd29ya3Mgb3V0IG9mIHNvdXJjZS4gVGhpcyByZXF1aXJlZCB0aGUgZXhhbXBsZXMgdG8gYnVpbGQKICAgICAgICAgICAgb3V0IG9mIHNvdXJjZS4gVGhlIG1haW4gbGFuZ3VhZ2VzIGhhdmUgYmVlbiB0ZXN0ZWQgLSBDIywgR28sIEd1aWxlLCBKYXZhLCBKYXZhc2NyaXB0LAogICAgICAgICAgICBMdWEsIE9jdGF2ZSwgUGVybCwgUEhQLCBQeXRob24sIFJ1YnkgYW5kIFRjbC4KCjIwMTQtMDUtMDE6IE9saXZlciBCdWNodGFsYQoJICAgIEphdmFzY3JpcHQgc3VwcG9ydCBhZGRlZCwgc2VlIEphdmFzY3JpcHQgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTQtMDUtMDE6IG9sbHkKCSAgICBbUEhQXSBUaGUgZ2VuZXJhdGVkIF9faXNzZXQoKSBtZXRob2Qgbm93IHJldHVybnMgdHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnRpZXMuCgoyMDE0LTA0LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtHb10gRml4IGdvIC4vY29uZmlndXJlIHBhcnNpbmcgb2YgZ2NjZ28gLS12ZXJzaW9uLCBhbmQKICAgICAgICAgICAgZ29ydW50aW1lLnN3ZyB0eXBvIGluIF9fR05VQ19QQVRDSExFVkVMX18gKFNGIEJ1ZyAjMTI5OCkKCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgRml4IHtweXRob258cGVybDV8cnVieXx0Y2x9L2phdmEgZXhhbXBsZXMKCiAgICAgICAgICAgIEluIExpYi9nY2ovY25pLmksIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbmV3ZXIgZ2NqIHZlcnNpb25zOgoKICAgICAgICAgICAgLSByZW1vdmUgSnZBbGxvY09iamVjdCgpIHdoaWNoIGdjaiBubyBsb25nZXIgZGVmaW5lcywgZnJvbSBnY2ogQ2hhbmdlbG9nOgogICAgICAgICAgICAgIDIwMDQtMDQtMTYgIEJyeWNlIE1jS2lubGF5ICA8bWNraW5sYXlAcmVkaGF0LmNvbT4KICAgICAgICAgICAgICAgICogZ2NqL2NuaS5oIChKdkFsbG9jT2JqZWN0KTogUmVtb3ZlIHRoZXNlIG9ic29sZXRlLAogICAgICAgICAgICAgICAgdW5kb2N1bWVudGVkIENOSSBjYWxscy4KCiAgICAgICAgICAgIC0gY2hhbmdlIEp2Q3JlYXRlSmF2YVZNKCkgYXJndW1lbnQgZnJvbSB2b2lkKiB0byBKdlZNSW5pdEFyZ3MqLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNS0wMi0yMyAgVGhvbWFzIEZpdHpzaW1tb25zICA8Zml0enNpbUByZWRoYXQuY29tPgogICAgICAgICAgICAgIFBSIGxpYmdjai8xNjkyMwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIChKdkNyZWF0ZUphdmFWTSk6IERlY2xhcmUgdm1fYXJncyBhcyBKdlZNSW5pdEFyZ3MqIHJhdGhlciB0aGFuIHZvaWQqLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgU0YgQnVnICMxMzY2IC0gUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgb2Ygc3RydG9pbWF4IGFuZCBzdHJ0b3VtYXggaW4gaW50dHlwZXMuaQoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEVudW1zIHdoaWNoIGhhdmUgYmVlbiBpZ25vcmVkIHZpYSAlaWdub3JlIGFuZCBhcmUgc3Vic2VxdWVudGx5CiAgICAgICAgICAgIHVzZWQgYXJlIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkuIFR5cGUgd3JhcHBlciBjbGFzc2VzIGFyZSBub3cgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBhIHdyYXBwZXIgb2YgYW4gZW1wdHkgZW51bS4gUHJldmlvdXNseSBpbiBKYXZhIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIHdhcyBnZW5lcmF0ZWQgYW5kIGluIEMjIGFuIGludCB3YXMgdXNlZC4KCjIwMTQtMDQtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGluIDMuMC4wIHdoZXJlIGxlZ2FsIGNvZGUgZm9sbG93aW5nIGFuIG9wZXJhdG9yPDwgZGVmaW5pdGlvbiBtaWdodAogICAgICAgICAgICBnaXZlIGEgc3ludGF4IGVycm9yLiBTRiBCdWcgIzEzNjUuCgoyMDE0LTA0LTAzOiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwoJICAgIHdpdGggYSBaVFMtZW5hYmxlZCBidWlsZCBvZiBQSFAuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyB0aGUgWlRTIGNvbnRleHQgd2UgYWxyZWFkeSBoYXZlIHRvIGF2b2lkIG5lZWRpbmcgdG8KCSAgICBjYWxsIFRTUk1MU19GRVRDSCwgd2hpY2ggaXMgcmVsYXRpdmVseSBleHBlbnNpdmUuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyBaVFMgY29udGV4dCB0aHJvdWdoIHRvIHRfb3V0cHV0X2hlbHBlcigpIHNvIGl0IHdvcmtzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4gIFJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZSBpbgoJICAgIGdpdGh1YiBQUiMxNTUuCgoyMDE0LTAzLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDIyBEIEdvXSBGaXhlcyBmb3IgQyBlbnVtcyB1c2VkIGluIGFuIEFQSSBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0KICAgICAgICAgICAgaGFzIG5vdCBiZWVuIHBhcnNlZC4gRm9yIEQsIHRoaXMgZml4ZXMgYSBzZWdmYXVsdCBpbiBTV0lHLiBUaGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIG5vdyBwcm9kdWNlIGNvZGUgdGhhdCBjb21waWxlcywgYWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0gaXMgbmVlZGVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIHVzZSB0aGUgZW51bSBwcm9wZXJseSBmcm9tIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgoyMDE0LTAzLTIzOiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gRml4IGZvciB1c2FnZSBvZiBzbnByaW50ZiBpbiBMdWEgcnVudGltZSB3aGljaCBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IGhhdmUuCgpWZXJzaW9uIDMuMC4wICgxNiBNYXIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGluaXRpYWxseSBkZXZlbG9wZWQgYXMgQysrMHggc3VwcG9ydCBieSBNYXRldnogSmVrb3ZlYyBhcyBhIEdvb2dsZSBTdW1tZXIgb2YgQ29kZQogICAgICAgICAgICBwcm9qZWN0IGhhcyBiZWVuIGZ1cnRoZXIgZXh0ZW5kZWQuIFRoZSBDKysxMSBzdXBwb3J0IGlzIGNvbXByZWhlbnNpdmUsIGJ1dCBieSBubyBtZWFucyBjb21wbGV0ZQogICAgICAgICAgICBvciB3aXRob3V0IGxpbWl0YXRpb25zLiBGdWxsIGRldGFpbHMgZm9yIGVhY2ggbmV3IGZlYXR1cmUgaW4gQysrMTEgaXMgY292ZXJlZCBpbiB0aGUKICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIHdoaWNoIGlzIGluY2x1ZGVkIGluIFNXSUcgYW5kIGFsc28gYXZhaWxhYmxlCiAgICAgICAgICAgIG9ubGluZSBhdCBodHRwOi8vd3d3LnN3aWcub3JnL0RvYzMuMC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxNC0wMy0xNDogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIE51bWVyb3VzIEx1YSBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIDEuICVuc3BhY2Ugc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gTmFtZXNwYWNlcyBhcmUgbWFwcGVkIHRvIHRhYmxlcyBpbiB0aGUgbW9kdWxlLCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICAgICAgIG5hbWUgYXMgdGhlIEMrKyBuYW1lc3BhY2UuCiAgICAgICAgICAgIDIuIEluaGVyaXRhbmNlIGlzIG5vdyBoYW5kbGVkIGRpZmZlcmVudGx5LiBFYWNoIGNsYXNzIG1ldGF0YWJsZSBrZWVwcyBhIGxpc3Qgb2YgY2xhc3MgYmFzZXMgaW5zdGVhZAogICAgICAgICAgICAgICBvZiBtZXJnaW5nIGFsbCBtZW1iZXJzIG9mIGFsbCBiYXNlcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICAzLiBUaGUgbmV3IG1ldGF0YWJsZXMgcmVzdWx0IGluIGRpZmZlcmVuY2VzIGluIGFjY2Vzc2luZyBjbGFzcyBtZW1iZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgc3RydWN0IFRlc3QgewogICAgICAgICAgICAgICAgICAgICBlbnVtIHsgVEVTVDEgPSAxMCwgVEVTVDIgPSAyMCB9OwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IElDT05TVCA9IDEyOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIE5vdyB0aGlzIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuSUNPTlNUKQogICAgICAgICAgICAgICAgIFRoZSBvbGQgd2F5IHdhczoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9JQ09OU1QpCgogICAgICAgICAgICA0LiBUaGUgc3BlY2lhbCBjbGFzcyBtZXRhdGFibGUgbWVtYmVyICIuY29uc3RydWN0b3IiIHdhcyByZW1vdmVkLiBOb3cgU1dJRyBnZW5lcmF0ZXMgdGhlIHByb3h5CiAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ5IGl0c2VsZiBhbmQgYXNzaWducyBpdCBkaXJlY3RseSB0byB0aGUgY2xhc3MgdGFibGUgIl9fY2FsbCIgbWV0aG9kLgogICAgICAgICAgICA1LiBlTHVhIHNob3VsZCBhbHNvIG5vdyBzdXBwb3J0IGluaGVyaXRhbmNlLgogICAgICAgICAgICA2LiAnY29uc3QnIHN1YnRhYmxlIGluIGVMdWEgaXMgY29uc2lkZXJlZCBkZXByZWNhdGVkLgoKICAgICAgICAgICAgQ2hhbmdlcyBpbiBiZWhhdmlvdXI6CiAgICAgICAgICAgIGEuIFlvdSBjYW4gbm8gbG9uZ2VyIGFzc2lnbiB0byBub24tZXhpc3RpbmcgY2xhc3MgbWVtYmVycyBpbiBjbGFzc2VzIHdpdGhvdXQgYSBfX3NldGl0ZW1fXyBtZXRob2QuCiAgICAgICAgICAgICAgIEl0IHdpbGwgY2F1c2UgYSBMdWEgZXJyb3IuCiAgICAgICAgICAgIGIuIFlvdSBjYW4gbm8gbG9uZ2VyIGl0ZXJhdGUgb3ZlciBhIG1vZHVsZSB0YWJsZSBhbmQgY29weSBldmVyeXRoaW5nIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCiAgICAgICAgICAgICAgIEFjdHVhbGx5LCB0aGlzIHdhcyBuZXZlciB0aGUgY2FzZSwgYnV0IGl0IGlzIG5vdyBleHBsaWNpdGx5IHByb2hpYml0ZWQuCiAgICAgICAgICAgIGMuIE5vdyBjaGFuZ2luZyBhIGJhc2UgY2xhc3Mgd2lsbCBpbW1lZGlhdGVseSBhZmZlY3QgYWxsIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgZC4gVGhlcmUgbWlnaHQgYmUgc29tZSBpc3N1ZXMgd2l0aCBpbmhlcml0YW5jZS4gQWx0aG91Z2ggdGhlIGJhc2VzIGl0ZXJhdGlvbiBzY2hlbWUgaXMgdGhlIHNhbWUKICAgICAgICAgICAgICAgYXMgd2FzIHVzZWQgZm9yIG1lcmdpbmcgYmFzZSBjbGFzc2VzIGludG8gZGVyaXZlZCBvbmUsIHNvbWUgdW5rbm93biBpc3N1ZXMgbWF5IGFyaXNlLgoKICAgICAgICAgICAgVGhlIG9sZCBtZXRhdGFibGUgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSB1c2luZyB0aGUgLW5vLW9sZC1tZXRhdGFibGUtYmluZGluZ3Mgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ2hhbmdlIGluIGRlZmF1bHQgYmVoYXZpb3VyIHdyYXBwaW5nIEMrKyBib29sLiBPbmx5IGEgUHl0aG9uIFRydWUgb3IgRmFsc2UKICAgICAgICAgICAgd2lsbCBub3cgd29yayBmb3IgQysrIGJvb2wgcGFyYW1ldGVycy4gVGhpcyBmaXhlcyBvdmVybG9hZGluZyBib29sIHdpdGggb3RoZXIgdHlwZXMuCiAgICAgICAgICAgIFB5dGhvbiAyLjMgbWluaW11bSBpcyBub3cgcmVxdWlyZWQgZm9yIHdyYXBwaW5nIGJvb2wuCgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGJvb2wgdmFsdWUpIHsgcmV0dXJuICJib29sIjsgfQogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoaW50IHZhbHVlKSB7IHJldHVybiAiaW50IjsgfQoKICAgICAgICAgICAgUHJldmlvdXMgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKEZhbHNlKQogICAgICAgICAgICAgICdpbnQnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoVHJ1ZSkKICAgICAgICAgICAgICAnaW50JwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKDApCiAgICAgICAgICAgICAgJ2ludCcKCiAgICAgICAgICAgIE5vdyB3ZSBnZXQgdGhlIGV4cGVjdGVkIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChGYWxzZSkKICAgICAgICAgICAgICAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZCgwKQogICAgICAgICAgICAgICdpbnQnCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgaXMgd2hlbiB3cmFwcGluZyBib29sIGluIG5vbi1vdmVybG9hZGVkIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogYm9vbGZ1bmN0aW9uKGJvb2wgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsgfQoKICAgICAgICAgICAgVGhlIHByZXZpb3VzIGJlaGF2aW91ciB3YXMgdmVyeSBQeXRob25pYzoKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCIiKQogICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCJoaSIpCiAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigxMi4zNCkKICAgICAgICAgICAgICAndHJ1ZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDApCiAgICAgICAgICAgICAgJ2ZhbHNlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMSkKICAgICAgICAgICAgICAndHJ1ZScKCiAgICAgICAgICAgIE5vdyB0aGUgbmV3IGJlaGF2aW91ciBtb3JlIGFsb25nIHRoZSBsaW5lcyBvZiBDKysgZHVlIHRvIHN0cmljdGVyIHR5cGUgY2hlY2tpbmcuIFRoZQogICAgICAgICAgICBhYm92ZSBjYWxscyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGFuZCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY29udmVydGVkIGludG8gYSBib29sIGFzCiAgICAgICAgICAgIGZvbGxvd3M6CiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgICAgICAgICAgVHlwZUVycm9yOiBpbiBtZXRob2QgJ2Jvb2xmdW5jdGlvbicsIGFyZ3VtZW50IDEgb2YgdHlwZSAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKGJvb2woMCkpCiAgICAgICAgICAgICAgJ2ZhbHNlJwoKICAgICAgICAgICAgVGhlIG9sZCBiZWhhdmlvdXIgY2FuIGJlIHJlc3VycmVjdGVkIGJ5IHBhc3NpbmcgdGhlIC1EU1dJR19QWVRIT05fTEVHQUNZX0JPT0wgY29tbWFuZCBsaW5lCiAgICAgICAgICAgIHBhcmFtZXRlciB3aGVuIGV4ZWN1dGluZyBTV0lHLiBUeXBlbWFwcyBjYW4gb2YgY291cnNlIGJlIHdyaXR0ZW4gdG8gY3VzdG9taXNlIHRoZSBiZWhhdmlvdXIKICAgICAgICAgICAgZm9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTA2OiB3c2Z1bHRvbgoJICAgIEZpeCBTRiBCdWcgIzEzNjMgLSBQcm9ibGVtIHdpdGggbWV0aG9kIG92ZXJsb2FkaW5nIHdoZW4gc29tZSBtZXRob2RzIGFyZSBhZGRlZCBieSAlZXh0ZW5kCiAgICAgICAgICAgIGFuZCBvdGhlcnMgYXJlIHJlYWwgbWV0aG9kcyBhbmQgdXNpbmcgdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHdpdGggc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIFRoaXMgaXMgbm90aWNlYWJsZSBhcyBhIHJlZ3Jlc3Npb24gc2luY2UgMi4wLjEyIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICBoYW5kbGluZyBmb3Igc29tZSBsYW5ndWFnZXMgd2hlbiB0aGUgc21hcnQgcG9pbnRlciB3cmFwcyBzdGQ6Om1hcCBhbmQgb3RoZXIgU1RMIGNvbnRhaW5lcnMuCgoyMDE0LTAzLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIFBhdGNoICMzNDYgZnJvbSBKZW5zIEtydWVnZXIuIENvcnJlY3QgZXhjZXB0aW9uIHRocm93biBhdHRlbXB0aW5nIHRvCiAgICAgICAgICAgIGFjY2VzcyBhIG5vbi1leGlzdGVudCBDL0MrKyBnbG9iYWwgdmFyaWFibGUgb24gdGhlICdjdmFyJyBvYmplY3QuIFRoZSBleGNlcHRpb24gdGhyb3duCiAgICAgICAgICAgIHVzZWQgdG8gYmUgYSBOYW1lRXJyb3IuIEhvd2V2ZXIsIGFzIHRoaXMgYWNjZXNzIGlzIHZpYSBhIHByaW1hcnksIGFuIEF0dHJpYnV0ZUVycm9yCiAgICAgICAgICAgIGlzIG1vcmUgY29ycmVjdCBhbmQgc28gdGhlIGV4Y2VwdGlvbiB0aHJvd24gbm93IGlzIGFuIEF0dHJpYnV0ZUVycm9yLiBSZWZlcmVuY2U6CiAgICAgICAgICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNhdHRyaWJ1dGUtcmVmZXJlbmNlcwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wMTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBQYXRjaCAjMTQzIEZpeCB0eXBlIHNob3duIHdoZW4gdXNpbmcgdHlwZSgpIHRvIGluY2x1ZGUgdGhlIG1vZHVsZSBhbmQgcGFja2FnZQogICAgICAgICAgICBuYW1lIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDE0LTAzLTAxOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIHBhdGNoICMzNDcgRml4IG1pc3NpbmcgYXJndW1lbnQgY291bnQgY2hlY2tpbmcgd2l0aCAtbW9kZXJuLgogICAgICAgICAgICBGaXhlcyByZWdyZXNzaW9uIGludHJvZHVjZWQgd2hlbiBidWlsdGluIGNoYW5nZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFNXSUctMi4wLjMuCgoyMDE0LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIHN1cHByZXNzaW9uIHVzaW5nICV3YXJuZmlsdGVyIGZvciBQSFAgcmVzZXJ2ZWQgY2xhc3MgbmFtZXMuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW0x1YV0gQWRkIGtleXdvcmQgd2FybmluZ3MgZm9yIEx1YSBrZXl3b3JkcyBhbmQgQmFzaWMgRnVuY3Rpb25zLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIC1XYWxsa3cgbm93IGluY2x1ZGVzIGtleXdvcmRzIGZvciBhbGwgbGFuZ3VhZ2VzIHdpdGgga2V5d29yZAoJICAgIHdhcm5pbmdzIChwcmV2aW91c2x5IEdvIGFuZCBSIHdlcmUgbWlzc2luZykuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0cyBvZiBQSFAga2V5d29yZHMgd2l0aCBuZXcgb25lcyBmcm9tIFBIUCA1LjQKCSAgICBhbmQgbmV3ZXIgKGFuZCBzb21lIG1pc3Npbmcgb25lcyBmcm9tIDUuMykuICBSZXNlcnZlZCBQSFAgY29uc3RhbnRzCgkgICAgbmFtZXMgYXJlIG5vdyBjaGVja2VkIGFnYWluc3QgZW51bSB2YWx1ZXMgYW5kIGNvbnN0YW50cywgaW5zdGVhZAoJICAgIG9mIGFnYWluc3QgZnVuY3Rpb24gYW5kIG1ldGhvZCBuYW1lcy4gIEJ1aWx0LWluIFBIUCBmdW5jdGlvbiBuYW1lcwoJICAgIG5vIGxvbmdlciBtYXRjaCBtZXRob2RzIGFkZGVkIGJ5ICVleHRlbmQuICBGdW5jdGlvbnMgYW5kIG1ldGhvZHMKCSAgICBuYW1lZCAnX19zbGVlcCcsICdfX3dha2V1cCcsICdub3QnLCAncGFyZW50Jywgb3IgJ3ZpcnR1YWwnIGFyZSBubwoJICAgIGxvbmdlciBuZWVkbGVzc2x5IHJlbmFtZWQuCgoyMDE0LTAyLTE1OiB3c2Z1bHRvbgoJICAgIEZpeCB0aGUgJSRpc21lbWJlciAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gYWxzbyBhcHBseSB0byBtZW1iZXJzIGFkZGVkIHZpYSAlZXh0ZW5kLgoKICAgICAgICAgICAgQWRkICUkaXNleHRlbmRtZW1iZXIgZm9yICVyZW5hbWUgb2YgbWVtYmVycyBhZGRlZCB2aWEgJWV4dGVuZC4gVGhpcyBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIG5vcm1hbCBjbGFzcy9zdHJ1Y3QgbWVtYmVycyBhbmQgJWV4dGVuZCBtZW1iZXJzLiBGb3IgZXhhbXBsZQogICAgICAgICAgICAnJSRpc21lbWJlciwgJSRub3QgJSRpc2V4dGVuZG1lbWJlcicgd2lsbCBub3cgaWRlbnRpZnkganVzdCBjbGFzcy9zdHJ1Y3QgbWVtYmVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMTY6IGhmYWxjaWMKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzEzNyAtIGZpeCBjcmFzaGVzL2V4Y2VwdGlvbnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiAzLjMKCjIwMTQtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgc3VwcG9ydCBmb3IgdGhlIGNkYXRhIGxpYnJhcnkuCgoyMDE0LTAyLTA4OiB2a2FsaW5pbgogICAgICAgICAgICBOZXN0ZWQgY2xhc3Mgc3VwcG9ydCBhZGRlZC4gVGhpcyBwcmltYXJpbHkgYWxsb3dzIFNXSUcgdG8gcHJvcGVybHkgcGFyc2UgbmVzdGVkCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIGtlZXAgdGhlIG5lc3RlZCBjbGFzcyBpbmZvcm1hdGlvbiBpbiB0aGUgcGFyc2UgdHJlZS4gSmF2YSBhbmQgQyMKICAgICAgICAgICAgaGF2ZSB1dGlsaXNlZCB0aGlzIGluZm9ybWF0aW9uIHdyYXBwaW5nIHRoZSBDKysgbmVzdGVkIGNsYXNzZXMgYXMgSmF2YS9DIwogICAgICAgICAgICBuZXN0ZWQgY2xhc3Nlcy4gVGhlIHJlbWFpbmluZyB0YXJnZXQgbGFuZ3VhZ2VzIGlnbm9yZSBuZXN0ZWQgY2xhc3NlcyBhcyBpbgogICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucy4gSGVscCBpcyBuZWVkZWQgYnkgdXNlcnMgb2YgdGhlc2UgcmVtYWluaW5nIGxhbmd1YWdlcyB0bwogICAgICAgICAgICBkZXNpZ24gaG93IEMrKyBuZXN0ZWQgY2xhc3NlcyBjYW4gYmUgYmVzdCB3cmFwcGVkLiBQbGVhc2UgdGFsayB0byB1cyBvbiB0aGUKICAgICAgICAgICAgc3dpZy1kZXZlbCBtYWlsaW5nIGxpc3QgaWYgeW91IHRoaW5rIHlvdSBjYW4gaGVscC4KCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoZXJlIHdhcyBsaW1pdGVkIG5lc3RlZCBjbGFzcyBzdXBwb3J0LiBOZXN0ZWQgY2xhc3NlcyB3ZXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgb3BhcXVlIHBvaW50ZXJzLiBIb3dldmVyLCB0aGUgIm5lc3RlZHdvcmthcm91bmQiIGZlYXR1cmUgcHJvdmlkZWQgYSB3YXkgdG8KICAgICAgICAgICAgd3JhcCBhIG5lc3RlZCBjbGFzcyBhcyBpZiBpdCB3YXMgYSBnbG9iYWwgY2xhc3MuIFRoaXMgZmVhdHVyZSBubyBsb25nZXIgZXhpc3RzCiAgICAgICAgICAgIGFuZCBpcyByZXBsYWNlZCBieSB0aGUgbmV3ICJmbGF0bmVzdGVkIiBmZWF0dXJlLiBUaGlzIGVmZmVjdGl2ZWx5IGRvZXMgdGhlIHNhbWUKICAgICAgICAgICAgdGhpbmcgd2l0aCBsZXNzIG1hbnVhbCBjb2RlIHRvIGJlIHdyaXR0ZW4uIFBsZWFzZSBzZWUgdGhlICdOZXN0ZWQgY2xhc3NlcycKICAgICAgICAgICAgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbiBTV0lHUGx1cy5odG1sIGlmIHlvdSB3ZXJlIHByZXZpb3VzbHkgdXNpbmcgdGhpcwogICAgICAgICAgICBmZWF0dXJlLgoKICAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIHRoZSBjb250ZW50cyBvZiBuZXN0ZWQgY2xhc3NlcyB3aGVyZSBwcmV2aW91c2x5IGl0IGRpZCBub3QuIFlvdQogICAgICAgICAgICBtYXkgZmluZCB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gbWFrZSBhZGp1c3RtZW50cyB0byB5b3VyIGludGVyZmFjZSBmaWxlIGFzCiAgICAgICAgICAgIGVmZmVjdGl2ZWx5IGV4dHJhIGNvZGUgaXMgYmVpbmcgd3JhcHBlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMDY6IGdqYW5zc2VucwogICAgICAgICAgICBbR3VpbGVdIFBhdGNoICMxMzMuIE1ha2Ugc2NtIHRvIHN0cmluZyBjb252ZXJzaW9uIHdvcmsgd2l0aCBub24tYXNjaWkgc3RyaW5ncy4KICAgICAgICAgICAgR3VpbGUgMiBoYXMgYSBjb21wbGV0ZWx5IHJld3JpdHRlbiBzdHJpbmcgaW1wbGVtZW50YXRpb24uIFNXSUcgbWFkZSBzb21lIGFzc3VtcHRpb25zCiAgICAgICAgICAgIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZCBhcyB0byB0aGUgaW50ZXJuYWxzIG9mIGd1aWxlJ3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgoKMjAxNC0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgbmV3IHN3aWd0eXBlX2lub3V0LmkgbGlicmFyeSBjb250YWluaW5nIFNXSUdUWVBFIComIE9VVFBVVCB0eXBlbWFwcy4KCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2Ugd3JhcHBpbmc6CgogICAgICAgICAgICAgIHZvaWQgZihYWFggKiYgeCkgeyB4ID0gbmV3IFhYWCgxMTEpOyB9CgogICAgICAgICAgICB3b3VsZCBiZToKCiAgICAgICAgICAgICAgWFhYIHggPSBudWxsOwogICAgICAgICAgICAgIGYob3V0IHgpOwogICAgICAgICAgICAgIC8vIHVzZSB4CiAgICAgICAgICAgICAgeC5EaXNwb3NlKCk7IC8vIG1hbnVhbGx5IGNsZWFyIG1lbW9yeSBvciBvdGhlcndpc2UgbGVhdmUgb3V0IGFuZCBsZWF2ZSBpdCB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKCjIwMTQtMDEtMjE6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgJWdvX2ltcG9ydCBkaXJlY3RpdmUuCgoyMDE0LTAxLTIxOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIHN1cHBvcnQgZm9yIEdvIDEuMywgbm90IHlldCByZWxlYXNlZC4KCjIwMTQtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGV4Y2VwdGlvbnMgKFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uKSBub3cgZGVyaXZlIGZyb20gc3RkOjpleGNlcHRpb24KICAgICAgICAgICAgYW5kIGhlbmNlIHByb3ZpZGUgdGhlIHdoYXQoKSBtZXRob2QuIEluIFB5dGhvbiBhbmQgUnVieSwgdGhpcyByZXBsYWNlcyB0aGUgbm93CiAgICAgICAgICAgIGRlcHJlY2F0ZWQgRGlyZWN0b3JFeGNlcHRpb246OmdldE1lc3NhZ2UoKSBtZXRob2QuCgoyMDE0LTAxLTE0OiBkaW9yY2V0eQogICAgICAgICAgICBQYXRjaCAjMTEyIC0gRml4IHN5bWJvbCByZXNvbHV0aW9uIGludm9sdmluZyBzY29wZXMgdGhhdCBoYXZlIG11bHRpcGxlIGxldmVscwogICAgICAgICAgICBvZiB0eXBlZGVmcyAtIGZpeGVzIHNvbWUgdGVtcGxhdGUgcmVzb2x1dGlvbnMgYXMgd2VsbCBhcyBzb21lIHR5cGVtYXAgc2VhcmNoZXMuCgoyMDE0LTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYW5kIGRvY3VtZW50IHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgb3ZlcnJpZGUgYmVoYXZpb3VyIC0gdGhlIG5hdHVyYWx2YXIKICAgICAgICAgICAgZmVhdHVyZSBhdHRhY2hlZCB0byBhIHZhcmlhYmxlIG5hbWUgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmF0dXJhbHZhcgogICAgICAgICAgICBmZWF0dXJlIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSdzIHR5cGUuIFRoZSBvdmVycmlkaW5nIHdhcyBub3Qgd29ya2luZwogICAgICAgICAgICB3aGVuIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIG9uIHRoZSB2YXJpYWJsZSdzIG5hbWUuCgogICAgICAgICAgICBGaXggc28gdGhhdCBhbnkgdXNlIG9mIHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgd2lsbCBvdmVycmlkZSB0aGUgZ2xvYmFsCiAgICAgICAgICAgIHNldHRpbmcuIFByZXZpb3VzbHkgd2hlbiBzZXQgZ2xvYmFsbHkgYnkgLW5hdHVyYWx2YXIgb3IgJW1vZHVsZShuYXR1cmFsdmFyPTEpLAogICAgICAgICAgICB1c2Ugb2YgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBob25vdXJlZC4KCjIwMTQtMDEtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXggYnVnIHRoYXQgYnJva2UgdXNpbmcgZGlyZWN0b3JzIGZyb20gYSB0aHJlYWQgbm90CgkgICAgY3JlYXRlZCBieSBHby4KCjIwMTMtMTItMjQ6IHB0b211bGlrCiAgICAgICAgICAgIFtQeXRob25dIFNGIEJ1ZyAjMTI5NwoKICAgICAgICAgICAgUmVzb2x2ZSBzZXZlcmFsIGlzc3VlcyByZWxhdGVkIHRvIHB5dGhvbiBpbXBvcnRzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgaXQncyBub3cgcG9zc2libGUgdG8gaW1wb3J0IG1vZHVsZXMgaGF2aW5nIHRoZSBzYW1lIG1vZHVsZQogICAgICAgICAgICBuYW1lcywgYnV0IGJlbG9uZ2luZyBpbiBkaWZmZXJlbnQgcGFja2FnZXMuCiAgICAgICAgICAgIAogICAgICAgICAgICBGcm9tIHRoZSB1c2VyJ3Mgdmlld3BvaW50LCB0aGlzIHBhdGNoIGdpdmVzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbnRyb2wgb24KICAgICAgICAgICAgaW1wb3J0IHN0YXRlbWVudHMgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoZSB1c2VyIG1heSBjaG9vc2UgdG8gdXNlIHJlbGF0aXZlCiAgICAgICAgICAgIG9yIGFic29sdXRlIGltcG9ydHMuCiAgICAgICAgICAgIAogICAgICAgICAgICBTb21lIGRldGFpbHM6CiAgICAgICAgICAgICAgLSB3ZSAoc3RpbGwpIGdlbmVyYXRlIGltcG9ydCBzdGF0ZW1lbnRzIGluIHRoZSBmb3JtICdpbXBvcnQgYS5iLmMnIHdoaWNoCiAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBhYnNvbHV0ZSBpbXBvcnRzIGluIHB5dGhvbjMgYW5kICh0aGUgb25seSBhdmFpbGFibGUpCiAgICAgICAgICAgICAgICBhbWJpZ3VvdXMgb25lIGluIHB5dGhvbjIuCiAgICAgICAgICAgICAgLSBhZGRlZCAtcmVsYXRpdmVpbXBvcnQgb3B0aW9uIHRvIHVzZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgc3ludGF4CiAgICAgICAgICAgICAgICAocHl0aG9uMyksCgogICAgICAgICAgICBUaGUgIlB5dGhvbiBQYWNrYWdlcyIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBkaXNjdXNzZXMgaG93IHRvIHdvcmsKICAgICAgICAgICAgd2l0aCBpbXBvcnRpbmcgcGFja2FnZXMgaW5jbHVkaW5nIHRoZSBuZXcgLXJlbGF0aXZlaW1wb3J0IGNvbW1hbmQgbGluZSBvcHRpb24uCgoyMDEzLTEyLTIzOiB2YWR6CiAgICAgICAgICAgIFtPY3RhdmUsIFBlcmwsIFB5dGhvbiwgUiwgUnVieSwgVGNsXSBDaGFuZ2UgdGhlIGxlbmd0aCBvZiBzdHJpbmdzIGNyZWF0ZWQgZnJvbSBmaXhlZC1zaXplIGNoYXIKICAgICAgICAgICAgYnVmZmVycyBpbiBDIGNvZGUuCgogICAgICAgICAgICBUaGlzIGlzIGEgcG90ZW50aWFsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJyZWFrOiBhICJjaGFyIGJ1Zls1XSIgY29udGFpbmluZyAiaG9cMGxhIiB3YXMKICAgICAgICAgICAgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDUgYmVmb3JlLCBidXQgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDIgbm93LiBBbHNvLAogICAgICAgICAgICBpdCB3YXMgcG9zc2libGUgdG8gYXNzaWduIGEgKG5vbi1OVUwtdGVybWluYXRlZCkgc3RyaW5nICJoZWxsbyIgdG8gc3VjaCBhIGJ1ZmZlciBiZWZvcmUgYnV0CiAgICAgICAgICAgIG5vdyB0aGlzIGZhaWxzIGFuZCBvbmx5ICJoZWxvIiBjYW4gZml0LgoKICAgICAgICAgICAgQXBwbHkgImNoYXIgRklYU0laRVtBTlldIiB0eXBlbWFwcyB0byBleHBsaWNpdGx5IGNob29zZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTItMjM6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0b3JzLgoKMjAxMy0xMi0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IHJlcXVpcmUgdGhhdCBHbyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmUgc2V0CgkgICAgd2hlbiBydW5uaW5nIGV4YW1wbGVzIG9yIHRlc3RzdWl0ZSB3aGVuIHVzaW5nIEdvIDEgb3IKCSAgICBsYXRlci4KCjIwMTMtMTItMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBSZW1vdmUgLWxvbmdzaXplIG9wdGlvbiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCgkgICAgaWdub3JlIGl0IGlmIHNlZW4pLgoKMjAxMy0xMi0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtZ28tcGtncGF0aCBvcHRpb24uCgoyMDEzLTEyLTE2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gVXBkYXRlIGZvciBHbyAxLjIgcmVsZWFzZS4gIEFkZCBzdXBwb3J0IGZvciBsaW5raW5nCgkgICAgU1dJRyBjb2RlIGRpcmVjdGx5IGludG8gZXhlY3V0YWJsZSwgcmF0aGVyIHRoYW4gdXNpbmcgYQoJICAgIHNoYXJlZCBsaWJyYXJ5LgoKMjAxMy0xMi0xMzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBTV0lHIHNvdXJjZSBmaWxlIG5hbWUgYXMgY29tbWVudHMgaW4gZ2VuZXJhdGVkCgkgICAgZmlsZXMuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IEdvIGRvY3VtZW50YXRpb24gdG9vbHMuCgoyMDEzLTEyLTEyOiBqbGV2ZXF1ZQoJICAgIFtMdWFdIEZpeCB0eXBvICh3Y2hhciBpbnN0ZWFkIG9mIHdjaGFyX3QpIHdoaWNoIG1hZGUgd2NoYXIuaQoJICAgIGZvciBMdWEgdXNlbGVzcy4KCjIwMTMtMTItMTI6IHZtaWtsb3MKCSAgICBbUEhQXSBQSFAncyBwZWN1bGlhciBjYWxsLXRpbWUgcGFzcy1ieS1yZWZlcmVuY2UgZmVhdHVyZSB3YXMKCSAgICBkZXByZWNhdGVkIGluIFBIUCA1LjMgYW5kIHJlbW92ZWQgaW4gUEhQIDUuNCwgc28gdXBkYXRlIHRoZSBSRUYKCSAgICB0eXBlbWFwcyBpbiBwaHBwb2ludGVycy5pIHRvIHNwZWNpZnkgcGFzcy1ieS1yZWZlcmVuY2UgaW4gdGhlCgkgICAgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIEV4YW1wbGVzL3BocC9wb2ludGVyIGhhcyBiZWVuIHVwZGF0ZWQKCSAgICBhY2NvcmRpbmdseS4KCjIwMTMtMTItMTI6IG9sbHkKCSAgICBbUEhQXSBUaGUgdXNhZ2Ugb2YgJGlucHV0IGluIFBIUCBkaXJlY3Rvcm91dCB0eXBlbWFwcyBoYXMgYmVlbgoJICAgIGNoYW5nZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGxhbmd1YWdlcy4gIFRoZSB0eXBlbWFwcwoJICAgIHByb3ZpZGVkIGJ5IFNXSUcgaGF2ZSBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHksIGJ1dCBpZiB5b3UKCSAgICBoYXZlIHdyaXR0ZW4geW91ciBvd24gZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHlvdSdsbCBuZWVkIHRvCgkgICAgdXBkYXRlICRpbnB1dCB0byAmJGlucHV0IChvciBtYWtlIGVxdWl2YWxlbnQgY2hhbmdlcykuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTI3OiB2YWR6CiAgICAgICAgICAgIFtDIywgSmF2YSwgUHl0aG9uXSBBZGQgc3RkX2F1dG9fcHRyLmkgZGVmaW5pbmcgdHlwZW1hcHMgZm9yIHJldHVybmluZyBzdGQ6OmF1dG9fcHRyPD4uCgoyMDEzLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICM3OSBmcm9tIEJyYW50IEt5c2VyCiAgICAgICAgICAgICAgLSBSZW1vdmUgdXNpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgQyMgY29kZSBhbmQgZnVsbHkgcXVhbGlmeSB0aGUgdXNlIG9mIGFsbCAuTkVUCiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgdHlwZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgcG90ZW50aWFsIG5hbWUgY29sbGlzaW9ucyBmcm9tIGlucHV0IGZpbGVzIGRlZmluaW5nCiAgICAgICAgICAgICAgICB0eXBlcywgbmFtZXNwYWNlLCBldGMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIC5ORVQgZnJhbWV3b3JrIG1lbWJlcnMuCiAgICAgICAgICAgICAgLSBHbG9iYWxseSBxdWFsaWZ5IHRoZSB1c2Ugb2YgLk5FVCBmcmFtZXdvcmsgdHlwZXMgaW4gdGhlIFN5c3RlbSBuYW1lc3BhY2UKICAgICAgICAgICAgICAtIFJlbW92ZSAuTkVUIDEuMSBzdXBwb3J0LCAuTkVUIDIgaXMgdGhlIG1pbmltdW0gZm9yIHRoZSBDIyBtb2R1bGUKCiAgICAgICAgICAgIFRoaXMgaXMgYSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnJlYWsgaWYgY29kZSBoYXMgYmVlbiBhZGRlZCByZWx5aW5nIG9uIHRoZXNlIHVzaW5nCiAgICAgICAgICAgIHN0YXRlbWVudHMgdGhhdCB1c2VkIHRvIGJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdXNpbmcgU3lzdGVtOwogICAgICAgICAgICAgIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCiAgICAgICAgICAgIFRoZSBxdWljayBmaXggdG8gYWRkIHRoZXNlIGJhY2sgaW4gaXMgdG8gYWRkIHRoZSAtRFNXSUcyX0NTSEFSUCBjb21tYW5kIGxpbmUgb3B0aW9uIHdoZW4KICAgICAgICAgICAgZXhlY3V0aW5nIFNXSUcuIFNlZSBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHNvbWUgY29ybmVyIGNhc2VzIGZvciB0aGUgJHBhY2thZ2VwYXRoLyRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgoKMjAxMy0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICM5MSBmcm9tIE1hcnZpbiBHcmVlbmJlcmcgLSBBZGQgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUgZm9yIGltcHJvdmVkCiAgICAgICAgICAgIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBkaXJlY3RvciBtZXRob2RzIGZvciBKYXZhLgoKMjAxMy0xMC0xNTogdmFkegogICAgICAgICAgICBBbGxvdyB1c2luZyBcbCwgXEwsIFx1LCBcVSBhbmQgXEUgaW4gdGhlIHN1YnN0aXR1dGlvbiBwYXJ0IG9mICUocmVnZXg6L3BhdHRlcm4vc3Vic3QvKQogICAgICAgICAgICBpbnNpZGUgJXJlbmFtZSB0byBjaGFuZ2UgdGhlIGNhc2Ugb2YgdGhlIHRleHQgYmVpbmcgcmVwbGFjZWQuCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgIzk2IC0gc3VwZXJjbGFzcyBub3QgbGlzcGlmeQoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgaW4gQysrMTEgc3VwcG9ydCBmcm9tIHRoZSBnc29jMjAwOS1tYXRldnogYnJhbmNoIHdoZXJlIE1hdGV2eiBKZWtvdmVjIGZpcnN0CiAgICAgICAgICAgIHN0YXJ0ZWQgdGhlIEMrKzB4IGFkZGl0aW9ucy4gRG9jdW1lbnRhdGlvbiBvZiB0aGUgQysrMTEgZmVhdHVyZXMgc3VwcG9ydGVkIGlzIGluIGEKICAgICAgICAgICAgbmV3IENoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24sICJTV0lHIGFuZCBDKysxMSIgaW4gRG9jL01hbnVhbC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxMy0xMC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuYXR1cmFsdmFyIG5vdCBoYXZpbmcgYW55IGFmZmVjdCBvbiB0ZW1wbGF0ZWQgY2xhc3NlcyBpbnN0YW50aWF0ZWQgd2l0aCBhbgogICAgICAgICAgICBlbnVtIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMy0wOS0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBhIG1lbW9yeSBsZWFrIGZvciB0aGUgamF2YSBjaGFyICoqU1RSSU5HX0FSUkFZIHR5cGVtYXBzLgoKVmVyc2lvbiAyLjAuMTIgKDkgRmViIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wMS0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gRml4IGNvbXBpbGF0aW9uIGVycm9yIGluIFpUUyBtb2RlICg2NCBiaXQgd2luZG93cykgZHVlIHRvIGluY29ycmVjdCBwbGFjZW1lbnQKICAgICAgICAgICAgb2YgVFNSTUxTX0ZFVENIKCkgaW4gU1dJR19QaHBfR2V0TW9kdWxlKCkgYXMgcmVwb3J0ZWQgYnkgTWFyayBEYXdzb24tQnV0dGVyd29ydGguCgoyMDE0LTAxLTEzOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHVwZGF0ZSBzdXBwb3J0IHRvIE9jdGF2ZSB2ZXJzaW9uIDMuOC4wCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCBubyBsb25nZXIgZGVmaW5lcyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLCBidXQgMy44LjEKICAgICAgICAgICAgICB3aWxsIGRlZmluZSBPQ1RBVkVfe01BSk9SLE1JTk9SLFBBVENIfV9WRVJTSU9OIGluc3RlYWQ6IHNlZQogICAgICAgICAgICAgICAgaHR0cDovL2hnLnNhdmFubmFoLmdudS5vcmcvaGd3ZWIvb2N0YXZlL3Jldi9iNmI2ZTBkYzcwMGUKICAgICAgICAgICAgICBTbyB3ZSBub3cgdXNlIGEgbmV3IG1hY3JvIFNXSUdfT0NUQVZFX1BSRVJFUShtYWpvcixtaW5vcixwYXRjaCkgdG8KICAgICAgICAgICAgICBlbmFibGUgZmVhdHVyZXMgcmVxdWlyaW5nIE9jdGF2ZSB2ZXJzaW9uIG1ham9yLm1pbm9yLnBhdGNoIG9yIGxhdGVyLgoKICAgICAgICAgICAgICBGb3IgT2N0YXZlIHZlcnNpb25zIHByaW9yIHRvIDMuOC4xLCB3ZSByZWNvbnN0cnVjdCB2YWx1ZXMgZm9yCiAgICAgICAgICAgICAgT0NUQVZFX3tNQUpPUixNSU5PUixQQVRDSH1fVkVSU0lPTiBiYXNlZCBvbiBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLAogICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIE9jdGF2ZSdzIENoYW5nZUxvZ3MuIEFuIGFkZGl0aW9uYWwgaGFjayBpcyBuZWVkZWQgdG8KICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIE9jdGF2ZSA8PSAzLjIueCBhbmQgMy44LjAsIG5laXRoZXIgb2Ygd2hpY2ggZGVmaW5lCiAgICAgICAgICAgICAgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUi4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIGRlcHJlY2F0ZXMgc3ltYm9sX3RhYmxlOjp2YXJyZWYoKSwgc28gcmVtb3ZlIGl0cyB1c2UKICAgICAgICAgICAgICBmb3IgdGhpcyBhbmQgZnV0dXJlIHZlcnNpb25zIG9mIE9jdGF2ZS4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIHJlbW92ZXMgb2N0YXZlX3ZhbHVlOjppc19yZWFsX25kX2FycmF5KCksIHVzZWQgaW4KICAgICAgICAgICAgICBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKCkuIEl0cyB1c2UgaXMgbm90IHJlcXVpcmVkIGhlcmUsIHNvIHJlbW92ZSBpdC4KCiAgICAgICAgICAgIC0gUmV0ZXN0ZWQgYWdhaW5zdCBPY3RhdmUgdmVyc2lvbnMgMy4wLjUsIDMuMi40LCAzLjQuMywgMy42LjQsIGFuZCAzLjguMC4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBPY3RhdmUgZG9jdW1lbnRhdGlvbiB3aXRoIHRlc3RlZCBPY3RhdmUgdmVyc2lvbnMsIGFuZCBhZGRlZCBhCiAgICAgICAgICAgICAgd2FybmluZyBhZ2FpbnN0IHVzaW5nIHZlcnNpb25zIDw9IDMueC54LCB3aGljaCBhcmUgbm8gbG9uZ2VyIHRlc3RlZC4KCjIwMTMtMTItMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgZm9yIG5ldyB2ZXJzaW9ucyBvZiBlcmFzZSBhbmQgaW5zZXJ0IGluIHRoZSBTVEwgY29udGFpbmVycy4KCiAgICAgICAgICAgIFRoZSBlcmFzZSBhbmQgaW5zZXJ0IG1ldGhvZHMgaW4gdGhlIGNvbnRhaW5lcnMgdXNlIGNvbnN0X2l0ZXJhdG9yIGluc3RlYWQKICAgICAgICAgICAgb2YgaXRlcmF0b3IgaW4gQysrMTEuICBUaGVyZSBhcmUgdGltZXMgd2hlbiB0aGUgbWV0aG9kcyB3cmFwcGVkIG11c3QgbWF0Y2gKICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZXhhY3RseS4gU3BlY2lmaWNhbGx5IHdoZW4gZnVsbCB0eXBlIGluZm9ybWF0aW9uIGZvcgogICAgICAgICAgICB0ZW1wbGF0ZSB0eXBlcyBpcyBtaXNzaW5nIG9yIFNXSUcgZmFpbHMgdG8gbG9vayB1cCB0aGUgdHlwZSBjb3JyZWN0bHksCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3ZlY3Rvci5pPgogICAgICAgICAgICAgIHR5cGVkZWYgZmxvYXQgUmVhbDsKICAgICAgICAgICAgICAldGVtcGxhdGUoUmVhbFZlY3Rvcikgc3RkOjp2ZWN0b3I8UmVhbD47CgogICAgICAgICAgICBTV0lHIGRvZXMgbm90IGZpbmQgc3RkOjp2ZWN0b3I8UmVhbD46Oml0ZXJhdG9yIGJlY2F1c2UgJXRlbXBsYXRlIHVzaW5nCiAgICAgICAgICAgIHR5cGVkZWZzIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFuZCBzbyBTV0lHIGRvZXNuJ3Qga25vdyBpZiB0aGUgdHlwZSBpcwogICAgICAgICAgICBjb3B5YWJsZSBhbmQgc28gdXNlcyBTd2lnVmFsdWVXcmFwcGVyPGl0ZXJhdG9yPiB3aGljaCBkb2VzCiAgICAgICAgICAgIG5vdCBzdXBwb3J0IGNvbnZlcnNpb24gdG8gYW5vdGhlciB0eXBlIChjb25zdF9pdGVyYXRvcikuIFRoaXMgcmVzdWx0ZWQKICAgICAgICAgICAgaW4gY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gdXNpbmcgdGhlIEMrKzExIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lcnMuCgogICAgICAgICAgICBDbG9zZXMgIzczCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IFNGICMxMzQwIC0gVmlzdWFsIFN0dWRpbyBjb21waWxlIGVycm9yIGluIEMrKyB3cmFwcGVycyBkdWUgdG8gI2luY2x1ZGUgPGV4Y2VwdGlvbj4KICAgICAgICAgICAgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YgIzEzNDUgLSBNaXNzaW5nICNpbmNsdWRlIDxzdGRkZWYuaD4gZm9yIG9mZnNldG9mIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjOTIgLSBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzIGZvciBTV0lHX0x1YV9hZGRfbmFtZXNwYWNlX2RldGFpbHMoKQogICAgICAgICAgICBhbmQgU1dJR19MdWFfbmFtZXNwYWNlX3JlZ2lzdGVyKCkuCgpWZXJzaW9uIDIuMC4xMSAoMTUgU2VwIDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggYXR0ZW1wdCB0byBmcmVlIGEgbm9uLWhlYXAgb2JqZWN0IGluIE9VVFBVVCB0eXBlbWFwcyBmb3I6CiAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIGNoYXIgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBjaGFyKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqT1VUUFVUCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQdWxsIEdpdCBwYXRjaCAjNjIuCiAgICAgICAgICAgICAgMSkgU3RhdGljIG1lbWJlcnMgYW5kIHN0YXRpYyBmdW5jdGlvbnMgaW5zaWRlIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBhcwogICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUuQ2xhc3NOYW1lLkZ1bmN0aW9uTmFtZSAoTWVtYmVyTmFtZSByZXNwZWN0aXZlbHkpLiBPbGQgd2F5IHN1Y2ggYXMKICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lLkNsYXNzTmFtZV9GdW5jdGlvbk5hbWUgc3RpbGwgd29ya3MuCiAgICAgICAgICAgICAgMikgU2FtZSBnb2VzIGZvciBlbnVtcyBpbnNpZGUgY2xhc3NlczogTW9kdWxlTmFtZS5DbGFzc05hbWUuRW51bVZhbHVlMSBldGMuCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbVVRMXSBJbmZpbml0eSBpcyBub3cgYnkgZGVmYXVsdCBhbiBhY2NlcHRhYmxlIHZhbHVlIGZvciB0eXBlICdmbG9hdCcuIFRoaXMgZml4IG1ha2VzCiAgICAgICAgICAgIHRoZSBoYW5kbGluZyBvZiB0eXBlICdmbG9hdCcgYW5kICdkb3VibGUnIHRoZSBzYW1lLiBUaGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlCiAgICAgICAgICAgIEM5OSBpc2Zpbml0ZSgpIG1hY3JvLCBvciBvdGhlcndpc2Ugc29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgZXF1aXZhbGVudHMsIHRvIGJlIGF2YWlsYWJsZS4KCiAgICAgICAgICAgIFVzZXJzIHJlcXVpcmluZyB0aGUgb2xkIGJlaGF2aW91ciBvZiBub3QgYWNjZXB0aW5nIGluZmluaXR5LCBjYW4gZGVmaW5lIGEgJ2NoZWNrJyB0eXBlbWFwCiAgICAgICAgICAgIHdoZXJldmVyIGEgZmxvYXQgaXMgdXNlZCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2ssZnJhZ21lbnQ9IjxmbG9hdC5oPiIpIGZsb2F0LCBjb25zdCBmbG9hdCAmICV7CiAgICAgICAgICAgICAgICBpZiAoJDEgPCAtRkxUX01BWCB8fCAkMSA+IEZMVF9NQVgpIHsKICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwgIk92ZXJmbG93IGluIHR5cGUgZmxvYXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUHVsbCBHaXQgcGF0Y2ggIzgxOiBJbmNsdWRlIEx1YSBlcnJvciBsb2N1cyBpbiBTV0lHIGVycm9yIG1lc3NhZ2VzLiAgCiAgICAgICAgICAgIFRoaXMgaXMgc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gTHVhIGVycm9yIG1lc3NhZ2VzLCBhbmQgbWFrZXMgaXQgbXVjaAogICAgICAgICAgICBlYXNpZXIgdG8gZmluZCBidWdzLgoKMjAxMy0wOC0yOTogd3NmdWx0b24KICAgICAgICAgICAgUHVsbCBHaXQgcGF0Y2ggIzc1OiBIYW5kbGUgVVRGLTggZmlsZXMgd2l0aCBCT00gYXQgYmVnaW5uaW5nIG9mIGZpbGUuIFdhcyBnaXZpbmcgYW4KICAgICAgICAgICAgJ0lsbGVnYWwgdG9rZW4nIHN5bnRheCBlcnJvci4KCjIwMTMtMDgtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHVsbCBHaXQgcGF0Y2ggIzc3OiBBbGxvdyBleHBvcnRpbmcgc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTMtMDgtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICVpbXBsaWNpdGNvbnYgaXMgaW1wcm92ZWQgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLiBMaWtlIGluIEMrKywgdGhlIG1ldGhvZHMKICAgICAgICAgICAgd2l0aCB0aGUgYWN0dWFsIHR5cGVzIGFyZSBjb25zaWRlcmVkIGJlZm9yZSB0cnlpbmcgaW1wbGljaXQgY29udmVyc2lvbnMuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICBBKGludCBpKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIENDQyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCB4eChpbnQgaSkgeyByZXR1cm4gMTE7IH0KICAgICAgICAgICAgICAgICAgaW50IHh4KGNvbnN0IEEmIGkpIHsgcmV0dXJuIDIyOyB9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHl0aG9uIGNvZGU6CgogICAgICAgICAgICAgIENDQygpLnh4KC0xKQoKICAgICAgICAgICAgd2lsbCBub3cgcmV0dXJuIDExIGluc3RlYWQgb2YgMjIgLSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBub3QgZG9uZS4KCjIwMTMtMDgtMjM6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggY2xhbmcrKyB3YXJuaW5nIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUuCgoyMDEzLTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAlaW1wbGljaXRjb252IHdpbGwgbm93IGFjY2VwdCBOb25lIHdoZXJlIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHRha2VzIGEgQy9DKysgcG9pbnRlci4KICAgICAgICAgICAgUHJvYmxlbSBoaWdobGlnaHRlZCBieSBCbyBQZW5nLiBDbG9zZXMgU0YgcGF0Y2ggIzIzMC4KCjIwMTMtMDgtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNGIFBhdGNoICMzMjYgZnJvbSBLcmlzIFRoaWVsZW1hbnMgLSBSZW1vdmUgU3dpZ1B5T2JqZWN0X3ByaW50IGFuZCBTd2lnUHlPYmplY3Rfc3RyIGFuZAogICAgICAgICAgICBtYWtlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciB1c2UgdGhlIGRlZmF1bHQgcHl0aG9uIGltcGxlbWVudGF0aW9ucywgd2hpY2ggd2lsbCBmYWxsIGJhY2sgdG8gcmVwcgogICAgICAgICAgICAoZm9yIC1idWlsdGluIG9wdGlvbikuCgogICAgICAgICAgICBBZHZhbnRhZ2VzOgogICAgICAgICAgICAtIGl0IGF2b2lkcyB0aGUgc3dpZyB1c2VyIGhhdmluZyB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gZ2V0IHByaW50IHRvIHdvcmsgYXMgZXhwZWN0ZWQgd2hlbgogICAgICAgICAgICAgIHJlZGVmaW5pbmcgcmVwci9zdHIgc2xvdHMuCiAgICAgICAgICAgIC0gdHlwaW5nIHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgb24gdGhlIHB5dGhvbiBwcm9tcHQgbm93IHByaW50cyB0aGUgcmVzdWx0IG9mIGEgKHBvc3NpYmx5IHJlZGVmaW5lZCkKICAgICAgICAgICAgICByZXByLCB3aXRob3V0IHRoZSBzd2lnIHVzZXIgaGF2aW5nIHRvIGRvIGFueSBleHRyYSB3b3JrLgogICAgICAgICAgICAtIHdoZW4gcmVkZWZpbmluZyByZXByLCB0aGUgc3dpZyB1c2VyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byByZWRlZmluZSBzdHIgYXMgaXQgd2lsbCBjYWxsIHRoZQogICAgICAgICAgICAgIHJlZGVmaW5lZCByZXByCiAgICAgICAgICAgIC0gdGhlIGJlaGF2aW91ciBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdpdGhvdXQgdGhlIC1idWlsdGluIG9wdGlvbiB3aGlsZSByZXF1aXJpbmcgbm8gZXh0cmEgd29yawogICAgICAgICAgICAgIGJ5IHRoZSB1c2VyIChhc2lkZSBmcm9tIGFkZGluZyB0aGUgJWZlYXR1cmUoInB5dGhvbjpzbG90Li4uKSBzdGF0ZW1lbnRzIG9mIGNvdXJzZSkKCiAgICAgICAgICAgIERpc2FkdmFudGFnZToKICAgICAgICAgICAgLSBkZWZhdWx0IHN0cigpIHdpbGwgZ2l2ZSBkaWZmZXJlbnQgKGJ1dCBjbGVhcmVyPykgb3V0cHV0IG9uIHN3aWdnZWQgY2xhc3NlcwoKMjAxMy0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieV0gRml4ICM2NCAjNjU6IE1pc3NpbmcgY29kZSBpbiBzdGQ6Om11bHRpbWFwIHdyYXBwZXJzLiBQcmV2aW91c2x5IGFuIGluc3RhbnRpYXRpb24KICAgICAgICAgICAgb2YgYSBzdGQ6Om1hcCB3YXMgZXJyb25lb3VzbHkgcmVxdWlyZWQgaW4gYWRkaXRpb24gdG8gYW4gaW5zdGFudGlhdGlvbiBvZiBzdGQ6Om11bHRpbWFwIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBwcmV2ZW50IGNvbXBpbGF0aW9uIGVycm9ycyBmb3IgdGhlIHdyYXBwZXJzIG9mIGEgc3RkOjptdWx0aW1hcC4KCjIwMTMtMDctMTQ6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBDaGFuZ2UgdHlwZXMgZmlsZSB0byBhbGxvdyBmb3IgU0VYUCByZXR1cm4gdmFsdWVzCgoyMDEzLTA3LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgJXB5dGhvbmJlZ2luIGRpcmVjdGl2ZSB3aGljaCB3b3JrcyBsaWtlICVweXRob25jb2RlLCBleGNlcHQgdGhlIHNwZWNpZmllZCBjb2RlIGlzCiAgICAgICAgICAgIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdlbmVyYXRlZCAucHkgZmlsZS4gVGhpcyBpcyBwcmltYXJpbHkgbmVlZGVkIGZvciBpbXBvcnRpbmcgZnJvbQogICAgICAgICAgICBfX2Z1dHVyZV9fIHN0YXRlbWVudHMgcmVxdWlyZWQgdG8gYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlcHl0aG9uYmVnaW4gJXsKICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAgICAgICAgICAgICAgcHJpbnQoIkxvYWRpbmciLCAiV2hpenoiLCAiQmFuZyIsIHNlcD0nIC4uLiAnKQogICAgICAgICAgICAgICV9CgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBTRiBwYXRjaCAjMzQwIC0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXggaW4gU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIKICAgICAgICAgICAgd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBBcHBseSBTRiBwYXRjaCAjMzQxIC0gZml4IGEgY29uc3RfY2FzdCBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIGEgPDo6IGRpZ3JhcGggd2hlbiB1c2luZyB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSBpbiBhIHRlbXBsYXRlIHR5cGUuCgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU0YgcGF0Y2ggIzM0MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggc29tZSBkaXJlY3RvciBjbGFzc2VzIGNyYXNoaW5nIG9uCiAgICAgICAgICAgIG9iamVjdCBkZWxldGlvbiB3aGVuIHVzaW5nIC1idWlsdGluLiBGaXhlcyBTRiBidWcgIzEzMDEuCgoyMDEzLTA2LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU1dJR19QWVRIT05fSU5URVJQUkVURVJfTk9fREVCVUcgbWFjcm8gd2hpY2ggY2FuIGJlIGRlZmluZWQgdG8gdXNlIHRoZSBSZWxlYXNlIHZlcnNpb24KICAgICAgICAgICAgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpbiBEZWJ1ZyBidWlsZHMgb2YgdGhlIHdyYXBwZXJzLiBUaGUgVmlzdWFsIFN0dWRpbyAuZHNwIGV4YW1wbGUKICAgICAgICAgICAgZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHVzZSB0aGlzIHNvIHRoYXQgRGVidWcgYnVpbGRzIHdpbGwgbm93IHdvcmsgd2l0aG91dCBoYXZpbmcKICAgICAgICAgICAgdG8gaW5zdGFsbCBvciBidWlsZCBhIERlYnVnIGJ1aWxkIG9mIHRoZSBpbnRlcnByZXRlci4KCjIwMTMtMDYtMDc6IHdzZnVsdG9uCgkgICAgW1J1YnldIEdpdCBpc3N1ZSAjNTIuIEZpeCByZWdyZXNzaW9uIHdpdGggbWlzc2luZyByYl9jb21wbGV4X25ldyBmdW5jdGlvbiBmb3IgUnVieQogICAgICAgICAgICB2ZXJzaW9ucyBwcmlvciB0byAxLjkgdXNpbmcgc3RkOjpjb21wbGV4IHdyYXBwZXJzIGlmIGp1c3QgdXNpbmcgc3RkOjpjb21wbGV4IGFzIGFuIG91dHB1dCB0eXBlLgogICAgICAgICAgICBBbHNvIGZpeCB0aGUgQ29tcGxleCBoZWxwZXIgZnVuY3Rpb25zIGV4dGVybmFsIHZpc2liaWxpdHkgKHRvIHN0YXRpYyBieSBkZWZhdWx0KS4KCjIwMTMtMDYtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggU1dJR19aVFNfQ29udmVydFJlc291cmNlUHRyKCkgbm90IHRvIGRlcmVmZXJlbmNlIE5VTEwKCSAgICBpZiB0aGUgdHlwZSBsb29rdXAgZmFpbHMuCgpWZXJzaW9uIDIuMC4xMCAoMjcgTWF5IDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gMyBpbmNvbnNpc3RlbmN5IHdoZW4gbmVnYXRpdmUgbnVtYmVycyBhcmUgcGFzc2VkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGV4cGVjdHMgYW4gdW5zaWduZWQgQyB0eXBlLiBBbiBPdmVyRmxvdyBlcnJvciBpcwogICAgICAgICAgICBub3cgY29uc2lzdGVudGx5IHRocm93biBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yLgoKMjAxMy0wNS0yNTogQXJ0ZW0gU2VyZWJyaXlza2l5CiAgICAgICAgICAgIFNWTiBQYXRjaCB0aWNrZXQgIzMzOCAtIGZpeGVzIHRvICVhdHRyaWJ1dGUgbWFjcm9zIGZvciB0ZW1wbGF0ZSB1c2FnZQogICAgICAgICAgICB3aXRoICVhcmcuCgoyMDEzLTA1LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY2NhY2hlLXN3aWcgaW50ZXJuYWwgZXJyb3IgYnVnIGR1ZSB0byBwcmVtYXR1cmUgZmlsZSBjbGVhbnVwLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnIDEzMTkgd2hpY2ggc2hvd3MgdXAgYXMgYSBmYWlsdXJlIGluIHRoZSBjY2FjaGUgdGVzdHMgb24KICAgICAgICAgICAgRGViaWFuIDY0IGJpdCBXaGVlenksIHBvc3NpYmx5IGJlY2F1c2UgRU5BQkxFX1pMSUIgaXMgZGVmaW5lZC4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb3JuZXIgY2FzZSB3aGljaCB3aWxsIGJlIGhpdCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcwogICAgICAgICAgICBpbiB0aGUgY2FjaGUgaXMgc2V0IHRvIGJlIHF1aXRlIGxvdyAoLUYgb3B0aW9uKSwgcmVzdWx0aW5nIGluIGEgY2FjaGUgbWlzcy4KCjIwMTMtMDUtMDk6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gT2N0YXZlIG1vZHVsZSBsb2FkaW5nOgogICAgICAgICAgICAtIGZpeCBhIG1lbW9yeSBsZWFrIGluIHNldHRpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICAtIGluc3RhbGwgZnVuY3Rpb25zIG9ubHkgb25jZSwgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRzCgoyMDEzLTA0LTI4OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBVcGRhdGVzIGluIGd1aWxlIG1vZHVsZToKICAgICAgICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgZ3VpbGUgMi4wCiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBndWlsZSAxLjYKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgd3JhcHBlcnMgdXNpbmcgZ3VpbGUncyBnaCBpbnRlcmZhY2UuCiAgICAgICAgICAgICAgQWxsIGdlbmVyYXRlZCB3cmFwcGVycyB3aWxsIHVzZSB0aGUgc2NtIGludGVyZmFjZSBmcm9tIG5vdyBvbi4KICAgICAgICAgICAgLSBEZXByZWNhdGUgLWdoIGFuZCAtc2NtIG9wdGlvbnMuIFRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgICAgICAgQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIHdoZW4gdGhlc2Ugb3B0aW9ucyBhcmUgc3RpbGwgdXNlZC4KICAgICAgICAgICAgLSBGaXggYWxsIHRlc3RzIGFuZCBleGFtcGxlcyB0byBoYXZlIGEgc3VjY2Vzc2Z1bCB0cmF2aXMgdGVzdAoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgUGF0Y2ggIzM2IGZyb20gSmVzdXMgTG9wZXogdG8gYWRkIHN1cHBvcnQgZm9yICRkZXNjcmlwdG9yKCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNybyBleHBhbnNpb24gCiAgICAgICAgICAgIGluIGZyYWdtZW50cy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZURlc2NyaXB0b3IiLCAiaGVhZGVyIikKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIiRkZXNjcmlwdG9yKE5hbWUpIjsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgd2hpY2ggd2lsbCBnZW5lcmF0ZSBpbnRvIHRoZSB3cmFwcGVyIGlmIHRoZSBmcmFnbWVudCBpcyB1c2VkOgoKICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiU1dJR1RZUEVfTmFtZSI7CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICM0MjggLSBTeW50YXggZXJyb3Igd2hlbiBwcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiBlbnVtIGxpc3RzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICAgICAgICAgZVplcm8gPSAwCiAgICAgICAgICAgICAgI2RlZmluZSBPTkUgMQogICAgICAgICAgICAgIH0gRUZvbzsKCiAgICAgICAgICAgIFRoZSBtYWNyb3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCgoyMDEzLTA0LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgcGF0Y2ggIzM0IGZyb20gQnJhbnRLeXNlciB0byBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTA0LTE1OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBidWdzIGluIG91dHB1dCBvZiBjbGVhbnVwIGNvZGUuCiAgICAgICAgICAgIC0gQ2xlYW51cCBjb2RlIGlzIG5vdyB3cml0dGVuIGFsc28gYWZ0ZXIgdGhlICJmYWlsOiIgbGFiZWwsIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGlmCiAgICAgICAgICAgICAgYSBTV0lHX2V4Y2VwdGlvbiBpcyByYWlzZWQgYnkgdGhlIHdyYXBwaW5nIGZ1bmN0aW9uLCBjb25zaXN0ZW50IHdpdGggb3RoZXIgbW9kdWxlcy4KICAgICAgICAgICAgLSBPY3RhdmUgbW9kdWxlIG5vdyBhbHNvIHJlY29nbmlzZXMgdGhlICIkY2xlYW51cCIgc3BlY2lhbCB2YXJpYWJsZSwgaWYgbmVlZGVkLgoKMjAxMy0wNC0wODoga3d3ZXR0ZQogICAgICAgICAgICBBZGQgLU1QIG9wdGlvbiB0byBTV0lHIGZvciBnZW5lcmF0aW5nIHBob255IHRhcmdldHMgZm9yIGFsbCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIC0gUHJldmVudHMgbWFrZSBmcm9tIGNvbXBsYWluaW5nIGlmIGhlYWRlciBmaWxlcyBoYXZlIGJlZW4gZGVsZXRlZCBiZWZvcmUKICAgICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQuCiAgICAgICAgICAgIC0gTW9kZWxsZWQgb24gc2ltaWxhciBvcHRpb24gaW4gR0NDLgoKMjAxMy0wNC0wOTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY2hhciogYW5kIGNoYXJbXSB3aGljaAoJICAgIGZpeGVzIGRpcmVjdG9yX3N0cmluZyB0ZXN0Y2FzZSBmYWlsdXJlLgoKMjAxMy0wNC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNGIEJ1ZyAjMTI5MiAtIFJ1bnRpbWUgZml4ZXMgZm9yIFByb2MgY2hhbmdlcyBpbiBydWJ5LTEuOSB3aGVuIHVzaW5nIFNUTAogICAgICAgICAgICB3cmFwcGVycyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByZWRpY2F0ZSwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKE1hcCkgc3RkOjptYXA8c3dpZzo6TEFOR1VBR0VfT0JKLCBzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkJpbmFyeVByZWRpY2F0ZTw+ID47CgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMTU5IC0gQ29ycmVjdGx5IGNoZWNrIHJiX3Jlc3BvbmRfdG8gY2FsbCByZXR1cm4gdmFsdWVzIHRvIGZpeCBzb21lCiAgICAgICAgICAgIGZ1cnRoZXIgMS45IHByb2JsZW1zIHdpdGggZnVuY3RvcnMgYW5kIHVzZSBvZiBDb21wbGV4IHdyYXBwZXJzLgoKMjAxMy0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFJ1bnRpbWUgZml4ZXMgZm9yIHN0ZDo6Y29tcGxleCB3cmFwcGVycyBmb3IgcnVieS0xLjkgLSBuZXcgbmF0aXZlIFJ1YnkgY29tcGxleCBudW1iZXJzIGFyZSB1c2VkLgoKMjAxMy0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvZiBnZW5lcmljIFJ1YnkgdHlwZXMsIEdDX1ZBTFVFIG9yIExBTkdVQUdFX09CSkVDVCwKICAgICAgICAgICAgb24gZXhpdCBvZiB0aGUgUnVieSBpbnRlcnByZXRlci4gTW9yZSBmcmVxdWVudGx5IG9ic2VydmVkIGluIHJ1YnktMS45LgoKMjAxMy0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBkZWxldGVfaWYgKHJlamVjdCEpIGZvciB0aGUgU1RMIGNvbnRhaW5lciB3cmFwcGVycyB3aGljaCBwcmV2aW91c2x5IHdvdWxkCiAgICAgICAgICAgIHNvbWV0aW1lcyBzZWcgZmF1bHQgb3Igbm90IHdvcmsuCgoyMDEzLTAzLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSB1bmRlZmluZWQgYmVoYXZpb3VyIGRlbGV0aW5nIHNsaWNlcyBpbiB0aGUgU1RMIGNvbnRhaW5lcnMuCgoyMDEzLTAzLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIERdIEZpeCBzZWcgZmF1bHQgaW4gU1dJRyB1c2luZyBkaXJlY3RvcnMgd2hlbiBjbGFzcyBhbmQgdmlydHVhbCBtZXRob2QgbmFtZXMgYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIGV4Y2VwdCBiZWluZyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyB3aGVuIHRoZSAlbnNwYWNlIGZlYXR1cmUgaXMgbm90IGJlaW5nIHVzZWQuCgoyMDEzLTAyLTE5OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCBidWcgaW4gU1dJRydzIGhhbmRsaW5nIG9mIHF1YWxpZmllZCAoZS5nLiBjb25zdCkgdmFyaWFibGVzIG9mIGFycmF5IHR5cGUuIEdpdmVuIHRoZSB0eXBlZGVmCiAgICAgICAgICAgICAgYSg3KS5xKHZvbGF0aWxlKS5kb3VibGUgbXlhcnJheSAgICAgLy8gdHlwZWRlZiB2b2xhdGlsZSBkb3VibGVbN10gbXlhcnJheTsKICAgICAgICAgICAgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5teWFycmF5ICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBteWFycmF5CiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICBhKDcpLnEoY29uc3Qgdm9sYXRpbGUpLmRvdWJsZSAgICAgICAvLyBjb25zdCB2b2xhdGlsZSBkb3VibGVbN10KICAgICAgICAgICAgUHJldmlvdXNseSwgU3dpZ1R5cGVfdHlwZWRlZl9yZXNvbHZlKCkgcHJvZHVjZXMgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5hKDcpLnEodm9sYXRpbGUpLmRvdWJsZSAgICAvLyBub24tc2Vuc2ljYWwgdHlwZQogICAgICAgICAgICB3aGljaCB3b3VsZCBuZXZlciBtYXRjaCAldHlwZW1hcCBkZWNsYXJhdGlvbnMsIHdob3NlIHR5cGVzIHdlcmUgcGFyc2VkIGNvcnJlY3RseS4KICAgICAgICAgICAgQWRkIHR5cGVtYXBfYXJyYXlfcXVhbGlmaWVycy5pIHRvIHRoZSB0ZXN0IHN1aXRlIHdoaWNoIGNoZWNrcyBmb3IgdGhlIGNvcnJlY3QgYmVoYXZpb3VyLgoKMjAxMy0wMi0xODogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBhcyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBuYW1lcyBpbiAlZXh0ZW5kLiBUaGUgcmVhbAogICAgICAgICAgICBjbGFzcy9zdHJ1Y3QgbmFtZSBzaG91bGQgYmUgdXNlZC4KCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBpbnQgaXZhcjsKICAgICAgICAgICAgICB9IEVTdHJ1Y3Q7CgogICAgICAgICAgICAgICVleHRlbmQgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBFU3RydWN0KCkgLy8gaWxsZWdhbCBuYW1lLCBzaG91bGQgYmUgdGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEVTdHJ1Y3QgKnMgPSBuZXcgRVN0cnVjdCgpOwogICAgICAgICAgICAgICAgICBzLT5pdmFyID0gaXZhcjA7CiAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfkVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB+dGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkc2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3Igbm93IHRoZXNlIHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBleHRlbmRfY29uc3RydWN0b3JfZGVzdHJ1Y3Rvci5pOjEwNzogV2FybmluZyA1MjI6IFVzZSBvZiBhbiBpbGxlZ2FsIGNvbnN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTExOiBXYXJuaW5nIDUyMzogVXNlIG9mIGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lICdFU3RydWN0JyBpbgogICAgICAgICAgICAgICVleHRlbmQgaXMgZGVwcmVjYXRlZCwgdGhlIGRlc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgoKICAgICAgICAgICAgVGhlc2UgJWV4dGVuZCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3RvciBuYW1lcyB3ZXJlIHZhbGlkIHVwIHRvIHN3aWctMi4wLjQsIGhvd2V2ZXIgc3dpZy0yLjAuNSBpZ25vcmVkCiAgICAgICAgICAgIHRoZW0gYWx0b2dldGhlciBmb3IgQyBjb2RlIGFzIHJlcG9ydGVkIGluIFNGIGJ1ZyAjMTMwNi4gVGhlIG9sZCBiZWhhdmlvdXIgb2YgdXNpbmcgdGhlbSBoYXMgYmVlbgogICAgICAgICAgICByZXN0b3JlZCBmb3Igbm93LCBidXQgaXMgb2ZmaWNpYWxseSBkZXByZWNhdGVkLiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFub255bW91c2x5IGRlZmluZWQgdHlwZWRlZgogICAgICAgICAgICBjbGFzc2VzL3N0cnVjdHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3Qgey4uLn0gWDsKCjIwMTMtMDItMTc6IGt3d2V0dGUKICAgICAgICAgICAgV2hlbiBnZW5lcmF0aW5nIGZ1bmN0aW9ucyBwcm92aWRlZCBieSAlZXh0ZW5kLCB1c2UgIih2b2lkKSIgZm9yIG5vLWFyZ3VtZW50IGZ1bmN0aW9ucwogICAgICAgICAgICBpbnN0ZWFkIG9mICIoKSIuIFRoaXMgcHJldmVudHMgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAiZ2NjIC1Xc3RyaWN0LXByb3RvdHlwZXMiLgoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBNaW5vciBmaXggdG8gYXV0b2RvYyBnZW5lcmF0aW9uOiBnZXQgdGhlIHJpZ2h0IHR5cGUgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0cy4KCjIwMTMtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSB0eXBlZGVmIG5hbWVzIHVzZWQgaW4gJWV4dGVuZCB0aGF0IGFyZSBub3QgdGhlIHJlYWwgY2xhc3Mvc3RydWN0IG5hbWUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBTdHJ1Y3RCTmFtZSB7CiAgICAgICAgICAgICAgICBpbnQgbXlpbnQ7CiAgICAgICAgICAgICAgfSBTdHJ1Y3RCOwoKICAgICAgICAgICAgICAlZXh0ZW5kIFN0cnVjdEIgewogICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgbm93IHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBzd2lnX2V4dGVuZC5pOjE5OiBXYXJuaW5nIDMyNjogRGVwcmVjYXRlZCAlZXh0ZW5kIG5hbWUgdXNlZCAtIHRoZSBzdHJ1Y3QgbmFtZSBTdHJ1Y3RCTmFtZQogICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBTdHJ1Y3RCLgoKICAgICAgICAgICAgVGhpcyBpcyBvbmx5IHBhcnRpYWxseSB3b3JraW5nIGFueXdheSAodGhlICVleHRlbmQgb25seSB3b3JrZWQgaWYgcGxhY2VkIGFmdGVyIHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9uKS4gCgoyMDEzLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgcGF0Y2ggIzIyIC0gRml4IG1pc3NpbmcgcGFja2FnZSBiZWZvcmUgJmJvZHkKCjIwMTMtMDEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBFbnN1cmUgJ2phdmFwYWNrYWdlJyB0eXBlbWFwIGlzIHVzZWQgYXMgaXQgc3RvcHBlZCB3b3JraW5nIGZyb20gdmVyc2lvbiAyLjAuNS4KCjIwMTMtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoIFNGICMzMzQgLSBGaXggZGVmYXVsdCB2YWx1ZSBjb252ZXJzaW9ucyAiVFJVRSItPlRydWUsICJGQUxTRSItPkZhbHNlLgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoIFNGICMzMzUgLSBUcnVseSBpZ25vcmUgY29uc3RydWN0b3JzIGluIGRpcmVjdG9ycyB3aXRoICVpZ25vcmUuCgoyMDEzLTAxLTE4OiBCcmFudCBLeXNlcgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE1IC0gQWxsb3cgdGhlIHVzZSBvZiB0aGUgbnNwYWNlIGZlYXR1cmUgd2l0aG91dCB0aGUgLXBhY2thZ2UgY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICBUaGlzIHdvcmtzIGFzIGxvbmcgYW5kIHRoZSBuZXcgam5pY2xhc3NwYWNrYWdlIHByYWdtYSBpcyB1c2VkIHRvIHBsYWNlIHRoZSBKTkkgaW50ZXJtZWRpYXRlIGNsYXNzCiAgICAgICAgICAgIGludG8gYSBwYWNrYWdlIGFuZCB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgdXNlZCB0byBwbGFjZSBhbGwgZXhwb3NlZCB0eXBlcyBpbnRvIGEgcGFja2FnZS4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBWaXN1YWwgU3R1ZGlvIGV4YW1wbGVzIHRvIHdvcmsgd2hlbiBTV0lHIGlzIHVuemlwcGVkIGludG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyBzcGFjZXMuCgoyMDEzLTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBjc3R5cGUgdHlwZW1hcCBsb29rdXAgZm9yIG1lbWJlciB2YXJpYWJsZXMgc28gdGhhdCBhIGZ1bGx5IHF1YWxpZmllZCB2YXJpYWJsZSBuYW1lCiAgICAgICAgICAgIG1hdGNoZXMuIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgYm9vbCBNVmFyOjptdmFyICJNeUJvb2wiCiAgICAgICAgICAgICAgc3RydWN0IE1WYXIgewogICAgICAgICAgICAgICAgYm9vbCBtdmFyOwogICAgICAgICAgICAgIH07CgoyMDEzLTAxLTExOiBCcmFudCBLeXNlcgoJICAgIFtKYXZhLCBDIywgRF0gU0YgQnVnICMxMjk5IC0gRml4IGdlbmVyYXRlZCBuYW1lcyBmb3Igd2hlbiAlbnNwYWNlIGlzIHVzZWQgb24KICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdHdvIGRpZmZlcmVudCBuYW1lc3BhY2VzLgoKMjAxMy0wMS0xMTogVmxhZGltaXIgS2FsaW5pbgoJICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yIGNzZGlyZWN0b3JpbiAncHJlJywgJ3Bvc3QnIGFuZCAndGVybWluYXRvcicgYXR0cmlidXRlcy4KCjIwMTMtMDEtMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd29yayB3aXRoIGEgWlRTIGJ1aWxkIG9mIFBIUCAoYnJva2VuIGluIDIuMC43KS4KCjIwMTMtMDEtMDc6IG9sbHkKCSAgICBGaXggYmFzaGlzbSBpbiBjb25maWd1cmUsIGludHJvZHVjZWQgaW4gMi4wLjkuCgoyMDEzLTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBQdWxsIHBhdGNoICM0IGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NiAtIEZpeCBpbmNvcnJlY3Qgd2FybmluZyBmb3IgdmlydHVhbCBkZXN0cnVjdG9ycwogICAgICAgICAgICBpbiB0ZW1wbGF0ZXMsIHN1Y2ggYXM6CiAgICAgICAgICAgICBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgQjwgQSA+Ojp+QigpLiBJZ25vcmVkLgoKMjAxMy0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHVsbCBwYXRjaCAjMyBmcm9tIHB0b211bGlrIHRvIGZpeCBTRiBCdWcgIzEyOTUgLSBzdGFuZGFyZCBleGNlcHRpb25zIGFzCiAgICAgICAgICAgIGNsYXNzZXMgdXNpbmcgdGhlIFNXSUdfU1REX0VYQ0VQVElPTlNfQVNfQ0xBU1NFUyBtYWNyby4KCjIwMTMtMDEtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMyIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjgzIC0gZml4IHNtYXJ0IHBvaW50ZXJzIGluIGNvbmp1Y3Rpb24KICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUHVsbCBwYXRjaCAjMSBmcm9tIEJyYW50S3lzZXIgdG8gZml4IFNGIEJ1ZyAjMTI3OCAtIGZpeCBkaXJlY3RvcnMgYW5kIG5zcGFjZSBmZWF0dXJlIHdoZW4KICAgICAgICAgICAgbXVsdGlsZXZlbCBuYW1lc3BhY2VzIGFyZSB1c2VkLgoKVmVyc2lvbiAyLjAuOSAoMTYgRGVjZW1iZXIgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMTItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnYXJiYWdlIGxpbmUgbnVtYmVyIC8gZW1wdHkgZmlsZSBuYW1lIHJlcG9ydGluZyBmb3Igc29tZSBtaXNzaW5nCiAgICAgICAgICAgICd9JyBvciAnKScgZXJyb3IgbWVzc2FnZXMuCgoyMDEyLTEyLTE1OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDQ0LCBDbGFzcyNtZXRob2RzIGFuZCBDbGFzcyNjb25zdGFudHMgcmV0dXJucyBhcnJheSBvZgogICAgICAgICAgICBzeW1ib2xzIGluIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggMzUzMDQzOSBhbmQgZmluYWxseSByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgU1RSMkNTVFIoKSBtYWNybwogICAgICAgICAgICB3aXRoIFN0cmluZ1ZhbHVlUHRyKCkuIFNUUjJDU1RSIHdhcyBkZXByZWNhdGVkIHNpbmNlIHllYXJzIGFuZCBnb3QgcmVtb3ZlZCBpbiBSdWJ5IDEuOQoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbGllZCBwYXRjaGVzICMzNTMwNDQyIGFuZCAzNTMwNDQzIHRvIGFkYXB0IGNvbXBpbGUgYW5kIHJ1bnRpbWUgaW5jbHVkZQogICAgICAgICAgICBwYXRocyB0byBtYXRjaCBSdWJ5IDEuOSsKCjIwMTItMTItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBGaXggIzMxNjE2MTQgLSBTb21lIHN0cmluZyBjb25zdGFudHMgYXJlIGluY29ycmVjdAoKMjAxMi0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzUyOTY5MCAtIEZpeCBpbmNvcnJlY3QgY29uc3RhbnQgbmFtZXMuCgoyMDEyLTEyLTEyOiBkcmpvZQoJICAgIFtSXSBhZGQgZml4IHRvIGZpbmFsaXplciB0aGF0IHdhcyBtaXNzZWQgZWFybGllcgoKMjAxMi0xMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzM1OTA1MjIgLSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBwYXRocyBmb3IgUHl0aG9uIDMgZXZlbiBpZiBhIG1vZHVsZSBpcyBpbiB0aGUKICAgICAgICAgICAgc2FtZSBwYWNrYWdlLgoKMjAxMi0xMi0wODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQnVnICMzNTYzNjQ3IC0gUHlJbnRfRnJvbVNpemVfdCB1bmF2YWlsYWJsZSBwcmlvciB0byBQeXRob24gMi41IGZvciB1bnNpZ25lZCBpbnQgdHlwZXMuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGJ1ZyAjMzU3MTM2MSAtIEMrKyBjb21tZW50IGluIEMgd3JhcHBlcnMuCgoyMDEyLTEyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICMzNTcxMDI5IHdoaWNoIGFkZHMgbWlzc2luZyBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJi4KCjIwMTItMTEtMjg6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gU2ltcGxpZmllZCBtb2R1bGUgbG9hZGluZzogbm93IGp1c3QgdGhlIHN5bnRheAogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGlzIGFjY2VwdGVkLCB3aGljaCBsb2FkcyBmdW5jdGlvbnMgZ2xvYmFsbHkgYnV0IGNvbnN0YW50cyBhbmQgdmFyaWFibGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNjb3BlLgogICAgICAgICAgICBUaGlzIG1ha2UgbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3VyIHJlbGlhYmx5IGNvbnNpc3RlbnQsIGFuZCByZWR1Y2VzIHByb2JsZW1zIHdoZW4gbG9hZGluZyBtb2R1bGVzIHdoaWNoCiAgICAgICAgICAgIGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzIHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbG9hZGVkLgoKMjAxMi0xMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW2NmZmldIEZpeCBqdW5rIG91dHB1dCB3aGVuIHdyYXBwaW5nIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbCBjb25zdGFudHMuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsLCBNb2R1bGEzXSBBZGQgbWlzc2luZyBzdXBwb3J0IGZvciAtb3V0ZGlyLgoKMjAxMi0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZ2ZhdWx0cyB3aGVuIHVzaW5nIGZpbGVuYW1lIHBhdGhzIGdyZWF0ZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLgoKMjAxMi0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW2NjYWNoZS1zd2lnXSBBcHBseSBwYXRjaCAjMzU4NjM5MiBmcm9tIEZyZWRlcmlrIERld2VlcmR0IHRvIGZpeCBzb21lIGVycm9yIGNhc2VzIC0gaW5jb3JyZWN0bHkgdXNpbmcKICAgICAgICAgICAgbWVtb3J5IGFmdGVyIGl0IGhhcyBiZWVuIGRlbGV0ZWQuCgoyMDEyLTExLTA5OiB2emVpdGxpbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggb3ZlcmZsb3cgd2hlbiBwYXNzaW5nIHZhbHVlcyBncmVhdGVyIHRoYW4gTE9OR19NQVggZnJvbSBQeXRob24gMyBmb3IgcGFyYW1ldGVycyB3aXRoIHVuc2lnbmVkIGxvbmcgQyB0eXBlLgoKMjAxMi0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgZmVhdHVyZSBtYXRjaGluZyBpc3N1ZXMgZm9yIGltcGxpY2l0IGRlc3RydWN0b3JzIGFuZCBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGltcGxpY2l0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IGEgZmVhdHVyZSBmb3IgdGhlc2UgaGFkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZAogICAgICAgICAgICBpbiBvcmRlciB0byBtYXRjaC4gTm93IHRoZSBmb2xsb3dpbmcgd2lsbCBhbHNvIG1hdGNoOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgieHl6IikgflhYWCgpOwogICAgICAgICAgICAgIHN0cnVjdCBYWFgge307CgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGdXJ0aGVyIGNvbnNpc3RlbmN5IGluIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cHMgZm9yIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kCiAgICAgICAgICAgIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IG9ubHkgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdhcyBiZWluZwogICAgICAgICAgICB1c2VkLCBub3cgdGhlIHVucXVhbGlmaWVkIG5hbWUgd2lsbCBhbHNvIGJlIHVzZWQuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6Mzg6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCiAgICAgICAgICAgIE5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSBpcyBhbHNvIHVzZWQ6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCB+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCjIwMTItMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHN1YnRsZSBuYW1lZCBvdXRwdXQgdHlwZW1hcCBsb29rdXAgbWlzc2VzLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgdXNlZCBmb3IgdmFyaWFibGVzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IEdsb2IgewogICAgICAgICAgICAgICAgaW50IE15VmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSBzZWFyY2ggcnVsZXMgKGFzIHNob3duIGJ5IC1kZWJ1Zy10bXNlYXJjaCkgZm9yIHRoZSBnZXR0ZXIgd3JhcHBlciB3ZXJlOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgogICAgICAgICAgICBOb3cgdGhlIHNjb3BlIGlzIG5hbWVkIGNvcnJlY3RseToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludAoKMjAxMi0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIHR5cGVtYXAgc2VhcmNoaW5nIHNvIHRoYXQgYSB0eXBlbWFwIHNwZWNpZmllZCB3aXRoIGEgbmFtZSB3aWxsIGJlIGNvcnJlY3RseSBtYXRjaGVkLiBQcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBuYW1lIHdhcyBpZ25vcmVkIGR1cmluZyB0aGUgdHlwZW1hcCBzZWFyY2guIEFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHR5cGVtYXBzOiAKICAgICAgICAgICAgZGlyZWN0b3JvdXQsIGNzZGlyZWN0b3JvdXQsIGNzdHlwZSwgaW10eXBlLCBjdHlwZSwgZGRpcmVjdG9yb3V0LCBkdHlwZSwgZ290eXBlLCBqdHlwZSwgam5pLCBqYXZhZGlyZWN0b3JvdXQuCgoyMDEyLTEwLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNb3N0IG9mIHRoZSBzcGVjaWFsIHZhcmlhYmxlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiAlZXhjZXB0aW9uIGFyZSBub3cgYWxzbyBhdmFpbGFibGUgZm9yIGV4cGFuc2lvbiBpbgogICAgICAgICAgICAlZXh0ZW5kIGJsb2Nrcy4gVGhlc2UgYXJlOiAkbmFtZSAkc3ltbmFtZSAkb3Zlcm5hbWUgJGRlY2wgJGZ1bGxkZWNsICRwYXJlbnRjbGFzc25hbWUgJHBhcmVudGNsYXNzc3ltbmFtZSwgc2VlIGRvY3MKICAgICAgICAgICAgb24gIkNsYXNzIGV4dGVuc2lvbiIgaW4gU1dJR1BsdXMuaHRtbC4gUGF0Y2ggYmFzZWQgb24gc3VibWlzc2lvbiBmcm9tIEtyaXMgVGhpZWxlbWFucy4KCjIwMTItMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9uYWwgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGluICVleGNlcHRpb24gYXJlIGV4cGFuZGVkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgJHBhcmVudGNsYXNzbmFtZSAtIFRoZSBwYXJlbnQgY2xhc3MgbmFtZSAoaWYgYW55KSBmb3IgYSBtZXRob2QuCiAgICAgICAgICAgICAgJHBhcmVudGNsYXNzc3ltbmFtZSAtIFRoZSB0YXJnZXQgbGFuZ3VhZ2UgcGFyZW50IGNsYXNzIG5hbWUgKGlmIGFueSkgZm9yIGEgbWV0aG9kLgoKMjAxMi0xMC0wODogaWFudAoJICAgIFtHb10gR2VuZXJhdGluZyBHbyBjb2RlIG5vdyByZXF1aXJlcyB1c2luZyB0aGUgLWludGdvc2l6ZSBvcHRpb24gdG8KCSAgICBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgJ2ludCcgdHlwZSBpbiBHby4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKCSAgICBzaXplIG9mIHRoZSB0eXBlIGlzIGNoYW5naW5nIGZyb20gR28gMS4wIHRvIEdvIDEuMSBmb3IgeDg2XzY0LiAKCjIwMTItMDktMTQ6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyB3YXJuaW5nIGlmIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEJhc2Uge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgQmFzZTxpbnQ+OwogICAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxpbnQ+IHt9OwoKICAgICAgICAgICAgZ2l2ZXMgdGhlIGZvbGxvd2luZyB3YXJuaW5nIGluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIGJhc2U6CgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUyOiBXYXJuaW5nIDQwMTogQmFzZSBjbGFzcyAnQmFzZTwgaW50ID4nIGhhcyBubyBuYW1lIGFzIGl0IGlzIGFuIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRlZCB3aXRoICcldGVtcGxhdGUoKScuIElnbm9yZWQuCiAgICAgICAgICAgIGNwcF9pbmhlcml0Lmk6NTE6IFdhcm5pbmcgNDAxOiBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlICdCYXNlPCBpbnQgPicgaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYW5kIGJlIGRlY2xhcmVkIHdpdGggYSBuYW1lLgoKCjIwMTItMDktMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMzUzNTMwNCAtIERpcmVjdCB1c2Ugb2YgYSB3ZWFrIGdsb2JhbCByZWZlcmVuY2UgaW4gZGlyZWN0b3JzCiAgICAgICAgICAgIHNvbWV0aW1lcyBjYXVzaW5nIHNlZyBmYXVsdHMgZXNwZWNpYWxseSBvbiBBbmRyb2lkLgoKMjAxMi0wOS0wNjogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHRvIGFjY2VwdCBOVUxMIHN0cmluZy4KCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIG1ha2UgRXh0ZXJuYWxSZWZlcmVuY2Ugc2xvdCByZWYgdG8gY29udGFpbiByZWZlcmVuY2UKCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIGZpeCBFeGFtcGxlcy9NYWtlZmlsZSB0byB1c2UgQyBpbiAkKENDKSByYXRoZXIgdGhhbiAkKENYWCkKClZlcnNpb24gMi4wLjggKDIwIEF1Z3VzdCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBZGQgc2l6ZV90eXBlLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UgdG8gdGhlIFNUTCBjb250YWluZXJzLgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGRpc2NhcmQgYW5kIGFkZCBtZXRob2RzIHRvIHN0ZDo6c2V0IHdyYXBwZXJzIHNvIHRoYXQgcHlhYmMuaSBjYW4gYmUgdXNlZCBlbnN1cmluZwogICAgICAgICAgICBNdXRhYmxlU2V0IGlzIGEgdmFsaWQgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RkOjpzZXQuIEFzIHJlcG9ydGVkIGJ5IEFsZXhleSBTb2tvbG92LgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0ZDo6bXVsdGlzZXQuCgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzM1NDE3NDQgLSBNaXNzaW5nIFB5SW50X0Zyb21TaXplX3QgY2FsbHMgZm9yIFB5dGhvbiAzLgoKMjAxMi0wOC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gRGF2aWQgQmF1bSB0byBhZGQgdGhlIGFzc3VtZW92ZXJyaWRlIGZlYXR1cmUgZm9yIEphdmEgZGlyZWN0b3JzIHRvCiAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhbGwgb3ZlcnJpZGRlbiBtZXRob2RzIGNhbiBiZSBhc3N1bWVkIHRvIGJlIG92ZXJyaWRkZW4uCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMzUzMDAyMSBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMzUzNjM2MCAtIEludmFsaWQgY29kZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBkaXJlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHdpdGggbWFueSBhcmd1bWVudHMuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gIzM1NDU4NzcgLSBEb24ndCB1bmRlZmluZSBib29sIGlmIGRlZmluZWQgYnkgQzk5IHN0ZGJvb2wuaCAtIHByb2JsZW0gdXNpbmcgCiAgICAgICAgICAgIFBlcmwgNS4xNiBhbmQgbGF0ZXIuCgoyMDEyLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgaW5jb3JyZWN0IHdhcm5pbmcgKDMxNCkgYWJvdXQgdGFyZ2V0IGxhbmd1YWdlIGtleXdvcmRzIHdoaWNoIHdlcmUgdHJpZ2dlcmVkCiAgICAgICAgICAgIGJ5IHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgdXNpbmcgZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUgJ3N0cmluZycgaXMgYSBrZXl3b3JkIGluIEMjOgogICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgeyBjbGFzcyBzdHJpbmc7IH0KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnN0cmluZzsKCjIwMTItMDctMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXNwbGF5IG9mIHBvaW50ZXJzIGluIHZhcmlvdXMgcGxhY2VzIG9uIDY0IGJpdCBzeXN0ZW1zIC0gb25seSAzMiBiaXRzIHdlcmUgYmVpbmcgc2hvd24uCgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2RiIGRlYnVnZ2VyIGZ1bmN0aW9ucyAnc3dpZ3ByaW50JyBhbmQgJ2xvY3N3aWdwcmludCcgdG8gZGlzcGxheSB0byB0aGUgZ2RiIG91dHB1dCB3aW5kb3cKICAgICAgICAgICAgcmF0aGVyIHRoYW4gc3Rkb3V0LiBUaGlzIGZpeGVzIGRpc3BsYXkgcHJvYmxlbXMgaW4gZ2RidHVpIGFuZCB0aGUgZW5zdXJlcyB0aGUgb3V0cHV0CiAgICAgICAgICAgIGFwcGVhcnMgd2hlcmUgZXhwZWN0ZWQgaW4gb3RoZXIgZ2RiIGJhc2VkIGRlYnVnZ2VycyBzdWNoIGFzIEVjbGlwc2UgQ0RULgoKMjAxMi0wNy0yMDoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBzZWdmYXVsdC1vbi1leGl0IHByZXZlbnRpb24gaGFjayBub3cgcHJlc2VydmVzIGV4aXQgc3RhdHVzLCBhbmQgdXNlcyBDOTkgX0V4aXQoKS4KCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBEZWJpYW4gYnVnIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvNjcyMDM1LCB0eXBlbWFwIGNvcHkgZmFpbHVyZSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCAKICAgICAgICAgICAgaW4gc3dpZy0yLjAuNToKICAgICAgICAgICAgICAlaW5jbHVkZTxzdGwuaT4KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnBhaXI7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFN0clBhaXIpIHBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlIGZvciB0ZW1wbGF0ZXMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gU1RJTEwgQlJPS0VOIHZvaWQgdXNlaXQyKFRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYyhTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFRoaW5nMkludCkgVGhpbmcyPGludD47CgoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHRlbXBsYXRlIG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgU3BhY2UyOjpZWVkgewogICAgICAgICAgICAgICAgICBUIHl5eShUIGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkxKFNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTMoOjpTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldGVtcGxhdGUoWVlZSW50KSBTcGFjZTE6OlNwYWNlMjo6WVlZPGludD47CgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZXNwYWNlIHByb2JsZW1zIGZvciBzeW1ib2xzIGRlY2xhcmVkIHdpdGggYSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IFhYWDsKICAgICAgICAgICAgICAgICAgc3RydWN0IFlZWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UyOjpZWVkge307CiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UxOjpTcGFjZTI6OlhYWCB7fTsKCiAgICAgICAgICAgICAgICB2b2lkIHRlc3RYWFgyKFNwYWNlMjo6WFhYIHh4KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMihTcGFjZTI6OllZWSB5eSkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aGVyZSB4eCBhbmQgeXkgd2VyZSBub3QgcmVjb2duaXNlZCBhcyB0aGUgcHJveHkgY2xhc3NlcyBYWFggYW5kIFlZWS4KCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlLiAKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOwogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOwogICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBtZXRob2RzIGJlbG93IGNvcnJlY3RseSB1c2VkIHRoZSBUaGluZzIgcHJveHkgY2xhc3MKICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmEoT3V0ZXIyOjpTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNlaXQyZChTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIH0KCjIwMTItMDYtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHNvIHRoYXQgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOyAvLyB1c2luZyBkaXJlY3RpdmUKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsgLy8gdXNpbmcgZGVjbGFyYXRpb24KICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgdGVtcGxhdGVkIGNsYXNzZXMuCgoyMDEyLTA1LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM1Mjk2MDEgLSBzZWcgZmF1bHQgd2hlbiBhIHByb3RlY3RlZCBtZXRob2QgaGFzIHRoZSAiZGlyZWN0b3IiCiAgICAgICAgICAgIGZlYXR1cmUgYnV0IHRoZSBwYXJlbnQgY2xhc3MgZG9lcyBub3QuIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbXMgd2l0aAogICAgICAgICAgICB0aGUgYWxscHJvdGVjdGVkIGZlYXR1cmUuCgoyMDEyLTA1LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byB3YXJuIGFib3V0IGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciAtICMzNTMwMDU1LCAzNTMwMDc4IGFuZCAjMzUzMDExOC4KClZlcnNpb24gMi4wLjcgKDI2IE1heSAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KMjAxMi0wNS0yNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZW1hcCBtb2RpZmljYXRpb25zIHNvIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHkgZm9yIG90aGVyIHN0cmluZwogICAgICAgICAgICBjbGFzc2VzLgoKMjAxMi0wNS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ZXMgZm9yIC1leHRlcm5hbC1ydW50aW1lIHRvIHdvcmsgYWdhaW4uCgoyMDEyLTA1LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBEaXNhbWJpZ3VhdGUgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2ludCBhbmQgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2xvbmcuCgoyMDEyLTA1LTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGdldHRlcnMgZm9yIHRlbXBsYXRlIG1lbWJlcnMuIChTRiMzNDI4ODMzLCBTRiMzNTI4MDM1KQoKMjAxMi0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgbGFuZ3VhZ2UncyBzdGQ6Om1hcCB3cmFwcGVycyB0byByZWNvZ25pc2UgZGlmZmVyZW5jZV90eXBlLCBzaXplX3R5cGUsIGtleV90eXBlCiAgICAgICAgICAgIGFuZCBtYXBwZWRfdHlwZS4KCjIwMTItMDUtMTQ6IGt3d2V0dGUgKHNpZ25lZCBvZmYgYnkgeGF2aWVyOTgpCiAgICAgICAgICAgIFtPY3RhdmVdIFByZXZlbnQgT2N0YXZlIGZyb20gc2VnLWZhdWx0aW5nIGF0IGV4aXQgd2hlbiBTV0lHCiAgICAgICAgICAgIG1vZHVsZXMgYXJlIGxvYWRlZCwgZHVlIHRvIGJ1Z3MgaW4gT2N0YXZlJ3MgY2xlYW51cCBjb2RlOgogICAgICAgICAgICAqIFdyYXBwaW5nIGZ1bmN0aW9ucyBub3cgZGVjbGFyZWQgd2l0aCBPY3RhdmUgREVGVU5fRExEIG1hY3JvLAogICAgICAgICAgICAgIGFuZCBsb2FkZWQgdGhyb3VnaCBPY3RhdmUncyBkeW5hbWljIG1vZHVsZSBsb2FkZXIKICAgICAgICAgICAgKiBHbG9iYWwgdmFyaWFibGVzIG9mIHN3aWdyZWYgdHlwZSBhcmUgbm93IGFzc2lnbmVkIGEgbmV3KCkKICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBzd2lncmVmIGNsYXNzLCB0byBwcmV2ZW50IGRvdWJsZS1mcmVlIGVycm9ycwogICAgICAgICAgICAqIFNXSUcgbW9kdWxlIGF0LWV4aXQgY2xlYW51cCBmdW5jdGlvbiBub3cgY3JlYXRlZCBpbiBPY3RhdmUKICAgICAgICAgICAgICB0aHJvdWdoIGV2YWwoKSwgc28gbm90IGRlcGVuZGVudCBvbiBsb2FkZWQgLm9jdCBsaWJyYXJ5CiAgICAgICAgICAgICogRm9yIE9jdGF2ZSB2ZXJzaW9ucyAzLjEuKiB0byAzLjMuKiwgcmVnaXN0ZXIgQy1sZXZlbCBhdC1leGl0CiAgICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggdGVybWluYXRlcyBPY3RhdmUgaW1tZWRpYXRlbHkgKHdpdGggY29ycmVjdAogICAgICAgICAgICAgIHN0YXR1cyBjb2RlKSB3aXRob3V0IHBlcmZvcm1pbmcgbWVtb3J5IGNsZWFudXAuIFRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICBjYW4gYmUgY29udHJvbGxlZCB3aXRoIG1hY3JvcyBpbiBMaWIvb2N0YXZlL29jdHJ1bnRpbWUuc3dnCgogICAgICAgICAgICBbT2N0YXZlXSBOZXcgc3ludGF4IGZvciBkZXRlcm1pbmcgd2hldGhlciBTV0lHIG1vZHVsZSBzaG91bGQgYmUKICAgICAgICAgICAgbG9hZGVkIGdsb2JhbGx5IG9yIG5vbi1nbG9iYWxseS4gVG8gbG9hZCBtb2R1bGUgImV4YW1wbGUiIGdsb2JhbGx5LAogICAgICAgICAgICB0eXBlIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGFzIGJlZm9yZTsgdG8gbG9hZCBtb2R1bGUgbm9uLWdsb2JhbGx5LCBhc3NpZ24gaXQgdG8gYSB2YXJpYWJsZToKICAgICAgICAgICAgJCBleGFtcGxlID0gZXhhbXBsZTsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgJCBleCA9IGV4YW1wbGU7CiAgICAgICAgICAgIGZvciBhIHNob3J0ZXIgKGxvY2FsKSBtb2R1bGUgbmFtZS4gLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lCiAgICAgICAgICAgIG9wdGlvbnMgYW5kIG1vZHVsZSBjb21tYW5kIGxpbmUgYXJlIGRlcHJlY2F0ZWQuIEFkZGVkIHVzYWdlIGluZm8KICAgICAgICAgICAgdG8gbW9kdWxlLCBzbyB0eXBpbmcKICAgICAgICAgICAgJCBoZWxwIGV4YW1wbGUKICAgICAgICAgICAgb3IgaW5jb3JyZWN0IHVzYWdlIHNob3VsZCBkaXNwbGF5IHByb3BlciB1c2FnZSwgd2l0aCBleGFtcGxlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIGEgY2FsbGJhY2suICBQYXRjaCBmcm9tCgkgICAgU0YgYnVnICMzNTEwODA2LgoKMjAxMi0wNS0xMjogb2xseQoJICAgIFtQSFBdIEF2b2lkIHVzaW5nIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBhcyBpdCBkb2Vzbid0IHdvcmsgd2l0aCBhbGwKCSAgICBidWlsZHMgb2YgUEhQIChTRiBidWcgIzMxNjY0MjMpLiAgSW5zdGVhZCB3ZSBub3cgd3JhcCBpdCBpbiBhCgkgICAgU1dJR19GQUlMKCkgZnVuY3Rpb24gd2hpY2ggd2UgYW5ub3RhdGUgYXMgIm5vcmV0dXJuIiBmb3IgR0NDIHRvCgkgICAgYXZvaWRzIHdhcm5pbmdzLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVkCgkgICAgd3JhcHBlciAoZS5nLiB0aGUgc3RyaXBwZWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IDYlIGZvciBYYXBpYW4ncyBQSFAKCSAgICBiaW5kaW5ncykuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI4NTUgRml4IHVuaW50ZW5kZWQgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIE9VVFBVVCB0eXBlbWFwcy4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjY3NCBGaXggcG9zc2libGUgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIGNoYXIgKipTVFJJTkdfT1VUCiAgICAgICAgICAgIHR5cGVtYXAuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2MTEgRml4IHVuaW5pdGlhbGlzZWQgc2l6ZSByZWdyZXNzaW9uIGluIGNoYXIgKipTVFJJTkdfQVJSQVkKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTIuMC42LgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU0YgYnVnICMzNTI1MDUwIC0gRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC41IHdoZXJlYnkgZGVmaW5pbmcgb25lIHR5cGVtYXAKICAgICAgICAgICAgbWV0aG9kIHN1Y2ggYXMgYW4gJ291dCcgdHlwZW1hcCBtYXkgaGlkZSBhbm90aGVyIHR5cGVtYXAgbWV0aG9kIHN1Y2ggYXMgYW4gJ2luJyB0eXBlbWFwIC0KICAgICAgICAgICAgb25seSBvY2N1cnMgd2hlbiB0aGUgdHlwZSBpcyBhIHRlbXBsYXRlIHR5cGUgd2hlcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAgIHZpYSBhIHR5cGVkZWYuCgoyMDEyLTA1LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IHRoZSBjb25zdGFudCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIGV0YyAtIHByZXZpb3VzbHkKCSAgICB0aGVzZSB1c2VkIHRoZSB3cm9uZyBuYW1lIGZvciByZW5hbWVkIGNvbnN0YW50cy4gIEFkZAoJICAgIGF1dG9kb2NfcnVubWUucGhwIHRvIHRoZSB0ZXN0c3VpdGUgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoaXMuCgoyMDEyLTA1LTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gUmVtb3ZlIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgZ2NjZ28gNC42LiAgVXNpbmcKCSAgICBTV0lHIHdpdGggZ2NjZ28gd2lsbCBub3cgcmVxdWlyZSBnY2NnbyA0LjcuICBVc2luZyBTV0lHCgkgICAgd2l0aCB0aGUgbW9yZSBjb21tb25seSB1c2VkIGdjIGNvbXBpbGVyIGlzIHVuYWZmZWN0ZWQuCgoyMDEyLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIEMgZm9yd2FyZCBlbnVtIGRlY2xhcmF0aW9ucyBpbiBzb21lIGxhbmd1YWdlcy4KClZlcnNpb24gMi4wLjYgKDMwIEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiBTV0lHVFlQRSAqKk9VVFBVVCB0eXBlbWFwcyBhcyByZXBvcnRlZCBieSBKaW0gQW5kZXJzb24uCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gd3JhcHBpbmcgU1RMIGNvbnRhaW5lcnMgb24gTWFjIE9TIFggYW5kIHBvc3NpYmx5IG90aGVyIHN5c3RlbXMuCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggMzUyMTgxMSBmcm9tIExlbyBEYXZpcyAtIGNoYXIgKipTVFJJTkdfQVJSQVkgdHlwZW1hcHMgZml4ZWQgdG8gaGFuZGxlCiAgICAgICAgICAgIG51bGwgcG9pbnRlcnMuCgpWZXJzaW9uIDIuMC41ICgxOSBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgcGF0Y2ggIzM1MTc0MzUgZnJvbSBNaWxlcyBCYWRlciAtIHByZWZlciB0byB1c2UgTHVhX3B1c2hnbG9iYWx0YWJsZQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNTE3NzY5IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggY29tcGlsZSBlcnJvciBvbiBNYWNSdWJ5IHVzaW5nIFJTVFJJTkdfUFRSLgoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM1MTEwMDkgZnJvbSBMZWlmIE1pZGRlbHNjaHVsdGUgZm9yIHNsaWdodGx5IG9wdGltaXNlZCBjaGFyICogdmFyaWFibGUgd3JhcHBlcnMuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjMzIxOTY3NiBmcm9tIFNoYW5lIExpZXNlZ2FuZyB3aGljaCBhZGRzOgogICAgICAgICAgICAtIHN1cHBvcnQgZm9yICVmYWN0b3J5CiAgICAgICAgICAgIC0gYSBfX3Rvc3RyaW5nIG1ldGhvZAogICAgICAgICAgICAtIGEgX19kaXNvd24gbWV0aG9kCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBBcHBseSAjMzUxMzU2OSB3aGljaCBhZGRzIGEgY2F0Y2hsaXN0IHRvIHRoZSB4bWwgb3V0cHV0LgoKMjAxMi0wNC0wNTogb2xseQoJICAgIFtMdWFdIEFkZCBzdXBwb3J0IGZvciBMdWEgNS4yIChwYXRjaCBTRiMzNTE0NTkzIGZyb20gTWlsZXMgQmFkZXIpCgoyMDEyLTAzLTI2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEFwcGx5IHBhdGNoICMzNDI1OTkzIGZyb20gamdpbGxpczogYWRkIGV4dHJhIGxvZ2ljIHRvIHRoZSBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKHZvaWQpIG1ldGhvZDogaXQgY2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgX19kaW1zX18gbWV0aG9kIGFuZCB1c2VzIHRoaXMgaW4gc3RlYWQgb2YgcmV0dXJuaW5nICgxLDEpCgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjQ4MzMgZnJvbSBqZ2lsbGlzOiBtYWtlIGlzX29iamVjdCByZXR1cm4gdHJ1ZSBmb3Igc3dpZyB0eXBlcwoKMjAxMi0wMy0yNDogd3NmdWx0b24KICAgICAgICAgICAgW0RdIEFwcGx5ICMzNTAyNDMxIHRvIGZpeCBkdXBsaWNhdGUgc3ltYm9scyBpbiBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMi0wMy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDk0NzkxIC0gJSRpc2dsb2JhbCBmb3IgJXJlbmFtZSBtYXRjaGluZy4KCjIwMTItMDMtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQ4NzcwNiBhbmQgIzMzOTE5MDYgLSBtaXNzaW5nIHN0ZGRlZi5oIGluY2x1ZGUgZm9yIHB0cmRpZmZfdCB3aGVuIHVzaW5nICVpbXBvcnQKICAgICAgICAgICAgZm9yIFNUTCBjb250YWluZXJzIGFuZCBjb21waWxpbmcgd2l0aCBnKystNC42LiBBbiBpbmNsdWRlIG9mIHN0ZGRlZi5oIGlzIG5vdyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIFNXSUcgZ2VuZXJhdGVzIFNUTCBoZWxwZXIgdGVtcGxhdGVzIHdoaWNoIHJlcXVpcmUgcHRyZGlmZl90LiBJZiB5b3UgCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSByZWx5aW5nIG9uICIjaW5jbHVkZSA8c3RkZGVmLmg+IiBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgYQogICAgICAgICAgICAlaW5jbHVkZSBvZiBhbiBTVEwgaGVhZGVyLCB5b3UgbWF5IG5vdyBuZWVkIHRvIGFkZCB0aGlzIGluIG1hbnVhbGx5LgoKMjAxMi0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMzOTIyNjQgZnJvbSBTZWJhc3RpZW4gQmluZSB0byBwYXJzZSAodW5zaWduZWQpIGxvbmcgbG9uZyB0eXBlcyBpbiBlbnVtIHZhbHVlIGFzc2lnbm1lbnQuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUwNTUzMCBmcm9tIEthcmwgV2V0dGUgdG8gYWxsb3cgY3VzdG9tIGFsbG9jYXRvcnMgaW4gU1RMIHN0cmluZyBjbGFzc2VzIGZvciB0aGUgVVRMIGxhbmd1YWdlcy4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNDY4MzYyIGZyb20gS2FybCBXZXR0ZSB0byBmaXggJWluY2x1ZGUgaW5zaWRlICVkZWZpbmUuCgoyMDEyLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmUsIFJdIEZpeCAjMzQ3NTQ5MiAtIGl0ZXJhdGluZyB0aHJvdWdoIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9mIGVudW1lcmF0aW9ucy4KCjIwMTItMDItMjc6IHhhdmllcjk4IChwYXRjaGVzIGZyb20gS2FybCBXZXR0ZSkKCSAgICBbT2N0YXZlXSBVc2UgLWdsb2JhbHMgLiB0byBsb2FkIGdsb2JhbCB2YXJpYWJsZXMgaW4gbW9kdWxlIG5hbWVzcGFjZQoJICAgIFtPY3RhdmVdIENvbW1lbnQgZGVjbGFyYXRpb24gb2YgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBzd2lnX3JlZ2lzdGVyX2RpcmVjdG9yCgkgICAgW09jdGF2ZV0gRml4IE9DVEFWRV9QQVRIIGluIG9jdGF2ZSBNYWtlZmlsZXMKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IC0gZml4IGxpX3N0ZF9jb250YWluZXJzX2ludCB0ZXN0CgkgICAgW09jdGF2ZV0gRml4IGltcG9ydHMgdGVzdAoKMjAxMi0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1ha2UgZ2VuZXJhdGVkIHN1cHBvcnQgZnVuY3Rpb25zIGluIGFycmF5c19qYXZhLmkgc3RhdGljIHNvIHRoYXQgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgZnJvbSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgU1dJRyBjYW4gYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB0b2dldGhlciAtIHByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgRXZhbiBLcmF1c2UuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY3Jhc2ggd2l0aCBiYWQgcmVnZXggLSBidWcgIzM0NzQyNTAuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgUHl0aG9uIHN0ZXBwZWQgc2xpY2luZyBzdXBwb3J0IHRvIHRoZSBTVEwgd3JhcHBlcnMgKHN0ZDo6dmVjdG9yLCBzdGQ6Omxpc3QpLgogICAgICAgICAgICBBc3NpZ25pbmcgdG8gYSBzbGljZSwgcmVhZGluZyBhIHNsaWNlIGFuZCBkZWxldGluZyBhIHNsaWNlIHdpdGggc3RlcHMgbm93IHdvcmsuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIHZpID0gdmVjdG9yX2kocmFuZ2UoMTApKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgdmlbMTo0OjJdID0gWzExMSwgMzMzXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgZGVsIHZpWzM6MTA6M10KICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmlbOjotMV0pCgogICAgICAgICAgICBnaXZlcyAoc2FtZSBiZWhhdmlvdXIgYXMgbmF0aXZlIFB5dGhvbiBzZXF1ZW5jZXMgc3VjaCBhcyBsaXN0KToKCiAgICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgMzMzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgICAgICAgICAgIFswLCAxMTEsIDIsIDQsIDUsIDcsIDhdCiAgICAgICAgICAgICAgWzgsIDcsIDUsIDQsIDIsIDExMSwgMF0KCjIwMTItMDEtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBDb3JyZWN0bHkgYW5ub3RhdGUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCBDIGxpbmthZ2UuCiAgICAgICAgICAgIFtEXSBFeGNlcHRpb24gYW5kIEVycm9yIGhhdmUgYmVjb21lIGJsZXNzZWQgbmFtZXM7IHJlbW92ZWQgZF9leGNlcHRpb25fbmFtZSB0ZXN0IGNhc2UuCgoyMDEyLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSBpbmRleGluZyBidWdzIGluIFB5dGhvbiBTVEwgd3JhcHBlcnMgd2hlbiB0aGUgaW5kZXggaXMgbmVnYXRpdmUsIGVnOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIGl2PXZlY3Rvcl9pKFswLDEsMiwzLDQsNV0pCiAgICAgICAgICAgICAgaXZbLTc6XQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDVdIGluc3RlYWQgb2YgWzVdLgoKICAgICAgICAgICAgICB2dls3OjldID0gWzIyLDMzXQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDUsIDIyLCAzM10gaW5zdGVhZCBvZiAiaW5kZXggb3V0IHJhbmdlIiBlcnJvci4KCiAgICAgICAgICAgIEFsc28gZml4IHNvbWUgc2VnZmF1bHRzIHdoZW4gcmVwbGFjaW5nIHJhbmdlcywgZWcgd2hlbiBpbCBpcyBhIHN0ZDo6bGlzdCB3cmFwcGVyOgoKICAgICAgICAgICAgICBpbFswOjJdID0gWzExXQoKMjAxMi0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjbGFzcyB3aGVuIHVzZWQgYXMgYSBiYXNlLgoKMjAxMi0wMS0wNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTItMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMzQ1MjU2MCBmcm9tIEJyYW50IEt5c2VyIC0gYWRkIHN1cHBvcnQgZm9yICVuc3BhY2Ugd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDExLTEyLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgJ2RpcmVjdG9yaW4nIHR5cGVtYXAgbm93IGFjY2VwdHMgJDEsICQyIGV0YyBleHBhbnNpb25zIGluc3RlYWQgb2YgaGF2aW5nIHRvIHVzZSB3b3JrYXJvdW5kcyAtCiAgICAgICAgICAgICQxX25hbWUsICQyX25hbWUgZXRjLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBkaXJlY3RvciB0eXBlbWFwcy4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgR28sIEphdmEsIERdIEFkZCBzdXBwb3J0IGZvciB0aGUgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW09jYW1sLCBPY3RhdmUsIFBIUCwgUHl0aG9uLCBSdWJ5XSBDb3JyZWN0IHNwZWNpYWwgdmFyaWFibGVzIGluICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBhbnkgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwcyB5b3UgbWF5IGhhdmUgd3JpdHRlbi4gUGxlYXNlIGNoYW5nZToKICAgICAgICAgICAgICAkcmVzdWx0IHRvICQxCiAgICAgICAgICAgICAgJGlucHV0IHRvICRyZXN1bHQKCiAgICAgICAgICAgIEFsc28gZml4IHRoZSBuYW1lZCAnZGlyZWN0b3JhcmdvdXQnIERJUkVDVE9ST1VUIHR5cGVtYXBzIGZvciB0aGVzZSBsYW5ndWFnZXMgd2hpY2ggZGlkbid0CiAgICAgICAgICAgIHByZXZpb3VzbHkgY29tcGlsZSBhbmQgYWRkIGluICQxLCAkMiBldGMgZXhwYW5zaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMS0xMi0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTV0lHX2Vycm9yKCkgbm93IGdldHMgZGVjb3JhdGVkIHdpdGggcGVybCBzb3VyY2UgZmlsZS9saW5lIG51bWJlci4KICAgICAgICAgICAgW3Blcmw1XSBlcnJvciBoYW5kbGluZyBub3cgY29uZm9ybXMgdG8gcHVibGljIFhTIGFwaSAoZml4ZXMgcGVybCB2NS4xNCBpc3N1ZSkuCgoyMDExLTEyLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQW5kcm9pZC9KYXZhXSBGaXggZGlyZWN0b3JzIHRvIGNvbXBpbGUgb24gQW5kcm9pZC4KCiAgICAgICAgICAgIEFkZGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIGZvciBBbmRyb2lkLgoKMjAxMS0xMi0wODogdmFkegoJICAgIEJ1ZyBmaXg6IEhhbmRsZSBtZXRob2RzIHJlbmFtZWQgb3IgaWdub3JlZCBpbiB0aGUgYmFzZSBjbGFzcyBjb3JyZWN0bHkgaW4gdGhlIGRlcml2ZWQgY2xhc3NlcwoJICAgICh0aGV5IGNvdWxkIGJlIHNvbWV0aW1lcyBteXN0ZXJpb3VzbHkgbm90IHJlbmFtZWQgb3IgaWdub3JlZCB0aGVyZSBiZWZvcmUpLgoKMjAxMS0xMi0wMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeCBleGNlcHRpb24gZ2x1ZSBjb2RlIGZvciBuZXdlciBETUQgMiB2ZXJzaW9ucy4KICAgICAgICAgICAgW0RdIERvIG5vdCBkZWZhdWx0IHRvIDMyIGJpdCBnbHVlIGNvZGUgZm9yIERNRCBhbnltb3JlLgogICAgICAgICAgICBbRF0gVXNlIHN0ZGMuY29uZmlnLmNfbG9uZy9jX3Vsb25nIHRvIHJlcHJlc2VudCBDIGxvbmcgdHlwZXMuCgoyMDExLTEyLTAxOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBidWcgMzQ0NzQyNjogbWVtb3J5IGxlYWsgaW4gdmVjdG9yLl9fZ2V0aXRlbV9fLgoKMjAxMS0xMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFJlbW92ZSBDKysgY29tbWVudHMgZnJvbSBnZW5lcmF0ZWQgQyBjb2RlLgoKMjAxMS0xMS0yNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBzb21lIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVycyB3aXRoCgkgICAgY2VydGFpbiBHQ0Mgd2FybmluZyBvcHRpb25zIChEZWJpYW4gYnVnICM2NTAyNDYpLgoKMjAxMS0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDMzNTQxICV0eXBlbWFwKGluLCBudW1pbnB1dHM9MCkgd2l0aCAxMCsgYXJndW1lbnRzLgoKMjAxMS0xMS0yODogb2xseQoJICAgIFtQZXJsXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGggY2VydGFpbgoJICAgIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzQzNjcxMSkuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIGtleXdvcmQgbGlzdCB0byBpbmNsdWRlIGtleXdvcmRzIGFkZGVkIGluIFBIUCByZWxlYXNlcyB1cCB0byA1LjMuCgoyMDExLTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAnaW50ZXJuYWwnIGJ5IGRlZmF1bHQgYW5kIGlmIG11bHRpcGxlCiAgICAgICAgICAgIFNXSUcgbW9kdWxlcyBhcmUgYmVpbmcgdXNlZCBhbmQgY29tcGlsZWQgaW50byBkaWZmZXJlbnQgYXNzZW1ibGllcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LgogICAgICAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXRpZXMgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3M6CgogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0NTQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFtKYXZhXSBQcm92aWRlIGFuIGVhc3kgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIHRoZSBwcm94eSBjbGFzcyBwb2ludGVyCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZ2V0Q1B0cigpIG1ldGhvZC4gVGhlIHZpc2liaWxpdHkgaXMgJ3Byb3RlY3RlZCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBwYWNrYWdlcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWShwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGZvciBKYXZhIGhhcyBjaGFuZ2VkIGZyb20gcHVibGljIHRvIHByb3RlY3RlZCBmb3IgdGhlIHByb3h5IGNsYXNzZXMuIFVzZSB0aGUKICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWSBtYWNybyBhYm92ZSB0byByZXN0b3JlIHRvIHRoZSBwcmV2aW91cyB2aXNpYmlsaXRpZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTExLTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQ0MDA0NDogI2lmZGVmIG91dCBTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0ciBpZiAtYnVpbHRpbgoJICAgIGlzbid0IGJlaW5nIHVzZWQsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJpbmFyeSBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuCgkgICAgcHl0aG9uIGluc3RhbGxhdGlvbnMuCgoyMDExLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgZml4OiBSZW1vdmUgcm9vdCBkaXJlY3RvcnkgZnJvbSBkaXJlY3Rvcnkgc2VhcmNoIGxpc3QgaW4gV2luZG93cy4KCjIwMTEtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzQyMTg3NiBmcm9tIFJvYmluIFN0b2NrZXIgdG8gZml4ICMzNDE2ODE4IC0gc2FtZSBjbGFzcyBuYW1lIGluIAogICAgICAgICAgICBkaWZmZXJlbnQgbmFtZXNwYWNlcyBjb25mdXNpb24gd2hlbiB1c2luZyBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBjcmUtYnVpbGQuc2ggdG8gd29yayB3aXRoIG5vbi1jb21wcmVzc2VkIHRhcmJhbGxzIC0gcHJvYmxlbSByZXBvcnRlZCBieSBBZHJpYW4gQmxha2VseS4KCjIwMTEtMTEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4cGFuZCBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0eXBlbWFwIHdhcm5pbmdzLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIHdhcm5pbmc9IjEwMDA6VGVzdCB3YXJuaW5nIGZvciAnaW4nIHR5cGVtYXAgZm9yICQxX3R5cGUgJDFfbmFtZSIpIGludCAiLi4uIgoKMjAxMS0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVkIG91dHB1dCB0eXBlbWFwcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBzeW1ib2wgdXNlcyBhIHF1YWxpZmllciBhbmQgY29udGFpbnMKICAgICAgICAgICAgYSBudW1iZXIsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGRvdWJsZSBBQkM6Om0xICIuLi4iCgoyMDExLTEwLTI0OiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMzQyMzExOSAtIG92ZXJsb2FkIGRpc3BhdGNoIHN0YWNrIGNvcnJ1cHRpb24gZml4LiAgQmV0dGVyLCBidXQgbW9yZSByZXNlYXJjaAogICAgICAgICAgICBpcyBuZWVkZWQgb24gYSBzdGFibGUgcGF0aCBmb3IgdGFpbCBjYWxscyBpbiBYUy4KCiAgICAgICAgICAgIEFsc28sIGZpeCBmb3IgbGFyZ2UgbG9uZyBsb25ncyBpbiAzMiBiaXQgcGVybC4KCjIwMTEtMTAtMTM6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQWxsb3cgT2N0YXZlIG1vZHVsZXMgdG8gYmUgcmUtbG9hZGVkIGFmdGVyIGEgImNsZWFyIGFsbCIuCgoyMDExLTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjEgcmVwb3J0ZWQgYnkgVGVlbXUgSWtvbm9uZSBsZWFkaW5nIHRvIHVuY29tcGlsYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdHlwZWRlZiBhbmQgZnVuY3Rpb24gcG9pbnRlciByZWZlcmVuY2VzLCBmb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IEZOKGNvbnN0IGludCAmYSwgaW50IGIpOwogICAgICAgICAgICAgIHZvaWQgKnR5cGVkZWZfY2FsbDEoRk4gKiYgcHJlY2FsbGJhY2ssIEZOICogcG9zdGNhbGxiYWNrKTsKCjIwMTEtMDktMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMzNDA4MDEyIGZyb20gUmFtYW4gR29wYWxhbiAtIGFkZCBzdXBwb3J0IGZvciBlbWJlZGRlZCBMdWEgKGVMdWEpCiAgICAgICAgICAgIGluY2x1ZGluZyBvcHRpb25zIGZvciB0YXJnZXRpbmcgTHVhIFRpbnkgUkFNIChMVFIpLgoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGxpYnJhcnkgY29udHJpYnV0aW9uIGZyb20gcGF0Y2ggIzM0MDE1NzEuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgd2FybmluZ3MgZm9yIGJhZGx5IG5hbWVkIGRlc3RydWN0b3JzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEtTdHJ1Y3QgewogICAgICAgICAgICAgICAgfk5PVF9LU3RydWN0KCkge30KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgY3BwX2V4dGVuZF9kZXN0cnVjdG9ycy5pOjkyOiBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgfk5PVF9LU3RydWN0LiBJZ25vcmVkLgoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVleHRlbmQgYW5kIGRlc3RydWN0b3JzIGZvciB0ZW1wbGF0ZXMuIFRoZSBkZXN0cnVjdG9yIGluICVleHRlbmQgd2FzIG5vdCBhbHdheXMgd3JhcHBlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleHRlbmQgRm9vVCB7CiAgICAgICAgICAgICAgICB+Rm9vVCgpIHsgZGVsZXRlICRzZWxmOyB9IC8vIHdhcyBub3Qgd3JhcHBlZCBhcyBleHBlY3RlZAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vVCB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vVGkpIEZvb1Q8aW50PjsKCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzcGVjaWFsIHZhcmlhYmxlcyBzdWNoIGFzICIkZGVjbCIgYW5kICIkZnVsbGRlY2wiIGluIGRlc3RydWN0b3JzIHRvIGluY2x1ZGUgdGhlIH4gY2hhcmFjdGVyLgoKMjAxMS0wOS0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTRiBidWcgIzE0ODE5NTggLSBJbXByb3ZlIHJhbmdlIGNoZWNraW5nIGZvciBpbnRlZ2VyIHR5cGVzLgogICAgICAgICAgICBFbmhhbmNlIGxpX3R5cGVtYXBzX3J1bm1lLnBsCgoyMDExLTA5LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBvbiB0eXBlZGVmIGNsYXNzZXMgaW4gYSBuYW1lc3BhY2UgdXNpbmcgdGhlIHR5cGVkZWYgbmFtZSwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgJWV4dGVuZCBDU3RydWN0IHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdDU3RydWN0IHsgLi4uIH0gQ1N0cnVjdDsKICAgICAgICAgICAgfQoKMjAxMS0wOC0zMTogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBwYXRjaGVzIGZyb20gS2FybCBXZXR0ZTogaW1wcm92ZW1lbnRzIHRvIG1vZHVsZSBsb2FkaW5nIGJlaGF2aW9yOwoJICAgIGFkZGVkIGV4YW1wbGUgb2YgZnJpZW5kIG9wZXJhdG9yIHRvIG9wZXJhdG9yIGV4YW1wbGU7IGZpeGVkIG9jdGF2ZSBwYW5pYy9jcmFzaCBpbiAzLjAuNTsKCSAgICBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwoKMjAxMS0wOC0zMDogc3phZ2VyCgkgICAgW3B5dGhvbl0gQnVnIDM0MDA0ODYsIGZpeCBlcnJvciBzaWduYWxsaW5nIGZvciBidWlsdC1pbiBjb25zdHJ1Y3RvcnMuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmaWxlL2xpbmUgbnVtYmVyIGRpc3BsYXkgZm9yICJnb3R5cGUiIHdoZW4gdXNpbmcgdHlwZW1hcCBkZWJ1Z2dpbmcgb3B0aW9ucwogICAgICAgICAgICAtdG1zZWFyY2ggYW5kIC10bXVzZWQuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIERdIEZpeCAlY2FsbGJhY2sgd2hpY2ggd2FzIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUuCgoyMDExLTA4LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY29uc3RydWN0b3JzIGluIG5hbWVkIHR5cGVkZWYgY2xhc3MgZGVjbGFyYXRpb25zIGFzIHJlcG9ydGVkIGJ5IEdyZWdvcnkgQnJvbm5lcjoKCiAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEEgewogICAgICAgICAgICAgIEEoKXt9IC8vIENvbnN0cnVjdG9yIHdoaWNoIHdhcyBub3QgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICAgIEIoKXt9IC8vIE5PVCBhIGNvbnN0cnVjdG9yIC0taWxsZWdhbCwgYnV0IHdhcyBhY2NlcHRlZCBieSBTV0lHCiAgICAgICAgICAgIH0gQjsKCiAgICAgICAgICAgIEZvciBDIGNvZGUsIHRoZSBmaXggbm93IHJlc3VsdHMgaW4gdGhlIHVzZSBvZiAnc3RydWN0IEEgKicgaW5zdGVhZCBvZiBqdXN0ICdCIConIGluCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSB3aGVuIHdyYXBwaW5nIG1lbWJlcnMgaW4gQSwgYnV0IHVsdGltYXRlbHkgdGhpcyBkb2VzIG5vdCBtYXR0ZXIsIGFzCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lIHRoaW5nLgoKMjAxMS0wOC0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuZXdvYmplY3Qgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJWZlYXR1cmUoInJlZiIpIGFzIHJlcG9ydGVkIGJ5IEphbiBCZWNrZXIuIFRoZQogICAgICAgICAgICBjb2RlIGZyb20gdGhlICJyZWYiIGZlYXR1cmUgd2FzIG5vdCBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5ICVuZXdvYmplY3QuCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gZm9yICJyZWYiIGFuZCAidW5yZWYiIG1vdmVkIGZyb20gUHl0aG9uIHRvIHRoZSBDKysgY2hhcHRlci4KCjIwMTEtMDgtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIG1lbW9yeSBsZWFrIHdpdGggLS1idWlsdGluIG9wdGlvbiAoYnVnIDMzODUwODkpLgoKMjAxMS0wOC0yMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU0YgcGF0Y2ggIzMzOTQzMzkgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgLSBuZXcgb3B0aW9uIC1ub21vZHVsZWdsb2JhbCB0byBkaXNhYmxlIGluc3RhbGxpbmcgCiAgICAgICAgICAgIHRoZSBtb2R1bGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gUmVxdWlyZSBjYWxsIGFsc28gcmV0dXJucyB0aGUgbW9kdWxlIHRhYmxlIGluc3RlYWQgCiAgICAgICAgICAgIG9mIGEgc3RyaW5nLgoKMjAxMS0wOC0wOTogeGF2aWVyOTgKICAgICAgICAgICAgRml4IGJ1ZyAzMzg3Mzk0OyBPY3RhdmUgcGF0Y2hlcyBmb3IgMy40LjAgY29tcGF0aWJpbGl0eSwgZXRjLiAoZnJvbSBLYXJsIFdldHRlKQoKMjAxMS0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluICRzeW1uYW1lIGV4cGFuc2lvbiBmb3IgZGlyZWN0b3IgbWV0aG9kcy4KCjIwMTEtMDctMjk6IG9sbHkKCSAgICBbUEhQXSBEb24ndCBnZW5lcmF0ZSAicmV0dXJuICRyOyIgaW4gY2FzZXMgd2hlcmUgJHIgaGFzbid0IGJlZW4gc2V0LgoJICAgIFRoaXMgd2FzIGJhc2ljYWxseSBoYXJtbGVzcywgZXhjZXB0IGl0IGdlbmVyYXRlZCBhIFBIUCBFX05PVElDRSBpZgoJICAgIHRoZSBjYWxsaW5nIGNvZGUgaGFkIGVuYWJsZWQgdGhlbS4KCjIwMTEtMDctMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzY29waW5nIG9mIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIG5lc3RlZCB3aXRoaW4gYSBjbGFzcyAoZm9yIEMrKykuIFByZXZpb3VzbHkgdGhlIHN5bWJvbAogICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgcHV0IGludG8gdGhlIG91dGVyIG5hbWVzcGFjZSwgZWcKCiAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4gc3RydWN0IG1hcCB7CiAgICAgICAgICAgICAgICBjbGFzcyBpdGVyYXRvcjsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpdGVyYXRvciB3YXMgc2NvcGVkIGFzIHN0ZDo6aXRlcmF0b3IsIGJ1dCBub3cgaXQgaXMgY29ycmVjdGx5IHN0ZDo6bWFwPEtleSwgVD46Oml0ZXJhdG9yOwoKICAgICAgICAgICAgQWxzbyBmaXhlZCBpcyAldGVtcGxhdGUgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBhcmUgYSB0eXBlZGVmIHdoZW4gdGhlIHRlbXBsYXRlIGNvbnRhaW5zCiAgICAgICAgICAgIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycywgZWc6CgogICAgICAgICAgICBuYW1lc3BhY2UgU3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEMgPSBpbnQ+IHN0cnVjdCBNYXAgewogICAgICAgICAgICAgICAgdHlwZWRlZiBLZXkga2V5X3R5cGU7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFQgbWFwcGVkX3R5cGU7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBET1VCTEU7CiAgICAgICAgICAgICV0ZW1wbGF0ZShNTSkgU3RkOjpNYXA8aW50LCBET1VCTEU+OwoKICAgICAgICAgICAgQWxsIHN5bWJvbHMgd2l0aGluIE1hcCB3aWxsIGJlIHJlc29sdmVkIGNvcnJlY3RseSwgZWcga2V5X3R5cGUgYW5kIG1hcHBlZF90eXBlIG5vIG1hdHRlciBpZiB0aGUKICAgICAgICAgICAgd3JhcHBlZCBjb2RlIHVzZXMgU3RkOjpNYXA8aW50LCBkb3VibGU+IG9yIHN0ZDo6TWFwPGludCwgRE9VQkxFPiBvciBTdGQ6Ok1hcDxpbnQsIGRvdWJsZSwgaW50PgoKICAgICAgICAgICAgQWxzbyBmaXhlcyBidWcgIzMzNzgxNDUgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjQgLSAldGVtcGxhdGUgdXNpbmcgdHJhaXRzLgoKMjAxMS0wNy0yMCAgc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGNsb3N1cmUgZm9yIHRwX2NhbGwgc2xvdC4KCjIwMTEtMDctMTY6IHdzZnVsdG9uCgkgICAgW3B5dGhvbl0gRml4IGRpcmVjdG9yIHR5cGVtYXAgdXNpbmcgUHlPYmplY3QgKi4KCjIwMTEtMDctMTM6IHN6YWdlcgoJICAgIFtweXRob25dIFNGIHBhdGNoICMzMzY1OTA4IC0gQWRkIGFsbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIG1hcCBzdXBwb3J0IGNvZGUgaW4gc3RkX21hcC5pCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXggZm9yIGJ1ZyAzMzI0NzUzOiAlcmVuYW1lIG1lbWJlciB2YXJpYWJsZXMgd2l0aCAtYnVpbHRpbi4KCjIwMTEtMDctMDE6IHdzZnVsdG9uCgkgICAgRml4IHNvbWUgc2NvcGUgYW5kIHN5bWJvbCBsb29rdXAgcHJvYmxlbXMgd2hlbiB0ZW1wbGF0ZSBkZWZhdWx0IHBhcmFtZXRlcnMgYXJlIGJlaW5nCiAgICAgICAgICAgIHVzZWQgd2l0aCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFhYLCB0eXBlbmFtZSBUVCA9IFNvbWVUeXBlPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICB0eXBlZGVmIFhYIFg7CiAgICAgICAgICAgICAgdHlwZWRlZiBUVCBUOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUVD4gc3RydWN0IFVzZXNGb28gewogICAgICAgICAgICAgIHZvaWQgeCh0eXBlbmFtZSBGb288VFQ+OjpULCB0eXBlbmFtZSBGb288VFQ+OjpYKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFsc28gZml4ZXMgdXNlIG9mIHN0ZDo6dmVjdG9yPGludD46OnNpemVfdHlwZSBmb3IgUHl0aG9uIGFzIHJlcG9ydGVkIGJ5IEF1YnJleSBCYXJuYXJkLgoKMjAxMS0wNi0yMzogb2xseQoJICAgIFtQSFBdIEZpeCBkaXJlY3RvciBjb2RlIHRvIHdvcmsgd2hlbiBQSFAgaXMgYnVpbHQgd2l0aCBaVFMgZW5hYmxlZCwKCSAgICB3aGljaCBpcyB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBvbiBNaWNyb3NvZnQgV2luZG93cy4KCjIwMTEtMDYtMjE6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIHZhcmlvdXMgc21hbGwgdHdlYWtzIGFuZCBidWcgZml4ZXMuCgkgICAgLSBBdm9pZCBuYW1lIGNvbmZsaWN0cyBiZXR3ZWVuIHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMgYW5kIHRoZSB3cmFwcGVycyBmb3IKCSAgICB0aGUgYWN0dWFsIGNsYXNzLgoJICAgIC0gRml4IGRlZmF1bHQgdHlwZW1hcHMgZm9yIEMgYmluZGluZ3MsIHdoaWNoIHdlcmUgaW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0bwoJICAgIGNhbGwgbm9uLWV4aXN0ZW50IGRlc3RydWN0b3JzIG9uIHVzZXItZGVmaW5lZCB0eXBlcy4KCSAgICAtIE5ldyBmZWF0dXJlLCBmZWF0dXJlOmFjbG1peGlucywgZm9yIGFkZGluZyBzdXBlcmNsYXNzIHRvIHRoZSBmb3JlaWduIGNsYXNzCgkgICAgd3JhcHBlcnMuCgkgICAgLSBJbXByb3ZlIGxvbmdsb25nIHR5cGVtYXBzLgoKMjAxMS0wNi0xOTogd3NmdWx0b24KCSAgICBGaXggaW5jb3JyZWN0IHR5cGVtYXBzIGJlaW5nIHVzZWQgZm9yIGEgc3ltYm9sIHdpdGhpbiBhIHRlbXBsYXRlZCB0eXBlLCBlZzoKICAgICAgICAgICAgQTxpbnQ+Ojp2YWx1ZV90eXBlIHdvdWxkIGluY29ycmVjdGx5IHVzZSBhIHR5cGVtYXAgZm9yIHR5cGUgQS4KCjIwMTEtMDYtMTg6IG9sbHkKCSAgICBbVGNsXSBGaXggdmFyaWFibGUgZGVjbGFyYXRpb25zIGluIG1pZGRsZSBvZiBibG9ja3Mgd2hpY2ggaXNuJ3QKCSAgICBwZXJtaXR0ZWQgaW4gQzkwIChpc3N1ZSBwcm9iYWJseSBpbnRyb2R1Y2VkIGluIDIuMC4zIGJ5IHBhdGNoICMzMjI0NjYzKS4KCSAgICBSZXBvcnRlZCBieSBQYXVsIE9iZXJtZWllciBpbiBTRiMzMjg4NTg2LgoKMjAxMS0wNi0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gU0YgIzMzMTI1MDUgLSBzbGlnaHRseSBlYXNpZXIgdG8gd3JhcCBjaGFyW10gb3IgY2hhcltBTlldIHdpdGggYSBKYXZhIGJ5dGVbXQogICAgICAgICAgICB1c2luZyBhcnJheXNfamF2YS5pLgoKMjAxMS0wNi0xMzogd3NmdWx0b24KCSAgICBbUnVieSwgT2N0YXZlXSBTRiAjMzMxMDUyOCBBdXRvZG9jIGZpeGVzIHNpbWlsYXIgdG8gdGhvc2UgZGVzY3JpYmVkIGJlbG93IGZvciBQeXRob24uCgoyMDExLTA2LTEwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZldyBzdWJ0bGUgYnVnZml4ZXMgaW4gYXV0b2RvYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24sCiAgICAgICAgICAgIC0gVW5uYW1lZCBhcmd1bWVudCBuYW1lcyBmaXggZm9yIGF1dG9kb2MgbGV2ZWxzID4gMC4KICAgICAgICAgICAgLSBEaXNwbGF5IG9mIHRlbXBsYXRlIHR5cGVzIGZpeGVkIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gRml4IFNGICMzMzEwNTI4IC0gZGlzcGxheSBvZiB0eXBlZGVmIHN0cnVjdHMgZm9yIGF1dG9kb2MgbGV2ZWxzID4gMS4KICAgICAgICAgICAgLSBBZGQgbWlzc2luZyB0eXBlIGZvciBzZWxmIGZvciBhdXRvZG9jIGxldmVscyAxIGFuZCAzLgogICAgICAgICAgICAtIGF1dG9kb2MgbGV2ZWxzIDIgYW5kIDMgZG9jdW1lbnRlZC4KICAgICAgICAgICAgLSBNaW5vciB0d2Vha3MgdG8gYXV0b2RvYyBzdHlsZSB0byBjb25mb3JtIHdpdGggUEVQOC4KCjIwMTEtMDUtMzA6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgZGlyZWN0b3JzIHdoZW4gLXByZWZpeCBpcyB1c2VkLgoKMjAxMS0wNS0yNDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBtZXRob2RzIG9mIGNsYXNzZXMgd2l0aCBhIHZpcnR1YWwgYmFzZSBjbGFzcyAoU0YjMzEyNDY2NSkuCgpWZXJzaW9uIDIuMC40ICgyMSBNYXkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtHdWlsZV0gUGF0Y2ggIzMxOTE2MjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIGludGVnZXIgdHlwZXMuCgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBQYXRjaCAjMzI2MDI2NSBmaXhpbmcgb3ZlcmxvYWRpbmcgb2Ygbm9uLXByaW1pdGl2ZSB0eXBlcyBhbmQgaW50ZWdlcnMgaW4gCiAgICAgICAgICAgIFBlcmwgNS4xMiBhbmQgbGF0ZXIuCgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggJWltcG9ydCB3aGVyZSBvbmUgb2YgdGhlIGltcG9ydGVkIGZpbGVzICVpbmNsdWRlIG9uZSBvZiB0aGUgU1RMIGluY2x1ZGUKICAgICAgICAgICAgZmlsZXMgc3VjaCBhcyBzdGRfdmVjdG9yLmkuCgoyMDExLTA1LTE3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBcHBseSAjMzI4OTg1MSBmcm9tIEFsYW4gSGFyZGVyIHRvIGZpeCBtZW1vcnkgbGVhayBpbiBkaXJlY3RvcnMgd2hlbiBjaGVja2luZwogICAgICAgICAgICBmb3IgcGVuZGluZyBleGNlcHRpb25zLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbVGNsXSBBcHBseSAjMzMwMDA3MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggbXVsdGlwbGUgbW9kdWxlIGxvYWRpbmcgbm90CiAgICAgICAgICAgIGFsd2F5cyBzaGFyaW5nIHZhcmlhYmxlcyBhY3Jvc3MgbW9kdWxlcy4KCjIwMTEtMDUtMTY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gRml4IGFuIGluY29tcGF0aWJpbGl0eSB3aXRoIG5ldmVyIHZlcnNpb25zIG9mIE9jdGF2ZS4gQ2FzZSBvbiBPY3RhdmUKCSAgICBBUEkgPj0gNDAgdG8gaGFuZGxlIHJlbmFtZSBvZiBPY3RhdmVfbWFwIHRvIG9jdGF2ZV9tYXAuCgkgICAgW29jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIHkuX19yb3BfXyh4KSBvcGVyYXRvcnMgd2hlbiB4Ll9fb3BfXyh5KSBkb2Vzbid0IGV4aXN0LgoJICAgIFtvY3RhdmVdIEFsbG93IGdsb2JhbCBvcGVyYXRvcnMgdG8gYmUgZGVmaW5lZCBieSBTV0lHLXdyYXBwZWQgZnVuY3Rpb25zLgoJICAgIFtvY3RhdmVdIEZpeCBzZXZlcmFsIGJ1Z3MgYXJvdW5kIG1vZHVsZSBuYW1lc3BhY2VzOyBhZGQgLWdsb2JhbCwgLW5vZ2xvYmFsLAoJICAgIC1nbG9iYWxzIDxuYW1lPiBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byB0aGUgbW9kdWxlLgoKMjAxMS0wNS0xNDogd3NmdWx0b24KCSAgICAldmFyYXJncyB3aGVuIHVzZWQgd2l0aCBhIG51bWVyaWMgYXJndW1lbnQgdXNlZCB0byBjcmVhdGUgYW4gYWRkaXRpb25hbCBhcmd1bWVudCAKICAgICAgICAgICAgd2hpY2ggd2FzIGludGVuZGVkIHRvIHByb3ZpZGUgYSBndWFyYW50ZWVkIHNlbnRpbmVsIHZhbHVlLiBUaGlzIG5ldmVyIHdvcmtlZCBhbmQgbm93CiAgICAgICAgICAgIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50IGlzIG5vdCBnZW5lcmF0ZWQuCgoyMDExLTA1LTEzOiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEFkZGl0aW9uYWwgZml4ZXMgZm9yIHB5dGhvbjMuMiBzdXBwb3J0LgoKMjAxMS0wNS0wNzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgUHlHZXRTZXREZXNjciBmb3IgcHl0aG9uMy4yLgoKMjAxMS0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YSwgUHl0aG9uLCBUY2xdIEMvQysrIHByb3RvdHlwZXMgc2hvd24gaW4gZXJyb3IgbWVzc2FnZSB3aGVuIGNhbGxpbmcgYW4gb3ZlcmxvYWRlZAogICAgICAgICAgICBtZXRob2Qgd2l0aCBpbmNvcnJlY3QgYXJndW1lbnRzIGltcHJvdmVkIHRvIHNob3cgYWx3YXlzIHNob3cgZnVsbHkgcXVhbGlmaWVkIG5hbWUKICAgICAgICAgICAgYW5kIGlmIGEgY29uc3QgbWV0aG9kLiAKCiAgICAgICAgICAgIEFsc28gZml4ZWQgb3RoZXIgTHVhIGVycm9yIG1lc3NhZ2VzIGluIGdlbmVyYXRlZCBjb2RlIHdoaWNoIHdlcmVuJ3QgY29uc2lzdGVudGx5CiAgICAgICAgICAgIHVzaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgQysrIG5hbWUgLSByZXF1ZXN0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBCdWcgMjYzNTkxOTogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgc3RkOjptYXAgdG8gYSBweXRob24gZGljdC4KCjIwMTEtMDQtMjk6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIGJ1ZyAyODExNTQ5OiByZXR1cm4gbm9uLWNvbnN0IGl0ZXJhdG9ycyBmcm9tIFNUTAoJICAgIG1ldGhvZHMgYmVnaW4oKSwgZW5kKCksIHJiZWdpbigpLCByZW5kKCkuCgoyMDExLTA0LTI1OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMTQ5ODkyOTogQWNjZXNzIHRvIG1lbWJlciBmaWVsZHMgaW4gbWFwIGVsZW1lbnRzCgoyMDExLTA0LTIzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBDb3JyZWN0bHkgZ2VuZXJhdGUgaWRlbnRpZmllcnMgZm9yIGJhc2UgY2xhc3NlcyB3aGVuCiAgICAgICAgICAgIG5vdCBpbiBzcGxpdCBwcm94eSBtb2RlLgoKMjAxMS0wNC0xMzogc3phZ2VyCgkgICAgRml4ZWQgYnVnIDMyODYzMzM6IGluZmluaXRlIHJlY3Vyc2lvbiB3aXRoIG11dHVhbCAndXNpbmcgbmFtZXNwYWNlJyBjbGF1c2VzLgoKMjAxMS0wNC0xMjogc3phZ2VyCgkgICAgRml4ZWQgYnVnIDExNjM0NDA6IHZhcmFyZyB0eXBlbWFwcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAjMzI4NTM4NjogcGFyc2UgZXJyb3IgZnJvbSAnb3BlcmF0b3IgVComKCknLiAgQWRkZWQgb3BlcmF0b3JfcG9pbnRlcl9yZWYKCSAgICB0ZXN0IGNhc2UgdG8gZGVtb25zdHJhdGUuCgoyMDExLTA0LTExOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBQeVZhck9iamVjdF9IRUFEX0lOSVQgdG8gZWxpbWluYXRlIFZDKysgY29tcGlsZXIgZXJyb3JzIGFib3V0CgkgICAgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdCBtZW1iZXJzIHdpdGggcG9pbnRlcnMuCgoyMDExLTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzI4NDMyNiBmcm9tIENvbGluIE1jRG9uYWxkIHRvIGZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeGVkIHdyYXBwaW5nIG9mIGVudW1zIHRoYXQgYXJlIHR5cGUgY2hhciwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIGVudW0geyBYID0gJ1gnOyB9ICh0aGlzIHdhcyBhbHJlYWR5IGluIDIuMC4zIGZvciBDIyBhbmQgSmF2YSkKCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBuc3BhY2U6IEZpeGVkIHJlZmVyZW5jaW5nIHR5cGVzIGluIHRoZSByb290IG5hbWVzcGFjZSB3aGVuCiAgICAgICAgICAgIG5vdCBpbiBzcGxpdCBwcm94eSBtb2RlLgoKMjAxMS0wNC0wOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCAjMTkzMjQ4NDogbWlncmF0ZSBQeUNPYmplY3QgdG8gUHlDYXBzdWxlLgoKMjAxMS0wNC0wOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gQWRkZWQgcHJlcHJvY2Vzc29yIGd1YXJkcyBmb3IgcHl0aG9uIGZ1bmN0aW9ucyBQeVVuaWNvZGVfQXNXaWRlQ2hhciBhbmQKCSAgICBQeVNsaWNlX0dldEluZGljZXMsIHdoaWNoIGNoYW5nZWQgc2lnbmF0dXJlcyBpbiBweXRob24zLjIuCgoyMDExLTA0LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY29uc3QgYXJyYXkgdHlwZWRlZnMgd2hpY2ggd2VyZSBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlIGFzCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEthcmwgV2V0dGUuCgoyMDExLTA0LTAzOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCB0aGUgYmVoYXZpb3Igb2YgJXB5dGhvbm5vbmR5bmFtaWMgdG8gY29uZm9ybSB0byB0aGUgc3BlYyBpbiBMaWIvcHl1c2VyZGlyLnN3Zy4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIE1lcmdlZCBpbiB0aGUgc3phZ2VyLXB5dGhvbi1idWlsdGluIGJyYW5jaCwgYWRkaW5nIHRoZSAtYnVpbHRpbiBmZWF0dXJlCgkgICAgZm9yIHB5dGhvbi4gIFRoZSAtYnVpbHRpbiBvcHRpb24gbWF5IHByb3ZpZGUgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBnYWluCgkgICAgaW4gcHl0aG9uIHdyYXBwZXJzLiAgRm9yIGZ1bGwgZGV0YWlscyBhbmQgbGltaXRhdGlvbnMsIHJlZmVyIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwuCgkgICAgQSBzbWFsbCB0ZXN0IHN1aXRlIGRlc2lnbmVkIHRvIGRlbW9uc3RyYXRlIHRoZSBwZXJmb3JtYW5jZSBnYWluIGlzIGluCgkgICAgRXhhbXBsZXMvcHl0aG9uL3BlcmZvcm1hbmNlLgoKMjAxMS0wNC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIG1pc3Npbmcgd3JhcHBlcnMgZm9yIGZyaWVuZCBmdW5jdGlvbnMgZm9yIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcywgbW9zdGx5CiAgICAgICAgICAgIHRoZSBub24tc2NyaXB0aW5nIGxhbmd1YWdlcyBsaWtlIEphdmEgYW5kIEMjLgoKVmVyc2lvbiAyLjAuMyAoMjkgTWFyY2ggMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBcHBseSBwYXRjaCAjMzIzOTA3NiBmcm9tIE1hcmllIFdoaXRlIGZpeGluZyBzdHJpbmdzIGZvciBSID49IDIuNy4wCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzI0ODI4MCBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB3aGljaCBhZGRzIGJldHRlciBlcnJvciBtZXNzYWdlcyB3aGVuCiAgICAgICAgICAgIHRoZSBpbmNvcnJlY3QgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gb3ZlcmxvYWRlZCBtZXRob2RzLgoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyMjQ2NjMgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUuCiAgICAgICAgICAgIDEuIEZpeCB3aGVuIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHZhbHVlLCBhICJOVUxMIiBjb21tYW5kIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgVGNsIGludGVycHJldGVyCiAgICAgICAgICAgIGFuZCBjYWxsaW5nIHRoaXMgY29tbWFuZCB3aWxsIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0LiAKCiAgICAgICAgICAgIDIuIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciBjbGFzcyBtZXRob2RzIHVzaW5nIGEgbGluZWFyIHNlYXJjaCBjYXVzaW5nIHBlcmZvcm1hbmNlIGlzc3VlcwogICAgICAgICAgICBpbiB3cmFwcGVycyBmb3IgY2xhc3NlcyB3aXRoIG1hbnkgbWVtYmVyIGZ1bmN0aW9ucy4gVGhlIHBhdGNoIGFkZHMgYSBtZXRob2QgaGFzaCB0YWJsZSB0byBjbGFzc2VzIGFuZAogICAgICAgICAgICBjaGFuZ2VzIG1ldGhvZCBuYW1lIGxvb2t1cCB0byB1c2UgdGhlIGhhc2ggdGFibGUgaW5zdGVhZCBvZiBkb2luZyBhIGxpbmVhciBzZWFyY2guCgoyMDExLTAzLTI2OiB3c2Z1bHRvbgoJICAgIFtDIywgSmF2YV0gU0YgYnVnICMzMTk1MTEyIC0gZml4IHdyYXBwaW5nIG9mIGVudW1zIHRoYXQgYXJlIHR5cGUgY2hhciwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgZW51bSB7IFggPSAnWCc7IH0KCjIwMTEtMDMtMjE6IHZhZHoKCSAgICBBbGxvdyBzZXR0aW5nIFBDUkVfQ0ZMQUdTIGFuZCBQQ1JFX0xJQlMgZHVyaW5nIGNvbmZpZ3VyYXRpb24gdG8gb3ZlcnJpZGUgdGhlIHZhbHVlcyByZXR1cm5lZCBieQoJICAgIHBjcmUtY29uZmlnLCBlLmcuIHRvIGFsbG93IHVzaW5nIGEgc3RhdGljIHZlcnNpb24gb2YgUENSRSBsaWJyYXJ5LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBbVVRMXSBBZGQgbWlzc2luZyBoZWFkZXJzIGluIGdlbmVyYXRlZCBTVEwgd3JhcHBlcnMgdG8gZml4IGNvbXBpbGF0aW9uIHdpdGggZ2NjLTQuNi4KCjIwMTEtMDMtMTc6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC4yIHdoZXJlIGZpbGVuYW1lcyB3aXRoIHNwYWNlcyB3ZXJlIG5vdCBmb3VuZAoJICAgIHdoZW4gdXNlZCB3aXRoICVpbmNsdWRlIGFuZCAlaW1wb3J0LiBSZXBvcnRlZCBieSBTaGFuZSBMaWVzZWdhbmcuCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtVVExdIEZpeCBvdmVybG9hZGluZyB3aGVuIHVzaW5nIGNvbnN0IGNoYXJbXSwgcHJvYmxlbSByZXBvcnRlZCBieSBEYXZpZCBNYXh3ZWxsLgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIGNoYXJbQU5ZXSBhbmQgY29uc3QgY2hhcltBTlldLgoKMjAxMS0wMy0xNTogd3NmdWx0b24KCSAgICBbQyNdIEFwcGx5IHBhdGNoICMzMjEyNjI0IGZpeGluZyBzdGQ6Om1hcCBLZXlzIHByb3BlcnR5LgoKMjAxMS0wMy0xNDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBvdmVybG9hZGVkIG1ldGhvZHMvZnVuY3Rpb25zIHdoZXJlIHNvbWUKCSAgICByZXR1cm4gdm9pZCBhbmQgb3RoZXJzIGRvbid0IC0gd2hldGhlciB0aGlzIHdvcmtlZCBvciBub3QgZGVwZW5kZWQKCSAgICBvbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGVuY291bnRlcmVkIGluIChTRiMzMjA4Mjk5KS4KCQoyMDExLTAzLTEzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRXh0ZW5kZWQgc3VwcG9ydCBmb3IgQysrIG5hbWVzcGFjZXMgKG5zcGFjZSBmZWF0dXJlKS4KCjIwMTEtMDMtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggc2hhcmluZyBvZiB0eXBlIGluZm9ybWF0aW9uIGJldHdlZW4gbXVsdGlwbGUgU1dJRy13cmFwcGVkCgkgICAgbW9kdWxlcyAoU0YjMzIwMjQ2MykuCgoyMDExLTAzLTA5OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBTRiAjMzE5NDI5NCAtIGNvcm5lciBjYXNlIGJ1ZyB3aGVuICdOVUxMJyBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGZvciBhIHByaW1pdGl2ZSB0eXBlIHBhcmFtZXRlciBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbi4KCjIwMTEtMDMtMDc6IG9sbHkKCSAgICBbUEhQXSBEb24ndCB1c2UgemVuZF9lcnJvcl9ub3JldHVybigpIGZvciBjYXNlcyB3aGVyZSB0aGUgZnVuY3Rpb24KCSAgICByZXR1cm5zIHZvaWQgLSBub3cgdGhpcyBpc3N1ZSBjYW4gb25seSBtYXR0ZXIgaWYgeW91IGhhdmUgYSBmdW5jdGlvbgoJICAgIG9yIG1ldGhvZCB3aGljaCBpcyBkaXJlY3RlZCBhbmQgcmV0dXJucyBub24tdm9pZC4KCjIwMTEtMDMtMDY6IG9sbHkKCSAgICBbUEhQXSBBZGQgY2FzdHMgdG8gdGhlIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcKCSAgICBsb25nIHRvIGF2b2lkIGlzc3VlcyB3aGVuIHRoZXkgYXJlIHVzZWQgd2l0aCBzaG9ydGVyIHR5cGVzIHZpYQoJICAgICVhcHBseS4KCjIwMTEtMDMtMDI6IHdzZnVsdG9uCgkgICAgVGVtcGxhdGVkIHNtYXJ0IHBvaW50ZXJzIG92ZXJsb2FkZWQgd2l0aCBib3RoIGNvbnN0IGFuZCBub24gY29uc3Qgb3BlcmF0b3ItPiBnZW5lcmF0ZWQgdW5jb21waWxhYmxlCgkgICAgY29kZSB3aGVuIHRoZSBwb2ludGVlIHdhcyBhIGNsYXNzIHdpdGggZWl0aGVyIHB1YmxpYyBtZW1iZXIgdmFyaWFibGVzIG9yIHN0YXRpYyBtZXRob2RzLgoJICAgIFJlZ3Jlc3Npb24gaW4gMi4wLnggcmVwb3J0ZWQgYXMgd29ya2luZyBpbiAxLjMuNDAgYnkgeGFudGFyZXMgb24gc3dpZy11c2VyIG1haWxpbmcgbGlzdC4KClZlcnNpb24gMi4wLjIgKDIwIEZlYnJ1YXJ5IDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTAyLTE5OiB3c2Z1bHRvbgoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHRoZSB0eXBlbWFwcy5pIGxpYnJhcnkKICAgICAgICAgICAgZm9yIHByaW1pdGl2ZSByZWZlcmVuY2UgdHlwZXMgYXMgd2VsbCBhcyBzaWduZWQgY2hhciAqIGFuZCBib29sICouCgoyMDExLTAyLTE5OiBvbGx5CgkgICAgW1BIUF0gQWRkcmVzcyBidWcgaW4gUEhQIG9uIHNvbWUgcGxhdGZvcm1zL2FyY2hpdGVjdHVyZXMgd2hpY2gKCSAgICByZXN1bHRzIGluIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBub3QgYmVpbmcgYXZhaWxhYmxlIHVzaW5nCgkgICAgU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOIHdoaWNoIGRlZmF1bHRzIHRvIHplbmRfZXJyb3Jfbm9yZXR1cm4gYnV0CgkgICAgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiBidWlsZGluZyB0aGUgbW9kdWxlIGJ5IHBhc3NpbmcKCSAgICAtRFNXSUdfWkVORF9FUlJPUl9OT1JFVFVSTj16ZW5kX2Vycm9yIHRvIHRoZSBjb21waWxlci4gIFRoaXMgbWF5CgkgICAgcmVzdWx0IGluIGNvbXBpbGVyIHdhcm5pbmdzLCBidXQgc2hvdWxkIGF0IGxlYXN0IGFsbG93IGEgbW9kdWxlCgkgICAgdG8gYmUgYnVpbHQgb24gdGhvc2UgcGxhdGZvcm1zL2FyY2hpdGVjdHVyZXMgKFNGIzMxNjY0MjMpLgoKMjAxMS0wMi0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMTg0NTQ5IC0gdmFyYXJnIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgd2hlbiB1c2luZyB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24uCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gQW4gb3ZlcmxvYWRlZCBtZXRob2Qgd2hpY2ggY2FuIHJldHVybiBhbiBvYmplY3Qgb3IgYQoJICAgIHByaW1pdGl2ZSB0eXBlIG5vIGxvbmdlciBjYXVzZXMgU1dJRyB0byBzZWdmYXVsdC4gIFJlcG9ydGVkIGJ5IFBhdWwKCSAgICBDb2xieSBpbiBTRiMzMTY4NTMxLgoKMjAxMS0wMi0xODogb2xseQoJICAgIFtQSFBdIEZpeCBpbnZhbGlkIGVyYXNlIGR1cmluZyBpdGVyYXRpb24gb2Ygc3RkOjptYXAgaW4gZ2VuZXJhdGVkCgkgICAgZGlyZWN0b3IgY29kZS4gIFJlcG9ydGVkIGJ5IENvcnkgQmVubmV0dCBpbiBTRiMzMTc1ODIwLgoKMjAxMS0wMi0xNzogd3NmdWx0b24KICAgICAgICAgICAgUHJlcHJvY2Vzc2luZyBub3cgd2FybnMgaWYgZXh0cmEgdG9rZW5zIGFwcGVhciBhZnRlciAjZWxzZSBhbmQgI2VuZC4KCjIwMTEtMDItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTY1MzA5MiBQcmVwcm9jZXNzb3IgZG9lcyBub3QgZXJyb3Igb3V0IHdoZW4gI2VsaWYgaXMgbWlzc2luZyBhbiBleHByZXNzaW9uLgogICAgICAgICAgICBUaGlzIGFuZCBvdGhlciBjYXNlcyBvZiBtaXNzaW5nIHByZXByb2Nlc3NvciBleHByZXNzaW9ucyBub3cgcmVzdWx0IGluIGFuIGVycm9yLgoKMjAxMS0wMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgW09jYW1sXSBBcHBseSBwYXRjaCAjMzE1MTc4OCBmcm9tIEpvZWwgUmV5bW9udC4gQnJpbmdzIE9jYW1sIHN1cHBvcnQgdXAgdG8gZGF0ZSAKICAgICAgICAgICAgKHZlciAzLjExIGFuZCAzLjEyKSwgaW5jbHVkaW5nIHN0ZDo6c3RyaW5nLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzMTc2Mjc0IGZyb20gSmFtZXMgTWFzdGVycyAtIHR5cGVjaGVjayB0eXBlbWFwIGZvciB0aW1lX3QuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzE3MTc5MyBmcm9tIHN6YWdlciAtIHByb3RlY3RlZCBkaXJlY3RvciBtZXRob2RzIGZhaWxpbmcgd2hlbiAtZnZpcnR1YWwgaXMgdXNlZC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTkyNzg1MiAtICNpbmNsdWRlIGRpcmVjdGl2ZXMgZG9uJ3QgcHJlcHJvY2VzcyB0aGUgZmlsZSBwYXNzZWQgdG8gaXQuIFRoZSBmaXggaXMgZm9yCiAgICAgICAgICAgICNpbmNsdWRlIHdpdGggLWltcG9ydGFsbCBvciAtaW5jbHVkZWFsbCwgJWluY2x1ZGUgYW5kICVpbXBvcnQsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgRklMRU5BTUUgImFiYy5oIgogICAgICAgICAgICAgICVpbmNsdWRlIEZJTEVOQU1FCgoyMDExLTAyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5NDA1MzYsIG92ZXJhY3RpdmUgcHJlcHJvY2Vzc29yIHdoaWNoIHdhcyBleHBhbmRpbmcgZGVmaW5lZCguLi4pIG91dHNpZGUgb2YgI2lmIGFuZCAjZWxpZgogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNelNjaGVtZV0gU0YgIzI5NDI4OTkgQWRkIHVzZXIgc3VwcGxpZWQgZG9jdW1lbnRhdGlvbiB0byBoZWxwIGdldHRpbmcgc3RhcnRlZCB3aXRoIE16U2NoZW1lLgogICAgICAgICAgICBVcGRhdGUgY2hhcHRlciBuYW1lIHRvIE16U2NoZW1lL1JhY2tldCBhY2NvdW50aW5nIGZvciB0aGUgcmVuYW1lIG9mIE16U2NoZW1lIHRvIFJhY2tldC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU0YgIzMwODU5MDYgLSBQb3NzaWJsZSBmaXggcnVubmluZyB0ZXN0LXN1aXRlIG9uIE1hYyBPUyBYLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzMxNzMzNjcgQmV0dGVyIGluZm9ybWF0aW9uIGR1cmluZyBjb25maWd1cmUgYWJvdXQgQm9vc3QgcHJlcmVxdWlzaXRlIGZvciBydW5uaW5nCiAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzMxMjc2MzMgRml4IGluZmluaXRlIGxvb3AgaW4gcmVjdXJzaXZlIHR5cGVkZWYgcmVzb2x1dGlvbi4KCjIwMTEtMDItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBTRiAjMzE2ODY3NiBGaXggJXJlbmFtZSBub3Qgd29ya2luZyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhbmQgbWV0aG9kcy4KCjIwMTEtMDItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjbGlzcF0gU0YgIzMxNDgyMDAgRml4IHNlZ2ZhdWx0IHBhcnNpbmcgbmVzdGVkIHVuaW9ucy4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3JzIC0gYSBjYWxsIHRvIGEgbWV0aG9kIGJlaW5nIGRlZmluZWQgaW4gdGhlIGJhc2UgY2xhc3MsIG5vdAogICAgICAgICAgICBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MsIGJ1dCBhZ2FpbiBvdmVycmlkZGVuIGluIGEgY2xhc3MgZGVyaXZlZCBmcm9tCiAgICAgICAgICAgIHRoZSBmaXJzdCBzdWJjbGFzcyB3YXMgbm90IGJlaW5nIGRpc3BhdGNoZWQgY29ycmVjdGx5IHRvIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCiAgICAgICAgICAgIFNlZSBkaXJlY3Rvcl9hbHRlcm5hdGluZy5pIGZvciBhbiBleGFtcGxlLgoKMjAxMS0wMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBbnkgJ3VzaW5nJyBzdGF0ZW1lbnRzIGluIHRoZSBwcm90ZWN0ZWQgc2VjdGlvbiBvZiBhIGNsYXNzIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICBpZ25vcmVkIHdpdGggZGlyZWN0b3IgcHJvdGVjdGVkIChkaXJwcm90KSBtb2RlLgoKMjAxMS0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IG92ZXJsb2FkaW5nIHdpdGggY29uc3QgcG9pbnRlciByZWZlcmVuY2UgKFNXSUdUWVBFICpjb25zdCYpIHBhcmFtZXRlcnMgZm9yIGEKICAgICAgICAgICAgbnVtYmVyIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMuCgoyMDExLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgd2FybmluZyBmb3Igc21hcnQgcG9pbnRlcnMgaWYgb25seSBzb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZQogICAgICAgICAgICBjaGFpbiBhcmUgbWFya2VkIGFzIHNtYXJ0IHBvaW50ZXIsIGVnLCAlc2hhcmVkX3B0ciBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBzbyB0aGlzIG5ldyB3YXJuaW5nIGhpZ2hsaWdodHMgY29kZSB3aGVyZSB0aGlzIGlzCiAgICAgICAgICAgIG5vdCB0aGUgY2FzZS4KCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjEyOiBXYXJuaW5nIDUyMDogQmFzZSBjbGFzcyAnQScgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KICAgICAgICAgICAgICBleGFtcGxlLmk6MTY6IFdhcm5pbmcgNTIwOiBEZXJpdmVkIGNsYXNzICdDJyBvZiAnQicgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyLgoKMjAxMS0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc29tZSBtaXNzaW5nIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzOiAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBhbmQgCiAgICAgICAgICAgIChjaGFyICpTVFJJTkcsIGludCBMRU5HVEgpLiBEb2N1bWVudGF0aW9uIGZvciB0aGlzIHVwZGF0ZWQuIEphdmEgcGF0Y2ggZnJvbQogICAgICAgICAgICBWb2xrZXIgR3JhYnNjaC4KCjIwMTEtMDEtMTE6IGlhbnQKCSAgICBSZXF1aXJlIEdvIHZlcnNpb24gNzA3NyBvciBsYXRlci4KCjIwMTAtMTItMzA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtDIywgRCwgSmF2YV0gQ2hlY2sgZm9yIGNvbGxpc2lvbiBvZiBwYXJhbWV0ZXIgbmFtZXMgd2l0aCB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2Uga2V5d29yZHMgd2hlbiBnZW5lcmF0aW5nIHRoZSBkaXJlY3RvciBnbHVlIGNvZGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgc2l0dWF0aW9uIGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgY291bGQgd291bGQgcHJldmlvdXNseSBiZQogICAgICAgICAgICBpbnZhbGlkIGlzIGlsbHVzdHJhdGVkIGluIHRoZSBuZXcgJ2RpcmVjdG9yX2tleXdvcmRzJyB0ZXN0IGNhc2UuCgoyMDEwLTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIG5vdCBiZWluZyBleHBhbmRlZCBmb3IgY3N2YXJpbiB0eXBlbWFwcwogICAgICAgICAgICB3aGVuIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgoyMDEwLTEyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJGJhc2VtYW5nbGUgZXhwYW5zaW9uIGluIGFycmF5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSBpZiB0eXBlIGlzIGludCAqWzNdLAogICAgICAgICAgICAkYmFzZW1hbmdsZSBleHBhbmRzIHRvIF9wX2ludC4KCjIwMTAtMTItMDc6IGlhbnQKCSAgICBDaGVjayB0aGF0IHdlIGFyZSB1c2luZyBhIHN1ZmZpY2llbnRseSBuZXcgdmVyc2lvbiBvZiB0aGUKCSAgICA2ZyBvciA4ZyBHbyBjb21waWxlciBkdXJpbmcgY29uZmlndXJlIHRpbWUuIElmIG5vdCwgZGlzYWJsZSBHby4KICAgICAgICAgICAgTWluaW11bSB2ZXJzaW9uIGlzIG5vdyA2NzA3LgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMTItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzEyNzM5NCAtIHVzZSBvZiBuZXR3b3JrIHBhdGhzIG9uIFdpbmRvd3MvTVN5cy4KCjIwMTAtMTEtMTg6IGtsaWNrdmVyYm90CgkgICAgW0RdIEFkZGVkIHRoZSBEIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMTEtMTI6IHZhZHoKCSAgICBGaXggaGFuZGxpbmcgb2YgbXVsdGlwbGUgcmVnZXgtdXNpbmcgJXJlbmFtZXMgYXR0YWNoZWQgdG8gdGhlIHNhbWUKCSAgICBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGUsIG5vdwoKCSAgICAgICVyZW5hbWUoIiUocmVnZXg6L15TZXQoLiopL3B1dFxcMS8pcyIpICIiOwoJICAgICAgJXJlbmFtZSgiJShyZWdleDovXkdldCguKikvZ2V0XFwxLylzIikgIiI7CgoJICAgIHdvcmtzIGFzIGV4cGVjdGVkIHdoZXJlYXMgYmVmb3JlIG9ubHkgdGhlIGxhc3QgYW5vbnltb3VzIHJlbmFtZSB3YXMKCSAgICB0YWtlbiBpbnRvIGFjY291bnQuCgoyMDEwLTEwLTE3OiBkcmpvZQoJICAgIFtSXSBGaXggZmFpbHVyZSBpbiBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aGljaCB3YXMgYnJlYWtpbmcKCSAgICBRdWFudExpYi1TV0lHCgoyMDEwLTEwLTE0OiBvbGx5CgkgICAgW1BIUF0gQWxsb3cgY29tcGlsYXRpb24gb24gbm9uLWNvbmZvcm1pbmcgTWljcm9zb2Z0IEMrKyBjb21waWxlcnMKCSAgICB3aGljaCBkb24ndCBhY2NlcHQ6IHJldHVybiBmdW5jdGlvbl9yZXR1cm5pbmdfdm9pZCgpOwoJICAgIFJlcG9ydGVkIGJ5IEZyYW5rIFZhbmRlbiBCZXJnaGVuIG9uIHRoZSBTV0lHIG1haWxpbmcgbGlzdC4KCjIwMTAtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIChnbG9iYWwgc2NvcGUpIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAyLjAuMCwgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgQmVuIFdhbGtlci4gVGhlIG1hbmdsZWQgc3ltYm9sIG5hbWVzIHdlcmUgaW5jb3JyZWN0LCBzb21ldGltZXMgcmVzdWx0aW5nIGluIHR5cGVzIGJlaW5nCiAgICAgICAgICAgIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgb3BhcXVlIHR5cGVzLgoKICAgICAgICAgICAgQWxzbyBmaXhlcyAjMjk1ODc4MSBhbmQgc29tZSBvdGhlciB0eXBlIHByb2JsZW1zIGR1ZSB0byBiZXR0ZXIgdHlwZWRlZiByZXNvbHV0aW9uLCBlZyAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VCAqPjo6dmFsdWVfdHlwZSBkaWRuJ3QgcmVzb2x2ZSB0byBUICogd2hlbiBpdCBzaG91bGQgaGF2ZS4gVGhlIG1hbmdsZWQgdHlwZQogICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgU1dJR1RZUEVfc3RkX192ZWN0b3JUX1Rlc3RfcF9zdGRfX2FsbG9jYXRvclRfVGVzdF9wX3RfdF9fdmFsdWVfdHlwZSBhbmQgbm93CiAgICAgICAgICAgIGl0IGlzIGNvcnJlY3RseSBTV0lHVFlQRV9wX1Rlc3QuCgpWZXJzaW9uIDIuMC4xICg0IE9jdG9iZXIgMjAxMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEwLTEwLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzA2Njk1OCBmcm9tIE1pa2FlbCBKb2hhbnNzb24gdG8gZml4IGRlZmF1bHQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICBoYW5kbGluZyB3aGVuIHRoZSBzbWFydCBwb2ludGVyIGNvbnRhaW5zIGJvdGggYSBjb25zdCBhbmQgbm9uLWNvbnN0IG9wZXJhdG9yLT4uCgoyMDEwLTEwLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgLXBjcmV2ZXJzaW9uIG9wdGlvbiB0byBkaXNwbGF5IFBDUkUgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUnVieV0gQXZvaWQgc2VnZmF1bHQgd2hlbiBhIG1ldGhvZCBub2RlIGhhcyBubyBwYXJlbnROb2RlCgkgICAgKFNGIzMwMzQwNTQpLgoKMjAxMC0xMC0wMTogb2xseQoJICAgIFtQeXRob25dIEFsbG93IHJlaW5pdGlhbGlzYXRpb24gdG8gd29yayB3aXRoIGFuIGVtYmVkZGVkIFB5dGhvbgoJICAgIGludGVycHJldGVyIChwYXRjaCBmcm9tIEppbSBDYXJyb2xsIGluIFNGIzMwNzUxNzgpLgoKMjAxMC0wOS0yODogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBcHBseSBwYXRjaCBmcm9tIFRvbWFzIERpcnZhbmF1c2thcyBmb3Igc3RkOjptYXAgd3JhcHBlcnMgdG8gYXZvaWQKICAgICAgICAgICAgdGhyb3dpbmcgZXhjZXB0aW9ucyB3aXRoIG5vcm1hbCB1c2FnZSBvZiBpdGVyYXRvcnMuCgoyMDEwLTA5LTI3OiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wcm92ZSBlcnJvciBtZXNzYWdlIGdpdmVuIHdoZW4gYSBwYXJhbWV0ZXIgb2YgdGhlIHdyb25nCgkgICAgdHlwZSBpcyBwYXNzZWQgdG8gYW4gb3ZlcmxvYWRlZCBtZXRob2QgKFNGIzMwMjczNTUpLgoKMjAxMC0wOS0yNTogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgU0YgcGF0Y2ggIzMwNzUxNTAgLSBKYXZhIGRpcmVjdG9ycyB1c2luZyBzdGF0aWMgdmFyaWFibGVzIGluCiAgICAgICAgICAgIG5hbWVkIG5hbWVzcGFjZS4KCjIwMTAtMDktMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZmlsZSBhbmQgbGluZSBlcnJvci93YXJuaW5nIHJlcG9ydGluZyBmaXhlcyB3aGVyZSBTV0lHIG1hY3JvcwogICAgICAgICAgICBhcmUgdXNlZCB3aXRoaW4ge30gYnJhY2VzICh3aGVyZSB0aGUgcHJlcHJvY2Vzc29yIGV4cGFuZHMgbWFjcm9zKSwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgbWFjcm9zIHdpdGhpbiAlaW5saW5lIHsuLi59IGFuZCAlZnJhZ21lbnQoLi4uKSB7Li4ufQogICAgICAgICAgICBhbmQgbmVzdGVkIHN0cnVjdHMuCgoyMDEwLTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgZm9yIHZhcmlvdXMgaW5oZXJpdGVkCiAgICAgICAgICAgIGNsYXNzIHByb2JsZW1zLgoKMjAxMC0wOS0xNTogd3NmdWx0b24KICAgICAgICAgICAgQSBtdWNoIGltcHJvdmVkIGRlYnVnZ2luZyBvZiBTV0lHIHNvdXJjZSBleHBlcmllbmNlIGlzIG5vdyBhdmFpbGFibGUgYW5kCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gdGhlICJEZWJ1Z2dpbmcgU1dJRyIgc2VjdGlvbiBpbiB0aGUgRG9jL0RldmVsL2ludGVybmFscy5odG1sCiAgICAgICAgICAgIGZpbGUsIGluY2x1ZGluZyBhIHN3aWcuZGJnIHN1cHBvcnQgZmlsZSBmb3IgdGhlIGdkYiBkZWJ1Z2dlci4KCjIwMTAtMDktMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycy93YXJuaW5ncyB3aGVuIGEgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbiBlbmRzIHdpdGggJy8nIGFuZCBpdCBpcyBub3QgdGhlIGVuZCBvZiBhIEMgY29tbWVudC4KCjIwMTAtMDktMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycy93YXJuaW5ncyBhZnRlciBwYXJzaW5nCiAgICAgICAgICAgIG1hY3JvIGludm9jYXRpb25zIHdpdGggcGFyYW1ldGVycyBnaXZlbiBvdmVyIG1vcmUgdGhhbiBvbmUgbGluZS4KCjIwMTAtMDktMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBleHRyYW5lb3VzIGV4dHJhIGxpbmUgaW4gcHJlcHJvY2Vzc2VkIG91dHB1dCBhZnRlciBpbmNsdWRpbmcgZmlsZXMKICAgICAgICAgICAgd2hpY2ggd291bGQgc29tZXRpbWVzIGxlYWQgdG8gZXJyb3Ivd2FybmluZyBtZXNzYWdlcyB0d28gbGluZXMgYWZ0ZXIgdGhlCiAgICAgICAgICAgIGVuZCBvZiB0aGUgZmlsZS4KCjIwMTAtMDktMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjE0OTUyMyAtIEluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzIGFmdGVyIHBhcnNpbmcgbWFjcm9zCiAgICAgICAgICAgIGNvbnRhaW5pbmcgQysrIGNvbW1lbnRzLgoKMjAxMC0wOS0wODogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBPVVRQVVQgdHlwZW1hcHMgKFBhdGNoIGZyb20gUnlhbiBpbiBTRiMzMDU4Mzk0KS4KCjIwMTAtMDktMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBlcnJvbmVvdXMgbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGZvciBtYWNybyBleHBhbnNpb25zLCBmb3IgZXhhbXBsZSwKICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2Ugbm93IHBvaW50cyB0byBpbnN0YW50aWF0aW9uIG9mIHRoZSBtYWNybywgaWUgdGhlIGxhc3QgbGluZSBoZXJlOgoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPMihhLCBiKSAKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzEoTkFNRSkgTUFDUk8yKE5BTUUsMiwzKSAKCiAgICAgICAgICAgICAgTUFDUk8xKGFiYykKCjIwMTAtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgZm9yIHByZXByb2Nlc3NvciBtZXNzYWdlcyB3aXRoaW4KICAgICAgICAgICAgJWlubGluZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAjZGVmaW5lIEZPT0JBUiAxCiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgImhpIgogICAgICAgICAgICAgICV9CgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIHdoaWNoIHdlcmUgY3VtdWxhdGl2ZWx5IG9uZQogICAgICAgICAgICBsZXNzIHRoYW4gdGhleSBzaG91bGQgaGF2ZSBiZWVuIGFmdGVyIHBhcnNpbmcgZWFjaCAlaW5jbHVkZS8laW1wb3J0IC0gYnVnCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0xLjMuMzIuIEFsc28gZml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgICB3aGVuIG5ldyBsaW5lIGNoYXJhY3RlcnMgYXBwZWFyIGJldHdlZW4gdGhlICVpbmNsdWRlIC8gJWltcG9ydCBzdGF0ZW1lbnQgYW5kCiAgICAgICAgICAgIHRoZSBmaWxlbmFtZS4KCjIwMTAtMDgtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlciBhbmQgZmlsZSBuYW1lIHJlcG9ydGluZyBmb3Igc29tZSBtYWNybyBwcmVwcm9jZXNzb3Igd2FybmluZ3MuCiAgICAgICAgICAgIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgbWFjcm8gYXJndW1lbnQgaGFzIGJlZW4gY29ycmVjdGVkIGFuZCB0aGUgbGluZSBudW1iZXIKICAgICAgICAgICAgb2YgdGhlIHN0YXJ0IG9mIHRoZSBtYWNybyBpbnN0ZWFkIG9mIG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIG1hY3JvIGlzIHVzZWQuCiAgICAgICAgICAgIFNvbWUgZXhhbXBsZXM6CiAgICAgICAgICAgICAgZmlsZS5oOjExOiBFcnJvcjogSWxsZWdhbCBtYWNybyBhcmd1bWVudCBuYW1lICcuLicKICAgICAgICAgICAgICBmaWxlLmg6MTk6IEVycm9yOiBNYWNybyAnRFVQTElDQVRFJyByZWRlZmluZWQsCiAgICAgICAgICAgICAgZmlsZS5oOjE1OiBFcnJvcjogcHJldmlvdXMgZGVmaW5pdGlvbiBvZiAnRFVQTElDQVRFJy4KICAgICAgICAgICAgICBmaWxlLmg6MjU6IEVycm9yOiBWYXJpYWJsZS1sZW5ndGggbWFjcm8gYXJndW1lbnQgbXVzdCBiZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICAgIGZpbGUuaDozMjogRXJyb3I6IElsbGVnYWwgY2hhcmFjdGVyIGluIG1hY3JvIGFyZ3VtZW50IG5hbWUKICAgICAgICAgICAgICBmaWxlLmk6Mzc6IEVycm9yOiBNYWNybyAnU0lUJyBleHBlY3RzIDIgYXJndW1lbnRzCgoyMDEwLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggX19MSU5FX18gYW5kIF9fRklMRV9fIGV4cGFuc2lvbiByZXBvcnRlZCBieSBDYW1pbGxlIEdpbGxvdC4gTW9zdGx5IHRoaXMKICAgICAgICAgICAgZGlkIG5vdCB3b3JrIGF0IGFsbC4gQWxzbyBmaXhlcyBTRiAjMjgyMjgyMi4KCjIwMTAtMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggY29ybmVyIGNhc2UgbWFyc2hhbGxpbmcgb2YgZG91YmxlcyAtIGVycm5vIHdhcyBub3QgYmVpbmcgY29ycmVjdGx5CiAgICAgICAgICAgIHNldCBiZWZvcmUgY2FsbGluZyBzdHJ0b2QgLSBwYXRjaCBmcm9tIEp1c3RpbiBWYWxsb24gLSBTRiBCdWcgIzMwMzg5MzYuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbWFrZSBkaXN0Y2xlYW4gd2hlbiBzb21lIG9mIHRoZSBtb3JlIG9ic2N1cmUgbGFuZ3VhZ2VzIGFyZSBkZXRlY3RlZCBieQogICAgICAgICAgICBjb25maWd1cmUgLSBmaXhlcyBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMTAtMDctMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmUgY29uZmlndXJpbmcgb3V0IG9mIHNvdXJjZSBmb3IgdGhlIHRlc3Qtc3VpdGUgc2luY2UgaXQgYnJva2UgaW4gMS4zLjM3LgogICAgICAgICAgICBBcyBwcmV2aW91c2x5LCBpZiBydW5uaW5nICdtYWtlIGNoZWNrLXRlc3Qtc3VpdGUnIG91dCBvZiBzb3VyY2UsIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRvbmUgYnkgaW52b2tpbmcgY29uZmlndXJlIHdpdGggYSByZWxhdGl2ZSBwYXRoLiBJbnZva2luZyBjb25maWd1cmUgd2l0aCBhbgogICAgICAgICAgICBhYnNvbHV0ZSBwYXRoIHdpbGwgbm90IHdvcmsuIFJ1bm5pbmcgdGhlIGZ1bGwgJ21ha2UgY2hlY2snIHN0aWxsIG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRvbmUgaW4gdGhlIHNvdXJjZSB0cmVlLgoKMjAxMC0wNy0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgd2hlbiB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgcmV0dXJucyBieSByZWZlcmVuY2UuCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgdGhlIG9sZCBleHBlcmltZW50YWwgInJ4c3BlbmNlciIgZW5jb2RlciBhbmQKICAgICAgICAgICAgIltub3RdcnhzbWF0Y2giIGluICVyZW5hbWUgKHNlZSB0aGUgMDEvMTYvMjAwNiBlbnRyeSkuIFRoZSBuZXcgYW5kCiAgICAgICAgICAgIG9mZmljaWFsbHkgc3VwcG9ydGVkICJyZWdleCIgZW5jb2RlciBhbmQgIltub3RdcmVnZXhtYXRjaCIgY2hlY2tzCiAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgKHNlZSB0aGUgdHdvIHByZXZpb3VzIGVudHJpZXMpLiBQbGVhc2UKICAgICAgICAgICAgcmVwbGFjZSAiJShyeHNwZW5jZXI6W3BhdF1bc3Vic3RdKXMiIHdpdGggIiUocmVnZXg6L3BhdC9zdWJzdC8pcyIKICAgICAgICAgICAgd2hlbiB1cGdyYWRpbmcuIE5vdGljZSB0aGF0IHlvdSB3aWxsIGFsc28gbmVlZCB0byByZXBsYWNlIHRoZSBiYWNrLQogICAgICAgICAgICByZWZlcmVuY2VzIG9mIGZvcm0gIkAxIiB3aXRoIHRoZSBtb3JlIHN0YW5kYXJkICJcXDEiIGFuZCBtYXkgbmVlZCB0bwogICAgICAgICAgICBhZGp1c3QgeW91ciByZWd1bGFyIGV4cHJlc3Npb25zIHN5bnRheCBhcyB0aGUgbmV3IHJlZ2V4IGVuY29kZXIgdXNlcwogICAgICAgICAgICBQZXJsLWNvbXBhdGlibGUgc3ludGF4IGFuZCBub3QgKGV4dGVuZGVkKSBQT1NJWCBzeW50YXggYXMgdGhlIG9sZCBvbmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgQWRkICJyZWdleG1hdGNoIiwgInJlZ2V4dGFyZ2V0IiBhbmQgIm5vdHJlZ2V4bWF0Y2giIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB1c2VkIHRvIGFwcGx5ICVyZW5hbWUgZGlyZWN0aXZlcyB0byB0aGUgZGVjbGFyYXRpb25zIG1hdGNoaW5nIHRoZQogICAgICAgICAgICBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIG9ubHkuIFRoZSBmaXJzdCB0d28gY2FuIGJlIHVzZWQKICAgICAgICAgICAgaW50ZXJjaGFuZ2VhYmx5LCBib3RoIG9mIHRoZSAlcmVuYW1lcyBiZWxvdyBkbyB0aGUgc2FtZSB0aGluZzoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgcmVnZXhtYXRjaCRuYW1lPSJPbGQkIikgIiI7CiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgcmVnZXh0YXJnZXQ9MSkgIk9sZCQiOwoKICAgICAgICAgICAgKG5hbWVseSBpZ25vcmUgdGhlIGRlY2xhcmF0aW9ucyBoYXZpbmcgIk9sZCIgc3VmZml4KS4KCiAgICAgICAgICAgICJub3RyZWdleG1hdGNoIiByZXN0cmljdHMgdGhlIG1hdGNoIHRvIG9ubHkgdGhlIGRlY2xhcmF0aW9ucyB3aGljaAogICAgICAgICAgICBkbyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZS5nLiBoZXJlIGlzIGhvdyB0byByZW5hbWUgdG8KICAgICAgICAgICAgbG93ZXIgY2FzZSB2ZXJzaW9ucyBhbGwgZGVjbGFyYXRpb25zIGV4Y2VwdCB0aG9zZSBjb25zaXN0aW5nIGZyb20KICAgICAgICAgICAgY2FwaXRhbCBsZXR0ZXJzIG9ubHk6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJChsb3dlcmNhc2UpcyIsIG5vdHJlZ2V4bWF0Y2gkbmFtZT0iXltBLVpdKyQiKSAiIjsKCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgQWRkIHRoZSBuZXcgInJlZ2V4IiBlbmNvZGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gJXJlbmFtZSwgZS5nLgoKICAgICAgICAgICAgICAgICVyZW5hbWUoInJlZ2V4Oi8oXFx3KylfKC4qKS9cXDIvIikgIiI7CgogICAgICAgICAgICB0byByZW1vdmUgYW55IGFscGhhYmV0aWNhbCBwcmVmaXggZnJvbSBhbGwgaWRlbnRpZmllcnMuIFRoZSBzeW50YXgKICAgICAgICAgICAgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaXMgUGVybC1saWtlIGFuZCBQQ1JFIGxpYnJhcnkKICAgICAgICAgICAgKGh0dHA6Ly93d3cucGNyZS5vcmcvKSBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGlzIGZlYXR1cmUgYnV0IG5vdGljZQogICAgICAgICAgICB0aGF0IGJhY2tzbGFzaGVzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyB1c3VhbCBpbnNpZGUgQyBzdHJpbmdzLgoKICAgICAgICAgICAgT3JpZ2luYWwgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMwMjQ4NzUgLSBzaGFyZWRfcHRyIG9mIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLiBUaGlzIGFsc28gZml4ZXMKICAgICAgICAgICAgdGhlICJ1bnJlZiIgZmVhdHVyZSB3aGVuIHVzZWQgb24gY2xhc3NlcyB3aXRoIG5vbi1wdWJsaWMgZGVzdHJ1Y3RvcnMuCgoyMDEwLTA2LTE3OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIEFkZCB0aGUgR28gbGFuZ3VhZ2UgbW9kdWxlLgoKMjAxMC0wNi0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IFNXSUdfbHVhX2lzbmlsc3RyaW5nIG11bHRpcGx5IGRlZmluZWQgd2hlbiB1c2luZyBtdWx0aXBsZQogICAgICAgICAgICBtb2R1bGVzIGFuZCB3cmFwcGluZyBzdHJpbmdzLiBQYXRjaCBmcm9tICdOdW1iZXIgQ3J1bmNoZXInLgoKMjAxMC0wNi0xMDogb2xseQoJICAgIFtQSFBdIEZpeCBkaXJlY3RvcnMgdG8gY29ycmVjdGx5IGNhbGwgYSBtZXRob2Qgd2l0aCBoYXMgYQoJICAgIGRpZmZlcmVudCBuYW1lIGluIFBIUCB0byBDKysgKHdlIHdlcmUgYWx3YXlzIHVzaW5nIHRoZSBDKysgbmFtZQoJICAgIGluIHRoaXMgY2FzZSkuCgoyMDEwLTA2LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdW5jb21waWxhYmxlIGNvZGUgd2hlbiAlcmVuYW1lIHJlc3VsdHMgaW4gdHdvIGVudW0gaXRlbXMKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKVmVyc2lvbiAyLjAuMCAoMiBKdW5lIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0wNi0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEIG1hY3JvIHVzZWQgaW4gc3RkOjp2ZWN0b3IgdG8gd29yayB3aXRoCiAgICAgICAgICAgIHR5cGVzIGNvbnRhaW5pbmcgY29tbWFzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKHN0ZDo6cGFpcjwgZG91YmxlLCBzdGQ6OnN0cmluZyA+KQoKMjAxMC0wNi0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIHN0ZF9zaGFyZWRfcHRyLmkgZm9yIHdyYXBwaW5nIHN0ZDo6c2hhcmVkX3B0ci4gUmVxdWlyZXMgdGhlICVzaGFyZWRfcHRyCiAgICAgICAgICAgIG1hY3JvIGxpa2UgaW4gdGhlIGJvb3N0X3NoYXJlZF9wdHIuaSBsaWJyYXJ5LiBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZQogICAgICAgICAgICB3cmFwcGVkIGlmIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVmaW5lZDoKCiAgICAgICAgICAgICAgI2RlZmluZSBTV0lHX1NIQVJFRF9QVFJfU1VCTkFNRVNQQUNFIHRyMQogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc2hhcmVkX3B0ci5pPgoKICAgICAgICAgICAgc2hhcmVkX3B0ciBpcyBhbHNvIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sIG5vdy4KCjIwMTAtMDUtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSBmb3IgJHR5cGVtYXAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG8gY2FsbCBvdGhlciAkdHlwZW1hcAogICAgICAgICAgICBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQ0MgIkNDIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQkIgIiR0eXBlbWFwKGNzdHlwZSwgQ0MpIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQUEgIiR0eXBlbWFwKGNzdHlwZSwgQkIpIgogICAgICAgICAgICAgIHZvaWQgaGFoKEFBIGFhKTsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBDIyBzdGQ6OnZlY3RvciBjb250YWluZXJzIG9mIHNoYXJlZF9wdHIgYW5kICVzaGFyZWRfcHRyLgoKICAgICAgICAgICAgQWxzbyBhZGRlZCBkaWFnbm9zdGljcyBmb3IgJHR5cGVtYXAgd2l0aCAtZGVidWctdG1zZWFyY2gsIGZvciBleGFtcGxlLCB0aGUKICAgICAgICAgICAgYWJvdmUgZGlzcGxheXMgYWRkaXRpb25hbCBkaWFnbm9zdGljIGxpbmVzIHN0YXJ0aW5nICJDb250YWluaW5nOiAiOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBBQQogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBCQikKICAgICAgICAgICAgICBleGFtcGxlLmk6MzE6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQkIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBCQgogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQkIKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQ0MpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjI5OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IENDCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQ0MKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIENDCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgRml4ICVhdHRyaWJ1dGUycmVmIG5vdCB0byBwcm9kdWNlIGEgc3ludGF4IGVycm9yIGlmIHRoZSBsYXN0CgkgICAgYXJndW1lbnQgKEFjY2Vzc29yTWV0aG9kKSBpcyBvbWl0dGVkLiAgUGF0Y2ggZnJvbSBEYXZpZCBQaWVwZ3JhcwoJICAgIGluIFNGIzIyMzU3NTYuCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgW1BIUF0gV2hlbiB1c2luZyAldGhyb3dzIG9yICVjYXRjaGVzLCBTV0lHLWdlbmVyYXRlZCBQSFA1IHdyYXBwZXJzCgkgICAgbm93IHRocm93IFBIUCBFeGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIGdpdmluZyBhIFBIUCBlcnJvciBvZgoJICAgIHR5cGUgRV9FUlJPUi4KCgkgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkbid0IGNhdXNlIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHNpbmNlIHlvdSBjYW4ndAoJICAgIHNldCBhbiBlcnJvciBoYW5kbGVyIGZvciBFX0VSUk9SLCBzbyBwcmV2aW91c2x5IFBIUCB3b3VsZCBqdXN0IGV4aXQKCSAgICB3aGljaCBhbHNvIGhhcHBlbnMgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLiAgVGhlIGJlbmVmaXQgaXMgeW91IGNhbgoJICAgIG5vdyBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvLgoKCSAgICBGaXhlcyBTRiMyNTQ1NTc4IGFuZCBTRiMyOTU1NTIyLgoKMjAxMC0wNS0yNTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY29uc3Qgc3RkOjpzdHJpbmcgJi4KCSAgICBGaXhlcyBTRiMzMDA2NDA0IHJlcG9ydGVkIGJ5IHQtTGVnaWF3LgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzI5NTczNzUgLSBTV0lHU3RyaW5nSGVscGVyIGFuZCBTV0lHRXhjZXB0aW9uSGVscGVyIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSBpbiAuTkVUIDQgYXMgdGhlIGNsYXNzZXMgd2VyZSBub3QgbWFya2VkIGJlZm9yZWZpZWxkaW5pdC4KICAgICAgICAgICAgQSBzdGF0aWMgY29uc3RydWN0b3IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVwcmFnbWEoY3NoYXJwKSBpbWNsYXNzY29kZT0lewogICAgICAgICAgICAgICAgc3RhdGljICRpbWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgSWYgeW91IGhhZCBhZGRlZCB5b3VyIG93biBjdXN0b20gc3RhdGljIGNvbnN0cnVjdG9yIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgaW4KICAgICAgICAgICAgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLCB5b3Ugd2lsbCBoYXZlIHRvIG1vZGlmeSB5b3VyIGFwcHJvYWNoIHRvIHVzZSBzdGF0aWMgdmFyaWFibGUKICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb3IgZGVmaW5lIFNXSUdfQ1NIQVJQX05PX0lNQ0xBU1NfU1RBVElDX0NPTlNUUlVDVE9SIC0gU2VlIGNzaGFycGhlYWQuc3dnLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQwODIzMi4gSW1wcm92ZSBzaGFyZWRfcHRyIGFuZCBpbnRydXNpdmVfcHRyIHdyYXBwZXJzIGZvciBjbGFzc2VzIGluIGFuCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gTm8gc3BlY2lhbCB0cmVhdG1lbnQgaXMgbmVlZGVkIGZvciBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBwcm94eSBjbGFzcyBhbHNvIG5vIGxvbmdlciBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgZGVkdWNlZC4gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVzaGFyZWRfcHRyKFRZUEUpCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgaW50cnVzaXZlX3B0ciB3cmFwcGVycywgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlaW50cnVzaXZlX3B0cihUWVBFKQoKMjAxMC0wNS0yMTogb2xseQoJICAgIFtQSFBdIFN0b3AgZ2VuZXJhdGluZyBhIGJvZ3VzIGxpbmUgb2YgY29kZSBpbiBjZXJ0YWluIGNvbnN0cnVjdG9ycy4KCSAgICBUaGlzIHdhcyBtb3N0bHkgaGFybWxlc3MsIGJ1dCBjYXVzZWQgYSBQSFAgbm90aWNlIHRvIGJlIGlzc3VlZCwgaWYKCSAgICBlbmFibGVkIChTRiMyOTg1Njg0KS4KCjIwMTAtMDUtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoyMDEwLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgQysrIGVudW0gYm9vbGVhbiB2YWx1ZXMgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmOgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7IFBMQVkgPSB0cnVlLCBTVE9QID0gZmFsc2UgfSBwbGF5X3N0YXRlOwoKMjAxMC0wNS0xNDogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIHdhcyBwcm9kdWNpbmcKCSAgICB1bmNvbXBpbGFibGUgY29kZSBpbiBzb21lIGNhc2VzLgoKMjAxMC0wNS0xMjogZHJqb2UKCSAgICBbUl0gQWRkIHR3byBtb3JlIGNoYW5nZXMgZnJvbSBXaWwgTm9sYW4uICBHZXQgZ2FyYmFnZQoJICAgIGNvbGxlY3Rpb24gdG8gd29yay4gIEltcGxlbWVudCBuZXdmcmVlCgoyMDEwLTA1LTA5OiBkcmpvZQogICAgICAgICAgICBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbCBOb2xhbiBjaGFuZ2UgY3JlYXRpb24gb2Ygc3RyaW5nIHNvCiAgICAgICAgICAgIHRoYXQgUiAyLjcuMCsgY2FuIHVzZSBjaGFyIGhhc2hlcwoKMjAxMC0wNS0wNzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzI5NTUxNDYgZnJvbSBTZXJnZXkgU2F0c2tpeSB0byBmaXggZXhwcmVzc2lvbnMgY29udGFpbmluZyBkaXZpZGUgYnkKICAgICAgICAgICAgb3BlcmF0b3IgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdHMuCgoyMDEwLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gTWVtb3J5IGxlYWsgZml4IGhhbmRsaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5wdXRzLCByZXBvcnRlZCBieSBXaWxsIE5vbGFuLgoKMjAxMC0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBtYXRjaGluZyBlbmhhbmNlbWVudCBmb3Igbm9uLWRlZmF1bHQgdHlwZW1hcHMuIFByZXZpb3VzbHkgYWxsCiAgICAgICAgICAgIHF1YWxpZmllcnMgd2VyZSBzdHJpcHBlZCBpbiBvbmUgc3RlcCwgbm93IHRoZXkgYXJlIHN0cmlwcGVkIG9uZSBhdCBhIHRpbWUKICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdCBtb3N0IHF1YWxpZmllci4gRm9yIGV4YW1wbGUsIGludCBjb25zdCpjb25zdCAKICAgICAgICAgICAgaXMgZmlyc3Qgc3RyaXBwZWQgdG8gaW50ICpjb25zdCB0aGVuIGludCAqLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDQtMjU6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5ODU2NTUgLSBicm9rZW4gY29uc3RydWN0b3IgcmVuYW1pbmcuCgoyMDEwLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIGZyYWdtZW50cyBhcmUgbm93IG9mZmljaWFsIGFuZCBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMyMDQ4MDY0IGFuZCAjMjQwODAyMC4KICAgICAgICAgICAgQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBSdWJ5IGFuZCBzdGQ6OnZlY3RvciB3cmFwcGVycyB3aXRoIC1taW5oZXJpdC4KICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzUyMjg3NAoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW016c2NoZW1lXSBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IHN0ZDo6bWFwIHdyYXBwZXJzOgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvMjAzODc2CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjk1MjM3NCAtIGZpeCBkaXJlY3RvcnMgYW5kIHRoZSAtbm9ydHRpIG9wdGlvbi4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMjg4NzI1NCBhbmQgIzI5NDYwMzIgLSBTV0lHX0x1YV90eXBlbmFtZSB1c2luZyB3cm9uZyBzdGFjayBpbmRleC4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBleGNlcHRpb25zIGJlaW5nIHRocm93biB3aXRoIHRoZSAtdGhyZWFkcyBvcHRpb24gYmFzZWQgb24gcGF0Y2ggZnJvbSBBcnRvIFZ1b3JpLgogICAgICAgICAgICBGaXhlcyBidWcgIzI4MTg0OTkuCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggTWFrZWZpbGUgdGFyZ2V0czogZGlzdGNsZWFuIGFuZCBtYWludGFpbmVyLWNsZWFuCgoyMDEwLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggY2hhciBwb2ludGVycywgd2NoYXJfdCBwb2ludGVycyBhbmQgY2hhciBhcnJheXMgc28gdGhhdCBuaWwgY2FuIGJlIHBhc3NlZCBhcyBhCiAgICAgICAgICAgIHZhbGlkIHZhbHVlLiBCdWcgcmVwb3J0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDEwLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBOdW1lcm91cyBzdWJ0bGUgdHlwZW1hcCBtYXRjaGluZyBydWxlIGZpeGVzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGVtYXAKICAgICAgICAgICAgbWF0Y2hpbmcgcnVsZXMgYXJlIHRvIHRha2UgYSB0eXBlIGFuZCBmaW5kIHRoZSBiZXN0IGRlZmF1bHQgdHlwZW1hcCAoU1dJR1RZUEUsIFNXSUdUWVBFKiBldGMpLAogICAgICAgICAgICB0aGVuIGxvb2sgZm9yIHRoZSBuZXh0IGJlc3QgbWF0Y2ggYnkgcmVkdWNpbmcgdGhlIGNob3NlbiBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBub3cgZm9sbG93cyBDKysgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBtYXRjaGluZyBydWxlcy4KCiAgICAgICAgICAgIEJlbG93IGFyZSB0aGUgc2V0IG9mIGNoYW5nZXMgbWFkZSBzaG93aW5nIHRoZSBkZWZhdWx0IHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIGFsb25nIHdpdGggdGhlIG9sZCByZWR1Y2VkIHR5cGUgYW5kIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcmVkdWNlZCB0eXBlOgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICZbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJltdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoJilbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0IComCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICoKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICoKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoqCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIComCgogICAgICAgICAgICBBZGRpdGlvbmFsbHksIGEgY29uc3QgU1dJR1RZUEUgbG9va3VwIGlzIHVzZWQgbm93IGZvciBhbnkgY29uc3RhbnQgdHlwZS4gU29tZSBleGFtcGxlcywgd2hlcmUKICAgICAgICAgICAgVCBpcyBzb21lIHJlZHVjZWQgdHlwZSwgZWcgaW50LCBzdHJ1Y3QgRm9vOgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKmNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0W10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0W10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFW10KCiAgICAgICAgICAgICAgICAgICBlbnVtIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IGVudW0gU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IGVudW0gU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCopW10KCiAgICAgICAgICAgIFJlbWluZGVyOiB0aGUgdHlwZW1hcCBtYXRjaGluZyBydWxlcyBjYW4gbm93IGJlIHNlZW4gZm9yIGFueSB0eXBlcyBiZWluZyB3cmFwcGVkIGJ5IHVzaW5nCiAgICAgICAgICAgIGVpdGhlciB0aGUgLWRlYnVnLXRtc2VhcmNoIG9yIC1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCiAgICAgICAgICAgIEluIHByYWN0aWNlIHRoaXMgbGVhZHMgdG8gc29tZSBzdWJ0bGUgbWF0Y2hpbmcgcnVsZSBjaGFuZ2VzIGFuZCB0aGUgbWFqb3JpdHkgb2YgdXNlcnMKICAgICAgICAgICAgd29uJ3Qgbm90aWNlIGFueSBjaGFuZ2VzLCBleGNlcHQgaW4gdGhlIHByaW1lIGFyZWEgb2YgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2U6IEltcHJvdmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lcnMgb2YgY29uc3QgcG9pbnRlcnMgYW5kIHBhc3NpbmcgY29uc3QgcG9pbnRlcnMgYnkgcmVmZXJlbmNlLiBUaGlzIGlzIGZpeGVkCiAgICAgICAgICAgIGJlY2F1c2UgbWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMgdXNlIGEgdHlwZSAnVCBjb25zdCYnIGFzIHBhcmFtZXRlcnMgYW5kIHdoZW4gVCBpcyAKICAgICAgICAgICAgYSBjb25zdCBwb2ludGVyLCBmb3IgZXhhbXBsZSwgJ0sgY29uc3QqJywgdGhlbiB0aGUgZnVsbCB0eXBlIGlzICdLIGNvbnN0KmNvbnN0JicuIFRoaXMKICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgJ1NXSUdUWVBFICpjb25zdCYnIHR5cGVtYXBzIG5vdyBtYXRjaCB3aGVuIFQgaXMgZWl0aGVyIGEgbm9uLWNvbnN0IG9yCiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIuIEZ1cnRoZXJtb3JlLCBzb21lIHRhcmdldCBsYW5ndWFnZXMgaW5jb3JyZWN0bHkgaGFkICdTV0lHVFlQRSAqJicgdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB0aGVzZSBzaG91bGQgaGF2ZSBiZWVuICdTV0lHVFlQRSAqY29uc3QmJy4gVGhlc2UgaGF2ZSBiZWVuIGNvcnJlY3RlZCAoSmF2YSwgQyMsIEx1YSwgUEhQKS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU29tZSB2ZXJ5IG9sZCBkZXByZWNhdGVkIHByYWdtYSB3YXJuaW5ncyBhcmUgbm93IGVycm9ycy4KCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZmlsZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkb3VibGUvbXVsdGlwbGUgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMy0xMDogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIFVzZSBmdWxseSBxdWFsaWZpZWQgc3ltYm9sIG5hbWUgb2YgY2w6OmlkZW50aXR5IGluIGVtaXRfZGVmdW4oKS4KCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUaGUgaW50ZXJtZWRpYXJ5IEpOSSBjbGFzcyBtb2RpZmllcnMgYXJlIG5vdyBwdWJsaWMgYnkgZGVmYXVsdCBtZWFuaW5nIHRoZXNlCiAgICAgICAgICAgIGludGVybWVkaWFyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFyZSBub3cgYWNjZXNzaWJsZSBieSBkZWZhdWx0IGZyb20gb3V0c2lkZSBhbnkgcGFja2FnZQogICAgICAgICAgICB1c2VkLiBUaGUgcHJveHkgY2xhc3MgcG9pbnRlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFsc28gbm93IHB1YmxpYy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIG5zcGFjZSBvcHRpb24gdG8gd29yayB3aXRob3V0IGFueSBvdGhlciBtb2RzLgogICAgICAgICAgICBUaGUgcHJldmlvdXMgZGVmYXVsdCBvZiBwcm90ZWN0ZWQgYWNjZXNzIGNhbiBiZSByZXN0b3JlZCB1c2luZzoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9NRVRIT0RTKHByb3RlY3RlZCwgcHJvdGVjdGVkLCBTV0lHVFlQRSkKICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgPSAiY2xhc3MiCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZSBmb3IgQyMuIERvY3VtZW50YXRpb24gZm9yIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyBub3cgYXZhaWxhYmxlLgoKMjAxMC0wMy0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlLiBUaGlzIGFkZHMgc29tZSBpbXByb3ZlZCBuYW1lc3BhY2Ugc3VwcG9ydC4gQ3VycmVudGx5IG9ubHkgSmF2YQogICAgICAgICAgICBpcyBzdXBwb3J0ZWQgZm9yIHRhcmdldCBsYW5ndWFnZXMsIHdoZXJlIEMrKyBuYW1lc3BhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgICBKYXZhIHBhY2thZ2VzLiBUaGUgZmVhdHVyZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3NlcyxzdHJ1Y3QsdW5pb25zIGFuZCBlbnVtcyBkZWNsYXJlZCB3aXRoaW4KICAgICAgICAgICAgYSBuYW1lc3BhY2UuIE1ldGhvZHMgYW5kIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBuYW1lc3BhY2VzIHN0aWxsIGVmZmVjdGl2ZWx5IGhhdmUgdGhlaXIKICAgICAgICAgICAgbmFtZXNwYWNlcyBmbGF0dGVuZWQuIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMTo6Q29sb3I7CiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIyOjpDb2xvcjsKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjEgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIEphdmEsIHRoZSAtcGFja2FnZSBvcHRpb24gaXMgYWxzbyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBuc3BhY2UgZmVhdHVyZS4gU2F5CiAgICAgICAgICAgIHdlIHVzZSAtcGFja2FnZSBjb20ubXljbywgdGhlIHR3byBjbGFzc2VzIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGFzIGZvbGxvd3MgZnJvbSBKYXZhOgoKICAgICAgICAgICAgICBjb20ubXljby5PdXRlci5Jbm5lcjEuQ29sb3IgYW5kIGNvbS5teWNvLk91dGVyLklubmVyMi5Db2xvci4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSAtZGlydnRhYmxlIGZyb20gdGhlIG9wdGltaXphdGlvbnMgaW5jbHVkZWQgYnkgLU8gYXMgaXQgdGhpcyBvcHRpb24KICAgICAgICAgICAgY3VycmVudGx5IGxlYWRzIHRvIG1lbW9yeSBsZWFrcyBhcyByZXBvcnRlZCBieSBKb2hhbiBCbGFrZS4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIExpY2Vuc2UgY29kZSBjaGFuZ2VzOiBTV0lHIFNvdXJjZSBpcyBHUEwtdjMgYW5kIGxpYnJhcnkgY29kZSBsaWNlbnNlIGlzIG5vdyBjbGVhcmVyCiAgICAgICAgICAgIGFuZCBpcyBwcm92aWRlZCB1bmRlciBhIHZlcnkgcGVybWlzc2l2ZSBsaWNlbnNlLiBTZWUgaHR0cDovL3d3dy5zd2lnLm9yZy9sZWdhbC5odG1sLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEEgZmV3IGZpeGVzIGZvciBjb21waWxpbmcgdW5kZXIgcnVieS0xLjkueCBpbmNsdWRpbmcgcGF0Y2ggZnJvbSAnTmliYmxlJy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCBmcm9tIFBhdHJpY2sgQmVubmV0dCB0byBmaXggUkFSUkFZX0xFTiBhbmQgUkFSUkFZX1BUUiB1c2FnZSBmb3IgUnVieSAxLjkueAogICAgICAgICAgICB1c2VkIGluIHZhcmlvdXMgU1RMIHdyYXBwZXJzLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggaW5jb3JyZWN0IG11bHRpcGx5IGRlZmluZWQgc3ltYm9sIG5hbWUgZXJyb3Igd2hlbiBhbiBlbnVtIGl0ZW0KICAgICAgICAgICAgYW5kIGNsYXNzIG5hbWUgaGF2ZSB0aGUgc2FtZSBuYW1lLCBhcyByZXBvcnRlZCBieSBOYXRoYW4gS3JpZWdlci4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVmVjdG9yIHt9OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBUZXh0IHsKICAgICAgICAgICAgICAgIGVudW0gUHJlZmVyZW5jZSB7IFZlY3RvciB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBvdGhlciBpbmNvcnJlY3QgY29ybmVyIGNhc2UgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDEwLTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIC1kZWJ1Zy1sc3ltYm9scyBvcHRpb24gZm9yIGRpc3BsYXlpbmcgdGhlIHRhcmdldCBsYW5ndWFnZSBsYXllciBzeW1ib2xzLgoKMjAxMC0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1NTSBhbmQgLU1NRCBvcHRpb25zIG9uIFdpbmRvd3MuIFRoZXkgd2VyZSBub3Qgb21pdHRpbmcgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeSBhcwogICAgICAgICAgICB0aGV5IHNob3VsZCBiZS4KCjIwMTAtMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTgwNzMyOSAtIFdoZW4gTWFrZWZpbGUgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgdXNpbmcgdGhlIC1NIGZhbWlseSBvZiBvcHRpb25zCiAgICAgICAgICAgIG9uIFdpbmRvd3MsIHRoZSBmaWxlIHBhdGhzIGhhdmUgYmVlbiBjb3JyZWN0ZWQgdG8gdXNlIHNpbmdsZSBiYWNrc2xhc2hlcyByYXRoZXIgdGhhbiBkb3VibGUKICAgICAgICAgICAgYmFja3NsYXNoZXMgYXMgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTE4OTAyIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiBjb3JyZWN0IGRpcmVjdG9yeSBvbgogICAgICAgICAgICBXaW5kb3dzIHdoZW4gdXNpbmcgZm9yd2FyZCBzbGFzaGVzIGZvciAtbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1jKysgLW8gc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZV93cmFwLmNwcCBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlLmkKCjIwMTAtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjg5NDQwNSAtIGFzc2VydGlvbiB3aGVuIHVzaW5nIC14bWxvdXQuCgoyMDEwLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZW1hcCBtYXRjaGluZyBidWcgd2hlbiBhIHRlbXBsYXRlZCB0eXBlIGhhcyBhIHR5cGVtYXAgYm90aCBzcGVjaWFsaXplZCBhbmQgbm90CiAgICAgICAgICAgIHNwZWNpYWxpemVkLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFhYIHsgLi4uIH07CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYICYgIi4uLiIKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFg8IGludCA+ICYgIi4uLiIKCiAgICAgICAgICAgIHJlc3VsdGVkIGluIHRoZSAybmQgdHlwZW1hcCBiZWluZyBhcHBsaWVkIGZvciBhbGwgVCBpbiBYWDwgVCA+LgoKMjAxMC0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTMzMTI5IC0gdHlwZW1hcHMgbm90IGJlaW5nIGZvdW5kIHdoZW4gdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgaXMgdXNlZCB0byBkZW5vdGUKICAgICAgICAgICAgZ2xvYmFsIHNjb3BlLCB0aGUgdHlwZW1hcCBpcyBub3cgdXNlZCBpbiBzaXR1YXRpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCA6OlggJik7CgogICAgICAgICAgICBhbmQgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IDo6WCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IFggJik7CgoyMDEwLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSBwcm9ibGVtcyBpbiB0aGUgdHlwZXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIGludG8gdGhlIEMrKyBsYXllci4gUHJldmlvdXNseSB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3Igd2FzIGRyb3BwZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIGlmIHRoZSB0eXBlIGhhZCBhbnkgc29ydCBvZiBxdWFsaWZpZXIsIGZvciBleGFtcGxlIHdoZW4gdXNpbmcgcG9pbnRlcnMsIHJlZmVyZW5jZXMsIGxpa2UKICAgICAgICAgICAgOjpmb28qLCA6OmZvbyYsIGJhcjwgOjpmb28qID4uCgoyMDEwLTAxLTEzOiBvbGx5CgkgICAgW1BIUF0gQWRkIGRhdGV0aW1lIHRvIHRoZSBsaXN0IG9mIFBIUCBwcmVkZWZpbmVkIGNsYXNzZXMgKHBhdGNoCgkgICAgZnJvbSBEYXZpZCBGbGV0Y2hlciBpbiBTRiMyOTMxMDQyKS4KCjIwMTAtMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gd2FybmluZywgZXJyb3IgYW5kIGRpYWdub3N0aWMgcmVwb3J0aW5nLiBUaGUgd2FybmluZyBudW1iZXIgaXMgbm8gCiAgICAgICAgICAgIGxvbmdlciBzaG93biB3aXRoaW4gYnJhY2tldHMuIFRoaXMgaXMgdG8gaGVscCBkZWZhdWx0IHBhcnNpbmcgb2Ygd2FybmluZyBtZXNzYWdlcyBieQogICAgICAgICAgICBvdGhlciB0b29scywgdmltIG9uIFVuaXggaW4gcGFydGljdWxhci4KCiAgICAgICAgICAgIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheSB1c2luZyAtRnN0YW5kYXJkOgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgoKICAgICAgICAgICAgQWxzbyBzdWJ0bGUgZml4IHRvIC1GbWljcm9zb2Z0IGZvcm1hdCBhZGRpbmcgaW4gbWlzc2luZyBzcGFjZS4gRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCk6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKSA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGEgZmV3IGluY29uc2lzdGVuY2llcyBpbiByZXBvcnRpbmcgb2YgZmlsZS9saW5lIG51bWJlcmluZ3MgaW5jbHVkaW5nIG1vZGlmeWluZwogICAgICAgICAgICB0aGUgb3ZlcmxvYWQgd2FybmluZ3MgNTA5LCA1MTIsIDUxNiwgNDc0LCA0NzUgdG8gbm93IGJlIHR3byBsaW5lIHdhcm5pbmdzLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IC1kZWJ1Zy10YWdzIG91dHB1dCB0byB1c2Ugc3RhbmRhcmQgZmlsZSBuYW1lL2xpbmUgcmVwb3J0aW5nIHNvIHRoYXQgZWRpdG9ycwogICAgICAgICAgICBjYW4gZWFzaWx5IG5hdmlnYXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBsaW5lcy4KICAgICAgICAgICAgV2FzIHR5cGljYWxseToKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyKQogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOSkKICAgICAgICAgICAgbm93OgogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTI6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlCiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6Mzk6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZQoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1pc3NpbmcgZmlsZS9saW5lIG51bWJlcnMgZm9yIHR5cGVtYXAgd2FybmluZ3MgYW5kIGluIG91dHB1dCBmcm9tIHRoZQogICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaC8tZGVidWctdG11c2VkIG9wdGlvbnMuCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdHlwZW1hcHMgdXNlZCBkZWJ1Z2dpbmcgb3B0aW9uICgtZGVidWctdG11c2VkKS4gV2hlbiB1c2VkIGVhY2ggbGluZSBkaXNwbGF5cwogICAgICAgICAgICB0aGUgdHlwZW1hcCB1c2VkIGZvciBlYWNoIHR5cGUgZm9yIHdoaWNoIGNvZGUgaXMgYmVpbmcgZ2VuZXJhdGVkIGluY2x1ZGluZyB0aGUgZmlsZQogICAgICAgICAgICBhbmQgbGluZSBudW1iZXIgcmVsYXRlZCB0byB0aGUgdHlwZS4gVGhpcyBpcyBlZmZlY3RpdmVseSBhIGNvbmRlbnNlZCBmb3JtIG9mIHRoZQogICAgICAgICAgICAtZGVidWctdG1zZWFyY2ggb3B0aW9uLiBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVqYXZhZXhjZXB0aW9uIGFuZCBkaXJlY3RvcnMgc28gdGhhdCBhbGwgdGhlIGFwcHJvcHJpYXRlIHRocm93cyBjbGF1c2VzIAogICAgICAgICAgICBhcmUgZ2VuZXJhdGVkLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBldGVyIEdyZWVud29vZC4KCjIwMDktMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtZGVidWctdG1zZWFyY2ggb3B0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIHR5cGVtYXAgcGF0dGVybiBtYXRjaGluZyBydWxlcy4KICAgICAgICAgICAgRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIHRoZSAtYXBpIG9wdGlvbiBhbmQgdXNlIHRoZSBuZXcgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUgogICAgICAgICAgICBtYWNybyBwcm92aWRlZCBpbiB0aGUgb2N0YXZlIGhlYWRlcnMgZm9yIGRldGVybWluaW5nIHRoZSBhcGkgdmVyc2lvbiBpbnN0ZWFkLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtSdWJ5XSBJbXByb3ZlIHN1cHBvcnQgZm9yIFJ1YnkgMS45IHVuZGVyIEdDQy4gIEFkZHJlc3NlcyBwYXJ0IG9mCgkgICAgU0YjMjg1OTYxNC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgbW9kdWxvIG9wZXJhdG9yICglKSBpbiBjb25zdGFudCBleHByZXNzaW9ucwoJICAgIChTRiMyODE4NTYyKS4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUEhQXSAiZW1wdHkiIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQSFAsIHNvIHJlbmFtZSBlbXB0eSgpIG1ldGhvZAoJICAgIG9uIFNUTCBjbGFzc2VzIHRvICJpc19lbXB0eSgpIiAocHJldmlvdXNseSB0aGlzIHdhcyBhdXRvbWF0aWNhbGx5CgkgICAgcmVuYW1lZCB0byAiY19lbXB0eSgpIikuCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTEyLTAzOiBvbGx5CgkgICAgW1BIUF0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZywgYW5kIGZvcgoJICAgIHBvaW50ZXIgdG8gbWV0aG9kLgoKMjAwOS0xMi0wMjogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIGFuZCByZW5hbWUgb2YgcmVzZXJ2ZWQgY2xhc3MgbmFtZSB0byBiZSBjYXNlCgkgICAgaW5zZW5zaXRpdmUuCgoyMDA5LTEyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXZlcnQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMgYWRkZWQgaW4gc3dpZy0xLjMuMzkuIFRoZQoJICAgIG1lbWJlcmluIHR5cGVtYXBzIGFyZSBpZ25vcmVkIGFnYWluIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gaW5jb25zaXN0ZW5jeSByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDA5LTExLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBnZW5lcmF0ZWQgcXVvdGluZyB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIAogICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEE7CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBBID0gJ0EnOyAKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3Igc3RhdGljIGNvbnN0IG1lbWJlciB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgdXNlIHRoZSBhY3R1YWwgY29uc3RhbnQgdmFsdWUgaWYgaXQgaXMgc3BlY2lmaWVkLCByYXRoZXIgdGhhbiB0aGUgQysrIGNvZGUgdG8KICAgICAgICAgICAgYWNjZXNzIHRoZSBtZW1iZXIuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBFTiA9IDI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKyBuZXN0ZWQgdHlwZWRlZiBjbGFzc2VzIGNhbiBub3cgYmUgaGFuZGxlZCB0b28sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyB7IH0gRm9vVHlwZWRlZjEsIEZvb1R5cGVkZWYyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZm9yIEMgbmVzdGVkIHN0cnVjdHMgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgZGVjbGFyZWQgCiAgICAgICAgICAgIGluIHRoZSBwYXJzZWQgY29kZS4KCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDkxNDc2IC0gbXVsdGlwbGUgZGVjbGFyYXRpb25zIG9mIG5lc3RlZCBzdHJ1Y3RzLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgIH0gaW5uZXIxLCBpbm5lcjIsICppbm5lcjMsIGlubmVyNFsxXTsKICAgICAgICAgICAgICB9IG91dGVyOwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2YgZW51bSBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIEFCQyB7CiAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgIGMKICAgICAgICAgICAgICB9IEEgPSBhLCAqcEMgPSAmQywgYXJyYXlbM10gPSB7YSwgYiwgY307CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBzdHJ1Y3QgZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IFMgewogICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgIH0gaW5zdGFuY2UgPSB7IDEwIH07CgoyMDA5LTExLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5NjA5NzcgLSBTeW50YXggZXJyb3IgcGFyc2luZyBkZXJpdmVkIG5lc3RlZCBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgbWVtYmVyCiAgICAgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlLgoKMjAwOS0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMzEwNDgzIC0gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmIHdpdGhpbiBleHRlcm4gIkMiIGJsb2NrLgoKMjAwOS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiB0ZW1wbGF0ZWQgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGFibGUgY29kZSAKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkLgoKMjAwOS0xMS0xMzogb2xseQoJICAgIFtwaHBdIEZpeCBwbGFjZSB3aGVyZSBjbGFzcyBwcmVmaXggKGFzIHNwZWNpZmllZCB3aXRoIC1wcmVmaXgpCgkgICAgd2Fzbid0IGJlaW5nIHVzZWQuICBQYXRjaCBmcm9tIGd2ZXJicnVnZ2VuIGluIFNGIzI4OTI2NDcuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgc28gdGhhdCBjb21waWxhYmxlIGNvZGUgaXMgZ2VuZXJhdGVkIC0gdGhlIG5lc3RlZAogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBpcyBub3cgdHJlYXRlZCBsaWtlIGEgbm9ybWFsIG5lc3RlZCBjbGFzc2VzLCB0aGF0IGlzLCBhcyBhbiBvcGFxdWUgdHlwZQogICAgICAgICAgICB1bmxlc3MgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBpcyB1c2VkLgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgUmVwbGFjZSBTV0lHV0FSTl9QQVJTRV9ORVNURURfQ0xBU1Mgd2l0aCBTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MgYW5kCiAgICAgICAgICAgIFNXSUdXQVJOX1BBUlNFX1VOTkFNRURfTkVTVEVEX0NMQVNTIGZvciBuYW1lZCBhbmQgdW5uYW1lZCBuZXN0ZWQgY2xhc3NlcyByZXNwZWN0aXZlbHkuCgogICAgICAgICAgICBOYW1lZCBuZXN0ZWQgY2xhc3MgaWdub3JlZCB3YXJuaW5ncyBjYW4gbm93IGJlIHN1cHByZXNzZWQgYnkgbmFtZSB1c2luZyAld2FybmZpbHRlciwgZWc6CgogICAgICAgICAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUykgT3V0ZXI6OklubmVyOwoKICAgICAgICAgICAgYnV0IGNsZWFybHkgdW5uYW1lZCBuZXN0ZWQgY2xhc3NlcyBjYW5ub3QgYW5kIHRoZSBnbG9iYWwgc3VwcHJlc3Npb24gaXMgc3RpbGwgcmVxdWlyZWQsIGVnOgoKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPVNXSUdXQVJOX1BBUlNFX1VOTkFNRURfTkVTVEVEX0NMQVNTCgoyMDA5LTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGFzIGEgd2F5IHRvIHVzZSB0aGUgZnVsbCBmdW5jdGlvbmFsaXR5IG9mIGEgbmVzdGVkIGNsYXNzIAogICAgICAgICAgICAoQysrIG1vZGUgb25seSkuIEl0IHJlbW92ZXMgdGhlIG5lc3RlZCBjbGFzcyBmcm9tIFNXSUcncyB0eXBlIGluZm9ybWF0aW9uIHNvIGl0IGlzIGFzIGlmIFNXSUcKICAgICAgICAgICAgaGFkIG5ldmVyIHBhcnNlZCB0aGUgbmVzdGVkIGNsYXNzLiBUaGUgZG9jdW1lbnRlZCBuZXN0ZWQgY2xhc3Mgd29ya2Fyb3VuZHMgdXNpbmcgYSBnbG9iYWwKICAgICAgICAgICAgZmFrZSBjbGFzcyBzdG9wcGVkIHdvcmtpbmcgd2hlbiBTV0lHIHRyZWF0ZWQgdGhlIG5lc3RlZCBjbGFzcyBhcyBhbiBvcGFxdWUgcG9pbnRlciwgYW5kCiAgICAgICAgICAgIHRoaXMgZmVhdHVyZSByZXZlcnRzIHRoaXMgYmVoYXZpb3VyLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHdpdGggZGV0YWlscyBvZiBob3cKICAgICAgICAgICAgdG8gdXNlIGFuZCBpbXBsZW1lbnQgaXQsIHNlZSB0aGUgIk5lc3RlZCBjbGFzc2VzIiBzZWN0aW9uIGluIFNXSUdQbHVzLmh0bWwuCgoyMDA5LTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mIEMrKyBjYXNlcyB3aGVyZSBuZXN0ZWQgY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucyB3ZXJlIGJlaW5nIGhhbmRsZWQKICAgICAgICAgICAgYXMgaWYgQyBjb2RlIHdhcyBiZWluZyBwYXJzZWQgd2hpY2ggd291bGQgb2Z0ZW50aW1lcyBsZWFkIHRvIHVuY29tcGlsYWJsZSBjb2RlIGFzIGFuCiAgICAgICAgICAgIGF0dGVtcHQgd2FzIG1hZGUgdG8gd3JhcCB0aGUgbmVzdGVkIHN0cnVjdHMgbGlrZSBpdCBpcyBkb2N1bWVudGVkIGZvciBDIGNvZGUuIE5vdyBhbGwKICAgICAgICAgICAgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgYXJlIGlnbm9yZWQgaW4gQysrIG1vZGUsIGFzIHdhcyBhbHdheXMgZG9jdW1lbnRlZC4gSG93ZXZlciwKICAgICAgICAgICAgdGhlcmUgaXMgYW4gaW1wcm92ZW1lbnQgYXMgdXNhZ2Ugb2YgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgaXMgbm93IGFsd2F5cyB0cmVhdGVkCiAgICAgICAgICAgIGFzIGFuIG9wYXF1ZSB0eXBlIGJ5IGRlZmF1bHQsIHJlc3VsdGluZyBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHNob3VsZCBhbHdheXMgY29tcGlsZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMS0wOTogZHJqb2UKCSAgICBGaXggUiBmb3IgLWZjb21wYWN0IGFuZCBhZGQgc3RkX21hcC5pCgoyMDA5LTExLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb25zaXN0ZW5jeSBmb3IgbmVzdGVkIHN0cnVjdHMvdW5pb25zL2NsYXNzZXMuIFVuY29tcGlsYWJsZSBjb2RlIHdhcyBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbm5lciBzdHJ1Y3QgYW5kIHVuaW9uIGRlY2xhcmF0aW9ucyB3ZXJlIHVzZWQgYXMgdHlwZXMgd2l0aGluIHRoZQogICAgICAgICAgICBpbm5lciBzdHJ1Y3QuIFRoZSBpbm5lciBzdHJ1Y3QvdW5pb24gaXMgbm93IHRyZWF0ZWQgYXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG1ha2luZyB0aGUKICAgICAgICAgICAgYmVoYXZpb3VyIHRoZSBzYW1lIGFzIGFuIGlubmVyIGNsYXNzLiAoQysrIGNvZGUpLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBJbm5lclN0cnVjdCB7IGludCB4OyB9OwogICAgICAgICAgICAgICAgSW5uZXJTdHJ1Y3QqIGdldElubmVyU3RydWN0KCk7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMDg6IHdzZnVsdG9uCgkgICAgSWdub3JlZCBuZXN0ZWQgY2xhc3Mvc3RydWN0IHdhcm5pbmdzIG5vdyBkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSBpZ25vcmVkIGNsYXNzL3N0cnVjdC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQnVnICMxNTE0NjgxIC0gRml4IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiBhIG5hbWVzcGFjZSBnZW5lcmF0ZWQgdW5jb21waWxhYmxlCiAgICAgICAgICAgIGNvZGUgYW5kIGludHJvZHVjZWQgc3RyYW5nZSBzaWRlIGVmZmVjdHMgdG8gb3RoZXIgd3JhcHBlciBjb2RlIGVzcGVjaWFsbHkgY29kZQogICAgICAgICAgICBhZnRlciB0aGUgbmVzdGVkIHRlbXBsYXRlIGNsYXNzLiBOb3RlIHRoYXQgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgYXJlIHN0aWxsIGlnbm9yZWQuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEFkZCBuZXcgZGVidWcgb3B0aW9uczoKICAgICAgICAgICAgICAtZGVidWctc3ltdGFicyAgICAtIERpc3BsYXkgc3ltYm9sIHRhYmxlcyBpbmZvcm1hdGlvbgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW1ib2xzICAgIC0gRGlzcGxheSB0YXJnZXQgbGFuZ3VhZ2Ugc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwogICAgICAgICAgICAgIC1kZWJ1Zy1jc3ltYm9scyAgIC0gRGlzcGxheSBDIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKCjIwMDktMTEtMDM6IHdzZnVsdG9uCgkgICAgRml4IHNvbWUgdXNhZ2Ugb2YgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBkZW5vdGluZyBnbG9iYWwgc2NvcGUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgQUEgeyAvKiAuLi4gKi8gfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OkFBOwoKICAgICAgICAgICAgYW5kIGJ1ZyAjMTgxNjgwMiAtIFN3aWdWYWx1ZVdyYXBwZXIgc2hvdWxkIGJlIHVzZWQ6CgogICAgICAgICAgICAgIHN0cnVjdCBDQyB7CiAgICAgICAgICAgICAgICBDQyhpbnQpOyAvLyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICA6OkNDIHgoKTsKCiAgICAgICAgICAgIGFuZCBpbiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc3BlY2lhbGl6YXRpb25zOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUyB7fTsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFggeyB2b2lkIGEoKSB7fSB9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDw+IHN0cnVjdCBYPFM+IHsgdm9pZCBiKCkge30gfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoTXlUQ29uY3JldGUpIFg8IDo6UyA+OwoKICAgICAgICAgICAgcGx1cyBwcm9iYWJseSBzb21lIG90aGVyIGNvcm5lciBjYXNlIHVzYWdlIG9mIDo6LgoKMjAwOS0xMS0wMjogb2xseQoJICAgIFtQeXRob25dIEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgaW4gaW5pdGlhbGlzYXRpb24gY29kZSBmb3IgdGhlCgkgICAgZ2VuZXJhdGVkIG1vZHVsZS4KCjIwMDktMTAtMjM6IHdzZnVsdG9uCgkgICAgRml4IHNlZyBmYXVsdCB3aGVuIHVzaW5nIGEgbmFtZWQgbmVzdGVkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gdXNpbmcgJXRlbXBsYXRlKG5hbWUpIAogICAgICAgICAgICB3aXRoaW4gYSBjbGFzcy4gQSB3YXJuaW5nIHRoYXQgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgaXMgbm93IGlzc3VlZCBwbHVzIHByb2Nlc3NpbmcgCiAgICAgICAgICAgIGNvbnRpbnVlcyBhcyBpZiBubyBuYW1lIHdhcyBnaXZlbi4KCjIwMDktMTAtMjA6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IHN0ZDo6dmVjdG9yPGNvbnN0IFQqPi4gVGhpcyB3b3VsZCBwcmV2aW91c2x5IGNvbXBpbGUsIGJ1dCBub3QgcnVuIGNvcnJlY3RseS4KCjIwMDktMTAtMjA6IHdzZnVsdG9uCgkgICAgRml4ZWQgcHJldmlvdXNseSBmYWlybHkgcG9vciB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFuZCBleHBsaWNpdCAKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gc3VwcG9ydC4gTnVtZXJvdXMgYnVncyBpbiB0aGlzIGFyZWEgaGF2ZSBiZWVuIGZpeGVkIGluY2x1ZGluZzoKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGltcGxlbWVudGVkIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cywgZWcgdGhpcyBub3cKICAgICAgICAgICAgICB3b3JrczoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFggICAgICB7fTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFg8VCAqPiB7fTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShYMSkgWDxjb25zdCBpbnQgKj47IC8vIENob29zZXMgVCAqIHNwZWNpYWxpemF0aW9uCgogICAgICAgICAgICAgIGFuZCBtb3JlIGNvbXBsZXggY2FzZXMgd2l0aCBtdWx0aXBsZSBwYXJhbWV0ZXJzIGFuZCBhIG1peCBvZiB0ZW1wbGF0ZSBhcmd1bWVudAogICAgICAgICAgICAgIGRlZHVjdGlvbiBhbmQgZXhwbGljaXRseSBzcGVjaWFsaXNlZCBwYXJhbWV0ZXJzLCBlZzoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCBUd29QYXJtICAgICAgICAgICAgICAgeyB2b2lkIGEoKSB7fSB9OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPiAgICAgICAgICAgICAgc3RydWN0IFR3b1Bhcm08VDEgKiwgaW50ICo+ICB7IHZvaWQgZSgpIHt9IH07CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRSkgVHdvUGFybTxpbnQgKiosIGludCAqPjsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSBtdXN0IG5vdyBiZSBpbiBzY29wZSwgbGlrZSBpbiBDKyssIHdoZW4KICAgICAgICAgICAgYW4gZXhwbGljaXQgb3IgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBpbnN0YW50aWF0ZWQgd2l0aCAldGVtcGxhdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDktMTQ6IHdzZnVsdG9uCgkgICAgW0MjXSBBZGQgJWNzYXR0cmlidXRlcyBmb3IgYWRkaW5nIEMjIGF0dHJpYnV0ZXMgdG8gZW51bSB2YWx1ZXMsIHNlZSBkb2NzIGZvciBleGFtcGxlLgoKMjAwOS0wOS0xMTogd3NmdWx0b24KCSAgICBGaXggbWVtbW92ZSByZWdyZXNzaW9uIGluIGNkYXRhLmkgYXMgcmVwb3J0ZWQgYnkgQWRyaWFhbiBSZW50aW5nLgoKMjAwOS0wOS0wNzogd3NmdWx0b24KCSAgICBGaXggY29uc3RhbnQgZXhwcmVzc2lvbnMgY29udGFpbmluZyA8PSBvciA+PS4KCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMgbm93IHJlc3VsdCBpbiB0eXBlIGJvb2wgZm9yIEMrKyAKICAgICAgICAgICAgd3JhcHBlcnMgYW5kIHJlbWFpbiBhcyB0eXBlIGludCBmb3IgQyB3cmFwcGVycywgYXMgcGVyIGVhY2ggc3RhbmRhcmQ6IAoKICAgICAgICAgICAgICAmJiB8fCA9PSAhPSA8ID4gPD0gPj0gKEFjdHVhbGx5IHRoZSBsYXN0IDQgYXJlIHN0aWxsIGJyb2tlbikuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEEgMTAKICAgICAgICAgICAgICAjZGVmaW5lIEIgMTAKICAgICAgICAgICAgICAjZGVmaW5lIEFfRVFfQiAgQSA9PSBCIC8vIG5vdyB3cmFwcGVkIGFzIHR5cGUgYm9vbCBmb3IgQysrCiAgICAgICAgICAgICAgI2RlZmluZSBBX0FORF9CIEEgJiYgQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwoKMjAwOS0wOS0wMjogd3NmdWx0b24KCSAgICBGaXggIzI4NDU3NDYuIHRydWUgYW5kIGZhbHNlIGFyZSBub3cgcmVjb2duaXNlZCBrZXl3b3JkcyAob25seSB3aGVuIHdyYXBwaW5nIEMrKykuCiAgICAgICAgICAgIENvbnN0YW50cyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgYXJlIG5vdyB3cmFwcGVkIChhcyB0eXBlIGJvb2wpOgogICAgICAgICAgICAgICNkZWZpbmUgRk9PIHRydWUKICAgICAgICAgICAgICAjZGVmaW5lIEJBUiBGT08gJiYgZmFsc2UKClZlcnNpb24gMS4zLjQwICgxOCBBdWd1c3QgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wOC0xNzogb2xseQoJICAgIFtQZXJsXSBBZGQgIiN1bmRlZiBkb19leGVjIiB0byBvdXIgY2xlYW4gdXAgb2YgUGVybCBnbG9iYWwKCSAgICBuYW1lc3BhY2UgcG9sbHV0aW9uLgoKMjAwOS0wOC0xNzogb2xseQoJICAgIFtQSFBdIEZpeCB0byB3cmFwIGEgcmVzb3VyY2UgcmV0dXJuZWQgYnkgX19nZXQoKSBpbiBhIFBIUCBvYmplY3QgKFNGIzI1NDkyMTcpLgoKMjAwOS0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNzk3NDg1IEFmdGVyIGRvaW5nIGEgJ21ha2UgY2xlYW4nLCBpbnN0YWxsIGZhaWxzIGlmIHlvZGwybWFuIG9yIHlvZGwyaHRtbCAKICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIENhdWdodCBleGNlcHRpb25zIGRpc3BsYXkgdGhlIHR5cGUgb2YgdGhlIEMrKyBleGNlcHRpb24gaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgZ2VuZXJpYyAiYysrLXNpZGUgdGhyZXcgYW4gZXhjZXB0aW9uIiBtZXNzYWdlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgZml4IHNvIHRoYXQgYW55IGNsYXNzZXMgc3BlY2lmaWVkIGluIHRoZSAidGhyb3dzIgogICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlICJ0aHJvd3MiIHR5cGVtYXAgYXJlIGdlbmVyYXRlZCBpbnRvIHRoZSBKYXZhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBleGNlcHRpb24gaGFuZGxpbmcgd2hlbiAlY2F0Y2hlcyBpcyB1c2VkLCByZXBvcnRlZCBieSBKdWFuIE1hbnVlbCBBbHZhcmV6LgoKMjAwOS0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICV0ZW1wbGF0ZSBzZWcgZmF1bHQgb24gc29tZSBjYXNlcyBvZiBvdmVybG9hZGluZyB0aGUgdGVtcGxhdGVkIG1ldGhvZC4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IEphbiBLdXBlYy4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCgkgICAgW1J1YnldIEFkZCBudW1lcm91cyBtaXNzaW5nIHdyYXBwZWQgbWV0aG9kcyBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4gc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgYXMgcmVwb3J0ZWQgYnkgWW91c3NlZiBKb25lcy4KCjIwMDktMDgtMTQ6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEFkZCBTV0lHX0NvbnZlcnRQdHJBbmRPd24oKSBtZXRob2QgaW50byB0aGUgcnVudGltZSBmb3Igc21hcnQgcG9pbnRlciAKICAgICAgICAgICAgbWVtb3J5IG93bmVyc2hpcCBjb250cm9sLiBzaGFyZWRfcHRyIHN1cHBvcnQgc3RpbGwgdG8gYmUgYWRkZWQuIFBhdGNoIGZyb20gCiAgICAgICAgICAgIERhdmlkIEZsZXRjaGVyLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFBIUDUgbm93IHdyYXBzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFzIGRvY3VtZW50ZWQuCgoyMDA5LTA4LTE0OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBQSFAgImNsYXNzIiBleGFtcGxlIHRvIHdvcmsgd2l0aCBQSFA1IGFuZCB1c2UKCSAgICBtb2Rlcm4gd3JhcHBpbmcgZmVhdHVyZXMuCgoyMDA5LTA4LTEzOiB3c2Z1bHRvbgoJICAgIFtQSFBdIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG92ZXJoYXVsLiBUaGV5IG5vIGxvbmdlciByZXF1aXJlIHRoZSAKICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yKCkgbWFjcm8uIEFkZGVkIHdyYXBwZXJzIGZvciBjYXBhY2l0eSgpIGFuZCByZXNlcnZlKCkuCgoyMDA5LTA4LTEzOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEFkZCBjb25zdCByZWZlcmVuY2UgdHlwZW1hcHMuIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgYXJlCiAgICAgICAgICAgIG5vdyBwYXNzZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gcG9pbnRlciBsaWtlIHRoZSBvdGhlciB0YXJnZXQgbGFuZ3VhZ2VzLgoJICAgIEZpeGVzIFNGIzI1MjQwMjkuCgoyMDA5LTA4LTA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIE1vcmUgdXNlciBmcmllbmRseSBBdHRyaWJ1dGVFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZSBhcmUKICAgICAgICAgICAgbm8gY29uc3RydWN0b3JzIGdlbmVyYXRlZCBmb3IgdGhlIHByb3h5IGNsYXNzIGluIHRoZSBldmVudCB0aGF0IHRoZQogICAgICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIG5vdyAKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQgLSBjbGFzcyBpcyBhYnN0cmFjdCIgd2hlcmVhcyBpZiB0aGVyZSBhcmUgbm8KICAgICAgICAgICAgcHVibGljIGNvbnN0cnVjdG9ycyBmb3IgYW55IG90aGVyIHJlYXNvbiBhbmQgdGhlIGNsYXNzIGlzIG5vdCBhYnN0cmFjdCwKICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVtYWlucwogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIuCiAgICAgICAgICAgIFt0Y2xdIFNpbWlsYXJseSBmb3IgdGNsIHdoZW4gdXNpbmcgLWl0Y2wuCgoyMDA5LTA4LTA0OiBvbGx5CgkgICAgW1BIUF0gRml4IGdlbmVyYXRlZCBjb2RlIHRvIHdvcmsgd2l0aCBQSFAgNS4zLgoKMjAwOS0wOC0wNDogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBWYXJpb3VzIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgKHdoaWNoIHdvdWxkIGNvbmZsaWN0CiAgICAgICAgICAgIHdpdGggdGhlIGJ1aWx0LWluIFBIUCBvbmVzKSBhcmUgbm93IGF1dG9tYXRpY2FsbHkgaGFuZGxlZCBieQogICAgICAgICAgICBhZGRpbmcgYSAnY18nIHByZWZpeC4KCjIwMDktMDgtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIHN0ZDo6dmVjdG9yPFQ+IGltcGxlbWVudGF0aW9uIGlzIGltcHJvdmVkIGFuZCBub3cgdXNlcyAkdHlwZW1hcCBzdWNoCiAgICAgICAgICAgIHRoYXQgdGhlIHByb3h5IGNsYXNzIGZvciBUIG5vIGxvbmdlciBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHNvbWUgbWFjcm9zCiAgICAgICAgICAgIGZvciBjb3JyZWN0IEMjIGNvbXBpbGF0aW9uOyB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVwcmVjYXRlZCwgd2hlcmUKICAgICAgICAgICAgQ1NUWVBFIHdhcyB0aGUgQyMgdHlwZSBmb3IgdGhlIEMrKyBjbGFzcyBDVFlQRToKCiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9TUEVDSUFMSVpFX01JTklNVU0oQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICB1c2FnZSBzaG91bGQgYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyCgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRShDU1RZUEUsIENUWVBFKQogICAgICAgICAgICAgIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoOgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQoQ1RZUEUpCgogICAgICAgICAgICBTb21lIG1vcmUgZGV0YWlscyBpbiBjc2hhcnAvc3RkX3ZlY3Rvci5pCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDctMzE6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggaW5kZW50YXRpb24gc28gdGhhdCB3ZSBnaXZlIGEgdXNlZnVsIGVycm9yIGlmIHRoZQoJICAgIG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQuICBQYXRjaCBmcm9tIEdhZXRhbiBMZWhtYW5uIGluIFNGIzI4Mjk4NTMuCgoyMDA5LTA3LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHR5cGVtYXAobWV0aG9kLCB0eXBlbGlzdCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNyby4gVGhpcyBhbGxvd3MKICAgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgdHlwZW1hcCB0byBiZSBpbnNlcnRlZCB3aXRoaW4gYW5vdGhlciB0eXBlbWFwLgogICAgICAgICAgICBGdWxseSBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTA3LTI5OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFyZSBub3cgcHJlZml4ZWQgd2l0aCB0aGUKICAgICAgICAgICAgY2xhc3MgbmFtZS4gVGhpcyBhbGxvd3Mgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgd2l0aCB0aGUKICAgICAgICAgICAgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBjbGFzc2VzLgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGxvY2tzIHRvIHN0ZDo6bWFwIHdyYXBwZXJzLiAgUGF0Y2ggZnJvbSAKCSAgICBQYXVsIEhhbXBzb24gaW4gU0YjMjgxMzgzNi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIE9VVFBVVCB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEhpdG9zaGkKCSAgICBBbWFubyBpbiBTRiMyODI2MzIyLgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBQSFAgcmVzb3VyY2UgZGVzdHJ1Y3RvciBmb3IgY2xhc3NlcwoJICAgIHdpdGhvdXQgYSBkZXN0cnVjdG9yIGFuZCBub24tY2xhc3MgdHlwZXMuICBQYXRjaCBmcm9tIEhpdG9zaGkgQW1hbm8KCSAgICBpbiBTRiMyODI1MzAzLgoKMjAwOS0wNy0yODogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB3YXJuaW5ncyBhYm91dCBjbGFzaGVzIGJldHdlZW4gaWRlbnRpZmllcnMgYW5kIFBIUAoJICAgIGtleXdvcmRzIGFuZCBhdXRvbWF0aWMgcmVuYW1pbmcgdG8gd29yayB3aXRoIHRoZSBQSFA1IGNsYXNzCgkgICAgd3JhcHBlcnMuICBGaXhlcyBTRiMxNjEzNjc5LgoKMjAwOS0wNy0yODogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBJZiBhIG1lbWJlciBmdW5jdGlvbiBpcyBub3QgcHVibGljIGJ1dCBpdCBoYXMgYSBiYXNlCiAgICAgICAgICAgIHdoaWNoIGlzIHB1YmxpYywgdGhlbiBub3cgYSB3YXJuaW5nIGlzIGlzc3VlZCBhbmQgdGhlIG1lbWJlcgogICAgICAgICAgICBmdW5jdGlvbiB3aWxsIGJlIHB1YmxpYywgYXMgUEhQIHJlcXVpcmVzIHRoaXMuCgoyMDA5LTA3LTIxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQuCgoyMDA5LTA3LTE1OiBvbGx5CgkgICAgW1BlcmxdIERvbid0IHNwZWNpZnkgUGVybCBwcm90b3R5cGUgIigpIiBmb3IgYSBjb25zdHJ1Y3RvciB3aXRoIGEKCSAgICBkaWZmZXJlbnQgbmFtZSB0byB0aGUgY2xhc3MsIGFzIHN1Y2ggY29uc3RydWN0b3JzIGNhbiBzdGlsbCB0YWtlCgkgICAgcGFyYW1ldGVycy4KCjIwMDktMDctMTI6IHhhdmllcjk4CgkgICAgW09jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIE9jdGF2ZSAzLjIgQVBJCgoyMDA5LTA3LTA1OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0IG9mIFBIUCBrZXl3b3JkcyAtICJjZnVuY3Rpb24iIGlzIG5vIGxvbmdlciBhCgkgICAga2V5d29yZCBpbiBQSFA1IGFuZCBQSFAgNS4zIGFkZGVkICJnb3RvIiwgIm5hbWVzcGFjZSIsICJfX0RJUl9fIiwKCSAgICBhbmQgIl9fTkFNRVNQQUNFX18iLgoKMjAwOS0wNy0wMzogb2xseQoJICAgIFtUY2xdIFRvIGNvbXBsZW1lbnQgVVNFX1RDTF9TVFVCUywgYWRkIHN1cHBvcnQgZm9yIFVTRV9US19TVFVCUwoJICAgIGFuZCBTV0lHX1RDTF9TVFVCU19WRVJTSU9OLiAgRG9jdW1lbnQgYWxsIHRocmVlIGluIHRoZSBUY2wgY2hhcHRlcgoJICAgIG9mIHRoZSBtYW51YWwuICBCYXNlZCBvbiBwYXRjaCBmcm9tIFNGIzI4MTAzODAgYnkgQ2hyaXN0aWFuCgkgICAgR29sbHdpdHplci4KCjIwMDktMDctMDI6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gQWRkZWQgZmFjdG9yeS5pIGZvciBQSFAsIHNlZSB0aGUgbGlfZmFjdG9yeSB0ZXN0Y2FzZQogICAgICAgICAgICBmb3IgbW9yZSBpbmZvIG9uIGhvdyB0byB1c2UgaXQuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLVdhbGxrdyBvcHRpb24gYXMgcmVwb3J0ZWQgYnkgU29sb21vbiBHaWJicy4KCjIwMDktMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzeW50YXggZXJyb3Igd2hlbiBhIG5lc3RlZCBzdHJ1Y3QgY29udGFpbnMgYSBjb21tZW50IGNvbnRhaW5pbmcgYSAqIGZvbGxvd2VkIAogICAgICAgICAgICBldmVudHVhbGx5IGJ5IGEgLy4gUmVncmVzc2lvbiBmcm9tIDEuMy4zNywgcmVwb3J0ZWQgYnkgU29sb21vbiBHaWJicy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVW5rbm93biBwcm9wZXJ0aWVzIGFyZSBubyBsb25nZXIgaWdub3JlZCBpbiBwcm94eQogICAgICAgICAgICBjbGFzc2VzLgoKMjAwOS0wNy0wMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBGaXhlZCAlbmV3b2JqZWN0IGJlaGF2aW91ciwgcHJldmlvdXNseSBhbnkgbWV0aG9kCiAgICAgICAgICAgIG1hcmtlZCB3aXRoICVuZXdvYmplY3Qgd2FzIGhhbmRsZWQgYXMgYSBjb25zdHJ1Y3Rvci4KCjIwMDktMDYtMzA6IG9sbHkKCSAgICBbUnVieV0gVW5kZWZpbmUgY2xvc2UgYW5kIGNvbm5lY3QgbWFjcm9zIGRlZmluZWQgYnkgUnVieSBBUEkKCSAgICBoZWFkZXJzIGFzIHdlIGRvbid0IG5lZWQgdGhlbSBhbmQgdGhleSBjYW4gY2xhc2ggd2l0aCBDKysgbWV0aG9kcwoJICAgIGJlaW5nIHdyYXBwZWQuICBQYXRjaCBmcm9tIFZpdCBPbmRydWNoIGluIFNGIzI4MTQ0MzAuCgoyMDA5LTA2LTI2OiBvbGx5CgkgICAgW1J1YnldIEZpeCB0byBoYW5kbGUgRklYTlVNIHZhbHVlcyBncmVhdGVyIHRoYW4gTUFYSU5UIHBhc3NlZCBmb3IgYQoJICAgIGRvdWJsZSBwYXJhbWV0ZXIuCgoyMDA5LTA2LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCB0aGUgY29tcGFjdGRlZmF1bHRhcmdzIGZlYXR1cmUgCiAgICAgICAgICAgIHdoZXJlIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFuZCBpcyBhc3NpZ25lZCBhIGRlZmF1bHQgdmFsdWUuIFRoZSBTd2lnVmFsdWVXcmFwcGVyCiAgICAgICAgICAgIHRlbXBsYXRlIHdvcmthcm91bmQgZm9yIGEgbWlzc2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIAogICAgICAgICAgICBnZW5lcmF0ZWQgZG9lcyBub3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KCjIwMDktMDYtMTY6IHdzZnVsdG9uCgkgICAgW0phdmEsQyNdIEZpeCBlbnVtIG1hcnNoYWxsaW5nIHdoZW4gJWlnbm9yZSBpcyB1c2VkIG9uIG9uZSBvZiB0aGUgZW51bSBpdGVtcy4KICAgICAgICAgICAgSW5jb3JyZWN0IGVudW0gdmFsdWVzIHdlcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBDKysgbGF5ZXIgb3IgY29tcGlsYXRpb24gZXJyb3JzIHJlc3VsdGVkLgoKMjAwOS0wNi0wMjogdGFsYnkKCSAgICBbUGVybF0gUmVzb2x2ZWQgcmVmZXJlbmNlLmkgb3ZlcmxvYWQgc3VwcG9ydCBwcm9ibGVtCgkgICAgaWRlbnRpZmllZCBieSBKb2huIFBvdG93c2t5LgoKMjAwOS0wNS0yNjogd3NmdWx0b24KCSAgICBbQyNdIEltcHJvdmVkIHN0ZDo6bWFwIHdyYXBwZXJzIGJhc2VkIG9uIHBhdGNoIGZyb20gWXV2YWwgQmFyb3IuIFRoZSBDIyBwcm94eQogICAgICAgICAgICBub3cgaW1wbGVtZW50cyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeTw+LgoKCSAgICBUaGVzZSBzdGQ6bWFwIHdyYXBwZXJzIGhhdmUgYSBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgb3ZlcmhhdWwgdG8gbWFrZSB0aGVtCiAgICAgICAgICAgIGxpa2UgYSAuTkVUIElEaWN0aW9uYXJ5LiBTb21lIG1ldGhvZCBuYW1lcyBoYXZlIGNoYW5nZWQgYXMgZm9sbG93aW5nOgogICAgICAgICAgICAgIHNldCAtPiBzZXRpdGVtICh1c2UgdGhpc1tdIHByb3BlcnR5IG5vdykKICAgICAgICAgICAgICBnZXQgLT4gZ2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgaGFzX2tleSAtPiBDb250YWluc0tleQogICAgICAgICAgICAgIGRlbCAtPiBSZW1vdmUKICAgICAgICAgICAgICBjbGVhciAtPiBDbGVhcgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgdXNlZCBmb3Igc3RkOjptYXAgd3JhcHBlcnMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgbm8gbG9uZ2VyIHdvcms6CiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2tleQogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl92YWx1ZQogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9ib3RoCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDUtMjA6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gQWRkIHRoZSAndGhpc293bicgbWVtYmVyIHRvIGNsYXNzZXMuIFRoZSB1c2FnZSBvZiBpdAogICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGUgUHl0aG9uIHRoaXNvd24gb25lOiBpdCdzIDEgYnkgZGVmYXVsdCBhbmQKICAgICAgICAgICAgeW91IGNhbiBzZXQgaXQgdG8gMCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IGZyZWVpbmcgaXQuIChGb3IKICAgICAgICAgICAgZXhhbXBsZSB0byBwcmV2ZW50IGEgZG91YmxlIGZyZWUuKQoKMjAwOS0wNS0xNDogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgd3JvbmcgcG9pbnRlciB2YWx1ZSByZXR1cm5lZCBieSBTd2lnUHlPYmplY3RfcmVwcigpLgoKMjAwOS0wNS0xMzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIE1pbm9yIHR3ZWFrIHdoZW4gd3JhcHBpbmcgaW4gLW5vY3dyYXAgbW9kZS4KCjIwMDktMDUtMTE6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6OnZlY3RvciB3cmFwcGVycyBvbiB0aGUgQyMgcHJveHkgc2lkZSBmcm9tIFl1dmFsIEJhcm9yLiBUaGVzZQoJICAgIGltcGxlbWVudCBJTGlzdDw+IGluc3RlYWQgb2YgSUVudW1lcmFibGU8PiB3aGVyZSBwb3NzaWJsZS4KCjIwMDktMDQtMjk6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBBZGQgdGhlICdub3RkZXJpdmVkJyBhdHRyaWJ1dGUgdG8gdGhlIGphdmFiYXNlIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgkgICAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSB0eXBlbWFwIHdpbGwgbm90IGFwcGx5IHRvIGNsYXNzZXMgdGhhdCBhcmUgZGVyaXZlZAoJICAgIGZyb20gYSBDKysgYmFzZSBjbGFzcywgZWcgCgkgICAgICAldHlwZW1hcChjc2Jhc2UsIG5vdGRlcml2ZWQ9IjEiKSBTV0lHVFlQRSAiQ29tbW9uQmFzZSIKCjIwMDktMDQtMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBEb24ndCBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIEdJTCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlCgkgICAga25vdyB0aGF0IGl0IHdpbGwgYWxyZWFkeSBiZSBsb2NrZWQuICBUaGlzIGF2b2lkcyBzb21lIGRlYWQtbG9ja3MKCSAgICB3aXRoIG1vZF9weXRob24gKGR1ZSB0byBtb2RfcHl0aG9uIGJ1Z3Mgd2hpY2ggYXJlIGFwcGFyZW50bHkKCSAgICB1bmxpa2VseSB0byBldmVyIGJlIGZpeGVkKSwgYW5kIHJlc3VsdHMgaW4gc21hbGxlciB3cmFwcGVycyB3aGljaAoJICAgIHJ1biBhIGxpdHRsZSBmYXN0ZXIgKGluIHRlc3RzIHdpdGggWGFwaWFuIG9uIHg4Ni02NCBVYnVudHUgOS4wNCwKCSAgICB0aGUgc3RyaXBwZWQgd3JhcHBlciBsaWJyYXJ5IHdhcyAxMSUgc21hbGxlciBhbmQgcmFuIDIuNyUgZmFzdGVyKS4KCjIwMDktMDQtMjE6IHdzZnVsdG9uCgkgICAgW0MjXSBGaXggIzI3NTM0NjkgLSBib29sICZPVVRQVVQgYW5kIGJvb2wgKk9VVFBVVCB0eXBlbWFwcyBpbml0aWFsaXNhdGlvbi4KCjIwMDktMDQtMDk6IHdzZnVsdG9uCgkgICAgRml4ICMyNzQ2ODU4IC0gQyBtYWNybyBleHByZXNzaW9uIHVzaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKCjIwMDktMDMtMzA6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVmYXVsdCBvdXQgdHlwZW1hcCBmb3IgY2hhcltBTlldIG5vdyByZXR1cm5zIHRoZSBzdHJpbmcgdXAgdG8gYQoJICAgIHplcm8gYnl0ZSwgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkgaWYgdGhlcmUgaXMgbm8gemVybyBieXRlLiAgVGhpcwoJICAgIGlzIHRoZSBzYW1lIGFzIFB5dGhvbiBkb2VzLCBhbmQgc2VlbXMgbW9yZSBnZW5lcmFsbHkgdXNlZnVsIHRoYW4KCSAgICB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIG9mIHJldHVybmluZyB0aGUgd2hvbGUgY29udGVudHMgb2YgdGhlIGFycmF5CgkgICAgaW5jbHVkaW5nIGFueSB6ZXJvIGJ5dGVzLiAgSWYgeW91IHdhbnQgdGhlIG9sZCBiZWhhdmlvdXIsIHlvdSBjYW4gcHJvdmlkZQoJICAgIHlvdXIgb3duIHR5cGVtYXAgdG8gZG8gdGhpczoKCgkgICAgJXR5cGVtYXAob3V0KSBjaGFyIFtBTlldCgkgICAgJXsKCQlSRVRWQUxfU1RSSU5HTCgkMSwgJDFfZGltMCwgMSk7CgkgICAgJX0KClZlcnNpb24gMS4zLjM5ICgyMSBNYXJjaCAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDMtMTk6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIG1lbW9yeSBsZWFrIHJlbGF0ZWQgdG8gUHl0aG9uIDMgdW5pY29kZSBhbmQgQyBjaGFyKiBjb252ZXJzaW9uLAogICAgICAgICAgICB3aGljaCBjYW4gYmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGJlZm9yZSB0aGlzIGZpeDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZyb20gbGlfY3N0cmluZyBpbXBvcnQgKgogICAgICAgICAgICAgICAgICBpPTAKICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMQogICAgICAgICAgICAgICAgICAgICAgbiA9IHN0cihpKSoxMAogICAgICAgICAgICAgICAgICAgICAgdGVzdDMobikKCiAgICAgICAgICAgIFRoaXMgZml4IGFmZmVjdGVkIFNXSUdfQXNDaGFyUHRyQW5kU2l6ZSgpIHNvIHlvdSBjYW5ub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGgKICAgICAgICAgICAgYSBudWxsIGFsbG9jIGFuZCBub24tbnVsbCBjcHRyIGFyZ3VtZW50IGluIFB5dGhvbiAzLCBvdGhlcndpc2UgYSBydW50aW1lIGVycm9yCiAgICAgICAgICAgIHdpbGwgYmUgcmFpc2VkLgoKMjAwOS0wMy0xODogd3NmdWx0b24KCSAgICBbQyNdIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXIgaW1wcm92ZW1lbnRzIGZvciAuTkVUIDIgYW5kIGFsc28gcHJvdmlkaW5nIHRoZQoJICAgIG5lY2Vzc2FyeSBtYWNoaW5lcnkgdG8gdXNlIHRoZSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVycyB3aXRoIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgc3VjaAoJICAgIGFzIExJTlEgLSB0aGUgQyMgcHJveHkgY2xhc3Mgbm93IGRlcml2ZXMgZnJvbSBJRW51bWVyYWJsZTw+LiBUaGUgZGVmYXVsdCBpcyBub3cgdG8gCgkgICAgZ2VuZXJhdGUgY29kZSByZXF1aXJpbmcgLk5FVCAyIGFzIGEgbWluaW11bSwgYWx0aG91Z2ggdGhlIEMjIGNvZGUgY2FuIGJlIGNvbXBpbGVkIAoJICAgIGZvciAuTkVUIDEgYnkgZGVmaW5pbmcgdGhlIFNXSUdfRE9UTkVUXzEgQyMgcHJlcHJvY2Vzc29yIGNvbnN0YW50LiBTZWUgdGhlIAoJICAgIHN0ZF92ZWN0b3IuaSBmaWxlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDMtMTI6IHdzZnVsdG9uCgkgICAgW1J1YnldIEZpeCAjMjY3NjczOCBTV0lHIGdlbmVyYXRlZCBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIFNvbWUgZml4ZXMgZm9yIFB5dGhvbiAzLjAuMSBhbmQgaGlnaGVyIHN1cHBvcnQuIEluIDMuMC4xLCB0aGUgQyBBUEkgZnVuY3Rpb24KICAgICAgICAgICAgUHlPYmplY3RfQ29tcGFyZSBpcyByZW1vdmVkLCBzbyBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wgaXMgdXNlZCBmb3IgcmVwbGFjZW1lbnQuCiAgICAgICAgICAgIFN0cnVjdCBpbml0aWxpemF0aW9uIG9mIFN3aWdQeU9iamVjdCBhbmQgU3dpZ1B5T2JqZWN0X2FzX251bWJlciBjaGFuZ2VkIHRvIHJlZmxlY3QKICAgICAgICAgICAgdGhlIGRyb3Agb2YgdHBfY29tcGFyZSBhbmQgbmJfbG9uZy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU4MzE2MC4gTm93IHRoZSBpbXBvcnRlciBpbiBQeXRob24gc2hhZG93IHdyYXBwZXIgdGFrZSBjYXJlIG9mIHRoZQogICAgICAgICAgICBjYXNlIHRoYXQgbW9kdWxlIGFscmVhZHkgaW1wb3J0ZWQgYXQgb3RoZXIgcGxhY2UuCgoyMDA5LTAyLTI4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI2MzczNTIuIE1vdmUgc3RydWN0IGRlY2xhcmF0aW9uIG9mIFNXSUdfbW9kdWxlIGluIHB5aW5pdC5zd2cgYmVmb3JlCiAgICAgICAgICAgIHRoZSBtZXRob2QgY2FsbHMsIHNpbmNlIHNvbWUgQyBjb21waWxlciBkb24ndCBhbGxvdyBkZWNsYXJhdGlvbiBpbiBtaWRkbGUgb2YgZnVuY3Rpb24KICAgICAgICAgICAgYm9keS4KCjIwMDktMDItMjE6IHdzZnVsdG9uCgkgICAgW0FsbGVncm9jbF0gRml4IHNlZyBmYXVsdCB3cmFwcGluZyBzb21lIGNvbnN0YW50IHZhcmlhYmxlICglY29uc3RhbnQpIHR5cGVzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBbQ0ZGSV0gRml4IHNlZyBmYXVsdHMgd2hlbiBmb3IgJWV4dGVuZCBhbmQgdXNpbmcgc3RhdGVtZW50cy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgRml4IFNGICMyNjA1OTU1OiAtY28gb3B0aW9uIHdoaWNoIGJyb2tlIGluIDEuMy4zNy4gCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIE5ldyAlaW5zZXJ0KCJiZWdpbiIpIHNlY3Rpb24gYWRkZWQuIEFsc28gY2FuIGJlIHVzZWQgYXMgJWJlZ2luLiBUaGlzIGlzIGEgbmV3CgkgICAgY29kZSBzZWN0aW9uIHJlc2VydmVkIGVudGlyZWx5IGZvciB1c2VycyBhbmQgdGhlIGNvZGUgd2l0aGluIHRoZSBzZWN0aW9uIGlzIGdlbmVyYXRlZAoJICAgIGF0IHRoZSB0b3Agb2YgdGhlIEMvQysrIHdyYXBwZXIgZmlsZSBhbmQgc28gcHJvdmlkZXMgYSBtZWFucyB0byBwdXQgY3VzdG9tIGNvZGUKCSAgICBpbnRvIHRoZSB3cmFwcGVyIGZpbGUgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdCBTV0lHIGdlbmVyYXRlcy4KCjIwMDktMDItMTc6IHdzZnVsdG9uCgkgICAgJ21ha2UgY2xlYW4tdGVzdC1zdWl0ZScgd2lsbCBub3cgcnVuIGNsZWFuIG9uIEFMTCBsYW5ndWFnZXMuIFByZXZpb3VzbHkgaXQgb25seQoJICAgIHJhbiB0aGUgY29ycmVjdGx5IGNvbmZpZ3VyZWQgbGFuZ3VhZ2VzLiBUaGlzIHdheSBpdCBpcyBub3cgcG9zc2libGUgdG8gY2xlYW4gdXAKCSAgICBwcm9wZXJseSBhZnRlciBydW5uaW5nICdtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlJy4KCjIwMDktMDItMTQ6IHdzZnVsdG9uCgkgICAgRXh0ZW5kIGF0dHJpYnV0ZSBsaWJyYXJ5IHN1cHBvcnQgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyB1c2UKCSAgICBwYXNzL3JldHVybiBieSB2YWx1ZSBzZW1hbnRpY3MuIFR3byBuZXcgbWFjcm9zIGFyZSBhdmFpbGFibGUgYW5kIHVzYWdlIGlzIGlkZW50aWNhbAoJICAgIHRvICVhdHRyaWJ1dGUuIFRoZXNlIGFyZSAlYXR0cmlidXRldmFsIGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kICVhdHRyaWJ1dGVzdHJpbmcgZm9yCgkgICAgc3RyaW5nIGNsYXNzZXMsIGxpa2Ugc3RkOjpzdHJpbmcuIFNlZSBhdHRyaWJ1dGUuc3dnIGZvciBtb3JlIGRldGFpbHMuCgoyMDA5LTAyLTEzOiB3c2Z1bHRvbgoJICAgIEFkZCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcy4gUHJldmlvdXNseSB0aGUgbWVtYmVyaW4gdHlwZW1hcHMgd2VyZQoJICAgIGlnbm9yZWQgZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KCjIwMDktMDItMTI6IHdzZnVsdG9uCgkgICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHRlbXBvcmFyeSB2YXJpYWJsZSB3aGVuIHdyYXBwaW5nIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gCgkgICAgRXhhbXBsZSBvZiBnZW5lcmF0ZWQgY29kZSBmb3Igd3JhcHBpbmc6CgoJICAgICAgc3RydWN0IFhZWiB7CgkJc3RkOjpzdHJpbmcmIHJlZlJldHVybigpOwoJICAgICAgfTsKCgkgICAgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlc3VsdCA9IDAgOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZfcmVzdWx0X3JlZiA9IChhcmcxKS0+cmVmUmV0dXJuKCk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJl9yZXN1bHRfcmVmOwogICAgICAgICAgICAgIH0KCgkgICAgIE5vdyBpdCBpczoKCiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlc3VsdCA9IDAgOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmKGFyZzEpLT5yZWZSZXR1cm4oKTsKCjIwMDktMDItMDg6IGJoeQogICAgICAgICAgICBDaGFuZ2UgdGhlIFNJWkUgbWFwcGVkIGJ5ICVweWJ1ZmZlcl9tdXRhYmxlX2JpbmFyeSBhbmQgJXB5YnVmZmVyX2JpbmFyeSBpbiBweWJ1ZmZlci5pIGZyb20KICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRvIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlci4KCjIwMDktMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZmVhdHVyZSBub3Qgd29ya2luZyBmb3IgY29udmVyc2lvbiBvcGVyYXRvcnMsIHJlcG9ydGVkIGJ5IE1hdHQgU3ByYWd1ZSwgZm9yIGV4YW1wbGU6CgkgICAgICAlZmVhdHVyZSgiY3M6bWV0aG9kbW9kaWZpZXJzIikgb3BlcmF0b3IgYm9vbCAicHJvdGVjdGVkIjsKCjIwMDktMDItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNelNjaGVtZV0gQXBwbHkgIzIwODE5NjcgY29uZmlndXJlIGNoYW5nZXMgZm9yIGV4YW1wbGVzIHRvIGJ1aWxkIHdpdGggcmVjZW50IFBMVCB2ZXJzaW9ucy4KCSAgICBBbHNvIGZpeGVzIE1ha2VmaWxlIGVycm9ycyBidWlsZGluZyBTV0lHIGV4ZWN1dGFibGUgd2hlbiBtenNjaGVtZSBwYWNrYWdlIGlzIGluc3RhbGxlZCAKCSAgICAodmVyc2lvbiAzLjcyIGFwcHJveCBhbmQgbGF0ZXIpLgoKMjAwOS0wMi0wNDogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEZpeCBTRiMyNTY0MTkyIHJlcG9ydGVkIGJ5IERhdmlkIEtvbG92cmF0bmsuCiAgICAgICAgICAgIFNXSUdfQXNDaGFyUHRyQW5kU2l6ZSgpIG5vdyBoYW5kbGVzICJnZXQiIG1hZ2ljLgoKVmVyc2lvbiAxLjMuMzggKDMxIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMzE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU1MjQ4OCByZXBvcnRlZCBieSBHYWV0YW4gTGVobWFubi4gTm93ICVweXRob25wcmVwZW5kCiAgICAgICAgICAgIGFuZCAlcHl0aG9uYXBwZW5kIGhhdmUgY29ycmVjdCBpbmRlbnRhdGlvbi4KCjIwMDktMDEtMzE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU1MjA0OCByZXBvcnRlZCBieSBHYWV0YW4gTGVobWFubi4gVGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgIG9mIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gaW4gZ2VuZXJhdGVkIHByb3h5IGNvZGUgc2hvdWxkIG5vdCBoYXZlIHRoZQogICAgICAgICAgICAnc2VsZicgcGFyYW1ldGVyLgoKMjAwOS0wMS0yOTogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDEuMy4zNyB3aGVyZSB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5CgkgICAgZm9yIHRhcmdldCBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyAoaW4gdGhlIGFic2VuY2Ugb2YgLW91dGRpcikgd2FzIG5vCgkgICAgbG9uZ2VyIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ2VuZXJhdGVkIGMvYysrIGZpbGUuCgoyMDA5LTAxLTI4OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gRml4IHByb3h5IGNsYXNzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIGdsb2JhbCBzY29wZSBvcGVyYXRvcgoJICAgIHdhcyB1c2VkIGZvciBwYXJhbWV0ZXJzIHBhc3NlZCBieSB2YWx1ZS4gUmVwb3J0ZWQgYnkgRGF2aWQgUGllcGdyYXNzLgoKMjAwOS0wMS0xNTogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IHNlZyBmYXVsdCB3aGVuIHJ1bm5pbmcgd2l0aCAtdiBvcHRpb24sIHJlcG9ydGVkIGJ5IEpvaG4gS3kuCgpWZXJzaW9uIDEuMy4zNyAoMTMgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0xMzogbWdvc3NhZ2UKCSAgICBbTHVhXSBBZGRlZCBjb250cmFjdCBzdXBwb3J0IGZvciByZXF1aXJpbmcgdGhhdCB1bnNpZ25lZCBudW1iZXJzIGFyZSA+PTAKCSAgICBSZXdyb3RlIG11Y2ggb2YgRXhhbXBsZXMvTHVhL2VtYmVkMy4gCgkgICAgQWRkZWQgYSBsb3QgdG8gdGhlIEx1YSBkb2N1bWVudGF0aW9uLgoKMjAwOS0wMS0xMzogd3NmdWx0b24KCSAgICBGaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyBkaXJlY3RvcnMgb24gcHJvdGVjdGVkIHZpcnR1YWwgb3ZlcmxvYWRlZCAKCSAgICBtZXRob2RzIHJlcG9ydGVkIGJ5IFNhbSBIZW5kbGV5LgoKMjAwOS0wMS0xMjogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGhhbmRsaW5nIG9mIGludGVnZXIgYXJyYXlzCgoyMDA5LTAxLTEwOiBkcmpvZQoJICAgIFtSXSBGaXggaW50ZWdlciBoYW5kbGluZyBpbiByIHRvIGRlYWwgY29ycmVjdGx5IHdpdGggc2lnbmVkCgkgICAgYW5kIHVuc2lnbmVkIGlzc3VlcwoKMjAwOS0wMS0xMDogd3NmdWx0b24KCSAgICBQYXRjaCAgIzE5OTI3NTYgZnJvbSBDb2xpbiBNY0RvbmFsZCAtICVjb250cmFjdCBub3Qgd29ya2luZyBmb3IgY2xhc3NlcyAKCSAgICBpbiBuYW1lc3BhY2UKCjIwMDktMDEtMDU6IG9sbHkKCSAgICBNYXJrIFNXSUdQRVJMNSwgU1dJR1BIUDUsIGFuZCBTV0lHVENMOCBhcyBkZXByZWNhdGVkIGluIHRoZSBzb3VyY2UKCSAgICBjb2RlIGFuZCByZW1vdmUgZG9jdW1lbnRhdGlvbiBvZiB0aGVtLgoKMjAwOC0xMi0zMDogd3NmdWx0b24KCSAgICBCdWcgIzI0MzA3NTYuIEFsbCB0aGUgbGFuZ3VhZ2VzIG5vdyBkZWZpbmUgYSBtYWNybyBpbiB0aGUgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBmaWxlIGluZGljYXRpbmcgd2hpY2ggbGFuZ3VhZ2UgaXMgYmVpbmcgd3JhcHBlZC4gVGhlIG1hY3JvIG5hbWUgaXMgdGhlCgkgICAgc2FtZSBhcyB0aG9zZSBkZWZpbmVkIHdoZW4gU1dJRyBpcyBydW4sIGVnIFNXSUdKQVZBLCBTV0lHT0NUQVZFLCBTV0lHQ1NIQVJQIGV0YwoJICAgIGFuZCBhcmUgbGlzdGVkIGluIHRoZSAiQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24iIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDA4LTEyLTIzOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzIxNTM3NzMgLSAlbm9qYXZhZXhjZXB0aW9uIHdhcyBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgaW5zdGVhZCBvZiBkaXNhYmxpbmcgaXQuIENsZWFyaW5nIGNoZWNrZWQgSmF2YSBleGNlcHRpb25zIGFsc28gZGlkbid0IHdvcmsuIAoJICAgIFRoZSBuZXcgJWNsZWFyamF2YWV4Y2VwdGlvbiBjYW4gYmUgdXNlZCBmb3IgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlLgoKMjAwOC0xMi0yMjogd3NmdWx0b24KCSAgICBGaXggIzI0MzI4MDEgLSBNYWtlIFN3aWdWYWx1ZVdyYXBwZXIgZXhjZXB0aW9uIHNhZmUgZm9yIHdoZW4gY29weSBjb25zdHJ1Y3RvcnMKCSAgICB0aHJvdyBleGNlcHRpb25zLgoKMjAwOC0xMi0yMTogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjQ0MDA0NiB3aGljaCBmaXhlcyBwb3NzaWJsZSBzZWcgZmF1bHRzIGZvciBtZW1iZXIgYW5kIGdsb2JhbAoJICAgIHZhcmlhYmxlIGNoYXIgYXJyYXlzIHdoZW4gdGhlIHN0cmluZ3MgYXJlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgYXJyYXkgc2l6ZS4KCjIwMDgtMTItMjA6IHdzZnVsdG9uCgkgICAgVGhlIGNjYWNoZSBjb21waWxlciBjYWNoZSBoYXMgYmVlbiBhZGFwdGVkIHRvIHdvcmsgd2l0aCBTV0lHIGFuZAoJICAgIG5hbWVkIGNjYWNoZS1zd2lnLiBJdCBub3cgd29ya3Mgd2l0aCBDL0MrKyBjb21waWxlcnMgYXMgd2VsbCBhcyBTV0lHCgkgICAgYW5kIGNhbiByZXN1bHQgaW4gaW1wcmVzc2l2ZSBzcGVlZHVwcyB3aGVuIHVzZWQgdG8gcmVjb21waWxlIHVuY2hhbmdlZAoJICAgIGNvZGUgd2l0aCBlaXRoZXIgYSBDL0MrKyBjb21waWxlciBvciBTV0lHLiBEb2N1bWVudGF0aW9uIGlzIGluIENDYWNoZS5odG1sCgkgICAgb3IgdGhlIGluc3RhbGxlZCBjY2FjaGUtc3dpZyBtYW4gcGFnZS4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggZnJvbSBLYWx5YW5vdiBEbWl0cnkgd2hpY2ggZml4ZXMgcGFyc2luZyBvZiBuZXN0ZWQgc3RydWN0cwoJICAgIGNvbnRhaW5pbmcgY29tbWVudHMuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEZpeCBlcnJvciBtZXNzYWdlIGluIHNvbWUgbmVzdGVkIHN0cnVjdCBhbmQgJWlubGluZSBwYXJzaW5nIGVycm9yIHNpdHVhdGlvbnMKCSAgICBzdWNoIGFzIHVudGVybWluYXRlZCBzdHJpbmdzIGFuZCBjb21tZW50cy4KCjIwMDgtMTItMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXIgd2l0aCBHQ0MgNC4zLgoKMjAwOC0xMi0wNjogd3NmdWx0b24KCSAgICBbUEhQXSBEZXByZWNhdGUgJXByYWdtYShwaHA0KS4gUGxlYXNlIHVzZSAlcHJhZ21hKHBocCkgaW5zdGVhZC4KCSAgICBUaGUgZm9sbG93aW5nIHR3byB3YXJuaW5ncyBoYXZlIGJlZW4gcmVuYW1lZDoKCSAgICBXQVJOX1BIUDRfTVVMVElQTEVfSU5IRVJJVEFOQ0UgLT4gV0FSTl9QSFBfTVVMVElQTEVfSU5IRVJJVEFOQ0UKCSAgICBXQVJOX1BIUDRfVU5LTk9XTl9QUkFHTUEgICAgICAgLT4gV0FSTl9QSFBfVU5LTk9XTl9QUkFHTUEKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wNDogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggU0YjMjE1ODkzODogYWxsIHRoZSBTV0lHIHN5bWJvbCBuYW1lcyBzdGFydGVkIHdpdGggUHkKICAgICAgICAgICAgYXJlIGNoYW5nZWQsIHNpbmNlIHRoZXkgYXJlIGluYXBwcm9wcmlhdGUgYW5kIGRpc2NvdXJhZ2VkIGluIFB5dGhvbgogICAgICAgICAgICBkb2N1bWVudGF0aW9uIChmcm9tIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMi41LjIvYXBpL2luY2x1ZGVzLmh0bWwpOgoKICAgICAgICAgICAgIkFsbCB1c2VyIHZpc2libGUgbmFtZXMgZGVmaW5lZCBieSBQeXRob24uaCAoZXhjZXB0IHRob3NlIGRlZmluZWQgYnkKICAgICAgICAgICAgdGhlIGluY2x1ZGVkIHN0YW5kYXJkIGhlYWRlcnMpIGhhdmUgb25lIG9mIHRoZSBwcmVmaXhlcyAiUHkiIG9yICJfUHkiLgogICAgICAgICAgICBOYW1lcyBiZWdpbm5pbmcgd2l0aCAiX1B5IiBhcmUgZm9yIGludGVybmFsIHVzZSBieSB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgZXh0ZW5zaW9uIHdyaXRlcnMuIFN0cnVjdHVyZSBtZW1iZXIgbmFtZXMgZG8KICAgICAgICAgICAgbm90IGhhdmUgYSByZXNlcnZlZCBwcmVmaXguCgogICAgICAgICAgICBJbXBvcnRhbnQ6IHVzZXIgY29kZSBzaG91bGQgbmV2ZXIgZGVmaW5lIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCAiUHkiIG9yICJfUHkiLgogICAgICAgICAgICBUaGlzIGNvbmZ1c2VzIHRoZSByZWFkZXIsIGFuZCBqZW9wYXJkaXplcyB0aGUgcG9ydGFiaWxpdHkgb2YgdGhlIHVzZXIKICAgICAgICAgICAgY29kZSB0byBmdXR1cmUgUHl0aG9uIHZlcnNpb25zLCB3aGljaCBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgbmFtZXMgYmVnaW5uaW5nCiAgICAgICAgICAgIHdpdGggb25lIG9mIHRoZXNlIHByZWZpeGVzLiIKCiAgICAgICAgICAgIEhlcmUgaXMgYSBicmllZiBsaXN0IG9mIHdoYXQgY2hhbmdlZDoKCiAgICAgICAgICAgICAgICBQeVN3aWcqIC0+IFN3aWdQeSoKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3B0ciAtPiBTd2lnUHRyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeU9iamVjdF92YXIgLT4gU3dpZ1Zhcl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlTZXF1ZW5jZV9CYXNlLCBQeVNlcXVlbmNlX0NvbnQsIFB5U2VxdWVuY2VfUmVmIC0+CiAgICAgICAgICAgICAgICAgICAgICAgIFN3aWdQeVNlcXVlbmNlX0Jhc2UsIFN3aWdQeVNlcXVlbmNlX0NvbnQsIFN3aWdQeVNlcXVlbmNlX1JlZgogICAgICAgICAgICAgICAgUHlNYXAqIC0+IFN3aWdQeU1hcCoKCiAgICAgICAgICAgIFdlIHByb3ZpZGVkIGEgcHluYW1lX2NvbXBhdC5pIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBVc2VycyB3aG9zZSBjb2RlIGhhdmluZwogICAgICAgICAgICB0aGVzZSBzeW1ib2xzIGFuZCBkbyBub3Qgd2FudCB0byBjaGFuZ2UgaXQgY291bGQgc2ltcGx5IGluY2x1ZGUgdGhpcyBmaWxlCiAgICAgICAgICAgIGF0IGZyb250IG9mIHlvdXIgY29kZS4gQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gcnVuIHRoZSBjb252ZXJ0aW5nIHRvb2wgb24KICAgICAgICAgICAgeW91ciBjb2RlLCB3aGljaCBoYXMgYmVlbiBwdXQgaW4gU1dJRydzIFNWTiB0cnVuayAoVG9vbHMvcHluYW1lX3BhdGNoLnB5KSBhbmQKICAgICAgICAgICAgeW91IGNhbiBkb3dubG9hZCBpdCBoZXJlOgogICAgICAgICAgICBodHRwczovL3N3aWcuc3ZuLnNvdXJjZWZvcmdlLm5ldC9zdm5yb290L3N3aWcvdHJ1bmsvVG9vbHMvcHluYW1lX3BhdGNoLnB5IAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMyMTQzNzI3IGZyb20gU2VyZ2UgTW9ua2V3aXR6IHRvIGZpeCBpbXBvcnRpbmcgYmFzZSBjbGFzc2VzIAoJICAgIHdoZW4gdGhlIHBhY2thZ2Ugb3B0aW9uIGlzIHNwZWNpZmllZCBpbiAlbW9kdWxlIGFuZCB0aGF0IG1vZHVsZSBpcyAlaW1wb3J0J2VkLgoKMjAwOC0xMS0yODogd3NmdWx0b24KCSAgICBbVVRMXSBGaXggIzIwODA0OTcuIFNvbWUgaW5jb3JyZWN0IGFjY2VwdGFuY2Ugb2YgdHlwZXMgaW4gdGhlIFNUTCwgZWcgYSBkb3VibGUgKiBlbGVtZW50CgkgICAgcGFzc2VkIGludG8gYSB2ZWN0b3I8aW50ICo+IGNvbnN0cnVjdG9yIHdvdWxkIGJlIGFjY2VwdGVkLCBidXQgdGhlIGVuc3VpbmcgYmVoYXZpb3VyCgkgICAgd2FzIHVuZGVmaW5lZC4gTm93IHRoZSB0eXBlIGNvbnZlcnNpb24gY29ycmVjdGx5IHJhaXNlcyBhbiBleGNlcHRpb24uCgoyMDA4LTExLTI0OiB3c2Z1bHRvbgoJICAgIEFkZCAtb3V0Y3VycmVudGRpciBvcHRpb24uIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5IHRvIHRoZSBjdXJyZW50IAoJICAgIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gZW5hYmxlcwoJICAgIGJlaGF2aW91ciBzaW1pbGFyIHRvIGMvYysrIGNvbXBpbGVycy4gTm90ZSB0aGF0IHRoaXMgY29udHJvbHMgdGhlIG91dHB1dCBkaXJlY3RvcnksCgkgICAgYnV0IG9ubHkgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIC1vIGFuZC9vciAtb3V0ZGlyIG9wdGlvbnMuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIFtydWJ5XSBBcHBseSBwYXRjaCAjMjI2Mzg1MCB0byBmaXggcnVieS9maWxlLmkgLi4uIHJ1Ynlpby5oIGZpbGVuYW1lIGNoYW5nZSBpbiAKCSAgICBydWJ5IDEuOS4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzIzMTk3OTAgZnJvbSBKb2hhbiBIYWtlIHRvIGZpeCBzaGFyZWRfcHRyIHVzYWdlIGluIHN0ZDo6dHIxIG5hbWVzcGFjZS4KCjIwMDgtMTEtMjE6IHdzZnVsdG9uCgkgICAgVGhlIHVzZSBvZiB0aGUgaW5jbHVkZSBwYXRoIHRvIGZpbmQgdGhlIGlucHV0IGZpbGUgaXMgbm93IGRlcHJlY2F0ZWQuCgkgICAgVGhpcyBtYWtlcyB0aGUgYmVoYXZpb3VyIG9mIFNXSUcgdGhlIHNhbWUgYXMgQy9DKysgY29tcGlsZXJzIGluIHByZXBhcmF0aW9uCgkgICAgZm9yIHVzZSB3aXRoIGNjYWNoZS4KCjIwMDgtMTEtMTY6IHdzZnVsdG9uCgkgICAgRml4IC1ub3ByZXByb2Nlc3Mgb3B0aW9uIHRvOgoJICAgIC0gY29ycmVjdGx5IHJlcG9ydCBmaWxlIG5hbWVzIGluIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzLgoJICAgIC0gdXNlIHRoZSBvcmlnaW5hbCBpbnB1dCBmaWxlbmFtZSB0aGF0IGNyZWF0ZWQgdGhlIHByZXByb2Nlc3NlZCBvdXRwdXQgd2hlbiAKCSAgICAgIGRldGVybWluaW5nIHRoZSBDKysgd3JhcHBlciBmaWxlIG5hbWUgKGluIHRoZSBhYnNlbmNlIG9mIC1vKS4gUHJldmlvdXNseSAKCSAgICAgIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgdGhlIHByZXByb2Nlc3NlZCBvdXRwdXQgd2FzIHVzZWQuCgoyMDA4LTExLTExOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBZGQgcGF0Y2ggIzIxNTI2OTEgZnJvbSBNQVRTVVVSQSBUYWthbm9yaSB3aGljaCBmaXhlcyBjb21waWxlcyB1c2luZyB0aGUKCSAgICBJbnRlbCBjb21waWxlcgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHBhdGNoICMyMTI4MjQ5IGZyb20gQW5hdG9seSBUZWNodG9uaWsgd2hpY2ggY29ycmVjdHMgdGhlIEMvQysrIHByb3h5CiAgICAgICAgICAgIGNsYXNzIGJlaW5nIHJlcG9ydGVkIGZvciBQeXRob24gZG9jc3RyaW5ncyB3aGVuICVyZW5hbWUgaXMgdXNlZC4KCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgc3RyaXAgZW5jb2RlciBwYXRjaCBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrICMyMTMwMDE2LiBUaGlzIGVuYWJsZXMgYW4gCiAgICAgICAgICAgIGVhc3kgd2F5IHRvIHJlbmFtZSBzeW1ib2xzIGJ5IHN0cmlwcGluZyBhIGNvbW1vbmx5IHVzZWQgcHJlZml4IGluIGFsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24vc3RydWN0IG5hbWVzLiBJdCB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG90aGVyIGVuY29kZXJzLCBzdWNoIGFzCiAgICAgICAgICAgIHRpdGxlLCBsb3dlciwgY29tbWFuZCBldGMgb3V0bGluZWQgaW4gQ0hBTkdFUyBmaWxlIGRhdGVkIDEyLzMwLzIwMDUuIEV4YW1wbGUKICAgICAgICAgICAgYmVsb3cgd2lsbCByZW5hbWUgd3hBbm90aGVyV2lkZ2V0IHRvIEFub3RoZXJXaWRnZXQgYW5kIHd4RG9Tb21ldGhpbmcgdG8gCiAgICAgICAgICAgIERvU29tZXRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHN0cmlwOlt3eF0pcyIpICIiOyAKCiAgICAgICAgICAgICAgc3RydWN0IHd4QW5vdGhlcldpZGdldCB7CiAgICAgICAgICAgICAgICAgIHZvaWQgd3hEb1NvbWV0aGluZygpOwogICAgICAgICAgICAgIH07CgoyMDA4LTA5LTI2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgTG90cyBvZiB0ZXN0LXN1aXRlIHdvcmsuCgkgICAgLSBGaXggb3JkZXJpbmcgb2Ygd3JhcHBlciBvdXRwdXQgYW5kICV7ICV9IGhlYWRlciBvdXRwdXQuCgkgICAgLSBGaXggZGVjbGFyYXRpb25zIG9mIGxvY2FsIHZhcnMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBkZWZpbmVkIGNvbnN0YW50cyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIEVudW1WYWx1ZXMgaW4gQyB3cmFwcGVycy4KCSAgICAtIGFkZCBzb21lIGNvbnN0IHR5cGVtYXBzIHRvIGFsbGVncm9jbC5zd2cKCSAgICAtIGFkZCByZW5hbWUgZm9yIG9wZXJhdG9yIGJvb2woKSBvdmVybG9hZHMuCgkKMjAwOC0wOS0yNTogb2xseQoJICAgIFtQSFA1XSBGaWxsIGluIHR5cGVtYXBzIGZvciBTV0lHVFlQRSBhbmQgdm9pZCAqIChTRiMyMDk1MTg2KS4KCjIwMDgtMDktMjI6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gU3VwcG9ydCB3cmFwcGluZyBvZiB0eXBlcyB3aG9zZSBkZWZpbml0aW9ucyBhcmUgbm90IHNlZW4gYnkKCSAgICBTV0lHLiBUaGV5IGFyZSB0cmVhdGVkIGFzIGZvcndhcmQtcmVmZXJlbmNlZCBjbGFzc2VzIGFuZCBpZiBhCgkgICAgZGVmaW5pdGlvbiBpcyBub3Qgc2VlbiBhcmUgdHJlYXRlZCBhcyAoKiA6dm9pZCkuCgkgICAgLSBEb24ndCB3cmFwIHRoZSBjb250ZW50cyBvZiB1bm5hbWVkIG5hbWVzcGFjZXMuCgkgICAgLSBNb3JlIGNvZGUgY2xlYW51cC4gUmVtb3ZlZCBzb21lIGV4dHJhbmVvdXMgd2FybmluZ3MuCgkgICAgLSBzdGFydCB3b3JrIG9uIGhhdmluZyB0aGUgYWxsZWdyb2NsIG1vZCBwYXNzIHRoZSBjcHAgdGVzdC1zdWl0ZS4KCjIwMDgtMDktMTk6IG9sbHkKCSAgICBbUEhQNV0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgQyMgYXJyYXkgdHlwZW1hcHMgcHJvdmlkZWQgYnkgQW50dGkgS2FyYW50YS4KICAgICAgICAgICAgVGhlIGFycmF5cyBwcm92aWRlIGEgd2F5IHRvIHVzZSBNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUEFycmF5KQogICAgICAgICAgICBhbmQgcGlubmluZyB0aGUgYXJyYXkgdXNpbmcgJ2ZpeGVkJy4gU2VlIGFycmF5c19jc2hhcnAuaSBsaWJyYXJ5IGZpbGUKICAgICAgICAgICAgZm9yIGRldGFpbHMuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgoJICAgIERvY3VtZW50IHRoZSBvcHRpb25hbCBtb2R1bGUgYXR0cmlidXRlIGluIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSwKICAgICAgICAgICAgc2VlIE1vZHVsZXMuaHRtbC4gQWRkIGEgd2FybmluZyBmb3IgUHl0aG9uIHdyYXBwZXJzIHdoZW4gdGhlCiAgICAgICAgICAgIG1vZHVsZSBuYW1lIGZvciBhbiBpbXBvcnRlZCBiYXNlIGNsYXNzIGlzIG1pc3NpbmcsIHJlcXVpcmluZyB0aGUKICAgICAgICAgICAgbW9kdWxlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZCB0byAlaW1wb3J0LCBlZyAKCiAgICAgICAgICAgICAgJWltcG9ydChtb2R1bGU9IkZvb01vZHVsZSIpIGZvby5oCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIENoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlbWFwIGZvciBjaGFyICogdG8gdHVybiBQSFAKCSAgICBOdWxsIGludG8gQyBOVUxMIChwcmV2aW91c2x5IGl0IHdhcyBjb252ZXJ0ZWQgdG8gYW4gZW1wdHkgc3RyaW5nKS4KCSAgICBUaGUgbmV3IGJlaGF2aW91ciBpcyBjb25zaXN0ZW50IHdpdGggaG93IHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dAoJICAgIHR5cGVtYXAgd29ya3MgKFNGIzIwMjU3MTkpLgoKCSAgICBJZiB5b3Ugd2FudCB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBhZGQgdGhlIGZvbGxvd2luZyB0eXBlbWFwCgkgICAgdG8geW91ciBpbnRlcmZhY2UgZmlsZSAoUEhQJ3MgY29udmVydF90b19zdHJpbmdfZXgoKSBmdW5jdGlvbiBkb2VzCgkgICAgdGhlIGNvbnZlcnRpbmcgZnJvbSBQSFAgTnVsbCB0byBhbiBlbXB0eSBzdHJpbmcpOgoKCSAgICAldHlwZW1hcChpbikgY2hhciAqIHsKCQljb252ZXJ0X3RvX3N0cmluZ19leCgkaW5wdXQpOwoJCSQxID0gWl9TVFJWQUxfUFAoJGlucHV0KTsKCSAgICB9CgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBleHRyYSBjb2RlIGFkZGVkIHRvIHByb3h5IGNsYXNzIGNvbnN0cnVjdG9ycyBpbiB0aGUgY2FzZQoJICAgIHdoZXJlIHRoZSBvbmx5IGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cy4KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IHdyYXBwaW5nIG9mIGEgcmVuYW1lZCBlbnVtZXJhdGVkIHZhbHVlIG9mIGFuIGVudW0gY2xhc3MKCSAgICBtZW1iZXIgKFNGIzIwOTUyNzMpLgoKMjAwOC0wOS0xNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBGaXggaG93IGZvcndhcmQgcmVmZXJlbmNlIHR5cGVkZWZzIGFyZSBoYW5kbGVkLCBzbyBhcyBub3QgdG8gY29uZmxpY3QKCSAgICB3aXRoIG90aGVyIGxlZ2l0IHR5cGVkZWZzLgoJICAgIC0gRG9uJ3QgKGZvciBub3cpIHBlcmZvcm0gYW4gZmZpdHlwZSB0eXBlbWFwIGxvb2t1cCB3aGVuIHRyeWluZyB0bwoJICAgIHdoZW4gY2FsbGluZyBjb21wb3NlX2ZvcmVpZ25fdHlwZSgpLiBUaGlzIGlzIGFjdHVhbGx5IGEgdXNlZnVsIHRoaW5nCgkgICAgdG8gZG8gaW4gY2VydGFpbiBjYXNlcywgdGhlIHRlc3QgY2FzZXMgZm9yIHdoaWNoIEkgY2FuJ3QgY3VycmVudGx5CgkgICAgbG9jYXRlIDovLiBJdCdzIGJyZWFraW5nIHNvbWUgd3JhcHBpbmcgYmVoYXZpb3IgdGhhdCBpcyBtb3JlIGNvbW1vbmx5CgkgICAgc2VlbiwgaG93ZXZlci4gSSdsbCByZWFkZCBpbiBhIG1vcmUgYXBwcm9wcmlhdGUgd2F5IHdoZW4gSSBjYW4KCSAgICByZWNyZWF0ZSB0aGUgbmVlZGVkIHRlc3QgY2FzZSwgb3IgYSB1c2VyIGNvbXBsYWlucyAod2hpY2ggbWVhbnMKCSAgICB0aGV5IHByb2JhYmx5IGhhdmUgYSB0ZXN0IGNhc2UpLgoJICAgIC0gZG9jdW1lbnQgdGhlIC1pc29sYXRlIGNvbW1hbmQtbGluZSBhcmcgaW4gdGhlICdzd2lnIC1oZWxwJyBvdXRwdXQuCgkgICAgSXQgd2FzIGluIHRoZSBodG1sIGRvY3MsIGJ1dCBub3QgdGhlcmUuCgkgICAgLSBzbWFsbCBhbW91bnQgb2YgY29kZSBjbGVhbnVwLCByZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCgkgICAgLSBzb21lIG1pbm9yIGFlc3RoZXRpYyBjaGFuZ2VzLgoKMjAwOC0wOS0xMjogYmh5CiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjAgc3VwcG9ydCBicmFuY2ggbWVyZ2VkIGludG8gU1dJRyB0cnVuay4gVGhhbmtzIHRvCiAgICAgICAgICAgIEdvb2dsZSBTdW1tZXIgb2YgQ29kZSAyMDA4IGZvciBzdXBwb3J0aW5nIHRoaXMgcHJvamVjdCEgQnkgZGVmYXVsdAogICAgICAgICAgICBTV0lHIHdpbGwgZ2VuZXJhdGUgaW50ZXJmYWNlIGZpbGVzIGNvbXBhdGlibGUgd2l0aCBib3RoIFB5dGhvbiAyLngKICAgICAgICAgICAgYW5kIDMuMC4gQW5kIHRoZXJlJ3MgYWxzbyBzb21lIFB5dGhvbiAzIG5ldyBmZWF0dXJlcyB0aGF0IGNhbiBiZQogICAgICAgICAgICBlbmFibGVkIGJ5IHBhc3NpbmcgYSAiLXB5MyIgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBTV0lHLiBUaGVzZQogICAgICAgICAgICBmZWF0dXJlcyBhcmU6CgogICAgICAgICAgICAgIC0gRnVuY3Rpb24gYW5ub3RhdGlvbiBzdXBwb3J0CiAgICAgICAgICAgICAgICAgIEFsc28sIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBwcm94eSBmdW5jdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCwKICAgICAgICAgICAgICAgICAgZXZlbiB3aXRob3V0IHRoZSAiLXB5MyIgb3B0aW9uLiBIb3dldmVyLCB0aGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgICAgICAgd2lsbCBmYWxsYmFjayB0byAqYXJncyBpZiB0aGUgZnVuY3Rpb24gKG9yIG1ldGhvZCkgaXMgb3ZlcmxvYWRlZC4KICAgICAgICAgICAgICAtIEJ1ZmZlciBpbnRlcmZhY2Ugc3VwcG9ydAogICAgICAgICAgICAgIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBzdXBwb3J0CgogICAgICAgICAgICBGb3IgZGV0YWlscyBvZiBQeXRob24gMyBzdXBwb3J0IGFuZCB0aGVzZSBmZWF0dXJlcywgcGxlYXNlIHNlZSB0aGUKICAgICAgICAgICAgIlB5dGhvbiAzIFN1cHBvcnQiIHNlY3Rpb24gaW4gdGhlICJTV0lHIGFuZCBQeXRob24iIGNoYXB0ZXIgb2YgdGhlIFNXSUcKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSAiLWFwcGx5IiBjb21tYW5kIGxpbmUgb3B0aW9uIGFuZCBzdXBwb3J0IG9mIGdlbmVyYXRpbmcgY29kZXMKICAgICAgICAgICAgdXNpbmcgYXBwbHkoKSBpcyByZW1vdmVkLiBTaW5jZSB0aGlzIGlzIG9ubHkgcmVxdWlyZWQgYnkgdmVyeSBvbGQKICAgICAgICAgICAgUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBtZXJnZSBhbHNvIHBhdGNoZWQgU1dJRydzIHBhcnNlciB0byBzb2x2ZSBhIGJ1Zy4gQnkgdGhpcyBwYXRjaCwKICAgICAgICAgICAgU1dJRyBmZWF0dXJlcyBhYmxlIHRvIGJlIGNvcnJlY3RseSBhcHBsaWVkIG9uIEMrKyBjb252ZXJzaW9uIG9wZXJhdG9yLAogICAgICAgICAgICBzdWNoIGxpa2UgdGhpczoKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgICo6Om9wZXJhdG9yIGJvb2wgJXsgLi4uICV9CgoyMDA4LTA5LTAyOiByaWNoYXJkYgoJICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMjA4OTE0OTogRGlyZWN0b3IgZXhjZXB0aW9uIGhhbmRsaW5nIG1hbmdsZXMKCSAgICByZXR1cm5lZCBleGNlcHRpb24uICBFeGNlcHRpb25zIHJhaXNlZCBieSBQeXRob24gY29kZSBpbiBkaXJlY3RvcnMKCSAgICBhcmUgbm93IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjYWxsZXIgd2l0aG91dCBjaGFuZ2UuICBBbHNvLCByZW1vdmUKCSAgICB0aGUgIjogIiBwcmVmaXggd2hpY2ggdXNlZCB0byBiZSBhZGRlZCB0byBvdGhlciBkaXJlY3RvciBleGNlcHRpb25zCgkgICAgKGVnLCB0aG9zZSBkdWUgdG8gaW5jb3JyZWN0IHJldHVybiB0eXBlcykuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzE5ODgyOTYgR0NJdGVtIG11bHRpcGxlIG1vZHVsZSBsaW5raW5nIGlzc3VlIHdoZW4gdXNpbmcgCiAgICAgICAgICAgIGRpcmVjdG9ycy4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgJ3VzaW5nJyBhbmQgJ2ZpeGVkJyBibG9ja3MgaW4gdGhlICdjc2luJyB0eXBlbWFwIGlzIG5vdwogICAgICAgICAgICBwb3NzaWJsZSB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIHByZSBhdHRyaWJ1dGUgYW5kIHRoZSBuZXcgdGVybWluYXRvciBhdHRyaWJ1dGUsIGVnCgogICAgICAgICAgICAgICV0eXBlbWFwKGNzaW4sIAogICAgICAgICAgICAgICAgICAgICAgIHByZT0iICAgIHVzaW5nIChDRGF0ZSB0ZW1wJGNzaW5wdXQgPSBuZXcgQ0RhdGUoJGNzaW5wdXQpKSB7IiwKICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yPSIgICAgfSAvLyB0ZXJtaW5hdGUgdGVtcCRjc2lucHV0IHVzaW5nIGJsb2NrIiwKICAgICAgICAgICAgICAgICAgICAgICkgY29uc3QgQ0RhdGUgJgogICAgICAgICAgICAgICAgICAgICAgICIkY3NjbGFzc25hbWUuZ2V0Q1B0cih0ZW1wJGNzaW5wdXQpIgoKICAgICAgICAgICAgU2VlIENTaGFycC5odG1sIGZvciBtb3JlIGluZm8uCgoyMDA4LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQ29tbWl0IHBhdGNoICMyMDc5MzgxIHN1Ym1pdHRlZCBieSBCb3JpcyBTbWlsZ2EgLSBjb25zdGFudCBleHBycyBwdXQgaW50byAKICAgICAgICAgICAgbm8tZXZhbCBjb250ZXh0IGluIERFRkNFTlVNCgoyMDA4LTA4LTAyOiB3dXp6ZWIKICAgICAgICAgICAgW0NoaWNrZW4sQWxsZWdyb10gQ29tbWl0IFBhdGNoIDIwMTkzMTQKICAgICAgICAgICAgRml4ZXMgYSBidWlsZCBlcnJvciBpbiBjaGlja2VuLCBhbmQgc2V2ZXJhbCBidWlsZCBlcnJvcnMgYW5kIG90aGVyIGVycm9ycwogICAgICAgICAgICBpbiBBbGxlZ3JvIENMCgoyMDA4LTA3LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVpbGRpbmcgb2YgVGNsIGV4YW1wbGVzL3Rlc3Qtc3VpdGUgb24gTWFjIE9TIFggcmVwb3J0ZWQgYnkgR2lkZW9uIFNpbXBzb24uCgoyMDA4LTA3LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzIwMTkxNTYgQ29uZmlndXJpbmcgd2l0aCAtLXdpdGhvdXQtb2N0YXZlIG9yIC0td2l0aG91dC1hbGxsYW5nCiAgICAgICAgICAgIGRpZCBub3QgZGlzYWJsZSBvY3RhdmUuCgoyMDA4LTA3LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBkaXJlY3RvciB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSBjb3JyZWN0bHkgCiAgICAgICAgICAgIG1hcnNoYWxsZWQgdG8gQyMvSmF2YSBudWxsIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gRm9yIHN0ZF92ZWN0b3IuaSBhbmQgc3RkX21hcC5pLCByZW5hbWUgZW1wdHkoKSB0byBpc19lbXB0eSgpCgkgICAgc2luY2UgImVtcHR5IiBpcyBhIFBIUCByZXNlcnZlZCB3b3JkLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXJrIEtsZWluCgkgICAgaW4gU0YjMTk0MzQxNy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItbWFrZSIgaGFzIGJlZW4gcmVtb3ZlZC4gIAoJICAgIFNlYXJjaGVzIG9uIEdvb2dsZSBjb2Rlc2VhcmNoIHN1Z2dlc3QgdGhhdCBub2JvZHkgaXMgdXNpbmcgaXQgbm93CgkgICAgYW55d2F5LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBTV0lHIGNkYXRhLmkgbGlicmFyeSBtb2R1bGUgaXMgbm93IHN1cHBvcnRlZC4KCjIwMDgtMDctMDM6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItcGhwZnVsbCIgaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgV2UgcmVjb21tZW5kIGJ1aWxkaW5nIHlvdXIgZXh0ZW5zaW9uIGFzIGEgZHluYW1pY2FsbHkKCSAgICBsb2FkYWJsZSBtb2R1bGUuCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1BIUDRdIFN1cHBvcnQgZm9yIFBIUDQgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoZSBQSFAgZGV2ZWxvcGVycyBhcmUKCSAgICBubyBsb25nZXIgbWFraW5nIG5ldyBQSFA0IHJlbGVhc2VzLCBhbmQgd29uJ3QgZXZlbiBiZSBwcm92aWRpbmcKCSAgICBwYXRjaGVzIGZvciBjcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgYWZ0ZXIgMjAwOC0wOC0wOC4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXBvcnQgdGhlIEMgZXh0ZW5zaW9uIGRpZmZlcmVudGx5IGZvciBQeXRob24gMi42IGFuZAoJICAgIGxhdGVyIHNvIHRoYXQgYW4gaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0IGRvZXNuJ3QgcHJvZHVjZSBhCgkgICAgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgMi42IGFuZCBhIGZhaWx1cmUgZm9yIDIuNyBhbmQgbGF0ZXIuCgkgICAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gU0YjMjAwODIyOSwgcGx1cyBmb2xsb3ctdXAgcGF0Y2hlcwoJICAgIGZyb20gUmljaGFyZCBhbmQgSGFveXUgQmFpLgoKVmVyc2lvbiAxLjMuMzYgKDI0IEp1bmUgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzI0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBkZXByZWNhdGVkIC1jIGNvbW1hbmRsaW5lIG9wdGlvbiAocnVudGltZSBsaWJyYXJ5IGdlbmVyYXRpb24pLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIGhhbmRsaW5nICV0eXBlbWFwKGluLG51bWlucHV0cz0wKQoJICAgICh0ZXN0Y2FzZSBpZ25vcmVfcGFyYW1ldGVyKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgd2hlbiB3cmFwcGluZyBhIG5vbi1jbGFzcyBmdW5jdGlvbiBtYXJrZWQgd2l0aAoJICAgICVuZXdvYmplY3QgKHRlc3RjYXNlIGNoYXJfc3RyaW5ncykuCgowNi8yMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGEgd2F5IHRvIHVzZSBBdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24gaW5zdGVhZCBvZiBBdHRhY2hDdXJyZW50VGhyZWFkCiAgICAgICAgICAgIGluIGRpcmVjdG9yIGNvZGUuIERlZmluZSB0aGUgU1dJR19KQVZBX0FUVEFDSF9DVVJSRU5UX1RIUkVBRF9BU19EQUVNT04gbWFjcm8sIHNlZQogICAgICAgICAgICBMaWIvamF2YS9kaXJlY3Rvci5zd2cuCgowNi8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGNyYXNoaW5nIGluIHRoZSBTVEwgd3JhcHBlcnMgKHJlamVjdCEgYW5kIGRlbGV0ZV9pZiBtZXRob2RzKQoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBDIyBhbmQgSmF2YSBrZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgaW5zdGVhZCBvZiBqdXN0IGlzc3VpbmcgYSB3YXJuaW5nCiAgICAgICAgICAgIGFuZCB0aGVuIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUuIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEgCiAgICAgICAgICAgIGtleXdvcmQgaXMgZm91bmQuCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gS2V5d29yZCBoYW5kbGluZyBhZGRlZC4gUiBLZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgICBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIGtleXdvcmQgaXMgZm91bmQuCgowNi8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIGJvb2wmIGFuZCBib29sKi4gQWRkZWQgcnVudGVzdCBmb3IgbGlfdHlwZW1hcHMgdGVzdGNhc2UuCiAgICAgICAgICAgIChCdWcgIzE5MzgxNDIpCgowNi8wNy8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgdGVzdCBjYXNlIGtleXdvcmRfcmVuYW1lLCB0aGVuIG1hZGUgdGhlIGtleXdvcmQgcmVuYW1pbmcgd29ya3MgcHJvcGVybHkKICAgICAgICAgICAgYnkgZml4aW5nIFN3aWdfbmFtZV9tYWtlKCkgZm9yIGEgaW5jb21wbGV0ZSBjb25kaXRpb24gY2hlY2tpbmcuCgowNi8wMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBlbnVtIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8zMC8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgc3RkOjp3c3RyaW5nIGludG8gTGliL3R5cGVtYXBzL3ByaW10eXBlcy5zd2csIHNpbmNlIGl0IGlzIGFsc28gYSBwcmltaXRpdmUgCiAgICAgICAgICAgIHR5cGUgaW4gU1dJRyAtIGZpeGVkIFNGICMxOTc2OTc4LgoKMDUvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdmFyaWFibGUgd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzI5LzIwMDg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBhIHR5cG8gb2YgJSNpZmRlZiBpbiBMaWIvcHl0aG9uL3B5Y29udGFpbmVyLnN3Zywgd2hpY2ggaXMgcmVsYXRlZCAKICAgICAgICAgICAgdG8gLWV4dHJhbmF0aXZlIFNXSUcgb3B0aW9uIC0gU0YgIzE5NzE5NzcuCgowNS8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgcGFydGlhbGNoZWNrIG1ha2VmaWxlIHRhcmdldHMgZm9yIHBhcnRpYWwgdGVzdGluZyBvZiB0aGUgdGVzdC1zdWl0ZS4gVGhlc2UKICAgICAgICAgICAganVzdCBpbnZva2UgU1dJRywgaWUgbm8gY29tcGlsYXRpb24gYW5kIG5vIHJ1bnRpbWUgdGVzdGluZy4gSXQgY2FuIGJlIGZhc3RlcgogICAgICAgICAgICB3aGVuIGRldmVsb3BpbmcgYnkganVzdCBkb2luZyBhIGRpcmVjdG9yeSBkaWZmIG9mIHRoZSBmaWxlcyBTV0lHIGdlbmVyYXRlcwogICAgICAgICAgICBhZ2FpbnN0IHRob3NlIGZyb20gYSBwcmV2aW91cyBydW4uIEV4YW1wbGUgdXNhZ2UgZnJvbSB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeToKCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLWphdmEtdGVzdC1zdWl0ZQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmNvbXBhc3NlcyBtb3JlIGZsZXhpYmlsaXR5IGluIHJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIGVnCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHByZWZpeCB0aGUgY29tbWFuZCBsaW5lIHdoaWNoIHJ1bnMgYW55IHRhcmdldCBsYW5ndWFnZSB0ZXN0CiAgICAgICAgICAgIHdpdGggYSB0b29sLiBTZWUgdGhlIFJVTlRPT0wsIENPTVBJTEVUT09MIGFuZCBTV0lHVE9PTCB0YXJnZXRzIGluIHRoZSBjb21tb24ubWsKICAgICAgICAgICAgZmlsZSBhbmQgbWFrZWZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUgaXQgaXMgcG9zc2libGUgdG8gCiAgICAgICAgICAgIHJ1biB0aGUgcnVudGltZSB0ZXN0cyB0aHJvdWdoIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFJVTlRPT0w9InZhbGdyaW5kIC0tbGVhay1jaGVjaz1mdWxsIgoKICAgICAgICAgICAgb3IgaW52b2tlIFNXSUcgdW5kZXIgdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgU1dJR1RPT0w9InZhbGdyaW5kIC0tdG9vbD1tZW1jaGVjayIKCjA1LzE5LzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBkZWZpbmUgdGhhdCB3YXMgYnJlYWtpbmcgcHJlLTIuNy4gIENoZWNrZWQgaW4KICAgICAgICAgICAgcGF0Y2ggZnJvbSBTb3JlbiBTb25uZW5idXJnIHRoYXQgY3JlYXRlcyBzdHJpbmdzIGluICAKCSAgICB2ZXJzaW9uIGluZGVwZW5kZW50IHdheQoKMDUvMTUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB2YXJpYWJsZSBuYW1lIGNsYXNoIGluIGRpcmVjdG9ycyAtIFNGICMxOTYzMzE2IHJlcG9ydGVkIGJ5IFRyaXN0YW4uCgowNS8xNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgYW4gb3B0aW1pc2F0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0cyBieSB2YWx1ZSwgcmVkdWNpbmcKICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBtYWRlLiBJbXBsZW1lbnRlZCB1c2luZyBhbgogICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgaW4gdGhlICJvdXQiIHR5cGVtYXAgY2FsbGVkICJvcHRpbWFsIi4gRGV0YWlscyBpbiAKICAgICAgICAgICAgVHlwZW1hcHMuaHRtbC4KCjA1LzExLzIwMDg6IG9sbHkKCSAgICBbUEhQXSBDaGVjayBmb3IgJWZlYXR1cmUoIm5vdGFic3RyYWN0Iikgd2hlbiBnZW5lcmF0aW5nIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVyLgoKMDUvMTEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMxOTQzNjA4IC0gJHNlbGYgc3Vic3RpdHV0aW9uIGluICVjb250cmFjdCwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgICAgICAgIFRvb24gVmVyc3RyYWVsZW4uCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGNoYXIgKiB0eXBlbWFwcyB0byB3b3JrIHdoZW4gYXBwbGllZCB0byBzaWduZWQgY2hhciAqIGFuZAoJICAgIHVuc2lnbmVkIGNoYXIgKiAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFwcGx5X3N0cmluZ3MpLgoKMDUvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNoYXIgKiBtZW1iZXIgdmFyaWFibGVzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYmFkIFBIUCBjb2RlIGdlbmVyYXRlZCB3aGVuIHdyYXBwaW5nIGFuIGVudW0gaW4gYQoJICAgIG5hbWVzcGFjZSAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFycmF5c19zY29wZSkuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gU1dJRyBub3cgcnVucyB0aGUgUEhQIHRlc3RzdWl0ZSB1c2luZyBQSFA1LCBub3QgUEhQNC4gIFBIUDQKCSAgICBpcyBlc3NlbnRpYWxseSBvYnNvbGV0ZSBub3csIHNvIHdlIGNhcmUgbXVjaCBtb3JlIGFib3V0IHNvbGlkIFBIUDUKCSAgICBzdXBwb3J0LgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgU1RMIGZpeGVzIHdoZW4gdXNpbmcgJWltcG9ydCByYXRoZXIgdGhhbiAlaW5jbHVkZSBhbmQgdGhlIFNvbGFyaXMgV29ya3Nob3AKICAgICAgICAgICAgY29tcGlsZXIgYW5kIHRoZSBSb2d1ZXdhdmUgU1RMLgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIG92ZXJsb2FkZWQgcHJvdGVjdGVkIG1ldGhvZHMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQ29tbWl0IHBhdGNoICMxOTU2NjA3IHRvIGFkZCAtTVQgc3VwcG9ydCBmcm9tIFJpY2hhcmQgQm91bHRvbi4KICAgICAgICAgICAgVGhpcyBwYXRjaCBtaXJyb3JzIHRoZSBnY2MgLU1UIG9wdGlvbiB3aGljaCBhbGxvd3Mgb25lIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAgICAgICBNYWtlZmlsZSB0YXJnZXQgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gZ2VuZXJhdGluZyBtYWtlZmlsZXMgd2l0aCB0aGUgLU0gZmFtaWx5CiAgICAgICAgICAgIG9mIG9wdGlvbnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAkIHN3aWcgLWphdmEgLU1NIC1NVCBvdmVycmlkZGVubmFtZSAtYysrICBleGFtcGxlLmkKICAgICAgICAgICAgICBvdmVycmlkZGVubmFtZTogXAogICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICBleGFtcGxlLmggCgowNC8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFtMdWFdIFJlbW92ZWQgZ2VuZXJhdGlvbiBvZiBfd3JhcF9kZWxldGVfWFhYWFggKHdyYXBwZXJlZCBkZXN0cnVjdG9yKQoJICAgIHdoaWNoIHdhcyB1bnVzZWQgYW5kIGNhdXNpbmcgd2FybmluZyB3aXRoIGcrKyAtV2FsbC4KCSAgICBSZW1vdmVkIG90aGVyIHVudXNlZCB3YXJuaW5nIGluIHR5cGVtYXBzLmkgYW5kIG90aGVyIHBsYWNlcy4KCSAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZW1iZWQzLCBhbmQgcnVuIHRlc3RzIGEgZmV3IHRlc3QgY2FzZXMuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBJQk0ncyBDKysgY29tcGlsZXIgb24gQUlYIChwYXRjaAoJICAgIGZyb20gR29lcmFuIFVkZGVib3JnIGluIFNGIzE5MjgwNDgpLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFJlbmFtZSBCU0laRSBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL2FycmF5c19zY29wZS5pIHRvIEJCU0laRSB0bwoJICAgIGF2b2lkIGEgY2xhc2ggd2l0aCBCU0laRSBkZWZpbmVkIGJ5IGhlYWRlcnMgb24gQUlYIHdpdGggUGVybAoJICAgIChyZXBvcnRlZCBpbiBTRiMxOTI4MDQ4KS4KCjA0LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSB0byB3cmFwIGFsbCBwcm90ZWN0ZWQgbWVtYmVycyB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KICAgICAgICAgICAgUHJldmlvdXNseSBvbmx5IHRoZSB2aXJ0dWFsIG1ldGhvZHMgd2VyZSBhdmFpbGFibGUgdG8gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgTm93IGFsbCBwcm90ZWN0ZWQgbWVtYmVycywgKHN0YXRpYyBhbmQgbm9uLXN0YXRpYyB2YXJpYWJsZXMsIG5vbi12aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZXRob2RzKSBhcmUgd3JhcHBlZCB3aGVuIHVzaW5nIHRoZSBhbGxwcm90ZWN0ZWQgbW9kZS4gVGhlIGFsbHByb3RlY3RlZAogICAgICAgICAgICBtb2RlIGlzIHR1cm5lZCBvbiBpbiB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uOgoKICAgICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsIGFsbHByb3RlY3RlZD0iMSIpIG1vZHVsZW5hbWUKClZlcnNpb24gMS4zLjM1ICg3IEFwcmlsIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBZGQgbWlzc2luZyBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcwoKMDQvMDYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN0YWNrIG92ZXJmbG93IHdoZW4gdXNpbmcgdHlwZW1hcCB3YXJuaW5nIHN1cHByZXNzaW9uLCBlZyAKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9UWVBFTUFQX0NIQVJMRUFLX01TRykKCjA0LzA1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHNvIHRoYXQgJXB5dGhvbm5vbmR5bmFtaWMgY2FuIGJlIHVzZWQuIEFsc28gY29ycmVjdHMKICAgICAgICAgICAgZGlzcGxheSBvZiB0aGUgcHJveHkgY2xhc3MgdHlwZS4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjA0LzA0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgJW5ld29iamVjdCByZWZlcmVuY2UgdG8gcHl0aG9uIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnNlY3Rpb24gb2YgbWFudWFsCgkgICAgKHBhdGNoIGZyb20gbWRiZWFjaHkgaW4gU0YjMTg5NDYxMCkuCgowMy8yNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyB3aGVyZSB0aGUgcG9pbnRlciB0eXBlIGlzIGEgdGVtcGxhdGVkIHR5cGUgd2l0aAogICAgICAgICAgICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDMvMjcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSB0eXBlbWFwIERJU09XTiBmb3IgU1dJR1RZUEUqIGFuZCBTV0lHVFlQRVtdLCBhbmQgc3VwcG9ydCBmb3IgJWRlbG9iamVjdCBmZWF0dXJlLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvb3duZXIgd2hpY2ggZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxODQ0MzAxIGZyb20gTW9udHkgVGF5bG9yIHRvIHN1cHByZXNzIGVudW0gY29uc3RydWN0b3IKICAgICAgICAgICAgdW51c2VkIHdhcm5pbmdzLgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjQ1MjQgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIGVuc3VyZXMgdGhlCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIiBtZXNzYWdlIGlzIGRpc3BsYXllZCB3aGVuIGF0dGVtcHRpbmcgdG8gY2FsbCBhCiAgICAgICAgICAgIGNvbnN0cnVjdG9yIG9uIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvciB3cmFwcGVyLCBlZyBpZgogICAgICAgICAgICB0aGUgQysrIGNsYXNzIGlzIGFic3RyYWN0LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjU3MDIgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIHJlbW92ZXMgd2FybmluZyA1MTIKICAgICAgICAgICAgZm9yIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLgoKMDMvMjYvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFwcGx5IEdDQyA0LjMgd2FybmluZ3MgcGF0Y2ggZnJvbSBQaGlsaXBwIFRob21hcwoJICAgIChTRiMxOTI1MTIyKS4KCjAzLzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFRocmVhZCBzYWZldHkgcGF0Y2ggZm9yIFNUTCBpdGVyYXRvcnMgZnJvbSBBYmhpbmFuZGFuIEphaW4uCgowMy8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCAlbHVhY29kZSBmZWF0dXJlIHRvIGFkZCBzb3VyY2UgY29kZSBpbnRvIHdyYXBwZXJzLgogICAgICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhpcy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2FycmF5cyB0byBzaG93IGl0cyB1c2UgKGFuZCB0eXBlbWFwcykKCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbm9ucG9ydGFibGUgc2VkIHVzYWdlIHdoaWNoIGZhaWxlZCBvbiBNYWMgT1MgWCAoYW5kIHByb2JhYmx5CgkgICAgb3RoZXIgcGxhdGZvcm1zKS4gIEZpeGVzIFNGIzE5MDM2MTIuCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG1lbW9yeSBsZWFrIGluIFNXSUcncyBwYXJzZXIgKGJhc2VkIG9uIHBhdGNoIGZyb20gUnVzc2VsbAoJICAgIEJyeWFudCBpbiBTRiMxOTE0MDIzKS4KCjAzLzEyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzE4NzgyODUgLSB1bm5lY2Vzc2FyeSBjYXN0IGZvciBDIHN0cnVjdCBjcmVhdGlvbiB3cmFwcGVycy4KCjAzLzEyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSBkZWJ1Z2dpbmcgaW5mbyB3aGVuIHVzaW5nIHNoYXJlZF9wdHIgc3VwcG9ydAoKMDMvMDYvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGZvciBMdWEgZXhjZXB0aW9ucy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2V4Y2VwdGlvbiBhbmQgRXhhbXBsZXMvbHVhL2VtYmVkMi4KICAgICAgICAgICAgU21hbGwgdXBkYXRlcyB0byB0aGUgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEFkZCBjaGFyIComIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IG9jY2FzaW9uYWwgc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byByZXBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzIGFzIGJlaW5nIGlnbm9yZWQuCgowMi8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4ICMxOTA0NTM3IFN3aWcgY2F1c2VzIGEgUGVybCB3YXJuaW5nICJ4IHVzZWQgb25seSBvbmNlIiBpbiBQZXJsIDUuMTAKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgQXJpIEpvbG1hCgowMi8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgc2hhcmVkX3B0ciB2YXJpbi92YXJvdXQgdHlwZW1hcHMgZm9yIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZXMuCgowMi8yNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHdyYXBuYW1lIHRvIHdvcmsgaW4gJWV4Y2VwdGlvbiAoZml4ZXMgc29tZSB3cmFwOm5hbWUgYXNzZXJ0aW9ucykKClZlcnNpb24gMS4zLjM0ICgyNyBGZWJydWFyeSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXIgdmFyaWFibGVzLgoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBmb3IgdXNlIHdpdGhpbiAlZXhjZXB0aW9uOgogICAgICAgICAgICAgICR3cmFwbmFtZSAtIGxhbmd1YWdlIHNwZWNpZmljIHdyYXBwZXIgbmFtZQogICAgICAgICAgICAgICRvdmVybmFtZSAtIGlmIGEgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyBjb250YWlucyB0aGUgZXh0cmEgbWFuZ2xpbmcgdXNlZCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3ZlcmxvYWRlZCBtZXRob2QKICAgICAgICAgICAgICAkZGVjbCAgICAgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgICAgICRmdWxsZGVjbCAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgcmV0dXJuIHR5cGUKCjAyLzEyLzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBOb3cgc2V0dGluZyBTNCBmbGFnIGluIFNXSUcgY3JlYXRlZCBvYmplY3RzLiAgVGhpcwogICAgICAgICAgICBmaXhlcyBSLVNXSUcgZm9yIDIuNiBhbmQgd2FybmluZyBmb3IgMi42IGZhaWx1cmUgaGFzIGJlZW4gcmVtb3ZlZC4KCjAyLzExLzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgcGF0Y2ggYnkgVG9yc3RlbiBMYW5kc2Nob2ZmIHRvIGZpeCB0aGUgdW5hcnkgbWludXMgaXNzdWUKICAgICAgICAgICAgUmFuICdhc3R5bGUgLS1zdHlsZT1rciAtMicgYWNyb3NzIGx1YS5jeHggdG8gbmVhdGVuIGl0IHVwCgowMi8xMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBCdW1wIFNXSUdfUlVOVElNRV9WRVJTSU9OIHRvIDQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBBUEkgCiAgICAgICAgICAgIGNoYW5nZSBpbiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMsIGllIGNoYW5nZSBpbiBkZWZpbml0aW9uIG9mIHN3aWdfY29udmVydGVyX2Z1bmMuCiAgICAgICAgICAgIEFueW9uZSBjYWxsaW5nIFNXSUdfVHlwZUNhc3QgbXVzdCBwYXNzIGluIGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBuZXcgYWRkaXRpb25hbAogICAgICAgICAgICAodGhpcmQpIHBhcmFtZXRlciBhbmQgdGhlbiBoYW5kbGUgdGhlIG5ld2x5IGNyZWF0ZWQgbWVtb3J5IGlmIHRoZSByZXR1cm5lZCB2YWx1ZQogICAgICAgICAgICBpcyBzZXQgdG8gU1dJR19DQVNUX05FV19NRU1PUlkgZWxzZSBhIG1lbW9yeSBsZWFrIHdpbGwgZW5zdWUuCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZC4gVXNhZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIHJlY2VudGx5CiAgICAgICAgICAgIGFkZGVkIEphdmEgYW5kIEMjIHNoYXJlZF9wdHIgdHlwZW1hcHMuIFR3byBtYWNyb3MgYXJlIGF2YWlsYWJsZSwgYWx0aG91Z2ggdGhlc2UKICAgICAgICAgICAgbWF5IHdlbGwgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb246CgogICAgICAgICAgICBGb3IgYmFzZSBjbGFzc2VzIG9yIGNsYXNzZXMgbm90IGluIGFuIGluaGVyaXRhbmNlIGNoYWluOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICBGb3IgZGVyaXZlZCBjbGFzc2VzOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCgogICAgICAgICAgICBUaGUgUFJPWFlDTEFTUyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJveHkgY2xhc3MsIGJ1dCBpcyBvbmx5IHJlcXVpcmVkIGZvciBKYXZhL0MjLgogICAgICAgICAgICBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAiYm9vc3Rfc2hhcmVkX3B0ci5pIgoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoS2xhc3MsIFNwYWNlOjpLbGFzcykKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChLbGFzc0Rlcml2ZWQsIFNwYWNlOjpLbGFzcywgU3BhY2U6OktsYXNzRGVyaXZlZCkKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzRGVyaXZlZCA6IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRnVydGhlciBkZXRhaWxzIHRvIGZvbGxvdyBpbiBmdXR1cmUgZG9jdW1lbnRhdGlvbiwgYnV0IHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMKICAgICAgICAgICAgc2hvdWxkIGJlIG5vdGVkOgoKICAgICAgICAgICAgLSBOb3QgcmVzdHJpY3RlZCB0byBib29zdDo6c2hhcmVkX3B0ciwgZWcgc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUgdXNlZC4KICAgICAgICAgICAgLSBBdmFpbGFibGUgdHlwZW1hcCBncm91cHM6CiAgICAgICAgICAgICAgKGEpIFR5cGVtYXBzIGZvciBzaGFyZWRfcHRyIHBhc3NlZCBieSB2YWx1ZSwgcmVmZXJlbmNlLCBwb2ludGVyIGFuZCBwb2ludGVyIAogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuCiAgICAgICAgICAgIC0gKGIpIFR5cGVtYXBzIGZvciBwYXNzaW5nIGJ5IHJhdyB2YWx1ZSwgcmF3IHBvaW50ZXIsIHJhdyByZWZlcmVuY2UsIHJhdyBwb2ludGVyCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4gCiAgICAgICAgICAgIC0gVGhlIGNvZGUgYmVpbmcgd3JhcHBlZCBkb2VzIG5vdCBldmVuIGhhdmUgdG8gdXNlIHNoYXJlZF9wdHIsIFNXSUcgY2FuIHVzZQogICAgICAgICAgICAgIHNoYXJlZF9wdHIgYXMgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gaW5zdGVhZCBvZiBhIHJhdyBwb2ludGVyIGR1ZSB0byAKICAgICAgICAgICAgICB0aGUgdHlwZW1hcHMgaW4gZ3JvdXAgKGIpIGFib3ZlLgogICAgICAgICAgICAtIE5vIGFycmF5IHN1cHBvcnQgYXMgc2hhcmVkX3B0ciBkb2VzIG5vdCBzdXBwb3J0IGFycmF5cy4KICAgICAgICAgICAgLSBUaGlzIHdvcmtzIHF1aXRlIGRpZmZlcmVudGx5IHRvIHRoZSB1c3VhbCBTV0lHIHNtYXJ0IHBvaW50ZXIgc3VwcG9ydCB3aGVuCiAgICAgICAgICAgICAgb3BlcmF0b3ItPiBpcyBwYXJzZWQgYnkgU1dJRzoKICAgICAgICAgICAgICAtIEFuIGFkZGl0aW9uYWwgc21hcnQgcG9pbnRlciBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkIHJlZHVjaW5nIGNvZGUgYmxvYXQgaW4KICAgICAgICAgICAgICAgIHRoZSB3cmFwcGVycy4KICAgICAgICAgICAgICAtIFVzaW5nIHNtYXJ0IHBvaW50ZXJzIGFuZCByYXcgcG9pbnRlcnMgY2FuIGJlIG1peGVkIHNlYW1sZXNzbHkuCiAgICAgICAgICAgICAgLSBNaXNzaW5nIGNvbnN0cnVjdG9ycyBmb3IgdGhlIHNtYXJ0IHBvaW50ZXJzIGlzIG5vIGxvbmdlciBhIHByb2JsZW0gYW5kIHNvCiAgICAgICAgICAgICAgICBzZXBhcmF0ZSBmYWN0b3J5IHR5cGUgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIHRvIGJlIHdyaXR0ZW4gYW5kIHdyYXBwZWQuCiAgICAgICAgICAgICAgLSBUaGUgaW1wbGljaXQgQysrIHNoYXJlZF9wdHI8IGRlcml2ZWQgY2xhc3MgPiB0byBzaGFyZWRfcHRyPCBiYXNlIGNsYXNzID4KICAgICAgICAgICAgICAgIGNhc3QgYWxzbyB3b3JrcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBUaGlzIG5lZ2F0ZXMgdGhlIG5lY2Vzc2l0eSB0byB3cml0ZQogICAgICAgICAgICAgICAgYW4gZXhwbGljaXQgaGVscGVyIGNhc3QgZnVuY3Rpb24gcHJvdmlkaW5nIHRoZSB1cGNhc3Qgd2hpY2ggd291bGQgbmVlZAogICAgICAgICAgICAgICAgY2FsbGluZyBwcmlvciB0byBwYXNzaW5nIGEgZGVyaXZlZCBjbGFzcyB0byBhIG1ldGhvZCB0YWtpbmcgYSBzaGFyZWRfcHRyIHRvCiAgICAgICAgICAgICAgICBhIGJhc2UgY2xhc3MuCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgc3VwcG9ydCBmb3Igb3ZlcnJpZGluZyB0aGUgY2xhc3MgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHZpYSBhIG5ldwogICAgICAgICAgICAic21hcnRwdHIiIGZlYXR1cmUuIFRoaXMgaXMgYSB2ZXJ5IGxvdyBsZXZlbCBvZiBjdXN0b21pc2F0aW9uIG1vc3QgdXNlcnMKICAgICAgICAgICAgd291bGQgbmV2ZXIgbmVlZCB0byBrbm93LiBUaGUgZmVhdHVyZSB3aWxsIHR5cGljYWxseSBiZSB1c2VkIGZvciBpbnRydXNpdmUgCiAgICAgICAgICAgIHNtYXJ0IHBvaW50ZXJzIGFsb25nIHdpdGggYWRkaXRpb25hbCB0eXBlbWFwcy4gRXhhbXBsZSB1c2FnZSBvZiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0xKSBGb28geyBib29zdDo6c2hhcmVkX3B0cjwgRm9vID4gfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgRm9vX3N3aWdyZWdpc3RlciBmdW5jdGlvbiB3aWxsIHRoZW4gcmVnaXN0ZXIgYm9vc3Q6OnNoYXJlZCA8IEZvbyA+CiAgICAgICAgICAgIChTV0lHVFlQRV9wX2Jvb3N0X19zaGFyZWRfcHRyVEZvb190IGluc3RlYWQgb2YgU1dJR1RZUEVfcF9Gb28pIGFzIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIHR5cGUgZm9yIGluc3RhbnRpYXRpb25zIG9mIEZvby4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZlYXR1cmVzIG5vdyBzdXBwb3J0cyB0aGUgb3B0aW9uYWwgJ25vYmxvY2snIGF0dHJpYnV0ZSBmb3IgYWxsIHVzYWdlIG9mICVmZWF0dXJlLiAKICAgICAgICAgICAgV2hlbiBzcGVjaWZpZWQsIHRoZSB7IH0gYnJhY2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZlYXR1cmUgY29kZS4gVGhpcyBpcyBpZGVudGljYWwKICAgICAgICAgICAgaW4gYmVoYXZpb3VyIHRvIHVzYWdlIG9mICdub2Jsb2NrJyBpbiB0eXBlbWFwcyBhbmQgaXMgdXNlZCB3aGVuIHRoZSBwcmVwcm9jZXNzb3IKICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb3BlcmF0ZSBvbiB0aGUgY29kZSBpbiB0aGUgZmVhdHVyZSBhbmQgdGhlIGVuY2xvc2luZyB7IH0gYnJhY2VzCiAgICAgICAgICAgIGFyZSBub3QgcmVxdWlyZWQuIEV4YW1wbGU6CgogICAgICAgICAgICAgICNkZWZpbmUgRk9PIGZvbwogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9IjEiKSB7IEZPTzo6YmFyIH0KCiAgICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3IgdGhlbiByZWR1Y2VzIHRoaXMgYXMgaWYgdGhpcyBoYWQgYmVlbiB1c2VkIGluc3RlYWQ6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIpICJmb286OmJhciIKCjAyLzAxLzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZm9ybWF0IHN0cmluZyBidWcgKFNGIzE4ODIyMjApLgoKMDEvMzEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkaXRpb25zIHRvIHRoZSAldHlwZXMgZGlyZWN0aXZlLiBOb3cgdGhlIGNvbnZlcnNpb24gLyBjYXN0aW5nIGNvZGUgY2FuIGJlCiAgICAgICAgICAgIG92ZXJyaWRkZW4gdG8gc29tZSBjdXN0b20gY29kZSBpbiB0aGUgJXR5cGVzIGRpcmVjdGl2ZSwgbGlrZSBzbzoKCiAgICAgICAgICAgICAgJXR5cGVzKGZyb210eXBlID0gdG90eXBlKSAlewogICAgICAgICAgICAgICAgLi4uIGNvZGUgdG8gY29udmVydCBmcm9tdHlwZSB0byB0b3R5cGUgYW5kIHJldHVybiAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIHNwZWNpYWwgdmFyaWFibGUgJGZyb20gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIG9mIHRoZQogICAgICAgICAgICB0eXBlIGJlaW5nIGNvbnZlcnRlZCBmcm9tLiBUaGUgY29kZSBtdXN0IHJldHVybiB0aGUgdG90eXBlIGNhc3QgdG8gdm9pZCAqLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBUaW1lOwogICAgICAgICAgICAgIGNsYXNzIERhdGU7CiAgICAgICAgICAgICAgRGF0ZSAmVGltZTo6ZGF0ZUZyb21UaW1lKCk7CgogICAgICAgICAgICAgICV0eXBlcyhUaW1lID0gRGF0ZSkgJXsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKSRmcm9tOwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICByZXN1bHRpbmcgaW4gdGhlIGNvbnZlcnNpb24gLyBjYXN0aW5nIGNvZGUgbG9va2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgc3RhdGljIHZvaWQgKl9wX1RpbWVUb19wX0RhdGUodm9pZCAqeCkgewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopeDsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGlzIGFkdmFuY2VkIHVzYWdlLCBwbGVhc2UgdXNlIG9ubHkgaWYgeW91IHVuZGVyc3RhbmQgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uCgowMS8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFNtYWxsIHVwZGF0ZSB0byBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwsIHRvIHdhcm4gYWJvdXQgdXNlIG9mIGxvY2FsIAoJICAgIHZhcmlhYmxlcyBpbiB0eXBlbWFwcyBmb3IgbXVsdGlwbGUgdHlwZXMuCgowMS8yNS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggYnVnIHJlcG9ydGVkIGJ5IEtldmluIE1pbGxzIGluIEFSUkFZU09GQ0xBU1NFUyB0eXBlbWFwcyB3aGVyZSBhbnkKICAgICAgICAgICAgY2hhbmdlcyBtYWRlIHRvIGFuIGFycmF5IGVsZW1lbnQgcGFzc2VkIGZyb20gSmF2YSB0byBDIGFyZSBub3QgcmVmbGVjdGVkIGJhY2sKICAgICAgICAgICAgaW50byBKYXZhLgoKMDEvMjQvMjAwODogbWdvc3NhZ2UKCSAgICBNb3JlIHVwZGF0ZXMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgQWxzbyBsb29rcyBpbiAvdXNyL2luY2x1ZGUvbHVhKgoJICAgIEFsc28gY2hhbmdlZCB0eXBlbWFwcy5pIG5vdCB0byBjaGVjayBmb3IgTlVMTCBiZWZvcmUgZnJlZWluZyBhIHBvaW50ZXIKCjAxLzIxLzIwMDg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRm9yIFNUTCBjb250YWluZXJzLCBTV0lHIG5vIGxvbmdlciBhdHRlbXB0cyB0byBjb252ZXJ0IGZyb20gb25lCiAgICAgICAgICAgIFNUTCBjb250YWluZXIgdG8gYW5vdGhlciwgZWcgZnJvbSBzdGQ6OnZlY3RvcjxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGRvdWJsZT4KICAgICAgICAgICAgb3Igc3RkOjpsaXN0PGludD4gdG8gc3RkOjp2ZWN0b3I8aW50PiBvciBldmVuIHN0ZDo6dmVjdG9yPEZvbz4gdG8KICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmFyPiBhcyBpdCBwcmV2aW91c2x5IGRpZC4gSW4gZmFjdCBTV0lHIG5vIGxvbmdlciBhdHRlbXB0cyB0bwogICAgICAgICAgICBjb252ZXJ0IGFueSBTV0lHIHdyYXBwZWQgQysrIHByb3h5IGNsYXNzIHRoYXQgaXMgYWxzbyBhIFB5dGhvbiBzZXF1ZW5jZSwKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkLiBBbnkgbm9uLVNXSUcgUHl0aG9uIHNlcXVlbmNlIHdpbGwgc3RpbGwgYmUKICAgICAgICAgICAgYWNjZXB0ZWQgd2hlcmV2ZXIgYW4gU1RMIGNvbnRhaW5lciBpcyBhY2NlcHRlZC4gT3ZlcmxvYWRlZCBtZXRob2RzIHVzaW5nCiAgICAgICAgICAgIGNvbnRhaW5lcnMgc2hvdWxkIGJlIGZhc3Rlci4KCjAxLzE4LzIwMDg6IHdzZnVsdG9uCgkgICAgW0MjXSBBZGQgJ2RpcmVjdG9yaW5hdHRyaWJ1dGVzJyBhbmQgJ2RpcmVjdG9yb3V0YXR0cmlidXRlcycgdHlwZW1hcCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZvciB0aGUgaW10eXBlIHR5cGVtYXAuIFRoZXNlIHNob3VsZCBjb250YWluIEMjIGF0dHJpYnV0ZXMgd2hpY2ggd2lsbAogICAgICAgICAgICBiZSBnZW5lcmF0ZWQgaW50byB0aGUgQyMgZGlyZWN0b3IgZGVsZWdhdGUgbWV0aG9kcy4KCjAxLzE4LzIwMDg6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgYnl0ZSB2YWx1ZSAyNTUgaW4gaW5wdXQgZmlsZXMgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgY2hhciBpcyBzaWduZWQgKGl0IHdhcyBnZXR0aW5nIG1hcHBlZCB0byBFT0YpLiAgRml4ZXMgU0YjMTUxODIxOS4KCjAxLzE2LzIwMDg6IHdzZnVsdG9uCgkgICAgRml4IHRlbXBsYXRlIG1lbWJlciB2YXJpYWJsZXMgd3JhcHBlZCBieSBhIHNtYXJ0IHBvaW50ZXIuIEJ1ZyByZXBvcnRlZCAKICAgICAgICAgICAgYnkgUm9iZXJ0IEx1cHRvbi4KCjAxLzE0LzIwMDg6IG1nb3NzYWdlCgkgICAgU3Vic3RhbnRpYWwgY2hhbmdlcyB0byBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgICAgQ29kZSBjYW4gbm93IGxpbmsgdG8gbGlibHVhLmEsIGxpYmx1YTUwLmEgb3IgbGlibHVhNTEuYQoJICAgICAgSXQncyBhbHNvIGEgbG90IG5lYXRlciBub3cuCgoxMi8xNi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBCYWNrZWQgb3V0ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqCgoxMi8xNi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTgzMjYxMyAtIFRlbXBsYXRlcyBhbmQgc29tZSB0eXBlZGVmcyBpbnZvbHZpbmcgcG9pbnRlcnMgb3IgZnVuY3Rpb24gcG9pbnRlcnMKCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMTYzMjYyNSAtIENvbXBpbGF0aW9uIGVycm9ycyBvbiBWaXN1YWwgQysrIDYgd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICouCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTgxOTg0NyAldGVtcGxhdGUgd2l0aCBqdXN0IG9uZSBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlciAKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IGludD4gY2xhc3MgRm9vIHsuLi59OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29EZWZhdWx0KSBGb288PjsKCjEyLzEyLzIwMDc6IG1nb3NzYWdlCgkgICAgW0x1YV0gU21hbGwgY29ycmVjdGlvbiBvbiBMdWEuaHRtbAoKMTIvMDkvMjAwNzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMTgzODI0OCBmcm9tIE1vbnR5IFRheWxvciBmb3IgdnBhdGggYnVpbGRzIG9mIFNXSUcuCgoxMi8wOC8yMDA3OiB3c2Z1bHRvbgoJICAgIFtMdWFdIEZpeGVzIHRvIHJlbW92ZSBnY2MtNC4yIHdhcm5pbmdzCgoxMi8wNi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTczNDQxNSAtIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSB0X2l0ZW0sIHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyB0X2FsbG9jID0gcGZjOjphbGxvY19mYXN0ID4KICAgICAgICAgICAgICAgIGNsYXNzIGxpc3RfdCA6IHB1YmxpYyBsaXN0X2ltcGxfdDx0X2l0ZW0scGZjOjphcnJheV90PHRfaXRlbSx0X2FsbG9jPiA+IHsgLi4uIH07CgoxMi8wNC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiB0aGUgY2xhc3MgaGllcmFjaHkgY29kZSwgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBub3QgcHJvcGFnYXRlZCwgCgkgICAgaWYgdGhlIG5hbWUgb3JkZXJpbmcgd2FzIGluIGEgY2VydGFpbiBvcmRlci4KCSAgICBBZGRlZCBuZXcgZXhhbXBsZSBwcm9ncmFtcyAoZHVhbCwgZW1iZWQpIGFuZCBydW50aW1lIHRlc3RzIGZvciB0ZXN0LXN1aXRlLgoKMTEvMzAvMjAwNzogd3NmdWx0b24KCSAgICBGaXggdXNpbmcgc3RhdGVtZW50cyB1c2luZyBhIGJhc2UgY2xhc3MgbWV0aG9kIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgb3ZlcmxvYWRlZC4KICAgICAgICAgICAgRGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUgdXNpbmcgc3RhdGVtZW50cyBhbmQgbWV0aG9kIGRlY2xhcmF0aW9ucywgdGhlc2UKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIHdyYXBwZXJzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmdW5rKCk7CiAgICAgICAgICAgICAgICB1c2luZyBCYXNlOjpmdW5rOwogICAgICAgICAgICAgIH07CgpWZXJzaW9uIDEuMy4zMyAoTm92ZW1iZXIgMjMsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIxLzIwMDc6IG1pa2VsCgkgICAgW2FsbGVncm9jbF0gb21pdCBwcml2YXRlIHNsb3QgdHlwZSBpbmZvIGluIHRoZSBjbGFzc2VzL3R5cGVzCgkgICAgZGVmaW5lZCBvbiB0aGUgbGlzcCBzaWRlLiBGaXggYnVnIGluIG1hcHBpbmcgb2YgQy8rKyB0eXBlcwoJICAgIHRvIGxpc3AgdHlwZXMuIEZpeCB0eXBvIGluIG1vZHVsZXMgZ2VuZXJhdGVkIGRlZnBhY2thZ2UgZm9ybS4KCSAgICBIYXZlIHN0ZDo6c3RyaW5nIConcyBhdXRvbWF0aWNhbGx5IG1hcnNoYWxsZWQgYmV0d2VlbiBmb3JlaWduCgkgICAgYW5kIGxpc3Agc3RyaW5ncy4KCQoxMS8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRmlsbCBpbiBQeXRob24gRGljdGlvbmFyeSBmdW5jdGlvbnMgbGlzdCAocGF0Y2ggZnJvbQoJICAgIEplbG1lciBWZXJub29paiBwb3N0ZWQgdG8gc3dpZy1kZXZlbCkuCgoxMS8yMC8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBDIHNjYW5uZXIgcmVsYXRlZCB0byBiYWNrc2xhc2ggY2hhcmFjdGVycy4KCjExLzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBicm9rZW4gY29tcGlsYXRpb24gb2YgQysrIHdyYXBwZXJzIG9uIHNvbWUgY29tcGlsZXJzLgoKMTEvMTYvMjAwNzogb2xseQoJICAgIFtQeXRob25dIERvbid0IHBhc3MgUHlfc3NpemVfdCBmb3IgYSAlZCBwcmludGYtbGlrZSBmb3JtYXQgYXMKCSAgICB0aGF0J3MgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIHNpemVvZihQeV9zc2l6ZV90KSAhPSBzaXplb2YoaW50KS4KClZlcnNpb24gMS4zLjMyIChOb3ZlbWJlciAxNSwgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFBhY2thZ2UgbmFtZSBhbmQgZGxsIG5hbWUgaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICBuYW1lLiBJdCB1c2VkIHRvIGJlIHRoZSBtb2R1bGUgbmFtZSB3aXRoIF93cmFwIGFzIGEgc3VmZml4LiBUaGUgcGFja2FnZQogICAgICAgICAgICBhbmQgZGxsIG5hbWVzIGNhbiBiZSBtb2RpZmllZCB1c2luZyB0aGUgLXBhY2thZ2UgYW5kIC1kbGwgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMTEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFkZCBzdXBwb3J0IGZvciBXaW5kb3dzIChWaXN1YWwgQysrIDggdGVzdGVkKQoKMTEvMTAvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBtYWtlZmlsZSBnZW5lcmF0ZWQgYnkgLW1ha2UgKFNGIzE2MzM2NzkpLiAgVXBkYXRlCgkgICAgZG9jdW1lbnRhdGlvbiB0byBtYXJrICItbWFrZSIgYXMgZGVwcmVjYXRlZCAobm9uZSBvZiB0aGUgb3RoZXIKCSAgICBTV0lHIGJhY2tlbmRzIHNlZW0gdG8gb2ZmZXIgc3VjaCBhIGZlYXR1cmUsIGl0IGNhbid0IHJlYWxpc3RpY2FsbHkKCSAgICBnZW5lcmF0ZSBhIGZ1bGx5IHBvcnRhYmxlIG1ha2VmaWxlLCBhbmQgdGhlIGNvbW1hbmRzIHRvIGJ1aWxkIGFuCgkgICAgZXh0ZW5zaW9uIGFyZSBlYXN5IGVub3VnaCB0byB3cml0ZSBmb3IgdGhlIHVzZXIncyBwcmVmZXJyZWQgYnVpbGQKCSAgICB0b29sKS4gIEFsc28gcmVjb21tZW5kIGFnYWluc3QgdGhlIHVzZSBvZiAiLXBocGZ1bGwiIChpdCdzIG9ubHkKCSAgICByZWFsbHkgdXNlZnVsIHdoZW4gc3RhdGljIGxpbmtpbmcsIGFuZCBhIGR5bmFtaWNhbGx5IGxvYWRhYmxlCgkgICAgbW9kdWxlIGlzIHZpcnR1YWxseSBhbHdheXMgdGhlIGJldHRlciBhcHByb2FjaCkuCgoxMS8wOS8yMDA3OiBvbGx5CgkgICAgRml4IC0taGVscCBvdXRwdXQgdG8gbm90ZSB0aGF0IGBleHBvcnQgU1dJR19GRUFUVVJFUycgaXMgcmVxdWlyZWQuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHNlZyBmYXVsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIFtSXSBFeGFtcGxlcyBSIHNjcmlwdHMgYXJlIG5vdyBwbGF0Zm9ybSBpbmRlcGVuZGVudAoKMTAvMzAvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBmaXhlZCBidWcgaW4gdGVtcGxhdGUgY2xhc3NlcyB3aGljaCBjYXNlcyB0ZW1wbGF0ZV9kZWZhdWx0MgoJICAgIGFuZCB0ZW1wbGF0ZV9zcGVjaWFsaXphdGlvbl9kZWZhcmcgdG8gZmFpbC4KCSAgICBBZGRlZCBzZXZlcmFsIHdhcm5pbmcgZmlsdGVycyBpbnRvIHRoZSBvdmVybG9hZCdzIHRlc3QgY2FzZXMuCgkgICAgQWRkZWQgcnVudGltZSB0ZXN0cyBmb3Igc2V2ZXJhbCBjb2Rlcy4KCSAgICBZb3UgY2FuIG5vdyBtYWtlIGNoZWNrLWx1YS10ZXN0LXN1aXRlIHdpdGggbm8gZXJyb3JzIGFuZCBvbmx5IGEgZmV3IHdhcm5pbmdzLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBjb25maWd1cmUgdGVzdCB0byBwdXQgR1VJTEVMSU5LIGluIExJQlMgbm90IExERkxBR1MKCSAgICAoU0YjMTgyMjQzMCkuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGd1aWxlIGV4YW1wbGVzIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggc3dpZ19sdWFfY2xhc3MgaW5zdGFuY2VzIHRvIGJlIHN0YXRpYyB0byBhbGxvdyBtdWx0aXBsZQoJICAgIFNXSUcgd3JhcHBlcnMgdG8gYmUgY29tcGlsZWQgaW50byB0aGUgc2FtZSBleGVjdXRhYmxlIHN0YXRpY2FsbHkuCgkgICAgUGF0Y2ggZnJvbSBBbmRyZWFzIEZyZWRyaWtzc29uIChwb3N0ZWQgdG8gdGhlIHN3aWcgbWFpbGluZyBsaXN0KS4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggRXhhbXBsZXMvbHVhIHRvIHBhc3MgU1JDUyBmb3IgQyB0ZXN0cyByYXRoZXIgdGhhbiBDWFhTUkNTLgoJICAgIFRoZSBjb2RlIGFzIGl0IHdhcyBoYXBwZW5lZCB0byB3b3JrIG9uIHg4NiwgYnV0IGJyb2tlIG9uIHg4Nl82NCAoYW5kCgkgICAgcHJvYmFibHkgYW55IG90aGVyIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlIC1mUElDKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IGFwcHJvYWNoIGZvciBmaXhpbmcgdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvcgogICAgICAgICAgICBtZXRob2RzIHVzaW5nIHRoZSBuZXcgdGVtcGxhdGVkIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIFN3aWdWYWx1ZUluaXQoKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBVc2UgbW9yZSBlZmZpY2llbnQgU3ZQVl9ub2xlbih4KSBpbnN0ZWFkIG9mIFN2UFYoeCxQTF9uYSkgaWYgU3ZQVl9ub2xlbiBpcwogICAgICAgICAgICBzdXBwb3J0ZWQuCgoxMC8yNi8yMDA3OiB3dXp6ZWIKCSAgICBbQ2hpY2tlbl0gRml4IGdsb2JhbCB2YXJpYWJsZXMgb2YgY2xhc3MgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoJICAgIE90aGVyIG1pbm9yIGZpeGVzLCBzbyBhbGwgdGVzdHMgaW4gdGhlIGNoaWNrZW4gdGVzdCBzdWl0ZSBub3cgcGFzcwoKMTAvMjUvMjAwNzogb2xseQoJICAgIEZpeCBVVEwgdHlwZWNoZWNrIG1hY3JvIGZvciBhIGZ1bmN0aW9uIHRha2luZyBjaGFyW10gb3IgY29uc3QKCSAgICBjaGFyW10gKFNGIzE4MjAxMzIpLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZV0gRmlsdGVyIG91dCAtYW5zaSAtcGVkYW50aWMgZnJvbSBDRkxBR1Mgd2hpbGUgY29tcGlsaW5nIHRlc3QgcHJvZ3JhbXMgZm9yIEd1aWxlCgkgICAgaW4gY29uZmlndXJlLiAgVGhpcyBlbmFibGVzIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIEd1aWxlIGlmIGl0IGlzIGluc3RhbGxlZCBhbmQKCSAgICB1c2FibGUuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIEZpeCB0ZXN0Y2FzZXMgYXBwbHlfc2lnbmVkX2NoYXIgYW5kIGFwcGx5X3N0cmluZ3MKCSAgICBieSBhZGRpbmcgZXhwbGljaXQgY2FzdHMgdG8gdGhlIGFwcHJvcHJpYXRlICRsdHlwZS4KCjEwLzIyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQnVnICMxNzk0MjQ3IC0gZml4IGdlbmVyYXRlZCBjb2RlIGZvciBkZXJpdmVkIGNsYXNzZXMgd2hlbiBjc2Jhc2Ugb3IgamF2YWJhc2UKICAgICAgICAgICAgdHlwZW1hcHMgYXJlIHVzZWQgd2l0aCB0aGUgcmVwbGFjZT0iMSIgYXR0cmlidXRlLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRG9jcyB1cGRhdGVkIHRvIHN1Z2dlc3QgdXNpbmcgZGlzdHV0aWxzLiBQYXRjaCAjMTc5NjY4MSBmcm9tIENocmlzdG9waGVyIEJhcmtlci4KCjEwLzE5LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIENsZWFyIGVycm5vIGJlZm9yZSBjYWxscyB0byBzdHJ0b2woKSwgc3RydG91bCgpLCBzdHJ0b2xsKCkKCSAgICBhbmQgc3RydG91bGwoKSB3aGljaCB3ZSBjaGVjayBlcnJubyBhZnRlciB0byBhdm9pZCBzZWVpbmcgYSBqdW5rCgkgICAgdmFsdWUgb2YgZXJybm8gaWYgdGhlcmUgaXNuJ3QgYW4gZXJyb3IgaW4gdGhlIGNhbGwuCgoxMC8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgJWF0dHJpYnV0ZV9yZWYgYW5kIHJlcGxhY2Ugd2l0aCAlYXR0cmlidXRlcmVmLiBUaGVyZSBpcyBqdXN0IGFuIGFyZ3VtZW50CiAgICAgICAgICAgIG9yZGVyIGNoYW5nZSBpbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoICVhdHRyaWJ1dGUsIGZyb206CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBY2Nlc3Nvck1ldGhvZCwgQXR0cmlidXRlTmFtZSkKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICAlYXR0cmlidXRlcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBdHRyaWJ1dGVOYW1lLCBBY2Nlc3Nvck1ldGhvZCkKCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBGaXggc2V2ZXJhbCBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uCgkgICAgZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKwoJICAgIGNvZGUuCgoxMC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUF0gRml4IG1hbnkgb2NjdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbiBmcm9tCgkgICAgc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysgY29kZQoJICAgIHdoZW4gY29tcGlsaW5nIHdpdGggYSBuZXcgZW5vdWdoIHZlcnNpb24gb2YgUEhQIDUgKHRlc3RlZCB3aXRoCgkgICAgUEhQIDUuMi4zLCBidXQgUEhQIDUuMi4xIGlzIHByb2JhYmx5IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50KS4KCjEwLzE1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICMxNzk3MTMzIGZyb20gRGF2aWQgUGllcGdyYXNzIGZpeGVzICVhdHRyaWJ1dGUgd2hlbiB0aGUgZ2V0dGVyIGhhcyB0aGUgc2FtZSBuYW1lCiAgICAgICAgICAgIGFzIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgbm8gbG9uZ2VyIGdlbmVyYXRlIG5vbi1mdW5jdGlvbmFsIHNldHRlciBmb3IgcmVhZC1vbmx5IGF0dHJpYnV0ZXMuCgoxMC8xNS8yMDA3OiBvbGx5CgkgICAgW1RjbF0gUHJldmVudCBTV0lHX1RjbF9Db252ZXJ0UHRyIGZyb20gY2FsbGluZyB0aGUgdW5rbm93biBwcm9jLgoJICAgIEFkZCBFeGFtcGxlcy90Y2wvc3RkX3ZlY3Rvci8gd2hpY2ggdGhpcyBjaGFuZ2UgZml4ZXMuICBQYXRjaAoJICAgIGlzIGZyb20gIkNsaWZmIEMiIGluIFNGIzE4MDk4MTkuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIERldGFjaEN1cnJlbnRUaHJlYWQgYmFjayBpbiBmb3IgZGlyZWN0b3JzLiBTZWUgZW50cnkgZGF0ZWQgMDgvMTEvMjAwNiBhbmQKICAgICAgICAgICAgc2VhcmNoIGZvciBEZXRhY2hDdXJyZW50VGhyZWFkIG9uIHRoZSBtYWlsaW5nIGxpc3RzIGZvciBkZXRhaWxzLiBUaGUgY3Jhc2hlcyBvbiBTb2xhcmlzCiAgICAgICAgICAgIHNlZW0gdG8gYmUgb25seSBwcmVzZW50IGluIGpkay0xLjQuMiBhbmQgbG93ZXIgKGpkay0xLjUuMCBhbmQgamRrLTEuNi4wIGFyZSBva2F5KSwgc28KICAgICAgICAgICAgYW55b25lIHVzaW5nIGRpcmVjdG9ycyBzaG91bGQgdXNlIGEgcmVjZW50IGpkayBvbiBTb2xhcmlzLCBvciBkZWZpbmUgKHNlZSBkaXJlY3Rvci5zd2cpCiAgICAgICAgICAgIFNXSUdfSkFWQV9OT19ERVRBQ0hfQ1VSUkVOVF9USFJFQUQgdG8gdGhlIEMrKyBjb21waWxlciB0byBnZXQgb2xkIGJlaGF2aW91ci4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVuIHRoZXJlIGFyZSBDIGNvbW1lbnRzIGluIHRoZSBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzLgoKMTAvMTIvMjAwNzogd3V6emViCgkgICAgQWRkZWQgYSB0ZXN0c3VpdGUgZW50cnkgZm9yIEJ1ZyAjMTczNTkzMQoKMTAvMDkvMjAwNzogb2xseQoJICAgIEF1dG9tYXRpY2FsbHkgcmVydW4gYXV0b2dlbi5zaCBpZiBjb25maWd1cmUuaW4gaXMgbW9kaWZpZWQuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgRW5oYW5jZSBjaGVjay0lLXRlc3Qtc3VpdGUgcnVsZSBhbmQgZnJpZW5kcyB0byBnaXZlIGEgbW9yZSBoZWxwZnVsCgkgICAgZXJyb3IgbWVzc2FnZSBpZiB5b3UgdHJ5IHRoZW0gZm9yIGEgbGFuZ3VhZ2Ugd2hpY2ggZG9lc24ndCBleGlzdAoJICAgIChlLmcuICJtYWtlIGNoZWNrLXBocC10ZXN0LXN1aXRlIiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAoJICAgICJtYWtlIGNoZWNrLXBocDQtdGVzdC1zdWl0ZSIpLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEFkZCBtYWtlIHJ1bGUgdG8gcmVnZW5lcmF0ZSBNYWtlZmlsZSBmcm9tIE1ha2VmaWxlLmluIGlmIGl0IGhhcwoJICAgIGNoYW5nZWQuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IGxvbmctc3RhbmRpbmcgbWVtb3J5IGxlYWsgaW4gd3JhcHBlZCBjb25zdHJ1Y3RvcnMgYW5kCgkgICAgd3JhcHBlZCBmdW5jdGlvbnMvbWV0aG9kcyB3aGljaCByZXR1cm4gYW4gb2JqZWN0LgoKMTAvMDgvMjAwNzogb2xseQoJICAgIEZpeCBNYWtlZmlsZS5pbiB0byByZWFkIGNoZWNrLmxpc3QgZmlsZXMgY29ycmVjdGx5IGluIGEgVlBBVEgKCSAgICBidWlsZC4KCjEwLzA3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQKCjA5LzI3LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gYWRkZWQgbW9yZSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgdHlwZWNoZWNrcy4KCSAgICBBZGRlZCBhIHJvdXRpbmUgd2hpY2ggY2hlY2tzIHRoZSBleGFjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gYSBmdW5jdGlvbgoJICAgIChicmVha3Mgb3BlcmF0b3Jfb3ZlcmxvYWRpbmcgZm9yIHVuYXJ5IG1pbnVzIG9wZXJhdG9yLCBjdXJyZW50bHkgZGlzYWJsZWQpLgoJICAgIFJlb3JnYW5pc2VkIHRoZSBsdWF0eXBlbWFwcy5zd2cgdG8gdGlkeSBpdCB1cC4KCSAgICBBZGRlZCBhIGxvdCBvZiAlaWdub3JlcyBvbiB0aGUgb3BlcmF0b3JzIG5vdCBzdXBwb3J0ZWQgYnkgbHVhLgoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIGNvbnN0YW50IG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyAmIHJ1bnRlc3QgZm9yIG1lbWJlcl9wb2ludGVyLmkKCSAgICBBZGRlZCBmaXJzdCB2ZXJzaW9uIG9mIHdjaGFyLmkKCjA5LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gdGhyb3dzIHR5cGVtYXBzIGZvciBzdGQ6OndzdHJpbmcgdXNpbmcgQyMgcGF0Y2ggIzE3OTkwNjQgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MKCjA5LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5ICMxNzcxMzEzIHRvIGZpeCBidWcgIzE2NTAyMjkgLSBmaXhlcyBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZwogICAgICAgICAgICBoYW5kbGluZy4KCjA5LzIwLzIwMDc6IG9sbHkKCSAgICBbSmF2YV0gRWxpbWluYXRlIHNvbWUgdW5uZWNlc3NhcnkgdXNlcyBvZiBhIHRlbXBvcmFyeSBidWZmZXIKCSAgICBhbGxvY2F0ZWQgdXNpbmcgbmV3W10uICBTRiMxNzk2NjA5LgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBjYW4gYmUgdXNlZCBpbiB0aGUgY3N2YXJpbiB0eXBlbWFwIHdoZXJlIGl0IGlzIGFsd2F5cwogICAgICAgICAgICBleHBhbmRlZCB0byAndmFsdWUnLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggYnVnIHJlcG9ydGVkIGJ5IEdsZW5uIEEgV2F0c29uIGFuZCAjMTc5NTI2MCB3aGVyZSB0aGUgY3N0eXBlIHR5cGVtYXAgdXNlZCB0aGUgJ3JlZicKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgdHlwZW1hcCBib2R5LCBpdCBwcm9kdWNlZCB1bmNvbXBpbGFibGUgQyMgcHJvcGVydGllcyAodmFyaWFibGUgd3JhcHBlcnMpLgogICAgICAgICAgICBUaGUgdHlwZSBmb3IgdGhlIHByb3BlcnR5IG5vdyBjb3JyZWN0bHkgY29tZXMgZnJvbSB0aGUgJ291dCcgYXR0cmlidXRlIGluIHRoZSBjc3R5cGUgdHlwZW1hcC4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggY29uc3Qgc3RkOjp3c3RyaW5nJiB0eXBlbWFwcwoKMDkvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSBwb2ludGVyIHJlZmVyZW5jZSwgZWcgaW4gdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGUgcGdjcHAKICAgICAgICAgICAgaXMgYWxzbyBnZW5lcmF0ZWQgbm93IHdoZW4gdXNlcidzIGN1c3RvbSB0eXBlbWFwcyB1c2UgYSBwcm94eSBjbGFzcyBpbiB0aGUganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYW5kIGEgJ2xvbmcnIGluIHRoZSBqdHlwZSB0eXBlbWFwLgoKMDkvMTgvMjAwNzogb2xseQoJICAgIFtwaHBdIEFkZCB0eXBlbWFwcyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVycyBvZiB0eXBlIHN0ZDo6c3RyaW5nICYKCSAgICB3aGljaCBhcmUgbW9kaWZpZWQgYnkgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3B5dGhvbl0gU3BsaXQgcG90ZW50aWFsbHkgbG9uZyBzdHJpbmcgbGl0ZXJhbHMgdG8gYXZvaWQgaGl0dGluZwoJICAgIE1TVkMncyBsb3cgZml4ZWQgbGltaXQgb24gc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIC0gcGF0Y2ggZnJvbQoJICAgIFNGIzE3MjM3NzAsIGFsc28gcmVwb3J0ZWQgYXMgU0YjMTYzMDg1NS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbb2NhbWxdIEZpeCByZW5hbWluZyBvZiBvdmVybG9hZGVkIG1ldGhvZHMgaW4gdGhlIG1ldGhvZF90YWJsZSAtCgkgICAgbXkgcGF0Y2ggZnJvbSBTRiM5NDAzOTkuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3B5dGhvbl0gU2ltcGxlciBjb2RlIGZvciBTV0lHX0FzVmFsX2Jvb2woKSB3aGljaCBmaXhlcyBhICJzdHJpY3QKCSAgICBhbGlhc2luZyIgd2FybmluZyBmcm9tIEdDQyAtIHBhdGNoIGZyb20gU0YjMTcyNDU4MSBieSBBbmRyZXcKCSAgICBCYXVtYW5uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gVXNlIHN2X3NldHB2bigpIHRvIHNldCBhIHNjYWxhciBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoCgkgICAgLSBwYXRjaCBmcm9tIFNGIzE3NDQ2MCBieSAibWF0c3ViYXJheSIuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgV2hlbiB3cmFwcGluZyBDKysgY29kZSwgZ2VuZXJhdGUgY29kZSB3aGljaCB1c2VzCgkgICAgc3RkOjpzdHJpbmc6OmFzc2lnbihQVFIsIExFTikgcmF0aGVyIHRoYW4gYXNzaWduaW5nCgkgICAgc3RkOjpzdHJpbmcoUFRSLCBMRU4pLiAgVXNpbmcgYXNzaWduIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlCgkgICAgKHRlc3RlZCB3aXRoIEdDQyA0LjEuMikuCgowOS8wNy8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAlaWdub3JlIG9uIGNvbnN0cnVjdG9ycyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkgZGVjbGFyZWQgW1NGICMxNzc3NzEyXQoKMDkvMDUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgLSBDaGFuZ2Ugcl9sdHlwZSBpbiB0eXBlc3lzLmMgdG8gc3RvcmUgYSBoYXNodGFibGUgaW5zdGVhZCBvZiBhIHNpbmdsZSB2YWx1ZS4KCSAgICAgIHNldmVyYWwgdmVyeSBzdWJ0bGUgYnVncyB3ZXJlIGJlaW5nIGNhdXNlZCBieSBtdWx0aXBsZSBsdHlwZXMgYmVpbmcgbWFwcGVkCgkgICAgICB0byBhIHNpbmdsZSBtYW5nbGVkIHR5cGUsIG1vc3RseSB3aGVuIHVzaW5nIHR5cGVkZWZlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgoJICAgICAgTm93LCByX2x0eXBlIHN0b3JlcyBhIGhhc2h0YWJsZSBvZiBwb3NzaWJsZSBsdHlwZXMsIGFuZCB3aGVuIGdlbmVyYXRpbmcgdGhlCgkgICAgICB0eXBlIHRhYmxlLCBhbGwgdGhlIGx0eXBlcyBhcmUgYWRkZWQgaW50byB0aGUgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlLgoKMDgvMzEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzE3NTQ5NjcgZnJvbSBKYW1lcyBCaWdsZXIuCiAgICAgICAgICAgIC0gRml4IGJ1ZyBpbiB0dXJuaW5nIG9uIHdhcm5pbmdzIHRoYXQgd2VyZSB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuIEVnICdzd2lnIC13KzMwOScgd2lsbCBub3cKICAgICAgICAgICAgICB0dXJuIG9uIHRoZSBub3JtYWxseSBzdXBwcmVzc2VkIHdhcm5pbmcgMzA5LgoKICAgICAgICAgICAgLSBOZXcgLVdleHRyYSBjb21tYW5kbGluZSBvcHRpb24gd2hpY2ggZW5hYmxlcyB0aGUgZXh0cmEgd2FybmluZyBudW1iZXJzOgogICAgICAgICAgICAgIDIwMiwzMDksNDAzLDUxMiwzMjEsMzIyICh0aGlzIGlzIHRoZSBsaXN0IG9mIHdhcm5pbmdzIHRoYXQgaGF2ZSBhbHdheXMgYmVlbiBzdXBwcmVzc2VkIGJ5CiAgICAgICAgICAgICAgZGVmYXVsdCkuIEJ5IHNwZWNpZnlpbmcgLVdleHRyYSwgYWxsIHdhcm5pbmdzIHdpbGwgYmUgdHVybmVkIG9uLCBidXQgdW5saWtlIC1XYWxsLAogICAgICAgICAgICAgIHdhcm5pbmdzIGNhbiBzdGlsbCBiZSBzZWxlY3RpdmVseSB0dXJuZWQgb24vb2ZmIHVzaW5nICV3YXJuZmlsdGVyLAogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm4gb3IgZnVydGhlciAtdyBjb21tYW5kbGluZSBvcHRpb25zLCBlZzoKICAgICAgICAgICAgICAgIHN3aWcgLVdleHRyYSAtdzMwOQogICAgICAgICAgICAgIHdpbGwgdHVybiBvbiBhbGwgd2FybmluZ3MgZXhjZXB0IDMwOS4KCjA4LzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIC0gTmV3IGRlYnVnZ2luZyBvcHRpb25zLCAtZGVidWctbW9kdWxlIDxuPiBhbmQgLWRlYnVnLXRvcCA8bj4gdG8gZGlzcGxheSB0aGUgcGFyc2UgdHJlZSBhdAogICAgICAgICAgICAgIHZhcmlvdXMgc3RhZ2VzLCB3aGVyZSA8bj4gaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzdGFnZXMgMS00LkZvciBleGFtcGxlLCB0bwogICAgICAgICAgICAgIGRpc3BsYXkgdG9wIG9mIHBhcnNlIHRyZWUgYXQgc3RhZ2VzIDEgYW5kIDM6CiAgICAgICAgICAgICAgICBzd2lnIC1kZWJ1Zy10b3AgMSwzCgogICAgICAgICAgICAtIERlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgd2hpY2ggaGF2ZSBlcXVpdmFsZW50cyBiZWxvdzoKICAgICAgICAgICAgICAtZHVtcF9wYXJzZV9tb2R1bGUgICAgPT4gICAtZGVidWctbW9kdWxlIDEKICAgICAgICAgICAgICAtZHVtcF9tb2R1bGUgICAgICAgICAgPT4gICAtZGVidWctbW9kdWxlIDQKICAgICAgICAgICAgICAtZHVtcF9wYXJzZV90b3AgICAgICAgPT4gICAtZGVidWctdG9wIDEKICAgICAgICAgICAgICAtZHVtcF90b3AgICAgICAgICAgICAgPT4gICAtZGVidWctdG9wIDQKCiAgICAgICAgICAgIC0gUmVuYW1lZCBzb21lIGNvbW1hbmRsaW5lIG9wdGlvbnMgZm9yIG5hbWluZyBjb25zaXN0ZW5jeSBhY3Jvc3MgYWxsIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlICA9PiAgIC1kZWJ1Zy10ZW1wbGF0ZQogICAgICAgICAgICAgIC1kZWJ1Z190eXBlbWFwICAgPT4gICAtZGVidWctdHlwZW1hcAogICAgICAgICAgICAgIC1kdW1wX2NsYXNzZXMgICAgPT4gICAtZGVidWctY2xhc3NlcwogICAgICAgICAgICAgIC1kdW1wX3RhZ3MgICAgICAgPT4gICAtZGVidWctdGFncwogICAgICAgICAgICAgIC1kdW1wX3R5cGVkZWYgICAgPT4gICAtZGVidWctdHlwZWRlZgogICAgICAgICAgICAgIC1kdW1wX21lbW9yeSAgICAgPT4gICAtZGVidWctbWVtb3J5CgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBoYW5kbGluZyBvZiBkb3VibGUgb3IgZmxvYXQgcGFyYW1ldGVycyB3aXRoIGFuIGludGVnZXIKCSAgICBkZWZhdWx0IHZhbHVlLgoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBHZW5lcmF0ZSBfX2lzc2V0KCkgbWV0aG9kcyBmb3Igc2V0dGVycyBmb3IgUEhQIDUuMSBhbmQgbGF0ZXIuCgowOC8yMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IGRpcmVjdG9yIGJ1ZyAjMTc3NjY1MSByZXBvcnRlZCBieSBTdGVwaGFuZSBSb3V0ZWxvdXMgd2hpY2ggb2NjdXJyZWQgd2hlbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgb2Ygc29tZSBvdGhlciBzeW1ib2xzIHVzZWQgd2l0aGluCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcy4KCjA4LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIENvcnJlY3QgYmVoYXZpb3VyIGZvciB0ZW1wbGF0ZWQgbWV0aG9kcyB1c2VkIHdpdGggJXJlbmFtZSBvciAlaWdub3JlIGFuZCB0aGUgZW1wdHkKICAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb24gLSAldGVtcGxhdGUoKS4gQSB3YXJuaW5nIGlzIGlzc3VlZCBpZiB0aGUgbWV0aG9kIGhhcyBub3QgYmVlbgogICAgICAgICAgICByZW5hbWVkLgoKMDgvMTYvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIE5hbWUgZ2VuZXJhdGVkIGNsIGZpbGUgYmFzZWQgb24gaW5wdXQgZmlsZSByYXRoZXIgdGhhbiBieQoJICAgIG1vZHVsZSBuYW1lLiBJdCB3YXMgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSBteXBhY2thZ2UuY2wgYW5kIGEgdGVzdF93cmFwLmMKCSAgICB3aGVuIHBhcnNpbmcgYSB0ZXN0LmkgaW5wdXQgZmlsZS4gQ29uZnVzaW5nLiBBbHNvLCBpbmNsdWRlIGV4dGVybmFsLWZvcm1hdAoJICAgIHRlbXBsYXRlcyBmb3IgOmZhdCBhbmQgOmZhdC1sZSBhdXRvbWF0aWNhbGx5IHRvIGF2b2lkIHRoZXNlIGJlaW5nIGNvbXBpbGVkCgkgICAgYXQgcnVudGltZS4KCjA4LzE1LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gQXBwbHkgcGF0Y2ggIzE3NjYwNzYgZnJvbSBMZWlnaCBTbWl0aCBhZGRpbmcgc3VwcG9ydCBmb3IgbmV3bHkgaW50cm9kdWNlZAogICAgICAgICAgICBpbiBjZmZpIDpsb25nLWxvbmcgYW5kIDp1bnNpZ25lZC1sb25nLWxvbmcuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGRvY3VtZW50YXRpb24gcGF0Y2ggIzE3NDM1NzMgZnJvbSBKZWZmcmV5IFNvcmVuc2VuLiBJdCBjb250YWlucyBhIG5lYXQKICAgICAgICAgICAgaWRlYSB3aXRoIHJlc3BlY3QgdG8gYmV0dGVyIG1lbW9yeSBtYW5hZ2VtZW50IGJ5IHRoZSBKVk0gb2YgQysrIGFsbG9jYXRlZCBtZW1vcnkuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbHkgcGF0Y2ggIzE3NzE0MTAgZnJvbSBXYWRlIEJyYWluZXJkIHRvIGZpeCB0eXBlZGVmIFhTKFN3aWdQZXJsV3JhcHBlcikgaW4KICAgICAgICAgICAgcGVybHJ1bi5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwgYnVpbGQgODIyIGFuZCBQZXJsIDUuOC45IGFuZCA1LjEwIGJyYW5jaGVzLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gY29uc3QgZW51bSByZWZlcmVuY2UgdHlwZW1hcHMgZml4ZWQuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgQysrIGNsYXNzIG1lbWJlciBwb2ludGVycy4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIHN1cHBvcnQgZm9yICRvd25lciBpbiB0aGUgIm91dCIgdHlwZW1hcHMgbGlrZSBpbiB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuIE5vdGUgdGhhdCAkb3duZXIgaGFzIGFsd2F5cyBiZWVuIHN1cHBvcnRlZCBpbiB0aGUgImphdmFvdXQiIC8gImNzb3V0IgogICAgICAgICAgICB0eXBlbWFwcy4KCjA4LzAxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzbWFydCBwb2ludGVyIGhhbmRsaW5nIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSB0ZW1wbGF0ZWQgbWV0aG9kcyB3aXRoaW4gdGhlIHNtYXJ0CiAgICAgICAgICAgIHBvaW50ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBjcmFpZ2RvIGF0IGVlLndhc2hpbmd0b24uZWR1LgoKMDcvMzEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBmaXhlZCBtZW1vcnkgYWNjZXNzIGFmdGVyIGJlaW5nIGZyZWVkIGJ1Zy4gdGhhbmtzIHRvIE1hcnRpbiBQZXJjb3NzaS4KICAgICAgICAgICAgcGFja2FnZSBuYW1lIGNsb3MgY2hhbmdlZCB0byBjbC4gdGhhbmtzIHRvIFJhbGYgTWF0dGVzCgowNy8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXJhbGxlbCBtYWtlIHN1cHBvcnQgYWRkZWQgZm9yIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSBmb3IgZGV2ZWxvcGVycyB3aG8gaGF2ZQogICAgICAgICAgICBtb3JlIHRoYW4gb25lIENQVS4gTm93IHBhcmFsbGVsIG1ha2UgY2FuIGJlIHVzZWQgZm9yIGNoZWNraW5nIGluIGFkZGl0aW9uIHRvIGJ1aWxkaW5nCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUuIFNvbWUgdHlwaWNhbCBjaGVja2luZyBleGFtcGxlczoKCiAgICAgICAgICAgICAgbWFrZSAtajggLWsgY2hlY2sKICAgICAgICAgICAgICBtYWtlIC1qNCBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIC1qMiBjaGVjay1qYXZhLWV4YW1wbGVzCgowNy8xOS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBGaXhlZCBidWcgdGhhdCBzdG9wcGVkIGNvbmZpZ3VyZSB3b3JraW5nIG9uIG1pbmd3IChhcHBsaWVkIGRvczJ1bml4IHRvIGNvbmZpZ3VyZS5pbikKCjA3LzEwLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEV4dHJhIGNvbXBhdGliaWxpdHkgd2l0aCBMdWEgNS4xICh1cGRhdGVkIFNXSUdfaW5pdCwgZG9jcywgZXhhbXBsZXMsIHRlc3Qgc3VpdGUpCgkgICAgUmVtb3ZlZCBuYW1lIGNsYXNoIGZvciBzdGF0aWMgbGluayBvZiBtdWx0aXBsZSBtb2R1bGVzCgowNy8wNS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBGaXggYSBidWcgaW4gU1dJR19BTExPQ19BUlJBWSgpCiAgICAgICAgICAgIGltcHJvdmVkIHRoZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IGFyZ3VtZW50cy4KICAgICAgICAgICAgQ2hhbmdlZCB0aGUgb3V0cHV0IG9mIHN3aWdfdHlwZSgpIHRvIHVzZSB0aGUgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGUgdHlwZSwKCSAgICByYXRoZXIgdGhhbiB0aGUgcmF3IHN3aWcgdHlwZS4KCjA3LzAzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9ycyBmb3Igc29tZSBvdmVybG9hZGVkIG1ldGhvZHMgd2hlcmUgdGhlIGltdHlwZSByZXN1bHRlZCBpbiBpZGVudGljYWwKICAgICAgICAgICAgbWV0aG9kcyBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIEMjIGRpcmVjdG9yIGNsYXNzLCBlZyB2b2lkIGZvbyhpbnQgKikgYW5kIHZvaWQgZm9vKGRvdWJsZSAqKQogICAgICAgICAgICB1c2VkIHRvIGdlbmVyYXRlZCB0d28gb2YgdGhlc2U6CgogICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBTd2lnRGlyZWN0b3Jmb28oSW50UHRyIHApIHsgLi4uIH0KCjA2LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBwYXJhbWV0ZXIgbmFtZSBjaGFuZ2VzIGluIHN0ZF92ZWN0b3IuaSBhbGxvd2luZyBiZXR0ZXIgdGFyZ2V0aW5nCiAgICAgICAgICAgIG9mIHR5cGVtYXBzIGZvciBtZXRob2QgcGFyYW1ldGVycyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50IG9mIGNvbnRhaW5lcnMgb2YgcG9pbnRlcnMpLgoKMDYvMDcvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IGZvcmVpZ24tdHlwZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBsb29rIGZvciBmZml0eXBlIHR5cGVtYXAKCSAgICBiaW5kaW5ncy4gZml4IGlub3V0X3R5cGVtYXBzLmkgZm9yIHN0cmluZ3MuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1J1YnldCgkgICAgVXNlIHdoaWNoZXZlciBvZiAibG9uZyIgb3IgImxvbmcgbG9uZyIgaXMgdGhlIHNhbWUgc2l6ZSBhcyAidm9pZCoiCgkgICAgdG8gaG9sZCBwb2ludGVycyBhcyBpbnRlZ2VycywgcmF0aGVyIHRoYW4gd2hpY2hldmVyIG1hdGNoZXMgb2ZmX3QuCgkgICAgRml4ZXMgY29tcGlsYXRpb24gb24gT1MgWCBhbmQgR0NDIHdhcm5pbmdzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIHNpemVvZih2b2lkKikgPCBzaXplb2Yob2ZmX3QpIChTRiBwYXRjaCAjMTczMTk3OSkuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IGhhbmRsaW5nIG9mIGEgcGFydGljdWxhciBjYXNlIGludm9sdmluZyBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLgoKMDYvMDUvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGNhc2Ugd2hlcmUgd2UnZCBwYXNzIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVycwoJICAgIChpLmUuIE5TMTo6TlMyOjpGT08pIHRvIHN3aWctaW5zZXJ0LWlkLiBBbGwgbmFtZXNwYWNlcwoJICAgIHNob3VsZCBiZSBzdHJpcHBlZC4KCgkgICAgRml4IGJ1ZyBpbiBUeXBlZGVmSGFuZGxlciBpbnRyb2R1Y2VkIGJ5IGxhc3QgZml4LgoKMDYvMDUvMjAwNzogb2xseQoJICAgIEZpeCByZXBvcnRpbmcgb2YgZmlsZW5hbWVzIGluIGVycm9ycyBhZnRlciAlaW5jbHVkZSAocGF0Y2ggZnJvbQoJICAgIExlaWdoIFNtaXRoIGluICMxNzMxMDQwOyBhbHNvIHJlcG9ydGVkIGFzICMxNjk5OTQwKS4KCjA1LzMxLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCAibWlzc2luZyBpbml0aWFsaXNlciIgd2FybmluZyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGNvZGUgd2l0aCBQeXRob24gMi41IHdpdGggd2FybmluZ3MgZW5hYmxlZCAocGF0Y2ggZnJvbQoJICAgIGJ1ZyMxNzI3NjY4IGZyb20gTHVrZSBNb29yZSkuCgowNS8yOS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBTcGxpdCBkb2NzdHJpbmdzIGludG8gc2VwYXJhdGUgc3RyaW5nIGxpdGVyYWxzIGF0IGVhY2ggbmV3bGluZSB3aGVuCgkgICAgZ2VuZXJhdGluZyBDL0MrKyB3cmFwcGVyIGNvZGUgKHRoZSBDL0MrKyBjb21waWxlciB3aWxsIGp1c3QgY29tYmluZQoJICAgIHRoZW0gYmFjayBpbnRvIGEgc2luZ2xlIHN0cmluZyBsaXRlcmFsKS4gIFRoaXMgYXZvaWRzIE1TVkMKCSAgICBjb21wbGFpbmluZyB0aGF0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyAocHJvYmxlbSByZXBvcnRlZCBieQoJICAgIEJvIFBlbmcgb24gdGhlIG1haWxpbmcgbGlzdCkuCgowNS8yOC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBFc2NhcGUgYmFja3NsYXNoZXMgaW4gZG9jc3RyaW5ncy4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCBhdXRvZG9jIGdlbmVyYXRpb24gb2YgZW51bXMgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggaG93IHRoZQoJICAgIGVudW1zIGFyZSB3cmFwcGVkIC0gcGF0Y2ggIzE2OTcyMjYgZnJvbSBKb3NoIENoZXJyeS4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggd3JhcHBpbmcgb2YgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBhIHBvaW50ZXIgdG8gYQoJICAgIGNsYXNzIChidWcjMTcwMDc4OCkgYW5kIHRob3NlIHdoaWNoIGhhdmUgb3ZlcmxvYWRlZCBmb3JtcyByZXR1cm5pbmcKCSAgICBib3RoIGNsYXNzZXMgYW5kIG5vbi1jbGFzc2VzIChidWcjMTcxMjcxNywgdGhhbmtzIHRvIFNpbW9uCgkgICAgQmVydGhpYXVtZSBmb3IgdGhlIHBhdGNoKS4KCjA1LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICVyZW5hbWUgaW5jb25zaXN0ZW5jeSBpbiBjb252ZXJzaW9uIG9wZXJhdG9ycyBhcyByZXBvcnRlZCBieSBaaG9uZyBSZW4uIFRoZSBtYXRjaGluZwogICAgICAgICAgICBpcyBub3cgZG9uZSBvbiB0aGUgb3BlcmF0b3IgbmFtZSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgaXMgZG9uZSBmb3IgcGFyYW1ldGVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIEFCQygpIGNvbnN0OwogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoQUJDIGEpIGNvbnN0OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBBQkMgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoQUJDIGEpIGNvbnN0IHt9CiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgQUJDKCkgY29uc3QgeyBBQkMgYTsgcmV0dXJuIGE7IH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZSB0aGF0IHF1YWxpZnlpbmcgdGhlIGNvbnZlcnNpb24gb3BlcmF0b3IgcHJldmlvdXNseSBtYXkgb3IgbWF5IG5vdCBoYXZlIG1hdGNoZWQuCiAgICAgICAgICAgIE5vdyBpdCBkZWZpbml0ZWx5IHdvbid0LCBzbyB0aGlzIHdpbGwgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBTcGFjZTo6QUJDKCkgY29uc3Q7CgogICAgICAgICAgICBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGlzIGRvZXMgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKFNwYWNlOjpBQkMgYSkgY29uc3Q7CgogICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCB3aXRoIHJlc3BlY3QgdG8gJXJlbmFtZSwgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzLgogICAgICAgICAgICBDb252ZXJzaW9uIG9wZXJhdG9ycyBkb2N1bWVudGF0aW9uIHRvby4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDUvMTYvMjAwNzogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBiYWQgZ2VuZXJhdGlvbiBvZiBsb2NhbCB2YXIgbHR5cGUncyBpbiBmdW5jdGlvbldyYXBwZXIoKS4KCSAgICBUcnkgdG8gd29yayBiZXR0ZXIgd2l0aCB0aGUgYmFja3dhcmQgb3JkZXIgaW4gd2hpY2ggc3dpZwoJICAgIHVucm9sbHMgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zLgoJICAgIGNsZWFuZWQgdXAgYSBsaXR0bGUgdW5uZWNlc3NhcnkgY29kZS9kZWJ1ZyBwcmludGYncy4KCSAgICBSZW1vdmUgd2FybmluZyB3aGVuIHJlcGxhY2luZyAkbGRlc3RydWN0b3IgZm9yIGZmOmZvcmVpZ24tcG9pbnRlcgoKMDUvMTIvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgc3dpZyAtcHl0aG9uIC10aHJlYWRzIG5vdyBnZW5lcmF0ZXMgQy9DKysgY29kZSB3aGljaCB1c2VzIFB5dGhvbidzCgkgICAgb3duIHRocmVhZGluZyBhYnN0cmFjdGlvbiAoZnJvbSBweXRocmVhZC5oKSByYXRoZXIgdGhhbiBPUyBzcGVjaWZpYwoJICAgIGNvZGUuICBUaGUgb2xkIGNvZGUgZmFpbGVkIHRvIGNvbXBpbGUgb24gTVMgV2luZG93cy4gIChTZWUgU0YgcGF0Y2gKCSAgICB0cmFja2VyICMxNzEwMzQxKS4KCjA1LzA0LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgU1RMIHJlbmFtZXMgdG8gYmUgZ2xvYmFsIHJlbmFtZXMuICBUaGlzIGZpeGVzCgkgICAgU1RMIGZ1bmN0aW9ucyBub3QgYmVpbmcgcmVuYW1lZCB3aGVuIGF1dG9yZW5hbWUgaXMgb24uCiAgICAgICAgICAgIFRoaXMgaXMgYSBub3QgYSB0b3RhbGx5IHBlcmZlY3Qgd29yay1hcm91bmQsIGJ1dCBiZXR0ZXIuCgkgICAgU29tZW9uZSByZWFsbHkgbmVlZHMgdG8gZml4IHRoZSB0ZW1wbGF0ZSByZW5hbWluZyBjb2RlLgoJICAgIChTZWUgYnVnICMxNTQ1NjM0KQoKMDUvMDQvMjAwNyAgZ2dhCgkgICAgW0FsbF0KICAgICAgICAgICAgQ2hhbmdlZCAlcmVuYW1lKCIlKHVuZGVyY2FzZSlzIikgYSBsaXR0bGUgc28gdGhhdCBzaW5nbGUKCSAgICBudW1iZXJzIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgbm90IHVuZGVyY2FzZWQuICBUaGF0IGlzOgoJCWdldFNvbWV0aGluZyAtPiBnZXRfc29tZXRoaW5nCgkJZ2V0MkQJICAgICAtPiBnZXRfMmQKCQlnZXQyMzQJICAgICAtPiBnZXRfMjM0CgkgICAgQlVUOgoJCWFzRmxvYXQyICAgICAtPiBhc19mbG9hdDIKCSAgICAoQnVnICMxNjk5NzE0KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBfX3N3aWd0eXBlX18gPT4gQF9fc3dpZ3R5cGVfXyBzbyBpdCBjYW4gYmUgYWNjZXNzZWQKCSAgICBmcm9tIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGFuZCBmb2xsb3dzIFJ1YnkncyBvZmZpY2lhbAogICAgICAgICAgICBkb2N1bWVudGF0aW9uLCBqdXN0IGluIGNhc2UpLgoJICAgIE1hZGUgdHJhY2tpbmcgPT4gQF9fdHJhY2tpbmdzX18gZm9yIHNhbWUgcmVhc29uLgoJICAgIEN1cnJlbnRseSBzdG9yaW5nIGl2YXJzIHdpdGhvdXQgdGhlIEAgc2VlbXMgdmFsaWQsIGJ1dAoJICAgIHRoZSBQaWNrQXhlIHNheXMgdGhpcyBpcyBub3QgY29ycmVjdCwgc28ganVzdCBpbiBjYXNlLi4uCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBcHBsaWVkIHBhdGNoIGZvciAtbWluaGVyaXQgYnVnIGFuZCBleGNlcHRpb24gY2xhc3Nlcy4KCSAgICBUaGlzIGlzc3VlIHNob3VsZCBiZSByZXZpc2l0ZWQgbW9yZSBjbG9zZWx5LCBhcyBNdWx0aXBsZQoJICAgIEluaGVyaXRhbmNlIGluIFJ1YnkgaXMgc3RpbGwgcHJvYmxlbWF0aWMuCgkgICAgKHBhdGNoL2J1ZyAjMTYwNDg3OCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zIGluIHJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRvIHRoZSB1c2VyCiAgICAgICAgICAgIHRoZSBwb3NzaWJsZSBwcm90b3R5cGVzIHdoZW4gdGhlIHVzZXIgbWlzdHlwZXMgdGhlIG51bWJlciBvcgogICAgICAgICAgICB0eXBlIG9mIGEgcGFyYW1ldGVyLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRm9yZ290IHRvIGRvY3VtZW50IHRoZSBidWcgZml4aW5nIG9mIGFuIG9sZCBidWcgcmVnYXJkaW5nCgkgICAgZXhjZXB0aW9ucy4KCSAgICAoYnVnICMxNDU4MjQ3KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgUnVieSBkb2N1bWVudGF0aW9uIHRvIHVzZSB0aGUgcHJvcGVyIGNzcyBzdHlsZXMgZm9yCgkgICAgZWFjaCBzZWN0aW9uLiBBZGRlZCBhdXRvZG9jIHNlY3Rpb24gdG8gUnVieSdzIGRvY3MgdG8KCSAgICBkb2N1bWVudCB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IFJ1YnkgaW4gZG9jdW1lbnRpbmcgaXRzIG1vZHVsZXMuCgkgICAgTWFkZSByZG9jIGRvY3VtZW50YXRpb24gc3BpdCBvdXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKwoJICAgIG1ldGhvZCBuYW1lLiAgQWxiZWl0IHRoaXMgd2lsbCBtYWtlIHRoZSBjdXJyZW50IHJkb2Mgbm90IHJlY29nbml6ZQogICAgICAgICAgICB0aGUgbWV0aG9kLCB0aGlzIGlzIHN0aWxsIG5lZWRlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBkaWZmZXJlbnQKICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHNpbWlsYXIgbWV0aG9kcyAocmRvYyB3YXMgY3JlYXRlZCB0byBkb2N1bWVudCB0aGUKCSAgICBydWJ5IHNvdXJjZSB3aGljaCBvbmx5IGNvbnRhaW5zIG9uZSBjbGFzcyBwZXIgYyBmaWxlLCB1bmxpa2Ugc3dpZykKICAgICAgICAgICAgSSBoYXZlIHBhdGNoZWQgcmRvYyB0byBtYWtlIGl0IG1vcmUgZnJpZW5kbHkgdG8gc3dpZy4gIFRoaXMKICAgICAgICAgICAgcGF0Y2ggbmVlZHMgdG8gYmUgbWVyZ2VkIGluIHRoZSBydWJ5IHN0ZCBsaWJyYXJ5IG5vdy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgZmxhZyAtZmVhdHVyZSB0byBiZSAtaW5pdF9uYW1lIHRvIGJldHRlciByZWZsZWN0IGl0cwoJICAgIHB1cnBvc2UgYW5kIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIC1mZWF0dXJlcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIGF1dG9kb2MgZ2VuZXJhdGlvbi4KCSAgICBBZGRlZCBhdXRvZG9jIC5zd2cgZmlsZXMgdG8gUnVieSBsaWJyYXJ5IGZvciBlYXNpbHkgYWRkaW5nCgkgICAgZG9jdW1lbnRhdGlvbiB0byBjb21tb24gUnVieSBtZXRob2RzIGFuZCBTVEwgbWV0aG9kcy4KCSAgICBGaXhlZCBhdXRvZG9jIGRvY3VtZW50aW5nIG9mIGdldHRlcnMgYW5kIHNldHRlcnMgYW5kIG1vZHVsZS4KCSAgICBNYWRlIHRlc3Qgc3VpdGUgYWx3YXlzIGdlbmVyYXRlIGF1dG9kb2NzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCBzb21lIHdhcm5pbmdzIGZyb20gU1RMIGFuZCB0ZXN0IHN1aXRlLgoKMDUvMDIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgaXNzdWVzIHdpdGggQysrIGNsYXNzZXMgYW5kIGhpZXJhY2hpZXMgYWNyb3NzIG11bHRpcGxlCgkgICAgc291cmNlIGZpbGVzLiBGaXhlZCBpbXBvcnRzIHRlc3QgY2FzZSAmIGFkZGVkIHJ1biB0ZXN0LgoJICAgIEFkZGVkIEV4YW1wbGVzL2ltcG9ydHMuCgkgICAgQWRkZWQgdHlwZW5hbWUgZm9yIHJhdyBsdWFfU3RhdGUqCgkgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBvbiBuYXRpdmUgZnVuY3Rpb25zLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRG9jc3RyaW5ncyBhcmUgbm93IHN1cHBvcnRlZC4KCSAgICAlZmVhdHVyZSgiYXV0b2RvYyIpIGFuZCAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdwoJICAgIHByb3Blcmx5IHN1cHBvcnRlZCBpbiBSdWJ5LiAgVGhlc2UgZmVhdHVyZXMgd2lsbCBnZW5lcmF0ZQoJICAgIGEgX3dyYXAuY3h4IGZpbGUgd2l0aCByZG9jIGNvbW1lbnRzIGluIHRoZW0uCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBTVEwgZmlsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIGZvbGxvdyB0aGUgbmV3IHN3aWcvcHl0aG9uCgkgICAgTGliL3N0ZCBjb252ZW50aW9ucy4KCSAgICBUaGlzIG1lYW5zIHN0ZDo6dmVjdG9yLCBzdGQ6OnNldCwgc3RkOjptYXAsIHNldDo6bXVsdGltYXAsCgkgICAgc3RkOjptdWx0aXNldCwgc3RkOjpkZXF1ZSBhbmQgc3RkOjpzdHJpbmcgYXJlIG5vdyBwcm9wZXJseQoJICAgIHN1cHBvcnRlZCwgaW5jbHVkaW5nIHRoZWlyIGl0ZXJhdG9ycywgc3VwcG9ydCBmb3IgY29udGFpbmluZwoJICAgIHJ1Ynkgb2JqZWN0cyAoc3dpZzo6R0NfVkFMVUUpIGFuZCBzZXZlcmFsIG90aGVyIHJ1YnkKCSAgICBlbmhhbmNlbWVudHMuCgkgICAgc3RkOjpjb21wbGV4LCBzdGQ6Omlvcywgc3RkOjppb3N0cmVhbSwgc3RkOjppb3N0cmVhbWJ1ZiBhbmQKCSAgICBzdGQ6OnNzdHJlYW0gYXJlIG5vdyBhbHNvIHN1cHBvcnRlZC4KCSAgICBzdGQ6OndzdHJpbmcsIHN0ZDo6d2lvcywgc3RkOjp3aW9zdHJlYW0sIHN0ZDo6d2lvc3RyZWFtYnVmCgkgICAgYW5kIHN0ZDo6d3NzdHJlYW0gYXJlIHN1cHBvcnRlZCB2ZXJiYXRpbSB3aXRoIG5vIHVuaWNvZGUKCSAgICBjb252ZXJzaW9uLgoKCSAgICBzdGRfdmVjdG9yLmkgbm93IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgUnVieSBBcnJheXMgbXVjaCBtb3JlCgkgICAgY2xvc2VseSwgc3VwcG9ydGluZyBzbGljaW5nLCBzaGlmdGluZywgdW5zaGlmdGluZywKICAgICAgICAgICAgbXVsdGlwbGUgaW5kZXhpbmcgYW5kIHByb3BlciByZXR1cm4gdmFsdWVzIG9uIGFzc2lnbm1lbnQuCgoJICAgIENPTVBBVEFCSUxJVFkgTk9URTogdGhpcyBjaGFuZ2VzIHRoZSBvbGRlciBhcGkgYSBsaXR0bGUgYml0IGluCgkgICAgdGhhdCBpbXByb3BlciBpbmRleGluZyB3b3VsZCBwcmV2aW91c2x5IChpbmNvcnJlY3RseSkgcmFpc2UKCSAgICBleGNlcHRpb25zLiAgTm93LCBuaWwgaXMgcmV0dXJuZWQgaW5zdGVhZCwgZm9sbG93aW5nIHJ1YnkncwoJICAgIHN0YW5kYXJkIEFycmF5IGJlaGF2aW9yLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCB0aGUgdmFsdWUgb2YgU1dJR19UWVBFQ0hFQ0tfQk9PTCB0byBiZSAxMDAwMCAoaWUuIGhpZ2hlcgoJICAgIHRoYW4gdGhhdCBvZiBhbGwgaW50ZWdlcnMpLgoJICAgIFRoaXMgaXMgYmVjYXVzZSBSdWJ5IGFsbG93cyB0eXBlY2FzdGluZwoJICAgIGludGVnZXJzIGRvd24gdG8gYm9vbGVhbnMgd2hpY2ggY2FuIG1ha2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgb24KCSAgICBib29scyBhbmQgaW50ZWdlcnMgdG8gZmFpbC4KCSAgICAoYnVnIyAxNDg4MTQyKQoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgYSBzdWJ0bGUgYnVnIGluIG11bHRpcGxlIGFyZ291dHMgdGhhdCBjb3VsZCBnZXQgdHJpZ2dlcmVkIGlmCgkgICAgdGhlIHVzZXIgcmV0dXJuZWQgdHdvIG9yIG1vcmUgYXJndW1lbnRzIGFuZCB0aGUgZmlyc3Qgb25lIHdhcyBhbgoJICAgIGFycmF5LgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhlIG5ldyBmZWF0dXJlcwogICAgICAgICAgICBhZGRlZCwgYWRkIGRpcmVjdG9yaW4vb3V0L2FyZ291dCB0eXBlbWFwcywgZXRjLgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQWRkZWQgJWluaXRzdGFjayBhbmQgJWlnbm9yZXN0YWNrIGRpcmVjdGl2ZXMgZm9yIGRpcmVjdG9yCgkgICAgZnVuY3Rpb25zLiAgVGhlc2UgYWxsb3cgeW91IHRvIGNvbnRyb2wgd2hldGhlciBhIGRpcmVjdG9yCgkgICAgZnVuY3Rpb24gc2hvdWxkIHJlLWluaXQgdGhlIFJ1Ynkgc3RhY2suCgkgICAgVGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGZvciBhbiBlbWJlZGRlZCBSdWJ5IHdoZXJlIHRoZQoJICAgIGRpcmVjdG9yIG1ldGhvZCBpcyB1c2VkIGFzIGEgQysrIGNhbGxiYWNrIGFuZCBub3QgY2FsbGVkCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyIGZyb20gcnVieSBjb2RlLgoJICAgIEV4cGxhbmF0aW9uOgoJICAgIFJ1YnkncyBHQyBuZWVkcyB0byBiZSBhd2FyZSBvZiB0aGUgcnVubmluZyBPUyBzdGFjayBpbiBvcmRlciB0bwoJICAgIG1hcmsgYW55IFZBTFVFIChSdWJ5IG9iamVjdHMpIGl0IGZpbmRzIHRoZXJlIHRvIGF2b2lkIGNvbGxlY3Rpb24KCSAgICBvZiB0aGVtLiAgVGhpcyBhbGxvd3MgdGhlIHJ1YnkgQVBJIHRvIGJlIHZlcnkgc2ltcGxlIGFuZCBhbGxvd3MKCSAgICB5b3UgdG8gd3JpdGUgY29kZSBsaWtlICJWQUxVRSBhID0gc3RoIiBhbnl3aGVyZSB3aXRob3V0IG5lZWRpbmcKCSAgICB0byBkbyB0aGluZ3MgbGlrZSByZWZjb3VudGluZyBsaWtlIHB5dGhvbi4KCSAgICBCeSBkZWZhdWx0LCB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrIGlzIHNldCB3aGVuIHJ1YnlfaW5pdCgpIGlzCgkgICAgY2FsbGVkLiAgIElmIHJ1YnkgaXMgaW5pdGVkIHdpdGhpbiBtYWluKCksIGFzIGl0IHVzdWFsbHkgaXMgdGhlCgkgICAgY2FzZSB3aXRoIHRoZSBtYWluIHJ1YnkgZXhlY3V0YWJsZSwgcnVieSB3aWxsIGJlIGFibGUgdG8gY2FsY3VsYXRlCgkgICAgaXRzIHN0YWNrIHByb3Blcmx5LiAgSG93ZXZlciwgd2hlbiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYXMgd2hlbgoJICAgIHJ1YnkgaXMgZW1iZWRkZWQgYXMgYSBwbHVnaW4gdG8gYW4gYXBwbGljYXRpb24gd2hlcmUgbWFpbiBpcyBub3QKCSAgICBhdmFpbGFibGUsIHJ1YnlfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZSwgYW5kCgkgICAgcnVieSB3aWxsIGJlIGluY29ycmVjdGx5IHRyYWNraW5nIHRoZSBzdGFjayBmcm9tIHRoZSBmdW5jdGlvbgoJICAgIHRoYXQgY2FsbGVkIHJ1YnlfaW5pdCgpIGZvcndhcmRzIG9ubHksIHdoaWNoIGNhbiBsZWFkIHRvCgkgICAgYWxsIHNvcnRzIG9mIHdlaXJkIGNyYXNoZXMgb3IgdG8gcnVieSB0aGlua2luZyBpdCBoYXMgcnVuIG91dCBvZgoJICAgIHN0YWNrIHNwYWNlIGluY29ycmVjdGx5LgoJICAgIFRvIGF2b2lkIHRoaXMsIGRpcmVjdG9yIChjYWxsYmFjaykgZnVuY3Rpb25zIGNhbiBub3cgYmUgdGFnZ2VkCgkgICAgdG8gdHJ5IHRvIHJlc2V0IHRoZSBydWJ5IHN0YWNrLCB3aGljaCB3aWxsIHNvbHZlIHRoZSBpc3N1ZXMuCgkgICAgTk9URTogcnVieTEuOC42IHN0aWxsIGNvbnRhaW5zIGEgYnVnIGluIGl0IGluIHRoYXQgaXRzIGZ1bmN0aW9uCgkgICAgdG8gcmVzZXQgdGhlIHN0YWNrIHdpbGwgbm90IGFsd2F5cyBkbyBzby4gIFRoaXMgYnVnIGlzIHRyaWdnZXJlZAoJICAgIHZlcnkgcmFyZWx5LCB3aGVuIHJ1YnkgaXMgY2FsbGVkIGZyb20gdHdvIHZlcnkgZGlzdGluY3QgcGxhY2VzCgkgICAgaW4gbWVtb3J5LCBsaWtlIGEgYnJhbmNoIG9mIG1haW4oKSBhbmQgYW5vdGhlciBkc28uICBUaGlzIGJ1ZwoJICAgIGhhcyBub3cgYmVlbiByZXBvcnRlZCB0byBydWJ5LWNvcmUgYW5kIGlzIHBlbmRpbmcgZnVydGhlcgoJICAgIGludmVzdGlnYXRpb24uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8zMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE3MDc1ODIgLSBSZXN0b3JlIGJ1aWxkaW5nIGZyb20gcmVhZC1vbmx5IHNvdXJjZSBkaXJlY3Rvcmllcy4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRoZSBwYXJhbWV0ZXIgaW5kZXggcHJvcGVybHkgb24gdHlwZQoJICAgIGVycm9ycyBhcyB3ZWxsIGFzIHRoZSBjbGFzcyBhbmQgdmFsdWUgb2YgdGhlIGluY29ycmVjdAoJICAgIGFyZ3VtZW50IHBhc3NlZC4KCSAgICAoZmVhdHVyZSByZXF1ZXN0ICMxNjk5NjcwKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSBubyBsb25nZXIgY3JlYXRlcyB0aGUgZnJlZV9DbGFzcyBmdW5jdGlvbiBpZiB0aGUgY2xhc3MKCSAgICBjb250YWlucyBpdHMgb3duIHVzZXIgZGVmaW5lZCBmcmVlIGZ1bmN0aW9uICglZnJlZWZ1bmMpLgoJICAgIChidWcgIzE3MDI4ODIpCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIGRpcmVjdG9ycyByYWlzZSBhIHJ1YnkgZXhjZXB0aW9uIGZvciBpbmNvcnJlY3QgYXJnb3V0CgkgICAgcmV0dXJuZWQgdmFsdWVzIGlmIFJVQllfRU1CRURERUQgaXMgc2V0LCBpbnN0ZWFkIG9mIHRocm93aW5nCgkgICAgYW4gYWN0dWFsIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgkgICAgVGhpcyB3aWxsIHByZXZlbnQgY3Jhc2hlcyB3aGVuIHJ1YnkgaXMgZW1iZWRkZWQgYW5kIHVuYXdhcmUKCSAgICBvZiB0aGUgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgdGhlIG5lZWQgZm9yIC1EU1dJR0VYVEVSTi4KCSAgICBDaGFuZ2VkIHN3aWdfcnVieV90cmFja2luZ3MgdG8gYmUgYSBzdGF0aWMgdmFyaWFibGUsIGJ1dCBhbHNvCgkgICAgYmUga2VwdCB3aXRoaW4gYSBoaWRkZW4gaW5zdGFuY2UgdmFyaWFibGUgaW4gdGhlIFNXSUcgbW9kdWxlLgoJICAgIFRoaXMgYWxsb3dzIHByb3Blcmx5IGRlYWxpbmcgd2l0aCB0cmFja2luZ3MgYWNyb3NzIG11bHRpcGxlCgkgICAgRFNPcywgd2hpY2ggd2FzIHByZXZpb3VzbHkgYnJva2VuLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIGltcHJvdmVtZW50IHRvIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldIEZpeGVkIEdDIG1lbW9yeSBpc3N1ZXMgd2l0aCB0cmFja2luZ3MgdGhhdCBjb3VsZCBsZWFkCgkgICAgdG8gc2VnZmF1bHRzIHdoZW4gZGVhbGluZywgbWFpbmx5LCB3aXRoIHN0YXRpYyB2YXJpYWJsZXMuCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBTdHJpbmcgY29udmVyc2lvbiB1c2luZyBvbGQgcnVieTEuNiBtYWNyb3MuICBOb3cKCSAgICBTdHJpbmdWYWx1ZVB0cigpIGlzIHVzZWQgaWYgYXZhaWxhYmxlLiAgVGhpcyByZW1vdmVzIHdhcm5pbmdzCgkgICAgd2hlbiBjb252ZXJ0aW5nIHN0cmluZ3Mgd2l0aCBcMCBpbiB0aGVtLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgdGhlIGFyZ291dCBjb3VudCBpbiBkaXJlY3RvcnMgZm9yIFJ1YnkuICBQcmV2aW91c2x5LAoJICAgIGlnbm9yZWQgb3IgIm51bWlucHV0cz0wIiB0eXBlbWFwcyB3b3VsZCBpbmNvcnJlY3RseSBub3QgZ2V0CgkgICAgY291bnRlZCB0b3dhcmRzIHRoZSBhcmdvdXQgY291bnQuCgkgICAgKGJ1Zy9wYXRjaCAjMTU0NTU4NSkKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFVwZ3JhZGVkIFJ1YnkgY29udmVydGVyIHRvIHJlY29nbml6ZSAibnVtaW5wdXRzPTAiLiAgUHJldmlvdXNseSwKCSAgICBvbmx5IHRoZSBvbGQgImlnbm9yZSIgZmxhZyB3YXMgY2hlY2tlZCAod2hpY2ggd291bGQgY3VycmVudGx5CgkgICAgc3RpbGwgd29yayBwcm9wZXJseSwgYnV0IGlzIGRlcHJlY2F0ZWQpLgoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnkgLSBidXQgc2hvdWxkIGJlIG1hZGUgZ2VuZXJpY10KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgYWRkZWQuCgoJICAgIFRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGlnbm9yZSB0aGUgb3V0cHV0IG9mIGEgZnVuY3Rpb24gc28KCSAgICB0aGF0IGl0IGlzIG5vdCBhZGRlZCB0byBhIGxpc3Qgb2Ygb3V0cHV0IHZhbHVlcwoJICAgICggaWUuIGFyZ291dHMgKS4KCSAgICBUaGlzIHNob3VsZCBhbHNvIGJlY29tZSBhIGZlYXR1cmUgb2YgJXR5cGVtYXAoZGlyZWN0b3JvdXQpCgkgICAgYXMgIm51bW91dHB1dHMiPTAsIGp1c3QgbGlrZSAibnVtaW5wdXRzIj0wIGV4aXN0cy4KCgkgICAgJWZlYXR1cmUoImRpcmVjdG9ycyI9MSkKCgkgICAgJWluY2x1ZGUgPHR5cGVtYXBzLmk+CgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIHsgQ2xhc3M6Om1lbWJlcl9mdW5jdGlvbjEgfTsKCSAgICAldHlwZW1hcChvdXQpIE1TdGF0dXMgeyAvLyBzb21lIGNvZGUsIGxpa2UgY2hlY2sgbXN0YXR1cwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByYWlzZSBleGNlcHRpb24gaWYgd3JvbmcgfTsKCgkgICAgJWlubGluZSAlewoJICAgICAgdHlwZWRlZiBpbnQgTVN0YXR1czsKCSAgICAgIGNsYXNzIENsYXNzIHsKCgkgICAgICAvLyBvbmUgYXJndW1lbnQgcmV0dXJuZWQsIGJ1dCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBkaXNjYXJkZWQgYXMgYSByZXR1cm4gKG91dCkgcGFyYW1ldGVyLgoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjEoIGludCYgT1VUUFVUICk7CgoJICAgICAgLy8gdHdvIGFyZ3VtZW50cyByZXR1cm5lZCwgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgbm90IGRpc2NhcmRlZAoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjIoIGludCYgT1VUUFVUICk7CgkgICAgICB9OwogICAgICAgICAgICAlfQoKCjA0LzIxLzIwMDc6IG9sbHkKCSAgICBGaXggcGFyc2luZyBvZiBmbG9hdCBjb25zdGFudHMgd2l0aCBhbiBleHBvbmVudCAoZS5nLiAxZS0wMmYpCgkgICAgKGJ1ZyAjMTY5OTY0NikuCgowNC8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGxhY2sgb2YgZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIHdoZW4gLU8gaXMgdXNlZC4KCSAgICBBbHNvLCBmaXggZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIGNvbnRhaW5pbmcgYSBkb3VibGUgcXVvdGUKCSAgICBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBidWcjMTcwMDE0Ni4KCjA0LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU3VwcG9ydCBmb3IgYWRkaW5nIGluIEphdmEvQyMgY29kZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnRlcm1lZGlhcnkgY2FsbCwKICAgICAgICAgICAgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdGhlIG1hcnNoYWxsaW5nIG9mIHRoZSBwcm94eSB0eXBlIHRvIHRoZSBpbnRlcm1lZGlhcnkgdHlwZS4KICAgICAgICAgICAgVGhlIGphdmFpbi9jc2luIHR5cGVtYXAgbm93IHN1cHBvcnRzIHRoZSAncHJlJyBhbmQgJ3Bvc3QnIGF0dHJpYnV0ZXMgdG8gYWNoaWV2ZSB0aGlzLgogICAgICAgICAgICBUaGUgamF2YWluIHR5cGVtYXAgYWxzbyBzdXBwb3J0cyBhbiBvcHRpb25hbCAncGdjcHBuYW1lJyBhdHRyaWJ1dGUgZm9yIHByZW1hdHVyZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgbmFtaW5nIGFuZCB0aGUgY3NpbiB0eXBlbWFwIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdjc2hpbicKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGhlbHBlciBnZW5lcmF0ZWQgd2hlbiB0aGUgdHlwZSBpcyB1c2VkCiAgICAgICAgICAgIGluIGEgY29uc3RydWN0b3IuIERldGFpbHMgaW4gdGhlIEphdmEuaHRtbCBhbmQgQ1NoYXJwLmh0bWwgZG9jdW1lbnRhdGlvbi4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBEb24ndCB0cmVhdCBgcmVzdHJpY3QnIGFzIGEgcmVzZXJ2ZWQgaWRlbnRpZmllciBpbiBDKysgbW9kZQoJICAgIChidWcjMTY4NTUzNCkuCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBob3cgemVuZF90aHJvd19leGNlcHRpb24oKSBpcyBjYWxsZWQgKGJ1ZyAjMTcwMDc4NSkuCgowNC8xMC8yMDA3OiBvbGx5CgkgICAgRGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdG8gdGVtcGxhdGUgZm9yIGFDQyAocmVwb3J0ZWQgb24KCSAgICBzd2lnLXVzZXIgdGhhdCB0aGlzIGlzIG5lZWRlZCkuCgowNC8wNC8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIElmIFpUUyBpcyBlbmFibGVkLCByZWxlYXNlIDxtb2R1bGU+X2dsb2JhbHNfaWQgaW4gTVNIVVRET1dOCgkgICAgdG8gYXZvaWQgUEhQIGludGVycHJldGVyIGNyYXNoIG9uIHNodXRkb3duLiAgVGhpcyBzb2x1dGlvbiB3YXMKCSAgICBzdWdnZXN0ZWQgaGVyZTogaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQwOTg1CgowNC8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDRdIEFkZCBtaXNzaW5nIFpUUyBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgQysrIHdyYXBwZXIgY29kZQoJICAgIHRvIGZpeCBjb21waWxhdGlvbiBmYWlsdXJlcyB3aGVuIHVzaW5nIFpUUyBlbmFibGVkIFNXSUcgKExpbnV4CgkgICAgZGlzdHJpYnV0aW9ucyB0ZW5kIHRvIGRpc2FibGUgWlRTLCBidXQgbm90YWJseSB0aGUgV2luZG93cyBidWlsZAoJICAgIHVzZXMgaXQgYnkgZGVmYXVsdCkuCgowNC8wMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjg0MjYxOiBmaXhlcyBoYW5kbGluZyBvZiB1bnNpZ25lZCBpbnQgbGl0ZXJhbHMsIHRoYW5rcyBMZWlnaCBTbWl0aC4KICAgICAgICAgICAgQWxzbywgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbi4KCjAzLzMwLzIwMDc6IG9sbHkKCSAgICBBdm9pZCBnZW5lcmF0aW5nICc8OicgdG9rZW4gd2hlbiB1c2luZyBTd2lnVmFsdWVXcmFwcGVyPD4gb24gYSB0eXBlCgkgICAgd2hpY2ggc3RhcnRzIHdpdGggJzo6JyAocGF0Y2ggIzE2OTA5NDgpLgoKMDMvMjUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgW3Blcmw1XSBBZGQgU1dJR19mYWlsIHRvIHRoZSBTV0lHX2V4Y2VwdGlvbiBtYWNyby4gIEZpeGVzIGEgZmV3IHByb2JsZW1zIHJlcG9ydGVkCgkgICAgb24gdGhlIG1haWxpbmcgbGlzdC4KCjAzLzIzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFN0cmluZyBjb3B5aW5nIHBhdGNoIGZyb20gSm9zaCBDaGVycnkgcmVkdWNpbmcgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IGFib3V0IDI1JS4KCjAzLzIxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTYzMTk4NyBmcm9tIFVscmlrIFBldGVyc29uIC0gYm9vbCBJTk9VVCB0eXBlbWFwcwogICAgICAgICAgICBmYWlsIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMuCgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IGdpdmVuIGRvZGd5IEMrKyBjb2RlOiBuYW1lc3BhY2UgYWJjOjpkZWYgeyB9CgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgc28gdGhhdCBBUlJBWVNPRkNMQVNTRVMgYW5kIEFSUkFZU09GRU5VTVMgaW4gYXJyYXlzX2phdmEuaSBjYW4gYmUgYXBwbGllZAogICAgICAgICAgICB0byBwb2ludGVyIHR5cGVzLgoKMDMvMDMvMjAwNzogb2xseQoJICAgIFtQSFA1XSBXaGVuIHdlIGtub3cgdGhlIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZSBmb3IgYSBjb25zdGFudCwgdXNlCgkgICAgdGhhdCB0byBpbml0aWFsaXNlIHRoZSBjb25zdCBtZW1iZXIgaW4gdGhlIFBIUCB3cmFwcGVyIGNsYXNzLgoKMDMvMDIvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggUEhQIHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgZm9yIGNlcnRhaW4gY2FzZXMgb2YKCSAgICBvdmVybG9hZGVkIGZvcm1zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuCgowMi8yNi8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjU2Mzk1OiBmaXhlZCBoZXggYW5kIG9jdGFsIHZhbHVlcyBidWcsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLgoKMDIvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgYnVnIGluIHR5cGVtYXBzIHdoaWNoIGNhdXNlZCBkZXJpdmVkX2J5dmFsdWUgYW5kIHJuYW1lIHRlc3QgY2FzZXMgdG8gZmFpbC4KCSAgICBVcGRhdGVkIGRlcml2ZWRfYnl2YWx1ZS5pIHRvIGV4cGxhaW4gaG93IHRvIGZpbmQgYW5kIGZpeCB0aGUgcHJvYmxlbQoKMDEvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTM4NTIyIGFuZCAjMTMzODUyNywgZm9yd2FyZCB0ZW1wbGF0ZWQgY2xhc3MgZGVjbGFyYXRpb25zIHdpdGhvdXQgYQogICAgICAgICAgICBuYW1lIGZvciB0aGUgdGVtcGxhdGVkIGNsYXNzIHBhcmFtZXRlcnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgY2xhc3M+IGNsYXNzIFg7CgowMS8yMy8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXRjaCAjMTY0MDg2MjogPG1hbGxvYy5oPiByZXBsYWNlZCBieSA8c3RkbGliLmg+CgkgICAgUGF0Y2ggIzE1OTgwNjMgVHlwbyBpbiB0eXBlbWFwcy5pCgowMS8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIGx1YSBzcGVjaWZpYyBjYXJyYXlzLmkgd2hpY2ggYWRkcyB0aGUgb3BlcmF0b3JbXSBzdXBwb3J0LgoJICAgIG1vZGlmaWVkIHRoZSBtYWluIGNvZGUgdG8gbWFrZSBpdCBub3QgZW1pdCBhbGwgdGhlIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMgJiBhY2Nlc3NvcnMKCSAgICBOb3RlOiBDIHN0cnVjdHMgYXJlIGNyZWF0ZWQgdXNpbmcgbmV3X1hYWCgpIHdoaWxlIEMrKyBjbGFzc2VzIHVzZSBYWFgoKSAoc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCkKCSAgICBVcGRhdGVkIHRlc3QgY2FzZTogbGlfY2FycmF5cwoJICAgIFVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24uCgowMS8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGQgc3VwcG9ydCBmb3IgbmV3ZnJlZSB0eXBlbWFwcyAoc29tZXRpbWVzIHVzZWQgYnkgJW5ld29iamVjdCkKCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW1hY3JvZXJyb3JzLiAgIFdoZW4gc3VwcGxpZWQsIHRoaXMgd2lsbCBmb3JjZQogICAgICAgICAgICB0aGUgQyBzY2FubmVyL3BhcnNlciB0byByZXBvcnQgcHJvcGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBjb2RlIGNvbnRhaW5lZAogICAgICAgICAgICBpbnNpZGUgU1dJRyBtYWNyb3MgKGRlZmluZWQgd2l0aCAlZGVmaW5lKS4gIEJ5IGRlZmF1bHQsIFNXSUcgbWVyZWx5IHJlcG9ydHMKICAgICAgICAgICAgZXJyb3JzIG9uIHRoZSBsaW5lIGF0IHdoaWNoIGEgbWFjcm8gaXMgdXNlZC4gIFdpdGggdGhpcyBvcHRpb24sIHlvdQogICAgICAgICAgICBjYW4gZXhwYW5kIHRoZSBlcnJvciBiYWNrIHRvIGl0cyBzb3VyY2UtLS1zb21ldGhpbmcgd2hpY2ggbWF5IHNpbXBsaWZ5CiAgICAgICAgICAgIGRlYnVnZ2luZy4KCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10gTWFqb3Igb3ZlcmhhdWwgb2YgQy9DKysgc2Nhbm5pbmcgaW1wbGVtZW50YXRpb24uICBGb3IgcXVpdGUKICAgICAgICAgICAgc29tZSB0aW1lLCBTV0lHIGNvbnRhaW5lZCB0d28gY29tcGxldGVseSBpbmRlcGVuZGVudCBDL0MrKyB0b2tlbml6ZXJzLS0KICAgICAgICAgICAgdGhlIGxlZ2FjeSBzY2FubmVyIGluIENQYXJzZS9jc2Nhbm5lci5jIGFuZCBhIGdlbmVyYWwgcHVycG9zZSBzY2FubmVyCiAgICAgICAgICAgIGluIFN3aWcvc2Nhbm5lci5jLiBTV0lHIHN0aWxsIGhhcyB0d28gc2Nhbm5pbmcgbW9kdWxlcywgYnV0IHRoZSBDIHBhcnNlcgogICAgICAgICAgICBzY2FubmVyIChDUGFyc2UvY3NjYW5uZXIuYykgbm93IHJlbGllcyB1cG9uIHRoZSBnZW5lcmFsIHB1cnBvc2UKICAgICAgICAgICAgc2Nhbm5lciBmb3VuZCBpbiBTd2lnL3NjYW5uZXIuYy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBtdWNoIHNtYWxsZXIgYW5kCiAgICAgICAgICAgIGxlc3MgY29tcGxpY2F0ZWQuICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1haW50YWluIGFsbAogICAgICAgICAgICBvZiB0aGUgbG93LWxldmVsIEMgdG9rZW5pemluZyBpbiBvbmUgY2VudHJhbCBsb2NhdGlvbiBpbnN0ZWFkIG9mIHR3bwogICAgICAgICAgICBwbGFjZXMgYXMgYmVmb3JlLgoKICAgICAgICAgICAgKioqUE9URU5USUFMIEZMQUtJTkVTUyoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBhY2N1cmF0ZSBsaW5lIG51bWJlciByZXBvcnRpbmcKICAgICAgICAgICAgYXMgd2VsbCBhcyBlcnJvciByZXBvcnRpbmcgbW9yZSBnZW5lcmFsbHkuIEkgaGF2ZSB0cmllZCB0byByZXNvbHZlIHRoaXMKICAgICAgICAgICAgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29ybmVyIGNhc2VzLgoKMDEvMTIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgdHlwZW1hcCB0aHJvd3MgZm9yIHN0ZDo6c3RyaW5nKiwgdHlwZW1hcCBmb3IgU1dJR1RZUEUgRFlOQU1JQywKCSAgICBjaGFuZ2VkIHRoZSBleGlzdGluZyB0aHJvd3MgdHlwZW1hcCB0byB0aHJvdyBhIHN0cmluZyBpbnN0ZWFkIG9mIG1ha2luZyBhIGNvcHkgb2YKCSAgICB0aGUgb2JqZWN0ICh1cGRhdGluZyBhIGZldyB0ZXN0IGNhc2VzIHRvIGRlYWwgd2l0aCB0aGUgY2hhbmdlKS4KCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGR5bmFtaWNfY2FzdHMsIGV4Y2VwdGlvbl9wYXJ0aWFsX2luZm8sIGxpX3N0ZF9zdHJpbmcsIHNpemVfdAoKMDEvMDMvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXS4gIFVzZSBvZiBzd2lna2V5cy5jLy5oIHZhcmlhYmxlcyBpcyByZXZva2VkLiAgUGxlYXNlIHVzZQogICAgICAgICAgICBzaW1wbGUgc3RyaW5ncyBmb3IgYXR0cmlidXRlIG5hbWVzLgoKMTIvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBBUEkgZnVuY3Rpb25zIEhhc2hHZXRBdHRyKCkgYW5kIEhhc2hDaGVja0F0dHIoKSBoYXZlIGJlZW4gcmV2b2tlZC4KICAgICAgICAgICAgUGxlYXNlIHVzZSBHZXRhdHRyKCkgdG8gcmV0cmlldmUgYXR0cmlidXRlcy4gIFRoZSBmdW5jdGlvbiBDaGVja2F0dHIoKSBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBjaGVjayBhdHRyaWJ1dGVzLiAgTm90ZTogIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmV2b2tlZAogICAgICAgICAgICBiZWNhdXNlIHRoZXkgb25seSBhZGRlZCBhIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGF0IHRoZSBleHBlbnNlCiAgICAgICAgICAgIGNvZGUgY2xhcml0eS4KCjEyLzI2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1vcmUgU1RMIChtb3JlIGV4Y2VwdGlvbnMsIG1hcCwgc2l6ZV90KSwKCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGNvbnZlcnNpb25fbnNfdGVtcGxhdGUuCgoxMi8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGUgdG8gdGhyb3cgZXJyb3JzIHdoZW4gc2V0dGluZyBpbW11dGFibGVzLAoJICAgIGFuZCBhbGxvd2luZyB1c2VyIGFkZGl0aW9uIG9mIG1vZHVsZSB2YXJpYWJsZXMuCgoxMi8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZWRlZidkIHZhcmlhYmxlIHdyYXBwZXJzIHRoYXQgdXNlICVuYXR1cmFsdmFyLCBlZywgc3RkOjpzdHJpbmcuCgoxMi8xNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QgdHlwZW1hcHMKCjEyLzE0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggYnVnICMxNjEzNjczIChiYWQgUEhQNSBjb2RlIGdlbmVyYXRlZCBmb3IgZ2V0dGVycyBhbmQKCSAgICBzZXR0ZXJzKS4KCjEyLzAyLzIwMDY6IHdzZnVsdG9uLCBKb2huIExlbnosIERhdmUgQmVhemxleQogICAgICAgICAgICBNb3ZlIGZyb20gY3ZzIHRvIFN1YnZlcnNpb24gZm9yIHNvdXJjZSBjb250cm9sCgoxMS8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIENsZWFuZWQgdXAgc3dpZ3dhcm5pbmdzLnN3ZyBmaWxlIG5vdCB0byB1c2UgbmVzdGVkIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb25zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZm9yICVleHRlbmQgdG8gd29yayBmb3Igc3RhdGljIG1lbWJlciB2YXJpYWJsZXMuCgpWZXJzaW9uIDEuMy4zMSAoTm92ZW1iZXIgMjAsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IEx1aWdpIEJhbGxhYmlvCiAgICAgICAgICAgIFtQeXRob25dIEFsdGVybmF0ZSBmaXggZm9yIFB5dGhvbiBleGNlcHRpb25zIGJ1ZyAjMTU3ODM0NiAodGhlIHByZXZpb3VzIG9uZSBicm9rZSBQeXRob24KICAgICAgICAgICAgcHJvcGVydGllcyBpbiBtb2Rlcm4gY2xhc3NlcykKCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIC1mYWtldmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gbm93IGdlbmVyYXRlcyB0aGUgZmFrZSB2ZXJzaW9uIGludG8gdGhlIGdlbmVyYXRlZCB3cmFwcGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIGRpc3BsYXlpbmcgaXQgd2hlbiB0aGUgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIGlzIHVzZWQuCgoxNC8xMS8yMDA2OiBtZ29zc2FnZQoJICAgIFtsdWFdIHVwZGF0ZSB0byB0eXBlbWFwIGZvciBvYmplY3QgYnkgdmFsdWUsIHRvIG1ha2UgaXQgYzg5IGNvbXBsaWFudAoKVmVyc2lvbiAxLjMuMzAgKE5vdmVtYmVyIDEzLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbamF2YV0gUmVtb3ZlIERldGFjaEN1cnJlbnRUaHJlYWQgcGF0Y2ggZnJvbSAgMDgvMTEvMjAwNiAtIGl0IGNhdXNlcyBzZWdmYXVsdHMKICAgICAgICAgICAgb24gc29tZSBzeXN0ZW1zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW3B5dGhvbl0gRml4ICMxNTc4MzQ2IC0gUHl0aG9uIGV4Y2VwdGlvbnMgd2l0aCAtbW9kZXJuCgoxMS8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1OTMyOTEgLSBTbWFydCBwb2ludGVycyBhbmQgaW5oZXJpdGluZyBmcm9tIHRlbXBsYXRlcyAKCjExLzA5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXJlY3RvciBvcGVyYXRvciBwb2ludGVyL3JlZmVyZW5jZSBjYXN0cyAtICMxNTkyMTczLgoKMTEvMDcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgQWRkICRzZWxmIHNwZWNpYWwgdmFyaWFibGUgZm9yICVleHRlbmQgbWV0aG9kcy4gUGxlYXNlIHVzZSB0aGlzIGluc3RlYWQgb2YganVzdCAnc2VsZicKICAgICAgICAgICAgYXMgdGhlIEMrKyAndGhpcycgcG9pbnRlci4KCjExLzA3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0gCgkgICAgYWxsZWdyb2NsLnN3Zzogc3dpZy1kZWZ2YXIgdXBkYXRlZCB0byBhbGxvdyBzcGVjaWZ5aW5nIG9mCgkgICAgCQkgICBub24tZGVmYXVsdCBmb3JlaWduIHR5cGUgKHZpYSA6ZnR5cGUga2V5d29yZCBhcmcpLgoJICAgIGFsbGVncm9jbC5jeHg6IFNwZWNpZnkgcHJvcGVyIGFjY2VzcyB0eXBlIGZvciBlbnVtIHZhbHVlcy4KCjExLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhL0MjXSBGaXggY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybiB0eXBlcyBmb3IgZGlyZWN0b3JzIGFzIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE1hcmsgRG9uc2Vsem1hbm4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgRGVsZXRlTG9jYWxSZWYgZnJvbSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyBmb3Igbm93IGFzIGl0IGlzIGNhdXNpbmcgYQogICAgICAgICAgICBzZWcgZmF1bHQgd2hlbiBydW4gb24gU29sYXJpcyA4LgoKMTAvMjkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBQYXRjaCBmcm9tIENocmlzIFNob2VtYWtlciB0byBjbGVhbiB1cCBzb21lIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBJbXBvcnRhbnQgZml4IHRvIHByZXZlbnQgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHRoZSBKYXZhIHByb3h5IGNsYXNzCiAgICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgaW4gYSBuYXRpdmUgbWV0aG9kLiBUaGUgZmluYWxpemVyIGNvdWxkIGRlc3Ryb3kgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgQysrIG9iamVjdCB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZC4gVGhlIHByb2JsZW0gb2NjdXJzIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBzdHJvbmdseSByZWFjaGFibGUgYWZ0ZXIgYSBuYXRpdmUgY2FsbC4gIFRoZSBwcm9ibGVtIHNlZW1zIHRvIG9jY3VyIGluCiAgICAgICAgICAgIG1lbW9yeSBzdHJlc3Mgc2l0dWF0aW9ucyBvbiBzb21lIEpWTXMuIEl0IGRvZXMgbm90IHNlZW0gdG8gb2NjdXIgb24gdGhlCiAgICAgICAgICAgIFN1biBjbGllbnQgSlZNIHVwIHRvIGpkayAxLjUuIEhvd2V2ZXIgdGhlIDEuNiBjbGllbnQgamRrIGhhcyBhIG1vcmUgYWdncmVzc2l2ZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3RvciBhbmQgc28gdGhlIHByb2JsZW0gZG9lcyBvY2N1ci4gSXQgZG9lcyBvY2N1ciBvbiB0aGUgU3VuIHNlcnZlcgogICAgICAgICAgICBKVk1zIChjZXJ0YWlubHkgMS40IG9ud2FyZHMpLiBUaGUgZml4IGVudGFpbHMgcGFzc2luZyB0aGUgcHJveHkgY2xhc3MgaW50byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiBhZGRpdGlvbiB0byB0aGUgQysrIHBvaW50ZXIgaW4gdGhlIGxvbmcgcGFyYW1ldGVyLCBhcyBKYXZhIGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgICBjb2xsZWN0ZWQgd2hlbiB0aGV5IGFyZSBwYXNzZWQgaW50byBKTkkgbWV0aG9kcy4gVGhlIGV4dHJhIHBhcmFtZXRlciBjYW4gYmUgc3VwcHJlc3NlZAogICAgICAgICAgICBieSBzZXR0aW5nIHRoZSBub3BnY3BwIGF0dHJpYnV0ZSBpbiB0aGUganR5cGUgdHlwZW1hcCB0byAiMSIgb3IgdXNpbmcgdGhlIG5ldyAtbm9wZ2NwcAogICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICBTZWUgSmF2YS5odG1sI2phdmFfcGdjcHAgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiB0aGlzIHRvcGljLgoKMTAvMjQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggc21hcnQgcG9pbnRlciB3cmFwcGVycy4gVGhlIHZpcnR1YWwvb3ZlcnJpZGUvbmV3IGtleXdvcmQgaXMgbm90IGdlbmVyYXRlZAogICAgICAgICAgICBmb3IgZWFjaCBtZXRob2QgYXMgdGhlIHNtYXJ0IHBvaW50ZXIgY2xhc3MgZG9lcyBub3QgbWlycm9yIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIKICAgICAgICAgICAgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBTRiAjMTQ5NjUzNQoKMTAvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgbmF0aXZlIG1ldGhvZHMgJiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCiAgICAgICAgICAgIGZpeGVkIHRlc3QgY2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MgJiBjcHBfYmFzaWMuIEFkZGVkIG5ldyBleGFtcGxlIChmdW5jdG9yKS4KICAgICAgICAgICAgdGlkaWVkIHVwIGEgbGl0dGxlIG9mIHRoZSBjb2RlIChhcm91bmQgY2xhc3NIYW5kbGVyKS4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gZGlyZWN0b3JvdXQgdHlwZW1hcCBjaGFuZ2VzIHRvIGZhbGwgaW4gbGluZSB3aXRoIHRoZSBvdGhlciBkaXJlY3RvcgogICAgICAgICAgICBsYW5ndWFnZXMuICRyZXN1bHQgaXMgbm93IHVzZWQgd2hlcmUgJDEgdXNlZCB0byBiZSB1c2VkLiBQbGVhc2UgY2hhbmdlIHlvdXIgdHlwZW1hcHMKICAgICAgICAgICAgaWYgeW91IGhhdmUgYSBjdXN0b20gZGlyZWN0b3JvdXQgdHlwZW1hcC4KCjEwLzE4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNvbWUgZml4ZXMgZm9yIGFwcGx5aW5nIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzIHRvIHVuc2lnbmVkIGNoYXIgYXJyYXlzLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgaW4gY29uc3Qgc2l6ZV90JiBhbmQgY29uc3Qgc3RkOjpzaXplX3QmIHR5cGVtYXBzLgoKMTAvMTUvMjAwNjogZWZ1enp5b25lIAogICAgICAgICAgICBbQ0ZGSV0gU3VwcHJlc3MgZ2VuZXJhdGluZyBkZWZjdHlwZSBmb3IgZW51bXMsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLiBQYXRjaCAxNTYwOTgzLiAKCjEwLzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gTWlub3IgZml4IHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggdGhlIChhcyB5ZXQgdW5yZWxlYXNlZCkgY2hpY2tlbiAyLjUKCiAgICAgICAgICAgIFtHdWlsZSxDaGlja2VuXSBGaXggU0YgQnVnIDE1NzM4OTIuICBBZGRlZCBhbiBleHRfdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSB0byB0ZXN0CiAgICAgICAgICAgIHRoaXMgYnVnLCBidXQgdGhpcyB0ZXN0IGNhbiBub3QgcmVhbGx5IGJlIG1hZGUgZ2VuZXJpYyBiZWNhdXNlIHRoZSBleHRlcm5hbCBjb2RlIG11c3QKICAgICAgICAgICAgcGx1ZyBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIgZGlyZWN0bHkuCiAgICAgICAgICAgIFNlZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2NoaWNrZW4vZXh0X3Rlc3QuaSBhbmQgZXh0X3Rlc3RfZXh0ZXJuYWwuY3h4CgogICAgICAgICAgICBBZGRlZCBhICUuZXh0ZXJuYWx0ZXN0IHRvIGNvbW1vbi5taywgYW5kIGFueSBpbnRlcmVzdGVkIGxhbmd1YWdlIG1vZHVsZXMgY2FuCiAgICAgICAgICAgIGNvcHkgYW5kIHNsaWdodGx5IG1vZGlmeSBlaXRoZXIgdGhlIGNoaWNrZW4gb3IgdGhlIGd1aWxlIGV4dF90ZXN0LmkKCjEwLzE0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIE9VVFBVVCYgZm9yIGFsbCBudW1iZXIgdHlwZXMsIGFkZGVkIGEgbG9uZyBsb25nIHR5cGUKICAgICAgICAgICAgZml4ZWQgc2V2ZXJhbCB0ZXN0IGNhc2VzLgogICAgICAgICAgICB1cGRhdGU6IGNoYW5nZWQgdHlwZW1hcHMgdG8gdXNlIFNXSUdfQ29udmVydFB0ciByYXRoZXIgdGhhbiBTV0lHX011c3RHZXRQb2ludGVyCiAgICAgICAgICAgIHN0YXJ0ZWQgc3BsaXRpbmcgbHVhLnN3ZyBpbnRvIHNtYWxsZXIgcGFydHMgdG8gbWFrZSBpdCBuZWF0ZXIKCjEwLzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gTWFyZ2luYWxseSBiZXR0ZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugb25seSBpbiB0aGF0IHlvdSBjYW4KICAgICAgICAgICAgY29udHJvbCB3aGF0IHRoZSBiYXNlIGNsYXNzIGlzLiBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIG5ldyAncmVwbGFjZScgYXR0cmlidXRlIGluIHRoZSAKICAgICAgICAgICAgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXAsIGVnIGluIHRoZSBmb2xsb3dpbmcsICdNZScgd2lsbCBiZSB0aGUgYmFzZSBjbGFzcywKICAgICAgICAgICAgbm8gbWF0dGVyIHdoYXQgRm9vIGlzIHJlYWxseSBkZXJpdmVkIGZyb20gaW4gdGhlIEMrKyBsYXllci4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwcyB0byBvdmVycmlkZSB0aGUgQysrIGJhc2UuCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIGRlbGV0ZSgpIG1ldGhvZCAKICAgICAgICAgICAgKGl0IGlzIG5vdyBhIHN5bmNocm9uaXplZCBtZXRob2QsIGJ1dCBpcyBub3cgY3VzdG9taXNhYmxlIGJ5IGNoYW5naW5nIHRoZSAKICAgICAgICAgICAgbWV0aG9kbW9kaWZpZXJzIGF0dHJpYnV0ZSBpbiB0aGUgamF2YWRlc3RydWN0IG9yIGphdmFkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXApCgogICAgICAgICAgICBbQyNdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBEaXNwb3NlKCkgbWV0aG9kLCAKICAgICAgICAgICAgc2ltaWxhciB0byBKYXZhJ3MgZGVsZXRlKCkgYWJvdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIFJlbW92ZSByZWR1bmRhbnQgZGlyZWN0b3IgY29kZSBpbiAlZXh0ZW5kIG1ldGhvZHMgKCVleHRlbmQKICAgICAgICAgICAgbWV0aG9kcyBjYW5ub3QgYmUgZGlyZWN0b3IgbWV0aG9kcykKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEZpeCAjMTUwNTU5NCAtIGRpcmVjdG9yIG9iamVjdHMgbm90IHJldHVybmVkIGFzIGRpcmVjdG9yIG9iamVjdHMKICAgICAgICAgICAgaW4gJWV4dGVuZCBtZXRob2RzLgoKMTAvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMTIzODc5OCAtIERpcmVjdG9ycyB1c2luZyB1bnNpZ25lZCBsb25nIGxvbmcgb3IgYW55IG90aGVyIHR5cGUKICAgICAgICAgICAgbWFyc2hhbGxlZCBhY3Jvc3MgdGhlIEpOSSBib3VuZGFyeSB1c2luZyBhIEphdmEgY2xhc3MgKHdoZXJlIHRoZSBqbmkgdHlwZW1hcCAKICAgICAgICAgICAgY29udGFpbnMgam9iamVjdCkuCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzExNjIxOTQgLSAjaW5jbHVkZS8laW5jbHVkZSB3aXRoaW4gYSBzdHJ1Y3R1cmUKCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ1MDY2MSwgc3RyaW5nIHRydW5jYXRpb24gaW4gU3RyaW5nX3NlZWsgdHJ1bmNhdGluZyBKYXZhL0MjIGVudW1zLgoKMTAvMDYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ICMxNTY5NTg3LiBUaGUgbmFtZSBpcyBub3cgY29ycmVjdC4KCjEwLzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGZpeGVzIGZvciB2aXJ0dWFsIGNvbnZlcnNpb24gb3BlcmF0b3JzCgoxMC8wNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4ICMxNTY5NTg3IGZvciBQSFAuICBEb24ndCB1c2Ugc2l6ZW9mKCkgZXhjZXB0IHdpdGggc3RyaW5nCgkgICAgbGl0ZXJhbHMuICBDaGFuZ2Ugc29tZSAiLy8iIGNvbW1lbnRzIHRvICIvKiAqLyIgZm9yIHBvcnRhYmlsaXR5LgoKMTAvMDQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGFydGlhbCBGaXggIzE1Njk1ODcuIFRoZSB0eXBlIGlzIG5vdyBjb3JyZWN0LCBidXQgdGhlIG5hbWUgaXMgc3RpbGwgbm90IGNvcnJlY3QuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMxNTI3ODg1IC0gT3ZlcmxvYWRlZCBkaXJlY3RvciB2aXJ0dWFsIG1ldGhvZHMgc29tZXRpbWVzIHByb2R1Y2VkCiAgICAgICAgICAgIHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gdXNlZCB3aXRoIHRoZSBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZS4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yczogRGlyZWN0b3JzIGFyZSBvdXRwdXQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIAogICAgICAgICAgICB0aGUgQysrIGNsYXNzIHJhdGhlciB0aGFuIGluIHNvbWUgcHNldWRvLXJhbmRvbSBvcmRlci4KCjEwLzAzLzIwMDY6IG1tYXR1cwogICAgICAgICAgICBGaXggIzE0ODYyODEgYW5kICMxNDcxMDM5LgoKMTAvMDMvMjAwNjogb2xseQoJICAgIFtQZXJsXSBGaXggZm9yIGhhbmRsaW5nIHN0cmluZ3Mgd2l0aCB6ZXJvIGJ5dGVzIGZyb20gU3RlcGhlbiBIdXRzYWwuCgowOS8zMC8yMDA2OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIEJpdGZpZWxkIHN1cHBvcnQgYW5kIHZhcmFyZyBzdXBwb3J0IGR1ZSB0byBBcnRodXIgU215bGVzLgogICAgICAgICAgICBDIGV4cHJlc3Npb24gdG8gTGlzcCBjb252ZXJzaW9uLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcyBmb3IgdGhlIGluaXRpYWwKICAgICAgICAgICAgaWRlYSwgaXQgbm93IHN1cHBvcnRzIGNvbnZlcnNpb24gZm9yIGEgd2hvbGUgcmFuZ2Ugb2YgQyBleHByZXNzaW9ucy4gCgowOS8yOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1MDgzMjcgLSBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIGhpZGRlbiB3aGVuIHVzaW5nIC1mdmlydHVhbCBvcHRpbWlzYXRpb24uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIGNhbmRpZGF0ZXMgZm9yIGVsaW1pbmF0aW9uIC0gdGhpcyBtaW1pY3MKICAgICAgICAgICAgQysrIGJlaGF2aW91ciB3aGVyZSBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBhbmQgaW1wbGVtZW50ZWQKICAgICAgICAgICAgaW4gYSBkZXJpdmVkIGNsYXNzIGluIG9yZGVyIGZvciB0aGVtIHRvIGJlIGF2YWlsYWJsZS4KCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob24sIE9jYW1sXSBGaXggIzE1MDU1OTEgVGhyb3dpbmcgZXhjZXB0aW9ucyBpbiBleHRlbmRlZCBkaXJlY3RvcnMKCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA1NjEwMCAtIHZpcnR1YWwgb3BlcmF0b3JzLiAKCjA5LzI0LzIwMDY6IG9sbHkKCSAgICBEb24ndCBhY2NpZGVudGFsbHkgY3JlYXRlIGEgIjw6IiB0b2tlbiAod2hpY2ggaXMgdGhlIHNhbWUgYXMgIlsiIGluIEMrKykuCgkgICAgRml4ZXMgYnVnICMgMTUyMTc4OC4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBbUnVieV0gU3VwcG9ydCBidWlsZGluZyB3aXRoIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgUnVieSAxLjkKCSAgICBkZXZlbG9wbWVudCBicmFuY2guICBGaXhlcyBidWcgIzE1NjAwOTIuCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgVGVtcGxhdGVzIGNhbiBub3cgYmUgaW5zdGFudGlhdGVkIHVzaW5nIG5lZ2F0aXZlIG51bWJlcnMgYW5kCgkgICAgY29uc3RhbnQgZXhwcmVzc2lvbnMsIGUuZy46CgoJICAgIHRlbXBsYXRlPGludCBxPiBjbGFzcyB4IHt9OwoJICAgICV0ZW1wbGF0ZSh4X21pbnVzMSkgeDwtMT47CgkgICAgJXRlbXBsYXRlKHhfMXBsdXMyKSB4PDErMj47CgoJICAgIEFsc28sIGNvbnN0YW50IGV4cHJlc3Npb25zIGNhbiBub3cgaW5jbHVkZSBjb21wYXJpc29ucyAoPiwgPCwgPj0sCgkgICAgPD0sICE9LCA9PSksIG1vZHVsdXMgKCUpLCBhbmQgdGVybmFyeSBjb25kaXRpb25hbHMgKGEgPyBiIDogYykuCgoJICAgIEZpeGVzIGJ1Z3MgIzY0NjI3NSwgIzkyNTU1NSwgIzk1NjI4MiwgIzk5NDMwMS4KCjA5LzIyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIG1ldGhvZHMgLSBCdWdzICMxNTQ2MjU0LCAjMTU0MzUzMwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgY29uc3RydWN0b3JzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0cyBhbmQgYXNzZXJ0cyB3aGVuIGRpcmVjdG9yIG1ldGhvZHMgYXJlIGlnbm9yZWQgKCMxNTQzNTMzKQoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IG91dCBvZiBzb3VyY2UgYnVpbGRzIC0gYnVnICMxNTQ0NzE4CgowOS8yMC8yMDA2OiBvbGx5CgkgICAgVHJlYXQgYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbiBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gcmF0aGVyCgkgICAgdGhhbiBpZ25vcmluZyBpdCBjb21wbGV0ZWx5LCBzbyB0aGF0IHdlIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IKCSAgICBwYXNzaW5nIG9wYXF1ZSBwb2ludGVycyB0byB0aGUgbmVzdGVkIGNsYXNzIChmaXhlcyBTRiBidWcgIzkwOTM4NykuCgowOS8yMC8yMDA2OiBvbGx5CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIFtwaHBdIE92ZXJsb2FkIHJlc29sdXRpb24gbm93IHdvcmtzLiAgSG93ZXZlciB0byBhbGxvdyB0aGlzLCBTV0lHCgkgICAgZ2VuZXJhdGVkIHdyYXBwZXJzIG5vIGxvbmdlciBjb2VyY2UgUEhQIHR5cGVzICh3aGljaCByZXZlcnRzIGEgY2hhbmdlCgkgICAgbWFkZSBpbiAxLjMuMjYpLiAgU28gZm9yIGV4YW1wbGUsIGlmIGEgbWV0aG9kIHRha2VzIGEgc3RyaW5nLCB5b3UKCSAgICBjYW4gbm8gbG9uZ2VyIHBhc3MgYSBudW1iZXIgd2l0aG91dCBleHBsaWNpdGx5IGNvbnZlcnRpbmcgaXQgdG8gYQoJICAgIHN0cmluZyBpbiBQSFAgdXNpbmc6IChzdHJpbmcpeAoKMDkvMTgvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gZml4IG9uIHN3aWdpbml0LnN3ZywgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gY3Jhc2ggb24gc2V2ZXJhbCB0ZXN0IGNhc2VzCgkgICAgZm91bmQgYW5kIGZpeGVkIHByb2JsZW0gaW4gaW1wb3J0cyB1bmRlciBweXRob24gKG1pbmd3KQoKMDkvMTYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggZnJvbSBNaWNoYWwgTWFyZWsgZm9yIFB5dGhvbiAyLjUgdG8gZml4IDY0IGJpdCBhcnJheSBpbmRleGVzIG9uCiAgICAgICAgICAgIDY0IGJpdCBtYWNoaW5lcy4KCjA5LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBoYXMgYmVlbiBzY3JhcHBlZC4gVGhpcyBmZWF0dXJlIHdhcyBpbnRyb2R1Y2VkIHByaW1hcmlseQogICAgICAgICAgICB0byBzb2x2ZSByZWN1cnNpdmUgZGlyZWN0b3IgbWV0aG9kIGNhbGxzLiBEaXJlY3RvciB1cGNhbGwgaW1wcm92ZW1lbnRzIG1hZGUgaW5zdGVhZDoKCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBUaGUgc3dpZ191cCBmbGFnIGlzIG5vIGxvbmdlciB1c2VkLiBUaGUgcmVxdWlyZWQgbXV0ZXhlcwogICAgICAgICAgICB3cmFwcGluZyB0aGlzIGZsYWcgYXJlIGFsc28gbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIHJlY3Vyc2l2ZSBjYWxscyBnb2luZyBmcm9tIEMrKwogICAgICAgICAgICB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBiYWNrIGFnYWluIGV0YyBhcmUgbm93IGF2b2lkZWQgYnkgYSBzdWJ0bGVseSBkaWZmZXJlbnQKICAgICAgICAgICAgYXBwcm9hY2guIEluc3RlYWQgb2YgdXNpbmcgdGhlIHN3aWdfdXAgZmxhZyBpbiBlYWNoIGRpcmVjdG9yIG1ldGhvZCB0byBpbmRpY2F0ZQogICAgICAgICAgICB3aGV0aGVyIHRoZSBleHBsaWNpdCBDKysgY2FsbCB0byB0aGUgYXBwcm9wcmlhdGUgYmFzZSBjbGFzcyBtZXRob2Qgb3IgYSBub3JtYWwKICAgICAgICAgICAgcG9seW1vcnBoaWMgQysrIGNhbGwgc2hvdWxkIGJlIG1hZGUsIHRoZSBuZXcgYXBwcm9hY2ggbWFrZXMgb25lIG9mIHRoZXNlIGNhbGxzCiAgICAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIHdyYXBwZXIgbWV0aG9kLgoKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgcmVjdXJzaXZlIGNhbGwgcHJvYmxlbSB3aGVuIGNhbGxpbmcgYSBDKysgYmFzZSBjbGFzcyBtZXRob2QgZnJvbQogICAgICAgICAgICBKYXZhL0MjIGlzIG5vdyBmaXhlZC4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGFzIHRoZSBkZXRlY3Rpb24gYXMgdG8gd2hldGhlciB0aGUgZXhwbGljaXQgY2FsbCBvciBhIG5vcm1hbCBwb2x5bW9ycGhpYyBjYWxsIGlzIG1hZGUKICAgICAgICAgICAgaW4gdGhlIEphdmEvQyMgbGF5ZXIgcmF0aGVyIHRoYW4gaW4gdGhlIEMrKyBsYXllci4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIHVwZGF0ZWQgc3dpZ2luaXQuc3dnIHRvIGFsbG93IG11bHRpcGxlIGludGVycHJldGVycyB0byB1c2UgbXVsdGlwbGUKCSAgICBzd2lnIG1vZHVsZXMgYXQgb25jZS4gVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgaW4gTHVhIChtaW5ndyAmIGxpbnV4KSwKCSAgICBwZXJsNSAmIHB5dGhvbiAobGludXgpIG9ubHkuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBwYXNzaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIHdlbGwgYXMgbmF0aXZlIGx1YSBvYmplY3QKICAgICAgICAgICAgaW50byB3cmFwcGVyZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIEFkZGVkIGV4YW1wbGUgZnVuY3B0cjMgdG8gZGVtb25zdHJhdGUgdGhpcyBmZWF0dXJlCgowOS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVuYW1lIEVycm9yQ29kZSBhbmQgRXJyb3JNc2cgI2RlZmluZS1zIHRvIFNXSUdfRXJyb3JDb2RlCgkgICAgYW5kIFNXSUdfRXJyb3JNc2cgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIGNvZGUgdGhlIHVzZXIgbWlnaHQgYmUKCSAgICB3cmFwcGluZyAocGF0Y2ggZnJvbSBEYXJyZW4gV2FybmVyIGluIFNGIGJ1ZyAjMTQ2NjA4NikuICBBbnkKCSAgICB1c2VyIHR5cGVtYXBzIHdoaWNoIHVzZSBFcnJvckNvZGUgYW5kL29yIEVycm9yTXNnIGRpcmVjdGx5IHdpbGwKCSAgICBuZWVkIGFkanVzdGluZyAtIHlvdSBjYW4gZWFzaWx5IGZpeCB0aGVtIHRvIHdvcmsgd2l0aCBib3RoIG9sZAoJICAgIGFuZCBuZXcgU1dJRyBieSBjaGFuZ2luZyB0byB1c2UgU1dJR19FcnJvck1zZyBhbmQgYWRkaW5nOgoKCQkjaWZuZGVmIFNXSUdfRXJyb3JNc2cKCQkjZGVmaW5lIFNXSUdfRXJyb3JNc2coKSBFcnJvck1zZygpCgkJI2VuZGlmCgowOC8yOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gTW92ZSBjb25zdGFudCBpbml0aWFsaXNhdGlvbiBmcm9tIFJJTklUIHRvIE1JTklUIHRvIGZpeCBhCgkgICAgd2FybmluZyB3aGVuIHVzaW5nIEFwYWNoZSBhbmQgbW9kX3BocC4gIFdlIG9ubHkgbmVlZCB0byBjcmVhdGUKCSAgICBQSFAgY29uc3RhbnRzIG9uY2Ugd2hlbiB3ZSdyZSBmaXJzdCBpbml0aWFsaXNlZCwgbm90IGZvciBldmVyeSBIVFRQCgkgICAgcmVxdWVzdC4KCjA4LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTQyNDY2IGFkZGVkIGNvZGUgdG8gYWxsb3cgbWFwcGluZyBMdWEgbmlsJ3MgPC0+IEMvQysrIE5VTEwncwoJICAgIHVwZGF0ZWQgdmFyaW91cyB0eXBlbWFwcyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBjaGFuZ2VzCgkgICAgYWRkZWQgdm9pZHRlc3RfcnVubWUubHVhIHRvIHNob3cgdGhlIGZlYXR1cmVzIHdvcmtpbmcKCjA4LzE5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gQWRkIGZlYXR1cmU6Y29uc3Rhc3ZhciB0byBleHBvcnQgY29uc3RhbnRzIGFzIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUuCgowOC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGV0YWNoQ3VycmVudFRocmVhZCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCBuYXRpdmVseSBjcmVhdGVkIHRocmVhZHMKICAgICAgICAgICAgbm8gbG9uZ2VyIHByZXZlbnQgdGhlIEpWTSBmcm9tIGV4aXRpbmcuIEJ1ZyByZXBvcnRlZCBieSBUaG9tYXMgRHVkemlhayBhbmQKICAgICAgICAgICAgUGF1bCBOb2xsLgoKMDgvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMgc28gdGhleSB3b3JrCgowNy8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbW9yZSBhZGRpdGlvbnMgdG8gc3RkOjpzdHJpbmcsIHNvbWUgdHdlYWtzIGFuZCBzbWFsbCBidWcgZml4ZXMKCSAgICAtbm9jd3JhcCBtb2RlLgoKMDcvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1MjYwMjIgcGRhdGVkIHN0ZDo6c3RyaW5nIHRvIHN1cHBvcnQgc3RyaW5ncyB3aXRoICdcMCcgaW5zaWRlIHRoZW0KCSAgICB1cGRhdGVkIHR5cGVtYXBzLmkgdG8gYWRkIHN1cHBvcnQgZm9yIHBvaW50ZXIgdG8gcG9pbnRlcnMKCjA3LzE5LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEFkZCBzdGRfc3RyaW5nLmkgc3VwcG9ydC4KCSAgICAtIEFkZCBuZXdvYmplY3QgcGF0Y2ggc3VibWl0dGVkIGJ5IG1rb2VwcGUgKHRoYW5rcyEpCgkgICAgLSBGaXggdHlwZSBuYW1lIG1pc21hdGNoIGlzc3VlIGZvciBuZXN0ZWQgdHlwZSBkZWZpbml0aW9ucy4KCSAgICAgIHNwZWNpZmljYWxseSB0eXBlZGVmcyBpbiB0ZW1wbGF0ZWQgY2xhc3MgZGVmbnMuCgowNy8xOC8yMDA2OiBtZ29zc2FnZQoJICAgIEJ1Z2ZpeCAjMTUyMjg1OAoJICAgIHVwZGF0ZWQgbHVhLmN4eCB0byBzdXBwb3J0IC1leHRlcm5hbC1ydW50aW1lIGNvbW1hbmQKCjA3LzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEluY3JlbWVudCB0aGUgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gMywgYmVjYXVzZSBvZiB0aGUKCSAgICBhZGRpdGlvbiBvZiB0aGUgb3duZGF0YSBtZW1iZXIgaW4gc3dpZ190eXBlX2luZm8uCgkgICAgUmVwb3J0ZWQgYnk6IFByYWJodSBSYW1hY2hhbmRyYW4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlYXJjaCBwYXRoIGZpeGVzOgogICAgICAgICAgICAtIEZpeCBzZWFyY2ggcGF0aCBmb3IgbGlicmFyeSBmaWxlcyB0byBiZWhhdmUgYXMgZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwuCiAgICAgICAgICAgIC0gRml4IG1pbmd3L21zeXMgYnVpbGRzIHdoaWNoIGRpZCBub3QgZmluZCB0aGUgU1dJRyBsaWJyYXJ5IHdoZW4gaW5zdGFsbGVkLgogICAgICAgICAgICAtIFdpbmRvd3MgYnVpbGRzIGFsc28gb3V0cHV0IHRoZSBtaW5ndy9tc3lzIGluc3RhbGwgbG9jYXRpb24gd2hlbiBydW5uaW5nCiAgICAgICAgICAgICAgc3dpZyAtc3dpZ2xpYi4KICAgICAgICAgICAgLSBUaGUgbm9uLWV4aXN0ZW50IGFuZCB1bmRvY3VtZW50ZWQgY29uZmlnIGRpcmVjdG9yeSBpbiB0aGUgc2VhcmNoIHBhdGggaGFzCiAgICAgICAgICAgICAgYmVlbiByZW1vdmVkLgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRzeW1uYW1lIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uLgoKMDcvMDQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgQWRkICVmZWF0dXJlKCJjb25zdGFzdmFyIiksIHdoaWNoIGluc3RlYWQgb2YgZXhwb3J0aW5nIGEgY29uc3RhbnQgYXMgYQoJICAgIHNjaGVtZSBmdW5jdGlvbiwgZXhwb3J0cyB0aGUgY29uc3RhbnQgYXMgYSBzY2hlbWUgdmFyaWFibGUuICBVcGRhdGUgdGhlCgkgICAgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsLgoKMDcvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1NlZSBlbnRyeSBvZiAwOS8xMy8yMDA2IC0gZXhwbGljaXRjYWxsIGZlYXR1cmUgYW5kIGRvY3VtZW50YXRpb24gdG8gaXQgcmVtb3ZlZF0KICAgICAgICAgICAgTmV3IGV4cGxpY2l0Y2FsbCBmZWF0dXJlIHdoaWNoIGdlbmVyYXRlcyBhZGRpdGlvbmFsIHdyYXBwZXJzIGZvciB2aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgdGhhdCBjYWxsIHRoZSBtZXRob2QgZXhwbGljaXRseSwgbm90IHJlbHlpbmcgb24gcG9seW1vcnBoaXNtIHRvIG1ha2UgdGhlIG1ldGhvZAogICAgICAgICAgICBjYWxsLiBUaGUgZmVhdHVyZSBpcyBhIGZlYXR1cmUgZmxhZyBhbmQgaXMgZW5hYmxlZCBsaWtlIGFueSBvdGhlciBmZWF0dXJlIGZsYWcuCiAgICAgICAgICAgIEl0IGFsc28gcmVjb2duaXNlcyBhbiBhdHRyaWJ1dGUsICJzdWZmaXgiIGZvciBtYW5nbGluZyB0aGUgZmVhdHVyZSBuYW1lLCBzZWUKICAgICAgICAgICAgU1dJR1BsdXMuaHRtbCNTV0lHUGx1c19leHBsaWNpdGNhbGwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaXMgYWxzbyBhIHdvcmthcm91bmQgZm9yIHNvbHZpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxscwogICAgICAgICAgICBwcm9ibGVtIHdoZW4gYSBkaXJlY3RvciBtZXRob2QgbWFrZXMgYSBjYWxsIHRvIGEgYmFzZSBjbGFzcyBtZXRob2QuIFNlZQogICAgICAgICAgICBKYXZhLmh0bWwjamF2YV9kaXJlY3RvcnNfZXhwbGljaXRjYWxsIGZvciB1cGRhdGVkIGRvY3VtZW50YXRpb24uCgowNi8yOC8yMDA2OiBqb2UgKEpvc2VwaCBXYW5nKQoJICAgIFtyXSBJbml0aWFsIHN1cHBvcnQgZm9yIFIKCjA2LzIwLzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQogICAgICAgICAgICBNaW5vciBmaXhlcyB0byBnZXQgYXBwbHlfc3RyaW5ncy5pIHRlc3RzdWl0ZSB0byBwYXNzCgkgICAgUmVtb3ZlIGludGVnZXJzX3J1bm1lLnNjbSBmcm9tIHRoZSB0ZXN0c3VpdGUsIGJlY2F1c2UgU1dJRyBhbmQgQ2hpY2tlbiBkb2VzCiAgICAgICAgICAgIGhhbmRsZSBvdmVyZmxvd3MuCgowNi8xOS8yMDA1OiBvbGx5CgkgICAgW3BocF0gQWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgUEhQNSBjbGFzcyB3cmFwcGVycyBmb3IgQysrCgkgICAgY2xhc3NlcyAodXNlICJzd2lnIC1waHA1IikuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gQWRkZWQgc29tZSBtaXNzaW5nIGtleXdvcmRzIHRvIHRoZSBQSFA0IGtleXdvcmQgbGlzdCwgYW5kCgkgICAgZml4ZWQgX19MSU5FX18gYW5kIF9fRklMRV9fIHdoaWNoIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5LgoJICAgIEFsc28gYWRkZWQgYWxsIHRoZSBrZXl3b3JkcyBuZXcgaW4gUEhQNSwgYW5kIGFkZGVkIGNvbW1lbnRzCgkgICAgbm90aW5nIHRoZSBQSFA0IGtleXdvcmRzIHdoaWNoIGFyZW4ndCBrZXl3b3JkcyBpbiBQSFA1LgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCBhcyB0aGlzIHBvaW50ZXIgKGUuZy4KCSAgICBDbGFzc19tZXRob2QoTnVsbCkpIC0gZ2l2ZSBhIFBIUCBFcnJvciBpbnN0ZWFkLgoKMDYvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXIgY2xhc3MuCgkgICAgRml4IGEgZmV3IGJ1Z3MgaW4gaGVscGVyIGZ1bmN0aW9ucy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZXBsYWNlIEpOSUVYUE9SVCB3aXRoIFNXSUdFWFBPUlQsIHRoZXJlYnkgZW5hYmxpbmcgdGhlIHBvc3NpYmlsaXR5CiAgICAgICAgICAgIG9mIHVzaW5nIGdjYyAtZnZpc2liaWxpdHk9aGlkZGVuIGZvciBwb3RlbnRpYWxseSBzbWFsbGVyIGZhc3RlciBsb2FkaW5nIHdyYXBwZXJzLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBNYWtlZmlsZXMgZm9yIGF1dG9jb25mLTIuNjAgYmV0YQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVmxhZGltaXIgTWVuc2hha292IHBhdGNoIGZvciBjb21waWxpbmcgd3JhcHBlcnMgd2l0aCBweXRob24tMi41IGFscGhhLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZmZlciBvdmVyZmxvdyBlcnJvciB3aGVuIHVzaW5nIGxhcmdlICVmZWF0dXJlKGRvY3N0cmluZykgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgSm9zZXBoIFdpbnN0b24uCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gT3BlcmF0b3Igb3ZlcmxvYWQgZml4IGZyb20gRGFuaWVsIE1vb3JlLgoKMDUvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gZ2VuZXJhdGlvbiBvZiBDTE9TIHR5cGUgZGVjbGFyYXRpb25zIGZvciB1bmlvbnMKCSAgICBhbmQgZXF1aXZhbGVudCB0eXBlcy4KCjA1LzI0LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBEb24ndCByZXF1aXJlIGEgZnVsbCBjbGFzcyBkZWZpbml0aW9uIHRvIGdlbmVyYXRlIGEgQ0xPUyB3cmFwcGVyLgoKMDUvMjAvMjAwNjogb2xseQoJICAgIFtwaHBdIEdDQyBWaXNpYmlsaXR5IHN1cHBvcnQgbm93IHdvcmtzIHdpdGggUEhQLgoKMDUvMTkvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbW92ZWQgc3VwcG9ydCBmb3IgLWRsbmFtZSAodXNlIC1tb2R1bGUgaW5zdGVhZCkuICBGaXhlZAoJICAgIG5hbWluZyBvZiBQSFAgZXh0ZW5zaW9uIG1vZHVsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggUEhQCgkgICAgY29udmVudGlvbnMgKG5vICJwaHBfIiBwcmVmaXggb24gVW5peDsgb24gUEhQID49IDQuMy4wLCBoYW5kbGUgVW5peAoJICAgIHBsYXRmb3JtcyB3aGljaCB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIi5zbyIgYXMgdGhlIGV4dGVuc2lvbi4pCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQKCjA1LzA3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgd2hlcmUgYSBDKysgcmVmZXJlbmNlCgkgICAgaXMgd2FudGVkLgoKMDUvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCB3cmFwcGVycyBnZW5lcmF0ZWQgZm9yIGdsb2JhbCAnY2hhcicgdmFyaWFibGVzIHRvIG5vdAoJICAgIGluY2x1ZGUgYSB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUgaW4gdGhlIFBIUCBzdHJpbmcuCgowNS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgdHlwZW1hcHMgc28gdGhhdCBjaGFyICogY2FuIGJlIGFwcGxpZWQgdG8gdW5zaWduZWQgY2hhciAqIG9yIHNpZ25lZCBjaGFyICoKICAgICAgICAgICAgdHlwZXMgYW5kIHZpc2EgdmVyc2EuCgowNS8wMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV1UaGFua3MgdG8gTHVrZSBKIENyb29rIGZvciB0aGlzIGlkZWEuCiAgICAgICAgICAgICAtIGEgc3RydWN0L2VudW0vdW5pb24gaXMgcmVwbGFjZWQgd2l0aCA6cG9pbnRlciBvbmx5IGlmCiAgICAgICAgICAgICAgIHRoYXQgc2xvdCBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhhdCB0eXBlLiBTbyw6IAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhX3N0cnVjdCB7IGludCB4OyB9IGFuZAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiX3N0cnVjdCB7IGFfc3RydWN0IHN0cnVjdF8xOyB9OyAKICAgICAgICAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgYXM6CiAgICAgICAgICAgICAgICAgICAoY2ZmaTpkZWZjc3RydWN0IGJfc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3RfMSBhX3N0cnVjdCkpCiAgICAgICAgICAgICAtIE90aGVyIG1pbm9yIGZpeGVzIGluIGxpc3BpZnlpbmcgbmFtZXMuCgowNS8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcG9zc2libGUgcmVkZWZpbml0aW9uIG9mIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSBmb3IgVkMrKy4KCjA0LzE0LzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQogICAgICAgICAgICBUaGFua3MgdG8gVGhvbWFzIFdlaWRuZXIgZm9yIHRoZSBwYXRjaC4KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgZXhwb3J0IGlzIHNldCAoZXhwb3J0ICdmb28pIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBmb3IgZXZlcnkgc3ltYm9sCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGlubGluZSBpcyBzZXQgKGRlY2xhaW0gKGlubGluZSBmb28pKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW50ZXJuX2Z1bmN0aW9uIGlzIHNldCAKICAgICAgICAgICAgICAjLih2YWx1ZS1vZi1pbnRlcm4tZnVuY3Rpb24gIm5hbWUiICJub2RlVHlwZSIgcGFja2FnZSkKICAgICAgICAgICAgICBpcyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlIHBsYWluIHN5bWJvbC4gQSBzYW1wbGUgc3dpZy1saXNwaWZ5IAogICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgogICAgICAgICAgICAtIGV2ZXJ5IHN5bWJvbCBpcyBwcmVmaXhlZCBieSBpdCdzIHBhY2thZ2UuCgowNC8xMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KCSAgICBGaXhlZCB0aGUgZ2VuZXJhdGlvbiBvZiB3cmFwcGVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gCiAgICAgICAgICAgIEFkZGVkIHRoZSBvcHRpb24gW25vXXN3aWctbGlzcCB3aGljaCB0dXJucyBvbi9vZmYgZ2VuZXJhdGlvbiAKICAgICAgICAgICAgb2YgY29kZSBmb3Igc3dpZyBoZWxwZXIgbGlzcCBtYWNybywgZnVuY3Rpb25zLCBldGMuCgpWZXJzaW9uIDEuMy4yOSAoTWFyY2ggMjEsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggb3V0cHV0IHR5cGVtYXAgb2YgY2hhciBzbyBpdCBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbnN0ZWFkCgkgICAgb2YgYW4gaW50ZWdlci4gQWxzbyBhZGRzIGlucHV0L291dHB1dCB0eXBlbWFwcyBmb3IgJ2NoYXIgKicuCgoJICAgIGFkZCBjb21tYW5kLWxpbmUgYXJndW1lbnQgLWlzb2xhdGUgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlCgkgICAgZmlsZSB0aGF0IHdvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIFNXSUcgZ2VuZXJhdGVkIGZpbGVzIHRoYXQKCSAgICBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KCjAzLzIwLzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBNb3JlIHR3ZWFrcyB0byBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgoJICAgIEZpeCBjb25zdGFudFdyYXBwZXIgZm9yIGNoYXIgYW5kIHN0cmluZyBsaXRlcmFscy4KCgkgICAgZmluZC1kZWZpbml0aW9uIGtleWJpbmRpbmdzIHNob3VsZCB3b3JrIGluIEVMSS9TTElNRS4KCSAgICBPdXRwdXQgKGluLXBhY2thZ2UgPG1vZHVsZS1uYW1lPikgdG8gbGlzcCB3cmFwcGVyCgkgICAgaW5zdGVhZCBvZiAoaW4tcGFja2FnZSAjLipzd2lnLW1vZHVsZS1uYW1lKikuCgoJICAgIHNsaWdodCByZXdvcmsgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KCgkgICAgZG9jIHVwZGF0ZXMuCgowMy8xNy8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbWFuZ2xlIG5hbWVzIG9mIGNvbnN0YW50cyBnZW5lcmF0ZWQgdmlhIGNvbnN0YW50V3JhcHBlci4KCSAgICAKCSAgICBXaGVuIHVzaW5nIE9VVFBVVCB0eXBlbWFwcyBhbmQgdGhlIGZ1bmN0aW9uIGhhcyBhIG5vbi12b2lkCgkgICAgcmV0dXJuIHZhbHVlLCBpdCBzaG91bGQgYmUgZmlyc3QgaW4gdGhlIHZhbHVlcy1saXN0LCBmb2xsb3dlZAoJICAgIGJ5IHRoZSBPVVRQVVQgbWFwcGVkIHZhbHVlcy4KCgkgICAgRml4IGJ1ZyB3aXRoIGJvb2xlYW4gcGFyYW1ldGVycywgd2hpY2ggbmVlZGVkIHRvIGJlCgkgICAgcGFzc2VkIGluIGFzIGludCB2YWx1ZXMsIHJhdGhlciB0aGFuIFQgb3IgTklMLgoKMDMvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEdlbmVyYXRlIHdyYXBwZXJzIGZvciBjb25zdGFudHMgd2hlbiBpbiBDKysgb3IgLWN3cmFwIG1vZGUuCgkgICAgTWFrZSAtY3dyYXAgdGhlIGRlZmF1bHQsIHNpbmNlIGl0IGlzIG1vc3QgY29ycmVjdC4gVXNlcnMKCSAgICBjYW4gdXNlIHRoZSAtbm9jd3JhcCBvcHRpb24gdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGEgLmN4eAoJICAgIGZpbGUgd2hlbiBpbnRlcmZhY2luZyB0byBDIGNvZGUuCgoJICAgIFdoZW4gaW4gLW5vY3dyYXAgbW9kZSwgaW1wcm92ZSB0aGUgaGFuZGxpbmcgb2YgY29udmVydGluZwogCSAgICBpbmZpeCBsaXRlcmFscyB0byBwcmVmaXggbm90YXRpb24gZm9yIGxpc3AuIFRoaXMgaXMgdmVyeQoJICAgIGJhc2ljIGFuZCBub3QgbGlrZWx5IHRvIGJlIGltcHJvdmVkIHVwb24gc2luY2UgdGhpcyBvbmx5CgkgICAgYXBwbGllcyB0byB0aGUgLW5vY3dyYXAgY2FzZS4gTGl0ZXJhbHMgd2UgY2FuJ3QgZmlndXJlIG91dAoJICAgIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZyBhbmQgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAoJICAgIGNvZGUuCgoJICAgIHZhbGlkSWRlbnRpZmllciBub3cgbW9yZSBjbG9zZWx5IGFwcHJveGltYXRlcyB3aGF0IG1heSBiZQoJICAgIGEgbGVnYWwgY29tbW9uIGxpc3Agc3ltYm9sLgoKCSAgICBGaXggdHlwZW1hcCBlcnJvciBpbiBhbGxlZ3JvY2wuc3dnCgkgICAgCjAzLzEyLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggdXAgSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoJICAgIEdlbmVyYXRlIGMrKyBzdHlsZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3Igc3RydWN0L3VuaW9uIG1lbWJlcnMKCSAgICB3aGVuIC1jd3JhcCBvcHRpb24gc3BlY2lmaWVkLgoKMDMvMTAvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gQyB3cmFwcGVyIGdlbmVyYXRpb24gaW50cm9kdWNlZCBieSBsYXN0IGFsbGVncm9jbAoJICAgIGNvbW1pdC4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBDb21taXQgIzE0NDczMzcgLSBEZWxldGUgTG9jYWxSZWZzIGF0IHRoZSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyB0byBmaXggcG90ZW50aWFsIGxlYWsKCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ0NDk0OSAtIGNvbmZpZ3VyZSBkb2VzIG5vdCBob25vciAtLXByb2dyYW0tcHJlZml4LgogICAgICAgICAgICBSZW1vdmVkIG5vbi1zdGFuZGFyZCBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeC4gRml4IHRoZSBhdXRvY29uZiBzdGFuZGFyZAogICAgICAgICAgICBvcHRpb25zIC0tcHJvZ3JhbS1wcmVmaXggYW5kIC0tcHJvZ3JhbS1zdWZmaXggd2hpY2ggd2VyZSBiZWluZyBzaG93biBpbiB0aGUgaGVscCwKICAgICAgICAgICAgYnV0IHdlcmUgYmVpbmcgaWdub3JlZC4gVXNlIC0tcHJvZ3JhbS1zdWZmaXggaW5zdGVhZCBvZiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggbm93LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIEZpeCAjMTQ0NjMxOSB3aXRoIHBhdGNoIGZyb20gYW5kcmVhc3RoIC0gbW9yZSB0aGFuIG9uZSB3c3RyaW5nIHBhcmFtZXRlciBpbiBkaXJlY3RvciBtZXRob2RzCgowMy8wNy8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSAKCSAgICBGaXggZm9yIG1vZHVsZSBuYW1lcyBjb250YWluaW5nIGEgIi0iIGluIG5vbi0ic2hhZG93IiBtb2RlLgoJICAgIFBhdGNoIGZyb20gQWFyb24gVmFuRGV2ZW5kZXIgKCMxNDQxNDc0KS4KCjAzLzA0LzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIC1PIHRvIHRoZSBtYWluIHByb2dyYW0sIHdoaWNoIG5vdyBlbmFibGVzIC1mYXN0ZGlzcGF0Y2gKCSAgICAKCSAgICBbUHl0aG9uXQoKCSAgICAtIEFkZCB0aGUgLWZhc3Rpbml0IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIF9faW5pdF9fCiAgICAgICAgICAgICAgbWV0aG9kcy4gU2V0dGluZyAndGhpcycgYXMgJ3NlbGYudGhpcy5hcHBlbmQodGhpcyknIGluIHRoZSBweXRob24KCSAgICAgIGNvZGUgY29uZnVzZXMgUHlMdWNlbmUuIE5vdyB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKCSAgICAgIHRoZSBDKysgc2lkZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBhbmQgUm9iaW4uCgoJICAgIC0gQWRkIHRoZSAtZmFzdHF1ZXJ5IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIFNXSUdfVHlwZVF1ZXJ5IHZpYSBhCiAgICAgICAgICAgICAgcHl0aG9uIGRpY3QgY2FjaGUsIGFzIHByb3Bvc2VkIGJ5IEFuZGkgVmFqZGEKCgkgICAgLSBBdm9pZCB0byBjYWxsIFB5T2JqZWN0X0dldEF0dHIgaW5zaWRlIFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzLAoJICAgICAgc2luY2UgdGhpcyBjb25mdXNlcyBQeUx1Y2VuZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBWYWpkYS4KCSAgICAKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIFJlbW92ZWQgZXh0cmEgKHZvaWQgKikgY2FzdCB3aGVuIGNhc3RpbmcgcG9pbnRlcnMgdG8gYW5kIGZyb20gamxvbmcgYXMgdGhpcwogICAgICAgICAgICB3YXMgc3VwcHJlc3NpbmcgZ2NjJ3MgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZy4gVGhpcyB3YXJuaW5nIGNvdWxkIGJlIGlnbm9yZWQgaW4gdmVyc2lvbnMgb2YgZ2NjIHByaW9yIHRvIDQuMCwgYnV0IG5vdyB0aGUKICAgICAgICAgICAgd2FybmluZyBpcyB1c2VmdWwgYXMgZ2NjIC1PMiBhbmQgaGlnaGVyIG9wdGltaXNhdGlvbiBsZXZlbHMgaW5jbHVkZXMgLWZzdHJpY3QtYWxpYXNpbmcgd2hpY2gKICAgICAgICAgICAgZ2VuZXJhdGVzIGNvZGUgdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGVzZSBjYXN0cy4gVGhlIGFzc2lnbm1lbnQgaXMgc2ltcGx5IG5ldmVyIG1hZGUuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgLWZuby1zdHJpY3QtYWxpYXNpbmcgdG8gYm90aCBzdXBwcmVzcyB0aGUgd2FybmluZyBhbmQgZml4IHRoZSBiYWQgYXNzZW1ibHkKICAgICAgICAgICAgY29kZSBnZW5lcmF0ZWQuIE5vdGUgdGhhdCB0aGUgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUgQyBjb21waWxlciwgYnV0IG5vdAogICAgICAgICAgICB0aGUgQysrIGNvbXBpbGVyLCB5ZXQgdGhlIEMrKyBjb21waWxlciB3aWxsIGFsc28gZ2VuZXJhdGUgYnJva2VuIGNvZGUuIEFsdGVybmF0aXZlbHkgdXNlIAogICAgICAgICAgICAtV25vLXN0cmljdC1hbGlhc2luZyB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBmb3IgZ2NjLTMueC4gVGhlIHR5cGVtYXBzIGFmZmVjdGVkCiAgICAgICAgICAgIGFyZSB0aGUgImluIiBhbmQgIm91dCIgdHlwZW1hcHMgaW4gamF2YS5zd2cgYW5kIGFycmF5c19qYXZhLnN3Zy4gVXNlcnMgb3VnaHQgdG8gZml4CiAgICAgICAgICAgIHRoZWlyIG93biB0eXBlbWFwcyB0byBkbyB0aGUgc2FtZS4gTm90ZSB0aGF0IHJlbW92YWwgb2YgdGhlIHZvaWQgKiBjYXN0IHNpbXBseSBwcmV2ZW50cwogICAgICAgICAgICBzdXBwcmVzc2lvbiBvZiB0aGUgd2FybmluZyBmb3IgdGhlIEMgY29tcGlsZXIgYW5kIG5vdGhpbmcgZWxzZS4gVHlwaWNhbCBjaGFuZ2U6CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpKHZvaWQgKikmJGlucHV0OyAlfQogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSYkaW5wdXQ7ICV9CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkodm9pZCAqKSYkcmVzdWx0ID0gJDE7ICV9IAogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpJiRyZXN1bHQgPSAkMTsgJX0gCgowMy8wMi8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dCgkgICAgQWRkIHR5cGVtYXBzIGZvciAibG9uZyBsb25nIjsgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIGhvd2V2ZXIsIGRlcGVuZHMKCSAgICBvbiB0aGUgdmVyc2lvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBHdWlsZS4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGlubmVyIGV4Y2VwdGlvbnMuIElmIGFueSBvZiB0aGUgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2hpY2ggY29uc3RydWN0CiAgICAgICAgICAgIGEgcGVuZGluZyBleGNlcHRpb24gYW5kIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGV4Y2VwdGlvbiwgaXQgd2lsbCBjcmVhdGUgdGhlIG5ldwogICAgICAgICAgICBleGNlcHRpb24gd2l0aCB0aGUgcGVuZGluZyBleGNlcHRpb24gYXMgYW4gaW5uZXIgZXhjZXB0aW9uLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgUGhwNSBleGNlcHRpb25zIGlmIGNvbXBpbGluZyBhZ2FpbnN0IFBocDUgKHBhdGNoIGZyb20gT2xseSBCZXR0cykuCgowMy8wMS8yMDA2OiBtbWF0dXMKCSAgICBVc2UgdGhlIEdDQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiBTV0lHRVhQT1JULgoKCSAgICBOb3cgeW91IGNhbiBjb21waWxlICh3aXRoIGdjYyAzLjQgb3IgbGF0ZXIpIHVzaW5nCgkgICAgQ0ZMQUdTPSItZnZpc2liaWxpdHk9aGlkZGVuIi4KCSAgICAKCSAgICBDaGVjayB0aGUgZGlmZmVyZW5jZSBmb3IgdGhlICdzdGRfY29udGFpbmVycy5pJyBweXRob24gCgkgICAgdGVzdCBjYXNlOgogCiAgICAgICAgICAgIFNpemVzOgoKCSAgICAgIDMzMDU0MzIgX3N0ZF9jb250YWluZXJzLnNvCgkgICAgICAyMzgzOTkyIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgRXhwb3J0ZWQgc3ltYm9scyAobm0gLUQgPGZpbGU+LnNvIHwgd2MgLWwpOgoKICAgICAgICAgICAgICA2MTQ2IF9zdGRfY29udGFpbmVycy5zbyAKICAgICAgICAgICAgICAxNzQgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4gCgoJICAgIEV4ZWN1dGlvbiB0aW1lczoKCgkgICAgICByZWFsIDBtMC4wNTBzIHVzZXIgMG0wLjAzOXMgc3lzIDBtMC4wMDVzICAgX3N0ZF9jb250YWluZXJzLnNvCiAgICAgICAgICAgICAgcmVhbCAwbTAuMDM5cyB1c2VyIDBtMC4wMjZzIHN5cyAwbTAuMDA3cyAgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgUmVhZCBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuCgoKMDIvMjcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBzdXBwb3J0IGZvciBJTlBVVCwgT1VUUFVULCBhbmQgSU5PVVQgdHlwZW1hcHMuCgkgICAgRm9yIE9VVFBVVCB2YXJpYWJsZXMsIHRoZSBsaXNwIHdyYXBwZXIgcmV0dXJucyBtdWx0aXBsZQoJICAgIHZhbHVlcy4KCjAyLzI2LzIwMDY6IG1tYXR1cwoKCSAgICBbUnVieV0gYWRkIGFyZ2Nhcmd2LmkgbGlicmFyeSBmaWxlLgoJICAgIAoJICAgIFVzZSBpdCBhcyBmb2xsb3c6CgoJCSVpbmNsdWRlIGFyZ2Nhcmd2LmkKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWFwcGx5IChpbnQgQVJHQywgY2hhciAqKkFSR1YpIHsgKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgfSAKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWlubGluZSB7CQkJCQogICAJICAgICAgICAgIGludCBtYWluQXBwKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgCQogICAJICAgICAgICAgIHsJCQkJCQkKICAgCSAgICAgICAgICAgIHJldHVybiBhcmdjOwkJCQkJCiAgIAkgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQkJCQkJCQkKCSAgICAgIAkJCQkJCQkKICAgCSAgICB0aGVuIGluIHRoZSBydWJ5IHNpZGU6CQkJCQkKCSAgICAgIAkJCQkJCQkJCiAgIAkgICAgICAgIGFyZ3MgPSBbImFzZGYiLCAiYXNkZjIiXQkJCQkKICAgCSAgICAgICAgbiA9IG1haW5BcHAoYXJncyk7CgkKCgkgICAgVGhpcyBpcyB0aGUgc2ltaWxhciB0byB0aGUgcHl0aG9uIHZlcnNpb24gTGliL3B5dGhvbi9hcmdjYXJndi5pCgowMi8yNC8yMDA2OiBtZ29zc2FnZQoKCSAgICBTbWFsbCB1cGRhdGUgTHVhIGRvY3VtZW50cyBvbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMKCSAgICAKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBGaXggYWxsIHRoZSBlcnJvcnMgcmVwb3J0ZWQgZm9yIDEuMy4yOC4KCSAgICAtIGZpeCBidWcgIzExNTgxNzgKCSAgICAtIGZpeCBidWcgIzEwNjA3ODkKCSAgICAtIGZpeCBidWcgIzEyNjM0NTcKCSAgICAtIGZpeCAnY29uc3QgIGNoYXIqJicgdHlwZW1hcCBpbiB0aGUgVVRMLCByZXBvcnRlZCBieSBHZW9mZiBIdXRjaGlzb24KCSAgICAtIGZpeGVzIGZvciBweXRob24gMi4xIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5CgkgICAgLSBmaXggY29weWN0b3IgKyB0ZW1wbGF0ZSBidWcgIzE0MzIxMjUKCSAgICAtIGZpeCBbIDE0MzIxNTIgXSAlcmVuYW1lIGZyaWVuZCBvcGVyYXRvcnMgaW4gbmFtZXNwYWNlCgkgICAgLSBmaXggZ2NjIHdhcm5pbmcgcmVwb3J0ZWQgYnkgUi4gQmVybnN0ZWluCgkgICAgLSBhdm9pZCBhc3NlcnQgd2hlbiBmaW5kaW5nIGEgcmVjdXJzaXZlIHNjb3BlIGluaGVyaXRhbmNlLAoJICAgICAgZW1pdCBhIHdhcm5pbmcgaW4gdGhlIHdvcnN0IGNhc2UsIHJlcG9ydGVkIGJ5IE5pdHJvIAoJICAgIC0gZml4IHByZW1hdHVyZSBvYmplY3QgZGVsZXRpb24gcmVwb3J0ZWQgYnkgUGF1bCBpbiB0Y2wzZAoJICAgIC0gZml4IHdhcm5pbmcgcmVwb3J0ZWQgYnkgTml0cm8gaW4gVkM3CgkgICAgLSBtb3JlIGZpeGVzIGZvciBvbGQgU29sYXJpcyBjb21waWxlcgoJICAgIC0gZml4IGZvciBweXRob24gMi4zIGFuZCBnY19yZWZzIGlzc3VlIHJlcG9ydGVkIGJ5IEx1aWdpCgkgICAgLSBmaXggZmFzdHByb3h5IGZvciBtZXRob2RzIHVzaW5nIGt3YXJncwoJICAgIC0gZml4IG92ZXJsb2FkICsgcHJvdGVjdGVkIG1lbWJlciBpc3N1ZSByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IHNldGVycm9ybXNnIGFzIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggZGlyZWN0b3JzLCBub3cgdGhlIHRlc3Qtc3VpdGUgcnVucyBhZ2FpbiB1c2luZyAtZGlyZWN0b3JzCgkgICAgLSBmaXggZm9yIGZyaWVuZCBvcGVyYXRvciBhbmQgVmlzdWFsIHN0dWRpbyBhbmQgYnVnIDE0MzIxNTIKCSAgICAtIGZpeCBidWcgIzE0MzUwOTAKCSAgICAtIGZpeCB1c2luZyArICVleHRlbmQgYXMgcmVwb3J0ZWQgYnkgV2lsbGlhbQoJICAgIC0gZml4IGJ1ZyAjMTA5NDk2NAoJICAgIC0gZml4IGZvciBQeV9Ob3RJbXBsZW1lbnRlZCBhcyByZXBvcnRlZCBieSBPbGx5IGFuZCBBbWF1cnkKCSAgICAtIGZpeCBuZXN0ZWQgbmFtZXNwYWNlIGlzc3VlIHJlcG9ydGVkIGJ5IENoYXJsaWUKCgkgICAgYW5kIGFsc286CgkgICAgCgkgICAgLSBhbGxvdyBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycyBieSBkZWZhdWx0CgkgICAgLSBkZWxldGUgZXh0cmEgbmV3IGxpbmVzIGluIHN3aWdtYWNyb3NbVVRMXQoJICAgIC0gY29zbWV0aWMgZm9yIGdlbmVyYXRlZCBweXRob24gY29kZQoJICAgIC0gYWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgVVRMCgkgICAgLSBhZGQgc3dpZ3JlZ2lzdGVyIHByb3h5IG1ldGhvZCBhbmQgbW92ZSBfX3JlcHJfXyB0byBhCgkgICAgICBzaW5nbGUgZ2xvYmFsIG1vZHVsZSAgW3B5dGhvbl0KCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgV2hlbiB1c2luZyBkaXJlY3RvcnMsIG5vdyBzd2lnIHdpbGwgZW1pdCBhbGwgdGhlIHZpcnR1YWwKCSAgICBwcm90ZWN0ZWQgbWV0aG9kcyBieSBkZWZhdWx0LiAKCgkgICAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSBuZWVkZWQgdG8gdXNlIHRoZSAnZGlycHJvdCcKCSAgICBvcHRpb24gdG8gYWNoaWV2ZSB0aGUgc2FtZS4KCgkgICAgSWYgeW91IHdhbnQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgbmV3IGRlZmF1bHQgYmVoYXZpb3VyLAoJICAgIHVzZSB0aGUgJ25vZGlycHJvdCcgb3B0aW9uOiAKCgkgICAgICAgc3dpZyAtbm9kaXJwcm90IC4uLgoKCSAgICBhbmQvb3IgdGhlICVub2RpcmVjdG9yIGZlYXR1cmUgZm9yIHNwZWNpZmljIG1ldGhvZHMsIGkuZS46CgoJICAgICAgICVub2RpcmVjdG9yIEZvbzo6YmFyOwoKCSAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICAgIHZpcnR1YWwgfkZvbygpOwoKCSAgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKCk7CgkgICAgICAgfTsKCSAgICAKCgkgICAgQXMgYmVmb3JlLCBwdXJlIGFic3RyYWN0IHByb3RlY3RlZCBtZW1iZXJzIGFyZSBhbGx3YXlzCgkgICAgZW1pdHRlZCwgaW5kZXBlbmRlbnQgb2YgdGhlICdkaXJwcm90L25vZGlycHJvdCcgb3B0aW9ucy4KCgowMi8yMi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBsYW5ndWFnZXMgdXNpbmcgdGhlIFVUTCAocHl0aG9uLHRjbCxydWJ5LHBlcmwpLgoJICAgIAogICAgICAgICAgICBmYWN0b3J5LmkgaW1wbGVtZW50cyBhIG1vcmUgbmF0dXJhbCB3cmFwIGZvciBmYWN0b3J5IG1ldGhvZHMuIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmU6CQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKICAJICAgICAgICAgc3RydWN0IEdlb21ldHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICAgIGVudW0gR2VvbVR5cGV7CQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgICAgICBQT0lOVCwJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAgIENJUkNMRQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIH5HZW9tZXRyeSgpIHt9ICAgIAkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIGludCBkcmF3KCkgPSAwOwkJCQkgICAgCiAgCSAgICAJIAkJCQkJCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgIAkgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgICAgc3RhdGljIEdlb21ldHJ5ICpjcmVhdGUoR2VvbVR5cGUgaSk7ICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBQb2ludCA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMTsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgd2lkdGgoKSB7IHJldHVybiAxLjA7IH0gICAgCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgQ2lyY2xlIDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAyOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSByYWRpdXMoKSB7IHJldHVybiAxLjU7IH0gICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgIH07IAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlKEdlb21UeXBlIHR5cGUpIHsJCSAgICAKICAJICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgUE9JTlQ6IHJldHVybiBuZXcgUG9pbnQoKTsJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIENJUkNMRTogcmV0dXJuIG5ldyBDaXJjbGUoKTsgCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICB9CQkJCQkgICAgCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgWW91IGNhbiB1c2UgdGhlICVmYWN0b3J5IHdpdGggdGhlIEdlb21ldHJ5OjpjcmVhdGUgbWV0aG9kIGFzIGZvbGxvd3M6CgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICVuZXdvYmplY3QgR2VvbWV0cnk6OmNyZWF0ZTsJCQkJICAgIAogIAkgICAgICAlZmFjdG9yeShHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZSwgUG9pbnQsIENpcmNsZSk7CSAgICAKICAJICAgICAgJWluY2x1ZGUgImdlb21ldHJ5LmgiCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICBhbmQgR2VvbWV0cnk6OmNyZWF0ZSB3aWxsIHJldHVybiBhICdQb2ludCcgb3IgJ0NpcmNsZScgaW5zdGFuY2UgICAKICAJICAgIGluc3RlYWQgb2YgdGhlIHBsYWluICdHZW9tZXRyeScgdHlwZS4gRm9yIGV4YW1wbGUsIGluIHB5dGhvbjoJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICBjaXJjbGUgPSBHZW9tZXRyeS5jcmVhdGUoR2VvbWV0cnkuQ0lSQ0xFKQkJCSAgICAKICAJICAgICAgciA9IGNpcmNsZS5yYWRpdXMoKQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIHdoZXJlICdjaXJjbGUnIG5vdyBpcyBhIENpcmNsZSBwcm94eSBpbnN0YW5jZS4JICAgIAkJICAgIAoKCjAyLzE3LzIwMDY6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IGFjY2VwdCB0aGUgZnVsbCByYW5nZSBvZiBpbnRlZ3JhbAoJICAgIHZhbHVlcywgYW5kIHRoZXkgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgkgICAgW0d1aWxlXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUKCSAgICB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoKMDIvMTMvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0RvY3VtZW50c10gdXBkYXRlZCB0aGUgZXh0ZW5kaW5nIGRvY3VtZW50cyB0byBnaXZlIGEgc2tlbGV0b24gc3dpZ2dpbmcgY29kZQogICAgICAgICAgICB3aXRoIGEgZmV3IHR5cGVtYXBzLgogICAgICAgICAgICBbTHVhXSBhZGRlZCBhbiBleHRyYSB0eXBlbWFwIGZvciB2b2lkKiBbaW5dLCBzbyBhIGZ1bmN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgdm9pZCoKICAgICAgICAgICAgY2FuIHRha2UgYW55IGtpbmQgb2YgcG9pbnRlcgoKVmVyc2lvbiAxLjMuMjggKEZlYnJ1YXJ5IDEyLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBGaXggbWFueSBpc3N1ZXMgd2l0aCBsaW5lIGNvdW50aW5nIGFuZCBlcnJvciByZXBvcnRzLgoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQmV0dGVyIHN0YXRpYyBkYXRhIG1lbWJlciBzdXBwb3J0LCBpZiB5b3UgaGF2ZQoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4gbm93IGlzIHZhbGlkIHRvIGFjY2VzcyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyLCBpZToKCiAgICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICAgIGYuYmFyID0gMwoKCSAgICBqdXN0IGFzIGluIEMrKy4KCgowMi8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0KICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHRvIHdvcmsgYWdhaW4gd2l0aCBvbGQgdmVyc2lvbnMgb2YgUGVybAogICAgICAgICAgICAoNS4wMDQgYW5kIGxhdGVyIHRlc3RlZCkKCjAyLzA0LzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyKCkgZGlyZWN0aXZlIHRvIGV4dGVuZAoJICAgIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IGluIHB5dGhvbi4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHNtYXJ0IHBvaW50ZXIgYXM6CgkgICAgCgkgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgUkNQdHIgewoJICAgICAgcHVibGljOgoJICAgICAgICAuLi4KCSAgICAgICAgUkNQdHIoVHlwZSAqcCk7CgkJVHlwZSAqIG9wZXJhdG9yLT4oKSBjb25zdDsKCQkuLi4KCSAgICAgIH07CgkgICAgICAKCSAgICB5b3UgdXNlIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgZGlyZWN0aXZlIGFzOgoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSAgUkNQdHI8QT47CgkgICAgCgkgICAgdGhlbiwgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgUkNQdHI8QT4gbWFrZV9wdHIoKTsKCSAgICAgIGludCBmb28oQSAqKTsKCgkgICAgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgoKCSAgICAgIGEgPSBtYWtlX3B0cigpOwoJICAgICAgYiA9IGZvbyhhKTsKCiAgICAgICAgICAgIGllLCBzd2lnIHdpbGwgYWNjZXB0IGEgUkNQdHI8QT4gb2JqZWN0IHdoZXJlIGEgJ0EgKicgaXMKICAgICAgICAgICAgZXhwZWN0ZWQuCgoJICAgIEFsc28sIHdoZW4gdXNpbmcgdmVjdG9ycwoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSBSQ1B0cjxBPjsKCSAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfQSkgc3RkOjp2ZWN0b3I8UkNQdHI8QT4gPjsKCQkKCSAgICB5b3UgY2FuIHR5cGUKCgkgICAgICBhID0gQSgpOwoJICAgICAgdiA9IHZlY3Rvcl9BKDIpCgkgICAgICB2WzBdID0gYQoKICAgICAgICAgICAgaWUsIGFuICdBIConIG9iamVjdCBpcyBhY2NlcHRlZCwgdmlhIGltcGxpY2l0IGNvbnZlcnNpb24sIAoJICAgIHdoZXJlIGEgUkNQdHI8QT4gb2JqZWN0IGlzIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHkKCgkgICAgICB4ID0gdlswXQoKCSAgICByZXR1cm5zIChhbmQgc2V0cyAneCcgYXMpIGEgY29weSBvZiB2WzBdLCBtYWtpbmcgcmVmZXJlbmNlCgkgICAgY291bnRpbmcgcG9zc2libGUgYW5kIGNvbnNpc3RlbnQuCgoJICAgICVleHRlbmRfc21hcnRfcG9pbnRlciBpcyBqdXN0IGEgY29sbGVjdGlvbnMgb2YgbmV3L29sZAoJICAgIHRyaWNrcywgaW5jbHVkaW5nICV0eXBlbWFwcyBhbmQgdGhlIG5ldyAlaW1wbGljaXRjb252CgkgICAgZGlyZWN0aXZlLgoKMDIvMDIvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgYnVnZml4ICMxMzU2NTc3LCBjaGFuZ2VkIGRvdWJsZT0+bHVhX251bWJlciBpbiBhIGZldyBwbGFjZXMuCiAgICAgICAgICAgIGFkZGVkIHRoZSBzdGQ6OnBhaXIgd3JhcHBpbmcKCjAxLzMwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFuZCBzdGQ6OndzdHJpbmcgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBub3cgdXNlCiAgICAgICAgICAgICVuYXR1cmFsdmFyIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhleSB3aWxsIG5vdyBiZSB3cmFwcGVkIGFzIGV4cGVjdGVkIGluIGFsbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlc2Ugd2VyZSB3cmFwcGVkIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIHRhcmdldCBsYW5ndWFnZSBzdHJpbmcuCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB0byB3cmFwIHRoZXNlIGFzIHN0cmluZ3M6CgoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjAxLzI4LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gCgkgICAgQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgowMS8yNC8yMDA2OiBtbWF0dXMKCSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB0aGUgJW5hdHVyYWx2YXIgZGlyZWN0aXZlLCBub3cgaXQKCSAgICAgIHdvcmtzIHdpdGggdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXMgd2VsbCBhcwoJICAgICAgSmF2YS9DIy4KCSAgICAgIAoJICAgICAgTm93LCBpdCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGNsYXNzIHR5cGVzOgoKCSAgICAgICAgJW5hdHVyYWx2YXIgc3RkOjpzdHJpbmc7CgkgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CgkgICAgICAKICAgICAgICAgICAgICB0aGF0IHdpbGwgdGVsbCBzd2lnIHRvIHVzZSB0aGUgJ25hdHVyYWwnIHdyYXBwaW5nCiAgICAgICAgICAgICAgbWVjaGFuaXNtIHRvIGFsbCBzdGQ6OnN0cmluZyBnbG9iYWwgYW5kIG1lbWJlcgogICAgICAgICAgICAgIHZhcmlhYmxlcy4KCgkgICAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlICVhbGxvd2V4Y2VwdCBmZWF0dXJlIGFsb25nIHRoZQogICAgICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWNoIGFsbG93cyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgdmFyaWFibGUgYWNjZXNzIG1ldGhvZHMuIEFsc28sIGFkZAogICAgICAgICAgICAgIHRoZSAlZXhjZXB0aW9udmFyIGRpcmVjdGl2ZSB0byBzcGVjaWZ5IGEgZGlzdGludGljCiAgICAgICAgICAgICAgZXhjZXB0aW9uIG1lY2hhbmlzbSBvbmx5IGZvciB2YXJpYWJsZXMuCgkgICAgICAKCSAgICAKCSAgICAtIEFkZCBtb3JlIGRvY3MgZm9yIHRoZSAlZGVsb2JqZWN0IGRpcmVjdGl2ZSB0byBtYXJrIGEgbWV0aG9kIGFzIGEKCSAgICAgIGRlc3RydWN0b3IsICdkaXNvd25pbmcnIHRoZSBmaXJzdCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgoJICAgICAgICAlbmV3b2JqZWN0IGNyZWF0ZV9mb287CgkgICAgICAgICVkZWxvYmplY3QgZGVzdHJveV9mb287CgoJICAgICAgICBGb28gKmNyZWF0ZV9mb28oKSB7IHJldHVybiBuZXcgRm9vKCk7IH0KCSAgICAgICAgdm9pZCBkZXN0cm95X2ZvbyhGb28gKmZvbykgeyBkZWxldGUgZm9vOyB9CgoJICAgICAgb3IgaW4gYSBtZW1iZXIgbWV0aG9kIGFzOgoKCSAgICAgICAgJWRlbG9iamVjdCBGb286OmRlc3Ryb3k7CgoJICAgICAgICBjbGFzcyBGb28gewoJICAgICAgICBwdWJsaWM6CgkgICAgICAgICAgdm9pZCBkZXN0cm95KCkgeyBkZWxldGUgdGhpczt9CgoJICAgICAgICBwcml2YXRlOgoJICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgfTsKCgowMS8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIC0gUmVtb3ZlZCB0aGUgdHlwZSBzd2lnX2x1YV9jb21tYW5kX2luZm8gJiByZXBsYWNlIHdpdGggbHVhTF9yZWcKCSAgICAgICh3aGljaCB0aGVuIGJyb2tlIHRoZSBjb2RlKSwgZml4ZWQgdGhpcwoJICAgIC0gYWRkZWQgYW4gYWRkaXRpb25hbCBjYXN0IGluIHRoZSB0eXBlbWFwcyBmb3IgZW51bSdzCgkgICAgICBkdWUgdG8gdGhlIGlzc3VlIHRoYXQgVkMuTmV0IHdpbGwgbm90IGFsbG93IGNhc3Rpbmcgb2YKCSAgICAgIGEgZG91YmxlIHRvIGFuIGVudW0gZGlyZWN0bHkuIFRoZXJlZm9yZSBjYXN0IHRvIGludCB0aGVuIHRvIGVudW0KCSAgICAgICh0aGFua3MgdG8gSmFzb24gUmVnbyBmb3IgdGhpcyBvYnNlcnZhdGlvbikKCjAxLzE2LzIwMDY6IG1tYXR1cyAoQ2hhbmdlIGRpc2FibGVkLi4uIHdpbGwgYmUgYmFjayBpbiBDVlMgc29vbikKCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciByZWdleHAgdmlhIHRoZSBleHRlcm5hbCBsaWJyYXJ5CgkgICAgUnhTcGVuY2VyLiBTV0lHIGRvZXNuJ3QgcmVxdWlyZSB0aGlzIGxpYnJhcnkgdG8gY29tcGlsZQoJICAgIGFuZC9vciBydW4uIEJ1dCBpZiB5b3Ugc3BlY2lmeSAtLXdpdGgtcnhzcGVuY2VyLCBhbmQgdGhlCgkgICAgbGlicmFyeSBpcyBmb3VuZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCB0aGVuIHN3aWcgd2lsbCB1c2UKCSAgICBpdCBpbiB0aHJlZSBwbGFjZXM6CgoJICAgIC0gSW4gJXJlbmFtZXMgcnVsZXMsIHZpYSB0aGUgbmV3IHJ4c21hdGNoIHJ1bGVzLCBmb3IgZXhhbXBsZToKCSAgICAJICAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5hbWU9IkdTTF8uKiIpICIiOwoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbm9kZVR5cGU9ImVudW0gR1NMXy4qIikgIiI7CgkgICAgCSAKICAgICAgICAgICAgICByeHNtYXRjaCBpcyBzaW1pbGFyIHRvIHRoZSBtYXRjaCBydWxlLCBpdCBqdXN0IHVzZXMKICAgICAgICAgICAgICB0aGUgUnhTcGVuY2VyIHJlZ2V4cCBsaWJyYXJ5IHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhCiAgICAgICAgICAgICAgbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgcmVnZXhwLiBBcyB3aXRoIHRoZSBtYXRjaAogICAgICAgICAgICAgIHJ1bGUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIG5lZ2F0ZSBydWxlIG5vdHJ4c21hdGNoLgoKCSAgICAtIEluIHRoZSAlcmVuYW1lIHRhcmdldCBuYW1lIHZpYSB0aGUgcnhzdGFyZ2V0IG9wdGlvbiwgZm9yIGV4YW1wbGU6CgkgICAgCQkgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHN0YXJnZXQ9MSkgIkdTTF8uKiI7CgoJICAgIAl3aGVyZSB0aGUgdGFyZ2V0IG5hbWUgIkdTTC4qIiBpcyBub3cgdW5kZXJzdG9vZCBhcyBhCgkgICAgCXJlZ2V4cCB0byBiZSBtYXRjaGVkLiAgCgkgICAgCSAKICAgICAgICAgICAgLSBJbiB0aGUgbmV3IGVuY29kZXIgInJ4c3BlbmNlciIsIHdoaWNoIGxvb2tzIGxpa2U6CgoJICAgIAkgICUocnhzcGVuY2VyOltyZWdleHBdW3JlcGxhY2VdKXMKCgkgICAgCXdoZXJlICJyZWdleHAiIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kICJyZXBsYWNlIgoJICAgIAlpcyBhIHN0cmluZyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZSBAMCxAMSwuLi4sQDkKCSAgICAJcHNldWRvIGFyZ3VtZW50cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCgkgICAgCWNvcnJlc3BvbmRpbmcgbWF0Y2hpbmcgaXRlbXMgaW4gdGhlIHJlZyBleHByZXNzaW9uLgoKCSAgICAJRm9yIGV4YW1wbGU6CgkgICAgCQkgICAgICAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBIZWxsbyAgICAtPiAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBHU0xIZWxsbyAtPiBHU0xIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bQDFdKXMgICAgIDwtIEdTTEhlbGxvIC0+IEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtnc2xAMV0pcyAgPC0gR1NMSGVsbG8gLT4gZ3NsSGVsbG8KCgkgICAgCUFub3RoZXIgZXhhbXBsZSBjb3VsZCBiZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKGxvd2VyY2FzZSlzIixzb3VyY2VmbXQ9IiUocnhzcGVuY2VyOltHU0xfKC4qKV1bQDFdKXMiLCUkaXNmdW5jdGlvbikgIiI7CgoJICAgIAl3aGljaCB0YWtlIG91dCB0aGUgcHJlZml4ICJHU0xfIiBhbmQgcmV0dXJucyBhbGwgdGhlCgkgICAgCWZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2VzLCBhcyBmb2xsb3dpbmc6CgoJICAgIAkgICAgdm9pZCBHU0xfSGVsbG8oKTsgICAtPiAgIGhlbGxvKCk7CgkgICAgCSAgICB2b2lkIEdTTF9IaSgpOyAgICAgIC0+ICAgaGkoKTsKCSAgICAJICAgIGNvbnN0IGludCBHU0xfTUFYOyAgLT4gICBHU0xfTUFYOyAgLy8gbm8gY2hhbmdlLCBpcyBub3QgYSBmdW5jdGlvbgoJCgkgICAgV2UgdXNlIHRoZSBSeFNwZW5jZXIgYXMgYW4gaW5pdGlhbCB0ZXN0IGJlZCB0bwogICAgICAgICAgICBpbXBsZW1lbnRpb24gd2hpbGUgd2UgZGVjaWRlIHdoaWNoIGxpYnJhcnkgd2lsbCBiZQogICAgICAgICAgICBmaW5hbGx5IGFkZGVkIHRvIHN3aWcuCgogICAgICAgICAgICBZb3UgY2FuIG9idGFpbiB0aGUgUnhTcGVuY2VyIGxpYnJhcnkgZnJvbSAKCSAgICAKCSAgICAgIGh0dHA6Ly9hcmdsaXN0LmNvbS9yZWdleCAoVW5peCkKCgkgICAgb3IKCSAgICAgCgkgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L3BhY2thZ2VzLmh0bWwgKFdpbmRvd3MpCgoJICAgIE9uY2UgaW5zdGFsbGVkLCB1c2UgIm1hbiByeHNwZW5jZXIiIHRvIGdldCBtb3JlIGluZm8KCSAgICBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdCwgb3IganVzdCBnb29nbGUgcnhzcGVuY2VyLgoKCSAgICBTaW5jZSBub3cgeW91IGNhbiBlbmFibGUgdGhlIHJ4c21hdGNoIHJ1bGVzIChzZWUgYWJvdmUpLAogICAgICAgICAgICB0aGUgc2ltcGxlIG9yICd8JyBzdXBwb3J0IGZvciB0aGUgbWF0Y2ggcnVsZXMKICAgICAgICAgICAgKDAxLzEyLzIwMDY6IG1tYXR1cykgaXMgZGlzYWJsZWQuIFN0aWxsLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIHRoZSByeHNwZW5jZXIgbGlicmFyeSwgeW91IGNhbiByZS1lbmFibGUKICAgICAgICAgICAgdGhlIHNpbXBsZSAnbWF0Y2ggb3InIHN1cHBvcnQgdXNpbmcKICAgICAgICAgICAgLURTV0lHX1VTRV9TSU1QTEVfTUFUQ0hPUi4KCSAgCgowMS8xNi8yMDA2OiBtbWF0dXMKCSAgICBDaGFuZ2UgdGhlICVyZW5hbWUgcHJlZGljYXRlcyB0byB1c2UgdGhlIHByZWZpeCAnJSQnLCBhcyBpbjoKCSAgICAKCSAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCUkaXNmdW5jdGlvbiwlJGlzbWVtYmVyKSAiIjsgCgkgICAJCiAgICAgICAgICAgIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBvdGhlciBzd2lnIG1hY3Jvcy9kaXJlY3RpdmVzLgoKMDEvMTQvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIFJ1YnkgYmFuZyEgbWV0aG9kcyB2aWEgYSBuZXcgJWJhbmcgZmVhdHVyZS4KCSAgICBCYW5nIG1ldGhvZHMgZW5kIGluIGV4Y2xhbWF0aW9uIHBvaW50cyBhbmQgaW5kaWNhdGUgdGhhdCB0aGUKCSAgICBvYmplY3QgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgYmUgbW9kaWZpZWQgaW4tcGxhY2UgYXMgCgkgICAgb3Bwb3NlZCB0byBiZWluZyBjb3BpZWQuCgowMS8xMi8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgVXBkYXRlZCB0aGUgUnVieSBtb2R1bGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0CgkgICAgbWV0aG9kIG5hbWVzIHRvIGxvd2VyX2Nhc2Vfd2l0aF91bmRlcnNjb3JlcyB1c2luZyB0aGUKCSAgICBuZXcgJXJlbmFtZSBmdW5jdGlvbmFsaXR5LgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgYWxpYXNlcyBmb3IgJ2Nhc2UnIGVuY29kZXJzIHVzZWQgd2l0aCAlcmVuYW1lLyVuYW1ld2FybgoKCSAgICAgICUodXBwZXJjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIRUxMT19XT1JMRAoJICAgICAgJShsb3dlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvd29ybGQKCSAgICAgICUoY2FtZWxjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIZWxsb1dvcmxkCgkgICAgICAlKHVuZGVyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG9fd29ybGQKCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgLWR1bXBfcGFyc2VfbW9kdWxlIGFuZCAtZHVtcF9wYXJzZV90b3Agb3B0aW9ucywKCSAgICB3aGljaCBhcmUgc2ltaWxhciB0byAtZHVtcF9tb2R1bGUgYW5kIC1kdW1wX3RvcCwgYnV0IHRoZXkKCSAgICBkdW1wIHRoZSBub2RlIHRyZWVzIGp1c3QgYWZ0ZXIgcGFyc2luZywgc2hvd2luZyBvbmx5IHRoZSAKCSAgICBhdHRyaWJ1dGVzIHZpc2libGUgYXQgdGhlIHBhcnNpbmcgc3RhZ2UsIGFuZCBub3QgdGhlIGFkZGVkCgkgICAgbGF0ZXIgaW4gdHlwZW1hcC5jeHgsIGFsbG9jYXRlLmN4eCwgbGFuZy5jeHggb3IgZWxzZXdoZXJlLgoJICAgIAoJICAgIEJlc2lkZXMgZGVidWdnaW5nIHBvcnB1c2VzLCB0aGVzZSBvcHRpb25zIGFyZSB2ZXJ5IHVzZWZ1bAoJICAgIGlmIHlvdSBwbGFuIHRvIHVzZSAlcmVuYW1lIGluIGFuICJhZHZhbmNlIHdheSIsIHNpbmNlIGl0CgkgICAgc2hvd3Mgb25seSBhbmQgYWxsIHRoZSBub2RlJ3MgYXR0cmlidXRlcyB5b3UgY2FuIHVzZQoJICAgIGluc2lkZSB0aGUgbWF0Y2ggcnVsZXMuCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgcHJlZGljYXRlcyB0byAlcmVuYW1lLCBzbywgeW91IGRvbid0IG5lZWQgdG8KCSAgICAgIHJlbWVtYmVyLCBmb3IgZXhhbXBsZSwgaG93IHRvIG1hdGNoIGEgbWVtYmVyIGZ1bmN0aW9uLgoKCSAgICAgIE5vdyBpdCBpcyBlYXN5LCBmb3IgZXhhbXBsZSB0byB1c2UgdGhlICd1dGl0bGUnIGVuY29kZXIgCgkgICAgICBpbiBhbGwgdGhlIG1lbWJlciBtZXRob2RzLCB5b3UgdHlwZToKCgkgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCVpc2Z1bmN0aW9uLCVpc21lbWJlcikgIiI7CgoJICAgICAgb3IgdG8gaWdub3JlIGFsbCB0aGUgZW51bWl0ZW1zIGluIGEgZ2l2ZW4gY2xhc3M6CgoJICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgJWlzZW51bWl0ZW0sICVjbGFzc25hbWU9Ik15Q2xhc3MiKSAiIjsgIAoKCSAgICAgIEF2YWlsYWJsZSBwcmVkaWNhdGVzIGFyZSAoc2VlIHN3aWcuc3dnKToKCiAgICAgICAgICAgICAgICAlaXNlbnVtICAgICAgICAgCgkJJWlzZW51bWl0ZW0gICAgIAoJCSVpc2FjY2VzcyAgICAgICAKCQklaXNjbGFzcyAgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNjb25zdHJ1Y3RvciAgCgkJJWlzZGVzdHJ1Y3RvciAgIAoJCSVpc25hbWVzcGFjZSAgICAKCQklaXN0ZW1wbGF0ZSAgICAgCgkJJWlzY29uc3RhbnQgICAgIAoJCQkJCQoJCSVpc3VuaW9uICAgICAgICAKCQklaXNmdW5jdGlvbiAgICAgCgkJJWlzdmFyaWFibGUgICAgIAoJCSVpc2ltbXV0YWJsZSAgICAKCQkJCQkKCQklaXNzdGF0aWMgICAgICAgCgkJJWlzZnJpZW5kICAgICAgIAoJCSVpc3R5cGVkZWYgICAgICAKCQklaXN2aXJ0dWFsICAgICAgCgkJJWlzZXhwbGljaXQgICAgIAoJCSVpc2V4dGVybiAgICAgICAKCQkJCQkKCQklaXNtZW1iZXIgICAgICAgCgkJJWlzZ2xvYmFsIAoJCSVpbm5hbWVzcGFjZQoKCQklaXNwdWJsaWMgICAgCgkJJWlzcHJvdGVjdGVkIAoJCSVpc3ByaXZhdGUgICAKCQkJCSAgICAgCgkJJWNsYXNzbmFtZSAgIAoKICAgICAgICAgICAgICBUaGVzZSBwcmVkaWNhdGVzIGNvcnJlc3BvbmQgdG8gc3BlY2lmaWMgJ21hdGNoJwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywgd2hpY2ggc29tZXRpbWVzIGFyZSBub3QgYXMgZXZpZGVudCBhcyB0aGUKICAgICAgICAgICAgICBwcmVkaWNhdGVzIG5hbWVzLgoKCiAgICAgICAgICAgIC0gQWRkIHRoZSBvciAnfCcgb3BlcmF0aW9uIGluICVyZW5hbWUgbWF0Y2gsIGZvcgogICAgICAgICAgICAgIGV4YW1wbGUgdG8gY2FwaXRhbGl6ZSBhbGwgdGhlIGNvbnN0YW50cyAoJWNvbnN0YW50IG9yCiAgICAgICAgICAgICAgY29uc3QgY2RlY2wpOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiLG1hdGNoPSJjZGVjbHxjb25zdGFudCIsJWlzaW1tdXRhYmxlKSAiIjsKICAgICAgICAgICAgICAgIAoKCjAxLzEyLzIwMDY6IG1nb3NzYWdlCgkgICAgLQlQYXJ0aWFsIGZpeGVkIG9mIGVycm9ycyB1bmRlciBDODksIGJ1ZyAjMTM1NjU3NAoJICAgIAkoY29udmVydGVkIEMrKyBzdHlsZSBjb21tZW50cyB0byBDIHN0eWxlKQoJICAgIC0JQWRkZWQgcGF0Y2hlcyBmcm9tIG5lb21hbnRyYUB1c2Vycy5zZi5uZXQgIzEzNzk5ODggYW5kICMxMzg4MzQzCgkgICAgCW1pc3NpbmcgYSAncmV0dXJuJyBzdGF0ZW1lbnQgZm9yIGVycm9yIGNvbmRpdGlvbnMKCSAgICAJYWxzbyB1cGRhdGVkIHRoZSAlaW5pdCBibG9jayBidWcgIzEzNTY1ODYKCQkgCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAndXRpdGxlJyBlbmNvZGVyLCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBhZGQKCSAgICAgIHlvdXIgb3duIGVuY29kZXIuIEkgYWRkZWQgdGhlIGVuY29kZXIgbWV0aG9kIGluIG1pc2MuYyAKCSAgICAgIGJ1dCBkZXZlbG9wZXJzIGNhbiBhZGQgb3RoZXJzLCB0aGUgc2FtZSB3YXksIGluc2lkZSBhbnkKCSAgICAgIHRhcmdldCBsYW5ndWFnZS4KCSAgICAgIAoJICAgICAgV2VsbCwgJ3V0aXRsZScgaXMgdGhlIHJldmVyc2Ugb2YgJ2N0aXRsZScsIGllOgoKCSAgICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAgLT4gQ2FtZWxDYXNlOwoJICAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIpIENhbWVsQ2FzZTsgICAtPiBjYW1lbF9jYXNlOwoJCSAKCjAxLzEwLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KICAgICAgICAgICAgVXBkYXRlZCBSdWJ5IEV4Y2VwdGlvbiBoYW5kbGluZy4gIENsYXNzZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRocm93cyBjbGF1c2VzLCAKICAgICAgICAgICAgb3IgYXJlIG1hcmtlZCBhcyAlZXhjZXB0aW9uY2xhc3MsIGFyZSBub3cgaW5oZXJpdGVkIGZyb20gcmJfZVJ1bnRpbWVFcnJvci4gCiAgICAgICAgICAgIFRoaXMgYWxsb3dzIGluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIHRvIGJlIHJldHVybmVkIHRvIFJ1YnkgYXMgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIFRodXMgaWYgYSBDKysgbWV0aG9kIHRocm93cyBhbiBpbnN0YW5jZSBvZiBNeUV4Y2VwdGlvbiwgdGhlIGNhbGxpbmcgUnVieSAKICAgICAgICAgICAgbWV0aG9kIHdpbGwgZ2V0IGJhY2sgYSBNeUV4Y2VwdGlvbiBvYmplY3QuICBUbyBzZWUgYW4gZXhhbXBsZSwgCiAgICAgICAgICAgIGxvb2sgYXQgcnVieS9leGFtcGxlcy9leGNlcHRpb25fY2xhc3MuCgowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAKICAgICAgICAgICAgLSBBZGQgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSwgd2hpY2ggY29tcGxlbWVudHMgdGhlICVleGNlcHRpb24KCSAgICBkaXJlY3RpdmUgaW4gYSBtb3JlIGF1dG9tYXRpYyB3YXkuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhFMSk7CgogICAgICAgICAgICBzd2lnIGdlbmVyYXRlcyB0aGUgcHJvcGVyIHRyeS9jYXRjaCBjb2RlIHRvIGRpc3BhdGNoIEUxLgoJICAgIAoJICAgIEJ1dCBpZiB5b3UgaGF2ZToKCgoJICAgICAgICAgIGludCBiYXJmb28oaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CgkgICAgICAgICAgICAgICB0aHJvdyBFMSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgIHRocm93IEUyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZSwgd2hlcmUgdGhlcmUgaXMgbm8gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW4gdGhlIGRlY2wsIHlvdSAKCSAgICBlbmQgdXAgZG9pbmc6CgkJICAKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBiYXJmb28gewkJCQoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRTEpIHsJLi4uIH0JCQkJICAKCSAgICAgICAgIH0gY2F0Y2goRTIpIHsJLi4uIH0JCQkJICAKCSAgICAgICB9CQkJCQoJICAgIAoJICAgIHdoaWNoIGlzIHZlcnkgdGVkaW91cy4gV2VsbCwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSBkZWZpbmVzCgkgICAgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0byBjYXRjaCwgYW5kIGZyb20gc3dpZzoKIAkKCSAgICAgICAlY2F0Y2hlcyhFMSxFMikgYmFyZm9vKGludCBpKTsKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKTsKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gCgoJICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCgkgICAgTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgJWNhdGNoZXMgbGlzdCBkb2Vzbid0IGhhdmUgdG8KCSAgICBjb3JyZXNwb25kIHRvIHRoZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UKCSAgICBoYXZlOgoKCQlzdHJ1Y3QgRSB7fTsKCQlzdHJ1Y3QgRTEgOiBFIHt9OwoJCXN0cnVjdCBFMiA6IEUge307CgogIAkgICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCiAgICAgICAgICAgIHlvdSBjYW4gZGVmaW5lCgkgICAgICAgIAoJCSVjYXRjaGVzKEUpIGJhcmZvbyhpbnQgaSk7CgkKCSAgICBhbmQgc3dpZyB3aWxsIGdlbmVyYXRlIGFuIGFjdGlvbiBjb2RlIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFICZfZSkgeyAKCQkgICA8cmFpc2UgX2U+OwoJCSB9CQoKICAgICAgICAgICAgT2YgY291cnNlLCB5b3Ugc3RpbGwgaGF2ZSB0byBzYXRpc2Z5IHRoZSBDKysgcmVzdHJpY3Rpb25zLAoJICAgIGFuZCB0aGUgY2F0Y2hlcyBsaXN0IG11c3QgYmUgY29tcGF0aWJsZSAobm90IHRoZSBzYW1lKQoJICAgIGFzIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHR5cGVzIGluIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KCgkgICAgQWxzbywgeW91IGNhbiBub3cgc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGNhdGNoIHRoZQoJICAgIHVua25vd24gZXhjZXB0aW9uICcuLi4nLCBmb3IgZXhhbXBsZToKCgkgICAgICAgJWNhdGNoZXMoRTEsRTIsLi4uKSBiYXJmb28oaW50KTsKCgkgICAgSW4gYW55IGNhc2UsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgd2lsbCBlbWl0IHRoZQoJICAgIGNvZGUgdG8gY29udmVydCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZXJyb3IvZXhjZXB0aW9uCiAgICAgICAgICAgIHVzaW5nIHRoZSAndGhyb3dzJyB0eXBlbWFwLgoKCSAgICBGb3IgdGhlICcuLi4nIGNhc2UgdG8gd29yaywgeW91IG5lZWQgdG8KCSAgICB3cml0ZSB0aGUgcHJvcGVyIHR5cGVtYXAgaW4geW91ciB0YXJnZXQgbGFuZ3VhZ2UuIEluIHRoZQoJICAgIFVUTCwgdGhpcyBsb29rcyBsaWtlOgoKCSAgICAgICV0eXBlbWFwKHRocm93cykgKC4uLikgewoJICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1J1bnRpbWVFcnJvciwidW5rbm93biBleGNlcHRpb24iKTsKICAgICAgICAgICAgICB9CgowMS8wOS8yMDA2OiBtdXRhbmRpegoJICAgIFtBbGxlZ3JvY2xdCgogICAgICAgICAgICBGaXhlcyBhIG51bWJlciBvZiBTRUdWcyBwcmltYXJpbHkgaW4gdGhlIGhhbmRsaW5nIG9mCiAgICAgICAgICAgIHZhcmlvdXMgYW5vbnltb3VzIHR5cGVzLiBGb3VuZCBpbiBhIHBhc3MgdGhyb3VnaCB0aGUKICAgICAgICAgICAgc3dpZyB0ZXN0LXN1aXRlLiBTdGlsbCBtb3JlIHRvIGRvIGhlcmUsIGJ1dCB0aGlzIGlzIGEKICAgICAgICAgICAgZ29vZCBjaGVja3BvaW50LgoKICAgICAgICAgICAgQWRkcyAtY3dyYXAgYW5kIC1ub2N3cmFwIGFzIGFuIGFsbGVncm9jbCBzcGVjaWZpYwogICAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQuIENvbnRyb2xzIGdlbmVyYXRpbmcgb2YgYSBDCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZSB3aGVuIHdyYXBwaW5nIEMgY29kZS4gQnkgZGVmYXVsdCBvbmx5IGEKICAgICAgICAgICAgbGlzcCBmaWxlIGlzIGNyZWF0ZWQgZm9yIEMgY29kZSB3cmFwcGluZy4KCiAgICAgICAgICAgIERvYyB1cGRhdGVzIGZvciB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgZml4ZXMgYXMKICAgICAgICAgICAgcG9pbnRlZCBvdXQgb24gc3dpZy1kZXZlbAoKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB1bnNpZ25lZCBsb25nIGxvbmcgYW5kIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmIHR5cGVtYXBzCiAgICAgICAgICAgIC0gQnVnICMxMzk4Mzk0ICB3aXRoIHBhdGNoIGZyb20gRHJpZXMgRGVjb2NrCgowMS8wNi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgJ25hbWVkJyB3YXJuaW5nIGNvZGVzLCBub3cgaW4gYWRkaXRpb24gdG86CgkgICAgCgkgICAgICAld2FybmZpbHRlcig4MTMpOwoJICAgCgkgICAgeW91IGNhbiB1c2UKCgkgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9KQVZBX01VTFRJUExFX0lOSEVSSVRBTkNFKTsKCgkgICAganVzdCB1c2UgdGhlIHNhbWUgY29kZSBuYW1lIGZvdW5kIGluICBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oIAoJICAgIHBsdXMgdGhlICdTV0lHJyBwcmVmaXguCgoJICAgIElmIGEgZGV2ZWxvcGVyIGFkZHMgYSBuZXcgd2FybmluZyBjb2RlLCB0aGUgTGliL3N3aWd3YXJuLnN3ZyBmaWxlCiAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcnVubmluZyB0aGUgdG9wIGxldmVsIG1ha2UuCgowMS8wNS8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgUmVpbXBsZW1lbnRlZCBvYmplY3QgdHJhY2tpbmcgZm9yIFJ1YnkuICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHdvcmtzCgkgICAgYnkgZXhwYW5kaW5nIHRoZSBzd2lnX2NsYXNzIHN0cnVjdHVyZSBmb3IgUnVieSBieSBhZGRpbmcgYSB0cmFja09iamVjdHMKCSAgICBmaWVsZC4gIFRoaXMgZmllbGQgY2FuIGJlIHNldC91bnNldCB2aWEgJXRyYWNrb2JqZWN0cyBhcyBleHBsYWluZWQKCSAgICBpbiB0aGUgUnVieSBkb2N1bWVudGF0aW9uLiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIHJvYnVzdAoJICAgIGFuZCB0YWtlcyBsZXNzIGNvZGUgdG8gaW1wbGVtZW50LgoJCQowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVleHRlbmQgYW5kIHN0YXRpYyBjb25zdCBpbnRlZ3JhbCB0eXBlcywgZWc6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJhciA9IDQyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07IAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbmZvIGZvciBvbGQgYW5kIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIAogICAgICAgICAgICAtZHVtcF90b3AgICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgZW50aXJlIG5vZGUgdHJlZSwgaW5jbHVkaW5nIHN5c3RlbSBub2RlcyAgICAKICAgICAJICAgIC1kdW1wX21vZHVsZSAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBtb2R1bGUgbm9kZSB0cmVlLCBhdm9pZGluZyBzeXN0ZW0gbm9kZXMgICAgIAogICAgIAkgICAgLWR1bXBfY2xhc3NlcyAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZHVtcF90eXBlZGVmICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgYW5kIHR5cGVkZWZzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UKICAgICAJICAgIC1kdW1wX3RhZ3MgICAgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWRlYnVnX3R5cGVtYXAgIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0eXBlbWFwcwkJCSAgICAgICAKICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0ZW1wbGF0ZXMJCQkgICAgICAgIAoKCSAgLSBBZGQgdGhlIGZha2V2ZXJzaW9uLiBJZiB5b3UgaGF2ZSBhIHByb2plY3QgdGhhdCB1c2VzCiAgICAgICAgICAgIGNvbmZpZ3VyZS9zZXR1cC5weSwgb3IgYW5vdGhlciBhdXRvbWF0aWMgYnVpbGRpbmcgc3lzdGVtCiAgICAgICAgICAgIGFuZCByZXF1aXJlcyBhIHNwZWNpZmljIHN3aWcgdmVyc2lvbiwgbGV0IHNheSAxLjMuMjIgCgkgICAgeW91IGNhbiB1c2U6CgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiCgoJICAgICBvcgogCiAgICAgICAgICAgICAgIHN3aWcgLWZha2V2ZXJzaW9uIDEuMy4yMgoKICAgICAgICAgICAgIGFuZCB0aGVuIHN3aWcgLXZlcnNpb24gd2lsbCByZXBvcnQgMS4zLjIyIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICBjdXJyZW50IHZlcnNpb24uCgoJICAgICBUeXBpY2FsIHVzZSB3b3VsZCBiZQoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIiAuL2NvbmZpZ3VyZSAJICAgICAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgb3B0aW9uL2Zvcm1hdCBzdXBwb3J0IHRvICVyZW5hbWUgYW5kICVuYW1ld2Fybi4JCgkgICAgTm93ICVuYW1ld2FybiBjYW4gZm9yY2UgcmVuYW1pbmcsIGZvciBleGFtcGxlOgoKCSAgICAgICVuYW1ld2FybigiMzE0OiBpbXBvcnQgaXMgYSBrZXl3b3JkIixyZW5hbWU9Il8lcyIpICJpbXBvcnQiOwoJICAgIAoJICAgIGFuZCByZW5hbWUgY2FuIGFsc28gc3VwcG9ydCBmb3JtYXQgZm9ybXM6CgoJICAgICAgICVyZW5hbWUoInN3aWdfJXMiKSBpbXBvcnQ7CgoJICAgIE5vdywgc2luY2UgdGhlIGZvcm1hdCBpcyBwcm9jZXNzZWQgdmlhIHN3aWcgUHJpbnRmLCB5b3UKCSAgICBjYW4gdXNlIGVuY29kZXJzIGFzIGZvbGxvd3M6CgoJICAgICAgICVyZW5hbWUoIiUodGl0bGUpcyIpICBpbXBvcnQ7ICAgICAtPiBJbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiKSAgaW1wb3J0OyAgICAgLT4gSU1QT1JUCgkgICAgICAgJXJlbmFtZSgiJShsb3dlcilzIikgIEltcG9ydDsgICAgIC0+IGltcG9ydAoJICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAtPiBDYW1lbENhc2UKCSAgICAgICAKCSAgICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gYWRkIG1vcmUgZW5jb2RlcnMsIGFzIHRoZSAKCSAgICBleHBlY3RlZCBvbmUgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIAoKCSAgLSBBZGQgdGhlIGFib3ZlICdjdGl0bGUnIGVuY29kZXIsIHdoaWNoIGRvZXMgdGhlIGNhbWVsIGNhc2U6CgoJICAgICAgICBjYW1lbF9jYXNlIC0+IENhbWVsQ2FzZQogIAoJICAtIEFsc28sIHdoaWxlIHdlIGdldCB0aGUgcmVnZXhwIHN1cHBvcnQsIGFkZCB0aGUgJ2NvbW1hbmQnIGVuY29kZXIsCiAgICAgICAgICAgIHlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDpzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IClzIikgaW1wb3J0OyAKCgkgICAgdGhlbiBzd2lnIHdpbGwgcG9wZW4gdGhlIGNvbW1hbmQKCSAgICAKCQkic2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCBpbXBvcnQiCgkJCiAgICAgICAgICAgIHNlZSBiZWxvdyBmb3IgYW5vbnltb3VzIHJlbmFtZXMgZm9yIGJldHRlciBleGFtcGxlcy4JCQoKICAgICAgICAgIC0gVGhlIHJlbmFtZSBkaXJlY3RpdmUgbm93IGFsc28gYWxsb3dzOgoKCSAgICAtIHNpbXBsZSBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIGEgdHlwZSBtYXRjaAoJICAgICAgaGFwcGVuLCBmb3IgZXhhbXBsZQoKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2g9ImVudW1pdGVtIikgaGVsbG87CgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoJCSBpbnQgaGVsbG8oKSAgLT4gIGhlbGxvOyAKCgkgICAgLSBleHRlbmRlZCBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIHRoZSAnZXh0ZW5kZWQgYXR0cmlidXRlJyBtYXRjaAoJICAgICAgb2NjdXJyZWQsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyBzYW1lIGFzIHNpbXBsZSBtYXRjaCAJCQoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHN5bWJvbCAnJCcgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGluCgkgICAgICAgYSAncmVjdXJzaXZlJyB3YXksIGZvciBleGFtcGxlOgoKCQkgLy8gbWF0Y2ggb25seSBoZWxsbyBpbiAnZW51bSBIZWxsbycKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgIC8vIG1hdGNoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCiAgICAgICAgICAgICAgIGhlcmUsIGZvciBIZWxsbzo6aGksIHRoZSAicGFyZW50Tm9kZSIgaXMgIkhlbGxvIiwgYW5kIGl0cyAidHlwZSIKICAgICAgICAgICAgICAgaXMgImVudW0gSGVsbG8iLgoJICAgICAgIAoJICAgICAgIAogICAgICAgICAgICAtIEFub255bW91cyByZW5hbWVzOiB5b3UgY2FuIHVzZSAnYW5vbnltb3VzJyByZW5hbWUgZGlyZWN0aXZlcywgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgaW4gSGVsbG8KCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgIiI7IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIEhpLCBIZWxsbyAgIC8vIG1hdGNoIGJvdGgKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoJCSAKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpICIiOyAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBpdGVtcyBpbiBnaXZlbiBjb21tYW5kIChzbG9vb293LCBidXQuLi4pCgkJICVyZW5hbWUoJShjb21tYW5kOjxteSBleHRlcm5hbCBjbWQ+KXMpICIiOyAKCgkKCSAgICAgIEFub255bW91cyByZW5hbWVzIHdpdGggY29tbWFuZHMgY2FuIGJlIHZlcnkgcG93ZXJmdWwsIHNpbmNlIHlvdQoJICAgICAgY2FuICdvdXRzb3VyY2UnIGFsbCB0aGUgcmVuYW1pbmcgbWVjaGFuaXNtIChvciBwYXJ0IG9mIGl0KSB0byBhbgoJICAgICAgZXh0ZXJuYWwgcHJvZ3JhbToKCSAgICAgIAoJICAgICAgICAvLyBVcHBlcmNhc2UgYWxsIChhbmQgb25seSkgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCAnaScKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnL15pL3twcmludCB0b3VwcGVyKCQxKX0nIDw8PClzIikgIiI7ICAgCgkgICAgICAgCgkgICAgICAgIGludCBpbXBvcnRlZCgpIC0+IElNUE9SVEVEOwoJICAgICAgICBpbnQgaGVsbG8oKSAgICAtPiBoZWxsbwoKCSAgICAgIE5vdGUgdGhhdCBpZiB0aGUgJ2NvbW1hbmQnIGVuY29kZXIgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHN3aWcKCSAgICAgIHVuZGVyc3RhbmRzIHRoYXQgbm8gcmVuYW1lIGlzIG5lY2Vzc2FyeS4KCgkgICAgICBBbHNvIG5vdGUgdGhhdCAlcmVuYW1lICdwYXNzZXMnIHRoZSBtYXRjaGVkIG5hbWUuIEZvciBleGFtcGxlLCBpbgoJICAgICAgdGhpcyBjYXNlCgoJICAgICAgICBuYW1lc3BhY2UgbnMxIHsKCQkgIGludCBmb28oKTsKCQl9CgoJICAgICAgICBuYW1lc3BhY2UgbnMyIHsKCQkgIGludCBiYXIoKTsKCQl9CgoJICAgICAgdGhlIGV4dGVybmFsIHByb2dyYW0gb25seSByZWNlaXZlcyAiZm9vIiBhbmQgImJhciIuIElmIG5lZWRlZCwKCSAgICAgIGhvd2V2ZXIsIHlvdSBjYW4gcmVxdWVzdCB0aGUgJ2Z1bGxuYW1lJyAKCSAgICAgICAJCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJ2F3ayAnL25zMTo6L3tsPXNwbGl0KCQxLGEsIjo6Iik7IHByaW50IHRvdXBwZXIoYVtsXSl9JycgPDw8KXMiLGZ1bGxuYW1lPTEpICIiOyAgIAogICAgICAgICAgICAgICAgCgkJbnMxOjpmb28gLT4gRk9PCgkJbnMyOjpiYXIgLT4gYmFyCQoJCgkgICAgLSBNaXhpbmcgZW5jb2RlcnMgYW5kIG1hdGNoaW5nOiBvZiBjb3Vyc2UsIHlvdSBjYW4gZG8gbWl4IGNvbW1hbmRzCgkgICAgICBhbmQgbWF0Y2ggZmllbGRzLCBmb3IgZXhhbXBsZToKCgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGZuY3M+KSIsbWF0Y2g9ImNkZWNsIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zPikiLG1hdGNoPSJlbnVtaXRlbSIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcyBpbnNpZGUgYSBjbGFzcz4pIixtYXRjaD0iZW51bWl0ZW0iLAoJCSAgICAgICAgbWF0Y2gkcGFyZW50Tm9kZSRwYXJlbnROb2RlJG5vZGVUeXBlPSJjbGFzcyIpICIiOwoJCQoJICAgICAgVXNlICJzd2lnIC1kdW1wX3BhcnNlX21vZHVsZSIgdG8gc2VlIHRoZSBhdHRyaWJ1dGUgbmFtZXMgeW91IGNhbiB1c2UgdG8KCSAgICAgIG1hdGNoIGEgc3BlY2lmaWMgY2FzZS4KCQogICAgICAgICAgICAtICdzb3VyY2VmbXQnIGFuZCAndGFyZ2V0Zm10Jzogc29tZXRpbWVzIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgJ3NvdXJjZScgbmFtZSBiZWZvcmUgY29tcGFyaW5nLCBmb3IgZXhhbXBsZQoKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiKSAiZW1wdHkiOwoKCSAgICAgIHRoZW4gaWYgeW91IGhhdmUKCgkgICAgICAgIGludCBFbXB0eSgpOyAgLy8gIkVtcHR5IiBpcyB0aGUgc291cmNlIAoJCQoJICAgICAgeW91IHdpbGwgZ2V0IHRoZSBrZXl3b3JkIHdhcm5pbmcgc2luY2UgJ0VtcHR5JyB3aWxsIGJlCgkgICAgICBsb3dlciBjYXNlZCwgdmlhIHRoZSBzb3VyY2VmbXQ9IiUobG93ZXIpcyIgb3B0aW9uLAoJICAgICAgYmVmb3JlIGJlZW4gY29tcGFyZWQgdG8gdGhlICd0YXJnZXQnICJlbXB0eSIuCgoJICAgICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCAndGFyZ2V0Zm10JyBvcHRpb24gdG8gcHJvY2VzcyB0aGUKCSAgICAgICd0YXJnZXQnIGJlZm9yZSBjb21wYXJpbmcuCgoJICAgIC0gY29tcGxlbWVudGluZyAnbWF0Y2gnOiB5b3UgY2FuIHVzZSAnbm90bWF0Y2gnLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIixub3RtYXRjaD0ibmFtZXNwYWNlIikgImVtcHR5IjsKCgkgICAgICBoZXJlLCB0aGUgbmFtZSB3YXJuaW5nIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIHN5bWJvbHMgZXhjZXB0IG5hbWVzcGFjZXMuCgkgICAgCiAgICAgIAkKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIGdjaiBhbmQgSmF2YSAtPiA8dGFyZ2V0IGxhbmd1YWdlPiBtZWNoYW5pc20uCgoJICAgIFNlZQlleGFtcGxlcyBpbjogIAoJICAKCQlFeGFtcGxlcy9weXRob24vamF2YQoJCUV4YW1wbGVzL3J1YnkvamF2YQoJCUV4YW1wbGVzL3RjbC9qYXZhCgogICAgICAgICAgICB0byBzZWUgaG93IHRvIHVzZSBnY2orc3dpZyB0byBleHBvcnQgamF2YSBjbGFzc2VzIGludG8KICAgICAgICAgICAgcHl0aG9uL3J1YnkvdGNsLgoJICAgIAoJICAgIFRoZSBpZGVhIGlzIHRvIHB1dCBhbGwgdGhlIGNvbW1vbiBjb2RlIGZvciBnY2ogaW5zaWRlCgoJICAgICAgICAgIExpYi9nY2oKCiAgICAgICAgICAgIGFuZCBsb2NhbGl6ZSBzcGVjaWZpYyB0eXBlcyBzdWNoIGFzIGpzdHJpbmcsIGFzIGNhbiBiZSBmb3VuZAogICAgICAgICAgICBpbgoKCSAgICAgICAgIExpYi9weXRob24vanN0cmluZy5pCgkgICAgICAgICBMaWIvcnVieS9qc3RyaW5nLmkKCSAgICAgICAgIExpYi90Y2wvanN0cmluZy5pCgogICAgICAgICAgICBVc2luZyB0aGUgVVRMLCB0aGlzIGlzIHZlcnkgZWFzeSwgYW5kIHRoZSBwZXJsIHZlcnNpb24gZm9yCiAgICAgICAgICAgIGpzdHJpbmcuaSB3aWxsIGJlIG5leHQuCgkJIAkgICAgCgoxMi8yOS8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlIGNvcHljdG9yIGZlYXR1cmUvZGlyZWN0aXZlL29wdGlvbiB0byBlbmFibGUgdGhlIGF1dG9tYXRpYwoJICAgIGdlbmVyYXRpb24gb2YgY29weSBjb25zdHJ1Y3RvcnMuIFVzZSBhcyBpbjoKCgkgICAgICAlY29weWN0b3IgQTsKCgkgICAgICBzdHJ1Y3QgQSB7CgogICAgICAgICAgICAgIH07CgoJICAgIHRoZW4gdGhpcyB3aWxsIHdvcmsKCgkgICAgICBhMSA9IEEoKTsKCSAgICAgIGEyID0gQShhMSk7CgoJICAgIEFsc28sIHNpbmNlIGl0IGlzIGEgZmVhdHVyZSwgaWYgeW91IGp1c3QgdHlwZQoKCSAgICAgICVjb3B5Y3RvcjsKCgkgICAgdGhhdCB3aWxsICBlbmFibGUgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIGZvciBhbGwgdGhlCgkgICAgY2xhc3Nlcy4gSXQgaXMgYWxzbyBlcXVpdmFsZW50IHRvCgoJICAgICAgIHN3aWcgLWNvcHljdG9yIC1jKysgLi4uCgoJICAgIE5vdGVzOiAKCgkgICAgMS4tIFRoZSBmZWF0dXJlIG9ubHkgd29ya3MgaW4gQysrIG1vZGUuCgoJICAgIDIuLSBUaGUgYXV0b21hdGljIGNyZWF0aW9uIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwKCSAgICAgICAgdXN1YWxseSBwcm9kdWNlIG92ZXJsb2FkaW5nLiBIZW5jZSwgaWYgdGhlIHRhcmdldAoJICAgICAgICBsYW5ndWFnZSBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRpbmcsIGEgc3BlY2lhbCBuYW1lCgkgICAgICAgIHdpbGwgYmUgdXNlZCAoQV9jb3B5KS4KCSAgICAKCSAgICAzLi0gRm9yIHRoZSBvdmVybG9hZGluZyByZWFzb25zIGFib3ZlLCBpdCBpcyBwcm9iYWJseSBub3QKICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgZmxhZyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IGFyZQoJCXVzaW5nIGtleXdvcmRzIGluIFB5dGhvbi4KCiAgICAgICAgICAgIDQuLSBUaGUgY29weWN0b3IgYXV0b21hdGljIG1lY2hhbmlzbSBmb2xsb3dzIG1vcmUgb3IgbGVzcwoJICAgICAgICB0aGUgc2FtZSBydWxlcyBhcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBtZWNoYW5pc20sCgkgICAgICAgIGkuZS4sIGEgY29weSBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGUKCSAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3Qgb3IgaWYgdGhlcmUgaXMgYSBwZXJ0aW5lbnQgbm9uLXB1YmxpYyAKCQljb3B5IGN0b3IgaW4gdGhlIGNsYXNzIG9yIGl0cyBoaWVyYXJjaHkuCgoJCUhlbmNlLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHlvdSB0byBjb21wbGV0ZSB0aGUKCQljbGFzcyBkZWNsYXJhdGlvbiB3aXRoIHRoZSBwcm9wZXIgbm9uLXB1YmxpYyBjb3B5IGN0b3IKCQl0byBhdm9pZCBhIHdyb25nIGNvbnN0cnVjdG9yIGFkZGl0aW9uLgoJCQogICAgICAgICAgLSBGaXggZmVhdHVyZXMvcmVuYW1lIGZvciB0ZW1wbGF0ZXMgY3Rvci9kdG9yIGFuZCBvdGhlcgogICAgICAgICAgICB0aGluZ3MgYXJvdW5kIHdoaWxlIGFkZGluZyB0aGUgY29weWN0b3IgbWVjaGFuaXNtLgoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbWF0Y2gnIG9wdGlvbiB0byB0eXBlbWFwcy4gQXNzdW1lIHlvdSBoYXZlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCgkgICAgdGhlbiBpZiB5b3UgZG8KIAoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQoKCSAgICBzd2lnIHdpbGwgJ292ZXJsb2FkIHRoZSAnaW4nIHR5cGVtYXAsIGJ1dCB0aGUgJ2ZyZWVhcmcnIAoJICAgIHR5cGVtYXAgd2lsbCBiZSBhbHNvIGFwcGxpZWQsIGV2ZW4gd2hlbiB0aGlzIGlzIHdyb25nLiBUaGUgb2xkCgkgICAgc29sdXRpb25zIGlzIHRvIHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KICAJICAgICAgJXR5cGVtYXAoZnJlZWFnKSBBICogIiI7CgoJICAgIG92ZXJsb2FkICdmcmVlYXJnJyB3aXRoIGFuIGVtcHR5IGRlZmluaXRpb24uCgoJICAgIFRoZSBwcm9ibGVtIGlzLCBob3dldmVyLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB5b3UgbmVlZAoJICAgIHRvIGRvIHRoYXQgdW50aWwgeW91IHN0YXJ0IGdldHRpbmcgYnJva2VuIEMrKyBjb2RlLCBvcgoJICAgIHdvcnNlLCBicm9rZW4gcnVudGltZSBjb2RlLgoKCSAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBpbmZhbW91cyAndHlwZWNoZWNrJyB0eXBlbWFwLAoJICAgIHdoaWNoIGFsd2F5cyBjb25mdXNlcyBwZW9wbGUsIHNpbmNlIHRoZSBmaXJzdCB0aGluZyB5b3UgZG8KCSAgICBpcyB0byBqdXN0IHdyaXRlIHRoZSAnaW4nIHR5cGVtYXAuCgoJICAgIFRoZSAnbWF0Y2gnIG9wdGlvbiBzb2x2ZXMgdGhlIHByb2JsZW0sIGFuZCBpZiBpbnN0ZWFkIHlvdSB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZyxtYXRjaD0iaW4iKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCSAgICAgICV0eXBlbWFwKHR5cGVjaGVjayxtYXRjaD0iaW4iLHByZWNlZGVuY2UuLi4pIFNXSUdUWVBFICogey4uLn0KCSAgICAKCSAgICBpdCB3aWxsIHRlbGwgc3dpZyB0byBhcHBseSB0aGUgJ2ZyZWVhcmcvdHlwZWNoZWNrJwoJICAgIHR5cGVtYXBzIG9ubHkgaWYgdGhleSAnbWF0Y2gnIHRoZSB0eXBlIG9mIHRoZSAnaW4nCgkgICAgdHlwZW1hcC4gVGhlIHNhbWUgY2FuIGJlIGRvbmUgd2l0aCBvdGhlciB0eXBlbWFwcyBhczoKCgkgICAgICAldHlwZW1hcChkaXJlY3Rvcm91dCkgU1dJR1RZUEUgKiB7Li4ufQoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JmcmVlLG1hdGNoPSJkaXJlY3Rvcm91dCIpIFNXSUdUWVBFICogey4uLn0KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi9tb2RlL2ZlYXR1cmUgdG8gdHJlYXQgbWVtYmVyCgkgICAgdmFyaWFibGVzIGluIGEgbW9yZSBuYXR1cmFsIHdheSwgaWUsIHNpbWlsYXIgdG8gdGhlIGdsb2JhbAoJICAgIHZhcmlhYmxlIGJlaGF2aW9yLgoKCSAgICBZb3UgY2FuIHVzZSBpdCBpbiBhIGdsb2JhbCB3YXkgdmlhIHRoZSBjb21tYW5kIGxpbmUKCgkgICAgICBzd2lnIC1uYXR1cmFsdmFyIC4uLgoKCSAgICBvciB0aGUgbW9kdWxlIG1vZGUgb3B0aW9uCiAKCSAgICAgICVtb2R1bGUobmF0dXJhbHZhcj0xKQoKCSAgICBib3RoIGZvcm1zIG1ha2Ugc3dpZyB0cmVhdCBhbGwgdGhlIG1lbWJlciB2YXJpYWJsZXMgaW4gdGhlCgkgICAgc2FtZSB3YXkgaXQgdHJlYXRzIGdsb2JhbCB2YXJpYWJsZXMuIAoKCSAgICBBbHNvLCB5b3UgY2FuIHVzZSBpdCBpbiBhIGNhc2UgYnkgY2FzZSBhcHByb2FjaCBmb3IKCSAgICBzcGVjaWZpYyBtZW1iZXIgdmFyaWFibGVzIHVzaW5nIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAlbmF0dXJhbHZhciBCYXI6OnM7CgkgICAgCgkgICAgVGhlbiwgaW4gdGhlIGZvbGxvd2luZyBjYXNlIGZvciBleGFtcGxlOgoKCSAgICAgICBzdGQ6OnN0cmluZyBzOwoJICAgICAgIHN0cnVjdCBCYXIgewoJCSBzdGQ6OnN0cmluZyBzOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgeW91IGNhbiBkbzogIAoKCSAgICAgICBiID0gQmFyKCkKCSAgICAgICBiLnMgPSJoZWxsbyIKCSAgICAgICBjdmFyLnMgPSAiaGVsbG8iCgkgICAgICAgCgkgICAgICAgaWYgKGIucyAhPSBjdmFyLnMpOgoJICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgoKCQkgIAogICAgICAgICAgICBUaGlzIGlzIHZhbGlkIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIHRoZQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBmb3JjaW5nIHRoZSB1c2Ugb2YgdGhlIAogICAgICAgICAgICBjb25zdCBTV0lHVFlQRSYgKEMrKykvU1dJR1RZUEUgKEMpIHR5cGVtYXBzIGZvciB0aGUKICAgICAgICAgICAgZ2V0L3NldCBtZXRob2RzIGluc3RlYWQgb2YgdGhlIFNXSUdUWVBFICogdHlwZW1hcHMuCgkgICAgSGVuY2UsIGZvciAnbmF0dXJhbHZhcicgdG8gd29yaywgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UKCSAgICBtdXN0IGltcGxlbWVudCAndHlwZW1hcChpbi9vdXQpIGNvbnN0IFR5cGUmJyBwcm9wZXJseS4KCgkgICAgVGhlICduYXR1cmFsdmFyJyBvcHRpb24gcmVwbGFjZXMgb3IgbWFrZXMgd29ya2Fyb3VuZHMgc3VjaCAgYXM6CgkgICAgCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgdW5uZWNlc3NhcnkuCgoJICAgIE5vdGUxOiBJZiB5b3VyIGludGVyZmFjZSBoYXMgb3RoZXIga2luZHMgb2Ygd29ya2Fyb3VuZHMgdG8KCSAgICBkZWFsIHdpdGggdGhlIG9sZCAndW5uYXR1cmFsJyB3YXkgdG8gZGVhbCB3aXRoIG1lbWJlcgoJICAgIHZhcmlhYmxlcyAocmV0dXJuaW5nL2V4cGVjdGluZyBwb2ludGVycyksIHRoZQoJICAgICduYXR1cmFsdmFyJyBvcHRpb24gY291bGQgYnJlYWsgdGhlbS4KCSAgICAKCSAgICBOb3RlMjogdGhlIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHVubmFtZWQgdHlwZXMsIHN1Y2gKCSAgICBhcyB1bm5hbWVkIG5lc3RlZCB1bmlvbnMuCgkgICAgCgkgIAoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgbW9yZSAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcyBmb3IgdGhlIHR5cGVtYXAKICAgICAgICAgICAgbGlicmFyaWVzLgoKCSAgICBJbiB0aGUgcGFzdCwgZm9yIHNjcmlwdGluZyBsYW5ndWFnZXMsIHlvdSB3b3VsZCBkbyBjaGVja2luZyBzb21ldGhpbmcgbGlrZToKCgkgICAgICBpZiAoQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpICE9IC0xKSB7CgkgICAgICAgIC8vIHN1Y2Nlc3MKICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAvLyBlcnJvcgoJICAgICAgfQoKCSAgICBOb3cgdGhlIHJlc3VsdCBzdGF0ZSBjYW4gY2FycnkgbW9yZSBpbmZvcm1hdGlvbiwKCSAgICBpbmNsdWRpbmc6CgoJICAgICAgLSBFcnJvciBzdGF0ZTogbGlrZSB0aGUgb2xkIC0xLzAsIGJ1dCB3aXRoIGVycm9yIGNvZGVzIGZyb20gc3dpZ2Vycm9ycy5zd2cuCgoJICAgICAgICAgaW50IHJlcyA9IENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKTsKCQkgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CgkJICAgLy8gc3VjY2VzcyBjb2RlCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCQkgICBTV0lHX0Vycm9yKHJlcyk7IC8vIHJlcyBjYXJyaWVzIHRoZSBlcnJvciBjb2RlCiAgICAgICAgICAgICAgICAgfQoKCSAgICAgIC0gQ2FzdCByYW5rOiB3aGVuIHJldHVybmluZyBhIHNpbXBsZSBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICBjb252ZXJzaW9uLCB5b3UganVzdCByZXR1cm4gU1dJR19PSywgYnV0IGlmIHlvdSBuZWVkCiAgICAgICAgICAgICAgICB0byBkbyBhICdjYXN0JywgeW91IGNhbiBhZGQgdGhlIGNhc3RpbmcgcmFuaywgaWU6CgkJCgkJICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwoJCSAgICByZXR1cm4gU1dJR19PSzsKCQkgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IChkb3VibGUpIFB5SW50X0FzTG9uZyhvYmopOwoJCSAgICByZXR1cm4gU1dJR19BZGRDYXN0KFNXSUdfT0spOwkJICAgIAogICAgICAgICAgICAgICAgICB9CgkJCgkJbGF0ZXIsIHRoZSBjYXN0aW5nIHJhbmsgaXMgdXNlZCB0byBwcm9wZXJseSBkaXNwYXRjaAoJCXRoZSBvdmVybG9hZGVkIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZS4gVGhpcyBvZiBjb3Vyc2UKCQlyZXF1aXJlcyB5b3VyIGxhbmd1YWdlIHRvIHN1cHBvcnQgYW5kIHVzZSB0aGUgbmV3CgkJZGlzcGF0Y2ggY2FzdC9yYW5rIG1lY2hhbmlzbSAoTm93IG1haW5seSBzdXBwb3J0ZWQgaW4KCQlwZXJsIGFuZCBweXRob24sIGFuZCBlYXNpbHkgZXhwYW5kYWJsZSB0byBydWJ5IGFuZCB0Y2wpLgoJICAgICAgCgkgIC0gW1VUTF0gQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMuCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9uIG1lY2hhbmlzbSwgd2hpY2gKICAgICAgICAgICAgcmVxdWlyZWQgc29tZSBtb2RpZmljYXRpb25zIGluIHBhcnNlci55ICh0byByZWNvZ25pemUKICAgICAgICAgICAgJ2V4cGxpY2l0JykgYW5kIG92ZXJsb2FkLmN4eCAodG8gcmVwbGFjZSAkaW1wbGljaXRjb252IGFzCiAgICAgICAgICAgIG5lZWRlZCkuCgkgICAgCgkgICAgU3RpbGwsIHJlYWwgc3VwcG9ydCBpbiBlYWNoIHRhcmdldCBsYW5ndWFnZSByZXF1aXJlcyBlYWNoCgkgICAgdGFyZ2V0IGxhbmd1YWdlIHRvIGJlIG1vZGlmaWVkLiBQeXRob24gcHJvdmlkZXMgYW4gZXhhbXBsZSwKICAgICAgICAgICAgc2VlIGJlbG93LgoKCgkgIC0gQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBDKysgaW1wbGljaXQgY29udmVyc2lvbnMsIGllLCBpZiB5b3UKICAgICAgICAgICAgaGF2ZQoKCSAgICAgICAgJWltcGxpY2l0Y29udiBBOwoKCSAgICAgICAgc3RydWN0IEEgewoJCSAgIGludCBpaTsKCQkgICBBKCkge2lpID0gMTt9CgkJICAgQShpbnQpIHtpaSA9IDI7fQoJCSAgIEEoZG91YmxlKSB7aWkgPSAzO30KCQkgICBleHBsaWNpdCBBKGNoYXIgKnMpIHtpaSA9IDQ7fQoJCX07CgkJCgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoKICAgICAgICAgICAgeW91IGNhbiBjYWxsOgoKCSAgICAgICAgYSA9IEEoKQoJICAgICAgICBhaSA9IEEoMSkKCSAgICAgICAgYWQgPSBBKDEuMCkKCSAgICAgICAgYXMgPSBBKCJoZWxsbyIpCgkJCgkJIyBvbGQgZm9ybXMKCSAgICAgICAgZ2V0KGEpICAtPiAxCgkgICAgICAgIGdldChhaSkgLT4gMgoJICAgICAgICBnZXQoYWQpIC0+IDMKCSAgICAgICAgZ2V0KGFzKSAtPiA0CgkJCgkJI2ltcGxpY2l0IGNvbnZlcnNpb25zCgkgICAgICAgIGdldCgxKSAgICAgICAtPiAyCgkgICAgICAgIGdldCgxLjApICAgICAtPiAzCgkgICAgICAgIGdldCgiaGVsbG8iKSAtPiBFcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCiAgICAgICAgICAgIEFsc28sIGFzIGluIEMrKywgbm93IGltcGxpY2l0IGNvbnZlcnNpb25zIGFyZSBzdXBwb3J0ZWQgaW4KICAgICAgICAgICAgdmFyaWFibGUgYXNzaWdtZW50cywgYW5kIGlmIHlvdSBoYXZlOgoKCSAgICAgIEEgZ2E7CgkgICAgICBzdHJ1Y3QgQmFyIHsKCSAgICAgICAgQSBhOwogICAgICAgICAgICAgIH07CgoJICAgIHlvdSBjYW4gZG86CgoJICAgICAgY3Zhci5nYSA9IEEoMSkKCSAgICAgIGN2YXIuZ2EgPSAxCgkgICAgICBjdmFyLmdhID0gMS4wCgkgICAgICBjdmFyLmdhID0gQSgiaGVsbG8iKSAKCSAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICAgIGIgPSBCYXIoKQoJICAgICAgYi5hID0gQSgiaGVsbG8iKQoJICAgICAgYi5hID0gMQoJICAgICAgYi5hID0gMS4wCgkgICAgICBiLmEgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICBOb3RlIHRoYXQgdGhlIGxhc3QgY2FzZSwgYXNzaWduaW5nIGEgbWVtYmVyIHZhciBkaXJlY3RseSwgCgkgICAgYWxzbyByZXF1aXJlcyB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi4KCgkgICAgVGhpcyBzdXBwb3J0IG5vdyBtYWtlcyB0aGUgb2xkICclaW1wbGljaXQnIG1hY3JvLCB3aGljaAoJICAgIHdhcyBmb3VuZCBpbiAnaW1wbGljaXQuaScgYW5kIGl0IHdhcyBmcmFnaWxlIGluIG1hbnkgd2F5cywKCSAgICBvYnNvbGV0ZSwgYW5kIHlvdSBzaG91bGQgdXNlIHRoZSBuZXcgJyVpbXBsaWNpdGNvbnYnCgkgICAgZGlyZWN0aXZlIGluc3RlYWQuCgoJICAgIE5vdGUgdGhhdCB3ZSBmb2xsb3cgdGhlIEMrKyBjb252ZW50aW9ucywgaWUsIGluIHRoZQoJICAgIGZvbGxvd2luZyB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBhbGxvd2VkOgoKCQlpbnQgZ2V0KEEgYSkge3JldHVybiBhLmlpO30KCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgkgICAgCgkgICAgYnV0IG5vdCBpbiB0aGVzZSBjYXNlczoKCgkJaW50IGdldChBICphKSB7cmV0dXJuIGEtPmlpO30KCQlpbnQgZ2V0KEEmIGEpIHtyZXR1cm4gYS5paTt9CgkJCgkgICAgQWxzbywgaXQgd29ya3MgZm9yIGRpcmVjdG9yIG1ldGhvZHMgdGhhdCByZXR1cm4gYSBieSB2YWx1ZQoJICAgIHJlc3VsdCwgaWUsIHRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSBnZXRfYSgpID0gMDsKCgkJZGVmIGdldF9hKHNlbGYpOgoJCSAgIHJldHVybiAxCgogICAgICAgICAgICBidXQgbm90IGluIHRoaXMgY2FzZToKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSogZ2V0X2EoKSA9IDA7CgkgICAgCgkgIE5vdGVzOgoKCSAgLSB0aGUgaW1wbGljaXRjb252IG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCBieSBkaXJlY3RseQoJICAgIGNhbGxpbmcvZGlzcGF0Y2hpbmcgdGhlIHB5dGhvbiBjb25zdHJ1Y3RvciwgdHJpZ2dlcmluZyBhCgkgICAgY2FsbCB0byB0aGUgX19pbml0X19tZXRob2QuIEhlbmNlLCBpZiB5b3UgZXhwYW5kZWQgdGhlCgkgICAgX19pbml0X18gbWV0aG9kLCBsaWtlIGluOgoKCSAgICAgICAgY2xhc3MgQToKCQkgICBkZWYgX19pbml0X18oc2VsZixhcmdzKToKCQkgICAgICA8c3dpZyBjb2RlPgoJCSAgICAgIDxteSBjb2RlIGhlcmU+CgogICAgICAgICAgICB0aGVuICdteSBjb2RlJyB3aWxsIGFsc28gYmUgZXhlY3V0ZWQuCgkgICAgCgkgIC0gU2luY2UgdGhlICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIGlzIGEgU1dJRyBmZWF0dXJlLCBpZiB5b3UgdHlwZToKCSAgICAKICAJICAgICAgICVpbXBsaWNpdGNvbnY7ICAKCgkgICAgdGhhdCB3aWxsIGVuYWJsZSBpbXBsaWNpdCBjb252ZXJzaW9uIGZvciBhbGwgdGhlIGNsYXNzZXMgaW4KCSAgICB5b3VyIG1vZHVsZS4KCgkgICAgQnV0IGlmIHlvdSBhcmUgd29ycmllZCBhYm91dCBwZXJmb3JtYW5jZSwgbWF5YmUgdGhhdCB3aWxsIGJlCgkgICAgdG9vIG11Y2gsIGVzcGVjaWFsbHkgaWYgeW91IGhhdmUgb3ZlcmxvYWRlZCBtZXRob2RzLCBzaW5jZQoJICAgIHRvIHJlc29sdmUgdGhlIGRpc3BhdGNoaW5nIHByb2JsZW0sIHB5dGhvbiB3aWxsIGVmZWN0aXZlbHkKCSAgICB0cnkgdG8gY2FsbCBhbGwgdGhlIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhcyBuZWVkZWQuCgoJICAtIEZvciB0aGUgc2FtZSByZWFzb24sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UKICAgICAgICAgICAgdGhlIG5ldyAnY2FzdG1vZGUnIHdoZW4gbWl4aW5nIGltcGxpY2l0IGNvbnZlcnNpb24gYW5kCiAgICAgICAgICAgIG92ZXJsb2FkaW5nLgoKCSAtIFtweXRob25dIFRoZSAlaW1wbGljaXQgZGlyZWN0aXZlIGlzIGRlY2xhcmVkIG9ic29sZXRlLCBhbmQKICAgICAgICAgICB5b3Ugc2hvdWxkIHVzZSAlaW1wbGljaXRjb252IGluc3RlYWQuIElmIHlvdSBpbmNsdWRlCgkgICB0aGUgaW1wbGljaXQuaSBmaWxlLCBhIHdhcm5pbmcgd2lsbCByZW1pbmQgeW91IG9mIHRoaXMuCgoJICAgTm90ZTogU2luY2UgJWltcGxpY2l0IGlzIGZyYWdpbGUsIGp1c3QgcmVwbGFjaW5nIGl0IGJ5CgkgICAlaW1wbGljaXRjb252IGNvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGJlaGF2aW9yLiBIZW5jZSwgd2UKCSAgIGRvbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGZyb20gdG8gdGhlIG90aGVyLCBhbmQgdGhlIHVzZXIKCSAgIG11c3QgbWlncmF0ZSB0byB0aGUgbmV3ICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIG1hbnVhbGx5LgoKCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgTW9kaWZ5IHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHRvIHVzZSBzdGQ6OnZlY3Rvcjo6dmFsdWVfdHlwZSBhcyB0aGlzIGlzCiAgICAgICAgICAgIGNsb3NlciB0byB0aGUgcmVhbCBTVEwgZGVjbGFyYXRpb25zIGZvciBzb21lIG1ldGhvZHMsIGVnIGZvciBwdXNoX2JhY2soKS4KICAgICAgICAgICAgRml4ZXMgc29tZSBjb21waWxhdGlvbiBlcnJvcnMgZm9yIHNvbWUgY29tcGlsZXJzIGVnIHdoZW4gdGhlIHRlbXBsYXRlZAogICAgICAgICAgICB0eXBlIGlzIGEgcG9pbnRlci4KCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBzdGQ6OnZlY3RvciBpbXByb3ZlbWVudHMgLSBhIGZldyBtb3JlIG1ldGhvZHMgYXJlIHdyYXBwZWQgYW5kIHNwZWNpYWxpemF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGUgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yIG1hY3JvIGlzIG5vIGxvbmdlciBuZWVkZWQgKGEKICAgICAgICAgICAgd2FybmluZyBpcyBpc3N1ZWQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSBpdCkuCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEFkZCBpbiBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcy4gVGhpcyBhbHNvIGVuYWJsZXMgb25lIHRvIGVhc2lseSB3cmFwCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHdoZXJlIFQgaXMgYSBwb2ludGVyLgoKMTIvMjQvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBUaGUgY2ZmaSBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBGdWxseSBzdXBwb3J0cyBDLCBidXQgcHJvdmlkZXMgbGltaXRlZCBzdXBwb3J0cyBmb3IgQysrLCBpbgogICAgICAgICAgICAgICBwYXJ0aWN1bGFyIEMrKyBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgYW5kIG92ZXJsb2FkaW5nIG5lZWRzIHRvCiAgICAgICAgICAgICAgIGJlIHdvcmtlZCB1cG9uLiAKCjEyLzIzLzIwMDU6IG1tYXR1cwoJICAgIFtweXRob25dIEFkZCB0aGUgY2FzdG1vZGUgdGhhdCBhbGxvd3MgdGhlIHB5dGhvbgoJICAgIHR5cGUgY2FzdGluZyB0byBvY2N1ci4KCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlICdpbnQgZm9vKGludCknLCBub3cKCSAgICAKCSAgICAgIGNsYXNzIEFpKCk6CgkgICAgICAgICBkZWYgX19pbml0X18oc2VsZix4KTogCgkJICAgIHNlbGYueCA9IHgKCSAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOiAKCQkgICAgcmV0dXJuIHNlbGYueAoKCSAgICAgIGZvbygxKSAgIC8vIE9rCgkgICAgICBmb28oMS4wKSAvLyBPawoJICAgICAgZm9vKDEuMykgLy8gRXJyb3IKCSAgICAgIGEgPSBBaSg0KQogICAgICAgICAgICAgIGZvbyhhaSkgIC8vIE9rCgogICAgICAgICAgICBUaGUgY2FzdG1vZGUsIHdoaWNoIGNhbiBiZSBlbmFibGVkIGVpdGhlciB3aXRoIHRoZQogICAgICAgICAgICAnLWNhc3Rtb2RlJyBvcHRpb24gb3IgdGhlICVtb2R1bGUoImNhc3Rtb2RlIikgb3B0aW9uLCB1c2VzCiAgICAgICAgICAgIHRoZSBuZXcgY2FzdC9yYW5rIGRpc3BhdGNoIG1lY2hhbmlzbS4gSGVuY2UsIG5vdyBpZiB5b3UKICAgICAgICAgICAgaGF2ZSAnaW50IGZvbyhpbnQpOyBpbnQgZm9vKGRvdWJsZSk7JywgdGhlIGZvbGxvd2luZyB3b3JrcwogICAgICAgICAgICBhcyBleHBlY3RlZDoKCgkgICAgICBmb28oMSkgICAtPiBmb28oaW50KQoJICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKCSAgICAgIGFpID0gQWkoNCkKCSAgICAgIGZvbyhhaSkgIC0+IGZvbyhpbnQpCgoJICAgIE5vdGUxOiB0aGUgJ2Nhc3Rtb2RlJyBjb3VsZCBkaXNydXB0IHNvbWUgc3BlY2lhbGl6ZWQKCSAgICB0eXBlbWFwcy4gSW4gcGFydGljdWxhciwgdGhlICJpbXBsaWNpdC5pIiBsaWJyYXJ5IHNlZW1zIHRvCgkgICAgaGF2ZSBwcm9ibGVtIHdpdGggdGhlIGNhc3Rtb2RlLiBCdXQgYmVzaWRlcyB0aGF0IG9uZSwgdGhlCgkgICAgZW50aXJlIHRlc3Qtc3VpdGUgY29tcGlsZXMgZmluZSB3aXRoIGFuZCB3aXRob3V0IHRoZQoJICAgIGNhc3Rtb2RlLgoKIAkgICAgTm90ZTI6IHRoZSBjYXN0IG1vZGUgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCB0aGUgZmFzdAoJICAgIGRpc3BhdGNoIG1vZGUsIGllLCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gaGFzIG5vIGVmZmVjdAoJICAgIHdoZW4gdGhlIGNhc3QgbW9kZSBpcyBzZWxlY3RlZC4gVGhlIHBlbmFsdGllcywgaG93ZXZlciwKCSAgICBhcmUgbWluaW11bSBzaW5jZSB0aGUgY2FzdCBkaXNwYXRjaCBjb2RlIGlzIGFscmVhZHkgYmFzZWQKCSAgICBvbiB0aGUgc2FtZSBmYXN0IGRpc3BhdGNoIG1lY2hhbmlzbS4KCgkgICAgU2VlIHRoZSBmaWxlIG92ZXJsb2FkX2Rpc3BhdGNoX2Nhc3RfcnVubWUucHkgZmlsZSBmb3IKCSAgICBuZXcgY2FzZXMgYW5kIGV4YW1wbGVzLgoKMTIvMjIvMjAwNTogbW1hdHVzCgkgICAgQWRkIHRoZSBjYXN0IGFuZCByYW5rIG1lY2hhbmlzbSB0byBkaXNwYXRjaCBvdmVybG9hZGluZwoJICAgIGZ1bmN0aW9ucy4gVGhlIFVURiBzdXBwb3J0cyBpdCBub3csIGJ1dCBmb3IgZWFjaCBsYW5ndWFnZQoJICAgIGl0IG11c3QgYmUgZGVjaWRlZCBob3cgdG8gaW1wbGVtZW50IGFuZC9vciB3aGVuIHRvIHVzZSBpdC4KCgkgICAgW3BlcmxdIE5vdyBwZXJsIHVzZXMgdGhlIG5ldyBjYXN0IGFuZCByYW5rIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCB3aGljaCBzb2x2ZXMgYWxsIHRoZSBwYXN0IHByb2JsZW1zIGtub3duIAoJICAgIGluIHBlcmwsIHN1Y2ggYXMgdGhlIG9sZCAnKyAxJyBwcm9ibGVtOgoKCSAgICAgICAgaW50IGZvbyhpbnQpOwoJICAgIAoJCSRuID0gMQogICAgICAgICAgICAgICAgJG4gPSAkbiArIDEKICAgICAgICAgICAgICAgICRyID0gZm9vKG4pCgogICAgICAgICAgICBhbHNvIHdvcmtzOgoKICAgICAgICAgICAgICAgICBmb28oMSk7CiAgICAgICAgICAgICAgICAgZm9vKCIxIik7CiAgICAgICAgICAgICAgICAgZm9vKDEuMCk7CiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKTsKCiAgICAgICAgICAgICBidXQgZmFpbHMKCiAgICAgICAgICAgICAgICAgZm9vKCJsIik7CgogICAgICAgICAgICAgYW5kIHdoZW4gb3ZlcmxvYWRpbmcgIGZvbyhpbnQpIGFuZCBmb28oZG91YmxlKTsKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBlcnJvcgoJCSBmb28oJG4pIC0+IGZvbyhpbnQpICBmb3IgZ29vZCBwZXJsIHZlcnNpb25zCgkJIGZvbygkbikgLT4gZm9vKGRvdWJsZSkgIGZvciBvbGQgYmFkIHBlcmwgdmVyc2lvbnMKCgkgICAgIHdoZW4gb3ZlcmxvYWRpbmcgZm9vKGludCksIGZvbyhjaGFyKikgYW5kIGZvbyhkb3VibGUpOgoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBmb28oY2hhciopCgogICAgICAgICAgICAgTm90ZTogSW4gcGVybCB0aGUgb2xkIGRpc3BhdGNoIG1lY2hhbmlzbSB3YXMgYnJva2VuLAogICAgICAgICAgICAgc28sIHdlIGRvbid0IHByb3ZpZGUgYW4gb3B0aW9uIHRvIGVuYWJsZSB0aGUgb2xkIG9uZQoJICAgICBzaW5jZSwgYWdhaW4sIGl0IHdhcyByZWFsbHkgcmVhbGx5IGJyb2tlbi4KCgkgICAgIFNlZSAnb3ZlcmxvYWRfc2ltcGxlX3J1bm1lLnBsJyBmb3IgbW9yZSBjYXNlcyBhbmQgdGVzdHMuCgoJICAgICBQUzogYWxsIHRoZSBvbGQga25vd24gaXNzdWVzIGFyZSBkZWNsYXJlZCByZXNvbHZlZCwgYW55CgkgICAgIG5ldyAicHJvYmxlbSIgdGhhdCBjb3VsZCBiZSBkaXNjb3ZlcmVkIGlzIGRlY2xhcmVkLCAKCSAgICAgYSBwcmlvcmksIGFzICJmZWF0dXJlcyIgb2YgdGhlIG5ldyBkaXNwYXRjaCBtZWNoYW5pc20KCSAgICAgKHVudGlsIHdlIGZpbmQgYW5vdGhlciBzb2x1dGlvbiBhdCBsZWFzdCkuCgkgICAgIAoJICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKCSAgICBBcyB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIFVURiwgc29tZSB0aGluZ3MgY291bGQKCSAgICBub3cgc3RhcnQgdG8gd29yayBhcyBleHBlY3RlZCwgYW5kIHBlb3BsZSB1c2VkIHRvIGRlYWwgb3IKCSAgICB3b3JrYXJvdW5kIHByZXZpb3VzIGJ1Z3MgcmVsYXRlZCB0byB0aGUgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIGNvdWxkIHNlZSBub3cgYSBkaWZmZXJlbmNlIGluIHBlcmwgYmVoYXZpb3IuCgoxMi8yMS8yMDA1OiBtbWF0dXMKCSAgLSBUaGUgJy1ub2RlZmF1bHQnIGZsYWcgKHByYWdtYSBhbmQgZmVhdHVyZSkgbm93IGdlbmVyYXRlcwoJICAgIGEgd2FybmluZywgYW5kIHJlY29tbWVuZHMgdG8gdXNlIHRoZSBleHBsaWNpdAoJICAgIC1ub2RlZmF1bHRjdG9yIGFuZCAgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKCSAgICBUaGUgcmVhc29uIHRvIHNwbGl0IHRoZSAnbm9kZWZhdWx0JyBiZWhhdmlvciBpcyB0aGF0LCBpbgoJICAgIGdlbmVyYWwsIGlnbm9yaW5nIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IgZ2VuZXJhdGVzIG1lbW9yeQoJICAgIGxlYWtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIEhlbmNlLCBpcyB0b28gcmlza3kganVzdCB0bwoJICAgIGRpc2FibGUgYm90aCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgoJICAgIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIElmIHlvdSBuZWVkIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciwgaXQgaXMKCSAgICBhbHNvIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICAlbm9kZWZhdWx0ZHRvciAgTXlWZXJ5U3BlY2lhbENsYXNzOwoKICAgICAgICAgICAgZm9yIHNwZWNpZmljIGNsYXNzZXMsIGFuZCBhbHdheXMgYXZvaWQgdXNpbmcgdGhlIGdsb2JhbAogICAgICAgICAgICAtbm9kZWZhdWx0IGFuZCAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoxMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgY29kZSBnZW5lcmF0aW9uIHdoZW4gdGhlIGludGVybWVkaWFyeSBjbGFzc25hbWUgaXMgY2hhbmdlZAogICAgICAgICAgICBpbiB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBmcm9tIGl0cyBkZWZhdWx0LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW1vZHVsZShqbmljbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEphdmEKICAgICAgICAgICAgICAlbW9kdWxlKGltY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBDIwoKICAgICAgICAgICAgQWRkIGluIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZS4gU2VlIGRvY3MuCgoxMi8xNy8yMDA1OiBtbWF0dXMKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1hbGlhc29iajAvLW5vYWxpYXNvYmowIG9wdGlvbnMgdG8gdXNlIHdpdGgKCSAgICAtZmFzdHVucGFjayBhbmQvb3IgLU8gYW5kIG9sZCB0eXBlbWFwcyB0aGF0IHVzZSAnb2JqMCcKCSAgICBkaXJlY3RseS4KCgkgICAgU28sIGlmIHlvdSBjb21waWxlIHlvdXIgY29kZSB1c2luZyAtTyBhbmQgZ2V0IGVycm9ycyBhYm91dAoJICAgIHRoZSB1bmRlY2xhcmVkICdvYmowJyB2YXJpYWJsZSwgcnVuIGFnYWluIHVzaW5nIAoKCQlzd2lnIC1PIC1hbGlhc29iajAgLXB5dGhvbiAuLi4uCgkgICAgCgkgICAgRm9yIG5ldyB0eXBlbWFwcywgbmV2ZXIgdXNlICdvYmowJyBkaXJlY3RseSwgaWYgbmVlZGVkLAoJICAgIHVzZSB0aGUgJyRzZWxmJyBuYW1lIHRoYXQgd2lsbCBiZSBwcm9wZXJseSAgZXhwYW5kZWQgdG8KCSAgICAnb2JqMCcgKG5vZmFzdHVucGFjaykgb3IgJ3N3aWdfb2JqWzBdJyAoZmFzdHVucGFjaykuIAogIAoJICAgIElmIHlvdSBoYXZlIG5vIGlkZWEgd2hhdCBJIGFtIHRhbGtpbmcgYWJvdXQsIGJldHRlciwgdGhhdAoJICAgIG1lYW5zIHlvdSBoYXZlIG5vIHR5cGVtYXAgd2l0aCB0aGlzIHByb2JsZW0uCgoKMTIvMTQvMjAwNTogbW1hdHVzIAkgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtZmFzdHVucGFjay8tbm9mYXN0dW5wYWNrIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgdXNlIG9mIHRoZSBpbnRlcm5hbCBVbnBhY2tUdXBsZSBtZXRob2QsIGluc3RlYWQgb2YKCSAgICBjYWxsaW5nIHRoZSBvbmUgZnJvbSB0aGUgcHl0aG9uIEMgQVBJLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLWZhc3R1bnBhY2suCgkgICAgCgoxMi8xMS8yMDA1OiBtbWF0dXMgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtcHJveHlkZWwvLW5vcHJveHlkZWwgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSBnZW5lcmF0aW9uIG9mIHByb3h5L3NoYWRvdyBfX2RlbF9fIG1ldGhvZHMsIGV2ZW4KCSAgICB3aGVuIG5vdyB0aGV5IGFyZSByZWR1bmRhbnQsIHNpbmNlIHRoZXkgYXJlIGVtcHR5LgoJICAgIEhvd2V2ZXIsIG9sZCBpbnRlcmZhY2VzIGNvdWxkIHJlbHkgb24gY2FsbGluZyB0aGVtLgoKCSAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBnZW5lcmF0ZSB0aGUgX19kZWxfXyBtZXRob2RzCgkgICAgYXMgaW4gMS4zLjI3IG9yIG9sZGVyIHN3aWcgdmVyc2lvbnMuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtbm9wcm94eWRlbC4KCjEyLzEwLzIwMDU6IG1tYXR1cyAKCSAgW1VURl0KICAgICAgICAgIC0gRml4IHVubmVjZXNzYXJ5IGNhbGxzIHRvIFNXSUdfVHlwZVF1ZXJ5IGZvciAnY2hhciAqJwoJICAgIGFuZCAnd2NoYXJfdCAqJywgcHJvYmxlbSBmb3VuZCBieSBDbGF5IEN1bHZlciB3aGlsZQoJICAgIHByb2ZpbGluZyB0aGUgUHlPZ3JlIHByb2plY3QuCgoJICAKCSAgW1B5dGhvbl0gCgkgIC0gQWRkIHRoZSAtZGlydnRhYmxlLy1ub2RpcnZ0YWJsZSB0byBlbmFibGUvZGlzYWJsZQoJICAgIGEgcHNldWRvIHZpcnR1YWwgdGFibGUgdXNlZCBmb3IgZGlyZWN0b3JzLCBhdm9pZGluZwoJICAgIHRoZSBuZWVkIHRvIHJlc29sdmUgdGhlIHB5dGhvbiBtZXRob2QgYXQgZWFjaCBjYWxsLgoJICAgIAoJICAtIEFkZCB0aGUgLXNhZmVjc3RyaW5ncy8tbm9zYWZlY3N0cmluZ3Mgb3B0aW9ucyB0bwoJICAgIGVuYWJsZS9kaXNhYmxlIHRoZSB1c2Ugb2Ygc2FmZSBjb252ZXJzaW9ucyBmcm9tIFB5U3RyaW5nCgkgICAgdG8gY2hhciAqLiBQeXRob24gcmVxdWlyZXMgeW91IHRvIG5ldmVyIGNoYW5nZSB0aGUgaW50ZXJuYWwKCSAgICBidWZmZXIgZGlyZWN0bHksIGFuZCBoZW5jZSAnc2FmZWN0cmluZ3MnIHdhcnJhbnRpZXMgdGhhdAoJICAgIGJ1dCByZXR1cm5pbmcgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBweXRob24gc3RyaW5nIGJ1ZmZlci4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHByZXZpb3VzIHJlbGVhc2VzLCBpcyB0byByZXR1cm4gYQoJICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAobm9zYWZlY3N0cmluZ3MpLCBzbywgaXQgaXMgdGhlIHVzZXIncwoJICAgIHJlc3BvbnNpYmlsaXR5IHRvIGF2b2lkIGl0cyBtb2RpZmljYXRpb24uCgkgICAgCgkgIC0gQWRkIHRoZSAtTyBvcHRpb24gdG8gZW5hYmxlIGFsbCB0aGUgb3B0aW1pemF0aW9uIG9wdGlvbnMKCSAgICBhdCBvbmNlLCBpbml0aWFsbHkgZXF1aXZhbGVudCB0bwoKCSAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLWRpcnZ0YWJsZSAtbm9zYWZlY3N0cmluZ3MgLWZ2aXJ0dWFsCgoxMi8wOC8yMDA1OiBtbWF0dXMgCgoJICAtIEFkZCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gKGZhc3RkaXNwYXRjaCBmZWF0dXJlKS4gVGhpcwoJICAgIGVuYWJsZXMgdGhlICJmYXN0IGRpc3BhdGNoIiBtZWNoYW5pc20gZm9yIG92ZXJsb2FkZWQKCSAgICBtZXRob2RzIHByb3ZpZGVkIGJ5IFNhbHZhZG9yIEZhbmRpfm5vIEdhcmMnaWEgKCM5MzA1ODYpLgoKCSAgICBUaGUgcmVzdWx0aW5nIGNvZGUgaXMgc21hbGxlciBhbmQgZmFzdGVyIHNpbmNlIGxlc3MgdHlwZQoJICAgIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gSG93ZXZlciwgdGhlIGVycm9yIG1lc3NhZ2VzIHlvdQoJICAgIGdldCB3aGVuIHRoZSBvdmVybG9hZGluZyBpcyBub3QgcmVzb2x2ZWQgY291bGQgYmUKCSAgICBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSB0cmFkaXRpb25hbCBtZXRob2QgcmV0dXJucy4KCgkgICAgV2l0aCB0aGUgb2xkIG1ldGhvZCB5b3UgYWx3YXlzIGdldCBhbiBlcnJvciBzdWNoIGFzIAoKCSAgICAgICAiTm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIG92ZXJsb2FkZWQgLi4uIgoKICAgICAgICAgICAgd2l0aCB0aGUgbmV3IG1ldGhvZCB5b3UgY2FuIGFsc28gZ2V0IGVycm9ycyBzdWNoIGFzCgoJICAgICAgICJUeXBlIGVycm9yIGluIGFyZ3VtZW50IDEgb2YgdHlwZSAuLi4iCgoJICAgIFNlZSBidWcgcmVwb3J0ICM5MzA1ODYgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgCiAgCSAgICBTbywgdGhpcyBvcHRpbWl6YXRpb24gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdXNlcnMuCgoJICAgIFRoZSBuZXcgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICBzd2lnIC1mYXN0ZGlzcGF0Y2gKCiAgICAgICAgICAgIG9yIHVzaW5nIHRoZSBmZWF0dXJlIGZvcm0KCgkgICAgICAlZmVhdHVyZSgiZmFzdGRpc3BhdGNoIikgbWV0aG9kOwogICAgICAgICAgICBvcgogICAgICAgICAgICAgICVmYXN0ZGlzcGF0Y2ggbWV0aG9kOwoJICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzIAoKICAgICAgICAgIC0gU2V2ZXJhbCBtZW1vcnkgYW5kIHNwZWVkIGltcHJvdmVtZW50cywgc3BlY2lhbGx5IGZvcgoJICAgIHRlbXBsYXRlcy4gTm93IHN3aWcgaXMgdXAgdG8gMjAgZmFzdGVyIHRoYW4gYmVmb3JlIGZvcgoJICAgIGxhcmdlIHRlbXBsYXRlIGludGVyZmFjZXMsIHN1Y2ggYXMgdGhlIHN0ZF9jb250YWluZXJzLmkKCSAgICBhbmQgdGVtcGxhdGVfbWF0cml4LmkgZmlsZXMgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLgoKCSAgICBNZW1vcnkgZm9vdHByaW50IGlzIGFsc28gcmVkdWNlZCBpbiBjb25zaWRlcmF0aW9uIG9mIHNtYWxsCgkgICAgcGNzL2FyY2hpdGVjdHVyZXMuCgoJICAtIGFkZCBjb21tYW5kbGluZSBvcHRpb25zIC1jcHBlcnJhc3dhcm4gYW5kIC1ub2NwcGVycmFzd2FybiIgdG8gZm9yY2UKICAgICAgICAgICAgdGhlIHN3aWcgcHJlcHJvY2Vzc29yIHRvIHRyZWF0IHRoZSAjZXJyb3IgZGlyZWN0aXZlIGFzIGEgI3dhcm5pbmcuCgkgICAgCgkgICAgdGhlIHByYWdtYXMKCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MQogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTAKCSAgICAgICAKCSAgICBhcmUgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBtb3JlIHBvcnRhYmxlLCBlc3BlY2lhbGx5CgkgICAgZm9yIFdpbmRvd3MuIEZvbGxvd2luZyAKCiAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvd2luZG93cy5odG1sCgogICAgICAgICAgICBQeV9Ob25lIGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgc3RydWN0dXJlLCBwbHVzIG90aGVyCiAgICAgICAgICAgIHRyaWNrcyBtZW50aW9uZWQgdGhlcmUuCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHRocmVhZHMgYmFzZWQgaW4gdGhlCgkgICAgcHJvcG9zYWwgYnkgSm9zZXBoIFdpbnN0b24uCgoJICAgIFRoZSB1c2VyIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgoKCSAgICAxLi0gdGhlIG1vZHVsZSB0aHJlYWQgc3VwcG9ydCBpcyBlbmFibGUgdmlhIHRoZSAidGhyZWFkcyIgbW9kdWxlCiAgICAgICAgICAgICAgICBvcHRpb24sIGkuZS4KCiAgICAgICAgICAgICAgICAgICVtb2R1bGUoInRocmVhZHMiPTEpCgogICAgICAgICAgICAyLi0gRXF1aXZhbGVudCB0byB0aGF0LCBpcyB0aGUgbmV3ICctdGhyZWFkcycgc3dpZyBvcHRpb24KCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRocmVhZHMgLXB5dGhvbiAuLi4KCiAgICAgICAgICAgIDMuLSBZb3UgY2FuIHBhcnRpYWxseSBkaXNhYmxlIHRocmVhZCBzdXBwb3J0IGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICBtZXRob2QgdXNpbmc6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWQiKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkIG1ldGhvZDsKCiAgICAgICAgICAgICAgICBhbHNvLCB5b3UgY2FuIGRpc2FibGUgc2VjdGlvbnMgb2YgdGhlIHRocmVhZCBzdXBwb3J0LCAKICAgICAgICAgICAgICAgIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRibG9jayIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRibG9jayBtZXRob2Q7CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRhbGxvdyIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRhbGxvdyBtZXRob2Q7CgogICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpc2FibGVzIHRoZSBDKysvcHl0aG9uIHRocmVhZCBwcm90ZWN0aW9uLCBhbmQgdGhlCiAgICAgICAgICAgICAgICBzZWNvbmQgZGlzYWJsZXMgdGhlIHB5dGhvbi9DKysgdGhyZWFkIHByb3RlY3Rpb24uIAoKICAgICAgICAgICAgNC4tIFRoZSBjdXJyZW50IHRocmVhZCBzdXBwb3J0IGlzIGJhc2VkIGluIHRoZSBQeUdJTAogICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHByZXNlbnQgaW4gcHl0aG9uIHZlcnNpb24gMi4zIG9yIGxhdGVyLCBidXQKICAgICAgICAgICAgICAgIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGhyZWFkIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zIGJ5CiAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgbWFjcm9zIGluIHB5dGhyZWFkcy5zd2cuCgoJCUlmIHlvdSBnZXQgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uIGZvciBvbGRlciB2ZXJzaW9ucywKCQlwbGVhc2Ugc2VuZCB1cyBhIHBhdGNoLgoKICAgICAgICAgICAgRm9yIHRoZSBjdXJpb3VzIGFib3V0IHBlcmZvcm1hbmNlLCBoZXJlIGFyZSBzb21lIG51bWJlcnMKICAgICAgICAgICAgZm9yIHRoZSBwcm9maWxldGVzdC5pIHRlc3QsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHNwZWVkCgkgICAgb2YgdGhlIHdyYXBwZWQgY29kZToKCgkgICAgICAgIG5vdGhyZWFkICAgICAgICAgICA5LjZzICAobm8gdGhyZWFkIGNvZGUpCgkJbm90aHJlYWRibG9jayAgICAgMTIuMnMgIChvbmx5ICdhbGxvdycgY29kZSkKCQlub3RocmVhZGFsbG93ICAgICAxMy42cyAgKG9ubHkgJ2Jsb2NrJyBjb2RlKQogICAgICAgICAgICAgICAgZnVsbCB0aHJlYWQgICAgICAgMTUuNXMgICgnYWxsb3cnICsgJ2Jsb2NrJyBjb2RlKQoJICAgIAoJICAgIGkuZS4sIGZ1bGwgdGhyZWFkIGNvZGUgZGVjcmVhc2VzIHRoZSB3cmFwcGluZyBwZXJmb3JtYW5jZSBieQoJICAgIGFyb3VuZCA2MCUuIElmIHRoYXQgaXMgaW1wb3J0YW50IHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdQoJICAgIGNhbiB0dW5lIGVhY2ggbWV0aG9kIHVzaW5nIHRoZSBkaWZmZXJlbnQgJ25vdGhyZWFkJywKCSAgICAnbm90aHJlYWRibG9jaycgb3IgJ25vdGhyZWFkYWxsb3cnIGZlYXR1cmVzIGFzCgkgICAgbmVlZGVkLiBOb3RlIHRoYXQgZm9yIHNvbWUgbWV0aG9kcyBkZWFjdGl2YXRpbmcgdGhlCgkgICAgJ3RocmVhZCBibG9jaycgb3IgJ3RocmVhZCBhbGxvdycgY29kZSBpcyBub3QgYW4gb3B0aW9uLAoJICAgIHNvLCBiZSBjYXJlZnVsLgoJICAgIAoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIHVzZSBzeXN0ZW0gYW5nbGUgYnJhY2tldHMgZXZlcnl3aGVyZSBmb3IgJWluY2x1ZGUsIGVnCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9jb21tb24uaSIKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfY29tbW9uLmk+CgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMgaGF2ZSBhbiBleHRyYSBjb25zdHJ1Y3RvciBzbyB0aGF0IGVudW0gaXRlbSB2YWx1ZXMgdGhhdAogICAgICAgICAgICBhcmUgaW5pdGlhbGlzZWQgYnkgYW5vdGhlciBlbnVtIGl0ZW0gdmFsdWUgY2FuIGJlIHdyYXBwZWQgd2l0aG91dCBoYXZpbmcgdG8gdXNlICVqYXZhY29uc3R2YWx1ZS8KICAgICAgICAgICAgJWNzY29uc3R2YWx1ZSBmb3Igd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpLiBTdWdnZXN0aW9uIGJ5CiAgICAgICAgICAgIEJvYiBNYXJpbmllci9Eb3VnbGFzIFBlYXJzb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeHl6LAogICAgICAgICAgICAgICAgIGxhc3QgPSB4eXoKICAgICAgICAgICAgICB9IHJlcGVhdDsKCjExLzIxLzIwMDU6IG1tYXR1cwoJICAgIFtydWJ5ICsgcHl0aG9uXQoKCSAgICBGaXhlcyBmb3IgZGlyZWN0b3JzICsgcG9pbnRlcnMuIFRoaXMgaXMgYW4gdWdseSBwcm9ibGVtIHdpdGhvdXQgYW4gZWFzeQoJICAgIHNvbHV0aW9uLiBCZWZvcmUgd2UgaWRlbnRpZmllZCB0aGlzIGNhc2UgYXMgcHJvYmxlbWF0aWM6CgoJICAgICAgICAgIHZpcnR1YWwgY29uc3QgTXlDbGFzcyYgbXlfbWV0aG9kKCk7CgogICAgICAgICAgICBidXQgaXQgdHVybnMgb3V0IHRoYXQgYWxsIHRoZSBjYXNlcyB3aGVyZSBhIHBvaW50ZXIsIGFycmF5IG9yCiAgICAgICAgICAgIHJlZmVyZW5jZSBpcyByZXR1cm5lZCwgYXJlIHByb2JsZW1hdGljLCBldmVuIGZvciAKCSAgICBwcmltaXRpdmUgdHlwZXMgKGFzIGludCwgZG91YmxlLCBjaGFyKiwgZXRjKS4KCgkgICAgVG8gdHJ5IHRvIGZpeCB0aGUgaXNzdWUsIGEgbmV3IHR5cGVtYXAgd2FzIGFkZGVkLAoJICAgICdkaXJlY3RvcmZyZWUnLCB3aGljaCBpcyB1c2VkIHRvICdmcmVlJyB0aGUgcmVzb3VyY2VzCgkgICAgYWxsb2NhdGVkIGR1cmluZyB0aGUgJ2RpcmVjdG9yb3V0JyBwaGFzZS4gQXQgdGhlIHNhbWUKCSAgICB0aW1lLCBhIHByaW1pdGl2ZSBnYXJiYWdlIGNvbGxlY3RvciBlbmdpbmUgd2FzIGFkZGVkIHRvCgkgICAgZGVhbCB3aXRoIG9ycGhhbmVkIGFkZHJlc3Nlcywgd2hlbiBuZWVkZWQuCgkgICAgCgkgICAgVGhlIHNpdHVhdGlvbiBpcyBtdWNoIGJldHRlciBub3csIGJ1dCBzdGlsbCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlCgkgICAgbWVtb3J5IGV4aGF1c3RhdGlvbiBpZiByZWN1cnNpb24gaXMgdXNlZC4KCgkgICAgU28sIHN0aWxsIHlvdSBuZWVkIHRvIGF2b2lkIHJldHVybmluZyBwb2ludGVycywgYXJyYXlzIG9yCgkgICAgcmVmZXJlbmNlcyB3aGVuIHVzaW5nIGRpcmVjdG9yIG1ldGhvZHMuCgoJICAgIC0gQWRkZWQgc3RkaW50LmkgLSB0eXBlbWFwcyBmb3IgbGF0ZXN0IEM5OSBpbnRlZ3JhbCB0eXBlcyBmb3VuZCBpbiBzdGRpbnQuaC4KCSAgICAKMTEvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSB0eXBlcyBhZGRlZCB0byB3aW5kb3dzLmksIGVnIFVJTlQ4LCBXT1JELCBCWVRFIGV0Yy4gCiAgICAgICAgICAgIEluY2x1ZGluZyB3aW5kb3dzLmkgd2lsbCBhbHNvIGVuYWJsZSBTV0lHIHRvIHBhcnNlIHRoZSBfX2RlY2xzcGVjIE1pY3Jvc29mdAogICAgICAgICAgICBleHRlbnNpb24sIGVnIF9fZGVjbHNwZWMoZGxsaW1wb3J0KS4gQWxzbyBvdGhlciBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMKICAgICAgICAgICAgc3VjaCBhcyBfX3N0ZGNhbGwuCgoxMS8xMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGZvciBXaW5kb3dzIC0gd2luZG93cy5pLiBUaGlzIGZpbGUgd2lsbCBjb250YWluIHVzZWZ1bCB0eXBlCiAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB1c2VycyB3aG8gaW5jbHVkZSB3aW5kb3dzLmguIEluaXRpYWwgc3VwcG9ydCBpcyBmb3IgdGhlCiAgICAgICAgICAgIG5vbiBJU08gaW50ZWdyYWwgdHlwZXM6IF9faW50OCwgX19pbnQxNiwgX19pbnQzMiwgX19pbnQ2NCBhbmQgdW5zaWduZWQgdmVyc2lvbnMuCiAgICAgICAgICAgIFRoZSB1bnNpZ25lZCB2ZXJzaW9ucyBwcmV2aW91c2x5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYnkgU1dJRy4gIFNGICM4NzIwMTMuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFBvcnRhYmlsaXR5IHdhcm5pbmcgZm9yIGZpbGVzIHdoaWNoIHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXIgb24gY2FzZQogICAgICAgICAgICBpbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgc3VjaCBhcyBGQVQzMi9OVEZTLiBUaGlzIHdpbGwgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHR3bwogICAgICAgICAgICBjbGFzcyBuYW1lcyBhcmUgdGhlIHNhbWUgYmFycmluZyBjYXNlLiBUaGUgd2FybmluZyBpcyBpc3N1ZWQgb24gYWxsIHBsYXRmb3JtcyBhbmQKICAgICAgICAgICAgY2FuIGJlIHN1cHByZXNzZWQgd2l0aCB0aGUgdXN1YWwgd2FybmluZyBzdXBwcmVzc2lvbiB0ZWNobmlxdWVzLiBTRiBidWcgIzEwODQ1MDcuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcHl0aG9uIC0td2l0aC1ydWJ5IC0td2l0aC1wZXJsNSBldGMgZW5hYmxlIHRoZXNlIGxhbmd1YWdlcywKICAgICAgICAgICAgaWUgdGhlIC0td2l0aC14eHh4IG9wdGlvbnMsIHdoZXJlIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB3b3JrIHRoZSBzYW1lIGFzIGlmIAogICAgICAgICAgICB0aGUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGF0IGFsbC4gQmFzZWQgb24gcGF0Y2hlcyAjMTMzNTA0MiAjMTMyOTA0OCAjMTMyOTA0Ny4KCjExLzA5LzIwMDU6IGRhbmN5CgoJICAgIFtBbGxlZ3JvY2xdCgkgICAgQWRkIEMrKyBzdXBwb3J0IHRvIHRoZSBBbGxlZ3JvY2wgbW9kdWxlLiBGdXJ0aGVyCgkgICAgZW5oYW5jZXMgdGhlIEMgc3VwcG9ydCBhcyB3ZWxsLiBTb21lIG9mIHRoZQoJICAgIGZlYXR1cmVzOgoKCSAgICAtIE1VQ0ggYmV0dGVyIGdlbmVyYXRpb24gb2YgZm9yZWlnbiB0eXBlcyBiYXNlZCBvbgoJICAgIHRoZSBDL0MrKyB0eXBlcyBmb3IgdXNlIGluIGRlZmluaW5nIHRoZSBGRkkgb24KCSAgICB0aGUgbGlzcCBzaWRlLiBXZSBkb24ndCBwYXNzIGV2ZXJ5dGhpbmcgYXMgYSAoKiA6dm9pZCkKCSAgICBhbnkgbG9uZ2VyLgoKCSAgICAtIFVzZXMgdHlwZW1hcHMgZm9yIGJldHRlciBjb250cm9sIG9mIHR5cGUgY29udmVyc2lvbnMKCSAgICBhbmQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgbGlzcCBhbmQgYysrIHdyYXBwZXIKCSAgICBjb2RlLgoKCSAgICAtIENMT1Mgd3JhcHBpbmcgb2YgcG9pbnRlcnMgcmV0dXJuZWQgZnJvbSBmb3JlaWduIHNwYWNlCgkgICAgbWFrZXMgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgcG9pbnRlcnMgaW4gdXNlciBjb2RlLgoJICAgIFRoZSB3cmFwcGluZyBvYmplY3RzIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gRkYgY2FsbHMuCgoJICAgIC0gRGVmdW4gd3JhcHBpbmcgb2YgRkYgY2FsbHMsIGFsbG93aW5nIGZvciBtb3JlIGxpc3B5CgkgICAgaW50ZXJmYWNlLiBDb252ZXJzaW9uLCBHQ2luZywgb2YgbGlzcCBvYmplY3RzIHRvIAoJICAgIGZvcmVpZ24gb2JqZWN0cyBjYW4gYmUgZG9uZSBpbiB0aGUgd3JhcHBpbmcgZGVmdW4gdmlhCgkgICAgdGhlIHVzZSBvZiB0eXBlbWFwcy4KCSAgICAKCSAgICAtIG92ZXJsb2FkIGRpc3BhdGNoaW5nIGltcGxlbWVudGVkIG9uIHRoZSBsaXNwIHNpZGUKCSAgICB1c2luZyBnZW5lcmljIGZ1bmN0aW9ucy4KCgkgICAgLSBUZW1wbGF0ZXMgYW5kIHN5bm9ueW1vdXMgdHlwZXMgc3VwcG9ydGVkLgoKMTEvMDcvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBwcm9wZXIgc3VwcG9ydCBmb3IgbXVsdGktaW5oZXJpdGFuY2UgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUsIGllLCBpZiB5b3UgaGF2ZSB0d28gQysrIHdyYXBwZWQgY2xhc3MsIEZvbwoJICAgIGFuZCBCYXIsIG5vdzoKCgkgICAgICAgY2xhc3MgTXlQeXRob25DbGFzcyhGb28sQmFyKToKCSAgICAgICAgICAuLi4uCgogICAgICAgICAgICB3aWxsIHByb3Blcmx5IHdvcmssIGV2ZW4gd2l0aCBkaXJlY3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgZGVhbGxvY2F0aW9uIG9mIEZvby50aGlzIGFuZCBCYXIudGhpcyB3aWxsIGZvbGxvdwogICAgICAgICAgICBjb3JyZWN0bHkuIEJlZm9yZSwgYSBjbGFzcyBjb3VsZCBvbmx5IGhhdmUgb25lICd0aGlzJwogICAgICAgICAgICBpbnN0YW5jZSAodW5saWtlIEMrKyksIG9ubHkgdGhlIGxhc3QgYmFzZSBjbGFzcyB3YXMKICAgICAgICAgICAgcHJvcGVybHkgZGVsZXRlZCwgb3IgZGV0ZWN0ZWQgd2l0aCBkaXJlY3RvcnMuCgoJICAgIE5vdyAnc2VsZi50aGlzJyBjYW4gYmUgYSBsaXN0LCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIEMrKwoJICAgIGluc3RhbmNlIHBvaW50ZXJzIGZvciBhbGwgdGhlIGJhc2UgY2xhc3Nlcy4KCSAgICAKCSAgICBBbHNvLCBzd2lnLnRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGUgQysrCgkgICAgaW5zdGFuY2UocyksIGFuZCB0aGUgX19kZWxfXyBtZXRob2QgaXMgbm90IGVtaXR0ZWQgdW5sZXNzCgkgICAgdGhlIHVzZXIgcHJlcHBlbmQvYXBwZW5kIHNvbWUgY29kZSB0byBpdC4KCgkgIC0gU3dpZyBjYW4gbm93IGRldGVjdCBtZW1vcnkgbGVha3MsIGllLCBpZiB5b3Ugc3RpbGwKCSAgICBkb24ndCB1c2UgcHJveHkvc2hhZG93IGNsYXNzZXMsIGFuZCB0eXBlIHNvbWV0aGluZyBsaWtlCgkgICAgCgkgICAgICAgICBpbXBvcnQgX2V4YW1wbGUKCSAgICAgICAgIGYgPSBfZXhhbXBsZS5uZXdfRm9vKCkKCgkgICAgYW5kIGZvcmdldCB0byBjYWxsIF9leGFtcGxlLmRlbGV0ZV9Gb28oZiksIHRoZW4gc3dpZyB3aWxsCgkgICAgdGVsbCB5b3UgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrLgoKCSAgICBPdGhlcndpc2UsIGlmIHlvdSBhbHdheXMgdXNlIHRoZSBwcm94eSBjbGFzc2VzLCB5b3UgcHJvYmFibHkKCSAgICB5b3Ugd2lsbCBuZXZlciBldmVyIHNlZSB0aGlzIHdhcm5pbmcgdW5sZXNzIHRoZXJlIGlzCgkgICAgc29tZXRoaW5nIHdyb25nIGluc2lkZSB0aGUgc3dpZyB3cmFwcGluZyBjb2RlLgoJICAgICAgIAoJCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIElmIHlvdSBvdmVybG9hZGVkIHRoZSBfX2RlbF9fIG1ldGhvZCwgYW5kIGNhbGwgdGhlIGJhc2UKCSAgICBvbmUJIHdpdGhvdXQgYSB0cnkgYmxvY2ssIGFzIGluCgoJICAgICAgICAgICBjbGFzcyBNeUNsYXNzKFN3aWdDbGFzcyk6CgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIAogICAgICAgICAgICBweXRob24gY291bGQgY29tcGxhaW4gdGhhdCB0aGUgbWV0aG9kIFN3aWdDbGFzcy5fX2RlbF9fIGlzCiAgICAgICAgICAgIHVuZGVmaW5lZC4gVHJ5IHRvIHVzZSBpbnN0ZWFkOgoJICAgIAoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICB0cnk6IFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgZXhjZXB0OiBwYXNzCgoJICAgIG9yIHNpbXBseSAJCSAgCgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBtb3JlIGZ1biB0byBTVEwvU1REIGNvbnRhaW5lcnMsIG5vdyB5b3UKCSAgICBjYW4gZG8KCgkgICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxQeU9iamVjdCAqPjsJCQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8UHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CgkgICAgICAgLi4uLgoKCSAgICBUaGUgc2FtZSAgYXBwbGllcyB0byBzdGQ6Omxpc3QsIHN0ZDo6ZGVxdWUsIHN0ZDo6bXVsdGlzZXQsIGV0Yy4KCgkgICAgVGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlIHlvdSBjYW4gZG8gbm93OgoKCSAgICAgICAjIEMrKyBzdGQ6OnZlY3RvciBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgdiA9IHB5dmVjdG9yKFsxLCJoZWxsbyIsKDEsMildKQoJICAgICAgIHByaW50IHZbMV0KCSAgICAgICA+PiAnaGVsbG8nCgkgICAgICAgcHJpbnQgdlsyXQoJICAgICAgID4+ICgxLDIpCgkgICAgICAgCQkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6OnNldCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgcyA9IHB5c2V0KCkJCQkgICAKCSAgICAgICBzLmluc2VydCgoMSwyKSkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KDEpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoImhlbGxvIikKCSAgICAgICBzdW09KCkKCSAgICAgICBmb3IgaSBpbiBzOgoJICAgICAgICAgc3VtICs9KGksKQoJICAgICAgIHByaW50IHN1bQoJICAgICAgID4+PiAoMSwgJ2hlbGxvJywgKDEsIDIpKQoJICAgICAgIAkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6Om1hcCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgbSA9IHB5bWFwKCkJCQkgICAKCSAgICAgICBtWyJmb28iXSA9ICJoZWxsbyIJCSAgIAoJICAgICAgIG1bMV0gPSAoMSwyKQoJICAgICAgIHBtID0ge30KCSAgICAgICBmb3IgayBpbiBtOgkgICAgCSAgIAoJICAgICAgICAgcG1ba10gPSBtW2tdCgkgICAgICAgcHJpbnQgcG0KCSAgICAgICA+Pj4gezE6ICgxLCAyKSwgJ2Zvbyc6ICdoZWxsbyd9CgoJICAgIGllLCB0aGUgU1REL1NUTCBjb250YWluZXJzIHdvcmsgYXMgcmVhbCBuYXRpdmUgcHl0aG9uCgkgICAgY29udGFpbmVyLCB3aXRoIGFyYml0cmFyeSBpdGVtIHR5cGVzIGFuZCBzby4KCgkgICAgQnV0IHNpbmNlIG5vcm1hbCBDKysgY29udGFpbmVycyBkbyBub3QgcHJvcGVybHkgcmVmL3VucmVmCgkgICAgdGhlaXIgaXRlbXMsIHlvdSBzaG91bGQgdXNlIHRoZSBzYWZlciB2ZXJzaW9uczoKCSAgICAKCSAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxzd2lnOjpQeU9iamVjdF9wdHIsIHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPHN3aWc6OlB5T2JqZWN0X3B0cixzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgLi4uLgoKCSAgICB3aGVyZSBzd2lnOjpQeU9iamVjdF9wdHIgaXMgYSBQeU9iamVjdCAqIGVudmVsb3BlIGNsYXNzIHByb3ZpZGVkCgkgICAgdG8gc2FmZWx5IGluY3JlZi9kZWNyZWYgdGhlIHB5dGhvbiBvYmplY3QuIAoJICAgIAoJICAgIFNvLCBub3cgeW91IGNhbiB1c2UgYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgYXMgbmF0aXZlCgkgICAgUHl0aG9uIGNvbnRhaW5lcnMuIAoKCSAgICBOb3RlIDE6IHN0ZDo6bWFwLCBzdGQ6OnNldCBhbmQgdGhlIG90aGVyICdvcmRlcmVkJwoJICAgIGNvbnRhaW5lcnMgd2lsbCBwcm9wZXJseSB1c2UgUHlPYmplY3RfQ29tcGFyZSBmb3Igc29ydGluZywKCSAgICB3aGVuIG5lZWRlZC4KCgkgICAgTm90ZSAyOiBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBoYXZlIGEgbGltaXQgc2l6ZSBvZgoJICAgIFNJWkVfTUFYLCBpZSwgeW91IGNhbiBoYXZlIG1hbmFnZSBjb250YWluZXJzIGxhcmdlciB0aGFuCgkgICAgSU5UX01BWCwgdGhlIHB5dGhvbiBsaW1pdC4KCSAgICAKCSAgICAgIAoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0KCSAgICAtIGFkZCAnaXRlcmF0b3IoKScgbWV0aG9kIGZvciBhbGwgc2VxdWVuY2VzIGFuZCBhZGRpdGlvbmFsbHkKCSAgICAgICdrZXlfaXRlcmF0b3IoKScgZm9yIG1hcHMuCgoJICAgICAgJ2l0ZXJhdG9yKCknIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvci4KCSAgICAgIEFkZGl0aW9uYWxseSwgaW4gbWFwcywgJ2tleV9pdGVyYXRvcigpJyB3aWxsIHJldHVybiBhIHB5dGhvbgoJICAgICAgaXRlcmF0b3IgdXNpbmcgb25seSB0aGUgbWFwIGtleXMuCgkgICAgICAKCSAgICAgIEluIGdlbmVyYWwgdGhlIHNlcXVlbmNlIG1ldGhvZCBfX2l0ZXJfXyB3aWxsIGNhbGwKCSAgICAgICdpdGVyYXRvcigpJywgcmV0dXJuaW5nIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLCBidXQgaW4KCSAgICAgIG1hcHMgaXQgd2lsbCBjYWxsICdrZXlfaXRlcmF0b3IoKScsIG1haW50YWluaW5nCgkgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgoKCSAgICAgIEhlbmNlLCBmb3Igc3RkOjptYXBzLCB5b3UgY2FuIHBsYXkgdGhlbiB3aXRoIHRoZSBuYXRpdmUKCSAgICAgIEMrKyBpdGVyYXRvciwgd2hpY2ggdmFsdWUgaXMgYSAoa2V5LCB2YWx1ZSkgcGFpciwgYnkKCSAgICAgIGNhbGxpbmcgbWFwLml0ZXJhdG9yKCksIGFzIHdpdGggbWFwLmJlZ2luKCksIG1hcC5lbmQoKSwgZXRjLgoKCSAgICAgIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWFwLml0ZXJhdG9yKCkgcmV0dXJucyBhIHNhZmUKCSAgICAgICdjbG9zZWQnIGl0ZXJhdG9yLCB3aGlsZSBtYXAuYmVnaW4oKSBhbmQgbWFwLmVuZCgpIGFyZQoJICAgICAgJ29wZW4nIGl0ZXJhdG9ycy4KCgkgICAgICBBICdjbG9zZWQnIGl0ZXJhdG9yIGtub3dzIHRoZSBiZWdpbiBhbmQgdGhlIGVuZCBvZiB0aGUKCSAgICAgIHNlcXVlbmNlLCBhbmQgaXQgbmV2ZXIgY2FuIHNlZy4gZmF1bHQuIEFuICdvcGVuJwoJICAgICAgaXRlcmF0b3IsIGFzIGluIEMrKywgY2FuIHNlZy4gZmF1bHQgYXQgdGhlIEMrKyBzaWRlLgoKCSAgICAgICAgICMgYSBjbG9zZWQgaXRlcmF0b3IgaXMgc2FmZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCgkJICMgdGhlIG5leHQoKSBtZXRob2Qgd2lsbCB0aHJvdyBhIFN0b3BJdGVyYXRpb24KCSAgICAgICAgICMgZXhjZXB0aW9uIGFzIG5lZWRlZAoJCgkgICAgICAgICBpID0gc2VxLml0ZXJhdG9yKCkKCQkgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKCQkgICAgICAgIHN1bSArPSBpLm5leHQoKQoJCSBleGNlcHQ6IHBhc3MKCQkgCgkJICMgYW4gb3BlbiBpdGVyYXRvciBhbHdheXMgbmVlZCB0byBiZSBjaGVja2VkLAoJCSAjIG9yIGl0IHdpbGwgY3Jhc2ggYXQgdGhlIEMrKyBzaWRlCgoJICAgICAgICAgY3VycmVudCA9IHNlcS5iZWdpbigpCiAgICAgICAgICAgICAgICAgZW5kID0gc2VxLmVuZCgpCgkJIHdoaWxlIChjdXJyZW50ICE9IGVuZCk6CgkJICAgIHN1bSArPSBjdXJyZW50Lm5leHQoKQoJICAgICAgCgkgICAgICAKCSAgICBbUHl0aG9uXQoJICAgIC0gRmluYWxseSwgd2hlbiB3ZSBjYWxsIAoKCSAgICAgICAgZiA9IEZvbygpCgoJICAgICAgdGhlIGNvbnN0cnVjdGlvbiBpcyAnb25lLXdheScuIEJlZm9yZSBjb25zdHJ1Y3Rpb24gIHdhcyBkb25lCgkgICAgICBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspIAogICAgICAgICAgICAgICAgICBuZXdfRm9vKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikgCiAgICAgICAgICAgICAgICAgIEZvb1B0cigpIChweXRob24pIC0+IEZvbygpIChweXRob24pCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHdhcyBkb25lIGxpa2UKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICBGb29QdHIocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICAJCSAgCgoJICAgICAgaWUsIHdlIHdoZW4gZ29pbmcgYmFjayBhbmQgZm9yd2FyZCBiZXR3ZWVuIHRoZSBDKysgYW5kCgkgICAgICBweXRob24gc2lkZS4KCgkgICAgICBOb3cgc2luY2UgdGhlcmUgaXMgbm8gRm9vUHRyIHRoZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBpcwoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspCiAgICAgICAgICAgICAgICAgIF9uZXdfRm9vKCkgKEMrKykgLT4gTmV3UG9pbnRlck9iaigpIChDKyspIChubyBzaGFkb3cgY2xhc3MpCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIGlzIGRvbmUKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAod2l0aCBzaGFkb3cgY2xhc3MpIC0+IE5ld0luc3RhY2VPYmooKSAoQysrKQoKCSAgICAgIHdoZXJlIE5ld0luc3RhbmNlT2JqIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aG91dAoJICAgICAgY2FsbGluZyBfX2luaXRfXyBhbmQgaXQgZG9lc24ndCBnbyAnYmFjaycgdG8gcHl0aG9uLCBpcwoJICAgICAgJ3B1cmUnIEMgQVBJLgoKCSAgICAgLSBXaXRoIHRoaXMgY2hhbmdlLCBhbmQgdGhlIG90aGVyIG9uZXMgaW4gdGhlCiAgICAgICAgICAgICAgIFB5U3dpZ09iamVjdCB0eXBlLCB3aGljaCBub3cgY2FycmllcyB0aGUgdGhpc293biBhbmQKICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gcG9pbnRlciwgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBiZSBhcwogICAgICAgICAgICAgICBmYXN0IGFzIGJvb3N0OjpQeXRob24gYW5kL29yIHRoZSBvdGhlciBweXRob24gd3JhcHBlcnMKICAgICAgICAgICAgICAgYmFzZWQgaW4gcHVyZSBQeXRob24vQyBBUEkgY2FsbHMuCgoJICAgICAgIEFzIGEgcmVmZXJlbmNlLCB0aGUgcHJvZmlsZXRlc3RfcnVubWUucHkgZXhhbXBsZSwgd2hpY2gKCSAgICAgICBkb2VzIGEgc2ltcGxlIGNhbGwgZnVuY3Rpb24gbWFueSB0aW1lcywgc3VjaCBhcyB0aGlzIGNvZGU6CgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxldGVzdCAgICAgICAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSAgICBhID0gcHJvZmlsZXRlc3QuQSgpICAgICAgCgkJICAgIGIgPSBwcm9maWxldGVzdC5CKCkgICAgICAKCQkgICAgZm9yIGkgaW4gcmFuZ2UoMCwxMDAwMDAwKQoJICAgICAgICAgICAgICBhID0gYi5mbihhKSAgICAgICAgICAgIAoKCgkgICAgICAgd2hlcmUgZm4gaXMgZGVmaW5lZCBhcyAnQSogQjo6Zm4oQSAqYSkge3JldHVybiBhO30nLAoJICAgICAgIHByb2R1Y2VzICB0aGUgZm9sbG93aW5nIHRpbWVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tb2Rlcm4gICAgbW9kZXJuCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAxOS43MHMgICAgICA1Ljk4cwogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjk5cyAgICAgIDAuOThzCgkgICAgICAgCgoJICAgICAgIENsZWFybHksIHRoZXJlIGlzIGEgbGFyZ2UgaW1wcm92ZW1lbnQgZm9yIHRoZSBweXRob24KCSAgICAgICAnbm9tb2Rlcm4nIG1vZGUuIFN0aWxsLCB0aGUgJ21vZGVybicgbW9kZSBpcyBhcm91bmQKCSAgICAgICA2IHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZS4gRm9yIHRoZSBzYW1lIHRlc3QsIGJ1dAoJICAgICAgIHVzaW5nIHRoZSBub24tc2hhZG93IHZlcnNpb24gb2YgdGhlIG1vZHVsZSwgd2UgZ2V0CgoJICAgICAgICAgICAgICAgICAgICAgICBfcHJvZmlsZXRlc3QgKG5vbi1zaGFkb3cpCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAgMC44MHMgCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuNjBzIAoKCSAgICAgICBIZW5jZSwgbm93IGZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcm94eSBvdmVyaGVhZAoJICAgICAgIGlzIGluc2lnbmlmaWNhbnQuCgoJICAgICAgIE5vdGUgdGhhdCB0aGUgcGVyZm9ybWFuY2UgbnVtYmVycyB3ZSBhcmUgc2hvd2luZyBpcyBmb3IKCSAgICAgICBhIHNpbXBsZSBtb2R1bGUgKHR3byB0eXBlcykgYW5kIGEgc2ltcGxlIGZ1bmN0aW9uIChvbmUKCSAgICAgICBhcmd1bWVudCkuIEZvciByZWFsIHNpdHVhdGlvbnMsIGZvciBtb2R1bGVzIHdpdGggbWFueQoJICAgICAgIG1vcmUgdHlwZXMgYW5kL29yIGZ1bmN0aW9ucyB3aXRoIG1hbnkgbW9yZSBwYXJhbWV0ZXJzLAoJICAgICAgIHlvdSB3aWxsIHNlZSBldmVuIGJldHRlciByZXN1bHRzLgoJICAgICAgIAoJCSAgCSAgICAgIAoxMC8zMS8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXQoKCSAgICAtIEZpbmFsbHksIG5vIG1vcmUgQ2xhc3NQdHIgcHJveHkgY2xhc3Nlcy4gWW91IHdpbGwgc2VlCgkgICAgICBvbmx5IGEgY2xlYW4gQ2xhc3MgcHJveHkgY2xhc3MgaW4gdGhlIC5weSBmaWxlLgoKCSAgICAtIE5vIG1vcmUgJ3JlYWwnIHRoaXNvd24gYXR0cmlidXRlIGVpdGhlciwgdGhlIFB5U3dpZ09iamVjdCBub3cKICAgICAgICAgICAgICBjYXJyaWVzIHRoZSBvd25lcnNoaXAgaW5mby4KCgkgICAgICBZb3UgY2FuIGFsc28gZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCQkgIAoJCSAgc2VsZi50aGlzLmRpc293bigpCgkJICBzZWxmLnRoaXMub3duKDApCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpcy5hY3F1aXJlKCkKCQkgIHNlbGYudGhpcy5vd24oMSkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoKCSAgICAgIFN0aWxsIHRoZSBvbGQgd2F5LAoJICAgICAgCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKCQkgIHNlbGYudGhpc293biA9IDAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXNvd24gPSAxCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKICAgICAgICAgICAgICBpcyBzdXBwb3J0ZWQsIGFuZCBweXRob24gZGlzcGF0Y2hlcyB0aGUgcHJvcGVyIG1ldGhvZAogICAgICAgICAgICAgIGNhbGxzIGFzIG5lZWRlZC4gCQkgIAoJICAgICAgIAoKCSAgICAtIFN1cHBvcnQgZm9yIGl0ZXJhdG9ycyBpbiBTVEwvU1REIGNvbnRhaW5lcnMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGU8c2V0X3N0cmluZz4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OwoJICAgICAgICAgIAogICAgICAgICAgICAgICB5b3UgY2FuIHVzZSB0aGUgQysrIGl0ZXJhdG9ycyBhczogIAoKICAgICAgICAgICAgICAgICAgICAgcyA9IHNldF9zdHJpbmcoKQoJCSAgICAgICAgICAgICAgICAgICAgIAoJCSAgICAgcy5hcHBlbmQoImMiKSAgIAoJCSAgICAgcy5hcHBlbmQoImEiKSAgIAoJICAgICAgICAgICAgIHMuYXBwZW5kKCJiIikKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJhYmMiIAoKCQlhZHZhbmNlIHRoZSBpdGVyYXRvciBhcyBpbiBDKysKCiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGN1cnJlbnQgKz0gMQogICAgICAgICAgICAgICAgICAgICBwcmludCBjdXJyZW50LnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIAoJCW5vdyB1c2luZyB0aGUgcmV2ZXJzZSBvcGVyYXRvcnMKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLnJiZWdpbigpICAgICAgCgkJICAgICBlID0gcy5yZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgoJICAgICAgICBvciB0aGUgJ3ByZXZpb3VzJyBtZXRob2QKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBlLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgogICAgICAgICAgICAgICAgb3IganVzdCBhcyBpbiBhIHB5dGhvbiBmYXNoaW9uCgogICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIE5vdGUgMTogSXRlcmF0b3JzIGluIEMrKyBhcmUgdmVyeSBwb3dlcmZ1bCwgYnV0CiAgICAgICAgICAgICAgICBkYW5nZXJvdXMgdG9vLiBBbmQgaW4gcHl0aG9uIHlvdSBjYW4gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QKICAgICAgICAgICAgICAgIGp1c3QgbGlrZSBpbiBDKyssIHNvLCBiZSBjYXJlZnVsLgoJCQoJCU5vdGUgMjogdGhlIGl0ZXJhdG9ycyBhcmUgJ2xpZ2h0JywgaWUsIHRoZXkgZG8gbm90CgkJY29udmVydCBzZXF1ZW5jZSBlbGVtZW50cyB1bnRpbCB5b3UgcmVxdWVzdCB0byBkbyBzbywgdmlhCgkJbmV4dCgpLCB2YWx1ZSgpIG9yIHByZXZpb3VzKCkuIElmIHlvdSBqdXN0IGluY3JlbWVudC9kZWNyZW1lbnQgb25lCgkJbm8gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkgICAgICAgICAgICAgYiArPSAxCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigpCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigyKQoJCSAgICAgYi5kZWNyKDIpCiAgICAgICAgICAgICAgICAgICAgIGIuZGVjcigpCiAgICAgICAgICAgICAgICAgICAgIGIgLT0gMQoKCQkgb25seSB0aGUgaXRlcmF0b3IgaXMgbW9kaWZpZWQsIGFuZCBub3QgdmFsdWUgd3JhcHBlcgoJCSBpcyBnZW5lcmF0ZWQuIE90aGVyIHR5cGljYWwgQysrIG9wZXJhdGlvbnMgYXJlIGFsc28gCgkJIGF2YWlsYWJsZSwgc3VjaCBhczoKCgkJICAgICBwcmludCBzLmVuZCgpIC0gcy5iZWdpbigpCgkJICAgICA+Pj4gMwoJCSAgICAgZiA9IHMuYmVnaW4oKSArIDEKCQkgICAgIHByaW50IGYudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgbCA9IHMuZW5kKCkgLSAxCgkJICAgICBwcmludCBsLnZhbHVlKCkKCQkgICAgID4+PiAiYyIKCQkgCgkJIGV0Yy4gIE9mIGNvdXJzZSwgdGhlICdmaW5kJywgJ2luc2VydCcsICdlcmFzZScsIGFuZAoJCSBzbyBvbiBtZXRob2RzIGFsc28gc3VwcG9ydHMgaXRlcmF0b3JzIG5vdywgaWU6CgoJCSAgICAgIGkgPSBzLmJlZ2luKCkKCQkgICAgICBpICs9IDEKCQkgICAgICBzLmVyYXNlKGkpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkKCQkgICAgICBwcmludCBzdW0KCQkgICAgICA+Pj4gImFjIgoJCSAgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlcmUgaXMgbm8gbW9yZSAndGhpc293bicgYXR0cmlidXRlLiBJZiB5b3UgdXNlIGl0LCBweXRob24KCSAgICB3aWxsIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvZGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi50aGlzb3duKTogICA9PT4gICBpZiAoc2VsZi50aGlzLm93bigpKToKCQlzZWxmLnRoaXNvd24gPSAxICAgICA9PT4gICBzZWxmLnRoaXMub3duKDEpCiAgICAgICAgICAgICAgICBzZWxmLnRoaXNvd24gPSAwICAgICA9PT4gICBzZWxmLnRoaXMub3duKDApCgoJICAgIFN0aWxsLCBtYXliZSBpbiBzb21lIHVudXN1YWwgY2FzZXMgdGhlIHRyYW5zbGF0aW9uIHdpbGwgbm90IGJlCgkgICAgMTAwJSBjb3JyZWN0LCBzbyBpZiB5b3UgaGF2ZSBhIHByb2JsZW0sIHBsZWFzZSByZXBvcnQgaXQKCSAgICBhbmQvb3IgdXNlIHRoZSBuZXcgJ3NlbGYudGhpcy5vd24oKScgYWNjZXNzb3IuCgkgICAgCgkgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIFRoZXJlIGlzIG5vIG1vcmUgQ2xhc3NQdHIgY2xhc3NlcyBpbiB0aGUgcHl0aG9uIGNvZGUuIEhlbmNlLAoJICAgIGlmIGluIHRoZSBwYXN0IHlvdSBuZWVkZWQgdG8gcmVzb3J0IHRvIHNvbWUga2luZCBvZiB0cmlja2VyeQoJICAgIHdpdGggdGhlbSwgb3Igb3ZlcmNvbWUgdGhlaXIgcHJlc2VuY2UsIGl0IGlzIG5vIGxvbmdlcgoJICAgIHJlcXVpcmVkLCBidXQgdGhlIGV4dHJhIGNvZGUgeW91IGFkZGVkIGNvdWxkIG5vdyBicmVhawoJICAgIHRoaW5ncy4KCgkgICAgSWYgbmVlZGVkLCB5b3UgY2FuIHVzZSB0aGUgb3B0aW9uIC1jbGFzc3B0ciwgaS5lLiwKCiAgICAgICAgICAgICAgIHN3aWcgLWNsYXNzcHRyIC1weXRob24gLi4uCgoJICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgQ2xhc3NQdHIgY2xhc3Nlcy4KCgoxMC8zMC8yMDA1OiBta29lcHBlIAoJICAgIFtHdWlsZV0gTWFrZSBkZWNsYXJlZCBhbmQgZGVmaW5lZCBsaW5rYWdlIG9mIFNXSUdfaW5pdCBjb25zaXN0ZW50LiAgCgkgICAgUmVwb3J0ZWQgYnkgU3RldmVuIEcuIEpvaG5zb24gKFNGIHBhdGNoIDEzMTU0OTgpLgoKMTAvMjYvMjAwNTogbW1hdHVzCgoJICAtIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSBnbG9iYWwgbGlicmFyeSBkaXJlY3Rvci4KCSAgICBOb3cgaXQgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3QgdXNlCgkgICAgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IGFzIHdlbGwuCgoJICAgIFNvLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgJWluY2x1ZGUgYXR0cmlidXRlLmkKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGUoQSwgaW50LCBhLCBnZXRfYSwgc2V0X2EpOwoJICAgICAgIAkJCQkgICAgICAJICAKCSAgICAgICBzdHJ1Y3QgQQkJCSAgICAgIAkgIAoJICAgICAgIHsgICAgCQkJCSAgCgkgICAgICAgICBpbnQgZ2V0X2EoKSBjb25zdDsgCQkgIAoJICAgICAgICAgdm9pZCBzZXRfYShpbnQgYWEpOyAJCSAgCgkgICAgICAgfTsJCQkJICAKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKEIsIGludCwgYyk7CgkgICAgICAgCQkJCQoJICAgICAgIHN0cnVjdCBCCQkJCgkgICAgICAgeyAgICAJCQkKCSAgICAgICAgIGludCYgYygpOyAJCQoJICAgICAgIH07IAoKCSAgICB0aGVuIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdGhlICdBLmEnIGFuZCAnQi5jJyBhdHRyaWJ1dGVzIHdpbGwKCSAgICBiZSB2aXNpYmxlLCBpZSwgeW91IGNhbiBhY2Nlc3MgdGhlbSBhcyBwbGFpbiB2YXJpYWJsZXM6CgogICAgICAgICAgICAgICBmICAgPSBBKCkKICAgICAgICAgICAgICAgZi5hID0gMwogICAgICAgICAgICAgICBnICAgPSBCKCkKICAgICAgICAgICAgICAgZy5jID0gMyAKICAgICAgICAgICAKCSAgICAgICBoICAgPSBmLmEgKyBnLmMKCgkgICAgYW5kIHRoZSBwcm9wZXIgZ2V0L3NldCBtZXRob2RzIHdpbGwgYmUgZGlzcGF0Y2hlZC4gU2VlCgkgICAgYXR0cmlidXRlLmkgZm9yIG1vcmUgaW5mby4KICAgCiAgICAgICAgICAtIE1vcmUgY2xlYW51cHMgYXJvdW5kIGFuZCBhZGRpbmcgbW9yZSB0ZXN0LWNhc2VzLiBUaGUKICAgICAgICAgICAgRElTT1dOIHR5cGVtYXAgbm93IGlzIHRlc3RlZCBhbmQgd29ya2luZyBpbiBhbGwgdGhlCiAgICAgICAgICAgIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGllLCB0Y2wsCiAgICAgICAgICAgIHJ1YnksIHBlcmwgYW5kIHB5dGhvbi4KCSAgICAKCjEwLzI1LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwsIGNvbXBsZXRlIHRoZSBESVNPV04gdHlwZW1hcC4KCSAgICAKCSAgICAtIGFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSB1bmlmaWVkIHR5cGVtYXAKICAgICAgICAgICAgICBsaWJyYXJ5IChiZWZvcmUgd2FzIG9ubHkgdXNhYmxlIGZyb20gcHl0aG9uKS4KCgkgICAgLSB1bmlmeSB0aGUgbmFtZXMgZm9yIHRoZSBzZXR0ZXIgYW5kIGdldHRlciBtZXRob2RzIGluCgkgICAgICBwZXJsLHRjbCxydWJ5IGFuZCBweXRob24sIHNvLCB0aGUgYXR0cmlidXRlLmkgbGlicmFyeQoJICAgICAgY2FuIHdvcmsgYWNyb3NzIHRoZW0uCgkgICAgICAKCSAgICAtIHNlZSB0aGUgbGlfYXR0cmlidXRlLmkgdGVzdC1jYXNlIG9yIHRoZSBsaWJyYXJ5IGZpbGUKCiAJICAgICAgICBMaWIvdHlwZW1hcHMvYXR0cmlidXRlLnN3ZwoKICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvIGFib3V0IGhvdyB0byB1c2UgaXQuCgogCgkgICAgICAKCjEwLzI0LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwgbm93IHVzZXMgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LgoKCSAgICAtIENoYW5nZXMgaW4gcnVieSB0byB1c2UgdGhlICR0cmFjayBvcHRpb24gaW4gdHlwZW1hcHMuCgoJICAgIC0gQ2hhbmdlcyBpbiB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgdG8gZm9sbG93IHRoZQoJICAgICAgY29udmVudGlvbiB0aGF0IGFsbCBtYWNyb3MgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlCgkgICAgICBDL0MrKyBzaWRlIHN0YXJ0cyB3aXRoICUsIHN1Y2ggYXMKCgkgICAgICAgICAgICVkZWxldGUKCQkgICAlbmV3X2FycmF5CgogICAgICAgICAgICAgIGV0Yy4KCSAgICAgIAoJICAgIC0gRG9jdW1lbnRpbmcgZnJhZ21lbnRzLCBzZWUgZnJhZ21lbnRzLnN3Zy4KCgkgICAgLSBDbGVhbmVyIHdheSB0byB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpbmNsdWRlCgkgICAgICBqdXN0IDx0eXBlbWFwcy9zd2lndHlwZXMuc3dnPi4KCgkgICAgICBDaGVjayBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBwZXJsLCB0Y2wsIHJ1YnksCgkgICAgICBweXRob24uCgoJICAgICAgQWx3YXlzIHN0YXJ0IHdpdGggdGhlIGhlYWQgZmlsZSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXRob24uc3dnCgkgICAgICAgICB0Y2wvdGNsOC5zd2cKCSAgICAgICAgIHJ1YnkvcnVieS5zd2cKCSAgICAgICAgIHBlcmw1L3Blcmw1LnN3ZwoKICAgICAgICAgICAgICBhbmQgdGhlIHByaW5jaXBhbCBmaWxlIHRoYXQgaW52b2tlcyB0aGUgdW5pZmllZCBsaWJyYXJ5LCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHRjbC90Y2x0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcnVieS9ydWJ5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHBlcmwvcGVybHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgCgkgICAgICBUaGUgZmlsZSB0aGF0IHByb3ZpZGUgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBlYWNoCgkgICAgICBsYW5ndWFnZSBhcmUgdGhlIG9uZSB0aGF0IHByb3ZpZGVzIHRoZSBiYXNpYyB0eXBlczoKCgkgICAgICAgICBweXRob24vcHlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcnVieS9ydWJ5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcGVybDUvcGVybHByaW10eXBlcy5zd2cKCgkgICAgICBhbmQgdGhlIHN0cmluZyBtYW5pcHVsYXRpb246ICAJIAoJICAgIAoJICAgICAgICAgcHl0aG9uL3B5c3RyaW5ncy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxzdHJpbmdzLnN3ZwoKCQkgCgkgICAgICBUaGUgcmVzdCBvZiB0aGUgZmlsZXMsIHN1Y2ggYXMgY2FycmF5LmksIGFyZSBtb3N0bHkgb25lIAoJICAgICAgbGluZSBmaWxlcyB0aGF0IGluY2x1ZGUgdGhlIHByb3BlciB0eXBlbWFwIGxpYnJhcnkKCSAgICAgIHZlcnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBQZXJsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gUGVybC4KCjEwLzIzLzIwMDU6IHd1enplYgogICAgICAgICAgICBDaGlja2VuOgogICAgICAgICAgICAgICsgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucyBmaW5hbGx5IHdvcmsgcHJvcGVybHkKICAgICAgICAgICAgICArIGFkZCB0ZXN0IG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB0byBjcHBfYmFzaWMuaQoKMTAvMjAvMjAwNTogZGFuY3kKCSAgICBbYWxsZWdyb2NsXSBBZGRlZCBDKysgc3VwcG9ydC4gTGFyZ2UgdXBkYXRlLCBtYW55IGNoYW5nZXMuIFNlZQoJICAgIG5ld2x5IGFkZGVkIEFsbGVncm8gQ29tbW9uIExpc3Agc2VjdGlvbiBpbiBsaXNwLmh0bWwKCjEwLzIwLzIwMDU6IG1tYXR1cwoJICAgIFJ1YnksIFRjbCwgUHl0aG9uOgoKCSAgICAtIFVuaWZvcm0gd2F5IHRvIGZhaWwgKGxhYmVsIGZhaWw6KSwgbm93IGZpbmFsbHkKCSAgICAgIFNXSUdfZXhjZXB0aW9uIHdvcmtzIGFjcm9zcyB0aGUgdGhyZWUgbGFuZ3VhZ2VzIGFuZCBhbGwKCSAgICAgIHRoZSB0eXBlbWFwcy4KCgkgICAgLSBBZGQgcHJvcGVyIGNsZWFudXAgY29kZSB0byBydWJ5CgoJICAgIC0gTW9yZSB2YWxncmluZCBmaXhlcwoKCSAgICAtIFNpbXBsaWZ5IHRoZSBpbmxpbmUgdXNlLCBpdCBzZWVtcyBhIHNtYWxsIGludGVyZmFjZSBvZgoJICAgICAgMjAsMDAwIGxpbmVzIChwbHVzIG1hbnkgbWFueSB0ZW1wbGF0ZXMpIGNhbiBicmVhayAKCSAgICAgIGdjYyAtTzMgZWFzaWx5LgoKCSAgICAtIEZpbmFsaXplIHRoZSB0eXBlbWFwcyBsaWJyYXJ5LiBBbGwgdGhlIG9sZCAgKi5pIGZpbGVzCgkgICAgICAoY2FycmF5LmksIGNwb2ludGVyLmksIGV4Y2VwdGlvbi5pKSBoYWQgYmVlbiBpbXBsZW1lbnRlZAoJICAgICAgaW4gdGhlIG5ldyB0eXBlbWFwcyBsaWJyYXJ5LgoJICAgIAoKMTAvMTkvMjAwNTogd3V6emViCgkgICAgVXBkYXRlIHRoZSBSdW50aW1lIFR5cGVtYXAgZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sCgoxMC8xOC8yMDA1OiB3dXp6ZWIKCSAgICBDaGlja2VuOgoJICAgICAgLSBDb3JyZWN0bHkgaGFuZGxlICVpZ25vcmVkIGNsYXNzZXMKICAgICAgICAgICAgICAtIENvcnJlY3RseSBjb252ZXJ0IGxvbmcsIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZywgZXRjCiAgICAgICAgICAgICAgICB0byBjaGlja2VuIHByaW1pdGl2ZXMuIChUaGFua3MgdG8gRmVsaXggV2lua2VsbWFubikKICAgICAgICAgICAgICAtIFVzaW5nIGFyZ291dCBwYXJhbWV0ZXJzIHdoZW4gdGhlIHJldHVybiB2YWx1ZSB3YXMgYQogICAgICAgICAgICAgICAgd3JhcHBlZCBwb2ludGVyIGNhdXNlZCBhIG1lbW9yeSBjb3JydXB0aW9uLiAgVGhlIGNoaWNrZW4KICAgICAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIG1vdmVkIGEgcG9pbnRlciBvdXQgZnJvbSB1bmRlciB1cy4KICAgICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGJ5IHJ1bm5pbmcgYWxsIHRoZSBwcm94eSBjcmVhdGlvbgogICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFzIGNvbnRpbnVhdGlvbnMgYWZ0ZXIgdGhlIHdyYXBwZXIgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHJldHVybnMuICBBcyBwYXJ0IG9mIHRoaXMsIHdlIG5vIGxvbmdlciBuZWVkIHRoZQogICAgICAgICAgICAgICAgY2hpY2tlbmZhc3Rwcm94eSBmbGFnIG9uIG91dHB1dCB0eXBlbWFwcy4KICAgICAgICAgICAgICAtIHVzaW5nIC1wcm94eSBhbmQgLW5vY29sbGVjdGlvbiB0b2dldGhlciB3b3JrcyBub3cKICAgICAgICAgICAgICAgIEJlZm9yZSwgaXQgd2FzIG5vdCBleHBvcnRpbmcgdGhlIGRlc3RydWN0b3IgaW4gdGhlIHByb3h5CiAgICAgICAgICAgICAgICB3cmFwcGVyLgoKMTAvMTgvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgQWRkZWQgdGhlIFVuaWZpZWQgVHlwZW1hcCBMaWJyYXJ5IChVVEwpLiBJdCB1bmlmaWVzIHRoZSB0eXBlbWFwcyBmb3IKCiAJICAgICAgICBweXRob24sIHJ1YnksIHRjbAoKCSAgICBhbmQgaW4gdGhlIHByb2Nlc3MsIGZpeGVzIHNldmVyYWwgcHJvYmxlbXMgaW4gZWFjaCBvZiB0aGUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdG8gd29yayBpbiBhICJjYW5vbmljYWwiIHdheSBub3cgZXN0YWJsaXNoZWQgaW4KCSAgICB0aGUgdHlwZW1hcCBsaWJyYXJ5CgkgICAgCgkgICAgICAgU1dJRy9MaWIvdHlwZW1wYXMKCgkgICAgVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1bmlmaWNhdGlvbiBpcyB0aGF0IGV2ZXJ5dGhpbmcKCSAgICBjb21waWxlcyBhbmQgcnVucyBpbnNpZGUgdGhlIHRlc3Qtc3VpdGUgYW5kIGV4YW1wbGVzCgkgICAgZGlyZWN0b3JpZXMuIEFuZCBmb3IgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0aGFuIHBhc3MgdGhlIHByaW1pdGl2ZV90eXBlcy5pIGNhc2UuCgoJICAgIEFsc28sIHdlIGhhdmUgYSB1bmlmb3JtIHdheSB0byB0cmVhdCB0aGUgZXJyb3JzLCBmb3IgZXhhbXBsZQoJICAgIGlmIHlvdSBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgID4+PiBmcm9tIHByaW1pdGl2ZV90eXBlcyBpbXBvcnQgKgogICAgICAgICAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTApCiAgICAgICAgICAgICAgMTAKCSAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTAwMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CQkgICAgICAKCSAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwkJCSAgICAKCSAgICAgIE92ZXJmbG93RXJyb3I6IGluIGFyZ3VtZW50IDEgb2YgdHlwZSAndW5zaWduZWQgY2hhcicKCgkgICAgeW91IGdldCB0aGUgc2FtZSBleGNlcHRpb24gaW4gYWxsIHRoZSB0aHJlZSBsYW5ndWFnZXMuCgkgICAgCgkgICAgQW5kIHdlbGwsIG1hbnkgbW9yZSBnb29kIHRoaW5ncyB3aWxsIGNvbWUgZnJvbSB0aGlzCgkgICAgdW5pZmljYXRpb24sIGZvciBleGFtcGxlLCBwcm9wZXIgc3VwcG9ydCBvZiB0aGUgU1RML1NURCBjbGFzc2VzCgkgICAgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgaG9wZWZ1bGx5LCB3ZSBjYW4ga2VlcAoJICAgIGFkZGluZyBvdGhlciBsYW5ndWFnZXMuCgoJICAgIFRoZSBoYXJkZXN0IHBhcnQsIHdyaXRpbmcgYSBjb21tb24gdHlwZW1hcCBsaWJyYXJ5CgkgICAgdGhhdCBzdWl0ZXMgdGhlIHRocmVlIGRpZmZlcmVudCBsYW5ndWFnZXMsIGlzIGRvbmUsCgkgICAgYW5kIGFkZGluZyBhbm90aGVyIGxhbmd1YWdlIHNob3VsZCBub3cgYmUgZWFzeS4gCgoJICAgIFN0aWxsIHRoZSBnbG9iYWwgdW5pZmljYXRpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgU1RML1NURCAKCSAgICBwYXJ0IGlzIG5leHQsIGFuZCBwcm9iYWJseSBhcyB3ZWxsIGFzIGFkZGluZyBvbmUgb3IgdHdvIG1vcmUKCSAgICBsYW5ndWFnZXMuCgoJICAgIElmIHlvdSBhcmUgY3VyaW91cywgbG9vayBhdCB0aGUgcHl0aG9uLCBydWJ5IGFuZC9vciB0Y2wKCSAgICBkaXJlY3RvcmllcyB0byBzZWUgd2hhdCBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbmV3CgkgICAgY29tbW9uIHR5cGVtYXBzIGxpYnJhcnkuICBTdGlsbCwgdGhlIGZpbmFsIHdheSB0bwoJICAgIGludGVncmF0ZSBhIG5ldyBsYW5ndWFnZSBjb3VsZCBjaGFuZ2UgYXMgd2UgbW92ZSB0bwoJICAgIGludGVncmF0ZSB0aGUgU1REL1NUTC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFJ1YnkvVGNsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgYmVoYXZpb3IsIHNwZWNpYWxseSBpbiBydWJ5IGFuZCB0Y2wuCgpWZXJzaW9uIDEuMy4yNyAoT2N0b2JlciAxNSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB0eXBlc2FmZSBlbnVtIHdyYXBwaW5nIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KICAgICAgICAgICAgb3ZlcmxvYWQgYSBtZXRob2Qgd2l0aCAyIGRpZmZlcmVudCBlbnVtIHR5cGVzLgoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZmVhdHVyZSgiaW1tdXRhYmxlIiwiMCIpIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgc2V0dGVycwogICAgICAgICAgICBmb3IgY29uc3RhbnRzLgoKICAgICAgICAgICAgUmVzdG9yZWQgJWltbXV0YWJsZSBhbmQgJW1ha2VkZWZhdWx0IHRvIGNsZWFyIHRoZSBmZWF0dXJlIGFzIGl0CiAgICAgICAgICAgIGJlaGF2ZWQgaW4gU1dJRy0xLjMuMjUgYW5kIGVhcmxpZXIuCgoxMC8xNC8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgRml4IGJ1ZyBpbiBhbm9ueW1vdXMgdHlwZWRlZiBzdHJ1Y3R1cmVzIHdoaWNoIHdhcyBsZWFkaW5nIHRvCiAgICAgICAgICAgIHN0cmFuZ2UgYmVoYXZpb3VyLgoKMTAvMTMvMjAwNTogbW1hdHVzCgkgICAgU2V2ZXJhbCBtaW5vciBjaGFuZ2VzOgoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgd2NoYXJfdCB0eXBlIHN1cHBvcnQKCSAgICAtIEFkZCBhIHdhcm5pbmcgZm9yIHdoZW4geW91IGRlZmluZSB0aGUgJ2luJyB0eXBlbWFwIGJ1dAoJICAgICAgeW91IGRvbid0IGRlZmluZSB0aGUgJ3R5cGVjaGVjaycgb25lLiBWZXJ5IGNvbW1vbiBtaXN0YWtlLgoJICAgIC0gQWRkIHByb3BlciBkZWZhdWx0IHJ1bGUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLCBub3cgeW91CgkgICAgICBjYW4gZGVmaW5lIGEgdHlwZW1hcCBzdWNoIGFzOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAoKCopKEFOWSkpIHsuLi59CgoJICAgICAgVGhhdCB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgcG9pbnRlciB0byBmdW5jdGlvbnMuIFRoZQoJICAgICAgcnVsZSBpbiBDKysgYWxzbyBhcHBseSB0byB0aGUgZnVuY3Rpb24gJ3JlZmVyZW5jZScsIGllLAoJICAgICAgaW4gYm90aCBjYXNlcwoKCSAgICAgICAgdHlwZWRlZiAgaW50ICgqZnB0cikoaW50IGEpOwoJICAgICAgICB0eXBlZGVmICBpbnQgKGZ1bmMpKGludCBhKTsKCgkgICAgICBUaGlzIHdhcyBuZWVkZWQgc2luY2UgaXQgc2VlbXMgdG8gYmUgJ2lsbGVnYWwnIGluIEMrKyB0bwoJICAgICAgZG8gc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCAqPihmcHRyKTsKCgkgICAgICBhbmQgcHJvYmFibHksIGFzIGZvciBtZW1iZXIgZnVuY3Rpb25zLCBpdCBpcyBub3QKCSAgICAgIHdhcnJhbnRpZWQgdGhhdCB0aGUgcG9pbnRlciBzaXplcyB3aWxsIG1hdGNoLgoKCSAgICAtIEFkZCB0aGUgI2Vycm9yLyN3YXJuaW5nIGRpcmVjdGl2ZXMgdG8gc3dpZydzIGNwcC4KCgkgICAgLSBBZGQgdGhlIG5vYmxvY2sgb3B0aW9uIGZvciB0eXBlbWFwcywgd2hpY2ggaXMgdXNlZCBhcwogICAgICAgICAgICAgIGZvbGxvd3M6IHN1cHBvc2VkIHlvdSBhIHR5cGVtYXAsIGxpa2UgdGhpcwoKCSAgICAgIAoJICAgICAgJXR5cGVtYXAoaW4sbm9ibG9jaz0xKSBIZWxsbyB7CQkJICAgCgkgICAgICAgICAuLi4uCiAgICAgICAgICAgICAgfQoKCSAgICAgIHRoZW4gdGhlIHR5cGVtYXAgd2lsbCBiZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBibG9jawoJICAgICAgaW1wb3NlZCBieSB0aGUgYnJhY2tldHMsIHNpbWlsYXIgdG8KCgkgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIuLi4iOwoKCSAgICAgIFNvLCB3aHkgeW91IGRvbid0IGp1c3QgdXNlIHRoZSBxdW90ZSBzdHlsZT8sIGJlY2F1c2U6CgkgICAgICAKCSAgICAgICAgIDEuLSBUaGUgcXVvdGUgc3R5bGUgZG9lc24ndCBnZXQgcHJlcHJvY2Vzc2VkLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDE9IFNXSUdfbWFjcm8oJDEpOyI7CgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiOwoKCQkgMy4tIFlvdSBjYW4ndCBtYWtlIGVtYWNzIGFuZC9vciBvdGhlciBlZGl0b3JzCgkJICAgICB0byBpbmRlbnQgaW5zaWRlIGEgc3RyaW5nIS4gCgoKCSAgICAgIFNvLCB3aHkgZG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBibG9jaz8sIGJlY2F1c2UgYW4gZXh0cmEKCSAgICAgIGJsb2NrIHdoZW4gbm90IG5lZWRlZCAobm8gbG9jYWwgdmFyaWFibGVzIGluIGl0KToKCgkgICAgICAgICAgMS4tIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkCiAgICAgICAgICAgICAgICAgIDIuLSBtYWtlcyB0aGUgY29kZSBsYXJnZXIKICAgICAgICAgICAgICAgICAgMy4tIG9yIGluIHNob3J0LCBmb3IgdGhlIHNhbWUgcmVhc29uIHdlIGhhdmUgdGhlIHF1b3RlIHN0eWxlLgoKVmVyc2lvbiAxLjMuMjYgKE9jdG9iZXIgOSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZGVkICd0aHJvd3MnIHR5cGVtYXBzLgoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZQogICAgICAgICAgICBmaXJzdCBub24taWdub3JlZCBjbGFzcyBpbiB0aGUgcHVibGljIGJhc2UgY2xhc3MgbGlzdCBpcyB1c2VkIGZvciBpbmhlcml0YW5jZS4KICAgICAgICAgICAgYnkgdGhlIHByb3h5IGNsYXNzLiBQcmV2aW91c2x5LCBpZiB0aGUgZmlyc3QgY2xhc3MgaW4gdGhlIGxpc3Qgd2FzIGlnbm9yZWQsIHRoZW4KICAgICAgICAgICAgdGhlIHByb3h5IGNsYXNzIHdvdWxkbid0IGhhdmUgYW55IGJhc2UgY2xhc3Nlcy4KCjEwLzA3LzIwMDU6IG1tYXR1cwoJICAgICBVcGRhdGUgbW9yZSBmZWF0dXJlcyB0byBmb2xsb3cgbmV3IGNvbnZlbnRpb24sIGluY2x1ZGluZzoKCgkgICAgICAgY2FsbGJhY2sKCSAgICAgICByZWYvdW5yZWYKCSAgICAgICBleGNlcHQKCSAgICAKCSAgICAgQWxsIG9mIHRoZW0gdXNlIG5vdCBvbmx5IHRoZSBmZWF0dXJlIGFzIGEgZmxhZywgYnV0IGFsc28KCSAgICAgYXMgY29kZSB2YWx1ZS4gVG8gZGVhbCB3aXRoIHRob3NlIGZlYXR1cmVzLCB3ZSB1c2Ugbm93CgkgICAgIEdldEZsYWdBdHRyLCB3aGljaCBpcyBzaW1pbGFyIHRvIEdldEZsYWcsIGJ1dCBpbnN0ZWFkIG9yCgkgICAgIHJldHVybmluZyAxIG9yIDAsIGl0IHJldHVybnMgdGhlIGF0dHIgdmFsdWUsIGlmIGhhcHBlbnMKCSAgICAgdG8gYmUgZGlmZmVyZW50IG9mICIwIiBvZiBjb3Vyc2UuCgoJICAgICBOb3cgdGhlcmUgYXJlIGFsc28gbW9yZSB1bmlmb3JtIGRpcmVjdGl2ZSBuYW1lcyBmb3IgdGhlIAoJICAgICBvbmVzIGJhc2VkIGluIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBvbGQKCSAgICAgJW5ld29iamVjdCBkaXJlY3RpdmUgbm93IHdlIGhhdmUgdHJlZSBkaXJlY3RpdmVzIGRlZmluZWQ6CgkgICAgIAoKCSAgICAgI2RlZmluZSAlbmV3b2JqZWN0ICAgICAgICAlZmVhdHVyZSgibmV3IikKCSAgICAgI2RlZmluZSAlbm9uZXdvYmplY3QgICAgICAlZmVhdHVyZSgibmV3IiwiMCIpCgkgICAgICNkZWZpbmUgJWNsZWFybmV3b2JqZWN0ICAgJWZlYXR1cmUoIm5ldyIsIiIpCgoJICAgICBhbmQgc28gb24gZm9yIGFsbCB0aGUgb3RoZXIgZmVhdHVyZSBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8zMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHNvbWUgZmVhdHVyZXMuIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1hbnkKICAgICAgICAgICAgZmVhdHVyZXMgb25jZSB0aGV5IGhhZCBiZWVuIGVuYWJsZWQuIFRoaXMgd2FzIGZvciBtb3N0IGZlYXR1cmVzIHRoYXQgYmVoYXZlIGFzCiAgICAgICAgICAgIGZsYWdzLiBUaGVzZSBmZWF0dXJlcyBub3cgd29yayBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIpICAgICAgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMSIpICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjAiKSAgICAgICAgIC8vIGRpc2FibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiIikgICAgICAgICAgLy8gY2xlYXJzIHRoZSBmZWF0dXJlCgogICAgICAgICAgICBJbiBmYWN0IGFueSBub24tZW1wdHkgdmFsdWUgb3RoZXIgdGhhbiAiMCIgd2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgKGxpa2UgQyBib29sZWFuIGxvZ2ljKS4KICAgICAgICAgICAgUHJldmlvdXNseSAiMSIsICIwIiBvciBhbnkgb3RoZXIgbm9uLWVtcHR5IHZhbHVlIHdvdWxkIGVuYWJsZSB0aGUgZmVhdHVyZSBhbmQgaXQgd291bGQKICAgICAgICAgICAgb25seSBiZSBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSBmZWF0dXJlIGJ5IGNsZWFyaW5nIGl0IChhc3N1bWluZyB0aGVyZSB3YXMgbm8gZ2xvYmFsIGVuYWJsZSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBhZmZlY3RlZDoKCiAgICAgICAgICAgICAgYWxsb3dleGNlcHQKICAgICAgICAgICAgICBjb21wYWN0ZGVmYXVsdGFyZ3MKICAgICAgICAgICAgICBjbGFzc2ljICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgY3M6Y29uc3QgICAgICAgICAgICAgICAoQyMpCiAgICAgICAgICAgICAgZGlyZWN0b3IKICAgICAgICAgICAgICBleGNlcHRpb25jbGFzcyAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgaWdub3JlCiAgICAgICAgICAgICAgaW1tdXRhYmxlCiAgICAgICAgICAgICAgamF2YTpjb25zdCAgICAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBqYXZhOmRvd25jYXN0ICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGt3YXJncwogICAgICAgICAgICAgIG1vZGVybiAgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBuZXcKICAgICAgICAgICAgICBub2F1dG9kb2MgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbm9kZWZhdWx0CiAgICAgICAgICAgICAgbm9kaXJlY3RvcgogICAgICAgICAgICAgIG5vcmVmCiAgICAgICAgICAgICAgbm90YWJzdHJhY3QKICAgICAgICAgICAgICBub3VucmVmCiAgICAgICAgICAgICAgbm92YWx1ZXdyYXBwZXIKICAgICAgICAgICAgICBweXRob246bWF5YmVjYWxsICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgcHl0aG9uOm5vbmR5bmFtaWMgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG1vZHVsYTM6bXVsdGlyZXR2YWwgICAgKE1vZHVsYTMpCiAgICAgICAgICAgICAgcHJlZGljYXRlICAgICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB0cmFja29iamVjdHMgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHZhbHVld3JhcHBlcgoKICAgICAgICAgICAgSXQgaXMgbm93IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB0byBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcyBpbiBhIGhlYWRlciBmaWxlLCBleGNlcHQgZm9yIGEKICAgICAgICAgICAgZmV3IHRhcmdldHRlZCBtZXRob2RzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIHNvbWVfZnVuY3Rpb24oaW50LCBkb3VibGUpOyAvLyBkbyBub3QgaWdub3JlIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczsgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgQ2xhc3MKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczo6bWV0aG9kOyAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJpZ2hlYWRlci5oIgoKICAgICAgICAgICAgUmVtb3ZlZCAlcHl0aG9uZHluYW1pYyAtIGl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVXNlICVweXRob25ub25keW5hbWljIGluc3RlYWQuCiAgICAgICAgICAgIFJlbW92ZWQgJWZlYXR1cmUoIm5va3dhcmdzIikgLSBpdCB3YXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgIC0gdXNlICVmZWF0dXJlKCJrd2FyZ3MiLCIwIikgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMjUvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gQWRkICJ0aHJvd3MiIHR5cGVtYXBzLgoKMDkvMjQvMjAwNTogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XSBBZGRzIG5ldyAldHJhY2tvYmplY3RzIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXBzIEMrKyBvYmplY3RzIHRvCiAgICAgICAgICAgIFJ1Ynkgb2JqZWN0cy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBpbXBsZW1lbnQKICAgICAgICAgICAgbWFyayBmdW5jdGlvbnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIHJlZmVyIHRvIHRoZSB1cGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCiAgICAgICAgICAgIAowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGF0Y2ggMTExNjQzMSBmcm9tIEpvc2ggQ2hlcnJ5LiBGaXhlcyBub24gbWVtYmVyIGZ1bmN0aW9ucyBpbmFkdmVydGVudGx5CiAgICAgICAgICAgIGJlaW5nIGNhbGxlZCBpbnN0ZWFkIG9mIG1lbWJlciBmdW5jdGlvbnMuCgowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCBmcm9tIE1hcmsgR29zc2FnZSB0byBhZGQgc3VwcG9ydCBmb3IgTHVhLTUuMSwgc3RkOjpzdHJpbmcsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yLCBzdGQ6OmV4Y2VwdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCjA5LzE0LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCAtbm9jcHBjYXN0LiBOb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KCSAgICBhbHdheXMgdXNlIHRoZSBjcHBjYXN0IG9wZXJhdG9ycy4gQmVmb3JlIHRoYXQgd2FzIHRoZSBjYXNlCgkgICAgb25seSB3aGVuIHlvdSB1c2VkIHRoZSAtY3BwY2FzdCBvcHRpb24uCgogICAgICAgICAgICBJZiB0aGlzIHNlZW1zIHRvIGJyZWFrIHlvdXIgY29kZS4uLiB5b3VyIHdlbGNvbWUhLCBpdAoJICAgIG1lYW5zIGl0IHdhcyBicm9rZW4gYmVmb3JlLCBhbmQgeW91IG5ldmVyIG5vdGljZS4gCgoJICAgIElmIHlvdSB0aGluZyB0aGUgZXJyb3IgaXMgZHVlIHRvIG9uZSBvZiB0aGUgU1dJRyB0eXBlbWFwcywKCSAgICBzZW5kIHVzIGFuIGV4YW1wbGUuCgoJICAgIFVzZSAtbm9jcHBjYXN0IG9ubHkgd2l0aCB2ZXJ5IG9sZCBDKysgY29tcGlsZXJzIHRoYXQKCSAgICBkbyBub3Qgc3VwcG9ydCB0aGUgY3BwY2FzdCBvcGVyYXRpb25zLiAKCgkgICAgU28sIGhlcmUgYXBwbGllczoKCgkJVGhpcyBjaGFuZ2UgZG9lc24ndCBicmVhayBjb21wYXRpYmlsaXR5LCBpdCB3YXMgYnJva2VuIGJlZm9yZS4KCjA5LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9yIG1ldGhvZHMgd2hlbiBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhcyBhCiAgICAgICAgICAgIHBhcmFtZXRlci4KCjA5LzExLzIwMDU6IG1tYXR1cwogICAgICAgICAgICBBZGRpbmcgdGhlIG1vZHVsZSBvcHRpb24gdG8gdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBOb3cgeW91CiAgICAgICAgICAgIGNhbiB1c2UgaXQgYXMKCgkgICAgICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCSAgICB3aGVyZSBzdWJmaWxlIGNvdWxkIChvciBub3QpIGRlZmluZSB0aGUgbW9kdWxlIG5hbWUgdmlhCgkgICAgdGhlICVtb2R1bGUgZGlyZWN0aXZlLiBUaGUgbW9kdWxlIG9wdGlvbiB0YWtlIHByZWNlZGVuY2UKCSAgICBhbmQgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdHMgdGhhbiBoYXZpbmcgdGhlIGRpcmVjdGl2ZSAKCgkgICAgICAgICVtb2R1bGUgQmlnTW9kdWxlICAKCgkgICAgaW5zaWRlIHRoZSBpbXBvcnRlZCBmaWxlIGZvby5pLgoKCSAgICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9uIGluIG1haW5seSB0d28gY2FzZXM6CgoJICAgIDEuLSBZb3UgdXNlZCB0aGUgLW1vZHVsZSBvcHRpb24gd2hlbiB5b3UgZ2VuZXJhdGVkIHRoZQogICAgICAgICAgICAgICAgbW9kdWxlIHRvIGJlIGltcG9ydGVkLCBhbmQgaGVuY2UgdGhlIG1vZHVsZSBuYW1lIGluCiAgICAgICAgICAgICAgICB0aGUgaW1wb3J0ZWQgJW1vZHVsZSBkaXJlY3RpdmUgaXMgbm90IHJlYWxseSB1c2VmdWwuCgoJICAgIDIuLSBUaGUgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydCBpcyB2ZXJ5IGxhcmdlLCBhbmQgaXQKICAgICAgICAgICAgICAgIGhhcyBzZXZlcmFsIC5pLy5oIGZpbGVzLiBUaGVuLCBpZiB5b3UganVzdCBvbmUgdG8KICAgICAgICAgICAgICAgIGltcG9ydCBhIGNsYXNzIG9yIHNvIGZyb20gdGhlIG1vZHVsZSwgc2F5cyAnZm9vJywgYW5kCiAgICAgICAgICAgICAgICBub3QgdGhlIGVudGlyZSBtb2R1bGUgdmlhIGltcG9ydGluZyB0aGUgbWFpbgogICAgICAgICAgICAgICAgQmlnTW9kdWxlLmkgZmlsZSwgdGhlbiB5b3UganVzdCBkbzoKCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmgKCiAgIAkgICAgICAgIG9yCgkJCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkJd2hlcmUgZm9vLmkgY29udGFpbnMgdGhlICdmb28nIGRlY2xhcmF0aW9uIGFuZCBtYXliZSBhCgkJY291cGxlIG9mIGV4dHJhICVpbmNsdWRlIGRpcmVjdGl2ZXMsIGFzIG5lZWRlZC4KCgkgICAgCjA5LzExLzIwMDU6IG1tYXR1cwoJICAgIEZpeCBidWcgIzEyODI2MzcsIGFib3V0IHRoZSAtbW9kdWxlIG9wdGlvbiBub3QgaGF2aW5nIGVmZmVjdAoJICAgIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgbmVlZGVkLgoKMDkvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgV2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHR5cGVtYXBzIHVzZWQgZm9yIHRoZQogICAgICAgICAgICBzZXQgd3JhcHBlcnMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBnZXQgd3JhcHBlcnMuIEkgZG91YnQgdGhpcyB3YXMgYQogICAgICAgICAgICBwcm9ibGVtIGZvciBhbnkgbGFuZ3VhZ2VzIGV4Y2VwdCBmb3IgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgbnVsbCBhdHRyaWJ1dGUKICAgICAgICAgICAgaW4gdGhlIG91dCB0eXBlbWFwIChDIyBvbmx5KS4KCjA5LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMgd2hlbiBmaWxlcyBmYWlsIHRvIG9wZW4uCgowOS8wNi8yMDA1OiBtbWF0dXMgCgoJICAgIEFsbG93IGEgJWRlZmluZSBhIG1hY3JvIGluc2lkZSBhbm90aGVyICVkZWZpbmUgbWFjcm8sIGZvciBleGFtcGxlCgoJICAgICAgJWRlZmluZSBoZWxsbyhuYW1lLCBUeXBlKQoJICAgICAgJWRlZmluZSBuYW1lICMjIGEoVHlwZSkKCSAgICAgICV0eXBlbWFwKGluKSBUeXBlICJoZWxsbzsiOwoJICAgICAgJWVuZGRlZgoJICAgICAgJWVuZGRlZgoJICAgICAgCgkgICAgVG8gbGVhcm4gaG93IHRvIHVzZSB0aGlzIG5ldyBmZWF0dXJlcyBpbiB5b3VyIG93biB0eXBlbWFwcyBsaWJyYXJ5LCBzZWUKCSAgICBweXRob24vY3N0cmluZy5pLCBweXRob24vY3dzdHJpbmcuaSBhbmQgcHl0aG9uL2N3c3RyYmFzZS5pLgkgICAgCgogICAgICAgICAgICBbUHl0aG9uXSBOb3JtYWxpemUgdGhlIGNzdHJpbmcuaSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZnJhZ21lbnRzLCBhbmQgYWRkCiAgICAgICAgICAgIGN3c3RyaW5nLmksIHdoaWNoIGltcGxlbWVudHMgdGhlIHNhbWUgdHlwZW1hcHMgYnV0IGZvciB3Y2hhcl90IHN0cmluZ3MuCgoJICAgIFtQeXRob25dIEJ1ZyBmaXhlZDogMTI0NzQ3NywgMTI0NTU5MSwgMTI0OTg3OCBhbmQgb3RoZXJzLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEltcGxlbWVudCBzdXBwb3J0IGZvciBTV0lHVFlQRSogRElTT1dOIHR5cGVtYXAgKGxpa2UgaW4gUHl0aG9uKSBmb3IKICAgICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGVnIHdoZW4gYWRkaW5nIGFuIG9iamVjdCBjcmVhdGVkIGluIFJ1YnkKICAgICAgICAgICAgdG8gYSBDKysgY29udGFpbmVyLiBQYXRjaCAjMTI2MTY5MiBmcm9tIENoYXJsaWUgU2F2YWdlLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gNjQgYml0IHBsYXRmb3JtIGZpeGVzIGZvciB0aGUgdmFyYXJncyBoYW5kbGluZyBpbiBTV0lHX0dldEFyZ3MuIFRoaXMgaXMgYW4KICAgICAgICAgICAgaW1wcm92ZWQgZml4IGZvciBidWcgIzEwMTE2MDQgYXMgc3VnZ2VzdGVkIGJ5IEplcmVteSBMaW4uCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBCdWcgIzEyNDA0NjkgLSAlbmV3b2JqZWN0IHN1cHBvcnQgZm9yIFRjbC4gUGF0Y2ggZnJvbSBCb2IgTWFyaW5pZXIuCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQnVnICMxMjU0NDk0IC0gRml4IGZvciBnbG9iYWwgbmFtZXNwYWNlIHBvbGx1dGlvbiBieSBwZXJsIGhlYWRlciBmaWxlcwogICAgICAgICAgICAoYm9vbCBkZWZpbmUpIHByZXZlbnRlZCBTVEwgaGVhZGVycyBmcm9tIGJlaW5nIHVzZWQgb24gc29tZSBzeXN0ZW1zLCBlZwogICAgICAgICAgICBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpby4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzEyNDA5MzcgLSBSZWRlZmluaXRpb24gb2YgX19pbnQ2NCB0eXBlZGVmIGZvciBJbnRlbCBjb21waWxlcnMuCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBCdWcgIzEyNTE4MzIgLSAgQysrIHRlbXBsYXRlIG1heSBnZW5lcmF0ZSBpbnZhbGlkIFhNTCBmaWxlCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTdXBwb3J0IGFkZGVkIGZvciBMdWEuIFBhdGNoICMxMjQyNzcyIGZyb20gTWFyayBHb3NzYWdlLgogICAgICAgICAgICBJdCBzdXBwb3J0cyBtb3N0IEMvQysrIGZlYXR1cmVzIChmdW5jdGlvbnMsIHN0cnVjdCwgY2xhc3NlcywgYXJyYXlzLCBwb2ludGVycywKICAgICAgICAgICAgZXhjZXB0aW9ucyksIGFzIHdlbGwgYXMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFuZCBhIGZldyB0ZXN0IGNhc2VzICYgZXhhbXBsZXMuCgowOC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBGaXggaW5jb3JyZWN0IHhtbCBlc2NhcGluZyBpbiBiYXNlIGNsYXNzIG5hbWUgd2hlbiBiYXNlIGNsYXNzIGlzIGEgdGVtcGxhdGUuCgowOC8xMy8yMDA1OiBlZnV6enlvbmUKCSAgICBbQ0xJU1BdIEFkZGVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGVudW1zLiBEb2VzIG5vdCBhZGRzIHRoZSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbgoJICAgIHRvIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBpZiBhIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBOZXcgbGFuZ3VhZ2UgbW9kdWxlLCBDb21tb24gTGlzcCB3aXRoIFVGRkksIGZyb20gVXR6LVV3ZSBIYXVzLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIEZpeCB0aGUgTGlzcCBzLWV4cHJlc3Npb24gb3V0cHV0IG1vZHVsZTsgaXQgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCAidW5rbm93biB0YXJnZXRzIi4KCjA3LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gU1RMIHdyYXBwZXJzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgdXNlcidzICVleGNlcHRpb24gZGlyZWN0aXZlCiAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFNUTCB3cmFwcGVyIG1ldGhvZHMuIFByZXZpb3VzbHkgdGhlIGZvbGxvd2luZyBnbG9iYWwgJWV4Y2VwdGlvbgogICAgICAgICAgICBkaXJlY3RpdmUgd291bGQgbm90IGJlIHVzZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsgCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGltcGxlbWVudGVkIGJ5IHJlcGxhY2luZyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgZm9yIHNwZWNpZmljIFNUTCB3cmFwcGVyCiAgICAgICAgICAgIG1ldGhvZHMgd2l0aCBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBkZWNsYXJlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzLiB0aHJvd3MgdHlwZW1hcHMKICAgICAgICAgICAgYXJlIG5vdyBzdXBwbGllZCBmb3IgaGFuZGxpbmcgdGhlIFNUTCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gVGhlc2UgY2FuIGFsc28gYmUgZWFzaWx5CiAgICAgICAgICAgIG92ZXJyaWRkZW4sIGZvciBleGFtcGxlIHRoZSBzdGQ6Om91dF9vZl9yYW5nZSBleGNlcHRpb24sIHdoaWNoIGlzIHVzZWQgYSBsb3QgaW4gdGhlIFNUTAogICAgICAgICAgICB3cmFwcGVycywgY2FuIGJlIGN1c3RvbWlzZWQgZWFzaWx5OgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgc3RkOjpvdXRfb2ZfcmFuZ2UgewogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0SW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKMDcvMjIvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDTElTUF0gVGhlIGNsaXNwIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEl0IGNhbiBvbmx5IGhhbmRsZSBDLCBjbGlzcCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydHMgZmZpIGJpbmRpbmdzIHRvIEMrKy4KICAgICAgICAgICAgICAtIEl0IGhhcyB0d28gb3B0aW9ucywgKGEpIC1leHRlcm4tYWxsIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyBmb3IgYWxsIGZ1bmN0aW9ucwogICAgICAgIAlhbmQgdmFyaWFibGVzdGlvbnMsIChiKSAtZ2VuZXJhdGUtdHlwZWRlZiB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgImRlZi1jLXR5cGUiCgkgICAgICAgIHdyYXBwZXJzIGZvciB0eXBlZGVmcwoJICAgICAgLSBDYW4gaGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywgY29tcGxleCB0eXBlcyBzdWNoIGFzIG4tZGltZW5zaW9uYWwgYXJyYXlzIG9mIAoJIAlwb2ludGVycyBvZiBkZXB0aCBkCgkgICAgICAtIEdlbmVyYXRlcyB3cmFwcGVycyBmb3IgY29uc3RhbnRzIGFzIHdlbGwgYXMgdmFyaWFibGVzCgkgICAgICAtIENvcnJlY3RseSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbiBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKCSAgICAgIC0gQ3JlYXRlcyBhIGRlZnBhY2thZ2UgImRlY2xhcmF0aW9uIiB3aXRoIHRoZSBtb2R1bGUgbmFtZSBhcyB0aGUgcGFja2FnZSBuYW1lLCB0aGUgY3JlYXRlZCAKCSAgICAJcGFja2FnZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMKCSAgICAgIC0gdHJpZXMgdG8gZ3Vlc3Mgd2hlbiBzaG91bGQgYSBwb2ludGVyIHZhcmlhYmxlIGJlIGRlY2xhcmVkIGFzIGMtcHRyIG9yIGMtcG9pbnRlcgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDaGFuZ2VzIHRvIHN1cHBvcnQgQyMgc3RydWN0cyByZXR1cm5lZCBieSB2YWx1ZS4gVGhlIGNoYW5nZXMgcmVxdWlyZWQgYXJlOgogICAgICAgICAgICAgIC0gVXNpbmcgYW4gb3B0aW9uYWwgJ251bGwnIGF0dHJpYnV0ZSBpbiB0aGUgb3V0IHR5cGVtYXAuIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgICAgIHRoZW4gaXQgaXMgdXNlZCBmb3IgdGhlICRudWxsIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgogICAgICAgICAgICAgIC0gVGhlIGN0eXBlIHVzZWQgaW4gdGhlIEMvQysrIHdyYXBwZXJzIGlzIG5vIGxvbmdlciBpbml0aWFsaXNlZCB0byAwIG9uIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgZml4IHRoZSBzaXR1YXRpb25zIHdoZXJlIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYXNzaWduIDAgdG8gdGhlCiAgICAgICAgICAgIHJldHVybmVkIHN0cnVjdC4gTWFyc2hhbGxpbmcgc3RydWN0cyBhcyB2YWx1ZSB0eXBlcyBzdGlsbCByZXF1aXJlcyB1c2VyIGRlZmluZWQgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSBkb2N1bWVudGF0aW9uIGZvciBhbiBleGFtcGxlLgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggU1dJR19leGNlcHRpb24gdXNhZ2UgdG8gd29yayB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgZW1wdHkgbWFjcm8KICAgICAgICAgICAgYXJndW1lbnRzLiBVbmZvcnR1bmF0ZWx5IHRoaXMgZml4IHdpbGwgc3RvcCB1c2FnZSBvZiBTV0lHX2V4Y2VwdGlvbiBiZWluZyB1c2VkIHdpdGhpbiB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IHVzZSAiIiBvciAleyAlfSBkZWxpbWl0ZXJzLCBidXQgY29udGludWVzIHRvIHdvcmsgd2l0aCB0eXBlbWFwcyB1c2luZyB7fSBkZWxpbWl0ZXJzLgogICAgICAgICAgICBQbGVhc2UgdXNlIHRoZSBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCBvciBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBtZXRob2RzIGluc3RlYWQKICAgICAgICAgICAgYXMgU1dJR19leGNlcHRpb24gaXMgcmVhbGx5IGludGVuZGVkIGFzIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFjcm8gZm9yIHRoZSBTV0lHIGxpYnJhcnkgd3JpdGVycy4KCjA3LzE2LzIwMDU6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHNwZWNpZmljIGZvcmVpZ24gdHlwZXMgcmF0aGVyIHRoYW4gKCogOnZvaWQpLiAKCSAgICBVc2UgKnN3aWctaWRlbnRpZmllci1jb252ZXJ0ZXIqLgoKMDYvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRnVuY3Rpb25zIGRlY2xhcmVkIGFzICdleHRlcm4nIG5vIGxvbmdlciBoYXZlIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24gYWRkZWQgdG8gdGhlIAogICAgICAgICAgICB3cmFwcGVyIGZpbGVzLiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBTV0lHIGRvZXMgbm90IGdldCB0aGlzIHJpZ2h0LCBlZyBidWcgIzEyMDU4NTkgKGV4dGVybgogICAgICAgICAgICBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSkuIEFsc28gU1dJRyBjYW5ub3QgZ2V0IG5vbi1zdGFuZGFyZAogICAgICAgICAgICBjYWxsaW5nIGNvbnZlbnRpb25zIGNvcnJlY3QsIGVnIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBoYW5kbGVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVAogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTAogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBETExJTVBPUlQgZXh0ZXJuIFNURENBTEwgdm9pZCBmdW5jdGlvbihpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBTV0lHIGluY29ycmVjdGx5IGdlbmVyYXRlczoKCiAgICAgICAgICAgIGV4dGVybiB2b2lkIGZ1bmN0aW9uKGludCk7CgogICAgICAgICAgICBUbyB3aGljaCB0aGVyZSBpcyBubyBzb2x1dGlvbiBhcyBTV0lHIGRvZXNuJ3QgaGFuZGxlIG5vbi1zdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb25zLiBUaGUgZXh0cmEKICAgICAgICAgICAgJ2V4dGVybicgZnVuY3Rpb24gdGhhdCBTV0lHIGdlbmVyYXRlcyBpcyBzdXBlcmZsdW91cyB1bmxlc3MgYSB1c2VyIGhhcyBmb3Jnb3R0ZW4gdG8gYWRkIHRoZSBmdW5jdGlvbgogICAgICAgICAgICBkZWNsYXJhdGlvbiBpbnRvIHRoZSB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSAtbm9leHRlcm4gY29tbWFuZGxpbmUgYXJndW1lbnQgaXMgbm93IHJlZHVuZGFudCBhbmQgYSBuZXcgY29tbWFuZGxpbmUgYXJndW1lbnQgLWFkZGV4dGVybiBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91ci4gVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHVubGVzcyB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2FzIGluYWR2ZXJ0ZW50bHkgbm90IGFkZGVkIHRvIHRoZSB3cmFwcGVycy4gVG8gZml4IHRoaXMKICAgICAgICAgICAgYWRkIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvIHlvdXIgd3JhcHBlcnMsIEZvciBleGFtcGxlLCByZXBsYWNlOgoKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKCiAgICAgICAgICAgIHdpdGg6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNi8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIE1vZHVsYTMsIE9jYW1sXQogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXJ5IGZ1bmN0aW9uIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIG1hdGNoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIHNvIHRoYXQgJWV4dGVuZCBmb3IgYSBtZW1iZXIgdmFyaWFibGUgd29ya3MKICAgICAgICAgICAgdW5pZm9ybWx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2UgbW9kdWxlcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgRXh0ZW5kTWUgewogICAgICAgICAgICAgICAgVmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIEV4dGVuZE1lX1Zhcl9zZXQoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIEV4dGVuZE1lX1Zhcl9nZXQoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1ldGhvZHMgaW1wbGVtZW50aW5nIHRoZSBnZXQvc2V0IHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIGdldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIG5hbWUgb2YgdmFyaWFibGUgd3JhcHBlciBmdW5jdGlvbnMgd2hlbiB1c2luZyAtbm9wcm94eS4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIG5hbWVzIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgLW9sZHZhcm5hbWVzIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKVmVyc2lvbiAxLjMuMjUgKEp1bmUgMTEsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTEvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGhhbmRsaW5nIG9mIGFub255bW91cy1lbnVtIHZhcmlhYmxlcy4KCjA2LzEwLzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBieQoJICAgIGNvcHktb2YtdmFsdWUuICBGaXggZm9yIGdsb2JhbCAiY29uc3QgY2hhciAqIiB2YXJpYWJsZXMuCgkgICAgRml4IHRlc3RjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcywgYXJyYXlzX2dsb2JhbC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3Igd2hlbiBhIGJhc2UgY2xhc3MgZGVmaW5lcyBhIHN5bWJvbCBhcyBhIG1lbWJlciB2YXJpYWJsZSBhbmQgYSBkZXJpdmVkIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgdGhlIHNhbWUgc3ltYm9sIGFzIGEgbWVtYmVyIG1ldGhvZC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIC0gd2hlbiBhIG1ldGhvZCBoYXMgcHJvdGVjdGVkIGFjY2VzcyAKICAgICAgICAgICAgaW4gYmFzZSBhbmQgcHVibGljIGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDY2MzYzIC0gRm9sbG93IGNvbnZlbnRpb24gb2YgcmVsZWFzZSB0YXJiYWxsIG5hbWUgbWF0Y2hpbmcgZGlyZWN0b3J5IG5hbWUuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCAjMTIxMTM1MyAtIHR5cGVzYWZlIGVudW1zIChhbmQgSmF2YSBwcm9wZXIgZW51bXMpIHdyYXBwZXJzIHdoZW4gZW51bSB2YWx1ZQogICAgICAgICAgICBpcyBuZWdhdGl2ZS4KCjA1LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGVybmlzZWQgYW5kIHRpZGllZCB1cCBXaW5kb3dzIG1hY3JvcyAtLT4gU1dJR0VYUE9SVCwgU1dJR1NURENBTEwuIFRoZXkgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAgICAgYnkgdXNlcnMgdmlhIC1EIGNvbXBpbGVyIGRpcmVjdGl2ZXMgaWYgbmVlZCBiZS4KCjA1LzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB2YXJpYWJsZXMgYXMgd2VsbCBhcyBtZXRob2RzIG5vdy4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0ICdwdWJsaWMnIG1vZGlmaWVyIHRoYXQgU1dJRyBnZW5lcmF0ZXMsICVjc21ldGhvZG1vZGlmaWVycyB3aWxsIGFsc28KICAgICAgICAgICAgcmVwbGFjZSB0aGUgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIHRoYXQgU1dJRyB0aGlua3MgaXMgYXBwcm9wcmlhdGUuIFRoaXMgZmVhdHVyZSBpcwogICAgICAgICAgICB1c2VmdWwgZm9yIHNvbWUgb2JzY3VyZSBjYXNlcyB3aGVyZSBTV0lHIG1pZ2h0IGdldCB0aGUgbW9kaWZpZXJzIGluY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSBhbmQgb3ZlcnJpZGluZyBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGNvbnN0cnVjdG9ycyB0byBzdGQ6OnBhaXIgd3JhcHBlcnMgKHN0ZF9wYWlyLmkpIGZvciBhbGwgbGFuZ3VhZ2VzLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBzdGQ6OnBhaXIgd3JhcHBlcnMgaW4gc3RkX3BhaXIuaQoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgQyMgJ25ldycgYW5kICdvdmVycmlkZScgbW9kaWZpZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYSBDKysgY2xhc3MgaW5oZXJpdHMgbWV0aG9kcwogICAgICAgICAgICB2aWEgYSBDKysgJ3VzaW5nJyBkZWNsYXJhdGlvbi4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHByZXZpb3VzbHkgYmVpbmcgaWdub3JlZCBpbiBjbGFzc2VzIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMKICAgICAgICAgICAgZnJvbSAndXNpbmcnIGRlY2xhcmF0aW9ucywgZWcgY2FsbHMgdG8gRGVyaXZlZDo6YmFyIGJlbG93IHdpbGwgY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvCiAgICAgICAgICAgIGEgdGFyZ2V0IGxhbmd1YWdlIGV4Y2VwdGlvbi9lcnJvciwgbGlrZSBpdCBhbHdheXMgaGFzIGRvbmUgZm9yIEJhc2U6OkJhci4KCiAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgIHZpcnR1YWwgYmFyKCkgdGhyb3cgKHN0ZDo6c3RyaW5nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKICAgICAgICAgICAgICB1c2luZyBCYXNlOjpiYXI7CiAgICAgICAgICAgIH07CgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGV0ZWN0aW5nIHZpcnR1YWwgbWV0aG9kcyBpbiAlZXh0ZW5kIGZvciB0aGUgLWZ2aXJ0dWFsIG9wdGlvbiBhbmQgQyMgb3ZlcnJpZGUgYW5kIG5ldwogICAgICAgICAgICBtZXRob2QgbW9kaWZpZXJzLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJ25ldycgbW9kaWZpZXIgaXMgbm93IGdlbmVyYXRlZCBvbiB0aGUgcHJveHkgbWV0aG9kIHdoZW4gYSBtZXRob2QgaW4gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGlzIG5vdCBwb2x5bW9ycGhpYyBhbmQgdGhlIHNhbWUgbWV0aG9kIGV4aXN0cyBpbiB0aGUgZGVyaXZlZCBjbGFzcyAoaWUgaXQgaGlkZXMKICAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MnIG5vbi12aXJ0dWFsIG1ldGhvZCkuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeGVzIHRvIGRldGVjdGlvbiBvZiBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzIC0gd2hlbiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIG1vcmUKICAgICAgICAgICAgdGhhbiAyIGNsYXNzZXMgZGVlcC4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcHMgbW92ZWQgZnJvbSBzdGRfc3RyaW5nLmkgdG8gc3RkX3dzdHJpbmcuaQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBjcmFzaCBpbiBEb2hTdHJzdHIsIGJ1ZyAjMTE5MDkyMQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gRml4IGZvciBtZXRob2RzIHdpdGggc2ltaWxhciBuYW1lcyB3aGVuIHNob3dpbmcgbGlzdCBvZiBuYW1lcyBvbiBlcnJvciAtIGJ1ZyAjMTE5MTgyOC4KICAgICAgICAgICAgUGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIGxvbmcgbG9uZyBvdmVybG9hZGluZyBmaXggLSBidWcgIzExOTE4MzUsIHBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxMTk2NzU1IHRvIHJlbW92ZSBkZWJ1ZyBmcm9tIHN3aWd0Y2w4LnN3Zy4KCjA1LzE5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgLWZ2aXJ0dWFsIG9wdGlvbl0gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgd2hlbiBhCiAgICAgICAgICAgIHZpcnR1YWwgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgd2FzIGEgdHlwZWRlZiBpbiBlaXRoZXIgdGhlIGJhc2Ugb3IgZGVyaXZlZCBjbGFzcy4gQWxzbyBlbnN1cmVzIHRoZQogICAgICAgICAgICBtZXRob2QgaXMgZWxpbWluYXRlZCB3aGVuIHVzaW5nIHRoZSAtZnZpcnR1YWwgb3B0aW9uLiBGb3IgZXhhbXBsZSwgRGVyaXZlZC5tZXRob2Qgbm93IGhhcyB0aGUgQyMKICAgICAgICAgICAgb3ZlcnJpZGUga2V5d29yZCBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50KiBJbnRlZ2VyUHRyOwoKICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEludGVnZXJQdHIgbWV0aG9kKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIGludCAqIG1ldGhvZCgpIGNvbnN0OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBbQyNdIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBiZWluZyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIHZpcnR1YWwgbWV0aG9kcyB3aGVuIGEgYmFzZSBjbGFzcwogICAgICAgICAgICBpcyBpZ25vcmVkIHdpdGggJWlnbm9yZS4KCjA1LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byByZW1vdmUgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZ3MgaW4gQyB3cmFwcGVycyB3aGVuIGNvbXBpbGluZyBDIGNvZGUgd2l0aCAnZ2NjIC1XYWxsIC1mc3RyaWN0LWFsaWFzaW5nJy4gUGF0Y2ggZnJvbQogICAgICAgICAgICBNaWNoYWVsIENhaGlsbC4gVGhpcyBtb2RpZmllcyBtYW55IG9mIHRoZSBjYXN0cyBzbGlnaHRseSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopJmphcmcxOwogICAgICAgICAgICB0bwogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikodm9pZCAqKSZqYXJnMTsKCjA1LzEyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgQyMgYXR0cmlidXRlcy4gQyMgYXR0cmlidXRlcyBjYW4gYmUgZ2VuZXJhdGVkOgogICAgICAgICAgICAxKSBPbiBhIEMvQysrIHR5cGUgYmFzaXMgYnkgc3BlY2lmeWluZyBhbiBpbmF0dHJpYnV0ZXMgYW5kL29yIG91dGF0dHJpYnV0ZXMgdHlwZW1hcCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgaW4gdGhlIGltdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMgKGZvciBDIyByZXR1cm4gdHlwZSBvciBDIyBwYXJhbWV0ZXIgdHlwZSBhdHRyaWJ1dGVzKS4KICAgICAgICAgICAgMikgT24gYSB3cmFwcGVkIG1ldGhvZCBvciB2YXJpYWJsZSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIGZlYXR1cmUgKCVmZWF0dXJlKS4KICAgICAgICAgICAgMykgT24gYSB3cmFwcGVkIHByb3h5IGNsYXNzIG9yIGVudW0gYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyB0eXBlbWFwLgoKICAgICAgICAgICAgRXhhbXBsZXMgYXJlIGluIHRoZSBDIyBkb2N1bWVudGF0aW9uIChDU2hhcnAuaHRtbCkuCgowNC8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgY29uZmlndXJlIG9wdGlvbiB0byB0dXJuIG9mZiB0aGUgZGVmYXVsdCBtYXhpbXVtIGNvbXBpbGVyIHdhcm5pbmcgYXMKICAgICAgICAgICAgdGhleSBjb3VsZG4ndCBiZSByZW1vdmVkIGV2ZW4gd2hlbiBvdmVycmlkaW5nIENGTEFHUyBhbmQgQ1hYRkxBR1Mgd2l0aCBjb25maWd1cmUKICAgICAgICAgICAgKC4vY29uZmlndXJlIENGTEFHUz0gQ1hYRkxBR1M9KS4gVG8gdHVybiB0aGUgbWF4aW11bSB3YXJuaW5ncyBvZmYsIHJ1bjogIAoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtbWF4aW11bS1jb21waWxlLXdhcm5pbmdzCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB3aGljaCByZXdvcmtzIHRoZSBKYXZhIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGl6ZS9kZXN0cnVjdG9yIHR5cGVtYXBzLAogICAgICAgICAgICBmb3IgZGlyZWN0b3JzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG92ZXJhbGwgSmF2YSB0eXBlbWFwcy4gQWRkZWQgdGhlIGRpcmVjdG9yX3Rha2UgYW5kIAogICAgICAgICAgICBkaXJlY3Rvcl9yZWxlYXNlIHR5cGVtYXBzIHRvIGVtdWxhdGUgb3RoZXIgbW9kdWxlcycgX19kaXNvd25fXyBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXhlZCBwcm9ibGVtcyBkdWUgdG8gdGhlIG92ZXIgZWFnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuIE9jY2FzaW9uYWxseSB0aGUKICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd291bGQgY29sbGVjdCBhIEMjIHByb3h5IGNsYXNzIGluc3RhbmNlIHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkCiAgICAgICAgICAgIGluIHVubWFuYWdlZCBjb2RlIGlmIHRoZSBvYmplY3Qgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBhIHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSB0aGlzIGNhdXNlZCBoYXZvYyBhcyB0aGUgQyMgcHJveHkgY2xhc3MgY2FsbHMgdGhlIEMrKyBkZXN0cnVjdG9yCiAgICAgICAgICAgIHdoZW4gaXQgaXMgY29sbGVjdGVkLiBQcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcyBub3cgdXNlIGEgSGFuZGxlUmVmLAogICAgICAgICAgICB3aGljaCBob2xkcyBhbiBJbnRQdHIsIGluc3RlYWQgb2YgYSBwbGFpbiBJbnRQdHIgdG8gbWFyc2hhbCB0aGUgQysrIHBvaW50ZXIgdG8gdW5tYW5hZ2VkCiAgICAgICAgICAgIGNvZGUuIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzCiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgICAgIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgc3dpZ0NQdHIgaXMgbm93IG9mIHR5cGUgSGFuZGxlUmVmCiAgICAgICAgICAgIGluc3RlYWQgb2YgSW50UHRyIGFuZCBjb25zZXF1ZW50bHkgdGhlIGdldENQdHIgbWV0aG9kIHJldHVybiB0eXBlIGhhcyBhbHNvIGNoYW5nZWQuIFRoZSBuZXQKICAgICAgICAgICAgZWZmZWN0IGlzIHRoYXQgYW55IGN1c3RvbSB3cml0dGVuIHR5cGVtYXBzIG1pZ2h0IGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gc3VpdGUuIEFmZmVjdGVkIHVzZXJzCiAgICAgICAgICAgIHNob3VsZCBub3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5ldyAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGltdHlwZSB0eXBlbWFwIGFzIHRoZQogICAgICAgICAgICBpbnB1dCB0eXBlIGlzIG5vdyBhIEhhbmRsZVJlZiBhbmQgdGhlIG91dHB1dCB0eXBlIGlzIHN0aWxsIGFuIEludFB0ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIGFzeW1tZXRyaWMgdHlwZSBtYXJzaGFsbGluZyBhZGRlZC4gU29tZXRpbWVzIHRoZSBvdXRwdXQgdHlwZSBuZWVkcyB0byBiZQogICAgICAgICAgICBkaWZmZXJlbnQgdG8gdGhlIGlucHV0IHR5cGUuIFN1cHBvcnQgZm9yIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YgYSBuZXcgb3B0aW9uYWwgJ291dCcKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgY3R5cGUsIGltdHlwZSBhbmQgY3N0eXBlIHR5cGVtYXBzLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIG5vdAogICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcCwgYXMgaGFzIGFsd2F5cyBwcmV2aW91c2x5IGJlZW4gdGhlIGNhc2UuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICB0aGVuIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIG91dHB1dCB0eXBlcyBhbmQgdGhlIHR5cGUgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSB0eXBlbWFwIGl0c2VsZiBpcyB1c2VkIGZvciB0aGUgaW5wdXQgdHlwZS4gQW4gb3V0cHV0IHR5cGUgaXMgYSByZXR1cm4gdmFsdWUgZnJvbQogICAgICAgICAgICBhIHdyYXBwZWQgbWV0aG9kIG9yIHdyYXBwZWQgY29uc3RhbnQgYW5kIGFuIGlucHV0IHR5cGUgaXMgYSBwYXJhbWV0ZXIgaW4gYSB3cmFwcGVkIG1ldGhvZC4KCiAgICAgICAgICAgIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBjaGFyICogY291bGQgYmUgbWFyc2hhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cywgCgogICAgICAgICAgICAgICV0eXBlbWFwKGltdHlwZSwgb3V0PSJJbnRQdHIiKSBjaGFyICogInN0cmluZyIKICAgICAgICAgICAgICBjaGFyICogZnVuY3Rpb24oY2hhciAqKTsKCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdHlwZSBpcyB0aHVzIEludFB0ciBhbmQgdGhlIGlucHV0IHR5cGUgaXMgc3RyaW5nLiBUaGUgcmVzdWx0aW5nIGludGVybWVkaWFyeSBDIyBjb2RlIGlzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgZnVuY3Rpb24oc3RyaW5nIGphcmcxKTsKCjA0LzIyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBnZW5lcmF0aW9uIG9mICJkZWZpbmUtbWV0aG9kIiBmb3IgbWV0aG9kcyBvZgoJICAgIGNsYXNzZXMgd2l0aCBhIGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgowNC8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBGb3Igd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbXVsdGlwbGUgdmFsdWVzICh1c2luZyBhcmdvdXQpLAoJICAgIFNXSUcgQ0hJQ0tFTiBub3cgcmV0dXJucyB0aGVtIGFzIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mIGFzCgkgICAgYSBsaXN0LiAgVGhleSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB1c2luZyAoY2FsbC13aXRoLXZhbHVlcykuCgowNC8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dCiAgICAgICAgICAgICsgQWRkZWQgYSB3aG9sZSBidW5jaCBvZiBuZXcgX3J1bm1lIHNjcmlwdHMgaW50byB0aGUgY2hpY2tlbiB0ZXN0CiAgICAgICAgICAgIHN1aXRlLiAgQWxzbyBmaXggc29tZSBidWdzIHRoZXNlIG5ldyBzY3JpcHRzIHR1cm5lZCB1cC4KCiAgICAgICAgICAgICsgQWRkZWQgb3B0aW1pemF0aW9uIHdoZW4gcmV0dXJuaW5nIGEgd3JhcHBlZCBwcm94eSBjbGFzcy4gIEJlZm9yZSwKICAgICAgICAgICAgYSBtaW5vciBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGludm9rZWQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIHJldHVybmVkLgoKCSAgICArIEFsbCB0aGUgY2hpY2tlbiBFeGFtcGxlcyBzaG91bGQgbm93IHJ1biBjb3JyZWN0bHkKCjA0LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdHlwZW1hcCBtYXRjaGluZyB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgaW4gcGFydGljdWxhcgogICAgICAgICAgICBzdGQ6OnN0cmluZywgc28gdGhhdCBzdGQ6OnN0cmluZyB2YXJpYWJsZXMgY2FuIGJlIGVhc2lseSBtYXJzaGFsbGVkIHdpdGgKICAgICAgICAgICAgYSBDIyBzdHJpbmcgcHJvcGVydHkgdXNpbmc6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfc3RyaW5nLmkiCiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqdmFyaWFibGVfbmFtZSB9OwogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWU7CgogICAgICAgICAgICAoUmVjYWxsIHRoYXQgYWxsIGNsYXNzIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwb2ludGVycykKCjA0LzA1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgQWRkZWQgRXhhbXBsZXMvY2hpY2tlbi9lZ2csIGFuIGV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgY2hpY2tlbgoJICAgICAgZXh0ZW5zaW9uIGxpYnJhcnkgaW4gdGhlIGZvcm0gb2YgYW4gZWdnLiAgQWxzbyB1cGRhdGVkIHRoZQoJICAgICAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGlmZmVyZW50IGxpbmtpbmcgb3B0aW9ucy4KCgkgICAgKyBjaGlja2VuIHRlc3Qtc3VpdGUgbm93IGhhcyBzdXBwb3J0IHRvIGNoZWNrIFNXSUcgd2l0aCB0aGUgLXByb3h5CgkgICAgICBhcmd1bWVudCBpZiB0aGVyZSBleGlzdHMgYSBfcHJveHlfcnVubWUuc3MgZmlsZS4KCgkgICAgKyBNb3JlIGZpeGVzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgLXByb3h5CgowMy8zMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBUdXJuZWQgb24gZXh0cmEgdGVtcGxhdGUgZmVhdHVyZXMgZm9yIGFsbCBsYW5ndWFnZXMgd2hpY2ggd2VyZQogICAgICAgICAgICBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIHRvIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgZW5hYmxlcyB0eXBlbWFwcyBkZWZpbmVkIHdpdGhpbiBhIHRlbXBsYXRlZCBjbGFzcyB0byBiZSB1c2VkIGFzCiAgICAgICAgICAgIGV4cGVjdGVkLiBSZXF1aXJlcyAldGVtcGxhdGUgb24gdGhlIHRlbXBsYXRlZCBjbGFzcywgJXRlbXBsYXRlKCkgd2lsbAogICAgICAgICAgICBhbHNvIHBpY2sgdXAgdGhlIHR5cGVtYXBzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgICBvcgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxUPiAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29faSkgRm9vPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgRm9vPGRvdWJsZT47CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgdGhlIHByb3BlciAnaW4nIHR5cGVtYXBzIHdoZXJldmVyIEZvbzxpbnQ+IGFuZCBGb288ZG91YmxlPgogICAgICAgICAgICBhcmUgdXNlZC4KCjAzLzMwLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFBhdGNoIGZyb20gSGFucyBPZXN0ZXJob2x0IGZvciBzdXBwb3J0aW5nIE16U2NoZW1lIDMweC4KCjAzLzI5LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgUmVhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiBjaGlja2VuICgxLjQwIHRvIDEuODkpIGJ5IHBhc3NpbmcgLW5vY29sbGVjdGlvbgoJICAgICAgYXJndW1lbnQgdG8gU1dJRwoJICAgICsgJWltcG9ydCBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggdGlueWNsb3MuICAoZGVjbGFyZSAodXNlcyAuLi4pKSB3aWxsIGJlCgkgICAgICBleHBvcnRlZCBjb3JyZWN0bHkuCgkgICAgKyBUaW55Q0xPUyBwcm94eSBjbGFzc2VzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgICBhbmQgY29uc3RydWN0b3JzLgoKMDMvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3Rvcm91dCB0eXBlbWFwcy4gSmF2YSBkaXJlY3RvcnMKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcHMgbGlrZSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIG5vdy4gVGhlIG5ldwogICAgICAgICAgICB0eXBlbWFwcyBwcm92aWRlIGZpeGVzIGZvciBtZXRob2RzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyByZXR1cm5lZAogICAgICAgICAgICBieSByZWZlcmVuY2UgKHRoaXMgY2Fubm90IGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0aHJlYWQgc2FmZSB0aG91Z2gpLgoKMDMvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRW51bSBjYXN0aW5nIGZpeGVzLiBWaXN1YWwgQysrIGRpZG4ndCBsaWtlIHRoZSBDIHR5cGUgY2FzdGluZyBTV0lHIHByb2R1Y2VkCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQysrIGVudW0gcmVmZXJlbmNlcywgYXMgcmVwb3J0ZWQgYnkgQWRtaXJlIEthbmRhd2FzdmlrYS4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBTRiAjMTEyNDQ5MC4gRml4IFBlcmwgbWFjcm8gY2xhc2hlcyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8ncyBTVEwgc3RyaW5nLAogICAgICAgICAgICBzbyBub3cgcHJvamVjdHMgY2FuICNpbmNsdWRlIDxzdHJpbmc+LgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXZhcmFyZ3Mgd2hpY2ggZ290IGJyb2tlbiB3aXRoIHRoZSByZWNlbnQgZGVmYXVsdCBhcmd1bWVudCBjaGFuZ2VzLgogICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBKYXZhIGFuZCBDIyBmb3IgdGhlIGZpcnN0IHRpbWUgbm93LgoKMDMvMTcvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICArIEZpeCBhIHdob2xlIGJ1bmNoIG9mIGJ1Z3MgaW4gdGhlIGNoaWNrZW4gbW9kdWxlLiAgVGhlIGVudGlyZQogICAgICAgICAgICAgIHRlc3Qgc3VpdGUgbm93IGNvbXBpbGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRlc3RzIHRoYXQgcmVxdWlyZQoJICAgICAgc3RkX3ZlY3Rvci5pLCBzdGRfZGVxdWUuaSwgYW5kIHNvIG9uLCB3aGljaCBjaGlja2VuIGRvZXMgbm90IGhhdmUgeWV0LgoKCSAgICArIEFkZCBzdXBwb3J0IGZvciAlZXhjZXB0aW9uIGFuZCAldHlwZW1hcChleGNlcHRpb25zKS4gIEV4Y2VwdGlvbnMgYXJlCgkgICAgICB0aHJvd24gd2l0aCBhIGNhbGwgdG8gKGFib3J0KSBhbmQgY2FuIGJlIGhhbmRsZWQgYnkgKGhhbmRsZS1leGNlcHRpb25zKQoKMDMvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3RvcnMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHR5cGVtYXBzCiAgICAgICAgICAgIGdpdmluZyB1c2VycyBmaW5lIGNvbnRyb2wgb3ZlciBtZW1vcnkgb3duZXJzaGlwIGFuZCBsaWZldGltZSBvZiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBEaXJlY3RvciBjbGFzc2VzIG5vIGxvbmdlciBsaXZlIGZvcmV2ZXIgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSBub3cgY29sbGVjdGFibGUKICAgICAgICAgICAgYnkgdGhlIEdDLgoKMDMvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZmluYWxpemVycyBnYXJiYWdlIGNvbGxlY3RlZCBvYmplY3RzLgoJICAgIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBzaG91bGQgYmUgbWFya2VkIHdpdGggJW5ld29iamVjdCBhbmQKCSAgICBpbnB1dCBhcmd1bWVudHMgd2hpY2ggY29uc3VtZSAob3IgdGFrZSBvd25lcnNoaXApIG9mIGEgcG9pbnRlciBzaG91bGQKCSAgICBiZSBtYXJrZWQgd2l0aCB0aGUgRElTT1dOIHR5cGVtYXAuCgoJICAgIEFsc28gYWRkIHN1cHBvcnQgZm9yIGNvcnJlY3RseSBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQKCSAgICB0byBhIGZ1bmN0aW9uLCBhbmQgcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgbnVtYmVyIGFyZSBwYXNzZWQuCgowMy8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgQWRkIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiB0byBjb25maWd1cmUuaW4sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgIHBhc3NpbmcgYWxsIHRoZSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsNSBldGMuLi4gdGhhdCBNYXR0aGlhcyBhZGRlZC4KCjAzLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIE1lbW9yeSBsZWFrIGZpeCBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBjbGFzc2VzL3N0cnVjdHMgYnkgdmFsdWUuCgowMy8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGZvciBQZXJsIGluY29ycmVjdGx5IHRha2luZyBtZW1vcnkgb3duZXJzaGlwIGZvciByZXR1cm4gdHlwZXMgdGhhdAogICAgICAgICAgICBhcmUgdHlwZWRlZnMgdG8gYSBzdHJ1Y3QvY2xhc3MgcG9pbnRlci4gUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFZhcmlvdXMgZXhjZXB0aW9uIGNoYW5nZXMgZm9yIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlc2Ugbm93IG1vcmUKICAgICAgICAgICAgYWNjdXJhdGVseSBtaXJyb3IgdGhlIHNhbWUgZXhjZXB0aW9ucyB0aGF0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QgdGhyb3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGFmdGVyIGFueSBvZiB0aGUgc3RkOjp2ZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFdoZW4gbnVsbCBpcyBwYXNzZWQgZm9yIGEgQysrIHJlZmVyZW5jZSBvciB2YWx1ZSBwYXJhbWV0ZXIsIHRoZSAKICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93biBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGluc3RlYWQKICAgICAgICAgICAgb2YgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiBhcyByZWNvbW1lbmRlZCBpbiB0aGUgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyB0dXJuIGEgQysrIGV4Y2VwdGlvbiBpbnRvIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICBub3QgYSBTeXN0ZW1FeGNlcHRpb24gbm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOdW1lcm91cyBjaGFuZ2VzIGluIEMjIGV4Y2VwdGlvbiBoYW5kbGluZyBoYXZlIGJlZW4gbWFkZSBvdmVyIHRoZSBwYXN0CiAgICAgICAgICAgIGZldyB3ZWVrcy4gQSBzdW1tYXJ5IGZvbGxvd3M6CgogICAgICAgICAgICBUaGUgd2F5IGluIHdoaWNoIEMrKyBleGNlcHRpb25zIGFyZSBtYXBwZWQgdG8gQyMgZXhjZXB0aW9ucyBpcyBxdWl0ZSBkaWZmZXJlbnQuCiAgICAgICAgICAgIFRoZSBjaGFuZ2UgaXMgdG8gZml4IEMjIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgQysrIGV4Y2VwdGlvbiBzdGFjayBpcyBjb3JyZWN0bHkKICAgICAgICAgICAgdW53b3VuZCBhcyBwcmV2aW91c2x5IEMrKyBleGNlcHRpb25zIHdlcmUgYmVpbmcgdGhyb3duIGFjcm9zcyB0aGUgQyBQSW52b2tlIGxheWVyCiAgICAgICAgICAgIGludG8gdGhlIG1hbmFnZWQgd29ybGQuCgogICAgICAgICAgICBOZXcgdHlwZW1hcCBhdHRyaWJ1dGVzIChjYW50aHJvdyBhbmQgZXhjb2RlKSBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBjb250cm9sIHRoZQogICAgICAgICAgICBtYXBwaW5nIG9mIEMrKyB0byBDIyBleGNlcHRpb25zLiBFc3NlbnRpYWxseSBhIGNhbGxiYWNrIGludG8gdGhlIHVubWFuYWdlZCB3b3JsZAogICAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHBlbmRpbmcgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHRvIHRocm93IGlzIHN0b3JlZCBpbiB0aHJlYWQgbG9jYWwKICAgICAgICAgICAgc3RvcmFnZSAoc28gdGhlIGFwcHJvYWNoIGlzIHRocmVhZC1zYWZlKS4gVGhlIHR5cGVtYXBzIGFyZSBleHBlY3RlZCB0byByZXR1cm4KICAgICAgICAgICAgZnJvbSB1bm1hbmFnZWQgY29kZSBhcyBzb29uIGFzIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBpcyBzZXQuIEFueSBwZW5kaW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgYXJlIGNoZWNrZWQgZm9yIGFuZCB0aHJvd24gb25jZSBtYW5hZ2VkIGNvZGUgc3RhcnRzIGV4ZWN1dGluZy4gVGhlcmUgc2hvdWxkCiAgICAgICAgICAgIGJlIG1pbmltYWwgaW1wYWN0IG9uIGV4ZWN1dGlvbiBzcGVlZCBkdXJpbmcgbm9ybWFsIGJlaGF2aW91ci4gRnVsbCBkZXRhaWxzIHdpbGwgYmUKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiBDU2hhcnAuaHRtbC4KCiAgICAgICAgICAgIFRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKCkgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQoKSBhbmQgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uKCkKICAgICAgICAgICAgZnVuY3Rpb25zLiBUaGUgb3JpZ2luYWwgbmFtZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgY2hhbmdlZCB0byBicmVhayBvbGQgY29kZSBhcwogICAgICAgICAgICB0aGUgb2xkIGFwcHJvYWNoIHdhcyBzb21ld2hhdCBmbGF3ZWQuIEFueSB1c2VyIGRlZmluZWQgZXhjZXB0aW9ucyB0aGF0IGZvbGxvdyB0aGUKICAgICAgICAgICAgc2FtZSBwYXR0ZXJuIGFzIHRoZSBvbGQgYXBwcm9hY2ggc2hvdWxkIGFsc28gYmUgZml4ZWQuCgogICAgICAgICAgICBOdW1lcm91cyBuZXcgLk5FVCBmcmFtZXdvcmsgZXhjZXB0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgZWFzeSB0aHJvd2luZyBmcm9tIAogICAgICAgICAgICB1bm1hbmFnZWQgY29kZS4gVGhlIGNvbXBsZXRlIGxpc3QgaXM6IAoKICAgICAgICAgICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgQXJpdGhtZXRpY0V4Y2VwdGlvbiwgRGl2aWRlQnlaZXJvRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLCBPdXRPZk1lbW9yeUV4Y2VwdGlvbiwgT3ZlcmZsb3dFeGNlcHRpb24sIAogICAgICAgICAgICAgIFN5c3RlbUV4Y2VwdGlvbiwgQXJndW1lbnRFeGNlcHRpb24sIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBhbmQKICAgICAgICAgICAgICBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMDUvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgRml4IHNldmVyYWwgbWVtb3J5IGxlYWtzIGFyb3VuZC4gRXZlbiB3aGVuIHdlIHN1cnZpdmUgIGtub3duaW5nCgkgICAgc3dpZyBpcyBhIG1lbW9yeSBsZWFrIGZhY3RvcnksIGl0IHdhcyBhIGxpdHRsZSBvdXQgb2YKCSAgICBjb250cm9sLiBUbyBydW4gc3RkX2NvbnRhaW5lcnMuaSBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUsCgkgICAgc3dpZyB3YXMgdXNpbmcgfjI2ME1CLCBub3cgaXQgdXNlcyAnb25seScgfjQwTUIsIHdoaWNoIGlzCgkgICAgdGhlIHNhbWUgYW1tb3VudCB0aGF0IGcrKyB1c2VzLCBzbywgaXMgbm90IHRoYXQgYmFkLgoJICAgIEluIHRoZSBwcm9jZXNzLCBJIGZvdW5kIGEgY291cGxlIG9mIGV4dHJhIERlbGV0ZXMsIHdoaWNoCgkgICAgaW4gc29tZSBjYXNlcyBjb3VsZCB0cmlnZ2VyIHNlZy4gZmF1bHRzIGFuZC9vcgoJICAgIERPSC9hc3NlcnRzLgoJICAgIAoJICAgIFtweXRob25dIEJldHRlciBzdXBwb3J0IGZvciBkaXJlY3RvcnMgKyBleGNlcHRpb24uIE1vcmUKCSAgICB2ZXJib3NlIGVycm9ycyBhbmQgYWRkZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxlci4KCgkgICAgW3B5dGhvbl0gRml4IG1lbW9yeSBsZWFrIGZvciB0aGUKCgkgICAgCSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gCgoJICAgIGNhc2UscmVwb3J0ZWQgYnkgQm8gUGVuZy4KCgkgICAgW3B5dGhvbl0gRml4IFN3aWdQeU9iamVjdCBjb21wYXJlIHByb2JsZW0gcmVwb3J0ZSBieQoJICAgIENhbWVyb24gUGF0cmljay4gCgoJICAgIFtweXRob25dIEZpeCBzZXZlcmFsIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSAKCSAgICBmb3IgZ251LWdjYywgSW50ZWwgYW5kIFZDNy4xICBjb21waWxlcnMuCgoKMDIvMjUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gdXNlIENTUyBhbmQgPGRpdj4gaW5zdGVhZCBvZiA8YmxvY2txdW90ZT4KCSAgICBJIHVzZWQgYSBzY3JpcHQgdG8gY29udmVydCB0aGUgZG9jcywgYW5kIGl0IHNldCBhbGwgdGhlIGJveCBjbGFzc2VzCgkgICAgdG8gYmUgImNvZGUiLiAgVGhlcmUgYXJlIGFjdHVhbGx5IDQgZGlmZmVyZW50IGNsYXNzZXMsCgkgICAgInNoZWxsIiwgImNvZGUiLCAidGFyZ2V0bGFuZyIsIGFuZCAiZGlhZ3JhbSIuICBXZSBuZWVkIHRvIGdvIHRocm91Z2gKCSAgICBhbmQgY29udmVydCB0aGUgZGl2cyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGNvbnRhaW4uCgowMi8yMy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkZWQgb3B0aW9uIC1ub3J0dGkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIG5hdGl2ZQoJICAgIEMrKyBSVFRJIHdpdGggZGlyZWN0b3JzIChkeW5hbWljX2Nhc3Q8PiBpcyBub3QgdXNlZCkuCgoJICAgIEFkZCBtb3JlIGNvZGUgZm9yIGRpcmVjdG9ycyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUuCgoJICAgIEV4dGVuZCB0aGUgdXNlIG9mIFNXSUdJTlRFUk4gd2hlbmV2ZXIgaXMgcG9zc2libGUuCgoJICAgIFJlbW92ZSB0ZW1wbGF0ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBWQzcuMS4KCgkgICAgUmVtb3ZlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IGdjYy9nKysuIEZpbmFsbHkgeW91IGNhbgoJICAgIGNvbXBpbGUgdXNpbmcKCgkgICAgICAgZysrIC1XIC1XYWxsIC1jIG15bW9kdWxlX3dyYXAuY3h4CgoJICAgIGFuZCBubyBzcHVyaW91cyBlcnJvcnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIKCSAgICBjb2RlLgoKMDIvMjMvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgQWRkZWQgLWV4dGVybmFsLXJ1bnRpbWUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZHVtcAoJICAgIG91dCBhbGwgdGhlIGNvZGUgbmVlZGVkIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHJ1bnRpbWUgc3lzdGVtLAoJICAgIGFuZCBpdCByZXBsYWNlcyBpbmNsdWRpbmcgdGhlIGZpbGVzIGRpcmVjdGx5LiAgVGhpcyBjaGFuZ2UgYWRkcwoJICAgIHR3byBuZXcgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIExhbmd1YWdlIGNsYXNzLCB3aGljaCBhcmUgdXNlZAoJICAgIHRvIGZpbmQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHJ1bnRpbWUgY29kZS4gIEkgYWxzbyB1cGRhdGVkCgkgICAgYWxsIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgcnVudGltZSB0byBpbXBsZW1lbnQgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KCjAyLzIyLzIwMDU6IG1tYXR1cyAKCSAgICBGaXggJXRlbXBsYXRlICsgcHJpdmF0ZSBlcnJvciBTRiMxMDk5OTc2LgoKMDIvMjEvMjAwNTogbW1hdHVzIAoKCSAgICBGaXggc3dpZ3J1bi5zd2cgd2FybmluZ3MgcmVwb3J0ZWQgd2hlbiB1c2luZyAiZ2NjIC1XIC1XYWxsIgoJICAgIChzdGF0aWMvaW5saW5lIG5vdCB1c2VkIGluIGZyb250IG9mIGEgZnVuY3Rpb24KCSAgICBkZWNsYXJhdGlvbiksIGFuZCBhZGQgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQKCSAgICB1bnVzZWQgd2FybmluZ3MgZWxzZXdoZXJlLgoKCSAgICBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzLgoKCSAgICBbUHl0aG9uXSBVc2UgbmV3IFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzIGluCgkgICAgU1dJR0lOVEVSTiBtZXRob2RzLgoKCSAgICBbUHl0aG9uXSBGaXggUHlPU19zbnByaW50ZiBmb3IgcHl0aG9uIHZlcnNpb25zIDwgMi4yIChTRiAjMTEwNDkxOSkuCgoJICAgIFtQeXRob25dIEZpeCBtYXAvbXVsdGltYXAgdG8gYWxsb3cgZW1wdHkgbWFwcyAocmVwb3J0ZWQgYnkKICAJICAgIFBoaWxpcHBlIEhldHJveSkuCgoJICAgIFtEb2NzXSBBZGQgc29tZSBkb2N1bWVudGF0aW9uIHRvIFB5dGhvbi5odG1sIGFuZAoJICAgIFNXSUdQbHVzLmh0bWwsIGluY2x1ZGluZyBmb3IgZXhhbXBsZSB0aGUgZmFjdCB0aGF0CgkgICAgJ2ZyaWVuZHMnIGFyZSBub3cgc3VwcG9ydGVkLgoKMDIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gUGF0Y2ggZnJvbSBPbGx5IEJldHRzLCBzbyB0aGF0IHdyYXBwZXJzIGNvbXBpbGUgd2l0aCBaZW5kIHRocmVhZCBzYWZldHkgZW5hYmxlZC4KCjAyLzE3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeCBpbiBzb21lIG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbW9kdWxlcyB3aGVuIHVzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGluIGNvbnN0cnVjdG9ycy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZSB3YXMgbm90IHRha2luZyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICAgICAgIEMrKyBvYmplY3QgbWVtb3J5IHdoZW4gYW55IG9mIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB1c2UgZGVmYXVsdCBhcmd1bWVudHMgd2FzIGNhbGxlZC4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxMTE1MDU1OiBGYWlsZWQgbWFrZSBpbnN0YWxsLiBQYXRjaCBmcm9tIFJvYiBTdG9uZS4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiAjMTEyMzQxNiBmcm9tIFBhdWwgTW9vcmUuIENvcnJlY3QgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFNUUklOR0FSUkFZCiAgICAgICAgICAgIHR5cGVtYXBzIGluIHZhcmlvdXMuaS4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIERpc2FibGVkIHR5cGVtYXAgc2VhcmNoIGNoYW5nZXMgZm9yIG5vdyAoc2VlIGVudHJ5IDE5LzEyLzIwMDQpLiBJdCBicmVha3MKICAgICAgICAgICAgb2xkIHR5cGVtYXBzLCBsZW5ndGhlbnMgdGhlIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDI1JSBhbmQgaW50cm9kdWNlcwogICAgICAgICAgICBpbmNvbnNpc3RlbmNpZXMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBzd2lnIC1oZWxwIGZvbGxvd3Mgb3RoZXIgc29mdHdhcmUgYnkgcHJpbnRpbmcgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgc3dpZyAtdmVyc2lvbiBhbHNvIGRpc3BsYXlzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIEJlaGF2aW91ciByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGZvciB0aGUgbGVzcyBjb21tb25seSB1c2VkIG9yZGVyaW5nIG9mICVpbmNsdWRlIGFuZCAjaW5jbHVkZSwgc28KICAgICAgICAgICAgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMuIEJ1ZyByZXBvcnRlZCBieSByZXBvcnRlZCBieSBNYXggQm93c2hlci4KICAgICAgICAgICAgICAlaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2luY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlfSAKCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gU1dJR19leGNlcHRpb24gbWFjcm8gd2lsbCBub3cgcmV0dXJuIGZyb20gdW5tYW5hZ2VkIGNvZGUgLyBuYXRpdmUgY29kZQogICAgICAgICAgICBhcyBzb29uIGFzIGl0IGlzIGNhbGxlZC4gRml4ZXMgcG9zc2libGUgSlZNIGNyYXNoZXMgYW5kIG90aGVyIGNvZGUgdW5leHBlY3RlZGx5CiAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLiBOb3RlIFNXSUdfZXhjZXB0aW9uIGlzIG9ubHkgb2NjYXNpb25hbGx5IHVzZWQgYnkgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgIHdyaXRlcnMsIGFuZCBpcyBiZXN0IGF2b2lkZWQgYnkgU1dJRyB1c2Vycy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gVHlwZW1hcHMgY2FuIG5vdyBiZSB0YXJnZXRlZCBhdCBnbG9iYWwgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZXMuIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIGZvciAKICAgICAgICAgICAgdGhlIHNldHRlcnMgd2VyZSBpZ25vcmVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBnbG9iYWxpbnQgIi4uLiIKICAgICAgICAgICAgICBpbnQgZ2xvYmFsaW50OwoKMDIvMTMvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkICV0eXBlY2hlY2sgZm9yIFNXSUdUWVBFLCBhZGQgJXR5cGVjaGVjayBmb3IgcHRyZGlmZl90LCBmaXgKCSAgICB0eXBlbWFwcyBmb3Igc2l6ZV90LgoKCSAgICBbUGlrZV0gTWVyZ2UgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgZm9yIGltcHJvdmVkIFBpa2UgY29uZmlndXJhdGlvbi4KCjAyLzEyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgY29uZmlndXJlIHN3aXRjaGVzIC0td2l0aG91dC10Y2wsIC0td2l0aG91dC1weXRob24gZXRjLiBhbGxvdyB0bwogICAgICAgICAgICBkaXNhYmxlIHRoZSBzZWFyY2ggZm9yIGluc3RhbGxlZCBsYW5ndWFnZXMuCgowMS8zMS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBBZGQgRG9oU29ydExpc3QgdG8gRE9ICgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtOgogICAgICAgICAgICAgICArIFNwZWVkLiBUeXBlIGxvYWRpbmcgaXMgbm93IE8obiBsb2cgbikgaW5zdGVhZCBvZiBPKE5eMiksIHdoaWNoCgkgICAgICAgICBmb3IgbGFyZ2UgbW9kdWxlcyBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgICAgICsgQSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gc3dpZ3J1bi5zd2cgbm8gbG9uZ2VyIG5lZWQgdGhlIAogICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9saXN0X2hhbmRsZSBwYXNzZWQgdG8gdGhlbS4gIFRoZSBvbmx5IG9uZSBsZWZ0IGlzIAoJCSBUeXBlUXVlcnkuICBUaGlzIGFsc28gbWFrZXMgcnVudGltZS5zd2cgYSBsb3Qgc21hbGxlci4KCSAgICAgICArIFNwbGl0IHVwIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBpbnRvIHR3byBzdHJ1Y3R1cmVzCgkgICAgICAgICAoc3dpZ190eXBlX2luZm8gYW5kIHN3aWdfY2FzdF9pbmZvKQoJICAgICAgICsgU3RvcmUgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8gcmF0aGVyIHRoYW4ganVzdCB0aGUgdHlwZQoJICAgICAgICAgbmFtZSBzdHJpbmcgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNhc3RzLiBGaXJzdCBvZmYsIHRoaXMgbWFrZXMKCSAgICAgICAgIHRoZSBndWlsZSBtb2R1bGUgYSBsaXR0bGUgZmFzdGVyLCBhbmQgc2Vjb25kLCB0aGUKCSAgICAgICAgIFNXSUdfVHlwZUNsaWVudERhdGEoKSBmdW5jdGlvbiBpcyBmYXN0ZXIgdG9vLiAKCSAgICAgICArIEFkZCB0aGUgaWRlYSBvZiBhIG1vZHVsZSBpbnRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZSwgYWxsIHRoZQoJICAgICAgICAgdHlwZXMgd2VyZSBzdG9yZWQgaW4gb25lIGh1Z2UgbGlua2VkIGxpc3QuIE5vdywgYW5vdGhlciBsZXZlbCBpcwoJICAgICAgICAgYWRkZWQsIGFuZCB0aGUgdHlwZSBzeXN0ZW0gc3RvcmVzIGEgbGlua2VkIGxpc3Qgb2YgbW9kdWxlcywgZWFjaAoJICAgICAgICAgb2Ygd2hpY2ggc3RvcmVzIGFuIGFycmF5IG9mIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KCSAgICAgICArIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIGhvdyB0aGUgcnVudGltZSB0eXBlIHN5c3RlbSBub3cgd29ya3MsCgkgICAgICAgICBwbGVhc2Ugc2VlIERvYy9NYW51YWwvdHlwZW1hcHMuaHRtbCBhbmQgRG9jL0RldmVsL3J1bnRpbWUudHh0CgkJIAoJICAgIC0gVXBkYXRlIGFsbCBsYW5ndWFnZSBtb2R1bGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgVGhlIGNoYW5nZXMKCSAgICAgIHRvIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlIGFyZSBtaW5vci4gIEFsbCBsYW5ndWFnZXMgYXJlIG5vdyBhYmxlIHRvCgkgICAgICB1c2UgcnVudGltZS5zd2cgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUKCSAgICAgIG9ubHkgcHl0aG9uIGFuZCBwZXJsIGRpZC4KCgkgICAgLSBbZ3VpbGUsIG16c2NoZW1lLCBvY2FtbCwgYW5kIHBocDRdICBUaGVzZSBsYW5ndWFnZXMgb3BlbmVkIHVwIHRoZQoJICAgICAgaW5pdCBmdW5jdGlvbiBpbnNpZGUgdGhlIC5jeHggY29kZSwgYW5kIGFueSBjb2RlIGluIHRoZSAuc3dnIGZpbGVzCgkgICAgICBpbiB0aGUgaW5pdCBzZWN0aW9uIHdhcyBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgd2FzIGEgcHJvYmxlbQoJICAgICAgZm9yIHN3aWdpbml0LnN3Zywgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBTV0lHX2luaXQKCSAgICAgIGZ1bmN0aW9uIGlzIG9wZW5lZC4gIFRodXMgSSBjaGFuZ2VkIHRoZXNlIGxhbmd1YWdlcyB0byBiZSBsaWtlCgkgICAgICBweXRob24gb3IgcGVybCwgd2hlcmUgdGhlIGluaXQgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIC5zd2cKCSAgICAgIGZpbGUuCgkgICAgICAKCSAgICAtIFtSdWJ5XSBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgaW5pdCBmdW5jdGlvbiB0byB0aGUgLnN3ZyBmaWxlLCBJCgkgICAgICBhZGRlZCBhIG5ldyBzZWN0aW9uIGluaXRiZWZvcmVmdW5jLCBhbmQgdGhlbiBhZGRlZAoJICAgICAgJWluc2VydChpbml0YmVmb3JlZnVuYykgInN3aWdpbml0LnN3ZyIKCgkgICAgLSBbTXpTY2hlbWVdIEZpeCBlbnVtcyBhbmQgZml4IEV4YW1wbGVzL01ha2VmaWxlLmluIHNvIHRoYXQgaWYKCSAgICAgIG11bHRpcGxlIC1JIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBJTkNMVURFUyB2YXJpYWJsZSwgZWFjaAoJICAgICAgZ2V0cyBhICsrY2NmLgoKCSAgICAtIFtHdWlsZSBHSF0gVXBkYXRlIEd1aWxlIEdIIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgU2VlCgkgICAgICBEb2MvTWFudWFsL0d1aWxlLmh0bWwgZm9yIGhvdyBzbW9icyBhcmUgbm93IHVzZWQuCgowMS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyB0eXBlbWFwIGNhbGxlZCAnY3Njb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwIGNhbGxlZCAnamF2YWNvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuIEFub3RoZXIgdHlwZW1hcCBuYW1lZCAnamF2YWNvbnN0cnVjdF9kaXJlY3RvcicKICAgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIGEgZGlyZWN0b3IgY2xhc3MuCgogICAgICAgICAgICBbQyMsIEphdmFdIElmIGEgQysrIGNsYXNzIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGEgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoaXMgc2VlbXMgaXMgdW5uZWNlc3NhcnkgYW5kIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgYW5kIHRoZXJlYnkgZ2l2aW5nIHRoZSB1c2VyIGFsbW9zdCBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIG5ldyB0eXBlbWFwcyBhYm92ZS4KCjE5LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbRGlzYWJsZWQsIHNlZSBlbnRyeSAwMi8xNS8yMDA0XQogICAgICAgICAgICAtIEZpeCB0eXBlbWFwIHNlYXJjaCwgbm93IHRoZSAib3V0IiB0eXBlbWFwIHNlYXJjaCBpcyBkb25lIGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICAgaW50ICpGb286OmZvbyhpbnQgYmFyKSAgIC0+ICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKkZvbzo6Zm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqCgogICAgICAgICAgICAgICB0aGVuLCBub3cgeW91IGNhbiBiZSBtb3JlIHNwZWNpZmljLCBhbmQgZGVmaW5lCgogICAgICAgICAgICAgIC8qIGFwcGx5IG9ubHkgZm9yICAnRm9vOjpmb28nIG1ldGhvZCAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogRm9vOjpmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgIC8qIGFwcGx5IGZvciBhbGwgJ2ZvbycgZnVuY3Rpb25zL21ldGhvZHMgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIGZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCAqZm9vKGludCAqYmFyKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoJICAKCjE1LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICAtIE1vcmUgZml4ZXMgZm9yIHRlbXBsYXRlcyBhbmQgdGVtcGxhdGUgZGVmYXVsdCBhcmdzLgogICAgICAgICAgICAgIFNlZSB0ZW1wbGF0ZV9kZWZhdWx0LmkgZm9yIHNjYXJ5IGNhc2VzIHRoYXQgbm93IGFyZSAKICAgICAgICAgICAgICBzdXBwb3J0ZWQsIGJlc2lkZXMgdGhlIGFscmVhZHkgdWdseSBTVEwvc3RkIGNhc2VzLgogICAgICAgICAgICAgIAogICAgICAgICAgICAtIENvc21ldGljcyBhbmQgbW9yZSB1c2Ugb2YgJ2NvbnN0JyB3aGVyZSBpdCB3YXMgaW1wbGljaXQuCiAgICAgICAgICAgIC0gT3RoZXIgZml4ZXMgZm9yIE9TUywgd2hpY2ggaXMgbm93IHdvcmtpbmcgYWdhaW4gd2l0aCAxLjMuMjUuCgkKVmVyc2lvbiAxLjMuMjQgKERlY2VtYmVyIDE0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIEZpeCBhIGJ1bmNoIG9mIGJ1Z3MgcmVsYXRpbmcgdG8gLXByb3h5IHN1cHBvcnQKCSAgICAgICsgbm9uLWNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBtZW1iZXIgY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIGFkZGVkIGEgLW5vdW5pdCBhcmd1bWVudCwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IHRoZSAoZGVjbGFyZSAodW5pdCAuLi4pKQoJICAgICAgKyBjb3JyZWN0bHkgaW5zdGFsbCBzd2lnY2xvc3ByZWZpeC5zY20KCSAgICAgICsgY29uc3RhbnRzIChlbnVtcywgZGVmaW5lcykgbm93IGNvcnJlY2x5IGV4cG9ydCB3aGVuIHVzaW5nIC1wcm94eQoKMTIvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uZmlndXJlIGZpeCBmb3Igd2hlbiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2Ygam5pX21kLmggaXMgZm91bmQKICAgICAgICAgICAgaW4gdGhlIEphdmEgaW5jbHVkZSBkaXJlY3RvcnkgKHdhcyBnZW5lcmF0aW5nIGxvdHMgb2Ygc2VkIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2VzKS4KCjEyLzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byBhcnJheXNfamF2YS5pIHNvIHRoYXQgb25lIGNhbiBhcHBseSB0aGUgYXJyYXkKICAgICAgICAgICAgdHlwZW1hcHMgdG8gZnVuY3Rpb25zIHRha2luZyBwb2ludGVycyBhcyBpbnB1dCwgZWcKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgICVhcHBseSBpbnRbXSB7aW50Kn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKmEpOwoKMTIvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIG1vZHMgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLiBOZXcgdHlwZW1hcHMKICAgICAgICAgICAgZGlyZWN0b3JkaXNjb25uZWN0IGFuZCBkaXJlY3RvcmRpc2Nvbm5lY3RfZGVyaXZlZCBmb3IgdGhlIAogICAgICAgICAgICBzd2lnRGlyZWN0b3JEaXNjb25uZWN0KCkgbWV0aG9kLiBBbHNvIGZpeCB0byBnZXQgdGhlIGphdmFwYWNrYWdlCiAgICAgICAgICAgIHR5cGVtYXAgd29ya2luZyBhZ2Fpbi4KCjEyLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gRmluaXNoaW5nIHRoZSBmaXhlcyBmb3IgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyArIHNwZWNpYWxpemF0aW9ucy4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gTm93IHdlIHVzZSB0aGUgbmV3IHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgaW4gdGhlIHN0ZC9TVEwgbGlicmFyeS4gVGhhdCBtZWFucyB0aGUgaW50ZXJuYWwKCSAgICAgIHN3aWcgZmlsZXMgYXJlIGdldHRpbmcgdWdsaWVyIHNpbmNlIHdlIG5vdyBzdXBwb3J0IHRoZQoJICAgICAgb3JpZ2luYWwgZGVjbGFyYXRpb25zOgoKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgX1RwID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJLi4uLgoJCX07CgkgICAgICAJICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleSA+LAoJICAgICAgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwID4gPiA+CiAgICAgICAgICAgICAgICBjbGFzcyBtYXAgewoJCS4uLi4KCQl9OwogCiAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIGNhbiB1c2UgdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXMKCgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgc3RkOjphbGxvY2F0b3I8aW50PiA+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIE15QWxsb2NhdG9yPGludD4gPjsKCiAgICAgICAgICAgICAgTm93IHdlIGFyZSBjbG9zZXIgdG8gdGhlIGNsZWFuaW5nL3Jld3JpdGluZyBvZiB0aGUKCSAgICAgIHB5dGhvbiBzdGQvU1RMIHN1cHBvcnQsIHN1Y2ggdGhhdCB3ZSByZWNvdmVyIHN1cHBvcnQgZm9yCgkgICAgICBNU1ZDKysgNi4wLCBhbmQgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKCSAgICAgIHRvby4KCgoxMi8wMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyBtZXRob2RzIHVzaW5nIGEgbWVtYmVyIGVudW0KICAgICAgICAgICAgYW5kIHR5cGVzYWZlL3Byb3BlciBlbnVtcyBlbmFibGVkLgoKMTIvMDEvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdHlwZW1hcHMgdG8gd29yayB3aXRoIHRlbXBsYXRlcyBhbmQgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncywgaWUKCgkgICAgICAgdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEIgPSBpbnQ+CiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgIH07CgoJICAgICAgICV0eXBlbWFwKGluKSBGb288aW50PiAqey4uLn0KCSAgICAgICAldHlwZW1hcChvdXQpIEZvbzxpbnQsaW50PiAqey4uLn0KCgkgICAgICAgRm9vPGludD4gKiBmb28oIEZvbzxpbnQ+ICpmMSwgRm9vPGludCxpbnQ+ICpmMik7CgoJICAgICAgbm93ICdmMScsICdmMicgYW5kIHRoZSByZXR1cm4gdmFsdWUgcmVzb2x2ZSB0aGUgcHJvdmlkZWQKCSAgICAgIHR5cGVtYXBzIHByb3Blcmx5LgoKCSAgICAgIFRoaXMgaXMgaGlnaGx5IG5lZWRlZCBmb3IgcHJvcGVyIFNUTCBzdXBwb3J0LCBzZWUgbmV3IAoJICAgICAgc3RkX2Jhc2ljX3N0cmluZy5pLCBzdGRfc3N0cmVhbS5pLCBldGMuCgoJICAgIC0gQWRkZWQgc3RkX3NzdHJlYW0uaSwgYW5kIGZpeCBzdGRfYmFzaWNfc3RyaW5nLmkgdG8gdXNlCgkgICAgICB0aGUgbmV3IHR5cGVtYXBzICsgdGVtcGxhdGUgZGVmLiBhcmcgbWVjaGFuaXNtLiBBbHNvLAoJICAgICAgYWRkZWQgdGhlIG5lZWRlZCBzdGRfYWxsb2MuaS4gTm93LCBhbGwgdGhlIGNvbnRhaW5lcnMKCSAgICAgIGNhbiBiZSBtb2RpZmllZCB0byBzdXBwb3J0IHN0ZDo6YWxsb2NhdG9yLCBsaWtlIGluOgoJICAgICAgCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJcHVibGljOgoJCS4uLi4KCQl9OwoJICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBpcyBvbmx5IGNvbXBsZXRlZCBieSBub3cgZm9yIGJhc2ljX3N0cmluZy4KCgkgICAgLSBGaXggZm9yIHNtYXJ0IHBvaW50ZXJzICsgbWVtYmVycyArIGV4dGVuc2lvbnM6CgoJICAgICAgJWV4dGVuZCBGb28gewoJICAgICAgICBpbnQgZXh0ZW5zaW9uKGludCBpLCBpbnQgaikgeyByZXR1cm4gaTsgfQoJCWludCBleHRlbnNpb24oKSB7IHJldHVybiAxOyB9CgkgICAgICB9CgoJICAgICAgJWlubGluZSAlewoKCSAgICAgIGNsYXNzIEZvbyB7CgkgICAgICBwdWJsaWM6CgkJaW50IHk7CgkJc3RhdGljIGNvbnN0IGludCB6OwoJICAgICAgfTsKICAKCSAgICAgIGNsYXNzIEJhciB7CgkgICAgICAgIEZvbyAqZjsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgQmFyKEZvbyAqZikgOiBmKGYpIHsgfQoJCUZvbyAqb3BlcmF0b3ItPigpIHsKCQkgIHJldHVybiBmOwoJCX0KCSAgICAgIH07CgoJICAgICAgbm93IHlvdSBjYW4gCgkgICAgIAoJICAgICAgZiA9IEZvbygpCgkgICAgICBmLnkgPSAzCgkgICAgICBhID0gZi56CgkgICAgICBmLT5leHRlbnNpb24oKQogCgkgICAgICBiID0gQmFyKGYpCgkgICAgICBiLnkgPSAzCgkgICAgICBhID0gYi56CgkgICAgICBiLT5leHRlbnNpb24oKQoKCSAgICAtIE90aGVyIHNtYWxsIGVycm9ycyBmaXhlcywgbW9zdGx5IHB5dGhvbi4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBidWcgZml4ZXMgc28gdGhhdCB0aGUgY29ycmVjdCBqYXZhIHR5cGVzCiAgICAgICAgICAgIGFuZCBjYW5vbmljYWxpemVkIHR5cGVzIGluIHRoZSBKTkkgY29kZSBhcmUgZW1pdHRlZC4gVXNlIG9mIHRoZQogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgbm93CiAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLWRpcmVjdG9yIHR5cGVtYXBzLiBUaGUgdHlwZXMgdXNlZCBmb3IgCiAgICAgICAgICAgIHR5cGVtYXAgbG9va3VwcyBhcmUgYWxzbyBjb3JyZWN0ZWQgaW4gYSBmZXcgcGxhY2VzLiBJZiB5b3UgCiAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHlvdXIgb3duIGRpcmVjdG9yIHR5cGVtYXBzLCBlbnN1cmUgdGhleSBhcmUgdXNpbmcgdGhlCiAgICAgICAgICAgIGNvcnJlY3QgQysrIHR5cGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25zdCBlbnVtIFNXSUdUWVBFICYgdHlwZW1hcHMgYWRkZWQuIFRoZXNlIHdyYXAgY29uc3QgZW51bSByZWZlcmVuY2VzCiAgICAgICAgICAgIGFzIGlmIHRoZXkgd2VyZSBwYXNzZWQgYnkgdmFsdWUuIENvbnN0IGVudW0gcmVmZXJlbmNlcyB0aHVzIHdvcmsgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIGNvbnN0IGRvdWJsZSAmLCAKICAgICAgICAgICAgY29uc3QgaW50ICYgZXRjLiBUeXBlbWFwcyBhZGRlZCBmb3IgSmF2YSwgQyMsIFJ1YnksIFRjbCwgUGVybCBhbmQgUGlrZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IHNwZWNpYWwgdmFyaWFibGU6ICQqamF2YWNsYXNzbmFtZSwgc2ltaWxhciB0byAkamF2YWNsYXNzbmFtZQogICAgICAgICAgICBhbmQgJCZqYXZhY2xhc3NuYW1lLiBUaGUgbmV3IG9uZSByZW1vdmVzIGEgcG9pbnRlciBmcm9tIHRoZSBDIHR5cGUgYmVmb3JlCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBPbmUgb3IgbW9yZSBvZiAkamF2YWNsYXNzbmFtZSwKICAgICAgICAgICAgJCZqYXZhY2xhc3NuYW1lIG9yICQqamF2YWNsYXNzbmFtZSBtYXkgbm93IGFwcGVhciBpbiBhIHR5cGVtYXAuIExpa2V3aXNlIGZvcgogICAgICAgICAgICBDIyB1c2luZyBjc2NsYXNzbmFtZSBpbnN0ZWFkIG9mIGphdmFjbGFzc25hbWUuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgbGFzdCB2ZXN0aWdlcyBvZiBlbnVtcyBiZWluZyBoYW5kbGVkIGFzIGludGVnZXJzIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW50ZXJuYWxzLiBUaGUgd3JhcHBlciBtZXRob2RzIHVzZSB0aGUgZW51bSB0eXBlIHJhdGhlciB0aGFuIGFuIGludAogICAgICAgICAgICBub3cuIFRoZSBuZXQgcmVzdWx0IGlzIGFkZGVkIHR5cGUgc2FmZXR5IGZvciBlbnVtcyB3aGVuIGhhbmRsZWQgYXMKICAgICAgICAgICAgcG9pbnRlcnMsIHJlZmVyZW5jZXMgZXRjLiBQcmV2aW91c2x5IGluIHNpdHVhdGlvbnMgc3VjaCBhcyBhIG1ldGhvZAogICAgICAgICAgICB0YWtpbmcgYSBwb2ludGVyIHRvIGFuIGVudW0sIGEgcG9pbnRlciB0byBhbiBpbnQgb3IgYSBwb2ludGVyIHRvIGFuCiAgICAgICAgICAgIGVudW0gb2Ygc29tZSBvdGhlciB0eXBlIGNvdWxkIGluYWR2ZXJ0YW50bHkgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QuCiAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGFzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBlbnVtIGlzIG5vIGxvbmdlciBiYXNlZCBvbgogICAgICAgICAgICBhbiBpbnQsIGJ1dCB0aGUgZW51bSB0eXBlIGluc3RlYWQuIEFub255bW91cyBlbnVtcyBhcmUgc3RpbGwgaGFuZGxlZAogICAgICAgICAgICBhcyBpbnRlZ2Vycy4KCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzIGluIGNvcnJlY3QgdXNhZ2Ugb2YgZW51bXMKICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBub3RpY2VhYmxlLiBUaGVyZSBpcyBubyBjaGFuZ2UgZm9yIGFueSBvZiB0aGUgbGFuZ3VhZ2VzCiAgICAgICAgICAgIHdoZXJlIGVudW1zIGFyZSBwYXNzZWQgYnkgdmFsdWUgLSBtb3N0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpbGwKICAgICAgICAgICAgc3RpbGwgYWNjZXB0IGFuIGludGVnZXIgZm9yIGFuIGVudW0gdmFsdWUgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICBsYW5ndWFnZXMgc3RpbGwgdXNlIGVpdGhlciB0eXBlc2FmZSBlbnVtcywgaW50ZWdlcnMgb3IgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIGNvbmZpZ3VyZXMuIEZvciBKYXZhIGFuZCBDIyB1c2VycyBhIGNoYW5nZQogICAgICAgICAgICBpbiB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgbmFtZSBoYXMgb2NjdXJyZWQgKGZvciBlbnVtIHBvaW50ZXJzLAogICAgICAgICAgICByZWZlcmVuY2VzIGV0YykuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyBvbmU9MSwgdHdvIH07CiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzKiBudW1iZXIoKTsKCiAgICAgICAgICAgIEluIEphdmEgYW5kIEMjIHRoaXMgbXVzdCBub3cgYmUgY29kZWQgYXMKCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9OdW1iZXJzIG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgcmF0aGVyIHRoYW4KCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzIwMDQ6IHdzZnVsdG9uL21tYXR1cwogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGRlcHJlY2F0ZWQgd2FybmluZyBmb3IgJW5hbWUgYW5kIHJlbW92ZSByZW1haW5pbmcgJW5hbWUKICAgICAgICAgICAgdXNhZ2UgaW4gdGhlIFNXSUcgbGlicmFyaWVzLgoKMTEvMjEvMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIHRoZSBQeVN3aWdPYmplY3QgdG8gYmUgdXNlZCBmb3IgY2FycnlpbmcKCSAgICAgIHRoZSBpbnN0YW5jZSBDL0MrKyBwb2ludGVycy4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YKCSAgICAgIHN0cmluZyBhbmQgUHlDT2JqZWN0cy4KCgkgICAgICBUaGUgbmV3IFB5U3dpZ09iamVjdCBpcyBldmVuIHNhZmVyIHRoYW4gUHlDT2JqZWN0LCBhbmQKCSAgICAgIG1vcmUgZnJpZW5kbHkgdGhhbiBwbGFpbiBzdHJpbmdzOgoKCSAgICAgIG5vdyB5b3UgY2FuIGRvCgoJICAgICAgICBwcmludCBhLnRoaXMKCQk8U3dpZyBPYmplY3QgYXQgXzAwNjkxNjA4X3BfQT4KCgkJcHJpbnQgc3RyKGEudGhpcykKCQlfMDA2OTE2MDhfcF9BCgoJCXByaW50IGxvbmcoYS50aGlzKQoJCTEzNTY4NjQwMAoKCQlwcmludCAiJXMgMHgleCIgJSAoYS50aGlzLCBhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQSAweDgxNjY5MDAKCgkgICAgICB0aGUgbGFzdCBvbmUgaXMgdmVyeSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlIEMvQysrCgkgICAgICBzaWRlLCBzaW5jZSBpcyB0aGUgcG9pbnRlciB2YWx1ZSB5b3Ugd2lsbCB1c3VhbGx5IGdldAoJICAgICAgZnJvbSB0aGUgZGVidWdnZXIuCgoJICAgICAgQWxzbywgaWYgeW91IGhhdmUgc29tZSBvbGQgY29kZSB0aGF0IHVzZXMgdGhlIHN0cmluZwoJICAgICAgcmVwcmVzZW50YXRpb24gIl8wMDY5MTYwOF9wX0EiLCB5b3UgY2FuIHVzZSBpdCBub3cgYWdhaW4KCSAgICAgIHVzaW5nICdzdHIocHRyKScsIG9yIGJ5IGNhbGxpbmcgJ3N0ciA9IFB5T2JqZWN0X1N0cihvYmopJwoJICAgICAgaW4gdGhlIEMvQysrIHNpZGUuCiAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG1haW5seSBmb3Igbm9zdGFsZ2ljIHN3aWcgdXNlcnMgdGhhdCBtaXNzCgkgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBidXQgYWxzbyBhbGxvd3MgdG8gc2F5IGFnYWluCgoJICAgICAgICBpZiBhLnRoaXMgPT0gYi50aGlzOgoJCSAgcmV0dXJuICJhIGlzIGIiCgoJICAgICAgYW5kIHdlbGwsIHNpbmNlIHRoZSBjaGFuZ2Ugd2VyZSByZWFsbHkgc2ltcGxlLCBtYXliZSBpbgoJICAgICAgdGhlIGZ1dHVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZG8KICAgCgkJbmV4dCA9IGEudGhpcyArIDEKCgkgICAgICBvciBhZGQgbmF0aXZlIHB5dGhvbiBpdGVyYXRpb24gb3ZlciBuYXRpdmUgQy9DKysgYXJyYXlzLAoJICAgICAgaWUsIG5vIG5lZWQgdG8gY3JlYXRlL2NvcHkgbmV3IHR1cGxlcyB3aGVuIHJldHVybmluZyBhbmQKCSAgICAgIGFycmF5IG9yIHZlY3Rvci4KCgkgICAgICBBbHNvLCBhIFB5U3dpZ1BhY2tlZCBvYmplY3Qgd2FzIGFkZGluZyB0byBjYXJyeSBhIG1lbWJlcgoJICAgICAgbWV0aG9kIHBvaW50ZXIsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGEgdGVtcG9yYWwgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzk4Mjc1MyBmcm9tIEZhYnJpY2UgU2FsdmFpcmU6IEFkZHMgZGVwZW5kZW5jaWVzIGdlbmVyYXRpb24gZm9yCiAgICAgICAgICAgIGNvbnN0cnVjdGluZyBtYWtlZmlsZXMuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtTUYgLU1EIC1NTUQgdG8gd29yawogICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IG9wdGlvbnMgLU0gYW5kIC1NTS4gVGhlc2Ugb3B0aW9ucyBhcmUgbmFtZWQgdGhlIHNhbWUKICAgICAgICAgICAgYW5kIHdvcmsgdGhlIHNhbWUgYXMgaW4gZ2NjLgoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWlnbm9yZS8lcmVuYW1lIGNoYW5nZXMgZm9yIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB0byBtaXJyb3IKICAgICAgICAgICAgJWZlYXR1cmUgYmVoYXZpb3VyLiBTZWUgcHJldmlvdXMgZW50cnkuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIGZpbmUgdHVuaW5nIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLiBBbnkgJWZlYXR1cmUgdGFyZ2V0aW5nIGEgbWV0aG9kIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2lsbCBhcHBseSB0byBhbGwgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlmIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlCiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUsIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBtYXRjaCB0aGF0IGV4YWN0CiAgICAgICAgICAgIHdyYXBwZXIgbWV0aG9kIG9ubHkgYW5kIG5vdCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHdpbGwgYXBwbHkgdGhlIGZlYXR1cmUgdG8gYWxsIHRocmVlIHdyYXBwZXIgbWV0aG9kcywgdGhhdCBpczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBvbmx5IGFwcGx5IHRvIHRoaXMgd3JhcHBlciBtZXRob2Q6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKCiAgICAgICAgICAgYW5kIG5vdCB0aGVzZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1ha2UgJWZlYXR1cmUgbW9yZSBwb3dlcmZ1bCB0byBlYXNlIHRoZSBtaWdyYXRpb24KICAgICAgICAgICB0byBuZXcgZGVmYXVsdCBhcmd1bWVudHMgd3JhcHBpbmcgYXBwcm9hY2guCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIElmIHlvdSBwcmV2aW91c2x5IGhhZCBhICVmZWF0dXJlIGFuZCBkaWRuJ3Qgc3BlY2lmeSB0aGUgZGVmYXVsdCBhcmd1bWVudHMsCiAgICAgICAgICAgeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhlbSBpbiBub3cgb3IgeW91IGNhbiBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91cgogICAgICAgICAgIGJ5IHVzaW5nICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKS4KCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcHMgZm9yIHN0ZDo6dmVjdG9yIGFkZGVkIGludG8gc3RkX3ZlY3Rvci5pLiBUaGUgcHJveHkgY2xhc3NlcwogICAgICAgICAgICBnZW5lcmF0ZWQgYXJlIG1vZGVsbGVkIG9uIHRoZSAuTkVUIEFycmF5TGlzdCBjbGFzcy4gVGhpcyBpc24ndCBxdWl0ZQogICAgICAgICAgICByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbiB5ZXQsIGJ1dCB3aWxsIHdvcmsgd2l0aCB2ZWN0b3JzIG9mIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBhbmQgc29tZSBjbGFzc2VzLgoKMTAvMy8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0dVSUxFXSBUaGUgLXNjbSBpbnRlcmZhY2UgaXMgbm93IHRoZSBkZWZhdWx0LiAgVGhlIG9sZCBHSCBpbnRlcmZhY2UgY2FuCgkgICAgc3RpbGwgYmUgZW5hYmxlZCBieSBwYXNzaW5nIC1naCB0byBTV0lHLgoKMTAvMi8yMDA0OiBtbWF0dXMKCgkgICAgLSBNb3JlIGZpeGVzIGZvciBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMuCgkgICAgICBBcyBhbiBleHRyYSBib251cywgd2UgZ2V0ICV0ZW1wbGF0ZSBzdXBwb3J0IGZvciBzdGF0aWMvbWVtYmVycyBjbGFzcwoJICAgICAgbWV0aG9kcywgaWUsIG5vdyB5b3UgY2FuIHNheToKCgkgICAgICAgIG5hbWVzcGFjZSBzcGFjZSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEJCQkgICAgCgkgICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CSAgICAKCSAgICAgICAgICAgc3RhdGljIHZvaWQgZm9vVChZIHkpIHsgfQoJICAgICAgICAgfTsJCgkJfQkJCSAgICAKCSAgICAgIAkgICAgICAJCQkgICAgCgkgICAgICAgIHN0cnVjdCBCCQkJICAgIAoJICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JCSAgICAKCSAgICAgICAgICB2b2lkIGJhclQoWSB5KSB7fSAKCSAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKCgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8ZG91YmxlPjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxpbnQ+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGNoYXI+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8ZG91YmxlPjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGludD47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxjaGFyPjsKCgkgICAgICBhbmQgY2FsbAoKCSAgICAgICAgQS5mb28oMSkKCQliID0gQigpCgkJYi5iYXIoMSkKCSAgICAgIAoJICAgICAgbm90ZSB0aGUgbWV0aG9kcyBhcmUgZW1pdHRlZCBpbnNpZGUgdGhlIGNsYXNzZXMsCgkgICAgICBhbmQgaGVuY2UsIHRoZSAldGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gdGhlICdtZW1iZXInCgkgICAgICBtZXRob2QgbmFtZSwgbm90IGEgZ2xvYmFsIG5hbWVzcGFjZSBuYW1lLgoKMTAvMzEvMjAwNDogbW1hdHVzCgkgICAgLSBTb2x2ZSBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMsIGFzIGluCgoJICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgIHN0cnVjdCBCYXI7CgkJIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHN0cnVjdCBmb286OkJhciA6IEZvbyB7CiAgICAgICAgICAgICAgIH07CgoJICAgICAgIHNlZSBuYW1lc3BhY2VfY2xhc3MuaSBmb3IgbW9yZSBleGFtcGxlcy4KCiAgICAgICAgICAgIC0gRml4ICV0ZW1wbGF0ZSBkaXJlY3RpdmUgdG8gcHJvcGVybHkgdXNlIG5hbWVzcGFjZXMsCiAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSBjYXNlOgoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewoJCSAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCQkgICAgICAgc3RydWN0IFB0ciB7fTsKICAgICAgICAgICAgICAgICAgIH0KCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsJCSAgCgkJICAgICAgIHN0cnVjdCBPYmoxIHt9OwoJCSAgICAgICB0eXBlZGVmIFB0cjxPYmoxPiBPYmoxX3B0cjsKICAJCSAgICAgICAldGVtcGxhdGUoT2JqMV9wdHIpIFB0cjxPYmoxPjsgCgkJICAgfQkJCQkgIAoJCSAgIAkJCQkgIAoJCSAgIG5hbWVzcGFjZSB0d28gIAoJCSAgIHsKCQkgICAgICAgc3RydWN0IE9iajIge307CQoJCSAgICAgICB0eXBlZGVmIG9uZTo6UHRyPE9iajI+IE9iajJfcHRyOwoJCSAgICAgICAldGVtcGxhdGUoT2JqMl9wdHIpIG9uZTo6UHRyPE9iajI+OwoJCSAgIH0KCgkgICAgICB0aGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIG5hbWVzcGFjZSBuYW1lICdvbmUnIHRvIGNyZWF0ZQogICAgICAgICAgICAgIGEgbmFtZXNwYWNlIG5vZGUgdG8gZW1pdCB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICBqdXN0IGFzIGJlZm9yZSwgYnV0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSByZXNvbHZlZAogICAgICAgICAgICAgIGFuZCBxdWFsaWZpZWQgaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlICgnb25lJyBvciAndHdvJykuCiAgICAgICAgICAgICAgVGhpcyBpcyBzYW1lIHdheSB0aGF0IHR5cGVkZWYgd29ya3MuIAoKCSAgICAgIFRoaXMgcmVzb2x2ZSB0aGUgc21hcnRfcG9pbnRlcl9uYW1lc3BhY2UyLmkgY2FzZSwgYW5kIGF0CiAgICAgICAgICAgICAgdGhlIHNhbWUgdGltZSwgc2V2ZXJhbCBvdGhlciBvbmVzIHdoZXJlIGJlZm9yZSBzd2lnIHdhcwogICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlCgoJICAgICAgICAiQ2FuJ3QgaW5zdGFudGlhdGUgdGVtcGxhdGUgJ3h4JyBpbnNpZGUgbmFtZXNwYWNlICd5eSciCgkgICAgICAKCSAgICAgIGVycm9yIG1lc3NhZ2UuIEluIGZhY3QsIHRoYXQgZXJyb3IgZG9lc24ndCBleGlzdAoJICAgICAgYW55bW9yZS4gWW91IGNhbiBvbmx5IGdldCBhbiBlcnJvciBpZiB5b3UgdXNlIGEgYmFkCgkgICAgICBuYW1lc3BhY2UgbmFtZSBvciBzby4KCjEwLzMwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW3J1YnldIERpcmVjdG9ycyBmaXhlczoKCSAgICAgIC0gZW51bXMgYW5kIHN0ZDo6c3RyaW5ncyBhcmUgd29ya2luZyBub3cgKHNldmVyYWwKCSAgICAgICAgcmVwb3J0cyBpbiBidWcgdHJhY2sgc3lzdGVtKQoJICAgICAgLSBhZGRlZCBwYXRjaCAxMDI1ODYxIGZvciBkaXJlY3RvciArIGV4Y2VwdGlvbnMKCQkKICAgICAgICAgICAgICAqKiogQXR0ZW50aW9uICoqKjogcnVieSB3aXRoIGRpcmVjdG9ycyArIHByb3RlY3RlZAogICAgICAgICAgICAgIG1lbWJlcnMgd29yayB3aXRoIHZlcnNpb24gMS43Ky4gT2xkZXIgdmVyc2lvbnMgc2VlbXMgdG8KICAgICAgICAgICAgICBoYXZlIGEgYnJva2VuIHNpZ25hdHVyZSBmb3IncmJfcHJvdGVjdCcuCgkJCgkgICAgICBJZiB5b3UgbmVlZCB0byB1c2UgYW4gb2xkIHZlcnNpb24sIGxvb2sgYXQKCgkgICAgICBodHRwOi8vZXhjcnVieS5zb3VyY2Vmb3JnZS5uZXQvZG9jcy9odG1sL3J1YnlfX2hhY2tzXzhocHAtc291cmNlLmh0bWwKICAJICAgICAgZm9yIHdvcmthcm91bmRzLgoJICAgICAgCiAgICAgICAgICAgIC0gW3J1YnldIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIGluIHR5cGVtYXAgKGJ1ZyAxMDM3MjU5KQoKCSAgICAtIFt0Y2xdIEZpeCAoZW51bXN8Y29uc3RhbnRzKSArIG5hbWVzcGFjZSBvcHRpb24gCgkgICAgICAgICAgICAocmVwb3J0ZWQgYnkgamFzb24ubS5zdXJwcmlzZUBpbnRlbC5jb20pLgoKICAgICAgICAgICAgLSBbcGVybF0gQWRkIHBhdGNoIDk2MjE2OCBmb3IgbXVsdGlwbGUgaW5oZXJldGFuY2UKCSAgICAKCSAgICAtIEZpeCAnZGVmaW5lZCcgYXMgdmFyaWFibGUgbmFtZS4KCjEwLzI5LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGdsb2JhbCBzY29wZSBvcGVyYXRvciB1c2VkIGZvciBmcmllbmQgbWV0aG9kczoKCiAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBmcmllbmQgdm9pZCA6Omdsb2JhbHNjb3BlKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMTAvMjgvMjAwNDptbWF0dXMKCSAgICAtIEFkZGVkIG1vZHVsZSBhbmQgc3dpZyBvcHRpb24gInRlbXBsYXRlcmVkdWNlIiB0byBmb3JjZSBzd2lnCgkgICAgICB0byByZWR1Y2UgYW55IHR5cGUgbmVlZGVkIHdpdGggdGVtcGxhdGVzLCBpZSwgaW4gdGhlc2UgY2FzZXMKCiAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0ZW1wbGF0ZXJlZHVjZSIpIHRlc3QKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEEgeyB9OwoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludDsKCSAgICAgICAgJXRlbXBsYXRlKEFfSW50KSBBPEludD4gID09PiAgJXRlbXBsYXRlKEFfSW50KSBBPGludD4KCiAgICAgICAgICAgICAgICB0eXBlZGVmIEIqIEJwOwoJICAgICAgICAldGVtcGxhdGUoQV9CcCkgQTxCcD4gID09PiAgJXRlbXBsYXRlKEFfQnApIEE8Qio+CgogICAgICAgICAgICAgIHN3aWcgcmVkdWNlcyB0aGUgdHlwZXMgSW50IGFuZCBCcCB0byB0aGVpciBwcmltaXRpdmVzCiAgICAgICAgICAgICAgaW50IGFuZCBCKi4gVGhpcyBpcyBjbG9zZXIgdG8gdGhlIHVzdWFsIGNvbXBpbGVyCiAgICAgICAgICAgICAgcmVzb2x1dGlvbiBtZWNoYW5pc20sIGFuZCBpdCBpcyByZWFsbHkgbmVlZGVkIHNvbWV0aW1lcwogICAgICAgICAgICAgIHdoZW4geW91IG1peCB0ZW1wbGF0ZXMgKyB0eXBlZGVmcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgICBEb24ndCB1c2UgaXQgaWYgeW91IGRvbid0IGhhdmUgYW55IHByb2JsZW0gYWxyZWFkeSwKCSAgICAgIHNpbmNlIHRoZSB0eXBlIHJlZHVjdGlvbiBjYW4gaW50ZXJmZXJlIHdpdGggc29tZQoJICAgICAgdXNlciB0eXBlbWFwcywgc3BlY2lhbGx5IGlmIHlvdSBkZWZpbmVkIHNvbWV0aGluZyBsaWtlCgoJCSAgIHR5cGVkZWYgaW50IEludDsKCQkgICAldHlwZW1hcChpbikgSW50IC4uLjsKCiAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLCB3aGVuIHlvdSB1c2UgdGhlICJ0ZW1wbGF0ZXJlZHVjZSIgb3B0aW9uLAoJICAgICAgc3dpZyB3aWxsIGlnbm9yZSB0aGUgdXNlciB0eXBlbWFwLCBzaW5jZSB0aGUgInR5cGVkZWYgaW50IEludCIKCSAgICAgIHdpbGwgdGFrZSBwcmVjZWRlbmNlLCBhbmQgdGhlIHVzdWFsICJpbnQiIHR5cGVtYXAgd2lsbCBiZQoJICAgICAgYXBwbGllZC4gCgoJICAgICAgTm90ZSB0aGF0IHRoZSBwcmV2aW91cyBjYXNlIGlzIG5vdCBjb21tb24sIGFuZCBzaG91bGQgYmUKCSAgICAgIGF2b2lkZWQsIGllLCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIGEgdHlwZWRlZiBhbmQgYQoJICAgICAgdHlwZW1hcCBhdCB0aGUgc2FtZSB0aW1lLCBzcGVjaWFsbHkgaWYgeW91IGFyZSBnb2luZyB0bwoJICAgICAgdXNlIHRlbXBsYXRlcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgLSBEaXJlY3RvcnM6CgoJICAgICAgICB2aXJ0dWFsIGRlc3RydWN0b3IgaXMgYWx3YXlzIGVtaXR0ZWQgbm93LCB0aGlzIGRvZXNuJ3QKCSAgICAgICAgY2F1c2UgYW55IGhhcm0sIGFuZCBjb3VsZCBzb2x2ZSBzb21lIG5hc3R5IGFuZAoJICAgICAgICBteXN0ZXJpb3VzIGVycm9ycywgbGlrZSB0aGUgb25lIG1lbnRpb25lZCBieSBTY290dC4KCgkJYWxzbyB0aGUgZGVzdHJ1Y3RvciBpcyBub3QgaW4tbGluZWQsIHNvLCB0aGF0IGNhbiBzb2x2ZQoJCXNvbWUgb3RoZXIgbXlzdGVyaW91cyBlcnJvcnMgd2hlbiBtaXhpbmcgZGlyZWN0b3JzICsKCQlpbXBvcnRzICsgZW1iZWRkZWQgYXBwbGljYXRpb25zICsgc29tZSBzcGVjaWZpYyBjb21waWxlcnMuCgkJCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUgd2l0aCBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBhZGRlZC4KCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcCBmaXhlcyBpbiBzdGRfc3RyaW5nLmkgZnJvbSBSdXNzZWxsIEtlaXRoLU1hZ2VlLgoKMTAvMjUvMjAwNDogbW1hdHVzIAoKCSAgICAtIFVzaW5nICsgbmFtZXNwYWNlIGlzIHdvcmtpbmcgbm93ICh1c2luZ19uYW1lc3BhY2UuaSkuCgoJICAgIC0gRGVyaXZlZCArIG5lc3RlZCBjbGFzc2VzIGlzIHdvcmtpbmcgbm93CgkgICAgICAoZGVyaXZlcl9uZXN0ZWQuaSksIGJ1dCBvZiBjb3Vyc2UsIHdlIGFyZSBzdGlsbCB3YWl0aW5nCgkgICAgICBmb3IgdGhlIG5lc3RlZCBjbGFzcyBzdXBwb3J0LgoJICAgIAoJICAgIC0gRGlyZWN0b3JzOgoJICAgICAgLSB1bm5hbWVkIHBhcmFtZXRlcnMgc3VwcG9ydCwKCgkgICAgICAtIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBzdXBwb3J0IChhdXRvbWF0aWMgYW5kIHdpdGgKICAgICAgICAgICAgICAgIGRpcnByb3QgbW9kZSksCgoJICAgICAgLSBkZXRlY3Rpb24gb2YgcmVhbGx5IG5lZWRlZCBwcm90ZWN0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAobWVtYmVycyBhbmQgY29uc3RydWN0b3JzKSBub3cgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LgogICAgICAgICAgICAgICAgRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZSAnZGlycHJvdCcgbW9kZSwgc3dpZyB3aWxsCiAgICAgICAgICAgICAgICB3cmFwIHdoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCAoYW5kIHByb3RlY3RlZCkgZm9yIHRoZQogICAgICAgICAgICAgICAgY29kZSB0byBjb21waWxlLgoJCQoJCXdoYXQgaXMgcHVibGljLCBhcyB1c3VhbCwgaXMgYWx3YXlzIHdyYXBwZWQsIGFuZCBpZgoJCXlvdSB1c2UgdGhlICdkaXJwb3J0JwoJCQoKCSAgICAtIEZpbmFsIGZpeGVzIGZvciB0aGUgT1NTIHRvIGNvbXBpbGUgd2l0aCBTV0lHIDEuMy4yMyAobXkKCSAgICAgIHZlcnkgdmVyeSB1Z2x5IEMrKyArIHRlbXBsYXRlcyArIGV2ZXJ5dGhpbmcgbW91bnRlcnMgd3JhcCkuCgoxMC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLWRsbGltcG9ydC4gVGhpcyBlbmFibGVzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBETEwgZm9yIHRoZSBEbGxJbXBvcnQgYXR0cmlidXRlLiBOb3JtYWxseSB0aGlzIG5hbWUKICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgbW9kdWxlIG5hbWUsIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzOgoKICAgICAgICAgICAgICBzd2lnIC1jc2hhcnAgLWRsbGltcG9ydCB4eXogZXhhbXBsZS5pCgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGZvciBhbGwgdGhlIHdyYXBwZWQgUEludm9rZSBtZXRob2RzOgoKICAgICAgICAgICAgICBbRGxsSW1wb3J0KCJ4eXoiLCBFbnRyeVBvaW50PSIuLi4iKV0KICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiAuLi4KCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmcm9tIG1hbnkgZGlmZmVyZW50IFNXSUcgaW52b2NhdGlvbnMgY2FuIHRodXMgYmUgY29tcGlsZWQKICAgICAgICAgICAgaW50byBvbmUgRExMLgoKICAgICAgICAgICAgQSBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkZGxsaW1wb3J0IGNhbiBhbHNvIGJlIHVzZWQgaW4gdHlwZW1hcHMsIHByYWdtYXMsCiAgICAgICAgICAgIGZlYXR1cmVzIGV0Yy4gVGhpcyB3aWxsIGdldCB0cmFuc2xhdGVkIGludG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSAtZGxsaW1wb3J0CiAgICAgICAgICAgIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHRoZSBtb2R1bGUgbmFtZS4KCjEwLzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTA0OTQ5NiBmcm9tIFNjb3R0IE1pY2hlbCBmaXhlcyBkaXJlY3RvcnMgbWV0aG9kcyB3aXRoIAogICAgICAgICAgICBlbnVtcyB3aGVuIHdyYXBwZWQgd2l0aCB0eXBlc2FmZSBvciBwcm9wZXIgSmF2YSBlbnVtcy4KCjEwLzIxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyBpbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgKFB5dGhvbiwgUnVieSwgT2NhbWwpLgoKMTAvMjEvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctY3BsdXNjYXN0JyBvcHRpb24gdG8gZW5hYmxlIHRoZSAnbmV3JwoJICAgICAgQysrIGNhc3Rpbmcgb3BlcmF0b3JzLCBzdWNoIGFzICdzdGF0aWNfY2FzdCcsIGluc2lkZSB0aGUKCSAgICAgIHR5cGVtYXBzLiBCeSBkZWZhdWx0IHN3aWcgdXNlIHRoZSBvbGQgQyBjYXN0IHN0eWxlLCBldmVuCgkgICAgICB3aGVuIHBhcnNpbmcgQysrLgoJICAgICAgCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbmV3X3Z3bScgb3B0aW9uIHRvIGVuYWJsZSB0aGUgbmV3CiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciBtb2RlLiBOb3cgdGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICB0aGF0IHRoZSB0eXBlbWFwcyBhcmUgcmVhbGx5IHNhZmUgZm9yIGFueSBmdXR1cmUKICAgICAgICAgICAgICBzb2x1dGlvbiwgYnV0IHlvdSBjYW4gdXNlIGl0IGlmIHlvdSBoYXZlIGEgdmVyeSBzdHJhbmdlCiAgICAgICAgICAgICAgZXJyb3Igd2l0aCBkZWZhdWx0IGNvc250cnVjdG9ycyBtaXNzaW5nICsgJWFwcGx5ICsKICAgICAgICAgICAgICAldHlwZW1hcCwgYW5kIGlmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlscyAoc2VlCiAgICAgICAgICAgICAgdmFsdXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFsdGVybmF0aXZlIGFuZCBjdXJyZW50CiAgICAgICAgICAgICAgc29sdXRpb25zKS4gSWYgeW91IGFyZSBhIHVzZXIgdGhhdCBkb24ndCBrbm93IHdoYXQgaXMKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBkb24ndCBldmVuIHRyeSBpdC4KCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbm9oJyBvcHRpb24gdG8gYmUgdXNlZCB3aXRoIGRpcmVjdG9ycwoJICAgICAgYW5kIHdoZW4geW91IHByZWZlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQoJICAgICAgZGlyZWN0b3IgaGVhZGVyIGZpbGUuIElmIG5vdCB1c2VkLCBzd2lnIHdpbGwgd29yayBhcwoJICAgICAgdXN1YWwgZ2VuZXJhdGluZyBib3RoIHRoZSB3cmFwLmN4eCBhbmQgd3JhcC5oIGZpbGVzLiBJZgoJICAgICAgeW91IHVzZSBpdCwgc3dpZyB3aWxsIG9ubHkgZ2VuZXJhdGUgd3JhcC5jeHguCgoxMC8yMS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBJZiB5b3UgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRSB3aGVuIGNvbXBpbGluZyBhIHdyYXBwZXIgZmlsZSwKCSAgICAgIHRoZSBydW50aW1lIHR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBnaXZlbiB0eXBlIHRhYmxlIG5hbWUuCgkgICAgICBVc2luZyB0aGlzLCB5b3UgY2FuIHNlcGVyYXRlIGRpZmZlcmVudCBtb2R1bGVzIHRvIHNoYXJlIHRoZWlyCgkgICAgICBvd24gdHlwZSBzeXN0ZW1zLiAgLURTV0lHX1RZUEVfVEFCTEU9TXl0YWJsZQoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19TVEFUSUNfUlVOVElNRSB0aGVuIHRoZSB0eXBlIGluZm9ybWF0aW9uCgkgICAgICB3aWxsIGJlIHN0YXRpYyB0byB0aGlzIHdyYXBwZXIuICBOb3RoaW5nIHdpbGwgYmUgc2hhcmVkIHdpdGggYW55CgkgICAgICBvdGhlciBtb2R1bGVzCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX0xJTktfUlVOVElNRSwgdGhlbiBpbnN0ZWFkIG9mIHVzaW5nCgkgICAgICB0aGUgbmV3IHdheSBvZiBzaGFyaW5nIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB3cmFwcGVyIHdpbGwgZXhwZWN0CgkgICAgICB0byBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgTGliL2xpbmtydW50aW1lLmMgZmlsZS4gIEFueSBtb2R1bGVzIGNvbXBpbGVkCgkgICAgICB3aXRoIFNXSUdfTElOS19SVU5USU1FIGFuZCBsaW5rZWQgYWdhaW5zdCBsaW5rcnVudGltZS5jIHdpbGwgYWxsCgkgICAgICBzaGFyZSB0eXBlIGluZm9ybWF0aW9uLgoKMTAvMjAvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBJbml0aWFsIGZpeCBmb3IgcHl0aG9uL2ltcG9ydCBleGFtcGxlLiBQbGVhc2UKCSAgICAgIHVwZGF0ZSB0aGUgTWFrZWZpbGUgKGF1dG9jb25mLCBjb25maWd1cmUsIGV0YywgZXhwZXJ0KSwKCSAgICAgIHNpbmNlIG5vdyBwcm9iYWJseSBpcyBvbmx5IHdvcmtpbmcgd2l0aCBnKyssIGljYyBhbmQgYQoJICAgICAgZmV3IG90aGVyIGNvbXBpbGVycyB0aGF0IGhhdmUgdGhlIC1zaGFyZWQgb3B0aW9uLgoKCSAgICAgIFdlIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlCgkgICAgICB2aXJ0dWFsIGRlc3RydWN0b3JzLiBPbGQgYW5kIHVzdWFsbHkgZm9yZ290dGVuIEMrKwoJICAgICAgcmVxdWlyZW1lbnQuCgkgICAgICAKCSAgICAgIFNhbWUgZml4IG5lZWQgdG8gYmUgdXNlZCBpbiBwZXJsLCBJIHRoaW5rLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBGaXggZ2VuZXJhdGlvbiBvZiBoZWFkZXIgZmlsZSBmb3IgZGlyZWN0b3JzLAogICAgICAgICAgICAgIG5vdyBkaXJlY3RvcnMuc3dnIGlzIGFsc28gaW5jbHVkZWQsIHNvLCBpdCBjYW4gYmUgcmVhbGx5CgkgICAgICB1c2VkIGZyb20gQysrLCBhbmQgaXQgc29sdmVzIHNvbWUgcHJvYmxlbSB3aXRoIGNvbXBpbGVyCgkgICAgICB0aGF0IHJlcXVpcmUgdGhhdCwgZXZlbiB3aXRoIHRoZSBzaW1wbGUgc3dpZyBpbmNsdXNpb24uICAKCiAgICAgICAgICAgIC0gW1B5dGhvbl0gUmVvcmRlcmluZyB0aGUgbWV0aG9kcyBhbmQgbW92aW5nIHNvbWUgYm9kaWVzCiAgICAgICAgICAgICAgb3V0c2lkZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgaXMgbmVlZGVkIGR1ZSB0bwogICAgICAgICAgICAgIHNvbWUgZ2NjLTIuOTYgaW50ZXJuYWwgY29tcGlsZXIgZXJyb3JzLiBJdCBzZWVtcyB0aGUKICAgICAgICAgICAgICBQWVRIT04gY2xhc3MgaXMgZ2V0dGluZyB0b28gbGFyZ2UgdG8gYmVlbiBkZWNsYXJlZCBhbmQKICAgICAgICAgICAgICBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIC0gQWRkIHRoZSAtb2ggb3B0aW9uIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGhlYWRlciBmaWxlIG5hbWUKICAgICAgICAgICAgICBpZiBuZWVkZWQ6CgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDIC1vaCB0ZXN0LkhICgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG1haW5seSBuZWVkZWQgd2hlbiB1c2luZyBkaXJlY3RvcnMsIGFuZCBpZiB0aGUKICAgICAgICAgICAgICBjdXJyZW50IGRlZmF1bHQgaGVhZGVyIGZpbGUgbmFtZSBpcyBub3QgZ29vZCBmb3IgeW91LAogICAgICAgICAgICAgIHdoaWNoIGlzIGdlbmVyYXRlZCBhcyBmb2xsb3c6CSAgICAgIAoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgICAgICAgICAgICAgPT4gdGVzdF93cmFwLmgKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAgPT4gdGVzdC5oCgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgMSkgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBmZWF0dXJlIGFkZGVkLiBUaGlzIGZlYXR1cmUgYWxsb3dzIG9uZQogICAgICAgICAgICAgIHRvIHVzZSB0aGUgZGVmYXVsdCBhcmd1bWVudCBjb2RlIGdlbmVyYXRpb24gdGhhdCB3YXMgdXNlZCBpbgogICAgICAgICAgICAgIFNXSUctMS4zLjIyIGFuZCBlYXJsaWVyIHZlcnNpb25zLiBJdCBwcm9kdWNlcyBtb3JlIGNvbXBhY3Qgd3JhcHBlcnMKICAgICAgICAgICAgICBhcyBvbmx5IG9uZSB3cmFwcGVyIG1ldGhvZCBpcyBnZW5lcmF0ZWQgZm9yIGFueSBtZXRob2Qgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgICAgYXJndW1lbnRzLiBTbyB0aGUgYWR2YW50YWdlIGlzIGl0IGdlbmVyYXRlcyBsZXNzIGNvZGUgYnV0IGhhcyB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBsaW1pdGF0aW9ucywgbGlrZSBpdCBpdCBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGNhbm5vdCBiZSB0YWtlbiBhZHZhbnRhZ2Ugb2YgaW4gdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgICAgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkuIEl0IGlzIGltcGxlbWVudGVkIHZpYSB0aGUgdXN1YWwgJWZlYXR1cmUgbWVjaGFuaXNtOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKTsKCiAgICAgICAgICAgIDIpIEtleXdvcmQgYXJndW1lbnRzIChrd2FyZ3MpIGFyZSB3b3JraW5nIGFnYWluIGZvciBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBpbiB0aGUgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBpdCwgaWUsIFB5dGhvbiBhbmQgUnVieS4gVGhlIG5ldyBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50IHdyYXBwaW5nIGFwcHJvYWNoIHVzaW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBjYW5ub3Qgc3VwcG9ydCBrd2FyZ3MKICAgICAgICAgICAgICAgc28gdGhlIGNvbXBhY3QgZGVmYXVsdCBhcmd1bWVudCBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4KICAgICAgICAgICAgICAga3dhcmdzIGFyZSBzcGVjaWZpZWQsIGJ5ICVmZWF0dXJlKCJrd2FyZ3MiKS4KCiAgICAgICAgICAgIDMpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgYXJlIGFsc28gYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiB3cmFwcGluZwogICAgICAgICAgICAgICBDIChub3QgQysrKSBjb2RlLiBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlIGJpemFycmUgbm90aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGZvciBDIGNvZGUuCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMgaW4gbmFtZXNwYWNlcyBhbHNvIHdvcmtpbmcgbm93LgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaW4gbmFtZXNwYWNlcyB0b28uCgoxMC8xOS8yMDA0OiBtbWF0dXMKCgkgICAgLSBBbGxvdyB0byBkaXNhYmxlIHRoZSBuZXcgU3dpZ1ZhbHVlV3JhcHBlciBtZWNoYW5pc20sCgkgICAgICBpZiB5b3UgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGxhbmd1YWdlIG1haW4uCgoJCSAvKiBUdXJuIG9uIHNhZmUgdmFsdWUgd3JhcHBlciB1c2UgbW9kZSAqLwogICAgICAgICAgICAgICAgIFN3aWdfdmFsdWVfd3JhcHBlcl9tb2RlKDEpOwoKCSAgICAgIAoJICAgICAgTm93IGlzIG9ubHkgYWN0aXZlIGluIHB5dGhvbi4gQWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICAgIGFyZSB1c2luZyB0aGUgb2xkIHJlc29sdXRpb24sIGJ1dCB0aGV5ICBjYW4gYWxzbyB1c2UgdGhlCgkgICAgICAidmFsdWV3cmFwcGVyIi8ibm92YWx1ZXdyYXBwZXIiIGZlYXR1cmVzIHRvIGZpeCBzb21lCgkgICAgICBvZiB0aGUgb2xkIGJyb2tlbiBjYXNlcy4gTm90ZSwgaG93ZXZlciwgIHRoYXQgbm90IGFsbCAKCSAgICAgIHRoZSBicm9rZW4gY2FzZXMgY2FuIGJlIHNvbHZlZCBpbiB0aGF0IHdheS4KCgkgICAgICBUaGUgbmV3IG1lY2hhbmlzbSBzZWVtcyB0byBiZSB3b3JraW5nIGZpbmUgaW4gcGVybCwgcnVieQoJICAgICAgYW5kIHRjbCwgYnV0IGZhaWxpbmcgaW4gc29tZSB0eXBlbWFwcyBpbiBqYXZhLgoKCSAgICAgIEhlbmNlLCBpcyB1cHRvIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRvIHRlc3QgaXQsIGFuZAoJICAgICAgZGVjaWRlIHRvIGVuYWJsZSBpdCBvciBub3QuCgoJICAgICAgTG9vayBhdCB0aGUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBleGFtcGxlcy4KCgkgICAgLSBGaXggbW9yZSBTd2lnVmFsdWVXcmFwcGVyIGNhc2VzIHdoZW4gdGhlIG5ldyBtZWNoYW5pc20KCSAgICAgIGlzIGFjdGl2ZS4gTm93IGl0IGFsc28gY2hlY2sgZm9yIGxvY2FsIHR5cGVtYXAKCSAgICAgIHZhcmlhYmxlcywgc2VlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgYW4gZXhhbXBsZSB3aGVuCgkgICAgICB0aGlzIGlzIG5lZWRlZC4gQnV0IGFnYWluLCB0aGlzIGV4dHJhIGNoZWNraW5nIHdpbGwgb25seQoJICAgICAgYmUgYWN0aXZhdGVkIHdoZW4gdXNpbmcgdGhlIG5ldyB2YWx1ZSB3cmFwcGVyIG1vZGUuCgoJICAgIC0gW1B5dGhvbl0gRml4IHZhcmlhYmxlIHdyYXBwaW5nIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlCgkgICAgICBhc3NpZ24gb3BlcmF0b3JzLiBJdCBzaG91bGQgYmUgZWFzeSB0byBmaXggaW4gYWxsIHRoZSAKCSAgICAgIG90aGVyIG1vZHVsZXMsIGluc3RlYWQgb2YgY2hlY2tpbmcKCgkgICAgICAgICBpZiAoIUdldGF0dHIobiwiaW1tdXRhYmxlIikpIC4uLgoJCgkgICAgICB5b3UgbmVlZCB0byB2ZXJpZnkKCgkgICAgICAgICBpZiAoaXNfYXNzaWduYWJsZShuKSkgLi4uCgoJICAgICAgTG9vayBhdCB0aGUgcHJpdmF0ZV9hc3NpZ24uaSBmb3IgYW4gZXhhbXBsZS4KCjEwLzE4LzIwMDQ6IG1tYXR1cwoJICAgIC0gJWZlYXR1cmVzICJkaXJlY3RvciIvIm5vZGlyZWN0b3IiIG5vdyB3b3JrIGFzIGV4cGVjdGVkLgogICAgICAgICAgICAtIEdlbmVyYWwgZml4ZXMgaW4gJWZlYXR1cmUgdG8gcmVzb2x2ZSBmdW5jdGlvbiBkZWNsCgkgICAgICBwcm9wZXJseSwKCSAgICAgIAoJICAgICAgICAlZmVhdHVyZSgiaGVsbG8iKSBmb28oKTsKCSAgICAgICAgY2hhciBmb28oKSAtPiAgZigpICAgIC8vIHdhcyB3b3JraW5nCgkgICAgICAgIGNoYXIgKmZvbygpIC0+IGYoKS5wICAvLyBpdCB3YXNuJ3QKIAoKICAgICAgICAgICAgLSBUZW1wbGF0ZSArIHNwZWNpYWxpemF0aW9uICsgZGVmYXVsdCB0ZW1wbGF0ZSBhcmdzIG5vdyBpcwoJICAgICAgd29ya2luZywgKGRvbid0IGNvbmZ1c2Ugd2l0aCB0ZW1wbGF0ZSArIGRlZmF1bHQgYXJnCgkgICAgICB2YWx1ZXMsIHRoYXQgd2FzIHNvbHZlZCBiZWZvcmUpLCBub3cgdGhpcyB1Z2x5IGNhc2UgaXMKCSAgICAgIHdvcmtpbmc6CgoJICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQSA9IEFsbG9jPFQ+ID4KCQlzdHJ1Y3QgVmVjdG9yCgkJewoJCSAgIFZlY3RvcihUIGEpe30KCQl9OwkJICAgCgoJCXRlbXBsYXRlIDw+CgkJc3RydWN0IFZlY3Rvcjxkb3VibGU+CgkJewoJCSAgVmVjdG9yKCl7fQoJCSAgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAldGVtcGxhdGUoVl9jKSBWZWN0b3I8Y2hhciwgQWxsb2M8Y2hhcj4gPjsKCSAgICAgICAgJXRlbXBsYXRlKFZfaSkgVmVjdG9yPGludD47ICAgIC8vIHBpY2tzIFZlY3RvcjxpbnQsQWxsb2M8aW50PiA+CgkgICAgICAgICV0ZW1wbGF0ZShWX2QpIFZlY3Rvcjxkb3VibGU+OyAvLyBwaWNrcyB0aGUgc3BlY2lhbGl6YXRpb24KCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgU1RMIHN1cHBvcnQgKGxhdGVyIHdpbGwKICAgICAgICAgICAgICBiZSkuCgoJICAgIC0gRml4IHRoZSB0ZW1wbGF0ZSArIHR5cGVkZWYgZXJyb3JzIGluIHRlc3Qtc3VpdGUsIHdoaWNoCiAgICAgICAgICAgICAgcHJvYmFibHkgd2lsbCBmaXggYW5vdGhlciBncm91cCBvZiBzdHJhbmdlIHRlbXBsYXRlICsKICAgICAgICAgICAgICBuYW1lc3BhY2VzICsgdHlwZWRlZnMgZXJyb3JzLgoKCSAgICAtICV3YXJuZmlsdGVyIGlzIHdvcmtpbmcgYmV0dGVyIG5vdywgcGFyc2VyLnkgdHJpZXMgdG8gdXNlCgkgICAgICB0aGVtIHdoZW4gbmVlZGVkLgoKCSAgICAtICoqKiogTmV3IGRlZmF1bHQgdHlwZSByZXNvbHV0aW9uIG1ldGhvZCAoc3R5cGUuYykgKioqKiogCgoJICAgICAgSXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBtaXhlZCB0eXBlcywgdGhlbiBpdCBnb2VzCgkgICAgICAnYmFja3dhcmQnIGZpcnN0IGRlbGV0aW5nIHRoZSBxdWFsaWZpZXIsIHRoZW4gdGhlIGlubmVyCgkgICAgICB0eXBlcywgZm9yIGV4YW1wbGU6CiAgICAJCSAJCQkJCQkJICAKICAgIAkJIHR5cGVkZWYgQSAqQXB0cjsJCQkJICAKICAgIAkJIGNvbnN0IEFwdHImOwkJCQkJCQogICAgCQkgci5xKGNvbnN0KS5BcHRyICAgICAgIC0+IHIucShjb25zdCkucC5TV0lHVFlQRQkJCiAgICAJCSByLnEoY29uc3QpLnAuU1dJR1RZUEUgLT4gci5wLlNXSUdUWVBFCQkJCiAgICAJCSByLnAuU1dJR1RZUEUgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGVudW0gSGVsbG8ge307CQkJCQkJCiAgICAJCSBjb25zdCBIZWxsbyYgaGk7CQkJCQkKICAgIAkJIHIucShjb25zdCkuSGVsbG8gICAgICAgICAgLT4gci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFCQogICAgCQkgci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFICAtPiByLmVudW0gU1dJR1RZUEUJCQogICAgCQkgci5lbnVtIFNXSUdUWVBFICAgICAgICAgICAtPiByLlNXSUdUWVBFCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgaW50IGFbMl1bNF07CQkJCQkJCiAgICAJCSBhKDIpLmEoNCkuaW50ICAgICAgICAgICAtPiBhKEFOWSkuYShBTlkpLlNXSUdUWVBFCQogICAgCQkgYShBTlkpLmEoQU5ZKS5TV0lHVFlQRSAgLT4gYShBTlkpLmEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuYSgpLlNXSUdUWVBFICAgICAtPiBhKEFOWSkucC5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkucC5TV0lHVFlQRSAgICAgICAtPiBhKEFOWSkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLlNXSUdUWVBFICAgICAgICAgLT4gYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoKS5TV0lHVFlQRSAgICAgICAgICAgIC0+IHAuU1dJR1RZUEUJCQkKICAgIAkJIHAuU1dJR1RZUEUgICAgICAgICAgICAgIC0+IFNXSUdUWVBFICAgICAgICAgICAgICAgICAgICAKCgkgICAgICBiZWZvcmUgaXQgYWx3YXlzIHN0b3BzIGFmdGVyIGZpbmRpbmcgcmVmL3BvaW50ZXIvZW51bS9hcnJheS9ldGMuCgkgICAgICAgCgkgICAgICBOb3csIHRoZW4sIHlvdSBjYW4gZGVmaW5lICh1c2UgYW5kIGFwcGx5KSAnaGlnaGVyJyB0eXBlbWFwcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAob3V0KSBjaGFyIEZJWFNJWkVbQU5ZXQogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgZW51bSBTV0lHVFlQRSYKCSAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFW0FOWV1bQU5ZXQoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAoJilbQU5ZXQoJICAgICAgIAoJICAgICAgSXQgaXMgcG9zc2libGUgd2l0aCB0aGlzIGNoYW5nZSB0aGF0IHByZXZpb3VzIHR5cGVtYXBzCgkgICAgICB0aGF0IHdlcmUgZGVmaW5lZCAoYnV0IGlnbm9yZWQpLCBub3cgd2lsbCBzdGFydCB0byB3b3JrLgoKCSAgICAgIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSBjaGVjayBmb3IgdGhlICcldHlwZW1hcCh2YXJpbikgU1dJR1RZUEVbXScsCgkgICAgICBiZWZvcmUgaXQgd2FzIHVzdWFsbHkgbm90IGRlZmluZWQgKGJ1dCBjaGFyW10gd2FzKSwKCSAgICAgIGFuZCB0aGF0IGNhbiBwcm9kdWNlIHNvbWUgaW5jb25zaXN0ZW5jaWVzLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICAgIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgZm9yIFNUTCwgc2luY2Ugc3RkOjp2ZWN0b3I8ZW51bSBIZWxsbz4gCgkgICAgICBzdGQ6OnZlY3RvcjxBKj4sIGV0Yywgd2lsbCBhbHdheXMgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0CgkgICAgICBtaXggY29uc3QgcmVmZXJlbmNlcyB3aXRoIHRoZSB2ZWN0b3IgdHlwZS4KCgkgICAgICBOb3cgdGhhdCBpcyB3b3JraW5nLCBhbGwgdGhlIHN0ZDo6Y29udGFpbmVyPFQqPgoJICAgICAgc3BlY2lhbGl6YXRpb24gd2lsbCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIHdlbGwsIGluCgkgICAgICB0aGVvcnkuIAoKCSAgICAgIEluIHRoZSBwcmFjdGljZSwgZXZlcnl0aGluIGlzIHdvcmtpbmcgYXMgYmVmb3JlIHVudGlsCgkgICAgICB0aGUgcHJvcGVyIG1peGVkIHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB0aGUgbGlicmFyaWVzCgkgICAgICBzaW1wbGlmaWVkIHRvIHVzZSB0aGVtLgoKCSAgICAtIENoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXh0ZXJuICJqYXZhIi8iZm9ydHJhbiIvImV0YyIsIAoJICAgICAgbm93IHN3aWcgcHJvZHVjZXMgYSB3YXJuaW5nLCBhbmQgdXNlIGV4dGVybiAiQyIgaW5zdGVhZC4KCSAgICAgIFRoZSB3YXJuaW5nIGNhbiBhbHNvIGJlIGRpc2FibGUgd2l0aCB0aGUgIi13IDMxMyIgZmxhZy4KCSAgICAgIChXQVJOX1BBUlNFX1VOREVGSU5FRF9FWFRFUk4pLgoKCSAgICAtIFN3aWdWYWx1ZVdyYXBwZXIgaXMgbm93IG1vcmUgc2VsZWN0aXZlIChsYW5nLmN4eCkuCgogICAgICAgICAgICBbUGVybC9UY2xdCgkgICAgLSBGaXggc29tZSB0eXBlbWFwcyAocGVybC90Y2wpIHRvIHdvcmsgcHJvcGVybHkgd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlci4gVGhpcyB3YXMgbm90IGEgcHJvYmxlbSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBidXQgd2l0aCB0aGUgdHlwZW1hcHMgdGhhdCBub3cgYXJlCgkgICAgICBzYWZlIHRvIHVzZSB3aXRoICVhcHBseS4KCgkgICAgW1B5dGhvbl0KCiAgICAgICAgICAgIC0gRml4ICVjYWxsYmFjay8lcHl0aG9uY2FsbGJhY2sgd29yayBub3cgYXMgYmVmb3JlIGFmdGVyCgkgICAgICB0aGUgZGVmIGFyZ3MgY2hhbmdlcy4gQWxzbywgJWNhbGxiYWNrIG5vdyBpcyBhbiBhbGlhcwoJICAgICAgZm9yICVweXRob25jYWxsYmFjaywgc28sIHRoZXkgZG8gdGhlIHNhbWUuCgoJICAgIFtQeXRob24vUnVieV0KCSAgICAtICVjYWxsYmFjayBpcyBtb3JlIHVzYWJsZSBhbmQgdW5pZm9ybToKCiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpIGZvbygpOyAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpOyAgICAgICAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKDEpIGZvbygpOyAgICAgICAgLy8gb25seSBpbiBweXRob24uCgoxMC8xNy8yMDA0OiBhcnR5CgkgICAgW09DQU1MXQoJICAgIC0gVHdlYWsgdG8gZW51bSB0eXBpbmcgZm9yIHNvdW5kbmVzcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUKCSAgICAgIG1vZHVsZXMuCgkgICAgLSBnbG9iYWwgZnVuY3Rpb25zIGFyZSBub3cgdW5hbWJpZ3VvdXMgaW4gbXVsdGlwbGUgbG9hZGVkIG1vZHVsZXMuCgkgICAgLSBGaXhlZCB0ZXN0IGNhc2UgY29kZSB0byBidWlsZCBtdWx0aW1vZHVsZSB0ZXN0IGNhc2VzIGNvcnJlY3RseS4KCSAgICAtIFRoZXJlIGlzIG5vIHdheSB0byBzaGFyZSBvdmVybG9hZCByZXNvbHV0aW9uIGFjcm9zcyBtb2R1bGVzCgkgICAgICBiZWNhdXNlIG9mIHNvdW5kbmVzcyBpc3N1ZXMuICBJZiB0aGUgdXNlciB3YW50cyB0byBjYWxsIHNvbWUKCSAgICAgIGZ1bmN0aW9uIGZvbyBmcm9tIGFuIGFyYml0cmFyeSBtb2R1bGUgYmFyLCB0aGV5IHdpbGwgaGF2ZSB0bwoJICAgICAgdXNlIEJhci5fZm9vIHRvIGNhbGwgaXQgY29ycmVjdGx5LiAgTGF0ZXIgSSB3aWxsIGZpeCB0aGUgCgkgICAgICBjYW1scDQgbW9kdWxlIHRvIGRvIHNvbWV0aGluZyBjbGV2ZXIgaW4gdGhpcyBjYXNlLiAgCiAgICAgICAgICAgIC0gUHJvbWlkZWQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb2YgY2xhc3MgbWVjaGFuaXNtLgoJICAgIC0gUmVtb3ZlZCBzeW1ib2wgaGFjayBmb3Igb2NhbWwtMy4wNyBhbmQgYmVsb3cgd2hpY2ggaXMgbm90IG5lZWRlZAoJICAgICAgZm9yIG9jYW1sLTMuMDggYW5kIGFib3ZlLgoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDSElDS0VOXQoJICAgIC0gQ29tcGxldGx5IGNoYW5nZSBob3cgY2hpY2tlbi5jeHggaGFuZGxlcyBDTE9TIGFuZCBnZW5lcmljIGNvZGUuCgkgICAgICBjaGlja2VuIG5vIGxvbmdlciBleHBvcnRzIC1jbG9zLnNjbSBhbmQgLWdlbmVyaWMuc2NtLiAgVGhlIGNsb3MKCSAgICAgIGNvZGUgaXMgZXhwb3J0ZWQgZGlyZWN0bHkgaW50byB0aGUgbW9kdWxlLnNjbSBmaWxlIGlmIC1wcm94eSBpcyBwYXNzZWQuCgkgICAgLSBUaGUgY29kZSBub3cgYWx3YXlzIGV4cG9ydHMgYSB1bml0LiAgUnVubmluZyB0aGUgdGVzdC1zdWl0ZSBpcyBub3cKCSAgICAgIG1ham9ybHkgYnJva2VuLCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQuCgkgICAgLSBDTE9TIG5vdyBnZW5lcmF0ZXMgdmlydHVhbCBzbG90cyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzaW1pbGFyIHRvIGhvdwoJICAgICAgR09PUFMgc3VwcG9ydCB3b3JrcyBpbiB0aGUgZ3VpbGUgbW9kdWxlLgoJICAgIC0gY2hpY2tlbiBubyBsb25nZXIgcHJlZml4ZXMgc3ltYm9scyBieSB0aGUgbW9kdWxlIG5hbWUsIGFuZCBubyBsb25nZXIKCSAgICAgIGZvcmNlcyBhbGwgbmFtZXMgdG8gbG93ZXIgY2FzZS4gIEl0IG5vdyBoYXMgLXVzZWNsYXNzcHJlZml4IGFuZCAtY2xvc3ByZWZpeAoJICAgICAgc2ltaWxhciB0byBob3cgZ3VpbGUgaGFuZGxlcyBHT09QUyBuYW1lcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB3b3JraW5nIHdpdGggbmV3IGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgd3JhcHBpbmcgYXBwcm9hY2guIFRoZSBuZXcgYXBwcm9hY2ggbm8gbG9uZ2VyIGZhaWxzIHdpdGggdGhlIGZvbGxvd2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50IHBhdHRlcm4gKHByZXZpb3VzbHkgZmFpbGVkIHdpdGggc29tZSBwcmltaXRpdmUgdHlwZXMsIGxpa2UgCiAgICAgICAgICAgIHVuc2lnbmVkIHByaW1pdGl2ZSB0eXBlcyk6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBmb28oY29uc3QgVCYgdSA9IFQoKSk7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPHVuc2lnbmVkIGludD47CgogICAgICAgICAgICBUaGlzIHJlbGllcyBvbiB0aGUgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHN1cHBvcnQganVzdCBhZGRlZCwgc28gYWxsCiAgICAgICAgICAgIHRoZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgbm9ybWFsIHBhcmFtZXRlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBvdmVybG9hZGluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyB3b3Jrcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXJnZSByYW5nZSBvZiB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgdGhhdCBDKysKICAgICAgICAgICAgc3VwcG9ydHMuCgogICAgICAgICAgICAtIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucywgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCwgY29uc3QgVCAmcik7CgogICAgICAgICAgICAtIEZpeGVzIHdoZXJlIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpcyBub3QgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgeHl6KCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIHh5ejxkb3VibGU+KCk7CgogICAgICAgICAgICAtIEZpeGVzIGZvciBvdmVybG9hZGluZyBvZiBwbGFpbiBmdW5jdGlvbnMgYnkgYSB0ZW1wbGF0ZWQgZnVuY3Rpb246CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwoKICAgICAgICAgICAgLSBPdmVybG9hZGluZyBieSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyBmaXhlZDoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmb28oVCB0KSB7fQogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHZvaWQgZm9vKFQgdCwgVSB1KSB7fQoKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288ZG91YmxlLCBkb3VibGU+OwoKICAgICAgICAgICAgLSBBbGwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBhbHNvIHdvcmtpbmcgaW5jbHVkaW5nIHNwZWNpYWxpemF0aW9ucywgZWc6CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmM8ZG91YmxlPihkb3VibGUgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYyhpbnQgdCk7CgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW1vdmUgdGhlIGFiaWxpdHkgdG8gc2hhcmUgdHlwZSBpbmZvcm1hdGlvbiBieSB1c2luZyBjIGxpbmtpbmcuCiAgICAgICAgICAgICAgQWxsIHR5cGUgc2hhcmluZyBoYXBwZW5zIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgICAgICsgUmVtb3ZlIFNXSUdfTk9JTVBPUlQsIFNXSUdfUlVOVElNRSwgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KICAgICAgICAgICAgICAgICsgRGVwcmVjYXRlIC1ydW50aW1lLCAtbm9ydW50aW1lIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0ZXN0LXN1aXRlIGNvbW1vbi5tayB0byBjb3JyZWN0bHkgYnVpbGQgbXVsdGljcHB0ZXN0CiAgICAgICAgICAgICAgICArIFJlbW92ZSByZWZlcmVuY2UgdG8gcHJlY29tbW9uLnN3ZwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGhlIGd1aWxlX2doIGludGVyZmFjZSB0byBzaGFyZSBkYXRhIGJ5IGEgZ2xvYmFsIHZhciBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgIG9mIGMgbGlua2FnZS4KCiAgICAgICAgICAgIC0gUmVtb3ZlIEFkdmFuY2VkLmh0bWwsIHNpbmNlIGV2ZXJ5dGhpbmcgaW4gaXQgaXMgbm93IG9ic29sZXRlCgoxMC8wOS8yMDA0OiBtbWF0dXMKCSAgICAtIFNwbGl0IHRoZSBweXRob24gc3RkL1NUTCBDKysgbGlicmFyeSBmaWxlcywgbm93CgkgICAgICBhbGwgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IGRlZmluaXRpb25zIGFyZSB1bmRlcgoJICAgICAgdGhlIGRpcmVjdG9yeQoJICAgICAgCgkJTGliL3N0ZAoKCSAgICAgIGFuZCBoZW5jZSwgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMuCgoJICAgIC0gQWRkIG1vcmUgZG9jdW1lbnRhdGlvbiB0byB0aGUgUHl0aG9uIFNUTCwgYW5kCgkgICAgICBjbGVhbiB1bm5lY2Vzc2FyeSBjb2RlLgoKCSAgICAtIEFkZCBpbml0aWFsIEM5OSBjb21wbGV4IHN1cHBvcnQsIGFuZCBzb21lIGZpeGVzCgkgICAgICBmb3IgbG9uZyBkb3VibGUuCgoxMC8wOC8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciBmb3Igb3BhcXVlIHR5cGVzLCBub3cgaXQgaXMgCgkgICAgICBhcHBsaWVkIGZvciBvcGFxdWUgdGVtcGxhdGVzIGFuZCBjbGFzc2VzLCBmb3Igd2hpY2ggd2UKCSAgICAgIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgb3Igbm90IGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgaWUKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoaW50KTsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgU3RpbGwsIGlmIHlvdSBrbm93IHRoYXQgeW91IGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYW5kIGZvciBzb21lIHZlcnkgdmVyeSBwYXJ0aWN1bGFyIHJlYXNvbgogICAgICAgICAgICAgIHlvdSB3YW50IHRvIGF2b2lkIHRoZSBTd2lnVmFsdWVXcmFwcGVyLCBhbmQgeW91IGRvbid0CiAgICAgICAgICAgICAgd2FudCBvciBjYW4ndCBleHBvc2UgdGhlIGNsYXNzIHRvIHN3aWcsIG5vdyB5b3UgY2FuCiAgICAgICAgICAgICAgc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3ZhbHVld3JhcHBlciIpIEE7ICAgIAogICAgICAgICAgICAgICAgIGNsYXNzIEE7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB0aGUgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBidXQgeW91IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSB3cmFwcGVyLCB5b3UKICAgICAgICAgICAgICBjYW4gc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ2YWx1ZXdyYXBwZXIiKSBBOwogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKCk7CgkJICAgLi4uLgogICAgICAgICAgICAgICAgIH07ICAgCiAgICAgIAoJICAgIC0gRml4IGZvciBjaGFyID4gMTI4LCBpZQoKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdGlsZGVfYSA9ICdcMzQxJzsKCiAgICAgICAgICAgIC0gQWRkIHBhdGNoIDEwNDE4NTggZm9yICRsZXh0eXBlLCB3aGljaCBjYXJyaWVzIHRoZSAKICAgICAgICAgICAgICBsaXRlcmFsIHR5cGUgb2YgYSBzeW1ib2wuIFNlZSBsZXh0eXBlLmkgaW4gdGhlCiAgICAgICAgICAgICAgdGVzdC1zdWl0ZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCgoxMC8wNy8yMDA0OiB3c2Z1bHRvbgoJICAgIHtSdWJ5LCBKYXZhXSBGaXggZGlyZWN0b3IgKyAnZW1wdHknIHRocm93cwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIEEoKSB0aHJvdygpOwoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICAgIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoKCjEwLzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbVENMXQogICAgICAgICAgICAtIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsbGlhbSBBLiBIb2ZmbWFuIHByb3BhZ2F0aW5nIGNsaWVudGRhdGEKICAgICAgICAgICAgYmV0d2VlbiBtb2R1bGVzLiAgQWRkZWQgY2xpZW50ZGF0YV9wcm9wLm11bHRpY3BwdGVzdCB0byBjaGVjayBmb3IKICAgICAgICAgICAgdGhpcyBidWcuICBUaGUgZml4IGludm9sdmVkIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAgICsgU3dpZ1R5cGVfY2xpZW50ZGF0YV9jb2xsZWN0IGRvZXMgbm90IG5lZWQgdG8gY2hlY2sKICAgICAgICAgICAgICAgIHR5cGVzIGluIHJfcmVzb2x2ZWQgYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gcHJvcGFnYXRlIGNsaWVudGRhdGEKICAgICAgICAgICAgICAgIHRvIHR5cGVkZWZlZCBjbGFzc2VzLCBhbmQgcl9tYW5nbGVkIGFscmVhZHkgdGFrZXMgY2FyZSBvZiB0eXBlZGVmcy4KCiAgICAgICAgICAgICAgICArIFNXSUdfVHlwZVJlZ2lzdGVyIG5vdyBjb3BpZXMgdGhlIGNsaWVudGRhdGEgZmllbGQgY29ycmVjdGx5CgogICAgICAgICAgICAgICAgKyBNb3ZlIFNXSUdfR3VpbGVfUHJvcGFnYXRlQ2xpZW50RGF0YSBmdW5jdGlvbiBmcm9tIGd1aWxlIG1vZHVsZQogICAgICAgICAgICAgICAgaW50byBjb21tb24uc3dnLCBiZWNhdXNlIHdlIG5lZWQgdG8gY2FsbCBpdCBmcm9tIGJvdGggZ3VpbGUgYW5kIHRjbC4KCiAgICAgICAgICAgICAgICArIEFkZCBiYXNlX25hbWVzIHRvIHN3aWdfY2xhc3MgdG8gZGVsYXkgdGhlIGxvb2t1cCBvZiBiYXNlcy4gIFNXSUcKICAgICAgICAgICAgICAgIG5vdyBleHBvcnRzIHRoZSBiYXNlIG5hbWVzIGFuZCBvbmx5IHdoZW4gdGhlIGJhc2Ugc3dpZ19jbGFzcyBpcwogICAgICAgICAgICAgICAgbmVlZGVkIGlzIFNXSUdfVHlwZVF1ZXJ5KG5hbWUpLT5jbGllbnRkYXRhIGxvb2tlZCB1cC4KCiAgICAgICAgICAgIC0gY29udmVyc2lvbl9uc190ZW1wbGF0ZSB0ZXN0c3VpdGUgdGVzdCB3YXMgZmFpbGluZyBiZWNhdXNlCiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdhcyBub3QgY2FsY3VsYXRlZAogICAgICAgICAgICBjb3JyZWN0bHkgZm9yIHN0cnVjdHMuICBGaXhlZC4KCjEwLzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyB1c2VkIGluIGRpcmVjdG9ycyAtIGluIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcyBhbmQgZGlyZWN0b3IgY29uc3RydWN0b3JzLgoKMTAvMDYvMjAwNDogbW1hdHVzCgkgICAgRml4IHRoZSBfX2NwbHVzcGx1cyBtYWNybywgYW5kIGJ1ZyAxMDQxMTcwLgoJICAgIE5vdyBpdCBpcyB3b3JraW5nIGFzIHN1cHBvc2VkLCBpZSwgeW91IGNhbiBzYWZlbHkgdXNlCgoJICAgICAgI2lmZGVmIF9fY3BsdXNwbHVzCgkgICAgICAuLi4KCSAgICAKCSAgICBhbGwgb3ZlciBzd2lnLCBpbmNsdWRpbmcgaW5zaWRlICVkZWZpbmVzIGFuZCAleyAlfSBib2RpZXMuCgoJICAgIAogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZSBvbGQgdHJpY2sgb2YgdXNpbmcKCgkgICAgICAjaWYgX19jcGx1c3BsdXMKCgkgICAgZG9lc24ndCB3b3JrIGFueSBtb3JlLiBTbywgaWYgeW91IGhhdmUgeW91ciBvd24gdHlwZW1hcHMKCSAgICB1c2luZyB0aGF0IHN5bnRheCwgeW91IHdpbGwgbmVlZCB0byBtaWdyYXRlIHRoZW0gdG8gdXNlCgkgICAgIiNpZmRlZiBfX2NwbHVzcGx1cyIuCgoxMC8wNS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW9yZ2FuaXplIGhvdyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGFuZCBzaGFyZWQKCSAgICBiZXR3ZWVuIG1vZHVsZXMuICBGb3IgY2hpY2tlbiBhbmQgbXpzY2hlbWUsIEkgcmVtb3ZlZAoJICAgIHRoZSBhYmlsaXR5IHRvIHVzZSBydW50aW1lIGxpYnJhcmllcywgd2hpbGUgcGVybCwgdGNsLCBweXRob24sIGFuZAoJICAgIHJ1YnkgZGVmYXVsdCB0byB1c2luZyB0aGUgbmV3IG1ldGhvZCBidXQgY2FuIGdvIGJhY2sgdG8gdGhlIG9sZAoJICAgIG1ldGhvZCBieSBkZWNsYXJpbmcgU1dJR19BTExPV19SVU5USU1FLgoKCSAgICAtIGxpbmUgNTgyIGluIG16c2NoZW1lLmN4eCB3YXMgZ2VuZXJhdGluZyBhIHNlZ2ZhdWx0IG9uIAoJICAgIGltcG9ydHMubXVsdGljcHB0ZXN0LCBzbyBJIGZpeGVkIGl0LgoKMTAvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yICVleHRlbmQgYW5kIG92ZXJsb2FkZWQgc3RhdGljIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cy4KCjEwLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gW3B5dGhvbl0gRml4IGRpcmVjdG9yICsgbWV0aG9kIHdpdGggJ2VtcHR5JyB0aHJvdywgaWUKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoJCSAgICAKCSAgICAgIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgYWxzbyBlYXN5IHRvIGZpeCwgbG9vayBmb3IKCSAgICAgIEdldGF0dHIobiwidGhyb3ciKSBpbiBweXRob24uY3h4LgoKCSAgICAtIEZpeCBkaXJlY3RvciArIGRlc3RydWN0b3Igd2l0aCAnZW1wdHknIHRocm93CgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgIH07CgoJICAgIC0gTm93IFNXSUdfRkVBVFVSRVMgcGFyc2UgYWxsIGFuZCB0aGUgc2FtZSAgb3B0aW9ucyB5b3UKICAgICAgICAgICAgICBjYW4gcGFzcyB0byBzd2lnIGluIHRoZSBjb21tYW5kIGxpbmUuCgkgICAgICAKCSAgICAtIE5ldyBjb21tYW5kIGxpbmUgZmxhZzogLWZlYXR1cmVzIDxsaXN0PiwgYXMgaW4KCgkgICAgICAgIHN3aWcgLWZlYXR1cmVzIGF1dG9kb2M9MyxkaXJlY3RvcgoKCSAgICAgIGllLCBhbnkgZ2xvYmFsIGZlYXR1cmUgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gdGhlCgkgICAgICBjb21tYW5kIGxpbmUuIFRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nLCBidXQgdXNlcnMKCSAgICAgIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIGl0LgoKMTAvMDQvMjAwNDogbW1hdHVzCgkgICAgLSBQcm9wZXJseSBxdWFsaWZ5IHR5cGUgaW4gc3ludGF4IGFzICdsb25nKDIpJyBvciAnRm9vKCknLAoJICAgICAgdGhpcyBzb2x2ZSBvbGQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJncywgYW5kIHByb2JhYmx5CgkgICAgICBvdGhlciBwcm9ibGVtcyBhcm91bmQuIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IGFyZyBwcm9ibGVtCgkgICAgICB3YXMgYWxzbyBhbHJlYWR5IHNvbHZlZCBieSBXaWxsaWFtIChzZWUgYmVsb3cpLgoKCSAgICAtIEZpeCBmZWF0dXJlX3NldCBhbmQgZmVhdHVyZV9nZXQgbWV0aG9kcy4gQmVmb3JlCgkgICAgICB0aGV5IGxvb2sgZnJvbSBwYXJ0aWN1bGFyIHRvIGdlbmVyYWwgYW5kIGtlZXAgdGhlIGZpcnN0CgkgICAgICBmZWF0dXJlIGZvdW5kLiBUaGlzIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0ZW1wbGF0ZXMuCgkgICAgICBOb3cgdGhlIG1ldGhvZHMgbG9vayBmcm9tIGdlbmVyYWwgdG8gcGFydGljdWxhciwgYW5kCgkgICAgICBvdmVycmlkZSBhbnkgZm91bmQgZmVhdHVyZS4KCiAgICAgICAgICAgIC0gUHJldmlvdXNseSBhIGZlYXR1cmUgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY29uc3RydWN0b3JzCiAgICAgICAgICAgICAgb3IgZGVzdHJ1Y3RvcnMgdGhhdCB3ZXJlbid0IGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSBGb28oKSAiLi4uIgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgfkZvbygpICIuLi4iCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBGb28oKSBhbmQgfkZvbygpCiAgICAgICAgICAgICAgICB9OwoKCSAgICAtIEZpeCBtaXNzaW5nIGZlYXR1cmVzIGZvciBkZWZhdWx0IGNvbnN0L2Rlc3QsIGJ5IHJlYWxseQoJICAgICAgJ2NyZWF0aW5nJyB0aGUgbWV0aG9kcyBhbmQgYXBwbHlpbmcgdGhlIGZlYXR1cmVzLgoKCSAgICAtIEZpeCByZXR1cm5fY29uc3RfdmFsdWUuaSBjYXNlIGJ5IGFkZGluZyBTd2lnVmFsdWVXcmFwcGVyPGNvbnN0IFQ+CgkgICAgICBzcGVjaWFsaXphdGlvbi4KCgkgICAgLSBGaXggJWV4dGVuZCArIG92ZXJsb2FkLCBpbmNsdWRpbmcgb3ZlcmxvYWRpbmcgYWN0dWFsCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcy4gCgoJICAgIC0gQWRkaW5nIG1vcmUgY2FzZXMgaW4gcmVsYXRlZCBmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZS4gIAoKMTAvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgd2F5IGRlZmF1bHQgYXJndW1lbnRzIGFyZSB3cmFwcGVkLiBQcmV2aW91c2x5IGEgc2luZ2xlCiAgICAgICAgICAgIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBlYWNoIG1ldGhvZCB0aGF0IGhhZCBkZWZhdWx0IGFyZ3VtZW50cy4gSWYKICAgICAgICAgICAgYSBtZXRob2QgaGFkIDUgYXJndW1lbnRzLCBzYXksIG9mIHdoaWNoIDEgaGFkIGEgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB0aGVuIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCB3b3VsZCBwYXNzIDUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICB2YWx1ZSB3YXMgY29waWVkIGludG8gdGhlIHdyYXBwZXIgbWV0aG9kIGFuZCB1c2VkIGlmIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgcGFzc2VkIGp1c3QgNCBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoaXMgd2FzIGZsYXdlZCBhcyB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudCBzb21ldGltZXMgZG9lcyBub3QgaGF2ZSBnbG9iYWwgYWNjZXNzLCBmb3IgZXhhbXBsZQogICAgICAgICAgICBTV0lHIHdvdWxkIGdlbmVyYXRlIGNvZGUgdGhhdCBjb3VsZG4ndCBjb21waWxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNsYXNzIFRyaWNreSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCA9IHByaXZhdGV2YWx1ZSk7CiAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgdmFsID0gVHJpY2t5OjpnZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGVudW0geyBwcml2YXRldmFsdWUgPSAyMDAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBidWdzIGluIHJlc29sdmluZyBzeW1ib2xzIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgKHByb2JhYmx5IGZpeGFibGUgdGhvdWdoKToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBLbGFzcyBjb25zdHJ1Y3RvcmNhbGwoY29uc3QgS2xhc3MmIGsgPSBLbGFzcygpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgYXBwcm9hY2ggYWxzbyBkb2VzIG5vdCB3b3JrIGZvciBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpCiAgICAgICAgICAgIGFzIHRoZXNlIGxhbmd1YWdlcyBkbyBub3QgYWxsb3cgbWV0aG9kcyB0byBoYXZlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgICAgICAgIEFsdGhvdWdoIEMjIGhhcyBhIG1lY2hhbmlzbSB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5CiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXJlIG1vcmUgbGlrZSB2YXJhcmdzLgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBzb2x2ZXMgdGhlIGFib3ZlIHByb2JsZW1zIGFuZCB3cmFwcyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZC4gU28gU1dJRyB3aWxsIG5vdyB0cmVhdAoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYXMgaWYgaXQgaGFkIHBhcnNlZDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICB2b2lkIGZvbygpOwoKICAgICAgICAgICAgVGhlIGNvZGUgZ2VuZXJhdGVkIGlzIHRoZW4gZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBTV0lHIGhhZCBwYXJzZWQgdGhlIHR3bwogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNvdW50IHRoZSBhcmd1bWVudHMgcGFzc2VkIGFuZCBjYWxsCiAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QsIGp1c3QgbGlrZSBvdmVybG9hZGVkIG1ldGhvZHMuIEMjIGFuZCBKYXZhIGFyZSBub3cgYWJsZQogICAgICAgICAgICB0byBwcm9wZXJseSB3cmFwIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBieSBnZW5lcmF0aW5nIGV4dHJhIG1ldGhvZHMsCiAgICAgICAgICAgIGFnYWluIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQsIHNvIGZvcjoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHM9ImhlbGxvIiwgZG91YmxlIGQ9MTAuMCwgaW50IGk9MCk7CgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByb3h5IG1ldGhvZHMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkLCBpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcyk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggY29tZXMgd2l0aCBhIGNvdXBsZSBvZiBtaW5vciBrbm9jayBvbiBlZmZlY3RzLgoKICAgICAgICAgICAgMSkgU1dJRyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgQyAobm90IEMrKykgY29kZSBubyBsb25nZXIgd29ya3MuCiAgICAgICAgICAgIFByZXZpb3VzbHkgeW91IGNvdWxkIGhhdmUgdGhpcyBpbnRlcmZhY2U6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHBhc3Mgbm8gYXJndW1lbnRzCiAgICAgICAgICAgIHdoZXJldXBvbiB0aGUgZGVmYXVsdCBvZiAwIHdhcyB1c2VkLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBiZWhhdmlvdXIgZm9yIEMKICAgICAgICAgICAgY29kZSBieSB1c2luZyB0aGUgImRlZmF1bHQiIHR5cGVtYXA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGRlZmF1bHQpIGludCB2YWwgIiQxID0gMDsiOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKCiAgICAgICAgICAgIG9yIHlvdSBjb3VsZCBvZiBjb3Vyc2UgY29tcGlsZSB5b3VyIGNvZGUgYXMgQysrIGlmIHlvdSB3YW50IEMrKyBmZWF0dXJlcyA6KSA6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBBIGNvdXBsZSBvZiBTV0lHJ3MgbGlicmFyaWVzIHVzZWQgdGhpcyBDIGV4dGVuc2lvbiBhbmQgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkCiAgICAgICAgICAgIHRvIHVzZSB0aGUgImRlZmF1bHQiIHR5cGVtYXAuIFRoZSAiZGVmYXVsdCIgdHlwZW1hcCBpcyB0aHVzIHVuY2hhbmdlZCAoYW5kIHN0aWxsCiAgICAgICAgICAgIGlzIG5vdCBhbmQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSBDIyBhbmQgSmF2YSwgYW5kIGlzIGxpa2VseSB0byByZW1haW4gc28pLgoKCiAgICAgICAgICAgIDIpIEFsbCBmZWF0dXJlcyAoJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUgZXRjKSBubyBsb25nZXIgd29yayBhcyBpZiB0aGUgbWV0aG9kCiAgICAgICAgICAgIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaXMganVzdCBvbmUgbWV0aG9kLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseQoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwoKICAgICAgICAgICAgd291bGQgaGF2ZSBpZ25vcmVkIHRoZSBtZXRob2QgY29tcGxldGVseS4gTm93IGl0IHdpbGwgb25seSBpZ25vcmUgZm9vKGludCkgYnV0CiAgICAgICAgICAgIG5vdCB0aGUgZXh0cmEgZm9vKCkgbWV0aG9kLiBJbnN0ZWFkIHVzZToKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb287CgogICAgICAgICAgICB0byBpZ25vcmUgdGhlbSBhbGwuIG9yCgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKCiAgICAgICAgICAgIFRoaXMgb2YgY291cnNlIGFsbG93cyBvbmUgdG8gZmluZSB0dW5lIHRoZSB3cmFwcGluZywgZm9yIGV4YW1wbGUgb25lIGNvdWxkIHVzZToKCiAgICAgICAgICAgICAgJXJlbmFtZShmb29pbnQpIGZvbyhpbnQpOwogICAgICAgICAgICAgICVyZW5hbWUoZm9vZGVmYXVsdHMpIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGVtIGZyb20gYW55IGxhbmd1YWdlIGxpa2Ugc286CgogICAgICAgICAgICAgIGZvb2ludCgyMDApCiAgICAgICAgICAgICAgZm9vZGVmYXVsdHMoKQoKICAgICAgICAgICAgb3IgZm9yIGV4YW1wbGUgaWdub3JlIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZCwgc28gdGhlIGRlZmF1bHRzIGNhbm5vdCBiZSB1c2VkOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8yLzIwMDQ6IG1tYXR1cwoJICAgW1B5dGhvbl0KCSAgIC0gTW9yZSBjbGVhbmluZyB1cCBhbmQgdW5pZm9ybWF0aW9uIG9uIHRoZSBQeXRob24gTGliCgoJICAgLSBBZGRlZCBSb2JpbidzIGRvY3N0cmluZyBwYXRjaCwgcGx1cyBzb21lIGZpeGVzLCBwbHVzCgkgICAgIHNvbWUgZXh0ZW5zaW9ucywgc2VlIGF1dG9kb2MuaSBleGFtcGxlIGluIHRoZSB0ZXN0LXN1aXRlLAoJICAgICBhbmQgdHJ5IHVzaW5nICVmZWF0dXJlKCJhdXRvZG9jIiwiZXh0ZW5kZWQiKS4KCSAgICAKCSAgICAgVGhpcyBwYXRjaCBpcyBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgdGhlCgkgICAgIGRvY3VtZW50YXRpb24gcHJvYmxlbSwganVzdCBlbm91Z2ggdG8gaW5mb3JtIHB5dGhvbiBhYm91dAoJICAgICB0aGUgcGFyYW1ldGVyIGxpc3QuCgoJICAgICBUaGUgZXhwZWN0ZWQgc3dpZyBkb2N1bWVudGF0aW9uIHN1cHBvcnQgaXMgZmFyIGZhciBhd2F5IHlldC4KCSAgICAgCgoxMC8xLzIwMDQ6IG1tYXR1cwoJICAgLSBGaXggdGhlICVjYWxsYmFjayBmZWF0dXJlIChvbmx5IHVzZWQgaW4gcnVieSBhbmQgcHl0aG9uIGV4YW1wbGVzLAoJICAgICBieSBub3csIGJ1dCBpdCBzaG91bGQgYmUgZ2VuZXJpYyksIG5vdyBtZW1iZXIgY2FsbGJhY2tzCgkgICAgIGFyZSB3b3JraW5nIGFnYWluCgkgICAgIAoJICAgLSBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb25zIHBvaW50ZXJzIGxpa2UKCgkJIHN0ZDo6b3N0cmVhbSYgc3RkOjplbmRsKHN0ZDo6b3N0cmVhbSYpOwoKCSAgICAgaWUsIHRoZSBvbmVzIHRoYXQgcmV0dXJuIHJlZmVyZW5jZXMgb3IgZW51bXMuCgkgCgkgICBbUHl0aG9uXSBBZGQgdGhlICVweXRob25jYWxsYmFjayBkaXJlY3RpdmUsIHdoaWNoIGlzIAoJICAgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiAlY2FsbGJhY2ssIGllLAoKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIGZvbzsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcjsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcm07CgoJICAgICBpbnQgZm9vKGludCBhKSB7CgkgICAgICAgICByZXR1cm4gYTsKCSAgICAgfQogIAoJICAgICBzdHJ1Y3QgQSAKCSAgICAgewoJICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCBhKTsKCSAgICAgICBpbnQgYmFybShpbnQgYSk7CgoJICAgICB9OwoKICAgICAgICAgICAgIGludCBmb29iYXIoaW50IGEsIGludCAoKnBmKShpbnQgYSkpOwoKCSAgIGluIHB5dGhvbiB5b3UgY2FuIHVzZQoKICAgICAgICAgICAgIGZvbygyKQoJICAgICBmb29iYXIoMixmb28pCiAgICAgICAgICAgICBBLmJhcigyKQoJICAgICBmb29iYXIoMixBLmJhcikKICAgICAgICAgIAogICAgICAgICAgIGllLCBubyBhZGRpdGlvbmFsIHBvaW50ZXIgZWxlbWVudHMgYXJlIGNyZWF0ZWQsIGFuZAoJICAgdGhlIG9yaWdpbmFsICdmb28nIGFuZCAnQS5iYXInIGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlcnMuCgoJICAgSW4gdGhlIGNhc2Ugb2YgbWVtYmVyIGZ1bmN0aW9uIGhvd2V2ZXIsIHN0aWxsIHlvdSBuZWVkCgkgICB0byB1c2UgdGhlIHNwZWNpYWwgdmFyaWFibGUgQ2xhc3M6OjxmbmNfbmFtZT5fY2JfcHRyLCBpZToKCiAJICAgICBmb29iYXJtKDMsIGEsIEEuYmFybV9jYl9wdHIpCgkgICAKCSAgIHdlIHdpbGwgdHJ5IHRvIGZpeCB0aGlzIHNpdHVhdGlvbiBhbHNvLCBidXQgbGF0ZXIuICAKCgkgICBbUHl0aG9uXSBBZGQgbW9yZSBlbGVtZW50cyBmcm9tIHRoZSBTVEwgbGlicmFyeSwgbm93CgkgICB5b3UgY2FuIHVzZQoKCSAgICAgaW1wb3J0IHN0ZAoJICAgICBzdGQuY291dCA8PCAiaGVsbG8gIiA8PCAxMjMgPDwgc3RkLmVuZGwKCgkgICBbUHl0aG9uXSBGaXggaW4vb3V0IHJldHVybiBtZWNoYW5pc20sIG5vdyBzd2lnIHdpbGwgYmVoYXZlCgkgICBhcyAxLjMuMjEgYnV0IHVzaW5nIGEgcHl0aG9uIGxpc3Qgd2hlbiBuZWVkZWQuIFRoZSBwcm9ibGVtCgkgICBpcyB0aGF0IHRoZSB0eXBlcyBzdGQ6OnBhaXIsc3RkOjp2ZWN0b3IsZXRjLCB1c2UgdHVwbGVzLAoJICAgYW5kIHRoZXkgaW50ZXJmZXIgd2l0aCB0aGUgcHJldmlvdXMgaW5vdXQgdHVwbGUgdHlwZS4KCgkgICBCeSB1c2luZyBsaXN0cyB3ZSBzb2x2ZSB0aGUgY29uZmxpY3RzLCBzd2lnIGFjdHMgYXMgYmVmb3JlLAoJICAgYnV0IHJldHVybnMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIgYXJlIHVzaW5nCgkgICB0aGUgT1VUIHR5cGVtYXAuIFNlZSB0aGUgbmV3IGlub3V0LmkgZXhhbXBsZSBpbiB0aGUKCSAgIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCQkgICAKICAgICAgICAgICBbUHl0aG9uXSBNdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgYmFkIGFyZ3VtZW50cywgbm93CgkgICB5b3UgYWx3YXlzIGdldCB0aGUgYXJndW1lbnQgbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KCjA5LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2UgLQogICAgICAgICAgICAxKSBXYXJuaW5nIGVtaXR0ZWQgd2hlbiAtaW1wb3J0YWxsIGFuZCAtaW5jbHVkZWFsbCBpcyB1c2VkIHRvZ2V0aGVyLAogICAgICAgICAgICAgICB3aXRoIC1pbmNsdWRlYWxsIHRha2luZyBwcmVjZWRlbmNlLgogICAgICAgICAgICAyKSBFbnN1cmUgU1dJR0lNUE9SVEVEIGlzIGFsd2F5cyBkZWZpbmVkIHdoZW4gYSBmaWxlIGlzIGJlaW5nCiAgICAgICAgICAgICAgIGltcG9ydGVkIHdpdGggJWltcG9ydC4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIFNXSUdJTVBPUlQsCiAgICAgICAgICAgICAgIHdoaWNoIGdldHMgZGVmaW5lZCBpbiBhbGwgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZXMuCgowOS8yNi8yMDA0OiBtbWF0dXMKCgkgICAgLSBhZGQgJWZlYXR1cmUoImV4Y2VwdGlvbmNsYXNzIikgdG8gaWRlbnRpZnkgYSBjbGFzcyB1c2VkCgkgICAgICBhcyBleGNlcHRpb24uIEJlZm9yZSBzd2lnIGlkZW50aWZpZWQgYW5kIG1hcmtlZCBhIGNsYXNzCgkgICAgICB1c2luZyB0aGUgImNwbHVzOmV4Y2VwdGlvbmNsYXNzIiBhdHRyaWJ1dGUuIEhvd2V2ZXIsIHRoZQoJICAgICAgY2xhc3MgbmVlZGVkIHRvIGFwcGVhciBvbiBhbiB0aHJvdygpIHN0YXRlbWVudC4gIE5vdwoJICAgICAgc3dpZyBrZWVwcyB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLCBhcwoJICAgICAgYmVmb3JlLCBidXQgaXQgYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gbWFyayBhIGNsYXNzIGJ5CgkgICAgICB1c2luZyB0aGUgJWZlYXR1cmUgZXhwbGljaXRseS4gKG1vc3RseSByZWxldmFudCBmb3IKCSAgICAgIHB5dGhvbiBhbmQgY2hpY2tlbikKCgkgICAgW1B5dGhvbl0KCgkgICAgLSBmaXggLW1vZGVybiBvcHRpb24gKyBleGNlcHRpb25zLCB3aGljaCBtaXggb2xkIGNsYXNzCgkgICAgICBzdHlsZSB3aXRoIHRoZSBuZXcgb25lLiBTbywgd2UgYWx3YXlzIG5lZWQgdG8gZW1pdAoJICAgICAgdGhlICJub25tb2Rlcm4iIHB5dGhvbiBjb2RlLgoKCSAgICAtIGFkZCB0aGUgInB5dGhvbjpub25keW5hbWljIiBmZWF0dXJlIGFuZCBpdHMgaGFuZGxlcgoKCSAgICAgIG5vdyBpZiB5b3UgaGF2ZQoJICAgICAgCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYyBBOwoJICAgICAgCgkgICAgICBzdHJ1Y3QgQSB7CgkgICAgICAgaW50IGE7CgkgICAgICAgaW50IGI7CgkgICAgICB9OwoKCSAgICAgIHRoZW4sIGluIHRoZSBweXRob24gc2lkZQoJICAgICAgCgkgICAgICBhYSA9IEEoKQoJICAgICAgCgkgICAgICBhYS5hID0gMSAjIG9rCgkgICAgICBhYS5iID0gMiAjIG9rCgkgICAgICBhYS5jID0gMyAjIGVycm9yLCB0aGUgY2xhc3MgY2FuIG5vdCBiZSBleHRlbmRlZCBkeW5hbWljYWxseS4KCgkgICAgCgkgICAgU2luY2UgdGhpcyBpcyBhIGZlYXR1cmUsIHlvdSBjYW4gdXNlCgoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWM7CgogICAgICAgICAgICBvciAKCgkgICAgICAlcHl0aG9uZHluYW1pYzsgWyBOb3RlOiAlcHl0aG9uZHluYW1pYyBzaW5jZSBkZXByZWNhdGVkIF0KICAgCgkgICAgdG8gZm9yY2UgYWxsIHRoZSB3cmFwcGVkIGNsYXNzZXMgdG8gYmUgIm5vbmR5bmFtaWMiIG9uZXMuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiByZWd1bGFyIHB5dGhvbiwgaXMgdGhhdCBhbGwgdGhlIHdyYXBwZWQKCSAgICBjbGFzc2VzIGFyZSBkeW5hbWljcy4gU28sIGNhcmVmdWwgd2l0aCB5b3VyIHNwZWxsaW5nLgoKMDkvMTQvMjAwNDogbW1hdHVzIAoJICAgIC0gU3VwcG9ydCB0aGUgLUktIG9wdGlvbi4KCgkgICAgLSBEaWZmZXJlbnRpYXRlIGJldHdlZW4gJWluY2x1ZGUgPGZpbGU+IGFuZCAlaW5jbHVkZSAiZmlsZSIuCgkgICAgICBUaGlzIGZpeCBzZXZlcmFsIGNvcm5lciBjYXNlcy4KCgkgICAgCgkgICAgW1B5dGhvbl0gU2V2ZXJhbCBwYXRjaGVzOgoKCSAgICAtIE5vcm1hbGl6ZSB0aGUgTGliIGZpbGUgbmFtZXM6IAoJCSouc3dnIGludGVybmFsIGZpbGVzLCAKCQkqLmkgICB1c2VyIGZpbGVzLgoKCSAgICAtIEZpeCBDaGFyW0FOWV0gdHlwZW1hcHMsIHNvIHRoZXkgYWxzbyBkZWxldGUgYW55IGV4dHJhICdcMCcgY2hhcnMsCgkgICAgICBub3cgdGhleSBiZWhhdmUgYXMgYmVmb3JlICgxLjMuMjEpLiBTdGlsbCwgeW91IGNhbiB1c2UKCSAgICAgIHRoZSBTV0lHX1BSRVNFUlZFX0NBUlJBWV9TSVpFIG1hY3JvIGlmIHlvdSBuZWVkIHRvCgkgICAgICBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2l6ZSAoc2VlIHB5c3RyYmFzZS5zd2cpLgoKCSAgICAtIEFkZCB0aGUgQ2hhciBGSVhTSVpFW0FOWV0gdHlwZW1hcHMsIHRvIHByZXNlcnZlIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIEMgYXJyYXkgc2l6ZXMgKHNlZSBhYm92ZSkuIFRob3VnaCwgeW91IGNhbid0CiAgICAgICAgICAgICAgdXNlIHRoZW0geWV0IHNpbmNlICVhcHBseSBhbmQgYXJyYXlzIGFyZSBub3Qgd29ya2luZwogICAgICAgICAgICAgIHRvZ2V0aGVyLgoKICAgICAgICAgICAgLSBBZGQgcHlmcmFnbWVudHMuc3dnLCBub3cgdGhlIHVzZXIgY2FuIGFkZCBmcmFnbWVudHMKCSAgICAgIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9uZXMuCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIHdoaWNoIGZpeGVzIHNwdXJpb3VzIHByZXByb2Nlc3NvciBidWcgd2hpY2gKICAgICAgICAgICAgc2hvd3Mgb24gU29sYXJpcyBhbmQgZ2NjLCBlZzoKICAgICAgICAgICAgICAgIFdhcm5pbmcoMjAyKTogQ291bGQgbm90IGV2YWx1YXRlICchZGVmaW5lZChTV0lHSkFWQSkgJiYKICAgICAgICAgICAgICAgICEoZGVmaW5lZChTV0lHQ1NIQVJQKScKICAgICAgICAgICAgQWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSAnI2lmICJhIiA9PSAiYiIgPT0gMScgd291bGRuJ3QgaGF2ZSB3b3JrZWQgCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3Qtc3VpdGUuIFBhdGNoIGZyb20KICAgICAgICAgICAgQmlsbCBDbGFya2UuCgowOS8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbWlzc2luZyBydW50aW1lLmRzcCBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMgZm9yIHRoZQogICAgICAgICAgICBpbXBvcnQgZXhhbXBsZXMgdG8gd29yay4KCgpWZXJzaW9uIDEuMy4yMiAoU2VwdGVtYmVyIDQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBzd2lnLm00IG1hY3JvIGZvciB1c2Ugd2l0aCB0aGUgQXV0b2NvbmYvQXV0b21ha2UvTGlidG9vbCBoYXMKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHRoZSBuZXcgYW5kIGJldHRlcgogICAgICAgICAgICBtYWludGFpbmVkIHZlcnNpb24gZGVyaXZlZCBmcm9tIHN3aWcubTQgaW4gdGhlIEF1dG9jb25mIG1hY3JvIGFyY2hpdmUuCiAgICAgICAgICAgIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3BrZ19zd2lnLmh0bWwgYW5kCiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcHl0aG9uX2RldmVsLmh0bWwuCgowOS8wMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCBwYXRjaCAjMTAxOTY2OSBmcm9tIENocmlzdG9waCBGbGFtbS4gQWRkcyBzdXBwb3J0CiAgICAgICAgICAgIGZvciAlZmVhdHVyZSgic2hhZG93IikgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdvcmtzIGluIFB5dGhvbi4gVGhpcwogICAgICAgICAgICBlbmFibGVzIG9uZSB0byBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHNoYWRvdy9wcm94eSBtZXRob2RzLCBpbmNsdWRpbmcKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8qIExldCdzIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcyBTcXVhcmUgbW9yZSB2ZXJib3NlICovCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSBTcXVhcmUoZG91YmxlIHcpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN1YiBuZXcgewogICAgICAgICAgICAgICAgICBteSAkcGtnID0gc2hpZnQ7CiAgICAgICAgICAgICAgICAgIG15ICRzZWxmID0gZXhhbXBsZWM6Om5ld19TcXVhcmUoQF8pOwogICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgIkNvbnN0cnVjdGVkIGFuIEB7W3JlZigkc2VsZildfVxuIjsKICAgICAgICAgICAgICAgICAgYmxlc3MgJHNlbGYsICRwa2cgaWYgZGVmaW5lZCgkc2VsZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgY2xhc3MgU3F1YXJlIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBTcXVhcmUoZG91YmxlIHcpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjA4LzMxLzIwMDQ6IG1tYXR1cyAKCSAgICBbUHl0aG9uXSBJbmNvbXBhdGliaWxpdHkgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UgKGxsaWJAY29tcHV0ZXIub3JnKToKCSAgICAKCSAgICBJZiB5b3UgYXJlIHVzaW5nIFN1biBTdHVkaW8gOCAoYW5kIHBvc3NpYmx5IGVhcmxpZXIKCSAgICB2ZXJzaW9ucykgdG8gY29tcGlsZSB0aGUgb3V0cHV0IHByb2R1Y2VkIGJ5IHN3aWcKCSAgICAxLjMuMjJyYzEsIGFuZCB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgU1RMIHRlbXBsYXRlcyB0aGVuCgkgICAgeW91IG5lZWQgdG8gdXNlIGVpdGhlciAiLXJ1bnRpbWUiIG9yICItbm9ydW50aW1lIi4gIElmIHlvdQoJICAgIHVzZSBuZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBnZXQKCSAgICBjb21waWxlciBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgd3JhcHBlciBmaWxlOwoJICAgIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbGlrZSB0aGlzOiBUaGUgbmFtZQoJICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJbLi4uXSBpcyB1bnVzYWJsZSBpbiBzdGF0aWMKCSAgICBzd2lncHk6OnRyYWl0c19hc3B0clsuLi5dICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IgbWVzc2FnZSwKCSAgICB5b3UgbmVlZCB0byByZWdlbmVyYXRlIHlvdXIgd3JhcHBlciBmaWxlIHVzaW5nICdzd2lnCgkgICAgLXJ1bnRpbWUnIG9yICdzd2lnIC1ub3J1bnRpbWUnLgoKCSAgICBZb3Ugc2hvdWxkbid0IGdldCB0aGlzIHByb2JsZW0gd2l0aCBTdW4gU3R1ZGlvIDkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCSAgICAKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgIzkzMjMzMyBmcm9tIElrZWdhbWkgVHN1dG9tdS4gRml4ZXMgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICM4NTczNDQgZnJvbSBBcnQgWWVya2VzLiBXb3JrYXJvdW5kIGZvciBhdXRvY29uZiBidWcgd2hlbgogICAgICAgICAgICBydW5uaW5nICdtYWtlIGluc3RhbGwnLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhcnQgb2YgcGF0Y2ggIzk4Mjc1MyBhcHBsaWVkLiBUaGlzIGltcGxlbWVudHMgYSAlcGVybGNvZGUgZGlyZWN0aXZlLgogICAgICAgICAgICBJdCBhbGxvd3Mgb25lIHRvIGFkZCBQZXJsIGNvZGUgdG8gdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gV29ya3MgdGhlIHNhbWUgCiAgICAgICAgICAgIGFzICVweXRob25jb2RlLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgdmlydHVhbCBtZXRob2RzIHdpdGggZXhjZXB0aW9uCiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYXQgd2VyZSBub3Qgc2ltcGxlIHR5cGVzLiBQcmV2aW91c2x5IGNvZGUgd2FzIGdlbmVyYXRlZCB0aGF0CiAgICAgICAgICAgIGRpZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB3YXMgYSBwb2ludGVyLgoKMDgvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwIGZpeCBmb3IgbWV0aG9kcyB0aGF0IHJldHVybiBjaGFyICouIFRoZSBDTFIgd291bGQgaW5jb3JyZWN0bHkKICAgICAgICAgICAgZGVsZXRlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBjaGFyICouIEFsc28gYXBwbGllZCB0aGUgc2FtZSBjb3JyZWN0aW9uIHRvCiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzLgoKMDgvMjQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIC1mbWljcm9zb2Z0IGVycm9yL3dhcm5pbmcgbWVzc2FnZSBkaXNwbGF5OiAKICAgICAgICAgICAgLSBFbmQgb2YgZmlsZSAoRU9GKSB3YXJuaW5nIG1lc3NhZ2VzIG5vdCBkaXNwbGF5aW5nIGluIGNvcnJlY3QgZm9ybWF0CiAgICAgICAgICAgIC0gU29tZSBtZXNzYWdlcyBjb250YWluaW5nIGEgZmlsZSBwYXRoIHdlcmUgZGlzcGxheWluZyBhIGRvdWJsZSBiYWNrc2xhc2gKICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGJhY2tzbGFzaAoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjMTAxMTYwNCBzdWJtaXR0ZWQgYnkgQ2hhcmxlcyBTY2h3aWV0ZXJzLiBGaXggZm9yIDY0IGJpdCB0Y2wKICAgICAgICAgICAgaW50ZXJwcmV0ZXJzLgoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBidWcgIzg3NTU4MyAtIGVudW0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgcHJldmlvdXNseSBnYXZlIGEgc3ludGF4IGVycm9yLgoKMDgvMjMvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2UgdHlwZW1hcHMgImZmaXR5cGUiIGFuZCAibGlzcHR5cGUiIHRvIGRldGVybWluZSB0aGUgRkZJIHR5cGUKCSAgICBzcGVjaWZpZXJzIGZyb20gdGhlIEMgdHlwZS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUsIGZvciBpbnN0YW5jZSwgdG8gY29udHJvbAoJICAgIHdoZXRoZXIgYSBDICJjaGFyIiBhcmd1bWVudCB0YWtlcyBhIExpc3AgY2hhcmFjdGVyIG9yIGEgTGlzcCBpbnRlZ2VyIHZhbHVlLgoJICAgIFRoZSBkZWZhdWx0ICh0YWtpbmcgTGlzcCBjaGFyYWN0ZXJzKSBpcyBkb25lIGJ5IHRoZXNlIGJ1aWx0LWluIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiY2hhcmFjdGVyIjsKCSAgICBJZiBjaGFyIG1lYW5zIGFuIGludGVnZXIgaW5zdGVhZCwgdXNlIHRoZXNlIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiaW50ZWdlciI7CgowOC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcyBkaXNjdXNzZWQgaW4gYnVnICM3NzI0NTMsIHRoZSBTV0lHIGxpYnJhcnkgZGlyZWN0b3J5IGlzIG5vdyBpbnN0YWxsZWQKICAgICAgICAgICAgaW50byBhIGRpZmZlcmVudCBkZWZhdWx0IGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgdXNlZCB0byBiZSBpbnN0YWxsZWQgdG8KICAgICAgICAgICAgL3Vzci9sb2NhbC9saWIvc3dpZzEuMy4gSXQgaXMgbm93IGluIHRoZSBtb3JlIHVzdWFsIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudAogICAgICAgICAgICBkaXJlY3RvcnkgYW5kIEkgaGF2ZSBhZGRpdGlvbmFsbHkgdXNlZCBhIHZlcnNpb24gc3BlY2lmaWMgc3ViZGlyZWN0b3J5IGFzCiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHdpbGwgcmFyZWx5IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHLiBUaGlzIHJlbGVhc2UKICAgICAgICAgICAgd2lsbCB0aHVzIHVzZSAvdXNyL2xvY2FsL3NoYXJlL3N3aWcvMS4zLjIyIGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB0YWlsb3JlZCBhcyBiZWZvcmUgdXNpbmcgJy4vY29uZmlndXJlIC0tc3dpZ2xpYmRpcicuCgowOC8xNy8yMDA0OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBBZGQgc3VwcG9ydCB0byBjcmVhdGUgbmF0aXZlIE16U2NoZW1lIHN0cnVjdHVyZXMgZnJvbSBDIHN0cnVjdHVyZXMuCgkgICAgVG8gY29udmVydCBhIEMgc3RydWN0dXJlIHRvIGFuIE16U2NoZW1lIHN0cnVjdHVyZSwgdXNlIHRoZSBuZXcgcnVudGltZSBtYWNybwoJICAgIFNXSUdfTmV3U3RydWN0RnJvbVB0ciBpbiBhIHR5cGVtYXAuICBQYXRjaCBmcm9tIERtaXRyaXkgWmF2aW4uIAoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzgzNzcxNSBmcm9tIEJlbiBSZXNlciB0byBjb3JyZWN0bHkgZGV0ZWN0IFB5dGhvbiBsaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIG9uIDY0IGJpdCBzeXN0ZW1zLgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSBvZiBlYXJseSByZXR1cm4KICAgICAgICAgICAgZnJvbSB3cmFwcGVyIG1ldGhvZHMgdXNpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbWV0ZXJzLiBNb2RpZmllZAogICAgICAgICAgICBNYXJrIFRyYXVkdCBwYXRjaCAjOTUxNTY1LgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQnVnICM5NDM3ODMgd2l0aCBwYXRjaCBmaXhlcyBwaHAgY2hhciAqIG91dCB0eXBlbWFwIE5VTEwgdmFsdWVzLgoKMDgvMDMvMjAwNDogQWhtb24gRGFuY3kgIDxkYW5jeUBkYW5jeT4KCiAgICAgICAgICAgIFthbGxlZ3JvY2xdIEFkZGl0aW9uYWwgY2FzZSBtb2RlIGZpeGVzLiAgQWxzbywgbWFrZSBzdXJlCgkgICAgZm9yZWlnbiB0eXBlcyBhcmUgZXhwb3J0ZWQuCgowNy8yNC8yMDA0OiBta29lcHBlIAoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBTV0lHIG1vZHVsZXMgbm93IGV4Y2hhbmdlIHRoZWlyIHBvaW50ZXIgdHlwZQoJICAgIGluZm9ybWF0aW9uIHZpYSB0aGUgR3VpbGUgaW50ZXJwcmV0ZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEKCSAgICBydW50aW1lIGxpYnJhcnkgb3IgdG8gdXNlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGV0Yy4KCSAgICAKCSAgICBUaGUgbW9kdWxlIChTd2lnIHN3aWdydW4pIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBjaGFuZ2Ugb2YgMDUvMTcvMjAwNCBpcwoJICAgIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGJ1aWx0LiAgSWYgeW91IG5lZWQgaXQsIHJ1biBTV0lHIG9uIHRoZSBpbnRlcmZhY2UgZmlsZQoJICAgIHN3aWdydW4uaS4gCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEJ1ZyAjOTE3NjAxIE1hcHBpbmcgQysrIGJvb2wgZml4IGZyb20gTWFyayBUcmF1ZHQKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJQTSBmaXhlcyBmb3IgbGF0ZXN0IENWUyB2ZXJzaW9uIGluY2x1ZGluZyByZW1vdmFsIG9mIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyeS4KCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5MDg5NTUgZnJvbSBSb2JlcnQgSCBEZSBWcmllcy4KICAgICAgICAgICAgUlBNIGZpbGUgZ2VuZXJhdGlvbiBmaXggZm9yIEZlZG9yZSBDb3JlIDEgYW5kIFJlZGhhdCBBUzIuMS4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4NjQ2ODkgZnJvbSBSb2JpbiBEdW5uOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0cyB0d28gcHJvYmxlbXMgaW4gdGhlIFhNTCBvdXRwdXQgb2YgU1dJRzoKICAgICAgICAgICAgIAogICAgICAgICAgICAgIDEuIFRoZXJlIHdlcmUgb2Z0ZW4gZXh0cmEgJy8+XG4nIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgMi4gdmFsdWUgYXR0cmlidXRlcyB3ZXJlIG91dHB1dCB3aXRoICdcbicgaW4gdGhlbSBidXQKICAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG5vdCB0ZWNobmljYWxseSBsZWdhbCBtb3N0IChhbGw/KSBYTUwKICAgICAgICAgICAgICBwYXJzZXJzIHdpbGwgc3RyaXAgdGhlbSBvdXQuIFJlcGxhY2luZyB0aGUgJ1xuJyB3aXRoCiAgICAgICAgICAgICAgdGhlICcmIzEwOycgZW50aXR5IHJlZmVyZW5jZSBzb2x2ZXMgdGhpcyBhcyB0aGF0IGlzCiAgICAgICAgICAgICAgbGVnYWwgYW5kIFhNTCBwYXJzZXJzIHdpbGwgY29udmVydCBpdCB0byBhICdcbicgd2hlbgogICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHZhbHVlcyBiYWNrIGluLgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGEgbmV3IGdsb2JhbCBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgICAgICAgICAgdGhhdCB3aWxsIGFsbG93IHRoZSBwYXJzZSB0cmVlIHRvIGJlIHdyaXR0ZW4gb3V0IGluIFhNTAogICAgICAgICAgICAgICphZnRlciogc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGUgaGFzIGJlZW4gcnVuLCBpbgogICAgICAgICAgICAgIG9yZGVyIHRvIGJlIGFibGUgdG8gZ2V0IGV4dHJhIGluZm8gdGhhdCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICBtb2R1bGUgcHV0cyBpbiB0aGUgdHJlZS4gSW4gdGhpcyB3YXkgdGhlIFhNTCBpcyBhCiAgICAgICAgICAgICAgcG9zdC1wcm9jZXNzZWQgdmVyc2lvbiBvZiB0aGUgdHJlZSByYXRoZXIgdGhhbiBhCiAgICAgICAgICAgICAgcHJlLXByb2Nlc3NlZCB2ZXJzaW9uLiAKIAogICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb24gaXMgLWR1bXBfeG1sIG9yIC14bWxvdXQgPGZpbGU+CgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgdG8gZml4IHR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMKICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24gKG1ha2VjaGFwLnB5KSBmaWxlIGdlbmVyYXRvciBtaXNzaW5nIGVuZCBvZiBsaW5lCiAgICAgICAgICAgIHBhdGNoICM5MDg5NTEgZnJvbSBSb2JlcnQgZGUgVnJpZXMuCgowNy8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBydW50aW1lIGxpYnJhcnkgYnVpbGQgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcyBhbHNvIHJlbW92ZXMKICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgb24gTGlidG9vbC4gTGlidG9vbCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gYnVpbGQgU1dJRy4KICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgLWxkZmxhZ3MgU1dJRyBjb21tYW5kbGluZSBvcHRpb24gaGFzIGFsc28gYmVlbiByZW1vdmVkLgoKICAgICAgICAgICAgVGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRlc3RjYXNlcyB0aGF0IHVzZWQgdGhlIHJ1bnRpbWUgbGlicmFyeSBoYXZlCiAgICAgICAgICAgIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHJlcGxhY2VtZW50IGFwcHJvYWNoIHRvIHVzaW5nIFNXSUcgYWNyb3NzIAogICAgICAgICAgICBtdWx0aXBsZSBtb2R1bGVzLCB0aGF0IGlzIHRoZXkgdXNlIHRoZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLCBzZWUgTW9kdWxlcy5odG1sLiBFZmZlY3RpdmVseSB0aGV5IGJ1aWxkIHRoZWlyIG93biBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcmllcyB1c2luZyAtcnVudGltZS4gVGhlIGV4YW1wbGVzIGFyZSBpbXBvcnQgYW5kIGltcG9ydF90ZW1wbGF0ZS4KICAgICAgICAgICAgVGhlIHRlc3QgY2FzZXMgYXJlIGluIHRoZSBpbXBvcnRzIGFuZCB0ZW1wbGF0ZV90eXBlZGVmX2ltcG9ydCBkaXJlY3Rvcmllcy4KCiAgICAgICAgICAgIEFueW9uZSB3aG8gd2FudHMgdGhlIG9yaWdpbmFsIHJ1bnRpbWUgbGlicmFyaWVzIGNhbiBlaXRoZXIgcnVuIHRoZSB0ZXN0LXN1aXRlCiAgICAgICAgICAgIG9yIGJ1aWxkIHRoZSBleGFtcGxlcyBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFyZWQgb2JqZWN0L0RMTCB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aXRoIHRoZSAtcnVudGltZSBjb21tYW5kbGluZSBvcHRpb24uIEZvciBleGFtcGxlIGxpYmltcG9ydHNfcnVudGltZS5zbwogICAgICAgICAgICAoUHl0aG9uIGNhbGxzIGl0IGxpYl9pbXBvcnRzX3J1bnRpbWUuc28pIGlzIGdlbmVyYXRlZCBhZnRlciBydW5uaW5nIHRoZSAKICAgICAgICAgICAgJ21ha2UgaW1wb3J0cy5tdWx0aWNwcHRlc3QnIHRlc3RjYXNlIGluIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlLzxsYW5nPgogICAgICAgICAgICBkaXJlY3RvcnkuIE9yIHVzZSBsaWJydW50aW1lLnNvIC8gcnVudGltZS5kbGwgYWZ0ZXIgYnVpbGRpbmcgdGhlIGltcG9ydAogICAgICAgICAgICBleGFtcGxlcyBpbiBFeGFtcGxlcy88bGFuZz4vaW1wb3J0LgoKMDcvMDcvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBDb252ZXJ0IGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGluIGNvbnN0YW50cyB0byAKCSAgICBDTCBzeW50YXguICBGaXggRkY6REVGLUZPUkVJR04tQ0FMTCBmb3IgbWl4ZWQtY2FzZSBDIGZ1bmN0aW9ucy4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZmVhdHVyZSBmb3IgSmF2YSBleGNlcHRpb25zIHdpdGggZm9ybWF0ICVqYXZhZXhjZXB0aW9uKGV4Y2VwdGlvbmNsYXNzZXMpLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgYSBzbGlnaHQgZW5oYW5jZW1lbnQgdG8gJWV4Y2VwdGlvbiBhbmQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgCiAgICAgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBleGNlcHRpb24gY2xhc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGludG8gYSB0aHJvd3MgY2xhdXNlLgogICAgICAgICAgICBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBhc3NvY2lhdGVkIHByb3h5IG1ldGhvZCdzIHRocm93cyBjbGF1c2UuIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycKICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBsaWtlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBpbiB0aGUgJ3Rocm93cycgYXR0cmlidXRlIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwcy4gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGZvciBjb3JyZWN0bHkgaGFuZGxpbmcgY2hlY2tlZCBleGNlcHRpb25zCiAgICAgICAgICAgIHRocm93biBmcm9tIEpOSSBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFleGNlcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iKSB0aHJvd0V4Y2VwdGlvbiAlewogICAgICAgICAgICAgICAgLi4uIGNvbnZlcnQgYSBzdGQ6OmxvZ2ljX2Vycm9yIGludG8gYSBqYXZhLmxhbmcuRXhjZXB0aW9uIHVzaW5nIEpOSSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAgICAgICAgICAgICAgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkxvZ2ljIGVycm9yISIpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2Qgd2l0aCBhIHRocm93cyBjbGF1c2UgaW4gdGhlIG1vZHVsZSBjbGFzczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geyAuLi4gfQoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgJWNzY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFRoaXMgd29ya3MgdGhlIHNhbWUgd2F5IGFzICVqYXZhY29uc3R2YWx1ZS4gRm9yIEMjLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgICBpcyB0aGUgb25seSB3YXkgdGhhdCBvbmUgY2FuIGZpeCB3cmFwcGluZyBvZiBDL0MrKyBlbnVtcyB3aXRoIHByb3BlciBDIwogICAgICAgICAgICBlbnVtcyBpZiB0aGUgZW51bSBpdGVtJ3MgaW5pdGlhbGlzZXIgY2Fubm90IGNvbXBpbGUgYXMgQyMgY29kZS4gVGhpcyBpcwogICAgICAgICAgICBiZWNhdXNlIEphdmEgZW51bXMgY2FuIHVzZSBhIGNhbGwgaW50byBDIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZW51bSBpdGVtLAogICAgICAgICAgICB3aGVyZWFzIGluIEMjLCB0aGUgZW51bSB2YWx1ZSBtdXN0IGJlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiBUaGF0IGlzLAogICAgICAgICAgICB1c2luZyAlY3Njb25zdCgwKSBjYW5ub3QgYmUgdXNlZCBpbiBDIyB0byBpbml0aWFsaXNlIHRoZSBDIyBlbnVtIGl0ZW0gdmlhCiAgICAgICAgICAgIGEgUElOVk9LRSBjYWxsLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyAlamF2YWNvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBTb21ldGltZXMgdGhlIHVzZSBvZiAlamF2YWNvbnN0KDEpIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZQogICAgICAgICAgICB1bmRlciBKYXZhLiBJZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBpcyByZXF1aXJlZCwgJWphdmFjb25zdCgwKSBpcyBub3QgYW4KICAgICAgICAgICAgb3B0aW9uLiBUaGUgJWphdmFjb25zdHZhbHVlIGRpcmVjdGl2ZSBhY2hpZXZlcyB0aGlzIGdvYWwgYW5kIHRoZSB2YWx1ZSBzcGVjaWZpZWQKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGFzIEphdmEgY29kZSB0byBpbml0aWFsaXNlIHRoZSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMDAwKSBCSUc7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKCJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIyMDAwXCIpIikgTEFSR0U7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwKSBiYXI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXIgPSAxMDsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICNkZWZpbmUgQklHIDEwMDBMTAogICAgICAgICAgICAgICAgI2RlZmluZSBMQVJHRSAyMDAwVUxMCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7IEJBUiA9IDo6YmFyIH07CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEdlbmVyYXRlczoKCiAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBleGFtcGxlQ29uc3RhbnRzIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMDAwOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBMQVJHRSA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMjAwMCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9vIEJBUiA9IG5ldyBGb28oIkJBUiIsIDEwKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHksIG5vbmUgb2YgQklHLCBMQVJHRSBvciBCQVIgd291bGQgaGF2ZSBwcm9kdWNlZCBjb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgZW5oYW5jZW1lbnRzLiBGZWF0dXJlcyBjYW4gbm93IHRha2UgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGluIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlIG5hbWUgYW5kIGZlYXR1cmUgdmFsdWUuIFRoZSBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbCAKICAgICAgICAgICAgYW5kIGFyZSBtdWNoIHRoZSBzYW1lIGFzIHRoZSB0eXBlbWFwIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHNwZWNpZmllcyB0d28gb3B0aW9uYWwgYXR0cmlidXRlcywgYXR0cmliMSBhbmQgYXR0cmliMjoKCiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lICJ2YWwiOwogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIHZhbCwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lOwoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciB0aGUgc3ludGF4IHRoYXQgdGFrZXMgdGhlIGZlYXR1cmUgdmFsdWUgd2l0aGluIHRoZQogICAgICAgICAgICAlZmVhdHVyZSgpIGJyYWNrZXRzLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vIGxvbmdlciByZXN0cmljdGVkIHRvIGJlaW5nIGp1c3QKICAgICAgICAgICAgYSBzdHJpbmcuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IGFjY2VwdGFibGUKICAgICAgICAgICAgc3ludGF4OgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsMjAuMCk7CiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZCBoYXZlIHRvIGhhdmUgYmVlbjoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLCIyMC4wIik7CiAgICAgICAgICAgIFVzZWZ1bCBmb3IgZmVhdHVyZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSAlc29tZWZlYXR1cmUodmFsdWUpICAgICAgJWZlYXR1cmUoInNvbWVmZWF0dXJlIix2YWx1ZSkKICAgICAgICAgICAgVGhlc2Ugd2lsbCBub3cgd29yayBhY2NlcHRpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyOgogICAgICAgICAgICAgICVzb21lZmVhdHVyZSgiRnJlZCIpOwogICAgICAgICAgICAgICVzb21lZmVhdHVyZSg0KTsKCjA2LzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbiwgR3VpbGVdCiAgICAgICAgICAgICAtIENyZWF0ZWQgdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvc2NoZW1lcnVubWUgZGlyZWN0b3J5LCB3aGljaCBob2xkcyBhbGwgdGhlCgkgICAgICAgcnVubWUgc2NyaXB0cyBmb3IgZ3VpbGUgYW5kIGNoaWNrZW4gKGFuZCBwb3NzaWJseSBtenNjaGVtZS4uLikuICBUaGUgZ3VpbGUKCSAgICAgICBhbmQgY2hpY2tlbiBfcnVubWUgZmlsZXMgdGhlbiAobG9hZCAiLi4vc2NoZW1lcnVubWUvZm9vLnNjbSIpLgogICAgICAgICAgICAgLSBJbiBjaGlja2VuIG1vZHVsZSwgZml4IGEgZmV3IGJ1Z3MgaW52bG9sdmluZyBkeW5hbWljIGNhc3RzLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggdG8gZml4IHdyYXBwaW5nIG9mIHRlbXBsYXRlZCBtZXRob2RzLiBJU08gY29tcGxpYW50IGNvbXBpbGVycywgbGlrZQogICAgICAgICAgICBDb21lYXUgYW5kIEdDQy0zLjQuMCwgZG9uJ3QgbGlrZSB0aGUgdGVtcGxhdGUgc3BlY2lmaWVyIHRoYXQgU1dJRyB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICB3aGVuIGNhbGxpbmcgdGhlIG1ldGhvZC4gVGhpcyBmaXggbWF5IGJyZWFrIHNvbWUgbm9uIHN0YW5kYXJkIGNvbXBsaWFudCBjb21waWxlcnMsCiAgICAgICAgICAgIGZvciBleGFtcGxlLCBTdW4gd29ya3Nob3AgY29tcGlsZXJzIHByaW9yIHRvIHZlcnNpb24gNi4yLnAyLiBQYXRjaCBzdWJtaXR0ZWQKICAgICAgICAgICAgYnkgQmlsbCBDbGFya2UuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFVuZG9jdW1lbnRlZCBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZSByZW1vdmVkLgogICAgICAgICAgICBOZXcgc3BlY2lhbCB2YXJpYWJsZSAkbW9kdWxlIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYXMgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5ICVtb2R1bGUgb3IgLW1vZHVsZSBjb21tYW5kbGluZSBvcHRpb24uICRpbWNsYXNzbmFtZSBjYW4gYmUgY3JlYXRlZCBmcm9tICRtb2R1bGUuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNhbWUgYXMgZm9yIEphdmEgYmVsb3cuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5LCBuYW1lbHksCiAgICAgICAgICAgIGNzYm9keSBhbmQgY3Nib2R5X2Rlcml2ZWQuIFRoZSBkZXByZWNhdGVkIHR5cGVtYXBzIGFyZSBjc2dldGNwdHIgYW5kCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFR5cGVtYXAgY2hhbmdlcyBmb3IgdGhlIEphdmEgcHJveHkgLyB0eXBld3JhcHBlciBhbmQgZW51bSBjbGFzc2VzLiBBIG5ldwogICAgICAgICAgICB0eXBlbWFwIGNhbGxlZCBqYXZhYm9keSBjb250YWlucyB0aGUgZXNzZW50aWFsIHN1cHBvcnQgY29kZSBmb3IgZ2VuZXJhdGlvbiBpbnRvIHRoZSBib2R5CiAgICAgICAgICAgIG9mIHRoZXNlIGNsYXNzZXMuIFRoZXJlIGlzIGFsc28gYSBuZXcgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwIHdoaWNoIGlzIHVzZWQgaW5zdGVhZCBmb3IKICAgICAgICAgICAgd3JhcHBlZCBjbGFzc2VzIHRoYXQgaGF2ZSBhIHdyYXBwZWQgYmFzZSBjbGFzcy4gVGhlIGNvZGUgaXMgYmFzaWNhbGx5LCB0aGUgZ2V0Q1B0cigpCiAgICAgICAgICAgIG1ldGhvZCBhbmQgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMuIFRoZXNlIHVzZWQgdG8gYmUgaGFyZCBjb2RlZAogICAgICAgICAgICB3aXRoIG5vIHdheSB0byBtb2RpZnkgdGhlIGNvZGUuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhpcyB0eXBlbWFwIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgICB0aGUgdXNlciB0byB0YWlsb3IgbmVhcmx5IGV2ZXJ5IGFzcGVjdCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uLgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIG5vdyBpcyB0aGUgY29kZSBmb3IgZGlyZWN0b3IgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciBhbmQgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIHR5cGVtYXBzIGFyZSBkZXByZWNhdGVkIGFuZCBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgdGhhdCB0aGVzZSBnZW5lcmF0ZWQgY2FuIGJlIHB1dCBpbiB0aGUgbW9yZSBmbGV4aWJsZQogICAgICAgICAgICBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbCBtYXkgaGVscCB5b3UgdXBncmFkZSBpZiB5b3UgaGF2ZSB1c2VkCiAgICAgICAgICAgIHRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwOgoKICAgICAgICAgICAgICAgIC8qIFV0aWxpdHkgbWFjcm8gZm9yIG1hbmlwdWxhdGluZyB0aGUgSmF2YSBib2R5IGNvZGUgbWV0aG9kIGF0dHJpYnV0ZXMgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgQ1RPUl9BVFRSSUIsIEdFVENQVFJfQVRUUklCKQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHkpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3dpZ0NNZW1Pd247CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN3aWdDTWVtT3duID0gY01lbW9yeU93bjsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5X2Rlcml2ZWQpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIoJG1vZHVsZUpOSS5TV0lHJGphdmFjbGFzc25hbWVVcGNhc3QoY1B0ciksIGNNZW1vcnlPd24pOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogVGhlIGRlZmF1bHQgaXMgcHJvdGVjdGVkIGdldENQdHIsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhTV0lHVFlQRSwgcHJvdGVjdGVkLCBwcm90ZWN0ZWQpCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0dFVENQVFIoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwcm90ZWN0ZWQsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHB1YmxpYyBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfQk9EWU1FVEhPRFMoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwdWJsaWMsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBtb2RpZmllciB0eXBlbWFwcyBhbmQgcHJhZ21hcyBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgIFRoZXkgbXVzdCBub3cgaW5jbHVkZSB0aGUgY2xhc3MgdHlwZS4gUHJldmlvdXNseSAnY2xhc3MnIHdhcyBoYXJkIGNvZGVkLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBlbmFibGVzIGZsZXhpYmlsaXR5IGludG8gd2hhdCB0eXBlIG9mIGNsYXNzIGlzIGdlbmVyYXRlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgdGhlIHByb3h5IGNsYXNzIGNvdWxkIGJlIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MuCgogICAgICAgICAgICBGb3IgSmF2YSB0aGlzIGFmZmVjdHMgdGhlIGphdmFjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIEZvciBDIyB0aGlzIGFmZmVjdHMgdGhlIGNzY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIFVubGVzcyB5b3UgaGF2ZSBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IHZlcnNpb25zIG9mIHRoZXNlIHR5cGVtYXBzIG9yIHByYWdtYXMsIHlvdQogICAgICAgICAgICBzaG91bGRuJ3QgYmUgYWZmZWN0ZWQuIEhvd2V2ZXIsIGlmIHlvdSBoYXZlLCB1cGdyYWRpbmcgaXMgZWFzeSwgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIgoKICAgICAgICAgICAgbXVzdCBub3cgYmU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCBjbGFzcyIKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gUHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBPcmVuIE1pbGxlci4gQWxzbyBpbXByb3ZlcyB0aGUgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhdGNoIGhhbmRsZXIgZm9yIHBvaW50ZXJzIC0gYSBwb2ludGVyIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0bwogICAgICAgICAgICBhIHBvaW50ZXIuIEFkZGVkIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIGZvciBTV0lHVFlQRSAmLCBTV0lHVFlQRSAqIGFuZAogICAgICAgICAgICBTV0lHVFlQRVtBTlldIChKYXZhIGFuZCBDIykuCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgbWlub3IgdHlwZXNhZmUgZW51bSBpbXByb3ZlbWVudHMsIGluY2x1ZGluZyBzdG9yaW5nIHRoZSBuYW1lIG9mCiAgICAgICAgICAgIHRoZSBlbnVtIGl0ZW0uIFRoZSB0b1NyaW5nKCkgLyBUb1N0cmluZygpIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoaXMgbmFtZS4KCjA1LzMwLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgIC0gVXBkYXRlIGhvdyBleGFtcGxlcyBhbmQgdGhlIHRlc3Qgc3VpdGUgYXJlIGJ1aWx0LgoJICAgICAtIFN5bWJvbCBuYW1lcyBhcmUgbm8gbG9uZ2VyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlCgkgICAgIC0gQWRkZWQgdW5pb25fcnVubWUuc3MsIHdoaWNoIHdhcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gdGhlIGd1aWxlIG1vZHVsZQoKMDUvMjYvMjAwNDogbGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgQ29tbWl0dGVkIG9uIGJlaGFsZiBvZiBNYXJjZWxvICh3aG8gc3RpbGwgaGFzIHByb2JsZW1zIHdpdGggCgkgICAgdGhlIFNvdXJjZUZvcmdlIENWUy4pCgoJICAgIEFkZGVkIFB5dGhvbiB0eXBlbWFwcyBmb3IgRklMRSogd2l0aCAoUHl0aG9uLW9ubHkpIHRlc3QuCgo1LzI0LzIwMDQ6ICBkYW5jeQoKCSogQWxsZWdybyBDTCBtb2R1bGU6ICBOb3cgdXNpbmcgc29tZSBtYWNyb3MgKGRlZmluZWQgaW4KCUxpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZyksIHN3aWctZGVmY29uc3RhbnQgYW5kIHN3aWctZGVmdW4sIGZvcgoJZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBmb3JlaWduIGZ1bmN0aW9ucy4gIFRoaXMgbWFrZXMgdGhlCglnZW5lcmF0ZWQgZmlsZSBhIGJpdCBuZWF0ZXIuICAgIAoKCU5vdyBzdHJpcHMgYSBsYXllciBvZiBwYXJlbnRoZXNpcyBmcm9tIGNvbnN0YW50cy4KCglVc2VzICgqIDp2b2lkKSBpbnN0ZWFkIG9mIDpmb3JlaWduLWFkZHJlc3Mgbm93LgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVW5uYW1lZCBlbnVtIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gYWRkaXRpb24KICAgICAgICAgICAgdG8gdGhlIHJlY2VudGx5IGFkZGVkIHN1cHBvcnQgZm9yIHVubmFtZWQgZW51bSBtZW1iZXIgdmFyaWFibGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgZW51bSB7IGVudW0xLCBlbnVtMiB9IE1lbWJlckluc3RhbmNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMywgZW51bTQgfSBHbG9iYWxJbnN0YW5jZTsKCiAgICAgICAgICAgIFRoZSBpbnQgdHlwZW1hcHMgYXJlIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSBnZXQvc2V0IGFjY2Vzc29yIG1ldGhvZHMuCiAgICAgICAgICAgIElmIHRoZSBzaXplb2YgYW4gZW51bSBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcyBhbiBpbnQgdGhlbiBzZXR0aW5nIHRoZQogICAgICAgICAgICB2YXJpYWJsZSB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcgYXMgdGhlIGNhc3RzIGNhbm5vdCBiZSBlYXNpbHkgYW5kIHBvcnRhYmx5CiAgICAgICAgICAgIGdlbmVyYXRlZC4gSWYgeW91IG5lZWQgdG8gc29sdmUgdGhpcyBoaWdobHkgb2JzY3VyZSBzaXR1YXRpb24sIHdyaXRlCiAgICAgICAgICAgIHRoZSBhc3NpZ25tZW50IHVzaW5nIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEMjIGVudW0gd3JhcHBpbmcgbW9kcy4gU2ltaWxhciB0byB0aGUgSmF2YSBtb2R1bGUsIGVudW1zIGNhbiBiZSB3cmFwcGVkIHVzaW5nCiAgICAgICAgICAgIG9uZSBvZiAzIGFwcHJvYWNoZXM6CgogICAgICAgICAgICAxKSBQcm9wZXIgQyMgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlY3NlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgW05vIGltcGxlbWVudGF0aW9uIGRlZW1lZCBuZWNlc3NhcnkgZm9yIHR5cGUgdW5zYWZlIGVudW1zXS4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHByb3BlciBDIyBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEphdmEgZW51bSBzdXBwb3J0IGFkZGVkLiBUaGVyZSBhcmUgbm93IDQgd2F5cyBpbiB3aGljaCBlbnVtcyBjYW4gYmUgd3JhcHBlZDoKCiAgICAgICAgICAgIDEpIFByb3BlciBKYXZhIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBUeXBlIHVuc2FmZSBlbnVtcyAoY29uc3RhbnQgaW50ZWdlcnMpIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXVuc2FmZS5zd2ciCiAgICAgICAgICAgIDQpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlamF2YWVudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwcyB3aWxsIGhhbmRsZSBlbnVtcyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgc3BlY2lmaWVkIGluaXRpYWwKICAgICAgICAgICAgdmFsdWVzLCBmb3IgZXhhbXBsZSB0ZW4gaXMgc3BlY2lmaWVkOgoKICAgICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IHplcm8sIHRlbigxMCkgfTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBhbW91bnQgb2YgZ2VuZXJhdGVkIEphdmEgY29kZSBjYW4gYmUgY3V0IGRvd24sIGJ5IG1vZGlmeWluZyB0aGVzZSB0eXBlbWFwcwogICAgICAgICAgICBpZiBub25lIG9mIHRoZSBlbnVtcyBoYXZlIGluaXRpYWwgdmFsdWVzIChwcm9wZXIgSmF2YSBlbnVtcyBhbmQgdHlwZXNhZmUgZW51bXMgYXBwcm9hY2gpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgdHlwZXNhZmUgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggYnVnIHVzaW5nICVyZW5hbWUgb24gZW51bSBpdGVtcyBhbmQgd2hlbiB1c2luZwogICAgICAgICAgICAlamF2YWNvbnN0KDEpIC8gJWNzY29uc3QoMSkKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKE9iaikgT2JqZWN0OwogICAgICAgICAgICAgICAgZW51bSBHcmFtbWFyIHsgU3ViamVjdCwgT2JqZWN0IH07CgowNC8yOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE1pbm9yIGZpeGVzIHdoZW4gdXNpbmcgY29tYmluYXRpb25zIG9mIHRoZSAKICAgICAgICAgICAgamF2YWludGVyZmFjZXMsIGphdmFiYXNlLCBjc2ludGVyZmFjZXMgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCjA1LzE4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKVk0gbGluayBmYWlsdXJlIG9uIHNvbWUgc3lzdGVtcyBmaXhlZCB3aGVuIHVzaW5nIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgQWxzbyBhZGRzIGRlZmF1bHQgdmVjdG9yIGNvbnN0cnVjdG9yIGZvciB1c2UgZnJvbSBKYXZhLgoKMDUvMTcvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoKCSAgICBbR3VpbGVdIE5ldyBydW50aW1lIGZ1bmN0aW9ucyBTV0lHX1BvaW50ZXJBZGRyZXNzLAoJICAgIFNXSUdfUG9pbnRlclR5cGUsIFNXSUdfSXNQb2ludGVyT2ZUeXBlLCBTV0lHX0lzUG9pbnRlci4KCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHdyYXAgc2V2ZXJhbCBTV0lHIHJ1bnRpbWUgZnVuY3Rpb25zCgkgICAgYW5kIGV4cG9ydCB0aGVtIGludG8gdGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKS4gIFRoZQoJICAgIHJ1bnRpbWUgbW9kdWxlIGlzIG5vdyBidWlsdCB3aXRoICJtb2R1bGUiIGxpbmthZ2UuCgoJICAgIFtHdWlsZV0gR09PUFMgcHJveHkgb2JqZWN0cyBub3cgYWxzbyBwcmludCB0aGUgcG9pbnRlcgoJICAgIGFkZHJlc3Mgb2YgdGhlIEMgb2JqZWN0LgoKMDUvMTQvMjAwNDogbHlsZQogICAgICAgICAgICBBZGRlZCBLb3UncyBwYXRjaCBmb3IgdGhlIFJ1YnkgJWltcG9ydCBkaXJlY3RpdmUgc28gdGhhdCBtb2R1bGVzCiAgICAgICAgICAgIHdpdGggIm5lc3RlZCIgbmFtZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkuIENvbnNpZGVyIGFuIGludGVyZmFjZQogICAgICAgICAgICBmaWxlIGZvby5pIHRoYXQgaGFzIHRoaXMgJW1vZHVsZSBkZWNsYXJhdGlvbiBhdCBpdHMgdG9wOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIm1pc2M6OnRleHQ6OmZvbyIKCiAgICAgICAgICAgIE5vdyBjb25zaWRlciBhbm90aGVyIGludGVyZmFjZSBmaWxlIHNwYW0uaSB0aGF0IGltcG9ydHMgZm9vLmk6CgogICAgICAgICAgICAgICAgJWltcG9ydCBmb28uaQogICAgICAgICAgICAKICAgICAgICAgICAgQmVmb3JlIHRoaXMgcGF0Y2gsIHRoaXMgd291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29kZSBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIHNwYW1fd3JhcC5jOgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2M6OnRleHQ6OmZvbyIpOwoKICAgICAgICAgICAgV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UnbGwgZ2V0IHRoZSBjb3JyZWN0IHBhdGggbmFtZQogICAgICAgICAgICBmb3IgdGhlIGNhbGwgdG8gcmJfcmVxdWlyZSgpLCBlLmcuCgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYy90ZXh0L2ZvbyIpOwoKICAgICAgICAgICAgU2VlIFNvdXJjZUZvcmdlIEJ1ZyAjOTI4Mjk5LgoKMDUvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZm9yIGVtaXR0aW5nIGRpcmVjdG9ycyB3aGVuICVmZWF0dXJlKCJkaXJlY3RvciIpIHNwZWNpZmllZAogICAgICAgICAgICBmb3IgYSBjbGFzcyB3aXRoIG5vIHZpcnR1YWwgbWV0aG9kcywgYnV0IGRvZXMgaGF2ZSBhIHZpcnR1YWwgZGVzdHJ1Y3Rvci4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEtldmluIFNtaXRoLgoKMDUvMDYvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBTV0lHIHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUHJldHR5TmFtZSwgd2hpY2ggCgkgICAgcmV0dXJucyBhbiB1bm1hbmdsZWQgdHlwZSBuYW1lIGZvciBhIHN3aWdfdHlwZV9pbmZvCgkgICAgb2JqZWN0LiAKCgkgICAgW0d1aWxlXTogVXNlIGl0IGZvciBwcmludGluZyBwb2ludGVyIG9iamVjdHMuCgowNS8wMy8yMDA0OiAgZGFuY3kgKEFobW9uIERhbmN5KQoKCSogTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnOiAgVXBkYXRlZCBjb21tZW50cyBhYm91dCBpZGVudGlmZXIKCWNvbnZlcnNpb24uICAKCgkqIFNvdXJjZXMvTW9kdWxlcy9hbGxlZ3JvY2wuY3h4OiAgUmVnaXN0ZXIgL2Rldi9udWxsIGZvciAiaGVhZGVyIgoJdGFyZ2V0LiAgIEFsc28sIGRpc3JlZ2FyZCAiY29uc3QiIHF1YWxpZmllcnMgZHVyaW5nIHR5cGUKCWNvbnZlcnNpb24uICAKCgkKMDUvMDIvMjAwNDogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEZpeCBidWcgNzgyNDY4LgoJICAgIFRvIGZpeCB0aGlzIGJ1ZywgdGhlIHJ1bnRpbWUgY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4sIGFuZAoJICAgIHBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgYSBDX1NXSUdfUE9JTlRFUl9UWVBFLgoKCSAgICBDaGlja2VuIHZlcnNpb24gPiAxLjQwIGlzIG5vdyByZXF1aXJlZCEKCgkgICAgKiBUeXBlbWFwIGluY29tcGF0aWJpbGl0eTogIHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgY2hpY2tlbl93b3Jkcy4KCSAgICAgIElmIGEgdHlwZW1hcCBuZWVkcyBzb21lIHNwYWNlLCBpdCBzaG91bGQganVzdCBjYWxsIENfYWxsb2MKCgkgICAgKiBhcmdvdXQgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSB0aGUgLyogaWYgT05FICovIGNvbnN0cnVjdCB0bwoJICAgICAgYnVpbGQgYW4gb3V0cHV0IGxpc3QuICBBIFNXSUdfQVBQRU5EX1ZBTFVFIG1hY3JvLCBleGFjdGx5IGxpa2UKCSAgICAgIGd1aWxlIGFuZCBtenNjaGVtZSBpcyBub3cgdXNlZC4KCjA0LzI1LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIHRoZSBnZW5lcmF0ZWQgR09PUFMgY29kZSwgZG9uJ3QgY3JlYXRlIG1ldGhvZHMKCSAgICB0aGF0IHdvdWxkIG5vdCBzcGVjaWFsaXplIGFueSBhcmd1bWVudHM7IHNpbXBseSByZS1leHBvcnQKCSAgICB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucy4gIChUaGlzIGlzIGEgcGVyZm9ybWFuY2UKCSAgICBvcHRpbWl6YXRpb24gd2hpY2ggcmVkdWNlcyBsb2FkIHRpbWUgYW5kIGV4ZWN1dGlvbiB0aW1lLikKCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZml4IHRoZSAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIiBlcnJvcgoJICAgIHdoaWNoIHdhcyBjYXVzZWQgYnkgYW4gaW5jb21wYXRpYmxlIHN3aWdfdHlwZV9pbmZvIGxheW91dC4KCgkgICAgW0d1aWxlXSBUaGUgdHlwZW1hcCBmb3IgRklMRSAqIGluIHBvcnRzLmkgbm93IGFsc28gYWNjZXB0cwoJICAgIGEgcmVndWxhciBGSUxFICogcG9pbnRlciBvYmplY3QuICBBbHNvIGEgYnVnIHdpdGggU2NoZW1lCgkgICAgZmlsZSBwb3J0cyB0aGF0IGFyZSBvcGVuIGZvciBpbnB1dCBhbmQgb3V0cHV0IGhhcyBiZWVuCgkgICAgZml4ZWQuIAoKMDQvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlIGVudHJ5IDAzLzIxLzIwMDQgcmV2b2tlZC4gVGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGFub3RoZXIKICAgICAgICAgICAgaW5jb25zaXN0ZW5jeSAocmVmZXJlbmNlIHR5cGVtYXBzIGJlaW5ncyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlciB0eXBlbWFwcyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHN0YXRpYwogICAgICAgICAgICBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIGZvciBzb21lIGxhbmd1YWdlcywKICAgICAgICAgICAgYnV0IG9ubHkgZm9yIEMrKyBhbmQgbm90IEMpLiBUaGlzIHdvdWxkIGJyZWFrIHVzZXIncyBjdXJyZW50CiAgICAgICAgICAgIHR5cGVtYXBzIGFuZCBpbnRyb2R1Y2UgZnVydGhlciBpbmNvbnNpc3RlbmNpZXMuIEFsdGVybmF0aXZlCiAgICAgICAgICAgIHNvbHV0aW9uIHJlcXVpcmVkIGFuZCBiZWluZyBkaXNjdXNzZWQuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIEFkZGVkIHRoZSAtZGlyZWN0b3JzIGZsYWcuIFRoaXMgZW5hYmxlcyB0aGUgZGlyZWN0b3IKCSAgICBtb2RlIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBhbGwgdGhlIGNsYXNzZXMgdGhhdAoJICAgIGRvbid0IHNldCB0aGUgImZlYXR1cmU6bm9kaXJlY3RvciIgZXhwbGljaXRseS4KCgkgICAgWW91IGNhbiB1c2UgdGhpcyBpbiB5b3VyIG1vZHVsZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlCgkgICAgZGlyZWN0b3IgZmVhdHVyZSBpbiBhbGwgeW91ciBjbGFzc2VzLCBidXQgaXQgaXMgbW9zdAoJICAgIGludGVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBsaWtlOgoKCSAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoKCSAgICBUaGVzZSBjb21tYW5kcyB3aWxsIHJ1biB0aGUgZW50aXJlIHRlc3Qtc3VpdGUgdXNpbmcKCSAgICBkaXJlY3RvcnMsIGFuZCBub3Qgb25seSB0aGUgc3BlY2lmaWMgJ2RpcmVjdG9yc18qJwoJICAgIGNhc2VzLiBUaGlzIHNob3VsZCBiZSBkb25lIGZyb20gdGltZSB0byB0aW1lLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QsCgkgICAgZm9yIGNvbXBpbGVyIGFuZCBweXRob24gdmVyc2lvbnMgdGhhdCBzdXBwb3J0IHRoZW0uCgkgICAgCgkgICAgV2hlbiBuZWVkZWQsIHVzZSAKCgkgICAgICVpbmxjdWRlIHN0ZF9zdHJpbmcuaSAgICAgIC8vICdjaGFyJyBzdHJpbmdzCgkgICAgICVpbmxjdWRlIHN0ZF93c3RyaW5nLmkgICAgIC8vICd3Y2hhcl90JyBzdHJpbmdzCgkgICAgCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEZpeCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgKHNlZy4gZmF1bHQpIHdoZW4gYW4KCSAgICBpbnBsYWNlIG9wZXJhdG9yICgrPSwtPSwuLi4pIHdhcyB3cmFwcGVkLCBhcyByZXBvcnRlZCBieQoJICAgIEx1Y3JpeiAobHVjcml6QHNpdGlsYW5kaWEuaXQpLCB3aGVuIHRoZSBtb3N0IGNvbW1vbgoJICAgIGZvcm0gd2FzIHVzZWQ6CgogICAgICAgICAgICAgICAgICAgQSYgIEE6Om9wZXJhdG9yKz0oaW50IGkpIHsgLi4uOyByZXR1cm4gKnRoaXM7IH0KICAgICAgICAgICAgICAgICAgXl5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgoJICAgIAoKCSAgICBpZSwgYW4gb2JqZWN0IGlzIHJldHVybmVkIGFuZCBpdHMgY29udGFpbnMgdGhlIHNhbWUgJ3RoaXMnCgkgICAgdmFsdWUgdGhhbiB0aGUgaW5wdXQgb2JqZWN0LCB3aGljaCBpcyBkZWxldGVkIGFmdGVyIHRoZQoJICAgIG9wZXJhdGlvbiAiYSArPSBiIiwgbGVhdmluZyB0aGUgcmVzdWx0IHdpdGggbm8gcmVhbAoJICAgIG9iamVjdCwgYnV0IGEgc2VnLiBmYXVsdC4KCgkgICAgVG8gZml4IGl0LCB3ZSBuZWVkZWQgdG8gaW50cm9kdWNlIGEgbmV3IGZlYXR1cmUgYW5kIHVzZSBhbgoJICAgIG9sZCBvbmU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IikgQTo6b3BlcmF0b3IrPTsKCSAgICAKCSAgICBoZXJlLCAic2VsZjpkaXNvd24iIGRpc2FibGUgdGhlIG93bmVyc2hpcCBvZiB0aGUgJ3NlbGYnCgkgICAgb3IgaW5wdXQgb2JqZWN0LCBhbmQgdGhlICJuZXciIGZlYXR1cmUgdHJhbnNmZXJzIHRoZQoJICAgIG93bmVyc2hpcCB0byB0aGUgcmVzdWx0IG9iamVjdC4KCSAgICAKCSAgICBUaGUgZmVhdHVyZS9zb2x1dGlvbiBjb3VsZCBhbHNvIGJlIHVzZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCB1c2UgZ2MgYW5kIGltcGxlbWVudCB0aGUgaW5wbGFjZSBvcGVyYXRvcnMsIG9yIG90aGVyCgkgICAgb3BlcmF0b3JzLCBpbiBhIHNpbWlsYXIgd2F5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFB5dGhvbiBNT0RVTEUgKioqCgoJICAgIElmIHlvdSBhbHJlYWR5IGFyZSB1c2luZyB0aGUgaW5wbGFjZSBvcGVyYXRvcnMgaW4gcHl0aG9uLAoJICAgIGFuZCB5b3UgaW1wbGVtZW50ZWQgc29tZSBraW5kIG9mIHdvcmthcm91bmQgdG8gdGhlIHByb2JsZW0KCSAgICBmaXhlZCBoZXJlLCBpdCBpcyBwb3NzaWJsZSB5b3UgY291bGQgZW5kIHdpdGggJ2ZyZWUnCgkgICAgb2JqZWN0cyB0aGF0IG5ldmVyIGdldCBkZWxldGVkLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBhbmQKCSAgICB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjdXJyZW50IGZpeCwgdXNlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIiwiIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIsIiIpIEE6Om9wZXJhdG9yKz07CgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQysrIGVudW1zIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBpbnRlZ2VycywgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgCiAgICAgICAgICAgIEMjIGVudW1zLiBGb3IgRXhhbXBsZSwgZ2l2ZW4gQysrOgoKICAgICAgICAgICAgICAgIGVudW0gQW5FbnVtIHsgZm9vLCBiYXIgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgQW5FbnVtIEFuRW51bWVyYXRpb247CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtZXJhdGlvbiBmKTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBlbnVtIEFuRW51bSB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW0gZikgey4uLn0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBhIGdsb2JhbCBlbnVtIGxpa2UgQW5FbnVtIGFib3ZlIGlzIGdlbmVyYXRlZCBpbnRvIGl0cyBvd24KICAgICAgICAgICAgZmlsZSBjYWxsZWQgQW5FbnVtLmNzLiBFbnVtcyBkZWZpbmVkIHdpdGhpbiBhIEMrKyBjbGFzcyBhcmUgZGVmaW5lZAogICAgICAgICAgICB3aXRoaW4gdGhlIEMjIHByb3h5IGNsYXNzLiBTb21lIG9mIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nIEMjIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMgYWxzbyB3b3JrIGZvciBlbnVtcy4gRm9yIGV4YW1wbGUgZ2xvYmFsIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2ltcG9ydHMpIHRvIGFkZCBpbiBleHRyYSB1c2luZyBzdGF0ZW1lbnRzLgoKICAgICAgICAgICAgR2xvYmFsIGVudW1zIGFuZCBjbGFzcyBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgdG8gbWFrZSB0aGUgZW51bSBwcml2YXRlLCBwdWJsaWMgZXRjLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZW51bSB0eXBlIChlbnVtIGJhc2UpCgogICAgICAgICAgICBJZiB3ZSBhZGQgdGhpcyBmb3IgdGhlIGFib3ZlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgQW5FbnVtICJwcm90ZWN0ZWQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIEFuRW51bSAibG9uZyIKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb3RlY3RlZCBlbnVtIEFuRW51bSA6IGxvbmcgewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBlbXB0eSBlbnVtcywgbGlrZQogICAgICAgICAgICAgICAgZW51bSBGb28ge307CgowMy8yMS8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW05vdGU6IHRoaXMgY2hhbmdlIHJldm9rZWQgb24gMDQvMjUvMjAwNF0KCSAgICBbUHl0aG9uXSBNYWtlcyB0aGUgZm9sbG93aW5nICd2YXInIGNhc2VzIG1vcmUgdW5pZm9ybToKCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBnYTsKIAogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2E7CiAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBub3cgdGhlIHRocmVlIHZhcmlhYmxlcyAoZ2EsIHNhLCBtYSkgY2FuIGJlIGFzc2lnbmVkIGFzOgoKCiAgICAgICAgICAgICAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBBLnNhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgYS5tYSA9ICJoZWxsbyI7CgogICAgICAgICAgICBpZSwgbm93ICdtYScgd2lsbCBhbHNvIHVzZSBhIHN0ZDo6c3RyaW5nIHR5cGVtYXAgJ2luJyBpZgogICAgICAgICAgICBkZWZpbmVkLCBiZWZvcmUgaXQgd2FzIG9ubHkgYWNjZXB0aW5nIGEgJ3Bfc3RkX3N0cmluZycKICAgICAgICAgICAgcG9pbnRlci4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgJ21hJyB3aWxsIG5vdCB1c2UgdGhlCiAgICAgICAgICAgICd2YXJpbi92YXJvdXQnIHR5cGVtYXBzICh0aGF0IHByb2JhYmx5IGNvdWxkIGJlIG1vcmUKICAgICAgICAgICAgbmF0dXJhbCksIGJ1dCBpdCB3aWxsIHBpY2sgdXAgdGhlICdpbicgdHlwZW1hcCBmb3IgY29uc3QKICAgICAgICAgICAgc3RkOjpzdHJpbmcmICh3aGljaCBpcyBlYXNpZXIpLgoKCSAgICBUaGUgY2hhbmdlcyBpbiBjd3JhcC5jIGFuZCBsYW5nLmN4eCB3aWxsIHByb2JhYmx5IGZpeCB0aGUKCSAgICBiZWhhdmlvdXIgaW4gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IG92ZXJsb2FkIHRoZQoJICAgIG1lbWJlcnZhckhhbmRsZXIgbWV0aG9kICJ0b28gbXVjaCIuCiAKICAgICAgICAgICAgCjAzLzIxLzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIERpc2FibGluZyB0aGUgZGVmYXVsdCBpbnN0YW50aWF0aW9ucyBsaWtlOgoKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxpbnQsaW50PjsKCiAgICAgICAgICAgIGZvciBhbGwgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgU1RMIGNvbnRhaW5lcnMvY2xhc3Nlcy4KCSAgICBUaGV5IGFyZSBleHBlbnNpdmUsIHNwZWNpYWxseSBmb3IgcGFpciBhbmQgbWFwLCBhbmQgdGhlCgkgICAgcHJldmlvdXMgYmVoYXZpb3VyIGFsc28gcmVxdWlyZXMgdGhlIHVzZXIgdG8gcGVyZm9ybQoJICAgIG1hbnVhbCBpbnN0YW50aWF0aW9ucy4gU3RpbGwsIGlmIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGlzCgkgICAgbm90IGltcG9ydGFudCwgaXQgY2FuIGJlIHJlLWVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIG1hY3JvCgkgICAgU1dJR19TVERfREVGQVVMVF9JTlNUQU5USUFUSU9OIChzZWUgc3RkX2NvbW1vbi5pKS4KCgkgICAgQWxzbywgbm9ybWFsaXppbmcgdGhlIElOUFVUL09VVFBVVC9JTk9VVCB0eXBlbWFwcy4gTm93CgkgICAgdGhleSB1c2UgdGhlIHNhbWUgY29udmVyc29ycyB0aGFuIHRoZSByZXN0IG9mIHRoZQoJICAgIHR5cGVtYXBzLCBhbmQgeW91IGNhbiB1c2UgdGhlbSBmb3Igc3RkOjpwYWlyLCBzdGQ6OnN0cmluZwoJICAgIGFuZCBhbGwgdGhlIG90aGVyIFNUTCB0eXBlcywgbGlrZSBpbjoKCgkgICAgICB2b2lkIHBfaW5vdXRkKHN0ZDo6cGFpcjxkb3VibGUsIGRvdWJsZT4gKklOT1VUKTsKCgkgICAgQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGFuZCBpbXBsaWNpdC5pIGZpbGVzIHdpdGggbWFjcm9zIHRvCgkgICAgdHJhbnNmb3JtIGZ1bmN0aW9ucyBwYWlycyBsaWtlICdzZXRfeCcvJ2dldF94JyAKCSAgICAob3IgJ1QmIHgoKScvJ2NvbnN0IFQmIHgoKSBjb25zdCcpIGludG8gYW4gYXR0cmlidXRlLAoJICAgIGFuZCBhbGxvd2luZyB0aGUgdXNlIG9mIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBpbiB0eXBlbWFwcwoJICAgIChzZWUgdGhlIGZpbGVzIGZvciBtb3JlIGRldGFpbHMpLgoKMDMvMjEvMjAwNDogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZ3Mgb2YgZnVuY3Rpb25zIHdpdGgKCSAgICBhbm9ueW1vdXMgYXJndW1lbnRzLgoKMDMvMTgvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gTW9yZSBnZW5lcmFsIHN0ZF9zdHJpbmcuaSBpbnRlcmZhY2UuCgkgICAgTm93IHlvdSBjYW4gd3JhcCBpdCB1c2luZwoKCSAgICAgICV0ZW1wbGF0ZShzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OwoKICAgICAgICAgICAgYW5kIHVzZSB0aGUgc3RkOjpzdHJpbmcgYXMgYSBiYXNlIGNsYXNzOgoKCSAgICAgIHN0cnVjdCBBIDogc3RkOjpzdHJpbmcgewogICAgICAgICAgICAgIH07CgoJICAgIEJ1dCBtb3JlIGltcG9ydGFudCwgc3dpZyB3aWxsIHJlY29nbml6ZSAKCSAgICBib3RoIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+IGFuZCBzdGQ6OnN0cmluZyBhcwoJICAgIHRoZSBzYW1lIHR5cGUuCgowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBQcmV2aW91c2x5IGFkZGVkLCBidXQgbm90IG1lbnRpb25lZCBiZWZvcmU6CgoJICAgIC0gZnJpZW5kIGRlY2xhcmF0aW9uIHN1cHBvcnQsIHN3aWcgbm93IGVtaXRzIGEgZ2xvYmFsCgkgICAgICBmdW5jdGlvbiBpbiB0aGUgc2FtZSBjbGFzcyBzY29wZS4KCgkgICAgLSByZWYvdW5yZWYgZmVhdHVyZXM6IHRvIG1peCByZWYgY291bnRpbmcgQysrIGNsYXNzZXMKCSAgICAgIGFuZCBuYXRpdmUgc2NyaXB0IHJlZiBjb3VudGluZyBtZWNoYW5pc21zIChsaWtlIGluIHB5dGhvbikuCgkgICAgCgkgICAgICBVc2UgaXQgbGlrZToKCiAJICAgICAgICAlZmVhdHVyZSgicmVmIikgICBSQ09iaiAiJHRoaXMtPnJlZigpOyIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ1bnJlZiIpIFJDT2JqICIkdGhpcy0+dW5yZWYoKTsiCgoJICAgICAgQW5kIHRoZSBjbGFzcyBSQ09iaiwgYW5kIGFsbCB0aGUgZGVyaXZlZCBvbmVzLCB3aWxsCgkgICAgICBwZXJmb3JtIHRoZSByaWdodCByZWYvdW5yZWYgY2FsbHMgd2hlbiBhIG5ldyBwb2ludGVyICAKCSAgICAgIGlzIHJldHVybmVkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIG9yIHdoZW4gdGhlIHRhcmdldAoJICAgICAgbGFuZ3VhZ2UgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZSBvYmplY3QuCgkgICAgICAKCSAgICAgIFNlZSB0aGUgcmVmY291bnQuaSBmaWxlIGluIHRoZSB0ZXN0LXN1aXRlIGZvciBtb3JlCgkgICAgICBkZXRhaWxzLgoKCSAgICAKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gVXNpbmcgdGhlIG5ldyAlZnJhZ21lbnQgc3VwcG9ydCwgbWFqb3IgcmV3cm90ZSAKCSAgICBvZiB0aGUgcHl0aG9uIHN3aWcgbGlicmFyeSwgaW5jbHVkaW5nOgoKCSAgICAtIEFsbW9zdCBhdXRvbWF0aWMgdGVtcGxhdGUvdHlwZW1hcCBpbnN0YW50aWF0aW9uIGZvcgoJICAgICAgdGhlIFNUTCBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgbm93IHlvdSBjYW4gd3JpdGU6CgoJCSAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgYW5kIGEgc3BlY2lhbGl6ZWQgdmVjdG9yX2kgY2xhc3MgaXMgZW1pdHRlZCB3aXRoIGFsbAoJICAgICAgdGhlIG5lZWRlZCB0eXBlbWFwcy4gTm8gbmVlZCB0byB1c2UgdGhlIG9sZAoJICAgICAgJ3NwZWNpYWxpemVfdmVjdG9yJyBtYWNyb3MuCgoJICAgICAgTm90ZSB5b3UgY2FuIGFsc28gZGVmaW5lCgoJICAgICAgICAgICV0ZW1wbGF0ZShtYXRyaXhfaSkgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID47CgkgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9waWkpIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsaW50PiA+OwoKCSAgICAtIFRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogCSAKICAgICAgICAgICAJICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIGRlZmluZXMgdGhlIHZlY3RvciB0eXBlbWFwcywgYnV0IG5vIHByb3h5IGNsYXNzLiBGb3IgYWxsIHRoZQogICAgICAgICAgICAgIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBhcmUKICAgICAgICAgICAgICBkZWZpbmVkLCBzbywgeW91IGNhbiBzYXkKCgkgICAgICAlaW5jbHVkZSBzdGRfdmVjdG9yCgoJICAgICAgaW50IGZ1bmMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYSk7CgkgICAgICAKCSAgICAgIHdoZXJlIHRoZSBwcm9wZXIgdHlwZW1hcCBpcyBhcHBsaWVkIHRvICdhJywgYnV0IG5vCgkgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHByb3h5IGlzIGdlbmVyYXRlZC4KCSAgICAgIAoKICAgICAgICAgICAgLSBBbGwgdGhlIFNUTCBjb250YWluZXJzIHByZXNlbnQgYSBtb3JlIHVuaWZvcm0gYmVoYXZpb3IgYW5kCgkgICAgICBtb3JlIGNvbXBsZXRlIGludGVyZmFjZSBkZWNsYXJhdGlvbi4gVGhlIGZvbGxvd2luZyBhcmUgCgkgICAgICBub3cgc3VwcG9ydGVkOgoKCQkgIHN0ZDo6dmVjdG9yPFQ+CgkJICBzdGQ6Omxpc3Q8VD4KCQkgIHN0ZDo6ZGVxdWU8VD4KCQkgIHN0ZDo6c2V0PFQ+CgkJICBzdGQ6Om11bHRpc2V0PFQ+CgkJICBzdGQ6Om1hcDxUPgoJCSAgc3RkOjptdWx0aW1hcDxUPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIG5vdCBhIGNvbnRhaW5lciwgYnV0IGFsc28gc3VwcG9ydGVkOgoKCQkgIHN0ZDo6cGFpcjxULFU+CgogICAgICAgICAgICAgIGFsc28sIG1vcmUgdHlwZW1hcHMgYXJlIGRlZmluZWQgZm9yIGFsbCBvZiB0aGVtLAoJICAgICAgaW5jbHVkaW5nIHZhcmluLCB2YXJvdXQsIHR5cGVjaGVjaywgZXRjLgoKICAgICAgICAgICAgLSBJbml0aWFsIGF0dGVtcHQgdG8gaW1wbGVtZW50IHRoZSBTVEwgY29udGFpbmVycwogICAgICAgICAgICAgIGNvbnNpZGVyaW5nIGFsbG9jYXRvcnMsIGllOgoKCSAgICAgICAgICBzdGQ6OnZlY3RvcjxULEE+CQkJCgoJICAgICAgaXQgaXMgcGFydGlhbGx5IHdvcmtpbmcsIGJ1dCBpdCBpcyBqdXN0IGEgd29ya2Fyb3VuZAoJICAgICAgd2hpbGUgc3dpZyBpbXByb3ZlcyBpdHMgdGVtcGxhdGUgdHlwZSBzdXBwb3J0LgoJICAgICAgCgkgICAgICAKCSAgICAgUGxlYXNlIHRlc3Qgd2l0aCB5b3VyIHBhcnRpY3VsYXIgc2V0dXAuIEl0IHNlZW1zIHRvIGJlCgkgICAgIHdvcmtpbmcgd2l0aCBnKysgMy4yLjIsIGcrKyAyLjk2LCBJbnRlbCBpY2MgYW5kIFNHSSBDQwoJICAgICBjb21waWxlcnMsIHBsdXMgcHl0aG9uIDEuNS4yLCAyLjAgYW5kIDIuMywgYnV0IHNpbmNlCgkgICAgIHdlIGFyZSB1c2luZyB0ZW1wbGF0ZXMsIHRoZXJlIGlzIGEgY2hhbmNlIHlvdSBjYW4gZmluZAoJICAgICBzb21lIHByb2JsZW1zIHdoZW4gdXNpbmcgd2l0aCBhbiBvbGQgQysrIGNvbXBpbGVyLgoKMDMvMTYvMjAwNDogbW1hdHVzCgogICAgICAgICAgICAtIEFsbG93aW5nIHRoZSBlbXB0eSAldGVtcGxhdGUgZGlyZWN0aXZlLCBzdWNoIGFzCgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgdG8gcHJvY2VzcyB0aGUgY2xhc3MgInR5cGVkZWYicyBhbmQgInR5cGVtYXAicy4gQmVmb3JlCgkgICAgICBvbmx5IHRoZSBpbnRlcm5hbCAidHlwZWRlZiJzIHdlcmUgcHJvY2Vzc2VkLgoKICAgICAgICAgICAgICBUaGlzIG1ha2VzIHBvc3NpYmxlIHRvIGVtaXQgdGhlIGRlZmF1bHQgaW4vb3V0CiAgICAgICAgICAgICAgdHlwZW1hcHMgd2l0aG91dCB0aGUgbmVlZCBvZiB3cmFwcGluZyBhbiBzcGVjaWFsaXplZAogICAgICAgICAgICAgIHZlY3RvciBpbnN0YW5jZS4KCgkgICAgLSBBZGRpbmcgdGhlIHByZXByb2Nlc3NvciBleHRlbnNpb24gI0Agd2hpY2ggbWFuZ2xlcyB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgbWFjcm8gYXJndW1lbnQsIGxpa2UgaW46CgogICAgICAgICAgICAgICAgI2RlZmluZSBtYWNybyhYKSAgI0BYCiAgICAgICAgICAgICAgICBtYWNybyhpbnQpICAgICAgICAgLT4gaW50CiAgICAgICAgICAgICAgICBtYWNybyhzdGQ6OnN0cmluZykgLT4gc3RkX3Nfc19zdHJpbmcKICAgICAgICAgICAgICAgIAoJICAgIC0gRnJhZ21lbnRzIGNhbiBub3cgYmUgInR5cGUgc3BlY2lhbGl6ZWQiLCBhcyB0aGUgdHlwZW1hcHMuIFRoZQoJICAgICAgc3ludGF4IGlzIGFzIGZvbGxvd3MKIAogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiwiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogYSB0eXBlIGluZGVwZW5kZW50IGZyYWdtZW50IChvbGQgc3ludGF4KSAqLyB9CiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiIHtUeXBlfSwgImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIHRoZSBmcmFnbWVudCBpcyB0eXBlIGRlcGVuZGVudCAqL30KIAogICAgICAgICAgICAgIE5vdyBmcmFnbWVudHMgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzOiAKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICVmcmFnbWVudCgiaW5jb2RlIntBPFQ+fSwiaGVhZGVyIikgewoJCSAgICAgIC8qICdpbmNvZGUnIHNwZWNpYWxpemVkIGZyYWdtZW50ICovCgkJICAgfQogCgkJICAgJXR5cGVtYXAoaW4sZnJhZ21lbnQ9ImluY29kZSJ7QTxUPn0pIHsKCQkgICAgICAvKgoJCSAgICAgICAgIGhlcmUgd2UgdXNlIHRoZSAndHlwZSBzcGVjaWFsaXplZCcgCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCAiaW5jb2RlIntBPFQ+fQogICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgfQogICAgICAgICAgICAgICAgfTsKCQkJICAgICAJCgowMy8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIGJ1ZyB3aGljaCBtZWFudCB0aGF0IHNvbWUgdmlydHVhbCBmdW5jdGlvbnMgb3ZlcnJpZGRlbiBpbgogICAgICAgICAgICBKYXZhIHdlcmUgbm90IGJlaW5nIGNhbGxlZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiBCdWcgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgICAgICAgICAgIGJ5IFJvYmVydCBkZSBWcmllcyBhbmQgU2NvdHQgTWljaGVsLgoKMDMvMDIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2hlY2sgdGhlIHR5cGUgb2Ygc3RyaW5nIGFyZ3VtZW50cy4KCjAyLzI0LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW5hbWVzcGFjZSA8bmFtZT4uIFRoaXMgYWxsb3dzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIGEgQyMgbmFtZXNwYWNlIGludG8gd2hpY2ggYWxsIEMjIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KCjAyLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkgCgkgICAgW016U2NoZW1lXSBVc2UgRlVOQ19OQU1FIHJhdGhlciB0aGFuIGEgYm9ndXMgdHlwZW1hcCB2YXJpYWJsZSBmb3Igc2lnbmFsbGluZwoJICAgIGVycm9ycy4gIENhbGwgc2NoZW1lX3dyb25nX3R5cGUgd2l0aCBhIHplcm8tYmFzZWQgYXJndW1lbnQgbnVtYmVyLiAgCgkgICAgUmVwb3J0ZWQgYnkgT25kcmVqIFBhY292c2t5LCBTRiAjOTAyNjIxLgoKCSAgICBbR3VpbGVdIERlZmluZSBGVU5DX05BTUUgYWxzbyBpbiB0aGUgZGlzcGF0Y2ggd3JhcHBlciBmb3Igb3ZlcmxvYWRlZAoJICAgIGZ1bmN0aW9ucy4gIFBhdGNoIGJ5IEpvaG4gTGVueiwgU0YgIzg5NjI1NS4KCjAyLzIyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgdHJ5IHRvIGludm9rZSBhIG51bGwgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KCjAyLzIwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBzbyB0aGF0IHRoZSBTV0lHIHNvdXJjZSB3aWxsIGNvbXBpbGUgdXNpbmcgdGhlIERpZ2l0YWwgTWFycyBDb21waWxlcgogICAgICAgICAgICAoZm9ybWVybHkgU3ltYW50aWMgY29tcGlsZXIpIG9uIFdpbmRvd3MuIFN1Ym1pdHRlZCBieSBTY290dCBNaWNoZWwuCgowMi8xMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBOZXcgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1ub2luaXQuICBVc2UgaXQgZm9yIGJ1aWxkaW5nCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyeSwgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIGZ1bmN0aW9ucwoJICAgIHNjaGVtZV9pbml0aWFsaXplIGV0Yy4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTc1NC4KCgkgICAgW016U2NoZW1lXSBEb24ndCBwcm9kdWNlIGludmFsaWQgQyBjb2RlIHdoZW4gaW52b2tlZCB3aXRoIHRoZQoJICAgIC1kZWNsYXJlbW9kdWxlIG9wdGlvbi4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTEwOC4KCSAgICAKCSAgICBbR3VpbGVdIEJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcnkgd2l0aCBwYXNzaXZlIGxpbmthZ2UsIHRvIHJlbmFtZQoJICAgIHRoZSBTV0lHX2luaXQgZnVuY3Rpb24gdW5pcXVlbHkuCgowMi8xMi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCBzdWJtaXR0ZWQgYnkgQmlsbCBIb2ZmbWFuIHdoaWNoIHByZXZlbnRzIFNXSUcgZnJvbSBjcmFzaGluZwogICAgICAgICAgICB3aGVuIGEgZmlsZSBmb3IgdGhlIHR5cGV3cmFwcGVyIGNsYXNzIGNhbm5vdCBiZSBvcGVuZWQuCgowMi8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBPdmVybG9hZGluZyBjaGFuZ2VzOgogICAgICAgICAgICAgIC0gTWV0aG9kcyB3aGljaCBhcmUgb3ZlcmxvYWRlZCBpbiBjb25zdCBvbmx5IG5vIGxvbmdlciBnZW5lcmF0ZSBKYXZhCiAgICAgICAgICAgICAgICBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZSAtIHRoZSBmaXJzdCBtZXRob2QgcGFyc2VkIGlzIHVzZWQgYW5kIGEKICAgICAgICAgICAgICAgIHdhcm5pbmcgaXMgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGljaCBhbHdheXMgdXNlcyB0aGUgbm9uLWNvbnN0IG1ldGhvZC4KICAgICAgICAgICAgICAtIFdhcm5pbmcgbWVzc2FnZXMgNTA5IGFuZCA1MTIgcmVwbGFjZWQgYnkgbmV3IHdhcm5pbmcgbnVtYmVyIDUxNiwgd2hpY2ggCiAgICAgICAgICAgICAgICBpcyBtb3JlIHJlbGV2YW50IHRvIHRoZXNlIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIGFzIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgICAgICBtZXRob2RzIGFyZW4ndCAnc2hhZG93ZWQnLCB0aGV5IGFyZSBpZ25vcmVkLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVwbGFjZSB0aGUgImtub3duX2NsYXNzZXMiIGhhc2ggdGFibGUgYnkgYSBub2RlCgkgICAgYXR0cmlidXRlLiAgTWV0aG9kcyBvZiBjbGFzc2VzIGluIEMrKyBuYW1lc3BhY2VzIG5vdyBnZXQKCSAgICB0aGUgcHJvcGVyIHNwZWNpYWxpemVyIGluIHRoZSBHT09QUyBkZWNsYXJhdGlvbi4KCSAgICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFVuaXF1aWZ5IHRoZSBhcmd1bWVudCBuYW1lcyBpbiBHT09QUyBzaGFkb3cgbWV0aG9kCgkgICAgZGVjbGFyYXRpb25zLiAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMS8yMDA0OiBzdW5zaGluZSAoRXJpYyBTdW5zaGluZSkKICAgICAgICAgICAgUmV2aXZlZCB0aGUgTmV4dFN0ZXAgcG9ydCBvZiBTV0lHLgoKICAgICAgICAgICAgRml4ZWQgZmF0YWwgcHJvYmxlbSBpbiBEb2hTdHJzdHIoKSBjYXVzZWQgYnkgZGlmZmVyZW5jZSBpbiBzdHJzdHIoKQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYWRlICVhcHBseSBiZWNvbWUgZW50aXJlbHkgZHlzZnVuY3Rpb25hbC4gIE9uCiAgICAgICAgICAgIE5leHRTdGVwLCBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRlcyB0byBOVUxMOyB3aGVyZWFzLCBvbiBtb2Rlcm4KICAgICAgICAgICAgcGxhdGZvcm1zLCBpdCBldmFsdWF0ZXMgdG8gImZvbyIuICAlYXBwbHkgcmVsaWVzIGV4dGVuc2l2ZWx5IHVwb24KICAgICAgICAgICAgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0aW5nIHRvIG5vbi1OVUxMLCB0aGVyZWZvcmUgaXQgZmFpbGVkCiAgICAgICAgICAgIGNhdGFzdHJvcGhpY2FsbHkgd2hlbiBmYWNlZCB3aXRoIE5leHRTdGVwJ3Mgc3Ryc3RyKCkuCgogICAgICAgICAgICBBZGRlZCBgYm9vbCcgY2hlY2sgdG8gY29uZmlndXJlLmluIHNpbmNlIE5leHRTdGVwJ3MgQysrIGNvbXBpbGVyCiAgICAgICAgICAgIGRvZXMgbm90IHN1cHBseSB0aGlzIHR5cGUuICBzd2lnLmggbm93IGZha2VzIHVwIGBib29sJyBpZiBuZWVkZWQuCgogICAgICAgICAgICBXb3JrZWQgYXJvdW5kIE5leHRTdGVwIEMrKyBjb21waWxlciBidWcgaW4gd2hpY2ggQysrIGNvZGUgaXMKICAgICAgICAgICAgZGlzYWxsb3dlZCBpbnNpZGUgZXh0ZXJuICJDIiBmdW5jdGlvbnMuICBUaGlzIHByb2JsZW0gYWZmZWN0ZWQgYWxsCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMsIHNpbmNlIHRoZXkgcHVibGlzaCBob29rIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICBGaXhlZCBieSBjcmVhdGluZyBhIEMrKyB3cmFwcGVyOgogICAgICAgICAgICAgICAgc3RhdGljIExhbmd1YWdlICpuZXdfc3dpZ19mb28oKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ld19zd2lnX2ZvbygpOyB9CgogICAgICAgICAgICBFbnN1cmVkIHRoYXQgU3dpZ19jb3B5X3N0cmluZygpIGlzIHVzZWQgaW4gcGxhY2Ugb2Ygc3RyZHVwKCkgc2luY2UKICAgICAgICAgICAgTmV4dFN0ZXAgZG9lcyBub3Qgc3VwcGx5IHN0cmR1cCgpLgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFJ1YnkgbGlicmFyeSBuYW1lIGFuZCBsb2NhdGlvbiBpbiBjb25maWd1cmUuaW4uCiAgICAgICAgICAgIFByb2JsZW0gMTogQXNzdW1lZCB0aGF0IGxpYnJhcnkgYWx3YXlzIHJlc2lkZWQgaW4gUnVieSdzICJhcmNoZGlyIiwKICAgICAgICAgICAgd2hpY2ggd2FzIGNvcnJlY3QgZm9yIFJ1YnkgMS42LngsIGJ1dCB3aGljaCBpcyBpbmNvcnJlY3QgZm9yIFJ1YnkKICAgICAgICAgICAgMS44LngsIGluIHdoaWNoIGNhc2UgdGhlIGxpYnJhcnkgbm9ybWFsbHkgcmVzaWRlcyBpbiBSdWJ5J3MKICAgICAgICAgICAgImxpYmRpciIuICBQcm9ibGVtIDI6IEFzc3VtZWQgdGhhdCB0aGUgbGlicmFyeSBjb3VsZCBhbHdheXMgYmUKICAgICAgICAgICAgbGlua2VkIHZpYSAiLWwiK1JVQllfSU5TVEFMTF9OQU1FICh3aGVyZSBSVUJZX0lOU1RBTExfTkFNRQogICAgICAgICAgICB0eXBpY2FsbHkgaXMgInJ1YnkiKSwgaG93ZXZlciB0aGlzIGZhaWxlZCBmb3IgcGxhdGZvcm1zLCBzdWNoIGFzCiAgICAgICAgICAgIE5leHRTdGVwLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgICAgc3RhdGljIGxpYnJhcnkgbmFtZSBpbiAxLjgueCBpcyBsaWJydWJ5LXN0YXRpYy5hLCB0aHVzCiAgICAgICAgICAgIC1scnVieS1zdGF0aWMgaXMgcmVxdWlyZWQuICBUaGUgbmV3IGxvZ2ljIHdvcmtzIGNvcnJlY3RseSBmb3IKICAgICAgICAgICAgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGZvciAxLjYueCBhbmQgMS44LnguCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUGVybCBDRkxBR1MgaW4gY29uZmlndXJlLmluIGZvciBOZXh0U3RlcC4KICAgICAgICAgICAgRGV0ZWN0aW9uIGNvZGUgZXh0cmFjdGVkIENGTEFHUyBmcm9tIFBlcmwncyAlQ29uZmlnIGhhc2ggYnV0CiAgICAgICAgICAgIG5lZ2xlY3RlZCB0byBhZGQgYSBuZXdsaW5lIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdCB0aHJvdWdoCiAgICAgICAgICAgIGBzZWQnLiAgTmV4dFN0ZXAncyBhbmNpZW50IGBzZWQnIGRpc2NhcmRzIGlucHV0IHdoaWNoIGlzIG5vdAogICAgICAgICAgICB0ZXJtaW5hdGVkIHdpdGggYSBuZXdsaW5lLCB0aHVzIFBlcmwgQ0ZMQUdTIGFsd2F5cyBldmFsdWF0ZWQgdG8gdGhlCiAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KCjAxLzE2LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaWR5IHVwIGluIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0aGF0IGlzIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgICAgIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIHdyYXBwZWQgd2l0aCB0aGUgdGhyb3dzIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgcmVkdW5kYW50IGNvZGUgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdzsgCiAgICAgICAgICAgICAgICB9CgowMS8xMi8yMDA0OiB3c2Z1bHRvbiBvbiBiZWhhbGYgb2YgbW1hdHVzIChtYXJjZWxvIG1hdHVzKSAKICAgICAgICAgICAgaWYgYSBtZXRob2QgdXNlcyAlZXhjZXB0aW9uIGFuZCB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSB1c2UKICAgICAgICAgICAgb2YgdGhlIHRocm93cyB0eXBlbWFwLCB0aGUgY29kZSBpbiBhIHRocm93cyB0eXBlbWFwIHdpbGwgYmUKICAgICAgICAgICAgZ2VuZXJhdGVkIGluc2lkZSB0aGUgdHJ5IGJvZHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIG1ldGhvZCB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgRXhjZXB0ICV7CiAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBjbGFzcyBFeGNlcHQge307CiAgICAgICAgICAgICAgdm9pZCBtZXRob2QoaW50IGkpIHRocm93IChFeGNlcHQpOwoKICAgICAgICAgICAgV2lsbCBnZW5lcmF0ZToKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0ICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBBcyBjYW4gYmUgc2VlbiwgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jayBpcyBmb3IgdGhlIHRocm93cyB0eXBlbWFwcy4KICAgICAgICAgICAgUHJldmlvdXNseSwgdGhpcyB3YXMgcmV2ZXJzZWQgc28gdGhhdCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrCiAgICAgICAgICAgIHdhcyB0aGUgJWV4Y2VwdGlvbiBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaXQgd291bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgIGltcG9zc2libGUgdG8gY2F0Y2ggRXhjZXB0IGFzIHRoZSBjYXRjaCBhbGwgKC4uLikgd291bGQgY2F0Y2ggdGhlCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0ZWFkLgoKVmVyc2lvbiAxLjMuMjEgKEphbnVhcnkgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMTAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBvdXRwdXQgZm9ybWF0IGZvciBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgY2FuIGJlIHNlbGVjdGVkIGZvcgogICAgICAgICAgICBpbnRlZ3JhdGlvbiB3aXRoIHlvdXIgZmF2b3VyaXRlIElERS9lZGl0b3IuIEVkaXRvcnMgYW5kIElERXMgY2FuIHVzdWFsbHkKICAgICAgICAgICAgcGFyc2UgZXJyb3IgbWVzc2FnZXMgYW5kIGlmIGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgd2lsbCBlYXNpbHkgdGFrZSB5b3UgCiAgICAgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yLiBUaGUgc3RhbmRhcmQgZm9ybWF0IGlzIHVzZWQgYnkgCiAgICAgICAgICAgIGRlZmF1bHQgZXhjZXB0IG9uIFdpbmRvd3Mgd2hlcmUgdGhlIE1pY3Jvc29mdCBmb3JtYXQgaXMgdXNlZCBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZzdGFuZGFyZCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaTo0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRm1pY3Jvc29mdCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSg0KTogU3ludGF4IGVycm9yIGluIGlucHV0LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg3MTkwOSBdIHNpbXBsZSBuYW1lc3BhY2UgcHJvYmxlbS4KICAgICAgICAgICAgVGhpcyB3YXMgYSBwcm9ibGVtIHVzaW5nIGFub255bW91cyBzdHJ1Y3R1cmVzIGluIGEgbmFtZXNwYWNlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBuOwogICAgICAgICAgICAgICAgICAgfSBTOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIGJyb2tlbiBQZXJsIGV4YW1wbGVzLgoKMTIvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhIGFuZCBDI10gRml4ZXMgZm9yIHdyYXBwaW5nIGNvdmFyaWFudCAocG9seW1vcnBoaWMpIHJldHVybiB0eXBlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXNlKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgQmFzZSogY29weSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIERlcml2ZWQqIGNvcHkoKSBjb25zdDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgRGVyaXZlZDo6Y29weSBwcm94eSBtZXRob2QgcmV0dXJucyBCYXNlIG5vdCBEZXJpdmVkLiBBIHdhcm5pbmcgaXMgaXNzdWVkCiAgICAgICAgICAgIGFib3V0IHRoaXMuIFByZXZpb3VzbHkgdGhlIHBvaW50ZXIgdXNlZCBieSB0aGUgcHJveHkgY2xhc3Mgd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIHRyZWF0ZWQgYXMgYSBCYXNlKiBpbnN0ZWFkIG9mIGEgRGVyaXZlZCouCgoxMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IHNvIHRoYXQgV2luZG93cyBwYXRocyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuCiAgICAgICAgICAgIEFuIGVycm9yIHByZXZpb3VzbHkgd291bGQgaGF2ZSBiZWVuIHNob3duIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICAuP3hhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICAuXGV4YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKClZlcnNpb24gMS4zLjIwIChEZWNlbWJlciAxNywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBMYXN0IG1pbnV0ZSBtb2RpZmljYXRpb25zLiAgIFBlcmw1IG1vZHVsZSBub3cgZ2VuZXJhdGVzIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgIGJ5IGRlZmF1bHQgbGlrZSBhbGwgb2YgdGhlIG90aGVyIG1vZHVsZXMuICBQSFA0IHdyYXBwZXJzIG5vIGxvbmdlcgogICAgICAgICAgICBpbmNsdWRlICJjb25maWcuaCIuIAoKMTIvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBXZWFrZW5lZCB3YXJuaW5nIG1lc3NhZ2UgcmVsYXRlZCB0byBjb25zdHJ1Y3RvciBuYW1lcyBzbyB0aGF0IGFuCiAgICAgICAgICAgIHVudXN1YWwgbmVzdGVkLWNsYXNzIHdyYXBwaW5nIHRlY2huaXF1ZSB3b3VsZCB3b3JrIGFnYWluIChhcHBhcmVudGx5CiAgICAgICAgICAgIGl0IHdvcmtlZCBpbiBzb21lIG9sZGVyIFNXSUcgcmVsZWFzZXMpLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGUgewogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NBOwogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NCOwogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NBIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0IgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogIFRoZXJlIGlzIHN0aWxsIHNvbWUgb2RkIGludGVyYWN0aW9uIHdpdGggdGhlIFNXSUcgc3ltYm9sCiAgICAgICAgICAgIHRhYmxlL3R5cGUgc3lzdGVtIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGxvb2tlZCBhdCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHdXN0YXZvIE5pZW1leWVyLgoKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJvdGVjdGVkIGNsYXNzIG1ldGhvZHMgYXJlIHdyYXBwZWQgYXMgcHJvdGVjdGVkIEphdmEgbWV0aG9kcyAKICAgICAgICAgICAgd2hlbiB1c2luZyB0aGUgZGlycHJvdCBkaXJlY3RvciBmZWF0dXJlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIHRvIHNvbWV0aGluZyBlbHNlIHNob3VsZCB0aGUgbmVlZCBhcmlzZSwgZm9yCiAgICAgICAgICAgIGV4YW1wbGUsIHByaXZhdGUgb3IgcGFja2FnZSBhY2Nlc3MuCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSAKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgKEphdmEpIGFuZCAlY3NtZXRob2Rtb2RpZmllcnMgKEMjKSBvcGVyYXRlIHNsaWdodGx5IAogICAgICAgICAgICBkaWZmZXJlbnRseS4gUHJldmlvdXNseSB0aGlzIGZlYXR1cmUgaGFkIHRvIGJlIHByZXNlbnQgdG8gc2V0IHRoZSBtZXRob2QKICAgICAgICAgICAgbW9kaWZpZXJzLiBOb3cgaXQgaXMgb25seSB1c2VkIGlmIGl0IGV4aXN0cyBmb3IgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLgogICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAicHVibGljIiBhcyBwcmV2aW91cyBob3dldmVyLCB3aGVuIHdyYXBwaW5nIHByb3RlY3RlZAogICAgICAgICAgICBkaXJlY3RvciBtZXRob2RzIGl0IGlzICJwcm90ZWN0ZWQiLiBUaGlzIGNoYW5nZSB3aWxsIG5vdCBhZmZlY3QgZXhpc3RpbmcKICAgICAgICAgICAgdXNlIG9mIHRoZSAlamF2YW1ldGhvZG1vZGlmaWVycyBvciAlY3NtZXRob2Rtb2RpZmllcnMuCgoxMi8xMS8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoaXMgZml4IHNvbWUgcmVjdXJyaW5nIHJlcG9ydHMgYWJvdXQga2V5d29yZHMgbm90IGJlZW4KCSAgICBwcm9wZXJseSBpZGVudGlmaWVkIGFuZCB3YXJuZWQsIGFuZCBpdCBzb2x2ZXMgdGhlIHByb2JsZW0KCSAgICBvZiBob3cgdG8gYWRkIGEgdGVzdCBmaWxlIHRvIHRoZSB0ZXN0LXN1aXRlIHN1Y2ggdGhhdCBpdAoJICAgIGRvZXNuJ3QgdXNlIGFueSBrZXl3b3JkIG9mIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcwoJICAgIChhbmQgZG9pbmcgaXQgd2l0aG91dCBjb21waWxpbmcgdGhlIHRlc3QgZm9yIGFsbCB0aGUKCSAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCB0aGluZyB0aGF0IGlzIG5vdCBhbHdheXMgcG9zc2libGUsCgkgICAgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHlvdSB0byBrbm93IGFsbCB0aGUgc3VwcG9ydGVkCgkgICAgbGFuZ3VhZ2Uga2V5d29yZHMsIHRoaW5nIHRoYXQgaXMgYWx3YXlzIGltcG9zc2libGUpLgoKCSAgICBTbyB0aGVzZSBhcmUgdGhlIGNoYW5nZXMgZ2xvYmFsbHkgc3BlYWtpbmc6CgoJICAgIC0gVW5pZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUga2V5d29yZCB3YXJuaW5ncyB0aHJvdWdoCgkgICAgICB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogYWxsIHRoZSBsYW5ndWFnZXMgaGFzIG5vdyBhCgkgICAgICBzZXBhcmF0ZSBmaWxlIHRoYXQgZGVmaW5lcyB0aGUga2V5d29yZHMgb3IgYmFkIG5hbWVzOgoKCQkgIHB5dGhvbi9weXRob25rdy5zd2cKCQkgIGNoaWNrZW4vY2hpY2tlbmt3LnN3ZwogICAgICAgICAgICAgICAgICAuLi4uCgoJICAgIC0gQWRkZWQga2V5d29yZCBsaXN0IGZvciBtb3N0IG9mIHRoZSBsYW5ndWFnZXMgdGhhdCBkaWRuJ3QKCSAgICAgIGhhdmUgb25lICh1c2luZyB0aGUgbmV3IHNlcGFyYXRlZCBmaWxlKS4KCQkgICAgCSAgICAKCSAgICAtIEFkZGVkIHRoZSAiQWxsIGtleXdvcmRzIiB3YXJuaW5nIHN1cHBvcnQ6IC1XYWxsa3cgb3B0aW9uLgoKICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGluY2x1ZGUgYWxsIHRoZSBrbm93biBrZXl3b3JkcwoJICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcywgYW5kIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICAgICBzd2lnIC1XYWxsa3cgLi4uLgoJICAgIAoJICAgICAgVGhpcyB3aWxsIGhlbHAgdG8gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgdGVzdC1zdWl0ZQoJICAgICAgZmlsZSB0aGF0IGNhbiBiZSBjb21waWxlZCBpbiBhbGwgdGhlIHN3aWcgc3VwcG9ydGVkCgkgICAgICBsYW5ndWFnZXMsIGFuZCBpdCB3aWxsIGJlIGFsc28gaGVscGZ1bCBmb3IgdXNlcnMgd2hvCgkgICAgICB3YW50IHRvIGNyZWF0ZSBtdWx0aS1sYW5ndWFnZSBsaWJyYXJpZXMuCgkgICAgCgkgICAgQW5kIHRoZXNlIGFyZSB0aGUgZGV0YWlsZWQgY2hhbmdlcyAobW9zdGx5IGZpbGUgYWRkaXRpb24pOgoKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIHNvbWUgc29ydCBvZiBrZXl3b3JkCgkgICAgICB3YXJuaW5nIGxpc3QsIG1vdmUgaXQgdG8gYW4gZXh0ZXJuYWwgbGFuZ3VhZ2Vrdy5zd2cKCSAgICAgIGZpbGUsIGllOgoJICAgIAoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHB5dGhvbi5zd2cgLT4gcHl0aG9ua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gY2hpY2tlbi5zd2cgLT4gY2hpY2tlbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHRjbDguc3dnIC0+IHRjbGt3LnN3ZwogCiAgICAgICAgICAgICAgYW5kIHJlLWluY2x1ZGUgbGFuZ3VhZ2Vrdy5zd2cgZnJvbSBsYW5ndWFnZS5zd2cuCgkgICAgCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlIHRoYXQgZGlkbid0IGhhdmUgYSBrZXl3b3JkIGxpc3QsIGFuZAoJICAgICAgZm9yIHRoZSBvbmVzIHRoYXQgSSBjb3VsZCBmaW5kIGEgbGlzdCwgYWRkIHRoZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSwgaWU6CgogICAgICAgICAgICAgICAgIGNzaGFycC9jc2hhcnBrdy5zd2cKICAgICAgICAgICAgICAgICBqYXZhL2phdmFrdy5zd2cKICAgICAgICAgICAgICAgICBwaHA0L3BocGt3LnN3ZwoJCSBwaWtlL3Bpa2Vrdy5zd2cJIAoJCSBydWJ5L3J1Ynlrdy5zd2cKCgogICAgICAgICAgICAgIGFsc28gYWRkIGEgbGluZSBpbiBsYW5ndWFnZS5zd2cgdG8gaW5jbHVkZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2csIGJ1dCBub3cgaXQgaXMgY29tbWVudGVkISEhLCBsaWtlIGluCgkgICAgICBqYXZhLnN3ZzoKCiAgICAgICAgICAgICAgICAgIC8qIGphdmEga2V5d29yZHMgKi8KICAgICAgICAgICAgICAgICAgLyogcGxlYXNlIHRlc3QgYW5kIGFjdGl2YXRlICovCiAgICAgICAgICAgICAgICAgIC8vJWluY2x1ZGUgImphdmFrdy5zd2ciCgoJICAgICAgaWUsIHRoZXJlIHdpbGwgYmUgbm8gY2hhbmdlIGluIGhvdyBzd2lnIHJ1bnMgbm9ybWFsbHkKCSAgICAgIHVudGlsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRlc3QgYW5kIHVuY29tbWVudCB0aGF0CgkgICAgICBsaW5lLgoJICAgICAgCgkgICAgICBTbywgcGxlYXNlIGNoZWNrIGVhY2ggbGFuZ3VhZ2Vrdy5zd2cgZmlsZSAoSSBsZWZ0IHRoZQoJICAgICAgbGluayB0byB0aGUga2V5d29yZCBsaXN0IHNvdXJjZSBmb3IgY2hlY2tpbmcpLCBhbmQgYWZ0ZXIKCSAgICAgIHRlc3RpbmcsIHVuY29tbWVudCB0aGUgJWluY2x1ZGUgbGluZS4KCgkgICAgLSBBZGRlZCB0aGUgZmlsZSBhbGxrdy5zd2csIHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUKICAgICAgICAgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlcy4KCgkgICAgICBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGhhcyBubyBsYW5ndWFnZWt3LnN3ZyBmaWxlIHJpZ2h0CgkgICAgICBub3csIGFuZCBpZiB0aGV5IG5lZWQgb25lLCBhZGQgdGhlIGZpbGUgaW50byB0aGUKCSAgICAgIGxhbmd1YWdlIGRpcmVjdG9yeSwgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBpbmNsdWRlCgkgICAgICBsaW5lIGludG8gdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgCgkgICAgLSBBZGRlZCB0aGUgLVdhbGxrdyB0aGF0IGluY2x1ZGVzIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIE5vdGUgdGhhdCB0aGUgb2xkIC1sYWxsa3cuc3dnIG9wdGlvbiBjb3VsZG4ndCBiZSB1c2VkCgkgICAgICBzaW5jZSBpdCBpbmNsdWRlIHRoZSBmaWxlIGFmdGVyIGl0IHdvdWxkIGJlIG5lZWRlZC4KCgoJICAgIEhvcGVmdWxseSwgdGhlIC1XYWxsa3cgb3B0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQKCSAgICBydWxlcyBpbiB0aGUgcmVsYXRlZCB0ZXN0LXN1aXRlIE1ha2VmaWxlcywgc28sIHdoZW4KCSAgICBjcmVhdGluZyBhIG5ldyB0ZXN0LCBvciBhZGRpbmcgYSBuZXcgc3dpZyBsaWJyYXJ5IGZpbGUKCSAgICAobGlrZSBfc3RkX2RlcXVlLmkpLCBzd2lnIHdpbGwgd2FybiB5b3UgaWYgeW91IGFyZSB1c2luZyBhCgkgICAgYmFkIG5hbWUsIGNvbnNpZGVyaW5nIGFsbCB0aGUgbGFuZ3VhZ2Ugd2hlcmUgaXQgbmVlZHMgdG8KCSAgICBydW4uCgkgICAgCgkgICAgUmlnaHQgbm93IHlvdSBjYW4gdGVzdCBpdCBieSB1c2luZzoKCiAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0ic3dpZyAtV2FsbGt3IgoKCSAgICBvciB1c2luZyB5b3VyIGZhdm9yaXRlIHRhcmdldCBsYW5ndWFnZSwgaXQgZG9lc24ndCBtYXR0ZXIuCgoJICAgIEFuZCB5ZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGV4YW1wbGVzIHRoYXQgYXJlIHVzaW5nCgkgICAgcmVzZXJ2ZWQga2V5d29yZHMsIHNwZWNpYWxseSBmcm9tIGNzaGFycC4KICAgICAgICAgIAoJICAgICoqKiBSZW1lbWJlciAqKioqOiB0aGUgbmV3IGtleXdvcmQgd2FybmluZyBsaXN0cyBhcmUgbm90CgkgICAgaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbnkgb2YgbGFuZ3VhZ2UgdGhhdCBiZWZvcmUgZGlkbid0CgkgICAgaGF2ZSBvbmUuIFRvIGVuYWJsZSB0aGUga2V5d29yZCB3YXJuaW5ncyBhcyB0aGUgZGVmYXVsdAoJICAgIGJlaGF2aW9yLCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBsYW5ndWFnZWt3LnN3ZyBmaWxlIGhhcyB0bwoJICAgIGJlIHVuY29tbWVudGVkIGF0IGVhY2ggbGFuZ3VhZ2Uuc3dnIGZpbGUuCgoJICAgIFNvLCBhbGwgdGhlIGxhbmd1YWdlIG1haW50YWluZXJzLCBwbGVhc2UgY2hlY2sgdGhlCgkgICAga2V5d29yZHMgbGlzdC4gCgoJICAgIEFsc28sIHlvdSBjYW4gYWRkIGJ1aXQtaW4gbmFtZXMsIGFuZCBub3Qgb25seSBrZXl3b3JkcywgbGlrZQoJICAgICdUcnVlL0ZhbHNlJyBpbiBweXRob24uICBSZW1lbWJlciB0aGF0IHlvdSBjYW4gYmUgbW9yZQoJICAgIHNwZWNpZmljIGFuZCByZWZlciBvbmx5IHRvIG1lbWJlciBuYW1lcywgbGlrZSAqOjpjb25maWd1cmUKCSAgICBvciAqOjpjZ2V0IChzZWUgYW4gZXhhbXBsZSBpbiB0aGUgdGNsOC90Y2w4a3cuc3dnIGZpbGUpLAoJICAgIG9yIG9ubHkgZ2xvYmFsIG5hbWVzLCBsaWtlIDo6cmFuZ2UgKHNlZSBhbiBleGFtcGxlIGluIHRoZQoJICAgIHB5dGhvbi9weXRob25rdy5zd2cgZmlsZS4KCgkgICAgSnVzdCB0byBiZSBjb25zaXN0ZW50LCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlczoKCgkgICAgLSBVc2UgY29kZSAzMTQgZm9yIGtleXdvcmQgYW5kL29yIGZhdGFsIGJhZCBuYW1lcy4KCSAgICAtIFVzZSBjb2RlIDMyMSBmb3IgYnVpdC1pbiBhbmQvb3Igbm90IGZhdGFsIGJhZCBuYW1lcy4KICAgICAgICAgICAKICAgICAgICAgICAgc28sIHRoZXkgY2FuJ3QgYmUgZGlzYWJsZWQvZW5hYmxlZCBpbmRlcGVuZGVudGx5IChzZWUKCSAgICBweXRob24vcHlodG9ua3cuc3dnIGZvciBleGFtcGxlcykuCgoJICAgICoqKiogQW5kIGRvbid0IGFkZCBhbnkgbmV3IHRlc3QgZmlsZSB3aXRob3V0IGNoZWNraW5nIGl0CgkgICAgd2l0aCB0aGUgLVdhbGxrdyBvcHRpb24hISAodGhhdCBpbmNsdWRlcyBtZSkgKioqKiouCgkgIAoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNGIGJ1ZyAjODU0NjM0CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFjY2VwdGluZyB0aGUgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yICcvJyBvbiAKICAgICAgICAgICAgV2luZG93cyBhbmQgdGhlIE1hYyBpbiBhZGRpdGlvbiB0byB0aGUgbmF0aXZlIG9uZSAoICdcJyBvbiAKICAgICAgICAgICAgV2luZG93cykuIFRoaXMgY2FuIGJlIHVzZWQgaW4gJWltcG9ydCwgJWluY2x1ZGUgYW5kIGNvbW1hbmRsaW5lIAogICAgICAgICAgICBvcHRpb25zIHRha2luZyBhIHBhdGgsIGZvciBleGFtcGxlIC1JLiBPbiBDeWd3aW4sIGJvdGggdGhlIFdpbmRvd3MKICAgICAgICAgICAgYW5kIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciBjYW4gbm93IGJlIHVzZWQgKHdhcyAnLycgb25seSkuCiAgICAgICAgICAgIAoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgogICAgICAgICAgICBbcHl0aG9uXSBJbXBsZW1lbnRpbmcgdGhlIHJ1bnRpbWUgInJlcHJvdGVjdGVkIiBkaXJlY3RvcgoJICAgIG1lbWJlcnMsIGlmIHlvdSBoYXZlOgogICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhcigpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBoZWxsbygpIHsgcmV0dXJuIGRvX2hlbGxvKCk7KQoKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGkoKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oZWxsbygpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlCgogICAgICAgICAgICAgICAgaW1wb3J0IG15X21vZHVsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyhteV9tb2R1bGUuQmFyKToKICAgICAgICAgICAgICAgICAgZGVmIGRvX2hlbGxvKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAKCSAgICAgICAgYiA9IEJhcigpICMgUHVyZSBDKysgRGlyZWN0b3IgY2xhc3MKICAgICAgICAgICAgICAgIGYgPSBGb28oKSAjIEMrKyBEaXJlY3RvciArIHB5dGhvbiBtZXRob2RzCgogICAgICAgICAgICAgICAgYi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBDKysgQmFyOjpkb19oZWxsbygpCiAgICAgICAgICAgICAgICBmLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIFB5dGhvbiBGb286OmRvX2hlbGxvKCkKCiAgICAgICAgICAgICAgICBiLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogCiAgICAgICAgICAgICAgICBiLmRvX2hlbGxvKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hlbGxvKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGVsbG8oKSAjIE9rLCBzaW5jZSBpdCBpdHMgcmVkZWZpbmVkIGluIHB5dGhvbi4KCiAgICAgICAgICAgIEhlcmUgQmFyLmRvX2hlbGxvIGlzIGFsd2F5cyBwcm90ZWN0ZWQsIGJ1dCBGb28uZG9faGVsbG8KICAgICAgICAgICAgaXMgInB1YmxpYyIsIGJlY2F1c2UgaXQgaXMgcmVkZWZpbmVkIGluIHB5dGhvbi4gQmVmb3JlLAoJICAgIGFsbCB0aGUgJ2RvX2hlbGxvJyBtZXRob2RzIHdlcmUgcHVibGljLgoKCSAgICBUaGlzIHNlZW1zIHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4gQysrIGFuZCBweXRob24KCSAgICBwaGlsb3NvcGhpZXMsIGllLCBhbGwgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIGtlZXAKCSAgICBwcm90ZWN0ZWQgYXQgdGhlIHVzZXIgc2lkZSAoQysrIHdheSkgdW50aWwgdGhleSBhcmUKCSAgICByZWRlZmluZWQgKHB5dGhvbiB3YXksIHdlcmUgYWxsIGRlZmluZWQgbWV0aG9kcyBhcmUgYWx3YXlzCgkgICAgcHVibGljKS4gQW5kIHRoaXMgaXMgbm90IG9ubHkgYSBnb29kIGNvbXByb21pc2UsIGl0IGFsc28KCSAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gZG8gaXQgOikuCgoJICAgIE5vdyBydWJ5IGhhcyBuYXRpdmUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMsIGFuZCBweXRob24KCSAgICBwdXJlIHJ1bnRpbWUgc3VwcG9ydC4gSSBndWVzcyB0aGVzZSBhcmUgdGhlIHR3byBwb3NzaWJsZQoJICAgIGV4dHJlbWUgY2FzZXMuIEFuZCBob3BlZnVsbHksIHRoZXkgY291bGQgYmUgdXNlZCBhcwoJICAgIHRlbXBsYXRlcyB0byBtb2RpZnkgdGhlIG90aGVyIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQKCSAgICBkaXJlY3RvcnMsIHNvIHRoZXkgY2FuICJyZXByb3RlY3QiIHRoZSBwcm90ZWN0ZWQgZGlyZWN0b3IKCSAgICBtZW1iZXJzIGF0IHRoZSB0YXJnZXQgbGFuZ3VhZ2Ugc2lkZS4KCgkgICAgVGhpcyBmaW5pc2hlZCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIHN1cHBvcnQgZm9yIHRoZSAKCSAgICBweXRob24gbGFuZ3VhZ2UuIE9jYWxtIHdpbGwgbmVlZCB0byBhZGQgdGhlCgkgICAgInJlcHJvdGVjdGlvbiIgbGF0ZXIuCgoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoZSBmb2xsb3dpbmcgY2FzZSAocmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uKSB3YXMgZml4ZWQ6CgoJICAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAoJICAgICAgY2xhc3MgRm9vIHsgCgkgICAgICBwdWJsaWM6CgkgICAgICAgIHZvaWQgeSgpOwoKCSAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgaW50IHg7CgkgICAgICB9OwoKCSAgIHN3aWcgd2FybmVkIHRoYXQgdGhlIHN5bWJvbCAneCcgd2FzIGFscmVhZHkgZGVmaW5lZCwgYW5kCiAgICAgICAgICAgdGhlIHJlbmFtaW5nIGZhaWxzLiAneCcgd2FzIG5vdCBlbWl0dGVkLCBzaW5jZSBpdCBpcwogICAgICAgICAgIHByb3RlY3RlZCwgYnV0IGl0IHdhcyBrZXB0IGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0b28KICAgICAgICAgICBtdWNoIGluZm9ybWF0aW9uLgoKCSAgIE5vdyBzd2lnIHdvcmtzIGZvciBhbGwgdGhlIGNhc2VzIChwbGFpbiwgZGlyZWN0b3IgYW5kCgkgICBkaXJwcm90KSBhZ2Fpbi4gVGhpcyB3YXMgZml4ZWQgYnkgYWxsb3dpbmcgdGhlIHBhcnNlci55IHRvCgkgICBkZWNpZGUgbXVjaCBjbG9zZXIgd2hhdCB0byBkbyB3aXRoICd4Jy4gQmVmb3JlIGFsbCB0aGUKCSAgIGRpc2NhcmRpbmcgb3IgZ2VuZXJhdGlvbiB3YXMgcmVzb2x2ZWQgYXQgdGhlIGxhbmcuY3h4CgkgICBzdGFnZS4gQWxzbyB0aGUgY2hhbmdlcyBpbiBwYXJzZXIueSB0byBpbXBsZW1lbnQgdGhlCgkgICBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZSBhcmUgbm93IG11Y2ggbW9yZSBlbmNhcHN1bGF0ZWQsIGFuZAoJICAgdGhleSBnZXQgZGlzYWJsZWQgaWYgdGhlIG1vZGUgaXMgbm90IGVuYWJsZWQuIEJlZm9yZSB0aGUKCSAgIGRlYWN0aXZhdGlvbiB3YXMgZG9uZSBhdCB0aGUgZ2VuZXJhdGlvbiBzdGFnZSAobGFuZy5jeHgpLgoKCSAgIEJ5IHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGlyZWN0b3IgbW9kZSBpcyBlbmFibGVkLCBhbmQKCSAgICVyZW5hbWUgaXMgZG9uZSwgcmV1c2luZyBhIHByb3RlY3RlZCBtZW1iZXIgbmFtZSwgdGhlcmUgaXMKCSAgIGEgcGF0aG9sb2dpY2FsIGNhc2U6CgoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCiAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQSB7CgkgICAgIHB1YmxpYzoKCSAgICAgICB2b2lkIHkoKTsKCgkgICAgIHByb3RlY3RlZDoKCSAgICAgICBpbnQgeDsgICAgICAgICAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgaW50IHg7ICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICB2b2lkIHgoKTsgLyogd29ya3MgKi8KCSAgICAgICB0eXBlZGVmIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoKCSAgICAgICB2aXJ0dWFsIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGFzIGl0IHNob3VsZCwgc2luY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9vOjp4KCkgd2lsbCBiZSBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvciAqLwoKCSAgICAgICB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBidXQgc29tZXRpbWVzIGl0IHNob3VsZG4ndCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBGb286OngoKSB3aWxsIG5vdCBiZSBlbWl0dGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBub3QgdmlydHVhbCAqLwoKCSAgICAgfTsKCgkgICBUaGUgbGFzdCBjYXNlIGlzIG5vdCBhbHdheXMgcmlnaHQgYmVjYXVzZSBhdCB0aGUgcGFyc2VyLnB5CgkgICBzdGFnZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVjaWRlIGlmIHRoZSBwcm90ZWN0ZWQgbWVtYmVyCgkgICBGb286OngoKSBjb3VsZCBvciBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcmVuYW1lZCBGb286OnkoKSwKCSAgIHNpbmNlIEZvbzo6eCgpIGNvdWxkIGJlIHZpcnR1YWwgYnkgaW5oZXJpdGFuY2UuCgoJICAgSSBndWVzcyB0aGlzIGp1c3QgYW4gaW50cmluc2ljIGxpbWl0YXRpb24sIGFuZCBubyBtdWNoIGNhbgoJICAgYmUgZG9uZSBhYm91dCBpdCB3aXRob3V0IHJlc29ydGluZyBpbnRvIGxhcmdlciBjaGFuZ2VzIHRvCgkgICBwb3N0cG9uZSwgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUgbXVsdGlwbHkgc3ltYm9sCgkgICBkZXRlY3Rpb24gKGxhbmcuY3h4IHN0YWdlKS4KCSAgIAoJICAgU28sIGJ5IG5vdywgaXQgaXMganVzdCBjb25zaWRlcmVkIGEgd2VsbCBrbm93biAiZmVhdHVyZSIgaW4KCSAgIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZS4gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGl0IHNlZW1zCgkgICB0byBiZSBhIHJhcmUgY2FzZSwgYW5kIGl0IGNhbiBiZSBhdm9pZGVkIGJ5IHRoZSB1c2VyIGJ5CgkgICBoaWRpbmcgJ3gnIGJlZm9yZSByZW5hbWluZyAneSc6CgoJICAgICAlcmVuYW1lKF94KSBGb286OngoKTsKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKCSAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSB2aXJ0dWFsIG1ldGhvZCBkZXRlY3Rpb25zIG5vdyBwcm9wZXJseQoJICAgIHRyZWF0cyB0aGUgZm9sbG93aW5nIGNhc2VzOgoKICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28geyB0eXBlZGVmIGludCBJbnQ7IH0KCSAgICAgc3RydWN0IEEge307CgkgICAgIHR5cGVkZWYgQSBCOwoKICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICB2aXJ0dWFsIH5Gb28oKSB7fQoKICAgICAgICAgICAgICAgdmlydHVhbCBGb28qIGNsb25lcigpID0gMDsKCSAgICAgICB2aXJ0dWFsIGludCBnZXRfdmFsdWUoKSA9IDA7CgkgICAgICAgdmlydHVhbCBBKiBnZXRfY2xhc3MoKSA9IDA7CgkgICAgICAgdmlydHVhbCB2b2lkIGp1c3RfZG9faXQoKSA9IDA7CgkgICAgIH07CgogICAgICAgICAgICAgc3RydWN0IEJhciA6IEZvbwogICAgICAgICAgICAgewogICAgICAgICAgICAgICBCYXIqIGNsb25lcigpOwogICAgICAgICAgICAgICBmb286OkludCBnZXRfdmFsdWUoKTsKICAgICAgICAgICAgICAgQiogZ2V0X2NsYXNzKCk7CiAgICAgICAgICAgICAgIHZvaWQganVzdF9kb19pdCgpOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICBBbGwgdGhlIEZvbyBhbmQgQmFyIG1ldGhvZHMgYXJlIHZpcnR1YWwuICBBIG5ldyBhdHRyaWJ1dGUKCSAgICAidmlydHVhbDp0eXBlIiByZWNvcmQgdGhlIGJhc2UgcG9seW1vcnBoaWMgdHlwZS4gSW4gdGhlCgkgICAgcHJldmlvdXMgY2FzZXMgd2UgaGF2ZToKCgkgICAgICAgdHlwZSA6IEJhciAgICAgICB2aXJ0dWFsOnR5cGUgOiBGb28KCSAgICAgICB0eXBlIDogZm9vOjpJbnQgIHZpcnR1YWw6dHlwZSA6IGludAoJICAgICAgIHR5cGUgOiBCICAgICAgICAgdmlydHVhbDp0eXBlIDogQQoJICAgICAgIHR5cGUgOiB2b2lkICAgICAgdmlydHVhbDp0eXBlIDogdm9pZAoKICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGluIGxhbmd1YWdlcyAoamF2YStkaXJlY3RvcnMpCgkgICAgdGhhdCBjb3VsZCBoYXZlIHByb2JsZW1zIHJlZGVmaW5pbmcgQmFyKiBCYXI6OmNsb25lcigpLgoKCSAgICBJZiB5b3UgbmV2ZXIgaGFkIGNvZGUgbGlrZSB0aGUgYWJvdmUsIHlvdSB3aWxsIHNlZSBubwoJICAgIGVmZmVjdHMuIEJ1dCBpZiB5b3UgaGF2ZSBzb21lIGNvZGUgbGlrZSB0aGF0LCB5b3UKCSAgICB3aWxsIHNlZSBzb21lIGVmZmVjdHMgc2luY2Ugc29tZSBtZXRob2RzIHRoYXQKCSAgICBiZWZvcmUgd2VyZSBub3QgcHJvcGVybHkgdHJlYXRlZCBhcyB2aXJ0dWFsLAoJICAgIHdpbGwgc3RhcnQgdG8gYWN0IGxpa2UgdGhhdC4gVGhpcyBjb3VsZCBlbmxhcmdlCgkgICAgeW91ciBkaXJlY3RvciBjbGFzc2VzLgoJICAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgKGRpcnByb3QpCgkgICAgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICAKCSAgICBJdCBjYW4gYmUgZW5hYmxlIGJ5IHVzaW5nICctZGlycHJvdCcgb3IgYnkgYWRkaW5nCgkgICAgdGhlIG9wdGlvbiB0byB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uLCBsaWtlOgoKICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLGRpcnByb3Q9IjEiKSBteV9tb2R1bGUKCgkgICAgVGhpcyBtb2R1bGUgb3B0aW9uIHdhcyBhZGRlZCB0byBwcm9wZXJseSBjb21waWxlIHRoZQoJICAgIGRpcmVjdG9yX3Byb3RlY3RlZC5pIGFuZCBkaXJlY3Rvcl9uZXN0ZWQuaSBleGFtcGxlcy4KCSAgICAKCSAgICBUaGUgZmVhdHVyZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob25bMi4yLDIuM10gCgkgICAgYW5kIHJ1YnlbMS42LjddLCBib3RoIGF0IGNvbXBpbGF0aW9uIGFuZCBydW50aW1lLCBhbmQgCgkgICAgamF2YVtqMnNkazEuNC4xXzAxXSwgYnV0IG9ubHkgYXQgY29tcGlsYXRpb24gKG15IGphdmEKCSAgICBpbnN0YWxsYXRpb24gZG9lc24ndCBydW4gYW55IG9mIHRoZSBkaXJlY3RvciBleGFtcGxlcywKCSAgICBvbGRzIG5vciBuZXdzKS4KCgkgICAgUGxlYXNlIHRlc3QgZm9yIG9jYW1sIGFuZCBqYXZhLgoJICAgIAoJICAgIFRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgV2lsbGlhbSBhbmQgU2NvdHQgd2VyZSBmaXhlZCwKCSAgICBleGNlcHQgZm9yIGEgd2FybmluZyBhYm91dCAgU1dJR19KYXZhVGhyb3dFeGVjcHRpb24oKQoJICAgIG11bHRpcGx5IGRlZmluZWQuIEkgY2FuJ3QgcmVwcm9kdWNlIHRoaXMgZXJyb3Igd2l0aCBteQoJICAgIGV4YW1wbGVzLiBXZSB3aWxsIHdhaXQgZm9yIFNjb3R0IHRvIHNlbmQgdXMgYSBtaW5pbWFsCgkgICAgY2FzZS4KCgoxMi8wNy8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCBoYXMgYmVlbgoJICAgIGNvbXBsZXRseSBtb3ZlZCBvdXQgZnJvbSBweXRob24uY3h4LCBhbmQgbm93CgkgICAgcmVzaWRlcyBpbiB0aGUgY29tbW9uIGxhbmcuY3h4LCBlbWl0LmN4eCBhbmQKCSAgICBhbGxvY2F0ZS5jeHggZmlsZXMuIAoKCSAgICBUaGlzIG1lYW5zIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgZGlyZWN0b3JzLCBpZSwgcHl0aG9uLCBqYXZhLCBvY2FsbQoJICAgIGFuZCBydWJ5LgoKCSAgICBUaGUgY2hhbmdlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvbiAoY29tcGlsYXRpb24rcnVudGltZSkKCSAgICBhbmQgamF2YSAoanVzdCBjb21waWxhdGlvbikuCgkgICAgCgkgICAgUGxlYXNlIGFkZCBydW50aW1lIHRlc3RzIGZvciB0aGUgbWlzc2luZyBsYW5ndWFnZXMgCgkgICAgYW5kIHRlc3QgaXQuCgoJICAgIFRoZSAnLW5vZGlycHJvdCcgb3B0aW9uIHdhcyBtb3ZlZCB0byB0aGUgcHJpbmNpcGFsIG1haW4sCgkgICAgYW5kIGNhbiBiZSB1c2VkIGZyb20gYWxsIHRoZSBsYW5ndWFnZXMuCgoxMi8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIGFuZCBpbXByb3ZlZCBlcnJvciBjaGVja2luZyBvZiBTVFJJTkdfT1VUIHR5cGVtYXBzIGluIAogICAgICAgICAgICB2YXJpb3VzLmkuCgoxMi8wNC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIC0gTm93IHRoZSB2aXJ0dWFsIG1lbWJlcnMgd2l0aCBubyBleHBsaWNpdCBkZWNsYXJhdG9yCgkgICAgYXJlIHByb3Blcmx5IGlkZW50aWZpZWQ6CgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7CiAgICAgICAgICAgICAgICAgIGludCBmKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBIZXJlLCBCOjpmKCkgaXMgdmlydHVhbCwgYW5kIHRoZSBkaXJlY3RvciBhbmQgdGhlCgkgICAgdmlydHVhbCBlbGltaW5hdGlvbiBtZWNoYW5pc20gbm93IHJlY29nbml6ZSB0aGF0LgoKICAgICAgICAgICAgLSBbQyNdIFRoaXMgZml4IGFsc28gZml4ZXMgdGhlIHByb2JsZW0gd2hlcmUgJ292ZXJyaWRlJyB3YXMgbm90IGJlaW5nIAogICAgICAgICAgICB1c2VkIG9uIGFueSBvdmVycmlkZGVuIHZpcnR1YWwgbWV0aG9kLCBzbyBmb3Igc3RydWN0IEIgYWJvdmUsIAogICAgICAgICAgICB0aGlzIEMjIGNvZGUgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBCIDogQSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IGYoKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoJICAgIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBwcm90ZWN0ZWQgdmlydHVhbCBtZXRob2RzLiBUaGV5IGFyZSBub3cKCSAgICBwcm9wZXJseSBlbWl0dGVkIHdoZW4gdXNpbmcgd2l0aCBkaXJlY3RvciAocHl0aG9uIG9ubHkgYnkKCSAgICBub3cpLgoJICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBmMigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgVGhpcyBjYW4gYmUgZGlzc2FibGVkIGJ5IHVzaW5nIHRoZSAnLW5vZGlycHJvdCcgb3B0aW9uLgoKCSAgICAtIFRoZSBmZWF0dXJlICdub2RpcmVjdG9yJyBpcyB3b3JraW5nIG5vdyBhdCB0aGUgdG9wIGxldmVsLAoJICAgIHNvLCBpdCBtdXN0IHdvcmsgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7CiAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm9kaXJlY3RvciIpIEE6OmYyOwoKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYyKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgCgkgICAgaW4gdGhpcyBjYXNlLCBvbmx5ICdmMScgaXMgZXhwb3J0ZWQgdG8gdGhlIGRpcmVjdG9yIGNsYXNzLgoJICAgIAoJICAgIC0gQWRkZWQgZGlyZWN0b3Igc3VwcG9ydCBmb3IgY29uc3QgVFlQRSYgYXJndW1lbnRzIChweXRob24pLgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIElOT1VUIGFuZCBPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3Igd2hlbiB0aGUgSk5JIHR5cGUgCiAgICAgICAgICAgIGlzIGJpZ2dlciB0aGFuIHRoZSBDIHR5cGUuIEZvciBleGFtcGxlLCB1bnNpZ25lZCBsb25nICgzMmJpdHMgb24gbW9zdCBzeXN0ZW1zKQogICAgICAgICAgICBpcyBtYXBwZWQgdG8gamxvbmcgKDY0Yml0cykuIFJldHVybmVkIHZhbHVlIHdhcyBpbmNvcnJlY3QuIEJ1ZyByZXBvcnRlZCBieSAKICAgICAgICAgICAgQnJpYW4gSGF3bGV5LgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQmV0dGVyIGZpeCBmb3IgZW50cnkgZGF0ZWQgMDUvMTEvMjAwMy4gRml4ZXMgdGhlIGZvbGxvd2luZwogICAgICAgICAgICB0eXBlbWFwczoKCiAgICAgICAgICAgIEphdmE6IGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCiAgICAgICAgICAgIEMjOiBjc2Jhc2UsIGNzaW50ZXJmYWNlcywgY3NpbXBvcnRzLCBjc2NsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBjc2ZpbmFsaXplLCBjc2dldGNwdHIgJiBjc2NvZGUuCgogICAgICAgICAgICBJdCBhbHNvIGZpeGVzIGJ1ZyBpbiB1c2luZyBhcnJheXMgb2YgQyBzdHJ1Y3RzIHdpdGggYXJyYXlzX2phdmEuaSAKICAgICAgICAgICAgYXMgcmVwb3J0ZWQgU2NvdHQgTWljaGVsLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybF0gRml4ZWQgWyA4NTIxMTkgXSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaW4gb3V0cHV0IC5wbSwgcGVybDUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRG93bGluZy4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgWyA3NTUzODIgXSBjYWxsaW5nIGZ1bmMoY29uc3QgdmVjdG9yPFQ+JiBwKSBldmFsdWF0ZXMgcFswXSBpbiBpbnRlcnAuCiAgICAgICAgICAgIFRoZSBUY2wgdHlwZSBjaGVja2VyIHdhcyBpbXByb3Blcmx5IGhhbmRsaW5nIHRoZSBpbnRlcnByZXRlciByZXN1bHQgd2hlbgogICAgICAgICAgICB0eXBlIHZpb2xhdGlvbnMgd2VyZSBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGF2aXUgUG9wcC1Ob3dhay4KCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDU0NTA1OCBdIGNvbmZpZ3VyZSdzIC0td2l0aC10Y2xpbmNsIGhhcyBubyBlZmZlY3QKCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA3NjY0MDkgXSBtaXNzaW5nIHN5bWJvbCBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBkdXJpbmcgbW9kdWxlIGxvYWQKICAgICAgICAgICAgU1dJRydzIGludGVybmFsIGZ1bmN0aW9ucyBhcmUgYWxsIHN0YXRpYyBhcyB0aGVyZSBpcyBubyBuZWVkIGZvciBkaWZmZXJlbnQgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB0byBzaGFyZSBhbnkgY29kZSBhdCBydW50aW1lLgoKMTEvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDg0ODMzNSBdIERpcmVjdG9yczogI2luY2x1ZGUgd3JhcHBlciAuaCBmaWxlIC0gd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIGFkZGluZyBhIGRpcmVjdG9yeSB0byB0aGUgZ2VuZXJhdGVkICNpbmNsdWRlICJmb29fd3JhcC5oIiBzdGF0ZW1lbnQKICAgICAgICAgICAgaW4gc29tZSBzaXR1YXRpb25zLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDg0OTA2NCBdIEpBVkEgOiBBY2Nlc3MgbW9kaWZpZXIgZm9yIGRlcml2ZWQgY2xhc3Mgd3JvbmcuCiAgICAgICAgICAgIFRoZSBkZWxldGUoKSBtZXRob2QgaXMgYWx3YXlzIHB1YmxpYyBub3cuIEl0IHVzZWQgdG8gYmUgcHJvdGVjdGVkIHdoZW5ldmVyIGEgCiAgICAgICAgICAgIGRlc3RydWN0b3Igd2FzIG5vbiBwdWJsaWMuIEFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHJ1bnRpbWUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiBtYWtpbmcgZGVsZXRlKCkgcHJvdGVjdGVkIG5vdy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NTAxNTEgXSBQWVZFUlNJT04gd2l0aCBweXRob24yLjMgaW4gY29uZmlndXJlIG9mIFNXSUcgMS4zLjE5IChNYXliZSkuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICBbIDg1MDY2NiBdICNpbmNsdWRlIGV4dHJhIGxpbmUgYWRkZWQuICAKICAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHNvbWUgcHJvYmxlbXMgd2l0aCBnZXR0aW5nIGNvcnJlY3QgbGluZSBudW1iZXJzIG9uCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2VzLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhbm90aGVyIG9uZSBvZiBNYXJjZWxvJ3MgZXZpbCB0ZW1wbGF0ZSBidWdzIChpbmZpbml0ZQogICAgICAgICAgICByZWN1cnNpb24pLiBbIDg0OTUwNCBdIHRlbXBsYXRlIGFuZCB0eXBlZGVmIC0+IGluZi4gcmVjdXJzaW9uLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzOgoKCSAgICAgICAgIGludCAqeCA9ICZzb21lYXJyYXlbMF07CgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzU2NTUyIF0gbWlzc2luZyBkZWZhdWx0IGFyZ3VtZW50IGNsYXNzIHNjb3BlIHdpdGggInwiLgogICAgICAgICAgICBUaGlzIGlzIHJlYWxseSBvbmx5IGEgYmFuZC1haWQgZml4IGZvciB1c2Ugb2YgY2xhc3MtZW51bXMgaW4KICAgICAgICAgICAgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGVudW0gRmxhZyB7IGZsYWcxID0gMHgxLCBmbGFnMiA9IDB4MiB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgeCA9IGZsYWcxIHwgZmxhZzIpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZTogdGhlcmUgYXJlIHN0aWxsIHNvbWUgKG1vcmUgc3VidGxlKSBjYXNlcyB0aGF0IGFyZSBicm9rZW4sCiAgICAgICAgICAgIGJ1dCBoYXJkIHRvIGZpeCBkdWUgdG8gYW4gaXNzdWUgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uIFdpbGwKICAgICAgICAgICAgYWRkcmVzcyBsYXRlci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRG1pdHJ5IE1pcm9ub3YuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDg0MDg3OCBdIHN1cHBvcnQgZm9yICVpbmxpbmUgeyAuLi4gfSAoUEFUQ0gpLgogICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAlaW5saW5lICV7IC4uLiAlfSBpcyB0aGF0IHRoZQogICAgICAgICAgICBlbmNsb3NlZCB0ZXh0IGlzIHByb2Nlc3NlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICAgVGhpcwogICAgICAgICAgICBhbGxvd3Mgc3BlY2lhbCBtYWNyb3MgYW5kIG90aGVyIHByb2Nlc3NpbmcgdG8gYmUgdXNlZCBpbiAKICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCAlaW5saW5lLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MzY5MDMgXSBDKysgaW5jb25zaXN0ZW5jeSAod2l0aCB2b2lkIGFyZ3VtZW50cykuCiAgICAgICAgICAgIFNXSUcgd2FzIGhhdmluZyBkaWZmaWN1bHR5IHdpdGggZigpIHZzIGYodm9pZCkgaW4gQysrIHByb2dyYW1zLgogICAgICAgICAgICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYodm9pZCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKCk7ICAgIC8vIE5vdCBtYXRjaGVkIHRvIGYodm9pZCkgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgIH07IAoKICAgICAgICAgICAgVGhlIHBhcnNlciBub3cgbm9ybWFsaXplcyBhbGwgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtIGYodm9pZCkgCiAgICAgICAgICAgIGluIEMrKyBjbGFzc2VzIHRvIGYoKS4gIFRoaXMgc2hvdWxkIGZpeCBhIHZhcmlldHkgb2Ygc3VidGxlIAogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlLCBvcHRpbWl6YXRpb25zLCBvdmVybG9hZGluZywgZXRjLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhcnRobyBCaG93bWljay4KIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSW5jb3Jwb3JhdGVkIFsgODQxMDc0IF0gYmV0dGVyIGNyb2FraW5nIChQQVRDSCkuICBUaGlzIGZpeGVzIHNvbWUgcHJvYmxlbXMKICAgICAgICAgICAgd2l0aCBzdHJpbmdzIGFuZCBwcm92aWRlcyBzb21lIG5ldyBlcnJvciBmdW5jdGlvbnMuIAogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KICAgICAgICAgICAgCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE4MzUgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggY2FzdDogdHh0ID0gKGNoYXIgKikidHh0IiBzeW50YXggRXJyb3IuCiAgICAgICAgICAgIFRoZSBwYXJzZXIgc2hvdWxkIG5vdyBhY2NlcHQgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqcyA9IChjaGFyICopICJIZWxsbyIpOwoKICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBDbGF1ZGl1cyBTY2hub3JyLgoKMTEvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBwcm9ibGVtIHdpdGggY3Jvc3MgbW9kdWxlIGxpbmtpbmcuICBQcmV2aW91c2x5IG1vZHVsZXMgcmVmZXJyZWQKICAgICAgICAgICAgdG8gYmFzZSBjbGFzc2VzIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUuICAgTm93LCB0aGUgbW9kdWxlIGxvb2tzIHVwIGJhc2UKICAgICAgICAgICAgY2xhc3NlcyB0aHJvdWdoIHRoZSB0eXBlIHN5c3RlbSBpdHNlbGYtLS1hdm9pZGluZyB0aGUgbmVlZCB0byBsaW5rIHRvIGEgZ2xvYmFsCiAgICAgICAgICAgIGxpa2UgYmVmb3JlLiAgQ2F2ZWF0OiAgbW9kdWxlcyB3aXRoIGJhc2UgY2xhc3NlcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgbW9kdWxlcyB3aXRoIGRlcml2ZWQgY2xhc3Nlcy4KIAoxMS8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHVzZSAoKSB0byByZXByZXNlbnQgbnVsbCBwb2ludGVycywKCSAgICBhcyBpdCBpcyBkb25lIGluIC1naCBtb2RlLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIEFkZCBhIGdlbmVyYXRlZCBzY3JpcHQgInByZWluc3Qtc3dpZyIsIHdoaWNoIGNhbiBiZSB1c2VkCgkgICAgdG8gaW52b2tlIFNXSUcgYmVmb3JlIGl0IGhhcyBiZWVuIGluc3RhbGxlZC4gIEl0IGFycmFuZ2VzCgkgICAgdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMgZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUKCSAgICB1c2VkLiAKCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2FsbCBTV0lHX0d1aWxlX0luaXQuCgkgICAgQWRkIGEgU1dJR19jb250cmFjdF9hc3NlcnQgbWFjcm8uCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBVcGRhdGUgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhlIGR5bmV4dCBvYmplY3QgdG8gd29yawoJICAgIHdpdGggTXpTY2hlbWUgMjA1LgoKMTEvMjAvMjAwMzogbW1hdHVzCgkgICAgRml4ZWQgdGhlIGluY2x1ZGUvaW1wb3J0IGVycm9yIHJlcG9ydGVkIGJ5IEtlcmltIEJvcmNoYWV2LAoJICAgIHdoZXJlIHR3byBmaWxlcyB3aXRoIG5hbWVzIGxpa2UKCgkgICAgJ2RpcjEvaGVsbG8uaScKCSAgICAnZGlyMi9oZWxsby5pJwoJICAgIAoJICAgIGNhbiBub3QgYmUgaW5jbHVkZSBhdCB0aGUgc2FtZSB0aW1lLiBTd2lnIHdhcyBpbmNsdWRpbmcKCSAgICBqdXN0IHRoZSBmaXJzdCBvbmUsIGFzc3VtaW5nIHRoZSBzZWNvbmQgb25lIHdhcyBub3QgYQoJICAgIGRpZmZlcmVudCBvbmUsIHNpbmNlIGl0IHdhcyBjaGVja2luZy9rZWVwaW5nIGp1c3QgdGhlCgkgICAgYmFzZW5hbWUgJ2hlbGxvLmknLgoKMTEvMTkvMjAwMzogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeSBzdXBwb3J0LiAKICAgICAgICAgICAgICAtICBUaGUgLWMgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIC1ub3J1bnRpbWUKICAgICAgICAgICAgICAtICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLXJ1bnRpbWUuICBXaGVuIHN1cHBsaWVkLCB0aGlzCiAgICAgICAgICAgICAgICAgaW5zZXJ0cyB0aGUgc3ltYm9sIFNXSUdfR0xPQkFMIGludG8gdGhlIHdyYXBwZXIgY29kZS4gIFRoaXMsCiAgICAgICAgICAgICAgICAgaW4gdHVybiwgbWFrZXMgYWxsIG9mIHRoZSBydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIGdsb2JhbGx5CiAgICAgICAgICAgICAgICAgdmlzaWJsZS4KICAgICAgICAgICAgICAgLSBOZXcgbGlicmFyeSBmaWxlOiBzd2lncnVuLmkuICAgVXNlZCB0byBjcmVhdGUgbW9kdWxlcwogICAgICAgICAgICAgICAgIGZvciBydW50aW1lIGxpYnJhcnkgKGlmIG5lZWRlZCkuCiAgICAKMTEvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgICdtYWtlIHNyY3JwbScgcnBtYnVpbGQgZml4IC0gcGF0Y2ggZnJvbSBKb2UgQ29vcGVyCgoxMS8xOC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBDaGFuZ2UgbWVhbmluZyBvZiBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1ndWlsZSB0bwoJICAgIHRoZSBuYW1lIG9mIHRoZSBHdWlsZSBleGVjdXRhYmxlLiAgVGhlIG5ldyBvcHRpb24gLS13aXRoLWd1aWxlLXByZWZpeCAKCSAgICBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0cmVlIHdoZXJlIEd1aWxlIGlzCgkgICAgaW5zdGFsbGVkLiAgKEhvd2V2ZXIsIHVzdWFsbHkgaXQgc3VmZmljZXMgdG8gdXNlIHRoZQoJICAgIHNpbmdsZSBvcHRpb24gLS13aXRoLWd1aWxlLWNvbmZpZy4pICAKCSAgICBXaGVuIHJ1bm5pbmcgdGhlIHJ1biB0ZXN0cyB0ZXN0LXN1aXRlLCBtYWtlIHN1cmUgdG8gdXNlIHRoZQoJICAgIHZlcnNpb24gb2YgR3VpbGUgdGhhdCBTV0lHIHdhcyBjb25maWd1cmVkIGZvci4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEltcHJvdmVtZW50cyB0byBvYmplY3Qtb3duZXJzaGlwIG1hbmFnZW1lbnQgaW4gCgkgICAgIi1zY20iIG1vZGUuICAoVGhleSBkbyBub3QgYXBwbHkgdG8gdGhlIGRlZmF1bHQgIi1naCIgbW9kZS4pCgkgICAgKiBSZW5hbWVkIHRoZSBzbW9iIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGNhbgoJICAgICAgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgZnJvbSAiY29sbGVjdGVkIHN3aWciIHRvICJjb2xsZWN0YWJsZQoJICAgICAgc3dpZyIsIHdoaWNoIGlzIG1vcmUgcHJlY2lzZS4gIAoJICAgICogRXhwb3J0IHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9ucyBhZ2Fpbi4gIEl0IGlzIG5vdwogCSAgICAgIGFsbG93ZWQgdG8gZXhwbGljaXRseSBjYWxsIGRlc3RydWN0b3JzLCBldmVuIGZvcgoJICAgICAgZ2FyYmFnZS1jb2xsZWN0ZWQgcG9pbnRlciBvYmplY3RzLiAgQSBwb2ludGVyIG9iamVjdAoJICAgICAgdGhhdCBoYXMgYmVlbiBwYXNzZWQgdG8gYSBkZXN0cnVjdG9yIGlzIG1hcmtlZCBpbiBhCgkgICAgICBzcGVjaWFsIHdheSB1c2luZyBhIG5ldyBzbW9iIHR5cGUsICJkZXN0cm95ZWQgc3dpZyIuCgkgICAgICAoVGhpcyBoZWxwcyBhdm9pZCBuYXN0eSBtZW1vcnkgYnVncywgd2hlcmUgcmVmZXJlbmNlcyB0bwoJICAgICAgZGVhZCBDIG9iamVjdHMgYXJlIHN0aWxsIGhlbGQgaW4gU2NoZW1lLiBNb3Jlb3ZlciwgdGhlCgkgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIG5vdCB0cnkgdG8gZnJlZSBhIGRlc3Ryb3llZAoJICAgICAgb2JqZWN0IG9uY2UgbW9yZS4pCgkgICAgKiBEZXN0cnVjdG9yLWxpa2UgZnVuY3Rpb25zIGNhbiBhbHNvIG1hcmsgdGhlaXIgYXJndW1lbnRzIAoJICAgICAgYXMgZGVzdHJveWVkIGJ5IGFwcGx5aW5nIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpERVNUUk9ZRUQuCgkgICAgICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJEZXN0cm95ZWQuKQoJICAgICogRnVuY3Rpb25zIHRoYXQgImNvbnN1bWUiIHRoZWlyIG9iamVjdHMgKG9yIHRoYXQgIm93biIKCSAgICAgIHRoZW0gYWZ0ZXIgdGhlIGNhbGwpIGNhbiBtYXJrIHRoZWlyIGFyZ3VtZW50cyBhcwoJICAgICAgbm90IGdhcmJhZ2UgY29sbGVjdGFibGUuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGFwcGx5aW5nCgkgICAgICB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqQ09OU1VNRUQuICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uCgkgICAgICBTV0lHX0d1aWxlX01hcmtQb2ludGVyTm9uY29sbGVjdGFibGUuKQoJICAgICogVGhlIG1hY3JvIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQgZnJvbSBsaWJyYXJ5CgkgICAgICBwb2ludGVyLWluLW91dC5pIGNyZWF0ZXMgYWRkaXRpb25hbCB0eXBlbWFwcyAKCSAgICAgIFBUUlRZUEUgKklOUFVUX0NPTlNVTUVELCBQVFJUWVBFICpJTlBVVF9ERVNUUk9ZRUQuCgkgICAgICBUaGV5IG1hcmsgdGhlIHBhc3NlZCBwb2ludGVyIG9iamVjdCBsaWtld2lzZS4KCSAgICAgIFRoZSB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVCBjcmVhdGVzIGEgZ2FyYmFnZS1jb2xsZWN0YWJsZQoJICAgICAgcG9pbnRlciBvYmplY3QsIGxpa2UgJW5ld29iamVjdCBkb2VzIGZvciBhIHJldHVybmVkIAoJICAgICAgcG9pbnRlci4gIFVzZSB0aGUgbmV3IHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUX05PTkNPTExFQ1RBQkxFCgkgICAgICB0byBjcmVhdGUgYSBwb2ludGVyIG9iamVjdCB0aGF0IHdpbGwgbm90IGJlIGdhcmJhZ2UgY29sbGVjdGVkLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSGFuZGxlICRpbnB1dCBpbiAiZnJlZWFyZyIgdHlwZW1hcHMuCgkgICAgTmV2ZXIgcXVhbGlmeSBHT09QUyBzbG90IG5hbWVzIHdpdGggdGhlIGNsYXNzIG5hbWUuIAoJICAgIEhhbmRsZSBvcHRpb25hbCBhcmd1bWVudHMgcHJvcGVybHkgaW4gdGhlIEdPT1BTIG1ldGhvZHMuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIGluc3RhbGxhdGlvbiB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIEF1dG9tYWtlLTEuOC4KICAgICAgICAgICAgbWtpbnN0YWxsZGlycyB3YXMgYmVpbmcgdXNlZCBieSBhIG5vbi1BdXRvbWFrZSBtYWtlZmlsZS4gCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgaXMgYmVpbmcgcGhhc2VkIG91dCBhbmQgc28gd2FzIG5vdCBiZWluZwogICAgICAgICAgICBjcmVhdGVkIGJ5IEF1dG9tYWtlLiBpbnN0YWxsLXNoIHVzZWQgaW5zdGVhZC4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgaW1wcm92ZW1lbnRzLCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcyBzaW5jZSAKICAgICAgICAgICAgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiAlZmVhdHVyZSgic2hhZG93IikgaXMgdXNlZCB0byBhZGQgY29kZSB0byBzaGFkb3cKICAgICAgICAgICAgY2xhc3NlcywgdGhlIHNwZWNpYWwgdmFyaWFibGUgJGFjdGlvbiBleHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICB1bmRlcmx5aW5nIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkIG5vcm1hbGx5LgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuIGdlbmVyYXRpbmcgcHJveHkgY2xhc3MgY29kZSwgU1dJRyBlbWl0cyBhIGZldwogICAgICAgICAgICBkZWZhdWx0IG1ldGhvZHMgZm9yIF9fcmVwcl9fKCkgYW5kIG90aGVyIFB5dGhvbiBzcGVjaWFsCiAgICAgICAgICAgIG1ldGhvZHMuICBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgYWZ0ZXIgYWxsIG9mIHRoZQogICAgICAgICAgICBjb250ZW50cyBvZiBhIGNsYXNzLiBIb3dldmVyLCB0aGlzIG1ha2VzIGl0IGhhcmQgdG8gb3ZlcnJpZGUKICAgICAgICAgICAgdGhlIG1ldGhvZHMgdXNpbmcgJXB5dGhvbmNvZGUgYW5kIHNvbWUgb3RoZXIgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICAgIGFsbG93IGNvZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIGNsYXNzLiAgVGhlc2Ugc3BlY2lhbCBtZXRob2RzCiAgICAgICAgICAgIGFyZSBub3cgZW1pdHRlZCBpbnRvIHRoZSBjb2RlICpiZWZvcmUqIGFsbCBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEVyaWMgSm9uZXMuCiAKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBQcmVwcm9jZXNzb3IgZW5oYW5jZW1lbnQuICAgRm9yIGluY2x1ZGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAlaW5jbHVkZSAiZm9vL2Jhci5pIgoKICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSAiZm9vIiBpcyBub3cgYWRkZWQgdG8gdGhlIHNlYXJjaCBwYXRoIHdoaWxlIAogICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBiYXIuaS4gIFRodXMsIGlmIGJhci5pIGluY2x1ZGVzIG90aGVyCiAgICAgICAgICAgIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdGhleSB3aWxsIGJlIGZvdW5kLiBQcmV2aW91c2x5LAogICAgICAgICAgICB5b3Ugd291bGQgaGF2ZSB0byBhZGQgYWRkaXRpb25hbCBkaXJlY3RvcmllcyB1c2luZyAtSSB0byBtYWtlIHRoaXMKICAgICAgICAgICAgd29yayBjb3JyZWN0bHkuICBOb3RlOiB0aGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gYmVoYXZlIGluCiAgICAgICAgICAgIGFuIGlkZW50aWNhbCBtYW5uZXIgb24gbWFueSAobW9zdD8gYWxsPykgc3lzdGVtcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtlcmltIEJvcmNoYWV2LgoKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgb24gTWFjIE9TIFggMTAuMy54IChQYW50aGVyKS4KICAgICAgICAgICAgVGVzdGVkIHdpdGggUHl0aG9uLCBUY2wsIFBlcmwsIGFuZCBSdWJ5LS0tYWxsIG9mIHdoaWNoIHNlZW0gdG8gd29yay4KCjExLzA4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgdGhlIHR5cGVtYXBzIGluIHZhcmlvdXMuaSB3aGljaCB3ZXJlIG1vc3RseSBicm9rZW4uCiAgICAgICAgICAgIGNoYXIgKipTVFJJTkdfSU4gYW5kIGNoYXIgKipTVFJJTkdfUkVUIHR5cGVtYXBzIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIFNUUklOR19BUlJBWS4gZmxvYXQgKkZMT0FUX0FSUkFZX1JFVFVSTiB0eXBlbWFwIHJlbW92ZWQuCgoxMS8wOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIFRjbCBtb2R1bGUgbm93IGVtaXRzIGEgc2FmZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkKICAgICAgICAgICAgZGVmYXVsdC4gIEl0IGNhbiBiZSByZW1vdmVkIGJ5IHJ1bm5pbmcgJ3N3aWcgLW5vc2FmZScuCgoxMS8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBPbmx5IHVzZSB0aGUgU0NNXyBBUEkgd2hlbiB0aGUgZnVuY3Rpb24KCSAgICBgc2NtX3Nsb3RfZXhpc3RzX3AnIGV4aXN0cyAobmVlZGVkIGZvciBHT09QUyBzdXBwb3J0KS4gIAoJICAgIFRoaXMgZnVuY3Rpb24gd2FzIHJlbmFtZWQgZHVyaW5nIHRoZSBHdWlsZSAxLjUgc2VyaWVzCgkgICAgZnJvbSBgc2NtX3Nsb3RzX2V4aXN0c19wJy4KCSAgICBSZXBvcnQgdGhlIHJpZ2h0IHJ1bnRpbWUgbGlicmFyeSB3aGVuIGludm9rZWQgd2l0aAoJICAgIC1zY20gLWxkZmxhZ3MuCgoxMS8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEZpeCAjNzgyMDUyLiAgVGhlIC0td2l0aC1jaGlja2VuY2ZnIGNvbmZpZ3VyZQoJICAgIG9wdGlvbiAoYW5kIG90aGVycykgd2VyZSBub3QgYWNjZXB0ZWQuCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBNZXJnZSBuZXcgc2V0IG9mIEdPT1BTIGNoYW5nZXMgYnkgSm9obiBMZW56LgoJICAgIEdPT1BTIG9iamVjdHMgYXJlIG5vdyBtYW5pcHVsYXRlZCBkaXJlY3RseSBieSB0aGUgQyBjb2RlLgoJICAgIFNvbWUgZml4ZXMgdG8gdHlwZW1hcC1HT09QUyBpbnRlcmFjdGlvbi4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlbW92ZSB0aGUgZmlsZSBhcmd1bWVudCB0byAtc2Ntc3R1YiBhbmQgLWdvb3BzLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBhbHdheXMgY2FsbGVkIE1PRFVMRS5zY20gb3IKCSAgICBNT0RVTEUtcHJpbWl0aXZlLnNjbSwgd2hlcmUgTU9EVUxFIGlzIHRoZSBtb2R1bGUgbmFtZSBhbmQgCgkgICAgInByaW1pdGl2ZSIgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIC1wcmltc3VmZml4IG9wdGlvbi4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgcGxhY2VkIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkKCSAgICB0aGUgLW91dGRpciBvcHRpb24sIG9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCSAgICAoUGF0Y2ggYnkgSm9obiBMZW56LCBzbGlnaHRseSBtb2RpZmllZC4pCgoJICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW0d1aWxlXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBVbmlmeSB0aGUgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLiAgVGhlIHN0YW5kYXJkCgkgICAgZnVuY3Rpb25zIGFyZToKCSAgICAgKiBTV0lHX05ld1BvaW50ZXJPYmogKFBPSU5URVIsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBDcmVhdGUgYW4gc2NyaXB0aW5nIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB0eXBlZAoJCSAgIHBvaW50ZXIuIEZMQUdTIGFyZSBsYW5ndWFnZSBzcGVjaWZpYy4KCSAgICAgKiBTV0lHX0NvbnZlcnRQdHIgKElOUFVULCBSRVNVTFQsIFRZUEUsIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgc3RvcmUgaXQgaW4gdGhlIHBsYWNlIFJFU1VMVC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIAoJCSAgIG9jY3VycywgcmV0dXJuIG5vbnplcm8uCgkgICAgICogU1dJR19NdXN0R2V0UHRyIChJTlBVVCwgVFlQRSwgQVJHTlVNLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHJldHVybiBpdC4gIFdoZW4gYSB0eXBlIG1pc21hdGNoIG9jY3VycywgdGhyb3cgYW4KCQkgICBleGNlcHRpb24uICBJZiBBUkdOVU0gPiAwLCByZXBvcnQgaXQgYXMgdGhlIAoJCSAgIGFyZ3VtZW50IG51bWJlciB0aGF0IGhhcyB0aGUgdHlwZSBtaXNtYXRjaC4KICAgICAgICAgICAgW0d1aWxlXTogICAgTm8gY2hhbmdlcy4KCSAgICBbTXpTY2hlbWVdOiBObyBjaGFuZ2VzLgoJICAgIFtQZXJsXTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqLgoJCSAgICAgICAgVGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciBpcyBrZXB0LgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSBub3QKCQkJc3VwcG9ydGVkLgoJICAgIFtQeXRob25dOiAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtSdWJ5XTogICAgIEFkZCB0aGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyLgoJICAgIFtUY2xdOiAgICAgIFJlbW92ZSB0aGUgImludGVycCIgYXJndW1lbnQgb2YKCQkgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmosIFNXSUdfQ29udmVydFB0ciwKCQkgICAgICAgIFNXSUdfQ29udmVydFBhY2tlZCwgYW5kIFNXSUdfQ29udmVydFB0ckZyb21TdHJpbmcuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IAoJCQlub3Qgc3VwcG9ydGVkLgoJICAgIE5vIGNoYW5nZXMgdG8gUGlrZSBiZWNhdXNlIGl0cyBwb2ludGVyIGNvbnZlcnNpb24gY29kZSBkaWQKCSAgICBub3QgbG9vayBjb21wbGV0ZS4gIE5vIGNoYW5nZXMgdG8gUEhQNCwgYmVjYXVzZSBJIGRpZCBub3QKCSAgICB1bmRlcnN0YW5kIGl0cyBydW50aW1lIGNvZGUuICBObyBjaGFuZ2VzIHRvIENoaWNrZW4KCSAgICBiZWNhdXNlIG1ham9yIGNoYW5nZXMgYXJlIGV4cGVjdGVkIHNvb24gYW55d2F5LiAgTm8KCSAgICBjaGFuZ2VzIHRvIEphdmEsIE9DYW1sLCBDIyBiZWNhdXNlIHRoZXkgZG8gbm90IHNlZW0gdG8KCSAgICBoYXZlIGEgcG9pbnRlci1jb252ZXJzaW9uIHJ1bnRpbWUgQVBJLgoKICAgICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSBbVGNsXSAqKioKCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbUGVybDUsIFBIUDQsIFBpa2UsIFB5dGhvbiwgUnVieSwgVGNsXTogVXNlIHRoZQoJICAgIHByZXByb2Nlc3NvciB0byByZW5hbWUgZXh0ZXJuYWwgZnVuY3Rpb25zIG9mIHRoZSBTV0lHCgkgICAgcnVudGltZSBBUEkgdG8gZm9sbG93IHRoZSBuYW1pbmcgY29udmVudGlvbgoJICAgIFNXSUdfPGxhbmd1YWdlPl88ZnVuY3Rpb24+LiAgVGhpcyBzaG91bGQgYWxsb3cgbGlua2luZwoJICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJwcmV0ZXIgaW50byBhIHByb2dyYW0uCgoxMC8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggc2luY2UgaW50cm9kdWNpbmcgdGhlIGV4Y2VwdGlvbiBhbmQgc3RkOjpzdHJpbmcgZGVsZWdhdGVzLgogICAgICAgICAgICBUaGUgZml4IG92ZXJjb21lcyBsaW5rZXIgZXJyb3JzIHdoZW4gdXNpbmcgbW9yZSB0aGFuIG9uZSBTV0lHIG1vZHVsZS4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBBbmRyZWFzIFNjaPZyay4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyMzMwMiBdIEluY3IgVGNsIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEFsZXhleSBEeWFjaGVua28uCiAgICAgICAgICAgIE5vdGU6IG5lZWRzIGRvY3VtZW50YXRpb24uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMjUgXSBuZXcgUHl0aG9uIE1vZHVsZSBvcHRpb25zIGFuZCBmZWF0dXJlcy4KICAgICAgICAgICAgUm9iaW4gRHVubiB3cml0ZXM6CgogICAgICAgICAgICBUaGlzIHBhdGNoIG1ha2VzIGEgbnVtYmVyIG9mIGNoYW5nZXMgdG8gdGhlIFNXSUcgcHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAgIDEuIEFkZCAtYXBwbHkgb3B0aW9uLCBhbmQgY2hhbmdlIHRoZSBkZWZhdWx0IGNvZGUKICAgICAgICAgICAgb3V0cHV0IHRvIHVzZSB0aGUgZm9vKCphcmdzLCAqKmt3KSBjYWxsaW5nIHN5bnRheAogICAgICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwcGx5KCkuIElmIHRoZSAtYXBwbHkgb3B0aW9uIGlzCiAgICAgICAgICAgIGdpdmVuIHRoZW4gY29kZSBpcyBnZW5lcmF0ZWQgYXMgYmVmb3JlLiBUaGlzIGlzIHZlcnkKICAgICAgICAgICAgc2ltaWxhciB0byBQYXRjaCAjNzM3MjgxIGJ1dCB0aGUgbmV3IC1tb2Rlcm4gb3B0aW9uCiAgICAgICAgICAgIG1ha2VzIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGF0IHBhdGNoIHVubmVjZXNzYXJ5IHNvIGl0CiAgICAgICAgICAgIGlzIG5vdCBpbmNsdWRlZCBoZXJlLgoJICAgIAogICAgICAgICAgICAyLiBBZGQgLW5ld19yZXByIG9wdGlvbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBteSBQYXRjaAogICAgICAgICAgICAjNzk3MDAyIHdoaWNoIEkgd2lsbCBtYXJrIGFzIGNsb3NlZCBzaW5jZSBpdCBpcyBubwogICAgICAgICAgICBsb25nZXIgbmVlZGVkLiBXaGVuIHRoaXMgbmV3IG9wdGlvbiBpcyB1c2VkIHRoZW4gdGhlCiAgICAgICAgICAgIF9fcmVwcl9fIG1ldGhvZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIHdpbGwgYmUgbW9yZSBpbmZvcm1hdGl2ZSBhbmQgZ2l2ZSBkZXRhaWxzIGFib3V0IHRoZQogICAgICAgICAgICBweXRob24gY2xhc3MgYW5kIHRoZSBDKysgY2xhc3MuCgkgICAgCiAgICAgICAgICAgIDMuIEFkZCAlZmVhdHVyZSgiYWRkdG9mdW5jIikuIEl0IGFsbG93cyB5b3UgdG8gaW5zZXJ0CiAgICAgICAgICAgIG9uZSBvciBtb3JlIGxpbmVzIG9mIGNvZGUgaW5zaWRlIHRoZSBzaGFkb3cgbWV0aG9kIG9yCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgaXMgYWxyZWFkeSBnZW5lcmF0ZWQsIGluc3RlYWQgb2YKICAgICAgICAgICAgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyBsaWtlICVmZWF0dXJlKCJzaGFkb3ciKSBkb2VzLgogICAgICAgICAgICBGb3IgX19pbml0X18gaXQgZ29lcyBhdCB0aGUgZW5kLCBmb3IgX19kZWxfXyBpdCBnb2VzCiAgICAgICAgICAgIGF0IHRoZSBiZWdpbmluZyBhbmQgZm9yIGFsbCBvdGhlcnMgdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICAgIGlzIGV4cGFuZGVkIG91dCB0byBiZSBsaWtlCgkgICAgCiAgICAgICAgICAgIGRlZiBCYXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgdmFsID0gX21vZHVsZS5Gb29fQmFyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgcmV0dXJuIHZhbAoJICAgIAogICAgICAgICAgICBhbmQgdGhlICJhZGR0b2Z1bmMiIGNvZGUgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgdGhlCiAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCB1c2VkIGZvciBhCiAgICAgICAgICAgIHBhcnRpY3VsYXIgbWV0aG9kIG9yIGZ1bmN0aW9uIHRoZW4gdGhlIHNob3J0ZXIgY29kZSBpcwogICAgICAgICAgICBnZW5lcmF0ZWQganVzdCBsaWtlIGJlZm9yZS4KCSAgICAKICAgICAgICAgICAgNC4gQSBsaXR0bGUgYml0IG9mIHJlZmFjdG9yaW5nIHRvIG1ha2UgaW1wbGVtZW50aW5nCiAgICAgICAgICAgIGFkZHRvZnVuYyBhIGxpdHRsZSBlYXNpZXIuCgkgICAgCiAgICAgICAgICAgIDUuIEFkZGVkIGEgLW1vZGVybiBjb21tYW5kLWxpbmUgZmxhZyB0aGF0IHdpbGwgY2F1c2UKICAgICAgICAgICAgU1dJRyB0byBvbWl0IHRoZSBjcnVmdCBpbiB0aGUgcHJveHkgbW9kdWxlcyB0aGF0IGFsbG93cwogICAgICAgICAgICBpdCB0byB3b3JrIHdpdGggdmVyc2lvbnMgb2YgUHl0aG9uIHByaW9yIHRvIDIuMi4gVGhlCiAgICAgICAgICAgIHJlc3VsdCBpcyBhIHNpbXBsZXIsIGNsZWFuZXIgYW5kIGZhc3RlciBweXRob24gcHJveHkKICAgICAgICAgICAgbW9kdWxlLCBidXQgb25lIHRoYXQgcmVxdWlyZXMgUHl0aG9uIDIuMiBvciBncmVhdGVyLiAKCjEwLzMxLzIwMDM6IGJlYXpsZXkgCiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTkgXSBYTUwgbW9kdWxlIHR3ZWFrcy4KICAgICAgICAgICAgVGhpcyBhZGRzIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLXhtbGxpdGUgdGhhdCAKICAgICAgICAgICAgZ3JlYXRseSByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZW1pdHRlZCBYTUwgY29kZSBieQogICAgICAgICAgICBlbGltaW5hdGluZyBzb21lIGZpZWxkcyBtb3N0bHkgdXNlZCBpbiBTV0lHJ3MKICAgICAgICAgICAgaW50ZXJuYWwgcHJvY2Vzc2luZy4gIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjkzMTcgXSBBZGRzIERvaFNwbGl0TGluZXMgZnVuY3Rpb24uCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI3OTA3IF0gYXJnb3V0IG9iamVjdHMgbm90IGJlaW5nIHdyYXBwZWQgcHJvcGVybHkgKFBBVEgpLgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCSAgICAgCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MjY5OTYgXSBwZXJsIHR5cGUgY2hlY2tpbmcgaWdub3JlcyBwZXJsIHN1YmNsYXNzZXMuCiAgICAgICAgICAgIFRoaXMgZW5oYW5jZW1lbnQgbWFrZXMgaXQgc28gd3JhcHBlZCBjbGFzc2VzIGFuZCBzdHJ1Y3RzIGNhbgogICAgICAgICAgICBiZSBzdWJjbGFzc2VkIGluIFBlcmwgYW5kIHVzZWQgbm9ybWFsbHkuIAogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kafFvIEdhcmPtYS4KCjEwLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEludFB0ciBtYXJzaGFsbGVkIHdpdGggYSB2b2lkKiBpbnN0ZWFkIG9mIGludCBpbiBDIGZ1bmN0aW9uIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMuIFRoZSBjYXN0cyB0aHVzIGxvb2sgbW9yZSBjb252ZW50aW9uYWwsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIC8vIG9sZAogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3goaW50IGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9ICooU2hhcGUgKiopJmphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIG5ldwogICAgICAgICAgICAgICAgRGxsRXhwb3J0IGRvdWJsZSBTV0lHU1REQ0FMTCBDU2hhcnBfZ2V0X1NoYXBlX3godm9pZCAqIGphcmcxKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgU2hhcGUgKmFyZzEgPSAoU2hhcGUgKikgMCA7CiAgICAgICAgICAgICAgICAgICAgYXJnMSA9IChTaGFwZSAqKWphcmcxOyAKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgoxMC8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIHNtYXJ0IHBvaW50ZXJzLgogICAgICAgICAgICBJZiBhIGNsYXNzIGhhcyBvdmVybG9hZGVkIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQgeCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCB4LCBpbnQgeSk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGFuZCB0aGUgY2xhc3MgaXMgdXNlZCBhcyBhIHNtYXJ0IHBvaW50ZXI6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vUHRyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIFNXSUcgd291bGQgdHJ5IHRvIGV4cG9zZSB0aGUgc3RhdGljIG1lbWJlciBGb286OmJhcgogICAgICAgICAgICB0aHJvdWdoIEZvb1B0ci0tLXJlc3VsdGluZyBib2d1cyB3cmFwcGVyIGNvZGUgYW5kIGEgY29tcGlsZXIKICAgICAgICAgICAgZXJyb3IuCgogICAgICAgICAgICBEdWUgdG8gdGhlIHdheSBpbiB3aGljaCBvdmVybG9hZGluZyBpcyBoYW5kbGVkLCBpdCBpcwogICAgICAgICAgICBleHRyZW1lbHkgZGlmZmljdWx0IHRvIGVsaW1pbmF0ZSB0aGUgc3RhdGljIG1ldGhvZCBpbgogICAgICAgICAgICB0aGlzIGNhc2UuICBUaGVyZWZvcmUsIGl0IGlzIHN0aWxsIGV4cG9zZWQuICBIb3dldmVyLAogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgbm93IGNvbXBpbGVzIGFuZCB3b3Jrcy4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGUsIE16U2NoZW1lLCBDaGlja2VuXTogUmVtb3ZlIHN5bWJvbCBjbGFzaGVzIGJldHdlZW4KCSAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYnkgcmVuYW1pbmcgYWxsIGV4dGVybiBjb21tb24uc3dnCgkgICAgZnVuY3Rpb25zIHdpdGggdGhlIHByZXByb2Nlc3Nvci4KCjEwLzA1LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIGJhc2ljIEdPT1BTIHN1cHBvcnQsIGNvbnRyaWJ1dGVkIGJ5IEpvaG4gTGVuei4KCSAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCgkgICAgCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE5ldyBvcHRpb24sIC1vbmx5LXNldHRlcnMsIHdoaWNoIGRpc2FibGVzCgkgICAgdHJhZGl0aW9uYWwgZ2V0dGVyIGFuZCBzZXR0ZXIgcHJvY2VkdXJlcyBmb3Igc3RydWN0dXJlIHNsb3RzLgoKMTAvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgcnVuIHRlc3QgZm9yIHJlZmVyZW5jZV9nbG9iYWxfdmFycyBieSBKb2huIExlbnouCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFBhcnRpYWwgc29sdXRpb24gdG8gWyA3OTIxODAgXSBDKysgc21hcnQtcG9pbnRlci9uYW1lc3BhY2UgbWl4dXAgcmV2aXNpdGVkLgogICAgICAgICAgICBUaGUgcHJvYmxlbSBpcyBub3QgZWFzeSB0byBmaXggKGF0IGxlYXN0IGl0IGRvZXNuJ3Qgc2VlbSBzbyksIGJ1dCBpcwogICAgICAgICAgICByZWxhdGVkIHRvIHRoZSBpbnN0YW50aWF0aW9uIG9mIHF1YWxpZmllZCB0ZW1wbGF0ZXMgaW5zaWRlIG9mIG90aGVyCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICAgU1dJRyBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBjYXNlIHJhdGhlcgogICAgICAgICAgICB0aGFuIGdlbmVyYXRpbmcgYnJva2VuIHdyYXBwZXJzLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgwMDAxMiBdIEVOVEVSIG1hY3JvIGZyb20gQ09SRS9zY29wZS5oIGNsYXNoZXMgd2l0aCBsaWJjIHNlYXJjaC5oLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTE1MTggXSBDYXN0aW5nIGludHMgdG8gZG91YmxlcyAody8gc29sdXRpb24/KQogICAgICAgICAgICBBZGRyZXNzZXMgYSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRpbmcgaW4gdGhlIFBlcmwgbW9kdWxlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgRGFsbGV5LgoKMDkvMjgvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZSB3aXRoIC1zY20gb3B0aW9uXSBGaXggdHlwbyBpbiBnZW5lcmF0ZWQgY29kZSBmb3IKCSAgICBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycy4gIFJlcG9ydGVkIGJ5IEpvaG4gTGVuei4KCjA5LzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MTI1MjggXSBleHRlcm5zIG5vdCBjb3JyZWN0IHdoZW4gdGhyb3cgaXMgaW4gc2lnbmF0dXJlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KICAgICAgICAgICAgCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTV0lHIHdhcyBnZW5lcmF0aW5nIGEgbnVtYmVyIG9mIHN5bWJvbHMgdGhhdCBkaWRuJ3QgY29tcGx5IHdpdGggCiAgICAgICAgICAgIHRoZSBJU08gQy9DKysgc3RhbmRhcmQsIGluIHBhcnRpY3VsYXIgSVNPL0lFQyAxNDg4MjoxOTk4KEUpIDE3LjQuMy4xLjIKICAgICAgICAgICAgd2hlcmUgZG91YmxlIHVuZGVyc2NvcmVzIGFyZSBmb3JiaWRkZW4gYXMgd2VsbCBhcyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGgKICAgICAgICAgICAgYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhbiB1cHBlciBjYXNlIGxldHRlci4gTW9zdCBvZiB0aGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcm9vdGVkIG91dC4gU2VlIG5ldyBzZWN0aW9uIGFkZGVkIHRvIGludGVybmFscy5odG1sIGRldmVsb3BtZW50CiAgICAgICAgICAgIG1hbnVhbCAnU3ltYm9sIE5hbWluZyBHdWlkZWxpbmVzIGZvciBHZW5lcmF0ZWQgQy9DKysgQ29kZScuCgowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGlyZWN0b3IgdHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGludiAgICAgPT4gZGlyZWN0b3JpbgogICAgICAgICAgICBvdXR2ICAgID0+IGRpcmVjdG9yb3V0CiAgICAgICAgICAgIGFyZ291dHYgPT4gZGlyZWN0b3JhcmdvdXQKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMTkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgY29uc3RydWN0b3JzIG5vdyBkZWZhdWx0IHRvIF9fZGlzb3duID0gMCwgCgkgICAgd2hpY2ggaXMgdGhlIGludGVuZGVkIGJlaGF2aW9yIGFuZCBmaXhlcyB0aGUgZGlyZWN0b3JfZmluYWxpemVyIAoJICAgIHRlc3QgY2FzZSB1bmRlciBweXRob24uCgowOS8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSAtIFR5cGVtYXBzIGFkZGVkIGZvciBzdGQ6OnN0cmluZyBhbmQgY29uc3Qgc3RkOjpzdHJpbmcgJi4KICAgICAgICAgICAgICAgICAtIE5ldyBkZWxlZ2F0ZSBmb3IgY3JlYXRpbmcgYSBDIyBzdHJpbmcgZ2l2ZW4gYSBjaGFyICouIEl0CiAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBieSBjYWxsaW5nIFNXSUdfY3NoYXJwX3N0cmluZ19jYWxsYmFjayBhcyBzaG93bgogICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0ZDo6c3RyaW5nICdvdXQnIHR5cGVtYXAuIFVzZWZ1bCBpZiB0aGUgcmV0dXJuIHR5cGUgaXMKICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhIEMjIHN0cmluZyBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgCiAgICAgICAgICAgICAgICAgICBmb3IgY2xlYW5pbmcgdXAgbWVtb3J5IGFzIHRoZSBDIyBnYXJiYWdlIGNvbGxlY3RvciBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSBtZW1vcnkgY3JlYXRlZCBpbiBDL0MrKyBhbmQgdGhlbiByZXR1cm5lZCBhcyBhIEMjIHN0cmluZy4KICAgICAgICAgICAgICAgICAtIFRoZSBleGNlcHRpb24gZGVsZWdhdGVzIGhhdmUgbW92ZWQgaW50byBhbiBpbm5lciBjbGFzcyBpbiB0aGUKICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBjbGFzcywgdGhlcmVieSBmcmVlaW5nIHVwIHRoZSBzdGF0aWMgY29uc3RydWN0b3IuCgowOS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIChJbnRlcm5hbHMpCiAgICAgICAgICAgIE1ham9yIHJlZmFjdG9yaW5nIG9mIGl0ZXJhdGlvbiBvdmVyIGxpc3RzIGFuZCBoYXNoZXMuICBUaGUKICAgICAgICAgICAgRE9IIGxpYnJhcnkgbm93IHVzZXMgaXRlcmF0b3JzLiAgVGhleSB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBMaXN0ICpsID0gKHNvbWUgbGlzdCk7CgogICAgICAgICAgICAgICAgSXRlcmF0b3IgaTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGNvbnRhaW5zIHRoZSBhY3R1YWwgbGlzdCBpdGVtLgogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBpcyBOVUxMIGF0IGVuZCBvZiBsaXN0CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSGFzaCAqaCA9IChzb21lIGhhc2gpOwogICAgICAgICAgICAgICAgSXRlcmF0b3IgajsKICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGgpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gai5pdGVtIGNvbnRhaW5zIGhhc2ggdGFibGUgaXRlbQogICAgICAgICAgICAgICAgICAgIC8vIGoua2V5ICBjb250YWlucyBoYXNoIHRhYmxlIGtleQogICAgICAgICAgICAgICAgICAgIC8vIEJvdGggai5pdGVtIGFuZCBqLmtleSBhcmUgTlVMTCBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBUaGUgb2xkIGl0ZXJhdGlvbiBmdW5jdGlvbnMgRmlyc3RpdGVtKCksIE5leHRpdGVtKCksIEZpcnN0a2V5KCksCiAgICAgICAgICAgIGFuZCBOZXh0a2V5KCkgYXJlIGdvbmUuICAKCiAgICAgICAgICAgIFRoZSBuZXcgaXRlcmF0b3JzIGFyZSBzaW1wbGVyLCByZXN1bHQgaW4gYmV0dGVyIG1lbW9yeSB1c2UsCiAgICAgICAgICAgIGFuZCBtYXkgYmUgZmFzdGVyLiAgQWxzbywgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgcHJvYmxlbXMKICAgICAgICAgICAgaXRlcmF0aW5nIG92ZXIgdGhlIHNhbWUgbGlzdC9oYXNoIGluIG11bHRpcGxlIHBsYWNlcyBhdAogICAgICAgICAgICB0aGUgc2FtZSB0aW1lLiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgZmluZToKCiAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSxqOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IEZpcnN0KGwpOyBpLml0ZW07IGkgPSBOZXh0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QobCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoVGhpcyBuZXZlciB3b3JrZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMpLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgCiAgICAgICAgICAgIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMgdG8gU1dJRyAob3IgZ2l2ZSB0aGVtIGZ1cnRoZXIgZW5jb3VyYWdlbWVudAogICAgICAgICAgICB0byBqb2luIHRoZSBTV0lHIENWUy10cmVlIDotKS4KCjA5LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBtZW1vcnkgbGVha3MgaW4gdGhlICJsaXN0LXZlY3Rvci5pIiB0eXBlbWFwcy4KCjA5LzA5LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gVXNlIENfbWtfYm9vbCByYXRoZXIgdGhhbiBDX21rYm9vbC4gIFRoaXMgZml4ZXMKCSAgICB0aGUgd3JhcHBpbmcgb2YgYm9vbGVhbiB2YWx1ZXMgZm9yIENoaWNrZW4gMS4xMCBhbmQgbmV3ZXIuCgkgICAgUmVwb3J0ZWQgYnkgRGF2ZSA8aHVuZG9AeWFob28uY29tPiAvIEZlbGl4IFdpbmtlbG1hbm4KCSAgICA8ZmVsaXhAcHJveGltYS1tdC5kZT4uCgowOS8wNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9ycyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gSW4gc3VtbWFyeSB0aGlzIGlzIGEgYmlnIG5ldyBmZWF0dXJlIAogICAgICAgICAgICB3aGljaCBzdXBwb3J0cyB1cGNhbGxzIGZyb20gQysrIHRvIEphdmEuIENvZGUgaXMgZ2VuZXJhdGVkIHRvIHN1cHBvcnQgQysrIAogICAgICAgICAgICBjYWxsYmFja3MgdG8gY2FsbCBpbnRvIEphdmEgYW5kIHRydWUgcG9seW1vcnBoaWMgYmVoYXZpb3VyIGZvciBKYXZhIGNsYXNzZXMgCiAgICAgICAgICAgIGRlcml2ZWQgZnJvbSBDKysgY2xhc3Nlcy4gU2VlIGphdmEuaHRtbCBmb3IgZGV0YWlscy4gQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KCjA5LzA1LzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIENyZWF0ZWQgY29udHJhY3QgZXhhbXBsZSBkaXJlY3RvcnkgYXQgL1NXSUcvRXhhbXBsZXMvY29udHJhY3QKICAgICAgICAgICAgQWRkZWQgc2ltcGxlIGNvbnRyYWN0IGV4YW1wbGVzIChzaW1wbGVfYyAmIHNpbXBsZV9jeHgpCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IG1vZHVsZSdzIG91dHB1dCBmb3JtYXQKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUZXN0LXN1aXRlIGJ1aWxkIGltcHJvdmVtZW50czoKICAgICAgICAgICAgLSBNdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyB3b3JraW5nIGZvciB0aGUgdGVzdCBzdWl0ZSwgc28gaXQgaXMgbm93CiAgICAgICAgICAgICAgcG9zc2libGUgdG8gcnVuIGNvbmZpZ3VyZSBpbiBtdWx0aXBsZSBzdWJkaXJlY3RvcmllcyBhbmQgcnVuIHRoZSB0ZXN0CiAgICAgICAgICAgICAgc3VpdGUgaW4gZWFjaCBvZiB0aGVzZSBzdWIgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gJ21ha2UgZGlzdGNsZWFuJyBmaXhlZCBzbyBpdCBkb2Vzbid0IGJvbWIgb3V0IG9uIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkKICAgICAgICAgICAgICB3aGVuIHVzaW5nIG11bHRpcGxlIHN1YmRpcmV0b3J5IGJ1aWxkcy4gUmVxdWlyZWQgdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcwogICAgICAgICAgICAgIHRvIGJlIG1vdmVkOgogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QZXJsIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGVybDUKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGhwICAtPiBFeGFtcGxlcy9HSUZQbG90L1BocDQKICAgICAgICAgICAgICBUaGVzZSBuZXcgZGlyZWN0b3JpZXMgdXNlZCB0byBiZSBzeW1ib2xpYyBsaW5rcyB0byB0aGUgb2xkIGRpcmVjdG9yeS4KICAgICAgICAgICAgICBBbHNvIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL1Blcmwgc3ltYm9saWMgbGluayBoYXMgYmVlbiByZW1vdmVkLgogICAgICAgICAgICAtIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIG90aGVyIHRoYW4gZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnksIHNheQogICAgICAgICAgICAgIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvcHl0aG9uIHdpbGwgbm93IGRpc3BsYXkgYWxsIHRoZSBjb2RlIGJlaW5nCiAgICAgICAgICAgICAgZXhlY3V0ZWQuCiAgICAgICAgICAgIC0gVGhlIGZvbGxvd2luZyAzIEMjIGNvbXBpbGVycyBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSBhbmQgd29yayB3aXRoIAogICAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlOiBNb25vLCBQb3J0YWJsZS5ORVQgYW5kIE1pY3Jvc29mdC4KCjA5LzAxLzIwMDM6IFRpZ2VyCiAgICAgICAgICAgIEFkZGVkIGluaGVyaXRhbmNlIHN1cHBvcnQgZm9yIGRlc2lnbiBieSBjb250cmFjdCBmZWF0dXJlLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NDkxNCBdIFdyb25nIHR5cGVzIGluIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBTV0lHIHdhcyBub3QgaGFuZGxpbmcgYXJndW1lbnRzIGNvcnJlY3RseSBpbiB0ZW1wbGF0ZSAKICAgICAgICAgICAgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbzxUICo+IHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBUICpibGFoKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29JbnQpIEZvbzxpbnQgKj47CgogICAgICAgICAgICBpbiB0aGlzIGNsYXNzLCB0aGUgcmV0dXJuIHR5cGUgb2YgYmxhaCB3YXMgc2V0IHRvCiAgICAgICAgICAgICdpbnQgKionLCBidXQgaXQgc2hvdWxkIHJlYWxseSBiZSAnaW50IConLiAgVGhpcyBoYXMgYmVlbgogICAgICAgICAgICBmaXhlZCwgYnV0IGl0IHdpbGwgYWZmZWN0IGFsbCBwcmlvciB1c2VzIG9mIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24uCiAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NjM5NCBdIFBhdGNoIGZvciBnZW5lcmF0ZWQgcGVybCBjb2RlIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgUmVkSGF0OS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2NvdHQgRmlubmVyYW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxNTc5IF0gKHVuc2lnbmVkKSBsb25nIGxvbmcgaGFuZGxlZCBpbmNvcnJlY3RseSAoVGNsKS4KICAgICAgICAgICAgVGhpcyB3YXMgYW4gZXJyb3IgaW4gdGhlIFRjbCB0eXBlbWFwcy5pIGZpbGUuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBLamVsbCBXb29kaW5nLgogICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTczIF0gbm8gd2F5IHRvIHJlbmFtZSBjbGFzc2VzIGNvbWluZyBmcm9tIEMgc3RydWN0dXJlcy4KICAgICAgICAgICAgVGhpcyBwcm9ibGVtIHJlbGF0ZXMgdG8gcmVuYW1pbmcgb2YgYW5vbnltb3VzIHN0cnVjdHVyZXMgd2l0aCBhCiAgICAgICAgICAgIHR5cGVkZWYuICBGb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgogICAgICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3NiBdIC1oZWxwIHNlZW1zIHRvIGltcGx5IHRoYXQgb25seSB0Y2wtc3BlY2lmaWMgb3B0aW9ucyBleGlzdC4KICAgICAgICAgICAgQWRkZWQgYSBjb21tZW50IHRvIGFsZXJ0IHVzZXIgdG8gb3RoZXIgb3B0aW9ucy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk4MjA1IF0gU2VnZmF1bHQgaW4gU1dJR19Db252ZXJ0UHRyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBQcmFiaHUgUmFtYWNoYW5kcmFuLgoKMDgvMzAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTW9kaWZpZWQgdGhlIGRpcmVjdG9yIHR5cGVtYXBzIGluIHB5dGhvbi9zdGRfY29tcGxleC5pIHRvIHVzZSB0aGUgCgkgICAgbmV3LXN0eWxlIG1hY3JvIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucywgd2hpY2ggZWxpbWluYXRlZCBzb21lCgkgICAgcmVkdW5kYW50IGNvZGUuICBGaXhlZCBhIGZldyBidWdzIGluIHRoZXNlIHR5cGVtYXBzIGFzIHdlbGwsIGFsdGhvdWdoCgkgICAgbW9yZSB0ZXN0aW5nIGlzIG5lZWRlZC4KCjA4LzI5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENvbXBsZXRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIGFic3RyYWN0IGNsYXNzZXMgd2l0aCBkaXJlY3RvcnMuCgkgICAgQ29uc3RydWN0b3Igd3JhcHBlcnMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGFic3RyYWN0IGNsYXNzZXMgdGhhdCBoYXZlCgkgICAgZGlyZWN0b3JzLCBhbmQgaW5zdGFuY2VzIG9mIHRoZSBkaXJlY3RvciBjbGFzc2VzIHdpbGwgYmUgY3JlYXRlZCByZWdhcmRsZXNzCgkgICAgb2Ygd2hldGhlciB0aGUgcHJveHkgY2xhc3MgaGFzIGJlZW4gc3ViY2xhc3NlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoJICAgIE5vIGNoZWNrcyBhcmUgbWFkZSBkdXJpbmcgY29uc3RydWN0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBwdXJlIHZpcnR1YWwKCSAgICBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSW5zdGVhZCwgY2FsbHMgdG8KCSAgICB1bmltcGxlbWVudGVkIG1ldGhvZHMgd2lsbCB0aHJvdyBTV0lHX0RJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04KCSAgICBleGNlcHRpb25zIGluIEMrKy4KCgkgICAgSW50ZWdyYXRlZCBQcmFiaHUgUmFtYWNoYW5kcmFuJ3MgdHlwZW1hcCBwYXRjaGVzLCB3aGljaCBwcm92aWRlIGRpcmVjdG9yCgkgICAgdHlwZW1hcCBzdXBwb3J0IGZvciBlbnVtcyBhbmQgc3RkOjpzaXplX3QsIGFuZCBmaXggYSBjb3VwbGUgYnVncyBpbiB0aGUgCgkgICAgZGlyZWN0b3Igc3RkOjp2ZWN0b3I8PiB0eXBlbWFwcy4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcGxlbWVudGVkIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgdGhyb3dpbmcgQyMgZXhjZXB0aW9ucyBmcm9tIEMvQysrIGNvZGUuCiAgICAgICAgICAgIEEgZmV3IGRlbGVnYXRlIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBjYWxsaW5nIHdoaWNoIHRoZW4gdGhyb3cgdGhlIEMjCiAgICAgICAgICAgIGV4Y2VwdGlvbi4gVXNlIHRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uIGZ1bmN0aW9uIGZyb20gQy9DKysgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBvciBjc2hhcnBoZWFkLnN3ZyBmb3IgYWxsIGF2YWlsYWJsZSBleGNlcHRpb25zLgogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKFNXSUdfQ1NoYXJwRXhjZXB0aW9uLCAiZXhjZXB0aW9uIGRlc2NyaXB0aW9uIik7CgogICAgICAgICAgICBUaGUgJ3Rocm93cycgdHlwZW1hcHMgYXJlIGFsc28gbm93IGltcGxlbWVudGVkLCBzbyBjb2RlIGlzIGF1dG9tYXRpY2FsbHkgCiAgICAgICAgICAgIGdlbmVyYXRlZCB0byBjb252ZXJ0IGFueSBDKysgZXhjZXB0aW9uIGludG8gYSBDIyBTeXN0ZW0uRXhjZXB0aW9uIHdoZW4gdGhlIEMrKyAKICAgICAgICAgICAgbWV0aG9kIGRlY2xhcmVzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHN1Y2ggYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKCkgdGhyb3coQmFyKTsKCiAgICAgICAgICAgIEFsc28gYW55IHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBhIEMrKyBjbGFzcyBvciBhIGNsYXNzIHBhc3NlZCBieSB2YWx1ZQogICAgICAgICAgICBhbmQgYXJlIHBhc3NlZCBhcyBhIEMjIG51bGwgd2lsbCBub3cgdGhyb3cgYSBDIyBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHRvIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgYWxsIHBpbnZva2UgbWV0aG9kcyBzbyB0aGF0IHRoZXkKICAgICAgICAgICAgbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IGRlZmF1bHQgaW4gdGhlIEMjICdzdGF0aWMgZXh0ZXJuJyBkZWNsYXJhdGlvbnMgCiAgICAgICAgICAgIChfX3N0ZGNhbGwgaXMgdXNlZCBvbiBXaW5kb3dzKS4KCjA4LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmV3b3JrZWQgc3RkOjpzdHJpbmcgdHlwZW1hcHMuIEZpeGVzIGEgbnVtYmVyIG9mIHN0cmluZyBpbiBzdGQgbmFtZXNwYWNlIAogICAgICAgICAgICBwcm9ibGVtcy4gRm9yIGV4YW1wbGUgJXRlbXBsYXRlIHZlY3RvcjxzdHJpbmc+LiBUaGUgdGVtcGxhdGVkIGNsYXNzJyBnZXQgbWV0aG9kIAogICAgICAgICAgICB3YXNuJ3QgcmV0dXJuaW5nIGEgSmF2YSBTdHJpbmcsIGJ1dCBhIFNXSUdUWVBFX3Bfc3RyaW5nLiBSZXBvcnRlZAogICAgICAgICAgICBieSBaYWNoIEJhdW0uCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTIyIF0gMS4zLjE5IHNlZ2ZhdWx0IGluIFN3aWdUeXBlX2FkZF9wb2ludGVyL0RvaEluc2VydGl0ZW0uCiAgICAgICAgICAgIFJlbGF0ZWQgdG8gcHJvYmxlbSB3aXRoIHVubmFtZWQgY2xhc3MgaGFuZGxpbmcgaW4gUGVybCBtb2R1bGUuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzYzNTYzIF0gTWlzc2luZyBpbmRpY2F0aW9uIG9mIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgICAgICAgVGNsIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgowOC8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg3NDMyIF0gbG9uZyBwYXJhbSBoYW5kbGVkIGFzIGludC4gIFRjbCBtb2R1bGUKICAgICAgICAgICAgbm93IHVzZXMgVGNsX0dldExvbmdGcm9tT2JqIHRvIGNvbnZlcnQgaW50ZWdlciB2YWx1ZXMuCgowOC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1OTg5IF0gbnVtZXJpYyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgIFRoZXJlIHdlcmUKICAgICAgICAgICAgc29tZSBlcnJvcnMgaW4gdGVtcGxhdGUgZXhwYW5zaW9uIHJlbGF0ZWQgdG8gdGhlIHVzZSBvZgogICAgICAgICAgICBhcnJheXMgd2hlcmUgdGhlIGFycmF5IGRpbWVuc2lvbiB3YXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFJlcG9ydGVkIGJ5IEJyeWFuIEdyZWVuLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBkaXJlY3RvciB0eXBlbWFwIChvdXR2KSBmb3IgcmV0dXJuIGJ5IHZhbHVlIGFuZCBjbGVhbmVkIHVwIHVwIGEgZmV3IAoJICAgIG9mIHRoZSBjb21tZW50ZWQgZGlyZWN0b3IgdHlwZW1hcHMuCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uIGZvciBkaXJlY3RvciBjbGFzc2VzIHRvIGlnbm9yZSBwcml2YXRlCgkgICAgY29uc3RydWN0b3JzLiAgUHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhcmUgYWxzbyBpZ25vcmVkIGZvciBub3csIHBlbmRpbmcKCSAgICBhIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIG9mIHdyYXBwaW5nIGNsYXNzZXMgdGhhdCBvbmx5IGRlZmluZSBwcm90ZWN0ZWQKCSAgICBjb25zdHJ1Y3RvcnMuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtb3V0ZGlyIDxkaXI+IHRvIHNwZWNpZnkgd2hlcmUgdGhlIGxhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGZpbGVzIGFyZSB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0YXJnZXQgbGFuZ3VhZ2VzIGxpa2UgUHl0aG9uLAogICAgICAgICAgICBKYXZhIGV0YyB3aGljaCBnZW5lcmF0ZSBwcm94eSBmaWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UuCiAgICAgICAgICAgIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUuCgowOC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgT24gV2luZG93cyB0aGUgZ2VuZXJhdGVkIGZpbGVzIChvdGhlciB0aGFuIHRoZSBfd3JhcC5jIG9yIF93cmFwLmN4eCBmaWxlcykKICAgICAgICAgICAgd2VyZSBzb21ldGltZXMgaW5jb3JyZWN0bHkgYmVpbmcgZ2VuZXJhdGVkIGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVubGVzcwogICAgICAgICAgICB0aGUgaW5wdXQgZmlsZSB1c2VkIHRoZSBVbml4IHBhdGggc2VwYXJhdG9yLiBUaGUgV2luZG93cyBwYXRoIHNlcGFyYXRvciAKICAgICAgICAgICAgc2hvdWxkIG5vdyBiZSB1c2VkLiBCdWcgcmVwb3J0ZWQgYnkgUm9iZXJ0IERhdmllcy4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYXJyYXkgdmFyaWFibGUgc2V0IHR5cGVtYXAgdG8gUGVybCBtb2R1bGUuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc1Njc3IF0gQXJyYXkgaW5pdCBjYXVzZXMgY29kZWdlbiBidWcuLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3OTA2MiBdIENsYXNzIlxuIjo6Zm9vIG5vdCBzdXBwb3J0ZWQuICBTV0lHCiAgICAgICAgICAgIHNob3VsZCBub3cgY29ycmVjdGx5IGhhbmRsZSB3aGl0ZXNwYWNlIGluIGJldHdlZW4gCiAgICAgICAgICAgIG5hbWVzcGFjZSBxdWFsaWZpZXJzLiAgRm9yIGV4YW1wbGUgIkEgOjogRm9vIDo6IEJhciIuCiAgICAgICAgICAgIAowNy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIHBhcmFtZXRlcnMgd2hpY2ggYXJlIGNsYXNzZXMgdGhhdCBhcmUgcGFzc2VkIGJ5IHZhbHVlIGFuZCBoYXZlIAogICAgICAgICAgICBhIGRlZmF1bHQgdmFsdWUuIEEgY29weSBjb25zdHJ1Y3RvciBmb3IgU3dpZ1ZhbHVlV3JhcHBlciBpcyByZXF1aXJlZCAKICAgICAgICAgICAgKFNGICM3ODAwNTYpLiBBbHNvIGZpeGVkIG1lbW9yeSBsZWFrIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMuIFRoZXNlIG1vZHMKICAgICAgICAgICAgYWxzbyBmaXggU0YgIzc4MDA1NC4KCjA3LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgcnVuLXRpbWUgZXJyb3IgbWVzc2FnZSBmb3IgcG9pbnRlcnMgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgWm9va28uCgowNy8xMC8yMDAzOiBiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIFtBbG1vc3QgYWxsIGxhbmd1YWdlc10gV3JhcHBlcnMgZm9yIHN0ZDo6cGFpciBhZGRlZC4KCSAgICBUeXBlbWFwcyBmb3IgUHl0aG9uLCBSdWJ5LCBHdWlsZSBhbmQgTXpTY2hlbWUuCgowNy8wMS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIEhhbmRsZSB0aGUgY2FzZSBvZiBtb3JlIHRoYW4gb25lIGFyZ291dCB0eXBlbWFwCgkgICAgcGVyIGZ1bmN0aW9uLgoKMDYvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gU0YgIzY3MDk0OSByZXF1ZXN0LiBUaGUgZGVzdHJ1Y3RvciB3cmFwcGVyIGZ1bmN0aW9uIG5hbWUgaXMgbm93IAogICAgICAgICAgICBjb25maWd1cmFibGUuICBBIG5ldyBhdHRyaWJ1dGUgY2FsbGVkIG1ldGhvZG5hbWUgaW4gdGhlIAogICAgICAgICAgICBqYXZhZGVzdHJ1Y3QvamF2YWRlc3RydWN0X2Rlcml2ZWQgKEphdmEpIG9yIGNzZGVzdHJ1Y3QvY3NkZXN0cnVjdF9kZXJpdmVkIChDIykKICAgICAgICAgICAgdHlwZW1hcHMgc3BlY2lmaWVzIHRoZSBtZXRob2QgbmFtZS4gRm9yIGV4YW1wbGUgaW4gSmF2YSB0aGUgZGVzdHJ1Y3RvciBpcyAKICAgICAgICAgICAgd3JhcHBlZCBieSBkZWZhdWx0IHdpdGggdGhlIGRlbGV0ZSBtZXRob2Q6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWRlc3RydWN0LCBtZXRob2RuYW1lPSJkZWxldGUiKSBTV0lHVFlQRSB7Li4ufQoKMDYvMjcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIHRocm93cyBhdHRyaWJ1dGUgZm9yIGFkZGluZyBleGNlcHRpb24gY2xhc3NlcyB0byB0aGUgdGhyb3dzCiAgICAgICAgICAgIGNsYXVzZSBhbHNvIG5vdyB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IAogICAgICAgICAgICBuZXdmcmVlCiAgICAgICAgICAgIGphdmFpbiwgamF2YW91dCAoSmF2YSkKICAgICAgICAgICAgY3NpbiwgY3NvdXQgKEMjKQoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSAnQW5FeGNlcHRpb24nIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRocm93cyBjbGF1c2UgaW4gdGhlCiAgICAgICAgICAgIHByb3h5IGZ1bmN0aW9uOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCwgdGhyb3dzPSJBbkV4Y2VwdGlvbiIpIGludCB7CiAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsdWU9JGpuaWNhbGw7CiAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWU9PTApIHRocm93IG5ldyBBbkV4Y2VwdGlvbigiVmFsdWUgbXVzdCBub3QgYmUgemVybyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwogICAgICAgICAgICB9CgowNi8yNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciB0eXBlbWFwIG1hcnNoYWxsaW5nIGNoZWNrcyBmb3IgbnVsbCBwb2ludGVycyB3aGVuCgkgICAgd2Fsa2luZyB0aGUgcGFyYW1ldGVyIGxpc3QgaW5zdGVhZCBvZiByZWx5aW5nIHNvbGV5IG9uIHRoZSBwYXJhbWV0ZXIKCSAgICBjb3VudC4gIEN1cmVzIGEgc2VnZmF1bHQgdGhhdCBvY2N1cnJlZCBmb3IgbXVsdGlwbGUgYXJndW1lbnQgaW52IHR5cGVtYXBzLgoJICAgIFNvbWVvbmUgd2l0aCBtb3JlIFN3aWcgZXhwZXJpZW5jZSBzaG91bGQgcHJvYmFibHkgcmV2aWV3IHRoaXMgY29kZS4KCjA2LzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRG9uJ3QgZW1pdCBjYWxscyB0byAiQ19jaGVja19mb3JfaW50ZXJydXB0IiwKCSAgICB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGVuZGxlc3MgbG9vcC4gIFBhdGNoIGJ5IGZlbGl4QHByb3hpbWEtbXQuZGUuCgowNi8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaW5hbGl6ZXJzIG5vdyB1c2UgZGVzdHJ1Y3RvciBzeW50YXggYXMgdGhlIG92ZXJyaWRlIHdoaWNoIHdhcyB1c2VkIGluIAogICAgICAgICAgICB0aGUgRmluYWxpemUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgRUNNQSBzdGFuZGFyZHMsIHNwb3R0ZWQgYnkgdGhlIE1TIGNvbXBpbGVyLgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQSBudW1iZXIgb2YgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byByZW1vdmUgdGhlIEphdmEgbmFtaW5nIAogICAgICAgICAgICB0aGF0IHdhcyB1c2VkIGluIHRoZSBDIyBtb2R1bGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUeXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgam5pICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGN0eXBlCiAgICAgICAgICAgIGp0eXBlICAgICAgICAgICAgICAgICAgICAgICAtPiBpbXR5cGUKICAgICAgICAgICAganN0eXBlICAgICAgICAgICAgICAgICAgICAgIC0+IGNzdHlwZQogICAgICAgICAgICBqYXZhaW4gICAgICAgICAgICAgICAgICAgICAgLT4gY3NpbgogICAgICAgICAgICBqYXZhb3V0ICAgICAgICAgICAgICAgICAgICAgLT4gY3NvdXQKICAgICAgICAgICAgamF2YWludGVyZmFjZXMgICAgICAgICAgICAgIC0+IGNzaW50ZXJmYWNlcwogICAgICAgICAgICBqYXZhYmFzZSAgICAgICAgICAgICAgICAgICAgLT4gY3NiYXNlCiAgICAgICAgICAgIGphdmFjbGFzc21vZGlmaWVycyAgICAgICAgICAtPiBjc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFjb2RlICAgICAgICAgICAgICAgICAgICAtPiBjc2NvZGUKICAgICAgICAgICAgamF2YWltcG9ydHMgICAgICAgICAgICAgICAgIC0+IGNzaW1wb3J0cwogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgLT4gY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycwogICAgICAgICAgICBqYXZhZ2V0Y3B0ciAgICAgICAgICAgICAgICAgLT4gY3NnZXRjcHRyCiAgICAgICAgICAgIGphdmFmaW5hbGl6ZSAgICAgICAgICAgICAgICAtPiBjc2ZpbmFsaXplCgogICAgICAgICAgICBGZWF0dXJlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgamF2YWNvbnN0ICAgICAgICAgICAgICAgICAgIC0+IGNzY29uc3QKICAgICAgICAgICAgamF2YW1ldGhvZG1vZGlmaWVycyAgICAgICAgIC0+IGNzbWV0aG9kbW9kaWZpZXJzCgogICAgICAgICAgICBQcmFnbWEgY2hhbmdlczoKICAgICAgICAgICAgcHJhZ21hKGphdmEpICAgICAgICAgICAgICAgIC0+IHByYWdtYShjc2hhcnApCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzICAgICAgLT4gaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzY29kZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2ltcG9ydHMgICAgICAgICAgICAgLT4gaW1jbGFzc2ltcG9ydHMKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2VzICAgICAgICAgIC0+IGltY2xhc3NpbnRlcmZhY2VzCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgICAgICAgICAgICAgIC0+ICRjc2NsYXNzbmFtZQogICAgICAgICAgICAkamF2YWlucHV0ICAgICAgICAgICAgICAgICAgLT4gJGNzaW5wdXQKICAgICAgICAgICAgJGpuaWNhbGwgICAgICAgICAgICAgICAgICAgIC0+ICRpbWNhbGwKCiAgICAgICAgICAgIFRoaXMgd2lsbCBicmVhayBTV0lHIGludGVyZmFjZSBmaWxlcyB0aGF0IHVzZSB0aGVzZSB0eXBlbWFwcywgZmVhdHVyZXMKICAgICAgICAgICAgYW5kIHByYWdtYXMuIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIG9yIHVzZSBtYWNyb3MgZm9yIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIEFwcGxpZWQgTXpTY2hlbWUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uCgogICAgICAgICAgICAtIFVwZGF0ZWQgbXpzY2hlbWUgdG8gdXNlIFNXSUcncyBjb21tb24gcnVudGltZSB0eXBlCiAgICAgICAgICAgICAgc3lzdGVtIGZyb20gY29tbW9uLnN3Zy4gCgoJICAgIC0gVGhlIExpYi9tenNjaGVtZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgdGhlIGxhbmd1YWdlIG1vZHVsZXM6CiAgICAgICAgICAgICAgbXpzY2hlbWUuaSB3YXMgbW92ZWQgdG8gbXpzY2hlbWUuc3dnLCBtenNjaGVtZS5zd2cgYW5kCiAgICAgICAgICAgICAgbXpzY2hlbWVkZWMuc3dnIGhhdmUgYmVlbiByZW1vdmVkLCBtenJ1bi5zd2cgKHdoaWNoCiAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJ1bnRpbWUgY29kZSkgaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAtIFRoZSBzd2lnX3Byb3h5IHN0cnVjdHVyZSB3YXMgcmVuYW1lZCB0byBzd2lnX216X3Byb3h5LgogICAgICAgICAgICAgIHN3aWdfbXpfcHJveHkgbm93IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvCiAgICAgICAgICAgICAgc3RydWN0dXJlLiAgCgoJICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kCiAgICAgICAgICAgICAgU1dJR1RZUEUgJi4KCgkgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gYnkgY2FsbGluZyBzY2hlbWVfYWRkX2ZpbmFsaXplcigpIGhhcwogICAgICAgICAgICAgIGJlZW4gYWRkZWQuCgoJICAgICoqKiBORVcgRkVBVFVSRSBbTXpTY2hlbWVdICoqKgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcHM6IGphdmFkZXN0cnVjdCBhbmQgamF2YWRlc3RydWN0X2Rlcml2ZWQKICAgICAgICAgICAgZm9yIHRoZSBDKysgZGVzdHJ1Y3RvciB3cmFwcGVyLiBUaGUgamF2YWRlc3RydWN0IHZlcnNpb24gZ2V0cyB1c2VkIGJ5CiAgICAgICAgICAgIGNsYXNzZXMgYXQgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBjaGFpbiBhbmQgdGhlIGphdmFkZXN0cnVjdF9kZXJpdmVkIAogICAgICAgICAgICB2ZXJzaW9uIGdldHMgdXNlZCBieSBvdGhlciBjbGFzc2VzLgoKICAgICAgICAgICAgW0MjXSBjaWxkaXNwb3NlIGFuZCBjaWxkaXNwb3Nlb3ZlcnJpZGUgdHlwZW1hcHMgcmVwbGFjZWQgYnkKICAgICAgICAgICAgY3NkZXN0cnVjdCBhbmQgY3NkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXBzLiBUaGUgZGVsZXRlKCkKICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0cyBmdW5jdGlvbmFsaXR5IHB1dCBpbnRvIHRoZXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGRlc2lnbmVkIGZvciB0aGUgRGlzcG9zZSgpIG1ldGhvZC4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXBzIGNzaW50ZXJmYWNlcyBhbmQgY3NpbnRlcmZhY2VzX2Rlcml2ZWQgcmVwbGFjZQogICAgICAgICAgICB0aGUgamF2YWludGVyZmFjZXMgdHlwZW1hcC4gQWxzbyBmaXhlcyB0aGUgcGVjdWxpYXJpdHkgb2YgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4gaW5kaXZpZHVhbGx5IGRlcml2aW5nIGZyb20gdGhlIElEaXNwb3NhYmxlIAogICAgICAgICAgICBpbnRlcmZhY2UuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwIGNzZmluYWxpemUgZm9yIGZpbmFsaXplcnMuIEMrKyBkZXN0cnVjdG9ycyBhcmUgbm93IGNhbGxlZAogICAgICAgICAgICBieSBnYXJiYWdlIGNvbGxlY3RvciBkdXJpbmcgZmluYWxpemF0aW9uLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBBbmRyZWFzIFNjaPZyay4KCjA2LzEwLzIwMDM6IFRpZ2VyCgkgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSBmb3IgZXJyb3IgbWVzc2FnZSBvdXRwdXQuCiAgICAgICAgICAgIENvbnRyYWN0IGNvZGUgY2FuIG5vdyBwcmludCBvdXQgc2ltcGxlIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgdG8gcHJlcGFyZSBmb3IgaW5oZXJpdGFuY2UKICAgICAgICAgICAgCjA2LzAzLzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFwcGxpZWQgR3VpbGUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkgCgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LiAKCgkgICAgLSBTV0lHIGN1cnJlbnRseSB1c2VzIEd1aWxlJ3MgZ2hfIEFQSSwgd2hpY2ggaXMgbWFya2VkIGFzCgkgICAgICBkZXByZWNhdGVkIGluIEd1aWxlIDEuNiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEd1aWxlCgkgICAgICAxLjkuICBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgY29tbWFuZC1saW5lIGZsYWcgIi1zY20iCgkgICAgICB3aGljaCBjYXVzZXMgU1dJRyB0byBnZW5lcmF0ZSB3cmFwcGVycyB0aGF0IHVzZSBHdWlsZSdzCgkgICAgICBTQ00gQVBJIGluc3RlYWQ7IHRoaXMgcmVxdWlyZXMgR3VpbGUgPj0gMS42LgoJICAgIAoJICAgIC0gVGhlIExpYi9ndWlsZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgbGFuZ3VhZ2UgbW9kdWxlczogZ3VpbGVkZWMuc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlLnN3ZyBoYXZlIGJlZW4gbW92ZWQgaW50byBndWlsZV9naF9ydW4uc3dnLAogICAgICAgICAgICAgIGd1aWxlLmkgaGFzIGJlZW4gbW92ZWQgdG8gZ3VpbGVfZ2guc3dnLCBndWlsZV9zY20uc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlX3NjbV9ydW4uc3dnIHdoaWNoIGNvbnRhaW4gdGhlIFNDTSBBUEkgc3R1ZmYKICAgICAgICAgICAgICBoYXZlIGJlZW4gYWRkZWQKCgkgICAgLSBnaGludGVyZmFjZS5pLCB3aGljaCBjb250YWlucyB0aGUgZGVmaW5lcyBmcm9tIHRoZSBnaF8KICAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gdGhlIHNjbV9mdW5jdGlvbnMgaGFzIGJlZW4gYWRkZWQKCgkgICAgLSBUaGUgQVBJIGZvciBkZWFsaW5nIHdpdGggcG9pbnRlciBvYmplY3RzIGlzIG5vdwoJICAgICAgU1dJR19Db252ZXJ0UHRyLCBTV0lHX011c3RHZXRQdHIsIFNXSUdfTmV3UG9pbnRlck9iai4KCiAgICAgICAgICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kIFNXSUdUWVBFICYKCiAgICAgICAgICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFIFtHdWlsZV0gKioqCgkgICAgCQowNi8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGltZW5zaW9ubGVzcyBhcnJheXMgc3VjaCBhcyAKCiAgICAgICAgICAgICAgICBpbnQgZm9vW10gPSB7MSwgMn07CiAgICAgICAgICAgICAgICBleHRlcm4gaW50IGJhcltdOwoKICAgICAgICAgICAgcHJvZHVjZSBhIHdhcm5pbmcgdGhhdCB0aGUgdmFyaWFibGUgaXMgcmVhZC1vbmx5LiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSwgdGhpcyB1c2VkIHRvIGNhdXNlIGNvbXBpbGUgZXJyb3JzIG9yIGdlbmVyYXRlIGEgc2V0dGVyIHRoYXQKICAgICAgICAgICAgZ2VuZXJhdGVkIGEgcnVudGltZSBlcnJvci4gQSBzZXR0ZXIgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlIGFycmF5IHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgU1dJRy4gQSB2YXJpbiwgZ2xvYmFsaW4gCiAgICAgICAgICAgIG9yIG1lbWJlcmluIHR5cGVtYXAgKGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKSBtdXN0IGJlIHdyaXR0ZW4gCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyLgoKMDUvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWZpbmVtZW50IHRvIGRlZmF1bHQgdHlwZW1hcCBtYXRjaGluZyBhbmQgYXJyYXlzLiAgV2hlbiBhbgogICAgICAgICAgICBhcnJheSBpcyBkZWNsYXJlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgIGludCBmb29bNF07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwIG5vdyByZXNvbHZlcyB0byAKCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW0FOWV0KCiAgICAgICAgICAgIElmIG5vIG1hdGNoIGlzIGZvdW5kIGZvciB0aGF0LCBpdCB0aGVuIHJlc29sdmVzIHRvCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCgogICAgICAgICAgICBJZiBubyBhcnJheSBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgdGhlIFNXSUdUWVBFIFtdIGlzIHVzZWQgcmlnaHQgYXdheS4gCgogICAgICAgICAgICBOb3RlOiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBtYWRlIHRvIHJlc29sdmUgcHJvYmxlbXMgcmVsYXRlZCB0bwogICAgICAgICAgICBhcnJheXMgd2l0aCBhbmQgd2l0aG91dCBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIHNvbWV0aW1lcyBTV0lHCiAgICAgICAgICAgIHdhcyBnZW5lcmF0aW5nIHNldHRlciBmdW5jdGlvbnMgZm9yIGFycmF5IHZhcmlhYmxlcyB3aXRoIG5vIGRpbWVuc2lvbnMKICAgICAgICAgICAgKGFuIGVycm9yKS4gTGlrZXdpc2UsIFNXSUcgc29tZXRpbWVzIG1hZGUgYXJyYXlzIHdpdGggZGltZW5zaW9ucwogICAgICAgICAgICByZWFkLW9ubHkgKGFsc28gYW4gZXJyb3IpLiAgVGhpcyBmaXhlcyB0aGUgYXJyYXlzX2dsb2JhbCB0ZXN0CiAgICAgICAgICAgIHByb2JsZW0uCiAgICAgICAgICAgICAgICAgICAgICAgIAowNS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0eXBlIGhhbmRsaW5nIGJ1ZyB3aXRoIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzLgogICAgICAgICAgICBJZiB5b3UgaGFkIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICAgICAgICBGb28gKmZ1bmMxKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgZnVuYzIoQmFyICZ4KTsKCiAgICAgICAgICAgIFRoZW4gZnVuYzIoKSB3b3VsZG4ndCBhY2NlcHQgb2JqZWN0cyByZXR1cm5lZCBieSBmdW5jMSgpCiAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB0eXBlIGVycm9yLiAgIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpYW4gWWFuZy4KCjA1LzIxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyB0byBzb21lIG9mIHRoZSBWaXN1YWwgQysrIGV4YW1wbGUgcHJvamVjdCBmaWxlcyB3aGljaCB3b3VsZCBub3QgCiAgICAgICAgICAgIHdvcmsgd2l0aCBzcGFjZXMgaW4gdGhlIHBhdGhzIGhlbGQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIHRvIAogICAgICAgICAgICBwb2ludCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlJ3MgbGlicmFyeSAvIGluY2x1ZGUgZGlyZWN0b3J5LgogICAgICAgICAgICBTRiBidWcgIzc0MDc2OQoKMDUvMjEvMjAwMzogIHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWNvbnRyYWN0cyBvcHRpb24uCiAgICAgICAgICAgIEZpcnN0IHRyeSBvZiB0aGUgaWRlYSBvZiAiV3JhcCBieSBDb250cmFjdCI6IAogICAgICAgICAgICBidWlsZCB1cCByZWFsaWFibGUgY3Jvc3MtbGFuZ3VhZ2UgbW9kdWxlIGJ5IHdyYXBwaW5nIHdpdGggU1dJRy4KICAgICAgICAgICAgSW1wbGVtZW50ZWQgYmFzaWMgYXNzZXJ0aW9uCiAgICAgICAgICAgIChwcmVhc3NlcnRpb24gJiBwb3N0YXNzZXJ0aW9uICYgaW52YXJpYW50KQogICAgICAgICAgICBmb3Igc2ltcGxlIEMvQysrIGZ1bmN0aW9ucy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEN1cnJlbnQgZm9ybWF0IG9mIGNvbnRyYWN0cyBhcmU6CiAgICAgICAgICAgICVjb250cmFjdCBjbGFzc19uYW1lIDo6IGZ1bmNfbmFtZSAocGFyYXMuLi4pIHsKICAgICAgICAgICAgcmVxdWlyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcnM7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgZW5zdXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGludmFyaWFudDoKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgkgICAgCQowNS8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgdHdlYWtzLiBUaGVyZSB3ZXJlIGEgZmV3IHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgTWFrZWZpbGUgZm9yIHBhc3Npbmcgb24gdGhlIGNvbW1hbmRsaW5lIHdoZW4gY29tcGlsaW5nLgogICAgICAgICAgICBUaGVzZSBhcmUgbm93IGFsbCBkZWZpbmVkIGluIHN3aWdjb25maWcuaC4gQXV0b2NvbmYgZG9lc24ndCBub3JtYWxseSAKICAgICAgICAgICAgYWxsb3cgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHRvIGJlIGRlZmluZWQgaW4gdGhpcyBjb25maWcgaGVhZGVyIGZpbGUsIAogICAgICAgICAgICBidXQgYW4gYXV0b2NvbmYgYXJjaGl2ZSBtYWNybyBlbmFibGVzIHRoaXMuIFRoaXMgbWFjcm8gYWxvbmcgd2l0aCBmdXR1cmUgCiAgICAgICAgICAgIGF1dG9jb25mIG1hY3JvcyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSBUb29scy9jb25maWcgZGlyZWN0b3J5LgoKICAgICAgICAgICAgJ3N3aWcgLXZlcnNpb24nIG5vdyByZXBvcnRzIHRoZSB0YXJnZXQgYnVpbGQgcGxhdGZvcm0uCgowNS8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBGaXggdG8gdGhlIGZvbGxvd2luZyB0eXBlbWFwczoKCiAgICAgICAgICAgIGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCgogICAgICAgICAgICBUaGVzZSBhcmUgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcvZ2VuZXJhdGluZyBwcm94eSBjbGFzc2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyB3b3VsZCB1c2UgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIG5vdCB0aGUgCiAgICAgICAgICAgIEMrKyB0eXBlLCB3aGljaCB3YXMgaW5jb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHR5cGVtYXBzLiAKCiAgICAgICAgICAgIEluIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgdGhlIEMrKyBjbGFzcyBuYW1lL3R5cGUgCiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgY2xhc3NlcyBpbiBuYW1lc3BhY2UsIHRlbXBsYXRlZCBjbGFzc2VzIGV0Yy4gc28KICAgICAgICAgICAgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IG1vc3QgY2FzZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBhbmQgQyMgTU9EVUxFUyAqKioKCjA1LzA5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWaXN1YWwgQysrIFByb2plY3QgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICAgIGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIChmb3IgVGNsLCBQZXJsLCBQeXRob24gYW5kIFJ1YnkpLgoKMDUvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmV0dXJuIGJ5IHZhbHVlLCBjb25zdCwgYW5kIHByaXZhdGUgY29uc3RydWN0b3JzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICBCKCk7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBCKGNvbnN0IEImKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEIgcmV0dXJuQigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJvYmxlbSBhbmQgcGF0Y2ggc3VnZ2VzdGlvbiByZXBvcnRlZCBieSBCaWxsIEhvZmZtYW4uCgowNC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBTaW5nbGUgYXV0b2NvbmYgaW52b2NhdGlvbiAtIGF1dG9jb25mIGluIHRoZSBUb29scyBkaXJlY3RvcnkgaGFzIGdvbmUuCgogICAgICAgICAgICAtIExpYnRvb2wgYm9vdHN0cmFwcGVkIHdoZW4gcnVubmluZyBhdXRvZ2VuLnNoLiBUaGlzIHJlcXVpcmVzIGFueW9uZQogICAgICAgICAgICAgIHVzaW5nIHRoZSBjdnMgdmVyc2lvbiBvZiBTV0lHIHRvIGhhdmUgbGlidG9vbCBpbnN0YWxsZWQgb24gdGhlaXIKICAgICAgICAgICAgICBtYWNoaW5lLiBTdWdnZXN0IHZlcnNpb24gMS40LjIgb3IgaGlnaGVyLCBwcmVmZXJhYmx5IHRoZSBsYXRlc3QgLSAxLjUuCgogICAgICAgICAgICAtIEF1dG9tYWtlIGlzIG5vdyB1c2VkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcmllcyBpbiBjb25qdW5jdGlvbiAKICAgICAgICAgICAgICB3aXRoIGxpYnRvb2wuCgogICAgICAgICAgICAtIFJ1bnRpbWUgbGlicmFyaWVzIGFyZSBub3cgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGFzIERMTHMgb24gQ3lnd2luLgoKICAgICAgICAgICAgLSBTa2lwcGluZyBsYW5ndWFnZXMgaXMgbm8gbG9uZ2VyIGp1c3QgZGV0ZXJtaW5lZCBpbiB0aGUgdG9wIGxldmVsIAogICAgICAgICAgICAgIG1ha2VmaWxlIGJ1dCBpbiBjb25maWd1cmUuaW4uIFRoaXMgaW5mbyBpcyB1c2VkIGZvciBidWlsZGluZwogICAgICAgICAgICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBhbmQgZm9yIHJ1bm5pbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgLSBUaGVzZSBjaGFuZ2VzIGhhdmUgZml4ZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3J5IGJ1aWxkcywgdGhhdCBpcwogICAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gCiAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZyb20gbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgYWxzbyB3b3JraW5nLiBBbiBpbml0aWFsCiAgICAgICAgICAgICAgY29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBuZWVkZWQgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgICAgaW4gMDQvMDIvMjAwMyBlbnRyeS4gQSAnbWFrZSBkaXN0Y2xlYW4nIHdpbGwgYmUgbmVlZGVkIGJlZm9yZSBidWlsZGluZwogICAgICAgICAgICAgIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaWYgdGhlIGF1dG90b29scyAKICAgICAgICAgICAgICBoYXZlIGJlZW4gcnVuIGZyb20gdGhpcyB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHNvbWUgcG9pbnQsIGJ1dCAKICAgICAgICAgICAgICBhdXRvY29uZiB3aWxsIHRlbGwgeW91IHRoaXMuIE5vdGUgdGhhdCAnbWFrZSBjaGVjaycgb25seSB3b3JrcyBmcm9tIAogICAgICAgICAgICAgIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHRoZSBtb21lbnQuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzIzNDcxIF0gV3JhcHBlcl9wcmludCgpIGZhaWxzIHdpdGggcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgY29uc3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBoYW5kbGluZyAKICAgICAgICAgICAgZGVzY3JpYmVkIGluIENIQU5HRVMgMDgvMTEvMjAwMi4gICBQcmV2aW91c2x5LCBTV0lHIG1lcmVseQogICAgICAgICAgICBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW4gaW5pdGlhbGl6ZXIgaW4gdGhlIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBOb3csIFNXSUcgYWRkaXRpb25hbGx5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBtZW1iZXIKICAgICAgICAgICAgaXMgY29uc3QuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSBraW5kIG9mIGxpbWl0ZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UsCiAgICAgICAgICAgIGFjdGl2YXRlZCB1c2luZyB0aGUgLW1pbmhlcml0IGNvbW1hbmQtbGluZSBvcHRpb24uIEkndmUgYWxzbyB1cGRhdGVkCiAgICAgICAgICAgIHRoZSAiQysrIEluaGVyaXRhbmNlIiBzZWN0aW9uIG9mIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24gdG8gZGlzY3VzcwogICAgICAgICAgICBob3cgdGhpcyB3b3JrcywgYW5kIGl0cyBsaW1pdGF0aW9ucy4gQWxzbyBhbHNvIG1vZGlmaWVkIHRoZSBtaW5oZXJpdC5pCiAgICAgICAgICAgIHRlc3QgY2FzZSB0byBydW4gYWdhaW5zdCB0aGlzLgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAtZ2xvYmFsbW9kdWxlIGNvbW1hbmQtbGluZSBvcHRpb24gZm9yIHRoZSBSdWJ5CiAgICAgICAgICAgIG1vZHVsZSwgZm9yIHdyYXBwaW5nIHN0dWZmIGludG8gdGhlIGdsb2JhbCBtb2R1bGUgKEtlcm5lbCkgaW5zdGVhZAogICAgICAgICAgICBvZiBhIG5lc3RlZCBtb2R1bGUuIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KCjA0LzIzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHN5bW5hbWUgZXJyb3IgaW4gZGlyZWN0b3IgY2FsbHMgdG8gUHl0aG9uIG1ldGhvZHMKCSAgICB0aGF0IGV4dGVuZCBDKysgb3BlcmF0b3JzLgoKCSAgICBTdG9wcGVkIGRpcmVjdG9yIGRlc3RydWN0b3Igd3JhcHBlcnMgZnJvbSBjYWxsaW5nIF9fc2V0X3VwLAoJICAgIHdoaWNoIHdhcyBsZWF2aW5nIHRoZSBkaXJlY3RvciBmbGFnIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KCjA0LzIzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSByZXNvbHV0aW9uIGFuZCBuZXN0ZWQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWxmcmVkIExvcmJlciAoYW5kIE1hcmNlbG8gTWF0dXMpLgoKMDQvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFBhdGNoIGZvciBKYXZhIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRvIHJ1biBvbiBNYWMgT1MgWC4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBJbmNvcnBvcmF0ZWQgTm9idSBOYWthZGEncyBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIHRoZSBSdWJ5CiAgICAgICAgICAgIDEuOCBhbGxvY2F0aW9uIGZyYW1ld29yay4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZXBsYWNlZCBhbGwgdXNlcyBvZiB0aGUgZGVwcmVjYXRlZCBTVFIyQ1NUUigpIG1hY3JvIHdpdGggdGhlCiAgICAgICAgICAgIHNhZmVyIFN0cmluZ1ZhbHVlUHRyKCkgbWFjcm8uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgcnVieS10YWxrOjY3MDU5CiAgICAgICAgICAgIGFuZCBmb2xsb3ctdXBzIHRvIHRoYXQgcG9zdC4KCjA0LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHByZXByb2Nlc3NvciBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSAKICAgICAgICAgICAgICAgIGludCBmKGludCBtaW4pOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2ViYXN0aWVuIFJlY2lvLgoKMDQvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBhIHJ1bnRpbWUgY2hlY2sgdG8gdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSBsaWJyYXJ5IHRvIGNoZWNrIAogICAgICAgICAgICB0aGF0IHRoZSBKYXZhIGFycmF5IHBhc3NlZCBpbiBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBDIGFycmF5IGFuZCB0aHJvdyBhbiAKICAgICAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KCiAgICAgICAgICAgIEFsc28gZml4IHRvIHVzZSBkZWxldGUgaW5zdGVhZCBvZiBmcmVlIGZvciBhcnJheXMgY3JlYXRlZCB1c2luZyBuZXcuCgowNC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmVtb3ZlIEdDQzMgd2FybmluZyB3aGVuIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGU6CgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGNoYW5naW5nIHNlYXJjaCBvcmRlciBmb3Igc3lzdGVtIGRpcmVjdG9yeSAiL3Vzci9pbmNsdWRlIgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIGEgbm9uLXN5c3RlbSBkaXJlY3RvcnkgCgogICAgICAgICAgICBTZWUgU0YgcGF0Y2ggIzcxNTUzMSBzdWJtaXR0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zCgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXByb3ZlZCB3cmFwcGluZyBvZiBlbnVtcyBhbmQgY29uc3RhbnRzLiBUaGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgd3JhcHBlZCBhcyBDIyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29uc3RhbnRzLiBFaXRoZXIgdGhlc2UgYXJlIHdyYXBwZWQKICAgICAgICAgICAgYXMgcmVhZG9ubHkgKHJ1bnRpbWUpIGNvbnN0YW50cyBvciBjb21waWxlIHRpbWUgY29uc3RhbnRzLCBkZXBlbmRpbmcgb24KICAgICAgICAgICAgdGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIChUaGUgZGlyZWN0aXZlIGlzIGxpa2VseSB0byBjaGFuZ2UgbmFtZSBzb29uKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgd3JhcHBpbmc6CiAgICAgICAgICAgICAgJWphdmFjb25zdCgwKTsKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAyMgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgWFlaOwogICAgICAgICAgICAgICNkZWZpbmUgWFlaIDMzCiAgICAgICAgICAgIGlzIG5vdzoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGludCBBQkMgPSBleGFtcGxlUElOVk9LRS5nZXRfQUJDKCk7CiAgICAgICAgICAgICAgcHVibGljIGNvbnN0IGludCBYWVogPSAzMzsKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGNvbnN0YW50cyBhbmQgZW51bXMgYXJlIHB1dCBpbiB0aGVpciBvd24gaW50ZXJmYWNlIGNhbGxlZAogICAgICAgICAgICB4eHhDb25zdGFudHMsIHdoZXJlIHh4eCBpcyB0aGUgbW9kdWxlIG5hbWUuIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgYXMgCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIGRlcml2ZSAoaW1wbGVtZW50KSBhIEphdmEgY2xhc3MgZnJvbSB0aGUgeHh4Q29uc3RhbnRzCiAgICAgICAgICAgIGludGVyZmFjZSB0byBpbXByb3ZlIHRoZSBzeW50YXg7IG5hbWVseSB3aGVuIHdyYXBwaW5nOgogICAgICAgICAgICAgIGVudW0ge09ORT0xLCBUV08sIFRIUkVFfTsKICAgICAgICAgICAgYWNjZXNzaW5nIHRoZXNlIGZyb20gYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyB4eHhDb25zdGFudHMgaXMgbmVhdGVyOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSBPTkU7CiAgICAgICAgICAgIHRoYW4gdGhlIHByZXZpb3VzOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSB4eHguT05FOwoKICAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IERhdmUgRHJpYmluLgoKMDQvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGltcHJvdmVtZW50cyBmb3IgbXVsdGlwbGUgYnVpbGRzLiBUaGlzIGFsbG93cyBvbmUgdG8gYnVpbGQKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZSBhbmQgcnVudGltZSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMvY29tcGlsZXJzIAogICAgICAgICAgICBldGMgYnkgcnVubmluZyBjb25maWd1cmUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBUaGlzIGlzbid0IDEwMCUganVzdCAKICAgICAgICAgICAgeWV0IGFuZCB3b24ndCBiZSB1bnRpbCBsaWJ0b29sIGlzIGJldHRlciBjb25maWd1cmVkLi4uIGEgJ2NvbmZpZ3VyZScgYW5kIAogICAgICAgICAgICAnbWFrZSBkaXN0Y2xlYW4nIG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVmb3JlIGl0IGFsbCB3b3Jrcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJCAuL2NvbmZpZ3VyZQogICAgICAgICAgICAgICQgbWFrZSBkaXN0Y2xlYW4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzE7IGNkIGNvbmZpZzE7IC4uL2NvbmZpZ3VyZSBDQz1nY2MgQ1hYPWcrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzI7IGNkIGNvbmZpZzI7IC4uL2NvbmZpZ3VyZSBDQz1jYyBDWFg9YysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAKICAgICAgICAgICAgVG8gYmUgaW1wcm92ZWQuIEEgJ21ha2UgY2hlY2snIGRvZXMgbm90IHdvcmsgeWV0IGVpdGhlci4gCgowNC8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4KICAgICAgICAgICAgVGhpcyBzaG93ZWQgdXAgd2hlbiB0cnlpbmcgdG8gdXNlIHN0ZF92ZWN0b3IuaSB3aXRoIHZlY3RvcnMKICAgICAgICAgICAgb2YgcG9pbnRlcnMuCgowMy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciBwYXJhbGxlbCBtYWtlIGJ1aWxkcyBvZiBTV0lHLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIG1ha2UgLWogNAogICAgICAgICAgICBCdWlsZCBmYWlsdXJlIHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlLgoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWxlYXNlZCAxLjMuMTkuCgoKClZlcnNpb24gMS4zLjE5IChNYXJjaCAyOCwgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBWYXJpZXR5IG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgMS4zLjE4IHJlbGVhc2UgaW5jbHVkaW5nOgoKICAgICAgICAgICAgICAgIC0gU2VnbWVudGF0aW9uIGZhdWx0IHdpdGggJWV4dGVuZCBkaXJlY3RpdmUuCiAgICAgICAgICAgICAgICAtIFR5cGVtYXAgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gRXhwcmVzc2lvbiBldmFsdWF0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gTGFyZ2UgbWVtb3J5IGxlYWsgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uCgpWZXJzaW9uIDEuMy4xOCAoTWFyY2ggMjMsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzIxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdHdvIHByb2JsZW1zIHdpdGggdGhlICVleHRlbmQgZGlyZWN0aXZlLCBvdmVybG9hZGluZywgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlIGV4cGFuc2lvbi4gIFNlZSB0aGUgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZCcgYW5kCiAgICAgICAgICAgICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWRfMicgdGVzdHMgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZSBmb3IKICAgICAgICAgICAgZGV0YWlscy4KCjAzLzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEFkZGVkIHNvbWUgdHlwZW1hcHMgYXMgc3VnZ2VzdGVkIGJ5IEFuZHJlYXMgU2Nob2VyayBmb3IgaGFuZGxpbmcKICAgICAgICAgICAgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgb3IgYnkgcmVmZXJlbmNlLiBUaGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcHV0IGluIHR5cGVtYXBzLmkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgQysrIHNjb3BpbmcgYnVnIHJlbGF0ZWQgdG8gY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IEZvbzo6YmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSwgU1dJRyBqdXN0IHRvc3NlZCBvdXQgdGhlIEZvbzo6YmFyKCkgZGVjbGFyYXRpb24uIE5vdywKICAgICAgICAgICAgdGhlIGRlY2xhcmF0aW9uIGlzIHdyYXBwZWQgcHJvdmlkZWQgdGhhdCB0aGUgcHJlZml4IGlzIGV4YWN0bHkgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgdGhlIGN1cnJlbnQgc2NvcGUgKGluY2x1ZGluZyBhbnkgZW5jbG9zaW5nIG5hbWVzcGFjZXMpLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcnVjZSBMb3dlcnkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDY5NjUxNiBdIEVuYWJsaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nIGZvciBkYXRhIG1lbWJlciBhY2Nlc3MuCiAgICAgICAgICAgIEluIHNvbWUgY29tcGlsZXJzLCBhdHRyaWJ1dGUgYWNjZXNzIGNhbiBnZW5lcmF0ZSBleGNlcHRpb25zLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBvcmRpbmFyaWx5IGFzc3VtZXMgdGhhdCBubyBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLiAgVG8gZGlzYWJsZSB0aGlzLAogICAgICAgICAgICB1c2UgdGhlICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKSBGb286Ong7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeDsgICAgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFlha292IE1hcmtvdml0Y2guIAogCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFBhdGNoLiBbIDcwMTg2MCBdIEltcHJvdmUgUGVyZm9ybWFuY2UgKHB5dGhvbiBwcm94aWVzKS4KICAgICAgICAgICAgR2l2ZXMgYSBwZXJmb3JtYW5jZSBib29zdCB0byBwcm94eSBjbGFzcyBjb2RlIGFuZCB0aGUgbWFuYWdlbWVudCBvZiB0aGUKICAgICAgICAgICAgLnRoaXMgYW5kIC50aGlzb3duIGF0dHJpYnV0ZXMuICBDb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgowMy8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBBZGRlZCBtaXNzaW5nIHZhcmFyZyBzdXBwb3J0LgoKMDMvMTgvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgUmVtb3ZlZCBjb2RlIHJlbGF0ZWQgdG8gdGFnZ2luZyBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIGRpcmVjdG9ycy4KCSAgICBUaGUgY29uY2VwdCBvZiBoYXZpbmcgZGlyZWN0b3JzIGZvciBzb21lIGJ1dCBub3QgYWxsIHZpcnR1YWwgbWV0aG9kcwoJICAgIG9mIGEgY2xhc3MgaXMgZGVlcGx5IGZsYXdlZC4gIFRoZSAlZmVhdHVyZSgibm9kaXJlY3RvciIpIHRhZyBpcyBhbHNvCgkgICAgZ29uZS4gIAoJICAgIAoJICAgIERpcmVjdG9ycyBhcmUgb2ZmIGJ5IGRlZmF1bHQuICBUbyBlbmFibGUgdGhlbSBmb3IgYSBjbGFzcywgaXNzdWUKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBjbGFzc25hbWU7IHdoaWNoIHdpbGwgY3JlYXRlIGRpcmVjdG9yIG1ldGhvZHMKCSAgICBmb3IgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MuCgowMy8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBwYXNzaW5nIGFyZ3VtZW50cyBvZiB0eXBlIGZ1bmN0aW9uLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCB4KGludCwgaW50KSk7CgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCB4KTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucywgdGhpcyB3b3VsZCBwcm9kdWNlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLiAgTm93LAogICAgICAgICAgICBTV0lHIG1lcmVseSBhZGRzIGFuIGV4dHJhIHBvaW50ZXIsIG1ha2luZyB0aGVzZSBkZWNsYXJhdGlvbnMgdGhlIHNhbWUKICAgICAgICAgICAgYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCAoKngpKGludCwgaW50KSk7CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90ICp4KTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdhcnRoIEJ1c2hlbGwuCgowMy8xNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCB0aGUgcmV0dXJuIHN0YXRlbWVudCBmb3IgZGlyZWN0b3IgYmFzZSBjbGFzcyBjYWxscyB0aGF0IGhhdmUgbm8KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLgoKMDMvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb25zdCBzbWFydC1wb2ludGVyIHdyYXBwaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgb25seSAieCIgYW5kICJiYXIiIGFyZSB2aXNpYmxlIGZyb20gQmxhaCAoc2luY2UgYXBwbGljYXRpb24KICAgICAgICAgICAgb2Ygc3BhbSB2aW9sYXRlcyBjb25zdG5lc3MpLiAgTW9yZW92ZXIsIGFjY2VzcyB0byAieCIgaXMgcmVhZC1vbmx5LgogICAgICAgICAgIAowMy8xNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDbGVhbmVkIHVwIHR3byBzaWduZWQgdmVyc3VzIHVuc2lnbmVkIGNvbXBhcmlzb25zIGluIHB5dGhvbi9zdGRfdmVjdG9yLmkuCgkgICAgCjAzLzE1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEdsb2JhbCB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGdldCBhbmQgc2V0IG1ldGhvZHMuCiAgICAgICAgICAgIE1lbWJlciB2YXJpYWJsZSB3cmFwcGluZyBidWcgZml4ZXMsIGZvciBleGFtcGxlIHdyYXBwaW5nIHBvaW50ZXJzIHdvcmsgbm93LgogICAgICAgICAgICBUeXBlbWFwcyBhcmUgdXNlZCBmb3IgYWxsIHZhcmlhYmxlIHdyYXBwaW5nIHRvIGdlbmVyYXRlIHRoZSBwcm9wZXJ0eSBjb2RlLgoKMDMvMTMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIHZpcnR1YWwgbWV0aG9kIHVucm9sbGluZyBmb3IgZGlyZWN0b3JzLiAKCSAgICBUaGUgb3JkZXIgb2YgdW5yb2xsaW5nIGlzIG5vdyBmcm9tIGJhc2UgdG8gZGVyaXZlZCwgdG8gZW5zdXJlCgkgICAgdGhhdCB0aGUgbW9zdCBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGlyZWN0b3IgbWV0aG9kIGlzCgkgICAgZm91bmQuCgoJICAgIERpcmVjdG9yIG1ldGhvZHMgZm9yIHB1cmUgdmlydHVhbCBtZXRob2RzIG5vdyB0aHJvdwoJICAgIERJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04gaWYgX3VwIGlzIHNldC4KCjAzLzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIFBvbHltb3JwaGlzbSBmaXg6IHZpcnR1YWwgZnVuY3Rpb25zIG5vdyB1c2UgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIEMjIHByb3h5IGNsYXNzLCB2aXJ0dWFsIG9yIG92ZXJyaWRlLgogICAgICAgICAgICBTb21lICd1c2luZyBTeXN0ZW07JyBzdGF0ZW1lbnQgZml4ZXMgbmVlZGVkIGJ5IHRoZSBNb25vIGNvbXBpbGVyLgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBvZiBTd2lnVmFsdWVXcmFwcGVyPD4gdG8KICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3NlcyB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJ1Y2UgTG93ZXJ5LgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBUaGUgJGRlc2NyaXB0b3IodHlwZSkgdmFyaWFibGUgaXMgbm93IGV4cGFuZGVkIGluIGNvZGUgc3VwcGxpZWQgdG8KICAgICAgICAgICAgJWV4dGVuZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluIGtpbmRzIG9mIGFkdmFuY2VkIHdyYXBwaW5nIAogICAgICAgICAgICAoZXNwZWNpYWxseSBjb250YWluZXIgY2xhc3NlcykuCgowMy8xMS8yMDAzOiBsdWlnaQogICAgICAgICAgICBTdXBwb3J0IGZvciBzdGQ6Om1hcC4KICAgICAgICAgICAgKGEpIEludGVncmF0aW9uIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlIChhIGxhIHN0ZDo6dmVjdG9yKSBmb3IKICAgICAgICAgICAgICAgIFB5dGhvbiwgUnVieSwgTXpTY2hlbWUsIGFuZCBHdWlsZTsKICAgICAgICAgICAgKGIpIFNpbXBsZSB3cmFwcGVyIGZvciBvdGhlciBsYW5ndWFnZXMKCjAzLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgU1dJRwogICAgICAgICAgICB3YXNuJ3QgcGFyc2luZyBjZXJ0YWluIG9jdGFsIGNvZGVzIGNvcnJlY3RseS4KCjAzLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHN1YnRsZSBwcmVwcm9jZXNzb3IgcHJvYmxlbXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2ViYXN0aWVuIFJlY2lvLgoKICAgICAgICAgICAgKGEpIEVtcHR5IHByZXByb2Nlc3NvciB2YWx1ZXMgbm8gbG9uZ2VyIGdlbmVyYXRlICJiYWQgY29uc3RhbnQKICAgICAgICAgICAgdmFsdWUiIGVycm9ycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08KICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08gQkFSCgogICAgICAgICAgICAoYikgTWFjcm8gbmFtZXMgY2FuIG5vdyBzcGFuIG11bHRpcGxlIGxpbmVzICh0ZWNobmljYWxseSB2YWxpZCwKICAgICAgICAgICAgYWx0aG91Z2ggcXVlc3Rpb25hYmxlIHByYWN0aWNlKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBBX0xPTkdfTUFDUk9fXAogICAgICAgICAgICAgICAgICBOQU1FIDQyCgogICAgICAgICAgICAoYykgV2hpdGVzcGFjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYmVmb3JlIGNlcnRhaW4gbWFjcm8gdmFsdWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIkhlbGxvIgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEJBUlwKICAgICAgICAgICAgICAgICAgIkhlbGxvIgogCjAzLzA3LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVtYXBzCiAgICAgICAgICAgIGluIHRoZSBMaWIvcnVieS90eXBlbWFwcy5pIGxpYnJhcnkgZmlsZS4KCjAzLzA3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9jYWxsYmFjayB0byBkZW1vc3RyYXRlIGhvdyBkaXJlY3RvcnMgY2FuCgkgICAgYmUgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzIGluIFB5dGhvbgoJICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9leHRlbmQgdG8gZGVtb25zdHJhdGUgdmlydHVhbCBtZXRob2QKCSAgICBjYWxscyBmcm9tIEMrKyB0byBQeXRob24gKHJlYWxseSB0aGUgc2FtZSBhcyB0aGUgY2FsbGJhY2sKCSAgICBleGFtcGxlLCBqdXN0IGEgZGlmZmVyZW50IGNvbnRleHQpLgoJICAgIEFkZGVkIGZvdXIgdGVzdHMgZm9yIHZlcnkgYmFzaWMgZGlyZWN0b3IgZnVuY3Rpb25hbGl0eS4gIFRoZXNlCgkgICAgaGF2ZSBydW50aW1lIHRlc3RzIHVuZGVyIHB5dGhvbi4KCSAgICBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW1pdHMgI2RlZmluZSBTV0lHX0RJUkVDVE9SUyBuZWFyIHRoZQoJICAgIHRvcCBvZiB0aGUgb3V0cHV0IGZpbGUgaWYgZGlyZWN0b3JzIGFyZSBlbmFibGVkLiAgVGhpcyBpcyB1c2VmdWwKCSAgICBmb3IgZGlzYWJsaW5nIHBhcnRzIG9mIHRlc3RzIGluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkb24ndAoJICAgIHN1cHBvcnQgZGlyZWN0b3JzLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBzZWN0aW9uIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgb24gY3Jvc3MgbGFuZ3VhZ2UKCSAgICBwb2x5bW9ycGhpc20gKGRpcmVjdG9ycykuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBUaGUgc2hvcnQtbGl2ZWQgIi1mZGlyZWN0b3JzIiBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFRvIGVuYWJsZSBkaXJlY3RvcnMsIGluc3RlYWQgdXNlIHRoZSBleHRlbmRlZCAlbW9kdWxlIAoJICAgIGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgoKCSAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiKSBtb2R1bGVuYW1lCgowMy8wNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIGxvbmcgbG9uZyB0eXBlbWFwcyBoYXZlIGJlZW4gcmV3cml0dGVuIHNvIHRoYXQgdGhleSBjYW4gYmUgbW9yZQogICAgICAgICAgICBlYXNpbHkgdXNlZCB3aXRoIG5vbiBJU08gY29tcGlsZXJzLCBsaWtlIFZpc3VhbCBDKysuIEZvciBleGFtcGxlCiAgICAgICAgICAgIGlmIHlvdSBhcmUgd3JhcHBpbmcgdGhlIFdpbmRvd3MgNjQgYml0IHR5cGUgX19pbnQ2NCB0aGUgbG9uZyBsb25nCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5OgoKICAgICAgICAgICAgICAgICVhcHBseSBsb25nIGxvbmcgeyBfX2ludDY0IH07CiAgICAgICAgICAgICAgICBfX2ludDY0IHZhbHVlMShfX2ludDY0IHgpOwoKICAgICAgICAgICAgX19pbnQ2NCB3aWxsIG5vdyBhcHBlYXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgbG9uZyBsb25nLgogICAgICAgICAgICAKMDMvMDYvMjAwMzogYmVhemxleQogICAgICAgICAgICAqKiogREVWRUxPUEVSIENIQU5HRSAqKioKICAgICAgICAgICAgU3dpZyBtb2R1bGUgbXV0YXRpb24gaGFzIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIFdoZW4gYSBsYW5ndWFnZQogICAgICAgICAgICBjbGFzcyBtZXRob2Qgd2FudHMgdG8gc2F2ZSBub2RlIGF0dHJpYnV0ZXMsIGl0IG5vdyB1c2VzIG9uZSBvZiB0aGUKICAgICAgICAgICAgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpCiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgpCgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlc2UgZnVuY3Rpb25zIGlzIGEgbmFtZXNwYWNlIGluIHdoaWNoCiAgICAgICAgICAgIHNhdmVkIGF0dHJpYnV0ZXMgYXJlIHBsYWNlZC4gIEZvciBleGFtcGxlLHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICAgTm9kZSAqbjsKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCJjRGVjbGFyYXRpb24iLG4sInR5cGUiLCJwYXJtcyIsIm5hbWUiLE5JTCk7CgogICAgICAgICAgICBzYXZlcyB0aGUgYXR0cmlidXRlcyBhcyAiY0RlY2xhcmF0aW9uOnR5cGUiLCAiY0RlY2xhcmF0aW9uOnBhcm1zIiwKICAgICAgICAgICAgYW5kIHNvIGZvcnRoLiAgIElmIG5lY2Vzc2FyeSwgYSBsYW5ndWFnZSBtb2R1bGUgY2FuIHJlZmVyIHRvCiAgICAgICAgICAgIG9sZCB2YWx1ZXMgYnkgdXNpbmcgdGhpcyBzcGVjaWFsIG5hbWVzcGFjZSBxdWFsaWZpZXIuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBhIHNwZWNpYWwgYXR0cmlidXRlICJ2aWV3IiBjb250YWlucyB0aGUgbmFtZQogICAgICAgICAgICBvZiB0aGUgbGFzdCBuYW1lc3BhY2UgdXNlZCB0byBzYXZlIGF0dHJpYnV0ZXMuICBJbiB0aGUgYWJvdmUgCiAgICAgICAgICAgIGV4YW1wbGUsICJ2aWV3IiB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAiY0RlY2xhcmF0aW9uIi4gICBUaGUgdmFsdWUKICAgICAgICAgICAgb2YgImNEZWNsYXJhdGlvbjp2aWV3IiB3b3VsZCBoYXZlIHRoZSBwcmV2aW91cyB2aWV3IGFuZCBzbyBmb3J0aC4KCiAgICAgICAgICAgIFN3aWdfcmVzdG9yZShuKSByZXN0b3JlcyBhIG5vZGUgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbGFzdAogICAgICAgICAgICBTd2lnX3JlcXVpcmUoKSBvciBTd2lnX3NhdmUoKSBjYWxsLgoKICAgICAgICAgICAgTm90ZTogIFRoaXMgY2hhbmdlIG1ha2VzIGl0IGVhc2llciBmb3IgbGFuZ3VhZ2UgbW9kdWxlcyB0byByZWZlcgogICAgICAgICAgICB0byBvbGQgdmFsdWVzIG9mIGF0dHJpYnV0ZXMuICAKCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNZXJnZWQgdGhlIGNyb3NzLWxhbmd1YWdlIHBvbHltb3JwaGlzbSBwYXRjaC4gIFdoZW4gZW5hYmxlZCwgQysrIAoJICAgICJwcm94eSIgY2xhc3NlcyAoY2FsbGVkIGRpcmVjdG9ycykgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzcGVjaWZpZWQgCgkgICAgQysrIGNsYXNzLiAgRGlyZWN0b3JzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiwgc2ltaWxhciAKCSAgICB0byB0aGUgd2F5IHRoZSB1c3VhbCBwcm94eSAoc2hhZG93KSBjbGFzc2VzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gCgkgICAgUHl0aG9uIHRvIEMrKy4gIFRvZ2V0aGVyLCB0aGVzZSB0d28gdHlwZXMgb2YgcHJveGllcyBhbGxvdyBDKysgCgkgICAgY2xhc3NlcyB0aGF0IGFyZSBleHRlbmRlZCBpbiBQeXRob24gdG8gYmVoYXZlIGp1c3QgbGlrZSBvcmRpbmFyeSAKCSAgICBDKysgY2xhc3NlcyBhbmQgYmUgdXNlZCBpbiBDKysgbGlrZSBuYXRpdmUgb2JqZWN0cy4gIAoJICAgIAoJICAgIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCB2ZXJ5IGV4cGVyaW1lbnRhbCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICBUbyBlbmFibGUgZGlyZWN0b3Igc3VwcG9ydCwgc3BlY2lmeSAnLWZkaXJlY3RvcnMnIG9uIHRoZSBTV0lHIGNvbW1hbmQKCSAgICBsaW5lIG9yIGluIHRoZSBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW4gdGhlIGludGVyZmFjZQoJICAgIGZpbGUsIGFkZCAlZmVhdHVyZSgiZGlyZWN0b3IiKSB0byBnZW5lcmF0ZSBkaXJlY3RvcnMgZm9yIGFsbCBjbGFzc2VzCgkgICAgdGhhdCBoYXZlIHZpcnR1YWwgbWV0aG9kcy4gIAoJICAgIAoJICAgIFNlZSBodHRwOi8vc3RtLmxibC5nb3YvfnRtMi9zd2lnL1Byb3h5RG9jLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KCSAgICAKCjAzLzAzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzbWFsbCBnbGl0Y2ggaW4gdHlwZW1hcCBsb2NhbCB2YXJpYWJsZSByZXBsYWNlbWVudC4gIElmIHlvdSBoYWQKICAgICAgICAgICAgYSB0eXBlbWFwIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgKCQxX3R5cGUgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gLi4uOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIG5vIG9jY3VycmVuY2Ugb2YgIiQxX3R5cGUiIGFwcGVhcmVkIGluIHRoZSBib2R5LCB0aGVuIHRoZSBsb2NhbAogICAgICAgICAgICB2YXJpYWJsZSB0eXBlIHdvdWxkbid0IGJlIHN1YnN0aXR1dGVkLgoKMDMvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IHZlcnNpb24gb2YgdGhlIENTaGFycCBtb2R1bGUgd2hpY2ggaXMgdHlwZW1hcCBiYXNlZC4KICAgICAgICAgICAgSXQgYWxzbyB1c2VzIEVDTUEgQyMgYW5kIG5vIGxvbmdlciB1c2VzIE1pY3Jvc29mdCBWaXN1YWwgQysrLk5FVCAKICAgICAgICAgICAgZ2x1ZS4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE5laWwgQ2F3c2UuCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUzNTQ4IF0gZXJyb3IgcGFyc2luZyBjYXN0aW5nIG9wZXJhdG9yIGRlZmluaXRpb24uCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgY2FzdGluZyBvcGVyYXRvcnMgZGVjbGFyZWQgb3V0c2lkZSBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbmxpbmUgQTo6b3BlcmF0b3IgY2hhciAqKCkgeyAuLi4gfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcnRpbiBDYXNhZG8uCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFub255bW91cyBiaXQtZmllbGRzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICAgaW50IHggOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50IHkgOiA4OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbm9ueW1vdXMgYml0LWZpZWxkcyBhcmUgaWdub3JlZCBieSBTV0lHLiAgIFByb2JsZW0KICAgICAgICAgICAgcmVwb3J0ZWQgYnkgRnJhbnogSPZwZmluZ2VyLgoKMDIvMjYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgdHlwZW1hcHMgaW4gdGhlIEV4YW1wbGVzL2phdmEvdHlwZW1hcCBleGFtcGxlIGFuZCBhbHNvIAogICAgICAgICAgICBmaXhlcyBzdWJ0bGUgYnVnIHdoZW4gdXNpbmcgdGhlIFN0cmluZ0J1ZmZlciB0eXBlbWFwcyBtb3JlIHRoYW4gb25jZS4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDIxMTIgXSBDb25zdGFudHMgY2hhciBidWcuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1MzM3IF0gUGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBub3QgZW50aXJlbHkgd29ya2luZy4KICAgICAgICAgICAgVGhlcmUgd2FzIGEgc3VidGxlIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgbmFtaW5nIGFuZCBvcmRlcmluZyBvZgogICAgICAgICAgICB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cy4gIE1hdGNoaW5nIHdvcmtlZCBva2F5LAogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIHRlbXBsYXRlcyB3ZXJlbid0IGV4cGFuZGVkIGNvcnJlY3RseS4KCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHBhcnNpbmcgKGFuZCBnZW5lcmF0aW5nIGNvZGUpIGZvciAKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBhcnJheXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgZm9vKGludCAoJngpWzEwXSk7CiAgCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUzNDcgXSBDb21waWxhdGlvbiB3YXJuaW5nIGZyb20gbGlicHkuYy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGFuaWVsIEwuIFJhbGwuCiAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdmlydHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgY2hlY2tpbmcgYW5kIHR5cGVkZWYuCgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICppbnRwdHI7CgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAqZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnRwdHIgZm9vKCkgeyB9OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cmVhdGluZyB0aGVzZSBkZWNsYXJhdGlvbnMgYXMgZGlmZmVyZW50IGV2ZW4gdGhvdWdoCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lICh2aWEgdHlwZWRlZikuCgowMi8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgcmFuZ2UgY2hlY2tpbmcgZm9yIHRoZSBOVU0yVVNIUlQgbWFjcm8sIHBlciBbIDY3NTM1MyBdLgoKMDIvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdGhlIGNvZGUgdGhhdCBkZXRlcm1pbmVkIGlmIGEgY2xhc3MgaXMgYWJzdHJhY3QKICAgICAgICAgICAgYW5kIGNhbiBiZSBpbnN0YW50aWF0ZWQuICAgIElmIHlvdSBoYWQgY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiB2aXJ0dWFsIEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDIDogdmlydHVhbCBBIHsgCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAvKiBOb3RlIG9yZGVyIG9mIGJhc2UgY2xhc3NlcyAqLwkKICAgICAgICAgICAgICAgICAgc3RydWN0IEQgOiBCLCBDIHsgfTsgICAgLyogT2sgKi8KICAgICAgICAgICAgICAgICAgc3RydWN0IEUgOiBDLCBCIHsgfTsgICAgLyogQnJva2VuICovCgogICAgICAgICAgICB0aGVuIFNXSUcgZGV0ZXJtaW5lZCB0aGF0IGl0IGNvdWxkIGluc3RhbnRpYXRlIEQoKSwgYnV0IG5vdCBFKCkuCiAgICAgICAgICAgIFRoaXMgaW5jb25zaXN0ZW5jeSBhcm9zZSBmcm9tIHRoZSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIAogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdG8gbG9jYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlydHVhbAogICAgICAgICAgICBtZXRob2RzLiAgIFRoaXMgcHJvYmxlbSBzaG91bGQgbm93IGJlIGZpeGVkLS0tU1dJRyB3aWxsIGF0dGVtcHQKICAgICAgICAgICAgdG8gbG9jYXRlIGFueSB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgbWV0aG9kIGJ5CiAgICAgICAgICAgIHRyYXZlcnNpbmcgb3ZlciB0aGUgZW50aXJlIGhpZXJhcmNoeS4KCjAyLzIyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB1c2luZyBlbnVtIHR5cGVtYXBzLiBUaGUgSmF2YSBmaW5hbCBzdGF0aWMgdmFyaWFibGUgdHlwZQogICAgICAgICAgICBjYW4gYmUgc2V0IHVzaW5nIHRoZSBqc3R5cGUgdHlwZW1hcCwgZW5hYmxpbmcgZW51bXMgdG8gYmUgbWFwcGVkIHRvIAogICAgICAgICAgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnQuIEJ1ZyByZXBvcnRlZCBieSBIZWluZXIgUGV0aXRoLgoKMDIvMjEvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCBDU2hhcnAgKEMjKSBtb2R1bGUgcHJvdG90eXBlCiAgICAgICAgICAgIGkuZS4gY3NoYXJwLmN4eCAmIGNzaGFycC5oIGF0IFNvdXJjZS9Nb2R1bGVzLy4KICAgICAgICAgICAgVGhleSBhcmUgZm9yIHRlc3QgdXNhZ2Ugb25seSBub3cgYW5kIG5lZWQgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgYWxzbyBuZWVkIHRvIGJlIG1vZGlmaWVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgIAowMi8yMC8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIHdpdGggLWZ2aXJ0dWFsLgogICAgICAgICAgICBTaW1pbGFyIGFzIGJlYXpsZXkncyBtb2RpZmljYXRpb24gdG9kYXkuCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGdjYy1zdHlsZSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgCiAgICAgICAgICAgIFBhdGNoIFsgNjIzMjU4IF0gR0NDLXN0eWxlIHZhcmFyZyBtYWNybyBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2UgTWFzb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IGNsYXNzZXMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhpbnQgeCkgPSAwOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhJbnRlZ2VyIHgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgZ2V0dGluZyBjb25mdXNlZCBhYm91dCB0aGUgbGF0dGVyIG1ldGhvZC0tLW1ha2luZyBCYXIKICAgICAgICAgICAgYWJzdHJhY3QuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlamF2YWNvbnN0KGZsYWcpIGNhbiBhbHNvIGJlIHVzZWQgb24gZW51bXMgYXMgd2VsbCBhcyBjb25zdGFudHMuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRydWUgSmF2YSBjb21waWxlciBjb25zdGFudHMgc28gdGhhdCB0aGV5IGNhbiBiZSAKICAgICAgICAgICAgdXNlZCBpbiBKYXZhIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gSGVpbmVyIFBldGl0aCBmb3IgcGF0Y2hlcy4KCjAyLzE5LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgTW9kaWZpZWQgLWZjb21wYWN0IGZlYXR1cmUgdG8gZGVhbCB3aXRoIFBQIGxpbmVzCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg5MDQwIF0gTWlzc2luZyByZXR1cm4gdmFsdWUgaW4gc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2JlcnQgSC4gZGUgVnJpZXMuCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgZmV3IGV2aWwgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHRlbXBsYXRlcywgbmFtZXNwYWNlcywgYW5kIHRoZQogICAgICAgICAgICAlZXh0ZW5kIGRpcmVjdGl2ZS4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoKMDIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtSdWJ5XSBJbXByb3ZlZCBzdXBwb3J0IGZvciBWaXN1YWwgQysrIGFuZCBvdGhlciBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuIAogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgIi9FWFBPUlQ6SW5pdF88bW9kdWxlPiIsIHdoZXJlIDxtb2R1bGU+IGlzIHRoZQogICAgICAgICAgICBzd2lnIG1vZHVsZSBuYW1lIHdoZW4gbGlua2luZyB1c2luZyB0aGVzZSBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuCgowMi8xNS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1mdmlydHVhbCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyByZWRpZmluZWQgdmlydHVhbCBmdW5jdGlvbiBpbiBjaGlsZHJlbiBjbGFzc2VzLgoKICAgICAgICAgICAgTW9kaWZpZWQgLWNvbXBhY3Qgb3B0aW9uIHRvIC1mY29tcGFjdCBvcHRpb24KCiAgICAgICAgICAgIEFkZGVkIC1zbWFsbCBvcHRpb24uCiAgICAgICAgICAgIC1zbWFsbCA9IC1mdmlydHVhbCAtZmNvbXBhY3QKICAgICAgICAgICAgQW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBmdXR1cmUgZmVhdHVyZSBvcHRpb25zLAogICAgICAgICAgICB3aGljaCBhcmUgdXNlZCB0byByZWR1Y2Ugd3JhcHBlciBmaWxlIHN6aWUuCgogICAgICAgICAgICBBZGRlZCBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlIGNoZWNrLgogICAgICAgICAgICBUbyBkeW5hbWljYWxseSBzZXQgdGhlIGZlYXR1cmUgb3B0aW9ucyBzdWNoIGFzIC1mY29tcGFjdCAmIC1mdmlydHVhbAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMi8xMy8yMDAzOiBsZW56CiAgICAgICAgICAgIFVwZGF0ZWQgRG9jL01hbnVhbC9QZXJsNS5odG1sIHRvIHRhbGsgYWJvdXQgQysrIGNvbXBpbGUgcHJvYmxlbXMKICAgICAgICAgICAgY29uZmlndXJlLmluIG5vdyBjaGVja3MgZm9yIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgUnVudGltZS9NYWtlZmlsZS5pbiBhbmQgRXhhbXBsZS9NYWtlZmlsZS5pbiBub3cgdXNlIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgQWRkZWQgTGliL3Blcmw1L25vZW1iZWQuaCB3aGljaCBjb250YWlucyBhbGwgdGhlIGtub3duIG1hY3JvIGNvbmZsaWN0cwoKMDIvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4NTQxMCBdIEMrKyBFeHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhdXNlcyBTV0lHIHRvIGV4aXQuCiAgICAgICAgICAgIEZpeGVzIGEgc3ludGF4IGVycm9yIHdpdGggZGVjbGFyYXRpb25zIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIGluc3RhbnRpYXRpb24gYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZS4KICAgICAgICAgICAgV2UgbWlnaHQgZG8gbW9yZSBsYXRlci4gIFJlcG9ydGVkIGJ5IFRob21hcyBXaWxsaWFtc29uLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJld3JvdGUgYm9vbCB0eXBlbWFwcyB0byByZW1vdmUgcGVyZm9ybWFuY2Ugd2FybmluZyBmb3IgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIFZpc3VhbCBDKysuCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB3cmFwcGluZyByZWZlcmVuY2UgdmFyaWFibGVzIChjb25zdCBub24tcHJpbWl0aXZlIGFuZCBhbGwgbm9uLWNvbnN0IHR5cGVzKSAKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgaW50JiBpOwogICAgICAgICAgICAgIENsYXNzJiBjOwogICAgICAgICAgICAgIGNvbnN0IENsYXNzJiBjOwoKMDIvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBtb3JlIHZlcnkgc3VidGxlIHByZXByb2Nlc3NvciBjb3JuZXIgY2FzZXMgcmVsYXRlZCB0byByZWN1cnNpdmUKICAgICAgICAgICAgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBjYXQoeCx5KSB4ICMjIHkKCiAgICAgICAgICAgICAgICAgICBjYXQoY2F0KDEsMiksMykgICAgLy8gUHJvZHVjZXM6IGNhdCgxLDIpMwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIHhjYXQoeCx5KSBjYXQoeCx5KQoKICAgICAgICAgICAgICAgICAgIHhjYXQoeGNhdCgxLDIpLDMpICAvLyBQcm9kdWNlcyAxMjMKCiAgICAgICAgICAgIFNlZSBLJlIsIDJuZCBFZC4gcC4gMjMxLgoKMDIvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNjgzODgyIF0gLSBwYXRjaCBzdWJtaXR0ZWQgYnkgRi4gUG9zdG1hIGZvciBTV0lHIHRvIGNvbXBpbGUgb24gSFAtVVguCgowMi8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4gUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzEwLzIwMDM6IHNvbmd5YW5mCiAgICAgICAgICAgIEFkZGVkIC1jb21wYWN0IG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIGNvbW1lbnRzIGFuZCBjb21iaW5pbmcgc2hvcnQgbGluZXMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKIAowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUxMzU1IF0gU3ludGF4IGVycm9yIHdpdGggY3N0cmluZy5pCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE9tcmkgQmFyZWwuCgowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjYzNjMyIF0gaW5jb21wYXRpYmlsaXR5IHdpdGggc3RhbmRhcmQgY3BwLgogICAgICAgICAgICBUaGlzIGlzIGEgcmVmaW5lbWVudCB0aGF0IGZpeGVzIHRoaXMgcHJvYmxlbToKCiAgICAgICAgICAgICAgICAgLy8gU29tZSBtYWNybyB3aXRoIGFuIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08oeCkgICAgICAgeAoKICAgICAgICAgICAgICAgICBpbnQgRk9POyAgICAgICAgLyogTm90IGEgbWFjcm8tLS1ubyBhcmd1bWVudHMgKi8KIAowMi8wNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1NDkxIF0gcGFyc2UgZXJyb3Igd2l0aCBnbG9iYWwgbmFtZXNwYWNlIHF1YWxpZmljYXRpb24uCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBKZXJlbXkgWWFsbG9wLgoKMDIvMDQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdmFyYXJncyBwcm9jZXNzaW5nIGludHJvZHVjZWQgYnkgdGhlIG51bWlucHV0cyB0eXBlbWFwIHBhcmFtZXRlci4KCjAxLzA4LzIwMDM6IHR0bgoJICAgIFt4bWxdIEZpeCBzdHJpbmctcmVwbGFjZW1lbnQgb3JkZXJpbmcgYnVnbGV0LgoJICAgIFRoYW5rcyB0byBHYXJ5IEhlcnJvbi4KCjEyLzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGdXJ0aGVyIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gVGhlIFNXSUcgZXhlY3V0YWJsZSBpcyBub3cgYnVpbHQgdXNpbmcgYSBzaW5nbGUgTWFrZWZpbGUuCiAgICAgICAgICAgIC0gVGhpcyBtYWtlZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQXV0b21ha2UgKFNvdXJjZS9NYWtlZmlsZS5hbSkuCiAgICAgICAgICAgIC0gRGVwZW5kZW5jeSB0cmFja2luZyBhbmQgdGFncyBzdXBwb3J0IGFyZSBpbiB0aGlzIG1ha2VmaWxlLgogICAgICAgICAgICAtIEF1dG9tYWtlIDEuNy4yIGFuZCBBdXRvY29uZiAyLjU0IG1pbmltdW0gdmVyc2lvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBTV0lHIGZyb20gQ1ZTLgogICAgICAgICAgICAtIFJ1bm5pbmcgLi9hdXRvZ2VuLnNoIG5vdyBpbnN0YWxscyBBdXRvY29uZi9BdXRvbWFrZSBzdXBwb3J0IGZpbGVzIGludG8KICAgICAgICAgICAgICBUb29scy9jb25maWcgYW5kIHRoZXNlIGZpbGVzIGFyZSBubyBsb25nZXIgc3RvcmVkIGluIENWUy4KICAgICAgICAgICAgLSBCdWcgZml4ZXMgaW4gJ21ha2UgaW5zdGFsbCcgZm9yIHN5c3RlbXMgdXNpbmcgLmV4ZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBhbmQKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcmVsZWFzZS1zdWZmaXg9d2hhdGV2ZXIKCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb3JlIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gQXV0b2NvbmYncyBBQ19DQU5PTklDQUxfSE9TVCByZXBsYWNlcyBwcm9wcmlldGFyeSBhcHByb2FjaCBmb3IgZGV0ZWN0aW5nIGJ1aWxkIGhvc3QuCiAgICAgICAgICAgIC0gQXV0b2NvbmYgc3VwcG9ydCBmaWxlcyBtb3ZlZCB0byBUb29scy9jb25maWcuCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBydW4gb24gTWFjT1MsIHN1Ym1pdHRlZCBieSBCZXJuYXJkIERlc2dyYXVwZXMuCiAgICAgICAgICAgIE1haW5seSBlbnN1cmluZyBnZW5lcmF0ZWQgZmlsZXMgYXJlIG91dHB1dCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZvcgogICAgICAgICAgICBzb21lIG1vZHVsZXMuCgoxMi8xMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmFyaW91cyBidWlsZCBtb2RpZmljYXRpb25zIGFuZCBidWcgZml4ZXM6CiAgICAgICAgICAgIC0gU2ltcGxpZmljYXRpb24gb2YgdmVyc2lvbiBzdHJpbmcuIFVzZSBhdXRvY29uZidzIFBBQ0tBR0VfVkVSU0lPTiBpbnN0ZWFkLgogICAgICAgICAgICAtIEJ1aWxkIHRpbWUgcmVtb3ZlZCBmcm9tIFNXSUcgdmVyc2lvbi4KICAgICAgICAgICAgLSBVc2luZyBzdGFuZGFyZCBhdXRvY29uZiBjb25maWcgaGVhZGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIC0gVXBkYXRlZCBvbGQgYXV0b2NvbmYgbWFjcm9zIGFzIHJlcG9ydGVkIGJ5IGF1dG91cGRhdGUuCiAgICAgICAgICAgIC0gUmVtb3ZlZCAkcHJlZml4IGluIGF1dG9jb25mIGZyb20gc2VhcmNoIHBhdGhzIGFzIGF1dG9jb25mIHdvbid0IGV4cGFuZCB0aGVtLgogICAgICAgICAgICAtIFN1YnRsZSBidWcgZml4IHdoZXJlICdtYWtlIHByZWZpeD0vc29tZXdoZXJlOyBtYWtlIGNsZWFuOyBtYWtlIHByZWZpeD0vc29td2hlcmUvZWxzZScKICAgICAgICAgICAgICBwcm9kdWNlZCBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBpbmNvcnJlY3QgbGlicmFyeSBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSBBZGRlZCAtbGRmbGFncyBjb21tYW5kbGluZSBvcHRpb24gZm9yIE16U2NoZW1lLCBPY2FtbCwgUGlrZSBhbmQgUEhQLgogICAgICAgICAgICAtIEZpeGVkIHJlcG9ydGluZyBvZiBjb21waWxlciB1c2VkIHdoZW4gdXNpbmcgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICAtIFNXSUcgd2ViIGFkZHJlc3MgYWRkZWQgdG8gLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgoKMTIvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBmaXggdG8gVGNsIGR5bmFtaWMgY2FzdCB0eXBlbWFwcy4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgS3Jpc3RvcGhlciBCbG9tLgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdGVtcGxhdGUgYXJndW1lbnQgcmVwbGFjZSBidWcuICBSZXBvcnRlZCBieQogICAgICAgICAgICBDaHJpcyBGbGF0bGV5LgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXZlcnRlZCBDSEFOR0VTIDA5LzAzLzIwMDIsIHByZXByb2Nlc3NvciBhcmd1bWVudCBldmFsdWF0aW9uLiAgQXJndW1lbnRzCiAgICAgICAgICAgIGFyZSBub3QgZXZhbHVhdGVkIGR1cmluZyBjb2xsZWN0aW9uLCBLJlIsIHAuIDIzMC4KCjEyLzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDkwMjIgXSBDb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIEtBSS9LQ0MKCjEyLzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyAncmVsLTEtMycgQ1ZTIGJyYW5jaCBtZXJnZWQgYmFjayBpbnRvIHRoZSBtYWluIGJyYW5jaC4KCgpWZXJzaW9uIDEuMy4xNyAoTm92ZW1iZXIgMjIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTM5MjIgXSBwcmVwcm9jZXNzb3IgZXJyb3JzIHdpdGggSEFWRV9MT05HX0xPTkcuCiAgICAgICAgICAgIAoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjE1NDgwIF0gbXpzY2hlbWUgU1dJR19NdXN0R2V0UHRyXy4KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUxMTkgXSBTV0lHX2Nyb2FrIGNhdXNlcyBjb21waWxlciB3YXJuaW5nLgoKMTEvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgdG8gY2xhc3MgbWVtYmVycy4KCjExLzE1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogT3ZlcmxvYWRlZCBDKysgZnVuY3Rpb25zIHdoaWNoIGNhbm5vdCBiZSBvdmVybG9hZGVkIGluIEphdmEgCiAgICAgICAgICAgIG9uY2UgYWdhaW4gaXNzdWUgYSB3YXJuaW5nLgoKMTEvMTQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBIYW5kbGluZyBvZiBOVUxMIHBvaW50ZXJzIGlzIGltcHJvdmVkLiBBIGphdmEgbnVsbCBvYmplY3Qgd2lsbCBub3cKICAgICAgICAgICAgYmUgdHJhbnNsYXRlZCB0byBhbmQgZnJvbSBhIE5VTEwgQy9DKysgcG9pbnRlciBieSBkZWZhdWx0LiBQcmV2aW91c2x5IHdoZW4gCiAgICAgICAgICAgIHdyYXBwaW5nOgoKICAgICAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzcyB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyAqcyk7CgogICAgICAgICAgICBhbmQgaXQgd2FzIGNhbGxlZCBmcm9tIEphdmEgd2l0aCBudWxsOgoKICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKG51bGwpCgogICAgICAgICAgICBhIEphdmEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4gRXh0cmEgdHlwZW1hcHMgaGFkIHRvIGJlIHdyaXR0ZW4gaW4KICAgICAgICAgICAgb3JkZXIgdG8gb2J0YWluIGEgTlVMTCBwb2ludGVyIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGxpa2UgdGhpcyBvbmUuIE5vdyB0aGUgCiAgICAgICAgICAgIGRlZmF1bHQgd3JhcHBpbmcgd2lsbCBkZXRlY3QgJ251bGwnIGFuZCB0cmFuc2xhdGUgaXQgaW50byBhIE5VTEwgcG9pbnRlci4KICAgICAgICAgICAgQWxzbyBpZiBhIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHBvaW50ZXIsIGVnOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIFNvbWVDbGFzcyAqYmFyKCkgeyByZXR1cm4gTlVMTDsgfQogICAgICAgICAgICAKICAgICAgICAgICAgVGhlbiB0aGlzIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIGEgU29tZUNsYXNzIHByb3h5IGNsYXNzIGhvbGRpbmcgYSBOVUxMCiAgICAgICAgICAgIHBvaW50ZXIuIE5vdyBudWxsIGlzIHJldHVybmVkIGluc3RlYWQuIFRoZXNlIGNoYW5nZXMgYXJlIHN1YnRsZSBidXQgdXNlZnVsLgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUgb3JpZ2luYWwgdHlwZW1hcHM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJCZqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJGphdmFjbGFzc25hbWUoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgoxMS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBtZXRob2RzIGFuZCBzaWduYXR1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICAgbWV0aChpbnQgbWV0aF9wYXJhbSkgPSAwOyAKICAgICAgICAgICAgfTsgCiAKIAogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9iYXIgOiBwdWJsaWMgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICBpbnQgbWV0aChpbnQgbWV0aF9wYXJhbV8xLCBpbnQgbWV0aF9wYXJhbV8yKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFic3RyYWN0X2JhciBpcyBzdGlsbCBhYnN0cmFjdC4KCiAgICAgICAgICAgIEZpeGVzIFsgNjI4NDM4IF0gRGVyaXZlZCBhYnN0cmFjdCBjbGFzcyBub3QgYWJzdHJhY3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGFuZCBwYXRjaGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBtYXRjaGluZyBwcm9ibGVtIHdpdGggdHlwZW1hcHMgYW5kIGFycmF5IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgIGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyIGJsYWhbMjBdOwoKICAgICAgICAgICAgYW5kIGEgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gJDFfZGltMCAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiAkMV9kaW0qIHZhcmlhYmxlcyB3ZXJlbid0IGJlIGV4cGFuZGVkIHByb3Blcmx5LiAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhbmthaiBLdW1hciBHb2VsLgogICAgICAgICAgICAgICAKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCBuZXcgbW9kdWxlIHRoYXQgZHVtcHMgU1dJRydzIHBhcnNlCgkgICAgdHJlZSBhcyAoQ29tbW9uKSBMaXNwIHMtZXhwcmVzc2lvbnMuICBUaGUgbW9kdWxlIGlzCgkgICAgaW52b2tlZCB3aXRoIFNXSUcncyAtc2V4cCBjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhlIG91dHB1dAoJICAgIGNhbiBiZSByZWFkIGludG8gQ29tbW9uIExpc3AuICBUaGVyZSBpcyAocHJvdG90eXBlKQoJICAgIGV4YW1wbGUgTGlzcCBjb2RlIHRoYXQgZ2VuZXJhdGVzIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCgkgICAgZGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIEtldmluIFJvc2VuYmVyZydzIFVGRkkuCgoJICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgUmVtb3ZlZCBkdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgImNwcF90ZW1wbGF0ZV9kZWNsIiBpbgoJICAgIHBhcnNlci55OyBiaXNvbiAxLjc1IGNvbXBsYWluZWQuCgoxMS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlZmF1bHQgcHJpbWl0aXZlIGFycmF5IGhhbmRsaW5nIGhhcyBjaGFuZ2VkIGxpa2UgYXJyYXlzIG9mIGNsYXNzZXMuIAogICAgICAgICAgICBDIHByaW1pdGl2ZSBhcnJheXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGEgSmF2YSBhcnJheSBidXQgd2l0aCBhIHBvaW50ZXIgCiAgICAgICAgICAgICh0eXBlIHdyYXBwZXIgY2xhc3MpLiBBZ2FpbiB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAKICAgICAgICAgICAgVGhlIG9yaWdpbmFsIHR5cGVtYXBzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGFycmF5c19qYXZhLmksIHNvIHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBtZXJlbHkgaW5jbHVkaW5nIHRoaXMgZmlsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKCiAgICAgICAgICAgIFRoZSBhcnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGV5IGFyZSBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGluY2x1ZGluZyB0aGlzIGZpbGUsIHRodXMgdGhpcyBvZnRlbiB1bnVzZWQgY29kZSBpcyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHNwZWNpZmljYWxseSByZXF1aXJpbmcgdGhpcyB0eXBlIG9mIGFycmF5IHN1cHBvcnQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgbmVzdGVkIG1vZHVsZSBkZWNsYXJhdGlvbnMgKGFzIHdhcwogICAgICAgICAgICBwcmV2aW91c2x5IGFkZGVkIGZvciB0aGUgUGVybCBtb2R1bGUpLiBTbyBhICVtb2R1bGUgZGlyZWN0aXZlCiAgICAgICAgICAgIG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIk91dGVyOjpJbm5lcjo6Rm9vIgoKICAgICAgICAgICAgd2lsbCBuZXN0IGV2ZXJ5dGhpbmcgYXMgKGluIFJ1YnkgY29kZSk6CgogICAgICAgICAgICAgICAgbW9kdWxlIE91dGVyCiAgICAgICAgICAgICAgICAgIG1vZHVsZSBJbm5lcgogICAgICAgICAgICAgICAgICAgIG1vZHVsZSBGb28KICAgICAgICAgICAgICAgICAgICAgICMgc3R1ZmYgZ29lcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAKMTEvMDUvMjAwMjogbWtvZXBwZSAKCSAgICBbTXpTY2hlbWVdIEFkZCBhbiBhcmd1bWVudCAoLWRlY2xhcmVtb2R1bGUpIHRoYXQgZ2VuZXJhdGVzCgkgICAgY29kZSB0byBjb3JyZWN0bHkgZGVjbGFyZSBhIHByaW1pdGl2ZSBtb2R1bGUgZXh0ZW5zaW9uLgoJICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBCcnVjZSBCdXR0ZXJmaWVsZC4KCjExLzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgcGF0Y2ggc3VibWl0dGVkIGJ5IE1pY2hhZWwgQ2FoaWxsIHRvIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyCiAgICAgICAgICAgIHdhcm5pbmdzIGZvciB0aGUgamVudiBhbmQgY2xzIHBhcmFtZXRlcnMuIFRoaXMgcGF0Y2ggYWxzbyBhbHNvIGFsbG93cyBvbmUKICAgICAgICAgICAgdG8gdXNlICJ2b2lkIiBpbiB0aGUgam5pIHR5cGVtYXAgZm9yIGFueSB0eXBlIHdpdGhvdXQgY29kZSBiZWluZyBnZW5lcmF0ZWQKICAgICAgICAgICAgYXR0ZW1wdGluZyB0byByZXR1cm4gYSB2YWx1ZS4KCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQXJyYXkgaGFuZGxpbmcgaXMgZGlmZmVyZW50LiBBcnJheXMgb2YgY2xhc3NlcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQKICAgICAgICAgICAgd2l0aCBwcm94eSBhcnJheXMsIGVnIHdyYXBwaW5nCgogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIHRoZXNlIEphdmEgZ2V0dGVycyBhbmQgc2V0dGVyczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFhbXSB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWFtdIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIHZlcnkgaW5lZmZpY2llbnQgYXMgdGhlIGVudGlyZSBhcnJheSBpcyBjb3BpZWQgbnVtZXJvdXMKICAgICAgICAgICAgdGltZXMgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBnZXR0ZXIgb3Igc2V0dGVyLiBUaGVzZSBhcnJheXMgYXJlIG5vdwogICAgICAgICAgICB3cmFwcGVkIHdpdGggYSBwb2ludGVyIHNvIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gYWNjZXNzIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IAogICAgICAgICAgICB1c2luZyBhIHByb3h5IGNsYXNzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWCB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWCBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgQXJyYXlzIG9mIGVudW1zIGhhdmUgYWxzbyBiZWVuIHNpbWlsYXJseSBjaGFuZ2VkLiBUaGlzIGJlaGF2aW91ciBpcyBub3cgbGlrZSB0aGUgCiAgICAgICAgICAgIG90aGVyIFNXSUcgbGFuZ3VhZ2UncyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIGFycmF5IGxpYnJhcnkgc2hvdWxkIGJlIHVzZWQgdG8gCiAgICAgICAgICAgIGFjY2VzcyB0aGUgb3RoZXIgZWxlbWVudHMuIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIGFjaGlldmVkIHVzaW5nIHRoZSAKICAgICAgICAgICAgbWFjcm9zIGFuZCB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgIEpBVkFfQVJSQVlTT0ZDTEFTU0VTKFgpCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUd28gbmV3IHR5cGVtYXBzIGphdmFpbiBhbmQgamF2YW91dCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJveHkgY2xhc3MgCiAgICAgICAgICAgIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3MgbWV0aG9kIGNhbGxzIHRvIHRoZSBKTkkgY2xhc3MuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIAogICAgICAgICAgICByZWFsbHkgdXNlZCBmb3IgdHJhbnNmb3JtaW5nIHRoZSBqc3R5cGUgKHVzZWQgaW4gcHJveHkgY2xhc3MgYW5kIHR5cGUgd3JhcHBlcgogICAgICAgICAgICBjbGFzc2VzKSB0byB0aGUganR5cGUgKHVzZWQgaW4gdGhlIEpOSSBjbGFzcykgYW5kIHZpc2EgdmVyc2EuIEEgamF2YWluIHR5cGVtYXAKICAgICAgICAgICAgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgYW4gaW4gdHlwZW1hcCBpcyB3cml0dGVuIGFuZCBzaW1pbGFybHkgamF2YW91dCBmb3IgYW4gb3V0CiAgICAgICAgICAgIHR5cGVtYXAuIEFuIGV4YW1wbGUgaXMgcHJvYmFibHkgYmVzdCB0byBzaG93IHRoZW0gd29ya2luZzoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIENsYXNzICJDbGFzcy5nZXRDUHRyKCRqYXZhaW5wdXQpIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSB1bnNpZ25lZCBzaG9ydCAiJGphdmFpbnB1dCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIENsYXNzICogewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3Mge307CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgKiBiYXIoQ2xhc3MgY2xzLCB1bnNpZ25lZCBzaG9ydCB1c2gpIHsgcmV0dXJuIG5ldyBDbGFzcygpOyB9OwogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgcHJveHkgY29kZSBpcyB0aGVuOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgYmFyKENsYXNzIGNscywgaW50IHVzaCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKGV4YW1wbGVKTkkuYmFyKENsYXNzLmdldENQdHIoY2xzKSwgdXNoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFNvbWUgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIHVzZSB0aGVzZSB0eXBlbWFwcy4KICAgICAgICAgICAgSGVyZSAkamF2YWlucHV0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdjbHMnIGFuZCAndXNoJy4gJGpuaWNhbGwgaGFzIGJlZW4gcmVwbGFjZWQgYnkgCiAgICAgICAgICAgIHRoZSBuYXRpdmUgbWV0aG9kIGNhbGwsICdleGFtcGxlSk5JLmJhciguLi4pJyBhbmQgJG93bmVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdmYWxzZScuCiAgICAgICAgICAgICRqYXZhaW5wdXQgaXMgYW5hbG9nb3VzIHRvIHRoZSAkaW5wdXQgc3BlY2lhbCB2YXJpYWJsZS4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAgICAgICAkam5pY2FsbCBpcyBhbmFsb2dvdXMgdG8gJGFjdGlvbiBpbiAlZXhjZXB0aW9uLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgY2FsbCB0byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICAkb3duZXIgaXMgcmVwbGFjZWQgYnkgZWl0aGVyIHRydWUgaWYgJW5ld29iamVjdCBoYXMgYmVlbiB1c2VkIG90aGVyd2lzZSBmYWxzZS4KCiAgICAgICAgICAgIFRoZSBqYXZhLnN3ZyBmaWxlIGNvbnRhaW5zIGRlZmF1bHQgamF2YWluIGFuZCBqYXZvdXQgdHlwZW1hcHMgd2hpY2ggd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGNvZGUKICAgICAgICAgICAgYXMgcHJldmlvdXNseS4gVGhpcyBjaGFuZ2UgaXMgb25seSBvZiBjb25jZXJuIHRvIHRob3NlIHdobyBoYXZlIHdyaXR0ZW4gdGhlaXIgb3duIHR5cGVtYXBzIGFzCiAgICAgICAgICAgIHlvdSB3aWxsIHRoZW4gbW9zdCBsaWtlbHkgaGF2ZSB0byB3cml0ZSB5b3VyIG93biBqYXZhaW4gYW5kIGphdmFvdXQgdHlwZW1hcHMuCgogICAgICAgICAgICBUaGUgamF2YW91dCB0eXBlbWFwIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGEgSmF2YSBkb3duY2FzdCB0byBiZSB1c2VkIG9uIGFic3RyYWN0IAogICAgICAgICAgICBwcm94eSBiYXNlIGNsYXNzZXMuIFNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIG9uIGR5bmFtaWNfY2FzdC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI0LzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gVXBnYWRlZCB0byBsaWJ0b29sIDEuNC4zLCBwcmVzdW1hYmx5IHcvIGJldHRlcgoJICAgIHN1cHBvcnQgZm9yIG5ld2lzaCBwbGF0Zm9ybXMgKGxpa2UgTWFjT1MgWCkuCgoxMC8yMS8yMDAyOiB0dG4KCSAgICBGaXhlZCBSdW50aW1lL01ha2VmaWxlLmluIGJ1ZyAtLSB0aGFua3MgdG8gUmljaGFyZCBDYWxtYmFjaC4KCjEwLzE4LzIwMDI6IHR0bgoJICAgIEZpeGVkIHR5cG8gaW4gZG9oLmggLS0gdGhhbmtzIHRvIE1heCBIb3JuLgoKVmVyc2lvbiAxLjMuMTYgKE9jdG9iZXIgMTQsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgJWZlYXR1cmUgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgV2lsbGlhbSBGdWx0b24uCgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIE9wZW5WTVMgYnVpbGQgZGlyZWN0b3J5ICh2bXMpLiAgQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIEplYW4tRnJhbudvaXMgUGllcm9ubmUuCgoxMC8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyBjbGF1c2UgdG8gdGhlIG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgVGhlIHRocm93cyBjbGF1c2UgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGZ1bmN0aW9ucwogICAgICAgICAgICBhbmQgbW9kdWxlIGNsYXNzIGZ1bmN0aW9ucy4KCjA5LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSBhbmQgY2xhc3NlcyB0aGF0CiAgICAgICAgICAgIHdlcmUgZGVmaW5lZCBidXQgbm90IHdyYXBwZWQuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IExlc2xpZSBCcm9va3MsCiAgICAgICAgICAgIEdlcnJ5IFdvb2RzLCBhbmQgb3RoZXJzLgoKMDkvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb21lIGVycm9yIGNoZWNraW5nIGFkZGVkOgogICAgICAgICAgICAxKSBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBjaGVjayBpbiB0aGUgY2hhciAqIHR5cGVtYXBzLiAKICAgICAgICAgICAgMikgQXMgU1dJRyB0cmVhdHMgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBhc3NpbmcgYnkgdmFsdWUgYWxsIHRoZQogICAgICAgICAgICBzYW1lLCBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBleHBlY3RzCiAgICAgICAgICAgIGFuIG9iamVjdCBwYXNzZWQgYnkgdmFsdWUgb3IgYnkgcmVmZXJlbmNlLiBBIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIAogICAgICAgICAgICBub3cgdGhyb3duIHVuZGVyIHRoaXMgc2NlbmFyaW8uCgowOS8yMC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNsZWFuIiBhbmQgIm1ha2UgaW5zdGFsbCIKCQkJICB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRXhwbGFpbiBob3cgdG8gZXh0ZW5kICJtYWtlIGluc3RhbGwiIHcvIGV4dHJhLWluc3RhbGwubGlzdC4KCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRpb24gb2YgdGhlICJpZ25vcmUiIHR5cGVtYXAuICAgVGhlICJpZ25vcmUiIHR5cGVtYXAgaGFzCiAgICAgICAgICAgIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSAiaW4iIHR5cGVtYXAuCiAgICAgICAgICAgIFRvIGlnbm9yZSBhbiBhcmd1bWVudCwgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbixudW1pbnB1dHM9MCkgaW50ICpvdXRwdXQgKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgYnVncyByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbgogICAgICAgICAgICBvZiB0aGUgImluIiBhbmQgImlnbm9yZSIgdHlwZW1hcHMgKHdoaWNoIHdlcmUgc3VwcG9zZWQgdG8gYmUKICAgICAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlKS4KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgdGhlIG51bWlucHV0cyBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgQ3VycmVudGx5LCB2YWx1ZXMgPjEgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvci4gIEhvd2V2ZXIsIGZ1dHVyZQogICAgICAgICAgICByZWxlYXNlcyBvZiBTV0lHIG1heSB1dGlsaXplIHRoYXQgdG8gc3VwcG9ydCBtdWx0aS1pbnB1dCB0eXBlbWFwcy4KCiAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgc3RpbGwgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGlzCiAgICAgICAgICAgIHRyYW5zbGF0ZWQgdG8gJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IGZvciB1bm5hbWVkIHN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgfSAqYmxhaDsKCgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2dlciBHaWJzb24uCiAgICAgICAgICAgIE5vdGU6IHdlIG1pZ2h0IGJlIGFibGUgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgaW4gc3BlY2lhbCBjYXNlcy4KCjA5LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgbW9kaWZpY2F0aW9uIHRvIGdlbmVyYXRlZCB3cmFwcGVyIGZ1bmN0aW9ucy4gIFBvaW50ZXIgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgYWx3YXlzIHNldCB0byBhbiBpbml0aWFsIHZhbHVlIG9mIDAuICAgU2ltcGxpZmllcyB0eXBlbWFwIHdyaXRpbmcgYW5kIGNsZWFudXAKICAgICAgICAgICAgY29kZSAoc2luY2UgeW91IGNhbiByZWx5IG9uIHplcm8tdmFsdWUgaW5pdGlhbGl6YXRpb24pLiAgIFRoaXMgYWxzbyBncmVhdGx5CiAgICAgICAgICAgIHJlZHVjZXMgdGhlIG5lZWQgdG8gZXZlciB3cml0ZSBhbiAiYXJnaW5pdCIgdHlwZW1hcC4KCjA5LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gc21hcnQtcG9pbnRlciBzdXBwb3J0LiAgSWYgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIGlzIHBhcnQgb2YgYW4gaWdub3JlZCBiYXNlIGNsYXNzIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBCYXI7CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAgICAgICAgLyogSWdub3JlZCAqLwogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICB0aGVuIG1ldGhvZHMgZnJvbSBGb28gYXJlIHN0aWxsIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKQogICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgICBUaGUgb25seSBjYXRjaCBpcyB0aGF0IHRoZSBvcGVyYXRvci0+KCkgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgIChzaW5jZSBpdCB3YXNuJ3Qgd3JhcHBlZCkuICAgVGhlcmVmb3JlLCB0aGVyZSB3b24ndCBiZSBhbnkKICAgICAgICAgICAgIF9fZGVyZWZfXygpIG9wZXJhdGlvbiB1bmxlc3MgaXQgaXMgZXhwbGljaXRseSBhZGRlZCB0byBTcGFtCiAgICAgICAgICAgICAoZWl0aGVyIHVzaW5nICVleHRlbmQgb3IganVzdCBwbGFjaW5nIG9wZXJhdG9yLT4oKSBpbiB0aGUKICAgICAgICAgICAgIGRlZmluaXRpb24gb2YgU3BhbSkuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNoZWNrIiB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRG9jdWVtZW50ZWQgbWV0aG9kb2xvZ3kgaW4gTWFudWFsL0V4dGVuZGluZy5odG1sLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW0RvY3NdIFByZWZpeGVkIE1hbnVhbC8qLmh0bWwgd2l0aCAiPCFET0NUWVBFIGh0bWwgLi4uPiIgdG8KCSAgICBwYW5kZXIgZG90aW5nbHkgdG8gKG92ZXItKXNlbnNpdGl2ZSBlZGl0b3JzLgoKMDkvMTAvMjAwMjogdHRuCgkgICAgW0d1aWxlXSBDb252ZXJ0ZWQgRXhhbXBsZXMvZ3VpbGUvc2ltcGxlICJtYWtlIGNoZWNrIgoJICAgIGJlaGF2aW9yIHRvIGFjdHVhbGx5IGNoZWNrIGV4ZWN1dGlvbiByZXN1bHRzLiAgUmVkdWNlZAoJICAgIGl0ZXJhdGlvbiBjb3VudHMgc28gdGhhdCB0aGUgdGVzdCBkb2Vzbid0IHRha2UgdG9vIGxvbmcuCgowOS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUctMS4zLjE1IHJlbGVhc2VkLgoKClZlcnNpb24gMS4zLjE1IChTZXB0ZW1iZXIgOSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBuYXN0eSBydW50aW1lIHR5cGUgY2hlY2tpbmcgYnVnIHdpdGggc3VidHlwZXMgYW5kIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuIAoKMDkvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGV4Y2VwdGlvbiBjbGFzc2VzIGZvciBhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UgY2FuIGJlIGdlbmVyYXRlZCBieSAKICAgICAgICAgICAgc3BlY2lmeWluZyB0aGVtIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW4gdGhlIHRocm93cyBhdHRyaWJ1dGUgaW4gYW55IG9uZQogICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiBpbiwgb3V0LCBjaGVjaywgZnJlZWFyZywgYXJnb3V0IGFuZCB0aHJvd3MuIEEgY2xhc3NpYwogICAgICAgICAgICBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50byBhIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cywgdGhyb3dzPSJqYXZhLmlvLklPRXhjZXB0aW9uIikgZmlsZV9leGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgIGpjbGFzcyBleGNlcCA9IGplbnYtPkZpbmRDbGFzcygiamF2YS9pby9JT0V4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmIChleGNlcCkKICAgICAgICAgICAgICAgICAgICAgICAgamVudi0+VGhyb3dOZXcoZXhjZXAsICQxLndoYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOyAvLyBvciB1c2UgU1dJR19mYWlsCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgZmlsZV9leGNlcHRpb24gey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIHRocm93KGZpbGVfZXhjZXB0aW9uKTsKCiAgICAgICAgICAgIFRoZSBKYXZhIG1ldGhvZCB3aWxsIHRoZW4gYmUgZGVjbGFyZWQgd2l0aCBhIHRocm93cyBjbGF1c2U6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Li4ufQoKMDkvMDgvMjAwMjogbWtvZXBwZQoJICAqIFtHdWlsZV0gSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGFyZ2xpc3Qgbm8KCSAgICBsb25nZXIgZ2V0cyBjbHV0dGVyZWQgd2l0aCB0eXBlIHNwZWNpZmljYXRpb24sIG1ha2luZyBpdAoJICAgIG1vcmUgcmVhZGFibGUuICAoQWxzbyB0aGUgSUxJU1AgZnVuY3Rpb24gQy11IE0teAoJICAgIGBhcmdsaXN0LWxpc3AnIFJFVCB3b3JrcyBiZXR0ZXIgdGhpcyB3YXkuKSAgVGhlIHR5cGVzIG9mCgkgICAgYXJndW1lbnRzIGFyZSBleHBsYWluZWQgaW4gYW4gZXh0cmEgc2VudGVuY2UgYWZ0ZXIgdGhlCgkgICAgYXJnbGlzdC4gCgkgICAgCgkgICAgVGhlcmUgYXJlIG5vdyB0d28gZG9jdW1lbnRhdGlvbi1yZWxhdGVkIHR5cGVtYXAgYXJndW1lbnRzOgoKCSAgICAgICAgJXR5cGVtYXAoaW4sIGRvYz0iJE5BTUUgaXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMiLCAKCQkJIGFyZ2xpc3Q9IiRuYW1lIikgIGludCAqVkVDVE9SIHsgLi4uIH0KCQkJIAogICAgICAgICAgICBUaGUgImFyZ2xpc3QiIHRleHRzIG9mIGFsbCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiBtYWtlIHVwCgkgICAgaXRzIGFyZ2xpc3QgaW4gdGhlIGRvY3VtZW50YXRpb24uICBUaGUgImRvYyIgdGV4dHMgb2YgYWxsCgkgICAgYXJndW1lbnRzIGFyZSBjb2xsZWN0ZWQgdG8gbWFrZSBhIHNlbnRlbmNlIHRoYXQgZGVzY3JpYmVzCgkgICAgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuICBSZWFzb25hYmxlIGRlZmF1bHRzIGFyZQoJICAgIHByb3ZpZGVkLiAKCgkgICAgQXMgdXN1YWwsICRuYW1lIGlzIHN1YnN0aXR1dGVkIGJ5IHRoZSBuYW1lIG9mIHRoZQoJICAgIGFyZ3VtZW50LiBUaGUgbmV3IHR5cGVtYXAgdmFyaWFibGUgJE5BTUUgaXMgbGlrZSAkbmFtZSwKCSAgICBidXQgbWFya2VkLXVwIGFzIGEgdmFyaWFibGUuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKCSAgICB1cHBlci1jYXNlZDsgaW4gVGVYaW5mbyBtb2RlICgiLXByb2Nkb2Nmb3JtYXQgdGV4aW5mbyIpIGl0CgkgICAgY29tZXMgb3V0IGFzIEB2YXJ7bmFtZX0uIAoJICAgIAoJICAgIFRoZSBkaXJlY3RpdmVzICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAgJW11bHRpcGxlX3ZhbHVlcyBub3cgYWxzbyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUKCSAgICBkb2N1bWVudGF0aW9uLiAoVGhpcyBpcyBhY2hpZXZlZCB2aWEgdGhlIG5ldyBwcmFnbWFzCgkgICAgcmV0dXJuX25vdGhpbmdfZG9jLCByZXR1cm5fb25lX2RvYywgcmV0dXJuX211bHRpX2RvYy4pCgoJICAgIERvY3VtZW50YXRpb24gaGFzIGFsc28gaW1wcm92ZWQgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZQoJICAgIHdyYXBwZWQgYXMgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMgKGNvbW1hbmQtbGluZSBzd2l0Y2gKCSAgICAiLWVtaXQtc2V0dGVycyIpLgoKICAgICAgICAgICogW0d1aWxlXSBFbWl0IGNvbnN0YW50cyBhcyBfaW1tdXRhYmxlXyB2YXJpYWJsZXMuICAoVGhpcwogICAgICAgICAgICB3YXMgYnJva2VuIHJlY2VudGx5LikKCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFVwZGF0ZWQgdGhlIHR5cGVtYXBzIGluIGxpc3QtdmVjdG9yLmkuCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgU2hvcnQtY2lyY3VpdCB0aGUgdHlwZWNoZWNrcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCgkgICAgKFRoZSBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdGlvbiBhcmUgdmlzaWJsZSBpbiB0aGUgbmV3CgkgICAgdGVzdGNhc2UgIm92ZXJsb2FkX2NvbXBsaWNhdGVkIi4pCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbHV0aW9uIGZvciBbIDU5NjQxMyBdCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgd3JhcHBlciBjb25zdHJ1Y3RvciBtb2RpZmllciBjYW4gYmUgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIAogICAgICAgICAgICBwcm90ZWN0ZWQuIE5vcm1hbGx5IFNXSUcgZ2VuZXJhdGVzIGEgY29uc3RydWN0b3IgbGlrZSB0aGlzIHdoaWNoIGNhbiBvbmx5IAogICAgICAgICAgICBiZSBhY2Nlc3NlZCB3aXRoaW4gb25lIHBhY2thZ2U6CgogICAgICAgICAgICAgIHByb3RlY3RlZCBCYXIobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIFNXSUcgYWNyb3NzIG11bHRpcGxlIHBhY2thZ2VzIG9yIHdhbnQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3IKICAgICAgICAgICAgYW55d2F5LCBpdCBjYW4gbm93IGJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIFRvIG1vZGlmeSB1c2UgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUgInB1YmxpYyIKCiAgICAgICAgICAgIHRvIGNoYW5nZSB0byBwdWJsaWMgZm9yIGFsbCBwcm94eSBjbGFzc2VzIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gInB1YmxpYyIKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIHR5cGVtYXBzIGZvciB0aGUgSmF2YSBtb2R1bGUuIEMrKyBleGNlcHRpb25zIGdldCBjb252ZXJ0ZWQgaW50bwogICAgICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBKYXZhIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICAKICAgICAgICAgICAgV2FybmluZzogVGhpcyBtYXkgY2hhbmdlIGZyb20gamF2YS5sYW5nLlJ1bnRpbWUgZXhjZXB0aW9uIGluIHRoZSBmdXR1cmUuCgowOS8wNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdmFyaWFibGVzIGRlY2xhcmVkIGFzIHJlZmVyZW5jZXMuCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjA5LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb3JlIHVwZGF0ZXMgdG8gdGhlIFJ1YnkgbW9kdWxlIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZwoJICAgIGEgbmV3IHR5cGVtYXAgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY29sbGVjdCBrZXktdmFsdWUKCSAgICBwYWlycyBmcm9tIGFuIGFyZ3VtZW50IGxpc3QgaW50byBhIEhhc2guCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbiBhbmQgY29uc3RydWN0b3JzLgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgRm9vPFQ+KCkgeyB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGV4dHJhIDxUPiBpbiB0aGUgY29uc3RydWN0b3Igd2FzIGNhcnJpZWQgdGhyb3VnaCBpbiB0aGUKICAgICAgICAgICAgbmFtZS0tY2F1c2luZyBydW50aW1lIHByb2JsZW1zIGluIGdlbmVyYXRlZCBtb2R1bGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3JkaSBBcm5hYmF0IEJlbmVkaWN0by4KIAowOS8wNS8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBTdXBwb3J0IG92ZXJsb2FkaW5nLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZWQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVzCgkgICAgdG8gdXNlIFJ1YnkgMS43IHN1cHBvcnQgZm9yIHRoZXNlIHR5cGVzIHdoZW4gYXZhaWxhYmxlLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG91dHB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlIHRvIHByaW1pdGl2ZQoJICAgIHR5cGVzLgoKMDkvMDQvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHBhc3MtYnktdmFsdWUgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBBcm5vCgkgICAgUGV0ZXJzIHZpYSBEZWJpYW4gYnVndHJhY2tpbmcgKCMxNTY5MDIpLCBwYXRjaCBieSBUb3JzdGVuCgkgICAgTGFuZHNjaG9mZiA8dG9yc3RlbkBkZWJpYW4ub3JnPi4KCjA5LzAzLzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKCSAgICBCZXR0ZXIgcmVmZXJlbmNlIHN1cHBvcnQuCgkgICAgRnVuY3Rpb25zIHRoYXQgd2FudCBhIHZvaWQqKiBjYW4gdGFrZSBhIE5VTEwgYnkgcmVmZXJlbmNlIGFuZAoJICAgIHRoZSB2b2lkKiB3aWxsIGJlIG1hZGUgZm9yIHlvdSBhbmQgdGhlbiBwYXNzZWQtYnktcmVmZXJlbmNlCgoJICAgIEFsc28gYWxsIGludGVnZXItY2xhc3MgbmF0aXZlIHR5cGVzIGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlCgkgICAgd2hlcmUgYW4gaW50KiBvciBpbnQmIGV0YyBpcyBuZWVkZWQKCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlZCB0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBwcmVwcm9jZXNzb3IgbWFjcm8gYXJndW1lbnRzLgogICAgICAgICAgICBBcmd1bWVudHMgYXJlIG5vdyBleHBhbmRlZCBieSB0aGUgcHJlcHJvY2Vzc29yICpiZWZvcmUqIHRoZXkKICAgICAgICAgICAgYXJlIHBhc3NlZCB0byBtYWNybyBleHBhbnNpb24uICBUaGlzIGZpeGVzIGEgc3VidGxlIGV4cGFuc2lvbgogICAgICAgICAgICBidWcgcmVwb3J0ZWQgYnkgQW50aG9ueSBIZWFkaW5nLgoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0aGUgZmlsZSBpbmNsdWRlIG9yZGVyIChhZ2FpbiwgYXBwYXJlbnRseSkuIFNlZSAyLzI3Lzk5LgoKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybF0gQmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LiAgU2luY2UgUGVybCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICByZWxpZXMgb24gc2V0am1wL2xvbmdqbXAsIHdyYXBwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBtb2RpZmllZCBzbGlnaHRseQogICAgICAgICAgICB0byBwcm92aWRlIGFuIGV4dHJhIGJsb2NrIHNjb3BlOgoKICAgICAgICAgICAgICAgIFhTKGZvbykgewogICAgICAgICAgICAgICAgICAgY2hhciBfc3dpZ21zZ1tTV0lHX01BWF9FUlJNU0ddID0gIiI7CiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfc3dpZ2VyciA9IF9zd2lnbXNnOwogICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsIHdyYXBwZXIgZnVuY3Rpb24gaGVyZSAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBTV0lHX2Nyb2FrKCJBbiBlcnJvciBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFhTUkVUVVJOKGFyZ3ZpKTsgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiAqLwogICAgICAgICAgICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBjb2RlICovCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjcm9hayhfc3dpZ19lcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG1hY3JvIFNXSUdfY3JvYWsoeCkgc2V0cyB0aGUgdmFsdWUgb2YgX3N3aWdlcnIgdG8geCBhbmQKICAgICAgICAgICAgZXhlY3V0ZXMgYSAiZ290byBmYWlsIi4gIFRoZSB3aG9sZSB3cmFwcGVyIGZ1bmN0aW9uIGlzIGVuY2xvc2VkCiAgICAgICAgICAgIGJsb2NrIHNjb3BlIHRvIHByb3ZpZGUgcHJvcGVyIGNsZWFudXAgb2YgQysrIG9iamVjdHMuICBTaW5jZQogICAgICAgICAgICBjcm9hayBleGVjdXRlcyBhIGxvbmdqbXAoKSwgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5IHJlY2xhaW0KICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoaXMgZXhlY3V0ZXMgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlIHdyYXBwZXIKICAgICAgICAgICAgZnVuY3Rpb24uCgogICAgICAgICAgICBUaGUgX3N3aWdtc2dbXSB2YXJpYWJsZSBpcyBub3JtYWxseSB1bnVzZWQsIGJ1dCBjYW4gYmUgdXNlZAogICAgICAgICAgICB0byBzdG9yZSBzbWFsbCBlcnJvciBtZXNzYWdlcyB1c2luZyBzcHJpbnRmIG9yIHNucHJpbnRmLiBJdAogICAgICAgICAgICBoYXMgYSBjYXBhY2l0eSBvZiBhdCBsZWFzdCAyNTYgYnl0ZXMgKFNXSUdfTUFYX0VSUk1TRykuCiAgICAgICAgICAgIAowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIGJldHRlciBzdXBwb3J0IGZvciBleGNlcHRpb25zLiAgSW5zdGVhZCBvZiByZXR1cm5pbmcgVENMX0VSUk9SLAogICAgICAgICAgICB1c2UgdGhlIG1hY3JvIFNXSUdfZmFpbCB0byByZXR1cm4gd2l0aCBhbiBlcnJvci4gIFRoaXMgZW5zdXJlcyB0aGF0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgY2xlYW5lZCB1cC4gIEV4Y2VwdGlvbiBzcGVjaWZpZXJzIGFyZSBub3cKICAgICAgICAgICAgaGFuZGxlZCBieSBkZWZhdWx0LgoKMDkvMDIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFRoZSB0eXBlLWNoZWNraW5nIHN5c3RlbSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGhhcyBoYWQgYSBmbGF3CgkgICAgaW4gdGhhdCBzb21lIHR5cGVzIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKCSAgICB3ZXJlbid0LiBUaGlzIGJ1ZyB3YXMgYmVzdCBkZW1vbnN0cmF0ZWQgYnkgdGhlIGluaGVyaXRfbWlzc2luZy5pCgkgICAgdGVzdCBzdWl0ZSBjYXNlLCB3aGljaCBkZWZpbmVzIGEgYmFzZSBjbGFzcyAiRm9vIiB0aGF0IGlzCgkgICAgc3ViY2xhc3NlZCBieSAiQmFyIi4gVGhlICJGb28iIGNsYXNzIGlzbid0IGFjdHVhbGx5IHdyYXBwZWQgKGkuZS4KCSAgICBpdCdzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gUnVieSkgYnV0IHdlJ2Qgc3RpbGwgbGlrZSB0byBiZQoJICAgIGFibGUgdG8gcGFzcyAiQmFyIiBpbnN0YW5jZXMgdG8gZnVuY3Rpb25zIGV4cGVjdGluZyBGb29zIGFuZCBoYXZlCgkgICAgdGhhdCB3b3JrOyBpdCB3YXNuJ3QuIFRoZSByZXZpc2VkIGltcGxlbWVudGF0aW9uIChzaW1pbGFyIHRvIHRoYXQKCSAgICB1c2VkIGZvciBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMpIGFkZHMgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKCSAgICAoX19zd2lndHlwZV9fKSB0byBlYWNoIG9iamVjdCB0aGF0IGluZGljYXRlcyBpdHMgU1dJRyB0eXBlOwoJICAgIHRoYXQgaXMsIGVhY2ggIkJhciIgaW5zdGFuY2Ugd2lsbCBub3cgaGF2ZSBhIHN0cmluZyBpbnN0YW5jZQoJICAgIHZhcmlhYmxlIGNhbGxlZCAiX19zd2lndHlwZV9fIiB3aG9zZSB2YWx1ZSBpcyAiX3BfQmFyIi4KCiAgICAgICAgICAgIFVubGVzcyBkZXZlbG9wZXJzIHdlcmUgdGFraW5nIGFkdmFudGFnZSBvZiB0aGlzIGxvdy1sZXZlbAoJICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCwgdGhleSBzaG91bGRuJ3Qgbm90aWNlIGFueSBjb21wYXRpYmlsaXR5CgkgICAgcHJvYmxlbXM7IG5ldmVydGhlbGVzcywgSSdtIG1hcmtpbmcgaXQgYXMgYSAicG90ZW50aWFsCgkgICAgaW5jb21wYXRpYmlsaXR5Ii4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMDEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNGIEJ1ZyAjNjAzMTk5LgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBPVVRQVVQsIElOUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciBDKysgCiAgICAgICAgICAgIHJlZmVyZW5jZXMuCgowOC8yNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXhlZCBlcnJvciBpbiAibGliX3N0ZF92ZWN0b3IiIHRlc3RjYXNlIGFuZAoJICAgIGNvbXBpbGVyIHdhcm5pbmcgaW4gImxpYl9jZGF0YSIgdGVzdGNhc2UuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICIlbWl4aW4iIGRpcmVjdGl2ZSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCgkgICAgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0byBtaXgtaW4gdG8gYQoJICAgIGNsYXNzLiBTbywgZm9yIGV4YW1wbGUsIGlmIHlvdSdkIGxpa2UgdG8gc3BlY2lmeSB0aGF0IFJ1YnkncwoJICAgIEVudW1lcmFibGUgbW9kdWxlIHNob3VsZCBiZSBtaXhlZC1pbiB0byB5b3VyIGNsYXNzIEZvbywgeW91J2QKCSAgICB3cml0ZToKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRW51bWVyYWJsZSI7CgkJCiAgICAgICAgICAgIG9yIHRvIHNwZWNpZnkgdGhhdCB0aGUgbW9kdWxlcyBGZWUsIEZpZSBhbmQgRm8gc2hvdWxkIGJlIG1peGVkCgkgICAgaW4gdG8gRm9vOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJGZWUsRmllLEZvIjsKCQkKCSAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlICVhbGlhcyBkaXJlY3RpdmUgc28gdGhhdCBtdWx0aXBsZSBhbGlhc2VzCgkgICAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kIGJ5IHVzaW5nIGEgY29tbWEtc2VwYXJhdGVkCgkgICAgbGlzdCBvZiBhbGlhc2VzLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkICJ0aHJvdyIgdHlwZW1hcHMgZm9yIHRoZSBSdWJ5IG1vZHVsZS4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgcHJpbnRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAnc3dpZyAtTScgbGlzdHMgYWxsIGZpbGUgZGVwZW5kZW5jaWVzLiAgJ3N3aWcgLU1NJyBsaXN0cwogICAgICAgICAgICBkZXBlbmRlbmNpZXMsIGJ1dCBleGNsdWRlcyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiAKICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICUgc3dpZyAtTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9zd2lnLnN3ZyBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9weXRob24vcHl0aG9uLnN3ZyBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgICAgJSBzd2lnIC1NTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NzU5OSBdIHVuaW9uIGluIGNsYXNzOiBpbmNvcnJlY3Qgc2NvcGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjAwMTMyIF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIG5hbWVzcGFjZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoaWJ1a2F3YSBZb3NoaWtpLgogCjA4LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQXV0b21hdGljIEMrKyBleGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCBmb3IgYWxsIGxhbmd1YWdlIG1vZHVsZXMuICAgIFRoaXMgaXMKICAgICAgICAgICAgcHJldHR5IHNpbXBsZS4gIElmIHlvdSBoYXZlIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB3cmFwX0Jhcl9ibGFoKCkgewogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEtPmJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb28gJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJ0aHJvdyIgdHlwZW1hcCBjb2RlIGluc2VydGVkLiAkMSA9IF9lICovCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgVGhlICJ0aHJvdyIgdHlwZW1hcCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbiBlcnJvciBpbiB0aGUgdGFyZ2V0IAogICAgICAgICAgICBsYW5ndWFnZS4gIEl0IGNhbiBkbyBhbnl0aGluZy4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCgidGhyb3ciKSBGb28gewogICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiRm9vIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUbyBtYWtlIHRoaXMgd29yayBpbiBlYWNoIGxhbmd1YWdlIG1vZHVsZSwgc2ltcGx5IGRlZmluZSBhIGZldyBkZWZhdWx0CiAgICAgICAgICAgICJ0aHJvdyIgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgYW5kIGEKICAgICAgICAgICAgZmV3IGNvbW1vbiBleGNlcHRpb24gdHlwZXMuICAgVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4KCiAgICAgICAgICAgIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgY2FuIGJlIGRpc2FibGVkIHVzaW5nIC1ub2V4Y2VwdCBvcgogICAgICAgICAgICBzZXR0aW5nIHRoZSBOb0V4Y2VwdCBnbG9iYWwgdmFyaWFibGUgdG8gMS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBbIFB5dGhvbiBdCiAgICAgICAgICAgIEF1dG9tYXRpYyB0cmFuc2xhdGlvbiBvZiBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGludG8gZXJyb3IgaGFuZGxpbmcgY29kZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBGb28gaXMgd3JhcHBlZCBhcyBhIGNsYXNzaWMtc3R5bGUgY2xhc3MgKGNvbXBhdGlibGUKICAgICAgICAgICAgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcpLiAgRnVydGhlcm1vcmUsIHlvdSBjYW4gd3JpdGUgUHl0aG9uIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IEZvbyxlOiAgICAgIyBOb3RlIHVzZSBvZiBleGNlcHRpb24gY2xhc3MgaGVyZSEKICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBGb28gZXJyb3IKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZSBvYmplY3QgImUiIGluIHRoZSBleGNlcHRpb24gaGFuZGxlciBpcyBqdXN0IGEgd3JhcHBlZCBGb28KICAgICAgICAgICAgb2JqZWN0LiAgQWNjZXNzIGl0IGxpa2UgYSBub3JtYWwgb2JqZWN0LgoKICAgICAgICAgICAgSWYgYW4gZXhjZXB0aW9uIGlzIG5vdCB3cmFwcGVkIGFzIGEgY2xhc3MsIGEgUnVudGltZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBleGNlcHRpb24gaXMKICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBvYmplY3QuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhpbnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLGU6CiAgICAgICAgICAgICAgICAgICBwcmludCBlLmFyZ3NbMF0gICAgICAgIyBJbnRlZ2VyIGV4Y2VwdGlvbiB2YWx1ZQoKICAgICAgICAgICAgQ29tbWVudHM6CgogICAgICAgICAgICAgICAgLSAgSWYgYSBjbGFzcyBpcyB1c2VkIGFzIGFuIGV4Y2VwdGlvbiwgaXQgKm11c3QqIGJlIHdyYXBwZWQKICAgICAgICAgICAgICAgICAgIGFzIGEgUHl0aG9uIGNsYXNzaWMtc3R5bGUgY2xhc3MgKG5ldyBjbGFzc2VzIGRvbid0IHdvcmspLgoKICAgICAgICAgICAgICAgIC0gIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgaXMgY29tcGF0aWJsZSB3aXRoICVleGNlcHRpb24uCgogICAgICAgICAgICAgICAgLSAgVXNlIC1ub2V4Y2VwdCB0byB0dXJuIG9mZiB0aGlzIGZlYXR1cmUuCgogICAgICAgICAgICAgICAgLSAgVGhlIG5ld2x5IGludHJvZHVjZWQgInRocm93IiB0eXBlbWFwIGlzIHVzZWQgdG8gcmFpc2UKICAgICAgICAgICAgICAgICAgIFB5dGhvbiBlcnJvcnMgKG5hdHVyYWxseSkuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbmZvcm1hdGlvbiBmcm9tIHRocm93KCkgc3BlY2lmaWVycyBpcyBub3cgc3RvcmVkIGluIHRoZSBwYXJzZQogICAgICAgICAgICB0cmVlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB0aHJvdyhzcGFtLGJhcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgc3RvcmVkIGluZm9ybWF0aW9uIGlzIGZ1bGx5IGNvcnJlY3RlZCBmb3IgbmFtZXNwYWNlcyBhbmQgd29ya3MKICAgICAgICAgICAgd2l0aCB0ZW1wbGF0ZXMuICBVc2VzIHdpbGwgZm9sbG93LgogICAgICAgICAgICAKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBubyBsb25nZXIgYXBwbGllZCB0byBtZW1iZXIgYWNjZXNzCiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGluIHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2god2hhdGV2ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm90IGFwcGxpZWQgdG8gYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICAgIGZvciBGb286OnguICAgVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZXh0cmEgY29kZQogICAgICAgICAgICBnZW5lcmF0ZWQuCgogICAgICAgICAgICBDYXZlYXQ6ICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSAqaXMqIHVzZWQgd2hlbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgICAgICBhY2Nlc3NlZCB0aHJvdWdoIGEgc21hcnQtcG9pbnRlciBvciBhIHN5bnRoZXNpemVkIGF0dHJpYnV0ZWQKICAgICAgICAgICAgYWRkZWQgd2l0aCAlZXh0ZW5kIGlzIHVzZWQuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgbW9yZSBwYXRjaGVzIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgU1dJRyAKICAgICAgICAgICAgYXMgYSA2NC1iaXQgZXhlY3V0YWJsZS4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjb25zdCByZWZlcmVuY2UgbWVtYmVycywgdmFyaWFibGVzLCBhbmQgc3RhdGljIG1lbWJlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgJnJlZjsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSAic2V0IiBmdW5jdGlvbnMgd2hpY2ggd291bGRuJ3QgY29tcGlsZS4gCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IgIkNsYXNzIFggbWlnaHQgYWJzdHJhY3QiIG9mZiBieSBkZWZhdWx0LgogICAgICAgICAgICBFbmFibGUgd2l0aCAtV2FsbC4KCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCBoYW5kbGluZyBvZiBjb25zdCBhbmQgbm9uLWNvbnN0IG92ZXJsb2FkZWQgbWV0aG9kcy4gIElmCiAgICAgICAgICAgIGEgY2xhc3MgZGVmaW5lcyBhIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpIGNvbnN0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlbiB0aGUgbm9uLWNvbnN0IG1ldGhvZCBpcyAqYWx3YXlzKiBzZWxlY3RlZCBpbiBvdmVybG9hZGluZyBhbmQKICAgICAgICAgICAgdGhlIGNvbnN0IG1ldGhvZCBzaWxlbnRseSBkaXNjYXJkZWQuICBJZiBydW5uaW5nIHdpdGggLVdhbGwsIGEgd2FybmluZwogICAgICAgICAgICBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKMDgvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCBpbmhlcml0YW5jZS4gICBDb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmxhaChkb3VibGUgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb0JhciA6IHB1YmxpYyBGb28sIHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmxhaChjaGFyICp4KTsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEJhcjo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgU1dJRyB3cmFwcyBGb29CYXI6OmJsYWggYXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QgdGhhdCB1c2VzIGFsbAogICAgICAgICAgICBhY2Nlc3NpYmxlIHZlcnNpb25zIG9mIGJsYWgoKS4gIFNlZSBzZWN0aW9uIDE1LjIuMiBpbiBTdHJvdXN0cnVwLCAzcmQgRWQuCgogICAgICAgICAgICBTV0lHIGFsc28gc3VwcG9ydHMgYWNjZXNzIGNoYW5nZSB0aHJvdWdoIHVzaW5nIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286Ong7CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgQ2F2ZWF0OiAgIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2hlY2sgdG8gc2VlIGlmIGRlY2xhcmF0aW9ucyBpbXBvcnRlZAogICAgICAgICAgICB2aWEgJ3VzaW5nJyBhcmUgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gIElmIHRoaXMgb2NjdXJzLCB0aGUKICAgICAgICAgICAgd3JhcHBlciBjb2RlIHdvbid0IGNvbXBpbGUgYW55d2F5cy0tLW5vdCBzdXJlIGl0J3Mgd29ydGggd29ycnlpbmcgYWJvdXQuCiAgICAgICAgICAKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBvdmVybG9hZGluZyBkaXNwYXRjaCB0byBub3QgaW5jbHVkZSBub2RlcyB3aXRoIGFuICJlcnJvciIgYXR0cmlidXRlLgogICAgICAgICAgICBBIGxhbmd1YWdlIG1vZHVsZSBjYW4gc2V0IHRoaXMgaWYgYSBub2RlIGNvdWxkbid0IGJlIHdyYXBwZWQgYW5kIHlvdSBkb24ndCB3YW50CiAgICAgICAgICAgIGl0IGluY2x1ZGVkIGluIHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4KCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBkaXNwYXRjaC4gICBUaGUgZGlzcGF0Y2hlciBpcyBub3cgYXdhcmUgb2YKICAgICAgICAgICAgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICBjbGFzcyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oRm9vICpmKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGlzcGF0Y2hlciByZS1vcmRlcnMgdGhlIGZ1bmN0aW9ucyBzbyB0aGF0IHNwYW0oQmFyICpiKSBpcwogICAgICAgICAgICBjaGVja2VkIGZpcnN0LS0taXQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHNwYW0oRm9vICpmKS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLVdlcnJvciBjb21tYW5kIGxpbmUgb3B0aW9uLiAgIElmIHN1cHBsaWVkLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIGVycm9ycyBhbmQgU1dJRyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTYxMzUgXSBUeXBlZGVmIG9mIHJlZmVyZW5jZSBjYW4ndCBjb21waWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICZJbnRSZWY7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oSW50UmVmIGkpOwoKICAgICAgICAgICAgU1dJRy0xLjMuMTQgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLgoKVmVyc2lvbiAxLjMuMTQgKEF1Z3VzdCAxMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFN0YXRpYyBjb25zdCBtZW1iZXJzIGluaXRpYWxpemVkIGR1cmluZyBkZWNsYXJhdGlvbiwgYW5kCgkgICAgb25seSB0aGVtLCBpZToKCgkgICAgc3RydWN0IEEKCSAgICB7CQkgCgkJc3RhdGljIGNvbnN0IGludCBhID0gMSA7ICAvLyB0aGlzIG9uZQoJCXN0YXRpYyBjb25zdCBpbnQgYjsgICAgICAgLy8gbm90IHRoaXMgb25lCiAgICAgICAgICAgIH07ICAgICAKCgkgICAgYXJlIGVtaXR0ZWQgbGlrZSBjb25zdGFudHMgKGVxdWl2YWxlbnQgdG8gZW51bXMgb3IKCSAgICBleHBsaWNpdCAlY29uc3RhbnQpLgoJICAgIAoJICAgIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byAnY3ZhcicKCSAgICBzaW5jZSB0aGV5IGxhY2sgdGhlIG5lZWRlZCByZWZlcmVuY2UgKHdlbGwsIHlvdSBjYW4gZm9yY2UKCSAgICB0aGVtIHRvIGhhdmUgYSByZWFsIHJlZmVyZW5jZSwgYnV0IGluIGFuIHVnbHkgd2F5IHdoaWNoCgkgICAgZ29lcyBjb21wbGV0ZWx5IGFnYWluIHRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIGluaXRpYWxpemUKCSAgICB0aGVtIGR1cmluZyBkZWNsYXJhdGlvbiwgeW91IGFsc28gaGF2ZSB0byBkZWFsIHdpdGggZXh0cmEKCSAgICBsaW5raW5nIG1hdHRlcnMsIGFuZCBpdCB0YWtlIGEgd2hpbGUgdG8gZmlndXJlIG91dCB3aGF0IGlzCgkgICAgdGhlIHByb2JsZW0gYW5kIGhvdyB0byBzb2x2ZSBpdCkuCgkgICAgCgkgICAgUGxlYXNlIHRlc3QgaXQgd2l0aCB5b3VyIHByZWZlcnJlZCB0YXJnZXQgbGFuZ3VhZ2UsIGFuZAoJICAgIG5vdCBvbmx5IHRoZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByZWFsbHkgcnVuIHRoZSBleGFtcGxlCgkgICAgaW4gdGhlIHRlc3Qtc3VpdGUgKHN0YXRpYy1jb25zdC1tZW1iZXItMi5pKSBiZWNhdXNlIHRoZQoJICAgIHByb2JsZW0gYW5kIHRoZSBzb2x1dGlvbiBjYW5ub3QgYmUgImZ1bGx5IiBhcHByZWNpYXRlZAoJICAgIHVudGlsIHlvdSB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBydW4gaXQuCgoJICAgIEluIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyAocHl0aG9uIHNwZWNpYWxseSksIHRoaXMgY2FuCgkgICAgcHJvZHVjZXMgYSBkaWZmZXJlbmNlIGluIHRoZSB3YXkgdGhhdCB0aGUgc3RhdGljIGNvbnN0YW50CgkgICAgbWVtYmVycyAnYScgYW5kICdiJyBhcmUgaW50ZXJuYWxseSB3cmFwcGVkLiBIb3BlZnVsbHksCgkgICAgdGhleSBzdGlsbCBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5LgoKCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIE5vdyBzdGF0aWMgY29uc3QgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgaW4gYSBtb3JlCgkgICAgbmF0dXJhbCB3YXksIGllLCBpZiB5b3UgaGF2ZQoKCSAgICBzdHJ1Y3QgQQogICAgICAgICAgICAgewkJIAoJCXR5cGVkZWYgdW5zaWduZWQgaW50IHZpZXdmbGFnczsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGZvcndhcmRfZmllbGQgPSAwOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgYmFja3dhcmRfZmllbGQ7CiAgICAgICAgICAgIH07ICAgICAKCSAgICAKCSAgICBub3cgeW91IGNhbiBkbzoKCgkJcHJpbnQgQS5iYWNrd2FyZF9maWVsZAoKCSAgICBhbmQgYWxzbwoKCSAgICAgICAgYSA9IEEoKQoJCXByaW50IGEuZm9yd2FyZF9maWVsZAoJCQoJICAgIE5vdGUgdGhhdCBpZiB0aGUgc3RhdGljIGNvbnN0IG1lbWJlcnMgZG9uJ3QgaGF2ZSBhbgoJICAgIGluaXRpYWxpemVyIChsaWtlIGJhY2t3YXJkX2ZpZWxkKSwgc3RpbGwgeW91IGNhbiBhY2Nlc3MKCSAgICB0aGVtIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgcHl0aG9uIHNpZGUsIGJ1dCB0aGUKCSAgICBpbXBsZW1lbnRhdGlvbiBpcyBhIHF1aXRlIGRpZmZlcmVudDogYmFja3dhcmRfZmllbGQgd2lsbAoJICAgIHN0aWxsIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHksIGFuZCBhbHNvLCB5b3UgYXJlIAoJICAgIHJlc3BvbnNpYmxlIHRvIGluaXRpYWxpemUgaXQgaW4gc29tZSBjb2RlIHVuaXQsIGFuZCBsaW5rIGl0CgkgICAgcHJvcGVybHkuIGZvcndhcmRfZmllbGQsIGJ5IHRoZSBvdGhlciBoYW5kLCB3aWxsIG5vdAoJICAgIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHkgYnV0IG9ubHkgYXMgYSBBIG1lbWJlciwgc2ltaWxhcgoJICAgIHRvIHdoYXQgaGFwcGVuIHdpdGggZW51bSBvciAlY29uc3RhbnQgbWVtYmVycy4KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIENvbW1vbiBjb2RlIGluIHRoZSBfX3NldGF0dHJfXy9fX2dldGF0dHJfXyBub3cKCSAgICBnb2VzIHRvIHR3byAiZnJlZSIgbWV0aG9kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm94eQoJICAgIGZpbGUsIGZyb20gd2hlcmUgZWFjaCBjbGFzcyB1c2UgaXQuIFRoaXMgY2hhbmdlIHJlZHVjZXMKCSAgICB0aGUgc2l6ZSBvZiB0aGUgcHJveHkgZmlsZSwgc3BlY2lhbGx5IGlmIHlvdSB3cmFwIGEgbG90IG9mCgkgICAgc21hbGwgY2xhc3NlcyBpbiBvbmUgbW9kdWxlICh1cCB0byAzMyUgaW4gc29tZSBjYXNlcyksCgkgICAgbWFraW5nIGl0IGZhc3RlciB0byBsb2FkIHRvby4KCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjaGFyICogcmV0dXJucyBOVUxMLAogICAgICAgICAgICB1bmRlZiBpcyByZXR1cm5lZCB0byB0aGUgUGVybCBpbnRlcnByZXRlci4KIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbmQgbmFtZXNwYWNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyooKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhlIHdyYXBwZXIgY29kZSwgU1dJRyB3YXMgdXNpbmcgLT5vcGVyYXRvciBGb28qKCkKICAgICAgICAgICAgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIC0+b3BlcmF0b3IgbnM6OkZvbyooKS4KCiAgICAgICAgICAgIE5vdGU6IGlmIHVzaW5nICVyZW5hbWUgd2l0aCBhIGNvbnZlcnNpb24gb3BlcmF0b3IsIHlvdQogICAgICAgICAgICBtaWdodCBoYXZlIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlcmVuYW1lKHRvRm9vUHRyKSBuczo6b3BlcmF0b3IgbnM6OkZvbyooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIF5eXl4gbm90ZSBleHRyYSBxdWFsaWZpZXIKICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIE1pbm9yIGVuaGFuY2VtZW50IHRvICdjb25zdCcgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICAgTm9ybWFsbHkgY29uc3QgZGVjbGFyYXRpb25zIGFyZSB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMKICAgICAgICAgICAgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggdGhlIGN2YXIgYXR0cmlidXRlIChzZWUgU1dJRy5odG1sIGZvcgogICAgICAgICAgICBhIGRpc2N1c3Npb24gb2Ygd2h5KS4gIEhvd2V2ZXIsIGluIG1hbnkgcHJvZ3JhbXMsICJjb25zdCIgCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBtYXkganVzdCBiZSBjb25zdGFudHMtLS1tYWtpbmcgdGhlIGN2YXIuIGFjY2VzcwogICAgICAgICAgICBhd2t3YXJkLiAgVG8gZml4IHRoaXMsICJjb25zdCIgZGVjbGFyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlCiAgICAgICAgICAgIGJvdGggdGhyb3VnaCBjdmFyLiBhbmQgYXMgYSBzaW1wbGUgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgRk9PID0gNDI7CgogICAgICAgICAgICBJbiBQeXRob246CgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLmN2YXIuRk9PCiAgICAgICAgICAgICAgICAgNDIKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5GT08KICAgICAgICAgICAgICAgICA0MgoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSB2YWx1ZSBvZiBhICJjb25zdCIgdmFyaWFibGUKICAgICAgICAgICAgbWlnaHQgY2hhbmdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0IEJBUiA9ICJIZWxsbyBXb3JsZCI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBwb2ludGVyIGl0c2VsZiBjYW4gbm90IGNoYW5nZSwgYnV0IHRoZSAKICAgICAgICAgICAgZGF0YSBiZWluZyBwb2ludGVkIHRvIGNvdWxkIGJlIG1vZGlmaWVkLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywKICAgICAgICAgICAgY3Zhci5CQVIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRvIG9idGFpbmVkIHRoZSBjdXJyZW50IHZhbHVlLgoKMDgvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBnZW5lcmF0aW9uIG9mIHRoZSBwcm94eSBjb2RlICgucHkgZmlsZXMpIHRvIG1vcmUKICAgICAgICAgICAgY2xvc2VseSBmb2xsb3cgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9ucyBhcyB0aGV5IGFwcGVhciBpbgogICAgICAgICAgICB0aGUgLmkgZmlsZS4gICBJbiB0aGUgcGFzdCwgYWxsIG9mIHRoZSBjbGFzcyB3cmFwcGVycyBhcHBlYXJlZAogICAgICAgICAgICBmaXJzdCwgZm9sbG93ZWQgYnkgZnVuY3Rpb24gc3R1YnMsIGluc2VydGVkIFB5dGhvbiBjb2RlLCBhbmQKICAgICAgICAgICAgb3RoZXIgZGV0YWlscy4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkgbWV0aG9kIF9kZWxldGUoKSBjaGFuZ2VkIHRvIGRlbGV0ZSgpLiBUaGVyZSBzaG91bGRuJ3QgZXZlcgogICAgICAgICAgICBiZSBhIHdyYXBwZWQgZnVuY3Rpb24gY2FsbGVkIGRlbGV0ZSgpIGFzIGl0IGlzIGEgQysrIGtleXdvcmQgYW5kIHRoZXJlCiAgICAgICAgICAgIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBtZW1iZXIgZnVuY3Rpb24gaW4gQy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhlIGZ1bmN0aW9uIGJhY2sgaW4KICAgICAgICAgICAgZm9yIGFsbCBwcm94eSBjbGFzc2VzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgSmF2YSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdW1tYXJ5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiBpbXByb3ZpbmcgdGhlIEphdmEgbW9kdWxlIAogICAgICAgICAgICBmb3IgdmVyIDEuMy4xNC4gIElmIGF0IGFsbCBwb3NzaWJsZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHRha2UgYWR2YW50YWdlcyBvZiB0aGUgCiAgICAgICAgICAgIGltcHJvdmVtZW50cy4gSWYgeW91IHdlcmUgdXNpbmcgcHJveHkgY2xhc3NlcyB5b3UgbWF5IG5vdCBub3RpY2UgYW55IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGljaCB3aWxsIGhlbHAgd2l0aCBtb3N0IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBjb2RlIHRoYXQgdXNlcwogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIG91dHB1dDoKCiAgICAgICAgICAgIFJlcGxhY2U6CiAgICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIFdpdGg6CiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im1vZHVsZW5hbWUiKSBtb2R1bGVuYW1lOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzPSJwdWJsaWMiOwoKICAgICAgICAgICAgVGhlIHByb3h5IGNvbnN0cnVjdG9ycyB0aGF0IHRvb2sgcGFyYW1ldGVycyAobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pCiAgICAgICAgICAgIHdlcmUgcHVibGljIGFuZCBhcmUgbm93IHByb3RlY3RlZC4gSWYgeW91IHdlcmUgbWFraW5nIHVzZSBvZiB0aGVzZSB0aGVuIHlvdSdsbCAKICAgICAgICAgICAgaGF2ZSB0byBtb2RpZnkgeW91ciBjb2RlIGFuZCB0aGUgYmVzdCBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlIG5ldyB0eXBlIAogICAgICAgICAgICB3cmFwcGVyIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgb3RoZXIgbWFpbiBhcmVhcyBhcmUgdGhlIHByYWdtYXMgYW5kIGdsb2JhbCB2YXJpYWJsZSB3cmFwcGluZy4gUmVwbGFjZSAKICAgICAgICAgICAgdGhlIHByYWdtYXMgd2l0aCBvbmUgb2YgdGhlIG5ldyBkaXJlY3RpdmVzIG9yIHR5cGVtYXBzIG1lbnRpb25lZCBiZWxvdyBhbmQgdXNlCiAgICAgICAgICAgICVyZW5hbWUgb24gdGhlIHZhcmlhYmxlcy4KCiAgICAgICAgICAgIElmIHlvdSB3ZXJlIG5vdCB1c2luZyBwcm94eSBjbGFzc2VzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSBhIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBqdHlwZSB0eXBlbWFwLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHdyYXBwaW5nIHR3byBkaW1lbnNpb24gYXJyYXkgdmFyaWFibGVzLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbF0KICAgICAgICAgICAgT2JqZWN0IG1hbmFnZW1lbnQgbm93IGhhcyBhIG11Y2ggYmV0dGVyIHNlbnNlIG9mIG93bmVyc2hpcC4KICAgICAgICAgICAgT3duZXJzaGlwIGJpdHMgaXMgY2hhbmdlZCB3aGVuZXZlciBhbiBvYmplY3QgaXMgc3RvcmVkIGluIGEKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgICAgIEZvbyAqbmV4dDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgaW4gUHl0aG9uCgogICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24KICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICA+Pj4gZyA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBnLm5leHQgPSBmICAgICAgICAgICMgQXNzaWduIGEgcG9pbnRlcgogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duICAgICAgICAgICAjIE5vdGljZSBvd25lcnNoaXAgY2hhbmdlCiAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICBUaGlzIHNjaGVtZSBpcyBtb3N0bHkgYSBjb25zZXJ2YXRpdmUgaGV1cmlzdGljIGRlc2lnbmVkIHRvIAogICAgICAgICAgICBwcm92aWRlIHNlZ21lbnRhdGlvbiBmYXVsdHMuICBJdCBjb3VsZCBjYXVzZSBhIG1lbW9yeSBsZWFrCiAgICAgICAgICAgIGlmIG93bmVyc2hpcCBpcyBjaGFuZ2VkIHVubmVjZXNzYXJpbHkuICBJbiB0aGlzIGNhc2UsIHlvdSBjYW4KICAgICAgICAgICAgZWl0aGVyIHdyaXRlIGEgdHlwZW1hcCAodGhhdCBkb2Vzbid0IGNoYW5nZSBvd25lcnNoaXApLCBvcgogICAgICAgICAgICBtYW51YWxseSBzZXQgdGhlIHRoaXNvd24gYXR0cmlidXRlIGJhY2sgdG8gMS4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gTWFqb3IgdXNhYmlsaXR5IGltcHJvdmVtZW50cyB0byB0aGUgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgICAgU3VwcG9zZSB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgCiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHZvaWQgIGJsYWgoRm9vICpmKTsKCiAgICAgICAgICAgIEluIHBhc3QgdmVyc2lvbnMgb2YgU1dJRywgeW91IGNvdWxkIGNyZWF0ZSBvYmplY3RzIGFuZCB1c2UKICAgICAgICAgICAgdGhlbSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJSBGb28gZgogICAgICAgICAgICAgICAgJSBmIGNvbmZpZ3VyZSAteCAzCiAgICAgICAgICAgICAgICAlIGYgc3BhbQogICAgICAgICAgICAgICAgMzcKICAgIAogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIGlzIHRoYXQgaWYgeW91IHRyaWVkIHRvIGNhbGwgYmxhaCgpLCBpdCBkaWRuJ3QKICAgICAgICAgICAgd29yazoKCiAgICAgICAgICAgICAgICAlIGJsYWggZgogICAgICAgICAgICAgICAgVHlwZSBFcnJvci4gRXhwZWN0ZWQgX3BfRm9vCiAgICAgICAgICAgICAgICAlCgogICAgICAgICAgICBJbnN0ZWFkLCB5b3UgaGFkIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJSBibGFoIFtmIGNnZXQgLXRoaXNdCiAgCiAgICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZXh0cmFjdHMgdGhlIC10aGlzIHBvaW50ZXIsIGF2b2lkaW5nIHRoaXMKICAgICAgICAgICAgcHJvYmxlbS4gIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcgImJsYWggZiIgaXMgcGVyZmVjdGx5IGxlZ2FsIGFuZAogICAgICAgICAgICBldmVyeXRoaW5nIHdpbGwgc3RpbGwgd29yayBub3JtYWxseS4KCiAgICAgICAgICAgIENhdmVhdDogU2luY2UgcG9pbnRlciBzdHJpbmdzIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUgKF8pLAogICAgICAgICAgICBkb24ndCB1c2UgdGhpcyBpbiBvYmplY3QgbmFtZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlIEZvbyBfZiAKICAgICAgICAgICAgICAgICUgYmxhaCBfZiAgICAgICAgIyBQb3RlbnRpYWwgY3Jhc2gKCiAgICAgICAgICAgIE9iamVjdHMgbm93IGhhdmUgYSAtdGhpc293biBhdHRyaWJ1dGUgdGhhdCBzaG93cyB0aGUgb3duZXJzaGlwLgogICAgICAgICAgICBUaGlzIGJ1aWxkcyB1cG9uIHRoZSBDSEFOR0VTIDExLzI0LzIwMDEgZW50cnkuCgowOC8wNy8yMDAyOiBzYW1qYW0sIFNhbSBMaWRkaWNvdHQKICAgICAgICAgICAgUHJvcGVybHkgaW1wbGVtZW50ZWQgcG9pbnRlciBzeXN0ZW0gdXNpbmcgcGhwIHJlc291cmNlcy4KICAgICAgICAgICAgU3RpbGwgbmVlZCB0byB3b3JrIG91dCB3aGV0aGVyIG9yIG5vdCB0byBsZXQgc2NyaXB0LXVzZXJzIGNhbGwKICAgICAgICAgICAgZGVzdHJ1Y3RvcnMgZGlyZWN0bHkKCjA4LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXBncmFkZWQgbXpzY2hlbWUgbW9kdWxlIHRvIHN1cHBvcnQgdmVyc2lvbiAyMDEgYW5kIGFkZGVkCiAgICAgICAgICAgIG92ZXJsb2FkaW5nIHN1cHBvcnQuCgowOC8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgZXh0cmEgZ3JvdXBpbmcgKGluIHZlcnkgbGltaXRlZCBjYXNlcykuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAoRnVuY1B0cikoaW50LCBkb3VibGUpOwoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCAqKioKICAgICAgICAgICAgCjA4LzAzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVzIHRvIHR5cGVtYXBzLmkgYXMgdGhvc2UgZG9uZSBwcmV2aW91c2x5IGZvciBQZXJsLAogICAgICAgICAgICBQeXRob24gYW5kIFRjbCBtb2R1bGVzLiBOb3cgc3VwcG9ydHMgcmVmZXJlbmNlIHR5cGVzIHdpdGggSU5QVVQsCiAgICAgICAgICAgIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMuCgowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgY3N0cmluZy5pIGFkZGVkLiAgUHJvdmlkZXMgbWFjcm9zIGZvcgogICAgICAgICAgICBtYW5pcHVsYXRpbmcgY2hhciAqIGRhdGEuCiAKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gIFVzZSAlbmV3b2JqZWN0IGluc3RlYWQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVuZXdvYmplY3QgZm9vOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgY2hhciAqZm9vKCk7CgogICAgICAgICAgICAlbmV3b2JqZWN0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsCiAgICAgICAgICAgIGV0Yy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgYXR0cmlidXRlICdqbmljbGFzc25hbWUnIGZvciB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBhbGxvd3MgYSB3YXkgb2YKICAgICAgICAgICAgY2hhbmdpbmcgdGhlIEpOSSBjbGFzcyBuYW1lIGZyb20gdGhlIGRlZmF1bHQgd2hpY2ggdXNlcyB0aGUgbW9kdWxlbmFtZSB3aXRoIEpOSQogICAgICAgICAgICBhcHBlbmRlZCBhZnRlciBpdC4KCiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im5hbWUiKSBtb2R1bGVuYW1lCgogICAgICAgICAgICBJZiAnbmFtZScgaXMgdGhlIHNhbWUgYXMgJ21vZHVsZW5hbWUnIHRoZW4gdGhlIG1vZHVsZSBjbGFzcyBuYW1lIGdldHMgY2hhbmdlZAogICAgICAgICAgICBmcm9tICdtb2R1bGVuYW1lJyB0byBtb2R1bGVuYW1lTW9kdWxlLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmlsZSBpbmNsdWRlIG9yZGVyLiAgTGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZGlyZWN0b3JpZXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGdlbmVyaWMgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOiAgInN3aWdfbGliL3B5dGhvbi9mb28uaSIgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgInN3aWdfbGliL2Zvby5pIi4gICAgSSB0aG91Z2h0IHRoaXMgd2FzIHRoZSBjYXNlIGFscmVhZHksIGJ1dAogICAgICAgICAgICBhcHBhcmVudGx5IGl0IGhhcyBiZWVuIGJyb2tlbiBmb3IgcXVpdGUgc29tZSB0aW1lLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdGRfZGVxdWUuaSBsaWJyYXJ5IGZpbGUuICBXb3JrIGluIHByb2dyZXNzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbCxQZXJsXQogICAgICAgICAgICBJbXByb3ZlbWVudHMgdG8gdHlwZW1hcHMuaS4gIElOUFVUL0lOT1VUIHR5cGVtYXBzIHBlcmZvcm0gYmV0dGVyCiAgICAgICAgICAgIGVycm9yIGNoZWNraW5nLiAgVHlwZW1hcHMgYXJlIG5vdyBzdXBwbGllZCBmb3IgcmVmZXJlbmNlcyBsaWtlIAogICAgICAgICAgICBpbnQgJk9VVFBVVCwgZG91YmxlICZJTk9VVCwgZXRjLgogICAgICAgICAgCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRGVwcmVjYXRlZCB0aGUgVF8qIGFuZCBMXyogdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KICAgICAgICAgICAgTXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBhcmUgYWx3YXlzIHBsYWNlZCBpbiBhIHR1cGxlLiBEZXByZWNhdGVkCiAgICAgICAgICAgIHRoZSBCT1RIIHR5cGVtYXBzLiAgVGhpcyBpcyBub3cgSU5PVVQgKGUuZy4sIGludCAqSU5PVVQpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIGFycmF5LmksIGNhcnJheS5pLCBhbmQgdGltZXIuaSBsaWJyYXJ5IGZpbGVzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgVXNlIGNwb2ludGVyLmkgaW5zdGVhZC4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZvciBjb25zaXN0ZW5jeSB0aGUgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgdXNlIHRoZSBKYXZhQmVhbiAKICAgICAgICAgICAgcHJvcGVydHkgZGVzaWduIHBhdHRlcm4gbGlrZSBtZW1iZXIgdmFyaWFibGVzIGFsd2F5cyBoYXZlLiBUaGlzIG1lYW5zIGlmIHlvdSBhcmUgCiAgICAgICAgICAgIHdyYXBwaW5nIGEgdmFyaWFibGUgY2FsbGVkIGZvbywgdGhlIGdldHRlciBpcyBjYWxsZWQgZ2V0Rm9vKCkgYW5kIHRoZSBzZXR0ZXIgaXMgCiAgICAgICAgICAgIGNhbGxlZCBzZXRGb28oKS4gQmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlcyB0byB0aGUgSmF2YSBtb2R1bGUgdGhlIGdldHRlcnMgYW5kIAogICAgICAgICAgICBzZXR0ZXJzIHdlcmUgY2FsbGVkIGdldF9mb28oKSBhbmQgc2V0X2ZvbygpLiBJZiB5b3UgcmVhbGx5IHdhbnQgdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBmdW5jdGlvbiBuYW1lcyB1c2UgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGxpa2UgdGhpczogJXJlbmFtZShfZm9vKSBGb287CgowNy8zMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNhc3RpbmcgcHJvYmxlbSB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgICAgY2xhc3MgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXIgOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXogOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBzcGFtIDogcHVibGljIGJhciwgcHVibGljIGJheiB7fTsKCiAgICAgICAgICAgIHRoZW4gdGhlIHdyYXBwZXJzIHdvdWxkbid0IGNvbXBpbGUgZHVlIHRvIGFuIGFtYmlndW91cyBjYXN0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEdWUgdG8gbmV3IHN0YXRpYyB0eXBlY2hlY2tpbmcgYWxsIHBvaW50ZXJzIGhlbGQgaW4gYSBKYXZhIGxvbmcgYXJlIHBhcnQgb2YgCiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBhbmQgdGhpcyBwb2ludGVyIHZhbHVlIGluIHRoZSBKYXZhIGxvbmcgaGFzIGJlY29tZSBhYnN0cmFjdGVkCiAgICAgICAgICAgIGRhdGEuIFRoZSB0eXBlIHdyYXBwZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhcyBzdWNoIHByb3RlY3RlZC4KICAgICAgICAgICAgSWYgeW91IG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwb2ludGVycyBmcm9tIEphdmEgb3IgZm9yIGV4YW1wbGUgY3JlYXRlIGEgcHJveHkgCiAgICAgICAgICAgIGNsYXNzIG9yIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgYSBudWxsIHBvaW50ZXIsIGFkZCBhIGZ1bmN0aW9uL2NvbnN0cnVjdG9yIAogICAgICAgICAgICB0byBkbyBzbyB3aXRoIHRoZSAlamF2YWNvZGUgdHlwZW1hcC4gWW91IGNhbiBhbHNvIG1ha2UgZ2V0Q1B0cigpIHB1YmxpYyBhZ2FpbiB3aXRoCiAgICAgICAgICAgIHRoZSAlamF2YWdldGNwdHIgdHlwZW1hcC4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZXMgZm9yICV0eXBlbWFwKGlnbm9yZSkuIEluIHBhcnRpY3VsYXIgd2hlbiBpZ25vcmluZyB0aGUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgaW4gYSBmdW5jdGlvbi4gQWxzbyBmb3IgYWxsIHBhcmFtZXRlcnMgaW4gY29uc3RydWN0b3JzLiBUaGVzZSBtb2RzIGhhdmUgYWxzbyBmaXhlZAogICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyBmb3IgcHJveHkgY2xhc3NlcyAtIFNGIDU4MTc5MS4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJW5ld29iamVjdCAocmVwbGFjZW1lbnQgZm9yICVuZXcpIG5vdyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gCgowNy8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlbWFwIGNvcGllcywgJWFwcGx5LCBhbmQgJWNsZWFyIGluc2lkZQogICAgICAgICAgICBDKysgbmFtZXNwYWNlcy4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpOSSBjbGFzcyBub3cgaGFzIHBhY2thZ2UgYWNjZXNzIGFzIHRoZSBjbGFzcyBtb2RpZmllcgogICAgICAgICAgICBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gInB1YmxpYyIgdG8gbm90aGluZy4gVGhpcyBoYXMgYmVlbiBkb25lCiAgICAgICAgICAgIGFzIHRoaXMgY2xhc3MgaXMgbm93IG1vcmUgZm9yIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBTV0lHIHNpbmNlIHRoZSBtb2R1bGUKICAgICAgICAgICAgY2xhc3MgaGFzIHN0YXRpYyB0eXBlIGNoZWNraW5nIGZvciBhbGwgdHlwZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlICVqbmljbGFzc2NsYXNzbW9kaWZpZXIgCiAgICAgICAgICAgIHByYWdtYSB0byBjaGFuZ2UgaXQgYmFjayB0byAicHVibGljIi4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkvU2hhZG93IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGUgLXByb3h5IGFuZCAKICAgICAgICAgICAgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAKICAgICAgICAgICAgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRoZW4gdXNlIHRoZSBuZXcgLW5vcHJveHkgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZW1haW5pbmcgcHJhZ21hcyBzaGFrZXVwLiBUaGVzZSB3ZXJlIHRoZSByZW1haW5pbmcgcHJhZ21hcyBhbmQgdGhlaXIKICAgICAgICAgICAgbmV3IG5hbWVzIHdoZXJlIGNoYW5nZWQ6CgogICAgICAgICAgICBtb2R1bGViYXNlCiAgICAgICAgICAgIG1vZHVsZWNvZGUKICAgICAgICAgICAgbW9kdWxlY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgbW9kdWxlaW1wb3J0ID0+IG1vZHVsZWltcG9ydHMKICAgICAgICAgICAgbW9kdWxlaW50ZXJmYWNlID0+IG1vZHVsZWludGVyZmFjZXMKCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbXBvcnRzIHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IHRvIGhvdyB0aGUgbW9kdWxlaW1wb3J0IHByYWdtYSB3b3JrZWQuIAogICAgICAgICAgICBOb3cgaXQgYWN0dWFsbHkgdGFrZXMgY29kZSB3aGljaCBnZXRzIHBsYWNlZCBiZWZvcmUgdGhlIGNsYXNzIGRlZmluaXRpb24gc28gdGhlIAogICAgICAgICAgICB3aG9sZSBpbXBvcnQgc3RhdGVtZW50IGhhcyB0byBiZSBnaXZlbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWltcG9ydHM9JXsKICAgICAgICAgICAgaW1wb3J0IGphdmEuaW8uKjsKICAgICAgICAgICAgaW1wb3J0IGphdmEubWF0aC4qOwogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1vZHVsZWludGVyZmFjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvbGQgbW9kdWxlaW50ZXJmYWNlIGluIHRoYXQgaWYgCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGlzIHJlcXVpcmVkIHRoZXkgbXVzdCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gb25lIHVzZSBvZiAKICAgICAgICAgICAgdGhlIHByYWdtYSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWludGVyZmFjZXM9IlNlcmlhbGl6YWJsZSwgTXlJbnRlcmZhY2UiCgogICAgICAgICAgICBUaGVzZSBsYXN0IHR3byBwcmFnbWFzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGphdmFpbnRlcmZhY2VzIGFuZCBqYXZhaW1wb3J0cyAKICAgICAgICAgICAgdHlwZW1hcC4KCiAgICAgICAgICAgIEEgc2ltaWxhciBzZXQgb2YgcHJhZ21hcyBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBuYW1lbHk6CgogICAgICAgICAgICBqbmljbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnQKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2UKCiAgICAgICAgICAgIFRoZXNlIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIG1vZHVsZSBjb3VudGVycGFydHMuIE5vdGUgdGhhdCBwcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBtb2R1bGVYWFggcHJhZ21hcyB3b3JrZWQgb24gdGhlIG9sZCBtb2R1bGUgY2xhc3Mgd2hpY2ggaXMgbm93IGNhbGxlZCB0aGUKICAgICAgICAgICAgSk5JIGNsYXNzICh0aGUgY2xhc3Mgd2l0aCB0aGUgbmF0aXZlIGZ1bmN0aW9ucykuIFRoZSBqbmljbGFzc1hYWCBwcmFnbWFzIG5vdyAKICAgICAgICAgICAgd29yayBvbiB0aGUgbmV3IG1vZHVsZSBjbGFzcyAodGhlIGNsYXNzIHRoYXQgaGFzIGFsbCB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzLCBwbHVzIGFsbCBvdGhlcgogICAgICAgICAgICByZW1haW5pbmcgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGxvdy1sZXZlbCBwcm9jZWR1cmFsIGludGVyZmFjZSkuCgogICAgICAgICAgICBJbiBzdW1tYXJ5IHRoZSBjb250ZW50cyBvZiB0aGUgcHJhZ21hcyBtYWtlIHVwIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgPGpuaWNsYXNzaW1wb3J0cz4KICAgICAgICAgICAgPGpuaWNsYXNzbW9kaWZpZXJzPiBjbGFzcyBtb2R1bGVuYW1lIGV4dGVuZHMgPGpuaWNsYXNzYmFzZT4gaW1wbGVtZW50cyA8am5pY2xhc3NpbnRlcmZhY2VzPiB7CiAgICAgICAgICAgICAgICA8am5pY2xhc3Njb2RlPgogICAgICAgICAgICAgICAgLi4uIFNXSUcgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAuLi4KICAgICAgICAgICAgfQp9CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVwcmVjYXRlZCBtb2R1bGVtZXRob2Rtb2RpZmllcnMgcHJhZ21hIGFuZCByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBhIGJldHRlciAlZmVhdHVyZSBiYXNlZCBkaXJlY3RpdmUgY2FsbGVkICVqYXZhbWV0aG9kbW9kaWZpZXJzLgogICAgICAgICAgICBBIHVzZWZ1bCBleGFtcGxlIHdvdWxkIGJlIGZvciBzeW5jaHJvbmlzYXRpb24gaW4gbXVsdGktdGhyZWFkZWQgYXBwczoKCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGZvbyhpbnQgYSkgInB1YmxpYyBzeW5jaHJvbml6ZWQiOwoKICAgICAgICAgICAgQ2hhbmdlcyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGRlZmF1bHQgKCJwdWJsaWMiKSB0byAicHVibGljIHN5bmNocm9uaXplZCIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNldmVyYWwgZGlyZWN0aXZlcyBub3cgYWxsb3cgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBUaGVzZSBpbmNsdWRlOgoKICAgICAgICAgICAgICAgICVtb2R1bGUobmFtZT0idmFsdWUiLCBuYW1lPSJ2YWx1ZSIsIC4uLikgbW9kdWxlbmFtZQogICAgICAgICAgICAgICAgJWltcG9ydChuYW1lPSJ2YWx1ZSIsIC4uLikgImZpbGVuYW1lLmkiCiAgICAgICAgICAgICAgICAlZXh0ZW5kKG5hbWU9InZhbHVlIiwgLi4uKSBjbGFzc25hbWUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVzZSBjdXJyZW50bHkgaGF2ZSBubyBlZmZlY3QgYW5kIGFyZSByZXNlcnZlZCBmb3IKICAgICAgICAgICAgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgICAgCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnRzIHRvIHNtYXJ0LXBvaW50ZXIgaGFuZGxpbmcuICBTV0lHIG9ubHkgcHJvdmlkZXMKICAgICAgICAgICAgZXh0cmEgc3VwcG9ydCBmb3IgYSBzbWFydC1wb2ludGVyIGlmIG9wZXJhdG9yLT4oKSByZXR1cm5zCiAgICAgICAgICAgIGEgcHJvcGVyIHBvaW50ZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CgogICAgICAgICAgICBJZiBvcGVyYXRvci0+KCkgcmV0dXJucyBhbiBvYmplY3QgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLAogICAgICAgICAgICB0aGVuIFNXSUcgZXhhbWluZXMgdGhlIHJldHVybmVkIG9iamVjdCB0byBzZWUgaWYgaXQgYWxzbwogICAgICAgICAgICBpbXBsZW1lbnRzIG9wZXJhdG9yLT4oKS4gIElmIHNvLCBTV0lHIGNoYXNlcyBvcGVyYXRvci0+KCkKICAgICAgICAgICAgdW50aWwgaXQgY2FuIGZpbmQgb25lIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cwogICAgICAgICAgICBjYXNlcyBsaWtlIHRoaXMgdG8gd29yazoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEJhciBvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpICAgICAgIyBJbnZva2VzIEZvbzo6YmxhaCgpCgogICAgICAgICAgICBUaGUgcy5ibGFoKCkgY2FsbCBhY3R1YWxseSBpbnZva2VzOgoKICAgICAgICAgICAgICAgICAgKChzLm9wZXJhdG9yLT4oKSkub3BlcmF0b3ItPigpKS0+YmxhaCgpOwogCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB0eXBlZGVmIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vICYgRm9vUmVmOwogICAgICAgICAgICAgICAgIEZvb1JlZiBibGFoKCk7CgogICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QKICAgICAgICAgICAgY29tcGlsZS4KCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgV3JhcHBpbmcgb2Ygc3RhdGljIG1ldGhvZHMgaGFzIGJlZW4gaW1wcm92ZWQgaW4gcHJveHkgY2xhc3Nlcy4gIEluIG9sZGVyCiAgICAgICAgICAgIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhpczoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgc3RhdGljIG1ldGhvZCB3YXMgb25seSBhdmFpbGFibGUgYXMgYSBmdW5jdGlvbiBGb29fYmFyKCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgID4+PiBGb29fYmFyKCkKCiAgICAgICAgICAgIE5vdywgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGFsc28gYmUgaW52b2tlZCB0aHJvdWdoIGFuIGluc3RhbmNlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgICAgPj4+IGYuYmFyKCkgICAgICAgICMgSW52b2tlcyBzdGF0aWMgbWV0aG9kCgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYWxsIHZlcnNpb25zIG9mIFB5dGhvbi4gIEFkZGl0aW9uYWxseSwgZm9yIFB5dGhvbi0yLjIsCiAgICAgICAgICAgIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGFzOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvby5iYXIoKQoKICAgICAgICAgICAgVGhlIG9sZC1zdHlsZSBmdW5jdGlvbiBpcyBzdGlsbCBzdXBwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSWYKICAgICAgICAgICAgeW91IGNhcmUgYWJvdXQgbWFraW5nIHlvdXIgY29kZSBhY3Jvc3MgZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbiwKICAgICAgICAgICAgZWl0aGVyIHVzZSBGb29fYmFyKCkgb3IgYWNjZXNzIHRoZSBtZXRob2QgdGhyb3VnaCBhbiBpbnN0YW5jZS4KIAowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUuICBQcm94eSBjbGFzc2VzIG5vdyB1dGlsaXplIG5ldyBQeXRob24tMi4yCiAgICAgICAgICAgIGZlYXR1cmVzIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGFuZCBzdGF0aWMgbWV0aG9kcy4gIEhvd2V2ZXIsIHRoZXNlIGZlYXR1cmVzCiAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgaW4gYSB3YXkgdGhhdCBwcm92aWRlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCiAgICAgICAgICAgIFB5dGhvbiB2ZXJzaW9ucy4gIEluIG90aGVyIHdvcmRzLCBwcm94eSBjbGFzc2VzIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uIGFuZCBvbmx5IHVzZSBuZXcgZmVhdHVyZXMgd2hlbiBydW5uaW5nIG9uIFB5dGhvbi0yLjIuCgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAlZXh0ZW5kIHNvIHRoYXQgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbiBiZSBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHgpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqcykgeyB9OwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBib3RoIEMrKyAqYW5kKiBDLgoKMDcvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBNb3JlIG5ldyB0eXBlbWFwcyBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIGNhbiBiZSBmdXJ0aGVyIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgY29kZSBmb3IgZ2VuZXJhdGluZyB0aGUgCiAgICAgICAgICAgIGZpbmFsaXplKCkgbWV0aG9kcyAocHJveHkgY2xhc3NlcyBvbmx5KSBhbmQgdGhlIGdldENQdHIoKSBtZXRob2RzIGZvciBwcm94eSAKICAgICAgICAgICAgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhZmluYWxpemUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgICAgICAgICBfZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgdHlwZW1hcCB3aWxsIGVuYWJsZSB1c2VycyB0byBoYW5kbGUgSmF2YSBudWxsIGJ5IG92ZXJyaWRpbmcKICAgICAgICAgICAgdGhpcyB0eXBlbWFwIC0gYSByZXF1ZXN0ZWQgZmVhdHVyZS4KCiAgICAgICAgICAgIFRoZSAtbm9maW5hbGl6ZSBjb21tYW5kbGluZSBvcHRpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVGhlIGphdmFmaW5hbGl6ZQogICAgICAgICAgICB0eXBlbWFwIGlzIG1vcmUgcG93ZXJmdWwgYXMgaXQgd2lsbCBhbGxvdyB0aGUgcmVtb3ZhbCBvZiB0aGUgZmluYWxpemUgbWV0aG9kcyAKICAgICAgICAgICAgZm9yIGFsbCBvciBhbnkgb25lIG9yIG1vcmUgcGFydGljdWxhciBwcm94eSBjbGFzcy4KCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGdldENQdHJYWFgoKSBmdW5jdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgc3RhdGljIGZ1bmN0aW9uIGFuZAogICAgICAgICAgICBpcyBub3cgb2YgdGhlIGZvcm06CgogICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cihYWFggb2JqKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBpcyBhIHJlcXVlc3RlZCBjaGFuZ2Ugd2hpY2ggd2lsbCBhbGxvdyBKYXZhIG51bGwgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBudWxsCiAgICAgICAgICAgIGNhbiBiZSBwYXNzZWQgaW4gZm9yIG9iai4gSG93ZXZlciwgdG8gYWNoaWV2ZSB0aGlzIHRoZSBhcHByb3ByaWF0ZSBjb2RlIG11c3QgYmUKICAgICAgICAgICAgd3JpdHRlbiB1c2luZyB0aGUgbmV3IGphdmFnZXRjcHRyIHR5cGVtYXAgZGlyZWN0aXZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGlzIGZ1bmN0aW9uIGJhY2sgaW4gdXNpbmcgdGhlCiAgICAgICAgICAgIG5ldyBqYXZhY29kZSB0eXBlbWFwOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CgogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjEyIGFuZCBTV0lHLTEuMy4xMwogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTEgYW5kIGVhcmxpZXIKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICV9CgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZGlyZWN0aXZlIHRvIGNvbnRyb2wgY29uc3RhbnQgY29kZSBnZW5lcmF0aW9uIC0gJWphdmFjb25zdC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGhhbmRsaW5nIGNvbnN0YW50cyBpcyB0byBnZXQgdGhlIHZhbHVlIHRocm91Z2gKICAgICAgICAgICAgYSBKTkkgY2FsbCwgZWcKCiAgICAgICAgICAgICNkZWZpbmUgWUVMTE9XIDUKICAgICAgICAgICAgI2RlZmluZSBCSUcgMTIzNExMCgogICAgICAgICAgICByZXN1bHRzIGluOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gbW9kdWxlbmFtZS5nZXRfWUVMTE9XKCk7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSBtb2R1bGVuYW1lLmdldF9CSUcoKTsKCiAgICAgICAgICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIEphdmEgbW9kdWxlIGluaXRpYWxpc2VkIHRoZSB2YWx1ZSB1c2luZyB0aGUgQyB2YWx1ZToKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IDU7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMjM0TEw7CgogICAgICAgICAgICBUaGlzIHdvcmtzIGluIG1vc3QgY2FzZXMsIGJ1dCB0aGUgdmFsdWUgZm9yIEJJRyB3b24ndCBjb21waWxlIGFzIDEyMzRMTCBpcyBub3QKICAgICAgICAgICAgdmFsaWQgSmF2YSBjb2RlIGFuZCB0aGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgdGhlIGRlZmF1bHQgaXMgbm93IHRvIGdldCB0aGUgCiAgICAgICAgICAgIHZhbHVlcyB0aHJvdWdoIGEgSk5JIGNhbGwuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZXNlICdjb25zdGFudHMnIGNhbm5vdCBiZSB1c2VkIAogICAgICAgICAgICBpbiBzd2l0Y2ggc3RhdGVtZW50cy4gVGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIGFsbG93cyBvbmUgdG8gc3BlY2lmeSB0aGUKICAgICAgICAgICAgd2F5IHRoZSBjb25zdGFudCB2YWx1ZSBpcyBpbml0aWFsaXNlZCBhbmQgd29ya3MgbGlrZSBvdGhlciAlZmVhdHVyZQogICAgICAgICAgICBkaXJlY3RpdmVzLCBlZwoKICAgICAgICAgICAgJWphdmFjb25zdCgwKTsgICAgIC8vIGFsbCBjb25zdGFudHMgZnJvbSB0aGlzIHBvaW50IG9uIGFyZSBpbml0aWFsaXNlZCB1c2luZyB0aGUgQyB2YWx1ZQogICAgICAgICAgICAlamF2YWNvbnN0KDEpIEJJRzsgLy8ganVzdCBCSUcgaW5pdGlhbGlzZWQgdXNpbmcgSk5JIGNhbGwgKG11c3QgYmUgcGFyc2VkIGJlZm9yZSBCSUcgaXMgZGVmaW5lZCkKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgKioqIElNUE9SVEFOVCBDSEFOR0VTIFRPIFRIRSBQWVRIT04gTU9EVUxFICoqKgoKICAgICAgICAgICAgKDEpIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbmFibGVzIHNoYWRvdy9wcm94eSBjbGFzc2VzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0d28gZmlsZXMgYXJlIGFsd2F5cyBjcmVhdGVkIGJ5IFNXSUcuICBGb3IKICAgICAgICAgICAgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgIC8vIGZpbGU6IGZvby5pCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBmb28KICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZW4gc3dpZyBnZW5lcmF0ZXMgdHdvIGZpbGVzICJmb29fd3JhcC5jIiBhbmQgImZvby5weSIuCgogICAgICAgICAgICAoMikgVGhlIG5hbWUgb2YgdGhlIGxvdy1sZXZlbCBDIGV4dGVuc2lvbiBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZAogICAgICAgICAgICB0byBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZQogICAgICAgICAgICB0byBjb21waWxlIHRoZSBtb2R1bGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAkIGNjIC1jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMiBmb29fd3JhcC5jCiAgICAgICAgICAgICAgICAkIGNjIC1zaGFyZWQgZm9vX3dyYXAubyAkKE9CSlMpIC1vIF9mb28uc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIGV4dHJhIHVuZGVyc2NvcmUKCiAgICAgICAgICAgIFRoaXMgbmFtaW5nIHNjaGVtZSBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIgUHl0aG9uIG1vZHVsZXMgdGhhdAogICAgICAgICAgICB1dGlsaXplIGV4dGVuc2lvbiBjb2RlLiAgRm9yIGluc3RhbmNlLCB0aGUgc29ja2V0IG1vZHVsZSBjb25zaXN0cwogICAgICAgICAgICBvZiAiX3NvY2tldC5zbyIgYW5kICJzb2NrZXQucHkiLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywKICAgICAgICAgICAgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSB3YXMgbmFtZWQgImZvb2Ntb2R1bGUuc28iLgoKICAgICAgICAgICAgKDMpIEEgbmV3IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBpbnNlcnQgUHl0aG9uIGNvZGUgaW50bwogICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAucHkgZmlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVweXRob25jb2RlICV7CiAgICAgICAgICAgICAgICBkZWYgZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkhlbGxvIFdvcmxkIgogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2R1bGVzIGFzIGEgbWl4IG9mIEMgYW5kIFB5dGhvbi4KICAgICAgICAgICAgIFB5dGhvbiBjb2RlIGlzIHNlYW1sZXNzbHkgYWRkZWQgdG8gdGhlIG1vZHVsZS4KCiAgICAgICAgICAgICg0KSBUaGUgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICBUaGlzIGlzIHR1cm5lZCBvbgogICAgICAgICAgICBieSBkZWZhdWx0LgoKICAgICAgICAgICAgKDUpIFRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGV4dHJhIHB5dGhvbiBmaWxlLCB1c2UgdGhlICItbm9wcm94eSIKICAgICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGxpa2VseSBicmVhayB0aGUgYnVpbGQgZW52aXJvbm1lbnQgb2YgcHJvamVjdHMgdGhhdAogICAgICAgICAgICB1dGlsaXplIHNoYWRvdyBjbGFzc2VzLiAgIFRvIGZpeCB0aGlzLCB5b3UgcHJvYmFibHkgb25seSBuZWVkIHRvCiAgICAgICAgICAgIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IC5zbyBmaWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIE1ha2VmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBleGFtcGxlY21vZHVsZS5zbwoKICAgICAgICAgICAgSnVzdCBjaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gX2V4YW1wbGUuc28KCiAgICAgICAgICAgICoqKiBET0NVTUVOVEFUSU9OIFVQREFURSAqKioKICAgICAgICAgICAgVGhlIGZpbGUgRG9jL01hbnVhbC9QeXRob24uaHRtbCBoYXMgYmVlbiB1cGRhdGVkIHRvIGRlc2NyaWJlIHRoZXNlIGNoYW5nZXMuCgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtbm9leHRlcm4gb3B0aW9uLiAgIElmIHN1cHBsaWVkLCBTV0lHIHdpbGwgbm90IGdlbmVyYXRlCiAgICAgICAgICAgIGV4dHJhIGV4dGVybiBkZWNsYXJhdGlvbnMuICBUaGlzIGlzIHNvbWV0aW1lcyBhbiBpc3N1ZSBvbiAKICAgICAgICAgICAgbm9uLXVuaXggcGxhdGZvcm1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIHdhcm5pbmcgZm9yIGlnbm9yZWQgZnJpZW5kIGZ1bmN0aW9ucy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzQ0OTggXSAtcHJveHkgYW5kICVpbmNsdWRlICJwb2ludGVyLmkiIGNsYXNoLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYXZpZCBDcmVhc3kuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc2MTAzIF0gZ2xvYmFsIGRlc3RydWN0aW9uIHdhcm5pbmcgd2l0aCBzaGFkb3cuCiAgICAgICAgICAgIFBlcmwgZXh0ZW5zaW9ucyBzaG91bGQgbm8gbG9uZ2VyIHJlcG9ydCB0aGUgd2FybmluZwoKICAgICAgICAgICAgICAgIlVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGR1cmluZyBnbG9iYWwgZGVzdHJ1Y3Rpb24uIgogCiAgICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoICJwZXJsIC13Ii4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJyZXR0IFdpbGxpYW1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbiBDKysgbW9kZSwgU1dJRyBub3cgYWx3YXlzIGRlZmluZXMgbmFtZXNwYWNlIHN0ZC4gIEJ5IGRlZmF1bHQsCiAgICAgICAgICAgIGl0J3MgZW1wdHkuICBIb3dldmVyLCB0aGlzIHdpbGwgc2lsZW5jZSBlcnJvcnMgZnJvbSBwcm9ncmFtcwogICAgICAgICAgICB0aGF0IGluY2x1ZGUgc3RhdGVtZW50cyBzdWNoIGFzICJ1c2luZyBuYW1lc3BhY2Ugc3RkOyIuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgQnVnIFsgNTg0MDE3IF0gdXNpbmcgbmFtZXNwYWNlIHN0ZCBnZW5lcmF0ZXMgZXJyb3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDcvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIG5ldyB3YXJuaW5nIG1lc3NhZ2UgZm9yICVhcHBseS4gIElmIHlvdSB1c2UgJWFwcGx5IGJ1dCBubyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgZGVmaW5lZCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBzaG91bGQgaGVscCB3aXRoCiAgICAgICAgICAgIHByb2JsZW1zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqT1VUUFVUIHsgLi4uIH07CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMgb2YgU1dJRywgdGhpcyBzaWxlbnRseSBkaWQgbm90aGluZy4gIE5vdyB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgdGhpczoKICAKICAgICAgICAgICAgICAgICAgIGZpbGU6bGluZS4gV2FybmluZy4gQ2FuJ3QgYXBwbHkgKGNoYXIgKk9VVFBVVCkuIE5vIHR5cGVtYXBzIGFyZSBkZWZpbmVkLgoKMDcvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdGFydGVkIEphdmEgcHJhZ21hIGRlcHJlY2F0aW9uLiBSZXBsYWNlbWVudHMgdXNlICV0eXBlbWFwIGJhc2VkIAogICAgICAgICAgICBkaXJlY3RpdmVzIGFuZCBlbmFibGUgcHJveHkgY2xhc3NlcyBhbmQgdGhlIG5ldyB0eXBlIHdyYXBwZXIgY2xhc3NlcyB0byBiZSAKICAgICAgICAgICAgdGFpbG9yZWQgaW4gdmFyaW91cyB3YXlzLiBUaGVzZSBhcmUgdGhlIG5ldyB0eXBlbWFwczoKICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlKSAgICAgICAgICAgLSBiYXNlIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIC0gY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgSmF2YSBjbGFzczogZGVmYXVsdCBpcyAicHVibGljIgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgICAgICAgICAgIC0gamF2YSBjb2RlIGlzIGNvcGllZCB2ZXJiYXRpbSB0byB0aGUgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgICAgICAgIC0gaW1wb3J0IHN0YXRlbWVudHMgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWludGVyZmFjZXMpICAgICAtIGludGVyZmFjZXMgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgIAogICAgICAgICAgICBBbmQgdGhlc2UgYXJlIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZXMgYmVpbmcgZGVwcmVjYXRlZDoKICAgICAgICAgICAgYWxsc2hhZG93YmFzZQogICAgICAgICAgICBhbGxzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbGxzaGFkb3djb2RlCiAgICAgICAgICAgIGFsbHNoYWRvd2ltcG9ydAogICAgICAgICAgICBhbGxzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgc2hhZG93YmFzZQogICAgICAgICAgICBzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBzaGFkb3djb2RlCiAgICAgICAgICAgIHNoYWRvd2ltcG9ydAogICAgICAgICAgICBzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0YXJnZXQgYSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgRm9vICJpbXBvcnQgamF2YS51dGlsLioiOwogICAgICAgICAgICBvciBhIHBhcnRpY3VsYXIgdHlwZSB3cmFwcGVyIGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgZG91YmxlKiAiaW1wb3J0IGphdmEubWF0aC4qIjsKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAoY29ycmVjdGVkIHR5cG8gaW4gbGluZSBiZWxvdyAtIDA2LzI2LzIwMDgpCiAgICAgICAgICAgICAgICVmcmFnbWVudCgidHlwZV9oZWFkZXIiLCJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0idHlwZV9oZWFkZXIiKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGNvZGUgZnJhZ21lbnQgaXMgb25seSBlbWl0dGVkIGlmIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFjdHVhbGx5IHVzZWQuICAgQSBzaW1pbGFyIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIGFubm90YXRpb24gYW5kIHRoZSAlZmVhdHVyZSBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJmcmFnbWVudCIsInR5cGVfaGVhZGVyIikgIFNvbWVEZWNsYXJhdGlvbjsKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byAlZnJhZ21lbnQgaXMgdGhlIGZyYWdtZW50IG5hbWUuICBUaGUgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgICAgIGlzIHRoZSBmaWxlIHNlY3Rpb24gd2hlcmUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkLiAgCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUgaXMgZm9yIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgICBhbmQgYWR2YW5jZWQgdXNlcnMgd2FudGluZyB0byBzdHJlYW1saW5lIHR5cGVtYXAgY29kZS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIG1lbWJlcmluIHR5cGVtYXBzIGZvciBhbGwgYXJyYXlzIGluIGFuIGF0dGVtcHQgdG8gZWxpbWluYXRlCiAgICAgICAgICAgIGNvbmZ1c2lvbiBhYm91dCB0aGVpciB1c2UuCgowNi8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBzbWFydC1wb2ludGVycy4gIFdoZW4gYSBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIG9wZXJhdG9yLT4oKSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBCYXIgKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIGxvY2F0ZXMgY2xhc3MgQmFyIGFuZCB0cmllcyB0byB3cmFwIGl0cyBtZW1iZXIgdmFyaWFibGVzIGFuZAogICAgICAgICAgICBtZXRob2RzIGFzIHBhcnQgb2YgRm9vLiAgRm9yIGV4YW1wbGUsIGlmIEJhciB3YXMgZGVmaW5lZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFlvdSBjb3VsZCBkbyB0aGlzIChpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKToKCiAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgZi54ID0gNCAgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjp4CiAgICAgICAgICAgICAgZi5zcGFtKCkgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjpzcGFtCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEMrKwogICAgICAgICAgICBzbWFydC1wb2ludGVycy0tLXdoaWNoIGFsbG93IGF0dHJpYnV0ZXMgdG8gYWNjZXNzZWQgdHJhbnNwYXJlbnRseQogICAgICAgICAgICB0aHJvdWdoIG9wZXJhdG9yLT4uCgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkgaW4gU1dJRy0tLW5vIHNwZWNpYWwgZGlyZWN0aXZlcwogICAgICAgICAgICBhcmUgbmVlZGVkLiAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4gIFVzZSAlaWdub3JlIHRvIGlnbm9yZSAKICAgICAgICAgICAgb3BlcmF0b3ItPi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDYvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlZXhjZXB0IGRpcmVjdGl2ZS4gICAlZXhjZXB0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgowNi8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNsZWFudXAgb2YgdGhlIG1vZHVsZXMgZGlyZWN0b3J5LiAgRWxpbWluYXRlZCBtb3N0CiAgICAgICAgICAgIGhlYWRlciBmaWxlcywgY29uc29saWRhdGVkIG1vZHVsZSBjb2RlIGludG8gc2luZ2xlIGZpbGVzLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaW5zdGFudGlhdGlvbiBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgQWxsIGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMgbXVzdCBub3cgZGVmaW5lIGEgZmFjdG9yeSBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqCiAgICAgICAgICAgICAgICBzd2lnX3B5dGhvbih2b2lkKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBZVEhPTigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbiBhIHRhYmxlIGFuZCBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICAgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIHN3aWdtYWluLmN4eC4gIAoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBoYXMgYSBudW1iZXIgb2YgYmVuZWZpdHMuICBJdCBkZWNvdXBsZXMgdGhlIAogICAgICAgICAgICBTV0lHIG1haW4gcHJvZ3JhbSBmcm9tIGhhdmluZyB0byBrbm93IGFib3V0IHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9ucyBmb3IgZWFjaCBtb2R1bGUuICBBbHNvLCBieSB1c2luZyBhIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIGxvYWRpbmcKICAgICAgICAgICAgb2YgbW9kdWxlcyAoc2ltcGx5IGxvYWQgdGhlIGZpbGUgYW5kIGludm9rZSB0aGUgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbikuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3IgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28gJigpOwoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIG9wZXJhdG9yIG5ld1tdIGFuZCBvcGVyYXRvciBkZWxldGVbXS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHByb2JsZW0gZm9yIGNvbnN0YW50cyBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgaW52b2x2aW5nIHRlbXBsYXRlcy4KCjA2LzE5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBhIGJ1ZyBmb3IgdGhlICctZmVhdHVyZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50OwogICAgICAgICAgICB0aGF0IHNldHRpbmcgd2FzIGVmZmVjdGl2ZWx5IGJlaW5nIGlnbm9yZWQgYW5kIHNvIHRoZSBmZWF0dXJlCiAgICAgICAgICAgIG5hbWUgd2FzIGFsd2F5cyBzZXQgZXF1YWwgdG8gdGhlIG1vZHVsZSBuYW1lLgoKMDYvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBtZW1iZXJzIGFuZCBlbnVtcyBpbiB0ZW1wbGF0ZXMuCgpWZXJzaW9uIDEuMy4xMyAoSnVuZSAxNywgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGNoYXIgKmRhdGEgeyAuLi4gfTsgCgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHJlbmFtaW5nIGFuZCBkZWNsYXJhdGlvbgogICAgICAgICAgICBtYXRjaGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgRm9vOjpwcmludDsgICAgICAgICAgLy8gUmVuYW1lIGluIG5hbWVzcGFjZSBGb28KICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyOjpibGFoOyAgICAgICAgICAgICAgIC8vIElnbm9yZSBhIGRlY2xhcmF0aW9uCgogICAgICAgICAgICAlcmVuYW1lIGRpcmVjdGl2ZXMgY2FuIGJlIHBsYWNlZCBpbnNpZGUgbmFtZXNwYWNlIGJsb2NrcyBhcyB3ZWxsLiBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICVyZW5hbWUoZGlzcGxheSkgcHJpbnQ7ICAgICAgICAgLy8gQXBwbGllcyB0byBwcmludCBiZWxvdwoKICAgICAgICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3N0IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBzaG91bGQgd29yayBwcm9wZXJseSBpbnNpZGUgbmFtZXNwYWNlcy4KICAgICAgICAgICAgTm8gb3RoZXIgY2hhbmdlcyBhcmUgbmVlZGVkLgogICAgICAKMDMvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nLiAgIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgIG1hbmFnZXMgc3RydWN0dXJlcyBhbmQgdW5pb25zIGluIGEgc2VwYXJhdGUgbmFtZXNwYWNlIHRoYW4gbm9ybWFsCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIEFOU0kgQy4gIFRoaXMgbWVhbnMgeW91IGNhbid0IGhhdmUgYSBzdHJ1Y3R1cmUKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IEZvbygpIHsgLi4uIH0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgbW9yZSBsaWtlIEMrKy4gICBJdCdzIG5vdCBjbGVhciB0aGF0IFNXSUcgZXZlcgogICAgICAgICAgICByZWFsbHkgc3VwcG9ydGVkIHRoZSBBTlNJIEMgYW55d2F5cy0tLXVzaW5nIHRoZSBzYW1lIG5hbWUgd291bGQKICAgICAgICAgICAgYWxtb3N0IGNlcnRhaW5seSBnZW5lcmF0ZSBhIG5hbWUtY2xhc2ggaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjAzLzIyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDUxNzMwMiBdIGZvciBoYW5kbGluZyBvZiByZW5hbWVkIG92ZXJsb2FkZWQKICAgICAgICAgICAgY29uc3RydWN0b3JzLiBOb3csIHJlbmFtZWQgb3ZlcmxvYWRlZCBjb25zdHJ1Y3RvcnMgYXJlIGNvbnZlcnRlZAogICAgICAgICAgICBpbnRvIGNsYXNzIHNpbmdsZXRvbiBtZXRob2RzIChiYXNpY2FsbHkgYWN0aW5nIGFzICJmYWN0b3J5IgogICAgICAgICAgICBtZXRob2RzKS4KCjAzLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MzI5NTcgXSAlaWdub3JlIHBhcnNlIGVycm9yIGFuZCBjYXN0aW5nIG9wZXJhdG9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjAzLzE4LzIwMDI6IGJlYXpsZXkgKCoqIEFEVkFOQ0VEIFVTRVJTIE9OTFkgKiopCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgY2FzdGluZyBpbiByZXR1cm4gdmFsdWVzLiAgQSBzb21ld2hhdAogICAgICAgICAgICBjb21tb24gcHJvYmxlbSBpbiBjZXJ0YWluIEMrKyBwcm9ncmFtcyBpcyBmdW5jdGlvbnMgdGhhdCBoaWRlCiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB1bmRlcmx5aW5nIG9iamVjdHMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCAKICAgICAgICAgICAgZnJvbSBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgYSBwcm9ncmFtIG1pZ2h0IGluY2x1ZGUKICAgICAgICAgICAgc29tZSBnZW5lcmljIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgTm9kZSAqZ2V0Tm9kZSgpOwoKICAgICAgICAgICAgSG93ZXZlciwgTm9kZSAqIG1heSBqdXN0IGJlIGJhc2UgY2xhc3MgdG8gYSB3aG9sZSBoaWVyYXJjaHkKICAgICAgICAgICAgb2YgZGlmZmVyZW50IG9iamVjdHMuICAgSW5zdGVhZCBvZiByZXR1cm5pbmcgdGhpcyBnZW5lcmljIE5vZGUgKiwKICAgICAgICAgICAgaXQgbWlnaHQgYmUgbmljZSB0byBhdXRvbWF0aWNhbGx5IGRvd25jYXN0IHRoZSBvYmplY3QgaW50byB0aGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZSB1c2luZyBzb21lIGtpbmQgZHluYW1pYyBjYXN0LgoKICAgICAgICAgICAgQXNzdW1pbmcgeW91IHVuZGVyc3RhbmQgdGhlIHBlcmlsIGludm9sdmVkLCBhIGRvd25jYXN0IGNhbiBub3cKICAgICAgICAgICAgYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaW4gdGhlIHJ1bi10aW1lIHR5cGUKICAgICAgICAgICAgY2hlY2tlcjoKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKlNXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICosIHZvaWQgKipwdHIpOwoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW5vdGhlcgogICAgICAgICAgICB0eXBlLiAgSWYgc28sIGEgZGlmZmVyZW50IHR5cGUgZGVzY3JpcHRvciAoZm9yIHRoZSBjb252ZXJ0ZWQgdHlwZSkKICAgICAgICAgICAgaXMgcmV0dXJuZWQuICAgVGhpcyB0eXBlIGRlc2NyaXB0b3Igd291bGQgdGhlbiBiZSB1c2VkIHRvIGNyZWF0ZQogICAgICAgICAgICBhIHBvaW50ZXIgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCiAgICAgICAgICAgIFRvIHVzZSB0aGlzLCB5b3Ugd291bGQgd3JpdGUgYSB0eXBlbWFwIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogewogICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU1dJR19UeXBlRHluYW1pY0Nhc3QoJDFfZGVzY3JpcHRvciwgKHZvaWQgKiopICYkMSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gU1dJR19OZXdQb2ludGVyT2JqKCQxLCB0eSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwKCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBOb2RlICogPSBTV0lHVFlQRSAqRFlOQU1JQzsKCiAgICAgICAgICAgIFRvIG1ha2UgdGhlIHR5cGVtYXAgaGF2ZSBhbnkgZWZmZWN0LCB5b3UgaGF2ZSB0byB3cml0ZSBhIHN1cHBvcnRpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHBlcmZvcm0gZG93bmNhc3RpbmcuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHN0YXRpYyBzd2lnX3R5cGVfaW5mbyAqCiAgICAgICAgICAgICAgTm9kZV9keW5hbWljX2Nhc3Qodm9pZCAqKnB0cikgewogICAgICAgICAgICAgICAgIE5vZGUgKipucHRyID0gKE5vZGUgKiopIHB0cjsKICAgICAgICAgICAgICAgICBFbGVtZW50ICplID0gZHluYW1pY19jYXN0PEVsZW1lbnQgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRWxlbWVudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRGF0YSAqZCA9IGR5bmFtaWNfY2FzdDxEYXRhICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBkOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0RhdGE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHR5cGVzIGFyZSBkZXRlcm1pbmVkLiBkeW5hbWljX2Nhc3Q8PgogICAgICAgICAgICB1c2VzIEMrKyBSVFRJLiAgSG93ZXZlciwgaWYgeW91IGhhZCBzb21lIG90aGVyIG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcKICAgICAgICAgICAgdGhlIHR5cGUsIHlvdSBjb3VsZCB1c2UgdGhhdCBoZXJlLiAgTm90ZTogaXQgaXMgaW1wb3J0YW50IHRvIHNhdmUKICAgICAgICAgICAgdGhlIG5ldyBwb2ludGVyIHZhbHVlIGJhY2sgaW50byB0aGUgYXJndW1lbnQgYXMgc2hvd24uICBXaGVuIGRvd25jYXN0aW5nLAogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgY291bGQgY2hhbmdlLiAKCiAgICAgICAgICAgIEZpbmFsbHksIHRvIG1ha2UgdGhlIGNhc3RpbmcgZnVuY3Rpb24gYXZhaWxhYmxlLCB5b3UgaGF2ZSB0byByZWdpc3RlcgogICAgICAgICAgICBpdCB3aXRoIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIuIFB1dCB0aGlzIG1hY3JvIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICAgICBEWU5BTUlDX0NBU1QoU1dJR1RZUEVfcF9Ob2RlLCBOb2RlX2R5bmFtaWNfY2FzdCk7CgogICAgICAgICAgICBOb3RlOiB0aGlzIGZlYXR1cmUgZG9lcyBub3QgaW50cm9kdWNlIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiAKICAgICAgICAgICAgbm9ybWFsIFNXSUcgb3BlcmF0aW9uLiAgVGhlIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGJ5IHdyaXRpbmcKICAgICAgICAgICAgYSBuZXcgdHlwZW1hcCB0aGF0IGV4cGxpY2l0bHkgY2FsbHMgU1dJR19UeXBlRHluYW1pY0Nhc3QoKSB0bwogICAgICAgICAgICBtYWtlIGEgY29udmVyc2lvbi4gCiAgCiAgICAgICAgICAgIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZHluYW1pY19jYXN0LmkgY29udGFpbnMgYSBzaW1wbGUgZXhhbXBsZS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIEphdmEgbW9kdWxlIGR1ZSB0byBkaWZmZXJlbmNlcwogICAgICAgICAgICBpbiB0aGUgdHlwZS1jaGVja2luZyBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjAzLzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU21hbGwgY2hhbmdlIHRvIHR5cGUtbmFtZSBoYW5kbGluZyBvZiB1bm5hbWVkIHN0cnVjdHVyZXMgYW5kCiAgICAgICAgICAgIHR5cGVkZWYuICBJZiBhIHN0cnVjdHVyZSBvZiB0aGlzIGZvcm0gYXBwZWFyczoKCiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBUaGVuICdGb28nIGlzIHVzZWQgYXMgdGhlIHByb3BlciB0eXBlbmFtZSBmb3IgdGhlIHN0cnVjdHVyZS4KICAgICAgICAgICAgRnVydGhlcm1vcmUsIEZvbyBjYW4gbm93IGJlIHVzZWQgYXMgYSBuYW1lIGluIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgICAgU1dJRyB3YXMgYWxyZWFkeSBraW5kIG9mIGRvaW5nIHRoaXMsIGJ1dCB0aGlzIG1vZGlmaWNhdGlvbiByZWZpbmVzCiAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBtb3JlIGNsb3NlbHkgZm9sbG93IHRoZSBDKysgQVJNLCBzZWN0aW9uCiAgICAgICAgICAgIDcuMS4zLCBwLiAxMDYuICBUaGlzIGZpeGVzIGEgY291cGxlIG9mIG9ic2N1cmUgY29ybmVyIGNhc2VzLgoKMDMvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBDKysgaW5oZXJpdGFuY2Ugd2l0aCBhIGZldyBlbmhhbmNlbWVudHMuICBGaXJzdCwgdHlwZSBpbmZvcm1hdGlvbgogICAgICAgICAgICBuZWVkZWQgZm9yIGNhc3RpbmcgYW5kIHR5cGUtZXF1aXZhbGVuY2UgaXMgZ2VuZXJhdGVkIGV2ZW4gd2hlbiBiYXNlLWNsYXNzZXMKICAgICAgICAgICAgYXJlbid0IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgIHsgICAgLyogQmFyIHVuc3BlY2lmaWVkICovCiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHZvaWQgYmxhaChCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmxhaCgpIGZ1bmN0aW9uIHN0aWxsIGFjY2VwdHMgRm9vICogZXZlbiB0aG91Z2ggbm90aGluZwogICAgICAgICAgICBpcyByZWFsbHkga25vd24gYWJvdXQgQmFyLiAgIFByZXZpb3VzIFNXSUcgdmVyc2lvbnMgd291bGQganVzdCBnZW5lcmF0ZQogICAgICAgICAgICBhIHR5cGUgZXJyb3IuCgogICAgICAgICAgICBJbmhlcml0YW5jZSBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgdGhyb3VnaCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBCYXIgT3RoZXJCYXI7CiAgICAgICAgICAgICAgIGNsYXNzIEZvbzogcHVibGljIE90aGVyQmFyIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgYmFzZSBjbGFzcyBvZiBPdGhlckJhciBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgYmFjayB0bwogICAgICAgICAgICBCYXIuICAgVGhlIHVzZSBvZiB0aGUgbmFtZSBPdGhlckJhciBpcyBsb3N0IGluIHRoaXMgcmVzb2x1dGlvbiAodGhlIHdyYXBwZXJzCiAgICAgICAgICAgIHdpbGwgc2ltcGx5IHVzZSBCYXIgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIE90aGVyQmFyKS4KICAgICAgICAgICAKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICAldHlwZW1hcCwgJWFwcGx5LCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGNhbiBub3cgYXBwZWFyIGluc2lkZQogICAgICAgICAgICBjbGFzcyBkZWZpbml0aW9ucy4gICAKCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gY29tcGlsaW5nIFNXSUcgb24gNjQtYml0CiAgICAgICAgICAgIHBsYXRmb3Jtcy4KCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoICJpZ25vcmUiIGFuZCAiaW4iIHR5cGVtYXBzLiAgTG9jYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCAiaW4iIHdlcmUgYmVpbmcgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gZXZlbgogICAgICAgICAgICB0aG91Z2ggdGhleSB3ZXJlIG5ldmVyIHVzZWQuICAgTW9zdGx5IGhhcm1sZXNzLCBidXQgaXQgd291bGQgbGVhZAogICAgICAgICAgICB0byBhIHZhcmlldHkgb2YgY29tcGlsYXRpb24gd2FybmluZ3MuCiAgCjAzLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCB0eXBlIHN5c3RlbSBhbmQgaGFuZGxpbmcgb2YgbmVzdGVkIEMrKwogICAgICAgICAgICB0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNvbWVtZXRob2QoQmxhaCB4KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdvdWxkIGltcGxpY2l0bHkgYmUgc2V0IHRvIEJhcjo6QmxhaC4KICAgICAgICAgICAgQWx0aG91Z2ggdGhpcyBpcyB0ZWNobmljYWxseSBhbGxvd2VkLCBpdCBicmVha3MgdHlwZW1hcHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzo6QmxhaCB7IC4uLiB9CgogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIGxpa2UgeW91IGV4cGVjdC4gICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgaW4gU1dJRy0xLjMuMTIuCiAgICAgICAgICAgIE5vdywgdHlwZXMgYXJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjbGFzcyBpbiB3aGljaCB0aGV5IHdlcmUgZGVmaW5lZC4KICAgICAgICAgICAgU28sIHRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3aWxsIGJlIEZvbzo6QmxhaC0tLXNpbmNlIHRoZQogICAgICAgICAgICB0eXBlIEJsYWggd2FzIGRlZmluZWQgaW4gRm9vLgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBzdWJ0bGUgdHlwZSBzY29waW5nIHByb2JsZW1zIHdpdGggdHlwZWRlZiBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBCbGFoOwogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKEJsYWggeCwgOjpCbGFoIHkpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwgY2hhbmdlIHRvIGhhbmRsZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgogICAgICAgICAgICBGaXJzdCwgdGhlcmUgaXMgbm8gcG9ydGFibGUgb3IgcmVsaWFibGUgd2F5IHRvIHdyYXAKICAgICAgICAgICAgYSB2YXJhcmdzIGZ1bmN0aW9uIGluIGZ1bGwgZ2VuZXJhbGl0eS4gIEhvd2V2ZXIsIHlvdSAqY2FuKiBjaGFuZ2UKICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB1c2luZyAldmFyYXJncy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKikgZnByaW50ZjsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIC4uLik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBsZW5ndGggcGFyYW1ldGVyICIuLi4iIGlzCiAgICAgICAgICAgIHNpbXBseSByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVycyBnaXZlbiBpbiAldmFyYXJncy4gVGhpcwogICAgICAgICAgICByZXN1bHRzIGluIGEgZnVuY3Rpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgY2hhciAqcyk7CgogICAgICAgICAgICBNb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGFuZCBkZWZhdWx0IHZhbHVlcwogICAgICAgICAgICBjYW4gYmUgZGVmaW5lZC4gIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgc3BlY2lmaWVzIGEKICAgICAgICAgICAgbWF4aW11bSBvZiBmb3VyIGFyZ3VtZW50cy4KCiAgICAgICAgICAgICAgICV2YXJhcmdzKGNoYXIgKngxID0gMCwgY2hhciAqeDIgPSAwLCBjaGFyICp4MyA9IDAsIGNoYXIgKng0ID0gMCkgZnByaW50ZjsKIAogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIGhhbmRsaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuICB2YXJhcmdzCiAgICAgICAgICAgIGlzIG5vdyBoYW5kbGVkIGFzIGEgcHJvcGVyIHBhcmFtZXRlciBhbmQgaXMgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICBjb2RlIGdlbmVyYXRvci4gIEhvd2V2ZXIsIGl0IHN0aWxsIGNhbid0IGJlIGhhbmRsZWQgY29ycmVjdGx5CiAgICAgICAgICAgIChhbmQgd2lsbCBnZW5lcmF0ZSBhIHR5cGVtYXAgd2FybmluZykuICAgVGhpcyBjaGFuZ2UgaGFzIGJlZW4KICAgICAgICAgICAgbWFkZSB0byBiZXR0ZXIgaW5jb3Jwb3JhdGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyB3aXRoIG90aGVyCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgc3VjaCBhcyAlaWdub3JlLCAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLgoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUyMjU1NSBdIFN5bnRheCBlcnJvciBwYXJzaW5nICJkZWZpbmUiIGNvbnN0cnVjdC4gU1dJRwogICAgICAgICAgICBpcyBhIGxpdHRsZSBtb3JlIHJlc3RyaWN0aXZlIGluIGRldGVybWluaW5nICNkZWZpbmUgc3RhdGVtZW50cwogICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBhcyBjb25zdGFudHMuICBBbHNvIGFkZGVkIGEgYmV0dGVyIHBhcnNlcgogICAgICAgICAgICBlcnJvciBydWxlIGZvciBoYW5kbGluZyBiYWQgY29uc3RhbnRzLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBDbGFzc2VzIHJlbmFtZWQgd2l0aCAlcmVuYW1lIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSAKICAgICAgICAgICAgYW5vdGhlciBjbGFzcyBnZW5lcmF0ZSBtb3JlIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBjb2RlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBTRiBbICM1MjM2MzIgXSBhbmQgWyAjNTEzMzM1IF0gYm90aCByZXBvcnRlZCBieSBJc3JhZWwgCiAgICAgICAgICAgIFRhbm5lci4gU3VwcG9ydCBmb3IgdHlwZXMgdGhhdCBhcmUgdXNlZCB3aGljaCBhcmUgaW4gYSB0eXBlZGVmLiBUaGUKICAgICAgICAgICAgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIG5hbWUgaXMgZ2VuZXJhdGVkLiBBbHNvIGdlbmVyYXRlZCBjb3JyZWN0CiAgICAgICAgICAgIHNoYWRvdyBjbGFzc25hbWUgd2hlbiBhIHRlbXBsYXRlZCBjbGFzcyBpcyB1c2VkIHdpdGhpbiBhbm90aGVyIAogICAgICAgICAgICB0ZW1wbGF0ZWQgY2xhc3MuIFNlZSB0aGUgY3BwX3R5cGVkZWYuaSB0ZXN0Y2FzZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gdHlwZSB3YXMgZ2VuZXJhdGVkIGluIHNoYWRvdyBjbGFzc2VzIGZvciB0eXBlcyAKICAgICAgICAgICAgdGhhdCB3ZXJlbid0IHdyYXBwZWQgYnkgU1dJRy4gIFRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYSByYXcgCiAgICAgICAgICAgIHBvaW50ZXIsIGllIG5vIHNoYWRvdyBjbGFzcy4KCjAyLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIHVzZWQgYnkgJXJlbmFtZSwgJWlnbm9yZSwgYW5kCiAgICAgICAgICAgICVmZWF0dXJlLiAgIElmIGEgdHlwZSBzaWduYXR1cmUgaXMgc3VwcGxpZWQsIGl0IG11c3QgZXhhY3RseQogICAgICAgICAgICBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGRlY2xhcmF0aW9uLS0taW5jbHVkaW5nIGFueSB1c2Ugb2YKICAgICAgICAgICAgY29uc3QuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvbzEpICAgZm9vKGludCk7CiAgICAgICAgICAgICAgICAlcmVuYW1lKGJhcjEpICAgYmFyKGludCkgY29uc3Q7CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOyAgICAgICAvLyBNYXRjaGVkIC0tPiBmb28xCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpIGNvbnN0OyAvLyBOb3QgbWF0Y2hlZCAKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7ICAgICAgIC8vIE5vdCBtYXRjaGVkCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpIGNvbnN0OyAvLyBNYXRjaGVkIC0tPiBiYXIxCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBub24tY29uc3Qgc3BlY2lmaWNhdGlvbiB3b3VsZCBtYXRjaAogICAgICAgICAgICBib3RoIHRoZSBub24tY29uc3QgYW5kIGNvbnN0IGRlY2xhcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSB3aG9sZQogICAgICAgICAgICBwb2ludCBvZiAlcmVuYW1lIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgaXMgdGhhdCB0aGV5IGJlIGFibGUKICAgICAgICAgICAgdG8gcHJlY2lzZWx5IHBpbnBvaW50IGV4YWN0IGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIHRoZSBwcm9ibGVtLgoKMDIvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaGFuZGxpbmcgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcnMuCiAgICAgICAgICAgIFNXSUcgbm93IG1ha2VzIGEgcHJlbGltaW5hcnkgcGFzcyBvdmVyIHRoZSBwYXJzZSB0cmVlIHRvIGRpc2NvdmVyCiAgICAgICAgICAgIHdoaWNoIGNsYXNzZXMgc3VwcG9ydCBkZWZhdWx0IGFsbG9jYXRpb24uICAgVGhpcyBmaXhlcyBhIG51bWJlcgogICAgICAgICAgICBvZiB2ZXJ5IHN1YnRsZSBpc3N1ZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFuZCBjYWxsL3JldHVybiBieSB2YWx1ZS4KCjAyLzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IG9uIEN5Z3dpbjogUGVybCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIEphdmEgc2hvdWxkCiAgICAgICAgICAgIHdvcmsgb3V0IG9mIHRoZSBib3gsIGJhcnJpbmcgdGhlIHJ1bnRpbWUgbGlicmFyeS4gUmVtb3ZlZCBkbGx3cmFwIAogICAgICAgICAgICBhbmQgcmVwbGFjZWQgd2l0aCBuZXdseSB3b3JraW5nIGdjYyAtc2hhcmVkIGluc3RlYWQgZm9yIEN5Z3dpbi4gCiAgICAgICAgICAgIEFsbCB0aGlzIHdpbGwgcmVxdWlyZSB0aGUgbmV3IGltcHJvdmVkIGJpbnV0aWxzIDIwMDEwODAyIGFuZCBsYXRlciwKICAgICAgICAgICAgYnV0IHRoZSBsYXRlc3QgQ3lnd2luIGlzIHVzdWFsbHkgdGhlIGJlc3QgcmVjb21tZW5kYXRpb24uCgowMi8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIGFuZCBQZXJsIHNoYWRvdyBjbGFzc2VzLiBSZXBvcnRlZCBieSBDaGlhLWxpYW5nIEthby4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZml4IHRvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIEMrKyBjbGFzcwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgc28gdGhhdCB3ZSBnZXQgYm90aCBhICJuZXciIHNpbmdsZXRvbiBtZXRob2QKICAgICAgICAgICAgYW5kIGFuICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yIGVhY2ggY2xhc3MuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIGVuYWJsZXMgZGV2ZWxvcGVycyB0byBkZXJpdmUgbmV3IFJ1YnkgY2xhc3NlcyBmcm9tCiAgICAgICAgICAgIFNXSUctd3JhcHBlZCBDKysgY2xhc3NlcyBhbmQgdGhlbiBvdmVycmlkZSB0aGVpciBpbml0aWFsaXplCiAgICAgICAgICAgIG1ldGhvZHMgdG8gcHJvdmlkZSBzdWJjbGFzcy1zcGVjaWZpYyBpbnN0YW5jZSBpbml0aWFsaXphdGlvbi4KCjAyLzE1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYXNzaXZlIGRvY3VtZW50YXRpb24gdXBkYXRlIGZvciB0aGUgUnVieSBtb2R1bGUsCiAgICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IENyYWlnIEZpbGVzLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEFuIGVycm9yIGluIHRoZSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgUnVieQogICAgICAgICAgICB3YXMgY2F1c2luZyBzZXZlcmFsIG9mIHRoZSBleGFtcGxlcyB0byBmYWlsLiBSZXBvcnRlZCBieQogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBFbnVtZXJhdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBjbGFzcyAoc3VjaAogICAgICAgICAgICBhcyB0aG9zZSBzZWVuIGluIHRoZSBFeGFtcGxlcy9ydWJ5L2VudW0gZXhhbXBsZSkgd2VyZSBub3QKICAgICAgICAgICAgYmVpbmcgZXhwb3J0ZWQgd2l0aCB0aGUgY29ycmVjdCBuYW1lcy4gUmVwb3J0ZWQgYnkgV2lsbGlhbQogICAgICAgICAgICBGdWx0b24uCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB3ZSBydW4gYWNyb3NzIG92ZXJsb2FkZWQKICAgICAgICAgICAgY2xhc3MgY29uc3RydWN0b3JzIGZvciBDKysgY29kZSwgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBub3QKICAgICAgICAgICAgc3VwcG9ydGVkIChldmVuIGlmIHRoZSBvdmVybG9hZHMgaGF2ZSBiZWVuICVyZW5hbWVkKS4gRm9yIGFuCiAgICAgICAgICAgIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBkb2Vzbid0IHdvcmssIHNlZSBFeGFtcGxlcy9ydWJ5L29wZXJhdG9yLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGFuICJpZ25vcmVkIiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgcGFyc2VyIHJ1bnMKICAgICAgICAgICAgYWNyb3NzIGFuIG9wZXJhdG9yIT0oKSBkZWNsYXJhdGlvbiBmb3IgQysrIGNvZGUuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICJpbXBvcnQiLCAiaW1wb3J0X3RlbXBsYXRlIiwgIm9wZXJhdG9yIiBhbmQKICAgICAgICAgICAgInRlbXBsYXRlIiBleGFtcGxlcy4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtdWx0aS1tb2R1bGUgc3VwcG9ydC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgbWlzc2luZyAiI2RlZmluZSBTV0lHX05PSU5DTFVERSIgYXQgdGhlIHRvcCBvZgogICAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdoZW4gdGhlICctYycgb3B0aW9uIGlzIHVzZWQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBDb3JyZWN0ZWQgYSBtaW5vciBvZmYtYnktb25lIGVycm9yIGZvciB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgICAgc3dpZ190eXBlc1tdIGFycmF5IHRoYXQncyBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIgY29kZS4KCjAyLzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgU0YgWyAjNTE1MDU4IF0gV3JvbmcgY29kZSBmb3IgQysrIHRlbXBsYXRlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KClZlcnNpb24gMS4zLjExIChKYW51YXJ5IDMxLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIGZvciBDKysgb2JqZWN0cyB0aGF0IGRlZmluZQogICAgICAgICAgICBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgQ2hhbmdlcyB0byB0aGUgdHlwZW1hcCBzeXN0ZW0KICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHdyYXAgQysrIG9iamVjdHMgd2l0aCBubyBkZWZhdWx0CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLiAgIFRoaXMgaGFzIGJlZW4gZml4ZWQsIGJ1dCB0aGUgc29sdXRpb24gCiAgICAgICAgICAgIGludm9sdmVzIHNvbWUgY2xldmVyIHRlbXBsYXRlIG1hZ2ljIGNvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBXaWxsaWFtIEZ1bHRvbi4gIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBmaWxlCiAgICAgICAgICAgIExpYi9zd2lnLnN3ZyBmb3IgZnVydGhlciBkZXRhaWxzLiAgVGhpcyBzb2x1dGlvbiBpcwogICAgICAgICAgICBleHBlcmltZW50YWwgYW5kIG1heSBiZSByZWZpbmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEdsb2JhbCB2YXJpYWJsZXMgYW5kIG1lbWJlciBkYXRhIG9mIHR5cGUgImNvbnN0IGNoYXIgKiIKICAgICAgICAgICAgY2FuIGJlIHNldCwgYnV0IHRoZSBvbGQgdmFsdWUgaXMgc2lsZW50bHkgZGlzY2FyZGVkIHdpdGhvdXQKICAgICAgICAgICAgYW55IGdhcmJhZ2UgY29sbGVjdGlvbi4gICBUaGlzIG1heSBnZW5lcmF0ZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgdG8gbW9yZSBzYWZlbHkgaGFuZGxlIHZhcmlhYmxlcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9vID0gIkhlbGxvIFdvcmxkXG4iOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCdzIG5vdCBzYWZlIHRvIGZyZWUgdGhlIG9sZCB2YWx1ZS4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgY2FuIGR5bmFtaWNhbGx5IGFsbG9jYXRlIGEgbmV3IHZhbHVlIGFuZCBtYWtlIGZvbyBwb2ludAogICAgICAgICAgICB0byBpdC4gICBUbyBmaXggdGhpcyBtZW1vcnkgbGVhaywgeW91IGNhbiBwcm9iYWJseSBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNsZWFyIGNvbnN0IGNoYXIgKmZvbzsKICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKiB7Y29uc3QgY2hhciAqZm9vfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbWlub3IgdHlwZW1hcCBlbmhhbmNlbWVudHMgaGF2ZSBiZWVuIGFkZGVkLiAgRmlyc3QsCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBieSBpbmNsdWRpbmcgYSBzcGVjaWFsCiAgICAgICAgICAgIHdhcm5pbmcgYXR0cmlidXRlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChpbix3YXJuaW5nPSJJJ20gZ29pbmcgdG8gZG8gc29tZXRoaW5nIGRhbmdlcm91cyIpIC4uLgoKICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZSB3aWxsIHNob3cgdXAgd2hlbmV2ZXIgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYXBwbGllZC4KCiAgICAgICAgICAgIFNlY29uZCwgYSB0eXBlbWFwIGNhbiBmb3JjZSBhIG5vLW1hdGNoIGJ5IGRlZmluaW5nCgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHNvbWV0eXBlICJwYXNzIjsKCiAgICAgICAgICAgIElmIHRoaXMgaXMgdXNlZCwgdGhlIHR5cGVtYXAgc3lzdGVtIHdpbGwgKm5vdCogcmVjb3JkIGEKICAgICAgICAgICAgdHlwZW1hcCBtYXRjaCBmb3IgInNvbWV0eXBlIi4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGJsb2NrCiAgICAgICAgICAgIHNlbGVjdGVkIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZGlzYWJsZQogICAgICAgICAgICBhIHR5cGVtYXAgZmVhdHVyZSBmb3Igc29tZSB0eXBlLCB5b3UgY291bGQgZG8gdGhpcy4KCiAgICAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBnbG9iYWwgdmFyaWFibGVzIG9mIHR5cGUgJ2NvbnN0IGNoYXIgKicgdG8gYmUgc2V0LgogICAgICAgICAgICAgICAldHlwZW1hcCh2YXJpbikgY29uc3QgY2hhciAqICJwYXNzIjsKCiAgICAgICAgICAgIEl0IG1pZ2h0IGFsc28gYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgdG8gZG8gc3VidGxlIGFuZAogICAgICAgICAgICBzdHJhbmdlIHRoaW5ncyB3aXRoIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICAgbWFrZSAnYmxhaCAqJyBhbiBvdXRwdXQgdmFsdWUgYW5kICdjb25zdCBibGFoIConIGFuIGlucHV0CiAgICAgICAgICAgIHBhcmFtZXRlciwgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBibGFoICooYmxhaCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBCbG9jayB1bnF1YWxpZmllZCB0eXBlbWFwcyBkZWZpbmVkIGFib3ZlICovCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGNvbnN0IGJsYWggKiAicGFzcyI7CiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgICAgIGNvbnN0IGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBpbnB1dCB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAoVGhpcyBwb3RlbnRpYWwgYXBwbGljYXRpb25zIG9mIHR5cGVtYXBzIHN1Z2dlc3RlZCBieSBHcmVnIFN0ZWluKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMjkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIGVudW1lcmF0aW9ucyB3ZXJlIHdyYXBwZWQgd2hlbiB0aGUgLXNoYWRvdyAKICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgowMS8yOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGFycmF5cyBhcmUgc3VjY2Vzc2Z1bGx5IHdyYXBwZWQuIEluIGZhY3QgdGhleSBzdGFydGVkCiAgICAgICAgICAgbW9zdGx5IHdvcmtpbmcgaW4gU1dJRy0xLjMuMTAuCgowMS8yOC8yMDAyOnJpY2hhcmRwCgkgICBBZGRlZCBmaXJzdCBhdHRlbXB0IGF0IEMrKyBhbmQgLXNoYWRvdyBzdXBwb3J0IGZvciBQSFA0IG1vZHVsZSwKCSAgIHBsZWFzZSB0ZXN0IGFuZCBtYWlsIG1lIGlmIGFueSBwcm9ibGVtcy9pZGVhcyBvbiBpbXByb3ZpbmcgaXQuCgoJICAgVGhlcmUgaXMgYSBrbm93biBwcm9ibGVtIHdpdGggdW5pbml0aWFsaXplZCBtZW1iZXIgdmFyaWFibGVzLAoJICAgcGxlYXNlIHNlZSBFeGFtcGxlcy9waHA0L3N5bmMvUkVBRE1FIGZvciBkZXRhaWxzLgoKCSAgIEFsc28gbW9yZSBQSFAgZG9jdW1lbnRhdGlvbiBhZGRlZCB0byBEb2MvTWFudWFsL1BocC5odG1sCgowMS8yNy8yMDAyOmJlYXpsZXkKICAgICAgICAgICBUaGUgQU5TSSBDIHNpemVfdCB0eXBlIGlzIG5vdyByZWNvZ25pemVkIGFzIGFuIGludGVnZXIgYnkgZGVmYXVsdC4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHN1cHBvcnQgYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgIFRoaXMgaXMgbm90IGEgcG9ydGFibGUgZmVhdHVyZSBhbmQgd2lsbCByZXF1aXJlIGNvbXBpbGVyIHN1cHBvcnQKICAgICAgICAgICBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiAgSW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBzdXBwb3J0CiAgICAgICAgICAgbG9uZyBsb25nIChlLmcuLCBUY2wgYW5kIFBlcmwpLCBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcKICAgICAgICAgICBvZiBkaWdpdHMuICBUaGlzIHByZXZlbnRzIHRoZWlyIHVzZSBpbiBhcml0aG1ldGljIGNhbGN1bGF0aW9ucywgYnV0CiAgICAgICAgICAgc3RpbGwgYWxsb3dzIHZhbHVlcyB0byBiZSBzZXQgZnJvbSBhIHN0cmluZy4gIAoKICAgICAgICAgICBsb25nIGxvbmcgc3VwcG9ydCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBzdHJ0b2xsKCkgYW5kIHN0cnRvdWxsKCkKICAgICAgICAgICBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgJ2xsZCcgYW5kICdsbHUnIGZvcm1hdCBzcGVjaWZpZXJzCiAgICAgICAgICAgb2Ygc3ByaW50ZigpLgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNTAxODI3IF0gRGVsZXRlIG1ldGhvZCBpcyBub3QgY2FsbGVkLiAgIFRoZSBUY2wKICAgICAgICAgICBtb2R1bGUgd2Fzbid0IGNvcnJlY3RseSBjYWxsaW5nIGRlc3RydWN0b3JzIHdoZW4gdGhleQogICAgICAgICAgIHdlcmUgZGVmaW5lZCB1c2luZyAlYWRkbWV0aG9kcy4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUmVpbmhhcmQgRm9iYmUuCgowMS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLiAgVHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gYSBudW1iZXIgb2YgbW9kdWxlcyBmb3IgaGFuZGxpbmcgdGhlc2UgdHlwZXMuCiAgICAgICAgICAgSW4gYWRkaXRpb24sIHRoZSBwYXJzZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYWNjZXB0IGxvbmcgbG9uZwogICAgICAgICAgIGxpdGVyYWxzIHN1Y2ggYXMgMTIzNExMIGFuZCAxMjM0VUxMLgoKMDEvMjcvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEEgQyBjaGFyW10gaXMgbWFwcGVkIHRvIGEgSmF2YSBTdHJpbmcgd2hpY2ggaXMgdGhlIGRlZmF1bHQgCiAgICAgICAgICAgU1dJRyBoYW5kbGluZyBvZiBjaGFyW10gYW5kIGNoYXIqLiBJdCB1c2VkIHRvIGJlIG1hcHBlZCB0byBieXRlW10uIAogICAgICAgICAgIE5vdGUgdGhhdCBhIEMgc2lnbmVkIGNoYXJbXSBhcnJheSBpcyBtYXBwZWQgdG8gYnl0ZVtdLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjAxLzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCByZXR1cm4tYnktdmFsdWUsIEMrKywgYW5kCiAgICAgICAgICAgb2JqZWN0cyB0aGF0IGRlZmluZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvZWwgUmVlZC4KCjAxLzI1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBPdmVyaGF1bCBvZiB0aGUgSmF2YSBtb2R1bGUuIFRoZSBDIGNvZGUgZ2VuZXJhdGlvbiBpcyBub3cgCiAgICAgICAgICAgZG9uZSBmcm9tIHR5cGVtYXBzLgoKMDEvMjQvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFN1cHBvcnQgZm9yIGFycmF5cyBvZiBlbnVtIHBvaW50ZXJzCgowMS8yMC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRXJyb3IgY2hlY2tpbmcgZm9yIG51bGwgSmF2YSBvYmplY3RzIGJlaW5nIHBhc3NlZCB0byBuYXRpdmUgCiAgICAgICAgICAgZnVuY3Rpb25zLiAgRXhjZXB0aW9uIHRocm93biBub3cgd2hlcmVhcyBiZWZvcmUgdGhlIEpWTSBjcmFzaGVkLgoKMDEvMTgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENvcnJlY3RlZCBiZWhhdmlvdXIgZm9yIGZ1bmN0aW9ucyB0aGF0IHRha2UgYXJyYXlzLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgd2hlbiB0aGlzIGMgZnVuY3Rpb246IAoKICAgICAgICAgICB2b2lkIGFycmF5Zm4oaW50IGFycmF5W10pOwogICAgICAgICAgIAogICAgICAgICAgIGlzIHdyYXBwZWQgdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGZ1bmN0aW9uCgogICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgYXJyYXlmbihpbnRbXSBhcnJheSk7CgogICAgICAgICAgIGlzIHByb2R1Y2VkLiBQcmV2aW91c2x5IGlmIHRoZSBDIGZ1bmN0aW9uIG1hZGUgYW55IGNoYW5nZXMgdG8gdGhlIAogICAgICAgICAgIGFycmF5IGVsZW1lbnRzLCB0aGVzZSB3ZXJlIG5vdCByZWZsZWN0ZWQgYmFjayBpbnRvIHRoZSBKYXZhIGFycmF5LiAKICAgICAgICAgICBUaGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQgc28gdGhhdCB0aGUgY2hhbmdlcyBhcmUgcHJvcG9nYXRlZCBiYWNrCiAgICAgICAgICAgdG8gSmF2YSBhbmQgdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2lsbCBzZWUgdGhlc2UgY2hhbmdlcy4gVGhpcyBpcyAKICAgICAgICAgICBob3cgcHVyZSBKYXZhIGZ1bmN0aW9ucyB3b3JrLCBpZSBhcnJheXMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuCgowMS8xNS8yMDAyOm1rb2VwcGUKICAgICAgICAgICBbR3VpbGVdIE5ldyBmaWxlIGNwbHVzcGx1cy5pIHdpdGggQysrIHR5cGVtYXBzIGNvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgTWFyY2lvIEx1aXMgVGVpeGVpcmEgPG1hcmNpb3RAaG9sbHkuY29sb3N0YXRlLmVkdT4uCgowMS8xMS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2hhbmdlZCBtYXBwaW5nIG9mIEMgbG9uZyB0byBKYXZhIHR5cGUuIFdhcyBtYXBwZWQgdG8gSmF2YQogICAgICAgICAgIGxvbmcsIG5vdyBtYXBwZWQgdG8gSmF2YSBpbnQuIElmIHlvdSB3YW50IHRoZSBwcmV2aW91cyBtYXBwaW5nIHRvIAogICAgICAgICAgIEphdmEgbG9uZyB1c2UgdGhpcyBhcHByb2FjaCBpbiB5b3VyIGludGVyZmFjZSBmaWxlOgogICAgICAgICAgIAogICAgICAgICAgICAgJWNsZWFyIGxvbmc7CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmcgICAgICAgICAgICAgImpsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmcgICAgICAgICAgICJsb25nIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nICAgICAgICAgICJsb25nIgoKICAgICAgICAgICAgICVjbGVhciBsb25nW0FOWV07CiAgICAgICAgICAgICAldHlwZW1hcChqbmkpIGxvbmdbQU5ZXSAgICAgICAgImpsb25nQXJyYXkiCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZ1tBTlldICAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZ1tBTlldICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGxvbmdbQU5ZXSAgICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgbG9uZ1tBTlldICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGxvbmdbQU5ZXSAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgbG9uZ1tBTlldICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIFRoaXMgbmV3IG1hcHBpbmcgaXMgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIGludGVyZmFjaW5nIHRvIDMyIGJpdCAKICAgICAgICAgICBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgMzItYml0IEpWTXMuIEZvciBmdXR1cmUgCiAgICAgICAgICAgNjQtYml0IEpWTXMgeW91IG1heSBoYXZlIHRvIGNoYW5nZSB0aGVzZSBtYXBwaW5ncyAtIGVnIG9uIFVuaXggTFA2NCAKICAgICAgICAgICBzeXN0ZW1zLCBidXQgbm90IG9uIE1pY3Jvc29mdCA2NGJpdCBXaW5kb3dzIHdoaWNoIHdpbGwgYmUgdXNpbmcgYSAKICAgICAgICAgICBQNjQgSUwzMiBtb2RlbC4gVGhpcyBtYXkgYmUgYXV0b21hdGVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgU1dJRy4KCjAxLzEwLzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgNTAxNjc3IF0gJWluaXQgYmxvY2sgaW4gd3JvbmcgcGxhY2UuIFJlcG9ydGVkCiAgICAgICAgICAgYnkgTHVpZ2kgQmFsbGFiaW8uCgowMS8wOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBzdXBwb3J0IGZvciB0aGUgbG9uZyBsb25nIHR5cGUuIHNpZ25lZCBsb25nIGxvbmcgaXMgCiAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBsb25nLiB1bnNpZ25lZCBsb25nIGxvbmcgaXMgbWFwcGVkIHRvIEJpZ0ludGVnZXIuCgowMS8wOS8yMDAyOmJlYXpsZXkKICAgICAgICAgICBFeHBlcmltZW50YWwgY2hhbmdlIHRvIHBhcnNlciB0byBiZXR0ZXIgc3VwcG9ydCBtaXhpbmcgb2YKICAgICAgICAgICBpbnQsIGxvbmcsIHNob3J0LCB1bnNpZ25lZCwgZmxvYXQsIGFuZCBkb3VibGUuICAgVGhlIHBhcnNlcgogICAgICAgICAgIHNob3VsZCBub3cgc3VwcG9ydCB0eXBlcyBsaWtlIHRoaXM6CiAgICAKICAgICAgICAgICAgICAgIHNob3J0IHVuc2lnbmVkIGludAogICAgICAgICAgICAgICAgaW50ICAgdW5zaWduZWQgc2hvcnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGludAogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNob3J0CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuYWJsZXMgYSB0eXBlIG9mICdsb25nIGRvdWJsZScgKHByZXZpb3VzbHkKICAgICAgICAgICAgdW5zdXBwb3J0ZWQpIHRvIGJlIHVzZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDYXN0aW5nIGZpeCBmb3Igd2hlbiBmdW5jdGlvbiByZXR1cm4gdHlwZSBpcyBhIHBvaW50ZXIgYXMgCiAgICAgICAgICAgcmVwb3J0ZWQgYnkgR2FyeSBQZW5uaW5ndG9uIDIwMDItMDEtMDUuIFRoZSB1cHBlciAzMmJpdHMgb2YgdGhlIAogICAgICAgICAgIDY0IGJpdCBqbG9uZyB3aWxsIGhhdmUgY29udGFpbmVkIGp1bmsgZm9yIDMyYml0IHBvaW50ZXJzLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEJldHRlciBwb2ludGVyIGhhbmRsaW5nIGluIEphdmEgaXMgcG9zc2libGUgYXMgdGhlIAogICAgICAgICAgIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGhhdmUgYmVlbiBhZGRlZCBpbnRvIHR5cGVtYXBzLmkuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gJG51bGwgY2FuIGJlIHVzZWQgaW4gaW5wdXQgdHlwZW1hcHMgdG8gcmV0dXJuIGVhcmx5IGZyb20gSk5JIAogICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGhhdmUgZWl0aGVyIHZvaWQgb3IgYSBub24tdm9pZCByZXR1cm4gdHlwZS4gRXhhbXBsZToKCiAgICAgICAgICAgICAldHlwZW1hcChjaGVjaykgaW50ICogJXsgCiAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICV9CgogICAgICAgICAgIElmIHRoZSB0eXBlbWFwIGdldHMgcHV0IGludG8gYSBmdW5jdGlvbiB3aXRoIHZvaWQgYXMgcmV0dXJuLCAkbnVsbCAKICAgICAgICAgICB3aWxsIGV4cGFuZCB0byBub3RoaW5nOgoKICAgICAgICAgICAgIHZvaWQgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKICAgICAgICAgICBvdGhlcndpc2UgJG51bGwgZXhwYW5kcyB0byB6ZXJvLCB3aGVyZSBqYXZhcmV0dXJudHlwZSBpcyBlaXRoZXIgYSAKICAgICAgICAgICBwb2ludGVyIG9yIGEgcHJpbWl0aXZlIHR5cGU6CgogICAgICAgICAgICAgamF2YXJldHVybnR5cGUgam5pX2ZuKC4uLikgewogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCjAxLzAyLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBUaGUgSmF2YSBtb2R1bGUgaW5jb3JyZWN0bHkgdXNlZCBhcmdvdXQgdHlwZW1hcHMgZm9yIAogICAgICAgICAgIHN0cmluZ3MuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCBhbmQgdGhlIGNvZGUgbm93IHJlc2lkZXMKICAgICAgICAgICBpbiB0aGUgZnJlZWFyZyB0eXBlbWFwLiBUaGUgYXJnb3V0IGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBzcGxpdCBpbnRvIAogICAgICAgICAgIGFyZ291dCBhbmQgZnJlZWFyZyB0eXBlbWFwcy4gVGhpcyBjb3JyZWN0aW9uIG1heSByZXF1aXJlIHNvbWUgdXNlciAKICAgICAgICAgICB3cml0dGVuIHR5cGVtYXBzIHRvIGJlIG1vZGlmaWVkLiAKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBNdWx0aSB0eXBlbWFwcyBub3cgd29ya2luZyBmb3IgSmF2YSBzZWUgbXVsdGltYXAgZXhhbXBsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyAtIGZyZWVhcmcgdHlwZW1hcCBjb2RlIHdhcyBhcHBlYXJpbmcKICAgICAgICAgICBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwuCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gSkNBTEwgbWFjcm8gZm9yIEpOSSBjYWxscyB0aGF0IHdvcmsgaW4gYm90aCBDIGFuZCBDKysgdHlwZW1hcHMKICAgICAgICAgICBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBKQ0FMTDAsIEpDQUxMMSwgSkNBTEwyLCBKQ0FMTDMgYW5kIEpDQUxMNCAKICAgICAgICAgICBtYWNyb3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSZXNvbHZlZCBzb21lIGluY29uc2lzdGVudCBiZWhhdmlvciB3aXRoICVyZW5hbWUgYW5kIGNsYXNzIHJlbmFtaW5nLgogICAgICAgICAgIElmIHlvdSBzcGVjaWZ5IHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICBCYXI7CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZW4gdGhlICVyZW5hbWUgZGlyZWN0aXZlIGFwcGxpZXMgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLAogICAgICAgICAgIGFuZCB0aGUgZGVzdHJ1Y3RvciAoYWxsIHdpbGwgYmUgcmVuYW1lZCB0byBGb28pLgoKICAgICAgICAgICBJZiBhIGNsYXNzIGRlZmluZXMgbW9yZSB0aGFuIG9uZSBjb25zdHJ1Y3RvciwgdGhlIG92ZXJsb2FkZWQgdmFyaWFudHMKICAgICAgICAgICBjYW4gc3RpbGwgYmUgcmVuYW1lZCBieSBzcGVjaWZ5aW5nIHBhcmFtZXRlcnMgdG8gJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXJlbmFtZShCYXJfY29weSkgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICAgQmFyKEJhciAmKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIG9kZCBjb3JuZXIgY2FzZXMuICBJZiB5b3Ugc3BlY2lmeQoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pIDo6QmFyOwoKICAgICAgICAgICB0aGVuIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIGNoYW5nZWQgYW5kIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCiAgICAgICAgICAgbmFtZXMgYXJlIGxlZnQgdW5tb2RpZmllZC4gIElmIHlvdSBzcGVjaWZ5IAoKICAgICAgICAgICAgICAgJXJlbmFtZShGb28pICo6OkJhcjsKCiAgICAgICAgICAgdGhlbiB0aGUgbmFtZXMgb2YgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZnVuY3Rpb25zIGFyZSBtb2RpZmllZCBidXQKICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgbm90LgoKMTIvMjEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIGpuaSwganR5cGUgYW5kIGpzdHlwZSB0eXBlbWFwcyBubyBsb25nZXIgaGFyZGNvZGVkIGJ1dCByZWFsIAogICAgICAgICAgIHR5cGVtYXBzLiBOZXcgdmFyaWFibGUgc3Vic3RpdHV0aW9uLCAkamF2YWNsYXNzbmFtZSwgY2FuIGJlIHVzZWQgaW4KICAgICAgICAgICB0aGUganN0eXBlIHR5cGVtYXBzLiBJdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBKYXZhIHNoYWRvdyBjbGFzcyBuYW1lCiAgICAgICAgICAgd2hlcmUgYXBwbGljYWJsZS4KICAgICAgICAgICBbSmF2YV0gRml4IGZvciByZWNlbnRseSBpbnRyb2R1Y2VkIGJ1ZyB0byBkbyB3aXRoIGluaGVyaXRhbmNlIHdoZW4gCiAgICAgICAgICAgdXNpbmcgJWltcG9ydC4KICAgICAgICAgICBbSmF2YV0gQSBmZXcgbW9yZSBidWcgZml4ZXMsIHRvZG8gd2l0aCAlcmVuYW1lIGFuZCB1c2luZyB0aGUga2luZAogICAgICAgICAgIHdpdGggdGhlIHR5cGUsIGVnIAogICAgICAgICAgIHZvaWQgZm4odW5pb24gdW5pIG15dW5pLCBzdHJ1Y3Qgc3RyIG15c3RyLCBjbGFzcyBjbCBteWNsKTsKCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ5NDUyNCBdIFByZXByb2Nlc3NvciBidWcgLSBhcG9zdHJvcGhlIGFuZCAjc3Vic3QuCgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBTV0lHX1ZFUlNJT04gcHJlcHJvY2Vzc29yIHN5bWJvbC4gICBUaGlzIGlzIGEgaGV4YWRlY2ltYWwKICAgICAgICAgICBpbnRlZ2VyIHN1Y2ggYXMgMHgwMTAzMTEgKGNvcnJlc3BvbmRpbmcgdG8gU1dJRy0xLjMuMTEpLiAgVGhpcyBjYW4KICAgICAgICAgICBiZSB1c2VkIGluIHRoZSBpbnRlcmZhY2UgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICNpZiBTV0lHX1ZFUlNJT04gPj0gMHgwMTAzMTEKICAgICAgICAgICAgICAgLyogVXNlIHNvbWUgZmFuY3kgbmV3IGZlYXR1cmUgKi8KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgIE5vdGU6IFRoZSB2ZXJzaW9uIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIFNXSUcKICAgICAgICAgICB3cmFwcGVyIGZpbGUuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEyLzIwLzIwMDE6bWtvZXBwZQoJICAgW016U2NoZW1lXTogUmVuYW1lZCBtenN3aWdfbWFrZV9ib29sZWFuIHRvCgkgICBzd2lnX21ha2VfYm9vbGVhbiwgYXMgdGhlIGxhdHRlciBpcyB1c2VkIGluIHRoZSB0eXBlbWFwcy4KCSAgIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMTIvMTcvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBSZXdyb3RlIGxpc3QtdmVjdG9yLmkgdXNpbmcgbXVsdGktZGlzcGF0Y2gKCSAgIHR5cGVtYXBzLiAgVXBkYXRlZCBwb2ludGVyLWluLW91dC5pLiAgTWFrZSB0aGUKCSAgIGRlcHJlY2F0ZWQgdHlwZW1hcC1zdWJzdGl0dXRpb24gb2YgIiRzb3VyY2UiIGluICJhcmdvdXQiCgkgICB3b3JrIGFzIGJlZm9yZS4KCjEyLzE2LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgbWFjcm9zICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAlbXVsdGlwbGVfdmFsdWVzIHRvIHVzZSB0aGUgcHJvcGVyICVwcmFnbWEgc3ludGF4LiAgTmV3CgkgICBHdWlsZSBleGFtcGxlL3Rlc3QgIm11bHRpdmFsdWUiOyBuZXcgR3VpbGUgcnVuLXRlc3QgZm9yCgkgICB0ZXN0LXN1aXRlIGl0ZW0gImxpc3QtdmVjdG9yIiAoY3VycmVudGx5IGJyb2tlbikuCgoxMi8xNC8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIHR5cGVtYXAtc3Vic3RpdGlvbiBidWcgZm9yICJ2YXJpbiIuICBSZWxheGVkCgkgICB2YWxpZC1pZGVudGlmaWVyIGNoZWNrIHRvIGFsbG93IGFsbCBSNVJTIGlkZW50aWZpZXJzLgoKClZlcnNpb24gMS4zLjEwIChEZWNlbWJlciAxMCwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgJXR5cGVtYXAgc28gdGhhdCAleyAuLi4gJX0gY2FuIGFsc28gYmUgdXNlZCBhcyBhCiAgICAgICAgICAgY29kZSBibG9jayAobW9zdGx5IGZvciBjb21wbGV0ZW5lc3MpLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAlewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoaXMgZm9ybSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBuZXcgYmxvY2sgc2NvcGUuICBBbHNvLCB0aGUKICAgICAgICAgICBjb2RlIGVuY2xvc2VkIGluICV7IC4uLiAlfSBpcyBub3QgcHJvY2Vzc2VkIGJ5IHRoZSBwcmVwcm9jZXNzb3IuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NTk2MTQgXSBTV0lHIHdpdGggbXVsdGlwbGUgVENMIGludGVycHJldGVycy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxNzE0MSBdIHJ1YnlkZWMuc3dnIGlzIHdyb25nCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgUGF1bCBCcmFubmFuLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDEwNTU3IF0gUHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIG9uIE5ULgogICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hZ251cyBManVuZy4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ0NTIzMyBdIEVuaGFuY2VtZW50OiBoYW5kbGUgYWNjZXNzIGNoYW5nZS4KICAgICAgICAgICBTV0lHIG5vdyBwYXJzZXMgKGJ1dCBpZ25vcmVzKSBDKysgYWNjZXNzIGNoYW5nZXMgZm9yIHRoZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZygpIHsgfQogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQSgpIHt9CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIGNsYXNzIEIgOiBwcml2YXRlIEEgewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgQigpIDogQSgpIHsgfQogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgQTo6c29tZXRoaW5nOyAgICA8LS0tLSBQYXJzZWQsIGJ1dCBpZ25vcmVkCiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtyenlzenRvZiBLb3ptaW5za2kuCgoxMi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBGaXggZm9yIFJ1YnkgdG8gd29yayB1c2luZyBWaXN1YWwgQysrLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDY1Njg3IF0gdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVycyBmYWlsLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4OTU5NCBdIFB5U3RyaW5nX0Zyb21TdHJpbmcgY2FuJ3QgdGFrZSBOVUxMIGFyZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2huIE1lcnJpdHQuICAgU1dJRyBub3cgY29udmVydHMgc3RyaW5nIHZhbHVlcwogICAgICAgICAgIHRvIFB5dGhvbiB1c2luZyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgcmVzdWx0b2JqID0gcmVzdWx0ID8gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXN1bHQpIDogUHlfQnVpbGRWYWx1ZSgiIik7CgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NjM1NjEgXSBUeXBlIGNvbnZlcnNpb25zIG5vdCBnZW5lcmF0ZWQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoJCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MDIxNyBdIFRjbCBkZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcyMDg4IF0gZGVmaW5lZChNQUNSTykgZXhwYW5kZWQgZXZlcnl3aGVyZS4KICAgICAgICAgICBFbWJlZGRlZCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBzdWNoIGFzCgogICAgICAgICAgICAgICUjaWYgZGVmaW5lZChGT08pCgogICAgICAgICAgIGFyZSBub3QgZXhwYW5kZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NjQ2NyBdIFByb2JsZW1zIHdpdGggI2RlZmluZSAmIGNvbW1hcy4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3NzU0NyBdIHdyb25nIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEJhZCBwcm90b3R5cGVzIGluIExpYi90Y2wvcHRybGFuZy5pLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDgzMTgyIF0gQ29uc3RhbnRzIGNhbiB0YWtlIGFyZ3MgYnkgbWlzdGFrZS4gCiAgICAgICAgICAgV2hlbiBzd2lnIC1wZXJsNSAtY29uc3QgaXMgdXNlZCwgY29uc3RhbnRzIGFyZSBkZWNsYXJlZAogICAgICAgICAgIHdpdGggYSB2b2lkIHByb3RvdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN1YiBJQ09OU1QgKCkgeyAkZXhhbXBsZWM6OklDT05TVCB9CgogICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBSaWNoIFdhbGVzLgoKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTmV3ICVleGNlcHRpb24gZGlyZWN0aXZlLiAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gcmVwbGFjZSAlZXhjZXB0LgogICAgICAgICAgIEl0IHdvcmtzIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGV4Y2VwdCBpdCBkb2VzIG5vdCBhY2NlcHQgYSAKICAgICAgICAgICBsYW5ndWFnZSBzcGVjaWZpZXIuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIGNhdGNoKFNvbWVFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIGVycm9yCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgJWV4Y2VwdGlvbiBpcyBhbHNvIG5hbWUgYXdhcmUtLS1hbGxvd2luZyBpdCB0byBiZSBhcHBsaWVkIHRvCiAgICAgICAgICAgc3BlY2lmaWMgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIGFueSBmdW5jdGlvbi9tZXRob2QgZm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIoZG91YmxlKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBleGNlcHRpb24gZm9yIG1ldGhvZCBiYXIoZG91YmxlKSBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgc2VtYW50aWNzIG9mIHRoaXMgbmFtZSBtYXRjaGluZyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3Vic3RhbnRpYWwgY2xlYW51cCBvZiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlLiAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICB1c2VkIHRvIGJlIGNyZWF0ZWQgaW4gdGhpcyByYXRoZXIgY29tcGxpY2F0ZWQgbWFubmVyIGludm9sdmluZyBhYm91dAogICAgICAgICAgIGEgaGFsZi1kb3plbiBzdHJpbmdzIGNyZWF0ZWQgaW4gYml0cyBhbmQgcGllY2VzLiAgIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gYSBtb3JlIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXItLWluIHRoZSBzYW1lCiAgICAgICAgICAgb3JkZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhlIG9yZGVyIGluIHdoaWNoIGRlY2xhcmF0aW9ucyBhcHBlYXIgaW4gdGhlIHNoYWRvdyBmaWxlIG1heSBkaWZmZXIuCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSAoJXsgLi4uICV9LCAlcnVudGltZSwgJWhlYWRlciwgJXdyYXBwZXIsIGV0Yy4pCiAgICAgICAgICAgY2FuIG5vdyBiZSB1c2VkIGluc2lkZSBvZiBhIGNsYXNzIGRlZmluaXRpb24uICAgVGhpcyBoYXMgcG90ZW50aWFsCiAgICAgICAgICAgdXNlcyB3aGVuIGdlbmVyYXRpbmcgc2hhZG93IGNsYXNzIGNvZGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJWluc2VydCgic2hhZG93IikgJXsKICAgICAgICAgICAgICAgICAjIFNvbWUgcHl0aG9uIGNvZGUKICAgICAgICAgICAgICAgICBkZWYgYmxhaChzZWxmKToKICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJJJ20gYmxhaCEiCiAgICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIHN1cHBvcnQgZm9yIGNsYXNzIGNvZGUgaW5zZXJ0aW9uIGRlcGVuZHMgb24gdGhlIGxhbmd1YWdlIG1vZHVsZS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgaW50ZW50IG9mIHRoaXMgZmVhdHVyZSBpcyB0byBzaW1wbGlmeSB0aGUgdGFzayBvZiBleHRlbmRpbmcKICAgICAgICAgICBzaGFkb3cgY2xhc3MgY29kZS4gICBJbiB0aGUgUHl0aG9uIG1vZHVsZSwgdGhpcyBpbnNlcnRzIGNvZGUgd2l0aCB0aGUKICAgICAgICAgICBwcm9wZXIgbGV2ZWwgb2YgaW5kZW5kYXRpb24gKHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3YXMgdXNlZCBpbiB0aGUgU1dJRwogICAgICAgICAgIGludGVyZmFjZSkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgSmF2YSBhbmQgUHl0aG9uIG1vZHVsZXMgdG8gd29yayBvbiBjeWd3aW4uCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSBhIGxvdCBvZiB0aGUgcHl0aG9uIG1vZHVsZSBoYXMgc3RhcnRlZCB0byBwcm9kdWNlcyBjb2RlIAogICAgICAgICAgIHdoaWNoIGNhbm5vdCBiZSBhdXRvLWltcG9ydGVkIHVzaW5nIGN5Z3dpbiBsaWJ0b29scyBzbyBtb3N0IG9mIGl0IGlzIAogICAgICAgICAgIHN0aWxsIGJyb2tlbi4KCjExLzI4LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAlcmVuYW1lIGFuZCAlZmVhdHVyZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIGluc2lkZQogICAgICAgICAgIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBmb28oaW50KTsKICAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBmb28oZG91YmxlKTsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gdGhpcyBtYW5uZXIsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBvbmx5IGFwcGxpZXMKICAgICAgICAgICB0byBtZW1iZXJzIG9mIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBhcHBlYXJzIGFzIHdlbGwgYXMgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzLiAgSW4gZmFjdCwgdGhpcyBpcyByZWFsbHkganVzdCB0aGUgc2FtZQogICAgICAgICAgIGFzIHNheWluZzoKCiAgICAgICAgICAgICAlcmVuYW1lKGZvb19pKSBGb286OmZvbyhpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgRm9vOjpmb28oZG91YmxlKTsKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHRoZSBleHBlcmltZW50YWwgJWZlYXR1cmUgZGlyZWN0aXZlLiAgJWZlYXR1cmUgY2FuIGJlCiAgICAgICAgICAgdXNlZCB0byBhdHRhY2ggYXJiaXRyYXJ5IHN0cmluZyBhdHRyaWJ1dGVzIHRvIHBhcnNlIHRyZWUgbm9kZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgYmxhaCB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgIHdoYXRldmVyOyAgICAgIAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSAqOjp4X3NldCAieCI7CgogICAgICAgICAgIG9yCgogICAgICAgICAgICAgICVmZWF0dXJlKCJibGFoIikgRm9vOjpiYXIoaW50LGRvdWJsZSkgY29uc3QgInNwYW0iOwoKICAgICAgICAgICBUaGUgc3ludGF4IGlzIGJvcnJvd2VkIGZyb20gdGhlICVyZW5hbWUgZGlyZWN0aXZlLiAgSW4gZmFjdCwgdGhlCiAgICAgICAgICAgZXhhY3Qgc2FtZSBzZW1hbnRpY3MgYXBwbHkgKGluaGVyaXRhbmNlLCBtYXRjaGluZywgZXRjLikuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGEgdmVyeSBwb3dlcmZ1bCBsb3ctbGV2ZWwgcHJpbWl0aXZlIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICBjdXN0b21pemUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIGFuZCB0byBwcm92aWRlIGhpbnRzIHRvIAogICAgICAgICAgIGFueSBzdGFnZSBvZiBjb2RlIGdlbmVyYXRpb24uICAgRmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvCiAgICAgICAgICAgcGFyc2UgdHJlZSBub2RlcyBhcyBhdHRyaWJ1dGVzIHdpdGggbmFtZXMgbGlrZSAiZmVhdHVyZToqIiB3aGVyZSAqIAogICAgICAgICAgIGlzIHJlcGxhY2VkIGJ5IHRoZSBmZWF0dXJlIG5hbWUgKGUuZy4sICJmZWF0dXJlOmV4Y2VwdCIsICJmZWF0dXJlOnNldCIsIAogICAgICAgICAgIGV0Yy4pLiAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIHRoZW4gbG9vayBmb3IgdGhlIGZlYXR1cmVzIHVzaW5nIAogICAgICAgICAgIGEgc2ltcGxlIGF0dHJpYnV0ZSBsb29rdXAuCgogICAgICAgICAgICVmZWF0dXJlIGlzIGludGVuZGVkIHRvIGJlIGEgcmVwbGFjZW1lbnQgZm9yIGEgbnVtYmVyIG9mCiAgICAgICAgICAgb2xkZXIgU1dJRyBkaXJlY3RpdmVzIGluY2x1ZGluZyAlZXhjZXB0IGFuZCBzcGVjaWFsaXplZAogICAgICAgICAgIHByYWdtYXMuIEl0IGlzIG1vcmUgcG93ZXJmdWwgKGR1ZSB0byBpdHMgcGFyYW1ldGVyaXplZAogICAgICAgICAgIG5hbWUgbWF0Y2hpbmcpIGFuZCBpdCBwcm92aWRlcyB2ZXJ5IHByZWNpc2UgY29udHJvbCBvdmVyCiAgICAgICAgICAgaG93IGN1c3RvbWl6YXRpb24gZmVhdHVyZXMgYXJlIGF0dGFjaGVkIHRvIGluZGl2aWR1YWwKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgVGhlcmUgYXJlIGZ1dHVyZSBleHBhbnNpb24gcGxhbnMgdGhhdCB3aWxsCiAgICAgICAgICAgYnVpbGQgdXBvbiB0aGlzIGNhcGFiaWxpdHkgYXMgd2VsbC4KCiAgICAgICAgICAgSXQncyBub3QgY2VydGFpbiB0aGF0ICVmZWF0dXJlIHdpbGwgZXZlciBiZSB1c2VkIGRpcmVjdGx5CiAgICAgICAgICAgYnkgU1dJRyB1c2Vycy4gIEluc3RlYWQsIGl0IG1heSBiZSBhIGxvdy1sZXZlbCBwcmltaXRpdmUKICAgICAgICAgICB0aGF0IGlzIHVzZWQgaW4gaGlnaC1sZXZlbCBtYWNybyBkZWZpbml0aW9ucy4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICB0byBzdXBwb3J0IHByb3BlcnRpZXMsIHlvdSBtaWdodCBkZWZpbmUgYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICVkZWZpbmUgJXByb3BlcnR5KG5hbWUsIHNldGYsIGdldGYpCiAgICAgICAgICAgJWZlYXR1cmUoInNldCIpIHNldGYgI25hbWU7CiAgICAgICAgICAgJWZlYXR1cmUoImdldCIpIGdldGYgI25hbWU7CiAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBXaGljaCBhbGxvd3MgYSB1c2VyIHRvIHNwZWNpZnkgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgJXByb3BlcnR5KHAsIGdldF9wLCBzZXRfcCk7CgogICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICBpbnQgIGdldF9wKCk7CiAgICAgICAgICAgICAgdm9pZCBzZXRfcChpbnQpOwogICAgICAgICAgIH07CgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgCjExLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBUY2wgbW9kdWxlIGhhcyBiZWVuIGV4cGFuZGVkIHdpdGggc29tZSBuZXcgZmVhdHVyZXMgZm9yCiAgICAgICAgICAgbWFuYWdpbmcgb2JqZWN0IG93bmVyc2hpcC4gIEZvciBleGFtcGxlOgogICAgICAgICAKICAgICAgICAgICAgICAgIHNldCBjIFtDaXJjbGUgLWFyZ3MgMjBdCiAgICAgICAgICAgICAgICAkYyBhcmVhICAgICAgICAgICAgICMgSW52b2tlIGEgbWV0aG9kCiAgICAgICAgICAgICAgICAkYyAtZGlzb3duICAgICAgICAgICMgUmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKICAgICAgICAgICAgICAgICRjIC1hY3F1aXJlICAgICAgICAgIyBBY3F1aXJlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAoKICAgICAgICAgICBJZiBUY2wgb3ducyB0aGUgb2JqZWN0LCBpdHMgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIHdoZW4gdGhlIAogICAgICAgICAgIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGNvbW1hbmQgaXMgZGVsZXRlZCBpbiBUY2wuICAKCiAgICAgICAgICAgVG8gc2ltcGxpZnkgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMsIHRoZSBmb2xsb3dpbmcgc3ludGF4CiAgICAgICAgICAgY2FuIGJlIHVzZWQ6CgogICAgICAgICAgICAgICAgJGMgLWRlbGV0ZSAgICAgICAgICMgRGVsZXRlIGFuIG9iamVjdAoKICAgICAgICAgICBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgbW9yZSBvYnNjdXJlIHZhcmlhbnQgb2YgCgogICAgICAgICAgICAgICAgcmVuYW1lICRjIHt9CgogICAgICAgICAgIFRoZXNlIGZlYXR1cmVzIGFsc28gYWRkIGZ1bmN0aW9uYWxpdHkgYXQgdGhlIEMgQVBJIGxldmVsLgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hbmFnZSBvd25lcnNoaXAgZnJvbSBDIGFuZAogICAgICAgICAgIGNhbiBiZSB1c2VkIGluIHR5cGVtYXBzLgoKICAgICAgICAgICAgICAgIFNXSUdfQWNxdWlyZSh2b2lkICpwdHIpOwogICAgICAgICAgICAgICAgU1dJR19EaXNvd24odm9pZCAqcHRyKTsKCiAgICAgICAgICAgQSBuZXcgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBpbnN0YW5jZXMgaXMgYWxzbyBhdmFpbGFibGU6CgogICAgICAgICAgICAgICAgVGNsX09iaiAqCiAgICAgICAgICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqKFRjbF9JbnRlcnAgKmludGVycCwgdm9pZCAqcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHlwZSwgaW50IG93bik7CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiBhIHR5cGVtYXAsIHRoaXMgY3JlYXRlcyBhIHBvaW50ZXIgb2JqZWN0IGFuZAogICAgICAgICAgIGFuIGludGVycHJldGVyIGNvbW1hbmQgdGhhdCBjYW4gYmUgdXNlZCB0byBpc3N1ZSBtZXRob2RzIGFuZAogICAgICAgICAgIGFjY2VzcyBhdHRyaWJ1dGVzIGFzIHNob3duIGFib3ZlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWxsIFB5dGhvbi1yZWxhdGVkICVwcmFnbWEgb3BlcmF0aW9ucyBoYXZlIGJlZW4gZWxpbWluYXRlZC4KICAgICAgICAgICBNb3N0IG9mIHRoZXNlIHdlcmUgd3JpdHRlbiBmb3Igb2xkZXIgU1dJRyB2ZXJzaW9ucyBpbiBvcmRlciB0bwogICAgICAgICAgIGNvbXBlbnNhdGUgZm9yIGxpbWl0YXRpb25zIGluIGVhcmxpZXIgcmVsZWFzZXMuICBJbiBhbiBlZmZvcnQKICAgICAgICAgICB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBjb2RlLWNsdXR0ZXIgYW5kIHBvdGVudGlhbCBmb3IgZXJyb3JzLAogICAgICAgICAgIGl0IGlzIGVhc2llciB0byBzaW1wbHkgZWxpbWluYXRlIHRoZSBwcmFnbWFzIGFuZCB0byBzdGFydCBvdmVyCiAgICAgICAgICAgKGlmIG5lZWRlZCkuICBUbyBiZSBob25lc3QsIEknbSBub3QgZXZlbiBzdXJlIHRoZSBwcmFnbWFzCiAgICAgICAgICAgd29ya2VkIGluIDEuMy45IGFuZCByZWNlbnQgcmVsZWFzZXMuCgogICAgICAgICAgIE5vdGU6IElmIHlvdSBuZWVkIHRvIGluc2VydCBjb2RlIGludG8gdGhlIHNoYWRvdyBjbGFzcyBmaWxlCiAgICAgICAgICAgY3JlYXRlZCBieSBTV0lHLCBzaW1wbHkgdXNlIHRoZSAlc2hhZG93IGRpcmVjdGl2ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVzaGFkb3cgJXsKICAgICAgICAgICAgICBkZWYgc29tZV9weXRob25fY29kZSgpOiAgICAgICAgIAogICAgICAgICAgICAgICAgICBwcmludCAiYmxhaCEiCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTd2VlcGluZyBjaGFuZ2VzIHRvIHRoZSB3YXkgaW4gd2hpY2ggdGhlIFB5dGhvbiBtb2R1bGUgaGFuZGxlcwogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLiAgIEluIGVhcmx5IGltcGxlbWVudGF0aW9ucywgc2hhZG93IGNsYXNzZXMgd2VyZQogICAgICAgICAgIG1lcmVseSBQeXRob24gd3JhcHBlcnMgYXJvdW5kIHR5cGVkIHBvaW50ZXIgb2JqZWN0cy4gSG93ZXZlciwgCiAgICAgICAgICAgc29tZSB1c2VycyBhY3R1YWxseSB3YW50ZWQgdG8gcmVjZWl2ZSB0aGUgc2hhZG93IGNsYXNzIG9iamVjdCBpbiBDLgogICAgICAgICAgIFRvIGFjY29tbW9kYXRlIHRoaXMsIHRoZSBkZXJlZmVyZW5jaW5nIG9mIHRoZSAidGhpcyIgcG9pbnRlciBpbgogICAgICAgICAgIGEgc2hhZG93IGNsYXNzIHdhcyBtb3ZlZCB0byBDIGFzIGRlc2NyaWJlZCBpbiBDSEFOR0VTIFs4LzgvOTldLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwcm9jZXNzIG9mIHJldHVybmluZyBwb2ludGVycyB0byBQeXRob24gd2FzIHN0aWxsCiAgICAgICAgICAgc29tZXdoYXQgcHJvYmxlbWF0aWMuICBTcGVjaWZpY2FsbHksIHNoYWRvdyBjbGFzc2VzIG5ldmVyIHdvcmtlZAogICAgICAgICAgIGluIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGVzZToKCiAgICAgICAgICAgICAtICAgVXNlIG9mIGFueSBraW5kIG9mIG91dHB1dCB0eXBlbWFwICgnb3V0JyBvciAnYXJnb3V0JykKICAgICAgICAgICAgIC0gICBHbG9iYWwgdmFyaWFibGVzIChicm9rZW4gYXMgZmFyIGFzIEkgY2FuIHRlbGwpLgoKICAgICAgICAgICBJbiB0aGUgcGFzdCwgc29tZSB1c2VycyBoYXZlIGRlYWx0IHdpdGggdGhpcyBieSBtYW51YWxseSB0cnlpbmcKICAgICAgICAgICB0byBjcmVhdGUgc2hhZG93IGNsYXNzIG9iamVjdHMgdGhlbXNlbHZlcyBmcm9tIEMvQysrLiAgSG93ZXZlciwKICAgICAgICAgICB0aGlzIHdhcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgQyB3cmFwcGVycyBkb24ndCByZWFsbHkga25vdyBob3cKICAgICAgICAgICB0byBnZXQgYWNjZXNzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBjbGFzcy4KCiAgICAgICAgICAgVGhlIFB5dGhvbiBtb2R1bGUgaGFzIG5vdyBiZWVuIG1vZGlmaWVkIHRvIGF1dG9tYXRpY2FsbHkgYXR0YWNoCiAgICAgICAgICAgc2hhZG93IGNsYXNzIG9iamVjdHMgdG8gcG9pbnRlcnMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCB0byAKICAgICAgICAgICBQeXRob24uICAgVGhpcyBwcm9jZXNzIG9jY3VycyBpbiB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqKCkKICAgICAgICAgICBzbyB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHVzZXJzLiAgICBBcyBhIHJlc3VsdCwKICAgICAgICAgICBzaGFkb3cgY2xhc3NlcyBhcmUgbm93IG1vcmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIHdpdGggdHlwZW1hcHMKICAgICAgICAgICBhbmQgb3RoZXIgZmVhdHVyZXMgb2YgU1dJRy4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGludHJvZHVjZSBhIG51bWJlciBvZiBpbmNvbXBhdGliaWxpdGllcy4gIFRoZQogICAgICAgICAgIFNXSUdfTmV3UG9pbnRlck9iaigpIG5vdyB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgIm93biIgdG8gCiAgICAgICAgICAgaW5kaWNhdGUgb2JqZWN0IG93bmVyc2hpcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHBvaW50ZXIKICAgICAgICAgICB0byBQeXRob24gdGhhdCBQeXRob24gc2hvdWxkIGRlc3Ryb3kuICAgSW4gYWRkaXRpb24sIG9sZGVyIGNvZGUKICAgICAgICAgICB0aGF0IHRyaWVzIHRvIG1hbnVhbGx5IGNvbnN0cnVjdCBzaGFkb3cgY2xhc3Mgb2JqZWN0cyBvciB3aGljaAogICAgICAgICAgIGV4cGVjdHMgYmFyZSBwb2ludGVycyBtYXkgYnJlYWstLS1zdWNoIHBvaW50ZXJzIG1heSBhbHJlYWR5IGJlCiAgICAgICAgICAgZW5jYXBzdWxhdGVkIGJ5IGEgc2hhZG93IGNsYXNzLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVpbnNlcnQgZGlyZWN0aXZlIHRvIGFjY2VwdCBzaW5nbGUgYnJhY2VzIHsgLi4uIH0uCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluc2VydCgiaGVhZGVyIikgewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJXsgLi4uICV9IGV4Y2VwdCB0aGF0IHRoZSBjb2RlIGluIHRoZQogICAgICAgICAgIGJyYWNlcyBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIHByZXByb2Nlc3Nvci4gICBUaGlzIGNhbiBiZSB1c2VmdWwKICAgICAgICAgICBpbiBjZXJ0YWluIGNvbnRleHRzIHN1Y2ggYXMgbG93LWxldmVsIGNvZGUgZ2VuZXJhdGlvbiBpbiAKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIG5vdyB0cmFuc2xhdGVkIGludG8gcHJlcHJvY2Vzc29yCiAgICAgICAgICAgc3ltYm9scy4gIEZvciBleGFtcGxlOgoJCiAgICAgICAgICAgICAgLi9zd2lnIC1weXRob24gLXNoYWRvdyAtbW9kdWxlIGJsYWggaW50ZXJmYWNlLmkKCiAgICAgICAgICAgQ3JlYXRlcyB0aGUgc3ltYm9sczoKCiAgICAgICAgICAgICAgU1dJR09QVF9QWVRIT04gMQogICAgICAgICAgICAgIFNXSUdPUFRfU0hBRE9XIDEKICAgICAgICAgICAgICBTV0lHT1BUX01PRFVMRSBibGFoCiAgICAgICAgICAgICAgCiAgICAgICAgICAgTW9kdWxlcyBjYW4gbG9vayBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbHRlciB0aGVpciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBpZiBuZWVkZWQuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIFBlcmw1IG1vZHVsZS4gIEEgbG90IG9mIGNvZGUgZ2VuZXJhdGlvbiBpcwogICAgICAgICAgIG5vdyBkcml2ZW4gYnkgdGFibGVzIGFuZCB0eXBlbWFwcy4gICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSAKICAgICAgICAgICBhbHNvIG1ha2VzIHVzZSBvZiB0YWJsZXMgdG8gaW5zdGFsbCBjb25zdGFudHMsIHZhcmlhYmxlcywgYW5kCiAgICAgICAgICAgZnVuY3Rpb25zIGluc3RlYWQgb2YgaW5saW5pbmcgYSBidW5jaCBvZiBwcm9jZWR1cmUgY2FsbHMuICBUaGUKICAgICAgICAgICBzZXBhcmF0ZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBnb25lLiAgIE1vc3QKICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24gaXMgY29udHJvbGxlZCB2aWEgdGhlIHBlcmw1LnN3ZyBmaWxlIGluIHRoZQogICAgICAgICAgIGxpYnJhcnkuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgCjExLzEzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlIEMrKyB0eXBlbmFtZSBrZXl3b3JkLiAgUHJpbWFyaWx5IHRoaXMKICAgICAgICAgICBpcyBhZGRlZCB0byBiZXR0ZXIgc3VwcG9ydCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkICBibGFoKEMmIHYpIHsKICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjppdGVyYXRvciBpID0gdi5iZWdpbigpOwogICAgICAgICAgICAgfQoKICAgICAgICAgICBOb3RlOiB0eXBlbmFtZSBpcyBzdXBwb3J0ZWQgaW4gdGhlIHBhcnNlciBpbiB0aGUgc2FtZSB3YXkgYXMgJ3N0cnVjdCcKICAgICAgICAgICBvciAnY2xhc3MnLiAgWW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2UgaXQgYW55d2hlcmUgZXhjZXB0IGluIHRlbXBsYXRlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGUgQVBJLiAgIE1vc3QgZnVuY3Rpb25zIG5vdwogICAgICAgICAgIHVzZSBhIGNvbW1vbiwgdmVyeSBzaW1wbGUsICBBUEkuICAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YKICAgICAgICAgICBpbnRlcmVzdGluZyBzZW1hbnRpYyBzaWRlLWVmZmVjdHMgb2YgaG93IGNvZGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkLgogICAgICAgICAgIERldGFpbHMgd2lsbCBiZSBmb3J0aGNvbWluZyBpbiBEb2MvTWFudWFsL0V4dGVuZGluZy5odG1sLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogTGFuZ3VhZ2UgbW9kdWxlcyB3cml0dGVuIGZvcgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgd2lsbCBubyBsb25nZXIgd29yaywKCjExLzEwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgdmVyeSBzdWJ0bGUgYnVnIGR1ZSB0byB1bm5hbWVkIGNsYXNzIHdyYXBwaW5nLiBGb3IgZXhhbXBsZSwgaWYKICAgICAgICAgICB5b3UgZGlkIHRoaXMKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgeCx5OwogICAgICAgICAgICAgIH0gZ2RQb2ludCwgKmdkUG9pbnRQdHI7CgogICAgICAgICAgICAgIHZvaWQgZm9vKGdkUG9pbnRQdHIgeCk7CgogICAgICAgICAgIFRoZW4gdGhlIGZvbyBmdW5jdGlvbiB3b3VsZCBnZXQgYSB0eXBlLWVycm9yLiAgIFRoZSBwcm9ibGVtIGhhcwogICAgICAgICAgIHRvIGRvIHdpdGggaW50ZXJuYWwgdHlwZWRlZiBoYW5kbGluZyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgdHlwZWRlZgogICAgICAgICAgIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgc3RydWN0IGFwcGVhciBsYXRlciBpbiB0aGUgcGFyc2UgdHJlZS4KICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZpbiBKb3Zhbm92aWMuCgoxMS8wOS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvICJvdXQiIHR5cGVtYXBzIChhbmQgcmVsYXRlZCB2YXJpYXRpb25zKS4gIFRoZSBuYW1lCiAgICAgICAgICAgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcCBpcyBub3cgdGhlIHJhdyBDIGlkZW50aWZpZXIgdGhhdAogICAgICAgICAgIGFwcGVhcnMgb24gYSBkZWNsYXJhdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vKCk7ICAgIC8vIHR5cGVtYXAgZ2V0cyBhcHBsaWVkCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgbmV2ZXIgcmVhbGx5IHNwZWNpZmllZCBob3cgdGhpcyB3YXMgc3VwcG9zZWQgdG8KICAgICAgICAgICB3b3JrLiAgSW4gU1dJRzEuMSwgeW91IGNvdWxkIHByb2JhYmx5IHdyaXRlIGEgdHlwZW1hcCBmb3IgdGhlCiAgICAgICAgICAgd3JhcHBlciBuYW1lIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBCbGFoX2ZvbyB7IC4uLiB9CgogICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgb2xkIGJlaGF2aW9yIGlzIG5vdyB3aXRoZHJhd24gYW5kIG5vdCBzdXBwb3J0ZWQuIAogICAgICAgICAgIEp1c3QgdXNlIHRoZSBtZW1iZXIgbmFtZSB3aXRob3V0IGFueSBzb3J0IG9mIHNwZWNpYWwgcHJlZml4LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBUY2wgbW9kdWxlIGluaXRpYWxpemF0aW9uOgoKICAgICAgICAgICAoMSkgU1dJRyBub3cgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29kZSBuZWVkZWQgdG8gd29yayB3aXRoCiAgICAgICAgICAgICAgICBUY2wgc3R1YnMuICBTaW1wbHkgY29tcGlsZSB3aXRoIC1EVVNFX1RDTF9TVFVCUy4KCiAgICAgICAgICAgKDIpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgY2FsbHMgVGNsX1BrZ1Byb3ZpZGUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgICAgYSBwYWNrYWdlIG5hbWUuICBUaGUgcGFja2FnZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lCiAgICAgICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gIFRoZSB2ZXJzaW9uIG51bWJlciBpcwogICAgICAgICAgICAgICBzZXQgdG8gIjAuMCIgYnkgZGVmYXVsdC4gIFRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIsIHVzZQogICAgICAgICAgICAgICBzd2lnIC1wa2d2ZXJzaW9uIDEuMiBpbnRlcmZhY2UuaS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgTW9kdWxlcyB0aGF0IHByb3ZpZGVkIHN0dWJzIGFuZCBUY2xfUGtnUHJvdmlkZSBvbiB0aGVpciBvd24gbWlnaHQKICAgICAgICAgICBicmVhay4gIFNpbXBseSByZW1vdmUgdGhhdCBjb2RlLgoKMTEvMDUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCBjb2RlIGdlbmVyYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBUY2wgbW9kdWxlLiAgQ29uc3RhbnRzCiAgICAgICAgICAgYXJlIG5vdyBzdG9yZWQgaW4gYSBsYXJnZSB0YWJsZSB0aGF0IGdldCBpbnN0YWxsZWQgYXQgbW9kdWxlIHN0YXJ0dXAuCiAgICAgICAgICAgVGhlcmUgYXJlIGFsc28gbm8gbG9uZ2VyIGFueSBzdGF0aWMgdmFyaWFibGVzIHNvIGl0IHNob3VsZCBnZW5lcmF0ZQogICAgICAgICAgIHNvbWV3aGF0IGxlc3MgY29kZS4KCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAiY29uc3QiIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byAiY29uc3RhbnQiIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzLiAgImNvbnN0IiBpcyBhIEMga2V5d29yZCB3aGljaCBtYWRlIHRoZSBoYW5kbGluZyBvZiB0aGUgdHlwZW1hcAogICAgICAgICAgIGRpcmVjdGl2ZSBzb21ld2hhdCBhd2t3YXJkIGluIHRoZSBwYXJzZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICAldHlwZW1hcCBkaXJlY3RpdmUgY2FuIG5vdyBhY2NlcHQgbmVhcmx5IGFyYml0cmFyeSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLHBhcnNlPSJpIixkb2M9ImludGVnZXIiKSBpbnQgIi4uLiI7CgogICAgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBrZXl3b3JkIHBhcmFtZXRlcnMgaXMgdG8gc3VwcGx5IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGhpbnRzIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbW9kdWxlLiAgIFRoZSBpbnRlcHJldGF0aW9uIG9mIHRoZQogICAgICAgICAgIHBhcmFtZXRlcnMgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IHNlbWFudGljIGNoYW5nZSB0byBpbnRlcm5hbCBjYWxsL3JldHVybiBieSB2YWx1ZSBoYW5kbGluZy4KICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBjYWxsLWJ5LXZhbHVlIHdhcyB0cmFuc2xhdGVkCiAgICAgICAgICAgaW50byBwb2ludGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciBhLCBWZWN0b3IgYik7CgogICAgICAgICAgIHR1cm5lZCBpbnRvIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoKmEsKmIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgdHJhbnNsYXRpb24gd2FzIG5vcm1hbGx5IHBlcmZvcm1lZCBieSB0aGUgU1dJRyBjb3JlLCBvdXRzaWRlCiAgICAgICAgICAgb2YgdGhlIGNvbnRyb2wgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEhvd2V2ZXIsIGEgc2lkZSBlZmZlY3QKICAgICAgICAgICBvZiB0aGlzIHdhcyBhIGxvdCBvZiBiaXphcnJlIHR5cGVtYXAgYmVoYXZpb3IuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgaWYgeW91IGRpZCBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFlvdSB3b3VsZCBmaW5kIHRoYXQgaW50MzIgd2FzIHRyYW5zZm9ybWVkIGludG8gYSBwb2ludGVyIGV2ZXJ5d2hlcmUhCiAgICAgICAgICAgKG5lZWRsZXNzIHRvIHNheSwgc3VjaCBiZWhhdmlvciBpcyB1bmV4cGVjdGVkIGFuZCBxdWl0ZSBhd2t3YXJkIHRvCiAgICAgICAgICAgZGVhbCB3aXRoKS4gIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgaWYgYSB0eXBlZGVmIHdhcyBhbHNvIHVzZWQsCiAgICAgICAgICAgdGhlIHBvaW50ZXIgYmVoYXZpb3Igc3VkZGVubHkgZGlzYXBwZWFyZWQuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgcG9pbnRlciB0cmFuc2Zvcm1hdGlvbiBpcyBub3cgcHVzaGVkIHRvIHRoZQogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuICAgVGhpcyBwcm9kdWNlcyB3cmFwcGVycyB0aGF0IGxvb2sgcm91Z2hseQogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcxID0gKmE7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcyID0gKmI7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUgdHlwZW1hcHMgZm9yCiAgICAgICAgICAgYXJiaXRyYXJ5IHVuZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRvIHRoaXMgKGFuZCBpdAogICAgICAgICAgIHdpbGwgd29yayByZWdhcmRsZXNzIHdoYXQgaW50MzIgaXMpOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgJDEgPSAoaW50MzIpIFB5SW50X0FzTG9uZygkaW5wdXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU1DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjYWxsL3JldHVybiBieSB2YWx1ZSBjb2RlIGdlbmVyYXRpb24gaW4KICAgICAgICAgICBzb21lIGxhbmd1YWdlIG1vZHVsZXMuCgoxMS8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHR5cGVtYXBzIHRvIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICB7IAogICAgICAgICAgICAgICAgICAgLi4uIGFuIG9iamVjdCAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICogewogICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICYgewogICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgZW51bSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgIC4uLiBhbiBlbnVtIHZhbHVlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKENMQVNTOjoqKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gcG9pbnRlciB0byBtZW1iZXIgLi4uCiAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgIFRoZXNlIHR5cGVzIGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgdHlwZXMgdGhhdCBkb24ndCBtYXRjaAogICAgICAgICAgIGFueXRoaW5nIGVsc2UuICBTZWUgQ0hBTkdFUyBsb2cgZW50cnkgZm9yIDgvMjcvMjAwMCBmb3IgdGhlCiAgICAgICAgICAgb2xkIGJlaGF2aW9yLiAgVGhlIHJvbGUgb2YgdGhlc2UgdHlwZXMgaXMgYWxzbyBkZXNjcmliZWQgaW4gCiAgICAgICAgICAgRG9jL01hbnVhbC9UeXBlbWFwcy5odG1sCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgCjEwLzI1LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIEd1aWxlIGFuZCBNenNjaGVtZSBtb2R1bGVzIHRvIHN1cHBvcnQKICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBGaXggdG8gaGFuZGxlIHBvaW50ZXJzIHRvIGFycmF5cy4KCjEwLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIERlZmluaW5nIGEgdHlwZW1hcCBydWxlIGZvciBlbnVtIFNXSUdFTlVNIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgIHRvIGRlZmluZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlbnVtIHZhcmlhYmxlcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJ1YnkgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgUnVieSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZnVuY3Rpb25zIHdpdGggYW4gYXJiaXRyYXJ5CiAgICAgICAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFByZXZpb3VzIHZlcnNpb25zIHdlcmUgbGltaXRlZCB0byAKICAgICAgICAgICB0byBmdW5jdGlvbnMgd2l0aCBvbmx5IDkgb3IgMTYgYXJndW1lbnRzIGRlcGVuZGluZyBvbgogICAgICAgICAgIHRoZSB1c2Ugb2YgZGVmYXVsdCBhcmd1bWVudHMuICAgTm90ZTogZnJvbSBzb21lIGluc3BlY3Rpb24KICAgICAgICAgICBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBzb3VyY2UsIHRoZSBuZXcgYXBwcm9hY2ggbWlnaHQgYmUKICAgICAgICAgICBhIGxpdHRsZSBmYXN0ZXIgYXMgd2VsbC4KCjEwLzE4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgdGVtcGxhdGVzLgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gPFMsVD47CgogICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBJcmluYSBLb3Rsb3ZhLgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMgYWRkZWQuICBUaGUgdHlwZW1hcHMKICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBzeW50YXggYmVsb3cuICAgV2l0aGluIGVhY2gKICAgICAgICAgICB0eXBlbWFwLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgJGFyZzsgIC8vIFRoZSBpbnB1dCBvYmplY3QgaW4gdGhlIHRhcmdldCBsYW5ndWFnZQogICAgICAgICAgICAgICAgICAkMTsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3IgZmlyc3QgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDI7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIHNlY29uZCBhcmd1bWVudAoKICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgdmFyaWFibGVzIHJlZmVyIHRvIGVpdGhlciBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMV90eXBlLCAkMV9sdHlwZSwgJDFfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ2MpCiAgICAgICAgICAgICAgICAgICQyX3R5cGUsICQyX2x0eXBlLCAkMl9iYXNldHlwZSwgZXRjLi4uICAoYXJndltdKQoKICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgZGltZW5zaW9uIG9mIGFyZ3YKICAgICAgICAgICAgICAgICAgJDJfZGltMAogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgQmFzaWNhbGx5IGFueSB2YXJpYWJsZSB0aGF0IHdhcyBhdmFpbGFibGUgaW4gbm9ybWFsIHR5cGVtYXBzCiAgICAgICAgICAgaXMgYXZhaWxhYmxlIGZvciBlaXRoZXIgYXJndW1lbnQgYnkgcHJlZmFjaW5nIHRoZSB2YXJpYWJsZQogICAgICAgICAgIG5hbWUgYnkgJyRuXycgd2hlcmUgbiBpcyB0aGUgYXJndW1lbnQgcG9zaXRpb24uCgogICAgICAgICAgIE5vdGVzOiAgCiAgICAgICAgICAgKDEpIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgc2luZ2xlCiAgICAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgICAgeW91IGNhbiBzcGxpdCBhIHN0cmluZyBpbnRvIGEgKGNoYXIgKiwgaW50KSBwYWlyIG9yCiAgICAgICAgICAgICAgIHNwbGl0IGEgbGlzdCBpbnRvIGEgKGludCwgY2hhciBbXSkgcGFpci4gIEl0IGlzIG5vdAogICAgICAgICAgICAgICBwb3NzaWJsZSB0byBtYXAgbXVsdGlwbGUgb2JqZWN0cyB0byBtdWx0aXBsZSBhcmd1bWVudHMuCgogICAgICAgICAgICgyKSBUbyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgU1dJRyB2ZXJzaW9ucywgdGhlCiAgICAgICAgICAgICAgIHZhcmlhYmxlcyBzdWNoIGFzICR0YXJnZXQgYW5kICR0eXBlIGFyZSBwcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgIGFyZSBtYXBwZWQgb250byB0aGUgZmlyc3QgYXJndW1lbnQgb25seS4KCiAgICAgICAgICAgKDMpIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUuCiAgICAgICAgICAgICAgIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBhcmUgYW4gZXh0ZW5zaW9uIHRvIHR5cGVtYXAgaGFuZGxpbmcuCiAgICAgICAgICAgICAgIFNpbmdsZSB2YWx1ZWQgdHlwZW1hcHMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgdXN1YWwKICAgICAgICAgICAgICAgd2F5LgoKICAgICAgICAgICBUaGUgb2xkICRzb3VyY2UgYW5kICR0YXJnZXQgdmFyaWFibGVzIGFyZSBvZmZpY2lhbGx5CiAgICAgICAgICAgZGVwcmVjYXRlZC4gIElucHV0IHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoCiAgICAgICAgICAgJGFyZyQgYW5kIG91dHB1dCB2YWx1ZXMgYXJlIHJlZmVyZW5jZSB0aHJvdWdoICRyZXN1bHQkLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzLiAgVGhlIHN5bnRheAogICAgICAgICAgIGlzIGEgbGl0dGxlIGZ1bmt5LCBidXQgaGVyZSBnb2VzOgoKICAgICAgICAgICAgICAvLyBEZWZpbmUgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIE11bHRpdmFsdWVkIHR5cGVtYXAgd2l0aCBsb2NhbHMKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgLy8gQ29weSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpID0gKGludCBhcmdjLCBjaGFyICphcmd2W10pOwoKICAgICAgICAgICAgICAvLyBBcHBseSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAlYXBwbHkgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpIH07CgogICAgICAgICAgIE5vdGU6IHRoaXMgZXh0cmEgcGFyc2luZyBzdXBwb3J0IGlzIGFkZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uLgogICAgICAgICAgIE5vIGxhbmd1YWdlIG1vZHVsZXMgY3VycmVudGx5IHN1cHBvcnQgbXVsdGktdmFsdWVkIHR5cGVtYXBzLgoKMTAvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWF0Y2hpbmcgY29kZSB0byBkaXNjYXJkIHF1YWxpZmllcnMgd2hlbgogICAgICAgICAgIGNoZWNraW5nIGZvciBhIG1hdGNoLiAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgY2hhciAqeCk7CgogICAgICAgICAgIFRoZSB0eXBlbWFwIGNoZWNrZXIgY2hlY2tzIGZvciBhIG1hdGNoIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CgogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIElmIHR5cGVkZWYncyBhcmUgaW52b2x2ZWQsIHF1YWxpZmllciBzdHJpcHBpbmcgb2NjdXJzIGJlZm9yZQogICAgICAgICAgIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFNvIGlmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgKnN0cmluZzsKICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBzdHJpbmcgeCk7CgogICAgICAgICAgIHR5cGVtYXAgY2hlY2tpbmcgd291bGQgYmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgeAogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nCiAgICAgICAgICAgICAgICBzdHJpbmcgeAogICAgICAgICAgICAgICAgc3RyaW5nCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXaXRob3V0IHF1YWxpZmllciBzdHJpcHBpbmcsIG9uZSBoYXMgdG8gd3JpdGUKICAgICAgICAgICBzZXBlcmF0ZSB0eXBlbWFwcyBmb3IgYWxsIHZhcmlhdGlvbnMgb2YgY29uc3QgYW5kIHZvbGF0aWxlICh3aGljaAogICAgICAgICAgIGlzIGEgcGFpbikuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVHlwZW1hcHMgbWlnaHQgYmUgYXBwbGllZCBpbgogICAgICAgICAgIHBsYWNlcyB3aGVyZSB0aGV5IHdlcmVuJ3QgYmVmb3JlLgoKCjEwLzkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IGRpc2FtYmlndWF0ZQogICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IG9ubHkgdmFyeSBpbiBjb25zdG5lc3MuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIGhhbmRsZSB0aGlzLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgbm9ybWFsbHkuCiAgICAgICAgICAgCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaF9jb25zdCkgYmxhaCgpIGNvbnN0OwoKICAgICAgICAgICBJbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSwgbWV0aG9kIGNhbGxzIGxpa2UgdGhpcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgKG9iaiktPmJsYWgoKSAgICAgICAgICAgICAgIC8vIE5vbi1jb25zdCB2ZXJzaW9uCiAgICAgICAgICAgICAgICgoRm9vIGNvbnN0ICopb2JqKS0+YmxhaCgpICAvLyBjb25zdCB2ZXJzaW9uCgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZvcmNlIHRoZSByaWdodCBtZXRob2QgdG8gYmUgaW52b2tlZC4KICAgICAgICAgICBBZG1pdHRlZGx5LCB0aGlzIGlzIHByb2JhYmx5IG9ic2N1cmUsIGJ1dCB3ZSBtaWdodAogICAgICAgICAgIGFzIHdlbGwgZ2V0IGl0IHJpZ2h0LgoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciBub3cgaWdub3JlcyAnXHInIGluIHRoZSBpbnB1dC4KICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggdGhlIGZvbGxvd2luZyBidWc6CiAgICAgICAgICAgWyAjNDY4NDE2IF0gU1dJRyB0aGlua3MgbWFjcm8gZGVmcyBhcmUgZGVjbGFyYXRpb25zPwoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgfHwsICYmLCBhbmQgISBpbiBjb25zdGFudHMuICBUaGlzCiAgICAgICAgICAgZml4ZXMgU0YgWyAjNDY4OTg4IF0gTG9naWNhbCBvcHMgYnJlYWsgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIEhvd2V2ZXIsIGF0IHRoaXMgdGltZSwgY29uc3RhbnRzIHVzaW5nIHRoZXNlIG9wZXJhdG9ycwogICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkICh0aGUgcGFyc2VyIHdpbGwgaXNzdWUgYSB3YXJuaW5nKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIC1zaG93X3RlbXBsYXRlcyBjb21tYW5kIGxpbmUgb3B0aW9uLiAgVGhpcyBtYWtlcwogICAgICAgICAgIFNXSUcgZGlzcGxheSB0aGUgY29kZSBpdCBhY3R1YWxseSBwYXJzZXMgdG8gZ2VuZXJhdGUKICAgICAgICAgICB0ZW1wbGF0ZSB3cmFwcGVycy4gIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gc2VtYW50aWNzIG9mICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBXaGVuCiAgICAgICAgICAgdXNpbmcgJXRlbXBsYXRlLCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkCiAgICAgICAgICAgYXMgdHlwZXMgYnkgZGVmYXVsdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgIFRvIHNwZWNpZnkgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzICpub3QqIGEgdHlwZSwgeW91CiAgICAgICAgICAgbmVlZCB0byB1c2UgZGVmYXVsdC12YWx1ZSBzeW50YXguIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQsaW50PTUwPjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3RvcjxpbnQsc2l6ZT0xMDA+OwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0dGVyLS1vbmx5CiAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgKGUuZy4sIDUwLCAxMDApIGlzIHVzZWQgZHVyaW5nCiAgICAgICAgICAgZXhwYW5zaW9uLiAgVGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIEMrKywgYnV0IEkgY291bGRuJ3QKICAgICAgICAgICBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBkbyBpdCBpbiB0aGUgcGFyc2VyLiAgTWlnaHQKICAgICAgICAgICBpbXBsZW1lbnQgYW4gYWx0ZXJuYXRpdmUgbGF0ZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFqb3IgY2hhbmdlcyB0byB0ZW1wbGF0ZSBoYW5kbGluZyBpbiBvcmRlciB0byBwcm92aWRlCiAgICAgICAgICAgYmV0dGVyIGludGVncmF0aW9uIHdpdGggdGhlIEMrKyB0eXBlLXN5c3RlbS4gVGhlIG1haW4KICAgICAgICAgICBwcm9ibGVtIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgIFN1cHBvc2UgeW91IGhhdmUgYSB0ZW1wbGF0ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgYmxhaChjb25zdCBUIHgpIHsgc3R1ZmYgfTsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE5vdyBzdXBwb3NlLCB0aGF0IHlvdSBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb24gYQogICAgICAgICAgIHR5cGUgbGlrZSB0aGlzIGluIFNXSUc6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPGludCAqPjsKCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzICpzdXBwb3NlZCogdG8gZ2VuZXJhdGUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgSG93ZXZlciwgaW4gU1dJRy0xLjMuOSwgdGhlIHRlbXBsYXRlIHN1YnN0aXR1dGlvbiBnZXRzIGl0IHdyb25nCiAgICAgICAgICAgYW5kIHByb2R1Y2VzCgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBpbnQgKngpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgKG5vdGljZSB0aGUgYmFkIHBsYWNlbWVudCBvZiB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIpLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIFNXSUcgcGFyc2VyIG5vdyBnZW5lcmF0ZXMgaW1wbGljaXQgdHlwZWRlZnMKICAgICAgICAgICBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMgdGhhdCBwcm9kdWNlcyBjb2RlIHJvdWdobHkKICAgICAgICAgICBlcXVpdmFsZW50IHRvIGRvaW5nIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpfX3N3aWd0bXBsMTsKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxfX3N3aWd0bXBsMT47CgogICAgICAgICAgIHdoaWNoIGdlbmVyYXRlcyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgU2luY2UgdGhpcyBpcyBjb3JyZWN0IGluIGJvdGggQysrIGFuZCBTV0lHLCBpdCBwcm92aWRlcyB0aGUgcmlnaHQKICAgICAgICAgICBzZW1hbnRpY3MgYW5kIGFsbG93cyBldmVyeXRoaW5nIHRvIGNvbXBpbGUgcHJvcGVybHkuICBIb3dldmVyLAogICAgICAgICAgIHRvIGNsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgY29kZSBhIGxpdHRsZSBiaXQsIHRoZSBwYXJzZXIga2VlcHMKICAgICAgICAgICB0cmFjayBvZiB0aGUgdGVtcGxhdGUgdHlwZXMgYW5kIHBlcmZvcm1zIGJhY2stc3Vic3RpdHV0aW9uIHRvCiAgICAgICAgICAgdGhlIG9yaWdpbmFsIHR5cGUgd2hlbiBidWlsZGluZyB0aGUgcGFyc2UgdHJlZS4gIFRodXMsIGV2ZW4KICAgICAgICAgICB0aG91Z2ggdGhlIGltcGxpY2l0IHR5cGVkZWYgaXMgdXNlZCBpbiB0aGUgaW5wdXQgYW5kIG1heSBhcHBlYXIKICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZSAoZm9yIHByb3BlciBjb21waWxhdGlvbiksIHRoZSBwYXJzZQogICAgICAgICAgIHRyZWUgd2lsbCBoaWRlIGEgbG90IG9mIHRoZXNlIGRldGFpbHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIHdpbGwgbG9vayBsaWtlIGl0IHdhcyBkZWNsYXJlZCBhcyBmb2xsb3dzICh3aGljaCBpcyB3aGF0CiAgICAgICAgICAgeW91IHdhbnQpOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH0KCiAgICAgICAgICAgVGhlIG9ubHkgcGxhY2UgeW91IGFyZSBsaWtlbHkgdG8gbm90aWNlIHRoZSB0eXBlZGVmIGhhY2sKICAgICAgICAgICBpcyBpbiBib2RpZXMgb2YgdGVtcGxhdGUgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIGRpZCB0aGlzLAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBibGFoIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgewogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBUICB0ZW1wdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgeW91IHdpbGwgZmluZCB0aGF0ICdUIHRlbXB2YWx1ZScgZ290IGV4cGFuZGVkIGludG8gc29tZQogICAgICAgICAgIHN0cmFuZ2UgdHlwZWRlZiB0eXBlLiAgVGhpcyAqc3RpbGwqIGNvbXBpbGVzIGNvcnJlY3RseSAKICAgICAgICAgICBzbyBpdCdzIG5vdCBhIGJpZyBkZWFsIChvdGhlciB0aGFuIGxvb2tpbmcga2luZCBvZiB1Z2x5CiAgICAgICAgICAgaW4gdGhlIHdyYXBwZXIgZmlsZSkuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBzb21lIGluaGVyaXRhbmNlIHByb2JsZW1zIGluIFRjbCBPYmplY3QgaW50ZXJmYWNlLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGNsIG1vZHVsZSBoYXMgY2hhbmdlZCB0byB1c2UgYnl0ZS1iYWNrZWQgcG9pbnRlciBzdHJpbmdzLiAgVGhpcwogICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBIb3dldmVyLAogICAgICAgICAgIHRoZSBvcmRlciBpbiB3aGljaCBkaWdpdHMgYXBwZWFyIGluIHBvaW50ZXIgdmFsdWVzIG5vIGxvbmdlcgogICAgICAgICAgIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBhY3R1YWwgbnVtZXJpY2FsIHZhbHVlIG9mIGEKICAgICAgICAgICBwb2ludGVyIChvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCBwYWlycyBvZiBkaWdpdHMgYXBwZWFyCiAgICAgICAgICAgaW4gcmV2ZXJzZSBvcmRlcikuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQZXJsNSBtb2R1bGUgaXMgbm93IGRyaXZlbiBieSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAncGVybDUuc3dnJwogICAgICAgICAgIGluIHRoZSBTV0lHIGxpYnJhcnkuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcGVybDUgbW9kdWxlIG5vIGxvbmdlciB0cmllcyB0byBhcHBseSB0aGUgIm91dCIgdHlwZW1hcAogICAgICAgICAgIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBtYWdpYyB2YXJpYWJsZXMuICBJJ20gc3VycHJpc2VkIHRoYXQKICAgICAgICAgICB0aGlzIGV2ZXIgd29ya2VkIGF0IGFsbCAoc2luY2UgYWxsIG9mIHRoZSBjb2RlIHRoYXQgd2FzIHRoZXJlCiAgICAgICAgICAgd2FzIHdyb25nIGFueXdheXMpLiAgIFVzZSB0aGUgInZhcm91dCIgdHlwZW1hcCB0byBoYW5kbGUKICAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgcmVsYXRlZCB0byBjaGFyYWN0ZXIgYXJyYXkgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgaXMgbm9ybWFsbHkgc3VwcG9zZWQgdG8gcmV0dXJuIGEgc3RyaW5nLCBidXQgdGhpcyB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjkuICAgVGhlIHJlYXNvbiBpdCB3YXMgYnJva2VuIHdhcyBhY3R1YWxseQogICAgICAgICAgIGR1ZSB0byBhIHN1YnRsZSBuZXcgZmVhdHVyZSBvZiB0eXBlbWFwcy4gIFdoZW4gYSBkYXRhIG1lbWJlcgogICAgICAgICAgIGlzIHNldCB0byBhbiBhcnJheSBsaWtlIHRoaXMsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVsYXRlZAogICAgICAgICAgIGFjY2Vzc29yIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IHNldCB0byBhbiBhcnJheS4gIFRoaXMgbWVhbnMKICAgICAgICAgICB0aGF0IHlvdSBjYW4gbm93IHdyaXRlIHR5cGVtYXBzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgJHRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCRzb3VyY2UsJGRpbTApOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZnVuY3QKICAgICAgICAgICBtZW1iZXJvdXQgdHlwZW1hcCBpbiBhIG1vcmUgZWxlZ2FudCBtYW5uZXIuCgo5LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBvZiBxdWFsaWZpZWQgQysrIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIChpKSBUaGUgU1dJRyBwYXJzZXIgd2FzIGV4dGVuZGVkIHNsaWdodGx5IHRvIGFsbG93ICd2b2xhdGlsZScKICAgICAgICAgICBhbmQgY29tYmluYXRpb25zIG9mICdjb25zdCcgYW5kICd2b2xhdGlsZScgdG8gYmUgdXNlZC4gIFRoaXMKICAgICAgICAgICBpcyBwcm9iYWJseSByYXJlLCBidXQgdGVjaG5pY2FsbHkgbGVnYWwuICBPbmx5IGFkZGVkIGZvcgogICAgICAgICAgIGNvbXBsZXRlbmVzcy4KCiAgICAgICAgICAgKGlpKSBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkaW5nLCBxdWFsaWZpZWQgYW5kIG5vbi1xdWFsaWZpZWQKICAgICAgICAgICBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudC4gIFRodXMsIHdoZW4gYSBjbGFzcyBoYXMgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKCiAgICAgICAgICAgVHdvIGRpc3RpbmN0IG1ldGhvZHMgYXJlIGRlY2xhcmVkLiAgVG8gZGVhbCB3aXRoIHRoaXMsICVyZW5hbWUKICAgICAgICAgICBhbmQgc2ltaWxhciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBleHRlbmRlZCB0byByZWNvZ25pemUgY29uc3QuCiAgICAgICAgICAgVGh1cywgb25lIGNhbiBkaXNhbWJpZ3VhdGUgdGhlIHR3byBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vY29uc3QpIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIG9yIHNpbXBseSBpZ25vcmUgdGhlIGNvbnN0IHZhcmlhbnQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgTm90ZTogU1dJRyBjdXJyZW50bHkgaGFzIG5vIHdheSB0byBhY3R1YWxseSBpbnZva2UgdGhlIGNvbnN0CiAgICAgICAgICAgbWVtYmVyIHNpbmNlIHRoZSAnY29uc3QnIGlzIGRpc2NhcmRlZCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlcnMKICAgICAgICAgICBmb3Igb2JqZWN0cy4gIAoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTmV3IGRpcmVjdGl2ZS4gJW5hbWV3YXJuIGNhbiBiZSB1c2VkIHRvIGlzc3VlIHdhcm5pbmcKICAgICAgICAgICBtZXNzYWdlcyBmb3IgY2VydGFpbiBkZWNsYXJhdGlvbiBuYW1lcy4gICBUaGUgbmFtZQogICAgICAgICAgIG1hdGNoaW5nIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuCiAgICAgICAgICAgVGhlIGludGVudCBvZiB0aGlzIGRpcmVjdGl2ZSBpcyB0byBpc3N1ZSB3YXJuaW5ncyBmb3IKICAgICAgICAgICBwb3NzaWJsZSBuYW1lc3BhY2UgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVuYW1ld2FybigicHJpbnQgaXMgYSBweXRob24ga2V5d29yZCIpIHByaW50OwoKICAgICAgICAgICBUaGUgbmFtZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgcGVyZm9ybWVkIGFmdGVyIGEgbmFtZQogICAgICAgICAgIGhhcyBiZWVuIHJlc29sdmVkIHVzaW5nICVyZW5hbWUuICBUaGVyZWZvcmUsIGEKICAgICAgICAgICBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgd2lsbCBub3QgZ2VuZXJhdGUgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCJQcmludCIpIHByaW50OwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsgICAgLyogTm8gd2FybmluZyBnZW5lcmF0ZWQgKi8KCiAgICAgICAgICAgU2luY2UgdGhlIHdhcm5pbmcgbWVjaGFuaXNtIGZvbGxvd3MgJXJlbmFtZSBzZW1hbnRpY3MsIGl0IGlzCiAgICAgICAgICAgYWxzbyB0byBpc3N1ZSB3YXJuaW5ncyBmb3Igc3BlY2lmaWMgY2xhc3NlcyBvciBqdXN0IGZvcgogICAgICAgICAgIGNlcnRhaW4gbWVtYmVyIGZ1bmN0aW9uIG5hbWVzLgoKICAgICAgICAgICAoRGF2ZSAtIEkndmUgYmVlbiB0aGlua2luZyBhYm91dCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgdGhpcwogICAgICAgICAgIGZvciBxdWl0ZSBzb21lIHRpbWUuICBKdXN0IG5ldmVyIGdvdCBhcm91bmQgdG8gaXQpCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIEVuaGFuY2VkIHRoZSAlaWdub3JlIGRpcmVjdGl2ZSBzbyB0aGF0IHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICBjYW4gYmUgaXNzdWVkIHRvIHVzZXJzLiAgIFRoaXMgaXMgZG9uZSB1c2luZyAlaWdub3Jld2FybgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlaWdub3Jld2Fybigib3BlcmF0b3IgbmV3IGlnbm9yZWQiKSBvcGVyYXRvciBuZXc7CgogICAgICAgICAgIFRoZSBuYW1lcyBhbmQgc2VtYW50aWNzIG9mICVpZ25vcmV3YXJuIGlzIGV4YWN0bHkgdGhlIAogICAgICAgICAgIHNhbWUgYXMgJWlnbm9yZS4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgIGlzIGZvciBtb2R1bGUgd3JpdGVycyB3aG8gd2FudCB0byBpZ25vcmUgY2VydGFpbiB0eXBlcwogICAgICAgICAgIG9mIGRlY2xhcmF0aW9ucywgYnV0IHdobyBhbHNvIHdhbnQgdG8gYWxlcnQgdXNlcnMgYWJvdXQgaXQuCiAgICAgICAgICAgQSB1c2VyIG1pZ2h0IGFsc28gdXNlIHRoaXMgZm9yIGRlYnVnZ2luZyAoc2luY2UgbWVzc2FnZXMKICAgICAgICAgICB3aWxsIGFwcGVhciB3aGVuZXZlciBhbiBpZ25vcmVkIGRlY2xhcmF0aW9uIGFwcGVhcnMpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMjYvMjAwMTogYmVhemxleQogICAgICAgICAgIFN1cGVyLWV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycy4gCiAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBhIGZldyBkaWZmZXJlbnQgcGFydHMuCgogICAgICAgICAgIChpKSBPcGVyYXRvciBuYW1lcyBzdWNoIGFzICdvcGVyYXRvcisnIGFyZSBub3cgYWxsb3dlZAogICAgICAgICAgIGFzIHZhbGlkIGRlY2xhcmF0b3IgbmFtZXMuICBUaHVzIHRoZSAnb3BlcmF0b3InIHN5bnRheAogICAgICAgICAgIGNhbiBhcHBlYXIgKmFueXBsYWNlKiBhIG5vcm1hbCBkZWNsYXJhdG9yIG5hbWUgd2FzIHVzZWQKICAgICAgICAgICBiZWZvcmUuICBPbiB0aGUgc3VyZmFjZSwgdGhpcyBtZWFucyB0aGF0IG9wZXJhdG9ycyBjYW4KICAgICAgICAgICBiZSBwYXJzZWQganVzdCBsaWtlIG5vcm1hbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuIAogICAgICAgICAgIEhvd2V2ZXIsIGl0IGFsc28gbWVhbnMgdGhhdCBvcGVyYXRvciBuYW1lcyBjYW4gYmUgdXNlZAogICAgICAgICAgIGluIG1hbnkgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXJlbmFtZShfX2FkZF9fKSBDb21wbGV4OjpvcGVyYXRvcisoY29uc3QgQ29tcGxleCAmKTsKCiAgICAgICAgICAgKGlpKSBPcGVyYXRvcnMgYXJlIHdyYXBwZWQgKmV4YWN0bHkqIGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBtZXRob2RzLiAgSW50ZXJuYWxseSwgdGhlIG9wZXJhdG9yIG5hbWUgaXMgdXNlZCAKICAgICAgICAgICBkaXJlY3RseSBtZWFuaW5nIHRoYXQgdGhlIHdyYXBwZXIgY29kZSBtaWdodCBjb250YWluCiAgICAgICAgICAgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYXJnMC0+b3BlcmF0b3IqKChDb21wbGV4IGNvbnN0ICYpKmFyZzEpOwoKICAgICAgICAgICBUaGlzIGFsbCBzZWVtcyB0byBwYXJzZSBhbmQgY29tcGlsZSBjb3JyZWN0bHkgKGF0IGxlYXN0CiAgICAgICAgICAgb24gbXkgbWFjaGluZSkuCgogICAgICAgICAgIChpaWkpIFNXSUcgd2lsbCBubyBsb25nZXIgd3JhcCBhIGRlY2xhcmF0aW9uIGlmIGl0cyBzeW1ib2wKICAgICAgICAgICB0YWJsZSBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzLiAgSWYKICAgICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlcnMgYXJlIGRldGVjdGVkLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3IKICAgICAgICAgICBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgIFdhcm5pbmcuIENhbid0IHdyYXAgb3BlcmF0b3IqIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4KCiAgICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSAlcmVuYW1lIG9yICVuYW1lIHRvIGJpbmQKICAgICAgICAgICB0aGUgb3BlcmF0b3IgdG8gYSBuaWNlIG5hbWUgbGlrZSAiYWRkIiBvciBzb21ldGhpbmcuIE5vdGU6CiAgICAgICAgICAgdGhlIGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0CiAgICAgICAgICAgbGFuZ3VhZ2UuCgogICAgICAgICAgIFRoZXJlIGFyZSBjZXJ0YWluIGlzc3VlcyB3aXRoIGZyaWVuZCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycy4KICAgICAgICAgICBTb21ldGltZXMsIGZyaWVuZHMgYXJlIHVzZWQgdG8gZGVmaW5lIG1peGVkIG9wZXJhdG9ycyBzdWNoCiAgICAgICAgICAgYXMgYWRkaW5nIGEgQ29tcGxleCBhbmQgYSBkb3VibGUgdG9nZXRoZXIuICBDdXJyZW50bHksIFNXSUcKICAgICAgICAgICBpZ25vcmVzIGFsbCBmcmllbmQgZGVjbGFyYXRpb25zIGluIGEgY2xhc3MuICBBIGdsb2JhbCBvcGVyYXRvcgogICAgICAgICAgIGRlY2xhcmF0aW9uIGNhbiBwcm9iYWJseSBiZSBtYWRlIHRvIHdvcmssIGJ1dCB5b3UnbGwgaGF2ZSB0bwogICAgICAgICAgIHJlbmFtZSBpdCBhbmQgaXQgcHJvYmFibHkgd29uJ3Qgd29yayB2ZXJ5IGNsZWFubHkgaW4gdGhlCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHNpbmNlIGl0J3Mgbm90IGEgY2xhc3MgbWVtYmVyLgoKICAgICAgICAgICBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gaGFuZGxlIG9wZXJhdG9yIHNwZWNpZmljYXRpb25zIAogICAgICAgICAgIHNvbWV0aW1lcyB1c2VkIGZvciBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgU3RyaW5nIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyKigpOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH07CgogICAgICAgICAgICh0aGlzIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5IGFuZCBnZW5lcmF0ZXMgYSBzeW50YXggZXJyb3IpLgoKICAgICAgICAgICBBbHNvOiBvcGVyYXRvcnMgbm8gbG9uZ2VyIHNob3cgdXAgYXMgc2VwYXJhdGUgcGFyc2UtdHJlZQogICAgICAgICAgIG5vZGVzIChpbnN0ZWFkIHRoZXkgYXJlIG5vcm1hbCAnY2RlY2wnIG5vZGVzKS4gIEkgbWF5CiAgICAgICAgICAgc2VwYXJhdGUgdGhlbSBhcyBhIHNwZWNpYWwgY2FzZSBsYXRlci4KCiAgICAgICAgICAgU2VlIEV4YW1wbGVzL3B5dGhvbi9vcGVyYXRvciBmb3IgYW4gZXhhbXBsZS4KCiAgICAgICAgICAgKioqIFNVUEVSLUVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKClZlcnNpb24gMS4zLjkgKFNlcHRlbWJlciAyNSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZSBkZWNsYXJhdGlvbnMgbGlrZSAKICAgICAgICAgICAnY2hhciAqKiBjb25zdCcuICBTV0lHIHBhcnNlZCB0aGlzIGNvcnJlY3RseSwgYnV0IHRoZQogICAgICAgICAgIGludGVybmFsIHR5cGUgd2FzIHJlcHJlc2VudGVkIGluY29ycmVjdGx5ICh0aGUgcG9pbnRlcnMKICAgICAgICAgICBhbmQgcXVhbGlmaWVycyB3ZXJlIGluIHRoZSB3cm9uZyBvcmRlcikuCgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBXaXRoZHJldyBleHBlcmltZW50YWwgZmVhdHVyZSAobm90ZWQgYmVsb3cpIHRoYXQgd2FzCiAgICAgICAgICAgY2F1c2luZyBzZXJpb3VzIHBhcnNpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDEuMy44IChTZXB0ZW1iZXIgMjMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIGltcHJvdmVkIGRpc3R1dGlscyBzZXR1cC5weSBmaWxlIGluIHRoZSBUb29scyAKICAgICAgICAgICBkaXJlY3RvcnkgKGxvb2sgZm9yIHRoZSBzZXR1cC5weS50bXBsIGZpbGUpLiAgQ29udHJpYnV0ZWQgYnkKICAgICAgICAgICBUb255IFNld2FyZC4KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIHR3byBuZXcgUlBNIHNwZWMgZmlsZXMgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4gQ29udHJpYnV0ZWQKICAgICAgICAgICBieSBUb255IFNld2FyZCBhbmQgVXdlIFN0ZWlubWFubi4KICAKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MzYzNSBdIFBlcmw1LnN3ZyBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBDKysKCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIFR3byBuZXcgZGlyZWN0aXZlcyBjb250cm9sIHRoZSBjcmVhdGlvbiBvZiBkZWZhdWx0CiAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yczoKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0CiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQKCiAgICAgICAgICAgVGhlc2UgcmVwbGFjZSAlcHJhZ21hIG5vZGVmYXVsdCBhbmQgJXByYWdtYSBtYWtlZGVmYXVsdC4KICAgICAgICAgICAob2xkIGNvZGUgd2lsbCBzdGlsbCB3b3JrLCBidXQgZG9jdW1lbnRhdGlvbiB3aWxsIG9ubHkKICAgICAgICAgICBkZXNjcmliZSB0aGUgbmV3IGRpcmVjdGl2ZXMpLgoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MjM1NCBdICVpbXBvcnQgYnJva2VuIGluIDEuMy43LgoKOS8yMC8yMDAxOiBiZWF6bGV5CgogICAgICAgICAgIFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgb3V0LW9mLWNsYXNzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3IgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjpGb28oKSA6CiAgICAgICAgICAgICAgICAgICAgQmFyKCJmb28iKQogICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICB9IAoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6fkZvbygpIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgSmFzb24gU3Rld2FydC4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIGlnbm9yZSBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBWLCBsb25nIFM+IGNsYXNzIE1hcEl0ZXI7CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBhbiBlbWFpbCBleGFtcGxlIGZyb20gSXJpbmEgS290bG92YS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB1bmRlY2xhcmVkIHRjbF9yZXN1bHQgdmFyaWFibGUgaW4gCiAgICAgICAgICAgdGhlICJvdXQiIHR5cGVtYXAgZm9yIFRjbC4gIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBBY3RpdmVQZXJsLiAgCiAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2luZyBvZiBDKysgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIEZvbygpIDogQmFyKC4uLikgey4uLn0KICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIG5vdyBkaXNjYXJkcyB0aGUgY29udGVudHMgb2YgdGhlICguLi4pIHJlZ2FyZGxlc3Mgb2YgCiAgICAgICAgICAgd2hhdCBtaWdodCBlbmNsb3NlZCAoZXZlbiBpZiBzeW50YWN0aWNhbGx5IHdyb25nKS4gIFNXSUcKICAgICAgICAgICBkb2Vzbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlcmUgaXMgbm8gcmVhc29uIHRvCiAgICAgICAgICAgbmVlZGxlc3MgYWRkIHN5bnRheCBydWxlcyB0byBoYW5kbGUgYWxsIG9mIHRoZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgaGVyZS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0eXBlbWFwcyBmb3Igc3RydWN0dXJlIG1lbWJlcnMuICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICBpbnQgKmJhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgbWVtYmVyIG5hbWUgJ2JhcicgaXMgbm93IHVzZWQgaW4gYW55IGFjY2Vzc29yIGZ1bmN0aW9ucy4KICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgImluIiB0eXBlbWFwIHRvIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyB0eXBlbWFwCgogICAgICAgICAgICAgICAldHlwZW1hcChweXRob24saW4pIGludCAqYmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG5vdyBtYXRjaGVzIFZlY3Rvcjo6YmFyLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyB3aWxsIGFsc28KICAgICAgICAgICBtYXRjaCBhbnkgZnVuY3Rpb24gd2l0aCBhbiBhcmd1bWVudCBvZiAiaW50ICpiYXIiIChzbyB5b3Ugc2hvdWxkCiAgICAgICAgICAgYmUgY2FyZWZ1bCkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFLiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI2NDIgc2V0dGluZyBzdHJpbmcgdmFsdWVzIGluIHN0cnVjdHVyZXMKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyMzk4IHByb2JsZW0gd2l0aCBuZXN0ZWQgdGVtcGxhdGVzLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjE2MjYgcHJvYmxlbSB3aXRoIGZvcm1hdHRpbmcgYW5kIEMrKyBjb21tZW50cy4KICAgICAgICAgICAgCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyODQ1IFdyb25nIG93bmVyc2hpcCBvZiByZXR1cm5lZCBvYmplY3RzLgogICAgICAgICAgIAo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ1OTM2Ny4gIERlZmF1bHQgY29uc3RydWN0b3JzIGZvciBjbGFzc2VzCiAgICAgICAgICAgd2l0aCBwdXJlIHZpcnR1YWwgbWV0aG9kcy4KCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgY2xhc3Mgc2NvcGUuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBlbnVtIGJhciB7IEZPTywgQkFSIH07CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXIgYiA9IEZPTyk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFNXSUcgbm93IGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBkZWZhdWx0IHZhbHVlIG9mICJGb286OkZPTyIgZm9yCiAgICAgICAgICAgdGhlIGJsYWgoKSBtZXRob2QgYWJvdmUuICBUaGlzIHVzZWQgdG8gd29yayBpbiAxLjEsIGJ1dCB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjcuICAgQnVnIHJlcG9ydGVkIGJ5IE1pa2UgUm9tYmVyZy4KClZlcnNpb24gMS4zLjcgIChTZXB0ZW1iZXIgMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3BlY2lhbCAlaWdub3JlIGRpcmVjdGl2ZSB0byBpZ25vcmUgZGVjbGFyYXRpb25zLiAgVGhpcwogICAgICAgICAgIGZlYXR1cmUgd29ya3MgZXhhY3RseSBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlICBmb287ICAgICAgICAvLyBJZ25vcmUgYWxsIGRlY2xhcmF0aW9ucyBmb28KICAgICAgICAgICAgICVpZ25vcmUgIDo6Zm9vOyAgICAgIC8vIE9ubHkgaWdub3JlIGZvbyBpbiBnbG9iYWwgc2NvcGUKICAgICAgICAgICAgICVpZ25vcmUgIFNwYW06OmZvbzsgIC8vIE9ubHkgaWdub3JlIGluIGNsYXNzIFNwYW0KICAgICAgICAgICAgICVpZ25vcmUgICo6OmZvbzsgICAgIC8vIElnbm9yZSBpbiBhbGwgY2xhc3NlcwoKICAgICAgICAgICAlaWdub3JlIGNhbiBhbHNvIGJlIHBhcmFtZXRlcml6ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSA6OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSBTcGFtOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgKjo6Zm9vKGludCk7CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCgo5LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBzaGFkb3djb2RlIHByYWdtYSBtb2RpZmllZCBzbyB0aGF0IHRoZSBjb2RlIHRoYXQgaXMgb3V0cHV0IAogICAgICAgICAgIGluIHRoZSBzaGFkb3cgZmlsZSBpcyBwbGFjZWQgcmVsYXRpdmUgdG8gd2hlcmUgaXQgaXMgcGxhY2VkIGluIHRoZSAKICAgICAgICAgICBjL2MrKyBjb2RlLiBUaGlzIGFsbG93cyBzdXBwb3J0IGZvciBKYXZhRG9jIGZ1bmN0aW9uIGNvbW1lbnRzLiAKCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFBhdGNoIFsgIzQ0Nzc5MSBdIEZpeCBmb3IgcHl0aG9uIC1pbnRlcmZhY2Ugb3B0aW9uLgogICAgICAgICAgIFN1Ym1pdHRlZCBieSBUYXJuIFdlaXNuZXIgQnVydG9uLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzCiAgICAgICAgICAgZm9yIGEgY2xhc3MgaWYgaXQgb25seSBkZWZpbmVzIGEgcHJpdmF0ZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICAgICAgICBvciBkZXN0cnVjdG9yIG9yIGlmIGFueSBvbmUgb2YgaXRzIGJhc2UgY2xhc3NlcyBvbmx5IGhhcwogICAgICAgICAgIHByaXZhdGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLiAgVGhpcyB3YXMgcmVwb3J0ZWQgaW4KICAgICAgICAgICBTRiBQYXRjaCBbICM0NDQyODEgXSBub25wdWJsaWMvZGVmYXVsdC9pbmhlcmV0ZWQgY3Rvci9kdG9yCiAgICAgICAgICAgYnkgTWFyY2VsbyBNYXR1cy4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIFBlcmw1IG1vZHVsZSB0aGF0IGFsbG93cyBjb25zdGFudHMgdG8gYmUKICAgICAgICAgICB3cmFwcGVkIGFzIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGxlYWRpbmcgJC4KICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCB1c2luZyB0aGUgLWNvbnN0IG9wdGlvbi4KICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBSaWNoIFdhbGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlICd2b2xhdGlsZScgdHlwZSBxdWFsaWZpZXIuCiAgICAgICAgICAgdm9sYXRpbGUgZG9lc24ndCBtZWFuIGFueXRoaW5nIHRvIFNXSUcsIGJ1dCBpdCBpcwogICAgICAgICAgIG5lZWRlZCB0byBwcm9wZXJseSBnZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBkZWNsYXJhdGlvbnMKICAgICAgICAgICB0aGF0IHVzZSBpdC4gIEl0J3MgYWxzbyBiZWVuIGFkZGVkIHRvIG1ha2UgdGhlIFNXSUcgdHlwZQogICAgICAgICAgIHN5c3RlbSBtb3JlIGNvbXBsZXRlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgJXJlbmFtZSBkaXJlY3RpdmUuICAqKiogVGhpcwogICAgICAgICAgIG5ldyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIGdyZWF0bHkgc2ltcGxpZnkgdGhlIHRhc2sgb2YKICAgICAgICAgICByZXNvbHZpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICoqKgogICAgICAgICAgIAogICAgICAgICAgIEluIHByaW9yIHZlcnNpb25zIG9mIFNXSUcsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSB3YXMKICAgICAgICAgICB1c2VkIHRvIGNvbnNpc3RlbnRseSBhcHBseSBhbiBpZGVudGlmaWVyIHJlbmFtaW5nLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgaWYgeW91IHNhaWQgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lIGZvbyBiYXI7CgogICAgICAgICAgIEV2ZXJ5IG9jY3VycmVuY2Ugb2YgJ2Zvbycgd291bGQgYmUgcmVuYW1lZCB0byAnYmFyJy4gCiAgICAgICAgICAgQWx0aG91Z2ggdGhpcyB3b3JrcyBmaW5lIGZvciByZXNvbHZpbmcgYSBjb25mbGljdCB3aXRoIGEKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZCwgaXQgaXMgdXNlbGVzcyBmb3IKICAgICAgICAgICBmb3IgZGVhbGluZyB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcy4gICAgVGhpcyBpcyBiZWNhdXNlCiAgICAgICAgICAgYWxsIG1ldGhvZHMgYXJlIHNpbXBseSByZW5hbWVkIHRvIHRoZSBzYW1lIHRoaW5nIAogICAgICAgICAgIChnZW5lcmF0aW5nIHRoZSBzYW1lIGNvbmZsaWN0IGFzIGJlZm9yZSkuCgogICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIG9ubHkgd2F5IHRvIGRlYWwgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMKICAgICAgICAgICB3YXMgdG8gZ28gdGhyb3VnaCBhbmQgaW5kaXZpZHVhbGx5IHJlbmFtZSB0aGVtIGFsbCB1c2luZwogICAgICAgICAgICVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHlvdSBoYWQgdG8gZG8gdGhpcyBmb3IgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzIHRvby4KCiAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5LCB0aGlzIG1ha2VzIGl0IGV4dHJlbWVseSBoYXJkIHRvIHJlc29sdmUKICAgICAgICAgICBvdmVybG9hZGluZyB3aXRob3V0IGEgbG90IG9mIHdvcmsgYW5kIG1ha2VzIGl0IGFsbW9zdAogICAgICAgICAgIGltcG9zc2libGUgdG8gdXNlIFNXSUcgb24gcmF3IEMrKyAuaCBmaWxlcy4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsICVyZW5hbWUgbm93IGFjY2VwdHMgcGFyYW1ldGVyIGRlY2xhcmF0b3JzLgogICAgICAgICAgIFRoZSBzeW50YXggaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiByZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyKGludCknCiAgICAgICAgICAgdG8gJ2Jhcl9pJywgbGVhdmluZyBhbnkgb3RoZXIgb2NjdXJyZW5jZSBvZiAnYmFyJyBhbG9uZS4KCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKCiAgICAgICAgICAgVXNpbmcgdGhpcyBmZWF0dXJlLCB5b3UgY2FuIG5vdyBzZWxlY3RpdmVseSByZW5hbWUgCiAgICAgICAgICAgY2VydGFpbiBkZWNsYXJhdGlvbnMgaW4gYWR2YW5jZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShiYXJfZCkgYmFyKGRvdWJsZSk7CgogICAgICAgICAgICAgLy8gSW5jbHVkZSByYXcgQysrIGhlYWRlciAgICAKICAgICAgICAgICAgICVpbmNsdWRlICJoZWFkZXIuaCIKCiAgICAgICAgICAgV2hlbiAlcmVuYW1lIGlzIHVzZWQgaW4gdGhpcyBtYW5uZXIsIGFsbCBvY2N1cnJlbmNlIG9mIGJhcihpbnQpCiAgICAgICAgICAgYXJlIHJlbmFtZWQgd2hlcmV2ZXIgdGhleSBtaWdodCBvY2N1ci4gIE1vcmUgY29udHJvbCBpcyBvYnRhaW5lZAogICAgICAgICAgIHRocm91Z2ggZXhwbGljaXQgcXVhbGlmaWNhdGlvbi4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIDo6YmFyKGludCk7CgogICAgICAgICAgIG9ubHkgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAgICAgIFRoZSBkZWNsYXJhdGlvbiwKICAgICAKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBGb286OmJhcihpbnQpOwoKICAgICAgICAgICBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIGEgY2xhc3MgRm9vLgogICAgICAgICAgIFRoaXMgbGF0dGVyIGZvcm0gYWxzbyBzdXBwb3J0cyBpbmhlcml0YW5jZS4gIFRoZXJlZm9yZSwgaWYgeW91CiAgICAgICAgICAgaGFkIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBTcGFtOjpiYXIoaW50KSBtZXRob2Qgd291bGQgYWxzbyBiZSByZW5hbWVkIChzaW5jZSBTcGFtIAogICAgICAgICAgIGlzIGEgc3ViY2xhc3Mgb2YgRm9vKS4gICBUaGlzIGxhdHRlciBmZWF0dXJlIG1ha2VzIGl0IGVhc3kKICAgICAgICAgICBmb3IgU1dJRyB0byBhcHBseSBhIGNvbnNpc3RlbnQgcmVuYW1pbmcgYWNyb3NzIGFuIGVudGlyZQogICAgICAgICAgIGNsYXNzIGhpZXJhcmNoeSBzaW1wbHkgYnkgc3BlY2lmeWluZyByZW5hbWluZyBydWxlcyBmb3IKICAgICAgICAgICB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgQSBjbGFzcyB3aWxkY2FyZCBvZiAqIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHJlbmFtaW5nCiAgICAgICAgICAgYWxsIG1hdGNoaW5nIG1lbWJlcnMgb2YgYWxsIGNsYXNzZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgKjo6YmFyKGludCk7CgogICAgICAgICAgIHdpbGwgcmVuYW1lIGFsbCBtZW1iZXJzIGJhcihpbnQpIHRoYXQgYXJlIGRlZmluZWQgaW4gY2xhc3Nlcy4KICAgICAgICAgICBJdCB3aWxsIG5vdCByZW5hbWVkIGRlZmluaXRpb25zIG9mIGJhcihpbnQpIGluIHRoZSBnbG9iYWwKICAgICAgICAgICBzY29wZS4KCiAgICAgICAgICAgVGhlIG9sZCB1c2Ugb2YgJXJlbmFtZSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBpcyBzb21ld2hhdAogICAgICAgICAgIGVuaGFuY2VkLiAgCgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBiYXI7ICAgICAgLy8gUmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcicuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIDo6YmFyOyAgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGdsb2JhbCBzY29wZSBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSAqOjpiYXI7ICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBjbGFzc2VzIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIEZvbzo6YmFyOyAvLyBSZW5hbWUgYWxsICdiYXInIGRlZmluZWQgaW4gY2xhc3MgRm9vLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkYXRhLW1lbWJlciB0byBtZW1iZXItZnVuY3Rpb24gCiAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOb3cgc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYWNjZXNzIHggYW5kIHkgCiAgICAgICAgICAgdGhyb3VnaCBhIG1lbWJlciBmdW5jdGlvbiBpbnRlcmZhY2UgaW5zdGVhZCAKICAgICAgICAgICBvZiB0aGUgdXN1YWwgU1dJRyBiZWhhdmlvci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGYuc2V0X3goMy40KSAgICAgICMgaW5zdGVhZCBvZiBmLnggPSAzLjQKICAgICAgICAgICAgICB4ID0gZi5nZXRfeCgpICAgICAjIGluc3RlYWQgb2YgeCA9IGYueAoKICAgICAgICAgICBUbyBkbyB0aGlzLCBzaW1wbHkgdXNlIHRoZSBuZXcgJWF0dHJpYnV0ZWZ1bmMKICAgICAgICAgICBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0XyVzLHNldF8lcykKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJW5vYXR0cmlidXRlZnVuYwoKICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvICVhdHRyaWJ1dGVmdW5jIGFyZSBDLXN0eWxlIHByaW50ZgogICAgICAgICAgIGZvcm1hdCBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHRoZSBuYW1pbmcgY29udmVudGlvbgogICAgICAgICAgIHRvIHVzZS4gICVzIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBuYW1lIG9mIHRoZQogICAgICAgICAgIGRhdGEgbWVtYmVyLiBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHByaW50ZgogICAgICAgICAgIGV4dGVuc2lvbnMgdGhhdCBtaWdodCBoZWxwLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIHdhbnRlZCB0byB0aXRsZSBjYXNlIGFsbCBvZiB0aGUgYXR0cmlidXRlcywgeW91CiAgICAgICAgICAgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0JSh0aXRsZSlzLHNldCUodGl0bGUpcyk7CgogICAgICAgICAgIFRoaXMgd2lsbCB0dXJuIGFuIGF0dHJpYnV0ZSAnYmFyJyB0byAnZ2V0QmFyKCknIGFuZCAnc2V0QmFyKCknLgoKICAgICAgICAgICAoc29tZW9uZSByZXF1ZXN0ZWQgdGhpcyBsb25nIGFnbywgYnV0IEkgZmluYWxseSBmaWd1cmVkCiAgICAgICAgICAgaG93IHRvIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXIpLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGlmIG5vbmUgYXJlIGRlZmluZWQuICBUaGlzIHVzZWQgdG8gYmUKICAgICAgICAgICBlbmFibGVkIHdpdGggYSBjb21tYW5kIGxpbmUgc3dpdGNoIC1tYWtlX2RlZmF1bHQsIGJ1dAogICAgICAgICAgIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UgZnVuY3Rpb25zIGFueXdheXMuICBUbyB0dXJuCiAgICAgICAgICAgb2ZmIHRoaXMgYmVoYXZpb3IgdXNlIHRoZSAtbm9fZGVmYXVsdCBvcHRpb24gb3IgaW5jbHVkZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKIAogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdDsKICAKICAgICAgICAgICBUaGlzIG1heSBicmVhayBjZXJ0YWluIGludGVyZmFjZXMgdGhhdCBkZWZpbmVkIHRoZWlyCiAgICAgICAgICAgb3duIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyB1c2luZyB0aGUgc2FtZSBuYW1pbmcKICAgICAgICAgICBjb252ZW50aW9uIGFzIFNXSUcuICBJZiBzbywgeW91IHdpbGwgZ2V0IGR1cGxpY2F0ZQogICAgICAgICAgIHN5bWJvbHMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlciBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgSXRlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKEZJUlNUS0VZLCBORVhUS0VZKS4gIEFsc28sIGF0dHJpYnV0ZQogICAgICAgICAgIGFjY2VzcyBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJlbHkgb24gaW5oZXJpdGFuY2UgaW4gb3JkZXIKICAgICAgICAgICB0byBwcm92aWRlIGJldHRlciBiZWhhdmlvciBhY3Jvc3MgbW9kdWxlcy4gIAoKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVmFyaW91cyBvYnNjdXJlIGltcHJvdmVtZW50cyB0byB0aGUgdHlwZSBzeXN0ZW0gYW5kIGNsYXNzZXMuCiAgICAgICAgICAgU3RyYW5nZSBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzIGFyZSBub3cgd3JhcHBlZCBjb3JyZWN0bHkKICAgICAgICAgICAoaS5lLiwgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgZG9lc24ndCBjYXVzZSB0aGUgQysrCiAgICAgICAgICAgIGNvbXBpbGVyIHRvIGRpZSB3aXRoIGEgdHlwZSBlcnJvcikuCgogICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgUmVhbDsKICAgICAgICAgICAgICAgICBSZWFsIGZvbyhSZWFsICgqb3ApKFJlYWwsUmVhbCksIFJlYWwgeCwgUmVhbCB5KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgSW5oZXJpdGFuY2Ugb2YgdHlwZXMgaXMgYWxzbyBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgICAKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBjbGFzcyB3cmFwcGVycy4gICBXaGVuIFNXSUcgc2VlcyB0d28gY2xhc3NlcyBsaWtlIHRoaXMsCiAKICAgICAgICAgICBjbGFzcyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgY2xhc3MgWSA6IHB1YmxpYyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGJhcigpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgaXQgbm93IG9ubHkgZ2VuZXJhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9uczoKIAogICAgICAgICAgICAgWF9mb28oWCAqeCkgeyB4LT5mb28oKTsgfQogICAgICAgICAgICAgWV9iYXIoWSAqeSkgeyB5LT5iYXIoKTsgfQogCiAgICAgICAgICAgVW5saWtlIFNXSUcxLjE1LCB0aGUgZm9vKCkgbWV0aG9kIGRvZXMgKm5vdCogcHJvcGFnYXRlIHRvIGEgd3JhcHBlcgogICAgICAgICAgIGZ1bmN0aW9uIFlfZm9vKCkuIEluc3RlYWQsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCBYX2ZvbygpIG11c3QgYmUKICAgICAgICAgICB1c2VkLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBtb2R1bGVzIHRoYXQgdXNlIHNoYWRvdyBjbGFzc2VzLCBidXQKICAgICAgICAgICBpdCBtaWdodCBicmVhayBtb2R1bGVzIHRoYXQgZGlyZWN0bHkgdXNlIHRoZSBsb3ctbGV2ZWwgQyB3cmFwcGVycy4KICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIGZvciBhIG51bWJlciBvZiByZWFzb25zOgoKICAgICAgICAgICAgICAgLSAgSXQgZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTV0lHLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIHdpdGggYW50aWNpcGF0ZWQgZnV0dXJlIGNoYW5nZXMgc3VjaCBhcyBvdmVybG9hZGVkIG1ldGhvZHMuCgogICAgICAgICAgICAgICAtICBJdCByZXN1bHRzIGluIHN1YnN0YW50aWFsbHkgbGVzcyB3cmFwcGVyIGNvZGUtLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgZm9yIGJpZyBDKysgY2xhc3MgaGllcmFyY2hpZXMgKGluaGVyaXRlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgICAgYXJlIG5vIGxvbmdlciBjb3BpZWQgaW50byBldmVyeSBzaW5nbGUgZGVyaXZlZCBjbGFzcykuCgogICAgICAgICAgICAgICAtICBJdCBhbGxvd3MgZm9yIGJldHRlciBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgKGNvZGUgaXNuJ3QgcmVwbGljYXRlZCBpbgogICAgICAgICAgICAgICAgICBldmVyeSBzaW5nbGUgbW9kdWxlKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFByb3ZpZGVkIHNvbWUgV2luZG93cyBkb2N1bWVudGF0aW9uIGluIHRoZSBXaW4gZGlyZWN0b3J5IGFuZCBzb21lCiAgICAgICAgICAgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzIGZvciBydW5uaW5nIGV4YW1wbGVzIG9uIFdpbmRvd3MuCgo4LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHJlbmFtZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcHJvcGVybHk7CgkgICB0aGFua3MgdG8gTWFyYyBab256b24gPE1hcmMuWm9uem9uQHVuaXYtcmVubmVzMS5mcj4gZm9yIHRoZQoJICAgcGF0Y2guICBTZWUgdGhlIG5ldyB0ZXN0IGNhc2UgbmFtZV9jeHguCgo4LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtUY2xdIFJlbW92ZWQgbG90cyBvZiB3YXJuaW5ncyBpc3N1ZWQgYnkgdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLCB3aGljaCB3ZXJlIGNhdXNlZCBieSBtaXhpbmcgZnVuY3Rpb24gcG9pbnRlcnMKCSAgIG9mIGRpZmZlcmVudCBsaW5rYWdlcyAoQysrL0MpLiAKCjgvMjMvMjAwMTogbWtvZXBwZQoJICAgSW1wcm92ZWQgdGhlIE16U2NoZW1lIG1vZHVsZSBieSBwb3J0aW5nIEd1aWxlJ3MgcG9pbnRlcgoJICAgdHlwZSBjaGVja2luZyBzeXN0ZW0gYW5kIG1ha2luZyB0eXBlIGRpc3BhdGNoCgkgICB0eXBlbWFwLWRyaXZlbi4gCgo4LzIyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbnRpcmVseSBuZXcgc3ltYm9sIHRhYmxlIHByb2Nlc3NpbmcuICAgU1dJRyBzaG91bGQgYmUgYWJsZSB0bwogICAgICAgICAgIHJlcG9ydCBtdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICBBbHNvLCB0aGUgbmV3IHN5bWJvbCB0YWJsZSBhbGxvd3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zCiAgICAgICAgICAgKGFsdGhvdWdoIG92ZXJsb2FkaW5nIGlzbid0IHF1aXRlIHN1cHBvcnRlZCBpbiB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzIHlldCkuCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdICVuZXcgc3VwcG9ydCBhZGRlZC4KICAgICAgICAgICAqIFtKYXZhXSBQYWNrYWdlIEpOSSBuYW1lIHJlZml4ZWQhCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQeXRob24gbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgcG9pbnRlcnMgdG8gQysrIG1lbWJlcnMuICBUaGlzCiAgICAgICAgICAgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgIAo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBsaW1pdGVkIHBhcnNpbmcgYW5kIGZ1bGwgdHlwZS1zeXN0ZW0gc3VwcG9ydCBmb3IgcG9pbnRlcnMgdG8KICAgICAgICAgICBtZW1iZXJzLiBOb25lIG9mIFNXSUcncyBsYW5ndWFnZSBtb2R1bGVzIHJlYWxseSBrbm93IGhvdyB0byBkZWFsIHdpdGgKICAgICAgICAgICB0aGlzIHNvIHRoaXMgaXMgcmVhbGx5IG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcyBhbmQgZnV0dXJlCiAgICAgICAgICAgZXhwYW5zaW9uLiAgTm90ZTogU1dJRyBkb2VzIG5vdCBzdXBwb3J0IHBvaW50ZXJzIHRvIG1lbWJlcnMgd2hpY2ggCiAgICAgICAgICAgYXJlIHRoZW1zZWx2ZXMgcG9pbnRlcnMgdG8gbWVtYmVycywgcmVmZXJlbmNlcyB0byBwb2ludGVycyB0byBtZW1iZXJzLAogICAgICAgICAgIG9yIG90aGVyIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBpcyBtdWNoIGJldHRlciBhdCBwYXJzaW5nIGNlcnRhaW4gQysrIGRlY2xhcmF0aW9ucy4gT3BlcmF0b3JzIGFuZAogICAgICAgICAgIGZyaWVuZHMgZ2VuZXJhbGx5IGRvbid0IGNhdXNlIGFueW1vcmUgc3ludGF4IGVycm9ycy4gIEhvd2V2ZXIsIG5laXRoZXIKICAgICAgICAgICBhcmUgcmVhbGx5IHN1cHBvcnRlZC4KCjgvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkICpoaWdobHkqIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBvZiBDKysKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuICBTaW5jZSBDKysgdGVtcGxhdGVzIGFyZSBlc3NlbnRpYWxseQogICAgICAgICAgIGdsb3JpZmllZCBtYWNyb3MgYW5kIFNXSUcgaGFzIGEgZnVsbHkgb3BlcmF0aW9uYWwgQyAKICAgICAgICAgICBwcmVwcm9jZXNzb3Igd2l0aCBtYWNybyBzdXBwb3J0LCB0aGUgcGFyc2VyIG5vdyBjb252ZXJ0cwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB0byBtYWNyb3MuICBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbgogICAgICAgICAgIHRlbXBsYXRlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gVCBtYXgoVCBhLCBUIGIpOwoKICAgICAgICAgICBpcyBpbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX21heChfX25hbWUsVCkKICAgICAgICAgICAgICAgJW5hbWUoX19uYW1lKSBUIG1heChUIGEsIFQgYik7CiAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgYSB2ZXJzaW9uIG9mIHRoZSB0ZW1wbGF0ZSwgYSBzcGVjaWFsICV0ZW1wbGF0ZSBkZWNsYXJhdGlvbgogICAgICAgICAgIGlzIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgIAogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsKCiAgICAgICAgICAgVGhlIHBhcmFtZXRlciB0byB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHByb3BlciBDIGlkZW50aWZpZXIgdGhhdCdzCiAgICAgICAgICAgdXNlZCB0byB1bmlxdWVseSBuYW1lIHRoZSByZXN1bHRpbmcgaW5zdGFudGlhdGlvbi4gICBXaGVuIHVzZWQsIHRoZQogICAgICAgICAgIHRoZSBleHBhbmRlZCBtYWNybyBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVuYW1lKG1heGludCkgaW50IG1heChpbnQgYSwgaW50IGIpOwogICAgICAgICAgICAgICVuYW1lKG1heGRvdWJsZSkgZG91YmxlIG1heChkb3VibGUgYSwgZG91YmxlIGIpOwoKICAgICAgICAgICBBIHNpbWlsYXIgdGVjaG5pcXVlIGlzIHVzZWQgZm9yIHRlbXBsYXRlIGNsYXNzZXMuICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2ZWN0b3IoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBHZXRzIGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfdmVjdG9yKF9fbmFtZSwgVCkKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPFQ+IF9fbmFtZTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIF9fbmFtZSB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIF9fbmFtZShpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBfX25hbWUgdmVjdG9yPFQ+OwogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIGlzIGNyZWF0ZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXk6CgogICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlYykgdmVjdG9yPGludD47CgogICAgICAgICAgIFRoZSByZXN1bHRpbmcgY29kZSBwYXJzZWQgYnkgU1dJRyBpcyB0aGVuOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgaW50dmVjIHsKICAgICAgICAgICAgICAgICAgaW50ICpkYXRhOwogICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnR2ZWMoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgIGludCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIGludHZlYyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgTm90ZTogdGhlIGxhc3QgdHlwZWRlZiBpcyBub24tc3RhbmRhcmQgQyBhbmQgaXMgdXNlZCBieSBTV0lHIHRvIHByb3ZpZGUKICAgICAgICAgICBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBuYW1lICJpbnR2ZWMiIGFuZCB0aGUgdGVtcGxhdGUgdHlwZSAKICAgICAgICAgICAidmVjdG9yPGludD4iLgoKICAgICAgICAgICBDQVVUSU9OOiAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgdGhlIGZpcnN0IHRpbWUgU1dJRyBoYXMKICAgICAgICAgICBzdXBwb3J0ZWQgQysrIHRlbXBsYXRlcy4gICBFcnJvciByZXBvcnRpbmcgaXMgZXNzZW50aWFsIG5vbi1leGlzdGVudC4KICAgICAgICAgICBJdCB3aWxsIHByb2JhYmx5IGJyZWFrIGluIGNlcnRhaW4gY2FzZXMuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioqCgo4LzE1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gd3JhcHBpbmcgb2YgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiAgQXJyYXlzCiAgICAgICAgICAgYXJlIG5vdyBwcm9wZXJseSBtYXBwZWQgdG8gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCiAgICAgICAgICAgb25lIGxlc3MgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IFsxMF07ICAgICAgICAgICAgICAtLT4gIGludCAqCiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF07ICAgICAgICAgIC0tPiAgaW50ICgqKVsyMF07CiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF1bMzBdOyAgICAgIC0tPiAgaW50ICgqKVsyMF1bMzBdOwoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2VydGFpbiBTV0lHIGV4dGVuc2lvbnMgYmVjYXVzZQogICAgICAgICAgIG9sZGVyIHZlcnNpb25zIHNpbXBseSBtYXBwZWQgYWxsIGFycmF5cyBpbnRvIGEgc2luZ2xlCiAgICAgICAgICAgcG9pbnRlciBzdWNoIGFzICJpbnQgKiIuICAgQWx0aG91Z2ggcG9zc2libHkgdW51c3VhbCwgCiAgICAgICAgICAgdGhlIG5ldyB2ZXJzaW9uIGlzIGNvcnJlY3QgaW4gdGVybXMgb2YgdGhlIEMgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSBBcnJheSBzZXR0ZXJzIGdlbmVyYXRlZCBmb3Igc3RydWN0L2NsYXNzIGFycmF5IG1lbWJlcnMuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYW55IGltcHJvdmVtZW50cyB0byBUY2wvUGVybC9QeXRob24gbW9kdWxlcyB0byBiZXR0ZXIKICAgICAgICAgICB3b3JrIHdpdGggbXVsdGlwbGUgaW50ZXJmYWNlIGZpbGVzIGFuZCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgYmVoYXZpb3Igb2YgJWltcG9ydCBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBwb2xsdXRlcyB0aGUgbW9kdWxlIG5hbWVzcGFjZSBieSB1c2luZwogICAgICAgICAgICdmcm9tIG1vZHVsZSBpbXBvcnQgKicgdG8gcmVmZXIgdG8gdGhlIG90aGVyIG1vZHVsZS4gCiAgICAgICAgICAgSW5zdGVhZCwgaXQgZG9lcyBhIHByb3BlciAnaW1wb3J0IG1vZHVsZScuICAgQWxzbywgU1dJRwogICAgICAgICAgIG1heSB3b3JrIGEgbG90IGJldHRlciB3aGVuIGltcG9ydGluZyBtb2R1bGVzIHRoYXQgaW5jbHVkZQogICAgICAgICAgIHJlZmVyZW5jZXMgdG8gb3RoZXIgaW1wb3J0ZWQgbW9kdWxlcy4KCjgvMTMvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgbmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbGl6aW5nIHRob3NlIG9mIHRoZQoJICAgR3VpbGUtc3BlY2lmaWMgNS8yNy8yMDAxIGNoYW5nZXM6IAoJICAgKiAkZGVzY3JpcHRvciBpcyB0aGUgc2FtZSBhcyBTV0lHVFlQRSRtYW5nbGUsIGJ1dCBhbHNvCgkgICAgIGVuc3VyZXMgdGhhdCB0aGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoaXMgbmFtZSBnZXRzCgkgICAgIGRlZmluZWQuCgkgICAqICQqdHlwZSwgJCpsdHlwZSwgJCptYW5nbGUsICQqZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgc3RhciwgYnV0IHRoZXkgUkVNT1ZFIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyBmcm9tIHRoZSB0eXBlLiAoVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBwb2ludGVyIAoJICAgICB0eXBlcy4pCgkgICAqICQmdHlwZSwgJCZsdHlwZSwgJCZtYW5nbGUsICQmZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgYW1wZXJzYW5kLCBidXQgdGhleSBBREQgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIHRvIHRoZSB0eXBlLgoJICAgVGhlIEd1aWxlLXNwZWNpZmljIHN1YnN0aXR1dGlvbiAkYmFzZWRlc2NyaXB0b3Igd2FzIHJlbW92ZWQKCSAgIGJlY2F1c2UgaXQgd2FzIHVzZWxlc3MuCgo4LzEyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJWV4dGVybiBkaXJlY3RpdmUgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIHdpdGhkcmF3bi4gIFRoZQogICAgICAgICAgIHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUgd2FzIHRvIGltcG9ydCBzZWxlY3RlZCBkZWZpbml0aW9ucwogICAgICAgICAgIGZyb20gb3RoZXIgaW50ZXJmYWNlIGZpbGVzIGFuZCBoZWFkZXJzLiAgSG93ZXZlciwgdGhlIHNhbWUKICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggJWltcG9ydC4gICBUaGlzCiAgICAgICAgICAgbGVhdmVzIFNXSUcgd2l0aCB0d28gZmlsZSBpbmNsdXNpb24gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgZmlsZW5hbWUgICAgIC0gSW5zZXJ0cyBpbnRvIGN1cnJlbnQgaW50ZXJmYWNlCiAgICAgICAgICAgICAgJWltcG9ydCBmaWxlbmFtZSAgICAgIC0gSW1wb3J0IHR5cGVzIGFuZCBjbGFzc2VzIGZyb20gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBtb2R1bGUKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzA5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBuZXcgc3VwcG9ydCBmb3Igd3JhcHBpbmcgQy9DKysgY2FsbGJhY2sgZnVuY3Rpb25zLiAKICAgICAgICAgICBBIGNvbW1vbiBwcm9ibGVtIHdpdGggc29tZSBDIGxpYnJhcmllcyBpcyB0aGF0IG1hbnkKICAgICAgICAgICBmdW5jdGlvbnMgdGFrZSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBpbnQgKCpvcCkoaW50LGludCksIC4uLik7CgogICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHRoZSBvbmx5IHdheSB0byBjYWxsIHN1Y2ggYSBmdW5jdGlvbiBpcyB0bwogICAgICAgICAgIHBhc3MgaXQgYSBmdW5jdGlvbiBwb2ludGVyIG9mIHNvbWUgY29tcGF0aWJsZSB0eXBlLiAgSW4KICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgaGFkIHRvIHNvbHZlIHRoaXMgcHJvYmxlbQogICAgICAgICAgIHdpdGggc29tZSByZWFsbHkgZ3Jvc3MgaGFja3MuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGFzIGEgY2FsbGJhY2ssCgogICAgICAgICAgICAgICBpbnQgZm9vKGludCwgaW50KTsKCiAgICAgICAgICAgeW91IGhhZCB0byBpbnN0YWxsIGEgcG9pbnRlciB0byBpdCBhcyBhIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgCgogICAgICAgICAgICAgICBjb25zdCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciBpZiB5b3UgaGFkIGEgcmVhbGx5IG9sZCBTV0lHIHZlcnNpb246CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAoKk9QX0ZVTkMpKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBPUF9GVU5DLCAuLi4pOwogICAgICAgICAgICAgICBjb25zdCBPUF9GVU5DIEZPTyA9IGZvbzsKCiAgICAgICAgICAgCiAgICAgICAgICAgTm93LCB5b3UgY2FuIGRvIG9uZSBvZiB0d28gdGhpbmdzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCBmb28oaW50LGludCk7CgogICAgICAgICAgIFRoaXMgY3JlYXRlcyBhIGNvbnN0YW50ICdmb28nIG9mIHR5cGUgaW50ICgqKShpbnQsaW50KS4KICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbnMgYXJlIGluc3RhbGxlZCBhcyBjb25zdGFudHMgd2hlcmUKICAgICAgICAgICB0aGUgbmFtZSBpcyBkZWZpbmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGdpdmVuIHRvICVjYWxsYmFjaygpLgogICAgICAgICAgIElmIHRoZSBuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZGlmZmVyIGZyb20gdGhlCiAgICAgICAgICAgYWN0dWFsIGZ1bmN0aW9uIG5hbWUsIGJvdGggYSBmdW5jdGlvbiB3cmFwcGVyIGFuZCBhIGNhbGxiYWNrIAogICAgICAgICAgIGNvbnN0YW50IGFyZSBjcmVhdGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiUodXBwZXIpcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKICAgICAgICAgICAKICAgICAgICAgICBDcmVhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9ucyAnZm9vJywgJ2JhcicgYW5kIGFkZGl0aW9uYWxseQogICAgICAgICAgIGNyZWF0ZXMgdHdvIGNhbGxiYWNrIGNvbnN0YW50cyAnRk9PJywgJ0JBUicuCgogICAgICAgICAgIE5vdGU6IFNXSUcgc3RpbGwgZG9lcyBub3QgcHJvdmlkZSBhdXRvbWF0aWMgc3VwcG9ydCBmb3IgCiAgICAgICAgICAgd3JpdGluZyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogc3RydWN0IG5lc3RpbmcgZml4ZXMgYXMgcGVyIFNGIGJ1ZyAjNDQ3NDg4LgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVuYW1lIGRpcmVjdGl2ZSBub3cgYXBwbGllcyB0byBjb25zdGFudHMgY3JlYXRlZCB3aXRoCiAgICAgICAgICAgI2RlZmluZSBhbmQgJWNvbnN0YW50LiAgSG93ZXZlciwgbW9zdCBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgd2VyZSBuZXZlciB3cml0dGVuIHRvIHN1cHBvcnQgdGhpcyBhbmQgd2lsbCBoYXZlIHRvIGJlCiAgICAgICAgICAgbW9kaWZpZWQgdG8gbWFrZSBpdCB3b3JrLiAgVGNsLCBQeXRob24sIGFuZCBQZXJsIG1vZHVsZXMKICAgICAgICAgICBhcmUgd29ya2luZyBub3cuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBjaGFuZ2VzIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiBDIGRlY2xhcmF0aW9uIHBhcnNpbmcuCiAgICAgICAgICAgQWx0aG91Z2ggU1dJRyBpcyBzdGlsbCBub3QgYSBmdWxsIEMgcGFyc2VyLCBpdHMgYWJpbGl0eQogICAgICAgICAgIHRvIGhhbmRsZSBjb21wbGV4IGRhdGF0eXBlcyBpbmNsdWRpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIGFycmF5cyBoYXMgYmVlbiB2YXN0bHkgaW1wcm92ZWQuICAKCjgvMDMvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBEaXN0cmlidXRpb24gZml4ZXM6IGF1dG9jb25mIG5vIGxvbmdlciBuZWVkZWQgdG8gaW5zdGFsbCBTV0lHLgoKOC8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCB0d28gdW5kb2N1bWVudGVkIHBhcnNpbmcgZmVhdHVyZXMuICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgIHN1cHBvcnRzIG91dC1vZi1jbGFzcyBzdGF0aWMgZnVuY3Rpb24gb3IgdmFyaWFibGUKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IEZvbzo6YmFyOwoKICAgICAgICAgICBUaGlzIGZlYXR1cmUgbWF5IHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IGRlbWFuZC4gCiAgICAgICAgICAgSG93ZXZlciwgc2luY2UgU1dJRyBpcyBtb3N0IG9mdGVuIHVzZWQgd2l0aCBoZWFkZXIgZmlsZXMsCiAgICAgICAgICAgaXQgaXMgbW9yZSBsaWtlbHkgZm9yIHRoZXNlIGRlZmluaXRpb25zIHRvIGJlIGluY2x1ZGVkCiAgICAgICAgICAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBDbGVhbnVwIG9mIHRoZSBHSUZQbG90IGV4YW1wbGVzLiBVcGdyYWRlZCBKYXZhIEdJRlBsb3QgZXhhbXBsZS4KCjgvMDEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBFZmZpY2llbmN5IGNoYW5nZXM6IF9jUHRyIHVzZWQgd2hlcmUgcG9zc2libGUgcmF0aGVyIHRoYW4KCSAgICAgZ2V0Q1B0cigpLiBCdWcgZml4ZXMgZm9yIGluaGVyaXRhbmNlIC0gZGVyaXZlZCBjbGFzcyBzb21ldGltZXMKCSAgICAgZGlkbid0IGRlbGV0ZSB0aGUgYyBtZW1vcnkgd2hlbiBfZGVsZXRlKCkgd2FzIGNhbGxlZC4KCSAgICogW0phdmFdIEFic3RyYWN0IGMrKyBjbGFzc2VzIGFyZSB3cmFwcGVkIHdpdGggYSBqYXZhIGFic3RyYWN0IHNoYWRvdwoJICAgICBjbGFzcy4gQWxzbyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBpcyBtYXBwZWQgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QuCgkgICAqIFRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGhhcyBhbHdheXMgYmVlbiA8bW9kdWxlPl93cmFwLmMuIEl0IGlzIG5vdwoJICAgICA8bW9kdWxlPl93cmFwLmN4eCBpZiB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24gaXMgcGFzc2VkIHRvIHN3aWcuCgkgICAgIFRoaXMgaGFzIGJlZW4gZG9uZSBhcyBvdGhlcndpc2UgYysrIGNvZGUgd291bGQgYXBwZWFyIGluIGEgYyBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKCjcvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIHRvIGJlIG1vcmUgQy1saWtlIGluIHN5bnRheC4KICAgICAgICAgICBUaGUgc3ludGF4IGlzIG5vdzoKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgTkFNRSA9IFZBTFVFOwogICAgICAgICAgICAgICAgJWNvbnN0YW50IFRZUEUgTkFNRSA9IFZBTFVFOwogCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IEZvbyAqQmFyID0gJlNwYW07CgogICAgICAgICAgIEEgbW9yZSBzdWJ0bGUgY2FzZSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBibGFoOwoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIE1vZHVsZXMgdGhhdCB3ZXJlIHVzaW5nCiAgICAgICAgICAgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgZGlyZWN0bHkgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICAgICAKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBvYnNjdXJlIGFuZCB1bmRvY3VtZW50ZWQgZm9ybSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAlaW5saW5lIGludCBibGFoKGludCBhLCBpbnQgYikgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCiAgICAgICAgICAgKG5vdGU6IHRoaXMgZmVhdHVyZSB3YXMgbmV2ZXIgZG9jdW1lbnRlZCBhbmQgaXMgd2l0aGRyYXduKQoKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyBleHBsaWNpdGx5IGRlY2xhcmVkCiAgICAgICAgICAgcmV0dXJuIHR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGZvbyhpbnQpOwoKICAgICAgICAgICBJbiBDLCBzdWNoIGZ1bmN0aW9ucyB3ZXJlIGltcGxpY2l0bHkgYXNzdW1lZCB0byByZXR1cm4gYW4gJ2ludCcuCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzIGlsbGVnYWwuICBFaXRoZXIgd2F5LCBpdCdzIGNvbnNpZGVyZWQgYmFkCiAgICAgICAgICAgc3R5bGUuICBSZW1vdmluZyBzdXBwb3J0IGZvciB0aGlzIGluIFNXSUcgd2lsbCBzaW1wbGlmeQogICAgICAgICAgIGNlcnRhaW4gaXNzdWVzIGluIHBhcnNpbmcuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzMwLzIwMDE6IG1rb2VwcGUKCSAgICogUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsuICBUaGUgU291cmNlL0RPSCBkaXJlY3RvcnkKCSAgICAgYW5kIG1vc3Qgb2YgdGhlIFNvdXJjZS9Td2lnIGRpcmVjdG9yeSBpcyB1cC10by1kYXRlIG5vdy4KCSAgICogW0d1aWxlXSAlc2NoZW1lIGlzIG5vdyBhIG1hY3JvIGZvciAlaW5zZXJ0KCJzY2hlbWUiKS4gIAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAiRklMRU5BTUUiOyAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgJXsgU0NIRU1FLUNPREUgJX0KCSAgICAgTmV3IG1hY3JvcyAlbXVsdGlwbGVfdmFsdWVzLCAldmFsdWVzX2FzX2xpc3QsCgkgICAgICV2YWx1ZXNfYXNfdmVjdG9yLiAKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBoYXZlIGJlZW4gdHVybmVkIGludG8gU1dJRyBwcmFnbWFzLgogICAgICAgICAgICVwcmFnbWEoc3dpZykgcmVhZG9ubHkgYW5kICVwcmFnbWEoc3dpZykgcmVhZHdyaXRlLiAgTWFjcm9zCiAgICAgICAgICAgYXJlIHVzZWQgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXByYWdtYSBkaXJlY3RpdmUuICAlcHJhZ21hIG11c3QgYWx3YXlzCiAgICAgICAgICAgYmUgZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyBsYW5ndWFnZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcHJhZ21hKHN3aWcpIG1ha2VfZGVmYXVsdDsKICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImJsYWguaSI7CgogICAgICAgICAgIEFsc28gZXh0ZW5kZWQgdGhlIHByYWdtYSBkaXJlY3RpdmUgdG8gYWxsb3cgY29kZSBibG9ja3MKIAogICAgICAgICAgICAgICVwcmFnbWEoZm9vKSBjb2RlID0gJXsKICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0aGUgd2F5ICdjb25zdCcgdmFyaWFibGVzIGFyZSB3cmFwcGVkLiAgSW4gCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgYSAnY29uc3QnIHZhcmlhYmxlIHdhcwogICAgICAgICAgIHdyYXBwZWQgYXMgYSBjb25zdGFudC4gICBOb3csICdjb25zdCcgdmFyaWFibGVzIGFyZQogICAgICAgICAgIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gIFRoZXJlIGFyZSBzZXZlcmFsCiAgICAgICAgICAgcmVhc29ucyBmb3IgbWFraW5nIHRoaXMgY2hhbmdlLCBtb3N0bHkgcGVydGFpbmluZyB0bwogICAgICAgICAgIHN1YnRsZSBkZXRhaWxzIG9mIGhvdyAnY29uc3QnIGFjdHVhbGx5IHdvcmtzLiAKCiAgICAgICAgICAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIG9sZCBpbnRlcmZhY2VzIHRoYXQgdXNlZCAnY29uc3QnCiAgICAgICAgICAgdG8gY3JlYXRlIGNvbnN0YW50cy4gICBBcyBhIHJlcGxhY2VtZW50LCBjb25zaWRlciB1c2luZyB0aGlzOgoKICAgICAgICAgICBjb25zdCBpbnQgYSA9IDQ7ICAgPT09PiAgICVjb25zdGFudCBpbnQgYSA9IDQ7CiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW9yZ2FuaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24gb2YgdHlwZSBwYXJzaW5nLgogICAgICAgICAgIFR5cGVzIHdpdGggJ2NvbnN0JyBzaG91bGQgd29yayBjb3JyZWN0bHkgbm93LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9zdCBzd2lnIGRpcmVjdGl2ZXMgcmVsYXRlZCB0byB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KICAgICAgICAgICBhcmUgbm93IGRlcHJlY2F0ZWQuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIE9iamVjdGl2ZS1DIGluIG9yZGVyIHRvIHNpbXBsaWZ5CiAgICAgICAgICAgcGFyc2VyIHJlY29uc3RydWN0aW9uLiAgV2lsbCByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudAogICAgICAgICAgIGRlbWFuZC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENvZGUgaW5jbHVzaW9uIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSBwYXJzZXIuICBBIGNvbW1vbgogICAgICAgICAgIGRpcmVjdGl2ZSAlaW5zZXJ0IGlzIG5vdyB1c2VkIGZvciBldmVyeXRoaW5nLiAgVGhpcwogICAgICAgICAgIGluc2VydHMgYSBmaWxlIGludG8gdGhlIG91dHB1dDoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAiZm9vLnN3ZyIKCiAgICAgICAgICAgVGhpcyBpbnNlcnRzIHNvbWUgaW5saW5lIGNvZGUgaW50byB0aGUgb3V0cHV0CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgJXsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uIAogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGVyZSBhcmUgZml2ZSBwcmVkZWZpbmVkIHRhcmdldHMgZm9yIHRoZSBpbnNlcnQgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgImhlYWRlciIgICAgLSBIZWFkZXIgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgInJ1bnRpbWUiICAgLSBSdW50aW1lIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJ3cmFwcGVyIiAgIC0gV3JhcHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgICJpbml0IiAgICAgIC0gSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgICAgICAgICAgICAgIm51bGwiICAgICAgLSBOb3RoaW5nLiBEaXNjYXJkLgoKICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgYXJlIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGFyZQogICAgICAgICAgIG5vdyBkZWZpbmVkIGluIHRlcm1zIG9mIG1hY3JvczoKCiAgICAgICAgICAgICAgICV7IC4uLiAlfSAgICAgICAgICAgLT4gJWluc2VydChoZWFkZXIpICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJWluaXQgJXsgLi4uICV9ICAgICAtPiAlaW5zZXJ0KGluaXQpICAgICV7IC4uLiAlfQogICAgICAgICAgICAgICAld3JhcHBlciAleyAuLi4gJX0gIC0+ICVpbnNlcnQod3JhcHBlcikgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVydW50aW1lICV7IC4uLiAlfSAgLT4gJWluc2VydChydW50aW1lKSAleyAuLi4gJX0KCiAgICAgICAgICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gZGVmaW5lIG5ldyBuYW1lZCB0YXJnZXRzIGJ5IHVzaW5nIHRoZQogICAgICAgICAgIEMgQVBJIGZ1bmN0aW9uIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgpIChzZWUgbWFpbi5jeHgpLgogICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGV4cG9zZSBhIHNoYWRvdyBjbGFzcyBmaWxlLAogICAgICAgICAgIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoInNoYWRvdyIsIGZfc2hhZG93KTsKCiAgICAgICAgICAgVGhlbiBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAgICVpbnNlcnQoc2hhZG93KSAleyAuLi4gJX0KCiAgICAgICAgICAgTm90ZTogdGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgYW55IG9sZCBpbnRlcmZhY2VzLCBidXQKICAgICAgICAgICBkb2VzIG9wZW4gdXAgbmV3IHBvc3NpYmlsaXRpZXMgZm9yIGVuaGFuY2VtZW50cy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGFsd2F5cyBpbmNsdWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgZmlsZSAnc3dpZy5zd2cnLgogICAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zCiAgICAgICAgICAgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHZhcmlvdXMgU1dJRyBkaXJlY3RpdmVzLgogICAgICAgICAgIFByZXZpb3VzbHksIGFsbCBTV0lHIGRpcmVjdGl2ZXMgd2VyZSBoYW5kbGVkIGFzIHNwZWNpYWwKICAgICAgICAgICBjYXNlcyBpbiB0aGUgcGFyc2VyLiAgVGhpcyBtYWRlIHRoZSBwYXJzZXIgYSBsYXJnZSAKICAgICAgICAgICBibG9hdGVkIG1lc3MuICBOb3csIHRoZSBwYXJzZXIgaXMgc3RyaXBwZWQgZG93biB0byBhIGZldwogICAgICAgICAgIHNpbXBsZSBkaXJlY3RpdmVzIGFuZCBtYWNyb3MgYXJlIHVzZWQgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgZWxzZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEZpeGVzIGZvciBTb3VyY2Vmb3JnZSBidWcgIzQ0NDc0OCAtIG5ldyB0ZXN0Y2FzZSBjcHBfc3RhdGljOgoJICAgICBbVENMXSBDbGFzcyB3aXRoIGp1c3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZS9mdW5jdGlvbiBmaXgKCSAgICAgW0phdmFdIEZpeGVkIHN0YXRpYyB2YXJpYWJsZXMgc3VwcG9ydAoJICAgICBbUnVieV0gU3RhdGljIHZhcmlhYmxlcyB3b3JrYXJvdW5kIHJlbW92ZWQKCjcvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBzdHlwZS5jIChTd2lnVHlwZV9kZWZhdWx0KTogU3RyaXAgcXVhbGlmaWVycyBmaXJzdC4gVGhlCgkgICAgIGRlZmF1bHQgdHlwZSBvZiAiaW50ICogY29uc3QiIGlzIG5vdyAiU1dJR1BPSU5URVIgKiIuCgkgICAqIG1haW4uY3h4OiBEZWZpbmUgIl9fY3BsdXNwbHVzIiBpbiBTV0lHJ3MgcHJlcHJvY2Vzc29yIGlmCgkgICAgIGluIEMrKyBtb2RlLgoJICAgKiBbR3VpbGVdOiBBZGRlZCBzb21lIHN1cHBvcnQgZm9yIGFycmF5cyBhbmQgQysrCgkgICAgIHJlZmVyZW5jZXMsIGZpeGluZyB0aGUgImNvbnN0YW50X3BvaW50ZXJzIiB0ZXN0IGNhc2UuCgkgICAqIE1vdmVkIG1vc3QgdGVzdHMgZnJvbSB0aGUgb2xkIEd1aWxlLXNwZWNpZmljIHRlc3Qtc3VpdGUKCSAgICAgdG8gdGhlIG5ldyB0ZXN0LXN1aXRlLiAgQWxzbyBtb3ZlZCBwZXJsNS9wb2ludGVyLWN4eAoJICAgICBleGFtcGxlIHRoZXJlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogVGVzdC1zdWl0ZSBhZGRlZC4KCSAgICogSW5pdGlhbCB0ZXN0Y2FzZXM6IGNvbnN0YW50X3BvaW50ZXJzIGNwcF9lbnVtIGRlZmluZXMKCSAgICAgc2l6ZW9mX3BvaW50ZXJzIHVuaW9ucyB2aXJ0dWFsX2Rlc3RydWN0b3IKCSAgICogTWFrZSBjbGVhbiBpbXByb3ZlbWVudHMuCgo3LzI0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gVW5kZXJzY29yZXMgaW4gdGhlIHBhY2thZ2UgbmFtZSBhbmQvb3IgbW9kdWxlIG5hbWUKCSAgIG5vIGxvbmdlciBnaXZlIGxpbmtpbmcgcHJvYmxlbXMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNb3JlIHBhcnNlciBidWcgZml4ZXMgZm9yIGNvbnN0YW50IHBvaW50ZXJzCgo3LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXSBBZXN0aGV0aWMgaW1wcm92ZW1lbnQgaW4gdmFyaWFibGUgd3JhcHBlcnMuCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIGNvcmUtZHVtcCBwcm9ibGVtIGluIHBvaW50ZXIgbGlicmFyeSB3aGVuIAogICAgICAgICAgICAgZnJlZWluZyBjaGFyYWN0ZXIgYXJyYXlzLgogICAgICAgICAgICAgU0YgQnVnIFsgIzQxNTgzNyBdIHBvaW50ZXIgbGliIGNvcmUgZHVtcAoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBkZXN0cnVjdG9ycyBhbmQgc2hhZG93CiAgICAgICAgICAgICBjbGFzc2VzLiAgU0YgYnVnICMyMjExMjguCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIFRvIHByb3ZpZGUgYmV0dGVyIGxpbmUtbnVtYmVyIHRyYWNraW5nIGluIGludGVyZmFjZXMKICAgICAgICAgICAgIHdpdGggbG90cyBvZiBtYWNyb3MsIHNwZWNpYWwgbG9jYXRvciBjb21tZW50cyBhcmUKICAgICAgICAgICAgIG5vdyBnZW5lcmF0ZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8qQGZvby5pLDQyLEJMQUhAKi9leHBhbmRlZCBtYWNyby8qQEAqLwoKICAgICAgICAgICAgIFRoZSBmaXJzdCAvKkAuLi5AKi8gc2VxdWVuY2Ugc2V0cyB0aGUgY29udGV4dAogICAgICAgICAgICAgdG8gcG9pbnQgdG8gdGhlIG1hY3JvIGNvZGUuICBUaGUgLypAQCovIGNvbW1lbnQKICAgICAgICAgICAgIHRlcm1pbmF0ZXMgdGhlIGNvbnRleHQuICBUaGUgU1dJRyBwYXJzZXIgc2hvdWxkCiAgICAgICAgICAgICBpZ25vcmUgYWxsIG9mIHRoZSBsb2NhdG9yIGNvbW1lbnRzIGFzIHNob3VsZAogICAgICAgICAgICAgdGhlIEMgY29tcGlsZXIgKHNob3VsZCBzdWNoIGNvbW1lbnRzIGVuZCB1cAogICAgICAgICAgICAgaW4gZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSkuCgo3LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgaGFuZGxlcyBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzIGluCgkgICB0eXBlbWFwcy4gIFRoaXMgaW50cm9kdWNlZCBhIG5ldyBzaGlmdC9yZWR1Y2UgY29uZmxpY3QsIGJ1dAoJICAgb25seSB3aXRoIGEgaGV1cmlzdGljIGZ1bmN0aW9uLXBvaW50ZXIgY2F0Y2gtYWxsIHJ1bGUuICAKCSAgICogW0d1aWxlXTogQWRkZWQgdHlwZW1hcHMgZm9yIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMuIAoJICAgKiBGaXhlZCB0aGUgInRlbXBsYXRlLXdoaXRlc3BhY2UiIHByb2JsZW0gYnkgY2Fub25pY2FsaXppbmcKCSAgICAgd2hpdGVzcGFjZSwgZXNwZWNpYWxseSBhcm91bmQgYW5nbGUgYnJhY2tldHMgYW5kIGNvbW1hcy4gCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogQSBTY2hlbWUgZmlsZSBpcyBlbWl0dGVkIGlmIHRoZSAtc2Ntc3R1YiBGSUxFLlNDTQoJICAgY29tbWFuZC1saW5lIG9wdGlvbiBpcyB1c2VkLiAgVGhlICVzY2hlbWUgZGlyZWN0aXZlCgkgICAoaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3IgYSBwcmFnbWEpIGFsbG93cyB0byBpbnNlcnQKCSAgIGFyYml0cmFyeSBjb2RlIGhlcmUuICBJbiAic2ltcGxlIiBhbmQgInBhc3NpdmUiIGxpbmthZ2UsCgkgICB0aGUgZmlsZSBnZXRzIGZpbGxlZCB3aXRoIGRlZmluZS1tb2R1bGUgYW5kIGV4cG9ydAoJICAgZGVjbGFyYXRpb25zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogUGFyc2VyIGJ1ZyBmaXggdG8gc3VwcG9ydCBjb25zdGFudCBwb2ludGVycywgZWcgaW50KiBjb25zdCBwdHIuCgkgICBGaXhlZCBldmVyeXdoZXJlIC0gdmFyaWFibGVzLCBwYXJhbWV0ZXJzLCByZXR1cm4gdHlwZXMgZXRjLiBOb3RlIHRoYXQKCSAgIHdoZW4gd3JhcHBpbmcgYSBjb25zdGFudCBwb2ludGVyIHZhcmlhYmxlIG9ubHkgdGhlIGdldHRlciBpcyBnZW5lcmF0ZWQuCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogRml4ZWQgU0YgYnVnICM0NDE0NzAgKCNkZWZpbmUgWCAiLy8iIHdvdWxkIG5vdCBiZSBwYXJzZWQsCgkgICAgIHNlZSB0ZXN0LXN1aXRlIGVudHJ5ICJwcmVwcm9jLTEiKSwgcmVwb3J0ZWQgYnkgVC4gVy4gQnVydG9uCgkgICAgIDx0d2J1cnRvbkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBDaGFuZ2VkIHRoZSB0eXBlIG9mIGNoYXJhY3RlciBjb25zdGFudHMgdG8gImNoYXIiLCByYXRoZXIKCSAgICAgdGhhbiAiY2hhciAqIi4gIENoYW5nZWQgdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcwoJICAgICB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBleGNlcHQgZm9yIHRoZSBHdWlsZSBtb2R1bGUsCgkgICAgIHdoZXJlIGl0IGlzIGRlc2lyZWQgdG8gbWFrZSB0aGVtIFNjaGVtZSBjaGFyYWN0ZXJzLiAgVGhpcwoJICAgICBmaXhlcyBTRiBidWcgIzIzMTQwOSwgdGVzdC1zdWl0ZSBlbnRyeSAiY2hhci1jb25zdGFudCIuCgkgICAqIEFwcGxpZWQgcGF0Y2ggZm9yIERPSC9Eb2gvbWVtb3J5LmMgYnkgTGVzIFNjaGFmZmVyCgkgICAgIDxzY2hhZmZlckBvcHRvbmxpbmUubmV0PiAoYXZvaWQgcmVxdWlyZWQgc2lkZSBlZmZlY3RzIGluCgkgICAgIGFzc2VydCkuIAoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvciB3aXRoIHZvaWQgYXMgcGFyYW1ldGVyCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyICNkZWZpbmVzIGVtYmVkZGVkIHdpdGhpbiBjbGFzc2VzL3N0cnVjdHMvdW5pb25zCgkgICBDb25zZXF1ZW50bHkgJWNvbnN0YW50IGNhbiBub3cgYWxzbyBiZSBwbGFjZWQgd2l0aGluIGEgc3RydWN0L2NsYXNzL3VuaW9uLgoJICAgKiBCdWcgZml4IGluIHBhcnNlciB0byBhbGxvdyBzaXplb2YoKklfYW1fYV9wb2ludGVyKSB3aXRoaW4gYSAjZGVmaW5lCgo3LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogQWRkZWQgY2hhbmdlcyBmb3IgdGhlIE1hY2ludG9zaCBjb250cmlidXRlZCBieSBMdWlnaQoJICAgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LiAKCSAgICogU29tZSAiY29uc3QiIGZpeGVzIGluIHRoZSBjb2RlLgoJICAgKiBbR3VpbGVdOiBNYWRlIHRoZSBjb25zdGFudC13cmFwcGVyIGZ1bmN0aW9ucyBtdWNoIHNob3J0ZXIuCgo3LzEzLzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogU29tZSAiY29uc3QiIGZpeGVzIGZvciBHdWlsZSB2ZXJzaW9uIDEuMy40LgoJICAgKiBIYW5kbGUgYW5vbnltb3VzIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCBzdGF0aWMKCSAgICAgYXJyYXkgbWVtYmVycyBvZiBjbGFzc2VzLiAgQm90aCBidWdzIHJlcG9ydGVkIGJ5IEFubmFsaXNhIFRlcnJhY2luYQoJICAgICA8YW5uYWxpc2EudGVycmFjaW5hQGRhdGFtYXQuaXQ+OyBzZWUgdGhlIGZpbGVzCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvc3RhdGljLWFycmF5LW1lbWJlci5pIGFuZAoJICAgICBhbm9ueW1vdXMtYXJnLmkuCgpWZXJzaW9uIDEuMy42ICAoSnVseSA5LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNy8wOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogRk9SRUdST1VORCBhbmQgQkFDS0dST1VORCBkZWZpbml0aW9uIG1pc3NpbmcgCgkgICBhZnRlciBUUkFOU1BBUkVOVCAjZGVmaW5lIGZpeCBpbiBHSUZQbG90Cgo3LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXJzIHNvIHRoYXQgdGhlIHJlbGVhc2UgaXMga25vd24KICAgICAgICAgICBhcyAxLjMuNi4gIEFsbCBmdXR1cmUgcmVsZWFzZXMgc2hvdWxkIGhhdmUgYSBzaW1pbGFyCiAgICAgICAgICAgdmVyc2lvbiBmb3JtYXQuCgo3LzAyLzIwMDE6IG1rb2VwcGUKCSAgICogW1B5dGhvbl06IFByZXZlbnQgdGhlIHByb2JsZW0gb2Ygc2VsZi50aGlzb3duIG5vdCBiZWluZwoJICAgZGVmaW5lZCBpZiB0aGUgQysrIGNsYXNzIGNvbnN0cnVjdG9yIHJhaXNlZCBhbiBleGNlcHRpb24uCgkgICBUaGFua3MgdG8gTHVpZ2kgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LgoKNi8yOS8yMDAxOiBta29lcHBlCgkgICAqIE1vcmUgcG9ydGFiaWxpdHkgZml4ZXM7IGZpeGVkICJnY2MgLVdhbGwiIHdhcm5pbmdzLgoKNi8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogVFJBTlNQQVJFTlQgI2RlZmluZSBtdWx0aXBsZSB0aW1lcyBvbiBTb2xhcmlzIAoJICAgKGNsYXNoZXMgd2l0aCBzdHJlYW0uaCkuCgkgICAqIE11bHRpcGxlIGRlZmluaXRpb24gYnVnIGZpeCBmb3Igc2hhZG93IGNsYXNzZXMuIFRoZSBwZXJsIGFuZCBweXRob24gCgkgICBtb2R1bGVzIGhhZCB3b3JrYXJvdW5kcyB3aGljaCBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBmaXhlcyBpbiAKCSAgIHRoZSBjb3JlLiBNYW55IG9mIHRoZSBMYW5ndWFnZTo6Y3BwX3h4eHggZnVuY3Rpb25zIG5vdyBzZXQgYSAKCSAgIGZsYWcgd2hpY2ggdGhlIGRlcml2ZWQgY2xhc3NlcyBjYW4gYWNjZXNzIHRocm91Z2ggCgkgICBpc19tdWx0aXBsZV9kZWZpbml0aW9uKCkgdG8gc2VlIHdoZXRoZXIgb3Igbm90IGNvZGUgc2hvdWxkIGJlIAoJICAgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgYmVsb3cgd291bGQgaGF2ZSBwcm9kdWNlZCB2YXJ5aW5nIGRlZ3JlZXMgCgkgICBvZiBpbmNvcnJlY3Qgc2hhZG93IGNsYXNzIGNvZGUgZm9yIHRoZSB2YXJpb3VzIG1vZHVsZXM6CgkgICBjbGFzcyBUZXN0Q2xhc3MKCSAgIHsKCSAgIHB1YmxpYzoKCSAgICAgVGVzdENsYXNzKCkge30KCSAgICAgVGVzdENsYXNzKGludCBhKSB7fQoJICAgICB+VGVzdENsYXNzKCkge30KCSAgICAgdW5zaWduZWQgbG9uZyB4eXooc2hvcnQgaykge30KCSAgICAgdW5zaWduZWQgbG9uZyB4eXooaW50IG4pIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKCkge30KCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoaW50IGEpIHt9CgkgICB9OwoJICAgdm9pZCBkZWxldGVfVGVzdENsYXNzKGludCBhKTsKCjYvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBbUGVybF0gQW5vdGhlciBjb25zdC1yZWxhdGVkIHBvcnRhYmlsaXR5IGZpeC4KCjYvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBBZGRlZCBpbiBjcHBfcHJhZ21hKCkgc3VwcG9ydCB3aXRoIGEgaG9zdCBvZiBuZXcgcHJhZ21hcyAtIHNlZSAKCSAgIGpzd2lnLmh0bWwuIFRoZXNlIGFyZSBkZXNpZ25lZCBmb3IgYmV0dGVyIG1peGluZyBvZiBKYXZhIGFuZCBjKysuIEl0IAoJICAgZW5hYmxlcyB0aGUgdXNlciB0byBzcGVjaWZ5IHB1cmUgSmF2YSBjbGFzc2VzIGFzIGJhc2VzIGFuZC9vciBpbnRlcmZhY2VzIAoJICAgZm9yIHRoZSB3cmFwcGVkIGMvYysrLgoJICAgKiBbSmF2YV0gT2xkIHByYWdtYXMgcmVuYW1lZC4gV2FybmluZyBnaXZlbiBmb3IgdGhlIG1vbWVudCBpZiB1c2VkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8yNS8yMDAxOiBta29lcHBlCgkgICAqIEluY29ycG9yYXRlZCBtb3JlIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiBmb3Igc3dpZy9ydWJ5IG9uIGN5Z3dpbi4KCjYvMjAvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1ha2VmaWxlIG1vZHMgc28gdGhhdCAnbWFrZSBjaGVjaycgdXNlcyB0aGUgc3dpZyBvcHRpb25zIGluIHRoZSBtYWtlZmlsZXMKCSAgICogW0phdmFdIFJlbW92ZWQgR2VuZXJhdGluZyB3cmFwcGVycyBtZXNzYWdlCgkgICAqIFtKYXZhXSBOVUxMIHBvaW50ZXIgYnVnIGZpeAoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgS2FmZmUgSlZNCgo2LzIwLzIwMDE6IG1rb2VwcGUKCSAgICogU1dJR19UeXBlUXVlcnkgZnJvbSBjb21tb24uc3dnIG5vdyByZXR1cm5zIGEKCSAgIHN3aWdfdHlwZV9pbmZvKiByYXRoZXIgdGhhbiBhIHZvaWQqLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0KCSAgIHdoZW4gdXNpbmcgcG9pbnRlci5pIGFuZCBDKyssIGFzIGlsbHVzdHJhdGVkIGJ5IHRoZSBuZXcKCSAgIHRlc3Qtc3VpdGUgZXhhbXBsZSBwZXJsNS9wb2ludGVyLWN4eC4KCSAgICogUG9ydGFiaWxpdHkgZml4ZXMgKGNvbnN0IGNoYXIgKikuIAoJICAgKiBJbmNvcnBvcmF0ZWQgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+LCB3aGljaCBtYWtlIHN3aWcgcnVubmFibGUgb24gY3lnd2luLgoKNi8xOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIFNGIGJ1ZyAjMjExMTQ0LiBUaGlzIGZpeCBpcyBhIHdvcmthcm91bmQgCgkgICAgIHVudGlsIGZpeGVkIGluIHRoZSBjb3JlLgoKNi8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFBvcnRhYmlsaXR5IGZpeGVzIGZvciB1c2Ugd2l0aCB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMuIAoJICAgKiBbVGNsXTogUG9ydGFiaWxpdHkgZml4IChjb25zdCBjaGFyICopLgoJICAgKiBbVGNsXTogQ29uZmlndXJlIG5vdyBmaXJzdCB0cmllcyB0byBmaW5kIGEgdGNsQ29uZmlnLnNoCgkgICBmaWxlIGluIG9yZGVyIHRvIGZpbmQgdGhlIFRjbCBpbmNsdWRlIGRpcmVjdG9yeSwgbGlicmFyeQoJICAgbG9jYXRpb24gYW5kIGxpYnJhcnkgbmFtZS4KCSAgICogW1B5dGhvbl06IEFkZGVkIGEgZmV3IHBvc3NpYmxlIGxpYnJhcnkgbG9jYXRpb25zLgoKNi8xOC8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IERvbid0IGNhbGwgc2NtX2NfZXhwb3J0IGlmIG5vdGhpbmcgaXMgdG8gYmUKCSAgICAgZXhwb3J0ZWQuICBEb24ndCB3YXJuIG9uICVtb2R1bGUgaWYgbW9kdWxlIGhhcyBiZWVuIHNldAoJICAgICBhbHJlYWR5ICh0aGlzIGZyZXF1ZW50bHkgb2NjdXJzIHdoZW4gJWltcG9ydCBpcyB1c2VkKS4KCjYvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBOZXcgInBhc3NpdmUiIGxpbmthZ2UsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIGZvcgoJICAgICBtdWx0aS1tb2R1bGUgZXh0ZW5zaW9ucyB3aXRob3V0IEd1aWxlIG1vZHVsZSBtYWdpYy4KCjYvMTUvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBGaXhlZCBwcmludGluZyBvZiBzbW9icyAoc3BhY2UgYW5kIGFuZ2xlIHdlcmUKCSAgICAgbWlzc2luZykuIAoJICAgKiBQcm9wZXJseSBnZW5lcmF0ZSB0eXBlIGluZm9ybWF0aW9uIGZvciBiYXNlIGNsYXNzZXMKCSAgICAgaW1wb3J0ZWQgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuICBUaGFua3MgdG8gTWFyY2VsbwoJICAgICBNYXR1cyA8bW1hdHVzQGFjbXMuYXJpem9uYS5lZHU+IGZvciB0aGUgcmVwb3J0IGFuZCB0aGUKCSAgICAgcGF0Y2g7IHRoaXMgY2xvc2VzIFNGIGJ1ZyAjMjMxNjE5OyBzZWUgYWxzbwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2ltcG9ydCouIAoJICAgKiBbR3VpbGVdOiBGaXggY2FzdGluZyBiZXR3ZWVuIGNsYXNzIGFuZCBiYXNlIGNsYXNzOyB0aGUKCSAgICAgcnVudGltZSB0eXBlIHN5c3RlbSBoYWQgaXQgdGhlIHdyb25nIHdheSBhcm91bmQ7IHNlZQoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL2Nhc3RzLmkKCSAgICogTWFrZSB0eXBlbWFwcyBmb3IgU1dJR1BPSU5URVIgKiB3aXRoIGFyZyBuYW1lIHRha2UKCSAgICAgcHJlY2VkZW5jZSBvdmVyIHRob3NlIHdpdGhvdXQgYXJnIG5hbWUsIHRvIG1hdGNoIG5vcm1hbAoJICAgICB0eXBlbWFwIHByZWNlZGVuY2UgcnVsZXMuCgkgICAqIEZpeGVkIHRoZSByYW5kb20tbGluZS1udW1iZXJzIHByb2JsZW0gcmVwb3J0ZWQgYXMgU0YgYnVnCgkgICAgICMyMTczMTA7IHRoYW5rcyB0byBNaWNoYWVsIFNjaGFyZiA8c2NoYXJmQHVzZXJzLnNmLm5ldD4uCgkgICAqIFtHdWlsZV06IEhhbmRsZSB0aGUgJW5hbWUgYW5kICVyZW5hbWUgZGlyZWN0aXZlcy4KCSAgICogTmV3IHN5bnRheDogJW5hbWUgYW5kICVyZW5hbWUgbm93IG9wdGlvbmFsbHkgdGFrZSBkb3VibGUKCSAgICAgcXVvdGVzIGFyb3VuZCB0aGUgc2NyaXB0aW5nIG5hbWUuICBUaGlzIGlzIHRvIGFsbG93IHNjcmlwdGluZwoJICAgICBuYW1lcyB0aGF0IGFyZW4ndCB2YWxpZCBDIGlkZW50aWZpZXJzLgoKNi8xNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFkZSBhIG1pbm9yIGNoYW5nZSB0byB0aGUgd2F5IGZpbGVzIGFyZSBsb2FkZWQgaW4KICAgICAgICAgICBvcmRlciB0byBnZXQgZmlsZS9saW5lIG51bWJlciByZXBvcnRpbmcgY29ycmVjdCBpbgogICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IuCgo2LzE0LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgdGhlIChub24tc3RhbmRhcmQpICJsb25nIGxvbmciCgkgICAgIHR5cGVzLiBJdCBpcyB1cCB0byB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzIHRvCgkgICAgIHByb3ZpZGUgdHlwZW1hcHMgaWYgbmVlZGVkLiBSZXBvcnRlZCBieSBTYW0gU3RlaW5nb2xkLCBTRgoJICAgICBidWcgIzQyOTE3Ni4KCSAgICogVGhlIHBhcnNlciBub3cgdW5kZXJzdGFuZHMgYXJndW1lbnRzIGxpa2UgImNvbnN0IGludCAqCgkgICAgIGNvbnN0IGkiLiBUaGlzIGZpeGVzIFNGIGJ1ZyAjMjE1NjQ5LgoJICAgKiBGaXhlZCB0aGUgR3VpbGUgdGVzdC1zdWl0ZS4KCjYvMTMvMjAwMTogbWtvZXBwZQoJICAgUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsgYXQgdGFnCgkgICAibWtvZXBwZS1tZXJnZS0xIi4gVGhpcyBjb3ZlcnMgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgoKfCAwMS8xNi8wMTogdHRuCnwJICAgV3JvdGUgdGFibGUgb2YgY29udGVudHMgZm9yIERvYy9lbmdpbmVlcmluZy5odG1sLiAgQWRkZWQgc2VjdGlvbgp8CSAgIG9uIENWUyB0YWdnaW5nIGNvbnZlbnRpb25zLiAgQWRkZWQgY29weXJpZ2h0IHRvIG90aGVyIGRvY3MuCnwgOS8yNS8wMCA6IGJlYXpsZXkKfCAJICAgTW9kaWZpZWQgdGhlIHByZXByb2Nlc3NvciBzbyB0aGF0IG1hY3JvIG5hbWVzIGNhbiBzdGFydCB3aXRoIGEgJyUnLgp8IAkgICBUaGlzIG1heSBhbGxvdyBuZXcgU1dJRyAiZGlyZWN0aXZlcyIgdG8gYmUgZGVmaW5lZCBhcyBtYWNyb3MgaW5zdGVhZAp8IAkgICBvZiBoYXZpbmcgdG8gYmUgaGFyZC1jb2RlZCBpbnRvIHRoZSBwYXJzZXIuICAKfAp8ICoqKiBBbHNvIGEgeWV0LXRvLWJlLWRvY3VtZW50ZWQgcXVvdGluZyBtZWNoYW5pc20gd2l0aCBiYWNrcXVvdGVzCnwgKioqIGhhcyBiZWVuIGltcGxlbWVudGVkPwoKNi8xMy8yMDAxOiBta29lcHBlCgkgKiBXaGVuIGNvbmZpZ3VyZSBkb2VzIG5vdCBmaW5kIGEgbGFuZ3VhZ2UsIGRvbid0IHVzZSBkZWZhdWx0CgkgICBwYXRocyBsaWtlIC91c3IvbG9jYWwvaW5jbHVkZTsgdGhpcyBvbmx5IGNhdXNlcyBidWlsZAoJICAgcHJvYmxlbXMuCgkgKiBOZXcgZGlyZWN0b3J5OiBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlLCB3aGVyZSBhIGZldwoJICAgYnVncyBpbiAxLjNhNSBhcmUgZGVtb25zdHJhdGVkLiAKCSAqIEhhbmRsZSBDKysgbWV0aG9kcyB0aGF0IGhhdmUgYm90aCBhICJjb25zdCIgYW5kIGEgInRocm93IgoJICAgZGlyZWN0aXZlIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9jcGx1c3BsdXMtdGhyb3cuaSk7IAoJICAgdGhhbmtzIHRvIFNjb3R0IEIuIERydW1tb25kcyBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlIGZpeC4gCgkgKiBIYW5kbGUgQysrIHBvaW50ZXItcmVmZXJlbmNlIGFyZ3VtZW50cyAobGlrZSAiaW50IComIGFyZyIpIAoJICAgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL3BvaW50ZXItcmVmZXJlbmNlLmksCgkgICByZXBvcnRlZCBhcyBTRiBidWcgIzQzMjIyNCkuCgkgKiBbUnVieV0gRml4ZWQgdHlwbyBpbiBydWJ5ZGVjLnN3ZzsgdGhhbmtzIHRvIEx5bGUgSm9obnNvbiEKCSAqIERvbid0IHN0b3AgdGVzdGluZyB3aGVuIG9uZSB0ZXN0IGZhaWxzLgoJICogW0d1aWxlLCBNelNjaGVtZV0gRG9uJ3QgcHJpbnQgIkdlbmVyYXRpbmcgd3JhcHBlcnMuLi4iLgoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFZFQ1RPUkxFTklOUFVUIGFuZCBMSVNUTEVOSU5QVVQgbm93IGhhdmUgc2VwYXJhdGUKCSAgIGxpc3QgbGVuZ3RoIHZhcmlhYmxlcy4gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVAoJICAgYXR0YWNoZXMgYXJndW1lbnQgZG9jdW1lbnRhdGlvbiBpbnZvbHZpbmcgU0NNX1RZUEUgdG8gdGhlCgkgICBzdGFuZGFyZCBwb2ludGVyIHR5cGVtYXBzLiBJTk9VVCBpcyBub3cgYW4gYWxpYXMgZm9yIEJPVEguCgo2LzEyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgU29tZSBKYXZhIGRvY3VtZW50YXRpb24gYWRkZWQuCgkgICBbSmF2YV0gRml4ZWQgYnVncyBpbiBpbXBvcnQgcHJhZ21hIGFuZCBzaGFkb3cgcHJhZ21hLiAKCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgRml4IGRlY2xhcmF0aW9ucyBvZiBTV0lHX2RlZmluZV9jbGFzcwoJICAgKExpYi9ydWJ5L3J1YnlkZWMuc3dnKSBhbmQgU1dJR19UeXBlUXVlcnkKCSAgIChMaWIvY29tbW9uLnN3ZykuIFRoYW5rcyB0byBMeWxlIEpvaG5zb24KCSAgIDxsam9obnNvbkByZXNnZW4uY29tPiBmb3IgdGhlIHBhdGNoZXMuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVXNlIGxvbmcgaW5zdGVhZCBvZiBzY21fYml0c190OyB0aGlzIG1ha2VzIHRoZQoJICAgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBjb21wYXRpYmxlIHdpdGggR3VpbGUgMS4zLjQKCSAgIGFnYWluLiBUaGFua3MgdG8gTWFzYWtpIEZ1a3VzaGltYSBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCgo2LzExLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgVGhlIGdlbmVyaWMgSU5TVEFMTCBmaWxlIGZyb20gYXV0b2NvbmYgYWRkZWQuIEZldyBjaGFuZ2VzIHRvIFJFQURNRSBmaWxlLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBGaXhlZCB0eXBvIGluIE1ha2VmaWxlLmluOyB0aGFua3MgdG8gR3JlZyBUcm94ZWwKCSAgIDxnZHRAaXIuYmJuLmNvbT4uIAoKNi8wOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIG1ha2UgY2hlY2sgd29ya3MgYWdhaW4uIEV4YW1wbGVzL0dJRlBsb3QgY29uZmlndXJlIGdlbmVyYXRlZCBieQoJICAgdG9wIGxldmVsIGF1dG9jb25mIG5vdy4KCjYvMDgvMjAwMTogbWtvZXBwZQoJICAgQW5vdGhlciBidWlsZCBjaGFuZ2U6IFRoZSBuZXcgc2NyaXB0IGF1dG9nZW4uc2ggcnVucwoJICAgYXV0b2NvbmYgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzLiAgVGhlIHRvcC1sZXZlbAoJICAgY29uZmlndXJlIGFsc28gY29uZmlndXJlcyBpbiBFeGFtcGxlcy9HSUZQbG90LgoKNi8wNy8yMDAxOiBta29lcHBlCgkgICBNYWRlIHRoZSBNYWtlZmlsZSB3b3JrIHdpdGggbm9uLUdOVSBtYWtlIGFnYWluLgoKNi8wNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBDbGFzcy9zdHJ1Y3QgbWVtYmVycyB0aGF0IGFyZSBhcnJheXMgb2YgcG9pbnRlcnMgdG8gY2xhc3Nlcy9zdHJ1Y3RzIC0KCSAgIFNoYWRvdyBjbGFzcydzIGdldC9zZXQgYWNjZXNzb3JzIG5vdyB1c2UgSmF2YSBjbGFzc2VzIGluc3RlYWQgb2YgbG9uZ3MgKHBvaW50ZXJzKS4KCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyB3aWxsIG5vdyBjbGVhbiB1cCBtZW1vcnkgaWYgZnVuY3Rpb24gcmV0dXJuIHR5cGUgCgkgICBpcyBhIGNsYXNzL3N0cnVjdC4KCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzLgoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBOZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggYWxsb3dzIGZvcgoJICAgYXR0YWNoaW5nIGEgc3VmZml4IHRvIHRoZSBzd2lnIGJpbmFyeSBhbmQgdGhlIHN3aWcgcnVudGltZQoJICAgbGlicmFyaWVzLiAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgInN3aWcKCSAgIC1zd2lnbGliIiB3b3JrcyBhZ2Fpbi4gIElmIGludm9rZWQgd2l0aCB0aGUgbmV3IG9wdGlvbgoJICAgIi1sZGZsYWdzIiwgU1dJRyBwcmludHMgYSBsaW5lIG9mIGxpbmtlciBmbGFncyBuZWVkZWQgdG8KCSAgIGxpbmsgd2l0aCB0aGUgcnVudGltZSBsaWJyYXJ5IG9mIHRoZSBzZWxlY3RlZCBsYW5ndWFnZQoJICAgbW9kdWxlLiAKCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBnc3dpZ19saXN0X3AgaXMgYW4gaW50LCBub3QgYSBTQ00uICBUaGlzIHR5cG8KCSAgIGNhdXNlZCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiBJbiBJTlBVVCBhbmQgQk9USCB0eXBlbWFwcwoJICAgZ2VuZXJhdGVkIGJ5IHRoZSBTSU1QTEVfTUFQIG1hY3JvLCB1c2UgdGhlIFNDTV9UT19DCgkgICBmdW5jdGlvbiB0byBjb252ZXJ0IGZyb20gR3VpbGUgdG8gQyAocmF0aGVyIHRoYW4gQ19UT19TQ00pLgoJICAgVXNlIHNjbV9pbnRwcmludCB0byBwcmludCBwb2ludGVycyAocmF0aGVyIHRoYW4KCSAgIHNwcmludGYpLiBBbGxvdyB1c2luZyAiLWxpbmthZ2UiIGluc3RlYWQgb2YgIi1MaW5rYWdlIi4gCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIE1vZHMgZm9yIHVzaW5nIGluaGVyaXRlZCBjKysgY2xhc3NlcyBmcm9tIEphdmEKCSAgIFtKYXZhXSBOZXcgZXhhbXBsZSBjYWxsZWQgY2xhc3MgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gZGVzdHJ1Y3RvciAoX2RlbGV0ZSgpKSB3YXMgbm90IGF3YXJlIG9mICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIG5vdCBrbm93IGFib3V0ICVuYW1lIHJlbmFtaW5nCgkgICBbSmF2YV0gZXh0ZW5kcyBiYXNlY2xhc3MgZGlkIGV4dGVuZCBldmVuIHdoZW4gdGhlIGJhc2VjbGFzcyB3YXMgbm90IGtub3duIHRvIHN3aWcKCSAgIFtKYXZhXSBzb21ldGltZXMgZW51bS1kZWNsYXJhdGlvbnMgb2NjdXJyZWQgYmVmb3JlIHRoZSBKYXZhIGNsYXNzIGRlY2xhcmF0aW9uCgkgICBbSmF2YV0gdW5yZWxhdGVkIGVudW0gaW5pdGlhbGlzYXRpb25zIG5vIGxvbmdlciBhcHBlYXIgaW4gSmF2YSBjbGFzcwoJICAgW0phdmFdIGlmIG1vZHVsZSBlbmRzIGluICdfJyBjb3JyZWN0IEpOSSBuYW1lcyBhcmUgbm93IHByb2R1Y2VkCgo2LzA0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBtb2RzIC0gTW9kaWZpZWQgY29uc3RydWN0b3IgcmVwbGFjZXMKCSAgIG5ld0luc3RhbmNlKCkuIF9kZWxldGUoKSBub3cgdGhyZWFkIHNhZmUuIGdldENQdHIoKSByZXBsYWNlcwoJICAgX3NlbGYuIF9zZWxmQ2xhc3MoKSByZW1vdmVkIGFzIG5vdyByZWR1bmRhbnQuIAogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCSAgIFtKYXZhXSBOb3QgYWxsIG91dHB1dCBqYXZhIGZpbGVzIGhhZCBTV0lHIGJhbm5lci4gTmV3IGJhbm5lci4KCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIGZpbmFsaXplcnMgYXJlIG91dHB1dCBieSBkZWZhdWx0OiBDb21tYW5kCgkgICBsaW5lIG9wdGlvbiAtZmluYWxpemUgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCAtbm9maW5hbGl6ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBDYXN0IFNDTV9DQVIoKSB0byBzY21fYml0c190IGJlZm9yZSBzaGlmdGluZyBpdC4KCSAgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiAgCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIGNvbmZpZ3VyZSBvcHRpb24gIi0td2l0aC1zd2lnbGliZGlyIi4KCjUvMzEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBTdXBwb3J0IG11bHRpcGxlIHBhcmFsbGVsIGxpc3RzIG9yIHZlY3RvcnMgaW4KCSAgIHRoZSB0eXBlbWFwcyBwcm92aWRlZCBieSBsaXN0LXZlY3Rvci5pLiAgTmV3IHR5cGVtYXBzIGZpbGUsCgkgICBwb2ludGVyLWluLW91dC5pLiAKCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gSFRNTCB1cGRhdGUgZm9yIGV4YW1wbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICBBZGRlZCBzdWJkaXJlY3RvcnkgZm9yCgkgICBEZWJpYW4gcGFja2FnZSBjb250cm9sIGZpbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEJ1aWxkIGEgcnVudGltZSBsaWJyYXJ5LCBsaWJzd2lnZ3VpbGUuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9uICQqZGVzY3JpcHRvci4gIFVzZSB0aGUge30KCSAgIHN5bnRheCwgcmF0aGVyIHRoYW4gdGhlICIiIHN5bnRheCBmb3IgdGhlIHN0YW5kYXJkCgkgICB0eXBlbWFwcywgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgc3RyYW5nZSBtYWNyby1leHBhbnNpb24KCSAgIGJlaGF2aW9yIG9mIHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIFRoaXMgaW50cm9kdWNlcyBzb21lCgkgICBleHRyYSBicmFjZXMuCgo1LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHBvaW50ZXIgdHlwZXMgd2l0aCB0eXBlbWFwcywgcmF0aGVyIHRoYW4KCSAgIGhhcmQtY29kZWQuIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMgJGRlc2NyaXB0b3IsCgkgICAkYmFzZWRlc2NyaXB0b3I7IHNlZSBkb2N1bWVudGF0aW9uLiBTb21lIGNsZWFuLXVwIGluIHRoZQoJICAgdmFyaWFibGUvY29uc3RhbnRzIHdyYXBwZXIgZ2VuZXJhdG9yIGNvZGUuICBOZXcgY29udmVuaWVuY2UKCSAgIG1hY3JvIFNXSUdfR3VpbGVfTXVzdEdldFB0ciwgd2hpY2ggYWxsb3dzIGdldHRpbmcgcG9pbnRlcnMKCSAgIGZyb20gc21vYnMgaW4gYSBmdW5jdGlvbmFsIHN0eWxlLiAgTmV3IHR5cGVtYXAgZmlsZQoJICAgImxpc3QtdmVjdG9yLmkiLCBwcm92aWRpbmcgbWFjcm9zIHRoYXQgZGVmaW5lIHR5cGVtYXBzIGZvcgoJICAgY29udmVydGluZyBiZXR3ZWVuIEMgYXJyYXlzIGFuZCBTY2hlbWUgbGlzdHMgYW5kIHZlY3RvcnMuCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNUTCBzdHJpbmcgbW92ZWQgaW50byBpdHMgb3duIHR5cGVtYXAgYXMgaXQgaXMgYysrIGNvZGUgYW5kIAoJICAgaXQgYnJlYWsgYW55IGMgY29kZSB1c2luZyB0aGUgdHlwZW1hcHMuaSBmaWxlLgoJICAgLSBGaXhlcyBmb3Igd3JhcHBlcnMgYXJvdW5kIGdsb2JhbCB2YXJpYWJsZXMgLSBhcHBsaWVzIHRvIHByaW1pdGl2ZSAKCSAgIHR5cGVzIGFuZCB1c2VyIHR5cGVzIChjbGFzcy9zdHJ1Y3QpIGFuZCBwb2ludGVycyB0byB0aGVzZS4KCSAgIC0gU3RydWN0dXJlIG1lbWJlciB2YXJpYWJsZXMgYW5kIGNsYXNzIHB1YmxpYyBtZW1iZXIgdmFyaWFibGVzIGdldHRlcnMgCgkgICBhbmQgc2V0dGVycyBwYXNzIGEgcG9pbnRlciB0byB0aGUgbWVtYmVyIGFzIHdhcyBpbiAxLjNhMyBhbmQgMS4xIAoJICAgKDEuM2E1IHdhcyBwYXNzaW5nIGJ5IHZhbHVlKQoJICAgLSBQYXJhbWV0ZXJzIHRoYXQgd2VyZSBhcnJheXMgYW5kIHJldHVybiB0eXBlcyB3ZXJlIGluY29ycmVjdGx5IAoJICAgYmVpbmcgcGFzc2VkIHRvIGNyZWF0ZV9mdW5jdGlvbigpIGFzIHBvaW50ZXJzLgoJICAgLSBGaXggZm9yIGFycmF5cyBvZiBlbnVtcy4gCgkgICBbSmF2YV0gVXBkYXRlZCBqYXZhIGV4YW1wbGVzIGFuZCBhZGRlZCB0d28gbW9yZS4KCSAgIFtKYXZhXSBKYXZhIG1vZHVsZSB1cGRhdGVkIGZyb20gU1dJRzEuM2EzIGluY2x1ZGluZyBjb2RlIGNsZWFudXAgZXRjLgoJICAgW0phdmFdIGVudW0gc3VwcG9ydCBhZGRlZC4KCSAgIFtKYXZhXSBBcnJheSBzdXBwb3J0IGltcGxlbWVudGVkCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgaW1wcm92ZWQgLSBKYXZhIG9iamVjdHMgdXNlZCByYXRoZXIgdGhhbiAKCSAgIGxvbmdzIGhvbGRpbmcgdGhlIGMgcG9pbnRlciB0byB0aGUgd3JhcHBlZCBzdHJ1Y3R1cmUvYysrY2xhc3MKCjUvMjIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBpbiBDKysgbW9kZS4gVGhhbmtzCgkgICB0byBHcmVnIFRyb3hlbCA8Z2R0QGlyLmJibi5jb20+LgoKNS8yMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyBsaW5rYWdlICJtb2R1bGUiIGZvciBjcmVhdGluZyBHdWlsZSBtb2R1bGVzIGZvcgoJICAgR3VpbGUgdmVyc2lvbnMgPj0gMS41LjAuIAoKNC8xOC8yMDAxOiBta29lcHBlCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBwYXNzaW5nIHRocm91Z2ggU2NoZW1lX09iamVjdAoJICAgcG9pbnRlcnMuIAoKNC85LzIwMDEgOiBta29lcHBlIAoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgYGJvb2wnLiAgSW5jbHVzaW9uIG9mIGhlYWRlcnMKCSAgIGFuZCBzdXBwb3J0IHJvdXRpbmVzIGlzIG5vdyBkYXRhLWRyaXZlbiB2aWEgbXpzY2hlbWUuaS4KCSAgIEhlYWRlcnMgY29tZSBmcm9tIHRoZSBuZXcgZmlsZSBtenNjaGVtZGVjLnN3Zy4gIERvbid0IGFib3J0CgkgICBpbW1lZGlhdGVseSB3aGVuIGEgdHlwZS1oYW5kbGluZyBlcnJvciBpcyByZXBvcnRlZC4gIFdoZW4KCSAgIHNlYXJjaGluZyBmb3IgdHlwZW1hcHMgZm9yIGVudW1zLCBmYWxsIGJhY2sgdG8gdXNpbmcgaW50LAoJICAgbGlrZSB0aGUgR3VpbGUgYmFja2VuZCBkb2VzLiAgU3VwcG9ydCBjaGFyIGNvbnN0YW50cy4gIEVtaXQKCSAgIGNvcnJlY3Qgd3JhcHBlciBjb2RlIGZvciB2YXJpYWJsZXMuCgozLzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKipPVVRQVVQsIGNoYXIgKipCT1RILgoKMy8yLzIwMDEgOiBta29lcHBlIAoJICAgW0d1aWxlXSBFdmVyeSB3cmFwcGVyIGZ1bmN0aW9uIG5vdyBnZXRzIGEgYm9vbGVhbiB2YXJpYWJsZQoJICAgZ3N3aWdfbGlzdF9wIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlIHZhbHVlcyBhcmUKCSAgIHByZXNlbnQuIFRoZSBtYWNyb3MgR1VJTEVfQVBQRU5EX1JFU1VMVCwgR1VJTEVfTUFZQkVfVkFMVUVTCgkgICBhbmQgR1VJTEVfTUFZQkVfVkVDVE9SIHVzZSB0aGlzIHZhcmlhYmxlLCByYXRoZXIgdGhhbgoJICAgY2hlY2tpbmcgd2hldGhlciB0aGUgY3VycmVudCByZXR1cm4gdmFsdWUgaXMgYSBsaXN0LiBUaGlzCgkgICBhbGxvd3MgZm9yIHR5cGVtYXBzIHJldHVybmluZyBhIGxpc3QgYXMgYSBzaW5nbGUgdmFsdWUgKGEKCSAgIGxpc3Qgd2FzIGVycm9uZW91c2x5IGNvbnZlcnRlZCBpbnRvIGEgdmVjdG9yIG9yIGEKCSAgIG11bHRpcGxlLXZhbHVlIG9iamVjdCBpbiB0aGlzIGNhc2UpLgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIHJldHVybmluZyBtdWx0aXBsZSB2YWx1ZXMgYXMKCSAgIHZlY3RvcnMsIG9yIHBhc3NpbmcgdGhlbSB0byBhIG11bGlwbGUtdmFsdWUKCSAgIGNvbnRpbnVhdGlvbi4gQnkgZGVmYXVsdCwgbXVsdGlwbGUgdmFsdWVzIHN0aWxsIGdldAoJICAgcmV0dXJuZWQgYXMgYSBsaXN0LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIGEgImJlZm9yZXJldHVybiIgcHJhZ21hLiBUaGUgdmFsdWUgb2YgdGhpcwoJICAgcHJhZ21hIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IHJldHVybiBzdGF0ZW1lbnQuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgR3VpbGUgMS40LjEgcHJvY2VkdXJlCgkgICBkb2N1bWVudGF0aW9uIGZvcm1hdHMsIHNlZSBpbnRlcm5hbHMuaHRtbC4KCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBNYWRlIHRoZSB3cmFwcGVyIGNvZGUgY29tcGlsZSB3aXRoIEMrKyBpZiB0aGUKCSAgICItYysrIiBjb21tYW5kLWxpbmUgc3dpdGNoIGlzIGdpdmVuLiAgVGhhbmtzIHRvCgkgICA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5vdyB0d28gdHlwZSB0YWJsZXMsIHN3aWdfdHlwZXMgYW5kCgkgICBzd2lnX3R5cGVzX2luaXRpYWwsIGFyZSB1c2VkLCBhcyBhbGwgb3RoZXIgU1dJRyBsYW5ndWFnZQoJICAgbW9kdWxlcyBkby4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgdGhlIHRyaWNreQoJICAgY29uc3RydWN0aW9uIHVzZWQgYmVmb3JlIHRoYXQgdGhlIGJyb2tlbiBSZWRoYXQgNy4wIGdjYwoJICAgZG9lc24ndCBwYXJzZS4gUmVwb3J0ZWQgYnkgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqT1VUUFVULCBjaGFyICpCT1RIOyBhIGJhZAoJICAgZnJlZSgpIHdvdWxkIGJlIGVtaXR0ZWQuICBBZGRlZCB0eXBlbWFwIGZvciBTQ00uCgoKVmVyc2lvbiAxLjMgQWxwaGEgNSAKPT09PT09PT09PT09PT09PT09PQoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFtQeXRob25dIFB5dGhvbiBtb2R1bGUgZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUgZm9yCiAgICAgICAgICBjcmVhdGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgd3JhcHBlciBmdW5jdGlvbi4gTW9kaWZpY2F0aW9uCiAgICAgICAgICBzdWdnZXN0ZWQgYnkgSm9uIFRyYXZpcy4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBMaWJyYXJ5IGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZSAtbCBvcHRpb24gYXJlIG5vdyBpbmNsdWRlZCBhdCB0aGUKICAgICAgICAgIGVuZCBvZiB0aGUgaW50ZXJmYWNlIGZpbGUgKHJldmVydGluZyB0byB0aGUgb2xkIGJlaGF2aW9yKS4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggZW51bSBoYW5kbGluZy4gIGVudW1zIGFyZSBub3cgbWFuaXB1bGF0ZWQgYXMKICAgICAgICAgICdpbnQnLCBidXQgY2FzdCBpbnRvIHRoZSBlbnVtIHR5cGUgd2hlbiB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgCiAgICAgICAgICBjb3JyZXNwb25kaW5nIEMgZnVuY3Rpb24uCgo5LzE5LzAwIDogbWtvZXBwZQoJICBbR3VpbGVdIFJlbW92ZWQgIi13aXRoLXNtb2JzIiBjb21tYW5kLWxpbmUgb3B0aW9uLCBhcyB0aGlzIGlzIHRoZQoJICBkZWZhdWx0IG5vdy4gIEFkZGVkICItZW1pdC1zZXR0ZXJzIiBjb21tYW5kLWxpbmUgb3B0aW9uLAoJICB3aGljaCB0dXJucyBvbiBnZW5lcmF0aW5nIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzOyBzZWUKCSAgaW50ZXJuYWxzLmh0bWwuCgo5LzE4LzAwIDogbWtvZXBwZQoJICBJbmNvcnBvcmF0ZWQgcGF0Y2ggIzEwMTQzMCwgZml4aW5nIGJ1Z3MgaW4gdGhlIEd1aWxlIG1vZHVsZTogCgkgIDEuIFNvbWUgYXJndW1lbnRzIHdlcmUgZXJyb25lb3VzbHkgdGFrZW4gYXMgKm9wdGlvbmFsKiBhcmd1bWVudHMgd2hlbgoJICAgICBpZ25vcmVkIGFyZ3VtZW50cyB3ZXJlIHByZXNlbnQuIAoJICAyLiBHdWlsZSAxLjMuNCB3YXMgbm90IHN1cHBvcnRlZCBzaW5jZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiBHdWlsZQoJICAgICAgMS40IHdlcmUgdXNlZC4JICAKCSAgMy4gQWRkZWQgaGFuZGxpbmcgb2YgYGNvbnN0IGNoYXIgKicuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZhaWxlZCBhc3NlcnRpb24gYW5kIGxhcmdlIGZpbGVzLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0aGUgJyUnIGNoYXJhY3RlciBhcHBlYXJpbmcgaW4gYWRkZWQgbWV0aG9kcwogICAgICAgICAgYW5kIGZ1bmN0aW9uIGJvZGllcy4gIFByZXByb2Nlc3NvciBidWcuCgpWZXJzaW9uIDEuMyBBbHBoYSA0IChTZXB0ZW1iZXIgNCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzMvMDAgIDogdHRuCiAgICAgICAgICBBZGRlZCBpbnN0cnVjdGlvbnMgZm9yIG1haW50YWluZXJzIGluIEV4YW1wbGVzL1JFQURNRSBvbiBob3cKICAgICAgICAgIHRvIG1ha2UgZXhhbXBsZXMgYWxzbyBiZSB1c2VmdWwgaW4gdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICAgQWxzbywgIm1ha2UgY2hlY2siIG5vdyB1c2VzIC4vTGliIGJ5IHZpYSBlbnYgdmFyIGBTV0lHX0xJQicuCiAgICAgICAgICBUaGlzIGlzIG92ZXJyaWRhYmxlIGxpa2Ugc286CiAgICAgICAgICAgICBtYWtlIGNoay1zd2lnbGliPS9teS9leHBlcmltZW50YWwvc3dpZy9MaWIgY2hlY2sKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAkdHlwZW1hcCB2YXJpYWJsZSB0byB0eXBlbWFwcy4gIFRoaXMgZ2V0cyByZXBsYWNlZCB3aXRoCiAgICAgICAgICBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlbWFwIHRoYXQgaXMgYXBwbGllZC4gIEZlYXR1cmUKICAgICAgICAgIHJlcXVlc3QgZnJvbSByc2Fsei4KCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBFeHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdmlydHVhbAogICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIHR3byBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgQSgpIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNsYXNzIEIoKSA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgU3dpZyBub3cgd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGlzCgogICAgICAgICAgICAgICAgQV9mb28oQSAqYSkgewogICAgICAgICAgICAgICAgICAgIGEtPmZvbygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGFuZCB1c2UgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGJvdGggQV9mb28oKSBhbmQgQl9mb28oKS4KICAgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgaWYgYm90aCBtZXRob2RzIGFyZSBkZWNsYXJlZAogICAgICAgICAgYXMgdmlydHVhbCBhbmQgYm90aCB0YWtlIGlkZW50aWNhbCBwYXJhbWV0ZXJzLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlc3RvcmVkIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAgZm9yIHNldHRpbmcgc3RydWN0dXJlIG1lbWJlcnMuCiAgICAgICAgICBVbmxpa2UgdGhlIG9sZCB2ZXJzaW9uLCB0aGUgbmV3IHZlcnNpb24gaXMgZXhwYW5kZWQgaW5saW5lIGluIHRoZQogICAgICAgICAgd3JhcHBlciBmdW5jdGlvbiBhbGxvd2luZyBhY2Nlc3MgdG8gc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBpbnRlcm5hbHMgKGEgc29tZXRpbWVzIHJlcXVlc3RlZCBmZWF0dXJlKS4gVGhlICJtZW1iZXJvdXQiIHR5cGVtYXAKICAgICAgICAgIGlzIGdvbmUuIFVzZSB0aGUgIm91dCIgdHlwZW1hcHMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBzZXQgbWV0aG9kcyBubyBsb25nZXIgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIG1lbWJlci4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBub3cgZ2V0cyBzZXQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgdm9pZCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgIGYtPnggPSB4OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiBTV0lHMS4xIGl0IHVzZWQgdG8gYmUgdGhpczoKCiAgICAgICAgICAgICAgaW50IEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYtPnggPSB4KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGR1ZSB0byB0aGUgY29tcGxleGl0eSBjcmVhdGVkIGJ5IHRyeWluZwogICAgICAgICAgdG8gZG8gdGhpcyB3aXRoIG1vcmUgZXhvdGljIGRhdGF0eXBlcyBzdWNoIGFzIGFycmF5cy4gIEl0IGFsc28KICAgICAgICAgIGNvbXBsaWNhdGVzIGlubGluaW5nIGFuZCBoYW5kbGluZyBvZiB0aGUgIm1lbWJlcmluIiB0eXBlbWFwLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgcHRyY2FzdCgpIGFuZCBwdHJtYXAoKSBmdW5jdGlvbnMgZnJvbSB0aGUKICAgICAgICAgIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBPbGQgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG5ldyB0eXBlIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKm5hbWUpIGFkZGVkLgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHRoZSB0eXBlIGluZm8gc3RydWN0dXJlCiAgICAgICAgICB0aGF0IGlzIHVzZWQgZm9yIHR5cGUtY2hlY2tpbmcuICBJdCB3b3JrcyB3aXRoIGVpdGhlciB0aGUKICAgICAgICAgIG5pY2UgQyBuYW1lIG9yIG1hbmdsZWQgdmVyc2lvbiBvZiBhIGRhdGF0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJpbnQgKiIpOwogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJfcF9pbnQiKTsKCiAgICAgICAgICBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IHNvbWUKICAgICAgICAgIGV4b3RpYyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZQogICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlIG9iamVjdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IGRpcmVjdGl2ZSAldHlwZXMoKSBhZGRlZC4gIFRoaXMgaXMgdXNlZCB0bwogICAgICAgICAgZXhwbGljaXRseSBsaXN0IGRhdGF0eXBlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZS1jaGVja2luZyBjb2RlLiBOb3JtYWxseSBpdCBpcyBuZXZlcgogICAgICAgICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGJ1dCBzb21ldGltZXMgYWR2YW5jZWQgZXh0ZW5zaW9ucwogICAgICAgICAgKHN1Y2ggYXMgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5KSBtYXkgbmVlZCB0byBtYW51YWxseQogICAgICAgICAgYWRkIHR5cGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzAwIDogYmVhemxleQogICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygc3RyaW5nIGFycmF5IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCiAgICAgICAgICBhIGdsb2JhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSAiY2hhciBuYW1lWzY0XSIgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgbWFuYWdlZCBhcyBhIDY0IGNoYXJhY3RlciBzdHJpbmcuICBQcmV2aW91c2x5IHRoaXMgZGlkbid0CiAgICAgICAgICB3b3JrIGF0IGFsbCBvciByZXF1aXJlZCB0aGUgdXNlIG9mIGEgc3BlY2lhbCB0eXBlbWFwLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFIChUY2wsIFBlcmwsIFB5dGhvbikgKioqCgo4LzMxLzAwIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCBgY2hlY2stYysrLWV4YW1wbGVzJywgd2hpY2ggdXNlcyBuZXcKCSAgZmlsZXMgdW5kZXIgRXhhbXBsZXMvQysrIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuICBOb3cgIm1ha2UKCSAgY2hlY2siIGFsc28gZG9lcyAibWFrZSBjaGVjay1jKystZXhhbXBsZXMiLiAgQWxzbywgZXhwYW5kZWQKCSAgYWN0aW9ucyBpbiBgY2hlY2stZ2lmcGxvdC1leGFtcGxlJyBhbmQgYGNoZWNrLWFsaXZlbmVzcycuCgo4LzMwLzAwIDogbWtvZXBwZQoJICBNYWpvciBjbGVhbi11cCBpbiB0aGUgR3VpbGUgbW9kdWxlLiBBZGRlZCB0eXBlbWFwLWRyaXZlbgoJICBkb2N1bWVudGF0aW9uIHN5c3RlbS4gQ2hhbmdlZCB0byBoYW5kbGUgbW9yZSB0aGFuIDEwCgkgIGFyZ3MuIFVwZGF0ZWQgYW5kIGV4dGVuZGVkIGV4YW1wbGVzLgoJICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVpbnNlcnQgZGlyZWN0aXZlIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBpbnRvIGEgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IHdyYXBwZXIgZmlsZS4gIFRoaXMgaXMgb25seSBpbnRlbmRlZAogICAgICAgICAgZm9yIHVzZSBieSB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXb3JrcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXJzKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChydW50aW1lKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydCh3cmFwcGVycykgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChpbml0KSAgICAgImZpbGUuc3dnIjsKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVydW50aW1lIGRpcmVjdGl2ZSB3aGljaCBpbmNsdWRlcyBjb2RlIGludG8gdGhlIHJ1bnRpbWUKICAgICAgICAgIHBvcnRpb24gb2YgdGhlIHdyYXBwZXIgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVydW50aW1lICV7CiAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgaW50ZXJuYWwgcnVudGltZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgVGhlcmUgaXMgbm8gcHJhY3RpY2FsIHJlYXNvbiBmb3Igb3JkaW5hcnkgdXNlcnMgdG8gdXNlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgKGFsbW9zdCBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHVzaW5nICV7IC4uLiAlfQogICAgICAgICAgaW5zdGVhZCkuICAgSG93ZXZlciwgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzIG1heSB3YW50IHRvCiAgICAgICAgICB1c2UgdGhpcyBpbiBsYW5ndWFnZSBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZyBsaXRlcmFscyBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICIkdGFyZ2V0ID0gU3ZJVigkc291cmNlKTsiOwoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWxseSBjb21waWxlIGV4cGVyaW1lbnRhbCBjb2RlIHdpdGggLS1lbmFibGUtZXhwZXJpbWVudAoJICBjb25maWd1cmUgZmxhZy4KCSAgRml4IC5jdnNpZ25vcmUgdG8gaWdub3JlIGNvbmZpZ3VyZSAmIHlhY2MgZ2VuZXJhdGVkIGZpbGVzCgoxLzI4LzAwIDogbG9pYwoJICBBcHBseSBhdXRvbWFrZSBldmVyeXdoZXJlCgkgIEtlZXAgY29uZmlndXJlIHNjcmlwdHMgc28gdGhhdCBwZW9wbGUgYXJlIG5vdCAqZm9yY2VkKiB0byBhdXRvY29uZgogICAgICAgICAgS2VlcCBzb3VyY2VzIGdlbmVyYXRlZCBieSB5YWNjIHNvIHRoYXQgY29tcGlsYXRpb24gd2l0aG91dCB5YWNjCgkgIGlzIHBvc3NpYmxlLgoJICBTb3VyY2UvTFBhcnNlL2NzY2FubmVyLmM6IGNoYW5nZSBseWFjYy5oIGludG8gcGFyc2VyLmggdG8gcGxlYXNlCgkgIGRlZmF1bHQgeWFjYyBnZW5lcmF0aW9uIHJ1bGVzLgoJICBVc2UgQUNfQ09ORklHX1NVQkRJUlMgaW4gY29uZmlndXJlLmluIGluc3RlYWQgb2YgaGFuZCBtYWRlIHNjcmlwdC4KCSAgVXBkYXRlIGFsbCByZWxldmFudCAuY3ZzaWdub3JlIHRvIGluY2x1ZGUgLmRlcHMKCSAgRml4ZWQgbWlzc2luZyA7IGxpbmUgMTM2IFNvdXJjZS9Td2lnL3N3aWcuaAoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1pbm9yIGVuZC1vZi1maWxlIHBhcnNpbmcgcHJvYmxlbXMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWZyZWV6ZSBvcHRpb24gdGhhdCBmb3JjZXMgU1dJRyB0byBmcmVlemUgdXBvbiBleGl0LgogICAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgYXMgYSBkZWJ1Z2dpbmcgdG9vbCBzbyB0aGF0IEkgY2FuIG1vcmUKICAgICAgICAgIGVhc2lseSBleGFtaW5lIFNXSUcncyBtZW1vcnkgZm9vdHByaW50LgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIGd1aWxlIG1vZHVsZSBmb3Igc3VwcG9ydGluZyBvcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERpZXRlciBCYXJvbi4KCjEvMTMvMDAgOiBsb2ljCgkgIEFkZGVkIC5jdnNpZ25vcmUsIEV4YW1wbGVzLy5jdnNpZ25vcmUsIFNvdXJjZS9ET0gvRG9oLy5jdnNpZ25vcmUKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IEZpeGVkIC1JIGhhbmRsaW5nIGJ1ZwoJICBTb3VyY2UvTW9kdWxlczEuMS9qYXZhLmN4eDogZml4ZWQgY2hhciogLT4gY29uc3QgY2hhciogd2FybmluZ3MgdGhhdCBhcmUKCSAgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHdpdGggZ2NjLTIuOTUuMgoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogY2FzdCBjb25zdCBjaGFyKiB0byBjaGFyKiBmb3IgU3RyaW5nX3JlcGxhY2UKCSAgdG9rZW4gYW5kIHJlcCBzaG91bGQgcmVhbGx5IGJlIGNvbnN0LgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIEhhcmNvJ3MgSmF2YSBtb2R1bGVzLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJldm9rZWQgdGhlICVpZmRlZiwgJWlmbmRlZiwgJWVuZGlmLCAlaWYsICVlbGlmLCBhbmQgJWVsc2UKICAgICAgICAgIGRpcmVjdGl2ZXMuICBUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBhcyBTV0lHIG5vdyBoYXMgYSByZWFsCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGZyb20gdGhlIFNXSUcgZGlyZWN0b3J5CiAgICAgICAgICB0byB0aGUgTW9kdWxlcyBkaXJlY3RvcnkgKHdoZXJlIHRoZXkgcmVhbGx5IHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgIHRvIGJlZ2luIHdpdGgpLgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1zdGF0IG9wdGlvbiBmb3IgcHJpbnRpbmcgc3RhdGlzdGljcy4gVGhlCiAgICAgICAgICBzdGF0aXN0aWNzIHJlcG9ydGluZyB3YXMgaW5hZGVxdWF0ZSBhbmQgbW9zdGx5IGJyb2tlbgogICAgICAgICAgYW55d2F5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXQgb3B0aW9uIGZvciByZWFkaW5nIGEgdHlwZW1hcCBmaWxlLiAgTW9yZQogICAgICAgICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguICBKdXN0IGluY2x1ZGUgdHlwZW1hcHMgYXQgdGhlIHRvcAogICAgICAgICAgb2YgdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgJWNoZWNrb3V0IGRpcmVjdGl2ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC1jaSBvcHRpb24gZm9yIGZpbGUgY2hlY2tpbi4gICBUb28gcHJvYmxlbWF0aWMKICAgICAgICAgIHRvIGltcGxlbWVudC4gIFByb2JhYmx5IGJldHRlciB0byBqdXN0IHB1dCB5b3VyIFNXSUcgbGlicmFyeQogICAgICAgICAgdW5kZXIgQ1ZTIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiouCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgRGVsZXRlZCB0aGUgTEFURVggbW9kdWxlLiAgU29ycnkuLi4gRGlkbid0IGtub3cgYW55b25lCiAgICAgICAgICB3aG8gd2FzIHVzaW5nIGl0LiAgQmVzaWRlcywgSSdtIGxvb2tpbmcgdG8gc2ltcGxpZnkKICAgICAgICAgIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uIG1vZHVsZSB0byB1c2UgYSAudHh0CiAgICAgICAgICBzdWZmaXggZm9yIGl0cyBvdXRwdXQgZmlsZSBpbnN0ZWFkIG9mIC5kb2MuCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgdGhlIGxvbmctbG9zdCBTV0lHIHByZXByb2Nlc3NvciBiYWNrIHRvIHRoZSBzeXN0ZW0uCiAgICAgICAgICBJdCBzaG91bGQgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgUmF3IHByZXByb2Nlc3NlZCBvdXRwdXQKICAgICAgICAgIGNhbiBiZSB2aWV3ZWQgdXNpbmcgc3dpZyAtRSBmaWxlLmkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxLzExLzAwIDogYmVhemxleSBhbmQgZGptaXRjaGUKICAgICAgICAgIENvbXBsZXRlbHkgcmVvcmdhbml6ZWQgdGhlIFNXSUcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gIFRoZQogICAgICAgICAgYmFzaWMgb3JnYW5pemF0aW9uIGlzIG5vdzoKCiAgICAgICAgICAgICAgICBTb3VyY2UvICAgICAgICAgU1dJRyBzb3VyY2UgY29kZQogICAgICAgICAgICAgICAgTGliLyAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyAoc3dpZ19saWIpCiAgICAgICAgICAgICAgICBEb2MvICAgICAgICAgICAgRG9jdW1lbnRhdGlvbgogICAgICAgICAgICAgICAgRXhhbXBsZXMvICAgICAgIEV4YW1wbGVzCgogICAgICAgICAgTW9yZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KCjEyLzA4Lzk5OiBMb2ljIERhY2hhcnkgKGxvaWNAc2VuZ2Eub3JnKQoJICBFbmhhbmNlZCBwYWNrYWdlIGhhbmRsaW5nIGZvciBwZXJsNSBhbmQgYysrLgoKCSAgV2l0aCBuZXcgb3B0aW9uIC1oaWRlIEZvbzo6QmFyLCBldmVyeSBwZXJsNSBvYmplY3QgKEZyb2IpIGlzCgkgIHF1YWxpZmllZCBieSBGb286OkJhcjo6RnJvYi4gVGhlIHBhY2thZ2UgbmFtZSBpcyBzb2xlbHkgdXNlZAoJICB0byBlbmNhcHN1bGF0ZSBDL0MrKyB3cmFwcGVycyBvdXRwdXQgaW4gPG1vZHVsZT5fd3JhcC5jIGFuZCB0aGUKCSAgY29ycmVzcG9uZGluZyBwZXJsIHBhY2thZ2UgaW4gPG1vZHVsZT4ucG0uIE5vdGUgdGhhdCBhIHBhY2thZ2UKCSAgbmFtZSBtYXkgY29udGFpbiA6OiAoRnJvYjo6Tml0eikgYW5kIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlCgkgIHBhY2thZ2UgbmFtZSBwcm92aWRlZCBieSAtaGlkZSAoRm9vOjpCYXI6OkZyb2I6Ok5pdHopLgoKCSAgSW4gKl93cmFwLmMsIFNXSUdfaW5pdCBtYWNybyBpcyB1c2VkLiBXYXMgcHJldmlvdXNseSBkZWZpbmVkCgkgIGJ1dCBub3QgdXNlZCBhbmQgc2ltcGxpZmllcyBjb2RlLgoKCSAgQWRkZWQgdHlwZW1hcChwZXJsNSxwZXJsNWluKSBhbmQgdHlwZW1hcChwZXJsNSxwZXJsNW91dCkgdGhhdAoJICBkbyB0aGUgZXF1aXZhbGVudCBvZiB0eXBlbWFwKHBlcmw1LGluKSBhbmQgdHlwZW1hcChwZXJsNSxvdXQpCgkgIGJ1dCBjb250YWluIHBlcmwgY29kZSBhbmQgYXBwbGllcyB0byB3cmFwcGVycyBnZW5lcmF0ZWQgYnkKCSAgLXNoYWRvdy4KCgkgIExhY2tpbmcgcHJvcGVyIHJlZ3Jlc3Npb24gdGVzdHMgSSB1c2VkCgkgIEV4YW1wbGVzL3Blcmw1L3tjKyssY29uc3RyYWludCxkZWZhcmcsZXhjZXB0LAoJICBncmFwaC9ncmFwaFsxMjM0XSxtdWx0aW5oZXJpdCxuZXN0ZWQsc2hhZG93LHNpbXBsZSx0cmVlLAoJICB0eXBlbWFwcy97YXJndixhcmd2MixhcnJheW1lbWJlcixkYXRhYmFzZSxmaWxlLGlnbm9yZSxpbnRlZ2VyLAoJICBvdXRwdXQscGFzc3JlZixyZWZlcmVuY2UscmV0dXJufX0vLiBJIHJhbiBzd2lnIHdpdGggYW5kIHdpdGhvdXQKCSAgdGhlIHBhdGNoZXMsIGRpZmYgdGhlIGdlbmVyYXRlZHNvdXJjZXMsIHJ1biB0aGUgLnBsIGZpbGVzCgkgIGFuZCBjaGVja2VkIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGlkZW50aWNhbC4gSW4gYWxsIHRob3NlIGV4YW1wbGVzCgkgIEkgaGFkIG5vIGVycm9yLgoKMTEvMjEvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHByb3ZpZGUgZnVsbCB2YXJpYWJsZSBsaW5raW5nIGNhcGFiaWxpdGllcwogICAgICAgICAgdG8gYWxsIGRhdGF0eXBlcy4gICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgd2VyZSBjcmVhdGVkIGZvciBkYXRhdHlwZXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIFRjbF9MaW5rVmFyKCkgZnVuY3Rpb24uCiAgICAgICAgICBOb3csIHdlIHNpbXBseSB1c2UgdmFyaWFibGUgdHJhY2VzIHRvIHN1cHBvcnQgZXZlcnl0aGluZy4gVGhpcyBtYXkKICAgICAgICAgIGJyZWFrIHNjcmlwdHMgdGhhdCByZWx5IHVwb24gdGhlIG9sZGVyIGJlaGF2aW9yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS85OTogQWRkZWQgc2xpZ2h0IHR3ZWFrIHRvIHdyYXBwZXIgZ2VuZXJhdG9yIHRvIGNvbGxlY3QgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgICBvZiBzaW1pbGFyIHR5cGUuICBQcm9kdWNlcyBzb21ld2hhdCBtb3JlIGNvbXBhY3Qgd3JhcHBlciBjb2RlLgoKMTEvMjAvOTk6IE1vZGlmaWVkIHRoZSBUY2wgbW9kdWxlIHRvIHVzZSBTV0lHX0dldEFyZ3MoKSB0byBwYXJzZQogICAgICAgICAgYXJndW1lbnRzLiAgICBUaGlzIGlzIGEgdGVjaG5pcXVlIGJvcnJvd2VkIGZyb20gUHl0aG9uIGluIHdoaWNoCiAgICAgICAgICBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB1c2luZyBhIGZvcm1hdCBzdHJpbmcgY29udmVudGlvbiBzaW1pbGlhcgogICAgICAgICAgdG8gZnByaW50ZigpLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpzdWJzdGFudGlhbCogcmVkdWN0aW9uIGluIHRoZQogICAgICAgICAgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSB3aXRoIG9ubHkgYSBtb2Rlc3QgcnVudGltZSBvdmVyaGVhZAogICAgICAgICAgaW4gZ29pbmcgdGhyb3VnaCB0aGUgZXh0cmEgY29udmVyc2lvbiBmdW5jdGlvbi4KCjExLzEzLzk5OiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIGNsYXNzL3N0cnVjdHVyZSBnZW5lcmF0aW9uIGNvZGUgZm9yIHRoZQogICAgICAgICAgVGNsIG1vZHVsZS4gIE5vdywgYSBzbWFsbCBzZXQgb2YgcnVudGltZSBmdW5jdGlvbnMgYXJlIHVzZWQKICAgICAgICAgIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgYWxsIGNsYXNzZXMgKGluc3RlYWQgb2YgYQogICAgICAgICAgbWFzc2l2ZSBhbW91bnQgb2YgcnVudGltZSBjb2RlIGJlaW5nIGdlbmVyYXRlZCBmb3IgZWFjaCBjbGFzcykuCiAgICAgICAgICBDbGFzcyBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBzaW1wbHkgZW5jb2RlZCBpbiBhIHNlcmllcyBvZgogICAgICAgICAgc3RhdGljIHRhYmxlcy4gICBUaGlzIHJlc3VsdHMgaW4gYSAqSFVHRSogcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS0tZXNwZWNpYWxseSBmb3IgQysrLgoKMTEvMTMvOTk6IFJlbW92ZWQgdGhlIC10Y2wgKFRjbCA3LngpIG1vZHVsZS4gIFRjbCA4LjAgaXMgbm93IHNldmVyYWwKICAgICAgICAgIHllYXJzIG9sZCBhbmQgdGhlIGRlZmFjdG8gc3RhbmRhcmQtLW5vIHJlYWwgcmVhc29uIHRvIGtlZXAKICAgICAgICAgIHN1cHBvcnRpbmcgdGhlIG9sZCB2ZXJzaW9uIGF0IHRoaXMgcG9pbnQuCgoxMS8xMy85OTogQ2xlYW5lZCB1cCAtYyBvcHRpb24gZm9yIFB5dGhvbiBtb2R1bGUuICBUaGUgcHlleHAuc3dnIGZpbGUKICAgICAgICAgIGlzIG5vdyBnb25lLgoKMTEvMTMvOTk6IEZpeGVkIGV4dGVybmFsIGRlY2xhcmF0aW9ucyB0byB3b3JrIGJldHRlciB3aXRoIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvbiBXaW5kb3dzLiAgU3RhdGljIGxpbmtpbmcgc2hvdWxkIG5vdyBiZSBwb3NzaWJsZSBieSBkZWZpbmluZwogICAgICAgICAgdGhlIC1EU1RBVElDX0xJTksgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgQWxiZXJ0byBGb25zZWNhLgoKMTEvNS85OSA6IEZpeGVkIGFuIG9ic2N1cmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyByZWxhdGVkIHRvIHRoZSBnZW5lcmF0aW9uCiAgICAgICAgICBvZiBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gICBCdWcgcmVwb3J0ZWQgYnkgQnJhZCBDbGVtZW50cy4KCjExLzUvOTkgOiBGaXhlZCBhIGZldyBtZW1vcnkgcHJvYmxlbXMgZm91bmQgYnkgcHVyaWZ5LgoKMTEvNS85OSA6IE9mZmljaWFsbHkgZGVwcmVjYXRlZCB0aGUgLWh0Y2wsIC1odGssIGFuZCAtcGx1Z2luIG9wdGlvbnMKICAgICAgICAgIGZyb20gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMTAvMjYvOTk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGZyb20gcHl0aG9uL3R5cGVtYXBzLmkuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgS2VpdGggRGF2aWRzb24uCgo4LzE2Lzk5IDogQWRkZWQgX1dJTjMyIHN5bWJvbCB0byBsaWJyYXJpZXMgdG8gYmV0dGVyIHN1cHBvcnQgV2luZG93cy4KCjgvMTYvOTkgOiBEZXByZWNhdGVkIHRoZSBQZXJsNCBtb2R1bGUuICAgSXQgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkIGluIHRoZQogICAgICAgICAgZGlzdHJpYnV0aW9uIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLiAgSW4gdGhlIGVudGlyZSAzIHllYXJzIFNXSUcKICAgICAgICAgIGhhcyBiZWVuIGFyb3VuZCBJIG5ldmVyIHJlY2VpdmVkIGEgc2luZ2xlIGNvbW1lbnQgYWJvdXQgaXQgc28gSSdtCiAgICAgICAgICBhc3N1bWluZyBubyBvbmUgd2lsbCBtaXNzIGl0Li4uCgo4LzE2Lzk5IDogTW9kaWZpZWQgdGhlIHR5cGUtY2hlY2tpbmcgY29kZSB0byByZWdpc3RlciB0eXBlIG1hcHBpbmdzIHVzaW5nIGEKICAgICAgICAgIHRhYmxlIGluc3RlYWQgb2YgcmVwZWF0ZWQgY2FsbHMgdG8gU1dJR19SZWdpc3Rlck1hcHBpbmcoKS4gIFRoaXMKICAgICAgICAgIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBzb21ld2hhdC4KCjgvMTUvOTkgOiBDbGVhbmVkIHVwIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tpbmcgY29kZSBpbiB0aGUgVGNsIG1vZHVsZS4KCjgvMTUvOTkgOiBNYW55IGNoYW5nZXMgdG8gdGhlIGxpYnJhcmllcyB0byBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzLgoKOC8xMy85OSA6IEVsaW1pbmF0ZWQgQysrIGNvbXBpbGVyIHdhcm5pbmcgbWVzc2FnZXMgYWJvdXQgZXh0ZXJuICJDIiBsaW5rYWdlLgoKOC8xMy85OSA6IFNvbWUgY2xlYW51cCBvZiBQeXRob24gLnN3ZyBmaWxlcyB0byBiZXR0ZXIgc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgb24gV2luZG93cy4KCjgvMTMvOTkgOiBNb2RpZmllZCB0aGUgJXByYWdtYSBkaXJlY3RpdmUgdG8gYXR0YWNoIHByYWdtYXMgZGVjbGFyZWQgaW5zaWRlCiAgICAgICAgICBhIGNsYXNzIGRlZmluaXRpb24gdG8gdGhlIGNsYXNzIGl0c2VsZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICVwcmFnbWEocHl0aG9uKSBhZGR0b21ldGhvZCA9ICJpbnNlcnQ6cHJpbnQgYGhlbGxvIHdvcmxkJyIKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaG93IHRoaXMgd29ya3MuICBGb3IgcGVvcGxlCiAgICAgICAgICB3cml0aW5nIGJhY2tlbmQgbW9kdWxlcywgY2xhc3MtYmFzZWQgcHJhZ21hcyB3b3JrIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX29wZW5fY2xhc3MoKSAgICAgICAgICAgICAvLyBPcGVuIGEgY2xhc3MKICAgICAgICAgICAgICBsYW5nLT5jcHBfcHJhZ21hKCkgICAgICAgICAgICAgICAgIC8vIFN1cHBseSBwcmFnbWFzCiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IG1lbWJlcnMKCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX2Nsb3NlX2NsYXNzKCkgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY2xhc3MKCiAgICAgICAgICBBbGwgb2YgdGhlIHByYWdtYXMgYXJlIHBhc3NlZCBmaXJzdCBzaW5jZSB0aGV5IG1pZ2h0IGJlIHVzZWQgdG8KICAgICAgICAgIGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIG90aGVyIG1lbWJlcnMuICAgUGxlYXNlIHNlZQogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUgZm9yIGFuIGV4YW1wbGUuICAgUGF0Y2hlcyBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTMvOTkgOiBQYXRjaCB0byBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gZWxpbWluYXRlIGlnbm9yZWQKICAgICAgICAgIGV4Y2VwdGlvbiBlcnJvcnMgaW4gZGVzdHJ1Y3RvcnMuICBQYXRjaCBjb250cmlidXRlZAogICAgICAgICAgYnkgUm9iaW4gRHVubi4KCjgvMTEvOTkgOiBNaW5vciBwYXRjaCB0byBzd2lnX2xpYi9weXRob24vc3dpZ3B0ci5zd2cgIChhZGRlZCBTV0lHU1RBVElDCiAgICAgICAgICBkZWNsYXJhdGlvbikuICBQYXRjaCBjb250cmlidXRlZCBieSBMeWxlIEpvaG5zb24uCgo4LzExLzk5IDogQWRkZWQgRklSU1RLRVkvTkVYVEtFWSBtZXRob2RzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgo4LzExLzk5IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIHJldHVybmVkCiAgICAgICAgICBhbmQgcGFzc2VkIGFzICdOb25lLicgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuCgo4LzEwLzk5IDogRml4ZWQgbWlzc2luZyAnaW50JyBzcGVjaWZpZXJzIGluIHZhcmlvdXMgcGxhY2VzLgoKOC8xMC85OSA6IEFkZGVkIFdpbmRvd3MgbWFrZWZpbGUgZm9yIFJ1bnRpbWUgbGlicmFyaWVzLiAgQ29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEJvYiBUZWNoZW50aW4uCgo4LzEwLzk5IDogRml4ZWQgbWlub3IgcHJvYmxlbSBpbiBQeXRob24gcnVudGltZSBtYWtlZmlsZSBpbnRyb2R1Y2VkCiAgICAgICAgICBieSBrZXl3b3JkIGFyZ3VtZW50cy4KCjgvOC85OSAgOiBDaGFuZ2VkICR0YXJnZXQgb2YgcGVybDUob3V0KSB0eXBlbWFwIGZyb20gU1QoMCkgdG8KICAgICAgICAgIFNUKGFyZ3ZpKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogRml4ZWQgYnVnIGluIHR5cGVtYXAgY2hlY2tpbmcgcmVsYXRlZCB0byB0aGUgQU5ZIGtleXdvcmQKICAgICAgICAgIGluIGFycmF5cyBhbmQgaWdub3JlZCBhcmd1bWVudHMuICBFcnJvciByZXBvcnRlZCBieQogICAgICAgICAgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiAlZW5hYmxlZG9jIGFuZCAlZGlzYWJsZWRvYyBkaXJlY3RpdmVzIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgaW5zaWRlIGNsYXNzL3N0cnVjdHVyZSBkZWZpbml0aW9ucy4gICBIb3dldmVyLCBubyBjaGVjawogICAgICAgICAgaXMgbWFkZSB0byBzZWUgaWYgdGhleSBhcmUgYmFsYW5jZWQgKGkuZS4sIGEgJWRpc2FibGVkb2MKICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBkb2VzIG5vdCBoYXZlIHRvIGhhdmUgYSBtYXRjaGluZwogICAgICAgICAgJWVuYWJsZWRvYyBpbiB0aGUgc2FtZSBjbGFzcykuCgo4LzgvOTkgIDogS2V5d29yZCBhcmd1bWVudCBoYW5kbGluZyBpcyBub3cgc3VwcG9ydGVkIGluIHRoZSBQeXRob24KICAgICAgICAgIG1vZHVsZS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oY2hhciAqYmFyLCBpbnQgc3BhbSwgZG91YmxlIHgpOwoKICAgICAgICAgIENhbiBiZSBjYWxsZWQgZnJvbSBQeXRob24gYXMKCiAgICAgICAgICAgICAgIGZvbyh4ID0gMy40LCBiYXI9ImhlbGxvIiwgc3BhbT00MikKCiAgICAgICAgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBydW4gU1dJRyB3aXRoIHRoZSAnLWtleXdvcmQnIGNvbW1hbmQKICAgICAgICAgIGxpbmUgb3B0aW9uLiAgICBNaXhpbmcga2V5d29yZCBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgIHNob3VsZCB3b3JrIGFzIHdlbGwuICAgVW5uYW1lZCBhcmd1bWVudHMgYXJlIGFzc2lnbmVkIG5hbWVzCiAgICAgICAgICBzdWNoIGFzICJhcmcxIiwgImFyZzIiLCBldGMuLi4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIEZ1bmN0aW9ucyB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lcyBzdWNoIGFzCiAgICAgICAgICBiYXIoaW50ICpPVVRQVVQsIGludCAqT1VUUFVUKSB3aWxsIGxpa2VseSBjYXVzZSBwcm9ibGVtYXRpYwogICAgICAgICAgd3JhcHBlciBjb2RlIHRvIGJlIGdlbmVyYXRlZC4gICBUbyBmaXggdGhpcywgIHVzZSBkaWZmZXJlbnQKICAgICAgICAgIG5hbWVzIG9yIHVzZSAlYXBwbHkgdG8gbWFwIHR5cGVtYXBzIHRvIGFsdGVybmF0ZSBuYW1lcy4KCjgvOC85OSAgOiBIYW5kbGluZyBvZiB0aGUgJ3RoaXMnIHBvaW50ZXIgaGFzIGJlZW4gY2hhbmdlZCBpbiBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgUHJldmlvdXNseSwgZGVyZWZlcmVuY2luZyBvZiAnLnRoaXMnIG9jY3VycmVkIGluIHRoZQogICAgICAgICAgUHl0aG9uIHNoYWRvdyBjbGFzcyBpdHNlbGYuICAgTm93LCB0aGlzIHN0ZXAgb2NjdXJzIGluIHRoZSBDCiAgICAgICAgICB3cmFwcGVycyB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICAgIFNXSUdfR2V0UHRyT2JqKFB5T2JqZWN0ICosIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpCgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciBhIHN0cmluZyBjb250YWluaW5nIGEgcG9pbnRlcgogICAgICAgICAgb3IgYSBzaGFkb3cgY2xhc3MgaW5zdGFuY2Ugd2l0aCBhICcudGhpcycgYXR0cmlidXRlIG9mCiAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlLiAgVGhpcyBjaGFuZ2UgYWxsb3dzIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgMS4gIFRoZSByZWFsIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSBmb3IgYW4gb2JqZWN0IGlzCiAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBDIHdyYXBwZXJzIHdoZXJlIGl0IGNhbiBiZSBleGFtaW5lZC9tb2RpZmllZAogICAgICAgICAgICAgIGJ5IHR5cGVtYXBzLgoKICAgICAgICAgIDIuICBIYW5kbGluZyBvZiBkZWZhdWx0L2tleXdvcmQgYXJndW1lbnRzIGlzIG5vdyBncmVhdGx5CiAgICAgICAgICAgICAgc2ltcGxpZmllZC4KCiAgICAgICAgICAzLiAgVGhlIFB5dGhvbiB3cmFwcGVyIGNvZGUgaXMgbXVjaCBtb3JlIHNpbXBsZS4KCiAgICAgICAgICBQbHVzLCBpdCBlbGltaW5hdGVkIG1vcmUgdGhhbiAzMDAgbGluZXMgb2YgQysrIGNvZGUgaW4gdGhlCiAgICAgICAgICBQeXRob24gbW9kdWxlLgoKICAgICAgICAgICoqKiBDQVZFQVQgOiBUaGlzIHJlcXVpcmVzIHRoZSBhYnN0cmFjdCBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgSXQgc2hvdWxkIHdvcmsgd2l0aCBQeXRob24gMS40LCBidXQgcHJvYmFibHkgbm90aGluZyBvbGRlcgogICAgICAgICAgdGhhbiB0aGF0LgoKCjgvOC85OSAgOiBGaXhlZCBoYW5kbGluZyBvZiAiY29uc3QiIGFuZCBwb2ludGVycyBpbiBjbGFzc2VzLiAgSW4gcGFydGljdWxhciwKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzCgogICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGNvbnN0IGludCAgKmlwdHI7CiAgICAgICAgICB9CgogICAgICAgICAgYXJlIGhhbmRsZWQgYXMgYXNzaWduYWJsZSB2YXJpYWJsZXMgYXMgb3Bwb3NlZCB0byBjb25zdGFudAogICAgICAgICAgdmFsdWVzICh0aGlzIGlzIHRoZSBjb3JyZWN0IGJlaGF2aW9yIGluIEMvQysrKS4gICBOb3RlOgogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMgImNoYXIgKmNvbnN0IG1zZyIgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgogICAgICAgICAgQ29uc3RhbnRzIGRlY2xhcmVkIGF0IHRoZSBnbG9iYWwgbGV2ZWwgdXNpbmcgY29uc3QgYXJlIGFsc28KICAgICAgICAgIGJyb2tlbiAoYmVjYXVzZSBJIGhhdmUgYSBudW1iZXIgb2YgaW50ZXJmYWNlcyB0aGF0IHJlbHkgdXBvbgogICAgICAgICAgdGhpcyBiZWhhdmlvcikuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQKICAgICAgICAgIG1pc3Rha2VubHkgdHJlYXQgJ2NvbnN0IGNoYXIgKicgdHlwZXMgYXMgY29uc3RhbnQgdmFsdWVzLgoKOC84Lzk5ICA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBiaXQtZmllbGRzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2tleXdvcmQgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19leHRlcm4gIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfc3RhdGljICA6IDE7CiAgICAgICAgICB9IGZsYWdzOwoKICAgICAgICAgIEJpdC1maWVsZHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnRlZ2VyIHR5cGVzIGFuZCB0aGVpcgogICAgICAgICAgYXJlIG90aGVyIHJlc3RyaWN0aW9ucy4gIFNXSUcgcGVyZm9ybXMgbm8gc3VjaCB0eXBlLWNoZWNraW5nCiAgICAgICAgICAoYWx0aG91Z2ggdGhlIEMgY29tcGlsZXIgd2lsbCBjYXRjaCBwcm9ibGVtcyB3aGVuIGl0IHRyaWVzIHRvCiAgICAgICAgICBjb21waWxlIHRoZSB3cmFwcGVyIGNvZGUpLgoKOC84Lzk5ICA6IFJlbW92ZWQgdHJhaWxpbmcgc3BhY2Ugb2YgJGJhc2V0eXBlIHN1YnN0aXR1dGlvbiBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAldHlwZW1hcChweXRob24sIGFyZ291dCkgc3BhbSoqIE9VVFBVVHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBjaGFyKiBhID0gIiRiYXNldHlwZV9wIjsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgIH0KCiAgICAgICAgICAoUGF0Y2ggc3VnZ2VzdGVkIGJ5IE5hdGhhbiBEdW5maWVsZCkuCgo2LzIyLzk5IDogTWFkZSBhIHZlcnkgc2xpZ2h0IHR3ZWFrIHRvIHRoZSBQZXJsNSBzaGFkb3cgY2xhc3MKICAgICAgICAgIGNvZGUgdGhhdCBhbGxvd3MgdHlwZW1hcHMgdG8gYWx0ZXIgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICBvZiBvYmplY3RzICh0byBzdXBwb3J0IHBvbHltb3JwaGljIHR5cGVzKS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBEcmFrZSBEaWVkcmljaC4KCjQvOC85OSAgOiBGaXhlZCBudWxsIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmwgbW9kdWxlLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMy8xNy85OSA6IEZpeGVkIGJ1ZyBpbiBwZXJsNXB0ci5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBHcmVnIEFuZGVyc29uLgoKMi8yNy85OSA6IEVsaW1pbmF0ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gU3dpZyBydW5zIG9uCiAgICAgICAgICBlbXB0eSBmaWxlcy4KCjIvMjcvOTkgOiBBZGRlZCBwYXRjaCB0byBHdWlsZSBtb2R1bGUgdG8gZWxpbWluYXRlIHVudXNlZAogICAgICAgICAgdmFyaWFibGVzLiAgIENvbnRyaWJ1dGVkIGJ5IE1pa2UgU2ltb25zLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyByZXR1cm5pbmcgcmVmZXJlbmNlcy4KCjIvMjcvOTkgOiBGaXhlZCBSdW50aW1lL01ha2VmaWxlLiBQYXRjaCBjb250cmlidXRlZCBieQogICAgICAgICAgTWlrZSBSb21iZXJnLgoKMi8yNy85OSA6IEluY29ycG9yYXRlZCBwYXRjaGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoIC1leHBvcnRhbGwgc3dpdGNoIGFuZCBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgaW4gUGVybDUgbW9kdWxlLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKMi8yNy85OSA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSB0byByZWNvZ25pemUgJ3VuZGVmJyBhcyBhIE5VTEwgY2hhciAqLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgSnVuaW8gSGFtYW5vLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBQZXJsNSBtb2R1bGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YKICAgICAgICAgIEFjdGl2ZVN0YXRlIFBlcmwgZm9yIFdpbjMyLgoKMi8yNy85OSA6IEZpeGVkIHRoZSBpbmNsdWRlIG9yZGVyIG9mIGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgLUkgb3B0aW9uLgoKMi81Lzk4LSA6IERhdmUgZmluaXNoZXMgaGlzIGRpc3NlcnRhdGlvbiwgZ29lcyBqb2IgaHVudGluZywgbW92ZXMgdG8KMi81Lzk5ICAgIENoaWNhZ28gYW5kIGdlbmVyYWxseSB0aHJhc2hlcyBhYm91dC4KClZlcnNpb24gMS4xIFBhdGNoIDUgKEZlYnJ1YXJ5IDUsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2FsbHkgbGluayB2ZXJzaW9ucyBvZiBQeXRob24gMS41LiAgICBUbyBtYWtlIGl0IHRoZSBkZWZhdWx0LAogICAgICAgICAgc2ltcGx5IGNvcHkgJ3N3aWdfbGliL3B5dGhvbi9lbWJlZDE1LmknIHRvICdzd2lnX2xpYi9weXRob24vZW1iZWQuaScKClZlcnNpb24gMS4xIFBhdGNoIDMgKE5vdmVtYmVyIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aXRoIHNoYWRvdyBjbGFzc2VzIGFuZAogICAgICAgICAgc3RhdGljIGNsYXNzIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjbGFzcyBpbnN0YW5jZXMuCiAgICAgICAgICBOb3RlIDogVGhlIGZpeCBmb3IgdGhpcyBidWcgcmVxdWlyZXMgYSBzbGlnaHQgcmVzdHJ1Y3R1cmluZyBvZgogICAgICAgICAgb2YgdGhlIC5wbSBmaWxlcyBjcmVhdGVkIGJ5IFNXSUcuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgaW4gdGhlIFRjbC9UY2w4IG1vZHVsZXMgcmVsYXRlZCB0byB2YXJpYWJsZSBsaW5raW5nCiAgICAgICAgICBvZiBjaGFyYWN0ZXIgYXJyYXlzLiAgSWYgeW91IGRlY2xhcmVkIGEgZ2xvYmFsIHZhcmlhYmxlICdjaGFyIGZvb1sxMF0nLAogICAgICAgICAgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgd291bGQgZWl0aGVyIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgICAgICAgICBpbW1lZGlhdGVseSB1cG9uIGxvYWRpbmcgb3Igd2VpcmQgbWVtb3J5IGNvcnJ1cHRpb24gZWxzZXdoZXJlLgogICAgICAgICAgVGhpcyBzaG91bGQgbm93IGJlIGZpeGVkIGFsdGhvdWdoIGNoYXJhY3RlciBhcnJheXMgY2FuIG9ubHkgYmUKICAgICAgICAgIHJlYWQtb25seS4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSB0aGF0IGNhdXNlZCBpdCB0bwogICAgICAgICAgZmFpbCBpZiBmaWxlcyB3ZXJlIGltcG9ydGVkIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbgogICAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCgoxMS8yMy85NzogRml4ZWQgaW5jb3JyZWN0IGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbgogICAgICAgICAgbW9kdWxlLgoKMTEvMjMvOTc6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIHRoZSAtbyBvcHRpb24gd2hlbiB1c2VkIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiBJZiAtbyB3YXMgdXNlZCB0byBzcGVjaWZ5IGJvdGggdGhlIHBhdGhuYW1lIGFuZCBmaWxlbmFtZQogICAgICAgICAgb2YgU1dJRydzIG91dHB1dCBzdWNoIGFzCgogICAgICAgICAgICAgICAgIHN3aWcgLW8gL2hvbWUvc3dpZy93cmFwcGVyLmMgLXNoYWRvdyAtcGVybDUgZm9vLmkKCiAgICAgICAgICBUaGUgd3JhcHBlciBjb2RlIHdvdWxkIGJlIHBsYWNlZCB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtbywKICAgICAgICAgIGJ1dCB0aGUgLnBtIGZpbGUgYW5kIGRvY3VtZW50YXRpb24gd291bGQgYmUgcGxhY2VkIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIFNXSUcgd2FzIHJ1bi4gICBOb3csIHRoZXNlIGZpbGVzIGFyZSBwbGFjZWQKICAgICAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCB0aGUgLW8gb3B0aW9uLgogICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYWxzbyBuZWVkZWQgZm9yIHByb3BlciBvcGVyYXRpb24gb24gdGhlCiAgICAgICAgICBNYWNpbnRvc2guCgoxMS8yMy85NzogQWRkZWQgYSAndGhpcygpJyBtZXRob2QgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuICAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZSBmcm9tIGEgc2hhZG93CiAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGFzIGEgdGllZCBoYXNoLiAgIFRvIHVzZSBqdXN0CiAgICAgICAgICBpbnZva2UgYXMgYSBtZXRob2QgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgJGwgPSBuZXcgTGlzdDsgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgJHB0ciA9ICRsLT50aGlzKCk7ICAgIyBHZXQgdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlCgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2wgOCBwb2ludGVyLmkgbGlicmFyeSBmaWxlICh3aGljaCB3YXMgY29tcGxldGVseQogICAgICAgICAgYnJva2VuIGluIDEuMXAyKS4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgUGVybDUgdHlwZS1jaGVja2VyIHRvIGZpeCBhIGZldyBwcm9ibGVtcwogICAgICAgICAgd2l0aCBnbG9iYWwgdmFyaWFibGVzIG9mIHBvaW50ZXIgdHlwZXMgYW5kIHRvIGFsbG93CiAgICAgICAgICB0aWVkIGhhc2hlcyB0byBiZSB1c2VkIGludGVyY2hhbmdhYmx5IHdpdGggbm9ybWFsCiAgICAgICAgICBwb2ludGVyIHZhbHVlcy4KCjExLzIzLzk3OiBNb2RpZmllZCB0aGUgdHlwZW1hcCBtZWNoYW5pc20gdG8gYWxsb3cgb3V0cHV0CiAgICAgICAgICB0eXBlbWFwcyBvZiB0eXBlICd2b2lkJy4gICBUaGVzZSB3ZXJlIGlnbm9yZWQgcHJldmlvdXNseSwKICAgICAgICAgIGJ1dCBub3cgaWYgeW91IHNwZWNpZnksCgogICAgICAgICAgICAgICAgJXR5cGVtYXAobGFuZyxvdXQpIHZvaWQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZvaWQgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgWW91IGNhbiBjaGFuZ2Ugb3IgYXNzaWduIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBmdW5jdGlvbi4KCjExLzIzLzk3OiBGaXhlZCBwcm9jZXNzaW5nIG9mICdib29sJyBkYXRhdHlwZXMgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgoxMS8yMy85NzogRml4ZWQgbWlub3IgcGFyc2luZyBlcnJvciB3aXRoIEMrKyBpbml0aWFsaXplcnMuIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbDggbW9kdWxlIHNvIHRoYXQgQyBmdW5jdGlvbnMgdGhhdCBjYWxsIGJhY2sgaW50bwogICAgICAgICAgVGNsIGRvbid0IGNvcnJ1cHQgdGhlIHJldHVybiByZXN1bHQgb2JqZWN0IChTV0lHIHdhcyBnYXRoZXJpbmcKICAgICAgICAgIHRoZSByZXN1bHQgb2JqZWN0IHRvbyBlYXJseSB3aGljaCBsZWFkcyB0byBwcm9ibGVtcyBpZiBzdWJzZXF1ZW50CiAgICAgICAgICBUY2wgY2FsbHMgYXJlIG1hZGUpLgoKMTEvMjMvOTc6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiB0aGUgUHl0aG9uIG1vZHVsZSB3aGVuIHR3byBvcgogICAgICAgICAgbW9yZSBvdXRwdXQgcGFyYW1ldGVycyB3ZXJlIHVzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyBvZiBhCiAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgdHlwZW1hcHMuaQogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqT1VUUFVULCBkb3VibGUgKk9VVFBVVCwgZG91YmxlIGEpOwoKICAgICAgICAgIFByZXZpb3VzbHksIGRvaW5nIHRoaXMgcmVzdWx0ZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFuCiAgICAgICAgICBleHRyYW5lb3VzIGNvbW1hIGluIHRoZSBvdXRwdXQsIHJlc3VsdGluZyBpbiBhIEMgc3ludGF4IGVycm9yLgoKMTEvMjIvOTc6IEZpeGVkIGEgYnVnIHdoZW4gdGVtcGxhdGUgaGFuZGxpbmcgdGhhdCB3YXMgc3RyaXBwaW5nIHdoaXRlc3BhY2UKICAgICAgICAgIGFyb3VuZCBuZXN0ZWQgdGVtcGxhdGVzLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgRm9vPEJhcjxkb3VibGU+ID4KCiAgICAgICAgICB3YXMgZ2V0dGluZyBtdW5nZWQgaW50byBGb288QmFyPj4gd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgaW4KICAgICAgICAgIGluIHRoZSBDKysgY29tcGlsZXIuCgoxMS8yMi85NzogRml4ZWQgYnVncyBpbiB0aGUgQm9ybGFuZCBDKysgbWFrZWZpbGVzLgoKMTEvMjIvOTc6IEZpeGVkIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyB3aGVuIHByb2Nlc3NpbmcgaW50ZWdlcgogICAgICAgICAgYXJndW1lbnRzIGluIFRjbDggbW9kdWxlLgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBSdW50aW1lL01ha2VmaWxlIHJlbGF0ZWQgdG8gVGNsIDguCgoxMS8yMS85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgTm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHBlcmwgc3ludGF4IGVycm9yLgoKMTEvOS85NyA6IENoYW5nZWQgYSBzdHJuY3B5KCkgdG8gc3RyY3B5KCkgaW4gdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyLgogICAgICAgICAgVGhpcyByZXN1bHRzIGluIGEgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4KICAgICAgICAgIHR5cGUtY2hlY2tpbmcuCgoxMC8yOS85NzogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cyBhbmQKICAgICAgICAgIHVzZXItZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oVmVjdG9yIGEsIFZlY3RvciBiID0gZCk7CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrIHByb3Blcmx5LgoKVmVyc2lvbiAxLjEgUGF0Y2ggMiAoU2VwdGVtYmVyIDQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cnJlbmNlcykuCgo3LzcvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aXRoIG5vbi1tZW1iZXIKICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSByZXR1cm5pbmcgbW9yZSB0aGFuIG9uZSB2YWx1ZS4KCjcvNy85NyAgOiBJbmNvcnBvcmF0ZWQgbW9kaWZpY2F0aW9ucyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEd1aWxlIDEuMi4KICAgICAgICAgIFN0aWxsIG5lZWQgdG8gdGVzdCBpdCBvdXQsIGJ1dCBpdCBpcyBydW1vcmVkIHRvIHdvcmsuCgo3LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gb3V0cHV0IGFyZ3VtZW50cyBhbmQgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gICAgSWYgYW4gb3V0cHV0IGFyZ3VtZW50IGlzIGRldGVjdGVkLCBTV0lHIGFzc3VtZXMKICAgICAgICAgIHRoYXQgdGhlIHJlc3VsdCBpcyBhIGxpc3QgYW5kIGhhbmRsZXMgaXQgYXBwcm9wcmlhdGVseS4KICAgICAgICAgIElmIHRoZSBub3JtYWwgcmV0dXJuIHR5cGUgb2YgYW4gZnVuY3Rpb24gaXMgYW4gb2JqZWN0LAogICAgICAgICAgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIHNoYWRvdyBjbGFzcyBhcyBiZWZvcmUsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKICAgICAgICAgIGxpc3QuICAqKiogTk9URSA6IFRoaXMgYmVoYXZpb3IgaGFzIGJlZW4gc3Vic2VxdWVudGx5IGNoYW5nZWQgKioqCgo2LzI5Lzk3IDogQ2hhbmdlZCBFWFBPUlQgdG8gU1dJR0VYUE9SVCBpbiBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICBTaG91bGQgcHJvdmlkZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MuCgo2LzI5Lzk3IDogTW9kaWZpZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHNvIHRoYXQgb3V0cHV0IGFyZ3VtZW50cwogICAgICAgICAgd29yayBjb3JyZWN0bHkgKHdoZW4gdHlwZW1hcHMgYXJlIHVzZWQpLgoKVmVyc2lvbiAxLjEgKEp1bmUgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8yNC85NyA6IEZpeGVkIE9iamVjdGl2ZS1DIGNvbnN0cnVjdG9yIGJ1ZyB3aGVuIHdvcmtpbmcgd2l0aCBQZXJsNQogICAgICAgICAgc2hhZG93IGNsYXNzZXMuCgo2LzIzLzk3IDogRml4ZWQgc29tZSBwYXJzaW5nIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBub3cgOgoKICAgICAgICAgICAgICAgLSBmb28gOiAoaW50KSBhIHdpdGg6IChpbnQpIGI7Cgo2LzIyLzk3IDogQWRkZWQgU1dJRyBSdW50aW1lIGxpYnJhcnkuICAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zCiAgICAgICAgICB0aGUgU1dJRyBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKICAgICAgICAgIHRoYXQgYXJlIG5vcm1hbGx5IGluY2x1ZGVkIGluIGV2ZXJ5IG1vZHVsZS4gIEJ5IHVzaW5nCiAgICAgICAgICB0aGUgbGlicmFyeSwgaXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBTV0lHCiAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBtaW5vciBidWcgaW4gUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9mIG11bHRpcGxlIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBXaGVuIHVzZWQgd2l0aAogICAgICAgICAgUGVybDUgc2hhZG93IGNsYXNzZXMsIHRoaXMgZ2VuZXJhdGVzIGEgJ3JlcXVpcmUnIHN0YXRlbWVudAogICAgICAgICAgdG8gbG9hZCBpbiBleHRlcm5hbCBtb2R1bGVzLgoKNi8yMi85NyA6IEFkZGVkIC1zd2lnbGliIG9wdGlvbi4gIFRoaXMgcHJpbnRzIG91dCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkgYW5kIGV4aXRzLiAgVGhpcyBvcHRpb24gaXMgb25seSByZWFsbHkgdXNlZnVsIHRvCiAgICAgICAgICBjb25maWd1cmF0aW9uIHRvb2xzIHRoYXQgYXJlIGxvb2tpbmcgZm9yIFNXSUcgYW5kIGl0cyBsaWJyYXJ5CiAgICAgICAgICBsb2NhdGlvbiAoZS5nLiBhdXRvY29uZiwgY29uZmlndXJlLCBldGMuLi4pLgoKNi8yMS85NyA6IEZpeGVkIGV4cG9ydCBidWcgd2l0aCBQZXJsNS4wMDQgb24gV2luZG93cy1OVC4KCjYvMjAvOTcgOiBNaW5vciBjaGFuZ2UgdG8gY29kZSBnZW5lcmF0aW9uIG9mIGNsYXNzL3N0cnVjdHVyZSBtZW1iZXJzIGluCiAgICAgICAgICBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIHR5cGVtYXBzLiBTaG91bGQgaGF2ZSBubyBub3RpY2FibGUKICAgICAgICAgIGltcGFjdCBvbiBleGlzdGluZyBTV0lHIG1vZHVsZXMuCgo2LzE5Lzk3IDogQWRkZWQgLXQgb3B0aW9uLiBUaGlzIGFsbG93cyBTV0lHIHRvIGxvYWQgYSB0eXBlbWFwIGZpbGUgYmVmb3JlCiAgICAgICAgICBwcm9jZXNzaW5nIGFueSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHN3aWcgLXQgdHlwZW1hcHMuaSAtcHl0aG9uIGV4YW1wbGUuaQoKICAgICAgICAgIEF0IG1vc3QsIG9ubHkgb25lIHR5cGVtYXAgZmlsZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xOC85NyA6IE5lZWQgYSBNYWtlZmlsZSBmYXN0PyBUeXBlCgogICAgICAgICAgICAgICAgIHN3aWcgWy10Y2wsIC1wZXJsNSwgLXB5dGhvbl0gLWNvIE1ha2VmaWxlCgogICAgICAgICAgYW5kIHlvdSB3aWxsIGdldCBhIE1ha2VmaWxlIHNwZWNpZmljIHRvIHRoYXQgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgWW91IGp1c3QgbmVlZCB0byBtb2RpZnkgaXQgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIHlvdSdyZQogICAgICAgICAgcmVhZHkgdG8gcnVuLgoKNi8xOC85NyA6IENvbXBsZXRlZCB0aGUgLWNpIG9wdGlvbi4gIFRoaXMgb3B0aW9uIGNoZWNrcyBhIGZpbGUgaW50byB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeS4gICBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEKICAgICAgICAgIGxhbmd1YWdlIG9wdGlvbi4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGNsIC1jaSBmb29iYXIuaQoKICAgICAgICAgIENoZWNrcyB0aGUgZmlsZSBmb29iYXIuaSBpbnRvIHRoZSBUY2wgcGFydCBvZiB0aGUgbGlicmFyeS4KICAgICAgICAgIEluIG9yZGVyIHRvIGNoZWNrIGEgZmlsZSBpbnRvIHRoZSBnZW5lcmFsIGxpYnJhcnkgKGFjY2Vzc2libGUKICAgICAgICAgIHRvIGFsbCBsYW5ndWFnZXMgbW9kdWxlcyksIGRvIHRoZSBmb2xsb3dpbmcKCiAgICAgICAgICAgICAgICAgIHN3aWcgLWNpIC1vIC4uL2Zvb2Jhci5pIGZvb2Jhci5pCgogICAgICAgICAgKEFkbWl0dGVkbHkgdGhpcyBsb29rcyBhIGxpdHRsZSBzdHJhbmdlIGJ1dCBpcyB1bmF2b2lkYWJsZSkuCiAgICAgICAgICBUaGUgY2hlY2staW4gb3B0aW9uIGlzIHByaW1hcmlseSBkZXNpZ25lZCBmb3IgU1dJRyBtYWludGVuYW5jZQogICAgICAgICAgYW5kIGxpYnJhcnkgZGV2ZWxvcG1lbnQuIFRoZSBjb21tYW5kIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBkb2VzCiAgICAgICAgICBub3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIHRvIHRoZSBTV0lHIGxpYnJhcnkuICBUaGlyZCBwYXJ0eSBsaWJyYXJ5CiAgICAgICAgICBleHRlbnNpb25zIGNhbiBlYXNpbHkgaW5zdGFsbCB0aGVtc2VsdmVzIGJ5IHNpbXBseSBwcm92aWRpbmcKICAgICAgICAgIGEgc2hlbGwgc2NyaXB0IHRoYXQgdXNlcyAnc3dpZyAtY2knIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93IHdoZXJlIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgIGlzIGxvY2F0ZWQgaWYgeW91IHVzZSB0aGlzIG1lY2hhbmlzbS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTYvOTcgOiBGaXhlZCBhIGJ1ZyBpbiBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbiB3aGVuICVuYW1lKCkgd2FzIGFwcGxpZWQKICAgICAgICAgIHRvIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBVbmZvcnR1bmF0ZWx5LCBmaXhpbmcgdGhlIGJ1ZyByZXF1aXJlZAogICAgICAgICAgYSBjaGFuZ2UgaW4gdGhlIExhbmd1YWdlIEMgQVBJIGJ5IGFkZGluZyBhbiBleHRyYSBhcmd1bWVudCB0bwogICAgICAgICAgdGhlIExhbmd1YWdlOjpjcHBfY2xhc3NfZGVjbCgpIGZ1bmN0aW9uLiAgVGhpcyBtYXkgYnJlYWsKICAgICAgICAgIFNXSUcgQysrIGV4dGVuc2lvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvMTUvOTcgOiBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBubyBtb2R1bGUgbmFtZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgICVtb2R1bGUgZGlyZWN0aXZlIG9yIC1tb2R1bGUgb3B0aW9uLgoKNi8xNS85NyA6IEZpeGVkIGxpbmUgbnVtYmVyIGJ1ZyB3aGVuIHJlcG9ydGluZyBlcnJvcnMgZm9yIHVuZGVmaW5lZAogICAgICAgICAgYmFzZSBjbGFzc2VzLgoKNi8xNS85NyA6IEFkZGVkIG5ldyAlcmVuYW1lIGRpcmVjdGl2ZS4gIFRoaXMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uCiAgICAgICAgICBvZiBhIHJlbmFtaW5nLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lIE9sZE5hbWUgTmV3TmFtZTsKCiAgICAgICAgICAgICAgICAgLi4uLiBsYXRlciAuLi4KICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKICAgICAgICAgIFVubGlrZSAlbmFtZSwgJXJlbmFtZSB3aWxsIHJlbmFtZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBleHBvcnQgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICB5b3Vyc2VsZi4KCiAgICAgICAgICAgIC0gIEJpemFycmUgY29tcGlsYXRpb24gcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlcgogICAgICAgICAgICAgICBjb2RlIGFzIEFOU0kgQyB1bmRlciBWaXN1YWwgQysrIDQueCBmaXhlZC4KCiAgICAgICAgICAgIC0gIFRlc3RlZCB3aXRoIGJvdGggdGhlIHN0b2NrIFB5dGhvbi0xLjQgZGlzdHJpYnV0aW9uIGFuZCBQeXRob253aW4KICAgICAgICAgICAgICAgcnVubmluZyB1bmRlciBXaW45NS4KCjIvMTkvOTcgOiBGaXhlZCB0eXBlZGVmIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjIvMTkvOTcgOiBBZGRlZCBleGNlcHRpb24gc3VwcG9ydC4gIFRvIHVzZSBpdCwgZG8gdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgICVleGNlcHQobGFuZykgewogICAgICAgICAgICAgICAgICAuLi4gdHJ5IHBhcnQgb2YgdGhlIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIC4uLiBjYXRjaCBwYXJ0IG9mIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgJGZ1bmN0aW9uIGlzIGEgU1dJRyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCiAgICAgICAgICBhY3R1YWwgQy9DKysgZnVuY3Rpb24gY2FsbCBpbiBhIHdyYXBwZXIgZnVuY3Rpb24uICBUaHVzLAogICAgICAgICAgYSByZWFsIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAlZXhjZXB0KHBlcmw1KSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoIChjaGFyIComIHN6KSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHByb2Nlc3MgYW4gZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICB9IGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIGNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbi4gQmFpbGluZyBvdXQuLi4iKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQoKMi8xOS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIG1hbmFnaW5nIGdlbmVyaWMgY29kZSBmcmFnbWVudHMgKG5lZWRlZAogICAgICAgICAgZm9yIGV4Y2VwdGlvbnMpLgoKMi8xOS85NyA6IEZpeGVkIHNvbWUgcmVhbGx5IG9ic2N1cmUgdHlwZW1hcCBzY29waW5nIGJ1Z3MgaW4gdGhlIEMrKwogICAgICAgICAgaGFuZGxlci4KCjIvMTgvOTcgOiBDbGVhbmVkIHVwIHBlcmxtYWluLmkgZmlsZSBieSByZW1vdmluZyBzb21lIHByb2JsZW1hdGljLAogICAgICAgICAgYnV0IHNlZW1pbmdseSB1bm5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMuCgoyLzE4Lzk3IDogT3B0aW1pemVkIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbnMgdW5kZXIgaW5oZXJpdGFuY2UuCiAgICAgICAgICBTV0lHIGNhbiBub3cgdXNlIHdyYXBwZXIgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgYQogICAgICAgICAgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIHJlZ2VuZXJhdGluZyB3cmFwcGVycyBmb3IKICAgICAgICAgIHRoZSBzYW1lIGZ1bmN0aW9ucyBpbiBhIGRlcml2ZWQgY2xhc3MuICAgIFRoaXMgY291bGQKICAgICAgICAgIG1ha2UgYSBkcmFzdGljIHJlZHVjdGlvbiBpbiB3cmFwcGVyIGNvZGUgc2l6ZSBmb3IgQysrCiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBkZWVwIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGFuZAogICAgICAgICAgbG90cyBvZiBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogQWRkaXRpb25hbCBtZXRob2RzIHNwZWNpZmllZCB3aXRoICVhZGRtZXRob2RzIGNhbiBub3cKICAgICAgICAgIGJlIGluaGVyaXRlZCBhbG9uZyB3aXRoIG5vcm1hbCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBNaW5vciBpbnRlcm5hbCBmaXhlcyB0byBtYWtlIFNXSUcncyBzdHJpbmcgaGFuZGxpbmcgYSBsaXR0bGUKICAgICAgICAgIHNhZmVyLgoKMi8xNi85NyA6IE1vdmVkIHNvbWUgY29kZSBnZW5lcmF0aW9uIG9mIFRjbCBzaGFkb3cgY2xhc3NlcyB0bwogICAgICAgICAgbGlicmFyeSBmaWxlcy4KCjIvMTYvOTcgOiBGaXhlZCBkb2N1bWVudGF0aW9uIGVycm9yIG9mICctY29uZmlndXJlJyBtZXRob2QgaW4KICAgICAgICAgIFRjbCBtb2R1bGVzLgoKMi8xNi85NyA6IE1vZGlmaWVkIFBlcmw1IG1vZHVsZSBzbGlnaHRseSB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcy4KCjIvMTIvOTcgOiBGaXhlZCBhcmd1bWVudCBjaGVja2luZyBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBieQogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgKGZ1bmN0aW9uIGNhbGxzIHdpdGggdG9vIG1hbnkKICAgICAgICAgIGFyZ3VtZW50cyB3b3VsZCBzdGlsbCBiZSBleGVjdXRlZCkuICBGdW5jdGlvbnMgbm93CiAgICAgICAgICBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcyBDIHZlcnNpb24KICAgICAgICAgICh3aXRoIHBvc3NpYmlsaXR5IG9mIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBzdGlsbCBzdXBwb3J0ZWQpLgoKMi8xMi85NyA6IEZpeGVkIGRlZmF1bHQgYXJndW1lbnQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zIGludm9sdmluZyBkZWZhdWx0CiAgICAgICAgICBhcmd1bWVudHMgb2YgY29tcGxleCBkYXRhdHlwZXMuCgoyLzEyLzk3IDogRml4ZWQgdHlwZW1hcCBzY29waW5nIHByb2JsZW1zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gZ2V0IGEgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiYXIoZG91YmxlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBuZXcgZ2V0IGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBhcHBseSB0aGUgc2Vjb25kIHR5cGVtYXAgdG8gYWxsIGZ1bmN0aW9ucyBpbiBGb28KICAgICAgICAgIGR1ZSB0byBkZWxheWVkIGdlbmVyYXRpb24gb2YgQysrIHdyYXBwZXIgY29kZSAoY2xlYXJseSB0aGlzCiAgICAgICAgICBpcyBub3QgdGhlIGRlc2lyZWQgZWZmZWN0KS4gICBQcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5CiAgICAgICAgICBhc3NpZ25pbmcgdW5pcXVlIG51bWVyaWNhbCBpZGVudGlmaWVycyB0byBldmVyeSBkYXRhdHlwZSBpbgogICAgICAgICAgYW4gaW50ZXJmYWNlIGZpbGUgYW5kIHJlY29yZGluZyB0aGUgInJhbmdlIG9mIGVmZmVjdCIgb2YgZWFjaAogICAgICAgICAgdHlwZW1hcC4KCjIvMTEvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciAiaWdub3JlIiBhbmQgImRlZmF1bHQiIHR5cGVtYXBzLiAgT25seSB1c2UKICAgICAgICAgIGlmIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuCgoyLzkvOTcgIDogQWRkZWQgYXV0b21hdGljIGNyZWF0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yCiAgICAgICAgICBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW55IHNvcnQgb2YKICAgICAgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAgVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGJ5CiAgICAgICAgICBydW5uaW5nIFNXSUcgd2l0aCB0aGUgJy1tYWtlX2RlZmF1bHQnIG9wdGlvbiBvciBieSBpbnNlcnRpbmcKICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGludG8gYW4gaW50ZXJmYWNlIGZpbGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG1ha2VfZGVmYXVsdAoKICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJhZ21hIGRpc2FibGVzIGF1dG9tYXRpYyBjb25zdHJ1Y3RvciBnZW5lcmF0aW9uCgogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdAoKMi85Lzk3ICA6IEFkZGVkIC1tYWtlX2RlZmF1bHQgb3B0aW9uIGZvciBwcm9kdWNpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBmb3IgY2xhc3NlcyB3aXRob3V0IHRoZW0uCgoyLzkvOTcgIDogQ2hhbmdlZCB0aGUgc3ludGF4IG9mIHRoZSBTV0lHICVwcmFnbWEgZGlyZWN0aXZlIHRvCiAgICAgICAgICAlcHJhZ21hIG9wdGlvbj12YWx1ZSBvciAlcHJhZ21hKGxhbmcpIG9wdGlvbj12YWx1ZS4KICAgICAgICAgIFRoaXMgY2hhbmdlIG1ha2VzIHRoZSBzeW50YXggYSBsaXR0bGUgbW9yZSBjb25zaXN0ZW50CiAgICAgICAgICBiZXR3ZWVuIGdlbmVyYWwgcHJhZ21hcyBhbmQgbGFuZ3VhZ2Utc3BlY2lmaWMgcHJhZ21hcy4KICAgICAgICAgIFRoZSBvbGQgc3ludGF4IHN0aWxsIHdvcmtzLCBidXQgd2lsbCBwcm9iYWJseSBiZSBwaGFzZWQKICAgICAgICAgIG91dCAoYSB3YXJuaW5nIG1lc3NhZ2UgaXMgY3VycmVudGx5IHByaW50ZWQpLgoKMi85Lzk3ICA6IEltcHJvdmVkIFRjbCBzdXBwb3J0IG9mIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBhcmUgb2YKICAgICAgICAgIHN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCB1bmlvbnMuCgoyLzkvOTcgIDogRml4ZWQgQysrIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gUHl0aG9uICdlbWJlZC5pJyBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgbWlzc2luZyByZXR1cm4gdmFsdWUgaW4gcGVybG1haW4uaSBsaWJyYXJ5IGZpbGUuCgoyLzkvOTcgIDogRml4ZWQgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIHJldHVybiBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuCiAgICAgICAgICB1bmRlZmluZWQgYXR0cmlidXRlcyBhcmUgYWNjZXNzZWQgKG9sZGVyIHZlcnNpb25zIHJldHVybmVkCiAgICAgICAgICBhIE5hbWVFcnJvcikuCgoyLzkvOTcgIDogRml4ZWQgYnVnIHdoZW4gJWFkZG1ldGhvZHMgaXMgdXNlZCBhZnRlciBhIGNsYXNzIGRlZmluaXRpb24gd2hvc2UKICAgICAgICAgIGxhc3Qgc2VjdGlvbiBpcyBwcm90ZWN0ZWQgb3IgcHJpdmF0ZS4KCjIvOC85NyAgOiBNYWRlIHNsaWdodCBjaGFuZ2VzIGluIGluY2x1ZGUgZmlsZSBwcm9jZXNzaW5nIHRvIHN1cHBvcnQKICAgICAgICAgIHRoZSBNYWNpbnRvc2guCgoyLzgvOTcgIDogRXh0ZW5kZWQgc3dpZ21haW4uY3h4IHRvIHByb3ZpZGUgYSBydWRpbWVudGFyeSBNYWNpbnRvc2ggaW50ZXJmYWNlLgogICAgICAgICAgSXQncyBhIHJlYWxseSBiYWQgaW50ZXJmYWNlLCBidXQgd29ya3MgdW50aWwgc29tZXRoaW5nIGJldHRlcgogICAgICAgICAgaXMgd3JpdHRlbi4KCjEvMjkvOTcgOiBGaXhlZCB0eXBlLWNhc3RpbmcgYnVnIGludHJvZHVjZWQgYnkgMS4xYjQgd2hlbiBzZXR0aW5nL2dldHRpbmcgdGhlCiAgICAgICAgICB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGVzIGludm9sdmluZyBjb21wbGV4IGRhdGEgdHlwZXMuCgoxLzI5Lzk3IDogUmVtb3ZlZCBlcnJvbmVvdXMgd2hpdGUgc3BhY2UgYmVmb3JlIGFuICNlbmRpZiBpbiB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgIGJ5IHRoZSBQeXRob24gbW9kdWxlICh3YXMgY2F1c2luZyBlcnJvcnMgb24gREVDIEFscGhhIGNvbXBpbGVycykuCgoxLzI2Lzk3IDogRml4ZWQgZXJyb3JzIHdoZW4gdXNpbmcgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMgaW4gUHl0aG9uIHNoYWRvdwoJICBzaGFkb3cgY2xhc3Nlcy4KCjEvMjMvOTcgOiBGaXhlZCBidWcgd2l0aCBuZXN0ZWQgJWV4dGVybiBkZWNsYXJhdGlvbnMuCgoxLzIxLzk3IDogRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgaW52b2x2aW5nIGNvbnN0IGRhdGF0eXBlcy4KCjEvMjEvOTcgOiBTb21ld2hhdCBvYnNjdXJlLCBidXQgc2VyaW91cyBidWcgd2l0aCBoYXZpbmcgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICBvZiB0eXBlZGVmcyBmaXhlZC4gIEZvciBleGFtcGxlIDoKCgkJdHlwZWRlZiBjaGFyICpTdHJpbmc7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFN0cmluZyAgTmFtZTsKClZlcnNpb24gMS4xIEJldGE0IChKYW51YXJ5IDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBTV0lHIDEuMWIzIGNyYXNoZWQgYW5kIGJ1cm5lZCBzaG9ydGx5IGFmdGVyIHRha2Ugb2ZmIGR1ZQp0byBhIGZldyBtYWpvciBydW4tdGltZSBwcm9ibGVtcyB0aGF0IHN1cmZhY2VkIGFmdGVyIHJlbGVhc2UuClRoaXMgcmVsZWFzZSBzaG91bGQgZml4IG1vc3QsIGlmIG5vdCBhbGwsIG9mIHRob3NlIHByb2JsZW1zLgoKMS8xNi85NyA6IEZpeGVkIG1ham9yIG1lbW9yeSBtYW5hZ2VtZW50IGJ1ZyBvbiBMaW51eAoKMS8xNC85NyA6IEZpeGVkIGJ1ZyBpbiBmdW5jdGlvbnMgcmV0dXJuaW5nIGNvbnN0YW50IEMrKyByZWZlcmVuY2VzLgoKMS8xNC85NyA6IE1vZGlmaWVkIEMrKyBtb2R1bGUgdG8gaGFuZGxlIGRhdGF0eXBlcyBiZXR0ZXIuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IGEgKnNpbmdsZSogc2NvcGUgcmVzb2x1dGlvbgogICAgICAgICAgb3BlcmF0b3IgaW4gZGF0YXR5cGVzLiAgSWUgOiBGb286OmJhci4gICBTV0lHIGRvZXNuJ3QKICAgICAgICAgIHlldCBoYW5kbGUgbmVzdGVkIGNsYXNzZXMsIHNvIHRoaXMgc2hvdWxkIGJlCiAgICAgICAgICBzdWZmaWNpZW50IGZvciBub3cuCgoxLzE0Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHR5cGVkZWYgaW5zaWRlIGEgQysrIGNsYXNzLgoKMS8xNC85NyA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBkYXRhdHlwZXMgZGVmaW5lZCBpbnNpZGUKICAgICAgICAgIGEgQysrIGNsYXNzLiAgU1dJRyB3YXMgbm90IGdlbmVyYXRpbmcgY29ycmVjdCBjb2RlLAogICAgICAgICAgYnV0IGEgbmV3IHNjb3BpbmcgbWVjaGFuaXNtIGFuZCBtZXRob2QgZm9yIGhhbmRsaW5nCiAgICAgICAgICBkYXRhdHlwZXMgaW5zaWRlIGEgQysrIGNsYXNzIGhhdmUgYmVlbiBhZGRlZC4KCjEvMTQvOTcgOiBDaGFuZ2VkIGVudW1lcmF0aW9ucyB0byB1c2UgdGhlIHZhbHVlIG5hbWUgaW5zdGVhZAogICAgICAgICAgb2YgYW55IHZhbHVlcyB0aGF0IG1pZ2h0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIGludGVyZmFjZQogICAgICAgICAgZmlsZS4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSBmcmllbmRseSB0bwogICAgICAgICAgQysrIGNvbXBpbGVycy4KCjEvMTQvOTcgOiBSZW1vdmVkIHR5cGVkZWYgYnVnIHRoYXQgbWFkZSBhbGwgZW51bWVyYXRpb25zCiAgICAgICAgICBlcXVpdmFsZW50IHRvIGVhY2ggb3RoZXIgaW4gdGhlIHR5cGUgY2hlY2tlciAoc2luY2UKICAgICAgICAgIGl0IGdlbmVyYXRlZCBhbG90IG9mIHVubmVjZXNzYXJ5IGNvZGUpLgoKVmVyc2lvbiAxLjEgQmV0YTMgKEphbnVhcnkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBDKysgbW9kdWxlCgoyLiBGaXhlZCBtaW5vciBidWcgaW4gcG9pbnRlciB0eXBlLWNoZWNrZXIgd2hlbiB1c2luZwogICAtREFMTE9XX05VTEwuCgozLiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IHRvIHdvcmsgd2l0aCBQeXRob24gMS40YmV0YTMKCjQuIENoYW5nZWQgY29uZmlndXJlIHNjcmlwdCB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRob3V0CiAgIHlhY2Mgb3IgYmlzb24uCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDI4LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIENoYW5nZWQgcGFyc2VyIHRvIHN1cHBvcnQgbW9yZSBDL0MrKyBkYXRhdHlwZXMgKHdlbGwsCiAgICBtb3JlIHZhcmlhbnRzKS4gICBUeXBlcyBsaWtlICJ1bnNpZ25lZCIsICJzaG9ydCBpbnQiLAogICAgImxvbmcgaW50IiwgZXRjLi4uIG5vdyB3b3JrLgoKMi4gICJ1bmlvbnMiIGFkZGVkIHRvIHBhcnNlci4KCjMuICBVc2Ugb2YgInR5cGVkZWYiIGFzIGluIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgIGRvdWJsZSB4LHksejsKCX0gVmVjdG9yOwoKICAgIE5vdyB3b3JrcyBjb3JyZWN0bHkuICAgVGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYgaXMgdXNlZCBhcwogICAgdGhlIHN0cnVjdHVyZSBuYW1lLgoKNC4gIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmLCAjZWxzZSwgI2VuZGlmLCBldGMuLi4KICAgIGFkZGVkLgoKNS4gIE5ldyAlZGlzYWJsZWRvYywgJWVuYWJsZWRvYyBkaXJlY3RpdmVzIGFsbG93IGRvY3VtZW50YXRpb24KICAgIHRvIHNlbGVjdGl2ZWx5IGJlIGRpc2FibGVkIGZvciBjZXJ0YWluIHBhcnRzIG9mIGEgd3JhcHBlcgogICAgZmlsZS4KCjYuICBOZXcgUHl0aG9uIG1vZHVsZSBzdXBwb3J0cyBiZXR0ZXIgdmFyaWFibGUgbGlua2luZywgY29uc3RhbnRzLAogICAgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNy4gIFBlcmw1IG1vZHVsZSBpbXByb3ZlZCB3aXRoIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggWFMKICAgIGFuZCB4c3VicHAuICAgU1dJRyBwb2ludGVycyBhbmQgbm93IGNyZWF0ZWQgc28gdGhhdCB0aGV5CiAgICBhcmUgY29tcGF0aWJsZSB3aXRoIHhzdWJwcCBwb2ludGVycy4KCjguICBTdXBwb3J0IGZvciBbaW5jciBUY2xdIG5hbWVzcGFjZXMgYWRkZWQgdG8gVGNsIG1vZHVsZS4KCjkuICAlcHJhZ21hIGRpcmVjdGl2ZSBhZGRlZC4KCjEwLiAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgYWRkZWQuCgoxMS4gJW5hdGl2ZSBkaXJlY3RpdmUgYWRkZWQgdG8gYWxsb3cgcHJlLWV4aXN0aW5nIHdyYXBwZXIgZnVuY3Rpb25zCiAgICB0byBiZSB1c2VkLgoKMTIuIFdyb3RlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFNXSUcgaW5zdGFsbGF0aW9uLgoKMTMuIEZ1bmN0aW9uIHBvaW50ZXJzIG5vdyBhbGxvd2VkIHdpdGggdHlwZWRlZiBzdGF0ZW1lbnRzLgoKMTQuICV0eXBlZGVmIG1vZGlmaWVkIHRvIGluc2VydCBhIGNvcnJlc3BvbmRpbmcgQyB0eXBlZGVmIGludG8KICAgIHRoZSBvdXRwdXQgZmlsZS4KCjE1LiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gQysrIHJlZmVyZW5jZXMuCgoxNi4gTmV3IFN0cmluZyBhbmQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzZXMgYWRkIHRvIG1ha2UgZ2VuZXJhdGluZwogICAgd3JhcHBlciBjb2RlIGVhc2llci4KCjE3LiBGaXhlZCBjb21tYW5kIGxpbmUgb3B0aW9uIHByb2Nlc3NpbmcgdG8gZWxpbWluYXRlIGNvcmUgZHVtcHMKICAgIGFuZCB0byBhbGxvdyBoZWxwIG1lc3NhZ2VzLgoKMTguIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byBhbG1vc3QgYWxsIGNvZGUgbW9kdWxlcwoKClZlcnNpb24gMS4wIEJldGEgMyAoUGF0Y2ggMSkgSnVseSAxNywgMTk5Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuMCBGaW5hbCBpcyBub3QgcXVpdGUgcmVhZHkgeWV0LCBidXQgdGhpcyByZWxlYXNlIGZpeGVzIGEKbnVtYmVyIG9mIGltbWVkaWF0ZSBwcm9ibGVtcyA6CgoxLiAgQ29tcGlsZXIgZXJyb3JzIHdoZW4gdXNpbmcgLXN0cmljdCAxIHR5cGUgY2hlY2tpbmcgaGF2ZSBiZWVuIGZpeGVkLgoKMi4gIFBvaW50ZXIgdHlwZSBjaGVja2VyIG5vdyByZWNvZ25pemVzIHBvaW50ZXJzIG9mIHRoZSBmb3JtCiAgICBfMF9UeXBlIGNvcnJlY3RseS4KCjMuICBBIGZldyBtaW5vciBmaXhlcyB3ZXJlIG1hZGUgaW4gdGhlIE1ha2VmaWxlCgpWZXJzaW9uIDEuMCBCZXRhIDMgKEp1bmUgMTQsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgcmVsZWFzZSBpcyBpZGVudGljYWwgdG8gQmV0YTEgZXhjZXB0IGEgZmV3IG1pbm9yIGJ1Z3MgYXJlCmZpeGVkIGFuZCB0aGUgU1dJRyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUvVGsgNC4xLgpBIHRjbDcuNSBleGFtcGxlcyBkaXJlY3RvcnkgaXMgbm93IGluY2x1ZGVkLgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgTWFrZWZpbGUgdGhhdCBkaWRuJ3QgaW5zdGFsbCB0aGUgbGlicmFyaWVzCiAgY29ycmVjdGx5LgoKLSBTV0lHIExpYnJhcnkgZmlsZXMgYXJlIG5vdyB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41IGFuZCBUayA0LjEuCgotIE1pbm9yIGJ1ZyBmaXhlcyBpbiBvdGhlciBtb2R1bGVzLgoKClZlcnNpb24gMS4wIEJldGEgMSAgKEFwcmlsIDEwLCAxOTk2KS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBpcyB0aGUgZmlyc3QgInNlbWktb2ZmaWNpYWwiIHJlbGVhc2Ugb2YgU1dJRy4gICAgSXQgaGFzIGEKbnVtYmVyIG9mIHN1YnN0YW50aWFsIGltcHJvdmVtZW50cyBvdmVyIHRoZSBBbHBoYSByZWxlYXNlLiAgIFRoZXNlCm5vdGVzIGFyZSBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLS1ob3BlIEkgcmVtZW1iZXJlZCBldmVyeXRoaW5nLi4uLgoKMS4gIFRjbC9UawoKU1dJRyBpcyBrbm93biB0byB3b3JrIHdpdGggVGNsNy4zLCBUazMuNiBhbmQgbGF0ZXIgdmVyc2lvbnMuCkkndmUgYWxzbyB0ZXN0ZWQgU1dJRyB3aXRoIGV4cGVjdC01LjE5LgoKTm9ybWFsbHkgU1dJRyBleHBlY3RzIHRvIHVzZSB0aGUgaGVhZGVyIGZpbGVzICJ0Y2wuaCIgYW5kICJ0ay5oIi4KTmV3ZXIgdmVyc2lvbnMgb2YgVGNsL1RrIHVzZSB2ZXJzaW9uIG51bWJlcnMuICAgWW91IGNhbiBzcGVjaWZ5IHRoZXNlCmluIFNXSUcgYXMgZm9sbG93cyA6CgogICAgICAgICUgd3JhcCAtaHRjbCB0Y2w3LjQuaCAtaHRrIHRrNC4wLmggZXhhbXBsZS5pCgpPZiBjb3Vyc2UsIEkgcHJlZmVyIHRvIHNpbXBseSBzZXQgdXAgc3ltYm9saWMgbGlua3MgYmV0d2VlbiAidGNsLmgiIGFuZAp0aGUgbW9zdCByZWNlbnQgc3RhYmxlIHZlcnNpb24gb24gdGhlIG1hY2hpbmUuCgoyLiAgUGVybDQKClRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gYmFzZWQgb24gUGVybC00LjAzNS4gIFNXSUcncyBpbnRlcmZhY2UgdG8KUGVybDQgaXMgYmFzZWQgb24gdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgaW4gdGhlICJQcm9ncmFtbWluZyBQZXJsIgpib29rIGJ5IExhcnJ5IFdhbGwsIGFuZCBmaWxlcyBsb2NhdGVkIGluIHRoZSAidXN1YiIgZGlyZWN0b3J5IG9mIHRoZQpQZXJsNCBkaXN0cmlidXRpb24uCgpJbiBvcmRlciB0byBjb21waWxlIHdpdGggUGVybDQsIHlvdSdsbCBuZWVkIHRvIGxpbmsgd2l0aCB0aGUgdXBlcmwubwpmaWxlIGZvdW5kIGluIHRoZSBQZXJsNCBzb3VyY2UgZGlyZWN0b3J5LiAgWW91IG1heSB3YW50IHRvIG1vdmUgdGhpcwpmaWxlIHRvIGEgbW9yZSBjb252ZW5pZW50IGxvY2F0aW9uLgoKMy4gIFBlcmw1CgpUaGlzIGlzIGEgc29tZXdoYXQgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uLCBidXQgaXMgYWxvdCBsZXNzCmJ1Z2d5IHRoYW4gdGhlIGFscGhhIHJlbGVhc2UuICAgICBTV0lHIG9wZXJhdGVzIGluZGVwZW5kZW50bHkgb2YKdGhlIFhTIGxhbmd1YWdlIGFuZCB4c3VicHAgc3VwcGxpZWQgd2l0aCBQZXJsNS4gIEN1cnJlbnRseSBTV0lHCnByb2R1Y2VzIHRoZSBuZWNlc3NhcnkgQyBjb2RlIGFuZCAucG0gZmlsZSBuZWVkZWQgdG8gZHluYW1pY2FsbHkKbG9hZCBhIG1vZHVsZSBpbnRvIFBlcmw1LgoKVG8gc3VwcG9ydCBQZXJsNSdzIG5vdGlvbiBvZiBtb2R1bGVzIGFuZCBwYWNrYWdlcyAoYXMgd2l0aCB4c3VicHApLAp5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIDoKCiAgICAgICAgJSB3cmFwIC1wZXJsNSAtbW9kdWxlIE15TW9kdWxlIC1wYWNrYWdlIE15UGFja2FnZSBleGFtcGxlLmkKCk5vdGUgOiBJbiBvcmRlciBmb3IgZHluYW1pYyBsb2FkaW5nIHRvIGJlIGVmZmVjdGl2ZSwgeW91IG5lZWQgdG8gYmUKY2FyZWZ1bCBhYm91dCBuYW1pbmcuICAgIEZvciBhIG1vZHVsZSBuYW1lZCAiTXlNb2R1bGUiLCB5b3UnbGwgbmVlZCB0bwpjcmVhdGUgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY2FsbGVkICJNeU1vZHVsZS5zbyIgdXNpbmcgc29tZXRoaW5nIGxpa2UKCiAgICAgICAgJSBsZCAtc2hhcmVkIG15X29iai5vIC1vIE15TW9kdWxlLnNvCgpUaGUgdXNlIG9mIHRoZSAlaW5pdCBkaXJlY3RpdmUgbXVzdCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgc2luY2UgUGVybDUKY2FsbHMgYSBmdW5jdGlvbiAiYm9vdF9Nb2R1bGVOYW1lIiBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoaW5ncy4KU2VlIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgZm9yIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGdldCB0aGluZ3MKdG8gd29yay4KCjQuICBQeXRob24xLjMKClRoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugc3VwcG9ydGluZyBQeXRob24uICAgIFRoZSBQeXRob24gcG9ydCBpcwpleHBlcmltZW50YWwgYW5kIG1heSBiZSByZXdyaXR0ZW4uICAgVmFyaWFibGUgbGlua2FnZSBpcyBkb25lIHRocm91Z2gKZnVuY3Rpb25zIHdoaWNoIGlzIHNvcnQgb2YgYSBrbHVkZ2UuICBJIGFsc28gdGhpbmsgaXQgd291bGQgYmUgbmljZQp0byBpbXBvcnQgU1dJRyBwb2ludGVycyBpbnRvIFB5dGhvbiBhcyBhIG5ldyBvYmplY3QgKGluc3RlYWQgb2Ygc3RyaW5ncykuCk9mIGNvdXJzZSwgdGhpcyBuZWVkcyBhIGxpdHRsZSBtb3JlIHdvcmsuCgo1LiAgR3VpbGUzCgpJZiB5b3UgcmVhbGx5IHdhbnQgdG8gbGl2ZSBvbiB0aGUgZWRnZSwgcGljayB1cCBhIGNvcHkgb2YgR3VpbGUtaWlpIGFuZApwbGF5IGFyb3VuZCB3aXRoIHRoaXMuICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsLS0tZXNwZWNpYWxseSBzaW5jZQpJJ20gbm90IHN1cmUgd2hhdCB0aGUgb2ZmaWNpYWwgc3RhdGUgb2YgR3VpbGUgaXMgdGhlc2UgZGF5cy4gIFRoaXMKaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBzaG91bGQgSSBzdWRkZW5seSBmaWd1cmUgb3V0IGJldHRlcgp3YXlzIHRvIGRvIHRoaW5ncy4KCjYuICBFeHRlbmRpbmcgU1dJRwoKU1dJRyBpcyB3cml0dGVuIGluIEMrKyBhbHRob3VnaCBJIHRlbmQgdG8gdGhpbmsgb2YgdGhlIGNvZGUgYXMgbW9zdGx5CmJlaW5nIEFOU0kgQyB3aXRoIGEgbGl0dGxlIGluaGVyaXRhbmNlIHRocm93biBpbi4gICBFYWNoIHRhcmdldCBsYW5ndWFnZQppcyBpbXBsZW1lbnRlZCBhcyBhIEMrKyBjbGFzcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbS4KSWYgeW91IHdhbnQgdG8gYWRkIHlvdXIgb3duIG1vZGlmaWNhdGlvbnMsIHNlZSBBcHBlbmRpeCBDIG9mIHRoZSB1c2VyCm1hbnVhbC4gICBUaGVuIHRha2UgYSBsb29rIGF0IHRoZSAidXNlciIgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvbWUKY29kZSBmb3IgYnVpbGRpbmcgeW91ciBvd24gZXh0ZW5pb25zLgoKNy4gVGhlIFNXSUcgbGlicmFyeQoKVGhlIFNXSUcgbGlicmFyeSBpcyBzdGlsbCBpbmNvbXBsZXRlLiAgU29tZSBvZiB0aGUgZmlsZXMgbWVudGlvbmVkIGluCnRoZSB1c2VyIG1hbnVhbCBhcmUgdW5hdmFpbGFibGUuICAgIFRoZXNlIGZpbGVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUKd2hlbiB0aGV5IGFyZSByZWFkeS4gICBTdWJzY3JpYmUgdG8gdGhlIFNXSUcgbWFpbGluZyBsaXN0IGZvciBhbm5vdW5jZW1lbnRzCmFuZCB1cGRhdGVzLgoKOC4gU1dJRyBEb2N1bWVudGF0aW9uCgpJIGhhdmUgc29tZXRpbWVzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHZpZXdpbmcgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBpbgpzb21lIHBvc3RzY3JpcHQgdmlld2Vycy4gICBIb3dldmVyLCB0aGUgZG9jdW1lbnRhdGlvbiBzZWVtcyB0byBwcmludApub3JtYWxseS4gICAgSSdtIHdvcmtpbmcgb24gbWFraW5nIG11Y2ggb2YgdGhlIGRvY3VtZW50YXRpb24gb25saW5lLApidXQgdGhpcyB0YWtlcyB0aW1lLgoKVmVyc2lvbiAwLjEgQWxwaGEgKEZlYnJ1YXJ5IDksIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gIFJ1bi10aW1lIHR5cGUtY2hlY2tpbmcgb2YgU1dJRyBwb2ludGVycy4gICBQb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkCiAgICBhcyBzdHJpbmdzIHdpdGggYm90aCBudW1lcmljIGFuZCBlbmNvZGVkIHR5cGUgaW5mb3JtYXRpb24uICAgIFRoaXMgbWFrZXMKICAgIGl0IGEgbGl0dGxlIGhhcmRlciB0byBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCAoYW5kIGl0IGVsaW1pbmF0ZXMKICAgIHNvbWUgc2VnbWVudGF0aW9uIGZhdWx0cyBhbmQgb3RoZXIgb2RkaXRpZXMpLgoKMi4gIFB5dGhvbiAxLjMgbm93IHN1cHBvcnRlZC4KCjMuICAjZGVmaW5lIGFuZCBlbnVtIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwgY29uc3RhbnRzLgoKNC4gIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgJWluY2x1ZGUgZGlyZWN0aXZlIGFuZCBtYWRlIGl0IGFsb3QgbW9yZSBwb3dlcmZ1bC4KCjUuICBSZXN0cnVjdHVyZWQgdGhlIFNXSUcgbGlicmFyeSB0byBtYWtlIGl0IHdvcmsgYmV0dGVyLgoKNi4gIFZhcmlvdXMgYnVnIGZpeGVzIHRvIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgaW1wbGVtZW50YXRpb25zLgoKNy4gIEJldHRlciBpbXBsZW1lbnRhdGlvbiBvZiAldHlwZWRlZiBkaXJlY3RpdmUuCgo4LiAgTWFkZSBzb21lIGNoYW5nZXMgdG8gU1dJRydzIGNsYXNzIHN0cnVjdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBleHBhbmQuCiAgICBTV0lHIGlzIG5vdyBidWlsdCBpbnRvIGEgbGlicmFyeSBmaWxlIHRoYXQgeW91IGNhbiB1c2UgdG8gbWFrZSB5b3VyCiAgICBvd24gZXh0ZW5pb25zLgoKOS4gIE1hZGUgZXh0ZW5zaXZlIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50YXRpb24uCgoxMC4gTWlub3IgY2hhbmdlcyB0byB0aGUgU1dJRyBwYXJzZXIgdG8gbWFrZSBpdCB1c2UgbGVzcyBtZW1vcnkuCiAgICBBbHNvIHRvb2sgb3V0IHNvbWUgZXh0cmFuZW91cyBydWxlcyB0aGF0IHdlcmUgdW5kb2N1bWVudGVkIGFuZAogICAgZGlkbid0IHdvcmsgaW4gdGhlIGZpcnN0IHBsYWNlLgoKMTEuIFRoZSBTV0lHIGxpYnJhcnkgZmlsZXMgInRjbHNoIiwgIndpc2giLCAiZXhwZWN0IiwgZXRjLi4uIGluIHRoZSBmaXJzdAogICAgcmVsZWFzZSBoYXZlIGJlZW4gcmVzdHJ1Y3R1cmVkIGFuZCByZW5hbWVkIHRvICJ0Y2xzaC5pIiwgIndpc2guaSIsCiAgICBhbmQgc28gb24uCg==