[XML-SIG] Fwd: Re: bug in c14n.py

Joseph Reagle reagle@w3.org
Fri, 26 Apr 2002 17:28:35 -0400


--------------Boundary-00=_NB2774YQWHPCTZZJZ5GY
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 8bit


I've fixed the bug I reported below. I've also attached the test files and 
expected results in a zip file (in the tests subdirectory) from Gregor that 
led me to find these recent bugs. I started incorporating them into the 
test_c14n set (e.g., re_iaik2.xml.b64 is iaik2.xml example using exc-c14n 
encoded in base64) however I found it awkward, starting writing some code 
to run the tests from the files and ran out of time.) So no progress on 
that front. I'd like to finish that (makes fixing future bugs much 
easier!), but now that I have these bugs out of the way I have a few other 
python projects I've been meaning to get to...

(Also, no guarantees that my tweaks aren't verbose or inefficient! <smile/>)

----------  Forwarded Message  ----------

Subject: Re: bug in c14n.py
Date: Wed, 17 Apr 2002 15:18:19 -0400
From: Joseph Reagle <reagle@w3.org>
To: Rich Salz <r.salz@verizon.net>
Cc: xml-sig@python.org

I include a c14n.py that fixes the bug that I speak of below, and a
test_c14n.py that has a more consistent treatment of the "withComments"
option, and also permits additional prefixes to be passed as a command line
parameter under exclusive canonicalization.

However, I also discovered a bug from Gregor's example 1 [a]. Presently,
c14n.py does the following:
1. takes any xml_attrs (e.g., xml:lang) from previous recursions not
rendered and adds them to local xml_attrs.
2. if the element we are processing is in the subset, it renders the
accumulated xml_attrs as part of that element and and resets xml_attrs=[]
3. it recurses.

This has the effect of rendering all XML attributes that are "in affect"
since the last ancestor was rendered. Sounds sensible, but it's not correct
according to the the spec [b]. To fix this, I think we'd have to test
whether the immediate parent was in the nodeset and keep a dictionary
(instead of a list) of *all* ancestors' xml:foo attributes (not just since
the nearest rendered one), with the *nearest* value. (Moving from a list to
a dictionary is akin to what I did for the namespace bug.) This bug exists
on in c14n, not exc-c14n.

[a]
http://lists.w3.org/Archives/Public/w3c-ietf-xmldsig/2002JanMar/0259.html
[b] http://www.w3.org/TR/2001/REC-xml-c14n-20010315
"The processing of an element node E MUST be modified slightly when an
XPath node-set is given as input and the element's parent is omitted from
the node-set. The method for processing the attribute axis of an element E
in the node-set is enhanced. All element nodes along E's ancestor axis are
examined for nearest occurrences of attributes in the xml namespace, such
as xml:lang and xml:space (whether or not they are in the node-set). From
this list of attributes, remove any that are in E's attribute axis (whether
or not they are in the node-set)."

--------------Boundary-00=_NB2774YQWHPCTZZJZ5GY
Content-Type: application/x-zip;
  name="c14n.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="c14n.zip"

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
AAA=

--------------Boundary-00=_NB2774YQWHPCTZZJZ5GY
Content-Type: text/html;
  charset="iso-8859-1";
  name="test_c14n.py"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="test_c14n.py"

