LyoKICogTW9zdCBvZiB0aGlzIHRha2VuIGZyb20gUmVkYm9vdCBoYWxfcGxhdGZvcm1fc2V0dXAuaCB3aXRoIGNsZWFudXAKICoKICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKICogcnVubmluZy4gU2VlIGhhbF9wbGF0Zm9ybV9zZXR1cC5oIGZvciB0aGUgc291cmNlLiBTZWUKICogYm9hcmQvY3JhZGxlL2xvd2xldmVsX2luaXQuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcwogKiBtdWNoIGNsZWFuZXIuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8dmVyc2lvbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KCkRSQU1fU0laRTogIC5sb25nICAgQ09ORklHX1NZU19EUkFNX1NJWkUKCi8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCgkubWFjcm8gQ1BXQUlUIHJlZwoJbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKCW1vdiAgXHJlZyxccmVnCglzdWIgIHBjLHBjLCM0CgkuZW5kbQoKLyoKICoJTWVtb3J5IHNldHVwCiAqLwouZ2xvYmwgbG93bGV2ZWxfaW5pdApsb3dsZXZlbF9pbml0OgoKCW1vdiAgICAgIHIxMCwgbHIKCiNpZmRlZiBERUJVR19CTElOS19FTkFCTEUKCS8qIDNyZCBibGluayAqLwoJYmwJYmxpbmsKI2VuZGlmCgoJLyogU2V0IHVwIEdQSU8gcGlucyBmaXJzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJbGRyCQlyMCwJPUdQU1IwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUFNSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUFNSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BTUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BTUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQU1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQQ1IwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUENSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUENSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BDUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BDUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQQ1IyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdQRFIwCglsZHIJCXIxLAk9Q09ORklHX1NZU19HUERSMF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HUERSMQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR1BEUjFfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R1BEUjIKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dQRFIyX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIwX0wKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIwX0xfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjBfVQoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjBfVV9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMV9MCglsZHIJCXIxLAk9Q09ORklHX1NZU19HQUZSMV9MX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCQlyMCwJPUdBRlIxX1UKCWxkcgkJcjEsCT1DT05GSUdfU1lTX0dBRlIxX1VfVkFMCglzdHIJCXIxLCAgIFtyMF0KCglsZHIJCXIwLAk9R0FGUjJfTAoJbGRyCQlyMSwJPUNPTkZJR19TWVNfR0FGUjJfTF9WQUwKCXN0cgkJcjEsICAgW3IwXQoKCWxkcgkJcjAsCT1HQUZSMl9VCglsZHIJCXIxLAk9Q09ORklHX1NZU19HQUZSMl9VX1ZBTAoJc3RyCQlyMSwgICBbcjBdCgoJbGRyCXIwLAk9UFNTUgkJLyogZW5hYmxlIEdQSU8gcGlucyAqLwoJbGRyCQlyMSwJPUNPTkZJR19TWVNfUFNTUl9WQUwKCXN0cgkJcjEsICAgW3IwXQoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoJLyogNHRoIGRlYnVnIGJsaW5rICovCglibAlibGluawojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBFbmFibGUgbWVtb3J5IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiBUaGUgc2VxdWVuY2UgYmVsb3cgaXMgYmFzZWQgb24gdGhlIHJlY29tbWVuZGVkIGluaXQgc3RlcHMgICAgICAgICovCgkvKiBkZXRhaWxlZCBpbiB0aGUgSW50ZWwgUFhBMjUwIE9wZXJhdGluZyBTeXN0ZW1zIERldmVsb3BlcnMgR3VpZGUsICovCgkvKiBDaGFwdGVyIDEwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAxOiBXYWl0IGZvciBhdCBsZWFzdCAyMDAgbWljcm9zZWRvbmRzIHRvIGFsbG93IGludGVybmFsICAgICAqLwoJLyogICAgICAgICBjbG9ja3MgdG8gc2V0dGxlLiBPbmx5IG5lY2Vzc2FyeSBhZnRlciBoYXJkIHJlc2V0Li4uICAgICAqLwoJLyogICAgICAgICBGSVhNRTogY2FuIGJlIG9wdGltaXplZCBsYXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJc3RyIHIyLCBbcjNdCglsZHIgcjQsID0weDMwMAkJCS8qIHJlYWxseSAweDJFMSBpcyBhYm91dCAyMDB1c2VjLCAgICovCgkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KMToKCWxkciByMiwgW3IzXQoJY21wIHI0LCByMgoJYmd0IDFiCgptZW1faW5pdDoKCglsZHIgICAgIHIxLCAgPU1FTUNfQkFTRQkJLyogZ2V0IG1lbW9yeSBjb250cm9sbGVyIGJhc2UgYWRkci4gKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJhOiBJbml0aWFsaXplIEFzeW5jaHJvbm91cyBzdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogTVNDIHJlZ2lzdGVyczogdGltaW5nLCBidXMgd2lkdGgsIG1lbSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIE1TQzA6IG5DUygwLDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICAgPUNPTkZJR19TWVNfTVNDMF9WQUwKCXN0ciAgICAgcjIsICAgW3IxLCAjTVNDMF9PRkZTRVRdCglsZHIgICAgIHIyLCAgIFtyMSwgI01TQzBfT0ZGU0VUXQkvKiByZWFkIGJhY2sgdG8gZW5zdXJlICAgICAgKi8KCQkJCQkJLyogdGhhdCBkYXRhIGxhdGNoZXMgICAgICAgICovCgkvKiBNU0MxOiBuQ1MoMiwzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTVNDMV9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KCWxkciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KCgkvKiBNU0MyOiBuQ1MoNCw1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTVNDMl9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNU0MyX09GRlNFVF0KCWxkciAgICAgcjIsICBbcjEsICNNU0MyX09GRlNFVF0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJiOiBJbml0aWFsaXplIENhcmQgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogTUVDUjogTWVtb3J5IEV4cGFuc2lvbiBDYXJkIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgID1DT05GSUdfU1lTX01FQ1JfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUVDUl9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01FQ1JfT0ZGU0VUXQoKCS8qIE1DTUVNMDogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAwIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NQ01FTTBfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0wX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNNRU0wX09GRlNFVF0KCgkvKiBNQ01FTTE6IENhcmQgSW50ZXJmYWNlIHNsb3QgMSB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTUNNRU0xX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DTUVNMV9PRkZTRVRdCglsZHIJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCgoJLyogTUNBVFQwOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgID1DT05GSUdfU1lTX01DQVRUMF9WQUwKCXN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQoKCS8qIE1DQVRUMTogQ2FyZCBJbnRlcmZhY2UgQXR0cmlidXRlIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgKi8KCWxkciAgICAgcjIsICA9Q09ORklHX1NZU19NQ0FUVDFfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNBVFQxX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNBVFQxX09GRlNFVF0KCgkvKiBNQ0lPMDogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAwICAgICAgICAgICAgICAgICAgICovCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTUNJTzBfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTUNJTzBfT0ZGU0VUXQoJbGRyCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCgoJLyogTUNJTzE6IENhcmQgSW50ZXJmYWNlIEkvTyBTcGFjZSBUaW1pbmcsIHNsb3QgMSAgICAgICAgICAgICAgICAgICAqLwoJbGRyICAgICByMiwgID1DT05GSUdfU1lTX01DSU8xX1ZBTAoJc3RyICAgICByMiwgIFtyMSwgI01DSU8xX09GRlNFVF0KCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoJLyogNXRoIGJsaW5rICovCglibAlibGluawojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogU3RlcCAyZDogSW5pdGlhbGl6ZSBUaW1pbmcgZm9yIFN5bmMgTWVtb3J5IChTRENMSzApICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8qIEJlZm9yZSBhY2Nlc3NpbmcgTURSRUZSIHdlIG5lZWQgYSB2YWxpZCBEUkkgZmllbGQsIHNvIHdlIHNldCAgICAgKi8KCS8qIHRoaXMgdG8gcG93ZXIgb24gZGVmYXVsdHMgKyBEUkkgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIzLCAgICAgPUNPTkZJR19TWVNfTURSRUZSX1ZBTAoJbGRyICAgICByMiwgICAgID0weEZGRgoJYW5kICAgICByMywgICAgIHIzLCAgcjIKCWxkcglyNCwJPTB4MDNjYTQwMDAKCW9yciAgICAgcjQsICAgICByNCwgIHIzCglzdHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogTm90ZTogcHJlc2VydmUgdGhlIG1kcmVmciB2YWx1ZSBpbiByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFN0ZXAgMzogSW5pdGlhbGl6ZSBTeW5jaHJvbm91cyBTdGF0aWMgTWVtb3J5IChGbGFzaC9QZXJpcGhlcmFscykgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgkvKiBJbml0aWFsaXplIFNYQ05GRyByZWdpc3Rlci4gQXNzZXJ0IHRoZSBlbmFibGUgYml0cyAgICAgICAgICAgICAgICovCgoJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLwoJLyogc3luY2hyb25vdXMgc3RhdGljIG1lbW9yeS4gTm90ZSB0aGF0IFNYTENSIG5lZWQgbm90IGJlIHdyaXR0ZW4gICAqLwoJLyogYXQgdGhpcyB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCS8qIEZJWE1FOiB3ZSB1c2UgYXN5bmMgbW9kZSBmb3Igbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBTdGVwIDQ6IEluaXRpYWxpemUgU0RSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogc2V0IE1EUkVGUiBhY2NvcmRpbmcgdG8gdXNlciBkZWZpbmUgd2l0aCBleGNlcHRpb24gb2YgYSBmZXcgYml0cyAqLwoKCWxkciAgICAgcjQsICAgICA9Q09ORklHX1NZU19NRFJFRlJfVkFMCglvcnIJcjQsCXI0LAkjKE1EUkVGUl9TTEZSU0gpCgliaWMJcjQsCXI0LAkjKE1EUkVGUl9FMVBJTnxNRFJFRlJfRTBQSU4pCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgkvKiBTdGVwIDRiOiBkZS1hc3NlcnQgTURSRUZSOlNMRlJTSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJYmljCXI0LAlyNCwJIyhNRFJFRlJfU0xGUlNIKQoJc3RyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdICAgIC8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLwoJbGRyICAgICByNCwgIFtyMSwgI01EUkVGUl9PRkZTRVRdCgoJLyogU3RlcCA0YzogYXNzZXJ0IE1EUkVGUjpFMVBJTiBhbmQgRTBQSU8gYXMgZGVzaXJlZCAgICAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjQsICAgICA9Q09ORklHX1NZU19NRFJFRlJfVkFMCglzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCglsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KCgoJLyogU3RlcCA0ZDogd3JpdGUgTURDTkZHIHdpdGggTURDTkZHOkRFeCBkZWFzc2VydGVkIChzZXQgdG8gMCksIHRvICAqLwoJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLwoKCWxkcglyNCwJPUNPTkZJR19TWVNfTURDTkZHX1ZBTAoJYmljCXI0LAlyNCwJIyhNRENORkdfREUwfE1EQ05GR19ERTEpCgoJc3RyICAgICByNCwgICAgIFtyMSwgI01EQ05GR19PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURDTkZHICAgICAgICAqLwoJbGRyICAgICByNCwgICAgIFtyMSwgI01EQ05GR19PRkZTRVRdCgoJLyogU3RlcCA0ZTogV2FpdCBmb3IgdGhlIGNsb2NrIHRvIHRoZSBTRFJBTXMgdG8gc3RhYmlsaXplLCAgICAgICAgICAqLwoJLyogICAgICAgICAgMTAwLi4yMDAgtXNlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCWxkciByMywgPU9TQ1IJCQkvKiByZXNldCB0aGUgT1MgVGltZXIgQ291bnQgdG8gemVybyAqLwoJbW92IHIyLCAjMAoJICAgIHN0ciByMiwgW3IzXQoJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLwoJCQkJCS8qIHNvIDB4MzAwIHNob3VsZCBiZSBwbGVudHkgICAgICAgICovCjE6CgkgICAgbGRyIHIyLCBbcjNdCgkgICAgY21wIHI0LCByMgoJICAgIGJndCAxYgoKCS8qIFN0ZXAgNGY6IFRyaWdnZXIgYSBudW1iZXIgKHVzdWFsbHkgOCkgcmVmcmVzaCBjeWNsZXMgYnkgICAgICAgICAgKi8KCS8qICAgICAgICAgIGF0dGVtcHRpbmcgbm9uLWJ1cnN0IHJlYWQgb3Igd3JpdGUgYWNjZXNzZXMgdG8gZGlzYWJsZWQgKi8KCS8qICAgICAgICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KCS8qICAgICAgICAgIGRvY3VtZW50ZWQgaW4gU0RSQU0gZGF0YSBzaGVldHMuIFRoZSBhZGRyZXNzKGVzKSB1c2VkICAgKi8KCS8qICAgICAgICAgIGZvciB0aGlzIHB1cnBvc2UgbXVzdCBub3QgYmUgY2FjaGVhYmxlLiAgICAgICAgICAgICAgICAgKi8KCglsZHIJcjMsCT1DT05GSUdfU1lTX0RSQU1fQkFTRQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCXN0cglyMiwJW3IzXQoJc3RyCXIyLAlbcjNdCglzdHIJcjIsCVtyM10KCgkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBlbmFibGUgYml0cyBhc3NlcnRlZCAgICAgICAgICAgICAgICAgICovCgkvKiAgICAgICAgICAoTURDTkZHOkRFeCBzZXQgdG8gMSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJbGRyICAgICByMywgIFtyMSwgI01EQ05GR19PRkZTRVRdCglvcnIJcjMsCXIzLAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKCXN0ciAgICAgcjMsICBbcjEsICNNRENORkdfT0ZGU0VUXQoKCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCglsZHIgICAgIHIyLCAgPUNPTkZJR19TWVNfTURNUlNfVkFMCglzdHIgICAgIHIyLCAgW3IxLCAjTURNUlNfT0ZGU0VUXQoKCS8qIFdlIGFyZSBmaW5pc2hlZCB3aXRoIEludGVsJ3MgbWVtb3J5IGNvbnRyb2xsZXIgaW5pdGlhbGlzYXRpb24gICAgKi8KI2lmIDAKCS8qIEZJWE1FIHR1cm4gb24gc2VyaWFsIHBvcnRzICovCgkvKiBsb29rIGludG8gbW92aW5nIHRoaXMgdG8gYm9hcmRfaW5pdCgpICovCglsZHIJcjIsID0oUFhBX0NTNV9QSFlTICsgMHgwM0MwMDAyYykKCW1vdglyMywgIzB4MTMKCXN0cglyMywgW3IyXQojZW5kaWYKCiNpZmRlZiBERUJVR19CTElOS19FTkFCTEUKCS8qIDZ0aCBibGluayAqLwoJYmwJYmxpbmsKI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaW5pdGlycXM6CgoJbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KCWxkciAgICAgcjIsICA9SUNMUgoJc3RyICAgICByMSwgIFtyMl0KCglsZHIgICAgIHIyLCAgPUlDTVIJLyogbWFzayBhbGwgaW50ZXJydXB0cyBhdCB0aGUgY29udHJvbGxlciAgICAqLwoJc3RyICAgICByMSwgIFtyMl0KCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppbml0Y2xrczoKCgkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcywgYW5kIHNldCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kgICovCgkvKiAoaGFyZC1jb2RpbmcgYXQgMzk4LjEyTUh6IGZvciBub3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJLyogVHVybiBPZmYgQUxMIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgZm9yIHJlLWNvbmZpZ3VyYXRpb24gICAgICAqLwoJLyogTm90ZTogU2VlIGxhYmVsICdFTkFCTEVDTEtTJyBmb3IgdGhlIHJlLWVuYWJsaW5nICAgICAgICAgICAgICAgICAqLwojaWYgMAoJbGRyICAgICByMSwgID1DS0VOCgltb3YgICAgIHIyLCAgIzAKCXN0ciAgICAgcjIsICBbcjFdCgoJLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLwoJbGRyICAgICByMiwgPShDQ0NSX0wyN3xDQ0NSX00yfENDQ1JfTjEwKSAgLyogREVGQVVMVDogezIwMC8yMDAvMTAwfSAqLwoKCS8qIC4uLiBhbmQgd3JpdGUgdGhlIGNvcmUgY2xvY2sgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KCWxkciAgICAgcjEsICA9Q0NDUgoJc3RyICAgICByMiwgIFtyMV0KCiNlbmRpZgoKI2lmZGVmIFJUQwoJLyogZW5hYmxlIHRoZSAzMktoeiBvc2NpbGxhdG9yIGZvciBSVEMgYW5kIFBvd2VyTWFuYWdlciAgICAgICAgICAgICAqLwoKCWxkciAgICAgcjEsICA9T1NDQwoJbW92ICAgICByMiwgICNPU0NDX09PTgoJc3RyICAgICByMiwgIFtyMV0KCgkvKiBOT1RFOiAgc3BpbiBoZXJlIHVudGlsIE9TQ0MuT09LIGdldCBzZXQsIG1lYW5pbmcgdGhlIFBMTCAgICAgICAgICovCgkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCjYwOgoJbGRyICAgICByMiwgW3IxXQoJYW5kcyAgICByMiwgcjIsICMxCgliZXEgICAgIDYwYgojZW5kaWYKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyogU2F2ZSBTRFJBTSBzaXplICovCglsZHIgICAgIHIxLCA9RFJBTV9TSVpFCglzdHIgICAgIHI4LCBbcjFdCgoJLyogSW50ZXJydXB0IGluaXQ6IE1hc2sgYWxsIGludGVycnVwdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJbGRyCXIwLCA9SUNNUiAvKiBlbmFibGUgbm8gc291cmNlcyAqLwoJbW92IHIxLCAjMAoJc3RyIHIxLCBbcjBdCgoJLyogRklYTUUgKi8KCiNkZWZpbmUgTk9ERUJVRwojaWZkZWYgTk9ERUJVRwoJLypEaXNhYmxlIHNvZnR3YXJlIGFuZCBkYXRhIGJyZWFrcG9pbnRzICovCgltb3YJcjAsIzAKCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzksMCAgLyogaWJjcjEgKi8KCW1jcglwMTUsMCxyMCxjMTQsYzQsMCAgLyogZGJjb24gKi8KCgkvKkVuYWJsZSBhbGwgZGVidWcgZnVuY3Rpb25hbGl0eSAqLwoJbW92CXIwLCMweDgwMDAwMDAwCgltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KI2VuZGlmCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRW5kIG1lbXNldHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoJLyogN3RoIGJsaW5rICovCglibAlibGluawojZW5kaWYKCmVuZGxvd2xldmVsX2luaXQ6CgoJbW92ICAgICBwYywgcjEwCgoKI2lmZGVmIERFQlVHX0JMSU5LX0VOQUJMRQoKLyogZGVidWcgTEVEIGNvZGUgKi8KCi8qIGRlbGF5IGFib3V0IDIwMG1zICovCmRlbGF5OgoKCS8qIHJlc2V0IE9TQ1IgdG8gMCAqLwoJbGRyCXI4LCA9T1NDUgoJbW92CXI5LCAjMAoJc3RyCXI5LCBbcjhdCgoJLyogbWFrZSBzdXJlIG5ldyB2YWx1ZSBoYXMgc3R1Y2sgKi8KMToKCWxkcglyOCwgPU9TQ1IKCWxkcglyOSwgW3I4XQoJbW92CXI4LCAjMHgxMDAwMAoJY21wCXI5LCByOAoJYmd0CTFiCgoJLyogbm93LCB3YWl0IGZvciBkZWxheSB0byBleHBpcmUgKi8KMToKCWxkcglyOCwgPU9TQ1IKCWxkcglyOSwgW3I4XQoJbW92CXI4LCAjMHhkNDAwMAoJY21wCXI4LCByOQoJYmd0CTFiCgoJbW92CXBjLCBscgoKLyogYmxpbmsgY29kZSAtLSB0cmFzaGVzIHI3LCByOCwgcjkgKi8KCi5nbG9ibCBibGluawpibGluazoKCgltb3YJcjcsIGxyCgoJLyogc2V0IEdQSU8xMCBhcyBvdXRvdXQgKi8KCWxkcglyOCwgID1HUERSMAoJbGRyCXI5LCAgW3I4XQoJb3JyCXI5LCAgcjksICMoMTw8MTApCglzdHIJcjksICBbcjhdCgoJLyogdHVybiBMRUQgb2ZmICovCgltb3YJcjksICAjKDE8PDEwKQoJbGRyCXI4LCAgPUdQQ1IwCglzdHIJcjksIFtyOF0KCWJsCWRlbGF5CgoJLyogdHVybiBMRUQgb24gKi8KCW1vdglyOSwgICMoMTw8MTApCglsZHIJcjgsICA9R1BTUjAKCXN0cglyOSwgW3I4XQoJYmwJZGVsYXkKCgkvKiB0dXJuIExFRCBvZmYgKi8KCW1vdglyOSwgICMoMTw8MTApCglsZHIJcjgsICA9R1BDUjAKCXN0cglyOSwgW3I4XQoKCW1vdglwYywgcjcKCiNlbmRpZgo=