LyoKICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKIC8qIElTU1VFUzoKICogLSBTTVMgcmV0cmFuc21pdCAoc3BlY2lmeWluZyBUUC1NZXNzYWdlLUlEKQogKgogKi8KCi8qKgogKiBUT0RPCiAqCiAqIFN1cHAgU2VydmljZSBOb3RpZmljYXRpb24gKCtDU1NOKQogKiBHUFJTIFBEUCBjb250ZXh0IGRlYWN0aXZhdGUgbm90aWZpY2F0aW9uCiAqCiAqLwoKCiNpZm5kZWYgQU5EUk9JRF9SSUxfSAojZGVmaW5lIEFORFJPSURfUklMX0ggMQoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaWZuZGVmIEZFQVRVUkVfVU5JVF9URVNUCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojZW5kaWYgLyogIUZFQVRVUkVfVU5JVF9URVNUICovCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKI2RlZmluZSBSSUxfVkVSU0lPTiAzCgojZGVmaW5lIENETUFfQUxQSEFfSU5GT19CVUZGRVJfTEVOR1RIIDY0CiNkZWZpbmUgQ0RNQV9OVU1CRVJfSU5GT19CVUZGRVJfTEVOR1RIIDgxCgp0eXBlZGVmIHZvaWQgKiBSSUxfVG9rZW47Cgp0eXBlZGVmIGVudW0gewogICAgUklMX0VfU1VDQ0VTUyA9IDAsCiAgICBSSUxfRV9SQURJT19OT1RfQVZBSUxBQkxFID0gMSwgICAgIC8qIElmIHJhZGlvIGRpZCBub3Qgc3RhcnQgb3IgaXMgcmVzZXR0aW5nICovCiAgICBSSUxfRV9HRU5FUklDX0ZBSUxVUkUgPSAyLAogICAgUklMX0VfUEFTU1dPUkRfSU5DT1JSRUNUID0gMywgICAgICAvKiBmb3IgUElOL1BJTjIgbWV0aG9kcyBvbmx5ISAqLwogICAgUklMX0VfU0lNX1BJTjIgPSA0LCAgICAgICAgICAgICAgICAvKiBPcGVyYXRpb24gcmVxdWlyZXMgU0lNIFBJTjIgdG8gYmUgZW50ZXJlZCAqLwogICAgUklMX0VfU0lNX1BVSzIgPSA1LCAgICAgICAgICAgICAgICAvKiBPcGVyYXRpb24gcmVxdWlyZXMgU0lNIFBJTjIgdG8gYmUgZW50ZXJlZCAqLwogICAgUklMX0VfUkVRVUVTVF9OT1RfU1VQUE9SVEVEID0gNiwKICAgIFJJTF9FX0NBTkNFTExFRCA9IDcsCiAgICBSSUxfRV9PUF9OT1RfQUxMT1dFRF9EVVJJTkdfVk9JQ0VfQ0FMTCA9IDgsIC8qIGRhdGEgb3BzIGFyZSBub3QgYWxsb3dlZCBkdXJpbmcgdm9pY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBvbiBhIENsYXNzIEMgR1BSUyBkZXZpY2UgKi8KICAgIFJJTF9FX09QX05PVF9BTExPV0VEX0JFRk9SRV9SRUdfVE9fTlcgPSA5LCAgLyogZGF0YSBvcHMgYXJlIG5vdCBhbGxvd2VkIGJlZm9yZSBkZXZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJzIGluIG5ldHdvcmsgKi8KICAgIFJJTF9FX1NNU19TRU5EX0ZBSUxfUkVUUlkgPSAxMCwgICAgICAgICAgICAgLyogZmFpbCB0byBzZW5kIHNtcyBhbmQgbmVlZCByZXRyeSAqLwogICAgUklMX0VfU0lNX0FCU0VOVCA9IDExLCAgICAgICAgICAgICAgICAgICAgICAvKiBmYWlsIHRvIHNldCB0aGUgbG9jYXRpb24gd2hlcmUgQ0RNQSBzdWJzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGwgYmUgcmV0cmlldmVkIGJlY2F1c2Ugb2YgU0lNIG9yIFJVSU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZCBhYnNlbnQgKi8KICAgIFJJTF9FX1NVQlNDUklQVElPTl9OT1RfQVZBSUxBQkxFID0gMTIsICAgICAgLyogZmFpbCB0byBmaW5kIENETUEgc3Vic2NyaXB0aW9uIGZyb20gc3BlY2lmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICovCiAgICBSSUxfRV9NT0RFX05PVF9TVVBQT1JURUQgPSAxMywgICAgICAgICAgICAgIC8qIEhXIGRvZXMgbm90IHN1cHBvcnQgcHJlZmVycmVkIG5ldHdvcmsgdHlwZSAqLwogICAgUklMX0VfRkROX0NIRUNLX0ZBSUxVUkUgPSAxNCAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGZhaWxlZCBiZWNhdXNlIHJlY2lwaWVudCBpcyBub3Qgb24gRkROIGxpc3QgKi8KfSBSSUxfRXJybm87Cgp0eXBlZGVmIGVudW0gewogICAgUklMX0NBTExfQUNUSVZFID0gMCwKICAgIFJJTF9DQUxMX0hPTERJTkcgPSAxLAogICAgUklMX0NBTExfRElBTElORyA9IDIsICAgIC8qIE1PIGNhbGwgb25seSAqLwogICAgUklMX0NBTExfQUxFUlRJTkcgPSAzLCAgIC8qIE1PIGNhbGwgb25seSAqLwogICAgUklMX0NBTExfSU5DT01JTkcgPSA0LCAgIC8qIE1UIGNhbGwgb25seSAqLwogICAgUklMX0NBTExfV0FJVElORyA9IDUgICAgIC8qIE1UIGNhbGwgb25seSAqLwp9IFJJTF9DYWxsU3RhdGU7Cgp0eXBlZGVmIGVudW0gewogICAgUkFESU9fU1RBVEVfT0ZGID0gMCwgICAgICAgICAgICAgICAgICAgLyogUmFkaW8gZXhwbGljdGx5IHBvd2VyZWQgb2ZmIChlZyBDRlVOPTApICovCiAgICBSQURJT19TVEFURV9VTkFWQUlMQUJMRSA9IDEsICAgICAgICAgICAvKiBSYWRpbyB1bmF2YWlsYWJsZSAoZWcsIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLwogICAgUkFESU9fU1RBVEVfU0lNX05PVF9SRUFEWSA9IDIsICAgICAgICAgLyogUmFkaW8gaXMgb24sIGJ1dCB0aGUgU0lNIGludGVyZmFjZSBpcyBub3QgcmVhZHkgKi8KICAgIFJBRElPX1NUQVRFX1NJTV9MT0NLRURfT1JfQUJTRU5UID0gMywgIC8qIFNJTSBQSU4gbG9ja2VkLCBQVUsgcmVxdWlyZWQsIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsaXphdGlvbiBsb2NrZWQsIG9yIFNJTSBhYnNlbnQgKi8KICAgIFJBRElPX1NUQVRFX1NJTV9SRUFEWSA9IDQsICAgICAgICAgICAgIC8qIFJhZGlvIGlzIG9uIGFuZCBTSU0gaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSAqLwogICAgUkFESU9fU1RBVEVfUlVJTV9OT1RfUkVBRFkgPSA1LCAgICAgICAgLyogUmFkaW8gaXMgb24sIGJ1dCB0aGUgUlVJTSBpbnRlcmZhY2UgaXMgbm90IHJlYWR5ICovCiAgICBSQURJT19TVEFURV9SVUlNX1JFQURZID0gNiwgICAgICAgICAgICAvKiBSYWRpbyBpcyBvbiBhbmQgdGhlIFJVSU0gaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSAqLwogICAgUkFESU9fU1RBVEVfUlVJTV9MT0NLRURfT1JfQUJTRU5UID0gNywgLyogUlVJTSBQSU4gbG9ja2VkLCBQVUsgcmVxdWlyZWQsIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFsaXphdGlvbiBsb2NrZWQsIG9yIFJVSU0gYWJzZW50ICovCiAgICBSQURJT19TVEFURV9OVl9OT1RfUkVBRFkgPSA4LCAgICAgICAgICAvKiBSYWRpbyBpcyBvbiwgYnV0IHRoZSBOViBpbnRlcmZhY2UgaXMgbm90IGF2YWlsYWJsZSAqLwogICAgUkFESU9fU1RBVEVfTlZfUkVBRFkgPSA5ICAgICAgICAgICAgICAgLyogUmFkaW8gaXMgb24gYW5kIHRoZSBOViBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlICovCn0gUklMX1JhZGlvU3RhdGU7CgovKiBVc2VyLXRvLVVzZXIgc2lnbmFsaW5nIEluZm8gYWN0aXZhdGlvbiB0eXBlcyBkZXJpdmVkIGZyb20gM0dQUCAyMy4wODcgdjguMCAqLwp0eXBlZGVmIGVudW0gewogICAgUklMX1VVU19UWVBFMV9JTVBMSUNJVCA9IDAsCiAgICBSSUxfVVVTX1RZUEUxX1JFUVVJUkVEID0gMSwKICAgIFJJTF9VVVNfVFlQRTFfTk9UX1JFUVVJUkVEID0gMiwKICAgIFJJTF9VVVNfVFlQRTJfUkVRVUlSRUQgPSAzLAogICAgUklMX1VVU19UWVBFMl9OT1RfUkVRVUlSRUQgPSA0LAogICAgUklMX1VVU19UWVBFM19SRVFVSVJFRCA9IDUsCiAgICBSSUxfVVVTX1RZUEUzX05PVF9SRVFVSVJFRCA9IDYKfSBSSUxfVVVTX1R5cGU7CgovKiBVc2VyLXRvLVVzZXIgU2lnbmFsaW5nIEluZm9ybWF0aW9uIGRhdGEgY29kaW5nIHNjaGVtZXMuIFBvc3NpYmxlIHZhbHVlcyBmb3IKICogT2N0ZXQgMyAoUHJvdG9jb2wgRGlzY3JpbWluYXRvciBmaWVsZCkgaW4gdGhlIFVVSUUuIFRoZSB2YWx1ZXMgaGF2ZSBiZWVuCiAqIHNwZWNpZmllZCBpbiBzZWN0aW9uIDEwLjUuNC4yNSBvZiAzR1BQIFRTIDI0LjAwOCAqLwp0eXBlZGVmIGVudW0gewogICAgUklMX1VVU19EQ1NfVVNQID0gMCwgICAgICAgICAgLyogVXNlciBzcGVjaWZpZWQgcHJvdG9jb2wgKi8KICAgIFJJTF9VVVNfRENTX09TSUhMUCA9IDEsICAgICAgIC8qIE9TSSBoaWdoZXIgbGF5ZXIgcHJvdG9jb2wgKi8KICAgIFJJTF9VVVNfRENTX1gyNDQgPSAyLCAgICAgICAgIC8qIFguMjQ0ICovCiAgICBSSUxfVVVTX0RDU19STUNGID0gMywgICAgICAgICAvKiBSZXNlcnZlZCBmb3Igc3lzdGVtIG1hbmdlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyZ2VuY2UgZnVuY3Rpb24gKi8KICAgIFJJTF9VVVNfRENTX0lBNWMgPSA0ICAgICAgICAgIC8qIElBNSBjaGFyYWN0ZXJzICovCn0gUklMX1VVU19EQ1M7CgovKiBVc2VyLXRvLVVzZXIgU2lnbmFsaW5nIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCAyMy4wODcgdjguMAogKiBUaGlzIGRhdGEgaXMgcGFzc2VkIGluIFJJTF9FeHRlbnNpb25SZWNvcmQgYW5kIHJlYyBjb250YWlucyB0aGlzCiAqIHN0cnVjdHVyZSB3aGVuIHR5cGUgaXMgUklMX1VVU19JTkZPX0VYVF9SRUMgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIFJJTF9VVVNfVHlwZSAgICB1dXNUeXBlOyAgICAvKiBVVVMgVHlwZSAqLwogIFJJTF9VVVNfRENTICAgICB1dXNEY3M7ICAgICAvKiBVVVMgRGF0YSBDb2RpbmcgU2NoZW1lICovCiAgaW50ICAgICAgICAgICAgIHV1c0xlbmd0aDsgIC8qIExlbmd0aCBvZiBVVVMgRGF0YSAqLwogIGNoYXIgKiAgICAgICAgICB1dXNEYXRhOyAgICAvKiBVVVMgRGF0YSAqLwp9IFJJTF9VVVNfSW5mbzsKCi8qIENETUEgU2lnbmFsIEluZm9ybWF0aW9uIFJlY29yZCBhcyBkZWZpbmVkIGluIEMuUzAwMDUgc2VjdGlvbiAzLjcuNS41ICovCnR5cGVkZWYgc3RydWN0IHsKICBjaGFyIGlzUHJlc2VudDsgICAgLyogbm9uLXplcm8gaWYgc2lnbmFsIGluZm9ybWF0aW9uIHJlY29yZCBpcyBwcmVzZW50ICovCiAgY2hhciBzaWduYWxUeXBlOyAgIC8qIGFzIGRlZmluZWQgMy43LjUuNS0xICovCiAgY2hhciBhbGVydFBpdGNoOyAgIC8qIGFzIGRlZmluZWQgMy43LjUuNS0yICovCiAgY2hhciBzaWduYWw7ICAgICAgIC8qIGFzIGRlZmluZWQgMy43LjUuNS0zLCAzLjcuNS41LTQgb3IgMy43LjUuNS01ICovCn0gUklMX0NETUFfU2lnbmFsSW5mb1JlY29yZDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIFJJTF9DYWxsU3RhdGUgICBzdGF0ZTsKICAgIGludCAgICAgICAgICAgICBpbmRleDsgICAgICAvKiBDb25uZWN0aW9uIEluZGV4IGZvciB1c2Ugd2l0aCwgZWcsIEFUK0NITEQgKi8KICAgIGludCAgICAgICAgICAgICB0b2E7ICAgICAgICAvKiB0eXBlIG9mIGFkZHJlc3MsIGVnIDE0NSA9IGludGwgKi8KICAgIGNoYXIgICAgICAgICAgICBpc01wdHk7ICAgICAvKiBub256ZXJvIGlmIGlzIG1wdHkgY2FsbCAqLwogICAgY2hhciAgICAgICAgICAgIGlzTVQ7ICAgICAgIC8qIG5vbnplcm8gaWYgY2FsbCBpcyBtb2JpbGUgdGVybWluYXRlZCAqLwogICAgY2hhciAgICAgICAgICAgIGFsczsgICAgICAgIC8qIEFMUyBsaW5lIGluZGljYXRvciBpZiBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9IGxpbmUgMSkgKi8KICAgIGNoYXIgICAgICAgICAgICBpc1ZvaWNlOyAgICAvKiBub256ZXJvIGlmIHRoaXMgaXMgaXMgYSB2b2ljZSBjYWxsICovCiAgICBjaGFyICAgICAgICAgICAgaXNWb2ljZVByaXZhY3k7ICAgICAvKiBub256ZXJvIGlmIENETUEgdm9pY2UgcHJpdmFjeSBtb2RlIGlzIGFjdGl2ZSAqLwogICAgY2hhciAqICAgICAgICAgIG51bWJlcjsgICAgIC8qIFJlbW90ZSBwYXJ0eSBudW1iZXIgKi8KICAgIGludCAgICAgICAgICAgICBudW1iZXJQcmVzZW50YXRpb247IC8qIDA9QWxsb3dlZCwgMT1SZXN0cmljdGVkLCAyPU5vdCBTcGVjaWZpZWQvVW5rbm93biAzPVBheXBob25lICovCiAgICBjaGFyICogICAgICAgICAgbmFtZTsgICAgICAgLyogUmVtb3RlIHBhcnR5IG5hbWUgKi8KICAgIGludCAgICAgICAgICAgICBuYW1lUHJlc2VudGF0aW9uOyAvKiAwPUFsbG93ZWQsIDE9UmVzdHJpY3RlZCwgMj1Ob3QgU3BlY2lmaWVkL1Vua25vd24gMz1QYXlwaG9uZSAqLwogICAgUklMX1VVU19JbmZvICogIHV1c0luZm87ICAgIC8qIE5VTEwgb3IgUG9pbnRlciB0byBVc2VyLVVzZXIgU2lnbmFsaW5nIEluZm9ybWF0aW9uICovCn0gUklMX0NhbGw7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgICAgICAgICAgICAgY2lkOyAgICAgICAgLyogQ29udGV4dCBJRCAqLwogICAgaW50ICAgICAgICAgICAgIGFjdGl2ZTsgICAgIC8qIDA9aW5hY3RpdmUsIDE9YWN0aXZlL3BoeXNpY2FsIGxpbmsgZG93biwgMj1hY3RpdmUvcGh5c2ljYWwgbGluayB1cCAqLwogICAgY2hhciAqICAgICAgICAgIHR5cGU7ICAgICAgIC8qIFguMjUsIElQLCBJUFY2LCBldGMuICovCiAgICBjaGFyICogICAgICAgICAgYXBuOwogICAgY2hhciAqICAgICAgICAgIGFkZHJlc3M7Cn0gUklMX0RhdGFfQ2FsbF9SZXNwb25zZTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBtZXNzYWdlUmVmOyAgIC8qIFRQLU1lc3NhZ2UtUmVmZXJlbmNlIGZvciBHU00sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQmVhcmVyRGF0YSBNZXNzYWdlSWQgZm9yIENETUEKICAgICAgICAgICAgICAgICAgICAgICAgIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2Mi4wLCB0YWJsZSA0LjUtMSkuICovCiAgICBjaGFyICphY2tQRFU7ICAgICAvKiBvciBOVUxMIGlmIG4vYSAqLwogICAgaW50IGVycm9yQ29kZTsgICAgLyogU2VlIDNHUFAgMjcuMDA1LCAzLjIuNSBmb3IgR1NNL1VNVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAzR1BQMiBOLlMwMDA1IChJUy00MUMpIFRhYmxlIDE3MSBmb3IgQ0RNQSwKICAgICAgICAgICAgICAgICAgICAgICAgIC0xIGlmIHVua25vd24gb3Igbm90IGFwcGxpY2FibGUqLwp9IFJJTF9TTVNfUmVzcG9uc2U7CgovKiogVXNlZCBieSBSSUxfUkVRVUVTVF9XUklURV9TTVNfVE9fU0lNICovCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBzdGF0dXM7ICAgICAvKiBTdGF0dXMgb2YgbWVzc2FnZS4gIFNlZSBUUyAyNy4wMDUgMy4xLCAiPHN0YXQ+IjogKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDAgPSAiUkVDIFVOUkVBRCIgICAgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDEgPSAiUkVDIFJFQUQiICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDIgPSAiU1RPIFVOU0VOVCIgICAgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDMgPSAiU1RPIFNFTlQiICAgICAgKi8KICAgIGNoYXIgKiBwZHU7ICAgICAvKiBQRFUgb2YgbWVzc2FnZSB0byB3cml0ZSwgYXMgYW4gQVNDSUkgaGV4IHN0cmluZyBsZXNzIHRoZSBTTVNDIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFRQLWxheWVyIGxlbmd0aCBpcyAic3RybGVuKHBkdSkvMiIuICovCiAgICBjaGFyICogc21zYzsgICAgLyogU01TQyBhZGRyZXNzIGluIEdTTSBCQ0QgZm9ybWF0IHByZWZpeGVkIGJ5IGEgbGVuZ3RoIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAoYXMgZXhwZWN0ZWQgYnkgVFMgMjcuMDA1KSBvciBOVUxMIGZvciBkZWZhdWx0IFNNU0MgKi8KfSBSSUxfU01TX1dyaXRlQXJnczsKCi8qKiBVc2VkIGJ5IFJJTF9SRVFVRVNUX0RJQUwgKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciAqIGFkZHJlc3M7CiAgICBpbnQgY2xpcjsKICAgICAgICAgICAgLyogKHNhbWUgYXMgJ24nIHBhcmVtZXRlciBpbiBUUyAyNy4wMDcgNy43ICIrQ0xJUiIKICAgICAgICAgICAgICogY2xpciA9PSAwIG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCiAgICAgICAgICAgICAqIGNsaXIgPT0gMSBvbiAiQ0xJUiBpbnZvY2F0aW9uIiAocmVzdHJpY3QgQ0xJIHByZXNlbnRhdGlvbikKICAgICAgICAgICAgICogY2xpciA9PSAyIG9uICJDTElSIHN1cHByZXNzaW9uIiAoYWxsb3cgQ0xJIHByZXNlbnRhdGlvbikKICAgICAgICAgICAgICovCiAgICBSSUxfVVVTX0luZm8gKiAgdXVzSW5mbzsgICAgLyogTlVMTCBvciBQb2ludGVyIHRvIFVzZXItVXNlciBTaWduYWxpbmcgSW5mb3JtYXRpb24gKi8KfSBSSUxfRGlhbDsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBjb21tYW5kOyAgICAvKiBvbmUgb2YgdGhlIGNvbW1hbmRzIGxpc3RlZCBmb3IgVFMgMjcuMDA3ICtDUlNNKi8KICAgIGludCBmaWxlaWQ7ICAgICAvKiBFRiBpZCAqLwogICAgY2hhciAqcGF0aDsgICAgIC8qICJwYXRoaWQiIGZyb20gVFMgMjcuMDA3ICtDUlNNIGNvbW1hbmQuCiAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBpcyBpbiBoZXggYXNjaWlpIGZvcm1hdCBlZyAiN2YyMDVmNzAiCiAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBtdXN0IGFsd2F5cyBiZSBwcm92aWRlZC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGludCBwMTsKICAgIGludCBwMjsKICAgIGludCBwMzsKICAgIGNoYXIgKmRhdGE7ICAgICAvKiBNYXkgYmUgTlVMTCovCiAgICBjaGFyICpwaW4yOyAgICAgLyogTWF5IGJlIE5VTEwqLwp9IFJJTF9TSU1fSU87Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgc3cxOwogICAgaW50IHN3MjsKICAgIGNoYXIgKnNpbVJlc3BvbnNlOyAgLyogSW4gaGV4IHN0cmluZyBmb3JtYXQgKFthLWZBLUYwLTldKikuICovCn0gUklMX1NJTV9JT19SZXNwb25zZTsKCi8qIFNlZSBhbHNvIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZvcndhcmRJbmZvICovCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgICAgICAgICAgICAgc3RhdHVzOyAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGb3IgUklMX1JFUVVFU1RfUVVFUllfQ0FMTF9GT1JXQVJEX1NUQVRVUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXR1cyAxID0gYWN0aXZlLCAwID0gbm90IGFjdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRm9yIFJJTF9SRVFVRVNUX1NFVF9DQUxMX0ZPUldBUkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdHVzIGlzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBkaXNhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMSA9IGVuYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDIgPSBpbnRlcnJvZ2F0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDMgPSByZWdpc3RlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogNCA9IGVyYXN1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICBpbnQgICAgICAgICAgICAgcmVhc29uOyAgICAgIC8qIGZyb20gVFMgMjcuMDA3IDcuMTEgInJlYXNvbiIgKi8KICAgIGludCAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3M7LyogRnJvbSAyNy4wMDcgK0NDRkMvK0NMQ0sgImNsYXNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGFibGUgZm9yIEFuZHJvaWQgbWFwcGluZyBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NSSBzZXJ2aWNlIGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBtZWFucyB1c2VyIGRvZXNuJ3QgaW5wdXQgY2xhc3MgKi8KICAgIGludCAgICAgICAgICAgICB0b2E7ICAgICAgICAgLyogInR5cGUiIGZyb20gVFMgMjcuMDA3IDcuMTEgKi8KICAgIGNoYXIgKiAgICAgICAgICBudW1iZXI7ICAgICAgLyogIm51bWJlciIgZnJvbSBUUyAyNy4wMDcgNy4xMS4gTWF5IGJlIE5VTEwgKi8KICAgIGludCAgICAgICAgICAgICB0aW1lU2Vjb25kczsgLyogZm9yIENGIG5vIHJlcGx5IG9ubHkgKi8KfVJJTF9DYWxsRm9yd2FyZEluZm87Cgp0eXBlZGVmIHN0cnVjdCB7CiAgIGNoYXIgKiBjaWQ7ICAgICAgICAgLyogQ29tYmluYXRpb24gb2YgTEFDIGFuZCBDZWxsIElkIGluIDMyIGJpdHMgaW4gR1NNLgogICAgICAgICAgICAgICAgICAgICAgICAqIFVwcGVyIDE2IGJpdHMgaXMgTEFDIGFuZCBsb3dlciAxNiBiaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICogaXMgQ0lEIChhcyBkZXNjcmliZWQgaW4gVFMgMjcuMDA1KQogICAgICAgICAgICAgICAgICAgICAgICAqIFByaW1hcnkgU2NyYW1ibGluZyBDb2RlIChhcyBkZXNjcmliZWQgaW4gVFMgMjUuMzMxKQogICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgaW4gOSBiaXRzIGluIFVNVFMKICAgICAgICAgICAgICAgICAgICAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlIGhleGFkZWNpbWFsIDB4MDAwMCAtIDB4ZmZmZmZmZmYuCiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIGludCAgICByc3NpOyAgICAgICAgLyogUmVjZWl2ZWQgUlNTSSBpbiBHU00sCiAgICAgICAgICAgICAgICAgICAgICAgICogTGV2ZWwgaW5kZXggb2YgQ1BJQ0ggUmVjZWl2ZWQgU2lnbmFsIENvZGUgUG93ZXIgaW4gVU1UUwogICAgICAgICAgICAgICAgICAgICAgICAqLwp9IFJJTF9OZWlnaGJvcmluZ0NlbGw7CgovKiBTZWUgUklMX1JFUVVFU1RfTEFTVF9DQUxMX0ZBSUxfQ0FVU0UgKi8KdHlwZWRlZiBlbnVtIHsKICAgIENBTExfRkFJTF9VTk9CVEFJTkFCTEVfTlVNQkVSID0gMSwKICAgIENBTExfRkFJTF9OT1JNQUwgPSAxNiwKICAgIENBTExfRkFJTF9CVVNZID0gMTcsCiAgICBDQUxMX0ZBSUxfQ09OR0VTVElPTiA9IDM0LAogICAgQ0FMTF9GQUlMX0FDTV9MSU1JVF9FWENFRURFRCA9IDY4LAogICAgQ0FMTF9GQUlMX0NBTExfQkFSUkVEID0gMjQwLAogICAgQ0FMTF9GQUlMX0ZETl9CTE9DS0VEID0gMjQxLAogICAgQ0FMTF9GQUlMX0lNU0lfVU5LTk9XTl9JTl9WTFIgPSAyNDIsCiAgICBDQUxMX0ZBSUxfSU1FSV9OT1RfQUNDRVBURUQgPSAyNDMsCiAgICBDQUxMX0ZBSUxfQ0RNQV9MT0NLRURfVU5USUxfUE9XRVJfQ1lDTEUgPSAxMDAwLAogICAgQ0FMTF9GQUlMX0NETUFfRFJPUCA9IDEwMDEsCiAgICBDQUxMX0ZBSUxfQ0RNQV9JTlRFUkNFUFQgPSAxMDAyLAogICAgQ0FMTF9GQUlMX0NETUFfUkVPUkRFUiA9IDEwMDMsCiAgICBDQUxMX0ZBSUxfQ0RNQV9TT19SRUpFQ1QgPSAxMDA0LAogICAgQ0FMTF9GQUlMX0NETUFfUkVUUllfT1JERVIgPSAxMDA1LAogICAgQ0FMTF9GQUlMX0NETUFfQUNDRVNTX0ZBSUxVUkUgPSAxMDA2LAogICAgQ0FMTF9GQUlMX0NETUFfUFJFRU1QVEVEID0gMTAwNywKICAgIENBTExfRkFJTF9DRE1BX05PVF9FTUVSR0VOQ1kgPSAxMDA4LCAvKiBGb3Igbm9uLWVtZXJnZW5jeSBudW1iZXIgZGlhbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGVtZXJnZW5jeSBjYWxsYmFjayBtb2RlICovCiAgICBDQUxMX0ZBSUxfQ0RNQV9BQ0NFU1NfQkxPQ0tFRCA9IDEwMDksIC8qIENETUEgbmV0d29yayBhY2Nlc3MgcHJvYmVzIGJsb2NrZWQgKi8KICAgIENBTExfRkFJTF9FUlJPUl9VTlNQRUNJRklFRCA9IDB4ZmZmZgp9IFJJTF9MYXN0Q2FsbEZhaWxDYXVzZTsKCi8qIFNlZSBSSUxfUkVRVUVTVF9MQVNUX0RBVEFfQ0FMTF9GQUlMX0NBVVNFICovCnR5cGVkZWYgZW51bSB7CiAgICBQRFBfRkFJTF9PUEVSQVRPUl9CQVJSRUQgPSAweDA4LCAgICAgICAgICAgICAgIC8qIG5vIHJldHJ5ICovCiAgICBQRFBfRkFJTF9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTID0gMHgxQSwKICAgIFBEUF9GQUlMX01JU1NJTkdfVUtOT1dOX0FQTiA9IDB4MUIsICAgICAgICAgICAgLyogbm8gcmV0cnkgKi8KICAgIFBEUF9GQUlMX1VOS05PV05fUERQX0FERFJFU1NfVFlQRSA9IDB4MUMsICAgICAgLyogbm8gcmV0cnkgKi8KICAgIFBEUF9GQUlMX1VTRVJfQVVUSEVOVElDQVRJT04gPSAweDFELCAgICAgICAgICAgLyogbm8gcmV0cnkgKi8KICAgIFBEUF9GQUlMX0FDVElWQVRJT05fUkVKRUNUX0dHU04gPSAweDFFLCAgICAgICAgLyogbm8gcmV0cnkgKi8KICAgIFBEUF9GQUlMX0FDVElWQVRJT05fUkVKRUNUX1VOU1BFQ0lGSUVEID0gMHgxRiwKICAgIFBEUF9GQUlMX1NFUlZJQ0VfT1BUSU9OX05PVF9TVVBQT1JURUQgPSAweDIwLCAgLyogbm8gcmV0cnkgKi8KICAgIFBEUF9GQUlMX1NFUlZJQ0VfT1BUSU9OX05PVF9TVUJTQ1JJQkVEID0gMHgyMSwgLyogbm8gcmV0cnkgKi8KICAgIFBEUF9GQUlMX1NFUlZJQ0VfT1BUSU9OX09VVF9PRl9PUkRFUiA9IDB4MjIsCiAgICBQRFBfRkFJTF9OU0FQSV9JTl9VU0UgICAgICA9IDB4MjMsICAgICAgICAgICAgIC8qIG5vIHJldHJ5ICovCiAgICBQRFBfRkFJTF9QUk9UT0NPTF9FUlJPUlMgICA9IDB4NkYsICAgICAgICAgICAgIC8qIG5vIHJldHJ5ICovCiAgICBQRFBfRkFJTF9FUlJPUl9VTlNQRUNJRklFRCA9IDB4ZmZmZiwgIC8qIFRoaXMgYW5kIGFsbCBvdGhlciBjYXNlczogcmV0cnkgc2lsZW50bHkgKi8KICAgIC8qIE5vdCBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmljYXRpb24gKi8KICAgIFBEUF9GQUlMX1JFR0lTVFJBVElPTl9GQUlMID0gLTEsCiAgICBQRFBfRkFJTF9HUFJTX1JFR0lTVFJBVElPTl9GQUlMID0gLTIsCn0gUklMX0xhc3REYXRhQ2FsbEFjdGl2YXRlRmFpbENhdXNlOwoKLyogU2VlIFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCAqLwp0eXBlZGVmIGVudW0gewogICAgUklMX0RBVEFfUFJPRklMRV9ERUZBVUxUICAgID0gMCwKICAgIFJJTF9EQVRBX1BST0ZJTEVfVEVUSEVSRUQgICA9IDEsCiAgICBSSUxfREFUQV9QUk9GSUxFX09FTV9CQVNFICAgPSAxMDAwICAgIC8qIFN0YXJ0IG9mIE9FTS1zcGVjaWZpYyBwcm9maWxlcyAqLwp9IFJJTF9EYXRhUHJvZmlsZTsKCi8qIFVzZWQgYnkgUklMX1VOU09MX1NVUFBfU1ZDX05PVElGSUNBVElPTiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgICAgIG5vdGlmaWNhdGlvblR5cGU7ICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gTU8gaW50ZXJtZWRpYXRlIHJlc3VsdCBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMSA9IE1UIHVuc29saWNpdGVkIHJlc3VsdCBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpbnQgICAgIGNvZGU7ICAgICAgICAgICAgICAgLyogU2VlIDI3LjAwNyA3LjE3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZGUxIiBmb3IgTU8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZTIiIGZvciBNVC4gKi8KICAgIGludCAgICAgaW5kZXg7ICAgICAgICAgICAgICAvKiBDVUcgaW5kZXguIFNlZSAyNy4wMDcgNy4xNy4gKi8KICAgIGludCAgICAgdHlwZTsgICAgICAgICAgICAgICAvKiAidHlwZSIgZnJvbSAyNy4wMDcgNy4xNyAoTVQgb25seSkuICovCiAgICBjaGFyICogIG51bWJlcjsgICAgICAgICAgICAgLyogIm51bWJlciIgZnJvbSAyNy4wMDcgNy4xNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNVCBvbmx5LCBtYXkgYmUgTlVMTCkuICovCn0gUklMX1N1cHBTdmNOb3RpZmljYXRpb247CgojZGVmaW5lIFJJTF9DQVJEX01BWF9BUFBTICAgICA4Cgp0eXBlZGVmIGVudW0gewogICAgUklMX0NBUkRTVEFURV9BQlNFTlQgICA9IDAsCiAgICBSSUxfQ0FSRFNUQVRFX1BSRVNFTlQgID0gMSwKICAgIFJJTF9DQVJEU1RBVEVfRVJST1IgICAgPSAyCn0gUklMX0NhcmRTdGF0ZTsKCnR5cGVkZWYgZW51bSB7CiAgICBSSUxfUEVSU09TVUJTVEFURV9VTktOT1dOICAgICAgICAgICAgICAgICAgID0gMCwgLyogaW5pdGlhbCBzdGF0ZSAqLwogICAgUklMX1BFUlNPU1VCU1RBVEVfSU5fUFJPR1JFU1MgICAgICAgICAgICAgICA9IDEsIC8qIGluIGJldHdlZW4gZWFjaCBsb2NrIHRyYW5zaXRpb24gKi8KICAgIFJJTF9QRVJTT1NVQlNUQVRFX1JFQURZICAgICAgICAgICAgICAgICAgICAgPSAyLCAvKiB3aGVuIGVpdGhlciBTSU0gb3IgUlVJTSBQZXJzbyBpcyBmaW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIGVhY2ggYXBwIGNhbiBvbmx5IGhhdmUgMSBhY3RpdmUgcGVyc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvbHZlZCAqLwogICAgUklMX1BFUlNPU1VCU1RBVEVfU0lNX05FVFdPUksgICAgICAgICAgICAgICA9IDMsCiAgICBSSUxfUEVSU09TVUJTVEFURV9TSU1fTkVUV09SS19TVUJTRVQgICAgICAgID0gNCwKICAgIFJJTF9QRVJTT1NVQlNUQVRFX1NJTV9DT1JQT1JBVEUgICAgICAgICAgICAgPSA1LAogICAgUklMX1BFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0VfUFJPVklERVIgICAgICA9IDYsCiAgICBSSUxfUEVSU09TVUJTVEFURV9TSU1fU0lNICAgICAgICAgICAgICAgICAgID0gNywKICAgIFJJTF9QRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1BVSyAgICAgICAgICAgPSA4LCAvKiBUaGUgY29ycmVzcG9uZGluZyBwZXJzbyBsb2NrIGlzIGJsb2NrZWQgKi8KICAgIFJJTF9QRVJTT1NVQlNUQVRFX1NJTV9ORVRXT1JLX1NVQlNFVF9QVUsgICAgPSA5LAogICAgUklMX1BFUlNPU1VCU1RBVEVfU0lNX0NPUlBPUkFURV9QVUsgICAgICAgICA9IDEwLAogICAgUklMX1BFUlNPU1VCU1RBVEVfU0lNX1NFUlZJQ0VfUFJPVklERVJfUFVLICA9IDExLAogICAgUklMX1BFUlNPU1VCU1RBVEVfU0lNX1NJTV9QVUsgICAgICAgICAgICAgICA9IDEyLAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMSAgICAgICAgICAgICA9IDEzLAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMiAgICAgICAgICAgICA9IDE0LAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9IUlBEICAgICAgICAgICAgICAgICA9IDE1LAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9DT1JQT1JBVEUgICAgICAgICAgICA9IDE2LAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9TRVJWSUNFX1BST1ZJREVSICAgICA9IDE3LAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9SVUlNICAgICAgICAgICAgICAgICA9IDE4LAogICAgUklMX1BFUlNPU1VCU1RBVEVfUlVJTV9ORVRXT1JLMV9QVUsgICAgICAgICA9IDE5LCAvKiBUaGUgY29ycmVzcG9uZGluZyBwZXJzbyBsb2NrIGlzIGJsb2NrZWQgKi8KICAgIFJJTF9QRVJTT1NVQlNUQVRFX1JVSU1fTkVUV09SSzJfUFVLICAgICAgICAgPSAyMCwKICAgIFJJTF9QRVJTT1NVQlNUQVRFX1JVSU1fSFJQRF9QVUsgICAgICAgICAgICAgPSAyMSwKICAgIFJJTF9QRVJTT1NVQlNUQVRFX1JVSU1fQ09SUE9SQVRFX1BVSyAgICAgICAgPSAyMiwKICAgIFJJTF9QRVJTT1NVQlNUQVRFX1JVSU1fU0VSVklDRV9QUk9WSURFUl9QVUsgPSAyMywKICAgIFJJTF9QRVJTT1NVQlNUQVRFX1JVSU1fUlVJTV9QVUsgICAgICAgICAgICAgPSAyNAp9IFJJTF9QZXJzb1N1YnN0YXRlOwoKdHlwZWRlZiBlbnVtIHsKICAgIFJJTF9BUFBTVEFURV9VTktOT1dOICAgICAgICAgICAgICAgPSAwLAogICAgUklMX0FQUFNUQVRFX0RFVEVDVEVEICAgICAgICAgICAgICA9IDEsCiAgICBSSUxfQVBQU1RBVEVfUElOICAgICAgICAgICAgICAgICAgID0gMiwgLyogSWYgUElOMSBvciBVUGluIGlzIHJlcXVpcmVkICovCiAgICBSSUxfQVBQU1RBVEVfUFVLICAgICAgICAgICAgICAgICAgID0gMywgLyogSWYgUFVLMSBvciBQdWsgZm9yIFVQaW4gaXMgcmVxdWlyZWQgKi8KICAgIFJJTF9BUFBTVEFURV9TVUJTQ1JJUFRJT05fUEVSU08gICAgPSA0LCAvKiBwZXJzb19zdWJzdGF0ZSBzaG91bGQgYmUgbG9vayBhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYXBwX3N0YXRlIGlzIGFzc2lnbmVkIHRvIHRoaXMgdmFsdWUgKi8KICAgIFJJTF9BUFBTVEFURV9SRUFEWSAgICAgICAgICAgICAgICAgPSA1Cn0gUklMX0FwcFN0YXRlOwoKdHlwZWRlZiBlbnVtIHsKICAgIFJJTF9QSU5TVEFURV9VTktOT1dOICAgICAgICAgICAgICA9IDAsCiAgICBSSUxfUElOU1RBVEVfRU5BQkxFRF9OT1RfVkVSSUZJRUQgPSAxLAogICAgUklMX1BJTlNUQVRFX0VOQUJMRURfVkVSSUZJRUQgICAgID0gMiwKICAgIFJJTF9QSU5TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICA9IDMsCiAgICBSSUxfUElOU1RBVEVfRU5BQkxFRF9CTE9DS0VEICAgICAgPSA0LAogICAgUklMX1BJTlNUQVRFX0VOQUJMRURfUEVSTV9CTE9DS0VEID0gNQp9IFJJTF9QaW5TdGF0ZTsKCnR5cGVkZWYgZW51bSB7CiAgUklMX0FQUFRZUEVfVU5LTk9XTiA9IDAsCiAgUklMX0FQUFRZUEVfU0lNICAgICA9IDEsCiAgUklMX0FQUFRZUEVfVVNJTSAgICA9IDIsCiAgUklMX0FQUFRZUEVfUlVJTSAgICA9IDMsCiAgUklMX0FQUFRZUEVfQ1NJTSAgICA9IDQKfSBSSUxfQXBwVHlwZTsKCnR5cGVkZWYgc3RydWN0CnsKICBSSUxfQXBwVHlwZSAgICAgIGFwcF90eXBlOwogIFJJTF9BcHBTdGF0ZSAgICAgYXBwX3N0YXRlOwogIFJJTF9QZXJzb1N1YnN0YXRlIHBlcnNvX3N1YnN0YXRlOyAvKiBhcHBsaWNhYmxlIG9ubHkgaWYgYXBwX3N0YXRlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJTF9BUFBTVEFURV9TVUJTQ1JJUFRJT05fUEVSU08gKi8KICBjaGFyICAgICAgICAgICAgICphaWRfcHRyOyAgICAgICAgLyogbnVsbCB0ZXJtaW5hdGVkIHN0cmluZywgZS5nLiwgZnJvbSAweEEwLCAweDAwIC0+IDB4NDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsIDB4MzAsIDB4MzAgKi8KICBjaGFyICAgICAgICAgICAgICphcHBfbGFiZWxfcHRyOyAgLyogbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyAqLwogIGludCAgICAgICAgICAgICAgcGluMV9yZXBsYWNlZDsgICAvKiBhcHBsaWNhYmxlIHRvIFVTSU0gYW5kIENTSU0gKi8KICBSSUxfUGluU3RhdGUgICAgIHBpbjE7CiAgUklMX1BpblN0YXRlICAgICBwaW4yOwp9IFJJTF9BcHBTdGF0dXM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgUklMX0NhcmRTdGF0ZSBjYXJkX3N0YXRlOwogIFJJTF9QaW5TdGF0ZSAgdW5pdmVyc2FsX3Bpbl9zdGF0ZTsgICAgICAgICAgICAgLyogYXBwbGljYWJsZSB0byBVU0lNIGFuZCBDU0lNOiBSSUxfUElOU1RBVEVfeHh4ICovCiAgaW50ICAgICAgICAgICBnc21fdW10c19zdWJzY3JpcHRpb25fYXBwX2luZGV4OyAvKiB2YWx1ZSA8IFJJTF9DQVJEX01BWF9BUFBTICovCiAgaW50ICAgICAgICAgICBjZG1hX3N1YnNjcmlwdGlvbl9hcHBfaW5kZXg7ICAgICAvKiB2YWx1ZSA8IFJJTF9DQVJEX01BWF9BUFBTICovCiAgaW50ICAgICAgICAgICBudW1fYXBwbGljYXRpb25zOyAgICAgICAgICAgICAgICAvKiB2YWx1ZSA8PSBSSUxfQ0FSRF9NQVhfQVBQUyAqLwogIFJJTF9BcHBTdGF0dXMgYXBwbGljYXRpb25zW1JJTF9DQVJEX01BWF9BUFBTXTsKfSBSSUxfQ2FyZFN0YXR1czsKCi8qIFRoZSByZXN1bHQgb2YgYSBTSU0gcmVmcmVzaCwgcmV0dXJuZWQgaW4gZGF0YVswXSBvZiBSSUxfVU5TT0xfU0lNX1JFRlJFU0ggKi8KdHlwZWRlZiBlbnVtIHsKICAgIC8qIEEgZmlsZSBvbiBTSU0gaGFzIGJlZW4gdXBkYXRlZC4gIGRhdGFbMV0gY29udGFpbnMgdGhlIEVGSUQuICovCiAgICBTSU1fRklMRV9VUERBVEUgPSAwLAogICAgLyogU0lNIGluaXRpYWxpemVkLiAgQWxsIGZpbGVzIHNob3VsZCBiZSByZS1yZWFkLiAqLwogICAgU0lNX0lOSVQgPSAxLAogICAgLyogU0lNIHJlc2V0LiAgU0lNIHBvd2VyIHJlcXVpcmVkLCBTSU0gbWF5IGJlIGxvY2tlZCBhbmQgYWxsIGZpbGVzIHNob3VsZCBiZSByZS1yZWFkLiAqLwogICAgU0lNX1JFU0VUID0gMgp9IFJJTF9TaW1SZWZyZXNoUmVzdWx0OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciAqICAgICAgICAgIG51bWJlcjsgICAgICAgICAgICAgLyogUmVtb3RlIHBhcnR5IG51bWJlciAqLwogICAgaW50ICAgICAgICAgICAgIG51bWJlclByZXNlbnRhdGlvbjsgLyogMD1BbGxvd2VkLCAxPVJlc3RyaWN0ZWQsIDI9Tm90IFNwZWNpZmllZC9Vbmtub3duICovCiAgICBjaGFyICogICAgICAgICAgbmFtZTsgICAgICAgICAgICAgICAvKiBSZW1vdGUgcGFydHkgbmFtZSAqLwogICAgUklMX0NETUFfU2lnbmFsSW5mb1JlY29yZCBzaWduYWxJbmZvUmVjb3JkOwp9IFJJTF9DRE1BX0NhbGxXYWl0aW5nOwoKLyoqCiAqIFdoaWNoIHR5cGVzIG9mIENlbGwgQnJvYWRjYXN0IE1lc3NhZ2UgKENCTSkgYXJlIHRvIGJlIHJlY2VpdmVkIGJ5IHRoZSBNRQogKgogKiB1RnJvbVNlcnZpY2VJRCAtIHVUb1NlcnZpY2VJRCBkZWZpbmVzIGEgcmFuZ2Ugb2YgQ0JNIG1lc3NhZ2UgaWRlbnRpZmllcnMKICogd2hvc2UgdmFsdWUgaXMgMHgwMDAwIC0gMHhGRkZGIGFzIGRlZmluZWQgaW4gVFMgMjMuMDQxIDkuNC4xLjIuMiBmb3IgR01TCiAqIGFuZCA5LjQuNC4yLjIgZm9yIFVNVFMuIEFsbCBvdGhlciB2YWx1ZXMgY2FuIGJlIHRyZWF0ZWQgYXMgZW1wdHkKICogQ0JNIG1lc3NhZ2UgSUQuCiAqCiAqIHVGcm9tQ29kZVNjaGVtZSAtIHVUb0NvZGVTY2hlbWUgZGVmaW5lcyBhIHJhbmdlIG9mIENCTSBkYXRhIGNvZGluZyBzY2hlbWVzCiAqIHdob3NlIHZhbHVlIGlzIDB4MDAgLSAweEZGIGFzIGRlZmluZWQgaW4gVFMgMjMuMDQxIDkuNC4xLjIuMyBmb3IgR01TCiAqIGFuZCA5LjQuNC4yLjMgZm9yIFVNVFMuCiAqIEFsbCBvdGhlciB2YWx1ZXMgY2FuIGJlIHRyZWF0ZWQgYXMgZW1wdHkgQ0JNIGRhdGEgY29kaW5nIHNjaGVtZS4KICoKICogc2VsZWN0ZWQgMCBtZWFucyBtZXNzYWdlIHR5cGVzIHNwZWNpZmllZCBpbiA8ZnJvbVNlcnZpY2VJZCwgdG9TZXJ2aWNlSWQ+CiAqIGFuZCA8ZnJvbUNvZGVTY2hlbWUsIHRvQ29kZVNjaGVtZT5hcmUgbm90IGFjY2VwdGVkLCB3aGlsZSAxIG1lYW5zIGFjY2VwdGVkLgogKgogKiBVc2VkIGJ5IFJJTF9SRVFVRVNUX0dTTV9HRVRfQlJPQURDQVNUX0NPTkZJRyBhbmQKICogUklMX1JFUVVFU1RfR1NNX1NFVF9CUk9BRENBU1RfQ09ORklHLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IGZyb21TZXJ2aWNlSWQ7CiAgICBpbnQgdG9TZXJ2aWNlSWQ7CiAgICBpbnQgZnJvbUNvZGVTY2hlbWU7CiAgICBpbnQgdG9Db2RlU2NoZW1lOwogICAgdW5zaWduZWQgY2hhciBzZWxlY3RlZDsKfSBSSUxfR1NNX0Jyb2FkY2FzdFNtc0NvbmZpZ0luZm87CgovKiBObyByZXN0cmljdGlvbiBhdCBhbGwgaW5jbHVkaW5nIHZvaWNlL1NNUy9VU1NEL1NTL0FWNjQgYW5kIHBhY2tldCBkYXRhLiAqLwojZGVmaW5lIFJJTF9SRVNUUklDVEVEX1NUQVRFX05PTkUgICAgICAgICAgIDB4MDAKLyogQmxvY2sgZW1lcmdlbmN5IGNhbGwgZHVlIHRvIHJlc3RyaWN0aW9uLiBCdXQgYWxsb3cgYWxsIG5vcm1hbCB2b2ljZS9TTVMvVVNTRC9TUy9BVjY0LiAqLwojZGVmaW5lIFJJTF9SRVNUUklDVEVEX1NUQVRFX0NTX0VNRVJHRU5DWSAgIDB4MDEKLyogQmxvY2sgYWxsIG5vcm1hbCB2b2ljZS9TTVMvVVNTRC9TUy9BVjY0IGR1ZSB0byByZXN0cmljdGlvbi4gT25seSBFbWVyZ2VuY3kgY2FsbCBhbGxvd2VkLiAqLwojZGVmaW5lIFJJTF9SRVNUUklDVEVEX1NUQVRFX0NTX05PUk1BTCAgICAgIDB4MDIKLyogQmxvY2sgYWxsIHZvaWNlL1NNUy9VU1NEL1NTL0FWNjQgaW5jbHVkaW5nIGVtZXJnZW5jeSBjYWxsIGR1ZSB0byByZXN0cmljdGlvbi4qLwojZGVmaW5lIFJJTF9SRVNUUklDVEVEX1NUQVRFX0NTX0FMTCAgICAgICAgIDB4MDQKLyogQmxvY2sgcGFja2V0IGRhdGEgYWNjZXNzIGR1ZSB0byByZXN0cmljdGlvbi4gKi8KI2RlZmluZSBSSUxfUkVTVFJJQ1RFRF9TVEFURV9QU19BTEwgICAgICAgICAweDEwCgovKiBUaGUgc3RhdHVzIGZvciBhbiBPVEFTUC9PVEFQQSBzZXNzaW9uICovCnR5cGVkZWYgZW51bSB7CiAgICBDRE1BX09UQV9QUk9WSVNJT05fU1RBVFVTX1NQTF9VTkxPQ0tFRCwKICAgIENETUFfT1RBX1BST1ZJU0lPTl9TVEFUVVNfU1BDX1JFVFJJRVNfRVhDRUVERUQsCiAgICBDRE1BX09UQV9QUk9WSVNJT05fU1RBVFVTX0FfS0VZX0VYQ0hBTkdFRCwKICAgIENETUFfT1RBX1BST1ZJU0lPTl9TVEFUVVNfU1NEX1VQREFURUQsCiAgICBDRE1BX09UQV9QUk9WSVNJT05fU1RBVFVTX05BTV9ET1dOTE9BREVELAogICAgQ0RNQV9PVEFfUFJPVklTSU9OX1NUQVRVU19NRE5fRE9XTkxPQURFRCwKICAgIENETUFfT1RBX1BST1ZJU0lPTl9TVEFUVVNfSU1TSV9ET1dOTE9BREVELAogICAgQ0RNQV9PVEFfUFJPVklTSU9OX1NUQVRVU19QUkxfRE9XTkxPQURFRCwKICAgIENETUFfT1RBX1BST1ZJU0lPTl9TVEFUVVNfQ09NTUlUVEVELAogICAgQ0RNQV9PVEFfUFJPVklTSU9OX1NUQVRVU19PVEFQQV9TVEFSVEVELAogICAgQ0RNQV9PVEFfUFJPVklTSU9OX1NUQVRVU19PVEFQQV9TVE9QUEVELAogICAgQ0RNQV9PVEFfUFJPVklTSU9OX1NUQVRVU19PVEFQQV9BQk9SVEVECn0gUklMX0NETUFfT1RBX1Byb3Zpc2lvblN0YXR1czsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBzaWduYWxTdHJlbmd0aDsgIC8qIFZhbGlkIHZhbHVlcyBhcmUgKDAtMzEsIDk5KSBhcyBkZWZpbmVkIGluIFRTIDI3LjAwNyA4LjUgKi8KICAgIGludCBiaXRFcnJvclJhdGU7ICAgIC8qIGJpdCBlcnJvciByYXRlICgwLTcsIDk5KSBhcyBkZWZpbmVkIGluIFRTIDI3LjAwNyA4LjUgKi8KfSBSSUxfR1dfU2lnbmFsU3RyZW5ndGg7CgoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IGRibTsgIC8qIFZhbGlkIHZhbHVlcyBhcmUgcG9zaXRpdmUgaW50ZWdlcnMuICBUaGlzIHZhbHVlIGlzIHRoZSBhY3R1YWwgUlNTSSB2YWx1ZQogICAgICAgICAgICAgICAqIG11bHRpcGxpZWQgYnkgLTEuICBFeGFtcGxlOiBJZiB0aGUgYWN0dWFsIFJTU0kgaXMgLTc1LCB0aGVuIHRoaXMgcmVzcG9uc2UKICAgICAgICAgICAgICAgKiB2YWx1ZSB3aWxsIGJlIDc1LgogICAgICAgICAgICAgICAqLwogICAgaW50IGVjaW87IC8qIFZhbGlkIHZhbHVlcyBhcmUgcG9zaXRpdmUgaW50ZWdlcnMuICBUaGlzIHZhbHVlIGlzIHRoZSBhY3R1YWwgRWMvSW8gbXVsdGlwbGllZAogICAgICAgICAgICAgICAqIGJ5IC0xMC4gIEV4YW1wbGU6IElmIHRoZSBhY3R1YWwgRWMvSW8gaXMgLTEyLjUgZEIsIHRoZW4gdGhpcyByZXNwb25zZSB2YWx1ZQogICAgICAgICAgICAgICAqIHdpbGwgYmUgMTI1LgogICAgICAgICAgICAgICAqLwp9IFJJTF9DRE1BX1NpZ25hbFN0cmVuZ3RoOwoKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCBkYm07ICAvKiBWYWxpZCB2YWx1ZXMgYXJlIHBvc2l0aXZlIGludGVnZXJzLiAgVGhpcyB2YWx1ZSBpcyB0aGUgYWN0dWFsIFJTU0kgdmFsdWUKICAgICAgICAgICAgICAgKiBtdWx0aXBsaWVkIGJ5IC0xLiAgRXhhbXBsZTogSWYgdGhlIGFjdHVhbCBSU1NJIGlzIC03NSwgdGhlbiB0aGlzIHJlc3BvbnNlCiAgICAgICAgICAgICAgICogdmFsdWUgd2lsbCBiZSA3NS4KICAgICAgICAgICAgICAgKi8KICAgIGludCBlY2lvOyAvKiBWYWxpZCB2YWx1ZXMgYXJlIHBvc2l0aXZlIGludGVnZXJzLiAgVGhpcyB2YWx1ZSBpcyB0aGUgYWN0dWFsIEVjL0lvIG11bHRpcGxpZWQKICAgICAgICAgICAgICAgKiBieSAtMTAuICBFeGFtcGxlOiBJZiB0aGUgYWN0dWFsIEVjL0lvIGlzIC0xMi41IGRCLCB0aGVuIHRoaXMgcmVzcG9uc2UgdmFsdWUKICAgICAgICAgICAgICAgKiB3aWxsIGJlIDEyNS4KICAgICAgICAgICAgICAgKi8KICAgIGludCBzaWduYWxOb2lzZVJhdGlvOyAvKiBWYWxpZCB2YWx1ZXMgYXJlIDAtOC4gIDggaXMgdGhlIGhpZ2hlc3Qgc2lnbmFsIHRvIG5vaXNlIHJhdGlvLiAqLwp9IFJJTF9FVkRPX1NpZ25hbFN0cmVuZ3RoOwoKCnR5cGVkZWYgc3RydWN0IHsKICAgIFJJTF9HV19TaWduYWxTdHJlbmd0aCAgIEdXX1NpZ25hbFN0cmVuZ3RoOwogICAgUklMX0NETUFfU2lnbmFsU3RyZW5ndGggQ0RNQV9TaWduYWxTdHJlbmd0aDsKICAgIFJJTF9FVkRPX1NpZ25hbFN0cmVuZ3RoIEVWRE9fU2lnbmFsU3RyZW5ndGg7Cn0gUklMX1NpZ25hbFN0cmVuZ3RoOwoKLyogTmFtZXMgb2YgdGhlIENETUEgaW5mbyByZWNvcmRzIChDLlMwMDA1IHNlY3Rpb24gMy43LjUpICovCnR5cGVkZWYgZW51bSB7CiAgUklMX0NETUFfRElTUExBWV9JTkZPX1JFQywKICBSSUxfQ0RNQV9DQUxMRURfUEFSVFlfTlVNQkVSX0lORk9fUkVDLAogIFJJTF9DRE1BX0NBTExJTkdfUEFSVFlfTlVNQkVSX0lORk9fUkVDLAogIFJJTF9DRE1BX0NPTk5FQ1RFRF9OVU1CRVJfSU5GT19SRUMsCiAgUklMX0NETUFfU0lHTkFMX0lORk9fUkVDLAogIFJJTF9DRE1BX1JFRElSRUNUSU5HX05VTUJFUl9JTkZPX1JFQywKICBSSUxfQ0RNQV9MSU5FX0NPTlRST0xfSU5GT19SRUMsCiAgUklMX0NETUFfRVhURU5ERURfRElTUExBWV9JTkZPX1JFQywKICBSSUxfQ0RNQV9UNTNfQ0xJUl9JTkZPX1JFQywKICBSSUxfQ0RNQV9UNTNfUkVMRUFTRV9JTkZPX1JFQywKICBSSUxfQ0RNQV9UNTNfQVVESU9fQ09OVFJPTF9JTkZPX1JFQwp9IFJJTF9DRE1BX0luZm9SZWNOYW1lOwoKLyogRGlzcGxheSBJbmZvIFJlYyBhcyBkZWZpbmVkIGluIEMuUzAwMDUgc2VjdGlvbiAzLjcuNS4xCiAgIEV4dGVuZGVkIERpc3BsYXkgSW5mbyBSZWMgYXMgZGVmaW5lZCBpbiBDLlMwMDA1IHNlY3Rpb24gMy43LjUuMTYKICAgTm90ZTogdGhlIEV4dGVuZGVkIERpc3BsYXkgaW5mbyByZWMgY29udGFpbnMgbXVsdGlwbGUgcmVjb3JkcyBvZiB0aGUKICAgZm9ybTogZGlzcGxheV90YWcsIGRpc3BsYXlfbGVuLCBhbmQgZGlzcGxheV9sZW4gb2NjdXJyZW5jZXMgb2YgdGhlCiAgIGNoYXJpIGZpZWxkIGlmIHRoZSBkaXNwbGF5X3RhZyBpcyBub3QgMTAwMDAwMDAgb3IgMTAwMDAwMDEuCiAgIFRvIHNhdmUgc3BhY2UsIHRoZSByZWNvcmRzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseSBpbiBhIGJ5dGUgYnVmZmVyLgogICBUaGUgZGlzcGxheV90YWcsIGRpc3BsYXlfbGVuIGFuZCBjaGFyaSBmaWVsZHMgYXJlIGFsbCAxIGJ5dGUuCiovCgp0eXBlZGVmIHN0cnVjdCB7CiAgY2hhciBhbHBoYV9sZW47CiAgY2hhciBhbHBoYV9idWZbQ0RNQV9BTFBIQV9JTkZPX0JVRkZFUl9MRU5HVEhdOwp9IFJJTF9DRE1BX0Rpc3BsYXlJbmZvUmVjb3JkOwoKLyogQ2FsbGVkIFBhcnR5IE51bWJlciBJbmZvIFJlYyBhcyBkZWZpbmVkIGluIEMuUzAwMDUgc2VjdGlvbiAzLjcuNS4yCiAgIENhbGxpbmcgUGFydHkgTnVtYmVyIEluZm8gUmVjIGFzIGRlZmluZWQgaW4gQy5TMDAwNSBzZWN0aW9uIDMuNy41LjMKICAgQ29ubmVjdGVkIE51bWJlciBJbmZvIFJlYyBhcyBkZWZpbmVkIGluIEMuUzAwMDUgc2VjdGlvbiAzLjcuNS40CiovCgp0eXBlZGVmIHN0cnVjdCB7CiAgY2hhciBsZW47CiAgY2hhciBidWZbQ0RNQV9OVU1CRVJfSU5GT19CVUZGRVJfTEVOR1RIXTsKICBjaGFyIG51bWJlcl90eXBlOwogIGNoYXIgbnVtYmVyX3BsYW47CiAgY2hhciBwaTsKICBjaGFyIHNpOwp9IFJJTF9DRE1BX051bWJlckluZm9SZWNvcmQ7CgovKiBSZWRpcmVjdGluZyBOdW1iZXIgSW5mb3JtYXRpb24gUmVjb3JkIGFzIGRlZmluZWQgaW4gQy5TMDAwNSBzZWN0aW9uIDMuNy41LjExICovCnR5cGVkZWYgZW51bSB7CiAgUklMX1JFRElSRUNUSU5HX1JFQVNPTl9VTktOT1dOID0gMCwKICBSSUxfUkVESVJFQ1RJTkdfUkVBU09OX0NBTExfRk9SV0FSRElOR19CVVNZID0gMSwKICBSSUxfUkVESVJFQ1RJTkdfUkVBU09OX0NBTExfRk9SV0FSRElOR19OT19SRVBMWSA9IDIsCiAgUklMX1JFRElSRUNUSU5HX1JFQVNPTl9DQUxMRURfRFRFX09VVF9PRl9PUkRFUiA9IDksCiAgUklMX1JFRElSRUNUSU5HX1JFQVNPTl9DQUxMX0ZPUldBUkRJTkdfQllfVEhFX0NBTExFRF9EVEUgPSAxMCwKICBSSUxfUkVESVJFQ1RJTkdfUkVBU09OX0NBTExfRk9SV0FSRElOR19VTkNPTkRJVElPTkFMID0gMTUsCiAgUklMX1JFRElSRUNUSU5HX1JFQVNPTl9SRVNFUlZFRAp9IFJJTF9DRE1BX1JlZGlyZWN0aW5nUmVhc29uOwoKdHlwZWRlZiBzdHJ1Y3QgewogIFJJTF9DRE1BX051bWJlckluZm9SZWNvcmQgcmVkaXJlY3RpbmdOdW1iZXI7CiAgLyogcmVkaXJlY3RpbmdSZWFzb24gaXMgc2V0IHRvIFJJTF9SRURJUkVDVElOR19SRUFTT05fVU5LTk9XTiBpZiBub3QgaW5jbHVkZWQgKi8KICBSSUxfQ0RNQV9SZWRpcmVjdGluZ1JlYXNvbiByZWRpcmVjdGluZ1JlYXNvbjsKfSBSSUxfQ0RNQV9SZWRpcmVjdGluZ051bWJlckluZm9SZWNvcmQ7CgovKiBMaW5lIENvbnRyb2wgSW5mb3JtYXRpb24gUmVjb3JkIGFzIGRlZmluZWQgaW4gQy5TMDAwNSBzZWN0aW9uIDMuNy41LjE1ICovCnR5cGVkZWYgc3RydWN0IHsKICBjaGFyIGxpbmVDdHJsUG9sYXJpdHlJbmNsdWRlZDsKICBjaGFyIGxpbmVDdHJsVG9nZ2xlOwogIGNoYXIgbGluZUN0cmxSZXZlcnNlOwogIGNoYXIgbGluZUN0cmxQb3dlckRlbmlhbDsKfSBSSUxfQ0RNQV9MaW5lQ29udHJvbEluZm9SZWNvcmQ7CgovKiBUNTMgQ0xJUiBJbmZvcm1hdGlvbiBSZWNvcmQgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIGNoYXIgY2F1c2U7Cn0gUklMX0NETUFfVDUzX0NMSVJJbmZvUmVjb3JkOwoKLyogVDUzIEF1ZGlvIENvbnRyb2wgSW5mb3JtYXRpb24gUmVjb3JkICovCnR5cGVkZWYgc3RydWN0IHsKICBjaGFyIHVwTGluazsKICBjaGFyIGRvd25MaW5rOwp9IFJJTF9DRE1BX1Q1M19BdWRpb0NvbnRyb2xJbmZvUmVjb3JkOwoKdHlwZWRlZiBzdHJ1Y3QgewoKICBSSUxfQ0RNQV9JbmZvUmVjTmFtZSBuYW1lOwoKICB1bmlvbiB7CiAgICAvKiBEaXNwbGF5IGFuZCBFeHRlbmRlZCBEaXNwbGF5IEluZm8gUmVjICovCiAgICBSSUxfQ0RNQV9EaXNwbGF5SW5mb1JlY29yZCAgICAgICAgICAgZGlzcGxheTsKCiAgICAvKiBDYWxsZWQgUGFydHkgTnVtYmVyLCBDYWxsaW5nIFBhcnR5IE51bWJlciwgQ29ubmVjdGVkIE51bWJlciBJbmZvIFJlYyAqLwogICAgUklMX0NETUFfTnVtYmVySW5mb1JlY29yZCAgICAgICAgICAgIG51bWJlcjsKCiAgICAvKiBTaWduYWwgSW5mbyBSZWMgKi8KICAgIFJJTF9DRE1BX1NpZ25hbEluZm9SZWNvcmQgICAgICAgICAgICBzaWduYWw7CgogICAgLyogUmVkaXJlY3RpbmcgTnVtYmVyIEluZm8gUmVjICovCiAgICBSSUxfQ0RNQV9SZWRpcmVjdGluZ051bWJlckluZm9SZWNvcmQgcmVkaXI7CgogICAgLyogTGluZSBDb250cm9sIEluZm8gUmVjICovCiAgICBSSUxfQ0RNQV9MaW5lQ29udHJvbEluZm9SZWNvcmQgICAgICAgbGluZUN0cmw7CgogICAgLyogVDUzIENMSVIgSW5mbyBSZWMgKi8KICAgIFJJTF9DRE1BX1Q1M19DTElSSW5mb1JlY29yZCAgICAgICAgICBjbGlyOwoKICAgIC8qIFQ1MyBBdWRpbyBDb250cm9sIEluZm8gUmVjICovCiAgICBSSUxfQ0RNQV9UNTNfQXVkaW9Db250cm9sSW5mb1JlY29yZCAgYXVkaW9DdHJsOwogIH0gcmVjOwp9IFJJTF9DRE1BX0luZm9ybWF0aW9uUmVjb3JkOwoKI2RlZmluZSBSSUxfQ0RNQV9NQVhfTlVNQkVSX09GX0lORk9fUkVDUyAxMAoKdHlwZWRlZiBzdHJ1Y3QgewogIGNoYXIgbnVtYmVyT2ZJbmZvUmVjczsKICBSSUxfQ0RNQV9JbmZvcm1hdGlvblJlY29yZCBpbmZvUmVjW1JJTF9DRE1BX01BWF9OVU1CRVJfT0ZfSU5GT19SRUNTXTsKfSBSSUxfQ0RNQV9JbmZvcm1hdGlvblJlY29yZHM7CgovKioKICogUklMX1JFUVVFU1RfR0VUX1NJTV9TVEFUVVMKICoKICogUmVxdWVzdHMgc3RhdHVzIG9mIHRoZSBTSU0gaW50ZXJmYWNlIGFuZCB0aGUgU0lNIGNhcmQKICoKICogImRhdGEiIGlzIE5VTEwKICoKICogInJlc3BvbnNlIiBpcyBjb25zdCBSSUxfQ2FyZFN0YXR1cyAqCiAqCiAqIFZhbGlkIGVycm9yczoKICogIE11c3QgbmV2ZXIgZmFpbAogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9HRVRfU0lNX1NUQVRVUyAxCgovKioKICogUklMX1JFUVVFU1RfRU5URVJfU0lNX1BJTgogKgogKiBTdXBwbGllcyBTSU0gUElOLiBPbmx5IGNhbGxlZCBpZiBSSUxfQ2FyZFN0YXR1cyBoYXMgUklMX0FQUFNUQVRFX1BJTiBzdGF0ZQogKgogKiAiZGF0YSIgaXMgY29uc3QgY2hhciAqKgogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaXMgUElOIHZhbHVlCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHJlbWFpbmluZywgb3IgLTEgaWYgdW5rbm93bgogKgogKiBWYWxpZCBlcnJvcnM6CiAqCiAqIFNVQ0NFU1MKICogUkFESU9fTk9UX0FWQUlMQUJMRSAocmFkaW8gcmVzZXR0aW5nKQogKiBHRU5FUklDX0ZBSUxVUkUKICogUEFTU1dPUkRfSU5DT1JSRUNUCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9FTlRFUl9TSU1fUElOIDIKCgovKioKICogUklMX1JFUVVFU1RfRU5URVJfU0lNX1BVSwogKgogKiBTdXBwbGllcyBTSU0gUFVLIGFuZCBuZXcgUElOLgogKgogKiAiZGF0YSIgaXMgY29uc3QgY2hhciAqKgogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaXMgUFVLIHZhbHVlCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVsxXSBpcyBuZXcgUElOIHZhbHVlCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHJlbWFpbmluZywgb3IgLTEgaWYgdW5rbm93bgogKgogKiBWYWxpZCBlcnJvcnM6CiAqCiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICogIFBBU1NXT1JEX0lOQ09SUkVDVAogKiAgICAgKFBVSyBpcyBpbnZhbGlkKQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfRU5URVJfU0lNX1BVSyAzCgovKioKICogUklMX1JFUVVFU1RfRU5URVJfU0lNX1BJTjIKICoKICogU3VwcGxpZXMgU0lNIFBJTjIuIE9ubHkgY2FsbGVkIGZvbGxvd2luZyBvcGVyYXRpb24gd2hlcmUgU0lNX1BJTjIgd2FzCiAqIHJldHVybmVkIGFzIGEgYSBmYWlsdXJlIGZyb20gYSBwcmV2aW91cyBvcGVyYXRpb24uCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpcyBQSU4yIHZhbHVlCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHJlbWFpbmluZywgb3IgLTEgaWYgdW5rbm93bgogKgogKiBWYWxpZCBlcnJvcnM6CiAqCiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICogIFBBU1NXT1JEX0lOQ09SUkVDVAogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfRU5URVJfU0lNX1BJTjIgNAoKLyoqCiAqIFJJTF9SRVFVRVNUX0VOVEVSX1NJTV9QVUsyCiAqCiAqIFN1cHBsaWVzIFNJTSBQVUsyIGFuZCBuZXcgUElOMi4KICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzBdIGlzIFBVSzIgdmFsdWUKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdIGlzIG5ldyBQSU4yIHZhbHVlCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHJlbWFpbmluZywgb3IgLTEgaWYgdW5rbm93bgogKgogKiBWYWxpZCBlcnJvcnM6CiAqCiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICogIFBBU1NXT1JEX0lOQ09SUkVDVAogKiAgICAgKFBVSzIgaXMgaW52YWxpZCkKICovCgojZGVmaW5lIFJJTF9SRVFVRVNUX0VOVEVSX1NJTV9QVUsyIDUKCi8qKgogKiBSSUxfUkVRVUVTVF9DSEFOR0VfU0lNX1BJTgogKgogKiBTdXBwbGllcyBvbGQgU0lNIFBJTiBhbmQgbmV3IFBJTi4KICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzBdIGlzIG9sZCBQSU4gdmFsdWUKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdIGlzIG5ldyBQSU4gdmFsdWUKICoKICogInJlc3BvbnNlIiBpcyBpbnQgKgogKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgcmVtYWluaW5nLCBvciAtMSBpZiB1bmtub3duCiAqCiAqIFZhbGlkIGVycm9yczoKICoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKiAgUEFTU1dPUkRfSU5DT1JSRUNUCiAqICAgICAob2xkIFBJTiBpcyBpbnZhbGlkKQogKgogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0hBTkdFX1NJTV9QSU4gNgoKCi8qKgogKiBSSUxfUkVRVUVTVF9DSEFOR0VfU0lNX1BJTjIKICoKICogU3VwcGxpZXMgb2xkIFNJTSBQSU4yIGFuZCBuZXcgUElOMi4KICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzBdIGlzIG9sZCBQSU4yIHZhbHVlCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVsxXSBpcyBuZXcgUElOMiB2YWx1ZQogKgogKiAicmVzcG9uc2UiIGlzIGludCAqCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzIHRoZSBudW1iZXIgb2YgcmV0cmllcyByZW1haW5pbmcsIG9yIC0xIGlmIHVua25vd24KICoKICogVmFsaWQgZXJyb3JzOgogKgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRSAocmFkaW8gcmVzZXR0aW5nKQogKiAgR0VORVJJQ19GQUlMVVJFCiAqICBQQVNTV09SRF9JTkNPUlJFQ1QKICogICAgIChvbGQgUElOMiBpcyBpbnZhbGlkKQogKgogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0hBTkdFX1NJTV9QSU4yIDcKCi8qKgogKiBSSUxfUkVRVUVTVF9FTlRFUl9ORVRXT1JLX0RFUEVSU09OQUxJWkFUSU9OCiAqCiAqIFJlcXVlc3RzIHRoYXQgbmV0d29yayBwZXJzb25saXphdGlvbiBiZSBkZWFjdGl2YXRlZAogKgogKiAiZGF0YSIgaXMgY29uc3QgY2hhciAqKgogKiAoKGNvbnN0IGNoYXIgKiopKGRhdGEpKVswXV0gaXMgbmV0d29yayBkZXBlcnNvbmxpemF0aW9uIGNvZGUKICoKICogInJlc3BvbnNlIiBpcyBpbnQgKgogKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyB0aGUgbnVtYmVyIG9mIHJldHJpZXMgcmVtYWluaW5nLCBvciAtMSBpZiB1bmtub3duCiAqCiAqIFZhbGlkIGVycm9yczoKICoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKiAgUEFTU1dPUkRfSU5DT1JSRUNUCiAqICAgICAoY29kZSBpcyBpbnZhbGlkKQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfRU5URVJfTkVUV09SS19ERVBFUlNPTkFMSVpBVElPTiA4CgovKioKICogUklMX1JFUVVFU1RfR0VUX0NVUlJFTlRfQ0FMTFMKICoKICogUmVxdWVzdHMgY3VycmVudCBjYWxsIGxpc3QKICoKICogImRhdGEiIGlzIE5VTEwKICoKICogInJlc3BvbnNlIiBtdXN0IGJlIGEgImNvbnN0IFJJTF9DYWxsICoqIgogKgogKiBWYWxpZCBlcnJvcnM6CiAqCiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICogICAgICAocmVxdWVzdCB3aWxsIGJlIG1hZGUgYWdhaW4gaW4gYSBmZXcgaHVuZHJlZCBtc2VjKQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX0NVUlJFTlRfQ0FMTFMgOQoKCi8qKgogKiBSSUxfUkVRVUVTVF9ESUFMCiAqCiAqIEluaXRpYXRlIHZvaWNlIGNhbGwKICoKICogImRhdGEiIGlzIGNvbnN0IFJJTF9EaWFsICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFRoaXMgbWV0aG9kIGlzIG5ldmVyIHVzZWQgZm9yIHN1cHBsZW1lbnRhcnkgc2VydmljZSBjb2RlcwogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfRElBTCAxMAoKLyoqCiAqIFJJTF9SRVFVRVNUX0dFVF9JTVNJCiAqCiAqIEdldCB0aGUgU0lNIElNU0kKICoKICogT25seSB2YWxpZCB3aGVuIHJhZGlvIHN0YXRlIGlzICJSQURJT19TVEFURV9TSU1fUkVBRFkiCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgYSBjb25zdCBjaGFyICogY29udGFpbmluZyB0aGUgSU1TSQogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCgojZGVmaW5lIFJJTF9SRVFVRVNUX0dFVF9JTVNJIDExCgovKioKICogUklMX1JFUVVFU1RfSEFOR1VQCiAqCiAqIEhhbmcgdXAgYSBzcGVjaWZpYyBsaW5lIChsaWtlIEFUK0NITEQ9MXgpCiAqCiAqICJkYXRhIiBpcyBhbiBpbnQgKgogKiAoaW50ICopZGF0YSlbMF0gY29udGFpbnMgQ29ubmVjdGlvbiBpbmRleCAodmFsdWUgb2YgJ3gnIGluIENITEQgYWJvdmUpCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCgojZGVmaW5lIFJJTF9SRVFVRVNUX0hBTkdVUCAxMgoKLyoqCiAqIFJJTF9SRVFVRVNUX0hBTkdVUF9XQUlUSU5HX09SX0JBQ0tHUk9VTkQKICoKICogSGFuZyB1cCB3YWl0aW5nIG9yIGhlbGQgKGxpa2UgQVQrQ0hMRD0wKQogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRSAocmFkaW8gcmVzZXR0aW5nKQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9IQU5HVVBfV0FJVElOR19PUl9CQUNLR1JPVU5EIDEzCgovKioKICogUklMX1JFUVVFU1RfSEFOR1VQX0ZPUkVHUk9VTkRfUkVTVU1FX0JBQ0tHUk9VTkQKICoKICogSGFuZyB1cCB3YWl0aW5nIG9yIGhlbGQgKGxpa2UgQVQrQ0hMRD0xKQogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRSAocmFkaW8gcmVzZXR0aW5nKQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9IQU5HVVBfRk9SRUdST1VORF9SRVNVTUVfQkFDS0dST1VORCAxNAoKLyoqCiAqIFJJTF9SRVFVRVNUX1NXSVRDSF9XQUlUSU5HX09SX0hPTERJTkdfQU5EX0FDVElWRQogKgogKiBTd2l0Y2ggd2FpdGluZyBvciBob2xkaW5nIGNhbGwgYW5kIGFjdGl2ZSBjYWxsIChsaWtlIEFUK0NITEQ9MikKICoKICogU3RhdGUgdHJhbnNpdGlvbnMgc2hvdWxkIGJlIGlzIGZvbGxvd3M6CiAqCiAqIElmIGNhbGwgMSBpcyB3YWl0aW5nIGFuZCBjYWxsIDIgaXMgYWN0aXZlLCB0aGVuIGlmIHRoaXMgcmUKICoKICogICBCRUZPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZURVIKICogQ2FsbCAxICAgQ2FsbCAyICAgICAgICAgICAgICAgICBDYWxsIDEgICAgICAgQ2FsbCAyCiAqIEFDVElWRSAgIEhPTERJTkcgICAgICAgICAgICAgICAgSE9MRElORyAgICAgQUNUSVZFCiAqIEFDVElWRSAgIFdBSVRJTkcgICAgICAgICAgICAgICAgSE9MRElORyAgICAgQUNUSVZFCiAqIEhPTERJTkcgIFdBSVRJTkcgICAgICAgICAgICAgICAgSE9MRElORyAgICAgQUNUSVZFCiAqIEFDVElWRSAgIElETEUgICAgICAgICAgICAgICAgICAgSE9MRElORyAgICAgSURMRQogKiBJRExFICAgICBJRExFICAgICAgICAgICAgICAgICAgIElETEUgICAgICAgIElETEUKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfU1dJVENIX1dBSVRJTkdfT1JfSE9MRElOR19BTkRfQUNUSVZFIDE1CiNkZWZpbmUgUklMX1JFUVVFU1RfU1dJVENIX0hPTERJTkdfQU5EX0FDVElWRSAxNQoKLyoqCiAqIFJJTF9SRVFVRVNUX0NPTkZFUkVOQ0UKICoKICogQ29uZmVyZW5jZSBob2xkaW5nIGFuZCBhY3RpdmUgKGxpa2UgQVQrQ0hMRD0zKQoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9DT05GRVJFTkNFIDE2CgovKioKICogUklMX1JFUVVFU1RfVURVQgogKgogKiBTZW5kIFVEVUIgKHVzZXIgZGV0ZXJtaW5lZCB1c2VkIGJ1c3kpIHRvIHJpbmdpbmcgb3IKICogd2FpdGluZyBjYWxsIGFuc3dlcikoUklMX0Jhc2ljUmVxdWVzdCByKTsKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9VRFVCIDE3CgovKioKICogUklMX1JFUVVFU1RfTEFTVF9DQUxMX0ZBSUxfQ0FVU0UKICoKICogUmVxdWVzdHMgdGhlIGZhaWx1cmUgY2F1c2UgY29kZSBmb3IgdGhlIG1vc3QgcmVjZW50bHkgdGVybWluYXRlZCBjYWxsCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgYSAiaW50ICoiCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzIFJJTF9MYXN0Q2FsbEZhaWxDYXVzZS4gIEdTTSBmYWlsdXJlIHJlYXNvbnMgYXJlCiAqIG1hcHBlZCB0byBjYXVzZSBjb2RlcyBkZWZpbmVkIGluIFRTIDI0LjAwOCBBbm5leCBIIHdoZXJlIHBvc3NpYmxlLiBDRE1BCiAqIGZhaWx1cmUgcmVhc29ucyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBwb3NzaWJsZSBjYWxsIGZhaWx1cmUgc2NlbmFyaW9zCiAqIGRlc2NyaWJlZCBpbiB0aGUgIkNETUEgSVMtMjAwMCBSZWxlYXNlIEEgKEMuUzAwMDUtQSB2Ni4wKSIgc3RhbmRhcmQuCiAqCiAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIENBTExfRkFJTF9FUlJPUl9VTlNQRUNJRklFRCBmb3IgYmxvY2tlZAogKiBNTyBjYWxscyBieSByZXN0cmljdGVkIHN0YXRlIChTZWUgUklMX1VOU09MX1JFU1RSSUNURURfU1RBVEVfQ0hBTkdFRCkKICoKICogSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBleGFjdCBjYXVzZSBjb2RlcywKICogdGhlbiBpdCBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgdmFsdWVzIGxpc3RlZCBpbiBSSUxfTGFzdENhbGxGYWlsQ2F1c2UsCiAqIGFzIHRoZSBVSSBsYXllciBuZWVkcyB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcyBmb3IgdG9uZSBnZW5lcmF0aW9uIG9yCiAqIGVycm9yIG5vdGlmaWNhdGlvbi4KICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9MQVNUX0RBVEFfQ0FMTF9GQUlMX0NBVVNFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0xBU1RfQ0FMTF9GQUlMX0NBVVNFIDE4CgovKioKICogUklMX1JFUVVFU1RfU0lHTkFMX1NUUkVOR1RICiAqCiAqIFJlcXVlc3RzIGN1cnJlbnQgc2lnbmFsIHN0cmVuZ3RoIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uCiAqCiAqIE11c3Qgc3VjY2VlZCBpZiByYWRpbyBpcyBvbi4KICoKICogImRhdGEiIGlzIE5VTEwKICoKICogInJlc3BvbnNlIiBpcyBhIGNvbnN0IFJJTF9TaWduYWxTdHJlbmd0aCAqCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0lHTkFMX1NUUkVOR1RIIDE5CgovKioKICogUklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFCiAqCiAqIFJlcXVlc3QgY3VycmVudCByZWdpc3RyYXRpb24gc3RhdGUKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBhICJjaGFyICoqIgogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzBdIGlzIHJlZ2lzdHJhdGlvbiBzdGF0ZSAwLTYsCiAqICAgICAgICAgICAgICAwIC0gTm90IHJlZ2lzdGVyZWQsIE1UIGlzIG5vdCBjdXJyZW50bHkgc2VhcmNoaW5nCiAqICAgICAgICAgICAgICAgICAgYSBuZXcgb3BlcmF0b3IgdG8gcmVnaXN0ZXIKICogICAgICAgICAgICAgIDEgLSBSZWdpc3RlcmVkLCBob21lIG5ldHdvcmsKICogICAgICAgICAgICAgIDIgLSBOb3QgcmVnaXN0ZXJlZCwgYnV0IE1UIGlzIGN1cnJlbnRseSBzZWFyY2hpbmcKICogICAgICAgICAgICAgICAgICBhIG5ldyBvcGVyYXRvciB0byByZWdpc3RlcgogKiAgICAgICAgICAgICAgMyAtIFJlZ2lzdHJhdGlvbiBkZW5pZWQKICogICAgICAgICAgICAgIDQgLSBVbmtub3duCiAqICAgICAgICAgICAgICA1IC0gUmVnaXN0ZXJlZCwgcm9hbWluZwogKiAgICAgICAgICAgICAxMCAtIFNhbWUgYXMgMCwgYnV0IGluZGljYXRlcyB0aGF0IGVtZXJnZW5jeSBjYWxscwogKiAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgogKiAgICAgICAgICAgICAxMiAtIFNhbWUgYXMgMiwgYnV0IGluZGljYXRlcyB0aGF0IGVtZXJnZW5jeSBjYWxscwogKiAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgogKiAgICAgICAgICAgICAxMyAtIFNhbWUgYXMgMywgYnV0IGluZGljYXRlcyB0aGF0IGVtZXJnZW5jeSBjYWxscwogKiAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgogKiAgICAgICAgICAgICAxNCAtIFNhbWUgYXMgNCwgYnV0IGluZGljYXRlcyB0aGF0IGVtZXJnZW5jeSBjYWxscwogKiAgICAgICAgICAgICAgICAgIGFyZSBlbmFibGVkLgogKgogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzFdIGlzIExBQyBpZiByZWdpc3RlcmVkIG9uIGEgR1NNL1dDRE1BIHN5c3RlbSBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm90LlZhbGlkIExBQyBhcmUgMHgwMDAwIC0gMHhmZmZmCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMl0gaXMgQ0lEIGlmIHJlZ2lzdGVyZWQgb24gYSAqIEdTTS9XQ0RNQSBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm90LgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIENJRCBhcmUgMHgwMDAwMDAwMCAtIDB4ZmZmZmZmZmYKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBHU00sIENJRCBpcyBDZWxsIElEIChzZWUgVFMgMjcuMDA3KQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gMTYgYml0cwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIFVNVFMsIENJRCBpcyBVTVRTIENlbGwgSWRlbnRpdHkKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIFRTIDI1LjMzMSkgaW4gMjggYml0cwogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzNdIGluZGljYXRlcyB0aGUgYXZhaWxhYmxlIHJhZGlvIHRlY2hub2xvZ3kgMC03LAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gVW5rbm93biwgMSAtIEdQUlMsIDIgLSBFREdFLCAzIC0gVU1UUywKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAtIElTOTVBLCA1IC0gSVM5NUIsIDYgLSAxeFJUVCwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAtIEV2RG8gUmV2LiAwLCA4IC0gRXZEbyBSZXYuIEEsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgLSBIU0RQQSwgMTAgLSBIU1VQQSwgMTEgLSBIU1BBCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbNF0gaXMgQmFzZSBTdGF0aW9uIElEIGlmIHJlZ2lzdGVyZWQgb24gYSBDRE1BCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIG9yIE5VTEwgaWYgbm90LiAgQmFzZSBTdGF0aW9uIElEIGluCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCBmb3JtYXQKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVs1XSBpcyBCYXNlIFN0YXRpb24gbGF0aXR1ZGUgaWYgcmVnaXN0ZXJlZCBvbiBhCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RNQSBzeXN0ZW0gb3IgTlVMTCBpZiBub3QuIEJhc2UgU3RhdGlvbgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlIGlzIGEgZGVjaW1hbCBudW1iZXIgYXMgc3BlY2lmaWVkIGluCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM0dQUDIgQy5TMDAwNS1BIHY2LjAuIEl0IGlzIHJlcHJlc2VudGVkIGluCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMgb2YgMC4yNSBzZWNvbmRzIGFuZCByYW5nZXMgZnJvbSAtMTI5NjAwMAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDEyOTYwMDAsIGJvdGggdmFsdWVzIGluY2x1c2l2ZSAoY29ycmVzcG9uZGluZwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgcmFuZ2Ugb2YgLTkwsCB0byArOTCwKS4KICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVs2XSBpcyBCYXNlIFN0YXRpb24gbG9uZ2l0dWRlIGlmIHJlZ2lzdGVyZWQgb24gYQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENETUEgc3lzdGVtIG9yIE5VTEwgaWYgbm90LiBCYXNlIFN0YXRpb24KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGUgaXMgYSBkZWNpbWFsIG51bWJlciBhcyBzcGVjaWZpZWQgaW4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzR1BQMiBDLlMwMDA1LUEgdjYuMC4gSXQgaXMgcmVwcmVzZW50ZWQgaW4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyBvZiAwLjI1IHNlY29uZHMgYW5kIHJhbmdlcyBmcm9tIC0yNTkyMDAwCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMjU5MjAwMCwgYm90aCB2YWx1ZXMgaW5jbHVzaXZlIChjb3JyZXNwb25kaW5nCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSByYW5nZSBvZiAtMTgwsCB0byArMTgwsCkuCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbN10gaXMgY29uY3VycmVudCBzZXJ2aWNlcyBzdXBwb3J0IGluZGljYXRvciBpZgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgb24gYSBDRE1BIHN5c3RlbSAwLTEuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gQ29uY3VycmVudCBzZXJ2aWNlcyBub3Qgc3VwcG9ydGVkLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIENvbmN1cnJlbnQgc2VydmljZXMgc3VwcG9ydGVkCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbOF0gaXMgU3lzdGVtIElEIGlmIHJlZ2lzdGVyZWQgb24gYSBDRE1BIHN5c3RlbSBvcgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm90LiBWYWxpZCBTeXN0ZW0gSUQgYXJlIDAgLSAzMjc2NwogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzldIGlzIE5ldHdvcmsgSUQgaWYgcmVnaXN0ZXJlZCBvbiBhIENETUEgc3lzdGVtIG9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBub3QuIFZhbGlkIFN5c3RlbSBJRCBhcmUgMCAtIDY1NTM1CiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMTBdIGlzIHRoZSBUU0ItNTggUm9hbWluZyBJbmRpY2F0b3IgaWYgcmVnaXN0ZXJlZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIENETUEgb3IgRVZETyBzeXN0ZW0gb3IgTlVMTCBpZiBub3QuIFZhbGlkIHZhbHVlcwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgMC0yNTUuCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMTFdIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN5c3RlbSBpcyBpbiB0aGUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJMIGlmIHJlZ2lzdGVyZWQgb24gYSBDRE1BIG9yIEVWRE8gc3lzdGVtIG9yIE5VTEwgaWYKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90LiAwPW5vdCBpbiB0aGUgUFJMLCAxPWluIHRoZSBQUkwKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVsxMl0gaXMgdGhlIGRlZmF1bHQgUm9hbWluZyBJbmRpY2F0b3IgZnJvbSB0aGUgUFJMLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByZWdpc3RlcmVkIG9uIGEgQ0RNQSBvciBFVkRPIHN5c3RlbSBvciBOVUxMIGlmIG5vdC4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzIGFyZSAwLTI1NS4KICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVsxM10gaWYgcmVnaXN0cmF0aW9uIHN0YXRlIGlzIDMgKFJlZ2lzdHJhdGlvbgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5pZWQpIHRoaXMgaXMgYW4gZW51bWVyYXRlZCByZWFzb24gd2h5CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiB3YXMgZGVuaWVkLiAgU2VlIDNHUFAgVFMgMjQuMDA4LAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMC41LjMuNiBhbmQgQW5uZXggRy4KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gR2VuZXJhbAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBBdXRoZW50aWNhdGlvbiBGYWlsdXJlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIElNU0kgdW5rbm93biBpbiBITFIKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIC0gSWxsZWdhbCBNUwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgLSBJbGxlZ2FsIE1FCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAtIFBMTU4gbm90IGFsbG93ZWQKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IC0gTG9jYXRpb24gYXJlYSBub3QgYWxsb3dlZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgLSBSb2FtaW5nIG5vdCBhbGxvd2VkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAtIE5vIFN1aXRhYmxlIENlbGxzIGluIHRoaXMgTG9jYXRpb24gQXJlYQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgLSBOZXR3b3JrIGZhaWx1cmUKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIC0gUGVyc2lzdGVudCBsb2NhdGlvbiB1cGRhdGUgcmVqZWN0CiAqCiAqIFBsZWFzZSBub3RlIHRoYXQgcmVnaXN0cmF0aW9uIHN0YXRlIDQgKCJ1bmtub3duIikgaXMgdHJlYXRlZAogKiBhcyAib3V0IG9mIHNlcnZpY2UiIGluIHRoZSBBbmRyb2lkIHRlbGVwaG9ueSBzeXN0ZW0KICoKICogUmVnaXN0cmF0aW9uIHN0YXRlIDMgY2FuIGJlIHJldHVybmVkIGlmIExvY2F0aW9uIFVwZGF0ZSBSZWplY3QKICogKHdpdGggY2F1c2UgMTcgLSBOZXR3b3JrIEZhaWx1cmUpIGlzIHJlY2VpdmVkIHJlcGVhdGVkbHkgZnJvbSB0aGUgbmV0d29yaywKICogdG8gZmFjaWxpdGF0ZSAibWFuYWdlZCByb2FtaW5nIgogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRFIDIwCgovKioKICogUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEUKICoKICogUmVxdWVzdCBjdXJyZW50IEdQUlMgcmVnaXN0cmF0aW9uIHN0YXRlCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgYSAiY2hhciAqKiIKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVswXSBpcyByZWdpc3RyYXRpb24gc3RhdGUgMC01IGZyb20gVFMgMjcuMDA3IDEwLjEuMjAgQVQrQ0dSRUcKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVsxXSBpcyBMQUMgaWYgcmVnaXN0ZXJlZCBvciBOVUxMIGlmIG5vdAogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzJdIGlzIENJRCBpZiByZWdpc3RlcmVkIG9yIE5VTEwgaWYgbm90CiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbM10gaW5kaWNhdGVzIHRoZSBhdmFpbGFibGUgcmFkaW8gdGVjaG5vbG9neSwgd2hlcmU6CiAqICAgICAgMCA9PSB1bmtub3duCiAqICAgICAgMSA9PSBHUFJTIG9ubHkKICogICAgICAyID09IEVER0UKICogICAgICAzID09IFVNVFMKICogICAgICA5ID09IEhTRFBBCiAqICAgICAgMTAgPT0gSFNVUEEKICogICAgICAxMSA9PSBIU1BBCiAqCiAqIExBQyBhbmQgQ0lEIGFyZSBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuCiAqIHZhbGlkIExBQyBhcmUgMHgwMDAwIC0gMHhmZmZmCiAqIHZhbGlkIENJRCBhcmUgMHgwMDAwMDAwMCAtIDB4MGZmZmZmZmYKICoKICogUGxlYXNlIG5vdGUgdGhhdCByZWdpc3RyYXRpb24gc3RhdGUgNCAoInVua25vd24iKSBpcyB0cmVhdGVkCiAqIGFzICJvdXQgb2Ygc2VydmljZSIgaW4gdGhlIEFuZHJvaWQgdGVsZXBob255IHN5c3RlbQogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEUgMjEKCi8qKgogKiBSSUxfUkVRVUVTVF9PUEVSQVRPUgogKgogKiBSZXF1ZXN0IGN1cnJlbnQgb3BlcmF0b3IgT05TIG9yIEVPTlMKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBhICJjb25zdCBjaGFyICoqIgogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzBdIGlzIGxvbmcgYWxwaGEgT05TIG9yIEVPTlMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB1bnJlZ2lzdGVyZWQKICoKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVsxXSBpcyBzaG9ydCBhbHBoYSBPTlMgb3IgRU9OUwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIHVucmVnaXN0ZXJlZAogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzJdIGlzIDUgb3IgNiBkaWdpdCBudW1lcmljIGNvZGUgKE1DQyArIE1OQykKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB1bnJlZ2lzdGVyZWQKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX09QRVJBVE9SIDIyCgovKioKICogUklMX1JFUVVFU1RfUkFESU9fUE9XRVIKICoKICogVG9nZ2xlIHJhZGlvIG9uIGFuZCBvZmYgKGZvciAiYWlycGxhbmUiIG1vZGUpCiAqICJkYXRhIiBpcyBpbnQgKgogKiAoKGludCAqKWRhdGEpWzBdIGlzID4gMCBmb3IgIlJhZGlvIE9uIgogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDAgZm9yICJSYWRpbyBPZmYiCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBUdXJuIHJhZGlvIG9uIGlmICJvbiIgPiAwCiAqIFR1cm4gcmFkaW8gb2ZmIGlmICJvbiIgPT0gMAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfUkFESU9fUE9XRVIgMjMKCi8qKgogKiBSSUxfUkVRVUVTVF9EVE1GCiAqCiAqIFNlbmQgYSBEVE1GIHRvbmUKICoKICogSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdG9uZSByZXF1ZXN0ZWQgdmlhCiAqIFJJTF9SRVFVRVNUX0RUTUZfU1RBUlQsIHRoYXQgdG9uZSBzaG91bGQgYmUgY2FuY2VsbGVkIGFuZCB0aGUgbmV3IHRvbmUKICogc2hvdWxkIGJlIHBsYXllZCBpbnN0ZWFkCiAqCiAqICJkYXRhIiBpcyBhIGNoYXIgKiBjb250YWluaW5nIGEgc2luZ2xlIGNoYXJhY3RlciB3aXRoIG9uZSBvZiAxMiB2YWx1ZXM6IDAtOSwqLCMKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIEZJWE1FIHNob3VsZCB0aGlzIGJsb2NrL211dGUgbWljcm9waG9uZT8KICogSG93IGRvZXMgdGhpcyBpbnRlcmFjdCB3aXRoIGxvY2FsIERUTUYgZmVlZGJhY2s/CiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKiBTZWUgYWxzbzogUklMX1JFUVVFU1RfRFRNRl9TVE9QLCBSSUxfUkVRVUVTVF9EVE1GX1NUQVJUCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0RUTUYgMjQKCi8qKgogKiBSSUxfUkVRVUVTVF9TRU5EX1NNUwogKgogKiBTZW5kIGFuIFNNUyBtZXNzYWdlCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpcyBTTVNDIGFkZHJlc3MgaW4gR1NNIEJDRCBmb3JtYXQgcHJlZml4ZWQKICogICAgICBieSBhIGxlbmd0aCBieXRlIChhcyBleHBlY3RlZCBieSBUUyAyNy4wMDUpIG9yIE5VTEwgZm9yIGRlZmF1bHQgU01TQwogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgU01TIGluIFBEVSBmb3JtYXQgYXMgYW4gQVNDSUkgaGV4IHN0cmluZwogKiAgICAgIGxlc3MgdGhlIFNNU0MgYWRkcmVzcwogKiAgICAgIFRQLUxheWVyLUxlbmd0aCBpcyBiZSAic3RybGVuKCgoY29uc3QgY2hhciAqKilkYXRhKVsxXSkvMiIKICoKICogInJlc3BvbnNlIiBpcyBhIGNvbnN0IFJJTF9TTVNfUmVzcG9uc2UgKgogKgogKiBCYXNlZCBvbiB0aGUgcmV0dXJuIGVycm9yLCBjYWxsZXIgZGVjaWRlcyB0byByZXNlbmQgaWYgc2VuZGluZyBzbXMKICogZmFpbHMuIFNNU19TRU5EX0ZBSUxfUkVUUlkgbWVhbnMgcmV0cnkgKGkuZS4gZXJyb3IgY2F1c2UgaXMgMzMyKQogKiBhbmQgR0VORVJJQ19GQUlMVVJFIG1lYW5zIG5vIHJldHJ5IChpLmUuIGVycm9yIGNhdXNlIGlzIDUwMCkKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgU01TX1NFTkRfRkFJTF9SRVRSWQogKiAgRkROX0NIRUNLX0ZBSUxVUkUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKiBGSVhNRSBob3cgZG8gd2Ugc3BlY2lmeSBUUC1NZXNzYWdlLVJlZmVyZW5jZSBpZiB3ZSBuZWVkIHRvIHJlc2VuZD8KICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0VORF9TTVMgMjUKCgovKioKICogUklMX1JFUVVFU1RfU0VORF9TTVNfRVhQRUNUX01PUkUKICoKICogU2VuZCBhbiBTTVMgbWVzc2FnZS4gSWRlbnRpY2FsIHRvIFJJTF9SRVFVRVNUX1NFTkRfU01TLAogKiBleGNlcHQgdGhhdCBtb3JlIG1lc3NhZ2VzIGFyZSBleHBlY3RlZCB0byBiZSBzZW50IHNvb24uIElmIHBvc3NpYmxlLAogKiBrZWVwIFNNUyByZWxheSBwcm90b2NvbCBsaW5rIG9wZW4gKGVnIFRTIDI3LjAwNSBBVCtDTU1TIGNvbW1hbmQpCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBpcyBTTVNDIGFkZHJlc3MgaW4gR1NNIEJDRCBmb3JtYXQgcHJlZml4ZWQKICogICAgICBieSBhIGxlbmd0aCBieXRlIChhcyBleHBlY3RlZCBieSBUUyAyNy4wMDUpIG9yIE5VTEwgZm9yIGRlZmF1bHQgU01TQwogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgU01TIGluIFBEVSBmb3JtYXQgYXMgYW4gQVNDSUkgaGV4IHN0cmluZwogKiAgICAgIGxlc3MgdGhlIFNNU0MgYWRkcmVzcwogKiAgICAgIFRQLUxheWVyLUxlbmd0aCBpcyBiZSAic3RybGVuKCgoY29uc3QgY2hhciAqKilkYXRhKVsxXSkvMiIKICoKICogInJlc3BvbnNlIiBpcyBhIGNvbnN0IFJJTF9TTVNfUmVzcG9uc2UgKgogKgogKiBCYXNlZCBvbiB0aGUgcmV0dXJuIGVycm9yLCBjYWxsZXIgZGVjaWRlcyB0byByZXNlbmQgaWYgc2VuZGluZyBzbXMKICogZmFpbHMuIFNNU19TRU5EX0ZBSUxfUkVUUlkgbWVhbnMgcmV0cnkgKGkuZS4gZXJyb3IgY2F1c2UgaXMgMzMyKQogKiBhbmQgR0VORVJJQ19GQUlMVVJFIG1lYW5zIG5vIHJldHJ5IChpLmUuIGVycm9yIGNhdXNlIGlzIDUwMCkKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgU01TX1NFTkRfRkFJTF9SRVRSWQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFTkRfU01TX0VYUEVDVF9NT1JFIDI2CgoKLyoqCiAqIFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTAogKgogKiBTZXR1cCBhIHBhY2tldCBkYXRhIGNvbm5lY3Rpb24KICoKICogImRhdGEiIGlzIGEgY29uc3QgY2hhciAqKgogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMF0gaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2V0dXAgY29ubmVjdGlvbiBvbiByYWRpbyB0ZWNobm9sb2d5IENETUEKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBHU00vVU1UUywgMC0xLiAwIC0gQ0RNQSwgMS1HU00vVU1UUwogKgogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgYSBSSUxfRGF0YVByb2ZpbGUgKHN1cHBvcnQgaXMgb3B0aW9uYWwpCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVsyXSBpcyB0aGUgQVBOIHRvIGNvbm5lY3QgdG8gaWYgcmFkaW8gdGVjaG5vbG9neSBpcyBHU00vVU1UUy4gVGhpcyBBUE4gd2lsbAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgdGhlIG9uZSBpbiB0aGUgcHJvZmlsZS4gTlVMTCBpbmRpY2F0ZXMgbm8gQVBOIG92ZXJycmlkZS4KICogKChjb25zdCBjaGFyICoqKWRhdGEpWzNdIGlzIHRoZSB1c2VybmFtZSBmb3IgQVBOLCBvciBOVUxMCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVs0XSBpcyB0aGUgcGFzc3dvcmQgZm9yIEFQTiwgb3IgTlVMTAogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbNV0gaXMgdGhlIFBBUCAvIENIQVAgYXV0aCB0eXBlLiBWYWx1ZXM6CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAwID0+IFBBUCBhbmQgQ0hBUCBpcyBuZXZlciBwZXJmb3JtZWQuCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAxID0+IFBBUCBtYXkgYmUgcGVyZm9ybWVkOyBDSEFQIGlzIG5ldmVyIHBlcmZvcm1lZC4KICogICAgICAgICAgICAgICAgICAgICAgICAgIDIgPT4gQ0hBUCBtYXkgYmUgcGVyZm9ybWVkOyBQQVAgaXMgbmV2ZXIgcGVyZm9ybWVkLgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9PiBQQVAgLyBDSEFQIG1heSBiZSBwZXJmb3JtZWQgLSBiYXNlYmFuZCBkZXBlbmRlbnQuCiAqCiAqICJyZXNwb25zZSIgaXMgYSBjaGFyICoqCiAqICgoY2hhciAqKilyZXNwb25zZSlbMF0gaW5kaWNhdGluZyBQRFAgQ0lELCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgUklMLiBUaGlzIENvbm5lY3Rpb24gSUQgaXMKICogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gR1NNL1VNVFMgYW5kIENETUEKICogKChjaGFyICoqKXJlc3BvbnNlKVsxXSBpbmRpY2F0aW5nIHRoZSBuZXR3b3JrIGludGVyZmFjZSBuYW1lIGZvciBHU00vVU1UUyBvciBDRE1BCiAqICgoY2hhciAqKilyZXNwb25zZSlbMl0gaW5kaWNhdGluZyB0aGUgSVAgYWRkcmVzcyBmb3IgdGhpcyBpbnRlcmZhY2UgZm9yIEdTTS9VTVRTCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgTlVMTCBmb3IgQ0RNQQogKgogKiBGSVhNRSBtYXkgbmVlZCB3YXkgdG8gY29uZmlndXJlIFFvUyBzZXR0aW5ncwogKgogKiByZXBsYWNlcyAgUklMX1JFUVVFU1RfU0VUVVBfREVGQVVMVF9QRFAKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9ERUFDVElWQVRFX0RBVEFfQ0FMTAogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9TRVRVUF9EQVRBX0NBTEwgMjcKCgoKLyoqCiAqIFJJTF9SRVFVRVNUX1NJTV9JTwogKgogKiBSZXF1ZXN0IFNJTSBJL08gb3BlcmF0aW9uLgogKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIFRTIDI3LjAwNyAicmVzdHJpY3RlZCBTSU0iIG9wZXJhdGlvbgogKiB3aGVyZSBpdCBhc3N1bWVzIGFsbCBvZiB0aGUgRUYgc2VsZWN0aW9uIHdpbGwgYmUgZG9uZSBieSB0aGUKICogY2FsbGVlLgogKgogKiAiZGF0YSIgaXMgYSBjb25zdCBSSUxfU0lNX0lPICoKICogUGxlYXNlIG5vdGUgdGhhdCBSSUxfU0lNX0lPIGhhcyBhICJQSU4yIiBmaWVsZCB3aGljaCBtYXkgYmUgTlVMTCwKICogb3IgbWF5IHNwZWNpZnkgYSBQSU4yIGZvciBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBhIFBJTjIgKGVnCiAqIHVwZGF0aW5nIEZETiByZWNvcmRzKQogKgogKiAicmVzcG9uc2UiIGlzIGEgY29uc3QgUklMX1NJTV9JT19SZXNwb25zZSAqCiAqCiAqIEFyZ3VtZW50cyBhbmQgcmVzcG9uc2VzIHRoYXQgYXJlIHVudXNlZCBmb3IgY2VydGFpbgogKiB2YWx1ZXMgb2YgImNvbW1hbmQiIHNob3VsZCBiZSBpZ25vcmVkIG9yIHNldCB0byBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKiAgU0lNX1BJTjIKICogIFNJTV9QVUsyCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NJTV9JTyAyOAoKLyoqCiAqIFJJTF9SRVFVRVNUX1NFTkRfVVNTRAogKgogKiBTZW5kIGEgVVNTRCBtZXNzYWdlCiAqCiAqIElmIGEgVVNTRCBzZXNzaW9uIGFscmVhZHkgZXhpc3RzLCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2VudCBpbiB0aGUKICogY29udGV4dCBvZiB0aGF0IHNlc3Npb24uIE90aGVyd2lzZSwgYSBuZXcgc2Vzc2lvbiBzaG91bGQgYmUgY3JlYXRlZC4KICoKICogVGhlIG5ldHdvcmsgcmVwbHkgc2hvdWxkIGJlIHJlcG9ydGVkIHZpYSBSSUxfVU5TT0xfT05fVVNTRAogKgogKiBPbmx5IG9uZSBVU1NEIHNlc3Npb24gbWF5IGV4aXN0IGF0IGEgdGltZSwgYW5kIHRoZSBzZXNzaW9uIGlzIGFzc3VtZWQKICogdG8gZXhpc3QgdW50aWw6CiAqICAgYSkgVGhlIGFuZHJvaWQgc3lzdGVtIGludm9rZXMgUklMX1JFUVVFU1RfQ0FOQ0VMX1VTU0QKICogICBiKSBUaGUgaW1wbGVtZW50YXRpb24gc2VuZHMgYSBSSUxfVU5TT0xfT05fVVNTRCB3aXRoIGEgdHlwZSBjb2RlCiAqICAgICAgb2YgIjAiIChVU1NELU5vdGlmeS9ubyBmdXJ0aGVyIGFjdGlvbikgb3IgIjIiIChzZXNzaW9uIHRlcm1pbmF0ZWQpCiAqCiAqICJkYXRhIiBpcyBhIGNvbnN0IGNoYXIgKiBjb250YWluaW5nIHRoZSBVU1NEIHJlcXVlc3QgaW4gVVRGLTggZm9ybWF0CiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBGRE5fQ0hFQ0tfRkFJTFVSRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9DQU5DRUxfVVNTRCwgUklMX1VOU09MX09OX1VTU0QKICovCgojZGVmaW5lIFJJTF9SRVFVRVNUX1NFTkRfVVNTRCAyOQoKLyoqCiAqIFJJTF9SRVFVRVNUX0NBTkNFTF9VU1NECiAqCiAqIENhbmNlbCB0aGUgY3VycmVudCBVU1NEIHNlc3Npb24gaWYgb25lIGV4aXN0cwogKgogKiAiZGF0YSIgaXMgbnVsbAogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9DQU5DRUxfVVNTRCAzMAoKLyoqCiAqIFJJTF9SRVFVRVNUX0dFVF9DTElSCiAqCiAqIEdldHMgY3VycmVudCBDTElSIHN0YXR1cwogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIGludCAqCiAqICgoaW50ICopZGF0YSlbMF0gaXMgIm4iIHBhcmFtZXRlciBmcm9tIFRTIDI3LjAwNyA3LjcKICogKChpbnQgKilkYXRhKVsxXSBpcyAibSIgcGFyYW1ldGVyIGZyb20gVFMgMjcuMDA3IDcuNwogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX0NMSVIgMzEKCi8qKgogKiBSSUxfUkVRVUVTVF9TRVRfQ0xJUgogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyAibiIgcGFyYW1ldGVyIGZyb20gVFMgMjcuMDA3IDcuNwogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9DTElSIDMyCgovKioKICogUklMX1JFUVVFU1RfUVVFUllfQ0FMTF9GT1JXQVJEX1NUQVRVUwogKgogKiAiZGF0YSIgaXMgY29uc3QgUklMX0NhbGxGb3J3YXJkSW5mbyAqCiAqCiAqICJyZXNwb25zZSIgaXMgY29uc3QgUklMX0NhbGxGb3J3YXJkSW5mbyAqKgogKiAicmVzcG9uc2UiIHBvaW50cyB0byBhbiBhcnJheSBvZiBSSUxfQ2FsbEZvcndhcmRJbmZvIConcywgb25lIGZvcgogKiBlYWNoIGRpc3RpbmN0IHJlZ2lzdGVyZWQgcGhvbmUgbnVtYmVyLgogKgogKiBGb3IgZXhhbXBsZSwgaWYgZGF0YSBpcyBmb3J3YXJkZWQgdG8gKzE4MDA1NTUxMjEyIGFuZCB2b2ljZSBpcyBmb3J3YXJkZWQKICogdG8gKzE4MDA1NTU5OTk5LCB0aGVuIHR3byBzZXBhcmF0ZSBSSUxfQ2FsbEZvcndhcmRJbmZvJ3Mgc2hvdWxkIGJlIHJldHVybmVkCiAqCiAqIElmLCBob3dldmVyLCBib3RoIGRhdGEgYW5kIHZvaWNlIGFyZSBmb3J3YXJkZWQgdG8gKzE4MDA1NTUxMjEyLCB0aGVuCiAqIGEgc2luZ2xlIFJJTF9DYWxsRm9yd2FyZEluZm8gY2FuIGJlIHJldHVybmVkIHdpdGggdGhlIHNlcnZpY2UgY2xhc3MKICogc2V0IHRvICJkYXRhICsgdm9pY2UgPSAzIikKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1FVRVJZX0NBTExfRk9SV0FSRF9TVEFUVVMgMzMKCgovKioKICogUklMX1JFUVVFU1RfU0VUX0NBTExfRk9SV0FSRAogKgogKiBDb25maWd1cmUgY2FsbCBmb3J3YXJkIHJ1bGUKICoKICogImRhdGEiIGlzIGNvbnN0IFJJTF9DYWxsRm9yd2FyZEluZm8gKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9DQUxMX0ZPUldBUkQgMzQKCgovKioKICogUklMX1JFUVVFU1RfUVVFUllfQ0FMTF9XQUlUSU5HCiAqCiAqIFF1ZXJ5IGN1cnJlbnQgY2FsbCB3YWl0aW5nIHN0YXRlCiAqCiAqICJkYXRhIiBpcyBjb25zdCBpbnQgKgogKiAoKGNvbnN0IGludCAqKWRhdGEpWzBdIGlzIHRoZSBUUyAyNy4wMDcgc2VydmljZSBjbGFzcyB0byBxdWVyeS4KICogInJlc3BvbnNlIiBpcyBhIGNvbnN0IGludCAqCiAqICgoY29uc3QgaW50ICopcmVzcG9uc2UpWzBdIGlzIDAgZm9yICJkaXNhYmxlZCIgYW5kIDEgZm9yICJlbmFibGVkIgogKgogKiBJZiAoKGNvbnN0IGludCAqKXJlc3BvbnNlKVswXSBpcyA9IDEsIHRoZW4gKChjb25zdCBpbnQgKilyZXNwb25zZSlbMV0KICogbXVzdCBmb2xsb3csIHdpdGggdGhlIFRTIDI3LjAwNyBzZXJ2aWNlIGNsYXNzIGJpdCB2ZWN0b3Igb2Ygc2VydmljZXMKICogZm9yIHdoaWNoIGNhbGwgd2FpdGluZyBpcyBlbmFibGVkLgogKgogKiBGb3IgZXhhbXBsZSwgaWYgKChjb25zdCBpbnQgKilyZXNwb25zZSlbMF0gIGlzIDEgYW5kCiAqICgoY29uc3QgaW50ICopcmVzcG9uc2UpWzFdIGlzIDMsIHRoZW4gY2FsbCB3YWl0aW5nIGlzIGVuYWJsZWQgZm9yIGRhdGEKICogYW5kIHZvaWNlIGFuZCBkaXNhYmxlZCBmb3IgZXZlcnl0aGluZyBlbHNlCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9RVUVSWV9DQUxMX1dBSVRJTkcgMzUKCgovKioKICogUklMX1JFUVVFU1RfU0VUX0NBTExfV0FJVElORwogKgogKiBDb25maWd1cmUgY3VycmVudCBjYWxsIHdhaXRpbmcgc3RhdGUKICoKICogImRhdGEiIGlzIGNvbnN0IGludCAqCiAqICgoY29uc3QgaW50ICopZGF0YSlbMF0gaXMgMCBmb3IgImRpc2FibGVkIiBhbmQgMSBmb3IgImVuYWJsZWQiCiAqICgoY29uc3QgaW50ICopZGF0YSlbMV0gaXMgdGhlIFRTIDI3LjAwNyBzZXJ2aWNlIGNsYXNzIGJpdCB2ZWN0b3Igb2YKICogICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcyB0byBtb2RpZnkKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9TRVRfQ0FMTF9XQUlUSU5HIDM2CgovKioKICogUklMX1JFUVVFU1RfU01TX0FDS05PV0xFREdFCiAqCiAqIEFja25vd2xlZGdlIHN1Y2Nlc3NmdWwgb3IgZmFpbGVkIHJlY2VpcHQgb2YgU01TIHByZXZpb3VzbHkgaW5kaWNhdGVkCiAqIHZpYSBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNUwogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyAxIG9uIHN1Y2Nlc3NmdWwgcmVjZWlwdAogKiAgICAgICAgICAgICAgICAgIChiYXNpY2FsbHksIEFUK0NOTUE9MSBmcm9tIFRTIDI3LjAwNQogKiAgICAgICAgICAgICAgICAgIGlzIDAgb24gZmFpbGVkIHJlY2VpcHQKICogICAgICAgICAgICAgICAgICAoYmFzaWNhbGx5LCBBVCtDTk1BPTIgZnJvbSBUUyAyNy4wMDUpCiAqICgoaW50ICopZGF0YSlbMV0gaWYgZGF0YVswXSBpcyAwLCB0aGlzIGNvbnRhaW5zIHRoZSBmYWlsdXJlIGNhdXNlIGFzIGRlZmluZWQKICogICAgICAgICAgICAgICAgICBpbiBUUyAyMy4wNDAsIDkuMi4zLjIyLiBDdXJyZW50bHkgb25seSAweEQzIChtZW1vcnkKICogICAgICAgICAgICAgICAgICBjYXBhY2l0eSBleGNlZWRlZCkgYW5kIDB4RkYgKHVuc3BlY2lmaWVkIGVycm9yKSBhcmUKICogICAgICAgICAgICAgICAgICByZXBvcnRlZC4KICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIEZJWE1FIHdvdWxkIGxpa2UgcmVxdWVzdCB0aGF0IHNwZWNpZmllZCBSUC1BQ0svUlAtRVJST1IgUERVCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9TTVNfQUNLTk9XTEVER0UgIDM3CgovKioKICogUklMX1JFUVVFU1RfR0VUX0lNRUkgLSBERVBSRUNBVEVECiAqCiAqIEdldCB0aGUgZGV2aWNlIElNRUksIGluY2x1ZGluZyBjaGVjayBkaWdpdAogKgogKiBUaGUgcmVxdWVzdCBpcyBERVBSRUNBVEVELCB1c2UgUklMX1JFUVVFU1RfREVWSUNFX0lERU5USVRZCiAqIFZhbGlkIHdoZW4gUmFkaW9TdGF0ZSBpcyBub3QgUkFESU9fU1RBVEVfVU5BVkFJTEFCTEUKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBhIGNvbnN0IGNoYXIgKiBjb250YWluaW5nIHRoZSBJTUVJCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX0lNRUkgMzgKCi8qKgogKiBSSUxfUkVRVUVTVF9HRVRfSU1FSVNWIC0gREVQUkVDQVRFRAogKgogKiBHZXQgdGhlIGRldmljZSBJTUVJU1YsIHdoaWNoIHNob3VsZCBiZSB0d28gZGVjaW1hbCBkaWdpdHMKICoKICogVGhlIHJlcXVlc3QgaXMgREVQUkVDQVRFRCwgdXNlIFJJTF9SRVFVRVNUX0RFVklDRV9JREVOVElUWQogKiBWYWxpZCB3aGVuIFJhZGlvU3RhdGUgaXMgbm90IFJBRElPX1NUQVRFX1VOQVZBSUxBQkxFCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgYSBjb25zdCBjaGFyICogY29udGFpbmluZyB0aGUgSU1FSVNWCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX0lNRUlTViAzOQoKCi8qKgogKiBSSUxfUkVRVUVTVF9BTlNXRVIKICoKICogQW5zd2VyIGluY29taW5nIGNhbGwKICoKICogV2lsbCBub3QgYmUgY2FsbGVkIGZvciBXQUlUSU5HIGNhbGxzLgogKiBSSUxfUkVRVUVTVF9TV0lUQ0hfV0FJVElOR19PUl9IT0xESU5HX0FORF9BQ1RJVkUgd2lsbCBiZSB1c2VkIGluIHRoaXMgY2FzZQogKiBpbnN0ZWFkCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCgojZGVmaW5lIFJJTF9SRVFVRVNUX0FOU1dFUiA0MAoKLyoqCiAqIFJJTF9SRVFVRVNUX0RFQUNUSVZBVEVfREFUQV9DQUxMCiAqCiAqIERlYWN0aXZhdGUgcGFja2V0IGRhdGEgY29ubmVjdGlvbgogKiByZXBsYWNlcyBSSUxfUkVRVUVTVF9ERUFDVElWQVRFX0RFRkFVTFRfUERQCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqICgoY2hhcioqKWRhdGEpWzBdIGluZGljYXRpbmcgQ0lECiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICogU2VlIGFsc286IFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTAogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9ERUFDVElWQVRFX0RBVEFfQ0FMTCA0MQoKLyoqCiAqIFJJTF9SRVFVRVNUX1FVRVJZX0ZBQ0lMSVRZX0xPQ0sKICoKICogUXVlcnkgdGhlIHN0YXR1cyBvZiBhIGZhY2lsaXR5IGxvY2sgc3RhdGUKICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzBdIGlzIHRoZSBmYWNpbGl0eSBzdHJpbmcgY29kZSBmcm9tIFRTIDI3LjAwNyA3LjQKICogICAgICAgICAgICAgICAgICAgICAgKGVnICJBTyIgZm9yIEJBT0MsICJTQyIgZm9yIFNJTSBsb2NrKQogKiAoKGNvbnN0IGNoYXIgKiopZGF0YSlbMV0gaXMgdGhlIHBhc3N3b3JkLCBvciAiIiBpZiBub3QgcmVxdWlyZWQKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzJdIGlzIHRoZSBUUyAyNy4wMDcgc2VydmljZSBjbGFzcyBiaXQgdmVjdG9yIG9mCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXMgdG8gcXVlcnkKICoKICogInJlc3BvbnNlIiBpcyBhbiBpbnQgKgogKiAoKGNvbnN0IGludCAqKXJlc3BvbnNlKSAwIGlzIHRoZSBUUyAyNy4wMDcgc2VydmljZSBjbGFzcyBiaXQgdmVjdG9yIG9mCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXMgZm9yIHdoaWNoIHRoZSBzcGVjaWZpZWQgYmFycmluZyBmYWNpbGl0eQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFjdGl2ZS4gIjAiIG1lYW5zICJkaXNhYmxlZCBmb3IgYWxsIgogKgogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfUVVFUllfRkFDSUxJVFlfTE9DSyA0MgoKLyoqCiAqIFJJTF9SRVFVRVNUX1NFVF9GQUNJTElUWV9MT0NLCiAqCiAqIEVuYWJsZS9kaXNhYmxlIG9uZSBmYWNpbGl0eSBsb2NrCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSA9IGZhY2lsaXR5IHN0cmluZyBjb2RlIGZyb20gVFMgMjcuMDA3IDcuNAogKiAoZWcgIkFPIiBmb3IgQkFPQykKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdID0gIjAiIGZvciAidW5sb2NrIiBhbmQgIjEiIGZvciAibG9jayIKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzJdID0gcGFzc3dvcmQKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzNdID0gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGRlY2ltYWwgVFMgMjcuMDA3CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgY2xhc3MgYml0IHZlY3Rvci4gRWcsIHRoZSBzdHJpbmcKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiIG1lYW5zICJzZXQgdGhpcyBmYWNpbGl0eSBmb3Igdm9pY2Ugc2VydmljZXMiCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIG51bWJlciBvZiByZXRyaWVzIHJlbWFpbmluZywgb3IgLTEgaWYgdW5rbm93bgogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0VUX0ZBQ0lMSVRZX0xPQ0sgNDMKCi8qKgogKiBSSUxfUkVRVUVTVF9DSEFOR0VfQkFSUklOR19QQVNTV09SRAogKgogKiBDaGFuZ2UgY2FsbCBiYXJyaW5nIGZhY2lsaXR5IHBhc3N3b3JkCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSA9IGZhY2lsaXR5IHN0cmluZyBjb2RlIGZyb20gVFMgMjcuMDA3IDcuNAogKiAoZWcgIkFPIiBmb3IgQkFPQykKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdID0gb2xkIHBhc3N3b3JkCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVsyXSA9IG5ldyBwYXNzd29yZAogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NIQU5HRV9CQVJSSU5HX1BBU1NXT1JEIDQ0CgovKioKICogUklMX1JFUVVFU1RfUVVFUllfTkVUV09SS19TRUxFQ1RJT05fTU9ERQogKgogKiBRdWVyeSBjdXJyZW50IG5ldHdvcmsgc2VsZWN0aW4gbW9kZQogKgogKiAiZGF0YSIgaXMgTlVMTAogKgogKiAicmVzcG9uc2UiIGlzIGludCAqCiAqICgoY29uc3QgaW50ICopcmVzcG9uc2UpWzBdIGlzCiAqICAgICAwIGZvciBhdXRvbWF0aWMgc2VsZWN0aW9uCiAqICAgICAxIGZvciBtYW51YWwgc2VsZWN0aW9uCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9RVUVSWV9ORVRXT1JLX1NFTEVDVElPTl9NT0RFIDQ1CgovKioKICogUklMX1JFUVVFU1RfU0VUX05FVFdPUktfU0VMRUNUSU9OX0FVVE9NQVRJQwogKgogKiBTcGVjaWZ5IHRoYXQgdGhlIG5ldHdvcmsgc2hvdWxkIGJlIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFRoaXMgcmVxdWVzdCBtdXN0IG5vdCByZXNwb25kIHVudGlsIHRoZSBuZXcgb3BlcmF0b3IgaXMgc2VsZWN0ZWQKICogYW5kIHJlZ2lzdGVyZWQKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9ORVRXT1JLX1NFTEVDVElPTl9BVVRPTUFUSUMgNDYKCi8qKgogKiBSSUxfUkVRVUVTVF9TRVRfTkVUV09SS19TRUxFQ1RJT05fTUFOVUFMCiAqCiAqIE1hbnVhbGx5IHNlbGVjdCBhIHNwZWNpZmllZCBuZXR3b3JrLgogKgogKiAiZGF0YSIgaXMgY29uc3QgY2hhciAqIHNwZWNpZnlpbmcgTUNDTU5DIG9mIG5ldHdvcmsgdG8gc2VsZWN0IChlZyAiMzEwMTcwIikKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFRoaXMgcmVxdWVzdCBtdXN0IG5vdCByZXNwb25kIHVudGlsIHRoZSBuZXcgb3BlcmF0b3IgaXMgc2VsZWN0ZWQKICogYW5kIHJlZ2lzdGVyZWQKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9ORVRXT1JLX1NFTEVDVElPTl9NQU5VQUwgNDcKCi8qKgogKiBSSUxfUkVRVUVTVF9RVUVSWV9BVkFJTEFCTEVfTkVUV09SS1MKICoKICogU2NhbnMgZm9yIGF2YWlsYWJsZSBuZXR3b3JrcwogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIGNvbnN0IGNoYXIgKiogdGhhdCBzaG91bGQgYmUgYW4gYXJyYXkgb2Ygbio0IHN0cmluZ3MsIHdoZXJlCiAqICAgIG4gaXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgbmV0d29ya3MKICogRm9yIGVhY2ggYXZhaWxhYmxlIG5ldHdvcms6CiAqCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbbiswXSBpcyBsb25nIGFscGhhIE9OUyBvciBFT05TCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbbisxXSBpcyBzaG9ydCBhbHBoYSBPTlMgb3IgRU9OUwogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpW24rMl0gaXMgNSBvciA2IGRpZ2l0IG51bWVyaWMgY29kZSAoTUNDICsgTU5DKQogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpW24rM10gaXMgYSBzdHJpbmcgdmFsdWUgb2YgdGhlIHN0YXR1czoKICogICAgICAgICAgICJ1bmtub3duIgogKiAgICAgICAgICAgImF2YWlsYWJsZSIKICogICAgICAgICAgICJjdXJyZW50IgogKiAgICAgICAgICAgImZvcmJpZGRlbiIKICoKICogVGhpcyByZXF1ZXN0IG11c3Qgbm90IHJlc3BvbmQgdW50aWwgdGhlIG5ldyBvcGVyYXRvciBpcyBzZWxlY3RlZAogKiBhbmQgcmVnaXN0ZXJlZAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfUVVFUllfQVZBSUxBQkxFX05FVFdPUktTIDQ4CgovKioKICogUklMX1JFUVVFU1RfRFRNRl9TVEFSVAogKgogKiBTdGFydCBwbGF5aW5nIGEgRFRNRiB0b25lLiBDb250aW51ZSBwbGF5aW5nIERUTUYgdG9uZSB1bnRpbAogKiBSSUxfUkVRVUVTVF9EVE1GX1NUT1AgaXMgcmVjZWl2ZWQKICoKICogSWYgYSBSSUxfUkVRVUVTVF9EVE1GX1NUQVJUIGlzIHJlY2VpdmVkIHdoaWxlIGEgdG9uZSBpcyBjdXJyZW50bHkgcGxheWluZywKICogaXQgc2hvdWxkIGNhbmNlbCB0aGUgcHJldmlvdXMgdG9uZSBhbmQgcGxheSB0aGUgbmV3IG9uZS4KICoKICogImRhdGEiIGlzIGEgY2hhciAqCiAqICgoY2hhciAqKWRhdGEpWzBdIGlzIGEgc2luZ2xlIGNoYXJhY3RlciB3aXRoIG9uZSBvZiAxMiB2YWx1ZXM6IDAtOSwqLCMKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKiBTZWUgYWxzbzogUklMX1JFUVVFU1RfRFRNRiwgUklMX1JFUVVFU1RfRFRNRl9TVE9QCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0RUTUZfU1RBUlQgNDkKCi8qKgogKiBSSUxfUkVRVUVTVF9EVE1GX1NUT1AKICoKICogU3RvcCBwbGF5aW5nIGEgY3VycmVudGx5IHBsYXlpbmcgRFRNRiB0b25lLgogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9EVE1GLCBSSUxfUkVRVUVTVF9EVE1GX1NUQVJUCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0RUTUZfU1RPUCA1MAoKLyoqCiAqIFJJTF9SRVFVRVNUX0JBU0VCQU5EX1ZFUlNJT04KICoKICogUmV0dXJuIHN0cmluZyB2YWx1ZSBpbmRpY2F0aW5nIGJhc2ViYW5kIHZlcnNpb24sIGVnCiAqIHJlc3BvbnNlIGZyb20gQVQrQ0dNUgogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIGNvbnN0IGNoYXIgKiBjb250YWluaW5nIHZlcnNpb24gc3RyaW5nIGZvciBsb2cgcmVwb3J0aW5nCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9CQVNFQkFORF9WRVJTSU9OIDUxCgovKioKICogUklMX1JFUVVFU1RfU0VQQVJBVEVfQ09OTkVDVElPTgogKgogKiBTZXBhcmF0ZSBhIHBhcnR5IGZyb20gYSBtdWx0aXBhcnR5IGNhbGwgcGxhY2luZyB0aGUgbXVsdGlwYXJ0eSBjYWxsCiAqIChsZXNzIHRoZSBzcGVjaWZpZWQgcGFydHkpIG9uIGhvbGQgYW5kIGxlYXZpbmcgdGhlIHNwZWNpZmllZCBwYXJ0eQogKiBhcyB0aGUgb25seSBvdGhlciBtZW1iZXIgb2YgdGhlIGN1cnJlbnQgKGFjdGl2ZSkgY2FsbAogKgogKiBMaWtlIEFUK0NITEQ9MngKICoKICogU2VlIFRTIDIyLjA4NCAxLjMuOC4yIChpaWkpCiAqIFRTIDIyLjAzMCA2LjUuNSAiRW50ZXJpbmcgIjJYIGZvbGxvd2VkIGJ5IHNlbmQiCiAqIFRTIDI3LjAwNyAiQVQrQ0hMRD0yeCIKICoKICogImRhdGEiIGlzIGFuIGludCAqCiAqIChpbnQgKilkYXRhKVswXSBjb250YWlucyBDb25uZWN0aW9uIGluZGV4ICh2YWx1ZSBvZiAneCcgaW4gQ0hMRCBhYm92ZSkgInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0VQQVJBVEVfQ09OTkVDVElPTiA1MgoKCi8qKgogKiBSSUxfUkVRVUVTVF9TRVRfTVVURQogKgogKiBUdXJuIG9uIG9yIG9mZiB1cGxpbmsgKG1pY3JvcGhvbmUpIG11dGUuCiAqCiAqIFdpbGwgb25seSBiZSBzZW50IHdoaWxlIHZvaWNlIGNhbGwgaXMgYWN0aXZlLgogKiBXaWxsIGFsd2F5cyBiZSByZXNldCB0byAiZGlzYWJsZSBtdXRlIiB3aGVuIGEgbmV3IHZvaWNlIGNhbGwgaXMgaW5pdGlhdGVkCiAqCiAqICJkYXRhIiBpcyBhbiBpbnQgKgogKiAoaW50ICopZGF0YSlbMF0gaXMgMSBmb3IgImVuYWJsZSBtdXRlIiBhbmQgMCBmb3IgImRpc2FibGUgbXV0ZSIKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfU0VUX01VVEUgNTMKCi8qKgogKiBSSUxfUkVRVUVTVF9HRVRfTVVURQogKgogKiBRdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1cGxpbmsgbXV0ZSBzZXR0aW5nCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgYW4gaW50ICoKICogKGludCAqKXJlc3BvbnNlKVswXSBpcyAxIGZvciAibXV0ZSBlbmFibGVkIiBhbmQgMCBmb3IgIm11dGUgZGlzYWJsZWQiCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX01VVEUgNTQKCi8qKgogKiBSSUxfUkVRVUVTVF9RVUVSWV9DTElQCiAqCiAqIFF1ZXJpZXMgdGhlIHN0YXR1cyBvZiB0aGUgQ0xJUCBzdXBwbGVtZW50YXJ5IHNlcnZpY2UKICoKICogKGZvciBNTUkgY29kZSAiKiMzMCMiKQogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIGFuIGludCAqCiAqIChpbnQgKilyZXNwb25zZSlbMF0gaXMgMSBmb3IgIkNMSVAgcHJvdmlzaW9uZWQiCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIDAgZm9yICJDTElQIG5vdCBwcm92aXNpb25lZCIKICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgMiBmb3IgInVua25vd24sIGUuZy4gbm8gbmV0d29yayBldGMiCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfUVVFUllfQ0xJUCA1NQoKLyoqCiAqIFJJTF9SRVFVRVNUX0xBU1RfREFUQV9DQUxMX0ZBSUxfQ0FVU0UKICoKICogUmVxdWVzdHMgdGhlIGZhaWx1cmUgY2F1c2UgY29kZSBmb3IgdGhlIG1vc3QgcmVjZW50bHkgZmFpbGVkIFBEUAogKiBjb250ZXh0IG9yIENETUEgZGF0YSBjb25uZWN0aW9uIGFjdGl2ZQogKiByZXBsYWNlcyBSSUxfUkVRVUVTVF9MQVNUX1BEUF9GQUlMX0NBVVNFCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgYSAiaW50ICoiCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzIGFuIGludGVnZXIgY2F1c2UgY29kZSBkZWZpbmVkIGluIFRTIDI0LjAwOAogKiAgIHNlY3Rpb24gNi4xLjMuMS4zIG9yIGNsb3NlIGFwcHJveGltYXRpb24KICoKICogSWYgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBleGFjdCBjYXVzZSBjb2RlcywKICogdGhlbiBpdCBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgdmFsdWVzIGxpc3RlZCBpbgogKiBSSUxfTGFzdERhdGFDYWxsQWN0aXZhdGVGYWlsQ2F1c2UsIGFzIHRoZSBVSSBsYXllciBuZWVkcyB0byBkaXN0aW5ndWlzaCB0aGVzZQogKiBjYXNlcyBmb3IgZXJyb3Igbm90aWZpY2F0aW9uCiAqIGFuZCBwb3RlbnRpYWwgcmV0cmllcy4KICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9MQVNUX0NBTExfRkFJTF9DQVVTRQogKgogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfTEFTVF9EQVRBX0NBTExfRkFJTF9DQVVTRSA1NgoKLyoqCiAqIFJJTF9SRVFVRVNUX0RBVEFfQ0FMTF9MSVNUCiAqCiAqIFF1ZXJpZXMgdGhlIHN0YXR1cyBvZiBQRFAgY29udGV4dHMsIHJldHVybmluZyBmb3IgZWFjaAogKiBpdHMgQ0lELCB3aGV0aGVyIG9yIG5vdCBpdCBpcyBhY3RpdmUsIGFuZCBpdHMgUERQIHR5cGUsCiAqIEFQTiwgYW5kIFBEUCBhZGRkcmVzcy4KICogcmVwbGFjZXMgUklMX1JFUVVFU1RfUERQX0NPTlRFWFRfTElTVAogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIGFuIGFycmF5IG9mIFJJTF9EYXRhX0NhbGxfUmVzcG9uc2UKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRSAocmFkaW8gcmVzZXR0aW5nKQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9EQVRBX0NBTExfTElTVCA1NwoKLyoqCiAqIFJJTF9SRVFVRVNUX1JFU0VUX1JBRElPIC0gREVQUkVDQVRFRAogKgogKiBSZXF1ZXN0IGEgcmFkaW8gcmVzZXQuIFRoZSBSSUwgaW1wbGVtZW50YXRpb24gbWF5IHBvc3Rwb25lCiAqIHRoZSByZXNldCB1bnRpbCBhZnRlciB0aGlzIHJlcXVlc3QgaXMgcmVzcG9uZGVkIHRvIGlmIHRoZSBiYXNlYmFuZAogKiBpcyBwcmVzZW50bHkgYnVzeS4KICoKICogVGhlIHJlcXVlc3QgaXMgREVQUkVDQVRFRCwgdXNlIFJJTF9SRVFVRVNUX1JBRElPX1BPV0VSCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICogIFJFUVVFU1RfTk9UX1NVUFBPUlRFRAogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfUkVTRVRfUkFESU8gNTgKCi8qKgogKiBSSUxfUkVRVUVTVF9PRU1fSE9PS19SQVcKICoKICogVGhpcyByZXF1ZXN0IHJlc2VydmVkIGZvciBPRU0tc3BlY2lmaWMgdXNlcy4gSXQgcGFzc2VzIHJhdyBieXRlIGFycmF5cwogKiBiYWNrIGFuZCBmb3J0aC4KICoKICogSXQgY2FuIGJlIGludm9rZWQgb24gdGhlIEphdmEgc2lkZSBmcm9tCiAqIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZS5pbnZva2VPZW1SaWxSZXF1ZXN0UmF3KCkKICoKICogImRhdGEiIGlzIGEgY2hhciAqIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBieXRlW10gZGF0YSBhcmd1bWVudCBpbiBqYXZhCiAqICJyZXNwb25zZSIgaXMgYSBjaGFyICogb2YgYnl0ZXMgdGhhdCB3aWxsIHJldHVybmVkIHZpYSB0aGUKICogY2FsbGVyJ3MgInJlc3BvbnNlIiBNZXNzYWdlIGhlcmU6CiAqIChieXRlW10pKCgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQpCiAqCiAqIEFuIGVycm9yIHJlc3BvbnNlIGhlcmUgd2lsbCByZXN1bHQgaW4KICogKCgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQpID09IG51bGwgYW5kCiAqICgoKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikuZXhjZXB0aW9uKSBiZWluZyBhbiBpbnN0YW5jZSBvZgogKiBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24KICoKICogVmFsaWQgZXJyb3JzOgogKiAgQWxsCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9PRU1fSE9PS19SQVcgNTkKCi8qKgogKiBSSUxfUkVRVUVTVF9PRU1fSE9PS19TVFJJTkdTCiAqCiAqIFRoaXMgcmVxdWVzdCByZXNlcnZlZCBmb3IgT0VNLXNwZWNpZmljIHVzZXMuIEl0IHBhc3NlcyBzdHJpbmdzCiAqIGJhY2sgYW5kIGZvcnRoLgogKgogKiBJdCBjYW4gYmUgaW52b2tlZCBvbiB0aGUgSmF2YSBzaWRlIGZyb20KICogY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lLmludm9rZU9lbVJpbFJlcXVlc3RTdHJpbmdzKCkKICoKICogImRhdGEiIGlzIGEgY29uc3QgY2hhciAqKiwgcmVwcmVzZW50aW5nIGFuIGFycmF5IG9mIG51bGwtdGVybWluYXRlZCBVVEYtOAogKiBzdHJpbmdzIGNvcGllZCBmcm9tIHRoZSAiU3RyaW5nW10gc3RyaW5ncyIgYXJndW1lbnQgdG8KICogaW52b2tlT2VtUmlsUmVxdWVzdFN0cmluZ3MoKQogKgogKiAicmVzcG9uc2UiIGlzIGEgY29uc3QgY2hhciAqKiwgcmVwcmVzZW50aW5nIGFuIGFycmF5IG9mIG51bGwtdGVybWluYXRlZCBVVEYtOAogKiBzdGluZ3MgdGhhdCB3aWxsIGJlIHJldHVybmVkIHZpYSB0aGUgY2FsbGVyJ3MgcmVzcG9uc2UgbWVzc2FnZSBoZXJlOgogKgogKiAoU3RyaW5nW10pKCgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQpCiAqCiAqIEFuIGVycm9yIHJlc3BvbnNlIGhlcmUgd2lsbCByZXN1bHQgaW4KICogKCgoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQpID09IG51bGwgYW5kCiAqICgoKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikuZXhjZXB0aW9uKSBiZWluZyBhbiBpbnN0YW5jZSBvZgogKiBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkNvbW1hbmRFeGNlcHRpb24KICoKICogVmFsaWQgZXJyb3JzOgogKiAgQWxsCiAqLwoKI2RlZmluZSBSSUxfUkVRVUVTVF9PRU1fSE9PS19TVFJJTkdTIDYwCgovKioKICogUklMX1JFUVVFU1RfU0NSRUVOX1NUQVRFCiAqCiAqIEluZGljYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2NyZWVuLiAgV2hlbiB0aGUgc2NyZWVuIGlzIG9mZiwgdGhlCiAqIFJJTCBzaG91bGQgbm90aWZ5IHRoZSBiYXNlYmFuZCB0byBzdXBwcmVzcyBjZXJ0YWluIG5vdGlmaWNhdGlvbnMgKGVnLAogKiBzaWduYWwgc3RyZW5ndGggYW5kIGNoYW5nZXMgaW4gTEFDL0NJRCBvciBCSUQvU0lEL05JRC9sYXRpdHVkZS9sb25naXR1ZGUpCiAqIGluIGFuIGVmZm9ydCB0byBjb25zZXJ2ZSBwb3dlci4gIFRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIHJlc3VtZSB3aGVuIHRoZQogKiBzY3JlZW4gaXMgb24uCiAqCiAqICJkYXRhIiBpcyBpbnQgKgogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDEgZm9yICJTY3JlZW4gT24iCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMCBmb3IgIlNjcmVlbiBPZmYiCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0NSRUVOX1NUQVRFIDYxCgoKLyoqCiAqIFJJTF9SRVFVRVNUX1NFVF9TVVBQX1NWQ19OT1RJRklDQVRJT04KICoKICogRW5hYmxlcy9kaXNhYmxlcyBzdXBwbGVtZW50YXJ5IHNlcnZpY2UgcmVsYXRlZCBub3RpZmljYXRpb25zCiAqIGZyb20gdGhlIG5ldHdvcmsuCiAqCiAqIE5vdGlmaWNhdGlvbnMgYXJlIHJlcG9ydGVkIHZpYSBSSUxfVU5TT0xfU1VQUF9TVkNfTk9USUZJQ0FUSU9OLgogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAxIGZvciBub3RpZmljYXRpb25zIGVuYWJsZWQKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAwIGZvciBub3RpZmljYXRpb25zIGRpc2FibGVkCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICogU2VlIGFsc286IFJJTF9VTlNPTF9TVVBQX1NWQ19OT1RJRklDQVRJT04uCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9TVVBQX1NWQ19OT1RJRklDQVRJT04gNjIKCi8qKgogKiBSSUxfUkVRVUVTVF9XUklURV9TTVNfVE9fU0lNCiAqCiAqIFN0b3JlcyBhIFNNUyBtZXNzYWdlIHRvIFNJTSBtZW1vcnkuCiAqCiAqICJkYXRhIiBpcyBSSUxfU01TX1dyaXRlQXJncyAqCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChjb25zdCBpbnQgKilyZXNwb25zZSlbMF0gaXMgdGhlIHJlY29yZCBpbmRleCB3aGVyZSB0aGUgbWVzc2FnZSBpcyBzdG9yZWQuCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9XUklURV9TTVNfVE9fU0lNIDYzCgovKioKICogUklMX1JFUVVFU1RfREVMRVRFX1NNU19PTl9TSU0KICoKICogRGVsZXRlcyBhIFNNUyBtZXNzYWdlIGZyb20gU0lNIG1lbW9yeS4KICoKICogImRhdGEiIGlzIGludCAgKgogKiAoKGludCAqKWRhdGEpWzBdIGlzIHRoZSByZWNvcmQgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlLgogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0RFTEVURV9TTVNfT05fU0lNIDY0CgovKioKICogUklMX1JFUVVFU1RfU0VUX0JBTkRfTU9ERQogKgogKiBBc3NpZ24gYSBzcGVjaWZpZWQgYmFuZCBmb3IgUkYgY29uZmlndXJhdGlvbi4KICoKICogImRhdGEiIGlzIGludCAqCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMCBmb3IgInVuc3BlY2lmaWVkIiAoc2VsZWN0ZWQgYnkgYmFzZWJhbmQgYXV0b21hdGljYWxseSkKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAxIGZvciAiRVVSTyBiYW5kIiAoR1NNLTkwMCAvIERDUy0xODAwIC8gV0NETUEtSU1ULTIwMDApCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMiBmb3IgIlVTIGJhbmQiIChHU00tODUwIC8gUENTLTE5MDAgLyBXQ0RNQS04NTAgLyBXQ0RNQS1QQ1MtMTkwMCkKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAzIGZvciAiSlBOIGJhbmQiIChXQ0RNQS04MDAgLyBXQ0RNQS1JTVQtMjAwMCkKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSA0IGZvciAiQVVTIGJhbmQiIChHU00tOTAwIC8gRENTLTE4MDAgLyBXQ0RNQS04NTAgLyBXQ0RNQS1JTVQtMjAwMCkKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSA1IGZvciAiQVVTIGJhbmQgMiIgKEdTTS05MDAgLyBEQ1MtMTgwMCAvIFdDRE1BLTg1MCkKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSA2IGZvciAiQ2VsbHVsYXIgKDgwMC1NSHogQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gNyBmb3IgIlBDUyAoMTkwMC1NSHogQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gOCBmb3IgIkJhbmQgQ2xhc3MgMyAoSlRBQ1MgQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gOSBmb3IgIkJhbmQgQ2xhc3MgNCAoS29yZWFuIFBDUyBCYW5kKSIKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAxMCBmb3IgIkJhbmQgQ2xhc3MgNSAoNDUwLU1IeiBCYW5kKSIKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAxMSBmb3IgIkJhbmQgQ2xhc3MgNiAoMi1HTUh6IElNVDIwMDAgQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMTIgZm9yICJCYW5kIENsYXNzIDcgKFVwcGVyIDcwMC1NSHogQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMTMgZm9yICJCYW5kIENsYXNzIDggKDE4MDAtTUh6IEJhbmQpIgogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDE0IGZvciAiQmFuZCBDbGFzcyA5ICg5MDAtTUh6IEJhbmQpIgogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDE1IGZvciAiQmFuZCBDbGFzcyAxMCAoU2Vjb25kYXJ5IDgwMC1NSHogQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMTYgZm9yICJCYW5kIENsYXNzIDExICg0MDAtTUh6IEV1cm9wZWFuIFBBTVIgQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMTcgZm9yICJCYW5kIENsYXNzIDE1IChBV1MgQmFuZCkiCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMTggZm9yICJCYW5kIENsYXNzIDE2IChVUyAyLjUtR0h6IEJhbmQpIgogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9CQU5EX01PREUgNjUKCi8qKgogKiBSSUxfUkVRVUVTVF9RVUVSWV9BVkFJTEFCTEVfQkFORF9NT0RFCiAqCiAqIFF1ZXJ5IHRoZSBsaXN0IG9mIGJhbmQgbW9kZSBzdXBwb3J0ZWQgYnkgUkYuCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogInJlc3BvbnNlIiBwb2ludHMgdG8gYW4gYXJyYXkgb2YgaW50J3MsIHRoZSBpbnRbMF0gaXMgdGhlIHNpemUgb2YgYXJyYXksIHJlc2V0IGlzIG9uZSBmb3IKICogZWFjaCBhdmFpbGFibGUgYmFuZCBtb2RlLgogKgogKiAgMCBmb3IgInVuc3BlY2lmaWVkIiAoc2VsZWN0ZWQgYnkgYmFzZWJhbmQgYXV0b21hdGljYWxseSkKICogIDEgZm9yICJFVVJPIGJhbmQiIChHU00tOTAwIC8gRENTLTE4MDAgLyBXQ0RNQS1JTVQtMjAwMCkKICogIDIgZm9yICJVUyBiYW5kIiAoR1NNLTg1MCAvIFBDUy0xOTAwIC8gV0NETUEtODUwIC8gV0NETUEtUENTLTE5MDApCiAqICAzIGZvciAiSlBOIGJhbmQiIChXQ0RNQS04MDAgLyBXQ0RNQS1JTVQtMjAwMCkKICogIDQgZm9yICJBVVMgYmFuZCIgKEdTTS05MDAgLyBEQ1MtMTgwMCAvIFdDRE1BLTg1MCAvIFdDRE1BLUlNVC0yMDAwKQogKiAgNSBmb3IgIkFVUyBiYW5kIDIiIChHU00tOTAwIC8gRENTLTE4MDAgLyBXQ0RNQS04NTApCiAqICA2IGZvciAiQ2VsbHVsYXIgKDgwMC1NSHogQmFuZCkiCiAqICA3IGZvciAiUENTICgxOTAwLU1IeiBCYW5kKSIKICogIDggZm9yICJCYW5kIENsYXNzIDMgKEpUQUNTIEJhbmQpIgogKiAgOSBmb3IgIkJhbmQgQ2xhc3MgNCAoS29yZWFuIFBDUyBCYW5kKSIKICogIDEwIGZvciAiQmFuZCBDbGFzcyA1ICg0NTAtTUh6IEJhbmQpIgogKiAgMTEgZm9yICJCYW5kIENsYXNzIDYgKDItR01IeiBJTVQyMDAwIEJhbmQpIgogKiAgMTIgZm9yICJCYW5kIENsYXNzIDcgKFVwcGVyIDcwMC1NSHogQmFuZCkiCiAqICAxMyBmb3IgIkJhbmQgQ2xhc3MgOCAoMTgwMC1NSHogQmFuZCkiCiAqICAxNCBmb3IgIkJhbmQgQ2xhc3MgOSAoOTAwLU1IeiBCYW5kKSIKICogIDE1IGZvciAiQmFuZCBDbGFzcyAxMCAoU2Vjb25kYXJ5IDgwMC1NSHogQmFuZCkiCiAqICAxNiBmb3IgIkJhbmQgQ2xhc3MgMTEgKDQwMC1NSHogRXVyb3BlYW4gUEFNUiBCYW5kKSIKICogIDE3IGZvciAiQmFuZCBDbGFzcyAxNSAoQVdTIEJhbmQpIgogKiAgMTggZm9yICJCYW5kIENsYXNzIDE2IChVUyAyLjUtR0h6IEJhbmQpIgogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICogU2VlIGFsc286IFJJTF9SRVFVRVNUX1NFVF9CQU5EX01PREUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfUVVFUllfQVZBSUxBQkxFX0JBTkRfTU9ERSA2NgoKLyoqCiAqIFJJTF9SRVFVRVNUX1NUS19HRVRfUFJPRklMRQogKgogKiBSZXF1ZXN0cyB0aGUgcHJvZmlsZSBvZiBTSU0gdG9vbCBraXQuCiAqIFRoZSBwcm9maWxlIGluZGljYXRlcyB0aGUgU0FUL1VTQVQgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IE1FLgogKiBUaGUgU0FUL1VTQVQgZmVhdHVyZXMgcmVmZXIgdG8gM0dQUCBUUyAxMS4xNCBhbmQgM0dQUCBUUyAzMS4xMTEKICoKICogImRhdGEiIGlzIE5VTEwKICoKICogInJlc3BvbnNlIiBpcyBhIGNvbnN0IGNoYXIgKiBjb250YWluaW5nIFNBVC9VU0FUIHByb2ZpbGUKICogaW4gaGV4YWRlY2ltYWwgZm9ybWF0IHN0cmluZyBzdGFydGluZyB3aXRoIGZpcnN0IGJ5dGUgb2YgdGVybWluYWwgcHJvZmlsZQogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBSSUxfRV9TVUNDRVNTCiAqICBSSUxfRV9SQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBSSUxfRV9HRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU1RLX0dFVF9QUk9GSUxFIDY3CgovKioKICogUklMX1JFUVVFU1RfU1RLX1NFVF9QUk9GSUxFCiAqCiAqIERvd25sb2FkIHRoZSBTVEsgdGVybWluYWwgcHJvZmlsZSBhcyBwYXJ0IG9mIFNJTSBpbml0aWFsaXphdGlvbgogKiBwcm9jZWR1cmUKICoKICogImRhdGEiIGlzIGEgY29uc3QgY2hhciAqIGNvbnRhaW5pbmcgU0FUL1VTQVQgcHJvZmlsZQogKiBpbiBoZXhhZGVjaW1hbCBmb3JtYXQgc3RyaW5nIHN0YXJ0aW5nIHdpdGggZmlyc3QgYnl0ZSBvZiB0ZXJtaW5hbCBwcm9maWxlCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBSSUxfRV9TVUNDRVNTCiAqICBSSUxfRV9SQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBSSUxfRV9HRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU1RLX1NFVF9QUk9GSUxFIDY4CgovKioKICogUklMX1JFUVVFU1RfU1RLX1NFTkRfRU5WRUxPUEVfQ09NTUFORAogKgogKiBSZXF1ZXN0cyB0byBzZW5kIGEgU0FUL1VTQVQgZW52ZWxvcGUgY29tbWFuZCB0byBTSU0uCiAqIFRoZSBTQVQvVVNBVCBlbnZlbG9wZSBjb21tYW5kIHJlZmVycyB0byAzR1BQIFRTIDExLjE0IGFuZCAzR1BQIFRTIDMxLjExMQogKgogKiAiZGF0YSIgaXMgYSBjb25zdCBjaGFyICogY29udGFpbmluZyBTQVQvVVNBVCBjb21tYW5kCiAqIGluIGhleGFkZWNpbWFsIGZvcm1hdCBzdHJpbmcgc3RhcnRpbmcgd2l0aCBjb21tYW5kIHRhZwogKgogKiAicmVzcG9uc2UiIGlzIGEgY29uc3QgY2hhciAqIGNvbnRhaW5pbmcgU0FUL1VTQVQgcmVzcG9uc2UKICogaW4gaGV4YWRlY2ltYWwgZm9ybWF0IHN0cmluZyBzdGFydGluZyB3aXRoIGZpcnN0IGJ5dGUgb2YgcmVzcG9uc2UKICogKE1heSBiZSBOVUxMKQogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBSSUxfRV9TVUNDRVNTCiAqICBSSUxfRV9SQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBSSUxfRV9HRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU1RLX1NFTkRfRU5WRUxPUEVfQ09NTUFORCA2OQoKLyoqCiAqIFJJTF9SRVFVRVNUX1NUS19TRU5EX1RFUk1JTkFMX1JFU1BPTlNFCiAqCiAqIFJlcXVlc3RzIHRvIHNlbmQgYSB0ZXJtaW5hbCByZXNwb25zZSB0byBTSU0gZm9yIGEgcmVjZWl2ZWQKICogcHJvYWN0aXZlIGNvbW1hbmQKICoKICogImRhdGEiIGlzIGEgY29uc3QgY2hhciAqIGNvbnRhaW5pbmcgU0FUL1VTQVQgcmVzcG9uc2UKICogaW4gaGV4YWRlY2ltYWwgZm9ybWF0IHN0cmluZyBzdGFydGluZyB3aXRoIGZpcnN0IGJ5dGUgb2YgcmVzcG9uc2UgZGF0YQogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgUklMX0VfU1VDQ0VTUwogKiAgUklMX0VfUkFESU9fTk9UX0FWQUlMQUJMRSAocmFkaW8gcmVzZXR0aW5nKQogKiAgUklMX0VfR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NUS19TRU5EX1RFUk1JTkFMX1JFU1BPTlNFIDcwCgovKioKICogUklMX1JFUVVFU1RfU1RLX0hBTkRMRV9DQUxMX1NFVFVQX1JFUVVFU1RFRF9GUk9NX1NJTQogKgogKiBXaGVuIFNUSyBhcHBsaWNhdGlvbiBnZXRzIFJJTF9VTlNPTF9TVEtfQ0FMTF9TRVRVUCwgdGhlIGNhbGwgYWN0dWFsbHkgaGFzCiAqIGJlZW4gaW5pdGlhbGl6ZWQgYnkgTUUgYWxyZWFkeS4gKFdlIGNvdWxkIHNlZSB0aGUgY2FsbCBoYXMgYmVlbiBpbiB0aGUgJ2NhbGwKICogbGlzdCcpIFNvLCBTVEsgYXBwbGljYXRpb24gbmVlZHMgdG8gYWNjZXB0L3JlamVjdCB0aGUgY2FsbCBhY2NvcmRpbmcgYXMgdXNlcgogKiBvcGVyYXRpb25zLgogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyA+IDAgZm9yICJhY2NlcHQiIHRoZSBjYWxsIHNldHVwCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMCBmb3IgInJlamVjdCIgdGhlIGNhbGwgc2V0dXAKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFJJTF9FX1NVQ0NFU1MKICogIFJJTF9FX1JBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIFJJTF9FX0dFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9TVEtfSEFORExFX0NBTExfU0VUVVBfUkVRVUVTVEVEX0ZST01fU0lNIDcxCgovKioKICogUklMX1JFUVVFU1RfRVhQTElDSVRfQ0FMTF9UUkFOU0ZFUgogKgogKiBDb25uZWN0cyB0aGUgdHdvIGNhbGxzIGFuZCBkaXNjb25uZWN0cyB0aGUgc3Vic2NyaWJlciBmcm9tIGJvdGggY2FsbHMuCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFIChyYWRpbyByZXNldHRpbmcpCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfRVhQTElDSVRfQ0FMTF9UUkFOU0ZFUiA3MgoKLyoqCiAqIFJJTF9SRVFVRVNUX1NFVF9QUkVGRVJSRURfTkVUV09SS19UWVBFCiAqCiAqIFJlcXVlc3RzIHRvIHNldCB0aGUgcHJlZmVycmVkIG5ldHdvcmsgdHlwZSBmb3Igc2VhcmNoaW5nIGFuZCByZWdpc3RlcmluZwogKiAoQ1MvUFMgZG9tYWluLCBSQVQsIGFuZCBvcGVyYXRpb24gbW9kZSkKICoKICogImRhdGEiIGlzIGludCAqCiAqCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMCBmb3IgR1NNL1dDRE1BIChXQ0RNQSBwcmVmZXJyZWQpCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMSBmb3IgR1NNIG9ubHkKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAyIGZvciBXQ0RNQSBvbmx5CiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMyBmb3IgR1NNL1dDRE1BIChhdXRvIG1vZGUsIGFjY29yZGluZyB0byBQUkwpCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gNCBmb3IgQ0RNQSBhbmQgRXZEbyAoYXV0byBtb2RlLCBhY2NvcmRpbmcgdG8gUFJMKQogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDUgZm9yIENETUEgb25seQogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDYgZm9yIEV2RG8gb25seQogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDcgZm9yIEdTTS9XQ0RNQSwgQ0RNQSwgYW5kIEV2RG8gKGF1dG8gbW9kZSwgYWNjb3JkaW5nIHRvIFBSTCkKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUgKHJhZGlvIHJlc2V0dGluZykKICogIEdFTkVSSUNfRkFJTFVSRQogKiAgTU9ERV9OT1RfU1VQUE9SVEVECiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9QUkVGRVJSRURfTkVUV09SS19UWVBFIDczCgovKioKICogUklMX1JFUVVFU1RfR0VUX1BSRUZFUlJFRF9ORVRXT1JLX1RZUEUKICoKICogUXVlcnkgdGhlIHByZWZlcnJlZCBuZXR3b3JrIHR5cGUgKENTL1BTIGRvbWFpbiwgUkFULCBhbmQgb3BlcmF0aW9uIG1vZGUpCiAqIGZvciBzZWFyY2hpbmcgYW5kIHJlZ2lzdGVyaW5nCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMCBmb3IgR1NNL1dDRE1BIChXQ0RNQSBwcmVmZXJyZWQpCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDEgZm9yIEdTTSBvbmx5CiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDIgZm9yIFdDRE1BIG9ubHkKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMyBmb3IgR1NNL1dDRE1BIChhdXRvIG1vZGUsIGFjY29yZGluZyB0byBQUkwpCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDQgZm9yIENETUEgYW5kIEV2RG8gKGF1dG8gbW9kZSwgYWNjb3JkaW5nIHRvIFBSTCkKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gNSBmb3IgQ0RNQSBvbmx5CiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDYgZm9yIEV2RG8gb25seQogKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyA9PSA3IGZvciBHU00vV0NETUEsIENETUEsIGFuZCBFdkRvIChhdXRvIG1vZGUsIGFjY29yZGluZyB0byBQUkwpCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKiBTZWUgYWxzbzogUklMX1JFUVVFU1RfU0VUX1BSRUZFUlJFRF9ORVRXT1JLX1RZUEUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX1BSRUZFUlJFRF9ORVRXT1JLX1RZUEUgNzQKCi8qKgogKiBSSUxfUkVRVUVTVF9ORUlHSEJPUklOR19DRUxMX0lEUwogKgogKiBSZXF1ZXN0IG5laWdoYm9yaW5nIGNlbGwgaWQgaW4gR1NNIG5ldHdvcmsKICoKICogImRhdGEiIGlzIE5VTEwKICogInJlc3BvbnNlIiBtdXN0IGJlIGEgIiBjb25zdCBSSUxfTmVpZ2hib3JpbmdDZWxsKiogIgogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX05FSUdIQk9SSU5HX0NFTExfSURTIDc1CgovKioKICogUklMX1JFUVVFU1RfU0VUX0xPQ0FUSU9OX1VQREFURVMKICoKICogRW5hYmxlcy9kaXNhYmxlcyBuZXR3b3JrIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIGR1ZSB0byBjaGFuZ2VzIGluCiAqIExBQyBhbmQvb3IgQ0lEIChmb3IgR1NNKSBvciBCSUQvU0lEL05JRC9sYXRpdHVkZS9sb25naXR1ZGUgKGZvciBDRE1BKS4KICogQmFzaWNhbGx5ICtDUkVHPTIgdnMuICtDUkVHPTEgKFRTIDI3LjAwNykuCiAqCiAqIE5vdGU6ICBUaGUgUklMIGltcGxlbWVudGF0aW9uIHNob3VsZCBkZWZhdWx0IHRvICJ1cGRhdGVzIGVuYWJsZWQiCiAqIHdoZW4gdGhlIHNjcmVlbiBpcyBvbiBhbmQgInVwZGF0ZXMgZGlzYWJsZWQiIHdoZW4gdGhlIHNjcmVlbiBpcyBvZmYuCiAqCiAqICJkYXRhIiBpcyBpbnQgKgogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDEgZm9yIHVwZGF0ZXMgZW5hYmxlZCAoK0NSRUc9MikKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAwIGZvciB1cGRhdGVzIGRpc2FibGVkICgrQ1JFRz0xKQogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqIFNlZSBhbHNvOiBSSUxfUkVRVUVTVF9TQ1JFRU5fU1RBVEUsIFJJTF9VTlNPTF9SRVNQT05TRV9ORVRXT1JLX1NUQVRFX0NIQU5HRUQKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0VUX0xPQ0FUSU9OX1VQREFURVMgNzYKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1NFVF9TVUJTQ1JJUFRJT04KICoKICogUmVxdWVzdCB0byBzZXQgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBDRE1BIHN1YnNjcmlwdGlvbiBzaGFsbAogKiBiZSByZXRyaWV2ZWQKICoKICogImRhdGEiIGlzIGludCAqCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMCBmcm9tIFJVSU0vU0lNIChkZWZhdWx0KQogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDEgZnJvbSBOVgogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqICBTSU1fQUJTRU5UCiAqICBTVUJTQ1JJUFRJT05fTk9UX0FWQUlMQUJMRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9DRE1BX1NFVF9TVUJTQ1JJUFRJT04gNzcKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1NFVF9ST0FNSU5HX1BSRUZFUkVOQ0UKICoKICogUmVxdWVzdCB0byBzZXQgdGhlIHJvYW1pbmcgcHJlZmVyZW5jZXMgaW4gQ0RNQQogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAwIGZvciBIb21lIE5ldHdvcmtzIG9ubHksIGFzIGRlZmluZWQgaW4gUFJMCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMSBmb3IgUm9hbWluZyBvbiBBZmZpbGlhdGVkIG5ldHdvcmtzLCBhcyBkZWZpbmVkIGluIFBSTAogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDIgZm9yIFJvYW1pbmcgb24gQW55IE5ldHdvcmssIGFzIGRlZmluZWQgaW4gdGhlIFBSTAogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfU0VUX1JPQU1JTkdfUFJFRkVSRU5DRSA3OAoKLyoqCiAqIFJJTF9SRVFVRVNUX0NETUFfUVVFUllfUk9BTUlOR19QUkVGRVJFTkNFCiAqCiAqIFJlcXVlc3QgdGhlIGFjdHVhbCBzZXR0aW5nIG9mIHRoZSByb2FtaW5nIHByZWZlcmVuY2VzIGluIENETUEgaW4gdGhlIG1vZGVtCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgaW50ICoKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMCBmb3IgSG9tZSBOZXR3b3JrcyBvbmx5LCBhcyBkZWZpbmVkIGluIFBSTAogKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyA9PSAxIGZvciBSb2FtaW5nIG9uIEFmZmlsaWF0ZWQgbmV0d29ya3MsIGFzIGRlZmluZWQgaW4gUFJMCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDIgZm9yIFJvYW1pbmcgb24gQW55IE5ldHdvcmssIGFzIGRlZmluZWQgaW4gdGhlIFBSTAogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfUVVFUllfUk9BTUlOR19QUkVGRVJFTkNFIDc5CgovKioKICogUklMX1JFUVVFU1RfU0VUX1RUWV9NT0RFCiAqCiAqIFJlcXVlc3QgdG8gc2V0IHRoZSBUVFkgbW9kZQogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAwIGZvciBUVFkgb2ZmCiAqICgoaW50ICopZGF0YSlbMF0gaXMgPT0gMSBmb3IgVFRZIEZ1bGwKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAyIGZvciBUVFkgSENPIChoZWFyaW5nIGNhcnJ5b3ZlcikKICogKChpbnQgKilkYXRhKVswXSBpcyA9PSAzIGZvciBUVFkgVkNPICh2b2ljZSBjYXJyeW92ZXIpCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfU0VUX1RUWV9NT0RFIDgwCgovKioKICogUklMX1JFUVVFU1RfUVVFUllfVFRZX01PREUKICoKICogUmVxdWVzdCB0aGUgc2V0dGluZyBvZiBUVFkgbW9kZQogKgogKiAiZGF0YSIgaXMgTlVMTAogKgogKiAicmVzcG9uc2UiIGlzIGludCAqCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDAgZm9yIFRUWSBvZmYKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMSBmb3IgVFRZIEZ1bGwKICogKChpbnQgKilyZXNwb25zZSlbMF0gaXMgPT0gMiBmb3IgVFRZIEhDTyAoaGVhcmluZyBjYXJyeW92ZXIpCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDMgZm9yIFRUWSBWQ08gKHZvaWNlIGNhcnJ5b3ZlcikKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9RVUVSWV9UVFlfTU9ERSA4MQoKLyoqCiAqIFJJTF9SRVFVRVNUX0NETUFfU0VUX1BSRUZFUlJFRF9WT0lDRV9QUklWQUNZX01PREUKICoKICogUmVxdWVzdCB0byBzZXQgdGhlIHByZWZlcnJlZCB2b2ljZSBwcml2YWN5IG1vZGUgdXNlZCBpbiB2b2ljZQogKiBzY3JhbWJsaW5nCiAqCiAqICJkYXRhIiBpcyBpbnQgKgogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDAgZm9yIFN0YW5kYXJkIFByaXZhY3kgTW9kZSAoUHVibGljIExvbmcgQ29kZSBNYXNrKQogKiAoKGludCAqKWRhdGEpWzBdIGlzID09IDEgZm9yIEVuaGFuY2VkIFByaXZhY3kgTW9kZSAoUHJpdmF0ZSBMb25nIENvZGUgTWFzaykKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9DRE1BX1NFVF9QUkVGRVJSRURfVk9JQ0VfUFJJVkFDWV9NT0RFIDgyCgovKioKICogUklMX1JFUVVFU1RfQ0RNQV9RVUVSWV9QUkVGRVJSRURfVk9JQ0VfUFJJVkFDWV9NT0RFCiAqCiAqIFJlcXVlc3QgdGhlIHNldHRpbmcgb2YgcHJlZmVycmVkIHZvaWNlIHByaXZhY3kgbW9kZQogKgogKiAiZGF0YSIgaXMgTlVMTAogKgogKiAicmVzcG9uc2UiIGlzIGludCAqCiAqICgoaW50ICopcmVzcG9uc2UpWzBdIGlzID09IDAgZm9yIFN0YW5kYXJkIFByaXZhY3kgTW9kZSAoUHVibGljIExvbmcgQ29kZSBNYXNrKQogKiAoKGludCAqKXJlc3BvbnNlKVswXSBpcyA9PSAxIGZvciBFbmhhbmNlZCBQcml2YWN5IE1vZGUgKFByaXZhdGUgTG9uZyBDb2RlIE1hc2spCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0RNQV9RVUVSWV9QUkVGRVJSRURfVk9JQ0VfUFJJVkFDWV9NT0RFIDgzCgovKioKICogUklMX1JFUVVFU1RfQ0RNQV9GTEFTSAogKgogKiBTZW5kIEZMQVNICiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoKICogKChjb25zdCBjaGFyICopZGF0YSlbMF0gaXMgYSBGTEFTSCBzdHJpbmcKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9DRE1BX0ZMQVNIIDg0CgovKioKICogUklMX1JFUVVFU1RfQ0RNQV9CVVJTVF9EVE1GCiAqCiAqIFNlbmQgRFRNRiBzdHJpbmcKICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKioKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzBdIGlzIGEgRFRNRiBzdHJpbmcKICogKChjb25zdCBjaGFyICoqKWRhdGEpWzFdIGlzIHRoZSBEVE1GIE9OIGxlbmd0aCBpbiBtaWxsaXNlY29uZHMsIG9yIDAgdG8gdXNlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0CiAqICgoY29uc3QgY2hhciAqKilkYXRhKVsyXSBpcyB0aGUgRFRNRiBPRkYgbGVuZ3RoIGluIG1pbGxpc2Vjb25kcywgb3IgMCB0byB1c2UKICogICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9DRE1BX0JVUlNUX0RUTUYgODUKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1ZBTElEQVRFX0FORF9XUklURV9BS0VZCiAqCiAqIFRha2VzIGEgMjYgZGlnaXQgc3RyaW5nICgyMCBkaWdpdCBBS0VZICsgNiBkaWdpdCBjaGVja3N1bSkuCiAqIElmIHRoZSBjaGVja3N1bSBpcyB2YWxpZCB0aGUgMjAgZGlnaXQgQUtFWSBpcyB3cml0dGVuIHRvIE5WLAogKiByZXBsYWNpbmcgdGhlIGV4aXN0aW5nIEFLRVkgbm8gbWF0dGVyIHdoYXQgaXQgd2FzIGJlZm9yZS4KICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKgogKiAoKGNvbnN0IGNoYXIgKilkYXRhKVswXSBpcyBhIDI2IGRpZ2l0IHN0cmluZyAoQVNDSUkgZGlnaXRzICcwJy0nOScpCiAqICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBsYXN0IDYgZGlnaXRzIGFyZSBhIGNoZWNrc3VtIG9mIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCAyMCwgYXMgc3BlY2lmaWVkIGluIFRSNDUuQUhBRwogKiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbW9uIENyeXB0b2dyYXBoaWMgQWxnb3JpdGhtcywgUmV2aXNpb24gRC4xCiAqICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb24gMi4yIgogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfVkFMSURBVEVfQU5EX1dSSVRFX0FLRVkgODYKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1NFTkRfU01TCiAqCiAqIFNlbmQgYSBDRE1BIFNNUyBtZXNzYWdlCiAqCiAqICJkYXRhIiBpcyBjb25zdCBSSUxfQ0RNQV9TTVNfTWVzc2FnZSAqCiAqCiAqICJyZXNwb25zZSIgaXMgYSBjb25zdCBSSUxfU01TX1Jlc3BvbnNlICoKICoKICogQmFzZWQgb24gdGhlIHJldHVybiBlcnJvciwgY2FsbGVyIGRlY2lkZXMgdG8gcmVzZW5kIGlmIHNlbmRpbmcgc21zCiAqIGZhaWxzLiBUaGUgQ0RNQSBlcnJvciBjbGFzcyBpcyBkZXJpdmVkIGFzIGZvbGxvd3MsCiAqIFNVQ0NFU1MgaXMgZXJyb3IgY2xhc3MgMCAobm8gZXJyb3IpCiAqIFNNU19TRU5EX0ZBSUxfUkVUUlkgaXMgZXJyb3IgY2xhc3MgMiAodGVtcG9yYXJ5IGZhaWx1cmUpCiAqIGFuZCBHRU5FUklDX0ZBSUxVUkUgaXMgZXJyb3IgY2xhc3MgMyAocGVybWFuZW50IGFuZCBubyByZXRyeSkKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgU01TX1NFTkRfRkFJTF9SRVRSWQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfU0VORF9TTVMgODcKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1NNU19BQ0tOT1dMRURHRQogKgogKiBBY2tub3dsZWRnZSB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIGluIHRoZSByZWNlaXB0IG9mIFNNUwogKiBwcmV2aW91c2x5IGluZGljYXRlZCB2aWEgUklMX1VOU09MX1JFU1BPTlNFX0NETUFfTkVXX1NNUwogKgogKiAiZGF0YSIgaXMgY29uc3QgUklMX0NETUFfU01TX0FjayAqCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0RNQV9TTVNfQUNLTk9XTEVER0UgODgKCi8qKgogKiBSSUxfUkVRVUVTVF9HU01fR0VUX0JST0FEQ0FTVF9TTVNfQ09ORklHCiAqCiAqIFJlcXVlc3QgdGhlIHNldHRpbmcgb2YgR1NNL1dDRE1BIENlbGwgQnJvYWRjYXN0IFNNUyBjb25maWcuCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgYSBjb25zdCBSSUxfR1NNX0Jyb2FkY2FzdFNtc0NvbmZpZ0luZm8gKioKICogInJlc3BvbnNlbGVuIiBpcyBjb3VudCAqIHNpemVvZiAoUklMX0dTTV9Ccm9hZGNhc3RTbXNDb25maWdJbmZvICopCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9HU01fR0VUX0JST0FEQ0FTVF9TTVNfQ09ORklHIDg5CgovKioKICogUklMX1JFUVVFU1RfR1NNX1NFVF9CUk9BRENBU1RfU01TX0NPTkZJRwogKgogKiBTZXQgR1NNL1dDRE1BIENlbGwgQnJvYWRjYXN0IFNNUyBjb25maWcKICoKICogImRhdGEiIGlzIGEgY29uc3QgUklMX0dTTV9Ccm9hZGNhc3RTbXNDb25maWdJbmZvICoqCiAqICJkYXRhbGVuIiBpcyBjb3VudCAqIHNpemVvZihSSUxfR1NNX0Jyb2FkY2FzdFNtc0NvbmZpZ0luZm8gKikKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9HU01fU0VUX0JST0FEQ0FTVF9TTVNfQ09ORklHIDkwCgovKioKICogUklMX1JFUVVFU1RfR1NNX1NNU19CUk9BRENBU1RfQUNUSVZBVElPTgogKgoqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSByZWNlcHRpb24gb2YgR1NNL1dDRE1BIENlbGwgQnJvYWRjYXN0IFNNUwogKgogKiAiZGF0YSIgaXMgY29uc3QgaW50ICoKICogKGNvbnN0IGludCAqKWRhdGFbMF0gaW5kaWNhdGVzIHRvIGFjdGl2YXRlIG9yIHR1cm4gb2ZmIHRoZQogKiByZWNlcHRpb24gb2YgR1NNL1dDRE1BIENlbGwgQnJvYWRjYXN0IFNNUywgMC0xLAogKiAgICAgICAgICAgICAgICAgICAgICAgMCAtIEFjdGl2YXRlLCAxIC0gVHVybiBvZmYKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9HU01fU01TX0JST0FEQ0FTVF9BQ1RJVkFUSU9OIDkxCgovKioKICogUklMX1JFUVVFU1RfQ0RNQV9HRVRfQlJPQURDQVNUX1NNU19DT05GSUcKICoKICogUmVxdWVzdCB0aGUgc2V0dGluZyBvZiBDRE1BIEJyb2FkY2FzdCBTTVMgY29uZmlnCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgYSBjb25zdCBSSUxfQ0RNQV9Ccm9hZGNhc3RTbXNDb25maWdJbmZvICoqCiAqICJyZXNwb25zZWxlbiIgaXMgY291bnQgKiBzaXplb2YgKFJJTF9DRE1BX0Jyb2FkY2FzdFNtc0NvbmZpZ0luZm8gKikKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfR0VUX0JST0FEQ0FTVF9TTVNfQ09ORklHIDkyCgovKioKICogUklMX1JFUVVFU1RfQ0RNQV9TRVRfQlJPQURDQVNUX1NNU19DT05GSUcKICoKICogU2V0IENETUEgQnJvYWRjYXN0IFNNUyBjb25maWcKICoKICogImRhdGEiIGlzIGFuIGNvbnN0IFJJTF9DRE1BX0Jyb2FkY2FzdFNtc0NvbmZpZ0luZm8gKioKICogImRhdGFsZW4iIGlzIGNvdW50ICogc2l6ZW9mKGNvbnN0IFJJTF9DRE1BX0Jyb2FkY2FzdFNtc0NvbmZpZ0luZm8gKikKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9DRE1BX1NFVF9CUk9BRENBU1RfU01TX0NPTkZJRyA5MwoKLyoqCiAqIFJJTF9SRVFVRVNUX0NETUFfU01TX0JST0FEQ0FTVF9BQ1RJVkFUSU9OCiAqCiAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSByZWNlcHRpb24gb2YgQ0RNQSBCcm9hZGNhc3QgU01TCiAqCiAqICJkYXRhIiBpcyBjb25zdCBpbnQgKgogKiAoY29uc3QgaW50ICopZGF0YVswXSBpbmRpY2F0ZXMgdG8gYWN0aXZhdGUgb3IgdHVybiBvZmYgdGhlCiAqIHJlY2VwdGlvbiBvZiBDRE1BIEJyb2FkY2FzdCBTTVMsIDAtMSwKICogICAgICAgICAgICAgICAgICAgICAgIDAgLSBBY3RpdmF0ZSwgMSAtIFR1cm4gb2ZmCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0RNQV9TTVNfQlJPQURDQVNUX0FDVElWQVRJT04gOTQKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1NVQlNDUklQVElPTgogKgogKiBSZXF1ZXN0IHRoZSBkZXZpY2UgTUROIC8gSF9TSUQgLyBIX05JRC4KICoKICogVGhlIHJlcXVlc3QgaXMgb25seSBhbGxvd2VkIHdoZW4gQ0RNQSBzdWJzY3JpcHRpb24gaXMgYXZhaWxhYmxlLiAgV2hlbiBDRE1BCiAqIHN1YnNjcmlwdGlvbiBpcyBjaGFuZ2VkLCBhcHBsaWNhdGlvbiBsYXllciBzaG91bGQgcmUtaXNzdWUgdGhlIHJlcXVlc3QgdG8KICogdXBkYXRlIHRoZSBzdWJzY3JpcHRpb24gaW5mb3JtYXRpb24uCiAqCiAqIElmIGEgTlVMTCB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgYW55IG9mIHRoZSBkZXZpY2UgaWQsIGl0IG1lYW5zIHRoYXQgZXJyb3IKICogYWNjZXNzaW5nIHRoZSBkZXZpY2UuCiAqCiAqICJyZXNwb25zZSIgaXMgY29uc3QgY2hhciAqKgogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzBdIGlzIE1ETiBpZiBDRE1BIHN1YnNjcmlwdGlvbiBpcyBhdmFpbGFibGUKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVsxXSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIEhfU0lEIChIb21lIFNJRCkgaWYKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRE1BIHN1YnNjcmlwdGlvbiBpcyBhdmFpbGFibGUsIGluIGRlY2ltYWwgZm9ybWF0CiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMl0gaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBIX05JRCAoSG9tZSBOSUQpIGlmCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RNQSBzdWJzY3JpcHRpb24gaXMgYXZhaWxhYmxlLCBpbiBkZWNpbWFsIGZvcm1hdAogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzNdIGlzIE1JTiAoMTAgZGlnaXRzLCBNSU4yK01JTjEpIGlmIENETUEgc3Vic2NyaXB0aW9uIGlzIGF2YWlsYWJsZQogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzRdIGlzIFBSTCB2ZXJzaW9uIGlmIENETUEgc3Vic2NyaXB0aW9uIGlzIGF2YWlsYWJsZQogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSSUxfRV9TVUJTQ1JJUFRJT05fTk9UX0FWQUlMQUJMRQogKi8KCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0RNQV9TVUJTQ1JJUFRJT04gOTUKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX1dSSVRFX1NNU19UT19SVUlNCiAqCiAqIFN0b3JlcyBhIENETUEgU01TIG1lc3NhZ2UgdG8gUlVJTSBtZW1vcnkuCiAqCiAqICJkYXRhIiBpcyBSSUxfQ0RNQV9TTVNfV3JpdGVBcmdzICoKICoKICogInJlc3BvbnNlIiBpcyBpbnQgKgogKiAoKGNvbnN0IGludCAqKXJlc3BvbnNlKVswXSBpcyB0aGUgcmVjb3JkIGluZGV4IHdoZXJlIHRoZSBtZXNzYWdlIGlzIHN0b3JlZC4KICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX0NETUFfV1JJVEVfU01TX1RPX1JVSU0gOTYKCi8qKgogKiBSSUxfUkVRVUVTVF9DRE1BX0RFTEVURV9TTVNfT05fUlVJTQogKgogKiBEZWxldGVzIGEgQ0RNQSBTTVMgbWVzc2FnZSBmcm9tIFJVSU0gbWVtb3J5LgogKgogKiAiZGF0YSIgaXMgaW50ICAqCiAqICgoaW50ICopZGF0YSlbMF0gaXMgdGhlIHJlY29yZCBpbmRleCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfQ0RNQV9ERUxFVEVfU01TX09OX1JVSU0gOTcKCi8qKgogKiBSSUxfUkVRVUVTVF9ERVZJQ0VfSURFTlRJVFkKICoKICogUmVxdWVzdCB0aGUgZGV2aWNlIEVTTiAvIE1FSUQgLyBJTUVJIC8gSU1FSVNWLgogKgogKiBUaGUgcmVxdWVzdCBpcyBhbHdheXMgYWxsb3dlZCBhbmQgY29udGFpbnMgR1NNIGFuZCBDRE1BIGRldmljZSBpZGVudGl0eTsKICogaXQgc3Vic3RpdHV0ZXMgdGhlIGRlcHJlY2F0ZWQgcmVxdWVzdHMgUklMX1JFUVVFU1RfR0VUX0lNRUkgYW5kCiAqIFJJTF9SRVFVRVNUX0dFVF9JTUVJU1YuCiAqCiAqIElmIGEgTlVMTCB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgYW55IG9mIHRoZSBkZXZpY2UgaWQsIGl0IG1lYW5zIHRoYXQgZXJyb3IKICogYWNjZXNzaW5nIHRoZSBkZXZpY2UuCiAqCiAqIFdoZW4gQ0RNQSBzdWJzY3JpcHRpb24gaXMgY2hhbmdlZCB0aGUgRVNOL01FSUQgbWF5IGNoYW5nZS4gIFRoZSBhcHBsaWNhdGlvbgogKiBsYXllciBzaG91bGQgcmUtaXNzdWUgdGhlIHJlcXVlc3QgdG8gdXBkYXRlIHRoZSBkZXZpY2UgaWRlbnRpdHkgaW4gdGhpcyBjYXNlLgogKgogKiAicmVzcG9uc2UiIGlzIGNvbnN0IGNoYXIgKioKICogKChjb25zdCBjaGFyICoqKXJlc3BvbnNlKVswXSBpcyBJTUVJIGlmIEdTTSBzdWJzY3JpcHRpb24gaXMgYXZhaWxhYmxlCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMV0gaXMgSU1FSVNWIGlmIEdTTSBzdWJzY3JpcHRpb24gaXMgYXZhaWxhYmxlCiAqICgoY29uc3QgY2hhciAqKilyZXNwb25zZSlbMl0gaXMgRVNOIGlmIENETUEgc3Vic2NyaXB0aW9uIGlzIGF2YWlsYWJsZQogKiAoKGNvbnN0IGNoYXIgKiopcmVzcG9uc2UpWzNdIGlzIE1FSUQgaWYgQ0RNQSBzdWJzY3JpcHRpb24gaXMgYXZhaWxhYmxlCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9ERVZJQ0VfSURFTlRJVFkgOTgKCi8qKgogKiBSSUxfUkVRVUVTVF9FWElUX0VNRVJHRU5DWV9DQUxMQkFDS19NT0RFCiAqCiAqIFJlcXVlc3QgdGhlIHJhZGlvJ3Mgc3lzdGVtIHNlbGVjdGlvbiBtb2R1bGUgdG8gZXhpdCBlbWVyZ2VuY3kKICogY2FsbGJhY2sgbW9kZS4gIFJJTCB3aWxsIG5vdCByZXNwb25kIHdpdGggU1VDQ0VTUyB1bnRpbCB0aGUgbW9kZW0gaGFzCiAqIGNvbXBsZXRlbHkgZXhpdGVkIGZyb20gRW1lcmdlbmN5IENhbGxiYWNrIE1vZGUuCiAqCiAqICJkYXRhIiBpcyBOVUxMCiAqCiAqICJyZXNwb25zZSIgaXMgTlVMTAogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfRVhJVF9FTUVSR0VOQ1lfQ0FMTEJBQ0tfTU9ERSA5OQoKLyoqCiAqIFJJTF9SRVFVRVNUX0dFVF9TTVNDX0FERFJFU1MKICoKICogUXVlcmllcyB0aGUgZGVmYXVsdCBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgQ2VudGVyIGFkZHJlc3Mgb24gdGhlIGRldmljZS4KICoKICogImRhdGEiIGlzIE5VTEwKICoKICogInJlc3BvbnNlIiBpcyBjb25zdCBjaGFyICogY29udGFpbmluZyB0aGUgU01TQyBhZGRyZXNzLgogKgogKiBWYWxpZCBlcnJvcnM6CiAqICBTVUNDRVNTCiAqICBSQURJT19OT1RfQVZBSUxBQkxFCiAqICBHRU5FUklDX0ZBSUxVUkUKICoKICovCiNkZWZpbmUgUklMX1JFUVVFU1RfR0VUX1NNU0NfQUREUkVTUyAxMDAKCi8qKgogKiBSSUxfUkVRVUVTVF9TRVRfU01TQ19BRERSRVNTCiAqCiAqIFNldHMgdGhlIGRlZmF1bHQgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIENlbnRlciBhZGRyZXNzIG9uIHRoZSBkZXZpY2UuCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICogY29udGFpbmluZyB0aGUgU01TQyBhZGRyZXNzLgogKgogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1NFVF9TTVNDX0FERFJFU1MgMTAxCgovKioKICogUklMX1JFUVVFU1RfUkVQT1JUX1NNU19NRU1PUllfU1RBVFVTCiAqCiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGlzIHN0b3JhZ2UgYXZhaWxhYmxlIGZvciBuZXcgU01TIG1lc3NhZ2VzLgogKgogKiAiZGF0YSIgaXMgaW50ICoKICogKChpbnQgKilkYXRhKVswXSBpcyAxIGlmIG1lbW9yeSBpcyBhdmFpbGFibGUgZm9yIHN0b3JpbmcgbmV3IG1lc3NhZ2VzCiAqICAgICAgICAgICAgICAgICAgaXMgMCBpZiBtZW1vcnkgY2FwYWNpdHkgaXMgZXhjZWVkZWQKICoKICogInJlc3BvbnNlIiBpcyBOVUxMCiAqCiAqIFZhbGlkIGVycm9yczoKICogIFNVQ0NFU1MKICogIFJBRElPX05PVF9BVkFJTEFCTEUKICogIEdFTkVSSUNfRkFJTFVSRQogKgogKi8KI2RlZmluZSBSSUxfUkVRVUVTVF9SRVBPUlRfU01TX01FTU9SWV9TVEFUVVMgMTAyCgovKioKICogUklMX1JFUVVFU1RfUkVQT1JUX1NUS19TRVJWSUNFX0lTX1JVTk5JTkcKICoKICogSW5kaWNhdGVzIHRoYXQgdGhlIFN0a1Nlcml2Y2UgaXMgcnVubmluZyBhbmQgaXMKICogcmVhZHkgdG8gcmVjZWl2ZSBSSUxfVU5TT0xfU1RLX1hYWFhYIGNvbW1hbmRzLgogKgogKiAiZGF0YSIgaXMgTlVMTAogKiAicmVzcG9uc2UiIGlzIE5VTEwKICoKICogVmFsaWQgZXJyb3JzOgogKiAgU1VDQ0VTUwogKiAgUkFESU9fTk9UX0FWQUlMQUJMRQogKiAgR0VORVJJQ19GQUlMVVJFCiAqCiAqLwojZGVmaW5lIFJJTF9SRVFVRVNUX1JFUE9SVF9TVEtfU0VSVklDRV9JU19SVU5OSU5HIDEwMwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojZGVmaW5lIFJJTF9VTlNPTF9SRVNQT05TRV9CQVNFIDEwMDAKCi8qKgogKiBSSUxfVU5TT0xfUkVTUE9OU0VfUkFESU9fU1RBVEVfQ0hBTkdFRAogKgogKiBJbmRpY2F0ZSB3aGVuIHZhbHVlIG9mIFJJTF9SYWRpb1N0YXRlIGhhcyBjaGFuZ2VkLgogKgogKiBDYWxsZWUgd2lsbCBpbnZva2UgUklMX1JhZGlvU3RhdGVSZXF1ZXN0IG1ldGhvZCBvbiBtYWluIHRocmVhZAogKgogKiAiZGF0YSIgaXMgTlVMTAogKi8KCiNkZWZpbmUgUklMX1VOU09MX1JFU1BPTlNFX1JBRElPX1NUQVRFX0NIQU5HRUQgMTAwMAoKCi8qKgogKiBSSUxfVU5TT0xfUkVTUE9OU0VfQ0FMTF9TVEFURV9DSEFOR0VECiAqCiAqIEluZGljYXRlIHdoZW4gY2FsbCBzdGF0ZSBoYXMgY2hhbmdlZAogKgogKiBDYWxsZWUgd2lsbCBpbnZva2UgUklMX1JFUVVFU1RfR0VUX0NVUlJFTlRfQ0FMTFMgb24gbWFpbiB0aHJlYWQKICoKICogImRhdGEiIGlzIE5VTEwKICoKICogUmVzcG9uc2Ugc2hvdWxkIGJlIGludm9rZWQgb24sIGZvciBleGFtcGxlLAogKiAiUklORyIsICJCVVNZIiwgIk5PIENBUlJJRVIiLCBhbmQgYWxzbyBjYWxsIHN0YXRlCiAqIHRyYW5zaXRpb25zIChESUFMSU5HLT5BTEVSVElORyBBTEVSVElORy0+QUNUSVZFKQogKgogKiBSZWR1bmRlbnQgb3IgZXh0cmFuZW91cyBpbnZvY2F0aW9ucyBhcmUgdG9sZXJhdGVkCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9SRVNQT05TRV9DQUxMX1NUQVRFX0NIQU5HRUQgMTAwMQoKCi8qKgogKiBSSUxfVU5TT0xfUkVTUE9OU0VfTkVUV09SS19TVEFURV9DSEFOR0VECiAqCiAqIENhbGxlZCB3aGVuIG5ldHdvcmsgc3RhdGUsIG9wZXJhdG9yIG5hbWUsIG9yIEdQUlMgc3RhdGUgaGFzIGNoYW5nZWQKICogQmFzaWNhbGx5IG9uLCArQ1JFRyBhbmQgK0NHUkVHCiAqCiAqIENhbGxlZSB3aWxsIGludm9rZSB0aGUgZm9sbG93aW5nIHJlcXVlc3RzIG9uIG1haW4gdGhyZWFkOgogKgogKiBSSUxfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVEUKICogUklMX1JFUVVFU1RfR1BSU19SRUdJU1RSQVRJT05fU1RBVEUKICogUklMX1JFUVVFU1RfT1BFUkFUT1IKICoKICogImRhdGEiIGlzIE5VTEwKICoKICogRklYTUUgc2hvdWxkIHRoaXMgaGFwcGVuIHdoZW4gU0lNIHJlY29yZHMgYXJlIGxvYWRlZD8gKGVnLCBmb3IKICogRU9OUykKICovCiNkZWZpbmUgUklMX1VOU09MX1JFU1BPTlNFX05FVFdPUktfU1RBVEVfQ0hBTkdFRCAxMDAyCgovKioKICogUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVMKICoKICogQ2FsbGVkIHdoZW4gbmV3IFNNUyBpcyByZWNlaXZlZC4KICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKgogKiBUaGlzIGlzIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBQRFUgb2YgYW4gU01TLURFTElWRVIKICogYXMgYW4gYXNjaWkgc3RyaW5nIG9mIGhleCBkaWdpdHMuIFRoZSBQRFUgc3RhcnRzIHdpdGggdGhlIFNNU0MgYWRkcmVzcwogKiBwZXIgVFMgMjcuMDA1ICgrQ01UOikKICoKICogQ2FsbGVlIHdpbGwgc3Vic2VxdWVudGx5IGNvbmZpcm0gdGhlIHJlY2VpcHQgb2YgdGhlaSBTTVMgd2l0aCBhCiAqIFJJTF9SRVFVRVNUX1NNU19BQ0tOT1dMRURHRQogKgogKiBObyBuZXcgUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVMKICogb3IgUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVNfU1RBVFVTX1JFUE9SVCBtZXNzYWdlcyBzaG91bGQgYmUgc2VudCB1bnRpbCBhCiAqIFJJTF9SRVFVRVNUX1NNU19BQ0tOT1dMRURHRSBoYXMgYmVlbiByZWNlaXZlZAogKi8KCiNkZWZpbmUgUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVMgMTAwMwoKLyoqCiAqIFJJTF9VTlNPTF9SRVNQT05TRV9ORVdfU01TX1NUQVRVU19SRVBPUlQKICoKICogQ2FsbGVkIHdoZW4gbmV3IFNNUyBTdGF0dXMgUmVwb3J0IGlzIHJlY2VpdmVkLgogKgogKiAiZGF0YSIgaXMgY29uc3QgY2hhciAqCiAqIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFBEVSBvZiBhbiBTTVMtU1RBVFVTLVJFUE9SVAogKiBhcyBhbiBhc2NpaSBzdHJpbmcgb2YgaGV4IGRpZ2l0cy4gVGhlIFBEVSBzdGFydHMgd2l0aCB0aGUgU01TQyBhZGRyZXNzCiAqIHBlciBUUyAyNy4wMDUgKCtDRFM6KS4KICoKICogQ2FsbGVlIHdpbGwgc3Vic2VxdWVudGx5IGNvbmZpcm0gdGhlIHJlY2VpcHQgb2YgdGhlIFNNUyB3aXRoIGEKICogUklMX1JFUVVFU1RfU01TX0FDS05PV0xFREdFCiAqCiAqIE5vIG5ldyBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNUwogKiBvciBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNU19TVEFUVVNfUkVQT1JUIG1lc3NhZ2VzIHNob3VsZCBiZSBzZW50IHVudGlsIGEKICogUklMX1JFUVVFU1RfU01TX0FDS05PV0xFREdFIGhhcyBiZWVuIHJlY2VpdmVkCiAqLwoKI2RlZmluZSBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNU19TVEFUVVNfUkVQT1JUIDEwMDQKCi8qKgogKiBSSUxfVU5TT0xfUkVTUE9OU0VfTkVXX1NNU19PTl9TSU0KICoKICogQ2FsbGVkIHdoZW4gbmV3IFNNUyBoYXMgYmVlbiBzdG9yZWQgb24gU0lNIGNhcmQKICoKICogImRhdGEiIGlzIGNvbnN0IGludCAqCiAqICgoY29uc3QgaW50ICopZGF0YSlbMF0gY29udGFpbnMgdGhlIHNsb3QgaW5kZXggb24gdGhlIFNJTSB0aGF0IGNvbnRhaW5zCiAqIHRoZSBuZXcgbWVzc2FnZQogKi8KCiNkZWZpbmUgUklMX1VOU09MX1JFU1BPTlNFX05FV19TTVNfT05fU0lNIDEwMDUKCi8qKgogKiBSSUxfVU5TT0xfT05fVVNTRAogKgogKiBDYWxsZWQgd2hlbiBhIG5ldyBVU1NEIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICoqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVswXSBwb2ludHMgdG8gYSB0eXBlIGNvZGUsIHdoaWNoIGlzCiAqICBvbmUgb2YgdGhlc2Ugc3RyaW5nIHZhbHVlczoKICogICAgICAiMCIgICBVU1NELU5vdGlmeSAtLSB0ZXh0IGluICgoY29uc3QgY2hhciAqKilkYXRhKVsxXQogKiAgICAgICIxIiAgIFVTU0QtUmVxdWVzdCAtLSB0ZXh0IGluICgoY29uc3QgY2hhciAqKilkYXRhKVsxXQogKiAgICAgICIyIiAgIFNlc3Npb24gdGVybWluYXRlZCBieSBuZXR3b3JrCiAqICAgICAgIjMiICAgb3RoZXIgbG9jYWwgY2xpZW50IChlZywgU0lNIFRvb2xraXQpIGhhcyByZXNwb25kZWQKICogICAgICAiNCIgICBPcGVyYXRpb24gbm90IHN1cHBvcnRlZAogKiAgICAgICI1IiAgIE5ldHdvcmsgdGltZW91dAogKgogKiBUaGUgVVNTRCBzZXNzaW9uIGlzIGFzc3VtZWQgdG8gcGVyc2lzdCBpZiB0aGUgdHlwZSBjb2RlIGlzICIxIiwgb3RoZXJ3aXNlCiAqIHRoZSBjdXJyZW50IHNlc3Npb24gKGlmIGFueSkgaXMgYXNzdW1lZCB0byBoYXZlIHRlcm1pbmF0ZWQuCiAqCiAqICgoY29uc3QgY2hhciAqKilkYXRhKVsxXSBwb2ludHMgdG8gYSBtZXNzYWdlIHN0cmluZyBpZiBhcHBsaWNhYmxlLCB3aGljaAogKiBzaG91bGQgYWx3YXlzIGJlIGluIFVURi04LgogKi8KI2RlZmluZSBSSUxfVU5TT0xfT05fVVNTRCAxMDA2Ci8qIFByZXZpb3VzbHkgI2RlZmluZSBSSUxfVU5TT0xfT05fVVNTRF9OT1RJRlkgMTAwNiAgICovCgovKioKICogUklMX1VOU09MX09OX1VTU0RfUkVRVUVTVAogKgogKiBPYnNvbGV0ZS4gU2VuZCB2aWEgUklMX1VOU09MX09OX1VTU0QKICovCiNkZWZpbmUgUklMX1VOU09MX09OX1VTU0RfUkVRVUVTVCAxMDA3CgoKLyoqCiAqIFJJTF9VTlNPTF9OSVRaX1RJTUVfUkVDRUlWRUQKICoKICogQ2FsbGVkIHdoZW4gcmFkaW8gaGFzIHJlY2VpdmVkIGEgTklUWiB0aW1lIG1lc3NhZ2UKICoKICogImRhdGEiIGlzIGNvbnN0IGNoYXIgKiBwb2ludGluZyB0byBOSVRaIHRpbWUgc3RyaW5nCiAqIGluIHRoZSBmb3JtICJ5eS9tbS9kZCxoaDptbTpzcygrLy0pdHosZHQiCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9OSVRaX1RJTUVfUkVDRUlWRUQgIDEwMDgKCi8qKgogKiBSSUxfVU5TT0xfU0lHTkFMX1NUUkVOR1RICiAqCiAqIFJhZGlvIG1heSByZXBvcnQgc2lnbmFsIHN0cmVuZ3RoIHJhdGhlciBoYW4gaGF2ZSBpdCBwb2xsZWQuCiAqCiAqICJkYXRhIiBpcyBhIGNvbnN0IFJJTF9TaWduYWxTdHJlbmd0aCAqCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9TSUdOQUxfU1RSRU5HVEggIDEwMDkKCgovKioKICogUklMX1VOU09MX0RBVEFfQ0FMTF9MSVNUX0NIQU5HRUQKICoKICogSW5kaWNhdGUgYSBQRFAgY29udGV4dCBzdGF0ZSBoYXMgY2hhbmdlZCwgb3IgYSBuZXcgY29udGV4dAogKiBoYXMgYmVlbiBhY3RpdmF0ZWQgb3IgZGVhY3RpdmF0ZWQKICogcmVwbGFjZXMgUklMX1VOU09MX1BEUF9DT05URVhUX0xJU1RfQ0hBTkdFRAogKgogKiAiZGF0YSIgaXMgYW4gYXJyYXkgb2YgUklMX0RhdGFfQ2FsbF9SZXNwb25zZSBpZGVudGljYWwgdG8gdGhhdAogKiByZXR1cm5lZCBieSBSSUxfUkVRVUVTVF9EQVRBX0NBTExfTElTVAogKgogKiBTZWUgYWxzbzogUklMX1JFUVVFU1RfREFUQV9DQUxMX0xJU1QKICovCgojZGVmaW5lIFJJTF9VTlNPTF9EQVRBX0NBTExfTElTVF9DSEFOR0VEIDEwMTAKCi8qKgogKiBSSUxfVU5TT0xfU1VQUF9TVkNfTk9USUZJQ0FUSU9OCiAqCiAqIFJlcG9ydHMgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIGZyb20gdGhlIG5ldHdvcmsuCiAqCiAqICJkYXRhIiBpcyBhIGNvbnN0IFJJTF9TdXBwU3ZjTm90aWZpY2F0aW9uICoKICoKICovCgojZGVmaW5lIFJJTF9VTlNPTF9TVVBQX1NWQ19OT1RJRklDQVRJT04gMTAxMQoKLyoqCiAqIFJJTF9VTlNPTF9TVEtfU0VTU0lPTl9FTkQKICoKICogSW5kaWNhdGUgd2hlbiBTVEsgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkIGJ5IFNJTS4KICoKICogImRhdGEiIGlzIE5VTEwKICovCiNkZWZpbmUgUklMX1VOU09MX1NUS19TRVNTSU9OX0VORCAxMDEyCgovKioKICogUklMX1VOU09MX1NUS19QUk9BQ1RJVkVfQ09NTUFORAogKgogKiBJbmRpY2F0ZSB3aGVuIFNJTSBpc3N1ZSBhIFNUSyBwcm9hY3RpdmUgY29tbWFuZCB0byBhcHBsaWNhdGlvbnMKICoKICogImRhdGEiIGlzIGEgY29uc3QgY2hhciAqIGNvbnRhaW5pbmcgU0FUL1VTQVQgcHJvYWN0aXZlIGNvbW1hbmQKICogaW4gaGV4YWRlY2ltYWwgZm9ybWF0IHN0cmluZyBzdGFydGluZyB3aXRoIGNvbW1hbmQgdGFnCiAqCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9TVEtfUFJPQUNUSVZFX0NPTU1BTkQgMTAxMwoKLyoqCiAqIFJJTF9VTlNPTF9TVEtfRVZFTlRfTk9USUZZCiAqCiAqIEluZGljYXRlIHdoZW4gU0lNIG5vdGlmaWVzIGFwcGxjYXRpb25zIHNvbWUgZXZlbnQgaGFwcGVucy4KICogR2VuZXJhbGx5LCBhcHBsaWNhdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgYW55IGZlZWRiYWNrIHRvCiAqIFNJTSBidXQgc2hhbGwgYmUgYWJsZSB0byBpbmRpY2F0ZSBhcHByb3ByaWF0ZSBtZXNzYWdlcyB0byB1c2Vycy4KICoKICogImRhdGEiIGlzIGEgY29uc3QgY2hhciAqIGNvbnRhaW5pbmcgU0FUL1VTQVQgY29tbWFuZHMgb3IgcmVzcG9uc2VzCiAqIHNlbnQgYnkgTUUgdG8gU0lNIG9yIGNvbW1hbmRzIGhhbmRsZWQgYnkgTUUsIGluIGhleGFkZWNpbWFsIGZvcm1hdCBzdHJpbmcKICogc3RhcnRpbmcgd2l0aCBmaXJzdCBieXRlIG9mIHJlc3BvbnNlIGRhdGEgb3IgY29tbWFuZCB0YWcKICoKICovCiNkZWZpbmUgUklMX1VOU09MX1NUS19FVkVOVF9OT1RJRlkgMTAxNAoKLyoqCiAqIFJJTF9VTlNPTF9TVEtfQ0FMTF9TRVRVUAogKgogKiBJbmRpY2F0ZSB3aGVuIFNJTSB3YW50cyBhcHBsaWNhdGlvbiB0byBzZXR1cCBhIHZvaWNlIGNhbGwuCiAqCiAqICJkYXRhIiBpcyBjb25zdCBpbnQgKgogKiAoKGNvbnN0IGludCAqKWRhdGEpWzBdIGNvbnRhaW5zIHRpbWVvdXQgdmFsdWUgKGluIG1pbGxpc2Vjb25kcykKICovCiNkZWZpbmUgUklMX1VOU09MX1NUS19DQUxMX1NFVFVQIDEwMTUKCi8qKgogKiBSSUxfVU5TT0xfU0lNX1NNU19TVE9SQUdFX0ZVTEwKICoKICogSW5kaWNhdGVzIHRoYXQgU01TIHN0b3JhZ2Ugb24gdGhlIFNJTSBpcyBmdWxsLiAgU2VudCB3aGVuIHRoZSBuZXR3b3JrCiAqIGF0dGVtcHRzIHRvIGRlbGl2ZXIgYSBuZXcgU01TIG1lc3NhZ2UuICBNZXNzYWdlcyBjYW5ub3QgYmUgc2F2ZWQgb24gdGhlCiAqIFNJTSB1bnRpbCBzcGFjZSBpcyBmcmVlZC4gIEluIHBhcnRpY3VsYXIsIGluY29taW5nIENsYXNzIDIgbWVzc2FnZXMKICogY2Fubm90IGJlIHN0b3JlZC4KICoKICogImRhdGEiIGlzIG51bGwKICoKICovCiNkZWZpbmUgUklMX1VOU09MX1NJTV9TTVNfU1RPUkFHRV9GVUxMIDEwMTYKCi8qKgogKiBSSUxfVU5TT0xfU0lNX1JFRlJFU0gKICoKICogSW5kaWNhdGVzIHRoYXQgZmlsZShzKSBvbiB0aGUgU0lNIGhhdmUgYmVlbiB1cGRhdGVkLCBvciB0aGUgU0lNCiAqIGhhcyBiZWVuIHJlaW5pdGlhbGl6ZWQuCiAqCiAqICJkYXRhIiBpcyBhbiBpbnQgKgogKiAoKGludCAqKWRhdGEpWzBdIGlzIGEgUklMX1NpbVJlZnJlc2hSZXN1bHQuCiAqICgoaW50ICopZGF0YSlbMV0gaXMgdGhlIEVGSUQgb2YgdGhlIHVwZGF0ZWQgZmlsZSBpZiB0aGUgcmVzdWx0IGlzCiAqIFNJTV9GSUxFX1VQREFURSBvciBOVUxMIGZvciBhbnkgb3RoZXIgcmVzdWx0LgogKgogKiBOb3RlOiBJZiB0aGUgcmFkaW8gc3RhdGUgY2hhbmdlcyBhcyBhIHJlc3VsdCBvZiB0aGUgU0lNIHJlZnJlc2ggKGVnLAogKiBTSU1fUkVBRFkgLT4gU0lNX0xPQ0tFRF9PUl9BQlNFTlQpLCBSSUxfVU5TT0xfUkVTUE9OU0VfUkFESU9fU1RBVEVfQ0hBTkdFRAogKiBzaG91bGQgYmUgc2VudC4KICovCiNkZWZpbmUgUklMX1VOU09MX1NJTV9SRUZSRVNIIDEwMTcKCi8qKgogKiBSSUxfVU5TT0xfQ0FMTF9SSU5HCiAqCiAqIFJpbmcgaW5kaWNhdGlvbiBmb3IgYW4gaW5jb21pbmcgY2FsbCAoZWcsIFJJTkcgb3IgQ1JJTkcgZXZlbnQpLgogKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBSSUxfVU5TT0xfQ0FMTF9SSU5HIGF0IHRoZSBiZWdpbm5pbmcKICogb2YgYSBjYWxsIGFuZCBzZW5kaW5nIG11bHRpcGxlIGlzIG9wdGlvbmFsLiBJZiB0aGUgc3lzdGVtIHByb3BlcnR5CiAqIHJvLnRlbGVwaG9ueS5jYWxsX3JpbmcubXVsdGlwbGUgaXMgZmFsc2UgdGhlbiB0aGUgdXBwZXIgbGF5ZXJzCiAqIHdpbGwgZ2VuZXJhdGUgdGhlIG11bHRpcGxlIGV2ZW50cyBpbnRlcm5hbGx5LiBPdGhlcndpc2UgdGhlIHZlbmRvcgogKiByaWwgbXVzdCBnZW5lcmF0ZSBtdWx0aXBsZSBSSUxfVU5TT0xfQ0FMTF9SSU5HIGlmCiAqIHJvLnRlbGVwaG9ueS5jYWxsX3JpbmcubXVsdGlwbGUgaXMgdHJ1ZSBvciBpZiBpdCBpcyBhYnNlbnQuCiAqCiAqIFRoZSByYXRlIG9mIHRoZXNlIGV2ZW50cyBpcyBjb250cm9sbGVkIGJ5IHJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkKICogYW5kIGhhcyBhIGRlZmF1bHQgdmFsdWUgb2YgMzAwMCAoMyBzZWNvbmRzKSBpZiBhYnNlbnQuCiAqCiAqICJkYXRhIiBpcyBudWxsIGZvciBHU00KICogImRhdGEiIGlzIGNvbnN0IFJJTF9DRE1BX1NpZ25hbEluZm9SZWNvcmQgKiBpZiBDRE1BCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9DQUxMX1JJTkcgMTAxOAoKLyoqCiAqIFJJTF9VTlNPTF9SRVNQT05TRV9TSU1fU1RBVFVTX0NIQU5HRUQKICoKICogSW5kaWNhdGVzIHRoYXQgU0lNIHN0YXRlIGNoYW5nZXMuCiAqCiAqIENhbGxlZSB3aWxsIGludm9rZSBSSUxfUkVRVUVTVF9HRVRfU0lNX1NUQVRVUyBvbiBtYWluIHRocmVhZAoKICogImRhdGEiIGlzIG51bGwKICovCiNkZWZpbmUgUklMX1VOU09MX1JFU1BPTlNFX1NJTV9TVEFUVVNfQ0hBTkdFRCAxMDE5CgovKioKICogUklMX1VOU09MX1JFU1BPTlNFX0NETUFfTkVXX1NNUwogKgogKiBDYWxsZWQgd2hlbiBuZXcgQ0RNQSBTTVMgaXMgcmVjZWl2ZWQKICoKICogImRhdGEiIGlzIGNvbnN0IFJJTF9DRE1BX1NNU19NZXNzYWdlICoKICoKICogQ2FsbGVlIHdpbGwgc3Vic2VxdWVudGx5IGNvbmZpcm0gdGhlIHJlY2VpcHQgb2YgdGhlIFNNUyB3aXRoCiAqIGEgUklMX1JFUVVFU1RfQ0RNQV9TTVNfQUNLTk9XTEVER0UKICoKICogTm8gbmV3IFJJTF9VTlNPTF9SRVNQT05TRV9DRE1BX05FV19TTVMgc2hvdWxkIGJlIHNlbnQgdW50aWwKICogUklMX1JFUVVFU1RfQ0RNQV9TTVNfQUNLTk9XTEVER0UgaGFzIGJlZW4gcmVjZWl2ZWQKICoKICovCiNkZWZpbmUgUklMX1VOU09MX1JFU1BPTlNFX0NETUFfTkVXX1NNUyAxMDIwCgovKioKICogUklMX1VOU09MX1JFU1BPTlNFX05FV19CUk9BRENBU1RfU01TCiAqCiAqIENhbGxlZCB3aGVuIG5ldyBCcm9hZGNhc3QgU01TIGlzIHJlY2VpdmVkCiAqCiAqICJkYXRhIiBpcyBjb25zdCBjaGFyICogb2YgODggYnl0ZXMgd2hpY2ggaW5kaWNhdGVzIGVhY2ggcGFnZQogKiBvZiBhIENCUyBNZXNzYWdlIHNlbnQgdG8gdGhlIE1TIGJ5IHRoZSBCVFMgYXMgY29kZWQgaW4gM0dQUAogKiAyMy4wNDEgU2VjdGlvbiA5LjQuMS4xCiAqCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9SRVNQT05TRV9ORVdfQlJPQURDQVNUX1NNUyAxMDIxCgovKioKICogUklMX1VOU09MX0NETUFfUlVJTV9TTVNfU1RPUkFHRV9GVUxMCiAqCiAqIEluZGljYXRlcyB0aGF0IFNNUyBzdG9yYWdlIG9uIHRoZSBSVUlNIGlzIGZ1bGwuICBNZXNzYWdlcwogKiBjYW5ub3QgYmUgc2F2ZWQgb24gdGhlIFJVSU0gdW50aWwgc3BhY2UgaXMgZnJlZWQuCiAqCiAqICJkYXRhIiBpcyBudWxsCiAqCiAqLwojZGVmaW5lIFJJTF9VTlNPTF9DRE1BX1JVSU1fU01TX1NUT1JBR0VfRlVMTCAxMDIyCgovKioKICogUklMX1VOU09MX1JFU1RSSUNURURfU1RBVEVfQ0hBTkdFRAogKgogKiBJbmRpY2F0ZXMgYSByZXN0cmljdGVkIHN0YXRlIGNoYW5nZSAoZWcsIGZvciBEb21haW4gU3BlY2lmaWMgQWNjZXNzIENvbnRyb2wpLgogKgogKiBSYWRpbyBuZWVkIHNlbmQgdGhpcyBtc2cgYWZ0ZXIgcmFkaW8gb2ZmL29uIGN5Y2xlIG5vIG1hdHRlciBpdCBpcyBjaGFuZ2VkIG9yIG5vdC4KICoKICogImRhdGEiIGlzIGFuIGludCAqCiAqICgoaW50ICopZGF0YSlbMF0gY29udGFpbnMgYSBiaXRtYXNrIG9mIFJJTF9SRVNUUklDVEVEX1NUQVRFXyogdmFsdWVzLgogKi8KI2RlZmluZSBSSUxfVU5TT0xfUkVTVFJJQ1RFRF9TVEFURV9DSEFOR0VEIDEwMjMKCi8qKgogKiBSSUxfVU5TT0xfRU5URVJfRU1FUkdFTkNZX0NBTExCQUNLX01PREUKICoKICogSW5kaWNhdGVzIHRoYXQgdGhlIHJhZGlvIHN5c3RlbSBzZWxlY3Rpb24gbW9kdWxlIGhhcwogKiBhdXRvbm9tb3VzbHkgZW50ZXJlZCBlbWVyZ2VuY3kgY2FsbGJhY2sgbW9kZS4KICoKICogImRhdGEiIGlzIG51bGwKICoKICovCiNkZWZpbmUgUklMX1VOU09MX0VOVEVSX0VNRVJHRU5DWV9DQUxMQkFDS19NT0RFIDEwMjQKCi8qKgogKiBSSUxfVU5TT0xfQ0RNQV9DQUxMX1dBSVRJTkcKICoKICogQ2FsbGVkIHdoZW4gQ0RNQSByYWRpbyByZWNlaXZlcyBhIGNhbGwgd2FpdGluZyBpbmRpY2F0aW9uLgogKgogKiAiZGF0YSIgaXMgY29uc3QgUklMX0NETUFfQ2FsbFdhaXRpbmcgKgogKgogKi8KI2RlZmluZSBSSUxfVU5TT0xfQ0RNQV9DQUxMX1dBSVRJTkcgMTAyNQoKLyoqCiAqIFJJTF9VTlNPTF9DRE1BX09UQV9QUk9WSVNJT05fU1RBVFVTCiAqCiAqIENhbGxlZCB3aGVuIENETUEgcmFkaW8gcmVjZWl2ZXMgYW4gdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBvZiBhbgogKiBPVEFTUC9PVEFQQSBjYWxsLgogKgogKiAiZGF0YSIgaXMgY29uc3QgaW50ICoKICogIEZvciBDRE1BIHRoaXMgaXMgYW4gaW50ZWdlciBPVEFTUC9PVEFQQSBzdGF0dXMgbGlzdGVkIGluCiAqICBSSUxfQ0RNQV9PVEFfUHJvdmlzaW9uU3RhdHVzLgogKgogKi8KI2RlZmluZSBSSUxfVU5TT0xfQ0RNQV9PVEFfUFJPVklTSU9OX1NUQVRVUyAxMDI2CgovKioKICogUklMX1VOU09MX0NETUFfSU5GT19SRUMKICoKICogQ2FsbGVkIHdoZW4gQ0RNQSByYWRpbyByZWNlaXZlcyBvbmUgb3IgbW9yZSBpbmZvIHJlY3MuCiAqCiAqICJkYXRhIiBpcyBjb25zdCBSSUxfQ0RNQV9JbmZvcm1hdGlvblJlY29yZHMgKgogKgogKi8KI2RlZmluZSBSSUxfVU5TT0xfQ0RNQV9JTkZPX1JFQyAxMDI3CgovKioKICogUklMX1VOU09MX09FTV9IT09LX1JBVwogKgogKiBUaGlzIGlzIGZvciBPRU0gc3BlY2lmaWMgdXNlLgogKgogKiAiZGF0YSIgaXMgYSBieXRlW10KICovCiNkZWZpbmUgUklMX1VOU09MX09FTV9IT09LX1JBVyAxMDI4CgovKioKICogUklMX1VOU09MX1JJTkdCQUNLX1RPTkUKICoKICogSW5kaWNhdGVzIHRoYXQgbmV3b3JrIGRvZXNuJ3QgaGF2ZSBpbi1iYW5kIGluZm9ybWF0aW9uLCAgbmVlZCB0bwogKiBwbGF5IG91dC1iYW5kIHRvbmUuCiAqCiAqICJkYXRhIiBpcyBhbiBpbnQgKgogKiAoKGludCAqKWRhdGEpWzBdID09IDAgZm9yIHN0b3AgcGxheSByaW5nYmFjayB0b25lLgogKiAoKGludCAqKWRhdGEpWzBdID09IDEgZm9yIHN0YXJ0IHBsYXkgcmluZ2JhY2sgdG9uZS4KICovCiNkZWZpbmUgUklMX1VOU09MX1JJTkdCQUNLX1RPTkUgMTAyOQoKLyoqCiAqIFJJTF9VTlNPTF9SRVNFTkRfSU5DQUxMX01VVEUKICoKICogSW5kaWNhdGVzIHRoYXQgZnJhbWV3b3JrL2FwcGxpY2F0aW9uIG5lZWQgcmVzZXQgdGhlIHVwbGluayBtdXRlIHN0YXRlLgogKgogKiBUaGVyZSBtYXkgYmUgc2l0dWF0aW9ucyB3aGVyZSB0aGUgbXV0ZSBzdGF0ZSBiZWNvbWVzIG91dCBvZiBzeW5jCiAqIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCBkZXZpY2UgaW4gc29tZSBHU00gaW5mcmFzdHJ1Y3R1cmVzLgogKgogKiAiZGF0YSIgaXMgbnVsbAogKi8KI2RlZmluZSBSSUxfVU5TT0xfUkVTRU5EX0lOQ0FMTF9NVVRFIDEwMzAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCi8qKgogKiBSSUxfUmVxdWVzdCBGdW5jdGlvbiBwb2ludGVyCiAqCiAqIEBwYXJhbSByZXF1ZXN0IGlzIG9uZSBvZiBSSUxfUkVRVUVTVF8qCiAqIEBwYXJhbSBkYXRhIGlzIHBvaW50ZXIgdG8gZGF0YSBkZWZpbmVkIGZvciB0aGF0IFJJTF9SRVFVRVNUXyoKICogICAgICAgIGRhdGEgaXMgb3duZWQgYnkgY2FsbGVyLCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBvciBmcmVlZCBieSBjYWxsZWUKICogQHBhcmFtIHQgc2hvdWxkIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxsIHRvIFJJTF9vblJlc3BvbnNlCiAqIEBwYXJhbSBkYXRhbGVuIHRoZSBsZW5ndGggb2YgZGF0YQogKgogKi8KdHlwZWRlZiB2b2lkICgqUklMX1JlcXVlc3RGdW5jKSAoaW50IHJlcXVlc3QsIHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhbGVuLCBSSUxfVG9rZW4gdCk7CgovKioKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBjdXJyZW50IHJhZGlvIHN0YXRlIHN5bmNocm9ub3VzbHkKICovCnR5cGVkZWYgUklMX1JhZGlvU3RhdGUgKCpSSUxfUmFkaW9TdGF0ZVJlcXVlc3QpKCk7CgovKioKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICIxIiBpZiB0aGUgc3BlY2lmaWVkIFJJTF9SRVFVRVNUIGNvZGUgaXMKICogc3VwcG9ydGVkIGFuZCAwIGlmIGl0IGlzIG5vdAogKgogKiBAcGFyYW0gcmVxdWVzdENvZGUgaXMgb25lIG9mIFJJTF9SRVFVRVNUIGNvZGVzCiAqLwoKdHlwZWRlZiBpbnQgKCpSSUxfU3VwcG9ydHMpKGludCByZXF1ZXN0Q29kZSk7CgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIHNlcGFyYXRlIHRocmVhZC0tbm90IHRoZQogKiB0aHJlYWQgdGhhdCBjYWxscyBSSUxfUmVxdWVzdEZ1bmMtLWFuZCBpbmRpY2F0ZXMgdGhhdCBhIHBlbmRpbmcKICogcmVxdWVzdCBzaG91bGQgYmUgY2FuY2VsbGVkLgogKgogKiBPbiBjYW5jZWwsIHRoZSBjYWxsZWUgc2hvdWxkIGRvIGl0cyBiZXN0IHRvIGFiYW5kb24gdGhlIHJlcXVlc3QgYW5kCiAqIGNhbGwgUklMX29uUmVxdWVzdENvbXBsZXRlIHdpdGggUklMX0Vycm5vIENBTkNFTExFRCBhdCBzb21lIGxhdGVyIHBvaW50LgogKgogKiBTdWJzZXF1ZW50IGNhbGxzIHRvICBSSUxfb25SZXF1ZXN0Q29tcGxldGUgZm9yIHRoaXMgcmVxdWVzdCB3aXRoCiAqIG90aGVyIHJlc3VsdHMgd2lsbCBiZSB0b2xlcmF0ZWQgYnV0IGlnbm9yZWQuIChUaGF0IGlzLCBpdCBpcyB2YWxpZAogKiB0byBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0KQogKgogKiBSSUxfQ2FuY2VsIGNhbGxzIHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHksIGFuZCBub3Qgd2FpdCBmb3IgY2FuY2VsbGF0aW9uCiAqCiAqIFBsZWFzZSBzZWUgSVRVIHYuMjUwIDUuNi4xIGZvciBob3cgb25lIG1pZ2h0IGltcGxlbWVudCB0aGlzIG9uIGEgVFMgMjcuMDA3CiAqIGludGVyZmFjZQogKgogKiBAcGFyYW0gdCB0b2tlbiB3YW50cyB0byBiZSBjYW5jZWxlZAogKi8KCnR5cGVkZWYgdm9pZCAoKlJJTF9DYW5jZWwpKFJJTF9Ub2tlbiB0KTsKCnR5cGVkZWYgdm9pZCAoKlJJTF9UaW1lZENhbGxiYWNrKSAodm9pZCAqcGFyYW0pOwoKLyoqCiAqIFJldHVybiBhIHZlcnNpb24gc3RyaW5nIGZvciB5b3VyIFJJTCBpbXBsZW1lbnRhdGlvbgogKi8KdHlwZWRlZiBjb25zdCBjaGFyICogKCpSSUxfR2V0VmVyc2lvbikgKHZvaWQpOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50IHZlcnNpb247ICAgICAgICAvKiBzZXQgdG8gUklMX1ZFUlNJT04gKi8KICAgIFJJTF9SZXF1ZXN0RnVuYyBvblJlcXVlc3Q7CiAgICBSSUxfUmFkaW9TdGF0ZVJlcXVlc3Qgb25TdGF0ZVJlcXVlc3Q7CiAgICBSSUxfU3VwcG9ydHMgc3VwcG9ydHM7CiAgICBSSUxfQ2FuY2VsIG9uQ2FuY2VsOwogICAgUklMX0dldFZlcnNpb24gZ2V0VmVyc2lvbjsKfSBSSUxfUmFkaW9GdW5jdGlvbnM7CgojaWZkZWYgUklMX1NITElCCnN0cnVjdCBSSUxfRW52IHsKICAgIC8qKgogICAgICogInQiIGlzIHBhcmFtZXRlciBwYXNzZWQgaW4gb24gcHJldmlvdXMgY2FsbCB0byBSSUxfTm90aWZpY2F0aW9uCiAgICAgKiByb3V0aW5lLgogICAgICoKICAgICAqIElmICJlIiAhPSBTVUNDRVNTLCB0aGVuIHJlc3BvbnNlIGNhbiBiZSBudWxsL2lzIGlnbm9yZWQKICAgICAqCiAgICAgKiAicmVzcG9uc2UiIGlzIG93bmVkIGJ5IGNhbGxlciwgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgb3IKICAgICAqIGZyZWVkIGJ5IGNhbGxlZQogICAgICoKICAgICAqIFJJTF9vblJlcXVlc3RDb21wbGV0ZSB3aWxsIHJldHVybiBhcyBzb29uIGFzIHBvc3NpYmxlCiAgICAgKi8KICAgIHZvaWQgKCpPblJlcXVlc3RDb21wbGV0ZSkoUklMX1Rva2VuIHQsIFJJTF9FcnJubyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlbGVuKTsKCiAgICAvKioKICAgICAqICJ1bnNvbFJlc3BvbnNlIiBpcyBvbmUgb2YgUklMX1VOU09MX1JFU1BPTlNFXyoKICAgICAqICJkYXRhIiBpcyBwb2ludGVyIHRvIGRhdGEgZGVmaW5lZCBmb3IgdGhhdCBSSUxfVU5TT0xfUkVTUE9OU0VfKgogICAgICoKICAgICAqICJkYXRhIiBpcyBvd25lZCBieSBjYWxsZXIsIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkIG9yIGZyZWVkIGJ5IGNhbGxlZQogICAgICovCgogICAgdm9pZCAoKk9uVW5zb2xpY2l0ZWRSZXNwb25zZSkoaW50IHVuc29sUmVzcG9uc2UsIGNvbnN0IHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhbGVuKTsKCiAgICAvKioKICAgICAqIENhbGwgdXNlci1zcGVjaWZlZCAiY2FsbGJhY2siIGZ1bmN0aW9uIG9uIG9uIHRoZSBzYW1lIHRocmVhZCB0aGF0CiAgICAgKiBSSUxfUmVxdWVzdEZ1bmMgaXMgY2FsbGVkLiBJZiAicmVsYXRpdmVUaW1lIiBpcyBzcGVjaWZpZWQsIHRoZW4gaXQgc3BlY2lmaWVzCiAgICAgKiBhIHJlbGF0aXZlIHRpbWUgdmFsdWUgYXQgd2hpY2ggdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuIElmIHJlbGF0aXZlVGltZSBpcwogICAgICogTlVMTCBvciBwb2ludHMgdG8gYSAwLWZpbGxlZCBzdHJ1Y3R1cmUsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgYXMKICAgICAqIHNvb24gYXMgcG9zc2libGUKICAgICAqLwoKICAgIHZvaWQgKCpSZXF1ZXN0VGltZWRDYWxsYmFjaykgKFJJTF9UaW1lZENhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmFtLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqcmVsYXRpdmVUaW1lKTsKfTsKCgovKioKICogIFJJTCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBkZWZpbmVkIFJJTF9Jbml0CiAqICBhcmdjIGFuZCBhcmd2IHdpbGwgYmUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRlbmRlZCBmb3IgdGhlIFJJTCBpbXBsZW1lbnRhdGlvbgogKiAgUmV0dXJuIE5VTEwgb24gZXJyb3IKICoKICogQHBhcmFtIGVudiBpcyBlbnZpcm9ubWVudCBwb2ludCBkZWZpbmVkIGFzIFJJTF9FbnYKICogQHBhcmFtIGFyZ2MgbnVtYmVyIG9mIGFyZ3VtZW50cwogKiBAcGFyYW0gYXJndiBsaXN0IGZvIGFyZ3VtZW50cwogKgogKi8KY29uc3QgUklMX1JhZGlvRnVuY3Rpb25zICpSSUxfSW5pdChjb25zdCBzdHJ1Y3QgUklMX0VudiAqZW52LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwoKI2Vsc2UgLyogUklMX1NITElCICovCgovKioKICogQ2FsbCB0aGlzIG9uY2UgYXQgc3RhcnR1cCB0byByZWdpc3RlciBub3RpZmljYXRpb24gcm91dGluZQogKgogKiBAcGFyYW0gY2FsbGJhY2tzIHVzZXItc3BlY2lmZWQgY2FsbGJhY2sgZnVuY3Rpb24KICovCnZvaWQgUklMX3JlZ2lzdGVyIChjb25zdCBSSUxfUmFkaW9GdW5jdGlvbnMgKmNhbGxiYWNrcyk7CgoKLyoqCiAqCiAqIFJJTF9vblJlcXVlc3RDb21wbGV0ZSB3aWxsIHJldHVybiBhcyBzb29uIGFzIHBvc3NpYmxlCiAqCiAqIEBwYXJhbSB0IGlzIHBhcmFtZXRlciBwYXNzZWQgaW4gb24gcHJldmlvdXMgY2FsbCB0byBSSUxfTm90aWZpY2F0aW9uCiAqICAgICAgICAgIHJvdXRpbmUuCiAqIEBwYXJhbSBlIGVycm9yIGNvZGUKICogICAgICAgICAgaWYgImUiICE9IFNVQ0NFU1MsIHRoZW4gcmVzcG9uc2UgY2FuIGJlIG51bGwvaXMgaWdub3JlZAogKiBAcGFyYW0gcmVzcG9uc2UgaXMgb3duZWQgYnkgY2FsbGVyLCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBvcgogKiAgICAgICAgICAgICAgICAgZnJlZWQgYnkgY2FsbGVlCiAqIEBwYXJhbSByZXNwb25zZWxlbiB0aGUgbGVuZ3RoIG9mIHJlc3BvbnNlIGluIGJ5dGUKICovCnZvaWQgUklMX29uUmVxdWVzdENvbXBsZXRlKFJJTF9Ub2tlbiB0LCBSSUxfRXJybm8gZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZWxlbik7CgovKioKICogQHBhcmFtIHVuc29sUmVzcG9uc2UgaXMgb25lIG9mIFJJTF9VTlNPTF9SRVNQT05TRV8qCiAqIEBwYXJhbSBkYXRhIGlzIHBvaW50ZXIgdG8gZGF0YSBkZWZpbmVkIGZvciB0aGF0IFJJTF9VTlNPTF9SRVNQT05TRV8qCiAqICAgICAiZGF0YSIgaXMgb3duZWQgYnkgY2FsbGVyLCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBvciBmcmVlZCBieSBjYWxsZWUKICogQHBhcmFtIGRhdGFsZW4gdGhlIGxlbmd0aCBvZiBkYXRhIGluIGJ5dGUKICovCgp2b2lkIFJJTF9vblVuc29saWNpdGVkUmVzcG9uc2UoaW50IHVuc29sUmVzcG9uc2UsIGNvbnN0IHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFsZW4pOwoKCi8qKgogKiBDYWxsIHVzZXItc3BlY2lmZWQgImNhbGxiYWNrIiBmdW5jdGlvbiBvbiBvbiB0aGUgc2FtZSB0aHJlYWQgdGhhdAogKiBSSUxfUmVxdWVzdEZ1bmMgaXMgY2FsbGVkLiBJZiAicmVsYXRpdmVUaW1lIiBpcyBzcGVjaWZpZWQsIHRoZW4gaXQgc3BlY2lmaWVzCiAqIGEgcmVsYXRpdmUgdGltZSB2YWx1ZSBhdCB3aGljaCB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4gSWYgcmVsYXRpdmVUaW1lIGlzCiAqIE5VTEwgb3IgcG9pbnRzIHRvIGEgMC1maWxsZWQgc3RydWN0dXJlLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGFzCiAqIHNvb24gYXMgcG9zc2libGUKICoKICogQHBhcmFtIGNhbGxiYWNrIHVzZXItc3BlY2lmZWQgY2FsbGJhY2sgZnVuY3Rpb24KICogQHBhcmFtIHBhcmFtIHBhcmFtZXRlciBsaXN0CiAqIEBwYXJhbSByZWxhdGl2ZVRpbWUgYSByZWxhdGl2ZSB0aW1lIHZhbHVlIGF0IHdoaWNoIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkCiAqLwoKdm9pZCBSSUxfcmVxdWVzdFRpbWVkQ2FsbGJhY2sgKFJJTF9UaW1lZENhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyYW0sIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpyZWxhdGl2ZVRpbWUpOwoKCiNlbmRpZiAvKiBSSUxfU0hMSUIgKi8KCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmIC8qQU5EUk9JRF9SSUxfSCovCg==