LyoKICogIFRFU1QgU1VJVEUgRk9SIE1CL1dDIEZVTkNUSU9OUyBJTiBDIExJQlJBUlkKICoKICoJIEZJTEU6CWRhdF93Y3RvbWIuYwogKgogKgkgV0NUT01COiAgaW50IHdjdG9tYiAoY2hhciAqcywgd2NoYXJfdCB3YykKICovCgoKLyoKICogIEZVTkNUSU9OOgogKgogKgkgIGludCAgd2N0b21iIChjaGFyICpzLCB3Y2hhcl90IHdjKTsKICoKICoJICAgICAgIHJldHVybjogdGhlIG51bWJlciBvZiBieXRlcwogKgogKiAgTk9URToKICoKICoJIG8gV2hlbiB5b3UgZmVlZCBhIG51bGwgcG9pbnRlciBmb3IgYSBzdHJpbmcgKHMpIHRvIHRoZSBmdW5jdGlvbiwKICoJICAgc2V0IHNfZmxnPTAgaW5zdGVhZCBvZiBwdXR0aW5nIGp1c3QgYSAnTlVMTCcgdGhlcmUuCiAqCSAgIEV2ZW4gaWYgeW91IHB1dCBhICdOVUxMJywgaXQgbWVhbnMgYSBudWxsIHN0cmluZyBhcyB3ZWxsIGFzICIiLgogKgogKgkgbyBXaGVuIHMgaXMgYSBudWxsIHBvaW50ZXIsIHRoZSBmdW5jdGlvbiBjaGVja3Mgc3RhdGUgZGVwZW5kZW5jeS4KICoKICoJICAgICAgIHN0YXRlLWRlcGVuZGVudCBlbmNvZGluZwkgICAgIC0gcmV0dXJuICBOT04temVybwogKgkgICAgICAgc3RhdGUtaW5kZXBlbmRlbnQgZW5jb2RpbmcgICAgLSByZXR1cm4gIDAKICoKICoJICAgSWYgc3RhdGUtZGVwZW5kZW50IGVuY29kaW5nIGlzIGV4cGVjdGVkLCBzZXQKICoKICoJICAgICAgIHNfZmxnID0gMCwgIHJldF9mbGcgPSAwLAkgcmV0X3ZhbCA9ICsxCiAqCiAqCSAgIElmIHN0YXRlLWluZGVwZW5kZW50IGVuY29kaW5nIGlzIGV4cGVjdGVkLCBzZXQKICoKICoJICAgICAgIHNfZmxnID0gMCwgIHJldF9mbGcgPSAwLAkgcmV0X3ZhbCA9IDAKICoKICoKICoJICAgV2hlbiB5b3Ugc2V0IHJldF9mbGc9MSwgdGhlIHRlc3QgcHJvZ3JhbSBzaW1wbHkgY29tcGFyZXMgYW4KICoJICAgYWN0dWFsIHJldHVybiB2YWx1ZSB3aXRoIGFuIGV4cGVjdGVkIHZhbHVlLiBZb3UgY2FuIGNoZWNrCiAqCSAgIHN0YXRlLWluZGVwZW5kZW50IGNhc2UgKHJldHVybiB2YWx1ZSBpcyAwKSBpbiB0aGF0IHdheSwgYnV0CiAqCSAgIHlvdSBjYW4gbm90IGNoZWNrIHN0YXRlLWRlcGVuZGVudCBjYXNlLiBTbyB3aGVuIHlvdSBjaGVjawogKgkgICBzdGF0ZS0gZGVwZW5kZW5jeSBpbiB0aGlzIHRlc3QgZnVuY3Rpb246IHRzdF93Y3RvbWIoKSwgc2V0CiAqCSAgIHJldF9mbGc9MCBhbHdheXMuIEl0J3MgYSBzcGVjaWFsIGNhc2UsIGFuZCB0aGUgdGVzdAogKgkgICBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGl0LgogKgogKgkgICAgICBJbnB1dAkgIEV4cGVjdAogKgogKgkJc19mbGc9MAkJICByZXRfZmxnPTAKICoJCXwJCSAgfAogKgkgICAgICB7IDAsIDAgfSwJICB7IDAsIDAsIDAsICB4LCAgIiIgfQogKgkJICAgfAkJICAgICAgfAogKgkJICAgbm90IHVzZWQJICAgICAgcmV0X3ZhbDogMC8rMQogKiAoZXhwZWN0ZWQgdmFsKQogKi8KCgpUU1RfV0NUT01CIHRzdF93Y3RvbWJfbG9jIFtdID0gewogIHsKICAgIHsgVHdjdG9tYiwgVFNUX0xPQ19kZSB9LAogICAgewogICAgICAvKiAjMDEgOiBub3JtYWwgY2FzZQkJICAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgwMEM0ICB9LAoJLypleHBlY3QqLyB7IDAsMSwxLCAgIsQiCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMiA6IG5vcm1hbCBjYXNlCQkgICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLAkgICAweDAwREMgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDEsICAi3CIJICAgfSwKICAgICAgfSwKICAgICAgLyogIzAzIDogbm9ybWFsIGNhc2UJCSAgICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsCSAgIDB4MDA5MiAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMSwgICJcMjIyIiAgfSwKICAgICAgfSwKICAgICAgLyogIzA0IDogZXJyb3IgY2FzZQkJICAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgzMDQxICB9LAoJLypleHBlY3QqLyB7IDAsMSwtMSwgIiIJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA1IDogc3RhdGUgZGVwZW5kZW5jeQkgICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLAkgICAweDAwMDAgIH0sCgkvKmV4cGVjdCovIHsgMCwwLDAsICAiIgkgICB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3RvbWIsIFRTVF9MT0NfZW5VUyB9LAogICAgewogICAgICAvKiAjMDEgOiBub3JtYWwgY2FzZQkJICAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgwMDQxICB9LAoJLypleHBlY3QqLyB7IDAsMSwxLCAgIkEiCSAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMiA6IG5vcm1hbCBjYXNlCQkgICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLAkgICAweDAwNDIgIH0sCgkvKmV4cGVjdCovIHsgMCwxLDEsICAiQiIJICAgfSwKICAgICAgfSwKICAgICAgLyogIzAzIDogZXJyb3IgY2FzZQkJICAgKi8KICAgICAgLyogPFdBSVZFUj4gKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgwMEM0ICB9LAoJLypleHBlY3QqLyB7IDAsMSwtMSwgIiIJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA0IDogZXJyb3IgY2FzZQkJICAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgzMEE0ICB9LAoJLypleHBlY3QqLyB7IDAsMSwtMSwgIiIJICAgfSwKICAgICAgfSwKICAgICAgLyogIzA1IDogc3RhdGUgZGVwZW5kZW5jeQkgICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLAkgICAweDAwMDAgIH0sCgkvKmV4cGVjdCovIHsgMCwwLDAsICAiIgkgICB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3RvbWIsIFRTVF9MT0NfZXVjSlAgfSwKICAgIHsKICAgICAgLyogIzAxIDogbm9ybWFsIGNhc2UJCSAgICovCiAgICAgIHsgLyppbnB1dC4qLyB7IDEsCSAgIDB4MzA0MiAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMiwgICJcMjQ0XDI0MiIgICB9LAogICAgICB9LAogICAgICAvKiAjMDIgOiBub3JtYWwgY2FzZQkJICAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgzMDQ0ICB9LAoJLypleHBlY3QqLyB7IDAsMSwyLCAgIlwyNDRcMjQ0IiAgIH0sCiAgICAgIH0sCiAgICAgIC8qICMwMyA6IG5vcm1hbCBjYXNlCQkgICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAxLAkgICAweDAwOEUgIH0sCgkvKmV4cGVjdCovIHsgMCwxLC0xLCAiIgkgICB9LAogICAgICB9LAogICAgICAvKiAjMDQgOiBqaXNYMDIxMgkJICAgKi8KICAgICAgeyAvKmlucHV0LiovIHsgMSwJICAgMHgwMEM0CSAgfSwKCS8qZXhwZWN0Ki8geyAwLDEsMywgICJcMjE3XDI1MlwyNDMiIH0sIC8qIGppc3gwMjEwICByZXR1cm5zIDMgKi8KICAgICAgfSwKICAgICAgLyogIzA1IDogc3RhdGUgZGVwZW5kZW5jeQkgICAqLwogICAgICB7IC8qaW5wdXQuKi8geyAwLAkgICAweDAwOEUgIH0sCgkvKmV4cGVjdCovIHsgMCwwLDAsICAiIgkgICB9LAogICAgICB9LAogICAgICB7IC5pc19sYXN0ID0gMSB9CiAgICB9CiAgfSwKICB7CiAgICB7IFR3Y3RvbWIsIFRTVF9MT0NfZW5kIH0KICB9Cn07Cg==