---559023410-851401618-929437249=:18708
Content-Type: TEXT/PLAIN; charset=US-ASCII
Hi,
Please find attached a new version of my MakeClass suite.
It's divided into two parts.
The first part ( this mail ) contains the MakeClass.cxx macro itself.
The second part will contain example files and notes how to use them.
Why a new MakeClass macro when we already have TTree:MakeClass ?
Usually during "rapid prototyping" I modify my code a lot, switch some
parts on, some off, ... . Unfortunately, I usually ( very often ) forget
to SetBranchStatus, enabling/disabling appropriate ( currently used )
ntuple branches. This leads to very difficult to find bugs ( if currently
used branches are "off" ), or slows down the analysis ( if currently
unneeded branches are "on" ).
I finally decided to implement a new MakeClass routine which generates
analysis code that reads the appropriate branches on demand ( during first
use of any leaf that belongs to the branch ).
For every "leaf" there is an automatically generated function in form :
leaf_type &leaf() {
if (leaf_branch_already_read) return leaf_value;
read_branch_that_contains_this_leaf;
mark_leaf_branch_as_already_read;
//
// here you can place a piece of code which will
// modify the leaf_value after it is read, but
// before it is returned to the user, for example :
// leaf_value = sqrt(leaf_value)
//
return leaf_value;
}
These functions return a "reference/pointer" to the current leaf_value.
( Note that you don't have to know to which "branch" the "leaf" belongs,
it's managed automatically. )
You can simply write, for example :
x = leaf();
You can also write :
leaf() = x;
which will modify the leaf_value for the current entry number ( as soon
as you call the GetEntry function for a different entry number, the new
leaf_value will be read ). Note that you can modify the "leaf()"
function itself to perform any required leaf_value modifications, as
shown above in the "leaf()" function body itself ( "Not a bad trick,
Doc !" ). This feature is extremely useful if you are not interested
in the "leaf_value" as it is stored in the TTree, but in some kind of
a "function" of this value ( for example, "leaf" stored in the TTree,
but you are interested in "sqrt(leaf)" ).
The only "disadvantage" that I see is that accessing a "leaf" requires to
call a function "leaf()" ( instead of accessing a variable "leaf", as in
the original TTree::MakeClass ).
Of course, I know, calling a function is always slower then accessing
directly a variable, but ... if I subtract the time spent to find missing
SetBranchStatus ( it's managed internally by the generated code, you
shouldn't change it ) and the time spent to read unneeded branches ... .
Moreover, the decision to "read" ( or not ) a branch, happens on an "entry
by entry" basis. One "reads" only these branches that are currently
required. Of course, if one uses a specific "leaf" many times in one's
routine, it's just enough to write "register leaf_type leafleaf;
leafleaf = leaf(); ...", and then one can use the "leafleaf" as many
times as one wants in the routine. The "performance penalty" of
calling a function once is negligible.
Last, but not least, the additional advantage of my macro is that one
can easily build a shared library from the analysis code that it
produces ( which is impossible if one uses code generated by the
original TTree::MakeClass ). So, you can get the full compiled code
speed in accessing your ntuple ( also mixed with CINT flexibility, see
the second part that contains example files ).
Warning : CINT shipped with root 2.21/08 has some problems with leaves
that are pointers to arrays ( one cannot write "x = leaf()[1];
leaf()[1] = x", one must say "leaf_type *tmp; tmp = leaf(); x = tmp[1];
tmp[1] = x" ), but the new CINT, starting with root 2.22/04, works well.
Also, due to current CINT limitations, one cannot use code generated by
this macro for leaves that are pointers to multi-dimensional arrays
directly in CINT ( as a CINT macro ). One needs to compile the analysis
code and create the shared library.
Have fun,
Jacek.
---559023410-851401618-929437249=:18708
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="MakeClass.cxx"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.GSO.3.96.990615110049.18708B@uranos.cto.us.edu.pl>
Content-Description: MakeClass.cxx
Ly8gIyBNYWtlQ2xhc3MuY3h4IA0KDQovLyAjIEhvdyB0byBnZW5lcmF0ZSBh
bmQgdXNlIHRoZSBza2VsZXRvbiBhbmFseXNpcyBjbGFzcyBmb3IgYSBUcmVl
LiANCi8vDQovLyAgIFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIHByb2R1Y2Vk
OiBjbGFzc25hbWUuaHh4IGFuZCBjbGFzc25hbWUuY3h4DQovLyAgIGlmIGNs
YXNzbmFtZSBpcyBOVUxMLCBjbGFzc25hbWUgd2lsbCBiZSBuYW1lb2Z0cmVl
Lg0KLy8NCi8vICAgVGhlIGdlbmVyYXRlZCBjb2RlIGluIGNsYXNzbmFtZS5o
eHggaW5jbHVkZXMgdGhlIGZvbGxvd2luZzoNCi8vICAgICAgLSBJZGVudGlm
aWNhdGlvbiBvZiB0aGUgb3JpZ2luYWwgVHJlZSBhbmQgSW5wdXQgRmlsZSBO
YW1lDQovLyAgICAgIC0gRGVmaW5pdGlvbiBvZiBhbmFseXNpcyBjbGFzcyAo
ZGF0YSBhbmQgZnVuY3Rpb25zKQ0KLy8gICAgICAtIHRoZSBmb2xsb3dpbmcg
Y2xhc3MgZnVuY3Rpb25zOg0KLy8gICAgICAgICAtIGNsYXNzbmFtZShDaGFy
X3QgKmZpbGVuYW1lID0gMCkgdG8gY29ubmVjdCBhIGZpbGUgd2l0aCBUcmVl
DQovLyAgICAgICAgIC0gY2xhc3NuYW1lKFRUcmVlICp0cmVlKSB0byBjb25u
ZWN0IGEgVHJlZQ0KLy8gICAgICAgICAtIH5jbGFzc25hbWUoKQ0KLy8gICAg
ICAgICAtIEdldEVudHJpZXMoKSB0byBnZXQgdGhlIG51bWJlciBvZiBlbnRy
aWVzIGluIFRyZWUNCi8vICAgICAgICAgLSBHZXRFbnRyeShJbnRfdCBlbnRy
eSkgdG8gcHJlcGFyZSB0aGUgZmlsbGluZyBvZiBkYXRhIGZyb20gZW50cnkN
Ci8vICAgICAgICAgLSBJbml0KFRUcmVlICp0cmVlKSB0byBpbml0aWFsaXpl
IHdpdGggYSBuZXcgVHJlZQ0KLy8gICAgICAgICAtIExvb3AoSW50X3QgKCph
bmFseXNpcykoY2xhc3NuYW1lICopKSB3aGljaCBsb29wcyBvdmVyIGFsbCBl
bnRyaWVzDQovLyAgICAgICAgICAgaW4gVHJlZSBjYWxsaW5nIHRoZSBnaXZl
biBhbmFseXNpcyBmdW5jdGlvbiBmb3IgZXZlcnkgZW50cnksIGlmDQovLyAg
ICAgICAgICAgdGhlIGFuYWx5c2lzIGZ1bmN0aW9uIHJldHVybnMgYSBub24g
emVybyB2YWx1ZSwgYnJlYWtzIHRoZSBsb29wDQovLyAgICAgICAgIC0gU2hv
dyhJbnRfdCBlbnRyeSkgdG8gcmVhZCBhbmQgZHVtcCBlbnRyeSAoIGFsbCBi
cmFuY2hlcyApDQovLw0KLy8gICBUaGUgZ2VuZXJhdGVkIGNvZGUgaW4gY2xh
c3NuYW1lLmN4eCBpbmNsdWRlcyBvbmx5IHRoZSBza2VsZXRvbiBvZiB0aGUN
Ci8vICAgbWFpbiBhbmFseXNpcyBmdW5jdGlvbiBMb29wKCkuDQovLw0KLy8g
ICBUbyB1c2UgdGhlIE1ha2VDbGFzcyBmdW5jdGlvbjoNCi8vICAgICAgLSBj
b25uZWN0IHlvdXIgVHJlZSBmaWxlIChlZzogVEZpbGUgZigibXlmaWxlLnJv
b3QiKTspDQovLyAgICAgIC0gTWFrZUNsYXNzKFQsIk15Q2xhc3MiKTsNCi8v
ICAgd2hlcmUgVCBpcyB0aGUgbmFtZSBvZiB0aGUgVHJlZSBpbiB0aGUgbXlm
aWxlLnJvb3QgZmlsZSwgYW5kDQovLyAgIE15Q2xhc3MuaHh4LCBNeUNsYXNz
LmN4eCBhcmUgbmFtZXMgb2YgZmlsZXMgY3JlYXRlZCBieSB0aGlzIGZ1bmN0
aW9uLg0KLy8gICBUaGVuLCBpbiBhIFJvb3Qgc2Vzc2lvbiwgeW91IGNhbiBk
bywgZm9yIGV4YW1wbGU6DQovLyAgICAgIFJvb3QgPiAuTCBNeUNsYXNzLmN4
eA0KLy8gICAgICBSb290ID4gTXlDbGFzcyB0DQovLyAgICAgIFJvb3QgPiB0
LkdldEVudHJ5KDEyKTsgLy8gUHJlcGFyZSB0byBmaWxsIHQgd2l0aCBlbnRy
eSBudW1iZXIgMTINCi8vICAgICAgUm9vdCA+IHQuU2hvdygpOyAgICAgICAv
LyBTaG93IHZhbHVlcyBvZiBlbnRyeSAxMg0KLy8gICAgICBSb290ID4gdC5T
aG93KDE2KTsgICAgIC8vIFJlYWQgYW5kIHNob3cgdmFsdWVzIG9mIGVudHJ5
IDE2DQovLyAgICAgIFJvb3QgPiB0Lkxvb3AoKTsgICAgICAgLy8gTG9vcCBv
dmVyIGFsbCBlbnRyaWVzDQovLw0KDQovLyAjIEludF90IE1ha2VDbGFzcyhU
VHJlZSAqdCwgY29uc3QgY2hhciAqY2xhc3NuYW1lID0gMCkgDQpJbnRfdCBN
YWtlQ2xhc3MoVFRyZWUgKnQsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSA9IDAp
DQp7DQogIC8vICMgQ2hlY2sgYWdhaW5zdCBhbiBpbnZhbGlkIFRyZWUgcG9p
bnRlciANCiAgaWYgKCF0KSByZXR1cm4gMTsNCiAgaWYgKCF0LT5Jc0EoKS0+
SW5oZXJpdHNGcm9tKCJUVHJlZSIpKSB7DQogICAgcHJpbnRmKCJBdHRlbXB0
IHRvIE1ha2VDbGFzcyBmb3IgYSBub24tVFRyZWUgb2JqZWN0XG4iKTsNCiAg
ICByZXR1cm4gMjsNCiAgfQ0KICANCiAgLy8gIyBDb25uZWN0IG91dHB1dCBm
aWxlcyANCiAgY2hhciAqdGhlYWQgPSBuZXcgY2hhclsyNTZdOw0KICANCiAg
aWYgKCFjbGFzc25hbWUpIGNsYXNzbmFtZSA9IHQtPkdldE5hbWUoKTsNCiAg
c3ByaW50Zih0aGVhZCwiJXMuaHh4IixjbGFzc25hbWUpOw0KICBGSUxFICpm
cCA9IGZvcGVuKHRoZWFkLCJ3Iik7DQogIGlmICghZnApIHsNCiAgICBwcmlu
dGYoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlOiVzXG4iLHRoZWFkKTsNCiAg
ICBkZWxldGUgW10gdGhlYWQ7DQogICAgcmV0dXJuIDM7DQogIH0NCiAgY2hh
ciAqdGNpbXAgPSBuZXcgY2hhclsyNTZdOw0KICBzcHJpbnRmKHRjaW1wLCIl
cy5jeHgiLGNsYXNzbmFtZSk7DQogIEZJTEUgKmZwYyA9IGZvcGVuKHRjaW1w
LCJ3Iik7DQogIGlmICghZnBjKSB7DQogICAgcHJpbnRmKCJDYW5ub3Qgb3Bl
biBvdXRwdXQgZmlsZTolc1xuIix0Y2ltcCk7DQogICAgZGVsZXRlIFtdIHRo
ZWFkOw0KICAgIGRlbGV0ZSBbXSB0Y2ltcDsNCiAgICByZXR1cm4gMzsNCiAg
fQ0KICBjaGFyICp0cmVlZmlsZSA9IG5ldyBjaGFyWzEwMDBdOw0KICBpZiAo
dC0+R2V0RGlyZWN0b3J5KCkgJiYgdC0+R2V0RGlyZWN0b3J5KCktPkdldEZp
bGUoKSkNCiAgICBzdHJjcHkodHJlZWZpbGUsdC0+R2V0RGlyZWN0b3J5KCkt
PkdldEZpbGUoKS0+R2V0TmFtZSgpKTsNCiAgZWxzZSBzdHJjcHkodHJlZWZp
bGUsIk1lbW9yeSBEaXJlY3RvcnkiKTsNCiAgDQogIC8vICMgKioqIEdlbmVy
YXRlIGNsYXNzbmFtZS5oeHggKioqIA0KICAvLyAjIFByaW50IHRoZSBoZWFk
ZXIgDQogIFRPYmpBcnJheSAqbGVhdmVzID0gdC0+R2V0TGlzdE9mTGVhdmVz
KCk7DQogIEludF90IG5sZWF2ZXMgPSBsZWF2ZXMtPkdldEVudHJpZXNGYXN0
KCk7DQogIFREYXRpbWUgdGQ7DQogIGZwcmludGYoZnAsIi8vICMgXG4iKTsN
CiAgZnByaW50ZihmcCwiLy8gIyBUaGlzIGNsYXNzIGhhcyBiZWVuIGF1dG9t
YXRpY2FsbHkgZ2VuZXJhdGVkIFxuIik7DQogIGZwcmludGYoZnAsIi8vICMg
KCVzIGJ5IFJPT1QgdmVyc2lvbiVzKSBcbiIsdGQuQXNTdHJpbmcoKSxnUk9P
VC0+R2V0VmVyc2lvbigpKTsNCiAgZnByaW50ZihmcCwiLy8gIyBmcm9tIFRU
cmVlICVzLyVzIFxuIix0LT5HZXROYW1lKCksdC0+R2V0VGl0bGUoKSk7DQog
IGZwcmludGYoZnAsIi8vICMgZm91bmQgb24gZmlsZTogJXMgXG4iLHRyZWVm
aWxlKTsNCiAgZnByaW50ZihmcCwiLy8gIyBcbiIpOw0KICBmcHJpbnRmKGZw
LCJcbiIpOw0KICBmcHJpbnRmKGZwLCIvLyAjICoqKiBUaGUgJXMgY2xhc3Mg
aW50ZXJmYWNlICoqKiBcbiIsY2xhc3NuYW1lKTsNCiAgZnByaW50ZihmcCwi
I2lmbmRlZiAlc19oeHhcbiIsY2xhc3NuYW1lKTsNCiAgZnByaW50ZihmcCwi
I2RlZmluZSAlc19oeHhcbiIsY2xhc3NuYW1lKTsNCiAgZnByaW50ZihmcCwi
XG4iKTsNCiAgZnByaW50ZihmcCwiLy8gIyBSZXF1aXJlZCBpbmNsdWRlcyBc
biIpOw0KICBmcHJpbnRmKGZwLCIjaWZuZGVmIF9fQ0lOVF9fXG4iKTsNCiAg
ZnByaW50ZihmcCwiI2luY2x1ZGUgPHN0ZGlvLmg+XG4iKTsNCiAgZnByaW50
ZihmcCwiI2luY2x1ZGUgPHN0cmVhbS5oPlxuIik7DQogIGZwcmludGYoZnAs
IiNpbmNsdWRlIFwiVFJPT1QuaFwiXG4iKTsNCiAgZnByaW50ZihmcCwiI2lu
Y2x1ZGUgXCJUVHJlZS5oXCJcbiIpOw0KICBmcHJpbnRmKGZwLCIjaW5jbHVk
ZSBcIlRGaWxlLmhcIlxuIik7DQogIGZwcmludGYoZnAsIiNpbmNsdWRlIFwi
QXBpLmhcIlxuIik7DQogIGZwcmludGYoZnAsIiNlbHNlXG4iKTsNCiAgZnBy
aW50ZihmcCwiY2xhc3MgVEJyYW5jaDtcbiIpOw0KICBmcHJpbnRmKGZwLCJj
bGFzcyBUVHJlZTtcbiIpOw0KICBmcHJpbnRmKGZwLCJjbGFzcyBURmlsZTtc
biIpOw0KICBmcHJpbnRmKGZwLCIjZW5kaWZcbiIpOw0KICBmcHJpbnRmKGZw
LCJcbiIpOw0KICBmcHJpbnRmKGZwLCIvLyAjIGNsYXNzICVzIFxuIixjbGFz
c25hbWUpOw0KICBmcHJpbnRmKGZwLCJjbGFzcyAlcyB7XG4iLGNsYXNzbmFt
ZSk7DQogIGZwcmludGYoZnAsInB1YmxpYzpcbiIpOw0KICBmcHJpbnRmKGZw
LCIgIC8vICMgcHVibGljIHZhcmlhYmxlcyBcbiIpOw0KICBmcHJpbnRmKGZw
LCIgIFRUcmVlICAgICAgICAgICAqZlRyZWU7IC8vIHBvaW50ZXIgdG8gdGhl
IGFuYWx5c2VkIFRUcmVlXG4iKTsNCiAgZnByaW50ZihmcCwiICBJbnRfdCAg
ICAgICAgICAgZkVudHJ5OyAvLyBjdXJyZW50IGVudHJ5IG51bWJlclxuIik7
DQogIA0KICAvLyAjIExvb3Agb24gYWxsIGxlYXZlcyB0byBnZW5lcmF0ZSBi
cmFuY2ggYW5kIGxlYWYgZGVjbGFyYXRpb25zIA0KICBmcHJpbnRmKGZwLCIg
IC8vICMgZGVjbGFyYXRpb24gb2YgYnJhbmNoZXMgYW5kIGxlYXZlcyBcbiIp
Ow0KICBJbnRfdCBsZW4sIGw7DQogIFRMZWFmICpsZWFmY291bnQ7DQogIFRM
ZWFmT2JqZWN0ICpsZWFmb2JqOw0KICBjaGFyICpibmFtZTsNCiAgY29uc3Qg
Y2hhciAqaGVhZE9LICA9ICIgICI7DQogIGNvbnN0IGNoYXIgKmhlYWRjb20g
PSAiICAvLyAiOw0KICBjb25zdCBjaGFyICpoZWFkOw0KICBjaGFyIGJyYW5j
aG5hbWVbNjRdOw0KICBjaGFyIGxlYWZuYW1lWzY0XTsNCiAgVE9iakFycmF5
IGJyYW5jaGVzKG5sZWF2ZXMvNCArIDEpOw0KICBJbnRfdCAqbGVhZlN0YXR1
cyA9IG5ldyBJbnRfdFtubGVhdmVzXTsNCiAgZm9yIChsPTA7bDxubGVhdmVz
O2wrKykgew0KICAgIGxlYWZTdGF0dXNbbF0gPSAwOw0KICAgIFRMZWFmICps
ZWFmID0gKFRMZWFmKilsZWF2ZXMtPlVuY2hlY2tlZEF0KGwpOw0KICAgIGxl
biA9IGxlYWYtPkdldExlbigpOw0KICAgIGxlYWZjb3VudCA9IGxlYWYtPkdl
dExlYWZDb3VudCgpOw0KICAgIFRCcmFuY2ggKmJyYW5jaCA9IGxlYWYtPkdl
dEJyYW5jaCgpOw0KICAgIGlmICghYnJhbmNoZXMuRmluZE9iamVjdChicmFu
Y2gpKSB7DQogICAgICBicmFuY2hlcy5BZGQoYnJhbmNoKTsNCiAgICAgIHN0
cmNweShicmFuY2huYW1lLGJyYW5jaC0+R2V0TmFtZSgpKTsNCiAgICAgIGJu
YW1lID0gc3Ryc3RyKGJyYW5jaG5hbWUsIlsiKTsNCiAgICAgIGlmIChibmFt
ZSkgKmJuYW1lID0gMDsNCiAgICAgIGJuYW1lID0gYnJhbmNobmFtZTsNCiAg
ICAgIHdoaWxlICgqYm5hbWUpIHtpZiAoKmJuYW1lID09ICcuJykgKmJuYW1l
PSdfJzsgYm5hbWUrKzt9DQogICAgICBmcHJpbnRmKGZwLCIgIC8vIGJyYW5j
aCAlc1xuIixicmFuY2gtPkdldE5hbWUoKSk7DQogICAgICBmcHJpbnRmKGZw
LCIgIEludF90ICAgICAgICAgICBJc1JlYWRfJXM7XG4iLGJyYW5jaG5hbWUp
Ow0KICAgICAgZnByaW50ZihmcCwiICBUQnJhbmNoICAgICAgICAgKmJfJXM7
XG4iLGJyYW5jaG5hbWUpOw0KICAgIH0gZWxzZSBsZWFmU3RhdHVzW2xdID0g
MTsNCiAgICBpZiAobGVhZmNvdW50KSBzdHJjcHkobGVhZm5hbWUsYnJhbmNo
LT5HZXROYW1lKCkpOw0KICAgIGVsc2UgICAgICAgICAgIHN0cmNweShsZWFm
bmFtZSxsZWFmLT5HZXRUaXRsZSgpKTsNCiAgICBibmFtZSA9IHN0cnN0cihs
ZWFmbmFtZSwiWyIpOw0KICAgIGlmIChibmFtZSkgKmJuYW1lID0gMDsNCiAg
ICBibmFtZSA9IGxlYWZuYW1lOw0KICAgIHdoaWxlICgqYm5hbWUpIHtpZiAo
KmJuYW1lID09ICcuJykgKmJuYW1lPSdfJzsgYm5hbWUrKzt9DQogICAgY2hh
ciAqdHdvZGltID0gKGNoYXIqKXN0cnN0cihsZWFmLT5HZXRUaXRsZSgpLCJd
WyIpOw0KICAgIGhlYWQgPSBoZWFkT0s7DQogICAgaWYgKGJyYW5jaC0+SXNB
KCkgPT0gVEJyYW5jaE9iamVjdDo6Q2xhc3MoKSkgew0KICAgICAgaWYgKGJy
YW5jaC0+R2V0TGlzdE9mQnJhbmNoZXMoKS0+R2V0RW50cmllc0Zhc3QoKSkg
Y29udGludWU7DQogICAgICBsZWFmb2JqID0gKFRMZWFmT2JqZWN0KilsZWFm
Ow0KICAgICAgaWYgKCFsZWFmb2JqLT5HZXRDbGFzcygpKSBoZWFkID0gaGVh
ZGNvbTsNCiAgICAgIGZwcmludGYoZnAsIiVzJS0xNXMgKmxfJXM7XG4iLGhl
YWQsbGVhZm9iai0+R2V0VHlwZU5hbWUoKSxsZWFmb2JqLT5HZXROYW1lKCkp
Ow0KICAgICAgZnByaW50ZihmcCwiJXMlLTE1cyAqJXMoKSB7IixoZWFkLGxl
YWZvYmotPkdldFR5cGVOYW1lKCksbGVhZm9iai0+R2V0TmFtZSgpKTsNCiAg
ICAgIGZwcmludGYoZnAsImlmIChJc1JlYWRfJXMpIHJldHVybiBsXyVzOyIs
YnJhbmNobmFtZSxsZWFmb2JqLT5HZXROYW1lKCkpOw0KICAgICAgZnByaW50
ZihmcCwiYl8lcy0+R2V0RW50cnkoZkVudHJ5KTsiLGJyYW5jaG5hbWUpOw0K
ICAgICAgZnByaW50ZihmcCwiSXNSZWFkXyVzPTE7cmV0dXJuIGxfJXM7fVxu
IixicmFuY2huYW1lLGxlYWZvYmotPkdldE5hbWUoKSk7DQogICAgICBjb250
aW51ZTsNCiAgICB9DQogICAgaWYgKGxlYWZjb3VudCkgew0KICAgICAgbGVu
ID0gbGVhZmNvdW50LT5HZXRNYXhpbXVtKCk7DQogICAgICBpZiAodHdvZGlt
KSB7DQoJZnByaW50ZihmcCwiJXMlLTE1cyBsXyVzWyVkXSVzO1xuIixoZWFk
LGxlYWYtPkdldFR5cGVOYW1lKCksbGVhZm5hbWUsbGVuLChjaGFyKikodHdv
ZGltICsgMSkpOw0KCS8vIGZwcmludGYoZnAsIiVzJS0xNXMgKCYlcygpKVsl
ZF0lcyB7IixoZWFkLGxlYWYtPkdldFR5cGVOYW1lKCksbGVhZm5hbWUsbGVu
LChjaGFyKikodHdvZGltICsgMSkpOw0KCWZwcmludGYoZnAsIiVzJS0xNXMg
KColcygpKSVzIHsiLGhlYWQsbGVhZi0+R2V0VHlwZU5hbWUoKSxsZWFmbmFt
ZSwoY2hhciopKHR3b2RpbSArIDEpKTsNCglmcHJpbnRmKGZwLCJpZiAoSXNS
ZWFkXyVzKSByZXR1cm4gbF8lczsiLGJyYW5jaG5hbWUsbGVhZm5hbWUpOw0K
CWZwcmludGYoZnAsImJfJXMtPkdldEVudHJ5KGZFbnRyeSk7IixicmFuY2hu
YW1lKTsNCglmcHJpbnRmKGZwLCJJc1JlYWRfJXM9MTtyZXR1cm4gbF8lczt9
XG4iLGJyYW5jaG5hbWUsbGVhZm5hbWUpOw0KICAgICAgfSBlbHNlIHsNCglm
cHJpbnRmKGZwLCIlcyUtMTVzIGxfJXNbJWRdO1xuIixoZWFkLGxlYWYtPkdl
dFR5cGVOYW1lKCksbGVhZm5hbWUsbGVuKTsNCgkvLyBmcHJpbnRmKGZwLCIl
cyUtMTVzICgmJXMoKSlbJWRdIHsiLGhlYWQsbGVhZi0+R2V0VHlwZU5hbWUo
KSxsZWFmbmFtZSxsZW4pOw0KCWZwcmludGYoZnAsIiVzJS0xNXMgKiVzKCkg
eyIsaGVhZCxsZWFmLT5HZXRUeXBlTmFtZSgpLGxlYWZuYW1lKTsNCglmcHJp
bnRmKGZwLCJpZiAoSXNSZWFkXyVzKSByZXR1cm4gbF8lczsiLGJyYW5jaG5h
bWUsbGVhZm5hbWUpOw0KCWZwcmludGYoZnAsImJfJXMtPkdldEVudHJ5KGZF
bnRyeSk7IixicmFuY2huYW1lKTsNCglmcHJpbnRmKGZwLCJJc1JlYWRfJXM9
MTtyZXR1cm4gbF8lczt9XG4iLGJyYW5jaG5hbWUsbGVhZm5hbWUpOw0KICAg
ICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBmcHJpbnRmKGZwLCIlcyUtMTVz
IGxfJXM7XG4iLGhlYWQsbGVhZi0+R2V0VHlwZU5hbWUoKSxsZWFmbmFtZSk7
DQogICAgICBmcHJpbnRmKGZwLCIlcyUtMTVzICYlcygpIHsiLGhlYWQsbGVh
Zi0+R2V0VHlwZU5hbWUoKSxsZWFmbmFtZSk7DQogICAgICBmcHJpbnRmKGZw
LCJpZiAoSXNSZWFkXyVzKSByZXR1cm4gbF8lczsiLGJyYW5jaG5hbWUsbGVh
Zm5hbWUpOw0KICAgICAgZnByaW50ZihmcCwiYl8lcy0+R2V0RW50cnkoZkVu
dHJ5KTsiLGJyYW5jaG5hbWUpOw0KICAgICAgZnByaW50ZihmcCwiSXNSZWFk
XyVzPTE7cmV0dXJuIGxfJXM7fVxuIixicmFuY2huYW1lLGxlYWZuYW1lKTsN
CiAgICB9DQogIH0NCiAgDQogIC8vICMgR2VuZXJhdGUgY2xhc3MgbWVtYmVy
IGZ1bmN0aW9ucyBwcm90b3R5cGVzIA0KICBmcHJpbnRmKGZwLCIgIFxuIik7
DQogIGZwcmludGYoZnAsIiAgLy8gIyBwdWJsaWMgZnVuY3Rpb25zIFxuIik7
DQogIGZwcmludGYoZnAsIiAgJXMoQ2hhcl90ICpmaWxlbmFtZSA9IDApO1xu
IixjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZwLCIgICVzKFRUcmVlICp0cmVl
KSB7aWYgKCF0cmVlKSAlcygpO2Vsc2UgSW5pdCh0cmVlKTt9XG4iLGNsYXNz
bmFtZSxjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZwLCIgIH4lcygpIHs7fVxu
IixjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZwLCIgIFN0YXRfdCBHZXRFbnRy
aWVzKCkge2lmICghZlRyZWUpIHJldHVybiAwO3JldHVybiBmVHJlZS0+R2V0
RW50cmllcygpO31cbiIpOw0KICBmcHJpbnRmKGZwLCIgIEludF90IEdldEVu
dHJ5KEludF90IGVudHJ5KTtcbiIpOw0KICBmcHJpbnRmKGZwLCIgIHZvaWQg
SW5pdChUVHJlZSAqdHJlZSk7XG4iKTsNCiAgZnByaW50ZihmcCwiICBJbnRf
dCBMb29wKCk7XG4iKTsNCiAgZnByaW50ZihmcCwiICBJbnRfdCBMb29wKElu
dF90ICgqYW5hbHlzaXMpKCVzICopKTtcbiIsY2xhc3NuYW1lKTsNCiAgZnBy
aW50ZihmcCwiICB2b2lkIFNob3coSW50X3QgZW50cnkgPSAtMSk7XG4iKTsN
CiAgZnByaW50ZihmcCwifTtcbiIpOw0KICBmcHJpbnRmKGZwLCJcbiIpOw0K
ICBmcHJpbnRmKGZwLCIjZW5kaWZcbiIpOw0KICBmcHJpbnRmKGZwLCJcbiIp
Ow0KICANCiAgZnByaW50ZihmcCwiLy8gIyAqKiogVGhlICVzIGNsYXNzIGlt
cGxlbWVudGF0aW9uICoqKiBcbiIsY2xhc3NuYW1lKTsNCiAgZnByaW50Zihm
cCwiI2lmZGVmICVzX2N4eFxuIixjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZw
LCJcbiIpOw0KICANCiAgLy8gIyBHZW5lcmF0ZSBjbGFzcyBjb25zdHJ1Y3Rv
ciBjbGFzc25hbWUoQ2hhcl90ICpmaWxlbmFtZSkgDQogIGZwcmludGYoZnAs
Ii8vICMgJXM6OiVzKENoYXJfdCAqZmlsZW5hbWUpIFxuIixjbGFzc25hbWUs
Y2xhc3NuYW1lKTsNCiAgZnByaW50ZihmcCwiJXM6OiVzKENoYXJfdCAqZmls
ZW5hbWUpXG4iLGNsYXNzbmFtZSxjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZw
LCJ7XG4iKTsNCiAgZnByaW50ZihmcCwiICAvLyAjIElmIHBhcmFtZXRlciBm
aWxlbmFtZSBpcyBub3Qgc3BlY2lmaWVkIChvciB6ZXJvKSwgY29ubmVjdCB0
aGUgZmlsZSBcbiIpOw0KICBmcHJpbnRmKGZwLCIgIC8vICMgdXNlZCB0byBn
ZW5lcmF0ZSB0aGlzIGNsYXNzICggJXMgKS4gXG4iLHRyZWVmaWxlKTsNCiAg
ZnByaW50ZihmcCwiICBpZiAoIWZpbGVuYW1lIHx8ICEoKmZpbGVuYW1lKSkg
e1xuIik7DQogIGZwcmludGYoZnAsIiAgICBmaWxlbmFtZSA9IFwiJXNcIjtc
biIsdHJlZWZpbGUpOw0KICBmcHJpbnRmKGZwLCIgIH1cbiIpOw0KICBmcHJp
bnRmKGZwLCIgIC8vICMgRmluZCB0aGUgcmVxdWlyZWQgZmlsZSBpbiBST09U
IGFuZCwgaWYgbm90IGZvdW5kLCBvcGVuIGl0LiBcbiIpOw0KICBmcHJpbnRm
KGZwLCIgIFRGaWxlICpmID0gKFRGaWxlKilnUk9PVC0+R2V0TGlzdE9mRmls
ZXMoKS0+RmluZE9iamVjdChmaWxlbmFtZSk7XG4iKTsNCiAgZnByaW50Zihm
cCwiICBpZiAoIWYpIHtcbiIpOw0KICBmcHJpbnRmKGZwLCIgICAgZiA9IG5l
dyBURmlsZShmaWxlbmFtZSk7XG4iKTsNCiAgZnByaW50ZihmcCwiICB9XG4i
KTsNCiAgZnByaW50ZihmcCwiICAvLyAjIEZpbmQgdGhlICVzIHRyZWUgYW5k
IGluaXRpYWxpemUgb2JqZWN0LiBcbiIsdC0+R2V0TmFtZSgpKTsNCiAgZnBy
aW50ZihmcCwiICBUVHJlZSAqdCA9IChUVHJlZSopZ0RpcmVjdG9yeS0+R2V0
KFwiJXNcIik7XG4iLHQtPkdldE5hbWUoKSk7DQogIGZwcmludGYoZnAsIiAg
SW5pdCh0KTtcbiIpOw0KICBmcHJpbnRmKGZwLCJ9XG4iKTsNCiAgZnByaW50
ZihmcCwiXG4iKTsNCiAgDQogIC8vICMgR2VuZXJhdGUgY2xhc3MgbWVtYmVy
IGZ1bmN0aW9uIEdldEVudHJ5KEludF90IGVudHJ5KSANCiAgZnByaW50Zihm
cCwiLy8gIyBJbnRfdCAlczo6R2V0RW50cnkoSW50X3QgZW50cnkpIFxuIixj
bGFzc25hbWUpOw0KICBmcHJpbnRmKGZwLCJJbnRfdCAlczo6R2V0RW50cnko
SW50X3QgZW50cnkpXG4iLGNsYXNzbmFtZSk7DQogIGZwcmludGYoZnAsIntc
biIpOw0KICBmcHJpbnRmKGZwLCIgIC8vICMgUHJlcGFyZSB0byByZWFkIHNw
ZWNpZmllZCBlbnRyeSBmcm9tIHRoZSBUcmVlLiBcbiIpOw0KICBmcHJpbnRm
KGZwLCIgIC8vICMgSW4gY2FzZSB0aGUgZW50cnkgaXMgYWxyZWFkeSByZWFk
LCBqdXN0IHJldHVybi4gXG4iKTsNCiAgZnByaW50ZihmcCwiICBpZiAoIWZU
cmVlKSByZXR1cm4gMDtcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGlmIChmRW50
cnk9PWVudHJ5KSByZXR1cm4gMTtcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGZF
bnRyeSA9IGVudHJ5O1xuIik7DQogIGZwcmludGYoZnAsIiAgLy8gIyBTZXQg
YnJhbmNoIHN0YXR1c2VzIHRvIDAuIFxuIik7DQogIGZvciAobD0wO2w8bmxl
YXZlcztsKyspIHsNCiAgICBpZiAobGVhZlN0YXR1c1tsXSkgY29udGludWU7
DQogICAgVExlYWYgKmxlYWYgPSAoVExlYWYqKWxlYXZlcy0+VW5jaGVja2Vk
QXQobCk7DQogICAgVEJyYW5jaCAqYnJhbmNoID0gbGVhZi0+R2V0QnJhbmNo
KCk7DQogICAgc3RyY3B5KGJyYW5jaG5hbWUsYnJhbmNoLT5HZXROYW1lKCkp
Ow0KICAgIGJuYW1lID0gc3Ryc3RyKGJyYW5jaG5hbWUsIlsiKTsNCiAgICBp
ZiAoYm5hbWUpICpibmFtZSA9IDA7DQogICAgYm5hbWUgPSBicmFuY2huYW1l
Ow0KICAgIHdoaWxlICgqYm5hbWUpIHtpZiAoKmJuYW1lID09ICcuJykgKmJu
YW1lPSdfJzsgYm5hbWUrKzt9DQogICAgZnByaW50ZihmcCwiICBJc1JlYWRf
JXMgPSAwO1xuIixicmFuY2huYW1lKTsNCiAgfQ0KICBmcHJpbnRmKGZwLCIg
IC8vICMgV2UgYXJlIGRvbmUsIHJldHVybi4gXG4iKTsNCiAgZnByaW50Zihm
cCwiICByZXR1cm4gMTtcbiIpOw0KICBmcHJpbnRmKGZwLCJ9XG4iKTsNCiAg
ZnByaW50ZihmcCwiXG4iKTsNCiAgDQogIC8vICMgR2VuZXJhdGUgY2xhc3Mg
bWVtYmVyIGZ1bmN0aW9uIEluaXQoVFRyZWUgKnRyZWUpIA0KICBmcHJpbnRm
KGZwLCIvLyAjIHZvaWQgJXM6OkluaXQoVFRyZWUgKnRyZWUpIFxuIixjbGFz
c25hbWUpOw0KICBmcHJpbnRmKGZwLCJ2b2lkICVzOjpJbml0KFRUcmVlICp0
cmVlKVxuIixjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZwLCJ7XG4iKTsNCiAg
ZnByaW50ZihmcCwiICAvLyAjIEluaXRpYWxpemUgcHVibGljIHZhcmlhYmxl
cy4gXG4iKTsNCiAgZnByaW50ZihmcCwiICBmVHJlZSA9IHRyZWU7XG4iKTsN
CiAgZnByaW50ZihmcCwiICBmRW50cnkgPSAtMTtcbiIpOw0KICBmcHJpbnRm
KGZwLCIgIGlmICghdHJlZSkgcmV0dXJuO1xuIik7DQogIGZwcmludGYoZnAs
IiAgLy8gIyBTZXQgYnJhbmNoIHN0YXR1c2VzIHRvIDAsIGdldCBicmFuY2gg
cG9pbnRlcnMsIFxuIik7DQogIGZwcmludGYoZnAsIiAgLy8gIyBzZXQgYnJh
bmNoIGFkZHJlc3Nlcy4gXG4iKTsNCiAgZnByaW50ZihmcCwiICBmVHJlZS0+
U2V0QnJhbmNoU3RhdHVzKFwiKlwiLDEpOyAvLyBlbmFibGUgYWxsIGJyYW5j
aGVzXG4iKTsNCiAgZm9yIChsPTA7bDxubGVhdmVzO2wrKykgew0KICAgIGlm
IChsZWFmU3RhdHVzW2xdKSBjb250aW51ZTsNCiAgICBUTGVhZiAqbGVhZiA9
IChUTGVhZiopbGVhdmVzLT5VbmNoZWNrZWRBdChsKTsNCiAgICBsZW4gPSBs
ZWFmLT5HZXRMZW4oKTsNCiAgICBsZWFmY291bnQgPSBsZWFmLT5HZXRMZWFm
Q291bnQoKTsNCiAgICBUQnJhbmNoICpicmFuY2ggPSBsZWFmLT5HZXRCcmFu
Y2goKTsNCiAgICBzdHJjcHkoYnJhbmNobmFtZSxicmFuY2gtPkdldE5hbWUo
KSk7DQogICAgYm5hbWUgPSBzdHJzdHIoYnJhbmNobmFtZSwiWyIpOw0KICAg
IGlmIChibmFtZSkgKmJuYW1lID0gMDsNCiAgICBibmFtZSA9IGJyYW5jaG5h
bWU7DQogICAgd2hpbGUgKCpibmFtZSkge2lmICgqYm5hbWUgPT0gJy4nKSAq
Ym5hbWU9J18nOyBibmFtZSsrO30NCiAgICBpZiAobGVhZmNvdW50KSBzdHJj
cHkobGVhZm5hbWUsYnJhbmNoLT5HZXROYW1lKCkpOw0KICAgIGVsc2UgICAg
ICAgICAgIHN0cmNweShsZWFmbmFtZSxsZWFmLT5HZXRUaXRsZSgpKTsNCiAg
ICBibmFtZSA9IHN0cnN0cihsZWFmbmFtZSwiWyIpOw0KICAgIGlmIChibmFt
ZSkgKmJuYW1lID0gMDsNCiAgICBibmFtZSA9IGxlYWZuYW1lOw0KICAgIHdo
aWxlICgqYm5hbWUpIHtpZiAoKmJuYW1lID09ICcuJykgKmJuYW1lPSdfJzsg
Ym5hbWUrKzt9DQogICAgZnByaW50ZihmcCwiICAvLyBicmFuY2ggJXNcbiIs
YnJhbmNoLT5HZXROYW1lKCkpOw0KICAgIGZwcmludGYoZnAsIiAgSXNSZWFk
XyVzID0gMDtcbiIsYnJhbmNobmFtZSk7DQogICAgaGVhZCA9IGhlYWRPSzsN
CiAgICBpZiAoYnJhbmNoLT5Jc0EoKSA9PSBUQnJhbmNoT2JqZWN0OjpDbGFz
cygpKSB7DQogICAgICBpZiAoYnJhbmNoLT5HZXRMaXN0T2ZCcmFuY2hlcygp
LT5HZXRFbnRyaWVzRmFzdCgpKSB7DQoJZnByaW50ZihmcCwiJXNiXyVzID0g
ZlRyZWUtPkdldEJyYW5jaChcIiVzXCIpO1xuIixoZWFkLGJyYW5jaG5hbWUs
YnJhbmNoLT5HZXROYW1lKCkpOw0KCWZwcmludGYoZnAsIiVzZlRyZWUtPlNl
dEJyYW5jaFN0YXR1cyhcIiVzXCIsMCk7IC8vIGRpc2FibGUgdGhpcyBicmFu
Y2hcbiIsaGVhZCxicmFuY2gtPkdldE5hbWUoKSk7DQoJY29udGludWU7DQog
ICAgICB9DQogICAgICBsZWFmb2JqID0gKFRMZWFmT2JqZWN0KilsZWFmOw0K
ICAgICAgaWYgKCFsZWFmb2JqLT5HZXRDbGFzcygpKSBoZWFkID0gaGVhZGNv
bTsNCiAgICAgIHN0cmNweShsZWFmbmFtZSxicmFuY2huYW1lKTsNCiAgICB9
DQogICAgZnByaW50ZihmcCwiJXNiXyVzID0gZlRyZWUtPkdldEJyYW5jaChc
IiVzXCIpO1xuIixoZWFkLGJyYW5jaG5hbWUsYnJhbmNoLT5HZXROYW1lKCkp
Ow0KICAgIGlmIChsZWFmY291bnQpIGxlbiA9IGxlYWZjb3VudC0+R2V0TWF4
aW11bSgpICsgMTsNCiAgICBpZiAobGVuID4gMSkgZnByaW50ZihmcCwiJXNi
XyVzLT5TZXRBZGRyZXNzKGxfJXMpO1xuIixoZWFkLGJyYW5jaG5hbWUsbGVh
Zm5hbWUpOw0KICAgIGVsc2UgICAgICAgICBmcHJpbnRmKGZwLCIlc2JfJXMt
PlNldEFkZHJlc3MoJmxfJXMpO1xuIixoZWFkLGJyYW5jaG5hbWUsbGVhZm5h
bWUpOw0KICB9DQogIGZwcmludGYoZnAsIn1cbiIpOw0KICBmcHJpbnRmKGZw
LCJcbiIpOw0KICANCiAgLy8gIyBHZW5lcmF0ZSBjbGFzcyBtZW1iZXIgZnVu
Y3Rpb24gTG9vcChJbnRfdCAoKmFuYWx5c2lzKShjbGFzc25hbWUgKikpIA0K
ICBmcHJpbnRmKGZwLCIvLyAjIEludF90ICVzOjpMb29wKEludF90ICgqYW5h
bHlzaXMpKCVzICopKSBcbiIsY2xhc3NuYW1lLGNsYXNzbmFtZSk7DQogIGZw
cmludGYoZnAsIkludF90ICVzOjpMb29wKEludF90ICgqYW5hbHlzaXMpKCVz
ICopKVxuIixjbGFzc25hbWUsY2xhc3NuYW1lKTsNCiAgZnByaW50ZihmcCwi
e1xuIik7DQogIGZwcmludGYoZnAsIiAgLy8gIyBFeGVjdXRlIHRoZSBhbmFs
eXNpcyBmdW5jdGlvbiBmb3IgZXZlcnkgZW50cnkuIEluIGNhc2UgdGhlIFxu
Iik7DQogIGZwcmludGYoZnAsIiAgLy8gIyBhbmFseXNpcyBmdW5jdGlvbiBy
ZXR1cm5zIGEgbm9uIHplcm8gdmFsdWUsIGJyZWFrIHRoZSBsb29wLiBcbiIp
Ow0KICBmcHJpbnRmKGZwLCIgIGlmICghZlRyZWUgfHwgIWFuYWx5c2lzKSBy
ZXR1cm4gMDtcbiIpOw0KICBmcHJpbnRmKGZwLCIgIFxuIik7DQogIGZwcmlu
dGYoZnAsIiAgLy8gIyBMb2NhbCB2YXJpYWJsZXMgKCBjb21tb24gdG8gY29t
cGlsZWQgYW5kIGludGVycHJldGVkIGNvZGUgKS4gXG4iKTsNCiAgZnByaW50
ZihmcCwiICBTdGF0X3QgbmVudHJpZXMgPSBHZXRFbnRyaWVzKCk7IC8vIE51
bWJlciBvZiBlbnRyaWVzIGluIHRoZSBUcmVlLlxuIik7DQogIGZwcmludGYo
ZnAsIiAgSW50X3QgaWVudHJpZXMgPSAwOyAvLyBIb3cgbWFueSBlbnRyaWVz
IHdlcmUgYW5hbHlzZWQuXG4iKTsNCiAgZnByaW50ZihmcCwiICBcbiIpOw0K
ICBmcHJpbnRmKGZwLCIgIC8vICMgVGhpcyBpcyB0aGUgZW50cnkgbG9vcCBp
biBjb21waWxlZCBjb2RlLiBcbiIpOw0KICBmcHJpbnRmKGZwLCIjaWZuZGVm
IF9fQ0lOVF9fXG4iKTsNCiAgZnByaW50ZihmcCwiICBcbiIpOw0KICBmcHJp
bnRmKGZwLCIgIC8vICMgRmlyc3QgZGVmaW5lIHNvbWUgbG9jYWwgdmFyaWFi
bGVzIGFuZCBvYmplY3RzLiBcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGNoYXIg
dGVtcFs2NF07IC8vIElOVEVSUFJFVEVERlVOQ1xuIik7DQogIGZwcmludGYo
ZnAsIiAgbG9uZyBvZmZzZXQgPSAwOyAvLyBJTlRFUlBSRVRFREZVTkNcbiIp
Ow0KICBmcHJpbnRmKGZwLCIgIEdfX0NsYXNzSW5mbyBnbG9iYWxzY29wZTsg
Ly8gSU5URVJQUkVURURGVU5DXG4iKTsNCiAgZnByaW50ZihmcCwiICBHX19D
YWxsRnVuYyBmdW5jOyAvLyBJTlRFUlBSRVRFREZVTkMsIENPTVBJTEVESU5U
RVJGQUNFTUVUSE9ELCBCWVRFQ09ERUZVTkNcbiIpOw0KICBmcHJpbnRmKGZw
LCIgIFxuIik7DQogIGZwcmludGYoZnAsIiAgLy8gIyBUaGVuIGV4ZWN1dGUg
dGhlIGxvb3AuIFxuIik7DQogIGZwcmludGYoZnAsIiAgc3dpdGNoKEdfX2lz
aW50ZXJwcmV0ZWRwMmYoKCh2b2lkKilhbmFseXNpcykpKSB7XG4iKTsNCiAg
ZnByaW50ZihmcCwiICAgIC8vICMgdXNpbmcgZnVuY3Rpb24gY2FsbCBhcyBz
dHJpbmcgXG4iKTsNCiAgZnByaW50ZihmcCwiICBjYXNlIEdfX0lOVEVSUFJF
VEVERlVOQzpcbiIpOw0KICBmcHJpbnRmKGZwLCIgICAgc3ByaW50Zih0ZW1w
LFwiKCVzICopJSVwXCIsKHZvaWQqKXRoaXMpO1xuIixjbGFzc25hbWUpOw0K
ICBmcHJpbnRmKGZwLCIgICAgZnVuYy5TZXRGdW5jKCZnbG9iYWxzY29wZSwo
Y2hhciopYW5hbHlzaXMsdGVtcCwmb2Zmc2V0KTtcbiIpOw0KICBmcHJpbnRm
KGZwLCIgICAgZm9yIChJbnRfdCBpPTA7IGk8bmVudHJpZXM7IGkrKykge1xu
Iik7DQogIGZwcmludGYoZnAsIiAgICAgIGllbnRyaWVzICs9IEdldEVudHJ5
KGkpO1xuIik7DQogIGZwcmludGYoZnAsIiAgICAgIGlmIChmdW5jLkV4ZWNJ
bnQoKHZvaWQqKU5VTEwpKSBicmVhaztcbiIpOw0KICBmcHJpbnRmKGZwLCIg
ICAgfVxuIik7DQogIGZwcmludGYoZnAsIiAgICBicmVhaztcbiIpOw0KICBm
cHJpbnRmKGZwLCIgICAgLy8gIyB1c2luZyBpbnRlcmZhY2UgbWV0aG9kIFxu
Iik7DQogIGZwcmludGYoZnAsIiAgY2FzZSBHX19DT01QSUxFRElOVEVSRkFD
RU1FVEhPRDpcbiIpOw0KICBmcHJpbnRmKGZwLCIgICAgZnVuYy5TZXRGdW5j
KChHX19JbnRlcmZhY2VNZXRob2QpYW5hbHlzaXMpO1xuIik7DQogIGZwcmlu
dGYoZnAsIiAgICBmdW5jLlNldEFyZygoKGxvbmcpdGhpcykpO1xuIik7DQog
IGZwcmludGYoZnAsIiAgICBmb3IgKEludF90IGk9MDsgaTxuZW50cmllczsg
aSsrKSB7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgICAgaWVudHJpZXMgKz0g
R2V0RW50cnkoaSk7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgICAgaWYgKGZ1
bmMuRXhlY0ludCgodm9pZCopTlVMTCkpIGJyZWFrO1xuIik7DQogIGZwcmlu
dGYoZnAsIiAgICB9XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIGJyZWFrO1xu
Iik7DQogIGZwcmludGYoZnAsIiAgICAvLyAjIGJ5dGVjb2RlIHZlcnNpb24g
b2YgaW50ZXJwcmV0ZWQgZnVuYyBcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGNh
c2UgR19fQllURUNPREVGVU5DOlxuIik7DQogIGZwcmludGYoZnAsIiAgICBm
dW5jLlNldEJ5dGVjb2RlKChzdHJ1Y3QgR19fYnl0ZWNvZGVmdW5jKilhbmFs
eXNpcyk7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIGZ1bmMuU2V0QXJnKCgo
bG9uZyl0aGlzKSk7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIGZvciAoSW50
X3QgaT0wOyBpPG5lbnRyaWVzOyBpKyspIHtcbiIpOw0KICBmcHJpbnRmKGZw
LCIgICAgICBpZW50cmllcyArPSBHZXRFbnRyeShpKTtcbiIpOw0KICBmcHJp
bnRmKGZwLCIgICAgICBpZiAoZnVuYy5FeGVjSW50KCh2b2lkKilOVUxMKSkg
YnJlYWs7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIH1cbiIpOw0KICBmcHJp
bnRmKGZwLCIgICAgYnJlYWs7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIC8v
ICMgdXNpbmcgdHJ1ZSBwb2ludGVyIHRvIGZ1bmN0aW9uIFxuIik7DQogIGZw
cmludGYoZnAsIiAgY2FzZSBHX19DT01QSUxFRFRSVUVGVU5DOlxuIik7DQog
IGZwcmludGYoZnAsIiAgICAvLyAjIHBvaW50ZXIgbm90IGluIENJTlQgZ2xv
YmFsIGZ1bmN0aW9uIHRhYmxlIFxuIik7DQogIGZwcmludGYoZnAsIiAgY2Fz
ZSBHX19VTktOT1dORlVOQzpcbiIpOw0KICBmcHJpbnRmKGZwLCIgICAgZm9y
IChJbnRfdCBpPTA7IGk8bmVudHJpZXM7IGkrKykge1xuIik7DQogIGZwcmlu
dGYoZnAsIiAgICAgIGllbnRyaWVzICs9IEdldEVudHJ5KGkpO1xuIik7DQog
IGZwcmludGYoZnAsIiAgICAgIGlmICgoKmFuYWx5c2lzKSh0aGlzKSkgYnJl
YWs7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIH1cbiIpOw0KICBmcHJpbnRm
KGZwLCIgICAgYnJlYWs7XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIC8vICMg
dGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICggdW5rbm93biBraW5kIG9mIHBv
aW50ZXIgKSBcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGRlZmF1bHQ6XG4iKTsN
CiAgZnByaW50ZihmcCwiICAgIGNlcnIgPDwgXCJFcnJvciA6IFVua25vd24g
a2luZCBvZiBwb2ludGVyIHRvIGZ1bmN0aW9uXCIgPDwgZW5kbDtcbiIpOw0K
ICBmcHJpbnRmKGZwLCIgICAgYnJlYWs7XG4iKTsNCiAgZnByaW50ZihmcCwi
ICB9XG4iKTsNCiAgZnByaW50ZihmcCwiICBcbiIpOw0KICBmcHJpbnRmKGZw
LCIgIC8vICMgVGhpcyBpcyB0aGUgZW50cnkgbG9vcCBpbiBpbnRlcnByZXRl
ZCBjb2RlLiBcbiIpOw0KICBmcHJpbnRmKGZwLCIjZWxzZVxuIik7DQogIGZw
cmludGYoZnAsIiAgXG4iKTsNCiAgZnByaW50ZihmcCwiICAvLyAjIGN1cnJl
bnQgQ0lOVCBjYW5ub3QgZGVhbCB3aXRoIHRoaXMgXG4iKTsNCiAgZnByaW50
ZihmcCwiI2lmIDBcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGZvciAoSW50X3Qg
aT0wOyBpPG5lbnRyaWVzOyBpKyspIHtcbiIpOw0KICBmcHJpbnRmKGZwLCIg
ICAgaWVudHJpZXMgKz0gR2V0RW50cnkoaSk7XG4iKTsNCiAgZnByaW50Zihm
cCwiICAgIGlmICgoKmFuYWx5c2lzKSh0aGlzKSkgYnJlYWs7IC8vIGN1cnJl
bnQgQ0lOVCBjYW5ub3QgZGVhbCB3aXRoIGl0XG4iKTsNCiAgZnByaW50Zihm
cCwiICB9XG4iKTsNCiAgZnByaW50ZihmcCwiICAvLyAjIHNvIHdlIG5lZWQg
dG8gdXNlIHRoaXMgXG4iKTsNCiAgZnByaW50ZihmcCwiI2Vsc2VcbiIpOw0K
ICBmcHJpbnRmKGZwLCIgIEludF90IHJlc3VsdDtcbiIpOw0KICBmcHJpbnRm
KGZwLCIgIGZvciAoSW50X3QgaT0wOyBpPG5lbnRyaWVzOyBpKyspIHtcbiIp
Ow0KICBmcHJpbnRmKGZwLCIgICAgaWVudHJpZXMgKz0gR2V0RW50cnkoaSk7
XG4iKTsNCiAgZnByaW50ZihmcCwiICAgIHJlc3VsdCA9ICgqYW5hbHlzaXMp
KHRoaXMpO1xuIik7DQogIGZwcmludGYoZnAsIiAgICBpZiAocmVzdWx0KSBi
cmVhaztcbiIpOw0KICBmcHJpbnRmKGZwLCIgIH1cbiIpOw0KICBmcHJpbnRm
KGZwLCIjZW5kaWZcbiIpOw0KICBmcHJpbnRmKGZwLCIgIFxuIik7DQogIGZw
cmludGYoZnAsIiNlbmRpZlxuIik7DQogIGZwcmludGYoZnAsIiAgXG4iKTsN
CiAgZnByaW50ZihmcCwiICAvLyAjIFdlIGFyZSBkb25lLCByZXR1cm4uIFxu
Iik7DQogIGZwcmludGYoZnAsIiAgcmV0dXJuIGllbnRyaWVzO1xuIik7DQog
IGZwcmludGYoZnAsIn1cbiIpOw0KICBmcHJpbnRmKGZwLCJcbiIpOw0KICAN
CiAgLy8gIyBHZW5lcmF0ZSBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gU2hvdyhJ
bnRfdCBlbnRyeSkgDQogIGZwcmludGYoZnAsIi8vICMgdm9pZCAlczo6U2hv
dyhJbnRfdCBlbnRyeSkgXG4iLGNsYXNzbmFtZSk7DQogIGZwcmludGYoZnAs
InZvaWQgJXM6OlNob3coSW50X3QgZW50cnkpXG4iLGNsYXNzbmFtZSk7DQog
IGZwcmludGYoZnAsIntcbiIpOw0KICBmcHJpbnRmKGZwLCIgIC8vICMgUHJp
bnQgY29udGVudHMgb2YgZW50cnkgKCBhbGwgYnJhbmNoZXMgKS4gXG4iKTsN
CiAgZnByaW50ZihmcCwiICAvLyAjIElmIGVudHJ5IGlzIG5vdCBzcGVjaWZp
ZWQsIHByaW50IGN1cnJlbnQgZW50cnkuIFxuIik7DQogIGZwcmludGYoZnAs
IiAgaWYgKCFmVHJlZSkgcmV0dXJuO1xuIik7DQogIGZwcmludGYoZnAsIiAg
aWYgKGVudHJ5Pj0wKSBmRW50cnkgPSBlbnRyeTsgZWxzZSBlbnRyeSA9IGZF
bnRyeTtcbiIpOw0KICBmcHJpbnRmKGZwLCIgIGlmIChmRW50cnk8MCkgcmV0
dXJuO1xuIik7DQogIGZwcmludGYoZnAsIiAgLy8gIyBTZXQgYnJhbmNoIHN0
YXR1c2VzIHRvIDEuIFxuIik7DQogIGZwcmludGYoZnAsIiAgZlRyZWUtPlNl
dEJyYW5jaFN0YXR1cyhcIipcIiwxKTsgLy8gZW5hYmxlIGFsbCBicmFuY2hl
c1xuIik7DQogIGZvciAobD0wO2w8bmxlYXZlcztsKyspIHsNCiAgICBpZiAo
bGVhZlN0YXR1c1tsXSkgY29udGludWU7DQogICAgVExlYWYgKmxlYWYgPSAo
VExlYWYqKWxlYXZlcy0+VW5jaGVja2VkQXQobCk7DQogICAgVEJyYW5jaCAq
YnJhbmNoID0gbGVhZi0+R2V0QnJhbmNoKCk7DQogICAgc3RyY3B5KGJyYW5j
aG5hbWUsYnJhbmNoLT5HZXROYW1lKCkpOw0KICAgIGJuYW1lID0gc3Ryc3Ry
KGJyYW5jaG5hbWUsIlsiKTsNCiAgICBpZiAoYm5hbWUpICpibmFtZSA9IDA7
DQogICAgYm5hbWUgPSBicmFuY2huYW1lOw0KICAgIHdoaWxlICgqYm5hbWUp
IHtpZiAoKmJuYW1lID09ICcuJykgKmJuYW1lPSdfJzsgYm5hbWUrKzt9DQog
ICAgaWYgKChicmFuY2gtPklzQSgpID09IFRCcmFuY2hPYmplY3Q6OkNsYXNz
KCkpICYmDQoJKGJyYW5jaC0+R2V0TGlzdE9mQnJhbmNoZXMoKS0+R2V0RW50
cmllc0Zhc3QoKSkpIHsNCiAgICAgIGZwcmludGYoZnAsIiAgSXNSZWFkXyVz
ID0gMDtcbiIsYnJhbmNobmFtZSk7DQogICAgICBmcHJpbnRmKGZwLCIgIGZU
cmVlLT5TZXRCcmFuY2hTdGF0dXMoXCIlc1wiLDApOyAvLyBkaXNhYmxlIHRo
aXMgYnJhbmNoXG4iLGJyYW5jaC0+R2V0TmFtZSgpKTsNCiAgICB9IGVsc2Ug
ZnByaW50ZihmcCwiICBJc1JlYWRfJXMgPSAxO1xuIixicmFuY2huYW1lKTsN
CiAgfQ0KICBmcHJpbnRmKGZwLCIgIC8vICMgU2hvdyBlbnRyeS4gXG4iKTsN
CiAgZnByaW50ZihmcCwiICBmVHJlZS0+U2hvdyhmRW50cnkpO1xuIik7DQog
IGZwcmludGYoZnAsIn1cbiIpOw0KICBmcHJpbnRmKGZwLCJcbiIpOw0KICAN
CiAgZnByaW50ZihmcCwiI2VuZGlmXG4iKTsNCiAgZnByaW50ZihmcCwiXG4i
KTsNCiAgZnByaW50ZihmcCwiLy8gIyBFbmQgb2YgZmlsZSAlcyBcbiIsdGhl
YWQpOw0KICANCiAgLy8gIyAqKiogR2VuZXJhdGUgY2xhc3NuYW1lLmN4eCAq
KiogDQogIC8vICMgUHJpbnQgdGhlIGhlYWRlciANCiAgZnByaW50ZihmcGMs
Ii8vICMgSW5jbHVkZSB0aGUgJXMgY2xhc3MgaW50ZXJmYWNlIHNwZWNpZmlj
YXRpb24uIFxuIixjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZwYywiI2lmbmRl
ZiAlc19jeHhcbiIsY2xhc3NuYW1lKTsNCiAgZnByaW50ZihmcGMsIiNkZWZp
bmUgJXNfY3h4XG4iLGNsYXNzbmFtZSk7DQogIGZwcmludGYoZnBjLCIjZW5k
aWZcbiIpOw0KICBmcHJpbnRmKGZwYywiI2luY2x1ZGUgXCIlc1wiXG4iLHRo
ZWFkKTsNCiAgZnByaW50ZihmcGMsIiN1bmRlZiAlc19jeHhcbiIsY2xhc3Nu
YW1lKTsNCiAgZnByaW50ZihmcGMsIlxuIik7DQogIGZwcmludGYoZnBjLCIv
LyAjIFBsYWNlIGhlcmUgYWxsIFJPT1QgcmVsYXRlZCBpbmNsdWRlcyB0aGF0
IHlvdSBuZWVkLiBcbiIpOw0KICBmcHJpbnRmKGZwYywiI2lmbmRlZiBfX0NJ
TlRfX1xuXG4iKTsNCiAgZnByaW50ZihmcGMsIiNlbmRpZlxuIik7DQogIGZw
cmludGYoZnBjLCJcbiIpOw0KICANCiAgLy8gIyBHZW5lcmF0ZSBjbGFzcyBt
ZW1iZXIgZnVuY3Rpb24gTG9vcCgpIA0KICBmcHJpbnRmKGZwYywiLy8gIyBJ
bnRfdCAlczo6TG9vcCgpIFxuIixjbGFzc25hbWUpOw0KICBmcHJpbnRmKGZw
YywiSW50X3QgJXM6Okxvb3AoKVxuIixjbGFzc25hbWUpOw0KICBmcHJpbnRm
KGZwYywie1xuIik7DQogIC8vIGZwcmludGYoZnBjLCIgIGlmICghZlRyZWUp
IHJldHVybjtcbiAgXG4iKTsNCiAgZnByaW50ZihmcGMsIiAgLy8gIyBMb2Nh
bCB2YXJpYWJsZXMuIFxuIik7DQogIGZwcmludGYoZnBjLCIgIFN0YXRfdCBu
ZW50cmllcyA9IEdldEVudHJpZXMoKTsgLy8gTnVtYmVyIG9mIGVudHJpZXMg
aW4gdGhlIFRyZWUuXG4iKTsNCiAgZnByaW50ZihmcGMsIiAgSW50X3QgaWVu
dHJpZXMgPSAwOyAvLyBIb3cgbWFueSBlbnRyaWVzIHdlcmUgYW5hbHlzZWQu
XG4iKTsNCiAgZnByaW50ZihmcGMsIiAgXG4iKTsNCiAgZnByaW50ZihmcGMs
IiAgLy8gIyBUaGlzIGlzIHRoZSBsb29wIHNrZWxldG9uLiBcbiIpOw0KICBm
cHJpbnRmKGZwYywiICBmb3IgKEludF90IGk9MDsgaTxuZW50cmllczsgaSsr
KSB7XG4iKTsNCiAgZnByaW50ZihmcGMsIiAgICBpZW50cmllcyArPSBHZXRF
bnRyeShpKTtcbiIpOw0KICBmcHJpbnRmKGZwYywiICAgIFxuIik7DQogIGZw
cmludGYoZnBjLCIgIH1cbiIpOw0KICBmcHJpbnRmKGZwYywiICBcbiIpOw0K
ICBmcHJpbnRmKGZwYywiICAvLyAjIFdlIGFyZSBkb25lLCByZXR1cm4uIFxu
Iik7DQogIGZwcmludGYoZnBjLCIgIHJldHVybiBpZW50cmllcztcbiIpOw0K
ICBmcHJpbnRmKGZwYywifVxuIik7DQogIGZwcmludGYoZnBjLCJcbiIpOw0K
ICBmcHJpbnRmKGZwYywiLy8gIyBFbmQgb2YgZmlsZSAlcyBcbiIsdGNpbXAp
Ow0KICANCiAgLy8gIyBXZSBhcmUgZG9uZSANCiAgcHJpbnRmKCJGaWxlczog
JXMgYW5kICVzIGdlbmVyYXRlZCBmcm9tIFRyZWU6ICVzXG4iLHRoZWFkLHRj
aW1wLHQtPkdldE5hbWUoKSk7DQogIGRlbGV0ZSBbXSB0aGVhZDsNCiAgZGVs
ZXRlIFtdIHRjaW1wOw0KICBkZWxldGUgW10gdHJlZWZpbGU7DQogIGZjbG9z
ZShmcCk7DQogIGZjbG9zZShmcGMpOw0KICANCiAgcmV0dXJuIDA7DQp9DQoN
Ci8vICMgRW5kIG9mIGZpbGUgTWFrZUNsYXNzLmN4eCANCg==
---559023410-851401618-929437249=:18708--