LyoKICogIFRFU1QgU1VJVEUgRk9SIE1CL1dDIEZVTkNUSU9OUyBJTiBDIExJQlJBUlkKICoKICoJIEZJTEU6IGRhdF9zdHJjb2xsLmMKICoKICoJIFNUUkNPTEw6ICBpbnQgc3RyY29sbCAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKICovCgovKgogICBOT1RFOgoKICAgSWYgYSByZXR1cm4gdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgMCwgc2V0IHJldF9mbGc9MSBhbmQgdGhlCiAgIGV4cGVjdGVkIHZhbHVlID0gMC4JSWYgYSByZXR1cm4gdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYQogICBwb3NpdGl2ZS9uZWdhdGl2ZSB2YWx1ZSwgc2V0IHJldF9mbGc9MCwgYW5kIHNldCB0aGUgZXhwZWN0ZWQgdmFsdWUKICAgPSArMS8tMS4KICAgVGhlcmUgaXMgaW5jb25zaXN0ZW5zeSBiZXR3ZWVuIHRzdF9zdHJjb2xsKCkgYW5kIHRzdF93Y3Njb2xsKCkoaXQKICAgaGFzIGNtcF9mbGcpIGZvciBpbnB1dCBkYXRhLiBJJ2xsIGZpeCBpdC4KCiAgIEFzc3VtaW5nIGVuX1VTIHRvIGJlIGVuX1VTLmFzY2lpLiAobWF5YmUsIHNob3VsZCBiZSBpc284ODU5LTEpLgoKCgogICBBU0NJSSBDT0RFICA6IEEsQixDLCAuLi4gICwgYSwgYiwgYywgLi4uCSBCLGE6LTEJICBhLEI6KzEKICAgRElDVElPTkFSWSA6IEEsYSxCLGIsQyxjLC4uLi4gIGEsQjotMSBCLGE6KzEgKi8KClRTVF9TVFJDT0xMIHRzdF9zdHJjb2xsX2xvYyBbXSA9IHsKICB7CiAgICB7IFRzdHJjb2xsLCBUU1RfTE9DX2RlIH0sCiAgICB7CiAgICAgIHsgLyppbnB1dC4qLyB7ICLEQkNERUZHIiwgIsRCQ0RFRkciCSAgICAgIH0sICAvKiAjMSAqLwoJLypleHBlY3QqLyB7IDAsMSwwLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJYWCDEIFhYIiwgIlhYIEIgWFgiCSAgICAgIH0sICAvKiAjMiAqLwoJLypleHBlY3QqLyB7IDAsMCwtMSwJCQkgICAgICB9LAogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAiWFggQiBYWCIsICJYWCDEIFhYIgkgICAgICB9LCAgLyogIzMgKi8KCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKICAgICAgfSwKICAgICAgeyAvKmlucHV0LiovIHsgIkIiLAkiYSIJCSAgICAgIH0sICAvKiAjNCAqLwoJLypleHBlY3QqLyB7IDAsMCwrMSwJCQkgICAgICB9LAogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAiYSIsCSJCIgkJICAgICAgfSwgIC8qICM1ICovCgkvKmV4cGVjdCovIHsgMCwwLC0xLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJiIiwJIkEiCQkgICAgICB9LCAgLyogIzYgKi8KCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKICAgICAgfSwKICAgICAgeyAvKmlucHV0LiovIHsgIkEiLAkiYiIJCSAgICAgIH0sICAvKiAjNyAqLwoJLypleHBlY3QqLyB7IDAsMCwtMSwJCQkgICAgICB9LAogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAi5CIsCSJCIgkJICAgICAgfSwgIC8qICM4ICovCgkvKmV4cGVjdCovIHsgMCwwLC0xLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJCIiwJIuQiCQkgICAgICB9LCAgLyogIzkgKi8KCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKICAgICAgfSwKICAgICAgeyAuaXNfbGFzdCA9IDEgfSAvKiBMYXN0IGVsZW1lbnQuICAqLwogICAgfQogIH0sCiAgewogICAgeyBUc3RyY29sbCwgVFNUX0xPQ19lblVTIH0sCiAgICB7CiAgICAgIHsgLyppbnB1dC4qLyB7ICJBQkNERUZHIiwgIkFCQ0RFRkciCSAgICAgIH0sICAvKiAjMSAqLwoJLypleHBlY3QqLyB7IDAsMSwwLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJYWCBhIFhYIiwgIlhYIEIgWFgiCSAgICAgIH0sICAvKiAjMiAqLwoJLypleHBlY3QqLyB7IDAsMCwtMSwJCQkgICAgICB9LAogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAiWFggQiBYWCIsICJYWCBhIFhYIgkgICAgICB9LCAgLyogIzMgKi8KCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKICAgICAgfSwKICAgICAgewoJLyogPFdBSVZFUj4gKi8KCS8qaW5wdXQuKi8geyAiQiIsCSJhIgkJICAgICAgfSwgIC8qICM0ICovCiNpZmRlZiBTSE9KSV9JU19SSUdIVAoJLypleHBlY3QqLyB7IDAsMCwtMSwJCQkgICAgICB9LAojZWxzZQoJCSAgIC8qIFhYWCBXZSBhcmUgbm90IHRlc3RpbmcgdGhlIEMgbG9jYWxlLiAgKi8KCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKI2VuZGlmCiAgICAgIH0sCiAgICAgIHsKCS8qIDxXQUlWRVI+ICovCgkvKmlucHV0LiovIHsgImEiLAkiQiIJCSAgICAgIH0sICAvKiAjNSAqLwojaWZkZWYgU0hPSklfSVNfUklHSFQKCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKI2Vsc2UKCQkgICAvKiBYWFggV2UgYXJlIG5vdCB0ZXN0aW5nIHRoZSBDIGxvY2FsZS4gICovCgkvKmV4cGVjdCovIHsgMCwwLC0xLAkJCSAgICAgIH0sCiNlbmRpZgogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAiYiIsCSJBIgkJICAgICAgfSwgIC8qICM2ICovCgkvKmV4cGVjdCovIHsgMCwwLCsxLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJBIiwJImIiCQkgICAgICB9LCAgLyogIzcgKi8KCS8qZXhwZWN0Ki8geyAwLDAsLTEsCQkJICAgICAgfSwKICAgICAgfSwKI2lmZGVmIE5PX1dBSVZFUgogICAgICAvKiBYWFggSSBkbyBub3QgeWV0IGtub3cgd2hldGhlciBzdHJjb2xsIHJlYWxseSBzaG91bGQgcmVqZWN0CgkgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHJhbmdlLiAgKi8KICAgICAgewoJLyogIzggKi8gIC8qIDxXQUlWRVI+ICovCgkvKmlucHV0LiovIHsgIlwyNDRcMjQyXDI0NFwyNDRcMjQ0XDI0NlwyNDRcMjUwXDI0NFwyNTIiLCAiQUJDREVGRyIgfSwKCS8qZXhwZWN0Ki8geyBFSU5WQUwsMCwwLAkJICAgICAgfSwKICAgICAgfSwKICAgICAgewoJLyogIzkgKi8gIC8qIDxXQUlWRVI+ICovCgkvKmlucHV0LiovIHsgIkFCQ1pFRkciLCAiXDI0NFwyNDJcMjQ0XDI0NFwyNDRcMjQ2XDI0NFwyNTBcMjQ0XDI1MiIgfSwKCS8qZXhwZWN0Ki8geyBFSU5WQUwsMCwwLAkJICAgICAgfSwKICAgICAgfSwKI2VuZGlmCiAgICAgIHsgLmlzX2xhc3QgPSAxIH0gLyogTGFzdCBlbGVtZW50LiAgKi8KICAgIH0KICB9LAogIHsKICAgIHsgVHN0cmNvbGwsIFRTVF9MT0NfZXVjSlAgfSwKICAgIHsKICAgICAgeyAvKmlucHV0LiovIHsgIlwyNDRcMjQyXDI0NFwyNDRcMjQ0XDI0NlwyNDRcMjUwXDI0NFwyNTIiLAoJCSAgICAgIlwyNDRcMjQyXDI0NFwyNDRcMjQ0XDI0NlwyNDRcMjUwXDI0NFwyNTIiIH0sICAvKiAjMSAqLwoJLypleHBlY3QqLyB7IDAsMSwwLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJcMjQ0XDI0MlwyNDRcMjQ0XDI0NFwyNDZcMjQ0XDI1MFwyNDRcMjUyIiwKCQkgICAgICJcMjQ0XDI0MlwyNDRcMjQ0XDI0NFwzNjNcMjQ0XDI1MFwyNDRcMjUyIiB9LCAgLyogIzIgKi8KCS8qZXhwZWN0Ki8geyAwLDAsLTEsCQkJICAgICAgfSwKICAgICAgfSwKICAgICAgeyAvKmlucHV0LiovIHsgIlwyNDRcMjQyXDI0NFwyNDRcMjQ0XDM2M1wyNDRcMjUwXDI0NFwyNTIiLAoJCSAgICAgIlwyNDRcMjQyXDI0NFwyNDRcMjQ0XDI0NlwyNDRcMjUwXDI0NFwyNTIiIH0sICAvKiAjMyAqLwoJLypleHBlY3QqLyB7IDAsMCwrMSwJCQkgICAgICB9LAogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAiQiIsCSJhIgkJICAgICAgfSwgIC8qICM0ICovCgkvKmV4cGVjdCovIHsgMCwwLC0xLAkJCSAgICAgIH0sCiAgICAgIH0sCiAgICAgIHsgLyppbnB1dC4qLyB7ICJhIiwJIkIiCQkgICAgICB9LCAgLyogIzUgKi8KCS8qZXhwZWN0Ki8geyAwLDAsKzEsCQkJICAgICAgfSwKICAgICAgfSwKICAgICAgeyAvKmlucHV0LiovIHsgImIiLAkiQSIJCSAgICAgIH0sICAvKiAjNiAqLwoJLypleHBlY3QqLyB7IDAsMCwrMSwJCQkgICAgICB9LAogICAgICB9LAogICAgICB7IC8qaW5wdXQuKi8geyAiQSIsCSJiIgkJICAgICAgfSwgIC8qICM3ICovCgkvKmV4cGVjdCovIHsgMCwwLC0xLAkJCSAgICAgIH0sCiAgICAgIH0sCiNpZmRlZiBOT19XQUlWRVIKICAgICAgLyogWFhYIEkgZG8gbm90IHlldCBrbm93IHdoZXRoZXIgc3RyY29sbCByZWFsbHkgc2hvdWxkIHJlamVjdAoJIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgbXVsdGlieXRlIGNoYXJhY3RlciByYW5nZS4gICovCiAgICAgIHsKCS8qIDxXQUlWRVI+ICovCgkvKmlucHV0LiovIHsgIlwyMDBcMjE2XDIxNyIsICJBQkNERUZHIgkgICAgICB9LCAgLyogIzggKi8KCS8qZXhwZWN0Ki8geyBFSU5WQUwsMCwwLAkJICAgICAgfSwKICAgICAgfSwKICAgICAgewoJLyogPFdBSVZFUj4gKi8KCS8qaW5wdXQuKi8geyAiQUJDWkVGRyIsICJcMjAwXDIxNlwyMTciCSAgICAgIH0sICAvKiAjOSAqLwoJLypleHBlY3QqLyB7IEVJTlZBTCwwLDAsCQkgICAgICB9LAogICAgICB9LAojZW5kaWYKICAgICAgeyAuaXNfbGFzdCA9IDEgfSAvKiBMYXN0IGVsZW1lbnQuICAqLwogICAgfQogIH0sCiAgewogICAgeyBUc3RyY29sbCwgVFNUX0xPQ19lbmQgfQogIH0KfTsK