ZGlmZiAtLWdpdCBhL3NyYy9oYW5ndWxpbi5jIGIvc3JjL2hhbmd1bGluLmMKaW5kZXggMzM3ZWE4NC4uMTcxNDJkYSAxMDA2NDQKLS0tIGEvc3JjL2hhbmd1bGluLmMKKysrIGIvc3JjL2hhbmd1bGluLmMKQEAgLTIwLDkgKzIwLDkgQEAKICNkZWZpbmUgQVVUT01BVEFfRVJST1IJCTQKICNkZWZpbmUgQVVUT01BVEFfTlVMTAkJNQogCi0jZGVmaW5lIEZfRgkweDEJLyogw8q8uiAoaW5pdGlhbCBzb3VuZCkgKi8KLSNkZWZpbmUgRl9NCTB4MgkvKiDB37y6IChtZWRpYWwgdm93ZWwpICovCi0jZGVmaW5lIEZfTAkweDQJLyogwb68uiAoZmluYWwgY29uc29uYW50KSAqLworI2RlZmluZSBGX0YJMHgxCS8qIOy0iOyEsSAoaW5pdGlhbCBzb3VuZCkgKi8KKyNkZWZpbmUgRl9NCTB4MgkvKiDspJHshLEgKG1lZGlhbCB2b3dlbCkgKi8KKyNkZWZpbmUgRl9MCTB4NAkvKiDsooXshLEgKGZpbmFsIGNvbnNvbmFudCkgKi8KICNkZWZpbmUgRl9BCTB4OAkvKiBBU0NJSSAqLwogI2RlZmluZSBGX05VTEwgMQogI2RlZmluZSBNX05VTEwgMgpAQCAtNDYsMTAgKzQ2LDEwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqIDMgufq9xMDaxsfAuyDAp8fRILfnxr4gIChSb3V0aW5lcyBmb3IgMyBidWxzaWsga2V5Ym9hcmQpICoqKioqKi8KKy8qKioqKiogMyDrsozsi53snpDtjJDsnYQg7JyE7ZWcIOujqO2LtCAgKFJvdXRpbmVzIGZvciAzIGJ1bHNpayBrZXlib2FyZCkgKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIDMgufq9xL+hvK0gwNrGxyC6r8ivICgzIGJ1bHNpayBrZXlib2FyZCBjb252ZXJzaW9uKSAqLworLyogMyDrsozsi53sl5DshJwg7J6Q7YyQIOuzgO2ZmCAoMyBidWxzaWsga2V5Ym9hcmQgY29udmVyc2lvbikgKi8KIAogc3RhdGljIGNoYXJfdSB2YWx1ZV90YWJsZV9mb3JfM1tdID0KIHsKQEAgLTg5LDcgKzg5LDcgQEAKICAgICBGX0YsIEZfTSwgRl9MLCBGX0wsIEZfRiwgRl9MLAkvKiB1IHYgdyB4IHkgeiAqLwogfTsKIAotLyogMyC5+r3Ev6G8rSAox/bA58PKvLosIMDUt8K/tbmuKSAtPiC6ucfVw8q8uiDDs7iuCisvKiAzIOuyjOyLneyXkOyEnCAo7ZiE7J6s7LSI7ISxLCDsnoXroKXsmIHrrLgpIC0+IOuzte2Vqey0iOyEsSDsspjrpqwKICAqIDMgYnVsc2lrOiAoY3VycmVudCBpbml0aWFsIHNvdW5kLCBpbnB1dCBlbmdsaXNoKSAtPiBjb21wb3VuZCBpbml0aWFsIHNvdW5kLgogICovCiAKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIHJldHVybiAwOwogfQogCi0vKiAzILn6vcS/obytICjH9sDnuPDAvSwgwNS3wiC/tbmuKSAtPiC6ucfVILjwwL0gw7O4rgorLyogMyDrsozsi53sl5DshJwgKO2YhOyerOuqqOydjCwg7J6F66ClIOyYgeusuCkgLT4g67O17ZWpIOuqqOydjCDsspjrpqwKICAqIDMgYnVsc2lrOiAoY3VycmVudCB2b3dlbCwgaW5wdXQgZW5nbGlzaCkgLT4gY29tcG91bmQgdm93ZWwuCiAgKi8KIApAQCAtMTE4LDM0ICsxMTgsMzQgQEAKIHsKICAgICBzd2l0Y2ggKHYpCiAgICAgewotCWNhc2UgMTM6CQkJCQkvKiCkxyAqLworCWNhc2UgMTM6CQkJCQkvKiDjhZcgKi8KIAkgICAgc3dpdGNoIChjKSB7Ci0JCWNhc2UgMzoJCQkJCS8qIKTHpL8gKi8KKwkJY2FzZSAzOgkJCQkJLyog44WX44WPICovCiAJCSAgICByZXR1cm4gMTQ7Ci0JCWNhc2UgNDoJCQkJCS8qIKTHpMAgKi8KKwkJY2FzZSA0OgkJCQkJLyog44WX44WQICovCiAJCSAgICByZXR1cm4gMTU7Ci0JCWNhc2UgMjk6CQkJCS8qIKTHpNMgKi8KKwkJY2FzZSAyOToJCQkJLyog44WX44WjICovCiAJCSAgICByZXR1cm4gMTg7CiAJICAgIH0KIAkgICAgYnJlYWs7CiAKLQljYXNlIDIwOgkJCQkJLyogpMwgKi8KKwljYXNlIDIwOgkJCQkJLyog44WcICovCiAJICAgIHN3aXRjaCAoYykgewotCQljYXNlIDc6CQkJCQkvKiCkzKTDICovCisJCWNhc2UgNzoJCQkJCS8qIOOFnOOFkyAqLwogCQkgICAgcmV0dXJuIDIxOwotCQljYXNlIDEwOgkJCQkvKiCkzKTEICovCisJCWNhc2UgMTA6CQkJCS8qIOOFnOOFlCAqLwogCQkgICAgcmV0dXJuIDIyOwotCQljYXNlIDI5OgkJCQkvKiCkzKTTICovCisJCWNhc2UgMjk6CQkJCS8qIOOFnOOFoyAqLwogCQkgICAgcmV0dXJuIDIzOwogCSAgICB9CiAJICAgIGJyZWFrOwogCi0JICAgIC8qIDMgufq9xCDA2sbHwLogpNGk0yCwoSDA1sC4uce3ziAuLi4gKi8KKwkgICAgLyogMyDrsozsi50g7J6Q7YyQ7J2AIOOFoeOFoyDqsIAg7J6I7Jy866+A66GcIC4uLiAqLwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotLyogMyC5+r3Ev6G8rSAox/bA5yC53sSnLCC/tbmuwNogwNS3wikgLT4gud7EpworLyogMyDrsozsi53sl5DshJwgKO2YhOyerCDrsJvsuagsIOyYgeusuOyekCDsnoXroKUpIC0+IOuwm+y5qAogICogMyBidWxzaWs6IChjdXJyZW50IHByb3AoPyksIGlucHV0IGVuZ2xpc2gpIC0+IHByb3AoPykuCiAgKiBJIHdhbnQgdG8gc2F5LCB0aGUgJ3Byb3AnIGlzIHNpbWlsYXIgdG8gJ2ZpbmFsIGNvbnNvbmFudCcsIGJ1dCBub3Qgdm93ZWwuCiAgKiAoSSBjYW5ub3QgZmluZCB0aGUgcmVhbCBlbmdsaXNoIGZyb20gbXkgZGljdGlvbmFyeS4gU29ycnkhKQpAQCAtMTU3LDQ2ICsxNTcsNDYgQEAKIHsKICAgICBzd2l0Y2ggKGspCiAgICAgewotCWNhc2UgMjoJCQkJCQkvKiCkoSAqLworCWNhc2UgMjoJCQkJCQkvKiDjhLEgKi8KIAkgICAgc3dpdGNoIChjKSB7CiAJCWNhc2UgMjoKLQkJICAgIHJldHVybiAzOwkJCQkvKiCkoaShICovCisJCSAgICByZXR1cm4gMzsJCQkJLyog44Sx44SxICovCiAJCWNhc2UgMjE6Ci0JCSAgICByZXR1cm4gNDsJCQkJLyogpKGktSAqLworCQkgICAgcmV0dXJuIDQ7CQkJCS8qIOOEseOFhSAqLwogCSAgICB9CiAJICAgIGJyZWFrOwogCi0JY2FzZSA1OgkJCQkJCS8qIKSkICovCisJY2FzZSA1OgkJCQkJCS8qIOOEtCAqLwogCSAgICBzd2l0Y2ggKGMpIHsKLQkJY2FzZSAyNDoJCQkJLyogpKSkuCAqLworCQljYXNlIDI0OgkJCQkvKiDjhLTjhYggKi8KIAkJICAgIHJldHVybiA2OwogCQljYXNlIDI5OgotCQkgICAgcmV0dXJuIDc7CQkJCS8qIKSkpL4gKi8KKwkJICAgIHJldHVybiA3OwkJCQkvKiDjhLTjhY4gKi8KIAkgICAgfQogCSAgICBicmVhazsKIAotCWNhc2UgOToJCQkJCQkvKiCkqSAqLworCWNhc2UgOToJCQkJCQkvKiDjhLkgKi8KIAkgICAgc3dpdGNoIChjKSB7Ci0JCWNhc2UgMjoJCQkJCS8qIKSppKEgKi8KKwkJY2FzZSAyOgkJCQkJLyog44S544SxICovCiAJCSAgICByZXR1cm4gMTA7Ci0JCWNhc2UgMTc6CQkJCS8qIKSppLEgKi8KKwkJY2FzZSAxNzoJCQkJLyog44S544WBICovCiAJCSAgICByZXR1cm4gMTE7Ci0JCWNhc2UgMTk6CQkJCS8qIKSppLIgKi8KKwkJY2FzZSAxOToJCQkJLyog44S544WCICovCiAJCSAgICByZXR1cm4gMTI7Ci0JCWNhc2UgMjE6CQkJCS8qIKSppLUgKi8KKwkJY2FzZSAyMToJCQkJLyog44S544WFICovCiAJCSAgICByZXR1cm4gMTM7Ci0JCWNhc2UgMjc6CQkJCS8qIKSppLwgKi8KKwkJY2FzZSAyNzoJCQkJLyog44S544WMICovCiAJCSAgICByZXR1cm4gMTQ7Ci0JCWNhc2UgMjg6CQkJCS8qIKSppL0gKi8KKwkJY2FzZSAyODoJCQkJLyog44S544WNICovCiAJCSAgICByZXR1cm4gMTU7Ci0JCWNhc2UgMjk6CQkJCS8qIKSppL4gKi8KKwkJY2FzZSAyOToJCQkJLyog44S544WOICovCiAJCSAgICByZXR1cm4gMTY7CiAJICAgIH0KIAkgICAgYnJlYWs7CiAKIAljYXNlIDE5OgogCSAgICBzd2l0Y2ggKGMpIHsKLQkJY2FzZSAyMToJCQkJLyogpLKktSAqLworCQljYXNlIDIxOgkJCQkvKiDjhYLjhYUgKi8KIAkJICAgIHJldHVybiAyMDsKIAkgICAgfQogCSAgICBicmVhazsKQEAgLTIwNSw3ICsyMDUsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKiogMiC5+r3EwNrGx8C7IMCnx9Egt+fGviAgKFJvdXRpbmVzIGZvciAyIGJ1bHNpayBrZXlib2FyZCkgKioqKioqLworLyoqKioqKiAyIOuyjOyLneyekO2MkOydhCDsnITtlZwg66Oo7Yu0ICAoUm91dGluZXMgZm9yIDIgYnVsc2lrIGtleWJvYXJkKSAqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAgIHN0YXRpYyBpbnQKQEAgLTIyNyw5ICsyMjcsOSBAQAogICAgIHJldHVybiB0YWJsZVtjXTsKIH0KIAotLyogMiC5+r3Ev6G8rSC/tbmuwNogLT4gwbbH1cf8IMPKvLoguq/IrworLyogMiDrsozsi53sl5DshJwg7JiB66y47J6QIC0+IOyhsO2Vqe2YlSDstIjshLEg67OA7ZmYCiAgKiAoMiBidWxzaWs6IGNvbnZlcnNpb24gZW5nbGlzaCBjaGFyLiB0byBpbml0aWFsIHNvdW5kIG9mIGNvbXBvdW5kIHR5cGUpCi0gKiCw4bD6OiDDyry6wMwgvsa0z7jpIDAgKElmIGl0IGlzIG5vdCBpbml0aWFsIHNvdW5kLCByZXR1cm4gMCkuCisgKiDqsrDqs7w6IOy0iOyEseydtCDslYTri4jrqbQgMCAoSWYgaXQgaXMgbm90IGluaXRpYWwgc291bmQsIHJldHVybiAwKS4KICAqLwogICAgIHN0YXRpYyBpbnQKIGZjb24oaW50IGMpCkBAIC0yNTEsOSArMjUxLDkgQEAKICAgICByZXR1cm4gdGFibGVbYyAtICdFJ107CiB9CiAKLS8qIDIgufq9xL+hvK0gv7W5rsDaIC0+IMHfvLoguq/IrworLyogMiDrsozsi53sl5DshJwg7JiB66y47J6QIC0+IOykkeyEsSDrs4DtmZgKICAqICgyIGJ1bHNpazogY29udmVyc2lvbiBlbmdsaXNoIGNoYXIuIHRvIG1lZGlhbCB2b3dlbCkKLSAqILDhsPo6IMHfvLrAzCC+xrTPuOkgMCAoSWYgaXQgaXMgbm90IG1lZGlhbCB2b3dlbCwgcmV0dXJuIDApLgorICog6rKw6rO8OiDspJHshLHsnbQg7JWE64uI66m0IDAgKElmIGl0IGlzIG5vdCBtZWRpYWwgdm93ZWwsIHJldHVybiAwKS4KICAqLwogICAgIHN0YXRpYyBpbnQKIHZvdyhpbnQgYykKQEAgLTI3Myw5ICsyNzMsOSBAQAogICAgIHJldHVybiB0YWJsZVtjIC0gJ08nXTsKIH0KIAotLyogMrn6vcS/obytIL+1ua7A2iAtPiC53sSnILqvyK8KKy8qIDLrsozsi53sl5DshJwg7JiB66y47J6QIC0+IOuwm+y5qCDrs4DtmZgKICAqICgyIGJ1bHNpazogY29udmVyc2lvbiBlbmdsaXNoIGNoYXIuIHRvIHByb3ApCi0gKiCw4bD6OiC53sSnwMwgvsa0z7jpIDAgKElmIG5vdCBwcm9wLCByZXR1cm4gMCkKKyAqIOqysOqzvDog67Cb7Lmo7J20IOyVhOuLiOuptCAwIChJZiBub3QgcHJvcCwgcmV0dXJuIDApCiAgKi8KICAgICBzdGF0aWMgaW50CiBsY29uKGludCBjKQpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgcmV0dXJuIHRhYmxlW2MgLSAnUiddOwogfQogCi0vKiAyILn6vcS/obytICjH9sDnILnexKcsIL+1ua7A2iDA1LfCKSAtPiC53sSnILqvyK8KKy8qIDIg67KM7Iud7JeQ7IScICjtmITsnqwg67Cb7LmoLCDsmIHrrLjsnpAg7J6F66ClKSAtPiDrsJvsuagg67OA7ZmYCiAgKiAoMiBidWxzaWs6IGNvbnZlcnNpb24gKGN1cnIuIHByb3AsIGlucHV0IGVuZ2xpc2gpIHRvIHByb3ApCiAgKi8KIApAQCAtMzA0LDQ0ICszMDQsNDQgQEAKIHsKICAgICBzd2l0Y2ggKGspCiAgICAgewotCWNhc2UgMjoJCQkJCS8qIKShICovCisJY2FzZSAyOgkJCQkJLyog44SxICovCiAJICAgIHN3aXRjaCAoYykgewogCQljYXNlICd0JzoKLQkJICAgIHJldHVybiA0OwkJCS8qIKShpLUgKi8KKwkJICAgIHJldHVybiA0OwkJCS8qIOOEseOFhSAqLwogCSAgICB9CiAJICAgIGJyZWFrOwogCi0JY2FzZSA1OgkJCQkJLyogpKQgKi8KKwljYXNlIDU6CQkJCQkvKiDjhLQgKi8KIAkgICAgc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ3cnOgkJCS8qIKSkpLggKi8KKwkJY2FzZSAndyc6CQkJLyog44S044WIICovCiAJCSAgICByZXR1cm4gNjsKLQkJY2FzZSAnZyc6CQkJLyogpKSkviAqLworCQljYXNlICdnJzoJCQkvKiDjhLTjhY4gKi8KIAkJICAgIHJldHVybiA3OwogCSAgICB9CiAJICAgIGJyZWFrOwogCi0JY2FzZSA5OgkJCQkJLyogpKkgKi8KKwljYXNlIDk6CQkJCQkvKiDjhLkgKi8KIAkgICAgc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ3InOgkJCS8qIKSppKEgKi8KKwkJY2FzZSAncic6CQkJLyog44S544SxICovCiAJCSAgICByZXR1cm4gMTA7Ci0JCWNhc2UgJ2EnOgkJCS8qIKSppLEgKi8KKwkJY2FzZSAnYSc6CQkJLyog44S544WBICovCiAJCSAgICByZXR1cm4gMTE7Ci0JCWNhc2UgJ3EnOgkJCS8qIKSppLIgKi8KKwkJY2FzZSAncSc6CQkJLyog44S544WCICovCiAJCSAgICByZXR1cm4gMTI7Ci0JCWNhc2UgJ3QnOgkJCS8qIKSppLUgKi8KKwkJY2FzZSAndCc6CQkJLyog44S544WFICovCiAJCSAgICByZXR1cm4gMTM7Ci0JCWNhc2UgJ3gnOgkJCS8qIKSppLwgKi8KKwkJY2FzZSAneCc6CQkJLyog44S544WMICovCiAJCSAgICByZXR1cm4gMTQ7Ci0JCWNhc2UgJ3YnOgkJCS8qIKSppL0gKi8KKwkJY2FzZSAndic6CQkJLyog44S544WNICovCiAJCSAgICByZXR1cm4gMTU7Ci0JCWNhc2UgJ2cnOgkJCS8qIKSppL4gKi8KKwkJY2FzZSAnZyc6CQkJLyog44S544WOICovCiAJCSAgICByZXR1cm4gMTY7CiAJICAgIH0KIAkgICAgYnJlYWs7CiAKLQljYXNlIDE5OgkJCQkvKiCksiAqLworCWNhc2UgMTk6CQkJCS8qIOOFgiAqLwogCSAgICBzd2l0Y2ggKGMpIHsKLQkJY2FzZSAndCc6CQkJLyogpLKktSAqLworCQljYXNlICd0JzoJCQkvKiDjhYLjhYUgKi8KIAkJICAgIHJldHVybiAyMDsKIAkgICAgfQogCSAgICBicmVhazsKQEAgLTM0OSw3ICszNDksNyBAQAogICAgIHJldHVybiAwOwogfQogCi0vKiAyufq9xL+hvK0gKMf2wOcgwd+8uiwgv7W5riDA1LfCKSAtPiDB37y6ILqvyK8KKy8qIDLrsozsi53sl5DshJwgKO2YhOyerCDspJHshLEsIOyYgeusuCDsnoXroKUpIC0+IOykkeyEsSDrs4DtmZgKICAqICgyIGJ1bHNpazogY29udmVyc2lvbiAoY3Vyci4gbWVkaWFsIHZvd2VsLCBpbnB1dCBlbmdsaXNoKSB0byBtZWRpYWwKICAqIHZvd2VsKQogICovCkBAIC0zNTksMzEgKzM1OSwzMSBAQAogewogICAgIHN3aXRjaCAodikKICAgICB7Ci0JY2FzZSAxMzoJCQkJCS8qIKTHICovCisJY2FzZSAxMzoJCQkJCS8qIOOFlyAqLwogCSAgICBzd2l0Y2ggKGMpIHsKLQkJY2FzZSAnayc6CQkJCS8qIKTHpL8gKi8KKwkJY2FzZSAnayc6CQkJCS8qIOOFl+OFjyAqLwogCQkgICAgcmV0dXJuIDE0OwotCQljYXNlICdvJzoJCQkJLyogpMekwCAqLworCQljYXNlICdvJzoJCQkJLyog44WX44WQICovCiAJCSAgICByZXR1cm4gMTU7Ci0JCWNhc2UgJ2wnOgkJCQkvKiCkx6TTICovCisJCWNhc2UgJ2wnOgkJCQkvKiDjhZfjhaMgKi8KIAkJICAgIHJldHVybiAxODsKIAkgICAgfQogCSAgICBicmVhazsKIAotCWNhc2UgMjA6CQkJCQkvKiCkzCAqLworCWNhc2UgMjA6CQkJCQkvKiDjhZwgKi8KIAkgICAgc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ2onOgkJCQkvKiCkzKTDICovCisJCWNhc2UgJ2onOgkJCQkvKiDjhZzjhZMgKi8KIAkJICAgIHJldHVybiAyMTsKLQkJY2FzZSAncCc6CQkJCS8qIKTMpMQgKi8KKwkJY2FzZSAncCc6CQkJCS8qIOOFnOOFlCAqLwogCQkgICAgcmV0dXJuIDIyOwotCQljYXNlICdsJzoJCQkJLyogpMyk0yAqLworCQljYXNlICdsJzoJCQkJLyog44Wc44WjICovCiAJCSAgICByZXR1cm4gMjM7CiAJICAgIH0KIAkgICAgYnJlYWs7CiAKLQljYXNlIDI3OgkJCQkJLyogpNEgKi8KKwljYXNlIDI3OgkJCQkJLyog44WhICovCiAJICAgIHN3aXRjaCAoYykgewotCQljYXNlICdsJzoJCQkJLyogpNGk0yAqLworCQljYXNlICdsJzoJCQkJLyog44Wh44WjICovCiAJCSAgICByZXR1cm4gMjg7CiAJICAgIH0KIAkgICAgYnJlYWs7CkBAIC00NjUsNyArNDY1LDcgQEAKICAgICB0ID0gKmM7CiAgICAgc3dpdGNoIChraW5kX3RhYmxlX2Zvcl8yKHQpKQogICAgIHsKLQljYXNlIDA6IC8qIMDawL0gKGNvbnNvbmFudCkgKi8KKwljYXNlIDA6IC8qIOyekOydjCAoY29uc29uYW50KSAqLwogCSAgICBpZiAoZiA9PSBGX05VTEwpCiAJICAgIHsKIAkJaWYgKG0gIT0gTV9OVUxMKQpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJICAgIGlmIChsID09IExfTlVMTCkKIAkgICAgewogCQl0MiA9IGxjb24odCk7Ci0JCWlmICghdDIpICAgIC8qILnexKfAuLfOIMD7x9XHz8H2vsq02SAoY2Fubm90IHVzZSBpdCBhcyBhIHByb3ApICovCisJCWlmICghdDIpICAgIC8qIOuwm+y5qOycvOuhnCDsoIHtlantlZjsp4DslYrri6QgKGNhbm5vdCB1c2UgaXQgYXMgYSBwcm9wKSAqLwogCQl7CiAJCSAgICBoYW5ndWxfaW5wdXRfY2xlYXIoKTsKIAkJICAgIGxhc3RfbGwgPSBsYXN0X2wgPSAtMTsKQEAgLTQ5OCw3ICs0OTgsNyBAQAogCQkgICAgcHVzaChidWYpOwogCQkgICAgcmV0dXJuIEFVVE9NQVRBX0NPUlJFQ1Q7CiAJCX0KLQkJZWxzZQkvKiC53sSnwLi3ziC+srfBx8+/tMC4s6ogY29kZb+hIL74tMIgsdvA2sDMtNkgKi8KKwkJZWxzZQkvKiDrsJvsuajsnLzroZwg7JOw66Ck7ZWY7JiA7Jy864KYIGNvZGXsl5Ag7JeG64qUIOq4gOyekOydtOuLpCAqLwogCQl7CS8qIGNhbm5vdCBmaW5kIHN1Y2ggYSBwcm9wIGluIHRoZSBjb2RlIHRhYmxlICovCiAJCSAgICBsYXN0X2xsID0gbGFzdF9sID0gLTE7CiAJCSAgICBoYW5ndWxfaW5wdXRfY2xlYXIoKTsKQEAgLTUwOCw3ICs1MDgsNyBAQAogCQkgICAgcmV0dXJuIEFVVE9NQVRBX05FVzsKIAkJfQogCSAgICB9Ci0JICAgIC8qIMPKIMHfIMG+vLrAzCC48LXOILCuw9++7sGuIMDWtNkKKwkgICAgLyog7LSIIOykkSDsooXshLHsnbQg66qo65GQIOqwluy2lOyWtOyguCDsnojri6QKIAkgICAgICogSSBoYXZlIGFsbCB0aGUgJ2luaXRpYWwgc291bmQnIGFuZCAnbWVkaWFsIHZvd2VsJyBhbmQgJ2ZpbmFsCiAJICAgICAqIGNvbnNvbmFudCcuCiAJICAgICAqLwpAQCAtNTczLDcgKzU3Myw3IEBACiAJICAgIHNwID0gMDsKIAkgICAgaWYgKGxhc3RfbCA9PSAtMSkKIAkgICAgewotCQkvKiDAvS4uLiDAzLDUIMfKv+THz7OqPz8gKEhtbS4uLiBJcyBpdCBuZWVkZWQ/KSAqLworCQkvKiDsnYwuLi4g7J206rKMIO2VhOyalO2VmOuCmD8/IChIbW0uLi4gSXMgaXQgbmVlZGVkPykgKi8KIAkJY29udmVydF9rc190b18zKGJ1ZiwgJmYsICZtLCAmbCk7CiAJICAgIH0KIAkgICAgZWxzZQpAQCAtNjA3LDEwICs2MDcsMTAgQEAKIAl0ID0gdmFsdWVfdGFibGVfZm9yXzNbKmNdOwogCXN3aXRjaCAoa2luZF90YWJsZV9mb3JfM1sqY10pCiAJewotCSAgICBjYXNlIEZfRjogLyogw8q8urmuwNogKGNoYXIuIG9mIGFuIGluaXRpYWwgc291bmQpICovCisJICAgIGNhc2UgRl9GOiAvKiDstIjshLHrrLjsnpAgKGNoYXIuIG9mIGFuIGluaXRpYWwgc291bmQpICovCiAJCWlmIChtICE9IE1fTlVMTCB8fCBzcCA9PSAwKQogCQl7Ci0JCSAgICAvKiDDyry6wMwguvG++rDFs6ogtNnAvSCx28DaILjwwLix4iC9w8DbCisJCSAgICAvKiDstIjshLHsnbQg67mE7JeI6rGw64KYIOuLpOydjCDquIDsnpAg66qo7Jy86riwIOyLnOyekQogCQkgICAgICogRW1wdHkgJ2luaXRpYWwgc291bmQnLCBzbyBzdGFydGluZyBhdXRvbWF0YS4KIAkJICAgICAqLwogCQkgICAgaGFuZ3VsX2lucHV0X2NsZWFyKCk7CkBAIC02MTksNyArNjE5LDcgQEAKIAkJICAgIHB1c2goYnVmKTsKIAkJICAgIHJldHVybiBBVVRPTUFUQV9ORVc7CiAJCX0KLQkJaWYgKCh0MiA9IGNvbWZjb24zKGYsdCkpICE9IDApCS8qILq5wNrAvSAoZG91YmxlPyBjb25zb25hbnQpICovCisJCWlmICgodDIgPSBjb21mY29uMyhmLHQpKSAhPSAwKQkvKiDrs7XsnpDsnYwgKGRvdWJsZT8gY29uc29uYW50KSAqLwogCQl7CiAJCSAgICBmPXQyOwogCQkgICAgY29udmVydF8zX3RvX2NvZGUoZiwgTV9OVUxMLCBMX05VTEwsIGJ1Zik7CkBAIC02MjgsNyArNjI4LDcgQEAKIAkJfQogCQlyZXR1cm4gQVVUT01BVEFfRVJST1I7CiAKLQkgICAgY2FzZSBGX006CS8qILjwwL0gKHZvd2VsKSAqLworCSAgICBjYXNlIEZfTToJLyog66qo7J2MICh2b3dlbCkgKi8KIAkJaWYgKG0gPT0gTV9OVUxMKQogCQl7CiAJCSAgICBpZiAoMiAhPSBjb252ZXJ0XzNfdG9fY29kZShmLCB0LCBMX05VTEwsYnVmKSkKQEAgLTY0MSw3ICs2NDEsNyBAQAogCQkgICAgZWxzZQogCQkJcmV0dXJuIEFVVE9NQVRBX0NPUlJFQ1Q7CiAJCX0KLQkJaWYgKCh0MiA9IGNvbXZvdzMobSx0KSkpICAgIC8qILq5uPDAvSAoYSBkaXBodGhvbmcpICovCisJCWlmICgodDIgPSBjb212b3czKG0sdCkpKSAgICAvKiDrs7XrqqjsnYwgKGEgZGlwaHRob25nKSAqLwogCQl7CiAJCSAgICBtID0gdDI7CiAJCSAgICBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCBMX05VTEwsIGJ1Zik7CkBAIC02NTAsOSArNjUwLDkgQEAKIAkJfQogCQlyZXR1cm4gQVVUT01BVEFfRVJST1I7CiAKLQkgICAgY2FzZSBGX0w6CS8qILnexKcgKHByb3A/KSAqLworCSAgICBjYXNlIEZfTDoJLyog67Cb7LmoIChwcm9wPykgKi8KIAkJaWYgKG0gPT0gTV9OVUxMKQotCQkgICAgcmV0dXJuIEFVVE9NQVRBX0VSUk9SOyAvKiDB37y6vvi0wiDBvry6ICovCisJCSAgICByZXR1cm4gQVVUT01BVEFfRVJST1I7IC8qIOykkeyEseyXhuuKlCDsooXshLEgKi8KIAkJaWYgKGwgPT0gTF9OVUxMKQogCQl7CiAJCSAgICBpZiAoMiAhPSBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCB0LCBidWYpKQpAQCAtNjY0LDcgKzY2NCw3IEBACiAJCSAgICBsID0gdDsKIAkJICAgIHJldHVybiBBVVRPTUFUQV9DT1JSRUNUOwogCQl9Ci0JCWlmICgodDIgPSBjb21jb24zKGwsdCkpICE9IDApCS8qILq5ILnexKcgPz8gKGRvdWJsZSBwcm9wPykgKi8KKwkJaWYgKCh0MiA9IGNvbWNvbjMobCx0KSkgIT0gMCkJLyog67O1IOuwm+y5qCA/PyAoZG91YmxlIHByb3A/KSAqLwogCQl7CiAJCSAgICBpZiAoMiAhPSBjb252ZXJ0XzNfdG9fY29kZShmLCBtLCB0MiwgYnVmKSkKIAkJCXJldHVybiBBVVRPTUFUQV9FUlJPUjsKQEAgLTY3NSw3ICs2NzUsNyBAQAogCQl9CiAJCXJldHVybiBBVVRPTUFUQV9FUlJPUjsKIAotCSAgICBjYXNlIEZfQTogLyogxq+89rmuwNqzqiC8/cDaIChzcGVjaWFsIGNoYXIuIG9yIG51bWJlcikgKi8KKwkgICAgY2FzZSBGX0E6IC8qIO2KueyImOusuOyekOuCmCDsiKvsnpAgKHNwZWNpYWwgY2hhci4gb3IgbnVtYmVyKSAqLwogCQloYW5ndWxfaW5wdXRfY2xlYXIoKTsKIAkJKmMgPSB0OwogCQlyZXR1cm4gQVVUT01BVEFfU1BFQ0lBTDsKQEAgLTE0MzcsNDggKzE0MzcsNDggQEAKICAgICB7MHhhNGJkLCAxOSwgIDIsICAxfSwgIHsweGE0YmUsIDIwLCAgMiwgIDF9LAogfTsKIAotLyogwbbH1cf8IMPKvLogLSC/z7y6x/wgs7nA2iC6r8ivCisvKiDsobDtlantmJUg7LSI7ISxIC0g7JmE7ISx7ZiVIOuCseyekCDrs4DtmZgKICAqIGNvbnZlcnNpb246IGluaXRpYWwgc291bmQgb2YgY29tcG91bmQgdHlwZSAtID8/PyBvZiBjb21wbGV0aW9uIHR5cGUKICAqLwogCiBzdGF0aWMgY29uc3QgY2hhcl91IGpvaGFiX2Zjb25fdG9fd2FuW10gPQogewogICAgIDAsCi0gICAgMHhkNCwgMHhhMSwgMHhhMiwgMHhhNCwgMHhhNywgICAgLyogKMOkv/IpLKShLKSiLKSkLKSnICovCi0gICAgMHhhOCwgMHhhOSwgMHhiMSwgMHhiMiwgMHhiMywgICAgLyogpKgspKkspLEspLIspLMgKi8KLSAgICAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAgICAvKiCktSyktiyktyykuCykuSAqLwotICAgIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUgICAgIC8qIKS6LKS7LKS8LKS9LKS+ICovCisgICAgMHhkNCwgMHhhMSwgMHhhMiwgMHhhNCwgMHhhNywgICAgLyogKOyxhOybgCks44SxLOOEsizjhLQs44S3ICovCisgICAgMHhhOCwgMHhhOSwgMHhiMSwgMHhiMiwgMHhiMywgICAgLyog44S4LOOEuSzjhYEs44WCLOOFgyAqLworICAgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksICAgIC8qIOOFhSzjhYYs44WHLOOFiCzjhYkgKi8KKyAgICAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlICAgICAvKiDjhYos44WLLOOFjCzjhY0s44WOICovCiB9OwogCi0vKiDBtsfVx/wgwd+8uiAtPiC/z7y6x/wgs7nA2iC6r8ivCisvKiDsobDtlantmJUg7KSR7ISxIC0+IOyZhOyEse2YlSDrgrHsnpAg67OA7ZmYCiAgKiBjb252ZXJzaW9uOiBtZWRpYWwgdm93ZWwgb2YgY29tcG91bmQgdHlwZSAtID8/PyBvZiBjb21wbGV0aW9uIHR5cGUKICAqLwogCiBzdGF0aWMgY29uc3QgY2hhcl91IGpvaGFiX3Zvd190b193YW5bXSA9CiB7CiAgICAgMCwgMCwKLSAgICAweGQ0LCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLAkvKiAow6S/8ikspL8spMAspMEspMIspMMgKi8KKyAgICAweGQ0LCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLAkvKiAo7LGE7JuAKSzjhY8s44WQLOOFkSzjhZIs44WTICovCiAgICAgMCwgMCwKLSAgICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAvKiCkxCykxSykxiykxyykx6S/LKTHpMAgKi8KKyAgICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAvKiDjhZQs44WVLOOFlizjhZcs44WX44WPLOOFl+OFkCAqLwogICAgIDAsIDAsCi0gICAgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogpMek0yykyyykzCykzKTDLKTMpMQspMyk0yAqLworICAgIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIOOFl+OFoyzjhZss44WcLOOFnOOFkyzjhZzjhZQs44Wc44WjICovCiAgICAgMCwgMCwKLSAgICAweGQwLCAweGQxLCAweGQyLCAweGQzCSAgICAgLyogpNAspNEspNGk0yyk0yAqLworICAgIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMJICAgICAvKiDjhaAs44WhLOOFoeOFoyzjhaMgKi8KIH07CiAKLS8qIMG2x9XH/CDBvry6IC0+IL/PvLrH/CCzucDaILqvyK8KKy8qIOyhsO2Vqe2YlSDsooXshLEgLT4g7JmE7ISx7ZiVIOuCseyekCDrs4DtmZgKICAqIGNvbnZlcnNpb246IGZpbmFsIGNvbnNvbmFudCBvZiBjb21wb3VuZCB0eXBlIC0gPz8/IG9mIGNvbXBsZXRpb24gdHlwZQogICovCiAKIHN0YXRpYyBjb25zdCBjaGFyX3Ugam9oYWJfbGNvbl90b193YW5bXSA9CiB7CiAgICAgMCwKLSAgICAweGQ0LCAweGExLCAweGEyLCAweGEzLCAweGE0LCAgICAvKiAow6S/8iksIKShLCCkoiwgpKGktSwgpKQgKi8KLSAgICAweGE1LCAweGE2LCAweGE3LCAweGE5LCAweGFhLCAgICAvKiCkpKS4LCCkpKS+LCCkpywgpKksIKSppKEgKi8KLSAgICAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAgICAvKiCkqaSxLCCkqaSyLCCkqaS1LCCkqaS8LCCkqaS9ICovCi0gICAgMHhiMCwgMHhiMSwgMCwgICAgMHhiMiwgMHhiNCwgICAgLyogpKmkviwgpLEsIDAsIKSyLCCksqS1ICovCi0gICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiYSwgICAgLyogpLUsIKS2LCCktywgpLgsIKS6ICovCi0gICAgMHhiYiwgMHhiYywgMHhiZCwgMHhiZQkgICAgIC8qIKS7LCCkvCwgpL0sIKS+ICovCisgICAgMHhkNCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgICAgLyogKOyxhOybgCksIOOEsSwg44SyLCDjhLHjhYUsIOOEtCAqLworICAgIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTksIDB4YWEsICAgIC8qIOOEtOOFiCwg44S044WOLCDjhLcsIOOEuSwg44S544SxICovCisgICAgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgICAgLyog44S544WBLCDjhLnjhYIsIOOEueOFhSwg44S544WMLCDjhLnjhY0gKi8KKyAgICAweGIwLCAweGIxLCAwLCAgICAweGIyLCAweGI0LCAgICAvKiDjhLnjhY4sIOOFgSwgMCwg44WCLCDjhYLjhYUgKi8KKyAgICAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGJhLCAgICAvKiDjhYUsIOOFhiwg44WHLCDjhYgsIOOFiiAqLworICAgIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUJICAgICAvKiDjhYssIOOFjCwg44WNLCDjhY4gKi8KIH07CiAKICAgICBzdGF0aWMgdm9pZApAQCAtMTUxMSw3ICsxNTExLDcgQEAKIAkJKmxwID0ga3NfdGFibGUyW2ldWzNdOwogCQlyZXR1cm47CiAJICAgIH0KLQkqZnAgPSAweGZmOwkvKiCx17ehx8ggxNq15SAoZ3JhcGhpYyBjb2RlKSAqLworCSpmcCA9IDB4ZmY7CS8qIOq3uOuemO2UvSDsvZTrk5wgKGdyYXBoaWMgY29kZSkgKi8KIAkqbXAgPSBoOwogCSpscCA9IGxvdzsKICAgICB9CkBAIC0xNTg0LDEzICsxNTg0LDEzIEBACiAJcmV0dXJuIDI7CQkvKiBmb3VuZCAqLwogICAgIH0KIAotICAgIC8qIL/PvLrH/CDHpb+hIL74tNkuIGBgS1MgQyA1NjAxIC0gMTk5MiDBpLq4ILGzyK+/6yC6zsijIMfYvLMnJwotICAgICAqIDMuMyDA/b+hILyzuO21yCC55rn9wLi3ziBlbmNvZGluZyDH0bTZLgorICAgIC8qIOyZhOyEse2YlSDtkZzsl5Ag7JeG64ukLiBgYEtTIEMgNTYwMSAtIDE5OTIg7KCV67O0IOq1kO2ZmOyaqSDrtoDtmLgg7ZW07ISkJycKKyAgICAgKiAzLjMg7KCI7JeQIOyEpOuqheuQnCDrsKnrspXsnLzroZwgZW5jb2Rpbmcg7ZWc64ukLgogICAgICAqLwogCi0gICAgKmRlcysrID0gMHhhNDsJCSAgICAgLyogw6S/8iAqLworICAgICpkZXMrKyA9IDB4YTQ7CQkgICAgIC8qIOyxhOybgCAqLwogICAgICpkZXMrKyA9IDB4ZDQ7Ci0gICAgKmRlcysrID0gMHhhNDsJCSAgICAgLyogs7nA2rTCILjwtc4gYTQgx+C/oSDA1rTZLiAqLworICAgICpkZXMrKyA9IDB4YTQ7CQkgICAgIC8qIOuCseyekOuKlCDrqqjrkZAgYTQg7ZaJ7JeQIOyeiOuLpC4gKi8KICAgICAqZGVzKysgPSBqb2hhYl9mY29uX3RvX3dhbltmdl07CiAgICAgKmRlcysrID0gMHhhNDsKICAgICAqZGVzKysgPSBqb2hhYl92b3dfdG9fd2FuW212XTsK