IyEgL3Vzci9iaW4vZW52IHB5dGhvbgoKIyBUaGUgc2V2ZW4gZXhhbXBsZXMgZnJvbSB0aGUgQ2Fu
b25pY2FsIFhNTCBzcGVjLgojIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRu
LTIwMDEwMzE1Cgp0cnk6CiAgICB1ID0gdW5pY29kZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVm
IHUoeCk6cmV0dXJuIHgKCmVnMSA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCI/PgoKPD94bWwtc3R5
bGVzaGVldCAgIGhyZWY9ImRvYy54c2wiCiAgIHR5cGU9InRleHQveHNsIiAgID8+Cgo8IURPQ1RZ
UEUgZG9jIFNZU1RFTSAiZG9jLmR0ZCI+Cgo8ZG9jPkhlbGxvLCB3b3JsZCE8IS0tIENvbW1lbnQg
MQotLT48L2RvYz4KCjw/cGktd2l0aG91dC1kYXRhICAgICA/PgoKPCEtLSBDb21tZW50IDIgLS0+
Cgo8IS0tIENvbW1lbnQgMyAtLT4KIiIiCgplZzIgPSAiIiI8ZG9jPgogICA8Y2xlYW4+ICAgPC9j
bGVhbj4KICAgPGRpcnR5PiAgIEEgICBCICAgPC9kaXJ0eT4KICAgPG1peGVkPgogICAgICBBCiAg
ICAgIDxjbGVhbj4gICA8L2NsZWFuPgogICAgICBCCiAgICAgIDxkaXJ0eT4gICBBICAgQiAgIDwv
ZGlydHk+CiAgICAgIEMKICAgPC9taXhlZD4KPC9kb2M+CiIiIgoKZWczID0gIiIiPCFET0NUWVBF
IGRvYyBbPCFBVFRMSVNUIGU5IGF0dHIgQ0RBVEEgImRlZmF1bHQiPl0+Cjxkb2M+CiAgIDxlMSAg
IC8+CiAgIDxlMiAgID48L2UyPgogICA8ZTMgICAgbmFtZSA9ICJlbGVtMyIgICBpZD0iZWxlbTMi
ICAgIC8+CiAgIDxlNCAgICBuYW1lPSJlbGVtNCIgICBpZD0iZWxlbTQiICAgID48L2U0PgogICA8
ZTUgYTphdHRyPSJvdXQiIGI6YXR0cj0ic29ydGVkIiBhdHRyMj0iYWxsIiBhdHRyPSJJJ20iCiAg
ICAgICB4bWxuczpiPSJodHRwOi8vd3d3LmlldGYub3JnIgogICAgICAgeG1sbnM6YT0iaHR0cDov
L3d3dy53My5vcmciCiAgICAgICB4bWxucz0iaHR0cDovL2V4YW1wbGUub3JnIi8+CiAgIDxlNiB4
bWxucz0iIiB4bWxuczphPSJodHRwOi8vd3d3LnczLm9yZyI+CiAgICAgICA8ZTcgeG1sbnM9Imh0
dHA6Ly93d3cuaWV0Zi5vcmciPgogICAgICAgICAgIDxlOCB4bWxucz0iIiB4bWxuczphPSJodHRw
Oi8vd3d3LnczLm9yZyI+CiAgICAgICAgICAgICAgIDxlOSB4bWxucz0iIiB4bWxuczphPSJodHRw
Oi8vd3d3LmlldGYub3JnIi8+CiAgICAgICAgICAgPC9lOD4KICAgICAgIDwvZTc+CiAgIDwvZTY+
CjwvZG9jPgoiIiIKCmVnMyA9ICIiIjwhRE9DVFlQRSBkb2MgWzwhQVRUTElTVCBlOSBhdHRyIENE
QVRBICJkZWZhdWx0Ij5dPgo8ZG9jIHhtbG5zOmZvbz0iaHR0cDovL3d3dy5iYXIub3JnIj4KICAg
PGUxICAgLz4KICAgPGUyICAgPjwvZTI+CiAgIDxlMyAgICBuYW1lID0gImVsZW0zIiAgIGlkPSJl
bGVtMyIgICAgLz4KICAgPGU0ICAgIG5hbWU9ImVsZW00IiAgIGlkPSJlbGVtNCIgICAgPjwvZTQ+
CiAgIDxlNSBhOmF0dHI9Im91dCIgYjphdHRyPSJzb3J0ZWQiIGF0dHIyPSJhbGwiIGF0dHI9Ikkn
bSIKICAgICAgIHhtbG5zOmI9Imh0dHA6Ly93d3cuaWV0Zi5vcmciCiAgICAgICB4bWxuczphPSJo
dHRwOi8vd3d3LnczLm9yZyIKICAgICAgIHhtbG5zPSJodHRwOi8vZXhhbXBsZS5vcmciLz4KICAg
PGU2IHhtbG5zPSIiIHhtbG5zOmE9Imh0dHA6Ly93d3cudzMub3JnIj4KICAgICAgIDxlNyB4bWxu
cz0iaHR0cDovL3d3dy5pZXRmLm9yZyI+CiAgICAgICAgICAgPGU4IHhtbG5zPSIiIHhtbG5zOmE9
Imh0dHA6Ly93d3cudzMub3JnIiBhOmZvbz0iYmFyIj4KICAgICAgICAgICAgICAgPGU5IHhtbG5z
PSIiIHhtbG5zOmE9Imh0dHA6Ly93d3cuaWV0Zi5vcmciLz4KICAgICAgICAgICA8L2U4PgogICAg
ICAgPC9lNz4KICAgPC9lNj4KPC9kb2M+CiIiIgoKZWc0ID0gIiIiPCFET0NUWVBFIGRvYyBbIDwh
QVRUTElTVCBub3JtSWQgaWQgSUQgI0lNUExJRUQ+IDwhQVRUTElTVCBub3JtTmFtZXMgYXR0ciBO
TVRPS0VOUyAjSU1QTElFRD4gXT4gPGRvYz4KICAgPHRleHQ+Rmlyc3QgbGluZSYjeDBkOyYjMTA7
U2Vjb25kIGxpbmU8L3RleHQ+CiAgIDx2YWx1ZT4mI3gzMjs8L3ZhbHVlPgogICA8Y29tcHV0ZT48
IVtDREFUQVt2YWx1ZT4iMCIgJiYgdmFsdWU8IjEwIiA/InZhbGlkIjoiZXJyb3IiXV0+PC9jb21w
dXRlPgogICA8Y29tcHV0ZSBleHByPSd2YWx1ZT4iMCIgJmFtcDsmYW1wOyB2YWx1ZSZsdDsiMTAi
ID8idmFsaWQiOiJlcnJvciInPnZhbGlkPC9jb21wdXRlPgogICA8bm9ybSBhdHRyPScgJmFwb3M7
ICAgJiN4MjA7JiMxMzsmI3hhOyYjOTsgICAmYXBvczsgJy8+CiAgIDxub3JtTmFtZXMgYXR0cj0n
ICAgQSAgICYjeDIwOyYjMTM7JiN4YTsmIzk7ICAgQiAgICcvPgogICA8bm9ybUlkIGlkPScgJmFw
b3M7ICAgJiN4MjA7JiMxMzsmI3hhOyYjOTsgICAmYXBvczsgJy8+CjwvZG9jPiIiIgoKZWc1ID0g
IiIiPCFET0NUWVBFIGRvYyBbCjwhQVRUTElTVCBkb2MgYXR0ckV4dEVudCBFTlRJVFkgI0lNUExJ
RUQ+CjwhRU5USVRZIGVudDEgIkhlbGxvIj4KPCFFTlRJVFkgZW50MiBTWVNURU0gIndvcmxkLnR4
dCI+CjwhRU5USVRZIGVudEV4dCBTWVNURU0gImVhcnRoLmdpZiIgTkRBVEEgZ2lmPgo8IU5PVEFU
SU9OIGdpZiBTWVNURU0gInZpZXdnaWYuZXhlIj4KXT4KPGRvYyBhdHRyRXh0RW50PSJlbnRFeHQi
PgogICAmZW50MTssICZlbnQyOyEKPC9kb2M+Cgo8IS0tIExldCB3b3JsZC50eHQgY29udGFpbiAi
d29ybGQiIChleGNsdWRpbmcgdGhlIHF1b3RlcykgLS0+CiIiIgoKZWc2ID0gIiIiPD94bWwgdmVy
c2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8ZG9jPiYjMTY5OzwvZG9jPiIiIgoK
ZWc3ID0gIiIiPCFET0NUWVBFIGRvYyBbCjwhQVRUTElTVCBlMiB4bWw6c3BhY2UgKGRlZmF1bHR8
cHJlc2VydmUpICdwcmVzZXJ2ZSc+CjwhQVRUTElTVCBlMyBpZCBJRCAjSU1QTElFRD4KXT4KPGRv
YyB4bWxucz0iaHR0cDovL3d3dy5pZXRmLm9yZyIgeG1sbnM6dzNjPSJodHRwOi8vd3d3LnczLm9y
ZyI+CiAgIDxlMT4KICAgICAgPGUyIHhtbG5zPSIiPgogICAgICAgICA8ZTMgaWQ9IkUzIi8+CiAg
ICAgIDwvZTI+CiAgIDwvZTE+CjwvZG9jPiIiIgoKZXhhbXBsZXMgPSBbIGVnMSwgZWcyLCBlZzMs
IGVnNCwgZWc1LCBlZzYsIGVnN10KdGVzdF9yZXN1bHRzID0gewogICAgZWcxOiAnJydQRDk0Yld3
dGMzUjViR1Z6YUdWbGRDQm9jbVZtUFNKa2IyTXVlSE5zSWdvZ0lDQjBlWEJsUFNKMFpYaDBMM2h6
CiAgICBiQ0lnSUNBL1BnbzhaRzlqUGtobGJHeHZMQ0IzYjNKc1pDRThJUzB0SUVOdmJXMWxiblFn
TVFvdExUNDhMMlJ2CiAgICBZejRLUEQ5d2FTMTNhWFJvYjNWMExXUmhkR0UvUGdvOElTMHRJRU52
YlcxbGJuUWdNaUF0TFQ0S1BDRXRMU0JECiAgICBiMjF0Wlc1MElETWdMUzArJycnLAoKICAgIGVn
MjogJycnUEdSdll6NEtJQ0FnUEdOc1pXRnVQaUFnSUR3dlkyeGxZVzQrQ2lBZ0lEeGthWEowZVQ0
Z0lDQkJJQ0FnUWlBZwogICAgSUR3dlpHbHlkSGsrQ2lBZ0lEeHRhWGhsWkQ0S0lDQWdJQ0FnUVFv
Z0lDQWdJQ0E4WTJ4bFlXNCtJQ0FnUEM5agogICAgYkdWaGJqNEtJQ0FnSUNBZ1Fnb2dJQ0FnSUNB
OFpHbHlkSGsrSUNBZ1FTQWdJRUlnSUNBOEwyUnBjblI1UGdvZwogICAgSUNBZ0lDQkRDaUFnSUR3
dmJXbDRaV1ErQ2p3dlpHOWpQZz09JycnLAoKICAgIGVnMzogJycnUEdSdll5QjRiV3h1Y3pwbWIy
ODlJbWgwZEhBNkx5OTNkM2N1WW1GeUxtOXlaeUkrQ2lBZ0lEeGxNVDQ4TDJVeAogICAgUGdvZ0lD
QThaVEkrUEM5bE1qNEtJQ0FnUEdVeklHbGtQU0psYkdWdE15SWdibUZ0WlQwaVpXeGxiVE1pUGp3
dgogICAgWlRNK0NpQWdJRHhsTkNCcFpEMGlaV3hsYlRRaUlHNWhiV1U5SW1Wc1pXMDBJajQ4TDJV
MFBnb2dJQ0E4WlRVZwogICAgZUcxc2JuTTlJbWgwZEhBNkx5OWxlR0Z0Y0d4bExtOXlaeUlnZUcx
c2JuTTZZVDBpYUhSMGNEb3ZMM2QzZHk1MwogICAgTXk1dmNtY2lJSGh0Ykc1ek9tSTlJbWgwZEhB
Nkx5OTNkM2N1YVdWMFppNXZjbWNpSUdGMGRISTlJa2tuYlNJZwogICAgWVhSMGNqSTlJbUZzYkNJ
Z1lqcGhkSFJ5UFNKemIzSjBaV1FpSUdFNllYUjBjajBpYjNWMElqNDhMMlUxUGdvZwogICAgSUNB
OFpUWWdlRzFzYm5NNllUMGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY2lQZ29nSUNBZ0lDQWdQR1Uz
SUhodAogICAgYkc1elBTSm9kSFJ3T2k4dmQzZDNMbWxsZEdZdWIzSm5JajRLSUNBZ0lDQWdJQ0Fn
SUNBOFpUZ2dlRzFzYm5NOQogICAgSWlJZ1lUcG1iMjg5SW1KaGNpSStDaUFnSUNBZ0lDQWdJQ0Fn
SUNBZ0lEeGxPU0I0Yld4dWN6cGhQU0pvZEhSdwogICAgT2k4dmQzZDNMbWxsZEdZdWIzSm5JaUJo
ZEhSeVBTSmtaV1poZFd4MElqNDhMMlU1UGdvZ0lDQWdJQ0FnSUNBZwogICAgSUR3dlpUZytDaUFn
SUNBZ0lDQThMMlUzUGdvZ0lDQThMMlUyUGdvOEwyUnZZejQ9JycnLAoKICAgIGVnNDogJycnUEdS
dll6NEtJQ0FnUEhSbGVIUStSbWx5YzNRZ2JHbHVaU1lqZUVRN0NsTmxZMjl1WkNCc2FXNWxQQzkw
WlhoMAogICAgUGdvZ0lDQThkbUZzZFdVK01qd3ZkbUZzZFdVK0NpQWdJRHhqYjIxd2RYUmxQblpo
YkhWbEptZDBPeUl3SWlBbQogICAgWVcxd095WmhiWEE3SUhaaGJIVmxKbXgwT3lJeE1DSWdQeUoy
WVd4cFpDSTZJbVZ5Y205eUlqd3ZZMjl0Y0hWMAogICAgWlQ0S0lDQWdQR052YlhCMWRHVWdaWGh3
Y2owaWRtRnNkV1UrSm5GMWIzUTdNQ1p4ZFc5ME95QW1ZVzF3T3laaAogICAgYlhBN0lIWmhiSFZs
Sm14ME95WnhkVzkwT3pFd0puRjFiM1E3SUQ4bWNYVnZkRHQyWVd4cFpDWnhkVzkwT3pvbQogICAg
Y1hWdmREdGxjbkp2Y2laeGRXOTBPeUkrZG1Gc2FXUThMMk52YlhCMWRHVStDaUFnSUR4dWIzSnRJ
R0YwZEhJOQogICAgSWlBbklDQWdJQ1lqZUVRbUkzaEJKaU40T1NBZ0lDY2dJajQ4TDI1dmNtMCtD
aUFnSUR4dWIzSnRUbUZ0WlhNZwogICAgWVhSMGNqMGlRU0FtSTNoRUppTjRRU1lqZURrZ1FpSStQ
Qzl1YjNKdFRtRnRaWE0rQ2lBZ0lEeHViM0p0U1dRZwogICAgYVdROUlpY2dKaU40UkNZamVFRW1J
M2c1SUNjaVBqd3ZibTl5YlVsa1BnbzhMMlJ2WXo0PScnJywKCiAgICBlZzU6ICcnJ1BHUnZZeUJo
ZEhSeVJYaDBSVzUwUFNKbGJuUkZlSFFpUGdvZ0lDQklaV3hzYnl3Z2QyOXliR1FoQ2p3dlpHOWoK
ICAgIFBnPT0nJycsCgogICAgZWc2OiAnJydQR1J2WXo3Q3FUd3ZaRzlqUGc9PScnJywKCiAgICBl
Zzc6ICcnJ1BHUnZZeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTVwWlhSbUxtOXlaeUlnZUcxc2Ju
TTZkek5qUFNKb2RIUncKICAgIE9pOHZkM2QzTG5jekxtOXlaeUkrQ2lBZ0lEeGxNVDRLSUNBZ0lD
QWdQR1V5SUhodGJHNXpQU0lpSUhodGJEcHoKICAgIGNHRmpaVDBpY0hKbGMyVnlkbVVpUGdvZ0lD
QWdJQ0FnSUNBOFpUTWdhV1E5SWtVeklqNDhMMlV6UGdvZ0lDQWcKICAgIElDQThMMlV5UGdvZ0lD
QThMMlV4UGdvOEwyUnZZejQ9JycnLAoKfQoKIyBMb2FkIFhQYXRoIGFuZCBQYXJzZXIKaW1wb3J0
IHN5cywgdHlwZXMsIHRyYWNlYmFjaywgU3RyaW5nSU8sIGJhc2U2NCwgc3RyaW5nCmZyb20geG1s
IGltcG9ydCB4cGF0aApmcm9tIHhtbC54cGF0aC5Db250ZXh0IGltcG9ydCBDb250ZXh0CmZyb20g
eG1sLmRvbS5leHQucmVhZGVyIGltcG9ydCBQeUV4cGF0CmZyb20gYzE0biBpbXBvcnQgQ2Fub25p
Y2FsaXplCiNmcm9tIHhtbC5kb20uZXh0IGltcG9ydCBDYW5vbmljYWxpemUKCiMgTXkgc3BlY2lh
bCByZWFkZXIuClBZRSA9IFB5RXhwYXQuUmVhZGVyCmNsYXNzIFJlYWRlcmZvckMxNE5FeGFtcGxl
cyhQWUUpOgogICAgJycnQSBzcGVjaWFsIHJlYWRlciB0byBoYW5kbGUgcmVzb2x1dGlvbiBvZiB0
aGUgQzE0TiBleGFtcGxlcy4KICAgICcnJwogICAgZGVmIGluaXRQYXJzZXIoc2VsZik6CiAgICAg
ICAgUFlFLmluaXRQYXJzZXIoc2VsZikKICAgICAgICBzZWxmLnBhcnNlci5FeHRlcm5hbEVudGl0
eVJlZkhhbmRsZXIgPSBzZWxmLmVudGl0eV9yZWYKCiAgICBkZWYgZW50aXR5X3JlZihzZWxmLCAq
YXJncyk6CiAgICAgICAgaWYgYXJncyAhPSAodSgnZW50MicpLCBOb25lLCB1KCd3b3JsZC50eHQn
KSwgTm9uZSk6IHJldHVybiAwCiAgICAgICAgc2VsZi5wYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRs
ZXIoJ3dvcmxkJykKICAgICAgICByZXR1cm4gMQoKICAgICMgT3ZlcnJpZGUgc29tZSBtZXRob2Rz
IGZyb20gUHlFeHBhdC5SZWFkZXIKICAgIGRlZiB1bnBhcnNlZEVudGl0eURlY2woc2VsZiwgKmFy
Z3MpOiBwYXNzCiAgICBkZWYgbm90YXRpb25EZWNsKHNlbGYsICphcmdzKTogcGFzcwoKCnRyeToK
ICAgIGltcG9ydCBjb2RlY3MKICAgIHV0Zjhfd3JpdGVyID0gY29kZWNzLmxvb2t1cCgndXRmLTgn
KVszXQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBkZWYgdXRmOF93cml0ZXIocyk6CiAgICAgICAg
cmV0dXJuIHMKCmRlZiBidWlsdGluKCk6CiAgICAnJydSdW4gdGhlIGJ1aWx0aW4gdGVzdHMgZnJv
bSB0aGUgQzE0TiBzcGVjLicnJwogICAgZm9yIGkgaW4gcmFuZ2UobGVuKGV4YW1wbGVzKSk6CiAg
ICAgICAgbnVtID0gaSsxCiAgICAgICAgZWcgPSBleGFtcGxlc1tpXQoKICAgICAgICBmaWxlbmFt
ZSA9ICdvdXQlZC54bWwnICUgbnVtCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy51bmxpbmso
ZmlsZW5hbWUpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBwYXNzCgogICAgICAgIHByaW50
ICdEb2luZyAlZCwgJXMuLi4nICUgKG51bSwgc3RyaW5nLnJlcGxhY2UoZWdbMDozMF0sICdcbics
ICdcXG4nKSksCgogICAgICAgIHIgPSBSZWFkZXJmb3JDMTRORXhhbXBsZXMoKQogICAgICAgIHRy
eToKICAgICAgICAgICAgZG9tID0gci5mcm9tU3RyaW5nKGVnKQogICAgICAgIGV4Y2VwdCBFeGNl
cHRpb24sIGU6CiAgICAgICAgICAgIHByaW50ICdcbkV4Y2VwdGlvbicsIHJlcHIoZSkKICAgICAg
ICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAg
ICMgR2V0IHRoZSBub2Rlc2V0OyB0aGUgdGVzdHMgaGF2ZSBzb21lIHNwZWNpYWwgY2FzZXMuCiAg
ICAgICAgcGF0dGVybiA9ICcoLy8uIHwgLy9AKiB8IC8vbmFtZXNwYWNlOjoqKScKICAgICAgICBj
b24gPSBDb250ZXh0KGRvbSkKICAgICAgICBpZiBlZyA9PSBlZzU6CiAgICAgICAgICAgIHBhdHRl
cm4gPSAnKC8vLiB8IC8vQCogfCAvL25hbWVzcGFjZTo6Kilbbm90IChzZWxmOjpjb21tZW50KCkp
XScKICAgICAgICBlbGlmIGVnID09IGVnNzoKICAgICAgICAgICAgY29uID0gQ29udGV4dChkb20s
IHByb2Nlc3Nvck5zcz17J2lldGYnOiAnaHR0cDovL3d3dy5pZXRmLm9yZyd9KQogICAgICAgICAg
ICAKICAgICAgICBub2RlbGlzdCA9IHhwYXRoLkV2YWx1YXRlKHBhdHRlcm4sIGNvbnRleHQ9Y29u
KQoKICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgIG91dGYgPSB1dGY4X3dy
aXRlcihzKQoKICAgICAgICAjR2V0IHRoZSB1bnN1cHByZXNzZWRQcmVmaXhlcyBmb3IgZXhjLWMx
NG47IHRoZSB0ZXN0cyBoYXZlIHNwZWNpYWwgY2FzZXNlCiAgICAgICAgcGZ4bGlzdCA9IFtdCgog
ICAgICAgICMgQ2Fub25pY2FsaXplIGEgRE9NIHdpdGggYSBkb2N1bWVudCBzdWJzZXQgbGlzdCBh
Y2NvcmRpbmcgdG8gWE1MLUMxNE4KICAgICAgICBpZiBlZyA9PSBlZzE6CiAgICAgICAgICAgIENh
bm9uaWNhbGl6ZShkb20sIG91dGYsIHN1YnNldD1ub2RlbGlzdCwgY29tbWVudHM9MSkKICAgICAg
ICBlbHNlOgogICAgICAgICAgICBDYW5vbmljYWxpemUoZG9tLCBvdXRmLCBzdWJzZXQ9bm9kZWxp
c3QpCgogICAgICAgIGV4cGVjdGVkID0gYmFzZTY0LmRlY29kZXN0cmluZyh0ZXN0X3Jlc3VsdHNb
ZWddKQogICAgICAgIGlmIHMuZ2V0dmFsdWUoKSA9PSBleHBlY3RlZDoKICAgICAgICAgICAgcHJp
bnQgJ09rJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50ICdFcnJvciEnCiAgICAgICAg
ICAgIHByaW50ICdHb3Q6XG4nLCBzLmdldHZhbHVlKCkKICAgICAgICAgICAgcHJpbnQgJ0V4cGVj
dGVkOlxuJywgZXhwZWN0ZWQKICAgICAgICAgICAgCmRlZiB1c2FnZSgpOgogICAgcHJpbnQgJycn
T3B0aW9ucyBhY2NlcHRlZDoKICAgIC1iLCAtLWJ1aWx0aW4gICAgICAgICAgICBSdW4gdGhlIEMx
NE4gYnVpbHRpbiB0ZXN0cwogICAgLWUgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1c2l2ZSBD
MTROCiAgICAtcCAgICAgICAgICAgICAgICAgICAgICAgRXhjbHVzaXZlIEMxNE4gaW5jbHVzaXZl
IHByZWZpeGVzCiAgICAtbiBzdHJpbmcsICAgICAgICAgICAgICAgQWRkaXRpb25hbCBOU1ByZWZp
eGVzICh3aGl0ZXNwYWNlIGRlbGltaXRlZCkKICAgICAgICAtLW5hbWVzcGFjZXM9c3RyaW5nCiAg
ICAtaSBmaWxlLCAtLWluPWZpbGUgICAgICAgUmVhZCBzcGVjaWZpZWQgZmlsZSogKGRlZmF1bHQg
aXMgc3RkaW4pCiAgICAtbyBmaWxlLCAtLW91dD1maWxlICAgICAgV3JpdGUgdG8gc3BlY2lmaWVk
IGZpbGUqIChkZWZhdWx0IGlzIHN0ZG91dCkKICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQ
cmludCB0aGlzIHRleHQKICAgIC14IHF1ZXJ5LCAtLXhwYXRoPXF1ZXJ5ICBTcGVjaWZ5IGFuIFhQ
QVRIIG5vZGVsaXN0CklmIGZpbGUgKGZvciBpbnB1dC9vdXRwdXQpIGlzIGxpa2UgeHh4LG5hbWUg
dGhlbiB4eHggaXMgdXNlZCBhcyBhbgplbmNvZGluZyAoZS5nLiwgInV0Zi04LGZvby50eHQiKS4K
JycnCgppZiBfX25hbWVfXyAhPSAiX19tYWluX18iOgogICAgYnVpbHRpbigpCmVsc2U6CiAgICBp
ZiBsZW4oc3lzLmFyZ3YpID09IDE6IHN5cy5hcmd2LmFwcGVuZCgnLWInKQoKICAgIGltcG9ydCBn
ZXRvcHQKICAgIHRyeToKICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJn
dlsxOl0sICJjZWhiaTpvOm46cDp4OiIsCiAgICAgICAgICAgIFsgImNvbW1lbnRzIiwgImV4Y2x1
c2l2ZSIsICJoZWxwIiwgImJ1aWx0aW4iLCAKICAgICAgICAgICAgImluPSIsICJvdXQ9IiwgIm5h
bWVzcGFjZXM9IiwgInByZWZpeGVzPSIsICJ4cGF0aD0iIF0pCiAgICBleGNlcHQgZ2V0b3B0Lkdl
dG9wdEVycm9yLCBlOgogICAgICAgIHByaW50IHN5cy5hcmd2WzBdICsgJzonLCBlLCAnXG5Ucnkg
LS1oZWxwIGZvciBoZWxwLlxuJwogICAgICAgIHN5cy5leGl0KDEpCiAgICBpZiBsZW4oYXJncyk6
CiAgICAgICAgcHJpbnQgJ05vIGFyZ3VtZW50cywgb25seSBmbGFncy4gVHJ5IC0taGVscCBmb3Ig
aGVscC4nCiAgICAgICAgc3lzLmV4aXQoMSkKCgogICAgSU4sIE9VVCA9IHN5cy5zdGRpbiwgc3lz
LnN0ZG91dAogICAgcXVlcnkgPSAnKC8vLiB8IC8vQCogfCAvL25hbWVzcGFjZTo6KiknCiAgICBj
b21tZW50cyA9IDAKICAgIGV4Y2x1c2l2ZSwgcGZ4bGlzdCA9IE5vbmUsIFtdCiAgICBuc2RpY3Qg
PSB7fQogICAgZm9yIG9wdCxhcmcgaW4gb3B0czoKICAgICAgICBpZiBvcHQgaW4gKCctaCcsICct
LWhlbHAnKToKICAgICAgICAgICAgdXNhZ2UoKQogICAgICAgICAgICBzeXMuZXhpdCgwKQogICAg
ICAgIGlmIG9wdCBpbiAoJy1iJywgJy0tYnVpbHRpbicpOgogICAgICAgICAgICBidWlsdGluKCkK
ICAgICAgICAgICAgc3lzLmV4aXQoMCkKICAgICAgICBlbGlmIG9wdCBpbiAoJy1jJywgJy0tY29t
bWVudHMnKToKICAgICAgICAgICAgY29tbWVudHMgPSAxCiAgICAgICAgZWxpZiBvcHQgaW4gKCct
bicsICctLW5hbWVzcGFjZXMnKToKICAgICAgICAgICAgIyBjb252ZXJ0IGV2ZXJ5IHBhaXIgb2Yg
d2hpdGVzcGFjZSBkZWxpbWl0ZWQgIHZhbHVlcyB0byBkaWN0aW9uYXJ5CiAgICAgICAgICAgIG5z
bCA9IGFyZy5zcGxpdCgpCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihuc2wpLCAy
KToKICAgICAgICAgICAgICAgIG5zZGljdFtuc2xbaV1dID0gbnNsW2krMV0KICAgICAgICAjICAg
IHByaW50ICJOYW1lc3BhY2UgcHJlZml4IGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIHlldC4i
CiAgICAgICAgZWxpZiBvcHQgaW4gKCctZScsICctLWV4Y2x1c2l2ZScpOgogICAgICAgICAgICBl
eGNsdXNpdmUgPSAxCiAgICAgICAgZWxpZiBvcHQgaW4gKCAnLXAnLCAnLS1wcmVmaXhlcycpOgog
ICAgICAgICAgICBwZnhsaXN0ID0gYXJnLnNwbGl0KCcsJykKICAgICAgICBlbGlmIG9wdCBpbiAo
Jy1pJywgJy0taW4nKToKICAgICAgICAgICAgaWYgYXJnLmZpbmQoJywnKSA9PSAtMToKICAgICAg
ICAgICAgICAgIElOID0gb3BlbihhcmcsICdyJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAg
ICAgICAgIGltcG9ydCBjb2RlY3MKICAgICAgICAgICAgICAgIGVuY29kaW5nLCBmaWxlbmFtZSA9
IGFyZy5zcGxpdCgnLCcpCiAgICAgICAgICAgICAgICByZWFkZXIgPSBjb2RlY3MubG9va3VwKGVu
Y29kaW5nKVsyXQogICAgICAgICAgICAgICAgSU4gPSByZWFkZXIob3BlbihmaWxlbmFtZSwgJ3In
KSkKICAgICAgICBlbGlmIG9wdCBpbiAoJy1vJywgJy0tb3V0Jyk6CiAgICAgICAgICAgIGlmIGFy
Zy5maW5kKCcsJykgPT0gLTE6CiAgICAgICAgICAgICAgICBPVVQgPSBvcGVuKGFyZywgJ3cnKQog
ICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaW1wb3J0IGNvZGVjcwogICAgICAgICAg
ICAgICAgZW5jb2RpbmcsIGZpbGVuYW1lID0gYXJnLnNwbGl0KCcsJykKICAgICAgICAgICAgICAg
IHdyaXRlciA9IGNvZGVjcy5sb29rdXAoZW5jb2RpbmcpWzNdCiAgICAgICAgICAgICAgICBPVVQg
PSB3cml0ZXIob3BlbihmaWxlbmFtZSwgJ3cnKSkKICAgICAgICBlbGlmIG9wdCBpbiAoJy14Jywg
Jy0teHBhdGgnKToKICAgICAgICAgICAgcXVlcnkgPSBhcmcKICAgICAgICAgICAgCiAgICByID0g
UFlFKCkKICAgIGRvbSA9IHIuZnJvbVN0cmVhbShJTikKICAgIGNvbnRleHQgPSBDb250ZXh0KGRv
bSwgcHJvY2Vzc29yTnNzPW5zZGljdCkKICAgIG5vZGVsaXN0ID0geHBhdGguRXZhbHVhdGUocXVl
cnksIGNvbnRleHQ9Y29udGV4dCkKICAgIGlmIGV4Y2x1c2l2ZToKICAgICAgICBDYW5vbmljYWxp
emUoZG9tLCBPVVQsIHN1YnNldD1ub2RlbGlzdCwgY29tbWVudHM9Y29tbWVudHMsIHVuc3VwcHJl
c3NlZFByZWZpeGVzPXBmeGxpc3QpCiAgICBlbHNlOgogICAgICAgIENhbm9uaWNhbGl6ZShkb20s
IE9VVCwgc3Vic2V0PW5vZGVsaXN0LCBjb21tZW50cz1jb21tZW50cykgIyAgICBuc2RpY3Q9bnNk
aWN0CiAgICBPVVQuY2xvc2UoKQo=

