From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tomoya MORINAGA Subject: Re: Still problems wit egt20 i2c driver Date: Tue, 22 Nov 2011 13:20:37 +0900 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=bcaec520f1251d86fb04b24b2054 Return-path: In-Reply-To: Sender: linux-i2c-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Christian Gmeiner Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-i2c@vger.kernel.org --bcaec520f1251d86fb04b24b2054 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi Christian, I attached the latest our i2c-eg20t source file. Is your source file the same as this? Regards, --- tomoya ROHM Co., Ltd 2011/11/21 Christian Gmeiner : > Hi all, > > I still have some problems with the egt20 i2c driver. I am running a > 3.1.1 kernel with the following > patches applied to it: > > * [PATCH 1/7 v4] i2c-eg20t: Fix bus-idle waiting issue - > https://lkml.org/lkml/2011/10/12/3 > * [PATCH 2/7 v4] i2c-eg20t: Modify returned value s32 to long - > https://lkml.org/lkml/2011/10/12/1 > * [PATCH 3/7 v2] i2c-eg20t: Fix 10bit access issue - > https://lkml.org/lkml/2011/10/12/7 > * [PATCH 4/7 v4] i2c-eg20t: Separate error processing - > https://lkml.org/lkml/2011/10/12/6 > * [PATCH 5/7 v4] i2c-eg20t: add stop sequence in case wait-event > timeout occurs - https://lkml.org/lkml/2011/10/12/5 > * [PATCH 6/7 v4] i2c-eg20t: Fix flag setting issue - > https://lkml.org/lkml/2011/10/12/2 > * [PATCH 7/7 v4] i2c-eg20t: Add initialize processing in case > i2c-error occurs - https://lkml.org/lkml/2011/10/12/4 > * [PATCH] i2c-eg20t: modified the setting of transfer rate. - > http://marc.info/?l=3Dlinux-i2c&m=3D131702145913299&w=3D2 > > I have a PCA9555 (drivers/gpio/gpio-pca953x.c) at i2c addr 0x48. > > [ =A0 21.505138] pca953x 0-0048: probe > [ =A0 21.505157] i2c i2c-0: master_xfer[0] W, addr=3D0x48, len=3D1 > [ =A0 21.505168] i2c i2c-0: master_xfer[1] R, addr=3D0x48, len=3D2 > [ =A0 21.505180] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer > :adap->p_adapter_info->pch_i2c_suspended is 0 > [ =A0 21.505190] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer :After invoking > I2C_MODE_SEL :flag=3D 0x0 > [ =A0 21.505206] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :I2CCTL =3D > 390 msgs->len =3D 1 > [ =A0 21.505220] i2c_eg20t 0000:02:0c.2: pch_i2c_start :I2CCTL =3D 390 > [ =A0 21.505353] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.508667] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :writing 2 > to Data register > [ =A0 21.508772] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.510043] i2c_eg20t 0000:02:0c.2: pch_i2c_repstart :I2CCTL =3D 3b0 > [ =A0 21.510058] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :return=3D1 > [ =A0 21.510068] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer :After invoking > I2C_MODE_SEL :flag=3D 0x1 > [ =A0 21.510209] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.517833] i2c_eg20t 0000:02:0c.2: pch_i2c_sendack :I2CCTL =3D 3a0 > [ =A0 21.517962] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.517992] i2c_eg20t 0000:02:0c.2: pch_i2c_sendnack :I2CCTL =3D 3a0 > [ =A0 21.518114] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.518230] i2c_eg20t 0000:02:0c.2: pch_i2c_stop :I2CCTL =3D 3a8 > [ =A0 21.518251] i2c i2c-0: master_xfer[0] W, addr=3D0x48, len=3D1 > [ =A0 21.518261] i2c i2c-0: master_xfer[1] R, addr=3D0x48, len=3D2 > [ =A0 21.518271] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer > :adap->p_adapter_info->pch_i2c_suspended is 0 > [ =A0 21.518281] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer :After invoking > I2C_MODE_SEL :flag=3D 0x0 > [ =A0 21.518296] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :I2CCTL =3D > 398 msgs->len =3D 1 > [ =A0 21.518311] i2c_eg20t 0000:02:0c.2: pch_i2c_start :I2CCTL =3D 398 > [ =A0 21.518442] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.520533] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :writing 6 > to Data register > [ =A0 21.520627] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.520709] i2c_eg20t 0000:02:0c.2: pch_i2c_repstart :I2CCTL =3D 3b8 > [ =A0 21.520721] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :return=3D1 > [ =A0 21.520731] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer :After invoking > I2C_MODE_SEL :flag=3D 0x1 > [ =A0 21.520868] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.522841] i2c_eg20t 0000:02:0c.2: pch_i2c_sendack :I2CCTL =3D 3a8 > [ =A0 21.522968] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.523533] i2c_eg20t 0000:02:0c.2: pch_i2c_sendnack :I2CCTL =3D 3a0 > [ =A0 21.523660] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.523785] i2c_eg20t 0000:02:0c.2: pch_i2c_stop :I2CCTL =3D 3a8 > [ =A0 21.523807] i2c i2c-0: master_xfer[0] W, addr=3D0x48, len=3D3 > [ =A0 21.523817] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer > :adap->p_adapter_info->pch_i2c_suspended is 0 > [ =A0 21.523827] i2c_eg20t 0000:02:0c.2: pch_i2c_xfer :After invoking > I2C_MODE_SEL :flag=3D 0x0 > [ =A0 21.523842] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :I2CCTL =3D > 398 msgs->len =3D 3 > [ =A0 21.523856] i2c_eg20t 0000:02:0c.2: pch_i2c_start :I2CCTL =3D 398 > [ =A0 21.523988] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.524570] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :writing 4 > to Data register > [ =A0 21.524677] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.524791] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :writing 0 > to Data register > [ =A0 21.524899] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 28 > [ =A0 21.524948] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :writing 0 > to Data register > [ =A0 21.525056] i2c_eg20t 0000:02:0c.2: pch_i2c_cb :PCH_I2CSR =3D 9 > [ =A0 21.525666] i2c_eg20t 0000:02:0c.2: pch_i2c_getack :return-71 > [ =A0 21.525746] i2c_eg20t 0000:02:0c.2: pch_i2c_writebytes :Receive > NACK for slave addresssetting > [ =A0 21.525760] pca953x 0-0048: failed writing register > [ =A0 21.525829] pca953x 0-0048: interrupt support not compiled in > [ =A0 21.526029] i2c-core: driver [pca953x] registered > [ =A0 21.526380] pca953x 0-0048: uevent > > > What informations do you need to get this fixed? > > thanks > -- > Christian Gmeiner, MSc > --bcaec520f1251d86fb04b24b2054 Content-Type: text/x-csrc; charset=US-ASCII; name="i2c-eg20t.c" Content-Disposition: attachment; filename="i2c-eg20t.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gvaeh26f0 LyoKICogQ29weXJpZ2h0IChDKSAyMDEwIE9LSSBTRU1JQ09ORFVDVE9SIENPLiwgTFRELgogKgog KiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAq IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRo ZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3Vp dGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxh eS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2lu Y2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4 L2lvLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0 Lmg+CiNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2lu Y2x1ZGUgPGxpbnV4L211dGV4Lmg+CiNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgoKI2RlZmluZSBQ Q0hfRVZFTlRfU0VUCTAJLyogSTJDIEludGVycnVwdCBFdmVudCBTZXQgU3RhdHVzICovCiNkZWZp bmUgUENIX0VWRU5UX05PTkUJMQkvKiBJMkMgSW50ZXJydXB0IEV2ZW50IENsZWFyIFN0YXR1cyAq LwojZGVmaW5lIFBDSF9NQVhfQ0xLCQkxMDAwMDAJLyogTWF4aW11bSBDbG9jayBzcGVlZCBpbiBN SHogKi8KI2RlZmluZSBQQ0hfQlVGRkVSX01PREVfRU5BQkxFCTB4MDAwMgkvKiBmbGFnIGZvciBC dWZmZXIgbW9kZSBlbmFibGUgKi8KI2RlZmluZSBQQ0hfRUVQUk9NX1NXX1JTVF9NT0RFX0VOQUJM RQkweDAwMDgJLyogRUVQUk9NIFNXIFJTVCBlbmFibGUgZmxhZyAqLwoKI2RlZmluZSBQQ0hfSTJD U0FEUgkweDAwCS8qIEkyQyBzbGF2ZSBhZGRyZXNzIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0ky Q0NUTAkweDA0CS8qIEkyQyBjb250cm9sIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ1NSCTB4 MDgJLyogSTJDIHN0YXR1cyByZWdpc3RlciAqLwojZGVmaW5lIFBDSF9JMkNEUgkweDBDCS8qIEky QyBkYXRhIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ01PTgkweDEwCS8qIEkyQyBidXMgbW9u aXRvciByZWdpc3RlciAqLwojZGVmaW5lIFBDSF9JMkNCQwkweDE0CS8qIEkyQyBidXMgdHJhbnNm ZXIgcmF0ZSBzZXR1cCBjb3VudGVyICovCiNkZWZpbmUgUENIX0kyQ01PRAkweDE4CS8qIEkyQyBt b2RlIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ0JVRlNMVgkweDFDCS8qIEkyQyBidWZmZXIg bW9kZSBzbGF2ZSBhZGRyZXNzIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ0JVRlNVQgkweDIw CS8qIEkyQyBidWZmZXIgbW9kZSBzdWJhZGRyZXNzIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0ky Q0JVRkZPUgkweDI0CS8qIEkyQyBidWZmZXIgbW9kZSBmb3JtYXQgcmVnaXN0ZXIgKi8KI2RlZmlu ZSBQQ0hfSTJDQlVGQ1RMCTB4MjgJLyogSTJDIGJ1ZmZlciBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIg Ki8KI2RlZmluZSBQQ0hfSTJDQlVGTVNLCTB4MkMJLyogSTJDIGJ1ZmZlciBtb2RlIGludGVycnVw dCBtYXNrIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ0JVRlNUQQkweDMwCS8qIEkyQyBidWZm ZXIgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KI2RlZmluZSBQQ0hfSTJDQlVGTEVWCTB4MzQJLyog STJDIGJ1ZmZlciBtb2RlIGxldmVsIHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ0VTUkZPUgkw eDM4CS8qIEVFUFJPTSBzb2Z0d2FyZSByZXNldCBtb2RlIGZvcm1hdCByZWdpc3RlciAqLwojZGVm aW5lIFBDSF9JMkNFU1JDVEwJMHgzQwkvKiBFRVBST00gc29mdHdhcmUgcmVzZXQgbW9kZSBjdHJs IHJlZ2lzdGVyICovCiNkZWZpbmUgUENIX0kyQ0VTUk1TSwkweDQwCS8qIEVFUFJPTSBzb2Z0d2Fy ZSByZXNldCBtb2RlICovCiNkZWZpbmUgUENIX0kyQ0VTUlNUQQkweDQ0CS8qIEVFUFJPTSBzb2Z0 d2FyZSByZXNldCBtb2RlIHN0YXR1cyByZWdpc3RlciAqLwojZGVmaW5lIFBDSF9JMkNUTVIJMHg0 OAkvKiBJMkMgdGltZXIgcmVnaXN0ZXIgKi8KI2RlZmluZSBQQ0hfSTJDU1JTVAkweEZDCS8qIEky QyByZXNldCByZWdpc3RlciAqLwojZGVmaW5lIFBDSF9JMkNORgkweEY4CS8qIEkyQyBub2lzZSBm aWx0ZXIgcmVnaXN0ZXIgKi8KCiNkZWZpbmUgQlVTX0lETEVfVElNRU9VVAkyMAojZGVmaW5lIFBD SF9JMkNDVExfSTJDTUVOCTB4MDA4MAojZGVmaW5lIFRFTl9CSVRfQUREUl9ERUZBVUxUCTB4RjAw MAojZGVmaW5lIFRFTl9CSVRfQUREUl9NQVNLCTB4RjAKI2RlZmluZSBQQ0hfU1RBUlQJCTB4MDAy MAojZGVmaW5lIFBDSF9SRVNUQVJUCQkweDAwMDQKI2RlZmluZSBQQ0hfRVNSX1NUQVJUCQkweDAw MDEKI2RlZmluZSBQQ0hfQlVGRl9TVEFSVAkJMHgxCiNkZWZpbmUgUENIX1JFUFNUQVJUCQkweDAw MDQKI2RlZmluZSBQQ0hfQUNLCQkJMHgwMDA4CiNkZWZpbmUgUENIX0dFVEFDSwkJMHgwMDAxCiNk ZWZpbmUgQ0xSX1JFRwkJCTB4MAojZGVmaW5lIEkyQ19SRAkJCTB4MQojZGVmaW5lIEkyQ01DRl9C SVQJCTB4MDA4MAojZGVmaW5lIEkyQ01JRl9CSVQJCTB4MDAwMgojZGVmaW5lIEkyQ01BTF9CSVQJ CTB4MDAxMAojZGVmaW5lIEkyQ0JNRklfQklUCQkweDAwMDEKI2RlZmluZSBJMkNCTUFMX0JJVAkJ MHgwMDAyCiNkZWZpbmUgSTJDQk1OQV9CSVQJCTB4MDAwNAojZGVmaW5lIEkyQ0JNVE9fQklUCQkw eDAwMDgKI2RlZmluZSBJMkNCTUlTX0JJVAkJMHgwMDEwCiNkZWZpbmUgSTJDRVNSRklfQklUCQkw WDAwMDEKI2RlZmluZSBJMkNFU1JUT19CSVQJCTB4MDAwMgojZGVmaW5lIEkyQ0VTUkZJSUVfQklU CQkweDEKI2RlZmluZSBJMkNFU1JUT0lFX0JJVAkJMHgyCiNkZWZpbmUgSTJDQk1EWl9CSVQJCTB4 MDA0MAojZGVmaW5lIEkyQ0JNQUdfQklUCQkweDAwMjAKI2RlZmluZSBJMkNNQkJfQklUCQkweDAw MjAKI2RlZmluZSBCVUZGRVJfTU9ERV9NQVNLCShJMkNCTUZJX0JJVCB8IEkyQ0JNQUxfQklUIHwg STJDQk1OQV9CSVQgfCBcCgkJCQlJMkNCTVRPX0JJVCB8IEkyQ0JNSVNfQklUKQojZGVmaW5lIEky Q19BRERSX01TSwkJMHhGRgojZGVmaW5lIEkyQ19NU0JfMkJfTVNLCQkweDMwMAojZGVmaW5lIEZB U1RfTU9ERV9DTEsJCTQwMAojZGVmaW5lIEZBU1RfTU9ERV9FTgkJMHgwMDAxCiNkZWZpbmUgU1VC X0FERFJfTEVOX01BWAk0CiNkZWZpbmUgQlVGX0xFTl9NQVgJCTMyCiNkZWZpbmUgUENIX0JVRkZF Ul9NT0RFCQkweDEKI2RlZmluZSBFRVBST01fU1dfUlNUX01PREUJMHgwMDAyCiNkZWZpbmUgTk9S TUFMX0lOVFJfRU5CTAkweDAzMDAKI2RlZmluZSBFRVBST01fUlNUX0lOVFJfRU5CTAkoSTJDRVNS RklJRV9CSVQgfCBJMkNFU1JUT0lFX0JJVCkKI2RlZmluZSBFRVBST01fUlNUX0lOVFJfRElTQkwJ MHgwCiNkZWZpbmUgQlVGRkVSX01PREVfSU5UUl9FTkJMCTB4MDAxRgojZGVmaW5lIEJVRkZFUl9N T0RFX0lOVFJfRElTQkwJMHgwCiNkZWZpbmUgTk9STUFMX01PREUJCTB4MAojZGVmaW5lIEJVRkZF Ul9NT0RFCQkweDEKI2RlZmluZSBFRVBST01fU1JfTU9ERQkJMHgyCiNkZWZpbmUgSTJDX1RYX01P REUJCTB4MDAxMAojZGVmaW5lIFBDSF9CVUZfVFgJCTB4RkZGNwojZGVmaW5lIFBDSF9CVUZfUkQJ CTB4MDAwOAojZGVmaW5lIEkyQ19FUlJPUl9NQVNLCShJMkNFU1JUT19FVkVOVCB8IEkyQ0JNSVNf RVZFTlQgfCBJMkNCTVRPX0VWRU5UIHwgXAoJCQlJMkNCTU5BX0VWRU5UIHwgSTJDQk1BTF9FVkVO VCB8IEkyQ01BTF9FVkVOVCkKI2RlZmluZSBJMkNNQUxfRVZFTlQJCTB4MDAwMQojZGVmaW5lIEky Q01DRl9FVkVOVAkJMHgwMDAyCiNkZWZpbmUgSTJDQk1GSV9FVkVOVAkJMHgwMDA0CiNkZWZpbmUg STJDQk1BTF9FVkVOVAkJMHgwMDA4CiNkZWZpbmUgSTJDQk1OQV9FVkVOVAkJMHgwMDEwCiNkZWZp bmUgSTJDQk1UT19FVkVOVAkJMHgwMDIwCiNkZWZpbmUgSTJDQk1JU19FVkVOVAkJMHgwMDQwCiNk ZWZpbmUgSTJDRVNSRklfRVZFTlQJCTB4MDA4MAojZGVmaW5lIEkyQ0VTUlRPX0VWRU5UCQkweDAx MDAKI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDSF9JMkMJMHg4ODE3CgojZGVmaW5lIHBjaF9kYmco YWRhcCwgZm10LCBhcmcuLi4pICBcCglkZXZfZGJnKGFkYXAtPnBjaF9hZGFwdGVyLmRldi5wYXJl bnQsICIlcyA6IiBmbXQsIF9fZnVuY19fLCAjI2FyZykKCiNkZWZpbmUgcGNoX2VycihhZGFwLCBm bXQsIGFyZy4uLikgIFwKCWRldl9lcnIoYWRhcC0+cGNoX2FkYXB0ZXIuZGV2LnBhcmVudCwgIiVz IDoiIGZtdCwgX19mdW5jX18sICMjYXJnKQoKI2RlZmluZSBwY2hfcGNpX2VycihwZGV2LCBmbXQs IGFyZy4uLikgIFwKCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIDoiIGZtdCwgX19mdW5jX18sICMj YXJnKQoKI2RlZmluZSBwY2hfcGNpX2RiZyhwZGV2LCBmbXQsIGFyZy4uLikgIFwKCWRldl9kYmco JnBkZXYtPmRldiwgIiVzIDoiIGZtdCwgX19mdW5jX18sICMjYXJnKQoKLyoKU2V0IHRoZSBudW1i ZXIgb2YgSTJDIGluc3RhbmNlIG1heApJbnRlbCBFRzIwVCBQQ0ggOgkJMWNoCk9LSSBTRU1JQ09O RFVDVE9SIE1MNzIxMyBJT0ggOgkyY2gKT0tJIFNFTUlDT05EVUNUT1IgTUw3ODMxIElPSCA6CTFj aAoqLwojZGVmaW5lIFBDSF9JMkNfTUFYX0RFVgkJCTIKCi8qKgogKiBzdHJ1Y3QgaTJjX2FsZ29f cGNoX2RhdGEgLSBmb3IgSTJDIGRyaXZlciBmdW5jdGlvbmFsaXRpZXMKICogQHBjaF9hZGFwdGVy OgkJc3RvcmVzIHRoZSByZWZlcmVuY2UgdG8gaTJjX2FkYXB0ZXIgc3RydWN0dXJlCiAqIEBwX2Fk YXB0ZXJfaW5mbzoJCXN0b3JlcyB0aGUgcmVmZXJlbmNlIHRvIGFkYXB0ZXJfaW5mbyBzdHJ1Y3R1 cmUKICogQHBjaF9iYXNlX2FkZHJlc3M6CQlzcGVjaWZpZXMgdGhlIHJlbWFwcGVkIGJhc2UgYWRk cmVzcwogKiBAcGNoX2J1ZmZfbW9kZV9lbjoJCXNwZWNpZmllcyBpZiBidWZmZXIgbW9kZSBpcyBl bmFibGVkCiAqIEBwY2hfZXZlbnRfZmxhZzoJCXNwZWNpZmllcyBvY2N1cnJlbmNlIG9mIGludGVy cnVwdCBldmVudHMKICogQHBjaF9pMmNfeGZlcl9pbl9wcm9ncmVzczoJc3BlY2lmaWVzIHdoZXRo ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZAogKi8Kc3RydWN0IGkyY19hbGdvX3BjaF9kYXRh IHsKCXN0cnVjdCBpMmNfYWRhcHRlciBwY2hfYWRhcHRlcjsKCXN0cnVjdCBhZGFwdGVyX2luZm8g KnBfYWRhcHRlcl9pbmZvOwoJdm9pZCBfX2lvbWVtICpwY2hfYmFzZV9hZGRyZXNzOwoJaW50IHBj aF9idWZmX21vZGVfZW47Cgl1MzIgcGNoX2V2ZW50X2ZsYWc7Cglib29sIHBjaF9pMmNfeGZlcl9p bl9wcm9ncmVzczsKfTsKCi8qKgogKiBzdHJ1Y3QgYWRhcHRlcl9pbmZvIC0gVGhpcyBzdHJ1Y3R1 cmUgaG9sZHMgdGhlIGFkYXB0ZXIgaW5mb3JtYXRpb24gZm9yIHRoZQoJCQkgUENIIGkyYyBjb250 cm9sbGVyCiAqIEBwY2hfZGF0YToJCXN0b3JlcyBhIGxpc3Qgb2YgaTJjX2FsZ29fcGNoX2RhdGEK ICogQHBjaF9pMmNfc3VzcGVuZGVkOglzcGVjaWZpZXMgd2hldGhlciB0aGUgc3lzdGVtIGlzIHN1 c3BlbmRlZCBvciBub3QKICoJCQlwZXJoYXBzIHdpdGggbW9yZSBsaW5lcyBhbmQgd29yZHMuCiAq IEBjaF9udW06CQlzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBpMmMgaW5zdGFuY2UKICoKICogcGNo X2RhdGEgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgbWF4aW11bSBJMkMgY2hhbm5lbHMKICovCnN0 cnVjdCBhZGFwdGVyX2luZm8gewoJc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhIHBjaF9kYXRhW1BD SF9JMkNfTUFYX0RFVl07Cglib29sIHBjaF9pMmNfc3VzcGVuZGVkOwoJaW50IGNoX251bTsKfTsK CgpzdGF0aWMgaW50IHBjaF9pMmNfc3BlZWQgPSAxMDA7IC8qIEkyQyBidXMgc3BlZWQgaW4gS2Jw cyAqLwpzdGF0aWMgaW50IHBjaF9jbGsgPSA1MDAwMDsJLyogc3BlY2lmaWVzIEkyQyBjbG9jayBz cGVlZCBpbiBLSHogKi8Kc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHBjaF9ldmVudDsKc3RhdGlj IERFRklORV9NVVRFWChwY2hfbXV0ZXgpOwoKLyogRGVmaW5pdGlvbiBmb3IgTUw3MjEzIGJ5IE9L SSBTRU1JQ09ORFVDVE9SICovCiNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ST0hNCQkweDEwREIKI2Rl ZmluZSBQQ0lfREVWSUNFX0lEX01MNzIxM19JMkMJMHg4MDJECiNkZWZpbmUgUENJX0RFVklDRV9J RF9NTDcyMjNfSTJDCTB4ODAxMAojZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUw3ODMxX0kyQwkweDg4 MTcKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2RldmluaXRkYXRhIHBjaF9wY2lkZXZf aWRbXSA9IHsKCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfUENIX0kyQyksICAg MSwgfSwKCXsgUENJX1ZERVZJQ0UoUk9ITSwgUENJX0RFVklDRV9JRF9NTDcyMTNfSTJDKSwgMiwg fSwKCXsgUENJX1ZERVZJQ0UoUk9ITSwgUENJX0RFVklDRV9JRF9NTDcyMjNfSTJDKSwgMSwgfSwK CXsgUENJX1ZERVZJQ0UoUk9ITSwgUENJX0RFVklDRV9JRF9NTDc4MzFfSTJDKSwgMSwgfSwKCXsw LH0KfTsKCnN0YXRpYyBpcnFyZXR1cm5fdCBwY2hfaTJjX2hhbmRsZXIoaW50IGlycSwgdm9pZCAq cERhdGEpOwoKc3RhdGljIGlubGluZSB2b2lkIHBjaF9zZXRiaXQodm9pZCBfX2lvbWVtICphZGRy LCB1MzIgb2Zmc2V0LCB1MzIgYml0bWFzaykKewoJdTMyIHZhbDsKCXZhbCA9IGlvcmVhZDMyKGFk ZHIgKyBvZmZzZXQpOwoJdmFsIHw9IGJpdG1hc2s7Cglpb3dyaXRlMzIodmFsLCBhZGRyICsgb2Zm c2V0KTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHBjaF9jbHJiaXQodm9pZCBfX2lvbWVtICphZGRy LCB1MzIgb2Zmc2V0LCB1MzIgYml0bWFzaykKewoJdTMyIHZhbDsKCXZhbCA9IGlvcmVhZDMyKGFk ZHIgKyBvZmZzZXQpOwoJdmFsICY9ICh+Yml0bWFzayk7Cglpb3dyaXRlMzIodmFsLCBhZGRyICsg b2Zmc2V0KTsKfQoKLyoqCiAqIHBjaF9pMmNfaW5pdCgpIC0gaGFyZHdhcmUgaW5pdGlhbGl6YXRp b24gb2YgSTJDIG1vZHVsZQogKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNo X2RhdGEuCiAqLwpzdGF0aWMgdm9pZCBwY2hfaTJjX2luaXQoc3RydWN0IGkyY19hbGdvX3BjaF9k YXRhICphZGFwKQp7Cgl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOwoJ dTMyIHBjaF9pMmNiYzsKCXUzMiBwY2hfaTJjdG1yOwoJdTMyIHJlZ192YWx1ZTsKCgkvKiByZXNl dCBJMkMgY29udHJvbGxlciAqLwoJaW93cml0ZTMyKDB4MDEsIHAgKyBQQ0hfSTJDU1JTVCk7Cglt c2xlZXAoMjApOwoJaW93cml0ZTMyKDB4MCwgcCArIFBDSF9JMkNTUlNUKTsKCgkvKiBJbml0aWFs aXplIEkyQyByZWdpc3RlcnMgKi8KCWlvd3JpdGUzMigweDIxLCBwICsgUENIX0kyQ05GKTsKCglw Y2hfc2V0Yml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIFBDSF9JMkNDVExf STJDTUVOKTsKCglpZiAocGNoX2kyY19zcGVlZCAhPSA0MDApCgkJcGNoX2kyY19zcGVlZCA9IDEw MDsKCglyZWdfdmFsdWUgPSBQQ0hfSTJDQ1RMX0kyQ01FTjsKCWlmIChwY2hfaTJjX3NwZWVkID09 IEZBU1RfTU9ERV9DTEspIHsKCQlyZWdfdmFsdWUgfD0gRkFTVF9NT0RFX0VOOwoJCXBjaF9kYmco YWRhcCwgIkZhc3QgbW9kZSBlbmFibGVkXG4iKTsKCX0KCglpZiAocGNoX2NsayA+IFBDSF9NQVhf Q0xLKQoJCXBjaF9jbGsgPSA2MjUwMDsKCglwY2hfaTJjYmMgPSAocGNoX2NsayArIChwY2hfaTJj X3NwZWVkICogNCkpIC8gKHBjaF9pMmNfc3BlZWQgKiA4KTsKCS8qIFNldCB0cmFuc2ZlciBzcGVl ZCBpbiBJMkNCQyAqLwoJaW93cml0ZTMyKHBjaF9pMmNiYywgcCArIFBDSF9JMkNCQyk7CgoJcGNo X2kyY3RtciA9IChwY2hfY2xrKSAvIDg7Cglpb3dyaXRlMzIocGNoX2kyY3RtciwgcCArIFBDSF9J MkNUTVIpOwoKCXJlZ192YWx1ZSB8PSBOT1JNQUxfSU5UUl9FTkJMOwkvKiBFbmFibGUgaW50ZXJy dXB0cyBpbiBub3JtYWwgbW9kZSAqLwoJaW93cml0ZTMyKHJlZ192YWx1ZSwgcCArIFBDSF9JMkND VEwpOwoKCXBjaF9kYmcoYWRhcCwKCQkiSTJDQ1RMPSV4IHBjaF9pMmNiYz0leCBwY2hfaTJjdG1y PSV4IEVuYWJsZSBpbnRlcnJ1cHRzXG4iLAoJCWlvcmVhZDMyKHAgKyBQQ0hfSTJDQ1RMKSwgcGNo X2kyY2JjLCBwY2hfaTJjdG1yKTsKCglpbml0X3dhaXRxdWV1ZV9oZWFkKCZwY2hfZXZlbnQpOwp9 CgpzdGF0aWMgaW5saW5lIGJvb2wga3RpbWVfbHQoY29uc3Qga3RpbWVfdCBjbXAxLCBjb25zdCBr dGltZV90IGNtcDIpCnsKCXJldHVybiBjbXAxLnR2NjQgPCBjbXAyLnR2NjQ7Cn0KCi8qKgogKiBw Y2hfaTJjX3dhaXRfZm9yX2J1c19pZGxlKCkgLSBjaGVjayB0aGUgc3RhdHVzIG9mIGJ1cy4KICog QGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgogKiBAdGltZW91dDoJ d2FpdGluZyB0aW1lIGNvdW50ZXIgKHVzKS4KICovCnN0YXRpYyBzMzIgcGNoX2kyY193YWl0X2Zv cl9idXNfaWRsZShzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXAsCgkJCQkgICAgIHMzMiB0 aW1lb3V0KQp7Cgl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOwoJa3Rp bWVfdCBuc192YWw7CgoJaWYgKChpb3JlYWQzMihwICsgUENIX0kyQ1NSKSAmIEkyQ01CQl9CSVQp ID09IDApCgkJcmV0dXJuIDA7CgoJLyogTUFYIHRpbWVvdXQgdmFsdWUgaXMgdGltZW91dCoxMDAw KjEwMDBuc2VjICovCgluc192YWwgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksIHRpbWVvdXQq MTAwMCoxMDAwKTsKCWRvIHsKCQltc2xlZXAoMjApOwoJCWlmICgoaW9yZWFkMzIocCArIFBDSF9J MkNTUikgJiBJMkNNQkJfQklUKSA9PSAwKQoJCQlyZXR1cm4gMDsKCX0gd2hpbGUgKGt0aW1lX2x0 KGt0aW1lX2dldCgpLCBuc192YWwpKTsKCglwY2hfZGJnKGFkYXAsICJJMkNTUiA9ICV4XG4iLCBp b3JlYWQzMihwICsgUENIX0kyQ1NSKSk7CglwY2hfZXJyKGFkYXAsICIlczogVGltZW91dCBFcnJv ci5yZXR1cm4lZFxuIiwgX19mdW5jX18sIC1FVElNRSk7CglwY2hfaTJjX2luaXQoYWRhcCk7CgoJ cmV0dXJuIC1FVElNRTsKfQoKLyoqCiAqIHBjaF9pMmNfc3RhcnQoKSAtIEdlbmVyYXRlIEkyQyBz dGFydCBjb25kaXRpb24gaW4gbm9ybWFsIG1vZGUuCiAqIEBhZGFwOglQb2ludGVyIHRvIHN0cnVj dCBpMmNfYWxnb19wY2hfZGF0YS4KICoKICogR2VuZXJhdGUgSTJDIHN0YXJ0IGNvbmRpdGlvbiBp biBub3JtYWwgbW9kZSBieSBzZXR0aW5nIEkyQ0NUTC5JMkNNU1RBIHRvIDEuCiAqLwpzdGF0aWMg dm9pZCBwY2hfaTJjX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCkKewoJdm9p ZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKCXBjaF9kYmcoYWRhcCwgIkky Q0NUTCA9ICV4XG4iLCBpb3JlYWQzMihwICsgUENIX0kyQ0NUTCkpOwoJcGNoX3NldGJpdChhZGFw LT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfU1RBUlQpOwp9CgovKioKICogcGNo X2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKCkgLSBpbml0aWF0ZXMgYSB3YWl0IGZvciB0aGUg dHggY29tcGxldGUgZXZlbnQKICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3Bj aF9kYXRhLgogKi8Kc3RhdGljIHMzMiBwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoc3Ry dWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwKQp7Cglsb25nIHJldDsKCXJldCA9IHdhaXRfZXZl bnRfdGltZW91dChwY2hfZXZlbnQsCgkJCShhZGFwLT5wY2hfZXZlbnRfZmxhZyAhPSAwKSwgbXNl Y3NfdG9famlmZmllcyg1MCkpOwoKCWlmIChyZXQgPT0gMCkgewoJCXBjaF9lcnIoYWRhcCwgInRp bWVvdXQ6ICV4XG4iLCBhZGFwLT5wY2hfZXZlbnRfZmxhZyk7CgkJYWRhcC0+cGNoX2V2ZW50X2Zs YWcgPSAwOwoJCXJldHVybiAtRVRJTUVET1VUOwoJfQoKCWlmIChhZGFwLT5wY2hfZXZlbnRfZmxh ZyAmIEkyQ19FUlJPUl9NQVNLKSB7CgkJcGNoX2VycihhZGFwLCAiZXJyb3IgYml0cyBzZXQ6ICV4 XG4iLCBhZGFwLT5wY2hfZXZlbnRfZmxhZyk7CgkJYWRhcC0+cGNoX2V2ZW50X2ZsYWcgPSAwOwoJ CXJldHVybiAtRUlPOwoJfQoKCWFkYXAtPnBjaF9ldmVudF9mbGFnID0gMDsKCglyZXR1cm4gMDsK fQoKLyoqCiAqIHBjaF9pMmNfZ2V0YWNrKCkgLSB0byBjb25maXJtIEFDSy9OQUNLCiAqIEBhZGFw OglQb2ludGVyIHRvIHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YS4KICovCnN0YXRpYyBzMzIgcGNo X2kyY19nZXRhY2soc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwKQp7Cgl1MzIgcmVnX3Zh bDsKCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CglyZWdfdmFsID0g aW9yZWFkMzIocCArIFBDSF9JMkNTUikgJiBQQ0hfR0VUQUNLOwoKCWlmIChyZWdfdmFsICE9IDAp IHsKCQlwY2hfZGJnKGFkYXAsICJyZXR1cm4lZFxuIiwgLUVQUk9UTyk7CgkJcmV0dXJuIC1FUFJP VE87Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qKgogKiBwY2hfaTJjX3N0b3AoKSAtIGdlbmVyYXRlIHN0 b3AgY29uZGl0aW9uIGluIG5vcm1hbCBtb2RlLgogKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3Qg aTJjX2FsZ29fcGNoX2RhdGEuCiAqLwpzdGF0aWMgdm9pZCBwY2hfaTJjX3N0b3Aoc3RydWN0IGky Y19hbGdvX3BjaF9kYXRhICphZGFwKQp7Cgl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFz ZV9hZGRyZXNzOwoJcGNoX2RiZyhhZGFwLCAiSTJDQ1RMID0gJXhcbiIsIGlvcmVhZDMyKHAgKyBQ Q0hfSTJDQ1RMKSk7CgkvKiBjbGVhciB0aGUgc3RhcnQgYml0ICovCglwY2hfY2xyYml0KGFkYXAt PnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIFBDSF9TVEFSVCk7Cn0KCi8qKgogKiBwY2hf aTJjX3JlcHN0YXJ0KCkgLSBnZW5lcmF0ZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gaW4gbm9y bWFsIG1vZGUKICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgog Ki8Kc3RhdGljIHZvaWQgcGNoX2kyY19yZXBzdGFydChzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEg KmFkYXApCnsKCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CglwY2hf ZGJnKGFkYXAsICJJMkNDVEwgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNDVEwpKTsKCXBj aF9zZXRiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ0NUTCwgUENIX1JFUFNUQVJU KTsKfQoKLyoqCiAqIHBjaF9pMmNfd3JpdGVieXRlcygpIC0gd3JpdGUgZGF0YSB0byBJMkMgYnVz IGluIG5vcm1hbCBtb2RlCiAqIEBpMmNfYWRhcDoJUG9pbnRlciB0byB0aGUgc3RydWN0IGkyY19h ZGFwdGVyLgogKiBAbGFzdDoJc3BlY2lmaWVzIHdoZXRoZXIgbGFzdCBtZXNzYWdlIG9yIG5vdC4K ICoJCUluIHRoZSBjYXNlIG9mIGNvbXBvdW5kIG1vZGUgaXQgd2lsbCBiZSAxIGZvciBsYXN0IG1l c3NhZ2UsCiAqCQlvdGhlcndpc2UgMC4KICogQGZpcnN0OglzcGVjaWZpZXMgd2hldGhlciBmaXJz dCBtZXNzYWdlIG9yIG5vdC4KICoJCTEgZm9yIGZpcnN0IG1lc3NhZ2Ugb3RoZXJ3aXNlIDAuCiAq LwpzdGF0aWMgczMyIHBjaF9pMmNfd3JpdGVieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19h ZGFwLAoJCQkgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNncywgdTMyIGxhc3QsIHUzMiBmaXJzdCkK ewoJc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsK CXU4ICpidWY7Cgl1MzIgbGVuZ3RoOwoJdTMyIGFkZHI7Cgl1MzIgYWRkcl8yX21zYjsKCXUzMiBh ZGRyXzhfbHNiOwoJczMyIHdyY291bnQ7CglzMzIgcnRuOwoJdm9pZCBfX2lvbWVtICpwID0gYWRh cC0+cGNoX2Jhc2VfYWRkcmVzczsKCglsZW5ndGggPSBtc2dzLT5sZW47CglidWYgPSBtc2dzLT5i dWY7CglhZGRyID0gbXNncy0+YWRkcjsKCgkvKiBlbmFibGUgbWFzdGVyIHR4ICovCglwY2hfc2V0 Yml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIEkyQ19UWF9NT0RFKTsKCglw Y2hfZGJnKGFkYXAsICJJMkNDVEwgPSAleCBtc2dzLT5sZW4gPSAlZFxuIiwgaW9yZWFkMzIocCAr IFBDSF9JMkNDVEwpLAoJCWxlbmd0aCk7CgoJaWYgKGZpcnN0KSB7CgkJaWYgKHBjaF9pMmNfd2Fp dF9mb3JfYnVzX2lkbGUoYWRhcCwgQlVTX0lETEVfVElNRU9VVCkgPT0gLUVUSU1FKQoJCQlyZXR1 cm4gLUVUSU1FOwoJfQoKCWlmIChtc2dzLT5mbGFncyAmIEkyQ19NX1RFTikgewoJCWFkZHJfMl9t c2IgPSAoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNykgJiAweDA2OwoJCWlvd3JpdGUzMihh ZGRyXzJfbXNiIHwgVEVOX0JJVF9BRERSX01BU0ssIHAgKyBQQ0hfSTJDRFIpOwoJCWlmIChmaXJz dCkKCQkJcGNoX2kyY19zdGFydChhZGFwKTsKCgkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVy X2NvbXBsZXRlKGFkYXApOwoJCWlmIChydG4gPT0gMCkgewoJCQlpZiAocGNoX2kyY19nZXRhY2so YWRhcCkpIHsKCQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVz cyIKCQkJCQkic2V0dGluZ1xuIik7CgkJCQlyZXR1cm4gLUVJTzsKCQkJfQoJCQlhZGRyXzhfbHNi ID0gKGFkZHIgJiBJMkNfQUREUl9NU0spOwoJCQlpb3dyaXRlMzIoYWRkcl84X2xzYiwgcCArIFBD SF9JMkNEUik7CgkJfSBlbHNlIGlmIChydG4gPT0gLUVJTykgeyAvKiBBcmJpdHJhdGlvbiBMb3N0 ICovCgkJCXBjaF9lcnIoYWRhcCwgIkxvc3QgQXJiaXRyYXRpb25cbiIpOwoJCQlwY2hfY2xyYml0 KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKCQkJCSAgIEkyQ01BTF9CSVQpOwoJ CQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKCQkJCSAgIEky Q01JRl9CSVQpOwoJCQlwY2hfaTJjX2luaXQoYWRhcCk7CgkJCXJldHVybiAtRUFHQUlOOwoJCX0g ZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLwoJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CgkJ CXJldHVybiAtRVRJTUU7CgkJfQoKCX0gZWxzZSB7CgkJLyogc2V0IDcgYml0IHNsYXZlIGFkZHJl c3MgYW5kIFIvVyBiaXQgYXMgMCAqLwoJCWlvd3JpdGUzMihhZGRyIDw8IDEsIHAgKyBQQ0hfSTJD RFIpOwoJCWlmIChmaXJzdCkKCQkJcGNoX2kyY19zdGFydChhZGFwKTsKCX0KCglydG4gPSBwY2hf aTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCk7CglpZiAocnRuID09IDApIHsKCQlpZiAo cGNoX2kyY19nZXRhY2soYWRhcCkpIHsKCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZv ciBzbGF2ZSBhZGRyZXNzIgoJCQkJInNldHRpbmdcbiIpOwoJCQlyZXR1cm4gLUVJTzsKCQl9Cgl9 IGVsc2UgaWYgKHJ0biA9PSAtRUlPKSB7IC8qIEFyYml0cmF0aW9uIExvc3QgKi8KCQlwY2hfZXJy KGFkYXAsICJMb3N0IEFyYml0cmF0aW9uXG4iKTsKCQlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNl X2FkZHJlc3MsIFBDSF9JMkNTUiwgSTJDTUFMX0JJVCk7CgkJcGNoX2NscmJpdChhZGFwLT5wY2hf YmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsIEkyQ01JRl9CSVQpOwoJCXBjaF9pMmNfaW5pdChhZGFw KTsKCQlyZXR1cm4gLUVBR0FJTjsKCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLwoJ CXBjaF9pMmNfc3RvcChhZGFwKTsKCQlyZXR1cm4gLUVUSU1FOwoJfQoKCWZvciAod3Jjb3VudCA9 IDA7IHdyY291bnQgPCBsZW5ndGg7ICsrd3Jjb3VudCkgewoJCS8qIHdyaXRlIGJ1ZmZlciB2YWx1 ZSB0byBJMkMgZGF0YSByZWdpc3RlciAqLwoJCWlvd3JpdGUzMihidWZbd3Jjb3VudF0sIHAgKyBQ Q0hfSTJDRFIpOwoJCXBjaF9kYmcoYWRhcCwgIndyaXRpbmcgJXggdG8gRGF0YSByZWdpc3Rlclxu IiwgYnVmW3dyY291bnRdKTsKCgkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRl KGFkYXApOwoJCWlmIChydG4gPT0gMCkgewoJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpIHsK CQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKCQkJCQki c2V0dGluZ1xuIik7CgkJCQlyZXR1cm4gLUVJTzsKCQkJfQoJCQlwY2hfY2xyYml0KGFkYXAtPnBj aF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKCQkJCSAgIEkyQ01DRl9CSVQpOwoJCQlwY2hfY2xy Yml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwKCQkJCSAgIEkyQ01JRl9CSVQp OwoJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLwoJCQlwY2hfaTJjX3N0b3AoYWRh cCk7CgkJCXJldHVybiAtRVRJTUU7CgkJfQoJfQoKCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxh c3QgbWVzc2FnZSAqLwoJaWYgKGxhc3QpCgkJcGNoX2kyY19zdG9wKGFkYXApOwoJZWxzZQoJCXBj aF9pMmNfcmVwc3RhcnQoYWRhcCk7CgoJcGNoX2RiZyhhZGFwLCAicmV0dXJuPSVkXG4iLCB3cmNv dW50KTsKCglyZXR1cm4gd3Jjb3VudDsKfQoKLyoqCiAqIHBjaF9pMmNfc2VuZGFjaygpIC0gc2Vu ZCBBQ0sKICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgogKi8K c3RhdGljIHZvaWQgcGNoX2kyY19zZW5kYWNrKHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRh cCkKewoJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKCXBjaF9kYmco YWRhcCwgIkkyQ0NUTCA9ICV4XG4iLCBpb3JlYWQzMihwICsgUENIX0kyQ0NUTCkpOwoJcGNoX2Ns cmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfQUNLKTsKfQoKLyoq CiAqIHBjaF9pMmNfc2VuZG5hY2soKSAtIHNlbmQgTkFDSwogKiBAYWRhcDoJUG9pbnRlciB0byBz dHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCiAqLwpzdGF0aWMgdm9pZCBwY2hfaTJjX3NlbmRuYWNr KHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCkKewoJdm9pZCBfX2lvbWVtICpwID0gYWRh cC0+cGNoX2Jhc2VfYWRkcmVzczsKCXBjaF9kYmcoYWRhcCwgIkkyQ0NUTCA9ICV4XG4iLCBpb3Jl YWQzMihwICsgUENIX0kyQ0NUTCkpOwoJcGNoX3NldGJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNz LCBQQ0hfSTJDQ1RMLCBQQ0hfQUNLKTsKfQoKLyoqCiAqIHBjaF9pMmNfcmVzdGFydCgpIC0gR2Vu ZXJhdGUgSTJDIHJlc3RhcnQgY29uZGl0aW9uIGluIG5vcm1hbCBtb2RlLgogKiBAYWRhcDoJUG9p bnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCiAqCiAqIEdlbmVyYXRlIEkyQyByZXN0 YXJ0IGNvbmRpdGlvbiBpbiBub3JtYWwgbW9kZSBieSBzZXR0aW5nIEkyQ0NUTC5JMkNSU1RBLgog Ki8Kc3RhdGljIHZvaWQgcGNoX2kyY19yZXN0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAq YWRhcCkKewoJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKCXBjaF9k YmcoYWRhcCwgIkkyQ0NUTCA9ICV4XG4iLCBpb3JlYWQzMihwICsgUENIX0kyQ0NUTCkpOwoJcGNo X3NldGJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfUkVTVEFSVCk7 Cn0KCi8qKgogKiBwY2hfaTJjX3JlYWRieXRlcygpIC0gcmVhZCBkYXRhICBmcm9tIEkyQyBidXMg aW4gbm9ybWFsIG1vZGUuCiAqIEBpMmNfYWRhcDoJUG9pbnRlciB0byB0aGUgc3RydWN0IGkyY19h ZGFwdGVyLgogKiBAbXNnczoJUG9pbnRlciB0byBpMmNfbXNnIHN0cnVjdHVyZS4KICogQGxhc3Q6 CXNwZWNpZmllcyB3aGV0aGVyIGxhc3QgbWVzc2FnZSBvciBub3QuCiAqIEBmaXJzdDoJc3BlY2lm aWVzIHdoZXRoZXIgZmlyc3QgbWVzc2FnZSBvciBub3QuCiAqLwpzdGF0aWMgczMyIHBjaF9pMmNf cmVhZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICpt c2dzLAoJCQkgICAgIHUzMiBsYXN0LCB1MzIgZmlyc3QpCnsKCXN0cnVjdCBpMmNfYWxnb19wY2hf ZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CgoJdTggKmJ1ZjsKCXUzMiBjb3VudDsK CXUzMiBsZW5ndGg7Cgl1MzIgYWRkcjsKCXUzMiBhZGRyXzJfbXNiOwoJdTMyIGFkZHJfOF9sc2I7 Cgl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOwoJczMyIHJ0bjsKCgls ZW5ndGggPSBtc2dzLT5sZW47CglidWYgPSBtc2dzLT5idWY7CglhZGRyID0gbXNncy0+YWRkcjsK CgkvKiBlbmFibGUgbWFzdGVyIHJlY2VwdGlvbiAqLwoJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFz ZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBJMkNfVFhfTU9ERSk7CgoJaWYgKGZpcnN0KSB7CgkJaWYg KHBjaF9pMmNfd2FpdF9mb3JfYnVzX2lkbGUoYWRhcCwgQlVTX0lETEVfVElNRU9VVCkgPT0gLUVU SU1FKQoJCQlyZXR1cm4gLUVUSU1FOwoJfQoKCWlmIChtc2dzLT5mbGFncyAmIEkyQ19NX1RFTikg ewoJCWFkZHJfMl9tc2IgPSAoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNyk7CgkJaW93cml0 ZTMyKGFkZHJfMl9tc2IgfCBURU5fQklUX0FERFJfTUFTSywgcCArIFBDSF9JMkNEUik7CgkJaWYg KGZpcnN0KQoJCQlwY2hfaTJjX3N0YXJ0KGFkYXApOwoKCQlydG4gPSBwY2hfaTJjX3dhaXRfZm9y X3hmZXJfY29tcGxldGUoYWRhcCk7CgkJaWYgKHJ0biA9PSAwKSB7CgkJCWlmIChwY2hfaTJjX2dl dGFjayhhZGFwKSkgewoJCQkJcGNoX2RiZyhhZGFwLCAiUmVjZWl2ZSBOQUNLIGZvciBzbGF2ZSBh ZGRyZXNzIgoJCQkJCSJzZXR0aW5nXG4iKTsKCQkJCXJldHVybiAtRUlPOwoJCQl9CgkJCWFkZHJf OF9sc2IgPSAoYWRkciAmIEkyQ19BRERSX01TSyk7CgkJCWlvd3JpdGUzMihhZGRyXzhfbHNiLCBw ICsgUENIX0kyQ0RSKTsKCQl9IGVsc2UgaWYgKHJ0biA9PSAtRUlPKSB7IC8qIEFyYml0cmF0aW9u IExvc3QgKi8KCQkJcGNoX2VycihhZGFwLCAiTG9zdCBBcmJpdHJhdGlvblxuIik7CgkJCXBjaF9j bHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAoJCQkJICAgSTJDTUFMX0JJ VCk7CgkJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLAoJCQkJ ICAgSTJDTUlGX0JJVCk7CgkJCXBjaF9pMmNfaW5pdChhZGFwKTsKCQkJcmV0dXJuIC1FQUdBSU47 CgkJfSBlbHNlIHsgLyogd2FpdC1ldmVudCB0aW1lb3V0ICovCgkJCXBjaF9pMmNfc3RvcChhZGFw KTsKCQkJcmV0dXJuIC1FVElNRTsKCQl9CgkJcGNoX2kyY19yZXN0YXJ0KGFkYXApOwoJCXJ0biA9 IHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKTsKCQlpZiAocnRuID09IDApIHsK CQkJaWYgKHBjaF9pMmNfZ2V0YWNrKGFkYXApKSB7CgkJCQlwY2hfZGJnKGFkYXAsICJSZWNlaXZl IE5BQ0sgZm9yIHNsYXZlIGFkZHJlc3MiCgkJCQkJInNldHRpbmdcbiIpOwoJCQkJcmV0dXJuIC1F SU87CgkJCX0KCQkJYWRkcl8yX21zYiB8PSBJMkNfUkQ7CgkJCWlvd3JpdGUzMihhZGRyXzJfbXNi IHwgVEVOX0JJVF9BRERSX01BU0ssCgkJCQkgIHAgKyBQQ0hfSTJDRFIpOwoJCX0gZWxzZSBpZiAo cnRuID09IC1FSU8pIHsgLyogQXJiaXRyYXRpb24gTG9zdCAqLwoJCQlwY2hfZXJyKGFkYXAsICJM b3N0IEFyYml0cmF0aW9uXG4iKTsKCQkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNz LCBQQ0hfSTJDU1IsCgkJCQkgICBJMkNNQUxfQklUKTsKCQkJcGNoX2NscmJpdChhZGFwLT5wY2hf YmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsCgkJCQkgICBJMkNNSUZfQklUKTsKCQkJcGNoX2kyY19p bml0KGFkYXApOwoJCQlyZXR1cm4gLUVBR0FJTjsKCQl9IGVsc2UgeyAvKiB3YWl0LWV2ZW50IHRp bWVvdXQgKi8KCQkJcGNoX2kyY19zdG9wKGFkYXApOwoJCQlyZXR1cm4gLUVUSU1FOwoJCX0KCX0g ZWxzZSB7CgkJLyogNyBhZGRyZXNzIGJpdHMgKyBSL1cgYml0ICovCgkJYWRkciA9ICgoKGFkZHIp IDw8IDEpIHwgKEkyQ19SRCkpOwoJCWlvd3JpdGUzMihhZGRyLCBwICsgUENIX0kyQ0RSKTsKCX0K CgkvKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgbWVzc2FnZSAqLwoJaWYgKGZpcnN0KQoJCXBj aF9pMmNfc3RhcnQoYWRhcCk7CgoJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRl KGFkYXApOwoJaWYgKHJ0biA9PSAwKSB7CgkJaWYgKHBjaF9pMmNfZ2V0YWNrKGFkYXApKSB7CgkJ CXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUgYWRkcmVzcyIKCQkJCSJzZXR0 aW5nXG4iKTsKCQkJcmV0dXJuIC1FSU87CgkJfQoJfSBlbHNlIGlmIChydG4gPT0gLUVJTykgeyAv KiBBcmJpdHJhdGlvbiBMb3N0ICovCgkJcGNoX2VycihhZGFwLCAiTG9zdCBBcmJpdHJhdGlvblxu Iik7CgkJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsIEkyQ01B TF9CSVQpOwoJCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ1NSLCBJ MkNNSUZfQklUKTsKCQlwY2hfaTJjX2luaXQoYWRhcCk7CgkJcmV0dXJuIC1FQUdBSU47Cgl9IGVs c2UgeyAvKiB3YWl0LWV2ZW50IHRpbWVvdXQgKi8KCQlwY2hfaTJjX3N0b3AoYWRhcCk7CgkJcmV0 dXJuIC1FVElNRTsKCX0KCglpZiAobGVuZ3RoID09IDApIHsKCQlwY2hfaTJjX3N0b3AoYWRhcCk7 CgkJaW9yZWFkMzIocCArIFBDSF9JMkNEUik7IC8qIER1bW15IHJlYWQgbmVlZHMgKi8KCgkJY291 bnQgPSBsZW5ndGg7Cgl9IGVsc2UgewoJCWludCByZWFkX2luZGV4OwoJCWludCBsb29wOwoJCXBj aF9pMmNfc2VuZGFjayhhZGFwKTsKCgkJLyogRHVtbXkgcmVhZCAqLwoJCWZvciAobG9vcCA9IDEs IHJlYWRfaW5kZXggPSAwOyBsb29wIDwgbGVuZ3RoOyBsb29wKyspIHsKCQkJYnVmW3JlYWRfaW5k ZXhdID0gaW9yZWFkMzIocCArIFBDSF9JMkNEUik7CgoJCQlpZiAobG9vcCAhPSAxKQoJCQkJcmVh ZF9pbmRleCsrOwoKCQkJcnRuID0gcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXAp OwoJCQlpZiAocnRuID09IDApIHsKCQkJCWlmIChwY2hfaTJjX2dldGFjayhhZGFwKSkgewoJCQkJ CXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBmb3Igc2xhdmUiCgkJCQkJCSJhZGRyZXNzIHNl dHRpbmdcbiIpOwoJCQkJCXJldHVybiAtRUlPOwoJCQkJfQoJCQl9IGVsc2UgeyAvKiB3YWl0LWV2 ZW50IHRpbWVvdXQgKi8KCQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKCQkJCXJldHVybiAtRVRJTUU7 CgkJCX0KCgkJfQkvKiBlbmQgZm9yICovCgoJCXBjaF9pMmNfc2VuZG5hY2soYWRhcCk7CgoJCWJ1 ZltyZWFkX2luZGV4XSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOyAvKiBSZWFkIGZpbmFsIC0g MSAqLwoKCQlpZiAobGVuZ3RoICE9IDEpCgkJCXJlYWRfaW5kZXgrKzsKCgkJcnRuID0gcGNoX2ky Y193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApOwoJCWlmIChydG4gPT0gMCkgewoJCQlpZiAo cGNoX2kyY19nZXRhY2soYWRhcCkpIHsKCQkJCXBjaF9kYmcoYWRhcCwgIlJlY2VpdmUgTkFDSyBm b3Igc2xhdmUiCgkJCQkJImFkZHJlc3Mgc2V0dGluZ1xuIik7CgkJCQlyZXR1cm4gLUVJTzsKCQkJ fQoJCX0gZWxzZSB7IC8qIHdhaXQtZXZlbnQgdGltZW91dCAqLwoJCQlwY2hfaTJjX3N0b3AoYWRh cCk7CgkJCXJldHVybiAtRVRJTUU7CgkJfQoKCQlpZiAobGFzdCkKCQkJcGNoX2kyY19zdG9wKGFk YXApOwoJCWVsc2UKCQkJcGNoX2kyY19yZXBzdGFydChhZGFwKTsKCgkJYnVmW3JlYWRfaW5kZXgr K10gPSBpb3JlYWQzMihwICsgUENIX0kyQ0RSKTsgLyogUmVhZCBGaW5hbCAqLwoJCWNvdW50ID0g cmVhZF9pbmRleDsKCX0KCglyZXR1cm4gY291bnQ7Cn0KCi8qKgogKiBwY2hfaTJjX2NiKCkgLSBJ bnRlcnJ1cHQgaGFuZGxlciBDYWxsIGJhY2sgZnVuY3Rpb24KICogQGFkYXA6CVBvaW50ZXIgdG8g c3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgogKi8Kc3RhdGljIHZvaWQgcGNoX2kyY19jYihzdHJ1 Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCnsKCXUzMiBzdHM7Cgl2b2lkIF9faW9tZW0gKnAg PSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOwoKCXN0cyA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1Ip OwoJc3RzICY9IChJMkNNQUxfQklUIHwgSTJDTUNGX0JJVCB8IEkyQ01JRl9CSVQpOwoJaWYgKHN0 cyAmIEkyQ01BTF9CSVQpCgkJYWRhcC0+cGNoX2V2ZW50X2ZsYWcgfD0gSTJDTUFMX0VWRU5UOwoK CWlmIChzdHMgJiBJMkNNQ0ZfQklUKQoJCWFkYXAtPnBjaF9ldmVudF9mbGFnIHw9IEkyQ01DRl9F VkVOVDsKCgkvKiBjbGVhciB0aGUgYXBwbGljYWJsZSBiaXRzICovCglwY2hfY2xyYml0KGFkYXAt PnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNTUiwgc3RzKTsKCglwY2hfZGJnKGFkYXAsICJQQ0hf STJDU1IgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNTUikpOwoKCXdha2VfdXAoJnBjaF9l dmVudCk7Cn0KCi8qKgogKiBwY2hfaTJjX2hhbmRsZXIoKSAtIGludGVycnVwdCBoYW5kbGVyIGZv ciB0aGUgUENIIEkyQyBjb250cm9sbGVyCiAqIEBpcnE6CWlycSBudW1iZXIuCiAqIEBwRGF0YToJ Y29va2llIHBhc3NlZCBiYWNrIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uLgogKi8Kc3RhdGljIGly cXJldHVybl90IHBjaF9pMmNfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwRGF0YSkKewoJdTMyIHJl Z192YWw7CglpbnQgZmxhZzsKCWludCBpOwoJc3RydWN0IGFkYXB0ZXJfaW5mbyAqYWRhcF9pbmZv ID0gcERhdGE7Cgl2b2lkIF9faW9tZW0gKnA7Cgl1MzIgbW9kZTsKCglmb3IgKGkgPSAwLCBmbGFn ID0gMDsgaSA8IGFkYXBfaW5mby0+Y2hfbnVtOyBpKyspIHsKCQlwID0gYWRhcF9pbmZvLT5wY2hf ZGF0YVtpXS5wY2hfYmFzZV9hZGRyZXNzOwoJCW1vZGUgPSBpb3JlYWQzMihwICsgUENIX0kyQ01P RCk7CgkJbW9kZSAmPSBCVUZGRVJfTU9ERSB8IEVFUFJPTV9TUl9NT0RFOwoJCWlmIChtb2RlICE9 IE5PUk1BTF9NT0RFKSB7CgkJCXBjaF9lcnIoYWRhcF9pbmZvLT5wY2hfZGF0YSwKCQkJCSJJMkMt JWQgbW9kZSglZCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgbW9kZSwgaSk7CgkJCWNvbnRpbnVlOwoJ CX0KCQlyZWdfdmFsID0gaW9yZWFkMzIocCArIFBDSF9JMkNTUik7CgkJaWYgKHJlZ192YWwgJiAo STJDTUFMX0JJVCB8IEkyQ01DRl9CSVQgfCBJMkNNSUZfQklUKSkgewoJCQlwY2hfaTJjX2NiKCZh ZGFwX2luZm8tPnBjaF9kYXRhW2ldKTsKCQkJZmxhZyA9IDE7CgkJfQoJfQoKCXJldHVybiBmbGFn ID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKfQoKLyoqCiAqIHBjaF9pMmNfeGZlcigpIC0gUmVh ZGluZyBhZG5kIHdyaXRpbmcgZGF0YSB0aHJvdWdoIEkyQyBidXMKICogQGkyY19hZGFwOglQb2lu dGVyIHRvIHRoZSBzdHJ1Y3QgaTJjX2FkYXB0ZXIuCiAqIEBtc2dzOglQb2ludGVyIHRvIGkyY19t c2cgc3RydWN0dXJlLgogKiBAbnVtOgludW1iZXIgb2YgbWVzc2FnZXMuCiAqLwpzdGF0aWMgczMy IHBjaF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAoJCQlzdHJ1Y3QgaTJj X21zZyAqbXNncywgczMyIG51bSkKewoJc3RydWN0IGkyY19tc2cgKnBtc2c7Cgl1MzIgaSA9IDA7 Cgl1MzIgc3RhdHVzOwoJdTMyIG1zZ2xlbjsKCXUzMiBzdWJhZGRybGVuOwoJczMyIHJldDsKCglz dHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwoKCXJl dCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcGNoX211dGV4KTsKCWlmIChyZXQpCgkJcmV0 dXJuIC1FUkVTVEFSVFNZUzsKCglpZiAoYWRhcC0+cF9hZGFwdGVyX2luZm8tPnBjaF9pMmNfc3Vz cGVuZGVkKSB7CgkJbXV0ZXhfdW5sb2NrKCZwY2hfbXV0ZXgpOwoJCXJldHVybiAtRUJVU1k7Cgl9 CgoJcGNoX2RiZyhhZGFwLCAiYWRhcC0+cF9hZGFwdGVyX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVk IGlzICVkXG4iLAoJCWFkYXAtPnBfYWRhcHRlcl9pbmZvLT5wY2hfaTJjX3N1c3BlbmRlZCk7Cgkv KiB0cmFuc2ZlciBub3QgY29tcGxldGVkICovCglhZGFwLT5wY2hfaTJjX3hmZXJfaW5fcHJvZ3Jl c3MgPSB0cnVlOwoKCWZvciAoaSA9IDA7IGkgPCBudW0gJiYgcmV0ID49IDA7IGkrKykgewoJCXBt c2cgPSAmbXNnc1tpXTsKCQlwbXNnLT5mbGFncyB8PSBhZGFwLT5wY2hfYnVmZl9tb2RlX2VuOwoJ CXN0YXR1cyA9IHBtc2ctPmZsYWdzOwoJCXBjaF9kYmcoYWRhcCwKCQkJIkFmdGVyIGludm9raW5n IEkyQ19NT0RFX1NFTCA6ZmxhZz0gMHgleFxuIiwgc3RhdHVzKTsKCQkvKiBjYWxjdWxhdGUgc3Vi IGFkZHJlc3MgbGVuZ3RoIGFuZCBtZXNzYWdlIGxlbmd0aCAqLwoJCS8qIHRoZXNlIGFyZSBhcHBs aWNhYmxlIG9ubHkgZm9yIGJ1ZmZlciBtb2RlICovCgkJc3ViYWRkcmxlbiA9IHBtc2ctPmJ1Zlsw XTsKCQkvKiBjYWxjdWxhdGUgYWN0dWFsIG1lc3NhZ2UgbGVuZ3RoIGV4Y2x1ZGluZwoJCSAqIHRo ZSBzdWIgYWRkcmVzcyBmaWVsZHMgKi8KCQltc2dsZW4gPSAocG1zZy0+bGVuKSAtIChzdWJhZGRy bGVuICsgMSk7CgoJCWlmICgoc3RhdHVzICYgKEkyQ19NX1JEKSkgIT0gZmFsc2UpIHsKCQkJcmV0 ID0gcGNoX2kyY19yZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2csIChpICsgMSA9PSBudW0pLAoJCQkJ CQkoaSA9PSAwKSk7CgkJfSBlbHNlIHsKCQkJcmV0ID0gcGNoX2kyY193cml0ZWJ5dGVzKGkyY19h ZGFwLCBwbXNnLCAoaSArIDEgPT0gbnVtKSwKCQkJCQkJIChpID09IDApKTsKCQl9Cgl9CgoJYWRh cC0+cGNoX2kyY194ZmVyX2luX3Byb2dyZXNzID0gZmFsc2U7CS8qIHRyYW5zZmVyIGNvbXBsZXRl ZCAqLwoKCW11dGV4X3VubG9jaygmcGNoX211dGV4KTsKCglyZXR1cm4gKHJldCA8IDApID8gcmV0 IDogbnVtOwp9CgovKioKICogcGNoX2kyY19mdW5jKCkgLSByZXR1cm4gdGhlIGZ1bmN0aW9uYWxp dHkgb2YgdGhlIEkyQyBkcml2ZXIKICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdv X3BjaF9kYXRhLgogKi8Kc3RhdGljIHUzMiBwY2hfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVy ICphZGFwKQp7CglyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8IEky Q19GVU5DXzEwQklUX0FERFI7Cn0KCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2hfYWxn b3JpdGhtID0gewoJLm1hc3Rlcl94ZmVyID0gcGNoX2kyY194ZmVyLAoJLmZ1bmN0aW9uYWxpdHkg PSBwY2hfaTJjX2Z1bmMKfTsKCi8qKgogKiBwY2hfaTJjX2Rpc2JsX2ludCgpIC0gRGlzYWJsZSBQ Q0ggSTJDIGludGVycnVwdHMKICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3Bj aF9kYXRhLgogKi8Kc3RhdGljIHZvaWQgcGNoX2kyY19kaXNibF9pbnQoc3RydWN0IGkyY19hbGdv X3BjaF9kYXRhICphZGFwKQp7Cgl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRy ZXNzOwoKCXBjaF9jbHJiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ0NUTCwgTk9S TUFMX0lOVFJfRU5CTCk7CgoJaW93cml0ZTMyKEVFUFJPTV9SU1RfSU5UUl9ESVNCTCwgcCArIFBD SF9JMkNFU1JNU0spOwoKCWlvd3JpdGUzMihCVUZGRVJfTU9ERV9JTlRSX0RJU0JMLCBwICsgUENI X0kyQ0JVRk1TSyk7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0IHBjaF9pMmNfcHJvYmUoc3RydWN0 IHBjaV9kZXYgKnBkZXYsCgkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsK CXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwoJaW50IHJldDsKCWludCBpLCBqOwoJc3RydWN0IGFk YXB0ZXJfaW5mbyAqYWRhcF9pbmZvOwoJc3RydWN0IGkyY19hZGFwdGVyICpwY2hfYWRhcDsKCglw Y2hfcGNpX2RiZyhwZGV2LCAiRW50ZXJlZC5cbiIpOwoKCWFkYXBfaW5mbyA9IGt6YWxsb2MoKHNp emVvZihzdHJ1Y3QgYWRhcHRlcl9pbmZvKSksIEdGUF9LRVJORUwpOwoJaWYgKGFkYXBfaW5mbyA9 PSBOVUxMKSB7CgkJcGNoX3BjaV9lcnIocGRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIEZBSUxFRFxu Iik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7 CglpZiAocmV0KSB7CgkJcGNoX3BjaV9lcnIocGRldiwgInBjaV9lbmFibGVfZGV2aWNlIEZBSUxF RFxuIik7CgkJZ290byBlcnJfcGNpX2VuYWJsZTsKCX0KCglyZXQgPSBwY2lfcmVxdWVzdF9yZWdp b25zKHBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKCWlmIChyZXQpIHsKCQlwY2hfcGNpX2VycihwZGV2 LCAicGNpX3JlcXVlc3RfcmVnaW9ucyBGQUlMRURcbiIpOwoJCWdvdG8gZXJyX3BjaV9yZXE7Cgl9 CgoJYmFzZV9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIDEsIDApOwoKCWlmIChiYXNlX2FkZHIgPT0g TlVMTCkgewoJCXBjaF9wY2lfZXJyKHBkZXYsICJwY2lfaW9tYXAgRkFJTEVEXG4iKTsKCQlyZXQg PSAtRU5PTUVNOwoJCWdvdG8gZXJyX3BjaV9pb21hcDsKCX0KCgkvKiBTZXQgdGhlIG51bWJlciBv ZiBJMkMgY2hhbm5lbCBpbnN0YW5jZSAqLwoJYWRhcF9pbmZvLT5jaF9udW0gPSBpZC0+ZHJpdmVy X2RhdGE7CgoJZm9yIChpID0gMDsgaSA8IGFkYXBfaW5mby0+Y2hfbnVtOyBpKyspIHsKCQlwY2hf YWRhcCA9ICZhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9hZGFwdGVyOwoJCWFkYXBfaW5mby0+ cGNoX2kyY19zdXNwZW5kZWQgPSBmYWxzZTsKCgkJYWRhcF9pbmZvLT5wY2hfZGF0YVtpXS5wX2Fk YXB0ZXJfaW5mbyA9IGFkYXBfaW5mbzsKCgkJcGNoX2FkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7 CgkJcGNoX2FkYXAtPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwoJCXN0cmNweShwY2hfYWRhcC0+ bmFtZSwgS0JVSUxEX01PRE5BTUUpOwoJCXBjaF9hZGFwLT5hbGdvID0gJnBjaF9hbGdvcml0aG07 CgkJcGNoX2FkYXAtPmFsZ29fZGF0YSA9ICZhZGFwX2luZm8tPnBjaF9kYXRhW2ldOwoKCQkvKiBi YXNlX2FkZHIgKyBvZmZzZXQ7ICovCgkJYWRhcF9pbmZvLT5wY2hfZGF0YVtpXS5wY2hfYmFzZV9h ZGRyZXNzID0gYmFzZV9hZGRyICsgMHgxMDAgKiBpOwoKCQlwY2hfYWRhcC0+ZGV2LnBhcmVudCA9 ICZwZGV2LT5kZXY7CgoJCXJldCA9IGkyY19hZGRfYWRhcHRlcihwY2hfYWRhcCk7CgkJaWYgKHJl dCkgewoJCQlwY2hfcGNpX2VycihwZGV2LCAiaTJjX2FkZF9hZGFwdGVyW2NoOiVkXSBGQUlMRURc biIsIGkpOwoJCQlnb3RvIGVycl9pMmNfYWRkX2FkYXB0ZXI7CgkJfQoKCQlwY2hfaTJjX2luaXQo JmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwoJfQoJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJx LCBwY2hfaTJjX2hhbmRsZXIsIElSUUZfU0hBUkVELAoJCSAgS0JVSUxEX01PRE5BTUUsIGFkYXBf aW5mbyk7CglpZiAocmV0KSB7CgkJcGNoX3BjaV9lcnIocGRldiwgInJlcXVlc3RfaXJxIEZBSUxF RFxuIik7CgkJZ290byBlcnJfaTJjX2FkZF9hZGFwdGVyOwoJfQoKCXBjaV9zZXRfZHJ2ZGF0YShw ZGV2LCBhZGFwX2luZm8pOwoJcGNoX3BjaV9kYmcocGRldiwgInJldHVybnMgJWQuXG4iLCByZXQp OwoJcmV0dXJuIDA7CgplcnJfaTJjX2FkZF9hZGFwdGVyOgoJZm9yIChqID0gMDsgaiA8IGk7IGor KykKCQlpMmNfZGVsX2FkYXB0ZXIoJmFkYXBfaW5mby0+cGNoX2RhdGFbal0ucGNoX2FkYXB0ZXIp OwoJcGNpX2lvdW5tYXAocGRldiwgYmFzZV9hZGRyKTsKZXJyX3BjaV9pb21hcDoKCXBjaV9yZWxl YXNlX3JlZ2lvbnMocGRldik7CmVycl9wY2lfcmVxOgoJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYp OwplcnJfcGNpX2VuYWJsZToKCWtmcmVlKGFkYXBfaW5mbyk7CglyZXR1cm4gcmV0Owp9CgpzdGF0 aWMgdm9pZCBfX2RldmV4aXQgcGNoX2kyY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsK CWludCBpOwoJc3RydWN0IGFkYXB0ZXJfaW5mbyAqYWRhcF9pbmZvID0gcGNpX2dldF9kcnZkYXRh KHBkZXYpOwoKCWZyZWVfaXJxKHBkZXYtPmlycSwgYWRhcF9pbmZvKTsKCglmb3IgKGkgPSAwOyBp IDwgYWRhcF9pbmZvLT5jaF9udW07IGkrKykgewoJCXBjaF9pMmNfZGlzYmxfaW50KCZhZGFwX2lu Zm8tPnBjaF9kYXRhW2ldKTsKCQlpMmNfZGVsX2FkYXB0ZXIoJmFkYXBfaW5mby0+cGNoX2RhdGFb aV0ucGNoX2FkYXB0ZXIpOwoJfQoKCWlmIChhZGFwX2luZm8tPnBjaF9kYXRhWzBdLnBjaF9iYXNl X2FkZHJlc3MpCgkJcGNpX2lvdW5tYXAocGRldiwgYWRhcF9pbmZvLT5wY2hfZGF0YVswXS5wY2hf YmFzZV9hZGRyZXNzKTsKCglmb3IgKGkgPSAwOyBpIDwgYWRhcF9pbmZvLT5jaF9udW07IGkrKykK CQlhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9iYXNlX2FkZHJlc3MgPSAwOwoKCXBjaV9zZXRf ZHJ2ZGF0YShwZGV2LCBOVUxMKTsKCglwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwoKCXBjaV9k aXNhYmxlX2RldmljZShwZGV2KTsKCWtmcmVlKGFkYXBfaW5mbyk7Cn0KCiNpZmRlZiBDT05GSUdf UE0Kc3RhdGljIGludCBwY2hfaTJjX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21l c3NhZ2VfdCBzdGF0ZSkKewoJaW50IHJldDsKCWludCBpOwoJc3RydWN0IGFkYXB0ZXJfaW5mbyAq YWRhcF9pbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoJdm9pZCBfX2lvbWVtICpwID0gYWRh cF9pbmZvLT5wY2hfZGF0YVswXS5wY2hfYmFzZV9hZGRyZXNzOwoKCWFkYXBfaW5mby0+cGNoX2ky Y19zdXNwZW5kZWQgPSB0cnVlOwoKCWZvciAoaSA9IDA7IGkgPCBhZGFwX2luZm8tPmNoX251bTsg aSsrKSB7CgkJd2hpbGUgKChhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9pMmNfeGZlcl9pbl9w cm9ncmVzcykpIHsKCQkJLyogV2FpdCB1bnRpbCBhbGwgY2hhbm5lbCB0cmFuc2ZlcnMgYXJlIGNv bXBsZXRlZCAqLwoJCQltc2xlZXAoMjApOwoJCX0KCX0KCgkvKiBEaXNhYmxlIHRoZSBpMmMgaW50 ZXJydXB0cyAqLwoJZm9yIChpID0gMDsgaSA8IGFkYXBfaW5mby0+Y2hfbnVtOyBpKyspCgkJcGNo X2kyY19kaXNibF9pbnQoJmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwoKCXBjaF9wY2lfZGJnKHBk ZXYsICJJMkNTUiA9ICV4IEkyQ0JVRlNUQSA9ICV4IEkyQ0VTUlNUQSA9ICV4ICIKCQkiaW52b2tl ZCBmdW5jdGlvbiBwY2hfaTJjX2Rpc2JsX2ludCBzdWNjZXNzZnVsbHlcbiIsCgkJaW9yZWFkMzIo cCArIFBDSF9JMkNTUiksIGlvcmVhZDMyKHAgKyBQQ0hfSTJDQlVGU1RBKSwKCQlpb3JlYWQzMihw ICsgUENIX0kyQ0VTUlNUQSkpOwoKCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwoKCWlmIChy ZXQpIHsKCQlwY2hfcGNpX2VycihwZGV2LCAicGNpX3NhdmVfc3RhdGVcbiIpOwoJCXJldHVybiBy ZXQ7Cgl9CgoJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CglwY2lfZGlzYWJs ZV9kZXZpY2UocGRldik7CglwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3Rh dGUocGRldiwgc3RhdGUpKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBwY2hfaTJjX3Jlc3Vt ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKewoJaW50IGk7CglzdHJ1Y3QgYWRhcHRlcl9pbmZvICph ZGFwX2luZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CgoJcGNpX3NldF9wb3dlcl9zdGF0ZShw ZGV2LCBQQ0lfRDApOwoJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CgoJaWYgKHBjaV9lbmFibGVf ZGV2aWNlKHBkZXYpIDwgMCkgewoJCXBjaF9wY2lfZXJyKHBkZXYsICJwY2hfaTJjX3Jlc3VtZTpw Y2lfZW5hYmxlX2RldmljZSBGQUlMRURcbiIpOwoJCXJldHVybiAtRUlPOwoJfQoKCXBjaV9lbmFi bGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwoKCWZvciAoaSA9IDA7IGkgPCBhZGFwX2luZm8t PmNoX251bTsgaSsrKQoJCXBjaF9pMmNfaW5pdCgmYWRhcF9pbmZvLT5wY2hfZGF0YVtpXSk7CgoJ YWRhcF9pbmZvLT5wY2hfaTJjX3N1c3BlbmRlZCA9IGZhbHNlOwoKCXJldHVybiAwOwp9CiNlbHNl CiNkZWZpbmUgcGNoX2kyY19zdXNwZW5kIE5VTEwKI2RlZmluZSBwY2hfaTJjX3Jlc3VtZSBOVUxM CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBjaF9wY2lkcml2ZXIgPSB7CgkubmFt ZSA9IEtCVUlMRF9NT0ROQU1FLAoJLmlkX3RhYmxlID0gcGNoX3BjaWRldl9pZCwKCS5wcm9iZSA9 IHBjaF9pMmNfcHJvYmUsCgkucmVtb3ZlID0gX19kZXZleGl0X3AocGNoX2kyY19yZW1vdmUpLAoJ LnN1c3BlbmQgPSBwY2hfaTJjX3N1c3BlbmQsCgkucmVzdW1lID0gcGNoX2kyY19yZXN1bWUKfTsK CnN0YXRpYyBpbnQgX19pbml0IHBjaF9wY2lfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lz dGVyX2RyaXZlcigmcGNoX3BjaWRyaXZlcik7Cn0KbW9kdWxlX2luaXQocGNoX3BjaV9pbml0KTsK CnN0YXRpYyB2b2lkIF9fZXhpdCBwY2hfcGNpX2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJf ZHJpdmVyKCZwY2hfcGNpZHJpdmVyKTsKfQptb2R1bGVfZXhpdChwY2hfcGNpX2V4aXQpOwoKTU9E VUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBFRzIwVCBQQ0gvT0tJIFNFTUlDT05EVUNUT1IgTUw3MjEz IElPSCBJMkMgRHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FVVEhPUigi VG9tb3lhIE1PUklOQUdBLiA8dG9tb3lhLWxpbnV4QGRzbi5va2lzZW1pLmNvbT4iKTsKbW9kdWxl X3BhcmFtKHBjaF9pMmNfc3BlZWQsIGludCwgKFNfSVJVU1IgfCBTX0lXVVNSKSk7Cm1vZHVsZV9w YXJhbShwY2hfY2xrLCBpbnQsIChTX0lSVVNSIHwgU19JV1VTUikpOwo= --bcaec520f1251d86fb04b24b2054--