NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/46990: tmpfs_gro_genealogy() panic - rename/rmdir race condition not handled



The following reply was made to PR kern/46990; it has been noted by GNATS.

From: Wolfgang Stukenbrock <wolfgang.stukenbrock%nagler-company.com@localhost>
To: Taylor R Campbell <riastradh%NetBSD.org@localhost>
Cc: gnats-bugs%NetBSD.org@localhost
Subject: Re: kern/46990: tmpfs_gro_genealogy() panic - rename/rmdir race 
condition not handled
Date: Fri, 21 Sep 2012 13:10:26 +0200

 This is a multi-part message in MIME format.
 --------------030801010402050202010402
 Content-Type: text/plain; charset=us-ascii; format=flowed
 Content-Transfer-Encoding: 7bit
 
 Hi, of cause you can have them.
 
 I've already ask if someone is interested in - see PR46955.
 
 The attached tar file contains all modified files.
 It is mainly the version from Head with some "missing" stuff copied in 
 from kernel_auth and genfs directly into the tmpfs-sources.
 I don't want to upgrade all of other parts too, because then I have to 
 change everything ...
 I don't expect to get the "best integration of the year"-award for this 
 work. I simply need a stable version for our productive systems running 
 5.1.x - and currently they lockup in tmpfs from time to time.
 (remark: as far as I remember, one kauth-change is not marked with "#if 
 0 // not in 5.1" in the lookup code - a diff against the version from 
 head will show it.)
 
 now to the problem itself.
 
 OK - you are right.
 tmpfs_gro_lock_directory will check the parent link - I've overlooked 
 that sorry.
 
 But I've added a printf() statement in my new error handling path when 
 dnode is NULL and I've got it!
 Also the analyses with DDB before shows, that dnode is NULL. The 
 (manualy) reconstructed call path (accedently mutex_enter is an 
 assembler stuff that does not have a frame pointer ...) say that 
 VOP_RENAME calls genfs_insane_rename, that calls tmpfs_sane_rename, that 
 calls genfs_sane_rename that calls the function from ops at offset 0x40 
 (this is tmpfs_gro_genealogy - not shown in the backtrace of ddb due to 
 the missing frame pointer in mutex_enter) and that crashes inside the 
 call mutex_enter(&dnode->tn_vlock).
 I cannot say if it is the first loop or the second one - I assumed the 
 first one in my report ... My fault.
 
 If we can exclude the first loop pass, than the "problem" must happen 
 while walking up the parent chain.
 We will vput(vp) after getting tn_vlock on the parent - so we have no 
 lock on any vnode anymore.
 The normal way is to get tn_vlock and than seaches for the vnode by 
 calling tmpfs_vnode_get(). There we have two different ways to handle 
 the locks:
 - If the vnode is present we get the v_interlock on it, release tn_vlock 
 and call vget().
 - If the vnode is missing, we allocate one, call vn_lock on it and than 
 release the tn_vlock.
 The second one is OK in any case, but not used in our case here - I think.
 If the vnode is "present", than another process may have locked that 
 vnode and is e.g. trying to get to "our" vnode. When we release it, this 
 process will get it. At this time we "only" hold the tn_vlock on the parent.
 I'm not shure if there is a possibility that other processes may kill 
 the old directory vnode and than kill the one where we have the tn_vlock 
 too.
 The only location where tn_parent gets killed is in tmpfs_dir_detach(). 
 and that one is called in tmpfs_gro_rename (nobody may come there - 
 rename-lock in vfs), tmpfs_gro_remove (not used for directories) and 
 tmpfs_rmdir.
 
 OK - it is always possible that somewhere else someone is throwing 
 bombs. I've "only" tested tmpfs with dirconc, so in case of bombs they 
 may be there but still not explode. but I don't think so.
 
 By the way:
 What will happen if I've a reference to a directory (e.g. current-dir) 
 and someone delete it and the parent of it too?
 When a directory is deleted, it is either realy deleted 
 (tmpfs_free_dirent) or set to WHITEOUT-state (tmpfs_dir_attach again).
 I've seen no code that will destroy the link between the vnode and the 
 node structure till now, but I assume it is present somewhere.
 As a second action all WHITEOUT children of the just removed directory 
 are simply deleted during directory delete operation. (calls to 
 tmpfs_dir_detach and tmpfs_free_dirent without any checks for vnode 
 references.)
 If there are still vnodes associated to the nodes in the dirents, is 
 this code save?
 I'm not shure, but I've no time to go deeper there.
 Perhaps the process is suspended so long, that the dirent-structure gets 
 reuses and removed (as WHITEOUT) before it continues ...
 (I'm running dirconc ....)
 
 The system where I've tested my patch is spare at the moment. So I can 
 do other tests if desired.
 I will enable KASSERT() and will try to get out more information.
 Accedently enabling all KASSERT in the kernel will change the timing 
 behaviour in a way, that the problem may not come up again.
 
 Just as information:
 The last problem I've fixed before was the sync with the cache after 
 rename occured.
 In Head the call to genfs_rename_cache_purge() was commented out in 
 tmpfs_gro_rename.
 5.1 seems to need it, because I've ended up with having the object in 
 the correct tmpfs-structure, but when accessing it in the cache it is 
 not found.
 Symtom: "ls <dir>" will show the name but "ls -l <dir>" say "file not 
 found".
 Either this is wrong in Head too or there are some changes in the 
 vnode-cache, that I've overlooked. Neverless it should be possible all 
 the time to kill some "random" entries from the cache. So adding removal 
 shouldn't do anything wrong - perhaps I loose some performance, but I 
 can live with that.
 But I don't think this is relavant for this problem.
 
 If you prefer that I try it in Head instead, let me know the location of 
 the source-tar-files on an ftp-server I should use for installation. I 
 can (cross-)compile them on another system and install the resulting 
 binaries via network.
 
 Best regards
 
 W. Stukenbrock
 
 Taylor R Campbell wrote:
 
 >    Date: Thu, 20 Sep 2012 14:50:01 +0000
 >    From: Wolfgang.Stukenbrock%nagler-company.com@localhost
 > 
 >    The comment in tmpfs_rename.c tmpfs_gro_genealogy() that dnode may
 >    not be NULL is simply not true. Need to check if dnode is NULL and
 >    return an error (e.g. ENOENT) instead.
 > 
 > I'm not sure this analysis is correct.  If tmpfs_rmdired_p(vp) is
 > false, then VP_TO_TMPFS_NODE(vp)->tn_spec.tn_dir.tn_parent is
 > guaranteed to be nonnull, provided that vp is locked.  Can you enable
 > DIAGNOSTIC and see what earlier kassert fires?  Also, have you
 > reproduced the problem in HEAD too?
 > 
 > I suspect that this not a rename locking issue in particular so much
 > as tmpfs locking issue in general -- if I recall correctly, after
 > netbsd-5, rmind rototilled the tmpfs locking some time before I
 > committed changes to fix tmpfs_rename last year.
 > 
 > Can we see your patches to back-port tmpfs_rename?
 > 
 > 
 
 
 --------------030801010402050202010402
 Content-Type: application/octet-stream;
  name="tmpfs-patch.tar"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment;
  filename="tmpfs-patch.tar"
 
 dG1wZnMtcGF0Y2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUA
 MDAwMDAwMAAwMDAwMDAwADAwMDAwMDAwMDAwADEyMDI3MDExNDEzADAwMTIwMzcANQAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDAwMDAA
 MTIwMjcwMTA3NjMAMDAxMjYzNQA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3
 aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRt
 cGZzLXBhdGNoL3NyYy9zeXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDQwNzU1ADAw
 MDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNzAxMTE2NwAwMDEzNDUyADUAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9mcwAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAwMDAwADEy
 MDI0NTY2NzE2ADAwMTQwNzYANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hl
 ZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBm
 cy1wYXRjaC9zcmMvc3lzL2ZzL3RtcGZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAw
 MDAwADAwMDAwMDAAMDAwMDAwMDAwMDAAMTIwMjcwMTA0NzUAMDAxNTIxNAA1AAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1wZnMvdG1w
 ZnNfdm5vcHMuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDA3NzUxNAAxMjAy
 NjM1MjA0MQAwMDIwMDI1ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVs
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoJJE5l
 dEJTRDogdG1wZnNfdm5vcHMuYyx2IDEuOTggMjAxMi8wNy8yMiAwMDo1MzoyMSBybWluZCBF
 eHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IFRoZSBOZXRC
 U0QgRm91bmRhdGlvbiwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlz
 IGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRC
 U0QgRm91bmRhdGlvbgogKiBieSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwsIGRldmVsb3BlZCBh
 cyBwYXJ0IG9mIEdvb2dsZSdzIFN1bW1lciBvZiBDb2RlCiAqIDIwMDUgcHJvZ3JhbS4KICoK
 ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
 d2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
 ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRp
 c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
 aWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
 bG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
 bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhp
 cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
 aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
 IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
 RCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBg
 YEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
 SU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
 TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9T
 RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9S
 IENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
 TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFN
 QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAq
 IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
 Uk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
 RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwg
 U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
 RVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
 T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNI
 IERBTUFHRS4KICovCgovKgogKiB0bXBmcyB2bm9kZSBpbnRlcmZhY2UuCiAqLwoKI2luY2x1
 ZGUgPHN5cy9jZGVmcy5oPgpfX0tFUk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogdG1wZnNfdm5v
 cHMuYyx2IDEuOTggMjAxMi8wNy8yMiAwMDo1MzoyMSBybWluZCBFeHAgJCIpOwoKI2luY2x1
 ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL2RpcmVudC5oPgojaW5jbHVkZSA8c3lz
 L2ZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvZXZlbnQuaD4KI2luY2x1ZGUgPHN5cy9tYWxsb2Mu
 aD4KI2luY2x1ZGUgPHN5cy9uYW1laS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1
 ZGUgPHN5cy91aW8uaD4KI2luY2x1ZGUgPHN5cy91bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy92
 bm9kZS5oPgojaW5jbHVkZSA8c3lzL2xvY2tmLmg+CiNpbmNsdWRlIDxzeXMva2F1dGguaD4K
 CiNpbmNsdWRlIDx1dm0vdXZtLmg+CgojaW5jbHVkZSA8bWlzY2ZzL2ZpZm9mcy9maWZvLmg+
 CiNpbmNsdWRlIDxmcy90bXBmcy90bXBmc192bm9wcy5oPgojaW5jbHVkZSA8ZnMvdG1wZnMv
 dG1wZnMuaD4KCiNpZiAxIC8vIHN0aWxsIG1pc3NpbmcgZnJvbSBzeXMvZnN0eXBlcy5oIGlu
 IDUuMS54CiNkZWZpbmUJTU5UX1JFTEFUSU1FCTB4MDAwMjAwMDAKI2VuZGlmCgovKgogKiB2
 bm9kZSBvcGVyYXRpb25zIHZlY3RvciB1c2VkIGZvciBmaWxlcyBzdG9yZWQgaW4gYSB0bXBm
 cyBmaWxlIHN5c3RlbS4KICovCmludCAoKip0bXBmc192bm9kZW9wX3ApKHZvaWQgKik7CmNv
 bnN0IHN0cnVjdCB2bm9kZW9wdl9lbnRyeV9kZXNjIHRtcGZzX3Zub2Rlb3BfZW50cmllc1td
 ID0gewoJeyAmdm9wX2RlZmF1bHRfZGVzYywJCXZuX2RlZmF1bHRfZXJyb3IgfSwKCXsgJnZv
 cF9sb29rdXBfZGVzYywJCXRtcGZzX2xvb2t1cCB9LAoJeyAmdm9wX2NyZWF0ZV9kZXNjLAkJ
 dG1wZnNfY3JlYXRlIH0sCgl7ICZ2b3BfbWtub2RfZGVzYywJCXRtcGZzX21rbm9kIH0sCgl7
 ICZ2b3Bfb3Blbl9kZXNjLAkJdG1wZnNfb3BlbiB9LAoJeyAmdm9wX2Nsb3NlX2Rlc2MsCQl0
 bXBmc19jbG9zZSB9LAoJeyAmdm9wX2FjY2Vzc19kZXNjLAkJdG1wZnNfYWNjZXNzIH0sCgl7
 ICZ2b3BfZ2V0YXR0cl9kZXNjLAkJdG1wZnNfZ2V0YXR0ciB9LAoJeyAmdm9wX3NldGF0dHJf
 ZGVzYywJCXRtcGZzX3NldGF0dHIgfSwKCXsgJnZvcF9yZWFkX2Rlc2MsCQl0bXBmc19yZWFk
 IH0sCgl7ICZ2b3Bfd3JpdGVfZGVzYywJCXRtcGZzX3dyaXRlIH0sCgl7ICZ2b3BfaW9jdGxf
 ZGVzYywJCXRtcGZzX2lvY3RsIH0sCgl7ICZ2b3BfZmNudGxfZGVzYywJCXRtcGZzX2ZjbnRs
 IH0sCgl7ICZ2b3BfcG9sbF9kZXNjLAkJdG1wZnNfcG9sbCB9LAoJeyAmdm9wX2txZmlsdGVy
 X2Rlc2MsCQl0bXBmc19rcWZpbHRlciB9LAoJeyAmdm9wX3Jldm9rZV9kZXNjLAkJdG1wZnNf
 cmV2b2tlIH0sCgl7ICZ2b3BfbW1hcF9kZXNjLAkJdG1wZnNfbW1hcCB9LAoJeyAmdm9wX2Zz
 eW5jX2Rlc2MsCQl0bXBmc19mc3luYyB9LAoJeyAmdm9wX3NlZWtfZGVzYywJCXRtcGZzX3Nl
 ZWsgfSwKCXsgJnZvcF9yZW1vdmVfZGVzYywJCXRtcGZzX3JlbW92ZSB9LAoJeyAmdm9wX2xp
 bmtfZGVzYywJCXRtcGZzX2xpbmsgfSwKCXsgJnZvcF9yZW5hbWVfZGVzYywJCXRtcGZzX3Jl
 bmFtZSB9LAoJeyAmdm9wX21rZGlyX2Rlc2MsCQl0bXBmc19ta2RpciB9LAoJeyAmdm9wX3Jt
 ZGlyX2Rlc2MsCQl0bXBmc19ybWRpciB9LAoJeyAmdm9wX3N5bWxpbmtfZGVzYywJCXRtcGZz
 X3N5bWxpbmsgfSwKCXsgJnZvcF9yZWFkZGlyX2Rlc2MsCQl0bXBmc19yZWFkZGlyIH0sCgl7
 ICZ2b3BfcmVhZGxpbmtfZGVzYywJCXRtcGZzX3JlYWRsaW5rIH0sCgl7ICZ2b3BfYWJvcnRv
 cF9kZXNjLAkJdG1wZnNfYWJvcnRvcCB9LAoJeyAmdm9wX2luYWN0aXZlX2Rlc2MsCQl0bXBm
 c19pbmFjdGl2ZSB9LAoJeyAmdm9wX3JlY2xhaW1fZGVzYywJCXRtcGZzX3JlY2xhaW0gfSwK
 CXsgJnZvcF9sb2NrX2Rlc2MsCQl0bXBmc19sb2NrIH0sCgl7ICZ2b3BfdW5sb2NrX2Rlc2Ms
 CQl0bXBmc191bmxvY2sgfSwKCXsgJnZvcF9ibWFwX2Rlc2MsCQl0bXBmc19ibWFwIH0sCgl7
 ICZ2b3Bfc3RyYXRlZ3lfZGVzYywJCXRtcGZzX3N0cmF0ZWd5IH0sCgl7ICZ2b3BfcHJpbnRf
 ZGVzYywJCXRtcGZzX3ByaW50IH0sCgl7ICZ2b3BfcGF0aGNvbmZfZGVzYywJCXRtcGZzX3Bh
 dGhjb25mIH0sCgl7ICZ2b3BfaXNsb2NrZWRfZGVzYywJCXRtcGZzX2lzbG9ja2VkIH0sCgl7
 ICZ2b3BfYWR2bG9ja19kZXNjLAkJdG1wZnNfYWR2bG9jayB9LAoJeyAmdm9wX2J3cml0ZV9k
 ZXNjLAkJdG1wZnNfYndyaXRlIH0sCgl7ICZ2b3BfZ2V0cGFnZXNfZGVzYywJCXRtcGZzX2dl
 dHBhZ2VzIH0sCgl7ICZ2b3BfcHV0cGFnZXNfZGVzYywJCXRtcGZzX3B1dHBhZ2VzIH0sCgl7
 ICZ2b3Bfd2hpdGVvdXRfZGVzYywJCXRtcGZzX3doaXRlb3V0IH0sCgl7IE5VTEwsIE5VTEwg
 fQp9OwoKY29uc3Qgc3RydWN0IHZub2Rlb3B2X2Rlc2MgdG1wZnNfdm5vZGVvcF9vcHZfZGVz
 YyA9IHsKCSZ0bXBmc192bm9kZW9wX3AsIHRtcGZzX3Zub2Rlb3BfZW50cmllcwp9OwoKLyoK
 ICogdG1wZnNfbG9va3VwOiBwYXRoIG5hbWUgdHJhdmVyc2FsIHJvdXRpbmUuCiAqCiAqIEFy
 Z3VtZW50czogZHZwIChkaXJlY3RvcnkgYmVpbmcgc2VhcmNoZWQpLCB2cHAgKHJlc3VsdCks
 CiAqIGNucCAoY29tcG9uZW50IG5hbWUgLSBwYXRoKS4KICoKICogPT4gQ2FsbGVyIGhvbGRz
 IGEgcmVmZXJlbmNlIGFuZCBsb2NrIG9uIGR2cC4KICogPT4gV2UgcmV0dXJuIGxvb2tlZC11
 cCB2bm9kZSAodnBwKSBsb2NrZWQsIHdpdGggYSByZWZlcmVuY2UgaGVsZC4KICovCmludAp0
 bXBmc19sb29rdXAodm9pZCAqdikKewoJc3RydWN0IHZvcF9sb29rdXBfYXJncyAvKiB7CgkJ
 c3RydWN0IHZub2RlICphX2R2cDsKCQlzdHJ1Y3Qgdm5vZGUgKiphX3ZwcDsKCQlzdHJ1Y3Qg
 Y29tcG9uZW50bmFtZSAqYV9jbnA7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICpkdnAgPSBh
 cC0+YV9kdnAsICoqdnBwID0gYXAtPmFfdnBwOwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKmNu
 cCA9IGFwLT5hX2NucDsKCWNvbnN0IGJvb2wgbGFzdGNuID0gKGNucC0+Y25fZmxhZ3MgJiBJ
 U0xBU1RDTikgIT0gMDsKCXRtcGZzX25vZGVfdCAqZG5vZGUsICp0bm9kZTsKCXRtcGZzX2Rp
 cmVudF90ICpkZTsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnApKTsK
 Cglkbm9kZSA9IFZQX1RPX1RNUEZTX0RJUihkdnApOwoJKnZwcCA9IE5VTEw7CgoJLyogQ2hl
 Y2sgYWNjZXNzaWJpbGl0eSBvZiBkaXJlY3RvcnkuICovCgllcnJvciA9IFZPUF9BQ0NFU1Mo
 ZHZwLCBWRVhFQywgY25wLT5jbl9jcmVkKTsKCWlmIChlcnJvcikgewoJCWdvdG8gb3V0OwoJ
 fQoKCS8qCgkgKiBJZiByZXF1ZXN0aW5nIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IG9uIGEg
 cmVhZC1vbmx5IGZpbGUgc3lzdGVtCgkgKiB3aXRoIGEgd3JpdGUgb3BlcmF0aW9uLCBkZW55
 IGl0LgoJICovCglpZiAobGFzdGNuICYmIChkdnAtPnZfbW91bnQtPm1udF9mbGFnICYgTU5U
 X1JET05MWSkgIT0gMCAmJgoJICAgIChjbnAtPmNuX25hbWVpb3AgPT0gREVMRVRFIHx8IGNu
 cC0+Y25fbmFtZWlvcCA9PSBSRU5BTUUpKSB7CgkJZXJyb3IgPSBFUk9GUzsKCQlnb3RvIG91
 dDsKCX0KCgkvKgoJICogQXZvaWQgZG9pbmcgYSBsaW5lYXIgc2NhbiBvZiB0aGUgZGlyZWN0
 b3J5IGlmIHRoZSByZXF1ZXN0ZWQKCSAqIGRpcmVjdG9yeS9uYW1lIGNvdXBsZSBpcyBhbHJl
 YWR5IGluIHRoZSBjYWNoZS4KCSAqLwoJZXJyb3IgPSBjYWNoZV9sb29rdXAoZHZwLCB2cHAs
 IGNucCk7CglpZiAoZXJyb3IgPj0gMCkgewoJCS8qIEJvdGggY2FjaGUtaGl0IG9yIGFuIGVy
 cm9yIGNhc2UuICovCgkJZ290byBvdXQ7Cgl9CgoJaWYgKGNucC0+Y25fZmxhZ3MgJiBJU0RP
 VERPVCkgewoJCXRtcGZzX25vZGVfdCAqcG5vZGU7CgoJCS8qCgkJICogTG9va3VwIG9mICIu
 LiIgY2FzZS4KCQkgKi8KCQlpZiAobGFzdGNuICYmIGNucC0+Y25fbmFtZWlvcCA9PSBSRU5B
 TUUpIHsKCQkJZXJyb3IgPSBFSU5WQUw7CgkJCWdvdG8gb3V0OwoJCX0KCQlLQVNTRVJUKGRu
 b2RlLT50bl90eXBlID09IFZESVIpOwoJCXBub2RlID0gZG5vZGUtPnRuX3NwZWMudG5fZGly
 LnRuX3BhcmVudDsKCQlpZiAocG5vZGUgPT0gTlVMTCkgewoJCQllcnJvciA9IEVOT0VOVDsK
 CQkJZ290byBvdXQ7CgkJfQoKCQkvKgoJCSAqIExvY2sgdGhlIHBhcmVudCB0bl92bG9jayBi
 ZWZvcmUgcmVsZWFzaW5nIHRoZSB2bm9kZSBsb2NrLAoJCSAqIGFuZCB0aHVzIHByZXZlbnRz
 IHBhcmVudCBmcm9tIGRpc2FwcGVhcmluZy4KCQkgKi8KCQltdXRleF9lbnRlcigmcG5vZGUt
 PnRuX3Zsb2NrKTsKCQlWT1BfVU5MT0NLKGR2cCwgMCk7CgoJCS8qCgkJICogR2V0IGEgdm5v
 ZGUgb2YgdGhlICcuLicgZW50cnkgYW5kIHJlLWFjcXVpcmUgdGhlIGxvY2suCgkJICogUmVs
 ZWFzZSB0aGUgdG5fdmxvY2suCgkJICovCgkJZXJyb3IgPSB0bXBmc192bm9kZV9nZXQoZHZw
 LT52X21vdW50LCBwbm9kZSwgdnBwKTsKCQl2bl9sb2NrKGR2cCwgTEtfRVhDTFVTSVZFIHwg
 TEtfUkVUUlkpOwoJCWdvdG8gb3V0OwoKCX0gZWxzZSBpZiAoY25wLT5jbl9uYW1lbGVuID09
 IDEgJiYgY25wLT5jbl9uYW1lcHRyWzBdID09ICcuJykgewoJCS8qCgkJICogTG9va3VwIG9m
 ICIuIiBjYXNlLgoJCSAqLwoJCWlmIChsYXN0Y24gJiYgY25wLT5jbl9uYW1laW9wID09IFJF
 TkFNRSkgewoJCQllcnJvciA9IEVJU0RJUjsKCQkJZ290byBvdXQ7CgkJfQoJCXZyZWYoZHZw
 KTsKCQkqdnBwID0gZHZwOwoJCWVycm9yID0gMDsKCQlnb3RvIGRvbmU7Cgl9CgoJLyoKCSAq
 IE90aGVyIGxvb2t1cCBjYXNlczogcGVyZm9ybSBkaXJlY3Rvcnkgc2Nhbi4KCSAqLwoJZGUg
 PSB0bXBmc19kaXJfbG9va3VwKGRub2RlLCBjbnApOwoJaWYgKGRlID09IE5VTEwgfHwgZGUt
 PnRkX25vZGUgPT0gVE1QRlNfTk9ERV9XSElURU9VVCkgewoJCS8qCgkJICogVGhlIGVudHJ5
 IHdhcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeS4gIFRoaXMgaXMgdmFsaWQKCQkgKiBp
 ZiB3ZSBhcmUgY3JlYXRpbmcgb3IgcmVuYW1pbmcgYW4gZW50cnkgYW5kIGFyZSB3b3JraW5n
 CgkJICogb24gdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIG5hbWUuCgkJICovCgkJ
 aWYgKGxhc3RjbiAmJiAoY25wLT5jbl9uYW1laW9wID09IENSRUFURSB8fAoJCSAgICBjbnAt
 PmNuX25hbWVpb3AgPT0gUkVOQU1FKSkgewoJCQllcnJvciA9IFZPUF9BQ0NFU1MoZHZwLCBW
 V1JJVEUsIGNucC0+Y25fY3JlZCk7CgkJCWlmIChlcnJvcikgewoJCQkJZ290byBvdXQ7CgkJ
 CX0KCQkJY25wLT5jbl9mbGFncyB8PSBTQVZFTkFNRTsKCQkJZXJyb3IgPSBFSlVTVFJFVFVS
 TjsKCQl9IGVsc2UgewoJCQllcnJvciA9IEVOT0VOVDsKCQl9CgkJaWYgKGRlKSB7CgkJCUtB
 U1NFUlQoZGUtPnRkX25vZGUgPT0gVE1QRlNfTk9ERV9XSElURU9VVCk7CgkJCWNucC0+Y25f
 ZmxhZ3MgfD0gSVNXSElURU9VVDsKCQl9CgkJZ290byBkb25lOwoJfQoKCXRub2RlID0gZGUt
 PnRkX25vZGU7CgoJLyoKCSAqIElmIGl0IGlzIG5vdCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVu
 dCBhbmQgZm91bmQgYSBub24tZGlyZWN0b3J5CgkgKiBvciBub24tbGluayBlbnRyeSAod2hp
 Y2ggbWF5IGl0c2VsZiBiZSBwb2ludGluZyB0byBhIGRpcmVjdG9yeSksCgkgKiByYWlzZSBh
 biBlcnJvci4KCSAqLwoJaWYgKCFsYXN0Y24gJiYgdG5vZGUtPnRuX3R5cGUgIT0gVkRJUiAm
 JiB0bm9kZS0+dG5fdHlwZSAhPSBWTE5LKSB7CgkJZXJyb3IgPSBFTk9URElSOwoJCWdvdG8g
 b3V0OwoJfQoKCS8qIENoZWNrIHRoZSBwZXJtaXNzaW9ucy4gKi8KCWlmIChsYXN0Y24gJiYg
 KGNucC0+Y25fbmFtZWlvcCA9PSBERUxFVEUgfHwgY25wLT5jbl9uYW1laW9wID09IFJFTkFN
 RSkpIHsKCQllcnJvciA9IFZPUF9BQ0NFU1MoZHZwLCBWV1JJVEUsIGNucC0+Y25fY3JlZCk7
 CgkJaWYgKGVycm9yKQoJCQlnb3RvIG91dDsKCgkJaWYgKChkbm9kZS0+dG5fbW9kZSAmIFNf
 SVNUWFQpICE9IDApIHsKCQkgIGlmIChrYXV0aF9hdXRob3JpemVfZ2VuZXJpYyhjbnAtPmNu
 X2NyZWQsIEtBVVRIX0dFTkVSSUNfSVNTVVNFUiwgTlVMTCkgIT0gMCAmJgoJCSAgICAgIGth
 dXRoX2NyZWRfZ2V0ZXVpZChjbnAtPmNuX2NyZWQpICE9IGRub2RlLT50bl91aWQgJiYKCQkg
 ICAgICBrYXV0aF9jcmVkX2dldGV1aWQoY25wLT5jbl9jcmVkKSAhPSB0bm9kZS0+dG5fdWlk
 KSB7CgkJCQllcnJvciA9IEVQRVJNOwoJCQkJZ290byBvdXQ7CgkJCX0KCQl9CgkJY25wLT5j
 bl9mbGFncyB8PSBTQVZFTkFNRTsKCX0KCgkvKiBHZXQgYSB2bm9kZSBmb3IgdGhlIG1hdGNo
 aW5nIGVudHJ5LiAqLwoJbXV0ZXhfZW50ZXIoJnRub2RlLT50bl92bG9jayk7CgllcnJvciA9
 IHRtcGZzX3Zub2RlX2dldChkdnAtPnZfbW91bnQsIHRub2RlLCB2cHApOwpkb25lOgoJLyoK
 CSAqIENhY2hlIHRoZSByZXN1bHQsIHVubGVzcyByZXF1ZXN0IHdhcyBmb3IgY3JlYXRpb24g
 KGFzIGl0IGRvZXMKCSAqIG5vdCBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSkuCgkgKi8KCWlm
 IChjbnAtPmNuX25hbWVpb3AgIT0gQ1JFQVRFKSB7CgkJY2FjaGVfZW50ZXIoZHZwLCAqdnBw
 LCBjbnApOwoJfQpvdXQ6CglLQVNTRVJUKCgqdnBwICYmIFZPUF9JU0xPQ0tFRCgqdnBwKSkg
 fHwgZXJyb3IpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZHZwKSk7CgoJcmV0dXJuIGVycm9y
 Owp9CgppbnQKdG1wZnNfY3JlYXRlKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfY3JlYXRlX2Fy
 Z3MgLyogewoJCXN0cnVjdCB2bm9kZQkJKmFfZHZwOwoJCXN0cnVjdCB2bm9kZQkJKiphX3Zw
 cDsKCQlzdHJ1Y3QgY29tcG9uZW50bmFtZQkqYV9jbnA7CgkJc3RydWN0IHZhdHRyCQkqYV92
 YXA7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICpkdnAgPSBhcC0+YV9kdnAsICoqdnBwID0g
 YXAtPmFfdnBwOwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKmNucCA9IGFwLT5hX2NucDsKCXN0
 cnVjdCB2YXR0ciAqdmFwID0gYXAtPmFfdmFwOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2
 cCkpOwoJS0FTU0VSVCh2YXAtPnZhX3R5cGUgPT0gVlJFRyB8fCB2YXAtPnZhX3R5cGUgPT0g
 VlNPQ0spOwoJcmV0dXJuIHRtcGZzX2FsbG9jX2ZpbGUoZHZwLCB2cHAsIHZhcCwgY25wLCBO
 VUxMKTsKfQoKaW50CnRtcGZzX21rbm9kKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfbWtub2Rf
 YXJncyAvKiB7CgkJc3RydWN0IHZub2RlCQkqYV9kdnA7CgkJc3RydWN0IHZub2RlCQkqKmFf
 dnBwOwoJCXN0cnVjdCBjb21wb25lbnRuYW1lCSphX2NucDsKCQlzdHJ1Y3QgdmF0dHIJCSph
 X3ZhcDsKCX0gKi8gKmFwID0gdjsKCXZub2RlX3QgKmR2cCA9IGFwLT5hX2R2cCwgKip2cHAg
 PSBhcC0+YV92cHA7CglzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wID0gYXAtPmFfY25wOwoJ
 c3RydWN0IHZhdHRyICp2YXAgPSBhcC0+YV92YXA7CgllbnVtIHZ0eXBlIHZ0ID0gdmFwLT52
 YV90eXBlOwoKCWlmICh2dCAhPSBWQkxLICYmIHZ0ICE9IFZDSFIgJiYgdnQgIT0gVkZJRk8p
 IHsKCQl2cHV0KGR2cCk7CgkJcmV0dXJuIEVJTlZBTDsKCX0KCXJldHVybiB0bXBmc19hbGxv
 Y19maWxlKGR2cCwgdnBwLCB2YXAsIGNucCwgTlVMTCk7Cn0KCmludAp0bXBmc19vcGVuKHZv
 aWQgKnYpCnsKCXN0cnVjdCB2b3Bfb3Blbl9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFf
 dnA7CgkJaW50CQlhX21vZGU7CgkJa2F1dGhfY3JlZF90CWFfY3JlZDsKCX0gKi8gKmFwID0g
 djsKCXZub2RlX3QgKnZwID0gYXAtPmFfdnA7Cgltb2RlX3QgbW9kZSA9IGFwLT5hX21vZGU7
 Cgl0bXBmc19ub2RlX3QgKm5vZGU7CgoJS0FTU0VSVChWT1BfSVNMT0NLRUQodnApKTsKCglu
 b2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7CglpZiAobm9kZS0+dG5fbGlua3MgPCAxKSB7
 CgkJLyoKCQkgKiBUaGUgZmlsZSBpcyBzdGlsbCBhY3RpdmUsIGJ1dCBhbGwgaXRzIG5hbWVz
 IGhhdmUgYmVlbgoJCSAqIHJlbW92ZWQgKGUuZy4gYnkgYSAicm1kaXIgJChwd2QpIikuICBJ
 dCBjYW5ub3QgYmUgb3BlbmVkCgkJICogYW55IG1vcmUsIGFzIGl0IGlzIGFib3V0IHRvIGJl
 IGRlc3Ryb3llZC4KCQkgKi8KCQlyZXR1cm4gRU5PRU5UOwoJfQoKCS8qIElmIHRoZSBmaWxl
 IGlzIG1hcmtlZCBhcHBlbmQtb25seSwgZGVueSB3cml0ZSByZXF1ZXN0cy4gKi8KCWlmICgo
 bm9kZS0+dG5fZmxhZ3MgJiBBUFBFTkQpICE9IDAgJiYKCSAgICAobW9kZSAmIChGV1JJVEUg
 fCBPX0FQUEVORCkpID09IEZXUklURSkgewoJCXJldHVybiBFUEVSTTsKCX0KCXJldHVybiAw
 Owp9CgppbnQKdG1wZnNfY2xvc2Uodm9pZCAqdikKewoJc3RydWN0IHZvcF9jbG9zZV9hcmdz
 IC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFfdnA7CgkJaW50CQlhX2ZmbGFnOwoJCWthdXRoX2Ny
 ZWRfdAlhX2NyZWQ7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoK
 CUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJdG1wZnNfdXBkYXRlKHZwLCBOVUxMLCBO
 VUxMLCBOVUxMLCBVUERBVEVfQ0xPU0UpOwoJcmV0dXJuIDA7Cn0KCmludAp0bXBmc19hY2Nl
 c3Modm9pZCAqdikKewoJc3RydWN0IHZvcF9hY2Nlc3NfYXJncyAvKiB7CgkJc3RydWN0IHZu
 b2RlCSphX3ZwOwoJCWludAkJYV9tb2RlOwoJCWthdXRoX2NyZWRfdAlhX2NyZWQ7Cgl9ICov
 ICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJbW9kZV90IG1vZGUgPSBhcC0+
 YV9tb2RlOwoJa2F1dGhfY3JlZF90IGNyZWQgPSBhcC0+YV9jcmVkOwoJdG1wZnNfbm9kZV90
 ICpub2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7Cgljb25zdCBib29sIHdyaXRpbmcgPSAo
 bW9kZSAmIFZXUklURSkgIT0gMDsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCS8q
 IFBvc3NpYmxlPyAqLwoJc3dpdGNoICh2cC0+dl90eXBlKSB7CgljYXNlIFZESVI6CgljYXNl
 IFZMTks6CgljYXNlIFZSRUc6CgkJaWYgKHdyaXRpbmcgJiYgKHZwLT52X21vdW50LT5tbnRf
 ZmxhZyAmIE1OVF9SRE9OTFkpICE9IDApIHsKCQkJcmV0dXJuIEVST0ZTOwoJCX0KCQlicmVh
 azsKCWNhc2UgVkJMSzoKCWNhc2UgVkNIUjoKCWNhc2UgVlNPQ0s6CgljYXNlIFZGSUZPOgoJ
 CWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gRUlOVkFMOwoJfQoJaWYgKHdyaXRpbmcgJiYg
 KG5vZGUtPnRuX2ZsYWdzICYgSU1NVVRBQkxFKSAhPSAwKSB7CgkJcmV0dXJuIEVQRVJNOwoJ
 fQoKICAgICAgIHJldHVybiB2YWNjZXNzKHZwLT52X3R5cGUsIG5vZGUtPnRuX21vZGUsIG5v
 ZGUtPnRuX3VpZCwKCSAgIG5vZGUtPnRuX2dpZCwgbW9kZSwgY3JlZCk7Cn0KCmludAp0bXBm
 c19nZXRhdHRyKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfZ2V0YXR0cl9hcmdzIC8qIHsKCQlz
 dHJ1Y3Qgdm5vZGUJKmFfdnA7CgkJc3RydWN0IHZhdHRyCSphX3ZhcDsKCQlrYXV0aF9jcmVk
 X3QJYV9jcmVkOwoJfSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqdnAgPSBhcC0+YV92cDsKCXN0
 cnVjdCB2YXR0ciAqdmFwID0gYXAtPmFfdmFwOwoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBf
 VE9fVE1QRlNfTk9ERSh2cCk7CgoJdmF0dHJfbnVsbCh2YXApOwoKCXRtcGZzX3VwZGF0ZSh2
 cCwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CgoJdmFwLT52YV90eXBlID0gdnAtPnZfdHlwZTsK
 CXZhcC0+dmFfbW9kZSA9IG5vZGUtPnRuX21vZGU7Cgl2YXAtPnZhX25saW5rID0gbm9kZS0+
 dG5fbGlua3M7Cgl2YXAtPnZhX3VpZCA9IG5vZGUtPnRuX3VpZDsKCXZhcC0+dmFfZ2lkID0g
 bm9kZS0+dG5fZ2lkOwoJdmFwLT52YV9mc2lkID0gdnAtPnZfbW91bnQtPm1udF9zdGF0LmZf
 ZnNpZHguX19mc2lkX3ZhbFswXTsKCXZhcC0+dmFfZmlsZWlkID0gbm9kZS0+dG5faWQ7Cgl2
 YXAtPnZhX3NpemUgPSBub2RlLT50bl9zaXplOwoJdmFwLT52YV9ibG9ja3NpemUgPSBQQUdF
 X1NJWkU7Cgl2YXAtPnZhX2F0aW1lID0gbm9kZS0+dG5fYXRpbWU7Cgl2YXAtPnZhX210aW1l
 ID0gbm9kZS0+dG5fbXRpbWU7Cgl2YXAtPnZhX2N0aW1lID0gbm9kZS0+dG5fY3RpbWU7Cgl2
 YXAtPnZhX2JpcnRodGltZSA9IG5vZGUtPnRuX2JpcnRodGltZTsKCXZhcC0+dmFfZ2VuID0g
 VE1QRlNfTk9ERV9HRU4obm9kZSk7Cgl2YXAtPnZhX2ZsYWdzID0gbm9kZS0+dG5fZmxhZ3M7
 Cgl2YXAtPnZhX3JkZXYgPSAodnAtPnZfdHlwZSA9PSBWQkxLIHx8IHZwLT52X3R5cGUgPT0g
 VkNIUikgPwoJICAgIG5vZGUtPnRuX3NwZWMudG5fZGV2LnRuX3JkZXYgOiBWTk9WQUw7Cgl2
 YXAtPnZhX2J5dGVzID0gcm91bmRfcGFnZShub2RlLT50bl9zaXplKTsKCXZhcC0+dmFfZmls
 ZXJldiA9IFZOT1ZBTDsKCXZhcC0+dmFfdmFmbGFncyA9IDA7Cgl2YXAtPnZhX3NwYXJlID0g
 Vk5PVkFMOyAvKiBYWFggKi8KCglyZXR1cm4gMDsKfQoKI2RlZmluZSBHT09EVElNRSh0dikJ
 KCh0diktPnR2X3NlYyAhPSBWTk9WQUwgfHwgKHR2KS0+dHZfbnNlYyAhPSBWTk9WQUwpCi8q
 IFhYWCBTaG91bGQgdGhpcyBvcGVyYXRpb24gYmUgYXRvbWljPyAgSSB0aGluayBpdCBzaG91
 bGQsIGJ1dCBjb2RlIGluCiAqIFhYWCBvdGhlciBwbGFjZXMgKGUuZy4sIHVmcykgZG9lc24n
 dCBzZWVtIHRvIGJlLi4uICovCmludAp0bXBmc19zZXRhdHRyKHZvaWQgKnYpCnsKCXN0cnVj
 dCB2b3Bfc2V0YXR0cl9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFfdnA7CgkJc3RydWN0
 IHZhdHRyCSphX3ZhcDsKCQlrYXV0aF9jcmVkX3QJYV9jcmVkOwoJfSAqLyAqYXAgPSB2OwoJ
 dm5vZGVfdCAqdnAgPSBhcC0+YV92cDsKCXN0cnVjdCB2YXR0ciAqdmFwID0gYXAtPmFfdmFw
 OwoJa2F1dGhfY3JlZF90IGNyZWQgPSBhcC0+YV9jcmVkOwoJbHdwX3QgKmwgPSBjdXJsd3A7
 CglpbnQgZXJyb3IgPSAwOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJLyogQWJv
 cnQgaWYgYW55IHVuc2V0dGFibGUgYXR0cmlidXRlIGlzIGdpdmVuLiAqLwoJaWYgKHZhcC0+
 dmFfdHlwZSAhPSBWTk9OIHx8IHZhcC0+dmFfbmxpbmsgIT0gVk5PVkFMIHx8CgkgICAgdmFw
 LT52YV9mc2lkICE9IFZOT1ZBTCB8fCB2YXAtPnZhX2ZpbGVpZCAhPSBWTk9WQUwgfHwKCSAg
 ICB2YXAtPnZhX2Jsb2Nrc2l6ZSAhPSBWTk9WQUwgfHwgR09PRFRJTUUoJnZhcC0+dmFfY3Rp
 bWUpIHx8CgkgICAgdmFwLT52YV9nZW4gIT0gVk5PVkFMIHx8IHZhcC0+dmFfcmRldiAhPSBW
 Tk9WQUwgfHwKCSAgICB2YXAtPnZhX2J5dGVzICE9IFZOT1ZBTCkgewoJCXJldHVybiBFSU5W
 QUw7Cgl9CglpZiAoZXJyb3IgPT0gMCAmJiAodmFwLT52YV9mbGFncyAhPSBWTk9WQUwpKQoJ
 CWVycm9yID0gdG1wZnNfY2hmbGFncyh2cCwgdmFwLT52YV9mbGFncywgY3JlZCwgbCk7CgoJ
 aWYgKGVycm9yID09IDAgJiYgKHZhcC0+dmFfc2l6ZSAhPSBWTk9WQUwpKQoJCWVycm9yID0g
 dG1wZnNfY2hzaXplKHZwLCB2YXAtPnZhX3NpemUsIGNyZWQsIGwpOwoKCWlmIChlcnJvciA9
 PSAwICYmICh2YXAtPnZhX3VpZCAhPSBWTk9WQUwgfHwgdmFwLT52YV9naWQgIT0gVk5PVkFM
 KSkKCQllcnJvciA9IHRtcGZzX2Nob3duKHZwLCB2YXAtPnZhX3VpZCwgdmFwLT52YV9naWQs
 IGNyZWQsIGwpOwoKCWlmIChlcnJvciA9PSAwICYmICh2YXAtPnZhX21vZGUgIT0gVk5PVkFM
 KSkKCQllcnJvciA9IHRtcGZzX2NobW9kKHZwLCB2YXAtPnZhX21vZGUsIGNyZWQsIGwpOwoK
 CWlmIChlcnJvciA9PSAwICYmIChHT09EVElNRSgmdmFwLT52YV9hdGltZSkgfHwgR09PRFRJ
 TUUoJnZhcC0+dmFfbXRpbWUpCgkgICAgfHwgR09PRFRJTUUoJnZhcC0+dmFfYmlydGh0aW1l
 KSkpIHsKCQllcnJvciA9IHRtcGZzX2NodGltZXModnAsICZ2YXAtPnZhX2F0aW1lLCAmdmFw
 LT52YV9tdGltZSwKCQkgICAgJnZhcC0+dmFfYmlydGh0aW1lLCB2YXAtPnZhX3ZhZmxhZ3Ms
 IGNyZWQsIGwpOwoJCWlmIChlcnJvciA9PSAwKQoJCQlyZXR1cm4gMDsKCX0KCXRtcGZzX3Vw
 ZGF0ZSh2cCwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CglyZXR1cm4gZXJyb3I7Cn0KCmludAp0
 bXBmc19yZWFkKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfcmVhZF9hcmdzIC8qIHsKCQlzdHJ1
 Y3Qgdm5vZGUgKmFfdnA7CgkJc3RydWN0IHVpbyAqYV91aW87CgkJaW50IGFfaW9mbGFnOwoJ
 CWthdXRoX2NyZWRfdCBhX2NyZWQ7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFw
 LT5hX3ZwOwoJc3RydWN0IHVpbyAqdWlvID0gYXAtPmFfdWlvOwoJY29uc3QgaW50IGlvZmxh
 ZyA9IGFwLT5hX2lvZmxhZzsKCXRtcGZzX25vZGVfdCAqbm9kZTsKCXN0cnVjdCB1dm1fb2Jq
 ZWN0ICp1b2JqOwoJaW50IGVycm9yOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJ
 aWYgKHZwLT52X3R5cGUgIT0gVlJFRykgewoJCXJldHVybiBFSVNESVI7Cgl9CglpZiAodWlv
 LT51aW9fb2Zmc2V0IDwgMCkgewoJCXJldHVybiBFSU5WQUw7Cgl9CgoJbm9kZSA9IFZQX1RP
 X1RNUEZTX05PREUodnApOwoJbm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfQUNDRVNT
 RUQ7Cgl1b2JqID0gbm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9iajsKCWVycm9yID0gMDsK
 Cgl3aGlsZSAoZXJyb3IgPT0gMCAmJiB1aW8tPnVpb19yZXNpZCA+IDApIHsKCQl2c2l6ZV90
 IGxlbjsKCgkJaWYgKG5vZGUtPnRuX3NpemUgPD0gdWlvLT51aW9fb2Zmc2V0KSB7CgkJCWJy
 ZWFrOwoJCX0KCQlsZW4gPSBNSU4obm9kZS0+dG5fc2l6ZSAtIHVpby0+dWlvX29mZnNldCwg
 dWlvLT51aW9fcmVzaWQpOwoJCWlmIChsZW4gPT0gMCkgewoJCQlicmVhazsKCQl9CiNpZm5k
 ZWYgVUJDX1VOTUFQX0ZMQUcKI2RlZmluZSBVQkNfVU5NQVBfRkxBRyh2cCkgKFVCQ19XQU5U
 X1VOTUFQKHZwKSA/IFVCQ19VTk1BUCA6IDApCiNlbmRpZgoJCWVycm9yID0gdWJjX3Vpb21v
 dmUodW9iaiwgdWlvLCBsZW4sIElPX0FEVl9ERUNPREUoaW9mbGFnKSwKCQkgICAgVUJDX1JF
 QUQgfCBVQkNfUEFSVElBTE9LIHwgVUJDX1VOTUFQX0ZMQUcodnApKTsKCX0KCXJldHVybiBl
 cnJvcjsKfQoKaW50CnRtcGZzX3dyaXRlKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3Bfd3JpdGVf
 YXJncyAvKiB7CgkJc3RydWN0IHZub2RlCSphX3ZwOwoJCXN0cnVjdCB1aW8JKmFfdWlvOwoJ
 CWludAkJYV9pb2ZsYWc7CgkJa2F1dGhfY3JlZF90CWFfY3JlZDsKCX0gKi8gKmFwID0gdjsK
 CXZub2RlX3QgKnZwID0gYXAtPmFfdnA7CglzdHJ1Y3QgdWlvICp1aW8gPSBhcC0+YV91aW87
 Cgljb25zdCBpbnQgaW9mbGFnID0gYXAtPmFfaW9mbGFnOwoJdG1wZnNfbm9kZV90ICpub2Rl
 OwoJc3RydWN0IHV2bV9vYmplY3QgKnVvYmo7CglvZmZfdCBvbGRzaXplOwoJYm9vbCBleHRl
 bmRlZDsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCW5vZGUg
 PSBWUF9UT19UTVBGU19OT0RFKHZwKTsKCW9sZHNpemUgPSBub2RlLT50bl9zaXplOwoKCWlm
 ICh1aW8tPnVpb19vZmZzZXQgPCAwIHx8IHZwLT52X3R5cGUgIT0gVlJFRykgewoJCWVycm9y
 ID0gRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoJaWYgKHVpby0+dWlvX3Jlc2lkID09IDApIHsK
 CQllcnJvciA9IDA7CgkJZ290byBvdXQ7Cgl9CglpZiAoaW9mbGFnICYgSU9fQVBQRU5EKSB7
 CgkJdWlvLT51aW9fb2Zmc2V0ID0gbm9kZS0+dG5fc2l6ZTsKCX0KCglleHRlbmRlZCA9IHVp
 by0+dWlvX29mZnNldCArIHVpby0+dWlvX3Jlc2lkID4gbm9kZS0+dG5fc2l6ZTsKCWlmIChl
 eHRlbmRlZCkgewoJCWVycm9yID0gdG1wZnNfcmVnX3Jlc2l6ZSh2cCwgdWlvLT51aW9fb2Zm
 c2V0ICsgdWlvLT51aW9fcmVzaWQpOwoJCWlmIChlcnJvcikKCQkJZ290byBvdXQ7Cgl9CgoJ
 dW9iaiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgllcnJvciA9IDA7Cgl3aGls
 ZSAoZXJyb3IgPT0gMCAmJiB1aW8tPnVpb19yZXNpZCA+IDApIHsKCQl2c2l6ZV90IGxlbjsK
 CgkJbGVuID0gTUlOKG5vZGUtPnRuX3NpemUgLSB1aW8tPnVpb19vZmZzZXQsIHVpby0+dWlv
 X3Jlc2lkKTsKCQlpZiAobGVuID09IDApIHsKCQkJYnJlYWs7CgkJfQoJCWVycm9yID0gdWJj
 X3Vpb21vdmUodW9iaiwgdWlvLCBsZW4sIElPX0FEVl9ERUNPREUoaW9mbGFnKSwKCQkgICAg
 VUJDX1dSSVRFIHwgVUJDX1VOTUFQX0ZMQUcodnApKTsKCX0KCWlmIChlcnJvcikgewoJCSh2
 b2lkKXRtcGZzX3JlZ19yZXNpemUodnAsIG9sZHNpemUpOwoJfQoKCW5vZGUtPnRuX3N0YXR1
 cyB8PSBUTVBGU19OT0RFX0FDQ0VTU0VEIHwgVE1QRlNfTk9ERV9NT0RJRklFRCB8CgkgICAg
 KGV4dGVuZGVkID8gVE1QRlNfTk9ERV9DSEFOR0VEIDogMCk7CglWTl9LTk9URSh2cCwgTk9U
 RV9XUklURSk7Cm91dDoKCWlmIChlcnJvcikgewoJCUtBU1NFUlQob2xkc2l6ZSA9PSBub2Rl
 LT50bl9zaXplKTsKCX0gZWxzZSB7CgkJS0FTU0VSVCh1aW8tPnVpb19yZXNpZCA9PSAwKTsK
 CX0KCXJldHVybiBlcnJvcjsKfQoKaW50CnRtcGZzX2ZzeW5jKHZvaWQgKnYpCnsKCXN0cnVj
 dCB2b3BfZnN5bmNfYXJncyAvKiB7CgkJc3RydWN0IHZub2RlICphX3ZwOwoJCWthdXRoX2Ny
 ZWRfdCBhX2NyZWQ7CgkJaW50IGFfZmxhZ3M7CgkJb2ZmX3QgYV9vZmZsbzsKCQlvZmZfdCBh
 X29mZmhpOwoJCXN0cnVjdCBsd3AgKmFfbDsKCX0gKi8gKmFwID0gdjsKCXZub2RlX3QgKnZw
 ID0gYXAtPmFfdnA7CgoJLyogTm90aGluZyB0byBkby4gIEp1c3QgdXBkYXRlLiAqLwoJS0FT
 U0VSVChWT1BfSVNMT0NLRUQodnApKTsKCXRtcGZzX3VwZGF0ZSh2cCwgTlVMTCwgTlVMTCwg
 TlVMTCwgMCk7CglyZXR1cm4gMDsKfQoKLyoKICogdG1wZnNfcmVtb3ZlOiB1bmxpbmsgYSBm
 aWxlLgogKgogKiA9PiBCb3RoIGRpcmVjdG9yeSAoZHZwKSBhbmQgZmlsZSAodnApIGFyZSBs
 b2NrZWQuCiAqID0+IFdlIHVubG9jayBhbmQgZHJvcCB0aGUgcmVmZXJlbmNlIG9uIGJvdGgu
 CiAqLwppbnQKdG1wZnNfcmVtb3ZlKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfcmVtb3ZlX2Fy
 Z3MgLyogewoJCXN0cnVjdCB2bm9kZSAqYV9kdnA7CgkJc3RydWN0IHZub2RlICphX3ZwOwoJ
 CXN0cnVjdCBjb21wb25lbnRuYW1lICphX2NucDsKCX0gKi8gKmFwID0gdjsKCXZub2RlX3Qg
 KmR2cCA9IGFwLT5hX2R2cCwgKnZwID0gYXAtPmFfdnA7Cgl0bXBmc19ub2RlX3QgKm5vZGU7
 Cgl0bXBmc19kaXJlbnRfdCAqZGU7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChWT1BfSVNMT0NL
 RUQoZHZwKSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCWlmICh2cC0+dl90eXBl
 ID09IFZESVIpIHsKCQllcnJvciA9IEVQRVJNOwoJCWdvdG8gb3V0OwoJfQoJbm9kZSA9IFZQ
 X1RPX1RNUEZTX05PREUodnApOwoKCS8qIEZpbGVzIG1hcmtlZCBhcyBpbW11dGFibGUgb3Ig
 YXBwZW5kLW9ubHkgY2Fubm90IGJlIGRlbGV0ZWQuICovCglpZiAobm9kZS0+dG5fZmxhZ3Mg
 JiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkgewoJCWVycm9yID0gRVBFUk07CgkJZ290byBvdXQ7
 Cgl9CgoJLyogTG9va3VwIHRoZSBkaXJlY3RvcnkgZW50cnkgKGNoZWNrIHRoZSBjYWNoZWQg
 aGludCBmaXJzdCkuICovCglkZSA9IHRtcGZzX2Rpcl9jYWNoZWQobm9kZSk7CglpZiAoZGUg
 PT0gTlVMTCkgewoJCXRtcGZzX25vZGVfdCAqZG5vZGUgPSBWUF9UT19UTVBGU19ESVIoZHZw
 KTsKCQlzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wID0gYXAtPmFfY25wOwoJCWRlID0gdG1w
 ZnNfZGlyX2xvb2t1cChkbm9kZSwgY25wKTsKCX0KCUtBU1NFUlQoZGUgJiYgZGUtPnRkX25v
 ZGUgPT0gbm9kZSk7CgoJLyoKCSAqIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgZGlyZWN0
 b3J5IChkcm9wcyB0aGUgbGluayBjb3VudCkgYW5kCgkgKiBkZXN0cm95IGl0IG9yIHJlcGxh
 Y2UgaXQgd2l0aCBhIHdoaXRlb3V0LgoJICogTm90ZTogdGhlIGlub2RlIHJlZmVycmVkIGJ5
 IGl0IHdpbGwgbm90IGJlIGRlc3Ryb3llZAoJICogdW50aWwgdGhlIHZub2RlIGlzIHJlY2xh
 aW1lZC9yZWN5Y2xlZC4KCSAqLwoJdG1wZnNfZGlyX2RldGFjaChkdnAsIGRlKTsKCWlmIChh
 cC0+YV9jbnAtPmNuX2ZsYWdzICYgRE9XSElURU9VVCkKCQl0bXBmc19kaXJfYXR0YWNoKGR2
 cCwgZGUsIFRNUEZTX05PREVfV0hJVEVPVVQpOwoJZWxzZQoJCXRtcGZzX2ZyZWVfZGlyZW50
 KFZGU19UT19UTVBGUyh2cC0+dl9tb3VudCksIGRlKTsKCWVycm9yID0gMDsKb3V0OgoJLyog
 RHJvcCB0aGUgcmVmZXJlbmNlcyBhbmQgdW5sb2NrIHRoZSB2bm9kZXMuICovCgl2cHV0KHZw
 KTsKCWlmIChkdnAgPT0gdnApIHsKCQl2cmVsZShkdnApOwoJfSBlbHNlIHsKCQl2cHV0KGR2
 cCk7Cgl9CglyZXR1cm4gZXJyb3I7Cn0KCi8qCiAqIHRtcGZzX2xpbms6IGNyZWF0ZSBhIGhh
 cmQgbGluay4KICovCmludAp0bXBmc19saW5rKHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfbGlu
 a19hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUgKmFfZHZwOwoJCXN0cnVjdCB2bm9kZSAqYV92
 cDsKCQlzdHJ1Y3QgY29tcG9uZW50bmFtZSAqYV9jbnA7Cgl9ICovICphcCA9IHY7Cgl2bm9k
 ZV90ICpkdnAgPSBhcC0+YV9kdnA7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJc3RydWN0
 IGNvbXBvbmVudG5hbWUgKmNucCA9IGFwLT5hX2NucDsKCXRtcGZzX25vZGVfdCAqZG5vZGUs
 ICpub2RlOwoJdG1wZnNfZGlyZW50X3QgKmRlOwoJaW50IGVycm9yOwoKCUtBU1NFUlQoZHZw
 ICE9IHZwKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2cCkpOwoJS0FTU0VSVCh2cC0+dl90
 eXBlICE9IFZESVIpOwoJS0FTU0VSVChkdnAtPnZfbW91bnQgPT0gdnAtPnZfbW91bnQpOwoK
 CWRub2RlID0gVlBfVE9fVE1QRlNfRElSKGR2cCk7Cglub2RlID0gVlBfVE9fVE1QRlNfTk9E
 RSh2cCk7CgoJdm5fbG9jayh2cCwgTEtfRVhDTFVTSVZFIHwgTEtfUkVUUlkpOwoKCS8qIENo
 ZWNrIGZvciBtYXhpbXVtIG51bWJlciBvZiBsaW5rcyBsaW1pdC4gKi8KCWlmIChub2RlLT50
 bl9saW5rcyA9PSBMSU5LX01BWCkgewoJCWVycm9yID0gRU1MSU5LOwoJCWdvdG8gb3V0OwoJ
 fQoJS0FTU0VSVChub2RlLT50bl9saW5rcyA8IExJTktfTUFYKTsKCgkvKiBXZSBjYW5ub3Qg
 Y3JlYXRlIGxpbmtzIG9mIGZpbGVzIG1hcmtlZCBpbW11dGFibGUgb3IgYXBwZW5kLW9ubHku
 ICovCglpZiAobm9kZS0+dG5fZmxhZ3MgJiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkgewoJCWVy
 cm9yID0gRVBFUk07CgkJZ290byBvdXQ7Cgl9CgoJLyogQWxsb2NhdGUgYSBuZXcgZGlyZWN0
 b3J5IGVudHJ5IHRvIHJlcHJlc2VudCB0aGUgaW5vZGUuICovCgllcnJvciA9IHRtcGZzX2Fs
 bG9jX2RpcmVudChWRlNfVE9fVE1QRlModnAtPnZfbW91bnQpLAoJICAgIGNucC0+Y25fbmFt
 ZXB0ciwgY25wLT5jbl9uYW1lbGVuLCAmZGUpOwoJaWYgKGVycm9yKSB7CgkJZ290byBvdXQ7
 Cgl9CgoJLyogCgkgKiBJbnNlcnQgdGhlIGVudHJ5IGludG8gdGhlIGRpcmVjdG9yeS4KCSAq
 IEl0IHdpbGwgaW5jcmVhc2UgdGhlIGlub2RlIGxpbmsgY291bnQuCgkgKi8KCXRtcGZzX2Rp
 cl9hdHRhY2goZHZwLCBkZSwgbm9kZSk7CgoJLyogVXBkYXRlIHRoZSB0aW1lc3RhbXBzIGFu
 ZCB0cmlnZ2VyIHRoZSBldmVudC4gKi8KCWlmIChub2RlLT50bl92bm9kZSkgewoJCVZOX0tO
 T1RFKG5vZGUtPnRuX3Zub2RlLCBOT1RFX0xJTkspOwoJfQoJbm9kZS0+dG5fc3RhdHVzIHw9
 IFRNUEZTX05PREVfQ0hBTkdFRDsKCXRtcGZzX3VwZGF0ZSh2cCwgTlVMTCwgTlVMTCwgTlVM
 TCwgMCk7CgllcnJvciA9IDA7Cm91dDoKCVZPUF9VTkxPQ0sodnAsIDApOwoJdnB1dChkdnAp
 OwoJcmV0dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfbWtkaXIodm9pZCAqdikKewoJc3RydWN0
 IHZvcF9ta2Rpcl9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJCSphX2R2cDsKCQlzdHJ1Y3Qg
 dm5vZGUJCSoqYV92cHA7CgkJc3RydWN0IGNvbXBvbmVudG5hbWUJKmFfY25wOwoJCXN0cnVj
 dCB2YXR0cgkJKmFfdmFwOwoJfSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqZHZwID0gYXAtPmFf
 ZHZwOwoJdm5vZGVfdCAqKnZwcCA9IGFwLT5hX3ZwcDsKCXN0cnVjdCBjb21wb25lbnRuYW1l
 ICpjbnAgPSBhcC0+YV9jbnA7CglzdHJ1Y3QgdmF0dHIgKnZhcCA9IGFwLT5hX3ZhcDsKCglL
 QVNTRVJUKHZhcC0+dmFfdHlwZSA9PSBWRElSKTsKCXJldHVybiB0bXBmc19hbGxvY19maWxl
 KGR2cCwgdnBwLCB2YXAsIGNucCwgTlVMTCk7Cn0KCmludAp0bXBmc19ybWRpcih2b2lkICp2
 KQp7CglzdHJ1Y3Qgdm9wX3JtZGlyX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkJKmFfZHZw
 OwoJCXN0cnVjdCB2bm9kZQkJKmFfdnA7CgkJc3RydWN0IGNvbXBvbmVudG5hbWUJKmFfY25w
 OwoJfSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqZHZwID0gYXAtPmFfZHZwOwoJdm5vZGVfdCAq
 dnAgPSBhcC0+YV92cDsKCXRtcGZzX21vdW50X3QgKnRtcCA9IFZGU19UT19UTVBGUyhkdnAt
 PnZfbW91bnQpOwoJdG1wZnNfbm9kZV90ICpkbm9kZSA9IFZQX1RPX1RNUEZTX0RJUihkdnAp
 OwoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBfVE9fVE1QRlNfRElSKHZwKTsKCXRtcGZzX2Rp
 cmVudF90ICpkZTsKCWludCBlcnJvciA9IDA7CgoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZHZw
 KSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoJS0FTU0VSVChub2RlLT50bl9zcGVj
 LnRuX2Rpci50bl9wYXJlbnQgPT0gZG5vZGUpOwoKCS8qCgkgKiBEaXJlY3RvcmllcyB3aXRo
 IG1vcmUgdGhhbiB0d28gbm9uLXdoaXRlb3V0CgkgKiBlbnRyaWVzICgnLicgYW5kICcuLicp
 IGNhbm5vdCBiZSByZW1vdmVkLgoJICovCglpZiAobm9kZS0+dG5fc2l6ZSA+IDApIHsKCQlL
 QVNTRVJUKGVycm9yID09IDApOwoJCVRBSUxRX0ZPUkVBQ0goZGUsICZub2RlLT50bl9zcGVj
 LnRuX2Rpci50bl9kaXIsIHRkX2VudHJpZXMpIHsKCQkJaWYgKGRlLT50ZF9ub2RlICE9IFRN
 UEZTX05PREVfV0hJVEVPVVQpIHsKCQkJCWVycm9yID0gRU5PVEVNUFRZOwoJCQkJYnJlYWs7
 CgkJCX0KCQl9CgkJaWYgKGVycm9yKQoJCQlnb3RvIG91dDsKCX0KCgkvKiBMb29rdXAgdGhl
 IGRpcmVjdG9yeSBlbnRyeSAoY2hlY2sgdGhlIGNhY2hlZCBoaW50IGZpcnN0KS4gKi8KCWRl
 ID0gdG1wZnNfZGlyX2NhY2hlZChub2RlKTsKCWlmIChkZSA9PSBOVUxMKSB7CgkJc3RydWN0
 IGNvbXBvbmVudG5hbWUgKmNucCA9IGFwLT5hX2NucDsKCQlkZSA9IHRtcGZzX2Rpcl9sb29r
 dXAoZG5vZGUsIGNucCk7Cgl9CglLQVNTRVJUKGRlICYmIGRlLT50ZF9ub2RlID09IG5vZGUp
 OwoKCS8qIENoZWNrIGZsYWdzIHRvIHNlZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byByZW1vdmUg
 dGhlIGRpcmVjdG9yeS4gKi8KCWlmIChkbm9kZS0+dG5fZmxhZ3MgJiBBUFBFTkQgfHwgbm9k
 ZS0+dG5fZmxhZ3MgJiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkgewoJCWVycm9yID0gRVBFUk07
 CgkJZ290byBvdXQ7Cgl9CgoJLyogRGVjcmVtZW50IHRoZSBsaW5rIGNvdW50IGZvciB0aGUg
 dmlydHVhbCAnLicgZW50cnkuICovCglub2RlLT50bl9saW5rcy0tOwoJbm9kZS0+dG5fc3Rh
 dHVzIHw9IFRNUEZTX05PREVfU1RBVFVTQUxMOwoKCS8qIERldGFjaCB0aGUgZGlyZWN0b3J5
 IGVudHJ5IGZyb20gdGhlIGRpcmVjdG9yeS4gKi8KCXRtcGZzX2Rpcl9kZXRhY2goZHZwLCBk
 ZSk7CgoJLyogUHVyZ2UgdGhlIGNhY2hlIGZvciBwYXJlbnQuICovCgljYWNoZV9wdXJnZShk
 dnApOwoKCS8qCgkgKiBEZXN0cm95IHRoZSBkaXJlY3RvcnkgZW50cnkgb3IgcmVwbGFjZSBp
 dCB3aXRoIGEgd2hpdGVvdXQuCgkgKiBOb3RlOiB0aGUgaW5vZGUgcmVmZXJyZWQgYnkgaXQg
 d2lsbCBub3QgYmUgZGVzdHJveWVkCgkgKiB1bnRpbCB0aGUgdm5vZGUgaXMgcmVjbGFpbWVk
 LgoJICovCglpZiAoYXAtPmFfY25wLT5jbl9mbGFncyAmIERPV0hJVEVPVVQpCgkJdG1wZnNf
 ZGlyX2F0dGFjaChkdnAsIGRlLCBUTVBGU19OT0RFX1dISVRFT1VUKTsKCWVsc2UKCQl0bXBm
 c19mcmVlX2RpcmVudCh0bXAsIGRlKTsKCgkvKiBEZXN0cm95IHRoZSB3aGl0ZW91dCBlbnRy
 aWVzIGZyb20gdGhlIG5vZGUuICovCgl3aGlsZSAoKGRlID0gVEFJTFFfRklSU1QoJm5vZGUt
 PnRuX3NwZWMudG5fZGlyLnRuX2RpcikpICE9IE5VTEwpIHsKCQlLQVNTRVJUKGRlLT50ZF9u
 b2RlID09IFRNUEZTX05PREVfV0hJVEVPVVQpOwoJCXRtcGZzX2Rpcl9kZXRhY2godnAsIGRl
 KTsKCQl0bXBmc19mcmVlX2RpcmVudCh0bXAsIGRlKTsKCX0KCglLQVNTRVJUKG5vZGUtPnRu
 X2xpbmtzID09IDApOwpvdXQ6CgkvKiBSZWxlYXNlIHRoZSBub2Rlcy4gKi8KCXZwdXQoZHZw
 KTsKCXZwdXQodnApOwoJcmV0dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfc3ltbGluayh2b2lk
 ICp2KQp7CglzdHJ1Y3Qgdm9wX3N5bWxpbmtfYXJncyAvKiB7CgkJc3RydWN0IHZub2RlCQkq
 YV9kdnA7CgkJc3RydWN0IHZub2RlCQkqKmFfdnBwOwoJCXN0cnVjdCBjb21wb25lbnRuYW1l
 CSphX2NucDsKCQlzdHJ1Y3QgdmF0dHIJCSphX3ZhcDsKCQljaGFyCQkJKmFfdGFyZ2V0OwoJ
 fSAqLyAqYXAgPSB2OwoJdm5vZGVfdCAqZHZwID0gYXAtPmFfZHZwOwoJdm5vZGVfdCAqKnZw
 cCA9IGFwLT5hX3ZwcDsKCXN0cnVjdCBjb21wb25lbnRuYW1lICpjbnAgPSBhcC0+YV9jbnA7
 CglzdHJ1Y3QgdmF0dHIgKnZhcCA9IGFwLT5hX3ZhcDsKCWNoYXIgKnRhcmdldCA9IGFwLT5h
 X3RhcmdldDsKCglLQVNTRVJUKHZhcC0+dmFfdHlwZSA9PSBWTE5LKTsKCXJldHVybiB0bXBm
 c19hbGxvY19maWxlKGR2cCwgdnBwLCB2YXAsIGNucCwgdGFyZ2V0KTsKfQoKaW50CnRtcGZz
 X3JlYWRkaXIodm9pZCAqdikKewoJc3RydWN0IHZvcF9yZWFkZGlyX2FyZ3MgLyogewoJCXN0
 cnVjdCB2bm9kZQkqYV92cDsKCQlzdHJ1Y3QgdWlvCSphX3VpbzsKCQlrYXV0aF9jcmVkX3QJ
 YV9jcmVkOwoJCWludAkJKmFfZW9mZmxhZzsKCQlvZmZfdAkJKiphX2Nvb2tpZXM7CgkJaW50
 CQkqbmNvb2tpZXM7Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJ
 c3RydWN0IHVpbyAqdWlvID0gYXAtPmFfdWlvOwoJaW50ICplb2ZmbGFnID0gYXAtPmFfZW9m
 ZmxhZzsKCW9mZl90ICoqY29va2llcyA9IGFwLT5hX2Nvb2tpZXM7CglpbnQgKm5jb29raWVz
 ID0gYXAtPmFfbmNvb2tpZXM7CglvZmZfdCBzdGFydG9mZiwgY250OwoJdG1wZnNfbm9kZV90
 ICpub2RlOwoJaW50IGVycm9yOwoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJLyog
 VGhpcyBvcGVyYXRpb24gb25seSBtYWtlcyBzZW5zZSBvbiBkaXJlY3Rvcnkgbm9kZXMuICov
 CglpZiAodnAtPnZfdHlwZSAhPSBWRElSKSB7CgkJcmV0dXJuIEVOT1RESVI7Cgl9Cglub2Rl
 ID0gVlBfVE9fVE1QRlNfRElSKHZwKTsKCXN0YXJ0b2ZmID0gdWlvLT51aW9fb2Zmc2V0OwoJ
 Y250ID0gMDsKCWlmIChub2RlLT50bl9saW5rcyA9PSAwKSB7CgkJZXJyb3IgPSAwOwoJCWdv
 dG8gb3V0OwoJfQoKCWlmICh1aW8tPnVpb19vZmZzZXQgPT0gVE1QRlNfRElSQ09PS0lFX0RP
 VCkgewoJCWVycm9yID0gdG1wZnNfZGlyX2dldGRvdGRlbnQobm9kZSwgdWlvKTsKCQlpZiAo
 ZXJyb3IgIT0gMCkgewoJCQlpZiAoZXJyb3IgPT0gLTEpCgkJCQllcnJvciA9IDA7CgkJCWdv
 dG8gb3V0OwoJCX0KCQljbnQrKzsKCX0KCWlmICh1aW8tPnVpb19vZmZzZXQgPT0gVE1QRlNf
 RElSQ09PS0lFX0RPVERPVCkgewoJCWVycm9yID0gdG1wZnNfZGlyX2dldGRvdGRvdGRlbnQo
 bm9kZSwgdWlvKTsKCQlpZiAoZXJyb3IgIT0gMCkgewoJCQlpZiAoZXJyb3IgPT0gLTEpCgkJ
 CQllcnJvciA9IDA7CgkJCWdvdG8gb3V0OwoJCX0KCQljbnQrKzsKCX0KCWVycm9yID0gdG1w
 ZnNfZGlyX2dldGRlbnRzKG5vZGUsIHVpbywgJmNudCk7CglpZiAoZXJyb3IgPT0gLTEpIHsK
 CQllcnJvciA9IDA7Cgl9CglLQVNTRVJUKGVycm9yID49IDApOwpvdXQ6CglpZiAoZW9mZmxh
 ZyAhPSBOVUxMKSB7CgkJKmVvZmZsYWcgPSAoIWVycm9yICYmIHVpby0+dWlvX29mZnNldCA9
 PSBUTVBGU19ESVJDT09LSUVfRU9GKTsKCX0KCWlmIChlcnJvciB8fCBjb29raWVzID09IE5V
 TEwgfHwgbmNvb2tpZXMgPT0gTlVMTCkgewoJCXJldHVybiBlcnJvcjsKCX0KCgkvKiBVcGRh
 dGUgTkZTLXJlbGF0ZWQgdmFyaWFibGVzLCBpZiBhbnkuICovCglvZmZfdCBpLCBvZmYgPSBz
 dGFydG9mZjsKCXRtcGZzX2RpcmVudF90ICpkZSA9IE5VTEw7CgoJKmNvb2tpZXMgPSBtYWxs
 b2MoY250ICogc2l6ZW9mKG9mZl90KSwgTV9URU1QLCBNX1dBSVRPSyk7CgkqbmNvb2tpZXMg
 PSBjbnQ7CgoJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CgkJS0FTU0VSVChvZmYgIT0g
 VE1QRlNfRElSQ09PS0lFX0VPRik7CgkJaWYgKG9mZiAhPSBUTVBGU19ESVJDT09LSUVfRE9U
 KSB7CgkJCWlmIChvZmYgPT0gVE1QRlNfRElSQ09PS0lFX0RPVERPVCkgewoJCQkJZGUgPSBU
 QUlMUV9GSVJTVCgmbm9kZS0+dG5fc3BlYy50bl9kaXIudG5fZGlyKTsKCQkJfSBlbHNlIGlm
 IChkZSAhPSBOVUxMKSB7CgkJCQlkZSA9IFRBSUxRX05FWFQoZGUsIHRkX2VudHJpZXMpOwoJ
 CQl9IGVsc2UgewoJCQkJZGUgPSB0bXBmc19kaXJfbG9va3VwYnljb29raWUobm9kZSwgb2Zm
 KTsKCQkJCUtBU1NFUlQoZGUgIT0gTlVMTCk7CgkJCQlkZSA9IFRBSUxRX05FWFQoZGUsIHRk
 X2VudHJpZXMpOwoJCQl9CgkJCWlmIChkZSA9PSBOVUxMKSB7CgkJCQlvZmYgPSBUTVBGU19E
 SVJDT09LSUVfRU9GOwoJCQl9IGVsc2UgewoJCQkJb2ZmID0gdG1wZnNfZGlyY29va2llKGRl
 KTsKCQkJfQoJCX0gZWxzZSB7CgkJCW9mZiA9IFRNUEZTX0RJUkNPT0tJRV9ET1RET1Q7CgkJ
 fQoJCSgqY29va2llcylbaV0gPSBvZmY7Cgl9CglLQVNTRVJUKHVpby0+dWlvX29mZnNldCA9
 PSBvZmYpOwoJcmV0dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfcmVhZGxpbmsodm9pZCAqdikK
 ewoJc3RydWN0IHZvcF9yZWFkbGlua19hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJKmFfdnA7
 CgkJc3RydWN0IHVpbwkqYV91aW87CgkJa2F1dGhfY3JlZF90CWFfY3JlZDsKCX0gKi8gKmFw
 ID0gdjsKCXZub2RlX3QgKnZwID0gYXAtPmFfdnA7CglzdHJ1Y3QgdWlvICp1aW8gPSBhcC0+
 YV91aW87Cgl0bXBmc19ub2RlX3QgKm5vZGU7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChWT1Bf
 SVNMT0NLRUQodnApKTsKCUtBU1NFUlQodWlvLT51aW9fb2Zmc2V0ID09IDApOwoJS0FTU0VS
 VCh2cC0+dl90eXBlID09IFZMTkspOwoKCW5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZwKTsK
 CWVycm9yID0gdWlvbW92ZShub2RlLT50bl9zcGVjLnRuX2xuay50bl9saW5rLAoJICAgIE1J
 Tihub2RlLT50bl9zaXplLCB1aW8tPnVpb19yZXNpZCksIHVpbyk7Cglub2RlLT50bl9zdGF0
 dXMgfD0gVE1QRlNfTk9ERV9BQ0NFU1NFRDsKCglyZXR1cm4gZXJyb3I7Cn0KCmludAp0bXBm
 c19pbmFjdGl2ZSh2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX2luYWN0aXZlX2FyZ3MgLyogewoJ
 CXN0cnVjdCB2bm9kZSAqYV92cDsKCQlib29sICphX3JlY3ljbGU7Cgl9ICovICphcCA9IHY7
 Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJdG1wZnNfbm9kZV90ICpub2RlOwoKCUtBU1NF
 UlQoVk9QX0lTTE9DS0VEKHZwKSk7CgoJbm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJ
 KmFwLT5hX3JlY3ljbGUgPSAobm9kZS0+dG5fbGlua3MgPT0gMCk7CglWT1BfVU5MT0NLKHZw
 LCAwKTsKCglyZXR1cm4gMDsKfQoKaW50CnRtcGZzX3JlY2xhaW0odm9pZCAqdikKewoJc3Ry
 dWN0IHZvcF9yZWNsYWltX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZSAqYV92cDsKCX0gKi8g
 KmFwID0gdjsKCXZub2RlX3QgKnZwID0gYXAtPmFfdnA7Cgl0bXBmc19tb3VudF90ICp0bXAg
 PSBWRlNfVE9fVE1QRlModnAtPnZfbW91bnQpOwoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBf
 VE9fVE1QRlNfTk9ERSh2cCk7Cglib29sIHJhY2luZzsKCgkvKiBEaXNhc3NvY2lhdGUgaW5v
 ZGUgZnJvbSB2bm9kZS4gKi8KCW11dGV4X2VudGVyKCZub2RlLT50bl92bG9jayk7Cglub2Rl
 LT50bl92bm9kZSA9IE5VTEw7Cgl2cC0+dl9kYXRhID0gTlVMTDsKCS8qIENoZWNrIGlmIHRt
 cGZzX3Zub2RlX2dldCgpIGlzIHJhY2luZyB3aXRoIHVzLiAqLwoJcmFjaW5nID0gVE1QRlNf
 Tk9ERV9SRUNMQUlNSU5HKG5vZGUpOwoJbXV0ZXhfZXhpdCgmbm9kZS0+dG5fdmxvY2spOwoK
 CS8qCgkgKiBJZiBpbm9kZSBpcyBub3QgcmVmZXJlbmNlZCwgaS5lLiBubyBsaW5rcywgdGhl
 biBkZXN0cm95IGl0LgoJICogTm90ZTogaWYgcmFjaW5nIC0gaW5vZGUgaXMgYWJvdXQgdG8g
 Z2V0IGEgbmV3IHZub2RlLCBsZWF2ZSBpdC4KCSAqLwoJaWYgKG5vZGUtPnRuX2xpbmtzID09
 IDAgJiYgIXJhY2luZykgewoJCXRtcGZzX2ZyZWVfbm9kZSh0bXAsIG5vZGUpOwoJfQoJcmV0
 dXJuIDA7Cn0KCmludAp0bXBmc19wYXRoY29uZih2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX3Bh
 dGhjb25mX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkqYV92cDsKCQlpbnQJCWFfbmFtZTsK
 CQlyZWdpc3Rlcl90CSphX3JldHZhbDsKCX0gKi8gKmFwID0gdjsKCWNvbnN0IGludCBuYW1l
 ID0gYXAtPmFfbmFtZTsKCXJlZ2lzdGVyX3QgKnJldHZhbCA9IGFwLT5hX3JldHZhbDsKCWlu
 dCBlcnJvciA9IDA7CgoJc3dpdGNoIChuYW1lKSB7CgljYXNlIF9QQ19MSU5LX01BWDoKCQkq
 cmV0dmFsID0gTElOS19NQVg7CgkJYnJlYWs7CgljYXNlIF9QQ19OQU1FX01BWDoKCQkqcmV0
 dmFsID0gVE1QRlNfTUFYTkFNTEVOOwoJCWJyZWFrOwoJY2FzZSBfUENfUEFUSF9NQVg6CgkJ
 KnJldHZhbCA9IFBBVEhfTUFYOwoJCWJyZWFrOwoJY2FzZSBfUENfUElQRV9CVUY6CgkJKnJl
 dHZhbCA9IFBJUEVfQlVGOwoJCWJyZWFrOwoJY2FzZSBfUENfQ0hPV05fUkVTVFJJQ1RFRDoK
 CQkqcmV0dmFsID0gMTsKCQlicmVhazsKCWNhc2UgX1BDX05PX1RSVU5DOgoJCSpyZXR2YWwg
 PSAxOwoJCWJyZWFrOwoJY2FzZSBfUENfU1lOQ19JTzoKCQkqcmV0dmFsID0gMTsKCQlicmVh
 azsKCWNhc2UgX1BDX0ZJTEVTSVpFQklUUzoKCQkqcmV0dmFsID0gc2l6ZW9mKG9mZl90KSAq
 IENIQVJfQklUOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQllcnJvciA9IEVJTlZBTDsKCX0KCXJl
 dHVybiBlcnJvcjsKfQoKaW50CnRtcGZzX2FkdmxvY2sodm9pZCAqdikKewoJc3RydWN0IHZv
 cF9hZHZsb2NrX2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkqYV92cDsKCQl2b2lkICoJCWFf
 aWQ7CgkJaW50CQlhX29wOwoJCXN0cnVjdCBmbG9jawkqYV9mbDsKCQlpbnQJCWFfZmxhZ3M7
 Cgl9ICovICphcCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJdG1wZnNfbm9kZV90
 ICpub2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7CgoJcmV0dXJuIGxmX2FkdmxvY2sodiwg
 Jm5vZGUtPnRuX2xvY2tmLCBub2RlLT50bl9zaXplKTsKfQoKaW50CnRtcGZzX2dldHBhZ2Vz
 KHZvaWQgKnYpCnsKCXN0cnVjdCB2b3BfZ2V0cGFnZXNfYXJncyAvKiB7CgkJc3RydWN0IHZu
 b2RlICphX3ZwOwoJCXZvZmZfdCBhX29mZnNldDsKCQlzdHJ1Y3Qgdm1fcGFnZSAqKmFfbTsK
 CQlpbnQgKmFfY291bnQ7CgkJaW50IGFfY2VudGVyaWR4OwoJCXZtX3Byb3RfdCBhX2FjY2Vz
 c190eXBlOwoJCWludCBhX2FkdmljZTsKCQlpbnQgYV9mbGFnczsKCX0gKi8gKiBjb25zdCBh
 cCA9IHY7Cgl2bm9kZV90ICp2cCA9IGFwLT5hX3ZwOwoJY29uc3Qgdm9mZl90IG9mZnNldCA9
 IGFwLT5hX29mZnNldDsKCXN0cnVjdCB2bV9wYWdlICoqcGdzID0gYXAtPmFfbTsKCWNvbnN0
 IGludCBjZW50ZXJpZHggPSBhcC0+YV9jZW50ZXJpZHg7Cgljb25zdCB2bV9wcm90X3QgYWNj
 ZXNzX3R5cGUgPSBhcC0+YV9hY2Nlc3NfdHlwZTsKCWNvbnN0IGludCBhZHZpY2UgPSBhcC0+
 YV9hZHZpY2U7Cgljb25zdCBpbnQgZmxhZ3MgPSBhcC0+YV9mbGFnczsKCWludCBlcnJvciwg
 bnBhZ2VzID0gKmFwLT5hX2NvdW50OwoJdG1wZnNfbm9kZV90ICpub2RlOwoJc3RydWN0IHV2
 bV9vYmplY3QgKnVvYmo7CgoJS0FTU0VSVCh2cC0+dl90eXBlID09IFZSRUcpOwoJS0FTU0VS
 VChtdXRleF9vd25lZCgmdnAtPnZfaW50ZXJsb2NrKSk7CgoJbm9kZSA9IFZQX1RPX1RNUEZT
 X05PREUodnApOwoJdW9iaiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgoJLyoK
 CSAqIEN1cnJlbnRseSwgUEdPX1BBU1RFT0YgaXMgbm90IHN1cHBvcnRlZC4KCSAqLwoJaWYg
 KHZwLT52X3NpemUgPD0gb2Zmc2V0ICsgKGNlbnRlcmlkeCA8PCBQQUdFX1NISUZUKSkgewoJ
 CWlmICgoZmxhZ3MgJiBQR09fTE9DS0VEKSA9PSAwKQoJCQltdXRleF9leGl0KCZ2cC0+dl9p
 bnRlcmxvY2spOwoJCXJldHVybiBFSU5WQUw7Cgl9CgoJaWYgKHZwLT52X3NpemUgPCBvZmZz
 ZXQgKyAobnBhZ2VzIDw8IFBBR0VfU0hJRlQpKSB7CgkJbnBhZ2VzID0gKHJvdW5kX3BhZ2Uo
 dnAtPnZfc2l6ZSkgLSBvZmZzZXQpID4+IFBBR0VfU0hJRlQ7Cgl9CgoJaWYgKChmbGFncyAm
 IFBHT19MT0NLRUQpICE9IDApCgkJcmV0dXJuIEVCVVNZOwoKCWlmICgoZmxhZ3MgJiBQR09f
 Tk9USU1FU1RBTVApID09IDApIHsKCQlpZiAoKHZwLT52X21vdW50LT5tbnRfZmxhZyAmIE1O
 VF9OT0FUSU1FKSA9PSAwKQoJCQlub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9BQ0NF
 U1NFRDsKCgkJaWYgKChhY2Nlc3NfdHlwZSAmIFZNX1BST1RfV1JJVEUpICE9IDApIHsKCQkJ
 bm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfTU9ESUZJRUQ7CgkJCWlmICh2cC0+dl9t
 b3VudC0+bW50X2ZsYWcgJiBNTlRfUkVMQVRJTUUpCgkJCQlub2RlLT50bl9zdGF0dXMgfD0g
 VE1QRlNfTk9ERV9BQ0NFU1NFRDsKCQl9Cgl9CgoJLyoKCSAqIEludm9rZSB0aGUgcGFnZXIu
 CgkgKgoJICogQ2xlYW4gdGhlIGFycmF5IG9mIHBhZ2VzIGJlZm9yZS4gIFhYWDogUFIvMzIx
 NjYKCSAqIE5vdGUgdGhhdCB2bm9kZSBsb2NrIGlzIHNoYXJlZCB3aXRoIHVuZGVybHlpbmcg
 VVZNIG9iamVjdC4KCSAqLwojaWYgMSAvLyBuZWVkZWQgaW4gNS4xIC4uLgoJbXV0ZXhfZXhp
 dCgmdnAtPnZfaW50ZXJsb2NrKTsKI2VuZGlmCglpZiAocGdzKSB7CgkJbWVtc2V0KHBncywg
 MCwgc2l6ZW9mKHN0cnVjdCB2bV9wYWdlcyAqKSAqIG5wYWdlcyk7Cgl9CiNpZiAwIC8vIG5v
 dCBpbiBpbiA1LjEgLi4uCglLQVNTRVJUKCZ2cC0+dl9pbnRlcmxvY2sgPT0gJnVvYmotPnZt
 b2JqbG9jayk7CiNlbHNlCgltdXRleF9lbnRlcigmdW9iai0+dm1vYmpsb2NrKTsKI2VuZGlm
 CgoJZXJyb3IgPSAoKnVvYmotPnBnb3BzLT5wZ29fZ2V0KSh1b2JqLCBvZmZzZXQsIHBncywg
 Jm5wYWdlcywgY2VudGVyaWR4LAoJICAgIGFjY2Vzc190eXBlLCBhZHZpY2UsIGZsYWdzIHwg
 UEdPX0FMTFBBR0VTKTsKCiNpZiBkZWZpbmVkKERFQlVHKQoJaWYgKCFlcnJvciAmJiBwZ3Mp
 IHsKCQlmb3IgKGludCBpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CgkJCUtBU1NFUlQocGdz
 W2ldICE9IE5VTEwpOwoJCX0KCX0KI2VuZGlmCglyZXR1cm4gZXJyb3I7Cn0KCmludAp0bXBm
 c19wdXRwYWdlcyh2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX3B1dHBhZ2VzX2FyZ3MgLyogewoJ
 CXN0cnVjdCB2bm9kZSAqYV92cDsKCQl2b2ZmX3QgYV9vZmZsbzsKCQl2b2ZmX3QgYV9vZmZo
 aTsKCQlpbnQgYV9mbGFnczsKCX0gKi8gKiBjb25zdCBhcCA9IHY7Cgl2bm9kZV90ICp2cCA9
 IGFwLT5hX3ZwOwoJY29uc3Qgdm9mZl90IG9mZmxvID0gYXAtPmFfb2ZmbG87Cgljb25zdCB2
 b2ZmX3Qgb2ZmaGkgPSBhcC0+YV9vZmZoaTsKCWNvbnN0IGludCBmbGFncyA9IGFwLT5hX2Zs
 YWdzOwoJdG1wZnNfbm9kZV90ICpub2RlOwoJc3RydWN0IHV2bV9vYmplY3QgKnVvYmo7Cglp
 bnQgZXJyb3I7CgoJS0FTU0VSVChtdXRleF9vd25lZCgmdnAtPnZfaW50ZXJsb2NrKSk7CgoJ
 aWYgKHZwLT52X3R5cGUgIT0gVlJFRykgewoJCW11dGV4X2V4aXQoJnZwLT52X2ludGVybG9j
 ayk7CgkJcmV0dXJuIDA7Cgl9CgoJbm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJdW9i
 aiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgojaWYgMCAvLyBub3QgaW4gaW4g
 NS4xIC4uLgoJS0FTU0VSVCgmdnAtPnZfaW50ZXJsb2NrID09ICZ1b2JqLT52bW9iamxvY2sp
 OwojZWxzZQoJbXV0ZXhfZXhpdCgmdnAtPnZfaW50ZXJsb2NrKTsKCW11dGV4X2VudGVyKCZ1
 b2JqLT52bW9iamxvY2spOwojZW5kaWYKCWVycm9yID0gKCp1b2JqLT5wZ29wcy0+cGdvX3B1
 dCkodW9iaiwgb2ZmbG8sIG9mZmhpLCBmbGFncyk7CgoJLyogWFhYIG10aW1lICovCgoJcmV0
 dXJuIGVycm9yOwp9CgppbnQKdG1wZnNfd2hpdGVvdXQodm9pZCAqdikKewoJc3RydWN0IHZv
 cF93aGl0ZW91dF9hcmdzIC8qIHsKCQlzdHJ1Y3Qgdm5vZGUJCSphX2R2cDsKCQlzdHJ1Y3Qg
 Y29tcG9uZW50bmFtZQkqYV9jbnA7CgkJaW50CQkJYV9mbGFnczsKCX0gKi8gKmFwID0gdjsK
 CXZub2RlX3QgKmR2cCA9IGFwLT5hX2R2cDsKCXN0cnVjdCBjb21wb25lbnRuYW1lICpjbnAg
 PSBhcC0+YV9jbnA7Cgljb25zdCBpbnQgZmxhZ3MgPSBhcC0+YV9mbGFnczsKCXRtcGZzX21v
 dW50X3QgKnRtcCA9IFZGU19UT19UTVBGUyhkdnAtPnZfbW91bnQpOwoJdG1wZnNfZGlyZW50
 X3QgKmRlOwoJaW50IGVycm9yOwoKCXN3aXRjaCAoZmxhZ3MpIHsKCWNhc2UgTE9PS1VQOgoJ
 CWJyZWFrOwoJY2FzZSBDUkVBVEU6CgkJZXJyb3IgPSB0bXBmc19hbGxvY19kaXJlbnQodG1w
 LCBjbnAtPmNuX25hbWVwdHIsCgkJICAgIGNucC0+Y25fbmFtZWxlbiwgJmRlKTsKCQlpZiAo
 ZXJyb3IpCgkJCXJldHVybiBlcnJvcjsKCQl0bXBmc19kaXJfYXR0YWNoKGR2cCwgZGUsIFRN
 UEZTX05PREVfV0hJVEVPVVQpOwoJCWJyZWFrOwoJY2FzZSBERUxFVEU6CgkJY25wLT5jbl9m
 bGFncyAmPSB+RE9XSElURU9VVDsgLyogd2hlbiBpbiBkb3VidCwgY2FyZ28gY3VsdCAqLwoJ
 CWRlID0gdG1wZnNfZGlyX2xvb2t1cChWUF9UT19UTVBGU19ESVIoZHZwKSwgY25wKTsKCQlp
 ZiAoZGUgPT0gTlVMTCkKCQkJcmV0dXJuIEVOT0VOVDsKCQl0bXBmc19kaXJfZGV0YWNoKGR2
 cCwgZGUpOwoJCXRtcGZzX2ZyZWVfZGlyZW50KHRtcCwgZGUpOwoJCWJyZWFrOwoJfQoJcmV0
 dXJuIDA7Cn0KCmludAp0bXBmc19wcmludCh2b2lkICp2KQp7CglzdHJ1Y3Qgdm9wX3ByaW50
 X2FyZ3MgLyogewoJCXN0cnVjdCB2bm9kZQkqYV92cDsKCX0gKi8gKmFwID0gdjsKCXZub2Rl
 X3QgKnZwID0gYXAtPmFfdnA7Cgl0bXBmc19ub2RlX3QgKm5vZGUgPSBWUF9UT19UTVBGU19O
 T0RFKHZwKTsKCglwcmludGYoInRhZyBWVF9UTVBGUywgdG1wZnNfbm9kZSAlcCwgZmxhZ3Mg
 MHgleCwgbGlua3MgJWRcbiIKCSAgICAiXHRtb2RlIDAlbywgb3duZXIgJWQsIGdyb3VwICVk
 LCBzaXplICUiIFBSSWRNQVggIiwgc3RhdHVzIDB4JXgiLAoJICAgIG5vZGUsIG5vZGUtPnRu
 X2ZsYWdzLCBub2RlLT50bl9saW5rcywgbm9kZS0+dG5fbW9kZSwgbm9kZS0+dG5fdWlkLAoJ
 ICAgIG5vZGUtPnRuX2dpZCwgKHVpbnRtYXhfdClub2RlLT50bl9zaXplLCBub2RlLT50bl9z
 dGF0dXMpOwoJaWYgKHZwLT52X3R5cGUgPT0gVkZJRk8pIHsKCQlWT0NBTEwoZmlmb192bm9k
 ZW9wX3AsIFZPRkZTRVQodm9wX3ByaW50KSwgdik7Cgl9CglwcmludGYoIlxuIik7CglyZXR1
 cm4gMDsKfQoKLy8gbG9jay91bmxvY2sgdmVyc2lvbiBmcm9tIGFjdHVhbCBnZW5mcyAtIGRv
 IG5vdCB1c2UgbG9ja21nciBhbnltb3JlIC4uLgoKI2lmbmRlZiBGU1RSQU5TX1NIQVJFRAov
 LyBoYWNrIGZvciBsaWIgcnVtcCAtIGZ0cmFucyBzdHVmZiBub3Qga25vd24gdGhlcmUgLSBm
 YWxsIGJhY2sgdG8gb2xkIHZlcnNpb24gLi4uLgppbnQgdG1wZnNfbG9jayh2b2lkICp2KSB7
 IHJldHVybiBnZW5mc19sb2NrKHYpOyB9CmludCB0bXBmc191bmxvY2sodm9pZCAqdikgeyBy
 ZXR1cm4gZ2VuZnNfdW5sb2NrKHYpOyB9CiNlbHNlCmludCAgICAgCnRtcGZzX2xvY2sodm9p
 ZCAqdikKeyAKICAgICAgICBzdHJ1Y3Qgdm9wX2xvY2tfYXJncyAvKiB7IAogICAgICAgICAg
 ICAgICAgc3RydWN0IHZub2RlICphX3ZwOwogICAgICAgICAgICAgICAgaW50IGFfZmxhZ3M7
 CiAgICAgICAgfSAqLyAqYXAgPSB2OwogICAgICAgIHN0cnVjdCB2bm9kZSAqdnAgPSBhcC0+
 YV92cDsKICAgICAgICBpbnQgZmxhZ3MgPSBhcC0+YV9mbGFnczsKICAgICAgICBrcndfdCBv
 cDsKIAovLyBhZGRlZCB0byBzdXBwb3J0IG9sZCBpbnRlcmxvY2stc2VtYW50aWNzCiAgICAg
 ICAgaWYgKChmbGFncyAmIExLX0lOVEVSTE9DSykgIT0gMCkgewogICAgICAgICAgICAgICAg
 ZmxhZ3MgJj0gfkxLX0lOVEVSTE9DSzsKICAgICAgICAgICAgICAgIG11dGV4X2V4aXQoJnZw
 LT52X2ludGVybG9jayk7CiAgICAgICAgfQogCiAgICAgICAgS0FTU0VSVCgoZmxhZ3MgJiB+
 KExLX0VYQ0xVU0lWRSB8IExLX1NIQVJFRCB8IExLX05PV0FJVCkpID09IDApOyAKIAogICAg
 ICAgIG9wID0gKChmbGFncyAmIExLX0VYQ0xVU0lWRSkgIT0gMCA/IFJXX1dSSVRFUiA6IFJX
 X1JFQURFUik7CiAgICAgICAgaWYgKChmbGFncyAmIExLX05PV0FJVCkgIT0gMCkgewogICAg
 ICAgICAgICAgICAgaWYgKGZzdHJhbnNfc3RhcnRfbm93YWl0KHZwLT52X21vdW50LCBGU1RS
 QU5TX1NIQVJFRCkpIAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRUJVU1k7CiAg
 ICAgICAgICAgICAgICBpZiAoISByd190cnllbnRlcigmdnAtPnZfbG9jay52bF9sb2NrLCBv
 cCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnN0cmFuc19kb25lKHZwLT52X21vdW50
 KTsgCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFQlVTWTsKICAgICAgICAgICAg
 ICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KIAogICAgICAgIGZz
 dHJhbnNfc3RhcnQodnAtPnZfbW91bnQsIEZTVFJBTlNfU0hBUkVEKTsKICAgICAgICByd19l
 bnRlcigmdnAtPnZfbG9jay52bF9sb2NrLCBvcCk7CiAgIAogICAgICAgIHJldHVybiAwOwp9
 CgovKgogKiBVbmxvY2sgdGhlIG5vZGUuCiAqLwppbnQKdG1wZnNfdW5sb2NrKHZvaWQgKnYp
 IAp7CiAgICAgICAgc3RydWN0IHZvcF91bmxvY2tfYXJncyAvKiB7CiAgICAgICAgICAgICAg
 ICBzdHJ1Y3Qgdm5vZGUgKmFfdnA7CiAgICAgICAgfSAqLyAqYXAgPSB2OwogICAgICAgIHN0
 cnVjdCB2bm9kZSAqdnAgPSBhcC0+YV92cDsKCiAgICAgICAgcndfZXhpdCgmdnAtPnZfbG9j
 ay52bF9sb2NrKTsKICAgICAgICBmc3RyYW5zX2RvbmUodnAtPnZfbW91bnQpOwogICAgICAg
 IHJldHVybiAwOwp9CiNlbmRpZgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMv
 c3lzL2ZzL3RtcGZzL3RtcGZzX3N1YnIuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDQ0NAAwMDAwMDAwADAwMDAwMDAA
 MDAwMDAwNzY3NjQAMTIwMjYwMjI3NTUAMDAxNzY0NQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAC8qCSROZXRCU0Q6IHRtcGZzX3N1YnIuYyx2IDEuNzIgMjAxMS8wNS8yOSAy
 Mjo0MzozMiBybWluZCBFeHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEg
 VGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAq
 CiAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8g
 VGhlIE5ldEJTRCBGb3VuZGF0aW9uCiAqIGJ5IEp1bGlvIE0uIE1lcmlubyBWaWRhbCwgZGV2
 ZWxvcGVkIGFzIHBhcnQgb2YgR29vZ2xlJ3MgU3VtbWVyIG9mIENvZGUKICogMjAwNSBwcm9n
 cmFtLCBhbmQgYnkgTWluZGF1Z2FzIFJhc2l1a2V2aWNpdXMuCiAqCiAqIFJlZGlzdHJpYnV0
 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
 dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
 bG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25zIG9m
 IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90
 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
 bWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
 Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
 aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3Vt
 ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
 cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5FVEJT
 RCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKICogYGBBUyBJUycnIEFORCBB
 TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
 SU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
 WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
 RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRPUlMK
 ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
 Q0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
 RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElUVVRFIEdP
 T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
 SU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
 WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
 VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKICogQVJJ
 U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
 SUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoK
 LyoKICogRWZmaWNpZW50IG1lbW9yeSBmaWxlIHN5c3RlbTogaW50ZXJmYWNlcyBmb3IgaW5v
 ZGUgYW5kIGRpcmVjdG9yeSBlbnRyeQogKiBjb25zdHJ1Y3Rpb24sIGRlc3RydWN0aW9uIGFu
 ZCBtYW5pcHVsYXRpb24uCiAqCiAqIFJlZmVyZW5jZSBjb3VudGluZwogKgogKglUaGUgbGlu
 ayBjb3VudCBvZiBpbm9kZSAodG1wZnNfbm9kZV90Ojp0bl9saW5rcykgaXMgdXNlZCBhcyBh
 CiAqCXJlZmVyZW5jZSBjb3VudGVyLiAgSG93ZXZlciwgaXQgaGFzIHNsaWdodGx5IGRpZmZl
 cmVudCBzZW1hbnRpY3MuCiAqCiAqCUZvciBkaXJlY3RvcmllcyAtIGxpbmsgY291bnQgcmVw
 cmVzZW50cyBkaXJlY3RvcnkgZW50cmllcywgd2hpY2gKICoJcmVmZXIgdG8gdGhlIGRpcmVj
 dG9yaWVzLiAgSW4gb3RoZXIgd29yZHMsIGl0IHJlcHJlc2VudHMgdGhlIGNvdW50CiAqCW9m
 IHN1Yi1kaXJlY3Rvcmllcy4gIEl0IGFsc28gdGFrZXMgaW50byBhY2NvdW50IHRoZSB2aXJ0
 dWFsICcuJwogKgllbnRyeSAod2hpY2ggaGFzIG5vIHJlYWwgZW50cnkgaW4gdGhlIGxpc3Qp
 LiAgRm9yIGZpbGVzIC0gbGluayBjb3VudAogKglyZXByZXNlbnRzIHRoZSBoYXJkIGxpbmtz
 LiAgU2luY2Ugb25seSBlbXB0eSBkaXJlY3RvcmllcyBjYW4gYmUKICoJcmVtb3ZlZCAtIGxp
 bmsgY291bnQgYWxpZ25zIHRoZSByZWZlcmVuY2UgY291bnRpbmcgcmVxdWlyZW1lbnRzCiAq
 CWVub3VnaC4gIE5vdGU6IHRvIGNoZWNrIHdoZXRoZXIgZGlyZWN0b3J5IGlzIG5vdCBlbXB0
 eSwgdGhlIGlub2RlCiAqCXNpemUgKHRtcGZzX25vZGVfdDo6dG5fc2l6ZSkgY2FuIGJlIHVz
 ZWQuCiAqCiAqCVRoZSBpbm9kZSBpdHNlbGYsIGFzIGFuIG9iamVjdCwgZ2F0aGVycyBpdHMg
 Zmlyc3QgcmVmZXJlbmNlIHdoZW4KICoJZGlyZWN0b3J5IGVudHJ5IGlzIGF0dGFjaGVkIHZp
 YSB0bXBmc19kaXJfYXR0YWNoKDkpLiAgRm9yIGluc3RhbmNlLAogKglhZnRlciByZWd1bGFy
 IHRtcGZzX2NyZWF0ZSgpLCBhIGZpbGUgd291bGQgaGF2ZSBhIGxpbmsgY291bnQgb2YgMSwK
 ICoJd2hpbGUgZGlyZWN0b3J5IGFmdGVyIHRtcGZzX21rZGlyKCkgd291bGQgaGF2ZSAyIChk
 dWUgdG8gJy4nKS4KICoKICogUmVjbGFtYXRpb24KICoKICoJSXQgc2hvdWxkIGJlIG5vdGVk
 IHRoYXQgdG1wZnMgaW5vZGVzIHJlbHkgb24gYSBjb21iaW5hdGlvbiBvZiB2bm9kZQogKgly
 ZWZlcmVuY2UgY291bnRpbmcgYW5kIGxpbmsgY291bnRpbmcuICBUaGF0IGlzLCBhbiBpbm9k
 ZSBjYW4gb25seSBiZQogKglkZXN0cm95ZWQgaWYgaXRzIGFzc29jaWF0ZWQgdm5vZGUgaXMg
 aW5hY3RpdmUuICBUaGUgZGVzdHJ1Y3Rpb24gaXMKICoJZG9uZSBvbiB2bm9kZSByZWNsYW1h
 dGlvbiBpLmUuIHRtcGZzX3JlY2xhaW0oKS4gIEl0IHNob3VsZCBiZSBub3RlZAogKgl0aGF0
 IHRtcGZzX25vZGVfdDo6dG5fbGlua3MgYmVpbmcgMCBpcyBhIGRlc3RydWN0aW9uIGNyaXRl
 cmlvbi4gCiAqCiAqCUlmIGFuIGlub2RlIGhhcyByZWZlcmVuY2VzIHdpdGhpbiB0aGUgZmls
 ZSBzeXN0ZW0gKHRuX2xpbmtzID4gMCkgYW5kCiAqCWl0cyBpbmFjdGl2ZSB2bm9kZSBnZXRz
 IHJlY2xhaW1lZC9yZWN5Y2xlZCAtIHRoZW4gdGhlIGFzc29jaWF0aW9uIGlzCiAqCWJyb2tl
 biBpbiB0bXBmc19yZWNsYWltKCkuICBJbiBzdWNoIGNhc2UsIGFuIGlub2RlIHdpbGwgYWx3
 YXlzIHBhc3MKICoJdG1wZnNfbG9va3VwKCkgYW5kIHRodXMgdG1wZnNfdm5vZGVfZ2V0KCkg
 dG8gYXNzb2NpYXRlIGEgbmV3IHZub2RlLgogKgogKiBMb2NrIG9yZGVyCiAqCiAqCXRtcGZz
 X25vZGVfdDo6dG5fdmxvY2sgLT4KICoJCXZub2RlX3Q6OnZfdmxvY2sgLT4KICoJCQl2bm9k
 ZV90Ojp2X2ludGVybG9jawogKi8KCiNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KX19LRVJORUxf
 UkNTSUQoMCwgIiROZXRCU0Q6IHRtcGZzX3N1YnIuYyx2IDEuNzIgMjAxMS8wNS8yOSAyMjo0
 MzozMiBybWluZCBFeHAgJCIpOwoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8
 c3lzL2RpcmVudC5oPgojaW5jbHVkZSA8c3lzL2V2ZW50Lmg+CiNpbmNsdWRlIDxzeXMva21l
 bS5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxzeXMvbmFtZWkuaD4KI2lu
 Y2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lz
 L3N5c3RtLmg+CiNpbmNsdWRlIDxzeXMvdm5vZGUuaD4KI2luY2x1ZGUgPHN5cy9rYXV0aC5o
 PgojaW5jbHVkZSA8c3lzL2F0b21pYy5oPgoKI2luY2x1ZGUgPHV2bS91dm0uaD4KCiNpbmNs
 dWRlIDxtaXNjZnMvc3BlY2ZzL3NwZWNkZXYuaD4KI2lmIDAgLy8gbm90IG9uIDUuMSAuLi4u
 LgojaW5jbHVkZSA8bWlzY2ZzL2dlbmZzL2dlbmZzLmg+CiNlbHNlCnN0YXRpYyBpbnQKZ2Vu
 ZnNfY2FuX2NodGltZXModm5vZGVfdCAqdnAsIHVfaW50IHZhZmxhZ3MsIHVpZF90IG93bmVy
 X3VpZCwga2F1dGhfY3JlZF90IGNyZWQpCnsKCWludCBlcnJvcjsKCgkvKiBNdXN0IGJlIG93
 bmVyLCBvci4uLiAqLwoJaWYgKGthdXRoX2NyZWRfZ2V0ZXVpZChjcmVkKSA9PSBvd25lcl91
 aWQpIHJldHVybiAoMCk7CgoJLyogc2V0IHRoZSB0aW1lcyB0byB0aGUgY3VycmVudCB0aW1l
 LCBhbmQuLi4gKi8KCWlmICgodmFmbGFncyAmIFZBX1VUSU1FU19OVUxMKSA9PSAwKSByZXR1
 cm4gKEVQRVJNKTsKCgkvKiBoYXZlIHdyaXRlIGFjY2Vzcy4gKi8KCWVycm9yID0gVk9QX0FD
 Q0VTUyh2cCwgVldSSVRFLCBjcmVkKTsKCWlmIChlcnJvcikgcmV0dXJuIChlcnJvcik7CgoJ
 cmV0dXJuICgwKTsKfQoKc3RhdGljIGludAkKZ2VuZnNfY2FuX2Nob3duKGthdXRoX2NyZWRf
 dCBjcmVkLCB1aWRfdCBjdXJfdWlkLCBnaWRfdCBjdXJfZ2lkLCB1aWRfdCBuZXdfdWlkLCBn
 aWRfdCBuZXdfZ2lkKQp7CglpbnQgZXJyb3IsIGlzbWVtYmVyOwoKI2lmIDEgLy8gd29ya2Fy
 b3VuZCBmb3IgNS4xLnggLi4KLy8gcm9vdCBtYXkgZG8gaXQgYWxsIHRoZSB0aW1lIC0gaGFj
 ayB0byBnZXQgcmlkIG9mIGluc3RhbGwtcm9vdC10bXBmcyBwcm9ibGVtcwogIGlmIChrYXV0
 aF9jcmVkX2dldGV1aWQoY3JlZCkgPT0gKHVpZF90KTApIHJldHVybiAwOwojZW5kaWYKCS8q
 CgkgKiBZb3UgY2FuIG9ubHkgY2hhbmdlIG93bmVyc2hpcCBvZiBhIGZpbGUgaWY6CgkgKiBZ
 b3Ugb3duIHRoZSBmaWxlIGFuZC4uLgoJICovCglpZiAoa2F1dGhfY3JlZF9nZXRldWlkKGNy
 ZWQpID09IGN1cl91aWQpIHsKCQkvKgoJCSAqIFlvdSBkb24ndCB0cnkgdG8gY2hhbmdlIG93
 bmVyc2hpcCwgYW5kLi4uCgkJICovCgkJaWYgKG5ld191aWQgIT0gY3VyX3VpZCkgcmV0dXJu
 IChFUEVSTSk7CgoJCS8qCgkJICogWW91IGRvbid0IHRyeSB0byBjaGFuZ2UgZ3JvdXAgKG5v
 LW9wKSwgb3IuLi4KCQkgKi8KCQlpZiAobmV3X2dpZCA9PSBjdXJfZ2lkKSByZXR1cm4gKDAp
 OwoKCQkvKgoJCSAqIFlvdXIgZWZmZWN0aXZlIGdpZCBpcyB0aGUgbmV3IGdpZCwgb3IuLi4K
 CQkgKi8KCQlpZiAoa2F1dGhfY3JlZF9nZXRlZ2lkKGNyZWQpID09IG5ld19naWQpIHJldHVy
 biAoMCk7CgoJCS8qCgkJICogVGhlIG5ldyBnaWQgaXMgb25lIHlvdSdyZSBhIG1lbWJlciBv
 Zi4KCQkgKi8KCQlpc21lbWJlciA9IDA7CgkJZXJyb3IgPSBrYXV0aF9jcmVkX2lzbWVtYmVy
 X2dpZChjcmVkLCBuZXdfZ2lkLCAmaXNtZW1iZXIpOwoJCWlmICghZXJyb3IgJiYgaXNtZW1i
 ZXIpIHJldHVybiAoMCk7Cgl9CgoJcmV0dXJuIChFUEVSTSk7Cn0KCnN0YXRpYyBpbnQKZ2Vu
 ZnNfY2FuX2NobW9kKGVudW0gdnR5cGUgdHlwZSwga2F1dGhfY3JlZF90IGNyZWQsIHVpZF90
 IGN1cl91aWQsCiAgICBnaWRfdCBjdXJfZ2lkLCBtb2RlX3QgbmV3X21vZGUpCnsKCWludCBl
 cnJvcjsKCiNpZiAxIC8vIHdvcmthcm91bmQgZm9yIDUuMS54IC4uCi8vIHJvb3QgbWF5IGRv
 IGl0IGFsbCB0aGUgdGltZSAuLi4KICBpZiAoa2F1dGhfY3JlZF9nZXRldWlkKGNyZWQpID09
 ICh1aWRfdCkwKSByZXR1cm4gMDsKI2VuZGlmCgkvKiBUaGUgdXNlciBtdXN0IG93biB0aGUg
 ZmlsZS4gKi8KCWlmIChrYXV0aF9jcmVkX2dldGV1aWQoY3JlZCkgIT0gY3VyX3VpZCkgcmV0
 dXJuIChFUEVSTSk7CgoJLyoKCSAqIFVucHJpdmlsZWdlZCB1c2VycyBjYW4ndCBzZXQgdGhl
 IHN0aWNreSBiaXQgb24gZmlsZXMuCgkgKi8KCWlmICgodHlwZSAhPSBWRElSKSAmJiAobmV3
 X21vZGUgJiBTX0lTVFhUKSkgcmV0dXJuIChFRlRZUEUpOwoKCS8qCgkgKiBJZiB0aGUgaW52
 b2tlciBpcyB0cnlpbmcgdG8gc2V0IHRoZSBTR0lEIGJpdCBvbiB0aGUgZmlsZSwKCSAqIGNo
 ZWNrIGdyb3VwIG1lbWJlcnNoaXAuCgkgKi8KCWlmIChuZXdfbW9kZSAmIFNfSVNHSUQpIHsK
 CQlpbnQgaXNtZW1iZXI7CgoJCWVycm9yID0ga2F1dGhfY3JlZF9pc21lbWJlcl9naWQoY3Jl
 ZCwgY3VyX2dpZCwgJmlzbWVtYmVyKTsKCQlpZiAoZXJyb3IgfHwgIWlzbWVtYmVyKSByZXR1
 cm4gKEVQRVJNKTsKCX0KCglyZXR1cm4gKDApOwp9CgojZW5kaWYKI2luY2x1ZGUgPGZzL3Rt
 cGZzL3RtcGZzLmg+CiNpbmNsdWRlIDxmcy90bXBmcy90bXBmc19maWZvb3BzLmg+CiNpbmNs
 dWRlIDxmcy90bXBmcy90bXBmc19zcGVjb3BzLmg+CiNpbmNsdWRlIDxmcy90bXBmcy90bXBm
 c192bm9wcy5oPgoKI2lmIDEKaW50IGthdXRoX2F1dGhvcml6ZV92bm9kZShrYXV0aF9jcmVk
 X3QsIGthdXRoX2FjdGlvbl90LCBzdHJ1Y3Qgdm5vZGUqLCBzdHJ1Y3Qgdm5vZGUqLCBpbnQp
 OwoKLy8gc29tZSBkdW1teSBkZWZpbml0aW9ucwojZGVmaW5lIEtBVVRIX1ZOT0RFX1dSSVRF
 X0ZMQUdTICAgICAgMAojZGVmaW5lIEtBVVRIX1ZOT0RFX0hBU19TWVNGTEFHUyAgICAgMAoj
 ZGVmaW5lIEtBVVRIX1ZOT0RFX0NIQU5HRV9PV05FUlNISVAgMAojZGVmaW5lIEtBVVRIX1ZO
 T0RFX1dSSVRFX1NFQ1VSSVRZICAgMAojZGVmaW5lIEtBVVRIX1ZOT0RFX1dSSVRFX1RJTUVT
 ICAgICAgMAovLyBzb21lIGR1bW15IGRlZmluaXRpbm9zIHdpdGggcmVhbCB2YWx1ZXMsIGJl
 Y2F1c2UgdGhleSBhcmUgY2hlY2tlZCBoZXJlIGFnYWluIC4uLgojZGVmaW5lIEtBVVRIX1ZO
 T0RFX1dSSVRFX1NZU0ZMQUdTICAgMQojZW5kaWYKCi8qCiAqIHRtcGZzX2FsbG9jX25vZGU6
 IGFsbG9jYXRlIGEgbmV3IGlub2RlIG9mIGEgc3BlY2lmaWVkIHR5cGUgYW5kCiAqIGluc2Vy
 dCBpdCBpbnRvIHRoZSBsaXN0IG9mIHNwZWNpZmllZCBtb3VudCBwb2ludC4KICovCmludAp0
 bXBmc19hbGxvY19ub2RlKHRtcGZzX21vdW50X3QgKnRtcCwgZW51bSB2dHlwZSB0eXBlLCB1
 aWRfdCB1aWQsIGdpZF90IGdpZCwKICAgIG1vZGVfdCBtb2RlLCBjaGFyICp0YXJnZXQsIGRl
 dl90IHJkZXYsIHRtcGZzX25vZGVfdCAqKm5vZGUpCnsKCXRtcGZzX25vZGVfdCAqbm5vZGU7
 CgoJbm5vZGUgPSB0bXBmc19ub2RlX2dldCh0bXApOwoJaWYgKG5ub2RlID09IE5VTEwpIHsK
 CQlyZXR1cm4gRU5PU1BDOwoJfQoKCS8qIEluaXRpYWxseSwgbm8gcmVmZXJlbmNlcyBhbmQg
 bm8gYXNzb2NpYXRpb25zLiAqLwoJbm5vZGUtPnRuX2xpbmtzID0gMDsKCW5ub2RlLT50bl92
 bm9kZSA9IE5VTEw7Cglubm9kZS0+dG5fZGlyZW50X2hpbnQgPSBOVUxMOwoKCS8qCgkgKiBY
 WFggV2hlcmUgdGhlIHBvb2wgaXMgYmFja2VkIGJ5IGEgbWFwIGxhcmdlciB0aGFuICg0R0Ig
 KgoJICogc2l6ZW9mKCpubm9kZSkpLCB0aGlzIG1heSBwcm9kdWNlIGR1cGxpY2F0ZSBpbm9k
 ZSBudW1iZXJzCgkgKiBmb3IgYXBwbGljYXRpb25zIHRoYXQgZG8gbm90IHVuZGVyc3RhbmQg
 NjQtYml0IGlub190LgoJICovCglubm9kZS0+dG5faWQgPSAoaW5vX3QpKCh1aW50cHRyX3Qp
 bm5vZGUgLyBzaXplb2YoKm5ub2RlKSk7Cglubm9kZS0+dG5fZ2VuID0gVE1QRlNfTk9ERV9H
 RU5fTUFTSyAmIGFyYzRyYW5kb20oKTsKCgkvKiBHZW5lcmljIGluaXRpYWxpemF0aW9uLiAq
 LwoJbm5vZGUtPnRuX3R5cGUgPSB0eXBlOwoJbm5vZGUtPnRuX3NpemUgPSAwOwoJbm5vZGUt
 PnRuX3N0YXR1cyA9IDA7Cglubm9kZS0+dG5fZmxhZ3MgPSAwOwoJbm5vZGUtPnRuX2xvY2tm
 ID0gTlVMTDsKCgl2ZnNfdGltZXN0YW1wKCZubm9kZS0+dG5fYXRpbWUpOwoJbm5vZGUtPnRu
 X2JpcnRodGltZSA9IG5ub2RlLT50bl9hdGltZTsKCW5ub2RlLT50bl9jdGltZSA9IG5ub2Rl
 LT50bl9hdGltZTsKCW5ub2RlLT50bl9tdGltZSA9IG5ub2RlLT50bl9hdGltZTsKCglLQVNT
 RVJUKHVpZCAhPSBWTk9WQUwgJiYgZ2lkICE9IFZOT1ZBTCAmJiBtb2RlICE9IFZOT1ZBTCk7
 Cglubm9kZS0+dG5fdWlkID0gdWlkOwoJbm5vZGUtPnRuX2dpZCA9IGdpZDsKCW5ub2RlLT50
 bl9tb2RlID0gbW9kZTsKCgkvKiBUeXBlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAqLwoJ
 c3dpdGNoIChubm9kZS0+dG5fdHlwZSkgewoJY2FzZSBWQkxLOgoJY2FzZSBWQ0hSOgoJCS8q
 IENoYXJhY3Rlci9ibG9jayBzcGVjaWFsIGRldmljZS4gKi8KCQlLQVNTRVJUKHJkZXYgIT0g
 Vk5PVkFMKTsKCQlubm9kZS0+dG5fc3BlYy50bl9kZXYudG5fcmRldiA9IHJkZXY7CgkJYnJl
 YWs7CgljYXNlIFZESVI6CgkJLyogRGlyZWN0b3J5LiAqLwoJCVRBSUxRX0lOSVQoJm5ub2Rl
 LT50bl9zcGVjLnRuX2Rpci50bl9kaXIpOwoJCW5ub2RlLT50bl9zcGVjLnRuX2Rpci50bl9w
 YXJlbnQgPSBOVUxMOwoJCW5ub2RlLT50bl9zcGVjLnRuX2Rpci50bl9yZWFkZGlyX2xhc3Ru
 ID0gMDsKCQlubm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9IE5VTEw7
 CgoJCS8qIEV4dHJhIGxpbmsgY291bnQgZm9yIHRoZSB2aXJ0dWFsICcuJyBlbnRyeS4gKi8K
 CQlubm9kZS0+dG5fbGlua3MrKzsKCQlicmVhazsKCWNhc2UgVkZJRk86CgljYXNlIFZTT0NL
 OgoJCWJyZWFrOwoJY2FzZSBWTE5LOgoJCS8qIFN5bWJvbGljIGxpbmsuICBUYXJnZXQgc3Bl
 Y2lmaWVzIHRoZSBmaWxlIG5hbWUuICovCgkJS0FTU0VSVCh0YXJnZXQgJiYgc3RybGVuKHRh
 cmdldCkgPCBNQVhQQVRITEVOKTsKCgkJbm5vZGUtPnRuX3NpemUgPSBzdHJsZW4odGFyZ2V0
 KTsKCQlpZiAobm5vZGUtPnRuX3NpemUgPT0gMCkgewoJCQlubm9kZS0+dG5fc3BlYy50bl9s
 bmsudG5fbGluayA9IE5VTEw7CgkJCWJyZWFrOwoJCX0KCQlubm9kZS0+dG5fc3BlYy50bl9s
 bmsudG5fbGluayA9CgkJICAgIHRtcGZzX3N0cm5hbWVfYWxsb2ModG1wLCBubm9kZS0+dG5f
 c2l6ZSk7CgkJaWYgKG5ub2RlLT50bl9zcGVjLnRuX2xuay50bl9saW5rID09IE5VTEwpIHsK
 CQkJdG1wZnNfbm9kZV9wdXQodG1wLCBubm9kZSk7CgkJCXJldHVybiBFTk9TUEM7CgkJfQoJ
 CW1lbWNweShubm9kZS0+dG5fc3BlYy50bl9sbmsudG5fbGluaywgdGFyZ2V0LCBubm9kZS0+
 dG5fc2l6ZSk7CgkJYnJlYWs7CgljYXNlIFZSRUc6CgkJLyogUmVndWxhciBmaWxlLiAgQ3Jl
 YXRlIGFuIHVuZGVybHlpbmcgVVZNIG9iamVjdC4gKi8KCQlubm9kZS0+dG5fc3BlYy50bl9y
 ZWcudG5fYW9iaiA9CgkJICAgIHVhb19jcmVhdGUoSU5UMzJfTUFYIC0gUEFHRV9TSVpFLCAw
 KTsKCQlubm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9ial9wYWdlcyA9IDA7CgkJYnJlYWs7
 CglkZWZhdWx0OgoJCUtBU1NFUlQoZmFsc2UpOwoJfQoKCW11dGV4X2luaXQoJm5ub2RlLT50
 bl92bG9jaywgTVVURVhfREVGQVVMVCwgSVBMX05PTkUpOwoKCW11dGV4X2VudGVyKCZ0bXAt
 PnRtX2xvY2spOwoJTElTVF9JTlNFUlRfSEVBRCgmdG1wLT50bV9ub2Rlcywgbm5vZGUsIHRu
 X2VudHJpZXMpOwoJbXV0ZXhfZXhpdCgmdG1wLT50bV9sb2NrKTsKCgkqbm9kZSA9IG5ub2Rl
 OwoJcmV0dXJuIDA7Cn0KCi8qCiAqIHRtcGZzX2ZyZWVfbm9kZTogcmVtb3ZlIHRoZSBpbm9k
 ZSBmcm9tIGEgbGlzdCBpbiB0aGUgbW91bnQgcG9pbnQgYW5kCiAqIGRlc3Ryb3kgdGhlIGlu
 b2RlIHN0cnVjdHVyZXMuCiAqLwp2b2lkCnRtcGZzX2ZyZWVfbm9kZSh0bXBmc19tb3VudF90
 ICp0bXAsIHRtcGZzX25vZGVfdCAqbm9kZSkKewoJc2l6ZV90IG9ianN6OwoKCW11dGV4X2Vu
 dGVyKCZ0bXAtPnRtX2xvY2spOwoJTElTVF9SRU1PVkUobm9kZSwgdG5fZW50cmllcyk7Cglt
 dXRleF9leGl0KCZ0bXAtPnRtX2xvY2spOwoKCXN3aXRjaCAobm9kZS0+dG5fdHlwZSkgewoJ
 Y2FzZSBWTE5LOgoJCWlmIChub2RlLT50bl9zaXplID4gMCkgewoJCQl0bXBmc19zdHJuYW1l
 X2ZyZWUodG1wLCBub2RlLT50bl9zcGVjLnRuX2xuay50bl9saW5rLAoJCQkgICAgbm9kZS0+
 dG5fc2l6ZSk7CgkJfQoJCWJyZWFrOwoJY2FzZSBWUkVHOgoJCS8qCgkJICogQ2FsY3VsYXRl
 IHRoZSBzaXplIG9mIGlub2RlIGRhdGEsIGRlY3JlYXNlIHRoZSB1c2VkLW1lbW9yeQoJCSAq
 IGNvdW50ZXIsIGFuZCBkZXN0cm95IHRoZSB1bmVybHlpbmcgVVZNIG9iamVjdCAoaWYgYW55
 KS4KCQkgKi8KCQlvYmpzeiA9IFBBR0VfU0laRSAqIG5vZGUtPnRuX3NwZWMudG5fcmVnLnRu
 X2FvYmpfcGFnZXM7CgkJaWYgKG9ianN6ICE9IDApIHsKCQkJdG1wZnNfbWVtX2RlY3IodG1w
 LCBvYmpzeik7CgkJfQoJCWlmIChub2RlLT50bl9zcGVjLnRuX3JlZy50bl9hb2JqICE9IE5V
 TEwpIHsKCQkJdWFvX2RldGFjaChub2RlLT50bl9zcGVjLnRuX3JlZy50bl9hb2JqKTsKCQl9
 CgkJYnJlYWs7CgljYXNlIFZESVI6CgkJLyoKCQkgKiBLQVNTRVJUKFRBSUxRX0VNUFRZKCZu
 b2RlLT50bl9zcGVjLnRuX2Rpci50bl9kaXIpKTsKCQkgKiBLQVNTRVJUKG5vZGUtPnRuX3Nw
 ZWMudG5fZGlyLnRuX3BhcmVudCA9PSBOVUxMIHx8CgkJICogICAgIG5vZGUgPT0gdG1wLT50
 bV9yb290KTsKCQkgKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgoJbXV0ZXhf
 ZGVzdHJveSgmbm9kZS0+dG5fdmxvY2spOwoJdG1wZnNfbm9kZV9wdXQodG1wLCBub2RlKTsK
 fQoKLyoKICogdG1wZnNfdm5vZGVfZ2V0OiBhbGxvY2F0ZSBvciByZWNsYWltIGEgdm5vZGUg
 Zm9yIGEgc3BlY2lmaWVkIGlub2RlLgogKgogKiA9PiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRt
 cGZzX25vZGVfdDo6dG5fdmxvY2sgaGVsZC4KICogPT4gUmV0dXJucyB2bm9kZSAoKnZwcCkg
 bG9ja2VkLgogKi8KaW50CnRtcGZzX3Zub2RlX2dldChzdHJ1Y3QgbW91bnQgKm1wLCB0bXBm
 c19ub2RlX3QgKm5vZGUsIHZub2RlX3QgKip2cHApCnsKCXZub2RlX3QgKnZwOwoJaW50IGVy
 cm9yOwphZ2FpbjoKCS8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSB2bm9kZSwgdHJ5IHRvIHJl
 Y2xhaW0gaXQuICovCglpZiAoKHZwID0gbm9kZS0+dG5fdm5vZGUpICE9IE5VTEwpIHsKCQlh
 dG9taWNfb3JfdWxvbmcoJm5vZGUtPnRuX2dlbiwgVE1QRlNfUkVDTEFJTUlOR19CSVQpOwoJ
 CW11dGV4X2VudGVyKCZ2cC0+dl9pbnRlcmxvY2spOwoJCW11dGV4X2V4aXQoJm5vZGUtPnRu
 X3Zsb2NrKTsKCQllcnJvciA9IHZnZXQodnAsIExLX0VYQ0xVU0lWRSB8IExLX0lOVEVSTE9D
 Syk7CgkJaWYgKGVycm9yID09IEVOT0VOVCkgewoJCQltdXRleF9lbnRlcigmbm9kZS0+dG5f
 dmxvY2spOwoJCQlnb3RvIGFnYWluOwoJCX0KCQlhdG9taWNfYW5kX3Vsb25nKCZub2RlLT50
 bl9nZW4sIH5UTVBGU19SRUNMQUlNSU5HX0JJVCk7CgkJKnZwcCA9IHZwOwoJCXJldHVybiBl
 cnJvcjsKCX0KCWlmIChUTVBGU19OT0RFX1JFQ0xBSU1JTkcobm9kZSkpIHsKCQlhdG9taWNf
 YW5kX3Vsb25nKCZub2RlLT50bl9nZW4sIH5UTVBGU19SRUNMQUlNSU5HX0JJVCk7Cgl9CgoJ
 LyogR2V0IGEgbmV3IHZub2RlIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBvdXIgbm9kZS4gKi8K
 CWVycm9yID0gZ2V0bmV3dm5vZGUoVlRfVE1QRlMsIG1wLCB0bXBmc192bm9kZW9wX3AsICZ2
 cCk7CglpZiAoZXJyb3IpIHsKCQltdXRleF9leGl0KCZub2RlLT50bl92bG9jayk7CgkJcmV0
 dXJuIGVycm9yOwoJfQoKCXZuX2xvY2sodnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsK
 CXZwLT52X3R5cGUgPSBub2RlLT50bl90eXBlOwoKCS8qIFR5cGUtc3BlY2lmaWMgaW5pdGlh
 bGl6YXRpb24uICovCglzd2l0Y2ggKG5vZGUtPnRuX3R5cGUpIHsKCWNhc2UgVkJMSzoKCWNh
 c2UgVkNIUjoKCQl2cC0+dl9vcCA9IHRtcGZzX3NwZWNvcF9wOwoJCXNwZWNfbm9kZV9pbml0
 KHZwLCBub2RlLT50bl9zcGVjLnRuX2Rldi50bl9yZGV2KTsKCQlicmVhazsKCWNhc2UgVkRJ
 UjoKCQl2cC0+dl92ZmxhZyB8PSBub2RlLT50bl9zcGVjLnRuX2Rpci50bl9wYXJlbnQgPT0g
 bm9kZSA/CgkJICAgIFZWX1JPT1QgOiAwOwoJCWJyZWFrOwoJY2FzZSBWRklGTzoKCQl2cC0+
 dl9vcCA9IHRtcGZzX2ZpZm9vcF9wOwoJCWJyZWFrOwoJY2FzZSBWTE5LOgoJY2FzZSBWUkVH
 OgoJY2FzZSBWU09DSzoKCQlicmVhazsKCWRlZmF1bHQ6CgkJS0FTU0VSVChmYWxzZSk7Cgl9
 CgoJdXZtX3ZucF9zZXRzaXplKHZwLCBub2RlLT50bl9zaXplKTsKCXZwLT52X2RhdGEgPSBu
 b2RlOwoJbm9kZS0+dG5fdm5vZGUgPSB2cDsKCW11dGV4X2V4aXQoJm5vZGUtPnRuX3Zsb2Nr
 KTsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoJKnZwcCA9IHZwOwoJcmV0dXJuIDA7
 Cn0KCi8qCiAqIHRtcGZzX2FsbG9jX2ZpbGU6IGFsbG9jYXRlIGEgbmV3IGZpbGUgb2Ygc3Bl
 Y2lmaWVkIHR5cGUgYW5kIGFkZHMgaXQKICogaW50byB0aGUgcGFyZW50IGRpcmVjdG9yeS4K
 ICoKICogPT4gQ3JlZGVudGlhbHMgb2YgdGhlIGNhbGxlciBhcmUgdXNlZC4KICovCmludAp0
 bXBmc19hbGxvY19maWxlKHZub2RlX3QgKmR2cCwgdm5vZGVfdCAqKnZwcCwgc3RydWN0IHZh
 dHRyICp2YXAsCiAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wLCBjaGFyICp0YXJnZXQp
 CnsKCXRtcGZzX21vdW50X3QgKnRtcCA9IFZGU19UT19UTVBGUyhkdnAtPnZfbW91bnQpOwoJ
 dG1wZnNfbm9kZV90ICpkbm9kZSA9IFZQX1RPX1RNUEZTX0RJUihkdnApLCAqbm9kZTsKCXRt
 cGZzX2RpcmVudF90ICpkZTsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChk
 dnApKTsKCSp2cHAgPSBOVUxMOwoKCS8qIENoZWNrIGZvciB0aGUgbWF4aW11bSBudW1iZXIg
 b2YgbGlua3MgbGltaXQuICovCglpZiAodmFwLT52YV90eXBlID09IFZESVIpIHsKCQkvKiBD
 aGVjayBmb3IgbWF4aW11bSBsaW5rcyBsaW1pdC4gKi8KCQlpZiAoZG5vZGUtPnRuX2xpbmtz
 ID09IExJTktfTUFYKSB7CgkJCWVycm9yID0gRU1MSU5LOwoJCQlnb3RvIG91dDsKCQl9CgkJ
 S0FTU0VSVChkbm9kZS0+dG5fbGlua3MgPCBMSU5LX01BWCk7Cgl9CgoJLyogQWxsb2NhdGUg
 YSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IGZpbGUuICovCgllcnJvciA9IHRtcGZz
 X2FsbG9jX25vZGUodG1wLCB2YXAtPnZhX3R5cGUsIGthdXRoX2NyZWRfZ2V0ZXVpZChjbnAt
 PmNuX2NyZWQpLAoJICAgIGRub2RlLT50bl9naWQsIHZhcC0+dmFfbW9kZSwgdGFyZ2V0LCB2
 YXAtPnZhX3JkZXYsICZub2RlKTsKCWlmIChlcnJvcikKCQlnb3RvIG91dDsKCgkvKiBBbGxv
 Y2F0ZSBhIGRpcmVjdG9yeSBlbnRyeSB0aGF0IHBvaW50cyB0byB0aGUgbmV3IGZpbGUuICov
 CgllcnJvciA9IHRtcGZzX2FsbG9jX2RpcmVudCh0bXAsIGNucC0+Y25fbmFtZXB0ciwgY25w
 LT5jbl9uYW1lbGVuLCAmZGUpOwoJaWYgKGVycm9yKSB7CgkJdG1wZnNfZnJlZV9ub2RlKHRt
 cCwgbm9kZSk7CgkJZ290byBvdXQ7Cgl9CgoJLyogR2V0IGEgdm5vZGUgZm9yIHRoZSBuZXcg
 ZmlsZS4gKi8KCW11dGV4X2VudGVyKCZub2RlLT50bl92bG9jayk7CgllcnJvciA9IHRtcGZz
 X3Zub2RlX2dldChkdnAtPnZfbW91bnQsIG5vZGUsIHZwcCk7CglpZiAoZXJyb3IpIHsKCQl0
 bXBmc19mcmVlX2RpcmVudCh0bXAsIGRlKTsKCQl0bXBmc19mcmVlX25vZGUodG1wLCBub2Rl
 KTsKCQlnb3RvIG91dDsKCX0KCgkvKiBBc3NvY2lhdGUgaW5vZGUgYW5kIGF0dGFjaCB0aGUg
 ZW50cnkgaW50byB0aGUgZGlyZWN0b3J5LiAqLwoJdG1wZnNfZGlyX2F0dGFjaChkdnAsIGRl
 LCBub2RlKTsKb3V0OgoJdnB1dChkdnApOwoJcmV0dXJuIGVycm9yOwp9CgovKgogKiB0bXBm
 c19hbGxvY19kaXJlbnQ6IGFsbG9jYXRlcyBhIG5ldyBkaXJlY3RvcnkgZW50cnkgZm9yIHRo
 ZSBpbm9kZS4KICogVGhlIGRpcmVjdG9yeSBlbnRyeSBjb250YWlucyBhIHBhdGggbmFtZSBj
 b21wb25lbnQuCiAqLwppbnQKdG1wZnNfYWxsb2NfZGlyZW50KHRtcGZzX21vdW50X3QgKnRt
 cCwgY29uc3QgY2hhciAqbmFtZSwgdWludDE2X3QgbGVuLAogICAgdG1wZnNfZGlyZW50X3Qg
 KipkZSkKewoJdG1wZnNfZGlyZW50X3QgKm5kZTsKCgluZGUgPSB0bXBmc19kaXJlbnRfZ2V0
 KHRtcCk7CglpZiAobmRlID09IE5VTEwpCgkJcmV0dXJuIEVOT1NQQzsKCgluZGUtPnRkX25h
 bWUgPSB0bXBmc19zdHJuYW1lX2FsbG9jKHRtcCwgbGVuKTsKCWlmIChuZGUtPnRkX25hbWUg
 PT0gTlVMTCkgewoJCXRtcGZzX2RpcmVudF9wdXQodG1wLCBuZGUpOwoJCXJldHVybiBFTk9T
 UEM7Cgl9CgluZGUtPnRkX25hbWVsZW4gPSBsZW47CgltZW1jcHkobmRlLT50ZF9uYW1lLCBu
 YW1lLCBsZW4pOwoKCSpkZSA9IG5kZTsKCXJldHVybiAwOwp9CgovKgogKiB0bXBmc19mcmVl
 X2RpcmVudDogZnJlZSBhIGRpcmVjdG9yeSBlbnRyeS4KICovCnZvaWQKdG1wZnNfZnJlZV9k
 aXJlbnQodG1wZnNfbW91bnRfdCAqdG1wLCB0bXBmc19kaXJlbnRfdCAqZGUpCnsKCgkvKiBL
 QVNTRVJUKGRlLT50ZF9ub2RlID09IE5VTEwpOyAqLwoJdG1wZnNfc3RybmFtZV9mcmVlKHRt
 cCwgZGUtPnRkX25hbWUsIGRlLT50ZF9uYW1lbGVuKTsKCXRtcGZzX2RpcmVudF9wdXQodG1w
 LCBkZSk7Cn0KCi8qCiAqIHRtcGZzX2Rpcl9hdHRhY2g6IGFzc29jaWF0ZSBkaXJlY3Rvcnkg
 ZW50cnkgd2l0aCBhIHNwZWNpZmllZCBpbm9kZSwKICogYW5kIGF0dGFjaCB0aGUgZW50cnkg
 aW50byB0aGUgZGlyZWN0b3J5LCBzcGVjaWZpZWQgYnkgdm5vZGUuCiAqCiAqID0+IEluY3Jl
 YXNlcyBsaW5rIGNvdW50IG9uIHRoZSBhc3NvY2lhdGVkIG5vZGUuCiAqID0+IEluY3JlYXNl
 cyBsaW5rIGNvdW50IG9uIGRpcmVjdG9yeSBub2RlLCBpZiBvdXIgbm9kZSBpcyBWRElSLgog
 KiAgICBJdCBpcyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjaGVjayBmb3IgdGhlIExJ
 TktfTUFYIGxpbWl0LgogKiA9PiBUcmlnZ2VycyBrcXVldWUgZXZlbnRzIGhlcmUuCiAqLwp2
 b2lkCnRtcGZzX2Rpcl9hdHRhY2godm5vZGVfdCAqZHZwLCB0bXBmc19kaXJlbnRfdCAqZGUs
 IHRtcGZzX25vZGVfdCAqbm9kZSkKewoJdG1wZnNfbm9kZV90ICpkbm9kZSA9IFZQX1RPX1RN
 UEZTX0RJUihkdnApOwoJaW50IGV2ZW50cyA9IE5PVEVfV1JJVEU7CgoJS0FTU0VSVChWT1Bf
 SVNMT0NLRUQoZHZwKSk7CgoJLyogQXNzb2NpYXRlIGRpcmVjdG9yeSBlbnRyeSBhbmQgdGhl
 IGlub2RlLiAqLwoJaWYgKG5vZGUgIT0gVE1QRlNfTk9ERV9XSElURU9VVCkgewoJCWRlLT50
 ZF9ub2RlID0gbm9kZTsKCQlLQVNTRVJUKG5vZGUtPnRuX2xpbmtzIDwgTElOS19NQVgpOwoJ
 CW5vZGUtPnRuX2xpbmtzKys7CgoJCS8qIFNhdmUgdGhlIGhpbnQgKG1pZ2h0IG92ZXJ3cml0
 ZSkuICovCgkJbm9kZS0+dG5fZGlyZW50X2hpbnQgPSBkZTsKCX0KCgkvKiBJbnNlcnQgdGhl
 IGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgKHBhcmVudCBvZiBpbm9kZSkuICovCglUQUlMUV9J
 TlNFUlRfVEFJTCgmZG5vZGUtPnRuX3NwZWMudG5fZGlyLnRuX2RpciwgZGUsIHRkX2VudHJp
 ZXMpOwoJZG5vZGUtPnRuX3NpemUgKz0gc2l6ZW9mKHRtcGZzX2RpcmVudF90KTsKCWRub2Rl
 LT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9TVEFUVVNBTEw7Cgl1dm1fdm5wX3NldHNpemUo
 ZHZwLCBkbm9kZS0+dG5fc2l6ZSk7CgoJaWYgKG5vZGUgIT0gVE1QRlNfTk9ERV9XSElURU9V
 VCAmJiBub2RlLT50bl90eXBlID09IFZESVIpIHsKCQkvKiBTZXQgcGFyZW50LiAqLwoJCUtB
 U1NFUlQobm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID09IE5VTEwpOwoJCW5vZGUt
 PnRuX3NwZWMudG5fZGlyLnRuX3BhcmVudCA9IGRub2RlOwoKCQkvKiBJbmNyZWFzZSB0aGUg
 bGluayBjb3VudCBvZiBwYXJlbnQuICovCgkJS0FTU0VSVChkbm9kZS0+dG5fbGlua3MgPCBM
 SU5LX01BWCk7CgkJZG5vZGUtPnRuX2xpbmtzKys7CgkJZXZlbnRzIHw9IE5PVEVfTElOSzsK
 CgkJVE1QRlNfVkFMSURBVEVfRElSKG5vZGUpOwoJfQoJVk5fS05PVEUoZHZwLCBldmVudHMp
 Owp9CgovKgogKiB0bXBmc19kaXJfZGV0YWNoOiBkaXNhc3NvY2lhdGUgZGlyZWN0b3J5IGVu
 dHJ5IGFuZCBpdHMgaW5vZGUsCiAqIGFuZCBkZXRhY2ggdGhlIGVudHJ5IGZyb20gdGhlIGRp
 cmVjdG9yeSwgc3BlY2lmaWVkIGJ5IHZub2RlLgogKgogKiA9PiBEZWNyZWFzZXMgbGluayBj
 b3VudCBvbiB0aGUgYXNzb2NpYXRlZCBub2RlLgogKiA9PiBEZWNyZWFzZXMgdGhlIGxpbmsg
 Y291bnQgb24gZGlyZWN0b3J5IG5vZGUsIGlmIG91ciBub2RlIGlzIFZESVIuCiAqID0+IFRy
 aWdnZXJzIGtxdWV1ZSBldmVudHMgaGVyZS4KICovCnZvaWQKdG1wZnNfZGlyX2RldGFjaCh2
 bm9kZV90ICpkdnAsIHRtcGZzX2RpcmVudF90ICpkZSkKewoJdG1wZnNfbm9kZV90ICpkbm9k
 ZSA9IFZQX1RPX1RNUEZTX0RJUihkdnApOwoJdG1wZnNfbm9kZV90ICpub2RlID0gZGUtPnRk
 X25vZGU7CglpbnQgZXZlbnRzID0gTk9URV9XUklURTsKCglLQVNTRVJUKFZPUF9JU0xPQ0tF
 RChkdnApKTsKCglpZiAobm9kZSAhPSBUTVBGU19OT0RFX1dISVRFT1VUKSB7CgkJdm5vZGVf
 dCAqdnAgPSBub2RlLT50bl92bm9kZTsKCgkJS0FTU0VSVChWT1BfSVNMT0NLRUQodnApKTsK
 CgkJLyogRGVhc3NvY2lhdGUgdGhlIGlub2RlIGFuZCBlbnRyeS4gKi8KCQlkZS0+dGRfbm9k
 ZSA9IE5VTEw7CgkJbm9kZS0+dG5fZGlyZW50X2hpbnQgPSBOVUxMOwoKCQlLQVNTRVJUKG5v
 ZGUtPnRuX2xpbmtzID4gMCk7CgkJbm9kZS0+dG5fbGlua3MtLTsKCQlpZiAodnApIHsKCQkJ
 Vk5fS05PVEUodnAsIG5vZGUtPnRuX2xpbmtzID8KCQkJICAgIE5PVEVfTElOSyA6IE5PVEVf
 REVMRVRFKTsKCQl9CgoJCS8qIElmIGRpcmVjdG9yeSAtIGRlY3JlYXNlIHRoZSBsaW5rIGNv
 dW50IG9mIHBhcmVudC4gKi8KCQlpZiAobm9kZS0+dG5fdHlwZSA9PSBWRElSKSB7CgkJCUtB
 U1NFUlQobm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID09IGRub2RlKTsKCQkJbm9k
 ZS0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID0gTlVMTDsKCgkJCUtBU1NFUlQoZG5vZGUt
 PnRuX2xpbmtzID4gMCk7CgkJCWRub2RlLT50bl9saW5rcy0tOwoJCQlldmVudHMgfD0gTk9U
 RV9MSU5LOwoJCX0KCX0KCgkvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGRpcmVjdG9y
 eS4gKi8KCWlmIChkbm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9PSBk
 ZSkgewoJCWRub2RlLT50bl9zcGVjLnRuX2Rpci50bl9yZWFkZGlyX2xhc3RuID0gMDsKCQlk
 bm9kZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9IE5VTEw7Cgl9CglUQUlM
 UV9SRU1PVkUoJmRub2RlLT50bl9zcGVjLnRuX2Rpci50bl9kaXIsIGRlLCB0ZF9lbnRyaWVz
 KTsKCglkbm9kZS0+dG5fc2l6ZSAtPSBzaXplb2YodG1wZnNfZGlyZW50X3QpOwoJZG5vZGUt
 PnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX1NUQVRVU0FMTDsKCXV2bV92bnBfc2V0c2l6ZShk
 dnAsIGRub2RlLT50bl9zaXplKTsKCVZOX0tOT1RFKGR2cCwgZXZlbnRzKTsKfQoKLyoKICog
 dG1wZnNfZGlyX2xvb2t1cDogZmluZCBhIGRpcmVjdG9yeSBlbnRyeSBpbiB0aGUgc3BlY2lm
 aWVkIGlub2RlLgogKgogKiBOb3RlIHRoYXQgdGhlIC4gYW5kIC4uIGNvbXBvbmVudHMgYXJl
 IG5vdCBhbGxvd2VkIGFzIHRoZXkgZG8gbm90CiAqIHBoeXNpY2FsbHkgZXhpc3Qgd2l0aGlu
 IGRpcmVjdG9yaWVzLgogKi8KdG1wZnNfZGlyZW50X3QgKgp0bXBmc19kaXJfbG9va3VwKHRt
 cGZzX25vZGVfdCAqbm9kZSwgc3RydWN0IGNvbXBvbmVudG5hbWUgKmNucCkKewoJY29uc3Qg
 Y2hhciAqbmFtZSA9IGNucC0+Y25fbmFtZXB0cjsKCWNvbnN0IHVpbnQxNl90IG5sZW4gPSBj
 bnAtPmNuX25hbWVsZW47Cgl0bXBmc19kaXJlbnRfdCAqZGU7CgoJS0FTU0VSVChWT1BfSVNM
 T0NLRUQobm9kZS0+dG5fdm5vZGUpKTsKCUtBU1NFUlQobmxlbiAhPSAxIHx8ICEobmFtZVsw
 XSA9PSAnLicpKTsKCUtBU1NFUlQobmxlbiAhPSAyIHx8ICEobmFtZVswXSA9PSAnLicgJiYg
 bmFtZVsxXSA9PSAnLicpKTsKCVRNUEZTX1ZBTElEQVRFX0RJUihub2RlKTsKCglUQUlMUV9G
 T1JFQUNIKGRlLCAmbm9kZS0+dG5fc3BlYy50bl9kaXIudG5fZGlyLCB0ZF9lbnRyaWVzKSB7
 CgkJaWYgKGRlLT50ZF9uYW1lbGVuICE9IG5sZW4pCgkJCWNvbnRpbnVlOwoJCWlmIChtZW1j
 bXAoZGUtPnRkX25hbWUsIG5hbWUsIG5sZW4pICE9IDApCgkJCWNvbnRpbnVlOwoJCWJyZWFr
 OwoJfQoJbm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfQUNDRVNTRUQ7CglyZXR1cm4g
 ZGU7Cn0KCi8qCiAqIHRtcGZzX2Rpcl9jYWNoZWQ6IGdldCBhIGNhY2hlZCBkaXJlY3Rvcnkg
 ZW50cnkgaWYgaXQgaXMgdmFsaWQuICBVc2VkIHRvCiAqIGF2b2lkIHVubmVjZXNzYXJ5IHRt
 cGRzX2Rpcl9sb29rdXAoKS4KICoKICogPT4gVGhlIHZub2RlIG11c3QgYmUgbG9ja2VkLgog
 Ki8KdG1wZnNfZGlyZW50X3QgKgp0bXBmc19kaXJfY2FjaGVkKHRtcGZzX25vZGVfdCAqbm9k
 ZSkKewoJdG1wZnNfZGlyZW50X3QgKmRlID0gbm9kZS0+dG5fZGlyZW50X2hpbnQ7CgoJS0FT
 U0VSVChWT1BfSVNMT0NLRUQobm9kZS0+dG5fdm5vZGUpKTsKCglpZiAoZGUgPT0gTlVMTCkg
 ewoJCXJldHVybiBOVUxMOwoJfQoJS0FTU0VSVChkZS0+dGRfbm9kZSA9PSBub2RlKTsKCgkv
 KgoJICogRGlyZWN0b3JpZXMgYWx3YXlzIGhhdmUgYSB2YWxpZCBoaW50LiAgRm9yIGZpbGVz
 LCBjaGVjayBpZiB0aGVyZQoJICogYXJlIGFueSBoYXJkIGxpbmtzLiAgSWYgdGhlcmUgYXJl
 IC0gaGludCBtaWdodCBiZSBpbnZhbGlkLgoJICovCglyZXR1cm4gKG5vZGUtPnRuX3R5cGUg
 IT0gVkRJUiAmJiBub2RlLT50bl9saW5rcyA+IDEpID8gTlVMTCA6IGRlOwp9CgovKgogKiB0
 bXBmc19kaXJfZ2V0ZG90ZGVudDogaGVscGVyIGZ1bmN0aW9uIGZvciB0bXBmc19yZWFkZGly
 LiAgQ3JlYXRlcyBhCiAqICcuJyBlbnRyeSBmb3IgdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQg
 cmV0dXJucyBpdCBpbiB0aGUgdWlvIHNwYWNlLgogKi8KaW50CnRtcGZzX2Rpcl9nZXRkb3Rk
 ZW50KHRtcGZzX25vZGVfdCAqbm9kZSwgc3RydWN0IHVpbyAqdWlvKQp7CglzdHJ1Y3QgZGly
 ZW50ICpkZW50cDsKCWludCBlcnJvcjsKCglUTVBGU19WQUxJREFURV9ESVIobm9kZSk7CglL
 QVNTRVJUKHVpby0+dWlvX29mZnNldCA9PSBUTVBGU19ESVJDT09LSUVfRE9UKTsKCglkZW50
 cCA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaXJlbnQpLCBLTV9TTEVFUCk7CglkZW50
 cC0+ZF9maWxlbm8gPSBub2RlLT50bl9pZDsKCWRlbnRwLT5kX3R5cGUgPSBEVF9ESVI7Cglk
 ZW50cC0+ZF9uYW1sZW4gPSAxOwoJZGVudHAtPmRfbmFtZVswXSA9ICcuJzsKCWRlbnRwLT5k
 X25hbWVbMV0gPSAnXDAnOwoJZGVudHAtPmRfcmVjbGVuID0gX0RJUkVOVF9TSVpFKGRlbnRw
 KTsKCglpZiAoZGVudHAtPmRfcmVjbGVuID4gdWlvLT51aW9fcmVzaWQpCgkJZXJyb3IgPSAt
 MTsKCWVsc2UgewoJCWVycm9yID0gdWlvbW92ZShkZW50cCwgZGVudHAtPmRfcmVjbGVuLCB1
 aW8pOwoJCWlmIChlcnJvciA9PSAwKQoJCQl1aW8tPnVpb19vZmZzZXQgPSBUTVBGU19ESVJD
 T09LSUVfRE9URE9UOwoJfQoJbm9kZS0+dG5fc3RhdHVzIHw9IFRNUEZTX05PREVfQUNDRVNT
 RUQ7CglrbWVtX2ZyZWUoZGVudHAsIHNpemVvZihzdHJ1Y3QgZGlyZW50KSk7CglyZXR1cm4g
 ZXJyb3I7Cn0KCi8qCiAqIHRtcGZzX2Rpcl9nZXRkb3Rkb3RkZW50OiBoZWxwZXIgZnVuY3Rp
 b24gZm9yIHRtcGZzX3JlYWRkaXIuICBDcmVhdGVzIGEKICogJy4uJyBlbnRyeSBmb3IgdGhl
 IGdpdmVuIGRpcmVjdG9yeSBhbmQgcmV0dXJucyBpdCBpbiB0aGUgdWlvIHNwYWNlLgogKi8K
 aW50CnRtcGZzX2Rpcl9nZXRkb3Rkb3RkZW50KHRtcGZzX25vZGVfdCAqbm9kZSwgc3RydWN0
 IHVpbyAqdWlvKQp7CglzdHJ1Y3QgZGlyZW50ICpkZW50cDsKCWludCBlcnJvcjsKCglUTVBG
 U19WQUxJREFURV9ESVIobm9kZSk7CglLQVNTRVJUKHVpby0+dWlvX29mZnNldCA9PSBUTVBG
 U19ESVJDT09LSUVfRE9URE9UKTsKCglkZW50cCA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVj
 dCBkaXJlbnQpLCBLTV9TTEVFUCk7CglkZW50cC0+ZF9maWxlbm8gPSBub2RlLT50bl9zcGVj
 LnRuX2Rpci50bl9wYXJlbnQtPnRuX2lkOwoJZGVudHAtPmRfdHlwZSA9IERUX0RJUjsKCWRl
 bnRwLT5kX25hbWxlbiA9IDI7CglkZW50cC0+ZF9uYW1lWzBdID0gJy4nOwoJZGVudHAtPmRf
 bmFtZVsxXSA9ICcuJzsKCWRlbnRwLT5kX25hbWVbMl0gPSAnXDAnOwoJZGVudHAtPmRfcmVj
 bGVuID0gX0RJUkVOVF9TSVpFKGRlbnRwKTsKCglpZiAoZGVudHAtPmRfcmVjbGVuID4gdWlv
 LT51aW9fcmVzaWQpCgkJZXJyb3IgPSAtMTsKCWVsc2UgewoJCWVycm9yID0gdWlvbW92ZShk
 ZW50cCwgZGVudHAtPmRfcmVjbGVuLCB1aW8pOwoJCWlmIChlcnJvciA9PSAwKSB7CgkJCXRt
 cGZzX2RpcmVudF90ICpkZTsKCgkJCWRlID0gVEFJTFFfRklSU1QoJm5vZGUtPnRuX3NwZWMu
 dG5fZGlyLnRuX2Rpcik7CgkJCWlmIChkZSA9PSBOVUxMKQoJCQkJdWlvLT51aW9fb2Zmc2V0
 ID0gVE1QRlNfRElSQ09PS0lFX0VPRjsKCQkJZWxzZQoJCQkJdWlvLT51aW9fb2Zmc2V0ID0g
 dG1wZnNfZGlyY29va2llKGRlKTsKCQl9Cgl9Cglub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNf
 Tk9ERV9BQ0NFU1NFRDsKCWttZW1fZnJlZShkZW50cCwgc2l6ZW9mKHN0cnVjdCBkaXJlbnQp
 KTsKCXJldHVybiBlcnJvcjsKfQoKLyoKICogdG1wZnNfZGlyX2xvb2t1cGJ5Y29va2llOiBs
 b29rdXAgYSBkaXJlY3RvcnkgZW50cnkgYnkgYXNzb2NpYXRlZCBjb29raWUuCiAqLwp0bXBm
 c19kaXJlbnRfdCAqCnRtcGZzX2Rpcl9sb29rdXBieWNvb2tpZSh0bXBmc19ub2RlX3QgKm5v
 ZGUsIG9mZl90IGNvb2tpZSkKewoJdG1wZnNfZGlyZW50X3QgKmRlOwoKCUtBU1NFUlQoVk9Q
 X0lTTE9DS0VEKG5vZGUtPnRuX3Zub2RlKSk7CgoJaWYgKGNvb2tpZSA9PSBub2RlLT50bl9z
 cGVjLnRuX2Rpci50bl9yZWFkZGlyX2xhc3RuICYmCgkgICAgbm9kZS0+dG5fc3BlYy50bl9k
 aXIudG5fcmVhZGRpcl9sYXN0cCAhPSBOVUxMKSB7CgkJcmV0dXJuIG5vZGUtPnRuX3NwZWMu
 dG5fZGlyLnRuX3JlYWRkaXJfbGFzdHA7Cgl9CglUQUlMUV9GT1JFQUNIKGRlLCAmbm9kZS0+
 dG5fc3BlYy50bl9kaXIudG5fZGlyLCB0ZF9lbnRyaWVzKSB7CgkJaWYgKHRtcGZzX2RpcmNv
 b2tpZShkZSkgPT0gY29va2llKSB7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiBkZTsKfQoK
 LyoKICogdG1wZnNfZGlyX2dldGRlbnRzOiByZWxwZXIgZnVuY3Rpb24gZm9yIHRtcGZzX3Jl
 YWRkaXIuCiAqCiAqID0+IFJldHVybnMgYXMgbXVjaCBkaXJlY3RvcnkgZW50cmllcyBhcyBj
 YW4gZml0IGluIHRoZSB1aW8gc3BhY2UuCiAqID0+IFRoZSByZWFkIHN0YXJ0cyBhdCB1aW8t
 PnVpb19vZmZzZXQuCiAqLwppbnQKdG1wZnNfZGlyX2dldGRlbnRzKHRtcGZzX25vZGVfdCAq
 bm9kZSwgc3RydWN0IHVpbyAqdWlvLCBvZmZfdCAqY250cCkKewoJdG1wZnNfZGlyZW50X3Qg
 KmRlOwoJc3RydWN0IGRpcmVudCAqZGVudHA7CglvZmZfdCBzdGFydGNvb2tpZTsKCWludCBl
 cnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChub2RlLT50bl92bm9kZSkpOwoJVE1QRlNf
 VkFMSURBVEVfRElSKG5vZGUpOwoKCS8qCgkgKiBMb2NhdGUgdGhlIGZpcnN0IGRpcmVjdG9y
 eSBlbnRyeSB3ZSBoYXZlIHRvIHJldHVybi4gIFdlIGhhdmUgY2FjaGVkCgkgKiB0aGUgbGFz
 dCByZWFkZGlyIGluIHRoZSBub2RlLCBzbyB1c2UgdGhvc2UgdmFsdWVzIGlmIGFwcHJvcHJp
 YXRlLgoJICogT3RoZXJ3aXNlIGRvIGEgbGluZWFyIHNjYW4gdG8gZmluZCB0aGUgcmVxdWVz
 dGVkIGVudHJ5LgoJICovCglzdGFydGNvb2tpZSA9IHVpby0+dWlvX29mZnNldDsKCUtBU1NF
 UlQoc3RhcnRjb29raWUgIT0gVE1QRlNfRElSQ09PS0lFX0RPVCk7CglLQVNTRVJUKHN0YXJ0
 Y29va2llICE9IFRNUEZTX0RJUkNPT0tJRV9ET1RET1QpOwoJaWYgKHN0YXJ0Y29va2llID09
 IFRNUEZTX0RJUkNPT0tJRV9FT0YpIHsKCQlyZXR1cm4gMDsKCX0gZWxzZSB7CgkJZGUgPSB0
 bXBmc19kaXJfbG9va3VwYnljb29raWUobm9kZSwgc3RhcnRjb29raWUpOwoJfQoJaWYgKGRl
 ID09IE5VTEwpIHsKCQlyZXR1cm4gRUlOVkFMOwoJfQoKCS8qCgkgKiBSZWFkIGFzIG11Y2gg
 ZW50cmllcyBhcyBwb3NzaWJsZTsgaS5lLiwgdW50aWwgd2UgcmVhY2ggdGhlIGVuZAoJICog
 b2YgdGhlIGRpcmVjdG9yeSBvciB3ZSBleGhhdXN0IHVpbyBzcGFjZS4KCSAqLwoJZGVudHAg
 PSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgZGlyZW50KSwgS01fU0xFRVApOwoJZG8gewoJ
 CS8qCgkJICogQ3JlYXRlIGEgZGlyZW50IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGN1
 cnJlbnQKCQkgKiBpbm9kZSBhbmQgZmlsbCBpdC4KCQkgKi8KCQlpZiAoZGUtPnRkX25vZGUg
 PT0gVE1QRlNfTk9ERV9XSElURU9VVCkgewoJCQlkZW50cC0+ZF9maWxlbm8gPSAxOwoJCQlk
 ZW50cC0+ZF90eXBlID0gRFRfV0hUOwoJCX0gZWxzZSB7CgkJCWRlbnRwLT5kX2ZpbGVubyA9
 IGRlLT50ZF9ub2RlLT50bl9pZDsKCQkJc3dpdGNoIChkZS0+dGRfbm9kZS0+dG5fdHlwZSkg
 ewoJCQljYXNlIFZCTEs6CgkJCQlkZW50cC0+ZF90eXBlID0gRFRfQkxLOwoJCQkJYnJlYWs7
 CgkJCWNhc2UgVkNIUjoKCQkJCWRlbnRwLT5kX3R5cGUgPSBEVF9DSFI7CgkJCQlicmVhazsK
 CQkJY2FzZSBWRElSOgoJCQkJZGVudHAtPmRfdHlwZSA9IERUX0RJUjsKCQkJCWJyZWFrOwoJ
 CQljYXNlIFZGSUZPOgoJCQkJZGVudHAtPmRfdHlwZSA9IERUX0ZJRk87CgkJCQlicmVhazsK
 CQkJY2FzZSBWTE5LOgoJCQkJZGVudHAtPmRfdHlwZSA9IERUX0xOSzsKCQkJCWJyZWFrOwoJ
 CQljYXNlIFZSRUc6CgkJCQlkZW50cC0+ZF90eXBlID0gRFRfUkVHOwoJCQkJYnJlYWs7CgkJ
 CWNhc2UgVlNPQ0s6CgkJCQlkZW50cC0+ZF90eXBlID0gRFRfU09DSzsKCQkJCWJyZWFrOwoJ
 CQlkZWZhdWx0OgoJCQkJS0FTU0VSVChmYWxzZSk7CgkJCX0KCQl9CgkJZGVudHAtPmRfbmFt
 bGVuID0gZGUtPnRkX25hbWVsZW47CgkJS0FTU0VSVChkZS0+dGRfbmFtZWxlbiA8IHNpemVv
 ZihkZW50cC0+ZF9uYW1lKSk7CgkJbWVtY3B5KGRlbnRwLT5kX25hbWUsIGRlLT50ZF9uYW1l
 LCBkZS0+dGRfbmFtZWxlbik7CgkJZGVudHAtPmRfbmFtZVtkZS0+dGRfbmFtZWxlbl0gPSAn
 XDAnOwoJCWRlbnRwLT5kX3JlY2xlbiA9IF9ESVJFTlRfU0laRShkZW50cCk7CgoJCS8qIFN0
 b3AgcmVhZGluZyBpZiB0aGUgZGlyZWN0b3J5IGVudHJ5IHdlIGFyZSB0cmVhdGluZyBpcwoJ
 CSAqIGJpZ2dlciB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXR1cm5l
 ZC4gKi8KCQlpZiAoZGVudHAtPmRfcmVjbGVuID4gdWlvLT51aW9fcmVzaWQpIHsKCQkJZXJy
 b3IgPSAtMTsKCQkJYnJlYWs7CgkJfQoKCQkvKgoJCSAqIENvcHkgdGhlIG5ldyBkaXJlbnQg
 c3RydWN0dXJlIGludG8gdGhlIG91dHB1dCBidWZmZXIgYW5kCgkJICogYWR2YW5jZSBwb2lu
 dGVycy4KCQkgKi8KCQllcnJvciA9IHVpb21vdmUoZGVudHAsIGRlbnRwLT5kX3JlY2xlbiwg
 dWlvKTsKCgkJKCpjbnRwKSsrOwoJCWRlID0gVEFJTFFfTkVYVChkZSwgdGRfZW50cmllcyk7
 Cgl9IHdoaWxlIChlcnJvciA9PSAwICYmIHVpby0+dWlvX3Jlc2lkID4gMCAmJiBkZSAhPSBO
 VUxMKTsKCgkvKiBVcGRhdGUgdGhlIG9mZnNldCBhbmQgY2FjaGUuICovCglpZiAoZGUgPT0g
 TlVMTCkgewoJCXVpby0+dWlvX29mZnNldCA9IFRNUEZTX0RJUkNPT0tJRV9FT0Y7CgkJbm9k
 ZS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0biA9IDA7CgkJbm9kZS0+dG5fc3Bl
 Yy50bl9kaXIudG5fcmVhZGRpcl9sYXN0cCA9IE5VTEw7Cgl9IGVsc2UgewoJCW5vZGUtPnRu
 X3NwZWMudG5fZGlyLnRuX3JlYWRkaXJfbGFzdG4gPSB1aW8tPnVpb19vZmZzZXQgPQoJCSAg
 ICB0bXBmc19kaXJjb29raWUoZGUpOwoJCW5vZGUtPnRuX3NwZWMudG5fZGlyLnRuX3JlYWRk
 aXJfbGFzdHAgPSBkZTsKCX0KCW5vZGUtPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX0FDQ0VT
 U0VEOwoJa21lbV9mcmVlKGRlbnRwLCBzaXplb2Yoc3RydWN0IGRpcmVudCkpOwoJcmV0dXJu
 IGVycm9yOwp9CgovKgogKiB0bXBmc19yZWdfcmVzaXplOiByZXNpemUgdGhlIHVuZGVybHlp
 bmcgVVZNIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIAogKiBzcGVjaWZpZWQgcmVndWxh
 ciBmaWxlLgogKi8KaW50CnRtcGZzX3JlZ19yZXNpemUoc3RydWN0IHZub2RlICp2cCwgb2Zm
 X3QgbmV3c2l6ZSkKewoJdG1wZnNfbW91bnRfdCAqdG1wID0gVkZTX1RPX1RNUEZTKHZwLT52
 X21vdW50KTsKCXRtcGZzX25vZGVfdCAqbm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJ
 c2l6ZV90IG5ld3BhZ2VzLCBvbGRwYWdlczsKCW9mZl90IG9sZHNpemU7CgoJS0FTU0VSVCh2
 cC0+dl90eXBlID09IFZSRUcpOwoJS0FTU0VSVChuZXdzaXplID49IDApOwoKCW9sZHNpemUg
 PSBub2RlLT50bl9zaXplOwoJb2xkcGFnZXMgPSByb3VuZF9wYWdlKG9sZHNpemUpID4+IFBB
 R0VfU0hJRlQ7CgluZXdwYWdlcyA9IHJvdW5kX3BhZ2UobmV3c2l6ZSkgPj4gUEFHRV9TSElG
 VDsKCUtBU1NFUlQob2xkcGFnZXMgPT0gbm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9ial9w
 YWdlcyk7CgoJaWYgKG5ld3BhZ2VzID4gb2xkcGFnZXMpIHsKCQkvKiBJbmNyZWFzZSB0aGUg
 dXNlZC1tZW1vcnkgY291bnRlciBpZiBnZXR0aW5nIGV4dHJhIHBhZ2VzLiAqLwoJCWlmICgh
 dG1wZnNfbWVtX2luY3IodG1wLCAobmV3cGFnZXMgLSBvbGRwYWdlcykgPDwgUEFHRV9TSElG
 VCkpIHsKCQkJcmV0dXJuIEVOT1NQQzsKCQl9Cgl9IGVsc2UgaWYgKG5ld3NpemUgPCBvbGRz
 aXplKSB7CgkJaW50IHplcm9sZW4gPSBNSU4ocm91bmRfcGFnZShuZXdzaXplKSwgbm9kZS0+
 dG5fc2l6ZSkgLSBuZXdzaXplOwoKCQkvKiBaZXJvIG91dCB0aGUgdHJ1bmNhdGVkIHBhcnQg
 b2YgdGhlIGxhc3QgcGFnZS4gKi8KCQl1dm1fdm5wX3plcm9yYW5nZSh2cCwgbmV3c2l6ZSwg
 emVyb2xlbik7Cgl9CgoJbm9kZS0+dG5fc3BlYy50bl9yZWcudG5fYW9ial9wYWdlcyA9IG5l
 d3BhZ2VzOwoJbm9kZS0+dG5fc2l6ZSA9IG5ld3NpemU7Cgl1dm1fdm5wX3NldHNpemUodnAs
 IG5ld3NpemUpOwoKCS8qCgkgKiBGcmVlICJiYWNraW5nIHN0b3JlIi4KCSAqLwoJaWYgKG5l
 d3BhZ2VzIDwgb2xkcGFnZXMpIHsKCQlzdHJ1Y3QgdXZtX29iamVjdCAqdW9iajsKCgkJdW9i
 aiA9IG5vZGUtPnRuX3NwZWMudG5fcmVnLnRuX2FvYmo7CgoJCW11dGV4X2VudGVyKCZ1b2Jq
 LT52bW9iamxvY2spOwoJCXVhb19kcm9wc3dhcF9yYW5nZSh1b2JqLCBuZXdwYWdlcywgb2xk
 cGFnZXMpOwoJCW11dGV4X2V4aXQoJnVvYmotPnZtb2JqbG9jayk7CgoJCS8qIERlY3JlYXNl
 IHRoZSB1c2VkLW1lbW9yeSBjb3VudGVyLiAqLwoJCXRtcGZzX21lbV9kZWNyKHRtcCwgKG9s
 ZHBhZ2VzIC0gbmV3cGFnZXMpIDw8IFBBR0VfU0hJRlQpOwoJfQoJaWYgKG5ld3NpemUgPiBv
 bGRzaXplKSB7CgkJVk5fS05PVEUodnAsIE5PVEVfRVhURU5EKTsKCX0KCXJldHVybiAwOwp9
 CgovKgogKiB0bXBmc19jaGZsYWdzOiBjaGFuZ2UgZmxhZ3Mgb2YgdGhlIGdpdmVuIHZub2Rl
 LgogKgogKiA9PiBDYWxsZXIgc2hvdWxkIHBlcmZvcm0gdG1wZnNfdXBkYXRlKCkuCiAqLwpp
 bnQKdG1wZnNfY2hmbGFncyh2bm9kZV90ICp2cCwgaW50IGZsYWdzLCBrYXV0aF9jcmVkX3Qg
 Y3JlZCwgbHdwX3QgKmwpCnsKCXRtcGZzX25vZGVfdCAqbm9kZSA9IFZQX1RPX1RNUEZTX05P
 REUodnApOwoJa2F1dGhfYWN0aW9uX3QgYWN0aW9uID0gS0FVVEhfVk5PREVfV1JJVEVfRkxB
 R1M7CglpbnQgZXJyb3IsIGZzX2RlY2lzaW9uID0gMDsKCglLQVNTRVJUKFZPUF9JU0xPQ0tF
 RCh2cCkpOwoKCS8qIERpc2FsbG93IHRoaXMgb3BlcmF0aW9uIGlmIHRoZSBmaWxlIHN5c3Rl
 bSBpcyBtb3VudGVkIHJlYWQtb25seS4gKi8KCWlmICh2cC0+dl9tb3VudC0+bW50X2ZsYWcg
 JiBNTlRfUkRPTkxZKQoJCXJldHVybiBFUk9GUzsKCglpZiAoa2F1dGhfY3JlZF9nZXRldWlk
 KGNyZWQpICE9IG5vZGUtPnRuX3VpZCkgewoJCWZzX2RlY2lzaW9uID0gRUFDQ0VTOwoJfQoK
 CS8qCgkgKiBJZiB0aGUgbmV3IGZsYWdzIGhhdmUgbm9uLXVzZXIgZmxhZ3MgdGhhdCBhcmUg
 ZGlmZmVyZW50IHRoYW4KCSAqIHRob3NlIG9uIHRoZSBub2RlLCB3ZSBuZWVkIHNwZWNpYWwg
 cGVybWlzc2lvbiB0byBjaGFuZ2UgdGhlbS4KCSAqLwoJaWYgKChmbGFncyAmIFNGX1NFVFRB
 QkxFKSAhPSAobm9kZS0+dG5fZmxhZ3MgJiBTRl9TRVRUQUJMRSkpIHsKCQlhY3Rpb24gfD0g
 S0FVVEhfVk5PREVfV1JJVEVfU1lTRkxBR1M7CgkJaWYgKCFmc19kZWNpc2lvbikgewoJCQlm
 c19kZWNpc2lvbiA9IEVQRVJNOwoJCX0KCX0KCgkvKgoJICogSW5kaWNhdGUgdGhhdCB0aGlz
 IG5vZGUncyBmbGFncyBoYXZlIHN5c3RlbSBhdHRyaWJ1dGVzIGluIHRoZW0gaWYKCSAqIHRo
 YXQncyB0aGUgY2FzZS4KCSAqLwoJaWYgKG5vZGUtPnRuX2ZsYWdzICYgKFNGX0lNTVVUQUJM
 RSB8IFNGX0FQUEVORCkpIHsKCQlhY3Rpb24gfD0gS0FVVEhfVk5PREVfSEFTX1NZU0ZMQUdT
 OwoJfQoKCWVycm9yID0ga2F1dGhfYXV0aG9yaXplX3Zub2RlKGNyZWQsIGFjdGlvbiwgdnAs
 IE5VTEwsIGZzX2RlY2lzaW9uKTsKCWlmIChlcnJvcikKCQlyZXR1cm4gZXJyb3I7CgoJLyoK
 CSAqIFNldCB0aGUgZmxhZ3MuIElmIHdlJ3JlIG5vdCBzZXR0aW5nIG5vbi11c2VyIGZsYWdz
 LCBiZSBjYXJlZnVsIG5vdAoJICogdG8gb3ZlcndyaXRlIHRoZW0uCgkgKgoJICogWFhYOiBD
 YW4ndCB3ZSBhbHdheXMgYXNzaWduIGhlcmU/IGlmIHRoZSBzeXN0ZW0gZmxhZ3MgYXJlIGRp
 ZmZlcmVudCwKCSAqICAgICAgdGhlIGNvZGUgYWJvdmUgc2hvdWxkIGNhdGNoIGF0dGVtcHRz
 IHRvIGNoYW5nZSB0aGVtIHdpdGhvdXQKCSAqICAgICAgcHJvcGVyIHBlcm1pc3Npb25zLCBh
 bmQgaWYgd2UncmUgaGVyZSBpdCBtZWFucyBpdCdzIG9rYXkgdG8KCSAqICAgICAgY2hhbmdl
 IHRoZW0uLi4KCSAqLwoJaWYgKChhY3Rpb24gJiBLQVVUSF9WTk9ERV9XUklURV9TWVNGTEFH
 UykgPT0gMCkgewoJCS8qIENsZWFyIGFsbCB1c2VyLXNldHRhYmxlIGZsYWdzIGFuZCByZS1z
 ZXQgdGhlbS4gKi8KCQlub2RlLT50bl9mbGFncyAmPSBTRl9TRVRUQUJMRTsKCQlub2RlLT50
 bl9mbGFncyB8PSAoZmxhZ3MgJiBVRl9TRVRUQUJMRSk7Cgl9IGVsc2UgewoJCW5vZGUtPnRu
 X2ZsYWdzID0gZmxhZ3M7Cgl9Cglub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9DSEFO
 R0VEOwoJVk5fS05PVEUodnAsIE5PVEVfQVRUUklCKTsKCXJldHVybiAwOwp9CgovKgogKiB0
 bXBmc19jaG1vZDogY2hhbmdlIGFjY2VzcyBtb2RlIG9uIHRoZSBnaXZlbiB2bm9kZS4KICoK
 ICogPT4gQ2FsbGVyIHNob3VsZCBwZXJmb3JtIHRtcGZzX3VwZGF0ZSgpLgogKi8KaW50CnRt
 cGZzX2NobW9kKHZub2RlX3QgKnZwLCBtb2RlX3QgbW9kZSwga2F1dGhfY3JlZF90IGNyZWQs
 IGx3cF90ICpsKQp7Cgl0bXBmc19ub2RlX3QgKm5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZw
 KTsKCWludCBlcnJvcjsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCS8qIERpc2Fs
 bG93IHRoaXMgb3BlcmF0aW9uIGlmIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIHJlYWQt
 b25seS4gKi8KCWlmICh2cC0+dl9tb3VudC0+bW50X2ZsYWcgJiBNTlRfUkRPTkxZKQoJCXJl
 dHVybiBFUk9GUzsKCgkvKiBJbW11dGFibGUgb3IgYXBwZW5kLW9ubHkgZmlsZXMgY2Fubm90
 IGJlIG1vZGlmaWVkLCBlaXRoZXIuICovCglpZiAobm9kZS0+dG5fZmxhZ3MgJiAoSU1NVVRB
 QkxFIHwgQVBQRU5EKSkKCQlyZXR1cm4gRVBFUk07CgoJZXJyb3IgPSBrYXV0aF9hdXRob3Jp
 emVfdm5vZGUoY3JlZCwgS0FVVEhfVk5PREVfV1JJVEVfU0VDVVJJVFksIHZwLAoJICAgIE5V
 TEwsIGdlbmZzX2Nhbl9jaG1vZCh2cC0+dl90eXBlLCBjcmVkLCBub2RlLT50bl91aWQsIG5v
 ZGUtPnRuX2dpZCwgbW9kZSkpOwoJaWYgKGVycm9yKSB7CgkJcmV0dXJuIGVycm9yOwoJfQoJ
 bm9kZS0+dG5fbW9kZSA9IChtb2RlICYgQUxMUEVSTVMpOwoJbm9kZS0+dG5fc3RhdHVzIHw9
 IFRNUEZTX05PREVfQ0hBTkdFRDsKCVZOX0tOT1RFKHZwLCBOT1RFX0FUVFJJQik7CglyZXR1
 cm4gMDsKfQoKLyoKICogdG1wZnNfY2hvd246IGNoYW5nZSBvd25lcnNoaXAgb2YgdGhlIGdp
 dmVuIHZub2RlLgogKgogKiA9PiBBdCBsZWFzdCBvbmUgb2YgdWlkIG9yIGdpZCBtdXN0IGJl
 IGRpZmZlcmVudCB0aGFuIFZOT1ZBTC4KICogPT4gQXR0cmlidXRlIGlzIHVuY2hhbmdlZCBm
 b3IgVk5PVkFMIGNhc2UuCiAqID0+IENhbGxlciBzaG91bGQgcGVyZm9ybSB0bXBmc191cGRh
 dGUoKS4KICovCmludAp0bXBmc19jaG93bih2bm9kZV90ICp2cCwgdWlkX3QgdWlkLCBnaWRf
 dCBnaWQsIGthdXRoX2NyZWRfdCBjcmVkLCBsd3BfdCAqbCkKewoJdG1wZnNfbm9kZV90ICpu
 b2RlID0gVlBfVE9fVE1QRlNfTk9ERSh2cCk7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChWT1Bf
 SVNMT0NLRUQodnApKTsKCgkvKiBBc3NpZ24gZGVmYXVsdCB2YWx1ZXMgaWYgdGhleSBhcmUg
 dW5rbm93bi4gKi8KCUtBU1NFUlQodWlkICE9IFZOT1ZBTCB8fCBnaWQgIT0gVk5PVkFMKTsK
 CWlmICh1aWQgPT0gVk5PVkFMKSB7CgkJdWlkID0gbm9kZS0+dG5fdWlkOwoJfQoJaWYgKGdp
 ZCA9PSBWTk9WQUwpIHsKCQlnaWQgPSBub2RlLT50bl9naWQ7Cgl9CgoJLyogRGlzYWxsb3cg
 dGhpcyBvcGVyYXRpb24gaWYgdGhlIGZpbGUgc3lzdGVtIGlzIG1vdW50ZWQgcmVhZC1vbmx5
 LiAqLwoJaWYgKHZwLT52X21vdW50LT5tbnRfZmxhZyAmIE1OVF9SRE9OTFkpCgkJcmV0dXJu
 IEVST0ZTOwoKCS8qIEltbXV0YWJsZSBvciBhcHBlbmQtb25seSBmaWxlcyBjYW5ub3QgYmUg
 bW9kaWZpZWQsIGVpdGhlci4gKi8KCWlmIChub2RlLT50bl9mbGFncyAmIChJTU1VVEFCTEUg
 fCBBUFBFTkQpKQoJCXJldHVybiBFUEVSTTsKCgllcnJvciA9IGthdXRoX2F1dGhvcml6ZV92
 bm9kZShjcmVkLCBLQVVUSF9WTk9ERV9DSEFOR0VfT1dORVJTSElQLCB2cCwKCSAgICBOVUxM
 LCBnZW5mc19jYW5fY2hvd24oY3JlZCwgbm9kZS0+dG5fdWlkLCBub2RlLT50bl9naWQsIHVp
 ZCwKCSAgICBnaWQpKTsKCWlmIChlcnJvcikgewoJCXJldHVybiBlcnJvcjsKCX0KCW5vZGUt
 PnRuX3VpZCA9IHVpZDsKCW5vZGUtPnRuX2dpZCA9IGdpZDsKCW5vZGUtPnRuX3N0YXR1cyB8
 PSBUTVBGU19OT0RFX0NIQU5HRUQ7CglWTl9LTk9URSh2cCwgTk9URV9BVFRSSUIpOwoJcmV0
 dXJuIDA7Cn0KCi8qCiAqIHRtcGZzX2Noc2l6ZTogY2hhbmdlIHNpemUgb2YgdGhlIGdpdmVu
 IHZub2RlLgogKi8KaW50CnRtcGZzX2Noc2l6ZSh2bm9kZV90ICp2cCwgdV9xdWFkX3Qgc2l6
 ZSwga2F1dGhfY3JlZF90IGNyZWQsIGx3cF90ICpsKQp7Cgl0bXBmc19ub2RlX3QgKm5vZGUg
 PSBWUF9UT19UTVBGU19OT0RFKHZwKTsKCglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoK
 CS8qIERlY2lkZSB3aGV0aGVyIHRoaXMgaXMgYSB2YWxpZCBvcGVyYXRpb24gYmFzZWQgb24g
 dGhlIGZpbGUgdHlwZS4gKi8KCXN3aXRjaCAodnAtPnZfdHlwZSkgewoJY2FzZSBWRElSOgoJ
 CXJldHVybiBFSVNESVI7CgljYXNlIFZSRUc6CgkJaWYgKHZwLT52X21vdW50LT5tbnRfZmxh
 ZyAmIE1OVF9SRE9OTFkpIHsKCQkJcmV0dXJuIEVST0ZTOwoJCX0KCQlicmVhazsKCWNhc2Ug
 VkJMSzoKCWNhc2UgVkNIUjoKCWNhc2UgVkZJRk86CgkJLyoKCQkgKiBBbGxvdyBtb2RpZmlj
 YXRpb25zIG9mIHNwZWNpYWwgZmlsZXMgZXZlbiBpZiBpbiB0aGUgZmlsZQoJCSAqIHN5c3Rl
 bSBpcyBtb3VudGVkIHJlYWQtb25seSAod2UgYXJlIG5vdCBtb2RpZnlpbmcgdGhlCgkJICog
 ZmlsZXMgdGhlbXNlbHZlcywgYnV0IHRoZSBvYmplY3RzIHRoZXkgcmVwcmVzZW50KS4KCQkg
 Ki8KCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIEVPUE5PVFNVUFA7Cgl9CgoJLyog
 SW1tdXRhYmxlIG9yIGFwcGVuZC1vbmx5IGZpbGVzIGNhbm5vdCBiZSBtb2RpZmllZCwgZWl0
 aGVyLiAqLwoJaWYgKG5vZGUtPnRuX2ZsYWdzICYgKElNTVVUQUJMRSB8IEFQUEVORCkpIHsK
 CQlyZXR1cm4gRVBFUk07Cgl9CgoJLyogTm90ZTogdG1wZnNfdHJ1bmNhdGUoKSB3aWxsIHJh
 aXNlIE5PVEVfRVhURU5EIGFuZCBOT1RFX0FUVFJJQi4gKi8KCXJldHVybiB0bXBmc190cnVu
 Y2F0ZSh2cCwgc2l6ZSk7Cn0KCi8qCiAqIHRtcGZzX2NodGltZXM6IGNoYW5nZSBhY2Nlc3Mg
 YW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBmb3Igdm5vZGUuCiAqLwppbnQKdG1wZnNfY2h0aW1l
 cyh2bm9kZV90ICp2cCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphdGltZSwKICAgIGNvbnN0
 IHN0cnVjdCB0aW1lc3BlYyAqbXRpbWUsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYnRpbWUs
 CiAgICBpbnQgdmFmbGFncywga2F1dGhfY3JlZF90IGNyZWQsIGx3cF90ICpsKQp7Cgl0bXBm
 c19ub2RlX3QgKm5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZwKTsKCWludCBlcnJvcjsKCglL
 QVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkpOwoKCS8qIERpc2FsbG93IHRoaXMgb3BlcmF0aW9u
 IGlmIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIHJlYWQtb25seS4gKi8KCWlmICh2cC0+
 dl9tb3VudC0+bW50X2ZsYWcgJiBNTlRfUkRPTkxZKQoJCXJldHVybiBFUk9GUzsKCgkvKiBJ
 bW11dGFibGUgb3IgYXBwZW5kLW9ubHkgZmlsZXMgY2Fubm90IGJlIG1vZGlmaWVkLCBlaXRo
 ZXIuICovCglpZiAobm9kZS0+dG5fZmxhZ3MgJiAoSU1NVVRBQkxFIHwgQVBQRU5EKSkKCQly
 ZXR1cm4gRVBFUk07CgoJZXJyb3IgPSBrYXV0aF9hdXRob3JpemVfdm5vZGUoY3JlZCwgS0FV
 VEhfVk5PREVfV1JJVEVfVElNRVMsIHZwLCBOVUxMLAoJICAgIGdlbmZzX2Nhbl9jaHRpbWVz
 KHZwLCB2YWZsYWdzLCBub2RlLT50bl91aWQsIGNyZWQpKTsKCWlmIChlcnJvcikKCQlyZXR1
 cm4gZXJyb3I7CgoJaWYgKGF0aW1lLT50dl9zZWMgIT0gVk5PVkFMICYmIGF0aW1lLT50dl9u
 c2VjICE9IFZOT1ZBTCkKCQlub2RlLT50bl9zdGF0dXMgfD0gVE1QRlNfTk9ERV9BQ0NFU1NF
 RDsKCglpZiAobXRpbWUtPnR2X3NlYyAhPSBWTk9WQUwgJiYgbXRpbWUtPnR2X25zZWMgIT0g
 Vk5PVkFMKQoJCW5vZGUtPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX01PRElGSUVEOwoKCWlm
 IChidGltZS0+dHZfc2VjID09IFZOT1ZBTCAmJiBidGltZS0+dHZfbnNlYyA9PSBWTk9WQUwp
 CgkJYnRpbWUgPSBOVUxMOwoKCXRtcGZzX3VwZGF0ZSh2cCwgYXRpbWUsIG10aW1lLCBidGlt
 ZSwgMCk7CglWTl9LTk9URSh2cCwgTk9URV9BVFRSSUIpOwoJcmV0dXJuIDA7Cn0KCi8qCiAq
 IHRtcGZzX3VwZGF0ZTogdXBkYXRlIHRpbWVzdGFtcHMsIGV0IGFsLgogKi8Kdm9pZAp0bXBm
 c191cGRhdGUodm5vZGVfdCAqdnAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWNjLAogICAg
 Y29uc3Qgc3RydWN0IHRpbWVzcGVjICptb2QsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYmly
 dGgsIGludCBmbGFncykKewoJdG1wZnNfbm9kZV90ICpub2RlID0gVlBfVE9fVE1QRlNfTk9E
 RSh2cCk7CglzdHJ1Y3QgdGltZXNwZWMgbm93dG07CgoJLyogS0FTU0VSVChWT1BfSVNMT0NL
 RUQodnApKTsgKi8KCglpZiAoZmxhZ3MgJiBVUERBVEVfQ0xPU0UpIHsKCQkvKiBYWFggTmVl
 ZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsPyAqLwoJfQoJaWYgKChub2RlLT50bl9zdGF0dXMg
 JiBUTVBGU19OT0RFX1NUQVRVU0FMTCkgPT0gMCkgewoJCXJldHVybjsKCX0KCWlmIChiaXJ0
 aCAhPSBOVUxMKSB7CgkJbm9kZS0+dG5fYmlydGh0aW1lID0gKmJpcnRoOwoJfQoJdmZzX3Rp
 bWVzdGFtcCgmbm93dG0pOwoKCWlmIChub2RlLT50bl9zdGF0dXMgJiBUTVBGU19OT0RFX0FD
 Q0VTU0VEKSB7CgkJbm9kZS0+dG5fYXRpbWUgPSBhY2MgPyAqYWNjIDogbm93dG07Cgl9Cglp
 ZiAobm9kZS0+dG5fc3RhdHVzICYgVE1QRlNfTk9ERV9NT0RJRklFRCkgewoJCW5vZGUtPnRu
 X210aW1lID0gbW9kID8gKm1vZCA6IG5vd3RtOwoJfQoJaWYgKG5vZGUtPnRuX3N0YXR1cyAm
 IFRNUEZTX05PREVfQ0hBTkdFRCkgewoJCW5vZGUtPnRuX2N0aW1lID0gbm93dG07Cgl9CgoJ
 bm9kZS0+dG5fc3RhdHVzICY9IH5UTVBGU19OT0RFX1NUQVRVU0FMTDsKfQoKaW50CnRtcGZz
 X3RydW5jYXRlKHZub2RlX3QgKnZwLCBvZmZfdCBsZW5ndGgpCnsKCXRtcGZzX25vZGVfdCAq
 bm9kZSA9IFZQX1RPX1RNUEZTX05PREUodnApOwoJaW50IGVycm9yOwoKCWlmIChsZW5ndGgg
 PCAwKSB7CgkJZXJyb3IgPSBFSU5WQUw7CgkJZ290byBvdXQ7Cgl9CglpZiAobm9kZS0+dG5f
 c2l6ZSA9PSBsZW5ndGgpIHsKCQllcnJvciA9IDA7CgkJZ290byBvdXQ7Cgl9CgllcnJvciA9
 IHRtcGZzX3JlZ19yZXNpemUodnAsIGxlbmd0aCk7CglpZiAoZXJyb3IgPT0gMCkgewoJCW5v
 ZGUtPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RFX0NIQU5HRUQgfCBUTVBGU19OT0RFX01PRElG
 SUVEOwoJfQpvdXQ6Cgl0bXBmc191cGRhdGUodnAsIE5VTEwsIE5VTEwsIE5VTEwsIDApOwoJ
 cmV0dXJuIGVycm9yOwp9CgAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1w
 ZnMvdG1wZnMuaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAyNTI1
 NwAxMjAyNjI2NjQyMgAwMDE2NjA3ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 LyoJJE5ldEJTRDogdG1wZnMuaCx2IDEuNDUgMjAxMS8wOS8yNyAwMToxMDo0MyBjaHJpc3Rv
 cyBFeHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IFRoZSBO
 ZXRCU0QgRm91bmRhdGlvbiwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBU
 aGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBO
 ZXRCU0QgRm91bmRhdGlvbgogKiBieSBKdWxpbyBNLiBNZXJpbm8gVmlkYWwsIGRldmVsb3Bl
 ZCBhcyBwYXJ0IG9mIEdvb2dsZSdzIFN1bW1lciBvZiBDb2RlCiAqIDIwMDUgcHJvZ3JhbS4K
 ICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
 cywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
 aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBS
 ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
 cHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
 Zm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
 Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwg
 dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
 biB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
 ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
 SURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwog
 KiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
 TFVESU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
 T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVS
 UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9O
 IE9SIENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
 LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwg
 REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
 CiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
 UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
 IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFD
 VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
 T1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
 UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBT
 VUNIIERBTUFHRS4KICovCgojaWZuZGVmIF9GU19UTVBGU19UTVBGU19IXwojZGVmaW5lIF9G
 U19UTVBGU19UTVBGU19IXwoKI2lmIDAgLy8gbm90IGluIDUuMSAtIHNvcnJ5IC4uLgojaWYg
 IWRlZmluZWQoX0tFUk5FTCkgJiYgIWRlZmluZWQoX0tNRU1VU0VSKQojZXJyb3IgIm5vdCBz
 dXBwb3NlZCB0byBiZSBleHBvc2VkIHRvIHVzZXJsYW5kIgojZW5kaWYKI2VuZGlmCgojaW5j
 bHVkZSA8c3lzL2RpcmVudC5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxz
 eXMvcG9vbC5oPgojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNpbmNsdWRlIDxzeXMvdm5vZGUu
 aD4KCi8qCiAqIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgdG1wZnMgZGlyZWN0b3J5
 IGVudHJ5LgogKgogKiBBbGwgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgdm5vZGUgbG9jay4K
 ICovCnR5cGVkZWYgc3RydWN0IHRtcGZzX2RpcmVudCB7CglUQUlMUV9FTlRSWSh0bXBmc19k
 aXJlbnQpCXRkX2VudHJpZXM7CgoJLyogUG9pbnRlciB0byB0aGUgaW5vZGUgdGhpcyBlbnRy
 eSByZWZlcnMgdG8uICovCglzdHJ1Y3QgdG1wZnNfbm9kZSAqCQl0ZF9ub2RlOwoKCS8qIE5h
 bWUgYW5kIGl0cyBsZW5ndGguICovCgljaGFyICoJCQkJdGRfbmFtZTsKCXVpbnQxNl90CQkJ
 dGRfbmFtZWxlbjsKfSB0bXBmc19kaXJlbnRfdDsKClRBSUxRX0hFQUQodG1wZnNfZGlyLCB0
 bXBmc19kaXJlbnQpOwoKI2lmIGRlZmluZWQoX0tFUk5FTCkKCiNkZWZpbmUgVE1QRlNfTUFY
 TkFNTEVOCTI1NQovKiBWYWxpZGF0ZSBtYXhpbXVtIHRkX25hbWVsZW4gbGVuZ3RoLiAqLwpD
 VEFTU0VSVChUTVBGU19NQVhOQU1MRU4gPCBVSU5UMTZfTUFYKTsKCiNkZWZpbmUJVE1QRlNf
 RElSQ09PS0lFX0RPVAkwCiNkZWZpbmUJVE1QRlNfRElSQ09PS0lFX0RPVERPVAkxCiNkZWZp
 bmUJVE1QRlNfRElSQ09PS0lFX0VPRgkyCgovKgogKiBFYWNoIGVudHJ5IGluIGEgZGlyZWN0
 b3J5IGhhcyBhIGNvb2tpZSB0aGF0IGlkZW50aWZpZXMgaXQuICBDb29raWVzCiAqIHN1cGVy
 c2VkZSBvZmZzZXRzIHdpdGhpbiBkaXJlY3RvcmllcywgYXMgdG1wZnMgaGFzIG5vIG9mZnNl
 dHMgYXMgc3VjaC4KICoKICogVGhlICcuJywgJy4uJyBhbmQgdGhlIGVuZCBvZiBkaXJlY3Rv
 cnkgbWFya2VycyBoYXZlIGZpeGVkIGNvb2tpZXMsCiAqIHdoaWNoIGNhbm5vdCBjb2xsaWRl
 IHdpdGggdGhlIGNvb2tpZXMgZ2VuZXJhdGVkIGJ5IG90aGVyIGVudHJpZXMuCiAqCiAqIFRo
 ZSBjb29raWVzIGZvciB0aGUgb3RoZXIgZW50cmllcyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9u
 IHRoZSBtZW1vcnkKICogYWRkcmVzcyBvZiB0aGVpciByZXByZXNlbnRhdGl2ZSBtZXRhLWRh
 dGEgc3RydWN0dXJlLgogKgogKiBYWFg6IFRydW5jYXRpbmcgZGlyZWN0b3J5IGNvb2tpZXMg
 dG8gMzEgYml0cyBub3cgLSB3b3JrYXJvdW5kIGZvcgogKiBwcm9ibGVtIHdpdGggTGludXgg
 Y29tcGF0LCBzZWUgUFIvMzIwMzQuCiAqLwpzdGF0aWMgaW5saW5lIG9mZl90CnRtcGZzX2Rp
 cmNvb2tpZSh0bXBmc19kaXJlbnRfdCAqZGUpCnsKCW9mZl90IGNvb2tpZTsKCgljb29raWUg
 PSAoKG9mZl90KSh1aW50cHRyX3QpZGUgPj4gMSkgJiAweDdGRkZGRkZGOwoJS0FTU0VSVChj
 b29raWUgIT0gVE1QRlNfRElSQ09PS0lFX0RPVCk7CglLQVNTRVJUKGNvb2tpZSAhPSBUTVBG
 U19ESVJDT09LSUVfRE9URE9UKTsKCUtBU1NFUlQoY29va2llICE9IFRNUEZTX0RJUkNPT0tJ
 RV9FT0YpOwoKCXJldHVybiBjb29raWU7Cn0KI2VuZGlmCgovKgogKiBJbnRlcm5hbCByZXBy
 ZXNlbnRhdGlvbiBvZiBhIHRtcGZzIGZpbGUgc3lzdGVtIG5vZGUgLS0gaW5vZGUuCiAqCiAq
 IFRoaXMgc3RydWN0dXJlIGlzIHNwbGl0dGVkIGluIHR3byBwYXJ0czogb25lIGhvbGRzIGF0
 dHJpYnV0ZXMgY29tbW9uCiAqIHRvIGFsbCBmaWxlIHR5cGVzIGFuZCB0aGUgb3RoZXIgaG9s
 ZHMgZGF0YSB0aGF0IGlzIG9ubHkgYXBwbGljYWJsZSB0bwogKiBhIHBhcnRpY3VsYXIgdHlw
 ZS4KICoKICogQWxsIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IHZub2RlIGxvY2suICBUaGUg
 dm5vZGUgYXNzb2NpYXRpb24gaXRzZWxmCiAqIGlzIHByb3RlY3RlZCBieSB0bXBmc19ub2Rl
 X3Q6OnRuX3Zsb2NrLgogKi8KdHlwZWRlZiBzdHJ1Y3QgdG1wZnNfbm9kZSB7CglMSVNUX0VO
 VFJZKHRtcGZzX25vZGUpCXRuX2VudHJpZXM7CgoJLyoKCSAqIEVhY2ggaW5vZGUgaGFzIGEg
 Y29ycmVzcG9uZGluZyB2bm9kZS4gIEl0IGlzIGEgYmktZGlyZWN0aW9uYWwKCSAqIGFzc29j
 aWF0aW9uLiAgV2hlbmV2ZXIgdm5vZGUgaXMgYWxsb2NhdGVkLCBpdHMgdl9kYXRhIGZpZWxk
 IGlzCgkgKiBzZXQgdG8gdGhlIGlub2RlIGl0IHJlZmVyZW5jZSwgYW5kIHRtcGZzX25vZGVf
 dDo6dG5fdm5vZGUgaXMKCSAqIHNldCB0byBwb2ludCB0byB0aGUgc2FpZCB2bm9kZS4KCSAq
 CgkgKiBGdXJ0aGVyIGF0dGVtcHRzIHRvIGFsbG9jYXRlIGEgdm5vZGUgZm9yIHRoaXMgc2Ft
 ZSBub2RlIHdpbGwKCSAqIHJlc3VsdCBpbiByZXR1cm5pbmcgYSBuZXcgcmVmZXJlbmNlIHRv
 IHRoZSB2YWx1ZSBzdG9yZWQgaW4KCSAqIHRuX3Zub2RlLiAgSXQgbWF5IGJlIE5VTEwgd2hl
 biB0aGUgbm9kZSBpcyB1bnVzZWQgKHRoYXQgaXMsCgkgKiBubyB2bm9kZSBoYXMgYmVlbiBh
 bGxvY2F0ZWQgb3IgaXQgaGFzIGJlZW4gcmVjbGFpbWVkKS4KCSAqLwoJa211dGV4X3QJCXRu
 X3Zsb2NrOwoJdm5vZGVfdCAqCQl0bl92bm9kZTsKCgkvKiBEaXJlY3RvcnkgZW50cnkuICBP
 bmx5IGEgaGludCwgc2luY2UgaGFyZCBsaW5rIGNhbiBoYXZlIG11bHRpcGxlLiAqLwoJdG1w
 ZnNfZGlyZW50X3QgKgl0bl9kaXJlbnRfaGludDsKCgkvKiBUaGUgaW5vZGUgdHlwZTogVkJM
 SywgVkNIUiwgVkRJUiwgVkZJRk8sIFZMTkssIFZSRUcgb3IgVlNPQ0suICovCgllbnVtIHZ0
 eXBlCQl0bl90eXBlOwoKCS8qIElub2RlIGlkZW50aWZpZXIgYW5kIGdlbmVyYXRpb24gbnVt
 YmVyLiAqLwoJaW5vX3QJCQl0bl9pZDsKCXVuc2lnbmVkIGxvbmcJCXRuX2dlbjsKCgkvKiBJ
 bm9kZSBzdGF0dXMgZmxhZ3MgKGZvciBvcGVyYXRpb25zIGluIGRlbGF5ZWQgbWFubmVyKS4g
 Ki8KCWludAkJCXRuX3N0YXR1czsKCgkvKiBUaGUgaW5vZGUgc2l6ZS4gKi8KCW9mZl90CQkJ
 dG5fc2l6ZTsKCgkvKiBHZW5lcmljIG5vZGUgYXR0cmlidXRlcy4gKi8KCXVpZF90CQkJdG5f
 dWlkOwoJZ2lkX3QJCQl0bl9naWQ7Cgltb2RlX3QJCQl0bl9tb2RlOwoJaW50CQkJdG5fZmxh
 Z3M7CglubGlua190CQkJdG5fbGlua3M7CglzdHJ1Y3QgdGltZXNwZWMJCXRuX2F0aW1lOwoJ
 c3RydWN0IHRpbWVzcGVjCQl0bl9tdGltZTsKCXN0cnVjdCB0aW1lc3BlYwkJdG5fY3RpbWU7
 CglzdHJ1Y3QgdGltZXNwZWMJCXRuX2JpcnRodGltZTsKCgkvKiBIZWFkIG9mIGJ5dGUtbGV2
 ZWwgbG9jayBsaXN0ICh1c2VkIGJ5IHRtcGZzX2FkdmxvY2spLiAqLwoJc3RydWN0IGxvY2tm
 ICoJCXRuX2xvY2tmOwoKCXVuaW9uIHsKCQkvKiBUeXBlIGNhc2U6IFZCTEsgb3IgVkNIUi4g
 Ki8KCQlzdHJ1Y3QgewoJCQlkZXZfdAkJCXRuX3JkZXY7CgkJfSB0bl9kZXY7CgoJCS8qIFR5
 cGUgY2FzZTogVkRJUi4gKi8KCQlzdHJ1Y3QgewoJCQkvKiBQYXJlbnQgZGlyZWN0b3J5IChy
 b290IGlub2RlIHBvaW50cyB0byBpdHNlbGYpLiAqLwoJCQlzdHJ1Y3QgdG1wZnNfbm9kZSAq
 CXRuX3BhcmVudDsKCgkJCS8qIExpc3Qgb2YgZGlyZWN0b3J5IGVudHJpZXMuICovCgkJCXN0
 cnVjdCB0bXBmc19kaXIJdG5fZGlyOwoKCQkJLyoKCQkJICogTnVtYmVyIGFuZCBwb2ludGVy
 IG9mIHRoZSBsYXN0IGRpcmVjdG9yeSBlbnRyeQoJCQkgKiByZXR1cm5lZCBieSB0aGUgcmVh
 ZGRpcigzKSBvcGVyYXRpb24uCgkJCSAqLwoJCQlvZmZfdAkJCXRuX3JlYWRkaXJfbGFzdG47
 CgkJCXN0cnVjdCB0bXBmc19kaXJlbnQgKgl0bl9yZWFkZGlyX2xhc3RwOwoJCX0gdG5fZGly
 OwoKCQkvKiBUeXBlIGNhc2U6IFZMTksuICovCgkJc3RydWN0IHRuX2xuayB7CgkJCS8qIFRo
 ZSBsaW5rJ3MgdGFyZ2V0LiAqLwoJCQljaGFyICoJCQl0bl9saW5rOwoJCX0gdG5fbG5rOwoK
 CQkvKiBUeXBlIGNhc2U6IFZSRUcuICovCgkJc3RydWN0IHRuX3JlZyB7CgkJCS8qIFVuZGVy
 bHlpbmcgVVZNIG9iamVjdCB0byBzdG9yZSBjb250ZW50cy4gKi8KCQkJc3RydWN0IHV2bV9v
 YmplY3QgKgl0bl9hb2JqOwoJCQlzaXplX3QJCQl0bl9hb2JqX3BhZ2VzOwoJCX0gdG5fcmVn
 OwoJfSB0bl9zcGVjOwp9IHRtcGZzX25vZGVfdDsKCiNpZiBkZWZpbmVkKF9LRVJORUwpCgpM
 SVNUX0hFQUQodG1wZnNfbm9kZV9saXN0LCB0bXBmc19ub2RlKTsKCi8qIFN0YXR1cyBmbGFn
 cy4gKi8KI2RlZmluZQlUTVBGU19OT0RFX0FDQ0VTU0VECTB4MDEKI2RlZmluZQlUTVBGU19O
 T0RFX01PRElGSUVECTB4MDIKI2RlZmluZQlUTVBGU19OT0RFX0NIQU5HRUQJMHgwNAoKI2Rl
 ZmluZQlUTVBGU19OT0RFX1NUQVRVU0FMTAlcCiAgICAoVE1QRlNfTk9ERV9BQ0NFU1NFRCB8
 IFRNUEZTX05PREVfTU9ESUZJRUQgfCBUTVBGU19OT0RFX0NIQU5HRUQpCgovKgogKiBCaXQg
 aW5kaWNhdGluZyB2bm9kZSByZWNsYW1hdGlvbi4KICogV2UgYWJ1c2UgdG1wZnNfbm9kZV90
 Ojp0bl9nZW4gZm9yIHRoYXQuCiAqLwojZGVmaW5lCVRNUEZTX05PREVfR0VOX01BU0sJKH4w
 VUwgPj4gMSkKI2RlZmluZQlUTVBGU19SRUNMQUlNSU5HX0JJVAkoflRNUEZTX05PREVfR0VO
 X01BU0spCgojZGVmaW5lCVRNUEZTX05PREVfUkVDTEFJTUlORyhub2RlKSBcCiAgICAoKChu
 b2RlKS0+dG5fZ2VuICYgVE1QRlNfUkVDTEFJTUlOR19CSVQpICE9IDApCgojZGVmaW5lCVRN
 UEZTX05PREVfR0VOKG5vZGUpIFwKICAgICgobm9kZSktPnRuX2dlbiAmIFRNUEZTX05PREVf
 R0VOX01BU0spCgovKiBXaGl0ZS1vdXQgaW5vZGUgaW5kaWNhdG9yLiAqLwojZGVmaW5lCVRN
 UEZTX05PREVfV0hJVEVPVVQJKCh0bXBmc19ub2RlX3QgKiktMSkKCi8qCiAqIEludGVybmFs
 IHJlcHJlc2VudGF0aW9uIG9mIGEgdG1wZnMgbW91bnQgcG9pbnQuCiAqLwp0eXBlZGVmIHN0
 cnVjdCB0bXBmc19tb3VudCB7CgkvKiBMaW1pdCBhbmQgbnVtYmVyIG9mIGJ5dGVzIGluIHVz
 ZSBieSB0aGUgZmlsZSBzeXN0ZW0uICovCgl1aW50NjRfdAkJdG1fbWVtX2xpbWl0OwoJdWlu
 dDY0X3QJCXRtX2J5dGVzX3VzZWQ7CglrbXV0ZXhfdAkJdG1fYWNjX2xvY2s7CgoJLyogUG9p
 bnRlciB0byB0aGUgcm9vdCBpbm9kZS4gKi8KCXRtcGZzX25vZGVfdCAqCQl0bV9yb290OwoK
 CS8qIE1heGltdW0gbnVtYmVyIG9mIHBvc3NpYmxlIG5vZGVzIGZvciB0aGlzIGZpbGUgc3lz
 dGVtLiAqLwoJdW5zaWduZWQgaW50CQl0bV9ub2Rlc19tYXg7CgoJLyogTnVtYmVyIG9mIG5v
 ZGVzIGN1cnJlbnRseSBhbGxvY2F0ZWQuICovCgl1bnNpZ25lZCBpbnQJCXRtX25vZGVzX2Nu
 dDsKCgkvKiBMaXN0IG9mIGlub2RlcyBhbmQgdGhlIGxvY2sgcHJvdGVjdGluZyBpdC4gKi8K
 CWttdXRleF90CQl0bV9sb2NrOwoJc3RydWN0IHRtcGZzX25vZGVfbGlzdAl0bV9ub2RlczsK
 fSB0bXBmc19tb3VudF90OwoKLyoKICogVGhpcyBzdHJ1Y3R1cmUgbWFwcyBhIGZpbGUgaWRl
 bnRpZmllciB0byBhIHRtcGZzIG5vZGUuICBVc2VkIGJ5IHRoZQogKiBORlMgY29kZS4KICov
 CnR5cGVkZWYgc3RydWN0IHRtcGZzX2ZpZCB7Cgl1aW50MTZfdAkJdGZfbGVuOwoJdWludDE2
 X3QJCXRmX3BhZDsKCXVpbnQzMl90CQl0Zl9nZW47Cglpbm9fdAkJCXRmX2lkOwp9IHRtcGZz
 X2ZpZF90OwoKLyoKICogUHJvdG90eXBlcyBmb3IgdG1wZnNfc3Vici5jLgogKi8KCmludAkJ
 dG1wZnNfYWxsb2Nfbm9kZSh0bXBmc19tb3VudF90ICosIGVudW0gdnR5cGUsIHVpZF90LCBn
 aWRfdCwKCQkgICAgbW9kZV90LCBjaGFyICosIGRldl90LCB0bXBmc19ub2RlX3QgKiopOwp2
 b2lkCQl0bXBmc19mcmVlX25vZGUodG1wZnNfbW91bnRfdCAqLCB0bXBmc19ub2RlX3QgKik7
 CgppbnQJCXRtcGZzX2FsbG9jX2ZpbGUodm5vZGVfdCAqLCB2bm9kZV90ICoqLCBzdHJ1Y3Qg
 dmF0dHIgKiwKCQkgICAgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwgY2hhciAqKTsKCmludAkJ
 dG1wZnNfdm5vZGVfZ2V0KHN0cnVjdCBtb3VudCAqLCB0bXBmc19ub2RlX3QgKiwgdm5vZGVf
 dCAqKik7CgppbnQJCXRtcGZzX2FsbG9jX2RpcmVudCh0bXBmc19tb3VudF90ICosIGNvbnN0
 IGNoYXIgKiwgdWludDE2X3QsCgkJICAgIHRtcGZzX2RpcmVudF90ICoqKTsKdm9pZAkJdG1w
 ZnNfZnJlZV9kaXJlbnQodG1wZnNfbW91bnRfdCAqLCB0bXBmc19kaXJlbnRfdCAqKTsKdm9p
 ZAkJdG1wZnNfZGlyX2F0dGFjaCh2bm9kZV90ICosIHRtcGZzX2RpcmVudF90ICosIHRtcGZz
 X25vZGVfdCAqKTsKdm9pZAkJdG1wZnNfZGlyX2RldGFjaCh2bm9kZV90ICosIHRtcGZzX2Rp
 cmVudF90ICopOwoKdG1wZnNfZGlyZW50X3QgKnRtcGZzX2Rpcl9sb29rdXAodG1wZnNfbm9k
 ZV90ICosIHN0cnVjdCBjb21wb25lbnRuYW1lICopOwp0bXBmc19kaXJlbnRfdCAqdG1wZnNf
 ZGlyX2NhY2hlZCh0bXBmc19ub2RlX3QgKik7CgppbnQJCXRtcGZzX2Rpcl9nZXRkb3RkZW50
 KHRtcGZzX25vZGVfdCAqLCBzdHJ1Y3QgdWlvICopOwppbnQJCXRtcGZzX2Rpcl9nZXRkb3Rk
 b3RkZW50KHRtcGZzX25vZGVfdCAqLCBzdHJ1Y3QgdWlvICopOwp0bXBmc19kaXJlbnRfdCAq
 dG1wZnNfZGlyX2xvb2t1cGJ5Y29va2llKHRtcGZzX25vZGVfdCAqLCBvZmZfdCk7CmludAkJ
 dG1wZnNfZGlyX2dldGRlbnRzKHRtcGZzX25vZGVfdCAqLCBzdHJ1Y3QgdWlvICosIG9mZl90
 ICopOwoKaW50CQl0bXBmc19yZWdfcmVzaXplKHZub2RlX3QgKiwgb2ZmX3QpOwppbnQJCXRt
 cGZzX3RydW5jYXRlKHZub2RlX3QgKiwgb2ZmX3QpOwoKaW50CQl0bXBmc19jaGZsYWdzKHZu
 b2RlX3QgKiwgaW50LCBrYXV0aF9jcmVkX3QsIGx3cF90ICopOwppbnQJCXRtcGZzX2NobW9k
 KHZub2RlX3QgKiwgbW9kZV90LCBrYXV0aF9jcmVkX3QsIGx3cF90ICopOwppbnQJCXRtcGZz
 X2Nob3duKHZub2RlX3QgKiwgdWlkX3QsIGdpZF90LCBrYXV0aF9jcmVkX3QsIGx3cF90ICop
 OwppbnQJCXRtcGZzX2Noc2l6ZSh2bm9kZV90ICosIHVfcXVhZF90LCBrYXV0aF9jcmVkX3Qs
 IGx3cF90ICopOwppbnQJCXRtcGZzX2NodGltZXModm5vZGVfdCAqLCBjb25zdCBzdHJ1Y3Qg
 dGltZXNwZWMgKiwKCQkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHN0cnVj
 dCB0aW1lc3BlYyAqLCBpbnQsCgkJICAgIGthdXRoX2NyZWRfdCwgbHdwX3QgKik7CnZvaWQJ
 CXRtcGZzX3VwZGF0ZSh2bm9kZV90ICosIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLAoJCSAg
 ICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGlu
 dCk7CgovKgogKiBQcm90b3R5cGVzIGZvciB0bXBmc19tZW0uYy4KICovCgp2b2lkCQl0bXBm
 c19tbnRtZW1faW5pdCh0bXBmc19tb3VudF90ICosIHVpbnQ2NF90KTsKdm9pZAkJdG1wZnNf
 bW50bWVtX2Rlc3Ryb3kodG1wZnNfbW91bnRfdCAqKTsKCnNpemVfdAkJdG1wZnNfbWVtX2lu
 Zm8oYm9vbCk7CnVpbnQ2NF90CXRtcGZzX2J5dGVzX21heCh0bXBmc19tb3VudF90ICopOwpz
 aXplX3QJCXRtcGZzX3BhZ2VzX2F2YWlsKHRtcGZzX21vdW50X3QgKik7CmJvb2wJCXRtcGZz
 X21lbV9pbmNyKHRtcGZzX21vdW50X3QgKiwgc2l6ZV90KTsKdm9pZAkJdG1wZnNfbWVtX2Rl
 Y3IodG1wZnNfbW91bnRfdCAqLCBzaXplX3QpOwoKdG1wZnNfZGlyZW50X3QgKnRtcGZzX2Rp
 cmVudF9nZXQodG1wZnNfbW91bnRfdCAqKTsKdm9pZAkJdG1wZnNfZGlyZW50X3B1dCh0bXBm
 c19tb3VudF90ICosIHRtcGZzX2RpcmVudF90ICopOwoKdG1wZnNfbm9kZV90ICoJdG1wZnNf
 bm9kZV9nZXQodG1wZnNfbW91bnRfdCAqKTsKdm9pZAkJdG1wZnNfbm9kZV9wdXQodG1wZnNf
 bW91bnRfdCAqLCB0bXBmc19ub2RlX3QgKik7CgpjaGFyICoJCXRtcGZzX3N0cm5hbWVfYWxs
 b2ModG1wZnNfbW91bnRfdCAqLCBzaXplX3QpOwp2b2lkCQl0bXBmc19zdHJuYW1lX2ZyZWUo
 dG1wZnNfbW91bnRfdCAqLCBjaGFyICosIHNpemVfdCk7CmJvb2wJCXRtcGZzX3N0cm5hbWVf
 bmVxbGVuKHN0cnVjdCBjb21wb25lbnRuYW1lICosIHN0cnVjdCBjb21wb25lbnRuYW1lICop
 OwoKLyoKICogRW5zdXJlcyB0aGF0IHRoZSBub2RlIHBvaW50ZWQgYnkgJ25vZGUnIGlzIGEg
 ZGlyZWN0b3J5IGFuZCB0aGF0IGl0cwogKiBjb250ZW50cyBhcmUgY29uc2lzdGVudCB3aXRo
 IHJlc3BlY3QgdG8gZGlyZWN0b3JpZXMuCiAqLwojZGVmaW5lIFRNUEZTX1ZBTElEQVRFX0RJ
 Uihub2RlKSBcCiAgICBLQVNTRVJUKChub2RlKS0+dG5fdHlwZSA9PSBWRElSKTsgXAogICAg
 S0FTU0VSVCgobm9kZSktPnRuX3NpemUgJSBzaXplb2YodG1wZnNfZGlyZW50X3QpID09IDAp
 OyBcCiAgICBLQVNTRVJUKChub2RlKS0+dG5fc3BlYy50bl9kaXIudG5fcmVhZGRpcl9sYXN0
 cCA9PSBOVUxMIHx8IFwKICAgICAgICB0bXBmc19kaXJjb29raWUoKG5vZGUpLT50bl9zcGVj
 LnRuX2Rpci50bl9yZWFkZGlyX2xhc3RwKSA9PSBcCiAgICAgICAgKG5vZGUpLT50bl9zcGVj
 LnRuX2Rpci50bl9yZWFkZGlyX2xhc3RuKTsKCi8qCiAqIE1lbW9yeSBtYW5hZ2VtZW50IHN0
 dWZmLgogKi8KCi8qIEFtb3VudCBvZiBtZW1vcnkgcGFnZXMgdG8gcmVzZXJ2ZSBmb3IgdGhl
 IHN5c3RlbS4gKi8KI2RlZmluZQlUTVBGU19QQUdFU19SRVNFUlZFRAkoNCAqIDEwMjQgKiAx
 MDI0IC8gUEFHRV9TSVpFKQoKLyoKICogUm91dGluZXMgdG8gY29udmVydCBWRlMgc3RydWN0
 dXJlcyB0byB0bXBmcyBpbnRlcm5hbCBvbmVzLgogKi8KCnN0YXRpYyBpbmxpbmUgdG1wZnNf
 bW91bnRfdCAqClZGU19UT19UTVBGUyhzdHJ1Y3QgbW91bnQgKm1wKQp7Cgl0bXBmc19tb3Vu
 dF90ICp0bXAgPSBtcC0+bW50X2RhdGE7CgoJS0FTU0VSVCh0bXAgIT0gTlVMTCk7CglyZXR1
 cm4gdG1wOwp9CgpzdGF0aWMgaW5saW5lIHRtcGZzX25vZGVfdCAqClZQX1RPX1RNUEZTX0RJ
 Uih2bm9kZV90ICp2cCkKewoJdG1wZnNfbm9kZV90ICpub2RlID0gdnAtPnZfZGF0YTsKCglL
 QVNTRVJUKG5vZGUgIT0gTlVMTCk7CglUTVBGU19WQUxJREFURV9ESVIobm9kZSk7CglyZXR1
 cm4gbm9kZTsKfQoKI2VuZGlmIC8qIGRlZmluZWQoX0tFUk5FTCkgKi8KCnN0YXRpYyBfX2lu
 bGluZSB0bXBmc19ub2RlX3QgKgpWUF9UT19UTVBGU19OT0RFKHZub2RlX3QgKnZwKQp7Cgl0
 bXBmc19ub2RlX3QgKm5vZGUgPSB2cC0+dl9kYXRhOwojaWZkZWYgS0FTU0VSVAoJS0FTU0VS
 VChub2RlICE9IE5VTEwpOwojZW5kaWYKCXJldHVybiBub2RlOwp9CgojZW5kaWYgLyogX0ZT
 X1RNUEZTX1RNUEZTX0hfICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL2Zz
 L3RtcGZzL2ZpbGVzLnRtcGZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDQ0NAAwMDAwMDAwADAwMDAwMDAAMDAwMDAw
 MDA1MjAAMTIwMjQ2MDM0NjUAMDAxNzQ0NAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAACMJJE5ldEJTRDogZmlsZXMudG1wZnMsdiAxLjIgMjAwNS8xMi8xMSAxMjoyNDoyOSBj
 aHJpc3RvcyBFeHAgJAoKZGVmZnMJZnNfdG1wZnMuaAkJCVRNUEZTCgpmaWxlCWZzL3RtcGZz
 L3RtcGZzX2ZpZm9vcHMuYwl0bXBmcwpmaWxlCWZzL3RtcGZzL3RtcGZzX21lbS5jCQl0bXBm
 cwpmaWxlCWZzL3RtcGZzL3RtcGZzX3JlbmFtZS5jCXRtcGZzCmZpbGUJZnMvdG1wZnMvdG1w
 ZnNfc3BlY29wcy5jCXRtcGZzCmZpbGUJZnMvdG1wZnMvdG1wZnNfc3Vici5jCQl0bXBmcwpm
 aWxlCWZzL3RtcGZzL3RtcGZzX3Zmc29wcy5jCQl0bXBmcwpmaWxlCWZzL3RtcGZzL3RtcGZz
 X3Zub3BzLmMJCXRtcGZzCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9mcy90
 bXBmcy90bXBmc19yZW5hbWUuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA0NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDQx
 MDY0ADEyMDI2NjI2NzAyADAwMjAxMjQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAvKgkkTmV0QlNEOiB0bXBmc19yZW5hbWUuYyx2IDEuMiAyMDEyLzA1LzA5IDIyOjQ2OjI1
 IHJpYXN0cmFkaCBFeHAgJAkqLwoKLyotCiAqIENvcHlyaWdodCAoYykgMjAxMiBUaGUgTmV0
 QlNEIEZvdW5kYXRpb24sIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhp
 cyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0
 QlNEIEZvdW5kYXRpb24KICogYnkgVGF5bG9yIFIgQ2FtcGJlbGwuCiAqCiAqIFJlZGlzdHJp
 YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
 aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
 Zm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25z
 IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAg
 bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
 bGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
 b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
 b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRv
 Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
 aXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE5F
 VEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKICogYGBBUyBJUycnIEFO
 RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
 VCBMSU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
 TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJU0NM
 QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklCVVRP
 UlMKICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
 U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
 RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElUVVRF
 IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
 QlVTSU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
 RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
 SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKICog
 QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
 RU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAq
 LwoKLyoKICogdG1wZnMgcmVuYW1lCiAqLwoKI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgpfX0tF
 Uk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogdG1wZnNfcmVuYW1lLmMsdiAxLjIgMjAxMi8wNS8w
 OSAyMjo0NjoyNSByaWFzdHJhZGggRXhwICQiKTsKCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4K
 I2luY2x1ZGUgPHN5cy9lcnJuby5oPgojaW5jbHVkZSA8c3lzL2thdXRoLmg+CiNpbmNsdWRl
 IDxzeXMvbW91bnQuaD4KI2luY2x1ZGUgPHN5cy9uYW1laS5oPgojaW5jbHVkZSA8c3lzL3N0
 YXQuaD4KI2luY2x1ZGUgPHN5cy92bm9kZS5oPgojaW5jbHVkZSA8c3lzL3Zub2RlX2lmLmg+
 CgojaWYgMCAvLyBub3QgaW4gNS4xLnggLi4KI2luY2x1ZGUgPG1pc2Nmcy9nZW5mcy9nZW5m
 cy5oPgojZW5kaWYKCiNpbmNsdWRlIDxmcy90bXBmcy90bXBmc192bm9wcy5oPgojaW5jbHVk
 ZSA8ZnMvdG1wZnMvdG1wZnMuaD4KCiNpZiAxIC8vIG5lZWRlZCBpbiA1LjEueCBhcyB3b3Jr
 YXJvdW5kIGluc3RlYWQgLi4uCiNpbmNsdWRlIDxmcy90bXBmcy9nZW5mc19yZW5hbWUuYz4K
 I2VuZGlmCgovKgogKiBGb3J3YXJkIGRlY2xhcmF0aW9ucwogKi8KCnN0YXRpYyBpbnQgdG1w
 ZnNfc2FuZV9yZW5hbWUoc3RydWN0IHZub2RlICosIHN0cnVjdCBjb21wb25lbnRuYW1lICos
 CiAgICBzdHJ1Y3Qgdm5vZGUgKiwgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwKICAgIGthdXRo
 X2NyZWRfdCwgYm9vbCk7CnN0YXRpYyBib29sIHRtcGZzX3JtZGlyZWRfcChzdHJ1Y3Qgdm5v
 ZGUgKik7CnN0YXRpYyBpbnQgdG1wZnNfZ3JvX2xvY2tfZGlyZWN0b3J5KHN0cnVjdCBtb3Vu
 dCAqLCBzdHJ1Y3Qgdm5vZGUgKik7CgpzdGF0aWMgY29uc3Qgc3RydWN0IGdlbmZzX3JlbmFt
 ZV9vcHMgdG1wZnNfZ2VuZnNfcmVuYW1lX29wczsKCi8qCiAqIHRtcGZzX3NhbmVfcmVuYW1l
 OiBUaGUgaGFpcmllc3Qgdm9wLCB3aXRoIHRoZSBzYW5lciBBUEkuCiAqCiAqIEFyZ3VtZW50
 czoKICoKICogLiBmZHZwIChmcm9tIGRpcmVjdG9yeSB2bm9kZSksCiAqIC4gZmNucCAoZnJv
 bSBjb21wb25lbnQgbmFtZSksCiAqIC4gdGR2cCAodG8gZGlyZWN0b3J5IHZub2RlKSwKICog
 LiB0Y25wICh0byBjb21wb25lbnQgbmFtZSksCiAqIC4gY3JlZCAoY3JlZGVudGlhbHMgc3Ry
 dWN0dXJlKSwgYW5kCiAqIC4gcG9zaXhseV9jb3JyZWN0IChmbGFnIGZvciBiZWhhdmlvdXIg
 aWYgdGFyZ2V0ICYgc291cmNlIGxpbmsgc2FtZSBmaWxlKS4KICoKICogZmR2cCBhbmQgdGR2
 cCBtYXkgYmUgdGhlIHNhbWUsIGFuZCBtdXN0IGJlIHJlZmVyZW5jZWQgYW5kIHVubG9ja2Vk
 LgogKi8Kc3RhdGljIGludAp0bXBmc19zYW5lX3JlbmFtZSgKICAgIHN0cnVjdCB2bm9kZSAq
 ZmR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUgKmZjbnAsCiAgICBzdHJ1Y3Qgdm5vZGUgKnRk
 dnAsIHN0cnVjdCBjb21wb25lbnRuYW1lICp0Y25wLAogICAga2F1dGhfY3JlZF90IGNyZWQs
 IGJvb2wgcG9zaXhseV9jb3JyZWN0KQp7CglzdHJ1Y3QgdG1wZnNfZGlyZW50ICpmZGlyZW50
 LCAqdGRpcmVudDsKCglyZXR1cm4gZ2VuZnNfc2FuZV9yZW5hbWUoJnRtcGZzX2dlbmZzX3Jl
 bmFtZV9vcHMsCgkgICAgZmR2cCwgZmNucCwgJmZkaXJlbnQsIHRkdnAsIHRjbnAsICZ0ZGly
 ZW50LAoJICAgIGNyZWQsIHBvc2l4bHlfY29ycmVjdCk7Cn0KCi8qCiAqIHRtcGZzX3JlbmFt
 ZTogVGhlIGhhaXJpZXN0IHZvcCwgd2l0aCB0aGUgaW5zYW5lc3QgQVBJLiAgRGVmZXIgdG8K
 ICogZ2VuZnNfaW5zYW5lX3JlbmFtZSBpbW1lZGlhdGVseS4KICovCmludAp0bXBmc19yZW5h
 bWUodm9pZCAqdikKewoKCXJldHVybiBnZW5mc19pbnNhbmVfcmVuYW1lKHYsICZ0bXBmc19z
 YW5lX3JlbmFtZSk7Cn0KCi8qCiAqIHRtcGZzX2dyb19kaXJlY3RvcnlfZW1wdHlfcDogUmV0
 dXJuIHRydWUgaWYgdGhlIGRpcmVjdG9yeSB2cCBpcwogKiBlbXB0eS4gIGR2cCBpcyBpdHMg
 cGFyZW50LgogKgogKiB2cCBhbmQgZHZwIG11c3QgYmUgbG9ja2VkIGFuZCByZWZlcmVuY2Vk
 LgogKi8Kc3RhdGljIGJvb2wKdG1wZnNfZ3JvX2RpcmVjdG9yeV9lbXB0eV9wKHN0cnVjdCBt
 b3VudCAqbXAsIGthdXRoX2NyZWRfdCBjcmVkLAogICAgc3RydWN0IHZub2RlICp2cCwgc3Ry
 dWN0IHZub2RlICpkdnApCnsKCgkodm9pZCltcDsKCSh2b2lkKWNyZWQ7Cgkodm9pZClkdnA7
 CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FTU0VSVCh2cCAhPSBOVUxMKTsKCUtBU1NFUlQo
 ZHZwICE9IE5VTEwpOwoJS0FTU0VSVCh2cCAhPSBkdnApOwoJS0FTU0VSVCh2cC0+dl9tb3Vu
 dCA9PSBtcCk7CglLQVNTRVJUKGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKFZPUF9J
 U0xPQ0tFRCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2
 cCkgPT0gTEtfRVhDTFVTSVZFKTsKCglyZXR1cm4gKFZQX1RPX1RNUEZTX05PREUodnApLT50
 bl9zaXplID09IDApOwp9CgovKgogKiB0bXBmc19ncm9fcmVuYW1lX2NoZWNrX3Bvc3NpYmxl
 OiBDaGVjayB3aGV0aGVyIGEgcmVuYW1lIGlzIHBvc3NpYmxlCiAqIGluZGVwZW5kZW50IG9m
 IGNyZWRlbnRpYWxzLgogKi8Kc3RhdGljIGludAp0bXBmc19ncm9fcmVuYW1lX2NoZWNrX3Bv
 c3NpYmxlKHN0cnVjdCBtb3VudCAqbXAsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAsIHN0cnVj
 dCB2bm9kZSAqZnZwLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBzdHJ1Y3Qgdm5vZGUgKnR2
 cCkKewoKCSh2b2lkKW1wOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAh
 PSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VSVCh0ZHZwICE9IE5VTEwp
 OwoJS0FTU0VSVChmZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAgIT0gdHZwKTsKCUtBU1NF
 UlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7CglLQVNTRVJUKGZ2cCAh
 PSB0dnApOwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHRkdnAt
 PnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQoZmR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNT
 RVJUKGZ2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKHRkdnAtPnZfbW91bnQgPT0gbXAp
 OwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8ICh0dnAtPnZfbW91bnQgPT0gbXApKTsKCUtB
 U1NFUlQoVk9QX0lTTE9DS0VEKGZkdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZP
 UF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tF
 RCh0ZHZwKSA9PSBMS19FWENMVVNJVkUpOwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8IChW
 T1BfSVNMT0NLRUQodHZwKSA9PSBMS19FWENMVVNJVkUpKTsKCglyZXR1cm4gZ2VuZnNfdWZz
 bGlrZV9yZW5hbWVfY2hlY2tfcG9zc2libGUoCgkgICAgVlBfVE9fVE1QRlNfTk9ERShmZHZw
 KS0+dG5fZmxhZ3MsIFZQX1RPX1RNUEZTX05PREUoZnZwKS0+dG5fZmxhZ3MsCgkgICAgVlBf
 VE9fVE1QRlNfTk9ERSh0ZHZwKS0+dG5fZmxhZ3MsCgkgICAgKHR2cD8gVlBfVE9fVE1QRlNf
 Tk9ERSh0dnApLT50bl9mbGFncyA6IDApLCAodHZwICE9IE5VTEwpLAoJICAgIElNTVVUQUJM
 RSwgQVBQRU5EKTsKfQoKLyoKICogdG1wZnNfZ3JvX3JlbmFtZV9jaGVja19wZXJtaXR0ZWQ6
 IENoZWNrIHdoZXRoZXIgYSByZW5hbWUgaXMKICogcGVybWl0dGVkIGdpdmVuIG91ciBjcmVk
 ZW50aWFscy4KICovCnN0YXRpYyBpbnQKdG1wZnNfZ3JvX3JlbmFtZV9jaGVja19wZXJtaXR0
 ZWQoc3RydWN0IG1vdW50ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5v
 ZGUgKmZkdnAsIHN0cnVjdCB2bm9kZSAqZnZwLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBz
 dHJ1Y3Qgdm5vZGUgKnR2cCkKewoKCSh2b2lkKW1wOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsK
 CUtBU1NFUlQoZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VS
 VCh0ZHZwICE9IE5VTEwpOwoJS0FTU0VSVChmZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAg
 IT0gdHZwKTsKCUtBU1NFUlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7
 CglLQVNTRVJUKGZ2cCAhPSB0dnApOwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7
 CglLQVNTRVJUKHRkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQoZmR2cC0+dl9tb3Vu
 dCA9PSBtcCk7CglLQVNTRVJUKGZ2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKHRkdnAt
 PnZfbW91bnQgPT0gbXApOwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8ICh0dnAtPnZfbW91
 bnQgPT0gbXApKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGZkdnApID09IExLX0VYQ0xVU0lW
 RSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNT
 RVJUKFZPUF9JU0xPQ0tFRCh0ZHZwKSA9PSBMS19FWENMVVNJVkUpOwoJS0FTU0VSVCgodHZw
 ID09IE5VTEwpIHx8IChWT1BfSVNMT0NLRUQodHZwKSA9PSBMS19FWENMVVNJVkUpKTsKCgly
 ZXR1cm4gZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tfcGVybWl0dGVkKGNyZWQsCgkgICAg
 ZmR2cCwgVlBfVE9fVE1QRlNfTk9ERShmZHZwKS0+dG5fbW9kZSwKCSAgICBWUF9UT19UTVBG
 U19OT0RFKGZkdnApLT50bl91aWQsCgkgICAgZnZwLCBWUF9UT19UTVBGU19OT0RFKGZ2cCkt
 PnRuX3VpZCwKCSAgICB0ZHZwLCBWUF9UT19UTVBGU19OT0RFKHRkdnApLT50bl9tb2RlLAoJ
 ICAgIFZQX1RPX1RNUEZTX05PREUodGR2cCktPnRuX3VpZCwKCSAgICB0dnAsICh0dnA/IFZQ
 X1RPX1RNUEZTX05PREUodHZwKS0+dG5fdWlkIDogMCkpOwp9CgovKgogKiB0bXBmc19ncm9f
 cmVtb3ZlX2NoZWNrX3Bvc3NpYmxlOiBDaGVjayB3aGV0aGVyIGEgcmVtb3ZlIGlzIHBvc3Np
 YmxlCiAqIGluZGVwZW5kZW50IG9mIGNyZWRlbnRpYWxzLgogKi8Kc3RhdGljIGludAp0bXBm
 c19ncm9fcmVtb3ZlX2NoZWNrX3Bvc3NpYmxlKHN0cnVjdCBtb3VudCAqbXAsCiAgICBzdHJ1
 Y3Qgdm5vZGUgKmR2cCwgc3RydWN0IHZub2RlICp2cCkKewoKCSh2b2lkKW1wOwoJS0FTU0VS
 VChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZHZwICE9IE5VTEwpOwoJS0FTU0VSVCh2cCAhPSBO
 VUxMKTsKCUtBU1NFUlQoZHZwICE9IHZwKTsKCUtBU1NFUlQoZHZwLT52X3R5cGUgPT0gVkRJ
 Uik7CglLQVNTRVJUKHZwLT52X3R5cGUgIT0gVkRJUik7CglLQVNTRVJUKGR2cC0+dl9tb3Vu
 dCA9PSBtcCk7CglLQVNTRVJUKHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQoVk9QX0lT
 TE9DS0VEKGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZw
 KSA9PSBMS19FWENMVVNJVkUpOwoKCXJldHVybiBnZW5mc191ZnNsaWtlX3JlbW92ZV9jaGVj
 a19wb3NzaWJsZSgKCSAgICBWUF9UT19UTVBGU19OT0RFKGR2cCktPnRuX2ZsYWdzLCBWUF9U
 T19UTVBGU19OT0RFKHZwKS0+dG5fZmxhZ3MsCgkgICAgSU1NVVRBQkxFLCBBUFBFTkQpOwp9
 CgovKgogKiB0bXBmc19ncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZDogQ2hlY2sgd2hldGhl
 ciBhIHJlbW92ZSBpcwogKiBwZXJtaXR0ZWQgZ2l2ZW4gb3VyIGNyZWRlbnRpYWxzLgogKi8K
 c3RhdGljIGludAp0bXBmc19ncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChzdHJ1Y3QgbW91
 bnQgKm1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKICAgIHN0cnVjdCB2bm9kZSAqZHZwLCBzdHJ1
 Y3Qgdm5vZGUgKnZwKQp7CgoJKHZvaWQpbXA7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FT
 U0VSVChkdnAgIT0gTlVMTCk7CglLQVNTRVJUKHZwICE9IE5VTEwpOwoJS0FTU0VSVChkdnAg
 IT0gdnApOwoJS0FTU0VSVChkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodnAtPnZf
 dHlwZSAhPSBWRElSKTsKCUtBU1NFUlQoZHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQo
 dnAtPnZfbW91bnQgPT0gbXApOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZHZwKSA9PSBMS19F
 WENMVVNJVkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQodnApID09IExLX0VYQ0xVU0lWRSk7
 CgoJcmV0dXJuIGdlbmZzX3Vmc2xpa2VfcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChjcmVkLAoJ
 ICAgIGR2cCwgVlBfVE9fVE1QRlNfTk9ERShkdnApLT50bl9tb2RlLCBWUF9UT19UTVBGU19O
 T0RFKGR2cCktPnRuX3VpZCwKCSAgICB2cCwgVlBfVE9fVE1QRlNfTk9ERSh2cCktPnRuX3Vp
 ZCk7Cn0KCi8qCiAqIHRtcGZzX2dyb19yZW5hbWU6IEFjdHVhbGx5IHBlcmZvcm0gdGhlIHJl
 bmFtZSBvcGVyYXRpb24uCiAqLwpzdGF0aWMgaW50CnRtcGZzX2dyb19yZW5hbWUoc3RydWN0
 IG1vdW50ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAs
 IHN0cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAgdm9pZCAqZmRlLCBzdHJ1Y3Qgdm5v
 ZGUgKmZ2cCwKICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUg
 KnRjbnAsCiAgICB2b2lkICp0ZGUsIHN0cnVjdCB2bm9kZSAqdHZwKQp7CglzdHJ1Y3QgdG1w
 ZnNfZGlyZW50ICoqZmRlcCA9IGZkZTsKCXN0cnVjdCB0bXBmc19kaXJlbnQgKip0ZGVwID0g
 dGRlOwoJY2hhciAqbmV3bmFtZTsKCgkodm9pZCljcmVkOwoJS0FTU0VSVChtcCAhPSBOVUxM
 KTsKCUtBU1NFUlQoZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmNucCAhPSBOVUxMKTsKCUtB
 U1NFUlQoZmRlcCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VSVCh0
 ZHZwICE9IE5VTEwpOwoJS0FTU0VSVCh0Y25wICE9IE5VTEwpOwoJS0FTU0VSVCh0ZGVwICE9
 IE5VTEwpOwoJS0FTU0VSVChmZGVwICE9IHRkZXApOwoJS0FTU0VSVCgoKmZkZXApICE9ICgq
 dGRlcCkpOwoJS0FTU0VSVCgoKmZkZXApICE9IE5VTEwpOwoJS0FTU0VSVCgoKmZkZXApLT50
 ZF9ub2RlID09IFZQX1RPX1RNUEZTX05PREUoZnZwKSk7CglLQVNTRVJUKCh0dnAgPT0gTlVM
 TCkgfHwgKCgqdGRlcCkgIT0gTlVMTCkpOwoJS0FTU0VSVCgodHZwID09IE5VTEwpIHx8ICgo
 KnRkZXApLT50ZF9ub2RlID09IFZQX1RPX1RNUEZTX05PREUodHZwKSkpOwoJS0FTU0VSVChm
 ZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAgIT0gdHZwKTsKCUtBU1NFUlQodGR2cCAhPSBm
 dnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7CglLQVNTRVJUKGZ2cCAhPSB0dnApOwoJS0FT
 U0VSVChmZHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQoZnZwLT52X21vdW50ID09IG1w
 KTsKCUtBU1NFUlQodGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKCh0dnAgPT0gTlVM
 TCkgfHwgKHR2cC0+dl9tb3VudCA9PSBtcCkpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZmR2
 cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGZ2cCkgPT0gTEtf
 RVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHRkdnApID09IExLX0VYQ0xVU0lW
 RSk7CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09IExL
 X0VYQ0xVU0lWRSkpOwoKCWlmICh0bXBmc19zdHJuYW1lX25lcWxlbihmY25wLCB0Y25wKSkg
 ewoJCW5ld25hbWUgPSB0bXBmc19zdHJuYW1lX2FsbG9jKFZGU19UT19UTVBGUyhtcCksCgkJ
 ICAgIHRjbnAtPmNuX25hbWVsZW4pOwoJCWlmIChuZXduYW1lID09IE5VTEwpCgkJCXJldHVy
 biBFTk9TUEM7Cgl9IGVsc2UgewoJCW5ld25hbWUgPSBOVUxMOwoJfQoKCS8qCgkgKiBJZiB3
 ZSBhcmUgbW92aW5nIGZyb20gb25lIGRpcmVjdG9yeSB0byBhbm90aGVyLCBkZXRhY2ggdGhl
 CgkgKiBzb3VyY2UgZW50cnkgYW5kIHJlYXR0YWNoIGl0IHRvIHRoZSB0YXJnZXQgZGlyZWN0
 b3J5LgoJICovCglpZiAoZmR2cCAhPSB0ZHZwKSB7CgkJdG1wZnNfZGlyX2RldGFjaChmZHZw
 LCAqZmRlcCk7CgkJdG1wZnNfZGlyX2F0dGFjaCh0ZHZwLCAqZmRlcCwgVlBfVE9fVE1QRlNf
 Tk9ERShmdnApKTsKCX0gZWxzZSBpZiAodHZwID09IE5VTEwpIHsKCQkvKgoJCSAqIFdlIGFy
 ZSBjaGFuZ2luZyB0aGUgZGlyZWN0b3J5LiAgdG1wZnNfZGlyX2F0dGFjaCBhbmQKCQkgKiB0
 bXBmc19kaXJfZGV0YWNoIG5vdGUgdGhlIGV2ZW50cyBmb3IgdXMsIGJ1dCBmb3IKCQkgKiB0
 aGlzIGNhc2Ugd2UgZG9uJ3QgY2FsbCB0aGVtLCBzbyB3ZSBtdXN0IG5vdGUgdGhlCgkJICog
 ZXZlbnQgZXhwbGljaXRseS4KCQkgKi8KCQlWTl9LTk9URShmZHZwLCBOT1RFX1dSSVRFKTsK
 CX0KCgkvKgoJICogSWYgd2UgYXJlIHJlcGxhY2luZyBhbiBleGlzdGluZyB0YXJnZXQgZW50
 cnksIGRlbGV0ZSBpdC4KCSAqCgkgKiBYWFggV2hhdCBpZiB0aGUgdGFyZ2V0IGlzIGEgZGly
 ZWN0b3J5IHdpdGggd2hpdGVvdXQgZW50cmllcz8KCSAqLwoJaWYgKHR2cCAhPSBOVUxMKSB7
 CgkJS0FTU0VSVCgoKnRkZXApICE9IE5VTEwpOwoJCUtBU1NFUlQoKCp0ZGVwKS0+dGRfbm9k
 ZSA9PSBWUF9UT19UTVBGU19OT0RFKHR2cCkpOwoJCUtBU1NFUlQoKGZ2cC0+dl90eXBlID09
 IFZESVIpID09ICh0dnAtPnZfdHlwZSA9PSBWRElSKSk7CgkJaWYgKHR2cC0+dl90eXBlID09
 IFZESVIpIHsKCQkJS0FTU0VSVChWUF9UT19UTVBGU19OT0RFKHR2cCktPnRuX3NpemUgPT0g
 MCk7CgkJCUtBU1NFUlQoVlBfVE9fVE1QRlNfTk9ERSh0dnApLT50bl9saW5rcyA9PSAyKTsK
 CgkJCS8qCgkJCSAqIERlY3JlbWVudCB0aGUgZXh0cmEgbGluayBjb3VudCBmb3IgYC4nIHNv
 CgkJCSAqIHRoZSB2bm9kZSB3aWxsIGJlIHJlY3ljbGVkIHdoZW4gcmVsZWFzZWQuCgkJCSAq
 CgkJCSAqIFhYWCBXaHkgbm90IGp1c3QgcmVsZWFzZSBkaXJlY3Rvcnkgdm5vZGVzCgkJCSAq
 IHdoZW4gdGhlaXIgbGluayBjb3VudCBpcyAxIGluc3RlYWQgb2YgMCBpbgoJCQkgKiB0bXBm
 c19pbmFjdGl2ZSwgc2luY2UgYC4nIGlzIGJlaW5nIHRyZWF0ZWQKCQkJICogc3BlY2lhbGx5
 IGFueXdheT8KCQkJICovCgkJCVZQX1RPX1RNUEZTX05PREUodHZwKS0+dG5fbGlua3MtLTsK
 CQl9CgkJdG1wZnNfZGlyX2RldGFjaCh0ZHZwLCAqdGRlcCk7CgkJdG1wZnNfZnJlZV9kaXJl
 bnQoVkZTX1RPX1RNUEZTKG1wKSwgKnRkZXApOwoJfQoKCS8qCgkgKiBVcGRhdGUgdGhlIGRp
 cmVjdG9yeSBlbnRyeSdzIG5hbWUgaWYgbmVjZXNzYXJ5LCBhbmQgZmxhZwoJICogbWV0YWRh
 dGEgdXBkYXRlcy4gIEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBoZXJlIGlzIG5vdAoJ
 ICogT0sgYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCBzb21lIGNoYW5nZXMgdGhh
 dCB3ZQoJICogY2FuJ3QgYmFjayBvdXQgYXQgdGhpcyBwb2ludCwgaGVuY2UgdGhlIGVhcmx5
 IGFsbG9jYXRpb24KCSAqIGFib3ZlLgoJICovCglpZiAobmV3bmFtZSAhPSBOVUxMKSB7CgkJ
 S0FTU0VSVCh0Y25wLT5jbl9uYW1lbGVuIDw9IFRNUEZTX01BWE5BTUxFTik7CgoJCXRtcGZz
 X3N0cm5hbWVfZnJlZShWRlNfVE9fVE1QRlMobXApLCAoKmZkZXApLT50ZF9uYW1lLAoJCSAg
 ICAoKmZkZXApLT50ZF9uYW1lbGVuKTsKCQkoKmZkZXApLT50ZF9uYW1lbGVuID0gKHVpbnQx
 Nl90KXRjbnAtPmNuX25hbWVsZW47CgkJKHZvaWQpbWVtY3B5KG5ld25hbWUsIHRjbnAtPmNu
 X25hbWVwdHIsIHRjbnAtPmNuX25hbWVsZW4pOwoJCSgqZmRlcCktPnRkX25hbWUgPSBuZXdu
 YW1lOwoKCQlWUF9UT19UTVBGU19OT0RFKGZ2cCktPnRuX3N0YXR1cyB8PSBUTVBGU19OT0RF
 X0NIQU5HRUQ7CgkJVlBfVE9fVE1QRlNfTk9ERSh0ZHZwKS0+dG5fc3RhdHVzIHw9IFRNUEZT
 X05PREVfTU9ESUZJRUQ7Cgl9CgoJVk5fS05PVEUoZnZwLCBOT1RFX1JFTkFNRSk7CgojaWYg
 MQkJCQkvKiBYWFggKi8KLy8gdGhpcyBpcyBuZWVkZWQgb24gNS4xLnggb3IgdGhlIGNhY2hl
 IHdpbGwgZ2V0IG91dCBvZiBzeW5jIC4uLi4KCWdlbmZzX3JlbmFtZV9jYWNoZV9wdXJnZShm
 ZHZwLCBmdnAsIHRkdnAsIHR2cCk7CiNlbmRpZgoKCXJldHVybiAwOwp9CgovKgogKiB0bXBm
 c19ncm9fcmVtb3ZlOiBSZW5hbWUgYW4gb2JqZWN0IG92ZXIgYW5vdGhlciBsaW5rIHRvIGl0
 c2VsZiwKICogZWZmZWN0aXZlbHkgcmVtb3ZpbmcganVzdCB0aGUgb3JpZ2luYWwgbGluay4K
 ICovCnN0YXRpYyBpbnQKdG1wZnNfZ3JvX3JlbW92ZShzdHJ1Y3QgbW91bnQgKm1wLCBrYXV0
 aF9jcmVkX3QgY3JlZCwKICAgIHN0cnVjdCB2bm9kZSAqZHZwLCBzdHJ1Y3QgY29tcG9uZW50
 bmFtZSAqY25wLCB2b2lkICpkZSwgc3RydWN0IHZub2RlICp2cCkKewoJc3RydWN0IHRtcGZz
 X2RpcmVudCAqKmRlcCA9IGRlOwoKCSh2b2lkKXZwOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsK
 CUtBU1NFUlQoZHZwICE9IE5VTEwpOwoJS0FTU0VSVChjbnAgIT0gTlVMTCk7CglLQVNTRVJU
 KGRlcCAhPSBOVUxMKTsKCUtBU1NFUlQodnAgIT0gTlVMTCk7CglLQVNTRVJUKGR2cCAhPSB2
 cCk7CglLQVNTRVJUKGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKHZwLT52X21vdW50
 ID09IG1wKTsKCUtBU1NFUlQoZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHZwLT52
 X3R5cGUgIT0gVkRJUik7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnApID09IExLX0VYQ0xV
 U0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCgl0
 bXBmc19kaXJfZGV0YWNoKGR2cCwgKmRlcCk7Cgl0bXBmc19mcmVlX2RpcmVudChWRlNfVE9f
 VE1QRlMobXApLCAqZGVwKTsKCglyZXR1cm4gMDsKfQoKLyoKICogdG1wZnNfZ3JvX2xvb2t1
 cDogTG9vayB1cCBhbmQgc2F2ZSB0aGUgbG9va3VwIHJlc3VsdHMuCiAqLwpzdGF0aWMgaW50
 CnRtcGZzX2dyb19sb29rdXAoc3RydWN0IG1vdW50ICptcCwgc3RydWN0IHZub2RlICpkdnAs
 CiAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wLCB2b2lkICpkZV9yZXQsIHN0cnVjdCB2
 bm9kZSAqKnZwX3JldCkKewoJc3RydWN0IHRtcGZzX2RpcmVudCAqZGlyZW50LCAqKmRlcF9y
 ZXQgPSBkZV9yZXQ7CglzdHJ1Y3Qgdm5vZGUgKnZwOwoJaW50IGVycm9yOwoKCSh2b2lkKW1w
 OwoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZHZwICE9IE5VTEwpOwoJS0FTU0VS
 VChjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGRlcF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKHZw
 X3JldCAhPSBOVUxMKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2cCkgPT0gTEtfRVhDTFVT
 SVZFKTsKCglkaXJlbnQgPSB0bXBmc19kaXJfbG9va3VwKFZQX1RPX1RNUEZTX05PREUoZHZw
 KSwgY25wKTsKCWlmIChkaXJlbnQgPT0gTlVMTCkKCQlyZXR1cm4gRU5PRU5UOwoKCW11dGV4
 X2VudGVyKCZkaXJlbnQtPnRkX25vZGUtPnRuX3Zsb2NrKTsKCWVycm9yID0gdG1wZnNfdm5v
 ZGVfZ2V0KG1wLCBkaXJlbnQtPnRkX25vZGUsICZ2cCk7CgkvKiBOb3RlOiB0bXBmc192bm9k
 ZV9nZXQgYWx3YXlzIHJlbGVhc2VzIGRpcmVudC0+dGRfbm9kZS0+dG5fdmxvY2suICAqLwoJ
 aWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCglLQVNTRVJUKHZwICE9IE5VTEwpOwoJS0FT
 U0VSVChWT1BfSVNMT0NLRUQodnApID09IExLX0VYQ0xVU0lWRSk7CgoJLyoKCSAqIHRtcGZz
 X3Zub2RlX2dldCByZXR1cm5zIHRoaXMgbG9ja2VkIGZvciB1cywgd2hpY2ggd291bGQgYmUK
 CSAqIGNvbnZlbmllbnQgYnV0IGZvciBsb3NzYWdlIGluIG90aGVyIGZpbGUgc3lzdGVtcy4g
 IFNvLCBmb3IKCSAqIGh5c3RlcmljYWwgcmFpc2lucywgd2UgaGF2ZSB0byB1bmxvY2sgaXQg
 aGVyZS4gIFRoZSBjYWxsZXIKCSAqIHdpbGwgbG9jayBpdCBhZ2FpbiwgYW5kIHdlIGRvbid0
 IHJlbHkgb24gYW55IGludGVyZXN0aW5nCgkgKiBpbnZhcmlhbnRzIGluIHRoZSBpbnRlcmlt
 LCBiZXlvbmQgdGhhdCBpdCB3b24ndCB2YW5pc2ggZnJvbQoJICogdW5kZXIgdXMsIHdoaWNo
 IGl0IHdvbid0IGJlY2F1c2UgaXQncyByZWZlcmVuY2VkLgoJICoKCSAqIFhYWCBPbmNlIG5h
 bWVpIGlzIGZpeGVkLCB3ZSBjYW4gY2hhbmdlIHRoZSBnZW5mc19yZW5hbWUKCSAqIHByb3Rv
 Y29sIHNvIHRoYXQgdGhpcyB1bmxvY2sgaXMgbm90IG5lY2Vzc2FyeS4KCSAqLwoJVk9QX1VO
 TE9DSyh2cCwgMCk7CgoJKmRlcF9yZXQgPSBkaXJlbnQ7CgkqdnBfcmV0ID0gdnA7CglyZXR1
 cm4gMDsKfQoKLyoKICogdG1wZnNfcm1kaXJlZF9wOiBDaGVjayB3aGV0aGVyIHRoZSBkaXJl
 Y3RvcnkgdnAgaGFzIGJlZW4gcm1kaXJlZC4KICoKICogdnAgbXVzdCBiZSBsb2NrZWQgYW5k
 IHJlZmVyZW5jZWQuCiAqLwpzdGF0aWMgYm9vbAp0bXBmc19ybWRpcmVkX3Aoc3RydWN0IHZu
 b2RlICp2cCkKewoKCUtBU1NFUlQodnAgIT0gTlVMTCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tF
 RCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQodnAtPnZfdHlwZSA9PSBWRElSKTsK
 CglyZXR1cm4gKFZQX1RPX1RNUEZTX05PREUodnApLT50bl9zcGVjLnRuX2Rpci50bl9wYXJl
 bnQgPT0gTlVMTCk7Cn0KCi8qCiAqIHRtcGZzX2dyb19nZW5lYWxvZ3k6IEFuYWx5emUgdGhl
 IGdlbmVhbG9neSBvZiB0aGUgc291cmNlIGFuZCB0YXJnZXQKICogZGlyZWN0b3JpZXMuCiAq
 LwpzdGF0aWMgaW50CnRtcGZzX2dyb19nZW5lYWxvZ3koc3RydWN0IG1vdW50ICptcCwga2F1
 dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAsIHN0cnVjdCB2bm9kZSAq
 dGR2cCwKICAgIHN0cnVjdCB2bm9kZSAqKmludGVybWVkaWF0ZV9ub2RlX3JldCkKewoJc3Ry
 dWN0IHZub2RlICp2cDsKCXN0cnVjdCB0bXBmc19ub2RlICpkbm9kZTsKCWludCBlcnJvcjsK
 Cgkodm9pZCljcmVkOwoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAhPSBO
 VUxMKTsKCUtBU1NFUlQodGR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAhPSB0ZHZwKTsK
 CUtBU1NFUlQoaW50ZXJtZWRpYXRlX25vZGVfcmV0ICE9IE5VTEwpOwoJS0FTU0VSVChmZHZw
 LT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQodGR2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNT
 RVJUKGZkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodGR2cC0+dl90eXBlID09IFZE
 SVIpOwoKCS8qCgkgKiBXZSBuZWVkIHRvIHByb3Zpc2lvbmFsbHkgbG9jayB0ZHZwIHRvIGtl
 ZXAgcm1kaXIgZnJvbQoJICogZGVsZXRpbmcgaXQgLS0gb3IgYW55IGFuY2VzdG9yIC0tIGF0
 IGFuIGlub3Bwb3J0dW5lIG1vbWVudC4KCSAqLwoJZXJyb3IgPSB0bXBmc19ncm9fbG9ja19k
 aXJlY3RvcnkobXAsIHRkdnApOwoJaWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCgl2cCA9
 IHRkdnA7Cgl2cmVmKHZwKTsKCglmb3IgKDs7KSB7CgkJS0FTU0VSVCh2cCAhPSBOVUxMKTsK
 CQlLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCQlLQVNTRVJU
 KHZwLT52X21vdW50ID09IG1wKTsKCQlLQVNTRVJUKHZwLT52X3R5cGUgPT0gVkRJUik7CgkJ
 S0FTU0VSVCghdG1wZnNfcm1kaXJlZF9wKHZwKSk7CgoJCWRub2RlID0gVlBfVE9fVE1QRlNf
 Tk9ERSh2cCktPnRuX3NwZWMudG5fZGlyLnRuX3BhcmVudDsKCiNpZiAxIC8vIGJ1ZyAtIFBS
 NDY5OTAKCQkvLyB0aGVyZSBpcyBhIHJhY2UgYmV0d2VlbiByZW5hbWUoKSBhbmQgcm1kaXIo
 KSAuLi4KCQkvLyBkbm9kZSBtYXkgZ2V0IE5VTEwgaWYgdGhlIHRvLWRpcmVjdG9yeSBnZXRz
 IHJlbW92ZWQKCQkvLyBwcmlvciB3ZSBnZXQgaGVyZSAuLi4KCQlpZiAoZG5vZGUgPT0gTlVM
 TCkgewoJCQl2cHV0KHZwKTsKCQkJKmludGVybWVkaWF0ZV9ub2RlX3JldCA9IE5VTEw7CgkJ
 CXJldHVybiBFTk9FTlQ7CgkJfQojZWxzZQoJCS8qCgkJICogSWYgZG5vZGUgaXMgbnVsbCB0
 aGVuIHZwIGhhcyBiZWVuIHJtZGlyJ2QsIHdoaWNoIGlzCgkJICogbm90IHN1cHBvc2VkIHRv
 IGhhcHBlbiBiZWNhdXNlIHdlIGhhdmUgaXQgbG9ja2VkLgoJCSAqLwoJCUtBU1NFUlQoZG5v
 ZGUgIT0gTlVMTCk7CiNlbmRpZgoKCQkvKiBEaWQgd2UgaGl0IHRoZSByb290IHdpdGhvdXQg
 ZmluZGluZyBmZHZwPyAgKi8KCQlpZiAoZG5vZGUgPT0gVlBfVE9fVE1QRlNfTk9ERSh2cCkp
 IHsKCQkJdnB1dCh2cCk7CgkJCSppbnRlcm1lZGlhdGVfbm9kZV9yZXQgPSBOVUxMOwoJCQly
 ZXR1cm4gMDsKCQl9CgoJCS8qIERpZCB3ZSBmaW5kIHRoYXQgZmR2cCBpcyBhbiBhbmNlc3Rv
 ciBvZiB0ZHZwPyAqLwoJCWlmIChkbm9kZSA9PSBWUF9UT19UTVBGU19OT0RFKGZkdnApKSB7
 CgkJCUtBU1NFUlQoZG5vZGUtPnRuX3Zub2RlID09IGZkdnApOwoJCQkvKiBVbmxvY2sgdnAs
 IGJ1dCBrZWVwIGl0IHJlZmVyZW5jZWQuICAqLwoJCQlWT1BfVU5MT0NLKHZwLCAwKTsKCQkJ
 KmludGVybWVkaWF0ZV9ub2RlX3JldCA9IHZwOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8qIE5l
 aXRoZXIgLS0ga2VlcCBhc2NlbmRpbmcgdGhlIGZhbWlseSB0cmVlLiAgKi8KCQltdXRleF9l
 bnRlcigmZG5vZGUtPnRuX3Zsb2NrKTsKCQl2cHV0KHZwKTsKCQl2cCA9IE5VTEw7CS8qIEp1
 c3QgaW4gY2FzZSwgZm9yIHRoZSBrYXNzZXJ0IGFib3ZlLi4uICAqLwoJCWVycm9yID0gdG1w
 ZnNfdm5vZGVfZ2V0KG1wLCBkbm9kZSwgJnZwKTsKCQlpZiAoZXJyb3IpCgkJCXJldHVybiBl
 cnJvcjsKCX0KfQoKLyoKICogdG1wZnNfZ3JvX2xvY2tfZGlyZWN0b3J5OiBMb2NrIHRoZSBk
 aXJlY3RvcnkgdnAsIGJ1dCBmYWlsIGlmIGl0IGhhcwogKiBiZWVuIHJtZGlyJ2QuCiAqLwpz
 dGF0aWMgaW50CnRtcGZzX2dyb19sb2NrX2RpcmVjdG9yeShzdHJ1Y3QgbW91bnQgKm1wLCBz
 dHJ1Y3Qgdm5vZGUgKnZwKQp7CgoJKHZvaWQpbXA7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJ
 S0FTU0VSVCh2cCAhPSBOVUxMKTsKCUtBU1NFUlQodnAtPnZfbW91bnQgPT0gbXApOwoKCXZu
 X2xvY2sodnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsKCglpZiAodG1wZnNfcm1kaXJl
 ZF9wKHZwKSkgewoJCVZPUF9VTkxPQ0sodnAsIDApOwoJCXJldHVybiBFTk9FTlQ7Cgl9CgoJ
 cmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VuZnNfcmVuYW1lX29wcyB0bXBm
 c19nZW5mc19yZW5hbWVfb3BzID0gewoJLmdyb19kaXJlY3RvcnlfZW1wdHlfcAkJPSB0bXBm
 c19ncm9fZGlyZWN0b3J5X2VtcHR5X3AsCgkuZ3JvX3JlbmFtZV9jaGVja19wb3NzaWJsZQk9
 IHRtcGZzX2dyb19yZW5hbWVfY2hlY2tfcG9zc2libGUsCgkuZ3JvX3JlbmFtZV9jaGVja19w
 ZXJtaXR0ZWQJPSB0bXBmc19ncm9fcmVuYW1lX2NoZWNrX3Blcm1pdHRlZCwKCS5ncm9fcmVt
 b3ZlX2NoZWNrX3Bvc3NpYmxlCT0gdG1wZnNfZ3JvX3JlbW92ZV9jaGVja19wb3NzaWJsZSwK
 CS5ncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZAk9IHRtcGZzX2dyb19yZW1vdmVfY2hlY2tf
 cGVybWl0dGVkLAoJLmdyb19yZW5hbWUJCQk9IHRtcGZzX2dyb19yZW5hbWUsCgkuZ3JvX3Jl
 bW92ZQkJCT0gdG1wZnNfZ3JvX3JlbW92ZSwKCS5ncm9fbG9va3VwCQkJPSB0bXBmc19ncm9f
 bG9va3VwLAoJLmdyb19nZW5lYWxvZ3kJCQk9IHRtcGZzX2dyb19nZW5lYWxvZ3ksCgkuZ3Jv
 X2xvY2tfZGlyZWN0b3J5CQk9IHRtcGZzX2dyb19sb2NrX2RpcmVjdG9yeSwKfTsKAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1wZnMvdG1w
 ZnNfbWVtLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAxMjY2MgAxMjAy
 NDYwMzUxMAAwMDE3NDIzADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVs
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoJJE5l
 dEJTRDogdG1wZnNfbWVtLmMsdiAxLjQgMjAxMS8wNS8yNCAwMTowOTo0NyBybWluZCBFeHAg
 JAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIFRoZSBOZXRCU0QgRm91bmRh
 dGlvbiwgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMg
 ZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRh
 dGlvbgogKiBieSBNaW5kYXVnYXMgUmFzaXVrZXZpY2l1cy4KICoKICogUmVkaXN0cmlidXRp
 b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
 CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
 b3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
 c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3Rp
 Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
 ZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
 ZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
 dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1l
 bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
 aWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNE
 IEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBgYEFTIElTJycgQU5EIEFO
 WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
 TUlURUQKICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
 IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
 RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUwog
 KiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
 SUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
 LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09P
 RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
 TkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
 IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
 WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklT
 SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
 RiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgov
 KgogKiB0bXBmcyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KICogSW1wbGVtZW50cyBt
 ZW1vcnkgdXNhZ2UgYWNjb3VudGluZyBhbmQgbGltaXRpbmcuCiAqLwoKI2luY2x1ZGUgPHN5
 cy9jZGVmcy5oPgpfX0tFUk5FTF9SQ1NJRCgwLCAiJE5ldEJTRDogdG1wZnNfbWVtLmMsdiAx
 LjQgMjAxMS8wNS8yNCAwMTowOTo0NyBybWluZCBFeHAgJCIpOwoKI2luY2x1ZGUgPHN5cy9w
 YXJhbS5oPgojaW5jbHVkZSA8c3lzL2F0b21pYy5oPgojaW5jbHVkZSA8c3lzL2ttZW0uaD4K
 I2luY2x1ZGUgPHN5cy9uYW1laS5oPgojaW5jbHVkZSA8c3lzL3Bvb2wuaD4KCiNpbmNsdWRl
 IDxmcy90bXBmcy90bXBmcy5oPgoKZXh0ZXJuIHN0cnVjdCBwb29sCXRtcGZzX2RpcmVudF9w
 b29sOwpleHRlcm4gc3RydWN0IHBvb2wJdG1wZnNfbm9kZV9wb29sOwoKdm9pZAp0bXBmc19t
 bnRtZW1faW5pdChzdHJ1Y3QgdG1wZnNfbW91bnQgKm1wLCB1aW50NjRfdCBtZW1saW1pdCkK
 ewoKCW11dGV4X2luaXQoJm1wLT50bV9hY2NfbG9jaywgTVVURVhfREVGQVVMVCwgSVBMX05P
 TkUpOwoJbXAtPnRtX21lbV9saW1pdCA9IG1lbWxpbWl0OwoJbXAtPnRtX2J5dGVzX3VzZWQg
 PSAwOwp9Cgp2b2lkCnRtcGZzX21udG1lbV9kZXN0cm95KHN0cnVjdCB0bXBmc19tb3VudCAq
 bXApCnsKCglLQVNTRVJUKG1wLT50bV9ieXRlc191c2VkID09IDApOwoJbXV0ZXhfZGVzdHJv
 eSgmbXAtPnRtX2FjY19sb2NrKTsKfQoKLyoKICogdG1wZnNfbWVtX2luZm86IHJldHVybiB0
 aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBtZW1vcnkgcGFnZXMuCiAqCiAqID0+IElmICd0b3Rh
 bCcgaXMgdHJ1ZSwgdGhlbiByZXR1cm4gX3RvdGFsXyBhbW91bnQgb2YgcGFnZXMuCiAqID0+
 IElmIGZhbHNlLCB0aGVuIHJldHVybiB0aGUgYW1vdW50IG9mIF9mcmVlXyBtZW1vcnkgcGFn
 ZXMuCiAqCiAqIFJlbWVtYmVyIHRvIHJlbW92ZSBUTVBGU19QQUdFU19SRVNFUlZFRCBmcm9t
 IHRoZSByZXR1cm5lZCB2YWx1ZSB0byBhdm9pZAogKiBleGNlc3NpdmUgbWVtb3J5IHVzYWdl
 LgogKi8Kc2l6ZV90CnRtcGZzX21lbV9pbmZvKGJvb2wgdG90YWwpCnsKCXNpemVfdCBzaXpl
 ID0gMDsKCgkvKiBYWFg6IHVubG9ja2VkICovCglzaXplICs9IHV2bWV4cC5zd3BnYXZhaWw7
 CglpZiAoIXRvdGFsKSB7CgkJc2l6ZSAtPSB1dm1leHAuc3dwZ29ubHk7Cgl9CglzaXplICs9
 IHV2bWV4cC5mcmVlOwoJc2l6ZSArPSB1dm1leHAuZmlsZXBhZ2VzOwoJaWYgKHNpemUgPiB1
 dm1leHAud2lyZWQpIHsKCQlzaXplIC09IHV2bWV4cC53aXJlZDsKCX0gZWxzZSB7CgkJc2l6
 ZSA9IDA7Cgl9CglyZXR1cm4gc2l6ZTsKfQoKdWludDY0X3QKdG1wZnNfYnl0ZXNfbWF4KHN0
 cnVjdCB0bXBmc19tb3VudCAqbXApCnsKCXNpemVfdCBmcmVlcGFnZXMgPSB0bXBmc19tZW1f
 aW5mbyhmYWxzZSk7Cgl1aW50NjRfdCBhdmFpbF9tZW07CgoJaWYgKGZyZWVwYWdlcyA8IFRN
 UEZTX1BBR0VTX1JFU0VSVkVEKSB7CgkJZnJlZXBhZ2VzID0gMDsKCX0gZWxzZSB7CgkJZnJl
 ZXBhZ2VzIC09IFRNUEZTX1BBR0VTX1JFU0VSVkVEOwoJfQoJYXZhaWxfbWVtID0gcm91bmRf
 cGFnZShtcC0+dG1fYnl0ZXNfdXNlZCkgKyAoZnJlZXBhZ2VzIDw8IFBBR0VfU0hJRlQpOwoJ
 cmV0dXJuIE1JTihtcC0+dG1fbWVtX2xpbWl0LCBhdmFpbF9tZW0pOwp9CgpzaXplX3QKdG1w
 ZnNfcGFnZXNfYXZhaWwoc3RydWN0IHRtcGZzX21vdW50ICptcCkKewoKCXJldHVybiAodG1w
 ZnNfYnl0ZXNfbWF4KG1wKSAtIG1wLT50bV9ieXRlc191c2VkKSA+PiBQQUdFX1NISUZUOwp9
 Cgpib29sCnRtcGZzX21lbV9pbmNyKHN0cnVjdCB0bXBmc19tb3VudCAqbXAsIHNpemVfdCBz
 eikKewoJdWludDY0X3QgbGltOwoKCW11dGV4X2VudGVyKCZtcC0+dG1fYWNjX2xvY2spOwoJ
 bGltID0gdG1wZnNfYnl0ZXNfbWF4KG1wKTsKCWlmIChtcC0+dG1fYnl0ZXNfdXNlZCArIHN6
 ID49IGxpbSkgewoJCW11dGV4X2V4aXQoJm1wLT50bV9hY2NfbG9jayk7CgkJcmV0dXJuIGZh
 bHNlOwoJfQoJbXAtPnRtX2J5dGVzX3VzZWQgKz0gc3o7CgltdXRleF9leGl0KCZtcC0+dG1f
 YWNjX2xvY2spOwoJcmV0dXJuIHRydWU7Cn0KCnZvaWQKdG1wZnNfbWVtX2RlY3Ioc3RydWN0
 IHRtcGZzX21vdW50ICptcCwgc2l6ZV90IHN6KQp7CgoJbXV0ZXhfZW50ZXIoJm1wLT50bV9h
 Y2NfbG9jayk7CglLQVNTRVJUKG1wLT50bV9ieXRlc191c2VkID49IHN6KTsKCW1wLT50bV9i
 eXRlc191c2VkIC09IHN6OwoJbXV0ZXhfZXhpdCgmbXAtPnRtX2FjY19sb2NrKTsKfQoKc3Ry
 dWN0IHRtcGZzX2RpcmVudCAqCnRtcGZzX2RpcmVudF9nZXQoc3RydWN0IHRtcGZzX21vdW50
 ICptcCkKewoKCWlmICghdG1wZnNfbWVtX2luY3IobXAsIHNpemVvZihzdHJ1Y3QgdG1wZnNf
 ZGlyZW50KSkpIHsKCQlyZXR1cm4gTlVMTDsKCX0KCXJldHVybiBwb29sX2dldCgmdG1wZnNf
 ZGlyZW50X3Bvb2wsIFBSX1dBSVRPSyk7Cn0KCnZvaWQKdG1wZnNfZGlyZW50X3B1dChzdHJ1
 Y3QgdG1wZnNfbW91bnQgKm1wLCBzdHJ1Y3QgdG1wZnNfZGlyZW50ICpkZSkKewoKCXRtcGZz
 X21lbV9kZWNyKG1wLCBzaXplb2Yoc3RydWN0IHRtcGZzX2RpcmVudCkpOwoJcG9vbF9wdXQo
 JnRtcGZzX2RpcmVudF9wb29sLCBkZSk7Cn0KCnN0cnVjdCB0bXBmc19ub2RlICoKdG1wZnNf
 bm9kZV9nZXQoc3RydWN0IHRtcGZzX21vdW50ICptcCkKewoKCWlmIChhdG9taWNfaW5jX3Vp
 bnRfbnYoJm1wLT50bV9ub2Rlc19jbnQpID49IG1wLT50bV9ub2Rlc19tYXgpIHsKCQlhdG9t
 aWNfZGVjX3VpbnQoJm1wLT50bV9ub2Rlc19jbnQpOwoJCXJldHVybiBOVUxMOwoJfQoJaWYg
 KCF0bXBmc19tZW1faW5jcihtcCwgc2l6ZW9mKHN0cnVjdCB0bXBmc19ub2RlKSkpIHsKCQly
 ZXR1cm4gTlVMTDsKCX0KCXJldHVybiBwb29sX2dldCgmdG1wZnNfbm9kZV9wb29sLCBQUl9X
 QUlUT0spOwp9Cgp2b2lkCnRtcGZzX25vZGVfcHV0KHN0cnVjdCB0bXBmc19tb3VudCAqbXAs
 IHN0cnVjdCB0bXBmc19ub2RlICp0bikKewoKCWF0b21pY19kZWNfdWludCgmbXAtPnRtX25v
 ZGVzX2NudCk7Cgl0bXBmc19tZW1fZGVjcihtcCwgc2l6ZW9mKHN0cnVjdCB0bXBmc19ub2Rl
 KSk7Cglwb29sX3B1dCgmdG1wZnNfbm9kZV9wb29sLCB0bik7Cn0KCi8qCiAqIFF1YW50dW0g
 c2l6ZSB0byByb3VuZC11cCB0aGUgdG1wZnMgbmFtZXMgaW4gb3JkZXIgdG8gcmVkdWNlIHJl
 LWFsbG9jYXRpb25zLgogKi8KCiNkZWZpbmUJVE1QRlNfTkFNRV9RVUFOVFVNCSgzMikKCmNo
 YXIgKgp0bXBmc19zdHJuYW1lX2FsbG9jKHN0cnVjdCB0bXBmc19tb3VudCAqbXAsIHNpemVf
 dCBsZW4pCnsKCWNvbnN0IHNpemVfdCBzeiA9IHJvdW5kdXAyKGxlbiwgVE1QRlNfTkFNRV9R
 VUFOVFVNKTsKCglLQVNTRVJUKHN6ID4gMCAmJiBzeiA8PSAxMDI0KTsKCWlmICghdG1wZnNf
 bWVtX2luY3IobXAsIHN6KSkgewoJCXJldHVybiBOVUxMOwoJfQoJcmV0dXJuIGttZW1fYWxs
 b2Moc3osIEtNX1NMRUVQKTsKfQoKdm9pZAp0bXBmc19zdHJuYW1lX2ZyZWUoc3RydWN0IHRt
 cGZzX21vdW50ICptcCwgY2hhciAqc3RyLCBzaXplX3QgbGVuKQp7Cgljb25zdCBzaXplX3Qg
 c3ogPSByb3VuZHVwMihsZW4sIFRNUEZTX05BTUVfUVVBTlRVTSk7CgoJS0FTU0VSVChzeiA+
 IDAgJiYgc3ogPD0gMTAyNCk7Cgl0bXBmc19tZW1fZGVjcihtcCwgc3opOwoJa21lbV9mcmVl
 KHN0ciwgc3opOwp9Cgpib29sCnRtcGZzX3N0cm5hbWVfbmVxbGVuKHN0cnVjdCBjb21wb25l
 bnRuYW1lICpmY25wLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCkKewoJY29uc3Qgc2l6
 ZV90IGZsbiA9IHJvdW5kdXAyKGZjbnAtPmNuX25hbWVsZW4sIFRNUEZTX05BTUVfUVVBTlRV
 TSk7Cgljb25zdCBzaXplX3QgdGxuID0gcm91bmR1cDIodGNucC0+Y25fbmFtZWxlbiwgVE1Q
 RlNfTkFNRV9RVUFOVFVNKTsKCglyZXR1cm4gKGZsbiAhPSB0bG4pIHx8IG1lbWNtcChmY25w
 LT5jbl9uYW1lcHRyLCB0Y25wLT5jbl9uYW1lcHRyLCBmbG4pOwp9CgAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvZnMvdG1wZnMvdG1wZnNfdmZzb3BzLmMA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAyNTExMwAxMjAyNDYwNDIwMAAwMDIw
 MTU1ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0
 YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyoJJE5ldEJTRDogdG1wZnNf
 dmZzb3BzLmMsdiAxLjUyIDIwMTEvMDkvMjcgMDE6MTA6NDMgY2hyaXN0b3MgRXhwICQJKi8K
 Ci8qCiAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgMjAwNyBUaGUgTmV0QlNEIEZvdW5k
 YXRpb24sIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBjb2RlIGlz
 IGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0QlNEIEZvdW5k
 YXRpb24KICogYnkgSnVsaW8gTS4gTWVyaW5vIFZpZGFsLCBkZXZlbG9wZWQgYXMgcGFydCBv
 ZiBHb29nbGUncyBTdW1tZXIgb2YgQ29kZQogKiAyMDA1IHByb2dyYW0uCiAqCiAqIFJlZGlz
 dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
 d2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRp
 b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICog
 ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
 aXNjbGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
 ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
 ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAg
 IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
 ZSBkaXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
 IE5FVEJTRCBGT1VOREFUSU9OLCBJTkMuIEFORCBDT05UUklCVVRPUlMKICogYGBBUyBJUycn
 IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
 IE5PVCBMSU1JVEVECiAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
 QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAqIFBVUlBPU0UgQVJFIERJ
 U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgRk9VTkRBVElPTiBPUiBDT05UUklC
 VVRPUlMKICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
 TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
 Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogKiBTVUJTVElU
 VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
 T1IgQlVTSU5FU1MKICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
 IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KICogQ09OVFJBQ1QsIFNUUklDVCBM
 SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
 ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs
 IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
 CiAqLwoKLyoKICogRWZmaWNpZW50IG1lbW9yeSBmaWxlIHN5c3RlbS4KICoKICogdG1wZnMg
 aXMgYSBmaWxlIHN5c3RlbSB0aGF0IHVzZXMgTmV0QlNEJ3MgdmlydHVhbCBtZW1vcnkgc3Vi
 LXN5c3RlbQogKiAodGhlIHdlbGwta25vd24gVVZNKSB0byBzdG9yZSBmaWxlIGRhdGEgYW5k
 IG1ldGFkYXRhIGluIGFuIGVmZmljaWVudAogKiB3YXkuICBUaGlzIG1lYW5zIHRoYXQgaXQg
 ZG9lcyBub3QgZm9sbG93IHRoZSBzdHJ1Y3R1cmUgb2YgYW4gb24tZGlzawogKiBmaWxlIHN5
 c3RlbSBiZWNhdXNlIGl0IHNpbXBseSBkb2VzIG5vdCBuZWVkIHRvLiAgSW5zdGVhZCwgaXQg
 dXNlcwogKiBtZW1vcnktc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhbGdvcml0aG1z
 IHRvIGF1dG9tYXRpY2FsbHkKICogYWxsb2NhdGUgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLgog
 Ki8KCiNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KX19LRVJORUxfUkNTSUQoMCwgIiROZXRCU0Q6
 IHRtcGZzX3Zmc29wcy5jLHYgMS41MiAyMDExLzA5LzI3IDAxOjEwOjQzIGNocmlzdG9zIEV4
 cCAkIik7CgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K
 I2luY2x1ZGUgPHN5cy9rbWVtLmg+CiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2luY2x1ZGUg
 PHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KI2luY2x1ZGUgPHN5cy92bm9k
 ZS5oPgojaW5jbHVkZSA8c3lzL21vZHVsZS5oPgoKI2luY2x1ZGUgPG1pc2Nmcy9nZW5mcy9n
 ZW5mcy5oPgojaW5jbHVkZSA8ZnMvdG1wZnMvdG1wZnMuaD4KI2luY2x1ZGUgPGZzL3RtcGZz
 L3RtcGZzX2FyZ3MuaD4KCk1PRFVMRShNT0RVTEVfQ0xBU1NfVkZTLCB0bXBmcywgTlVMTCk7
 CgpzdHJ1Y3QgcG9vbAl0bXBmc19kaXJlbnRfcG9vbDsKc3RydWN0IHBvb2wJdG1wZnNfbm9k
 ZV9wb29sOwoKc3RhdGljIGludAl0bXBmc19tb3VudChzdHJ1Y3QgbW91bnQgKiwgY29uc3Qg
 Y2hhciAqLCB2b2lkICosIHNpemVfdCAqKTsKc3RhdGljIGludAl0bXBmc19zdGFydChzdHJ1
 Y3QgbW91bnQgKiwgaW50KTsKc3RhdGljIGludAl0bXBmc191bm1vdW50KHN0cnVjdCBtb3Vu
 dCAqLCBpbnQpOwpzdGF0aWMgaW50CXRtcGZzX3Jvb3Qoc3RydWN0IG1vdW50ICosIHZub2Rl
 X3QgKiopOwpzdGF0aWMgaW50CXRtcGZzX3ZnZXQoc3RydWN0IG1vdW50ICosIGlub190LCB2
 bm9kZV90ICoqKTsKc3RhdGljIGludAl0bXBmc19maHRvdnAoc3RydWN0IG1vdW50ICosIHN0
 cnVjdCBmaWQgKiwgdm5vZGVfdCAqKik7CnN0YXRpYyBpbnQJdG1wZnNfdnB0b2ZoKHN0cnVj
 dCB2bm9kZSAqLCBzdHJ1Y3QgZmlkICosIHNpemVfdCAqKTsKc3RhdGljIGludAl0bXBmc19z
 dGF0dmZzKHN0cnVjdCBtb3VudCAqLCBzdHJ1Y3Qgc3RhdHZmcyAqKTsKc3RhdGljIGludAl0
 bXBmc19zeW5jKHN0cnVjdCBtb3VudCAqLCBpbnQsIGthdXRoX2NyZWRfdCk7CnN0YXRpYyB2
 b2lkCXRtcGZzX2luaXQodm9pZCk7CnN0YXRpYyB2b2lkCXRtcGZzX2RvbmUodm9pZCk7CnN0
 YXRpYyBpbnQJdG1wZnNfc25hcHNob3Qoc3RydWN0IG1vdW50ICosIHZub2RlX3QgKiwgc3Ry
 dWN0IHRpbWVzcGVjICopOwoKc3RhdGljIHZvaWQKdG1wZnNfaW5pdCh2b2lkKQp7CgoJcG9v
 bF9pbml0KCZ0bXBmc19kaXJlbnRfcG9vbCwgc2l6ZW9mKHRtcGZzX2RpcmVudF90KSwgMCwg
 MCwgMCwKCSAgICAidG1wZnNfZGlyZW50IiwgJnBvb2xfYWxsb2NhdG9yX25vaW50ciwgSVBM
 X05PTkUpOwoJcG9vbF9pbml0KCZ0bXBmc19ub2RlX3Bvb2wsIHNpemVvZih0bXBmc19ub2Rl
 X3QpLCAwLCAwLCAwLAoJICAgICJ0bXBmc19ub2RlIiwgJnBvb2xfYWxsb2NhdG9yX25vaW50
 ciwgSVBMX05PTkUpOwp9CgpzdGF0aWMgdm9pZAp0bXBmc19kb25lKHZvaWQpCnsKCglwb29s
 X2Rlc3Ryb3koJnRtcGZzX2RpcmVudF9wb29sKTsKCXBvb2xfZGVzdHJveSgmdG1wZnNfbm9k
 ZV9wb29sKTsKfQoKc3RhdGljIGludAp0bXBmc19tb3VudChzdHJ1Y3QgbW91bnQgKm1wLCBj
 b25zdCBjaGFyICpwYXRoLCB2b2lkICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQp7CglzdHJ1
 Y3QgdG1wZnNfYXJncyAqYXJncyA9IGRhdGE7Cgl0bXBmc19tb3VudF90ICp0bXA7Cgl0bXBm
 c19ub2RlX3QgKnJvb3Q7Cgl1aW50NjRfdCBtZW1saW1pdDsKCWlub190IG5vZGVzOwoJaW50
 IGVycm9yOwoKCS8qIFZhbGlkYXRlIHRoZSB2ZXJzaW9uLiAqLwoJaWYgKCpkYXRhX2xlbiA8
 IHNpemVvZigqYXJncykgfHwKCSAgICBhcmdzLT50YV92ZXJzaW9uICE9IFRNUEZTX0FSR1Nf
 VkVSU0lPTikKCQlyZXR1cm4gRUlOVkFMOwoKCS8qIEhhbmRsZSByZXRyaWV2YWwgb2YgbW91
 bnQgcG9pbnQgYXJndW1lbnRzLiAqLwoJaWYgKG1wLT5tbnRfZmxhZyAmIE1OVF9HRVRBUkdT
 KSB7CgkJaWYgKG1wLT5tbnRfZGF0YSA9PSBOVUxMKQoJCQlyZXR1cm4gRUlPOwoJCXRtcCA9
 IFZGU19UT19UTVBGUyhtcCk7CgoJCWFyZ3MtPnRhX3ZlcnNpb24gPSBUTVBGU19BUkdTX1ZF
 UlNJT047CgkJYXJncy0+dGFfbm9kZXNfbWF4ID0gdG1wLT50bV9ub2Rlc19tYXg7CgkJYXJn
 cy0+dGFfc2l6ZV9tYXggPSB0bXAtPnRtX21lbV9saW1pdDsKCgkJcm9vdCA9IHRtcC0+dG1f
 cm9vdDsKCQlhcmdzLT50YV9yb290X3VpZCA9IHJvb3QtPnRuX3VpZDsKCQlhcmdzLT50YV9y
 b290X2dpZCA9IHJvb3QtPnRuX2dpZDsKCQlhcmdzLT50YV9yb290X21vZGUgPSByb290LT50
 bl9tb2RlOwoKCQkqZGF0YV9sZW4gPSBzaXplb2YoKmFyZ3MpOwoJCXJldHVybiAwOwoJfQoK
 CWlmIChtcC0+bW50X2ZsYWcgJiBNTlRfVVBEQVRFKSB7CgkJLyogVE9ETyAqLwoJCXJldHVy
 biBFT1BOT1RTVVBQOwoJfQoKCS8qIFByb2hpYml0IG1vdW50cyBpZiB0aGVyZSBpcyBub3Qg
 ZW5vdWdoIG1lbW9yeS4gKi8KCWlmICh0bXBmc19tZW1faW5mbyh0cnVlKSA8IFRNUEZTX1BB
 R0VTX1JFU0VSVkVEKQoJCXJldHVybiBFSU5WQUw7CgoJLyogR2V0IHRoZSBtZW1vcnkgdXNh
 Z2UgbGltaXQgZm9yIHRoaXMgZmlsZS1zeXN0ZW0uICovCglpZiAoYXJncy0+dGFfc2l6ZV9t
 YXggPCBQQUdFX1NJWkUpIHsKCQltZW1saW1pdCA9IFVJTlQ2NF9NQVg7Cgl9IGVsc2UgewoJ
 CW1lbWxpbWl0ID0gYXJncy0+dGFfc2l6ZV9tYXg7Cgl9CglLQVNTRVJUKG1lbWxpbWl0ID4g
 MCk7CgoJaWYgKGFyZ3MtPnRhX25vZGVzX21heCA8PSAzKSB7CgkJbm9kZXMgPSAzICsgKG1l
 bWxpbWl0IC8gMTAyNCk7Cgl9IGVsc2UgewoJCW5vZGVzID0gYXJncy0+dGFfbm9kZXNfbWF4
 OwoJfQoJbm9kZXMgPSBNSU4obm9kZXMsIElOVF9NQVgpOwoJS0FTU0VSVChub2RlcyA+PSAz
 KTsKCgkvKiBBbGxvY2F0ZSB0aGUgdG1wZnMgbW91bnQgc3RydWN0dXJlIGFuZCBmaWxsIGl0
 LiAqLwoJdG1wID0ga21lbV96YWxsb2Moc2l6ZW9mKHRtcGZzX21vdW50X3QpLCBLTV9TTEVF
 UCk7CglpZiAodG1wID09IE5VTEwpCgkJcmV0dXJuIEVOT01FTTsKCgl0bXAtPnRtX25vZGVz
 X21heCA9IG5vZGVzOwoJdG1wLT50bV9ub2Rlc19jbnQgPSAwOwoJTElTVF9JTklUKCZ0bXAt
 PnRtX25vZGVzKTsKCgltdXRleF9pbml0KCZ0bXAtPnRtX2xvY2ssIE1VVEVYX0RFRkFVTFQs
 IElQTF9OT05FKTsKCXRtcGZzX21udG1lbV9pbml0KHRtcCwgbWVtbGltaXQpOwoKCS8qIEFs
 bG9jYXRlIHRoZSByb290IG5vZGUuICovCgllcnJvciA9IHRtcGZzX2FsbG9jX25vZGUodG1w
 LCBWRElSLCBhcmdzLT50YV9yb290X3VpZCwKCSAgICBhcmdzLT50YV9yb290X2dpZCwgYXJn
 cy0+dGFfcm9vdF9tb2RlICYgQUxMUEVSTVMsIE5VTEwsCgkgICAgVk5PVkFMLCAmcm9vdCk7
 CglLQVNTRVJUKGVycm9yID09IDAgJiYgcm9vdCAhPSBOVUxMKTsKCgkvKgoJICogUGFyZW50
 IG9mIHRoZSByb290IGlub2RlIGlzIGl0c2VsZi4gIEFsc28sIHJvb3QgaW5vZGUgaGFzIG5v
 CgkgKiBkaXJlY3RvcnkgZW50cnkgKGkuZS4gaXMgbmV2ZXIgYXR0YWNoZWQpLCB0aHVzIGhv
 bGQgYW4gZXh0cmEKCSAqIHJlZmVyZW5jZSAobGluaykgZm9yIGl0LgoJICovCglyb290LT50
 bl9saW5rcysrOwoJcm9vdC0+dG5fc3BlYy50bl9kaXIudG5fcGFyZW50ID0gcm9vdDsKCXRt
 cC0+dG1fcm9vdCA9IHJvb3Q7CgoJbXAtPm1udF9kYXRhID0gdG1wOwoJbXAtPm1udF9mbGFn
 IHw9IE1OVF9MT0NBTDsKCW1wLT5tbnRfc3RhdC5mX25hbWVtYXggPSBUTVBGU19NQVhOQU1M
 RU47CgltcC0+bW50X2ZzX2JzaGlmdCA9IFBBR0VfU0hJRlQ7CgltcC0+bW50X2Rldl9ic2hp
 ZnQgPSBERVZfQlNISUZUOwoJbXAtPm1udF9pZmxhZyB8PSBJTU5UX01QU0FGRTsKCXZmc19n
 ZXRuZXdmc2lkKG1wKTsKCgllcnJvciA9IHNldF9zdGF0dmZzX2luZm8ocGF0aCwgVUlPX1VT
 RVJTUEFDRSwgInRtcGZzIiwgVUlPX1NZU1NQQUNFLAoJICAgIG1wLT5tbnRfb3AtPnZmc19u
 YW1lLCBtcCwgY3VybHdwKTsKCWlmIChlcnJvcikgewoJCSh2b2lkKXRtcGZzX3VubW91bnQo
 bXAsIE1OVF9GT1JDRSk7Cgl9CglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyBpbnQKdG1wZnNf
 c3RhcnQoc3RydWN0IG1vdW50ICptcCwgaW50IGZsYWdzKQp7CgoJcmV0dXJuIDA7Cn0KCnN0
 YXRpYyBpbnQKdG1wZnNfdW5tb3VudChzdHJ1Y3QgbW91bnQgKm1wLCBpbnQgbW50ZmxhZ3Mp
 CnsKCXRtcGZzX21vdW50X3QgKnRtcDsKCXRtcGZzX25vZGVfdCAqbm9kZTsKCWludCBlcnJv
 ciwgZmxhZ3MgPSAwOwoKCS8qIEhhbmRsZSBmb3JjZWQgdW5tb3VudHMuICovCglpZiAobW50
 ZmxhZ3MgJiBNTlRfRk9SQ0UpCgkJZmxhZ3MgfD0gRk9SQ0VDTE9TRTsKCgkvKiBGaW5hbGl6
 ZSBhbGwgcGVuZGluZyBJL08uICovCgllcnJvciA9IHZmbHVzaChtcCwgTlVMTCwgZmxhZ3Mp
 OwoJaWYgKGVycm9yICE9IDApCgkJcmV0dXJuIGVycm9yOwoKCXRtcCA9IFZGU19UT19UTVBG
 UyhtcCk7CgoJLyogRGVzdHJveSBhbnkgZXhpc3RpbmcgaW5vZGVzLiAqLwoJd2hpbGUgKChu
 b2RlID0gTElTVF9GSVJTVCgmdG1wLT50bV9ub2RlcykpICE9IE5VTEwpIHsKCQlpZiAobm9k
 ZS0+dG5fdHlwZSA9PSBWRElSKSB7CgkJCXRtcGZzX2RpcmVudF90ICpkZTsKCgkJCS8qIERl
 c3Ryb3kgYW55IGRpcmVjdG9yeSBlbnRyaWVzLiAqLwoJCQlkZSA9IFRBSUxRX0ZJUlNUKCZu
 b2RlLT50bl9zcGVjLnRuX2Rpci50bl9kaXIpOwoJCQl3aGlsZSAoZGUgIT0gTlVMTCkgewoJ
 CQkJdG1wZnNfZGlyZW50X3QgKm5kZTsKCgkJCQluZGUgPSBUQUlMUV9ORVhUKGRlLCB0ZF9l
 bnRyaWVzKTsKCQkJCXRtcGZzX2ZyZWVfZGlyZW50KHRtcCwgZGUpOwoJCQkJbm9kZS0+dG5f
 c2l6ZSAtPSBzaXplb2YodG1wZnNfZGlyZW50X3QpOwoJCQkJZGUgPSBuZGU7CgkJCX0KCQl9
 CgkJLyogUmVtb3ZlcyBpbm9kZSBmcm9tIHRoZSBsaXN0LiAqLwoJCXRtcGZzX2ZyZWVfbm9k
 ZSh0bXAsIG5vZGUpOwoJfQoKCS8qIFRocm93IGF3YXkgdGhlIHRtcGZzX21vdW50IHN0cnVj
 dHVyZS4gKi8KCXRtcGZzX21udG1lbV9kZXN0cm95KHRtcCk7CgltdXRleF9kZXN0cm95KCZ0
 bXAtPnRtX2xvY2spOwoJa21lbV9mcmVlKHRtcCwgc2l6ZW9mKCp0bXApKTsKCW1wLT5tbnRf
 ZGF0YSA9IE5VTEw7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKdG1wZnNfcm9vdChzdHJ1
 Y3QgbW91bnQgKm1wLCB2bm9kZV90ICoqdnBwKQp7Cgl0bXBmc19ub2RlX3QgKm5vZGUgPSBW
 RlNfVE9fVE1QRlMobXApLT50bV9yb290OwoKCW11dGV4X2VudGVyKCZub2RlLT50bl92bG9j
 ayk7CglyZXR1cm4gdG1wZnNfdm5vZGVfZ2V0KG1wLCBub2RlLCB2cHApOwp9CgpzdGF0aWMg
 aW50CnRtcGZzX3ZnZXQoc3RydWN0IG1vdW50ICptcCwgaW5vX3QgaW5vLCB2bm9kZV90ICoq
 dnBwKQp7CgoJcHJpbnRmKCJ0bXBmc192Z2V0IGNhbGxlZDsgbmVlZCBmb3IgaXQgdW5rbm93
 biB5ZXRcbiIpOwoJcmV0dXJuIEVPUE5PVFNVUFA7Cn0KCnN0YXRpYyBpbnQKdG1wZnNfZmh0
 b3ZwKHN0cnVjdCBtb3VudCAqbXAsIHN0cnVjdCBmaWQgKmZocCwgdm5vZGVfdCAqKnZwcCkK
 ewoJdG1wZnNfbW91bnRfdCAqdG1wID0gVkZTX1RPX1RNUEZTKG1wKTsKCXRtcGZzX25vZGVf
 dCAqbm9kZTsKCXRtcGZzX2ZpZF90IHRmaDsKCglpZiAoZmhwLT5maWRfbGVuICE9IHNpemVv
 Zih0bXBmc19maWRfdCkpIHsKCQlyZXR1cm4gRUlOVkFMOwoJfQoJbWVtY3B5KCZ0ZmgsIGZo
 cCwgc2l6ZW9mKHRtcGZzX2ZpZF90KSk7CgoJbXV0ZXhfZW50ZXIoJnRtcC0+dG1fbG9jayk7
 CglMSVNUX0ZPUkVBQ0gobm9kZSwgJnRtcC0+dG1fbm9kZXMsIHRuX2VudHJpZXMpIHsKCQlp
 ZiAobm9kZS0+dG5faWQgIT0gdGZoLnRmX2lkKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAo
 VE1QRlNfTk9ERV9HRU4obm9kZSkgIT0gdGZoLnRmX2dlbikgewoJCQljb250aW51ZTsKCQl9
 CgkJbXV0ZXhfZW50ZXIoJm5vZGUtPnRuX3Zsb2NrKTsKCQlicmVhazsKCX0KCW11dGV4X2V4
 aXQoJnRtcC0+dG1fbG9jayk7CgoJLyogV2lsbCByZWxlYXNlIHRoZSB0bl92bG9jay4gKi8K
 CXJldHVybiBub2RlID8gdG1wZnNfdm5vZGVfZ2V0KG1wLCBub2RlLCB2cHApIDogRVNUQUxF
 Owp9CgpzdGF0aWMgaW50CnRtcGZzX3ZwdG9maCh2bm9kZV90ICp2cCwgc3RydWN0IGZpZCAq
 ZmhwLCBzaXplX3QgKmZoX3NpemUpCnsKCXRtcGZzX2ZpZF90IHRmaDsKCXRtcGZzX25vZGVf
 dCAqbm9kZTsKCglpZiAoKmZoX3NpemUgPCBzaXplb2YodG1wZnNfZmlkX3QpKSB7CgkJKmZo
 X3NpemUgPSBzaXplb2YodG1wZnNfZmlkX3QpOwoJCXJldHVybiBFMkJJRzsKCX0KCSpmaF9z
 aXplID0gc2l6ZW9mKHRtcGZzX2ZpZF90KTsKCW5vZGUgPSBWUF9UT19UTVBGU19OT0RFKHZw
 KTsKCgltZW1zZXQoJnRmaCwgMCwgc2l6ZW9mKHRmaCkpOwoJdGZoLnRmX2xlbiA9IHNpemVv
 Zih0bXBmc19maWRfdCk7Cgl0ZmgudGZfZ2VuID0gVE1QRlNfTk9ERV9HRU4obm9kZSk7Cgl0
 ZmgudGZfaWQgPSBub2RlLT50bl9pZDsKCW1lbWNweShmaHAsICZ0ZmgsIHNpemVvZih0Zmgp
 KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAp0bXBmc19zdGF0dmZzKHN0cnVjdCBtb3Vu
 dCAqbXAsIHN0cnVjdCBzdGF0dmZzICpzYnApCnsKCXRtcGZzX21vdW50X3QgKnRtcDsKCWZz
 ZmlsY250X3QgZnJlZW5vZGVzOwoJc2l6ZV90IGF2YWlsOwoKCXRtcCA9IFZGU19UT19UTVBG
 UyhtcCk7CgoJc2JwLT5mX2lvc2l6ZSA9IHNicC0+Zl9mcnNpemUgPSBzYnAtPmZfYnNpemUg
 PSBQQUdFX1NJWkU7CgoJbXV0ZXhfZW50ZXIoJnRtcC0+dG1fYWNjX2xvY2spOwoJYXZhaWwg
 PSAgdG1wZnNfcGFnZXNfYXZhaWwodG1wKTsKCXNicC0+Zl9ibG9ja3MgPSAodG1wZnNfYnl0
 ZXNfbWF4KHRtcCkgPj4gUEFHRV9TSElGVCk7CglzYnAtPmZfYmF2YWlsID0gc2JwLT5mX2Jm
 cmVlID0gYXZhaWw7CglzYnAtPmZfYnJlc3ZkID0gMDsKCglmcmVlbm9kZXMgPSBNSU4odG1w
 LT50bV9ub2Rlc19tYXggLSB0bXAtPnRtX25vZGVzX2NudCwKCSAgICBhdmFpbCAqIFBBR0Vf
 U0laRSAvIHNpemVvZih0bXBmc19ub2RlX3QpKTsKCglzYnAtPmZfZmlsZXMgPSB0bXAtPnRt
 X25vZGVzX2NudCArIGZyZWVub2RlczsKCXNicC0+Zl9mYXZhaWwgPSBzYnAtPmZfZmZyZWUg
 PSBmcmVlbm9kZXM7CglzYnAtPmZfZnJlc3ZkID0gMDsKCW11dGV4X2V4aXQoJnRtcC0+dG1f
 YWNjX2xvY2spOwoKCWNvcHlfc3RhdHZmc19pbmZvKHNicCwgbXApOwoKCXJldHVybiAwOwp9
 CgpzdGF0aWMgaW50CnRtcGZzX3N5bmMoc3RydWN0IG1vdW50ICptcCwgaW50IHdhaXRmb3Is
 IGthdXRoX2NyZWRfdCB1YykKewoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnRtcGZzX3Nu
 YXBzaG90KHN0cnVjdCBtb3VudCAqbXAsIHZub2RlX3QgKnZwLCBzdHJ1Y3QgdGltZXNwZWMg
 KmN0aW1lKQp7CgoJcmV0dXJuIEVPUE5PVFNVUFA7Cn0KCi8qCiAqIHRtcGZzIHZmcyBvcGVy
 YXRpb25zLgogKi8KCmV4dGVybiBjb25zdCBzdHJ1Y3Qgdm5vZGVvcHZfZGVzYyB0bXBmc19m
 aWZvb3Bfb3B2X2Rlc2M7CmV4dGVybiBjb25zdCBzdHJ1Y3Qgdm5vZGVvcHZfZGVzYyB0bXBm
 c19zcGVjb3Bfb3B2X2Rlc2M7CmV4dGVybiBjb25zdCBzdHJ1Y3Qgdm5vZGVvcHZfZGVzYyB0
 bXBmc192bm9kZW9wX29wdl9kZXNjOwoKY29uc3Qgc3RydWN0IHZub2Rlb3B2X2Rlc2MgKiBj
 b25zdCB0bXBmc192bm9kZW9wdl9kZXNjc1tdID0gewoJJnRtcGZzX2ZpZm9vcF9vcHZfZGVz
 YywKCSZ0bXBmc19zcGVjb3Bfb3B2X2Rlc2MsCgkmdG1wZnNfdm5vZGVvcF9vcHZfZGVzYywK
 CU5VTEwsCn07CgpzdHJ1Y3QgdmZzb3BzIHRtcGZzX3Zmc29wcyA9IHsKCU1PVU5UX1RNUEZT
 LAkJCS8qIHZmc19uYW1lICovCglzaXplb2YgKHN0cnVjdCB0bXBmc19hcmdzKSwKCXRtcGZz
 X21vdW50LAkJCS8qIHZmc19tb3VudCAqLwoJdG1wZnNfc3RhcnQsCQkJLyogdmZzX3N0YXJ0
 ICovCgl0bXBmc191bm1vdW50LAkJCS8qIHZmc191bm1vdW50ICovCgl0bXBmc19yb290LAkJ
 CS8qIHZmc19yb290ICovCgkodm9pZCAqKWVvcG5vdHN1cHAsCQkvKiB2ZnNfcXVvdGFjdGwg
 Ki8KCXRtcGZzX3N0YXR2ZnMsCQkJLyogdmZzX3N0YXR2ZnMgKi8KCXRtcGZzX3N5bmMsCQkJ
 LyogdmZzX3N5bmMgKi8KCXRtcGZzX3ZnZXQsCQkJLyogdmZzX3ZnZXQgKi8KCXRtcGZzX2Zo
 dG92cCwJCQkvKiB2ZnNfZmh0b3ZwICovCgl0bXBmc192cHRvZmgsCQkJLyogdmZzX3ZwdG9m
 aCAqLwoJdG1wZnNfaW5pdCwJCQkvKiB2ZnNfaW5pdCAqLwoJTlVMTCwJCQkJLyogdmZzX3Jl
 aW5pdCAqLwoJdG1wZnNfZG9uZSwJCQkvKiB2ZnNfZG9uZSAqLwoJTlVMTCwJCQkJLyogdmZz
 X21vdW50cm9vdCAqLwoJdG1wZnNfc25hcHNob3QsCQkJLyogdmZzX3NuYXBzaG90ICovCgl2
 ZnNfc3RkZXh0YXR0cmN0bCwJCS8qIHZmc19leHRhdHRyY3RsICovCgkodm9pZCAqKWVvcG5v
 dHN1cHAsCQkvKiB2ZnNfc3VzcGVuZGN0bCAqLwoJZ2VuZnNfcmVuYW1lbG9ja19lbnRlciwK
 CWdlbmZzX3JlbmFtZWxvY2tfZXhpdCwKCSh2b2lkICopZW9wbm90c3VwcCwKCXRtcGZzX3Zu
 b2Rlb3B2X2Rlc2NzLAoJMCwJCQkJLyogdmZzX3JlZmNvdW50ICovCgl7IE5VTEwsIE5VTEwg
 fSwKfTsKCnN0YXRpYyBpbnQKdG1wZnNfbW9kY21kKG1vZGNtZF90IGNtZCwgdm9pZCAqYXJn
 KQp7CgoJc3dpdGNoIChjbWQpIHsKCWNhc2UgTU9EVUxFX0NNRF9JTklUOgoJCXJldHVybiB2
 ZnNfYXR0YWNoKCZ0bXBmc192ZnNvcHMpOwoJY2FzZSBNT0RVTEVfQ01EX0ZJTkk6CgkJcmV0
 dXJuIHZmc19kZXRhY2goJnRtcGZzX3Zmc29wcyk7CglkZWZhdWx0OgoJCXJldHVybiBFTk9U
 VFk7Cgl9Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL2ZzL3RtcGZzL2dlbmZzX3JlbmFt
 ZS5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAMDEwMDQ0NAAwMDAwMDAwADAwMDAwMDAAMDAwMDAxMDU0NjcAMTIwMjYzNDYxMTUA
 MDAyMDEwMgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qCSROZXRCU0Q6IGdl
 bmZzX3JlbmFtZS5jLHYgMS4xIDIwMTIvMDUvMDggMjM6NTM6MjYgcmlhc3RyYWRoIEV4cCAk
 CSovCgovKi0KICogQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBOZXRCU0QgRm91bmRhdGlvbiwg
 SW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGNvZGUgaXMgZGVyaXZl
 ZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgog
 KiBieSBUYXlsb3IgUiBDYW1wYmVsbC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
 biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNh
 dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
 aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
 bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlz
 dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJl
 ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
 Y29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
 ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
 b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoK
 ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04s
 IElOQy4gQU5EIENPTlRSSUJVVE9SUwogKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9S
 IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKICogVE8s
 IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
 IEZPUiBBIFBBUlRJQ1VMQVIKICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
 RU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUg
 Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
 UlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
 TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
 RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRF
 UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
 WSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
 SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBX
 QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
 IFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgovKgogKiBHZW5lcmlj
 IHJlbmFtZSBhYnN0cmFjdGlvbi4KICoKICogUmVuYW1lIGlzIHVuYmVsaWV2YWJseSBoYWly
 eS4gIFRyeSB0byB1c2UgdGhpcyBpZiB5b3UgY2FuIC0tCiAqIG90aGVyd2lzZSB5b3UgYXJl
 IHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gZ2V0IGl0IHdyb25nLgogKi8KCiNpbmNsdWRl
 IDxzeXMvY2RlZnMuaD4KX19LRVJORUxfUkNTSUQoMCwgIiROZXRCU0Q6IGdlbmZzX3JlbmFt
 ZS5jLHYgMS4xIDIwMTIvMDUvMDggMjM6NTM6MjYgcmlhc3RyYWRoIEV4cCAkIik7CgojaW5j
 bHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMva2F1dGguaD4KI2luY2x1ZGUgPHN5
 cy9tb3VudC5oPgojaW5jbHVkZSA8c3lzL25hbWVpLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o
 PgojaW5jbHVkZSA8c3lzL3Zub2RlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpZiAw
 CiNpbmNsdWRlIDxtaXNjZnMvZ2VuZnMvZ2VuZnMuaD4KI2Vsc2UgLy8gaW5jbHVkZWQgZnJv
 bSBnZW5mcy5oCgovLyBmcm9tIHN5cy9rZXJuL2thcm5fYXV0aC5jIC4uLgoKLy8gc29tZSBk
 dW1teSBkZWZpbml0aW9ucyAuLi4KI2RlZmluZSBLQVVUSF9WTk9ERV9ERUxFVEUgMAojZGVm
 aW5lIEtBVVRIX1ZOT0RFX1JFTkFNRSAwCgpzdGF0aWMgaW50CmdlbmZzX2Nhbl9zdGlja3ko
 a2F1dGhfY3JlZF90IGNyZWQsIHVpZF90IGRpcl91aWQsIHVpZF90IGZpbGVfdWlkKQp7CiAg
 aWYgKGthdXRoX2NyZWRfZ2V0ZXVpZChjcmVkKSAhPSBkaXJfdWlkICYmCiAgICAgIGthdXRo
 X2NyZWRfZ2V0ZXVpZChjcmVkKSAhPSBmaWxlX3VpZCkKICAgIHJldHVybiBFUEVSTTsKCiAg
 cmV0dXJuIDA7Cn0KCmludCBrYXV0aF9hdXRob3JpemVfdm5vZGUoa2F1dGhfY3JlZF90LCBr
 YXV0aF9hY3Rpb25fdCwgc3RydWN0IHZub2RlKiwgc3RydWN0IHZub2RlKiwgaW50KTsKCmlu
 dAprYXV0aF9hdXRob3JpemVfdm5vZGUoa2F1dGhfY3JlZF90IGNyZWQsIGthdXRoX2FjdGlv
 bl90IGFjdGlvbiwKICAgIHN0cnVjdCB2bm9kZSAqdnAsIHN0cnVjdCB2bm9kZSAqZHZwLCBp
 bnQgZnNfZGVjaXNpb24pCnsKI2lmIDAgLy8gbm90IGluIDUuMSAuLi4uCglpbnQgZXJyb3I7
 CgoJZXJyb3IgPSBrYXV0aF9hdXRob3JpemVfYWN0aW9uX2ludGVybmFsKGthdXRoX2J1aWx0
 aW5fc2NvcGVfdm5vZGUsIGNyZWQsCgkgICAgYWN0aW9uLCB2cCwgZHZwLCBOVUxMLCBOVUxM
 KTsKCglpZiAoZXJyb3IgPT0gS0FVVEhfUkVTVUxUX0RFTlkpCgkJcmV0dXJuIChFQUNDRVMp
 OwoKCWlmIChlcnJvciA9PSBLQVVUSF9SRVNVTFRfQUxMT1cpCgkJcmV0dXJuICgwKTsKCgkv
 KgoJICogSWYgdGhlIGZpbGUtc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZGVjaXNpb24tYmVm
 b3JlLWFjdGlvbiwgd2UgY2FuCgkgKiBvbmx5IHNob3J0LWNpcmN1aXQgdGhlIG9wZXJhdGlv
 biAoZGVueSkuIElmIHdlJ3JlIGhlcmUsIGl0IG1lYW5zIG5vCgkgKiBsaXN0ZW5lciBkZW5p
 ZWQgaXQsIHNvIG91ciBvbmx5IGFsdGVybmF0aXZlIGlzIHRvIHN1cHBvc2VkbHktYWxsb3cK
 CSAqIGl0IGFuZCBsZXQgdGhlIGZpbGUtc3lzdGVtIGhhdmUgdGhlIGxhc3Qgd29yZC4KCSAq
 LwoJaWYgKGZzX2RlY2lzaW9uID09IEtBVVRIX1ZOT0RFX1JFTU9URUZTKQoJCXJldHVybiAo
 MCk7CiNlbHNlCglpZiAoa2F1dGhfYXV0aG9yaXplX2dlbmVyaWMoY3JlZCwgS0FVVEhfR0VO
 RVJJQ19JU1NVU0VSLCBOVUxMKSAhPSAwICYmCgkgICAgZ2VuZnNfY2FuX3N0aWNreShjcmVk
 LCBWUF9UT19UTVBGU19OT0RFKGR2cCktPnRuX3VpZCwgVlBfVE9fVE1QRlNfTk9ERSh2cCkt
 PnRuX3VpZCkgIT0gMCkKCSAgcmV0dXJuIEVQRVJNOwojZW5kaWYKCglyZXR1cm4gKGZzX2Rl
 Y2lzaW9uKTsKfQoKCnN0cnVjdCBnZW5mc19yZW5hbWVfb3BzOwoKCmludAlnZW5mc19pbnNh
 bmVfcmVuYW1lKHZvaWQgKiwKCSAgICBpbnQgKCopKHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3Qg
 Y29tcG9uZW50bmFtZSAqLAoJCXN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgY29tcG9uZW50bmFt
 ZSAqLAoJCWthdXRoX2NyZWRfdCwgYm9vbCkpOwppbnQJZ2VuZnNfc2FuZV9yZW5hbWUoY29u
 c3Qgc3RydWN0IGdlbmZzX3JlbmFtZV9vcHMgKiwKCSAgICBzdHJ1Y3Qgdm5vZGUgKiwgc3Ry
 dWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAqLAoJICAgIHN0cnVjdCB2bm9kZSAqLCBzdHJ1
 Y3QgY29tcG9uZW50bmFtZSAqLCB2b2lkICosCgkgICAga2F1dGhfY3JlZF90LCBib29sKTsK
 CnZvaWQJZ2VuZnNfcmVuYW1lX2tub3RlKHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3Qgdm5vZGUg
 Kiwgc3RydWN0IHZub2RlICosCgkgICAgc3RydWN0IHZub2RlICosIGJvb2wpOwp2b2lkCWdl
 bmZzX3JlbmFtZV9jYWNoZV9wdXJnZShzdHJ1Y3Qgdm5vZGUgKiwgc3RydWN0IHZub2RlICos
 IHN0cnVjdCB2bm9kZSAqLAoJICAgIHN0cnVjdCB2bm9kZSAqKTsKCmludAlnZW5mc191ZnNs
 aWtlX3JlbmFtZV9jaGVja19wb3NzaWJsZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25n
 LAoJICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2wsCgkgICAgdW5zaWdu
 ZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CmludAlnZW5mc191ZnNsaWtlX3JlbmFtZV9jaGVj
 a19wZXJtaXR0ZWQoa2F1dGhfY3JlZF90LAoJICAgIHN0cnVjdCB2bm9kZSAqLCBtb2RlX3Qs
 IHVpZF90LAoJICAgIHN0cnVjdCB2bm9kZSAqLCB1aWRfdCwKCSAgICBzdHJ1Y3Qgdm5vZGUg
 KiwgbW9kZV90LCB1aWRfdCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKiwgdWlkX3QpOwppbnQJZ2Vu
 ZnNfdWZzbGlrZV9yZW1vdmVfY2hlY2tfcG9zc2libGUodW5zaWduZWQgbG9uZywgdW5zaWdu
 ZWQgbG9uZywKCSAgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKaW50CWdlbmZz
 X3Vmc2xpa2VfcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChrYXV0aF9jcmVkX3QsCgkgICAgc3Ry
 dWN0IHZub2RlICosIG1vZGVfdCwgdWlkX3QsCgkgICAgc3RydWN0IHZub2RlICosIHVpZF90
 KTsKCnN0cnVjdCBnZW5mc19yZW5hbWVfb3BzIHsKCWJvb2wgKCpncm9fZGlyZWN0b3J5X2Vt
 cHR5X3ApKHN0cnVjdCBtb3VudCAqbXAsIGthdXRoX2NyZWRfdCBjcmVkLAoJICAgIHN0cnVj
 dCB2bm9kZSAqdnAsIHN0cnVjdCB2bm9kZSAqZHZwKTsKCWludCAoKmdyb19yZW5hbWVfY2hl
 Y2tfcG9zc2libGUpKHN0cnVjdCBtb3VudCAqbXAsCgkgICAgc3RydWN0IHZub2RlICpmZHZw
 LCBzdHJ1Y3Qgdm5vZGUgKmZ2cCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKnRkdnAsIHN0cnVjdCB2
 bm9kZSAqdHZwKTsKCWludCAoKmdyb19yZW5hbWVfY2hlY2tfcGVybWl0dGVkKShzdHJ1Y3Qg
 bW91bnQgKm1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAs
 IHN0cnVjdCB2bm9kZSAqZnZwLAoJICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IHZu
 b2RlICp0dnApOwoJaW50ICgqZ3JvX3JlbW92ZV9jaGVja19wb3NzaWJsZSkoc3RydWN0IG1v
 dW50ICptcCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKmR2cCwgc3RydWN0IHZub2RlICp2cCk7Cglp
 bnQgKCpncm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZCkoc3RydWN0IG1vdW50ICptcCwga2F1
 dGhfY3JlZF90IGNyZWQsCgkgICAgc3RydWN0IHZub2RlICpkdnAsIHN0cnVjdCB2bm9kZSAq
 dnApOwoJaW50ICgqZ3JvX3JlbmFtZSkoc3RydWN0IG1vdW50ICptcCwga2F1dGhfY3JlZF90
 IGNyZWQsCgkgICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAq
 ZmNucCwKCSAgICB2b2lkICpmZGUsIHN0cnVjdCB2bm9kZSAqZnZwLAoJICAgIHN0cnVjdCB2
 bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUgKnRjbnAsCgkgICAgdm9pZCAqdGRl
 LCBzdHJ1Y3Qgdm5vZGUgKnR2cCk7CglpbnQgKCpncm9fcmVtb3ZlKShzdHJ1Y3QgbW91bnQg
 Km1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKCSAgICBzdHJ1Y3Qgdm5vZGUgKmR2cCwgc3RydWN0
 IGNvbXBvbmVudG5hbWUgKmNucCwgdm9pZCAqZGUsCgkgICAgc3RydWN0IHZub2RlICp2cCk7
 CglpbnQgKCpncm9fbG9va3VwKShzdHJ1Y3QgbW91bnQgKm1wLCBzdHJ1Y3Qgdm5vZGUgKmR2
 cCwKCSAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqY25wLCB2b2lkICpmZGVfcmV0LCBzdHJ1
 Y3Qgdm5vZGUgKip2cF9yZXQpOwoJaW50ICgqZ3JvX2dlbmVhbG9neSkoc3RydWN0IG1vdW50
 ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCgkgICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1
 Y3Qgdm5vZGUgKnRkdnAsCgkgICAgc3RydWN0IHZub2RlICoqaW50ZXJtZWRpYXRlX25vZGVf
 cmV0KTsKCWludCAoKmdyb19sb2NrX2RpcmVjdG9yeSkoc3RydWN0IG1vdW50ICptcCwgc3Ry
 dWN0IHZub2RlICp2cCk7Cn07CgojZW5kaWYKCi8qCiAqIFNhbXBsZSBjb3B5cGFzdGEgZm9y
 IGltcGxlbWVudGluZyBWT1BfUkVOQU1FIHZpYSBnZW5mc19yZW5hbWUuCiAqIERvbid0IGNo
 YW5nZSB0aGlzIHRlbXBsYXRlIHdpdGhvdXQgY2FyZWZ1bGx5IGNvbnNpZGVyaW5nIHdoZXRo
 ZXIKICogZXZlcnkgb3RoZXIgZmlsZSBzeXN0ZW0gdGhhdCBhbHJlYWR5IHVzZXMgaXQgbmVl
 ZHMgdG8gY2hhbmdlIHRvby4KICogVGhhdCB3YXksIG9uY2Ugd2UgaGF2ZSBjaGFuZ2VkIGFs
 bCB0aGUgZmlsZSBzeXN0ZW1zIHRvIHVzZSBpdCwgd2UKICogY2FuIGVhc2lseSByZXBsYWNl
 IG11bWJsZWZzX3JlbmFtZSBieSBtdW1ibGVmc19zYW5lX3JlbmFtZSBhbmQKICogZWxpbWlu
 YXRlIHRoZSBpbnNhbmUgQVBJIGFsdG9nZXRoZXIuCiAqLwoKLyogYmVnaW4gc2FtcGxlIGNv
 cHlwYXN0YSAqLwojaWYgMAoKc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3Bz
 IG11bWJsZWZzX2dlbmZzX3JlbmFtZV9vcHM7CgovKgogKiBtdW1ibGVmc19zYW5lX3JlbmFt
 ZTogVGhlIGhhaXJpZXN0IHZvcCwgd2l0aCB0aGUgc2FuZXIgQVBJLgogKgogKiBBcmd1bWVu
 dHM6CiAqCiAqIC4gZmR2cCAoZnJvbSBkaXJlY3Rvcnkgdm5vZGUpLAogKiAuIGZjbnAgKGZy
 b20gY29tcG9uZW50IG5hbWUpLAogKiAuIHRkdnAgKHRvIGRpcmVjdG9yeSB2bm9kZSksCiAq
 IC4gdGNucCAodG8gY29tcG9uZW50IG5hbWUpLAogKiAuIGNyZWQgKGNyZWRlbnRpYWxzIHN0
 cnVjdHVyZSksIGFuZAogKiAuIHBvc2l4bHlfY29ycmVjdCAoZmxhZyBmb3IgYmVoYXZpb3Vy
 IGlmIHRhcmdldCAmIHNvdXJjZSBsaW5rIHNhbWUgZmlsZSkuCiAqCiAqIGZkdnAgYW5kIHRk
 dnAgbWF5IGJlIHRoZSBzYW1lLCBhbmQgbXVzdCBiZSByZWZlcmVuY2VkIGFuZCB1bmxvY2tl
 ZC4KICovCnN0YXRpYyBpbnQKbXVtYmxlZnNfc2FuZV9yZW5hbWUoCiAgICBzdHJ1Y3Qgdm5v
 ZGUgKmZkdnAsIHN0cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAgc3RydWN0IHZub2Rl
 ICp0ZHZwLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCwKICAgIGthdXRoX2NyZWRfdCBj
 cmVkLCBib29sIHBvc2l4bHlfY29ycmVjdCkKewoJc3RydWN0IG11bWJsZWZzX2xvb2t1cF9y
 ZXN1bHRzIGZ1bHIsIHR1bHI7CgoJcmV0dXJuIGdlbmZzX3NhbmVfcmVuYW1lKCZtdW1ibGVm
 c19nZW5mc19yZW5hbWVfb3BzLAoJICAgIGZkdnAsIGZjbnAsICZmdWxyLCB0ZHZwLCB0Y25w
 LCAmdHVsciwKCSAgICBjcmVkLCBwb3NpeGx5X2NvcnJlY3QpOwp9CgovKgogKiBtdW1ibGVm
 c19yZW5hbWU6IFRoZSBoYWlyaWVzdCB2b3AsIHdpdGggdGhlIGluc2FuZXN0IEFQSS4gIERl
 ZmVyIHRvCiAqIGdlbmZzX2luc2FuZV9yZW5hbWUgaW1tZWRpYXRlbHkuCiAqLwppbnQKbXVt
 YmxlZnNfcmVuYW1lKHZvaWQgKnYpCnsKCglyZXR1cm4gZ2VuZnNfaW5zYW5lX3JlbmFtZSh2
 LCAmbXVtYmxlZnNfc2FuZV9yZW5hbWUpOwp9CgojZW5kaWYKLyogZW5kIHNhbXBsZSBjb3B5
 cGFzdGEgKi8KCi8qCiAqIEZvcndhcmQgZGVjbGFyYXRpb25zCiAqLwoKc3RhdGljIGludCBn
 ZW5mc19yZW5hbWVfZW50ZXIoY29uc3Qgc3RydWN0IGdlbmZzX3JlbmFtZV9vcHMgKiwgc3Ry
 dWN0IG1vdW50ICosCiAgICBrYXV0aF9jcmVkX3QsCiAgICBzdHJ1Y3Qgdm5vZGUgKiwgc3Ry
 dWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAqLCBzdHJ1Y3Qgdm5vZGUgKiosCiAgICBzdHJ1
 Y3Qgdm5vZGUgKiwgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAqLCBzdHJ1Y3Qgdm5v
 ZGUgKiopOwpzdGF0aWMgaW50IGdlbmZzX3JlbmFtZV9lbnRlcl9jb21tb24oY29uc3Qgc3Ry
 dWN0IGdlbmZzX3JlbmFtZV9vcHMgKiwKICAgIHN0cnVjdCBtb3VudCAqLCBrYXV0aF9jcmVk
 X3QsIHN0cnVjdCB2bm9kZSAqLAogICAgc3RydWN0IGNvbXBvbmVudG5hbWUgKiwgdm9pZCAq
 LCBzdHJ1Y3Qgdm5vZGUgKiosCiAgICBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqLCB2b2lkICos
 IHN0cnVjdCB2bm9kZSAqKik7CnN0YXRpYyBpbnQgZ2VuZnNfcmVuYW1lX2VudGVyX3NlcGFy
 YXRlKGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICosCiAgICBzdHJ1Y3QgbW91bnQg
 Kiwga2F1dGhfY3JlZF90LAogICAgc3RydWN0IHZub2RlICosIHN0cnVjdCBjb21wb25lbnRu
 YW1lICosIHZvaWQgKiwgc3RydWN0IHZub2RlICoqLAogICAgc3RydWN0IHZub2RlICosIHN0
 cnVjdCBjb21wb25lbnRuYW1lICosIHZvaWQgKiwgc3RydWN0IHZub2RlICoqKTsKc3RhdGlj
 IGludCBnZW5mc19yZW5hbWVfbG9jayhjb25zdCBzdHJ1Y3QgZ2VuZnNfcmVuYW1lX29wcyAq
 LCBzdHJ1Y3QgbW91bnQgKiwKICAgIGthdXRoX2NyZWRfdCwgaW50LCBpbnQsIGludCwKICAg
 IHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqLCBib29sLCB2b2lkICos
 IHN0cnVjdCB2bm9kZSAqKiwKICAgIHN0cnVjdCB2bm9kZSAqLCBzdHJ1Y3QgY29tcG9uZW50
 bmFtZSAqLCBib29sLCB2b2lkICosIHN0cnVjdCB2bm9kZSAqKik7CnN0YXRpYyB2b2lkIGdl
 bmZzX3JlbmFtZV9leGl0KGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICosIHN0cnVj
 dCBtb3VudCAqLAogICAgc3RydWN0IHZub2RlICosIHN0cnVjdCB2bm9kZSAqLAogICAgc3Ry
 dWN0IHZub2RlICosIHN0cnVjdCB2bm9kZSAqKTsKc3RhdGljIGludCBnZW5mc19yZW5hbWVf
 cmVtb3ZlKGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICosIHN0cnVjdCBtb3VudCAq
 LAogICAga2F1dGhfY3JlZF90LAogICAgc3RydWN0IHZub2RlICosIHN0cnVjdCBjb21wb25l
 bnRuYW1lICosIHZvaWQgKiwgc3RydWN0IHZub2RlICopOwoKLyoKICogZ2VuZnNfaW5zYW5l
 X3JlbmFtZTogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW5zYW5lIEFQSSBmb3IK
 ICogdGhlIHJlbmFtZSB2b3AuCiAqCiAqIEFyZ3VtZW50czoKICoKICogLiBmZHZwIChmcm9t
 IGRpcmVjdG9yeSB2bm9kZSksCiAqIC4gZnZwIChmcm9tIHZub2RlKSwKICogLiBmY25wIChm
 cm9tIGNvbXBvbmVudCBuYW1lKSwKICogLiB0ZHZwICh0byBkaXJlY3Rvcnkgdm5vZGUpLAog
 KiAuIHR2cCAodG8gdm5vZGUsIG9yIE5VTEwpLCBhbmQKICogLiB0Y25wICh0byBjb21wb25l
 bnQgbmFtZSkuCiAqCiAqIEFueSBwYWlyIG9mIHZub2RlIHBhcmFtZXRlcnMgbWF5IGhhdmUg
 dGhlIHNhbWUgdm5vZGUuCiAqCiAqIE9uIGVudHJ5LAogKgogKiAuIGZkdnAsIGZ2cCwgdGR2
 cCwgYW5kIHR2cCBhcmUgcmVmZXJlbmNlZCwKICogLiBmZHZwIGFuZCBmdnAgYXJlIHVubG9j
 a2VkLCBhbmQKICogLiB0ZHZwIGFuZCB0dnAgKGlmIG5vbm51bGwpIGFyZSBsb2NrZWQuCiAq
 CiAqIE9uIGV4aXQsCiAqCiAqIC4gZmR2cCwgZnZwLCB0ZHZwLCBhbmQgdHZwIChpZiBub25u
 dWxsKSBhcmUgdW5yZWZlcmVuY2VkLCBhbmQKICogLiB0ZHZwIGFuZCB0dnAgKGlmIG5vbm51
 bGwpIGFyZSB1bmxvY2tlZC4KICovCmludApnZW5mc19pbnNhbmVfcmVuYW1lKHZvaWQgKnYs
 CiAgICBpbnQgKCpzYW5lX3JlbmFtZSkoc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3QgY29t
 cG9uZW50bmFtZSAqZmNucCwKCXN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVu
 dG5hbWUgKnRjbnAsCglrYXV0aF9jcmVkX3QgY3JlZCwgYm9vbCBwb3NpeGx5X2NvcnJlY3Qp
 KQp7CglzdHJ1Y3Qgdm9wX3JlbmFtZV9hcmdzCS8qIHsKCQlzdHJ1Y3Qgdm5vZGUgKmFfZmR2
 cDsKCQlzdHJ1Y3Qgdm5vZGUgKmFfZnZwOwoJCXN0cnVjdCBjb21wb25lbnRuYW1lICphX2Zj
 bnA7CgkJc3RydWN0IHZub2RlICphX3RkdnA7CgkJc3RydWN0IHZub2RlICphX3R2cDsKCQlz
 dHJ1Y3QgY29tcG9uZW50bmFtZSAqYV90Y25wOwoJfSAqLyAqYXAgPSB2OwoJc3RydWN0IHZu
 b2RlICpmZHZwID0gYXAtPmFfZmR2cDsKCXN0cnVjdCB2bm9kZSAqZnZwID0gYXAtPmFfZnZw
 OwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKmZjbnAgPSBhcC0+YV9mY25wOwoJc3RydWN0IHZu
 b2RlICp0ZHZwID0gYXAtPmFfdGR2cDsKCXN0cnVjdCB2bm9kZSAqdHZwID0gYXAtPmFfdHZw
 OwoJc3RydWN0IGNvbXBvbmVudG5hbWUgKnRjbnAgPSBhcC0+YV90Y25wOwoJa2F1dGhfY3Jl
 ZF90IGNyZWQ7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChmZHZwICE9IE5VTEwpOwoJS0FTU0VS
 VChmdnAgIT0gTlVMTCk7CglLQVNTRVJUKGZjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZjbnAt
 PmNuX25hbWVwdHIgIT0gTlVMTCk7CglLQVNTRVJUKHRkdnAgIT0gTlVMTCk7CglLQVNTRVJU
 KHRjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZjbnAtPmNuX25hbWVwdHIgIT0gTlVMTCk7Cgkv
 KiBLQVNTRVJUKFZPUF9JU0xPQ0tFRChmZHZwKSAhPSBMS19FWENMVVNJVkUpOyAqLwoJLyog
 S0FTU0VSVChWT1BfSVNMT0NLRUQoZnZwKSAhPSBMS19FWENMVVNJVkUpOyAqLwoJS0FTU0VS
 VChWT1BfSVNMT0NLRUQodGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoKHR2cCA9
 PSBOVUxMKSB8fCAoVk9QX0lTTE9DS0VEKHR2cCkgPT0gTEtfRVhDTFVTSVZFKSk7CglLQVNT
 RVJUKGZkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodGR2cC0+dl90eXBlID09IFZE
 SVIpOwoKCWNyZWQgPSBmY25wLT5jbl9jcmVkOwoKCS8qCgkgKiBYWFggV2FudCBhIGJldHRl
 ciBlcXVhbGl0eSB0ZXN0LiAgYHRjbnAtPmNuX2NyZWQgPT0gY3JlZCcKCSAqIGhvc2VzIHAy
 ayBiZWNhdXNlIHB1ZmZzIHRyYW5zbWl0cyB0aGUgY3JlZHMgc2VwYXJhdGVseSBhbmQKCSAq
 IGFsbG9jYXRlcyBkaXN0aW5jdCBidXQgZXF1aXZhbGVudCBzdHJ1Y3R1cmVzIGZvciB0aGVt
 LgoJICovCglLQVNTRVJUKGthdXRoX2NyZWRfdWlkbWF0Y2goY3JlZCwgdGNucC0+Y25fY3Jl
 ZCkpOwoKCS8qCgkgKiBTYW5pdGl6ZSBvdXIgd29ybGQgZnJvbSB0aGUgVkZTIGluc2FuaXR5
 LiAgVW5sb2NrIHRoZSB0YXJnZXQKCSAqIGRpcmVjdG9yeSBhbmQgbm9kZSwgd2hpY2ggYXJl
 IGxvY2tlZC4gIFJlbGVhc2UgdGhlIGNoaWxkcmVuLAoJICogd2hpY2ggYXJlIHJlZmVyZW5j
 ZWQsIHNpbmNlIHdlJ2xsIGJlIGxvb2tpbmcgdGhlbSB1cCBhZ2FpbgoJICogbGF0ZXIuCgkg
 Ki8KCglWT1BfVU5MT0NLKHRkdnAsIDApOwoJaWYgKCh0dnAgIT0gTlVMTCkgJiYgKHR2cCAh
 PSB0ZHZwKSkKCQlWT1BfVU5MT0NLKHR2cCwgMCk7CgoJdnJlbGUoZnZwKTsKCWlmICh0dnAg
 IT0gTlVMTCkKCQl2cmVsZSh0dnApOwoKCWVycm9yID0gKCpzYW5lX3JlbmFtZSkoZmR2cCwg
 ZmNucCwgdGR2cCwgdGNucCwgY3JlZCwgZmFsc2UpOwoKCS8qCgkgKiBBbGwgZG9uZSwgd2hl
 dGhlciB3aXRoIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIFJlbGVhc2UgdGhlCgkgKiBkaXJlY3Rv
 cnkgbm9kZXMgbm93LCBhcyB0aGUgY2FsbGVyIGV4cGVjdHMgZnJvbSB0aGUgVkZTCgkgKiBw
 cm90b2NvbC4KCSAqLwoJdnJlbGUoZmR2cCk7Cgl2cmVsZSh0ZHZwKTsKCglyZXR1cm4gZXJy
 b3I7Cn0KCi8qCiAqIGdlbmZzX3NhbmVfcmVuYW1lOiBHZW5lcmljIGltcGxlbWVudGF0aW9u
 IG9mIHRoZSBzYW5lciBBUEkgZm9yIHRoZQogKiByZW5hbWUgdm9wLiAgSGFuZGxlcyBhbmNl
 c3RyeSBjaGVja3MsIGxvY2tpbmcsIGFuZCBwZXJtaXNzaW9ucwogKiBjaGVja3MuICBDYWxs
 ZXIgaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGUgZ2VuZnMgcmVuYW1lCiAq
 IG9wZXJhdGlvbnMuCiAqCiAqIGZkdnAgYW5kIHRkdnAgbXVzdCBiZSByZWZlcmVuY2VkIGFu
 ZCB1bmxvY2tlZC4KICovCmludApnZW5mc19zYW5lX3JlbmFtZShjb25zdCBzdHJ1Y3QgZ2Vu
 ZnNfcmVuYW1lX29wcyAqb3BzLAogICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3QgY29t
 cG9uZW50bmFtZSAqZmNucCwgdm9pZCAqZmRlLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBz
 dHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCwgdm9pZCAqdGRlLAogICAga2F1dGhfY3JlZF90
 IGNyZWQsIGJvb2wgcG9zaXhseV9jb3JyZWN0KQp7CglzdHJ1Y3QgbW91bnQgKm1wOwoJc3Ry
 dWN0IHZub2RlICpmdnAgPSBOVUxMLCAqdHZwID0gTlVMTDsKCWludCBlcnJvcjsKCglLQVNT
 RVJUKG9wcyAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmNu
 cCAhPSBOVUxMKTsKCUtBU1NFUlQodGR2cCAhPSBOVUxMKTsKCUtBU1NFUlQodGNucCAhPSBO
 VUxMKTsKCS8qIEtBU1NFUlQoVk9QX0lTTE9DS0VEKGZkdnApICE9IExLX0VYQ0xVU0lWRSk7
 ICovCgkvKiBLQVNTRVJUKFZPUF9JU0xPQ0tFRCh0ZHZwKSAhPSBMS19FWENMVVNJVkUpOyAq
 LwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHRkdnAtPnZfdHlw
 ZSA9PSBWRElSKTsKI2lmIDAgLy8gbm90IGluIDUuMSAuLgogICAgICAgIEtBU1NFUlQoZmR2
 cC0+dl9tb3VudCA9PSB0ZHZwLT52X21vdW50KTsKI2Vsc2UKCWlmIChmZHZwLT52X21vdW50
 ICE9IHRkdnAtPnZfbW91bnQpIHJldHVybiBFWERFVjsKI2VuZGlmCglLQVNTRVJUKGZjbnAg
 IT0gdGNucCk7CglLQVNTRVJUKGZjbnAtPmNuX25hbWVpb3AgPT0gREVMRVRFKTsKCUtBU1NF
 UlQodGNucC0+Y25fbmFtZWlvcCA9PSBSRU5BTUUpOwoKICAgICAgICAvKiBYWFggV2FudCBh
 IGJldHRlciBlcXVhbGl0eSB0ZXN0LiAgKi8KCUtBU1NFUlQoa2F1dGhfY3JlZF91aWRtYXRj
 aChjcmVkLCBmY25wLT5jbl9jcmVkKSk7CglLQVNTRVJUKGthdXRoX2NyZWRfdWlkbWF0Y2go
 Y3JlZCwgdGNucC0+Y25fY3JlZCkpOwoKCW1wID0gZmR2cC0+dl9tb3VudDsKCUtBU1NFUlQo
 bXAgIT0gTlVMTCk7CglLQVNTRVJUKG1wID09IHRkdnAtPnZfbW91bnQpOwoJLyogWFhYIEhv
 dyBjYW4gd2UgYmUgc3VyZSB0aGlzIHN0YXlzIHRydWU/ICAqLwoJS0FTU0VSVCgobXAtPm1u
 dF9mbGFnICYgTU5UX1JET05MWSkgPT0gMCk7CgoJLyogUmVqZWN0IHJlbmFtZSgieC8uLiIs
 IC4uLikgYW5kIHJlbmFtZSguLi4sICJ4Ly4uIikgZWFybHkuICAqLwoJaWYgKChmY25wLT5j
 bl9mbGFncyB8IHRjbnAtPmNuX2ZsYWdzKSAmIElTRE9URE9UKQoJCXJldHVybiBFSU5WQUw7
 CS8qIFhYWCBFSVNESVI/ICAqLwoKCWVycm9yID0gZ2VuZnNfcmVuYW1lX2VudGVyKG9wcywg
 bXAsIGNyZWQsCgkgICAgZmR2cCwgZmNucCwgZmRlLCAmZnZwLAoJICAgIHRkdnAsIHRjbnAs
 IHRkZSwgJnR2cCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCS8qCgkgKiBDaGVj
 ayB0aGF0IGV2ZXJ5dGhpbmcgaXMgbG9ja2VkIGFuZCBsb29rcyByaWdodC4KCSAqLwoJS0FT
 U0VSVChmdnAgIT0gTlVMTCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmZHZwKSA9PSBMS19F
 WENMVVNJVkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZnZwKSA9PSBMS19FWENMVVNJVkUp
 OwoJS0FTU0VSVChWT1BfSVNMT0NLRUQodGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NF
 UlQoKHR2cCA9PSBOVUxMKSB8fCAoVk9QX0lTTE9DS0VEKHR2cCkgPT0gTEtfRVhDTFVTSVZF
 KSk7CgoJLyoKCSAqIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2Ft
 ZSBvYmplY3QsIHdlIG5lZWQKCSAqIG9ubHkgYXQgbW9zdCBkZWxldGUgdGhlIHNvdXJjZSBl
 bnRyeS4gIFdlIGFyZSBndWFyYW50ZWVkIGF0CgkgKiB0aGlzIHBvaW50IHRoYXQgdGhlIGVu
 dHJpZXMgYXJlIGRpc3RpbmN0LgoJICovCglpZiAoZnZwID09IHR2cCkgewoJCUtBU1NFUlQo
 dHZwICE9IE5VTEwpOwoJCWlmIChmdnAtPnZfdHlwZSA9PSBWRElSKQoJCQkvKiBYWFggVGhp
 cyBzaG91bGRuJ3QgYmUgcG9zc2libGUuICAqLwoJCQllcnJvciA9IEVJTlZBTDsKCQllbHNl
 IGlmIChwb3NpeGx5X2NvcnJlY3QpCgkJCS8qIFBPU0lYIHNleiB0byBsZWF2ZSB0aGVtIGFs
 b25lLiAgKi8KCQkJZXJyb3IgPSAwOwoJCWVsc2UgaWYgKChmZHZwID09IHRkdnApICYmCgkJ
 ICAgIChmY25wLT5jbl9uYW1lbGVuID09IHRjbnAtPmNuX25hbWVsZW4pICYmCgkJICAgICht
 ZW1jbXAoZmNucC0+Y25fbmFtZXB0ciwgdGNucC0+Y25fbmFtZXB0ciwKCQkJZmNucC0+Y25f
 bmFtZWxlbikgPT0gMCkpCgkJCS8qIFJlbmFtaW5nIGFuIGVudHJ5IG92ZXIgaXRzZWxmIGRv
 ZXMgbm90aGluZy4gICovCgkJCWVycm9yID0gMDsKCQllbHNlCgkJCS8qIFhYWCBDYW4ndCB1
 c2UgVk9QX1JFTU9WRSBiZWNhdXNlIG9mIGxvY2tpbmcuICAqLwoJCQllcnJvciA9IGdlbmZz
 X3JlbmFtZV9yZW1vdmUob3BzLCBtcCwgY3JlZCwKCQkJICAgIGZkdnAsIGZjbnAsIGZkZSwg
 ZnZwKTsKCQlnb3RvIG91dDsKCX0KCUtBU1NFUlQoZnZwICE9IHR2cCk7CglLQVNTRVJUKChm
 ZHZwICE9IHRkdnApIHx8CgkgICAgKGZjbnAtPmNuX25hbWVsZW4gIT0gdGNucC0+Y25fbmFt
 ZWxlbikgfHwKCSAgICAobWVtY21wKGZjbnAtPmNuX25hbWVwdHIsIHRjbnAtPmNuX25hbWVw
 dHIsIGZjbnAtPmNuX25hbWVsZW4pCgkJIT0gMCkpOwoKCS8qCgkgKiBJZiB0aGUgdGFyZ2V0
 IGV4aXN0cywgcmVmdXNlIHRvIHJlbmFtZSBhIGRpcmVjdG9yeSBvdmVyIGEKCSAqIG5vbi1k
 aXJlY3Rvcnkgb3IgdmljZSB2ZXJzYSwgb3IgdG8gY2xvYmJlciBhIG5vbi1lbXB0eQoJICog
 ZGlyZWN0b3J5LgoJICovCglpZiAodHZwICE9IE5VTEwpIHsKCQlpZiAoZnZwLT52X3R5cGUg
 PT0gVkRJUiAmJiB0dnAtPnZfdHlwZSA9PSBWRElSKQoJCQllcnJvciA9CgkJCSAgICAob3Bz
 LT5ncm9fZGlyZWN0b3J5X2VtcHR5X3AobXAsIGNyZWQsIHR2cCwgdGR2cCk/CgkJCQkwIDog
 RU5PVEVNUFRZKTsKCQllbHNlIGlmIChmdnAtPnZfdHlwZSA9PSBWRElSICYmIHR2cC0+dl90
 eXBlICE9IFZESVIpCgkJCWVycm9yID0gRU5PVERJUjsKCQllbHNlIGlmIChmdnAtPnZfdHlw
 ZSAhPSBWRElSICYmIHR2cC0+dl90eXBlID09IFZESVIpCgkJCWVycm9yID0gRUlTRElSOwoJ
 CWVsc2UKCQkJZXJyb3IgPSAwOwoJCWlmIChlcnJvcikKCQkJZ290byBvdXQ7CgkJS0FTU0VS
 VCgoZnZwLT52X3R5cGUgPT0gVkRJUikgPT0gKHR2cC0+dl90eXBlID09IFZESVIpKTsKCX0K
 CgkvKgoJICogQXV0aG9yaXplIHRoZSByZW5hbWUuCgkgKi8KCWVycm9yID0gb3BzLT5ncm9f
 cmVuYW1lX2NoZWNrX3Bvc3NpYmxlKG1wLCBmZHZwLCBmdnAsIHRkdnAsIHR2cCk7CglpZiAo
 ZXJyb3IpCgkJZ290byBvdXQ7CgllcnJvciA9IG9wcy0+Z3JvX3JlbmFtZV9jaGVja19wZXJt
 aXR0ZWQobXAsIGNyZWQsIGZkdnAsIGZ2cCwgdGR2cCwgdHZwKTsKCWVycm9yID0ga2F1dGhf
 YXV0aG9yaXplX3Zub2RlKGNyZWQsIEtBVVRIX1ZOT0RFX0RFTEVURSwgZnZwLCBmZHZwLAoJ
 ICAgIGVycm9yKTsKCWVycm9yID0ga2F1dGhfYXV0aG9yaXplX3Zub2RlKGNyZWQsIEtBVVRI
 X1ZOT0RFX1JFTkFNRSwgdHZwLCB0ZHZwLAoJICAgIGVycm9yKTsKCWlmIChlcnJvcikKCQln
 b3RvIG91dDsKCgoJLyoKCSAqIEV2ZXJ5dGhpbmcgaXMgaHVua3ktZG9yeS4gIFNodWZmbGUg
 dGhlIGRpcmVjdG9yeSBlbnRyaWVzLgoJICovCgllcnJvciA9IG9wcy0+Z3JvX3JlbmFtZSht
 cCwgY3JlZCwKCSAgICBmZHZwLCBmY25wLCBmZGUsIGZ2cCwKCSAgICB0ZHZwLCB0Y25wLCB0
 ZGUsIHR2cCk7CglpZiAoZXJyb3IpCgkJZ290byBvdXQ7CgoJLyogU3VjY2VzcyEgICovCgpv
 dXQ6CWdlbmZzX3JlbmFtZV9leGl0KG9wcywgbXAsIGZkdnAsIGZ2cCwgdGR2cCwgdHZwKTsK
 CXJldHVybiBlcnJvcjsKfQoKLyoKICogZ2VuZnNfcmVuYW1lX2tub3RlOiBOb3RlIGV2ZW50
 cyBhYm91dCB0aGUgdmFyaW91cyB2bm9kZXMgaW4gYQogKiByZW5hbWUuICBUbyBiZSBjYWxs
 ZWQgYnkgZ3JvX3JlbmFtZSBvbiBzdWNjZXNzLiAgVGhlIG9ubHkgcGFpciBvZgogKiB2bm9k
 ZXMgdGhhdCBtYXkgYmUgaWRlbnRpY2FsIGlzIHtmZHZwLCB0ZHZwfS4gIGRlbGV0ZWRfcCBp
 cyB0cnVlIGlmZgogKiB0aGUgcmVuYW1lIG92ZXJ3cm90ZSB0aGUgbGFzdCBsaW5rIHRvIHR2
 cC4KICovCnZvaWQKZ2VuZnNfcmVuYW1lX2tub3RlKHN0cnVjdCB2bm9kZSAqZmR2cCwgc3Ry
 dWN0IHZub2RlICpmdnAsCiAgICBzdHJ1Y3Qgdm5vZGUgKnRkdnAsIHN0cnVjdCB2bm9kZSAq
 dHZwLCBib29sIGRlbGV0ZWRfcCkKewoJbG9uZyBmZHZwX2V2ZW50cywgdGR2cF9ldmVudHM7
 Cglib29sIGRpcmVjdG9yeV9wLCByZXBhcmVudF9wLCByZXBsYWNlZF9wOwoKCUtBU1NFUlQo
 ZmR2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwICE9IE5VTEwpOwoJS0FTU0VSVCh0ZHZwICE9
 IE5VTEwpOwoJS0FTU0VSVChmZHZwICE9IGZ2cCk7CglLQVNTRVJUKGZkdnAgIT0gdHZwKTsK
 CUtBU1NFUlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVCh0ZHZwICE9IHR2cCk7CglLQVNTRVJU
 KGZ2cCAhPSB0dnApOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZmR2cCkgPT0gTEtfRVhDTFVT
 SVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGZ2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtB
 U1NFUlQoVk9QX0lTTE9DS0VEKHRkdnApID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKCh0
 dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09IExLX0VYQ0xVU0lWRSkpOwoK
 CWRpcmVjdG9yeV9wID0gKGZ2cC0+dl90eXBlID09IFZESVIpOwoJcmVwYXJlbnRfcCA9IChm
 ZHZwICE9IHRkdnApOwoJcmVwbGFjZWRfcCA9ICh0dnAgIT0gTlVMTCk7CgoJS0FTU0VSVCgo
 dHZwID09IE5VTEwpIHx8IChkaXJlY3RvcnlfcCA9PSAodHZwLT52X3R5cGUgPT0gVkRJUikp
 KTsKCUtBU1NFUlQoIWRlbGV0ZWRfcCB8fCByZXBsYWNlZF9wKTsKCglmZHZwX2V2ZW50cyA9
 IE5PVEVfV1JJVEU7CglpZiAoZGlyZWN0b3J5X3AgJiYgcmVwYXJlbnRfcCkKCQlmZHZwX2V2
 ZW50cyB8PSBOT1RFX0xJTks7CglWTl9LTk9URShmZHZwLCBmZHZwX2V2ZW50cyk7CgoJVk5f
 S05PVEUoZnZwLCBOT1RFX1JFTkFNRSk7CgoJaWYgKHJlcGFyZW50X3ApIHsKCQl0ZHZwX2V2
 ZW50cyA9IE5PVEVfV1JJVEU7CgkJaWYgKCFyZXBsYWNlZF9wKSB7CgkJCXRkdnBfZXZlbnRz
 IHw9IE5PVEVfRVhURU5EOwoJCQlpZiAoZGlyZWN0b3J5X3ApCgkJCQl0ZHZwX2V2ZW50cyB8
 PSBOT1RFX0xJTks7CgkJfQoJCVZOX0tOT1RFKHRkdnAsIHRkdnBfZXZlbnRzKTsKCX0KCglp
 ZiAocmVwbGFjZWRfcCkKCQlWTl9LTk9URSh0dnAsIChkZWxldGVkX3A/IE5PVEVfREVMRVRF
 IDogTk9URV9MSU5LKSk7Cn0KCi8qCiAqIGdlbmZzX3JlbmFtZV9jYWNoZV9wdXJnZTogUHVy
 Z2UgdGhlIG5hbWUgY2FjaGUuICBUbyBiZSBjYWxsZWQgYnkKICogZ3JvX3JlbmFtZSBvbiBz
 dWNjZXNzLiAgVGhlIG9ubHkgcGFpciBvZiB2bm9kZXMgdGhhdCBtYXkgYmUKICogaWRlbnRp
 Y2FsIGlzIHtmZHZwLCB0ZHZwfS4KICovCnZvaWQKZ2VuZnNfcmVuYW1lX2NhY2hlX3B1cmdl
 KHN0cnVjdCB2bm9kZSAqZmR2cCwgc3RydWN0IHZub2RlICpmdnAsCiAgICBzdHJ1Y3Qgdm5v
 ZGUgKnRkdnAsIHN0cnVjdCB2bm9kZSAqdHZwKQp7CgoJS0FTU0VSVChmZHZwICE9IE5VTEwp
 OwoJS0FTU0VSVChmdnAgIT0gTlVMTCk7CglLQVNTRVJUKHRkdnAgIT0gTlVMTCk7CglLQVNT
 RVJUKGZkdnAgIT0gZnZwKTsKCUtBU1NFUlQoZmR2cCAhPSB0dnApOwoJS0FTU0VSVCh0ZHZw
 ICE9IGZ2cCk7CglLQVNTRVJUKHRkdnAgIT0gdHZwKTsKCUtBU1NFUlQoZnZwICE9IHR2cCk7
 CglLQVNTRVJUKGZkdnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQodGR2cC0+dl90eXBl
 ID09IFZESVIpOwoKCS8qCgkgKiBYWFggV2hhdCBhY3R1YWxseSBuZWVkcyB0byBiZSBwdXJn
 ZWQ/CgkgKi8KCgljYWNoZV9wdXJnZShmZHZwKTsKCglpZiAoZnZwLT52X3R5cGUgPT0gVkRJ
 UikKCQljYWNoZV9wdXJnZShmdnApOwoKCWlmICh0ZHZwICE9IGZkdnApCgkJY2FjaGVfcHVy
 Z2UodGR2cCk7CgoJaWYgKCh0dnAgIT0gTlVMTCkgJiYgKHR2cC0+dl90eXBlID09IFZESVIp
 KQoJCWNhY2hlX3B1cmdlKHR2cCk7Cn0KCi8qCiAqIGdlbmZzX3JlbmFtZV9lbnRlcjogTG9v
 ayB1cCBmY25wIGluIGZkdnAsIGFuZCBzdG9yZSB0aGUgbG9va3VwCiAqIHJlc3VsdHMgaW4g
 KmZkZV9yZXQgYW5kIHRoZSBhc3NvY2lhdGVkIHZub2RlIGluICpmdnBfcmV0OyBmYWlsIGlm
 CiAqIG5vdCBmb3VuZC4gIExvb2sgdXAgdGNucCBpbiB0ZHZwLCBhbmQgc3RvcmUgdGhlIGxv
 b2t1cCByZXN1bHRzIGluCiAqICp0ZGVfcmV0IGFuZCB0aGUgYXNzb2NpYXRlZCB2bm9kZSBp
 biAqdHZwX3JldDsgc3RvcmUgbnVsbCBpbnN0ZWFkIGlmCiAqIG5vdCBmb3VuZC4gIEZhaWwg
 aWYgYW55dGhpbmcgaGFzIGJlZW4gbW91bnRlZCBvbiBhbnkgb2YgdGhlIG5vZGVzCiAqIGlu
 dm9sdmVkLgogKgogKiBmZHZwIGFuZCB0ZHZwIG11c3QgYmUgcmVmZXJlbmNlZC4KICoKICog
 T24gZW50cnksIG5vdGhpbmcgaXMgbG9ja2VkLgogKgogKiBPbiBzdWNjZXNzLCBldmVyeXRo
 aW5nIGlzIGxvY2tlZCwgYW5kICpmdnBfcmV0LCBhbmQgKnR2cF9yZXQgaWYKICogbm9ubnVs
 bCwgYXJlIHJlZmVyZW5jZWQuICBUaGUgb25seSBwYWlycyBvZiB2bm9kZXMgdGhhdCBtYXkg
 YmUKICogaWRlbnRpY2FsIGFyZSB7ZmR2cCwgdGR2cH0gYW5kIHtmdnAsIHR2cH0uCiAqCiAq
 IE9uIGZhaWx1cmUsIGV2ZXJ5dGhpbmcgcmVtYWlucyBhcyB3YXMuCiAqCiAqIExvY2tpbmcg
 ZXZlcnl0aGluZyBpbmNsdWRpbmcgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzIGlzCiAq
 IG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhhdCwgZS5nLiwgbGluayBjb3VudCB1cGRhdGVz
 IGFyZSBPSy4gIFRoZQogKiBsb2NraW5nIG9yZGVyIGlzLCBpbiBnZW5lcmFsLCBhbmNlc3Rv
 ci1maXJzdCwgbWF0Y2hpbmcgdGhlIG9yZGVyIHlvdQogKiBuZWVkIHRvIHVzZSB0byBsb29r
 IHVwIGEgZGVzY2VuZGFudCBhbnl3YXkuCiAqLwpzdGF0aWMgaW50CmdlbmZzX3JlbmFtZV9l
 bnRlcihjb25zdCBzdHJ1Y3QgZ2VuZnNfcmVuYW1lX29wcyAqb3BzLAogICAgc3RydWN0IG1v
 dW50ICptcCwga2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmZkdnAsIHN0
 cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAgdm9pZCAqZmRlX3JldCwgc3RydWN0IHZu
 b2RlICoqZnZwX3JldCwKICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IGNvbXBvbmVu
 dG5hbWUgKnRjbnAsCiAgICB2b2lkICp0ZGVfcmV0LCBzdHJ1Y3Qgdm5vZGUgKip0dnBfcmV0
 KQp7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChtcCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2cCAh
 PSBOVUxMKTsKCUtBU1NFUlQoZmNucCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwX3JldCAhPSBO
 VUxMKTsKCUtBU1NFUlQodGR2cCAhPSBOVUxMKTsKCUtBU1NFUlQodGNucCAhPSBOVUxMKTsK
 CUtBU1NFUlQodHZwX3JldCAhPSBOVUxMKTsKCUtBU1NFUlQoZnZwX3JldCAhPSB0dnBfcmV0
 KTsKCUtBU1NFUlQoZmR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVCh0ZHZwLT52X3R5
 cGUgPT0gVkRJUik7CglLQVNTRVJUKGZkdnAtPnZfbW91bnQgPT0gbXApOwoJS0FTU0VSVCh0
 ZHZwLT52X21vdW50ID09IG1wKTsKCglpZiAoZmR2cCA9PSB0ZHZwKQoJCWVycm9yID0gZ2Vu
 ZnNfcmVuYW1lX2VudGVyX2NvbW1vbihvcHMsIG1wLCBjcmVkLCBmZHZwLAoJCSAgICBmY25w
 LCBmZGVfcmV0LCBmdnBfcmV0LAoJCSAgICB0Y25wLCB0ZGVfcmV0LCB0dnBfcmV0KTsKCWVs
 c2UKCQllcnJvciA9IGdlbmZzX3JlbmFtZV9lbnRlcl9zZXBhcmF0ZShvcHMsIG1wLCBjcmVk
 LAoJCSAgICBmZHZwLCBmY25wLCBmZGVfcmV0LCBmdnBfcmV0LAoJCSAgICB0ZHZwLCB0Y25w
 LCB0ZGVfcmV0LCB0dnBfcmV0KTsKCglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCUtB
 U1NFUlQoKmZ2cF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCgqZnZwX3Jl
 dCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoKCp0dnBfcmV0ID09IE5VTEwpIHx8IChW
 T1BfSVNMT0NLRUQoKnR2cF9yZXQpID09IExLX0VYQ0xVU0lWRSkpOwoJS0FTU0VSVCgqZnZw
 X3JldCAhPSBmZHZwKTsKCUtBU1NFUlQoKmZ2cF9yZXQgIT0gdGR2cCk7CglLQVNTRVJUKCp0
 dnBfcmV0ICE9IGZkdnApOwoJS0FTU0VSVCgqdHZwX3JldCAhPSB0ZHZwKTsKCXJldHVybiAw
 Owp9CgovKgogKiBnZW5mc19yZW5hbWVfZW50ZXJfY29tbW9uOiBMb2NrIGFuZCBsb29rIHVw
 IHdpdGggYSBjb21tb24KICogc291cmNlL3RhcmdldCBkaXJlY3RvcnkuCiAqLwpzdGF0aWMg
 aW50CmdlbmZzX3JlbmFtZV9lbnRlcl9jb21tb24oY29uc3Qgc3RydWN0IGdlbmZzX3JlbmFt
 ZV9vcHMgKm9wcywKICAgIHN0cnVjdCBtb3VudCAqbXAsIGthdXRoX2NyZWRfdCBjcmVkLCBz
 dHJ1Y3Qgdm5vZGUgKmR2cCwKICAgIHN0cnVjdCBjb21wb25lbnRuYW1lICpmY25wLAogICAg
 dm9pZCAqZmRlX3JldCwgc3RydWN0IHZub2RlICoqZnZwX3JldCwKICAgIHN0cnVjdCBjb21w
 b25lbnRuYW1lICp0Y25wLAogICAgdm9pZCAqdGRlX3JldCwgc3RydWN0IHZub2RlICoqdHZw
 X3JldCkKewoJc3RydWN0IHZub2RlICpmdnAsICp0dnA7CglpbnQgZXJyb3I7CgoJS0FTU0VS
 VChvcHMgIT0gTlVMTCk7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FTU0VSVChkdnAgIT0g
 TlVMTCk7CglLQVNTRVJUKGZjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZ2cF9yZXQgIT0gTlVM
 TCk7CglLQVNTRVJUKHRjbnAgIT0gTlVMTCk7CglLQVNTRVJUKHR2cF9yZXQgIT0gTlVMTCk7
 CglLQVNTRVJUKGR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChkdnAtPnZfbW91bnQg
 PT0gbXApOwoKCWVycm9yID0gb3BzLT5ncm9fbG9ja19kaXJlY3RvcnkobXAsIGR2cCk7Cglp
 ZiAoZXJyb3IpCgkJZ290byBmYWlsMDsKCgkvKiBEaWQgd2UgbG9zZSBhIHJhY2Ugd2l0aCBt
 b3VudD8gICovCglpZiAoZHZwLT52X21vdW50ZWRoZXJlICE9IE5VTEwpIHsKCQllcnJvciA9
 IEVCVVNZOwoJCWdvdG8gZmFpbDE7Cgl9CgoJS0FTU0VSVChmY25wLT5jbl9uYW1laW9wID09
 IERFTEVURSk7CgllcnJvciA9IG9wcy0+Z3JvX2xvb2t1cChtcCwgZHZwLCBmY25wLCBmZGVf
 cmV0LCAmZnZwKTsKCWlmIChlcnJvcikKCQlnb3RvIGZhaWwxOwoKCUtBU1NFUlQoZnZwICE9
 IE5VTEwpOwoKCS8qIFJlZnVzZSB0byByZW5hbWUgYC4nLiAgKi8KCWlmIChmdnAgPT0gZHZw
 KSB7CgkJZXJyb3IgPSBFSU5WQUw7CgkJZ290byBmYWlsMjsKCX0KCUtBU1NFUlQoZnZwICE9
 IGR2cCk7CgoJS0FTU0VSVCh0Y25wLT5jbl9uYW1laW9wID09IFJFTkFNRSk7CgllcnJvciA9
 IG9wcy0+Z3JvX2xvb2t1cChtcCwgZHZwLCB0Y25wLCB0ZGVfcmV0LCAmdHZwKTsKCWlmIChl
 cnJvciA9PSBFTk9FTlQpIHsKCQl0dnAgPSBOVUxMOwoJfSBlbHNlIGlmIChlcnJvcikgewoJ
 CWdvdG8gZmFpbDI7Cgl9IGVsc2UgewoJCUtBU1NFUlQodHZwICE9IE5VTEwpOwoKCQkvKiBS
 ZWZ1c2UgdG8gcmVuYW1lIG92ZXIgYC4nLiAgKi8KCQlpZiAodHZwID09IGR2cCkgewoJCQll
 cnJvciA9IEVJU0RJUjsgLyogWFhYIEVJTlZBTD8gICovCgkJCWdvdG8gZmFpbDI7CgkJfQoJ
 fQoJS0FTU0VSVCh0dnAgIT0gZHZwKTsKCgkvKgoJICogV2UndmUgbG9va2VkIHVwIGJvdGgg
 bm9kZXMuICBOb3cgbG9jayB0aGVtIGFuZCBjaGVjayB0aGVtLgoJICovCgoJdm5fbG9jayhm
 dnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsKCUtBU1NFUlQoZnZwLT52X21vdW50ID09
 IG1wKTsKCS8qIFJlZnVzZSB0byByZW5hbWUgYSBtb3VudCBwb2ludC4gICovCglpZiAoKGZ2
 cC0+dl90eXBlID09IFZESVIpICYmIChmdnAtPnZfbW91bnRlZGhlcmUgIT0gTlVMTCkpIHsK
 CQllcnJvciA9IEVCVVNZOwoJCWdvdG8gZmFpbDM7Cgl9CgoJaWYgKCh0dnAgIT0gTlVMTCkg
 JiYgKHR2cCAhPSBmdnApKSB7CgkJdm5fbG9jayh0dnAsIExLX0VYQ0xVU0lWRSB8IExLX1JF
 VFJZKTsKCQlLQVNTRVJUKHR2cC0+dl9tb3VudCA9PSBtcCk7CgkJLyogUmVmdXNlIHRvIHJl
 bmFtZSBvdmVyIGEgbW91bnQgcG9pbnQuICAqLwoJCWlmICgodHZwLT52X3R5cGUgPT0gVkRJ
 UikgJiYgKHR2cC0+dl9tb3VudGVkaGVyZSAhPSBOVUxMKSkgewoJCQllcnJvciA9IEVCVVNZ
 OwoJCQlnb3RvIGZhaWw0OwoJCX0KCX0KCglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnApID09
 IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xV
 U0lWRSk7CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09
 IExLX0VYQ0xVU0lWRSkpOwoKCSpmdnBfcmV0ID0gZnZwOwoJKnR2cF9yZXQgPSB0dnA7Cgly
 ZXR1cm4gMDsKCmZhaWw0OglpZiAoKHR2cCAhPSBOVUxMKSAmJiAodHZwICE9IGZ2cCkpCgkJ
 Vk9QX1VOTE9DSyh0dnAsIDApOwpmYWlsMzoJVk9QX1VOTE9DSyhmdnAsIDApOwoJaWYgKHR2
 cCAhPSBOVUxMKQoJCXZyZWxlKHR2cCk7CmZhaWwyOgl2cmVsZShmdnApOwpmYWlsMToJVk9Q
 X1VOTE9DSyhkdnAsIDApOwpmYWlsMDoJcmV0dXJuIGVycm9yOwp9CgovKgogKiBnZW5mc19y
 ZW5hbWVfZW50ZXJfc2VwYXJhdGU6IExvY2sgYW5kIGxvb2sgdXAgd2l0aCBzZXBhcmF0ZSBz
 b3VyY2UKICogYW5kIHRhcmdldCBkaXJlY3Rvcmllcy4KICovCnN0YXRpYyBpbnQKZ2VuZnNf
 cmVuYW1lX2VudGVyX3NlcGFyYXRlKGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICpv
 cHMsCiAgICBzdHJ1Y3QgbW91bnQgKm1wLCBrYXV0aF9jcmVkX3QgY3JlZCwKICAgIHN0cnVj
 dCB2bm9kZSAqZmR2cCwgc3RydWN0IGNvbXBvbmVudG5hbWUgKmZjbnAsCiAgICB2b2lkICpm
 ZGVfcmV0LCBzdHJ1Y3Qgdm5vZGUgKipmdnBfcmV0LAogICAgc3RydWN0IHZub2RlICp0ZHZw
 LCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAqdGNucCwKICAgIHZvaWQgKnRkZV9yZXQsIHN0cnVj
 dCB2bm9kZSAqKnR2cF9yZXQpCnsKCXN0cnVjdCB2bm9kZSAqaW50ZXJtZWRpYXRlX25vZGU7
 CglzdHJ1Y3Qgdm5vZGUgKmZ2cCwgKnR2cDsKCWludCBlcnJvcjsKCglLQVNTRVJUKG9wcyAh
 PSBOVUxMKTsKCUtBU1NFUlQobXAgIT0gTlVMTCk7CglLQVNTRVJUKGZkdnAgIT0gTlVMTCk7
 CglLQVNTRVJUKGZjbnAgIT0gTlVMTCk7CglLQVNTRVJUKGZ2cF9yZXQgIT0gTlVMTCk7CglL
 QVNTRVJUKHRkdnAgIT0gTlVMTCk7CglLQVNTRVJUKHRjbnAgIT0gTlVMTCk7CglLQVNTRVJU
 KHR2cF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKGZkdnAgIT0gdGR2cCk7CglLQVNTRVJUKGZj
 bnAgIT0gdGNucCk7CglLQVNTRVJUKGZjbnAtPmNuX25hbWVpb3AgPT0gREVMRVRFKTsKCUtB
 U1NFUlQodGNucC0+Y25fbmFtZWlvcCA9PSBSRU5BTUUpOwoJS0FTU0VSVChmdnBfcmV0ICE9
 IHR2cF9yZXQpOwoJS0FTU0VSVChmZHZwLT52X3R5cGUgPT0gVkRJUik7CglLQVNTRVJUKHRk
 dnAtPnZfdHlwZSA9PSBWRElSKTsKCUtBU1NFUlQoZmR2cC0+dl9tb3VudCA9PSBtcCk7CglL
 QVNTRVJUKHRkdnAtPnZfbW91bnQgPT0gbXApOwoKCWVycm9yID0gb3BzLT5ncm9fZ2VuZWFs
 b2d5KG1wLCBjcmVkLCBmZHZwLCB0ZHZwLCAmaW50ZXJtZWRpYXRlX25vZGUpOwoJaWYgKGVy
 cm9yKQoJCXJldHVybiBlcnJvcjsKCgkvKgoJICogaW50ZXJtZWRpYXRlX25vZGUgPT0gTlVM
 TCBtZWFucyBmZHZwIGlzIG5vdCBhbiBhbmNlc3RvciBvZiB0ZHZwLgoJICovCglpZiAoaW50
 ZXJtZWRpYXRlX25vZGUgPT0gTlVMTCkKCQllcnJvciA9IGdlbmZzX3JlbmFtZV9sb2NrKG9w
 cywgbXAsIGNyZWQsCgkJICAgIEVOT1RFTVBUWSwgRUlTRElSLCBFSU5WQUwsCgkJICAgIHRk
 dnAsIHRjbnAsIHRydWUsIHRkZV9yZXQsICZ0dnAsCgkJICAgIGZkdnAsIGZjbnAsIGZhbHNl
 LCBmZGVfcmV0LCAmZnZwKTsKCWVsc2UKCQllcnJvciA9IGdlbmZzX3JlbmFtZV9sb2NrKG9w
 cywgbXAsIGNyZWQsCgkJICAgIEVJTlZBTCwgRUlTRElSLCBFSU5WQUwsCgkJICAgIGZkdnAs
 IGZjbnAsIGZhbHNlLCBmZGVfcmV0LCAmZnZwLAoJCSAgICB0ZHZwLCB0Y25wLCB0cnVlLCB0
 ZGVfcmV0LCAmdHZwKTsKCWlmIChlcnJvcikKCQlnb3RvIG91dDsKCglLQVNTRVJUKGZ2cCAh
 PSBOVUxMKTsKCgkvKgoJICogUmVqZWN0IHJlbmFtZSgiZm9vL2JhciIsICJmb28vYmFyL2Jh
 ei9xdXV4L3pvdCIpLgoJICovCglpZiAoZnZwID09IGludGVybWVkaWF0ZV9ub2RlKSB7CgkJ
 Z2VuZnNfcmVuYW1lX2V4aXQob3BzLCBtcCwgZmR2cCwgZnZwLCB0ZHZwLCB0dnApOwoJCWVy
 cm9yID0gRUlOVkFMOwoJCWdvdG8gb3V0OwoJfQoKCSpmdnBfcmV0ID0gZnZwOwoJKnR2cF9y
 ZXQgPSB0dnA7CgllcnJvciA9IDA7CgpvdXQ6CWlmIChpbnRlcm1lZGlhdGVfbm9kZSAhPSBO
 VUxMKQoJCXZyZWxlKGludGVybWVkaWF0ZV9ub2RlKTsKCXJldHVybiBlcnJvcjsKfQoKLyoK
 ICogZ2VuZnNfcmVuYW1lX2xvY2s6IExvY2sgZGlyZWN0b3JpZXMgYSBhbmQgYiwgd2hpY2gg
 bXVzdCBiZSBkaXN0aW5jdCwKICogYW5kIGxvb2sgdXAgYW5kIGxvY2sgbm9kZXMgYSBhbmQg
 Yi4gIERvIGEgZmlyc3QgYW5kIHRoZW4gYi4KICogRGlyZWN0b3J5IGIgbWF5IG5vdCBiZSBh
 biBhbmNlc3RvciBvZiBkaXJlY3RvcnkgYSwgYWx0aG91Z2gKICogZGlyZWN0b3J5IGEgbWF5
 IGJlIGFuIGFuY2VzdG9yIG9mIGRpcmVjdG9yeSBiLiAgRmFpbCB3aXRoCiAqIG92ZXJsYXBf
 ZXJyb3IgaWYgbm9kZSBhIGlzIGRpcmVjdG9yeSBiLiAgTmVpdGhlciBjb21wb25lbnRuYW1l
 IG1heQogKiBiZSBgLicgb3IgYC4uJy4KICoKICogYV9kdnAgYW5kIGJfZHZwIG11c3QgYmUg
 cmVmZXJlbmNlZC4KICoKICogT24gZW50cnksIGFfZHZwIGFuZCBiX2R2cCBhcmUgdW5sb2Nr
 ZWQuCiAqCiAqIE9uIHN1Y2Nlc3MsCiAqIC4gYV9kdnAgYW5kIGJfZHZwIGFyZSBsb2NrZWQs
 CiAqIC4gKmFfZGlyZW50X3JldCBpcyBmaWxsZWQgd2l0aCBhIGRpcmVjdG9yeSBlbnRyeSB3
 aG9zZSBub2RlIGlzCiAqICAgICBsb2NrZWQgYW5kIHJlZmVyZW5jZWQsCiAqIC4gKmJfdnBf
 cmV0IGlzIGZpbGxlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZub2RlLAogKiAuICpiX2Rp
 cmVudF9yZXQgaXMgZmlsbGVkIGVpdGhlciB3aXRoIG51bGwgb3Igd2l0aCBhIGRpcmVjdG9y
 eSBlbnRyeQogKiAgICAgd2hvc2Ugbm9kZSBpcyBsb2NrZWQgYW5kIHJlZmVyZW5jZWQsCiAq
 IC4gKmJfdnAgaXMgZmlsbGVkIGVpdGhlciB3aXRoIG51bGwgb3Igd2l0aCB0aGUgY29ycmVz
 cG9uZGluZyB2bm9kZSwKICogICAgIGFuZAogKiAuIHRoZSBvbmx5IHBhaXIgb2Ygdm5vZGVz
 IHRoYXQgbWF5IGJlIGlkZW50aWNhbCBpcyBhX3ZwIGFuZCBiX3ZwLgogKgogKiBPbiBmYWls
 dXJlLCBhX2R2cCBhbmQgYl9kdnAgYXJlIGxlZnQgdW5sb2NrZWQsIGFuZCAqYV9kaXJlbnRf
 cmV0LAogKiAqYV92cCwgKmJfZGlyZW50X3JldCwgYW5kICpiX3ZwIGFyZSBsZWZ0IGFsb25l
 LgogKi8Kc3RhdGljIGludApnZW5mc19yZW5hbWVfbG9jayhjb25zdCBzdHJ1Y3QgZ2VuZnNf
 cmVuYW1lX29wcyAqb3BzLAogICAgc3RydWN0IG1vdW50ICptcCwga2F1dGhfY3JlZF90IGNy
 ZWQsCiAgICBpbnQgb3ZlcmxhcF9lcnJvciwgaW50IGFfZG90X2Vycm9yLCBpbnQgYl9kb3Rf
 ZXJyb3IsCiAgICBzdHJ1Y3Qgdm5vZGUgKmFfZHZwLCBzdHJ1Y3QgY29tcG9uZW50bmFtZSAq
 YV9jbnAsIGJvb2wgYV9taXNzaW5nX29rLAogICAgdm9pZCAqYV9kZV9yZXQsIHN0cnVjdCB2
 bm9kZSAqKmFfdnBfcmV0LAogICAgc3RydWN0IHZub2RlICpiX2R2cCwgc3RydWN0IGNvbXBv
 bmVudG5hbWUgKmJfY25wLCBib29sIGJfbWlzc2luZ19vaywKICAgIHZvaWQgKmJfZGVfcmV0
 LCBzdHJ1Y3Qgdm5vZGUgKipiX3ZwX3JldCkKewoJc3RydWN0IHZub2RlICphX3ZwLCAqYl92
 cDsKCWludCBlcnJvcjsKCglLQVNTRVJUKG9wcyAhPSBOVUxMKTsKCUtBU1NFUlQobXAgIT0g
 TlVMTCk7CglLQVNTRVJUKGFfZHZwICE9IE5VTEwpOwoJS0FTU0VSVChhX2NucCAhPSBOVUxM
 KTsKCUtBU1NFUlQoYV92cF9yZXQgIT0gTlVMTCk7CglLQVNTRVJUKGJfZHZwICE9IE5VTEwp
 OwoJS0FTU0VSVChiX2NucCAhPSBOVUxMKTsKCUtBU1NFUlQoYl92cF9yZXQgIT0gTlVMTCk7
 CglLQVNTRVJUKGFfZHZwICE9IGJfZHZwKTsKCUtBU1NFUlQoYV92cF9yZXQgIT0gYl92cF9y
 ZXQpOwoJS0FTU0VSVChhX2R2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChiX2R2cC0+
 dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChhX2R2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNT
 RVJUKGJfZHZwLT52X21vdW50ID09IG1wKTsKCUtBU1NFUlQoYV9taXNzaW5nX29rICE9IGJf
 bWlzc2luZ19vayk7CgoJZXJyb3IgPSBvcHMtPmdyb19sb2NrX2RpcmVjdG9yeShtcCwgYV9k
 dnApOwoJaWYgKGVycm9yKQoJCWdvdG8gZmFpbDA7CgoJLyogRGlkIHdlIGxvc2UgYSByYWNl
 IHdpdGggbW91bnQ/ICAqLwoJaWYgKGFfZHZwLT52X21vdW50ZWRoZXJlICE9IE5VTEwpIHsK
 CQllcnJvciA9IEVCVVNZOwoJCWdvdG8gZmFpbDE7Cgl9CgoJZXJyb3IgPSBvcHMtPmdyb19s
 b29rdXAobXAsIGFfZHZwLCBhX2NucCwgYV9kZV9yZXQsICZhX3ZwKTsKCWlmIChlcnJvcikg
 ewoJCWlmIChhX21pc3Npbmdfb2sgJiYgKGVycm9yID09IEVOT0VOVCkpCgkJCWFfdnAgPSBO
 VUxMOwoJCWVsc2UKCQkJZ290byBmYWlsMTsKCX0gZWxzZSB7CgkJS0FTU0VSVChhX3ZwICE9
 IE5VTEwpOwoKCQkvKiBSZWZ1c2UgdG8gcmVuYW1lIChvdmVyKSBgLicuICAqLwoJCWlmIChh
 X3ZwID09IGFfZHZwKSB7CgkJCWVycm9yID0gYV9kb3RfZXJyb3I7CgkJCWdvdG8gZmFpbDI7
 CgkJfQoKCQlpZiAoYV92cCA9PSBiX2R2cCkgewoJCQllcnJvciA9IG92ZXJsYXBfZXJyb3I7
 CgkJCWdvdG8gZmFpbDI7CgkJfQoJfQoKCUtBU1NFUlQoYV92cCAhPSBhX2R2cCk7CglLQVNT
 RVJUKGFfdnAgIT0gYl9kdnApOwoKCWVycm9yID0gb3BzLT5ncm9fbG9ja19kaXJlY3Rvcnko
 bXAsIGJfZHZwKTsKCWlmIChlcnJvcikKCQlnb3RvIGZhaWwyOwoKCS8qIERpZCB3ZSBsb3Nl
 IGEgcmFjZSB3aXRoIG1vdW50PyAgKi8KCWlmIChiX2R2cC0+dl9tb3VudGVkaGVyZSAhPSBO
 VUxMKSB7CgkJZXJyb3IgPSBFQlVTWTsKCQlnb3RvIGZhaWwzOwoJfQoKCWVycm9yID0gb3Bz
 LT5ncm9fbG9va3VwKG1wLCBiX2R2cCwgYl9jbnAsIGJfZGVfcmV0LCAmYl92cCk7CglpZiAo
 ZXJyb3IpIHsKCQlpZiAoYl9taXNzaW5nX29rICYmIChlcnJvciA9PSBFTk9FTlQpKQoJCQli
 X3ZwID0gTlVMTDsKCQllbHNlCgkJCWdvdG8gZmFpbDM7Cgl9IGVsc2UgewoJCUtBU1NFUlQo
 Yl92cCAhPSBOVUxMKTsKCgkJLyogUmVmdXNlIHRvIHJlbmFtZSAob3ZlcikgYC4nLiAgKi8K
 CQlpZiAoYl92cCA9PSBiX2R2cCkgewoJCQllcnJvciA9IGJfZG90X2Vycm9yOwoJCQlnb3Rv
 IGZhaWw0OwoJCX0KCgkJLyogYiBpcyBub3QgYW4gYW5jZXN0b3Igb2YgYS4gICovCgkJaWYg
 KGJfdnAgPT0gYV9kdnApIHsKCQkJLyoKCQkJICogV2UgaGF2ZSBhIGRpcmVjdG9yeSBoYXJk
 IGxpbmsgYmVmb3JlIHVzLgoJCQkgKiBYWFggV2hhdCBlcnJvciBzaG91bGQgdGhpcyByZXR1
 cm4/ICBFREVBRExLPwoJCQkgKiBQYW5pYz8KCQkJICovCgkJCWVycm9yID0gRUlPOwoJCQln
 b3RvIGZhaWw0OwoJCX0KCX0KCUtBU1NFUlQoYl92cCAhPSBiX2R2cCk7CglLQVNTRVJUKGJf
 dnAgIT0gYV9kdnApOwoKCS8qCgkgKiBXZSd2ZSBsb29rZWQgdXAgYm90aCBub2Rlcy4gIE5v
 dyBsb2NrIHRoZW0gYW5kIGNoZWNrIHRoZW0uCgkgKi8KCglpZiAoYV92cCAhPSBOVUxMKSB7
 CgkJdm5fbG9jayhhX3ZwLCBMS19FWENMVVNJVkUgfCBMS19SRVRSWSk7CgkJS0FTU0VSVChh
 X3ZwLT52X21vdW50ID09IG1wKTsKCQkvKiBSZWZ1c2UgdG8gcmVuYW1lIChvdmVyKSBhIG1v
 dW50IHBvaW50LiAgKi8KCQlpZiAoKGFfdnAtPnZfdHlwZSA9PSBWRElSKSAmJiAoYV92cC0+
 dl9tb3VudGVkaGVyZSAhPSBOVUxMKSkgewoJCQllcnJvciA9IEVCVVNZOwoJCQlnb3RvIGZh
 aWw1OwoJCX0KCX0KCglpZiAoKGJfdnAgIT0gTlVMTCkgJiYgKGJfdnAgIT0gYV92cCkpIHsK
 CQl2bl9sb2NrKGJfdnAsIExLX0VYQ0xVU0lWRSB8IExLX1JFVFJZKTsKCQlLQVNTRVJUKGJf
 dnAtPnZfbW91bnQgPT0gbXApOwoJCS8qIFJlZnVzZSB0byByZW5hbWUgKG92ZXIpIGEgbW91
 bnQgcG9pbnQuICAqLwoJCWlmICgoYl92cC0+dl90eXBlID09IFZESVIpICYmIChiX3ZwLT52
 X21vdW50ZWRoZXJlICE9IE5VTEwpKSB7CgkJCWVycm9yID0gRUJVU1k7CgkJCWdvdG8gZmFp
 bDY7CgkJfQoJfQoKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGFfZHZwKSA9PSBMS19FWENMVVNJ
 VkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoYl9kdnApID09IExLX0VYQ0xVU0lWRSk7CglL
 QVNTRVJUKGFfbWlzc2luZ19vayB8fCAoYV92cCAhPSBOVUxMKSk7CglLQVNTRVJUKGJfbWlz
 c2luZ19vayB8fCAoYl92cCAhPSBOVUxMKSk7CglLQVNTRVJUKChhX3ZwID09IE5VTEwpIHx8
 IChWT1BfSVNMT0NLRUQoYV92cCkgPT0gTEtfRVhDTFVTSVZFKSk7CglLQVNTRVJUKChiX3Zw
 ID09IE5VTEwpIHx8IChWT1BfSVNMT0NLRUQoYl92cCkgPT0gTEtfRVhDTFVTSVZFKSk7CgoJ
 KmFfdnBfcmV0ID0gYV92cDsKCSpiX3ZwX3JldCA9IGJfdnA7CglyZXR1cm4gMDsKCmZhaWw2
 OglpZiAoKGJfdnAgIT0gTlVMTCkgJiYgKGJfdnAgIT0gYV92cCkpCgkJVk9QX1VOTE9DSyhi
 X3ZwLCAwKTsKZmFpbDU6CWlmIChhX3ZwICE9IE5VTEwpCgkJVk9QX1VOTE9DSyhhX3ZwLCAw
 KTsKZmFpbDQ6CWlmIChiX3ZwICE9IE5VTEwpCgkJdnJlbGUoYl92cCk7CmZhaWwzOglWT1Bf
 VU5MT0NLKGJfZHZwLCAwKTsKZmFpbDI6CWlmIChhX3ZwICE9IE5VTEwpCgkJdnJlbGUoYV92
 cCk7CmZhaWwxOglWT1BfVU5MT0NLKGFfZHZwLCAwKTsKZmFpbDA6CXJldHVybiBlcnJvcjsK
 fQoKLyoKICogZ2VuZnNfcmVuYW1lX2V4aXQ6IFVubG9jayBldmVyeXRoaW5nIHdlIGxvY2tl
 ZCBmb3IgcmVuYW1lLgogKgogKiBmZHZwIGFuZCB0ZHZwIG11c3QgYmUgcmVmZXJlbmNlZC4K
 ICoKICogT24gZW50cnksIGV2ZXJ5dGhpbmcgaXMgbG9ja2VkLCBhbmQgZnZwIGFuZCB0dnAg
 cmVmZXJlbmNlZC4KICoKICogT24gZXhpdCwgZXZlcnl0aGluZyBpcyB1bmxvY2tlZCwgYW5k
 IGZ2cCBhbmQgdHZwIGFyZSByZWxlYXNlZC4KICovCnN0YXRpYyB2b2lkCmdlbmZzX3JlbmFt
 ZV9leGl0KGNvbnN0IHN0cnVjdCBnZW5mc19yZW5hbWVfb3BzICpvcHMsCiAgICBzdHJ1Y3Qg
 bW91bnQgKm1wLAogICAgc3RydWN0IHZub2RlICpmZHZwLCBzdHJ1Y3Qgdm5vZGUgKmZ2cCwK
 ICAgIHN0cnVjdCB2bm9kZSAqdGR2cCwgc3RydWN0IHZub2RlICp0dnApCnsKCgkodm9pZClv
 cHM7CglLQVNTRVJUKG9wcyAhPSBOVUxMKTsKCUtBU1NFUlQobXAgIT0gTlVMTCk7CglLQVNT
 RVJUKGZkdnAgIT0gTlVMTCk7CglLQVNTRVJUKGZ2cCAhPSBOVUxMKTsKCUtBU1NFUlQoZmR2
 cCAhPSBmdnApOwoJS0FTU0VSVChmZHZwICE9IHR2cCk7CglLQVNTRVJUKHRkdnAgIT0gdHZw
 KTsKCUtBU1NFUlQodGR2cCAhPSBmdnApOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZmR2cCkg
 PT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHRkdnApID09IExLX0VY
 Q0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmdnApID09IExLX0VYQ0xVU0lWRSk7
 CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKFZPUF9JU0xPQ0tFRCh0dnApID09IExLX0VY
 Q0xVU0lWRSkpOwoKCWlmICgodHZwICE9IE5VTEwpICYmICh0dnAgIT0gZnZwKSkKCQlWT1Bf
 VU5MT0NLKHR2cCwgMCk7CglWT1BfVU5MT0NLKGZ2cCwgMCk7CglpZiAodHZwICE9IE5VTEwp
 CgkJdnJlbGUodHZwKTsKCWlmICh0ZHZwICE9IGZkdnApCgkJVk9QX1VOTE9DSyh0ZHZwLCAw
 KTsKCXZyZWxlKGZ2cCk7CglWT1BfVU5MT0NLKGZkdnAsIDApOwp9CgovKgogKiBnZW5mc19y
 ZW5hbWVfcmVtb3ZlOiBSZW1vdmUgdGhlIGVudHJ5IGZvciB0aGUgbm9uLWRpcmVjdG9yeSB2
 cCB3aXRoCiAqIGNvbXBvbmVudG5hbWUgY25wIGZyb20gdGhlIGRpcmVjdG9yeSBkdnAsIHVz
 aW5nIHRoZSBsb29rdXAgcmVzdWx0cwogKiBkZS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0
 eSBvZiBncm9fcmVtb3ZlIHRvIHB1cmdlIHRoZSBuYW1lIGNhY2hlCiAqIGFuZCBub3RlIGtl
 dmVudHMuCiAqCiAqIEV2ZXJ5dGhpbmcgbXVzdCBiZSBsb2NrZWQgYW5kIHJlZmVyZW5jZWQu
 CiAqLwpzdGF0aWMgaW50CmdlbmZzX3JlbmFtZV9yZW1vdmUoY29uc3Qgc3RydWN0IGdlbmZz
 X3JlbmFtZV9vcHMgKm9wcywKICAgIHN0cnVjdCBtb3VudCAqbXAsIGthdXRoX2NyZWRfdCBj
 cmVkLAogICAgc3RydWN0IHZub2RlICpkdnAsIHN0cnVjdCBjb21wb25lbnRuYW1lICpjbnAs
 IHZvaWQgKmRlLCBzdHJ1Y3Qgdm5vZGUgKnZwKQp7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChv
 cHMgIT0gTlVMTCk7CglLQVNTRVJUKG1wICE9IE5VTEwpOwoJS0FTU0VSVChkdnAgIT0gTlVM
 TCk7CglLQVNTRVJUKGNucCAhPSBOVUxMKTsKCUtBU1NFUlQodnAgIT0gTlVMTCk7CglLQVNT
 RVJUKGR2cCAhPSB2cCk7CglLQVNTRVJUKGR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VS
 VCh2cC0+dl90eXBlICE9IFZESVIpOwoJS0FTU0VSVChkdnAtPnZfbW91bnQgPT0gbXApOwoJ
 S0FTU0VSVCh2cC0+dl9tb3VudCA9PSBtcCk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChkdnAp
 ID09IExLX0VYQ0xVU0lWRSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRCh2cCkgPT0gTEtfRVhD
 TFVTSVZFKTsKCgllcnJvciA9IG9wcy0+Z3JvX3JlbW92ZV9jaGVja19wb3NzaWJsZShtcCwg
 ZHZwLCB2cCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCWVycm9yID0gb3BzLT5n
 cm9fcmVtb3ZlX2NoZWNrX3Blcm1pdHRlZChtcCwgY3JlZCwgZHZwLCB2cCk7CgllcnJvciA9
 IGthdXRoX2F1dGhvcml6ZV92bm9kZShjcmVkLCBLQVVUSF9WTk9ERV9ERUxFVEUsIHZwLCBk
 dnAsCgkgICAgZXJyb3IpOwoJaWYgKGVycm9yKQoJCXJldHVybiBlcnJvcjsKCgllcnJvciA9
 IG9wcy0+Z3JvX3JlbW92ZShtcCwgY3JlZCwgZHZwLCBjbnAsIGRlLCB2cCk7CglpZiAoZXJy
 b3IpCgkJcmV0dXJuIGVycm9yOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmdlbmZzX3Vm
 c2xpa2VfY2hlY2tfc3RpY2t5KGthdXRoX2NyZWRfdCwgbW9kZV90LCB1aWRfdCwgc3RydWN0
 IHZub2RlICosIHVpZF90KTsKCi8qCiAqIGdlbmZzX3Vmc2xpa2VfcmVuYW1lX2NoZWNrX3Bv
 c3NpYmxlOiBDaGVjayB3aGV0aGVyIGEgcmVuYW1lIGlzCiAqIHBvc3NpYmxlIGluZGVwZW5k
 ZW50IG9mIGNyZWRlbnRpYWxzLCBhc3N1bWluZyBVRlMtbGlrZSBpbm9kZSBmbGFnCiAqIHNl
 bWFudGljcy4gIGNsb2JiZXJfcCBpcyB0cnVlIGlmZiB0aGUgdGFyZ2V0IG5vZGUgYWxyZWFk
 eSBleGlzdHMuCiAqLwppbnQKZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tfcG9zc2libGUo
 CiAgICB1bnNpZ25lZCBsb25nIGZkZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmZsYWdzLAogICAg
 dW5zaWduZWQgbG9uZyB0ZGZsYWdzLCB1bnNpZ25lZCBsb25nIHRmbGFncywgYm9vbCBjbG9i
 YmVyX3AsCiAgICB1bnNpZ25lZCBsb25nIGltbXV0YWJsZSwgdW5zaWduZWQgbG9uZyBhcHBl
 bmQpCnsKCglpZiAoKGZkZmxhZ3MgfCBmZmxhZ3MpICYgKGltbXV0YWJsZSB8IGFwcGVuZCkp
 CgkJcmV0dXJuIEVQRVJNOwoKCWlmICh0ZGZsYWdzICYgKGltbXV0YWJsZSB8IChjbG9iYmVy
 X3A/IGFwcGVuZCA6IDApKSkKCQlyZXR1cm4gRVBFUk07CgoJaWYgKGNsb2JiZXJfcCAmJiAo
 dGZsYWdzICYgKGltbXV0YWJsZSB8IGFwcGVuZCkpKQoJCXJldHVybiBFUEVSTTsKCglyZXR1
 cm4gMDsKfQoKLyoKICogZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tfcGVybWl0dGVkOiBD
 aGVjayB3aGV0aGVyIGEgcmVuYW1lIGlzCiAqIHBlcm1pdHRlZCBnaXZlbiBvdXIgY3JlZGVu
 dGlhbHMsIGFzc3VtaW5nIFVGUy1saWtlIHBlcm1pc3Npb24gYW5kCiAqIG93bmVyc2hpcCBz
 ZW1hbnRpY3MuCiAqCiAqIFRoZSBvbmx5IHBhaXIgb2Ygdm5vZGVzIHRoYXQgbWF5IGJlIGlk
 ZW50aWNhbCBpcyB7ZmR2cCwgdGR2cH0uCiAqCiAqIEV2ZXJ5dGhpbmcgbXVzdCBiZSBsb2Nr
 ZWQgYW5kIHJlZmVyZW5jZWQuCiAqLwppbnQKZ2VuZnNfdWZzbGlrZV9yZW5hbWVfY2hlY2tf
 cGVybWl0dGVkKGthdXRoX2NyZWRfdCBjcmVkLAogICAgc3RydWN0IHZub2RlICpmZHZwLCBt
 b2RlX3QgZmRtb2RlLCB1aWRfdCBmZHVpZCwKICAgIHN0cnVjdCB2bm9kZSAqZnZwLCB1aWRf
 dCBmdWlkLAogICAgc3RydWN0IHZub2RlICp0ZHZwLCBtb2RlX3QgdGRtb2RlLCB1aWRfdCB0
 ZHVpZCwKICAgIHN0cnVjdCB2bm9kZSAqdHZwLCB1aWRfdCB0dWlkKQp7CglpbnQgZXJyb3I7
 CgoJS0FTU0VSVChmZHZwICE9IE5VTEwpOwoJS0FTU0VSVChmdnAgIT0gTlVMTCk7CglLQVNT
 RVJUKHRkdnAgIT0gTlVMTCk7CglLQVNTRVJUKGZkdnAgIT0gZnZwKTsKCUtBU1NFUlQoZmR2
 cCAhPSB0dnApOwoJS0FTU0VSVCh0ZHZwICE9IGZ2cCk7CglLQVNTRVJUKHRkdnAgIT0gdHZw
 KTsKCUtBU1NFUlQoZnZwICE9IHR2cCk7CglLQVNTRVJUKGZkdnAtPnZfdHlwZSA9PSBWRElS
 KTsKCUtBU1NFUlQodGR2cC0+dl90eXBlID09IFZESVIpOwoJS0FTU0VSVChmZHZwLT52X21v
 dW50ID09IGZ2cC0+dl9tb3VudCk7CglLQVNTRVJUKGZkdnAtPnZfbW91bnQgPT0gdGR2cC0+
 dl9tb3VudCk7CglLQVNTRVJUKCh0dnAgPT0gTlVMTCkgfHwgKGZkdnAtPnZfbW91bnQgPT0g
 dHZwLT52X21vdW50KSk7CglLQVNTRVJUKFZPUF9JU0xPQ0tFRChmZHZwKSA9PSBMS19FWENM
 VVNJVkUpOwoJS0FTU0VSVChWT1BfSVNMT0NLRUQoZnZwKSA9PSBMS19FWENMVVNJVkUpOwoJ
 S0FTU0VSVChWT1BfSVNMT0NLRUQodGR2cCkgPT0gTEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQo
 KHR2cCA9PSBOVUxMKSB8fCAoVk9QX0lTTE9DS0VEKHR2cCkgPT0gTEtfRVhDTFVTSVZFKSk7
 CgoJLyoKCSAqIFdlIG5lZWQgdG8gcmVtb3ZlIG9yIGNoYW5nZSBhbiBlbnRyeSBpbiB0aGUg
 c291cmNlIGRpcmVjdG9yeS4KCSAqLwoJZXJyb3IgPSBWT1BfQUNDRVNTKGZkdnAsIFZXUklU
 RSwgY3JlZCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCS8qCgkgKiBJZiB3ZSBh
 cmUgY2hhbmdpbmcgZGlyZWN0b3JpZXMsIHRoZW4gd2UgbmVlZCB0byB3cml0ZSB0byB0aGUK
 CSAqIHRhcmdldCBkaXJlY3RvcnkgdG8gYWRkIG9yIGNoYW5nZSBhbiBlbnRyeS4gIEFsc28s
 IGlmIGZ2cCBpcwoJICogYSBkaXJlY3RvcnksIHdlIG5lZWQgdG8gd3JpdGUgdG8gaXQgdG8g
 Y2hhbmdlIGl0cyBgLi4nCgkgKiBlbnRyeS4KCSAqLwoJaWYgKGZkdnAgIT0gdGR2cCkgewoJ
 CWVycm9yID0gVk9QX0FDQ0VTUyh0ZHZwLCBWV1JJVEUsIGNyZWQpOwoJCWlmIChlcnJvcikK
 CQkJcmV0dXJuIGVycm9yOwoJCWlmIChmdnAtPnZfdHlwZSA9PSBWRElSKSB7CgkJCWVycm9y
 ID0gVk9QX0FDQ0VTUyhmdnAsIFZXUklURSwgY3JlZCk7CgkJCWlmIChlcnJvcikKCQkJCXJl
 dHVybiBlcnJvcjsKCQl9Cgl9CgoJZXJyb3IgPSBnZW5mc191ZnNsaWtlX2NoZWNrX3N0aWNr
 eShjcmVkLCBmZG1vZGUsIGZkdWlkLCBmdnAsIGZ1aWQpOwoJaWYgKGVycm9yKQoJCXJldHVy
 biBlcnJvcjsKCgllcnJvciA9IGdlbmZzX3Vmc2xpa2VfY2hlY2tfc3RpY2t5KGNyZWQsIHRk
 bW9kZSwgdGR1aWQsIHR2cCwgdHVpZCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoK
 CXJldHVybiAwOwp9CgovKgogKiBnZW5mc191ZnNsaWtlX3JlbW92ZV9jaGVja19wb3NzaWJs
 ZTogQ2hlY2sgd2hldGhlciBhIHJlbW92ZSBpcwogKiBwb3NzaWJsZSBpbmRlcGVuZGVudCBv
 ZiBjcmVkZW50aWFscywgYXNzdW1pbmcgVUZTLWxpa2UgaW5vZGUgZmxhZwogKiBzZW1hbnRp
 Y3MuCiAqLwppbnQKZ2VuZnNfdWZzbGlrZV9yZW1vdmVfY2hlY2tfcG9zc2libGUodW5zaWdu
 ZWQgbG9uZyBkZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAgICB1bnNpZ25lZCBsb25n
 IGltbXV0YWJsZSwgdW5zaWduZWQgbG9uZyBhcHBlbmQpCnsKCgkvKgoJICogV2Ugd2FudCB0
 byBkZWxldGUgdGhlIGVudHJ5LiAgSWYgdGhlIGRpcmVjdG9yeSBpcyBpbW11dGFibGUsCgkg
 KiB3ZSBjYW4ndCB3cml0ZSB0byBpdCB0byBkZWxldGUgdGhlIGVudHJ5LiAgSWYgdGhlIGRp
 cmVjdG9yeQoJICogaXMgYXBwZW5kLW9ubHksIHRoZSBvbmx5IGNoYW5nZSB3ZSBjYW4gbWFr
 ZSBpcyB0byBhZGQKCSAqIGVudHJpZXMsIHNvIHdlIGNhbid0IGRlbGV0ZSBlbnRyaWVzLiAg
 SWYgdGhlIG5vZGUgaXMKCSAqIGltbXV0YWJsZSwgd2UgY2FuJ3QgY2hhbmdlIHRoZSBsaW5r
 cyB0byBpdCwgc28gd2UgY2FuJ3QKCSAqIGRlbGV0ZSB0aGUgZW50cnkuICBJZiB0aGUgbm9k
 ZSBpcyBhcHBlbmQtb25seS4uLndlbGwsIHRoaXMKCSAqIGlzIHdoYXQgVUZTIGRvZXMuCgkg
 Ki8KCWlmICgoZGZsYWdzIHwgZmxhZ3MpICYgKGltbXV0YWJsZSB8IGFwcGVuZCkpCgkJcmV0
 dXJuIEVQRVJNOwoKCXJldHVybiAwOwp9CgovKgogKiBnZW5mc191ZnNsaWtlX3JlbW92ZV9j
 aGVja19wZXJtaXR0ZWQ6IENoZWNrIHdoZXRoZXIgYSByZW1vdmUgaXMKICogcGVybWl0dGVk
 IGdpdmVuIG91ciBjcmVkZW50aWFscywgYXNzdW1pbmcgVUZTLWxpa2UgcGVybWlzc2lvbiBh
 bmQKICogb3duZXJzaGlwIHNlbWFudGljcy4KICoKICogRXZlcnl0aGluZyBtdXN0IGJlIGxv
 Y2tlZCBhbmQgcmVmZXJlbmNlZC4KICovCmludApnZW5mc191ZnNsaWtlX3JlbW92ZV9jaGVj
 a19wZXJtaXR0ZWQoa2F1dGhfY3JlZF90IGNyZWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKmR2cCwg
 bW9kZV90IGRtb2RlLCB1aWRfdCBkdWlkLAogICAgc3RydWN0IHZub2RlICp2cCwgdWlkX3Qg
 dWlkKQp7CglpbnQgZXJyb3I7CgoJS0FTU0VSVChkdnAgIT0gTlVMTCk7CglLQVNTRVJUKHZw
 ICE9IE5VTEwpOwoJS0FTU0VSVChkdnAgIT0gdnApOwoJS0FTU0VSVChkdnAtPnZfdHlwZSA9
 PSBWRElSKTsKCUtBU1NFUlQodnAtPnZfdHlwZSAhPSBWRElSKTsKCUtBU1NFUlQoZHZwLT52
 X21vdW50ID09IHZwLT52X21vdW50KTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKGR2cCkgPT0g
 TEtfRVhDTFVTSVZFKTsKCUtBU1NFUlQoVk9QX0lTTE9DS0VEKHZwKSA9PSBMS19FWENMVVNJ
 VkUpOwoKCS8qCgkgKiBXZSBuZWVkIHRvIHdyaXRlIHRvIHRoZSBkaXJlY3RvcnkgdG8gcmVt
 b3ZlIGZyb20gaXQuCgkgKi8KCWVycm9yID0gVk9QX0FDQ0VTUyhkdnAsIFZXUklURSwgY3Jl
 ZCk7CglpZiAoZXJyb3IpCgkJcmV0dXJuIGVycm9yOwoKCWVycm9yID0gZ2VuZnNfdWZzbGlr
 ZV9jaGVja19zdGlja3koY3JlZCwgZG1vZGUsIGR1aWQsIHZwLCB1aWQpOwoJaWYgKGVycm9y
 KQoJCXJldHVybiBlcnJvcjsKCglyZXR1cm4gMDsKfQoKLyoKICogZ2VuZnNfdWZzbGlrZV9j
 aGVja19zdGlja3k6IENoZWNrIHdoZXRoZXIgYSBwYXJ0eSB3aXRoIGNyZWRlbnRpYWxzCiAq
 IGNyZWQgbWF5IGNoYW5nZSBhbiBlbnRyeSBpbiBhIHN0aWNreSBkaXJlY3RvcnksIGFzc3Vt
 aW5nIFVGUy1saWtlCiAqIHBlcm1pc3Npb24sIG93bmVyc2hpcCwgYW5kIHN0aWNraW5lc3Mg
 c2VtYW50aWNzOiBJZiB0aGUgZGlyZWN0b3J5IGlzCiAqIHN0aWNreSBhbmQgdGhlIGVudHJ5
 IGV4aXN0cywgdGhlIHVzZXIgbXVzdCBvd24gZWl0aGVyIHRoZSBkaXJlY3RvcnkKICogb3Ig
 dGhlIGVudHJ5J3Mgbm9kZSBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIGVudHJ5LgogKgogKiBF
 dmVyeXRoaW5nIG11c3QgYmUgbG9ja2VkIGFuZCByZWZlcmVuY2VkLgogKi8KaW50CmdlbmZz
 X3Vmc2xpa2VfY2hlY2tfc3RpY2t5KGthdXRoX2NyZWRfdCBjcmVkLCBtb2RlX3QgZG1vZGUs
 IHVpZF90IGR1aWQsCiAgICBzdHJ1Y3Qgdm5vZGUgKnZwLCB1aWRfdCB1aWQpCnsKCglpZiAo
 KGRtb2RlICYgU19JU1RYVCkgJiYgKHZwICE9IE5VTEwpKQoJCXJldHVybiBnZW5mc19jYW5f
 c3RpY2t5KGNyZWQsIGR1aWQsIHVpZCk7CgoJcmV0dXJuIDA7Cn0KAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9mcy90bXBmcy90
 bXBmc192bm9wcy5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAADAxMDA0NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDA2MzUyADEy
 MDI2MjY2NTIzADAwMjAwMzEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hl
 ZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvKgkk
 TmV0QlNEOiB0bXBmc192bm9wcy5oLHYgMS4xMyAyMDExLzA1LzI0IDIwOjE3OjQ5IHJtaW5k
 IEV4cCAkCSovCgovKgogKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgVGhlIE5ldEJTRCBG
 b3VuZGF0aW9uLCBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgY29k
 ZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBG
 b3VuZGF0aW9uCiAqIGJ5IEp1bGlvIE0uIE1lcmlubyBWaWRhbCwgZGV2ZWxvcGVkIGFzIHBh
 cnQgb2YgR29vZ2xlJ3MgU3VtbWVyIG9mIENvZGUKICogMjAwNSBwcm9ncmFtLgogKgogKiBS
 ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
 IG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
 YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJp
 YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
 CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
 bmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
 c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxp
 c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQog
 KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
 aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
 IFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCiAqIGBgQVMg
 SVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
 IEJVVCBOT1QgTElNSVRFRAogKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
 SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogKiBQVVJQT1NFIEFS
 RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09O
 VFJJQlVUT1JTCiAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
 RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
 IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKICogU1VC
 U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
 VFM7IE9SIEJVU0lORVNTCiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
 IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCiAqIENPTlRSQUNULCBTVFJJ
 Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
 U0UpCiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRX
 QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
 QUdFLgogKi8KCiNpZm5kZWYgX0ZTX1RNUEZTX1RNUEZTX1ZOT1BTX0hfCiNkZWZpbmUgX0ZT
 X1RNUEZTX1RNUEZTX1ZOT1BTX0hfCgojaWYgIWRlZmluZWQoX0tFUk5FTCkKI2Vycm9yIG5v
 dCBzdXBwb3NlZCB0byBiZSBleHBvc2VkIHRvIHVzZXJsYW5kLgojZW5kaWYKCiNpbmNsdWRl
 IDxtaXNjZnMvZ2VuZnMvZ2VuZnMuaD4KCi8qCiAqIERlY2xhcmF0aW9ucyBmb3IgdG1wZnNf
 dm5vcHMuYy4KICovCgpleHRlcm4gaW50ICgqKnRtcGZzX3Zub2Rlb3BfcCkodm9pZCAqKTsK
 CmludAl0bXBmc19sb29rdXAJCSh2b2lkICopOwppbnQJdG1wZnNfY3JlYXRlCQkodm9pZCAq
 KTsKaW50CXRtcGZzX21rbm9kCQkodm9pZCAqKTsKaW50CXRtcGZzX29wZW4JCSh2b2lkICop
 OwppbnQJdG1wZnNfY2xvc2UJCSh2b2lkICopOwppbnQJdG1wZnNfYWNjZXNzCQkodm9pZCAq
 KTsKaW50CXRtcGZzX2dldGF0dHIJCSh2b2lkICopOwppbnQJdG1wZnNfc2V0YXR0cgkJKHZv
 aWQgKik7CmludAl0bXBmc19yZWFkCQkodm9pZCAqKTsKaW50CXRtcGZzX3dyaXRlCQkodm9p
 ZCAqKTsKI2RlZmluZQl0bXBmc19mY250bAkJZ2VuZnNfZmNudGwKI2RlZmluZQl0bXBmc19p
 b2N0bAkJZ2VuZnNfZW5vaW9jdGwKI2RlZmluZQl0bXBmc19wb2xsCQlnZW5mc19wb2xsCiNk
 ZWZpbmUJdG1wZnNfa3FmaWx0ZXIJCWdlbmZzX2txZmlsdGVyCiNkZWZpbmUJdG1wZnNfcmV2
 b2tlCQlnZW5mc19yZXZva2UKI2RlZmluZQl0bXBmc19tbWFwCQlnZW5mc19tbWFwCmludAl0
 bXBmc19mc3luYwkJKHZvaWQgKik7CiNkZWZpbmUJdG1wZnNfc2VlawkJZ2VuZnNfc2Vlawpp
 bnQJdG1wZnNfcmVtb3ZlCQkodm9pZCAqKTsKaW50CXRtcGZzX2xpbmsJCSh2b2lkICopOwpp
 bnQJdG1wZnNfcmVuYW1lCQkodm9pZCAqKTsKaW50CXRtcGZzX21rZGlyCQkodm9pZCAqKTsK
 aW50CXRtcGZzX3JtZGlyCQkodm9pZCAqKTsKaW50CXRtcGZzX3N5bWxpbmsJCSh2b2lkICop
 OwppbnQJdG1wZnNfcmVhZGRpcgkJKHZvaWQgKik7CmludAl0bXBmc19yZWFkbGluawkJKHZv
 aWQgKik7CiNkZWZpbmUJdG1wZnNfYWJvcnRvcAkJZ2VuZnNfYWJvcnRvcAppbnQJdG1wZnNf
 aW5hY3RpdmUJCSh2b2lkICopOwppbnQJdG1wZnNfcmVjbGFpbQkJKHZvaWQgKik7CiNpZiAw
 IC8vIG5lZWQgdXBkYXRlZCB2ZXJzaW9uIC0gc28gdXNlIG93biBmdW5jdGlvbnMKI2RlZmlu
 ZQl0bXBmc19sb2NrCQlnZW5mc19sb2NrCiNkZWZpbmUJdG1wZnNfdW5sb2NrCQlnZW5mc191
 bmxvY2sKI2Vsc2UKaW50CXRtcGZzX2xvY2sJCSh2b2lkICopOwppbnQJdG1wZnNfdW5sb2Nr
 CQkodm9pZCAqKTsKI2VuZGlmCiNkZWZpbmUJdG1wZnNfYm1hcAkJZ2VuZnNfZW9wbm90c3Vw
 cAojZGVmaW5lCXRtcGZzX3N0cmF0ZWd5CQlnZW5mc19lb3Bub3RzdXBwCmludAl0bXBmc19w
 cmludAkJKHZvaWQgKik7CmludAl0bXBmc19wYXRoY29uZgkJKHZvaWQgKik7CiNkZWZpbmUJ
 dG1wZnNfaXNsb2NrZWQJCWdlbmZzX2lzbG9ja2VkCmludAl0bXBmc19hZHZsb2NrCQkodm9p
 ZCAqKTsKI2RlZmluZQl0bXBmc19id3JpdGUJCWdlbmZzX251bGxvcAppbnQJdG1wZnNfZ2V0
 cGFnZXMJCSh2b2lkICopOwppbnQJdG1wZnNfcHV0cGFnZXMJCSh2b2lkICopOwppbnQJdG1w
 ZnNfd2hpdGVvdXQJCSh2b2lkICopOwoKI2VuZGlmIC8qIF9GU19UTVBGU19UTVBGU19WTk9Q
 U19IXyAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvbGttAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAwMDQwNzU1ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNDYzNDE2
 MwAwMDE0MjQxADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gv
 c3JjL3N5cy9sa20vdmZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMDAwMAAwMDAw
 MDAwADAwMDAwMDAwMDAwADEyMDI0NjM0MTYzADAwMTUwMzcANQAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL2xrbS92ZnMvdG1wZnMAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDAwMDAAMTIwMjcwMTA0NzUA
 MDAxNjE2NQA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3Ny
 Yy9zeXMvbGttL3Zmcy90bXBmcy9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAw
 MAAwMDAwMDAwMDQ0NAAxMjAyNDYzNDQwNwAwMDE3NzA1ADAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAIwkkTmV0QlNEOiBNYWtlZmlsZSx2IDEuMSAyMDA2LzExLzA1IDIyOjQy
 OjE0IGptbXYgRXhwICQKCi5pbmNsdWRlICIuLi9NYWtlZmlsZS5pbmMiCgouUEFUSDoJJFMv
 ZnMvdG1wZnMgJHsuQ1VSRElSfS8uLgoKS01PRD0JdG1wZnMKClNSQ1M9CWxrbWluaXRfdmZz
 LmMKU1JDUys9CXRtcGZzX2ZpZm9vcHMuYyB0bXBmc19tZW0uYyB0bXBmc19zcGVjb3BzLmMg
 dG1wZnNfc3Vici5jClNSQ1MrPQl0bXBmc19yZW5hbWUuYyB0bXBmc192ZnNvcHMuYyB0bXBm
 c192bm9wcy5jCgouaW5jbHVkZSA8YnNkLmttb2QubWs+CgAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMv
 c3lzL3J1bXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAA
 MDAwMDAwMDAwMDAAMTIwMjQ2MDUxMzUAMDAxNDQzNgA1AAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvcnVtcC9mcwAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAwMDQwNzU1ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNDYwNTE0NwAwMDE1
 MDUxADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0
 YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5
 cy9ydW1wL2ZzL2xpYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMDAwMAAwMDAwMDAwADAw
 MDAwMDAwMDAwADEyMDI0NjA1MTYxADAwMTU2MTMANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL3J1bXAvZnMvbGliL2xpYnRtcGZzAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 MDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAwMDAwMDAAMTIwMjcwMTA0NzUAMDAxNzQz
 NAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFy
 ICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMv
 cnVtcC9mcy9saWIvbGlidG1wZnMvTWFrZWZpbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAw
 MDAwMDQzMQAxMjAyNDYwNTMxMgAwMDIxMTQxADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAIwkkTmV0QlNEOiBNYWtlZmlsZSx2IDEuNSAwMTIvMDUvMDkgMDA6MTY6MDcgcmlh
 c3RyYWRoIEV4cCAkCiMKCi5QQVRIOgkkey5DVVJESVJ9Ly4uLy4uLy4uLy4uL2ZzL3RtcGZz
 CgpMSUI9CXJ1bXBmc190bXBmcwoKU1JDUz0JdG1wZnNfZmlmb29wcy5jIHRtcGZzX3NwZWNv
 cHMuYyB0bXBmc192ZnNvcHMuYyB0bXBmc19tZW0uYyBcCgl0bXBmc19yZW5hbWUuYyB0bXBm
 c19zdWJyLmMgdG1wZnNfdm5vcHMuYwoKLmluY2x1ZGUgPGJzZC5saWIubWs+Ci5pbmNsdWRl
 IDxic2Qua2xpbmtzLm1rPgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXBmcy1wYXRjaC9zcmMvc3lzL21v
 ZHVsZXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAwMDAwADAwMDAwMDAAMDAwMDAw
 MDAwMDAAMTIwMjQ2MzQxNjMAMDAxNTEyNgA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAHRtcGZzLXBhdGNoL3NyYy9zeXMvbW9kdWxlcy90bXBmcwAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDQw
 NzU1ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDAwMAAxMjAyNzAxMDQ3NQAwMDE2MjU0ADUA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABy
 b290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wZnMtcGF0Y2gvc3JjL3N5cy9tb2R1
 bGVzL3RtcGZzL01ha2VmaWxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA0NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAw
 NDAzADEyMDI0NjM0MjQzADAwMTc3NjUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHJvb3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAjCSROZXRCU0Q6IE1ha2VmaWxlLHYgMS4xIDIwMDgvMDYvMjggMTY6MTE6MzYgcnVtYmxl
 IEV4cCAkCgouaW5jbHVkZSAiLi4vTWFrZWZpbGUuaW5jIgoKLlBBVEg6CSR7U30vZnMvdG1w
 ZnMKCktNT0Q9CXRtcGZzClNSQ1M9CXRtcGZzX2ZpZm9vcHMuYyB0bXBmc19yZW5hbWUuYyB0
 bXBmc19zcGVjb3BzLmMgdG1wZnNfc3Vici5jIFwKCXRtcGZzX21lbS5jIHRtcGZzX3Zmc29w
 cy5jIHRtcGZzX3Zub3BzLmMKCi5pbmNsdWRlIDxic2Qua21vZHVsZS5taz4KAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcGZzLXBhdGNoL2luc3RhbGwtaXQAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNzQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDc3
 NQAxMjAyNzAxMzEzMAAwMDE0MTI2ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAdXN0YXIgIAByb290AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 IyEvYmluL3NoCgpkbj0iYGRpcm5hbWUgJDBgIgoKaWYgWyAhIC1kICIkZG4vc3JjIiBdOyB0
 aGVuCiAgZWNobyAiY2Fubm90IGZpbmQgc3JjLWRpciBmb3IgcGF0Y2hlcyAtIGV4aXRpbmci
 CiAgZXhpdCAxCmZpCgpwZD0iL3Vzci9zcmMiCmlmIFsgISAtZCAiJHBkLy4iIF07IHRoZW4K
 ICBlY2hvICJjYW5ub3QgZmluZCBkaXIgdG8gcGF0Y2ggLSBleGl0aW5nIgogIGV4aXQgMQpm
 aQoKKGNkICIkZG4vc3JjIjsgZmluZCAuIC10eXBlIGYgLXByaW50KSB8IHdoaWxlIHJlYWQg
 ZjsgZG8KICBpZiBbIC1mICIkcGQvJGYiIF07IHRoZW4KICAgIGlmIFsgLWYgIiRwZC8kZi1i
 ZWZvcmUtdG1wZnMtcGF0Y2giIF07IHRoZW4KICAgICAgZWNobyAiV0FSTklORzogYmFja3Vw
 LWZpbGUgZm9yICckZicgYWxyZWFkeSBwcmVzZW50IgogICAgZWxzZQogICAgICBtdiAiJHBk
 LyRmIiAiJHBkLyRmLWJlZm9yZS10bXBmcy1wYXRjaCIKICAgIGZpCiAgZmkKICBjcCAiJGRu
 L3NyYy8kZiIgIiRwZC8kZiIKZG9uZQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
 --------------030801010402050202010402--
 
 




Home | Main Index | Thread Index | Old Index