--------------Boundary-00=_NB2774YQWHPCTZZJZ5GY
Content-Type: text/plain;
  charset="iso-8859-1";
  name="c14n.py"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="c14n.py"

IyEgL3Vzci9iaW4vZW52IHB5dGhvbgonJydYTUwgQ2Fub25pY2FsaXphdGlvbgoKVGhpcyBtb2R1
bGUgZ2VuZXJhdGVzIGNhbm9uaWNhbCBYTUwgb2YgYSBkb2N1bWVudCBvciBlbGVtZW50LgogICAg
aHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUKYW5kIGluY2x1
ZGVzIGEgcHJvdG90eXBlIG9mIGV4Y2x1c2l2ZSBjYW5vbmljYWxpemF0aW9uCiAgICBodHRwOi8v
d3d3LnczLm9yZy9TaWduYXR1cmUvRHJhZnRzL3htbC1leGMtYzE0bgoKUmVxdWlyZXMgUHlYTUwg
MC43LjAgb3IgbGF0ZXIuCgpLbm93biBpc3N1ZXMgaWYgdXNpbmcgRnQuTGliLnBEb21sZXR0ZToK
ICAgIDEuIFVuaWNvZGUKICAgIDIuIGRvZXMgbm90IHdoaXRlIHNwYWNlIG5vcm1hbGl6ZSBhdHRy
aWJ1dGVzIG9mIHR5cGUgTk1UT0tFTiBhbmQgSUQ/CiAgICAzLiBzZWVtcyB0byBiZSBpbmNsdWRl
ICJcbiIgYWZ0ZXIgaW1wb3J0aW5nIGV4dGVybmFsIGVudGl0aWVzPwoKTm90ZSwgdGhpcyB2ZXJz
aW9uIHByb2Nlc3NlcyBhIERPTSB0cmVlLCBhbmQgY29uc2VxdWVudGx5IGl0IHByb2Nlc3Nlcwpu
YW1lc3BhY2Ugbm9kZXMgYXMgYXR0cmlidXRlcywgbm90IGZyb20gYSBub2RlJ3MgbmFtZXNwYWNl
IGF4aXMuIFRoaXMKcGVybWl0cyBzaW1wbGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQgY2Fub25pY2Fs
aXphdGlvbiB3aXRob3V0ClhQYXRoLiBXaGVuIFhQYXRoIGlzIHVzZWQsIHRoZSBYUGF0aCByZXN1
bHQgbm9kZSBsaXN0IGlzIHBhc3NlZCBhbmQgdXNlZCB0bwpkZXRlcm1pbmUgaWYgdGhlIG5vZGUg
aXMgaW4gdGhlIFhQYXRoIHJlc3VsdCBsaXN0LCBidXQgbGl0dGxlIGVsc2UuCgpBdXRob3JzOgog
ICAgIkpvc2VwaCBNLiBSZWFnbGUgSnIuIiA8cmVhZ2xlQHczLm9yZz4KICAgICJSaWNoIFNhbHoi
IDxyc2FsekB6b2xlcmEuY29tPgoKJERhdGU6IDIwMDIvMDQvMjYgMjE6MjI6MDAgJCBieSAkQXV0
aG9yOiByZWFnbGUgJAonJycKCl9jb3B5cmlnaHQgPSAnJydDb3B5cmlnaHQgMjAwMSwgWm9sZXJh
IFN5c3RlbXMgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KQ29weXJpZ2h0IDIwMDEsIE1JVC4g
QWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZjoKICBQ
eXRob24gMi4wIExpY2Vuc2Ugb3IgbGF0ZXIuCiAgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMC4x
L2xpY2Vuc2UuaHRtbApvcgogIFczQyBTb2Z0d2FyZSBMaWNlbnNlCiAgaHR0cDovL3d3dy53My5v
cmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKJycnCgppbXBv
cnQgc3RyaW5nCmZyb20geG1sLmRvbSBpbXBvcnQgTm9kZQp0cnk6CiAgICBmcm9tIHhtbC5ucyBp
bXBvcnQgWE1MTlMKZXhjZXB0OgogICAgY2xhc3MgWE1MTlM6CiAgICAgICAgQkFTRSA9ICJodHRw
Oi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKICAgICAgICBYTUwgPSAiaHR0cDovL3d3dy53My5v
cmcvWE1MLzE5OTgvbmFtZXNwYWNlIgp0cnk6CiAgICBpbXBvcnQgY1N0cmluZ0lPCiAgICBTdHJp
bmdJTyA9IGNTdHJpbmdJTwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgU3RyaW5nSU8K
Cl9hdHRycyA9IGxhbWJkYSBFOiAoRS5hdHRyaWJ1dGVzIGFuZCBFLmF0dHJpYnV0ZXMudmFsdWVz
KCkpIG9yIFtdCl9jaGlsZHJlbiA9IGxhbWJkYSBFOiBFLmNoaWxkTm9kZXMgb3IgW10KX0lOX1hN
TF9OUyA9IGxhbWJkYSBuOiBuLm5hbWVzcGFjZVVSSSA9PSBYTUxOUy5YTUwKX2luY2x1c2l2ZSA9
IGxhbWJkYSBuOiBuLnVuc3VwcHJlc3NlZFByZWZpeGVzID09IE5vbmUKCgojIERvZXMgYSBkb2N1
bWVudC9QSSBoYXMgbGVzc2VyL2dyZWF0ZXIgZG9jdW1lbnQgb3JkZXIgdGhhbiB0aGUKIyBmaXJz
dCBlbGVtZW50PwpfTGVzc2VyRWxlbWVudCwgX0VsZW1lbnQsIF9HcmVhdGVyRWxlbWVudCA9IHJh
bmdlKDMpCgpkZWYgX3NvcnRlcihuMSxuMik6CiAgICAnJydfc29ydGVyKG4xLG4yKSAtPiBpbnQK
ICAgIFNvcnRpbmcgcHJlZGljYXRlIGZvciBub24tTlMgYXR0cmlidXRlcy4nJycKCiAgICBpID0g
Y21wKG4xLm5hbWVzcGFjZVVSSSwgbjIubmFtZXNwYWNlVVJJKQogICAgaWYgaTogcmV0dXJuIGkK
ICAgIHJldHVybiBjbXAobjEubG9jYWxOYW1lLCBuMi5sb2NhbE5hbWUpCgoKZGVmIF9zb3J0ZXJf
bnMobjEsbjIpOgogICAgJycnX3NvcnRlcl9ucygobix2KSwobix2KSkgLT4gaW50CiAgICAiKGFu
IGVtcHR5IG5hbWVzcGFjZSBVUkkgaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVhc3QpLiInJycKCiAg
ICBpZiBuMVswXSA9PSAneG1sbnMnOiByZXR1cm4gLTEKICAgIGlmIG4yWzBdID09ICd4bWxucyc6
IHJldHVybiAxCiAgICByZXR1cm4gY21wKG4xWzBdLCBuMlswXSkKCmRlZiBfdXRpbGl6ZWQobiwg
bm9kZSwgb3RoZXJfYXR0cnMsIHVuc3VwcHJlc3NlZFByZWZpeGVzKToKICAgICcnJ191dGlsaXpl
ZChuLCBub2RlLCBvdGhlcl9hdHRycywgdW5zdXBwcmVzc2VkUHJlZml4ZXMpIC0+IGJvb2xlYW4K
ICAgIFJldHVybiB0cnVlIGlmIHRoYXQgbm9kZXNwYWNlIGlzIHV0aWxpemVkIHdpdGhpbiB0aGUg
bm9kZScnJwoKICAgIGlmIG4uc3RhcnRzd2l0aCgneG1sbnM6Jyk6CiAgICAgICAgbiA9IG5bNjpd
CiAgICBlbGlmIG4uc3RhcnRzd2l0aCgneG1sbnMnKToKICAgICAgICBuID0gbls1Ol0KICAgIGlm
IChuPT0iIiBhbmQgbm9kZS5wcmVmaXggaW4gWyIjZGVmYXVsdCIsIE5vbmVdKSBvciBcCiAgICAg
ICAgbiA9PSBub2RlLnByZWZpeCBvciBuIGluIHVuc3VwcHJlc3NlZFByZWZpeGVzOiAKICAgICAg
ICAgICAgcmV0dXJuIDEKICAgIGZvciBhdHRyIGluIG90aGVyX2F0dHJzOgogICAgICAgIGlmIG4g
PT0gYXR0ci5wcmVmaXg6IHJldHVybiAxCiAgICByZXR1cm4gMAoKI19pbl9zdWJzZXQgPSBsYW1i
ZGEgc3Vic2V0LCBub2RlOiBub3Qgc3Vic2V0IG9yIG5vZGUgaW4gc3Vic2V0Cl9pbl9zdWJzZXQg
PSBsYW1iZGEgc3Vic2V0LCBub2RlOiBzdWJzZXQgaXMgTm9uZSBvciBub2RlIGluIHN1YnNldCAj
IHJpY2gncyB0d2VhawoKY2xhc3MgX2ltcGxlbWVudGF0aW9uOgogICAgJycnSW1wbGVtZW50YXRp
b24gY2xhc3MgZm9yIEMxNE4uIFRoaXMgYWNjb21wYW5pZXMgYSBub2RlIGR1cmluZyBpdCdzCiAg
ICBwcm9jZXNzaW5nIGFuZCBpbmNsdWRlcyB0aGUgcGFyYW1ldGVycyBhbmQgcHJvY2Vzc2luZyBz
dGF0ZS4nJycKCiAgICAjIEhhbmRsZXIgZm9yIGVhY2ggbm9kZSB0eXBlOyBwb3B1bGF0ZWQgZHVy
aW5nIG1vZHVsZSBpbnN0YW50aWF0aW9uLgogICAgaGFuZGxlcnMgPSB7fQoKICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCBub2RlLCB3cml0ZSwgKiprdyk6CiAgICAgICAgJycnQ3JlYXRlIGFuZCBydW4g
dGhlIGltcGxlbWVudGF0aW9uLicnJwogICAgICAgIHNlbGYud3JpdGUgPSB3cml0ZQogICAgICAg
IHNlbGYuc3Vic2V0ID0ga3cuZ2V0KCdzdWJzZXQnKQogICAgICAgIHNlbGYuY29tbWVudHMgPSBr
dy5nZXQoJ2NvbW1lbnRzJywgMCkKICAgICAgICBzZWxmLnVuc3VwcHJlc3NlZFByZWZpeGVzID0g
a3cuZ2V0KCd1bnN1cHByZXNzZWRQcmVmaXhlcycpCiAgICAgICAgbnNkaWN0ID0ga3cuZ2V0KCdu
c2RpY3QnLCB7ICd4bWwnOiBYTUxOUy5YTUwsICd4bWxucyc6IFhNTE5TLkJBU0UgfSkKICAgICAg
ICAKICAgICAgICAjIFByb2Nlc3Npbmcgc3RhdGUuCiAgICAgICAgc2VsZi5zdGF0ZSA9IChuc2Rp
Y3QsIHsneG1sJzonJ30sIHt9KSAjMDQyMgogICAgICAgIAogICAgICAgIGlmIG5vZGUubm9kZVR5
cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgogICAgICAgICAgICBzZWxmLl9kb19kb2N1bWVudChu
b2RlKQogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKICAg
ICAgICAgICAgc2VsZi5kb2N1bWVudE9yZGVyID0gX0VsZW1lbnQgICAgICAgICMgQXQgZG9jdW1l
bnQgZWxlbWVudAogICAgICAgICAgICBpZiBub3QgX2luY2x1c2l2ZShzZWxmKToKICAgICAgICAg
ICAgICAgIHNlbGYuX2RvX2VsZW1lbnQobm9kZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAg
ICAgICAgIGluaGVyaXRlZCA9IHNlbGYuX2luaGVyaXRfY29udGV4dChub2RlKQogICAgICAgICAg
ICAgICAgc2VsZi5fZG9fZWxlbWVudChub2RlLCBpbmhlcml0ZWQpCiAgICAgICAgZWxpZiBub2Rl
Lm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgogICAgICAgICAgICBwYXNzCiAg
ICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBzdHIobm9kZSkKCgogICAg
ZGVmIF9pbmhlcml0X2NvbnRleHQoc2VsZiwgbm9kZSk6CiAgICAgICAgJycnX2luaGVyaXRfY29u
dGV4dChzZWxmLCBub2RlKSAtPiBsaXN0CiAgICAgICAgU2NhbiBhbmNlc3RvcnMgb2YgYXR0cmli
dXRlIGFuZCBuYW1lc3BhY2UgY29udGV4dC4gIFVzZWQgb25seQogICAgICAgIGZvciBzaW5nbGUg
ZWxlbWVudCBub2RlIGNhbm9uaWNhbGl6YXRpb24sIG5vdCBmb3Igc3Vic2V0CiAgICAgICAgY2Fu
b25pY2FsaXphdGlvbi4nJycKCiAgICAgICAgIyBDb2xsZWN0IHRoZSBpbml0aWFsIGxpc3Qgb2Yg
eG1sOmZvbyBhdHRyaWJ1dGVzLgogICAgICAgIHhtbGF0dHJzID0gZmlsdGVyKF9JTl9YTUxfTlMs
IF9hdHRycyhub2RlKSkKCiAgICAgICAgIyBXYWxrIHVwIGFuZCBnZXQgYWxsIHhtbDpYWFggYXR0
cmlidXRlcyB3ZSBpbmhlcml0LgogICAgICAgIGluaGVyaXRlZCwgcGFyZW50ID0gW10sIG5vZGUu
cGFyZW50Tm9kZQogICAgICAgIHdoaWxlIHBhcmVudCBhbmQgcGFyZW50Lm5vZGVUeXBlID09IE5v
ZGUuRUxFTUVOVF9OT0RFOgogICAgICAgICAgICBmb3IgYSBpbiBmaWx0ZXIoX0lOX1hNTF9OUywg
X2F0dHJzKHBhcmVudCkpOgogICAgICAgICAgICAgICAgbiA9IGEubG9jYWxOYW1lCiAgICAgICAg
ICAgICAgICBpZiBuIG5vdCBpbiB4bWxhdHRyczoKICAgICAgICAgICAgICAgICAgICB4bWxhdHRy
cy5hcHBlbmQobikKICAgICAgICAgICAgICAgICAgICBpbmhlcml0ZWQuYXBwZW5kKGEpCiAgICAg
ICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlCiAgICAgICAgcmV0dXJuIGluaGVyaXRl
ZAoKCiAgICBkZWYgX2RvX2RvY3VtZW50KHNlbGYsIG5vZGUpOgogICAgICAgICcnJ19kb19kb2N1
bWVudChzZWxmLCBub2RlKSAtPiBOb25lCiAgICAgICAgUHJvY2VzcyBhIGRvY3VtZW50IG5vZGUu
IGRvY3VtZW50T3JkZXIgaG9sZHMgd2hldGhlciB0aGUgZG9jdW1lbnQKICAgICAgICBlbGVtZW50
IGhhcyBiZWVuIGVuY291bnRlcmVkIHN1Y2ggdGhhdCBQSXMvY29tbWVudHMgY2FuIGJlIHdyaXR0
ZW4KICAgICAgICBhcyBzcGVjaWZpZWQuJycnCgogICAgICAgIHNlbGYuZG9jdW1lbnRPcmRlciA9
IF9MZXNzZXJFbGVtZW50CiAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKICAg
ICAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAg
ICAgICAgICBzZWxmLmRvY3VtZW50T3JkZXIgPSBfRWxlbWVudCAgICAgICAgIyBBdCBkb2N1bWVu
dCBlbGVtZW50CiAgICAgICAgICAgICAgICBzZWxmLl9kb19lbGVtZW50KGNoaWxkKQogICAgICAg
ICAgICAgICAgc2VsZi5kb2N1bWVudE9yZGVyID0gX0dyZWF0ZXJFbGVtZW50ICMgQWZ0ZXIgZG9j
dW1lbnQgZWxlbWVudAogICAgICAgICAgICBlbGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuUFJP
Q0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgogICAgICAgICAgICAgICAgc2VsZi5fZG9fcGkoY2hp
bGQpCiAgICAgICAgICAgIGVsaWYgY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5DT01NRU5UX05PREU6
CiAgICAgICAgICAgICAgICBzZWxmLl9kb19jb21tZW50KGNoaWxkKQogICAgICAgICAgICBlbGlm
IGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgogICAgICAgICAgICAg
ICAgcGFzcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9y
LCBzdHIoY2hpbGQpCiAgICBoYW5kbGVyc1tOb2RlLkRPQ1VNRU5UX05PREVdID0gX2RvX2RvY3Vt
ZW50CgoKICAgIGRlZiBfZG9fdGV4dChzZWxmLCBub2RlKToKICAgICAgICAnJydfZG9fdGV4dChz
ZWxmLCBub2RlKSAtPiBOb25lCiAgICAgICAgUHJvY2VzcyBhIHRleHQgb3IgQ0RBVEEgbm9kZS4g
IFJlbmRlciB2YXJpb3VzIHNwZWNpYWwgY2hhcmFjdGVycwogICAgICAgIGFzIHRoZWlyIEMxNE4g
ZW50aXR5IHJlcHJlc2VudGF0aW9ucy4nJycKICAgICAgICBpZiBub3QgX2luX3N1YnNldChzZWxm
LnN1YnNldCwgbm9kZSk6IHJldHVybgogICAgICAgIHMgPSBzdHJpbmcucmVwbGFjZShub2RlLmRh
dGEsICImIiwgIiZhbXA7IikKICAgICAgICBzID0gc3RyaW5nLnJlcGxhY2UocywgIjwiLCAiJmx0
OyIpCiAgICAgICAgcyA9IHN0cmluZy5yZXBsYWNlKHMsICI+IiwgIiZndDsiKQogICAgICAgIHMg
PSBzdHJpbmcucmVwbGFjZShzLCAiXDAxNSIsICImI3hEOyIpCiAgICAgICAgaWYgczogc2VsZi53
cml0ZShzKQogICAgaGFuZGxlcnNbTm9kZS5URVhUX05PREVdID0gX2RvX3RleHQKICAgIGhhbmRs
ZXJzW05vZGUuQ0RBVEFfU0VDVElPTl9OT0RFXSA9IF9kb190ZXh0CgoKICAgIGRlZiBfZG9fcGko
c2VsZiwgbm9kZSk6CiAgICAgICAgJycnX2RvX3BpKHNlbGYsIG5vZGUpIC0+IE5vbmUKICAgICAg
ICBQcm9jZXNzIGEgUEkgbm9kZS4gUmVuZGVyIGEgbGVhZGluZyBvciB0cmFpbGluZyAjeEEgaWYg
dGhlCiAgICAgICAgZG9jdW1lbnQgb3JkZXIgb2YgdGhlIFBJIGlzIGdyZWF0ZXIgb3IgbGVzc2Vy
IChyZXNwZWN0aXZlbHkpCiAgICAgICAgdGhhbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KICAgICAg
ICAnJycKICAgICAgICBpZiBub3QgX2luX3N1YnNldChzZWxmLnN1YnNldCwgbm9kZSk6IHJldHVy
bgogICAgICAgIFcgPSBzZWxmLndyaXRlCiAgICAgICAgaWYgc2VsZi5kb2N1bWVudE9yZGVyID09
IF9HcmVhdGVyRWxlbWVudDogVygnXG4nKQogICAgICAgIFcoJzw/JykKICAgICAgICBXKG5vZGUu
bm9kZU5hbWUpCiAgICAgICAgcyA9IG5vZGUuZGF0YQogICAgICAgIGlmIHM6CiAgICAgICAgICAg
IFcoJyAnKQogICAgICAgICAgICBXKHMpCiAgICAgICAgVygnPz4nKQogICAgICAgIGlmIHNlbGYu
ZG9jdW1lbnRPcmRlciA9PSBfTGVzc2VyRWxlbWVudDogVygnXG4nKQogICAgaGFuZGxlcnNbTm9k
ZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREVdID0gX2RvX3BpCgoKICAgIGRlZiBfZG9fY29t
bWVudChzZWxmLCBub2RlKToKICAgICAgICAnJydfZG9fY29tbWVudChzZWxmLCBub2RlKSAtPiBO
b25lCiAgICAgICAgUHJvY2VzcyBhIGNvbW1lbnQgbm9kZS4gUmVuZGVyIGEgbGVhZGluZyBvciB0
cmFpbGluZyAjeEEgaWYgdGhlCiAgICAgICAgZG9jdW1lbnQgb3JkZXIgb2YgdGhlIGNvbW1lbnQg
aXMgZ3JlYXRlciBvciBsZXNzZXIgKHJlc3BlY3RpdmVseSkKICAgICAgICB0aGFuIHRoZSBkb2N1
bWVudCBlbGVtZW50LgogICAgICAgICcnJwogICAgICAgIGlmIG5vdCBfaW5fc3Vic2V0KHNlbGYu
c3Vic2V0LCBub2RlKTogcmV0dXJuCiAgICAgICAgaWYgc2VsZi5jb21tZW50czoKICAgICAgICAg
ICAgVyA9IHNlbGYud3JpdGUKICAgICAgICAgICAgaWYgc2VsZi5kb2N1bWVudE9yZGVyID09IF9H
cmVhdGVyRWxlbWVudDogVygnXG4nKQogICAgICAgICAgICBXKCc8IS0tJykKICAgICAgICAgICAg
Vyhub2RlLmRhdGEpCiAgICAgICAgICAgIFcoJy0tPicpCiAgICAgICAgICAgIGlmIHNlbGYuZG9j
dW1lbnRPcmRlciA9PSBfTGVzc2VyRWxlbWVudDogVygnXG4nKQogICAgaGFuZGxlcnNbTm9kZS5D
T01NRU5UX05PREVdID0gX2RvX2NvbW1lbnQKCgogICAgZGVmIF9kb19hdHRyKHNlbGYsIG4sIHZh
bHVlKToKICAgICAgICAnJycnX2RvX2F0dHIoc2VsZiwgbm9kZSkgLT4gTm9uZQogICAgICAgIFBy
b2Nlc3MgYW4gYXR0cmlidXRlLicnJwoKICAgICAgICBXID0gc2VsZi53cml0ZQogICAgICAgIFco
JyAnKQogICAgICAgIFcobikKICAgICAgICBXKCc9IicpCiAgICAgICAgcyA9IHN0cmluZy5yZXBs
YWNlKHZhbHVlLCAiJiIsICImYW1wOyIpCiAgICAgICAgcyA9IHN0cmluZy5yZXBsYWNlKHMsICI8
IiwgIiZsdDsiKQogICAgICAgIHMgPSBzdHJpbmcucmVwbGFjZShzLCAnIicsICcmcXVvdDsnKQog
ICAgICAgIHMgPSBzdHJpbmcucmVwbGFjZShzLCAnXDAxMScsICcmI3g5JykKICAgICAgICBzID0g
c3RyaW5nLnJlcGxhY2UocywgJ1wwMTInLCAnJiN4QScpCiAgICAgICAgcyA9IHN0cmluZy5yZXBs
YWNlKHMsICdcMDE1JywgJyYjeEQnKQogICAgICAgIFcocykKICAgICAgICBXKCciJykKCgogICAg
ZGVmIF9kb19lbGVtZW50KHNlbGYsIG5vZGUsIGluaXRpYWxfb3RoZXJfYXR0cnMgPSBbXSk6CiAg
ICAgICAgJycnX2RvX2VsZW1lbnQoc2VsZiwgbm9kZSwgaW5pdGlhbF9vdGhlcl9hdHRycyA9IFtd
KSAtPiBOb25lCiAgICAgICAgUHJvY2VzcyBhbiBlbGVtZW50IChhbmQgaXRzIGNoaWxkcmVuKS4n
JycKCiAgICAgICAgIyBHZXQgc3RhdGUgKGZyb20gdGhlIHN0YWNrKSBtYWtlIGxvY2FsIGNvcGll
cy4KICAgICAgICAjICAgbnNfcGFyZW50IC0tIE5TIGRlY2xhcmF0aW9ucyBpbiBwYXJlbnQKICAg
ICAgICAjICAgbnNfcmVuZGVyZWQgLS0gTlMgbm9kZXMgcmVuZGVyZWQgYnkgYW5jZXN0b3JzCiAg
ICAgICAgIyAgICAgICAgbnNfbG9jYWwgLS0gTlMgZGVjbGFyYXRpb25zIHJlbGV2YW50IHRvIHRo
aXMgZWxlbWVudAogICAgICAgICMgICB4bWxfYXR0cnMgLS0gQXR0cmlidXRlcyBpbiBYTUwgbmFt
ZXNwYWNlIGZyb20gcGFyZW50CiAgICAgICAgIyAgICAgICB4bWxfYXR0cnNfbG9jYWwgLS0gTG9j
YWwgYXR0cmlidXRlcyBpbiBYTUwgbmFtZXNwYWNlLgogICAgICAgIG5zX3BhcmVudCwgbnNfcmVu
ZGVyZWQsIHhtbF9hdHRycyA9IFwKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVbMF0sIHNlbGYu
c3RhdGVbMV0uY29weSgpLCBzZWxmLnN0YXRlWzJdLmNvcHkoKSAjMDQyMgogICAgICAgIG5zX2xv
Y2FsID0gbnNfcGFyZW50LmNvcHkoKQogICAgICAgIHhtbF9hdHRyc19sb2NhbCA9IHt9CgogICAg
ICAgICMgRGl2aWRlIGF0dHJpYnV0ZXMgaW50byBOUywgWE1MLCBhbmQgb3RoZXJzLgogICAgICAg
IG90aGVyX2F0dHJzID0gaW5pdGlhbF9vdGhlcl9hdHRyc1s6XQogICAgICAgIGluX3N1YnNldCA9
IF9pbl9zdWJzZXQoc2VsZi5zdWJzZXQsIG5vZGUpCiAgICAgICAgZm9yIGEgaW4gX2F0dHJzKG5v
ZGUpOgogICAgICAgICAgICBpZiBhLm5hbWVzcGFjZVVSSSA9PSBYTUxOUy5CQVNFOgogICAgICAg
ICAgICAgICAgbiA9IGEubm9kZU5hbWUKICAgICAgICAgICAgICAgIGlmIG4gPT0gInhtbG5zOiI6
IG4gPSAieG1sbnMiICAgICAgICAjIERPTSBidWcgd29ya2Fyb3VuZAogICAgICAgICAgICAgICAg
bnNfbG9jYWxbbl0gPSBhLm5vZGVWYWx1ZQogICAgICAgICAgICBlbGlmIGEubmFtZXNwYWNlVVJJ
ID09IFhNTE5TLlhNTDoKICAgICAgICAgICAgICAgIGlmIF9pbmNsdXNpdmUoc2VsZikgb3IgaW5f
c3Vic2V0OgogICAgICAgICAgICAgICAgICAgIHhtbF9hdHRyc19sb2NhbFthLm5vZGVOYW1lXSA9
IGEgIzA0MjYKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG90aGVyX2F0dHJzLmFw
cGVuZChhKQogICAgICAgICAgICAjYWRkIGxvY2FsIHhtbDpmb28gYXR0cmlidXRlcyB0byBhbmNl
c3RvcidzIHhtbDpmb28gYXR0cmlidXRlcwogICAgICAgICAgICB4bWxfYXR0cnMudXBkYXRlKHht
bF9hdHRyc19sb2NhbCkKCiAgICAgICAgIyBSZW5kZXIgdGhlIG5vZGUKICAgICAgICBXLCBuYW1l
ID0gc2VsZi53cml0ZSwgTm9uZQogICAgICAgIGlmIGluX3N1YnNldDogCiAgICAgICAgICAgIG5h
bWUgPSBub2RlLm5vZGVOYW1lCiAgICAgICAgICAgIFcoJzwnKQogICAgICAgICAgICBXKG5hbWUp
CgogICAgICAgICAgICAjIENyZWF0ZSBsaXN0IG9mIE5TIGF0dHJpYnV0ZXMgdG8gcmVuZGVyLgog
ICAgICAgICAgICBuc190b19yZW5kZXIgPSBbXQogICAgICAgICAgICBmb3Igbix2IGluIG5zX2xv
Y2FsLml0ZW1zKCk6CgogICAgICAgICAgICAgICAgIyBJZiBkZWZhdWx0IG5hbWVzcGFjZSBpcyBY
TUxOUy5CQVNFIG9yIGVtcHR5LAogICAgICAgICAgICAgICAgIyBhbmQgaWYgYW4gYW5jZXN0b3Ig
d2FzIHRoZSBzYW1lCiAgICAgICAgICAgICAgICBpZiBuID09ICJ4bWxucyIgYW5kIHYgaW4gWyBY
TUxOUy5CQVNFLCAnJyBdIFwKICAgICAgICAgICAgICAgIGFuZCBuc19yZW5kZXJlZC5nZXQoJ3ht
bG5zJykgaW4gWyBYTUxOUy5CQVNFLCAnJywgTm9uZSBdOgogICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlCgogICAgICAgICAgICAgICAgIyAib21pdCBuYW1lc3BhY2Ugbm9kZSB3aXRoIGxvY2Fs
IG5hbWUgeG1sLCB3aGljaCBkZWZpbmVzCiAgICAgICAgICAgICAgICAjIHRoZSB4bWwgcHJlZml4
LCBpZiBpdHMgc3RyaW5nIHZhbHVlIGlzCiAgICAgICAgICAgICAgICAjIGh0dHA6Ly93d3cudzMu
b3JnL1hNTC8xOTk4L25hbWVzcGFjZS4iCiAgICAgICAgICAgICAgICBpZiBuIGluIFsieG1sbnM6
eG1sIiwgInhtbCJdIFwKICAgICAgICAgICAgICAgIGFuZCB2IGluIFsgJ2h0dHA6Ly93d3cudzMu
b3JnL1hNTC8xOTk4L25hbWVzcGFjZScgXToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoK
CiAgICAgICAgICAgICAgICAjIElmIG5vdCBwcmV2aW91c2x5IHJlbmRlcmVkCiAgICAgICAgICAg
ICAgICAjIGFuZCBpdCdzIGluY2x1c2l2ZSAgb3IgdXRpbGl6ZWQKICAgICAgICAgICAgICAgIGlm
IChuLHYpIG5vdCBpbiBuc19yZW5kZXJlZC5pdGVtcygpIFwKICAgICAgICAgICAgICAgICAgYW5k
IChfaW5jbHVzaXZlKHNlbGYpIG9yIFwKICAgICAgICAgICAgICAgICAgX3V0aWxpemVkKG4sIG5v
ZGUsIG90aGVyX2F0dHJzLCBzZWxmLnVuc3VwcHJlc3NlZFByZWZpeGVzKSk6CiAgICAgICAgICAg
ICAgICAgICAgbnNfdG9fcmVuZGVyLmFwcGVuZCgobiwgdikpCgogICAgICAgICAgICAjIFNvcnQg
YW5kIHJlbmRlciB0aGUgbnMsIG1hcmtpbmcgd2hhdCB3YXMgcmVuZGVyZWQuCiAgICAgICAgICAg
IG5zX3RvX3JlbmRlci5zb3J0KF9zb3J0ZXJfbnMpCiAgICAgICAgICAgIGZvciBuLHYgaW4gbnNf
dG9fcmVuZGVyOgogICAgICAgICAgICAgICAgc2VsZi5fZG9fYXR0cihuLCB2KQogICAgICAgICAg
ICAgICAgbnNfcmVuZGVyZWRbbl09diAgICAjMDQxNwoKICAgICAgICAgICAgIyBJZiBleGNsdXNp
dmUgb3IgdGhlIHBhcmVudCBpcyBpbiB0aGUgc3Vic2V0LCBhZGQgdGhlIGxvY2FsIHhtbCBhdHRy
aWJ1dGVzCiAgICAgICAgICAgICMgRWxzZSwgYWRkIGFsbCBsb2NhbCBhbmQgYW5jZXN0b3IgeG1s
IGF0dHJpYnV0ZXMKICAgICAgICAgICAgIyBTb3J0IGFuZCByZW5kZXIgdGhlIGF0dHJpYnV0ZXMu
CiAgICAgICAgICAgIGlmIG5vdCBfaW5jbHVzaXZlKHNlbGYpIG9yIF9pbl9zdWJzZXQoc2VsZi5z
dWJzZXQsbm9kZS5wYXJlbnROb2RlKTogICMwNDI2CiAgICAgICAgICAgICAgICBvdGhlcl9hdHRy
cy5leHRlbmQoeG1sX2F0dHJzX2xvY2FsLnZhbHVlcygpKQogICAgICAgICAgICBlbHNlOgogICAg
ICAgICAgICAgICAgb3RoZXJfYXR0cnMuZXh0ZW5kKHhtbF9hdHRycy52YWx1ZXMoKSkKICAgICAg
ICAgICAgb3RoZXJfYXR0cnMuc29ydChfc29ydGVyKQogICAgICAgICAgICBmb3IgYSBpbiBvdGhl
cl9hdHRyczoKICAgICAgICAgICAgICAgIHNlbGYuX2RvX2F0dHIoYS5ub2RlTmFtZSwgYS52YWx1
ZSkKICAgICAgICAgICAgVygnPicpCgogICAgICAgICMgUHVzaCBzdGF0ZSwgcmVjdXJzZSwgcG9w
IHN0YXRlLgogICAgICAgIHN0YXRlLCBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZSwgKG5zX2xvY2Fs
LCBuc19yZW5kZXJlZCwgeG1sX2F0dHJzKQogICAgICAgIGZvciBjIGluIF9jaGlsZHJlbihub2Rl
KToKICAgICAgICAgICAgX2ltcGxlbWVudGF0aW9uLmhhbmRsZXJzW2Mubm9kZVR5cGVdKHNlbGYs
IGMpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlCgogICAgICAgIGlmIG5hbWU6IFcoJzwvJXM+
JyAlIG5hbWUpCiAgICBoYW5kbGVyc1tOb2RlLkVMRU1FTlRfTk9ERV0gPSBfZG9fZWxlbWVudAoK
CmRlZiBDYW5vbmljYWxpemUobm9kZSwgb3V0cHV0PU5vbmUsICoqa3cpOgogICAgJycnQ2Fub25p
Y2FsaXplKG5vZGUsIG91dHB1dD1Ob25lLCAqKmt3KSAtPiBVVEYtOAoKICAgIENhbm9uaWNhbGl6
ZSBhIERPTSBkb2N1bWVudC9lbGVtZW50IG5vZGUgYW5kIGFsbCBkZXNjZW5kZW50cy4KICAgIFJl
dHVybiB0aGUgdGV4dDsgaWYgb3V0cHV0IGlzIHNwZWNpZmllZCB0aGVuIG91dHB1dC53cml0ZSB3
aWxsCiAgICBiZSBjYWxsZWQgdG8gb3V0cHV0IHRoZSB0ZXh0IGFuZCBOb25lIHdpbGwgYmUgcmV0
dXJuZWQKICAgIEtleXdvcmQgcGFyYW1ldGVyczoKICAgICAgICBuc2RpY3Q6IGEgZGljdGlvbmFy
eSBvZiBwcmVmaXg6dXJpIG5hbWVzcGFjZSBlbnRyaWVzCiAgICAgICAgICAgICAgICBhc3N1bWVk
IHRvIGV4aXN0IGluIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0CiAgICAgICAgY29tbWVudHM6IGtl
ZXAgY29tbWVudHMgaWYgbm9uLXplcm8gKGRlZmF1bHQgaXMgMCkKICAgICAgICBzdWJzZXQ6IENh
bm9uaWNhbCBYTUwgc3Vic2V0dGluZyByZXN1bHRpbmcgZnJvbSBYUGF0aAogICAgICAgICAgICAg
ICAgKGRlZmF1bHQgaXMgW10pCiAgICAgICAgdW5zdXBwcmVzc2VkUHJlZml4ZXM6IGRvIGV4Y2x1
c2l2ZSBDMTROLCBhbmQgdGhpcyBzcGVjaWZpZXMgdGhlCiAgICAgICAgICAgICAgICBwcmVmaXhl
cyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQuCiAgICAnJycKICAgIGlmIG91dHB1dDoKICAgICAg
ICBhcHBseShfaW1wbGVtZW50YXRpb24sIChub2RlLCBvdXRwdXQud3JpdGUpLCBrdykKICAgIGVs
c2U6CiAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICBhcHBseShfaW1wbGVt
ZW50YXRpb24sIChub2RlLCBzLndyaXRlKSwga3cpCiAgICAgICAgcmV0dXJuIHMuZ2V0dmFsdWUo
KQo=

--------------Boundary-00=_NB2774YQWHPCTZZJZ5GY--