LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiAoQykgQ29weXJpZ2h0IDIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgogKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8d2F0Y2hkb2cuaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KI2luY2x1ZGUgPGRldmljZXMuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8bmV0Lmg+CiNpbmNsdWRlIDxpZGUuaD4KI2luY2x1ZGUgPGFzbS91LWJvb3QtaTM4Ni5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfc3RhcnQ7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9lbmQ7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9kZXN0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3Rfcm9tZGF0YV9zaXplOwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfYnNzX3N0YXJ0OwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfYnNzX3NpemU7CgpleHRlcm4gbG9uZyBfaTM4NmJvb3RfcmVhbG1vZGU7CmV4dGVybiBsb25nIF9pMzg2Ym9vdF9yZWFsbW9kZV9zaXplOwpleHRlcm4gbG9uZyBfaTM4NmJvb3RfYmlvczsKZXh0ZXJuIGxvbmcgX2kzODZib290X2Jpb3Nfc2l6ZTsKCi8qIFRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQgYmVjb21lcyBwb2ludGVycwogKiB3aGljaCBpcyBzb21ld2hhdCBpbmNvbnZlaWVudCAuLi4gKi8KdWxvbmcgaTM4NmJvb3Rfc3RhcnQgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X3N0YXJ0OyAgICAgICAgIC8qIGNvZGUgc3RhcnQgKGluIGZsYXNoKSBkZWZpbmVkIGluIHN0YXJ0LlMgKi8KdWxvbmcgaTM4NmJvb3RfZW5kICAgICAgICAgICA9ICh1bG9uZykmX2kzODZib290X2VuZDsJICAgICAgICAvKiBjb2RlIGVuZCAoaW4gZmxhc2gpICovCnVsb25nIGkzODZib290X3JvbWRhdGFfc3RhcnQgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0OyAvKiBkYXRhc2VnbWVudCBpbiBmbGFzaCAoYWxzbyBjb2RlK3JvZGF0YSBlbmQpICovCnVsb25nIGkzODZib290X3JvbWRhdGFfZGVzdCAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX2Rlc3Q7ICAvKiBkYXRhIGxvY2F0aW9uIHNlZ21lbnQgaW4gcmFtICovCnVsb25nIGkzODZib290X3JvbWRhdGFfc2l6ZSAgPSAodWxvbmcpJl9pMzg2Ym9vdF9yb21kYXRhX3NpemU7ICAvKiBzaXplIG9mIGRhdGEgc2VnbWVudCAqLwp1bG9uZyBpMzg2Ym9vdF9ic3Nfc3RhcnQgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYnNzX3N0YXJ0OyAgICAgLyogYnNzIHN0YXJ0ICovCnVsb25nIGkzODZib290X2Jzc19zaXplICAgICAgPSAodWxvbmcpJl9pMzg2Ym9vdF9ic3Nfc2l6ZTsgICAgICAvKiBic3Mgc2l6ZSAqLwoKdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGUgICAgICA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlOyAgICAgIC8qIHN0YXJ0IG9mIHJlYWxtb2RlIGVudHJ5IGNvZGUgKi8KdWxvbmcgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA9ICh1bG9uZykmX2kzODZib290X3JlYWxtb2RlX3NpemU7IC8qIHNpemUgb2YgcmVhbG1vZGUgZW50cnkgY29kZSAqLwp1bG9uZyBpMzg2Ym9vdF9iaW9zICAgICAgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYmlvczsgICAgICAgICAgLyogc3RhcnQgb2YgQklPUyBlbXVsYXRpb24gY29kZSAqLwp1bG9uZyBpMzg2Ym9vdF9iaW9zX3NpemUgICAgID0gKHVsb25nKSZfaTM4NmJvb3RfYmlvc19zaXplOyAgICAgLyogc2l6ZSBvZiBCSU9TIGVtdWxhdGlvbiBjb2RlICovCgoKY29uc3QgY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0KCVVfQk9PVF9WRVJTSU9OIiAoIiBfX0RBVEVfXyAiIC0gIiBfX1RJTUVfXyAiKSI7CgoKLyoKICogQmVnaW4gYW5kIEVuZCBvZiBtZW1vcnkgYXJlYSBmb3IgbWFsbG9jKCksIGFuZCBjdXJyZW50ICJicmsiCiAqLwpzdGF0aWMgdWxvbmcgbWVtX21hbGxvY19zdGFydCA9IDA7CnN0YXRpYyB1bG9uZyBtZW1fbWFsbG9jX2VuZCA9IDA7CnN0YXRpYyB1bG9uZyBtZW1fbWFsbG9jX2JyayA9IDA7CgpzdGF0aWMgaW50IG1lbV9tYWxsb2NfaW5pdCh2b2lkKQp7CgkvKiBzdGFydCBtYWxsb2MgYXJlYSByaWdodCBhZnRlciB0aGUgc3RhY2sgKi8KCW1lbV9tYWxsb2Nfc3RhcnQgPSBpMzg2Ym9vdF9ic3Nfc3RhcnQgKwoJCWkzODZib290X2Jzc19zaXplICsgQ09ORklHX1NZU19TVEFDS19TSVpFOwoJbWVtX21hbGxvY19zdGFydCA9IChtZW1fbWFsbG9jX3N0YXJ0KzMpJn4zOwoKCS8qIFVzZSBhbGwgYXZhaWxhYmxlIFJBTSBmb3IgbWFsbG9jKCkgKi8KCW1lbV9tYWxsb2NfZW5kID0gZ2QtPnJhbV9zaXplOwoKCW1lbV9tYWxsb2NfYnJrID0gbWVtX21hbGxvY19zdGFydDsKCglyZXR1cm4gMDsKfQoKdm9pZCAqc2JyayAocHRyZGlmZl90IGluY3JlbWVudCkKewoJdWxvbmcgb2xkID0gbWVtX21hbGxvY19icms7Cgl1bG9uZyBuZXcgPSBvbGQgKyBpbmNyZW1lbnQ7CgoJaWYgKChuZXcgPCBtZW1fbWFsbG9jX3N0YXJ0KSB8fCAobmV3ID4gbWVtX21hbGxvY19lbmQpKSB7CgkJcmV0dXJuIChOVUxMKTsKCX0KCW1lbV9tYWxsb2NfYnJrID0gbmV3OwoKCXJldHVybiAoKHZvaWQgKikgb2xkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbml0IFV0aWxpdGllcwkJCQkJCQkqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU29tZSBvZiB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vdmVkIGludG8gdGhlIGNvcmUgZnVuY3Rpb25zLAogKiBvciBkcm9wcGVkIGNvbXBsZXRlbHksCiAqIGJ1dCBsZXQncyBnZXQgaXQgd29ya2luZyAoYWdhaW4pIGZpcnN0Li4uCiAqLwpzdGF0aWMgaW50IGluaXRfYmF1ZHJhdGUgKHZvaWQpCnsKCWNoYXIgdG1wWzY0XTsJLyogbG9uZyBlbm91Z2ggZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwoJaW50IGkgPSBnZXRlbnZfcigiYmF1ZHJhdGUiLCB0bXAsIDY0KTsKCglnZC0+YmF1ZHJhdGUgPSAoaSAhPSAwKQoJCQk/IChpbnQpIHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDEwKQoJCQk6IENPTkZJR19CQVVEUkFURTsKCglyZXR1cm4gKDApOwp9CgpzdGF0aWMgaW50IGRpc3BsYXlfYmFubmVyICh2b2lkKQp7CgoJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsKCXByaW50ZiAoIlUtQm9vdCBjb2RlOiAlMDhsWCAtPiAlMDhsWCAgZGF0YTogJTA4bFggLT4gJTA4bFhcbiIKCQkiICAgICAgICBCU1M6ICUwOGxYIC0+ICUwOGxYIHN0YWNrOiAlMDhsWCAtPiAlMDhsWFxuIiwKCQlpMzg2Ym9vdF9zdGFydCwgaTM4NmJvb3Rfcm9tZGF0YV9zdGFydC0xLAoJCWkzODZib290X3JvbWRhdGFfZGVzdCwgaTM4NmJvb3Rfcm9tZGF0YV9kZXN0K2kzODZib290X3JvbWRhdGFfc2l6ZS0xLAoJCWkzODZib290X2Jzc19zdGFydCwgaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplLTEsCgkJaTM4NmJvb3RfYnNzX3N0YXJ0K2kzODZib290X2Jzc19zaXplLAoJCWkzODZib290X2Jzc19zdGFydCtpMzg2Ym9vdF9ic3Nfc2l6ZStDT05GSUdfU1lTX1NUQUNLX1NJWkUtMSk7CgoKCXJldHVybiAoMCk7Cn0KCi8qCiAqIFdBUk5JTkc6IHRoaXMgY29kZSBsb29rcyAiY2xlYW5lciIgdGhhbiB0aGUgUG93ZXJQQyB2ZXJzaW9uLCBidXQKICogaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCB5b3UgZWl0aGVyIGdldCBub3RoaW5nLCBvciBldmVyeXRoaW5nLgogKiBPbiBQb3dlclBDLCB5b3UgbWlnaHQgc2VlICJEUkFNOiAiIGJlZm9yZSB0aGUgc3lzdGVtIGhhbmdzIC0gd2hpY2gKICogZ2l2ZXMgYSBzaW1wbGUgeWV0IGNsZWFyIGluZGljYXRpb24gd2hpY2ggcGFydCBvZiB0aGUKICogaW5pdGlhbGl6YXRpb24gaWYgZmFpbGluZy4KICovCnN0YXRpYyBpbnQgZGlzcGxheV9kcmFtX2NvbmZpZyAodm9pZCkKewoJaW50IGk7CgoJcHV0cyAoIkRSQU0gQ29uZmlndXJhdGlvbjpcbiIpOwoKCWZvciAoaT0wOyBpPENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKCQlwcmludGYgKCJCYW5rICMlZDogJTA4bHggIiwgaSwgZ2QtPmJkLT5iaV9kcmFtW2ldLnN0YXJ0KTsKCQlwcmludF9zaXplIChnZC0+YmQtPmJpX2RyYW1baV0uc2l6ZSwgIlxuIik7Cgl9CgoJcmV0dXJuICgwKTsKfQoKc3RhdGljIHZvaWQgZGlzcGxheV9mbGFzaF9jb25maWcgKHVsb25nIHNpemUpCnsKCXB1dHMgKCJGbGFzaDogIik7CglwcmludF9zaXplIChzaXplLCAiXG4iKTsKfQoKCi8qCiAqIEJyZWF0aCBzb21lIGxpZmUgaW50byB0aGUgYm9hcmQuLi4KICoKICogSW5pdGlhbGl6ZSBhbiBTTUMgZm9yIHNlcmlhbCBjb21tcywgYW5kIGNhcnJ5IG91dCBzb21lIGhhcmR3YXJlCiAqIHRlc3RzLgogKgogKiBUaGUgZmlyc3QgcGFydCBvZiBpbml0aWFsaXphdGlvbiBpcyBydW5uaW5nIGZyb20gRmxhc2ggbWVtb3J5OwogKiBpdHMgbWFpbiBwdXJwb3NlIGlzIHRvIGluaXRpYWxpemUgdGhlIFJBTSBzbyB0aGF0IHdlCiAqIGNhbiByZWxvY2F0ZSB0aGUgbW9uaXRvciBjb2RlIHRvIFJBTS4KICovCgovKgogKiBBbGwgYXR0ZW1wdHMgdG8gY29tZSB1cCB3aXRoIGEgImNvbW1vbiIgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKICogdGhhdCB3b3JrcyBmb3IgYWxsIGJvYXJkcyBhbmQgYXJjaGl0ZWN0dXJlcyBmYWlsZWQ6IHNvbWUgb2YgdGhlCiAqIHJlcXVpcmVtZW50cyBhcmUganVzdCBfdG9vXyBkaWZmZXJlbnQuIFRvIGdldCByaWQgb2YgdGhlIHJlc3VsdGluZwogKiBtZXNzIG9mIGJvYXJkIGRlcGVuZGVuZCAjaWZkZWYnZWQgY29kZSB3ZSBub3cgbWFrZSB0aGUgd2hvbGUKICogaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgY29uZmlndXJhYmxlIHRvIHRoZSB1c2VyLgogKgogKiBUaGUgcmVxdWlyZW1lbnRzIGZvciBhbnkgbmV3IGluaXRhbGl6YXRpb24gZnVuY3Rpb24gaXMgc2ltcGxlOiBpdAogKiByZWNlaXZlcyBhIHBvaW50ZXIgdG8gdGhlICJnbG9iYWwgZGF0YSIgc3RydWN0dXJlIGFzIGl0J3Mgb25seQogKiBhcmd1bWVudCwgYW5kIHJldHVybnMgYW4gaW50ZWdlciByZXR1cm4gY29kZSwgd2hlcmUgMCBtZWFucwogKiAiY29udGludWUiIGFuZCAhPSAwIG1lYW5zICJmYXRhbCBlcnJvciwgaGFuZyB0aGUgc3lzdGVtIi4KICovCnR5cGVkZWYgaW50IChpbml0X2ZuY190KSAodm9pZCk7Cgppbml0X2ZuY190ICppbml0X3NlcXVlbmNlW10gPSB7CgljcHVfaW5pdCwJCS8qIGJhc2ljIGNwdSBkZXBlbmRlbnQgc2V0dXAgKi8KCWJvYXJkX2luaXQsCQkvKiBiYXNpYyBib2FyZCBkZXBlbmRlbnQgc2V0dXAgKi8KCWRyYW1faW5pdCwJCS8qIGNvbmZpZ3VyZSBhdmFpbGFibGUgUkFNIGJhbmtzICovCgltZW1fbWFsbG9jX2luaXQsICAgICAgICAvKiBkZXBlbmRhbnQgb24gZHJhbV9pbml0ICovCglpbnRlcnJ1cHRfaW5pdCwJCS8qIHNldCB1cCBleGNlcHRpb25zICovCgl0aW1lcl9pbml0LAoJc2VyaWFsX2luaXQsCgllbnZfaW5pdCwJCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8KCWluaXRfYmF1ZHJhdGUsCQkvKiBpbml0aWFsemUgYmF1ZHJhdGUgc2V0dGluZ3MgKi8KCXNlcmlhbF9pbml0LAkJLyogc2VyaWFsIGNvbW11bmljYXRpb25zIHNldHVwICovCglkaXNwbGF5X2Jhbm5lciwKCWRpc3BsYXlfZHJhbV9jb25maWcsCgoJTlVMTCwKfTsKCmdkX3QgKmdkOwoKdm9pZCBzdGFydF9pMzg2Ym9vdCAodm9pZCkKewoJY2hhciAqczsKCWludCBpOwoJdWxvbmcgc2l6ZTsKCXN0YXRpYyBnZF90IGdkX2RhdGE7CglzdGF0aWMgYmRfdCBiZF9kYXRhOwoJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsKCglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyMSk7CgoJZ2QgPSAmZ2RfZGF0YTsKCS8qIGNvbXBpbGVyIG9wdGltaXphdGlvbiBiYXJyaWVyIG5lZWRlZCBmb3IgR0NDID49IDMuNCAqLwoJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKTsKCgltZW1zZXQgKGdkLCAwLCBzaXplb2YgKGdkX3QpKTsKCWdkLT5iZCA9ICZiZF9kYXRhOwoJbWVtc2V0IChnZC0+YmQsIDAsIHNpemVvZiAoYmRfdCkpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjIpOwoKCWdkLT5iYXVkcmF0ZSA9ICBDT05GSUdfQkFVRFJBVEU7CgoJZm9yIChpbml0X2ZuY19wdHIgPSBpbml0X3NlcXVlbmNlLCBpPTA7ICppbml0X2ZuY19wdHI7ICsraW5pdF9mbmNfcHRyLCBpKyspIHsKCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoMHhhMTMwfGkpOwoKCQlpZiAoKCppbml0X2ZuY19wdHIpKCkgIT0gMCkgewoJCQloYW5nICgpOwoJCX0KCX0KCXNob3dfYm9vdF9wcm9ncmVzcygweDIzKTsKCgkvKiBjb25maWd1cmUgYXZhaWxhYmxlIEZMQVNIIGJhbmtzICovCglzaXplID0gZmxhc2hfaW5pdCgpOwoJZGlzcGxheV9mbGFzaF9jb25maWcoc2l6ZSk7CglzaG93X2Jvb3RfcHJvZ3Jlc3MoMHgyNCk7CgoJc2hvd19ib290X3Byb2dyZXNzKDB4MjUpOwoKCS8qIGluaXRpYWxpemUgZW52aXJvbm1lbnQgKi8KCWVudl9yZWxvY2F0ZSAoKTsKCXNob3dfYm9vdF9wcm9ncmVzcygweDI2KTsKCgoJLyogSVAgQWRkcmVzcyAqLwoJYmRfZGF0YS5iaV9pcF9hZGRyID0gZ2V0ZW52X0lQYWRkciAoImlwYWRkciIpOwoKCS8qIE1BQyBBZGRyZXNzICovCgl7CgkJaW50IGk7CgkJdWxvbmcgcmVnOwoJCWNoYXIgKnMsICplOwoJCWNoYXIgdG1wWzY0XTsKCgkJaSA9IGdldGVudl9yICgiZXRoYWRkciIsIHRtcCwgc2l6ZW9mICh0bXApKTsKCQlzID0gKGkgPiAwKSA/IHRtcCA6IE5VTEw7CgoJCWZvciAocmVnID0gMDsgcmVnIDwgNjsgKytyZWcpIHsKCQkJYmRfZGF0YS5iaV9lbmV0YWRkcltyZWddID0gcyA/IHNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKCQkJaWYgKHMpCgkJCQlzID0gKCplKSA/IGUgKyAxIDogZTsKCQl9Cgl9CgojaWYgZGVmaW5lZChDT05GSUdfUENJKQoJLyoKCSAqIERvIHBjaSBjb25maWd1cmF0aW9uCgkgKi8KCXBjaV9pbml0KCk7CiNlbmRpZgoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI3KTsKCgoJZGV2aWNlc19pbml0ICgpOwoKCWp1bXB0YWJsZV9pbml0ICgpOwoKCS8qIEluaXRpYWxpemUgdGhlIGNvbnNvbGUgKGFmdGVyIHRoZSByZWxvY2F0aW9uIGFuZCBkZXZpY2VzIGluaXQpICovCgljb25zb2xlX2luaXRfcigpOwoKI2lmZGVmIENPTkZJR19NSVNDX0lOSVRfUgoJLyogbWlzY2VsbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zICovCgltaXNjX2luaXRfcigpOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKSAmJiAhZGVmaW5lZChDT05GSUdfQ01EX0lERSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzICgiUENNQ0lBOiIpOwoJcGNtY2lhX2luaXQoKTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCglXQVRDSERPR19SRVNFVCgpOwoJcHV0cygiS0dEQjogICIpOwoJa2dkYl9pbml0KCk7CiNlbmRpZgoKCS8qIGVuYWJsZSBleGNlcHRpb25zICovCgllbmFibGVfaW50ZXJydXB0cygpOwoJc2hvd19ib290X3Byb2dyZXNzKDB4MjgpOwoKCS8qIE11c3QgaGFwcGVuIGFmdGVyIGludGVycnVwdHMgYXJlIGluaXRpYWxpemVkIHNpbmNlCgkgKiBhbiBpcnEgaGFuZGxlciBnZXRzIGluc3RhbGxlZAoJICovCiNpZmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KCXNlcmlhbF9idWZmZXJlZF9pbml0KCk7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19TVEFUVVNfTEVECglzdGF0dXNfbGVkX3NldCAoU1RBVFVTX0xFRF9CT09ULCBTVEFUVVNfTEVEX0JMSU5LSU5HKTsKI2VuZGlmCgoJdWRlbGF5KDIwKTsKCglzZXRfdGltZXIgKDApOwoKCS8qIEluaXRpYWxpemUgZnJvbSBlbnZpcm9ubWVudCAqLwoJaWYgKChzID0gZ2V0ZW52ICgibG9hZGFkZHIiKSkgIT0gTlVMTCkgewoJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7Cgl9CiNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQoJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewoJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBzLCBzaXplb2YgKEJvb3RGaWxlKSk7Cgl9CiNlbmRpZgoKCVdBVENIRE9HX1JFU0VUKCk7CgojaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJJREU6ICAgIik7CglpZGVfaW5pdCgpOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJTQ1NJOiAgIik7CglzY3NpX2luaXQoKTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKCVdBVENIRE9HX1JFU0VUKCk7CglwdXRzKCJET0M6ICAgIik7Cglkb2NfaW5pdCgpOwojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQojaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQoJV0FUQ0hET0dfUkVTRVQoKTsKCXB1dHMoIk5ldDogICAiKTsKI2VuZGlmCglldGhfaW5pdGlhbGl6ZShnZC0+YmQpOwojZW5kaWYKCiNpZiAoIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpKSAmJiAoMCkKCVdBVENIRE9HX1JFU0VUKCk7CiMgaWZkZWYgREVCVUcKCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOwojIGVuZGlmCglyZXNldF9waHkoKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAoJV0FUQ0hET0dfUkVTRVQoKTsKCS8qCgkgKiBTb21lIHBhcnRzIGNhbiBiZSBvbmx5IGluaXRpYWxpemVkIGlmIGFsbCBvdGhlcnMgKGxpa2UKCSAqIEludGVycnVwdHMpIGFyZSB1cCBhbmQgcnVubmluZyAoaS5lLiB0aGUgUEMtc3R5bGUgSVNBCgkgKiBrZXlib2FyZCkuCgkgKi8KCWxhc3Rfc3RhZ2VfaW5pdCgpOwojZW5kaWYKCgojaWZkZWYgQ09ORklHX1BPU1QKCXBvc3RfcnVuIChOVUxMLCBQT1NUX1JBTSB8IHBvc3RfYm9vdG1vZGVfZ2V0KDApKTsKI2VuZGlmCgoKCXNob3dfYm9vdF9wcm9ncmVzcygweDI5KTsKCgkvKiBtYWluX2xvb3AoKSBjYW4gcmV0dXJuIHRvIHJldHJ5IGF1dG9ib290LCBpZiBzbyBqdXN0IHJ1biBpdCBhZ2Fpbi4gKi8KCWZvciAoOzspIHsKCQltYWluX2xvb3AoKTsKCX0KCgkvKiBOT1RSRUFDSEVEIC0gbm8gd2F5IG91dCBvZiBjb21tYW5kIGxvb3AgZXhjZXB0IGJvb3RpbmcgKi8KfQoKdm9pZCBoYW5nICh2b2lkKQp7CglwdXRzICgiIyMjIEVSUk9SICMjIyBQbGVhc2UgUkVTRVQgdGhlIGJvYXJkICMjI1xuIik7Cglmb3IgKDs7KTsKfQoKdW5zaWduZWQgbG9uZyBkb19nb19leGVjICh1bG9uZyAoKmVudHJ5KShpbnQsIGNoYXIgKltdKSwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJLyoKCSAqIFRPRE86IFRlc3QgdGhpcyBmdW5jdGlvbiAtIGNoYW5nZWQgdG8gZml4IGNvbXBpbGVyIGVycm9yLgoJICogT3JpZ2luYWwgY29kZSB3YXM6CgkgKiAgIHJldHVybiAoZW50cnkgPj4gMSkgKGFyZ2MsIGFyZ3YpOwoJICogd2l0aCBhIGNvbW1lbnQgYWJvdXQgTmlvcyBmdW5jdGlvbiBwb2ludGVycyBhcmUgYWRkcmVzcyA+PiAxCgkgKi8KCXJldHVybiAoZW50cnkpIChhcmdjLCBhcmd2KTsKfQo=