Content-Type: multipart/related; start=; boundary=----------VIkciIu2gJEL5dl14ihIzo Content-Location: http://help.netbynet.ru/nastrojka-vpn/mac-os-vpn/ Subject: =?utf-8?Q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20(VPN)=20=D0=B4=D0=BB=D1=8F=20Mac=20OS=20:=20Help.netbynet.ru?= MIME-Version: 1.0 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=default.htm Content-Type: text/html; charset=UTF-8; name=default.htm Content-ID: Content-Location: http://help.netbynet.ru/nastrojka-vpn/mac-os-vpn/ Content-Transfer-Encoding: Quoted-Printable =D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0 =D0=B8= =D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82 =D1=81=D0=BE=D0=B5=D0=B4=D0=B8= =D0=BD=D0=B5=D0=BD=D0=B8=D1=8F (VPN) =D0=B4=D0=BB=D1=8F Mac OS : Help.ne= tbynet.ru = = = = =
=D0=9B=D0=BE=D0=B3=D0=B8=D0=BD:

= =D0=9F=D0=B0=D1=80=D0=BE=D0=BB=D1=8C:
=D0=97=D0=B0=D0=B1=D1=8B=D0= =BB=D0=B8 =D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C?
=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D1=82=D1=8C=D1=81= =D1=8F =D0=BF=D0=BE =D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD=D1=83:

8 495 980 25 00

=D0=A1=D0=BB=D1=83=D0=B6=D0=B1=D0=B0 =D0=BF=D0=BE=D0=B4=D0=B4=D0=B5= =D1=80=D0=B6=D0=BA=D0=B8:

8 495 980 24 00

=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0 VPN »= =D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA= =D0=B0 =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82 =D1=81=D0=BE=D0=B5= =D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F (VPN) =D0=B4=D0=BB=D1=8F Mac = OS

=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0= =D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=82 =D1=81=D0=BE=D0=B5=D0=B4= =D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F (VPN) =D0=B4=D0=BB=D1=8F Mac OS

=
3D"=D0=A1=D0=BA=D0=B0=D1=87=D0=B0=D1=82=D1=

=D0=94=D0=BB=D1=8F =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0= =B8 VPN =D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F= =D0=B2 MacOS Lion =D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC= =D0=BE =D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82=D1=8C =D0=BC=D0=B5=D0=BD=D1=8E= Apple (=D0=B7=D0=BD=D0=B0=D1=87=D1=91=D0=BA =D1=8F=D0=B1=D0=BB=D0=BE=D0= =BA=D0=B0 =D0=B2 =D0=B2=D0=B5=D1=80=D1=85=D0=BD=D0=B5=D0=BC =D0=BB=D0=B5= =D0=B2=D0=BE=D0=BC =D1=83=D0=B3=D0=BB=D1=83) =D0=B8 =D0=BF=D0=B5=D1=80=D0= =B5=D0=B9=D1=82=D0=B8 =D0=B2 =C2=AB=D0=A1=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0= =BD=D1=8B=D0=B5 =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=C2= =BB. =D0=94=D0=B0=D0=BB=D0=B5=D0=B5 =D0=BE=D1=82=D1=80=D1=8B=D0=B2=D0=B0= =D0=B5=D0=BC =D1=8F=D1=80=D0=BB=D1=8B=D0=BA =C2=AB=D0=A1=D0=B5=D1=82=D1=8C= =C2=BB:

3D""

3D""

=D0=95=D1=81=D0=BB=D0=B8 =D1=83 =D0=B2=D0=B0=D1=81 =D0=B8=D1=81=D0=BF= =D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D1=82=D1=81=D1=8F VPN =D1=81=D0=BE = =D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=BC IP, =D1= =82=D0=BE =D0=BF=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80=D0=B8=D1=82=D0=B5=D0= =BB=D1=8C=D0=BD=D0=BE =D0=BD=D0=B5=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0= =BC=D0=BE =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B8=D1=82=D1=8C Etherne= t =D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 =D0= =BA=D0=B0=D0=BA =D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=BE =D0=BD=D0= =B0 =D1=81=D1=82=D1=80. 5 =D0=B2 =D0=B3=D0=BB=D0=B0=D0=B2=D0=B5 =C2=AB=D0= =9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0 NAT =D1=81=D0=BE =D1= =81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=BC IP=C2=BB= , =D0=B5=D1=81=D0=BB=D0=B8 =D0=B6=D0=B5 =D0=94=D0=B8=D0=BD=D0=B0=D0=BC=D0= =B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B9 VPN, =D1=82=D0=BE =D0=BF=D1=80=D0= =BE=D1=81=D1=82=D0=BE =D1=81=D0=BB=D0=B5=D0=B4=D1=83=D0=B5=D0=BC =D0=B4=D0= =B0=D0=BB=D1=8C=D1=88=D0=B5.
=D0=94=D0=B0=D0=BB=D0=B5=D0=B5 =D0=B2 =D0=BD=D0=B8=D0=B6=D0=BD=D0=B5=D0=BC= =D0=BB=D0=B5=D0=B2=D0=BE=D0=BC =D1=83=D0=B3=D0=BB=D1=83 =D0=BD=D0=B0=D0= =B6=D0=B0=D1=82=D1=8C =D0=B7=D0=BD=D0=B0=D1=87=D0=BE=D0=BA =C2=AB+=C2=BB= , =D0=BA=D0=B0=D0=BA =D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=BE =D0= =BD=D0=B0 =D1=80=D0=B8=D1=81=D1=83=D0=BD=D0=BA=D0=B5. =D0=92 =D0=BF=D0=BE= =D1=8F=D0=B2=D0=B8=D0=B2=D1=88=D0=B5=D0=BC=D1=81=D1=8F =D0=BE=D0=BA=D0=BD= =D0=B5 =D0=B2=D1=8B=D0=B1=D1=80=D0=B0=D1=82=D1=8C:

  • =D0=98=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81 =E2=80=93 VPN=
  • =D0=A2=D0=B8=D0=BF VPN =E2=80=93 PPTP
  • =D0=98=D0=BC=D1=8F =D1=81=D0=BB=D1=83=D0=B6=D0=B1=D1=8B =E2=80=93 VP= N(PPTP)

=D0=9D=D0=B0=D0=B6=D0=B0=D1=82=D1=8C =C2=AB=D0=9E=D0=9A=C2=BB

3D""

=D0=92 =D1=81=D0=BB=D0=B5=D0=B4=D1=83=D1=8E=D1=89=D0=B5=D0=BC =D0=BE=D0= =BA=D0=BD=D0=B5 =D0=B2=D0=B1=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC:

  • =D0=90=D0=B4=D1=80=D0=B5=D1=81 =D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0= =B0: ppp.lan
  • =D0=98=D0=BC=D1=8F =D1=83=D1=87=D1=91=D1=82=D0=BD=D0=BE=D0=B9 =D0=B7= =D0=B0=D0=BF=D0=B8=D1=81=D0=B8: =D0=B2=D0=B0=D1=88 =D0=BB=D0=BE=D0=B3=D0= =B8=D0=BD =D0=BF=D0=BE =D0=B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D1=83<= /li>
  • =D0=9A=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5: = =D0=9D=D0=B5=D1=82
3D""

=D0=9D=D0=B0=D0=B6=D0=B8=D0=BC=D0=B0=D0=B5=D0=BC =D0=BA=D0=BD=D0=BE=D0= =BF=D0=BA=D1=83 =C2=AB=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0= =B8 =D0=B0=D1=83=D1=82=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1= =86=D0=B8=D0=B8=C2=BB =D0=B8 =D0=B2=D0=B1=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC = =D0=B2=D0=B0=D1=88 =D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C =D0=BF=D0=BE =D0= =B4=D0=BE=D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D1=83.

3D""

=D0=94=D0=B0=D0=BB=D0=B5=D0=B5 =D0=BD=D0=B0=D0=B6=D0=B8=D0=BC=D0=B0=D0= =B5=D0=BC =D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83 =C2=AB=D0=9F=D0=BE=D0=B4=D0= =BA=D0=BB=D1=8E=D1=87=D0=B8=D1=82=D1=8C=C2=BB. =D0=95=D1=81=D0=BB=D0=B8 = =D0=B2=D1=81=D1=91 =D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=D0=B8 =D0=BF=D1=80= =D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE — =D1=83=D0=B2=D0=B8=D0= =B4=D0=B8=D1=82=D0=B5 =D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=B8=D1=87=D0= =BD=D0=BE=D0=B5 =D0=BE=D0=BA=D0=BD=D0=BE:

3D""

=


------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=jquery-latest.js Content-Type: application/javascript; charset=utf-8; name=jquery-latest.js Content-Location: http://code.jquery.com/jquery-latest.js Content-Transfer-Encoding: Base64 LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMTEuMQogKiBodHRw Oi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHA6 Ly9zaXp6bGVqcy5jb20vCiAqCiAqIENvcHlyaWdodCAyMDA1LCAyMDE0IGpRdWVy eSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVs ZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3Jn L2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNC0wNS0wMVQxNzo0MloKICovCgooZnVu Y3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHsKCglpZiAoIHR5cGVvZiBtb2R1bGUg PT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVj dCIgKSB7CgkJLy8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmly b25tZW50cyB3aGVyZSBhIHByb3BlciB3aW5kb3cgaXMgcHJlc2VudCwKCQkvLyBl eGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5CgkJLy8gRm9yIGVudmly b25tZW50cyB0aGF0IGRvIG5vdCBpbmhlcmVudGx5IHBvc3NlcyBhIHdpbmRvdyB3 aXRoIGEgZG9jdW1lbnQKCQkvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEg alF1ZXJ5LW1ha2luZyBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzCgkJLy8gVGhp cyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVh bCB3aW5kb3cKCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnki KSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8K CQltb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/CgkJCWZhY3Rvcnko IGdsb2JhbCwgdHJ1ZSApIDoKCQkJZnVuY3Rpb24oIHcgKSB7CgkJCQlpZiAoICF3 LmRvY3VtZW50ICkgewoJCQkJCXRocm93IG5ldyBFcnJvciggImpRdWVyeSByZXF1 aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiICk7CgkJCQl9CgkJCQlyZXR1 cm4gZmFjdG9yeSggdyApOwoJCQl9OwoJfSBlbHNlIHsKCQlmYWN0b3J5KCBnbG9i YWwgKTsKCX0KCi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQg eWV0Cn0odHlwZW9mIHdpbmRvdyAhPT0gInVuZGVmaW5lZCIgPyB3aW5kb3cgOiB0 aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHsKCi8vIENhbid0IGRv IHRoaXMgYmVjYXVzZSBzZXZlcmFsIGFwcHMgaW5jbHVkaW5nIEFTUC5ORVQgdHJh Y2UKLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQg RmlyZWZveCBkaWVzIGlmCi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCAidXNl IHN0cmljdCIgY2FsbCBjaGFpbnMuICgjMTMzMzUpCi8vIFN1cHBvcnQ6IEZpcmVm b3ggMTgrCi8vCgp2YXIgZGVsZXRlZElkcyA9IFtdOwoKdmFyIHNsaWNlID0gZGVs ZXRlZElkcy5zbGljZTsKCnZhciBjb25jYXQgPSBkZWxldGVkSWRzLmNvbmNhdDsK CnZhciBwdXNoID0gZGVsZXRlZElkcy5wdXNoOwoKdmFyIGluZGV4T2YgPSBkZWxl dGVkSWRzLmluZGV4T2Y7Cgp2YXIgY2xhc3MydHlwZSA9IHt9OwoKdmFyIHRvU3Ry aW5nID0gY2xhc3MydHlwZS50b1N0cmluZzsKCnZhciBoYXNPd24gPSBjbGFzczJ0 eXBlLmhhc093blByb3BlcnR5OwoKdmFyIHN1cHBvcnQgPSB7fTsKCgoKdmFyCgl2 ZXJzaW9uID0gIjEuMTEuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBq UXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsK CQkvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0 IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKCQkvLyBOZWVkIGluaXQgaWYgalF1ZXJ5 IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90 IGluY2x1ZGVkKQoJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9y LCBjb250ZXh0ICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBJRTw5 CgkvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1AKCXJ0cmltID0gL15b XHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAoKCS8vIE1hdGNoZXMg ZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZwoJcm1zUHJlZml4ID0gL14tbXMt LywKCXJkYXNoQWxwaGEgPSAvLShbXGRhLXpdKS9naSwKCgkvLyBVc2VkIGJ5IGpR dWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCglmY2FtZWxD YXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewoJCXJldHVybiBsZXR0ZXIu dG9VcHBlckNhc2UoKTsKCX07CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBl ID0gewoJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNl ZAoJanF1ZXJ5OiB2ZXJzaW9uLAoKCWNvbnN0cnVjdG9yOiBqUXVlcnksCgoJLy8g U3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8v IFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVu Z3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5j YWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhl IG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hl ZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBu dW0gKSB7CgkJcmV0dXJuIG51bSAhPSBudWxsID8KCgkJCS8vIFJldHVybiBqdXN0 IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXQKCQkJKCBudW0gPCAwID8gdGhp c1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdICkgOgoKCQkJLy8g UmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheQoJCQlzbGlj ZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVu dHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhl IG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbigg ZWxlbXMgKSB7CgoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1l bnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3Rv cigpLCBlbGVtcyApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUg c3RhY2sgKGFzIGEgcmVmZXJlbmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsK CQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKCgkJLy8gUmV0dXJuIHRoZSBu ZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBF eGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNo ZWQgc2V0LgoJLy8gKFlvdSBjYW4gc2VlZCB0aGUgYXJndW1lbnRzIHdpdGggYW4g YXJyYXkgb2YgYXJncywgYnV0IHRoaXMgaXMKCS8vIG9ubHkgdXNlZCBpbnRlcm5h bGx5LikKCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKCQlyZXR1 cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7Cgl9LAoKCW1h cDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFj ayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0 dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoK CXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNs aWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVu Y3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVu Y3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5j dGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSAr ICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBq ID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1tqXSBdIDogW10gKTsKCX0sCgoJZW5k OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMu Y29uc3RydWN0b3IobnVsbCk7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25s eS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2Ug YSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogcHVzaCwKCXNvcnQ6IGRlbGV0ZWRJZHMu c29ydCwKCXNwbGljZTogZGVsZXRlZElkcy5zcGxpY2UKfTsKCmpRdWVyeS5leHRl bmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgc3JjLCBj b3B5SXNBcnJheSwgY29weSwgbmFtZSwgb3B0aW9ucywgY2xvbmUsCgkJdGFyZ2V0 ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3Vt ZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAg Y29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4i ICkgewoJCWRlZXAgPSB0YXJnZXQ7CgoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5k IHRoZSB0YXJnZXQKCQl0YXJnZXQgPSBhcmd1bWVudHNbIGkgXSB8fCB7fTsKCQlp Kys7Cgl9CgoJLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcg b3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCglpZiAoIHR5cGVv ZiB0YXJnZXQgIT09ICJvYmplY3QiICYmICFqUXVlcnkuaXNGdW5jdGlvbih0YXJn ZXQpICkgewoJCXRhcmdldCA9IHt9OwoJfQoKCS8vIGV4dGVuZCBqUXVlcnkgaXRz ZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZAoJaWYgKCBpID09PSBs ZW5ndGggKSB7CgkJdGFyZ2V0ID0gdGhpczsKCQlpLS07Cgl9CgoJZm9yICggOyBp IDwgbGVuZ3RoOyBpKysgKSB7CgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwv dW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKG9wdGlvbnMgPSBhcmd1bWVudHNbIGkg XSkgIT0gbnVsbCApIHsKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlm b3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUg XTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBu ZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJ CQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJn aW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29w eSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJh eSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkgewoJCQkJCWlmICggY29weUlz QXJyYXkgKSB7CgkJCQkJCWNvcHlJc0FycmF5ID0gZmFsc2U7CgkJCQkJCWNsb25l ID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KHNyYykgPyBzcmMgOiBbXTsKCgkJCQkJ fSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmpl Y3Qoc3JjKSA/IHNyYyA6IHt9OwoJCQkJCX0KCgkJCQkJLy8gTmV2ZXIgbW92ZSBv cmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCgkJCQkJdGFyZ2V0WyBuYW1lIF0g PSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApOwoKCQkJCS8vIERv bid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCX0gZWxzZSBpZiAoIGNv cHkgIT09IHVuZGVmaW5lZCApIHsKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7 CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmpl Y3QKCXJldHVybiB0YXJnZXQ7Cn07CgpqUXVlcnkuZXh0ZW5kKHsKCS8vIFVuaXF1 ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZQoJZXhwYW5kbzog ImpRdWVyeSIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSgg L1xEL2csICIiICksCgoJLy8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0 IHRoZSByZWFkeSBtb2R1bGUKCWlzUmVhZHk6IHRydWUsCgoJZXJyb3I6IGZ1bmN0 aW9uKCBtc2cgKSB7CgkJdGhyb3cgbmV3IEVycm9yKCBtc2cgKTsKCX0sCgoJbm9v cDogZnVuY3Rpb24oKSB7fSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9y IGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lv biAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8g YXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4 KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVy eS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7Cgl9LAoKCWlzQXJyYXk6IEFycmF5 LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4galF1ZXJ5LnR5 cGUob2JqKSA9PT0gImFycmF5IjsKCX0sCgoJaXNXaW5kb3c6IGZ1bmN0aW9uKCBv YmogKSB7CgkJLyoganNoaW50IGVxZXFlcTogZmFsc2UgKi8KCQlyZXR1cm4gb2Jq ICE9IG51bGwgJiYgb2JqID09IG9iai53aW5kb3c7Cgl9LAoKCWlzTnVtZXJpYzog ZnVuY3Rpb24oIG9iaiApIHsKCQkvLyBwYXJzZUZsb2F0IE5hTnMgbnVtZXJpYy1j YXN0IGZhbHNlIHBvc2l0aXZlcyAobnVsbHx0cnVlfGZhbHNlfCIiKQoJCS8vIC4u LmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRp Y3VsYXJseSBoZXggbGl0ZXJhbHMgKCIweC4uLiIpCgkJLy8gc3VidHJhY3Rpb24g Zm9yY2VzIGluZmluaXRpZXMgdG8gTmFOCgkJcmV0dXJuICFqUXVlcnkuaXNBcnJh eSggb2JqICkgJiYgb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgPj0gMDsKCX0sCgoJ aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgbmFtZTsKCQlm b3IgKCBuYW1lIGluIG9iaiApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1 cm4gdHJ1ZTsKCX0sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsK CQl2YXIga2V5OwoKCQkvLyBNdXN0IGJlIGFuIE9iamVjdC4KCQkvLyBCZWNhdXNl IG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRo ZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS4KCQkvLyBNYWtlIHN1cmUgdGhhdCBET00g bm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMg d2VsbAoJCWlmICggIW9iaiB8fCBqUXVlcnkudHlwZShvYmopICE9PSAib2JqZWN0 IiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsK CQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdHJ5IHsKCQkJLy8gTm90IG93biBjb25z dHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdAoJCQlpZiAoIG9iai5jb25z dHJ1Y3RvciAmJgoJCQkJIWhhc093bi5jYWxsKG9iaiwgImNvbnN0cnVjdG9yIikg JiYKCQkJCSFoYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAi aXNQcm90b3R5cGVPZiIpICkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBj YXRjaCAoIGUgKSB7CgkJCS8vIElFOCw5IFdpbGwgdGhyb3cgZXhjZXB0aW9ucyBv biBjZXJ0YWluIGhvc3Qgb2JqZWN0cyAjOTg5NwoJCQlyZXR1cm4gZmFsc2U7CgkJ fQoKCQkvLyBTdXBwb3J0OiBJRTw5CgkJLy8gSGFuZGxlIGl0ZXJhdGlvbiBvdmVy IGluaGVyaXRlZCBwcm9wZXJ0aWVzIGJlZm9yZSBvd24gcHJvcGVydGllcy4KCQlp ZiAoIHN1cHBvcnQub3duTGFzdCApIHsKCQkJZm9yICgga2V5IGluIG9iaiApIHsK CQkJCXJldHVybiBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTsKCQkJfQoJCX0KCgkJ Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8g c3BlZWQgdXAsCgkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9w ZXJ0aWVzIGFyZSBvd24uCgkJZm9yICgga2V5IGluIG9iaiApIHt9CgoJCXJldHVy biBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTsK CX0sCgoJdHlwZTogZnVuY3Rpb24oIG9iaiApIHsKCQlpZiAoIG9iaiA9PSBudWxs ICkgewoJCQlyZXR1cm4gb2JqICsgIiI7CgkJfQoJCXJldHVybiB0eXBlb2Ygb2Jq ID09PSAib2JqZWN0IiB8fCB0eXBlb2Ygb2JqID09PSAiZnVuY3Rpb24iID8KCQkJ Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgIm9iamVjdCIgOgoJ CQl0eXBlb2Ygb2JqOwoJfSwKCgkvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBn bG9iYWwgY29udGV4dAoJLy8gV29ya2Fyb3VuZHMgYmFzZWQgb24gZmluZGluZ3Mg YnkgSmltIERyaXNjb2xsCgkvLyBodHRwOi8vd2VibG9ncy5qYXZhLm5ldC9ibG9n L2RyaXNjb2xsL2FyY2hpdmUvMjAwOS8wOS8wOC9ldmFsLWphdmFzY3JpcHQtZ2xv YmFsLWNvbnRleHQKCWdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCWlm ICggZGF0YSAmJiBqUXVlcnkudHJpbSggZGF0YSApICkgewoJCQkvLyBXZSB1c2Ug ZXhlY1NjcmlwdCBvbiBJbnRlcm5ldCBFeHBsb3JlcgoJCQkvLyBXZSB1c2UgYW4g YW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBpcyB3aW5kb3cKCQkJ Ly8gcmF0aGVyIHRoYW4galF1ZXJ5IGluIEZpcmVmb3gKCQkJKCB3aW5kb3cuZXhl Y1NjcmlwdCB8fCBmdW5jdGlvbiggZGF0YSApIHsKCQkJCXdpbmRvd1sgImV2YWwi IF0uY2FsbCggd2luZG93LCBkYXRhICk7CgkJCX0gKSggZGF0YSApOwoJCX0KCX0s CgoJLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBj c3MgYW5kIGRhdGEgbW9kdWxlcwoJLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1w IHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKQoJY2FtZWxDYXNlOiBmdW5jdGlv biggc3RyaW5nICkgewoJCXJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4 LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKCX0s CgoJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXJldHVybiBl bGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0g bmFtZS50b0xvd2VyQ2FzZSgpOwoJfSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5h bCB1c2FnZSBvbmx5CgllYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJn cyApIHsKCQl2YXIgdmFsdWUsCgkJCWkgPSAwLAoJCQlsZW5ndGggPSBvYmoubGVu Z3RoLAoJCQlpc0FycmF5ID0gaXNBcnJheWxpa2UoIG9iaiApOwoKCQlpZiAoIGFy Z3MgKSB7CgkJCWlmICggaXNBcnJheSApIHsKCQkJCWZvciAoIDsgaSA8IGxlbmd0 aDsgaSsrICkgewoJCQkJCXZhbHVlID0gY2FsbGJhY2suYXBwbHkoIG9ialsgaSBd LCBhcmdzICk7CgoJCQkJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoJCQkJCQli cmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCBpIGluIG9i aiApIHsKCQkJCQl2YWx1ZSA9IGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkgXSwgYXJn cyApOwoKCQkJCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7 CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBm b3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCgkJfSBlbHNlIHsKCQkJaWYg KCBpc0FycmF5ICkgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJ CQkJdmFsdWUgPSBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0g KTsKCgkJCQkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJ CQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIGkgaW4gb2JqICkgewoJ CQkJCXZhbHVlID0gY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBd ICk7CgoJCQkJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsK CQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1 cHBvcnQ6IEFuZHJvaWQ8NC4xLCBJRTw5Cgl0cmltOiBmdW5jdGlvbiggdGV4dCAp IHsKCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJIiIgOgoJCQkoIHRleHQgKyAi IiApLnJlcGxhY2UoIHJ0cmltLCAiIiApOwoJfSwKCgkvLyByZXN1bHRzIGlzIGZv ciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIs IHJlc3VsdHMgKSB7CgkJdmFyIHJldCA9IHJlc3VsdHMgfHwgW107CgoJCWlmICgg YXJyICE9IG51bGwgKSB7CgkJCWlmICggaXNBcnJheWxpa2UoIE9iamVjdChhcnIp ICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09 PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNl IHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJu IHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsK CQl2YXIgbGVuOwoKCQlpZiAoIGFyciApIHsKCQkJaWYgKCBpbmRleE9mICkgewoJ CQkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7CgkJCX0KCgkJ CWxlbiA9IGFyci5sZW5ndGg7CgkJCWkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCgg MCwgbGVuICsgaSApIDogaSA6IDA7CgoJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyAp IHsKCQkJCS8vIFNraXAgYWNjZXNzaW5nIGluIHNwYXJzZSBhcnJheXMKCQkJCWlm ICggaSBpbiBhcnIgJiYgYXJyWyBpIF0gPT09IGVsZW0gKSB7CgkJCQkJcmV0dXJu IGk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1 bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxl bmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCXdoaWxlICgg aiA8IGxlbiApIHsKCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQl9 CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBXb3JrYXJvdW5kIGNhc3Rpbmcgb2Yg Lmxlbmd0aCB0byBOYU4gb24gb3RoZXJ3aXNlIGFycmF5bGlrZSBvYmplY3RzIChl LmcuLCBOb2RlTGlzdHMpCgkJaWYgKCBsZW4gIT09IGxlbiApIHsKCQkJd2hpbGUg KCBzZWNvbmRbal0gIT09IHVuZGVmaW5lZCApIHsKCQkJCWZpcnN0WyBpKysgXSA9 IHNlY29uZFsgaisrIF07CgkJCX0KCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJ CXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxs YmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNo ZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJ Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBh cnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2 YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsK CQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7 CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsK CQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1 cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBv bmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2 YXIgdmFsdWUsCgkJCWkgPSAwLAoJCQlsZW5ndGggPSBlbGVtcy5sZW5ndGgsCgkJ CWlzQXJyYXkgPSBpc0FycmF5bGlrZSggZWxlbXMgKSwKCQkJcmV0ID0gW107CgoJ CS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRo ZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzCgkJaWYgKCBpc0FycmF5ICkgewoJ CQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCXZhbHVlID0gY2FsbGJh Y2soIGVsZW1zWyBpIF0sIGksIGFyZyApOwoKCQkJCWlmICggdmFsdWUgIT0gbnVs bCApIHsKCQkJCQlyZXQucHVzaCggdmFsdWUgKTsKCQkJCX0KCQkJfQoKCQkvLyBH byB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LAoJCX0gZWxzZSB7CgkJ CWZvciAoIGkgaW4gZWxlbXMgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVt c1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJ CQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEZsYXR0 ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlyZXR1cm4gY29uY2F0LmFwcGx5KCBbXSwg cmV0ICk7Cgl9LAoKCS8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0 cwoJZ3VpZDogMSwKCgkvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBv cHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnkKCS8vIGFyZ3VtZW50cy4K CXByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7CgkJdmFyIGFyZ3MsIHBy b3h5LCB0bXA7CgoJCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkg ewoJCQl0bXAgPSBmblsgY29udGV4dCBdOwoJCQljb250ZXh0ID0gZm47CgkJCWZu ID0gdG1wOwoJCX0KCgkJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRh cmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCQkvLyB0aGlzIHRocm93cyBh IFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLgoJ CWlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCBmbiApICkgewoJCQlyZXR1cm4gdW5k ZWZpbmVkOwoJCX0KCgkJLy8gU2ltdWxhdGVkIGJpbmQKCQlhcmdzID0gc2xpY2Uu Y2FsbCggYXJndW1lbnRzLCAyICk7CgkJcHJveHkgPSBmdW5jdGlvbigpIHsKCQkJ cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBz bGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7CgkJfTsKCgkJLy8gU2V0IHRoZSBn dWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhh bmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1 aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJCXJldHVybiBwcm94eTsK CX0sCgoJbm93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKyggbmV3IERhdGUoKSAp OwoJfSwKCgkvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1 dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXIKCS8vIHByb3BlcnRpZXMgdG8g aXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuCglzdXBwb3J0OiBzdXBwb3J0Cn0pOwoK Ly8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCJCb29s ZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2Jq ZWN0IEVycm9yIi5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CgljbGFz czJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2Vy Q2FzZSgpOwp9KTsKCmZ1bmN0aW9uIGlzQXJyYXlsaWtlKCBvYmogKSB7Cgl2YXIg bGVuZ3RoID0gb2JqLmxlbmd0aCwKCQl0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiAp OwoKCWlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCBqUXVlcnkuaXNXaW5kb3co IG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglpZiAoIG9iai5ub2RlVHlw ZSA9PT0gMSAmJiBsZW5ndGggKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcmV0dXJu IHR5cGUgPT09ICJhcnJheSIgfHwgbGVuZ3RoID09PSAwIHx8CgkJdHlwZW9mIGxl bmd0aCA9PT0gIm51bWJlciIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEg KSBpbiBvYmo7Cn0KdmFyIFNpenpsZSA9Ci8qIQogKiBTaXp6bGUgQ1NTIFNlbGVj dG9yIEVuZ2luZSB2MS4xMC4xOQogKiBodHRwOi8vc2l6emxlanMuY29tLwogKgog KiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiBhbmQgb3Ro ZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5z ZQogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IDIwMTQt MDQtMTgKICovCihmdW5jdGlvbiggd2luZG93ICkgewoKdmFyIGksCglzdXBwb3J0 LAoJRXhwciwKCWdldFRleHQsCglpc1hNTCwKCXRva2VuaXplLAoJY29tcGlsZSwK CXNlbGVjdCwKCW91dGVybW9zdENvbnRleHQsCglzb3J0SW5wdXQsCgloYXNEdXBs aWNhdGUsCgoJLy8gTG9jYWwgZG9jdW1lbnQgdmFycwoJc2V0RG9jdW1lbnQsCglk b2N1bWVudCwKCWRvY0VsZW0sCglkb2N1bWVudElzSFRNTCwKCXJidWdneVFTQSwK CXJidWdneU1hdGNoZXMsCgltYXRjaGVzLAoJY29udGFpbnMsCgoJLy8gSW5zdGFu Y2Utc3BlY2lmaWMgZGF0YQoJZXhwYW5kbyA9ICJzaXp6bGUiICsgLShuZXcgRGF0 ZSgpKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMg PSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRv a2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0 ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAo IGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVy biAwOwoJfSwKCgkvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzCglzdHJ1bmRl ZmluZWQgPSB0eXBlb2YgdW5kZWZpbmVkLAoJTUFYX05FR0FUSVZFID0gMSA8PCAz MSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blBy b3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUg PSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNl LAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGlmIHdlIGNhbid0IHVz ZSBhIG5hdGl2ZSBvbmUKCWluZGV4T2YgPSBhcnIuaW5kZXhPZiB8fCBmdW5jdGlv biggZWxlbSApIHsKCQl2YXIgaSA9IDAsCgkJCWxlbiA9IHRoaXMubGVuZ3RoOwoJ CWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQlpZiAoIHRoaXNbaV0gPT09IGVs ZW0gKSB7CgkJCQlyZXR1cm4gaTsKCQkJfQoJCX0KCQlyZXR1cm4gLTE7Cgl9LAoK CWJvb2xlYW5zID0gImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1 dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29w fG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIiwKCgkvLyBS ZWd1bGFyIGV4cHJlc3Npb25zCgoJLy8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0 dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3 aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoJLy8gaHR0cDovL3d3 dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2NoYXJhY3RlcnMKCWNoYXJhY3RlckVu Y29kaW5nID0gIig/OlxcXFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIiwKCgkv LyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVycwoJ Ly8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIg aHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI2F0dHJpYnV0ZS1z ZWxlY3RvcnMKCS8vIFByb3BlciBzeW50YXg6IGh0dHA6Ly93d3cudzMub3JnL1RS L0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRp ZmllciA9IGNoYXJhY3RlckVuY29kaW5nLnJlcGxhY2UoICJ3IiwgIncjIiApLAoK CS8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3Nl bGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycwoJYXR0cmlidXRlcyA9ICJcXFsi ICsgd2hpdGVzcGFjZSArICIqKCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86 IiArIHdoaXRlc3BhY2UgKwoJCS8vIE9wZXJhdG9yIChjYXB0dXJlIDIpCgkJIioo WypeJHwhfl0/PSkiICsgd2hpdGVzcGFjZSArCgkJLy8gIkF0dHJpYnV0ZSB2YWx1 ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5n cyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF0iCgkJIiooPzonKCg/OlxcXFwufFte XFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIiArIGlkZW50 aWZpZXIgKyAiKSl8KSIgKyB3aGl0ZXNwYWNlICsKCQkiKlxcXSIsCgoJcHNldWRv cyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKCIgKwoJCS8v IFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2Vu aXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4g cXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIign KCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilc Iil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxb XlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBh bnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJ Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwg Y2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRp bmcgdGhlIGxhdHRlcgoJcnRyaW0gPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNw YWNlICsgIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIgKyB3aGl0ZXNwYWNl ICsgIiskIiwgImciICksCgoJcmNvbW1hID0gbmV3IFJlZ0V4cCggIl4iICsgd2hp dGVzcGFjZSArICIqLCIgKyB3aGl0ZXNwYWNlICsgIioiICksCglyY29tYmluYXRv cnMgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiooWz4rfl18IiAr IHdoaXRlc3BhY2UgKyAiKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCgoJcmF0dHJp YnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoICI9IiArIHdoaXRlc3BhY2UgKyAiKihb XlxcXSdcIl0qPykiICsgd2hpdGVzcGFjZSArICIqXFxdIiwgImciICksCgoJcnBz ZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSwKCXJpZGVudGlmaWVyID0gbmV3 IFJlZ0V4cCggIl4iICsgaWRlbnRpZmllciArICIkIiApLAoKCW1hdGNoRXhwciA9 IHsKCQkiSUQiOiBuZXcgUmVnRXhwKCAiXiMoIiArIGNoYXJhY3RlckVuY29kaW5n ICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGNoYXJh Y3RlckVuY29kaW5nICsgIikiICksCgkJIlRBRyI6IG5ldyBSZWdFeHAoICJeKCIg KyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3KiIgKSArICIpIiAp LAoJCSJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAoJCSJQ U0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCgkJIkNISUxEIjog bmV3IFJlZ0V4cCggIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShj aGlsZHxvZi10eXBlKSg/OlxcKCIgKyB3aGl0ZXNwYWNlICsKCQkJIiooZXZlbnxv ZGR8KChbKy1dfCkoXFxkKilufCkiICsgd2hpdGVzcGFjZSArICIqKD86KFsrLV18 KSIgKyB3aGl0ZXNwYWNlICsKCQkJIiooXFxkKyl8KSkiICsgd2hpdGVzcGFjZSAr ICIqXFwpfCkiLCAiaSIgKSwKCQkiYm9vbCI6IG5ldyBSZWdFeHAoICJeKD86IiAr IGJvb2xlYW5zICsgIikkIiwgImkiICksCgkJLy8gRm9yIHVzZSBpbiBsaWJyYXJp ZXMgaW1wbGVtZW50aW5nIC5pcygpCgkJLy8gV2UgdXNlIHRoaXMgZm9yIFBPUyBt YXRjaGluZyBpbiBgc2VsZWN0YAoJCSJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhw KCAiXiIgKyB3aGl0ZXNwYWNlICsgIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0 fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIgKwoJCQl3aGl0ZXNwYWNlICsgIiooKD86 LVxcZCk/XFxkKikiICsgd2hpdGVzcGFjZSArICIqXFwpfCkoPz1bXi1dfCQpIiwg ImkiICkKCX0sCgoJcmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVh fGJ1dHRvbikkL2ksCglyaGVhZGVyID0gL15oXGQkL2ksCgoJcm5hdGl2ZSA9IC9e W157XStce1xzKlxbbmF0aXZlIFx3LywKCgkvLyBFYXNpbHktcGFyc2VhYmxlL3Jl dHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnMKCXJxdWlja0V4 cHIgPSAvXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLAoKCXJzaWJs aW5nID0gL1srfl0vLAoJcmVzY2FwZSA9IC8nfFxcL2csCgoJLy8gQ1NTIGVzY2Fw ZXMgaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2Fw ZWQtY2hhcmFjdGVycwoJcnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggIlxcXFwoW1xc ZGEtZl17MSw2fSIgKyB3aGl0ZXNwYWNlICsgIj98KCIgKyB3aGl0ZXNwYWNlICsg Iil8LikiLCAiaWciICksCglmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBl ZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7CgkJdmFyIGhpZ2ggPSAiMHgiICsgZXNj YXBlZCAtIDB4MTAwMDA7CgkJLy8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnQKCQkv LyBTdXBwb3J0OiBGaXJlZm94PDI0CgkJLy8gV29ya2Fyb3VuZCBlcnJvbmVvdXMg bnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArIjB4IgoJCXJldHVybiBoaWdoICE9 PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID8KCQkJZXNjYXBlZCA6CgkJCWhp Z2ggPCAwID8KCQkJCS8vIEJNUCBjb2RlcG9pbnQKCQkJCVN0cmluZy5mcm9tQ2hh ckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOgoJCQkJLy8gU3VwcGxlbWVudGFsIFBs YW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpCgkJCQlTdHJpbmcuZnJvbUNo YXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERD MDAgKTsKCX07CgovLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxp c3QgKQp0cnkgewoJcHVzaC5hcHBseSgKCQkoYXJyID0gc2xpY2UuY2FsbCggcHJl ZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksCgkJcHJlZmVycmVkRG9jLmNoaWxkTm9k ZXMKCSk7CgkvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMAoJLy8gRGV0ZWN0IHNpbGVu dGx5IGZhaWxpbmcgcHVzaC5hcHBseQoJYXJyWyBwcmVmZXJyZWREb2MuY2hpbGRO b2Rlcy5sZW5ndGggXS5ub2RlVHlwZTsKfSBjYXRjaCAoIGUgKSB7CglwdXNoID0g eyBhcHBseTogYXJyLmxlbmd0aCA/CgoJCS8vIExldmVyYWdlIHNsaWNlIGlmIHBv c3NpYmxlCgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQlwdXNoX25hdGl2 ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTsKCQl9IDoKCgkJLy8g U3VwcG9ydDogSUU8OQoJCS8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHkKCQlm dW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7CgkJCXZhciBqID0gdGFyZ2V0Lmxlbmd0 aCwKCQkJCWkgPSAwOwoJCQkvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGgK CQkJd2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fQoJCQl0YXJn ZXQubGVuZ3RoID0gaiAtIDE7CgkJfQoJfTsKfQoKZnVuY3Rpb24gU2l6emxlKCBz ZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKCXZhciBtYXRjaCwg ZWxlbSwgbSwgbm9kZVR5cGUsCgkJLy8gUVNBIHZhcnMKCQlpLCBncm91cHMsIG9s ZCwgbmlkLCBuZXdDb250ZXh0LCBuZXdTZWxlY3RvcjsKCglpZiAoICggY29udGV4 dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVk RG9jICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7 Cgl9CgoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CglyZXN1bHRzID0g cmVzdWx0cyB8fCBbXTsKCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0 b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCWlmICgg KG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZSkgIT09IDEgJiYgbm9kZVR5cGUg IT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWlmICggZG9jdW1lbnRJc0hUTUwg JiYgIXNlZWQgKSB7CgoJCS8vIFNob3J0Y3V0cwoJCWlmICggKG1hdGNoID0gcnF1 aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHsKCQkJLy8gU3BlZWQtdXA6IFNp enpsZSgiI0lEIikKCQkJaWYgKCAobSA9IG1hdGNoWzFdKSApIHsKCQkJCWlmICgg bm9kZVR5cGUgPT09IDkgKSB7CgkJCQkJZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVu dEJ5SWQoIG0gKTsKCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdo ZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwoJCQkJCS8vIG5vZGVzIHRoYXQgYXJl IG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKGpRdWVyeSAjNjk2MykKCQkJCQlp ZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQkvLyBIYW5kbGUg dGhlIGNhc2Ugd2hlcmUgSUUsIE9wZXJhLCBhbmQgV2Via2l0IHJldHVybiBpdGVt cwoJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJaWYgKCBlbGVt LmlkID09PSBtICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJ CQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCXJl dHVybiByZXN1bHRzOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJLy8gQ29udGV4 dCBpcyBub3QgYSBkb2N1bWVudAoJCQkJCWlmICggY29udGV4dC5vd25lckRvY3Vt ZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRC eUlkKCBtICkpICYmCgkJCQkJCWNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiYg ZWxlbS5pZCA9PT0gbSApIHsKCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJ CQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0KCQkJCX0KCgkJCS8vIFNwZWVkLXVw OiBTaXp6bGUoIlRBRyIpCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzJdICkgewoJCQkJ cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFt ZSggc2VsZWN0b3IgKSApOwoJCQkJcmV0dXJuIHJlc3VsdHM7CgoJCQkvLyBTcGVl ZC11cDogU2l6emxlKCIuQ0xBU1MiKQoJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNo WzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgY29udGV4 dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkgewoJCQkJcHVzaC5hcHBseSggcmVz dWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTsKCQkJ CXJldHVybiByZXN1bHRzOwoJCQl9CgkJfQoKCQkvLyBRU0EgcGF0aAoJCWlmICgg c3VwcG9ydC5xc2EgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBz ZWxlY3RvciApKSApIHsKCQkJbmlkID0gb2xkID0gZXhwYW5kbzsKCQkJbmV3Q29u dGV4dCA9IGNvbnRleHQ7CgkJCW5ld1NlbGVjdG9yID0gbm9kZVR5cGUgPT09IDkg JiYgc2VsZWN0b3I7CgoJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1l bnQtcm9vdGVkIHF1ZXJpZXMKCQkJLy8gV2UgY2FuIHdvcmsgYXJvdW5kIHRoaXMg Ynkgc3BlY2lmeWluZyBhbiBleHRyYSBJRCBvbiB0aGUgcm9vdAoJCQkvLyBhbmQg d29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBm b3IgdGhlIHRlY2huaXF1ZSkKCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2Jq ZWN0IGVsZW1lbnRzCgkJCWlmICggbm9kZVR5cGUgPT09IDEgJiYgY29udGV4dC5u b2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAib2JqZWN0IiApIHsKCQkJCWdyb3Vw cyA9IHRva2VuaXplKCBzZWxlY3RvciApOwoKCQkJCWlmICggKG9sZCA9IGNvbnRl eHQuZ2V0QXR0cmlidXRlKCJpZCIpKSApIHsKCQkJCQluaWQgPSBvbGQucmVwbGFj ZSggcmVzY2FwZSwgIlxcJCYiICk7CgkJCQl9IGVsc2UgewoJCQkJCWNvbnRleHQu c2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKCQkJCX0KCQkJCW5pZCA9ICJbaWQ9 JyIgKyBuaWQgKyAiJ10gIjsKCgkJCQlpID0gZ3JvdXBzLmxlbmd0aDsKCQkJCXdo aWxlICggaS0tICkgewoJCQkJCWdyb3Vwc1tpXSA9IG5pZCArIHRvU2VsZWN0b3Io IGdyb3Vwc1tpXSApOwoJCQkJfQoJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRl c3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9k ZSApIHx8IGNvbnRleHQ7CgkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCIs Iik7CgkJCX0KCgkJCWlmICggbmV3U2VsZWN0b3IgKSB7CgkJCQl0cnkgewoJCQkJ CXB1c2guYXBwbHkoIHJlc3VsdHMsCgkJCQkJCW5ld0NvbnRleHQucXVlcnlTZWxl Y3RvckFsbCggbmV3U2VsZWN0b3IgKQoJCQkJCSk7CgkJCQkJcmV0dXJuIHJlc3Vs dHM7CgkJCQl9IGNhdGNoKHFzYUVycm9yKSB7CgkJCQl9IGZpbmFsbHkgewoJCQkJ CWlmICggIW9sZCApIHsKCQkJCQkJY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImlk Iik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIEFsbCBvdGhlcnMKCXJl dHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksIGNv bnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKfQoKLyoqCiAqIENyZWF0ZSBrZXktdmFs dWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZQogKiBAcmV0dXJucyB7RnVuY3Rpb24o c3RyaW5nLCBPYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBz dG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoCiAqCXByb3BlcnR5IG5hbWUgdGhlIChz cGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdl ciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpCiAqCWRlbGV0aW5nIHRoZSBvbGRlc3Qg ZW50cnkKICovCmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkgewoJdmFyIGtleXMgPSBb XTsKCglmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHsKCQkvLyBVc2UgKGtl eSArICIgIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlw ZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1NykKCQlpZiAoIGtleXMucHVzaCgg a2V5ICsgIiAiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgewoJCQkvLyBPbmx5IGtl ZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXMKCQkJZGVsZXRlIGNhY2hlWyBrZXlz LnNoaWZ0KCkgXTsKCQl9CgkJcmV0dXJuIChjYWNoZVsga2V5ICsgIiAiIF0gPSB2 YWx1ZSk7Cgl9CglyZXR1cm4gY2FjaGU7Cn0KCi8qKgogKiBNYXJrIGEgZnVuY3Rp b24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZQogKiBAcGFyYW0ge0Z1bmN0aW9u fSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFyawogKi8KZnVuY3Rpb24gbWFya0Z1bmN0 aW9uKCBmbiApIHsKCWZuWyBleHBhbmRvIF0gPSB0cnVlOwoJcmV0dXJuIGZuOwp9 CgovKioKICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnQKICogQHBh cmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhw ZWN0cyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkg ewoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCXRy eSB7CgkJcmV0dXJuICEhZm4oIGRpdiApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVy biBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVu dCBieSBkZWZhdWx0CgkJaWYgKCBkaXYucGFyZW50Tm9kZSApIHsKCQkJZGl2LnBh cmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApOwoJCX0KCQkvLyByZWxlYXNlIG1l bW9yeSBpbiBJRQoJCWRpdiA9IG51bGw7Cgl9Cn0KCi8qKgogKiBBZGRzIHRoZSBz YW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzCiAqIEBw YXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJp YnV0ZXMKICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRo YXQgd2lsbCBiZSBhcHBsaWVkCiAqLwpmdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJz LCBoYW5kbGVyICkgewoJdmFyIGFyciA9IGF0dHJzLnNwbGl0KCJ8IiksCgkJaSA9 IGF0dHJzLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5k bGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1 bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBh CiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1 cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAg aWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiAp IHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBl ID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJKCB+Yi5zb3VyY2VJbmRl eCB8fCBNQVhfTkVHQVRJVkUgKSAtCgkJCSggfmEuc291cmNlSW5kZXggfHwgTUFY X05FR0FUSVZFICk7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJs ZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9 CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxl ICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBi ICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6 IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1 ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8K ZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVu Y3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93 ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBl ID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1 c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlw ZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0 dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFt ZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBu YW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoK LyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3Ig cG9zaXRpb25hbHMKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4KICovCmZ1bmN0aW9u IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkgewoJcmV0dXJuIG1hcmtGdW5j dGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7CgkJYXJndW1lbnQgPSArYXJndW1l bnQ7CgkJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hl cyApIHsKCQkJdmFyIGosCgkJCQltYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQu bGVuZ3RoLCBhcmd1bWVudCApLAoJCQkJaSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7 CgoJCQkvLyBNYXRjaCBlbGVtZW50cyBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGlu ZGV4ZXMKCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQlpZiAoIHNlZWRbIChqID0gbWF0 Y2hJbmRleGVzW2ldKSBdICkgewoJCQkJCXNlZWRbal0gPSAhKG1hdGNoZXNbal0g PSBzZWVkW2pdKTsKCQkJCX0KCQkJfQoJCX0pOwoJfSk7Cn0KCi8qKgogKiBDaGVj a3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIFNpenpsZSBjb250ZXh0CiAqIEBw YXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0CiAqIEByZXR1cm5zIHtFbGVt ZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxl LCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZQogKi8KZnVuY3Rpb24gdGVzdENvbnRl eHQoIGNvbnRleHQgKSB7CglyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4 dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gc3RydW5kZWZpbmVkICYmIGNvbnRl eHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1 cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1M IG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVu dCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBl bGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlz WE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMg dmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0Cgkv LyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBk b2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwg ZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/ IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07 CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJh c2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxP YmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVz ZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVy bnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxl LnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFy ZSwKCQlkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBw cmVmZXJyZWREb2MsCgkJcGFyZW50ID0gZG9jLmRlZmF1bHRWaWV3OwoKCS8vIElm IG5vIGRvY3VtZW50IGFuZCBkb2N1bWVudEVsZW1lbnQgaXMgYXZhaWxhYmxlLCBy ZXR1cm4KCWlmICggZG9jID09PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09 IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7CgkJcmV0dXJuIGRvY3VtZW50 OwoJfQoKCS8vIFNldCBvdXIgZG9jdW1lbnQKCWRvY3VtZW50ID0gZG9jOwoJZG9j RWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJLy8gU3VwcG9ydCB0ZXN0cwoJ ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvYyApOwoKCS8vIFN1cHBvcnQ6IElF PjgKCS8vIElmIGlmcmFtZSBkb2N1bWVudCBpcyBhc3NpZ25lZCB0byAiZG9jdW1l bnQiIHZhcmlhYmxlIGFuZCBpZiBpZnJhbWUgaGFzIGJlZW4gcmVsb2FkZWQsCgkv LyBJRSB3aWxsIHRocm93ICJwZXJtaXNzaW9uIGRlbmllZCIgZXJyb3Igd2hlbiBh Y2Nlc3NpbmcgImRvY3VtZW50IiB2YXJpYWJsZSwgc2VlIGpRdWVyeSAjMTM5MzYK CS8vIElFNi04IGRvIG5vdCBzdXBwb3J0IHRoZSBkZWZhdWx0VmlldyBwcm9wZXJ0 eSBzbyBwYXJlbnQgd2lsbCBiZSB1bmRlZmluZWQKCWlmICggcGFyZW50ICYmIHBh cmVudCAhPT0gcGFyZW50LnRvcCApIHsKCQkvLyBJRTExIGRvZXMgbm90IGhhdmUg YXR0YWNoRXZlbnQsIHNvIGFsbCBtdXN0IHN1ZmZlcgoJCWlmICggcGFyZW50LmFk ZEV2ZW50TGlzdGVuZXIgKSB7CgkJCXBhcmVudC5hZGRFdmVudExpc3RlbmVyKCAi dW5sb2FkIiwgZnVuY3Rpb24oKSB7CgkJCQlzZXREb2N1bWVudCgpOwoJCQl9LCBm YWxzZSApOwoJCX0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCApIHsKCQkJ cGFyZW50LmF0dGFjaEV2ZW50KCAib251bmxvYWQiLCBmdW5jdGlvbigpIHsKCQkJ CXNldERvY3VtZW50KCk7CgkJCX0pOwoJCX0KCX0KCgkvKiBBdHRyaWJ1dGVzCgkt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gU3VwcG9ydDogSUU8OAoJLy8g VmVyaWZ5IHRoYXQgZ2V0QXR0cmlidXRlIHJlYWxseSByZXR1cm5zIGF0dHJpYnV0 ZXMgYW5kIG5vdCBwcm9wZXJ0aWVzIChleGNlcHRpbmcgSUU4IGJvb2xlYW5zKQoJ c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJ ZGl2LmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUo ImNsYXNzTmFtZSIpOwoJfSk7CgoJLyogZ2V0RWxlbWVudChzKUJ5KgoJLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlU YWdOYW1lKCIqIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzCglzdXBwb3J0LmdldEVs ZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJZGl2 LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlQ29tbWVudCgiIikgKTsKCQlyZXR1cm4g IWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aDsKCX0pOwoKCS8v IENoZWNrIGlmIGdldEVsZW1lbnRzQnlDbGFzc05hbWUgY2FuIGJlIHRydXN0ZWQK CXN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCgg ZG9jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSAmJiBhc3NlcnQoZnVuY3Rpb24o IGRpdiApIHsKCQlkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J2EnPjwvZGl2 PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IjsKCgkJLy8gU3VwcG9ydDogU2FmYXJp PDQKCQkvLyBDYXRjaCBjbGFzcyBvdmVyLWNhY2hpbmcKCQlkaXYuZmlyc3RDaGls ZC5jbGFzc05hbWUgPSAiaSI7CgkJLy8gU3VwcG9ydDogT3BlcmE8MTAKCQkvLyBD YXRjaCBnRUJDTiBmYWlsdXJlIHRvIGZpbmQgbm9uLWxlYWRpbmcgY2xhc3NlcwoJ CXJldHVybiBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aCA9 PT0gMjsKCX0pOwoKCS8vIFN1cHBvcnQ6IElFPDEwCgkvLyBDaGVjayBpZiBnZXRF bGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUKCS8vIFRoZSBicm9r ZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1h dGljYWxseS1zZXQgbmFtZXMsCgkvLyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVs ZW1lbnRzQnlOYW1lIHRlc3QKCXN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5j dGlvbiggZGl2ICkgewoJCWRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0g ZXhwYW5kbzsKCQlyZXR1cm4gIWRvYy5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9j LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoOwoJfSk7CgoJLy8g SUQgZmluZCBhbmQgZmlsdGVyCglpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHsKCQlF eHByLmZpbmRbIklEIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7CgkJCWlm ICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IHN0cnVuZGVmaW5l ZCAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBtID0gY29udGV4dC5nZXRF bGVtZW50QnlJZCggaWQgKTsKCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0 Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkvLyBub2RlcyB0aGF0 IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQlyZXR1cm4g bSAmJiBtLnBhcmVudE5vZGUgPyBbIG0gXSA6IFtdOwoJCQl9CgkJfTsKCQlFeHBy LmZpbHRlclsiSUQiXSA9IGZ1bmN0aW9uKCBpZCApIHsKCQkJdmFyIGF0dHJJZCA9 IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBm dW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgi aWQiKSA9PT0gYXR0cklkOwoJCQl9OwoJCX07Cgl9IGVsc2UgewoJCS8vIFN1cHBv cnQ6IElFNi83CgkJLy8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFz IGEgZmluZCBzaG9ydGN1dAoJCWRlbGV0ZSBFeHByLmZpbmRbIklEIl07CgoJCUV4 cHIuZmlsdGVyWyJJRCJdID0gIGZ1bmN0aW9uKCBpZCApIHsKCQkJdmFyIGF0dHJJ ZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVy biBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0u Z2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0 cmlidXRlTm9kZSgiaWQiKTsKCQkJCXJldHVybiBub2RlICYmIG5vZGUudmFsdWUg PT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJU QUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9u KCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxl bWVudHNCeVRhZ05hbWUgIT09IHN0cnVuZGVmaW5lZCApIHsKCQkJCXJldHVybiBj b250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKCQkJfQoJCX0gOgoJ CWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCXZhciBlbGVtLAoJCQkJdG1w ID0gW10sCgkJCQlpID0gMCwKCQkJCXJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1l bnRzQnlUYWdOYW1lKCB0YWcgKTsKCgkJCS8vIEZpbHRlciBvdXQgcG9zc2libGUg Y29tbWVudHMKCQkJaWYgKCB0YWcgPT09ICIqIiApIHsKCQkJCXdoaWxlICggKGVs ZW0gPSByZXN1bHRzW2krK10pICkgewoJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9 PT0gMSApIHsKCQkJCQkJdG1wLnB1c2goIGVsZW0gKTsKCQkJCQl9CgkJCQl9CgoJ CQkJcmV0dXJuIHRtcDsKCQkJfQoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoKCS8v IENsYXNzCglFeHByLmZpbmRbIkNMQVNTIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRz QnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHsK CQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09 IHN0cnVuZGVmaW5lZCAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJcmV0dXJuIGNv bnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7CgkJfQoJ fTsKCgkvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yCgktLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tICovCgoJLy8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydAoKCS8v IG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1 ZSAoSUU5L09wZXJhIDExLjUpCglyYnVnZ3lNYXRjaGVzID0gW107CgoJLy8gcVNh KDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSkKCS8v IFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRo cm93cyBhbiBlcnJvcgoJLy8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1l bnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZQoJLy8gU28sIHdlIGFsbG93IDpm b2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0 aGUgSUUgZXJyb3IKCS8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tl dC8xMzM3OAoJcmJ1Z2d5UVNBID0gW107CgoJaWYgKCAoc3VwcG9ydC5xc2EgPSBy bmF0aXZlLnRlc3QoIGRvYy5xdWVyeVNlbGVjdG9yQWxsICkpICkgewoJCS8vIEJ1 aWxkIFFTQSByZWdleAoJCS8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBE aWVnbyBQZXJpbmkKCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKCQkJLy8gU2Vs ZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlz IGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJ Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNp bmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHA6Ly9i dWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5CgkJCWRpdi5pbm5lckhUTUwgPSAi PHNlbGVjdCBtc2FsbG93Y2xpcD0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0 aW9uPjwvc2VsZWN0PiI7CgoJCQkvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEy LjE2CgkJCS8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkg c3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj0KCQkJLy8gVGhlIHRlc3QgYXR0 cmlidXRlIG11c3QgYmUgdW5rbm93biBpbiBPcGVyYSBidXQgInNhZmUiIGZvciBX aW5SVAoJCQkvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJh cnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGRp di5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NsaXBePScnXSIpLmxlbmd0aCAp IHsKCQkJCXJidWdneVFTQS5wdXNoKCAiWypeJF09IiArIHdoaXRlc3BhY2UgKyAi Kig/OicnfFwiXCIpIiApOwoJCQl9CgoJCQkvLyBTdXBwb3J0OiBJRTgKCQkJLy8g Qm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCAidmFsdWUiIGFyZSBub3QgdHJlYXRlZCBj b3JyZWN0bHkKCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3Rl ZF0iKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIlxcWyIgKyB3aGl0 ZXNwYWNlICsgIiooPzp2YWx1ZXwiICsgYm9vbGVhbnMgKyAiKSIgKTsKCQkJfQoK CQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxl Y3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIv MjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8g SUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVz dHMKCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVu Z3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7CgkJCX0KCQl9 KTsKCgkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJCS8vIFN1cHBvcnQ6IFdp bmRvd3MgOCBOYXRpdmUgQXBwcwoJCQkvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRy aWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1l bnQKCQkJdmFyIGlucHV0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CgkJ CWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAiaGlkZGVuIiApOwoJCQlkaXYu YXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiAp OwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRp dml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGRpdi5xdWVyeVNlbGVjdG9y QWxsKCJbbmFtZT1kXSIpLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCAi bmFtZSIgKyB3aGl0ZXNwYWNlICsgIipbKl4kfCF+XT89IiApOwoJCQl9CgoJCQkv LyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50 cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQoJCQkvLyBJRTgg dGhyb3dzIGVycm9yIGhlcmUgYW5kIHdpbGwgbm90IHNlZSBsYXRlciB0ZXN0cwoJ CQlpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgg KSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIg KTsKCQkJfQoKCQkJLy8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9z dC1jb21tYSBpbnZhbGlkIHBzZXVkb3MKCQkJZGl2LnF1ZXJ5U2VsZWN0b3JBbGwo IiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglp ZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1h dGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNo ZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJ ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNT ZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZGl2ICkgewoJCQkv LyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2Vs ZWN0b3IKCQkJLy8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSkKCQkJc3Vw cG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZGl2LCAiZGl2 IiApOwoKCQkJLy8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgoJ CQkvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFk CgkJCW1hdGNoZXMuY2FsbCggZGl2LCAiW3MhPScnXTp4IiApOwoJCQlyYnVnZ3lN YXRjaGVzLnB1c2goICIhPSIsIHBzZXVkb3MgKTsKCQl9KTsKCX0KCglyYnVnZ3lR U0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5q b2luKCJ8IikgKTsKCXJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0 aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oInwiKSApOwoKCS8q IENvbnRhaW5zCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgloYXNDb21wYXJl ID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9u ICk7CgoJLy8gRWxlbWVudCBjb250YWlucyBhbm90aGVyCgkvLyBQdXJwb3NlZnVs bHkgZG9lcyBub3QgaW1wbGVtZW50IGluY2x1c2l2ZSBkZXNjZW5kZW50CgkvLyBB cyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFp bnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlu cyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2Rl VHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIg JiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAg JiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8K CQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3Vt ZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkg JiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBi ICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYg KCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJ CX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNv cnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8v IEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJ CQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNv cnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29t cGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVE b2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJ aWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENh bGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNh bWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSAp ID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1 bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhl eSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2Rl cwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hl ZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUp ICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVs YXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9j IHx8IGEub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5z KHByZWZlcnJlZERvYywgYSkgKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJaWYg KCBiID09PSBkb2MgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2Mg JiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHsKCQkJCXJldHVybiAxOwoJ CQl9CgoJCQkvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRlcgoJCQlyZXR1cm4gc29y dElucHV0ID8KCQkJCSggaW5kZXhPZi5jYWxsKCBzb3J0SW5wdXQsIGEgKSAtIGlu ZGV4T2YuY2FsbCggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0 dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiAp IHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJ aWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1 cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVu dE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJ YnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRv Y3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsK CQkJcmV0dXJuIGEgPT09IGRvYyA/IC0xIDoKCQkJCWIgPT09IGRvYyA/IDEgOgoJ CQkJYXVwID8gLTEgOgoJCQkJYnVwID8gMSA6CgkJCQlzb3J0SW5wdXQgPwoJCQkJ KCBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZi5jYWxsKCBz b3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUg c2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICgg YXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsK CQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIg YW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChj dXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJ CX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSAp IHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhl IHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0g PT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERv IGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNl c3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90 aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtp XSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVk RG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2M7Cn07CgpTaXp6bGUubWF0 Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHsKCXJldHVybiBTaXp6 bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7Cn07CgpTaXp6bGUubWF0 Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7CgkvLyBTZXQg ZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1l bnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxl bSApOwoJfQoKCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMg YXJlIHF1b3RlZAoJZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3Rl cywgIj0nJDEnXSIgKTsKCglpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYm IGRvY3VtZW50SXNIVE1MICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5 TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwg IXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJl dCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1h dGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rl cwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJ CQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJl IGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxl bS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsK CQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoKGUpIHt9Cgl9CgoJcmV0dXJu IFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3Ro ID4gMDsKfTsKClNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBl bGVtICkgewoJLy8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkCglpZiAoICgg Y29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQg KSB7CgkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCX0KCXJldHVybiBjb250YWlu cyggY29udGV4dCwgZWxlbSApOwp9OwoKU2l6emxlLmF0dHIgPSBmdW5jdGlvbigg ZWxlbSwgbmFtZSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJ aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50 ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJdmFyIGZuID0gRXhwci5h dHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSwKCQkvLyBEb24ndCBnZXQg Zm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMx MzgwNykKCQl2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxl LCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/CgkJCWZuKCBlbGVtLCBuYW1lLCAhZG9j dW1lbnRJc0hUTUwgKSA6CgkJCXVuZGVmaW5lZDsKCglyZXR1cm4gdmFsICE9PSB1 bmRlZmluZWQgPwoJCXZhbCA6CgkJc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1 bWVudElzSFRNTCA/CgkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOgoJCQko dmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lm aWVkID8KCQkJCXZhbC52YWx1ZSA6CgkJCQludWxsOwp9OwoKU2l6emxlLmVycm9y ID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBl cnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8q KgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAq IEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29y dCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRl cyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyog d2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UK CWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0 SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAg KTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNh dGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlm ICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMu cHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRz LnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFy IGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUg aHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJ bnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0 eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBh cnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVt CiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSAp IHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0g ZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBu b2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxl ICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2Ug Y29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0g ZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5v ZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1l bnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5 IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVt LnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4 dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVu CgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBl bGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsK CQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBl ID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5v dCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rl cwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsK CgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1 MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hF eHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7 CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIg IjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91 c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91 c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlv biggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVu ZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVl IHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNo WzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiAp LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNo WzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSAr ICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwK CgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZy b20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikK CQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58 b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBv ZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNv bXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHkt Y29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hb MV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5z bGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVz IGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJy b3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBh cmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0 aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRj aFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkg OiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2Rk IiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSAp IHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJv aGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJ U2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7 CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4 Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJ aWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJ CXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50 cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRj aFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFy YWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVu cXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0 IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3Mg PSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2Ug dG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVu cXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkg LSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0 aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNl c3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyAp OwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhl IHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0 dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJ IlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9k ZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVu ZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0 b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJ CQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUg JiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJ CX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJ dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJ CXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIo XnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRl c3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBm dW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBl b2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1l IHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gc3RydW5kZWZpbmVkICYm IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiICk7CgkJCQl9KTsKCQl9 LAoKCQkiQVRUUiI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7 CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXN1bHQgPSBT aXp6bGUuYXR0ciggZWxlbSwgbmFtZSApOwoKCQkJCWlmICggcmVzdWx0ID09IG51 bGwgKSB7CgkJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiIT0iOwoJCQkJfQoJCQkJ aWYgKCAhb3BlcmF0b3IgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgoJCQkJ cmVzdWx0ICs9ICIiOwoKCQkJCXJldHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVz dWx0ID09PSBjaGVjayA6CgkJCQkJb3BlcmF0b3IgPT09ICIhPSIgPyByZXN1bHQg IT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIl49IiA/IGNoZWNrICYmIHJl c3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDoKCQkJCQlvcGVyYXRvciA9PT0g Iio9IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOgoJ CQkJCW9wZXJhdG9yID09PSAiJD0iID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAt Y2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIn49 IiA/ICggIiAiICsgcmVzdWx0ICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0x IDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwg cmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsg Ii0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlv biggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIg c2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndh cmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3 aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFz dCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVu Y3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJ CQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJ CQl2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIGRpZmYsIG5vZGVJbmRleCwg c3RhcnQsCgkJCQkJCWRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/ICJuZXh0U2li bGluZyIgOiAicHJldmlvdXNTaWJsaW5nIiwKCQkJCQkJcGFyZW50ID0gZWxlbS5w YXJlbnROb2RlLAoJCQkJCQluYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUu dG9Mb3dlckNhc2UoKSwKCQkJCQkJdXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGU7 CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9u bHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJ CXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdo aWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZU eXBlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDogbm9k ZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJ CQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBm b3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlz dGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRT aWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJ CQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFy ZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4u Likgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3 YXJkICYmIHVzZUNhY2hlICkgewoJCQkJCQkJLy8gU2VlayBgZWxlbWAgZnJvbSBh IHByZXZpb3VzbHktY2FjaGVkIGluZGV4CgkJCQkJCQlvdXRlckNhY2hlID0gcGFy ZW50WyBleHBhbmRvIF0gfHwgKHBhcmVudFsgZXhwYW5kbyBdID0ge30pOwoJCQkJ CQkJY2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQlub2Rl SW5kZXggPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsxXTsKCQkJCQkJ CWRpZmYgPSBjYWNoZVswXSA9PT0gZGlycnVucyAmJiBjYWNoZVsyXTsKCQkJCQkJ CW5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRl eCBdOwoKCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2Rl ICYmIG5vZGVbIGRpciBdIHx8CgoJCQkJCQkJCS8vIEZhbGxiYWNrIHRvIHNlZWtp bmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0CgkJCQkJCQkJKGRpZmYgPSBub2RlSW5k ZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7CgoJCQkJCQkJCS8vIFdoZW4gZm91 bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrCgkJCQkJCQkJ aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBl bGVtICkgewoJCQkJCQkJCQlvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMs IG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJ CQkJCQl9CgoJCQkJCQkvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBp bmRleCBpZiBhdmFpbGFibGUKCQkJCQkJfSBlbHNlIGlmICggdXNlQ2FjaGUgJiYg KGNhY2hlID0gKGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0g e30pKVsgdHlwZSBdKSAmJiBjYWNoZVswXSA9PT0gZGlycnVucyApIHsKCQkJCQkJ CWRpZmYgPSBjYWNoZVsxXTsKCgkJCQkJCS8vIHhtbCA6bnRoLWNoaWxkKC4uLikg b3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUo Li4uKQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHRoZSBzYW1lIGxvb3Ag YXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCXdo aWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBd IHx8CgkJCQkJCQkJKGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3Ao KSkgKSB7CgoJCQkJCQkJCWlmICggKCBvZlR5cGUgPyBub2RlLm5vZGVOYW1lLnRv TG93ZXJDYXNlKCkgPT09IG5hbWUgOiBub2RlLm5vZGVUeXBlID09PSAxICkgJiYg KytkaWZmICkgewoJCQkJCQkJCQkvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBl bmNvdW50ZXJlZCBlbGVtZW50CgkJCQkJCQkJCWlmICggdXNlQ2FjaGUgKSB7CgkJ CQkJCQkJCQkobm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7 fSkpWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTsKCQkJCQkJCQkJfQoKCQkJ CQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJYnJlYWs7CgkJ CQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCS8vIElu Y29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBz aXplCgkJCQkJCWRpZmYgLT0gbGFzdDsKCQkJCQkJcmV0dXJuIGRpZmYgPT09IGZp cnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAw ICk7CgkJCQkJfQoJCQkJfTsKCQl9LAoKCQkiUFNFVURPIjogZnVuY3Rpb24oIHBz ZXVkbywgYXJndW1lbnQgKSB7CgkJCS8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUg Y2FzZS1pbnNlbnNpdGl2ZQoJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxl Y3RvcnMvI3BzZXVkby1jbGFzc2VzCgkJCS8vIFByaW9yaXRpemUgYnkgY2FzZSBz ZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRo IHVwcGVyY2FzZSBsZXR0ZXJzCgkJCS8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVy cyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKCQkJdmFyIGFyZ3MsCgkJCQlmbiA9IEV4 cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8u dG9Mb3dlckNhc2UoKSBdIHx8CgkJCQkJU2l6emxlLmVycm9yKCAidW5zdXBwb3J0 ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CgoJCQkvLyBUaGUgdXNlciBtYXkgdXNl IGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CgkJCS8vIGFyZ3VtZW50cyBh cmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCgkJCS8vIGp1 c3QgYXMgU2l6emxlIGRvZXMKCQkJaWYgKCBmblsgZXhwYW5kbyBdICkgewoJCQkJ cmV0dXJuIGZuKCBhcmd1bWVudCApOwoJCQl9CgoJCQkvLyBCdXQgbWFpbnRhaW4g c3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMKCQkJaWYgKCBmbi5sZW5ndGggPiAx ICkgewoJCQkJYXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBd OwoJCQkJcmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNl dWRvLnRvTG93ZXJDYXNlKCkgKSA/CgkJCQkJbWFya0Z1bmN0aW9uKGZ1bmN0aW9u KCBzZWVkLCBtYXRjaGVzICkgewoJCQkJCQl2YXIgaWR4LAoJCQkJCQkJbWF0Y2hl ZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLAoJCQkJCQkJaSA9IG1hdGNoZWQubGVu Z3RoOwoJCQkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQkJCWlkeCA9IGluZGV4T2Yu Y2FsbCggc2VlZCwgbWF0Y2hlZFtpXSApOwoJCQkJCQkJc2VlZFsgaWR4IF0gPSAh KCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKCQkJCQkJfQoJCQkJCX0p IDoKCQkJCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJCQkJcmV0dXJuIGZuKCBlbGVt LCAwLCBhcmdzICk7CgkJCQkJfTsKCQkJfQoKCQkJcmV0dXJuIGZuOwoJCX0KCX0s CgoJcHNldWRvczogewoJCS8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvcwoJ CSJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCQkv LyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQoJCQkvLyB0byBh dm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZwoJCQkvLyBzcGFjZXMg YXMgY29tYmluYXRvcnMKCQkJdmFyIGlucHV0ID0gW10sCgkJCQlyZXN1bHRzID0g W10sCgkJCQltYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRy aW0sICIkMSIgKSApOwoKCQkJcmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/CgkJ CQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQs IHhtbCApIHsKCQkJCQl2YXIgZWxlbSwKCQkJCQkJdW5tYXRjaGVkID0gbWF0Y2hl ciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLAoJCQkJCQlpID0gc2VlZC5sZW5ndGg7 CgoJCQkJCS8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmAK CQkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IHVubWF0Y2hl ZFtpXSkgKSB7CgkJCQkJCQlzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7 CgkJCQkJCX0KCQkJCQl9CgkJCQl9KSA6CgkJCQlmdW5jdGlvbiggZWxlbSwgY29u dGV4dCwgeG1sICkgewoJCQkJCWlucHV0WzBdID0gZWxlbTsKCQkJCQltYXRjaGVy KCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7CgkJCQkJcmV0dXJuICFyZXN1 bHRzLnBvcCgpOwoJCQkJfTsKCQl9KSwKCgkJImhhcyI6IG1hcmtGdW5jdGlvbihm dW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSAp IHsKCQkJCXJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4g MDsKCQkJfTsKCQl9KSwKCgkJImNvbnRhaW5zIjogbWFya0Z1bmN0aW9uKGZ1bmN0 aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQly ZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdl dFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xOwoJCQl9OwoJCX0p LAoKCQkvLyAiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEg OmxhbmcoKSBzZWxlY3RvcgoJCS8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxl bWVudCdzIGxhbmd1YWdlIHZhbHVlCgkJLy8gYmVpbmcgZXF1YWwgdG8gdGhlIGlk ZW50aWZpZXIgQywKCQkvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmll ciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5ICItIi4KCQkvLyBUaGUgbWF0Y2hp bmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMg cGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS4KCQkvLyBUaGUgaWRlbnRpZmll ciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLiIK CQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRv CgkJImxhbmciOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkgewoJCQkv LyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCgkJCWlmICgg IXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCAiIikgKSB7CgkJCQlTaXp6bGUuZXJy b3IoICJ1bnN1cHBvcnRlZCBsYW5nOiAiICsgbGFuZyApOwoJCQl9CgkJCWxhbmcg PSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNh c2UoKTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIGVsZW1M YW5nOwoJCQkJZG8gewoJCQkJCWlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hU TUwgPwoJCQkJCQllbGVtLmxhbmcgOgoJCQkJCQllbGVtLmdldEF0dHJpYnV0ZSgi eG1sOmxhbmciKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgibGFuZyIpKSApIHsKCgkJ CQkJCWVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTsKCQkJCQkJcmV0 dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcg KyAiLSIgKSA9PT0gMDsKCQkJCQl9CgkJCQl9IHdoaWxlICggKGVsZW0gPSBlbGVt LnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTsKCQkJCXJldHVy biBmYWxzZTsKCQkJfTsKCQl9KSwKCgkJLy8gTWlzY2VsbGFuZW91cwoJCSJ0YXJn ZXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGhhc2ggPSB3aW5kb3cubG9j YXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7CgkJCXJldHVybiBoYXNoICYm IGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDsKCQl9LAoKCQkicm9vdCI6IGZ1 bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTsKCQl9 LAoKCQkiZm9jdXMiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0g PT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1 cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxl bS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTsKCQl9LAoKCQkvLyBCb29sZWFuIHBy b3BlcnRpZXMKCQkiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1 cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7CgkJfSwKCgkJImRpc2FibGVkIjog ZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0 cnVlOwoJCX0sCgoJCSJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8v IEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFu ZCBzZWxlY3RlZCBlbGVtZW50cwoJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8y MDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZAoJCQl2YXIg bm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVy biAobm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChu b2RlTmFtZSA9PT0gIm9wdGlvbiIgJiYgISFlbGVtLnNlbGVjdGVkKTsKCQl9LAoK CQkic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gQWNjZXNzaW5n IHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAoJCQkvLyBv cHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CgkJCWlmICggZWxlbS5wYXJl bnROb2RlICkgewoJCQkJZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJ CX0KCgkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOwoJCX0sCgoJCS8v IENvbnRlbnRzCgkJImVtcHR5IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIGh0 dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvCgkJCS8v IDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9k ZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSwKCQkJLy8gICBi dXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVj dGlvbjogNzsgZXRjLikKCQkJLy8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2Ug YXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlbgoJCQlmb3Ig KCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0 U2libGluZyApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7CgkJCQkJ cmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0sCgoJ CSJwYXJlbnQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICFFeHByLnBz ZXVkb3NbImVtcHR5Il0oIGVsZW0gKTsKCQl9LAoKCQkvLyBFbGVtZW50L2lucHV0 IHR5cGVzCgkJImhlYWRlciI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4g cmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CgkJfSwKCgkJImlucHV0Ijog ZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0u bm9kZU5hbWUgKTsKCQl9LAoKCQkiYnV0dG9uIjogZnVuY3Rpb24oIGVsZW0gKSB7 CgkJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCQly ZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24i IHx8IG5hbWUgPT09ICJidXR0b24iOwoJCX0sCgoJCSJ0ZXh0IjogZnVuY3Rpb24o IGVsZW0gKSB7CgkJCXZhciBhdHRyOwoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50 b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmCgkJCQllbGVtLnR5cGUgPT09ICJ0 ZXh0IiAmJgoKCQkJCS8vIFN1cHBvcnQ6IElFPDgKCQkJCS8vIE5ldyBIVE1MNSBh dHRyaWJ1dGUgdmFsdWVzIChlLmcuLCAic2VhcmNoIikgYXBwZWFyIHdpdGggZWxl bS50eXBlID09PSAidGV4dCIKCQkJCSggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0 ZSgidHlwZSIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gInRl eHQiICk7CgkJfSwKCgkJLy8gUG9zaXRpb24taW4tY29sbGVjdGlvbgoJCSJmaXJz dCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7CgkJCXJldHVy biBbIDAgXTsKCQl9KSwKCgkJImxhc3QiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRv KGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKCQkJcmV0dXJuIFsg bGVuZ3RoIC0gMSBdOwoJCX0pLAoKCQkiZXEiOiBjcmVhdGVQb3NpdGlvbmFsUHNl dWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7 CgkJCXJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDog YXJndW1lbnQgXTsKCQl9KSwKCgkJImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNl dWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHsKCQkJdmFyIGkg PSAwOwoJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKCQkJCW1hdGNo SW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsK CQl9KSwKCgkJIm9kZCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24o IG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDE7CgkJCWZvciAo IDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2go IGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkibHQi OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMs IGxlbmd0aCwgYXJndW1lbnQgKSB7CgkJCXZhciBpID0gYXJndW1lbnQgPCAwID8g YXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDsKCQkJZm9yICggOyAtLWkgPj0g MDsgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVy biBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJndCI6IGNyZWF0ZVBvc2l0aW9uYWxQ c2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCAp IHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6 IGFyZ3VtZW50OwoJCQlmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7CgkJCQltYXRj aEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7 CgkJfSkKCX0KfTsKCkV4cHIucHNldWRvc1sibnRoIl0gPSBFeHByLnBzZXVkb3Nb ImVxIl07CgovLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvcwpmb3IgKCBp IGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBw YXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHsKCUV4cHIucHNldWRvc1sg aSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTsKfQpmb3IgKCBpIGluIHsgc3Vi bWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0g PSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTsKfQoKLy8gRWFzeSBBUEkgZm9yIGNy ZWF0aW5nIG5ldyBzZXRGaWx0ZXJzCmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fQpz ZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRv czsKRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTsKCnRva2VuaXpl ID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9u bHkgKSB7Cgl2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSwKCQlzb0Zh ciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLAoJCWNhY2hlZCA9IHRva2VuQ2FjaGVbIHNl bGVjdG9yICsgIiAiIF07CgoJaWYgKCBjYWNoZWQgKSB7CgkJcmV0dXJuIHBhcnNl T25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTsKCX0KCglzb0ZhciA9IHNlbGVj dG9yOwoJZ3JvdXBzID0gW107CglwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7 CgoJd2hpbGUgKCBzb0ZhciApIHsKCgkJLy8gQ29tbWEgYW5kIGZpcnN0IHJ1bgoJ CWlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkp ICkgewoJCQlpZiAoIG1hdGNoICkgewoJCQkJLy8gRG9uJ3QgY29uc3VtZSB0cmFp bGluZyBjb21tYXMgYXMgdmFsaWQKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1h dGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyOwoJCQl9CgkJCWdyb3Vwcy5wdXNoKCAo dG9rZW5zID0gW10pICk7CgkJfQoKCQltYXRjaGVkID0gZmFsc2U7CgoJCS8vIENv bWJpbmF0b3JzCgkJaWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29G YXIgKSkgKSB7CgkJCW1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpOwoJCQl0b2tlbnMu cHVzaCh7CgkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCS8vIENhc3QgZGVzY2VuZGFu dCBjb21iaW5hdG9ycyB0byBzcGFjZQoJCQkJdHlwZTogbWF0Y2hbMF0ucmVwbGFj ZSggcnRyaW0sICIgIiApCgkJCX0pOwoJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBt YXRjaGVkLmxlbmd0aCApOwoJCX0KCgkJLy8gRmlsdGVycwoJCWZvciAoIHR5cGUg aW4gRXhwci5maWx0ZXIgKSB7CgkJCWlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0 eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHwK CQkJCShtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkgewoJ CQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCQl0b2tlbnMucHVzaCh7CgkJ CQkJdmFsdWU6IG1hdGNoZWQsCgkJCQkJdHlwZTogdHlwZSwKCQkJCQltYXRjaGVz OiBtYXRjaAoJCQkJfSk7CgkJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVk Lmxlbmd0aCApOwoJCQl9CgkJfQoKCQlpZiAoICFtYXRjaGVkICkgewoJCQlicmVh azsKCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQg ZXhjZXNzCgkvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmcKCS8vIE90aGVyd2lzZSwg dGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2VucwoJcmV0dXJuIHBhcnNlT25s eSA/CgkJc29GYXIubGVuZ3RoIDoKCQlzb0ZhciA/CgkJCVNpenpsZS5lcnJvcigg c2VsZWN0b3IgKSA6CgkJCS8vIENhY2hlIHRoZSB0b2tlbnMKCQkJdG9rZW5DYWNo ZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Cn07CgpmdW5jdGlvbiB0 b1NlbGVjdG9yKCB0b2tlbnMgKSB7Cgl2YXIgaSA9IDAsCgkJbGVuID0gdG9rZW5z Lmxlbmd0aCwKCQlzZWxlY3RvciA9ICIiOwoJZm9yICggOyBpIDwgbGVuOyBpKysg KSB7CgkJc2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlOwoJfQoJcmV0dXJuIHNl bGVjdG9yOwp9CgpmdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21i aW5hdG9yLCBiYXNlICkgewoJdmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLAoJCWNo ZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGRpciA9PT0gInBhcmVudE5vZGUiLAoJ CWRvbmVOYW1lID0gZG9uZSsrOwoKCXJldHVybiBjb21iaW5hdG9yLmZpcnN0ID8K CQkvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVs ZW1lbnQKCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl3aGls ZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkgewoJCQkJaWYgKCBlbGVtLm5vZGVU eXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJcmV0dXJuIG1h dGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApOwoJCQkJfQoJCQl9CgkJfSA6CgoJ CS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50 cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRD YWNoZSwgb3V0ZXJDYWNoZSwKCQkJCW5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25l TmFtZSBdOwoKCQkJLy8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhN TCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmcK CQkJaWYgKCB4bWwgKSB7CgkJCQl3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0p ICkgewoJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVs ZW1lbnRzICkgewoJCQkJCQlpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHht bCApICkgewoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9CgkJCQl9 CgkJCX0gZWxzZSB7CgkJCQl3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkg ewoJCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1l bnRzICkgewoJCQkJCQlvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8IChl bGVtWyBleHBhbmRvIF0gPSB7fSk7CgkJCQkJCWlmICggKG9sZENhY2hlID0gb3V0 ZXJDYWNoZVsgZGlyIF0pICYmCgkJCQkJCQlvbGRDYWNoZVsgMCBdID09PSBkaXJy dW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkgewoKCQkJCQkJCS8v IEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRv IHByZXZpb3VzIGVsZW1lbnRzCgkJCQkJCQlyZXR1cm4gKG5ld0NhY2hlWyAyIF0g PSBvbGRDYWNoZVsgMiBdKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCS8vIFJldXNl IG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMg ZWxlbWVudHMKCQkJCQkJCW91dGVyQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7CgoJ CQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMg d2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsg MiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJ CXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9 CgkJfTsKfQoKZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkgewoJ cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgPwoJCWZ1bmN0aW9uKCBlbGVtLCBj b250ZXh0LCB4bWwgKSB7CgkJCXZhciBpID0gbWF0Y2hlcnMubGVuZ3RoOwoJCQl3 aGlsZSAoIGktLSApIHsKCQkJCWlmICggIW1hdGNoZXJzW2ldKCBlbGVtLCBjb250 ZXh0LCB4bWwgKSApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJ cmV0dXJuIHRydWU7CgkJfSA6CgkJbWF0Y2hlcnNbMF07Cn0KCmZ1bmN0aW9uIG11 bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHsK CXZhciBpID0gMCwKCQlsZW4gPSBjb250ZXh0cy5sZW5ndGg7Cglmb3IgKCA7IGkg PCBsZW47IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwg cmVzdWx0cyApOwoJfQoJcmV0dXJuIHJlc3VsdHM7Cn0KCmZ1bmN0aW9uIGNvbmRl bnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7Cgl2 YXIgZWxlbSwKCQluZXdVbm1hdGNoZWQgPSBbXSwKCQlpID0gMCwKCQlsZW4gPSB1 bm1hdGNoZWQubGVuZ3RoLAoJCW1hcHBlZCA9IG1hcCAhPSBudWxsOwoKCWZvciAo IDsgaSA8IGxlbjsgaSsrICkgewoJCWlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0p ICkgewoJCQlpZiAoICFmaWx0ZXIgfHwgZmlsdGVyKCBlbGVtLCBjb250ZXh0LCB4 bWwgKSApIHsKCQkJCW5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJCQlpZiAo IG1hcHBlZCApIHsKCQkJCQltYXAucHVzaCggaSApOwoJCQkJfQoJCQl9CgkJfQoJ fQoKCXJldHVybiBuZXdVbm1hdGNoZWQ7Cn0KCmZ1bmN0aW9uIHNldE1hdGNoZXIo IHByZUZpbHRlciwgc2VsZWN0b3IsIG1hdGNoZXIsIHBvc3RGaWx0ZXIsIHBvc3RG aW5kZXIsIHBvc3RTZWxlY3RvciApIHsKCWlmICggcG9zdEZpbHRlciAmJiAhcG9z dEZpbHRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVy KCBwb3N0RmlsdGVyICk7Cgl9CglpZiAoIHBvc3RGaW5kZXIgJiYgIXBvc3RGaW5k ZXJbIGV4cGFuZG8gXSApIHsKCQlwb3N0RmluZGVyID0gc2V0TWF0Y2hlciggcG9z dEZpbmRlciwgcG9zdFNlbGVjdG9yICk7Cgl9CglyZXR1cm4gbWFya0Z1bmN0aW9u KGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7CgkJdmFy IHRlbXAsIGksIGVsZW0sCgkJCXByZU1hcCA9IFtdLAoJCQlwb3N0TWFwID0gW10s CgkJCXByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsCgoJCQkvLyBHZXQgaW5p dGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dAoJCQllbGVtcyA9IHNl ZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0 Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSApLAoKCQkJLy8g UHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFw IGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uCgkJCW1hdGNoZXJJbiA9 IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPwoJCQkJY29uZGVu c2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgoJ CQkJZWxlbXMsCgoJCQltYXRjaGVyT3V0ID0gbWF0Y2hlciA/CgkJCQkvLyBJZiB3 ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNl ZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLAoJCQkJcG9zdEZp bmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0 RmlsdGVyICkgPwoKCQkJCQkvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBp cyBuZWNlc3NhcnkKCQkJCQlbXSA6CgoJCQkJCS8vIC4uLm90aGVyd2lzZSB1c2Ug cmVzdWx0cyBkaXJlY3RseQoJCQkJCXJlc3VsdHMgOgoJCQkJbWF0Y2hlckluOwoK CQkvLyBGaW5kIHByaW1hcnkgbWF0Y2hlcwoJCWlmICggbWF0Y2hlciApIHsKCQkJ bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTsK CQl9CgoJCS8vIEFwcGx5IHBvc3RGaWx0ZXIKCQlpZiAoIHBvc3RGaWx0ZXIgKSB7 CgkJCXRlbXAgPSBjb25kZW5zZSggbWF0Y2hlck91dCwgcG9zdE1hcCApOwoJCQlw b3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7CgoJCQkvLyBVbi1t YXRjaCBmYWlsaW5nIGVsZW1lbnRzIGJ5IG1vdmluZyB0aGVtIGJhY2sgdG8gbWF0 Y2hlckluCgkJCWkgPSB0ZW1wLmxlbmd0aDsKCQkJd2hpbGUgKCBpLS0gKSB7CgkJ CQlpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7CgkJCQkJbWF0Y2hlck91dFsgcG9z dE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pOwoJ CQkJfQoJCQl9CgkJfQoKCQlpZiAoIHNlZWQgKSB7CgkJCWlmICggcG9zdEZpbmRl ciB8fCBwcmVGaWx0ZXIgKSB7CgkJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQkJ Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBp bnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzCgkJCQkJdGVtcCA9 IFtdOwoJCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCQl3aGlsZSAoIGkt LSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICkgewoJCQkJ CQkJLy8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEg ZmluYWwgbWF0Y2gKCQkJCQkJCXRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVs ZW0pICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcG9zdEZpbmRlciggbnVsbCwgKG1h dGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApOwoJCQkJfQoKCQkJCS8vIE1vdmUg bWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRo ZW0gc3luY2hyb25pemVkCgkJCQlpID0gbWF0Y2hlck91dC5sZW5ndGg7CgkJCQl3 aGlsZSAoIGktLSApIHsKCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkg JiYKCQkJCQkJKHRlbXAgPSBwb3N0RmluZGVyID8gaW5kZXhPZi5jYWxsKCBzZWVk LCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBd ID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJ CS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIg aWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgK CQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3Bs aWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0 Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0Rmlu ZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNl IHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJ CX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkg ewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMu bGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vu c1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2 ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/ IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0 aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4 dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBl bGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGlt cGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRD b21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2Yu Y2FsbCggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTsKCQl9LCBpbXBsaWNpdFJl bGF0aXZlLCB0cnVlICksCgkJbWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBj b250ZXh0LCB4bWwgKSB7CgkJCXJldHVybiAoICFsZWFkaW5nUmVsYXRpdmUgJiYg KCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKAoJ CQkJKGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID8KCQkJCQltYXRj aENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDoKCQkJCQltYXRjaEFueUNv bnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7CgkJfSBdOwoKCWZvciAoIDsg aSA8IGxlbjsgaSsrICkgewoJCWlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZl WyB0b2tlbnNbaV0udHlwZSBdKSApIHsKCQkJbWF0Y2hlcnMgPSBbIGFkZENvbWJp bmF0b3IoZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIpIF07CgkJ fSBlbHNlIHsKCQkJbWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlw ZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApOwoKCQkJLy8gUmV0 dXJuIHNwZWNpYWwgdXBvbiBzZWVpbmcgYSBwb3NpdGlvbmFsIG1hdGNoZXIKCQkJ aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7CgkJCQkvLyBGaW5kIHRoZSBuZXh0 IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmcK CQkJCWogPSArK2k7CgkJCQlmb3IgKCA7IGogPCBsZW47IGorKyApIHsKCQkJCQlp ZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7CgkJCQkJCWJy ZWFrOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiBzZXRNYXRjaGVyKAoJCQkJCWkg PiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLAoJCQkJCWkgPiAxICYm IHRvU2VsZWN0b3IoCgkJCQkJCS8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2Fz IGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55 LWVsZW1lbnQgYCpgCgkJCQkJCXRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25j YXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09ICIgIiA/ICIqIiA6 ICIiIH0pCgkJCQkJKS5yZXBsYWNlKCBydHJpbSwgIiQxIiApLAoJCQkJCW1hdGNo ZXIsCgkJCQkJaSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGlj ZSggaSwgaiApICksCgkJCQkJaiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2Vucygg KHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLAoJCQkJCWogPCBsZW4gJiYg dG9TZWxlY3RvciggdG9rZW5zICkKCQkJCSk7CgkJCX0KCQkJbWF0Y2hlcnMucHVz aCggbWF0Y2hlciApOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1h dGNoZXJzICk7Cn0KCmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycygg ZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHsKCXZhciBieVNldCA9IHNl dE1hdGNoZXJzLmxlbmd0aCA+IDAsCgkJYnlFbGVtZW50ID0gZWxlbWVudE1hdGNo ZXJzLmxlbmd0aCA+IDAsCgkJc3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQs IGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkgewoJCQl2YXIgZWxl bSwgaiwgbWF0Y2hlciwKCQkJCW1hdGNoZWRDb3VudCA9IDAsCgkJCQlpID0gIjAi LAoJCQkJdW5tYXRjaGVkID0gc2VlZCAmJiBbXSwKCQkJCXNldE1hdGNoZWQgPSBb XSwKCQkJCWNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LAoJCQkJLy8g V2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBvdXRl cm1vc3QgY29udGV4dAoJCQkJZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBF eHByLmZpbmRbIlRBRyJdKCAiKiIsIG91dGVybW9zdCApLAoJCQkJLy8gVXNlIGlu dGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXIK CQkJCWRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09 IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLAoJCQkJbGVuID0gZWxl bXMubGVuZ3RoOwoKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlvdXRlcm1vc3RD b250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKCQkJfQoK CQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVj dGx5IHRvIHJlc3VsdHMKCQkJLy8gS2VlcCBgaWAgYSBzdHJpbmcgaWYgdGhlcmUg YXJlIG5vIGVsZW1lbnRzIHNvIGBtYXRjaGVkQ291bnRgIHdpbGwgYmUgIjAwIiBi ZWxvdwoJCQkvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmkKCQkJLy8gVG9sZXJhdGUg Tm9kZUxpc3QgcHJvcGVydGllcyAoSUU6ICJsZW5ndGgiOyBTYWZhcmk6IDxudW1i ZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZAoJCQlmb3IgKCA7IGkgIT09IGxl biAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAo IGJ5RWxlbWVudCAmJiBlbGVtICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICgg KG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJCWlmICgg bWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXN1bHRz LnB1c2goIGVsZW0gKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJ CWlmICggb3V0ZXJtb3N0ICkgewoJCQkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1 ZTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRz IGZvciBzZXQgZmlsdGVycwoJCQkJaWYgKCBieVNldCApIHsKCQkJCQkvLyBUaGV5 IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzCgkJ CQkJaWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkgewoJCQkJCQltYXRj aGVkQ291bnQtLTsKCQkJCQl9CgoJCQkJCS8vIExlbmd0aGVuIHRoZSBhcnJheSBm b3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3QKCQkJCQlpZiAoIHNlZWQg KSB7CgkJCQkJCXVubWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJCQkJfQoJCQkJfQoJ CQl9CgoJCQkvLyBBcHBseSBzZXQgZmlsdGVycyB0byB1bm1hdGNoZWQgZWxlbWVu dHMKCQkJbWF0Y2hlZENvdW50ICs9IGk7CgkJCWlmICggYnlTZXQgJiYgaSAhPT0g bWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVy ID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVk LCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNl ZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVs aW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENv dW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEo dW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1h dGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9 CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVl cyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBj b25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVz IHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQg KTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRp cGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlm ICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAm JgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAx ICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJ CQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBu ZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5z ID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0 QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJu IGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBl ck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9u KCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2 YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtd LAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJ aWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVj dXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2gg ZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBz ZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0t ICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsK CQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1 c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1 c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQg ZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0 Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNo ZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJ Y2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9 OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdv cmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9u cwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3Rv ciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQg d2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQK ICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtz ZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxl Y3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0 LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUs IGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlv biIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNl bGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVz dWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJh dGlvbnMgaWYgdGhlcmUgaXMgbm8gc2VlZCBhbmQgb25seSBvbmUgZ3JvdXAKCWlm ICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBUYWtlIGEgc2hvcnRjdXQg YW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJ RAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlp ZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlw ZSA9PT0gIklEIiAmJgoJCQkJc3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9k ZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkJCUV4cHIucmVsYXRp dmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7CgoJCQljb250ZXh0ID0gKCBFeHByLmZp bmRbIklEIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1 bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdOwoJCQlpZiAoICFjb250ZXh0 ICkgewoJCQkJcmV0dXJuIHJlc3VsdHM7CgoJCQkvLyBQcmVjb21waWxlZCBtYXRj aGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxl dmVsCgkJCX0gZWxzZSBpZiAoIGNvbXBpbGVkICkgewoJCQkJY29udGV4dCA9IGNv bnRleHQucGFyZW50Tm9kZTsKCQkJfQoKCQkJc2VsZWN0b3IgPSBzZWxlY3Rvci5z bGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7CgkJfQoKCQkvLyBG ZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nCgkJaSA9 IG1hdGNoRXhwclsibmVlZHNDb250ZXh0Il0udGVzdCggc2VsZWN0b3IgKSA/IDAg OiB0b2tlbnMubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQl0b2tlbiA9IHRv a2Vuc1tpXTsKCgkJCS8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3IKCQkJ aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7CgkJ CQlicmVhazsKCQkJfQoJCQlpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0p ICkgewoJCQkJLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGlu ZyBzaWJsaW5nIGNvbWJpbmF0b3JzCgkJCQlpZiAoIChzZWVkID0gZmluZCgKCQkJ CQl0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBl ICksCgkJCQkJcnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0 Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dAoJCQkJKSkg KSB7CgoJCQkJCS8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFp biwgd2UgY2FuIHJldHVybiBlYXJseQoJCQkJCXRva2Vucy5zcGxpY2UoIGksIDEg KTsKCQkJCQlzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRv a2VucyApOwoJCQkJCWlmICggIXNlbGVjdG9yICkgewoJCQkJCQlwdXNoLmFwcGx5 KCByZXN1bHRzLCBzZWVkICk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0K CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQ29tcGlsZSBhbmQg ZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3Zp ZGVkCgkvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24g aWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlCgkoIGNvbXBpbGVkIHx8 IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoCgkJc2VlZCwKCQljb250ZXh0 LAoJCSFkb2N1bWVudElzSFRNTCwKCQlyZXN1bHRzLAoJCXJzaWJsaW5nLnRlc3Qo IHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSAp IHx8IGNvbnRleHQKCSk7CglyZXR1cm4gcmVzdWx0czsKfTsKCi8vIE9uZS10aW1l IGFzc2lnbm1lbnRzCgovLyBTb3J0IHN0YWJpbGl0eQpzdXBwb3J0LnNvcnRTdGFi bGUgPSBleHBhbmRvLnNwbGl0KCIiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCIi KSA9PT0gZXhwYW5kbzsKCi8vIFN1cHBvcnQ6IENocm9tZTwxNAovLyBBbHdheXMg YXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBj b21wYXJpc29uIGZ1bmN0aW9uCnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEh aGFzRHVwbGljYXRlOwoKLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0 IGRvY3VtZW50CnNldERvY3VtZW50KCk7CgovLyBTdXBwb3J0OiBXZWJraXQ8NTM3 LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3 KQovLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBv dGhlcioKc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRp djEgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxv d2luZykKCXJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0 OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0 aW9uIgovLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkv bXM1MzY0MjklMjhWUy44NSUyOS5hc3B4CmlmICggIWFzc2VydChmdW5jdGlvbigg ZGl2ICkgewoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCXJl dHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIiMi IDsKfSkgKSB7CglhZGRIYW5kbGUoICJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIiwg ZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICkg ewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dl ckNhc2UoKSA9PT0gInR5cGUiID8gMSA6IDIgKTsKCQl9Cgl9KTsKfQoKLy8gU3Vw cG9ydDogSUU8OQovLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0 dHJpYnV0ZSgidmFsdWUiKQppZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFz c2VydChmdW5jdGlvbiggZGl2ICkgewoJZGl2LmlubmVySFRNTCA9ICI8aW5wdXQv PiI7CglkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoICJ2YWx1ZSIsICIiICk7 CglyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkg PT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVs ZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5h bWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0u ZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVz ZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0 cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CglyZXR1 cm4gZGl2LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PSBudWxsOwp9KSApIHsK CWFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hN TCApIHsKCQl2YXIgdmFsOwoJCWlmICggIWlzWE1MICkgewoJCQlyZXR1cm4gZWxl bVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJCQko dmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVj aWZpZWQgPwoJCQkJCXZhbC52YWx1ZSA6CgkJCQludWxsOwoJCX0KCX0pOwp9Cgpy ZXR1cm4gU2l6emxlOwoKfSkoIHdpbmRvdyApOwoKCgpqUXVlcnkuZmluZCA9IFNp enpsZTsKalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwpqUXVlcnkuZXhw clsiOiJdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZSA9IFNp enpsZS51bmlxdWVTb3J0OwpqUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0Owpq UXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CmpRdWVyeS5jb250YWlucyA9 IFNpenpsZS5jb250YWluczsKCgoKdmFyIHJuZWVkc0NvbnRleHQgPSBqUXVlcnku ZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7Cgp2YXIgcnNpbmdsZVRhZyA9ICgvXjwo XHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvKTsKCgoKdmFyIHJpc1NpbXBsZSA9IC9e LlteOiNcW1wuLF0qJC87CgovLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5j dGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdApmdW5jdGlvbiB3aW5ub3coIGVs ZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHsKCWlmICggalF1ZXJ5LmlzRnVuY3Rp b24oIHF1YWxpZmllciApICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVu dHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQkvKiBqc2hpbnQgLVcwMTggKi8K CQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0g bm90OwoJCX0pOwoKCX0KCglpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHsKCQly ZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsK CQkJcmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgIT09IG5vdDsKCQl9KTsK Cgl9CgoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyID09PSAic3RyaW5nIiApIHsKCQlp ZiAoIHJpc1NpbXBsZS50ZXN0KCBxdWFsaWZpZXIgKSApIHsKCQkJcmV0dXJuIGpR dWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwoJCX0KCgkJ cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyAp OwoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBl bGVtICkgewoJCXJldHVybiAoIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBxdWFsaWZp ZXIgKSA+PSAwICkgIT09IG5vdDsKCX0pOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVu Y3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAw IF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIiki OwoJfQoKCXJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlw ZSA9PT0gMSA/CgkJalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBl eHByICkgPyBbIGVsZW0gXSA6IFtdIDoKCQlqUXVlcnkuZmluZC5tYXRjaGVzKCBl eHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQly ZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCQl9KSk7Cn07CgpqUXVlcnkuZm4u ZXh0ZW5kKHsKCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgaSwK CQkJcmV0ID0gW10sCgkJCXNlbGYgPSB0aGlzLAoJCQlsZW4gPSBzZWxmLmxlbmd0 aDsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQly ZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIo ZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewoJ CQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsK CQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KSApOwoJCX0KCgkJ Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNl bGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJLy8gTmVlZGVkIGJlY2F1 c2UgJCggc2VsZWN0b3IsIGNvbnRleHQgKSBiZWNvbWVzICQoIGNvbnRleHQgKS5m aW5kKCBzZWxlY3RvciApCgkJcmV0ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEg PyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCApOwoJCXJldC5zZWxlY3RvciA9 IHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9yICsgIiAiICsgc2VsZWN0b3Ig OiBzZWxlY3RvcjsKCQlyZXR1cm4gcmV0OwoJfSwKCWZpbHRlcjogZnVuY3Rpb24o IHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRo aXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSkgKTsKCX0sCglub3Q6IGZ1bmN0aW9u KCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0 aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSkgKTsKCX0sCglpczogZnVuY3Rpb24o IHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8v IElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVj ayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpm aXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mg d2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYm IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNl bGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5n dGg7Cgl9Cn0pOwoKCi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0CgoKLy8g QSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQp CnZhciByb290alF1ZXJ5LAoKCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBh Y2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKCWRvY3Vt ZW50ID0gd2luZG93LmRvY3VtZW50LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVj ayBmb3IgSFRNTCBzdHJpbmdzCgkvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+ IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpCgkvLyBTdHJp Y3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPCkK CXJxdWlja0V4cHIgPSAvXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSop KSQvLAoKCWluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3Rv ciwgY29udGV4dCApIHsKCQl2YXIgbWF0Y2gsIGVsZW07CgoJCS8vIEhBTkRMRTog JCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKCQlpZiAoICFz ZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgSFRN TCBzdHJpbmdzCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkg ewoJCQlpZiAoIHNlbGVjdG9yLmNoYXJBdCgwKSA9PT0gIjwiICYmIHNlbGVjdG9y LmNoYXJBdCggc2VsZWN0b3IubGVuZ3RoIC0gMSApID09PSAiPiIgJiYgc2VsZWN0 b3IubGVuZ3RoID49IDMgKSB7CgkJCQkvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRo YXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSBy ZWdleCBjaGVjawoJCQkJbWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07 CgoJCQl9IGVsc2UgewoJCQkJbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVj dG9yICk7CgkJCX0KCgkJCS8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNv bnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0 Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAt PiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApIHsKCQkJCQljb250ZXh0ID0g Y29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0 OwoKCQkJCQkvLyBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJ Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJz ZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpR dWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWzFdLAoJCQkJCQljb250ZXh0ICYm IGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29u dGV4dCA6IGRvY3VtZW50LAoJCQkJCQl0cnVlCgkJCQkJKSApOwoKCQkJCQkvLyBI QU5ETEU6ICQoaHRtbCwgcHJvcHMpCgkJCQkJaWYgKCByc2luZ2xlVGFnLnRlc3Qo IG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSAp IHsKCQkJCQkJZm9yICggbWF0Y2ggaW4gY29udGV4dCApIHsKCQkJCQkJCS8vIFBy b3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9z c2libGUKCQkJCQkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHRoaXNbIG1hdGNo IF0gKSApIHsKCQkJCQkJCQl0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBd ICk7CgoJCQkJCQkJLy8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRl cwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQl0aGlzLmF0dHIoIG1hdGNoLCBjb250 ZXh0WyBtYXRjaCBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJl dHVybiB0aGlzOwoKCQkJCS8vIEhBTkRMRTogJCgjaWQpCgkJCQl9IGVsc2UgewoJ CQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsK CgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVy cnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIg aW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFy ZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFu ZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9m IElECgkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CgkJCQkJCQly ZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOwoJCQkJCQl9CgoJCQkJ CQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBp bnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXRoaXMubGVuZ3RoID0gMTsKCQkJ CQkJdGhpc1swXSA9IGVsZW07CgkJCQkJfQoKCQkJCQl0aGlzLmNvbnRleHQgPSBk b2N1bWVudDsKCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQkJcmV0 dXJuIHRoaXM7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJ CQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJ CXJldHVybiAoIGNvbnRleHQgfHwgcm9vdGpRdWVyeSApLmZpbmQoIHNlbGVjdG9y ICk7CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dCkKCQkJLy8gKHdoaWNo IGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpCgkJ CX0gZWxzZSB7CgkJCQlyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCAp LmZpbmQoIHNlbGVjdG9yICk7CgkJCX0KCgkJLy8gSEFORExFOiAkKERPTUVsZW1l bnQpCgkJfSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMu Y29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAx OwoJCQlyZXR1cm4gdGhpczsKCgkJLy8gSEFORExFOiAkKGZ1bmN0aW9uKQoJCS8v IFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQoJCX0gZWxzZSBpZiAoIGpRdWVy eS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gdHlwZW9mIHJv b3RqUXVlcnkucmVhZHkgIT09ICJ1bmRlZmluZWQiID8KCQkJCXJvb3RqUXVlcnku cmVhZHkoIHNlbGVjdG9yICkgOgoJCQkJLy8gRXhlY3V0ZSBpbW1lZGlhdGVseSBp ZiByZWFkeSBpcyBub3QgcHJlc2VudAoJCQkJc2VsZWN0b3IoIGpRdWVyeSApOwoJ CX0KCgkJaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkgewoJ CQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29u dGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1h a2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX07CgovLyBHaXZlIHRoZSBpbml0 IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50 aWF0aW9uCmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuOwoKLy8gSW5pdGlhbGl6 ZSBjZW50cmFsIHJlZmVyZW5jZQpyb290alF1ZXJ5ID0galF1ZXJ5KCBkb2N1bWVu dCApOwoKCnZhciBycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVu dGlsfEFsbCkpLywKCS8vIG1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEg dW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFy YW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0 cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5leHRl bmQoewoJZGlyOiBmdW5jdGlvbiggZWxlbSwgZGlyLCB1bnRpbCApIHsKCQl2YXIg bWF0Y2hlZCA9IFtdLAoJCQljdXIgPSBlbGVtWyBkaXIgXTsKCgkJd2hpbGUgKCBj dXIgJiYgY3VyLm5vZGVUeXBlICE9PSA5ICYmICh1bnRpbCA9PT0gdW5kZWZpbmVk IHx8IGN1ci5ub2RlVHlwZSAhPT0gMSB8fCAhalF1ZXJ5KCBjdXIgKS5pcyggdW50 aWwgKSkgKSB7CgkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICkgewoJCQkJbWF0 Y2hlZC5wdXNoKCBjdXIgKTsKCQkJfQoJCQljdXIgPSBjdXJbZGlyXTsKCQl9CgkJ cmV0dXJuIG1hdGNoZWQ7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVt ICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxp bmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkg ewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsK CmpRdWVyeS5mbi5leHRlbmQoewoJaGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkgewoJ CXZhciBpLAoJCQl0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSwKCQkJ bGVuID0gdGFyZ2V0cy5sZW5ndGg7CgoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5j dGlvbigpIHsKCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCWlm ICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7CgkJCQkJ cmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9KTsKCX0sCgoJY2xvc2VzdDogZnVu Y3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHsKCQl2YXIgY3VyLAoJCQlpID0g MCwKCQkJbCA9IHRoaXMubGVuZ3RoLAoJCQltYXRjaGVkID0gW10sCgkJCXBvcyA9 IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVj dG9ycyAhPT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRl eHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJMDsKCgkJZm9yICggOyBpIDwgbDsg aSsrICkgewoJCQlmb3IgKCBjdXIgPSB0aGlzW2ldOyBjdXIgJiYgY3VyICE9PSBj b250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCS8vIEFsd2F5cyBz a2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJaWYgKCBjdXIubm9kZVR5cGUgPCAx MSAmJiAocG9zID8KCQkJCQlwb3MuaW5kZXgoY3VyKSA+IC0xIDoKCgkJCQkJLy8g RG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6emxlCgkJCQkJY3VyLm5vZGVU eXBlID09PSAxICYmCgkJCQkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3Rvcihj dXIsIHNlbGVjdG9ycykpICkgewoKCQkJCQltYXRjaGVkLnB1c2goIGN1ciApOwoJ CQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3Rh Y2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWUoIG1hdGNoZWQg KSA6IG1hdGNoZWQgKTsKCX0sCgoJLy8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBv ZiBhbiBlbGVtZW50IHdpdGhpbgoJLy8gdGhlIG1hdGNoZWQgc2V0IG9mIGVsZW1l bnRzCglpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCS8vIE5vIGFyZ3VtZW50 LCByZXR1cm4gaW5kZXggaW4gcGFyZW50CgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0 dXJuICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmly c3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBz ZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQly ZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7 CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVs ZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2Vp dmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJ CQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFk ZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlz LnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZSgKCQkJCWpRdWVyeS5tZXJnZSgg dGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApICkKCQkJKQoJ CSk7Cgl9LAoKCWFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1 cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwoJCQl0aGlzLnByZXZPYmpl Y3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKHNlbGVjdG9yKQoJCSk7Cgl9Cn0p OwoKZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7CglkbyB7CgkJY3VyID0g Y3VyWyBkaXIgXTsKCX0gd2hpbGUgKCBjdXIgJiYgY3VyLm5vZGVUeXBlICE9PSAx ICk7CgoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5j dGlvbiggZWxlbSApIHsKCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoJ CXJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVu dCA6IG51bGw7Cgl9LAoJcGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0 dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVu dHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBq UXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIsIHVudGlsICk7Cgl9LAoJbmV4 dDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIHNpYmxpbmcoIGVsZW0sICJu ZXh0U2libGluZyIgKTsKCX0sCglwcmV2OiBmdW5jdGlvbiggZWxlbSApIHsKCQly ZXR1cm4gc2libGluZyggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCglu ZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpcigg ZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXZBbGw6IGZ1bmN0aW9uKCBl bGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJs aW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGls ICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciLCB1 bnRpbCApOwoJfSwKCXByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGls ICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5n IiwgdW50aWwgKTsKCX0sCglzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7CgkJ cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSAp LmZpcnN0Q2hpbGQsIGVsZW0gKTsKCX0sCgljaGlsZHJlbjogZnVuY3Rpb24oIGVs ZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQg KTsKCX0sCgljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpR dWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CgkJCWVsZW0uY29udGVu dERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CgkJCWpR dWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApOwoJfQp9LCBmdW5jdGlv biggbmFtZSwgZm4gKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1 bnRpbCwgc2VsZWN0b3IgKSB7CgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMs IGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRp bCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9y ICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpR dWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCWlmICggdGhpcy5s ZW5ndGggPiAxICkgewoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFn dWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlyZXQgPSBqUXVlcnkudW5p cXVlKCByZXQgKTsKCQkJfQoKCQkJLy8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50 cyogYW5kIHByZXYtZGVyaXZhdGl2ZXMKCQkJaWYgKCBycGFyZW50c3ByZXYudGVz dCggbmFtZSApICkgewoJCQkJcmV0ID0gcmV0LnJldmVyc2UoKTsKCQkJfQoJCX0K CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0pOwp2YXIgcm5v dHdoaXRlID0gKC9cUysvZyk7CgoKCi8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9u cyBmb3JtYXQgY2FjaGUKdmFyIG9wdGlvbnNDYWNoZSA9IHt9OwoKLy8gQ29udmVy dCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVk IG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMo IG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25z IF0gPSB7fTsKCWpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUg KSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7CgkJb2JqZWN0WyBmbGFnIF0g PSB0cnVlOwoJfSk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBj YWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoK ICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQg b3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBs aXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QK ICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBh biBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0 aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJ CQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJl ZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtl ZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNh bGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJl ZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJ dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVu c3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxp Y2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBj YWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1 ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZl cnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1h dHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9w dGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCSggb3B0aW9u c0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkg OgoJCWpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7CgoJdmFyIC8vIEZsYWcg dG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmcKCQlmaXJpbmcsCgkJ Ly8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQoJ CW1lbW9yeSwKCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBm aXJlZAoJCWZpcmVkLAoJCS8vIEVuZCBvZiB0aGUgbG9vcCB3aGVuIGZpcmluZwoJ CWZpcmluZ0xlbmd0aCwKCQkvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNh bGxiYWNrIChtb2RpZmllZCBieSByZW1vdmUgaWYgbmVlZGVkKQoJCWZpcmluZ0lu ZGV4LAoJCS8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxs eSBieSBhZGQgYW5kIGZpcmVXaXRoKQoJCWZpcmluZ1N0YXJ0LAoJCS8vIEFjdHVh bCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoJCS8vIFN0YWNrIG9mIGZpcmUg Y2FsbHMgZm9yIHJlcGVhdGFibGUgbGlzdHMKCQlzdGFjayA9ICFvcHRpb25zLm9u Y2UgJiYgW10sCgkJLy8gRmlyZSBjYWxsYmFja3MKCQlmaXJlID0gZnVuY3Rpb24o IGRhdGEgKSB7CgkJCW1lbW9yeSA9IG9wdGlvbnMubWVtb3J5ICYmIGRhdGE7CgkJ CWZpcmVkID0gdHJ1ZTsKCQkJZmlyaW5nSW5kZXggPSBmaXJpbmdTdGFydCB8fCAw OwoJCQlmaXJpbmdTdGFydCA9IDA7CgkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVu Z3RoOwoJCQlmaXJpbmcgPSB0cnVlOwoJCQlmb3IgKCA7IGxpc3QgJiYgZmlyaW5n SW5kZXggPCBmaXJpbmdMZW5ndGg7IGZpcmluZ0luZGV4KysgKSB7CgkJCQlpZiAo IGxpc3RbIGZpcmluZ0luZGV4IF0uYXBwbHkoIGRhdGFbIDAgXSwgZGF0YVsgMSBd ICkgPT09IGZhbHNlICYmIG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgkJCQkJbWVt b3J5ID0gZmFsc2U7IC8vIFRvIHByZXZlbnQgZnVydGhlciBjYWxscyB1c2luZyBh ZGQKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlmaXJpbmcgPSBmYWxzZTsKCQkJ aWYgKCBsaXN0ICkgewoJCQkJaWYgKCBzdGFjayApIHsKCQkJCQlpZiAoIHN0YWNr Lmxlbmd0aCApIHsKCQkJCQkJZmlyZSggc3RhY2suc2hpZnQoKSApOwoJCQkJCX0K CQkJCX0gZWxzZSBpZiAoIG1lbW9yeSApIHsKCQkJCQlsaXN0ID0gW107CgkJCQl9 IGVsc2UgewoJCQkJCXNlbGYuZGlzYWJsZSgpOwoJCQkJfQoJCQl9CgkJfSwKCQkv LyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdAoJCXNlbGYgPSB7CgkJCS8vIEFkZCBh IGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxp c3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCQkJCQkv LyBGaXJzdCwgd2Ugc2F2ZSB0aGUgY3VycmVudCBsZW5ndGgKCQkJCQl2YXIgc3Rh cnQgPSBsaXN0Lmxlbmd0aDsKCQkJCQkoZnVuY3Rpb24gYWRkKCBhcmdzICkgewoJ CQkJCQlqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJ CQkJCXZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApOwoJCQkJCQkJaWYgKCB0 eXBlID09PSAiZnVuY3Rpb24iICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5p cXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCgg YXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5s ZW5ndGggJiYgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCQkJCQkJLy8gSW5zcGVj dCByZWN1cnNpdmVseQoJCQkJCQkJCWFkZCggYXJnICk7CgkJCQkJCQl9CgkJCQkJ CX0pOwoJCQkJCX0pKCBhcmd1bWVudHMgKTsKCQkJCQkvLyBEbyB3ZSBuZWVkIHRv IGFkZCB0aGUgY2FsbGJhY2tzIHRvIHRoZQoJCQkJCS8vIGN1cnJlbnQgZmlyaW5n IGJhdGNoPwoJCQkJCWlmICggZmlyaW5nICkgewoJCQkJCQlmaXJpbmdMZW5ndGgg PSBsaXN0Lmxlbmd0aDsKCQkJCQkvLyBXaXRoIG1lbW9yeSwgaWYgd2UncmUgbm90 IGZpcmluZyB0aGVuCgkJCQkJLy8gd2Ugc2hvdWxkIGNhbGwgcmlnaHQgYXdheQoJ CQkJCX0gZWxzZSBpZiAoIG1lbW9yeSApIHsKCQkJCQkJZmlyaW5nU3RhcnQgPSBz dGFydDsKCQkJCQkJZmlyZSggbWVtb3J5ICk7CgkJCQkJfQoJCQkJfQoJCQkJcmV0 dXJuIHRoaXM7CgkJCX0sCgkJCS8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhl IGxpc3QKCQkJcmVtb3ZlOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsK CQkJCQlqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkg ewoJCQkJCQl2YXIgaW5kZXg7CgkJCQkJCXdoaWxlICggKCBpbmRleCA9IGpRdWVy eS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkgewoJCQkJCQkJ bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQkJCQkvLyBIYW5kbGUgZmlyaW5n IGluZGV4ZXMKCQkJCQkJCWlmICggZmlyaW5nICkgewoJCQkJCQkJCWlmICggaW5k ZXggPD0gZmlyaW5nTGVuZ3RoICkgewoJCQkJCQkJCQlmaXJpbmdMZW5ndGgtLTsK CQkJCQkJCQl9CgkJCQkJCQkJaWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHsK CQkJCQkJCQkJZmlyaW5nSW5kZXgtLTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJ CX0KCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQkvLyBD aGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJ ZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxp c3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4g KSB7CgkJCQlyZXR1cm4gZm4gPyBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+ IC0xIDogISEoIGxpc3QgJiYgbGlzdC5sZW5ndGggKTsKCQkJfSwKCQkJLy8gUmVt b3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdAoJCQllbXB0eTogZnVuY3Rp b24oKSB7CgkJCQlsaXN0ID0gW107CgkJCQlmaXJpbmdMZW5ndGggPSAwOwoJCQkJ cmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGlu ZyBhbnltb3JlCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbGlzdCA9IHN0 YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0s CgkJCS8vIElzIGl0IGRpc2FibGVkPwoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7 CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgkJCS8vIExvY2sgdGhlIGxpc3QgaW4g aXRzIGN1cnJlbnQgc3RhdGUKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlzdGFj ayA9IHVuZGVmaW5lZDsKCQkJCWlmICggIW1lbW9yeSApIHsKCQkJCQlzZWxmLmRp c2FibGUoKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQkvLyBJcyBp dCBsb2NrZWQ/CgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIXN0 YWNrOwoJCQl9LAoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2 ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbigg Y29udGV4dCwgYXJncyApIHsKCQkJCWlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBz dGFjayApICkgewoJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJCWFyZ3MgPSBb IGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07CgkJ CQkJaWYgKCBmaXJpbmcgKSB7CgkJCQkJCXN0YWNrLnB1c2goIGFyZ3MgKTsKCQkJ CQl9IGVsc2UgewoJCQkJCQlmaXJlKCBhcmdzICk7CgkJCQkJfQoJCQkJfQoJCQkJ cmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mg d2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJ CQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4g dGhpczsKCQkJfSwKCQkJLy8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUg YWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlCgkJCWZpcmVkOiBmdW5j dGlvbigpIHsKCQkJCXJldHVybiAhIWZpcmVkOwoJCQl9CgkJfTsKCglyZXR1cm4g c2VsZjsKfTsKCgpqUXVlcnkuZXh0ZW5kKHsKCglEZWZlcnJlZDogZnVuY3Rpb24o IGZ1bmMgKSB7CgkJdmFyIHR1cGxlcyA9IFsKCQkJCS8vIGFjdGlvbiwgYWRkIGxp c3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZQoJCQkJWyAicmVzb2x2 ZSIsICJkb25lIiwgalF1ZXJ5LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwgInJl c29sdmVkIiBdLAoJCQkJWyAicmVqZWN0IiwgImZhaWwiLCBqUXVlcnkuQ2FsbGJh Y2tzKCJvbmNlIG1lbW9yeSIpLCAicmVqZWN0ZWQiIF0sCgkJCQlbICJub3RpZnki LCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCJtZW1vcnkiKSBdCgkJCV0s CgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6 IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdh eXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyAp LmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJ CXRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAq LyApIHsKCQkJCQl2YXIgZm5zID0gYXJndW1lbnRzOwoJCQkJCXJldHVybiBqUXVl cnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnku ZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgkJCQkJCQl2YXIg Zm4gPSBqUXVlcnkuaXNGdW5jdGlvbiggZm5zWyBpIF0gKSAmJiBmbnNbIGkgXTsK CQkJCQkJCS8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9y IGZvcndhcmRpbmcgYWN0aW9ucyB0byBuZXdEZWZlcgoJCQkJCQkJZGVmZXJyZWRb IHR1cGxlWzFdIF0oZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0g Zm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICgg cmV0dXJuZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2Ug KSApIHsKCQkJCQkJCQkJcmV0dXJuZWQucHJvbWlzZSgpCgkJCQkJCQkJCQkuZG9u ZSggbmV3RGVmZXIucmVzb2x2ZSApCgkJCQkJCQkJCQkuZmFpbCggbmV3RGVmZXIu cmVqZWN0ICkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7 CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJbmV3RGVmZXJbIHR1cGxlWyAwIF0g KyAiV2l0aCIgXSggdGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21pc2Uo KSA6IHRoaXMsIGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzICk7CgkJCQkJ CQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0pOwoJCQkJCQlmbnMgPSBudWxsOwoJCQkJ CX0pLnByb21pc2UoKTsKCQkJCX0sCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0 aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9t aXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBm dW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVy eS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwK CQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gS2VlcCBwaXBlIGZvciBiYWNrLWNvbXBh dAoJCXByb21pc2UucGlwZSA9IHByb21pc2UudGhlbjsKCgkJLy8gQWRkIGxpc3Qt c3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9u KCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3Rh dGVTdHJpbmcgPSB0dXBsZVsgMyBdOwoKCQkJLy8gcHJvbWlzZVsgZG9uZSB8IGZh aWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGQKCQkJcHJvbWlzZVsgdHVwbGVbMV0g XSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVT dHJpbmcgKSB7CgkJCQlsaXN0LmFkZChmdW5jdGlvbigpIHsKCQkJCQkvLyBzdGF0 ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdCgkJCQkJc3RhdGUgPSBzdGF0ZVN0 cmluZzsKCgkJCQkvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlz YWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrCgkJCQl9LCB0dXBsZXNbIGkgXiAxIF1b IDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTsKCQkJfQoKCQkJ Ly8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXQoJCQlkZWZl cnJlZFsgdHVwbGVbMF0gXSA9IGZ1bmN0aW9uKCkgewoJCQkJZGVmZXJyZWRbIHR1 cGxlWzBdICsgIldpdGgiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gcHJvbWlzZSA6 IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgkJCWRl ZmVycmVkWyB0dXBsZVswXSArICJXaXRoIiBdID0gbGlzdC5maXJlV2l0aDsKCQl9 KTsKCgkJLy8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlCgkJcHJvbWlzZS5w cm9taXNlKCBkZWZlcnJlZCApOwoKCQkvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55 CgkJaWYgKCBmdW5jICkgewoJCQlmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJl ZCApOwoJCX0KCgkJLy8gQWxsIGRvbmUhCgkJcmV0dXJuIGRlZmVycmVkOwoJfSwK CgkvLyBEZWZlcnJlZCBoZWxwZXIKCXdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0 ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkgewoJCXZhciBpID0gMCwKCQkJ cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoJCQlsZW5n dGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCwKCgkJCS8vIHRoZSBjb3VudCBvZiB1 bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXMKCQkJcmVtYWluaW5nID0gbGVuZ3RoICE9 PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9y ZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKCgkJCS8vIHRoZSBtYXN0 ZXIgRGVmZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEg c2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgoJCQlkZWZlcnJlZCA9IHJl bWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCks CgoJCQkvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJv Z3Jlc3MgdmFsdWVzCgkJCXVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4 dHMsIHZhbHVlcyApIHsKCQkJCXJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJ CQkJY29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJdmFsdWVzWyBpIF0gPSBhcmd1 bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFs dWU7CgkJCQkJaWYgKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkgewoJCQkJ CQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7CgoJCQkJ CX0gZWxzZSBpZiAoICEoLS1yZW1haW5pbmcpICkgewoJCQkJCQlkZWZlcnJlZC5y ZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApOwoJCQkJCX0KCQkJCX07CgkJ CX0sCgoJCQlwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2 ZUNvbnRleHRzOwoKCQkvLyBhZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9y ZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkCgkJaWYgKCBsZW5ndGgg PiAxICkgewoJCQlwcm9ncmVzc1ZhbHVlcyA9IG5ldyBBcnJheSggbGVuZ3RoICk7 CgkJCXByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwoJCQly ZXNvbHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApOwoJCQlmb3IgKCA7 IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWlmICggcmVzb2x2ZVZhbHVlc1sgaSBd ICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlz ZSApICkgewoJCQkJCXJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKCkKCQkJCQkJ LmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZh bHVlcyApICkKCQkJCQkJLmZhaWwoIGRlZmVycmVkLnJlamVjdCApCgkJCQkJCS5w cm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jl c3NWYWx1ZXMgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQktLXJlbWFpbmluZzsKCQkJ CX0KCQkJfQoJCX0KCgkJLy8gaWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhp bmcsIHJlc29sdmUgdGhlIG1hc3RlcgoJCWlmICggIXJlbWFpbmluZyApIHsKCQkJ ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZh bHVlcyApOwoJCX0KCgkJcmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTsKCX0KfSk7 CgoKLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CnZhciByZWFkeUxp c3Q7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgkvLyBBZGQg dGhlIGNhbGxiYWNrCglqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7 CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKHsKCS8vIElzIHRoZSBE T00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMu Cglpc1JlYWR5OiBmYWxzZSwKCgkvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1h bnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlCgkvLyB0aGUgcmVhZHkgZXZlbnQg ZmlyZXMuIFNlZSAjNjc4MQoJcmVhZHlXYWl0OiAxLAoKCS8vIEhvbGQgKG9yIHJl bGVhc2UpIHRoZSByZWFkeSBldmVudAoJaG9sZFJlYWR5OiBmdW5jdGlvbiggaG9s ZCApIHsKCQlpZiAoIGhvbGQgKSB7CgkJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCQl9 IGVsc2UgewoJCQlqUXVlcnkucmVhZHkoIHRydWUgKTsKCQl9Cgl9LAoKCS8vIEhh bmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKCXJlYWR5OiBmdW5jdGlvbiggd2Fp dCApIHsKCgkJLy8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Ig d2UncmUgYWxyZWFkeSByZWFkeQoJCWlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1 ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkgewoJCQlyZXR1cm47CgkJ fQoKCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNl IElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJ aWYgKCAhZG9jdW1lbnQuYm9keSApIHsKCQkJcmV0dXJuIHNldFRpbWVvdXQoIGpR dWVyeS5yZWFkeSApOwoJCX0KCgkJLy8gUmVtZW1iZXIgdGhhdCB0aGUgRE9NIGlz IHJlYWR5CgkJalF1ZXJ5LmlzUmVhZHkgPSB0cnVlOwoKCQkvLyBJZiBhIG5vcm1h bCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYg bmVlZCBiZQoJCWlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdh aXQgPiAwICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBJZiB0aGVyZSBhcmUgZnVu Y3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCgkJcmVhZHlMaXN0LnJlc29sdmVXaXRo KCBkb2N1bWVudCwgWyBqUXVlcnkgXSApOwoKCQkvLyBUcmlnZ2VyIGFueSBib3Vu ZCByZWFkeSBldmVudHMKCQlpZiAoIGpRdWVyeS5mbi50cmlnZ2VySGFuZGxlciAp IHsKCQkJalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCAicmVhZHki ICk7CgkJCWpRdWVyeSggZG9jdW1lbnQgKS5vZmYoICJyZWFkeSIgKTsKCQl9Cgl9 Cn0pOwoKLyoqCiAqIENsZWFuLXVwIG1ldGhvZCBmb3IgZG9tIHJlYWR5IGV2ZW50 cwogKi8KZnVuY3Rpb24gZGV0YWNoKCkgewoJaWYgKCBkb2N1bWVudC5hZGRFdmVu dExpc3RlbmVyICkgewoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJE T01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOwoJCXdpbmRvdy5y ZW1vdmVFdmVudExpc3RlbmVyKCAibG9hZCIsIGNvbXBsZXRlZCwgZmFsc2UgKTsK Cgl9IGVsc2UgewoJCWRvY3VtZW50LmRldGFjaEV2ZW50KCAib25yZWFkeXN0YXRl Y2hhbmdlIiwgY29tcGxldGVkICk7CgkJd2luZG93LmRldGFjaEV2ZW50KCAib25s b2FkIiwgY29tcGxldGVkICk7Cgl9Cn0KCi8qKgogKiBUaGUgcmVhZHkgZXZlbnQg aGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZAogKi8KZnVuY3Rpb24gY29t cGxldGVkKCkgewoJLy8gcmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiBpcyBnb29k IGVub3VnaCBmb3IgdXMgdG8gY2FsbCB0aGUgZG9tIHJlYWR5IGluIG9sZElFCglp ZiAoIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgfHwgZXZlbnQudHlwZSA9PT0g ImxvYWQiIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7 CgkJZGV0YWNoKCk7CgkJalF1ZXJ5LnJlYWR5KCk7Cgl9Cn0KCmpRdWVyeS5yZWFk eS5wcm9taXNlID0gZnVuY3Rpb24oIG9iaiApIHsKCWlmICggIXJlYWR5TGlzdCAp IHsKCgkJcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgoJCS8vIENhdGNo IGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkIGFmdGVy IHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLgoJCS8vIHdl IG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgImludGVyYWN0aXZlIiBoZXJl LCBidXQgaXQgY2F1c2VkIGlzc3VlcyBsaWtlIHRoZSBvbmUKCQkvLyBkaXNjb3Zl cmVkIGJ5IENocmlzUyBoZXJlOiBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tl dC8xMjI4MiNjb21tZW50OjE1CgkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09 PSAiY29tcGxldGUiICkgewoJCQkvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkg dG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHkK CQkJc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7CgoJCS8vIFN0YW5kYXJkcy1i YXNlZCBicm93c2VycyBzdXBwb3J0IERPTUNvbnRlbnRMb2FkZWQKCQl9IGVsc2Ug aWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQkvLyBVc2UgdGhl IGhhbmR5IGV2ZW50IGNhbGxiYWNrCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVu ZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkLCBmYWxzZSApOwoKCQkJ Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlz IHdvcmsKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICJsb2FkIiwgY29tcGxl dGVkLCBmYWxzZSApOwoKCQkvLyBJZiBJRSBldmVudCBtb2RlbCBpcyB1c2VkCgkJ fSBlbHNlIHsKCQkJLy8gRW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLCBtYXli ZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXMKCQkJZG9jdW1lbnQuYXR0 YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBjb21wbGV0ZWQgKTsKCgkJ CS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5 cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGNvbXBsZXRl ZCApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVh bGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFy IHRvcCA9IGZhbHNlOwoKCQkJdHJ5IHsKCQkJCXRvcCA9IHdpbmRvdy5mcmFtZUVs ZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CgkJCX0g Y2F0Y2goZSkge30KCgkJCWlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHsKCQkJ CShmdW5jdGlvbiBkb1Njcm9sbENoZWNrKCkgewoJCQkJCWlmICggIWpRdWVyeS5p c1JlYWR5ICkgewoKCQkJCQkJdHJ5IHsKCQkJCQkJCS8vIFVzZSB0aGUgdHJpY2sg YnkgRGllZ28gUGVyaW5pCgkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2Jv eC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQkJCQkJdG9wLmRvU2Nyb2xsKCJsZWZ0 Iik7CgkJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQkJcmV0dXJuIHNldFRpbWVvdXQo IGRvU2Nyb2xsQ2hlY2ssIDUwICk7CgkJCQkJCX0KCgkJCQkJCS8vIGRldGFjaCBh bGwgZG9tIHJlYWR5IGV2ZW50cwoJCQkJCQlkZXRhY2goKTsKCgkJCQkJCS8vIGFu ZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucwoJCQkJCQlqUXVlcnkucmVh ZHkoKTsKCQkJCQl9CgkJCQl9KSgpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIHJlYWR5 TGlzdC5wcm9taXNlKCBvYmogKTsKfTsKCgp2YXIgc3RydW5kZWZpbmVkID0gdHlw ZW9mIHVuZGVmaW5lZDsKCgoKLy8gU3VwcG9ydDogSUU8OQovLyBJdGVyYXRpb24g b3ZlciBvYmplY3QncyBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWZvcmUgaXRzIG93 bgp2YXIgaTsKZm9yICggaSBpbiBqUXVlcnkoIHN1cHBvcnQgKSApIHsKCWJyZWFr Owp9CnN1cHBvcnQub3duTGFzdCA9IGkgIT09ICIwIjsKCi8vIE5vdGU6IG1vc3Qg c3VwcG9ydCB0ZXN0cyBhcmUgZGVmaW5lZCBpbiB0aGVpciByZXNwZWN0aXZlIG1v ZHVsZXMuCi8vIGZhbHNlIHVudGlsIHRoZSB0ZXN0IGlzIHJ1bgpzdXBwb3J0Lmlu bGluZUJsb2NrTmVlZHNMYXlvdXQgPSBmYWxzZTsKCi8vIEV4ZWN1dGUgQVNBUCBp biBjYXNlIHdlIG5lZWQgdG8gc2V0IGJvZHkuc3R5bGUuem9vbQpqUXVlcnkoZnVu Y3Rpb24oKSB7CgkvLyBNaW5pZmllZDogdmFyIGEsYixjLGQKCXZhciB2YWwsIGRp diwgYm9keSwgY29udGFpbmVyOwoKCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50 c0J5VGFnTmFtZSggImJvZHkiIClbIDAgXTsKCWlmICggIWJvZHkgfHwgIWJvZHku c3R5bGUgKSB7CgkJLy8gUmV0dXJuIGZvciBmcmFtZXNldCBkb2NzIHRoYXQgZG9u J3QgaGF2ZSBhIGJvZHkKCQlyZXR1cm47Cgl9CgoJLy8gU2V0dXAKCWRpdiA9IGRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7Cgljb250YWluZXIgPSBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoJY29udGFpbmVyLnN0eWxlLmNz c1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWln aHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiOwoJYm9keS5hcHBlbmRDaGlsZCggY29u dGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCWlmICggdHlwZW9mIGRpdi5z dHlsZS56b29tICE9PSBzdHJ1bmRlZmluZWQgKSB7CgkJLy8gU3VwcG9ydDogSUU8 OAoJCS8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFj dCBsaWtlIGlubGluZS1ibG9jawoJCS8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0 aGVpciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmcKCQkvLyB0aGVtIGxh eW91dAoJCWRpdi5zdHlsZS5jc3NUZXh0ID0gImRpc3BsYXk6aW5saW5lO21hcmdp bjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiOwoKCQlz dXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgPSB2YWwgPSBkaXYub2Zmc2V0 V2lkdGggPT09IDM7CgkJaWYgKCB2YWwgKSB7CgkJCS8vIFByZXZlbnQgSUUgNiBm cm9tIGFmZmVjdGluZyBsYXlvdXQgZm9yIHBvc2l0aW9uZWQgZWxlbWVudHMgIzEx MDQ4CgkJCS8vIFByZXZlbnQgSUUgZnJvbSBzaHJpbmtpbmcgdGhlIGJvZHkgaW4g SUUgNyBtb2RlICMxMjg2OQoJCQkvLyBTdXBwb3J0OiBJRTw4CgkJCWJvZHkuc3R5 bGUuem9vbSA9IDE7CgkJfQoJfQoKCWJvZHkucmVtb3ZlQ2hpbGQoIGNvbnRhaW5l ciApOwp9KTsKCgoKCihmdW5jdGlvbigpIHsKCXZhciBkaXYgPSBkb2N1bWVudC5j cmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEV4ZWN1dGUgdGhlIHRlc3Qgb25s eSBpZiBub3QgYWxyZWFkeSBleGVjdXRlZCBpbiBhbm90aGVyIG1vZHVsZS4KCWlm IChzdXBwb3J0LmRlbGV0ZUV4cGFuZG8gPT0gbnVsbCkgewoJCS8vIFN1cHBvcnQ6 IElFPDkKCQlzdXBwb3J0LmRlbGV0ZUV4cGFuZG8gPSB0cnVlOwoJCXRyeSB7CgkJ CWRlbGV0ZSBkaXYudGVzdDsKCQl9IGNhdGNoKCBlICkgewoJCQlzdXBwb3J0LmRl bGV0ZUV4cGFuZG8gPSBmYWxzZTsKCQl9Cgl9CgoJLy8gTnVsbCBlbGVtZW50cyB0 byBhdm9pZCBsZWFrcyBpbiBJRS4KCWRpdiA9IG51bGw7Cn0pKCk7CgoKLyoqCiAq IERldGVybWluZXMgd2hldGhlciBhbiBvYmplY3QgY2FuIGhhdmUgZGF0YQogKi8K alF1ZXJ5LmFjY2VwdERhdGEgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub0Rh dGEgPSBqUXVlcnkubm9EYXRhWyAoZWxlbS5ub2RlTmFtZSArICIgIikudG9Mb3dl ckNhc2UoKSBdLAoJCW5vZGVUeXBlID0gK2VsZW0ubm9kZVR5cGUgfHwgMTsKCgkv LyBEbyBub3Qgc2V0IGRhdGEgb24gbm9uLWVsZW1lbnQgRE9NIG5vZGVzIGJlY2F1 c2UgaXQgd2lsbCBub3QgYmUgY2xlYXJlZCAoIzgzMzUpLgoJcmV0dXJuIG5vZGVU eXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ID8KCQlmYWxzZSA6CgoJCS8vIE5v ZGVzIGFjY2VwdCBkYXRhIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkOyByZWpl Y3Rpb24gY2FuIGJlIGNvbmRpdGlvbmFsCgkJIW5vRGF0YSB8fCBub0RhdGEgIT09 IHRydWUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSA9PT0gbm9EYXRh Owp9OwoKCnZhciByYnJhY2UgPSAvXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxd KSQvLAoJcm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7CgpmdW5jdGlvbiBkYXRhQXR0 ciggZWxlbSwga2V5LCBkYXRhICkgewoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQg aW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBI VE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAm JiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoKCQl2YXIgbmFtZSA9ICJkYXRhLSIg KyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIi0kMSIgKS50b0xvd2VyQ2FzZSgp OwoKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0 eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0g ZGF0YSA9PT0gInRydWUiID8gdHJ1ZSA6CgkJCQkJZGF0YSA9PT0gImZhbHNlIiA/ IGZhbHNlIDoKCQkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoKCQkJCQkvLyBP bmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhl IHN0cmluZwoJCQkJCStkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6CgkJCQkJ cmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6 CgkJCQkJZGF0YTsKCQkJfSBjYXRjaCggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUg d2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJalF1 ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOwoKCQl9IGVsc2UgewoJCQlkYXRh ID0gdW5kZWZpbmVkOwoJCX0KCX0KCglyZXR1cm4gZGF0YTsKfQoKLy8gY2hlY2tz IGEgY2FjaGUgb2JqZWN0IGZvciBlbXB0aW5lc3MKZnVuY3Rpb24gaXNFbXB0eURh dGFPYmplY3QoIG9iaiApIHsKCXZhciBuYW1lOwoJZm9yICggbmFtZSBpbiBvYmog KSB7CgoJCS8vIGlmIHRoZSBwdWJsaWMgZGF0YSBvYmplY3QgaXMgZW1wdHksIHRo ZSBwcml2YXRlIGlzIHN0aWxsIGVtcHR5CgkJaWYgKCBuYW1lID09PSAiZGF0YSIg JiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9ialtuYW1lXSApICkgewoJCQljb250 aW51ZTsKCQl9CgkJaWYgKCBuYW1lICE9PSAidG9KU09OIiApIHsKCQkJcmV0dXJu IGZhbHNlOwoJCX0KCX0KCglyZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gaW50ZXJu YWxEYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9u bHkgKi8gKSB7CglpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoJ CXJldHVybjsKCX0KCgl2YXIgcmV0LCB0aGlzQ2FjaGUsCgkJaW50ZXJuYWxLZXkg PSBqUXVlcnkuZXhwYW5kbywKCgkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5v ZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkv LyBjYW4ndCBHQyBvYmplY3QgcmVmZXJlbmNlcyBwcm9wZXJseSBhY3Jvc3MgdGhl IERPTS1KUyBib3VuZGFyeQoJCWlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCgoJCS8v IE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpT IG9iamVjdCBkYXRhIGlzCgkJLy8gYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIG9i amVjdCBzbyBHQyBjYW4gb2NjdXIgYXV0b21hdGljYWxseQoJCWNhY2hlID0gaXNO b2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKCgkJLy8gT25seSBkZWZpbmluZyBh biBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMg YWxsb3dzCgkJLy8gdGhlIGNvZGUgdG8gc2hvcnRjdXQgb24gdGhlIHNhbWUgcGF0 aCBhcyBhIERPTSBub2RlIHdpdGggbm8gY2FjaGUKCQlpZCA9IGlzTm9kZSA/IGVs ZW1bIGludGVybmFsS2V5IF0gOiBlbGVtWyBpbnRlcm5hbEtleSBdICYmIGludGVy bmFsS2V5OwoKCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBu ZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkvLyBvYmplY3Qg dGhhdCBoYXMgbm8gZGF0YSBhdCBhbGwKCWlmICggKCFpZCB8fCAhY2FjaGVbaWRd IHx8ICghcHZ0ICYmICFjYWNoZVtpZF0uZGF0YSkpICYmIGRhdGEgPT09IHVuZGVm aW5lZCAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuOwoJ fQoKCWlmICggIWlkICkgewoJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgYSBuZXcg dW5pcXVlIElEIGZvciBlYWNoIGVsZW1lbnQgc2luY2UgdGhlaXIgZGF0YQoJCS8v IGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZQoJCWlmICggaXNOb2RlICkgewoJ CQlpZCA9IGVsZW1bIGludGVybmFsS2V5IF0gPSBkZWxldGVkSWRzLnBvcCgpIHx8 IGpRdWVyeS5ndWlkKys7CgkJfSBlbHNlIHsKCQkJaWQgPSBpbnRlcm5hbEtleTsK CQl9Cgl9CgoJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJLy8gQXZvaWQgZXhwb3Np bmcgalF1ZXJ5IG1ldGFkYXRhIG9uIHBsYWluIEpTIG9iamVjdHMgd2hlbiB0aGUg b2JqZWN0CgkJLy8gaXMgc2VyaWFsaXplZCB1c2luZyBKU09OLnN0cmluZ2lmeQoJ CWNhY2hlWyBpZCBdID0gaXNOb2RlID8ge30gOiB7IHRvSlNPTjogalF1ZXJ5Lm5v b3AgfTsKCX0KCgkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnku ZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cwoJLy8g c2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQoJaWYg KCB0eXBlb2YgbmFtZSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG5hbWUgPT09ICJm dW5jdGlvbiIgKSB7CgkJaWYgKCBwdnQgKSB7CgkJCWNhY2hlWyBpZCBdID0galF1 ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKCQl9IGVsc2UgewoJCQlj YWNoZVsgaWQgXS5kYXRhID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0uZGF0 YSwgbmFtZSApOwoJCX0KCX0KCgl0aGlzQ2FjaGUgPSBjYWNoZVsgaWQgXTsKCgkv LyBqUXVlcnkgZGF0YSgpIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBp bnNpZGUgdGhlIG9iamVjdCdzIGludGVybmFsIGRhdGEKCS8vIGNhY2hlIGluIG9y ZGVyIHRvIGF2b2lkIGtleSBjb2xsaXNpb25zIGJldHdlZW4gaW50ZXJuYWwgZGF0 YSBhbmQgdXNlci1kZWZpbmVkCgkvLyBkYXRhLgoJaWYgKCAhcHZ0ICkgewoJCWlm ICggIXRoaXNDYWNoZS5kYXRhICkgewoJCQl0aGlzQ2FjaGUuZGF0YSA9IHt9OwoJ CX0KCgkJdGhpc0NhY2hlID0gdGhpc0NhY2hlLmRhdGE7Cgl9CgoJaWYgKCBkYXRh ICE9PSB1bmRlZmluZWQgKSB7CgkJdGhpc0NhY2hlWyBqUXVlcnkuY2FtZWxDYXNl KCBuYW1lICkgXSA9IGRhdGE7Cgl9CgoJLy8gQ2hlY2sgZm9yIGJvdGggY29udmVy dGVkLXRvLWNhbWVsIGFuZCBub24tY29udmVydGVkIGRhdGEgcHJvcGVydHkgbmFt ZXMKCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCglpZiAoIHR5 cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCgkJLy8gRmlyc3QgVHJ5IHRvIGZp bmQgYXMtaXMgcHJvcGVydHkgZGF0YQoJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBd OwoKCQkvLyBUZXN0IGZvciBudWxsfHVuZGVmaW5lZCBwcm9wZXJ0eSBkYXRhCgkJ aWYgKCByZXQgPT0gbnVsbCApIHsKCgkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1l bENhc2VkIHByb3BlcnR5CgkJCXJldCA9IHRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVs Q2FzZSggbmFtZSApIF07CgkJfQoJfSBlbHNlIHsKCQlyZXQgPSB0aGlzQ2FjaGU7 Cgl9CgoJcmV0dXJuIHJldDsKfQoKZnVuY3Rpb24gaW50ZXJuYWxSZW1vdmVEYXRh KCBlbGVtLCBuYW1lLCBwdnQgKSB7CglpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSgg ZWxlbSApICkgewoJCXJldHVybjsKCX0KCgl2YXIgdGhpc0NhY2hlLCBpLAoJCWlz Tm9kZSA9IGVsZW0ubm9kZVR5cGUsCgoJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3Ig bW9yZSBpbmZvcm1hdGlvbgoJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hl IDogZWxlbSwKCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0g OiBqUXVlcnkuZXhwYW5kbzsKCgkvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IG5vIGNh Y2hlIGVudHJ5IGZvciB0aGlzIG9iamVjdCwgdGhlcmUgaXMgbm8KCS8vIHB1cnBv c2UgaW4gY29udGludWluZwoJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJcmV0dXJu OwoJfQoKCWlmICggbmFtZSApIHsKCgkJdGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVb IGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhOwoKCQlpZiAoIHRoaXNDYWNoZSApIHsK CgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBu YW1lcyBmb3IgZGF0YSBrZXlzCgkJCWlmICggIWpRdWVyeS5pc0FycmF5KCBuYW1l ICkgKSB7CgoJCQkJLy8gdHJ5IHRoZSBzdHJpbmcgYXMgYSBrZXkgYmVmb3JlIGFu eSBtYW5pcHVsYXRpb24KCQkJCWlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7CgkJ CQkJbmFtZSA9IFsgbmFtZSBdOwoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gc3BsaXQg dGhlIGNhbWVsIGNhc2VkIHZlcnNpb24gYnkgc3BhY2VzIHVubGVzcyBhIGtleSB3 aXRoIHRoZSBzcGFjZXMgZXhpc3RzCgkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENh c2UoIG5hbWUgKTsKCQkJCQlpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkgewoJCQkJ CQluYW1lID0gWyBuYW1lIF07CgkJCQkJfSBlbHNlIHsKCQkJCQkJbmFtZSA9IG5h bWUuc3BsaXQoIiAiKTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBJ ZiAibmFtZSIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLgoJCQkJLy8gV2hlbiBkYXRh IGlzIGluaXRpYWxseSBjcmVhdGVkLCB2aWEgKCJrZXkiLCAidmFsIikgc2lnbmF0 dXJlLAoJCQkJLy8ga2V5cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBjYW1lbENhc2Uu CgkJCQkvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtl eSB3YXMgYWRkZWQsIHJlbW92ZQoJCQkJLy8gYm90aCBwbGFpbiBrZXkgYW5kIGNh bWVsQ2FzZSBrZXkuICMxMjc4NgoJCQkJLy8gVGhpcyB3aWxsIG9ubHkgcGVuYWxp emUgdGhlIGFycmF5IGFyZ3VtZW50IHBhdGguCgkJCQluYW1lID0gbmFtZS5jb25j YXQoIGpRdWVyeS5tYXAoIG5hbWUsIGpRdWVyeS5jYW1lbENhc2UgKSApOwoJCQl9 CgoJCQlpID0gbmFtZS5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJZGVs ZXRlIHRoaXNDYWNoZVsgbmFtZVtpXSBdOwoJCQl9CgoJCQkvLyBJZiB0aGVyZSBp cyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVl CgkJCS8vIGFuZCBsZXQgdGhlIGNhY2hlIG9iamVjdCBpdHNlbGYgZ2V0IGRlc3Ry b3llZAoJCQlpZiAoIHB2dCA/ICFpc0VtcHR5RGF0YU9iamVjdCh0aGlzQ2FjaGUp IDogIWpRdWVyeS5pc0VtcHR5T2JqZWN0KHRoaXNDYWNoZSkgKSB7CgkJCQlyZXR1 cm47CgkJCX0KCQl9Cgl9CgoJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGlu Zm9ybWF0aW9uCglpZiAoICFwdnQgKSB7CgkJZGVsZXRlIGNhY2hlWyBpZCBdLmRh dGE7CgoJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3Mg dGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJLy8gaGFkIGJlZW4gdGhlIG9ubHkg dGhpbmcgbGVmdCBpbiBpdAoJCWlmICggIWlzRW1wdHlEYXRhT2JqZWN0KCBjYWNo ZVsgaWQgXSApICkgewoJCQlyZXR1cm47CgkJfQoJfQoKCS8vIERlc3Ryb3kgdGhl IGNhY2hlCglpZiAoIGlzTm9kZSApIHsKCQlqUXVlcnkuY2xlYW5EYXRhKCBbIGVs ZW0gXSwgdHJ1ZSApOwoKCS8vIFVzZSBkZWxldGUgd2hlbiBzdXBwb3J0ZWQgZm9y IGV4cGFuZG9zIG9yIGBjYWNoZWAgaXMgbm90IGEgd2luZG93IHBlciBpc1dpbmRv dyAoIzEwMDgwKQoJLyoganNoaW50IGVxZXFlcTogZmFsc2UgKi8KCX0gZWxzZSBp ZiAoIHN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBjYWNoZSAhPSBjYWNoZS53aW5k b3cgKSB7CgkJLyoganNoaW50IGVxZXFlcTogdHJ1ZSAqLwoJCWRlbGV0ZSBjYWNo ZVsgaWQgXTsKCgkvLyBXaGVuIGFsbCBlbHNlIGZhaWxzLCBudWxsCgl9IGVsc2Ug ewoJCWNhY2hlWyBpZCBdID0gbnVsbDsKCX0KfQoKalF1ZXJ5LmV4dGVuZCh7Cglj YWNoZToge30sCgoJLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyAoc3BhY2Utc3Vm Zml4ZWQgdG8gYXZvaWQgT2JqZWN0LnByb3RvdHlwZSBjb2xsaXNpb25zKQoJLy8g dGhyb3cgdW5jYXRjaGFibGUgZXhjZXB0aW9ucyBpZiB5b3UgYXR0ZW1wdCB0byBz ZXQgZXhwYW5kbyBwcm9wZXJ0aWVzCglub0RhdGE6IHsKCQkiYXBwbGV0ICI6IHRy dWUsCgkJImVtYmVkICI6IHRydWUsCgkJLy8gLi4uYnV0IEZsYXNoIG9iamVjdHMg KHdoaWNoIGhhdmUgdGhpcyBjbGFzc2lkKSAqY2FuKiBoYW5kbGUgZXhwYW5kb3MK CQkib2JqZWN0ICI6ICJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1 NTM1NDAwMDAiCgl9LAoKCWhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWVs ZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtW2pRdWVyeS5l eHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCQlyZXR1cm4gISFl bGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBm dW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHsKCQlyZXR1cm4gaW50ZXJuYWxE YXRhKCBlbGVtLCBuYW1lLCBkYXRhICk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0 aW9uKCBlbGVtLCBuYW1lICkgewoJCXJldHVybiBpbnRlcm5hbFJlbW92ZURhdGEo IGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJ X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBp bnRlcm5hbERhdGEoIGVsZW0sIG5hbWUsIGRhdGEsIHRydWUgKTsKCX0sCgoJX3Jl bW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXJldHVybiBpbnRl cm5hbFJlbW92ZURhdGEoIGVsZW0sIG5hbWUsIHRydWUgKTsKCX0KfSk7CgpqUXVl cnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJ CXZhciBpLCBuYW1lLCBkYXRhLAoJCQllbGVtID0gdGhpc1swXSwKCQkJYXR0cnMg PSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gU3BlY2lhbCBleHBlY3Rp b25zIG9mIC5kYXRhIGJhc2ljYWxseSB0aHdhcnQgalF1ZXJ5LmFjY2VzcywKCQkv LyBzbyBpbXBsZW1lbnQgdGhlIHJlbGV2YW50IGJlaGF2aW9yIG91cnNlbHZlcwoK CQkvLyBHZXRzIGFsbCB2YWx1ZXMKCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkg ewoJCQlpZiAoIHRoaXMubGVuZ3RoICkgewoJCQkJZGF0YSA9IGpRdWVyeS5kYXRh KCBlbGVtICk7CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFqUXVl cnkuX2RhdGEoIGVsZW0sICJwYXJzZWRBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0 cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9y dDogSUUxMSsKCQkJCQkJLy8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxs ICgjMTQ4OTQpCgkJCQkJCWlmICggYXR0cnNbIGkgXSApIHsKCQkJCQkJCW5hbWUg PSBhdHRyc1sgaSBdLm5hbWU7CgkJCQkJCQlpZiAoIG5hbWUuaW5kZXhPZiggImRh dGEtIiApID09PSAwICkgewoJCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNl KCBuYW1lLnNsaWNlKDUpICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUs IGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWpR dWVyeS5fZGF0YSggZWxlbSwgInBhcnNlZEF0dHJzIiwgdHJ1ZSApOwoJCQkJfQoJ CQl9CgoJCQlyZXR1cm4gZGF0YTsKCQl9CgoJCS8vIFNldHMgbXVsdGlwbGUgdmFs dWVzCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAib2JqZWN0IiApIHsKCQkJcmV0dXJu IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCBr ZXkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEg PwoKCQkJLy8gU2V0cyBvbmUgdmFsdWUKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkg ewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSkgOgoK CQkJLy8gR2V0cyBvbmUgdmFsdWUKCQkJLy8gVHJ5IHRvIGZldGNoIGFueSBpbnRl cm5hbGx5IHN0b3JlZCBkYXRhIGZpcnN0CgkJCWVsZW0gPyBkYXRhQXR0ciggZWxl bSwga2V5LCBqUXVlcnkuZGF0YSggZWxlbSwga2V5ICkgKSA6IHVuZGVmaW5lZDsK CX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhp cy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywg a2V5ICk7CgkJfSk7Cgl9Cn0pOwoKCmpRdWVyeS5leHRlbmQoewoJcXVldWU6IGZ1 bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCXZhciBxdWV1ZTsKCgkJaWYg KCBlbGVtICkgewoJCQl0eXBlID0gKCB0eXBlIHx8ICJmeCIgKSArICJxdWV1ZSI7 CgkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlICk7CgoJCQkvLyBT cGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBp cyBqdXN0IGEgbG9va3VwCgkJCWlmICggZGF0YSApIHsKCQkJCWlmICggIXF1ZXVl IHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkgewoJCQkJCXF1ZXVlID0galF1ZXJ5 Ll9kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJ CQl9IGVsc2UgewoJCQkJCXF1ZXVlLnB1c2goIGRhdGEgKTsKCQkJCX0KCQkJfQoJ CQlyZXR1cm4gcXVldWUgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlv biggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIg cXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJc3RhcnRMZW5n dGggPSBxdWV1ZS5sZW5ndGgsCgkJCWZuID0gcXVldWUuc2hpZnQoKSwKCQkJaG9v a3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSwKCQkJbmV4dCA9 IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsK CQkJfTsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMg cmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnBy b2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCQlzdGFydExlbmd0 aC0tOwoJCX0KCgkJaWYgKCBmbiApIHsKCgkJCS8vIEFkZCBhIHByb2dyZXNzIHNl bnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmcKCQkJLy8g YXV0b21hdGljYWxseSBkZXF1ZXVlZAoJCQlpZiAoIHR5cGUgPT09ICJmeCIgKSB7 CgkJCQlxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKCQkJfQoKCQkJLy8g Y2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvbgoJCQlkZWxldGUg aG9va3Muc3RvcDsKCQkJZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKCQl9 CgoJCWlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgewoJCQlob29rcy5lbXB0 eS5maXJlKCk7CgkJfQoJfSwKCgkvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBj b25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciBy ZXR1cm5zIHRoZSBjdXJyZW50IG9uZQoJX3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBl bGVtLCB0eXBlICkgewoJCXZhciBrZXkgPSB0eXBlICsgInF1ZXVlSG9va3MiOwoJ CXJldHVybiBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSApIHx8IGpRdWVyeS5fZGF0 YSggZWxlbSwga2V5LCB7CgkJCWVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNl IG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5fcmVtb3ZlRGF0 YSggZWxlbSwgdHlwZSArICJxdWV1ZSIgKTsKCQkJCWpRdWVyeS5fcmVtb3ZlRGF0 YSggZWxlbSwga2V5ICk7CgkJCX0pCgkJfSk7Cgl9Cn0pOwoKalF1ZXJ5LmZuLmV4 dGVuZCh7CglxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIHNl dHRlciA9IDI7CgoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJ CQlkYXRhID0gdHlwZTsKCQkJdHlwZSA9ICJmeCI7CgkJCXNldHRlci0tOwoJCX0K CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkgewoJCQlyZXR1cm4g alF1ZXJ5LnF1ZXVlKCB0aGlzWzBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0 YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaChmdW5jdGlv bigpIHsKCQkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwg ZGF0YSApOwoKCQkJCS8vIGVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlCgkJ CQlqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTsKCgkJCQlpZiAoIHR5 cGUgPT09ICJmeCIgJiYgcXVldWVbMF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJ CQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9KTsKCX0s CglkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNo KGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJ CX0pOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVy biB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoJLy8gR2V0IGEg cHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQoJ Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpCglwcm9t aXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkgewoJCXZhciB0bXAsCgkJCWNvdW50 ID0gMSwKCQkJZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCQkJZWxlbWVudHMg PSB0aGlzLAoJCQlpID0gdGhpcy5sZW5ndGgsCgkJCXJlc29sdmUgPSBmdW5jdGlv bigpIHsKCQkJCWlmICggISggLS1jb3VudCApICkgewoJCQkJCWRlZmVyLnJlc29s dmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7CgkJCQl9CgkJCX07CgoJ CWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlvYmogPSB0eXBl OwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQl0eXBlID0gdHlwZSB8fCAiZngi OwoKCQl3aGlsZSAoIGktLSApIHsKCQkJdG1wID0galF1ZXJ5Ll9kYXRhKCBlbGVt ZW50c1sgaSBdLCB0eXBlICsgInF1ZXVlSG9va3MiICk7CgkJCWlmICggdG1wICYm IHRtcC5lbXB0eSApIHsKCQkJCWNvdW50Kys7CgkJCQl0bXAuZW1wdHkuYWRkKCBy ZXNvbHZlICk7CgkJCX0KCQl9CgkJcmVzb2x2ZSgpOwoJCXJldHVybiBkZWZlci5w cm9taXNlKCBvYmogKTsKCX0KfSk7CnZhciBwbnVtID0gKC9bKy1dPyg/OlxkKlwu fClcZCsoPzpbZUVdWystXT9cZCt8KS8pLnNvdXJjZTsKCnZhciBjc3NFeHBhbmQg PSBbICJUb3AiLCAiUmlnaHQiLCAiQm90dG9tIiwgIkxlZnQiIF07Cgp2YXIgaXNI aWRkZW4gPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgkJLy8gaXNIaWRkZW4gbWln aHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjsKCQkvLyBp biB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnQKCQll bGVtID0gZWwgfHwgZWxlbTsKCQlyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgImRp c3BsYXkiICkgPT09ICJub25lIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93 bmVyRG9jdW1lbnQsIGVsZW0gKTsKCX07CgoKCi8vIE11bHRpZnVuY3Rpb25hbCBt ZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvbgovLyBU aGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEg ZnVuY3Rpb24KdmFyIGFjY2VzcyA9IGpRdWVyeS5hY2Nlc3MgPSBmdW5jdGlvbigg ZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcg KSB7Cgl2YXIgaSA9IDAsCgkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAoJCWJ1bGsg PSBrZXkgPT0gbnVsbDsKCgkvLyBTZXRzIG1hbnkgdmFsdWVzCglpZiAoIGpRdWVy eS50eXBlKCBrZXkgKSA9PT0gIm9iamVjdCIgKSB7CgkJY2hhaW5hYmxlID0gdHJ1 ZTsKCQlmb3IgKCBpIGluIGtleSApIHsKCQkJalF1ZXJ5LmFjY2VzcyggZWxlbXMs IGZuLCBpLCBrZXlbaV0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8g U2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQg KSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhalF1ZXJ5LmlzRnVuY3Rp b24oIHZhbHVlICkgKSB7CgkJCXJhdyA9IHRydWU7CgkJfQoKCQlpZiAoIGJ1bGsg KSB7CgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJl IHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSAp OwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5n IGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJ Zm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4g YnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0K CQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkg ewoJCQkJZm4oIGVsZW1zW2ldLCBrZXksIHJhdyA/IHZhbHVlIDogdmFsdWUuY2Fs bCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSApOwoJCQl9CgkJ fQoJfQoKCXJldHVybiBjaGFpbmFibGUgPwoJCWVsZW1zIDoKCgkJLy8gR2V0cwoJ CWJ1bGsgPwoJCQlmbi5jYWxsKCBlbGVtcyApIDoKCQkJbGVuZ3RoID8gZm4oIGVs ZW1zWzBdLCBrZXkgKSA6IGVtcHR5R2V0Owp9Owp2YXIgcmNoZWNrYWJsZVR5cGUg PSAoL14oPzpjaGVja2JveHxyYWRpbykkL2kpOwoKCgooZnVuY3Rpb24oKSB7Cgkv LyBNaW5pZmllZDogdmFyIGEsYixjCgl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVh dGVFbGVtZW50KCAiaW5wdXQiICksCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxl bWVudCggImRpdiIgKSwKCQlmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3Vt ZW50RnJhZ21lbnQoKTsKCgkvLyBTZXR1cAoJZGl2LmlubmVySFRNTCA9ICIgIDxs aW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlw ZT0nY2hlY2tib3gnLz4iOwoKCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3Bh Y2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCXN1cHBvcnQubGVhZGluZ1doaXRl c3BhY2UgPSBkaXYuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMzsKCgkvLyBNYWtl IHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBp bnNlcnRlZAoJLy8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxl cwoJc3VwcG9ydC50Ym9keSA9ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0 Ym9keSIgKS5sZW5ndGg7CgoJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50 cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCgkvLyBUaGlz IHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCglzdXBwb3J0Lmh0bWxT ZXJpYWxpemUgPSAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImxpbmsiICku bGVuZ3RoOwoKCS8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50 IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zCgkvLyBXaGVyZSBvdXRlckhUTUwgaXMg dW5kZWZpbmVkLCB0aGlzIHN0aWxsIHdvcmtzCglzdXBwb3J0Lmh0bWw1Q2xvbmUg PQoJCWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJuYXYiICkuY2xvbmVOb2RlKCB0 cnVlICkub3V0ZXJIVE1MICE9PSAiPDpuYXY+PC86bmF2PiI7CgoJLy8gQ2hlY2sg aWYgYSBkaXNjb25uZWN0ZWQgY2hlY2tib3ggd2lsbCByZXRhaW4gaXRzIGNoZWNr ZWQKCS8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAo SUU2LzcpCglpbnB1dC50eXBlID0gImNoZWNrYm94IjsKCWlucHV0LmNoZWNrZWQg PSB0cnVlOwoJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CglzdXBwb3J0 LmFwcGVuZENoZWNrZWQgPSBpbnB1dC5jaGVja2VkOwoKCS8vIE1ha2Ugc3VyZSB0 ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkg Y2xvbmVkCgkvLyBTdXBwb3J0OiBJRTYtSUUxMSsKCWRpdi5pbm5lckhUTUwgPSAi PHRleHRhcmVhPng8L3RleHRhcmVhPiI7CglzdXBwb3J0Lm5vQ2xvbmVDaGVja2Vk ID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1 ZTsKCgkvLyAjMTEyMTcgLSBXZWJLaXQgbG9zZXMgY2hlY2sgd2hlbiB0aGUgbmFt ZSBpcyBhZnRlciB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUKCWZyYWdtZW50LmFwcGVu ZENoaWxkKCBkaXYgKTsKCWRpdi5pbm5lckhUTUwgPSAiPGlucHV0IHR5cGU9J3Jh ZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IjsKCgkvLyBTdXBwb3J0 OiBTYWZhcmkgNS4xLCBpT1MgNS4xLCBBbmRyb2lkIDQueCwgQW5kcm9pZCAyLjMK CS8vIG9sZCBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJl Y3RseSBpbiBmcmFnbWVudHMKCXN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9u ZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tl ZDsKCgkvLyBTdXBwb3J0OiBJRTw5CgkvLyBPcGVyYSBkb2VzIG5vdCBjbG9uZSBl dmVudHMgKGFuZCB0eXBlb2YgZGl2LmF0dGFjaEV2ZW50ID09PSB1bmRlZmluZWQp LgoJLy8gSUU5LTEwIGNsb25lcyBldmVudHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50 LCBidXQgdGhleSBkb24ndCB0cmlnZ2VyIHdpdGggLmNsaWNrKCkKCXN1cHBvcnQu bm9DbG9uZUV2ZW50ID0gdHJ1ZTsKCWlmICggZGl2LmF0dGFjaEV2ZW50ICkgewoJ CWRpdi5hdHRhY2hFdmVudCggIm9uY2xpY2siLCBmdW5jdGlvbigpIHsKCQkJc3Vw cG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKCQl9KTsKCgkJZGl2LmNsb25lTm9k ZSggdHJ1ZSApLmNsaWNrKCk7Cgl9CgoJLy8gRXhlY3V0ZSB0aGUgdGVzdCBvbmx5 IGlmIG5vdCBhbHJlYWR5IGV4ZWN1dGVkIGluIGFub3RoZXIgbW9kdWxlLgoJaWYg KHN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9PSBudWxsKSB7CgkJLy8gU3VwcG9ydDog SUU8OQoJCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IHRydWU7CgkJdHJ5IHsKCQkJ ZGVsZXRlIGRpdi50ZXN0OwoJCX0gY2F0Y2goIGUgKSB7CgkJCXN1cHBvcnQuZGVs ZXRlRXhwYW5kbyA9IGZhbHNlOwoJCX0KCX0KfSkoKTsKCgooZnVuY3Rpb24oKSB7 Cgl2YXIgaSwgZXZlbnROYW1lLAoJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoICJkaXYiICk7CgoJLy8gU3VwcG9ydDogSUU8OSAobGFjayBzdWJtaXQvY2hh bmdlIGJ1YmJsZSksIEZpcmVmb3ggMjMrIChsYWNrIGZvY3VzaW4gZXZlbnQpCglm b3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCBjaGFuZ2U6IHRydWUsIGZvY3VzaW46 IHRydWUgfSkgewoJCWV2ZW50TmFtZSA9ICJvbiIgKyBpOwoKCQlpZiAoICEoc3Vw cG9ydFsgaSArICJCdWJibGVzIiBdID0gZXZlbnROYW1lIGluIHdpbmRvdykgKSB7 CgkJCS8vIEJld2FyZSBvZiBDU1AgcmVzdHJpY3Rpb25zIChodHRwczovL2RldmVs b3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1ApCgkJCWRpdi5zZXRBdHRy aWJ1dGUoIGV2ZW50TmFtZSwgInQiICk7CgkJCXN1cHBvcnRbIGkgKyAiQnViYmxl cyIgXSA9IGRpdi5hdHRyaWJ1dGVzWyBldmVudE5hbWUgXS5leHBhbmRvID09PSBm YWxzZTsKCQl9Cgl9CgoJLy8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBp biBJRS4KCWRpdiA9IG51bGw7Cn0pKCk7CgoKdmFyIHJmb3JtRWxlbXMgPSAvXig/ OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCglya2V5RXZlbnQgPSAvXmtleS8s CglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudSl8 Y2xpY2svLAoJcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291 dGJsdXIpJC8sCglydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlwuKC4rKXwp JC87CgpmdW5jdGlvbiByZXR1cm5UcnVlKCkgewoJcmV0dXJuIHRydWU7Cn0KCmZ1 bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlv biBzYWZlQWN0aXZlRWxlbWVudCgpIHsKCXRyeSB7CgkJcmV0dXJuIGRvY3VtZW50 LmFjdGl2ZUVsZW1lbnQ7Cgl9IGNhdGNoICggZXJyICkgeyB9Cn0KCi8qCiAqIEhl bHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBv ZiB0aGUgcHVibGljIGludGVyZmFjZS4KICogUHJvcHMgdG8gRGVhbiBFZHdhcmRz JyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KICovCmpR dWVyeS5ldmVudCA9IHsKCglnbG9iYWw6IHt9LAoKCWFkZDogZnVuY3Rpb24oIGVs ZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHsKCQl2YXIgdG1w LCBldmVudHMsIHQsIGhhbmRsZU9iakluLAoJCQlzcGVjaWFsLCBldmVudEhhbmRs ZSwgaGFuZGxlT2JqLAoJCQloYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3Jp Z1R5cGUsCgkJCWVsZW1EYXRhID0galF1ZXJ5Ll9kYXRhKCBlbGVtICk7CgoJCS8v IERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBu b2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEg KSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBv YmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlm ICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7 CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9 IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQg dGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3Zl IGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1 aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdz IGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRo ZSBmaXJzdAoJCWlmICggIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgewoJ CQlldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSB7fTsKCQl9CgkJaWYgKCAhKGV2 ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlKSApIHsKCQkJZXZlbnRIYW5kbGUg PSBlbGVtRGF0YS5oYW5kbGUgPSBmdW5jdGlvbiggZSApIHsKCQkJCS8vIERpc2Nh cmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkg YW5kCgkJCQkvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2Ug aGFzIHVubG9hZGVkCgkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gc3RydW5k ZWZpbmVkICYmICghZSB8fCBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5 cGUpID8KCQkJCQlqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGV2ZW50SGFu ZGxlLmVsZW0sIGFyZ3VtZW50cyApIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX07CgkJ CS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBw cmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50cwoJ CQlldmVudEhhbmRsZS5lbGVtID0gZWxlbTsKCQl9CgoJCS8vIEhhbmRsZSBtdWx0 aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKCQl0eXBlcyA9ICggdHlw ZXMgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyAiIiBdOwoJCXQgPSB0 eXBlcy5sZW5ndGg7CgkJd2hpbGUgKCB0LS0gKSB7CgkJCXRtcCA9IHJ0eXBlbmFt ZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CgkJCXR5cGUgPSBvcmlnVHlw ZSA9IHRtcFsxXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWzJdIHx8ICIiICkuc3Bs aXQoICIuIiApLnNvcnQoKTsKCgkJCS8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUs IG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVycwoJCQlpZiAoICF0 eXBlICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIElmIGV2ZW50IGNoYW5n ZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3Ig dGhlIGNoYW5nZWQgdHlwZQoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNp YWxbIHR5cGUgXSB8fCB7fTsKCgkJCS8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRl dGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4g dHlwZQoJCQl0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBl IDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7CgoJCQkvLyBVcGRhdGUgc3Bl Y2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVl cnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gaGFuZGxlT2Jq IGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnMKCQkJaGFuZGxlT2JqID0g alF1ZXJ5LmV4dGVuZCh7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9y aWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJ CQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJ CQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5l ZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1l c3BhY2VzLmpvaW4oIi4iKQoJCQl9LCBoYW5kbGVPYmpJbiApOwoKCQkJLy8gSW5p dCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3QKCQkJ aWYgKCAhKGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0pICkgewoJCQkJaGFuZGxl cnMgPSBldmVudHNbIHR5cGUgXSA9IFtdOwoJCQkJaGFuZGxlcnMuZGVsZWdhdGVD b3VudCA9IDA7CgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRh Y2hFdmVudCBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZh bHNlCgkJCQlpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2Fs bCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFs c2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8g dGhlIGVsZW1lbnQKCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsK CQkJCQkJZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSwg ZmFsc2UgKTsKCgkJCQkJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsK CQkJCQkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5cGUsIGV2ZW50SGFuZGxl ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJ CQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYg KCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFu ZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQg dG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9u dAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5k bGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2Ug ewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtl ZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZv ciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlw ZSBdID0gdHJ1ZTsKCQl9CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1l bW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCgkvLyBEZXRhY2gg YW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92 ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFw cGVkVHlwZXMgKSB7CgkJdmFyIGosIGhhbmRsZU9iaiwgdG1wLAoJCQlvcmlnQ291 bnQsIHQsIGV2ZW50cywKCQkJc3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsCgkJCW5h bWVzcGFjZXMsIG9yaWdUeXBlLAoJCQllbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRh KCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICk7CgoJCWlmICggIWVsZW1E YXRhIHx8ICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHsKCQkJcmV0dXJu OwoJCX0KCgkJLy8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBl czsgdHlwZSBtYXkgYmUgb21pdHRlZAoJCXR5cGVzID0gKCB0eXBlcyB8fCAiIiAp Lm1hdGNoKCBybm90d2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0 aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhl YyggdHlwZXNbdF0gKSB8fCBbXTsKCQkJdHlwZSA9IG9yaWdUeXBlID0gdG1wWzFd OwoJCQluYW1lc3BhY2VzID0gKCB0bXBbMl0gfHwgIiIgKS5zcGxpdCggIi4iICku c29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNw YWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUg KSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZl bnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2Vs ZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVj aWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlw ZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwu YmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBd IHx8IFtdOwoJCQl0bXAgPSB0bXBbMl0gJiYgbmV3IFJlZ0V4cCggIihefFxcLiki ICsgbmFtZXNwYWNlcy5qb2luKCJcXC4oPzouKlxcLnwpIikgKyAiKFxcLnwkKSIg KTsKCgkJCS8vIFJlbW92ZSBtYXRjaGluZyBldmVudHMKCQkJb3JpZ0NvdW50ID0g aiA9IGhhbmRsZXJzLmxlbmd0aDsKCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQloYW5k bGVPYmogPSBoYW5kbGVyc1sgaiBdOwoKCQkJCWlmICggKCBtYXBwZWRUeXBlcyB8 fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiYKCQkJCQkoICFo YW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJgoJ CQkJCSggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkg JiYKCQkJCQkoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNl bGVjdG9yIHx8IHNlbGVjdG9yID09PSAiKioiICYmIGhhbmRsZU9iai5zZWxlY3Rv ciApICkgewoJCQkJCWhhbmRsZXJzLnNwbGljZSggaiwgMSApOwoKCQkJCQlpZiAo IGhhbmRsZU9iai5zZWxlY3RvciApIHsKCQkJCQkJaGFuZGxlcnMuZGVsZWdhdGVD b3VudC0tOwoJCQkJCX0KCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJ CQlzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCQkJCQl9 CgkJCQl9CgkJCX0KCgkJCS8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIg aWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhp c3QKCQkJLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9u IGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCgkJCWlm ICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7CgkJCQlpZiAoICFz cGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwg bmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkgewoJCQkJ CWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxl ICk7CgkJCQl9CgoJCQkJZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwoJCQl9CgkJfQoK CQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJ CWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkgewoJCQlkZWxl dGUgZWxlbURhdGEuaGFuZGxlOwoKCQkJLy8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNr cyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHkK CQkJLy8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlCgkJCWpRdWVyeS5fcmVt b3ZlRGF0YSggZWxlbSwgImV2ZW50cyIgKTsKCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1 bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoJCXZh ciBoYW5kbGUsIG9udHlwZSwgY3VyLAoJCQlidWJibGVUeXBlLCBzcGVjaWFsLCB0 bXAsIGksCgkJCWV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLAoJCQl0 eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCAidHlwZSIgKSA/IGV2ZW50LnR5cGUg OiBldmVudCwKCQkJbmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgIm5h bWVzcGFjZSIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCgiLiIpIDogW107CgoJ CWN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24n dCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxl bS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQly ZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291 dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAo IHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVk ICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCIuIikg Pj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdl eHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2Vz ID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgp OwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgkJb250eXBlID0gdHlwZS5pbmRl eE9mKCI6IikgPCAwICYmICJvbiIgKyB0eXBlOwoKCQkvLyBDYWxsZXIgY2FuIHBh c3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4g ZXZlbnQgdHlwZSBzdHJpbmcKCQlldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5k byBdID8KCQkJZXZlbnQgOgoJCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBl b2YgZXZlbnQgPT09ICJvYmplY3QiICYmIGV2ZW50ICk7CgoJCS8vIFRyaWdnZXIg Yml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5 IChhbHdheXMgdHJ1ZSkKCQlldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMg PyAyIDogMzsKCQlldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIi4i KTsKCQlldmVudC5uYW1lc3BhY2VfcmUgPSBldmVudC5uYW1lc3BhY2UgPwoJCQlu ZXcgUmVnRXhwKCAiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4q XFwufCkiKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAg dGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVz dWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZl bnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBk YXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIg YXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoK CQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFs bG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlz cGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlp ZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwu dHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0 dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGgg aW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnVi YmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEg Z2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFu ZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdygg ZWxlbSApICkgewoKCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBl IHx8IHR5cGU7CgkJCWlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUg KyB0eXBlICkgKSB7CgkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJfQoJCQlm b3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgkJCQlldmVudFBh dGgucHVzaCggY3VyICk7CgkJCQl0bXAgPSBjdXI7CgkJCX0KCgkJCS8vIE9ubHkg YWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFp biBvYmogb3IgZGV0YWNoZWQgRE9NKQoJCQlpZiAoIHRtcCA9PT0gKGVsZW0ub3du ZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7CgkJCQlldmVudFBhdGgucHVzaCgg dG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7 CgkJCX0KCQl9CgoJCS8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGgK CQlpID0gMDsKCQl3aGlsZSAoIChjdXIgPSBldmVudFBhdGhbaSsrXSkgJiYgIWV2 ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgoJCQlldmVudC50eXBlID0g aSA+IDEgPwoJCQkJYnViYmxlVHlwZSA6CgkJCQlzcGVjaWFsLmJpbmRUeXBlIHx8 IHR5cGU7CgoJCQkvLyBqUXVlcnkgaGFuZGxlcgoJCQloYW5kbGUgPSAoIGpRdWVy eS5fZGF0YSggY3VyLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAm JiBqUXVlcnkuX2RhdGEoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUg KSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBO YXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUg XTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGpRdWVyeS5hY2Nl cHREYXRhKCBjdXIgKSApIHsKCQkJCWV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBs eSggY3VyLCBkYXRhICk7CgkJCQlpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2Ug KSB7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0KCQkJfQoJCX0K CQlldmVudC50eXBlID0gdHlwZTsKCgkJLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0 aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdwoJCWlmICggIW9ubHlIYW5kbGVy cyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgoJCQlpZiAoICgh c3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVu dFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UpICYmCgkJCQlqUXVlcnkuYWNj ZXB0RGF0YSggZWxlbSApICkgewoKCQkJCS8vIENhbGwgYSBuYXRpdmUgRE9NIG1l dGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRo ZSBldmVudC4KCQkJCS8vIENhbid0IHVzZSBhbiAuaXNGdW5jdGlvbigpIGNoZWNr IGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCgkJCQkvLyBEb24n dCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xv YmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApCgkJCQlpZiAoIG9udHlwZSAmJiBlbGVt WyB0eXBlIF0gJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkv LyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBp dHMgRk9PKCkgbWV0aG9kCgkJCQkJdG1wID0gZWxlbVsgb250eXBlIF07CgoJCQkJ CWlmICggdG1wICkgewoJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJ fQoKCQkJCQkvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZl bnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQoJCQkJCWpRdWVy eS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCXRyeSB7CgkJCQkJCWVsZW1b IHR5cGUgXSgpOwoJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkvLyBJRTw5IGRp ZXMgb24gZm9jdXMvYmx1ciB0byBoaWRkZW4gZWxlbWVudCAoIzE0ODYsIzEyNTE4 KQoJCQkJCQkvLyBvbmx5IHJlcHJvZHVjaWJsZSBvbiB3aW5YUCBJRTggbmF0aXZl LCBub3QgSUU5IGluIElFOCBtb2RlCgkJCQkJfQoJCQkJCWpRdWVyeS5ldmVudC50 cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CgoJCQkJCWlmICggdG1wICkgewoJCQkJCQll bGVtWyBvbnR5cGUgXSA9IHRtcDsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJl dHVybiBldmVudC5yZXN1bHQ7Cgl9LAoKCWRpc3BhdGNoOiBmdW5jdGlvbiggZXZl bnQgKSB7CgoJCS8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0 aGUgbmF0aXZlIGV2ZW50IG9iamVjdAoJCWV2ZW50ID0galF1ZXJ5LmV2ZW50LmZp eCggZXZlbnQgKTsKCgkJdmFyIGksIHJldCwgaGFuZGxlT2JqLCBtYXRjaGVkLCBq LAoJCQloYW5kbGVyUXVldWUgPSBbXSwKCQkJYXJncyA9IHNsaWNlLmNhbGwoIGFy Z3VtZW50cyApLAoJCQloYW5kbGVycyA9ICggalF1ZXJ5Ll9kYXRhKCB0aGlzLCAi ZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lh bCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJ CS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUg KHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1swXSA9IGV2ZW50OwoJCWV2 ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlz cGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwg aWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFs LnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJ CQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVy UXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQs IGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5 IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJ d2hpbGUgKCAobWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0pICYmICFldmVu dC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQlldmVudC5jdXJyZW50VGFy Z2V0ID0gbWF0Y2hlZC5lbGVtOwoKCQkJaiA9IDA7CgkJCXdoaWxlICggKGhhbmRs ZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdKSAmJiAhZXZlbnQuaXNJbW1l ZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCgkJCQkvLyBUcmlnZ2VyZWQg ZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yCgkJCQkv LyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9z ZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNl KS4KCQkJCWlmICggIWV2ZW50Lm5hbWVzcGFjZV9yZSB8fCBldmVudC5uYW1lc3Bh Y2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoKCQkJCQlldmVu dC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7CgkJCQkJZXZlbnQuZGF0YSA9IGhhbmRs ZU9iai5kYXRhOwoKCQkJCQlyZXQgPSAoIChqUXVlcnkuZXZlbnQuc3BlY2lhbFsg aGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30pLmhhbmRsZSB8fCBoYW5kbGVPYmou aGFuZGxlciApCgkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOwoK CQkJCQlpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQlpZiAoIChldmVu dC5yZXN1bHQgPSByZXQpID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZl bnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJ CQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERp c3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5w b3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRo aXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCglo YW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgc2Vs LCBoYW5kbGVPYmosIG1hdGNoZXMsIGksCgkJCWhhbmRsZXJRdWV1ZSA9IFtdLAoJ CQlkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKCQkJY3Vy ID0gZXZlbnQudGFyZ2V0OwoKCQkvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzCgkJ Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKCMxMzE4MCkK CQkvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgj Mzg2MSkKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYgY3VyLm5vZGVUeXBlICYmICgh ZXZlbnQuYnV0dG9uIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIpICkgewoKCQkJ LyoganNoaW50IGVxZXFlcTogZmFsc2UgKi8KCQkJZm9yICggOyBjdXIgIT0gdGhp czsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHsKCQkJCS8qIGpzaGlu dCBlcWVxZXE6IHRydWUgKi8KCgkJCQkvLyBEb24ndCBjaGVjayBub24tZWxlbWVu dHMgKCMxMzIwOCkKCQkJCS8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2Fi bGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KQoJCQkJ aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgKGN1ci5kaXNhYmxlZCAhPT0gdHJ1 ZSB8fCBldmVudC50eXBlICE9PSAiY2xpY2siKSApIHsKCQkJCQltYXRjaGVzID0g W107CgkJCQkJZm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7 CgkJCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CgoJCQkJCQkvLyBEb24n dCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEz MjAzKQoJCQkJCQlzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyAiICI7CgoJCQkJ CQlpZiAoIG1hdGNoZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7CgkJCQkJCQlt YXRjaGVzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgPwoJCQkJCQkJ CWpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDAgOgoJCQkJCQkJ CWpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7 CgkJCQkJCX0KCQkJCQkJaWYgKCBtYXRjaGVzWyBzZWwgXSApIHsKCQkJCQkJCW1h dGNoZXMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYg KCBtYXRjaGVzLmxlbmd0aCApIHsKCQkJCQkJaGFuZGxlclF1ZXVlLnB1c2goeyBl bGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0pOwoJCQkJCX0KCQkJCX0KCQkJ fQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBo YW5kbGVycwoJCWlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCAp IHsKCQkJaGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiB0aGlzLCBoYW5kbGVyczog aGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKCQl9CgoJCXJldHVy biBoYW5kbGVyUXVldWU7Cgl9LAoKCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewoJ CWlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVu dDsKCQl9CgoJCS8vIENyZWF0ZSBhIHdyaXRhYmxlIGNvcHkgb2YgdGhlIGV2ZW50 IG9iamVjdCBhbmQgbm9ybWFsaXplIHNvbWUgcHJvcGVydGllcwoJCXZhciBpLCBw cm9wLCBjb3B5LAoJCQl0eXBlID0gZXZlbnQudHlwZSwKCQkJb3JpZ2luYWxFdmVu dCA9IGV2ZW50LAoJCQlmaXhIb29rID0gdGhpcy5maXhIb29rc1sgdHlwZSBdOwoK CQlpZiAoICFmaXhIb29rICkgewoJCQl0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBm aXhIb29rID0KCQkJCXJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91 c2VIb29rcyA6CgkJCQlya2V5RXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5rZXlI b29rcyA6CgkJCQl7fTsKCQl9CgkJY29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlz LnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wczsKCgkJ ZXZlbnQgPSBuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWkg PSBjb3B5Lmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJcHJvcCA9IGNvcHlb IGkgXTsKCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsK CQl9CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5 ICgjMTkyNSkKCQlpZiAoICFldmVudC50YXJnZXQgKSB7CgkJCWV2ZW50LnRhcmdl dCA9IG9yaWdpbmFsRXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsKCQl9CgoJ CS8vIFN1cHBvcnQ6IENocm9tZSAyMyssIFNhZmFyaT8KCQkvLyBUYXJnZXQgc2hv dWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCWlmICggZXZl bnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgewoJCQlldmVudC50YXJnZXQgPSBl dmVudC50YXJnZXQucGFyZW50Tm9kZTsKCQl9CgoJCS8vIFN1cHBvcnQ6IElFPDkK CQkvLyBGb3IgbW91c2Uva2V5IGV2ZW50cywgbWV0YUtleT09ZmFsc2UgaWYgaXQn cyB1bmRlZmluZWQgKCMzMzY4LCAjMTEzMjgpCgkJZXZlbnQubWV0YUtleSA9ICEh ZXZlbnQubWV0YUtleTsKCgkJcmV0dXJuIGZpeEhvb2suZmlsdGVyID8gZml4SG9v ay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKCX0sCgoJ Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQg YW5kIE1vdXNlRXZlbnQKCXByb3BzOiAiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJs ZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0 ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5z cGxpdCgiICIpLAoKCWZpeEhvb2tzOiB7fSwKCglrZXlIb29rczogewoJCXByb3Bz OiAiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSwKCQlmaWx0 ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CgoJCQkvLyBBZGQgd2hp Y2ggZm9yIGtleSBldmVudHMKCQkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICkg ewoJCQkJZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8g b3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlOwoJCQl9CgoJCQly ZXR1cm4gZXZlbnQ7CgkJfQoJfSwKCgltb3VzZUhvb2tzOiB7CgkJcHJvcHM6ICJi dXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0 WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQi LnNwbGl0KCIgIiksCgkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFs ICkgewoJCQl2YXIgYm9keSwgZXZlbnREb2MsIGRvYywKCQkJCWJ1dHRvbiA9IG9y aWdpbmFsLmJ1dHRvbiwKCQkJCWZyb21FbGVtZW50ID0gb3JpZ2luYWwuZnJvbUVs ZW1lbnQ7CgoJCQkvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBj bGllbnRYL1kgYXZhaWxhYmxlCgkJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAm JiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7CgkJCQlldmVudERvYyA9IGV2 ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoJCQkJZG9jID0g ZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OwoJCQkJYm9keSA9IGV2ZW50RG9jLmJv ZHk7CgoJCQkJZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2Mg JiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwg MCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNs aWVudExlZnQgfHwgMCApOwoJCQkJZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGll bnRZICsgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNj cm9sbFRvcCAgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9k eSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOwoJCQl9CgoJCQkvLyBBZGQgcmVs YXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJCWlmICggIWV2ZW50LnJlbGF0ZWRU YXJnZXQgJiYgZnJvbUVsZW1lbnQgKSB7CgkJCQlldmVudC5yZWxhdGVkVGFyZ2V0 ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxl bWVudCA6IGZyb21FbGVtZW50OwoJCQl9CgoJCQkvLyBBZGQgd2hpY2ggZm9yIGNs aWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJCS8v IE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0 CgkJCWlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkg ewoJCQkJZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24g JiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApOwoJCQl9CgoJCQly ZXR1cm4gZXZlbnQ7CgkJfQoJfSwKCglzcGVjaWFsOiB7CgkJbG9hZDogewoJCQkv LyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJs aW5nIHRvIHdpbmRvdy5sb2FkCgkJCW5vQnViYmxlOiB0cnVlCgkJfSwKCQlmb2N1 czogewoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVy L2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24o KSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhp cy5mb2N1cyApIHsKCQkJCQl0cnkgewoJCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJ CXJldHVybiBmYWxzZTsKCQkJCQl9IGNhdGNoICggZSApIHsKCQkJCQkJLy8gU3Vw cG9ydDogSUU8OQoJCQkJCQkvLyBJZiB3ZSBlcnJvciBvbiBmb2N1cyB0byBoaWRk ZW4gZWxlbWVudCAoIzE0ODYsICMxMjUxOCksCgkJCQkJCS8vIGxldCAudHJpZ2dl cigpIHJ1biB0aGUgaGFuZGxlcnMKCQkJCQl9CgkJCQl9CgkJCX0sCgkJCWRlbGVn YXRlVHlwZTogImZvY3VzaW4iCgkJfSwKCQlibHVyOiB7CgkJCXRyaWdnZXI6IGZ1 bmN0aW9uKCkgewoJCQkJaWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgp ICYmIHRoaXMuYmx1ciApIHsKCQkJCQl0aGlzLmJsdXIoKTsKCQkJCQlyZXR1cm4g ZmFsc2U7CgkJCQl9CgkJCX0sCgkJCWRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IgoJ CX0sCgkJY2xpY2s6IHsKCQkJLy8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBl dmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHQKCQkJdHJpZ2dlcjog ZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgImlu cHV0IiApICYmIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiAmJiB0aGlzLmNsaWNr ICkgewoJCQkJCXRoaXMuY2xpY2soKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9 CgkJCX0sCgoJCQkvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9u J3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3MKCQkJX2RlZmF1bHQ6IGZ1 bmN0aW9uKCBldmVudCApIHsKCQkJCXJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2 ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsK CQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3Vw cG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBp ZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZl bnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCAp IHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQu cmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfSwKCglzaW11bGF0ZTogZnVuY3Rpb24o IHR5cGUsIGVsZW0sIGV2ZW50LCBidWJibGUgKSB7CgkJLy8gUGlnZ3liYWNrIG9u IGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lLgoJCS8v IEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdh dGlvbiwgYnV0IGlmIHRoZQoJCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBk ZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgoJCXZhciBl ID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVu dCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlLAoJ CQkJb3JpZ2luYWxFdmVudDoge30KCQkJfQoJCSk7CgkJaWYgKCBidWJibGUgKSB7 CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7CgkJfSBl bHNlIHsKCQkJalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmNhbGwoIGVsZW0sIGUgKTsK CQl9CgkJaWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewoJCQlldmVudC5w cmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0KfTsKCmpRdWVyeS5yZW1vdmVFdmVudCA9 IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPwoJZnVuY3Rpb24oIGVsZW0s IHR5cGUsIGhhbmRsZSApIHsKCQlpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5l ciApIHsKCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUs IGZhbHNlICk7CgkJfQoJfSA6CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxl ICkgewoJCXZhciBuYW1lID0gIm9uIiArIHR5cGU7CgoJCWlmICggZWxlbS5kZXRh Y2hFdmVudCApIHsKCgkJCS8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1v cnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgKCQkJLy8gZGV0YWNo RXZlbnQgbmVlZGVkIHByb3BlcnR5IG9uIGVsZW1lbnQsIGJ5IG5hbWUgb2YgdGhh dCBldmVudCwgdG8gcHJvcGVybHkgZXhwb3NlIGl0IHRvIEdDCgkJCWlmICggdHlw ZW9mIGVsZW1bIG5hbWUgXSA9PT0gc3RydW5kZWZpbmVkICkgewoJCQkJZWxlbVsg bmFtZSBdID0gbnVsbDsKCQkJfQoKCQkJZWxlbS5kZXRhY2hFdmVudCggbmFtZSwg aGFuZGxlICk7CgkJfQoJfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMs IHByb3BzICkgewoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAn bmV3JyBrZXl3b3JkCglpZiAoICEodGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVu dCkgKSB7CgkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsK CX0KCgkvLyBFdmVudCBvYmplY3QKCWlmICggc3JjICYmIHNyYy50eXBlICkgewoJ CXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKCQl0aGlzLnR5cGUgPSBzcmMudHlw ZTsKCgkJLy8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2 ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWQKCQkvLyBieSBhIGhhbmRsZXIgbG93 ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KCQl0 aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8 CgkJCQlzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmCgkJCQkv LyBTdXBwb3J0OiBJRSA8IDksIEFuZHJvaWQgPCA0LjAKCQkJCXNyYy5yZXR1cm5W YWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7 CgoJLy8gRXZlbnQgdHlwZQoJfSBlbHNlIHsKCQl0aGlzLnR5cGUgPSBzcmM7Cgl9 CgoJLy8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRo ZSBldmVudCBvYmplY3QKCWlmICggcHJvcHMgKSB7CgkJalF1ZXJ5LmV4dGVuZCgg dGhpcywgcHJvcHMgKTsKCX0KCgkvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5j b21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZQoJdGhpcy50aW1lU3RhbXAgPSBz cmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7CgoJLy8gTWFyayBp dCBhcyBmaXhlZAoJdGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7Cn07Cgov LyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lm aWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKLy8gaHR0cDov L3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAz MzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5 cGUgPSB7Cglpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLAoJaXNQcm9w YWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAoJaXNJbW1lZGlhdGVQcm9wYWdh dGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLAoKCXByZXZlbnREZWZhdWx0OiBmdW5j dGlvbigpIHsKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCgkJdGhpcy5p c0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlOwoJCWlmICggIWUgKSB7CgkJ CXJldHVybjsKCQl9CgoJCS8vIElmIHByZXZlbnREZWZhdWx0IGV4aXN0cywgcnVu IGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5wcmV2ZW50RGVmYXVs dCApIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCQkvLyBTdXBwb3J0OiBJRQoJ CS8vIE90aGVyd2lzZSBzZXQgdGhlIHJldHVyblZhbHVlIHByb3BlcnR5IG9mIHRo ZSBvcmlnaW5hbCBldmVudCB0byBmYWxzZQoJCX0gZWxzZSB7CgkJCWUucmV0dXJu VmFsdWUgPSBmYWxzZTsKCQl9Cgl9LAoJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlv bigpIHsKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCgkJdGhpcy5pc1By b3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgkJaWYgKCAhZSApIHsKCQkJ cmV0dXJuOwoJCX0KCQkvLyBJZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzLCBydW4g aXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKCBlLnN0b3BQcm9wYWdhdGlv biApIHsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgoJCS8vIFN1cHBvcnQ6 IElFCgkJLy8gU2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9y aWdpbmFsIGV2ZW50IHRvIHRydWUKCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cgl9 LAoJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl2YXIg ZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCgkJdGhpcy5pc0ltbWVkaWF0ZVByb3Bh Z2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgoJCWlmICggZSAmJiBlLnN0b3BJ bW1lZGlhdGVQcm9wYWdhdGlvbiApIHsKCQkJZS5zdG9wSW1tZWRpYXRlUHJvcGFn YXRpb24oKTsKCQl9CgoJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9Cn07Cgov LyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVy L291dCBhbmQgZXZlbnQtdGltZSBjaGVja3MKalF1ZXJ5LmVhY2goewoJbW91c2Vl bnRlcjogIm1vdXNlb3ZlciIsCgltb3VzZWxlYXZlOiAibW91c2VvdXQiLAoJcG9p bnRlcmVudGVyOiAicG9pbnRlcm92ZXIiLAoJcG9pbnRlcmxlYXZlOiAicG9pbnRl cm91dCIKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKCWpRdWVyeS5ldmVudC5z cGVjaWFsWyBvcmlnIF0gPSB7CgkJZGVsZWdhdGVUeXBlOiBmaXgsCgkJYmluZFR5 cGU6IGZpeCwKCgkJaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciBy ZXQsCgkJCQl0YXJnZXQgPSB0aGlzLAoJCQkJcmVsYXRlZCA9IGV2ZW50LnJlbGF0 ZWRUYXJnZXQsCgkJCQloYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7CgoJCQkv LyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRl ZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuCgkJCS8vIE5COiBObyByZWxhdGVkVGFy Z2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93 CgkJCWlmICggIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1 ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSkgKSB7CgkJCQlldmVudC50 eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlOwoJCQkJcmV0ID0gaGFuZGxlT2JqLmhh bmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJZXZlbnQudHlwZSA9 IGZpeDsKCQkJfQoJCQlyZXR1cm4gcmV0OwoJCX0KCX07Cn0pOwoKLy8gSUUgc3Vi bWl0IGRlbGVnYXRpb24KaWYgKCAhc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgewoK CWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKCQlzZXR1cDogZnVuY3Rp b24oKSB7CgkJCS8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBz dWJtaXQgZXZlbnRzCgkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9y bSIgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8gTGF6eS1hZGQg YSBzdWJtaXQgaGFuZGxlciB3aGVuIGEgZGVzY2VuZGFudCBmb3JtIG1heSBwb3Rl bnRpYWxseSBiZSBzdWJtaXR0ZWQKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywg ImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBlICkg ewoJCQkJLy8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNy YXNoIGluIElFICgjOTgwNykKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsCgkJCQkJ Zm9ybSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApIHx8IGpRdWVy eS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSA/IGVsZW0uZm9ybSA6IHVuZGVm aW5lZDsKCQkJCWlmICggZm9ybSAmJiAhalF1ZXJ5Ll9kYXRhKCBmb3JtLCAic3Vi bWl0QnViYmxlcyIgKSApIHsKCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCAi c3VibWl0Ll9zdWJtaXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCWV2ZW50 Ll9zdWJtaXRfYnViYmxlID0gdHJ1ZTsKCQkJCQl9KTsKCQkJCQlqUXVlcnkuX2Rh dGEoIGZvcm0sICJzdWJtaXRCdWJibGVzIiwgdHJ1ZSApOwoJCQkJfQoJCQl9KTsK CQkJLy8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2 ZW50IGxpc3RlbmVyCgkJfSwKCgkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZl bnQgKSB7CgkJCS8vIElmIGZvcm0gd2FzIHN1Ym1pdHRlZCBieSB0aGUgdXNlciwg YnViYmxlIHRoZSBldmVudCB1cCB0aGUgdHJlZQoJCQlpZiAoIGV2ZW50Ll9zdWJt aXRfYnViYmxlICkgewoJCQkJZGVsZXRlIGV2ZW50Ll9zdWJtaXRfYnViYmxlOwoJ CQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsK CQkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoICJzdWJtaXQiLCB0aGlzLnBhcmVu dE5vZGUsIGV2ZW50LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQl0ZWFyZG93 bjogZnVuY3Rpb24oKSB7CgkJCS8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0 ZWQgZm9ybSBzdWJtaXQgZXZlbnRzCgkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0 aGlzLCAiZm9ybSIgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8g UmVtb3ZlIGRlbGVnYXRlZCBoYW5kbGVyczsgY2xlYW5EYXRhIGV2ZW50dWFsbHkg cmVhcHMgc3VibWl0IGhhbmRsZXJzIGF0dGFjaGVkIGFib3ZlCgkJCWpRdWVyeS5l dmVudC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKCQl9Cgl9Owp9CgovLyBJ RSBjaGFuZ2UgZGVsZWdhdGlvbiBhbmQgY2hlY2tib3gvcmFkaW8gZml4CmlmICgg IXN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHsKCglqUXVlcnkuZXZlbnQuc3BlY2lh bC5jaGFuZ2UgPSB7CgoJCXNldHVwOiBmdW5jdGlvbigpIHsKCgkJCWlmICggcmZv cm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7CgkJCQkvLyBJRSBkb2Vz bid0IGZpcmUgY2hhbmdlIG9uIGEgY2hlY2svcmFkaW8gdW50aWwgYmx1cjsgdHJp Z2dlciBpdCBvbiBjbGljawoJCQkJLy8gYWZ0ZXIgYSBwcm9wZXJ0eWNoYW5nZS4g RWF0IHRoZSBibHVyLWNoYW5nZSBpbiBzcGVjaWFsLmNoYW5nZS5oYW5kbGUuCgkJ CQkvLyBUaGlzIHN0aWxsIGZpcmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9y IGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuCgkJCQlpZiAoIHRoaXMudHlwZSA9PT0g ImNoZWNrYm94IiB8fCB0aGlzLnR5cGUgPT09ICJyYWRpbyIgKSB7CgkJCQkJalF1 ZXJ5LmV2ZW50LmFkZCggdGhpcywgInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLCBm dW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCWlmICggZXZlbnQub3JpZ2luYWxFdmVu dC5wcm9wZXJ0eU5hbWUgPT09ICJjaGVja2VkIiApIHsKCQkJCQkJCXRoaXMuX2p1 c3RfY2hhbmdlZCA9IHRydWU7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCQlqUXVlcnku ZXZlbnQuYWRkKCB0aGlzLCAiY2xpY2suX2NoYW5nZSIsIGZ1bmN0aW9uKCBldmVu dCApIHsKCQkJCQkJaWYgKCB0aGlzLl9qdXN0X2NoYW5nZWQgJiYgIWV2ZW50Lmlz VHJpZ2dlciApIHsKCQkJCQkJCXRoaXMuX2p1c3RfY2hhbmdlZCA9IGZhbHNlOwoJ CQkJCQl9CgkJCQkJCS8vIEFsbG93IHRyaWdnZXJlZCwgc2ltdWxhdGVkIGNoYW5n ZSBldmVudHMgKCMxMTUwMCkKCQkJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCAi Y2hhbmdlIiwgdGhpcywgZXZlbnQsIHRydWUgKTsKCQkJCQl9KTsKCQkJCX0KCQkJ CXJldHVybiBmYWxzZTsKCQkJfQoJCQkvLyBEZWxlZ2F0ZWQgZXZlbnQ7IGxhenkt YWRkIGEgY2hhbmdlIGhhbmRsZXIgb24gZGVzY2VuZGFudCBpbnB1dHMKCQkJalF1 ZXJ5LmV2ZW50LmFkZCggdGhpcywgImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLCBm dW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgoJCQkJaWYg KCByZm9ybUVsZW1zLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiAhalF1ZXJ5Ll9k YXRhKCBlbGVtLCAiY2hhbmdlQnViYmxlcyIgKSApIHsKCQkJCQlqUXVlcnkuZXZl bnQuYWRkKCBlbGVtLCAiY2hhbmdlLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQg KSB7CgkJCQkJCWlmICggdGhpcy5wYXJlbnROb2RlICYmICFldmVudC5pc1NpbXVs YXRlZCAmJiAhZXZlbnQuaXNUcmlnZ2VyICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50 LnNpbXVsYXRlKCAiY2hhbmdlIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1 ZSApOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQkJalF1ZXJ5Ll9kYXRhKCBlbGVtLCAi Y2hhbmdlQnViYmxlcyIsIHRydWUgKTsKCQkJCX0KCQkJfSk7CgkJfSwKCgkJaGFu ZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciBlbGVtID0gZXZlbnQudGFy Z2V0OwoKCQkJLy8gU3dhbGxvdyBuYXRpdmUgY2hhbmdlIGV2ZW50cyBmcm9tIGNo ZWNrYm94L3JhZGlvLCB3ZSBhbHJlYWR5IHRyaWdnZXJlZCB0aGVtIGFib3ZlCgkJ CWlmICggdGhpcyAhPT0gZWxlbSB8fCBldmVudC5pc1NpbXVsYXRlZCB8fCBldmVu dC5pc1RyaWdnZXIgfHwgKGVsZW0udHlwZSAhPT0gInJhZGlvIiAmJiBlbGVtLnR5 cGUgIT09ICJjaGVja2JveCIpICkgewoJCQkJcmV0dXJuIGV2ZW50LmhhbmRsZU9i ai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfQoJCX0sCgoJ CXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSgg dGhpcywgIi5fY2hhbmdlIiApOwoKCQkJcmV0dXJuICFyZm9ybUVsZW1zLnRlc3Qo IHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9Owp9CgovLyBDcmVhdGUgImJ1YmJsaW5n IiBmb2N1cyBhbmQgYmx1ciBldmVudHMKaWYgKCAhc3VwcG9ydC5mb2N1c2luQnVi YmxlcyApIHsKCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjog ImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoKCQkvLyBBdHRh Y2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdo aWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dAoJCXZhciBoYW5kbGVy ID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRl KCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwg dHJ1ZSApOwoJCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7 CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVy RG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGpRdWVyeS5fZGF0YSgg ZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRk RXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJ alF1ZXJ5Ll9kYXRhKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7 CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0 aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGpRdWVy eS5fZGF0YSggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7 CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRy dWUgKTsKCQkJCQlqUXVlcnkuX3JlbW92ZURhdGEoIGRvYywgZml4ICk7CgkJCQl9 IGVsc2UgewoJCQkJCWpRdWVyeS5fZGF0YSggZG9jLCBmaXgsIGF0dGFjaGVzICk7 CgkJCQl9CgkJCX0KCQl9OwoJfSk7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoKCW9u OiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5B TCovIG9uZSApIHsKCQl2YXIgdHlwZSwgb3JpZ0ZuOwoKCQkvLyBUeXBlcyBjYW4g YmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMKCQlpZiAoIHR5cGVvZiB0eXBlcyA9 PT0gIm9iamVjdCIgKSB7CgkJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3Rvciwg ZGF0YSApCgkJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsK CQkJCS8vICggdHlwZXMtT2JqZWN0LCBkYXRhICkKCQkJCWRhdGEgPSBkYXRhIHx8 IHNlbGVjdG9yOwoJCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJCX0KCQkJZm9y ICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub24oIHR5cGUsIHNlbGVjdG9y LCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTsKCQkJfQoJCQlyZXR1cm4gdGhp czsKCQl9CgoJCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgkJ CS8vICggdHlwZXMsIGZuICkKCQkJZm4gPSBzZWxlY3RvcjsKCQkJZGF0YSA9IHNl bGVjdG9yID0gdW5kZWZpbmVkOwoJCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7 CgkJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKCQkJCS8v ICggdHlwZXMsIHNlbGVjdG9yLCBmbiApCgkJCQlmbiA9IGRhdGE7CgkJCQlkYXRh ID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJLy8gKCB0eXBlcywgZGF0YSwg Zm4gKQoJCQkJZm4gPSBkYXRhOwoJCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQkJc2Vs ZWN0b3IgPSB1bmRlZmluZWQ7CgkJCX0KCQl9CgkJaWYgKCBmbiA9PT0gZmFsc2Ug KSB7CgkJCWZuID0gcmV0dXJuRmFsc2U7CgkJfSBlbHNlIGlmICggIWZuICkgewoJ CQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggb25lID09PSAxICkgewoJCQlvcmln Rm4gPSBmbjsKCQkJZm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkvLyBDYW4g dXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm8K CQkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJCXJldHVybiBvcmlnRm4uYXBw bHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9OwoJCQkvLyBVc2Ugc2FtZSBndWlk IHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGbgoJCQlmbi5ndWlkID0g b3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsK CQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5l dmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCQl9 KTsKCX0sCglvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZu ICkgewoJCXJldHVybiB0aGlzLm9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZu LCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiAp IHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMu cHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoJCQkvLyAoIGV2 ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50CgkJCWhhbmRsZU9iaiA9IHR5 cGVzLmhhbmRsZU9iajsKCQkJalF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCAp Lm9mZigKCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPyBoYW5kbGVPYmoub3JpZ1R5 cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDogaGFuZGxlT2JqLm9yaWdU eXBlLAoJCQkJaGFuZGxlT2JqLnNlbGVjdG9yLAoJCQkJaGFuZGxlT2JqLmhhbmRs ZXIKCQkJKTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoJCWlmICggdHlwZW9mIHR5cGVz ID09PSAib2JqZWN0IiApIHsKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0 b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0 eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0 aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2Vs ZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgkJCS8vICggdHlwZXMgWywgZm5dICkK CQkJZm4gPSBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJ CWlmICggZm4gPT09IGZhbHNlICkgewoJCQlmbiA9IHJldHVybkZhbHNlOwoJCX0K CQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQu cmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7CgkJfSk7Cgl9LAoK CXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlz LmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBl LCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoJdHJpZ2dlckhhbmRsZXI6IGZ1bmN0 aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAo IGVsZW0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwg ZGF0YSwgZWxlbSwgdHJ1ZSApOwoJCX0KCX0KfSk7CgoKZnVuY3Rpb24gY3JlYXRl U2FmZUZyYWdtZW50KCBkb2N1bWVudCApIHsKCXZhciBsaXN0ID0gbm9kZU5hbWVz LnNwbGl0KCAifCIgKSwKCQlzYWZlRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3Vt ZW50RnJhZ21lbnQoKTsKCglpZiAoIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQgKSB7 CgkJd2hpbGUgKCBsaXN0Lmxlbmd0aCApIHsKCQkJc2FmZUZyYWcuY3JlYXRlRWxl bWVudCgKCQkJCWxpc3QucG9wKCkKCQkJKTsKCQl9Cgl9CglyZXR1cm4gc2FmZUZy YWc7Cn0KCnZhciBub2RlTmFtZXMgPSAiYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlv fGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258Zmln dXJlfGZvb3RlcnwiICsKCQkiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxv dXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLAoJcmlu bGluZWpRdWVyeSA9IC8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csCglybm9z aGltY2FjaGUgPSBuZXcgUmVnRXhwKCI8KD86IiArIG5vZGVOYW1lcyArICIpW1xc cy8+XSIsICJpIiksCglybGVhZGluZ1doaXRlc3BhY2UgPSAvXlxzKy8sCglyeGh0 bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5r fG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLAoJcnRhZ05hbWUgPSAv PChbXHc6XSspLywKCXJ0Ym9keSA9IC88dGJvZHkvaSwKCXJodG1sID0gLzx8JiM/ XHcrOy8sCglybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9p LAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAv Y2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBl ID0gL14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLAoJcnNjcmlwdFR5cGVNYXNr ZWQgPSAvXnRydWVcLyguKikvLAoJcmNsZWFuU2NyaXB0ID0gL15ccyo8ISg/Olxb Q0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLAoKCS8vIFdlIGhhdmUgdG8g Y2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICgjMTMyMDApCgl3cmFw TWFwID0gewoJCW9wdGlvbjogWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlw bGUnPiIsICI8L3NlbGVjdD4iIF0sCgkJbGVnZW5kOiBbIDEsICI8ZmllbGRzZXQ+ IiwgIjwvZmllbGRzZXQ+IiBdLAoJCWFyZWE6IFsgMSwgIjxtYXA+IiwgIjwvbWFw PiIgXSwKCQlwYXJhbTogWyAxLCAiPG9iamVjdD4iLCAiPC9vYmplY3Q+IiBdLAoJ CXRoZWFkOiBbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdLAoJCXRyOiBbIDIs ICI8dGFibGU+PHRib2R5PiIsICI8L3Rib2R5PjwvdGFibGU+IiBdLAoJCWNvbDog WyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xn cm91cD48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+ IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCgkJLy8gSUU2LTggY2FuJ3Qg c2VyaWFsaXplIGxpbmssIHNjcmlwdCwgc3R5bGUsIG9yIGFueSBodG1sNSAoTm9T Y29wZSkgdGFncywKCQkvLyB1bmxlc3Mgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIG5v bi1icmVha2luZyBjaGFyYWN0ZXJzIGluIGZyb250IG9mIGl0LgoJCV9kZWZhdWx0 OiBzdXBwb3J0Lmh0bWxTZXJpYWxpemUgPyBbIDAsICIiLCAiIiBdIDogWyAxLCAi WDxkaXY+IiwgIjwvZGl2PiIgIF0KCX0sCglzYWZlRnJhZ21lbnQgPSBjcmVhdGVT YWZlRnJhZ21lbnQoIGRvY3VtZW50ICksCglmcmFnbWVudERpdiA9IHNhZmVGcmFn bWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikg KTsKCndyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjsKd3JhcE1hcC50 Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1h cC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDsKd3JhcE1hcC50aCA9IHdyYXBNYXAu dGQ7CgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCXZhciBlbGVt cywgZWxlbSwKCQlpID0gMCwKCQlmb3VuZCA9IHR5cGVvZiBjb250ZXh0LmdldEVs ZW1lbnRzQnlUYWdOYW1lICE9PSBzdHJ1bmRlZmluZWQgPyBjb250ZXh0LmdldEVs ZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgIioiICkgOgoJCQl0eXBlb2YgY29udGV4 dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBzdHJ1bmRlZmluZWQgPyBjb250ZXh0LnF1 ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKSA6CgkJCXVuZGVmaW5lZDsKCglp ZiAoICFmb3VuZCApIHsKCQlmb3IgKCBmb3VuZCA9IFtdLCBlbGVtcyA9IGNvbnRl eHQuY2hpbGROb2RlcyB8fCBjb250ZXh0OyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBu dWxsOyBpKysgKSB7CgkJCWlmICggIXRhZyB8fCBqUXVlcnkubm9kZU5hbWUoIGVs ZW0sIHRhZyApICkgewoJCQkJZm91bmQucHVzaCggZWxlbSApOwoJCQl9IGVsc2Ug ewoJCQkJalF1ZXJ5Lm1lcmdlKCBmb3VuZCwgZ2V0QWxsKCBlbGVtLCB0YWcgKSAp OwoJCQl9CgkJfQoJfQoKCXJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcg JiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/CgkJalF1ZXJ5Lm1l cmdlKCBbIGNvbnRleHQgXSwgZm91bmQgKSA6CgkJZm91bmQ7Cn0KCi8vIFVzZWQg aW4gYnVpbGRGcmFnbWVudCwgZml4ZXMgdGhlIGRlZmF1bHRDaGVja2VkIHByb3Bl cnR5CmZ1bmN0aW9uIGZpeERlZmF1bHRDaGVja2VkKCBlbGVtICkgewoJaWYgKCBy Y2hlY2thYmxlVHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHsKCQllbGVtLmRlZmF1 bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwoJfQp9CgovLyBTdXBwb3J0OiBJRTw4 Ci8vIE1hbmlwdWxhdGluZyB0YWJsZXMgcmVxdWlyZXMgYSB0Ym9keQpmdW5jdGlv biBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglyZXR1cm4g alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlqUXVlcnkubm9k ZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRl bnQuZmlyc3RDaGlsZCwgInRyIiApID8KCgkJZWxlbS5nZXRFbGVtZW50c0J5VGFn TmFtZSgidGJvZHkiKVswXSB8fAoJCQllbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93 bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSApIDoKCQllbGVtOwp9 CgovLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlw dCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uCmZ1bmN0aW9uIGRp c2FibGVTY3JpcHQoIGVsZW0gKSB7CgllbGVtLnR5cGUgPSAoalF1ZXJ5LmZpbmQu YXR0ciggZWxlbSwgInR5cGUiICkgIT09IG51bGwpICsgIi8iICsgZWxlbS50eXBl OwoJcmV0dXJuIGVsZW07Cn0KZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSAp IHsKCXZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlw ZSApOwoJaWYgKCBtYXRjaCApIHsKCQllbGVtLnR5cGUgPSBtYXRjaFsxXTsKCX0g ZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKTsKCX0KCXJldHVy biBlbGVtOwp9CgovLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVl biBldmFsdWF0ZWQKZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVs ZW1lbnRzICkgewoJdmFyIGVsZW0sCgkJaSA9IDA7Cglmb3IgKCA7IChlbGVtID0g ZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQlqUXVlcnkuX2RhdGEoIGVsZW0s ICJnbG9iYWxFdmFsIiwgIXJlZkVsZW1lbnRzIHx8IGpRdWVyeS5fZGF0YSggcmVm RWxlbWVudHNbaV0sICJnbG9iYWxFdmFsIiApICk7Cgl9Cn0KCmZ1bmN0aW9uIGNs b25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CgoJaWYgKCBkZXN0Lm5vZGVUeXBl ICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CgkJcmV0dXJuOwoJ fQoKCXZhciB0eXBlLCBpLCBsLAoJCW9sZERhdGEgPSBqUXVlcnkuX2RhdGEoIHNy YyApLAoJCWN1ckRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QsIG9sZERhdGEgKSwK CQlldmVudHMgPSBvbGREYXRhLmV2ZW50czsKCglpZiAoIGV2ZW50cyApIHsKCQlk ZWxldGUgY3VyRGF0YS5oYW5kbGU7CgkJY3VyRGF0YS5ldmVudHMgPSB7fTsKCgkJ Zm9yICggdHlwZSBpbiBldmVudHMgKSB7CgkJCWZvciAoIGkgPSAwLCBsID0gZXZl bnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJalF1ZXJ5LmV2 ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApOwoJCQl9 CgkJfQoJfQoKCS8vIG1ha2UgdGhlIGNsb25lZCBwdWJsaWMgZGF0YSBvYmplY3Qg YSBjb3B5IGZyb20gdGhlIG9yaWdpbmFsCglpZiAoIGN1ckRhdGEuZGF0YSApIHsK CQljdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyRGF0YS5kYXRh ICk7Cgl9Cn0KCmZ1bmN0aW9uIGZpeENsb25lTm9kZUlzc3Vlcyggc3JjLCBkZXN0 ICkgewoJdmFyIG5vZGVOYW1lLCBlLCBkYXRhOwoKCS8vIFdlIGRvIG5vdCBuZWVk IHRvIGRvIGFueXRoaW5nIGZvciBub24tRWxlbWVudHMKCWlmICggZGVzdC5ub2Rl VHlwZSAhPT0gMSApIHsKCQlyZXR1cm47Cgl9CgoJbm9kZU5hbWUgPSBkZXN0Lm5v ZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgoJLy8gSUU2LTggY29waWVzIGV2ZW50cyBi b3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCglpZiAo ICFzdXBwb3J0Lm5vQ2xvbmVFdmVudCAmJiBkZXN0WyBqUXVlcnkuZXhwYW5kbyBd ICkgewoJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGRlc3QgKTsKCgkJZm9yICggZSBp biBkYXRhLmV2ZW50cyApIHsKCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBkZXN0LCBl LCBkYXRhLmhhbmRsZSApOwoJCX0KCgkJLy8gRXZlbnQgZGF0YSBnZXRzIHJlZmVy ZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8gZ2V0cyBjb3Bp ZWQgdG9vCgkJZGVzdC5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7 Cgl9CgoJLy8gSUUgYmxhbmtzIGNvbnRlbnRzIHdoZW4gY2xvbmluZyBzY3JpcHRz LCBhbmQgdHJpZXMgdG8gZXZhbHVhdGUgbmV3bHktc2V0IHRleHQKCWlmICggbm9k ZU5hbWUgPT09ICJzY3JpcHQiICYmIGRlc3QudGV4dCAhPT0gc3JjLnRleHQgKSB7 CgkJZGlzYWJsZVNjcmlwdCggZGVzdCApLnRleHQgPSBzcmMudGV4dDsKCQlyZXN0 b3JlU2NyaXB0KCBkZXN0ICk7CgoJLy8gSUU2LTEwIGltcHJvcGVybHkgY2xvbmVz IGNoaWxkcmVuIG9mIG9iamVjdCBlbGVtZW50cyB1c2luZyBjbGFzc2lkLgoJLy8g SUUxMCB0aHJvd3MgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3IgaWYgcGFyZW50 IGlzIG51bGwsICMxMjEzMi4KCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib2Jq ZWN0IiApIHsKCQlpZiAoIGRlc3QucGFyZW50Tm9kZSApIHsKCQkJZGVzdC5vdXRl ckhUTUwgPSBzcmMub3V0ZXJIVE1MOwoJCX0KCgkJLy8gVGhpcyBwYXRoIGFwcGVh cnMgdW5hdm9pZGFibGUgZm9yIElFOS4gV2hlbiBjbG9uaW5nIGFuIG9iamVjdAoJ CS8vIGVsZW1lbnQgaW4gSUU5LCB0aGUgb3V0ZXJIVE1MIHN0cmF0ZWd5IGFib3Zl IGlzIG5vdCBzdWZmaWNpZW50LgoJCS8vIElmIHRoZSBzcmMgaGFzIGlubmVySFRN TCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAoJCS8vIGNvcHkgdGhlIHNy Yy5pbm5lckhUTUwgaW50byB0aGUgZGVzdC5pbm5lckhUTUwuICMxMDMyNAoJCWlm ICggc3VwcG9ydC5odG1sNUNsb25lICYmICggc3JjLmlubmVySFRNTCAmJiAhalF1 ZXJ5LnRyaW0oZGVzdC5pbm5lckhUTUwpICkgKSB7CgkJCWRlc3QuaW5uZXJIVE1M ID0gc3JjLmlubmVySFRNTDsKCQl9CgoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09 ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsK CQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9m IGEgY2xvbmVkIGNoZWNrYm94CgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwg SUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAoJCS8vIGEgY2hl Y2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24n dCBhbHNvIHNldAoKCQlkZXN0LmRlZmF1bHRDaGVja2VkID0gZGVzdC5jaGVja2Vk ID0gc3JjLmNoZWNrZWQ7CgoJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5k IHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCgkJLy8gY2hlY2tib3gv cmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIK CQlpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHsKCQkJZGVzdC52YWx1 ZSA9IHNyYy52YWx1ZTsKCQl9CgoJLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRo ZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKCS8vIHN0 YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9 PT0gIm9wdGlvbiIgKSB7CgkJZGVzdC5kZWZhdWx0U2VsZWN0ZWQgPSBkZXN0LnNl bGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDsKCgkvLyBJRTYtOCBmYWlscyB0 byBzZXQgdGhlIGRlZmF1bHRWYWx1ZSB0byB0aGUgY29ycmVjdCB2YWx1ZSB3aGVu CgkvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9mIGlucHV0IGZpZWxkcwoJfSBlbHNl IGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0 YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVl OwoJfQp9CgpqUXVlcnkuZXh0ZW5kKHsKCWNsb25lOiBmdW5jdGlvbiggZWxlbSwg ZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJdmFyIGRlc3RF bGVtZW50cywgbm9kZSwgY2xvbmUsIGksIHNyY0VsZW1lbnRzLAoJCQlpblBhZ2Ug PSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoK CQlpZiAoIHN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxl bSkgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsg Ij4iICkgKSB7CgkJCWNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKTsKCgkJ Ly8gSUU8PTggZG9lcyBub3QgcHJvcGVybHkgY2xvbmUgZGV0YWNoZWQsIHVua25v d24gZWxlbWVudCBub2RlcwoJCX0gZWxzZSB7CgkJCWZyYWdtZW50RGl2LmlubmVy SFRNTCA9IGVsZW0ub3V0ZXJIVE1MOwoJCQlmcmFnbWVudERpdi5yZW1vdmVDaGls ZCggY2xvbmUgPSBmcmFnbWVudERpdi5maXJzdENoaWxkICk7CgkJfQoKCQlpZiAo ICghc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIXN1cHBvcnQubm9DbG9uZUNoZWNr ZWQpICYmCgkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBl ID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCgkJCS8vIFdl IGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0 cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yCgkJCWRlc3RFbGVtZW50 cyA9IGdldEFsbCggY2xvbmUgKTsKCQkJc3JjRWxlbWVudHMgPSBnZXRBbGwoIGVs ZW0gKTsKCgkJCS8vIEZpeCBhbGwgSUUgY2xvbmluZyBpc3N1ZXMKCQkJZm9yICgg aSA9IDA7IChub2RlID0gc3JjRWxlbWVudHNbaV0pICE9IG51bGw7ICsraSApIHsK CQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBu dWxsOyBGaXhlcyAjOTU4NwoJCQkJaWYgKCBkZXN0RWxlbWVudHNbaV0gKSB7CgkJ CQkJZml4Q2xvbmVOb2RlSXNzdWVzKCBub2RlLCBkZXN0RWxlbWVudHNbaV0gKTsK CQkJCX0KCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9y aWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJ aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3Jj RWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBk ZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAw OyAobm9kZSA9IHNyY0VsZW1lbnRzW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQkJ Y2xvbmVDb3B5RXZlbnQoIG5vZGUsIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJ CQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJ CX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkK CQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlm ICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwo IGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQi ICkgKTsKCQl9CgoJCWRlc3RFbGVtZW50cyA9IHNyY0VsZW1lbnRzID0gbm9kZSA9 IG51bGw7CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9u ZTsKCX0sCgoJYnVpbGRGcmFnbWVudDogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0 LCBzY3JpcHRzLCBzZWxlY3Rpb24gKSB7CgkJdmFyIGosIGVsZW0sIGNvbnRhaW5z LAoJCQl0bXAsIHRhZywgdGJvZHksIHdyYXAsCgkJCWwgPSBlbGVtcy5sZW5ndGgs CgoJCQkvLyBFbnN1cmUgYSBzYWZlIGZyYWdtZW50CgkJCXNhZmUgPSBjcmVhdGVT YWZlRnJhZ21lbnQoIGNvbnRleHQgKSwKCgkJCW5vZGVzID0gW10sCgkJCWkgPSAw OwoKCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCWVsZW0gPSBlbGVtc1sgaSBd OwoKCQkJaWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7CgoJCQkJLy8gQWRkIG5v ZGVzIGRpcmVjdGx5CgkJCQlpZiAoIGpRdWVyeS50eXBlKCBlbGVtICkgPT09ICJv YmplY3QiICkgewoJCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5 cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCQkvLyBDb252ZXJ0IG5vbi1odG1s IGludG8gYSB0ZXh0IG5vZGUKCQkJCX0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBl bGVtICkgKSB7CgkJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9k ZSggZWxlbSApICk7CgoJCQkJLy8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVz CgkJCQl9IGVsc2UgewoJCQkJCXRtcCA9IHRtcCB8fCBzYWZlLmFwcGVuZENoaWxk KCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpICk7CgoJCQkJCS8vIERlc2Vy aWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24KCQkJCQl0YWcgPSAocnRh Z05hbWUuZXhlYyggZWxlbSApIHx8IFsgIiIsICIiIF0pWyAxIF0udG9Mb3dlckNh c2UoKTsKCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVm YXVsdDsKCgkJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtLnJlcGxh Y2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKSArIHdyYXBbMl07CgoJCQkJCS8v IERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudAoJ CQkJCWogPSB3cmFwWzBdOwoJCQkJCXdoaWxlICggai0tICkgewoJCQkJCQl0bXAg PSB0bXAubGFzdENoaWxkOwoJCQkJCX0KCgkJCQkJLy8gTWFudWFsbHkgYWRkIGxl YWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkIGJ5IElFCgkJCQkJaWYgKCAhc3VwcG9y dC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCgg ZWxlbSApICkgewoJCQkJCQlub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHRO b2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyggZWxlbSApWzBdICkgKTsKCQkJ CQl9CgoJCQkJCS8vIFJlbW92ZSBJRSdzIGF1dG9pbnNlcnRlZCA8dGJvZHk+IGZy b20gdGFibGUgZnJhZ21lbnRzCgkJCQkJaWYgKCAhc3VwcG9ydC50Ym9keSApIHsK CgkJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJp b3VzIDx0Ym9keT4KCQkJCQkJZWxlbSA9IHRhZyA9PT0gInRhYmxlIiAmJiAhcnRi b2R5LnRlc3QoIGVsZW0gKSA/CgkJCQkJCQl0bXAuZmlyc3RDaGlsZCA6CgoJCQkJ CQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJ CQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIXJ0Ym9keS50ZXN0KCBlbGVtICkg PwoJCQkJCQkJCXRtcCA6CgkJCQkJCQkJMDsKCgkJCQkJCWogPSBlbGVtICYmIGVs ZW0uY2hpbGROb2Rlcy5sZW5ndGg7CgkJCQkJCXdoaWxlICggai0tICkgewoJCQkJ CQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoICh0Ym9keSA9IGVsZW0uY2hpbGROb2Rl c1tqXSksICJ0Ym9keSIgKSAmJiAhdGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggKSB7 CgkJCQkJCQkJZWxlbS5yZW1vdmVDaGlsZCggdGJvZHkgKTsKCQkJCQkJCX0KCQkJ CQkJfQoJCQkJCX0KCgkJCQkJalF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxk Tm9kZXMgKTsKCgkJCQkJLy8gRml4ICMxMjM5MiBmb3IgV2ViS2l0IGFuZCBJRSA+ IDkKCQkJCQl0bXAudGV4dENvbnRlbnQgPSAiIjsKCgkJCQkJLy8gRml4ICMxMjM5 MiBmb3Igb2xkSUUKCQkJCQl3aGlsZSAoIHRtcC5maXJzdENoaWxkICkgewoJCQkJ CQl0bXAucmVtb3ZlQ2hpbGQoIHRtcC5maXJzdENoaWxkICk7CgkJCQkJfQoKCQkJ CQkvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgcHJvcGVy IGNsZWFudXAKCQkJCQl0bXAgPSBzYWZlLmxhc3RDaGlsZDsKCQkJCX0KCQkJfQoJ CX0KCgkJLy8gRml4ICMxMTM1NjogQ2xlYXIgZWxlbWVudHMgZnJvbSBmcmFnbWVu dAoJCWlmICggdG1wICkgewoJCQlzYWZlLnJlbW92ZUNoaWxkKCB0bXAgKTsKCQl9 CgoJCS8vIFJlc2V0IGRlZmF1bHRDaGVja2VkIGZvciBhbnkgcmFkaW9zIGFuZCBj aGVja2JveGVzCgkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBp biBJRSA2LzcgKCM4MDYwKQoJCWlmICggIXN1cHBvcnQuYXBwZW5kQ2hlY2tlZCAp IHsKCQkJalF1ZXJ5LmdyZXAoIGdldEFsbCggbm9kZXMsICJpbnB1dCIgKSwgZml4 RGVmYXVsdENoZWNrZWQgKTsKCQl9CgoJCWkgPSAwOwoJCXdoaWxlICggKGVsZW0g PSBub2Rlc1sgaSsrIF0pICkgewoKCQkJLy8gIzQwODcgLSBJZiBvcmlnaW4gYW5k IGRlc3RpbmF0aW9uIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSwgYW5kIHRoaXMgaXMK CQkJLy8gdGhhdCBlbGVtZW50LCBkbyBub3QgZG8gYW55dGhpbmcKCQkJaWYgKCBz ZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApICE9 PSAtMSApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQljb250YWlucyA9IGpRdWVy eS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7CgoJCQkvLyBB cHBlbmQgdG8gZnJhZ21lbnQKCQkJdG1wID0gZ2V0QWxsKCBzYWZlLmFwcGVuZENo aWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCQkvLyBQcmVzZXJ2ZSBzY3JpcHQg ZXZhbHVhdGlvbiBoaXN0b3J5CgkJCWlmICggY29udGFpbnMgKSB7CgkJCQlzZXRH bG9iYWxFdmFsKCB0bXAgKTsKCQkJfQoKCQkJLy8gQ2FwdHVyZSBleGVjdXRhYmxl cwoJCQlpZiAoIHNjcmlwdHMgKSB7CgkJCQlqID0gMDsKCQkJCXdoaWxlICggKGVs ZW0gPSB0bXBbIGorKyBdKSApIHsKCQkJCQlpZiAoIHJzY3JpcHRUeXBlLnRlc3Qo IGVsZW0udHlwZSB8fCAiIiApICkgewoJCQkJCQlzY3JpcHRzLnB1c2goIGVsZW0g KTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXRtcCA9IG51bGw7CgoJCXJldHVy biBzYWZlOwoJfSwKCgljbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50 ZXJuYWwgKi8gYWNjZXB0RGF0YSApIHsKCQl2YXIgZWxlbSwgdHlwZSwgaWQsIGRh dGEsCgkJCWkgPSAwLAoJCQlpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJ CQljYWNoZSA9IGpRdWVyeS5jYWNoZSwKCQkJZGVsZXRlRXhwYW5kbyA9IHN1cHBv cnQuZGVsZXRlRXhwYW5kbywKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVj aWFsOwoKCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyAp IHsKCQkJaWYgKCBhY2NlcHREYXRhIHx8IGpRdWVyeS5hY2NlcHREYXRhKCBlbGVt ICkgKSB7CgoJCQkJaWQgPSBlbGVtWyBpbnRlcm5hbEtleSBdOwoJCQkJZGF0YSA9 IGlkICYmIGNhY2hlWyBpZCBdOwoKCQkJCWlmICggZGF0YSApIHsKCQkJCQlpZiAo IGRhdGEuZXZlbnRzICkgewoJCQkJCQlmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRz ICkgewoJCQkJCQkJaWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7CgkJCQkJCQkJalF1 ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJCS8vIFRoaXMg aXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3Zl cmhlYWQKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50 KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJ CQkJfQoKCQkJCQkvLyBSZW1vdmUgY2FjaGUgb25seSBpZiBpdCB3YXMgbm90IGFs cmVhZHkgcmVtb3ZlZCBieSBqUXVlcnkuZXZlbnQucmVtb3ZlCgkJCQkJaWYgKCBj YWNoZVsgaWQgXSApIHsKCgkJCQkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCgkJCQkJ CS8vIElFIGRvZXMgbm90IGFsbG93IHVzIHRvIGRlbGV0ZSBleHBhbmRvIHByb3Bl cnRpZXMgZnJvbSBub2RlcywKCQkJCQkJLy8gbm9yIGRvZXMgaXQgaGF2ZSBhIHJl bW92ZUF0dHJpYnV0ZSBmdW5jdGlvbiBvbiBEb2N1bWVudCBub2RlczsKCQkJCQkJ Ly8gd2UgbXVzdCBoYW5kbGUgYWxsIG9mIHRoZXNlIGNhc2VzCgkJCQkJCWlmICgg ZGVsZXRlRXhwYW5kbyApIHsKCQkJCQkJCWRlbGV0ZSBlbGVtWyBpbnRlcm5hbEtl eSBdOwoKCQkJCQkJfSBlbHNlIGlmICggdHlwZW9mIGVsZW0ucmVtb3ZlQXR0cmli dXRlICE9PSBzdHJ1bmRlZmluZWQgKSB7CgkJCQkJCQllbGVtLnJlbW92ZUF0dHJp YnV0ZSggaW50ZXJuYWxLZXkgKTsKCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQllbGVt WyBpbnRlcm5hbEtleSBdID0gbnVsbDsKCQkJCQkJfQoKCQkJCQkJZGVsZXRlZElk cy5wdXNoKCBpZCApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KfSk7CgpqUXVl cnkuZm4uZXh0ZW5kKHsKCXRleHQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlyZXR1 cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCXJldHVybiB2 YWx1ZSA9PT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS50ZXh0KCB0aGlzICkgOgoJ CQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggKCB0aGlzWzBdICYmIHRoaXNbMF0ub3du ZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRleHROb2RlKCB2YWx1ZSAp ICk7CgkJfSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTsKCX0sCgoJ YXBwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcCggYXJn dW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBl ID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUg PT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0 aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJ fQoJCX0pOwoJfSwKCglwcmVwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhp cy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYg KCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8 IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1 bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuaW5zZXJ0QmVm b3JlKCBlbGVtLCB0YXJnZXQuZmlyc3RDaGlsZCApOwoJCQl9CgkJfSk7Cgl9LAoK CWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoIGFy Z3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5wYXJlbnRO b2RlICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwg dGhpcyApOwoJCQl9CgkJfSk7Cgl9LAoKCWFmdGVyOiBmdW5jdGlvbigpIHsKCQly ZXR1cm4gdGhpcy5kb21NYW5pcCggYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSAp IHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5v ZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0K CQl9KTsKCX0sCgoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IsIGtlZXBEYXRh IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCXZhciBlbGVtLAoJCQllbGVt cyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKSA6 IHRoaXMsCgkJCWkgPSAwOwoKCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9 IG51bGw7IGkrKyApIHsKCgkJCWlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5 cGUgPT09IDEgKSB7CgkJCQlqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0g KSApOwoJCQl9CgoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCWlmICgg a2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQs IGVsZW0gKSApIHsKCQkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIGVsZW0sICJz Y3JpcHQiICkgKTsKCQkJCX0KCQkJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGls ZCggZWxlbSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZW1wdHk6 IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtLAoJCQlpID0gMDsKCgkJZm9yICggOyAo ZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVs ZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxl bS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFs bCggZWxlbSwgZmFsc2UgKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFp bmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVs ZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgoJCQkvLyBJ ZiB0aGlzIGlzIGEgc2VsZWN0LCBlbnN1cmUgdGhhdCBpdCBkaXNwbGF5cyBlbXB0 eSAoIzEyMzM2KQoJCQkvLyBTdXBwb3J0OiBJRTw5CgkJCWlmICggZWxlbS5vcHRp b25zICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInNlbGVjdCIgKSApIHsKCQkJ CWVsZW0ub3B0aW9ucy5sZW5ndGggPSAwOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhp czsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0 YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9 PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZl bnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMg OiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9u KCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRz LCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0pOwoJfSwKCglodG1sOiBmdW5jdGlv biggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZh bHVlICkgewoJCQl2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSwKCQkJCWkgPSAw LAoJCQkJbCA9IHRoaXMubGVuZ3RoOwoKCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZp bmVkICkgewoJCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgPwoJCQkJCWVs ZW0uaW5uZXJIVE1MLnJlcGxhY2UoIHJpbmxpbmVqUXVlcnksICIiICkgOgoJCQkJ CXVuZGVmaW5lZDsKCQkJfQoKCQkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hv cnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAoJCQlpZiAoIHR5cGVvZiB2YWx1 ZSA9PT0gInN0cmluZyIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYm CgkJCQkoIHN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8fCAhcm5vc2hpbWNhY2hlLnRl c3QoIHZhbHVlICkgICkgJiYKCQkJCSggc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFj ZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJgoJCQkJ IXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgIiIsICIiIF0p WyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0gdmFsdWUucmVw bGFjZSggcnhodG1sVGFnLCAiPCQxPjwvJDI+IiApOwoKCQkJCXRyeSB7CgkJCQkJ Zm9yICg7IGkgPCBsOyBpKysgKSB7CgkJCQkJCS8vIFJlbW92ZSBlbGVtZW50IG5v ZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcwoJCQkJCQllbGVtID0gdGhpc1tp XSB8fCB7fTsKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJ CQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJ CQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJ CQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFu IGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2go ZSkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFw cGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMu bGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIg YXJnID0gYXJndW1lbnRzWyAwIF07CgoJCS8vIE1ha2UgdGhlIGNoYW5nZXMsIHJl cGxhY2luZyBlYWNoIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVu dAoJCXRoaXMuZG9tTWFuaXAoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7 CgkJCWFyZyA9IHRoaXMucGFyZW50Tm9kZTsKCgkJCWpRdWVyeS5jbGVhbkRhdGEo IGdldEFsbCggdGhpcyApICk7CgoJCQlpZiAoIGFyZyApIHsKCQkJCWFyZy5yZXBs YWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0pOwoKCQkvLyBGb3JjZSBy ZW1vdmFsIGlmIHRoZXJlIHdhcyBubyBuZXcgY29udGVudCAoZS5nLiwgZnJvbSBl bXB0eSBhcmd1bWVudHMpCgkJcmV0dXJuIGFyZyAmJiAoYXJnLmxlbmd0aCB8fCBh cmcubm9kZVR5cGUpID8gdGhpcyA6IHRoaXMucmVtb3ZlKCk7Cgl9LAoKCWRldGFj aDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSgg c2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdz LCBjYWxsYmFjayApIHsKCgkJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJ CWFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7CgoJCXZhciBmaXJzdCwg bm9kZSwgaGFzU2NyaXB0cywKCQkJc2NyaXB0cywgZG9jLCBmcmFnbWVudCwKCQkJ aSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJc2V0ID0gdGhpcywKCQkJaU5v Q2xvbmUgPSBsIC0gMSwKCQkJdmFsdWUgPSBhcmdzWzBdLAoJCQlpc0Z1bmN0aW9u ID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7CgoJCS8vIFdlIGNhbid0IGNs b25lTm9kZSBmcmFnbWVudHMgdGhhdCBjb250YWluIGNoZWNrZWQsIGluIFdlYktp dAoJCWlmICggaXNGdW5jdGlvbiB8fAoJCQkJKCBsID4gMSAmJiB0eXBlb2YgdmFs dWUgPT09ICJzdHJpbmciICYmCgkJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiBy Y2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2go ZnVuY3Rpb24oIGluZGV4ICkgewoJCQkJdmFyIHNlbGYgPSBzZXQuZXEoIGluZGV4 ICk7CgkJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CgkJCQkJYXJnc1swXSA9IHZhbHVl LmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApOwoJCQkJfQoJCQkJc2Vs Zi5kb21NYW5pcCggYXJncywgY2FsbGJhY2sgKTsKCQkJfSk7CgkJfQoKCQlpZiAo IGwgKSB7CgkJCWZyYWdtZW50ID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3Ms IHRoaXNbIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgdGhpcyApOwoJCQlmaXJz dCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQlpZiAoIGZyYWdtZW50LmNoaWxk Tm9kZXMubGVuZ3RoID09PSAxICkgewoJCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQkJ fQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXNjcmlwdHMgPSBqUXVlcnkubWFwKCBn ZXRBbGwoIGZyYWdtZW50LCAic2NyaXB0IiApLCBkaXNhYmxlU2NyaXB0ICk7CgkJ CQloYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7CgoJCQkJLy8gVXNlIHRoZSBv cmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbSBpbnN0ZWFkIG9mIHRo ZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJCS8vIGJlaW5nIGVtcHRp ZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuCgkJ CQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJbm9kZSA9IGZyYWdtZW50OwoK CQkJCQlpZiAoIGkgIT09IGlOb0Nsb25lICkgewoJCQkJCQlub2RlID0galF1ZXJ5 LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7CgoJCQkJCQkvLyBLZWVwIHJlZmVy ZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJ CQkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCQkJCWpRdWVyeS5tZXJnZSggc2Ny aXB0cywgZ2V0QWxsKCBub2RlLCAic2NyaXB0IiApICk7CgkJCQkJCX0KCQkJCQl9 CgoJCQkJCWNhbGxiYWNrLmNhbGwoIHRoaXNbaV0sIG5vZGUsIGkgKTsKCQkJCX0K CgkJCQlpZiAoIGhhc1NjcmlwdHMgKSB7CgkJCQkJZG9jID0gc2NyaXB0c1sgc2Ny aXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDsKCgkJCQkJLy8gUmVlbmFi bGUgc2NyaXB0cwoJCQkJCWpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3Jp cHQgKTsKCgkJCQkJLy8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZp cnN0IGRvY3VtZW50IGluc2VydGlvbgoJCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFz U2NyaXB0czsgaSsrICkgewoJCQkJCQlub2RlID0gc2NyaXB0c1sgaSBdOwoJCQkJ CQlpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCAiIiApICYmCgkJ CQkJCQkhalF1ZXJ5Ll9kYXRhKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJiBqUXVl cnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJCWlmICggbm9kZS5z cmMgKSB7CgkJCQkJCQkJLy8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQg d29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnQKCQkJCQkJCQlpZiAoIGpR dWVyeS5fZXZhbFVybCApIHsKCQkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2Rl LnNyYyApOwoJCQkJCQkJCX0KCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJalF1ZXJ5 Lmdsb2JhbEV2YWwoICggbm9kZS50ZXh0IHx8IG5vZGUudGV4dENvbnRlbnQgfHwg bm9kZS5pbm5lckhUTUwgfHwgIiIgKS5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIi ICkgKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBGaXgg IzExODA5OiBBdm9pZCBsZWFraW5nIG1lbW9yeQoJCQkJZnJhZ21lbnQgPSBmaXJz dCA9IG51bGw7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfQp9KTsKCmpRdWVy eS5lYWNoKHsKCWFwcGVuZFRvOiAiYXBwZW5kIiwKCXByZXBlbmRUbzogInByZXBl bmQiLAoJaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwKCWluc2VydEFmdGVyOiAiYWZ0 ZXIiLAoJcmVwbGFjZUFsbDogInJlcGxhY2VXaXRoIgp9LCBmdW5jdGlvbiggbmFt ZSwgb3JpZ2luYWwgKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBz ZWxlY3RvciApIHsKCQl2YXIgZWxlbXMsCgkJCWkgPSAwLAoJCQlyZXQgPSBbXSwK CQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAoJCQlsYXN0ID0gaW5zZXJ0 Lmxlbmd0aCAtIDE7CgoJCWZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7CgkJCWVs ZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKHRydWUpOwoJCQlq UXVlcnkoIGluc2VydFtpXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8g TW9kZXJuIGJyb3dzZXJzIGNhbiBhcHBseSBqUXVlcnkgY29sbGVjdGlvbnMgYXMg YXJyYXlzLCBidXQgb2xkSUUgbmVlZHMgYSAuZ2V0KCkKCQkJcHVzaC5hcHBseSgg cmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNr KCByZXQgKTsKCX07Cn0pOwoKCnZhciBpZnJhbWUsCgllbGVtZGlzcGxheSA9IHt9 OwoKLyoqCiAqIFJldHJpZXZlIHRoZSBhY3R1YWwgZGlzcGxheSBvZiBhIGVsZW1l bnQKICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1l bnQKICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3QKICovCi8v IENhbGxlZCBvbmx5IGZyb20gd2l0aGluIGRlZmF1bHREaXNwbGF5CmZ1bmN0aW9u IGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHsKCXZhciBzdHlsZSwKCQllbGVt ID0galF1ZXJ5KCBkb2MuY3JlYXRlRWxlbWVudCggbmFtZSApICkuYXBwZW5kVG8o IGRvYy5ib2R5ICksCgoJCS8vIGdldERlZmF1bHRDb21wdXRlZFN0eWxlIG1pZ2h0 IGJlIHJlbGlhYmx5IHVzZWQgb25seSBvbiBhdHRhY2hlZCBlbGVtZW50CgkJZGlz cGxheSA9IHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSAmJiAoIHN0eWxl ID0gd2luZG93LmdldERlZmF1bHRDb21wdXRlZFN0eWxlKCBlbGVtWyAwIF0gKSAp ID8KCgkJCS8vIFVzZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHRlbXBvcmFyeSBmaXgg KG1vcmUgbGlrZSBvcHRtaXphdGlvbikgdW50aWwgc29tZXRoaW5nIGJldHRlciBj b21lcyBhbG9uZywKCQkJLy8gc2luY2UgaXQgd2FzIHJlbW92ZWQgZnJvbSBzcGVj aWZpY2F0aW9uIGFuZCBzdXBwb3J0ZWQgb25seSBpbiBGRgoJCQlzdHlsZS5kaXNw bGF5IDogalF1ZXJ5LmNzcyggZWxlbVsgMCBdLCAiZGlzcGxheSIgKTsKCgkvLyBX ZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxlbWVudCwKCS8v IHNvIHVzZSAiZGV0YWNoIiBtZXRob2QgYXMgZmFzdCB3YXkgdG8gZ2V0IHJpZCBv ZiB0aGUgZWxlbWVudAoJZWxlbS5kZXRhY2goKTsKCglyZXR1cm4gZGlzcGxheTsK fQoKLyoqCiAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2 YWx1ZSBvZiBhbiBlbGVtZW50CiAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZQog Ki8KZnVuY3Rpb24gZGVmYXVsdERpc3BsYXkoIG5vZGVOYW1lICkgewoJdmFyIGRv YyA9IGRvY3VtZW50LAoJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUg XTsKCglpZiAoICFkaXNwbGF5ICkgewoJCWRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5 KCBub2RlTmFtZSwgZG9jICk7CgoJCS8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxz LCByZWFkIGZyb20gaW5zaWRlIGFuIGlmcmFtZQoJCWlmICggZGlzcGxheSA9PT0g Im5vbmUiIHx8ICFkaXNwbGF5ICkgewoKCQkJLy8gVXNlIHRoZSBhbHJlYWR5LWNy ZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlCgkJCWlmcmFtZSA9IChpZnJhbWUgfHwg alF1ZXJ5KCAiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdo dD0nMCcvPiIgKSkuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTsKCgkJ CS8vIEFsd2F5cyB3cml0ZSBhIG5ldyBIVE1MIHNrZWxldG9uIHNvIFdlYmtpdCBh bmQgRmlyZWZveCBkb24ndCBjaG9rZSBvbiByZXVzZQoJCQlkb2MgPSAoIGlmcmFt ZVsgMCBdLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lWyAwIF0uY29udGVudERvY3Vt ZW50ICkuZG9jdW1lbnQ7CgoJCQkvLyBTdXBwb3J0OiBJRQoJCQlkb2Mud3JpdGUo KTsKCQkJZG9jLmNsb3NlKCk7CgoJCQlkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSgg bm9kZU5hbWUsIGRvYyApOwoJCQlpZnJhbWUuZGV0YWNoKCk7CgkJfQoKCQkvLyBT dG9yZSB0aGUgY29ycmVjdCBkZWZhdWx0IGRpc3BsYXkKCQllbGVtZGlzcGxheVsg bm9kZU5hbWUgXSA9IGRpc3BsYXk7Cgl9CgoJcmV0dXJuIGRpc3BsYXk7Cn0KCgoo ZnVuY3Rpb24oKSB7Cgl2YXIgc2hyaW5rV3JhcEJsb2Nrc1ZhbDsKCglzdXBwb3J0 LnNocmlua1dyYXBCbG9ja3MgPSBmdW5jdGlvbigpIHsKCQlpZiAoIHNocmlua1dy YXBCbG9ja3NWYWwgIT0gbnVsbCApIHsKCQkJcmV0dXJuIHNocmlua1dyYXBCbG9j a3NWYWw7CgkJfQoKCQkvLyBXaWxsIGJlIGNoYW5nZWQgbGF0ZXIgaWYgbmVlZGVk LgoJCXNocmlua1dyYXBCbG9ja3NWYWwgPSBmYWxzZTsKCgkJLy8gTWluaWZpZWQ6 IHZhciBiLGMsZAoJCXZhciBkaXYsIGJvZHksIGNvbnRhaW5lcjsKCgkJYm9keSA9 IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYm9keSIgKVsgMCBdOwoJ CWlmICggIWJvZHkgfHwgIWJvZHkuc3R5bGUgKSB7CgkJCS8vIFRlc3QgZmlyZWQg dG9vIGVhcmx5IG9yIGluIGFuIHVuc3VwcG9ydGVkIGVudmlyb25tZW50LCBleGl0 LgoJCQlyZXR1cm47CgkJfQoKCQkvLyBTZXR1cAoJCWRpdiA9IGRvY3VtZW50LmNy ZWF0ZUVsZW1lbnQoICJkaXYiICk7CgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCggImRpdiIgKTsKCQljb250YWluZXIuc3R5bGUuY3NzVGV4dCA9 ICJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Rv cDowO2xlZnQ6LTk5OTlweCI7CgkJYm9keS5hcHBlbmRDaGlsZCggY29udGFpbmVy ICkuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCQkvLyBTdXBwb3J0OiBJRTYKCQkvLyBD aGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91dCBzaHJpbmstd3JhcCB0aGVpciBj aGlsZHJlbgoJCWlmICggdHlwZW9mIGRpdi5zdHlsZS56b29tICE9PSBzdHJ1bmRl ZmluZWQgKSB7CgkJCS8vIFJlc2V0IENTUzogYm94LXNpemluZzsgZGlzcGxheTsg bWFyZ2luOyBib3JkZXIKCQkJZGl2LnN0eWxlLmNzc1RleHQgPQoJCQkJLy8gU3Vw cG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjMKCQkJCS8vIFZlbmRvci1wcmVm aXggYm94LXNpemluZwoJCQkJIi13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJv eDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7IiArCgkJCQkiYm94LXNpemlu Zzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowOyIg KwoJCQkJInBhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiOwoJCQlkaXYuYXBw ZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgKS5zdHls ZS53aWR0aCA9ICI1cHgiOwoJCQlzaHJpbmtXcmFwQmxvY2tzVmFsID0gZGl2Lm9m ZnNldFdpZHRoICE9PSAzOwoJCX0KCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFp bmVyICk7CgoJCXJldHVybiBzaHJpbmtXcmFwQmxvY2tzVmFsOwoJfTsKCn0pKCk7 CnZhciBybWFyZ2luID0gKC9ebWFyZ2luLyk7Cgp2YXIgcm51bW5vbnB4ID0gbmV3 IFJlZ0V4cCggIl4oIiArIHBudW0gKyAiKSg/IXB4KVthLXolXSskIiwgImkiICk7 CgoKCnZhciBnZXRTdHlsZXMsIGN1ckNTUywKCXJwb3NpdGlvbiA9IC9eKHRvcHxy aWdodHxib3R0b218bGVmdCkkLzsKCmlmICggd2luZG93LmdldENvbXB1dGVkU3R5 bGUgKSB7CglnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4g ZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUo IGVsZW0sIG51bGwgKTsKCX07CgoJY3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5h bWUsIGNvbXB1dGVkICkgewoJCXZhciB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRo LCByZXQsCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJY29tcHV0ZWQgPSBjb21w dXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkJLy8gZ2V0UHJvcGVydHlWYWx1 ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgaW4gSUU5LCBzZWUg IzEyNTM3CgkJcmV0ID0gY29tcHV0ZWQgPyBjb21wdXRlZC5nZXRQcm9wZXJ0eVZh bHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZDsKCgkJ aWYgKCBjb21wdXRlZCApIHsKCgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5 LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKCQkJCXJl dCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOwoJCQl9CgoJCQkvLyBBIHRy aWJ1dGUgdG8gdGhlICJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzIgoJCQkv LyBDaHJvbWUgPCAxNyBhbmQgU2FmYXJpIDUuMCB1c2VzICJjb21wdXRlZCB2YWx1 ZSIgaW5zdGVhZCBvZiAidXNlZCB2YWx1ZSIgZm9yIG1hcmdpbi1yaWdodAoJCQkv LyBTYWZhcmkgNS4xLjcgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9y IGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSBy ZWxpYWJseSBwaXhlbHMKCQkJLy8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBk cmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2 ZWQtdmFsdWVzCgkJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJn aW4udGVzdCggbmFtZSApICkgewoKCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5h bCB2YWx1ZXMKCQkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCQltaW5XaWR0aCA9 IHN0eWxlLm1pbldpZHRoOwoJCQkJbWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDsK CgkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQg dmFsdWUgb3V0CgkJCQlzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0g c3R5bGUud2lkdGggPSByZXQ7CgkJCQlyZXQgPSBjb21wdXRlZC53aWR0aDsKCgkJ CQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCQlzdHlsZS53aWR0aCA9 IHdpZHRoOwoJCQkJc3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDsKCQkJCXN0eWxl Lm1heFdpZHRoID0gbWF4V2lkdGg7CgkJCX0KCQl9CgoJCS8vIFN1cHBvcnQ6IElF CgkJLy8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci4KCQly ZXR1cm4gcmV0ID09PSB1bmRlZmluZWQgPwoJCQlyZXQgOgoJCQlyZXQgKyAiIjsK CX07Cn0gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50 U3R5bGUgKSB7CglnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1 cm4gZWxlbS5jdXJyZW50U3R5bGU7Cgl9OwoKCWN1ckNTUyA9IGZ1bmN0aW9uKCBl bGVtLCBuYW1lLCBjb21wdXRlZCApIHsKCQl2YXIgbGVmdCwgcnMsIHJzTGVmdCwg cmV0LAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCWNvbXB1dGVkID0gY29tcHV0 ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7CgkJcmV0ID0gY29tcHV0ZWQgPyBjb21w dXRlZFsgbmFtZSBdIDogdW5kZWZpbmVkOwoKCQkvLyBBdm9pZCBzZXR0aW5nIHJl dCB0byBlbXB0eSBzdHJpbmcgaGVyZQoJCS8vIHNvIHdlIGRvbid0IGRlZmF1bHQg dG8gYXV0bwoJCWlmICggcmV0ID09IG51bGwgJiYgc3R5bGUgJiYgc3R5bGVbIG5h bWUgXSApIHsKCQkJcmV0ID0gc3R5bGVbIG5hbWUgXTsKCQl9CgoJCS8vIEZyb20g dGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkvLyBodHRwOi8vZXJp ay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQt MTAyMjkxCgoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFy IHBpeGVsIG51bWJlcgoJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJk IGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCS8vIGJ1 dCBub3QgcG9zaXRpb24gY3NzIGF0dHJpYnV0ZXMsIGFzIHRob3NlIGFyZSBwcm9w b3J0aW9uYWwgdG8gdGhlIHBhcmVudCBlbGVtZW50IGluc3RlYWQKCQkvLyBhbmQg d2UgY2FuJ3QgbWVhc3VyZSB0aGUgcGFyZW50IGluc3RlYWQgYmVjYXVzZSBpdCBt aWdodCB0cmlnZ2VyIGEgInN0YWNraW5nIGRvbGxzIiBwcm9ibGVtCgkJaWYgKCBy bnVtbm9ucHgudGVzdCggcmV0ICkgJiYgIXJwb3NpdGlvbi50ZXN0KCBuYW1lICkg KSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCWxlZnQg PSBzdHlsZS5sZWZ0OwoJCQlycyA9IGVsZW0ucnVudGltZVN0eWxlOwoJCQlyc0xl ZnQgPSBycyAmJiBycy5sZWZ0OwoKCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVz IHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAoJCQlpZiAoIHJzTGVmdCApIHsK CQkJCXJzLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQl9CgkJCXN0 eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiByZXQ7CgkJ CXJldCA9IHN0eWxlLnBpeGVsTGVmdCArICJweCI7CgoJCQkvLyBSZXZlcnQgdGhl IGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLmxlZnQgPSBsZWZ0OwoJCQlpZiAoIHJz TGVmdCApIHsKCQkJCXJzLmxlZnQgPSByc0xlZnQ7CgkJCX0KCQl9CgoJCS8vIFN1 cHBvcnQ6IElFCgkJLy8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50 ZWdlci4KCQlyZXR1cm4gcmV0ID09PSB1bmRlZmluZWQgPwoJCQlyZXQgOgoJCQly ZXQgKyAiIiB8fCAiYXV0byI7Cgl9Owp9CgoKCgpmdW5jdGlvbiBhZGRHZXRIb29r SWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgkvLyBEZWZpbmUgdGhlIGhvb2ss IHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVl ZGVkLgoJcmV0dXJuIHsKCQlnZXQ6IGZ1bmN0aW9uKCkgewoJCQl2YXIgY29uZGl0 aW9uID0gY29uZGl0aW9uRm4oKTsKCgkJCWlmICggY29uZGl0aW9uID09IG51bGwg KSB7CgkJCQkvLyBUaGUgdGVzdCB3YXMgbm90IHJlYWR5IGF0IHRoaXMgcG9pbnQ7 IHNjcmV3IHRoZSBob29rIHRoaXMgdGltZQoJCQkJLy8gYnV0IGNoZWNrIGFnYWlu IHdoZW4gbmVlZGVkIG5leHQgdGltZS4KCQkJCXJldHVybjsKCQkJfQoKCQkJaWYg KCBjb25kaXRpb24gKSB7CgkJCQkvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mg bm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmN5 KSwKCQkJCS8vIHJlbW92ZSBpdC4KCQkJCS8vIFNpbmNlIHRoZXJlIGFyZSBubyBv dGhlciBob29rcyBmb3IgbWFyZ2luUmlnaHQsIHJlbW92ZSB0aGUgd2hvbGUgb2Jq ZWN0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkv LyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0 ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCgkJCXJldHVybiAodGhpcy5nZXQg PSBob29rRm4pLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9Cgl9Owp9CgoK KGZ1bmN0aW9uKCkgewoJLy8gTWluaWZpZWQ6IHZhciBiLGMsZCxlLGYsZywgaCxp Cgl2YXIgZGl2LCBzdHlsZSwgYSwgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5n UmVsaWFibGVWYWwsCgkJcmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsLCByZWxpYWJs ZU1hcmdpblJpZ2h0VmFsOwoKCS8vIFNldHVwCglkaXYgPSBkb2N1bWVudC5jcmVh dGVFbGVtZW50KCAiZGl2IiApOwoJZGl2LmlubmVySFRNTCA9ICIgIDxsaW5rLz48 dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hl Y2tib3gnLz4iOwoJYSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImEiIClb IDAgXTsKCXN0eWxlID0gYSAmJiBhLnN0eWxlOwoKCS8vIEZpbmlzaCBlYXJseSBp biBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFzdHls ZSApIHsKCQlyZXR1cm47Cgl9CgoJc3R5bGUuY3NzVGV4dCA9ICJmbG9hdDpsZWZ0 O29wYWNpdHk6LjUiOwoKCS8vIFN1cHBvcnQ6IElFPDkKCS8vIE1ha2Ugc3VyZSB0 aGF0IGVsZW1lbnQgb3BhY2l0eSBleGlzdHMgKGFzIG9wcG9zZWQgdG8gZmlsdGVy KQoJc3VwcG9ydC5vcGFjaXR5ID0gc3R5bGUub3BhY2l0eSA9PT0gIjAuNSI7CgoJ Ly8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQoJLy8gKElFIHVzZXMgc3R5 bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQoJc3VwcG9ydC5jc3NGbG9hdCA9 ICEhc3R5bGUuY3NzRmxvYXQ7CgoJZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0g ImNvbnRlbnQtYm94IjsKCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNr Z3JvdW5kQ2xpcCA9ICIiOwoJc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYu c3R5bGUuYmFja2dyb3VuZENsaXAgPT09ICJjb250ZW50LWJveCI7CgoJLy8gU3Vw cG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjMKCS8vIFZlbmRvci1wcmVmaXgg Ym94LXNpemluZwoJc3VwcG9ydC5ib3hTaXppbmcgPSBzdHlsZS5ib3hTaXppbmcg PT09ICIiIHx8IHN0eWxlLk1vekJveFNpemluZyA9PT0gIiIgfHwKCQlzdHlsZS5X ZWJraXRCb3hTaXppbmcgPT09ICIiOwoKCWpRdWVyeS5leHRlbmQoc3VwcG9ydCwg ewoJCXJlbGlhYmxlSGlkZGVuT2Zmc2V0czogZnVuY3Rpb24oKSB7CgkJCWlmICgg cmVsaWFibGVIaWRkZW5PZmZzZXRzVmFsID09IG51bGwgKSB7CgkJCQljb21wdXRl U3R5bGVUZXN0cygpOwoJCQl9CgkJCXJldHVybiByZWxpYWJsZUhpZGRlbk9mZnNl dHNWYWw7CgkJfSwKCgkJYm94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkgewoJ CQlpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51bGwgKSB7CgkJCQljb21w dXRlU3R5bGVUZXN0cygpOwoJCQl9CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJs ZVZhbDsKCQl9LAoKCQlwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQkJaWYg KCBwaXhlbFBvc2l0aW9uVmFsID09IG51bGwgKSB7CgkJCQljb21wdXRlU3R5bGVU ZXN0cygpOwoJCQl9CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgoJ CS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCgkJcmVsaWFibGVNYXJnaW5SaWdodDog ZnVuY3Rpb24oKSB7CgkJCWlmICggcmVsaWFibGVNYXJnaW5SaWdodFZhbCA9PSBu dWxsICkgewoJCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJfQoJCQlyZXR1cm4g cmVsaWFibGVNYXJnaW5SaWdodFZhbDsKCQl9Cgl9KTsKCglmdW5jdGlvbiBjb21w dXRlU3R5bGVUZXN0cygpIHsKCQkvLyBNaW5pZmllZDogdmFyIGIsYyxkLGoKCQl2 YXIgZGl2LCBib2R5LCBjb250YWluZXIsIGNvbnRlbnRzOwoKCQlib2R5ID0gZG9j dW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJib2R5IiApWyAwIF07CgkJaWYg KCAhYm9keSB8fCAhYm9keS5zdHlsZSApIHsKCQkJLy8gVGVzdCBmaXJlZCB0b28g ZWFybHkgb3IgaW4gYW4gdW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQsIGV4aXQuCgkJ CXJldHVybjsKCQl9CgoJCS8vIFNldHVwCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRl RWxlbWVudCggImRpdiIgKTsKCQljb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVF bGVtZW50KCAiZGl2IiApOwoJCWNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gInBv c2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7 bGVmdDotOTk5OXB4IjsKCQlib2R5LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5h cHBlbmRDaGlsZCggZGl2ICk7CgoJCWRpdi5zdHlsZS5jc3NUZXh0ID0KCQkJLy8g U3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjMKCQkJLy8gVmVuZG9yLXBy ZWZpeCBib3gtc2l6aW5nCgkJCSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJv eDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDsiICsKCQkJImJveC1zaXppbmc6 Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MSU7dG9wOjElOyIg KwoJCQkiYm9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246 YWJzb2x1dGUiOwoKCQkvLyBTdXBwb3J0OiBJRTw5CgkJLy8gQXNzdW1lIHJlYXNv bmFibGUgdmFsdWVzIGluIHRoZSBhYnNlbmNlIG9mIGdldENvbXB1dGVkU3R5bGUK CQlwaXhlbFBvc2l0aW9uVmFsID0gYm94U2l6aW5nUmVsaWFibGVWYWwgPSBmYWxz ZTsKCQlyZWxpYWJsZU1hcmdpblJpZ2h0VmFsID0gdHJ1ZTsKCgkJLy8gQ2hlY2sg Zm9yIGdldENvbXB1dGVkU3R5bGUgc28gdGhhdCB0aGlzIGNvZGUgaXMgbm90IHJ1 biBpbiBJRTw5LgoJCWlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7CgkJ CXBpeGVsUG9zaXRpb25WYWwgPSAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBk aXYsIG51bGwgKSB8fCB7fSApLnRvcCAhPT0gIjElIjsKCQkJYm94U2l6aW5nUmVs aWFibGVWYWwgPQoJCQkJKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBu dWxsICkgfHwgeyB3aWR0aDogIjRweCIgfSApLndpZHRoID09PSAiNHB4IjsKCgkJ CS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zCgkJCS8vIERpdiB3aXRoIGV4cGxpY2l0 IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCQkJLy8gZ2V0 cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFp bmVyICgjMzMzMykKCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVk U3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CgkJCWNv bnRlbnRzID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCAiZGl2IiApICk7CgoJCQkvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3Bs YXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nCgkJCWNvbnRlbnRzLnN0eWxlLmNz c1RleHQgPSBkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCQkvLyBTdXBwb3J0OiBGaXJl Zm94PDI5LCBBbmRyb2lkIDIuMwoJCQkJLy8gVmVuZG9yLXByZWZpeCBib3gtc2l6 aW5nCgkJCQkiLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94 LXNpemluZzpjb250ZW50LWJveDsiICsKCQkJCSJib3gtc2l6aW5nOmNvbnRlbnQt Ym94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIjsK CQkJY29udGVudHMuc3R5bGUubWFyZ2luUmlnaHQgPSBjb250ZW50cy5zdHlsZS53 aWR0aCA9ICIwIjsKCQkJZGl2LnN0eWxlLndpZHRoID0gIjFweCI7CgoJCQlyZWxp YWJsZU1hcmdpblJpZ2h0VmFsID0KCQkJCSFwYXJzZUZsb2F0KCAoIHdpbmRvdy5n ZXRDb21wdXRlZFN0eWxlKCBjb250ZW50cywgbnVsbCApIHx8IHt9ICkubWFyZ2lu UmlnaHQgKTsKCQl9CgoJCS8vIFN1cHBvcnQ6IElFOAoJCS8vIENoZWNrIGlmIHRh YmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhl eSBhcmUgc2V0CgkJLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3Rp bGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCgkJLy8gdGFibGUgcm93 OyBpZiBzbywgb2Zmc2V0V2lkdGgvSGVpZ2h0IGFyZSBub3QgcmVsaWFibGUgZm9y IHVzZSB3aGVuCgkJLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVl biBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKCQkvLyBkaXNwbGF5Om5vbmUgKGl0IGlz IHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBp cwoJCS8vIGhpZGRlbjsgZG9uIHNhZmV0eSBnb2dnbGVzIGFuZCBzZWUgYnVnICM0 NTEyIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KCQlkaXYuaW5uZXJIVE1MID0gIjx0 YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iOwoJCWNv bnRlbnRzID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAidGQiICk7CgkJY29u dGVudHNbIDAgXS5zdHlsZS5jc3NUZXh0ID0gIm1hcmdpbjowO2JvcmRlcjowO3Bh ZGRpbmc6MDtkaXNwbGF5Om5vbmUiOwoJCXJlbGlhYmxlSGlkZGVuT2Zmc2V0c1Zh bCA9IGNvbnRlbnRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwOwoJCWlmICggcmVs aWFibGVIaWRkZW5PZmZzZXRzVmFsICkgewoJCQljb250ZW50c1sgMCBdLnN0eWxl LmRpc3BsYXkgPSAiIjsKCQkJY29udGVudHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0g Im5vbmUiOwoJCQlyZWxpYWJsZUhpZGRlbk9mZnNldHNWYWwgPSBjb250ZW50c1sg MCBdLm9mZnNldEhlaWdodCA9PT0gMDsKCQl9CgoJCWJvZHkucmVtb3ZlQ2hpbGQo IGNvbnRhaW5lciApOwoJfQoKfSkoKTsKCgovLyBBIG1ldGhvZCBmb3IgcXVpY2ts eSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3Qg Y2FsY3VsYXRpb25zLgpqUXVlcnkuc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRp b25zLCBjYWxsYmFjaywgYXJncyApIHsKCXZhciByZXQsIG5hbWUsCgkJb2xkID0g e307CgoJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhl IG5ldyBvbmVzCglmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJb2xkWyBuYW1l IF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CgkJZWxlbS5zdHlsZVsgbmFtZSBdID0g b3B0aW9uc1sgbmFtZSBdOwoJfQoKCXJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVt LCBhcmdzIHx8IFtdICk7CgoJLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCglmb3Ig KCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xk WyBuYW1lIF07Cgl9CgoJcmV0dXJuIHJldDsKfTsKCgp2YXIKCQlyYWxwaGEgPSAv YWxwaGFcKFteKV0qXCkvaSwKCXJvcGFjaXR5ID0gL29wYWNpdHlccyo9XHMqKFte KV0qKS8sCgoJLy8gc3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFy dHMgd2l0aCB0YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxlLWNlbGwiLCBvciAi dGFibGUtY2FwdGlvbiIKCS8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczog aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlz cGxheQoJcmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykv LAoJcm51bXNwbGl0ID0gbmV3IFJlZ0V4cCggIl4oIiArIHBudW0gKyAiKSguKikk IiwgImkiICksCglycmVsTnVtID0gbmV3IFJlZ0V4cCggIl4oWystXSk9KCIgKyBw bnVtICsgIikiLCAiaSIgKSwKCgljc3NTaG93ID0geyBwb3NpdGlvbjogImFic29s dXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ICJibG9jayIgfSwK CWNzc05vcm1hbFRyYW5zZm9ybSA9IHsKCQlsZXR0ZXJTcGFjaW5nOiAiMCIsCgkJ Zm9udFdlaWdodDogIjQwMCIKCX0sCgoJY3NzUHJlZml4ZXMgPSBbICJXZWJraXQi LCAiTyIsICJNb3oiLCAibXMiIF07CgoKLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5 IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0 eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUgKSB7CgoJLy8g c2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWQK CWlmICggbmFtZSBpbiBzdHlsZSApIHsKCQlyZXR1cm4gbmFtZTsKCX0KCgkvLyBj aGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzCgl2YXIgY2FwTmFtZSA9IG5h bWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLAoJCW9y aWdOYW1lID0gbmFtZSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxl ICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsK CQlpZiAoIG5hbWUgaW4gc3R5bGUgKSB7CgkJCXJldHVybiBuYW1lOwoJCX0KCX0K CglyZXR1cm4gb3JpZ05hbWU7Cn0KCmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50 cywgc2hvdyApIHsKCXZhciBkaXNwbGF5LCBlbGVtLCBoaWRkZW4sCgkJdmFsdWVz ID0gW10sCgkJaW5kZXggPSAwLAoJCWxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsK Cglmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewoJCWVsZW0gPSBl bGVtZW50c1sgaW5kZXggXTsKCQlpZiAoICFlbGVtLnN0eWxlICkgewoJCQljb250 aW51ZTsKCQl9CgoJCXZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxl bSwgIm9sZGRpc3BsYXkiICk7CgkJZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxh eTsKCQlpZiAoIHNob3cgKSB7CgkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxh eSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKCQkJLy8gYmVpbmcg aGlkZGVuIGJ5IGNhc2NhZGVkIHJ1bGVzIG9yIG5vdAoJCQlpZiAoICF2YWx1ZXNb IGluZGV4IF0gJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJZWxlbS5zdHls ZS5kaXNwbGF5ID0gIiI7CgkJCX0KCgkJCS8vIFNldCBlbGVtZW50cyB3aGljaCBo YXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmUKCQkJLy8gaW4g YSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5 bGUgaXMKCQkJLy8gZm9yIHN1Y2ggYW4gZWxlbWVudAoJCQlpZiAoIGVsZW0uc3R5 bGUuZGlzcGxheSA9PT0gIiIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHsKCQkJCXZh bHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXki LCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApOwoJCQl9CgkJfSBlbHNl IHsKCQkJaGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTsKCgkJCWlmICggZGlzcGxh eSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgfHwgIWhpZGRlbiApIHsKCQkJCWpRdWVy eS5fZGF0YSggZWxlbSwgIm9sZGRpc3BsYXkiLCBoaWRkZW4gPyBkaXNwbGF5IDog alF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKTsKCQkJfQoJCX0KCX0KCgkv LyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBz ZWNvbmQgbG9vcAoJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJZm9y ICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVt ID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJ Y29udGludWU7CgkJfQoJCWlmICggIXNob3cgfHwgZWxlbS5zdHlsZS5kaXNwbGF5 ID09PSAibm9uZSIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSAiIiApIHsKCQkJ ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCAi IiA6ICJub25lIjsKCQl9Cgl9CgoJcmV0dXJuIGVsZW1lbnRzOwp9CgpmdW5jdGlv biBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoJ dmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTsKCXJldHVybiBt YXRjaGVzID8KCQkvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCAic3VidHJhY3Qi LCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3MKCQlNYXRoLm1heCggMCwg bWF0Y2hlc1sgMSBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sg MiBdIHx8ICJweCIgKSA6CgkJdmFsdWU7Cn0KCmZ1bmN0aW9uIGF1Z21lbnRXaWR0 aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxl cyApIHsKCXZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVy IiA6ICJjb250ZW50IiApID8KCQkvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJp Z2h0IG1lYXN1cmVtZW50LCBhdm9pZCBhdWdtZW50YXRpb24KCQk0IDoKCQkvLyBP dGhlcndpc2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBw cm9wZXJ0aWVzCgkJbmFtZSA9PT0gIndpZHRoIiA/IDEgOiAwLAoKCQl2YWwgPSAw OwoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCQkvLyBib3RoIGJveCBtb2Rl bHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0CgkJaWYg KCBleHRyYSA9PT0gIm1hcmdpbiIgKSB7CgkJCXZhbCArPSBqUXVlcnkuY3NzKCBl bGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQl9 CgoJCWlmICggaXNCb3JkZXJCb3ggKSB7CgkJCS8vIGJvcmRlci1ib3ggaW5jbHVk ZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudAoJCQlp ZiAoIGV4dHJhID09PSAiY29udGVudCIgKSB7CgkJCQl2YWwgLT0galF1ZXJ5LmNz cyggZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxl cyApOwoJCQl9CgoJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3Jk ZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlcgoJCQlpZiAoIGV4dHJhICE9 PSAibWFyZ2luIiApIHsKCQkJCXZhbCAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9y ZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7 CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24n dCBjb250ZW50LCBzbyBhZGQgcGFkZGluZwoJCQl2YWwgKz0galF1ZXJ5LmNzcygg ZWxlbSwgInBhZGRpbmciICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyAp OwoKCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3Ig cGFkZGluZywgc28gYWRkIGJvcmRlcgoJCQlpZiAoIGV4dHJhICE9PSAicGFkZGlu ZyIgKSB7CgkJCQl2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBj c3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgkJ fQoJfQoKCXJldHVybiB2YWw7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQo IGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHBy b3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZh bHVlCgl2YXIgdmFsdWVJc0JvcmRlckJveCA9IHRydWUsCgkJdmFsID0gbmFtZSA9 PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdo dCwKCQlzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSwKCQlpc0JvcmRlckJveCA9 IHN1cHBvcnQuYm94U2l6aW5nICYmIGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXpp bmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IjsKCgkvLyBzb21l IG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdp ZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWQKCS8vIHN2ZyAtIGh0dHBz Oi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NQoJ Ly8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1 Zy5jZ2k/aWQ9NDkxNjY4CglpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkg ewoJCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3Nz IGlmIG5lY2Vzc2FyeQoJCXZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVz ICk7CgkJaWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkgewoJCQl2YWwgPSBl bGVtLnN0eWxlWyBuYW1lIF07CgkJfQoKCQkvLyBDb21wdXRlZCB1bml0IGlzIG5v dCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLgoJCWlmICggcm51bW5vbnB4 LnRlc3QodmFsKSApIHsKCQkJcmV0dXJuIHZhbDsKCQl9CgoJCS8vIHdlIG5lZWQg dGhlIGNoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1 cm5zIHVucmVsaWFibGUgdmFsdWVzCgkJLy8gZm9yIGdldENvbXB1dGVkU3R5bGUg c2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZQoJ CXZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJiAoIHN1cHBvcnQuYm94 U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIG5hbWUgXSAp OwoKCQkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRy YQoJCXZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7Cgl9CgoJLy8gdXNlIHRo ZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxl dmFudCBzdHlsZXMKCXJldHVybiAoIHZhbCArCgkJYXVnbWVudFdpZHRoT3JIZWln aHQoCgkJCWVsZW0sCgkJCW5hbWUsCgkJCWV4dHJhIHx8ICggaXNCb3JkZXJCb3gg PyAiYm9yZGVyIiA6ICJjb250ZW50IiApLAoJCQl2YWx1ZUlzQm9yZGVyQm94LAoJ CQlzdHlsZXMKCQkpCgkpICsgInB4IjsKfQoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBB ZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRl ZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHls ZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVu Y3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsK CQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20g b3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiAp OwoJCQkJCXJldHVybiByZXQgPT09ICIiID8gIjEiIDogcmV0OwoJCQkJfQoJCQl9 CgkJfQoJfSwKCgkvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCAicHgiIHRvIHRo ZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXMKCWNzc051bWJlcjogewoJ CSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQki ZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdl aWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5Ijog dHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lk b3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0s CgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8g Zml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3Nz UHJvcHM6IHsKCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CgkJImZs b2F0Ijogc3VwcG9ydC5jc3NGbG9hdCA/ICJjc3NGbG9hdCIgOiAic3R5bGVGbG9h dCIKCX0sCgoJLy8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEg RE9NIE5vZGUKCXN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4 dHJhICkgewoJCS8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVu dCBub2RlcwoJCWlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBl bGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkgewoJCQlyZXR1cm47 CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhl IHJpZ2h0IG5hbWUKCQl2YXIgcmV0LCB0eXBlLCBob29rcywKCQkJb3JpZ05hbWUg PSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHls ZTsKCgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpR dWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBzdHls ZSwgb3JpZ05hbWUgKSApOwoKCQkvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhl ZCB2ZXJzaW9uCgkJLy8gZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgdmVyc2lv bgoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNz c0hvb2tzWyBvcmlnTmFtZSBdOwoKCQkvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5n IGEgdmFsdWUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCXR5cGUg PSB0eXBlb2YgdmFsdWU7CgoJCQkvLyBjb252ZXJ0IHJlbGF0aXZlIG51bWJlciBz dHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVtYmVycy4gIzczNDUKCQkJ aWYgKCB0eXBlID09PSAic3RyaW5nIiAmJiAocmV0ID0gcnJlbE51bS5leGVjKCB2 YWx1ZSApKSApIHsKCQkJCXZhbHVlID0gKCByZXRbMV0gKyAxICkgKiByZXRbMl0g KyBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICkgKTsKCQkJCS8v IEZpeGVzIGJ1ZyAjOTIzNwoJCQkJdHlwZSA9ICJudW1iZXIiOwoJCQl9CgoJCQkv LyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQu IFNlZTogIzcxMTYKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2 YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2Fz IHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4g Q1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpR dWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CgkJCQl2YWx1ZSArPSAicHgi OwoJCQl9CgoJCQkvLyBGaXhlcyAjODkwOCwgaXQgY2FuIGJlIGRvbmUgbW9yZSBj b3JyZWN0bHkgYnkgc3BlY2lmaW5nIHNldHRlcnMgaW4gY3NzSG9va3MsCgkJCS8v IGJ1dCBpdCB3b3VsZCBtZWFuIHRvIGRlZmluZSBlaWdodCAoZm9yIGV2ZXJ5IHBy b2JsZW1hdGljIHByb3BlcnR5KSBpZGVudGljYWwgZnVuY3Rpb25zCgkJCWlmICgg IXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSAiIiAmJiBuYW1l LmluZGV4T2YoImJhY2tncm91bmQiKSA9PT0gMCApIHsKCQkJCXN0eWxlWyBuYW1l IF0gPSAiaW5oZXJpdCI7CgkJCX0KCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlk ZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNp ZmllZCB2YWx1ZQoJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8 fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0g dW5kZWZpbmVkICkgewoKCQkJCS8vIFN1cHBvcnQ6IElFCgkJCQkvLyBTd2FsbG93 IGVycm9ycyBmcm9tICdpbnZhbGlkJyBDU1MgdmFsdWVzICgjNTUwOSkKCQkJCXRy eSB7CgkJCQkJc3R5bGVbIG5hbWUgXSA9IHZhbHVlOwoJCQkJfSBjYXRjaChlKSB7 fQoJCQl9CgoJCX0gZWxzZSB7CgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQg Z2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhv b2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0s IGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHJl dDsKCQkJfQoKCQkJLy8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9t IHRoZSBzdHlsZSBvYmplY3QKCQkJcmV0dXJuIHN0eWxlWyBuYW1lIF07CgkJfQoJ fSwKCgljc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkg ewoJCXZhciBudW0sIHZhbCwgaG9va3MsCgkJCW9yaWdOYW1lID0galF1ZXJ5LmNh bWVsQ2FzZSggbmFtZSApOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3Jr aW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNzc1Byb3Bz WyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0g dmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTsKCgkJLy8g Z2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbgoJCS8vIGZvbGxvd2Vk IGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NI b29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJ Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVl IGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICkgewoJ CQl2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7CgkJfQoKCQkv LyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUg ZXhpc3RzLCB1c2UgdGhhdAoJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJ CXZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7CgkJfQoKCQkvL2Nv bnZlcnQgIm5vcm1hbCIgdG8gY29tcHV0ZWQgdmFsdWUKCQlpZiAoIHZhbCA9PT0g Im5vcm1hbCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7CgkJCXZh bCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdOwoJCX0KCgkJLy8gUmV0dXJu LCBjb252ZXJ0aW5nIHRvIG51bWJlciBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIg d2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpYwoJCWlmICggZXh0cmEg PT09ICIiIHx8IGV4dHJhICkgewoJCQludW0gPSBwYXJzZUZsb2F0KCB2YWwgKTsK CQkJcmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGpRdWVyeS5pc051bWVyaWMoIG51 bSApID8gbnVtIHx8IDAgOiB2YWw7CgkJfQoJCXJldHVybiB2YWw7Cgl9Cn0pOwoK alF1ZXJ5LmVhY2goWyAiaGVpZ2h0IiwgIndpZHRoIiBdLCBmdW5jdGlvbiggaSwg bmFtZSApIHsKCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewoJCWdldDogZnVu Y3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRl ZCApIHsKCQkJCS8vIGNlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9u IGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbQoJCQkJLy8gaG93ZXZlciwg aXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQg YmVuZWZpdCBmcm9tIHRoaXMKCQkJCXJldHVybiByZGlzcGxheXN3YXAudGVzdCgg alF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICkgKSAmJiBlbGVtLm9mZnNldFdp ZHRoID09PSAwID8KCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVu Y3Rpb24oKSB7CgkJCQkJCXJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBu YW1lLCBleHRyYSApOwoJCQkJCX0pIDoKCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBl bGVtLCBuYW1lLCBleHRyYSApOwoJCQl9CgkJfSwKCgkJc2V0OiBmdW5jdGlvbigg ZWxlbSwgdmFsdWUsIGV4dHJhICkgewoJCQl2YXIgc3R5bGVzID0gZXh0cmEgJiYg Z2V0U3R5bGVzKCBlbGVtICk7CgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlcigg ZWxlbSwgdmFsdWUsIGV4dHJhID8KCQkJCWF1Z21lbnRXaWR0aE9ySGVpZ2h0KAoJ CQkJCWVsZW0sCgkJCQkJbmFtZSwKCQkJCQlleHRyYSwKCQkJCQlzdXBwb3J0LmJv eFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiYm94U2l6aW5nIiwgZmFsc2Us IHN0eWxlcyApID09PSAiYm9yZGVyLWJveCIsCgkJCQkJc3R5bGVzCgkJCQkpIDog MAoJCQkpOwoJCX0KCX07Cn0pOwoKaWYgKCAhc3VwcG9ydC5vcGFjaXR5ICkgewoJ alF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7CgkJZ2V0OiBmdW5jdGlvbiggZWxl bSwgY29tcHV0ZWQgKSB7CgkJCS8vIElFIHVzZXMgZmlsdGVycyBmb3Igb3BhY2l0 eQoJCQlyZXR1cm4gcm9wYWNpdHkudGVzdCggKGNvbXB1dGVkICYmIGVsZW0uY3Vy cmVudFN0eWxlID8gZWxlbS5jdXJyZW50U3R5bGUuZmlsdGVyIDogZWxlbS5zdHls ZS5maWx0ZXIpIHx8ICIiICkgPwoJCQkJKCAwLjAxICogcGFyc2VGbG9hdCggUmVn RXhwLiQxICkgKSArICIiIDoKCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CgkJfSwK CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZSA9 IGVsZW0uc3R5bGUsCgkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHls ZSwKCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOdW1lcmljKCB2YWx1ZSApID8gImFs cGhhKG9wYWNpdHk9IiArIHZhbHVlICogMTAwICsgIikiIDogIiIsCgkJCQlmaWx0 ZXIgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmZpbHRlciB8fCBzdHls ZS5maWx0ZXIgfHwgIiI7CgoJCQkvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNp dHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXQKCQkJLy8gRm9yY2UgaXQgYnkg c2V0dGluZyB0aGUgem9vbSBsZXZlbAoJCQlzdHlsZS56b29tID0gMTsKCgkJCS8v IGlmIHNldHRpbmcgb3BhY2l0eSB0byAxLCBhbmQgbm8gb3RoZXIgZmlsdGVycyBl eGlzdCAtIGF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBhdHRyaWJ1dGUgIzY2NTIK CQkJLy8gaWYgdmFsdWUgPT09ICIiLCB0aGVuIHJlbW92ZSBpbmxpbmUgb3BhY2l0 eSAjMTI2ODUKCQkJaWYgKCAoIHZhbHVlID49IDEgfHwgdmFsdWUgPT09ICIiICkg JiYKCQkJCQlqUXVlcnkudHJpbSggZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgIiIg KSApID09PSAiIiAmJgoJCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSApIHsKCgkJ CQkvLyBTZXR0aW5nIHN0eWxlLmZpbHRlciB0byBudWxsLCAiIiAmICIgIiBzdGls bCBsZWF2ZSAiZmlsdGVyOiIgaW4gdGhlIGNzc1RleHQKCQkJCS8vIGlmICJmaWx0 ZXI6IiBpcyBwcmVzZW50IGF0IGFsbCwgY2xlYXJUeXBlIGlzIGRpc2FibGVkLCB3 ZSB3YW50IHRvIGF2b2lkIHRoaXMKCQkJCS8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0 ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0 aC4uLgoJCQkJc3R5bGUucmVtb3ZlQXR0cmlidXRlKCAiZmlsdGVyIiApOwoKCQkJ CS8vIGlmIHRoZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3Nz IHJ1bGUgb3IgdW5zZXQgaW5saW5lIG9wYWNpdHksIHdlIGFyZSBkb25lCgkJCQlp ZiAoIHZhbHVlID09PSAiIiB8fCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHls ZS5maWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgoJCQkvLyBvdGhl cndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcwoJCQlzdHlsZS5maWx0ZXIgPSBy YWxwaGEudGVzdCggZmlsdGVyICkgPwoJCQkJZmlsdGVyLnJlcGxhY2UoIHJhbHBo YSwgb3BhY2l0eSApIDoKCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CgkJfQoJ fTsKfQoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gYWRkR2V0SG9va0lm KCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQsCglmdW5jdGlvbiggZWxlbSwg Y29tcHV0ZWQgKSB7CgkJaWYgKCBjb21wdXRlZCApIHsKCQkJLy8gV2ViS2l0IEJ1 ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBm b3IgbWFyZ2luLXJpZ2h0CgkJCS8vIFdvcmsgYXJvdW5kIGJ5IHRlbXBvcmFyaWx5 IHNldHRpbmcgZWxlbWVudCBkaXNwbGF5IHRvIGlubGluZS1ibG9jawoJCQlyZXR1 cm4galF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2Nr IiB9LAoJCQkJY3VyQ1NTLCBbIGVsZW0sICJtYXJnaW5SaWdodCIgXSApOwoJCX0K CX0KKTsKCi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhw YW5kIHByb3BlcnRpZXMKalF1ZXJ5LmVhY2goewoJbWFyZ2luOiAiIiwKCXBhZGRp bmc6ICIiLAoJYm9yZGVyOiAiV2lkdGgiCn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1 ZmZpeCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7 CgkJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCXZhciBpID0gMCwKCQkJ CWV4cGFuZGVkID0ge30sCgoJCQkJLy8gYXNzdW1lcyBhIHNpbmdsZSBudW1iZXIg aWYgbm90IGEgc3RyaW5nCgkJCQlwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gInN0 cmluZyIgPyB2YWx1ZS5zcGxpdCgiICIpIDogWyB2YWx1ZSBdOwoKCQkJZm9yICgg OyBpIDwgNDsgaSsrICkgewoJCQkJZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFu ZFsgaSBdICsgc3VmZml4IF0gPQoJCQkJCXBhcnRzWyBpIF0gfHwgcGFydHNbIGkg LSAyIF0gfHwgcGFydHNbIDAgXTsKCQkJfQoKCQkJcmV0dXJuIGV4cGFuZGVkOwoJ CX0KCX07CgoJaWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHsKCQlqUXVl cnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZl TnVtYmVyOwoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJY3NzOiBmdW5jdGlv biggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rp b24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCQl2YXIgc3R5bGVzLCBsZW4sCgkJ CQltYXAgPSB7fSwKCQkJCWkgPSAwOwoKCQkJaWYgKCBqUXVlcnkuaXNBcnJheSgg bmFtZSApICkgewoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7CgkJCQls ZW4gPSBuYW1lLmxlbmd0aDsKCgkJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsK CQkJCQltYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsg aSBdLCBmYWxzZSwgc3R5bGVzICk7CgkJCQl9CgoJCQkJcmV0dXJuIG1hcDsKCQkJ fQoKCQkJcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPwoJCQkJalF1ZXJ5LnN0 eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoKCQkJCWpRdWVyeS5jc3MoIGVsZW0s IG5hbWUgKTsKCQl9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEg KTsKCX0sCglzaG93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2hvd0hpZGUoIHRo aXMsIHRydWUgKTsKCX0sCgloaWRlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2hv d0hpZGUoIHRoaXMgKTsKCX0sCgl0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHsK CQlpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gImJvb2xlYW4iICkgewoJCQlyZXR1cm4g c3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpOwoJCX0KCgkJcmV0dXJu IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbiggdGhpcyAp ICkgewoJCQkJalF1ZXJ5KCB0aGlzICkuc2hvdygpOwoJCQl9IGVsc2UgewoJCQkJ alF1ZXJ5KCB0aGlzICkuaGlkZSgpOwoJCQl9CgkJfSk7Cgl9Cn0pOwoKCmZ1bmN0 aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHsK CXJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMs IHByb3AsIGVuZCwgZWFzaW5nICk7Cn0KalF1ZXJ5LlR3ZWVuID0gVHdlZW47CgpU d2Vlbi5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogVHdlZW4sCglpbml0OiBm dW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQg KSB7CgkJdGhpcy5lbGVtID0gZWxlbTsKCQl0aGlzLnByb3AgPSBwcm9wOwoJCXRo aXMuZWFzaW5nID0gZWFzaW5nIHx8ICJzd2luZyI7CgkJdGhpcy5vcHRpb25zID0g b3B0aW9uczsKCQl0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpOwoJ CXRoaXMuZW5kID0gZW5kOwoJCXRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnku Y3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKTsKCX0sCgljdXI6IGZ1bmN0 aW9uKCkgewoJCXZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9w IF07CgoJCXJldHVybiBob29rcyAmJiBob29rcy5nZXQgPwoJCQlob29rcy5nZXQo IHRoaXMgKSA6CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMg KTsKCX0sCglydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkgewoJCXZhciBlYXNlZCwK CQkJaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlpZiAo IHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9 IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oCgkJCQlwZXJjZW50LCB0aGlz Lm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMu ZHVyYXRpb24KCQkJKTsKCQl9IGVsc2UgewoJCQl0aGlzLnBvcyA9IGVhc2VkID0g cGVyY2VudDsKCQl9CgkJdGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFy dCApICogZWFzZWQgKyB0aGlzLnN0YXJ0OwoKCQlpZiAoIHRoaXMub3B0aW9ucy5z dGVwICkgewoJCQl0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRo aXMubm93LCB0aGlzICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmIGhvb2tzLnNldCAp IHsKCQkJaG9va3Muc2V0KCB0aGlzICk7CgkJfSBlbHNlIHsKCQkJVHdlZW4ucHJv cEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApOwoJCX0KCQlyZXR1cm4gdGhpczsK CX0KfTsKClR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnBy b3RvdHlwZTsKClR3ZWVuLnByb3BIb29rcyA9IHsKCV9kZWZhdWx0OiB7CgkJZ2V0 OiBmdW5jdGlvbiggdHdlZW4gKSB7CgkJCXZhciByZXN1bHQ7CgoJCQlpZiAoIHR3 ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmCgkJCQkoIXR3ZWVuLmVs ZW0uc3R5bGUgfHwgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51 bGwpICkgewoJCQkJcmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTsKCQkJ fQoKCQkJLy8gcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1l dGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5CgkJCS8vIGF0dGVtcHQgYSBw YXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2Ug ZmFpbHMKCQkJLy8gc28sIHNpbXBsZSB2YWx1ZXMgc3VjaCBhcyAiMTBweCIgYXJl IHBhcnNlZCB0byBGbG9hdC4KCQkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAi cm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMuCgkJCXJlc3VsdCA9IGpR dWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsICIiICk7CgkJCS8vIEVt cHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgImF1dG8iIGFyZSBjb252 ZXJ0ZWQgdG8gMC4KCQkJcmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSAiYXV0 byIgPyAwIDogcmVzdWx0OwoJCX0sCgkJc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7 CgkJCS8vIHVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0IC0gdXNlIGNzc0hv b2sgaWYgaXRzIHRoZXJlIC0gdXNlIC5zdHlsZSBpZiBpdHMKCQkJLy8gYXZhaWxh YmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUKCQkJ aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkgewoJCQkJalF1ZXJ5 LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKCQkJfSBlbHNlIGlmICgg dHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5j c3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9v a3NbIHR3ZWVuLnByb3AgXSApICkgewoJCQkJalF1ZXJ5LnN0eWxlKCB0d2Vlbi5l bGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7CgkJCX0g ZWxzZSB7CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7 CgkJCX0KCQl9Cgl9Cn07CgovLyBTdXBwb3J0OiBJRSA8PTkKLy8gUGFuaWMgYmFz ZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5v ZGVzCgpUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tz LnNjcm9sbExlZnQgPSB7CglzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCQlpZiAo IHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkg ewoJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7CgkJfQoJ fQp9OwoKalF1ZXJ5LmVhc2luZyA9IHsKCWxpbmVhcjogZnVuY3Rpb24oIHAgKSB7 CgkJcmV0dXJuIHA7Cgl9LAoJc3dpbmc6IGZ1bmN0aW9uKCBwICkgewoJCXJldHVy biAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7Cgl9Cn07CgpqUXVl cnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsKCi8vIEJhY2sgQ29tcGF0IDwx LjggZXh0ZW5zaW9uIHBvaW50CmpRdWVyeS5meC5zdGVwID0ge307CgoKCgp2YXIK CWZ4Tm93LCB0aW1lcklkLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhp ZGUpJC8sCglyZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/OihbKy1dKT18KSgiICsg cG51bSArICIpKFthLXolXSopJCIsICJpIiApLAoJcnJ1biA9IC9xdWV1ZUhvb2tz JC8sCglhbmltYXRpb25QcmVmaWx0ZXJzID0gWyBkZWZhdWx0UHJlZmlsdGVyIF0s Cgl0d2VlbmVycyA9IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkg ewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSAp LAoJCQkJdGFyZ2V0ID0gdHdlZW4uY3VyKCksCgkJCQlwYXJ0cyA9IHJmeG51bS5l eGVjKCB2YWx1ZSApLAoJCQkJdW5pdCA9IHBhcnRzICYmIHBhcnRzWyAzIF0gfHwg KCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyAiIiA6ICJweCIgKSwKCgkJCQkv LyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90 ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCQkJc3RhcnQgPSAoIGpRdWVyeS5jc3NO dW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICt0YXJnZXQgKSAmJgoJ CQkJCXJmeG51bS5leGVjKCBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCBwcm9wICkg KSwKCQkJCXNjYWxlID0gMSwKCQkJCW1heEl0ZXJhdGlvbnMgPSAyMDsKCgkJCWlm ICggc3RhcnQgJiYgc3RhcnRbIDMgXSAhPT0gdW5pdCApIHsKCQkJCS8vIFRydXN0 IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3MKCQkJCXVuaXQgPSB1bml0IHx8 IHN0YXJ0WyAzIF07CgoJCQkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdl ZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCQkJcGFydHMgPSBwYXJ0cyB8fCBbXTsK CgkJCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBz dGFydGluZyBwb2ludAoJCQkJc3RhcnQgPSArdGFyZ2V0IHx8IDE7CgoJCQkJZG8g ewoJCQkJCS8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3Vi bGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqCgkJCQkJLy8gVXNlIGEgc3RyaW5n IGZvciBkb3VibGluZyBmYWN0b3Igc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHNl ZSBzY2FsZSBhcyB1bmNoYW5nZWQgYmVsb3cKCQkJCQlzY2FsZSA9IHNjYWxlIHx8 ICIuNSI7CgoJCQkJCS8vIEFkanVzdCBhbmQgYXBwbHkKCQkJCQlzdGFydCA9IHN0 YXJ0IC8gc2NhbGU7CgkJCQkJalF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCBwcm9w LCBzdGFydCArIHVuaXQgKTsKCgkJCQkvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRp bmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKQoJCQkJLy8gQW5kIGJyZWFr aW5nIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBv ciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2gKCQkJCX0gd2hpbGUgKCBzY2FsZSAh PT0gKHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQpICYmIHNjYWxlICE9PSAx ICYmIC0tbWF4SXRlcmF0aW9ucyApOwoJCQl9CgoJCQkvLyBVcGRhdGUgdHdlZW4g cHJvcGVydGllcwoJCQlpZiAoIHBhcnRzICkgewoJCQkJc3RhcnQgPSB0d2Vlbi5z dGFydCA9ICtzdGFydCB8fCArdGFyZ2V0IHx8IDA7CgkJCQl0d2Vlbi51bml0ID0g dW5pdDsKCQkJCS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdy ZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvbgoJCQkJdHdlZW4uZW5kID0gcGFy dHNbIDEgXSA/CgkJCQkJc3RhcnQgKyAoIHBhcnRzWyAxIF0gKyAxICkgKiBwYXJ0 c1sgMiBdIDoKCQkJCQkrcGFydHNbIDIgXTsKCQkJfQoKCQkJcmV0dXJuIHR3ZWVu OwoJCX0gXQoJfTsKCi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5 IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7 CglzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCWZ4Tm93ID0gdW5kZWZpbmVkOwoJ fSk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgovLyBHZW5l cmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpm dW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNo LAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSwKCQlpID0gMDsKCgkvLyBpZiB3 ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4 cGFuZCB2YWx1ZXMsCgkvLyBpZiB3ZSBkb24ndCBpbmNsdWRlIHdpZHRoLCBzdGVw IHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0CglpbmNsdWRl V2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDsKCWZvciAoIDsgaSA8IDQgOyBp ICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkg XTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5n IiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJ CWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJu IGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFu aW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCB0d2VlbmVy c1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKCQlp bmRleCA9IDAsCgkJbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7Cglmb3IgKCA7 IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewoJCWlmICggKHR3ZWVuID0gY29s bGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkp ICkgewoKCQkJLy8gd2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHkKCQkJcmV0 dXJuIHR3ZWVuOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlcigg ZWxlbSwgcHJvcHMsIG9wdHMgKSB7CgkvKiBqc2hpbnQgdmFsaWR0aGlzOiB0cnVl ICovCgl2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgdHdlZW4sIGhvb2tzLCBvbGRm aXJlLCBkaXNwbGF5LCBjaGVja0Rpc3BsYXksCgkJYW5pbSA9IHRoaXMsCgkJb3Jp ZyA9IHt9LAoJCXN0eWxlID0gZWxlbS5zdHlsZSwKCQloaWRkZW4gPSBlbGVtLm5v ZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksCgkJZGF0YVNob3cgPSBqUXVlcnku X2RhdGEoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gaGFuZGxlIHF1ZXVlOiBmYWxz ZSBwcm9taXNlcwoJaWYgKCAhb3B0cy5xdWV1ZSApIHsKCQlob29rcyA9IGpRdWVy eS5fcXVldWVIb29rcyggZWxlbSwgImZ4IiApOwoJCWlmICggaG9va3MudW5xdWV1 ZWQgPT0gbnVsbCApIHsKCQkJaG9va3MudW5xdWV1ZWQgPSAwOwoJCQlvbGRmaXJl ID0gaG9va3MuZW1wdHkuZmlyZTsKCQkJaG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0 aW9uKCkgewoJCQkJaWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7CgkJCQkJb2xkZmly ZSgpOwoJCQkJfQoJCQl9OwoJCX0KCQlob29rcy51bnF1ZXVlZCsrOwoKCQlhbmlt LmFsd2F5cyhmdW5jdGlvbigpIHsKCQkJLy8gZG9pbmcgdGhpcyBtYWtlcyBzdXJl IHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQKCQkJLy8g YmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkg ewoJCQkJaG9va3MudW5xdWV1ZWQtLTsKCQkJCWlmICggIWpRdWVyeS5xdWV1ZSgg ZWxlbSwgImZ4IiApLmxlbmd0aCApIHsKCQkJCQlob29rcy5lbXB0eS5maXJlKCk7 CgkJCQl9CgkJCX0pOwoJCX0pOwoJfQoKCS8vIGhlaWdodC93aWR0aCBvdmVyZmxv dyBwYXNzCglpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCAiaGVpZ2h0IiBp biBwcm9wcyB8fCAid2lkdGgiIGluIHByb3BzICkgKSB7CgkJLy8gTWFrZSBzdXJl IHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CgkJLy8gUmVjb3JkIGFsbCAzIG92ZXJm bG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdAoJCS8vIGNoYW5nZSB0 aGUgb3ZlcmZsb3cgYXR0cmlidXRlIHdoZW4gb3ZlcmZsb3dYIGFuZAoJCS8vIG92 ZXJmbG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlCgkJb3B0cy5vdmVyZmxv dyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3Zl cmZsb3dZIF07CgoJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1i bG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUg ZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZAoJ CWRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKTsKCgkJLy8g VGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgIm5v bmUiCgkJY2hlY2tEaXNwbGF5ID0gZGlzcGxheSA9PT0gIm5vbmUiID8KCQkJalF1 ZXJ5Ll9kYXRhKCBlbGVtLCAib2xkZGlzcGxheSIgKSB8fCBkZWZhdWx0RGlzcGxh eSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheTsKCgkJaWYgKCBjaGVja0Rpc3Bs YXkgPT09ICJpbmxpbmUiICYmIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9 PT0gIm5vbmUiICkgewoKCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2Vw dCBpbmxpbmUtYmxvY2s7CgkJCS8vIGJsb2NrLWxldmVsIGVsZW1lbnRzIG5lZWQg dG8gYmUgaW5saW5lIHdpdGggbGF5b3V0CgkJCWlmICggIXN1cHBvcnQuaW5saW5l QmxvY2tOZWVkc0xheW91dCB8fCBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFt ZSApID09PSAiaW5saW5lIiApIHsKCQkJCXN0eWxlLmRpc3BsYXkgPSAiaW5saW5l LWJsb2NrIjsKCQkJfSBlbHNlIHsKCQkJCXN0eWxlLnpvb20gPSAxOwoJCQl9CgkJ fQoJfQoKCWlmICggb3B0cy5vdmVyZmxvdyApIHsKCQlzdHlsZS5vdmVyZmxvdyA9 ICJoaWRkZW4iOwoJCWlmICggIXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcygpICkg ewoJCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKCQkJCXN0eWxlLm92ZXJmbG93 ID0gb3B0cy5vdmVyZmxvd1sgMCBdOwoJCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0 cy5vdmVyZmxvd1sgMSBdOwoJCQkJc3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVy Zmxvd1sgMiBdOwoJCQl9KTsKCQl9Cgl9CgoJLy8gc2hvdy9oaWRlIHBhc3MKCWZv ciAoIHByb3AgaW4gcHJvcHMgKSB7CgkJdmFsdWUgPSBwcm9wc1sgcHJvcCBdOwoJ CWlmICggcmZ4dHlwZXMuZXhlYyggdmFsdWUgKSApIHsKCQkJZGVsZXRlIHByb3Bz WyBwcm9wIF07CgkJCXRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gInRvZ2ds ZSI7CgkJCWlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhpZGUiIDogInNob3ci ICkgKSB7CgoJCQkJLy8gSWYgdGhlcmUgaXMgZGF0YVNob3cgbGVmdCBvdmVyIGZy b20gYSBzdG9wcGVkIGhpZGUgb3Igc2hvdyBhbmQgd2UgYXJlIGdvaW5nIHRvIHBy b2NlZWQgd2l0aCBzaG93LCB3ZSBzaG91bGQgcHJldGVuZCB0byBiZSBoaWRkZW4K CQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hv d1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsK CQkJCX0gZWxzZSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0KCQkJb3JpZ1sg cHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnku c3R5bGUoIGVsZW0sIHByb3AgKTsKCgkJLy8gQW55IG5vbi1meCB2YWx1ZSBzdG9w cyB1cyBmcm9tIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZQoJ CX0gZWxzZSB7CgkJCWRpc3BsYXkgPSB1bmRlZmluZWQ7CgkJfQoJfQoKCWlmICgg IWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7CgkJaWYgKCBkYXRhU2hv dyApIHsKCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCWhpZGRl biA9IGRhdGFTaG93LmhpZGRlbjsKCQkJfQoJCX0gZWxzZSB7CgkJCWRhdGFTaG93 ID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCAiZnhzaG93Iiwge30gKTsKCQl9CgoJCS8v IHN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9n Z2xlKCkgdG8gInJldmVyc2UiCgkJaWYgKCB0b2dnbGUgKSB7CgkJCWRhdGFTaG93 LmhpZGRlbiA9ICFoaWRkZW47CgkJfQoJCWlmICggaGlkZGVuICkgewoJCQlqUXVl cnkoIGVsZW0gKS5zaG93KCk7CgkJfSBlbHNlIHsKCQkJYW5pbS5kb25lKGZ1bmN0 aW9uKCkgewoJCQkJalF1ZXJ5KCBlbGVtICkuaGlkZSgpOwoJCQl9KTsKCQl9CgkJ YW5pbS5kb25lKGZ1bmN0aW9uKCkgewoJCQl2YXIgcHJvcDsKCQkJalF1ZXJ5Ll9y ZW1vdmVEYXRhKCBlbGVtLCAiZnhzaG93IiApOwoJCQlmb3IgKCBwcm9wIGluIG9y aWcgKSB7CgkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3Ag XSApOwoJCQl9CgkJfSk7CgkJZm9yICggcHJvcCBpbiBvcmlnICkgewoJCQl0d2Vl biA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwg cHJvcCwgYW5pbSApOwoKCQkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7 CgkJCQlkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7CgkJCQlpZiAoIGhp ZGRlbiApIHsKCQkJCQl0d2Vlbi5lbmQgPSB0d2Vlbi5zdGFydDsKCQkJCQl0d2Vl bi5zdGFydCA9IHByb3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdodCIg PyAxIDogMDsKCQkJCX0KCQkJfQoJCX0KCgkvLyBJZiB0aGlzIGlzIGEgbm9vcCBs aWtlIC5oaWRlKCkuaGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3Bs YXkgdmFsdWUKCX0gZWxzZSBpZiAoIChkaXNwbGF5ID09PSAibm9uZSIgPyBkZWZh dWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheSkgPT09ICJpbmxp bmUiICkgewoJCXN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5OwoJfQp9CgpmdW5jdGlv biBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHsKCXZhciBpbmRl eCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7CgoJLy8gY2FtZWxDYXNlLCBz cGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzCglmb3IgKCBpbmRl eCBpbiBwcm9wcyApIHsKCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggaW5kZXgg KTsKCQllYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07CgkJdmFsdWUgPSBw cm9wc1sgaW5kZXggXTsKCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkg ewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRl eCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7 CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRl eCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlp ZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhv b2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJ CQkvLyBub3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29udCBvdmVyd3JpdGUga2V5 cyBhbHJlYWR5IHByZXNlbnQuCgkJCS8vIGFsc28gLSByZXVzaW5nICdpbmRleCcg ZnJvbSBhYm92ZSBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJ CWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBw cm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07 CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJ fQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsK CQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywg b3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAs CgkJbGVuZ3RoID0gYW5pbWF0aW9uUHJlZmlsdGVycy5sZW5ndGgsCgkJZGVmZXJy ZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQkv LyBkb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3IKCQkJ ZGVsZXRlIHRpY2suZWxlbTsKCQl9KSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJ CWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIg Y3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWlu aW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRp b24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoJCQkJLy8gYXJjaGFpYyBjcmFz aCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIDEgLSAoIDAuNSB8fCAwICkgKCMx MjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24g fHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJ CWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBp bmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CgkJCQlhbmltYXRpb24udHdlZW5z WyBpbmRleCBdLnJ1biggcGVyY2VudCApOwoJCQl9CgoJCQlkZWZlcnJlZC5ub3Rp ZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0p OwoKCQkJaWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7CgkJCQlyZXR1cm4g cmVtYWluaW5nOwoJCQl9IGVsc2UgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgo IGVsZW0sIFsgYW5pbWF0aW9uIF0gKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJ CX0sCgkJYW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSh7CgkJCWVsZW06IGVs ZW0sCgkJCXByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLAoJ CQlvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7IHNwZWNpYWxFYXNpbmc6IHt9 IH0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVz LAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhO b3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRp b24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJv cCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBh bmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5z cGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7 CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4g dHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJ dmFyIGluZGV4ID0gMCwKCQkJCQkvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVu ZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnMKCQkJCQkvLyBvdGhlcndp c2Ugd2Ugc2tpcCB0aGlzIHBhcnQKCQkJCQlsZW5ndGggPSBnb3RvRW5kID8gYW5p bWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwOwoJCQkJaWYgKCBzdG9wcGVkICkgewoJ CQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQkJc3RvcHBlZCA9IHRydWU7CgkJCQlm b3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRp b24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIHJlc29s dmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKCQkJCS8vIG90aGVyd2lz ZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQucmVz b2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0g ZWxzZSB7CgkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRp b24sIGdvdG9FbmQgXSApOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQl9 KSwKCQlwcm9wcyA9IGFuaW1hdGlvbi5wcm9wczsKCglwcm9wRmlsdGVyKCBwcm9w cywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOwoKCWZvciAoIDsgaW5k ZXggPCBsZW5ndGggOyBpbmRleCsrICkgewoJCXJlc3VsdCA9IGFuaW1hdGlvblBy ZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywg YW5pbWF0aW9uLm9wdHMgKTsKCQlpZiAoIHJlc3VsdCApIHsKCQkJcmV0dXJuIHJl c3VsdDsKCQl9Cgl9CgoJalF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBh bmltYXRpb24gKTsKCglpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24u b3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVs ZW0sIGFuaW1hdGlvbiApOwoJfQoKCWpRdWVyeS5meC50aW1lcigKCQlqUXVlcnku ZXh0ZW5kKCB0aWNrLCB7CgkJCWVsZW06IGVsZW0sCgkJCWFuaW06IGFuaW1hdGlv biwKCQkJcXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlCgkJfSkKCSk7CgoJLy8g YXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnMKCXJldHVybiBhbmltYXRpb24u cHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5p bWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5m YWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24u b3B0cy5hbHdheXMgKTsKfQoKalF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRl bmQoIEFuaW1hdGlvbiwgewoJdHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxs YmFjayApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcm9wcyApICkgewoJ CQljYWxsYmFjayA9IHByb3BzOwoJCQlwcm9wcyA9IFsgIioiIF07CgkJfSBlbHNl IHsKCQkJcHJvcHMgPSBwcm9wcy5zcGxpdCgiICIpOwoJCX0KCgkJdmFyIHByb3As CgkJCWluZGV4ID0gMCwKCQkJbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwoKCQlmb3Ig KCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3Bz WyBpbmRleCBdOwoJCQl0d2VlbmVyc1sgcHJvcCBdID0gdHdlZW5lcnNbIHByb3Ag XSB8fCBbXTsKCQkJdHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayAp OwoJCX0KCX0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBl bmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlhbmltYXRpb25QcmVmaWx0ZXJz LnVuc2hpZnQoIGNhbGxiYWNrICk7CgkJfSBlbHNlIHsKCQkJYW5pbWF0aW9uUHJl ZmlsdGVycy5wdXNoKCBjYWxsYmFjayApOwoJCX0KCX0KfSk7CgpqUXVlcnkuc3Bl ZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0g c3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRl bmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFz aW5nIHx8CgkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLAoJ CWR1cmF0aW9uOiBzcGVlZCwKCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNp bmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmcKCX07 CgoJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0 LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJb3B0LmR1 cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgPyBqUXVlcnkuZnguc3BlZWRzWyBv cHQuZHVyYXRpb24gXSA6IGpRdWVyeS5meC5zcGVlZHMuX2RlZmF1bHQ7CgoJLy8g bm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gImZ4 IgoJaWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUg KSB7CgkJb3B0LnF1ZXVlID0gImZ4IjsKCX0KCgkvLyBRdWV1ZWluZwoJb3B0Lm9s ZCA9IG9wdC5jb21wbGV0ZTsKCglvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHsK CQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7CgkJCW9wdC5v bGQuY2FsbCggdGhpcyApOwoJCX0KCgkJaWYgKCBvcHQucXVldWUgKSB7CgkJCWpR dWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTsKCQl9Cgl9OwoKCXJldHVy biBvcHQ7Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZhZGVUbzogZnVuY3Rpb24o IHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHsKCgkJLy8gc2hvdyBhbnkg aGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwCgkJcmV0 dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggIm9wYWNpdHkiLCAwICku c2hvdygpCgoJCQkvLyBhbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJ LmVuZCgpLmFuaW1hdGUoeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBj YWxsYmFjayApOwoJfSwKCWFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwg ZWFzaW5nLCBjYWxsYmFjayApIHsKCQl2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0 eU9iamVjdCggcHJvcCApLAoJCQlvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVk LCBlYXNpbmcsIGNhbGxiYWNrICksCgkJCWRvQW5pbWF0aW9uID0gZnVuY3Rpb24o KSB7CgkJCQkvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9w ZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdAoJCQkJdmFyIGFuaW0gPSBBbmltYXRp b24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApOwoK CQkJCS8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBp bW1lZGlhdGVseQoJCQkJaWYgKCBlbXB0eSB8fCBqUXVlcnkuX2RhdGEoIHRoaXMs ICJmaW5pc2giICkgKSB7CgkJCQkJYW5pbS5zdG9wKCB0cnVlICk7CgkJCQl9CgkJ CX07CgkJCWRvQW5pbWF0aW9uLmZpbmlzaCA9IGRvQW5pbWF0aW9uOwoKCQlyZXR1 cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/CgkJCXRoaXMuZWFj aCggZG9BbmltYXRpb24gKSA6CgkJCXRoaXMucXVldWUoIG9wdGFsbC5xdWV1ZSwg ZG9BbmltYXRpb24gKTsKCX0sCglzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJR dWV1ZSwgZ290b0VuZCApIHsKCQl2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhv b2tzICkgewoJCQl2YXIgc3RvcCA9IGhvb2tzLnN0b3A7CgkJCWRlbGV0ZSBob29r cy5zdG9wOwoJCQlzdG9wKCBnb3RvRW5kICk7CgkJfTsKCgkJaWYgKCB0eXBlb2Yg dHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWdvdG9FbmQgPSBjbGVhclF1ZXVlOwoJ CQljbGVhclF1ZXVlID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJ aWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNlICkgewoJCQl0aGlzLnF1 ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNo KGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9 IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJz ID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMg KTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYg ZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5k ZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0 YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5z dG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBk YXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRl eCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNb IGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiAodHlwZSA9PSBudWxsIHx8IHRpbWVy c1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSkgKSB7CgkJCQkJdGltZXJzWyBpbmRl eCBdLmFuaW0uc3RvcCggZ290b0VuZCApOwoJCQkJCWRlcXVldWUgPSBmYWxzZTsK CQkJCQl0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApOwoJCQkJfQoJCQl9CgoJCQkv LyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3 YXNuJ3QgZm9yY2VkCgkJCS8vIHRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRo ZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2ggd2lsbCBkZXF1ZXVlCgkJCS8v IGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kCgkJCWlmICggZGVxdWV1ZSB8 fCAhZ290b0VuZCApIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7 CgkJCX0KCQl9KTsKCX0sCglmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkgewoJCWlm ICggdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgkJ fQoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwK CQkJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0 YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJx dWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxl bmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIGVuYWJsZSBm aW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0 cnVlOwoKCQkJLy8gZW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1 ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3Rv cCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJ CQkvLyBsb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2gg dGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkg ewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1l cnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRl eCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4 LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIGxvb2sgZm9yIGFueSBhbmltYXRpb25z IGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4 ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVl WyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1 ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkv LyB0dXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7 CgkJfSk7Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goWyAidG9nZ2xlIiwgInNob3ciLCAi aGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVl cnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNw ZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxs IHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHko IHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFt ZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7Cgov LyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCmpRdWVy eS5lYWNoKHsKCXNsaWRlRG93bjogZ2VuRngoInNob3ciKSwKCXNsaWRlVXA6IGdl bkZ4KCJoaWRlIiksCglzbGlkZVRvZ2dsZTogZ2VuRngoInRvZ2dsZSIpLAoJZmFk ZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAoJZmFkZU91dDogeyBvcGFjaXR5OiAi aGlkZSIgfSwKCWZhZGVUb2dnbGU6IHsgb3BhY2l0eTogInRvZ2dsZSIgfQp9LCBm dW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1 bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhp cy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX07 Cn0pOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0 aW9uKCkgewoJdmFyIHRpbWVyLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnMsCgkJ aSA9IDA7CgoJZnhOb3cgPSBqUXVlcnkubm93KCk7CgoJZm9yICggOyBpIDwgdGlt ZXJzLmxlbmd0aDsgaSsrICkgewoJCXRpbWVyID0gdGltZXJzWyBpIF07CgkJLy8g Q2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkCgkJ aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRp bWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVu Z3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5l ZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpR dWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWlmICggdGltZXIoKSApIHsKCQlq UXVlcnkuZnguc3RhcnQoKTsKCX0gZWxzZSB7CgkJalF1ZXJ5LnRpbWVycy5wb3Ao KTsKCX0KfTsKCmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzOwoKalF1ZXJ5LmZ4LnN0 YXJ0ID0gZnVuY3Rpb24oKSB7CglpZiAoICF0aW1lcklkICkgewoJCXRpbWVySWQg PSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZh bCApOwoJfQp9OwoKalF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHsKCWNsZWFy SW50ZXJ2YWwoIHRpbWVySWQgKTsKCXRpbWVySWQgPSBudWxsOwp9OwoKalF1ZXJ5 LmZ4LnNwZWVkcyA9IHsKCXNsb3c6IDYwMCwKCWZhc3Q6IDIwMCwKCS8vIERlZmF1 bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhl IHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0 dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1k ZWxheS8KalF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7 Cgl0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8 IHRpbWUgOiB0aW1lOwoJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCglyZXR1cm4gdGhp cy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgewoJCXZhciB0 aW1lb3V0ID0gc2V0VGltZW91dCggbmV4dCwgdGltZSApOwoJCWhvb2tzLnN0b3Ag PSBmdW5jdGlvbigpIHsKCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsK CX0pOwp9OwoKCihmdW5jdGlvbigpIHsKCS8vIE1pbmlmaWVkOiB2YXIgYSxiLGMs ZCxlCgl2YXIgaW5wdXQsIGRpdiwgc2VsZWN0LCBhLCBvcHQ7CgoJLy8gU2V0dXAK CWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CglkaXYuc2V0 QXR0cmlidXRlKCAiY2xhc3NOYW1lIiwgInQiICk7CglkaXYuaW5uZXJIVE1MID0g IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1 dCB0eXBlPSdjaGVja2JveCcvPiI7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdO YW1lKCJhIilbIDAgXTsKCgkvLyBGaXJzdCBiYXRjaCBvZiB0ZXN0cy4KCXNlbGVj dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwoJb3B0ID0gc2Vs ZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24i KSApOwoJaW5wdXQgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iilb IDAgXTsKCglhLnN0eWxlLmNzc1RleHQgPSAidG9wOjFweCI7CgoJLy8gVGVzdCBz ZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNsYXNzLiBJZiBpdCB3b3Jrcywgd2Ug bmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0cmlidXRlIChpZTYv NykKCXN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlID0gZGl2LmNsYXNzTmFtZSAhPT0g InQiOwoKCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRy aWJ1dGUKCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpCglzdXBwb3J0LnN0 eWxlID0gL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKTsKCgkv LyBNYWtlIHN1cmUgdGhhdCBVUkxzIGFyZW4ndCBtYW5pcHVsYXRlZAoJLy8gKElF IG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVsdCkKCXN1cHBvcnQuaHJlZk5vcm1hbGl6 ZWQgPSBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiL2EiOwoKCS8vIENoZWNr IHRoZSBkZWZhdWx0IGNoZWNrYm94L3JhZGlvIHZhbHVlICgiIiBvbiBXZWJLaXQ7 ICJvbiIgZWxzZXdoZXJlKQoJc3VwcG9ydC5jaGVja09uID0gISFpbnB1dC52YWx1 ZTsKCgkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0 aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuCgkvLyAoV2ViS2l0 IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBp dCdzIGluIGFuIG9wdGdyb3VwKQoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5z ZWxlY3RlZDsKCgkvLyBUZXN0cyBmb3IgZW5jdHlwZSBzdXBwb3J0IG9uIGEgZm9y bSAoIzY3NDMpCglzdXBwb3J0LmVuY3R5cGUgPSAhIWRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoImZvcm0iKS5lbmN0eXBlOwoKCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBv cHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMg ZGlzYWJsZWQKCS8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaXNhYmxlZCkKCXNl bGVjdC5kaXNhYmxlZCA9IHRydWU7CglzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9w dC5kaXNhYmxlZDsKCgkvLyBTdXBwb3J0OiBJRTggb25seQoJLy8gQ2hlY2sgaWYg d2UgY2FuIHRydXN0IGdldEF0dHJpYnV0ZSgidmFsdWUiKQoJaW5wdXQgPSBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCAiaW5wdXQiICk7CglpbnB1dC5zZXRBdHRyaWJ1 dGUoICJ2YWx1ZSIsICIiICk7CglzdXBwb3J0LmlucHV0ID0gaW5wdXQuZ2V0QXR0 cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwoKCS8vIENoZWNrIGlmIGFuIGlucHV0 IG1haW50YWlucyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpbwoJaW5w dXQudmFsdWUgPSAidCI7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJh ZGlvIiApOwoJc3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09ICJ0 IjsKfSkoKTsKCgp2YXIgcnJldHVybiA9IC9cci9nOwoKalF1ZXJ5LmZuLmV4dGVu ZCh7Cgl2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgaG9va3MsIHJldCwg aXNGdW5jdGlvbiwKCQkJZWxlbSA9IHRoaXNbMF07CgoJCWlmICggIWFyZ3VtZW50 cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5 LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIGVsZW0u bm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwoKCQkJCWlmICggaG9va3MgJiYgImdl dCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgInZhbHVlIiAp KSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJ cmV0ID0gZWxlbS52YWx1ZTsKCgkJCQlyZXR1cm4gdHlwZW9mIHJldCA9PT0gInN0 cmluZyIgPwoJCQkJCS8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMK CQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOgoJCQkJCS8vIGhhbmRsZSBj YXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlcgoJCQkJCXJl dCA9PSBudWxsID8gIiIgOiByZXQ7CgkJCX0KCgkJCXJldHVybjsKCQl9CgoJCWlz RnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkJcmV0dXJu IHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICgg dGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYg KCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwg alF1ZXJ5KCB0aGlzICkudmFsKCkgKTsKCQkJfSBlbHNlIHsKCQkJCXZhbCA9IHZh bHVlOwoJCQl9CgoJCQkvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyAiIjsgY29u dmVydCBudW1iZXJzIHRvIHN0cmluZwoJCQlpZiAoIHZhbCA9PSBudWxsICkgewoJ CQkJdmFsID0gIiI7CgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1i ZXIiICkgewoJCQkJdmFsICs9ICIiOwoJCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNB cnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0 aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDog dmFsdWUgKyAiIjsKCQkJCX0pOwoJCQl9CgoJCQlob29rcyA9IGpRdWVyeS52YWxI b29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVO YW1lLnRvTG93ZXJDYXNlKCkgXTsKCgkJCS8vIElmIHNldCByZXR1cm5zIHVuZGVm aW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nCgkJCWlmICggIWhvb2tz IHx8ICEoInNldCIgaW4gaG9va3MpIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAi dmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7 CgkJCX0KCQl9KTsKCX0KfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCXZhbEhvb2tzOiB7 CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIg dmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgInZhbHVlIiApOwoJCQkJcmV0 dXJuIHZhbCAhPSBudWxsID8KCQkJCQl2YWwgOgoJCQkJCS8vIFN1cHBvcnQ6IElF MTAtMTErCgkJCQkJLy8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMx NDY4NiwgIzE0ODU4KQoJCQkJCWpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxl bSApICk7CgkJCX0KCQl9LAoJCXNlbGVjdDogewoJCQlnZXQ6IGZ1bmN0aW9uKCBl bGVtICkgewoJCQkJdmFyIHZhbHVlLCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVs ZW0ub3B0aW9ucywKCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKCQkJ CQlvbmUgPSBlbGVtLnR5cGUgPT09ICJzZWxlY3Qtb25lIiB8fCBpbmRleCA8IDAs CgkJCQkJdmFsdWVzID0gb25lID8gbnVsbCA6IFtdLAoJCQkJCW1heCA9IG9uZSA/ IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoLAoJCQkJCWkgPSBpbmRleCA8IDAg PwoJCQkJCQltYXggOgoJCQkJCQlvbmUgPyBpbmRleCA6IDA7CgoJCQkJLy8gTG9v cCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9ucwoJCQkJZm9yICggOyBp IDwgbWF4OyBpKysgKSB7CgkJCQkJb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJ CQkvLyBvbGRJRSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJl c2V0ICgjMjU1MSkKCQkJCQlpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09 IGluZGV4ICkgJiYKCQkJCQkJCS8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQg YXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJCQkJCSgg c3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24u Z2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpID09PSBudWxsICkgJiYKCQkJCQkJCSgg IW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUo IG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8v IEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFs dWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3Qg bmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7 CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNl bGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSAp OwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0 OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBv cHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMg PSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxl bmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25z WyBpIF07CgoJCQkJCWlmICggalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29r cy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPj0gMCApIHsKCgkJCQkJ CS8vIFN1cHBvcnQ6IElFNgoJCQkJCQkvLyBXaGVuIG5ldyBvcHRpb24gZWxlbWVu dCBpcyBhZGRlZCB0byBzZWxlY3QgYm94IHdlIG5lZWQgdG8KCQkJCQkJLy8gZm9y Y2UgcmVmbG93IG9mIG5ld2x5IGFkZGVkIG5vZGUgaW4gb3JkZXIgdG8gd29ya2Fy b3VuZCBkZWxheQoJCQkJCQkvLyBvZiBpbml0aWFsaXphdGlvbiBwcm9wZXJ0aWVz CgkJCQkJCXRyeSB7CgkJCQkJCQlvcHRpb24uc2VsZWN0ZWQgPSBvcHRpb25TZXQg PSB0cnVlOwoKCQkJCQkJfSBjYXRjaCAoIF8gKSB7CgoJCQkJCQkJLy8gV2lsbCBi ZSBleGVjdXRlZCBvbmx5IGluIElFNgoJCQkJCQkJb3B0aW9uLnNjcm9sbEhlaWdo dDsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoJCQkJCQlvcHRpb24uc2VsZWN0ZWQg PSBmYWxzZTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gRm9yY2UgYnJvd3NlcnMgdG8g YmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBz ZXQKCQkJCWlmICggIW9wdGlvblNldCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5k ZXggPSAtMTsKCQkJCX0KCgkJCQlyZXR1cm4gb3B0aW9uczsKCQkJfQoJCX0KCX0K fSk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVl cnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7Cglq UXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVt LCB2YWx1ZSApIHsKCQkJaWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHsK CQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVl cnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCApOwoJCQl9CgkJfQoJfTsKCWlm ICggIXN1cHBvcnQuY2hlY2tPbiApIHsKCQlqUXVlcnkudmFsSG9va3NbIHRoaXMg XS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gU3VwcG9ydDogV2Via2l0 CgkJCS8vICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVl IGlzbid0IHNwZWNpZmllZAoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoInZh bHVlIikgPT09IG51bGwgPyAib24iIDogZWxlbS52YWx1ZTsKCQl9OwoJfQp9KTsK CgoKCnZhciBub2RlSG9vaywgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5 LmV4cHIuYXR0ckhhbmRsZSwKCXJ1c2VEZWZhdWx0ID0gL14oPzpjaGVja2VkfHNl bGVjdGVkKSQvaSwKCWdldFNldEF0dHJpYnV0ZSA9IHN1cHBvcnQuZ2V0U2V0QXR0 cmlidXRlLAoJZ2V0U2V0SW5wdXQgPSBzdXBwb3J0LmlucHV0OwoKalF1ZXJ5LmZu LmV4dGVuZCh7CglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0 dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1 bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbigg bmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVl cnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0pOwoJfQp9KTsKCmpRdWVy eS5leHRlbmQoewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkg ewoJCXZhciBob29rcywgcmV0LAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJ CS8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFu ZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoICFlbGVtIHx8IG5UeXBlID09PSAzIHx8 IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoK CQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1 cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBzdHJ1 bmRlZmluZWQgKSB7CgkJCXJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwg dmFsdWUgKTsKCQl9CgoJCS8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2UK CQkvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkCgkJaWYg KCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgkJ CW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgkJCWhvb2tzID0galF1ZXJ5LmF0 dHJIb29rc1sgbmFtZSBdIHx8CgkJCQkoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wu dGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOwoJCX0KCgkJaWYg KCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVs bCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgoJCQl9 IGVsc2UgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9v a3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewoJ CQkJcmV0dXJuIHJldDsKCgkJCX0gZWxzZSB7CgkJCQllbGVtLnNldEF0dHJpYnV0 ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQkJcmV0dXJuIHZhbHVlOwoJCQl9CgoJ CX0gZWxzZSBpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBo b29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCXJldHVybiBy ZXQ7CgoJCX0gZWxzZSB7CgkJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0s IG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBu dWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiByZXQgPT0g bnVsbCA/CgkJCQl1bmRlZmluZWQgOgoJCQkJcmV0OwoJCX0KCX0sCgoJcmVtb3Zl QXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLCBwcm9w TmFtZSwKCQkJaSA9IDAsCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1h dGNoKCBybm90d2hpdGUgKTsKCgkJaWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2Rl VHlwZSA9PT0gMSApIHsKCQkJd2hpbGUgKCAobmFtZSA9IGF0dHJOYW1lc1tpKytd KSApIHsKCQkJCXByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBu YW1lOwoKCQkJCS8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVh dG1lbnQgKCMxMDg3MCkKCQkJCWlmICggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50 ZXN0KCBuYW1lICkgKSB7CgkJCQkJLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVy dHkgdG8gZmFsc2UKCQkJCQlpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJp YnV0ZSB8fCAhcnVzZURlZmF1bHQudGVzdCggbmFtZSApICkgewoJCQkJCQllbGVt WyBwcm9wTmFtZSBdID0gZmFsc2U7CgkJCQkJLy8gU3VwcG9ydDogSUU8OQoJCQkJ CS8vIEFsc28gY2xlYXIgZGVmYXVsdENoZWNrZWQvZGVmYXVsdFNlbGVjdGVkIChp ZiBhcHByb3ByaWF0ZSkKCQkJCQl9IGVsc2UgewoJCQkJCQllbGVtWyBqUXVlcnku Y2FtZWxDYXNlKCAiZGVmYXVsdC0iICsgbmFtZSApIF0gPQoJCQkJCQkJZWxlbVsg cHJvcE5hbWUgXSA9IGZhbHNlOwoJCQkJCX0KCgkJCQkvLyBTZWUgIzk2OTkgZm9y IGV4cGxhbmF0aW9uIG9mIHRoaXMgYXBwcm9hY2ggKHNldHRpbmcgZmlyc3QsIHRo ZW4gcmVtb3ZhbCkKCQkJCX0gZWxzZSB7CgkJCQkJalF1ZXJ5LmF0dHIoIGVsZW0s IG5hbWUsICIiICk7CgkJCQl9CgoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdl dFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApOwoJCQl9CgkJfQoJfSwK CglhdHRySG9va3M6IHsKCQl0eXBlOiB7CgkJCXNldDogZnVuY3Rpb24oIGVsZW0s IHZhbHVlICkgewoJCQkJaWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVl ID09PSAicmFkaW8iICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAiaW5wdXQiKSAp IHsKCQkJCQkvLyBTZXR0aW5nIHRoZSB0eXBlIG9uIGEgcmFkaW8gYnV0dG9uIGFm dGVyIHRoZSB2YWx1ZSByZXNldHMgdGhlIHZhbHVlIGluIElFNi05CgkJCQkJLy8g UmVzZXQgdmFsdWUgdG8gZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVy IHZhbHVlIGR1cmluZyBjcmVhdGlvbgoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVl OwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJ aWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJ CXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KfSk7CgovLyBIb29rIGZv ciBib29sZWFuIGF0dHJpYnV0ZXMKYm9vbEhvb2sgPSB7CglzZXQ6IGZ1bmN0aW9u KCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSAp IHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBm YWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxz ZSBpZiAoIGdldFNldElucHV0ICYmIGdldFNldEF0dHJpYnV0ZSB8fCAhcnVzZURl ZmF1bHQudGVzdCggbmFtZSApICkgewoJCQkvLyBJRTw4IG5lZWRzIHRoZSAqcHJv cGVydHkqIG5hbWUKCQkJZWxlbS5zZXRBdHRyaWJ1dGUoICFnZXRTZXRBdHRyaWJ1 dGUgJiYgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lLCBuYW1lICk7CgoJ CS8vIFVzZSBkZWZhdWx0Q2hlY2tlZCBhbmQgZGVmYXVsdFNlbGVjdGVkIGZvciBv bGRJRQoJCX0gZWxzZSB7CgkJCWVsZW1bIGpRdWVyeS5jYW1lbENhc2UoICJkZWZh dWx0LSIgKyBuYW1lICkgXSA9IGVsZW1bIG5hbWUgXSA9IHRydWU7CgkJfQoKCQly ZXR1cm4gbmFtZTsKCX0KfTsKCi8vIFJldHJpZXZlIGJvb2xlYW5zIHNwZWNpYWxs eQpqUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0 Y2goIC9cdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCgl2YXIgZ2V0dGVy ID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0 ckhhbmRsZVsgbmFtZSBdID0gZ2V0U2V0SW5wdXQgJiYgZ2V0U2V0QXR0cmlidXRl IHx8ICFydXNlRGVmYXVsdC50ZXN0KCBuYW1lICkgPwoJCWZ1bmN0aW9uKCBlbGVt LCBuYW1lLCBpc1hNTCApIHsKCQkJdmFyIHJldCwgaGFuZGxlOwoJCQlpZiAoICFp c1hNTCApIHsKCQkJCS8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9y YXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXIKCQkJ CWhhbmRsZSA9IGF0dHJIYW5kbGVbIG5hbWUgXTsKCQkJCWF0dHJIYW5kbGVbIG5h bWUgXSA9IHJldDsKCQkJCXJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwg KSAhPSBudWxsID8KCQkJCQluYW1lLnRvTG93ZXJDYXNlKCkgOgoJCQkJCW51bGw7 CgkJCQlhdHRySGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7CgkJCX0KCQkJcmV0dXJu IHJldDsKCQl9IDoKCQlmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJ CWlmICggIWlzWE1MICkgewoJCQkJcmV0dXJuIGVsZW1bIGpRdWVyeS5jYW1lbENh c2UoICJkZWZhdWx0LSIgKyBuYW1lICkgXSA/CgkJCQkJbmFtZS50b0xvd2VyQ2Fz ZSgpIDoKCQkJCQludWxsOwoJCQl9CgkJfTsKfSk7CgovLyBmaXggb2xkSUUgYXR0 cm9wZXJ0aWVzCmlmICggIWdldFNldElucHV0IHx8ICFnZXRTZXRBdHRyaWJ1dGUg KSB7CglqUXVlcnkuYXR0ckhvb2tzLnZhbHVlID0gewoJCXNldDogZnVuY3Rpb24o IGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSgg ZWxlbSwgImlucHV0IiApICkgewoJCQkJLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRo YXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAoJCQkJZWxlbS5kZWZhdWx0VmFs dWUgPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCS8vIFVzZSBub2RlSG9vayBpZiBk ZWZpbmVkICgjMTk1NCk7IG90aGVyd2lzZSBzZXRBdHRyaWJ1dGUgaXMgZmluZQoJ CQkJcmV0dXJuIG5vZGVIb29rICYmIG5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUs IG5hbWUgKTsKCQkJfQoJCX0KCX07Cn0KCi8vIElFNi83IGRvIG5vdCBzdXBwb3J0 IGdldHRpbmcvc2V0dGluZyBzb21lIGF0dHJpYnV0ZXMgd2l0aCBnZXQvc2V0QXR0 cmlidXRlCmlmICggIWdldFNldEF0dHJpYnV0ZSApIHsKCgkvLyBVc2UgdGhpcyBm b3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3Qg ZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0gewoJCXNldDogZnVuY3Rpb24o IGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCQkvLyBTZXQgdGhlIGV4aXN0aW5nIG9y IGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQoJCQl2YXIgcmV0ID0gZWxlbS5n ZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7CgkJCWlmICggIXJldCApIHsKCQkJCWVs ZW0uc2V0QXR0cmlidXRlTm9kZSgKCQkJCQkocmV0ID0gZWxlbS5vd25lckRvY3Vt ZW50LmNyZWF0ZUF0dHJpYnV0ZSggbmFtZSApKQoJCQkJKTsKCQkJfQoKCQkJcmV0 LnZhbHVlID0gdmFsdWUgKz0gIiI7CgoJCQkvLyBCcmVhayBhc3NvY2lhdGlvbiB3 aXRoIGNsb25lZCBlbGVtZW50cyBieSBhbHNvIHVzaW5nIHNldEF0dHJpYnV0ZSAo Izk2NDYpCgkJCWlmICggbmFtZSA9PT0gInZhbHVlIiB8fCB2YWx1ZSA9PT0gZWxl bS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSApIHsKCQkJCXJldHVybiB2YWx1ZTsKCQkJ fQoJCX0KCX07CgoJLy8gU29tZSBhdHRyaWJ1dGVzIGFyZSBjb25zdHJ1Y3RlZCB3 aXRoIGVtcHR5LXN0cmluZyB2YWx1ZXMgd2hlbiBub3QgZGVmaW5lZAoJYXR0ckhh bmRsZS5pZCA9IGF0dHJIYW5kbGUubmFtZSA9IGF0dHJIYW5kbGUuY29vcmRzID0K CQlmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJCXZhciByZXQ7CgkJ CWlmICggIWlzWE1MICkgewoJCQkJcmV0dXJuIChyZXQgPSBlbGVtLmdldEF0dHJp YnV0ZU5vZGUoIG5hbWUgKSkgJiYgcmV0LnZhbHVlICE9PSAiIiA/CgkJCQkJcmV0 LnZhbHVlIDoKCQkJCQludWxsOwoJCQl9CgkJfTsKCgkvLyBGaXhpbmcgdmFsdWUg cmV0cmlldmFsIG9uIGEgYnV0dG9uIHJlcXVpcmVzIHRoaXMgbW9kdWxlCglqUXVl cnkudmFsSG9va3MuYnV0dG9uID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5h bWUgKSB7CgkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUg KTsKCQkJaWYgKCByZXQgJiYgcmV0LnNwZWNpZmllZCApIHsKCQkJCXJldHVybiBy ZXQudmFsdWU7CgkJCX0KCQl9LAoJCXNldDogbm9kZUhvb2suc2V0Cgl9OwoKCS8v IFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5 KQoJLy8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFz IGFuIGludmFsaWQgdmFsdWUKCWpRdWVyeS5hdHRySG9va3MuY29udGVudGVkaXRh YmxlID0gewoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJ CQlub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlID09PSAiIiA/IGZhbHNlIDogdmFs dWUsIG5hbWUgKTsKCQl9Cgl9OwoKCS8vIFNldCB3aWR0aCBhbmQgaGVpZ2h0IHRv IGF1dG8gaW5zdGVhZCBvZiAwIG9uIGVtcHR5IHN0cmluZyggQnVnICM4MTUwICkK CS8vIFRoaXMgaXMgZm9yIHJlbW92YWxzCglqUXVlcnkuZWFjaChbICJ3aWR0aCIs ICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJCWpRdWVyeS5hdHRy SG9va3NbIG5hbWUgXSA9IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUg KSB7CgkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCQllbGVtLnNldEF0dHJp YnV0ZSggbmFtZSwgImF1dG8iICk7CgkJCQkJcmV0dXJuIHZhbHVlOwoJCQkJfQoJ CQl9CgkJfTsKCX0pOwp9CgppZiAoICFzdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5 LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJ CQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmlu ZwoJCQkvLyBOb3RlOiBJRSB1cHBlcmNhc2VzIGNzcyBwcm9wZXJ0eSBuYW1lcywg YnV0IGlmIHdlIHdlcmUgdG8gLnRvTG93ZXJDYXNlKCkKCQkJLy8gLmNzc1RleHQs IHRoYXQgd291bGQgZGVzdHJveSBjYXNlIHNlbnN0aXRpdml0eSBpbiBVUkwncywg bGlrZSBpbiAiYmFja2dyb3VuZCIKCQkJcmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4 dCB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1 ZSApIHsKCQkJcmV0dXJuICggZWxlbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgKyAi IiApOwoJCX0KCX07Cn0KCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxz ZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksCglyY2xpY2thYmxlID0g L14oPzphfGFyZWEpJC9pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7Cglwcm9wOiBmdW5j dGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1 ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJ fSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQluYW1lID0galF1 ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCXJldHVybiB0aGlzLmVhY2go ZnVuY3Rpb24oKSB7CgkJCS8vIHRyeS9jYXRjaCBoYW5kbGVzIGNhc2VzIHdoZXJl IElFIGJhbGtzIChzdWNoIGFzIHJlbW92aW5nIGEgcHJvcGVydHkgb24gd2luZG93 KQoJCQl0cnkgewoJCQkJdGhpc1sgbmFtZSBdID0gdW5kZWZpbmVkOwoJCQkJZGVs ZXRlIHRoaXNbIG5hbWUgXTsKCQkJfSBjYXRjaCggZSApIHt9CgkJfSk7Cgl9Cn0p OwoKalF1ZXJ5LmV4dGVuZCh7Cglwcm9wRml4OiB7CgkJImZvciI6ICJodG1sRm9y IiwKCQkiY2xhc3MiOiAiY2xhc3NOYW1lIgoJfSwKCglwcm9wOiBmdW5jdGlvbigg ZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJdmFyIHJldCwgaG9va3MsIG5vdHhtbCwK CQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOwoKCQkvLyBkb24ndCBnZXQvc2V0IHBy b3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCgkJ aWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlw ZSA9PT0gMiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJbm90eG1sID0gblR5cGUgIT09 IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQlpZiAoIG5vdHhtbCAp IHsKCQkJLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwoJCQluYW1lID0galF1 ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCQlob29rcyA9IGpRdWVyeS5w cm9wSG9va3NbIG5hbWUgXTsKCQl9CgoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5l ZCApIHsKCQkJcmV0dXJuIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQg PSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQg PwoJCQkJcmV0IDoKCQkJCSggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTsKCgkJfSBl bHNlIHsKCQkJcmV0dXJuIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQg PSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgPwoJCQkJcmV0IDoK CQkJCWVsZW1bIG5hbWUgXTsKCQl9Cgl9LAoKCXByb3BIb29rczogewoJCXRhYklu ZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBlbGVtLnRh YkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3 aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8v Zmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5n LWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJ CQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJ CXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRl eCIgKTsKCgkJCQlyZXR1cm4gdGFiaW5kZXggPwoJCQkJCXBhcnNlSW50KCB0YWJp bmRleCwgMTAgKSA6CgkJCQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1l ICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5o cmVmID8KCQkJCQkJMCA6CgkJCQkJCS0xOwoJCQl9CgkJfQoJfQp9KTsKCi8vIFNv bWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCi8vIGh0 dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUy OFZTLjg1JTI5LmFzcHgKaWYgKCAhc3VwcG9ydC5ocmVmTm9ybWFsaXplZCApIHsK CS8vIGhyZWYvc3JjIHByb3BlcnR5IHNob3VsZCBnZXQgdGhlIGZ1bGwgbm9ybWFs aXplZCBVUkwgKCMxMDI5OS8jMTI5MTUpCglqUXVlcnkuZWFjaChbICJocmVmIiwg InNyYyIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgkJalF1ZXJ5LnByb3BIb29r c1sgbmFtZSBdID0gewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0 dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCA0ICk7CgkJCX0KCQl9OwoJfSk7 Cn0KCi8vIFN1cHBvcnQ6IFNhZmFyaSwgSUU5KwovLyBtaXMtcmVwb3J0cyB0aGUg ZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24KLy8gQWNjZXNz aW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0 CmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7CglqUXVlcnkucHJvcEhvb2tz LnNlbGVjdGVkID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBw YXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgoJCQlpZiAoIHBhcmVudCApIHsKCQkJ CXBhcmVudC5zZWxlY3RlZEluZGV4OwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGl0 IGFsc28gd29ya3Mgd2l0aCBvcHRncm91cHMsIHNlZSAjNTcwMQoJCQkJaWYgKCBw YXJlbnQucGFyZW50Tm9kZSApIHsKCQkJCQlwYXJlbnQucGFyZW50Tm9kZS5zZWxl Y3RlZEluZGV4OwoJCQkJfQoJCQl9CgkJCXJldHVybiBudWxsOwoJCX0KCX07Cn0K CmpRdWVyeS5lYWNoKFsKCSJ0YWJJbmRleCIsCgkicmVhZE9ubHkiLAoJIm1heExl bmd0aCIsCgkiY2VsbFNwYWNpbmciLAoJImNlbGxQYWRkaW5nIiwKCSJyb3dTcGFu IiwKCSJjb2xTcGFuIiwKCSJ1c2VNYXAiLAoJImZyYW1lQm9yZGVyIiwKCSJjb250 ZW50RWRpdGFibGUiCl0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnByb3BGaXhbIHRo aXMudG9Mb3dlckNhc2UoKSBdID0gdGhpczsKfSk7CgovLyBJRTYvNyBjYWxsIGVu Y3R5cGUgZW5jb2RpbmcKaWYgKCAhc3VwcG9ydC5lbmN0eXBlICkgewoJalF1ZXJ5 LnByb3BGaXguZW5jdHlwZSA9ICJlbmNvZGluZyI7Cn0KCgoKCnZhciByY2xhc3Mg PSAvW1x0XHJcblxmXS9nOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglhZGRDbGFzczog ZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGNs YXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMCwKCQkJbGVuID0gdGhpcy5sZW5n dGgsCgkJCXByb2NlZWQgPSB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICYmIHZh bHVlOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQly ZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewoJCQkJalF1ZXJ5KCB0aGlz ICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMuY2xhc3NOYW1l ICkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIHByb2NlZWQgKSB7CgkJCS8vIFRoZSBk aXNqdW5jdGlvbiBoZXJlIGlzIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChz ZWUgcmVtb3ZlQ2xhc3MpCgkJCWNsYXNzZXMgPSAoIHZhbHVlIHx8ICIiICkubWF0 Y2goIHJub3R3aGl0ZSApIHx8IFtdOwoKCQkJZm9yICggOyBpIDwgbGVuOyBpKysg KSB7CgkJCQllbGVtID0gdGhpc1sgaSBdOwoJCQkJY3VyID0gZWxlbS5ub2RlVHlw ZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID8KCQkJCQkoICIgIiArIGVsZW0u Y2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6CgkJCQkJ IiAiCgkJCQkpOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdo aWxlICggKGNsYXp6ID0gY2xhc3Nlc1tqKytdKSApIHsKCQkJCQkJaWYgKCBjdXIu aW5kZXhPZiggIiAiICsgY2xhenogKyAiICIgKSA8IDAgKSB7CgkJCQkJCQljdXIg Kz0gY2xhenogKyAiICI7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIG9ubHkgYXNz aWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJ CQkJZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTsKCQkJCQlpZiAoIGVs ZW0uY2xhc3NOYW1lICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLmNsYXNz TmFtZSA9IGZpbmFsVmFsdWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1 cm4gdGhpczsKCX0sCgoJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsK CQl2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSwK CQkJaSA9IDAsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlwcm9jZWVkID0gYXJn dW1lbnRzLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmci ICYmIHZhbHVlOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkg ewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewoJCQkJalF1ZXJ5 KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIHRoaXMu Y2xhc3NOYW1lICkgKTsKCQkJfSk7CgkJfQoJCWlmICggcHJvY2VlZCApIHsKCQkJ Y2xhc3NlcyA9ICggdmFsdWUgfHwgIiIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwg W107CgoJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlz WyBpIF07CgkJCQkvLyBUaGlzIGV4cHJlc3Npb24gaXMgaGVyZSBmb3IgYmV0dGVy IGNvbXByZXNzaWJpbGl0eSAoc2VlIGFkZENsYXNzKQoJCQkJY3VyID0gZWxlbS5u b2RlVHlwZSA9PT0gMSAmJiAoIGVsZW0uY2xhc3NOYW1lID8KCQkJCQkoICIgIiAr IGVsZW0uY2xhc3NOYW1lICsgIiAiICkucmVwbGFjZSggcmNsYXNzLCAiICIgKSA6 CgkJCQkJIiIKCQkJCSk7CgoJCQkJaWYgKCBjdXIgKSB7CgkJCQkJaiA9IDA7CgkJ CQkJd2hpbGUgKCAoY2xhenogPSBjbGFzc2VzW2orK10pICkgewoJCQkJCQkvLyBS ZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2Yo ICIgIiArIGNsYXp6ICsgIiAiICkgPj0gMCApIHsKCQkJCQkJCWN1ciA9IGN1ci5y ZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9 CgoJCQkJCS8vIG9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5l ZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHZhbHVlID8galF1ZXJ5 LnRyaW0oIGN1ciApIDogIiI7CgkJCQkJaWYgKCBlbGVtLmNsYXNzTmFtZSAhPT0g ZmluYWxWYWx1ZSApIHsKCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBmaW5hbFZhbHVl OwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXRv Z2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkgewoJCXZhciB0 eXBlID0gdHlwZW9mIHZhbHVlOwoKCQlpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0g ImJvb2xlYW4iICYmIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gc3Rh dGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFz cyggdmFsdWUgKTsKCQl9CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVl ICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlq UXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0 aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOwoJCQl9KTsKCQl9 CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggdHlwZSA9 PT0gInN0cmluZyIgKSB7CgkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBu YW1lcwoJCQkJdmFyIGNsYXNzTmFtZSwKCQkJCQlpID0gMCwKCQkJCQlzZWxmID0g alF1ZXJ5KCB0aGlzICksCgkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLm1hdGNoKCBy bm90d2hpdGUgKSB8fCBbXTsKCgkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFz c05hbWVzWyBpKysgXSkgKSB7CgkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUg Z2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0Ns YXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xh c3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xh c3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNz IG5hbWUKCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gc3RydW5kZWZpbmVkIHx8IHR5 cGUgPT09ICJib29sZWFuIiApIHsKCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7 CgkJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAoJCQkJCWpRdWVyeS5fZGF0 YSggdGhpcywgIl9fY2xhc3NOYW1lX18iLCB0aGlzLmNsYXNzTmFtZSApOwoJCQkJ fQoKCQkJCS8vIElmIHRoZSBlbGVtZW50IGhhcyBhIGNsYXNzIG5hbWUgb3IgaWYg d2UncmUgcGFzc2VkICJmYWxzZSIsCgkJCQkvLyB0aGVuIHJlbW92ZSB0aGUgd2hv bGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQg aXQpLgoJCQkJLy8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHBy ZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSwKCQkJCS8vIGZhbGxpbmcgYmFj ayB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC4KCQkJ CXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZh bHNlID8gIiIgOiBqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiAp IHx8ICIiOwoJCQl9CgkJfSk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2Vs ZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAi LAoJCQlpID0gMCwKCQkJbCA9IHRoaXMubGVuZ3RoOwoJCWZvciAoIDsgaSA8IGw7 IGkrKyApIHsKCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmICgiICIg KyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIiku aW5kZXhPZiggY2xhc3NOYW1lICkgPj0gMCApIHsKCQkJCXJldHVybiB0cnVlOwoJ CQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0pOwoKCgoKLy8gUmV0dXJuIGpR dWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvbgoKCmpRdWVyeS5lYWNo KCAoImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3Jv bGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrICIgKwoJIm1vdXNlZG93biBtb3VzZXVw IG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxl YXZlICIgKwoJImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mg a2V5dXAgZXJyb3IgY29udGV4dG1lbnUiKS5zcGxpdCgiICIpLCBmdW5jdGlvbigg aSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZu WyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwg Zm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSk7CgpqUXVlcnku Zm4uZXh0ZW5kKHsKCWhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsK CQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBm bk91dCB8fCBmbk92ZXIgKTsKCX0sCgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBk YXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEs IGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJl dHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRl OiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1 cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVu ZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoJCS8v ICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dICkKCQly ZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHRoaXMub2ZmKCBzZWxlY3Rv ciwgIioqIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCAiKioiLCBm biApOwoJfQp9KTsKCgp2YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7Cgp2YXIgcnF1 ZXJ5ID0gKC9cPy8pOwoKCgp2YXIgcnZhbGlkdG9rZW5zID0gLygsKXwoXFt8eyl8 KH18XSl8Iig/OlteIlxcXHJcbl18XFxbIlxcXC9iZm5ydF18XFx1W1xkYS1mQS1G XXs0fSkqIlxzKjo/fHRydWV8ZmFsc2V8bnVsbHwtPyg/ITBcZClcZCsoPzpcLlxk K3wpKD86W2VFXVsrLV0/XGQrfCkvZzsKCmpRdWVyeS5wYXJzZUpTT04gPSBmdW5j dGlvbiggZGF0YSApIHsKCS8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5h dGl2ZSBKU09OIHBhcnNlciBmaXJzdAoJaWYgKCB3aW5kb3cuSlNPTiAmJiB3aW5k b3cuSlNPTi5wYXJzZSApIHsKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMwoJCS8v IFdvcmthcm91bmQgZmFpbHVyZSB0byBzdHJpbmctY2FzdCBudWxsIGlucHV0CgkJ cmV0dXJuIHdpbmRvdy5KU09OLnBhcnNlKCBkYXRhICsgIiIgKTsKCX0KCgl2YXIg cmVxdWlyZU5vbkNvbW1hLAoJCWRlcHRoID0gbnVsbCwKCQlzdHIgPSBqUXVlcnku dHJpbSggZGF0YSArICIiICk7CgoJLy8gR3VhcmQgYWdhaW5zdCBpbnZhbGlkIChh bmQgcG9zc2libHkgZGFuZ2Vyb3VzKSBpbnB1dCBieSBlbnN1cmluZyB0aGF0IG5v dGhpbmcgcmVtYWlucwoJLy8gYWZ0ZXIgcmVtb3ZpbmcgdmFsaWQgdG9rZW5zCgly ZXR1cm4gc3RyICYmICFqUXVlcnkudHJpbSggc3RyLnJlcGxhY2UoIHJ2YWxpZHRv a2VucywgZnVuY3Rpb24oIHRva2VuLCBjb21tYSwgb3BlbiwgY2xvc2UgKSB7CgoJ CS8vIEZvcmNlIHRlcm1pbmF0aW9uIGlmIHdlIHNlZSBhIG1pc3BsYWNlZCBjb21t YQoJCWlmICggcmVxdWlyZU5vbkNvbW1hICYmIGNvbW1hICkgewoJCQlkZXB0aCA9 IDA7CgkJfQoKCQkvLyBQZXJmb3JtIG5vIG1vcmUgcmVwbGFjZW1lbnRzIGFmdGVy IHJldHVybmluZyB0byBvdXRlcm1vc3QgZGVwdGgKCQlpZiAoIGRlcHRoID09PSAw ICkgewoJCQlyZXR1cm4gdG9rZW47CgkJfQoKCQkvLyBDb21tYXMgbXVzdCBub3Qg Zm9sbG93ICJbIiwgInsiLCBvciAiLCIKCQlyZXF1aXJlTm9uQ29tbWEgPSBvcGVu IHx8IGNvbW1hOwoKCQkvLyBEZXRlcm1pbmUgbmV3IGRlcHRoCgkJLy8gYXJyYXkv b2JqZWN0IG9wZW4gKCJbIiBvciAieyIpOiBkZXB0aCArPSB0cnVlIC0gZmFsc2Ug KGluY3JlbWVudCkKCQkvLyBhcnJheS9vYmplY3QgY2xvc2UgKCJdIiBvciAifSIp OiBkZXB0aCArPSBmYWxzZSAtIHRydWUgKGRlY3JlbWVudCkKCQkvLyBvdGhlciBj YXNlcyAoIiwiIG9yIHByaW1pdGl2ZSk6IGRlcHRoICs9IHRydWUgLSB0cnVlIChu dW1lcmljIGNhc3QpCgkJZGVwdGggKz0gIWNsb3NlIC0gIW9wZW47CgoJCS8vIFJl bW92ZSB0aGlzIHRva2VuCgkJcmV0dXJuICIiOwoJfSkgKSA/CgkJKCBGdW5jdGlv biggInJldHVybiAiICsgc3RyICkgKSgpIDoKCQlqUXVlcnkuZXJyb3IoICJJbnZh bGlkIEpTT046ICIgKyBkYXRhICk7Cn07CgoKLy8gQ3Jvc3MtYnJvd3NlciB4bWwg cGFyc2luZwpqUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHsKCXZh ciB4bWwsIHRtcDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJp bmciICkgewoJCXJldHVybiBudWxsOwoJfQoJdHJ5IHsKCQlpZiAoIHdpbmRvdy5E T01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCgkJCXRtcCA9IG5ldyBET01QYXJzZXIo KTsKCQkJeG1sID0gdG1wLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgInRleHQveG1s IiApOwoJCX0gZWxzZSB7IC8vIElFCgkJCXhtbCA9IG5ldyBBY3RpdmVYT2JqZWN0 KCAiTWljcm9zb2Z0LlhNTERPTSIgKTsKCQkJeG1sLmFzeW5jID0gImZhbHNlIjsK CQkJeG1sLmxvYWRYTUwoIGRhdGEgKTsKCQl9Cgl9IGNhdGNoKCBlICkgewoJCXht bCA9IHVuZGVmaW5lZDsKCX0KCWlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxl bWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIg KS5sZW5ndGggKSB7CgkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBYTUw6ICIgKyBk YXRhICk7Cgl9CglyZXR1cm4geG1sOwp9OwoKCnZhcgoJLy8gRG9jdW1lbnQgbG9j YXRpb24KCWFqYXhMb2NQYXJ0cywKCWFqYXhMb2NhdGlvbiwKCglyaGFzaCA9IC8j LiokLywKCXJ0cyA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/ KTpbIFx0XSooW15cclxuXSopXHI/JC9tZywgLy8gSUUgbGVhdmVzIGFuIFxyIGNo YXJhY3RlciBhdCBFT0wKCS8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHBy b3RvY29sIGRldGVjdGlvbgoJcmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFw cHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywK CXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15c L1wvLywKCXJ1cmwgPSAvXihbXHcuKy1dKzopKD86XC9cLyg/OlteXC8/I10qQHwp KFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLywKCgkvKiBQcmVmaWx0ZXJzCgkgKiAx KSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMg KHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKQoJICogMikgVGhlc2Ug YXJlIGNhbGxlZDoKCSAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3Bv cnQKCSAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlz IGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSkKCSAqIDMpIGtleSBp cyB0aGUgZGF0YVR5cGUKCSAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNh biBiZSB1c2VkCgkgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5z cG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvICIqIiBpZiBu ZWVkZWQKCSAqLwoJcHJlZmlsdGVycyA9IHt9LAoKCS8qIFRyYW5zcG9ydHMgYmlu ZGluZ3MKCSAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGUKCSAqIDIpIHRoZSBjYXRj aGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkCgkgKiAzKSBzZWxlY3Rpb24gd2ls bCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byAi KiIgaWYgbmVlZGVkCgkgKi8KCXRyYW5zcG9ydHMgPSB7fSwKCgkvLyBBdm9pZCBj b21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVh c2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gIiovIi5j b25jYXQoIioiKTsKCi8vICM4MTM4LCBJRSBtYXkgdGhyb3cgYW4gZXhjZXB0aW9u IHdoZW4gYWNjZXNzaW5nCi8vIGEgZmllbGQgZnJvbSB3aW5kb3cubG9jYXRpb24g aWYgZG9jdW1lbnQuZG9tYWluIGhhcyBiZWVuIHNldAp0cnkgewoJYWpheExvY2F0 aW9uID0gbG9jYXRpb24uaHJlZjsKfSBjYXRjaCggZSApIHsKCS8vIFVzZSB0aGUg aHJlZiBhdHRyaWJ1dGUgb2YgYW4gQSBlbGVtZW50CgkvLyBzaW5jZSBJRSB3aWxs IG1vZGlmeSBpdCBnaXZlbiBkb2N1bWVudC5sb2NhdGlvbgoJYWpheExvY2F0aW9u ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImEiICk7CglhamF4TG9jYXRpb24u aHJlZiA9ICIiOwoJYWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7Cn0K Ci8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0cwphamF4TG9jUGFydHMgPSBy dXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107Cgov LyBCYXNlICJjb25zdHJ1Y3RvciIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFu ZCBqUXVlcnkuYWpheFRyYW5zcG9ydApmdW5jdGlvbiBhZGRUb1ByZWZpbHRlcnNP clRyYW5zcG9ydHMoIHN0cnVjdHVyZSApIHsKCgkvLyBkYXRhVHlwZUV4cHJlc3Np b24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICIqIgoJcmV0dXJuIGZ1bmN0 aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7CgoJCWlmICggdHlwZW9m IGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gInN0cmluZyIgKSB7CgkJCWZ1bmMgPSBk YXRhVHlwZUV4cHJlc3Npb247CgkJCWRhdGFUeXBlRXhwcmVzc2lvbiA9ICIqIjsK CQl9CgoJCXZhciBkYXRhVHlwZSwKCQkJaSA9IDAsCgkJCWRhdGFUeXBlcyA9IGRh dGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUg KSB8fCBbXTsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkgewoJ CQkvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9u CgkJCXdoaWxlICggKGRhdGFUeXBlID0gZGF0YVR5cGVzW2krK10pICkgewoJCQkJ Ly8gUHJlcGVuZCBpZiByZXF1ZXN0ZWQKCQkJCWlmICggZGF0YVR5cGUuY2hhckF0 KCAwICkgPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNl KCAxICkgfHwgIioiOwoJCQkJCShzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1 Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnVuc2hpZnQoIGZ1bmMgKTsKCgkJCQkv LyBPdGhlcndpc2UgYXBwZW5kCgkJCQl9IGVsc2UgewoJCQkJCShzdHJ1Y3R1cmVb IGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10pLnB1c2go IGZ1bmMgKTsKCQkJCX0KCQkJfQoJCX0KCX07Cn0KCi8vIEJhc2UgaW5zcGVjdGlv biBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0cwpmdW5jdGlv biBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRp b25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkgewoKCXZhciBpbnNwZWN0ZWQg PSB7fSwKCQlzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5z cG9ydHMgKTsKCglmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHsKCQl2YXIg c2VsZWN0ZWQ7CgkJaW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTsKCQlqUXVl cnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbigg XywgcHJlZmlsdGVyT3JGYWN0b3J5ICkgewoJCQl2YXIgZGF0YVR5cGVPclRyYW5z cG9ydCA9IHByZWZpbHRlck9yRmFjdG9yeSggb3B0aW9ucywgb3JpZ2luYWxPcHRp b25zLCBqcVhIUiApOwoJCQlpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0 ID09PSAic3RyaW5nIiAmJiAhc2Vla2luZ1RyYW5zcG9ydCAmJiAhaW5zcGVjdGVk WyBkYXRhVHlwZU9yVHJhbnNwb3J0IF0gKSB7CgkJCQlvcHRpb25zLmRhdGFUeXBl cy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBk YXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxz ZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0 ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4g c2VsZWN0ZWQ7Cgl9CgoJcmV0dXJuIGluc3BlY3QoIG9wdGlvbnMuZGF0YVR5cGVz WyAwIF0gKSB8fCAhaW5zcGVjdGVkWyAiKiIgXSAmJiBpbnNwZWN0KCAiKiIgKTsK fQoKLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zCi8vIHRoYXQg dGFrZXMgImZsYXQiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKQov LyBGaXhlcyAjOTg4NwpmdW5jdGlvbiBhamF4RXh0ZW5kKCB0YXJnZXQsIHNyYyAp IHsKCXZhciBkZWVwLCBrZXksCgkJZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNl dHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9OwoKCWZvciAoIGtleSBpbiBzcmMgKSB7 CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9w dGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8IChkZWVwID0ge30pICkg KVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlq UXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4g dGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVl c3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3 ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0 dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWph eEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCXZhciBm aXJzdERhdGFUeXBlLCBjdCwgZmluYWxEYXRhVHlwZSwgdHlwZSwKCQljb250ZW50 cyA9IHMuY29udGVudHMsCgkJZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7CgoJLy8g UmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhl IHByb2Nlc3MKCXdoaWxlICggZGF0YVR5cGVzWyAwIF0gPT09ICIqIiApIHsKCQlk YXRhVHlwZXMuc2hpZnQoKTsKCQlpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7CgkJ CWN0ID0gcy5taW1lVHlwZSB8fCBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiQ29u dGVudC1UeXBlIik7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcg d2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0 eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYg Y29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVu c2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNr IHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBk YXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJ ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCQkvLyBU cnkgY29udmVydGlibGUgZGF0YVR5cGVzCgkJZm9yICggdHlwZSBpbiByZXNwb25z ZXMgKSB7CgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sg dHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewoJCQkJZmluYWxEYXRhVHlw ZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBl ICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgkJLy8gT3Ig anVzdCB1c2UgZmlyc3Qgb25lCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5 cGUgfHwgZmlyc3REYXRhVHlwZTsKCX0KCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFU eXBlCgkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRl ZAoJLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQoJaWYg KCBmaW5hbERhdGFUeXBlICkgewoJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0 YVR5cGVzWyAwIF0gKSB7CgkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFU eXBlICk7CgkJfQoJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsK CX0KfQoKLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5k IHRoZSBvcmlnaW5hbCByZXNwb25zZQogKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNl WFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2UKICovCmZ1bmN0aW9uIGFq YXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHsKCXZh ciBjb252MiwgY3VycmVudCwgY29udiwgdG1wLCBwcmV2LAoJCWNvbnZlcnRlcnMg PSB7fSwKCQkvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNl IHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uCgkJZGF0YVR5cGVz ID0gcy5kYXRhVHlwZXMuc2xpY2UoKTsKCgkvLyBDcmVhdGUgY29udmVydGVycyBt YXAgd2l0aCBsb3dlcmNhc2VkIGtleXMKCWlmICggZGF0YVR5cGVzWyAxIF0gKSB7 CgkJZm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7CgkJCWNvbnZlcnRlcnNb IGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07CgkJ fQoJfQoKCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkvLyBDb252ZXJ0 IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZQoJd2hpbGUgKCBjdXJyZW50ICkg ewoKCQlpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHsKCQkJanFY SFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7CgkJ fQoKCQkvLyBBcHBseSB0aGUgZGF0YUZpbHRlciBpZiBwcm92aWRlZAoJCWlmICgg IXByZXYgJiYgaXNTdWNjZXNzICYmIHMuZGF0YUZpbHRlciApIHsKCQkJcmVzcG9u c2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7CgkJfQoK CQlwcmV2ID0gY3VycmVudDsKCQljdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7 CgoJCWlmICggY3VycmVudCApIHsKCgkJCS8vIFRoZXJlJ3Mgb25seSB3b3JrIHRv IGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG8KCQkJaWYgKCBjdXJy ZW50ID09PSAiKiIgKSB7CgoJCQkJY3VycmVudCA9IHByZXY7CgoJCQkvLyBDb252 ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRp ZmZlcnMgZnJvbSBjdXJyZW50CgkJCX0gZWxzZSBpZiAoIHByZXYgIT09ICIqIiAm JiBwcmV2ICE9PSBjdXJyZW50ICkgewoKCQkJCS8vIFNlZWsgYSBkaXJlY3QgY29u dmVydGVyCgkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIGN1cnJl bnQgXSB8fCBjb252ZXJ0ZXJzWyAiKiAiICsgY3VycmVudCBdOwoKCQkJCS8vIElm IG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyCgkJCQlpZiAoICFjb252ICkgewoJCQkJ CWZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7CgoJCQkJCQkvLyBJZiBjb252 MiBvdXRwdXRzIGN1cnJlbnQKCQkJCQkJdG1wID0gY29udjIuc3BsaXQoICIgIiAp OwoJCQkJCQlpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkgewoKCQkJCQkJCS8v IElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dAoJCQkJ CQkJY29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyAiICIgKyB0bXBbIDAgXSBdIHx8 CgkJCQkJCQkJY29udmVydGVyc1sgIiogIiArIHRtcFsgMCBdIF07CgkJCQkJCQlp ZiAoIGNvbnYgKSB7CgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29u dmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJ Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lz ZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVs c2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJ CQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0 KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0K CQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlm IG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsK CgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNh dGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzWyAidGhyb3dz IiBdICkgewoJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJ fSBlbHNlIHsKCQkJCQkJdHJ5IHsKCQkJCQkJCXJlc3BvbnNlID0gY29udiggcmVz cG9uc2UgKTsKCQkJCQkJfSBjYXRjaCAoIGUgKSB7CgkJCQkJCQlyZXR1cm4geyBz dGF0ZTogInBhcnNlcmVycm9yIiwgZXJyb3I6IGNvbnYgPyBlIDogIk5vIGNvbnZl cnNpb24gZnJvbSAiICsgcHJldiArICIgdG8gIiArIGN1cnJlbnQgfTsKCQkJCQkJ fQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1 Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKHsKCgkv LyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJp ZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBm b3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30sCgoJ YWpheFNldHRpbmdzOiB7CgkJdXJsOiBhamF4TG9jYXRpb24sCgkJdHlwZTogIkdF VCIsCgkJaXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggYWpheExvY1BhcnRz WyAxIF0gKSwKCQlnbG9iYWw6IHRydWUsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJ YXN5bmM6IHRydWUsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1m b3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLAoJCS8qCgkJdGltZW91dDog MCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBu dWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czog ZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSov CgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQv cGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRp b24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0 ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAveG1s LywKCQkJaHRtbDogL2h0bWwvLAoJCQlqc29uOiAvanNvbi8KCQl9LAoKCQlyZXNw b25zZUZpZWxkczogewoJCQl4bWw6ICJyZXNwb25zZVhNTCIsCgkJCXRleHQ6ICJy ZXNwb25zZVRleHQiLAoJCQlqc29uOiAicmVzcG9uc2VKU09OIgoJCX0sCgoJCS8v IERhdGEgY29udmVydGVycwoJCS8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBj YXRjaGFsbCAiKiIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xl IHNwYWNlCgkJY29udmVydGVyczogewoKCQkJLy8gQ29udmVydCBhbnl0aGluZyB0 byB0ZXh0CgkJCSIqIHRleHQiOiBTdHJpbmcsCgoJCQkvLyBUZXh0IHRvIGh0bWwg KHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKCQkJInRleHQgaHRtbCI6IHRydWUs CgoJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCgkJCSJ0 ZXh0IGpzb24iOiBqUXVlcnkucGFyc2VKU09OLAoKCQkJLy8gUGFyc2UgdGV4dCBh cyB4bWwKCQkJInRleHQgeG1sIjogalF1ZXJ5LnBhcnNlWE1MCgkJfSwKCgkJLy8g Rm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDoKCQkv LyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCgkJ Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKCQkv LyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZCkKCQlmbGF0T3B0aW9uczog ewoJCQl1cmw6IHRydWUsCgkJCWNvbnRleHQ6IHRydWUKCQl9Cgl9LAoKCS8vIENy ZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0 CgkvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMu CgkvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRp bmdzLgoJYWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHsK CQlyZXR1cm4gc2V0dGluZ3MgPwoKCQkJLy8gQnVpbGRpbmcgYSBzZXR0aW5ncyBv YmplY3QKCQkJYWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnku YWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOgoKCQkJLy8gRXh0ZW5kaW5nIGFq YXhTZXR0aW5ncwoJCQlhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0 YXJnZXQgKTsKCX0sCgoJYWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JU cmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksCglhamF4VHJhbnNwb3J0OiBhZGRUb1By ZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSwKCgkvLyBNYWluIG1l dGhvZAoJYWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHsKCgkJLy8gSWYg dXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKCQlp ZiAoIHR5cGVvZiB1cmwgPT09ICJvYmplY3QiICkgewoJCQlvcHRpb25zID0gdXJs OwoJCQl1cmwgPSB1bmRlZmluZWQ7CgkJfQoKCQkvLyBGb3JjZSBvcHRpb25zIHRv IGJlIGFuIG9iamVjdAoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKCQl2YXIg Ly8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzCgkJCXBhcnRzLAoJCQkvLyBM b29wIHZhcmlhYmxlCgkJCWksCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUg cGFyYW0KCQkJY2FjaGVVUkwsCgkJCS8vIFJlc3BvbnNlIGhlYWRlcnMgYXMgc3Ry aW5nCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJLy8gdGltZW91dCBoYW5k bGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZl bnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJdHJh bnNwb3J0LAoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVy cywKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0g alF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCQkJLy8gQ2FsbGJhY2tz IGNvbnRleHQKCQkJY2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsCgkJ CS8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0 IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb24KCQkJZ2xv YmFsRXZlbnRDb250ZXh0ID0gcy5jb250ZXh0ICYmICggY2FsbGJhY2tDb250ZXh0 Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQlqUXVl cnkoIGNhbGxiYWNrQ29udGV4dCApIDoKCQkJCWpRdWVyeS5ldmVudCwKCQkJLy8g RGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNv bXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIp LAoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2Rl ID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoJCQkvLyBIZWFkZXJzICh0aGV5IGFyZSBz ZW50IGFsbCBhdCBvbmNlKQoJCQlyZXF1ZXN0SGVhZGVycyA9IHt9LAoJCQlyZXF1 ZXN0SGVhZGVyc05hbWVzID0ge30sCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlz dGF0ZSA9IDAsCgkJCS8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQoJCQlzdHJBYm9y dCA9ICJjYW5jZWxlZCIsCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJ cmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUg aWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSAp IHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKCQkJ CQkJaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgewoJCQkJCQkJcmVzcG9uc2VIZWFk ZXJzID0ge307CgkJCQkJCQl3aGlsZSAoIChtYXRjaCA9IHJoZWFkZXJzLmV4ZWMo IHJlc3BvbnNlSGVhZGVyc1N0cmluZyApKSApIHsKCQkJCQkJCQlyZXNwb25zZUhl YWRlcnNbIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07CgkJ CQkJCQl9CgkJCQkJCX0KCQkJCQkJbWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtl eS50b0xvd2VyQ2FzZSgpIF07CgkJCQkJfQoJCQkJCXJldHVybiBtYXRjaCA9PSBu dWxsID8gbnVsbCA6IG1hdGNoOwoJCQkJfSwKCgkJCQkvLyBSYXcgc3RyaW5nCgkJ CQlnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVy biBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJ CQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVh ZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJdmFyIGxuYW1lID0g bmFtZS50b0xvd2VyQ2FzZSgpOwoJCQkJCWlmICggIXN0YXRlICkgewoJCQkJCQlu YW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFk ZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKCQkJCQkJcmVxdWVzdEhlYWRlcnNb IG5hbWUgXSA9IHZhbHVlOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0s CgoJCQkJLy8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXIK CQkJCW92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCQkJCWlm ICggIXN0YXRlICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJ CQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQg Y2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJ CXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIHN0YXRlIDwg MiApIHsKCQkJCQkJCWZvciAoIGNvZGUgaW4gbWFwICkgewoJCQkJCQkJCS8vIExh enktYWRkIHRoZSBuZXcgY2FsbGJhY2sgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMg b2xkIG9uZXMKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0Nv ZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfSBlbHNl IHsKCQkJCQkJCS8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrcwoJ CQkJCQkJanFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7CgkJCQkJ CX0KCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIENhbmNl bCB0aGUgcmVxdWVzdAoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkg ewoJCQkJCXZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0OwoJ CQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIGZp bmFsVGV4dCApOwoJCQkJCX0KCQkJCQlkb25lKCAwLCBmaW5hbFRleHQgKTsKCQkJ CQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJfTsKCgkJLy8gQXR0YWNoIGRlZmVycmVk cwoJCWRlZmVycmVkLnByb21pc2UoIGpxWEhSICkuY29tcGxldGUgPSBjb21wbGV0 ZURlZmVycmVkLmFkZDsKCQlqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTsKCQlq cVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJh Y3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90 b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90 b2NvbC1sZXNzIHVybHMpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0 dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25h dHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFp bGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgYWpheExvY2F0aW9u ICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2Nv bCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEFsaWFzIG1ldGhv ZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNAoJCXMudHlwZSA9 IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBz LnR5cGU7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBl cyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNl KCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgIiIgXTsKCgkJLy8gQSBjcm9zcy1k b21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHdlIGhhdmUgYSBwcm90b2Nv bDpob3N0OnBvcnQgbWlzbWF0Y2gKCQlpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVs bCApIHsKCQkJcGFydHMgPSBydXJsLmV4ZWMoIHMudXJsLnRvTG93ZXJDYXNlKCkg KTsKCQkJcy5jcm9zc0RvbWFpbiA9ICEhKCBwYXJ0cyAmJgoJCQkJKCBwYXJ0c1sg MSBdICE9PSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9PSBhamF4 TG9jUGFydHNbIDIgXSB8fAoJCQkJCSggcGFydHNbIDMgXSB8fCAoIHBhcnRzWyAx IF0gPT09ICJodHRwOiIgPyAiODAiIDogIjQ0MyIgKSApICE9PQoJCQkJCQkoIGFq YXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRw OiIgPyAiODAiIDogIjQ0MyIgKSApICkKCQkJKTsKCQl9CgoJCS8vIENvbnZlcnQg ZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZwoJCWlmICggcy5kYXRhICYmIHMu cHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJ CXMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7 CgkJfQoKCQkvLyBBcHBseSBwcmVmaWx0ZXJzCgkJaW5zcGVjdFByZWZpbHRlcnNP clRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7CgoJ CS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBz dG9wIHRoZXJlCgkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKCQkJcmV0dXJuIGpxWEhS OwoJCX0KCgkJLy8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cg aWYgYXNrZWQgdG8KCQlmaXJlR2xvYmFscyA9IHMuZ2xvYmFsOwoKCQkvLyBXYXRj aCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzCgkJaWYgKCBmaXJlR2xvYmFscyAm JiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7CgkJCWpRdWVyeS5ldmVudC50cmln Z2VyKCJhamF4U3RhcnQiKTsKCQl9CgoJCS8vIFVwcGVyY2FzZSB0aGUgdHlwZQoJ CXMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpOwoKCQkvLyBEZXRlcm1pbmUg aWYgcmVxdWVzdCBoYXMgY29udGVudAoJCXMuaGFzQ29udGVudCA9ICFybm9Db250 ZW50LnRlc3QoIHMudHlwZSApOwoKCQkvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3 ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2UKCQkvLyBhbmQv b3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb24KCQljYWNoZVVSTCA9IHMu dXJsOwoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdp dGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElm IGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBz LmRhdGEgKSB7CgkJCQljYWNoZVVSTCA9ICggcy51cmwgKz0gKCBycXVlcnkudGVz dCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgcy5kYXRhICk7CgkJCQkvLyAj OTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2 ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQg YW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0g ZmFsc2UgKSB7CgkJCQlzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID8KCgkJ CQkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBp dHMgdmFsdWUKCQkJCQljYWNoZVVSTC5yZXBsYWNlKCBydHMsICIkMV89IiArIG5v bmNlKysgKSA6CgoJCQkJCS8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmQK CQkJCQljYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIg OiAiPyIgKSArICJfPSIgKyBub25jZSsrOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhl IElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwg aWYgaW4gaWZNb2RpZmllZCBtb2RlLgoJCWlmICggcy5pZk1vZGlmaWVkICkgewoJ CQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7CgkJCQlq cVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCAiSWYtTW9kaWZpZWQtU2luY2UiLCBqUXVl cnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7CgkJCX0KCQkJaWYgKCBqUXVl cnkuZXRhZ1sgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFk ZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTsK CQkJfQoJCX0KCgkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBp cyBiZWluZyBzZW50CgkJaWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMu Y29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7 CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJDb250ZW50LVR5cGUiLCBzLmNv bnRlbnRUeXBlICk7CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZv ciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIu c2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAw IF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0 c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioi ID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5h Y2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlv bgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0 SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3Vz dG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5i ZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4 dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJ Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuCgkJCXJldHVy biBqcVhIUi5hYm9ydCgpOwoJCX0KCgkJLy8gYWJvcnRpbmcgaXMgbm8gbG9uZ2Vy IGEgY2FuY2VsbGF0aW9uCgkJc3RyQWJvcnQgPSAiYWJvcnQiOwoKCQkvLyBJbnN0 YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHMKCQlmb3IgKCBpIGluIHsgc3VjY2Vz czogMSwgZXJyb3I6IDEsIGNvbXBsZXRlOiAxIH0gKSB7CgkJCWpxWEhSWyBpIF0o IHNbIGkgXSApOwoJCX0KCgkJLy8gR2V0IHRyYW5zcG9ydAoJCXRyYW5zcG9ydCA9 IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBv cHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8t YWJvcnQKCQlpZiAoICF0cmFuc3BvcnQgKSB7CgkJCWRvbmUoIC0xLCAiTm8gVHJh bnNwb3J0IiApOwoJCX0gZWxzZSB7CgkJCWpxWEhSLnJlYWR5U3RhdGUgPSAxOwoK CQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsK CQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpx WEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAm JiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91 dChmdW5jdGlvbigpIHsKCQkJCQlqcVhIUi5hYm9ydCgidGltZW91dCIpOwoJCQkJ fSwgcy50aW1lb3V0ICk7CgkJCX0KCgkJCXRyeSB7CgkJCQlzdGF0ZSA9IDE7CgkJ CQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBj YXRjaCAoIGUgKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9y IGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAt MSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVs c2UgewoJCQkJCXRocm93IGU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNr IGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0 YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJ CQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlm aWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBD YWxsZWQgb25jZQoJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJcmV0dXJuOwoJ CQl9CgoJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CgkJCXN0YXRlID0gMjsKCgkJ CS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCgkJCWlmICggdGltZW91dFRp bWVyICkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoK CQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNv bGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2Jq ZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJ Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJp bmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFY SFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVy bWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAg JiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJl c3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9 IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJ fQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9u c2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhD b252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8g SWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1 Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQv b3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4K CQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIu Z2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCQkJCQlpZiAoIG1v ZGlmaWVkICkgewoJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBd ID0gbW9kaWZpZWQ7CgkJCQkJfQoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVz cG9uc2VIZWFkZXIoImV0YWciKTsKCQkJCQlpZiAoIG1vZGlmaWVkICkgewoJCQkJ CQlqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkOwoJCQkJCX0KCQkJ CX0KCgkJCQkvLyBpZiBubyBjb250ZW50CgkJCQlpZiAoIHN0YXR1cyA9PT0gMjA0 IHx8IHMudHlwZSA9PT0gIkhFQUQiICkgewoJCQkJCXN0YXR1c1RleHQgPSAibm9j b250ZW50IjsKCgkJCQkvLyBpZiBub3QgbW9kaWZpZWQKCQkJCX0gZWxzZSBpZiAo IHN0YXR1cyA9PT0gMzA0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAibm90bW9kaWZp ZWQiOwoKCQkJCS8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdAoJ CQkJfSBlbHNlIHsKCQkJCQlzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7CgkJ CQkJc3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7CgkJCQkJZXJyb3IgPSByZXNwb25z ZS5lcnJvcjsKCQkJCQlpc1N1Y2Nlc3MgPSAhZXJyb3I7CgkJCQl9CgkJCX0gZWxz ZSB7CgkJCQkvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dAoJCQkJ Ly8gdGhlbiBub3JtYWxpemUgc3RhdHVzVGV4dCBhbmQgc3RhdHVzIGZvciBub24t YWJvcnRzCgkJCQllcnJvciA9IHN0YXR1c1RleHQ7CgkJCQlpZiAoIHN0YXR1cyB8 fCAhc3RhdHVzVGV4dCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJ CQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJ CQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVj dAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQg PSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgIiI7CgoJCQkv LyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJy ZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0 dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWpl Y3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVy cm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MK CQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2Rl ID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2Jh bEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyAiYWpheFN1Y2Nlc3Mi IDogImFqYXhFcnJvciIsCgkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3Vj Y2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxl dGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBz dGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9i YWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIs IHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJ CQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVu dC50cmlnZ2VyKCJhamF4U3RvcCIpOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4g anFYSFI7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxi YWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNr LCAianNvbiIgKTsKCX0sCgoJZ2V0U2NyaXB0OiBmdW5jdGlvbiggdXJsLCBjYWxs YmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNh bGxiYWNrLCAic2NyaXB0IiApOwoJfQp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQi LCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0 aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsK CQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRl ZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9 IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9 IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXVybDog dXJsLAoJCQl0eXBlOiBtZXRob2QsCgkJCWRhdGFUeXBlOiB0eXBlLAoJCQlkYXRh OiBkYXRhLAoJCQlzdWNjZXNzOiBjYWxsYmFjawoJCX0pOwoJfTsKfSk7CgovLyBB dHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBB SkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWyAiYWpheFN0YXJ0IiwgImFqYXhTdG9w IiwgImFqYXhDb21wbGV0ZSIsICJhamF4RXJyb3IiLCAiYWpheFN1Y2Nlc3MiLCAi YWpheFNlbmQiIF0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0 eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUs IGZuICk7Cgl9Owp9KTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJs ICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQl1cmw6IHVybCwKCQl0eXBlOiAi R0VUIiwKCQlkYXRhVHlwZTogInNjcmlwdCIsCgkJYXN5bmM6IGZhbHNlLAoJCWds b2JhbDogZmFsc2UsCgkJInRocm93cyI6IHRydWUKCX0pOwp9OwoKCmpRdWVyeS5m bi5leHRlbmQoewoJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CgkJaWYgKCBq UXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNo KGZ1bmN0aW9uKGkpIHsKCQkJCWpRdWVyeSh0aGlzKS53cmFwQWxsKCBodG1sLmNh bGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIHRoaXNbMF0gKSB7CgkJ CS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCgkJCXZh ciB3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWzBdLm93bmVyRG9jdW1lbnQgKS5l cSgwKS5jbG9uZSh0cnVlKTsKCgkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkg ewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTsKCQkJfQoKCQkJd3Jh cC5tYXAoZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hp bGUgKCBlbGVtLmZpcnN0Q2hpbGQgJiYgZWxlbS5maXJzdENoaWxkLm5vZGVUeXBl ID09PSAxICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7CgkJCQl9CgoJ CQkJcmV0dXJuIGVsZW07CgkJCX0pLmFwcGVuZCggdGhpcyApOwoJCX0KCgkJcmV0 dXJuIHRoaXM7Cgl9LAoKCXdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7CgkJ aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkgewoJCQlyZXR1cm4gdGhp cy5lYWNoKGZ1bmN0aW9uKGkpIHsKCQkJCWpRdWVyeSh0aGlzKS53cmFwSW5uZXIo IGh0bWwuY2FsbCh0aGlzLCBpKSApOwoJCQl9KTsKCQl9CgoJCXJldHVybiB0aGlz LmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBzZWxmID0galF1ZXJ5KCB0aGlzICks CgkJCQljb250ZW50cyA9IHNlbGYuY29udGVudHMoKTsKCgkJCWlmICggY29udGVu dHMubGVuZ3RoICkgewoJCQkJY29udGVudHMud3JhcEFsbCggaHRtbCApOwoKCQkJ fSBlbHNlIHsKCQkJCXNlbGYuYXBwZW5kKCBodG1sICk7CgkJCX0KCQl9KTsKCX0s CgoJd3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7CgkJdmFyIGlzRnVuY3Rpb24gPSBq UXVlcnkuaXNGdW5jdGlvbiggaHRtbCApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1 bmN0aW9uKGkpIHsKCQkJalF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlv biA/IGh0bWwuY2FsbCh0aGlzLCBpKSA6IGh0bWwgKTsKCQl9KTsKCX0sCgoJdW53 cmFwOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1 bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5 IiApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hp bGROb2RlcyApOwoJCQl9CgkJfSkuZW5kKCk7Cgl9Cn0pOwoKCmpRdWVyeS5leHBy LmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBTdXBwb3J0 OiBPcGVyYSA8PSAxMi4xMgoJLy8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMg YW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFuIHplcm8gb24gc29tZSBlbGVtZW50 cwoJcmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPD0gMCAmJiBlbGVtLm9mZnNldEhl aWdodCA8PSAwIHx8CgkJKCFzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygp ICYmCgkJCSgoZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkpIHx8IGpR dWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApKSA9PT0gIm5vbmUiKTsKfTsKCmpR dWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJ cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiggZWxlbSApOwp9OwoK CgoKdmFyIHIyMCA9IC8lMjAvZywKCXJicmFja2V0ID0gL1xbXF0kLywKCXJDUkxG ID0gL1xyP1xuL2csCglyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0 b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksCglyc3VibWl0dGFibGUgPSAvXig/Omlu cHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7CgpmdW5jdGlvbiBidWlsZFBh cmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7Cgl2YXIgbmFt ZTsKCglpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHsKCQkvLyBTZXJpYWxp emUgYXJyYXkgaXRlbS4KCQlqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwg diApIHsKCQkJaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVm aXggKSApIHsKCQkJCS8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxh ci4KCQkJCWFkZCggcHJlZml4LCB2ICk7CgoJCQl9IGVsc2UgewoJCQkJLy8gSXRl bSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51 bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0 eXBlb2YgdiA9PT0gIm9iamVjdCIgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0 aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlv bmFsICYmIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgkJLy8g U2VyaWFsaXplIG9iamVjdCBpdGVtLgoJCWZvciAoIG5hbWUgaW4gb2JqICkgewoJ CQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgbmFtZSArICJdIiwgb2JqWyBu YW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTsKCQl9CgoJfSBlbHNlIHsKCQkvLyBT ZXJpYWxpemUgc2NhbGFyIGl0ZW0uCgkJYWRkKCBwcmVmaXgsIG9iaiApOwoJfQp9 CgovLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNl dCBvZgovLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKalF1ZXJ5LnBh cmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkgewoJdmFyIHByZWZpeCwK CQlzID0gW10sCgkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCS8v IElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0 cyB2YWx1ZQoJCQl2YWx1ZSA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApID8g dmFsdWUoKSA6ICggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQkJc1sg cy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyAiPSIgKyBl bmNvZGVVUklDb21wb25lbnQoIHZhbHVlICk7CgkJfTsKCgkvLyBTZXQgdHJhZGl0 aW9uYWwgdG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLgoJaWYg KCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkgewoJCXRyYWRpdGlvbmFsID0g alF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRp dGlvbmFsOwoJfQoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3Vt ZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIGpR dWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxh aW5PYmplY3QoIGEgKSApICkgewoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVt ZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlz Lm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9KTsKCgl9IGVsc2UgewoJCS8vIElmIHRy YWRpdGlvbmFsLCBlbmNvZGUgdGhlICJvbGQiIHdheSAodGhlIHdheSAxLjMuMiBv ciBvbGRlcgoJCS8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJl Y3Vyc2l2ZWx5LgoJCWZvciAoIHByZWZpeCBpbiBhICkgewoJCQlidWlsZFBhcmFt cyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCX0K CX0KCgkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCglyZXR1 cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwp9OwoKalF1ZXJ5 LmZuLmV4dGVuZCh7CglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBq UXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCXNlcmlh bGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rp b24oKSB7CgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8g ZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpR dWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50 cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0pCgkJ LmZpbHRlcihmdW5jdGlvbigpIHsKCQkJdmFyIHR5cGUgPSB0aGlzLnR5cGU7CgkJ CS8vIFVzZSAuaXMoIjpkaXNhYmxlZCIpIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJs ZWRdIHdvcmtzCgkJCXJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyAp LmlzKCAiOmRpc2FibGVkIiApICYmCgkJCQlyc3VibWl0dGFibGUudGVzdCggdGhp cy5ub2RlTmFtZSApICYmICFyc3VibWl0dGVyVHlwZXMudGVzdCggdHlwZSApICYm CgkJCQkoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlw ZSApICk7CgkJfSkKCQkubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICkgewoJCQl2YXIg dmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CgoJCQlyZXR1cm4gdmFsID09IG51 bGwgPwoJCQkJbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwoJCQkJ CWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQkJcmV0dXJu IHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAi XHJcbiIgKSB9OwoJCQkJCX0pIDoKCQkJCQl7IG5hbWU6IGVsZW0ubmFtZSwgdmFs dWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9KS5nZXQoKTsK CX0KfSk7CgoKLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdAovLyAoVGhpcyBp cyBzdGlsbCBhdHRhY2hlZCB0byBhamF4U2V0dGluZ3MgZm9yIGJhY2t3YXJkIGNv bXBhdGliaWxpdHkpCmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gd2luZG93LkFj dGl2ZVhPYmplY3QgIT09IHVuZGVmaW5lZCA/CgkvLyBTdXBwb3J0OiBJRTYrCglm dW5jdGlvbigpIHsKCgkJLy8gWEhSIGNhbm5vdCBhY2Nlc3MgbG9jYWwgZmlsZXMs IGFsd2F5cyB1c2UgQWN0aXZlWCBmb3IgdGhhdCBjYXNlCgkJcmV0dXJuICF0aGlz LmlzTG9jYWwgJiYKCgkJCS8vIFN1cHBvcnQ6IElFNy04CgkJCS8vIG9sZElFIFhI UiBkb2VzIG5vdCBzdXBwb3J0IG5vbi1SRkMyNjE2IG1ldGhvZHMgKCMxMzI0MCkK CQkJLy8gU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFy eS9pZS9tczUzNjY0OCh2PXZzLjg1KS5hc3B4CgkJCS8vIGFuZCBodHRwOi8vd3d3 LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzkuaHRtbCNzZWM5 CgkJCS8vIEFsdGhvdWdoIHRoaXMgY2hlY2sgZm9yIHNpeCBtZXRob2RzIGluc3Rl YWQgb2YgZWlnaHQKCQkJLy8gc2luY2UgSUUgYWxzbyBkb2VzIG5vdCBzdXBwb3J0 ICJ0cmFjZSIgYW5kICJjb25uZWN0IgoJCQkvXihnZXR8cG9zdHxoZWFkfHB1dHxk ZWxldGV8b3B0aW9ucykkL2kudGVzdCggdGhpcy50eXBlICkgJiYKCgkJCWNyZWF0 ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7Cgl9IDoKCS8vIEZv ciBhbGwgb3RoZXIgYnJvd3NlcnMsIHVzZSB0aGUgc3RhbmRhcmQgWE1MSHR0cFJl cXVlc3Qgb2JqZWN0CgljcmVhdGVTdGFuZGFyZFhIUjsKCnZhciB4aHJJZCA9IDAs Cgl4aHJDYWxsYmFja3MgPSB7fSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4 U2V0dGluZ3MueGhyKCk7CgovLyBTdXBwb3J0OiBJRTwxMAovLyBPcGVuIHJlcXVl c3RzIG11c3QgYmUgbWFudWFsbHkgYWJvcnRlZCBvbiB1bmxvYWQgKCM1MjgwKQpp ZiAoIHdpbmRvdy5BY3RpdmVYT2JqZWN0ICkgewoJalF1ZXJ5KCB3aW5kb3cgKS5v biggInVubG9hZCIsIGZ1bmN0aW9uKCkgewoJCWZvciAoIHZhciBrZXkgaW4geGhy Q2FsbGJhY2tzICkgewoJCQl4aHJDYWxsYmFja3NbIGtleSBdKCB1bmRlZmluZWQs IHRydWUgKTsKCQl9Cgl9KTsKfQoKLy8gRGV0ZXJtaW5lIHN1cHBvcnQgcHJvcGVy dGllcwpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3Jl ZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwp4aHJTdXBwb3J0ZWQgPSBzdXBw b3J0LmFqYXggPSAhIXhoclN1cHBvcnRlZDsKCi8vIENyZWF0ZSB0cmFuc3BvcnQg aWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggeGhyU3VwcG9y dGVkICkgewoKCWpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBvcHRpb25z ICkgewoJCS8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVk IHRocm91Z2ggWE1MSHR0cFJlcXVlc3QKCQlpZiAoICFvcHRpb25zLmNyb3NzRG9t YWluIHx8IHN1cHBvcnQuY29ycyApIHsKCgkJCXZhciBjYWxsYmFjazsKCgkJCXJl dHVybiB7CgkJCQlzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7 CgkJCQkJdmFyIGksCgkJCQkJCXhociA9IG9wdGlvbnMueGhyKCksCgkJCQkJCWlk ID0gKyt4aHJJZDsKCgkJCQkJLy8gT3BlbiB0aGUgc29ja2V0CgkJCQkJeGhyLm9w ZW4oIG9wdGlvbnMudHlwZSwgb3B0aW9ucy51cmwsIG9wdGlvbnMuYXN5bmMsIG9w dGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQgKTsKCgkJCQkJLy8gQXBw bHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggb3B0aW9ucy54 aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMg KSB7CgkJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJ CQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVk ZWQKCQkJCQlpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWlt ZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1p bWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRl cgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBj b25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEg amlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJl LgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0 IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1l LWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5 IHByb3ZpZGVkLgoJCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhl YWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1siWC1S ZXF1ZXN0ZWQtV2l0aCJdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCQl9CgoJCQkJ CS8vIFNldCBoZWFkZXJzCgkJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJ CQkvLyBTdXBwb3J0OiBJRTw5CgkJCQkJCS8vIElFJ3MgQWN0aXZlWE9iamVjdCB0 aHJvd3MgYSAnVHlwZSBNaXNtYXRjaCcgZXhjZXB0aW9uIHdoZW4gc2V0dGluZwoJ CQkJCQkvLyByZXF1ZXN0IGhlYWRlciB0byBhIG51bGwtdmFsdWUuCgkJCQkJCS8v CgkJCQkJCS8vIFRvIGtlZXAgY29uc2lzdGVudCB3aXRoIG90aGVyIFhIUiBpbXBs ZW1lbnRhdGlvbnMsIGNhc3QgdGhlIHZhbHVlCgkJCQkJCS8vIHRvIHN0cmluZyBh bmQgaWdub3JlIGB1bmRlZmluZWRgLgoJCQkJCQlpZiAoIGhlYWRlcnNbIGkgXSAh PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIGks IGhlYWRlcnNbIGkgXSArICIiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIERv IHNlbmQgdGhlIHJlcXVlc3QKCQkJCQkvLyBUaGlzIG1heSByYWlzZSBhbiBleGNl cHRpb24gd2hpY2ggaXMgYWN0dWFsbHkKCQkJCQkvLyBoYW5kbGVkIGluIGpRdWVy eS5hamF4IChzbyBubyB0cnkvY2F0Y2ggaGVyZSkKCQkJCQl4aHIuc2VuZCggKCBv cHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhICkgfHwgbnVsbCApOwoK CQkJCQkvLyBMaXN0ZW5lcgoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlz QWJvcnQgKSB7CgkJCQkJCXZhciBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNl czsKCgkJCQkJCS8vIFdhcyBuZXZlciBjYWxsZWQgYW5kIGlzIGFib3J0ZWQgb3Ig Y29tcGxldGUKCQkJCQkJaWYgKCBjYWxsYmFjayAmJiAoIGlzQWJvcnQgfHwgeGhy LnJlYWR5U3RhdGUgPT09IDQgKSApIHsKCQkJCQkJCS8vIENsZWFuIHVwCgkJCQkJ CQlkZWxldGUgeGhyQ2FsbGJhY2tzWyBpZCBdOwoJCQkJCQkJY2FsbGJhY2sgPSB1 bmRlZmluZWQ7CgkJCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5 Lm5vb3A7CgoJCQkJCQkJLy8gQWJvcnQgbWFudWFsbHkgaWYgbmVlZGVkCgkJCQkJ CQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSAh PT0gNCApIHsKCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJfQoJCQkJCQkJ fSBlbHNlIHsKCQkJCQkJCQlyZXNwb25zZXMgPSB7fTsKCQkJCQkJCQlzdGF0dXMg PSB4aHIuc3RhdHVzOwoKCQkJCQkJCQkvLyBTdXBwb3J0OiBJRTwxMAoJCQkJCQkJ CS8vIEFjY2Vzc2luZyBiaW5hcnktZGF0YSByZXNwb25zZVRleHQgdGhyb3dzIGFu IGV4Y2VwdGlvbgoJCQkJCQkJCS8vICgjMTE0MjYpCgkJCQkJCQkJaWYgKCB0eXBl b2YgeGhyLnJlc3BvbnNlVGV4dCA9PT0gInN0cmluZyIgKSB7CgkJCQkJCQkJCXJl c3BvbnNlcy50ZXh0ID0geGhyLnJlc3BvbnNlVGV4dDsKCQkJCQkJCQl9CgoJCQkJ CQkJCS8vIEZpcmVmb3ggdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2lu ZwoJCQkJCQkJCS8vIHN0YXR1c1RleHQgZm9yIGZhdWx0eSBjcm9zcy1kb21haW4g cmVxdWVzdHMKCQkJCQkJCQl0cnkgewoJCQkJCQkJCQlzdGF0dXNUZXh0ID0geGhy LnN0YXR1c1RleHQ7CgkJCQkJCQkJfSBjYXRjaCggZSApIHsKCQkJCQkJCQkJLy8g V2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNU ZXh0CgkJCQkJCQkJCXN0YXR1c1RleHQgPSAiIjsKCQkJCQkJCQl9CgoJCQkJCQkJ CS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJ CQkJCQkJLy8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0 YTogYXNzdW1lIGEgc3VjY2VzcwoJCQkJCQkJCS8vIChzdWNjZXNzIHdpdGggbm8g ZGF0YSB3b24ndCBnZXQgbm90aWZpZWQsIHRoYXQncyB0aGUgYmVzdCB3ZQoJCQkJ CQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJ CQkJCQlpZiAoICFzdGF0dXMgJiYgb3B0aW9ucy5pc0xvY2FsICYmICFvcHRpb25z LmNyb3NzRG9tYWluICkgewoJCQkJCQkJCQlzdGF0dXMgPSByZXNwb25zZXMudGV4 dCA/IDIwMCA6IDQwNDsKCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMg cmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCX0gZWxz ZSBpZiAoIHN0YXR1cyA9PT0gMTIyMyApIHsKCQkJCQkJCQkJc3RhdHVzID0gMjA0 OwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJLy8gQ2FsbCBjb21w bGV0ZSBpZiBuZWVkZWQKCQkJCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQkJCQlj b21wbGV0ZSggc3RhdHVzLCBzdGF0dXNUZXh0LCByZXNwb25zZXMsIHhoci5nZXRB bGxSZXNwb25zZUhlYWRlcnMoKSApOwoJCQkJCQl9CgkJCQkJfTsKCgkJCQkJaWYg KCAhb3B0aW9ucy5hc3luYyApIHsKCQkJCQkJLy8gaWYgd2UncmUgaW4gc3luYyBt b2RlIHdlIGZpcmUgdGhlIGNhbGxiYWNrCgkJCQkJCWNhbGxiYWNrKCk7CgkJCQkJ fSBlbHNlIGlmICggeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7CgkJCQkJCS8vIChJ RTYgJiBJRTcpIGlmIGl0J3MgaW4gY2FjaGUgYW5kIGhhcyBiZWVuCgkJCQkJCS8v IHJldHJpZXZlZCBkaXJlY3RseSB3ZSBuZWVkIHRvIGZpcmUgdGhlIGNhbGxiYWNr CgkJCQkJCXNldFRpbWVvdXQoIGNhbGxiYWNrICk7CgkJCQkJfSBlbHNlIHsKCQkJ CQkJLy8gQWRkIHRvIHRoZSBsaXN0IG9mIGFjdGl2ZSB4aHIgY2FsbGJhY2tzCgkJ CQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB4aHJDYWxsYmFja3NbIGlkIF0g PSBjYWxsYmFjazsKCQkJCQl9CgkJCQl9LAoKCQkJCWFib3J0OiBmdW5jdGlvbigp IHsKCQkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCQljYWxsYmFjayggdW5kZWZp bmVkLCB0cnVlICk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CgovLyBG dW5jdGlvbnMgdG8gY3JlYXRlIHhocnMKZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRY SFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0 KCk7Cgl9IGNhdGNoKCBlICkge30KfQoKZnVuY3Rpb24gY3JlYXRlQWN0aXZlWEhS KCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCAi TWljcm9zb2Z0LlhNTEhUVFAiICk7Cgl9IGNhdGNoKCBlICkge30KfQoKCgoKLy8g SW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCh7CglhY2Nl cHRzOiB7CgkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9q YXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94 LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC8oPzpqYXZh fGVjbWEpc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQi OiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQg KTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdz IHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAi c2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVm aW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21h aW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0K fSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFq YXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0 cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJ aWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0g ZG9jdW1lbnQuaGVhZCB8fCBqUXVlcnkoImhlYWQiKVswXSB8fCBkb2N1bWVudC5k b2N1bWVudEVsZW1lbnQ7CgoJCXJldHVybiB7CgoJCQlzZW5kOiBmdW5jdGlvbigg XywgY2FsbGJhY2sgKSB7CgoJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxl bWVudCgic2NyaXB0Iik7CgoJCQkJc2NyaXB0LmFzeW5jID0gdHJ1ZTsKCgkJCQlp ZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMu c2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJ CQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlw dC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24o IF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJl YWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5 U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJ CQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9 IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIHNj cmlwdC5wYXJlbnROb2RlICkgewoJCQkJCQkJc2NyaXB0LnBhcmVudE5vZGUucmVt b3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQkJCQl9CgoJCQkJCQkvLyBEZXJlZmVyZW5j ZSB0aGUgc2NyaXB0CgkJCQkJCXNjcmlwdCA9IG51bGw7CgoJCQkJCQkvLyBDYWxs YmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJ CWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJ fTsKCgkJCQkvLyBDaXJjdW12ZW50IElFNiBidWdzIHdpdGggYmFzZSBlbGVtZW50 cyAoIzI3MDkgYW5kICM0Mzc4KSBieSBwcmVwZW5kaW5nCgkJCQkvLyBVc2UgbmF0 aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVgg dHJpY2tlcnkKCQkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmly c3RDaGlsZCApOwoJCQl9LAoKCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJaWYg KCBzY3JpcHQgKSB7CgkJCQkJc2NyaXB0Lm9ubG9hZCggdW5kZWZpbmVkLCB0cnVl ICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKCgoKCnZhciBvbGRDYWxsYmFja3Mg PSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0 IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoewoJanNvbnA6ICJjYWxs YmFjayIsCglqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHsKCQl2YXIgY2FsbGJh Y2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArICJf IiArICggbm9uY2UrKyApICk7CgkJdGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7CgkJ cmV0dXJuIGNhbGxiYWNrOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9w dGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpq UXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywg b3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGNhbGxiYWNrTmFtZSwg b3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLAoJCWpzb25Qcm9wID0gcy5q c29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/CgkJCSJ1 cmwiIDoKCQkJdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgJiYgISggcy5jb250 ZW50VHlwZSB8fCAiIiApLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0t dXJsZW5jb2RlZCIpICYmIHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiAiZGF0YSIK CQkpOwoKCS8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyAi anNvbnAiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0CglpZiAoIGpzb25Q cm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09ICJqc29ucCIgKSB7CgoJCS8vIEdl dCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBh c3NvY2lhdGVkIHdpdGggaXQKCQljYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJh Y2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgPwoJCQlz Lmpzb25wQ2FsbGJhY2soKSA6CgkJCXMuanNvbnBDYWxsYmFjazsKCgkJLy8gSW5z ZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YQoJCWlmICgganNvblBy b3AgKSB7CgkJCXNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2Uo IHJqc29ucCwgIiQxIiArIGNhbGxiYWNrTmFtZSApOwoJCX0gZWxzZSBpZiAoIHMu anNvbnAgIT09IGZhbHNlICkgewoJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBz LnVybCApID8gIiYiIDogIj8iICkgKyBzLmpzb25wICsgIj0iICsgY2FsbGJhY2tO YW1lOwoJCX0KCgkJLy8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpz b24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvbgoJCXMuY29udmVydGVyc1sic2NyaXB0 IGpzb24iXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5l ciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90 IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAg XTsKCQl9OwoKCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNb IDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0 dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNr TmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJn dW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRl ciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyhmdW5jdGlvbigpIHsKCQkJLy8g UmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZQoJCQl3aW5kb3dbIGNhbGxiYWNrTmFt ZSBdID0gb3ZlcndyaXR0ZW47CgoJCQkvLyBTYXZlIGJhY2sgYXMgZnJlZQoJCQlp ZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewoJCQkJLy8gbWFrZSBzdXJlIHRoYXQg cmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5k CgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2Fs bGJhY2s7CgoJCQkJLy8gc2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJl IHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9 CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEg cmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNG dW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKCQkJCW92ZXJ3cml0dGVuKCByZXNw b25zZUNvbnRhaW5lclsgMCBdICk7CgkJCX0KCgkJCXJlc3BvbnNlQ29udGFpbmVy ID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7CgkJfSk7CgoJCS8vIERlbGVnYXRl IHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSk7CgoKCgovLyBkYXRh OiBzdHJpbmcgb2YgaHRtbAovLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNp ZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRl eHQsIGRlZmF1bHRzIHRvIGRvY3VtZW50Ci8vIGtlZXBTY3JpcHRzIChvcHRpb25h bCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUg aHRtbCBzdHJpbmcKalF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBj b250ZXh0LCBrZWVwU2NyaXB0cyApIHsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRh dGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoJaWYgKCB0eXBl b2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29u dGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9Cgljb250ZXh0ID0gY29udGV4dCB8 fCBkb2N1bWVudDsKCgl2YXIgcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRh ICksCgkJc2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTsKCgkvLyBTaW5nbGUg dGFnCglpZiAoIHBhcnNlZCApIHsKCQlyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVs ZW1lbnQoIHBhcnNlZFsxXSApIF07Cgl9CgoJcGFyc2VkID0galF1ZXJ5LmJ1aWxk RnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBz Y3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyAp LnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQu Y2hpbGROb2RlcyApOwp9OwoKCi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9h ZCBtZXRob2QKdmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7CgovKioKICogTG9h ZCBhIHVybCBpbnRvIGEgcGFnZQogKi8KalF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlv biggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkgewoJaWYgKCB0eXBlb2YgdXJsICE9 PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKCQlyZXR1cm4gX2xvYWQuYXBwbHkoIHRo aXMsIGFyZ3VtZW50cyApOwoJfQoKCXZhciBzZWxlY3RvciwgcmVzcG9uc2UsIHR5 cGUsCgkJc2VsZiA9IHRoaXMsCgkJb2ZmID0gdXJsLmluZGV4T2YoIiAiKTsKCglp ZiAoIG9mZiA+PSAwICkgewoJCXNlbGVjdG9yID0galF1ZXJ5LnRyaW0oIHVybC5z bGljZSggb2ZmLCB1cmwubGVuZ3RoICkgKTsKCQl1cmwgPSB1cmwuc2xpY2UoIDAs IG9mZiApOwoJfQoKCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJaWYgKCBqUXVlcnku aXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CgoJCS8vIFdlIGFzc3VtZSB0aGF0IGl0 J3MgdGhlIGNhbGxiYWNrCgkJY2FsbGJhY2sgPSBwYXJhbXM7CgkJcGFyYW1zID0g dW5kZWZpbmVkOwoKCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcK CX0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0 IiApIHsKCQl0eXBlID0gIlBPU1QiOwoJfQoKCS8vIElmIHdlIGhhdmUgZWxlbWVu dHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0CglpZiAoIHNlbGYubGVuZ3Ro ID4gMCApIHsKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoKCQkJLy8gaWYg InR5cGUiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiAiR0VUIiBtZXRob2Qg d2lsbCBiZSB1c2VkCgkJCXR5cGU6IHR5cGUsCgkJCWRhdGFUeXBlOiAiaHRtbCIs CgkJCWRhdGE6IHBhcmFtcwoJCX0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4 dCApIHsKCgkJCS8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBj YWxsYmFjawoJCQlyZXNwb25zZSA9IGFyZ3VtZW50czsKCgkJCXNlbGYuaHRtbCgg c2VsZWN0b3IgPwoKCQkJCS8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwg bG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdgoJCQkJLy8g RXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcg ZXJyb3JzCgkJCQlqUXVlcnkoIjxkaXY+IikuYXBwZW5kKCBqUXVlcnkucGFyc2VI VE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8v IE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQg KTsKCgkJfSkuY29tcGxldGUoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwg c3RhdHVzICkgewoJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCByZXNwb25zZSB8fCBb IGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJfSk7Cgl9 CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgpqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1h dGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoalF1 ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkgewoJCXJldHVybiBlbGVtID09PSBm bi5lbGVtOwoJfSkubGVuZ3RoOwp9OwoKCgoKCnZhciBkb2NFbGVtID0gd2luZG93 LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCi8qKgogKiBHZXRzIGEgd2luZG93 IGZyb20gYW4gZWxlbWVudAogKi8KZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkg ewoJcmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8KCQllbGVtIDoKCQll bGVtLm5vZGVUeXBlID09PSA5ID8KCQkJZWxlbS5kZWZhdWx0VmlldyB8fCBlbGVt LnBhcmVudFdpbmRvdyA6CgkJCWZhbHNlOwp9CgpqUXVlcnkub2Zmc2V0ID0gewoJ c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIg Y3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZz ZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9 IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpR dWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBzZXQgcG9zaXRpb24g Zmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBl bGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5 bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3Vy RWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAi dG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIg KTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0 ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQlqUXVlcnkuaW5BcnJh eSgiYXV0byIsIFsgY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0IF0gKSA+IC0xOwoKCQkv LyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhl ciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJz b2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQlj dXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3Vy UG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9 IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAw OwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJ fQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9w dGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0K CgkJaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgewoJCQlwcm9wcy50b3AgPSAo IG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wOwoJCX0KCQlp ZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgewoJCQlwcm9wcy5sZWZ0ID0gKCBv cHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDsKCQl9CgoJ CWlmICggInVzaW5nIiBpbiBvcHRpb25zICkgewoJCQlvcHRpb25zLnVzaW5nLmNh bGwoIGVsZW0sIHByb3BzICk7CgkJfSBlbHNlIHsKCQkJY3VyRWxlbS5jc3MoIHBy b3BzICk7CgkJfQoJfQp9OwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglvZmZzZXQ6IGZ1 bmN0aW9uKCBvcHRpb25zICkgewoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsK CQkJcmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CgkJCQl0aGlzIDoKCQkJ CXRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNl dE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSk7CgkJfQoKCQl2YXIg ZG9jRWxlbSwgd2luLAoJCQlib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAoJCQll bGVtID0gdGhpc1sgMCBdLAoJCQlkb2MgPSBlbGVtICYmIGVsZW0ub3duZXJEb2N1 bWVudDsKCgkJaWYgKCAhZG9jICkgewoJCQlyZXR1cm47CgkJfQoKCQlkb2NFbGVt ID0gZG9jLmRvY3VtZW50RWxlbWVudDsKCgkJLy8gTWFrZSBzdXJlIGl0J3Mgbm90 IGEgZGlzY29ubmVjdGVkIERPTSBub2RlCgkJaWYgKCAhalF1ZXJ5LmNvbnRhaW5z KCBkb2NFbGVtLCBlbGVtICkgKSB7CgkJCXJldHVybiBib3g7CgkJfQoKCQkvLyBJ ZiB3ZSBkb24ndCBoYXZlIGdCQ1IsIGp1c3QgdXNlIDAsMCByYXRoZXIgdGhhbiBl cnJvcgoJCS8vIEJsYWNrQmVycnkgNSwgaU9TIDMgKG9yaWdpbmFsIGlQaG9uZSkK CQlpZiAoIHR5cGVvZiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gc3Ry dW5kZWZpbmVkICkgewoJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVj dCgpOwoJCX0KCQl3aW4gPSBnZXRXaW5kb3coIGRvYyApOwoJCXJldHVybiB7CgkJ CXRvcDogYm94LnRvcCAgKyAoIHdpbi5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNj cm9sbFRvcCApICAtICggZG9jRWxlbS5jbGllbnRUb3AgIHx8IDAgKSwKCQkJbGVm dDogYm94LmxlZnQgKyAoIHdpbi5wYWdlWE9mZnNldCB8fCBkb2NFbGVtLnNjcm9s bExlZnQgKSAtICggZG9jRWxlbS5jbGllbnRMZWZ0IHx8IDAgKQoJCX07Cgl9LAoK CXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWyAwIF0gKSB7CgkJ CXJldHVybjsKCQl9CgoJCXZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwKCQkJcGFy ZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfSwKCQkJZWxlbSA9IHRoaXNb IDAgXTsKCgkJLy8gZml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHdpbmRv dyAocGFyZW50T2Zmc2V0ID0ge3RvcDowLCBsZWZ0OiAwfSwgYmVjYXVzZSBpdCBp cyBpdHMgb25seSBvZmZzZXQgcGFyZW50CgkJaWYgKCBqUXVlcnkuY3NzKCBlbGVt LCAicG9zaXRpb24iICkgPT09ICJmaXhlZCIgKSB7CgkJCS8vIHdlIGFzc3VtZSB0 aGF0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpcyBhdmFpbGFibGUgd2hlbiBjb21w dXRlZCBwb3NpdGlvbiBpcyBmaXhlZAoJCQlvZmZzZXQgPSBlbGVtLmdldEJvdW5k aW5nQ2xpZW50UmVjdCgpOwoJCX0gZWxzZSB7CgkJCS8vIEdldCAqcmVhbCogb2Zm c2V0UGFyZW50CgkJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCk7 CgoJCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCgkJCW9mZnNldCA9IHRoaXMub2Zm c2V0KCk7CgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAw IF0sICJodG1sIiApICkgewoJCQkJcGFyZW50T2Zmc2V0ID0gb2Zmc2V0UGFyZW50 Lm9mZnNldCgpOwoJCQl9CgoJCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMK CQkJcGFyZW50T2Zmc2V0LnRvcCAgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50 WyAwIF0sICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJcGFyZW50T2Zmc2V0 LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sICJib3JkZXJM ZWZ0V2lkdGgiLCB0cnVlICk7CgkJfQoKCQkvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zm c2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zCgkJLy8gbm90ZTogd2hlbiBhbiBlbGVt ZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxl ZnQKCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0Lmxl ZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNl dC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sICJt YXJnaW5Ub3AiLCB0cnVlICksCgkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50 T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luTGVmdCIsIHRy dWUpCgkJfTsKCX0sCgoJb2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHsKCQlyZXR1 cm4gdGhpcy5tYXAoZnVuY3Rpb24oKSB7CgkJCXZhciBvZmZzZXRQYXJlbnQgPSB0 aGlzLm9mZnNldFBhcmVudCB8fCBkb2NFbGVtOwoKCQkJd2hpbGUgKCBvZmZzZXRQ YXJlbnQgJiYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnQsICJodG1s IiApICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgInBvc2l0aW9uIiApID09 PSAic3RhdGljIiApICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50 Lm9mZnNldFBhcmVudDsKCQkJfQoJCQlyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRv Y0VsZW07CgkJfSk7Cgl9Cn0pOwoKLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNj cm9sbFRvcCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6ICJwYWdl WE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0IiB9LCBmdW5jdGlvbigg bWV0aG9kLCBwcm9wICkgewoJdmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7CgoJ alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJcmV0dXJu IGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgewoJ CQl2YXIgd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQlpZiAoIHZhbCA9PT0g dW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHdpbiA/IChwcm9wIGluIHdpbikgPyB3 aW5bIHByb3AgXSA6CgkJCQkJd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsg bWV0aG9kIF0gOgoJCQkJCWVsZW1bIG1ldGhvZCBdOwoJCQl9CgoJCQlpZiAoIHdp biApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhdG9wID8gdmFsIDogalF1ZXJ5 KCB3aW4gKS5zY3JvbGxMZWZ0KCksCgkJCQkJdG9wID8gdmFsIDogalF1ZXJ5KCB3 aW4gKS5zY3JvbGxUb3AoKQoJCQkJKTsKCgkJCX0gZWxzZSB7CgkJCQllbGVtWyBt ZXRob2QgXSA9IHZhbDsKCQkJfQoJCX0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMu bGVuZ3RoLCBudWxsICk7Cgl9Owp9KTsKCi8vIEFkZCB0aGUgdG9wL2xlZnQgY3Nz SG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uCi8vIFdlYmtpdCBidWc6IGh0 dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NAovLyBn ZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBm b3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0Ci8vIHJhdGhlciB0aGFuIG1ha2UgdGhl IGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCB3ZSBqdXN0 IGNoZWNrIGZvciBpdCBoZXJlCmpRdWVyeS5lYWNoKCBbICJ0b3AiLCAibGVmdCIg XSwgZnVuY3Rpb24oIGksIHByb3AgKSB7CglqUXVlcnkuY3NzSG9va3NbIHByb3Ag XSA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5waXhlbFBvc2l0aW9uLAoJCWZ1bmN0 aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJ CWNvbXB1dGVkID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7CgkJCQkvLyBpZiBjdXJD U1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJl dHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBl bGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7 CgkJCX0KCQl9CgkpOwp9KTsKCgovLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVy V2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRo IG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiAiaGVpZ2h0IiwgV2lkdGg6 ICJ3aWR0aCIgfSwgZnVuY3Rpb24oIG5hbWUsIHR5cGUgKSB7CglqUXVlcnkuZWFj aCggeyBwYWRkaW5nOiAiaW5uZXIiICsgbmFtZSwgY29udGVudDogdHlwZSwgIiI6 ICJvdXRlciIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNO YW1lICkgewoJCS8vIG1hcmdpbiBpcyBvbmx5IGZvciBvdXRlckhlaWdodCwgb3V0 ZXJXaWR0aAoJCWpRdWVyeS5mblsgZnVuY05hbWUgXSA9IGZ1bmN0aW9uKCBtYXJn aW4sIHZhbHVlICkgewoJCQl2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0 aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSAiYm9vbGVh biIgKSwKCQkJCWV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0 cnVlIHx8IHZhbHVlID09PSB0cnVlID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApOwoK CQkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZh bHVlICkgewoJCQkJdmFyIGRvYzsKCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdygg ZWxlbSApICkgewoJCQkJCS8vIEFzIG9mIDUvOC8yMDEyIHRoaXMgd2lsbCB5aWVs ZCBpbmNvcnJlY3QgcmVzdWx0cyBmb3IgTW9iaWxlIFNhZmFyaSwgYnV0IHRoZXJl CgkJCQkJLy8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCBy ZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOgoJCQkJCS8vIGh0dHBz Oi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNzY0CgkJCQkJcmV0dXJu IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUg XTsKCQkJCX0KCgkJCQkvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0CgkJ CQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCQkJZG9jID0gZWxlbS5k b2N1bWVudEVsZW1lbnQ7CgoJCQkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVp Z2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVp Z2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXN0CgkJCQkJLy8gdW5mb3J0dW5hdGVs eSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84IG9ubHksIGJ1dCB0aGVy ZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC4KCQkJ CQlyZXR1cm4gTWF0aC5tYXgoCgkJCQkJCWVsZW0uYm9keVsgInNjcm9sbCIgKyBu YW1lIF0sIGRvY1sgInNjcm9sbCIgKyBuYW1lIF0sCgkJCQkJCWVsZW0uYm9keVsg Im9mZnNldCIgKyBuYW1lIF0sIGRvY1sgIm9mZnNldCIgKyBuYW1lIF0sCgkJCQkJ CWRvY1sgImNsaWVudCIgKyBuYW1lIF0KCQkJCQkpOwoJCQkJfQoKCQkJCXJldHVy biB2YWx1ZSA9PT0gdW5kZWZpbmVkID8KCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVp Z2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBw YXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6 CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJ CQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9 LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJs ZSwgbnVsbCApOwoJCX07Cgl9KTsKfSk7CgoKLy8gVGhlIG51bWJlciBvZiBlbGVt ZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKalF1ZXJ5 LmZuLnNpemUgPSBmdW5jdGlvbigpIHsKCXJldHVybiB0aGlzLmxlbmd0aDsKfTsK CmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7CgoKCgovLyBS ZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4g YmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXIKLy8gZmlsZXMgdGhhdCBtYXkgdXNl IGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3Jp cHQgdGhhdAovLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEg bmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3QKLy8gd2F5IHRvIHJl Z2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9k dWxlIG5hbWVzIGFyZQovLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpR dWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2UKLy8gZmls ZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhh dCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzCi8vIHRvIGNhbGwgbm9Db25mbGljdCB0 byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay4KCi8v IE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRo YXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkCi8vIGRlY2xhcmUgdGhlbXNlbHZlcyBh cyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwg aWYgYW4KLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVj aWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLy8gaHR0cHM6Ly9n aXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3Rp bmctbGlicmFyaWVzI3dpa2ktYW5vbgoKaWYgKCB0eXBlb2YgZGVmaW5lID09PSAi ZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgKSB7CglkZWZpbmUoICJqcXVlcnkiLCBb XSwgZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeTsKCX0pOwp9CgoKCgp2YXIK CS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJX2pRdWVy eSA9IHdpbmRvdy5qUXVlcnksCgoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBv ZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQ7CgpqUXVlcnkubm9Db25mbGljdCA9 IGZ1bmN0aW9uKCBkZWVwICkgewoJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkg ewoJCXdpbmRvdy4kID0gXyQ7Cgl9CgoJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVl cnkgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTsKCX0K CglyZXR1cm4galF1ZXJ5Owp9OwoKLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVu dGlmaWVycywgZXZlbiBpbgovLyBBTUQgKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBz Oi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KQovLyBhbmQgQ29t bW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpCmlmICggdHlwZW9m IG5vR2xvYmFsID09PSBzdHJ1bmRlZmluZWQgKSB7Cgl3aW5kb3cualF1ZXJ5ID0g d2luZG93LiQgPSBqUXVlcnk7Cn0KCgoKCnJldHVybiBqUXVlcnk7Cgp9KSk7Cg== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=jquery-ui.js Content-Type: application/javascript; charset=utf-8; name=jquery-ui.js Content-Location: http://code.jquery.com/ui/1.10.0/jquery-ui.js Content-Transfer-Encoding: Base64 LyohIGpRdWVyeSBVSSAtIHYxLjEwLjAgLSAyMDEzLTAxLTE3CiogaHR0cDovL2px dWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBqcXVlcnkudWkuY29yZS5qcywganF1ZXJ5 LnVpLndpZGdldC5qcywganF1ZXJ5LnVpLm1vdXNlLmpzLCBqcXVlcnkudWkuZHJh Z2dhYmxlLmpzLCBqcXVlcnkudWkuZHJvcHBhYmxlLmpzLCBqcXVlcnkudWkucmVz aXphYmxlLmpzLCBqcXVlcnkudWkuc2VsZWN0YWJsZS5qcywganF1ZXJ5LnVpLnNv cnRhYmxlLmpzLCBqcXVlcnkudWkuZWZmZWN0LmpzLCBqcXVlcnkudWkuYWNjb3Jk aW9uLmpzLCBqcXVlcnkudWkuYXV0b2NvbXBsZXRlLmpzLCBqcXVlcnkudWkuYnV0 dG9uLmpzLCBqcXVlcnkudWkuZGF0ZXBpY2tlci5qcywganF1ZXJ5LnVpLmRpYWxv Zy5qcywganF1ZXJ5LnVpLmVmZmVjdC1ibGluZC5qcywganF1ZXJ5LnVpLmVmZmVj dC1ib3VuY2UuanMsIGpxdWVyeS51aS5lZmZlY3QtY2xpcC5qcywganF1ZXJ5LnVp LmVmZmVjdC1kcm9wLmpzLCBqcXVlcnkudWkuZWZmZWN0LWV4cGxvZGUuanMsIGpx dWVyeS51aS5lZmZlY3QtZmFkZS5qcywganF1ZXJ5LnVpLmVmZmVjdC1mb2xkLmpz LCBqcXVlcnkudWkuZWZmZWN0LWhpZ2hsaWdodC5qcywganF1ZXJ5LnVpLmVmZmVj dC1wdWxzYXRlLmpzLCBqcXVlcnkudWkuZWZmZWN0LXNjYWxlLmpzLCBqcXVlcnku dWkuZWZmZWN0LXNoYWtlLmpzLCBqcXVlcnkudWkuZWZmZWN0LXNsaWRlLmpzLCBq cXVlcnkudWkuZWZmZWN0LXRyYW5zZmVyLmpzLCBqcXVlcnkudWkubWVudS5qcywg anF1ZXJ5LnVpLnBvc2l0aW9uLmpzLCBqcXVlcnkudWkucHJvZ3Jlc3NiYXIuanMs IGpxdWVyeS51aS5zbGlkZXIuanMsIGpxdWVyeS51aS5zcGlubmVyLmpzLCBqcXVl cnkudWkudGFicy5qcywganF1ZXJ5LnVpLnRvb2x0aXAuanMKKiBDb3B5cmlnaHQg MjAxMyBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBM aWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKdmFy IHV1aWQgPSAwLAoJcnVuaXF1ZUlkID0gL151aS1pZC1cZCskLzsKCi8vIHByZXZl bnQgZHVwbGljYXRlIGxvYWRpbmcKLy8gdGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBi ZWNhdXNlIHdlIHByb3h5IGV4aXN0aW5nIGZ1bmN0aW9ucwovLyBhbmQgd2UgZG9u J3Qgd2FudCB0byBkb3VibGUgcHJveHkgdGhlbQokLnVpID0gJC51aSB8fCB7fTsK aWYgKCAkLnVpLnZlcnNpb24gKSB7CglyZXR1cm47Cn0KCiQuZXh0ZW5kKCAkLnVp LCB7Cgl2ZXJzaW9uOiAiMS4xMC4wIiwKCglrZXlDb2RlOiB7CgkJQkFDS1NQQUNF OiA4LAoJCUNPTU1BOiAxODgsCgkJREVMRVRFOiA0NiwKCQlET1dOOiA0MCwKCQlF TkQ6IDM1LAoJCUVOVEVSOiAxMywKCQlFU0NBUEU6IDI3LAoJCUhPTUU6IDM2LAoJ CUxFRlQ6IDM3LAoJCU5VTVBBRF9BREQ6IDEwNywKCQlOVU1QQURfREVDSU1BTDog MTEwLAoJCU5VTVBBRF9ESVZJREU6IDExMSwKCQlOVU1QQURfRU5URVI6IDEwOCwK CQlOVU1QQURfTVVMVElQTFk6IDEwNiwKCQlOVU1QQURfU1VCVFJBQ1Q6IDEwOSwK CQlQQUdFX0RPV046IDM0LAoJCVBBR0VfVVA6IDMzLAoJCVBFUklPRDogMTkwLAoJ CVJJR0hUOiAzOSwKCQlTUEFDRTogMzIsCgkJVEFCOiA5LAoJCVVQOiAzOAoJfQp9 KTsKCi8vIHBsdWdpbnMKJC5mbi5leHRlbmQoewoJX2ZvY3VzOiAkLmZuLmZvY3Vz LAoJZm9jdXM6IGZ1bmN0aW9uKCBkZWxheSwgZm4gKSB7CgkJcmV0dXJuIHR5cGVv ZiBkZWxheSA9PT0gIm51bWJlciIgPwoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7 CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgkJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkg ewoJCQkJCSQoIGVsZW0gKS5mb2N1cygpOwoJCQkJCWlmICggZm4gKSB7CgkJCQkJ CWZuLmNhbGwoIGVsZW0gKTsKCQkJCQl9CgkJCQl9LCBkZWxheSApOwoJCQl9KSA6 CgkJCXRoaXMuX2ZvY3VzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCX0sCgoJ c2Nyb2xsUGFyZW50OiBmdW5jdGlvbigpIHsKCQl2YXIgc2Nyb2xsUGFyZW50OwoJ CWlmICgoJC51aS5pZSAmJiAoLyhzdGF0aWN8cmVsYXRpdmUpLykudGVzdCh0aGlz LmNzcygicG9zaXRpb24iKSkpIHx8ICgvYWJzb2x1dGUvKS50ZXN0KHRoaXMuY3Nz KCJwb3NpdGlvbiIpKSkgewoJCQlzY3JvbGxQYXJlbnQgPSB0aGlzLnBhcmVudHMo KS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gKC8ocmVsYXRpdmV8YWJz b2x1dGV8Zml4ZWQpLykudGVzdCgkLmNzcyh0aGlzLCJwb3NpdGlvbiIpKSAmJiAo LyhhdXRvfHNjcm9sbCkvKS50ZXN0KCQuY3NzKHRoaXMsIm92ZXJmbG93IikrJC5j c3ModGhpcywib3ZlcmZsb3cteSIpKyQuY3NzKHRoaXMsIm92ZXJmbG93LXgiKSk7 CgkJCX0pLmVxKDApOwoJCX0gZWxzZSB7CgkJCXNjcm9sbFBhcmVudCA9IHRoaXMu cGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCXJldHVybiAoLyhhdXRv fHNjcm9sbCkvKS50ZXN0KCQuY3NzKHRoaXMsIm92ZXJmbG93IikrJC5jc3ModGhp cywib3ZlcmZsb3cteSIpKyQuY3NzKHRoaXMsIm92ZXJmbG93LXgiKSk7CgkJCX0p LmVxKDApOwoJCX0KCgkJcmV0dXJuICgvZml4ZWQvKS50ZXN0KHRoaXMuY3NzKCJw b3NpdGlvbiIpKSB8fCAhc2Nyb2xsUGFyZW50Lmxlbmd0aCA/ICQoZG9jdW1lbnQp IDogc2Nyb2xsUGFyZW50OwoJfSwKCgl6SW5kZXg6IGZ1bmN0aW9uKCB6SW5kZXgg KSB7CgkJaWYgKCB6SW5kZXggIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRo aXMuY3NzKCAiekluZGV4IiwgekluZGV4ICk7CgkJfQoKCQlpZiAoIHRoaXMubGVu Z3RoICkgewoJCQl2YXIgZWxlbSA9ICQoIHRoaXNbIDAgXSApLCBwb3NpdGlvbiwg dmFsdWU7CgkJCXdoaWxlICggZWxlbS5sZW5ndGggJiYgZWxlbVsgMCBdICE9PSBk b2N1bWVudCApIHsKCQkJCS8vIElnbm9yZSB6LWluZGV4IGlmIHBvc2l0aW9uIGlz IHNldCB0byBhIHZhbHVlIHdoZXJlIHotaW5kZXggaXMgaWdub3JlZCBieSB0aGUg YnJvd3NlcgoJCQkJLy8gVGhpcyBtYWtlcyBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0 aW9uIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzCgkJCQkvLyBXZWJLaXQgYWx3 YXlzIHJldHVybnMgYXV0byBpZiB0aGUgZWxlbWVudCBpcyBwb3NpdGlvbmVkCgkJ CQlwb3NpdGlvbiA9IGVsZW0uY3NzKCAicG9zaXRpb24iICk7CgkJCQlpZiAoIHBv c2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAicmVsYXRpdmUi IHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJCS8vIElFIHJldHVybnMg MCB3aGVuIHpJbmRleCBpcyBub3Qgc3BlY2lmaWVkCgkJCQkJLy8gb3RoZXIgYnJv d3NlcnMgcmV0dXJuIGEgc3RyaW5nCgkJCQkJLy8gd2UgaWdub3JlIHRoZSBjYXNl IG9mIG5lc3RlZCBlbGVtZW50cyB3aXRoIGFuIGV4cGxpY2l0IHZhbHVlIG9mIDAK CQkJCQkvLyA8ZGl2IHN0eWxlPSJ6LWluZGV4OiAtMTA7Ij48ZGl2IHN0eWxlPSJ6 LWluZGV4OiAwOyI+PC9kaXY+PC9kaXY+CgkJCQkJdmFsdWUgPSBwYXJzZUludCgg ZWxlbS5jc3MoICJ6SW5kZXgiICksIDEwICk7CgkJCQkJaWYgKCAhaXNOYU4oIHZh bHVlICkgJiYgdmFsdWUgIT09IDAgKSB7CgkJCQkJCXJldHVybiB2YWx1ZTsKCQkJ CQl9CgkJCQl9CgkJCQllbGVtID0gZWxlbS5wYXJlbnQoKTsKCQkJfQoJCX0KCgkJ cmV0dXJuIDA7Cgl9LAoKCXVuaXF1ZUlkOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4g dGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICF0aGlzLmlkICkgewoJCQkJ dGhpcy5pZCA9ICJ1aS1pZC0iICsgKCsrdXVpZCk7CgkJCX0KCQl9KTsKCX0sCgoJ cmVtb3ZlVW5pcXVlSWQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVhY2go ZnVuY3Rpb24oKSB7CgkJCWlmICggcnVuaXF1ZUlkLnRlc3QoIHRoaXMuaWQgKSAp IHsKCQkJCSQoIHRoaXMgKS5yZW1vdmVBdHRyKCAiaWQiICk7CgkJCX0KCQl9KTsK CX0KfSk7CgovLyBzZWxlY3RvcnMKZnVuY3Rpb24gZm9jdXNhYmxlKCBlbGVtZW50 LCBpc1RhYkluZGV4Tm90TmFOICkgewoJdmFyIG1hcCwgbWFwTmFtZSwgaW1nLAoJ CW5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJaWYg KCAiYXJlYSIgPT09IG5vZGVOYW1lICkgewoJCW1hcCA9IGVsZW1lbnQucGFyZW50 Tm9kZTsKCQltYXBOYW1lID0gbWFwLm5hbWU7CgkJaWYgKCAhZWxlbWVudC5ocmVm IHx8ICFtYXBOYW1lIHx8IG1hcC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAi bWFwIiApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpbWcgPSAkKCAiaW1nW3Vz ZW1hcD0jIiArIG1hcE5hbWUgKyAiXSIgKVswXTsKCQlyZXR1cm4gISFpbWcgJiYg dmlzaWJsZSggaW1nICk7Cgl9CglyZXR1cm4gKCAvaW5wdXR8c2VsZWN0fHRleHRh cmVhfGJ1dHRvbnxvYmplY3QvLnRlc3QoIG5vZGVOYW1lICkgPwoJCSFlbGVtZW50 LmRpc2FibGVkIDoKCQkiYSIgPT09IG5vZGVOYW1lID8KCQkJZWxlbWVudC5ocmVm IHx8IGlzVGFiSW5kZXhOb3ROYU4gOgoJCQlpc1RhYkluZGV4Tm90TmFOKSAmJgoJ CS8vIHRoZSBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyBtdXN0IGJl IHZpc2libGUKCQl2aXNpYmxlKCBlbGVtZW50ICk7Cn0KCmZ1bmN0aW9uIHZpc2li bGUoIGVsZW1lbnQgKSB7CglyZXR1cm4gJC5leHByLmZpbHRlcnMudmlzaWJsZSgg ZWxlbWVudCApICYmCgkJISQoIGVsZW1lbnQgKS5wYXJlbnRzKCkuYWRkQmFjaygp LmZpbHRlcihmdW5jdGlvbigpIHsKCQkJcmV0dXJuICQuY3NzKCB0aGlzLCAidmlz aWJpbGl0eSIgKSA9PT0gImhpZGRlbiI7CgkJfSkubGVuZ3RoOwp9CgokLmV4dGVu ZCggJC5leHByWyAiOiIgXSwgewoJZGF0YTogJC5leHByLmNyZWF0ZVBzZXVkbyA/ CgkJJC5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbiggZGF0YU5hbWUgKSB7CgkJ CXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhISQuZGF0YSgg ZWxlbSwgZGF0YU5hbWUgKTsKCQkJfTsKCQl9KSA6CgkJLy8gc3VwcG9ydDogalF1 ZXJ5IDwxLjgKCQlmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVy biAhISQuZGF0YSggZWxlbSwgbWF0Y2hbIDMgXSApOwoJCX0sCgoJZm9jdXNhYmxl OiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQlyZXR1cm4gZm9jdXNhYmxlKCBlbGVt ZW50LCAhaXNOYU4oICQuYXR0ciggZWxlbWVudCwgInRhYmluZGV4IiApICkgKTsK CX0sCgoJdGFiYmFibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXZhciB0YWJJ bmRleCA9ICQuYXR0ciggZWxlbWVudCwgInRhYmluZGV4IiApLAoJCQlpc1RhYklu ZGV4TmFOID0gaXNOYU4oIHRhYkluZGV4ICk7CgkJcmV0dXJuICggaXNUYWJJbmRl eE5hTiB8fCB0YWJJbmRleCA+PSAwICkgJiYgZm9jdXNhYmxlKCBlbGVtZW50LCAh aXNUYWJJbmRleE5hTiApOwoJfQp9KTsKCi8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44 CmlmICggISQoICI8YT4iICkub3V0ZXJXaWR0aCggMSApLmpxdWVyeSApIHsKCSQu ZWFjaCggWyAiV2lkdGgiLCAiSGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSAp IHsKCQl2YXIgc2lkZSA9IG5hbWUgPT09ICJXaWR0aCIgPyBbICJMZWZ0IiwgIlJp Z2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXSwKCQkJdHlwZSA9IG5hbWUudG9M b3dlckNhc2UoKSwKCQkJb3JpZyA9IHsKCQkJCWlubmVyV2lkdGg6ICQuZm4uaW5u ZXJXaWR0aCwKCQkJCWlubmVySGVpZ2h0OiAkLmZuLmlubmVySGVpZ2h0LAoJCQkJ b3V0ZXJXaWR0aDogJC5mbi5vdXRlcldpZHRoLAoJCQkJb3V0ZXJIZWlnaHQ6ICQu Zm4ub3V0ZXJIZWlnaHQKCQkJfTsKCgkJZnVuY3Rpb24gcmVkdWNlKCBlbGVtLCBz aXplLCBib3JkZXIsIG1hcmdpbiApIHsKCQkJJC5lYWNoKCBzaWRlLCBmdW5jdGlv bigpIHsKCQkJCXNpemUgLT0gcGFyc2VGbG9hdCggJC5jc3MoIGVsZW0sICJwYWRk aW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCQlpZiAoIGJvcmRlciApIHsKCQkJCQlz aXplIC09IHBhcnNlRmxvYXQoICQuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMg KyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQkJaWYgKCBtYXJnaW4gKSB7CgkJ CQkJc2l6ZSAtPSBwYXJzZUZsb2F0KCAkLmNzcyggZWxlbSwgIm1hcmdpbiIgKyB0 aGlzICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuIHNpemU7CgkJfQoK CQkkLmZuWyAiaW5uZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIHNpemUgKSB7CgkJ CWlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIG9yaWdbICJp bm5lciIgKyBuYW1lIF0uY2FsbCggdGhpcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhp cy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcyApLmNzcyggdHlwZSwgcmVk dWNlKCB0aGlzLCBzaXplICkgKyAicHgiICk7CgkJCX0pOwoJCX07CgoJCSQuZm5b ICJvdXRlciIgKyBuYW1lXSA9IGZ1bmN0aW9uKCBzaXplLCBtYXJnaW4gKSB7CgkJ CWlmICggdHlwZW9mIHNpemUgIT09ICJudW1iZXIiICkgewoJCQkJcmV0dXJuIG9y aWdbICJvdXRlciIgKyBuYW1lIF0uY2FsbCggdGhpcywgc2l6ZSApOwoJCQl9CgoJ CQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJJCggdGhpcykuY3Nz KCB0eXBlLCByZWR1Y2UoIHRoaXMsIHNpemUsIHRydWUsIG1hcmdpbiApICsgInB4 IiApOwoJCQl9KTsKCQl9OwoJfSk7Cn0KCi8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44 CmlmICggISQuZm4uYWRkQmFjayApIHsKCSQuZm4uYWRkQmFjayA9IGZ1bmN0aW9u KCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51 bGwgPwoJCQl0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVy KCBzZWxlY3RvciApCgkJKTsKCX07Cn0KCi8vIHN1cHBvcnQ6IGpRdWVyeSAxLjYu MSwgMS42LjIgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMpCmlm ICggJCggIjxhPiIgKS5kYXRhKCAiYS1iIiwgImEiICkucmVtb3ZlRGF0YSggImEt YiIgKS5kYXRhKCAiYS1iIiApICkgewoJJC5mbi5yZW1vdmVEYXRhID0gKGZ1bmN0 aW9uKCByZW1vdmVEYXRhICkgewoJCXJldHVybiBmdW5jdGlvbigga2V5ICkgewoJ CQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCQlyZXR1cm4gcmVtb3ZlRGF0 YS5jYWxsKCB0aGlzLCAkLmNhbWVsQ2FzZSgga2V5ICkgKTsKCQkJfSBlbHNlIHsK CQkJCXJldHVybiByZW1vdmVEYXRhLmNhbGwoIHRoaXMgKTsKCQkJfQoJCX07Cgl9 KSggJC5mbi5yZW1vdmVEYXRhICk7Cn0KCgoKCgovLyBkZXByZWNhdGVkCiQudWku aWUgPSAhIS9tc2llIFtcdy5dKy8uZXhlYyggbmF2aWdhdG9yLnVzZXJBZ2VudC50 b0xvd2VyQ2FzZSgpICk7CgokLnN1cHBvcnQuc2VsZWN0c3RhcnQgPSAib25zZWxl Y3RzdGFydCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKTsKJC5m bi5leHRlbmQoewoJZGlzYWJsZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CgkJcmV0 dXJuIHRoaXMuYmluZCggKCAkLnN1cHBvcnQuc2VsZWN0c3RhcnQgPyAic2VsZWN0 c3RhcnQiIDogIm1vdXNlZG93biIgKSArCgkJCSIudWktZGlzYWJsZVNlbGVjdGlv biIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0 KCk7CgkJCX0pOwoJfSwKCgllbmFibGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewoJ CXJldHVybiB0aGlzLnVuYmluZCggIi51aS1kaXNhYmxlU2VsZWN0aW9uIiApOwoJ fQp9KTsKCiQuZXh0ZW5kKCAkLnVpLCB7CgkvLyAkLnVpLnBsdWdpbiBpcyBkZXBy ZWNhdGVkLiAgVXNlIHRoZSBwcm94eSBwYXR0ZXJuIGluc3RlYWQuCglwbHVnaW46 IHsKCQlhZGQ6IGZ1bmN0aW9uKCBtb2R1bGUsIG9wdGlvbiwgc2V0ICkgewoJCQl2 YXIgaSwKCQkJCXByb3RvID0gJC51aVsgbW9kdWxlIF0ucHJvdG90eXBlOwoJCQlm b3IgKCBpIGluIHNldCApIHsKCQkJCXByb3RvLnBsdWdpbnNbIGkgXSA9IHByb3Rv LnBsdWdpbnNbIGkgXSB8fCBbXTsKCQkJCXByb3RvLnBsdWdpbnNbIGkgXS5wdXNo KCBbIG9wdGlvbiwgc2V0WyBpIF0gXSApOwoJCQl9CgkJfSwKCQljYWxsOiBmdW5j dGlvbiggaW5zdGFuY2UsIG5hbWUsIGFyZ3MgKSB7CgkJCXZhciBpLAoJCQkJc2V0 ID0gaW5zdGFuY2UucGx1Z2luc1sgbmFtZSBdOwoJCQlpZiAoICFzZXQgfHwgIWlu c3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlIHx8IGluc3RhbmNlLmVsZW1l bnRbIDAgXS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMSApIHsKCQkJCXJldHVy bjsKCQkJfQoKCQkJZm9yICggaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7 CgkJCQlpZiAoIGluc3RhbmNlLm9wdGlvbnNbIHNldFsgaSBdWyAwIF0gXSApIHsK CQkJCQlzZXRbIGkgXVsgMSBdLmFwcGx5KCBpbnN0YW5jZS5lbGVtZW50LCBhcmdz ICk7CgkJCQl9CgkJCX0KCQl9Cgl9LAoKCS8vIG9ubHkgdXNlZCBieSByZXNpemFi bGUKCWhhc1Njcm9sbDogZnVuY3Rpb24oIGVsLCBhICkgewoKCQkvL0lmIG92ZXJm bG93IGlzIGhpZGRlbiwgdGhlIGVsZW1lbnQgbWlnaHQgaGF2ZSBleHRyYSBjb250 ZW50LCBidXQgdGhlIHVzZXIgd2FudHMgdG8gaGlkZSBpdAoJCWlmICggJCggZWwg KS5jc3MoICJvdmVyZmxvdyIgKSA9PT0gImhpZGRlbiIpIHsKCQkJcmV0dXJuIGZh bHNlOwoJCX0KCgkJdmFyIHNjcm9sbCA9ICggYSAmJiBhID09PSAibGVmdCIgKSA/ ICJzY3JvbGxMZWZ0IiA6ICJzY3JvbGxUb3AiLAoJCQloYXMgPSBmYWxzZTsKCgkJ aWYgKCBlbFsgc2Nyb2xsIF0gPiAwICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJ CS8vIFRPRE86IGRldGVybWluZSB3aGljaCBjYXNlcyBhY3R1YWxseSBjYXVzZSB0 aGlzIHRvIGhhcHBlbgoJCS8vIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSB0 aGUgc2Nyb2xsIHNldCwgc2VlIGlmIGl0J3MgcG9zc2libGUgdG8KCQkvLyBzZXQg dGhlIHNjcm9sbAoJCWVsWyBzY3JvbGwgXSA9IDE7CgkJaGFzID0gKCBlbFsgc2Ny b2xsIF0gPiAwICk7CgkJZWxbIHNjcm9sbCBdID0gMDsKCQlyZXR1cm4gaGFzOwoJ fQp9KTsKCn0pKCBqUXVlcnkgKTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkg ewoKdmFyIHV1aWQgPSAwLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2Us CglfY2xlYW5EYXRhID0gJC5jbGVhbkRhdGE7CiQuY2xlYW5EYXRhID0gZnVuY3Rp b24oIGVsZW1zICkgewoJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVs ZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJdHJ5IHsKCQkJJCggZWxlbSApLnRy aWdnZXJIYW5kbGVyKCAicmVtb3ZlIiApOwoJCS8vIGh0dHA6Ly9idWdzLmpxdWVy eS5jb20vdGlja2V0LzgyMzUKCQl9IGNhdGNoKCBlICkge30KCX0KCV9jbGVhbkRh dGEoIGVsZW1zICk7Cn07CgokLndpZGdldCA9IGZ1bmN0aW9uKCBuYW1lLCBiYXNl LCBwcm90b3R5cGUgKSB7Cgl2YXIgZnVsbE5hbWUsIGV4aXN0aW5nQ29uc3RydWN0 b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlLAoJCS8vIHByb3hpZWRQcm90 b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVu bW9kaWZpZWQKCQkvLyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4g Zm9yIG11bHRpcGxlIHdpZGdldHMgKCM4ODc2KQoJCXByb3hpZWRQcm90b3R5cGUg PSB7fSwKCQluYW1lc3BhY2UgPSBuYW1lLnNwbGl0KCAiLiIgKVsgMCBdOwoKCW5h bWUgPSBuYW1lLnNwbGl0KCAiLiIgKVsgMSBdOwoJZnVsbE5hbWUgPSBuYW1lc3Bh Y2UgKyAiLSIgKyBuYW1lOwoKCWlmICggIXByb3RvdHlwZSApIHsKCQlwcm90b3R5 cGUgPSBiYXNlOwoJCWJhc2UgPSAkLldpZGdldDsKCX0KCgkvLyBjcmVhdGUgc2Vs ZWN0b3IgZm9yIHBsdWdpbgoJJC5leHByWyAiOiIgXVsgZnVsbE5hbWUudG9Mb3dl ckNhc2UoKSBdID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuICEhJC5kYXRh KCBlbGVtLCBmdWxsTmFtZSApOwoJfTsKCgkkWyBuYW1lc3BhY2UgXSA9ICRbIG5h bWVzcGFjZSBdIHx8IHt9OwoJZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVz cGFjZSBdWyBuYW1lIF07Cgljb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBu YW1lIF0gPSBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHsKCQkvLyBhbGxv dyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgIm5ldyIga2V5d29yZAoJCWlmICggIXRo aXMuX2NyZWF0ZVdpZGdldCApIHsKCQkJcmV0dXJuIG5ldyBjb25zdHJ1Y3Rvcigg b3B0aW9ucywgZWxlbWVudCApOwoJCX0KCgkJLy8gYWxsb3cgaW5zdGFudGlhdGlv biB3aXRob3V0IGluaXRpYWxpemluZyBmb3Igc2ltcGxlIGluaGVyaXRhbmNlCgkJ Ly8gbXVzdCB1c2UgIm5ldyIga2V5d29yZCAodGhlIGNvZGUgYWJvdmUgYWx3YXlz IHBhc3NlcyBhcmdzKQoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdGhp cy5fY3JlYXRlV2lkZ2V0KCBvcHRpb25zLCBlbGVtZW50ICk7CgkJfQoJfTsKCS8v IGV4dGVuZCB3aXRoIHRoZSBleGlzdGluZyBjb25zdHJ1Y3RvciB0byBjYXJyeSBv dmVyIGFueSBzdGF0aWMgcHJvcGVydGllcwoJJC5leHRlbmQoIGNvbnN0cnVjdG9y LCBleGlzdGluZ0NvbnN0cnVjdG9yLCB7CgkJdmVyc2lvbjogcHJvdG90eXBlLnZl cnNpb24sCgkJLy8gY29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBw cm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvCgkJLy8gcmVkZWZpbmUgdGhlIHdp ZGdldCBsYXRlcgoJCV9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSwK CQkvLyB0cmFjayB3aWRnZXRzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgd2lkZ2V0 IGluIGNhc2UgdGhpcyB3aWRnZXQgaXMKCQkvLyByZWRlZmluZWQgYWZ0ZXIgYSB3 aWRnZXQgaW5oZXJpdHMgZnJvbSBpdAoJCV9jaGlsZENvbnN0cnVjdG9yczogW10K CX0pOwoKCWJhc2VQcm90b3R5cGUgPSBuZXcgYmFzZSgpOwoJLy8gd2UgbmVlZCB0 byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0 aGUgbmV3IGluc3RhbmNlCgkvLyBvdGhlcndpc2Ugd2UnbGwgbW9kaWZ5IHRoZSBv cHRpb25zIGhhc2ggb24gdGhlIHByb3RvdHlwZSB0aGF0IHdlJ3JlCgkvLyBpbmhl cml0aW5nIGZyb20KCWJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4 dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApOwoJJC5lYWNoKCBwcm90 b3R5cGUsIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKCQlpZiAoICEkLmlzRnVu Y3Rpb24oIHZhbHVlICkgKSB7CgkJCXByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9 IHZhbHVlOwoJCQlyZXR1cm47CgkJfQoJCXByb3hpZWRQcm90b3R5cGVbIHByb3Ag XSA9IChmdW5jdGlvbigpIHsKCQkJdmFyIF9zdXBlciA9IGZ1bmN0aW9uKCkgewoJ CQkJCXJldHVybiBiYXNlLnByb3RvdHlwZVsgcHJvcCBdLmFwcGx5KCB0aGlzLCBh cmd1bWVudHMgKTsKCQkJCX0sCgkJCQlfc3VwZXJBcHBseSA9IGZ1bmN0aW9uKCBh cmdzICkgewoJCQkJCXJldHVybiBiYXNlLnByb3RvdHlwZVsgcHJvcCBdLmFwcGx5 KCB0aGlzLCBhcmdzICk7CgkJCQl9OwoJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJ CQl2YXIgX19zdXBlciA9IHRoaXMuX3N1cGVyLAoJCQkJCV9fc3VwZXJBcHBseSA9 IHRoaXMuX3N1cGVyQXBwbHksCgkJCQkJcmV0dXJuVmFsdWU7CgoJCQkJdGhpcy5f c3VwZXIgPSBfc3VwZXI7CgkJCQl0aGlzLl9zdXBlckFwcGx5ID0gX3N1cGVyQXBw bHk7CgoJCQkJcmV0dXJuVmFsdWUgPSB2YWx1ZS5hcHBseSggdGhpcywgYXJndW1l bnRzICk7CgoJCQkJdGhpcy5fc3VwZXIgPSBfX3N1cGVyOwoJCQkJdGhpcy5fc3Vw ZXJBcHBseSA9IF9fc3VwZXJBcHBseTsKCgkJCQlyZXR1cm4gcmV0dXJuVmFsdWU7 CgkJCX07CgkJfSkoKTsKCX0pOwoJY29uc3RydWN0b3IucHJvdG90eXBlID0gJC53 aWRnZXQuZXh0ZW5kKCBiYXNlUHJvdG90eXBlLCB7CgkJLy8gVE9ETzogcmVtb3Zl IHN1cHBvcnQgZm9yIHdpZGdldEV2ZW50UHJlZml4CgkJLy8gYWx3YXlzIHVzZSB0 aGUgbmFtZSArIGEgY29sb24gYXMgdGhlIHByZWZpeCwgZS5nLiwgZHJhZ2dhYmxl OnN0YXJ0CgkJLy8gZG9uJ3QgcHJlZml4IGZvciB3aWRnZXRzIHRoYXQgYXJlbid0 IERPTS1iYXNlZAoJCXdpZGdldEV2ZW50UHJlZml4OiBleGlzdGluZ0NvbnN0cnVj dG9yID8gYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCA6IG5hbWUKCX0s IHByb3hpZWRQcm90b3R5cGUsIHsKCQljb25zdHJ1Y3RvcjogY29uc3RydWN0b3Is CgkJbmFtZXNwYWNlOiBuYW1lc3BhY2UsCgkJd2lkZ2V0TmFtZTogbmFtZSwKCQl3 aWRnZXRGdWxsTmFtZTogZnVsbE5hbWUKCX0pOwoKCS8vIElmIHRoaXMgd2lkZ2V0 IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lk Z2V0cyB0aGF0CgkvLyBhcmUgaW5oZXJpdGluZyBmcm9tIGl0IGFuZCByZWRlZmlu ZSBhbGwgb2YgdGhlbSBzbyB0aGF0IHRoZXkgaW5oZXJpdCBmcm9tCgkvLyB0aGUg bmV3IHZlcnNpb24gb2YgdGhpcyB3aWRnZXQuIFdlJ3JlIGVzc2VudGlhbGx5IHRy eWluZyB0byByZXBsYWNlIG9uZQoJLy8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBj aGFpbi4KCWlmICggZXhpc3RpbmdDb25zdHJ1Y3RvciApIHsKCQkkLmVhY2goIGV4 aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzLCBmdW5jdGlvbigg aSwgY2hpbGQgKSB7CgkJCXZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3Rv dHlwZTsKCgkJCS8vIHJlZGVmaW5lIHRoZSBjaGlsZCB3aWRnZXQgdXNpbmcgdGhl IHNhbWUgcHJvdG90eXBlIHRoYXQgd2FzCgkJCS8vIG9yaWdpbmFsbHkgdXNlZCwg YnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2UKCQkJ JC53aWRnZXQoIGNoaWxkUHJvdG90eXBlLm5hbWVzcGFjZSArICIuIiArIGNoaWxk UHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLCBjaGlsZC5fcHJvdG8g KTsKCQl9KTsKCQkvLyByZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQg Y29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvcgoJCS8vIHNvIHRo ZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3Rl ZAoJCWRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9y czsKCX0gZWxzZSB7CgkJYmFzZS5fY2hpbGRDb25zdHJ1Y3RvcnMucHVzaCggY29u c3RydWN0b3IgKTsKCX0KCgkkLndpZGdldC5icmlkZ2UoIG5hbWUsIGNvbnN0cnVj dG9yICk7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkg ewoJdmFyIGlucHV0ID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICksCgkJaW5w dXRJbmRleCA9IDAsCgkJaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgsCgkJa2V5 LAoJCXZhbHVlOwoJZm9yICggOyBpbnB1dEluZGV4IDwgaW5wdXRMZW5ndGg7IGlu cHV0SW5kZXgrKyApIHsKCQlmb3IgKCBrZXkgaW4gaW5wdXRbIGlucHV0SW5kZXgg XSApIHsKCQkJdmFsdWUgPSBpbnB1dFsgaW5wdXRJbmRleCBdWyBrZXkgXTsKCQkJ aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAm JiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gQ2xvbmUgb2JqZWN0cwoJ CQkJaWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7CgkJCQkJdGFyZ2V0 WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID8KCQkJ CQkJJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGFyZ2V0WyBrZXkgXSwgdmFsdWUgKSA6 CgkJCQkJCS8vIERvbid0IGV4dGVuZCBzdHJpbmdzLCBhcnJheXMsIGV0Yy4gd2l0 aCBvYmplY3RzCgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHZhbHVlICk7CgkJ CQkvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2UKCQkJCX0gZWxz ZSB7CgkJCQkJdGFyZ2V0WyBrZXkgXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJ fQoJcmV0dXJuIHRhcmdldDsKfTsKCiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9u KCBuYW1lLCBvYmplY3QgKSB7Cgl2YXIgZnVsbE5hbWUgPSBvYmplY3QucHJvdG90 eXBlLndpZGdldEZ1bGxOYW1lIHx8IG5hbWU7CgkkLmZuWyBuYW1lIF0gPSBmdW5j dGlvbiggb3B0aW9ucyApIHsKCQl2YXIgaXNNZXRob2RDYWxsID0gdHlwZW9mIG9w dGlvbnMgPT09ICJzdHJpbmciLAoJCQlhcmdzID0gc2xpY2UuY2FsbCggYXJndW1l bnRzLCAxICksCgkJCXJldHVyblZhbHVlID0gdGhpczsKCgkJLy8gYWxsb3cgbXVs dGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJb3B0aW9ucyA9ICFp c01ldGhvZENhbGwgJiYgYXJncy5sZW5ndGggPwoJCQkkLndpZGdldC5leHRlbmQu YXBwbHkoIG51bGwsIFsgb3B0aW9ucyBdLmNvbmNhdChhcmdzKSApIDoKCQkJb3B0 aW9uczsKCgkJaWYgKCBpc01ldGhvZENhbGwgKSB7CgkJCXRoaXMuZWFjaChmdW5j dGlvbigpIHsKCQkJCXZhciBtZXRob2RWYWx1ZSwKCQkJCQlpbnN0YW5jZSA9ICQu ZGF0YSggdGhpcywgZnVsbE5hbWUgKTsKCQkJCWlmICggIWluc3RhbmNlICkgewoJ CQkJCXJldHVybiAkLmVycm9yKCAiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiICsg bmFtZSArICIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247ICIgKwoJCQkJCQkiYXR0 ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICciICsgb3B0aW9ucyArICInIiApOwoJCQkJ fQoJCQkJaWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVtvcHRpb25zXSApIHx8 IG9wdGlvbnMuY2hhckF0KCAwICkgPT09ICJfIiApIHsKCQkJCQlyZXR1cm4gJC5l cnJvciggIm5vIHN1Y2ggbWV0aG9kICciICsgb3B0aW9ucyArICInIGZvciAiICsg bmFtZSArICIgd2lkZ2V0IGluc3RhbmNlIiApOwoJCQkJfQoJCQkJbWV0aG9kVmFs dWUgPSBpbnN0YW5jZVsgb3B0aW9ucyBdLmFwcGx5KCBpbnN0YW5jZSwgYXJncyAp OwoJCQkJaWYgKCBtZXRob2RWYWx1ZSAhPT0gaW5zdGFuY2UgJiYgbWV0aG9kVmFs dWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm5WYWx1ZSA9IG1ldGhvZFZh bHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/CgkJCQkJCXJldHVyblZhbHVlLnB1 c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6CgkJCQkJCW1ldGhvZFZhbHVl OwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJ dGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRh KCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlp bnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKS5faW5pdCgpOwoJCQkJfSBl bHNlIHsKCQkJCQkkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBv cHRpb25zLCB0aGlzICkgKTsKCQkJCX0KCQkJfSk7CgkJfQoKCQlyZXR1cm4gcmV0 dXJuVmFsdWU7Cgl9Owp9OwoKJC5XaWRnZXQgPSBmdW5jdGlvbiggLyogb3B0aW9u cywgZWxlbWVudCAqLyApIHt9OwokLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnMg PSBbXTsKCiQuV2lkZ2V0LnByb3RvdHlwZSA9IHsKCXdpZGdldE5hbWU6ICJ3aWRn ZXQiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICIiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8 ZGl2PiIsCglvcHRpb25zOiB7CgkJZGlzYWJsZWQ6IGZhbHNlLAoKCQkvLyBjYWxs YmFja3MKCQljcmVhdGU6IG51bGwKCX0sCglfY3JlYXRlV2lkZ2V0OiBmdW5jdGlv biggb3B0aW9ucywgZWxlbWVudCApIHsKCQllbGVtZW50ID0gJCggZWxlbWVudCB8 fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdOwoJCXRoaXMuZWxl bWVudCA9ICQoIGVsZW1lbnQgKTsKCQl0aGlzLnV1aWQgPSB1dWlkKys7CgkJdGhp cy5ldmVudE5hbWVzcGFjZSA9ICIuIiArIHRoaXMud2lkZ2V0TmFtZSArIHRoaXMu dXVpZDsKCQl0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LAoJCQl0 aGlzLm9wdGlvbnMsCgkJCXRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSwKCQkJb3B0 aW9ucyApOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxl ID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQg IT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxs TmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7 CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50 LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJ CQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQu c3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQll bGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cg b3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJ CQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcg fHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMu X2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlz Ll9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglf Z2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTog JC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0 cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2Fu IHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFs bCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJ dGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJ CQkvLyAxLjkgQkMgZm9yICM3ODEwCgkJCS8vIFRPRE8gcmVtb3ZlIGR1YWwgc3Rv cmFnZQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXROYW1lICkKCQkJLnJlbW92 ZURhdGEoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKQoJCQkvLyBzdXBwb3J0OiBqcXVl cnkgPDEuNi4zCgkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0 MTMKCQkJLnJlbW92ZURhdGEoICQuY2FtZWxDYXNlKCB0aGlzLndpZGdldEZ1bGxO YW1lICkgKTsKCQl0aGlzLndpZGdldCgpCgkJCS51bmJpbmQoIHRoaXMuZXZlbnRO YW1lc3BhY2UgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICkKCQkJ LnJlbW92ZUNsYXNzKAoJCQkJdGhpcy53aWRnZXRGdWxsTmFtZSArICItZGlzYWJs ZWQgIiArCgkJCQkidWktc3RhdGUtZGlzYWJsZWQiICk7CgoJCS8vIGNsZWFuIHVw IGV2ZW50cyBhbmQgc3RhdGVzCgkJdGhpcy5iaW5kaW5ncy51bmJpbmQoIHRoaXMu ZXZlbnROYW1lc3BhY2UgKTsKCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcygg InVpLXN0YXRlLWhvdmVyIiApOwoJCXRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNz KCAidWktc3RhdGUtZm9jdXMiICk7Cgl9LAoJX2Rlc3Ryb3k6ICQubm9vcCwKCgl3 aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVsZW1lbnQ7Cgl9LAoK CW9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdmFyIG9wdGlvbnMg PSBrZXksCgkJCXBhcnRzLAoJCQljdXJPcHRpb24sCgkJCWk7CgoJCWlmICggYXJn dW1lbnRzLmxlbmd0aCA9PT0gMCApIHsKCQkJLy8gZG9uJ3QgcmV0dXJuIGEgcmVm ZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBoYXNoCgkJCXJldHVybiAkLndpZGdldC5l eHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTsKCQl9CgoJCWlmICggdHlwZW9mIGtl eSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIGhhbmRsZSBuZXN0ZWQga2V5cywgZS5n LiwgImZvby5iYXIiID0+IHsgZm9vOiB7IGJhcjogX19fIH0gfQoJCQlvcHRpb25z ID0ge307CgkJCXBhcnRzID0ga2V5LnNwbGl0KCAiLiIgKTsKCQkJa2V5ID0gcGFy dHMuc2hpZnQoKTsKCQkJaWYgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXJPcHRp b24gPSBvcHRpb25zWyBrZXkgXSA9ICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMu b3B0aW9uc1sga2V5IF0gKTsKCQkJCWZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVu Z3RoIC0gMTsgaSsrICkgewoJCQkJCWN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0g Y3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307CgkJCQkJY3VyT3B0aW9uID0g Y3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07CgkJCQl9CgkJCQlrZXkgPSBwYXJ0cy5w b3AoKTsKCQkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1 cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9w dGlvblsga2V5IF07CgkJCQl9CgkJCQljdXJPcHRpb25bIGtleSBdID0gdmFsdWU7 CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJ CQkJcmV0dXJuIHRoaXMub3B0aW9uc1sga2V5IF0gPT09IHVuZGVmaW5lZCA/IG51 bGwgOiB0aGlzLm9wdGlvbnNbIGtleSBdOwoJCQkJfQoJCQkJb3B0aW9uc1sga2V5 IF0gPSB2YWx1ZTsKCQkJfQoJCX0KCgkJdGhpcy5fc2V0T3B0aW9ucyggb3B0aW9u cyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uczogZnVuY3Rpb24o IG9wdGlvbnMgKSB7CgkJdmFyIGtleTsKCgkJZm9yICgga2V5IGluIG9wdGlvbnMg KSB7CgkJCXRoaXMuX3NldE9wdGlvbigga2V5LCBvcHRpb25zWyBrZXkgXSApOwoJ CX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtl eSwgdmFsdWUgKSB7CgkJdGhpcy5vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoKCQlp ZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy53aWRnZXQoKQoJCQkJ LnRvZ2dsZUNsYXNzKCB0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCB1 aS1zdGF0ZS1kaXNhYmxlZCIsICEhdmFsdWUgKQoJCQkJLmF0dHIoICJhcmlhLWRp c2FibGVkIiwgdmFsdWUgKTsKCQkJdGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3Mo ICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xh c3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwK CgllbmFibGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9zZXRPcHRpb24o ICJkaXNhYmxlZCIsIGZhbHNlICk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7 CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgdHJ1ZSApOwoJ fSwKCglfb246IGZ1bmN0aW9uKCBzdXBwcmVzc0Rpc2FibGVkQ2hlY2ssIGVsZW1l bnQsIGhhbmRsZXJzICkgewoJCXZhciBkZWxlZ2F0ZUVsZW1lbnQsCgkJCWluc3Rh bmNlID0gdGhpczsKCgkJLy8gbm8gc3VwcHJlc3NEaXNhYmxlZENoZWNrIGZsYWcs IHNodWZmbGUgYXJndW1lbnRzCgkJaWYgKCB0eXBlb2Ygc3VwcHJlc3NEaXNhYmxl ZENoZWNrICE9PSAiYm9vbGVhbiIgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsK CQkJZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjazsKCQkJc3VwcHJlc3NE aXNhYmxlZENoZWNrID0gZmFsc2U7CgkJfQoKCQkvLyBubyBlbGVtZW50IGFyZ3Vt ZW50LCBzaHVmZmxlIGFuZCB1c2UgdGhpcy5lbGVtZW50CgkJaWYgKCAhaGFuZGxl cnMgKSB7CgkJCWhhbmRsZXJzID0gZWxlbWVudDsKCQkJZWxlbWVudCA9IHRoaXMu ZWxlbWVudDsKCQkJZGVsZWdhdGVFbGVtZW50ID0gdGhpcy53aWRnZXQoKTsKCQl9 IGVsc2UgewoJCQkvLyBhY2NlcHQgc2VsZWN0b3JzLCBET00gZWxlbWVudHMKCQkJ ZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhp cy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoK CQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7 CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdl dHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBk aXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0g ZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVh bCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJ CSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJ JCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsK CQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9 PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJ CQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNv cHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5 cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5n dWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxl clByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2 ZW50Lm1hdGNoKCAvXihcdyspXHMqKC4qKSQvICksCgkJCQlldmVudE5hbWUgPSBt YXRjaFsxXSArIGluc3RhbmNlLmV2ZW50TmFtZXNwYWNlLAoJCQkJc2VsZWN0b3Ig PSBtYXRjaFsyXTsKCQkJaWYgKCBzZWxlY3RvciApIHsKCQkJCWRlbGVnYXRlRWxl bWVudC5kZWxlZ2F0ZSggc2VsZWN0b3IsIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5 ICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtZW50LmJpbmQoIGV2ZW50TmFtZSwgaGFu ZGxlclByb3h5ICk7CgkJCX0KCQl9KTsKCX0sCgoJX29mZjogZnVuY3Rpb24oIGVs ZW1lbnQsIGV2ZW50TmFtZSApIHsKCQlldmVudE5hbWUgPSAoZXZlbnROYW1lIHx8 ICIiKS5zcGxpdCggIiAiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArICIg IiApICsgdGhpcy5ldmVudE5hbWVzcGFjZTsKCQllbGVtZW50LnVuYmluZCggZXZl bnROYW1lICkudW5kZWxlZ2F0ZSggZXZlbnROYW1lICk7Cgl9LAoKCV9kZWxheTog ZnVuY3Rpb24oIGhhbmRsZXIsIGRlbGF5ICkgewoJCWZ1bmN0aW9uIGhhbmRsZXJQ cm94eSgpIHsKCQkJcmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09ICJzdHJpbmci ID8gaW5zdGFuY2VbIGhhbmRsZXIgXSA6IGhhbmRsZXIgKQoJCQkJLmFwcGx5KCBp bnN0YW5jZSwgYXJndW1lbnRzICk7CgkJfQoJCXZhciBpbnN0YW5jZSA9IHRoaXM7 CgkJcmV0dXJuIHNldFRpbWVvdXQoIGhhbmRsZXJQcm94eSwgZGVsYXkgfHwgMCAp OwoJfSwKCglfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl0aGlz LmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApOwoJCXRo aXMuX29uKCBlbGVtZW50LCB7CgkJCW1vdXNlZW50ZXI6IGZ1bmN0aW9uKCBldmVu dCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5hZGRDbGFzcyggInVp LXN0YXRlLWhvdmVyIiApOwoJCQl9LAoJCQltb3VzZWxlYXZlOiBmdW5jdGlvbigg ZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkucmVtb3ZlQ2xh c3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZm9jdXNh YmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl0aGlzLmZvY3VzYWJsZSA9IHRo aXMuZm9jdXNhYmxlLmFkZCggZWxlbWVudCApOwoJCXRoaXMuX29uKCBlbGVtZW50 LCB7CgkJCWZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50 LmN1cnJlbnRUYXJnZXQgKS5hZGRDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJ CQl9LAoJCQlmb2N1c291dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZl bnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMi ICk7CgkJCX0KCQl9KTsKCX0sCgoJX3RyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBl dmVudCwgZGF0YSApIHsKCQl2YXIgcHJvcCwgb3JpZywKCQkJY2FsbGJhY2sgPSB0 aGlzLm9wdGlvbnNbIHR5cGUgXTsKCgkJZGF0YSA9IGRhdGEgfHwge307CgkJZXZl bnQgPSAkLkV2ZW50KCBldmVudCApOwoJCWV2ZW50LnR5cGUgPSAoIHR5cGUgPT09 IHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggPwoJCQl0eXBlIDoKCQkJdGhpcy53aWRn ZXRFdmVudFByZWZpeCArIHR5cGUgKS50b0xvd2VyQ2FzZSgpOwoJCS8vIHRoZSBv cmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50CgkJLy8gc28g d2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnQKCQll dmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTsKCgkJLy8gY29weSBvcmln aW5hbCBldmVudCBwcm9wZXJ0aWVzIG92ZXIgdG8gdGhlIG5ldyBldmVudAoJCW9y aWcgPSBldmVudC5vcmlnaW5hbEV2ZW50OwoJCWlmICggb3JpZyApIHsKCQkJZm9y ICggcHJvcCBpbiBvcmlnICkgewoJCQkJaWYgKCAhKCBwcm9wIGluIGV2ZW50ICkg KSB7CgkJCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdbIHByb3AgXTsKCQkJCX0KCQkJ fQoJCX0KCgkJdGhpcy5lbGVtZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhICk7CgkJ cmV0dXJuICEoICQuaXNGdW5jdGlvbiggY2FsbGJhY2sgKSAmJgoJCQljYWxsYmFj ay5hcHBseSggdGhpcy5lbGVtZW50WzBdLCBbIGV2ZW50IF0uY29uY2F0KCBkYXRh ICkgKSA9PT0gZmFsc2UgfHwKCQkJZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkg KTsKCX0KfTsKCiQuZWFjaCggeyBzaG93OiAiZmFkZUluIiwgaGlkZTogImZhZGVP dXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7CgkkLldp ZGdldC5wcm90b3R5cGVbICJfIiArIG1ldGhvZCBdID0gZnVuY3Rpb24oIGVsZW1l bnQsIG9wdGlvbnMsIGNhbGxiYWNrICkgewoJCWlmICggdHlwZW9mIG9wdGlvbnMg PT09ICJzdHJpbmciICkgewoJCQlvcHRpb25zID0geyBlZmZlY3Q6IG9wdGlvbnMg fTsKCQl9CgkJdmFyIGhhc09wdGlvbnMsCgkJCWVmZmVjdE5hbWUgPSAhb3B0aW9u cyA/CgkJCQltZXRob2QgOgoJCQkJb3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Yg b3B0aW9ucyA9PT0gIm51bWJlciIgPwoJCQkJCWRlZmF1bHRFZmZlY3QgOgoJCQkJ CW9wdGlvbnMuZWZmZWN0IHx8IGRlZmF1bHRFZmZlY3Q7CgkJb3B0aW9ucyA9IG9w dGlvbnMgfHwge307CgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gIm51bWJlciIg KSB7CgkJCW9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07CgkJfQoJCWhh c09wdGlvbnMgPSAhJC5pc0VtcHR5T2JqZWN0KCBvcHRpb25zICk7CgkJb3B0aW9u cy5jb21wbGV0ZSA9IGNhbGxiYWNrOwoJCWlmICggb3B0aW9ucy5kZWxheSApIHsK CQkJZWxlbWVudC5kZWxheSggb3B0aW9ucy5kZWxheSApOwoJCX0KCQlpZiAoIGhh c09wdGlvbnMgJiYgJC5lZmZlY3RzICYmICQuZWZmZWN0cy5lZmZlY3RbIGVmZmVj dE5hbWUgXSApIHsKCQkJZWxlbWVudFsgbWV0aG9kIF0oIG9wdGlvbnMgKTsKCQl9 IGVsc2UgaWYgKCBlZmZlY3ROYW1lICE9PSBtZXRob2QgJiYgZWxlbWVudFsgZWZm ZWN0TmFtZSBdICkgewoJCQllbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMu ZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApOwoJCX0gZWxzZSB7 CgkJCWVsZW1lbnQucXVldWUoZnVuY3Rpb24oIG5leHQgKSB7CgkJCQkkKCB0aGlz IClbIG1ldGhvZCBdKCk7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxi YWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApOwoJCQkJfQoJCQkJbmV4dCgpOwoJCQl9 KTsKCQl9Cgl9Owp9KTsKCn0pKCBqUXVlcnkgKTsKCihmdW5jdGlvbiggJCwgdW5k ZWZpbmVkICkgewoKdmFyIG1vdXNlSGFuZGxlZCA9IGZhbHNlOwokKCBkb2N1bWVu dCApLm1vdXNldXAoIGZ1bmN0aW9uKCkgewoJbW91c2VIYW5kbGVkID0gZmFsc2U7 Cn0pOwoKJC53aWRnZXQoInVpLm1vdXNlIiwgewoJdmVyc2lvbjogIjEuMTAuMCIs CglvcHRpb25zOiB7CgkJY2FuY2VsOiAiaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNl bGVjdCxvcHRpb24iLAoJCWRpc3RhbmNlOiAxLAoJCWRlbGF5OiAwCgl9LAoJX21v dXNlSW5pdDogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlz LmVsZW1lbnQKCQkJLmJpbmQoIm1vdXNlZG93bi4iK3RoaXMud2lkZ2V0TmFtZSwg ZnVuY3Rpb24oZXZlbnQpIHsKCQkJCXJldHVybiB0aGF0Ll9tb3VzZURvd24oZXZl bnQpOwoJCQl9KQoJCQkuYmluZCgiY2xpY2suIit0aGlzLndpZGdldE5hbWUsIGZ1 bmN0aW9uKGV2ZW50KSB7CgkJCQlpZiAodHJ1ZSA9PT0gJC5kYXRhKGV2ZW50LnRh cmdldCwgdGhhdC53aWRnZXROYW1lICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpKSB7 CgkJCQkJJC5yZW1vdmVEYXRhKGV2ZW50LnRhcmdldCwgdGhhdC53aWRnZXROYW1l ICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpOwoJCQkJCWV2ZW50LnN0b3BJbW1lZGlh dGVQcm9wYWdhdGlvbigpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfSk7 CgoJCXRoaXMuc3RhcnRlZCA9IGZhbHNlOwoJfSwKCgkvLyBUT0RPOiBtYWtlIHN1 cmUgZGVzdHJveWluZyBvbmUgaW5zdGFuY2Ugb2YgbW91c2UgZG9lc24ndCBtZXNz IHdpdGgKCS8vIG90aGVyIGluc3RhbmNlcyBvZiBtb3VzZQoJX21vdXNlRGVzdHJv eTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53 aWRnZXROYW1lKTsKCQlpZiAoIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlICkgewoJ CQkkKGRvY3VtZW50KQoJCQkJLnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRn ZXROYW1lLCB0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkKCQkJCS51bmJpbmQoIm1v dXNldXAuIit0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSk7 CgkJfQoJfSwKCglfbW91c2VEb3duOiBmdW5jdGlvbihldmVudCkgewoJCS8vIGRv bid0IGxldCBtb3JlIHRoYW4gb25lIHdpZGdldCBoYW5kbGUgbW91c2VTdGFydAoJ CWlmKCBtb3VzZUhhbmRsZWQgKSB7IHJldHVybjsgfQoKCQkvLyB3ZSBtYXkgaGF2 ZSBtaXNzZWQgbW91c2V1cCAob3V0IG9mIHdpbmRvdykKCQkodGhpcy5fbW91c2VT dGFydGVkICYmIHRoaXMuX21vdXNlVXAoZXZlbnQpKTsKCgkJdGhpcy5fbW91c2VE b3duRXZlbnQgPSBldmVudDsKCgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlidG5Jc0xl ZnQgPSAoZXZlbnQud2hpY2ggPT09IDEpLAoJCQkvLyBldmVudC50YXJnZXQubm9k ZU5hbWUgd29ya3MgYXJvdW5kIGEgYnVnIGluIElFIDggd2l0aAoJCQkvLyBkaXNh YmxlZCBpbnB1dHMgKCM3NjIwKQoJCQllbElzQ2FuY2VsID0gKHR5cGVvZiB0aGlz Lm9wdGlvbnMuY2FuY2VsID09PSAic3RyaW5nIiAmJiBldmVudC50YXJnZXQubm9k ZU5hbWUgPyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuY2Fu Y2VsKS5sZW5ndGggOiBmYWxzZSk7CgkJaWYgKCFidG5Jc0xlZnQgfHwgZWxJc0Nh bmNlbCB8fCAhdGhpcy5fbW91c2VDYXB0dXJlKGV2ZW50KSkgewoJCQlyZXR1cm4g dHJ1ZTsKCQl9CgoJCXRoaXMubW91c2VEZWxheU1ldCA9ICF0aGlzLm9wdGlvbnMu ZGVsYXk7CgkJaWYgKCF0aGlzLm1vdXNlRGVsYXlNZXQpIHsKCQkJdGhpcy5fbW91 c2VEZWxheVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCXRoYXQu bW91c2VEZWxheU1ldCA9IHRydWU7CgkJCX0sIHRoaXMub3B0aW9ucy5kZWxheSk7 CgkJfQoKCQlpZiAodGhpcy5fbW91c2VEaXN0YW5jZU1ldChldmVudCkgJiYgdGhp cy5fbW91c2VEZWxheU1ldChldmVudCkpIHsKCQkJdGhpcy5fbW91c2VTdGFydGVk ID0gKHRoaXMuX21vdXNlU3RhcnQoZXZlbnQpICE9PSBmYWxzZSk7CgkJCWlmICgh dGhpcy5fbW91c2VTdGFydGVkKSB7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgp OwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCS8vIENsaWNrIGV2ZW50IG1h eSBuZXZlciBoYXZlIGZpcmVkIChHZWNrbyAmIE9wZXJhKQoJCWlmICh0cnVlID09 PSAkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5hbWUgKyAiLnByZXZl bnRDbGlja0V2ZW50IikpIHsKCQkJJC5yZW1vdmVEYXRhKGV2ZW50LnRhcmdldCwg dGhpcy53aWRnZXROYW1lICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpOwoJCX0KCgkJ Ly8gdGhlc2UgZGVsZWdhdGVzIGFyZSByZXF1aXJlZCB0byBrZWVwIGNvbnRleHQK CQl0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJ CXJldHVybiB0aGF0Ll9tb3VzZU1vdmUoZXZlbnQpOwoJCX07CgkJdGhpcy5fbW91 c2VVcERlbGVnYXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKCQkJcmV0dXJuIHRoYXQu X21vdXNlVXAoZXZlbnQpOwoJCX07CgkJJChkb2N1bWVudCkKCQkJLmJpbmQoIm1v dXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSwgdGhpcy5fbW91c2VNb3ZlRGVsZWdh dGUpCgkJCS5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLCB0aGlzLl9t b3VzZVVwRGVsZWdhdGUpOwoKCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQlt b3VzZUhhbmRsZWQgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwKCglfbW91c2VN b3ZlOiBmdW5jdGlvbihldmVudCkgewoJCS8vIElFIG1vdXNldXAgY2hlY2sgLSBt b3VzZXVwIGhhcHBlbmVkIHdoZW4gbW91c2Ugd2FzIG91dCBvZiB3aW5kb3cKCQlp ZiAoJC51aS5pZSAmJiAoICFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1l bnQuZG9jdW1lbnRNb2RlIDwgOSApICYmICFldmVudC5idXR0b24pIHsKCQkJcmV0 dXJuIHRoaXMuX21vdXNlVXAoZXZlbnQpOwoJCX0KCgkJaWYgKHRoaXMuX21vdXNl U3RhcnRlZCkgewoJCQl0aGlzLl9tb3VzZURyYWcoZXZlbnQpOwoJCQlyZXR1cm4g ZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9CgoJCWlmICh0aGlzLl9tb3VzZURp c3RhbmNlTWV0KGV2ZW50KSAmJiB0aGlzLl9tb3VzZURlbGF5TWV0KGV2ZW50KSkg ewoJCQl0aGlzLl9tb3VzZVN0YXJ0ZWQgPQoJCQkJKHRoaXMuX21vdXNlU3RhcnQo dGhpcy5fbW91c2VEb3duRXZlbnQsIGV2ZW50KSAhPT0gZmFsc2UpOwoJCQkodGhp cy5fbW91c2VTdGFydGVkID8gdGhpcy5fbW91c2VEcmFnKGV2ZW50KSA6IHRoaXMu X21vdXNlVXAoZXZlbnQpKTsKCQl9CgoJCXJldHVybiAhdGhpcy5fbW91c2VTdGFy dGVkOwoJfSwKCglfbW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKCQkkKGRvY3Vt ZW50KQoJCQkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsIHRo aXMuX21vdXNlTW92ZURlbGVnYXRlKQoJCQkudW5iaW5kKCJtb3VzZXVwLiIrdGhp cy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZVVwRGVsZWdhdGUpOwoKCQlpZiAodGhp cy5fbW91c2VTdGFydGVkKSB7CgkJCXRoaXMuX21vdXNlU3RhcnRlZCA9IGZhbHNl OwoKCQkJaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fbW91c2VEb3duRXZlbnQu dGFyZ2V0KSB7CgkJCQkkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5h bWUgKyAiLnByZXZlbnRDbGlja0V2ZW50IiwgdHJ1ZSk7CgkJCX0KCgkJCXRoaXMu X21vdXNlU3RvcChldmVudCk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9t b3VzZURpc3RhbmNlTWV0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiAoTWF0 aC5tYXgoCgkJCQlNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWCAt IGV2ZW50LnBhZ2VYKSwKCQkJCU1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50 LnBhZ2VZIC0gZXZlbnQucGFnZVkpCgkJCSkgPj0gdGhpcy5vcHRpb25zLmRpc3Rh bmNlCgkJKTsKCX0sCgoJX21vdXNlRGVsYXlNZXQ6IGZ1bmN0aW9uKC8qIGV2ZW50 ICovKSB7CgkJcmV0dXJuIHRoaXMubW91c2VEZWxheU1ldDsKCX0sCgoJLy8gVGhl c2UgYXJlIHBsYWNlaG9sZGVyIG1ldGhvZHMsIHRvIGJlIG92ZXJyaWRlbiBieSBl eHRlbmRpbmcgcGx1Z2luCglfbW91c2VTdGFydDogZnVuY3Rpb24oLyogZXZlbnQg Ki8pIHt9LAoJX21vdXNlRHJhZzogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJ X21vdXNlU3RvcDogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlQ2Fw dHVyZTogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHsgcmV0dXJuIHRydWU7IH0KfSk7 Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLndp ZGdldCgidWkuZHJhZ2dhYmxlIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEu MTAuMCIsCgl3aWRnZXRFdmVudFByZWZpeDogImRyYWciLAoJb3B0aW9uczogewoJ CWFkZENsYXNzZXM6IHRydWUsCgkJYXBwZW5kVG86ICJwYXJlbnQiLAoJCWF4aXM6 IGZhbHNlLAoJCWNvbm5lY3RUb1NvcnRhYmxlOiBmYWxzZSwKCQljb250YWlubWVu dDogZmFsc2UsCgkJY3Vyc29yOiAiYXV0byIsCgkJY3Vyc29yQXQ6IGZhbHNlLAoJ CWdyaWQ6IGZhbHNlLAoJCWhhbmRsZTogZmFsc2UsCgkJaGVscGVyOiAib3JpZ2lu YWwiLAoJCWlmcmFtZUZpeDogZmFsc2UsCgkJb3BhY2l0eTogZmFsc2UsCgkJcmVm cmVzaFBvc2l0aW9uczogZmFsc2UsCgkJcmV2ZXJ0OiBmYWxzZSwKCQlyZXZlcnRE dXJhdGlvbjogNTAwLAoJCXNjb3BlOiAiZGVmYXVsdCIsCgkJc2Nyb2xsOiB0cnVl LAoJCXNjcm9sbFNlbnNpdGl2aXR5OiAyMCwKCQlzY3JvbGxTcGVlZDogMjAsCgkJ c25hcDogZmFsc2UsCgkJc25hcE1vZGU6ICJib3RoIiwKCQlzbmFwVG9sZXJhbmNl OiAyMCwKCQlzdGFjazogZmFsc2UsCgkJekluZGV4OiBmYWxzZSwKCgkJLy8gY2Fs bGJhY2tzCgkJZHJhZzogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxs Cgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgoJCWlmICh0aGlzLm9wdGlvbnMu aGVscGVyID09PSAib3JpZ2luYWwiICYmICEoL14oPzpyfGF8ZikvKS50ZXN0KHRo aXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIikpKSB7CgkJCXRoaXMuZWxlbWVudFsw XS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgkJfQoJCWlmICh0aGlzLm9w dGlvbnMuYWRkQ2xhc3Nlcyl7CgkJCXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWkt ZHJhZ2dhYmxlIik7CgkJfQoJCWlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpewoJ CQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kaXNhYmxlZCIp OwoJCX0KCgkJdGhpcy5fbW91c2VJbml0KCk7CgoJfSwKCglfZGVzdHJveTogZnVu Y3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktZHJhZ2dh YmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQi ICk7CgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9tb3VzZUNhcHR1cmU6 IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoKCQkv LyBhbW9uZyBvdGhlcnMsIHByZXZlbnQgYSBkcmFnIG9uIGEgcmVzaXphYmxlLWhh bmRsZQoJCWlmICh0aGlzLmhlbHBlciB8fCBvLmRpc2FibGVkIHx8ICQoZXZlbnQu dGFyZ2V0KS5jbG9zZXN0KCIudWktcmVzaXphYmxlLWhhbmRsZSIpLmxlbmd0aCA+ IDApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy9RdWl0IGlmIHdlJ3JlIG5v dCBvbiBhIHZhbGlkIGhhbmRsZQoJCXRoaXMuaGFuZGxlID0gdGhpcy5fZ2V0SGFu ZGxlKGV2ZW50KTsKCQlpZiAoIXRoaXMuaGFuZGxlKSB7CgkJCXJldHVybiBmYWxz ZTsKCQl9CgoJCSQoby5pZnJhbWVGaXggPT09IHRydWUgPyAiaWZyYW1lIiA6IG8u aWZyYW1lRml4KS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkkKCI8ZGl2IGNsYXNzPSd1 aS1kcmFnZ2FibGUtaWZyYW1lRml4JyBzdHlsZT0nYmFja2dyb3VuZDogI2ZmZjsn PjwvZGl2PiIpCgkJCS5jc3MoewoJCQkJd2lkdGg6IHRoaXMub2Zmc2V0V2lkdGgr InB4IiwgaGVpZ2h0OiB0aGlzLm9mZnNldEhlaWdodCsicHgiLAoJCQkJcG9zaXRp b246ICJhYnNvbHV0ZSIsIG9wYWNpdHk6ICIwLjAwMSIsIHpJbmRleDogMTAwMAoJ CQl9KQoJCQkuY3NzKCQodGhpcykub2Zmc2V0KCkpCgkJCS5hcHBlbmRUbygiYm9k eSIpOwoJCX0pOwoKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZVN0YXJ0OiBm dW5jdGlvbihldmVudCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCgkJLy9D cmVhdGUgYW5kIGFwcGVuZCB0aGUgdmlzaWJsZSBoZWxwZXIKCQl0aGlzLmhlbHBl ciA9IHRoaXMuX2NyZWF0ZUhlbHBlcihldmVudCk7CgoJCXRoaXMuaGVscGVyLmFk ZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTsKCgkJLy9DYWNoZSB0aGUg aGVscGVyIHNpemUKCQl0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCk7CgoJ CS8vSWYgZGRtYW5hZ2VyIGlzIHVzZWQgZm9yIGRyb3BwYWJsZXMsIHNldCB0aGUg Z2xvYmFsIGRyYWdnYWJsZQoJCWlmKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWku ZGRtYW5hZ2VyLmN1cnJlbnQgPSB0aGlzOwoJCX0KCgkJLyoKCQkgKiAtIFBvc2l0 aW9uIGdlbmVyYXRpb24gLQoJCSAqIFRoaXMgYmxvY2sgZ2VuZXJhdGVzIGV2ZXJ5 dGhpbmcgcG9zaXRpb24gcmVsYXRlZCAtIGl0J3MgdGhlIGNvcmUgb2YgZHJhZ2dh Ymxlcy4KCQkgKi8KCgkJLy9DYWNoZSB0aGUgbWFyZ2lucyBvZiB0aGUgb3JpZ2lu YWwgZWxlbWVudAoJCXRoaXMuX2NhY2hlTWFyZ2lucygpOwoKCQkvL1N0b3JlIHRo ZSBoZWxwZXIncyBjc3MgcG9zaXRpb24KCQl0aGlzLmNzc1Bvc2l0aW9uID0gdGhp cy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpOwoJCXRoaXMuc2Nyb2xsUGFyZW50ID0g dGhpcy5oZWxwZXIuc2Nyb2xsUGFyZW50KCk7CgoJCS8vVGhlIGVsZW1lbnQncyBh YnNvbHV0ZSBwb3NpdGlvbiBvbiB0aGUgcGFnZSBtaW51cyBtYXJnaW5zCgkJdGhp cy5vZmZzZXQgPSB0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5lbGVtZW50Lm9mZnNl dCgpOwoJCXRoaXMub2Zmc2V0ID0gewoJCQl0b3A6IHRoaXMub2Zmc2V0LnRvcCAt IHRoaXMubWFyZ2lucy50b3AsCgkJCWxlZnQ6IHRoaXMub2Zmc2V0LmxlZnQgLSB0 aGlzLm1hcmdpbnMubGVmdAoJCX07CgoJCSQuZXh0ZW5kKHRoaXMub2Zmc2V0LCB7 CgkJCWNsaWNrOiB7IC8vV2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkLCByZWxhdGl2 ZSB0byB0aGUgZWxlbWVudAoJCQkJbGVmdDogZXZlbnQucGFnZVggLSB0aGlzLm9m ZnNldC5sZWZ0LAoJCQkJdG9wOiBldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LnRv cAoJCQl9LAoJCQlwYXJlbnQ6IHRoaXMuX2dldFBhcmVudE9mZnNldCgpLAoJCQly ZWxhdGl2ZTogdGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSAvL1RoaXMgaXMgYSBy ZWxhdGl2ZSB0byBhYnNvbHV0ZSBwb3NpdGlvbiBtaW51cyB0aGUgYWN0dWFsIHBv c2l0aW9uIGNhbGN1bGF0aW9uIC0gb25seSB1c2VkIGZvciByZWxhdGl2ZSBwb3Np dGlvbmVkIGhlbHBlcgoJCX0pOwoKCQkvL0dlbmVyYXRlIHRoZSBvcmlnaW5hbCBw b3NpdGlvbgoJCXRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMucG9zaXRpb24g PSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLm9yaWdpbmFs UGFnZVggPSBldmVudC5wYWdlWDsKCQl0aGlzLm9yaWdpbmFsUGFnZVkgPSBldmVu dC5wYWdlWTsKCgkJLy9BZGp1c3QgdGhlIG1vdXNlIG9mZnNldCByZWxhdGl2ZSB0 byB0aGUgaGVscGVyIGlmICJjdXJzb3JBdCIgaXMgc3VwcGxpZWQKCQkoby5jdXJz b3JBdCAmJiB0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQp KTsKCgkJLy9TZXQgYSBjb250YWlubWVudCBpZiBnaXZlbiBpbiB0aGUgb3B0aW9u cwoJCWlmKG8uY29udGFpbm1lbnQpIHsKCQkJdGhpcy5fc2V0Q29udGFpbm1lbnQo KTsKCQl9CgoJCS8vVHJpZ2dlciBldmVudCArIGNhbGxiYWNrcwoJCWlmKHRoaXMu X3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQpID09PSBmYWxzZSkgewoJCQl0aGlzLl9j bGVhcigpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvL1JlY2FjaGUgdGhlIGhl bHBlciBzaXplCgkJdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpOwoKCQkv L1ByZXBhcmUgdGhlIGRyb3BwYWJsZSBvZmZzZXRzCgkJaWYgKCQudWkuZGRtYW5h Z2VyICYmICFvLmRyb3BCZWhhdmlvdXIpIHsKCQkJJC51aS5kZG1hbmFnZXIucHJl cGFyZU9mZnNldHModGhpcywgZXZlbnQpOwoJCX0KCgoJCXRoaXMuX21vdXNlRHJh ZyhldmVudCwgdHJ1ZSk7IC8vRXhlY3V0ZSB0aGUgZHJhZyBvbmNlIC0gdGhpcyBj YXVzZXMgdGhlIGhlbHBlciBub3QgdG8gYmUgdmlzaWJsZSBiZWZvcmUgZ2V0dGlu ZyBpdHMgY29ycmVjdCBwb3NpdGlvbgoKCQkvL0lmIHRoZSBkZG1hbmFnZXIgaXMg dXNlZCBmb3IgZHJvcHBhYmxlcywgaW5mb3JtIHRoZSBtYW5hZ2VyIHRoYXQgZHJh Z2dpbmcgaGFzIHN0YXJ0ZWQgKHNlZSAjNTAwMykKCQlpZiAoICQudWkuZGRtYW5h Z2VyICkgewoJCQkkLnVpLmRkbWFuYWdlci5kcmFnU3RhcnQodGhpcywgZXZlbnQp OwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9u KGV2ZW50LCBub1Byb3BhZ2F0aW9uKSB7CgoJCS8vQ29tcHV0ZSB0aGUgaGVscGVy cyBwb3NpdGlvbgoJCXRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0 aW9uKGV2ZW50KTsKCQl0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5fY29udmVydFBv c2l0aW9uVG8oImFic29sdXRlIik7CgoJCS8vQ2FsbCBwbHVnaW5zIGFuZCBjYWxs YmFja3MgYW5kIHVzZSB0aGUgcmVzdWx0aW5nIHBvc2l0aW9uIGlmIHNvbWV0aGlu ZyBpcyByZXR1cm5lZAoJCWlmICghbm9Qcm9wYWdhdGlvbikgewoJCQl2YXIgdWkg PSB0aGlzLl91aUhhc2goKTsKCQkJaWYodGhpcy5fdHJpZ2dlcigiZHJhZyIsIGV2 ZW50LCB1aSkgPT09IGZhbHNlKSB7CgkJCQl0aGlzLl9tb3VzZVVwKHt9KTsKCQkJ CXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLnBvc2l0aW9uID0gdWkucG9zaXRp b247CgkJfQoKCQlpZighdGhpcy5vcHRpb25zLmF4aXMgfHwgdGhpcy5vcHRpb25z LmF4aXMgIT09ICJ5IikgewoJCQl0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0ID0g dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCI7CgkJfQoJCWlmKCF0aGlzLm9wdGlvbnMu YXhpcyB8fCB0aGlzLm9wdGlvbnMuYXhpcyAhPT0gIngiKSB7CgkJCXRoaXMuaGVs cGVyWzBdLnN0eWxlLnRvcCA9IHRoaXMucG9zaXRpb24udG9wKyJweCI7CgkJfQoJ CWlmKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmRyYWcodGhp cywgZXZlbnQpOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCglfbW91c2VTdG9w OiBmdW5jdGlvbihldmVudCkgewoKCQkvL0lmIHdlIGFyZSB1c2luZyBkcm9wcGFi bGVzLCBpbmZvcm0gdGhlIG1hbmFnZXIgYWJvdXQgdGhlIGRyb3AKCQl2YXIgZWxl bWVudCwKCQkJdGhhdCA9IHRoaXMsCgkJCWVsZW1lbnRJbkRvbSA9IGZhbHNlLAoJ CQlkcm9wcGVkID0gZmFsc2U7CgkJaWYgKCQudWkuZGRtYW5hZ2VyICYmICF0aGlz Lm9wdGlvbnMuZHJvcEJlaGF2aW91cikgewoJCQlkcm9wcGVkID0gJC51aS5kZG1h bmFnZXIuZHJvcCh0aGlzLCBldmVudCk7CgkJfQoKCQkvL2lmIGEgZHJvcCBjb21l cyBmcm9tIG91dHNpZGUgKGEgc29ydGFibGUpCgkJaWYodGhpcy5kcm9wcGVkKSB7 CgkJCWRyb3BwZWQgPSB0aGlzLmRyb3BwZWQ7CgkJCXRoaXMuZHJvcHBlZCA9IGZh bHNlOwoJCX0KCgkJLy9pZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBubyBsb25n ZXIgaW4gdGhlIERPTSBkb24ndCBib3RoZXIgdG8gY29udGludWUgKHNlZSAjODI2 OSkKCQllbGVtZW50ID0gdGhpcy5lbGVtZW50WzBdOwoJCXdoaWxlICggZWxlbWVu dCAmJiAoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgKSB7CgkJCWlmIChl bGVtZW50ID09PSBkb2N1bWVudCApIHsKCQkJCWVsZW1lbnRJbkRvbSA9IHRydWU7 CgkJCX0KCQl9CgkJaWYgKCAhZWxlbWVudEluRG9tICYmIHRoaXMub3B0aW9ucy5o ZWxwZXIgPT09ICJvcmlnaW5hbCIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJ CWlmKCh0aGlzLm9wdGlvbnMucmV2ZXJ0ID09PSAiaW52YWxpZCIgJiYgIWRyb3Bw ZWQpIHx8ICh0aGlzLm9wdGlvbnMucmV2ZXJ0ID09PSAidmFsaWQiICYmIGRyb3Bw ZWQpIHx8IHRoaXMub3B0aW9ucy5yZXZlcnQgPT09IHRydWUgfHwgKCQuaXNGdW5j dGlvbih0aGlzLm9wdGlvbnMucmV2ZXJ0KSAmJiB0aGlzLm9wdGlvbnMucmV2ZXJ0 LmNhbGwodGhpcy5lbGVtZW50LCBkcm9wcGVkKSkpIHsKCQkJJCh0aGlzLmhlbHBl cikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24sIHBhcnNlSW50KHRoaXMu b3B0aW9ucy5yZXZlcnREdXJhdGlvbiwgMTApLCBmdW5jdGlvbigpIHsKCQkJCWlm KHRoYXQuX3RyaWdnZXIoInN0b3AiLCBldmVudCkgIT09IGZhbHNlKSB7CgkJCQkJ dGhhdC5fY2xlYXIoKTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJaWYodGhp cy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50KSAhPT0gZmFsc2UpIHsKCQkJCXRoaXMu X2NsZWFyKCk7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0sCgoJX21vdXNl VXA6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJLy9SZW1vdmUgZnJhbWUgaGVscGVycwoJ CSQoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigp IHsKCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpOwoJCX0pOwoK CQkvL0lmIHRoZSBkZG1hbmFnZXIgaXMgdXNlZCBmb3IgZHJvcHBhYmxlcywgaW5m b3JtIHRoZSBtYW5hZ2VyIHRoYXQgZHJhZ2dpbmcgaGFzIHN0b3BwZWQgKHNlZSAj NTAwMykKCQlpZiggJC51aS5kZG1hbmFnZXIgKSB7CgkJCSQudWkuZGRtYW5hZ2Vy LmRyYWdTdG9wKHRoaXMsIGV2ZW50KTsKCQl9CgoJCXJldHVybiAkLnVpLm1vdXNl LnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsIGV2ZW50KTsKCX0sCgoJY2Fu Y2VsOiBmdW5jdGlvbigpIHsKCgkJaWYodGhpcy5oZWxwZXIuaXMoIi51aS1kcmFn Z2FibGUtZHJhZ2dpbmciKSkgewoJCQl0aGlzLl9tb3VzZVVwKHt9KTsKCQl9IGVs c2UgewoJCQl0aGlzLl9jbGVhcigpOwoJCX0KCgkJcmV0dXJuIHRoaXM7CgoJfSwK CglfZ2V0SGFuZGxlOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgaGFuZGxlID0g IXRoaXMub3B0aW9ucy5oYW5kbGUgfHwgISQodGhpcy5vcHRpb25zLmhhbmRsZSwg dGhpcy5lbGVtZW50KS5sZW5ndGggPyB0cnVlIDogZmFsc2U7CgkJJCh0aGlzLm9w dGlvbnMuaGFuZGxlLCB0aGlzLmVsZW1lbnQpCgkJCS5maW5kKCIqIikKCQkJLmFk ZEJhY2soKQoJCQkuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmKHRoaXMgPT09IGV2 ZW50LnRhcmdldCkgewoJCQkJCWhhbmRsZSA9IHRydWU7CgkJCQl9CgkJCX0pOwoK CQlyZXR1cm4gaGFuZGxlOwoKCX0sCgoJX2NyZWF0ZUhlbHBlcjogZnVuY3Rpb24o ZXZlbnQpIHsKCgkJdmFyIG8gPSB0aGlzLm9wdGlvbnMsCgkJCWhlbHBlciA9ICQu aXNGdW5jdGlvbihvLmhlbHBlcikgPyAkKG8uaGVscGVyLmFwcGx5KHRoaXMuZWxl bWVudFswXSwgW2V2ZW50XSkpIDogKG8uaGVscGVyID09PSAiY2xvbmUiID8gdGhp cy5lbGVtZW50LmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKSA6IHRoaXMuZWxlbWVu dCk7CgoJCWlmKCFoZWxwZXIucGFyZW50cygiYm9keSIpLmxlbmd0aCkgewoJCQlo ZWxwZXIuYXBwZW5kVG8oKG8uYXBwZW5kVG8gPT09ICJwYXJlbnQiID8gdGhpcy5l bGVtZW50WzBdLnBhcmVudE5vZGUgOiBvLmFwcGVuZFRvKSk7CgkJfQoKCQlpZiho ZWxwZXJbMF0gIT09IHRoaXMuZWxlbWVudFswXSAmJiAhKC8oZml4ZWR8YWJzb2x1 dGUpLykudGVzdChoZWxwZXIuY3NzKCJwb3NpdGlvbiIpKSkgewoJCQloZWxwZXIu Y3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpOwoJCX0KCgkJcmV0dXJuIGhlbHBl cjsKCgl9LAoKCV9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOiBmdW5jdGlvbihvYmop IHsKCQlpZiAodHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKCQkJb2JqID0gb2Jq LnNwbGl0KCIgIik7CgkJfQoJCWlmICgkLmlzQXJyYXkob2JqKSkgewoJCQlvYmog PSB7bGVmdDogK29ialswXSwgdG9wOiArb2JqWzFdIHx8IDB9OwoJCX0KCQlpZiAo ImxlZnQiIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay5sZWZ0ID0gb2Jq LmxlZnQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCJyaWdodCIgaW4g b2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSB0aGlzLmhlbHBlclBy b3BvcnRpb25zLndpZHRoIC0gb2JqLnJpZ2h0ICsgdGhpcy5tYXJnaW5zLmxlZnQ7 CgkJfQoJCWlmICgidG9wIiBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2su dG9wID0gb2JqLnRvcCArIHRoaXMubWFyZ2lucy50b3A7CgkJfQoJCWlmICgiYm90 dG9tIiBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2sudG9wID0gdGhpcy5o ZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSBvYmouYm90dG9tICsgdGhpcy5tYXJn aW5zLnRvcDsKCQl9Cgl9LAoKCV9nZXRQYXJlbnRPZmZzZXQ6IGZ1bmN0aW9uKCkg ewoKCQkvL0dldCB0aGUgb2Zmc2V0UGFyZW50IGFuZCBjYWNoZSBpdHMgcG9zaXRp b24KCQl0aGlzLm9mZnNldFBhcmVudCA9IHRoaXMuaGVscGVyLm9mZnNldFBhcmVu dCgpOwoJCXZhciBwbyA9IHRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkv LyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5 IGEgb2Zmc2V0IGNhbGN1bGF0ZWQgb24gc3RhcnQsIHNpbmNlIHRoZSBmb2xsb3dp bmcgaGFwcGVuZWQ6CgkJLy8gMS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIg aXMgYWJzb2x1dGUsIHNvIGl0J3MgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNl ZCBvbiB0aGUgbmV4dCBwb3NpdGlvbmVkIHBhcmVudAoJCS8vIDIuIFRoZSBhY3R1 YWwgb2Zmc2V0IHBhcmVudCBpcyBhIGNoaWxkIG9mIHRoZSBzY3JvbGwgcGFyZW50 LCBhbmQgdGhlIHNjcm9sbCBwYXJlbnQgaXNuJ3QgdGhlIGRvY3VtZW50LCB3aGlj aCBtZWFucyB0aGF0CgkJLy8gICAgdGhlIHNjcm9sbCBpcyBpbmNsdWRlZCBpbiB0 aGUgaW5pdGlhbCBjYWxjdWxhdGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJl bnQsIGFuZCBuZXZlciByZWNhbGN1bGF0ZWQgdXBvbiBkcmFnCgkJaWYodGhpcy5j c3NQb3NpdGlvbiA9PT0gImFic29sdXRlIiAmJiB0aGlzLnNjcm9sbFBhcmVudFsw XSAhPT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFsw XSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSB7CgkJCXBvLmxlZnQgKz0gdGhpcy5z Y3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOwoJCQlwby50b3AgKz0gdGhpcy5zY3Jv bGxQYXJlbnQuc2Nyb2xsVG9wKCk7CgkJfQoKCQkvL1RoaXMgbmVlZHMgdG8gYmUg YWN0dWFsbHkgZG9uZSBmb3IgYWxsIGJyb3dzZXJzLCBzaW5jZSBwYWdlWC9wYWdl WSBpbmNsdWRlcyB0aGlzIGluZm9ybWF0aW9uCgkJLy9VZ2x5IElFIGZpeAoJCWlm KCh0aGlzLm9mZnNldFBhcmVudFswXSA9PT0gZG9jdW1lbnQuYm9keSkgfHwKCQkJ KHRoaXMub2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUgJiYgdGhpcy5vZmZzZXRQYXJl bnRbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaHRtbCIgJiYgJC51aS5p ZSkpIHsKCQkJcG8gPSB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJcmV0dXJu IHsKCQkJdG9wOiBwby50b3AgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQu Y3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSwKCQkJbGVmdDogcG8ubGVm dCArIChwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRX aWR0aCIpLDEwKSB8fCAwKQoJCX07CgoJfSwKCglfZ2V0UmVsYXRpdmVPZmZzZXQ6 IGZ1bmN0aW9uKCkgewoKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09PSAicmVsYXRp dmUiKSB7CgkJCXZhciBwID0gdGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7CgkJCXJl dHVybiB7CgkJCQl0b3A6IHAudG9wIC0gKHBhcnNlSW50KHRoaXMuaGVscGVyLmNz cygidG9wIiksMTApIHx8IDApICsgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9w KCksCgkJCQlsZWZ0OiBwLmxlZnQgLSAocGFyc2VJbnQodGhpcy5oZWxwZXIuY3Nz KCJsZWZ0IiksMTApIHx8IDApICsgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVm dCgpCgkJCX07CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAw IH07CgkJfQoKCX0sCgoJX2NhY2hlTWFyZ2luczogZnVuY3Rpb24oKSB7CgkJdGhp cy5tYXJnaW5zID0gewoJCQlsZWZ0OiAocGFyc2VJbnQodGhpcy5lbGVtZW50LmNz cygibWFyZ2luTGVmdCIpLDEwKSB8fCAwKSwKCQkJdG9wOiAocGFyc2VJbnQodGhp cy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApIHx8IDApLAoJCQlyaWdodDog KHBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApIHx8 IDApLAoJCQlib3R0b206IChwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJn aW5Cb3R0b20iKSwxMCkgfHwgMCkKCQl9OwoJfSwKCglfY2FjaGVIZWxwZXJQcm9w b3J0aW9uczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWxwZXJQcm9wb3J0aW9ucyA9 IHsKCQkJd2lkdGg6IHRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSwKCQkJaGVpZ2h0 OiB0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpCgkJfTsKCX0sCgoJX3NldENvbnRh aW5tZW50OiBmdW5jdGlvbigpIHsKCgkJdmFyIG92ZXIsIGMsIGNlLAoJCQlvID0g dGhpcy5vcHRpb25zOwoKCQlpZihvLmNvbnRhaW5tZW50ID09PSAicGFyZW50Iikg ewoJCQlvLmNvbnRhaW5tZW50ID0gdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZTsK CQl9CgkJaWYoby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IiB8fCBvLmNvbnRh aW5tZW50ID09PSAid2luZG93IikgewoJCQl0aGlzLmNvbnRhaW5tZW50ID0gWwoJ CQkJby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IiA/IDAgOiAkKHdpbmRvdyku c2Nyb2xsTGVmdCgpIC0gdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCAtIHRoaXMu b2Zmc2V0LnBhcmVudC5sZWZ0LAoJCQkJby5jb250YWlubWVudCA9PT0gImRvY3Vt ZW50IiA/IDAgOiAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgLSB0aGlzLm9mZnNldC5y ZWxhdGl2ZS50b3AgLSB0aGlzLm9mZnNldC5wYXJlbnQudG9wLAoJCQkJKG8uY29u dGFpbm1lbnQgPT09ICJkb2N1bWVudCIgPyAwIDogJCh3aW5kb3cpLnNjcm9sbExl ZnQoKSkgKyAkKG8uY29udGFpbm1lbnQgPT09ICJkb2N1bWVudCIgPyBkb2N1bWVu dCA6IHdpbmRvdykud2lkdGgoKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lk dGggLSB0aGlzLm1hcmdpbnMubGVmdCwKCQkJCShvLmNvbnRhaW5tZW50ID09PSAi ZG9jdW1lbnQiID8gMCA6ICQod2luZG93KS5zY3JvbGxUb3AoKSkgKyAoJChvLmNv bnRhaW5tZW50ID09PSAiZG9jdW1lbnQiID8gZG9jdW1lbnQgOiB3aW5kb3cpLmhl aWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQp IC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMu dG9wCgkJCV07CgkJfQoKCQlpZighKC9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQp JC8pLnRlc3Qoby5jb250YWlubWVudCkgJiYgby5jb250YWlubWVudC5jb25zdHJ1 Y3RvciAhPT0gQXJyYXkpIHsKCQkJYyA9ICQoby5jb250YWlubWVudCk7CgkJCWNl ID0gY1swXTsKCgkJCWlmKCFjZSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlvdmVy ID0gKCQoY2UpLmNzcygib3ZlcmZsb3ciKSAhPT0gImhpZGRlbiIpOwoKCQkJdGhp cy5jb250YWlubWVudCA9IFsKCQkJCShwYXJzZUludCgkKGNlKS5jc3MoImJvcmRl ckxlZnRXaWR0aCIpLDEwKSB8fCAwKSArIChwYXJzZUludCgkKGNlKS5jc3MoInBh ZGRpbmdMZWZ0IiksMTApIHx8IDApLAoJCQkJKHBhcnNlSW50KCQoY2UpLmNzcygi Ym9yZGVyVG9wV2lkdGgiKSwxMCkgfHwgMCkgKyAocGFyc2VJbnQoJChjZSkuY3Nz KCJwYWRkaW5nVG9wIiksMTApIHx8IDApLAoJCQkJKG92ZXIgPyBNYXRoLm1heChj ZS5zY3JvbGxXaWR0aCxjZS5vZmZzZXRXaWR0aCkgOiBjZS5vZmZzZXRXaWR0aCkg LSAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwg MCkgLSAocGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCkgfHwg MCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5z LmxlZnQgLSB0aGlzLm1hcmdpbnMucmlnaHQsCgkJCQkob3ZlciA/IE1hdGgubWF4 KGNlLnNjcm9sbEhlaWdodCxjZS5vZmZzZXRIZWlnaHQpIDogY2Uub2Zmc2V0SGVp Z2h0KSAtIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTAp IHx8IDApIC0gKHBhcnNlSW50KCQoY2UpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEw KSB8fCAwKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gdGhpcy5t YXJnaW5zLnRvcCAgLSB0aGlzLm1hcmdpbnMuYm90dG9tCgkJCV07CgkJCXRoaXMu cmVsYXRpdmVfY29udGFpbmVyID0gYzsKCgkJfSBlbHNlIGlmKG8uY29udGFpbm1l bnQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CgkJCXRoaXMuY29udGFpbm1lbnQg PSBvLmNvbnRhaW5tZW50OwoJCX0KCgl9LAoKCV9jb252ZXJ0UG9zaXRpb25Ubzog ZnVuY3Rpb24oZCwgcG9zKSB7CgoJCWlmKCFwb3MpIHsKCQkJcG9zID0gdGhpcy5w b3NpdGlvbjsKCQl9CgoJCXZhciBtb2QgPSBkID09PSAiYWJzb2x1dGUiID8gMSA6 IC0xLAoJCQlzY3JvbGwgPSB0aGlzLmNzc1Bvc2l0aW9uID09PSAiYWJzb2x1dGUi ICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmICQuY29u dGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sIHRoaXMub2Zmc2V0UGFyZW50WzBd KSkgPyB0aGlzLm9mZnNldFBhcmVudCA6IHRoaXMuc2Nyb2xsUGFyZW50LCBzY3Jv bGxJc1Jvb3ROb2RlID0gKC8oaHRtbHxib2R5KS9pKS50ZXN0KHNjcm9sbFswXS50 YWdOYW1lKTsKCgkJcmV0dXJuIHsKCQkJdG9wOiAoCgkJCQlwb3MudG9wCSsJCQkJ CQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0 aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgKiBtb2QgKwkJCQkJCQkJCQkvLyBPbmx5 IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQg ZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBh cmVudC50b3AgKiBtb2QgLQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mg b2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCAo IHRoaXMuY3NzUG9zaXRpb24gPT09ICJmaXhlZCIgPyAtdGhpcy5zY3JvbGxQYXJl bnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xs LnNjcm9sbFRvcCgpICkgKSAqIG1vZCkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcG9z LmxlZnQgKwkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9z aXRpb24KCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgKiBtb2QgKwkJCQkJ CQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxh dGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRo aXMub2Zmc2V0LnBhcmVudC5sZWZ0ICogbW9kCS0JCQkJCQkJCQkJLy8gVGhlIG9m ZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJv cmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRo aXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUg PyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApICogbW9kKQoJCQkpCgkJfTsKCgl9 LAoKCV9nZW5lcmF0ZVBvc2l0aW9uOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIg Y29udGFpbm1lbnQsIGNvLCB0b3AsIGxlZnQsCgkJCW8gPSB0aGlzLm9wdGlvbnMs CgkJCXNjcm9sbCA9IHRoaXMuY3NzUG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgJiYg ISh0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQgJiYgJC5jb250YWlu cyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSA/ IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQsCgkJCXNjcm9s bElzUm9vdE5vZGUgPSAoLyhodG1sfGJvZHkpL2kpLnRlc3Qoc2Nyb2xsWzBdLnRh Z05hbWUpLAoJCQlwYWdlWCA9IGV2ZW50LnBhZ2VYLAoJCQlwYWdlWSA9IGV2ZW50 LnBhZ2VZOwoKCQkvKgoJCSAqIC0gUG9zaXRpb24gY29uc3RyYWluaW5nIC0KCQkg KiBDb25zdHJhaW4gdGhlIHBvc2l0aW9uIHRvIGEgbWl4IG9mIGdyaWQsIGNvbnRh aW5tZW50LgoJCSAqLwoKCQlpZih0aGlzLm9yaWdpbmFsUG9zaXRpb24pIHsgLy9J ZiB3ZSBhcmUgbm90IGRyYWdnaW5nIHlldCwgd2Ugd29uJ3QgY2hlY2sgZm9yIG9w dGlvbnMKCQkJaWYodGhpcy5jb250YWlubWVudCkgewoJCQlpZiAodGhpcy5yZWxh dGl2ZV9jb250YWluZXIpewoJCQkJY28gPSB0aGlzLnJlbGF0aXZlX2NvbnRhaW5l ci5vZmZzZXQoKTsKCQkJCWNvbnRhaW5tZW50ID0gWyB0aGlzLmNvbnRhaW5tZW50 WzBdICsgY28ubGVmdCwKCQkJCQl0aGlzLmNvbnRhaW5tZW50WzFdICsgY28udG9w LAoJCQkJCXRoaXMuY29udGFpbm1lbnRbMl0gKyBjby5sZWZ0LAoJCQkJCXRoaXMu Y29udGFpbm1lbnRbM10gKyBjby50b3AgXTsKCQkJfQoJCQllbHNlIHsKCQkJCWNv bnRhaW5tZW50ID0gdGhpcy5jb250YWlubWVudDsKCQkJfQoKCQkJCWlmKGV2ZW50 LnBhZ2VYIC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA8IGNvbnRhaW5tZW50WzBd KSB7CgkJCQkJcGFnZVggPSBjb250YWlubWVudFswXSArIHRoaXMub2Zmc2V0LmNs aWNrLmxlZnQ7CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0 LmNsaWNrLnRvcCA8IGNvbnRhaW5tZW50WzFdKSB7CgkJCQkJcGFnZVkgPSBjb250 YWlubWVudFsxXSArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcDsKCQkJCX0KCQkJCWlm KGV2ZW50LnBhZ2VYIC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+IGNvbnRhaW5t ZW50WzJdKSB7CgkJCQkJcGFnZVggPSBjb250YWlubWVudFsyXSArIHRoaXMub2Zm c2V0LmNsaWNrLmxlZnQ7CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWSAtIHRoaXMu b2Zmc2V0LmNsaWNrLnRvcCA+IGNvbnRhaW5tZW50WzNdKSB7CgkJCQkJcGFnZVkg PSBjb250YWlubWVudFszXSArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcDsKCQkJCX0K CQkJfQoKCQkJaWYoby5ncmlkKSB7CgkJCQkvL0NoZWNrIGZvciBncmlkIGVsZW1l bnRzIHNldCB0byAwIHRvIHByZXZlbnQgZGl2aWRlIGJ5IDAgZXJyb3IgY2F1c2lu ZyBpbnZhbGlkIGFyZ3VtZW50IGVycm9ycyBpbiBJRSAoc2VlIHRpY2tldCAjNjk1 MCkKCQkJCXRvcCA9IG8uZ3JpZFsxXSA/IHRoaXMub3JpZ2luYWxQYWdlWSArIE1h dGgucm91bmQoKHBhZ2VZIC0gdGhpcy5vcmlnaW5hbFBhZ2VZKSAvIG8uZ3JpZFsx XSkgKiBvLmdyaWRbMV0gOiB0aGlzLm9yaWdpbmFsUGFnZVk7CgkJCQlwYWdlWSA9 IGNvbnRhaW5tZW50ID8gKCh0b3AgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPj0g Y29udGFpbm1lbnRbMV0gfHwgdG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID4g Y29udGFpbm1lbnRbM10pID8gdG9wIDogKCh0b3AgLSB0aGlzLm9mZnNldC5jbGlj ay50b3AgPj0gY29udGFpbm1lbnRbMV0pID8gdG9wIC0gby5ncmlkWzFdIDogdG9w ICsgby5ncmlkWzFdKSkgOiB0b3A7CgoJCQkJbGVmdCA9IG8uZ3JpZFswXSA/IHRo aXMub3JpZ2luYWxQYWdlWCArIE1hdGgucm91bmQoKHBhZ2VYIC0gdGhpcy5vcmln aW5hbFBhZ2VYKSAvIG8uZ3JpZFswXSkgKiBvLmdyaWRbMF0gOiB0aGlzLm9yaWdp bmFsUGFnZVg7CgkJCQlwYWdlWCA9IGNvbnRhaW5tZW50ID8gKChsZWZ0IC0gdGhp cy5vZmZzZXQuY2xpY2subGVmdCA+PSBjb250YWlubWVudFswXSB8fCBsZWZ0IC0g dGhpcy5vZmZzZXQuY2xpY2subGVmdCA+IGNvbnRhaW5tZW50WzJdKSA/IGxlZnQg OiAoKGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0ID49IGNvbnRhaW5tZW50 WzBdKSA/IGxlZnQgLSBvLmdyaWRbMF0gOiBsZWZ0ICsgby5ncmlkWzBdKSkgOiBs ZWZ0OwoJCQl9CgoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiAoCgkJCQlwYWdlWSAt CQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24K CQkJCXRoaXMub2Zmc2V0LmNsaWNrLnRvcAktCQkJCQkJCQkJCQkJLy8gQ2xpY2sg b2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgZWxlbWVudCkKCQkJCXRoaXMub2Zmc2V0 LnJlbGF0aXZlLnRvcCAtCQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUg cG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0 byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQudG9wICsJCQkJ CQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9y ZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCAoIHRoaXMuY3NzUG9zaXRpb24g PT09ICJmaXhlZCIgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAo IHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSkK CQkJKSwKCQkJbGVmdDogKAoJCQkJcGFnZVggLQkJCQkJCQkJCQkJCQkJCQkJLy8g VGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9mZnNldC5jbGlj ay5sZWZ0IC0JCQkJCQkJCQkJCQkvLyBDbGljayBvZmZzZXQgKHJlbGF0aXZlIHRv IHRoZSBlbGVtZW50KQoJCQkJdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCAtCQkJ CQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2Rlczog UmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJ CQl0aGlzLm9mZnNldC5wYXJlbnQubGVmdCArCQkJCQkJCQkJCQkJLy8gVGhlIG9m ZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJv cmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRo aXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUg PyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApKQoJCQkpCgkJfTsKCgl9LAoKCV9j bGVhcjogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWxwZXIucmVtb3ZlQ2xhc3MoInVp LWRyYWdnYWJsZS1kcmFnZ2luZyIpOwoJCWlmKHRoaXMuaGVscGVyWzBdICE9PSB0 aGlzLmVsZW1lbnRbMF0gJiYgIXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbCkgewoJ CQl0aGlzLmhlbHBlci5yZW1vdmUoKTsKCQl9CgkJdGhpcy5oZWxwZXIgPSBudWxs OwoJCXRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IGZhbHNlOwoJfSwKCgkvLyBG cm9tIG5vdyBvbiBidWxrIHN0dWZmIC0gbWFpbmx5IGhlbHBlcnMKCglfdHJpZ2dl cjogZnVuY3Rpb24odHlwZSwgZXZlbnQsIHVpKSB7CgkJdWkgPSB1aSB8fCB0aGlz Ll91aUhhc2goKTsKCQkkLnVpLnBsdWdpbi5jYWxsKHRoaXMsIHR5cGUsIFtldmVu dCwgdWldKTsKCQkvL1RoZSBhYnNvbHV0ZSBwb3NpdGlvbiBoYXMgdG8gYmUgcmVj YWxjdWxhdGVkIGFmdGVyIHBsdWdpbnMKCQlpZih0eXBlID09PSAiZHJhZyIpIHsK CQkJdGhpcy5wb3NpdGlvbkFicyA9IHRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJh YnNvbHV0ZSIpOwoJCX0KCQlyZXR1cm4gJC5XaWRnZXQucHJvdG90eXBlLl90cmln Z2VyLmNhbGwodGhpcywgdHlwZSwgZXZlbnQsIHVpKTsKCX0sCgoJcGx1Z2luczog e30sCgoJX3VpSGFzaDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJaGVscGVy OiB0aGlzLmhlbHBlciwKCQkJcG9zaXRpb246IHRoaXMucG9zaXRpb24sCgkJCW9y aWdpbmFsUG9zaXRpb246IHRoaXMub3JpZ2luYWxQb3NpdGlvbiwKCQkJb2Zmc2V0 OiB0aGlzLnBvc2l0aW9uQWJzCgkJfTsKCX0KCn0pOwoKJC51aS5wbHVnaW4uYWRk KCJkcmFnZ2FibGUiLCAiY29ubmVjdFRvU29ydGFibGUiLCB7CglzdGFydDogZnVu Y3Rpb24oZXZlbnQsIHVpKSB7CgoJCXZhciBpbnN0ID0gJCh0aGlzKS5kYXRhKCJ1 aS1kcmFnZ2FibGUiKSwgbyA9IGluc3Qub3B0aW9ucywKCQkJdWlTb3J0YWJsZSA9 ICQuZXh0ZW5kKHt9LCB1aSwgeyBpdGVtOiBpbnN0LmVsZW1lbnQgfSk7CgkJaW5z dC5zb3J0YWJsZXMgPSBbXTsKCQkkKG8uY29ubmVjdFRvU29ydGFibGUpLmVhY2go ZnVuY3Rpb24oKSB7CgkJCXZhciBzb3J0YWJsZSA9ICQuZGF0YSh0aGlzLCAidWkt c29ydGFibGUiKTsKCQkJaWYgKHNvcnRhYmxlICYmICFzb3J0YWJsZS5vcHRpb25z LmRpc2FibGVkKSB7CgkJCQlpbnN0LnNvcnRhYmxlcy5wdXNoKHsKCQkJCQlpbnN0 YW5jZTogc29ydGFibGUsCgkJCQkJc2hvdWxkUmV2ZXJ0OiBzb3J0YWJsZS5vcHRp b25zLnJldmVydAoJCQkJfSk7CgkJCQlzb3J0YWJsZS5yZWZyZXNoUG9zaXRpb25z KCk7CS8vIENhbGwgdGhlIHNvcnRhYmxlJ3MgcmVmcmVzaFBvc2l0aW9ucyBhdCBk cmFnIHN0YXJ0IHRvIHJlZnJlc2ggdGhlIGNvbnRhaW5lckNhY2hlIHNpbmNlIHRo ZSBzb3J0YWJsZSBjb250YWluZXIgY2FjaGUgaXMgdXNlZCBpbiBkcmFnIGFuZCBu ZWVkcyB0byBiZSB1cCB0byBkYXRlICh0aGlzIHdpbGwgZW5zdXJlIGl0J3MgaW5p dGlhbGlzZWQgYXMgd2VsbCBhcyBiZWluZyBrZXB0IGluIHN0ZXAgd2l0aCBhbnkg Y2hhbmdlcyB0aGF0IG1pZ2h0IGhhdmUgaGFwcGVuZWQgb24gdGhlIHBhZ2UpLgoJ CQkJc29ydGFibGUuX3RyaWdnZXIoImFjdGl2YXRlIiwgZXZlbnQsIHVpU29ydGFi bGUpOwoJCQl9CgkJfSk7CgoJfSwKCXN0b3A6IGZ1bmN0aW9uKGV2ZW50LCB1aSkg ewoKCQkvL0lmIHdlIGFyZSBzdGlsbCBvdmVyIHRoZSBzb3J0YWJsZSwgd2UgZmFr ZSB0aGUgc3RvcCBldmVudCBvZiB0aGUgc29ydGFibGUsIGJ1dCBhbHNvIHJlbW92 ZSBoZWxwZXIKCQl2YXIgaW5zdCA9ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxl IiksCgkJCXVpU29ydGFibGUgPSAkLmV4dGVuZCh7fSwgdWksIHsgaXRlbTogaW5z dC5lbGVtZW50IH0pOwoKCQkkLmVhY2goaW5zdC5zb3J0YWJsZXMsIGZ1bmN0aW9u KCkgewoJCQlpZih0aGlzLmluc3RhbmNlLmlzT3ZlcikgewoKCQkJCXRoaXMuaW5z dGFuY2UuaXNPdmVyID0gMDsKCgkJCQlpbnN0LmNhbmNlbEhlbHBlclJlbW92YWwg PSB0cnVlOyAvL0Rvbid0IHJlbW92ZSB0aGUgaGVscGVyIGluIHRoZSBkcmFnZ2Fi bGUgaW5zdGFuY2UKCQkJCXRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3Zh bCA9IGZhbHNlOyAvL1JlbW92ZSBpdCBpbiB0aGUgc29ydGFibGUgaW5zdGFuY2Ug KHNvIHNvcnRhYmxlIHBsdWdpbnMgbGlrZSByZXZlcnQgc3RpbGwgd29yaykKCgkJ CQkvL1RoZSBzb3J0YWJsZSByZXZlcnQgaXMgc3VwcG9ydGVkLCBhbmQgd2UgaGF2 ZSB0byBzZXQgYSB0ZW1wb3JhcnkgZHJvcHBlZCB2YXJpYWJsZSBvbiB0aGUgZHJh Z2dhYmxlIHRvIHN1cHBvcnQgcmV2ZXJ0OiAidmFsaWQvaW52YWxpZCIKCQkJCWlm KHRoaXMuc2hvdWxkUmV2ZXJ0KSB7CgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25z LnJldmVydCA9IHRydWU7CgkJCQl9CgoJCQkJLy9UcmlnZ2VyIHRoZSBzdG9wIG9m IHRoZSBzb3J0YWJsZQoJCQkJdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGV2ZW50 KTsKCgkJCQl0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyID0gdGhpcy5pbnN0 YW5jZS5vcHRpb25zLl9oZWxwZXI7CgoJCQkJLy9JZiB0aGUgaGVscGVyIGhhcyBi ZWVuIHRoZSBvcmlnaW5hbCBpdGVtLCByZXN0b3JlIHByb3BlcnRpZXMgaW4gdGhl IHNvcnRhYmxlCgkJCQlpZihpbnN0Lm9wdGlvbnMuaGVscGVyID09PSAib3JpZ2lu YWwiKSB7CgkJCQkJdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5jc3MoeyB0b3A6 ICJhdXRvIiwgbGVmdDogImF1dG8iIH0pOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJ CXRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IGZhbHNlOyAvL1Jl bW92ZSB0aGUgaGVscGVyIGluIHRoZSBzb3J0YWJsZSBpbnN0YW5jZQoJCQkJdGhp cy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIGV2ZW50LCB1aVNvcnRh YmxlKTsKCQkJfQoKCQl9KTsKCgl9LAoJZHJhZzogZnVuY3Rpb24oZXZlbnQsIHVp KSB7CgoJCXZhciBpbnN0ID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKSwg dGhhdCA9IHRoaXM7CgoJCSQuZWFjaChpbnN0LnNvcnRhYmxlcywgZnVuY3Rpb24o KSB7CgoJCQl2YXIgaW5uZXJtb3N0SW50ZXJzZWN0aW5nID0gZmFsc2UsCgkJCQl0 aGlzU29ydGFibGUgPSB0aGlzOwoKCQkJLy9Db3B5IG92ZXIgc29tZSB2YXJpYWJs ZXMgdG8gYWxsb3cgY2FsbGluZyB0aGUgc29ydGFibGUncyBuYXRpdmUgX2ludGVy c2VjdHNXaXRoCgkJCXRoaXMuaW5zdGFuY2UucG9zaXRpb25BYnMgPSBpbnN0LnBv c2l0aW9uQWJzOwoJCQl0aGlzLmluc3RhbmNlLmhlbHBlclByb3BvcnRpb25zID0g aW5zdC5oZWxwZXJQcm9wb3J0aW9uczsKCQkJdGhpcy5pbnN0YW5jZS5vZmZzZXQu Y2xpY2sgPSBpbnN0Lm9mZnNldC5jbGljazsKCgkJCWlmKHRoaXMuaW5zdGFuY2Uu X2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpKSB7 CgkJCQlpbm5lcm1vc3RJbnRlcnNlY3RpbmcgPSB0cnVlOwoJCQkJJC5lYWNoKGlu c3Quc29ydGFibGVzLCBmdW5jdGlvbiAoKSB7CgkJCQkJdGhpcy5pbnN0YW5jZS5w b3NpdGlvbkFicyA9IGluc3QucG9zaXRpb25BYnM7CgkJCQkJdGhpcy5pbnN0YW5j ZS5oZWxwZXJQcm9wb3J0aW9ucyA9IGluc3QuaGVscGVyUHJvcG9ydGlvbnM7CgkJ CQkJdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sgPSBpbnN0Lm9mZnNldC5jbGlj azsKCQkJCQlpZiAodGhpcyAhPT0gdGhpc1NvcnRhYmxlICYmCgkJCQkJCXRoaXMu aW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVy Q2FjaGUpICYmCgkJCQkJCSQudWkuY29udGFpbnModGhpc1NvcnRhYmxlLmluc3Rh bmNlLmVsZW1lbnRbMF0sIHRoaXMuaW5zdGFuY2UuZWxlbWVudFswXSkKCQkJCQkp IHsKCQkJCQkJaW5uZXJtb3N0SW50ZXJzZWN0aW5nID0gZmFsc2U7CgkJCQkJfQoJ CQkJCXJldHVybiBpbm5lcm1vc3RJbnRlcnNlY3Rpbmc7CgkJCQl9KTsKCQkJfQoK CgkJCWlmKGlubmVybW9zdEludGVyc2VjdGluZykgewoJCQkJLy9JZiBpdCBpbnRl cnNlY3RzLCB3ZSB1c2UgYSBsaXR0bGUgaXNPdmVyIHZhcmlhYmxlIGFuZCBzZXQg aXQgb25jZSwgc28gb3VyIG1vdmUtaW4gc3R1ZmYgZ2V0cyBmaXJlZCBvbmx5IG9u Y2UKCQkJCWlmKCF0aGlzLmluc3RhbmNlLmlzT3ZlcikgewoKCQkJCQl0aGlzLmlu c3RhbmNlLmlzT3ZlciA9IDE7CgkJCQkJLy9Ob3cgd2UgZmFrZSB0aGUgc3RhcnQg b2YgZHJhZ2dpbmcgZm9yIHRoZSBzb3J0YWJsZSBpbnN0YW5jZSwKCQkJCQkvL2J5 IGNsb25pbmcgdGhlIGxpc3QgZ3JvdXAgaXRlbSwgYXBwZW5kaW5nIGl0IHRvIHRo ZSBzb3J0YWJsZSBhbmQgdXNpbmcgaXQgYXMgaW5zdC5jdXJyZW50SXRlbQoJCQkJ CS8vV2UgY2FuIHRoZW4gZmlyZSB0aGUgc3RhcnQgZXZlbnQgb2YgdGhlIHNvcnRh YmxlIHdpdGggb3VyIHBhc3NlZCBicm93c2VyIGV2ZW50LCBhbmQgb3VyIG93biBo ZWxwZXIgKHNvIGl0IGRvZXNuJ3QgY3JlYXRlIGEgbmV3IG9uZSkKCQkJCQl0aGlz Lmluc3RhbmNlLmN1cnJlbnRJdGVtID0gJCh0aGF0KS5jbG9uZSgpLnJlbW92ZUF0 dHIoImlkIikuYXBwZW5kVG8odGhpcy5pbnN0YW5jZS5lbGVtZW50KS5kYXRhKCJ1 aS1zb3J0YWJsZS1pdGVtIiwgdHJ1ZSk7CgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRp b25zLl9oZWxwZXIgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyOyAvL1N0 b3JlIGhlbHBlciBvcHRpb24gdG8gbGF0ZXIgcmVzdG9yZSBpdAoJCQkJCXRoaXMu aW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHVp LmhlbHBlclswXTsgfTsKCgkJCQkJZXZlbnQudGFyZ2V0ID0gdGhpcy5pbnN0YW5j ZS5jdXJyZW50SXRlbVswXTsKCQkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZUNhcHR1 cmUoZXZlbnQsIHRydWUpOwoJCQkJCXRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQo ZXZlbnQsIHRydWUsIHRydWUpOwoKCQkJCQkvL0JlY2F1c2UgdGhlIGJyb3dzZXIg ZXZlbnQgaXMgd2F5IG9mZiB0aGUgbmV3IGFwcGVuZGVkIHBvcnRsZXQsIHdlIG1v ZGlmeSBhIGNvdXBsZSBvZiB2YXJpYWJsZXMgdG8gcmVmbGVjdCB0aGUgY2hhbmdl cwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLnRvcCA9IGluc3Qub2Zm c2V0LmNsaWNrLnRvcDsKCQkJCQl0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5s ZWZ0ID0gaW5zdC5vZmZzZXQuY2xpY2subGVmdDsKCQkJCQl0aGlzLmluc3RhbmNl Lm9mZnNldC5wYXJlbnQubGVmdCAtPSBpbnN0Lm9mZnNldC5wYXJlbnQubGVmdCAt IHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0OwoJCQkJCXRoaXMuaW5z dGFuY2Uub2Zmc2V0LnBhcmVudC50b3AgLT0gaW5zdC5vZmZzZXQucGFyZW50LnRv cCAtIHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3A7CgoJCQkJCWluc3Qu X3RyaWdnZXIoInRvU29ydGFibGUiLCBldmVudCk7CgkJCQkJaW5zdC5kcm9wcGVk ID0gdGhpcy5pbnN0YW5jZS5lbGVtZW50OyAvL2RyYWdnYWJsZSByZXZlcnQgbmVl ZHMgdGhhdAoJCQkJCS8vaGFjayBzbyByZWNlaXZlL3VwZGF0ZSBjYWxsYmFja3Mg d29yayAobW9zdGx5KQoJCQkJCWluc3QuY3VycmVudEl0ZW0gPSBpbnN0LmVsZW1l bnQ7CgkJCQkJdGhpcy5pbnN0YW5jZS5mcm9tT3V0c2lkZSA9IGluc3Q7CgoJCQkJ fQoKCQkJCS8vUHJvdmlkZWQgd2UgZGlkIGFsbCB0aGUgcHJldmlvdXMgc3RlcHMs IHdlIGNhbiBmaXJlIHRoZSBkcmFnIGV2ZW50IG9mIHRoZSBzb3J0YWJsZSBvbiBl dmVyeSBkcmFnZ2FibGUgZHJhZywgd2hlbiBpdCBpbnRlcnNlY3RzIHdpdGggdGhl IHNvcnRhYmxlCgkJCQlpZih0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtKSB7CgkJ CQkJdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGV2ZW50KTsKCQkJCX0KCgkJCX0g ZWxzZSB7CgoJCQkJLy9JZiBpdCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIHRoZSBz b3J0YWJsZSwgYW5kIGl0IGludGVyc2VjdGVkIGJlZm9yZSwKCQkJCS8vd2UgZmFr ZSB0aGUgZHJhZyBzdG9wIG9mIHRoZSBzb3J0YWJsZSwgYnV0IG1ha2Ugc3VyZSBp dCBkb2Vzbid0IHJlbW92ZSB0aGUgaGVscGVyIGJ5IHVzaW5nIGNhbmNlbEhlbHBl clJlbW92YWwKCQkJCWlmKHRoaXMuaW5zdGFuY2UuaXNPdmVyKSB7CgoJCQkJCXRo aXMuaW5zdGFuY2UuaXNPdmVyID0gMDsKCQkJCQl0aGlzLmluc3RhbmNlLmNhbmNl bEhlbHBlclJlbW92YWwgPSB0cnVlOwoKCQkJCQkvL1ByZXZlbnQgcmV2ZXJ0aW5n IG9uIHRoaXMgZm9yY2VkIHN0b3AKCQkJCQl0aGlzLmluc3RhbmNlLm9wdGlvbnMu cmV2ZXJ0ID0gZmFsc2U7CgoJCQkJCS8vIFRoZSBvdXQgZXZlbnQgbmVlZHMgdG8g YmUgdHJpZ2dlcmVkIGluZGVwZW5kZW50bHkKCQkJCQl0aGlzLmluc3RhbmNlLl90 cmlnZ2VyKCJvdXQiLCBldmVudCwgdGhpcy5pbnN0YW5jZS5fdWlIYXNoKHRoaXMu aW5zdGFuY2UpKTsKCgkJCQkJdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGV2ZW50 LCB0cnVlKTsKCQkJCQl0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyID0gdGhp cy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXI7CgoJCQkJCS8vTm93IHdlIHJlbW92 ZSBvdXIgY3VycmVudEl0ZW0sIHRoZSBsaXN0IGdyb3VwIGNsb25lIGFnYWluLCBh bmQgdGhlIHBsYWNlaG9sZGVyLCBhbmQgYW5pbWF0ZSB0aGUgaGVscGVyIGJhY2sg dG8gaXQncyBvcmlnaW5hbCBzaXplCgkJCQkJdGhpcy5pbnN0YW5jZS5jdXJyZW50 SXRlbS5yZW1vdmUoKTsKCQkJCQlpZih0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVy KSB7CgkJCQkJCXRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIucmVtb3ZlKCk7CgkJ CQkJfQoKCQkJCQlpbnN0Ll90cmlnZ2VyKCJmcm9tU29ydGFibGUiLCBldmVudCk7 CgkJCQkJaW5zdC5kcm9wcGVkID0gZmFsc2U7IC8vZHJhZ2dhYmxlIHJldmVydCBu ZWVkcyB0aGF0CgkJCQl9CgoJCQl9CgoJCX0pOwoKCX0KfSk7CgokLnVpLnBsdWdp bi5hZGQoImRyYWdnYWJsZSIsICJjdXJzb3IiLCB7CglzdGFydDogZnVuY3Rpb24o KSB7CgkJdmFyIHQgPSAkKCJib2R5IiksIG8gPSAkKHRoaXMpLmRhdGEoInVpLWRy YWdnYWJsZSIpLm9wdGlvbnM7CgkJaWYgKHQuY3NzKCJjdXJzb3IiKSkgewoJCQlv Ll9jdXJzb3IgPSB0LmNzcygiY3Vyc29yIik7CgkJfQoJCXQuY3NzKCJjdXJzb3Ii LCBvLmN1cnNvcik7Cgl9LAoJc3RvcDogZnVuY3Rpb24oKSB7CgkJdmFyIG8gPSAk KHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIpLm9wdGlvbnM7CgkJaWYgKG8uX2N1 cnNvcikgewoJCQkkKCJib2R5IikuY3NzKCJjdXJzb3IiLCBvLl9jdXJzb3IpOwoJ CX0KCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJvcGFjaXR5 IiwgewoJc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciB0ID0gJCh1 aS5oZWxwZXIpLCBvID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKS5vcHRp b25zOwoJCWlmKHQuY3NzKCJvcGFjaXR5IikpIHsKCQkJby5fb3BhY2l0eSA9IHQu Y3NzKCJvcGFjaXR5Iik7CgkJfQoJCXQuY3NzKCJvcGFjaXR5Iiwgby5vcGFjaXR5 KTsKCX0sCglzdG9wOiBmdW5jdGlvbihldmVudCwgdWkpIHsKCQl2YXIgbyA9ICQo dGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIikub3B0aW9uczsKCQlpZihvLl9vcGFj aXR5KSB7CgkJCSQodWkuaGVscGVyKS5jc3MoIm9wYWNpdHkiLCBvLl9vcGFjaXR5 KTsKCQl9Cgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCAic2Ny b2xsIiwgewoJc3RhcnQ6IGZ1bmN0aW9uKCkgewoJCXZhciBpID0gJCh0aGlzKS5k YXRhKCJ1aS1kcmFnZ2FibGUiKTsKCQlpZihpLnNjcm9sbFBhcmVudFswXSAhPT0g ZG9jdW1lbnQgJiYgaS5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSAhPT0gIkhUTUwi KSB7CgkJCWkub3ZlcmZsb3dPZmZzZXQgPSBpLnNjcm9sbFBhcmVudC5vZmZzZXQo KTsKCQl9Cgl9LAoJZHJhZzogZnVuY3Rpb24oIGV2ZW50ICkgewoKCQl2YXIgaSA9 ICQodGhpcykuZGF0YSgidWktZHJhZ2dhYmxlIiksIG8gPSBpLm9wdGlvbnMsIHNj cm9sbGVkID0gZmFsc2U7CgoJCWlmKGkuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1 bWVudCAmJiBpLnNjcm9sbFBhcmVudFswXS50YWdOYW1lICE9PSAiSFRNTCIpIHsK CgkJCWlmKCFvLmF4aXMgfHwgby5heGlzICE9PSAieCIpIHsKCQkJCWlmKChpLm92 ZXJmbG93T2Zmc2V0LnRvcCArIGkuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdo dCkgLSBldmVudC5wYWdlWSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlp LnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgPSBzY3JvbGxlZCA9IGkuc2Nyb2xs UGFyZW50WzBdLnNjcm9sbFRvcCArIG8uc2Nyb2xsU3BlZWQ7CgkJCQl9IGVsc2Ug aWYoZXZlbnQucGFnZVkgLSBpLm92ZXJmbG93T2Zmc2V0LnRvcCA8IG8uc2Nyb2xs U2Vuc2l0aXZpdHkpIHsKCQkJCQlpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3Ag PSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCAtIG8uc2Ny b2xsU3BlZWQ7CgkJCQl9CgkJCX0KCgkJCWlmKCFvLmF4aXMgfHwgby5heGlzICE9 PSAieSIpIHsKCQkJCWlmKChpLm92ZXJmbG93T2Zmc2V0LmxlZnQgKyBpLnNjcm9s bFBhcmVudFswXS5vZmZzZXRXaWR0aCkgLSBldmVudC5wYWdlWCA8IG8uc2Nyb2xs U2Vuc2l0aXZpdHkpIHsKCQkJCQlpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0 ID0gc2Nyb2xsZWQgPSBpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ICsgby5z Y3JvbGxTcGVlZDsKCQkJCX0gZWxzZSBpZihldmVudC5wYWdlWCAtIGkub3ZlcmZs b3dPZmZzZXQubGVmdCA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlpLnNj cm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ID0gc2Nyb2xsZWQgPSBpLnNjcm9sbFBh cmVudFswXS5zY3JvbGxMZWZ0IC0gby5zY3JvbGxTcGVlZDsKCQkJCX0KCQkJfQoK CQl9IGVsc2UgewoKCQkJaWYoIW8uYXhpcyB8fCBvLmF4aXMgIT09ICJ4IikgewoJ CQkJaWYoZXZlbnQucGFnZVkgLSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSA8IG8u c2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQp LnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSAtIG8uc2Nyb2xsU3Bl ZWQpOwoJCQkJfSBlbHNlIGlmKCQod2luZG93KS5oZWlnaHQoKSAtIChldmVudC5w YWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKSA8IG8uc2Nyb2xsU2Vuc2l0 aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgk KGRvY3VtZW50KS5zY3JvbGxUb3AoKSArIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfQoJ CQl9CgoJCQlpZighby5heGlzIHx8IG8uYXhpcyAhPT0gInkiKSB7CgkJCQlpZihl dmVudC5wYWdlWCAtICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSA8IG8uc2Nyb2xs U2Vuc2l0aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9s bExlZnQoJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIC0gby5zY3JvbGxTcGVlZCk7 CgkJCQl9IGVsc2UgaWYoJCh3aW5kb3cpLndpZHRoKCkgLSAoZXZlbnQucGFnZVgg LSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpIDwgby5zY3JvbGxTZW5zaXRpdml0 eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRv Y3VtZW50KS5zY3JvbGxMZWZ0KCkgKyBvLnNjcm9sbFNwZWVkKTsKCQkJCX0KCQkJ fQoKCQl9CgoJCWlmKHNjcm9sbGVkICE9PSBmYWxzZSAmJiAkLnVpLmRkbWFuYWdl ciAmJiAhby5kcm9wQmVoYXZpb3VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLnByZXBh cmVPZmZzZXRzKGksIGV2ZW50KTsKCQl9CgoJfQp9KTsKCiQudWkucGx1Z2luLmFk ZCgiZHJhZ2dhYmxlIiwgInNuYXAiLCB7CglzdGFydDogZnVuY3Rpb24oKSB7CgoJ CXZhciBpID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKSwKCQkJbyA9IGku b3B0aW9uczsKCgkJaS5zbmFwRWxlbWVudHMgPSBbXTsKCgkJJChvLnNuYXAuY29u c3RydWN0b3IgIT09IFN0cmluZyA/ICggby5zbmFwLml0ZW1zIHx8ICI6ZGF0YSh1 aS1kcmFnZ2FibGUpIiApIDogby5zbmFwKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2 YXIgJHQgPSAkKHRoaXMpLAoJCQkJJG8gPSAkdC5vZmZzZXQoKTsKCQkJaWYodGhp cyAhPT0gaS5lbGVtZW50WzBdKSB7CgkJCQlpLnNuYXBFbGVtZW50cy5wdXNoKHsK CQkJCQlpdGVtOiB0aGlzLAoJCQkJCXdpZHRoOiAkdC5vdXRlcldpZHRoKCksIGhl aWdodDogJHQub3V0ZXJIZWlnaHQoKSwKCQkJCQl0b3A6ICRvLnRvcCwgbGVmdDog JG8ubGVmdAoJCQkJfSk7CgkJCX0KCQl9KTsKCgl9LAoJZHJhZzogZnVuY3Rpb24o ZXZlbnQsIHVpKSB7CgoJCXZhciB0cywgYnMsIGxzLCBycywgbCwgciwgdCwgYiwg aSwgZmlyc3QsCgkJCWluc3QgPSAkKHRoaXMpLmRhdGEoInVpLWRyYWdnYWJsZSIp LAoJCQlvID0gaW5zdC5vcHRpb25zLAoJCQlkID0gby5zbmFwVG9sZXJhbmNlLAoJ CQl4MSA9IHVpLm9mZnNldC5sZWZ0LCB4MiA9IHgxICsgaW5zdC5oZWxwZXJQcm9w b3J0aW9ucy53aWR0aCwKCQkJeTEgPSB1aS5vZmZzZXQudG9wLCB5MiA9IHkxICsg aW5zdC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7CgoJCWZvciAoaSA9IGluc3Qu c25hcEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCgkJCWwgPSBp bnN0LnNuYXBFbGVtZW50c1tpXS5sZWZ0OwoJCQlyID0gbCArIGluc3Quc25hcEVs ZW1lbnRzW2ldLndpZHRoOwoJCQl0ID0gaW5zdC5zbmFwRWxlbWVudHNbaV0udG9w OwoJCQliID0gdCArIGluc3Quc25hcEVsZW1lbnRzW2ldLmhlaWdodDsKCgkJCS8v WWVzLCBJIGtub3csIHRoaXMgaXMgaW5zYW5lIDspCgkJCWlmKCEoKGwtZCA8IHgx ICYmIHgxIDwgcitkICYmIHQtZCA8IHkxICYmIHkxIDwgYitkKSB8fCAobC1kIDwg eDEgJiYgeDEgPCByK2QgJiYgdC1kIDwgeTIgJiYgeTIgPCBiK2QpIHx8IChsLWQg PCB4MiAmJiB4MiA8IHIrZCAmJiB0LWQgPCB5MSAmJiB5MSA8IGIrZCkgfHwgKGwt ZCA8IHgyICYmIHgyIDwgcitkICYmIHQtZCA8IHkyICYmIHkyIDwgYitkKSkpIHsK CQkJCWlmKGluc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5nKSB7CgkJCQkJKGlu c3Qub3B0aW9ucy5zbmFwLnJlbGVhc2UgJiYgaW5zdC5vcHRpb25zLnNuYXAucmVs ZWFzZS5jYWxsKGluc3QuZWxlbWVudCwgZXZlbnQsICQuZXh0ZW5kKGluc3QuX3Vp SGFzaCgpLCB7IHNuYXBJdGVtOiBpbnN0LnNuYXBFbGVtZW50c1tpXS5pdGVtIH0p KSk7CgkJCQl9CgkJCQlpbnN0LnNuYXBFbGVtZW50c1tpXS5zbmFwcGluZyA9IGZh bHNlOwoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmKG8uc25hcE1vZGUgIT09ICJp bm5lciIpIHsKCQkJCXRzID0gTWF0aC5hYnModCAtIHkyKSA8PSBkOwoJCQkJYnMg PSBNYXRoLmFicyhiIC0geTEpIDw9IGQ7CgkJCQlscyA9IE1hdGguYWJzKGwgLSB4 MikgPD0gZDsKCQkJCXJzID0gTWF0aC5hYnMociAtIHgxKSA8PSBkOwoJCQkJaWYo dHMpIHsKCQkJCQl1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRp b25UbygicmVsYXRpdmUiLCB7IHRvcDogdCAtIGluc3QuaGVscGVyUHJvcG9ydGlv bnMuaGVpZ2h0LCBsZWZ0OiAwIH0pLnRvcCAtIGluc3QubWFyZ2lucy50b3A7CgkJ CQl9CgkJCQlpZihicykgewoJCQkJCXVpLnBvc2l0aW9uLnRvcCA9IGluc3QuX2Nv bnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiBiLCBsZWZ0OiAwIH0p LnRvcCAtIGluc3QubWFyZ2lucy50b3A7CgkJCQl9CgkJCQlpZihscykgewoJCQkJ CXVpLnBvc2l0aW9uLmxlZnQgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVs YXRpdmUiLCB7IHRvcDogMCwgbGVmdDogbCAtIGluc3QuaGVscGVyUHJvcG9ydGlv bnMud2lkdGggfSkubGVmdCAtIGluc3QubWFyZ2lucy5sZWZ0OwoJCQkJfQoJCQkJ aWYocnMpIHsKCQkJCQl1aS5wb3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBv c2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6IHIgfSkubGVmdCAt IGluc3QubWFyZ2lucy5sZWZ0OwoJCQkJfQoJCQl9CgoJCQlmaXJzdCA9ICh0cyB8 fCBicyB8fCBscyB8fCBycyk7CgoJCQlpZihvLnNuYXBNb2RlICE9PSAib3V0ZXIi KSB7CgkJCQl0cyA9IE1hdGguYWJzKHQgLSB5MSkgPD0gZDsKCQkJCWJzID0gTWF0 aC5hYnMoYiAtIHkyKSA8PSBkOwoJCQkJbHMgPSBNYXRoLmFicyhsIC0geDEpIDw9 IGQ7CgkJCQlycyA9IE1hdGguYWJzKHIgLSB4MikgPD0gZDsKCQkJCWlmKHRzKSB7 CgkJCQkJdWkucG9zaXRpb24udG9wID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8o InJlbGF0aXZlIiwgeyB0b3A6IHQsIGxlZnQ6IDAgfSkudG9wIC0gaW5zdC5tYXJn aW5zLnRvcDsKCQkJCX0KCQkJCWlmKGJzKSB7CgkJCQkJdWkucG9zaXRpb24udG9w ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IGIg LSBpbnN0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodCwgbGVmdDogMCB9KS50b3Ag LSBpbnN0Lm1hcmdpbnMudG9wOwoJCQkJfQoJCQkJaWYobHMpIHsKCQkJCQl1aS5w b3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZl IiwgeyB0b3A6IDAsIGxlZnQ6IGwgfSkubGVmdCAtIGluc3QubWFyZ2lucy5sZWZ0 OwoJCQkJfQoJCQkJaWYocnMpIHsKCQkJCQl1aS5wb3NpdGlvbi5sZWZ0ID0gaW5z dC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6 IHIgLSBpbnN0LmhlbHBlclByb3BvcnRpb25zLndpZHRoIH0pLmxlZnQgLSBpbnN0 Lm1hcmdpbnMubGVmdDsKCQkJCX0KCQkJfQoKCQkJaWYoIWluc3Quc25hcEVsZW1l bnRzW2ldLnNuYXBwaW5nICYmICh0cyB8fCBicyB8fCBscyB8fCBycyB8fCBmaXJz dCkpIHsKCQkJCShpbnN0Lm9wdGlvbnMuc25hcC5zbmFwICYmIGluc3Qub3B0aW9u cy5zbmFwLnNuYXAuY2FsbChpbnN0LmVsZW1lbnQsIGV2ZW50LCAkLmV4dGVuZChp bnN0Ll91aUhhc2goKSwgeyBzbmFwSXRlbTogaW5zdC5zbmFwRWxlbWVudHNbaV0u aXRlbSB9KSkpOwoJCQl9CgkJCWluc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5n ID0gKHRzIHx8IGJzIHx8IGxzIHx8IHJzIHx8IGZpcnN0KTsKCgkJfQoKCX0KfSk7 CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJzdGFjayIsIHsKCXN0YXJ0 OiBmdW5jdGlvbigpIHsKCgkJdmFyIG1pbiwKCQkJbyA9ICQodGhpcykuZGF0YSgi dWktZHJhZ2dhYmxlIikub3B0aW9ucywKCQkJZ3JvdXAgPSAkLm1ha2VBcnJheSgk KG8uc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGEsYikgewoJCQkJcmV0dXJuIChwYXJz ZUludCgkKGEpLmNzcygiekluZGV4IiksMTApIHx8IDApIC0gKHBhcnNlSW50KCQo YikuY3NzKCJ6SW5kZXgiKSwxMCkgfHwgMCk7CgkJCX0pOwoKCQlpZiAoIWdyb3Vw Lmxlbmd0aCkgeyByZXR1cm47IH0KCgkJbWluID0gcGFyc2VJbnQoZ3JvdXBbMF0u c3R5bGUuekluZGV4LCAxMCkgfHwgMDsKCQkkKGdyb3VwKS5lYWNoKGZ1bmN0aW9u KGkpIHsKCQkJdGhpcy5zdHlsZS56SW5kZXggPSBtaW4gKyBpOwoJCX0pOwoKCQl0 aGlzWzBdLnN0eWxlLnpJbmRleCA9IG1pbiArIGdyb3VwLmxlbmd0aDsKCgl9Cn0p OwoKJC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCAiekluZGV4IiwgewoJc3Rh cnQ6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewoJCXZhciB0ID0gJCh1aS5oZWxwZXIp LCBvID0gJCh0aGlzKS5kYXRhKCJ1aS1kcmFnZ2FibGUiKS5vcHRpb25zOwoJCWlm KHQuY3NzKCJ6SW5kZXgiKSkgewoJCQlvLl96SW5kZXggPSB0LmNzcygiekluZGV4 Iik7CgkJfQoJCXQuY3NzKCJ6SW5kZXgiLCBvLnpJbmRleCk7Cgl9LAoJc3RvcDog ZnVuY3Rpb24oZXZlbnQsIHVpKSB7CgkJdmFyIG8gPSAkKHRoaXMpLmRhdGEoInVp LWRyYWdnYWJsZSIpLm9wdGlvbnM7CgkJaWYoby5fekluZGV4KSB7CgkJCSQodWku aGVscGVyKS5jc3MoInpJbmRleCIsIG8uX3pJbmRleCk7CgkJfQoJfQp9KTsKCn0p KGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCmZ1bmN0aW9u IGlzT3ZlckF4aXMoIHgsIHJlZmVyZW5jZSwgc2l6ZSApIHsKCXJldHVybiAoIHgg PiByZWZlcmVuY2UgKSAmJiAoIHggPCAoIHJlZmVyZW5jZSArIHNpemUgKSApOwp9 CgokLndpZGdldCgidWkuZHJvcHBhYmxlIiwgewoJdmVyc2lvbjogIjEuMTAuMCIs Cgl3aWRnZXRFdmVudFByZWZpeDogImRyb3AiLAoJb3B0aW9uczogewoJCWFjY2Vw dDogIioiLAoJCWFjdGl2ZUNsYXNzOiBmYWxzZSwKCQlhZGRDbGFzc2VzOiB0cnVl LAoJCWdyZWVkeTogZmFsc2UsCgkJaG92ZXJDbGFzczogZmFsc2UsCgkJc2NvcGU6 ICJkZWZhdWx0IiwKCQl0b2xlcmFuY2U6ICJpbnRlcnNlY3QiLAoKCQkvLyBjYWxs YmFja3MKCQlhY3RpdmF0ZTogbnVsbCwKCQlkZWFjdGl2YXRlOiBudWxsLAoJCWRy b3A6IG51bGwsCgkJb3V0OiBudWxsLAoJCW92ZXI6IG51bGwKCX0sCglfY3JlYXRl OiBmdW5jdGlvbigpIHsKCgkJdmFyIG8gPSB0aGlzLm9wdGlvbnMsCgkJCWFjY2Vw dCA9IG8uYWNjZXB0OwoKCQl0aGlzLmlzb3ZlciA9IGZhbHNlOwoJCXRoaXMuaXNv dXQgPSB0cnVlOwoKCQl0aGlzLmFjY2VwdCA9ICQuaXNGdW5jdGlvbihhY2NlcHQp ID8gYWNjZXB0IDogZnVuY3Rpb24oZCkgewoJCQlyZXR1cm4gZC5pcyhhY2NlcHQp OwoJCX07CgoJCS8vU3RvcmUgdGhlIGRyb3BwYWJsZSdzIHByb3BvcnRpb25zCgkJ dGhpcy5wcm9wb3J0aW9ucyA9IHsgd2lkdGg6IHRoaXMuZWxlbWVudFswXS5vZmZz ZXRXaWR0aCwgaGVpZ2h0OiB0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0IH07 CgoJCS8vIEFkZCB0aGUgcmVmZXJlbmNlIGFuZCBwb3NpdGlvbnMgdG8gdGhlIG1h bmFnZXIKCQkkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW28uc2NvcGVdID0gJC51 aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tvLnNjb3BlXSB8fCBbXTsKCQkkLnVpLmRk bWFuYWdlci5kcm9wcGFibGVzW28uc2NvcGVdLnB1c2godGhpcyk7CgoJCShvLmFk ZENsYXNzZXMgJiYgdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcm9wcGFibGUi KSk7CgoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIGkgPSAwLAoJ CQlkcm9wID0gJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMu c2NvcGVdOwoKCQlmb3IgKCA7IGkgPCBkcm9wLmxlbmd0aDsgaSsrICkgewoJCQlp ZiAoIGRyb3BbaV0gPT09IHRoaXMgKSB7CgkJCQlkcm9wLnNwbGljZShpLCAxKTsK CQkJfQoJCX0KCgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFi bGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIik7Cgl9LAoKCV9zZXRPcHRpb246IGZ1 bmN0aW9uKGtleSwgdmFsdWUpIHsKCgkJaWYoa2V5ID09PSAiYWNjZXB0IikgewoJ CQl0aGlzLmFjY2VwdCA9ICQuaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSA6IGZ1 bmN0aW9uKGQpIHsKCQkJCXJldHVybiBkLmlzKHZhbHVlKTsKCQkJfTsKCQl9CgkJ JC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcywgYXJndW1l bnRzKTsKCX0sCgoJX2FjdGl2YXRlOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBk cmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoJCWlmKHRoaXMub3B0 aW9ucy5hY3RpdmVDbGFzcykgewoJCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhp cy5vcHRpb25zLmFjdGl2ZUNsYXNzKTsKCQl9CgkJaWYoZHJhZ2dhYmxlKXsKCQkJ dGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLCBldmVudCwgdGhpcy51aShkcmFnZ2Fi bGUpKTsKCQl9Cgl9LAoKCV9kZWFjdGl2YXRlOiBmdW5jdGlvbihldmVudCkgewoJ CXZhciBkcmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoJCWlmKHRo aXMub3B0aW9ucy5hY3RpdmVDbGFzcykgewoJCQl0aGlzLmVsZW1lbnQucmVtb3Zl Q2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTsKCQl9CgkJaWYoZHJhZ2dh YmxlKXsKCQkJdGhpcy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIGV2ZW50LCB0aGlz LnVpKGRyYWdnYWJsZSkpOwoJCX0KCX0sCgoJX292ZXI6IGZ1bmN0aW9uKGV2ZW50 KSB7CgoJCXZhciBkcmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoK CQkvLyBCYWlsIGlmIGRyYWdnYWJsZSBhbmQgZHJvcHBhYmxlIGFyZSBzYW1lIGVs ZW1lbnQKCQlpZiAoIWRyYWdnYWJsZSB8fCAoZHJhZ2dhYmxlLmN1cnJlbnRJdGVt IHx8IGRyYWdnYWJsZS5lbGVtZW50KVswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7 CgkJCXJldHVybjsKCQl9CgoJCWlmICh0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxl bWVudFswXSwoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVt ZW50KSkpIHsKCQkJaWYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpIHsKCQkJCXRo aXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CgkJ CX0KCQkJdGhpcy5fdHJpZ2dlcigib3ZlciIsIGV2ZW50LCB0aGlzLnVpKGRyYWdn YWJsZSkpOwoJCX0KCgl9LAoKCV9vdXQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZh ciBkcmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoKCQkvLyBCYWls IGlmIGRyYWdnYWJsZSBhbmQgZHJvcHBhYmxlIGFyZSBzYW1lIGVsZW1lbnQKCQlp ZiAoIWRyYWdnYWJsZSB8fCAoZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdn YWJsZS5lbGVtZW50KVswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7CgkJCXJldHVy bjsKCQl9CgoJCWlmICh0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwo ZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50KSkpIHsK CQkJaWYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpIHsKCQkJCXRoaXMuZWxlbWVu dC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyk7CgkJCX0KCQkJ dGhpcy5fdHJpZ2dlcigib3V0IiwgZXZlbnQsIHRoaXMudWkoZHJhZ2dhYmxlKSk7 CgkJfQoKCX0sCgoJX2Ryb3A6IGZ1bmN0aW9uKGV2ZW50LGN1c3RvbSkgewoKCQl2 YXIgZHJhZ2dhYmxlID0gY3VzdG9tIHx8ICQudWkuZGRtYW5hZ2VyLmN1cnJlbnQs CgkJCWNoaWxkcmVuSW50ZXJzZWN0aW9uID0gZmFsc2U7CgoJCS8vIEJhaWwgaWYg ZHJhZ2dhYmxlIGFuZCBkcm9wcGFibGUgYXJlIHNhbWUgZWxlbWVudAoJCWlmICgh ZHJhZ2dhYmxlIHx8IChkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxl LmVsZW1lbnQpWzBdID09PSB0aGlzLmVsZW1lbnRbMF0pIHsKCQkJcmV0dXJuIGZh bHNlOwoJCX0KCgkJdGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJs ZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9u KCkgewoJCQl2YXIgaW5zdCA9ICQuZGF0YSh0aGlzLCAidWktZHJvcHBhYmxlIik7 CgkJCWlmKAoJCQkJaW5zdC5vcHRpb25zLmdyZWVkeSAmJgoJCQkJIWluc3Qub3B0 aW9ucy5kaXNhYmxlZCAmJgoJCQkJaW5zdC5vcHRpb25zLnNjb3BlID09PSBkcmFn Z2FibGUub3B0aW9ucy5zY29wZSAmJgoJCQkJaW5zdC5hY2NlcHQuY2FsbChpbnN0 LmVsZW1lbnRbMF0sIChkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxl LmVsZW1lbnQpKSAmJgoJCQkJJC51aS5pbnRlcnNlY3QoZHJhZ2dhYmxlLCAkLmV4 dGVuZChpbnN0LCB7IG9mZnNldDogaW5zdC5lbGVtZW50Lm9mZnNldCgpIH0pLCBp bnN0Lm9wdGlvbnMudG9sZXJhbmNlKQoJCQkpIHsgY2hpbGRyZW5JbnRlcnNlY3Rp b24gPSB0cnVlOyByZXR1cm4gZmFsc2U7IH0KCQl9KTsKCQlpZihjaGlsZHJlbklu dGVyc2VjdGlvbikgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZih0aGlzLmFj Y2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSwoZHJhZ2dhYmxlLmN1cnJlbnRJdGVt IHx8IGRyYWdnYWJsZS5lbGVtZW50KSkpIHsKCQkJaWYodGhpcy5vcHRpb25zLmFj dGl2ZUNsYXNzKSB7CgkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5v cHRpb25zLmFjdGl2ZUNsYXNzKTsKCQkJfQoJCQlpZih0aGlzLm9wdGlvbnMuaG92 ZXJDbGFzcykgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0 aW9ucy5ob3ZlckNsYXNzKTsKCQkJfQoJCQl0aGlzLl90cmlnZ2VyKCJkcm9wIiwg ZXZlbnQsIHRoaXMudWkoZHJhZ2dhYmxlKSk7CgkJCXJldHVybiB0aGlzLmVsZW1l bnQ7CgkJfQoKCQlyZXR1cm4gZmFsc2U7CgoJfSwKCgl1aTogZnVuY3Rpb24oYykg ewoJCXJldHVybiB7CgkJCWRyYWdnYWJsZTogKGMuY3VycmVudEl0ZW0gfHwgYy5l bGVtZW50KSwKCQkJaGVscGVyOiBjLmhlbHBlciwKCQkJcG9zaXRpb246IGMucG9z aXRpb24sCgkJCW9mZnNldDogYy5wb3NpdGlvbkFicwoJCX07Cgl9Cgp9KTsKCiQu dWkuaW50ZXJzZWN0ID0gZnVuY3Rpb24oZHJhZ2dhYmxlLCBkcm9wcGFibGUsIHRv bGVyYW5jZU1vZGUpIHsKCglpZiAoIWRyb3BwYWJsZS5vZmZzZXQpIHsKCQlyZXR1 cm4gZmFsc2U7Cgl9CgoJdmFyIGRyYWdnYWJsZUxlZnQsIGRyYWdnYWJsZVRvcCwK CQl4MSA9IChkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0 aW9uLmFic29sdXRlKS5sZWZ0LCB4MiA9IHgxICsgZHJhZ2dhYmxlLmhlbHBlclBy b3BvcnRpb25zLndpZHRoLAoJCXkxID0gKGRyYWdnYWJsZS5wb3NpdGlvbkFicyB8 fCBkcmFnZ2FibGUucG9zaXRpb24uYWJzb2x1dGUpLnRvcCwgeTIgPSB5MSArIGRy YWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsCgkJbCA9IGRyb3BwYWJs ZS5vZmZzZXQubGVmdCwgciA9IGwgKyBkcm9wcGFibGUucHJvcG9ydGlvbnMud2lk dGgsCgkJdCA9IGRyb3BwYWJsZS5vZmZzZXQudG9wLCBiID0gdCArIGRyb3BwYWJs ZS5wcm9wb3J0aW9ucy5oZWlnaHQ7CgoJc3dpdGNoICh0b2xlcmFuY2VNb2RlKSB7 CgkJY2FzZSAiZml0IjoKCQkJcmV0dXJuIChsIDw9IHgxICYmIHgyIDw9IHIgJiYg dCA8PSB5MSAmJiB5MiA8PSBiKTsKCQljYXNlICJpbnRlcnNlY3QiOgoJCQlyZXR1 cm4gKGwgPCB4MSArIChkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgg LyAyKSAmJiAvLyBSaWdodCBIYWxmCgkJCQl4MiAtIChkcmFnZ2FibGUuaGVscGVy UHJvcG9ydGlvbnMud2lkdGggLyAyKSA8IHIgJiYgLy8gTGVmdCBIYWxmCgkJCQl0 IDwgeTEgKyAoZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIp ICYmIC8vIEJvdHRvbSBIYWxmCgkJCQl5MiAtIChkcmFnZ2FibGUuaGVscGVyUHJv cG9ydGlvbnMuaGVpZ2h0IC8gMikgPCBiICk7IC8vIFRvcCBIYWxmCgkJY2FzZSAi cG9pbnRlciI6CgkJCWRyYWdnYWJsZUxlZnQgPSAoKGRyYWdnYWJsZS5wb3NpdGlv bkFicyB8fCBkcmFnZ2FibGUucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQgKyAoZHJh Z2dhYmxlLmNsaWNrT2Zmc2V0IHx8IGRyYWdnYWJsZS5vZmZzZXQuY2xpY2spLmxl ZnQpOwoJCQlkcmFnZ2FibGVUb3AgPSAoKGRyYWdnYWJsZS5wb3NpdGlvbkFicyB8 fCBkcmFnZ2FibGUucG9zaXRpb24uYWJzb2x1dGUpLnRvcCArIChkcmFnZ2FibGUu Y2xpY2tPZmZzZXQgfHwgZHJhZ2dhYmxlLm9mZnNldC5jbGljaykudG9wKTsKCQkJ cmV0dXJuIGlzT3ZlckF4aXMoIGRyYWdnYWJsZVRvcCwgdCwgZHJvcHBhYmxlLnBy b3BvcnRpb25zLmhlaWdodCApICYmIGlzT3ZlckF4aXMoIGRyYWdnYWJsZUxlZnQs IGwsIGRyb3BwYWJsZS5wcm9wb3J0aW9ucy53aWR0aCApOwoJCWNhc2UgInRvdWNo IjoKCQkJcmV0dXJuICgKCQkJCSh5MSA+PSB0ICYmIHkxIDw9IGIpIHx8CS8vIFRv cCBlZGdlIHRvdWNoaW5nCgkJCQkoeTIgPj0gdCAmJiB5MiA8PSBiKSB8fAkvLyBC b3R0b20gZWRnZSB0b3VjaGluZwoJCQkJKHkxIDwgdCAmJiB5MiA+IGIpCQkvLyBT dXJyb3VuZGVkIHZlcnRpY2FsbHkKCQkJKSAmJiAoCgkJCQkoeDEgPj0gbCAmJiB4 MSA8PSByKSB8fAkvLyBMZWZ0IGVkZ2UgdG91Y2hpbmcKCQkJCSh4MiA+PSBsICYm IHgyIDw9IHIpIHx8CS8vIFJpZ2h0IGVkZ2UgdG91Y2hpbmcKCQkJCSh4MSA8IGwg JiYgeDIgPiByKQkJLy8gU3Vycm91bmRlZCBob3Jpem9udGFsbHkKCQkJKTsKCQlk ZWZhdWx0OgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKfTsKCi8qCglUaGlzIG1hbmFn ZXIgdHJhY2tzIG9mZnNldHMgb2YgZHJhZ2dhYmxlcyBhbmQgZHJvcHBhYmxlcwoq LwokLnVpLmRkbWFuYWdlciA9IHsKCWN1cnJlbnQ6IG51bGwsCglkcm9wcGFibGVz OiB7ICJkZWZhdWx0IjogW10gfSwKCXByZXBhcmVPZmZzZXRzOiBmdW5jdGlvbih0 LCBldmVudCkgewoKCQl2YXIgaSwgaiwKCQkJbSA9ICQudWkuZGRtYW5hZ2VyLmRy b3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXSB8fCBbXSwKCQkJdHlwZSA9IGV2ZW50 ID8gZXZlbnQudHlwZSA6IG51bGwsIC8vIHdvcmthcm91bmQgZm9yICMyMzE3CgkJ CWxpc3QgPSAodC5jdXJyZW50SXRlbSB8fCB0LmVsZW1lbnQpLmZpbmQoIjpkYXRh KHVpLWRyb3BwYWJsZSkiKS5hZGRCYWNrKCk7CgoJCWRyb3BwYWJsZXNMb29wOiBm b3IgKGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgewoKCQkJLy9ObyBkaXNhYmxl ZCBhbmQgbm9uLWFjY2VwdGVkCgkJCWlmKG1baV0ub3B0aW9ucy5kaXNhYmxlZCB8 fCAodCAmJiAhbVtpXS5hY2NlcHQuY2FsbChtW2ldLmVsZW1lbnRbMF0sKHQuY3Vy cmVudEl0ZW0gfHwgdC5lbGVtZW50KSkpKSB7CgkJCQljb250aW51ZTsKCQkJfQoK CQkJLy8gRmlsdGVyIG91dCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBkcmFnZ2Vk IGl0ZW0KCQkJZm9yIChqPTA7IGogPCBsaXN0Lmxlbmd0aDsgaisrKSB7CgkJCQlp ZihsaXN0W2pdID09PSBtW2ldLmVsZW1lbnRbMF0pIHsKCQkJCQltW2ldLnByb3Bv cnRpb25zLmhlaWdodCA9IDA7CgkJCQkJY29udGludWUgZHJvcHBhYmxlc0xvb3A7 CgkJCQl9CgkJCX0KCgkJCW1baV0udmlzaWJsZSA9IG1baV0uZWxlbWVudC5jc3Mo ImRpc3BsYXkiKSAhPT0gIm5vbmUiOwoJCQlpZighbVtpXS52aXNpYmxlKSB7CgkJ CQljb250aW51ZTsKCQkJfQoKCQkJLy9BY3RpdmF0ZSB0aGUgZHJvcHBhYmxlIGlm IHVzZWQgZGlyZWN0bHkgZnJvbSBkcmFnZ2FibGVzCgkJCWlmKHR5cGUgPT09ICJt b3VzZWRvd24iKSB7CgkJCQltW2ldLl9hY3RpdmF0ZS5jYWxsKG1baV0sIGV2ZW50 KTsKCQkJfQoKCQkJbVtpXS5vZmZzZXQgPSBtW2ldLmVsZW1lbnQub2Zmc2V0KCk7 CgkJCW1baV0ucHJvcG9ydGlvbnMgPSB7IHdpZHRoOiBtW2ldLmVsZW1lbnRbMF0u b2Zmc2V0V2lkdGgsIGhlaWdodDogbVtpXS5lbGVtZW50WzBdLm9mZnNldEhlaWdo dCB9OwoKCQl9CgoJfSwKCWRyb3A6IGZ1bmN0aW9uKGRyYWdnYWJsZSwgZXZlbnQp IHsKCgkJdmFyIGRyb3BwZWQgPSBmYWxzZTsKCQkkLmVhY2goJC51aS5kZG1hbmFn ZXIuZHJvcHBhYmxlc1tkcmFnZ2FibGUub3B0aW9ucy5zY29wZV0gfHwgW10sIGZ1 bmN0aW9uKCkgewoKCQkJaWYoIXRoaXMub3B0aW9ucykgewoJCQkJcmV0dXJuOwoJ CQl9CgkJCWlmICghdGhpcy5vcHRpb25zLmRpc2FibGVkICYmIHRoaXMudmlzaWJs ZSAmJiAkLnVpLmludGVyc2VjdChkcmFnZ2FibGUsIHRoaXMsIHRoaXMub3B0aW9u cy50b2xlcmFuY2UpKSB7CgkJCQlkcm9wcGVkID0gdGhpcy5fZHJvcC5jYWxsKHRo aXMsIGV2ZW50KSB8fCBkcm9wcGVkOwoJCQl9CgoJCQlpZiAoIXRoaXMub3B0aW9u cy5kaXNhYmxlZCAmJiB0aGlzLnZpc2libGUgJiYgdGhpcy5hY2NlcHQuY2FsbCh0 aGlzLmVsZW1lbnRbMF0sKGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2Fi bGUuZWxlbWVudCkpKSB7CgkJCQl0aGlzLmlzb3V0ID0gdHJ1ZTsKCQkJCXRoaXMu aXNvdmVyID0gZmFsc2U7CgkJCQl0aGlzLl9kZWFjdGl2YXRlLmNhbGwodGhpcywg ZXZlbnQpOwoJCQl9CgoJCX0pOwoJCXJldHVybiBkcm9wcGVkOwoKCX0sCglkcmFn U3RhcnQ6IGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGV2ZW50ICkgewoJCS8vTGlzdGVu IGZvciBzY3JvbGxpbmcgc28gdGhhdCBpZiB0aGUgZHJhZ2dpbmcgY2F1c2VzIHNj cm9sbGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIGRyb3BwYWJsZXMgY2FuIGJlIHJl Y2FsY3VsYXRlZCAoc2VlICM1MDAzKQoJCWRyYWdnYWJsZS5lbGVtZW50LnBhcmVu dHNVbnRpbCggImJvZHkiICkuYmluZCggInNjcm9sbC5kcm9wcGFibGUiLCBmdW5j dGlvbigpIHsKCQkJaWYoICFkcmFnZ2FibGUub3B0aW9ucy5yZWZyZXNoUG9zaXRp b25zICkgewoJCQkJJC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoIGRyYWdn YWJsZSwgZXZlbnQgKTsKCQkJfQoJCX0pOwoJfSwKCWRyYWc6IGZ1bmN0aW9uKGRy YWdnYWJsZSwgZXZlbnQpIHsKCgkJLy9JZiB5b3UgaGF2ZSBhIGhpZ2hseSBkeW5h bWljIHBhZ2UsIHlvdSBtaWdodCB0cnkgdGhpcyBvcHRpb24uIEl0IHJlbmRlcnMg cG9zaXRpb25zIGV2ZXJ5IHRpbWUgeW91IG1vdmUgdGhlIG1vdXNlLgoJCWlmKGRy YWdnYWJsZS5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMpIHsKCQkJJC51aS5kZG1h bmFnZXIucHJlcGFyZU9mZnNldHMoZHJhZ2dhYmxlLCBldmVudCk7CgkJfQoKCQkv L1J1biB0aHJvdWdoIGFsbCBkcm9wcGFibGVzIGFuZCBjaGVjayB0aGVpciBwb3Np dGlvbnMgYmFzZWQgb24gc3BlY2lmaWMgdG9sZXJhbmNlIG9wdGlvbnMKCQkkLmVh Y2goJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tkcmFnZ2FibGUub3B0aW9ucy5z Y29wZV0gfHwgW10sIGZ1bmN0aW9uKCkgewoKCQkJaWYodGhpcy5vcHRpb25zLmRp c2FibGVkIHx8IHRoaXMuZ3JlZWR5Q2hpbGQgfHwgIXRoaXMudmlzaWJsZSkgewoJ CQkJcmV0dXJuOwoJCQl9CgoJCQl2YXIgcGFyZW50SW5zdGFuY2UsIHNjb3BlLCBw YXJlbnQsCgkJCQlpbnRlcnNlY3RzID0gJC51aS5pbnRlcnNlY3QoZHJhZ2dhYmxl LCB0aGlzLCB0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSwKCQkJCWMgPSAhaW50ZXJz ZWN0cyAmJiB0aGlzLmlzb3ZlciA/ICJpc291dCIgOiAoaW50ZXJzZWN0cyAmJiAh dGhpcy5pc292ZXIgPyAiaXNvdmVyIiA6IG51bGwpOwoJCQlpZighYykgewoJCQkJ cmV0dXJuOwoJCQl9CgoJCQlpZiAodGhpcy5vcHRpb25zLmdyZWVkeSkgewoJCQkJ Ly8gZmluZCBkcm9wcGFibGUgcGFyZW50cyB3aXRoIHNhbWUgc2NvcGUKCQkJCXNj b3BlID0gdGhpcy5vcHRpb25zLnNjb3BlOwoJCQkJcGFyZW50ID0gdGhpcy5lbGVt ZW50LnBhcmVudHMoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5maWx0ZXIoZnVuY3Rp b24gKCkgewoJCQkJCXJldHVybiAkLmRhdGEodGhpcywgInVpLWRyb3BwYWJsZSIp Lm9wdGlvbnMuc2NvcGUgPT09IHNjb3BlOwoJCQkJfSk7CgoJCQkJaWYgKHBhcmVu dC5sZW5ndGgpIHsKCQkJCQlwYXJlbnRJbnN0YW5jZSA9ICQuZGF0YShwYXJlbnRb MF0sICJ1aS1kcm9wcGFibGUiKTsKCQkJCQlwYXJlbnRJbnN0YW5jZS5ncmVlZHlD aGlsZCA9IChjID09PSAiaXNvdmVyIik7CgkJCQl9CgkJCX0KCgkJCS8vIHdlIGp1 c3QgbW92ZWQgaW50byBhIGdyZWVkeSBjaGlsZAoJCQlpZiAocGFyZW50SW5zdGFu Y2UgJiYgYyA9PT0gImlzb3ZlciIpIHsKCQkJCXBhcmVudEluc3RhbmNlLmlzb3Zl ciA9IGZhbHNlOwoJCQkJcGFyZW50SW5zdGFuY2UuaXNvdXQgPSB0cnVlOwoJCQkJ cGFyZW50SW5zdGFuY2UuX291dC5jYWxsKHBhcmVudEluc3RhbmNlLCBldmVudCk7 CgkJCX0KCgkJCXRoaXNbY10gPSB0cnVlOwoJCQl0aGlzW2MgPT09ICJpc291dCIg PyAiaXNvdmVyIiA6ICJpc291dCJdID0gZmFsc2U7CgkJCXRoaXNbYyA9PT0gImlz b3ZlciIgPyAiX292ZXIiIDogIl9vdXQiXS5jYWxsKHRoaXMsIGV2ZW50KTsKCgkJ CS8vIHdlIGp1c3QgbW92ZWQgb3V0IG9mIGEgZ3JlZWR5IGNoaWxkCgkJCWlmIChw YXJlbnRJbnN0YW5jZSAmJiBjID09PSAiaXNvdXQiKSB7CgkJCQlwYXJlbnRJbnN0 YW5jZS5pc291dCA9IGZhbHNlOwoJCQkJcGFyZW50SW5zdGFuY2UuaXNvdmVyID0g dHJ1ZTsKCQkJCXBhcmVudEluc3RhbmNlLl9vdmVyLmNhbGwocGFyZW50SW5zdGFu Y2UsIGV2ZW50KTsKCQkJfQoJCX0pOwoKCX0sCglkcmFnU3RvcDogZnVuY3Rpb24o IGRyYWdnYWJsZSwgZXZlbnQgKSB7CgkJZHJhZ2dhYmxlLmVsZW1lbnQucGFyZW50 c1VudGlsKCAiYm9keSIgKS51bmJpbmQoICJzY3JvbGwuZHJvcHBhYmxlIiApOwoJ CS8vQ2FsbCBwcmVwYXJlT2Zmc2V0cyBvbmUgZmluYWwgdGltZSBzaW5jZSBJRSBk b2VzIG5vdCBmaXJlIHJldHVybiBzY3JvbGwgZXZlbnRzIHdoZW4gb3ZlcmZsb3cg d2FzIGNhdXNlZCBieSBkcmFnIChzZWUgIzUwMDMpCgkJaWYoICFkcmFnZ2FibGUu b3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zICkgewoJCQkkLnVpLmRkbWFuYWdlci5w cmVwYXJlT2Zmc2V0cyggZHJhZ2dhYmxlLCBldmVudCApOwoJCX0KCX0KfTsKCn0p KGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCmZ1bmN0aW9u IG51bSh2KSB7CglyZXR1cm4gcGFyc2VJbnQodiwgMTApIHx8IDA7Cn0KCmZ1bmN0 aW9uIGlzTnVtYmVyKHZhbHVlKSB7CglyZXR1cm4gIWlzTmFOKHBhcnNlSW50KHZh bHVlLCAxMCkpOwp9CgokLndpZGdldCgidWkucmVzaXphYmxlIiwgJC51aS5tb3Vz ZSwgewoJdmVyc2lvbjogIjEuMTAuMCIsCgl3aWRnZXRFdmVudFByZWZpeDogInJl c2l6ZSIsCglvcHRpb25zOiB7CgkJYWxzb1Jlc2l6ZTogZmFsc2UsCgkJYW5pbWF0 ZTogZmFsc2UsCgkJYW5pbWF0ZUR1cmF0aW9uOiAic2xvdyIsCgkJYW5pbWF0ZUVh c2luZzogInN3aW5nIiwKCQlhc3BlY3RSYXRpbzogZmFsc2UsCgkJYXV0b0hpZGU6 IGZhbHNlLAoJCWNvbnRhaW5tZW50OiBmYWxzZSwKCQlnaG9zdDogZmFsc2UsCgkJ Z3JpZDogZmFsc2UsCgkJaGFuZGxlczogImUscyxzZSIsCgkJaGVscGVyOiBmYWxz ZSwKCQltYXhIZWlnaHQ6IG51bGwsCgkJbWF4V2lkdGg6IG51bGwsCgkJbWluSGVp Z2h0OiAxMCwKCQltaW5XaWR0aDogMTAsCgkJLy8gU2VlICM3OTYwCgkJekluZGV4 OiA5MCwKCgkJLy8gY2FsbGJhY2tzCgkJcmVzaXplOiBudWxsLAoJCXN0YXJ0OiBu dWxsLAoJCXN0b3A6IG51bGwKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCgkJ dmFyIG4sIGksIGhhbmRsZSwgYXhpcywgaG5hbWUsCgkJCXRoYXQgPSB0aGlzLAoJ CQlvID0gdGhpcy5vcHRpb25zOwoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWkt cmVzaXphYmxlIik7CgoJCSQuZXh0ZW5kKHRoaXMsIHsKCQkJX2FzcGVjdFJhdGlv OiAhIShvLmFzcGVjdFJhdGlvKSwKCQkJYXNwZWN0UmF0aW86IG8uYXNwZWN0UmF0 aW8sCgkJCW9yaWdpbmFsRWxlbWVudDogdGhpcy5lbGVtZW50LAoJCQlfcHJvcG9y dGlvbmFsbHlSZXNpemVFbGVtZW50czogW10sCgkJCV9oZWxwZXI6IG8uaGVscGVy IHx8IG8uZ2hvc3QgfHwgby5hbmltYXRlID8gby5oZWxwZXIgfHwgInVpLXJlc2l6 YWJsZS1oZWxwZXIiIDogbnVsbAoJCX0pOwoKCQkvL1dyYXAgdGhlIGVsZW1lbnQg aWYgaXQgY2Fubm90IGhvbGQgY2hpbGQgbm9kZXMKCQlpZih0aGlzLmVsZW1lbnRb MF0ubm9kZU5hbWUubWF0Y2goL2NhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8 YnV0dG9ufGltZy9pKSkgewoKCQkJLy9DcmVhdGUgYSB3cmFwcGVyIGVsZW1lbnQg YW5kIHNldCB0aGUgd3JhcHBlciB0byB0aGUgbmV3IGN1cnJlbnQgaW50ZXJuYWwg ZWxlbWVudAoJCQl0aGlzLmVsZW1lbnQud3JhcCgKCQkJCSQoIjxkaXYgY2xhc3M9 J3VpLXdyYXBwZXInIHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyc+PC9kaXY+Iiku Y3NzKHsKCQkJCQlwb3NpdGlvbjogdGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24i KSwKCQkJCQl3aWR0aDogdGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSwKCQkJCQlo ZWlnaHQ6IHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLAoJCQkJCXRvcDogdGhp cy5lbGVtZW50LmNzcygidG9wIiksCgkJCQkJbGVmdDogdGhpcy5lbGVtZW50LmNz cygibGVmdCIpCgkJCQl9KQoJCQkpOwoKCQkJLy9PdmVyd3JpdGUgdGhlIG9yaWdp bmFsIHRoaXMuZWxlbWVudAoJCQl0aGlzLmVsZW1lbnQgPSB0aGlzLmVsZW1lbnQu cGFyZW50KCkuZGF0YSgKCQkJCSJ1aS1yZXNpemFibGUiLCB0aGlzLmVsZW1lbnQu ZGF0YSgidWktcmVzaXphYmxlIikKCQkJKTsKCgkJCXRoaXMuZWxlbWVudElzV3Jh cHBlciA9IHRydWU7CgoJCQkvL01vdmUgbWFyZ2lucyB0byB0aGUgd3JhcHBlcgoJ CQl0aGlzLmVsZW1lbnQuY3NzKHsgbWFyZ2luTGVmdDogdGhpcy5vcmlnaW5hbEVs ZW1lbnQuY3NzKCJtYXJnaW5MZWZ0IiksIG1hcmdpblRvcDogdGhpcy5vcmlnaW5h bEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSwgbWFyZ2luUmlnaHQ6IHRoaXMub3Jp Z2luYWxFbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSwgbWFyZ2luQm90dG9tOiB0 aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkJvdHRvbSIpIH0pOwoJCQl0 aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoeyBtYXJnaW5MZWZ0OiAwLCBtYXJnaW5U b3A6IDAsIG1hcmdpblJpZ2h0OiAwLCBtYXJnaW5Cb3R0b206IDB9KTsKCgkJCS8v UHJldmVudCBTYWZhcmkgdGV4dGFyZWEgcmVzaXplCgkJCXRoaXMub3JpZ2luYWxS ZXNpemVTdHlsZSA9IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIik7 CgkJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwgIm5vbmUiKTsK CgkJCS8vUHVzaCB0aGUgYWN0dWFsIGVsZW1lbnQgdG8gb3VyIHByb3BvcnRpb25h bGx5UmVzaXplIGludGVybmFsIGFycmF5CgkJCXRoaXMuX3Byb3BvcnRpb25hbGx5 UmVzaXplRWxlbWVudHMucHVzaCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoeyBw b3NpdGlvbjogInN0YXRpYyIsIHpvb206IDEsIGRpc3BsYXk6ICJibG9jayIgfSkp OwoKCQkJLy8gYXZvaWQgSUUganVtcCAoaGFyZCBzZXQgdGhlIG1hcmdpbikKCQkJ dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHsgbWFyZ2luOiB0aGlzLm9yaWdpbmFs RWxlbWVudC5jc3MoIm1hcmdpbiIpIH0pOwoKCQkJLy8gZml4IGhhbmRsZXJzIG9m ZnNldAoJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoKCQl9CgoJCXRo aXMuaGFuZGxlcyA9IG8uaGFuZGxlcyB8fCAoISQoIi51aS1yZXNpemFibGUtaGFu ZGxlIiwgdGhpcy5lbGVtZW50KS5sZW5ndGggPyAiZSxzLHNlIiA6IHsgbjogIi51 aS1yZXNpemFibGUtbiIsIGU6ICIudWktcmVzaXphYmxlLWUiLCBzOiAiLnVpLXJl c2l6YWJsZS1zIiwgdzogIi51aS1yZXNpemFibGUtdyIsIHNlOiAiLnVpLXJlc2l6 YWJsZS1zZSIsIHN3OiAiLnVpLXJlc2l6YWJsZS1zdyIsIG5lOiAiLnVpLXJlc2l6 YWJsZS1uZSIsIG53OiAiLnVpLXJlc2l6YWJsZS1udyIgfSk7CgkJaWYodGhpcy5o YW5kbGVzLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKCgkJCWlmICggdGhpcy5o YW5kbGVzID09PSAiYWxsIikgewoJCQkJdGhpcy5oYW5kbGVzID0gIm4sZSxzLHcs c2Usc3csbmUsbnciOwoJCQl9CgoJCQluID0gdGhpcy5oYW5kbGVzLnNwbGl0KCIs Iik7CgkJCXRoaXMuaGFuZGxlcyA9IHt9OwoKCQkJZm9yKGkgPSAwOyBpIDwgbi5s ZW5ndGg7IGkrKykgewoKCQkJCWhhbmRsZSA9ICQudHJpbShuW2ldKTsKCQkJCWhu YW1lID0gInVpLXJlc2l6YWJsZS0iK2hhbmRsZTsKCQkJCWF4aXMgPSAkKCI8ZGl2 IGNsYXNzPSd1aS1yZXNpemFibGUtaGFuZGxlICIgKyBobmFtZSArICInPjwvZGl2 PiIpOwoKCQkJCS8vIEFwcGx5IHpJbmRleCB0byBhbGwgaGFuZGxlcyAtIHNlZSAj Nzk2MAoJCQkJYXhpcy5jc3MoeyB6SW5kZXg6IG8uekluZGV4IH0pOwoKCQkJCS8v VE9ETyA6IFdoYXQncyBnb2luZyBvbiBoZXJlPwoJCQkJaWYgKCJzZSIgPT09IGhh bmRsZSkgewoJCQkJCWF4aXMuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlw c21hbGwtZGlhZ29uYWwtc2UiKTsKCQkJCX0KCgkJCQkvL0luc2VydCBpbnRvIGlu dGVybmFsIGhhbmRsZXMgb2JqZWN0IGFuZCBhcHBlbmQgdG8gZWxlbWVudAoJCQkJ dGhpcy5oYW5kbGVzW2hhbmRsZV0gPSAiLnVpLXJlc2l6YWJsZS0iK2hhbmRsZTsK CQkJCXRoaXMuZWxlbWVudC5hcHBlbmQoYXhpcyk7CgkJCX0KCgkJfQoKCQl0aGlz Ll9yZW5kZXJBeGlzID0gZnVuY3Rpb24odGFyZ2V0KSB7CgoJCQl2YXIgaSwgYXhp cywgcGFkUG9zLCBwYWRXcmFwcGVyOwoKCQkJdGFyZ2V0ID0gdGFyZ2V0IHx8IHRo aXMuZWxlbWVudDsKCgkJCWZvcihpIGluIHRoaXMuaGFuZGxlcykgewoKCQkJCWlm KHRoaXMuaGFuZGxlc1tpXS5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7CgkJCQkJ dGhpcy5oYW5kbGVzW2ldID0gJCh0aGlzLmhhbmRsZXNbaV0sIHRoaXMuZWxlbWVu dCkuc2hvdygpOwoJCQkJfQoKCQkJCS8vQXBwbHkgcGFkIHRvIHdyYXBwZXIgZWxl bWVudCwgbmVlZGVkIHRvIGZpeCBheGlzIHBvc2l0aW9uICh0ZXh0YXJlYSwgaW5w dXRzLCBzY3JvbGxzKQoJCQkJaWYgKHRoaXMuZWxlbWVudElzV3JhcHBlciAmJiB0 aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8 aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSkgewoKCQkJCQlheGlzID0gJCh0aGlzLmhh bmRsZXNbaV0sIHRoaXMuZWxlbWVudCk7CgoJCQkJCS8vQ2hlY2tpbmcgdGhlIGNv cnJlY3QgcGFkIGFuZCBib3JkZXIKCQkJCQlwYWRXcmFwcGVyID0gL3N3fG5lfG53 fHNlfG58cy8udGVzdChpKSA/IGF4aXMub3V0ZXJIZWlnaHQoKSA6IGF4aXMub3V0 ZXJXaWR0aCgpOwoKCQkJCQkvL1RoZSBwYWRkaW5nIHR5cGUgaSBoYXZlIHRvIGFw cGx5Li4uCgkJCQkJcGFkUG9zID0gWyAicGFkZGluZyIsCgkJCQkJCS9uZXxud3xu Ly50ZXN0KGkpID8gIlRvcCIgOgoJCQkJCQkvc2V8c3d8cy8udGVzdChpKSA/ICJC b3R0b20iIDoKCQkJCQkJL15lJC8udGVzdChpKSA/ICJSaWdodCIgOiAiTGVmdCIg XS5qb2luKCIiKTsKCgkJCQkJdGFyZ2V0LmNzcyhwYWRQb3MsIHBhZFdyYXBwZXIp OwoKCQkJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoKCQkJCX0KCgkJ CQkvL1RPRE86IFdoYXQncyB0aGF0IGdvb2QgZm9yPyBUaGVyZSdzIG5vdCBhbnl0 aGluZyB0byBiZSBleGVjdXRlZCBsZWZ0CgkJCQlpZighJCh0aGlzLmhhbmRsZXNb aV0pLmxlbmd0aCkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJfTsKCgkJ Ly9UT0RPOiBtYWtlIHJlbmRlckF4aXMgYSBwcm90b3R5cGUgZnVuY3Rpb24KCQl0 aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCk7CgoJCXRoaXMuX2hhbmRsZXMg PSAkKCIudWktcmVzaXphYmxlLWhhbmRsZSIsIHRoaXMuZWxlbWVudCkKCQkJLmRp c2FibGVTZWxlY3Rpb24oKTsKCgkJLy9NYXRjaGluZyBheGlzIG5hbWUKCQl0aGlz Ll9oYW5kbGVzLm1vdXNlb3ZlcihmdW5jdGlvbigpIHsKCQkJaWYgKCF0aGF0LnJl c2l6aW5nKSB7CgkJCQlpZiAodGhpcy5jbGFzc05hbWUpIHsKCQkJCQlheGlzID0g dGhpcy5jbGFzc05hbWUubWF0Y2goL3VpLXJlc2l6YWJsZS0oc2V8c3d8bmV8bnd8 bnxlfHN8dykvaSk7CgkJCQl9CgkJCQkvL0F4aXMsIGRlZmF1bHQgPSBzZQoJCQkJ dGhhdC5heGlzID0gYXhpcyAmJiBheGlzWzFdID8gYXhpc1sxXSA6ICJzZSI7CgkJ CX0KCQl9KTsKCgkJLy9JZiB3ZSB3YW50IHRvIGF1dG8gaGlkZSB0aGUgZWxlbWVu dHMKCQlpZiAoby5hdXRvSGlkZSkgewoJCQl0aGlzLl9oYW5kbGVzLmhpZGUoKTsK CQkJJCh0aGlzLmVsZW1lbnQpCgkJCQkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1h dXRvaGlkZSIpCgkJCQkubW91c2VlbnRlcihmdW5jdGlvbigpIHsKCQkJCQlpZiAo by5kaXNhYmxlZCkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJCSQodGhpcyku cmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpOwoJCQkJCXRoYXQu X2hhbmRsZXMuc2hvdygpOwoJCQkJfSkKCQkJCS5tb3VzZWxlYXZlKGZ1bmN0aW9u KCl7CgkJCQkJaWYgKG8uZGlzYWJsZWQpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0K CQkJCQlpZiAoIXRoYXQucmVzaXppbmcpIHsKCQkJCQkJJCh0aGlzKS5hZGRDbGFz cygidWktcmVzaXphYmxlLWF1dG9oaWRlIik7CgkJCQkJCXRoYXQuX2hhbmRsZXMu aGlkZSgpOwoJCQkJCX0KCQkJCX0pOwoJCX0KCgkJLy9Jbml0aWFsaXplIHRoZSBt b3VzZSBpbnRlcmFjdGlvbgoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCX0sCgoJX2Rl c3Ryb3k6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLl9tb3VzZURlc3Ryb3koKTsKCgkJ dmFyIHdyYXBwZXIsCgkJCV9kZXN0cm95ID0gZnVuY3Rpb24oZXhwKSB7CgkJCQkk KGV4cCkucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlz YWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikKCQkJCQkucmVtb3ZlRGF0YSgi cmVzaXphYmxlIikucmVtb3ZlRGF0YSgidWktcmVzaXphYmxlIikudW5iaW5kKCIu cmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUo KTsKCQkJfTsKCgkJLy9UT0RPOiBVbndyYXAgYXQgc2FtZSBET00gcG9zaXRpb24K CQlpZiAodGhpcy5lbGVtZW50SXNXcmFwcGVyKSB7CgkJCV9kZXN0cm95KHRoaXMu ZWxlbWVudCk7CgkJCXdyYXBwZXIgPSB0aGlzLmVsZW1lbnQ7CgkJCXRoaXMub3Jp Z2luYWxFbGVtZW50LmNzcyh7CgkJCQlwb3NpdGlvbjogd3JhcHBlci5jc3MoInBv c2l0aW9uIiksCgkJCQl3aWR0aDogd3JhcHBlci5vdXRlcldpZHRoKCksCgkJCQlo ZWlnaHQ6IHdyYXBwZXIub3V0ZXJIZWlnaHQoKSwKCQkJCXRvcDogd3JhcHBlci5j c3MoInRvcCIpLAoJCQkJbGVmdDogd3JhcHBlci5jc3MoImxlZnQiKQoJCQl9KS5p bnNlcnRBZnRlciggd3JhcHBlciApOwoJCQl3cmFwcGVyLnJlbW92ZSgpOwoJCX0K CgkJdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCB0aGlzLm9yaWdp bmFsUmVzaXplU3R5bGUpOwoJCV9kZXN0cm95KHRoaXMub3JpZ2luYWxFbGVtZW50 KTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9u KGV2ZW50KSB7CgkJdmFyIGksIGhhbmRsZSwKCQkJY2FwdHVyZSA9IGZhbHNlOwoK CQlmb3IgKGkgaW4gdGhpcy5oYW5kbGVzKSB7CgkJCWhhbmRsZSA9ICQodGhpcy5o YW5kbGVzW2ldKVswXTsKCQkJaWYgKGhhbmRsZSA9PT0gZXZlbnQudGFyZ2V0IHx8 ICQuY29udGFpbnMoaGFuZGxlLCBldmVudC50YXJnZXQpKSB7CgkJCQljYXB0dXJl ID0gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuICF0aGlzLm9wdGlvbnMuZGlzYWJs ZWQgJiYgY2FwdHVyZTsKCX0sCgoJX21vdXNlU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50 KSB7CgoJCXZhciBjdXJsZWZ0LCBjdXJ0b3AsIGN1cnNvciwKCQkJbyA9IHRoaXMu b3B0aW9ucywKCQkJaW5pUG9zID0gdGhpcy5lbGVtZW50LnBvc2l0aW9uKCksCgkJ CWVsID0gdGhpcy5lbGVtZW50OwoKCQl0aGlzLnJlc2l6aW5nID0gdHJ1ZTsKCgkJ Ly8gYnVnZml4IGZvciBodHRwOi8vZGV2LmpxdWVyeS5jb20vdGlja2V0LzE3NDkK CQlpZiAoICgvYWJzb2x1dGUvKS50ZXN0KCBlbC5jc3MoInBvc2l0aW9uIikgKSAp IHsKCQkJZWwuY3NzKHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHRvcDogZWwuY3Nz KCJ0b3AiKSwgbGVmdDogZWwuY3NzKCJsZWZ0IikgfSk7CgkJfSBlbHNlIGlmIChl bC5pcygiLnVpLWRyYWdnYWJsZSIpKSB7CgkJCWVsLmNzcyh7IHBvc2l0aW9uOiAi YWJzb2x1dGUiLCB0b3A6IGluaVBvcy50b3AsIGxlZnQ6IGluaVBvcy5sZWZ0IH0p OwoJCX0KCgkJdGhpcy5fcmVuZGVyUHJveHkoKTsKCgkJY3VybGVmdCA9IG51bSh0 aGlzLmhlbHBlci5jc3MoImxlZnQiKSk7CgkJY3VydG9wID0gbnVtKHRoaXMuaGVs cGVyLmNzcygidG9wIikpOwoKCQlpZiAoby5jb250YWlubWVudCkgewoJCQljdXJs ZWZ0ICs9ICQoby5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpIHx8IDA7CgkJCWN1 cnRvcCArPSAkKG8uY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpIHx8IDA7CgkJfQoK CQkvL1N0b3JlIG5lZWRlZCB2YXJpYWJsZXMKCQl0aGlzLm9mZnNldCA9IHRoaXMu aGVscGVyLm9mZnNldCgpOwoJCXRoaXMucG9zaXRpb24gPSB7IGxlZnQ6IGN1cmxl ZnQsIHRvcDogY3VydG9wIH07CgkJdGhpcy5zaXplID0gdGhpcy5faGVscGVyID8g eyB3aWR0aDogZWwub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGVsLm91dGVySGVpZ2h0 KCkgfSA6IHsgd2lkdGg6IGVsLndpZHRoKCksIGhlaWdodDogZWwuaGVpZ2h0KCkg fTsKCQl0aGlzLm9yaWdpbmFsU2l6ZSA9IHRoaXMuX2hlbHBlciA/IHsgd2lkdGg6 IGVsLm91dGVyV2lkdGgoKSwgaGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpIH0gOiB7 IHdpZHRoOiBlbC53aWR0aCgpLCBoZWlnaHQ6IGVsLmhlaWdodCgpIH07CgkJdGhp cy5vcmlnaW5hbFBvc2l0aW9uID0geyBsZWZ0OiBjdXJsZWZ0LCB0b3A6IGN1cnRv cCB9OwoJCXRoaXMuc2l6ZURpZmYgPSB7IHdpZHRoOiBlbC5vdXRlcldpZHRoKCkg LSBlbC53aWR0aCgpLCBoZWlnaHQ6IGVsLm91dGVySGVpZ2h0KCkgLSBlbC5oZWln aHQoKSB9OwoJCXRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uID0geyBsZWZ0OiBl dmVudC5wYWdlWCwgdG9wOiBldmVudC5wYWdlWSB9OwoKCQkvL0FzcGVjdCBSYXRp bwoJCXRoaXMuYXNwZWN0UmF0aW8gPSAodHlwZW9mIG8uYXNwZWN0UmF0aW8gPT09 ICJudW1iZXIiKSA/IG8uYXNwZWN0UmF0aW8gOiAoKHRoaXMub3JpZ2luYWxTaXpl LndpZHRoIC8gdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0KSB8fCAxKTsKCgkJY3Vy c29yID0gJCgiLnVpLXJlc2l6YWJsZS0iICsgdGhpcy5heGlzKS5jc3MoImN1cnNv ciIpOwoJCSQoImJvZHkiKS5jc3MoImN1cnNvciIsIGN1cnNvciA9PT0gImF1dG8i ID8gdGhpcy5heGlzICsgIi1yZXNpemUiIDogY3Vyc29yKTsKCgkJZWwuYWRkQ2xh c3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpOwoJCXRoaXMuX3Byb3BhZ2F0ZSgi c3RhcnQiLCBldmVudCk7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6 IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCS8vSW5jcmVhc2UgcGVyZm9ybWFuY2UsIGF2 b2lkIHJlZ2V4CgkJdmFyIGRhdGEsCgkJCWVsID0gdGhpcy5oZWxwZXIsIHByb3Bz ID0ge30sCgkJCXNtcCA9IHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uLAoJCQlh ID0gdGhpcy5heGlzLAoJCQlwcmV2VG9wID0gdGhpcy5wb3NpdGlvbi50b3AsCgkJ CXByZXZMZWZ0ID0gdGhpcy5wb3NpdGlvbi5sZWZ0LAoJCQlwcmV2V2lkdGggPSB0 aGlzLnNpemUud2lkdGgsCgkJCXByZXZIZWlnaHQgPSB0aGlzLnNpemUuaGVpZ2h0 LAoJCQlkeCA9IChldmVudC5wYWdlWC1zbXAubGVmdCl8fDAsCgkJCWR5ID0gKGV2 ZW50LnBhZ2VZLXNtcC50b3ApfHwwLAoJCQl0cmlnZ2VyID0gdGhpcy5fY2hhbmdl W2FdOwoKCQlpZiAoIXRyaWdnZXIpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJ Ly8gQ2FsY3VsYXRlIHRoZSBhdHRycyB0aGF0IHdpbGwgYmUgY2hhbmdlCgkJZGF0 YSA9IHRyaWdnZXIuYXBwbHkodGhpcywgW2V2ZW50LCBkeCwgZHldKTsKCgkJLy8g UHV0IHRoaXMgaW4gdGhlIG1vdXNlRHJhZyBoYW5kbGVyIHNpbmNlIHRoZSB1c2Vy IGNhbiBzdGFydCBwcmVzc2luZyBzaGlmdCB3aGlsZSByZXNpemluZwoJCXRoaXMu X3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzKGV2ZW50LnNoaWZ0S2V5KTsKCQlpZiAo dGhpcy5fYXNwZWN0UmF0aW8gfHwgZXZlbnQuc2hpZnRLZXkpIHsKCQkJZGF0YSA9 IHRoaXMuX3VwZGF0ZVJhdGlvKGRhdGEsIGV2ZW50KTsKCQl9CgoJCWRhdGEgPSB0 aGlzLl9yZXNwZWN0U2l6ZShkYXRhLCBldmVudCk7CgoJCXRoaXMuX3VwZGF0ZUNh Y2hlKGRhdGEpOwoKCQkvLyBwbHVnaW5zIGNhbGxiYWNrcyBuZWVkIHRvIGJlIGNh bGxlZCBmaXJzdAoJCXRoaXMuX3Byb3BhZ2F0ZSgicmVzaXplIiwgZXZlbnQpOwoK CQlpZiAodGhpcy5wb3NpdGlvbi50b3AgIT09IHByZXZUb3ApIHsKCQkJcHJvcHMu dG9wID0gdGhpcy5wb3NpdGlvbi50b3AgKyAicHgiOwoJCX0KCQlpZiAodGhpcy5w b3NpdGlvbi5sZWZ0ICE9PSBwcmV2TGVmdCkgewoJCQlwcm9wcy5sZWZ0ID0gdGhp cy5wb3NpdGlvbi5sZWZ0ICsgInB4IjsKCQl9CgkJaWYgKHRoaXMuc2l6ZS53aWR0 aCAhPT0gcHJldldpZHRoKSB7CgkJCXByb3BzLndpZHRoID0gdGhpcy5zaXplLndp ZHRoICsgInB4IjsKCQl9CgkJaWYgKHRoaXMuc2l6ZS5oZWlnaHQgIT09IHByZXZI ZWlnaHQpIHsKCQkJcHJvcHMuaGVpZ2h0ID0gdGhpcy5zaXplLmhlaWdodCArICJw eCI7CgkJfQoJCWVsLmNzcyhwcm9wcyk7CgoJCWlmICghdGhpcy5faGVscGVyICYm IHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKSB7CgkJ CXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCk7CgkJfQoKCQkvLyBDYWxsIHRo ZSB1c2VyIGNhbGxiYWNrIGlmIHRoZSBlbGVtZW50IHdhcyByZXNpemVkCgkJaWYg KCAhICQuaXNFbXB0eU9iamVjdChwcm9wcykgKSB7CgkJCXRoaXMuX3RyaWdnZXIo InJlc2l6ZSIsIGV2ZW50LCB0aGlzLnVpKCkpOwoJCX0KCgkJcmV0dXJuIGZhbHNl OwoJfSwKCglfbW91c2VTdG9wOiBmdW5jdGlvbihldmVudCkgewoKCQl0aGlzLnJl c2l6aW5nID0gZmFsc2U7CgkJdmFyIHByLCBpc3RhLCBzb2Zmc2V0aCwgc29mZnNl dHcsIHMsIGxlZnQsIHRvcCwKCQkJbyA9IHRoaXMub3B0aW9ucywgdGhhdCA9IHRo aXM7CgoJCWlmKHRoaXMuX2hlbHBlcikgewoKCQkJcHIgPSB0aGlzLl9wcm9wb3J0 aW9uYWxseVJlc2l6ZUVsZW1lbnRzOwoJCQlpc3RhID0gcHIubGVuZ3RoICYmICgv dGV4dGFyZWEvaSkudGVzdChwclswXS5ub2RlTmFtZSk7CgkJCXNvZmZzZXRoID0g aXN0YSAmJiAkLnVpLmhhc1Njcm9sbChwclswXSwgImxlZnQiKSAvKiBUT0RPIC0g anVtcCBoZWlnaHQgKi8gPyAwIDogdGhhdC5zaXplRGlmZi5oZWlnaHQ7CgkJCXNv ZmZzZXR3ID0gaXN0YSA/IDAgOiB0aGF0LnNpemVEaWZmLndpZHRoOwoKCQkJcyA9 IHsgd2lkdGg6ICh0aGF0LmhlbHBlci53aWR0aCgpICAtIHNvZmZzZXR3KSwgaGVp Z2h0OiAodGhhdC5oZWxwZXIuaGVpZ2h0KCkgLSBzb2Zmc2V0aCkgfTsKCQkJbGVm dCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJsZWZ0IiksIDEwKSArICh0 aGF0LnBvc2l0aW9uLmxlZnQgLSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24ubGVmdCkp IHx8IG51bGw7CgkJCXRvcCA9IChwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJ0 b3AiKSwgMTApICsgKHRoYXQucG9zaXRpb24udG9wIC0gdGhhdC5vcmlnaW5hbFBv c2l0aW9uLnRvcCkpIHx8IG51bGw7CgoJCQlpZiAoIW8uYW5pbWF0ZSkgewoJCQkJ dGhpcy5lbGVtZW50LmNzcygkLmV4dGVuZChzLCB7IHRvcDogdG9wLCBsZWZ0OiBs ZWZ0IH0pKTsKCQkJfQoKCQkJdGhhdC5oZWxwZXIuaGVpZ2h0KHRoYXQuc2l6ZS5o ZWlnaHQpOwoJCQl0aGF0LmhlbHBlci53aWR0aCh0aGF0LnNpemUud2lkdGgpOwoK CQkJaWYgKHRoaXMuX2hlbHBlciAmJiAhby5hbmltYXRlKSB7CgkJCQl0aGlzLl9w cm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoJCQl9CgkJfQoKCQkkKCJib2R5IikuY3Nz KCJjdXJzb3IiLCAiYXV0byIpOwoKCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Mo InVpLXJlc2l6YWJsZS1yZXNpemluZyIpOwoKCQl0aGlzLl9wcm9wYWdhdGUoInN0 b3AiLCBldmVudCk7CgoJCWlmICh0aGlzLl9oZWxwZXIpIHsKCQkJdGhpcy5oZWxw ZXIucmVtb3ZlKCk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7CgoJfSwKCglfdXBkYXRl VmlydHVhbEJvdW5kYXJpZXM6IGZ1bmN0aW9uKGZvcmNlQXNwZWN0UmF0aW8pIHsK CQl2YXIgcE1pbldpZHRoLCBwTWF4V2lkdGgsIHBNaW5IZWlnaHQsIHBNYXhIZWln aHQsIGIsCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgoJCWIgPSB7CgkJCW1pbldpZHRo OiBpc051bWJlcihvLm1pbldpZHRoKSA/IG8ubWluV2lkdGggOiAwLAoJCQltYXhX aWR0aDogaXNOdW1iZXIoby5tYXhXaWR0aCkgPyBvLm1heFdpZHRoIDogSW5maW5p dHksCgkJCW1pbkhlaWdodDogaXNOdW1iZXIoby5taW5IZWlnaHQpID8gby5taW5I ZWlnaHQgOiAwLAoJCQltYXhIZWlnaHQ6IGlzTnVtYmVyKG8ubWF4SGVpZ2h0KSA/ IG8ubWF4SGVpZ2h0IDogSW5maW5pdHkKCQl9OwoKCQlpZih0aGlzLl9hc3BlY3RS YXRpbyB8fCBmb3JjZUFzcGVjdFJhdGlvKSB7CgkJCS8vIFdlIHdhbnQgdG8gY3Jl YXRlIGFuIGVuY2xvc2luZyBib3ggd2hvc2UgYXNwZWN0IHJhdGlvbiBpcyB0aGUg cmVxdWVzdGVkIG9uZQoJCQkvLyBGaXJzdCwgY29tcHV0ZSB0aGUgInByb2plY3Rl ZCIgc2l6ZSBmb3IgZWFjaCBkaW1lbnNpb24gYmFzZWQgb24gdGhlIGFzcGVjdCBy YXRpbyBhbmQgb3RoZXIgZGltZW5zaW9uCgkJCXBNaW5XaWR0aCA9IGIubWluSGVp Z2h0ICogdGhpcy5hc3BlY3RSYXRpbzsKCQkJcE1pbkhlaWdodCA9IGIubWluV2lk dGggLyB0aGlzLmFzcGVjdFJhdGlvOwoJCQlwTWF4V2lkdGggPSBiLm1heEhlaWdo dCAqIHRoaXMuYXNwZWN0UmF0aW87CgkJCXBNYXhIZWlnaHQgPSBiLm1heFdpZHRo IC8gdGhpcy5hc3BlY3RSYXRpbzsKCgkJCWlmKHBNaW5XaWR0aCA+IGIubWluV2lk dGgpIHsKCQkJCWIubWluV2lkdGggPSBwTWluV2lkdGg7CgkJCX0KCQkJaWYocE1p bkhlaWdodCA+IGIubWluSGVpZ2h0KSB7CgkJCQliLm1pbkhlaWdodCA9IHBNaW5I ZWlnaHQ7CgkJCX0KCQkJaWYocE1heFdpZHRoIDwgYi5tYXhXaWR0aCkgewoJCQkJ Yi5tYXhXaWR0aCA9IHBNYXhXaWR0aDsKCQkJfQoJCQlpZihwTWF4SGVpZ2h0IDwg Yi5tYXhIZWlnaHQpIHsKCQkJCWIubWF4SGVpZ2h0ID0gcE1heEhlaWdodDsKCQkJ fQoJCX0KCQl0aGlzLl92Qm91bmRhcmllcyA9IGI7Cgl9LAoKCV91cGRhdGVDYWNo ZTogZnVuY3Rpb24oZGF0YSkgewoJCXRoaXMub2Zmc2V0ID0gdGhpcy5oZWxwZXIu b2Zmc2V0KCk7CgkJaWYgKGlzTnVtYmVyKGRhdGEubGVmdCkpIHsKCQkJdGhpcy5w b3NpdGlvbi5sZWZ0ID0gZGF0YS5sZWZ0OwoJCX0KCQlpZiAoaXNOdW1iZXIoZGF0 YS50b3ApKSB7CgkJCXRoaXMucG9zaXRpb24udG9wID0gZGF0YS50b3A7CgkJfQoJ CWlmIChpc051bWJlcihkYXRhLmhlaWdodCkpIHsKCQkJdGhpcy5zaXplLmhlaWdo dCA9IGRhdGEuaGVpZ2h0OwoJCX0KCQlpZiAoaXNOdW1iZXIoZGF0YS53aWR0aCkp IHsKCQkJdGhpcy5zaXplLndpZHRoID0gZGF0YS53aWR0aDsKCQl9Cgl9LAoKCV91 cGRhdGVSYXRpbzogZnVuY3Rpb24oIGRhdGEgKSB7CgoJCXZhciBjcG9zID0gdGhp cy5wb3NpdGlvbiwKCQkJY3NpemUgPSB0aGlzLnNpemUsCgkJCWEgPSB0aGlzLmF4 aXM7CgoJCWlmIChpc051bWJlcihkYXRhLmhlaWdodCkpIHsKCQkJZGF0YS53aWR0 aCA9IChkYXRhLmhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW8pOwoJCX0gZWxzZSBp ZiAoaXNOdW1iZXIoZGF0YS53aWR0aCkpIHsKCQkJZGF0YS5oZWlnaHQgPSAoZGF0 YS53aWR0aCAvIHRoaXMuYXNwZWN0UmF0aW8pOwoJCX0KCgkJaWYgKGEgPT09ICJz dyIpIHsKCQkJZGF0YS5sZWZ0ID0gY3Bvcy5sZWZ0ICsgKGNzaXplLndpZHRoIC0g ZGF0YS53aWR0aCk7CgkJCWRhdGEudG9wID0gbnVsbDsKCQl9CgkJaWYgKGEgPT09 ICJudyIpIHsKCQkJZGF0YS50b3AgPSBjcG9zLnRvcCArIChjc2l6ZS5oZWlnaHQg LSBkYXRhLmhlaWdodCk7CgkJCWRhdGEubGVmdCA9IGNwb3MubGVmdCArIChjc2l6 ZS53aWR0aCAtIGRhdGEud2lkdGgpOwoJCX0KCgkJcmV0dXJuIGRhdGE7Cgl9LAoK CV9yZXNwZWN0U2l6ZTogZnVuY3Rpb24oIGRhdGEgKSB7CgoJCXZhciBvID0gdGhp cy5fdkJvdW5kYXJpZXMsCgkJCWEgPSB0aGlzLmF4aXMsCgkJCWlzbWF4dyA9IGlz TnVtYmVyKGRhdGEud2lkdGgpICYmIG8ubWF4V2lkdGggJiYgKG8ubWF4V2lkdGgg PCBkYXRhLndpZHRoKSwgaXNtYXhoID0gaXNOdW1iZXIoZGF0YS5oZWlnaHQpICYm IG8ubWF4SGVpZ2h0ICYmIChvLm1heEhlaWdodCA8IGRhdGEuaGVpZ2h0KSwKCQkJ aXNtaW53ID0gaXNOdW1iZXIoZGF0YS53aWR0aCkgJiYgby5taW5XaWR0aCAmJiAo by5taW5XaWR0aCA+IGRhdGEud2lkdGgpLCBpc21pbmggPSBpc051bWJlcihkYXRh LmhlaWdodCkgJiYgby5taW5IZWlnaHQgJiYgKG8ubWluSGVpZ2h0ID4gZGF0YS5o ZWlnaHQpLAoJCQlkdyA9IHRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0ICsgdGhp cy5vcmlnaW5hbFNpemUud2lkdGgsCgkJCWRoID0gdGhpcy5wb3NpdGlvbi50b3Ag KyB0aGlzLnNpemUuaGVpZ2h0LAoJCQljdyA9IC9zd3xud3x3Ly50ZXN0KGEpLCBj aCA9IC9ud3xuZXxuLy50ZXN0KGEpOwoJCWlmIChpc21pbncpIHsKCQkJZGF0YS53 aWR0aCA9IG8ubWluV2lkdGg7CgkJfQoJCWlmIChpc21pbmgpIHsKCQkJZGF0YS5o ZWlnaHQgPSBvLm1pbkhlaWdodDsKCQl9CgkJaWYgKGlzbWF4dykgewoJCQlkYXRh LndpZHRoID0gby5tYXhXaWR0aDsKCQl9CgkJaWYgKGlzbWF4aCkgewoJCQlkYXRh LmhlaWdodCA9IG8ubWF4SGVpZ2h0OwoJCX0KCgkJaWYgKGlzbWludyAmJiBjdykg ewoJCQlkYXRhLmxlZnQgPSBkdyAtIG8ubWluV2lkdGg7CgkJfQoJCWlmIChpc21h eHcgJiYgY3cpIHsKCQkJZGF0YS5sZWZ0ID0gZHcgLSBvLm1heFdpZHRoOwoJCX0K CQlpZiAoaXNtaW5oICYmIGNoKSB7CgkJCWRhdGEudG9wID0gZGggLSBvLm1pbkhl aWdodDsKCQl9CgkJaWYgKGlzbWF4aCAmJiBjaCkgewoJCQlkYXRhLnRvcCA9IGRo IC0gby5tYXhIZWlnaHQ7CgkJfQoKCQkvLyBmaXhpbmcganVtcCBlcnJvciBvbiB0 b3AvbGVmdCAtIGJ1ZyAjMjMzMAoJCWlmICghZGF0YS53aWR0aCAmJiAhZGF0YS5o ZWlnaHQgJiYgIWRhdGEubGVmdCAmJiBkYXRhLnRvcCkgewoJCQlkYXRhLnRvcCA9 IG51bGw7CgkJfSBlbHNlIGlmICghZGF0YS53aWR0aCAmJiAhZGF0YS5oZWlnaHQg JiYgIWRhdGEudG9wICYmIGRhdGEubGVmdCkgewoJCQlkYXRhLmxlZnQgPSBudWxs OwoJCX0KCgkJcmV0dXJuIGRhdGE7Cgl9LAoKCV9wcm9wb3J0aW9uYWxseVJlc2l6 ZTogZnVuY3Rpb24oKSB7CgoJCWlmICghdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNp emVFbGVtZW50cy5sZW5ndGgpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGksIGos IGJvcmRlcnMsIHBhZGRpbmdzLCBwcmVsLAoJCQllbGVtZW50ID0gdGhpcy5oZWxw ZXIgfHwgdGhpcy5lbGVtZW50OwoKCQlmb3IgKCBpPTA7IGkgPCB0aGlzLl9wcm9w b3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CgoJCQlwcmVs ID0gdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1tpXTsKCgkJCWlm ICghdGhpcy5ib3JkZXJEaWYpIHsKCQkJCXRoaXMuYm9yZGVyRGlmID0gW107CgkJ CQlib3JkZXJzID0gW3ByZWwuY3NzKCJib3JkZXJUb3BXaWR0aCIpLCBwcmVsLmNz cygiYm9yZGVyUmlnaHRXaWR0aCIpLCBwcmVsLmNzcygiYm9yZGVyQm90dG9tV2lk dGgiKSwgcHJlbC5jc3MoImJvcmRlckxlZnRXaWR0aCIpXTsKCQkJCXBhZGRpbmdz ID0gW3ByZWwuY3NzKCJwYWRkaW5nVG9wIiksIHByZWwuY3NzKCJwYWRkaW5nUmln aHQiKSwgcHJlbC5jc3MoInBhZGRpbmdCb3R0b20iKSwgcHJlbC5jc3MoInBhZGRp bmdMZWZ0IildOwoKCQkJCWZvciAoIGogPSAwOyBqIDwgYm9yZGVycy5sZW5ndGg7 IGorKyApIHsKCQkJCQl0aGlzLmJvcmRlckRpZlsgaiBdID0gKCBwYXJzZUludCgg Ym9yZGVyc1sgaiBdLCAxMCApIHx8IDAgKSArICggcGFyc2VJbnQoIHBhZGRpbmdz WyBqIF0sIDEwICkgfHwgMCApOwoJCQkJfQoJCQl9CgoJCQlwcmVsLmNzcyh7CgkJ CQloZWlnaHQ6IChlbGVtZW50LmhlaWdodCgpIC0gdGhpcy5ib3JkZXJEaWZbMF0g LSB0aGlzLmJvcmRlckRpZlsyXSkgfHwgMCwKCQkJCXdpZHRoOiAoZWxlbWVudC53 aWR0aCgpIC0gdGhpcy5ib3JkZXJEaWZbMV0gLSB0aGlzLmJvcmRlckRpZlszXSkg fHwgMAoJCQl9KTsKCgkJfQoKCX0sCgoJX3JlbmRlclByb3h5OiBmdW5jdGlvbigp IHsKCgkJdmFyIGVsID0gdGhpcy5lbGVtZW50LCBvID0gdGhpcy5vcHRpb25zOwoJ CXRoaXMuZWxlbWVudE9mZnNldCA9IGVsLm9mZnNldCgpOwoKCQlpZih0aGlzLl9o ZWxwZXIpIHsKCgkJCXRoaXMuaGVscGVyID0gdGhpcy5oZWxwZXIgfHwgJCgiPGRp diBzdHlsZT0nb3ZlcmZsb3c6aGlkZGVuOyc+PC9kaXY+Iik7CgoJCQl0aGlzLmhl bHBlci5hZGRDbGFzcyh0aGlzLl9oZWxwZXIpLmNzcyh7CgkJCQl3aWR0aDogdGhp cy5lbGVtZW50Lm91dGVyV2lkdGgoKSAtIDEsCgkJCQloZWlnaHQ6IHRoaXMuZWxl bWVudC5vdXRlckhlaWdodCgpIC0gMSwKCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUi LAoJCQkJbGVmdDogdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQgKyJweCIsCgkJCQl0 b3A6IHRoaXMuZWxlbWVudE9mZnNldC50b3AgKyJweCIsCgkJCQl6SW5kZXg6ICsr by56SW5kZXggLy9UT0RPOiBEb24ndCBtb2RpZnkgb3B0aW9uCgkJCX0pOwoKCQkJ dGhpcy5oZWxwZXIKCQkJCS5hcHBlbmRUbygiYm9keSIpCgkJCQkuZGlzYWJsZVNl bGVjdGlvbigpOwoKCQl9IGVsc2UgewoJCQl0aGlzLmhlbHBlciA9IHRoaXMuZWxl bWVudDsKCQl9CgoJfSwKCglfY2hhbmdlOiB7CgkJZTogZnVuY3Rpb24oZXZlbnQs IGR4KSB7CgkJCXJldHVybiB7IHdpZHRoOiB0aGlzLm9yaWdpbmFsU2l6ZS53aWR0 aCArIGR4IH07CgkJfSwKCQl3OiBmdW5jdGlvbihldmVudCwgZHgpIHsKCQkJdmFy IGNzID0gdGhpcy5vcmlnaW5hbFNpemUsIHNwID0gdGhpcy5vcmlnaW5hbFBvc2l0 aW9uOwoJCQlyZXR1cm4geyBsZWZ0OiBzcC5sZWZ0ICsgZHgsIHdpZHRoOiBjcy53 aWR0aCAtIGR4IH07CgkJfSwKCQluOiBmdW5jdGlvbihldmVudCwgZHgsIGR5KSB7 CgkJCXZhciBjcyA9IHRoaXMub3JpZ2luYWxTaXplLCBzcCA9IHRoaXMub3JpZ2lu YWxQb3NpdGlvbjsKCQkJcmV0dXJuIHsgdG9wOiBzcC50b3AgKyBkeSwgaGVpZ2h0 OiBjcy5oZWlnaHQgLSBkeSB9OwoJCX0sCgkJczogZnVuY3Rpb24oZXZlbnQsIGR4 LCBkeSkgewoJCQlyZXR1cm4geyBoZWlnaHQ6IHRoaXMub3JpZ2luYWxTaXplLmhl aWdodCArIGR5IH07CgkJfSwKCQlzZTogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkg ewoJCQlyZXR1cm4gJC5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcywg YXJndW1lbnRzKSwgdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcywgW2V2ZW50LCBk eCwgZHldKSk7CgkJfSwKCQlzdzogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJ CQlyZXR1cm4gJC5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcywgYXJn dW1lbnRzKSwgdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcywgW2V2ZW50LCBkeCwg ZHldKSk7CgkJfSwKCQluZTogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJCQly ZXR1cm4gJC5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcywgYXJndW1l bnRzKSwgdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcywgW2V2ZW50LCBkeCwgZHld KSk7CgkJfSwKCQludzogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJCQlyZXR1 cm4gJC5leHRlbmQodGhpcy5fY2hhbmdlLm4uYXBwbHkodGhpcywgYXJndW1lbnRz KSwgdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcywgW2V2ZW50LCBkeCwgZHldKSk7 CgkJfQoJfSwKCglfcHJvcGFnYXRlOiBmdW5jdGlvbihuLCBldmVudCkgewoJCSQu dWkucGx1Z2luLmNhbGwodGhpcywgbiwgW2V2ZW50LCB0aGlzLnVpKCldKTsKCQko biAhPT0gInJlc2l6ZSIgJiYgdGhpcy5fdHJpZ2dlcihuLCBldmVudCwgdGhpcy51 aSgpKSk7Cgl9LAoKCXBsdWdpbnM6IHt9LAoKCXVpOiBmdW5jdGlvbigpIHsKCQly ZXR1cm4gewoJCQlvcmlnaW5hbEVsZW1lbnQ6IHRoaXMub3JpZ2luYWxFbGVtZW50 LAoJCQllbGVtZW50OiB0aGlzLmVsZW1lbnQsCgkJCWhlbHBlcjogdGhpcy5oZWxw ZXIsCgkJCXBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLAoJCQlzaXplOiB0aGlzLnNp emUsCgkJCW9yaWdpbmFsU2l6ZTogdGhpcy5vcmlnaW5hbFNpemUsCgkJCW9yaWdp bmFsUG9zaXRpb246IHRoaXMub3JpZ2luYWxQb3NpdGlvbgoJCX07Cgl9Cgp9KTsK Ci8qCiAqIFJlc2l6YWJsZSBFeHRlbnNpb25zCiAqLwoKJC51aS5wbHVnaW4uYWRk KCJyZXNpemFibGUiLCAiYW5pbWF0ZSIsIHsKCglzdG9wOiBmdW5jdGlvbiggZXZl bnQgKSB7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZSIp LAoJCQlvID0gdGhhdC5vcHRpb25zLAoJCQlwciA9IHRoYXQuX3Byb3BvcnRpb25h bGx5UmVzaXplRWxlbWVudHMsCgkJCWlzdGEgPSBwci5sZW5ndGggJiYgKC90ZXh0 YXJlYS9pKS50ZXN0KHByWzBdLm5vZGVOYW1lKSwKCQkJc29mZnNldGggPSBpc3Rh ICYmICQudWkuaGFzU2Nyb2xsKHByWzBdLCAibGVmdCIpIC8qIFRPRE8gLSBqdW1w IGhlaWdodCAqLyA/IDAgOiB0aGF0LnNpemVEaWZmLmhlaWdodCwKCQkJc29mZnNl dHcgPSBpc3RhID8gMCA6IHRoYXQuc2l6ZURpZmYud2lkdGgsCgkJCXN0eWxlID0g eyB3aWR0aDogKHRoYXQuc2l6ZS53aWR0aCAtIHNvZmZzZXR3KSwgaGVpZ2h0OiAo dGhhdC5zaXplLmhlaWdodCAtIHNvZmZzZXRoKSB9LAoJCQlsZWZ0ID0gKHBhcnNl SW50KHRoYXQuZWxlbWVudC5jc3MoImxlZnQiKSwgMTApICsgKHRoYXQucG9zaXRp b24ubGVmdCAtIHRoYXQub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KSkgfHwgbnVsbCwK CQkJdG9wID0gKHBhcnNlSW50KHRoYXQuZWxlbWVudC5jc3MoInRvcCIpLCAxMCkg KyAodGhhdC5wb3NpdGlvbi50b3AgLSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24udG9w KSkgfHwgbnVsbDsKCgkJdGhhdC5lbGVtZW50LmFuaW1hdGUoCgkJCSQuZXh0ZW5k KHN0eWxlLCB0b3AgJiYgbGVmdCA/IHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfSA6 IHt9KSwgewoJCQkJZHVyYXRpb246IG8uYW5pbWF0ZUR1cmF0aW9uLAoJCQkJZWFz aW5nOiBvLmFuaW1hdGVFYXNpbmcsCgkJCQlzdGVwOiBmdW5jdGlvbigpIHsKCgkJ CQkJdmFyIGRhdGEgPSB7CgkJCQkJCXdpZHRoOiBwYXJzZUludCh0aGF0LmVsZW1l bnQuY3NzKCJ3aWR0aCIpLCAxMCksCgkJCQkJCWhlaWdodDogcGFyc2VJbnQodGhh dC5lbGVtZW50LmNzcygiaGVpZ2h0IiksIDEwKSwKCQkJCQkJdG9wOiBwYXJzZUlu dCh0aGF0LmVsZW1lbnQuY3NzKCJ0b3AiKSwgMTApLAoJCQkJCQlsZWZ0OiBwYXJz ZUludCh0aGF0LmVsZW1lbnQuY3NzKCJsZWZ0IiksIDEwKQoJCQkJCX07CgoJCQkJ CWlmIChwciAmJiBwci5sZW5ndGgpIHsKCQkJCQkJJChwclswXSkuY3NzKHsgd2lk dGg6IGRhdGEud2lkdGgsIGhlaWdodDogZGF0YS5oZWlnaHQgfSk7CgkJCQkJfQoK CQkJCQkvLyBwcm9wYWdhdGluZyByZXNpemUsIGFuZCB1cGRhdGluZyB2YWx1ZXMg Zm9yIGVhY2ggYW5pbWF0aW9uIHN0ZXAKCQkJCQl0aGF0Ll91cGRhdGVDYWNoZShk YXRhKTsKCQkJCQl0aGF0Ll9wcm9wYWdhdGUoInJlc2l6ZSIsIGV2ZW50KTsKCgkJ CQl9CgkJCX0KCQkpOwoJfQoKfSk7CgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJs ZSIsICJjb250YWlubWVudCIsIHsKCglzdGFydDogZnVuY3Rpb24oKSB7CgkJdmFy IGVsZW1lbnQsIHAsIGNvLCBjaCwgY3csIHdpZHRoLCBoZWlnaHQsCgkJCXRoYXQg PSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZSIpLAoJCQlvID0gdGhhdC5vcHRp b25zLAoJCQllbCA9IHRoYXQuZWxlbWVudCwKCQkJb2MgPSBvLmNvbnRhaW5tZW50 LAoJCQljZSA9IChvYyBpbnN0YW5jZW9mICQpID8gb2MuZ2V0KDApIDogKC9wYXJl bnQvLnRlc3Qob2MpKSA/IGVsLnBhcmVudCgpLmdldCgwKSA6IG9jOwoKCQlpZiAo IWNlKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoYXQuY29udGFpbmVyRWxlbWVudCA9 ICQoY2UpOwoKCQlpZiAoL2RvY3VtZW50Ly50ZXN0KG9jKSB8fCBvYyA9PT0gZG9j dW1lbnQpIHsKCQkJdGhhdC5jb250YWluZXJPZmZzZXQgPSB7IGxlZnQ6IDAsIHRv cDogMCB9OwoJCQl0aGF0LmNvbnRhaW5lclBvc2l0aW9uID0geyBsZWZ0OiAwLCB0 b3A6IDAgfTsKCgkJCXRoYXQucGFyZW50RGF0YSA9IHsKCQkJCWVsZW1lbnQ6ICQo ZG9jdW1lbnQpLCBsZWZ0OiAwLCB0b3A6IDAsCgkJCQl3aWR0aDogJChkb2N1bWVu dCkud2lkdGgoKSwgaGVpZ2h0OiAkKGRvY3VtZW50KS5oZWlnaHQoKSB8fCBkb2N1 bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0CgkJCX07CgkJfQoKCQkv LyBpJ20gYSBub2RlLCBzbyBjb21wdXRlIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRv bQoJCWVsc2UgewoJCQllbGVtZW50ID0gJChjZSk7CgkJCXAgPSBbXTsKCQkJJChb ICJUb3AiLCAiUmlnaHQiLCAiTGVmdCIsICJCb3R0b20iIF0pLmVhY2goZnVuY3Rp b24oaSwgbmFtZSkgeyBwW2ldID0gbnVtKGVsZW1lbnQuY3NzKCJwYWRkaW5nIiAr IG5hbWUpKTsgfSk7CgoJCQl0aGF0LmNvbnRhaW5lck9mZnNldCA9IGVsZW1lbnQu b2Zmc2V0KCk7CgkJCXRoYXQuY29udGFpbmVyUG9zaXRpb24gPSBlbGVtZW50LnBv c2l0aW9uKCk7CgkJCXRoYXQuY29udGFpbmVyU2l6ZSA9IHsgaGVpZ2h0OiAoZWxl bWVudC5pbm5lckhlaWdodCgpIC0gcFszXSksIHdpZHRoOiAoZWxlbWVudC5pbm5l cldpZHRoKCkgLSBwWzFdKSB9OwoKCQkJY28gPSB0aGF0LmNvbnRhaW5lck9mZnNl dDsKCQkJY2ggPSB0aGF0LmNvbnRhaW5lclNpemUuaGVpZ2h0OwoJCQljdyA9IHRo YXQuY29udGFpbmVyU2l6ZS53aWR0aDsKCQkJd2lkdGggPSAoJC51aS5oYXNTY3Jv bGwoY2UsICJsZWZ0IikgPyBjZS5zY3JvbGxXaWR0aCA6IGN3ICk7CgkJCWhlaWdo dCA9ICgkLnVpLmhhc1Njcm9sbChjZSkgPyBjZS5zY3JvbGxIZWlnaHQgOiBjaCk7 CgoJCQl0aGF0LnBhcmVudERhdGEgPSB7CgkJCQllbGVtZW50OiBjZSwgbGVmdDog Y28ubGVmdCwgdG9wOiBjby50b3AsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWln aHQKCQkJfTsKCQl9Cgl9LAoKCXJlc2l6ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJ CXZhciB3b3NldCwgaG9zZXQsIGlzUGFyZW50LCBpc09mZnNldFJlbGF0aXZlLAoJ CQl0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKSwKCQkJbyA9IHRo YXQub3B0aW9ucywKCQkJY28gPSB0aGF0LmNvbnRhaW5lck9mZnNldCwgY3AgPSB0 aGF0LnBvc2l0aW9uLAoJCQlwUmF0aW8gPSB0aGF0Ll9hc3BlY3RSYXRpbyB8fCBl dmVudC5zaGlmdEtleSwKCQkJY29wID0geyB0b3A6MCwgbGVmdDowIH0sIGNlID0g dGhhdC5jb250YWluZXJFbGVtZW50OwoKCQlpZiAoY2VbMF0gIT09IGRvY3VtZW50 ICYmICgvc3RhdGljLykudGVzdChjZS5jc3MoInBvc2l0aW9uIikpKSB7CgkJCWNv cCA9IGNvOwoJCX0KCgkJaWYgKGNwLmxlZnQgPCAodGhhdC5faGVscGVyID8gY28u bGVmdCA6IDApKSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IHRoYXQuc2l6ZS53aWR0 aCArICh0aGF0Ll9oZWxwZXIgPyAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gY28ubGVm dCkgOiAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gY29wLmxlZnQpKTsKCQkJaWYgKHBS YXRpbykgewoJCQkJdGhhdC5zaXplLmhlaWdodCA9IHRoYXQuc2l6ZS53aWR0aCAv IHRoYXQuYXNwZWN0UmF0aW87CgkJCX0KCQkJdGhhdC5wb3NpdGlvbi5sZWZ0ID0g by5oZWxwZXIgPyBjby5sZWZ0IDogMDsKCQl9CgoJCWlmIChjcC50b3AgPCAodGhh dC5faGVscGVyID8gY28udG9wIDogMCkpIHsKCQkJdGhhdC5zaXplLmhlaWdodCA9 IHRoYXQuc2l6ZS5oZWlnaHQgKyAodGhhdC5faGVscGVyID8gKHRoYXQucG9zaXRp b24udG9wIC0gY28udG9wKSA6IHRoYXQucG9zaXRpb24udG9wKTsKCQkJaWYgKHBS YXRpbykgewoJCQkJdGhhdC5zaXplLndpZHRoID0gdGhhdC5zaXplLmhlaWdodCAq IHRoYXQuYXNwZWN0UmF0aW87CgkJCX0KCQkJdGhhdC5wb3NpdGlvbi50b3AgPSB0 aGF0Ll9oZWxwZXIgPyBjby50b3AgOiAwOwoJCX0KCgkJdGhhdC5vZmZzZXQubGVm dCA9IHRoYXQucGFyZW50RGF0YS5sZWZ0K3RoYXQucG9zaXRpb24ubGVmdDsKCQl0 aGF0Lm9mZnNldC50b3AgPSB0aGF0LnBhcmVudERhdGEudG9wK3RoYXQucG9zaXRp b24udG9wOwoKCQl3b3NldCA9IE1hdGguYWJzKCAodGhhdC5faGVscGVyID8gdGhh dC5vZmZzZXQubGVmdCAtIGNvcC5sZWZ0IDogKHRoYXQub2Zmc2V0LmxlZnQgLSBj b3AubGVmdCkpICsgdGhhdC5zaXplRGlmZi53aWR0aCApOwoJCWhvc2V0ID0gTWF0 aC5hYnMoICh0aGF0Ll9oZWxwZXIgPyB0aGF0Lm9mZnNldC50b3AgLSBjb3AudG9w IDogKHRoYXQub2Zmc2V0LnRvcCAtIGNvLnRvcCkpICsgdGhhdC5zaXplRGlmZi5o ZWlnaHQgKTsKCgkJaXNQYXJlbnQgPSB0aGF0LmNvbnRhaW5lckVsZW1lbnQuZ2V0 KDApID09PSB0aGF0LmVsZW1lbnQucGFyZW50KCkuZ2V0KDApOwoJCWlzT2Zmc2V0 UmVsYXRpdmUgPSAvcmVsYXRpdmV8YWJzb2x1dGUvLnRlc3QodGhhdC5jb250YWlu ZXJFbGVtZW50LmNzcygicG9zaXRpb24iKSk7CgoJCWlmKGlzUGFyZW50ICYmIGlz T2Zmc2V0UmVsYXRpdmUpIHsKCQkJd29zZXQgLT0gdGhhdC5wYXJlbnREYXRhLmxl ZnQ7CgkJfQoKCQlpZiAod29zZXQgKyB0aGF0LnNpemUud2lkdGggPj0gdGhhdC5w YXJlbnREYXRhLndpZHRoKSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IHRoYXQucGFy ZW50RGF0YS53aWR0aCAtIHdvc2V0OwoJCQlpZiAocFJhdGlvKSB7CgkJCQl0aGF0 LnNpemUuaGVpZ2h0ID0gdGhhdC5zaXplLndpZHRoIC8gdGhhdC5hc3BlY3RSYXRp bzsKCQkJfQoJCX0KCgkJaWYgKGhvc2V0ICsgdGhhdC5zaXplLmhlaWdodCA+PSB0 aGF0LnBhcmVudERhdGEuaGVpZ2h0KSB7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSB0 aGF0LnBhcmVudERhdGEuaGVpZ2h0IC0gaG9zZXQ7CgkJCWlmIChwUmF0aW8pIHsK CQkJCXRoYXQuc2l6ZS53aWR0aCA9IHRoYXQuc2l6ZS5oZWlnaHQgKiB0aGF0LmFz cGVjdFJhdGlvOwoJCQl9CgkJfQoJfSwKCglzdG9wOiBmdW5jdGlvbigpewoJCXZh ciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKSwKCQkJbyA9IHRo YXQub3B0aW9ucywKCQkJY28gPSB0aGF0LmNvbnRhaW5lck9mZnNldCwKCQkJY29w ID0gdGhhdC5jb250YWluZXJQb3NpdGlvbiwKCQkJY2UgPSB0aGF0LmNvbnRhaW5l ckVsZW1lbnQsCgkJCWhlbHBlciA9ICQodGhhdC5oZWxwZXIpLAoJCQlobyA9IGhl bHBlci5vZmZzZXQoKSwKCQkJdyA9IGhlbHBlci5vdXRlcldpZHRoKCkgLSB0aGF0 LnNpemVEaWZmLndpZHRoLAoJCQloID0gaGVscGVyLm91dGVySGVpZ2h0KCkgLSB0 aGF0LnNpemVEaWZmLmhlaWdodDsKCgkJaWYgKHRoYXQuX2hlbHBlciAmJiAhby5h bmltYXRlICYmICgvcmVsYXRpdmUvKS50ZXN0KGNlLmNzcygicG9zaXRpb24iKSkp IHsKCQkJJCh0aGlzKS5jc3MoeyBsZWZ0OiBoby5sZWZ0IC0gY29wLmxlZnQgLSBj by5sZWZ0LCB3aWR0aDogdywgaGVpZ2h0OiBoIH0pOwoJCX0KCgkJaWYgKHRoYXQu X2hlbHBlciAmJiAhby5hbmltYXRlICYmICgvc3RhdGljLykudGVzdChjZS5jc3Mo InBvc2l0aW9uIikpKSB7CgkJCSQodGhpcykuY3NzKHsgbGVmdDogaG8ubGVmdCAt IGNvcC5sZWZ0IC0gY28ubGVmdCwgd2lkdGg6IHcsIGhlaWdodDogaCB9KTsKCQl9 CgoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwgImFsc29SZXNp emUiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uICgpIHsKCQl2YXIgdGhhdCA9ICQodGhp cykuZGF0YSgidWktcmVzaXphYmxlIiksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJ CV9zdG9yZSA9IGZ1bmN0aW9uIChleHApIHsKCQkJCSQoZXhwKS5lYWNoKGZ1bmN0 aW9uKCkgewoJCQkJCXZhciBlbCA9ICQodGhpcyk7CgkJCQkJZWwuZGF0YSgidWkt cmVzaXphYmxlLWFsc29yZXNpemUiLCB7CgkJCQkJCXdpZHRoOiBwYXJzZUludChl bC53aWR0aCgpLCAxMCksIGhlaWdodDogcGFyc2VJbnQoZWwuaGVpZ2h0KCksIDEw KSwKCQkJCQkJbGVmdDogcGFyc2VJbnQoZWwuY3NzKCJsZWZ0IiksIDEwKSwgdG9w OiBwYXJzZUludChlbC5jc3MoInRvcCIpLCAxMCkKCQkJCQl9KTsKCQkJCX0pOwoJ CQl9OwoKCQlpZiAodHlwZW9mKG8uYWxzb1Jlc2l6ZSkgPT09ICJvYmplY3QiICYm ICFvLmFsc29SZXNpemUucGFyZW50Tm9kZSkgewoJCQlpZiAoby5hbHNvUmVzaXpl Lmxlbmd0aCkgeyBvLmFsc29SZXNpemUgPSBvLmFsc29SZXNpemVbMF07IF9zdG9y ZShvLmFsc29SZXNpemUpOyB9CgkJCWVsc2UgeyAkLmVhY2goby5hbHNvUmVzaXpl LCBmdW5jdGlvbiAoZXhwKSB7IF9zdG9yZShleHApOyB9KTsgfQoJCX1lbHNlewoJ CQlfc3RvcmUoby5hbHNvUmVzaXplKTsKCQl9Cgl9LAoKCXJlc2l6ZTogZnVuY3Rp b24gKGV2ZW50LCB1aSkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1y ZXNpemFibGUiKSwKCQkJbyA9IHRoYXQub3B0aW9ucywKCQkJb3MgPSB0aGF0Lm9y aWdpbmFsU2l6ZSwKCQkJb3AgPSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24sCgkJCWRl bHRhID0gewoJCQkJaGVpZ2h0OiAodGhhdC5zaXplLmhlaWdodCAtIG9zLmhlaWdo dCkgfHwgMCwgd2lkdGg6ICh0aGF0LnNpemUud2lkdGggLSBvcy53aWR0aCkgfHwg MCwKCQkJCXRvcDogKHRoYXQucG9zaXRpb24udG9wIC0gb3AudG9wKSB8fCAwLCBs ZWZ0OiAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gb3AubGVmdCkgfHwgMAoJCQl9LAoK CQkJX2Fsc29SZXNpemUgPSBmdW5jdGlvbiAoZXhwLCBjKSB7CgkJCQkkKGV4cCku ZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgZWwgPSAkKHRoaXMpLCBzdGFydCA9 ICQodGhpcykuZGF0YSgidWktcmVzaXphYmxlLWFsc29yZXNpemUiKSwgc3R5bGUg PSB7fSwKCQkJCQkJY3NzID0gYyAmJiBjLmxlbmd0aCA/IGMgOiBlbC5wYXJlbnRz KHVpLm9yaWdpbmFsRWxlbWVudFswXSkubGVuZ3RoID8gWyJ3aWR0aCIsICJoZWln aHQiXSA6IFsid2lkdGgiLCAiaGVpZ2h0IiwgInRvcCIsICJsZWZ0Il07CgoJCQkJ CSQuZWFjaChjc3MsIGZ1bmN0aW9uIChpLCBwcm9wKSB7CgkJCQkJCXZhciBzdW0g PSAoc3RhcnRbcHJvcF18fDApICsgKGRlbHRhW3Byb3BdfHwwKTsKCQkJCQkJaWYg KHN1bSAmJiBzdW0gPj0gMCkgewoJCQkJCQkJc3R5bGVbcHJvcF0gPSBzdW0gfHwg bnVsbDsKCQkJCQkJfQoJCQkJCX0pOwoKCQkJCQllbC5jc3Moc3R5bGUpOwoJCQkJ fSk7CgkJCX07CgoJCWlmICh0eXBlb2Yoby5hbHNvUmVzaXplKSA9PT0gIm9iamVj dCIgJiYgIW8uYWxzb1Jlc2l6ZS5ub2RlVHlwZSkgewoJCQkkLmVhY2goby5hbHNv UmVzaXplLCBmdW5jdGlvbiAoZXhwLCBjKSB7IF9hbHNvUmVzaXplKGV4cCwgYyk7 IH0pOwoJCX1lbHNlewoJCQlfYWxzb1Jlc2l6ZShvLmFsc29SZXNpemUpOwoJCX0K CX0sCgoJc3RvcDogZnVuY3Rpb24gKCkgewoJCSQodGhpcykucmVtb3ZlRGF0YSgi cmVzaXphYmxlLWFsc29yZXNpemUiKTsKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQo InJlc2l6YWJsZSIsICJnaG9zdCIsIHsKCglzdGFydDogZnVuY3Rpb24oKSB7CgoJ CXZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUiKSwgbyA9IHRo YXQub3B0aW9ucywgY3MgPSB0aGF0LnNpemU7CgoJCXRoYXQuZ2hvc3QgPSB0aGF0 Lm9yaWdpbmFsRWxlbWVudC5jbG9uZSgpOwoJCXRoYXQuZ2hvc3QKCQkJLmNzcyh7 IG9wYWNpdHk6IDAuMjUsIGRpc3BsYXk6ICJibG9jayIsIHBvc2l0aW9uOiAicmVs YXRpdmUiLCBoZWlnaHQ6IGNzLmhlaWdodCwgd2lkdGg6IGNzLndpZHRoLCBtYXJn aW46IDAsIGxlZnQ6IDAsIHRvcDogMCB9KQoJCQkuYWRkQ2xhc3MoInVpLXJlc2l6 YWJsZS1naG9zdCIpCgkJCS5hZGRDbGFzcyh0eXBlb2Ygby5naG9zdCA9PT0gInN0 cmluZyIgPyBvLmdob3N0IDogIiIpOwoKCQl0aGF0Lmdob3N0LmFwcGVuZFRvKHRo YXQuaGVscGVyKTsKCgl9LAoKCXJlc2l6ZTogZnVuY3Rpb24oKXsKCQl2YXIgdGhh dCA9ICQodGhpcykuZGF0YSgidWktcmVzaXphYmxlIik7CgkJaWYgKHRoYXQuZ2hv c3QpIHsKCQkJdGhhdC5naG9zdC5jc3MoeyBwb3NpdGlvbjogInJlbGF0aXZlIiwg aGVpZ2h0OiB0aGF0LnNpemUuaGVpZ2h0LCB3aWR0aDogdGhhdC5zaXplLndpZHRo IH0pOwoJCX0KCX0sCgoJc3RvcDogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSAk KHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZSIpOwoJCWlmICh0aGF0Lmdob3N0ICYm IHRoYXQuaGVscGVyKSB7CgkJCXRoYXQuaGVscGVyLmdldCgwKS5yZW1vdmVDaGls ZCh0aGF0Lmdob3N0LmdldCgwKSk7CgkJfQoJfQoKfSk7CgokLnVpLnBsdWdpbi5h ZGQoInJlc2l6YWJsZSIsICJncmlkIiwgewoKCXJlc2l6ZTogZnVuY3Rpb24oKSB7 CgkJdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZSIpLAoJCQlv ID0gdGhhdC5vcHRpb25zLAoJCQljcyA9IHRoYXQuc2l6ZSwKCQkJb3MgPSB0aGF0 Lm9yaWdpbmFsU2l6ZSwKCQkJb3AgPSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24sCgkJ CWEgPSB0aGF0LmF4aXMsCgkJCWdyaWQgPSB0eXBlb2Ygby5ncmlkID09PSAibnVt YmVyIiA/IFtvLmdyaWQsIG8uZ3JpZF0gOiBvLmdyaWQsCgkJCWdyaWRYID0gKGdy aWRbMF18fDEpLAoJCQlncmlkWSA9IChncmlkWzFdfHwxKSwKCQkJb3ggPSBNYXRo LnJvdW5kKChjcy53aWR0aCAtIG9zLndpZHRoKSAvIGdyaWRYKSAqIGdyaWRYLAoJ CQlveSA9IE1hdGgucm91bmQoKGNzLmhlaWdodCAtIG9zLmhlaWdodCkgLyBncmlk WSkgKiBncmlkWSwKCQkJbmV3V2lkdGggPSBvcy53aWR0aCArIG94LAoJCQluZXdI ZWlnaHQgPSBvcy5oZWlnaHQgKyBveSwKCQkJaXNNYXhXaWR0aCA9IG8ubWF4V2lk dGggJiYgKG8ubWF4V2lkdGggPCBuZXdXaWR0aCksCgkJCWlzTWF4SGVpZ2h0ID0g by5tYXhIZWlnaHQgJiYgKG8ubWF4SGVpZ2h0IDwgbmV3SGVpZ2h0KSwKCQkJaXNN aW5XaWR0aCA9IG8ubWluV2lkdGggJiYgKG8ubWluV2lkdGggPiBuZXdXaWR0aCks CgkJCWlzTWluSGVpZ2h0ID0gby5taW5IZWlnaHQgJiYgKG8ubWluSGVpZ2h0ID4g bmV3SGVpZ2h0KTsKCgkJby5ncmlkID0gZ3JpZDsKCgkJaWYgKGlzTWluV2lkdGgp IHsKCQkJbmV3V2lkdGggPSBuZXdXaWR0aCArIGdyaWRYOwoJCX0KCQlpZiAoaXNN aW5IZWlnaHQpIHsKCQkJbmV3SGVpZ2h0ID0gbmV3SGVpZ2h0ICsgZ3JpZFk7CgkJ fQoJCWlmIChpc01heFdpZHRoKSB7CgkJCW5ld1dpZHRoID0gbmV3V2lkdGggLSBn cmlkWDsKCQl9CgkJaWYgKGlzTWF4SGVpZ2h0KSB7CgkJCW5ld0hlaWdodCA9IG5l d0hlaWdodCAtIGdyaWRZOwoJCX0KCgkJaWYgKC9eKHNlfHN8ZSkkLy50ZXN0KGEp KSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IG5ld1dpZHRoOwoJCQl0aGF0LnNpemUu aGVpZ2h0ID0gbmV3SGVpZ2h0OwoJCX0gZWxzZSBpZiAoL14obmUpJC8udGVzdChh KSkgewoJCQl0aGF0LnNpemUud2lkdGggPSBuZXdXaWR0aDsKCQkJdGhhdC5zaXpl LmhlaWdodCA9IG5ld0hlaWdodDsKCQkJdGhhdC5wb3NpdGlvbi50b3AgPSBvcC50 b3AgLSBveTsKCQl9IGVsc2UgaWYgKC9eKHN3KSQvLnRlc3QoYSkpIHsKCQkJdGhh dC5zaXplLndpZHRoID0gbmV3V2lkdGg7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSBu ZXdIZWlnaHQ7CgkJCXRoYXQucG9zaXRpb24ubGVmdCA9IG9wLmxlZnQgLSBveDsK CQl9IGVsc2UgewoJCQl0aGF0LnNpemUud2lkdGggPSBuZXdXaWR0aDsKCQkJdGhh dC5zaXplLmhlaWdodCA9IG5ld0hlaWdodDsKCQkJdGhhdC5wb3NpdGlvbi50b3Ag PSBvcC50b3AgLSBveTsKCQkJdGhhdC5wb3NpdGlvbi5sZWZ0ID0gb3AubGVmdCAt IG94OwoJCX0KCX0KCn0pOwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5k ZWZpbmVkICkgewoKJC53aWRnZXQoInVpLnNlbGVjdGFibGUiLCAkLnVpLm1vdXNl LCB7Cgl2ZXJzaW9uOiAiMS4xMC4wIiwKCW9wdGlvbnM6IHsKCQlhcHBlbmRUbzog ImJvZHkiLAoJCWF1dG9SZWZyZXNoOiB0cnVlLAoJCWRpc3RhbmNlOiAwLAoJCWZp bHRlcjogIioiLAoJCXRvbGVyYW5jZTogInRvdWNoIiwKCgkJLy8gY2FsbGJhY2tz CgkJc2VsZWN0ZWQ6IG51bGwsCgkJc2VsZWN0aW5nOiBudWxsLAoJCXN0YXJ0OiBu dWxsLAoJCXN0b3A6IG51bGwsCgkJdW5zZWxlY3RlZDogbnVsbCwKCQl1bnNlbGVj dGluZzogbnVsbAoJfSwKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXZhciBzZWxl Y3RlZXMsCgkJCXRoYXQgPSB0aGlzOwoKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3Mo InVpLXNlbGVjdGFibGUiKTsKCgkJdGhpcy5kcmFnZ2VkID0gZmFsc2U7CgoJCS8v IGNhY2hlIHNlbGVjdGVlIGNoaWxkcmVuIGJhc2VkIG9uIGZpbHRlcgoJCXRoaXMu cmVmcmVzaCA9IGZ1bmN0aW9uKCkgewoJCQlzZWxlY3RlZXMgPSAkKHRoYXQub3B0 aW9ucy5maWx0ZXIsIHRoYXQuZWxlbWVudFswXSk7CgkJCXNlbGVjdGVlcy5hZGRD bGFzcygidWktc2VsZWN0ZWUiKTsKCQkJc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24o KSB7CgkJCQl2YXIgJHRoaXMgPSAkKHRoaXMpLAoJCQkJCXBvcyA9ICR0aGlzLm9m ZnNldCgpOwoJCQkJJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iLCB7CgkJ CQkJZWxlbWVudDogdGhpcywKCQkJCQkkZWxlbWVudDogJHRoaXMsCgkJCQkJbGVm dDogcG9zLmxlZnQsCgkJCQkJdG9wOiBwb3MudG9wLAoJCQkJCXJpZ2h0OiBwb3Mu bGVmdCArICR0aGlzLm91dGVyV2lkdGgoKSwKCQkJCQlib3R0b206IHBvcy50b3Ag KyAkdGhpcy5vdXRlckhlaWdodCgpLAoJCQkJCXN0YXJ0c2VsZWN0ZWQ6IGZhbHNl LAoJCQkJCXNlbGVjdGVkOiAkdGhpcy5oYXNDbGFzcygidWktc2VsZWN0ZWQiKSwK CQkJCQlzZWxlY3Rpbmc6ICR0aGlzLmhhc0NsYXNzKCJ1aS1zZWxlY3RpbmciKSwK CQkJCQl1bnNlbGVjdGluZzogJHRoaXMuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5n IikKCQkJCX0pOwoJCQl9KTsKCQl9OwoJCXRoaXMucmVmcmVzaCgpOwoKCQl0aGlz LnNlbGVjdGVlcyA9IHNlbGVjdGVlcy5hZGRDbGFzcygidWktc2VsZWN0ZWUiKTsK CgkJdGhpcy5fbW91c2VJbml0KCk7CgoJCXRoaXMuaGVscGVyID0gJCgiPGRpdiBj bGFzcz0ndWktc2VsZWN0YWJsZS1oZWxwZXInPjwvZGl2PiIpOwoJfSwKCglfZGVz dHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5zZWxlY3RlZXMKCQkJLnJlbW92ZUNs YXNzKCJ1aS1zZWxlY3RlZSIpCgkJCS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0 ZW0iKTsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3Rh YmxlIHVpLXNlbGVjdGFibGUtZGlzYWJsZWQiKTsKCQl0aGlzLl9tb3VzZURlc3Ry b3koKTsKCX0sCgoJX21vdXNlU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFy IHRoYXQgPSB0aGlzLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQl0aGlz Lm9wb3MgPSBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTsKCgkJaWYgKHRoaXMu b3B0aW9ucy5kaXNhYmxlZCkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLnNlbGVj dGVlcyA9ICQob3B0aW9ucy5maWx0ZXIsIHRoaXMuZWxlbWVudFswXSk7CgoJCXRo aXMuX3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQpOwoKCQkkKG9wdGlvbnMuYXBwZW5k VG8pLmFwcGVuZCh0aGlzLmhlbHBlcik7CgkJLy8gcG9zaXRpb24gaGVscGVyIChs YXNzbykKCQl0aGlzLmhlbHBlci5jc3MoewoJCQkibGVmdCI6IGV2ZW50LnBhZ2VY LAoJCQkidG9wIjogZXZlbnQucGFnZVksCgkJCSJ3aWR0aCI6IDAsCgkJCSJoZWln aHQiOiAwCgkJfSk7CgoJCWlmIChvcHRpb25zLmF1dG9SZWZyZXNoKSB7CgkJCXRo aXMucmVmcmVzaCgpOwoJCX0KCgkJdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWkt c2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZWN0ZWUgPSAk LmRhdGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIpOwoJCQlzZWxlY3RlZS5zdGFy dHNlbGVjdGVkID0gdHJ1ZTsKCQkJaWYgKCFldmVudC5tZXRhS2V5ICYmICFldmVu dC5jdHJsS2V5KSB7CgkJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygi dWktc2VsZWN0ZWQiKTsKCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gZmFsc2U7CgkJ CQlzZWxlY3RlZS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKTsK CQkJCXNlbGVjdGVlLnVuc2VsZWN0aW5nID0gdHJ1ZTsKCQkJCS8vIHNlbGVjdGFi bGUgVU5TRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCXRoYXQuX3RyaWdnZXIoInVuc2Vs ZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQl1bnNlbGVjdGluZzogc2VsZWN0ZWUuZWxl bWVudAoJCQkJfSk7CgkJCX0KCQl9KTsKCgkJJChldmVudC50YXJnZXQpLnBhcmVu dHMoKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGRvU2VsZWN0 LAoJCQkJc2VsZWN0ZWUgPSAkLmRhdGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIp OwoJCQlpZiAoc2VsZWN0ZWUpIHsKCQkJCWRvU2VsZWN0ID0gKCFldmVudC5tZXRh S2V5ICYmICFldmVudC5jdHJsS2V5KSB8fCAhc2VsZWN0ZWUuJGVsZW1lbnQuaGFz Q2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQlzZWxlY3RlZS4kZWxlbWVudAoJCQkJ CS5yZW1vdmVDbGFzcyhkb1NlbGVjdCA/ICJ1aS11bnNlbGVjdGluZyIgOiAidWkt c2VsZWN0ZWQiKQoJCQkJCS5hZGRDbGFzcyhkb1NlbGVjdCA/ICJ1aS1zZWxlY3Rp bmciIDogInVpLXVuc2VsZWN0aW5nIik7CgkJCQlzZWxlY3RlZS51bnNlbGVjdGlu ZyA9ICFkb1NlbGVjdDsKCQkJCXNlbGVjdGVlLnNlbGVjdGluZyA9IGRvU2VsZWN0 OwoJCQkJc2VsZWN0ZWUuc2VsZWN0ZWQgPSBkb1NlbGVjdDsKCQkJCS8vIHNlbGVj dGFibGUgKFVOKVNFTEVDVElORyBjYWxsYmFjawoJCQkJaWYgKGRvU2VsZWN0KSB7 CgkJCQkJdGhhdC5fdHJpZ2dlcigic2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJ c2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJfSk7CgkJCQl9IGVsc2Ug ewoJCQkJCXRoYXQuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJ CQkJdW5zZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJCQl9KTsKCQkJCX0K CQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0pOwoKCX0sCgoJX21vdXNlRHJhZzog ZnVuY3Rpb24oZXZlbnQpIHsKCgkJdGhpcy5kcmFnZ2VkID0gdHJ1ZTsKCgkJaWYg KHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIg dG1wLAoJCQl0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywK CQkJeDEgPSB0aGlzLm9wb3NbMF0sCgkJCXkxID0gdGhpcy5vcG9zWzFdLAoJCQl4 MiA9IGV2ZW50LnBhZ2VYLAoJCQl5MiA9IGV2ZW50LnBhZ2VZOwoKCQlpZiAoeDEg PiB4MikgeyB0bXAgPSB4MjsgeDIgPSB4MTsgeDEgPSB0bXA7IH0KCQlpZiAoeTEg PiB5MikgeyB0bXAgPSB5MjsgeTIgPSB5MTsgeTEgPSB0bXA7IH0KCQl0aGlzLmhl bHBlci5jc3Moe2xlZnQ6IHgxLCB0b3A6IHkxLCB3aWR0aDogeDIteDEsIGhlaWdo dDogeTIteTF9KTsKCgkJdGhpcy5zZWxlY3RlZXMuZWFjaChmdW5jdGlvbigpIHsK CQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0i KSwKCQkJCWhpdCA9IGZhbHNlOwoKCQkJLy9wcmV2ZW50IGhlbHBlciBmcm9tIGJl aW5nIHNlbGVjdGVkIGlmIGFwcGVuZFRvOiBzZWxlY3RhYmxlCgkJCWlmICghc2Vs ZWN0ZWUgfHwgc2VsZWN0ZWUuZWxlbWVudCA9PT0gdGhhdC5lbGVtZW50WzBdKSB7 CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmIChvcHRpb25zLnRvbGVyYW5jZSA9PT0g InRvdWNoIikgewoJCQkJaGl0ID0gKCAhKHNlbGVjdGVlLmxlZnQgPiB4MiB8fCBz ZWxlY3RlZS5yaWdodCA8IHgxIHx8IHNlbGVjdGVlLnRvcCA+IHkyIHx8IHNlbGVj dGVlLmJvdHRvbSA8IHkxKSApOwoJCQl9IGVsc2UgaWYgKG9wdGlvbnMudG9sZXJh bmNlID09PSAiZml0IikgewoJCQkJaGl0ID0gKHNlbGVjdGVlLmxlZnQgPiB4MSAm JiBzZWxlY3RlZS5yaWdodCA8IHgyICYmIHNlbGVjdGVlLnRvcCA+IHkxICYmIHNl bGVjdGVlLmJvdHRvbSA8IHkyKTsKCQkJfQoKCQkJaWYgKGhpdCkgewoJCQkJLy8g U0VMRUNUCgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0ZWQpIHsKCQkJCQlzZWxlY3Rl ZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTsKCQkJCQlzZWxl Y3RlZS5zZWxlY3RlZCA9IGZhbHNlOwoJCQkJfQoJCQkJaWYgKHNlbGVjdGVlLnVu c2VsZWN0aW5nKSB7CgkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3Mo InVpLXVuc2VsZWN0aW5nIik7CgkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSBm YWxzZTsKCQkJCX0KCQkJCWlmICghc2VsZWN0ZWUuc2VsZWN0aW5nKSB7CgkJCQkJ c2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpOwoJCQkJ CXNlbGVjdGVlLnNlbGVjdGluZyA9IHRydWU7CgkJCQkJLy8gc2VsZWN0YWJsZSBT RUxFQ1RJTkcgY2FsbGJhY2sKCQkJCQl0aGF0Ll90cmlnZ2VyKCJzZWxlY3Rpbmci LCBldmVudCwgewoJCQkJCQlzZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJ CQl9KTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIFVOU0VMRUNUCgkJCQlpZiAo c2VsZWN0ZWUuc2VsZWN0aW5nKSB7CgkJCQkJaWYgKChldmVudC5tZXRhS2V5IHx8 IGV2ZW50LmN0cmxLZXkpICYmIHNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJ CQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIp OwoJCQkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJCQkJc2VsZWN0 ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQkJCXNlbGVj dGVlLnNlbGVjdGVkID0gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlzZWxlY3Rl ZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIik7CgkJCQkJCXNl bGVjdGVlLnNlbGVjdGluZyA9IGZhbHNlOwoJCQkJCQlpZiAoc2VsZWN0ZWUuc3Rh cnRzZWxlY3RlZCkgewoJCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3Mo InVpLXVuc2VsZWN0aW5nIik7CgkJCQkJCQlzZWxlY3RlZS51bnNlbGVjdGluZyA9 IHRydWU7CgkJCQkJCX0KCQkJCQkJLy8gc2VsZWN0YWJsZSBVTlNFTEVDVElORyBj YWxsYmFjawoJCQkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50 LCB7CgkJCQkJCQl1bnNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJCQl9 KTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0ZWQpIHsKCQkJ CQlpZiAoIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXNlbGVj dGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVt b3ZlQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGVk ID0gZmFsc2U7CgoJCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5hZGRDbGFzcygidWkt dW5zZWxlY3RpbmciKTsKCQkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSB0cnVl OwoJCQkJCQkvLyBzZWxlY3RhYmxlIFVOU0VMRUNUSU5HIGNhbGxiYWNrCgkJCQkJ CXRoYXQuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJCXVu c2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJCX0pOwoJCQkJCX0KCQkJ CX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6 IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlzLmRy YWdnZWQgPSBmYWxzZTsKCgkJJCgiLnVpLXVuc2VsZWN0aW5nIiwgdGhpcy5lbGVt ZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZWN0ZWUgPSAkLmRh dGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIpOwoJCQlzZWxlY3RlZS4kZWxlbWVu dC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTsKCQkJc2VsZWN0ZWUudW5z ZWxlY3RpbmcgPSBmYWxzZTsKCQkJc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCA9IGZh bHNlOwoJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGVkIiwgZXZlbnQsIHsKCQkJ CXVuc2VsZWN0ZWQ6IHNlbGVjdGVlLmVsZW1lbnQKCQkJfSk7CgkJfSk7CgkJJCgi LnVpLXNlbGVjdGluZyIsIHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigp IHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0 ZW0iKTsKCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVj dGluZyIpLmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpOwoJCQlzZWxlY3RlZS5zZWxl Y3RpbmcgPSBmYWxzZTsKCQkJc2VsZWN0ZWUuc2VsZWN0ZWQgPSB0cnVlOwoJCQlz ZWxlY3RlZS5zdGFydHNlbGVjdGVkID0gdHJ1ZTsKCQkJdGhhdC5fdHJpZ2dlcigi c2VsZWN0ZWQiLCBldmVudCwgewoJCQkJc2VsZWN0ZWQ6IHNlbGVjdGVlLmVsZW1l bnQKCQkJfSk7CgkJfSk7CgkJdGhpcy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50KTsK CgkJdGhpcy5oZWxwZXIucmVtb3ZlKCk7CgoJCXJldHVybiBmYWxzZTsKCX0KCn0p OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKLypq c2hpbnQgbG9vcGZ1bmM6IHRydWUgKi8KCmZ1bmN0aW9uIGlzT3ZlckF4aXMoIHgs IHJlZmVyZW5jZSwgc2l6ZSApIHsKCXJldHVybiAoIHggPiByZWZlcmVuY2UgKSAm JiAoIHggPCAoIHJlZmVyZW5jZSArIHNpemUgKSApOwp9CgokLndpZGdldCgidWku c29ydGFibGUiLCAkLnVpLm1vdXNlLCB7Cgl2ZXJzaW9uOiAiMS4xMC4wIiwKCXdp ZGdldEV2ZW50UHJlZml4OiAic29ydCIsCglyZWFkeTogZmFsc2UsCglvcHRpb25z OiB7CgkJYXBwZW5kVG86ICJwYXJlbnQiLAoJCWF4aXM6IGZhbHNlLAoJCWNvbm5l Y3RXaXRoOiBmYWxzZSwKCQljb250YWlubWVudDogZmFsc2UsCgkJY3Vyc29yOiAi YXV0byIsCgkJY3Vyc29yQXQ6IGZhbHNlLAoJCWRyb3BPbkVtcHR5OiB0cnVlLAoJ CWZvcmNlUGxhY2Vob2xkZXJTaXplOiBmYWxzZSwKCQlmb3JjZUhlbHBlclNpemU6 IGZhbHNlLAoJCWdyaWQ6IGZhbHNlLAoJCWhhbmRsZTogZmFsc2UsCgkJaGVscGVy OiAib3JpZ2luYWwiLAoJCWl0ZW1zOiAiPiAqIiwKCQlvcGFjaXR5OiBmYWxzZSwK CQlwbGFjZWhvbGRlcjogZmFsc2UsCgkJcmV2ZXJ0OiBmYWxzZSwKCQlzY3JvbGw6 IHRydWUsCgkJc2Nyb2xsU2Vuc2l0aXZpdHk6IDIwLAoJCXNjcm9sbFNwZWVkOiAy MCwKCQlzY29wZTogImRlZmF1bHQiLAoJCXRvbGVyYW5jZTogImludGVyc2VjdCIs CgkJekluZGV4OiAxMDAwLAoKCQkvLyBjYWxsYmFja3MKCQlhY3RpdmF0ZTogbnVs bCwKCQliZWZvcmVTdG9wOiBudWxsLAoJCWNoYW5nZTogbnVsbCwKCQlkZWFjdGl2 YXRlOiBudWxsLAoJCW91dDogbnVsbCwKCQlvdmVyOiBudWxsLAoJCXJlY2VpdmU6 IG51bGwsCgkJcmVtb3ZlOiBudWxsLAoJCXNvcnQ6IG51bGwsCgkJc3RhcnQ6IG51 bGwsCgkJc3RvcDogbnVsbCwKCQl1cGRhdGU6IG51bGwKCX0sCglfY3JlYXRlOiBm dW5jdGlvbigpIHsKCgkJdmFyIG8gPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5jb250 YWluZXJDYWNoZSA9IHt9OwoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc29y dGFibGUiKTsKCgkJLy9HZXQgdGhlIGl0ZW1zCgkJdGhpcy5yZWZyZXNoKCk7CgoJ CS8vTGV0J3MgZGV0ZXJtaW5lIGlmIHRoZSBpdGVtcyBhcmUgYmVpbmcgZGlzcGxh eWVkIGhvcml6b250YWxseQoJCXRoaXMuZmxvYXRpbmcgPSB0aGlzLml0ZW1zLmxl bmd0aCA/IG8uYXhpcyA9PT0gIngiIHx8ICgvbGVmdHxyaWdodC8pLnRlc3QodGhp cy5pdGVtc1swXS5pdGVtLmNzcygiZmxvYXQiKSkgfHwgKC9pbmxpbmV8dGFibGUt Y2VsbC8pLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZGlzcGxheSIpKSA6 IGZhbHNlOwoKCQkvL0xldCdzIGRldGVybWluZSB0aGUgcGFyZW50J3Mgb2Zmc2V0 CgkJdGhpcy5vZmZzZXQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0KCk7CgoJCS8vSW5p dGlhbGl6ZSBtb3VzZSBldmVudHMgZm9yIGludGVyYWN0aW9uCgkJdGhpcy5fbW91 c2VJbml0KCk7CgoJCS8vV2UncmUgcmVhZHkgdG8gZ28KCQl0aGlzLnJlYWR5ID0g dHJ1ZTsKCgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1l bnQKCQkJLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNh YmxlZCIpOwoJCXRoaXMuX21vdXNlRGVzdHJveSgpOwoKCQlmb3IgKCB2YXIgaSA9 IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7CgkJCXRoaXMu aXRlbXNbaV0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSArICItaXRl bSIpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0 aW9uKGtleSwgdmFsdWUpewoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJ CQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCQl0aGlzLndpZGdldCgp LnRvZ2dsZUNsYXNzKCAidWktc29ydGFibGUtZGlzYWJsZWQiLCAhIXZhbHVlICk7 CgkJfSBlbHNlIHsKCQkJLy8gRG9uJ3QgY2FsbCB3aWRnZXQgYmFzZSBfc2V0T3B0 aW9uIGZvciBkaXNhYmxlIGFzIGl0IGFkZHMgdWktc3RhdGUtZGlzYWJsZWQgY2xh c3MKCQkJJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcywg YXJndW1lbnRzKTsKCQl9Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9uKGV2 ZW50LCBvdmVycmlkZUhhbmRsZSkgewoJCXZhciBjdXJyZW50SXRlbSA9IG51bGws CgkJCXZhbGlkSGFuZGxlID0gZmFsc2UsCgkJCXRoYXQgPSB0aGlzOwoKCQlpZiAo dGhpcy5yZXZlcnRpbmcpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYodGhp cy5vcHRpb25zLmRpc2FibGVkIHx8IHRoaXMub3B0aW9ucy50eXBlID09PSAic3Rh dGljIikgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvL1dlIGhhdmUgdG8gcmVm cmVzaCB0aGUgaXRlbXMgZGF0YSBvbmNlIGZpcnN0CgkJdGhpcy5fcmVmcmVzaEl0 ZW1zKGV2ZW50KTsKCgkJLy9GaW5kIG91dCBpZiB0aGUgY2xpY2tlZCBub2RlIChv ciBvbmUgb2YgaXRzIHBhcmVudHMpIGlzIGEgYWN0dWFsIGl0ZW0gaW4gdGhpcy5p dGVtcwoJCSQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigp IHsKCQkJaWYoJC5kYXRhKHRoaXMsIHRoYXQud2lkZ2V0TmFtZSArICItaXRlbSIp ID09PSB0aGF0KSB7CgkJCQljdXJyZW50SXRlbSA9ICQodGhpcyk7CgkJCQlyZXR1 cm4gZmFsc2U7CgkJCX0KCQl9KTsKCQlpZigkLmRhdGEoZXZlbnQudGFyZ2V0LCB0 aGF0LndpZGdldE5hbWUgKyAiLWl0ZW0iKSA9PT0gdGhhdCkgewoJCQljdXJyZW50 SXRlbSA9ICQoZXZlbnQudGFyZ2V0KTsKCQl9CgoJCWlmKCFjdXJyZW50SXRlbSkg ewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmKHRoaXMub3B0aW9ucy5oYW5kbGUg JiYgIW92ZXJyaWRlSGFuZGxlKSB7CgkJCSQodGhpcy5vcHRpb25zLmhhbmRsZSwg Y3VycmVudEl0ZW0pLmZpbmQoIioiKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigp IHsKCQkJCWlmKHRoaXMgPT09IGV2ZW50LnRhcmdldCkgewoJCQkJCXZhbGlkSGFu ZGxlID0gdHJ1ZTsKCQkJCX0KCQkJfSk7CgkJCWlmKCF2YWxpZEhhbmRsZSkgewoJ CQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoKCQl0aGlzLmN1cnJlbnRJdGVtID0g Y3VycmVudEl0ZW07CgkJdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKTsK CQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVu dCwgb3ZlcnJpZGVIYW5kbGUsIG5vQWN0aXZhdGlvbikgewoKCQl2YXIgaSwKCQkJ byA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5jdXJyZW50Q29udGFpbmVyID0gdGhp czsKCgkJLy9XZSBvbmx5IG5lZWQgdG8gY2FsbCByZWZyZXNoUG9zaXRpb25zLCBi ZWNhdXNlIHRoZSByZWZyZXNoSXRlbXMgY2FsbCBoYXMgYmVlbiBtb3ZlZCB0byBt b3VzZUNhcHR1cmUKCQl0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKTsKCgkJLy9DcmVh dGUgYW5kIGFwcGVuZCB0aGUgdmlzaWJsZSBoZWxwZXIKCQl0aGlzLmhlbHBlciA9 IHRoaXMuX2NyZWF0ZUhlbHBlcihldmVudCk7CgoJCS8vQ2FjaGUgdGhlIGhlbHBl ciBzaXplCgkJdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpOwoKCQkvKgoJ CSAqIC0gUG9zaXRpb24gZ2VuZXJhdGlvbiAtCgkJICogVGhpcyBibG9jayBnZW5l cmF0ZXMgZXZlcnl0aGluZyBwb3NpdGlvbiByZWxhdGVkIC0gaXQncyB0aGUgY29y ZSBvZiBkcmFnZ2FibGVzLgoJCSAqLwoKCQkvL0NhY2hlIHRoZSBtYXJnaW5zIG9m IHRoZSBvcmlnaW5hbCBlbGVtZW50CgkJdGhpcy5fY2FjaGVNYXJnaW5zKCk7CgoJ CS8vR2V0IHRoZSBuZXh0IHNjcm9sbGluZyBwYXJlbnQKCQl0aGlzLnNjcm9sbFBh cmVudCA9IHRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpOwoKCQkvL1RoZSBlbGVt ZW50J3MgYWJzb2x1dGUgcG9zaXRpb24gb24gdGhlIHBhZ2UgbWludXMgbWFyZ2lu cwoJCXRoaXMub2Zmc2V0ID0gdGhpcy5jdXJyZW50SXRlbS5vZmZzZXQoKTsKCQl0 aGlzLm9mZnNldCA9IHsKCQkJdG9wOiB0aGlzLm9mZnNldC50b3AgLSB0aGlzLm1h cmdpbnMudG9wLAoJCQlsZWZ0OiB0aGlzLm9mZnNldC5sZWZ0IC0gdGhpcy5tYXJn aW5zLmxlZnQKCQl9OwoKCQkkLmV4dGVuZCh0aGlzLm9mZnNldCwgewoJCQljbGlj azogeyAvL1doZXJlIHRoZSBjbGljayBoYXBwZW5lZCwgcmVsYXRpdmUgdG8gdGhl IGVsZW1lbnQKCQkJCWxlZnQ6IGV2ZW50LnBhZ2VYIC0gdGhpcy5vZmZzZXQubGVm dCwKCQkJCXRvcDogZXZlbnQucGFnZVkgLSB0aGlzLm9mZnNldC50b3AKCQkJfSwK CQkJcGFyZW50OiB0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSwKCQkJcmVsYXRpdmU6 IHRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkgLy9UaGlzIGlzIGEgcmVsYXRpdmUg dG8gYWJzb2x1dGUgcG9zaXRpb24gbWludXMgdGhlIGFjdHVhbCBwb3NpdGlvbiBj YWxjdWxhdGlvbiAtIG9ubHkgdXNlZCBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBo ZWxwZXIKCQl9KTsKCgkJLy8gT25seSBhZnRlciB3ZSBnb3QgdGhlIG9mZnNldCwg d2UgY2FuIGNoYW5nZSB0aGUgaGVscGVyJ3MgcG9zaXRpb24gdG8gYWJzb2x1dGUK CQkvLyBUT0RPOiBTdGlsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgYSB3YXkgdG8gbWFr ZSByZWxhdGl2ZSBzb3J0aW5nIHBvc3NpYmxlCgkJdGhpcy5oZWxwZXIuY3NzKCJw b3NpdGlvbiIsICJhYnNvbHV0ZSIpOwoJCXRoaXMuY3NzUG9zaXRpb24gPSB0aGlz LmhlbHBlci5jc3MoInBvc2l0aW9uIik7CgoJCS8vR2VuZXJhdGUgdGhlIG9yaWdp bmFsIHBvc2l0aW9uCgkJdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5fZ2Vu ZXJhdGVQb3NpdGlvbihldmVudCk7CgkJdGhpcy5vcmlnaW5hbFBhZ2VYID0gZXZl bnQucGFnZVg7CgkJdGhpcy5vcmlnaW5hbFBhZ2VZID0gZXZlbnQucGFnZVk7CgoJ CS8vQWRqdXN0IHRoZSBtb3VzZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGhlbHBl ciBpZiAiY3Vyc29yQXQiIGlzIHN1cHBsaWVkCgkJKG8uY3Vyc29yQXQgJiYgdGhp cy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihvLmN1cnNvckF0KSk7CgoJCS8vQ2Fj aGUgdGhlIGZvcm1lciBET00gcG9zaXRpb24KCQl0aGlzLmRvbVBvc2l0aW9uID0g eyBwcmV2OiB0aGlzLmN1cnJlbnRJdGVtLnByZXYoKVswXSwgcGFyZW50OiB0aGlz LmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdIH07CgoJCS8vSWYgdGhlIGhlbHBlciBp cyBub3QgdGhlIG9yaWdpbmFsLCBoaWRlIHRoZSBvcmlnaW5hbCBzbyBpdCdzIG5v dCBwbGF5aW5nIGFueSByb2xlIGR1cmluZyB0aGUgZHJhZywgd29uJ3QgY2F1c2Ug YW55dGhpbmcgYmFkIHRoaXMgd2F5CgkJaWYodGhpcy5oZWxwZXJbMF0gIT09IHRo aXMuY3VycmVudEl0ZW1bMF0pIHsKCQkJdGhpcy5jdXJyZW50SXRlbS5oaWRlKCk7 CgkJfQoKCQkvL0NyZWF0ZSB0aGUgcGxhY2Vob2xkZXIKCQl0aGlzLl9jcmVhdGVQ bGFjZWhvbGRlcigpOwoKCQkvL1NldCBhIGNvbnRhaW5tZW50IGlmIGdpdmVuIGlu IHRoZSBvcHRpb25zCgkJaWYoby5jb250YWlubWVudCkgewoJCQl0aGlzLl9zZXRD b250YWlubWVudCgpOwoJCX0KCgkJaWYoby5jdXJzb3IpIHsgLy8gY3Vyc29yIG9w dGlvbgoJCQlpZiAoJCgiYm9keSIpLmNzcygiY3Vyc29yIikpIHsKCQkJCXRoaXMu X3N0b3JlZEN1cnNvciA9ICQoImJvZHkiKS5jc3MoImN1cnNvciIpOwoJCQl9CgkJ CSQoImJvZHkiKS5jc3MoImN1cnNvciIsIG8uY3Vyc29yKTsKCQl9CgoJCWlmKG8u b3BhY2l0eSkgeyAvLyBvcGFjaXR5IG9wdGlvbgoJCQlpZiAodGhpcy5oZWxwZXIu Y3NzKCJvcGFjaXR5IikpIHsKCQkJCXRoaXMuX3N0b3JlZE9wYWNpdHkgPSB0aGlz LmhlbHBlci5jc3MoIm9wYWNpdHkiKTsKCQkJfQoJCQl0aGlzLmhlbHBlci5jc3Mo Im9wYWNpdHkiLCBvLm9wYWNpdHkpOwoJCX0KCgkJaWYoby56SW5kZXgpIHsgLy8g ekluZGV4IG9wdGlvbgoJCQlpZiAodGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSkg ewoJCQkJdGhpcy5fc3RvcmVkWkluZGV4ID0gdGhpcy5oZWxwZXIuY3NzKCJ6SW5k ZXgiKTsKCQkJfQoJCQl0aGlzLmhlbHBlci5jc3MoInpJbmRleCIsIG8uekluZGV4 KTsKCQl9CgoJCS8vUHJlcGFyZSBzY3JvbGxpbmcKCQlpZih0aGlzLnNjcm9sbFBh cmVudFswXSAhPT0gZG9jdW1lbnQgJiYgdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFn TmFtZSAhPT0gIkhUTUwiKSB7CgkJCXRoaXMub3ZlcmZsb3dPZmZzZXQgPSB0aGlz LnNjcm9sbFBhcmVudC5vZmZzZXQoKTsKCQl9CgoJCS8vQ2FsbCBjYWxsYmFja3MK CQl0aGlzLl90cmlnZ2VyKCJzdGFydCIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7 CgoJCS8vUmVjYWNoZSB0aGUgaGVscGVyIHNpemUKCQlpZighdGhpcy5fcHJlc2Vy dmVIZWxwZXJQcm9wb3J0aW9ucykgewoJCQl0aGlzLl9jYWNoZUhlbHBlclByb3Bv cnRpb25zKCk7CgkJfQoKCgkJLy9Qb3N0ICJhY3RpdmF0ZSIgZXZlbnRzIHRvIHBv c3NpYmxlIGNvbnRhaW5lcnMKCQlpZiggIW5vQWN0aXZhdGlvbiApIHsKCQkJZm9y ICggaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSAp IHsKCQkJCXRoaXMuY29udGFpbmVyc1sgaSBdLl90cmlnZ2VyKCAiYWN0aXZhdGUi LCBldmVudCwgdGhpcy5fdWlIYXNoKCB0aGlzICkgKTsKCQkJfQoJCX0KCgkJLy9Q cmVwYXJlIHBvc3NpYmxlIGRyb3BwYWJsZXMKCQlpZigkLnVpLmRkbWFuYWdlcikg ewoJCQkkLnVpLmRkbWFuYWdlci5jdXJyZW50ID0gdGhpczsKCQl9CgoJCWlmICgk LnVpLmRkbWFuYWdlciAmJiAhby5kcm9wQmVoYXZpb3VyKSB7CgkJCSQudWkuZGRt YW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsIGV2ZW50KTsKCQl9CgoJCXRoaXMu ZHJhZ2dpbmcgPSB0cnVlOwoKCQl0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29y dGFibGUtaGVscGVyIik7CgkJdGhpcy5fbW91c2VEcmFnKGV2ZW50KTsgLy9FeGVj dXRlIHRoZSBkcmFnIG9uY2UgLSB0aGlzIGNhdXNlcyB0aGUgaGVscGVyIG5vdCB0 byBiZSB2aXNpYmxlIGJlZm9yZSBnZXR0aW5nIGl0cyBjb3JyZWN0IHBvc2l0aW9u CgkJcmV0dXJuIHRydWU7CgoJfSwKCglfbW91c2VEcmFnOiBmdW5jdGlvbihldmVu dCkgewoJCXZhciBpLCBpdGVtLCBpdGVtRWxlbWVudCwgaW50ZXJzZWN0aW9uLAoJ CQlvID0gdGhpcy5vcHRpb25zLAoJCQlzY3JvbGxlZCA9IGZhbHNlOwoKCQkvL0Nv bXB1dGUgdGhlIGhlbHBlcnMgcG9zaXRpb24KCQl0aGlzLnBvc2l0aW9uID0gdGhp cy5fZ2VuZXJhdGVQb3NpdGlvbihldmVudCk7CgkJdGhpcy5wb3NpdGlvbkFicyA9 IHRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpOwoKCQlpZiAoIXRo aXMubGFzdFBvc2l0aW9uQWJzKSB7CgkJCXRoaXMubGFzdFBvc2l0aW9uQWJzID0g dGhpcy5wb3NpdGlvbkFiczsKCQl9CgoJCS8vRG8gc2Nyb2xsaW5nCgkJaWYodGhp cy5vcHRpb25zLnNjcm9sbCkgewoJCQlpZih0aGlzLnNjcm9sbFBhcmVudFswXSAh PT0gZG9jdW1lbnQgJiYgdGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSAhPT0g IkhUTUwiKSB7CgoJCQkJaWYoKHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wICsgdGhp cy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0KSAtIGV2ZW50LnBhZ2VZIDwg by5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXRoaXMuc2Nyb2xsUGFyZW50WzBd LnNjcm9sbFRvcCA9IHNjcm9sbGVkID0gdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Ny b2xsVG9wICsgby5zY3JvbGxTcGVlZDsKCQkJCX0gZWxzZSBpZihldmVudC5wYWdl WSAtIHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wIDwgby5zY3JvbGxTZW5zaXRpdml0 eSkgewoJCQkJCXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCA9IHNjcm9s bGVkID0gdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wIC0gby5zY3JvbGxT cGVlZDsKCQkJCX0KCgkJCQlpZigodGhpcy5vdmVyZmxvd09mZnNldC5sZWZ0ICsg dGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgpIC0gZXZlbnQucGFnZVgg PCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJdGhpcy5zY3JvbGxQYXJlbnRb MF0uc2Nyb2xsTGVmdCA9IHNjcm9sbGVkID0gdGhpcy5zY3JvbGxQYXJlbnRbMF0u c2Nyb2xsTGVmdCArIG8uc2Nyb2xsU3BlZWQ7CgkJCQl9IGVsc2UgaWYoZXZlbnQu cGFnZVggLSB0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQgPCBvLnNjcm9sbFNlbnNp dGl2aXR5KSB7CgkJCQkJdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCA9 IHNjcm9sbGVkID0gdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdCAtIG8u c2Nyb2xsU3BlZWQ7CgkJCQl9CgoJCQl9IGVsc2UgewoKCQkJCWlmKGV2ZW50LnBh Z2VZIC0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkgPCBvLnNjcm9sbFNlbnNpdGl2 aXR5KSB7CgkJCQkJc2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoJChk b2N1bWVudCkuc2Nyb2xsVG9wKCkgLSBvLnNjcm9sbFNwZWVkKTsKCQkJCX0gZWxz ZSBpZigkKHdpbmRvdykuaGVpZ2h0KCkgLSAoZXZlbnQucGFnZVkgLSAkKGRvY3Vt ZW50KS5zY3JvbGxUb3AoKSkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJ c2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoJChkb2N1bWVudCkuc2Ny b2xsVG9wKCkgKyBvLnNjcm9sbFNwZWVkKTsKCQkJCX0KCgkJCQlpZihldmVudC5w YWdlWCAtICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSA8IG8uc2Nyb2xsU2Vuc2l0 aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQo JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIC0gby5zY3JvbGxTcGVlZCk7CgkJCQl9 IGVsc2UgaWYoJCh3aW5kb3cpLndpZHRoKCkgLSAoZXZlbnQucGFnZVggLSAkKGRv Y3VtZW50KS5zY3JvbGxMZWZ0KCkpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJ CQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50 KS5zY3JvbGxMZWZ0KCkgKyBvLnNjcm9sbFNwZWVkKTsKCQkJCX0KCgkJCX0KCgkJ CWlmKHNjcm9sbGVkICE9PSBmYWxzZSAmJiAkLnVpLmRkbWFuYWdlciAmJiAhby5k cm9wQmVoYXZpb3VyKSB7CgkJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0 cyh0aGlzLCBldmVudCk7CgkJCX0KCQl9CgoJCS8vUmVnZW5lcmF0ZSB0aGUgYWJz b2x1dGUgcG9zaXRpb24gdXNlZCBmb3IgcG9zaXRpb24gY2hlY2tzCgkJdGhpcy5w b3NpdGlvbkFicyA9IHRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIp OwoKCQkvL1NldCB0aGUgaGVscGVyIHBvc2l0aW9uCgkJaWYoIXRoaXMub3B0aW9u cy5heGlzIHx8IHRoaXMub3B0aW9ucy5heGlzICE9PSAieSIpIHsKCQkJdGhpcy5o ZWxwZXJbMF0uc3R5bGUubGVmdCA9IHRoaXMucG9zaXRpb24ubGVmdCsicHgiOwoJ CX0KCQlpZighdGhpcy5vcHRpb25zLmF4aXMgfHwgdGhpcy5vcHRpb25zLmF4aXMg IT09ICJ4IikgewoJCQl0aGlzLmhlbHBlclswXS5zdHlsZS50b3AgPSB0aGlzLnBv c2l0aW9uLnRvcCsicHgiOwoJCX0KCgkJLy9SZWFycmFuZ2UKCQlmb3IgKGkgPSB0 aGlzLml0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgoJCQkvL0NhY2hl IHZhcmlhYmxlcyBhbmQgaW50ZXJzZWN0aW9uLCBjb250aW51ZSBpZiBubyBpbnRl cnNlY3Rpb24KCQkJaXRlbSA9IHRoaXMuaXRlbXNbaV07CgkJCWl0ZW1FbGVtZW50 ID0gaXRlbS5pdGVtWzBdOwoJCQlpbnRlcnNlY3Rpb24gPSB0aGlzLl9pbnRlcnNl Y3RzV2l0aFBvaW50ZXIoaXRlbSk7CgkJCWlmICghaW50ZXJzZWN0aW9uKSB7CgkJ CQljb250aW51ZTsKCQkJfQoKCQkJLy8gT25seSBwdXQgdGhlIHBsYWNlaG9sZGVy IGluc2lkZSB0aGUgY3VycmVudCBDb250YWluZXIsIHNraXAgYWxsCgkJCS8vIGl0 ZW1zIGZvcm0gb3RoZXIgY29udGFpbmVycy4gVGhpcyB3b3JrcyBiZWNhdXNlIHdo ZW4gbW92aW5nCgkJCS8vIGFuIGl0ZW0gZnJvbSBvbmUgY29udGFpbmVyIHRvIGFu b3RoZXIgdGhlCgkJCS8vIGN1cnJlbnRDb250YWluZXIgaXMgc3dpdGNoZWQgYmVm b3JlIHRoZSBwbGFjZWhvbGRlciBpcyBtb3ZlZC4KCQkJLy8KCQkJLy8gV2l0aG91 dCB0aGlzIG1vdmluZyBpdGVtcyBpbiAic3ViLXNvcnRhYmxlcyIgY2FuIGNhdXNl IHRoZSBwbGFjZWhvbGRlciB0byBqaXR0ZXIKCQkJLy8gYmVldHdlZW4gdGhlIG91 dGVyIGFuZCBpbm5lciBjb250YWluZXIuCgkJCWlmIChpdGVtLmluc3RhbmNlICE9 PSB0aGlzLmN1cnJlbnRDb250YWluZXIpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJ CQkvLyBjYW5ub3QgaW50ZXJzZWN0IHdpdGggaXRzZWxmCgkJCS8vIG5vIHVzZWxl c3MgYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBkb25lIGJlZm9yZQoJCQkvLyBubyBh Y3Rpb24gaWYgdGhlIGl0ZW0gbW92ZWQgaXMgdGhlIHBhcmVudCBvZiB0aGUgaXRl bSBjaGVja2VkCgkJCWlmIChpdGVtRWxlbWVudCAhPT0gdGhpcy5jdXJyZW50SXRl bVswXSAmJgoJCQkJdGhpcy5wbGFjZWhvbGRlcltpbnRlcnNlY3Rpb24gPT09IDEg PyAibmV4dCIgOiAicHJldiJdKClbMF0gIT09IGl0ZW1FbGVtZW50ICYmCgkJCQkh JC5jb250YWlucyh0aGlzLnBsYWNlaG9sZGVyWzBdLCBpdGVtRWxlbWVudCkgJiYK CQkJCSh0aGlzLm9wdGlvbnMudHlwZSA9PT0gInNlbWktZHluYW1pYyIgPyAhJC5j b250YWlucyh0aGlzLmVsZW1lbnRbMF0sIGl0ZW1FbGVtZW50KSA6IHRydWUpCgkJ CSkgewoKCQkJCXRoaXMuZGlyZWN0aW9uID0gaW50ZXJzZWN0aW9uID09PSAxID8g ImRvd24iIDogInVwIjsKCgkJCQlpZiAodGhpcy5vcHRpb25zLnRvbGVyYW5jZSA9 PT0gInBvaW50ZXIiIHx8IHRoaXMuX2ludGVyc2VjdHNXaXRoU2lkZXMoaXRlbSkp IHsKCQkJCQl0aGlzLl9yZWFycmFuZ2UoZXZlbnQsIGl0ZW0pOwoJCQkJfSBlbHNl IHsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQl0aGlzLl90cmlnZ2VyKCJjaGFuZ2Ui LCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJ CS8vUG9zdCBldmVudHMgdG8gY29udGFpbmVycwoJCXRoaXMuX2NvbnRhY3RDb250 YWluZXJzKGV2ZW50KTsKCgkJLy9JbnRlcmNvbm5lY3Qgd2l0aCBkcm9wcGFibGVz CgkJaWYoJC51aS5kZG1hbmFnZXIpIHsKCQkJJC51aS5kZG1hbmFnZXIuZHJhZyh0 aGlzLCBldmVudCk7CgkJfQoKCQkvL0NhbGwgY2FsbGJhY2tzCgkJdGhpcy5fdHJp Z2dlcigic29ydCIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7CgoJCXRoaXMubGFz dFBvc2l0aW9uQWJzID0gdGhpcy5wb3NpdGlvbkFiczsKCQlyZXR1cm4gZmFsc2U7 CgoJfSwKCglfbW91c2VTdG9wOiBmdW5jdGlvbihldmVudCwgbm9Qcm9wYWdhdGlv bikgewoKCQlpZighZXZlbnQpIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy9JZiB3ZSBh cmUgdXNpbmcgZHJvcHBhYmxlcywgaW5mb3JtIHRoZSBtYW5hZ2VyIGFib3V0IHRo ZSBkcm9wCgkJaWYgKCQudWkuZGRtYW5hZ2VyICYmICF0aGlzLm9wdGlvbnMuZHJv cEJlaGF2aW91cikgewoJCQkkLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsIGV2ZW50 KTsKCQl9CgoJCWlmKHRoaXMub3B0aW9ucy5yZXZlcnQpIHsKCQkJdmFyIHRoYXQg PSB0aGlzLAoJCQkJY3VyID0gdGhpcy5wbGFjZWhvbGRlci5vZmZzZXQoKTsKCgkJ CXRoaXMucmV2ZXJ0aW5nID0gdHJ1ZTsKCgkJCSQodGhpcy5oZWxwZXIpLmFuaW1h dGUoewoJCQkJbGVmdDogY3VyLmxlZnQgLSB0aGlzLm9mZnNldC5wYXJlbnQubGVm dCAtIHRoaXMubWFyZ2lucy5sZWZ0ICsgKHRoaXMub2Zmc2V0UGFyZW50WzBdID09 PSBkb2N1bWVudC5ib2R5ID8gMCA6IHRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9s bExlZnQpLAoJCQkJdG9wOiBjdXIudG9wIC0gdGhpcy5vZmZzZXQucGFyZW50LnRv cCAtIHRoaXMubWFyZ2lucy50b3AgKyAodGhpcy5vZmZzZXRQYXJlbnRbMF0gPT09 IGRvY3VtZW50LmJvZHkgPyAwIDogdGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xs VG9wKQoJCQl9LCBwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LCAxMCkgfHwg NTAwLCBmdW5jdGlvbigpIHsKCQkJCXRoYXQuX2NsZWFyKGV2ZW50KTsKCQkJfSk7 CgkJfSBlbHNlIHsKCQkJdGhpcy5fY2xlYXIoZXZlbnQsIG5vUHJvcGFnYXRpb24p OwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJY2FuY2VsOiBmdW5jdGlvbigp IHsKCgkJaWYodGhpcy5kcmFnZ2luZykgewoKCQkJdGhpcy5fbW91c2VVcCh7IHRh cmdldDogbnVsbCB9KTsKCgkJCWlmKHRoaXMub3B0aW9ucy5oZWxwZXIgPT09ICJv cmlnaW5hbCIpIHsKCQkJCXRoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3Jl ZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOwoJCQl9IGVs c2UgewoJCQkJdGhpcy5jdXJyZW50SXRlbS5zaG93KCk7CgkJCX0KCgkJCS8vUG9z dCBkZWFjdGl2YXRpbmcgZXZlbnRzIHRvIGNvbnRhaW5lcnMKCQkJZm9yICh2YXIg aSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJ CQl0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoImRlYWN0aXZhdGUiLCBudWxs LCB0aGlzLl91aUhhc2godGhpcykpOwoJCQkJaWYodGhpcy5jb250YWluZXJzW2ld LmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCQl0aGlzLmNvbnRhaW5lcnNbaV0u X3RyaWdnZXIoIm91dCIsIG51bGwsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQkJ dGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAwOwoJCQkJ fQoJCQl9CgoJCX0KCgkJaWYgKHRoaXMucGxhY2Vob2xkZXIpIHsKCQkJLy8kKHRo aXMucGxhY2Vob2xkZXJbMF0pLnJlbW92ZSgpOyB3b3VsZCBoYXZlIGJlZW4gdGhl IGpRdWVyeSB3YXkgLSB1bmZvcnR1bmF0ZWx5LCBpdCB1bmJpbmRzIEFMTCBldmVu dHMgZnJvbSB0aGUgb3JpZ2luYWwgbm9kZSEKCQkJaWYodGhpcy5wbGFjZWhvbGRl clswXS5wYXJlbnROb2RlKSB7CgkJCQl0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVu dE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk7CgkJCX0KCQkJ aWYodGhpcy5vcHRpb25zLmhlbHBlciAhPT0gIm9yaWdpbmFsIiAmJiB0aGlzLmhl bHBlciAmJiB0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlKSB7CgkJCQl0aGlzLmhl bHBlci5yZW1vdmUoKTsKCQkJfQoKCQkJJC5leHRlbmQodGhpcywgewoJCQkJaGVs cGVyOiBudWxsLAoJCQkJZHJhZ2dpbmc6IGZhbHNlLAoJCQkJcmV2ZXJ0aW5nOiBm YWxzZSwKCQkJCV9ub0ZpbmFsU29ydDogbnVsbAoJCQl9KTsKCgkJCWlmKHRoaXMu ZG9tUG9zaXRpb24ucHJldikgewoJCQkJJCh0aGlzLmRvbVBvc2l0aW9uLnByZXYp LmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOwoJCQl9IGVsc2UgewoJCQkJJCh0aGlz LmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKTsK CQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7CgoJfSwKCglzZXJpYWxpemU6IGZ1bmN0 aW9uKG8pIHsKCgkJdmFyIGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShv ICYmIG8uY29ubmVjdGVkKSwKCQkJc3RyID0gW107CgkJbyA9IG8gfHwge307CgoJ CSQoaXRlbXMpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciByZXMgPSAoJChvLml0 ZW0gfHwgdGhpcykuYXR0cihvLmF0dHJpYnV0ZSB8fCAiaWQiKSB8fCAiIikubWF0 Y2goby5leHByZXNzaW9uIHx8ICgvKC4rKVtcLT1fXSguKykvKSk7CgkJCWlmIChy ZXMpIHsKCQkJCXN0ci5wdXNoKChvLmtleSB8fCByZXNbMV0rIltdIikrIj0iKyhv LmtleSAmJiBvLmV4cHJlc3Npb24gPyByZXNbMV0gOiByZXNbMl0pKTsKCQkJfQoJ CX0pOwoKCQlpZighc3RyLmxlbmd0aCAmJiBvLmtleSkgewoJCQlzdHIucHVzaChv LmtleSArICI9Iik7CgkJfQoKCQlyZXR1cm4gc3RyLmpvaW4oIiYiKTsKCgl9LAoK CXRvQXJyYXk6IGZ1bmN0aW9uKG8pIHsKCgkJdmFyIGl0ZW1zID0gdGhpcy5fZ2V0 SXRlbXNBc2pRdWVyeShvICYmIG8uY29ubmVjdGVkKSwKCQkJcmV0ID0gW107CgoJ CW8gPSBvIHx8IHt9OwoKCQlpdGVtcy5lYWNoKGZ1bmN0aW9uKCkgeyByZXQucHVz aCgkKG8uaXRlbSB8fCB0aGlzKS5hdHRyKG8uYXR0cmlidXRlIHx8ICJpZCIpIHx8 ICIiKTsgfSk7CgkJcmV0dXJuIHJldDsKCgl9LAoKCS8qIEJlIGNhcmVmdWwgd2l0 aCB0aGUgZm9sbG93aW5nIGNvcmUgZnVuY3Rpb25zICovCglfaW50ZXJzZWN0c1dp dGg6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIHgxID0gdGhpcy5wb3NpdGlvbkFi cy5sZWZ0LAoJCQl4MiA9IHgxICsgdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0 aCwKCQkJeTEgPSB0aGlzLnBvc2l0aW9uQWJzLnRvcCwKCQkJeTIgPSB5MSArIHRo aXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LAoJCQlsID0gaXRlbS5sZWZ0LAoJ CQlyID0gbCArIGl0ZW0ud2lkdGgsCgkJCXQgPSBpdGVtLnRvcCwKCQkJYiA9IHQg KyBpdGVtLmhlaWdodCwKCQkJZHlDbGljayA9IHRoaXMub2Zmc2V0LmNsaWNrLnRv cCwKCQkJZHhDbGljayA9IHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsCgkJCWlzT3Zl ckVsZW1lbnQgPSAoeTEgKyBkeUNsaWNrKSA+IHQgJiYgKHkxICsgZHlDbGljaykg PCBiICYmICh4MSArIGR4Q2xpY2spID4gbCAmJiAoeDEgKyBkeENsaWNrKSA8IHI7 CgoJCWlmICggdGhpcy5vcHRpb25zLnRvbGVyYW5jZSA9PT0gInBvaW50ZXIiIHx8 CgkJCXRoaXMub3B0aW9ucy5mb3JjZVBvaW50ZXJGb3JDb250YWluZXJzIHx8CgkJ CSh0aGlzLm9wdGlvbnMudG9sZXJhbmNlICE9PSAicG9pbnRlciIgJiYgdGhpcy5o ZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nID8gIndpZHRoIiA6ICJoZWln aHQiXSA+IGl0ZW1bdGhpcy5mbG9hdGluZyA/ICJ3aWR0aCIgOiAiaGVpZ2h0Il0p CgkJKSB7CgkJCXJldHVybiBpc092ZXJFbGVtZW50OwoJCX0gZWxzZSB7CgoJCQly ZXR1cm4gKGwgPCB4MSArICh0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8g MikgJiYgLy8gUmlnaHQgSGFsZgoJCQkJeDIgLSAodGhpcy5oZWxwZXJQcm9wb3J0 aW9ucy53aWR0aCAvIDIpIDwgciAmJiAvLyBMZWZ0IEhhbGYKCQkJCXQgPCB5MSAr ICh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIpICYmIC8vIEJvdHRv bSBIYWxmCgkJCQl5MiAtICh0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAv IDIpIDwgYiApOyAvLyBUb3AgSGFsZgoKCQl9Cgl9LAoKCV9pbnRlcnNlY3RzV2l0 aFBvaW50ZXI6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIGlzT3ZlckVsZW1lbnRI ZWlnaHQgPSAodGhpcy5vcHRpb25zLmF4aXMgPT09ICJ4IikgfHwgaXNPdmVyQXhp cyh0aGlzLnBvc2l0aW9uQWJzLnRvcCArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCwg aXRlbS50b3AsIGl0ZW0uaGVpZ2h0KSwKCQkJaXNPdmVyRWxlbWVudFdpZHRoID0g KHRoaXMub3B0aW9ucy5heGlzID09PSAieSIpIHx8IGlzT3ZlckF4aXModGhpcy5w b3NpdGlvbkFicy5sZWZ0ICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdCwgaXRlbS5s ZWZ0LCBpdGVtLndpZHRoKSwKCQkJaXNPdmVyRWxlbWVudCA9IGlzT3ZlckVsZW1l bnRIZWlnaHQgJiYgaXNPdmVyRWxlbWVudFdpZHRoLAoJCQl2ZXJ0aWNhbERpcmVj dGlvbiA9IHRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLAoJCQlob3Jp em9udGFsRGlyZWN0aW9uID0gdGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rp b24oKTsKCgkJaWYgKCFpc092ZXJFbGVtZW50KSB7CgkJCXJldHVybiBmYWxzZTsK CQl9CgoJCXJldHVybiB0aGlzLmZsb2F0aW5nID8KCQkJKCAoKGhvcml6b250YWxE aXJlY3Rpb24gJiYgaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gInJpZ2h0IikgfHwg dmVydGljYWxEaXJlY3Rpb24gPT09ICJkb3duIikgPyAyIDogMSApCgkJCTogKCB2 ZXJ0aWNhbERpcmVjdGlvbiAmJiAodmVydGljYWxEaXJlY3Rpb24gPT09ICJkb3du IiA/IDIgOiAxKSApOwoKCX0sCgoJX2ludGVyc2VjdHNXaXRoU2lkZXM6IGZ1bmN0 aW9uKGl0ZW0pIHsKCgkJdmFyIGlzT3ZlckJvdHRvbUhhbGYgPSBpc092ZXJBeGlz KHRoaXMucG9zaXRpb25BYnMudG9wICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wLCBp dGVtLnRvcCArIChpdGVtLmhlaWdodC8yKSwgaXRlbS5oZWlnaHQpLAoJCQlpc092 ZXJSaWdodEhhbGYgPSBpc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCAr IHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsIGl0ZW0ubGVmdCArIChpdGVtLndpZHRo LzIpLCBpdGVtLndpZHRoKSwKCQkJdmVydGljYWxEaXJlY3Rpb24gPSB0aGlzLl9n ZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSwKCQkJaG9yaXpvbnRhbERpcmVjdGlv biA9IHRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7CgoJCWlmICh0 aGlzLmZsb2F0aW5nICYmIGhvcml6b250YWxEaXJlY3Rpb24pIHsKCQkJcmV0dXJu ICgoaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gInJpZ2h0IiAmJiBpc092ZXJSaWdo dEhhbGYpIHx8IChob3Jpem9udGFsRGlyZWN0aW9uID09PSAibGVmdCIgJiYgIWlz T3ZlclJpZ2h0SGFsZikpOwoJCX0gZWxzZSB7CgkJCXJldHVybiB2ZXJ0aWNhbERp cmVjdGlvbiAmJiAoKHZlcnRpY2FsRGlyZWN0aW9uID09PSAiZG93biIgJiYgaXNP dmVyQm90dG9tSGFsZikgfHwgKHZlcnRpY2FsRGlyZWN0aW9uID09PSAidXAiICYm ICFpc092ZXJCb3R0b21IYWxmKSk7CgkJfQoKCX0sCgoJX2dldERyYWdWZXJ0aWNh bERpcmVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGRlbHRhID0gdGhpcy5wb3Np dGlvbkFicy50b3AgLSB0aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7CgkJcmV0dXJu IGRlbHRhICE9PSAwICYmIChkZWx0YSA+IDAgPyAiZG93biIgOiAidXAiKTsKCX0s CgoJX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOiBmdW5jdGlvbigpIHsKCQl2 YXIgZGVsdGEgPSB0aGlzLnBvc2l0aW9uQWJzLmxlZnQgLSB0aGlzLmxhc3RQb3Np dGlvbkFicy5sZWZ0OwoJCXJldHVybiBkZWx0YSAhPT0gMCAmJiAoZGVsdGEgPiAw ID8gInJpZ2h0IiA6ICJsZWZ0Iik7Cgl9LAoKCXJlZnJlc2g6IGZ1bmN0aW9uKGV2 ZW50KSB7CgkJdGhpcy5fcmVmcmVzaEl0ZW1zKGV2ZW50KTsKCQl0aGlzLnJlZnJl c2hQb3NpdGlvbnMoKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJX2Nvbm5lY3RXaXRo OiBmdW5jdGlvbigpIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCQly ZXR1cm4gb3B0aW9ucy5jb25uZWN0V2l0aC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5n ID8gW29wdGlvbnMuY29ubmVjdFdpdGhdIDogb3B0aW9ucy5jb25uZWN0V2l0aDsK CX0sCgoJX2dldEl0ZW1zQXNqUXVlcnk6IGZ1bmN0aW9uKGNvbm5lY3RlZCkgewoK CQl2YXIgaSwgaiwgY3VyLCBpbnN0LAoJCQlpdGVtcyA9IFtdLAoJCQlxdWVyaWVz ID0gW10sCgkJCWNvbm5lY3RXaXRoID0gdGhpcy5fY29ubmVjdFdpdGgoKTsKCgkJ aWYoY29ubmVjdFdpdGggJiYgY29ubmVjdGVkKSB7CgkJCWZvciAoaSA9IGNvbm5l Y3RXaXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCWN1ciA9ICQoY29u bmVjdFdpdGhbaV0pOwoJCQkJZm9yICggaiA9IGN1ci5sZW5ndGggLSAxOyBqID49 IDA7IGotLSl7CgkJCQkJaW5zdCA9ICQuZGF0YShjdXJbal0sIHRoaXMud2lkZ2V0 RnVsbE5hbWUpOwoJCQkJCWlmKGluc3QgJiYgaW5zdCAhPT0gdGhpcyAmJiAhaW5z dC5vcHRpb25zLmRpc2FibGVkKSB7CgkJCQkJCXF1ZXJpZXMucHVzaChbJC5pc0Z1 bmN0aW9uKGluc3Qub3B0aW9ucy5pdGVtcykgPyBpbnN0Lm9wdGlvbnMuaXRlbXMu Y2FsbChpbnN0LmVsZW1lbnQpIDogJChpbnN0Lm9wdGlvbnMuaXRlbXMsIGluc3Qu ZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29y dGFibGUtcGxhY2Vob2xkZXIiKSwgaW5zdF0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJ CX0KCgkJcXVlcmllcy5wdXNoKFskLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0 ZW1zKSA/IHRoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCwgbnVs bCwgeyBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIGl0ZW06IHRoaXMuY3VycmVudEl0 ZW0gfSkgOiAkKHRoaXMub3B0aW9ucy5pdGVtcywgdGhpcy5lbGVtZW50KS5ub3Qo Ii51aS1zb3J0YWJsZS1oZWxwZXIiKS5ub3QoIi51aS1zb3J0YWJsZS1wbGFjZWhv bGRlciIpLCB0aGlzXSk7CgoJCWZvciAoaSA9IHF1ZXJpZXMubGVuZ3RoIC0gMTsg aSA+PSAwOyBpLS0pewoJCQlxdWVyaWVzW2ldWzBdLmVhY2goZnVuY3Rpb24oKSB7 CgkJCQlpdGVtcy5wdXNoKHRoaXMpOwoJCQl9KTsKCQl9CgoJCXJldHVybiAkKGl0 ZW1zKTsKCgl9LAoKCV9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczogZnVuY3Rpb24o KSB7CgoJCXZhciBsaXN0ID0gdGhpcy5jdXJyZW50SXRlbS5maW5kKCI6ZGF0YSgi ICsgdGhpcy53aWRnZXROYW1lICsgIi1pdGVtKSIpOwoKCQl0aGlzLml0ZW1zID0g JC5ncmVwKHRoaXMuaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7CgkJCWZvciAodmFy IGo9MDsgaiA8IGxpc3QubGVuZ3RoOyBqKyspIHsKCQkJCWlmKGxpc3Rbal0gPT09 IGl0ZW0uaXRlbVswXSkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJ CQlyZXR1cm4gdHJ1ZTsKCQl9KTsKCgl9LAoKCV9yZWZyZXNoSXRlbXM6IGZ1bmN0 aW9uKGV2ZW50KSB7CgoJCXRoaXMuaXRlbXMgPSBbXTsKCQl0aGlzLmNvbnRhaW5l cnMgPSBbdGhpc107CgoJCXZhciBpLCBqLCBjdXIsIGluc3QsIHRhcmdldERhdGEs IF9xdWVyaWVzLCBpdGVtLCBxdWVyaWVzTGVuZ3RoLAoJCQlpdGVtcyA9IHRoaXMu aXRlbXMsCgkJCXF1ZXJpZXMgPSBbWyQuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMu aXRlbXMpID8gdGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50WzBd LCBldmVudCwgeyBpdGVtOiB0aGlzLmN1cnJlbnRJdGVtIH0pIDogJCh0aGlzLm9w dGlvbnMuaXRlbXMsIHRoaXMuZWxlbWVudCksIHRoaXNdXSwKCQkJY29ubmVjdFdp dGggPSB0aGlzLl9jb25uZWN0V2l0aCgpOwoKCQlpZihjb25uZWN0V2l0aCAmJiB0 aGlzLnJlYWR5KSB7IC8vU2hvdWxkbid0IGJlIHJ1biB0aGUgZmlyc3QgdGltZSB0 aHJvdWdoIGR1ZSB0byBtYXNzaXZlIHNsb3ctZG93bgoJCQlmb3IgKGkgPSBjb25u ZWN0V2l0aC5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCQljdXIgPSAkKGNv bm5lY3RXaXRoW2ldKTsKCQkJCWZvciAoaiA9IGN1ci5sZW5ndGggLSAxOyBqID49 IDA7IGotLSl7CgkJCQkJaW5zdCA9ICQuZGF0YShjdXJbal0sIHRoaXMud2lkZ2V0 RnVsbE5hbWUpOwoJCQkJCWlmKGluc3QgJiYgaW5zdCAhPT0gdGhpcyAmJiAhaW5z dC5vcHRpb25zLmRpc2FibGVkKSB7CgkJCQkJCXF1ZXJpZXMucHVzaChbJC5pc0Z1 bmN0aW9uKGluc3Qub3B0aW9ucy5pdGVtcykgPyBpbnN0Lm9wdGlvbnMuaXRlbXMu Y2FsbChpbnN0LmVsZW1lbnRbMF0sIGV2ZW50LCB7IGl0ZW06IHRoaXMuY3VycmVu dEl0ZW0gfSkgOiAkKGluc3Qub3B0aW9ucy5pdGVtcywgaW5zdC5lbGVtZW50KSwg aW5zdF0pOwoJCQkJCQl0aGlzLmNvbnRhaW5lcnMucHVzaChpbnN0KTsKCQkJCQl9 CgkJCQl9CgkJCX0KCQl9CgoJCWZvciAoaSA9IHF1ZXJpZXMubGVuZ3RoIC0gMTsg aSA+PSAwOyBpLS0pIHsKCQkJdGFyZ2V0RGF0YSA9IHF1ZXJpZXNbaV1bMV07CgkJ CV9xdWVyaWVzID0gcXVlcmllc1tpXVswXTsKCgkJCWZvciAoaj0wLCBxdWVyaWVz TGVuZ3RoID0gX3F1ZXJpZXMubGVuZ3RoOyBqIDwgcXVlcmllc0xlbmd0aDsgaisr KSB7CgkJCQlpdGVtID0gJChfcXVlcmllc1tqXSk7CgoJCQkJaXRlbS5kYXRhKHRo aXMud2lkZ2V0TmFtZSArICItaXRlbSIsIHRhcmdldERhdGEpOyAvLyBEYXRhIGZv ciB0YXJnZXQgY2hlY2tpbmcgKG1vdXNlIG1hbmFnZXIpCgoJCQkJaXRlbXMucHVz aCh7CgkJCQkJaXRlbTogaXRlbSwKCQkJCQlpbnN0YW5jZTogdGFyZ2V0RGF0YSwK CQkJCQl3aWR0aDogMCwgaGVpZ2h0OiAwLAoJCQkJCWxlZnQ6IDAsIHRvcDogMAoJ CQkJfSk7CgkJCX0KCQl9CgoJfSwKCglyZWZyZXNoUG9zaXRpb25zOiBmdW5jdGlv bihmYXN0KSB7CgoJCS8vVGhpcyBoYXMgdG8gYmUgcmVkb25lIGJlY2F1c2UgZHVl IHRvIHRoZSBpdGVtIGJlaW5nIG1vdmVkIG91dC9pbnRvIHRoZSBvZmZzZXRQYXJl bnQsIHRoZSBvZmZzZXRQYXJlbnQncyBwb3NpdGlvbiB3aWxsIGNoYW5nZQoJCWlm KHRoaXMub2Zmc2V0UGFyZW50ICYmIHRoaXMuaGVscGVyKSB7CgkJCXRoaXMub2Zm c2V0LnBhcmVudCA9IHRoaXMuX2dldFBhcmVudE9mZnNldCgpOwoJCX0KCgkJdmFy IGksIGl0ZW0sIHQsIHA7CgoJCWZvciAoaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0g MTsgaSA+PSAwOyBpLS0pewoJCQlpdGVtID0gdGhpcy5pdGVtc1tpXTsKCgkJCS8v V2UgaWdub3JlIGNhbGN1bGF0aW5nIHBvc2l0aW9ucyBvZiBhbGwgY29ubmVjdGVk IGNvbnRhaW5lcnMgd2hlbiB3ZSdyZSBub3Qgb3ZlciB0aGVtCgkJCWlmKGl0ZW0u aW5zdGFuY2UgIT09IHRoaXMuY3VycmVudENvbnRhaW5lciAmJiB0aGlzLmN1cnJl bnRDb250YWluZXIgJiYgaXRlbS5pdGVtWzBdICE9PSB0aGlzLmN1cnJlbnRJdGVt WzBdKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJdCA9IHRoaXMub3B0aW9ucy50 b2xlcmFuY2VFbGVtZW50ID8gJCh0aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVu dCwgaXRlbS5pdGVtKSA6IGl0ZW0uaXRlbTsKCgkJCWlmICghZmFzdCkgewoJCQkJ aXRlbS53aWR0aCA9IHQub3V0ZXJXaWR0aCgpOwoJCQkJaXRlbS5oZWlnaHQgPSB0 Lm91dGVySGVpZ2h0KCk7CgkJCX0KCgkJCXAgPSB0Lm9mZnNldCgpOwoJCQlpdGVt LmxlZnQgPSBwLmxlZnQ7CgkJCWl0ZW0udG9wID0gcC50b3A7CgkJfQoKCQlpZih0 aGlzLm9wdGlvbnMuY3VzdG9tICYmIHRoaXMub3B0aW9ucy5jdXN0b20ucmVmcmVz aENvbnRhaW5lcnMpIHsKCQkJdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29u dGFpbmVycy5jYWxsKHRoaXMpOwoJCX0gZWxzZSB7CgkJCWZvciAoaSA9IHRoaXMu Y29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCQlwID0gdGhp cy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCk7CgkJCQl0aGlzLmNvbnRh aW5lcnNbaV0uY29udGFpbmVyQ2FjaGUubGVmdCA9IHAubGVmdDsKCQkJCXRoaXMu Y29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS50b3AgPSBwLnRvcDsKCQkJCXRo aXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS53aWR0aAk9IHRoaXMuY29u dGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgoKTsKCQkJCXRoaXMuY29udGFp bmVyc1tpXS5jb250YWluZXJDYWNoZS5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lcnNb aV0uZWxlbWVudC5vdXRlckhlaWdodCgpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhp czsKCX0sCgoJX2NyZWF0ZVBsYWNlaG9sZGVyOiBmdW5jdGlvbih0aGF0KSB7CgkJ dGhhdCA9IHRoYXQgfHwgdGhpczsKCQl2YXIgY2xhc3NOYW1lLAoJCQlvID0gdGhh dC5vcHRpb25zOwoKCQlpZighby5wbGFjZWhvbGRlciB8fCBvLnBsYWNlaG9sZGVy LmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKCQkJY2xhc3NOYW1lID0gby5wbGFj ZWhvbGRlcjsKCQkJby5wbGFjZWhvbGRlciA9IHsKCQkJCWVsZW1lbnQ6IGZ1bmN0 aW9uKCkgewoKCQkJCQl2YXIgZWwgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo dGhhdC5jdXJyZW50SXRlbVswXS5ub2RlTmFtZSkpCgkJCQkJCS5hZGRDbGFzcyhj bGFzc05hbWUgfHwgdGhhdC5jdXJyZW50SXRlbVswXS5jbGFzc05hbWUrIiB1aS1z b3J0YWJsZS1wbGFjZWhvbGRlciIpCgkJCQkJCS5yZW1vdmVDbGFzcygidWktc29y dGFibGUtaGVscGVyIilbMF07CgoJCQkJCWlmKCFjbGFzc05hbWUpIHsKCQkJCQkJ ZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwoJCQkJCX0KCgkJCQkJcmV0 dXJuIGVsOwoJCQkJfSwKCQkJCXVwZGF0ZTogZnVuY3Rpb24oY29udGFpbmVyLCBw KSB7CgoJCQkJCS8vIDEuIElmIGEgY2xhc3NOYW1lIGlzIHNldCBhcyAncGxhY2Vo b2xkZXIgb3B0aW9uLCB3ZSBkb24ndCBmb3JjZSBzaXplcyAtIHRoZSBjbGFzcyBp cyByZXNwb25zaWJsZSBmb3IgdGhhdAoJCQkJCS8vIDIuIFRoZSBvcHRpb24gJ2Zv cmNlUGxhY2Vob2xkZXJTaXplIGNhbiBiZSBlbmFibGVkIHRvIGZvcmNlIGl0IGV2 ZW4gaWYgYSBjbGFzcyBuYW1lIGlzIHNwZWNpZmllZAoJCQkJCWlmKGNsYXNzTmFt ZSAmJiAhby5mb3JjZVBsYWNlaG9sZGVyU2l6ZSkgewoJCQkJCQlyZXR1cm47CgkJ CQkJfQoKCQkJCQkvL0lmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhIGFjdHVh bCBoZWlnaHQgYnkgaXRzZWxmICh3aXRob3V0IHN0eWxlcyBjb21pbmcgZnJvbSBh IHN0eWxlc2hlZXQpLCBpdCByZWNlaXZlcyB0aGUgaW5saW5lIGhlaWdodCBmcm9t IHRoZSBkcmFnZ2VkIGl0ZW0KCQkJCQlpZighcC5oZWlnaHQoKSkgeyBwLmhlaWdo dCh0aGF0LmN1cnJlbnRJdGVtLmlubmVySGVpZ2h0KCkgLSBwYXJzZUludCh0aGF0 LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1RvcCIpfHwwLCAxMCkgLSBwYXJzZUlu dCh0aGF0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ0JvdHRvbSIpfHwwLCAxMCkp OyB9CgkJCQkJaWYoIXAud2lkdGgoKSkgeyBwLndpZHRoKHRoYXQuY3VycmVudEl0 ZW0uaW5uZXJXaWR0aCgpIC0gcGFyc2VJbnQodGhhdC5jdXJyZW50SXRlbS5jc3Mo InBhZGRpbmdMZWZ0Iil8fDAsIDEwKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0 ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwgMTApKTsgfQoJCQkJfQoJCQl9OwoJ CX0KCgkJLy9DcmVhdGUgdGhlIHBsYWNlaG9sZGVyCgkJdGhhdC5wbGFjZWhvbGRl ciA9ICQoby5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwodGhhdC5lbGVtZW50LCB0 aGF0LmN1cnJlbnRJdGVtKSk7CgoJCS8vQXBwZW5kIGl0IGFmdGVyIHRoZSBhY3R1 YWwgY3VycmVudCBpdGVtCgkJdGhhdC5jdXJyZW50SXRlbS5hZnRlcih0aGF0LnBs YWNlaG9sZGVyKTsKCgkJLy9VcGRhdGUgdGhlIHNpemUgb2YgdGhlIHBsYWNlaG9s ZGVyIChUT0RPOiBMb2dpYyB0byBmdXp6eSwgc2VlIGxpbmUgMzE2LzMxNykKCQlv LnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGF0LCB0aGF0LnBsYWNlaG9sZGVyKTsKCgl9 LAoKCV9jb250YWN0Q29udGFpbmVyczogZnVuY3Rpb24oZXZlbnQpIHsKCQl2YXIg aSwgaiwgZGlzdCwgaXRlbVdpdGhMZWFzdERpc3RhbmNlLCBwb3NQcm9wZXJ0eSwg c2l6ZVByb3BlcnR5LCBiYXNlLCBjdXIsIG5lYXJCb3R0b20sCgkJCWlubmVybW9z dENvbnRhaW5lciA9IG51bGwsCgkJCWlubmVybW9zdEluZGV4ID0gbnVsbDsKCgkJ Ly8gZ2V0IGlubmVybW9zdCBjb250YWluZXIgdGhhdCBpbnRlcnNlY3RzIHdpdGgg aXRlbQoJCWZvciAoaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49 IDA7IGktLSkgewoKCQkJLy8gbmV2ZXIgY29uc2lkZXIgYSBjb250YWluZXIgdGhh dCdzIGxvY2F0ZWQgd2l0aGluIHRoZSBpdGVtIGl0c2VsZgoJCQlpZigkLmNvbnRh aW5zKHRoaXMuY3VycmVudEl0ZW1bMF0sIHRoaXMuY29udGFpbmVyc1tpXS5lbGVt ZW50WzBdKSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmKHRoaXMuX2ludGVy c2VjdHNXaXRoKHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZSkpIHsK CgkJCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGEgY29udGFpbmVyIGFuZCBp dCdzIG1vcmUgImlubmVyIiB0aGFuIHRoaXMsIHRoZW4gY29udGludWUKCQkJCWlm KGlubmVybW9zdENvbnRhaW5lciAmJiAkLmNvbnRhaW5zKHRoaXMuY29udGFpbmVy c1tpXS5lbGVtZW50WzBdLCBpbm5lcm1vc3RDb250YWluZXIuZWxlbWVudFswXSkp IHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpbm5lcm1vc3RDb250YWluZXIg PSB0aGlzLmNvbnRhaW5lcnNbaV07CgkJCQlpbm5lcm1vc3RJbmRleCA9IGk7CgoJ CQl9IGVsc2UgewoJCQkJLy8gY29udGFpbmVyIGRvZXNuJ3QgaW50ZXJzZWN0LiB0 cmlnZ2VyICJvdXQiIGV2ZW50IGlmIG5lY2Vzc2FyeQoJCQkJaWYodGhpcy5jb250 YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCQl0aGlzLmNvbnRh aW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhp cykpOwoJCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVy ID0gMDsKCQkJCX0KCQkJfQoKCQl9CgoJCS8vIGlmIG5vIGludGVyc2VjdGluZyBj b250YWluZXJzIGZvdW5kLCByZXR1cm4KCQlpZighaW5uZXJtb3N0Q29udGFpbmVy KSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIG1vdmUgdGhlIGl0ZW0gaW50byB0aGUg Y29udGFpbmVyIGlmIGl0J3Mgbm90IHRoZXJlIGFscmVhZHkKCQlpZih0aGlzLmNv bnRhaW5lcnMubGVuZ3RoID09PSAxKSB7CgkJCXRoaXMuY29udGFpbmVyc1tpbm5l cm1vc3RJbmRleF0uX3RyaWdnZXIoIm92ZXIiLCBldmVudCwgdGhpcy5fdWlIYXNo KHRoaXMpKTsKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5jb250 YWluZXJDYWNoZS5vdmVyID0gMTsKCQl9IGVsc2UgewoKCQkJLy9XaGVuIGVudGVy aW5nIGEgbmV3IGNvbnRhaW5lciwgd2Ugd2lsbCBmaW5kIHRoZSBpdGVtIHdpdGgg dGhlIGxlYXN0IGRpc3RhbmNlIGFuZCBhcHBlbmQgb3VyIGl0ZW0gbmVhciBpdAoJ CQlkaXN0ID0gMTAwMDA7CgkJCWl0ZW1XaXRoTGVhc3REaXN0YW5jZSA9IG51bGw7 CgkJCXBvc1Byb3BlcnR5ID0gdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4 XS5mbG9hdGluZyA/ICJsZWZ0IiA6ICJ0b3AiOwoJCQlzaXplUHJvcGVydHkgPSB0 aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmZsb2F0aW5nID8gIndpZHRo IiA6ICJoZWlnaHQiOwoJCQliYXNlID0gdGhpcy5wb3NpdGlvbkFic1twb3NQcm9w ZXJ0eV0gKyB0aGlzLm9mZnNldC5jbGlja1twb3NQcm9wZXJ0eV07CgkJCWZvciAo aiA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJCWlm KCEkLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0uZWxl bWVudFswXSwgdGhpcy5pdGVtc1tqXS5pdGVtWzBdKSkgewoJCQkJCWNvbnRpbnVl OwoJCQkJfQoJCQkJaWYodGhpcy5pdGVtc1tqXS5pdGVtWzBdID09PSB0aGlzLmN1 cnJlbnRJdGVtWzBdKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQljdXIgPSB0 aGlzLml0ZW1zW2pdLml0ZW0ub2Zmc2V0KClbcG9zUHJvcGVydHldOwoJCQkJbmVh ckJvdHRvbSA9IGZhbHNlOwoJCQkJaWYoTWF0aC5hYnMoY3VyIC0gYmFzZSkgPiBN YXRoLmFicyhjdXIgKyB0aGlzLml0ZW1zW2pdW3NpemVQcm9wZXJ0eV0gLSBiYXNl KSl7CgkJCQkJbmVhckJvdHRvbSA9IHRydWU7CgkJCQkJY3VyICs9IHRoaXMuaXRl bXNbal1bc2l6ZVByb3BlcnR5XTsKCQkJCX0KCgkJCQlpZihNYXRoLmFicyhjdXIg LSBiYXNlKSA8IGRpc3QpIHsKCQkJCQlkaXN0ID0gTWF0aC5hYnMoY3VyIC0gYmFz ZSk7IGl0ZW1XaXRoTGVhc3REaXN0YW5jZSA9IHRoaXMuaXRlbXNbal07CgkJCQkJ dGhpcy5kaXJlY3Rpb24gPSBuZWFyQm90dG9tID8gInVwIjogImRvd24iOwoJCQkJ fQoJCQl9CgoJCQkvL0NoZWNrIGlmIGRyb3BPbkVtcHR5IGlzIGVuYWJsZWQKCQkJ aWYoIWl0ZW1XaXRoTGVhc3REaXN0YW5jZSAmJiAhdGhpcy5vcHRpb25zLmRyb3BP bkVtcHR5KSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRoaXMuY3VycmVudENvbnRh aW5lciA9IHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF07CgkJCWl0ZW1X aXRoTGVhc3REaXN0YW5jZSA/IHRoaXMuX3JlYXJyYW5nZShldmVudCwgaXRlbVdp dGhMZWFzdERpc3RhbmNlLCBudWxsLCB0cnVlKSA6IHRoaXMuX3JlYXJyYW5nZShl dmVudCwgbnVsbCwgdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5lbGVt ZW50LCB0cnVlKTsKCQkJdGhpcy5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRo aXMuX3VpSGFzaCgpKTsKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4 XS5fdHJpZ2dlcigiY2hhbmdlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7 CgoJCQkvL1VwZGF0ZSB0aGUgcGxhY2Vob2xkZXIKCQkJdGhpcy5vcHRpb25zLnBs YWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsIHRoaXMucGxh Y2Vob2xkZXIpOwoKCQkJdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XS5f dHJpZ2dlcigib3ZlciIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhpcykpOwoJCQl0 aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmNvbnRhaW5lckNhY2hlLm92 ZXIgPSAxOwoJCX0KCgoJfSwKCglfY3JlYXRlSGVscGVyOiBmdW5jdGlvbihldmVu dCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9ucywKCQkJaGVscGVyID0gJC5pc0Z1 bmN0aW9uKG8uaGVscGVyKSA/ICQoby5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50 WzBdLCBbZXZlbnQsIHRoaXMuY3VycmVudEl0ZW1dKSkgOiAoby5oZWxwZXIgPT09 ICJjbG9uZSIgPyB0aGlzLmN1cnJlbnRJdGVtLmNsb25lKCkgOiB0aGlzLmN1cnJl bnRJdGVtKTsKCgkJLy9BZGQgdGhlIGhlbHBlciB0byB0aGUgRE9NIGlmIHRoYXQg ZGlkbid0IGhhcHBlbiBhbHJlYWR5CgkJaWYoIWhlbHBlci5wYXJlbnRzKCJib2R5 IikubGVuZ3RoKSB7CgkJCSQoby5hcHBlbmRUbyAhPT0gInBhcmVudCIgPyBvLmFw cGVuZFRvIDogdGhpcy5jdXJyZW50SXRlbVswXS5wYXJlbnROb2RlKVswXS5hcHBl bmRDaGlsZChoZWxwZXJbMF0pOwoJCX0KCgkJaWYoaGVscGVyWzBdID09PSB0aGlz LmN1cnJlbnRJdGVtWzBdKSB7CgkJCXRoaXMuX3N0b3JlZENTUyA9IHsgd2lkdGg6 IHRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsIGhlaWdodDogdGhpcy5j dXJyZW50SXRlbVswXS5zdHlsZS5oZWlnaHQsIHBvc2l0aW9uOiB0aGlzLmN1cnJl bnRJdGVtLmNzcygicG9zaXRpb24iKSwgdG9wOiB0aGlzLmN1cnJlbnRJdGVtLmNz cygidG9wIiksIGxlZnQ6IHRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0IikgfTsK CQl9CgoJCWlmKCFoZWxwZXJbMF0uc3R5bGUud2lkdGggfHwgby5mb3JjZUhlbHBl clNpemUpIHsKCQkJaGVscGVyLndpZHRoKHRoaXMuY3VycmVudEl0ZW0ud2lkdGgo KSk7CgkJfQoJCWlmKCFoZWxwZXJbMF0uc3R5bGUuaGVpZ2h0IHx8IG8uZm9yY2VI ZWxwZXJTaXplKSB7CgkJCWhlbHBlci5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5o ZWlnaHQoKSk7CgkJfQoKCQlyZXR1cm4gaGVscGVyOwoKCX0sCgoJX2FkanVzdE9m ZnNldEZyb21IZWxwZXI6IGZ1bmN0aW9uKG9iaikgewoJCWlmICh0eXBlb2Ygb2Jq ID09PSAic3RyaW5nIikgewoJCQlvYmogPSBvYmouc3BsaXQoIiAiKTsKCQl9CgkJ aWYgKCQuaXNBcnJheShvYmopKSB7CgkJCW9iaiA9IHtsZWZ0OiArb2JqWzBdLCB0 b3A6ICtvYmpbMV0gfHwgMH07CgkJfQoJCWlmICgibGVmdCIgaW4gb2JqKSB7CgkJ CXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSBvYmoubGVmdCArIHRoaXMubWFyZ2lu cy5sZWZ0OwoJCX0KCQlpZiAoInJpZ2h0IiBpbiBvYmopIHsKCQkJdGhpcy5vZmZz ZXQuY2xpY2subGVmdCA9IHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSBv YmoucmlnaHQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCJ0b3AiIGlu IG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSBvYmoudG9wICsgdGhp cy5tYXJnaW5zLnRvcDsKCQl9CgkJaWYgKCJib3R0b20iIGluIG9iaikgewoJCQl0 aGlzLm9mZnNldC5jbGljay50b3AgPSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhl aWdodCAtIG9iai5ib3R0b20gKyB0aGlzLm1hcmdpbnMudG9wOwoJCX0KCX0sCgoJ X2dldFBhcmVudE9mZnNldDogZnVuY3Rpb24oKSB7CgoKCQkvL0dldCB0aGUgb2Zm c2V0UGFyZW50IGFuZCBjYWNoZSBpdHMgcG9zaXRpb24KCQl0aGlzLm9mZnNldFBh cmVudCA9IHRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpOwoJCXZhciBwbyA9IHRo aXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBUaGlzIGlzIGEgc3BlY2lh bCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5IGEgb2Zmc2V0IGNhbGN1bGF0 ZWQgb24gc3RhcnQsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaGFwcGVuZWQ6CgkJLy8g MS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIgaXMgYWJzb2x1dGUsIHNvIGl0 J3MgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbmV4dCBwb3Np dGlvbmVkIHBhcmVudAoJCS8vIDIuIFRoZSBhY3R1YWwgb2Zmc2V0IHBhcmVudCBp cyBhIGNoaWxkIG9mIHRoZSBzY3JvbGwgcGFyZW50LCBhbmQgdGhlIHNjcm9sbCBw YXJlbnQgaXNuJ3QgdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0CgkJLy8g ICAgdGhlIHNjcm9sbCBpcyBpbmNsdWRlZCBpbiB0aGUgaW5pdGlhbCBjYWxjdWxh dGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQsIGFuZCBuZXZlciByZWNh bGN1bGF0ZWQgdXBvbiBkcmFnCgkJaWYodGhpcy5jc3NQb3NpdGlvbiA9PT0gImFi c29sdXRlIiAmJiB0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQgJiYg JC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJl bnRbMF0pKSB7CgkJCXBvLmxlZnQgKz0gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xs TGVmdCgpOwoJCQlwby50b3AgKz0gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9w KCk7CgkJfQoKCQkvLyBUaGlzIG5lZWRzIHRvIGJlIGFjdHVhbGx5IGRvbmUgZm9y IGFsbCBicm93c2Vycywgc2luY2UgcGFnZVgvcGFnZVkgaW5jbHVkZXMgdGhpcyBp bmZvcm1hdGlvbgoJCS8vIHdpdGggYW4gdWdseSBJRSBmaXgKCQlpZiggdGhpcy5v ZmZzZXRQYXJlbnRbMF0gPT09IGRvY3VtZW50LmJvZHkgfHwgKHRoaXMub2Zmc2V0 UGFyZW50WzBdLnRhZ05hbWUgJiYgdGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFt ZS50b0xvd2VyQ2FzZSgpID09PSAiaHRtbCIgJiYgJC51aS5pZSkpIHsKCQkJcG8g PSB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiBw by50b3AgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJU b3BXaWR0aCIpLDEwKSB8fCAwKSwKCQkJbGVmdDogcG8ubGVmdCArIChwYXJzZUlu dCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8 fCAwKQoJCX07CgoJfSwKCglfZ2V0UmVsYXRpdmVPZmZzZXQ6IGZ1bmN0aW9uKCkg ewoKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09PSAicmVsYXRpdmUiKSB7CgkJCXZh ciBwID0gdGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpOwoJCQlyZXR1cm4gewoJ CQkJdG9wOiBwLnRvcCAtIChwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoInRvcCIp LDEwKSB8fCAwKSArIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLAoJCQkJ bGVmdDogcC5sZWZ0IC0gKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygibGVmdCIp LDEwKSB8fCAwKSArIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKQoJCQl9 OwoJCX0gZWxzZSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0K Cgl9LAoKCV9jYWNoZU1hcmdpbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubWFyZ2lu cyA9IHsKCQkJbGVmdDogKHBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJt YXJnaW5MZWZ0IiksMTApIHx8IDApLAoJCQl0b3A6IChwYXJzZUludCh0aGlzLmN1 cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApIHx8IDApCgkJfTsKCX0sCgoJ X2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVs cGVyUHJvcG9ydGlvbnMgPSB7CgkJCXdpZHRoOiB0aGlzLmhlbHBlci5vdXRlcldp ZHRoKCksCgkJCWhlaWdodDogdGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKQoJCX07 Cgl9LAoKCV9zZXRDb250YWlubWVudDogZnVuY3Rpb24oKSB7CgoJCXZhciBjZSwg Y28sIG92ZXIsCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgkJaWYoby5jb250YWlubWVu dCA9PT0gInBhcmVudCIpIHsKCQkJby5jb250YWlubWVudCA9IHRoaXMuaGVscGVy WzBdLnBhcmVudE5vZGU7CgkJfQoJCWlmKG8uY29udGFpbm1lbnQgPT09ICJkb2N1 bWVudCIgfHwgby5jb250YWlubWVudCA9PT0gIndpbmRvdyIpIHsKCQkJdGhpcy5j b250YWlubWVudCA9IFsKCQkJCTAgLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0 IC0gdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsCgkJCQkwIC0gdGhpcy5vZmZzZXQu cmVsYXRpdmUudG9wIC0gdGhpcy5vZmZzZXQucGFyZW50LnRvcCwKCQkJCSQoby5j b250YWlubWVudCA9PT0gImRvY3VtZW50IiA/IGRvY3VtZW50IDogd2luZG93KS53 aWR0aCgpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIHRoaXMubWFy Z2lucy5sZWZ0LAoJCQkJKCQoby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IiA/ IGRvY3VtZW50IDogd2luZG93KS5oZWlnaHQoKSB8fCBkb2N1bWVudC5ib2R5LnBh cmVudE5vZGUuc2Nyb2xsSGVpZ2h0KSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMu aGVpZ2h0IC0gdGhpcy5tYXJnaW5zLnRvcAoJCQldOwoJCX0KCgkJaWYoISgvXihk b2N1bWVudHx3aW5kb3d8cGFyZW50KSQvKS50ZXN0KG8uY29udGFpbm1lbnQpKSB7 CgkJCWNlID0gJChvLmNvbnRhaW5tZW50KVswXTsKCQkJY28gPSAkKG8uY29udGFp bm1lbnQpLm9mZnNldCgpOwoJCQlvdmVyID0gKCQoY2UpLmNzcygib3ZlcmZsb3ci KSAhPT0gImhpZGRlbiIpOwoKCQkJdGhpcy5jb250YWlubWVudCA9IFsKCQkJCWNv LmxlZnQgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwx MCkgfHwgMCkgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nTGVmdCIpLDEw KSB8fCAwKSAtIHRoaXMubWFyZ2lucy5sZWZ0LAoJCQkJY28udG9wICsgKHBhcnNl SW50KCQoY2UpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCkgfHwgMCkgKyAocGFy c2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nVG9wIiksMTApIHx8IDApIC0gdGhpcy5t YXJnaW5zLnRvcCwKCQkJCWNvLmxlZnQrKG92ZXIgPyBNYXRoLm1heChjZS5zY3Jv bGxXaWR0aCxjZS5vZmZzZXRXaWR0aCkgOiBjZS5vZmZzZXRXaWR0aCkgLSAocGFy c2VJbnQoJChjZSkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwgMCkgLSAo cGFyc2VJbnQoJChjZSkuY3NzKCJwYWRkaW5nUmlnaHQiKSwxMCkgfHwgMCkgLSB0 aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5zLmxlZnQs CgkJCQljby50b3ArKG92ZXIgPyBNYXRoLm1heChjZS5zY3JvbGxIZWlnaHQsY2Uu b2Zmc2V0SGVpZ2h0KSA6IGNlLm9mZnNldEhlaWdodCkgLSAocGFyc2VJbnQoJChj ZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSAtIChwYXJzZUludCgk KGNlKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCkgfHwgMCkgLSB0aGlzLmhlbHBl clByb3BvcnRpb25zLmhlaWdodCAtIHRoaXMubWFyZ2lucy50b3AKCQkJXTsKCQl9 CgoJfSwKCglfY29udmVydFBvc2l0aW9uVG86IGZ1bmN0aW9uKGQsIHBvcykgewoK CQlpZighcG9zKSB7CgkJCXBvcyA9IHRoaXMucG9zaXRpb247CgkJfQoJCXZhciBt b2QgPSBkID09PSAiYWJzb2x1dGUiID8gMSA6IC0xLAoJCQlzY3JvbGwgPSB0aGlz LmNzc1Bvc2l0aW9uID09PSAiYWJzb2x1dGUiICYmICEodGhpcy5zY3JvbGxQYXJl bnRbMF0gIT09IGRvY3VtZW50ICYmICQuY29udGFpbnModGhpcy5zY3JvbGxQYXJl bnRbMF0sIHRoaXMub2Zmc2V0UGFyZW50WzBdKSkgPyB0aGlzLm9mZnNldFBhcmVu dCA6IHRoaXMuc2Nyb2xsUGFyZW50LAoJCQlzY3JvbGxJc1Jvb3ROb2RlID0gKC8o aHRtbHxib2R5KS9pKS50ZXN0KHNjcm9sbFswXS50YWdOYW1lKTsKCgkJcmV0dXJu IHsKCQkJdG9wOiAoCgkJCQlwb3MudG9wCSsJCQkJCQkJCQkJCQkJCQkJLy8gVGhl IGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2 ZS50b3AgKiBtb2QgKwkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3Np dGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9m ZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBhcmVudC50b3AgKiBtb2QgLQkJ CQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJv cmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9u ID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpIDog KCBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9sbC5zY3JvbGxUb3AoKSApICkg KiBtb2QpCgkJCSksCgkJCWxlZnQ6ICgKCQkJCXBvcy5sZWZ0ICsJCQkJCQkJCQkJ CQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9m ZnNldC5yZWxhdGl2ZS5sZWZ0ICogbW9kICsJCQkJCQkJCQkJLy8gT25seSBmb3Ig cmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20g ZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQu bGVmdCAqIG1vZAktCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZz ZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQkoICggdGhp cy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLnNjcm9sbFBhcmVudC5z Y3JvbGxMZWZ0KCkgOiBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9sbC5zY3Jv bGxMZWZ0KCkgKSAqIG1vZCkKCQkJKQoJCX07CgoJfSwKCglfZ2VuZXJhdGVQb3Np dGlvbjogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdmFyIHRvcCwgbGVmdCwKCQkJbyA9 IHRoaXMub3B0aW9ucywKCQkJcGFnZVggPSBldmVudC5wYWdlWCwKCQkJcGFnZVkg PSBldmVudC5wYWdlWSwKCQkJc2Nyb2xsID0gdGhpcy5jc3NQb3NpdGlvbiA9PT0g ImFic29sdXRlIiAmJiAhKHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVu dCAmJiAkLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLCB0aGlzLm9mZnNl dFBhcmVudFswXSkpID8gdGhpcy5vZmZzZXRQYXJlbnQgOiB0aGlzLnNjcm9sbFBh cmVudCwgc2Nyb2xsSXNSb290Tm9kZSA9ICgvKGh0bWx8Ym9keSkvaSkudGVzdChz Y3JvbGxbMF0udGFnTmFtZSk7CgoJCS8vIFRoaXMgaXMgYW5vdGhlciB2ZXJ5IHdl aXJkIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgaGFwcGVucyBmb3IgcmVsYXRpdmUg ZWxlbWVudHM6CgkJLy8gMS4gSWYgdGhlIGNzcyBwb3NpdGlvbiBpcyByZWxhdGl2 ZQoJCS8vIDIuIGFuZCB0aGUgc2Nyb2xsIHBhcmVudCBpcyB0aGUgZG9jdW1lbnQg b3Igc2ltaWxhciB0byB0aGUgb2Zmc2V0IHBhcmVudAoJCS8vIHdlIGhhdmUgdG8g cmVmcmVzaCB0aGUgcmVsYXRpdmUgb2Zmc2V0IGR1cmluZyB0aGUgc2Nyb2xsIHNv IHRoZXJlIGFyZSBubyBqdW1wcwoJCWlmKHRoaXMuY3NzUG9zaXRpb24gPT09ICJy ZWxhdGl2ZSIgJiYgISh0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQg JiYgdGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IHRoaXMub2Zmc2V0UGFyZW50WzBd KSkgewoJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZSA9IHRoaXMuX2dldFJlbGF0aXZl T2Zmc2V0KCk7CgkJfQoKCQkvKgoJCSAqIC0gUG9zaXRpb24gY29uc3RyYWluaW5n IC0KCQkgKiBDb25zdHJhaW4gdGhlIHBvc2l0aW9uIHRvIGEgbWl4IG9mIGdyaWQs IGNvbnRhaW5tZW50LgoJCSAqLwoKCQlpZih0aGlzLm9yaWdpbmFsUG9zaXRpb24p IHsgLy9JZiB3ZSBhcmUgbm90IGRyYWdnaW5nIHlldCwgd2Ugd29uJ3QgY2hlY2sg Zm9yIG9wdGlvbnMKCgkJCWlmKHRoaXMuY29udGFpbm1lbnQpIHsKCQkJCWlmKGV2 ZW50LnBhZ2VYIC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA8IHRoaXMuY29udGFp bm1lbnRbMF0pIHsKCQkJCQlwYWdlWCA9IHRoaXMuY29udGFpbm1lbnRbMF0gKyB0 aGlzLm9mZnNldC5jbGljay5sZWZ0OwoJCQkJfQoJCQkJaWYoZXZlbnQucGFnZVkg LSB0aGlzLm9mZnNldC5jbGljay50b3AgPCB0aGlzLmNvbnRhaW5tZW50WzFdKSB7 CgkJCQkJcGFnZVkgPSB0aGlzLmNvbnRhaW5tZW50WzFdICsgdGhpcy5vZmZzZXQu Y2xpY2sudG9wOwoJCQkJfQoJCQkJaWYoZXZlbnQucGFnZVggLSB0aGlzLm9mZnNl dC5jbGljay5sZWZ0ID4gdGhpcy5jb250YWlubWVudFsyXSkgewoJCQkJCXBhZ2VY ID0gdGhpcy5jb250YWlubWVudFsyXSArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ7 CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LmNsaWNrLnRv cCA+IHRoaXMuY29udGFpbm1lbnRbM10pIHsKCQkJCQlwYWdlWSA9IHRoaXMuY29u dGFpbm1lbnRbM10gKyB0aGlzLm9mZnNldC5jbGljay50b3A7CgkJCQl9CgkJCX0K CgkJCWlmKG8uZ3JpZCkgewoJCQkJdG9wID0gdGhpcy5vcmlnaW5hbFBhZ2VZICsg TWF0aC5yb3VuZCgocGFnZVkgLSB0aGlzLm9yaWdpbmFsUGFnZVkpIC8gby5ncmlk WzFdKSAqIG8uZ3JpZFsxXTsKCQkJCXBhZ2VZID0gdGhpcy5jb250YWlubWVudCA/ ICggKHRvcCAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA+PSB0aGlzLmNvbnRhaW5t ZW50WzFdICYmIHRvcCAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA8PSB0aGlzLmNv bnRhaW5tZW50WzNdKSA/IHRvcCA6ICgodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2su dG9wID49IHRoaXMuY29udGFpbm1lbnRbMV0pID8gdG9wIC0gby5ncmlkWzFdIDog dG9wICsgby5ncmlkWzFdKSkgOiB0b3A7CgoJCQkJbGVmdCA9IHRoaXMub3JpZ2lu YWxQYWdlWCArIE1hdGgucm91bmQoKHBhZ2VYIC0gdGhpcy5vcmlnaW5hbFBhZ2VY KSAvIG8uZ3JpZFswXSkgKiBvLmdyaWRbMF07CgkJCQlwYWdlWCA9IHRoaXMuY29u dGFpbm1lbnQgPyAoIChsZWZ0IC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+PSB0 aGlzLmNvbnRhaW5tZW50WzBdICYmIGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5s ZWZ0IDw9IHRoaXMuY29udGFpbm1lbnRbMl0pID8gbGVmdCA6ICgobGVmdCAtIHRo aXMub2Zmc2V0LmNsaWNrLmxlZnQgPj0gdGhpcy5jb250YWlubWVudFswXSkgPyBs ZWZ0IC0gby5ncmlkWzBdIDogbGVmdCArIG8uZ3JpZFswXSkpIDogbGVmdDsKCQkJ fQoKCQl9CgoJCXJldHVybiB7CgkJCXRvcDogKAoJCQkJcGFnZVkgLQkJCQkJCQkJ CQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMu b2Zmc2V0LmNsaWNrLnRvcCAtCQkJCQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAo cmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQpCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2 ZS50b3AJLQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25l ZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQg cGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQudG9wICsJCQkJCQkJCQkJCQkv LyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zm c2V0ICsgYm9yZGVyKQoJCQkJKCAoIHRoaXMuY3NzUG9zaXRpb24gPT09ICJmaXhl ZCIgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElz Um9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSkKCQkJKSwKCQkJ bGVmdDogKAoJCQkJcGFnZVggLQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1 dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgLQkJ CQkJCQkJCQkJCS8vIENsaWNrIG9mZnNldCAocmVsYXRpdmUgdG8gdGhlIGVsZW1l bnQpCgkJCQl0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0CS0JCQkJCQkJCQkJCS8v IE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9m ZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJdGhpcy5vZmZz ZXQucGFyZW50LmxlZnQgKwkJCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQn cyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQko ICggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLnNjcm9sbFBh cmVudC5zY3JvbGxMZWZ0KCkgOiBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHNjcm9s bC5zY3JvbGxMZWZ0KCkgKSkKCQkJKQoJCX07CgoJfSwKCglfcmVhcnJhbmdlOiBm dW5jdGlvbihldmVudCwgaSwgYSwgaGFyZFJlZnJlc2gpIHsKCgkJYSA/IGFbMF0u YXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSkgOiBpLml0ZW1bMF0ucGFy ZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5wbGFjZWhvbGRlclswXSwgKHRoaXMu ZGlyZWN0aW9uID09PSAiZG93biIgPyBpLml0ZW1bMF0gOiBpLml0ZW1bMF0ubmV4 dFNpYmxpbmcpKTsKCgkJLy9WYXJpb3VzIHRoaW5ncyBkb25lIGhlcmUgdG8gaW1w cm92ZSB0aGUgcGVyZm9ybWFuY2U6CgkJLy8gMS4gd2UgY3JlYXRlIGEgc2V0VGlt ZW91dCwgdGhhdCBjYWxscyByZWZyZXNoUG9zaXRpb25zCgkJLy8gMi4gb24gdGhl IGluc3RhbmNlLCB3ZSBoYXZlIGEgY291bnRlciB2YXJpYWJsZSwgdGhhdCBnZXQn cyBoaWdoZXIgYWZ0ZXIgZXZlcnkgYXBwZW5kCgkJLy8gMy4gb24gdGhlIGxvY2Fs IHNjb3BlLCB3ZSBjb3B5IHRoZSBjb3VudGVyIHZhcmlhYmxlLCBhbmQgY2hlY2sg aW4gdGhlIHRpbWVvdXQsIGlmIGl0J3Mgc3RpbGwgdGhlIHNhbWUKCQkvLyA0LiB0 aGlzIGxldHMgb25seSB0aGUgbGFzdCBhZGRpdGlvbiB0byB0aGUgdGltZW91dCBz dGFjayB0aHJvdWdoCgkJdGhpcy5jb3VudGVyID0gdGhpcy5jb3VudGVyID8gKyt0 aGlzLmNvdW50ZXIgOiAxOwoJCXZhciBjb3VudGVyID0gdGhpcy5jb3VudGVyOwoK CQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJaWYoY291bnRlciA9PT0gdGhp cy5jb3VudGVyKSB7CgkJCQl0aGlzLnJlZnJlc2hQb3NpdGlvbnMoIWhhcmRSZWZy ZXNoKTsgLy9QcmVjb21wdXRlIGFmdGVyIGVhY2ggRE9NIGluc2VydGlvbiwgTk9U IG9uIG1vdXNlbW92ZQoJCQl9CgkJfSk7CgoJfSwKCglfY2xlYXI6IGZ1bmN0aW9u KGV2ZW50LCBub1Byb3BhZ2F0aW9uKSB7CgoJCXRoaXMucmV2ZXJ0aW5nID0gZmFs c2U7CgkJLy8gV2UgZGVsYXkgYWxsIGV2ZW50cyB0aGF0IGhhdmUgdG8gYmUgdHJp Z2dlcmVkIHRvIGFmdGVyIHRoZSBwb2ludCB3aGVyZSB0aGUgcGxhY2Vob2xkZXIg aGFzIGJlZW4gcmVtb3ZlZCBhbmQKCQkvLyBldmVyeXRoaW5nIGVsc2Ugbm9ybWFs aXplZCBhZ2FpbgoJCXZhciBpLAoJCQlkZWxheWVkVHJpZ2dlcnMgPSBbXTsKCgkJ Ly8gV2UgZmlyc3QgaGF2ZSB0byB1cGRhdGUgdGhlIGRvbSBwb3NpdGlvbiBvZiB0 aGUgYWN0dWFsIGN1cnJlbnRJdGVtCgkJLy8gTm90ZTogZG9uJ3QgZG8gaXQgaWYg dGhlIGN1cnJlbnQgaXRlbSBpcyBhbHJlYWR5IHJlbW92ZWQgKGJ5IGEgdXNlciks IG9yIGl0IGdldHMgcmVhcHBlbmRlZCAoc2VlICM0MDg4KQoJCWlmKCF0aGlzLl9u b0ZpbmFsU29ydCAmJiB0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCkg ewoJCQl0aGlzLnBsYWNlaG9sZGVyLmJlZm9yZSh0aGlzLmN1cnJlbnRJdGVtKTsK CQl9CgkJdGhpcy5fbm9GaW5hbFNvcnQgPSBudWxsOwoKCQlpZih0aGlzLmhlbHBl clswXSA9PT0gdGhpcy5jdXJyZW50SXRlbVswXSkgewoJCQlmb3IoaSBpbiB0aGlz Ll9zdG9yZWRDU1MpIHsKCQkJCWlmKHRoaXMuX3N0b3JlZENTU1tpXSA9PT0gImF1 dG8iIHx8IHRoaXMuX3N0b3JlZENTU1tpXSA9PT0gInN0YXRpYyIpIHsKCQkJCQl0 aGlzLl9zdG9yZWRDU1NbaV0gPSAiIjsKCQkJCX0KCQkJfQoJCQl0aGlzLmN1cnJl bnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0 YWJsZS1oZWxwZXIiKTsKCQl9IGVsc2UgewoJCQl0aGlzLmN1cnJlbnRJdGVtLnNo b3coKTsKCQl9CgoJCWlmKHRoaXMuZnJvbU91dHNpZGUgJiYgIW5vUHJvcGFnYXRp b24pIHsKCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goZnVuY3Rpb24oZXZlbnQpIHsg dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2godGhp cy5mcm9tT3V0c2lkZSkpOyB9KTsKCQl9CgkJaWYoKHRoaXMuZnJvbU91dHNpZGUg fHwgdGhpcy5kb21Qb3NpdGlvbi5wcmV2ICE9PSB0aGlzLmN1cnJlbnRJdGVtLnBy ZXYoKS5ub3QoIi51aS1zb3J0YWJsZS1oZWxwZXIiKVswXSB8fCB0aGlzLmRvbVBv c2l0aW9uLnBhcmVudCAhPT0gdGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkg JiYgIW5vUHJvcGFnYXRpb24pIHsKCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goZnVu Y3Rpb24oZXZlbnQpIHsgdGhpcy5fdHJpZ2dlcigidXBkYXRlIiwgZXZlbnQsIHRo aXMuX3VpSGFzaCgpKTsgfSk7IC8vVHJpZ2dlciB1cGRhdGUgY2FsbGJhY2sgaWYg dGhlIERPTSBwb3NpdGlvbiBoYXMgY2hhbmdlZAoJCX0KCgkJLy8gQ2hlY2sgaWYg dGhlIGl0ZW1zIENvbnRhaW5lciBoYXMgQ2hhbmdlZCBhbmQgdHJpZ2dlciBhcHBy b3ByaWF0ZQoJCS8vIGV2ZW50cy4KCQlpZiAodGhpcyAhPT0gdGhpcy5jdXJyZW50 Q29udGFpbmVyKSB7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQlkZWxheWVk VHJpZ2dlcnMucHVzaChmdW5jdGlvbihldmVudCkgeyB0aGlzLl90cmlnZ2VyKCJy ZW1vdmUiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOyB9KTsKCQkJCWRlbGF5ZWRU cmlnZ2Vycy5wdXNoKChmdW5jdGlvbihjKSB7IHJldHVybiBmdW5jdGlvbihldmVu dCkgeyBjLl90cmlnZ2VyKCJyZWNlaXZlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0 aGlzKSk7IH07ICB9KS5jYWxsKHRoaXMsIHRoaXMuY3VycmVudENvbnRhaW5lcikp OwoJCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goKGZ1bmN0aW9uKGMpIHsgcmV0dXJu IGZ1bmN0aW9uKGV2ZW50KSB7IGMuX3RyaWdnZXIoInVwZGF0ZSIsIGV2ZW50LCB0 aGlzLl91aUhhc2godGhpcykpOyAgfTsgfSkuY2FsbCh0aGlzLCB0aGlzLmN1cnJl bnRDb250YWluZXIpKTsKCQkJfQoJCX0KCgoJCS8vUG9zdCBldmVudHMgdG8gY29u dGFpbmVycwoJCWZvciAoaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBp ID49IDA7IGktLSl7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQlkZWxheWVk VHJpZ2dlcnMucHVzaCgoZnVuY3Rpb24oYykgeyByZXR1cm4gZnVuY3Rpb24oZXZl bnQpIHsgYy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIGV2ZW50LCB0aGlzLl91aUhh c2godGhpcykpOyB9OyAgfSkuY2FsbCh0aGlzLCB0aGlzLmNvbnRhaW5lcnNbaV0p KTsKCQkJfQoJCQlpZih0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUu b3ZlcikgewoJCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goKGZ1bmN0aW9uKGMpIHsg cmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7IGMuX3RyaWdnZXIoIm91dCIsIGV2ZW50 LCB0aGlzLl91aUhhc2godGhpcykpOyB9OyAgfSkuY2FsbCh0aGlzLCB0aGlzLmNv bnRhaW5lcnNbaV0pKTsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJD YWNoZS5vdmVyID0gMDsKCQkJfQoJCX0KCgkJLy9EbyB3aGF0IHdhcyBvcmlnaW5h bGx5IGluIHBsdWdpbnMKCQlpZih0aGlzLl9zdG9yZWRDdXJzb3IpIHsKCQkJJCgi Ym9keSIpLmNzcygiY3Vyc29yIiwgdGhpcy5fc3RvcmVkQ3Vyc29yKTsKCQl9CgkJ aWYodGhpcy5fc3RvcmVkT3BhY2l0eSkgewoJCQl0aGlzLmhlbHBlci5jc3MoIm9w YWNpdHkiLCB0aGlzLl9zdG9yZWRPcGFjaXR5KTsKCQl9CgkJaWYodGhpcy5fc3Rv cmVkWkluZGV4KSB7CgkJCXRoaXMuaGVscGVyLmNzcygiekluZGV4IiwgdGhpcy5f c3RvcmVkWkluZGV4ID09PSAiYXV0byIgPyAiIiA6IHRoaXMuX3N0b3JlZFpJbmRl eCk7CgkJfQoKCQl0aGlzLmRyYWdnaW5nID0gZmFsc2U7CgkJaWYodGhpcy5jYW5j ZWxIZWxwZXJSZW1vdmFsKSB7CgkJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQl0 aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgp KTsKCQkJCWZvciAoaT0wOyBpIDwgZGVsYXllZFRyaWdnZXJzLmxlbmd0aDsgaSsr KSB7CgkJCQkJZGVsYXllZFRyaWdnZXJzW2ldLmNhbGwodGhpcywgZXZlbnQpOwoJ CQkJfSAvL1RyaWdnZXIgYWxsIGRlbGF5ZWQgZXZlbnRzCgkJCQl0aGlzLl90cmln Z2VyKCJzdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQkJfQoKCQkJdGhp cy5mcm9tT3V0c2lkZSA9IGZhbHNlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlp Zighbm9Qcm9wYWdhdGlvbikgewoJCQl0aGlzLl90cmlnZ2VyKCJiZWZvcmVTdG9w IiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQl9CgoJCS8vJCh0aGlzLnBsYWNl aG9sZGVyWzBdKS5yZW1vdmUoKTsgd291bGQgaGF2ZSBiZWVuIHRoZSBqUXVlcnkg d2F5IC0gdW5mb3J0dW5hdGVseSwgaXQgdW5iaW5kcyBBTEwgZXZlbnRzIGZyb20g dGhlIG9yaWdpbmFsIG5vZGUhCgkJdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnRO b2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOwoKCQlpZih0aGlz LmhlbHBlclswXSAhPT0gdGhpcy5jdXJyZW50SXRlbVswXSkgewoJCQl0aGlzLmhl bHBlci5yZW1vdmUoKTsKCQl9CgkJdGhpcy5oZWxwZXIgPSBudWxsOwoKCQlpZigh bm9Qcm9wYWdhdGlvbikgewoJCQlmb3IgKGk9MDsgaSA8IGRlbGF5ZWRUcmlnZ2Vy cy5sZW5ndGg7IGkrKykgewoJCQkJZGVsYXllZFRyaWdnZXJzW2ldLmNhbGwodGhp cywgZXZlbnQpOwoJCQl9IC8vVHJpZ2dlciBhbGwgZGVsYXllZCBldmVudHMKCQkJ dGhpcy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7CgkJ fQoKCQl0aGlzLmZyb21PdXRzaWRlID0gZmFsc2U7CgkJcmV0dXJuIHRydWU7CgoJ fSwKCglfdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCQuV2lkZ2V0LnByb3Rv dHlwZS5fdHJpZ2dlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpID09PSBmYWxzZSkg ewoJCQl0aGlzLmNhbmNlbCgpOwoJCX0KCX0sCgoJX3VpSGFzaDogZnVuY3Rpb24o X2luc3QpIHsKCQl2YXIgaW5zdCA9IF9pbnN0IHx8IHRoaXM7CgkJcmV0dXJuIHsK CQkJaGVscGVyOiBpbnN0LmhlbHBlciwKCQkJcGxhY2Vob2xkZXI6IGluc3QucGxh Y2Vob2xkZXIgfHwgJChbXSksCgkJCXBvc2l0aW9uOiBpbnN0LnBvc2l0aW9uLAoJ CQlvcmlnaW5hbFBvc2l0aW9uOiBpbnN0Lm9yaWdpbmFsUG9zaXRpb24sCgkJCW9m ZnNldDogaW5zdC5wb3NpdGlvbkFicywKCQkJaXRlbTogaW5zdC5jdXJyZW50SXRl bSwKCQkJc2VuZGVyOiBfaW5zdCA/IF9pbnN0LmVsZW1lbnQgOiBudWxsCgkJfTsK CX0KCn0pOwoKfSkoalF1ZXJ5KTsKCjsoalF1ZXJ5LmVmZmVjdHMgfHwgKGZ1bmN0 aW9uKCQsIHVuZGVmaW5lZCkgewoKdmFyIGRhdGFTcGFjZSA9ICJ1aS1lZmZlY3Rz LSI7CgokLmVmZmVjdHMgPSB7CgllZmZlY3Q6IHt9Cn07CgovKiEKICogalF1ZXJ5 IENvbG9yIEFuaW1hdGlvbnMgdjIuMS4yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9q cXVlcnkvanF1ZXJ5LWNvbG9yCiAqCiAqIENvcHlyaWdodCAyMDEzIGpRdWVyeSBG b3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5k ZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNl CiAqCiAqIERhdGU6IFdlZCBKYW4gMTYgMDg6NDc6MDkgMjAxMyAtMDYwMAogKi8K KGZ1bmN0aW9uKCBqUXVlcnksIHVuZGVmaW5lZCApIHsKCgl2YXIgc3RlcEhvb2tz ID0gImJhY2tncm91bmRDb2xvciBib3JkZXJCb3R0b21Db2xvciBib3JkZXJMZWZ0 Q29sb3IgYm9yZGVyUmlnaHRDb2xvciBib3JkZXJUb3BDb2xvciBjb2xvciBjb2x1 bW5SdWxlQ29sb3Igb3V0bGluZUNvbG9yIHRleHREZWNvcmF0aW9uQ29sb3IgdGV4 dEVtcGhhc2lzQ29sb3IiLAoKCS8vIHBsdXNlcXVhbHMgdGVzdCBmb3IgKz0gMTAw IC09IDEwMAoJcnBsdXNlcXVhbHMgPSAvXihbXC0rXSk9XHMqKFxkK1wuP1xkKikv LAoJLy8gYSBzZXQgb2YgUkUncyB0aGF0IGNhbiBtYXRjaCBzdHJpbmdzIGFuZCBn ZW5lcmF0ZSBjb2xvciB0dXBsZXMuCglzdHJpbmdQYXJzZXJzID0gW3sKCQkJcmU6 IC9yZ2JhP1woXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKixccyooXGR7 MSwzfSlccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sCgkJCXBhcnNl OiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJZXhl Y1Jlc3VsdFsgMSBdLAoJCQkJCWV4ZWNSZXN1bHRbIDIgXSwKCQkJCQlleGVjUmVz dWx0WyAzIF0sCgkJCQkJZXhlY1Jlc3VsdFsgNCBdCgkJCQldOwoJCQl9CgkJfSwg ewoJCQlyZTogL3JnYmE/XChccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQr KD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/Oixccyoo XGQ/KD86XC5cZCspPylccyopP1wpLywKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVj UmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlleGVjUmVzdWx0WyAxIF0gKiAy LjU1LAoJCQkJCWV4ZWNSZXN1bHRbIDIgXSAqIDIuNTUsCgkJCQkJZXhlY1Jlc3Vs dFsgMyBdICogMi41NSwKCQkJCQlleGVjUmVzdWx0WyA0IF0KCQkJCV07CgkJCX0K CQl9LCB7CgkJCS8vIHRoaXMgcmVnZXggaWdub3JlcyBBLUYgYmVjYXVzZSBpdCdz IGNvbXBhcmVkIGFnYWluc3QgYW4gYWxyZWFkeSBsb3dlcmNhc2VkIHN0cmluZwoJ CQlyZTogLyMoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkv LAoJCQlwYXJzZTogZnVuY3Rpb24oIGV4ZWNSZXN1bHQgKSB7CgkJCQlyZXR1cm4g WwoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAxIF0sIDE2ICksCgkJCQkJcGFy c2VJbnQoIGV4ZWNSZXN1bHRbIDIgXSwgMTYgKSwKCQkJCQlwYXJzZUludCggZXhl Y1Jlc3VsdFsgMyBdLCAxNiApCgkJCQldOwoJCQl9CgkJfSwgewoJCQkvLyB0aGlz IHJlZ2V4IGlnbm9yZXMgQS1GIGJlY2F1c2UgaXQncyBjb21wYXJlZCBhZ2FpbnN0 IGFuIGFscmVhZHkgbG93ZXJjYXNlZCBzdHJpbmcKCQkJcmU6IC8jKFthLWYwLTld KShbYS1mMC05XSkoW2EtZjAtOV0pLywKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVj UmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlwYXJzZUludCggZXhlY1Jlc3Vs dFsgMSBdICsgZXhlY1Jlc3VsdFsgMSBdLCAxNiApLAoJCQkJCXBhcnNlSW50KCBl eGVjUmVzdWx0WyAyIF0gKyBleGVjUmVzdWx0WyAyIF0sIDE2ICksCgkJCQkJcGFy c2VJbnQoIGV4ZWNSZXN1bHRbIDMgXSArIGV4ZWNSZXN1bHRbIDMgXSwgMTYgKQoJ CQkJXTsKCQkJfQoJCX0sIHsKCQkJcmU6IC9oc2xhP1woXHMqKFxkKyg/OlwuXGQr KT8pXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqLFxzKihcZCsoPzpcLlxkKyk/ KVwlXHMqKD86LFxzKihcZD8oPzpcLlxkKyk/KVxzKik/XCkvLAoJCQlzcGFjZTog ImhzbGEiLAoJCQlwYXJzZTogZnVuY3Rpb24oIGV4ZWNSZXN1bHQgKSB7CgkJCQly ZXR1cm4gWwoJCQkJCWV4ZWNSZXN1bHRbIDEgXSwKCQkJCQlleGVjUmVzdWx0WyAy IF0gLyAxMDAsCgkJCQkJZXhlY1Jlc3VsdFsgMyBdIC8gMTAwLAoJCQkJCWV4ZWNS ZXN1bHRbIDQgXQoJCQkJXTsKCQkJfQoJCX1dLAoKCS8vIGpRdWVyeS5Db2xvcigg KQoJY29sb3IgPSBqUXVlcnkuQ29sb3IgPSBmdW5jdGlvbiggY29sb3IsIGdyZWVu LCBibHVlLCBhbHBoYSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5Db2xvci5mbi5w YXJzZSggY29sb3IsIGdyZWVuLCBibHVlLCBhbHBoYSApOwoJfSwKCXNwYWNlcyA9 IHsKCQlyZ2JhOiB7CgkJCXByb3BzOiB7CgkJCQlyZWQ6IHsKCQkJCQlpZHg6IDAs CgkJCQkJdHlwZTogImJ5dGUiCgkJCQl9LAoJCQkJZ3JlZW46IHsKCQkJCQlpZHg6 IDEsCgkJCQkJdHlwZTogImJ5dGUiCgkJCQl9LAoJCQkJYmx1ZTogewoJCQkJCWlk eDogMiwKCQkJCQl0eXBlOiAiYnl0ZSIKCQkJCX0KCQkJfQoJCX0sCgoJCWhzbGE6 IHsKCQkJcHJvcHM6IHsKCQkJCWh1ZTogewoJCQkJCWlkeDogMCwKCQkJCQl0eXBl OiAiZGVncmVlcyIKCQkJCX0sCgkJCQlzYXR1cmF0aW9uOiB7CgkJCQkJaWR4OiAx LAoJCQkJCXR5cGU6ICJwZXJjZW50IgoJCQkJfSwKCQkJCWxpZ2h0bmVzczogewoJ CQkJCWlkeDogMiwKCQkJCQl0eXBlOiAicGVyY2VudCIKCQkJCX0KCQkJfQoJCX0K CX0sCglwcm9wVHlwZXMgPSB7CgkJImJ5dGUiOiB7CgkJCWZsb29yOiB0cnVlLAoJ CQltYXg6IDI1NQoJCX0sCgkJInBlcmNlbnQiOiB7CgkJCW1heDogMQoJCX0sCgkJ ImRlZ3JlZXMiOiB7CgkJCW1vZDogMzYwLAoJCQlmbG9vcjogdHJ1ZQoJCX0KCX0s CglzdXBwb3J0ID0gY29sb3Iuc3VwcG9ydCA9IHt9LAoKCS8vIGVsZW1lbnQgZm9y IHN1cHBvcnQgdGVzdHMKCXN1cHBvcnRFbGVtID0galF1ZXJ5KCAiPHA+IiApWyAw IF0sCgoJLy8gY29sb3JzID0galF1ZXJ5LkNvbG9yLm5hbWVzCgljb2xvcnMsCgoJ Ly8gbG9jYWwgYWxpYXNlcyBvZiBmdW5jdGlvbnMgY2FsbGVkIG9mdGVuCgllYWNo ID0galF1ZXJ5LmVhY2g7CgovLyBkZXRlcm1pbmUgcmdiYSBzdXBwb3J0IGltbWVk aWF0ZWx5CnN1cHBvcnRFbGVtLnN0eWxlLmNzc1RleHQgPSAiYmFja2dyb3VuZC1j b2xvcjpyZ2JhKDEsMSwxLC41KSI7CnN1cHBvcnQucmdiYSA9IHN1cHBvcnRFbGVt LnN0eWxlLmJhY2tncm91bmRDb2xvci5pbmRleE9mKCAicmdiYSIgKSA+IC0xOwoK Ly8gZGVmaW5lIGNhY2hlIG5hbWUgYW5kIGFscGhhIHByb3BlcnRpZXMKLy8gZm9y IHJnYmEgYW5kIGhzbGEgc3BhY2VzCmVhY2goIHNwYWNlcywgZnVuY3Rpb24oIHNw YWNlTmFtZSwgc3BhY2UgKSB7CglzcGFjZS5jYWNoZSA9ICJfIiArIHNwYWNlTmFt ZTsKCXNwYWNlLnByb3BzLmFscGhhID0gewoJCWlkeDogMywKCQl0eXBlOiAicGVy Y2VudCIsCgkJZGVmOiAxCgl9Owp9KTsKCmZ1bmN0aW9uIGNsYW1wKCB2YWx1ZSwg cHJvcCwgYWxsb3dFbXB0eSApIHsKCXZhciB0eXBlID0gcHJvcFR5cGVzWyBwcm9w LnR5cGUgXSB8fCB7fTsKCglpZiAoIHZhbHVlID09IG51bGwgKSB7CgkJcmV0dXJu IChhbGxvd0VtcHR5IHx8ICFwcm9wLmRlZikgPyBudWxsIDogcHJvcC5kZWY7Cgl9 CgoJLy8gfn4gaXMgYW4gc2hvcnQgd2F5IG9mIGRvaW5nIGZsb29yIGZvciBwb3Np dGl2ZSBudW1iZXJzCgl2YWx1ZSA9IHR5cGUuZmxvb3IgPyB+fnZhbHVlIDogcGFy c2VGbG9hdCggdmFsdWUgKTsKCgkvLyBJRSB3aWxsIHBhc3MgaW4gZW1wdHkgc3Ry aW5ncyBhcyB2YWx1ZSBmb3IgYWxwaGEsCgkvLyB3aGljaCB3aWxsIGhpdCB0aGlz IGNhc2UKCWlmICggaXNOYU4oIHZhbHVlICkgKSB7CgkJcmV0dXJuIHByb3AuZGVm OwoJfQoKCWlmICggdHlwZS5tb2QgKSB7CgkJLy8gd2UgYWRkIG1vZCBiZWZvcmUg bW9kZGluZyB0byBtYWtlIHN1cmUgdGhhdCBuZWdhdGl2ZXMgdmFsdWVzCgkJLy8g Z2V0IGNvbnZlcnRlZCBwcm9wZXJseTogLTEwIC0+IDM1MAoJCXJldHVybiAodmFs dWUgKyB0eXBlLm1vZCkgJSB0eXBlLm1vZDsKCX0KCgkvLyBmb3Igbm93IGFsbCBw cm9wZXJ0eSB0eXBlcyB3aXRob3V0IG1vZCBoYXZlIG1pbiBhbmQgbWF4CglyZXR1 cm4gMCA+IHZhbHVlID8gMCA6IHR5cGUubWF4IDwgdmFsdWUgPyB0eXBlLm1heCA6 IHZhbHVlOwp9CgpmdW5jdGlvbiBzdHJpbmdQYXJzZSggc3RyaW5nICkgewoJdmFy IGluc3QgPSBjb2xvcigpLAoJCXJnYmEgPSBpbnN0Ll9yZ2JhID0gW107CgoJc3Ry aW5nID0gc3RyaW5nLnRvTG93ZXJDYXNlKCk7CgoJZWFjaCggc3RyaW5nUGFyc2Vy cywgZnVuY3Rpb24oIGksIHBhcnNlciApIHsKCQl2YXIgcGFyc2VkLAoJCQltYXRj aCA9IHBhcnNlci5yZS5leGVjKCBzdHJpbmcgKSwKCQkJdmFsdWVzID0gbWF0Y2gg JiYgcGFyc2VyLnBhcnNlKCBtYXRjaCApLAoJCQlzcGFjZU5hbWUgPSBwYXJzZXIu c3BhY2UgfHwgInJnYmEiOwoKCQlpZiAoIHZhbHVlcyApIHsKCQkJcGFyc2VkID0g aW5zdFsgc3BhY2VOYW1lIF0oIHZhbHVlcyApOwoKCQkJLy8gaWYgdGhpcyB3YXMg YW4gcmdiYSBwYXJzZSB0aGUgYXNzaWdubWVudCBtaWdodCBoYXBwZW4gdHdpY2UK CQkJLy8gb2ggd2VsbC4uLi4KCQkJaW5zdFsgc3BhY2VzWyBzcGFjZU5hbWUgXS5j YWNoZSBdID0gcGFyc2VkWyBzcGFjZXNbIHNwYWNlTmFtZSBdLmNhY2hlIF07CgkJ CXJnYmEgPSBpbnN0Ll9yZ2JhID0gcGFyc2VkLl9yZ2JhOwoKCQkJLy8gZXhpdCBl YWNoKCBzdHJpbmdQYXJzZXJzICkgaGVyZSBiZWNhdXNlIHdlIG1hdGNoZWQKCQkJ cmV0dXJuIGZhbHNlOwoJCX0KCX0pOwoKCS8vIEZvdW5kIGEgc3RyaW5nUGFyc2Vy IHRoYXQgaGFuZGxlZCBpdAoJaWYgKCByZ2JhLmxlbmd0aCApIHsKCgkJLy8gaWYg dGhpcyBjYW1lIGZyb20gYSBwYXJzZWQgc3RyaW5nLCBmb3JjZSAidHJhbnNwYXJl bnQiIHdoZW4gYWxwaGEgaXMgMAoJCS8vIGNocm9tZSwgKGFuZCBtYXliZSBvdGhl cnMpIHJldHVybiAidHJhbnNwYXJlbnQiIGFzIHJnYmEoMCwwLDAsMCkKCQlpZiAo IHJnYmEuam9pbigpID09PSAiMCwwLDAsMCIgKSB7CgkJCWpRdWVyeS5leHRlbmQo IHJnYmEsIGNvbG9ycy50cmFuc3BhcmVudCApOwoJCX0KCQlyZXR1cm4gaW5zdDsK CX0KCgkvLyBuYW1lZCBjb2xvcnMKCXJldHVybiBjb2xvcnNbIHN0cmluZyBdOwp9 Cgpjb2xvci5mbiA9IGpRdWVyeS5leHRlbmQoIGNvbG9yLnByb3RvdHlwZSwgewoJ cGFyc2U6IGZ1bmN0aW9uKCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSApIHsKCQlp ZiAoIHJlZCA9PT0gdW5kZWZpbmVkICkgewoJCQl0aGlzLl9yZ2JhID0gWyBudWxs LCBudWxsLCBudWxsLCBudWxsIF07CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAo IHJlZC5qcXVlcnkgfHwgcmVkLm5vZGVUeXBlICkgewoJCQlyZWQgPSBqUXVlcnko IHJlZCApLmNzcyggZ3JlZW4gKTsKCQkJZ3JlZW4gPSB1bmRlZmluZWQ7CgkJfQoK CQl2YXIgaW5zdCA9IHRoaXMsCgkJCXR5cGUgPSBqUXVlcnkudHlwZSggcmVkICks CgkJCXJnYmEgPSB0aGlzLl9yZ2JhID0gW107CgoJCS8vIG1vcmUgdGhhbiAxIGFy Z3VtZW50IHNwZWNpZmllZCAtIGFzc3VtZSAoIHJlZCwgZ3JlZW4sIGJsdWUsIGFs cGhhICkKCQlpZiAoIGdyZWVuICE9PSB1bmRlZmluZWQgKSB7CgkJCXJlZCA9IFsg cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEgXTsKCQkJdHlwZSA9ICJhcnJheSI7CgkJ fQoKCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5w YXJzZSggc3RyaW5nUGFyc2UoIHJlZCApIHx8IGNvbG9ycy5fZGVmYXVsdCApOwoJ CX0KCgkJaWYgKCB0eXBlID09PSAiYXJyYXkiICkgewoJCQllYWNoKCBzcGFjZXMu cmdiYS5wcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCQkJCXJnYmFbIHBy b3AuaWR4IF0gPSBjbGFtcCggcmVkWyBwcm9wLmlkeCBdLCBwcm9wICk7CgkJCX0p OwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggdHlwZSA9PT0gIm9iamVjdCIg KSB7CgkJCWlmICggcmVkIGluc3RhbmNlb2YgY29sb3IgKSB7CgkJCQllYWNoKCBz cGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJCQkJCWlmICgg cmVkWyBzcGFjZS5jYWNoZSBdICkgewoJCQkJCQlpbnN0WyBzcGFjZS5jYWNoZSBd ID0gcmVkWyBzcGFjZS5jYWNoZSBdLnNsaWNlKCk7CgkJCQkJfQoJCQkJfSk7CgkJ CX0gZWxzZSB7CgkJCQllYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUs IHNwYWNlICkgewoJCQkJCXZhciBjYWNoZSA9IHNwYWNlLmNhY2hlOwoJCQkJCWVh Y2goIHNwYWNlLnByb3BzLCBmdW5jdGlvbigga2V5LCBwcm9wICkgewoKCQkJCQkJ Ly8gaWYgdGhlIGNhY2hlIGRvZXNuJ3QgZXhpc3QsIGFuZCB3ZSBrbm93IGhvdyB0 byBjb252ZXJ0CgkJCQkJCWlmICggIWluc3RbIGNhY2hlIF0gJiYgc3BhY2UudG8g KSB7CgoJCQkJCQkJLy8gaWYgdGhlIHZhbHVlIHdhcyBudWxsLCB3ZSBkb24ndCBu ZWVkIHRvIGNvcHkgaXQKCQkJCQkJCS8vIGlmIHRoZSBrZXkgd2FzIGFscGhhLCB3 ZSBkb24ndCBuZWVkIHRvIGNvcHkgaXQgZWl0aGVyCgkJCQkJCQlpZiAoIGtleSA9 PT0gImFscGhhIiB8fCByZWRbIGtleSBdID09IG51bGwgKSB7CgkJCQkJCQkJcmV0 dXJuOwoJCQkJCQkJfQoJCQkJCQkJaW5zdFsgY2FjaGUgXSA9IHNwYWNlLnRvKCBp bnN0Ll9yZ2JhICk7CgkJCQkJCX0KCgkJCQkJCS8vIHRoaXMgaXMgdGhlIG9ubHkg Y2FzZSB3aGVyZSB3ZSBhbGxvdyBudWxscyBmb3IgQUxMIHByb3BlcnRpZXMuCgkJ CQkJCS8vIGNhbGwgY2xhbXAgd2l0aCBhbHdheXNBbGxvd0VtcHR5CgkJCQkJCWlu c3RbIGNhY2hlIF1bIHByb3AuaWR4IF0gPSBjbGFtcCggcmVkWyBrZXkgXSwgcHJv cCwgdHJ1ZSApOwoJCQkJCX0pOwoKCQkJCQkvLyBldmVyeXRoaW5nIGRlZmluZWQg YnV0IGFscGhhPwoJCQkJCWlmICggaW5zdFsgY2FjaGUgXSAmJiBqUXVlcnkuaW5B cnJheSggbnVsbCwgaW5zdFsgY2FjaGUgXS5zbGljZSggMCwgMyApICkgPCAwICkg ewoJCQkJCQkvLyB1c2UgdGhlIGRlZmF1bHQgb2YgMQoJCQkJCQlpbnN0WyBjYWNo ZSBdWyAzIF0gPSAxOwoJCQkJCQlpZiAoIHNwYWNlLmZyb20gKSB7CgkJCQkJCQlp bnN0Ll9yZ2JhID0gc3BhY2UuZnJvbSggaW5zdFsgY2FjaGUgXSApOwoJCQkJCQl9 CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoJfSwKCWlz OiBmdW5jdGlvbiggY29tcGFyZSApIHsKCQl2YXIgaXMgPSBjb2xvciggY29tcGFy ZSApLAoJCQlzYW1lID0gdHJ1ZSwKCQkJaW5zdCA9IHRoaXM7CgoJCWVhY2goIHNw YWNlcywgZnVuY3Rpb24oIF8sIHNwYWNlICkgewoJCQl2YXIgbG9jYWxDYWNoZSwK CQkJCWlzQ2FjaGUgPSBpc1sgc3BhY2UuY2FjaGUgXTsKCQkJaWYgKGlzQ2FjaGUp IHsKCQkJCWxvY2FsQ2FjaGUgPSBpbnN0WyBzcGFjZS5jYWNoZSBdIHx8IHNwYWNl LnRvICYmIHNwYWNlLnRvKCBpbnN0Ll9yZ2JhICkgfHwgW107CgkJCQllYWNoKCBz cGFjZS5wcm9wcywgZnVuY3Rpb24oIF8sIHByb3AgKSB7CgkJCQkJaWYgKCBpc0Nh Y2hlWyBwcm9wLmlkeCBdICE9IG51bGwgKSB7CgkJCQkJCXNhbWUgPSAoIGlzQ2Fj aGVbIHByb3AuaWR4IF0gPT09IGxvY2FsQ2FjaGVbIHByb3AuaWR4IF0gKTsKCQkJ CQkJcmV0dXJuIHNhbWU7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHNh bWU7CgkJfSk7CgkJcmV0dXJuIHNhbWU7Cgl9LAoJX3NwYWNlOiBmdW5jdGlvbigp IHsKCQl2YXIgdXNlZCA9IFtdLAoJCQlpbnN0ID0gdGhpczsKCQllYWNoKCBzcGFj ZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJCQlpZiAoIGluc3Rb IHNwYWNlLmNhY2hlIF0gKSB7CgkJCQl1c2VkLnB1c2goIHNwYWNlTmFtZSApOwoJ CQl9CgkJfSk7CgkJcmV0dXJuIHVzZWQucG9wKCk7Cgl9LAoJdHJhbnNpdGlvbjog ZnVuY3Rpb24oIG90aGVyLCBkaXN0YW5jZSApIHsKCQl2YXIgZW5kID0gY29sb3Io IG90aGVyICksCgkJCXNwYWNlTmFtZSA9IGVuZC5fc3BhY2UoKSwKCQkJc3BhY2Ug PSBzcGFjZXNbIHNwYWNlTmFtZSBdLAoJCQlzdGFydENvbG9yID0gdGhpcy5hbHBo YSgpID09PSAwID8gY29sb3IoICJ0cmFuc3BhcmVudCIgKSA6IHRoaXMsCgkJCXN0 YXJ0ID0gc3RhcnRDb2xvclsgc3BhY2UuY2FjaGUgXSB8fCBzcGFjZS50byggc3Rh cnRDb2xvci5fcmdiYSApLAoJCQlyZXN1bHQgPSBzdGFydC5zbGljZSgpOwoKCQll bmQgPSBlbmRbIHNwYWNlLmNhY2hlIF07CgkJZWFjaCggc3BhY2UucHJvcHMsIGZ1 bmN0aW9uKCBrZXksIHByb3AgKSB7CgkJCXZhciBpbmRleCA9IHByb3AuaWR4LAoJ CQkJc3RhcnRWYWx1ZSA9IHN0YXJ0WyBpbmRleCBdLAoJCQkJZW5kVmFsdWUgPSBl bmRbIGluZGV4IF0sCgkJCQl0eXBlID0gcHJvcFR5cGVzWyBwcm9wLnR5cGUgXSB8 fCB7fTsKCgkJCS8vIGlmIG51bGwsIGRvbid0IG92ZXJyaWRlIHN0YXJ0IHZhbHVl CgkJCWlmICggZW5kVmFsdWUgPT09IG51bGwgKSB7CgkJCQlyZXR1cm47CgkJCX0K CQkJLy8gaWYgbnVsbCAtIHVzZSBlbmQKCQkJaWYgKCBzdGFydFZhbHVlID09PSBu dWxsICkgewoJCQkJcmVzdWx0WyBpbmRleCBdID0gZW5kVmFsdWU7CgkJCX0gZWxz ZSB7CgkJCQlpZiAoIHR5cGUubW9kICkgewoJCQkJCWlmICggZW5kVmFsdWUgLSBz dGFydFZhbHVlID4gdHlwZS5tb2QgLyAyICkgewoJCQkJCQlzdGFydFZhbHVlICs9 IHR5cGUubW9kOwoJCQkJCX0gZWxzZSBpZiAoIHN0YXJ0VmFsdWUgLSBlbmRWYWx1 ZSA+IHR5cGUubW9kIC8gMiApIHsKCQkJCQkJc3RhcnRWYWx1ZSAtPSB0eXBlLm1v ZDsKCQkJCQl9CgkJCQl9CgkJCQlyZXN1bHRbIGluZGV4IF0gPSBjbGFtcCggKCBl bmRWYWx1ZSAtIHN0YXJ0VmFsdWUgKSAqIGRpc3RhbmNlICsgc3RhcnRWYWx1ZSwg cHJvcCApOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHRoaXNbIHNwYWNlTmFtZSBdKCBy ZXN1bHQgKTsKCX0sCglibGVuZDogZnVuY3Rpb24oIG9wYXF1ZSApIHsKCQkvLyBp ZiB3ZSBhcmUgYWxyZWFkeSBvcGFxdWUgLSByZXR1cm4gb3Vyc2VsZgoJCWlmICgg dGhpcy5fcmdiYVsgMyBdID09PSAxICkgewoJCQlyZXR1cm4gdGhpczsKCQl9CgoJ CXZhciByZ2IgPSB0aGlzLl9yZ2JhLnNsaWNlKCksCgkJCWEgPSByZ2IucG9wKCks CgkJCWJsZW5kID0gY29sb3IoIG9wYXF1ZSApLl9yZ2JhOwoKCQlyZXR1cm4gY29s b3IoIGpRdWVyeS5tYXAoIHJnYiwgZnVuY3Rpb24oIHYsIGkgKSB7CgkJCXJldHVy biAoIDEgLSBhICkgKiBibGVuZFsgaSBdICsgYSAqIHY7CgkJfSkpOwoJfSwKCXRv UmdiYVN0cmluZzogZnVuY3Rpb24oKSB7CgkJdmFyIHByZWZpeCA9ICJyZ2JhKCIs CgkJCXJnYmEgPSBqUXVlcnkubWFwKCB0aGlzLl9yZ2JhLCBmdW5jdGlvbiggdiwg aSApIHsKCQkJCXJldHVybiB2ID09IG51bGwgPyAoIGkgPiAyID8gMSA6IDAgKSA6 IHY7CgkJCX0pOwoKCQlpZiAoIHJnYmFbIDMgXSA9PT0gMSApIHsKCQkJcmdiYS5w b3AoKTsKCQkJcHJlZml4ID0gInJnYigiOwoJCX0KCgkJcmV0dXJuIHByZWZpeCAr IHJnYmEuam9pbigpICsgIikiOwoJfSwKCXRvSHNsYVN0cmluZzogZnVuY3Rpb24o KSB7CgkJdmFyIHByZWZpeCA9ICJoc2xhKCIsCgkJCWhzbGEgPSBqUXVlcnkubWFw KCB0aGlzLmhzbGEoKSwgZnVuY3Rpb24oIHYsIGkgKSB7CgkJCQlpZiAoIHYgPT0g bnVsbCApIHsKCQkJCQl2ID0gaSA+IDIgPyAxIDogMDsKCQkJCX0KCgkJCQkvLyBj YXRjaCAxIGFuZCAyCgkJCQlpZiAoIGkgJiYgaSA8IDMgKSB7CgkJCQkJdiA9IE1h dGgucm91bmQoIHYgKiAxMDAgKSArICIlIjsKCQkJCX0KCQkJCXJldHVybiB2OwoJ CQl9KTsKCgkJaWYgKCBoc2xhWyAzIF0gPT09IDEgKSB7CgkJCWhzbGEucG9wKCk7 CgkJCXByZWZpeCA9ICJoc2woIjsKCQl9CgkJcmV0dXJuIHByZWZpeCArIGhzbGEu am9pbigpICsgIikiOwoJfSwKCXRvSGV4U3RyaW5nOiBmdW5jdGlvbiggaW5jbHVk ZUFscGhhICkgewoJCXZhciByZ2JhID0gdGhpcy5fcmdiYS5zbGljZSgpLAoJCQlh bHBoYSA9IHJnYmEucG9wKCk7CgoJCWlmICggaW5jbHVkZUFscGhhICkgewoJCQly Z2JhLnB1c2goIH5+KCBhbHBoYSAqIDI1NSApICk7CgkJfQoKCQlyZXR1cm4gIiMi ICsgalF1ZXJ5Lm1hcCggcmdiYSwgZnVuY3Rpb24oIHYgKSB7CgoJCQkvLyBkZWZh dWx0IHRvIDAgd2hlbiBudWxscyBleGlzdAoJCQl2ID0gKCB2IHx8IDAgKS50b1N0 cmluZyggMTYgKTsKCQkJcmV0dXJuIHYubGVuZ3RoID09PSAxID8gIjAiICsgdiA6 IHY7CgkJfSkuam9pbigiIik7Cgl9LAoJdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewoJ CXJldHVybiB0aGlzLl9yZ2JhWyAzIF0gPT09IDAgPyAidHJhbnNwYXJlbnQiIDog dGhpcy50b1JnYmFTdHJpbmcoKTsKCX0KfSk7CmNvbG9yLmZuLnBhcnNlLnByb3Rv dHlwZSA9IGNvbG9yLmZuOwoKLy8gaHNsYSBjb252ZXJzaW9ucyBhZGFwdGVkIGZy b206Ci8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvbWFhc2hhYWNrL3NvdXJj ZS9icm93c2UvcGFja2FnZXMvZ3JhcGhpY3MvdHJ1bmsvc3JjL2dyYXBoaWNzL2Nv bG9ycy9IVUUyUkdCLmFzP3I9NTAyMQoKZnVuY3Rpb24gaHVlMnJnYiggcCwgcSwg aCApIHsKCWggPSAoIGggKyAxICkgJSAxOwoJaWYgKCBoICogNiA8IDEgKSB7CgkJ cmV0dXJuIHAgKyAocSAtIHApICogaCAqIDY7Cgl9CglpZiAoIGggKiAyIDwgMSkg ewoJCXJldHVybiBxOwoJfQoJaWYgKCBoICogMyA8IDIgKSB7CgkJcmV0dXJuIHAg KyAocSAtIHApICogKCgyLzMpIC0gaCkgKiA2OwoJfQoJcmV0dXJuIHA7Cn0KCnNw YWNlcy5oc2xhLnRvID0gZnVuY3Rpb24gKCByZ2JhICkgewoJaWYgKCByZ2JhWyAw IF0gPT0gbnVsbCB8fCByZ2JhWyAxIF0gPT0gbnVsbCB8fCByZ2JhWyAyIF0gPT0g bnVsbCApIHsKCQlyZXR1cm4gWyBudWxsLCBudWxsLCBudWxsLCByZ2JhWyAzIF0g XTsKCX0KCXZhciByID0gcmdiYVsgMCBdIC8gMjU1LAoJCWcgPSByZ2JhWyAxIF0g LyAyNTUsCgkJYiA9IHJnYmFbIDIgXSAvIDI1NSwKCQlhID0gcmdiYVsgMyBdLAoJ CW1heCA9IE1hdGgubWF4KCByLCBnLCBiICksCgkJbWluID0gTWF0aC5taW4oIHIs IGcsIGIgKSwKCQlkaWZmID0gbWF4IC0gbWluLAoJCWFkZCA9IG1heCArIG1pbiwK CQlsID0gYWRkICogMC41LAoJCWgsIHM7CgoJaWYgKCBtaW4gPT09IG1heCApIHsK CQloID0gMDsKCX0gZWxzZSBpZiAoIHIgPT09IG1heCApIHsKCQloID0gKCA2MCAq ICggZyAtIGIgKSAvIGRpZmYgKSArIDM2MDsKCX0gZWxzZSBpZiAoIGcgPT09IG1h eCApIHsKCQloID0gKCA2MCAqICggYiAtIHIgKSAvIGRpZmYgKSArIDEyMDsKCX0g ZWxzZSB7CgkJaCA9ICggNjAgKiAoIHIgLSBnICkgLyBkaWZmICkgKyAyNDA7Cgl9 CgoJLy8gY2hyb21hIChkaWZmKSA9PSAwIG1lYW5zIGdyZXlzY2FsZSB3aGljaCwg YnkgZGVmaW5pdGlvbiwgc2F0dXJhdGlvbiA9IDAlCgkvLyBvdGhlcndpc2UsIHNh dHVyYXRpb24gaXMgYmFzZWQgb24gdGhlIHJhdGlvIG9mIGNocm9tYSAoZGlmZikg dG8gbGlnaHRuZXNzIChhZGQpCglpZiAoIGRpZmYgPT09IDAgKSB7CgkJcyA9IDA7 Cgl9IGVsc2UgaWYgKCBsIDw9IDAuNSApIHsKCQlzID0gZGlmZiAvIGFkZDsKCX0g ZWxzZSB7CgkJcyA9IGRpZmYgLyAoIDIgLSBhZGQgKTsKCX0KCXJldHVybiBbIE1h dGgucm91bmQoaCkgJSAzNjAsIHMsIGwsIGEgPT0gbnVsbCA/IDEgOiBhIF07Cn07 CgpzcGFjZXMuaHNsYS5mcm9tID0gZnVuY3Rpb24gKCBoc2xhICkgewoJaWYgKCBo c2xhWyAwIF0gPT0gbnVsbCB8fCBoc2xhWyAxIF0gPT0gbnVsbCB8fCBoc2xhWyAy IF0gPT0gbnVsbCApIHsKCQlyZXR1cm4gWyBudWxsLCBudWxsLCBudWxsLCBoc2xh WyAzIF0gXTsKCX0KCXZhciBoID0gaHNsYVsgMCBdIC8gMzYwLAoJCXMgPSBoc2xh WyAxIF0sCgkJbCA9IGhzbGFbIDIgXSwKCQlhID0gaHNsYVsgMyBdLAoJCXEgPSBs IDw9IDAuNSA/IGwgKiAoIDEgKyBzICkgOiBsICsgcyAtIGwgKiBzLAoJCXAgPSAy ICogbCAtIHE7CgoJcmV0dXJuIFsKCQlNYXRoLnJvdW5kKCBodWUycmdiKCBwLCBx LCBoICsgKCAxIC8gMyApICkgKiAyNTUgKSwKCQlNYXRoLnJvdW5kKCBodWUycmdi KCBwLCBxLCBoICkgKiAyNTUgKSwKCQlNYXRoLnJvdW5kKCBodWUycmdiKCBwLCBx LCBoIC0gKCAxIC8gMyApICkgKiAyNTUgKSwKCQlhCgldOwp9OwoKCmVhY2goIHNw YWNlcywgZnVuY3Rpb24oIHNwYWNlTmFtZSwgc3BhY2UgKSB7Cgl2YXIgcHJvcHMg PSBzcGFjZS5wcm9wcywKCQljYWNoZSA9IHNwYWNlLmNhY2hlLAoJCXRvID0gc3Bh Y2UudG8sCgkJZnJvbSA9IHNwYWNlLmZyb207CgoJLy8gbWFrZXMgcmdiYSgpIGFu ZCBoc2xhKCkKCWNvbG9yLmZuWyBzcGFjZU5hbWUgXSA9IGZ1bmN0aW9uKCB2YWx1 ZSApIHsKCgkJLy8gZ2VuZXJhdGUgYSBjYWNoZSBmb3IgdGhpcyBzcGFjZSBpZiBp dCBkb2Vzbid0IGV4aXN0CgkJaWYgKCB0byAmJiAhdGhpc1sgY2FjaGUgXSApIHsK CQkJdGhpc1sgY2FjaGUgXSA9IHRvKCB0aGlzLl9yZ2JhICk7CgkJfQoJCWlmICgg dmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXNbIGNhY2hlIF0u c2xpY2UoKTsKCQl9CgoJCXZhciByZXQsCgkJCXR5cGUgPSBqUXVlcnkudHlwZSgg dmFsdWUgKSwKCQkJYXJyID0gKCB0eXBlID09PSAiYXJyYXkiIHx8IHR5cGUgPT09 ICJvYmplY3QiICkgPyB2YWx1ZSA6IGFyZ3VtZW50cywKCQkJbG9jYWwgPSB0aGlz WyBjYWNoZSBdLnNsaWNlKCk7CgoJCWVhY2goIHByb3BzLCBmdW5jdGlvbigga2V5 LCBwcm9wICkgewoJCQl2YXIgdmFsID0gYXJyWyB0eXBlID09PSAib2JqZWN0IiA/ IGtleSA6IHByb3AuaWR4IF07CgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2 YWwgPSBsb2NhbFsgcHJvcC5pZHggXTsKCQkJfQoJCQlsb2NhbFsgcHJvcC5pZHgg XSA9IGNsYW1wKCB2YWwsIHByb3AgKTsKCQl9KTsKCgkJaWYgKCBmcm9tICkgewoJ CQlyZXQgPSBjb2xvciggZnJvbSggbG9jYWwgKSApOwoJCQlyZXRbIGNhY2hlIF0g PSBsb2NhbDsKCQkJcmV0dXJuIHJldDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gY29s b3IoIGxvY2FsICk7CgkJfQoJfTsKCgkvLyBtYWtlcyByZWQoKSBncmVlbigpIGJs dWUoKSBhbHBoYSgpIGh1ZSgpIHNhdHVyYXRpb24oKSBsaWdodG5lc3MoKQoJZWFj aCggcHJvcHMsIGZ1bmN0aW9uKCBrZXksIHByb3AgKSB7CgkJLy8gYWxwaGEgaXMg aW5jbHVkZWQgaW4gbW9yZSB0aGFuIG9uZSBzcGFjZQoJCWlmICggY29sb3IuZm5b IGtleSBdICkgewoJCQlyZXR1cm47CgkJfQoJCWNvbG9yLmZuWyBrZXkgXSA9IGZ1 bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIHZ0eXBlID0galF1ZXJ5LnR5cGUoIHZh bHVlICksCgkJCQlmbiA9ICgga2V5ID09PSAiYWxwaGEiID8gKCB0aGlzLl9oc2xh ID8gImhzbGEiIDogInJnYmEiICkgOiBzcGFjZU5hbWUgKSwKCQkJCWxvY2FsID0g dGhpc1sgZm4gXSgpLAoJCQkJY3VyID0gbG9jYWxbIHByb3AuaWR4IF0sCgkJCQlt YXRjaDsKCgkJCWlmICggdnR5cGUgPT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0 dXJuIGN1cjsKCQkJfQoKCQkJaWYgKCB2dHlwZSA9PT0gImZ1bmN0aW9uIiApIHsK CQkJCXZhbHVlID0gdmFsdWUuY2FsbCggdGhpcywgY3VyICk7CgkJCQl2dHlwZSA9 IGpRdWVyeS50eXBlKCB2YWx1ZSApOwoJCQl9CgkJCWlmICggdmFsdWUgPT0gbnVs bCAmJiBwcm9wLmVtcHR5ICkgewoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQkJaWYg KCB2dHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCQltYXRjaCA9IHJwbHVzZXF1YWxz LmV4ZWMoIHZhbHVlICk7CgkJCQlpZiAoIG1hdGNoICkgewoJCQkJCXZhbHVlID0g Y3VyICsgcGFyc2VGbG9hdCggbWF0Y2hbIDIgXSApICogKCBtYXRjaFsgMSBdID09 PSAiKyIgPyAxIDogLTEgKTsKCQkJCX0KCQkJfQoJCQlsb2NhbFsgcHJvcC5pZHgg XSA9IHZhbHVlOwoJCQlyZXR1cm4gdGhpc1sgZm4gXSggbG9jYWwgKTsKCQl9OwoJ fSk7Cn0pOwoKLy8gYWRkIGNzc0hvb2sgYW5kIC5meC5zdGVwIGZ1bmN0aW9uIGZv ciBlYWNoIG5hbWVkIGhvb2suCi8vIGFjY2VwdCBhIHNwYWNlIHNlcGFyYXRlZCBz dHJpbmcgb2YgcHJvcGVydGllcwpjb2xvci5ob29rID0gZnVuY3Rpb24oIGhvb2sg KSB7Cgl2YXIgaG9va3MgPSBob29rLnNwbGl0KCAiICIgKTsKCWVhY2goIGhvb2tz LCBmdW5jdGlvbiggaSwgaG9vayApIHsKCQlqUXVlcnkuY3NzSG9va3NbIGhvb2sg XSA9IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIg cGFyc2VkLCBjdXJFbGVtLAoJCQkJCWJhY2tncm91bmRDb2xvciA9ICIiOwoKCQkJ CWlmICggdmFsdWUgIT09ICJ0cmFuc3BhcmVudCIgJiYgKCBqUXVlcnkudHlwZSgg dmFsdWUgKSAhPT0gInN0cmluZyIgfHwgKCBwYXJzZWQgPSBzdHJpbmdQYXJzZSgg dmFsdWUgKSApICkgKSB7CgkJCQkJdmFsdWUgPSBjb2xvciggcGFyc2VkIHx8IHZh bHVlICk7CgkJCQkJaWYgKCAhc3VwcG9ydC5yZ2JhICYmIHZhbHVlLl9yZ2JhWyAz IF0gIT09IDEgKSB7CgkJCQkJCWN1ckVsZW0gPSBob29rID09PSAiYmFja2dyb3Vu ZENvbG9yIiA/IGVsZW0ucGFyZW50Tm9kZSA6IGVsZW07CgkJCQkJCXdoaWxlICgK CQkJCQkJCShiYWNrZ3JvdW5kQ29sb3IgPT09ICIiIHx8IGJhY2tncm91bmRDb2xv ciA9PT0gInRyYW5zcGFyZW50IikgJiYKCQkJCQkJCWN1ckVsZW0gJiYgY3VyRWxl bS5zdHlsZQoJCQkJCQkpIHsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJYmFja2dyb3Vu ZENvbG9yID0galF1ZXJ5LmNzcyggY3VyRWxlbSwgImJhY2tncm91bmRDb2xvciIg KTsKCQkJCQkJCQljdXJFbGVtID0gY3VyRWxlbS5wYXJlbnROb2RlOwoJCQkJCQkJ fSBjYXRjaCAoIGUgKSB7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXZhbHVlID0g dmFsdWUuYmxlbmQoIGJhY2tncm91bmRDb2xvciAmJiBiYWNrZ3JvdW5kQ29sb3Ig IT09ICJ0cmFuc3BhcmVudCIgPwoJCQkJCQkJYmFja2dyb3VuZENvbG9yIDoKCQkJ CQkJCSJfZGVmYXVsdCIgKTsKCQkJCQl9CgoJCQkJCXZhbHVlID0gdmFsdWUudG9S Z2JhU3RyaW5nKCk7CgkJCQl9CgkJCQl0cnkgewoJCQkJCWVsZW0uc3R5bGVbIGhv b2sgXSA9IHZhbHVlOwoJCQkJfSBjYXRjaCggZSApIHsKCQkJCQkvLyB3cmFwcGVk IHRvIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBlcnJvcnMgb24gImludmFsaWQi IHZhbHVlcyBsaWtlICdhdXRvJyBvciAnaW5oZXJpdCcKCQkJCX0KCQkJfQoJCX07 CgkJalF1ZXJ5LmZ4LnN0ZXBbIGhvb2sgXSA9IGZ1bmN0aW9uKCBmeCApIHsKCQkJ aWYgKCAhZnguY29sb3JJbml0ICkgewoJCQkJZnguc3RhcnQgPSBjb2xvciggZngu ZWxlbSwgaG9vayApOwoJCQkJZnguZW5kID0gY29sb3IoIGZ4LmVuZCApOwoJCQkJ ZnguY29sb3JJbml0ID0gdHJ1ZTsKCQkJfQoJCQlqUXVlcnkuY3NzSG9va3NbIGhv b2sgXS5zZXQoIGZ4LmVsZW0sIGZ4LnN0YXJ0LnRyYW5zaXRpb24oIGZ4LmVuZCwg ZngucG9zICkgKTsKCQl9OwoJfSk7Cgp9OwoKY29sb3IuaG9vayggc3RlcEhvb2tz ICk7CgpqUXVlcnkuY3NzSG9va3MuYm9yZGVyQ29sb3IgPSB7CglleHBhbmQ6IGZ1 bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgZXhwYW5kZWQgPSB7fTsKCgkJZWFjaCgg WyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBdLCBmdW5jdGlvbigg aSwgcGFydCApIHsKCQkJZXhwYW5kZWRbICJib3JkZXIiICsgcGFydCArICJDb2xv ciIgXSA9IHZhbHVlOwoJCX0pOwoJCXJldHVybiBleHBhbmRlZDsKCX0KfTsKCi8v IEJhc2ljIGNvbG9yIG5hbWVzIG9ubHkuCi8vIFVzYWdlIG9mIGFueSBvZiB0aGUg b3RoZXIgY29sb3IgbmFtZXMgcmVxdWlyZXMgYWRkaW5nIHlvdXJzZWxmIG9yIGlu Y2x1ZGluZwovLyBqcXVlcnkuY29sb3Iuc3ZnLW5hbWVzLmpzLgpjb2xvcnMgPSBq UXVlcnkuQ29sb3IubmFtZXMgPSB7CgkvLyA0LjEuIEJhc2ljIGNvbG9yIGtleXdv cmRzCglhcXVhOiAiIzAwZmZmZiIsCglibGFjazogIiMwMDAwMDAiLAoJYmx1ZTog IiMwMDAwZmYiLAoJZnVjaHNpYTogIiNmZjAwZmYiLAoJZ3JheTogIiM4MDgwODAi LAoJZ3JlZW46ICIjMDA4MDAwIiwKCWxpbWU6ICIjMDBmZjAwIiwKCW1hcm9vbjog IiM4MDAwMDAiLAoJbmF2eTogIiMwMDAwODAiLAoJb2xpdmU6ICIjODA4MDAwIiwK CXB1cnBsZTogIiM4MDAwODAiLAoJcmVkOiAiI2ZmMDAwMCIsCglzaWx2ZXI6ICIj YzBjMGMwIiwKCXRlYWw6ICIjMDA4MDgwIiwKCXdoaXRlOiAiI2ZmZmZmZiIsCgl5 ZWxsb3c6ICIjZmZmZjAwIiwKCgkvLyA0LjIuMy4gInRyYW5zcGFyZW50IiBjb2xv ciBrZXl3b3JkCgl0cmFuc3BhcmVudDogWyBudWxsLCBudWxsLCBudWxsLCAwIF0s CgoJX2RlZmF1bHQ6ICIjZmZmZmZmIgp9OwoKfSkoIGpRdWVyeSApOwoKCi8qKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKiogQ0xBU1MgQU5JTUFUSU9OUyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCihm dW5jdGlvbigpIHsKCnZhciBjbGFzc0FuaW1hdGlvbkFjdGlvbnMgPSBbICJhZGQi LCAicmVtb3ZlIiwgInRvZ2dsZSIgXSwKCXNob3J0aGFuZFN0eWxlcyA9IHsKCQli b3JkZXI6IDEsCgkJYm9yZGVyQm90dG9tOiAxLAoJCWJvcmRlckNvbG9yOiAxLAoJ CWJvcmRlckxlZnQ6IDEsCgkJYm9yZGVyUmlnaHQ6IDEsCgkJYm9yZGVyVG9wOiAx LAoJCWJvcmRlcldpZHRoOiAxLAoJCW1hcmdpbjogMSwKCQlwYWRkaW5nOiAxCgl9 OwoKJC5lYWNoKFsgImJvcmRlckxlZnRTdHlsZSIsICJib3JkZXJSaWdodFN0eWxl IiwgImJvcmRlckJvdHRvbVN0eWxlIiwgImJvcmRlclRvcFN0eWxlIiBdLCBmdW5j dGlvbiggXywgcHJvcCApIHsKCSQuZnguc3RlcFsgcHJvcCBdID0gZnVuY3Rpb24o IGZ4ICkgewoJCWlmICggZnguZW5kICE9PSAibm9uZSIgJiYgIWZ4LnNldEF0dHIg fHwgZngucG9zID09PSAxICYmICFmeC5zZXRBdHRyICkgewoJCQlqUXVlcnkuc3R5 bGUoIGZ4LmVsZW0sIHByb3AsIGZ4LmVuZCApOwoJCQlmeC5zZXRBdHRyID0gdHJ1 ZTsKCQl9Cgl9Owp9KTsKCmZ1bmN0aW9uIGdldEVsZW1lbnRTdHlsZXMoIGVsZW0g KSB7Cgl2YXIga2V5LCBsZW4sCgkJc3R5bGUgPSBlbGVtLm93bmVyRG9jdW1lbnQu ZGVmYXVsdFZpZXcgPwoJCQllbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcu Z2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApIDoKCQkJZWxlbS5jdXJyZW50 U3R5bGUsCgkJc3R5bGVzID0ge307CgoJaWYgKCBzdHlsZSAmJiBzdHlsZS5sZW5n dGggJiYgc3R5bGVbIDAgXSAmJiBzdHlsZVsgc3R5bGVbIDAgXSBdICkgewoJCWxl biA9IHN0eWxlLmxlbmd0aDsKCQl3aGlsZSAoIGxlbi0tICkgewoJCQlrZXkgPSBz dHlsZVsgbGVuIF07CgkJCWlmICggdHlwZW9mIHN0eWxlWyBrZXkgXSA9PT0gInN0 cmluZyIgKSB7CgkJCQlzdHlsZXNbICQuY2FtZWxDYXNlKCBrZXkgKSBdID0gc3R5 bGVbIGtleSBdOwoJCQl9CgkJfQoJLy8gc3VwcG9ydDogT3BlcmEsIElFIDw5Cgl9 IGVsc2UgewoJCWZvciAoIGtleSBpbiBzdHlsZSApIHsKCQkJaWYgKCB0eXBlb2Yg c3R5bGVbIGtleSBdID09PSAic3RyaW5nIiApIHsKCQkJCXN0eWxlc1sga2V5IF0g PSBzdHlsZVsga2V5IF07CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHN0eWxlczsKfQoK CmZ1bmN0aW9uIHN0eWxlRGlmZmVyZW5jZSggb2xkU3R5bGUsIG5ld1N0eWxlICkg ewoJdmFyIGRpZmYgPSB7fSwKCQluYW1lLCB2YWx1ZTsKCglmb3IgKCBuYW1lIGlu IG5ld1N0eWxlICkgewoJCXZhbHVlID0gbmV3U3R5bGVbIG5hbWUgXTsKCQlpZiAo IG9sZFN0eWxlWyBuYW1lIF0gIT09IHZhbHVlICkgewoJCQlpZiAoICFzaG9ydGhh bmRTdHlsZXNbIG5hbWUgXSApIHsKCQkJCWlmICggJC5meC5zdGVwWyBuYW1lIF0g fHwgIWlzTmFOKCBwYXJzZUZsb2F0KCB2YWx1ZSApICkgKSB7CgkJCQkJZGlmZlsg bmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGRpZmY7 Cn0KCi8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CmlmICggISQuZm4uYWRkQmFjayAp IHsKCSQuZm4uYWRkQmFjayA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1 cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwoJCQl0aGlzLnByZXZPYmpl Y3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApCgkJKTsKCX07 Cn0KCiQuZWZmZWN0cy5hbmltYXRlQ2xhc3MgPSBmdW5jdGlvbiggdmFsdWUsIGR1 cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJdmFyIG8gPSAkLnNwZWVkKCBk dXJhdGlvbiwgZWFzaW5nLCBjYWxsYmFjayApOwoKCXJldHVybiB0aGlzLnF1ZXVl KCBmdW5jdGlvbigpIHsKCQl2YXIgYW5pbWF0ZWQgPSAkKCB0aGlzICksCgkJCWJh c2VDbGFzcyA9IGFuaW1hdGVkLmF0dHIoICJjbGFzcyIgKSB8fCAiIiwKCQkJYXBw bHlDbGFzc0NoYW5nZSwKCQkJYWxsQW5pbWF0aW9ucyA9IG8uY2hpbGRyZW4gPyBh bmltYXRlZC5maW5kKCAiKiIgKS5hZGRCYWNrKCkgOiBhbmltYXRlZDsKCgkJLy8g bWFwIHRoZSBhbmltYXRlZCBvYmplY3RzIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBz dHlsZXMuCgkJYWxsQW5pbWF0aW9ucyA9IGFsbEFuaW1hdGlvbnMubWFwKGZ1bmN0 aW9uKCkgewoJCQl2YXIgZWwgPSAkKCB0aGlzICk7CgkJCXJldHVybiB7CgkJCQll bDogZWwsCgkJCQlzdGFydDogZ2V0RWxlbWVudFN0eWxlcyggdGhpcyApCgkJCX07 CgkJfSk7CgoJCS8vIGFwcGx5IGNsYXNzIGNoYW5nZQoJCWFwcGx5Q2xhc3NDaGFu Z2UgPSBmdW5jdGlvbigpIHsKCQkJJC5lYWNoKCBjbGFzc0FuaW1hdGlvbkFjdGlv bnMsIGZ1bmN0aW9uKGksIGFjdGlvbikgewoJCQkJaWYgKCB2YWx1ZVsgYWN0aW9u IF0gKSB7CgkJCQkJYW5pbWF0ZWRbIGFjdGlvbiArICJDbGFzcyIgXSggdmFsdWVb IGFjdGlvbiBdICk7CgkJCQl9CgkJCX0pOwoJCX07CgkJYXBwbHlDbGFzc0NoYW5n ZSgpOwoKCQkvLyBtYXAgYWxsIGFuaW1hdGVkIG9iamVjdHMgYWdhaW4gLSBjYWxj dWxhdGUgbmV3IHN0eWxlcyBhbmQgZGlmZgoJCWFsbEFuaW1hdGlvbnMgPSBhbGxB bmltYXRpb25zLm1hcChmdW5jdGlvbigpIHsKCQkJdGhpcy5lbmQgPSBnZXRFbGVt ZW50U3R5bGVzKCB0aGlzLmVsWyAwIF0gKTsKCQkJdGhpcy5kaWZmID0gc3R5bGVE aWZmZXJlbmNlKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApOwoJCQlyZXR1cm4gdGhp czsKCQl9KTsKCgkJLy8gYXBwbHkgb3JpZ2luYWwgY2xhc3MKCQlhbmltYXRlZC5h dHRyKCAiY2xhc3MiLCBiYXNlQ2xhc3MgKTsKCgkJLy8gbWFwIGFsbCBhbmltYXRl ZCBvYmplY3RzIGFnYWluIC0gdGhpcyB0aW1lIGNvbGxlY3RpbmcgYSBwcm9taXNl CgkJYWxsQW5pbWF0aW9ucyA9IGFsbEFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uKCkg ewoJCQl2YXIgc3R5bGVJbmZvID0gdGhpcywKCQkJCWRmZCA9ICQuRGVmZXJyZWQo KSwKCQkJCW9wdHMgPSAkLmV4dGVuZCh7fSwgbywgewoJCQkJCXF1ZXVlOiBmYWxz ZSwKCQkJCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCQkJCWRmZC5yZXNvbHZl KCBzdHlsZUluZm8gKTsKCQkJCQl9CgkJCQl9KTsKCgkJCXRoaXMuZWwuYW5pbWF0 ZSggdGhpcy5kaWZmLCBvcHRzICk7CgkJCXJldHVybiBkZmQucHJvbWlzZSgpOwoJ CX0pOwoKCQkvLyBvbmNlIGFsbCBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkOgoJ CSQud2hlbi5hcHBseSggJCwgYWxsQW5pbWF0aW9ucy5nZXQoKSApLmRvbmUoZnVu Y3Rpb24oKSB7CgoJCQkvLyBzZXQgdGhlIGZpbmFsIGNsYXNzCgkJCWFwcGx5Q2xh c3NDaGFuZ2UoKTsKCgkJCS8vIGZvciBlYWNoIGFuaW1hdGVkIGVsZW1lbnQsCgkJ CS8vIGNsZWFyIGFsbCBjc3MgcHJvcGVydGllcyB0aGF0IHdlcmUgYW5pbWF0ZWQK CQkJJC5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsID0g dGhpcy5lbDsKCQkJCSQuZWFjaCggdGhpcy5kaWZmLCBmdW5jdGlvbihrZXkpIHsK CQkJCQllbC5jc3MoIGtleSwgIiIgKTsKCQkJCX0pOwoJCQl9KTsKCgkJCS8vIHRo aXMgaXMgZ3Vhcm50ZWVkIHRvIGJlIHRoZXJlIGlmIHlvdSB1c2UgalF1ZXJ5LnNw ZWVkKCkKCQkJLy8gaXQgYWxzbyBoYW5kbGVzIGRlcXVldWluZyB0aGUgbmV4dCBh bmltLi4uCgkJCW8uY29tcGxldGUuY2FsbCggYW5pbWF0ZWRbIDAgXSApOwoJCX0p OwoJfSk7Cn07CgokLmZuLmV4dGVuZCh7CglfYWRkQ2xhc3M6ICQuZm4uYWRkQ2xh c3MsCglhZGRDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHNwZWVkLCBlYXNp bmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA/CgkJCSQuZWZmZWN0cy5h bmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCXsgYWRkOiBjbGFzc05hbWVzIH0s IHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgOgoJCQl0aGlzLl9hZGRDbGFzcygg Y2xhc3NOYW1lcyApOwoJfSwKCglfcmVtb3ZlQ2xhc3M6ICQuZm4ucmVtb3ZlQ2xh c3MsCglyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMsIHNwZWVkLCBl YXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA/CgkJCSQuZWZmZWN0 cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCXsgcmVtb3ZlOiBjbGFzc05h bWVzIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgOgoJCQl0aGlzLl9yZW1v dmVDbGFzcyggY2xhc3NOYW1lcyApOwoJfSwKCglfdG9nZ2xlQ2xhc3M6ICQuZm4u dG9nZ2xlQ2xhc3MsCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMs IGZvcmNlLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVv ZiBmb3JjZSA9PT0gImJvb2xlYW4iIHx8IGZvcmNlID09PSB1bmRlZmluZWQgKSB7 CgkJCWlmICggIXNwZWVkICkgewoJCQkJLy8gd2l0aG91dCBzcGVlZCBwYXJhbWV0 ZXIKCQkJCXJldHVybiB0aGlzLl90b2dnbGVDbGFzcyggY2xhc3NOYW1lcywgZm9y Y2UgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAkLmVmZmVjdHMuYW5pbWF0ZUNs YXNzLmNhbGwoIHRoaXMsCgkJCQkJKGZvcmNlID8geyBhZGQ6IGNsYXNzTmFtZXMg fSA6IHsgcmVtb3ZlOiBjbGFzc05hbWVzIH0pLAoJCQkJCXNwZWVkLCBlYXNpbmcs IGNhbGxiYWNrICk7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyB3aXRob3V0IGZvcmNl IHBhcmFtZXRlcgoJCQlyZXR1cm4gJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxs KCB0aGlzLAoJCQkJeyB0b2dnbGU6IGNsYXNzTmFtZXMgfSwgZm9yY2UsIHNwZWVk LCBlYXNpbmcgKTsKCQl9Cgl9LAoKCXN3aXRjaENsYXNzOiBmdW5jdGlvbiggcmVt b3ZlLCBhZGQsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKSB7CgkJcmV0dXJuICQu ZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywgewoJCQlhZGQ6IGFkZCwK CQkJcmVtb3ZlOiByZW1vdmUKCQl9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayAp OwoJfQp9KTsKCn0pKCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUZGRUNUUyAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqLwoKKGZ1bmN0aW9uKCkgewoKJC5leHRlbmQoICQu ZWZmZWN0cywgewoJdmVyc2lvbjogIjEuMTAuMCIsCgoJLy8gU2F2ZXMgYSBzZXQg b2YgcHJvcGVydGllcyBpbiBhIGRhdGEgc3RvcmFnZQoJc2F2ZTogZnVuY3Rpb24o IGVsZW1lbnQsIHNldCApIHsKCQlmb3IoIHZhciBpPTA7IGkgPCBzZXQubGVuZ3Ro OyBpKysgKSB7CgkJCWlmICggc2V0WyBpIF0gIT09IG51bGwgKSB7CgkJCQllbGVt ZW50LmRhdGEoIGRhdGFTcGFjZSArIHNldFsgaSBdLCBlbGVtZW50WyAwIF0uc3R5 bGVbIHNldFsgaSBdIF0gKTsKCQkJfQoJCX0KCX0sCgoJLy8gUmVzdG9yZXMgYSBz ZXQgb2YgcHJldmlvdXNseSBzYXZlZCBwcm9wZXJ0aWVzIGZyb20gYSBkYXRhIHN0 b3JhZ2UKCXJlc3RvcmU6IGZ1bmN0aW9uKCBlbGVtZW50LCBzZXQgKSB7CgkJdmFy IHZhbCwgaTsKCQlmb3IoIGk9MDsgaSA8IHNldC5sZW5ndGg7IGkrKyApIHsKCQkJ aWYgKCBzZXRbIGkgXSAhPT0gbnVsbCApIHsKCQkJCXZhbCA9IGVsZW1lbnQuZGF0 YSggZGF0YVNwYWNlICsgc2V0WyBpIF0gKTsKCQkJCS8vIHN1cHBvcnQ6IGpRdWVy eSAxLjYuMgoJCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTkx NwoJCQkJLy8galF1ZXJ5IDEuNi4yIGluY29ycmVjdGx5IHJldHVybnMgdW5kZWZp bmVkIGZvciBhbnkgZmFsc3kgdmFsdWUuCgkJCQkvLyBXZSBjYW4ndCBkaWZmZXJl bnRpYXRlIGJldHdlZW4gIiIgYW5kIDAgaGVyZSwgc28gd2UganVzdCBhc3N1bWUK CQkJCS8vIGVtcHR5IHN0cmluZyBzaW5jZSBpdCdzIGxpa2VseSB0byBiZSBhIG1v cmUgY29tbW9uIHZhbHVlLi4uCgkJCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkg ewoJCQkJCXZhbCA9ICIiOwoJCQkJfQoJCQkJZWxlbWVudC5jc3MoIHNldFsgaSBd LCB2YWwgKTsKCQkJfQoJCX0KCX0sCgoJc2V0TW9kZTogZnVuY3Rpb24oIGVsLCBt b2RlICkgewoJCWlmIChtb2RlID09PSAidG9nZ2xlIikgewoJCQltb2RlID0gZWwu aXMoICI6aGlkZGVuIiApID8gInNob3ciIDogImhpZGUiOwoJCX0KCQlyZXR1cm4g bW9kZTsKCX0sCgoJLy8gVHJhbnNsYXRlcyBhIFt0b3AsbGVmdF0gYXJyYXkgaW50 byBhIGJhc2VsaW5lIHZhbHVlCgkvLyB0aGlzIHNob3VsZCBiZSBhIGxpdHRsZSBt b3JlIGZsZXhpYmxlIGluIHRoZSBmdXR1cmUgdG8gaGFuZGxlIGEgc3RyaW5nICYg aGFzaAoJZ2V0QmFzZWxpbmU6IGZ1bmN0aW9uKCBvcmlnaW4sIG9yaWdpbmFsICkg ewoJCXZhciB5LCB4OwoJCXN3aXRjaCAoIG9yaWdpblsgMCBdICkgewoJCQljYXNl ICJ0b3AiOiB5ID0gMDsgYnJlYWs7CgkJCWNhc2UgIm1pZGRsZSI6IHkgPSAwLjU7 IGJyZWFrOwoJCQljYXNlICJib3R0b20iOiB5ID0gMTsgYnJlYWs7CgkJCWRlZmF1 bHQ6IHkgPSBvcmlnaW5bIDAgXSAvIG9yaWdpbmFsLmhlaWdodDsKCQl9CgkJc3dp dGNoICggb3JpZ2luWyAxIF0gKSB7CgkJCWNhc2UgImxlZnQiOiB4ID0gMDsgYnJl YWs7CgkJCWNhc2UgImNlbnRlciI6IHggPSAwLjU7IGJyZWFrOwoJCQljYXNlICJy aWdodCI6IHggPSAxOyBicmVhazsKCQkJZGVmYXVsdDogeCA9IG9yaWdpblsgMSBd IC8gb3JpZ2luYWwud2lkdGg7CgkJfQoJCXJldHVybiB7CgkJCXg6IHgsCgkJCXk6 IHkKCQl9OwoJfSwKCgkvLyBXcmFwcyB0aGUgZWxlbWVudCBhcm91bmQgYSB3cmFw cGVyIHRoYXQgY29waWVzIHBvc2l0aW9uIHByb3BlcnRpZXMKCWNyZWF0ZVdyYXBw ZXI6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoKCQkvLyBpZiB0aGUgZWxlbWVudCBp cyBhbHJlYWR5IHdyYXBwZWQsIHJldHVybiBpdAoJCWlmICggZWxlbWVudC5wYXJl bnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkpIHsKCQkJcmV0dXJuIGVs ZW1lbnQucGFyZW50KCk7CgkJfQoKCQkvLyB3cmFwIHRoZSBlbGVtZW50CgkJdmFy IHByb3BzID0gewoJCQkJd2lkdGg6IGVsZW1lbnQub3V0ZXJXaWR0aCh0cnVlKSwK CQkJCWhlaWdodDogZWxlbWVudC5vdXRlckhlaWdodCh0cnVlKSwKCQkJCSJmbG9h dCI6IGVsZW1lbnQuY3NzKCAiZmxvYXQiICkKCQkJfSwKCQkJd3JhcHBlciA9ICQo ICI8ZGl2PjwvZGl2PiIgKQoJCQkJLmFkZENsYXNzKCAidWktZWZmZWN0cy13cmFw cGVyIiApCgkJCQkuY3NzKHsKCQkJCQlmb250U2l6ZTogIjEwMCUiLAoJCQkJCWJh Y2tncm91bmQ6ICJ0cmFuc3BhcmVudCIsCgkJCQkJYm9yZGVyOiAibm9uZSIsCgkJ CQkJbWFyZ2luOiAwLAoJCQkJCXBhZGRpbmc6IDAKCQkJCX0pLAoJCQkvLyBTdG9y ZSB0aGUgc2l6ZSBpbiBjYXNlIHdpZHRoL2hlaWdodCBhcmUgZGVmaW5lZCBpbiAl IC0gRml4ZXMgIzUyNDUKCQkJc2l6ZSA9IHsKCQkJCXdpZHRoOiBlbGVtZW50Lndp ZHRoKCksCgkJCQloZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0KCkKCQkJfSwKCQkJYWN0 aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCgkJLy8gc3VwcG9ydDogRmly ZWZveAoJCS8vIEZpcmVmb3ggaW5jb3JyZWN0bHkgZXhwb3NlcyBhbm9ueW1vdXMg Y29udGVudAoJCS8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19i dWcuY2dpP2lkPTU2MTY2NAoJCXRyeSB7CgkJCWFjdGl2ZS5pZDsKCQl9IGNhdGNo KCBlICkgewoJCQlhY3RpdmUgPSBkb2N1bWVudC5ib2R5OwoJCX0KCgkJZWxlbWVu dC53cmFwKCB3cmFwcGVyICk7CgoJCS8vIEZpeGVzICM3NTk1IC0gRWxlbWVudHMg bG9zZSBmb2N1cyB3aGVuIHdyYXBwZWQuCgkJaWYgKCBlbGVtZW50WyAwIF0gPT09 IGFjdGl2ZSB8fCAkLmNvbnRhaW5zKCBlbGVtZW50WyAwIF0sIGFjdGl2ZSApICkg ewoJCQkkKCBhY3RpdmUgKS5mb2N1cygpOwoJCX0KCgkJd3JhcHBlciA9IGVsZW1l bnQucGFyZW50KCk7IC8vSG90Zml4IGZvciBqUXVlcnkgMS40IHNpbmNlIHNvbWUg Y2hhbmdlIGluIHdyYXAoKSBzZWVtcyB0byBhY3R1YWxseSBsb3NlIHRoZSByZWZl cmVuY2UgdG8gdGhlIHdyYXBwZWQgZWxlbWVudAoKCQkvLyB0cmFuc2ZlciBwb3Np dGlvbmluZyBwcm9wZXJ0aWVzIHRvIHRoZSB3cmFwcGVyCgkJaWYgKCBlbGVtZW50 LmNzcyggInBvc2l0aW9uIiApID09PSAic3RhdGljIiApIHsKCQkJd3JhcHBlci5j c3MoeyBwb3NpdGlvbjogInJlbGF0aXZlIiB9KTsKCQkJZWxlbWVudC5jc3MoeyBw b3NpdGlvbjogInJlbGF0aXZlIiB9KTsKCQl9IGVsc2UgewoJCQkkLmV4dGVuZCgg cHJvcHMsIHsKCQkJCXBvc2l0aW9uOiBlbGVtZW50LmNzcyggInBvc2l0aW9uIiAp LAoJCQkJekluZGV4OiBlbGVtZW50LmNzcyggInotaW5kZXgiICkKCQkJfSk7CgkJ CSQuZWFjaChbICJ0b3AiLCAibGVmdCIsICJib3R0b20iLCAicmlnaHQiIF0sIGZ1 bmN0aW9uKGksIHBvcykgewoJCQkJcHJvcHNbIHBvcyBdID0gZWxlbWVudC5jc3Mo IHBvcyApOwoJCQkJaWYgKCBpc05hTiggcGFyc2VJbnQoIHByb3BzWyBwb3MgXSwg MTAgKSApICkgewoJCQkJCXByb3BzWyBwb3MgXSA9ICJhdXRvIjsKCQkJCX0KCQkJ fSk7CgkJCWVsZW1lbnQuY3NzKHsKCQkJCXBvc2l0aW9uOiAicmVsYXRpdmUiLAoJ CQkJdG9wOiAwLAoJCQkJbGVmdDogMCwKCQkJCXJpZ2h0OiAiYXV0byIsCgkJCQli b3R0b206ICJhdXRvIgoJCQl9KTsKCQl9CgkJZWxlbWVudC5jc3Moc2l6ZSk7CgoJ CXJldHVybiB3cmFwcGVyLmNzcyggcHJvcHMgKS5zaG93KCk7Cgl9LAoKCXJlbW92 ZVdyYXBwZXI6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXZhciBhY3RpdmUgPSBk b2N1bWVudC5hY3RpdmVFbGVtZW50OwoKCQlpZiAoIGVsZW1lbnQucGFyZW50KCku aXMoICIudWktZWZmZWN0cy13cmFwcGVyIiApICkgewoJCQllbGVtZW50LnBhcmVu dCgpLnJlcGxhY2VXaXRoKCBlbGVtZW50ICk7CgoJCQkvLyBGaXhlcyAjNzU5NSAt IEVsZW1lbnRzIGxvc2UgZm9jdXMgd2hlbiB3cmFwcGVkLgoJCQlpZiAoIGVsZW1l bnRbIDAgXSA9PT0gYWN0aXZlIHx8ICQuY29udGFpbnMoIGVsZW1lbnRbIDAgXSwg YWN0aXZlICkgKSB7CgkJCQkkKCBhY3RpdmUgKS5mb2N1cygpOwoJCQl9CgkJfQoK CgkJcmV0dXJuIGVsZW1lbnQ7Cgl9LAoKCXNldFRyYW5zaXRpb246IGZ1bmN0aW9u KCBlbGVtZW50LCBsaXN0LCBmYWN0b3IsIHZhbHVlICkgewoJCXZhbHVlID0gdmFs dWUgfHwge307CgkJJC5lYWNoKCBsaXN0LCBmdW5jdGlvbiggaSwgeCApIHsKCQkJ dmFyIHVuaXQgPSBlbGVtZW50LmNzc1VuaXQoIHggKTsKCQkJaWYgKCB1bml0WyAw IF0gPiAwICkgewoJCQkJdmFsdWVbIHggXSA9IHVuaXRbIDAgXSAqIGZhY3RvciAr IHVuaXRbIDEgXTsKCQkJfQoJCX0pOwoJCXJldHVybiB2YWx1ZTsKCX0KfSk7Cgov LyByZXR1cm4gYW4gZWZmZWN0IG9wdGlvbnMgb2JqZWN0IGZvciB0aGUgZ2l2ZW4g cGFyYW1ldGVyczoKZnVuY3Rpb24gX25vcm1hbGl6ZUFyZ3VtZW50cyggZWZmZWN0 LCBvcHRpb25zLCBzcGVlZCwgY2FsbGJhY2sgKSB7CgoJLy8gYWxsb3cgcGFzc2lu ZyBhbGwgb3B0aW9ucyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyCglpZiAoICQuaXNQ bGFpbk9iamVjdCggZWZmZWN0ICkgKSB7CgkJb3B0aW9ucyA9IGVmZmVjdDsKCQll ZmZlY3QgPSBlZmZlY3QuZWZmZWN0OwoJfQoKCS8vIGNvbnZlcnQgdG8gYW4gb2Jq ZWN0CgllZmZlY3QgPSB7IGVmZmVjdDogZWZmZWN0IH07CgoJLy8gY2F0Y2ggKGVm ZmVjdCwgbnVsbCwgLi4uKQoJaWYgKCBvcHRpb25zID09IG51bGwgKSB7CgkJb3B0 aW9ucyA9IHt9OwoJfQoKCS8vIGNhdGNoIChlZmZlY3QsIGNhbGxiYWNrKQoJaWYg KCAkLmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCQljYWxsYmFjayA9IG9wdGlv bnM7CgkJc3BlZWQgPSBudWxsOwoJCW9wdGlvbnMgPSB7fTsKCX0KCgkvLyBjYXRj aCAoZWZmZWN0LCBzcGVlZCwgPykKCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJu dW1iZXIiIHx8ICQuZnguc3BlZWRzWyBvcHRpb25zIF0gKSB7CgkJY2FsbGJhY2sg PSBzcGVlZDsKCQlzcGVlZCA9IG9wdGlvbnM7CgkJb3B0aW9ucyA9IHt9OwoJfQoK CS8vIGNhdGNoIChlZmZlY3QsIG9wdGlvbnMsIGNhbGxiYWNrKQoJaWYgKCAkLmlz RnVuY3Rpb24oIHNwZWVkICkgKSB7CgkJY2FsbGJhY2sgPSBzcGVlZDsKCQlzcGVl ZCA9IG51bGw7Cgl9CgoJLy8gYWRkIG9wdGlvbnMgdG8gZWZmZWN0CglpZiAoIG9w dGlvbnMgKSB7CgkJJC5leHRlbmQoIGVmZmVjdCwgb3B0aW9ucyApOwoJfQoKCXNw ZWVkID0gc3BlZWQgfHwgb3B0aW9ucy5kdXJhdGlvbjsKCWVmZmVjdC5kdXJhdGlv biA9ICQuZngub2ZmID8gMCA6CgkJdHlwZW9mIHNwZWVkID09PSAibnVtYmVyIiA/ IHNwZWVkIDoKCQlzcGVlZCBpbiAkLmZ4LnNwZWVkcyA/ICQuZnguc3BlZWRzWyBz cGVlZCBdIDoKCQkkLmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgllZmZlY3QuY29tcGxl dGUgPSBjYWxsYmFjayB8fCBvcHRpb25zLmNvbXBsZXRlOwoKCXJldHVybiBlZmZl Y3Q7Cn0KCmZ1bmN0aW9uIHN0YW5kYXJkU3BlZWQoIHNwZWVkICkgewoJLy8gdmFs aWQgc3RhbmRhcmQgc3BlZWRzCglpZiAoICFzcGVlZCB8fCB0eXBlb2Ygc3BlZWQg PT09ICJudW1iZXIiIHx8ICQuZnguc3BlZWRzWyBzcGVlZCBdICkgewoJCXJldHVy biB0cnVlOwoJfQoKCS8vIGludmFsaWQgc3RyaW5ncyAtIHRyZWF0IGFzICJub3Jt YWwiIHNwZWVkCglyZXR1cm4gdHlwZW9mIHNwZWVkID09PSAic3RyaW5nIiAmJiAh JC5lZmZlY3RzLmVmZmVjdFsgc3BlZWQgXTsKfQoKJC5mbi5leHRlbmQoewoJZWZm ZWN0OiBmdW5jdGlvbiggLyogZWZmZWN0LCBvcHRpb25zLCBzcGVlZCwgY2FsbGJh Y2sgKi8gKSB7CgkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5 KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJbW9kZSA9IGFyZ3MubW9kZSwKCQkJcXVl dWUgPSBhcmdzLnF1ZXVlLAoJCQllZmZlY3RNZXRob2QgPSAkLmVmZmVjdHMuZWZm ZWN0WyBhcmdzLmVmZmVjdCBdOwoKCQlpZiAoICQuZngub2ZmIHx8ICFlZmZlY3RN ZXRob2QgKSB7CgkJCS8vIGRlbGVnYXRlIHRvIHRoZSBvcmlnaW5hbCBtZXRob2Qg KGUuZy4sIC5zaG93KCkpIGlmIHBvc3NpYmxlCgkJCWlmICggbW9kZSApIHsKCQkJ CXJldHVybiB0aGlzWyBtb2RlIF0oIGFyZ3MuZHVyYXRpb24sIGFyZ3MuY29tcGxl dGUgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9u KCkgewoJCQkJCWlmICggYXJncy5jb21wbGV0ZSApIHsKCQkJCQkJYXJncy5jb21w bGV0ZS5jYWxsKCB0aGlzICk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9CgoJCWZ1 bmN0aW9uIHJ1biggbmV4dCApIHsKCQkJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJ CQljb21wbGV0ZSA9IGFyZ3MuY29tcGxldGUsCgkJCQltb2RlID0gYXJncy5tb2Rl OwoKCQkJZnVuY3Rpb24gZG9uZSgpIHsKCQkJCWlmICggJC5pc0Z1bmN0aW9uKCBj b21wbGV0ZSApICkgewoJCQkJCWNvbXBsZXRlLmNhbGwoIGVsZW1bMF0gKTsKCQkJ CX0KCQkJCWlmICggJC5pc0Z1bmN0aW9uKCBuZXh0ICkgKSB7CgkJCQkJbmV4dCgp OwoJCQkJfQoJCQl9CgoJCQkvLyBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZGVuIGFu ZCBtb2RlIGlzIGhpZGUsCgkJCS8vIG9yIGVsZW1lbnQgaXMgdmlzaWJsZSBhbmQg bW9kZSBpcyBzaG93CgkJCWlmICggZWxlbS5pcyggIjpoaWRkZW4iICkgPyBtb2Rl ID09PSAiaGlkZSIgOiBtb2RlID09PSAic2hvdyIgKSB7CgkJCQlkb25lKCk7CgkJ CX0gZWxzZSB7CgkJCQllZmZlY3RNZXRob2QuY2FsbCggZWxlbVswXSwgYXJncywg ZG9uZSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcXVldWUgPT09IGZhbHNlID8gdGhp cy5lYWNoKCBydW4gKSA6IHRoaXMucXVldWUoIHF1ZXVlIHx8ICJmeCIsIHJ1biAp OwoJfSwKCglfc2hvdzogJC5mbi5zaG93LAoJc2hvdzogZnVuY3Rpb24oIHNwZWVk ICkgewoJCWlmICggc3RhbmRhcmRTcGVlZCggc3BlZWQgKSApIHsKCQkJcmV0dXJu IHRoaXMuX3Nob3cuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0gZWxzZSB7 CgkJCXZhciBhcmdzID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5hcHBseSggdGhpcywg YXJndW1lbnRzICk7CgkJCWFyZ3MubW9kZSA9ICJzaG93IjsKCQkJcmV0dXJuIHRo aXMuZWZmZWN0LmNhbGwoIHRoaXMsIGFyZ3MgKTsKCQl9Cgl9LAoKCV9oaWRlOiAk LmZuLmhpZGUsCgloaWRlOiBmdW5jdGlvbiggc3BlZWQgKSB7CgkJaWYgKCBzdGFu ZGFyZFNwZWVkKCBzcGVlZCApICkgewoJCQlyZXR1cm4gdGhpcy5faGlkZS5hcHBs eSggdGhpcywgYXJndW1lbnRzICk7CgkJfSBlbHNlIHsKCQkJdmFyIGFyZ3MgPSBf bm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJ YXJncy5tb2RlID0gImhpZGUiOwoJCQlyZXR1cm4gdGhpcy5lZmZlY3QuY2FsbCgg dGhpcywgYXJncyApOwoJCX0KCX0sCgoJLy8galF1ZXJ5IGNvcmUgb3ZlcmxvYWRz IHRvZ2dsZSBhbmQgY3JlYXRlcyBfdG9nZ2xlCglfX3RvZ2dsZTogJC5mbi50b2dn bGUsCgl0b2dnbGU6IGZ1bmN0aW9uKCBzcGVlZCApIHsKCQlpZiAoIHN0YW5kYXJk U3BlZWQoIHNwZWVkICkgfHwgdHlwZW9mIHNwZWVkID09PSAiYm9vbGVhbiIgfHwg JC5pc0Z1bmN0aW9uKCBzcGVlZCApICkgewoJCQlyZXR1cm4gdGhpcy5fX3RvZ2ds ZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSBlbHNlIHsKCQkJdmFyIGFy Z3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMg KTsKCQkJYXJncy5tb2RlID0gInRvZ2dsZSI7CgkJCXJldHVybiB0aGlzLmVmZmVj dC5jYWxsKCB0aGlzLCBhcmdzICk7CgkJfQoJfSwKCgkvLyBoZWxwZXIgZnVuY3Rp b25zCgljc3NVbml0OiBmdW5jdGlvbihrZXkpIHsKCQl2YXIgc3R5bGUgPSB0aGlz LmNzcygga2V5ICksCgkJCXZhbCA9IFtdOwoKCQkkLmVhY2goIFsgImVtIiwgInB4 IiwgIiUiLCAicHQiIF0sIGZ1bmN0aW9uKCBpLCB1bml0ICkgewoJCQlpZiAoIHN0 eWxlLmluZGV4T2YoIHVuaXQgKSA+IDAgKSB7CgkJCQl2YWwgPSBbIHBhcnNlRmxv YXQoIHN0eWxlICksIHVuaXQgXTsKCQkJfQoJCX0pOwoJCXJldHVybiB2YWw7Cgl9 Cn0pOwoKfSkoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8q KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFQVNJTkcgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovCgooZnVuY3Rpb24oKSB7CgovLyBiYXNlZCBvbiBlYXNp bmcgZXF1YXRpb25zIGZyb20gUm9iZXJ0IFBlbm5lciAoaHR0cDovL3d3dy5yb2Jl cnRwZW5uZXIuY29tL2Vhc2luZykKCnZhciBiYXNlRWFzaW5ncyA9IHt9OwoKJC5l YWNoKCBbICJRdWFkIiwgIkN1YmljIiwgIlF1YXJ0IiwgIlF1aW50IiwgIkV4cG8i IF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJYmFzZUVhc2luZ3NbIG5hbWUgXSA9 IGZ1bmN0aW9uKCBwICkgewoJCXJldHVybiBNYXRoLnBvdyggcCwgaSArIDIgKTsK CX07Cn0pOwoKJC5leHRlbmQoIGJhc2VFYXNpbmdzLCB7CglTaW5lOiBmdW5jdGlv biAoIHAgKSB7CgkJcmV0dXJuIDEgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgLyAy ICk7Cgl9LAoJQ2lyYzogZnVuY3Rpb24gKCBwICkgewoJCXJldHVybiAxIC0gTWF0 aC5zcXJ0KCAxIC0gcCAqIHAgKTsKCX0sCglFbGFzdGljOiBmdW5jdGlvbiggcCAp IHsKCQlyZXR1cm4gcCA9PT0gMCB8fCBwID09PSAxID8gcCA6CgkJCS1NYXRoLnBv dyggMiwgOCAqIChwIC0gMSkgKSAqIE1hdGguc2luKCAoIChwIC0gMSkgKiA4MCAt IDcuNSApICogTWF0aC5QSSAvIDE1ICk7Cgl9LAoJQmFjazogZnVuY3Rpb24oIHAg KSB7CgkJcmV0dXJuIHAgKiBwICogKCAzICogcCAtIDIgKTsKCX0sCglCb3VuY2U6 IGZ1bmN0aW9uICggcCApIHsKCQl2YXIgcG93MiwKCQkJYm91bmNlID0gNDsKCgkJ d2hpbGUgKCBwIDwgKCAoIHBvdzIgPSBNYXRoLnBvdyggMiwgLS1ib3VuY2UgKSAp IC0gMSApIC8gMTEgKSB7fQoJCXJldHVybiAxIC8gTWF0aC5wb3coIDQsIDMgLSBi b3VuY2UgKSAtIDcuNTYyNSAqIE1hdGgucG93KCAoIHBvdzIgKiAzIC0gMiApIC8g MjIgLSBwLCAyICk7Cgl9Cn0pOwoKJC5lYWNoKCBiYXNlRWFzaW5ncywgZnVuY3Rp b24oIG5hbWUsIGVhc2VJbiApIHsKCSQuZWFzaW5nWyAiZWFzZUluIiArIG5hbWUg XSA9IGVhc2VJbjsKCSQuZWFzaW5nWyAiZWFzZU91dCIgKyBuYW1lIF0gPSBmdW5j dGlvbiggcCApIHsKCQlyZXR1cm4gMSAtIGVhc2VJbiggMSAtIHAgKTsKCX07Cgkk LmVhc2luZ1sgImVhc2VJbk91dCIgKyBuYW1lIF0gPSBmdW5jdGlvbiggcCApIHsK CQlyZXR1cm4gcCA8IDAuNSA/CgkJCWVhc2VJbiggcCAqIDIgKSAvIDIgOgoJCQkx IC0gZWFzZUluKCBwICogLTIgKyAyICkgLyAyOwoJfTsKfSk7Cgp9KSgpOwoKfSko alF1ZXJ5KSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciB1aWQg PSAwLAoJaGlkZVByb3BzID0ge30sCglzaG93UHJvcHMgPSB7fTsKCmhpZGVQcm9w cy5oZWlnaHQgPSBoaWRlUHJvcHMucGFkZGluZ1RvcCA9IGhpZGVQcm9wcy5wYWRk aW5nQm90dG9tID0KCWhpZGVQcm9wcy5ib3JkZXJUb3BXaWR0aCA9IGhpZGVQcm9w cy5ib3JkZXJCb3R0b21XaWR0aCA9ICJoaWRlIjsKc2hvd1Byb3BzLmhlaWdodCA9 IHNob3dQcm9wcy5wYWRkaW5nVG9wID0gc2hvd1Byb3BzLnBhZGRpbmdCb3R0b20g PQoJc2hvd1Byb3BzLmJvcmRlclRvcFdpZHRoID0gc2hvd1Byb3BzLmJvcmRlckJv dHRvbVdpZHRoID0gInNob3ciOwoKJC53aWRnZXQoICJ1aS5hY2NvcmRpb24iLCB7 Cgl2ZXJzaW9uOiAiMS4xMC4wIiwKCW9wdGlvbnM6IHsKCQlhY3RpdmU6IDAsCgkJ YW5pbWF0ZToge30sCgkJY29sbGFwc2libGU6IGZhbHNlLAoJCWV2ZW50OiAiY2xp Y2siLAoJCWhlYWRlcjogIj4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpl dmVuIiwKCQloZWlnaHRTdHlsZTogImF1dG8iLAoJCWljb25zOiB7CgkJCWFjdGl2 ZUhlYWRlcjogInVpLWljb24tdHJpYW5nbGUtMS1zIiwKCQkJaGVhZGVyOiAidWkt aWNvbi10cmlhbmdsZS0xLWUiCgkJfSwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZh dGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwKCX0sCgoJX2NyZWF0ZTog ZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdGhp cy5wcmV2U2hvdyA9IHRoaXMucHJldkhpZGUgPSAkKCk7CgkJdGhpcy5lbGVtZW50 LmFkZENsYXNzKCAidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVz ZXQiICkKCQkJLy8gQVJJQQoJCQkuYXR0ciggInJvbGUiLCAidGFibGlzdCIgKTsK CgkJLy8gZG9uJ3QgYWxsb3cgY29sbGFwc2libGU6IGZhbHNlIGFuZCBhY3RpdmU6 IGZhbHNlIC8gbnVsbAoJCWlmICggIW9wdGlvbnMuY29sbGFwc2libGUgJiYgKG9w dGlvbnMuYWN0aXZlID09PSBmYWxzZSB8fCBvcHRpb25zLmFjdGl2ZSA9PSBudWxs KSApIHsKCQkJb3B0aW9ucy5hY3RpdmUgPSAwOwoJCX0KCgkJdGhpcy5fcHJvY2Vz c1BhbmVscygpOwoJCS8vIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMKCQlpZiAoIG9w dGlvbnMuYWN0aXZlIDwgMCApIHsKCQkJb3B0aW9ucy5hY3RpdmUgKz0gdGhpcy5o ZWFkZXJzLmxlbmd0aDsKCQl9CgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfZ2V0 Q3JlYXRlRXZlbnREYXRhOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gewoJCQloZWFk ZXI6IHRoaXMuYWN0aXZlLAoJCQljb250ZW50OiAhdGhpcy5hY3RpdmUubGVuZ3Ro ID8gJCgpIDogdGhpcy5hY3RpdmUubmV4dCgpCgkJfTsKCX0sCgoJX2NyZWF0ZUlj b25zOiBmdW5jdGlvbigpIHsKCQl2YXIgaWNvbnMgPSB0aGlzLm9wdGlvbnMuaWNv bnM7CgkJaWYgKCBpY29ucyApIHsKCQkJJCggIjxzcGFuPiIgKQoJCQkJLmFkZENs YXNzKCAidWktYWNjb3JkaW9uLWhlYWRlci1pY29uIHVpLWljb24gIiArIGljb25z LmhlYWRlciApCgkJCQkucHJlcGVuZFRvKCB0aGlzLmhlYWRlcnMgKTsKCQkJdGhp cy5hY3RpdmUuY2hpbGRyZW4oICIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiAp CgkJCQkucmVtb3ZlQ2xhc3MoIGljb25zLmhlYWRlciApCgkJCQkuYWRkQ2xhc3Mo IGljb25zLmFjdGl2ZUhlYWRlciApOwoJCQl0aGlzLmhlYWRlcnMuYWRkQ2xhc3Mo ICJ1aS1hY2NvcmRpb24taWNvbnMiICk7CgkJfQoJfSwKCglfZGVzdHJveUljb25z OiBmdW5jdGlvbigpIHsKCQl0aGlzLmhlYWRlcnMKCQkJLnJlbW92ZUNsYXNzKCAi dWktYWNjb3JkaW9uLWljb25zIiApCgkJCS5jaGlsZHJlbiggIi51aS1hY2NvcmRp b24taGVhZGVyLWljb24iICkKCQkJCS5yZW1vdmUoKTsKCX0sCgoJX2Rlc3Ryb3k6 IGZ1bmN0aW9uKCkgewoJCXZhciBjb250ZW50czsKCgkJLy8gY2xlYW4gdXAgbWFp biBlbGVtZW50CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLWFj Y29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IiApCgkJCS5yZW1vdmVB dHRyKCAicm9sZSIgKTsKCgkJLy8gY2xlYW4gdXAgaGVhZGVycwoJCXRoaXMuaGVh ZGVycwoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWFj Y29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1k ZWZhdWx0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRp c2FibGVkIHVpLWNvcm5lci10b3AiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiAp CgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1zZWxlY3RlZCIgKQoJCQkucmVtb3ZlQXR0 ciggImFyaWEtY29udHJvbHMiICkKCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIg KQoJCQkuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmICggL151aS1hY2NvcmRpb24v LnRlc3QoIHRoaXMuaWQgKSApIHsKCQkJCQl0aGlzLnJlbW92ZUF0dHJpYnV0ZSgg ImlkIiApOwoJCQkJfQoJCQl9KTsKCQl0aGlzLl9kZXN0cm95SWNvbnMoKTsKCgkJ Ly8gY2xlYW4gdXAgY29udGVudCBwYW5lbHMKCQljb250ZW50cyA9IHRoaXMuaGVh ZGVycy5uZXh0KCkKCQkJLmNzcyggImRpc3BsYXkiLCAiIiApCgkJCS5yZW1vdmVB dHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtZXhwYW5kZWQiICkK CQkJLnJlbW92ZUF0dHIoICJhcmlhLWhpZGRlbiIgKQoJCQkucmVtb3ZlQXR0cigg ImFyaWEtbGFiZWxsZWRieSIgKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1oZWxwZXIt cmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS1hY2Nv cmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktc3Rh dGUtZGlzYWJsZWQiICkKCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC9e dWktYWNjb3JkaW9uLy50ZXN0KCB0aGlzLmlkICkgKSB7CgkJCQkJdGhpcy5yZW1v dmVBdHRyaWJ1dGUoICJpZCIgKTsKCQkJCX0KCQkJfSk7CgkJaWYgKCB0aGlzLm9w dGlvbnMuaGVpZ2h0U3R5bGUgIT09ICJjb250ZW50IiApIHsKCQkJY29udGVudHMu Y3NzKCAiaGVpZ2h0IiwgIiIgKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0 aW9uKCBrZXksIHZhbHVlICkgewoJCWlmICgga2V5ID09PSAiYWN0aXZlIiApIHsK CQkJLy8gX2FjdGl2YXRlKCkgd2lsbCBoYW5kbGUgaW52YWxpZCB2YWx1ZXMgYW5k IHVwZGF0ZSB0aGlzLm9wdGlvbnMKCQkJdGhpcy5fYWN0aXZhdGUoIHZhbHVlICk7 CgkJCXJldHVybjsKCQl9CgoJCWlmICgga2V5ID09PSAiZXZlbnQiICkgewoJCQlp ZiAoIHRoaXMub3B0aW9ucy5ldmVudCApIHsKCQkJCXRoaXMuX29mZiggdGhpcy5o ZWFkZXJzLCB0aGlzLm9wdGlvbnMuZXZlbnQgKTsKCQkJfQoJCQl0aGlzLl9zZXR1 cEV2ZW50cyggdmFsdWUgKTsKCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVl ICk7CgoJCS8vIHNldHRpbmcgY29sbGFwc2libGU6IGZhbHNlIHdoaWxlIGNvbGxh cHNlZDsgb3BlbiBmaXJzdCBwYW5lbAoJCWlmICgga2V5ID09PSAiY29sbGFwc2li bGUiICYmICF2YWx1ZSAmJiB0aGlzLm9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSAp IHsKCQkJdGhpcy5fYWN0aXZhdGUoIDAgKTsKCQl9CgoJCWlmICgga2V5ID09PSAi aWNvbnMiICkgewoJCQl0aGlzLl9kZXN0cm95SWNvbnMoKTsKCQkJaWYgKCB2YWx1 ZSApIHsKCQkJCXRoaXMuX2NyZWF0ZUljb25zKCk7CgkJCX0KCQl9CgoJCS8vICM1 MzMyIC0gb3BhY2l0eSBkb2Vzbid0IGNhc2NhZGUgdG8gcG9zaXRpb25lZCBlbGVt ZW50cyBpbiBJRQoJCS8vIHNvIHdlIG5lZWQgdG8gYWRkIHRoZSBkaXNhYmxlZCBj bGFzcyB0byB0aGUgaGVhZGVycyBhbmQgcGFuZWxzCgkJaWYgKCBrZXkgPT09ICJk aXNhYmxlZCIgKSB7CgkJCXRoaXMuaGVhZGVycy5hZGQoIHRoaXMuaGVhZGVycy5u ZXh0KCkgKQoJCQkJLnRvZ2dsZUNsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiLCAh IXZhbHVlICk7CgkJfQoJfSwKCglfa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkg ewoJCS8qanNoaW50IG1heGNvbXBsZXhpdHk6MTUqLwoJCWlmICggZXZlbnQuYWx0 S2V5IHx8IGV2ZW50LmN0cmxLZXkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBr ZXlDb2RlID0gJC51aS5rZXlDb2RlLAoJCQlsZW5ndGggPSB0aGlzLmhlYWRlcnMu bGVuZ3RoLAoJCQljdXJyZW50SW5kZXggPSB0aGlzLmhlYWRlcnMuaW5kZXgoIGV2 ZW50LnRhcmdldCApLAoJCQl0b0ZvY3VzID0gZmFsc2U7CgoJCXN3aXRjaCAoIGV2 ZW50LmtleUNvZGUgKSB7CgkJCWNhc2Uga2V5Q29kZS5SSUdIVDoKCQkJY2FzZSBr ZXlDb2RlLkRPV046CgkJCQl0b0ZvY3VzID0gdGhpcy5oZWFkZXJzWyAoIGN1cnJl bnRJbmRleCArIDEgKSAlIGxlbmd0aCBdOwoJCQkJYnJlYWs7CgkJCWNhc2Uga2V5 Q29kZS5MRUZUOgoJCQljYXNlIGtleUNvZGUuVVA6CgkJCQl0b0ZvY3VzID0gdGhp cy5oZWFkZXJzWyAoIGN1cnJlbnRJbmRleCAtIDEgKyBsZW5ndGggKSAlIGxlbmd0 aCBdOwoJCQkJYnJlYWs7CgkJCWNhc2Uga2V5Q29kZS5TUEFDRToKCQkJY2FzZSBr ZXlDb2RlLkVOVEVSOgoJCQkJdGhpcy5fZXZlbnRIYW5kbGVyKCBldmVudCApOwoJ CQkJYnJlYWs7CgkJCWNhc2Uga2V5Q29kZS5IT01FOgoJCQkJdG9Gb2N1cyA9IHRo aXMuaGVhZGVyc1sgMCBdOwoJCQkJYnJlYWs7CgkJCWNhc2Uga2V5Q29kZS5FTkQ6 CgkJCQl0b0ZvY3VzID0gdGhpcy5oZWFkZXJzWyBsZW5ndGggLSAxIF07CgkJCQli cmVhazsKCQl9CgoJCWlmICggdG9Gb2N1cyApIHsKCQkJJCggZXZlbnQudGFyZ2V0 ICkuYXR0ciggInRhYkluZGV4IiwgLTEgKTsKCQkJJCggdG9Gb2N1cyApLmF0dHIo ICJ0YWJJbmRleCIsIDAgKTsKCQkJdG9Gb2N1cy5mb2N1cygpOwoJCQlldmVudC5w cmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0sCgoJX3BhbmVsS2V5RG93biA6IGZ1bmN0 aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5 Q29kZS5VUCAmJiBldmVudC5jdHJsS2V5ICkgewoJCQkkKCBldmVudC5jdXJyZW50 VGFyZ2V0ICkucHJldigpLmZvY3VzKCk7CgkJfQoJfSwKCglyZWZyZXNoOiBmdW5j dGlvbigpIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLl9w cm9jZXNzUGFuZWxzKCk7CgoJCS8vIHdhcyBjb2xsYXBzZWQgb3Igbm8gcGFuZWwK CQlpZiAoICggb3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlICYmIG9wdGlvbnMuY29s bGFwc2libGUgPT09IHRydWUgKSB8fCAhdGhpcy5oZWFkZXJzLmxlbmd0aCApIHsK CQkJb3B0aW9ucy5hY3RpdmUgPSBmYWxzZTsKCQkJdGhpcy5hY3RpdmUgPSAkKCk7 CgkJLy8gYWN0aXZlIGZhbHNlIG9ubHkgd2hlbiBjb2xsYXBzaWJsZSBpcyB0cnVl CgkJfSBpZiAoIG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSApIHsKCQkJdGhpcy5f YWN0aXZhdGUoIDAgKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0aXZlIHBhbmVs IGlzIGdvbmUKCQl9IGVsc2UgaWYgKCB0aGlzLmFjdGl2ZS5sZW5ndGggJiYgISQu Y29udGFpbnMoIHRoaXMuZWxlbWVudFsgMCBdLCB0aGlzLmFjdGl2ZVsgMCBdICkg KSB7CgkJCS8vIGFsbCByZW1haW5pbmcgcGFuZWwgYXJlIGRpc2FibGVkCgkJCWlm ICggdGhpcy5oZWFkZXJzLmxlbmd0aCA9PT0gdGhpcy5oZWFkZXJzLmZpbmQoIi51 aS1zdGF0ZS1kaXNhYmxlZCIpLmxlbmd0aCApIHsKCQkJCW9wdGlvbnMuYWN0aXZl ID0gZmFsc2U7CgkJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkJLy8gYWN0aXZhdGUg cHJldmlvdXMgcGFuZWwKCQkJfSBlbHNlIHsKCQkJCXRoaXMuX2FjdGl2YXRlKCBN YXRoLm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICkgKTsKCQkJfQoJCS8vIHdh cyBhY3RpdmUsIGFjdGl2ZSBwYW5lbCBzdGlsbCBleGlzdHMKCQl9IGVsc2UgewoJ CQkvLyBtYWtlIHN1cmUgYWN0aXZlIGluZGV4IGlzIGNvcnJlY3QKCQkJb3B0aW9u cy5hY3RpdmUgPSB0aGlzLmhlYWRlcnMuaW5kZXgoIHRoaXMuYWN0aXZlICk7CgkJ fQoKCQl0aGlzLl9kZXN0cm95SWNvbnMoKTsKCgkJdGhpcy5fcmVmcmVzaCgpOwoJ fSwKCglfcHJvY2Vzc1BhbmVsczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWFkZXJz ID0gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5oZWFkZXIgKQoJCQku YWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1 aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiICk7CgoJCXRoaXMuaGVhZGVy cy5uZXh0KCkKCQkJLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWNvbnRlbnQgdWkt aGVscGVyLXJlc2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20i ICkKCQkJLmZpbHRlcigiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZl KSIpCgkJCS5oaWRlKCk7Cgl9LAoKCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl2 YXIgbWF4SGVpZ2h0LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQloZWln aHRTdHlsZSA9IG9wdGlvbnMuaGVpZ2h0U3R5bGUsCgkJCXBhcmVudCA9IHRoaXMu ZWxlbWVudC5wYXJlbnQoKSwKCQkJYWNjb3JkaW9uSWQgPSB0aGlzLmFjY29yZGlv bklkID0gInVpLWFjY29yZGlvbi0iICsKCQkJCSh0aGlzLmVsZW1lbnQuYXR0cigg ImlkIiApIHx8ICsrdWlkKTsKCgkJdGhpcy5hY3RpdmUgPSB0aGlzLl9maW5kQWN0 aXZlKCBvcHRpb25zLmFjdGl2ZSApCgkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlv bi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkudG9nZ2xlQ2xh c3MoICJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci10b3AiICk7CgkJdGhpcy5hY3Rp dmUubmV4dCgpCgkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1jb250ZW50LWFj dGl2ZSIgKQoJCQkuc2hvdygpOwoKCQl0aGlzLmhlYWRlcnMKCQkJLmF0dHIoICJy b2xlIiwgInRhYiIgKQoJCQkuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJCXZhciBo ZWFkZXIgPSAkKCB0aGlzICksCgkJCQkJaGVhZGVySWQgPSBoZWFkZXIuYXR0cigg ImlkIiApLAoJCQkJCXBhbmVsID0gaGVhZGVyLm5leHQoKSwKCQkJCQlwYW5lbElk ID0gcGFuZWwuYXR0ciggImlkIiApOwoJCQkJaWYgKCAhaGVhZGVySWQgKSB7CgkJ CQkJaGVhZGVySWQgPSBhY2NvcmRpb25JZCArICItaGVhZGVyLSIgKyBpOwoJCQkJ CWhlYWRlci5hdHRyKCAiaWQiLCBoZWFkZXJJZCApOwoJCQkJfQoJCQkJaWYgKCAh cGFuZWxJZCApIHsKCQkJCQlwYW5lbElkID0gYWNjb3JkaW9uSWQgKyAiLXBhbmVs LSIgKyBpOwoJCQkJCXBhbmVsLmF0dHIoICJpZCIsIHBhbmVsSWQgKTsKCQkJCX0K CQkJCWhlYWRlci5hdHRyKCAiYXJpYS1jb250cm9scyIsIHBhbmVsSWQgKTsKCQkJ CXBhbmVsLmF0dHIoICJhcmlhLWxhYmVsbGVkYnkiLCBoZWFkZXJJZCApOwoJCQl9 KQoJCQkubmV4dCgpCgkJCQkuYXR0ciggInJvbGUiLCAidGFicGFuZWwiICk7CgoJ CXRoaXMuaGVhZGVycwoJCQkubm90KCB0aGlzLmFjdGl2ZSApCgkJCS5hdHRyKHsK CQkJCSJhcmlhLXNlbGVjdGVkIjogImZhbHNlIiwKCQkJCXRhYkluZGV4OiAtMQoJ CQl9KQoJCQkubmV4dCgpCgkJCQkuYXR0cih7CgkJCQkJImFyaWEtZXhwYW5kZWQi OiAiZmFsc2UiLAoJCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCQkJfSkKCQkJ CS5oaWRlKCk7CgoJCS8vIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgaGVhZGVyIGlz IGluIHRoZSB0YWIgb3JkZXIKCQlpZiAoICF0aGlzLmFjdGl2ZS5sZW5ndGggKSB7 CgkJCXRoaXMuaGVhZGVycy5lcSggMCApLmF0dHIoICJ0YWJJbmRleCIsIDAgKTsK CQl9IGVsc2UgewoJCQl0aGlzLmFjdGl2ZS5hdHRyKHsKCQkJCSJhcmlhLXNlbGVj dGVkIjogInRydWUiLAoJCQkJdGFiSW5kZXg6IDAKCQkJfSkKCQkJLm5leHQoKQoJ CQkJLmF0dHIoewoJCQkJCSJhcmlhLWV4cGFuZGVkIjogInRydWUiLAoJCQkJCSJh cmlhLWhpZGRlbiI6ICJmYWxzZSIKCQkJCX0pOwoJCX0KCgkJdGhpcy5fY3JlYXRl SWNvbnMoKTsKCgkJdGhpcy5fc2V0dXBFdmVudHMoIG9wdGlvbnMuZXZlbnQgKTsK CgkJaWYgKCBoZWlnaHRTdHlsZSA9PT0gImZpbGwiICkgewoJCQltYXhIZWlnaHQg PSBwYXJlbnQuaGVpZ2h0KCk7CgkJCXRoaXMuZWxlbWVudC5zaWJsaW5ncyggIjp2 aXNpYmxlIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9ICQoIHRo aXMgKSwKCQkJCQlwb3NpdGlvbiA9IGVsZW0uY3NzKCAicG9zaXRpb24iICk7CgoJ CQkJaWYgKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0g ImZpeGVkIiApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQltYXhIZWlnaHQgLT0g ZWxlbS5vdXRlckhlaWdodCggdHJ1ZSApOwoJCQl9KTsKCgkJCXRoaXMuaGVhZGVy cy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJbWF4SGVpZ2h0IC09ICQoIHRoaXMgKS5v dXRlckhlaWdodCggdHJ1ZSApOwoJCQl9KTsKCgkJCXRoaXMuaGVhZGVycy5uZXh0 KCkKCQkJCS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQoIHRoaXMgKS5oZWlnaHQo IE1hdGgubWF4KCAwLCBtYXhIZWlnaHQgLQoJCQkJCQkkKCB0aGlzICkuaW5uZXJI ZWlnaHQoKSArICQoIHRoaXMgKS5oZWlnaHQoKSApICk7CgkJCQl9KQoJCQkJLmNz cyggIm92ZXJmbG93IiwgImF1dG8iICk7CgkJfSBlbHNlIGlmICggaGVpZ2h0U3R5 bGUgPT09ICJhdXRvIiApIHsKCQkJbWF4SGVpZ2h0ID0gMDsKCQkJdGhpcy5oZWFk ZXJzLm5leHQoKQoJCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJbWF4SGVpZ2h0 ID0gTWF0aC5tYXgoIG1heEhlaWdodCwgJCggdGhpcyApLmNzcyggImhlaWdodCIs ICIiICkuaGVpZ2h0KCkgKTsKCQkJCX0pCgkJCQkuaGVpZ2h0KCBtYXhIZWlnaHQg KTsKCQl9Cgl9LAoKCV9hY3RpdmF0ZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXZh ciBhY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBpbmRleCApWyAwIF07CgoJCS8v IHRyeWluZyB0byBhY3RpdmF0ZSB0aGUgYWxyZWFkeSBhY3RpdmUgcGFuZWwKCQlp ZiAoIGFjdGl2ZSA9PT0gdGhpcy5hY3RpdmVbIDAgXSApIHsKCQkJcmV0dXJuOwoJ CX0KCgkJLy8gdHJ5aW5nIHRvIGNvbGxhcHNlLCBzaW11bGF0ZSBhIGNsaWNrIG9u IHRoZSBjdXJyZW50bHkgYWN0aXZlIGhlYWRlcgoJCWFjdGl2ZSA9IGFjdGl2ZSB8 fCB0aGlzLmFjdGl2ZVsgMCBdOwoKCQl0aGlzLl9ldmVudEhhbmRsZXIoewoJCQl0 YXJnZXQ6IGFjdGl2ZSwKCQkJY3VycmVudFRhcmdldDogYWN0aXZlLAoJCQlwcmV2 ZW50RGVmYXVsdDogJC5ub29wCgkJfSk7Cgl9LAoKCV9maW5kQWN0aXZlOiBmdW5j dGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0g Im51bWJlciIgPyB0aGlzLmhlYWRlcnMuZXEoIHNlbGVjdG9yICkgOiAkKCk7Cgl9 LAoKCV9zZXR1cEV2ZW50czogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBldmVu dHMgPSB7CgkJCWtleWRvd246ICJfa2V5ZG93biIKCQl9OwoJCWlmICggZXZlbnQg KSB7CgkJCSQuZWFjaCggZXZlbnQuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGluZGV4 LCBldmVudE5hbWUgKSB7CgkJCQlldmVudHNbIGV2ZW50TmFtZSBdID0gIl9ldmVu dEhhbmRsZXIiOwoJCQl9KTsKCQl9CgoJCXRoaXMuX29mZiggdGhpcy5oZWFkZXJz LmFkZCggdGhpcy5oZWFkZXJzLm5leHQoKSApICk7CgkJdGhpcy5fb24oIHRoaXMu aGVhZGVycywgZXZlbnRzICk7CgkJdGhpcy5fb24oIHRoaXMuaGVhZGVycy5uZXh0 KCksIHsga2V5ZG93bjogIl9wYW5lbEtleURvd24iIH0pOwoJCXRoaXMuX2hvdmVy YWJsZSggdGhpcy5oZWFkZXJzICk7CgkJdGhpcy5fZm9jdXNhYmxlKCB0aGlzLmhl YWRlcnMgKTsKCX0sCgoJX2V2ZW50SGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkg ewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlhY3RpdmUgPSB0aGlz LmFjdGl2ZSwKCQkJY2xpY2tlZCA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwK CQkJY2xpY2tlZElzQWN0aXZlID0gY2xpY2tlZFsgMCBdID09PSBhY3RpdmVbIDAg XSwKCQkJY29sbGFwc2luZyA9IGNsaWNrZWRJc0FjdGl2ZSAmJiBvcHRpb25zLmNv bGxhcHNpYmxlLAoJCQl0b1Nob3cgPSBjb2xsYXBzaW5nID8gJCgpIDogY2xpY2tl ZC5uZXh0KCksCgkJCXRvSGlkZSA9IGFjdGl2ZS5uZXh0KCksCgkJCWV2ZW50RGF0 YSA9IHsKCQkJCW9sZEhlYWRlcjogYWN0aXZlLAoJCQkJb2xkUGFuZWw6IHRvSGlk ZSwKCQkJCW5ld0hlYWRlcjogY29sbGFwc2luZyA/ICQoKSA6IGNsaWNrZWQsCgkJ CQluZXdQYW5lbDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0 KCk7CgoJCWlmICgKCQkJCS8vIGNsaWNrIG9uIGFjdGl2ZSBoZWFkZXIsIGJ1dCBu b3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElzQWN0aXZlICYmICFvcHRpb25z LmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93IGNhbmNlbGluZyBhY3RpdmF0 aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZvcmVBY3RpdmF0ZSIsIGV2ZW50 LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJ b3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8gZmFsc2UgOiB0aGlzLmhlYWRl cnMuaW5kZXgoIGNsaWNrZWQgKTsKCgkJLy8gd2hlbiB0aGUgY2FsbCB0byAuX3Rv Z2dsZSgpIGNvbWVzIGFmdGVyIHRoZSBjbGFzcyBjaGFuZ2VzCgkJLy8gaXQgY2F1 c2VzIGEgdmVyeSBvZGQgYnVnIGluIElFIDggKHNlZSAjNjcyMCkKCQl0aGlzLmFj dGl2ZSA9IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IGNsaWNrZWQ7CgkJdGhpcy5f dG9nZ2xlKCBldmVudERhdGEgKTsKCgkJLy8gc3dpdGNoIGNsYXNzZXMKCQkvLyBj b3JuZXIgY2xhc3NlcyBvbiB0aGUgcHJldmlvdXNseSBhY3RpdmUgaGVhZGVyIHN0 YXkgYWZ0ZXIgdGhlIGFuaW1hdGlvbgoJCWFjdGl2ZS5yZW1vdmVDbGFzcyggInVp LWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQlp ZiAoIG9wdGlvbnMuaWNvbnMgKSB7CgkJCWFjdGl2ZS5jaGlsZHJlbiggIi51aS1h Y2NvcmRpb24taGVhZGVyLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggb3B0aW9u cy5pY29ucy5hY3RpdmVIZWFkZXIgKQoJCQkJLmFkZENsYXNzKCBvcHRpb25zLmlj b25zLmhlYWRlciApOwoJCX0KCgkJaWYgKCAhY2xpY2tlZElzQWN0aXZlICkgewoJ CQljbGlja2VkCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApCgkJ CQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0 ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIgKTsKCQkJaWYgKCBvcHRpb25zLmljb25z ICkgewoJCQkJY2xpY2tlZC5jaGlsZHJlbiggIi51aS1hY2NvcmRpb24taGVhZGVy LWljb24iICkKCQkJCQkucmVtb3ZlQ2xhc3MoIG9wdGlvbnMuaWNvbnMuaGVhZGVy ICkKCQkJCQkuYWRkQ2xhc3MoIG9wdGlvbnMuaWNvbnMuYWN0aXZlSGVhZGVyICk7 CgkJCX0KCgkJCWNsaWNrZWQKCQkJCS5uZXh0KCkKCQkJCS5hZGRDbGFzcyggInVp LWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKTsKCQl9Cgl9LAoKCV90b2dnbGU6 IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB0b1Nob3cgPSBkYXRhLm5ld1BhbmVs LAoJCQl0b0hpZGUgPSB0aGlzLnByZXZTaG93Lmxlbmd0aCA/IHRoaXMucHJldlNo b3cgOiBkYXRhLm9sZFBhbmVsOwoKCQkvLyBoYW5kbGUgYWN0aXZhdGluZyBhIHBh bmVsIGR1cmluZyB0aGUgYW5pbWF0aW9uIGZvciBhbm90aGVyIGFjdGl2YXRpb24K CQl0aGlzLnByZXZTaG93LmFkZCggdGhpcy5wcmV2SGlkZSApLnN0b3AoIHRydWUs IHRydWUgKTsKCQl0aGlzLnByZXZTaG93ID0gdG9TaG93OwoJCXRoaXMucHJldkhp ZGUgPSB0b0hpZGU7CgoJCWlmICggdGhpcy5vcHRpb25zLmFuaW1hdGUgKSB7CgkJ CXRoaXMuX2FuaW1hdGUoIHRvU2hvdywgdG9IaWRlLCBkYXRhICk7CgkJfSBlbHNl IHsKCQkJdG9IaWRlLmhpZGUoKTsKCQkJdG9TaG93LnNob3coKTsKCQkJdGhpcy5f dG9nZ2xlQ29tcGxldGUoIGRhdGEgKTsKCQl9CgoJCXRvSGlkZS5hdHRyKHsKCQkJ ImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkiYXJpYS1oaWRkZW4iOiAidHJ1 ZSIKCQl9KTsKCQl0b0hpZGUucHJldigpLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwg ImZhbHNlIiApOwoJCS8vIGlmIHdlJ3JlIHN3aXRjaGluZyBwYW5lbHMsIHJlbW92 ZSB0aGUgb2xkIGhlYWRlciBmcm9tIHRoZSB0YWIgb3JkZXIKCQkvLyBpZiB3ZSdy ZSBvcGVuaW5nIGZyb20gY29sbGFwc2VkIHN0YXRlLCByZW1vdmUgdGhlIHByZXZp b3VzIGhlYWRlciBmcm9tIHRoZSB0YWIgb3JkZXIKCQkvLyBpZiB3ZSdyZSBjb2xs YXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNvbGxhcHNpbmcgaGVhZGVyIGluIHRoZSB0 YWIgb3JkZXIKCQlpZiAoIHRvU2hvdy5sZW5ndGggJiYgdG9IaWRlLmxlbmd0aCAp IHsKCQkJdG9IaWRlLnByZXYoKS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0g ZWxzZSBpZiAoIHRvU2hvdy5sZW5ndGggKSB7CgkJCXRoaXMuaGVhZGVycy5maWx0 ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gJCggdGhpcyApLmF0dHIoICJ0YWJJ bmRleCIgKSA9PT0gMDsKCQkJfSkKCQkJLmF0dHIoICJ0YWJJbmRleCIsIC0xICk7 CgkJfQoKCQl0b1Nob3cKCQkJLmF0dHIoewoJCQkJImFyaWEtZXhwYW5kZWQiOiAi dHJ1ZSIsCgkJCQkiYXJpYS1oaWRkZW4iOiAiZmFsc2UiCgkJCX0pCgkJCS5wcmV2 KCkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJ CQl0YWJJbmRleDogMAoJCQkJfSk7Cgl9LAoKCV9hbmltYXRlOiBmdW5jdGlvbigg dG9TaG93LCB0b0hpZGUsIGRhdGEgKSB7CgkJdmFyIHRvdGFsLCBlYXNpbmcsIGR1 cmF0aW9uLAoJCQl0aGF0ID0gdGhpcywKCQkJYWRqdXN0ID0gMCwKCQkJZG93biA9 IHRvU2hvdy5sZW5ndGggJiYKCQkJCSggIXRvSGlkZS5sZW5ndGggfHwgKCB0b1No b3cuaW5kZXgoKSA8IHRvSGlkZS5pbmRleCgpICkgKSwKCQkJYW5pbWF0ZSA9IHRo aXMub3B0aW9ucy5hbmltYXRlIHx8IHt9LAoJCQlvcHRpb25zID0gZG93biAmJiBh bmltYXRlLmRvd24gfHwgYW5pbWF0ZSwKCQkJY29tcGxldGUgPSBmdW5jdGlvbigp IHsKCQkJCXRoYXQuX3RvZ2dsZUNvbXBsZXRlKCBkYXRhICk7CgkJCX07CgoJCWlm ICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlkdXJhdGlvbiA9 IG9wdGlvbnM7CgkJfQoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmci ICkgewoJCQllYXNpbmcgPSBvcHRpb25zOwoJCX0KCQkvLyBmYWxsIGJhY2sgZnJv bSBvcHRpb25zIHRvIGFuaW1hdGlvbiBpbiBjYXNlIG9mIHBhcnRpYWwgZG93biBz ZXR0aW5ncwoJCWVhc2luZyA9IGVhc2luZyB8fCBvcHRpb25zLmVhc2luZyB8fCBh bmltYXRlLmVhc2luZzsKCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG9wdGlvbnMu ZHVyYXRpb24gfHwgYW5pbWF0ZS5kdXJhdGlvbjsKCgkJaWYgKCAhdG9IaWRlLmxl bmd0aCApIHsKCQkJcmV0dXJuIHRvU2hvdy5hbmltYXRlKCBzaG93UHJvcHMsIGR1 cmF0aW9uLCBlYXNpbmcsIGNvbXBsZXRlICk7CgkJfQoJCWlmICggIXRvU2hvdy5s ZW5ndGggKSB7CgkJCXJldHVybiB0b0hpZGUuYW5pbWF0ZSggaGlkZVByb3BzLCBk dXJhdGlvbiwgZWFzaW5nLCBjb21wbGV0ZSApOwoJCX0KCgkJdG90YWwgPSB0b1No b3cuc2hvdygpLm91dGVySGVpZ2h0KCk7CgkJdG9IaWRlLmFuaW1hdGUoIGhpZGVQ cm9wcywgewoJCQlkdXJhdGlvbjogZHVyYXRpb24sCgkJCWVhc2luZzogZWFzaW5n LAoJCQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCWZ4Lm5vdyA9IE1h dGgucm91bmQoIG5vdyApOwoJCQl9CgkJfSk7CgkJdG9TaG93CgkJCS5oaWRlKCkK CQkJLmFuaW1hdGUoIHNob3dQcm9wcywgewoJCQkJZHVyYXRpb246IGR1cmF0aW9u LAoJCQkJZWFzaW5nOiBlYXNpbmcsCgkJCQljb21wbGV0ZTogY29tcGxldGUsCgkJ CQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCQlmeC5ub3cgPSBNYXRo LnJvdW5kKCBub3cgKTsKCQkJCQlpZiAoIGZ4LnByb3AgIT09ICJoZWlnaHQiICkg ewoJCQkJCQlhZGp1c3QgKz0gZngubm93OwoJCQkJCX0gZWxzZSBpZiAoIHRoYXQu b3B0aW9ucy5oZWlnaHRTdHlsZSAhPT0gImNvbnRlbnQiICkgewoJCQkJCQlmeC5u b3cgPSBNYXRoLnJvdW5kKCB0b3RhbCAtIHRvSGlkZS5vdXRlckhlaWdodCgpIC0g YWRqdXN0ICk7CgkJCQkJCWFkanVzdCA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9KTsK CX0sCgoJX3RvZ2dsZUNvbXBsZXRlOiBmdW5jdGlvbiggZGF0YSApIHsKCQl2YXIg dG9IaWRlID0gZGF0YS5vbGRQYW5lbDsKCgkJdG9IaWRlCgkJCS5yZW1vdmVDbGFz cyggInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIgKQoJCQkucHJldigpCgkJ CQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItdG9wIiApCgkJCQkuYWRkQ2xhc3Mo ICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBXb3JrIGFyb3VuZCBmb3IgcmVuZGVy aW5nIGJ1ZyBpbiBJRSAoIzU0MjEpCgkJaWYgKCB0b0hpZGUubGVuZ3RoICkgewoJ CQl0b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lID0gdG9IaWRlLnBhcmVudCgp WzBdLmNsYXNzTmFtZTsKCQl9CgoJCXRoaXMuX3RyaWdnZXIoICJhY3RpdmF0ZSIs IG51bGwsIGRhdGEgKTsKCX0KfSk7Cgp9KSggalF1ZXJ5ICk7CgooZnVuY3Rpb24o ICQsIHVuZGVmaW5lZCApIHsKCi8vIHVzZWQgdG8gcHJldmVudCByYWNlIGNvbmRp dGlvbnMgd2l0aCByZW1vdGUgZGF0YSBzb3VyY2VzCnZhciByZXF1ZXN0SW5kZXgg PSAwOwoKJC53aWRnZXQoICJ1aS5hdXRvY29tcGxldGUiLCB7Cgl2ZXJzaW9uOiAi MS4xMC4wIiwKCWRlZmF1bHRFbGVtZW50OiAiPGlucHV0PiIsCglvcHRpb25zOiB7 CgkJYXBwZW5kVG86IG51bGwsCgkJYXV0b0ZvY3VzOiBmYWxzZSwKCQlkZWxheTog MzAwLAoJCW1pbkxlbmd0aDogMSwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQg dG9wIiwKCQkJYXQ6ICJsZWZ0IGJvdHRvbSIsCgkJCWNvbGxpc2lvbjogIm5vbmUi CgkJfSwKCQlzb3VyY2U6IG51bGwsCgoJCS8vIGNhbGxiYWNrcwoJCWNoYW5nZTog bnVsbCwKCQljbG9zZTogbnVsbCwKCQlmb2N1czogbnVsbCwKCQlvcGVuOiBudWxs LAoJCXJlc3BvbnNlOiBudWxsLAoJCXNlYXJjaDogbnVsbCwKCQlzZWxlY3Q6IG51 bGwKCX0sCgoJcGVuZGluZzogMCwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQkv LyBTb21lIGJyb3dzZXJzIG9ubHkgcmVwZWF0IGtleWRvd24gZXZlbnRzLCBub3Qg a2V5cHJlc3MgZXZlbnRzLAoJCS8vIHNvIHdlIHVzZSB0aGUgc3VwcHJlc3NLZXlQ cmVzcyBmbGFnIHRvIGRldGVybWluZSBpZiB3ZSd2ZSBhbHJlYWR5CgkJLy8gaGFu ZGxlZCB0aGUga2V5ZG93biBldmVudC4gIzcyNjkKCQkvLyBVbmZvcnR1bmF0ZWx5 IHRoZSBjb2RlIGZvciAmIGluIGtleXByZXNzIGlzIHRoZSBzYW1lIGFzIHRoZSB1 cCBhcnJvdywKCQkvLyBzbyB3ZSB1c2UgdGhlIHN1cHByZXNzS2V5UHJlc3NSZXBl YXQgZmxhZyB0byBhdm9pZCBoYW5kbGluZyBrZXlwcmVzcwoJCS8vIGV2ZW50cyB3 aGVuIHdlIGtub3cgdGhlIGtleWRvd24gZXZlbnQgd2FzIHVzZWQgdG8gbW9kaWZ5 IHRoZQoJCS8vIHNlYXJjaCB0ZXJtLiAjNzc5OQoJCXZhciBzdXBwcmVzc0tleVBy ZXNzLCBzdXBwcmVzc0tleVByZXNzUmVwZWF0LCBzdXBwcmVzc0lucHV0OwoKCQl0 aGlzLmlzTXVsdGlMaW5lID0gdGhpcy5faXNNdWx0aUxpbmUoKTsKCQl0aGlzLnZh bHVlTWV0aG9kID0gdGhpcy5lbGVtZW50WyB0aGlzLmVsZW1lbnQuaXMoICJpbnB1 dCx0ZXh0YXJlYSIgKSA/ICJ2YWwiIDogInRleHQiIF07CgkJdGhpcy5pc05ld01l bnUgPSB0cnVlOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktYXV0 b2NvbXBsZXRlLWlucHV0IiApCgkJCS5hdHRyKCAiYXV0b2NvbXBsZXRlIiwgIm9m ZiIgKTsKCgkJdGhpcy5fb24oIHRoaXMuZWxlbWVudCwgewoJCQlrZXlkb3duOiBm dW5jdGlvbiggZXZlbnQgKSB7CgkJCQkvKmpzaGludCBtYXhjb21wbGV4aXR5OjE1 Ki8KCQkJCWlmICggdGhpcy5lbGVtZW50LnByb3AoICJyZWFkT25seSIgKSApIHsK CQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQlzdXBwcmVzc0lucHV0 ID0gdHJ1ZTsKCQkJCQlzdXBwcmVzc0tleVByZXNzUmVwZWF0ID0gdHJ1ZTsKCQkJ CQlyZXR1cm47CgkJCQl9CgoJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IGZhbHNlOwoJ CQkJc3VwcHJlc3NJbnB1dCA9IGZhbHNlOwoJCQkJc3VwcHJlc3NLZXlQcmVzc1Jl cGVhdCA9IGZhbHNlOwoJCQkJdmFyIGtleUNvZGUgPSAkLnVpLmtleUNvZGU7CgkJ CQlzd2l0Y2goIGV2ZW50LmtleUNvZGUgKSB7CgkJCQljYXNlIGtleUNvZGUuUEFH RV9VUDoKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQl0aGlzLl9t b3ZlKCAicHJldmlvdXNQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNh c2Uga2V5Q29kZS5QQUdFX0RPV046CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IHRy dWU7CgkJCQkJdGhpcy5fbW92ZSggIm5leHRQYWdlIiwgZXZlbnQgKTsKCQkJCQli cmVhazsKCQkJCWNhc2Uga2V5Q29kZS5VUDoKCQkJCQlzdXBwcmVzc0tleVByZXNz ID0gdHJ1ZTsKCQkJCQl0aGlzLl9rZXlFdmVudCggInByZXZpb3VzIiwgZXZlbnQg KTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQkJCXN1cHBy ZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXRoaXMuX2tleUV2ZW50KCAibmV4dCIs IGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuRU5URVI6CgkJ CQljYXNlIGtleUNvZGUuTlVNUEFEX0VOVEVSOgoJCQkJCS8vIHdoZW4gbWVudSBp cyBvcGVuIGFuZCBoYXMgZm9jdXMKCQkJCQlpZiAoIHRoaXMubWVudS5hY3RpdmUg KSB7CgkJCQkJCS8vICM2MDU1IC0gT3BlcmEgc3RpbGwgYWxsb3dzIHRoZSBrZXlw cmVzcyB0byBvY2N1cgoJCQkJCQkvLyB3aGljaCBjYXVzZXMgZm9ybXMgdG8gc3Vi bWl0CgkJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCQlldmVudC5w cmV2ZW50RGVmYXVsdCgpOwoJCQkJCQl0aGlzLm1lbnUuc2VsZWN0KCBldmVudCAp OwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5UQUI6CgkJCQkJ aWYgKCB0aGlzLm1lbnUuYWN0aXZlICkgewoJCQkJCQl0aGlzLm1lbnUuc2VsZWN0 KCBldmVudCApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5F U0NBUEU6CgkJCQkJaWYgKCB0aGlzLm1lbnUuZWxlbWVudC5pcyggIjp2aXNpYmxl IiApICkgewoJCQkJCQl0aGlzLl92YWx1ZSggdGhpcy50ZXJtICk7CgkJCQkJCXRo aXMuY2xvc2UoIGV2ZW50ICk7CgkJCQkJCS8vIERpZmZlcmVudCBicm93c2VycyBo YXZlIGRpZmZlcmVudCBkZWZhdWx0IGJlaGF2aW9yIGZvciBlc2NhcGUKCQkJCQkJ Ly8gU2luZ2xlIHByZXNzIGNhbiBtZWFuIHVuZG8gb3IgY2xlYXIKCQkJCQkJLy8g RG91YmxlIHByZXNzIGluIElFIG1lYW5zIGNsZWFyIHRoZSB3aG9sZSBmb3JtCgkJ CQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJ CQkJZGVmYXVsdDoKCQkJCQlzdXBwcmVzc0tleVByZXNzUmVwZWF0ID0gdHJ1ZTsK CQkJCQkvLyBzZWFyY2ggdGltZW91dCBzaG91bGQgYmUgdHJpZ2dlcmVkIGJlZm9y ZSB0aGUgaW5wdXQgdmFsdWUgaXMgY2hhbmdlZAoJCQkJCXRoaXMuX3NlYXJjaFRp bWVvdXQoIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0sCgkJCWtleXBy ZXNzOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHN1cHByZXNzS2V5UHJl c3MgKSB7CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IGZhbHNlOwoJCQkJCWV2ZW50 LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJaWYgKCBz dXBwcmVzc0tleVByZXNzUmVwZWF0ICkgewoJCQkJCXJldHVybjsKCQkJCX0KCgkJ CQkvLyByZXBsaWNhdGUgc29tZSBrZXkgaGFuZGxlcnMgdG8gYWxsb3cgdGhlbSB0 byByZXBlYXQgaW4gRmlyZWZveCBhbmQgT3BlcmEKCQkJCXZhciBrZXlDb2RlID0g JC51aS5rZXlDb2RlOwoJCQkJc3dpdGNoKCBldmVudC5rZXlDb2RlICkgewoJCQkJ Y2FzZSBrZXlDb2RlLlBBR0VfVVA6CgkJCQkJdGhpcy5fbW92ZSggInByZXZpb3Vz UGFnZSIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuUEFH RV9ET1dOOgoJCQkJCXRoaXMuX21vdmUoICJuZXh0UGFnZSIsIGV2ZW50ICk7CgkJ CQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuVVA6CgkJCQkJdGhpcy5fa2V5RXZl bnQoICJwcmV2aW91cyIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtl eUNvZGUuRE9XTjoKCQkJCQl0aGlzLl9rZXlFdmVudCggIm5leHQiLCBldmVudCAp OwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9LAoJCQlpbnB1dDogZnVuY3Rpb24oIGV2 ZW50ICkgewoJCQkJaWYgKCBzdXBwcmVzc0lucHV0ICkgewoJCQkJCXN1cHByZXNz SW5wdXQgPSBmYWxzZTsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJ CXJldHVybjsKCQkJCX0KCQkJCXRoaXMuX3NlYXJjaFRpbWVvdXQoIGV2ZW50ICk7 CgkJCX0sCgkJCWZvY3VzOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuc2VsZWN0ZWRJ dGVtID0gbnVsbDsKCQkJCXRoaXMucHJldmlvdXMgPSB0aGlzLl92YWx1ZSgpOwoJ CQl9LAoJCQlibHVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHRoaXMu Y2FuY2VsQmx1ciApIHsKCQkJCQlkZWxldGUgdGhpcy5jYW5jZWxCbHVyOwoJCQkJ CXJldHVybjsKCQkJCX0KCgkJCQljbGVhclRpbWVvdXQoIHRoaXMuc2VhcmNoaW5n ICk7CgkJCQl0aGlzLmNsb3NlKCBldmVudCApOwoJCQkJdGhpcy5fY2hhbmdlKCBl dmVudCApOwoJCQl9CgkJfSk7CgoJCXRoaXMuX2luaXRTb3VyY2UoKTsKCQl0aGlz Lm1lbnUgPSAkKCAiPHVsPiIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1hdXRvY29tcGxl dGUiICkKCQkJLmFwcGVuZFRvKCB0aGlzLl9hcHBlbmRUbygpICkKCQkJLm1lbnUo ewoJCQkJLy8gY3VzdG9tIGtleSBoYW5kbGluZyBmb3Igbm93CgkJCQlpbnB1dDog JCgpLAoJCQkJLy8gZGlzYWJsZSBBUklBIHN1cHBvcnQsIHRoZSBsaXZlIHJlZ2lv biB0YWtlcyBjYXJlIG9mIHRoYXQKCQkJCXJvbGU6IG51bGwKCQkJfSkKCQkJLnpJ bmRleCggdGhpcy5lbGVtZW50LnpJbmRleCgpICsgMSApCgkJCS5oaWRlKCkKCQkJ LmRhdGEoICJ1aS1tZW51IiApOwoKCQl0aGlzLl9vbiggdGhpcy5tZW51LmVsZW1l bnQsIHsKCQkJbW91c2Vkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkvLyBw cmV2ZW50IG1vdmluZyBmb2N1cyBvdXQgb2YgdGhlIHRleHQgZmllbGQKCQkJCWV2 ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCQkJLy8gSUUgZG9lc24ndCBwcmV2ZW50 IG1vdmluZyBmb2N1cyBldmVuIHdpdGggZXZlbnQucHJldmVudERlZmF1bHQoKQoJ CQkJLy8gc28gd2Ugc2V0IGEgZmxhZyB0byBrbm93IHdoZW4gd2Ugc2hvdWxkIGln bm9yZSB0aGUgYmx1ciBldmVudAoJCQkJdGhpcy5jYW5jZWxCbHVyID0gdHJ1ZTsK CQkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCWRlbGV0ZSB0aGlzLmNh bmNlbEJsdXI7CgkJCQl9KTsKCgkJCQkvLyBjbGlja2luZyBvbiB0aGUgc2Nyb2xs YmFyIGNhdXNlcyBmb2N1cyB0byBzaGlmdCB0byB0aGUgYm9keQoJCQkJLy8gYnV0 IHdlIGNhbid0IGRldGVjdCBhIG1vdXNldXAgb3IgYSBjbGljayBpbW1lZGlhdGVs eSBhZnRlcndhcmQKCQkJCS8vIHNvIHdlIGhhdmUgdG8gdHJhY2sgdGhlIG5leHQg bW91c2Vkb3duIGFuZCBjbG9zZSB0aGUgbWVudSBpZgoJCQkJLy8gdGhlIHVzZXIg Y2xpY2tzIHNvbWV3aGVyZSBvdXRzaWRlIG9mIHRoZSBhdXRvY29tcGxldGUKCQkJ CXZhciBtZW51RWxlbWVudCA9IHRoaXMubWVudS5lbGVtZW50WyAwIF07CgkJCQlp ZiAoICEkKCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCAiLnVpLW1lbnUtaXRlbSIg KS5sZW5ndGggKSB7CgkJCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJ CXZhciB0aGF0ID0gdGhpczsKCQkJCQkJdGhpcy5kb2N1bWVudC5vbmUoICJtb3Vz ZWRvd24iLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCQlpZiAoIGV2ZW50LnRh cmdldCAhPT0gdGhhdC5lbGVtZW50WyAwIF0gJiYKCQkJCQkJCQkJZXZlbnQudGFy Z2V0ICE9PSBtZW51RWxlbWVudCAmJgoJCQkJCQkJCQkhJC5jb250YWlucyggbWVu dUVsZW1lbnQsIGV2ZW50LnRhcmdldCApICkgewoJCQkJCQkJCXRoYXQuY2xvc2Uo KTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfSk7CgkJCQl9CgkJCX0sCgkJCW1l bnVmb2N1czogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCS8vICM3MDI0IC0g UHJldmVudCBhY2NpZGVudGFsIGFjdGl2YXRpb24gb2YgbWVudSBpdGVtcyBpbiBG aXJlZm94CgkJCQlpZiAoIHRoaXMuaXNOZXdNZW51ICkgewoJCQkJCXRoaXMuaXNO ZXdNZW51ID0gZmFsc2U7CgkJCQkJaWYgKCBldmVudC5vcmlnaW5hbEV2ZW50ICYm IC9ebW91c2UvLnRlc3QoIGV2ZW50Lm9yaWdpbmFsRXZlbnQudHlwZSApICkgewoJ CQkJCQl0aGlzLm1lbnUuYmx1cigpOwoKCQkJCQkJdGhpcy5kb2N1bWVudC5vbmUo ICJtb3VzZW1vdmUiLCBmdW5jdGlvbigpIHsKCQkJCQkJCSQoIGV2ZW50LnRhcmdl dCApLnRyaWdnZXIoIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKTsKCQkJCQkJfSk7CgoJ CQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfQoKCQkJCXZhciBpdGVtID0gdWkuaXRl bS5kYXRhKCAidWktYXV0b2NvbXBsZXRlLWl0ZW0iICk7CgkJCQlpZiAoIGZhbHNl ICE9PSB0aGlzLl90cmlnZ2VyKCAiZm9jdXMiLCBldmVudCwgeyBpdGVtOiBpdGVt IH0gKSApIHsKCQkJCQkvLyB1c2UgdmFsdWUgdG8gbWF0Y2ggd2hhdCB3aWxsIGVu ZCB1cCBpbiB0aGUgaW5wdXQsIGlmIGl0IHdhcyBhIGtleSBldmVudAoJCQkJCWlm ICggZXZlbnQub3JpZ2luYWxFdmVudCAmJiAvXmtleS8udGVzdCggZXZlbnQub3Jp Z2luYWxFdmVudC50eXBlICkgKSB7CgkJCQkJCXRoaXMuX3ZhbHVlKCBpdGVtLnZh bHVlICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkvLyBOb3JtYWxseSB0aGUg aW5wdXQgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGl0ZW0ncyB2YWx1ZSBhcyB0aGUK CQkJCQkvLyBtZW51IGlzIG5hdmlnYXRlZCwgY2F1c2luZyBzY3JlZW4gcmVhZGVy cyB0byBub3RpY2UgYSBjaGFuZ2UgYW5kCgkJCQkJLy8gYW5ub3VuY2UgdGhlIGl0 ZW0uIFNpbmNlIHRoZSBmb2N1cyBldmVudCB3YXMgY2FuY2VsZWQsIHRoaXMgZG9l c24ndAoJCQkJCS8vIGhhcHBlbiwgc28gd2UgdXBkYXRlIHRoZSBsaXZlIHJlZ2lv biBzbyB0aGF0IHNjcmVlbiByZWFkZXJzIGNhbgoJCQkJCS8vIHN0aWxsIG5vdGlj ZSB0aGUgY2hhbmdlIGFuZCBhbm5vdW5jZSBpdC4KCQkJCQl0aGlzLmxpdmVSZWdp b24udGV4dCggaXRlbS52YWx1ZSApOwoJCQkJfQoJCQl9LAoJCQltZW51c2VsZWN0 OiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJdmFyIGl0ZW0gPSB1aS5pdGVt LmRhdGEoICJ1aS1hdXRvY29tcGxldGUtaXRlbSIgKSwKCQkJCQlwcmV2aW91cyA9 IHRoaXMucHJldmlvdXM7CgoJCQkJLy8gb25seSB0cmlnZ2VyIHdoZW4gZm9jdXMg d2FzIGxvc3QgKGNsaWNrIG9uIG1lbnUpCgkJCQlpZiAoIHRoaXMuZWxlbWVudFsw XSAhPT0gdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ICkgewoJCQkJCXRo aXMuZWxlbWVudC5mb2N1cygpOwoJCQkJCXRoaXMucHJldmlvdXMgPSBwcmV2aW91 czsKCQkJCQkvLyAjNjEwOSAtIElFIHRyaWdnZXJzIHR3byBmb2N1cyBldmVudHMg YW5kIHRoZSBzZWNvbmQKCQkJCQkvLyBpcyBhc3luY2hyb25vdXMsIHNvIHdlIG5l ZWQgdG8gcmVzZXQgdGhlIHByZXZpb3VzCgkJCQkJLy8gdGVybSBzeW5jaHJvbm91 c2x5IGFuZCBhc3luY2hyb25vdXNseSA6LSgKCQkJCQl0aGlzLl9kZWxheShmdW5j dGlvbigpIHsKCQkJCQkJdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOwoJCQkJCQl0 aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07CgkJCQkJfSk7CgkJCQl9CgoJCQkJaWYg KCBmYWxzZSAhPT0gdGhpcy5fdHJpZ2dlciggInNlbGVjdCIsIGV2ZW50LCB7IGl0 ZW06IGl0ZW0gfSApICkgewoJCQkJCXRoaXMuX3ZhbHVlKCBpdGVtLnZhbHVlICk7 CgkJCQl9CgkJCQkvLyByZXNldCB0aGUgdGVybSBhZnRlciB0aGUgc2VsZWN0IGV2 ZW50CgkJCQkvLyB0aGlzIGFsbG93cyBjdXN0b20gc2VsZWN0IGhhbmRsaW5nIHRv IHdvcmsgcHJvcGVybHkKCQkJCXRoaXMudGVybSA9IHRoaXMuX3ZhbHVlKCk7CgoJ CQkJdGhpcy5jbG9zZSggZXZlbnQgKTsKCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0g aXRlbTsKCQkJfQoJCX0pOwoKCQl0aGlzLmxpdmVSZWdpb24gPSAkKCAiPHNwYW4+ IiwgewoJCQkJcm9sZTogInN0YXR1cyIsCgkJCQkiYXJpYS1saXZlIjogInBvbGl0 ZSIKCQkJfSkKCQkJLmFkZENsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3Np YmxlIiApCgkJCS5pbnNlcnRBZnRlciggdGhpcy5lbGVtZW50ICk7CgoJCS8vIHR1 cm5pbmcgb2ZmIGF1dG9jb21wbGV0ZSBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9t IHJlbWVtYmVyaW5nIHRoZQoJCS8vIHZhbHVlIHdoZW4gbmF2aWdhdGluZyB0aHJv dWdoIGhpc3RvcnksIHNvIHdlIHJlLWVuYWJsZSBhdXRvY29tcGxldGUKCQkvLyBp ZiB0aGUgcGFnZSBpcyB1bmxvYWRlZCBiZWZvcmUgdGhlIHdpZGdldCBpcyBkZXN0 cm95ZWQuICM3NzkwCgkJdGhpcy5fb24oIHRoaXMud2luZG93LCB7CgkJCWJlZm9y ZXVubG9hZDogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQXR0 ciggImF1dG9jb21wbGV0ZSIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZGVzdHJveTog ZnVuY3Rpb24oKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnNlYXJjaGluZyApOwoJ CXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hdXRvY29tcGxldGUt aW5wdXQiICkKCQkJLnJlbW92ZUF0dHIoICJhdXRvY29tcGxldGUiICk7CgkJdGhp cy5tZW51LmVsZW1lbnQucmVtb3ZlKCk7CgkJdGhpcy5saXZlUmVnaW9uLnJlbW92 ZSgpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsK CQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJCWlmICgga2V5ID09PSAic291 cmNlIiApIHsKCQkJdGhpcy5faW5pdFNvdXJjZSgpOwoJCX0KCQlpZiAoIGtleSA9 PT0gImFwcGVuZFRvIiApIHsKCQkJdGhpcy5tZW51LmVsZW1lbnQuYXBwZW5kVG8o IHRoaXMuX2FwcGVuZFRvKCkgKTsKCQl9CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxl ZCIgJiYgdmFsdWUgJiYgdGhpcy54aHIgKSB7CgkJCXRoaXMueGhyLmFib3J0KCk7 CgkJfQoJfSwKCglfYXBwZW5kVG86IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtZW50 ID0gdGhpcy5vcHRpb25zLmFwcGVuZFRvOwoKCQlpZiAoIGVsZW1lbnQgKSB7CgkJ CWVsZW1lbnQgPSBlbGVtZW50LmpxdWVyeSB8fCBlbGVtZW50Lm5vZGVUeXBlID8K CQkJCSQoIGVsZW1lbnQgKSA6CgkJCQl0aGlzLmRvY3VtZW50LmZpbmQoIGVsZW1l bnQgKS5lcSggMCApOwoJCX0KCgkJaWYgKCAhZWxlbWVudCApIHsKCQkJZWxlbWVu dCA9IHRoaXMuZWxlbWVudC5jbG9zZXN0KCAiLnVpLWZyb250IiApOwoJCX0KCgkJ aWYgKCAhZWxlbWVudC5sZW5ndGggKSB7CgkJCWVsZW1lbnQgPSB0aGlzLmRvY3Vt ZW50WzBdLmJvZHk7CgkJfQoKCQlyZXR1cm4gZWxlbWVudDsKCX0sCgoJX2lzTXVs dGlMaW5lOiBmdW5jdGlvbigpIHsKCQkvLyBUZXh0YXJlYXMgYXJlIGFsd2F5cyBt dWx0aS1saW5lCgkJaWYgKCB0aGlzLmVsZW1lbnQuaXMoICJ0ZXh0YXJlYSIgKSAp IHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCS8vIElucHV0cyBhcmUgYWx3YXlzIHNp bmdsZS1saW5lLCBldmVuIGlmIGluc2lkZSBhIGNvbnRlbnRFZGl0YWJsZSBlbGVt ZW50CgkJLy8gSUUgYWxzbyB0cmVhdHMgaW5wdXRzIGFzIGNvbnRlbnRFZGl0YWJs ZQoJCWlmICggdGhpcy5lbGVtZW50LmlzKCAiaW5wdXQiICkgKSB7CgkJCXJldHVy biBmYWxzZTsKCQl9CgkJLy8gQWxsIG90aGVyIGVsZW1lbnQgdHlwZXMgYXJlIGRl dGVybWluZWQgYnkgd2hldGhlciBvciBub3QgdGhleSdyZSBjb250ZW50RWRpdGFi bGUKCQlyZXR1cm4gdGhpcy5lbGVtZW50LnByb3AoICJpc0NvbnRlbnRFZGl0YWJs ZSIgKTsKCX0sCgoJX2luaXRTb3VyY2U6IGZ1bmN0aW9uKCkgewoJCXZhciBhcnJh eSwgdXJsLAoJCQl0aGF0ID0gdGhpczsKCQlpZiAoICQuaXNBcnJheSh0aGlzLm9w dGlvbnMuc291cmNlKSApIHsKCQkJYXJyYXkgPSB0aGlzLm9wdGlvbnMuc291cmNl OwoJCQl0aGlzLnNvdXJjZSA9IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSAp IHsKCQkJCXJlc3BvbnNlKCAkLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoIGFycmF5 LCByZXF1ZXN0LnRlcm0gKSApOwoJCQl9OwoJCX0gZWxzZSBpZiAoIHR5cGVvZiB0 aGlzLm9wdGlvbnMuc291cmNlID09PSAic3RyaW5nIiApIHsKCQkJdXJsID0gdGhp cy5vcHRpb25zLnNvdXJjZTsKCQkJdGhpcy5zb3VyY2UgPSBmdW5jdGlvbiggcmVx dWVzdCwgcmVzcG9uc2UgKSB7CgkJCQlpZiAoIHRoYXQueGhyICkgewoJCQkJCXRo YXQueGhyLmFib3J0KCk7CgkJCQl9CgkJCQl0aGF0LnhociA9ICQuYWpheCh7CgkJ CQkJdXJsOiB1cmwsCgkJCQkJZGF0YTogcmVxdWVzdCwKCQkJCQlkYXRhVHlwZTog Impzb24iLAoJCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJCQly ZXNwb25zZSggZGF0YSApOwoJCQkJCX0sCgkJCQkJZXJyb3I6IGZ1bmN0aW9uKCkg ewoJCQkJCQlyZXNwb25zZSggW10gKTsKCQkJCQl9CgkJCQl9KTsKCQkJfTsKCQl9 IGVsc2UgewoJCQl0aGlzLnNvdXJjZSA9IHRoaXMub3B0aW9ucy5zb3VyY2U7CgkJ fQoJfSwKCglfc2VhcmNoVGltZW91dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWNs ZWFyVGltZW91dCggdGhpcy5zZWFyY2hpbmcgKTsKCQl0aGlzLnNlYXJjaGluZyA9 IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkvLyBvbmx5IHNlYXJjaCBpZiB0 aGUgdmFsdWUgaGFzIGNoYW5nZWQKCQkJaWYgKCB0aGlzLnRlcm0gIT09IHRoaXMu X3ZhbHVlKCkgKSB7CgkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CgkJCQl0 aGlzLnNlYXJjaCggbnVsbCwgZXZlbnQgKTsKCQkJfQoJCX0sIHRoaXMub3B0aW9u cy5kZWxheSApOwoJfSwKCglzZWFyY2g6IGZ1bmN0aW9uKCB2YWx1ZSwgZXZlbnQg KSB7CgkJdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiB0aGlzLl92YWx1 ZSgpOwoKCQkvLyBhbHdheXMgc2F2ZSB0aGUgYWN0dWFsIHZhbHVlLCBub3QgdGhl IG9uZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQKCQl0aGlzLnRlcm0gPSB0aGlzLl92 YWx1ZSgpOwoKCQlpZiAoIHZhbHVlLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5taW5M ZW5ndGggKSB7CgkJCXJldHVybiB0aGlzLmNsb3NlKCBldmVudCApOwoJCX0KCgkJ aWYgKCB0aGlzLl90cmlnZ2VyKCAic2VhcmNoIiwgZXZlbnQgKSA9PT0gZmFsc2Ug KSB7CgkJCXJldHVybjsKCQl9CgoJCXJldHVybiB0aGlzLl9zZWFyY2goIHZhbHVl ICk7Cgl9LAoKCV9zZWFyY2g6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl0aGlzLnBl bmRpbmcrKzsKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1hdXRvY29tcGxl dGUtbG9hZGluZyIgKTsKCQl0aGlzLmNhbmNlbFNlYXJjaCA9IGZhbHNlOwoKCQl0 aGlzLnNvdXJjZSggeyB0ZXJtOiB2YWx1ZSB9LCB0aGlzLl9yZXNwb25zZSgpICk7 Cgl9LAoKCV9yZXNwb25zZTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlz LAoJCQlpbmRleCA9ICsrcmVxdWVzdEluZGV4OwoKCQlyZXR1cm4gZnVuY3Rpb24o IGNvbnRlbnQgKSB7CgkJCWlmICggaW5kZXggPT09IHJlcXVlc3RJbmRleCApIHsK CQkJCXRoYXQuX19yZXNwb25zZSggY29udGVudCApOwoJCQl9CgoJCQl0aGF0LnBl bmRpbmctLTsKCQkJaWYgKCAhdGhhdC5wZW5kaW5nICkgewoJCQkJdGhhdC5lbGVt ZW50LnJlbW92ZUNsYXNzKCAidWktYXV0b2NvbXBsZXRlLWxvYWRpbmciICk7CgkJ CX0KCQl9OwoJfSwKCglfX3Jlc3BvbnNlOiBmdW5jdGlvbiggY29udGVudCApIHsK CQlpZiAoIGNvbnRlbnQgKSB7CgkJCWNvbnRlbnQgPSB0aGlzLl9ub3JtYWxpemUo IGNvbnRlbnQgKTsKCQl9CgkJdGhpcy5fdHJpZ2dlciggInJlc3BvbnNlIiwgbnVs bCwgeyBjb250ZW50OiBjb250ZW50IH0gKTsKCQlpZiAoICF0aGlzLm9wdGlvbnMu ZGlzYWJsZWQgJiYgY29udGVudCAmJiBjb250ZW50Lmxlbmd0aCAmJiAhdGhpcy5j YW5jZWxTZWFyY2ggKSB7CgkJCXRoaXMuX3N1Z2dlc3QoIGNvbnRlbnQgKTsKCQkJ dGhpcy5fdHJpZ2dlciggIm9wZW4iICk7CgkJfSBlbHNlIHsKCQkJLy8gdXNlIC5f Y2xvc2UoKSBpbnN0ZWFkIG9mIC5jbG9zZSgpIHNvIHdlIGRvbid0IGNhbmNlbCBm dXR1cmUgc2VhcmNoZXMKCQkJdGhpcy5fY2xvc2UoKTsKCQl9Cgl9LAoKCWNsb3Nl OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdGhpcy5jYW5jZWxTZWFyY2ggPSB0cnVl OwoJCXRoaXMuX2Nsb3NlKCBldmVudCApOwoJfSwKCglfY2xvc2U6IGZ1bmN0aW9u KCBldmVudCApIHsKCQlpZiAoIHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2li bGUiICkgKSB7CgkJCXRoaXMubWVudS5lbGVtZW50LmhpZGUoKTsKCQkJdGhpcy5t ZW51LmJsdXIoKTsKCQkJdGhpcy5pc05ld01lbnUgPSB0cnVlOwoJCQl0aGlzLl90 cmlnZ2VyKCAiY2xvc2UiLCBldmVudCApOwoJCX0KCX0sCgoJX2NoYW5nZTogZnVu Y3Rpb24oIGV2ZW50ICkgewoJCWlmICggdGhpcy5wcmV2aW91cyAhPT0gdGhpcy5f dmFsdWUoKSApIHsKCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIsIGV2ZW50LCB7 IGl0ZW06IHRoaXMuc2VsZWN0ZWRJdGVtIH0gKTsKCQl9Cgl9LAoKCV9ub3JtYWxp emU6IGZ1bmN0aW9uKCBpdGVtcyApIHsKCQkvLyBhc3N1bWUgYWxsIGl0ZW1zIGhh dmUgdGhlIHJpZ2h0IGZvcm1hdCB3aGVuIHRoZSBmaXJzdCBpdGVtIGlzIGNvbXBs ZXRlCgkJaWYgKCBpdGVtcy5sZW5ndGggJiYgaXRlbXNbMF0ubGFiZWwgJiYgaXRl bXNbMF0udmFsdWUgKSB7CgkJCXJldHVybiBpdGVtczsKCQl9CgkJcmV0dXJuICQu bWFwKCBpdGVtcywgZnVuY3Rpb24oIGl0ZW0gKSB7CgkJCWlmICggdHlwZW9mIGl0 ZW0gPT09ICJzdHJpbmciICkgewoJCQkJcmV0dXJuIHsKCQkJCQlsYWJlbDogaXRl bSwKCQkJCQl2YWx1ZTogaXRlbQoJCQkJfTsKCQkJfQoJCQlyZXR1cm4gJC5leHRl bmQoewoJCQkJbGFiZWw6IGl0ZW0ubGFiZWwgfHwgaXRlbS52YWx1ZSwKCQkJCXZh bHVlOiBpdGVtLnZhbHVlIHx8IGl0ZW0ubGFiZWwKCQkJfSwgaXRlbSApOwoJCX0p OwoJfSwKCglfc3VnZ2VzdDogZnVuY3Rpb24oIGl0ZW1zICkgewoJCXZhciB1bCA9 IHRoaXMubWVudS5lbGVtZW50CgkJCS5lbXB0eSgpCgkJCS56SW5kZXgoIHRoaXMu ZWxlbWVudC56SW5kZXgoKSArIDEgKTsKCQl0aGlzLl9yZW5kZXJNZW51KCB1bCwg aXRlbXMgKTsKCQl0aGlzLm1lbnUucmVmcmVzaCgpOwoKCQkvLyBzaXplIGFuZCBw b3NpdGlvbiBtZW51CgkJdWwuc2hvdygpOwoJCXRoaXMuX3Jlc2l6ZU1lbnUoKTsK CQl1bC5wb3NpdGlvbiggJC5leHRlbmQoewoJCQlvZjogdGhpcy5lbGVtZW50CgkJ fSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uICkpOwoKCQlpZiAoIHRoaXMub3B0aW9u cy5hdXRvRm9jdXMgKSB7CgkJCXRoaXMubWVudS5uZXh0KCk7CgkJfQoJfSwKCglf cmVzaXplTWVudTogZnVuY3Rpb24oKSB7CgkJdmFyIHVsID0gdGhpcy5tZW51LmVs ZW1lbnQ7CgkJdWwub3V0ZXJXaWR0aCggTWF0aC5tYXgoCgkJCS8vIEZpcmVmb3gg d3JhcHMgbG9uZyB0ZXh0IChwb3NzaWJseSBhIHJvdW5kaW5nIGJ1ZykKCQkJLy8g c28gd2UgYWRkIDFweCB0byBhdm9pZCB0aGUgd3JhcHBpbmcgKCM3NTEzKQoJCQl1 bC53aWR0aCggIiIgKS5vdXRlcldpZHRoKCkgKyAxLAoJCQl0aGlzLmVsZW1lbnQu b3V0ZXJXaWR0aCgpCgkJKSApOwoJfSwKCglfcmVuZGVyTWVudTogZnVuY3Rpb24o IHVsLCBpdGVtcyApIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgkJJC5lYWNoKCBpdGVt cywgZnVuY3Rpb24oIGluZGV4LCBpdGVtICkgewoJCQl0aGF0Ll9yZW5kZXJJdGVt RGF0YSggdWwsIGl0ZW0gKTsKCQl9KTsKCX0sCgoJX3JlbmRlckl0ZW1EYXRhOiBm dW5jdGlvbiggdWwsIGl0ZW0gKSB7CgkJcmV0dXJuIHRoaXMuX3JlbmRlckl0ZW0o IHVsLCBpdGVtICkuZGF0YSggInVpLWF1dG9jb21wbGV0ZS1pdGVtIiwgaXRlbSAp OwoJfSwKCglfcmVuZGVySXRlbTogZnVuY3Rpb24oIHVsLCBpdGVtICkgewoJCXJl dHVybiAkKCAiPGxpPiIgKQoJCQkuYXBwZW5kKCAkKCAiPGE+IiApLnRleHQoIGl0 ZW0ubGFiZWwgKSApCgkJCS5hcHBlbmRUbyggdWwgKTsKCX0sCgoJX21vdmU6IGZ1 bmN0aW9uKCBkaXJlY3Rpb24sIGV2ZW50ICkgewoJCWlmICggIXRoaXMubWVudS5l bGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMuc2VhcmNoKCBudWxs LCBldmVudCApOwoJCQlyZXR1cm47CgkJfQoJCWlmICggdGhpcy5tZW51LmlzRmly c3RJdGVtKCkgJiYgL15wcmV2aW91cy8udGVzdCggZGlyZWN0aW9uICkgfHwKCQkJ CXRoaXMubWVudS5pc0xhc3RJdGVtKCkgJiYgL15uZXh0Ly50ZXN0KCBkaXJlY3Rp b24gKSApIHsKCQkJdGhpcy5fdmFsdWUoIHRoaXMudGVybSApOwoJCQl0aGlzLm1l bnUuYmx1cigpOwoJCQlyZXR1cm47CgkJfQoJCXRoaXMubWVudVsgZGlyZWN0aW9u IF0oIGV2ZW50ICk7Cgl9LAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJu IHRoaXMubWVudS5lbGVtZW50OwoJfSwKCglfdmFsdWU6IGZ1bmN0aW9uKCkgewoJ CXJldHVybiB0aGlzLnZhbHVlTWV0aG9kLmFwcGx5KCB0aGlzLmVsZW1lbnQsIGFy Z3VtZW50cyApOwoJfSwKCglfa2V5RXZlbnQ6IGZ1bmN0aW9uKCBrZXlFdmVudCwg ZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5pc011bHRpTGluZSB8fCB0aGlzLm1lbnUu ZWxlbWVudC5pcyggIjp2aXNpYmxlIiApICkgewoJCQl0aGlzLl9tb3ZlKCBrZXlF dmVudCwgZXZlbnQgKTsKCgkJCS8vIHByZXZlbnRzIG1vdmluZyBjdXJzb3IgdG8g YmVnaW5uaW5nL2VuZCBvZiB0aGUgdGV4dCBmaWVsZCBpbiBzb21lIGJyb3dzZXJz CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfQp9KTsKCiQuZXh0ZW5k KCAkLnVpLmF1dG9jb21wbGV0ZSwgewoJZXNjYXBlUmVnZXg6IGZ1bmN0aW9uKCB2 YWx1ZSApIHsKCQlyZXR1cm4gdmFsdWUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8u LFxcXF4kfCNcc10vZywgIlxcJCYiKTsKCX0sCglmaWx0ZXI6IGZ1bmN0aW9uKGFy cmF5LCB0ZXJtKSB7CgkJdmFyIG1hdGNoZXIgPSBuZXcgUmVnRXhwKCAkLnVpLmF1 dG9jb21wbGV0ZS5lc2NhcGVSZWdleCh0ZXJtKSwgImkiICk7CgkJcmV0dXJuICQu Z3JlcCggYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7CgkJCXJldHVybiBtYXRjaGVy LnRlc3QoIHZhbHVlLmxhYmVsIHx8IHZhbHVlLnZhbHVlIHx8IHZhbHVlICk7CgkJ fSk7Cgl9Cn0pOwoKCi8vIGxpdmUgcmVnaW9uIGV4dGVuc2lvbiwgYWRkaW5nIGEg YG1lc3NhZ2VzYCBvcHRpb24KLy8gTk9URTogVGhpcyBpcyBhbiBleHBlcmltZW50 YWwgQVBJLiBXZSBhcmUgc3RpbGwgaW52ZXN0aWdhdGluZwovLyBhIGZ1bGwgc29s dXRpb24gZm9yIHN0cmluZyBtYW5pcHVsYXRpb24gYW5kIGludGVybmF0aW9uYWxp emF0aW9uLgokLndpZGdldCggInVpLmF1dG9jb21wbGV0ZSIsICQudWkuYXV0b2Nv bXBsZXRlLCB7CglvcHRpb25zOiB7CgkJbWVzc2FnZXM6IHsKCQkJbm9SZXN1bHRz OiAiTm8gc2VhcmNoIHJlc3VsdHMuIiwKCQkJcmVzdWx0czogZnVuY3Rpb24oIGFt b3VudCApIHsKCQkJCXJldHVybiBhbW91bnQgKyAoIGFtb3VudCA+IDEgPyAiIHJl c3VsdHMgYXJlIiA6ICIgcmVzdWx0IGlzIiApICsKCQkJCQkiIGF2YWlsYWJsZSwg dXNlIHVwIGFuZCBkb3duIGFycm93IGtleXMgdG8gbmF2aWdhdGUuIjsKCQkJfQoJ CX0KCX0sCgoJX19yZXNwb25zZTogZnVuY3Rpb24oIGNvbnRlbnQgKSB7CgkJdmFy IG1lc3NhZ2U7CgkJdGhpcy5fc3VwZXJBcHBseSggYXJndW1lbnRzICk7CgkJaWYg KCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgfHwgdGhpcy5jYW5jZWxTZWFyY2ggKSB7 CgkJCXJldHVybjsKCQl9CgkJaWYgKCBjb250ZW50ICYmIGNvbnRlbnQubGVuZ3Ro ICkgewoJCQltZXNzYWdlID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VzLnJlc3VsdHMo IGNvbnRlbnQubGVuZ3RoICk7CgkJfSBlbHNlIHsKCQkJbWVzc2FnZSA9IHRoaXMu b3B0aW9ucy5tZXNzYWdlcy5ub1Jlc3VsdHM7CgkJfQoJCXRoaXMubGl2ZVJlZ2lv bi50ZXh0KCBtZXNzYWdlICk7Cgl9Cn0pOwoKfSggalF1ZXJ5ICkpOwoKKGZ1bmN0 aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgbGFzdEFjdGl2ZSwgc3RhcnRYUG9z LCBzdGFydFlQb3MsIGNsaWNrRHJhZ2dlZCwKCWJhc2VDbGFzc2VzID0gInVpLWJ1 dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiwK CXN0YXRlQ2xhc3NlcyA9ICJ1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1hY3RpdmUg IiwKCXR5cGVDbGFzc2VzID0gInVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRv bi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQt aWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1 dHRvbi10ZXh0LW9ubHkiLAoJZm9ybVJlc2V0SGFuZGxlciA9IGZ1bmN0aW9uKCkg ewoJCXZhciBidXR0b25zID0gJCggdGhpcyApLmZpbmQoICI6dWktYnV0dG9uIiAp OwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWJ1dHRvbnMuYnV0dG9uKCAi cmVmcmVzaCIgKTsKCQl9LCAxICk7Cgl9LAoJcmFkaW9Hcm91cCA9IGZ1bmN0aW9u KCByYWRpbyApIHsKCQl2YXIgbmFtZSA9IHJhZGlvLm5hbWUsCgkJCWZvcm0gPSBy YWRpby5mb3JtLAoJCQlyYWRpb3MgPSAkKCBbXSApOwoJCWlmICggbmFtZSApIHsK CQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLycvZywgIlxcJyIgKTsKCQkJaWYgKCBm b3JtICkgewoJCQkJcmFkaW9zID0gJCggZm9ybSApLmZpbmQoICJbbmFtZT0nIiAr IG5hbWUgKyAiJ10iICk7CgkJCX0gZWxzZSB7CgkJCQlyYWRpb3MgPSAkKCAiW25h bWU9JyIgKyBuYW1lICsgIiddIiwgcmFkaW8ub3duZXJEb2N1bWVudCApCgkJCQkJ LmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCQkJcmV0dXJuICF0aGlzLmZvcm07CgkJ CQkJfSk7CgkJCX0KCQl9CgkJcmV0dXJuIHJhZGlvczsKCX07CgokLndpZGdldCgg InVpLmJ1dHRvbiIsIHsKCXZlcnNpb246ICIxLjEwLjAiLAoJZGVmYXVsdEVsZW1l bnQ6ICI8YnV0dG9uPiIsCglvcHRpb25zOiB7CgkJZGlzYWJsZWQ6IG51bGwsCgkJ dGV4dDogdHJ1ZSwKCQlsYWJlbDogbnVsbCwKCQlpY29uczogewoJCQlwcmltYXJ5 OiBudWxsLAoJCQlzZWNvbmRhcnk6IG51bGwKCQl9Cgl9LAoJX2NyZWF0ZTogZnVu Y3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LmNsb3Nlc3QoICJmb3JtIiApCgkJCS51 bmJpbmQoICJyZXNldCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlICkKCQkJLmJpbmQo ICJyZXNldCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmb3JtUmVzZXRIYW5kbGVy ICk7CgoJCWlmICggdHlwZW9mIHRoaXMub3B0aW9ucy5kaXNhYmxlZCAhPT0gImJv b2xlYW4iICkgewoJCQl0aGlzLm9wdGlvbnMuZGlzYWJsZWQgPSAhIXRoaXMuZWxl bWVudC5wcm9wKCAiZGlzYWJsZWQiICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5lbGVt ZW50LnByb3AoICJkaXNhYmxlZCIsIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApOwoJ CX0KCgkJdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpOwoJCXRoaXMuaGFzVGl0 bGUgPSAhIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCAidGl0bGUiICk7CgoJCXZh ciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJdG9n Z2xlQnV0dG9uID0gdGhpcy50eXBlID09PSAiY2hlY2tib3giIHx8IHRoaXMudHlw ZSA9PT0gInJhZGlvIiwKCQkJYWN0aXZlQ2xhc3MgPSAhdG9nZ2xlQnV0dG9uID8g InVpLXN0YXRlLWFjdGl2ZSIgOiAiIiwKCQkJZm9jdXNDbGFzcyA9ICJ1aS1zdGF0 ZS1mb2N1cyI7CgoJCWlmICggb3B0aW9ucy5sYWJlbCA9PT0gbnVsbCApIHsKCQkJ b3B0aW9ucy5sYWJlbCA9ICh0aGlzLnR5cGUgPT09ICJpbnB1dCIgPyB0aGlzLmJ1 dHRvbkVsZW1lbnQudmFsKCkgOiB0aGlzLmJ1dHRvbkVsZW1lbnQuaHRtbCgpKTsK CQl9CgoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy5idXR0b25FbGVtZW50ICk7CgoJ CXRoaXMuYnV0dG9uRWxlbWVudAoJCQkuYWRkQ2xhc3MoIGJhc2VDbGFzc2VzICkK CQkJLmF0dHIoICJyb2xlIiwgImJ1dHRvbiIgKQoJCQkuYmluZCggIm1vdXNlZW50 ZXIiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAo IG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJaWYg KCB0aGlzID09PSBsYXN0QWN0aXZlICkgewoJCQkJCSQoIHRoaXMgKS5hZGRDbGFz cyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCX0KCQkJfSkKCQkJLmJpbmQoICJt b3VzZWxlYXZlIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJ CQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCXJldHVybjsKCQkJCX0K CQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcyggYWN0aXZlQ2xhc3MgKTsKCQkJfSkK CQkJLmJpbmQoICJjbGljayIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlv biggZXZlbnQgKSB7CgkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJ ZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQlldmVudC5zdG9wSW1tZWRpYXRl UHJvcGFnYXRpb24oKTsKCQkJCX0KCQkJfSk7CgoJCXRoaXMuZWxlbWVudAoJCQku YmluZCggImZvY3VzIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkg ewoJCQkJLy8gbm8gbmVlZCB0byBjaGVjayBkaXNhYmxlZCwgZm9jdXMgd29uJ3Qg YmUgdHJpZ2dlcmVkIGFueXdheQoJCQkJdGhhdC5idXR0b25FbGVtZW50LmFkZENs YXNzKCBmb2N1c0NsYXNzICk7CgkJCX0pCgkJCS5iaW5kKCAiYmx1ciIgKyB0aGlz LmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCXRoYXQuYnV0dG9uRWxl bWVudC5yZW1vdmVDbGFzcyggZm9jdXNDbGFzcyApOwoJCQl9KTsKCgkJaWYgKCB0 b2dnbGVCdXR0b24gKSB7CgkJCXRoaXMuZWxlbWVudC5iaW5kKCAiY2hhbmdlIiAr IHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBjbGlj a0RyYWdnZWQgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJdGhhdC5yZWZyZXNo KCk7CgkJCX0pOwoJCQkvLyBpZiBtb3VzZSBtb3ZlcyBiZXR3ZWVuIG1vdXNlZG93 biBhbmQgbW91c2V1cCAoZHJhZykgc2V0IGNsaWNrRHJhZ2dlZCBmbGFnCgkJCS8v IHByZXZlbnRzIGlzc3VlIHdoZXJlIGJ1dHRvbiBzdGF0ZSBjaGFuZ2VzIGJ1dCBj aGVja2JveC9yYWRpbyBjaGVja2VkIHN0YXRlCgkJCS8vIGRvZXMgbm90IGluIEZp cmVmb3ggKHNlZSB0aWNrZXQgIzY5NzApCgkJCXRoaXMuYnV0dG9uRWxlbWVudAoJ CQkJLmJpbmQoICJtb3VzZWRvd24iICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVu Y3Rpb24oIGV2ZW50ICkgewoJCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsK CQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQljbGlja0RyYWdnZWQgPSBmYWxzZTsK CQkJCQlzdGFydFhQb3MgPSBldmVudC5wYWdlWDsKCQkJCQlzdGFydFlQb3MgPSBl dmVudC5wYWdlWTsKCQkJCX0pCgkJCQkuYmluZCggIm1vdXNldXAiICsgdGhpcy5l dmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCWlmICggb3B0 aW9ucy5kaXNhYmxlZCApIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQlpZiAo IHN0YXJ0WFBvcyAhPT0gZXZlbnQucGFnZVggfHwgc3RhcnRZUG9zICE9PSBldmVu dC5wYWdlWSApIHsKCQkJCQkJY2xpY2tEcmFnZ2VkID0gdHJ1ZTsKCQkJCQl9CgkJ CX0pOwoJCX0KCgkJaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgKSB7CgkJ CXRoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCAiY2xpY2siICsgdGhpcy5ldmVudE5h bWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQg fHwgY2xpY2tEcmFnZ2VkICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJ fSk7CgkJfSBlbHNlIGlmICggdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQl0 aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCggImNsaWNrIiArIHRoaXMuZXZlbnROYW1l c3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkIHx8 IGNsaWNrRHJhZ2dlZCApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkk KCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl0aGF0 LmJ1dHRvbkVsZW1lbnQuYXR0ciggImFyaWEtcHJlc3NlZCIsICJ0cnVlIiApOwoK CQkJCXZhciByYWRpbyA9IHRoYXQuZWxlbWVudFsgMCBdOwoJCQkJcmFkaW9Hcm91 cCggcmFkaW8gKQoJCQkJCS5ub3QoIHJhZGlvICkKCQkJCQkubWFwKGZ1bmN0aW9u KCkgewoJCQkJCQlyZXR1cm4gJCggdGhpcyApLmJ1dHRvbiggIndpZGdldCIgKVsg MCBdOwoJCQkJCX0pCgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZl IiApCgkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQiLCAiZmFsc2UiICk7CgkJCX0p OwoJCX0gZWxzZSB7CgkJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkJLmJpbmQoICJt b3VzZWRvd24iICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJ CQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7 CgkJCQkJfQoJCQkJCSQoIHRoaXMgKS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2 ZSIgKTsKCQkJCQlsYXN0QWN0aXZlID0gdGhpczsKCQkJCQl0aGF0LmRvY3VtZW50 Lm9uZSggIm1vdXNldXAiLCBmdW5jdGlvbigpIHsKCQkJCQkJbGFzdEFjdGl2ZSA9 IG51bGw7CgkJCQkJfSk7CgkJCQl9KQoJCQkJLmJpbmQoICJtb3VzZXVwIiArIHRo aXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJCWlmICggb3B0aW9u cy5kaXNhYmxlZCApIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQkk KCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9 KQoJCQkJLmJpbmQoICJrZXlkb3duIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1 bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJ CQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCWlmICggZXZlbnQua2V5Q29k ZSA9PT0gJC51aS5rZXlDb2RlLlNQQUNFIHx8IGV2ZW50LmtleUNvZGUgPT09ICQu dWkua2V5Q29kZS5FTlRFUiApIHsKCQkJCQkJJCggdGhpcyApLmFkZENsYXNzKCAi dWktc3RhdGUtYWN0aXZlIiApOwoJCQkJCX0KCQkJCX0pCgkJCQkvLyBzZWUgIzg1 NTksIHdlIGJpbmQgdG8gYmx1ciBoZXJlIGluIGNhc2UgdGhlIGJ1dHRvbiBlbGVt ZW50IGxvc2VzCgkJCQkvLyBmb2N1cyBiZXR3ZWVuIGtleWRvd24gYW5kIGtleXVw LCBpdCB3b3VsZCBiZSBsZWZ0IGluIGFuICJhY3RpdmUiIHN0YXRlCgkJCQkuYmlu ZCggImtleXVwIiArIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiIGJsdXIiICsgdGhp cy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQkJJCggdGhpcyApLnJl bW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJfSk7CgoJCQlpZiAo IHRoaXMuYnV0dG9uRWxlbWVudC5pcygiYSIpICkgewoJCQkJdGhpcy5idXR0b25F bGVtZW50LmtleXVwKGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKCBldmVudC5r ZXlDb2RlID09PSAkLnVpLmtleUNvZGUuU1BBQ0UgKSB7CgkJCQkJCS8vIFRPRE8g cGFzcyB0aHJvdWdoIG9yaWdpbmFsIGV2ZW50IGNvcnJlY3RseSAoanVzdCBhcyAy bmQgYXJndW1lbnQgZG9lc24ndCB3b3JrKQoJCQkJCQkkKCB0aGlzICkuY2xpY2so KTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0KCgkJLy8gVE9ETzogcHVsbCBvdXQg JC5XaWRnZXQncyBoYW5kbGluZyBmb3IgdGhlIGRpc2FibGVkIG9wdGlvbiBpbnRv CgkJLy8gJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb25EaXNhYmxlZCBzbyBp dCdzIGVhc3kgdG8gcHJveHkgYW5kIGNhbgoJCS8vIGJlIG92ZXJyaWRkZW4gYnkg aW5kaXZpZHVhbCBwbHVnaW5zCgkJdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQi LCBvcHRpb25zLmRpc2FibGVkICk7CgkJdGhpcy5fcmVzZXRCdXR0b24oKTsKCX0s CgoJX2RldGVybWluZUJ1dHRvblR5cGU6IGZ1bmN0aW9uKCkgewoJCXZhciBhbmNl c3RvciwgbGFiZWxTZWxlY3RvciwgY2hlY2tlZDsKCgkJaWYgKCB0aGlzLmVsZW1l bnQuaXMoIlt0eXBlPWNoZWNrYm94XSIpICkgewoJCQl0aGlzLnR5cGUgPSAiY2hl Y2tib3giOwoJCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFk aW9dIikgKSB7CgkJCXRoaXMudHlwZSA9ICJyYWRpbyI7CgkJfSBlbHNlIGlmICgg dGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpICkgewoJCQl0aGlzLnR5cGUgPSAiaW5w dXQiOwoJCX0gZWxzZSB7CgkJCXRoaXMudHlwZSA9ICJidXR0b24iOwoJCX0KCgkJ aWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAi cmFkaW8iICkgewoJCQkvLyB3ZSBkb24ndCBzZWFyY2ggYWdhaW5zdCB0aGUgZG9j dW1lbnQgaW4gY2FzZSB0aGUgZWxlbWVudAoJCQkvLyBpcyBkaXNjb25uZWN0ZWQg ZnJvbSB0aGUgRE9NCgkJCWFuY2VzdG9yID0gdGhpcy5lbGVtZW50LnBhcmVudHMo KS5sYXN0KCk7CgkJCWxhYmVsU2VsZWN0b3IgPSAibGFiZWxbZm9yPSciICsgdGhp cy5lbGVtZW50LmF0dHIoImlkIikgKyAiJ10iOwoJCQl0aGlzLmJ1dHRvbkVsZW1l bnQgPSBhbmNlc3Rvci5maW5kKCBsYWJlbFNlbGVjdG9yICk7CgkJCWlmICggIXRo aXMuYnV0dG9uRWxlbWVudC5sZW5ndGggKSB7CgkJCQlhbmNlc3RvciA9IGFuY2Vz dG9yLmxlbmd0aCA/IGFuY2VzdG9yLnNpYmxpbmdzKCkgOiB0aGlzLmVsZW1lbnQu c2libGluZ3MoKTsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudCA9IGFuY2VzdG9yLmZp bHRlciggbGFiZWxTZWxlY3RvciApOwoJCQkJaWYgKCAhdGhpcy5idXR0b25FbGVt ZW50Lmxlbmd0aCApIHsKCQkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQgPSBhbmNlc3Rv ci5maW5kKCBsYWJlbFNlbGVjdG9yICk7CgkJCQl9CgkJCX0KCQkJdGhpcy5lbGVt ZW50LmFkZENsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApOwoK CQkJY2hlY2tlZCA9IHRoaXMuZWxlbWVudC5pcyggIjpjaGVja2VkIiApOwoJCQlp ZiAoIGNoZWNrZWQgKSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3Mo ICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCX0KCQkJdGhpcy5idXR0b25FbGVtZW50 LnByb3AoICJhcmlhLXByZXNzZWQiLCBjaGVja2VkICk7CgkJfSBlbHNlIHsKCQkJ dGhpcy5idXR0b25FbGVtZW50ID0gdGhpcy5lbGVtZW50OwoJCX0KCX0sCgoJd2lk Z2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5idXR0b25FbGVtZW50OwoJ fSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50CgkJCS5y ZW1vdmVDbGFzcyggInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIgKTsKCQl0 aGlzLmJ1dHRvbkVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCBiYXNlQ2xhc3NlcyAr ICIgIiArIHN0YXRlQ2xhc3NlcyArICIgIiArIHR5cGVDbGFzc2VzICkKCQkJLnJl bW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1wcmVzc2Vk IiApCgkJCS5odG1sKCB0aGlzLmJ1dHRvbkVsZW1lbnQuZmluZCgiLnVpLWJ1dHRv bi10ZXh0IikuaHRtbCgpICk7CgoJCWlmICggIXRoaXMuaGFzVGl0bGUgKSB7CgkJ CXRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVBdHRyKCAidGl0bGUiICk7CgkJfQoJ fSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlz Ll9zdXBlcigga2V5LCB2YWx1ZSApOwoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQi ICkgewoJCQlpZiAoIHZhbHVlICkgewoJCQkJdGhpcy5lbGVtZW50LnByb3AoICJk aXNhYmxlZCIsIHRydWUgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZWxlbWVudC5w cm9wKCAiZGlzYWJsZWQiLCBmYWxzZSApOwoJCQl9CgkJCXJldHVybjsKCQl9CgkJ dGhpcy5fcmVzZXRCdXR0b24oKTsKCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7 CgkJLy9TZWUgIzgyMzcgJiAjODgyOAoJCXZhciBpc0Rpc2FibGVkID0gdGhpcy5l bGVtZW50LmlzKCAiaW5wdXQsIGJ1dHRvbiIgKSA/IHRoaXMuZWxlbWVudC5pcygg IjpkaXNhYmxlZCIgKSA6IHRoaXMuZWxlbWVudC5oYXNDbGFzcyggInVpLWJ1dHRv bi1kaXNhYmxlZCIgKTsKCgkJaWYgKCBpc0Rpc2FibGVkICE9PSB0aGlzLm9wdGlv bnMuZGlzYWJsZWQgKSB7CgkJCXRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwg aXNEaXNhYmxlZCApOwoJCX0KCQlpZiAoIHRoaXMudHlwZSA9PT0gInJhZGlvIiAp IHsKCQkJcmFkaW9Hcm91cCggdGhpcy5lbGVtZW50WzBdICkuZWFjaChmdW5jdGlv bigpIHsKCQkJCWlmICggJCggdGhpcyApLmlzKCAiOmNoZWNrZWQiICkgKSB7CgkJ CQkJJCggdGhpcyApLmJ1dHRvbiggIndpZGdldCIgKQoJCQkJCQkuYWRkQ2xhc3Mo ICJ1aS1zdGF0ZS1hY3RpdmUiICkKCQkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQi LCAidHJ1ZSIgKTsKCQkJCX0gZWxzZSB7CgkJCQkJJCggdGhpcyApLmJ1dHRvbigg IndpZGdldCIgKQoJCQkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUi ICkKCQkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQiLCAiZmFsc2UiICk7CgkJCQl9 CgkJCX0pOwoJCX0gZWxzZSBpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiAp IHsKCQkJaWYgKCB0aGlzLmVsZW1lbnQuaXMoICI6Y2hlY2tlZCIgKSApIHsKCQkJ CXRoaXMuYnV0dG9uRWxlbWVudAoJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWFj dGl2ZSIgKQoJCQkJCS5hdHRyKCAiYXJpYS1wcmVzc2VkIiwgInRydWUiICk7CgkJ CX0gZWxzZSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQKCQkJCQkucmVtb3ZlQ2xh c3MoICJ1aS1zdGF0ZS1hY3RpdmUiICkKCQkJCQkuYXR0ciggImFyaWEtcHJlc3Nl ZCIsICJmYWxzZSIgKTsKCQkJfQoJCX0KCX0sCgoJX3Jlc2V0QnV0dG9uOiBmdW5j dGlvbigpIHsKCQlpZiAoIHRoaXMudHlwZSA9PT0gImlucHV0IiApIHsKCQkJaWYg KCB0aGlzLm9wdGlvbnMubGFiZWwgKSB7CgkJCQl0aGlzLmVsZW1lbnQudmFsKCB0 aGlzLm9wdGlvbnMubGFiZWwgKTsKCQkJfQoJCQlyZXR1cm47CgkJfQoJCXZhciBi dXR0b25FbGVtZW50ID0gdGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCB0 eXBlQ2xhc3NlcyApLAoJCQlidXR0b25UZXh0ID0gJCggIjxzcGFuPjwvc3Bhbj4i LCB0aGlzLmRvY3VtZW50WzBdICkKCQkJCS5hZGRDbGFzcyggInVpLWJ1dHRvbi10 ZXh0IiApCgkJCQkuaHRtbCggdGhpcy5vcHRpb25zLmxhYmVsICkKCQkJCS5hcHBl bmRUbyggYnV0dG9uRWxlbWVudC5lbXB0eSgpICkKCQkJCS50ZXh0KCksCgkJCWlj b25zID0gdGhpcy5vcHRpb25zLmljb25zLAoJCQltdWx0aXBsZUljb25zID0gaWNv bnMucHJpbWFyeSAmJiBpY29ucy5zZWNvbmRhcnksCgkJCWJ1dHRvbkNsYXNzZXMg PSBbXTsKCgkJaWYgKCBpY29ucy5wcmltYXJ5IHx8IGljb25zLnNlY29uZGFyeSAp IHsKCQkJaWYgKCB0aGlzLm9wdGlvbnMudGV4dCApIHsKCQkJCWJ1dHRvbkNsYXNz ZXMucHVzaCggInVpLWJ1dHRvbi10ZXh0LWljb24iICsgKCBtdWx0aXBsZUljb25z ID8gInMiIDogKCBpY29ucy5wcmltYXJ5ID8gIi1wcmltYXJ5IiA6ICItc2Vjb25k YXJ5IiApICkgKTsKCQkJfQoKCQkJaWYgKCBpY29ucy5wcmltYXJ5ICkgewoJCQkJ YnV0dG9uRWxlbWVudC5wcmVwZW5kKCAiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1p Y29uLXByaW1hcnkgdWktaWNvbiAiICsgaWNvbnMucHJpbWFyeSArICInPjwvc3Bh bj4iICk7CgkJCX0KCgkJCWlmICggaWNvbnMuc2Vjb25kYXJ5ICkgewoJCQkJYnV0 dG9uRWxlbWVudC5hcHBlbmQoICI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24t c2Vjb25kYXJ5IHVpLWljb24gIiArIGljb25zLnNlY29uZGFyeSArICInPjwvc3Bh bj4iICk7CgkJCX0KCgkJCWlmICggIXRoaXMub3B0aW9ucy50ZXh0ICkgewoJCQkJ YnV0dG9uQ2xhc3Nlcy5wdXNoKCBtdWx0aXBsZUljb25zID8gInVpLWJ1dHRvbi1p Y29ucy1vbmx5IiA6ICJ1aS1idXR0b24taWNvbi1vbmx5IiApOwoKCQkJCWlmICgg IXRoaXMuaGFzVGl0bGUgKSB7CgkJCQkJYnV0dG9uRWxlbWVudC5hdHRyKCAidGl0 bGUiLCAkLnRyaW0oIGJ1dHRvblRleHQgKSApOwoJCQkJfQoJCQl9CgkJfSBlbHNl IHsKCQkJYnV0dG9uQ2xhc3Nlcy5wdXNoKCAidWktYnV0dG9uLXRleHQtb25seSIg KTsKCQl9CgkJYnV0dG9uRWxlbWVudC5hZGRDbGFzcyggYnV0dG9uQ2xhc3Nlcy5q b2luKCAiICIgKSApOwoJfQp9KTsKCiQud2lkZ2V0KCAidWkuYnV0dG9uc2V0Iiwg ewoJdmVyc2lvbjogIjEuMTAuMCIsCglvcHRpb25zOiB7CgkJaXRlbXM6ICJidXR0 b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1 dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9 cmFkaW9dLCBhLCA6ZGF0YSh1aS1idXR0b24pIgoJfSwKCglfY3JlYXRlOiBmdW5j dGlvbigpIHsKCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1idXR0b25zZXQi ICk7Cgl9LAoKCV9pbml0OiBmdW5jdGlvbigpIHsKCQl0aGlzLnJlZnJlc2goKTsK CX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYg KCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCXRoaXMuYnV0dG9ucy5idXR0b24o ICJvcHRpb24iLCBrZXksIHZhbHVlICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5 LCB2YWx1ZSApOwoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl2YXIgcnRs ID0gdGhpcy5lbGVtZW50LmNzcyggImRpcmVjdGlvbiIgKSA9PT0gInJ0bCI7CgoJ CXRoaXMuYnV0dG9ucyA9IHRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMu aXRlbXMgKQoJCQkuZmlsdGVyKCAiOnVpLWJ1dHRvbiIgKQoJCQkJLmJ1dHRvbigg InJlZnJlc2giICkKCQkJLmVuZCgpCgkJCS5ub3QoICI6dWktYnV0dG9uIiApCgkJ CQkuYnV0dG9uKCkKCQkJLmVuZCgpCgkJCS5tYXAoZnVuY3Rpb24oKSB7CgkJCQly ZXR1cm4gJCggdGhpcyApLmJ1dHRvbiggIndpZGdldCIgKVsgMCBdOwoJCQl9KQoJ CQkJLnJlbW92ZUNsYXNzKCAidWktY29ybmVyLWFsbCB1aS1jb3JuZXItbGVmdCB1 aS1jb3JuZXItcmlnaHQiICkKCQkJCS5maWx0ZXIoICI6Zmlyc3QiICkKCQkJCQku YWRkQ2xhc3MoIHJ0bCA/ICJ1aS1jb3JuZXItcmlnaHQiIDogInVpLWNvcm5lci1s ZWZ0IiApCgkJCQkuZW5kKCkKCQkJCS5maWx0ZXIoICI6bGFzdCIgKQoJCQkJCS5h ZGRDbGFzcyggcnRsID8gInVpLWNvcm5lci1sZWZ0IiA6ICJ1aS1jb3JuZXItcmln aHQiICkKCQkJCS5lbmQoKQoJCQkuZW5kKCk7Cgl9LAoKCV9kZXN0cm95OiBmdW5j dGlvbigpIHsKCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoICJ1aS1idXR0b25z ZXQiICk7CgkJdGhpcy5idXR0b25zCgkJCS5tYXAoZnVuY3Rpb24oKSB7CgkJCQly ZXR1cm4gJCggdGhpcyApLmJ1dHRvbiggIndpZGdldCIgKVsgMCBdOwoJCQl9KQoJ CQkJLnJlbW92ZUNsYXNzKCAidWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0 IiApCgkJCS5lbmQoKQoJCQkuYnV0dG9uKCAiZGVzdHJveSIgKTsKCX0KfSk7Cgp9 KCBqUXVlcnkgKSApOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmV4 dGVuZCgkLnVpLCB7IGRhdGVwaWNrZXI6IHsgdmVyc2lvbjogIjEuMTAuMCIgfSB9 KTsKCnZhciBQUk9QX05BTUUgPSAiZGF0ZXBpY2tlciIsCglkcHV1aWQgPSBuZXcg RGF0ZSgpLmdldFRpbWUoKSwKCWluc3RBY3RpdmU7CgovKiBEYXRlIHBpY2tlciBt YW5hZ2VyLgogICBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNs YXNzLCAkLmRhdGVwaWNrZXIsIHRvIGludGVyYWN0IHdpdGggdGhlIGRhdGUgcGlj a2VyLgogICBTZXR0aW5ncyBmb3IgKGdyb3VwcyBvZikgZGF0ZSBwaWNrZXJzIGFy ZSBtYWludGFpbmVkIGluIGFuIGluc3RhbmNlIG9iamVjdCwKICAgYWxsb3dpbmcg bXVsdGlwbGUgZGlmZmVyZW50IHNldHRpbmdzIG9uIHRoZSBzYW1lIHBhZ2UuICov CgpmdW5jdGlvbiBEYXRlcGlja2VyKCkgewoJdGhpcy5fY3VySW5zdCA9IG51bGw7 IC8vIFRoZSBjdXJyZW50IGluc3RhbmNlIGluIHVzZQoJdGhpcy5fa2V5RXZlbnQg PSBmYWxzZTsgLy8gSWYgdGhlIGxhc3QgZXZlbnQgd2FzIGEga2V5IGV2ZW50Cgl0 aGlzLl9kaXNhYmxlZElucHV0cyA9IFtdOyAvLyBMaXN0IG9mIGRhdGUgcGlja2Vy IGlucHV0cyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZAoJdGhpcy5fZGF0ZXBpY2tl clNob3dpbmcgPSBmYWxzZTsgLy8gVHJ1ZSBpZiB0aGUgcG9wdXAgcGlja2VyIGlz IHNob3dpbmcgLCBmYWxzZSBpZiBub3QKCXRoaXMuX2luRGlhbG9nID0gZmFsc2U7 IC8vIFRydWUgaWYgc2hvd2luZyB3aXRoaW4gYSAiZGlhbG9nIiwgZmFsc2UgaWYg bm90Cgl0aGlzLl9tYWluRGl2SWQgPSAidWktZGF0ZXBpY2tlci1kaXYiOyAvLyBU aGUgSUQgb2YgdGhlIG1haW4gZGF0ZXBpY2tlciBkaXZpc2lvbgoJdGhpcy5faW5s aW5lQ2xhc3MgPSAidWktZGF0ZXBpY2tlci1pbmxpbmUiOyAvLyBUaGUgbmFtZSBv ZiB0aGUgaW5saW5lIG1hcmtlciBjbGFzcwoJdGhpcy5fYXBwZW5kQ2xhc3MgPSAi dWktZGF0ZXBpY2tlci1hcHBlbmQiOyAvLyBUaGUgbmFtZSBvZiB0aGUgYXBwZW5k IG1hcmtlciBjbGFzcwoJdGhpcy5fdHJpZ2dlckNsYXNzID0gInVpLWRhdGVwaWNr ZXItdHJpZ2dlciI7IC8vIFRoZSBuYW1lIG9mIHRoZSB0cmlnZ2VyIG1hcmtlciBj bGFzcwoJdGhpcy5fZGlhbG9nQ2xhc3MgPSAidWktZGF0ZXBpY2tlci1kaWFsb2ci OyAvLyBUaGUgbmFtZSBvZiB0aGUgZGlhbG9nIG1hcmtlciBjbGFzcwoJdGhpcy5f ZGlzYWJsZUNsYXNzID0gInVpLWRhdGVwaWNrZXItZGlzYWJsZWQiOyAvLyBUaGUg bmFtZSBvZiB0aGUgZGlzYWJsZWQgY292ZXJpbmcgbWFya2VyIGNsYXNzCgl0aGlz Ll91bnNlbGVjdGFibGVDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLXVuc2VsZWN0YWJs ZSI7IC8vIFRoZSBuYW1lIG9mIHRoZSB1bnNlbGVjdGFibGUgY2VsbCBtYXJrZXIg Y2xhc3MKCXRoaXMuX2N1cnJlbnRDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLWN1cnJl bnQtZGF5IjsgLy8gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGF5IG1hcmtlciBj bGFzcwoJdGhpcy5fZGF5T3ZlckNsYXNzID0gInVpLWRhdGVwaWNrZXItZGF5cy1j ZWxsLW92ZXIiOyAvLyBUaGUgbmFtZSBvZiB0aGUgZGF5IGhvdmVyIG1hcmtlciBj bGFzcwoJdGhpcy5yZWdpb25hbCA9IFtdOyAvLyBBdmFpbGFibGUgcmVnaW9uYWwg c2V0dGluZ3MsIGluZGV4ZWQgYnkgbGFuZ3VhZ2UgY29kZQoJdGhpcy5yZWdpb25h bFsiIl0gPSB7IC8vIERlZmF1bHQgcmVnaW9uYWwgc2V0dGluZ3MKCQljbG9zZVRl eHQ6ICJEb25lIiwgLy8gRGlzcGxheSB0ZXh0IGZvciBjbG9zZSBsaW5rCgkJcHJl dlRleHQ6ICJQcmV2IiwgLy8gRGlzcGxheSB0ZXh0IGZvciBwcmV2aW91cyBtb250 aCBsaW5rCgkJbmV4dFRleHQ6ICJOZXh0IiwgLy8gRGlzcGxheSB0ZXh0IGZvciBu ZXh0IG1vbnRoIGxpbmsKCQljdXJyZW50VGV4dDogIlRvZGF5IiwgLy8gRGlzcGxh eSB0ZXh0IGZvciBjdXJyZW50IG1vbnRoIGxpbmsKCQltb250aE5hbWVzOiBbIkph bnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwK CQkJIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1i ZXIiLCJEZWNlbWJlciJdLCAvLyBOYW1lcyBvZiBtb250aHMgZm9yIGRyb3AtZG93 biBhbmQgZm9ybWF0dGluZwoJCW1vbnRoTmFtZXNTaG9ydDogWyJKYW4iLCAiRmVi IiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNl cCIsICJPY3QiLCAiTm92IiwgIkRlYyJdLCAvLyBGb3IgZm9ybWF0dGluZwoJCWRh eU5hbWVzOiBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNk YXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sIC8vIEZvciBm b3JtYXR0aW5nCgkJZGF5TmFtZXNTaG9ydDogWyJTdW4iLCAiTW9uIiwgIlR1ZSIs ICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwgLy8gRm9yIGZvcm1hdHRpbmcK CQlkYXlOYW1lc01pbjogWyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJT YSJdLCAvLyBDb2x1bW4gaGVhZGluZ3MgZm9yIGRheXMgc3RhcnRpbmcgYXQgU3Vu ZGF5CgkJd2Vla0hlYWRlcjogIldrIiwgLy8gQ29sdW1uIGhlYWRlciBmb3Igd2Vl ayBvZiB0aGUgeWVhcgoJCWRhdGVGb3JtYXQ6ICJtbS9kZC95eSIsIC8vIFNlZSBm b3JtYXQgb3B0aW9ucyBvbiBwYXJzZURhdGUKCQlmaXJzdERheTogMCwgLy8gVGhl IGZpcnN0IGRheSBvZiB0aGUgd2VlaywgU3VuID0gMCwgTW9uID0gMSwgLi4uCgkJ aXNSVEw6IGZhbHNlLCAvLyBUcnVlIGlmIHJpZ2h0LXRvLWxlZnQgbGFuZ3VhZ2Us IGZhbHNlIGlmIGxlZnQtdG8tcmlnaHQKCQlzaG93TW9udGhBZnRlclllYXI6IGZh bHNlLCAvLyBUcnVlIGlmIHRoZSB5ZWFyIHNlbGVjdCBwcmVjZWRlcyBtb250aCwg ZmFsc2UgZm9yIG1vbnRoIHRoZW4geWVhcgoJCXllYXJTdWZmaXg6ICIiIC8vIEFk ZGl0aW9uYWwgdGV4dCB0byBhcHBlbmQgdG8gdGhlIHllYXIgaW4gdGhlIG1vbnRo IGhlYWRlcnMKCX07Cgl0aGlzLl9kZWZhdWx0cyA9IHsgLy8gR2xvYmFsIGRlZmF1 bHRzIGZvciBhbGwgdGhlIGRhdGUgcGlja2VyIGluc3RhbmNlcwoJCXNob3dPbjog ImZvY3VzIiwgLy8gImZvY3VzIiBmb3IgcG9wdXAgb24gZm9jdXMsCgkJCS8vICJi dXR0b24iIGZvciB0cmlnZ2VyIGJ1dHRvbiwgb3IgImJvdGgiIGZvciBlaXRoZXIK CQlzaG93QW5pbTogImZhZGVJbiIsIC8vIE5hbWUgb2YgalF1ZXJ5IGFuaW1hdGlv biBmb3IgcG9wdXAKCQlzaG93T3B0aW9uczoge30sIC8vIE9wdGlvbnMgZm9yIGVu aGFuY2VkIGFuaW1hdGlvbnMKCQlkZWZhdWx0RGF0ZTogbnVsbCwgLy8gVXNlZCB3 aGVuIGZpZWxkIGlzIGJsYW5rOiBhY3R1YWwgZGF0ZSwKCQkJLy8gKy8tbnVtYmVy IGZvciBvZmZzZXQgZnJvbSB0b2RheSwgbnVsbCBmb3IgdG9kYXkKCQlhcHBlbmRU ZXh0OiAiIiwgLy8gRGlzcGxheSB0ZXh0IGZvbGxvd2luZyB0aGUgaW5wdXQgYm94 LCBlLmcuIHNob3dpbmcgdGhlIGZvcm1hdAoJCWJ1dHRvblRleHQ6ICIuLi4iLCAv LyBUZXh0IGZvciB0cmlnZ2VyIGJ1dHRvbgoJCWJ1dHRvbkltYWdlOiAiIiwgLy8g VVJMIGZvciB0cmlnZ2VyIGJ1dHRvbiBpbWFnZQoJCWJ1dHRvbkltYWdlT25seTog ZmFsc2UsIC8vIFRydWUgaWYgdGhlIGltYWdlIGFwcGVhcnMgYWxvbmUsIGZhbHNl IGlmIGl0IGFwcGVhcnMgb24gYSBidXR0b24KCQloaWRlSWZOb1ByZXZOZXh0OiBm YWxzZSwgLy8gVHJ1ZSB0byBoaWRlIG5leHQvcHJldmlvdXMgbW9udGggbGlua3MK CQkJLy8gaWYgbm90IGFwcGxpY2FibGUsIGZhbHNlIHRvIGp1c3QgZGlzYWJsZSB0 aGVtCgkJbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDogZmFsc2UsIC8vIFRydWUgaWYg ZGF0ZSBmb3JtYXR0aW5nIGFwcGxpZWQgdG8gcHJldi90b2RheS9uZXh0IGxpbmtz CgkJZ290b0N1cnJlbnQ6IGZhbHNlLCAvLyBUcnVlIGlmIHRvZGF5IGxpbmsgZ29l cyBiYWNrIHRvIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWQKCQljaGFuZ2VNb250 aDogZmFsc2UsIC8vIFRydWUgaWYgbW9udGggY2FuIGJlIHNlbGVjdGVkIGRpcmVj dGx5LCBmYWxzZSBpZiBvbmx5IHByZXYvbmV4dAoJCWNoYW5nZVllYXI6IGZhbHNl LCAvLyBUcnVlIGlmIHllYXIgY2FuIGJlIHNlbGVjdGVkIGRpcmVjdGx5LCBmYWxz ZSBpZiBvbmx5IHByZXYvbmV4dAoJCXllYXJSYW5nZTogImMtMTA6YysxMCIsIC8v IFJhbmdlIG9mIHllYXJzIHRvIGRpc3BsYXkgaW4gZHJvcC1kb3duLAoJCQkvLyBl aXRoZXIgcmVsYXRpdmUgdG8gdG9kYXkncyB5ZWFyICgtbm46K25uKSwgcmVsYXRp dmUgdG8gY3VycmVudGx5IGRpc3BsYXllZCB5ZWFyCgkJCS8vIChjLW5uOmMrbm4p LCBhYnNvbHV0ZSAobm5ubjpubm5uKSwgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUg YWJvdmUgKG5ubm46LW4pCgkJc2hvd090aGVyTW9udGhzOiBmYWxzZSwgLy8gVHJ1 ZSB0byBzaG93IGRhdGVzIGluIG90aGVyIG1vbnRocywgZmFsc2UgdG8gbGVhdmUg YmxhbmsKCQlzZWxlY3RPdGhlck1vbnRoczogZmFsc2UsIC8vIFRydWUgdG8gYWxs b3cgc2VsZWN0aW9uIG9mIGRhdGVzIGluIG90aGVyIG1vbnRocywgZmFsc2UgZm9y IHVuc2VsZWN0YWJsZQoJCXNob3dXZWVrOiBmYWxzZSwgLy8gVHJ1ZSB0byBzaG93 IHdlZWsgb2YgdGhlIHllYXIsIGZhbHNlIHRvIG5vdCBzaG93IGl0CgkJY2FsY3Vs YXRlV2VlazogdGhpcy5pc284NjAxV2VlaywgLy8gSG93IHRvIGNhbGN1bGF0ZSB0 aGUgd2VlayBvZiB0aGUgeWVhciwKCQkJLy8gdGFrZXMgYSBEYXRlIGFuZCByZXR1 cm5zIHRoZSBudW1iZXIgb2YgdGhlIHdlZWsgZm9yIGl0CgkJc2hvcnRZZWFyQ3V0 b2ZmOiAiKzEwIiwgLy8gU2hvcnQgeWVhciB2YWx1ZXMgPCB0aGlzIGFyZSBpbiB0 aGUgY3VycmVudCBjZW50dXJ5LAoJCQkvLyA+IHRoaXMgYXJlIGluIHRoZSBwcmV2 aW91cyBjZW50dXJ5LAoJCQkvLyBzdHJpbmcgdmFsdWUgc3RhcnRpbmcgd2l0aCAi KyIgZm9yIGN1cnJlbnQgeWVhciArIHZhbHVlCgkJbWluRGF0ZTogbnVsbCwgLy8g VGhlIGVhcmxpZXN0IHNlbGVjdGFibGUgZGF0ZSwgb3IgbnVsbCBmb3Igbm8gbGlt aXQKCQltYXhEYXRlOiBudWxsLCAvLyBUaGUgbGF0ZXN0IHNlbGVjdGFibGUgZGF0 ZSwgb3IgbnVsbCBmb3Igbm8gbGltaXQKCQlkdXJhdGlvbjogImZhc3QiLCAvLyBE dXJhdGlvbiBvZiBkaXNwbGF5L2Nsb3N1cmUKCQliZWZvcmVTaG93RGF5OiBudWxs LCAvLyBGdW5jdGlvbiB0aGF0IHRha2VzIGEgZGF0ZSBhbmQgcmV0dXJucyBhbiBh cnJheSB3aXRoCgkJCS8vIFswXSA9IHRydWUgaWYgc2VsZWN0YWJsZSwgZmFsc2Ug aWYgbm90LCBbMV0gPSBjdXN0b20gQ1NTIGNsYXNzIG5hbWUocykgb3IgIiIsCgkJ CS8vIFsyXSA9IGNlbGwgdGl0bGUgKG9wdGlvbmFsKSwgZS5nLiAkLmRhdGVwaWNr ZXIubm9XZWVrZW5kcwoJCWJlZm9yZVNob3c6IG51bGwsIC8vIEZ1bmN0aW9uIHRo YXQgdGFrZXMgYW4gaW5wdXQgZmllbGQgYW5kCgkJCS8vIHJldHVybnMgYSBzZXQg b2YgY3VzdG9tIHNldHRpbmdzIGZvciB0aGUgZGF0ZSBwaWNrZXIKCQlvblNlbGVj dDogbnVsbCwgLy8gRGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBhIGRh dGUgaXMgc2VsZWN0ZWQKCQlvbkNoYW5nZU1vbnRoWWVhcjogbnVsbCwgLy8gRGVm aW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgbW9udGggb3IgeWVhciBp cyBjaGFuZ2VkCgkJb25DbG9zZTogbnVsbCwgLy8gRGVmaW5lIGEgY2FsbGJhY2sg ZnVuY3Rpb24gd2hlbiB0aGUgZGF0ZXBpY2tlciBpcyBjbG9zZWQKCQludW1iZXJP Zk1vbnRoczogMSwgLy8gTnVtYmVyIG9mIG1vbnRocyB0byBzaG93IGF0IGEgdGlt ZQoJCXNob3dDdXJyZW50QXRQb3M6IDAsIC8vIFRoZSBwb3NpdGlvbiBpbiBtdWx0 aXBlIG1vbnRocyBhdCB3aGljaCB0byBzaG93IHRoZSBjdXJyZW50IG1vbnRoIChz dGFydGluZyBhdCAwKQoJCXN0ZXBNb250aHM6IDEsIC8vIE51bWJlciBvZiBtb250 aHMgdG8gc3RlcCBiYWNrL2ZvcndhcmQKCQlzdGVwQmlnTW9udGhzOiAxMiwgLy8g TnVtYmVyIG9mIG1vbnRocyB0byBzdGVwIGJhY2svZm9yd2FyZCBmb3IgdGhlIGJp ZyBsaW5rcwoJCWFsdEZpZWxkOiAiIiwgLy8gU2VsZWN0b3IgZm9yIGFuIGFsdGVy bmF0ZSBmaWVsZCB0byBzdG9yZSBzZWxlY3RlZCBkYXRlcyBpbnRvCgkJYWx0Rm9y bWF0OiAiIiwgLy8gVGhlIGRhdGUgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIGFsdGVy bmF0ZSBmaWVsZAoJCWNvbnN0cmFpbklucHV0OiB0cnVlLCAvLyBUaGUgaW5wdXQg aXMgY29uc3RyYWluZWQgYnkgdGhlIGN1cnJlbnQgZGF0ZSBmb3JtYXQKCQlzaG93 QnV0dG9uUGFuZWw6IGZhbHNlLCAvLyBUcnVlIHRvIHNob3cgYnV0dG9uIHBhbmVs LCBmYWxzZSB0byBub3Qgc2hvdyBpdAoJCWF1dG9TaXplOiBmYWxzZSwgLy8gVHJ1 ZSB0byBzaXplIHRoZSBpbnB1dCBmb3IgdGhlIGRhdGUgZm9ybWF0LCBmYWxzZSB0 byBsZWF2ZSBhcyBpcwoJCWRpc2FibGVkOiBmYWxzZSAvLyBUaGUgaW5pdGlhbCBk aXNhYmxlZCBzdGF0ZQoJfTsKCSQuZXh0ZW5kKHRoaXMuX2RlZmF1bHRzLCB0aGlz LnJlZ2lvbmFsWyIiXSk7Cgl0aGlzLmRwRGl2ID0gYmluZEhvdmVyKCQoIjxkaXYg aWQ9JyIgKyB0aGlzLl9tYWluRGl2SWQgKyAiJyBjbGFzcz0ndWktZGF0ZXBpY2tl ciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4 IHVpLWNvcm5lci1hbGwnPjwvZGl2PiIpKTsKfQoKJC5leHRlbmQoRGF0ZXBpY2tl ci5wcm90b3R5cGUsIHsKCS8qIENsYXNzIG5hbWUgYWRkZWQgdG8gZWxlbWVudHMg dG8gaW5kaWNhdGUgYWxyZWFkeSBjb25maWd1cmVkIHdpdGggYSBkYXRlIHBpY2tl ci4gKi8KCW1hcmtlckNsYXNzTmFtZTogImhhc0RhdGVwaWNrZXIiLAoKCS8vS2Vl cCB0cmFjayBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBkaXNwbGF5ZWQg KHNlZSAjNzA0MykKCW1heFJvd3M6IDQsCgoJLy8gVE9ETyByZW5hbWUgdG8gIndp ZGdldCIgd2hlbiBzd2l0Y2hpbmcgdG8gd2lkZ2V0IGZhY3RvcnkKCV93aWRnZXRE YXRlcGlja2VyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kcERpdjsKCX0s CgoJLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGFsbCBpbnN0 YW5jZXMgb2YgdGhlIGRhdGUgcGlja2VyLgoJICogQHBhcmFtICBzZXR0aW5ncyAg b2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1c2UgYXMgZGVmYXVsdHMgKGFu b255bW91cyBvYmplY3QpCgkgKiBAcmV0dXJuIHRoZSBtYW5hZ2VyIG9iamVjdAoJ ICovCglzZXREZWZhdWx0czogZnVuY3Rpb24oc2V0dGluZ3MpIHsKCQlleHRlbmRS ZW1vdmUodGhpcy5fZGVmYXVsdHMsIHNldHRpbmdzIHx8IHt9KTsKCQlyZXR1cm4g dGhpczsKCX0sCgoJLyogQXR0YWNoIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVy eSBzZWxlY3Rpb24uCgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRh cmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKiBAcGFyYW0g IHNldHRpbmdzICBvYmplY3QgLSB0aGUgbmV3IHNldHRpbmdzIHRvIHVzZSBmb3Ig dGhpcyBkYXRlIHBpY2tlciBpbnN0YW5jZSAoYW5vbnltb3VzKQoJICovCglfYXR0 YWNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBzZXR0aW5ncykgewoJCXZh ciBub2RlTmFtZSwgaW5saW5lLCBpbnN0OwoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5v ZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaW5saW5lID0gKG5vZGVOYW1lID09PSAi ZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKTsKCQlpZiAoIXRhcmdldC5pZCkg ewoJCQl0aGlzLnV1aWQgKz0gMTsKCQkJdGFyZ2V0LmlkID0gImRwIiArIHRoaXMu dXVpZDsKCQl9CgkJaW5zdCA9IHRoaXMuX25ld0luc3QoJCh0YXJnZXQpLCBpbmxp bmUpOwoJCWluc3Quc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgc2V0dGluZ3MgfHwg e30pOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQl0aGlzLl9jb25u ZWN0RGF0ZXBpY2tlcih0YXJnZXQsIGluc3QpOwoJCX0gZWxzZSBpZiAoaW5saW5l KSB7CgkJCXRoaXMuX2lubGluZURhdGVwaWNrZXIodGFyZ2V0LCBpbnN0KTsKCQl9 Cgl9LAoKCS8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvYmplY3QuICovCglfbmV3 SW5zdDogZnVuY3Rpb24odGFyZ2V0LCBpbmxpbmUpIHsKCQl2YXIgaWQgPSB0YXJn ZXRbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05X1wtXSkvZywgIlxcXFwkMSIp OyAvLyBlc2NhcGUgalF1ZXJ5IG1ldGEgY2hhcnMKCQlyZXR1cm4ge2lkOiBpZCwg aW5wdXQ6IHRhcmdldCwgLy8gYXNzb2NpYXRlZCB0YXJnZXQKCQkJc2VsZWN0ZWRE YXk6IDAsIHNlbGVjdGVkTW9udGg6IDAsIHNlbGVjdGVkWWVhcjogMCwgLy8gY3Vy cmVudCBzZWxlY3Rpb24KCQkJZHJhd01vbnRoOiAwLCBkcmF3WWVhcjogMCwgLy8g bW9udGggYmVpbmcgZHJhd24KCQkJaW5saW5lOiBpbmxpbmUsIC8vIGlzIGRhdGVw aWNrZXIgaW5saW5lIG9yIG5vdAoJCQlkcERpdjogKCFpbmxpbmUgPyB0aGlzLmRw RGl2IDogLy8gcHJlc2VudGF0aW9uIGRpdgoJCQliaW5kSG92ZXIoJCgiPGRpdiBj bGFzcz0nIiArIHRoaXMuX2lubGluZUNsYXNzICsgIiB1aS1kYXRlcGlja2VyIHVp LXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWkt Y29ybmVyLWFsbCc+PC9kaXY+IikpKX07Cgl9LAoKCS8qIEF0dGFjaCB0aGUgZGF0 ZSBwaWNrZXIgdG8gYW4gaW5wdXQgZmllbGQuICovCglfY29ubmVjdERhdGVwaWNr ZXI6IGZ1bmN0aW9uKHRhcmdldCwgaW5zdCkgewoJCXZhciBpbnB1dCA9ICQodGFy Z2V0KTsKCQlpbnN0LmFwcGVuZCA9ICQoW10pOwoJCWluc3QudHJpZ2dlciA9ICQo W10pOwoJCWlmIChpbnB1dC5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkp IHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9hdHRhY2htZW50cyhpbnB1dCwgaW5z dCk7CgkJaW5wdXQuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmtleWRv d24odGhpcy5fZG9LZXlEb3duKS4KCQkJa2V5cHJlc3ModGhpcy5fZG9LZXlQcmVz cykua2V5dXAodGhpcy5fZG9LZXlVcCk7CgkJdGhpcy5fYXV0b1NpemUoaW5zdCk7 CgkJJC5kYXRhKHRhcmdldCwgUFJPUF9OQU1FLCBpbnN0KTsKCQkvL0lmIGRpc2Fi bGVkIG9wdGlvbiBpcyB0cnVlLCBkaXNhYmxlIHRoZSBkYXRlcGlja2VyIG9uY2Ug aXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGlucHV0IChzZWUgdGlja2V0ICM1 NjY1KQoJCWlmKCBpbnN0LnNldHRpbmdzLmRpc2FibGVkICkgewoJCQl0aGlzLl9k aXNhYmxlRGF0ZXBpY2tlciggdGFyZ2V0ICk7CgkJfQoJfSwKCgkvKiBNYWtlIGF0 dGFjaG1lbnRzIGJhc2VkIG9uIHNldHRpbmdzLiAqLwoJX2F0dGFjaG1lbnRzOiBm dW5jdGlvbihpbnB1dCwgaW5zdCkgewoJCXZhciBzaG93T24sIGJ1dHRvblRleHQs IGJ1dHRvbkltYWdlLAoJCQlhcHBlbmRUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJh cHBlbmRUZXh0IiksCgkJCWlzUlRMID0gdGhpcy5fZ2V0KGluc3QsICJpc1JUTCIp OwoKCQlpZiAoaW5zdC5hcHBlbmQpIHsKCQkJaW5zdC5hcHBlbmQucmVtb3ZlKCk7 CgkJfQoJCWlmIChhcHBlbmRUZXh0KSB7CgkJCWluc3QuYXBwZW5kID0gJCgiPHNw YW4gY2xhc3M9JyIgKyB0aGlzLl9hcHBlbmRDbGFzcyArICInPiIgKyBhcHBlbmRU ZXh0ICsgIjwvc3Bhbj4iKTsKCQkJaW5wdXRbaXNSVEwgPyAiYmVmb3JlIiA6ICJh ZnRlciJdKGluc3QuYXBwZW5kKTsKCQl9CgoJCWlucHV0LnVuYmluZCgiZm9jdXMi LCB0aGlzLl9zaG93RGF0ZXBpY2tlcik7CgoJCWlmIChpbnN0LnRyaWdnZXIpIHsK CQkJaW5zdC50cmlnZ2VyLnJlbW92ZSgpOwoJCX0KCgkJc2hvd09uID0gdGhpcy5f Z2V0KGluc3QsICJzaG93T24iKTsKCQlpZiAoc2hvd09uID09PSAiZm9jdXMiIHx8 IHNob3dPbiA9PT0gImJvdGgiKSB7IC8vIHBvcC11cCBkYXRlIHBpY2tlciB3aGVu IGluIHRoZSBtYXJrZWQgZmllbGQKCQkJaW5wdXQuZm9jdXModGhpcy5fc2hvd0Rh dGVwaWNrZXIpOwoJCX0KCQlpZiAoc2hvd09uID09PSAiYnV0dG9uIiB8fCBzaG93 T24gPT09ICJib3RoIikgeyAvLyBwb3AtdXAgZGF0ZSBwaWNrZXIgd2hlbiBidXR0 b24gY2xpY2tlZAoJCQlidXR0b25UZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJidXR0 b25UZXh0Iik7CgkJCWJ1dHRvbkltYWdlID0gdGhpcy5fZ2V0KGluc3QsICJidXR0 b25JbWFnZSIpOwoJCQlpbnN0LnRyaWdnZXIgPSAkKHRoaXMuX2dldChpbnN0LCAi YnV0dG9uSW1hZ2VPbmx5IikgPwoJCQkJJCgiPGltZy8+IikuYWRkQ2xhc3ModGhp cy5fdHJpZ2dlckNsYXNzKS4KCQkJCQlhdHRyKHsgc3JjOiBidXR0b25JbWFnZSwg YWx0OiBidXR0b25UZXh0LCB0aXRsZTogYnV0dG9uVGV4dCB9KSA6CgkJCQkkKCI8 YnV0dG9uIHR5cGU9J2J1dHRvbic+PC9idXR0b24+IikuYWRkQ2xhc3ModGhpcy5f dHJpZ2dlckNsYXNzKS4KCQkJCQlodG1sKCFidXR0b25JbWFnZSA/IGJ1dHRvblRl eHQgOiAkKCI8aW1nLz4iKS5hdHRyKAoJCQkJCXsgc3JjOmJ1dHRvbkltYWdlLCBh bHQ6YnV0dG9uVGV4dCwgdGl0bGU6YnV0dG9uVGV4dCB9KSkpOwoJCQlpbnB1dFtp c1JUTCA/ICJiZWZvcmUiIDogImFmdGVyIl0oaW5zdC50cmlnZ2VyKTsKCQkJaW5z dC50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCQuZGF0ZXBpY2tl ci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQg PT09IGlucHV0WzBdKSB7CgkJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tl cigpOwoJCQkJfSBlbHNlIGlmICgkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93 aW5nICYmICQuZGF0ZXBpY2tlci5fbGFzdElucHV0ICE9PSBpbnB1dFswXSkgewoJ CQkJCSQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkkLmRhdGVw aWNrZXIuX3Nob3dEYXRlcGlja2VyKGlucHV0WzBdKTsKCQkJCX0gZWxzZSB7CgkJ CQkJJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihpbnB1dFswXSk7CgkJCQl9 CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0pOwoJCX0KCX0sCgoJLyogQXBwbHkgdGhl IG1heGltdW0gbGVuZ3RoIGZvciB0aGUgZGF0ZSBmb3JtYXQuICovCglfYXV0b1Np emU6IGZ1bmN0aW9uKGluc3QpIHsKCQlpZiAodGhpcy5fZ2V0KGluc3QsICJhdXRv U2l6ZSIpICYmICFpbnN0LmlubGluZSkgewoJCQl2YXIgZmluZE1heCwgbWF4LCBt YXhJLCBpLAoJCQkJZGF0ZSA9IG5ldyBEYXRlKDIwMDksIDEyIC0gMSwgMjApLCAv LyBFbnN1cmUgZG91YmxlIGRpZ2l0cwoJCQkJZGF0ZUZvcm1hdCA9IHRoaXMuX2dl dChpbnN0LCAiZGF0ZUZvcm1hdCIpOwoKCQkJaWYgKGRhdGVGb3JtYXQubWF0Y2go L1tETV0vKSkgewoJCQkJZmluZE1heCA9IGZ1bmN0aW9uKG5hbWVzKSB7CgkJCQkJ bWF4ID0gMDsKCQkJCQltYXhJID0gMDsKCQkJCQlmb3IgKGkgPSAwOyBpIDwgbmFt ZXMubGVuZ3RoOyBpKyspIHsKCQkJCQkJaWYgKG5hbWVzW2ldLmxlbmd0aCA+IG1h eCkgewoJCQkJCQkJbWF4ID0gbmFtZXNbaV0ubGVuZ3RoOwoJCQkJCQkJbWF4SSA9 IGk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcmV0dXJuIG1heEk7CgkJCQl9OwoJCQkJ ZGF0ZS5zZXRNb250aChmaW5kTWF4KHRoaXMuX2dldChpbnN0LCAoZGF0ZUZvcm1h dC5tYXRjaCgvTU0vKSA/CgkJCQkJIm1vbnRoTmFtZXMiIDogIm1vbnRoTmFtZXNT aG9ydCIpKSkpOwoJCQkJZGF0ZS5zZXREYXRlKGZpbmRNYXgodGhpcy5fZ2V0KGlu c3QsIChkYXRlRm9ybWF0Lm1hdGNoKC9ERC8pID8KCQkJCQkiZGF5TmFtZXMiIDog ImRheU5hbWVzU2hvcnQiKSkpICsgMjAgLSBkYXRlLmdldERheSgpKTsKCQkJfQoJ CQlpbnN0LmlucHV0LmF0dHIoInNpemUiLCB0aGlzLl9mb3JtYXREYXRlKGluc3Qs IGRhdGUpLmxlbmd0aCk7CgkJfQoJfSwKCgkvKiBBdHRhY2ggYW4gaW5saW5lIGRh dGUgcGlja2VyIHRvIGEgZGl2LiAqLwoJX2lubGluZURhdGVwaWNrZXI6IGZ1bmN0 aW9uKHRhcmdldCwgaW5zdCkgewoJCXZhciBkaXZTcGFuID0gJCh0YXJnZXQpOwoJ CWlmIChkaXZTcGFuLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkgewoJ CQlyZXR1cm47CgkJfQoJCWRpdlNwYW4uYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFz c05hbWUpLmFwcGVuZChpbnN0LmRwRGl2KTsKCQkkLmRhdGEodGFyZ2V0LCBQUk9Q X05BTUUsIGluc3QpOwoJCXRoaXMuX3NldERhdGUoaW5zdCwgdGhpcy5fZ2V0RGVm YXVsdERhdGUoaW5zdCksIHRydWUpOwoJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIo aW5zdCk7CgkJdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCS8vSWYgZGlz YWJsZWQgb3B0aW9uIGlzIHRydWUsIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIgYmVm b3JlIHNob3dpbmcgaXQgKHNlZSB0aWNrZXQgIzU2NjUpCgkJaWYoIGluc3Quc2V0 dGluZ3MuZGlzYWJsZWQgKSB7CgkJCXRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKCB0 YXJnZXQgKTsKCQl9CgkJLy8gU2V0IGRpc3BsYXk6YmxvY2sgaW4gcGxhY2Ugb2Yg aW5zdC5kcERpdi5zaG93KCkgd2hpY2ggd29uJ3Qgd29yayBvbiBkaXNjb25uZWN0 ZWQgZWxlbWVudHMKCQkvLyBodHRwOi8vYnVncy5qcXVlcnl1aS5jb20vdGlja2V0 Lzc1NTIgLSBBIERhdGVwaWNrZXIgY3JlYXRlZCBvbiBhIGRldGFjaGVkIGRpdiBo YXMgemVybyBoZWlnaHQKCQlpbnN0LmRwRGl2LmNzcyggImRpc3BsYXkiLCAiYmxv Y2siICk7Cgl9LAoKCS8qIFBvcC11cCB0aGUgZGF0ZSBwaWNrZXIgaW4gYSAiZGlh bG9nIiBib3guCgkgKiBAcGFyYW0gIGlucHV0IGVsZW1lbnQgLSBpZ25vcmVkCgkg KiBAcGFyYW0gIGRhdGUJc3RyaW5nIG9yIERhdGUgLSB0aGUgaW5pdGlhbCBkYXRl IHRvIGRpc3BsYXkKCSAqIEBwYXJhbSAgb25TZWxlY3QgIGZ1bmN0aW9uIC0gdGhl IGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIGRhdGUgaXMgc2VsZWN0ZWQKCSAqIEBw YXJhbSAgc2V0dGluZ3MgIG9iamVjdCAtIHVwZGF0ZSB0aGUgZGlhbG9nIGRhdGUg cGlja2VyIGluc3RhbmNlJ3Mgc2V0dGluZ3MgKGFub255bW91cyBvYmplY3QpCgkg KiBAcGFyYW0gIHBvcyBpbnRbMl0gLSBjb29yZGluYXRlcyBmb3IgdGhlIGRpYWxv ZydzIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2NyZWVuIG9yCgkgKgkJCQkJZXZlbnQg LSB3aXRoIHgveSBjb29yZGluYXRlcyBvcgoJICoJCQkJCWxlYXZlIGVtcHR5IGZv ciBkZWZhdWx0IChzY3JlZW4gY2VudHJlKQoJICogQHJldHVybiB0aGUgbWFuYWdl ciBvYmplY3QKCSAqLwoJX2RpYWxvZ0RhdGVwaWNrZXI6IGZ1bmN0aW9uKGlucHV0 LCBkYXRlLCBvblNlbGVjdCwgc2V0dGluZ3MsIHBvcykgewoJCXZhciBpZCwgYnJv d3NlcldpZHRoLCBicm93c2VySGVpZ2h0LCBzY3JvbGxYLCBzY3JvbGxZLAoJCQlp bnN0ID0gdGhpcy5fZGlhbG9nSW5zdDsgLy8gaW50ZXJuYWwgaW5zdGFuY2UKCgkJ aWYgKCFpbnN0KSB7CgkJCXRoaXMudXVpZCArPSAxOwoJCQlpZCA9ICJkcCIgKyB0 aGlzLnV1aWQ7CgkJCXRoaXMuX2RpYWxvZ0lucHV0ID0gJCgiPGlucHV0IHR5cGU9 J3RleHQnIGlkPSciICsgaWQgKwoJCQkJIicgc3R5bGU9J3Bvc2l0aW9uOiBhYnNv bHV0ZTsgdG9wOiAtMTAwcHg7IHdpZHRoOiAwcHg7Jy8+Iik7CgkJCXRoaXMuX2Rp YWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKTsKCQkJJCgiYm9keSIp LmFwcGVuZCh0aGlzLl9kaWFsb2dJbnB1dCk7CgkJCWluc3QgPSB0aGlzLl9kaWFs b2dJbnN0ID0gdGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwgZmFsc2Up OwoJCQlpbnN0LnNldHRpbmdzID0ge307CgkJCSQuZGF0YSh0aGlzLl9kaWFsb2dJ bnB1dFswXSwgUFJPUF9OQU1FLCBpbnN0KTsKCQl9CgkJZXh0ZW5kUmVtb3ZlKGlu c3Quc2V0dGluZ3MsIHNldHRpbmdzIHx8IHt9KTsKCQlkYXRlID0gKGRhdGUgJiYg ZGF0ZS5jb25zdHJ1Y3RvciA9PT0gRGF0ZSA/IHRoaXMuX2Zvcm1hdERhdGUoaW5z dCwgZGF0ZSkgOiBkYXRlKTsKCQl0aGlzLl9kaWFsb2dJbnB1dC52YWwoZGF0ZSk7 CgoJCXRoaXMuX3BvcyA9IChwb3MgPyAocG9zLmxlbmd0aCA/IHBvcyA6IFtwb3Mu cGFnZVgsIHBvcy5wYWdlWV0pIDogbnVsbCk7CgkJaWYgKCF0aGlzLl9wb3MpIHsK CQkJYnJvd3NlcldpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVu dFdpZHRoOwoJCQlicm93c2VySGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LmNsaWVudEhlaWdodDsKCQkJc2Nyb2xsWCA9IGRvY3VtZW50LmRvY3VtZW50 RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsK CQkJc2Nyb2xsWSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3Ag fHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkJCXRoaXMuX3BvcyA9IC8vIHNo b3VsZCB1c2UgYWN0dWFsIHdpZHRoL2hlaWdodCBiZWxvdwoJCQkJWyhicm93c2Vy V2lkdGggLyAyKSAtIDEwMCArIHNjcm9sbFgsIChicm93c2VySGVpZ2h0IC8gMikg LSAxNTAgKyBzY3JvbGxZXTsKCQl9CgoJCS8vIG1vdmUgaW5wdXQgb24gc2NyZWVu IGZvciBmb2N1cywgYnV0IGhpZGRlbiBiZWhpbmQgZGlhbG9nCgkJdGhpcy5fZGlh bG9nSW5wdXQuY3NzKCJsZWZ0IiwgKHRoaXMuX3Bvc1swXSArIDIwKSArICJweCIp LmNzcygidG9wIiwgdGhpcy5fcG9zWzFdICsgInB4Iik7CgkJaW5zdC5zZXR0aW5n cy5vblNlbGVjdCA9IG9uU2VsZWN0OwoJCXRoaXMuX2luRGlhbG9nID0gdHJ1ZTsK CQl0aGlzLmRwRGl2LmFkZENsYXNzKHRoaXMuX2RpYWxvZ0NsYXNzKTsKCQl0aGlz Ll9zaG93RGF0ZXBpY2tlcih0aGlzLl9kaWFsb2dJbnB1dFswXSk7CgkJaWYgKCQu YmxvY2tVSSkgewoJCQkkLmJsb2NrVUkodGhpcy5kcERpdik7CgkJfQoJCSQuZGF0 YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwgUFJPUF9OQU1FLCBpbnN0KTsKCQlyZXR1 cm4gdGhpczsKCX0sCgoJLyogRGV0YWNoIGEgZGF0ZXBpY2tlciBmcm9tIGl0cyBj b250cm9sLgoJICogQHBhcmFtICB0YXJnZXQJZWxlbWVudCAtIHRoZSB0YXJnZXQg aW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICovCglfZGVzdHJveURh dGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBub2RlTmFtZSwKCQkJ JHRhcmdldCA9ICQodGFyZ2V0KSwKCQkJaW5zdCA9ICQuZGF0YSh0YXJnZXQsIFBS T1BfTkFNRSk7CgoJCWlmICghJHRhcmdldC5oYXNDbGFzcyh0aGlzLm1hcmtlckNs YXNzTmFtZSkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJbm9kZU5hbWUgPSB0YXJnZXQu bm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkkLnJlbW92ZURhdGEodGFyZ2V0LCBQ Uk9QX05BTUUpOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQlpbnN0 LmFwcGVuZC5yZW1vdmUoKTsKCQkJaW5zdC50cmlnZ2VyLnJlbW92ZSgpOwoJCQkk dGFyZ2V0LnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS4KCQkJCXVu YmluZCgiZm9jdXMiLCB0aGlzLl9zaG93RGF0ZXBpY2tlcikuCgkJCQl1bmJpbmQo ImtleWRvd24iLCB0aGlzLl9kb0tleURvd24pLgoJCQkJdW5iaW5kKCJrZXlwcmVz cyIsIHRoaXMuX2RvS2V5UHJlc3MpLgoJCQkJdW5iaW5kKCJrZXl1cCIsIHRoaXMu X2RvS2V5VXApOwoJCX0gZWxzZSBpZiAobm9kZU5hbWUgPT09ICJkaXYiIHx8IG5v ZGVOYW1lID09PSAic3BhbiIpIHsKCQkJJHRhcmdldC5yZW1vdmVDbGFzcyh0aGlz Lm1hcmtlckNsYXNzTmFtZSkuZW1wdHkoKTsKCQl9Cgl9LAoKCS8qIEVuYWJsZSB0 aGUgZGF0ZSBwaWNrZXIgdG8gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICogQHBhcmFt ICB0YXJnZXQJZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2 aXNpb24gb3Igc3BhbgoJICovCglfZW5hYmxlRGF0ZXBpY2tlcjogZnVuY3Rpb24o dGFyZ2V0KSB7CgkJdmFyIG5vZGVOYW1lLCBpbmxpbmUsCgkJCSR0YXJnZXQgPSAk KHRhcmdldCksCgkJCWluc3QgPSAkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUpOwoK CQlpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7 CgkJCXJldHVybjsKCQl9CgoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRv TG93ZXJDYXNlKCk7CgkJaWYgKG5vZGVOYW1lID09PSAiaW5wdXQiKSB7CgkJCXRh cmdldC5kaXNhYmxlZCA9IGZhbHNlOwoJCQlpbnN0LnRyaWdnZXIuZmlsdGVyKCJi dXR0b24iKS4KCQkJCWVhY2goZnVuY3Rpb24oKSB7IHRoaXMuZGlzYWJsZWQgPSBm YWxzZTsgfSkuZW5kKCkuCgkJCQlmaWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eTog IjEuMCIsIGN1cnNvcjogIiJ9KTsKCQl9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAi ZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKSB7CgkJCWlubGluZSA9ICR0YXJn ZXQuY2hpbGRyZW4oIi4iICsgdGhpcy5faW5saW5lQ2xhc3MpOwoJCQlpbmxpbmUu Y2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKTsKCQkJ aW5saW5lLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3Qu dWktZGF0ZXBpY2tlci15ZWFyIikuCgkJCQlwcm9wKCJkaXNhYmxlZCIsIGZhbHNl KTsKCQl9CgkJdGhpcy5fZGlzYWJsZWRJbnB1dHMgPSAkLm1hcCh0aGlzLl9kaXNh YmxlZElucHV0cywKCQkJZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuICh2YWx1ZSA9 PT0gdGFyZ2V0ID8gbnVsbCA6IHZhbHVlKTsgfSk7IC8vIGRlbGV0ZSBlbnRyeQoJ fSwKCgkvKiBEaXNhYmxlIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxl Y3Rpb24uCgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRhcmdldCBp bnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKi8KCV9kaXNhYmxlRGF0 ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIG5vZGVOYW1lLCBpbmxp bmUsCgkJCSR0YXJnZXQgPSAkKHRhcmdldCksCgkJCWluc3QgPSAkLmRhdGEodGFy Z2V0LCBQUk9QX05BTUUpOwoKCQlpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5t YXJrZXJDbGFzc05hbWUpKSB7CgkJCXJldHVybjsKCQl9CgoJCW5vZGVOYW1lID0g dGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaWYgKG5vZGVOYW1lID09 PSAiaW5wdXQiKSB7CgkJCXRhcmdldC5kaXNhYmxlZCA9IHRydWU7CgkJCWluc3Qu dHJpZ2dlci5maWx0ZXIoImJ1dHRvbiIpLgoJCQkJZWFjaChmdW5jdGlvbigpIHsg dGhpcy5kaXNhYmxlZCA9IHRydWU7IH0pLmVuZCgpLgoJCQkJZmlsdGVyKCJpbWci KS5jc3Moe29wYWNpdHk6ICIwLjUiLCBjdXJzb3I6ICJkZWZhdWx0In0pOwoJCX0g ZWxzZSBpZiAobm9kZU5hbWUgPT09ICJkaXYiIHx8IG5vZGVOYW1lID09PSAic3Bh biIpIHsKCQkJaW5saW5lID0gJHRhcmdldC5jaGlsZHJlbigiLiIgKyB0aGlzLl9p bmxpbmVDbGFzcyk7CgkJCWlubGluZS5jaGlsZHJlbigpLmFkZENsYXNzKCJ1aS1z dGF0ZS1kaXNhYmxlZCIpOwoJCQlpbmxpbmUuZmluZCgic2VsZWN0LnVpLWRhdGVw aWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXIiKS4KCQkJCXBy b3AoImRpc2FibGVkIiwgdHJ1ZSk7CgkJfQoJCXRoaXMuX2Rpc2FibGVkSW5wdXRz ID0gJC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsCgkJCWZ1bmN0aW9uKHZhbHVl KSB7IHJldHVybiAodmFsdWUgPT09IHRhcmdldCA/IG51bGwgOiB2YWx1ZSk7IH0p OyAvLyBkZWxldGUgZW50cnkKCQl0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9k aXNhYmxlZElucHV0cy5sZW5ndGhdID0gdGFyZ2V0OwoJfSwKCgkvKiBJcyB0aGUg Zmlyc3QgZmllbGQgaW4gYSBqUXVlcnkgY29sbGVjdGlvbiBkaXNhYmxlZCBhcyBh IGRhdGVwaWNrZXI/CgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRh cmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKiBAcmV0dXJu IGJvb2xlYW4gLSB0cnVlIGlmIGRpc2FibGVkLCBmYWxzZSBpZiBlbmFibGVkCgkg Ki8KCV9pc0Rpc2FibGVkRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJ aWYgKCF0YXJnZXQpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmb3IgKHZhciBp ID0gMDsgaSA8IHRoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aDsgaSsrKSB7CgkJ CWlmICh0aGlzLl9kaXNhYmxlZElucHV0c1tpXSA9PT0gdGFyZ2V0KSB7CgkJCQly ZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCS8qIFJl dHJpZXZlIHRoZSBpbnN0YW5jZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wu CgkgKiBAcGFyYW0gIHRhcmdldCAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQg ZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICogQHJldHVybiAgb2JqZWN0IC0g dGhlIGFzc29jaWF0ZWQgaW5zdGFuY2UgZGF0YQoJICogQHRocm93cyAgZXJyb3Ig aWYgYSBqUXVlcnkgcHJvYmxlbSBnZXR0aW5nIGRhdGEKCSAqLwoJX2dldEluc3Q6 IGZ1bmN0aW9uKHRhcmdldCkgewoJCXRyeSB7CgkJCXJldHVybiAkLmRhdGEodGFy Z2V0LCBQUk9QX05BTUUpOwoJCX0KCQljYXRjaCAoZXJyKSB7CgkJCXRocm93ICJN aXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlciI7CgkJfQoJ fSwKCgkvKiBVcGRhdGUgb3IgcmV0cmlldmUgdGhlIHNldHRpbmdzIGZvciBhIGRh dGUgcGlja2VyIGF0dGFjaGVkIHRvIGFuIGlucHV0IGZpZWxkIG9yIGRpdmlzaW9u LgoJICogQHBhcmFtICB0YXJnZXQgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0 IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqIEBwYXJhbSAgbmFtZQlvYmpl Y3QgLSB0aGUgbmV3IHNldHRpbmdzIHRvIHVwZGF0ZSBvcgoJICoJCQkJc3RyaW5n IC0gdGhlIG5hbWUgb2YgdGhlIHNldHRpbmcgdG8gY2hhbmdlIG9yIHJldHJpZXZl LAoJICoJCQkJd2hlbiByZXRyaWV2aW5nIGFsc28gImFsbCIgZm9yIGFsbCBpbnN0 YW5jZSBzZXR0aW5ncyBvcgoJICoJCQkJImRlZmF1bHRzIiBmb3IgYWxsIGdsb2Jh bCBkZWZhdWx0cwoJICogQHBhcmFtICB2YWx1ZSAgIGFueSAtIHRoZSBuZXcgdmFs dWUgZm9yIHRoZSBzZXR0aW5nCgkgKgkJCQkob21pdCBpZiBhYm92ZSBpcyBhbiBv YmplY3Qgb3IgdG8gcmV0cmlldmUgYSB2YWx1ZSkKCSAqLwoJX29wdGlvbkRhdGVw aWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHsKCQl2YXIgc2V0 dGluZ3MsIGRhdGUsIG1pbkRhdGUsIG1heERhdGUsCgkJCWluc3QgPSB0aGlzLl9n ZXRJbnN0KHRhcmdldCk7CgoJCWlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYm IHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewoJCQlyZXR1cm4gKG5hbWUgPT09 ICJkZWZhdWx0cyIgPyAkLmV4dGVuZCh7fSwgJC5kYXRlcGlja2VyLl9kZWZhdWx0 cykgOgoJCQkJKGluc3QgPyAobmFtZSA9PT0gImFsbCIgPyAkLmV4dGVuZCh7fSwg aW5zdC5zZXR0aW5ncykgOgoJCQkJdGhpcy5fZ2V0KGluc3QsIG5hbWUpKSA6IG51 bGwpKTsKCQl9CgoJCXNldHRpbmdzID0gbmFtZSB8fCB7fTsKCQlpZiAodHlwZW9m IG5hbWUgPT09ICJzdHJpbmciKSB7CgkJCXNldHRpbmdzID0ge307CgkJCXNldHRp bmdzW25hbWVdID0gdmFsdWU7CgkJfQoKCQlpZiAoaW5zdCkgewoJCQlpZiAodGhp cy5fY3VySW5zdCA9PT0gaW5zdCkgewoJCQkJdGhpcy5faGlkZURhdGVwaWNrZXIo KTsKCQkJfQoKCQkJZGF0ZSA9IHRoaXMuX2dldERhdGVEYXRlcGlja2VyKHRhcmdl dCwgdHJ1ZSk7CgkJCW1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3Qs ICJtaW4iKTsKCQkJbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwg Im1heCIpOwoJCQlleHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5ncywgc2V0dGluZ3Mp OwoJCQkvLyByZWZvcm1hdCB0aGUgb2xkIG1pbkRhdGUvbWF4RGF0ZSB2YWx1ZXMg aWYgZGF0ZUZvcm1hdCBjaGFuZ2VzIGFuZCBhIG5ldyBtaW5EYXRlL21heERhdGUg aXNuJ3QgcHJvdmlkZWQKCQkJaWYgKG1pbkRhdGUgIT09IG51bGwgJiYgc2V0dGlu Z3MuZGF0ZUZvcm1hdCAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzLm1pbkRhdGUg PT09IHVuZGVmaW5lZCkgewoJCQkJaW5zdC5zZXR0aW5ncy5taW5EYXRlID0gdGhp cy5fZm9ybWF0RGF0ZShpbnN0LCBtaW5EYXRlKTsKCQkJfQoJCQlpZiAobWF4RGF0 ZSAhPT0gbnVsbCAmJiBzZXR0aW5ncy5kYXRlRm9ybWF0ICE9PSB1bmRlZmluZWQg JiYgc2V0dGluZ3MubWF4RGF0ZSA9PT0gdW5kZWZpbmVkKSB7CgkJCQlpbnN0LnNl dHRpbmdzLm1heERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGluc3QsIG1heERhdGUp OwoJCQl9CgkJCWlmICggImRpc2FibGVkIiBpbiBzZXR0aW5ncyApIHsKCQkJCWlm ICggc2V0dGluZ3MuZGlzYWJsZWQgKSB7CgkJCQkJdGhpcy5fZGlzYWJsZURhdGVw aWNrZXIodGFyZ2V0KTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhpcy5fZW5hYmxlRGF0 ZXBpY2tlcih0YXJnZXQpOwoJCQkJfQoJCQl9CgkJCXRoaXMuX2F0dGFjaG1lbnRz KCQodGFyZ2V0KSwgaW5zdCk7CgkJCXRoaXMuX2F1dG9TaXplKGluc3QpOwoJCQl0 aGlzLl9zZXREYXRlKGluc3QsIGRhdGUpOwoJCQl0aGlzLl91cGRhdGVBbHRlcm5h dGUoaW5zdCk7CgkJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJfQoJ fSwKCgkvLyBjaGFuZ2UgbWV0aG9kIGRlcHJlY2F0ZWQKCV9jaGFuZ2VEYXRlcGlj a2VyOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7CgkJdGhpcy5fb3B0 aW9uRGF0ZXBpY2tlcih0YXJnZXQsIG5hbWUsIHZhbHVlKTsKCX0sCgoJLyogUmVk cmF3IHRoZSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBv ciBkaXZpc2lvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRh cmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKi8KCV9yZWZy ZXNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIGluc3QgPSB0 aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QpIHsKCQkJdGhpcy5fdXBk YXRlRGF0ZXBpY2tlcihpbnN0KTsKCQl9Cgl9LAoKCS8qIFNldCB0aGUgZGF0ZXMg Zm9yIGEgalF1ZXJ5IHNlbGVjdGlvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0IGVsZW1l bnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4K CSAqIEBwYXJhbSAgZGF0ZQlEYXRlIC0gdGhlIG5ldyBkYXRlCgkgKi8KCV9zZXRE YXRlRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBkYXRlKSB7CgkJdmFyIGlu c3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QpIHsKCQkJdGhp cy5fc2V0RGF0ZShpbnN0LCBkYXRlKTsKCQkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tl cihpbnN0KTsKCQkJdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCX0KCX0s CgoJLyogR2V0IHRoZSBkYXRlKHMpIGZvciB0aGUgZmlyc3QgZW50cnkgaW4gYSBq UXVlcnkgc2VsZWN0aW9uLgoJICogQHBhcmFtICB0YXJnZXQgZWxlbWVudCAtIHRo ZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICogQHBh cmFtICBub0RlZmF1bHQgYm9vbGVhbiAtIHRydWUgaWYgbm8gZGVmYXVsdCBkYXRl IGlzIHRvIGJlIHVzZWQKCSAqIEByZXR1cm4gRGF0ZSAtIHRoZSBjdXJyZW50IGRh dGUKCSAqLwoJX2dldERhdGVEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5v RGVmYXVsdCkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoJ CWlmIChpbnN0ICYmICFpbnN0LmlubGluZSkgewoJCQl0aGlzLl9zZXREYXRlRnJv bUZpZWxkKGluc3QsIG5vRGVmYXVsdCk7CgkJfQoJCXJldHVybiAoaW5zdCA/IHRo aXMuX2dldERhdGUoaW5zdCkgOiBudWxsKTsKCX0sCgoJLyogSGFuZGxlIGtleXN0 cm9rZXMuICovCglfZG9LZXlEb3duOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBv blNlbGVjdCwgZGF0ZVN0ciwgc2VsLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9n ZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCWhhbmRsZWQgPSB0cnVlLAoJCQlpc1JU TCA9IGluc3QuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpOwoKCQlpbnN0 Ll9rZXlFdmVudCA9IHRydWU7CgkJaWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tl clNob3dpbmcpIHsKCQkJc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CgkJCQljYXNl IDk6ICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkJaGFuZGxl ZCA9IGZhbHNlOwoJCQkJCQlicmVhazsgLy8gaGlkZSBvbiB0YWIgb3V0CgkJCQlj YXNlIDEzOiBzZWwgPSAkKCJ0ZC4iICsgJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xh c3MgKyAiOm5vdCguIiArCgkJCQkJCQkJCSQuZGF0ZXBpY2tlci5fY3VycmVudENs YXNzICsgIikiLCBpbnN0LmRwRGl2KTsKCQkJCQkJaWYgKHNlbFswXSkgewoJCQkJ CQkJJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoZXZlbnQudGFyZ2V0LCBpbnN0LnNl bGVjdGVkTW9udGgsIGluc3Quc2VsZWN0ZWRZZWFyLCBzZWxbMF0pOwoJCQkJCQl9 CgoJCQkJCQlvblNlbGVjdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJvblNl bGVjdCIpOwoJCQkJCQlpZiAob25TZWxlY3QpIHsKCQkJCQkJCWRhdGVTdHIgPSAk LmRhdGVwaWNrZXIuX2Zvcm1hdERhdGUoaW5zdCk7CgoJCQkJCQkJLy8gdHJpZ2dl ciBjdXN0b20gY2FsbGJhY2sKCQkJCQkJCW9uU2VsZWN0LmFwcGx5KChpbnN0Lmlu cHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbZGF0ZVN0ciwgaW5zdF0pOwoJ CQkJCQl9IGVsc2UgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tl cigpOwoJCQkJCQl9CgoJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHN1Ym1p dCB0aGUgZm9ybQoJCQkJY2FzZSAyNzogJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBp Y2tlcigpOwoJCQkJCQlicmVhazsgLy8gaGlkZSBvbiBlc2NhcGUKCQkJCWNhc2Ug MzM6ICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVu dC5jdHJsS2V5ID8KCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3Rl cEJpZ01vbnRocyIpIDoKCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAi c3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJYnJlYWs7IC8vIHByZXZpb3VzIG1v bnRoL3llYXIgb24gcGFnZSB1cC8rIGN0cmwKCQkJCWNhc2UgMzQ6ICQuZGF0ZXBp Y2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVudC5jdHJsS2V5ID8K CQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIp IDoKCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIp KSwgIk0iKTsKCQkJCQkJYnJlYWs7IC8vIG5leHQgbW9udGgveWVhciBvbiBwYWdl IGRvd24vKyBjdHJsCgkJCQljYXNlIDM1OiBpZiAoZXZlbnQuY3RybEtleSB8fCBl dmVudC5tZXRhS2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShl dmVudC50YXJnZXQpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJs S2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCWJyZWFrOyAvLyBjbGVhciBvbiBj dHJsIG9yIGNvbW1hbmQgK2VuZAoJCQkJY2FzZSAzNjogaWYgKGV2ZW50LmN0cmxL ZXkgfHwgZXZlbnQubWV0YUtleSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9nb3Rv VG9kYXkoZXZlbnQudGFyZ2V0KTsKCQkJCQkJfQoJCQkJCQloYW5kbGVkID0gZXZl bnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQlicmVhazsgLy8gY3Vy cmVudCBvbiBjdHJsIG9yIGNvbW1hbmQgK2hvbWUKCQkJCWNhc2UgMzc6IGlmIChl dmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBp Y2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChpc1JUTCA/ICsxIDogLTEp LCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8 IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCS8vIC0xIGRheSBvbiBjdHJsIG9yIGNvbW1h bmQgK2xlZnQKCQkJCQkJaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQuYWx0S2V5KSB7 CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAo ZXZlbnQuY3RybEtleSA/CgkJCQkJCQkJLSQuZGF0ZXBpY2tlci5fZ2V0KGluc3Qs ICJzdGVwQmlnTW9udGhzIikgOgoJCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChp bnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJfQoJCQkJCQkvLyBuZXh0 IG1vbnRoL3llYXIgb24gYWx0ICtsZWZ0IG9uIE1hYwoJCQkJCQlicmVhazsKCQkJ CWNhc2UgMzg6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsK CQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIC03 LCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8 IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCWJyZWFrOyAvLyAtMSB3ZWVrIG9uIGN0cmwg b3IgY29tbWFuZCArdXAKCQkJCWNhc2UgMzk6IGlmIChldmVudC5jdHJsS2V5IHx8 IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0 ZShldmVudC50YXJnZXQsIChpc1JUTCA/IC0xIDogKzEpLCAiRCIpOwoJCQkJCQl9 CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7 CgkJCQkJCS8vICsxIGRheSBvbiBjdHJsIG9yIGNvbW1hbmQgK3JpZ2h0CgkJCQkJ CWlmIChldmVudC5vcmlnaW5hbEV2ZW50LmFsdEtleSkgewoJCQkJCQkJJC5kYXRl cGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGV2ZW50LmN0cmxLZXkg PwoJCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRo cyIpIDoKCQkJCQkJCQkrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInN0ZXBNb250 aHMiKSksICJNIik7CgkJCQkJCX0KCQkJCQkJLy8gbmV4dCBtb250aC95ZWFyIG9u IGFsdCArcmlnaHQKCQkJCQkJYnJlYWs7CgkJCQljYXNlIDQwOiBpZiAoZXZlbnQu Y3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIu X2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCArNywgIkQiKTsKCQkJCQkJfQoJCQkJ CQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJ CQlicmVhazsgLy8gKzEgd2VlayBvbiBjdHJsIG9yIGNvbW1hbmQgK2Rvd24KCQkJ CWRlZmF1bHQ6IGhhbmRsZWQgPSBmYWxzZTsKCQkJfQoJCX0gZWxzZSBpZiAoZXZl bnQua2V5Q29kZSA9PT0gMzYgJiYgZXZlbnQuY3RybEtleSkgeyAvLyBkaXNwbGF5 IHRoZSBkYXRlIHBpY2tlciBvbiBjdHJsK2hvbWUKCQkJJC5kYXRlcGlja2VyLl9z aG93RGF0ZXBpY2tlcih0aGlzKTsKCQl9IGVsc2UgewoJCQloYW5kbGVkID0gZmFs c2U7CgkJfQoKCQlpZiAoaGFuZGxlZCkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVs dCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9Cgl9LAoKCS8qIEZp bHRlciBlbnRlcmVkIGNoYXJhY3RlcnMgLSBiYXNlZCBvbiBkYXRlIGZvcm1hdC4g Ki8KCV9kb0tleVByZXNzOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBjaGFycywg Y2hyLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdl dCk7CgoJCWlmICgkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAiY29uc3RyYWluSW5w dXQiKSkgewoJCQljaGFycyA9ICQuZGF0ZXBpY2tlci5fcG9zc2libGVDaGFycygk LmRhdGVwaWNrZXIuX2dldChpbnN0LCAiZGF0ZUZvcm1hdCIpKTsKCQkJY2hyID0g U3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSA9PSBudWxsID8gZXZl bnQua2V5Q29kZSA6IGV2ZW50LmNoYXJDb2RlKTsKCQkJcmV0dXJuIGV2ZW50LmN0 cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCAoY2hyIDwgIiAiIHx8ICFjaGFycyB8 fCBjaGFycy5pbmRleE9mKGNocikgPiAtMSk7CgkJfQoJfSwKCgkvKiBTeW5jaHJv bmlzZSBtYW51YWwgZW50cnkgYW5kIGZpZWxkL2FsdGVybmF0ZSBmaWVsZC4gKi8K CV9kb0tleVVwOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBkYXRlLAoJCQlpbnN0 ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7CgoJCWlmIChp bnN0LmlucHV0LnZhbCgpICE9PSBpbnN0Lmxhc3RWYWwpIHsKCQkJdHJ5IHsKCQkJ CWRhdGUgPSAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0 KGluc3QsICJkYXRlRm9ybWF0IiksCgkJCQkJKGluc3QuaW5wdXQgPyBpbnN0Lmlu cHV0LnZhbCgpIDogbnVsbCksCgkJCQkJJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRD b25maWcoaW5zdCkpOwoKCQkJCWlmIChkYXRlKSB7IC8vIG9ubHkgaWYgdmFsaWQK CQkJCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJCQkJ JC5kYXRlcGlja2VyLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCQkJJC5kYXRl cGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCQkJfQoJCQl9CgkJCWNh dGNoIChlcnIpIHsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJLyogUG9w LXVwIHRoZSBkYXRlIHBpY2tlciBmb3IgYSBnaXZlbiBpbnB1dCBmaWVsZC4KCSAq IElmIGZhbHNlIHJldHVybmVkIGZyb20gYmVmb3JlU2hvdyBldmVudCBoYW5kbGVy IGRvIG5vdCBzaG93LgoJICogQHBhcmFtICBpbnB1dCAgZWxlbWVudCAtIHRoZSBp bnB1dCBmaWVsZCBhdHRhY2hlZCB0byB0aGUgZGF0ZSBwaWNrZXIgb3IKCSAqCQkJ CQlldmVudCAtIGlmIHRyaWdnZXJlZCBieSBmb2N1cwoJICovCglfc2hvd0RhdGVw aWNrZXI6IGZ1bmN0aW9uKGlucHV0KSB7CgkJaW5wdXQgPSBpbnB1dC50YXJnZXQg fHwgaW5wdXQ7CgkJaWYgKGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09 ICJpbnB1dCIpIHsgLy8gZmluZCBmcm9tIGJ1dHRvbi9pbWFnZSB0cmlnZ2VyCgkJ CWlucHV0ID0gJCgiaW5wdXQiLCBpbnB1dC5wYXJlbnROb2RlKVswXTsKCQl9CgoJ CWlmICgkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGlucHV0KSB8 fCAkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCA9PT0gaW5wdXQpIHsgLy8gYWxyZWFk eSBoZXJlCgkJCXJldHVybjsKCQl9CgoJCXZhciBpbnN0LCBiZWZvcmVTaG93LCBi ZWZvcmVTaG93U2V0dGluZ3MsIGlzRml4ZWQsCgkJCW9mZnNldCwgc2hvd0FuaW0s IGR1cmF0aW9uOwoKCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGlucHV0 KTsKCQlpZiAoJC5kYXRlcGlja2VyLl9jdXJJbnN0ICYmICQuZGF0ZXBpY2tlci5f Y3VySW5zdCAhPT0gaW5zdCkgewoJCQkkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBE aXYuc3RvcCh0cnVlLCB0cnVlKTsKCQkJaWYgKCBpbnN0ICYmICQuZGF0ZXBpY2tl ci5fZGF0ZXBpY2tlclNob3dpbmcgKSB7CgkJCQkkLmRhdGVwaWNrZXIuX2hpZGVE YXRlcGlja2VyKCAkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0gKTsKCQkJ fQoJCX0KCgkJYmVmb3JlU2hvdyA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJi ZWZvcmVTaG93Iik7CgkJYmVmb3JlU2hvd1NldHRpbmdzID0gYmVmb3JlU2hvdyA/ IGJlZm9yZVNob3cuYXBwbHkoaW5wdXQsIFtpbnB1dCwgaW5zdF0pIDoge307CgkJ aWYoYmVmb3JlU2hvd1NldHRpbmdzID09PSBmYWxzZSl7CgkJCXJldHVybjsKCQl9 CgkJZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3MsIGJlZm9yZVNob3dTZXR0aW5n cyk7CgoJCWluc3QubGFzdFZhbCA9IG51bGw7CgkJJC5kYXRlcGlja2VyLl9sYXN0 SW5wdXQgPSBpbnB1dDsKCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQo aW5zdCk7CgoJCWlmICgkLmRhdGVwaWNrZXIuX2luRGlhbG9nKSB7IC8vIGhpZGUg Y3Vyc29yCgkJCWlucHV0LnZhbHVlID0gIiI7CgkJfQoJCWlmICghJC5kYXRlcGlj a2VyLl9wb3MpIHsgLy8gcG9zaXRpb24gYmVsb3cgaW5wdXQKCQkJJC5kYXRlcGlj a2VyLl9wb3MgPSAkLmRhdGVwaWNrZXIuX2ZpbmRQb3MoaW5wdXQpOwoJCQkkLmRh dGVwaWNrZXIuX3Bvc1sxXSArPSBpbnB1dC5vZmZzZXRIZWlnaHQ7IC8vIGFkZCB0 aGUgaGVpZ2h0CgkJfQoKCQlpc0ZpeGVkID0gZmFsc2U7CgkJJChpbnB1dCkucGFy ZW50cygpLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlzRml4ZWQgfD0gJCh0aGlzKS5j c3MoInBvc2l0aW9uIikgPT09ICJmaXhlZCI7CgkJCXJldHVybiAhaXNGaXhlZDsK CQl9KTsKCgkJb2Zmc2V0ID0ge2xlZnQ6ICQuZGF0ZXBpY2tlci5fcG9zWzBdLCB0 b3A6ICQuZGF0ZXBpY2tlci5fcG9zWzFdfTsKCQkkLmRhdGVwaWNrZXIuX3BvcyA9 IG51bGw7CgkJLy90byBhdm9pZCBmbGFzaGVzIG9uIEZpcmVmb3gKCQlpbnN0LmRw RGl2LmVtcHR5KCk7CgkJLy8gZGV0ZXJtaW5lIHNpemluZyBvZmZzY3JlZW4KCQlp bnN0LmRwRGl2LmNzcyh7cG9zaXRpb246ICJhYnNvbHV0ZSIsIGRpc3BsYXk6ICJi bG9jayIsIHRvcDogIi0xMDAwcHgifSk7CgkJJC5kYXRlcGlja2VyLl91cGRhdGVE YXRlcGlja2VyKGluc3QpOwoJCS8vIGZpeCB3aWR0aCBmb3IgZHluYW1pYyBudW1i ZXIgb2YgZGF0ZSBwaWNrZXJzCgkJLy8gYW5kIGFkanVzdCBwb3NpdGlvbiBiZWZv cmUgc2hvd2luZwoJCW9mZnNldCA9ICQuZGF0ZXBpY2tlci5fY2hlY2tPZmZzZXQo aW5zdCwgb2Zmc2V0LCBpc0ZpeGVkKTsKCQlpbnN0LmRwRGl2LmNzcyh7cG9zaXRp b246ICgkLmRhdGVwaWNrZXIuX2luRGlhbG9nICYmICQuYmxvY2tVSSA/CgkJCSJz dGF0aWMiIDogKGlzRml4ZWQgPyAiZml4ZWQiIDogImFic29sdXRlIikpLCBkaXNw bGF5OiAibm9uZSIsCgkJCWxlZnQ6IG9mZnNldC5sZWZ0ICsgInB4IiwgdG9wOiBv ZmZzZXQudG9wICsgInB4In0pOwoKCQlpZiAoIWluc3QuaW5saW5lKSB7CgkJCXNo b3dBbmltID0gJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInNob3dBbmltIik7CgkJ CWR1cmF0aW9uID0gJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgImR1cmF0aW9uIik7 CgkJCWluc3QuZHBEaXYuekluZGV4KCQoaW5wdXQpLnpJbmRleCgpKzEpOwoJCQkk LmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nID0gdHJ1ZTsKCgkJCWlmICgg JC5lZmZlY3RzICYmICQuZWZmZWN0cy5lZmZlY3RbIHNob3dBbmltIF0gKSB7CgkJ CQlpbnN0LmRwRGl2LnNob3coc2hvd0FuaW0sICQuZGF0ZXBpY2tlci5fZ2V0KGlu c3QsICJzaG93T3B0aW9ucyIpLCBkdXJhdGlvbik7CgkJCX0gZWxzZSB7CgkJCQlp bnN0LmRwRGl2W3Nob3dBbmltIHx8ICJzaG93Il0oc2hvd0FuaW0gPyBkdXJhdGlv biA6IG51bGwpOwoJCQl9CgoJCQlpZiAoaW5zdC5pbnB1dC5pcygiOnZpc2libGUi KSAmJiAhaW5zdC5pbnB1dC5pcygiOmRpc2FibGVkIikpIHsKCQkJCWluc3QuaW5w dXQuZm9jdXMoKTsKCQkJfQoJCQkkLmRhdGVwaWNrZXIuX2N1ckluc3QgPSBpbnN0 OwoJCX0KCX0sCgoJLyogR2VuZXJhdGUgdGhlIGRhdGUgcGlja2VyIGNvbnRlbnQu ICovCglfdXBkYXRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5zdCkgewoJCXRoaXMu bWF4Um93cyA9IDQ7IC8vUmVzZXQgdGhlIG1heCBudW1iZXIgb2Ygcm93cyBiZWlu ZyBkaXNwbGF5ZWQgKHNlZSAjNzA0MykKCQlpbnN0QWN0aXZlID0gaW5zdDsgLy8g Zm9yIGRlbGVnYXRlIGhvdmVyIGV2ZW50cwoJCWluc3QuZHBEaXYuZW1wdHkoKS5h cHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGluc3QpKTsKCQl0aGlzLl9hdHRhY2hI YW5kbGVycyhpbnN0KTsKCQlpbnN0LmRwRGl2LmZpbmQoIi4iICsgdGhpcy5fZGF5 T3ZlckNsYXNzICsgIiBhIikubW91c2VvdmVyKCk7CgoJCXZhciBvcmlneWVhcnNo dG1sLAoJCQludW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0 KSwKCQkJY29scyA9IG51bU1vbnRoc1sxXSwKCQkJd2lkdGggPSAxNzsKCgkJaW5z dC5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRh dGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgi Iik7CgkJaWYgKGNvbHMgPiAxKSB7CgkJCWluc3QuZHBEaXYuYWRkQ2xhc3MoInVp LWRhdGVwaWNrZXItbXVsdGktIiArIGNvbHMpLmNzcygid2lkdGgiLCAod2lkdGgg KiBjb2xzKSArICJlbSIpOwoJCX0KCQlpbnN0LmRwRGl2WyhudW1Nb250aHNbMF0g IT09IDEgfHwgbnVtTW9udGhzWzFdICE9PSAxID8gImFkZCIgOiAicmVtb3ZlIikg KwoJCQkiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpOwoJCWluc3QuZHBE aXZbKHRoaXMuX2dldChpbnN0LCAiaXNSVEwiKSA/ICJhZGQiIDogInJlbW92ZSIp ICsKCQkJIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIik7CgoJCS8vICM2Njk0 IC0gZG9uJ3QgZm9jdXMgdGhlIGlucHV0IGlmIGl0J3MgYWxyZWFkeSBmb2N1c2Vk CgkJLy8gdGhpcyBicmVha3MgdGhlIGNoYW5nZSBldmVudCBpbiBJRQoJCWlmIChp bnN0ID09PSAkLmRhdGVwaWNrZXIuX2N1ckluc3QgJiYgJC5kYXRlcGlja2VyLl9k YXRlcGlja2VyU2hvd2luZyAmJiBpbnN0LmlucHV0ICYmCgkJCWluc3QuaW5wdXQu aXMoIjp2aXNpYmxlIikgJiYgIWluc3QuaW5wdXQuaXMoIjpkaXNhYmxlZCIpICYm IGluc3QuaW5wdXRbMF0gIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHsKCQkJ aW5zdC5pbnB1dC5mb2N1cygpOwoJCX0KCgkJLy8gZGVmZmVyZWQgcmVuZGVyIG9m IHRoZSB5ZWFycyBzZWxlY3QgKHRvIGF2b2lkIGZsYXNoZXMgb24gRmlyZWZveCkK CQlpZiggaW5zdC55ZWFyc2h0bWwgKXsKCQkJb3JpZ3llYXJzaHRtbCA9IGluc3Qu eWVhcnNodG1sOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkvL2Fzc3Vy ZSB0aGF0IGluc3QueWVhcnNodG1sIGRpZG4ndCBjaGFuZ2UuCgkJCQlpZiggb3Jp Z3llYXJzaHRtbCA9PT0gaW5zdC55ZWFyc2h0bWwgJiYgaW5zdC55ZWFyc2h0bWwg KXsKCQkJCQlpbnN0LmRwRGl2LmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLXll YXI6Zmlyc3QiKS5yZXBsYWNlV2l0aChpbnN0LnllYXJzaHRtbCk7CgkJCQl9CgkJ CQlvcmlneWVhcnNodG1sID0gaW5zdC55ZWFyc2h0bWwgPSBudWxsOwoJCQl9LCAw KTsKCQl9Cgl9LAoKCS8qIFJldHJpZXZlIHRoZSBzaXplIG9mIGxlZnQgYW5kIHRv cCBib3JkZXJzIGZvciBhbiBlbGVtZW50LgoJICogQHBhcmFtICBlbGVtICAoalF1 ZXJ5IG9iamVjdCkgdGhlIGVsZW1lbnQgb2YgaW50ZXJlc3QKCSAqIEByZXR1cm4g IChudW1iZXJbMl0pIHRoZSBsZWZ0IGFuZCB0b3AgYm9yZGVycwoJICovCglfZ2V0 Qm9yZGVyczogZnVuY3Rpb24oZWxlbSkgewoJCXZhciBjb252ZXJ0ID0gZnVuY3Rp b24odmFsdWUpIHsKCQkJcmV0dXJuIHt0aGluOiAxLCBtZWRpdW06IDIsIHRoaWNr OiAzfVt2YWx1ZV0gfHwgdmFsdWU7CgkJfTsKCQlyZXR1cm4gW3BhcnNlRmxvYXQo Y29udmVydChlbGVtLmNzcygiYm9yZGVyLWxlZnQtd2lkdGgiKSkpLAoJCQlwYXJz ZUZsb2F0KGNvbnZlcnQoZWxlbS5jc3MoImJvcmRlci10b3Atd2lkdGgiKSkpXTsK CX0sCgoJLyogQ2hlY2sgcG9zaXRpb25pbmcgdG8gcmVtYWluIG9uIHNjcmVlbi4g Ki8KCV9jaGVja09mZnNldDogZnVuY3Rpb24oaW5zdCwgb2Zmc2V0LCBpc0ZpeGVk KSB7CgkJdmFyIGRwV2lkdGggPSBpbnN0LmRwRGl2Lm91dGVyV2lkdGgoKSwKCQkJ ZHBIZWlnaHQgPSBpbnN0LmRwRGl2Lm91dGVySGVpZ2h0KCksCgkJCWlucHV0V2lk dGggPSBpbnN0LmlucHV0ID8gaW5zdC5pbnB1dC5vdXRlcldpZHRoKCkgOiAwLAoJ CQlpbnB1dEhlaWdodCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0Lm91dGVySGVp Z2h0KCkgOiAwLAoJCQl2aWV3V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1l bnQuY2xpZW50V2lkdGggKyAoaXNGaXhlZCA/IDAgOiAkKGRvY3VtZW50KS5zY3Jv bGxMZWZ0KCkpLAoJCQl2aWV3SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LmNsaWVudEhlaWdodCArIChpc0ZpeGVkID8gMCA6ICQoZG9jdW1lbnQpLnNj cm9sbFRvcCgpKTsKCgkJb2Zmc2V0LmxlZnQgLT0gKHRoaXMuX2dldChpbnN0LCAi aXNSVEwiKSA/IChkcFdpZHRoIC0gaW5wdXRXaWR0aCkgOiAwKTsKCQlvZmZzZXQu bGVmdCAtPSAoaXNGaXhlZCAmJiBvZmZzZXQubGVmdCA9PT0gaW5zdC5pbnB1dC5v ZmZzZXQoKS5sZWZ0KSA/ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSA6IDA7CgkJ b2Zmc2V0LnRvcCAtPSAoaXNGaXhlZCAmJiBvZmZzZXQudG9wID09PSAoaW5zdC5p bnB1dC5vZmZzZXQoKS50b3AgKyBpbnB1dEhlaWdodCkpID8gJChkb2N1bWVudCku c2Nyb2xsVG9wKCkgOiAwOwoKCQkvLyBub3cgY2hlY2sgaWYgZGF0ZXBpY2tlciBp cyBzaG93aW5nIG91dHNpZGUgd2luZG93IHZpZXdwb3J0IC0gbW92ZSB0byBhIGJl dHRlciBwbGFjZSBpZiBzby4KCQlvZmZzZXQubGVmdCAtPSBNYXRoLm1pbihvZmZz ZXQubGVmdCwgKG9mZnNldC5sZWZ0ICsgZHBXaWR0aCA+IHZpZXdXaWR0aCAmJiB2 aWV3V2lkdGggPiBkcFdpZHRoKSA/CgkJCU1hdGguYWJzKG9mZnNldC5sZWZ0ICsg ZHBXaWR0aCAtIHZpZXdXaWR0aCkgOiAwKTsKCQlvZmZzZXQudG9wIC09IE1hdGgu bWluKG9mZnNldC50b3AsIChvZmZzZXQudG9wICsgZHBIZWlnaHQgPiB2aWV3SGVp Z2h0ICYmIHZpZXdIZWlnaHQgPiBkcEhlaWdodCkgPwoJCQlNYXRoLmFicyhkcEhl aWdodCArIGlucHV0SGVpZ2h0KSA6IDApOwoKCQlyZXR1cm4gb2Zmc2V0OwoJfSwK CgkvKiBGaW5kIGFuIG9iamVjdCdzIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4uICov CglfZmluZFBvczogZnVuY3Rpb24ob2JqKSB7CgkJdmFyIHBvc2l0aW9uLAoJCQlp bnN0ID0gdGhpcy5fZ2V0SW5zdChvYmopLAoJCQlpc1JUTCA9IHRoaXMuX2dldChp bnN0LCAiaXNSVEwiKTsKCgkJd2hpbGUgKG9iaiAmJiAob2JqLnR5cGUgPT09ICJo aWRkZW4iIHx8IG9iai5ub2RlVHlwZSAhPT0gMSB8fCAkLmV4cHIuZmlsdGVycy5o aWRkZW4ob2JqKSkpIHsKCQkJb2JqID0gb2JqW2lzUlRMID8gInByZXZpb3VzU2li bGluZyIgOiAibmV4dFNpYmxpbmciXTsKCQl9CgoJCXBvc2l0aW9uID0gJChvYmop Lm9mZnNldCgpOwoJCXJldHVybiBbcG9zaXRpb24ubGVmdCwgcG9zaXRpb24udG9w XTsKCX0sCgoJLyogSGlkZSB0aGUgZGF0ZSBwaWNrZXIgZnJvbSB2aWV3LgoJICog QHBhcmFtICBpbnB1dCAgZWxlbWVudCAtIHRoZSBpbnB1dCBmaWVsZCBhdHRhY2hl ZCB0byB0aGUgZGF0ZSBwaWNrZXIKCSAqLwoJX2hpZGVEYXRlcGlja2VyOiBmdW5j dGlvbihpbnB1dCkgewoJCXZhciBzaG93QW5pbSwgZHVyYXRpb24sIHBvc3RQcm9j ZXNzLCBvbkNsb3NlLAoJCQlpbnN0ID0gdGhpcy5fY3VySW5zdDsKCgkJaWYgKCFp bnN0IHx8IChpbnB1dCAmJiBpbnN0ICE9PSAkLmRhdGEoaW5wdXQsIFBST1BfTkFN RSkpKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICh0aGlzLl9kYXRlcGlja2VyU2hv d2luZykgewoJCQlzaG93QW5pbSA9IHRoaXMuX2dldChpbnN0LCAic2hvd0FuaW0i KTsKCQkJZHVyYXRpb24gPSB0aGlzLl9nZXQoaW5zdCwgImR1cmF0aW9uIik7CgkJ CXBvc3RQcm9jZXNzID0gZnVuY3Rpb24oKSB7CgkJCQkkLmRhdGVwaWNrZXIuX3Rp ZHlEaWFsb2coaW5zdCk7CgkJCX07CgoJCQkvLyBERVBSRUNBVEVEOiBhZnRlciBC QyBmb3IgMS44LnggJC5lZmZlY3RzWyBzaG93QW5pbSBdIGlzIG5vdCBuZWVkZWQK CQkJaWYgKCAkLmVmZmVjdHMgJiYgKCAkLmVmZmVjdHMuZWZmZWN0WyBzaG93QW5p bSBdIHx8ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSApICkgewoJCQkJaW5zdC5kcERp di5oaWRlKHNob3dBbmltLCAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic2hvd09w dGlvbnMiKSwgZHVyYXRpb24sIHBvc3RQcm9jZXNzKTsKCQkJfSBlbHNlIHsKCQkJ CWluc3QuZHBEaXZbKHNob3dBbmltID09PSAic2xpZGVEb3duIiA/ICJzbGlkZVVw IiA6CgkJCQkJKHNob3dBbmltID09PSAiZmFkZUluIiA/ICJmYWRlT3V0IiA6ICJo aWRlIikpXSgoc2hvd0FuaW0gPyBkdXJhdGlvbiA6IG51bGwpLCBwb3N0UHJvY2Vz cyk7CgkJCX0KCgkJCWlmICghc2hvd0FuaW0pIHsKCQkJCXBvc3RQcm9jZXNzKCk7 CgkJCX0KCQkJdGhpcy5fZGF0ZXBpY2tlclNob3dpbmcgPSBmYWxzZTsKCgkJCW9u Q2xvc2UgPSB0aGlzLl9nZXQoaW5zdCwgIm9uQ2xvc2UiKTsKCQkJaWYgKG9uQ2xv c2UpIHsKCQkJCW9uQ2xvc2UuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0 WzBdIDogbnVsbCksIFsoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQudmFsKCkgOiAi IiksIGluc3RdKTsKCQkJfQoKCQkJdGhpcy5fbGFzdElucHV0ID0gbnVsbDsKCQkJ aWYgKHRoaXMuX2luRGlhbG9nKSB7CgkJCQl0aGlzLl9kaWFsb2dJbnB1dC5jc3Mo eyBwb3NpdGlvbjogImFic29sdXRlIiwgbGVmdDogIjAiLCB0b3A6ICItMTAwcHgi IH0pOwoJCQkJaWYgKCQuYmxvY2tVSSkgewoJCQkJCSQudW5ibG9ja1VJKCk7CgkJ CQkJJCgiYm9keSIpLmFwcGVuZCh0aGlzLmRwRGl2KTsKCQkJCX0KCQkJfQoJCQl0 aGlzLl9pbkRpYWxvZyA9IGZhbHNlOwoJCX0KCX0sCgoJLyogVGlkeSB1cCBhZnRl ciBhIGRpYWxvZyBkaXNwbGF5LiAqLwoJX3RpZHlEaWFsb2c6IGZ1bmN0aW9uKGlu c3QpIHsKCQlpbnN0LmRwRGl2LnJlbW92ZUNsYXNzKHRoaXMuX2RpYWxvZ0NsYXNz KS51bmJpbmQoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIik7Cgl9LAoKCS8qIENs b3NlIGRhdGUgcGlja2VyIGlmIGNsaWNrZWQgZWxzZXdoZXJlLiAqLwoJX2NoZWNr RXh0ZXJuYWxDbGljazogZnVuY3Rpb24oZXZlbnQpIHsKCQlpZiAoISQuZGF0ZXBp Y2tlci5fY3VySW5zdCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgJHRhcmdldCA9 ICQoZXZlbnQudGFyZ2V0KSwKCQkJaW5zdCA9ICQuZGF0ZXBpY2tlci5fZ2V0SW5z dCgkdGFyZ2V0WzBdKTsKCgkJaWYgKCAoICggJHRhcmdldFswXS5pZCAhPT0gJC5k YXRlcGlja2VyLl9tYWluRGl2SWQgJiYKCQkJCSR0YXJnZXQucGFyZW50cygiIyIg KyAkLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoID09PSAwICYmCgkJCQkh JHRhcmdldC5oYXNDbGFzcygkLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSAm JgoJCQkJISR0YXJnZXQuY2xvc2VzdCgiLiIgKyAkLmRhdGVwaWNrZXIuX3RyaWdn ZXJDbGFzcykubGVuZ3RoICYmCgkJCQkkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJT aG93aW5nICYmICEoJC5kYXRlcGlja2VyLl9pbkRpYWxvZyAmJiAkLmJsb2NrVUkp ICkgKSB8fAoJCQkoICR0YXJnZXQuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtl ckNsYXNzTmFtZSkgJiYgJC5kYXRlcGlja2VyLl9jdXJJbnN0ICE9PSBpbnN0ICkg KSB7CgkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7CgkJfQoJfSwK CgkvKiBBZGp1c3Qgb25lIG9mIHRoZSBkYXRlIHN1Yi1maWVsZHMuICovCglfYWRq dXN0RGF0ZTogZnVuY3Rpb24oaWQsIG9mZnNldCwgcGVyaW9kKSB7CgkJdmFyIHRh cmdldCA9ICQoaWQpLAoJCQlpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0p OwoKCQlpZiAodGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIodGFyZ2V0WzBdKSkg ewoJCQlyZXR1cm47CgkJfQoJCXRoaXMuX2FkanVzdEluc3REYXRlKGluc3QsIG9m ZnNldCArCgkJCShwZXJpb2QgPT09ICJNIiA/IHRoaXMuX2dldChpbnN0LCAic2hv d0N1cnJlbnRBdFBvcyIpIDogMCksIC8vIHVuZG8gcG9zaXRpb25pbmcKCQkJcGVy aW9kKTsKCQl0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJfSwKCgkvKiBB Y3Rpb24gZm9yIGN1cnJlbnQgbGluay4gKi8KCV9nb3RvVG9kYXk6IGZ1bmN0aW9u KGlkKSB7CgkJdmFyIGRhdGUsCgkJCXRhcmdldCA9ICQoaWQpLAoJCQlpbnN0ID0g dGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoKCQlpZiAodGhpcy5fZ2V0KGluc3Qs ICJnb3RvQ3VycmVudCIpICYmIGluc3QuY3VycmVudERheSkgewoJCQlpbnN0LnNl bGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5OwoJCQlpbnN0LmRyYXdNb250aCA9 IGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoOwoJCQlpbnN0 LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBpbnN0LmN1cnJlbnRZZWFy OwoJCX0gZWxzZSB7CgkJCWRhdGUgPSBuZXcgRGF0ZSgpOwoJCQlpbnN0LnNlbGVj dGVkRGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJCWluc3QuZHJhd01vbnRoID0gaW5z dC5zZWxlY3RlZE1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwoJCQlpbnN0LmRyYXdZ ZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJ fQoJCXRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTsKCQl0aGlzLl9hZGp1c3REYXRl KHRhcmdldCk7Cgl9LAoKCS8qIEFjdGlvbiBmb3Igc2VsZWN0aW5nIGEgbmV3IG1v bnRoL3llYXIuICovCglfc2VsZWN0TW9udGhZZWFyOiBmdW5jdGlvbihpZCwgc2Vs ZWN0LCBwZXJpb2QpIHsKCQl2YXIgdGFyZ2V0ID0gJChpZCksCgkJCWluc3QgPSB0 aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7CgoJCWluc3RbInNlbGVjdGVkIiArIChw ZXJpb2QgPT09ICJNIiA/ICJNb250aCIgOiAiWWVhciIpXSA9CgkJaW5zdFsiZHJh dyIgKyAocGVyaW9kID09PSAiTSIgPyAiTW9udGgiIDogIlllYXIiKV0gPQoJCQlw YXJzZUludChzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0udmFs dWUsMTApOwoKCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJdGhpcy5fYWRq dXN0RGF0ZSh0YXJnZXQpOwoJfSwKCgkvKiBBY3Rpb24gZm9yIHNlbGVjdGluZyBh IGRheS4gKi8KCV9zZWxlY3REYXk6IGZ1bmN0aW9uKGlkLCBtb250aCwgeWVhciwg dGQpIHsKCQl2YXIgaW5zdCwKCQkJdGFyZ2V0ID0gJChpZCk7CgoJCWlmICgkKHRk KS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcykgfHwgdGhpcy5faXNE aXNhYmxlZERhdGVwaWNrZXIodGFyZ2V0WzBdKSkgewoJCQlyZXR1cm47CgkJfQoK CQlpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoJCWluc3Quc2VsZWN0 ZWREYXkgPSBpbnN0LmN1cnJlbnREYXkgPSAkKCJhIiwgdGQpLmh0bWwoKTsKCQlp bnN0LnNlbGVjdGVkTW9udGggPSBpbnN0LmN1cnJlbnRNb250aCA9IG1vbnRoOwoJ CWluc3Quc2VsZWN0ZWRZZWFyID0gaW5zdC5jdXJyZW50WWVhciA9IHllYXI7CgkJ dGhpcy5fc2VsZWN0RGF0ZShpZCwgdGhpcy5fZm9ybWF0RGF0ZShpbnN0LAoJCQlp bnN0LmN1cnJlbnREYXksIGluc3QuY3VycmVudE1vbnRoLCBpbnN0LmN1cnJlbnRZ ZWFyKSk7Cgl9LAoKCS8qIEVyYXNlIHRoZSBpbnB1dCBmaWVsZCBhbmQgaGlkZSB0 aGUgZGF0ZSBwaWNrZXIuICovCglfY2xlYXJEYXRlOiBmdW5jdGlvbihpZCkgewoJ CXZhciB0YXJnZXQgPSAkKGlkKTsKCQl0aGlzLl9zZWxlY3REYXRlKHRhcmdldCwg IiIpOwoJfSwKCgkvKiBVcGRhdGUgdGhlIGlucHV0IGZpZWxkIHdpdGggdGhlIHNl bGVjdGVkIGRhdGUuICovCglfc2VsZWN0RGF0ZTogZnVuY3Rpb24oaWQsIGRhdGVT dHIpIHsKCQl2YXIgb25TZWxlY3QsCgkJCXRhcmdldCA9ICQoaWQpLAoJCQlpbnN0 ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoKCQlkYXRlU3RyID0gKGRhdGVT dHIgIT0gbnVsbCA/IGRhdGVTdHIgOiB0aGlzLl9mb3JtYXREYXRlKGluc3QpKTsK CQlpZiAoaW5zdC5pbnB1dCkgewoJCQlpbnN0LmlucHV0LnZhbChkYXRlU3RyKTsK CQl9CgkJdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoKCQlvblNlbGVjdCA9 IHRoaXMuX2dldChpbnN0LCAib25TZWxlY3QiKTsKCQlpZiAob25TZWxlY3QpIHsK CQkJb25TZWxlY3QuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0WzBdIDog bnVsbCksIFtkYXRlU3RyLCBpbnN0XSk7ICAvLyB0cmlnZ2VyIGN1c3RvbSBjYWxs YmFjawoJCX0gZWxzZSBpZiAoaW5zdC5pbnB1dCkgewoJCQlpbnN0LmlucHV0LnRy aWdnZXIoImNoYW5nZSIpOyAvLyBmaXJlIHRoZSBjaGFuZ2UgZXZlbnQKCQl9CgoJ CWlmIChpbnN0LmlubGluZSl7CgkJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5z dCk7CgkJfSBlbHNlIHsKCQkJdGhpcy5faGlkZURhdGVwaWNrZXIoKTsKCQkJdGhp cy5fbGFzdElucHV0ID0gaW5zdC5pbnB1dFswXTsKCQkJaWYgKHR5cGVvZihpbnN0 LmlucHV0WzBdKSAhPT0gIm9iamVjdCIpIHsKCQkJCWluc3QuaW5wdXQuZm9jdXMo KTsgLy8gcmVzdG9yZSBmb2N1cwoJCQl9CgkJCXRoaXMuX2xhc3RJbnB1dCA9IG51 bGw7CgkJfQoJfSwKCgkvKiBVcGRhdGUgYW55IGFsdGVybmF0ZSBmaWVsZCB0byBz eW5jaHJvbmlzZSB3aXRoIHRoZSBtYWluIGZpZWxkLiAqLwoJX3VwZGF0ZUFsdGVy bmF0ZTogZnVuY3Rpb24oaW5zdCkgewoJCXZhciBhbHRGb3JtYXQsIGRhdGUsIGRh dGVTdHIsCgkJCWFsdEZpZWxkID0gdGhpcy5fZ2V0KGluc3QsICJhbHRGaWVsZCIp OwoKCQlpZiAoYWx0RmllbGQpIHsgLy8gdXBkYXRlIGFsdGVybmF0ZSBmaWVsZCB0 b28KCQkJYWx0Rm9ybWF0ID0gdGhpcy5fZ2V0KGluc3QsICJhbHRGb3JtYXQiKSB8 fCB0aGlzLl9nZXQoaW5zdCwgImRhdGVGb3JtYXQiKTsKCQkJZGF0ZSA9IHRoaXMu X2dldERhdGUoaW5zdCk7CgkJCWRhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUoYWx0 Rm9ybWF0LCBkYXRlLCB0aGlzLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOwoJCQkk KGFsdEZpZWxkKS5lYWNoKGZ1bmN0aW9uKCkgeyAkKHRoaXMpLnZhbChkYXRlU3Ry KTsgfSk7CgkJfQoJfSwKCgkvKiBTZXQgYXMgYmVmb3JlU2hvd0RheSBmdW5jdGlv biB0byBwcmV2ZW50IHNlbGVjdGlvbiBvZiB3ZWVrZW5kcy4KCSAqIEBwYXJhbSAg ZGF0ZSAgRGF0ZSAtIHRoZSBkYXRlIHRvIGN1c3RvbWlzZQoJICogQHJldHVybiBb Ym9vbGVhbiwgc3RyaW5nXSAtIGlzIHRoaXMgZGF0ZSBzZWxlY3RhYmxlPywgd2hh dCBpcyBpdHMgQ1NTIGNsYXNzPwoJICovCglub1dlZWtlbmRzOiBmdW5jdGlvbihk YXRlKSB7CgkJdmFyIGRheSA9IGRhdGUuZ2V0RGF5KCk7CgkJcmV0dXJuIFsoZGF5 ID4gMCAmJiBkYXkgPCA2KSwgIiJdOwoJfSwKCgkvKiBTZXQgYXMgY2FsY3VsYXRl V2VlayB0byBkZXRlcm1pbmUgdGhlIHdlZWsgb2YgdGhlIHllYXIgYmFzZWQgb24g dGhlIElTTyA4NjAxIGRlZmluaXRpb24uCgkgKiBAcGFyYW0gIGRhdGUgIERhdGUg LSB0aGUgZGF0ZSB0byBnZXQgdGhlIHdlZWsgZm9yCgkgKiBAcmV0dXJuICBudW1i ZXIgLSB0aGUgbnVtYmVyIG9mIHRoZSB3ZWVrIHdpdGhpbiB0aGUgeWVhciB0aGF0 IGNvbnRhaW5zIHRoaXMgZGF0ZQoJICovCglpc284NjAxV2VlazogZnVuY3Rpb24o ZGF0ZSkgewoJCXZhciB0aW1lLAoJCQljaGVja0RhdGUgPSBuZXcgRGF0ZShkYXRl LmdldFRpbWUoKSk7CgoJCS8vIEZpbmQgVGh1cnNkYXkgb2YgdGhpcyB3ZWVrIHN0 YXJ0aW5nIG9uIE1vbmRheQoJCWNoZWNrRGF0ZS5zZXREYXRlKGNoZWNrRGF0ZS5n ZXREYXRlKCkgKyA0IC0gKGNoZWNrRGF0ZS5nZXREYXkoKSB8fCA3KSk7CgoJCXRp bWUgPSBjaGVja0RhdGUuZ2V0VGltZSgpOwoJCWNoZWNrRGF0ZS5zZXRNb250aCgw KTsgLy8gQ29tcGFyZSB3aXRoIEphbiAxCgkJY2hlY2tEYXRlLnNldERhdGUoMSk7 CgkJcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yb3VuZCgodGltZSAtIGNoZWNrRGF0 ZSkgLyA4NjQwMDAwMCkgLyA3KSArIDE7Cgl9LAoKCS8qIFBhcnNlIGEgc3RyaW5n IHZhbHVlIGludG8gYSBkYXRlIG9iamVjdC4KCSAqIFNlZSBmb3JtYXREYXRlIGJl bG93IGZvciB0aGUgcG9zc2libGUgZm9ybWF0cy4KCSAqCgkgKiBAcGFyYW0gIGZv cm1hdCBzdHJpbmcgLSB0aGUgZXhwZWN0ZWQgZm9ybWF0IG9mIHRoZSBkYXRlCgkg KiBAcGFyYW0gIHZhbHVlIHN0cmluZyAtIHRoZSBkYXRlIGluIHRoZSBhYm92ZSBm b3JtYXQKCSAqIEBwYXJhbSAgc2V0dGluZ3MgT2JqZWN0IC0gYXR0cmlidXRlcyBp bmNsdWRlOgoJICoJCQkJCXNob3J0WWVhckN1dG9mZiAgbnVtYmVyIC0gdGhlIGN1 dG9mZiB5ZWFyIGZvciBkZXRlcm1pbmluZyB0aGUgY2VudHVyeSAob3B0aW9uYWwp CgkgKgkJCQkJZGF5TmFtZXNTaG9ydAlzdHJpbmdbN10gLSBhYmJyZXZpYXRlZCBu YW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAob3B0aW9uYWwpCgkgKgkJCQkJ ZGF5TmFtZXMJCXN0cmluZ1s3XSAtIG5hbWVzIG9mIHRoZSBkYXlzIGZyb20gU3Vu ZGF5IChvcHRpb25hbCkKCSAqCQkJCQltb250aE5hbWVzU2hvcnQgc3RyaW5nWzEy XSAtIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZSBtb250aHMgKG9wdGlvbmFsKQoJ ICoJCQkJCW1vbnRoTmFtZXMJCXN0cmluZ1sxMl0gLSBuYW1lcyBvZiB0aGUgbW9u dGhzIChvcHRpb25hbCkKCSAqIEByZXR1cm4gIERhdGUgLSB0aGUgZXh0cmFjdGVk IGRhdGUgdmFsdWUgb3IgbnVsbCBpZiB2YWx1ZSBpcyBibGFuawoJICovCglwYXJz ZURhdGU6IGZ1bmN0aW9uIChmb3JtYXQsIHZhbHVlLCBzZXR0aW5ncykgewoJCWlm IChmb3JtYXQgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7CgkJCXRocm93ICJJ bnZhbGlkIGFyZ3VtZW50cyI7CgkJfQoKCQl2YWx1ZSA9ICh0eXBlb2YgdmFsdWUg PT09ICJvYmplY3QiID8gdmFsdWUudG9TdHJpbmcoKSA6IHZhbHVlICsgIiIpOwoJ CWlmICh2YWx1ZSA9PT0gIiIpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQl2YXIg aUZvcm1hdCwgZGltLCBleHRyYSwKCQkJaVZhbHVlID0gMCwKCQkJc2hvcnRZZWFy Q3V0b2ZmVGVtcCA9IChzZXR0aW5ncyA/IHNldHRpbmdzLnNob3J0WWVhckN1dG9m ZiA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLnNob3J0WWVhckN1dG9mZiwKCQkJ c2hvcnRZZWFyQ3V0b2ZmID0gKHR5cGVvZiBzaG9ydFllYXJDdXRvZmZUZW1wICE9 PSAic3RyaW5nIiA/IHNob3J0WWVhckN1dG9mZlRlbXAgOgoJCQkJbmV3IERhdGUo KS5nZXRGdWxsWWVhcigpICUgMTAwICsgcGFyc2VJbnQoc2hvcnRZZWFyQ3V0b2Zm VGVtcCwgMTApKSwKCQkJZGF5TmFtZXNTaG9ydCA9IChzZXR0aW5ncyA/IHNldHRp bmdzLmRheU5hbWVzU2hvcnQgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5kYXlO YW1lc1Nob3J0LAoJCQlkYXlOYW1lcyA9IChzZXR0aW5ncyA/IHNldHRpbmdzLmRh eU5hbWVzIDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsCgkJCW1v bnRoTmFtZXNTaG9ydCA9IChzZXR0aW5ncyA/IHNldHRpbmdzLm1vbnRoTmFtZXNT aG9ydCA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCwK CQkJbW9udGhOYW1lcyA9IChzZXR0aW5ncyA/IHNldHRpbmdzLm1vbnRoTmFtZXMg OiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLAoJCQl5ZWFyID0g LTEsCgkJCW1vbnRoID0gLTEsCgkJCWRheSA9IC0xLAoJCQlkb3kgPSAtMSwKCQkJ bGl0ZXJhbCA9IGZhbHNlLAoJCQlkYXRlLAoJCQkvLyBDaGVjayB3aGV0aGVyIGEg Zm9ybWF0IGNoYXJhY3RlciBpcyBkb3VibGVkCgkJCWxvb2tBaGVhZCA9IGZ1bmN0 aW9uKG1hdGNoKSB7CgkJCQl2YXIgbWF0Y2hlcyA9IChpRm9ybWF0ICsgMSA8IGZv cm1hdC5sZW5ndGggJiYgZm9ybWF0LmNoYXJBdChpRm9ybWF0ICsgMSkgPT09IG1h dGNoKTsKCQkJCWlmIChtYXRjaGVzKSB7CgkJCQkJaUZvcm1hdCsrOwoJCQkJfQoJ CQkJcmV0dXJuIG1hdGNoZXM7CgkJCX0sCgkJCS8vIEV4dHJhY3QgYSBudW1iZXIg ZnJvbSB0aGUgc3RyaW5nIHZhbHVlCgkJCWdldE51bWJlciA9IGZ1bmN0aW9uKG1h dGNoKSB7CgkJCQl2YXIgaXNEb3VibGVkID0gbG9va0FoZWFkKG1hdGNoKSwKCQkJ CQlzaXplID0gKG1hdGNoID09PSAiQCIgPyAxNCA6IChtYXRjaCA9PT0gIiEiID8g MjAgOgoJCQkJCShtYXRjaCA9PT0gInkiICYmIGlzRG91YmxlZCA/IDQgOiAobWF0 Y2ggPT09ICJvIiA/IDMgOiAyKSkpKSwKCQkJCQlkaWdpdHMgPSBuZXcgUmVnRXhw KCJeXFxkezEsIiArIHNpemUgKyAifSIpLAoJCQkJCW51bSA9IHZhbHVlLnN1YnN0 cmluZyhpVmFsdWUpLm1hdGNoKGRpZ2l0cyk7CgkJCQlpZiAoIW51bSkgewoJCQkJ CXRocm93ICJNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAiICsgaVZhbHVlOwoJ CQkJfQoJCQkJaVZhbHVlICs9IG51bVswXS5sZW5ndGg7CgkJCQlyZXR1cm4gcGFy c2VJbnQobnVtWzBdLCAxMCk7CgkJCX0sCgkJCS8vIEV4dHJhY3QgYSBuYW1lIGZy b20gdGhlIHN0cmluZyB2YWx1ZSBhbmQgY29udmVydCB0byBhbiBpbmRleAoJCQln ZXROYW1lID0gZnVuY3Rpb24obWF0Y2gsIHNob3J0TmFtZXMsIGxvbmdOYW1lcykg ewoJCQkJdmFyIGluZGV4ID0gLTEsCgkJCQkJbmFtZXMgPSAkLm1hcChsb29rQWhl YWQobWF0Y2gpID8gbG9uZ05hbWVzIDogc2hvcnROYW1lcywgZnVuY3Rpb24gKHYs IGspIHsKCQkJCQkJcmV0dXJuIFsgW2ssIHZdIF07CgkJCQkJfSkuc29ydChmdW5j dGlvbiAoYSwgYikgewoJCQkJCQlyZXR1cm4gLShhWzFdLmxlbmd0aCAtIGJbMV0u bGVuZ3RoKTsKCQkJCQl9KTsKCgkJCQkkLmVhY2gobmFtZXMsIGZ1bmN0aW9uIChp LCBwYWlyKSB7CgkJCQkJdmFyIG5hbWUgPSBwYWlyWzFdOwoJCQkJCWlmICh2YWx1 ZS5zdWJzdHIoaVZhbHVlLCBuYW1lLmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0g bmFtZS50b0xvd2VyQ2FzZSgpKSB7CgkJCQkJCWluZGV4ID0gcGFpclswXTsKCQkJ CQkJaVZhbHVlICs9IG5hbWUubGVuZ3RoOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJ CQkJfQoJCQkJfSk7CgkJCQlpZiAoaW5kZXggIT09IC0xKSB7CgkJCQkJcmV0dXJu IGluZGV4ICsgMTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhyb3cgIlVua25vd24gbmFt ZSBhdCBwb3NpdGlvbiAiICsgaVZhbHVlOwoJCQkJfQoJCQl9LAoJCQkvLyBDb25m aXJtIHRoYXQgYSBsaXRlcmFsIGNoYXJhY3RlciBtYXRjaGVzIHRoZSBzdHJpbmcg dmFsdWUKCQkJY2hlY2tMaXRlcmFsID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAodmFs dWUuY2hhckF0KGlWYWx1ZSkgIT09IGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkpIHsK CQkJCQl0aHJvdyAiVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICIgKyBp VmFsdWU7CgkJCQl9CgkJCQlpVmFsdWUrKzsKCQkJfTsKCgkJZm9yIChpRm9ybWF0 ID0gMDsgaUZvcm1hdCA8IGZvcm1hdC5sZW5ndGg7IGlGb3JtYXQrKykgewoJCQlp ZiAobGl0ZXJhbCkgewoJCQkJaWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT09 ICInIiAmJiAhbG9va0FoZWFkKCInIikpIHsKCQkJCQlsaXRlcmFsID0gZmFsc2U7 CgkJCQl9IGVsc2UgewoJCQkJCWNoZWNrTGl0ZXJhbCgpOwoJCQkJfQoJCQl9IGVs c2UgewoJCQkJc3dpdGNoIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7CgkJCQkJ Y2FzZSAiZCI6CgkJCQkJCWRheSA9IGdldE51bWJlcigiZCIpOwoJCQkJCQlicmVh azsKCQkJCQljYXNlICJEIjoKCQkJCQkJZ2V0TmFtZSgiRCIsIGRheU5hbWVzU2hv cnQsIGRheU5hbWVzKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAibyI6CgkJCQkJ CWRveSA9IGdldE51bWJlcigibyIpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICJt IjoKCQkJCQkJbW9udGggPSBnZXROdW1iZXIoIm0iKTsKCQkJCQkJYnJlYWs7CgkJ CQkJY2FzZSAiTSI6CgkJCQkJCW1vbnRoID0gZ2V0TmFtZSgiTSIsIG1vbnRoTmFt ZXNTaG9ydCwgbW9udGhOYW1lcyk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgInki OgoJCQkJCQl5ZWFyID0gZ2V0TnVtYmVyKCJ5Iik7CgkJCQkJCWJyZWFrOwoJCQkJ CWNhc2UgIkAiOgoJCQkJCQlkYXRlID0gbmV3IERhdGUoZ2V0TnVtYmVyKCJAIikp OwoJCQkJCQl5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwoJCQkJCQltb250aCA9 IGRhdGUuZ2V0TW9udGgoKSArIDE7CgkJCQkJCWRheSA9IGRhdGUuZ2V0RGF0ZSgp OwoJCQkJCQlicmVhazsKCQkJCQljYXNlICIhIjoKCQkJCQkJZGF0ZSA9IG5ldyBE YXRlKChnZXROdW1iZXIoIiEiKSAtIHRoaXMuX3RpY2tzVG8xOTcwKSAvIDEwMDAw KTsKCQkJCQkJeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCQkJCQkJbW9udGgg PSBkYXRlLmdldE1vbnRoKCkgKyAxOwoJCQkJCQlkYXkgPSBkYXRlLmdldERhdGUo KTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiJyI6CgkJCQkJCWlmIChsb29rQWhl YWQoIiciKSl7CgkJCQkJCQljaGVja0xpdGVyYWwoKTsKCQkJCQkJfSBlbHNlIHsK CQkJCQkJCWxpdGVyYWwgPSB0cnVlOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJ CWRlZmF1bHQ6CgkJCQkJCWNoZWNrTGl0ZXJhbCgpOwoJCQkJfQoJCQl9CgkJfQoK CQlpZiAoaVZhbHVlIDwgdmFsdWUubGVuZ3RoKXsKCQkJZXh0cmEgPSB2YWx1ZS5z dWJzdHIoaVZhbHVlKTsKCQkJaWYgKCEvXlxzKy8udGVzdChleHRyYSkpIHsKCQkJ CXRocm93ICJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6 ICIgKyBleHRyYTsKCQkJfQoJCX0KCgkJaWYgKHllYXIgPT09IC0xKSB7CgkJCXll YXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7CgkJfSBlbHNlIGlmICh5ZWFy IDwgMTAwKSB7CgkJCXllYXIgKz0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0g bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICUgMTAwICsKCQkJCSh5ZWFyIDw9IHNo b3J0WWVhckN1dG9mZiA/IDAgOiAtMTAwKTsKCQl9CgoJCWlmIChkb3kgPiAtMSkg ewoJCQltb250aCA9IDE7CgkJCWRheSA9IGRveTsKCQkJZG8gewoJCQkJZGltID0g dGhpcy5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGggLSAxKTsKCQkJCWlmIChk YXkgPD0gZGltKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQltb250aCsrOwoJCQkJ ZGF5IC09IGRpbTsKCQkJfSB3aGlsZSAodHJ1ZSk7CgkJfQoKCQlkYXRlID0gdGhp cy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoeWVhciwgbW9udGggLSAx LCBkYXkpKTsKCQlpZiAoZGF0ZS5nZXRGdWxsWWVhcigpICE9PSB5ZWFyIHx8IGRh dGUuZ2V0TW9udGgoKSArIDEgIT09IG1vbnRoIHx8IGRhdGUuZ2V0RGF0ZSgpICE9 PSBkYXkpIHsKCQkJdGhyb3cgIkludmFsaWQgZGF0ZSI7IC8vIEUuZy4gMzEvMDIv MDAKCQl9CgkJcmV0dXJuIGRhdGU7Cgl9LAoKCS8qIFN0YW5kYXJkIGRhdGUgZm9y bWF0cy4gKi8KCUFUT006ICJ5eS1tbS1kZCIsIC8vIFJGQyAzMzM5IChJU08gODYw MSkKCUNPT0tJRTogIkQsIGRkIE0geXkiLAoJSVNPXzg2MDE6ICJ5eS1tbS1kZCIs CglSRkNfODIyOiAiRCwgZCBNIHkiLAoJUkZDXzg1MDogIkRELCBkZC1NLXkiLAoJ UkZDXzEwMzY6ICJELCBkIE0geSIsCglSRkNfMTEyMzogIkQsIGQgTSB5eSIsCglS RkNfMjgyMjogIkQsIGQgTSB5eSIsCglSU1M6ICJELCBkIE0geSIsIC8vIFJGQyA4 MjIKCVRJQ0tTOiAiISIsCglUSU1FU1RBTVA6ICJAIiwKCVczQzogInl5LW1tLWRk IiwgLy8gSVNPIDg2MDEKCglfdGlja3NUbzE5NzA6ICgoKDE5NzAgLSAxKSAqIDM2 NSArIE1hdGguZmxvb3IoMTk3MCAvIDQpIC0gTWF0aC5mbG9vcigxOTcwIC8gMTAw KSArCgkJTWF0aC5mbG9vcigxOTcwIC8gNDAwKSkgKiAyNCAqIDYwICogNjAgKiAx MDAwMDAwMCksCgoJLyogRm9ybWF0IGEgZGF0ZSBvYmplY3QgaW50byBhIHN0cmlu ZyB2YWx1ZS4KCSAqIFRoZSBmb3JtYXQgY2FuIGJlIGNvbWJpbmF0aW9ucyBvZiB0 aGUgZm9sbG93aW5nOgoJICogZCAgLSBkYXkgb2YgbW9udGggKG5vIGxlYWRpbmcg emVybykKCSAqIGRkIC0gZGF5IG9mIG1vbnRoICh0d28gZGlnaXQpCgkgKiBvICAt IGRheSBvZiB5ZWFyIChubyBsZWFkaW5nIHplcm9zKQoJICogb28gLSBkYXkgb2Yg eWVhciAodGhyZWUgZGlnaXQpCgkgKiBEICAtIGRheSBuYW1lIHNob3J0CgkgKiBE RCAtIGRheSBuYW1lIGxvbmcKCSAqIG0gIC0gbW9udGggb2YgeWVhciAobm8gbGVh ZGluZyB6ZXJvKQoJICogbW0gLSBtb250aCBvZiB5ZWFyICh0d28gZGlnaXQpCgkg KiBNICAtIG1vbnRoIG5hbWUgc2hvcnQKCSAqIE1NIC0gbW9udGggbmFtZSBsb25n CgkgKiB5ICAtIHllYXIgKHR3byBkaWdpdCkKCSAqIHl5IC0geWVhciAoZm91ciBk aWdpdCkKCSAqIEAgLSBVbml4IHRpbWVzdGFtcCAobXMgc2luY2UgMDEvMDEvMTk3 MCkKCSAqICEgLSBXaW5kb3dzIHRpY2tzICgxMDBucyBzaW5jZSAwMS8wMS8wMDAx KQoJICogIi4uLiIgLSBsaXRlcmFsIHRleHQKCSAqICcnIC0gc2luZ2xlIHF1b3Rl CgkgKgoJICogQHBhcmFtICBmb3JtYXQgc3RyaW5nIC0gdGhlIGRlc2lyZWQgZm9y bWF0IG9mIHRoZSBkYXRlCgkgKiBAcGFyYW0gIGRhdGUgRGF0ZSAtIHRoZSBkYXRl IHZhbHVlIHRvIGZvcm1hdAoJICogQHBhcmFtICBzZXR0aW5ncyBPYmplY3QgLSBh dHRyaWJ1dGVzIGluY2x1ZGU6CgkgKgkJCQkJZGF5TmFtZXNTaG9ydAlzdHJpbmdb N10gLSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAo b3B0aW9uYWwpCgkgKgkJCQkJZGF5TmFtZXMJCXN0cmluZ1s3XSAtIG5hbWVzIG9m IHRoZSBkYXlzIGZyb20gU3VuZGF5IChvcHRpb25hbCkKCSAqCQkJCQltb250aE5h bWVzU2hvcnQgc3RyaW5nWzEyXSAtIGFiYnJldmlhdGVkIG5hbWVzIG9mIHRoZSBt b250aHMgKG9wdGlvbmFsKQoJICoJCQkJCW1vbnRoTmFtZXMJCXN0cmluZ1sxMl0g LSBuYW1lcyBvZiB0aGUgbW9udGhzIChvcHRpb25hbCkKCSAqIEByZXR1cm4gIHN0 cmluZyAtIHRoZSBkYXRlIGluIHRoZSBhYm92ZSBmb3JtYXQKCSAqLwoJZm9ybWF0 RGF0ZTogZnVuY3Rpb24gKGZvcm1hdCwgZGF0ZSwgc2V0dGluZ3MpIHsKCQlpZiAo IWRhdGUpIHsKCQkJcmV0dXJuICIiOwoJCX0KCgkJdmFyIGlGb3JtYXQsCgkJCWRh eU5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lc1Nob3J0 IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCwKCQkJZGF5 TmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lcyA6IG51bGwpIHx8 IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLAoJCQltb250aE5hbWVzU2hvcnQgPSAo c2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzU2hvcnQgOiBudWxsKSB8fCB0 aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsCgkJCW1vbnRoTmFtZXMgPSAo c2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzIDogbnVsbCkgfHwgdGhpcy5f ZGVmYXVsdHMubW9udGhOYW1lcywKCQkJLy8gQ2hlY2sgd2hldGhlciBhIGZvcm1h dCBjaGFyYWN0ZXIgaXMgZG91YmxlZAoJCQlsb29rQWhlYWQgPSBmdW5jdGlvbiht YXRjaCkgewoJCQkJdmFyIG1hdGNoZXMgPSAoaUZvcm1hdCArIDEgPCBmb3JtYXQu bGVuZ3RoICYmIGZvcm1hdC5jaGFyQXQoaUZvcm1hdCArIDEpID09PSBtYXRjaCk7 CgkJCQlpZiAobWF0Y2hlcykgewoJCQkJCWlGb3JtYXQrKzsKCQkJCX0KCQkJCXJl dHVybiBtYXRjaGVzOwoJCQl9LAoJCQkvLyBGb3JtYXQgYSBudW1iZXIsIHdpdGgg bGVhZGluZyB6ZXJvIGlmIG5lY2Vzc2FyeQoJCQlmb3JtYXROdW1iZXIgPSBmdW5j dGlvbihtYXRjaCwgdmFsdWUsIGxlbikgewoJCQkJdmFyIG51bSA9ICIiICsgdmFs dWU7CgkJCQlpZiAobG9va0FoZWFkKG1hdGNoKSkgewoJCQkJCXdoaWxlIChudW0u bGVuZ3RoIDwgbGVuKSB7CgkJCQkJCW51bSA9ICIwIiArIG51bTsKCQkJCQl9CgkJ CQl9CgkJCQlyZXR1cm4gbnVtOwoJCQl9LAoJCQkvLyBGb3JtYXQgYSBuYW1lLCBz aG9ydCBvciBsb25nIGFzIHJlcXVlc3RlZAoJCQlmb3JtYXROYW1lID0gZnVuY3Rp b24obWF0Y2gsIHZhbHVlLCBzaG9ydE5hbWVzLCBsb25nTmFtZXMpIHsKCQkJCXJl dHVybiAobG9va0FoZWFkKG1hdGNoKSA/IGxvbmdOYW1lc1t2YWx1ZV0gOiBzaG9y dE5hbWVzW3ZhbHVlXSk7CgkJCX0sCgkJCW91dHB1dCA9ICIiLAoJCQlsaXRlcmFs ID0gZmFsc2U7CgoJCWlmIChkYXRlKSB7CgkJCWZvciAoaUZvcm1hdCA9IDA7IGlG b3JtYXQgPCBmb3JtYXQubGVuZ3RoOyBpRm9ybWF0KyspIHsKCQkJCWlmIChsaXRl cmFsKSB7CgkJCQkJaWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT09ICInIiAm JiAhbG9va0FoZWFkKCInIikpIHsKCQkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJ CX0gZWxzZSB7CgkJCQkJCW91dHB1dCArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQp OwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJc3dpdGNoIChmb3JtYXQuY2hhckF0 KGlGb3JtYXQpKSB7CgkJCQkJCWNhc2UgImQiOgoJCQkJCQkJb3V0cHV0ICs9IGZv cm1hdE51bWJlcigiZCIsIGRhdGUuZ2V0RGF0ZSgpLCAyKTsKCQkJCQkJCWJyZWFr OwoJCQkJCQljYXNlICJEIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROYW1lKCJE IiwgZGF0ZS5nZXREYXkoKSwgZGF5TmFtZXNTaG9ydCwgZGF5TmFtZXMpOwoJCQkJ CQkJYnJlYWs7CgkJCQkJCWNhc2UgIm8iOgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1h dE51bWJlcigibyIsCgkJCQkJCQkJTWF0aC5yb3VuZCgobmV3IERhdGUoZGF0ZS5n ZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKS5n ZXRUaW1lKCkgLSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIDAsIDApLmdl dFRpbWUoKSkgLyA4NjQwMDAwMCksIDMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNh c2UgIm0iOgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdE51bWJlcigibSIsIGRhdGUu Z2V0TW9udGgoKSArIDEsIDIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgIk0i OgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1hdE5hbWUoIk0iLCBkYXRlLmdldE1vbnRo KCksIG1vbnRoTmFtZXNTaG9ydCwgbW9udGhOYW1lcyk7CgkJCQkJCQlicmVhazsK CQkJCQkJY2FzZSAieSI6CgkJCQkJCQlvdXRwdXQgKz0gKGxvb2tBaGVhZCgieSIp ID8gZGF0ZS5nZXRGdWxsWWVhcigpIDoKCQkJCQkJCQkoZGF0ZS5nZXRZZWFyKCkg JSAxMDAgPCAxMCA/ICIwIiA6ICIiKSArIGRhdGUuZ2V0WWVhcigpICUgMTAwKTsK CQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJAIjoKCQkJCQkJCW91dHB1dCArPSBk YXRlLmdldFRpbWUoKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICIhIjoKCQkJ CQkJCW91dHB1dCArPSBkYXRlLmdldFRpbWUoKSAqIDEwMDAwICsgdGhpcy5fdGlj a3NUbzE5NzA7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiJyI6CgkJCQkJCQlp ZiAobG9va0FoZWFkKCInIikpIHsKCQkJCQkJCQlvdXRwdXQgKz0gIiciOwoJCQkJ CQkJfSBlbHNlIHsKCQkJCQkJCQlsaXRlcmFsID0gdHJ1ZTsKCQkJCQkJCX0KCQkJ CQkJCWJyZWFrOwoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJb3V0cHV0ICs9IGZvcm1h dC5jaGFyQXQoaUZvcm1hdCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCXJldHVy biBvdXRwdXQ7Cgl9LAoKCS8qIEV4dHJhY3QgYWxsIHBvc3NpYmxlIGNoYXJhY3Rl cnMgZnJvbSB0aGUgZGF0ZSBmb3JtYXQuICovCglfcG9zc2libGVDaGFyczogZnVu Y3Rpb24gKGZvcm1hdCkgewoJCXZhciBpRm9ybWF0LAoJCQljaGFycyA9ICIiLAoJ CQlsaXRlcmFsID0gZmFsc2UsCgkJCS8vIENoZWNrIHdoZXRoZXIgYSBmb3JtYXQg Y2hhcmFjdGVyIGlzIGRvdWJsZWQKCQkJbG9va0FoZWFkID0gZnVuY3Rpb24obWF0 Y2gpIHsKCQkJCXZhciBtYXRjaGVzID0gKGlGb3JtYXQgKyAxIDwgZm9ybWF0Lmxl bmd0aCAmJiBmb3JtYXQuY2hhckF0KGlGb3JtYXQgKyAxKSA9PT0gbWF0Y2gpOwoJ CQkJaWYgKG1hdGNoZXMpIHsKCQkJCQlpRm9ybWF0Kys7CgkJCQl9CgkJCQlyZXR1 cm4gbWF0Y2hlczsKCQkJfTsKCgkJZm9yIChpRm9ybWF0ID0gMDsgaUZvcm1hdCA8 IGZvcm1hdC5sZW5ndGg7IGlGb3JtYXQrKykgewoJCQlpZiAobGl0ZXJhbCkgewoJ CQkJaWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT09ICInIiAmJiAhbG9va0Fo ZWFkKCInIikpIHsKCQkJCQlsaXRlcmFsID0gZmFsc2U7CgkJCQl9IGVsc2UgewoJ CQkJCWNoYXJzICs9IGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk7CgkJCQl9CgkJCX0g ZWxzZSB7CgkJCQlzd2l0Y2ggKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkpIHsKCQkJ CQljYXNlICJkIjogY2FzZSAibSI6IGNhc2UgInkiOiBjYXNlICJAIjoKCQkJCQkJ Y2hhcnMgKz0gIjAxMjM0NTY3ODkiOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICJE IjogY2FzZSAiTSI6CgkJCQkJCXJldHVybiBudWxsOyAvLyBBY2NlcHQgYW55dGhp bmcKCQkJCQljYXNlICInIjoKCQkJCQkJaWYgKGxvb2tBaGVhZCgiJyIpKSB7CgkJ CQkJCQljaGFycyArPSAiJyI7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlsaXRlcmFs ID0gdHJ1ZTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJ CQljaGFycyArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpOwoJCQkJfQoJCQl9CgkJ fQoJCXJldHVybiBjaGFyczsKCX0sCgoJLyogR2V0IGEgc2V0dGluZyB2YWx1ZSwg ZGVmYXVsdGluZyBpZiBuZWNlc3NhcnkuICovCglfZ2V0OiBmdW5jdGlvbihpbnN0 LCBuYW1lKSB7CgkJcmV0dXJuIGluc3Quc2V0dGluZ3NbbmFtZV0gIT09IHVuZGVm aW5lZCA/CgkJCWluc3Quc2V0dGluZ3NbbmFtZV0gOiB0aGlzLl9kZWZhdWx0c1tu YW1lXTsKCX0sCgoJLyogUGFyc2UgZXhpc3RpbmcgZGF0ZSBhbmQgaW5pdGlhbGlz ZSBkYXRlIHBpY2tlci4gKi8KCV9zZXREYXRlRnJvbUZpZWxkOiBmdW5jdGlvbihp bnN0LCBub0RlZmF1bHQpIHsKCQlpZiAoaW5zdC5pbnB1dC52YWwoKSA9PT0gaW5z dC5sYXN0VmFsKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBkYXRlRm9ybWF0ID0g dGhpcy5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksCgkJCWRhdGVzID0gaW5zdC5s YXN0VmFsID0gaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQudmFsKCkgOiBudWxsLAoJ CQlkZWZhdWx0RGF0ZSA9IHRoaXMuX2dldERlZmF1bHREYXRlKGluc3QpLAoJCQlk YXRlID0gZGVmYXVsdERhdGUsCgkJCXNldHRpbmdzID0gdGhpcy5fZ2V0Rm9ybWF0 Q29uZmlnKGluc3QpOwoKCQl0cnkgewoJCQlkYXRlID0gdGhpcy5wYXJzZURhdGUo ZGF0ZUZvcm1hdCwgZGF0ZXMsIHNldHRpbmdzKSB8fCBkZWZhdWx0RGF0ZTsKCQl9 IGNhdGNoIChldmVudCkgewoJCQlkYXRlcyA9IChub0RlZmF1bHQgPyAiIiA6IGRh dGVzKTsKCQl9CgkJaW5zdC5zZWxlY3RlZERheSA9IGRhdGUuZ2V0RGF0ZSgpOwoJ CWluc3QuZHJhd01vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoID0gZGF0ZS5nZXRN b250aCgpOwoJCWluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGRh dGUuZ2V0RnVsbFllYXIoKTsKCQlpbnN0LmN1cnJlbnREYXkgPSAoZGF0ZXMgPyBk YXRlLmdldERhdGUoKSA6IDApOwoJCWluc3QuY3VycmVudE1vbnRoID0gKGRhdGVz ID8gZGF0ZS5nZXRNb250aCgpIDogMCk7CgkJaW5zdC5jdXJyZW50WWVhciA9IChk YXRlcyA/IGRhdGUuZ2V0RnVsbFllYXIoKSA6IDApOwoJCXRoaXMuX2FkanVzdElu c3REYXRlKGluc3QpOwoJfSwKCgkvKiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBkYXRl IHNob3duIG9uIG9wZW5pbmcuICovCglfZ2V0RGVmYXVsdERhdGU6IGZ1bmN0aW9u KGluc3QpIHsKCQlyZXR1cm4gdGhpcy5fcmVzdHJpY3RNaW5NYXgoaW5zdCwKCQkJ dGhpcy5fZGV0ZXJtaW5lRGF0ZShpbnN0LCB0aGlzLl9nZXQoaW5zdCwgImRlZmF1 bHREYXRlIiksIG5ldyBEYXRlKCkpKTsKCX0sCgoJLyogQSBkYXRlIG1heSBiZSBz cGVjaWZpZWQgYXMgYW4gZXhhY3QgdmFsdWUgb3IgYSByZWxhdGl2ZSBvbmUuICov CglfZGV0ZXJtaW5lRGF0ZTogZnVuY3Rpb24oaW5zdCwgZGF0ZSwgZGVmYXVsdERh dGUpIHsKCQl2YXIgb2Zmc2V0TnVtZXJpYyA9IGZ1bmN0aW9uKG9mZnNldCkgewoJ CQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwoJCQkJZGF0ZS5zZXREYXRlKGRhdGUu Z2V0RGF0ZSgpICsgb2Zmc2V0KTsKCQkJCXJldHVybiBkYXRlOwoJCQl9LAoJCQlv ZmZzZXRTdHJpbmcgPSBmdW5jdGlvbihvZmZzZXQpIHsKCQkJCXRyeSB7CgkJCQkJ cmV0dXJuICQuZGF0ZXBpY2tlci5wYXJzZURhdGUoJC5kYXRlcGlja2VyLl9nZXQo aW5zdCwgImRhdGVGb3JtYXQiKSwKCQkJCQkJb2Zmc2V0LCAkLmRhdGVwaWNrZXIu X2dldEZvcm1hdENvbmZpZyhpbnN0KSk7CgkJCQl9CgkJCQljYXRjaCAoZSkgewoJ CQkJCS8vIElnbm9yZQoJCQkJfQoKCQkJCXZhciBkYXRlID0gKG9mZnNldC50b0xv d2VyQ2FzZSgpLm1hdGNoKC9eYy8pID8KCQkJCQkkLmRhdGVwaWNrZXIuX2dldERh dGUoaW5zdCkgOiBudWxsKSB8fCBuZXcgRGF0ZSgpLAoJCQkJCXllYXIgPSBkYXRl LmdldEZ1bGxZZWFyKCksCgkJCQkJbW9udGggPSBkYXRlLmdldE1vbnRoKCksCgkJ CQkJZGF5ID0gZGF0ZS5nZXREYXRlKCksCgkJCQkJcGF0dGVybiA9IC8oWytcLV0/ WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nLAoJCQkJCW1hdGNoZXMgPSBw YXR0ZXJuLmV4ZWMob2Zmc2V0KTsKCgkJCQl3aGlsZSAobWF0Y2hlcykgewoJCQkJ CXN3aXRjaCAobWF0Y2hlc1syXSB8fCAiZCIpIHsKCQkJCQkJY2FzZSAiZCIgOiBj YXNlICJEIiA6CgkJCQkJCQlkYXkgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCk7 IGJyZWFrOwoJCQkJCQljYXNlICJ3IiA6IGNhc2UgIlciIDoKCQkJCQkJCWRheSAr PSBwYXJzZUludChtYXRjaGVzWzFdLDEwKSAqIDc7IGJyZWFrOwoJCQkJCQljYXNl ICJtIiA6IGNhc2UgIk0iIDoKCQkJCQkJCW1vbnRoICs9IHBhcnNlSW50KG1hdGNo ZXNbMV0sMTApOwoJCQkJCQkJZGF5ID0gTWF0aC5taW4oZGF5LCAkLmRhdGVwaWNr ZXIuX2dldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSk7CgkJCQkJCQlicmVhazsK CQkJCQkJY2FzZSAieSI6IGNhc2UgIlkiIDoKCQkJCQkJCXllYXIgKz0gcGFyc2VJ bnQobWF0Y2hlc1sxXSwxMCk7CgkJCQkJCQlkYXkgPSBNYXRoLm1pbihkYXksICQu ZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpKTsKCQkJCQkJ CWJyZWFrOwoJCQkJCX0KCQkJCQltYXRjaGVzID0gcGF0dGVybi5leGVjKG9mZnNl dCk7CgkJCQl9CgkJCQlyZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7 CgkJCX0sCgkJCW5ld0RhdGUgPSAoZGF0ZSA9PSBudWxsIHx8IGRhdGUgPT09ICIi ID8gZGVmYXVsdERhdGUgOiAodHlwZW9mIGRhdGUgPT09ICJzdHJpbmciID8gb2Zm c2V0U3RyaW5nKGRhdGUpIDoKCQkJCSh0eXBlb2YgZGF0ZSA9PT0gIm51bWJlciIg PyAoaXNOYU4oZGF0ZSkgPyBkZWZhdWx0RGF0ZSA6IG9mZnNldE51bWVyaWMoZGF0 ZSkpIDogbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpKSkpOwoKCQluZXdEYXRlID0g KG5ld0RhdGUgJiYgbmV3RGF0ZS50b1N0cmluZygpID09PSAiSW52YWxpZCBEYXRl IiA/IGRlZmF1bHREYXRlIDogbmV3RGF0ZSk7CgkJaWYgKG5ld0RhdGUpIHsKCQkJ bmV3RGF0ZS5zZXRIb3VycygwKTsKCQkJbmV3RGF0ZS5zZXRNaW51dGVzKDApOwoJ CQluZXdEYXRlLnNldFNlY29uZHMoMCk7CgkJCW5ld0RhdGUuc2V0TWlsbGlzZWNv bmRzKDApOwoJCX0KCQlyZXR1cm4gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3Qo bmV3RGF0ZSk7Cgl9LAoKCS8qIEhhbmRsZSBzd2l0Y2ggdG8vZnJvbSBkYXlsaWdo dCBzYXZpbmcuCgkgKiBIb3VycyBtYXkgYmUgbm9uLXplcm8gb24gZGF5bGlnaHQg c2F2aW5nIGN1dC1vdmVyOgoJICogPiAxMiB3aGVuIG1pZG5pZ2h0IGNoYW5nZW92 ZXIsIGJ1dCB0aGVuIGNhbm5vdCBnZW5lcmF0ZQoJICogbWlkbmlnaHQgZGF0ZXRp bWUsIHNvIGp1bXAgdG8gMUFNLCBvdGhlcndpc2UgcmVzZXQuCgkgKiBAcGFyYW0g IGRhdGUgIChEYXRlKSB0aGUgZGF0ZSB0byBjaGVjawoJICogQHJldHVybiAgKERh dGUpIHRoZSBjb3JyZWN0ZWQgZGF0ZQoJICovCglfZGF5bGlnaHRTYXZpbmdBZGp1 c3Q6IGZ1bmN0aW9uKGRhdGUpIHsKCQlpZiAoIWRhdGUpIHsKCQkJcmV0dXJuIG51 bGw7CgkJfQoJCWRhdGUuc2V0SG91cnMoZGF0ZS5nZXRIb3VycygpID4gMTIgPyBk YXRlLmdldEhvdXJzKCkgKyAyIDogMCk7CgkJcmV0dXJuIGRhdGU7Cgl9LAoKCS8q IFNldCB0aGUgZGF0ZShzKSBkaXJlY3RseS4gKi8KCV9zZXREYXRlOiBmdW5jdGlv bihpbnN0LCBkYXRlLCBub0NoYW5nZSkgewoJCXZhciBjbGVhciA9ICFkYXRlLAoJ CQlvcmlnTW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGgsCgkJCW9yaWdZZWFyID0g aW5zdC5zZWxlY3RlZFllYXIsCgkJCW5ld0RhdGUgPSB0aGlzLl9yZXN0cmljdE1p bk1heChpbnN0LCB0aGlzLl9kZXRlcm1pbmVEYXRlKGluc3QsIGRhdGUsIG5ldyBE YXRlKCkpKTsKCgkJaW5zdC5zZWxlY3RlZERheSA9IGluc3QuY3VycmVudERheSA9 IG5ld0RhdGUuZ2V0RGF0ZSgpOwoJCWluc3QuZHJhd01vbnRoID0gaW5zdC5zZWxl Y3RlZE1vbnRoID0gaW5zdC5jdXJyZW50TW9udGggPSBuZXdEYXRlLmdldE1vbnRo KCk7CgkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gaW5zdC5j dXJyZW50WWVhciA9IG5ld0RhdGUuZ2V0RnVsbFllYXIoKTsKCQlpZiAoKG9yaWdN b250aCAhPT0gaW5zdC5zZWxlY3RlZE1vbnRoIHx8IG9yaWdZZWFyICE9PSBpbnN0 LnNlbGVjdGVkWWVhcikgJiYgIW5vQ2hhbmdlKSB7CgkJCXRoaXMuX25vdGlmeUNo YW5nZShpbnN0KTsKCQl9CgkJdGhpcy5fYWRqdXN0SW5zdERhdGUoaW5zdCk7CgkJ aWYgKGluc3QuaW5wdXQpIHsKCQkJaW5zdC5pbnB1dC52YWwoY2xlYXIgPyAiIiA6 IHRoaXMuX2Zvcm1hdERhdGUoaW5zdCkpOwoJCX0KCX0sCgoJLyogUmV0cmlldmUg dGhlIGRhdGUocykgZGlyZWN0bHkuICovCglfZ2V0RGF0ZTogZnVuY3Rpb24oaW5z dCkgewoJCXZhciBzdGFydERhdGUgPSAoIWluc3QuY3VycmVudFllYXIgfHwgKGlu c3QuaW5wdXQgJiYgaW5zdC5pbnB1dC52YWwoKSA9PT0gIiIpID8gbnVsbCA6CgkJ CXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKAoJCQlpbnN0LmN1 cnJlbnRZZWFyLCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50RGF5KSkp OwoJCQlyZXR1cm4gc3RhcnREYXRlOwoJfSwKCgkvKiBBdHRhY2ggdGhlIG9ueHh4 IGhhbmRsZXJzLiAgVGhlc2UgYXJlIGRlY2xhcmVkIHN0YXRpY2FsbHkgc28KCSAq IHRoZXkgd29yayB3aXRoIHN0YXRpYyBjb2RlIHRyYW5zZm9ybWVycyBsaWtlIENh amEuCgkgKi8KCV9hdHRhY2hIYW5kbGVyczogZnVuY3Rpb24oaW5zdCkgewoJCXZh ciBzdGVwTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzdGVwTW9udGhzIiksCgkJ CWlkID0gIiMiICsgaW5zdC5pZC5yZXBsYWNlKCAvXFxcXC9nLCAiXFwiICk7CgkJ aW5zdC5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbiAo KSB7CgkJCXZhciBoYW5kbGVyID0gewoJCQkJcHJldjogZnVuY3Rpb24gKCkgewoJ CQkJCXdpbmRvd1siRFBfalF1ZXJ5XyIgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX2Fk anVzdERhdGUoaWQsIC1zdGVwTW9udGhzLCAiTSIpOwoJCQkJfSwKCQkJCW5leHQ6 IGZ1bmN0aW9uICgpIHsKCQkJCQl3aW5kb3dbIkRQX2pRdWVyeV8iICsgZHB1dWlk XS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGlkLCArc3RlcE1vbnRocywgIk0iKTsK CQkJCX0sCgkJCQloaWRlOiBmdW5jdGlvbiAoKSB7CgkJCQkJd2luZG93WyJEUF9q UXVlcnlfIiArIGRwdXVpZF0uZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsK CQkJCX0sCgkJCQl0b2RheTogZnVuY3Rpb24gKCkgewoJCQkJCXdpbmRvd1siRFBf alF1ZXJ5XyIgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShpZCk7CgkJ CQl9LAoJCQkJc2VsZWN0RGF5OiBmdW5jdGlvbiAoKSB7CgkJCQkJd2luZG93WyJE UF9qUXVlcnlfIiArIGRwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGlkLCAr dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtbW9udGgiKSwgK3RoaXMuZ2V0QXR0cmli dXRlKCJkYXRhLXllYXIiKSwgdGhpcyk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJ fSwKCQkJCXNlbGVjdE1vbnRoOiBmdW5jdGlvbiAoKSB7CgkJCQkJd2luZG93WyJE UF9qUXVlcnlfIiArIGRwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFy KGlkLCB0aGlzLCAiTSIpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0sCgkJCQlz ZWxlY3RZZWFyOiBmdW5jdGlvbiAoKSB7CgkJCQkJd2luZG93WyJEUF9qUXVlcnlf IiArIGRwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKGlkLCB0aGlz LCAiWSIpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfTsKCQkJJCh0aGlz KS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksIGhhbmRsZXJb dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtaGFuZGxlciIpXSk7CgkJfSk7Cgl9LAoK CS8qIEdlbmVyYXRlIHRoZSBIVE1MIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0 aGUgZGF0ZSBwaWNrZXIuICovCglfZ2VuZXJhdGVIVE1MOiBmdW5jdGlvbihpbnN0 KSB7CgkJdmFyIG1heERyYXcsIHByZXZUZXh0LCBwcmV2LCBuZXh0VGV4dCwgbmV4 dCwgY3VycmVudFRleHQsIGdvdG9EYXRlLAoJCQljb250cm9scywgYnV0dG9uUGFu ZWwsIGZpcnN0RGF5LCBzaG93V2VlaywgZGF5TmFtZXMsIGRheU5hbWVzTWluLAoJ CQltb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQsIGJlZm9yZVNob3dEYXksIHNo b3dPdGhlck1vbnRocywKCQkJc2VsZWN0T3RoZXJNb250aHMsIGRlZmF1bHREYXRl LCBodG1sLCBkb3csIHJvdywgZ3JvdXAsIGNvbCwgc2VsZWN0ZWREYXRlLAoJCQlj b3JuZXJDbGFzcywgY2FsZW5kZXIsIHRoZWFkLCBkYXksIGRheXNJbk1vbnRoLCBs ZWFkRGF5cywgY3VyUm93cywgbnVtUm93cywKCQkJcHJpbnREYXRlLCBkUm93LCB0 Ym9keSwgZGF5U2V0dGluZ3MsIG90aGVyTW9udGgsIHVuc2VsZWN0YWJsZSwKCQkJ dGVtcERhdGUgPSBuZXcgRGF0ZSgpLAoJCQl0b2RheSA9IHRoaXMuX2RheWxpZ2h0 U2F2aW5nQWRqdXN0KAoJCQkJbmV3IERhdGUodGVtcERhdGUuZ2V0RnVsbFllYXIo KSwgdGVtcERhdGUuZ2V0TW9udGgoKSwgdGVtcERhdGUuZ2V0RGF0ZSgpKSksIC8v IGNsZWFyIHRpbWUKCQkJaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgImlzUlRMIiks CgkJCXNob3dCdXR0b25QYW5lbCA9IHRoaXMuX2dldChpbnN0LCAic2hvd0J1dHRv blBhbmVsIiksCgkJCWhpZGVJZk5vUHJldk5leHQgPSB0aGlzLl9nZXQoaW5zdCwg ImhpZGVJZk5vUHJldk5leHQiKSwKCQkJbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA9 IHRoaXMuX2dldChpbnN0LCAibmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCIpLAoJCQlu dW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KSwKCQkJc2hv d0N1cnJlbnRBdFBvcyA9IHRoaXMuX2dldChpbnN0LCAic2hvd0N1cnJlbnRBdFBv cyIpLAoJCQlzdGVwTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzdGVwTW9udGhz IiksCgkJCWlzTXVsdGlNb250aCA9IChudW1Nb250aHNbMF0gIT09IDEgfHwgbnVt TW9udGhzWzFdICE9PSAxKSwKCQkJY3VycmVudERhdGUgPSB0aGlzLl9kYXlsaWdo dFNhdmluZ0FkanVzdCgoIWluc3QuY3VycmVudERheSA/IG5ldyBEYXRlKDk5OTks IDksIDkpIDoKCQkJCW5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsIGluc3QuY3Vy cmVudE1vbnRoLCBpbnN0LmN1cnJlbnREYXkpKSksCgkJCW1pbkRhdGUgPSB0aGlz Ll9nZXRNaW5NYXhEYXRlKGluc3QsICJtaW4iKSwKCQkJbWF4RGF0ZSA9IHRoaXMu X2dldE1pbk1heERhdGUoaW5zdCwgIm1heCIpLAoJCQlkcmF3TW9udGggPSBpbnN0 LmRyYXdNb250aCAtIHNob3dDdXJyZW50QXRQb3MsCgkJCWRyYXdZZWFyID0gaW5z dC5kcmF3WWVhcjsKCgkJaWYgKGRyYXdNb250aCA8IDApIHsKCQkJZHJhd01vbnRo ICs9IDEyOwoJCQlkcmF3WWVhci0tOwoJCX0KCQlpZiAobWF4RGF0ZSkgewoJCQlt YXhEcmF3ID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobWF4 RGF0ZS5nZXRGdWxsWWVhcigpLAoJCQkJbWF4RGF0ZS5nZXRNb250aCgpIC0gKG51 bU1vbnRoc1swXSAqIG51bU1vbnRoc1sxXSkgKyAxLCBtYXhEYXRlLmdldERhdGUo KSkpOwoJCQltYXhEcmF3ID0gKG1pbkRhdGUgJiYgbWF4RHJhdyA8IG1pbkRhdGUg PyBtaW5EYXRlIDogbWF4RHJhdyk7CgkJCXdoaWxlICh0aGlzLl9kYXlsaWdodFNh dmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxKSkgPiBt YXhEcmF3KSB7CgkJCQlkcmF3TW9udGgtLTsKCQkJCWlmIChkcmF3TW9udGggPCAw KSB7CgkJCQkJZHJhd01vbnRoID0gMTE7CgkJCQkJZHJhd1llYXItLTsKCQkJCX0K CQkJfQoJCX0KCQlpbnN0LmRyYXdNb250aCA9IGRyYXdNb250aDsKCQlpbnN0LmRy YXdZZWFyID0gZHJhd1llYXI7CgoJCXByZXZUZXh0ID0gdGhpcy5fZ2V0KGluc3Qs ICJwcmV2VGV4dCIpOwoJCXByZXZUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9y bWF0ID8gcHJldlRleHQgOiB0aGlzLmZvcm1hdERhdGUocHJldlRleHQsCgkJCXRo aXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3 TW9udGggLSBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZp ZyhpbnN0KSkpOwoKCQlwcmV2ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3Qs IC0xLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSI8YSBjbGFzcz0ndWktZGF0 ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ncHJldicg ZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSIgdGl0bGU9JyIgKyBwcmV2VGV4dCAr ICInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xl LSIgKyAoIGlzUlRMID8gImUiIDogInciKSArICInPiIgKyBwcmV2VGV4dCArICI8 L3NwYW4+PC9hPiIgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICIiIDogIjxhIGNs YXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1k aXNhYmxlZCcgdGl0bGU9JyIrIHByZXZUZXh0ICsiJz48c3BhbiBjbGFzcz0ndWkt aWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iICsgKCBpc1JUTCA/ICJlIiA6 ICJ3IikgKyAiJz4iICsgcHJldlRleHQgKyAiPC9zcGFuPjwvYT4iKSk7CgoJCW5l eHRUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJuZXh0VGV4dCIpOwoJCW5leHRUZXh0 ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gbmV4dFRleHQgOiB0aGlzLmZv cm1hdERhdGUobmV4dFRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0 KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggKyBzdGVwTW9udGhzLCAxKSks CgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQluZXh0ID0gKHRo aXMuX2NhbkFkanVzdE1vbnRoKGluc3QsICsxLCBkcmF3WWVhciwgZHJhd01vbnRo KSA/CgkJCSI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1h bGwnIGRhdGEtaGFuZGxlcj0nbmV4dCcgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJ CSIgdGl0bGU9JyIgKyBuZXh0VGV4dCArICInPjxzcGFuIGNsYXNzPSd1aS1pY29u IHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIgKyAoIGlzUlRMID8gInciIDogImUi KSArICInPiIgKyBuZXh0VGV4dCArICI8L3NwYW4+PC9hPiIgOgoJCQkoaGlkZUlm Tm9QcmV2TmV4dCA/ICIiIDogIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLW5leHQg dWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIrIG5leHRU ZXh0ICsgIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJp YW5nbGUtIiArICggaXNSVEwgPyAidyIgOiAiZSIpICsgIic+IiArIG5leHRUZXh0 ICsgIjwvc3Bhbj48L2E+IikpOwoKCQljdXJyZW50VGV4dCA9IHRoaXMuX2dldChp bnN0LCAiY3VycmVudFRleHQiKTsKCQlnb3RvRGF0ZSA9ICh0aGlzLl9nZXQoaW5z dCwgImdvdG9DdXJyZW50IikgJiYgaW5zdC5jdXJyZW50RGF5ID8gY3VycmVudERh dGUgOiB0b2RheSk7CgkJY3VycmVudFRleHQgPSAoIW5hdmlnYXRpb25Bc0RhdGVG b3JtYXQgPyBjdXJyZW50VGV4dCA6CgkJCXRoaXMuZm9ybWF0RGF0ZShjdXJyZW50 VGV4dCwgZ290b0RhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoK CQljb250cm9scyA9ICghaW5zdC5pbmxpbmUgPyAiPGJ1dHRvbiB0eXBlPSdidXR0 b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWNsb3NlIHVpLXN0YXRlLWRlZmF1bHQg dWktcHJpb3JpdHktcHJpbWFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9 J2hpZGUnIGRhdGEtZXZlbnQ9J2NsaWNrJz4iICsKCQkJdGhpcy5fZ2V0KGluc3Qs ICJjbG9zZVRleHQiKSArICI8L2J1dHRvbj4iIDogIiIpOwoKCQlidXR0b25QYW5l bCA9IChzaG93QnV0dG9uUGFuZWwpID8gIjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNr ZXItYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCc+IiArIChpc1JUTCA/IGNv bnRyb2xzIDogIiIpICsKCQkJKHRoaXMuX2lzSW5SYW5nZShpbnN0LCBnb3RvRGF0 ZSkgPyAiPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2Vy LWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkg dWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSd0b2RheScgZGF0YS1ldmVudD0n Y2xpY2snIiArCgkJCSI+IiArIGN1cnJlbnRUZXh0ICsgIjwvYnV0dG9uPiIgOiAi IikgKyAoaXNSVEwgPyAiIiA6IGNvbnRyb2xzKSArICI8L2Rpdj4iIDogIiI7CgoJ CWZpcnN0RGF5ID0gcGFyc2VJbnQodGhpcy5fZ2V0KGluc3QsICJmaXJzdERheSIp LDEwKTsKCQlmaXJzdERheSA9IChpc05hTihmaXJzdERheSkgPyAwIDogZmlyc3RE YXkpOwoKCQlzaG93V2VlayA9IHRoaXMuX2dldChpbnN0LCAic2hvd1dlZWsiKTsK CQlkYXlOYW1lcyA9IHRoaXMuX2dldChpbnN0LCAiZGF5TmFtZXMiKTsKCQlkYXlO YW1lc01pbiA9IHRoaXMuX2dldChpbnN0LCAiZGF5TmFtZXNNaW4iKTsKCQltb250 aE5hbWVzID0gdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzIik7CgkJbW9udGhO YW1lc1Nob3J0ID0gdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzU2hvcnQiKTsK CQliZWZvcmVTaG93RGF5ID0gdGhpcy5fZ2V0KGluc3QsICJiZWZvcmVTaG93RGF5 Iik7CgkJc2hvd090aGVyTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzaG93T3Ro ZXJNb250aHMiKTsKCQlzZWxlY3RPdGhlck1vbnRocyA9IHRoaXMuX2dldChpbnN0 LCAic2VsZWN0T3RoZXJNb250aHMiKTsKCQlkZWZhdWx0RGF0ZSA9IHRoaXMuX2dl dERlZmF1bHREYXRlKGluc3QpOwoJCWh0bWwgPSAiIjsKCQlkb3c7CgkJZm9yIChy b3cgPSAwOyByb3cgPCBudW1Nb250aHNbMF07IHJvdysrKSB7CgkJCWdyb3VwID0g IiI7CgkJCXRoaXMubWF4Um93cyA9IDQ7CgkJCWZvciAoY29sID0gMDsgY29sIDwg bnVtTW9udGhzWzFdOyBjb2wrKykgewoJCQkJc2VsZWN0ZWREYXRlID0gdGhpcy5f ZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250 aCwgaW5zdC5zZWxlY3RlZERheSkpOwoJCQkJY29ybmVyQ2xhc3MgPSAiIHVpLWNv cm5lci1hbGwiOwoJCQkJY2FsZW5kZXIgPSAiIjsKCQkJCWlmIChpc011bHRpTW9u dGgpIHsKCQkJCQljYWxlbmRlciArPSAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tl ci1ncm91cCI7CgkJCQkJaWYgKG51bU1vbnRoc1sxXSA+IDEpIHsKCQkJCQkJc3dp dGNoIChjb2wpIHsKCQkJCQkJCWNhc2UgMDogY2FsZW5kZXIgKz0gIiB1aS1kYXRl cGlja2VyLWdyb3VwLWZpcnN0IjsKCQkJCQkJCQljb3JuZXJDbGFzcyA9ICIgdWkt Y29ybmVyLSIgKyAoaXNSVEwgPyAicmlnaHQiIDogImxlZnQiKTsgYnJlYWs7CgkJ CQkJCQljYXNlIG51bU1vbnRoc1sxXS0xOiBjYWxlbmRlciArPSAiIHVpLWRhdGVw aWNrZXItZ3JvdXAtbGFzdCI7CgkJCQkJCQkJY29ybmVyQ2xhc3MgPSAiIHVpLWNv cm5lci0iICsgKGlzUlRMID8gImxlZnQiIDogInJpZ2h0Iik7IGJyZWFrOwoJCQkJ CQkJZGVmYXVsdDogY2FsZW5kZXIgKz0gIiB1aS1kYXRlcGlja2VyLWdyb3VwLW1p ZGRsZSI7IGNvcm5lckNsYXNzID0gIiI7IGJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJ CQkJCWNhbGVuZGVyICs9ICInPiI7CgkJCQl9CgkJCQljYWxlbmRlciArPSAiPGRp diBjbGFzcz0ndWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1 aS1oZWxwZXItY2xlYXJmaXgiICsgY29ybmVyQ2xhc3MgKyAiJz4iICsKCQkJCQko L2FsbHxsZWZ0Ly50ZXN0KGNvcm5lckNsYXNzKSAmJiByb3cgPT09IDAgPyAoaXNS VEwgPyBuZXh0IDogcHJldikgOiAiIikgKwoJCQkJCSgvYWxsfHJpZ2h0Ly50ZXN0 KGNvcm5lckNsYXNzKSAmJiByb3cgPT09IDAgPyAoaXNSVEwgPyBwcmV2IDogbmV4 dCkgOiAiIikgKwoJCQkJCXRoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGlu c3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsCgkJCQkJ cm93ID4gMCB8fCBjb2wgPiAwLCBtb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQp ICsgLy8gZHJhdyBtb250aCBoZWFkZXJzCgkJCQkJIjwvZGl2Pjx0YWJsZSBjbGFz cz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPiIgKwoJCQkJCSI8dHI+ IjsKCQkJCXRoZWFkID0gKHNob3dXZWVrID8gIjx0aCBjbGFzcz0ndWktZGF0ZXBp Y2tlci13ZWVrLWNvbCc+IiArIHRoaXMuX2dldChpbnN0LCAid2Vla0hlYWRlciIp ICsgIjwvdGg+IiA6ICIiKTsKCQkJCWZvciAoZG93ID0gMDsgZG93IDwgNzsgZG93 KyspIHsgLy8gZGF5cyBvZiB0aGUgd2VlawoJCQkJCWRheSA9IChkb3cgKyBmaXJz dERheSkgJSA3OwoJCQkJCXRoZWFkICs9ICI8dGgiICsgKChkb3cgKyBmaXJzdERh eSArIDYpICUgNyA+PSA1ID8gIiBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWVu ZCciIDogIiIpICsgIj4iICsKCQkJCQkJIjxzcGFuIHRpdGxlPSciICsgZGF5TmFt ZXNbZGF5XSArICInPiIgKyBkYXlOYW1lc01pbltkYXldICsgIjwvc3Bhbj48L3Ro PiI7CgkJCQl9CgkJCQljYWxlbmRlciArPSB0aGVhZCArICI8L3RyPjwvdGhlYWQ+ PHRib2R5PiI7CgkJCQlkYXlzSW5Nb250aCA9IHRoaXMuX2dldERheXNJbk1vbnRo KGRyYXdZZWFyLCBkcmF3TW9udGgpOwoJCQkJaWYgKGRyYXdZZWFyID09PSBpbnN0 LnNlbGVjdGVkWWVhciAmJiBkcmF3TW9udGggPT09IGluc3Quc2VsZWN0ZWRNb250 aCkgewoJCQkJCWluc3Quc2VsZWN0ZWREYXkgPSBNYXRoLm1pbihpbnN0LnNlbGVj dGVkRGF5LCBkYXlzSW5Nb250aCk7CgkJCQl9CgkJCQlsZWFkRGF5cyA9ICh0aGlz Ll9nZXRGaXJzdERheU9mTW9udGgoZHJhd1llYXIsIGRyYXdNb250aCkgLSBmaXJz dERheSArIDcpICUgNzsKCQkJCWN1clJvd3MgPSBNYXRoLmNlaWwoKGxlYWREYXlz ICsgZGF5c0luTW9udGgpIC8gNyk7IC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9m IHJvd3MgdG8gZ2VuZXJhdGUKCQkJCW51bVJvd3MgPSAoaXNNdWx0aU1vbnRoID8g dGhpcy5tYXhSb3dzID4gY3VyUm93cyA/IHRoaXMubWF4Um93cyA6IGN1clJvd3Mg OiBjdXJSb3dzKTsgLy9JZiBtdWx0aXBsZSBtb250aHMsIHVzZSB0aGUgaGlnaGVy IG51bWJlciBvZiByb3dzIChzZWUgIzcwNDMpCgkJCQl0aGlzLm1heFJvd3MgPSBu dW1Sb3dzOwoJCQkJcHJpbnREYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1 c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCwgMSAtIGxlYWREYXlzKSk7 CgkJCQlmb3IgKGRSb3cgPSAwOyBkUm93IDwgbnVtUm93czsgZFJvdysrKSB7IC8v IGNyZWF0ZSBkYXRlIHBpY2tlciByb3dzCgkJCQkJY2FsZW5kZXIgKz0gIjx0cj4i OwoJCQkJCXRib2R5ID0gKCFzaG93V2VlayA/ICIiIDogIjx0ZCBjbGFzcz0ndWkt ZGF0ZXBpY2tlci13ZWVrLWNvbCc+IiArCgkJCQkJCXRoaXMuX2dldChpbnN0LCAi Y2FsY3VsYXRlV2VlayIpKHByaW50RGF0ZSkgKyAiPC90ZD4iKTsKCQkJCQlmb3Ig KGRvdyA9IDA7IGRvdyA8IDc7IGRvdysrKSB7IC8vIGNyZWF0ZSBkYXRlIHBpY2tl ciBkYXlzCgkJCQkJCWRheVNldHRpbmdzID0gKGJlZm9yZVNob3dEYXkgPwoJCQkJ CQkJYmVmb3JlU2hvd0RheS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRb MF0gOiBudWxsKSwgW3ByaW50RGF0ZV0pIDogW3RydWUsICIiXSk7CgkJCQkJCW90 aGVyTW9udGggPSAocHJpbnREYXRlLmdldE1vbnRoKCkgIT09IGRyYXdNb250aCk7 CgkJCQkJCXVuc2VsZWN0YWJsZSA9IChvdGhlck1vbnRoICYmICFzZWxlY3RPdGhl ck1vbnRocykgfHwgIWRheVNldHRpbmdzWzBdIHx8CgkJCQkJCQkobWluRGF0ZSAm JiBwcmludERhdGUgPCBtaW5EYXRlKSB8fCAobWF4RGF0ZSAmJiBwcmludERhdGUg PiBtYXhEYXRlKTsKCQkJCQkJdGJvZHkgKz0gIjx0ZCBjbGFzcz0nIiArCgkJCQkJ CQkoKGRvdyArIGZpcnN0RGF5ICsgNikgJSA3ID49IDUgPyAiIHVpLWRhdGVwaWNr ZXItd2Vlay1lbmQiIDogIiIpICsgLy8gaGlnaGxpZ2h0IHdlZWtlbmRzCgkJCQkJ CQkob3RoZXJNb250aCA/ICIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCIgOiAi IikgKyAvLyBoaWdobGlnaHQgZGF5cyBmcm9tIG90aGVyIG1vbnRocwoJCQkJCQkJ KChwcmludERhdGUuZ2V0VGltZSgpID09PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgp ICYmIGRyYXdNb250aCA9PT0gaW5zdC5zZWxlY3RlZE1vbnRoICYmIGluc3QuX2tl eUV2ZW50KSB8fCAvLyB1c2VyIHByZXNzZWQga2V5CgkJCQkJCQkoZGVmYXVsdERh dGUuZ2V0VGltZSgpID09PSBwcmludERhdGUuZ2V0VGltZSgpICYmIGRlZmF1bHRE YXRlLmdldFRpbWUoKSA9PT0gc2VsZWN0ZWREYXRlLmdldFRpbWUoKSkgPwoJCQkJ CQkJLy8gb3IgZGVmYXVsdERhdGUgaXMgY3VycmVudCBwcmludGVkRGF0ZSBhbmQg ZGVmYXVsdERhdGUgaXMgc2VsZWN0ZWREYXRlCgkJCQkJCQkiICIgKyB0aGlzLl9k YXlPdmVyQ2xhc3MgOiAiIikgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJ CQkJCQkodW5zZWxlY3RhYmxlID8gIiAiICsgdGhpcy5fdW5zZWxlY3RhYmxlQ2xh c3MgKyAiIHVpLXN0YXRlLWRpc2FibGVkIjogIiIpICsgIC8vIGhpZ2hsaWdodCB1 bnNlbGVjdGFibGUgZGF5cwoJCQkJCQkJKG90aGVyTW9udGggJiYgIXNob3dPdGhl ck1vbnRocyA/ICIiIDogIiAiICsgZGF5U2V0dGluZ3NbMV0gKyAvLyBoaWdobGln aHQgY3VzdG9tIGRhdGVzCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PT0g Y3VycmVudERhdGUuZ2V0VGltZSgpID8gIiAiICsgdGhpcy5fY3VycmVudENsYXNz IDogIiIpICsgLy8gaGlnaGxpZ2h0IHNlbGVjdGVkIGRheQoJCQkJCQkJKHByaW50 RGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKSA/ICIgdWktZGF0ZXBp Y2tlci10b2RheSIgOiAiIikpICsgIiciICsgLy8gaGlnaGxpZ2h0IHRvZGF5IChp ZiBkaWZmZXJlbnQpCgkJCQkJCQkoKCFvdGhlck1vbnRoIHx8IHNob3dPdGhlck1v bnRocykgJiYgZGF5U2V0dGluZ3NbMl0gPyAiIHRpdGxlPSciICsgZGF5U2V0dGlu Z3NbMl0gKyAiJyIgOiAiIikgKyAvLyBjZWxsIHRpdGxlCgkJCQkJCQkodW5zZWxl Y3RhYmxlID8gIiIgOiAiIGRhdGEtaGFuZGxlcj0nc2VsZWN0RGF5JyBkYXRhLWV2 ZW50PSdjbGljaycgZGF0YS1tb250aD0nIiArIHByaW50RGF0ZS5nZXRNb250aCgp ICsgIicgZGF0YS15ZWFyPSciICsgcHJpbnREYXRlLmdldEZ1bGxZZWFyKCkgKyAi JyIpICsgIj4iICsgLy8gYWN0aW9ucwoJCQkJCQkJKG90aGVyTW9udGggJiYgIXNo b3dPdGhlck1vbnRocyA/ICImI3hhMDsiIDogLy8gZGlzcGxheSBmb3Igb3RoZXIg bW9udGhzCgkJCQkJCQkodW5zZWxlY3RhYmxlID8gIjxzcGFuIGNsYXNzPSd1aS1z dGF0ZS1kZWZhdWx0Jz4iICsgcHJpbnREYXRlLmdldERhdGUoKSArICI8L3NwYW4+ IiA6ICI8YSBjbGFzcz0ndWktc3RhdGUtZGVmYXVsdCIgKwoJCQkJCQkJKHByaW50 RGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKSA/ICIgdWktc3RhdGUt aGlnaGxpZ2h0IiA6ICIiKSArCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9 PT0gY3VycmVudERhdGUuZ2V0VGltZSgpID8gIiB1aS1zdGF0ZS1hY3RpdmUiIDog IiIpICsgLy8gaGlnaGxpZ2h0IHNlbGVjdGVkIGRheQoJCQkJCQkJKG90aGVyTW9u dGggPyAiIHVpLXByaW9yaXR5LXNlY29uZGFyeSIgOiAiIikgKyAvLyBkaXN0aW5n dWlzaCBkYXRlcyBmcm9tIG90aGVyIG1vbnRocwoJCQkJCQkJIicgaHJlZj0nIyc+ IiArIHByaW50RGF0ZS5nZXREYXRlKCkgKyAiPC9hPiIpKSArICI8L3RkPiI7IC8v IGRpc3BsYXkgc2VsZWN0YWJsZSBkYXRlCgkJCQkJCXByaW50RGF0ZS5zZXREYXRl KHByaW50RGF0ZS5nZXREYXRlKCkgKyAxKTsKCQkJCQkJcHJpbnREYXRlID0gdGhp cy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QocHJpbnREYXRlKTsKCQkJCQl9CgkJCQkJ Y2FsZW5kZXIgKz0gdGJvZHkgKyAiPC90cj4iOwoJCQkJfQoJCQkJZHJhd01vbnRo Kys7CgkJCQlpZiAoZHJhd01vbnRoID4gMTEpIHsKCQkJCQlkcmF3TW9udGggPSAw OwoJCQkJCWRyYXdZZWFyKys7CgkJCQl9CgkJCQljYWxlbmRlciArPSAiPC90Ym9k eT48L3RhYmxlPiIgKyAoaXNNdWx0aU1vbnRoID8gIjwvZGl2PiIgKwoJCQkJCQkJ KChudW1Nb250aHNbMF0gPiAwICYmIGNvbCA9PT0gbnVtTW9udGhzWzFdLTEpID8g IjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItcm93LWJyZWFrJz48L2Rpdj4iIDog IiIpIDogIiIpOwoJCQkJZ3JvdXAgKz0gY2FsZW5kZXI7CgkJCX0KCQkJaHRtbCAr PSBncm91cDsKCQl9CgkJaHRtbCArPSBidXR0b25QYW5lbDsKCQlpbnN0Ll9rZXlF dmVudCA9IGZhbHNlOwoJCXJldHVybiBodG1sOwoJfSwKCgkvKiBHZW5lcmF0ZSB0 aGUgbW9udGggYW5kIHllYXIgaGVhZGVyLiAqLwoJX2dlbmVyYXRlTW9udGhZZWFy SGVhZGVyOiBmdW5jdGlvbihpbnN0LCBkcmF3TW9udGgsIGRyYXdZZWFyLCBtaW5E YXRlLCBtYXhEYXRlLAoJCQlzZWNvbmRhcnksIG1vbnRoTmFtZXMsIG1vbnRoTmFt ZXNTaG9ydCkgewoKCQl2YXIgaW5NaW5ZZWFyLCBpbk1heFllYXIsIG1vbnRoLCB5 ZWFycywgdGhpc1llYXIsIGRldGVybWluZVllYXIsIHllYXIsIGVuZFllYXIsCgkJ CWNoYW5nZU1vbnRoID0gdGhpcy5fZ2V0KGluc3QsICJjaGFuZ2VNb250aCIpLAoJ CQljaGFuZ2VZZWFyID0gdGhpcy5fZ2V0KGluc3QsICJjaGFuZ2VZZWFyIiksCgkJ CXNob3dNb250aEFmdGVyWWVhciA9IHRoaXMuX2dldChpbnN0LCAic2hvd01vbnRo QWZ0ZXJZZWFyIiksCgkJCWh0bWwgPSAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tl ci10aXRsZSc+IiwKCQkJbW9udGhIdG1sID0gIiI7CgoJCS8vIG1vbnRoIHNlbGVj dGlvbgoJCWlmIChzZWNvbmRhcnkgfHwgIWNoYW5nZU1vbnRoKSB7CgkJCW1vbnRo SHRtbCArPSAiPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnPiIgKyBt b250aE5hbWVzW2RyYXdNb250aF0gKyAiPC9zcGFuPiI7CgkJfSBlbHNlIHsKCQkJ aW5NaW5ZZWFyID0gKG1pbkRhdGUgJiYgbWluRGF0ZS5nZXRGdWxsWWVhcigpID09 PSBkcmF3WWVhcik7CgkJCWluTWF4WWVhciA9IChtYXhEYXRlICYmIG1heERhdGUu Z2V0RnVsbFllYXIoKSA9PT0gZHJhd1llYXIpOwoJCQltb250aEh0bWwgKz0gIjxz ZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnIGRhdGEtaGFuZGxlcj0n c2VsZWN0TW9udGgnIGRhdGEtZXZlbnQ9J2NoYW5nZSc+IjsKCQkJZm9yICggbW9u dGggPSAwOyBtb250aCA8IDEyOyBtb250aCsrKSB7CgkJCQlpZiAoKCFpbk1pblll YXIgfHwgbW9udGggPj0gbWluRGF0ZS5nZXRNb250aCgpKSAmJiAoIWluTWF4WWVh ciB8fCBtb250aCA8PSBtYXhEYXRlLmdldE1vbnRoKCkpKSB7CgkJCQkJbW9udGhI dG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgbW9udGggKyAiJyIgKwoJCQkJCQko bW9udGggPT09IGRyYXdNb250aCA/ICIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyIgOiAi IikgKwoJCQkJCQkiPiIgKyBtb250aE5hbWVzU2hvcnRbbW9udGhdICsgIjwvb3B0 aW9uPiI7CgkJCQl9CgkJCX0KCQkJbW9udGhIdG1sICs9ICI8L3NlbGVjdD4iOwoJ CX0KCgkJaWYgKCFzaG93TW9udGhBZnRlclllYXIpIHsKCQkJaHRtbCArPSBtb250 aEh0bWwgKyAoc2Vjb25kYXJ5IHx8ICEoY2hhbmdlTW9udGggJiYgY2hhbmdlWWVh cikgPyAiJiN4YTA7IiA6ICIiKTsKCQl9CgoJCS8vIHllYXIgc2VsZWN0aW9uCgkJ aWYgKCAhaW5zdC55ZWFyc2h0bWwgKSB7CgkJCWluc3QueWVhcnNodG1sID0gIiI7 CgkJCWlmIChzZWNvbmRhcnkgfHwgIWNoYW5nZVllYXIpIHsKCQkJCWh0bWwgKz0g IjxzcGFuIGNsYXNzPSd1aS1kYXRlcGlja2VyLXllYXInPiIgKyBkcmF3WWVhciAr ICI8L3NwYW4+IjsKCQkJfSBlbHNlIHsKCQkJCS8vIGRldGVybWluZSByYW5nZSBv ZiB5ZWFycyB0byBkaXNwbGF5CgkJCQl5ZWFycyA9IHRoaXMuX2dldChpbnN0LCAi eWVhclJhbmdlIikuc3BsaXQoIjoiKTsKCQkJCXRoaXNZZWFyID0gbmV3IERhdGUo KS5nZXRGdWxsWWVhcigpOwoJCQkJZGV0ZXJtaW5lWWVhciA9IGZ1bmN0aW9uKHZh bHVlKSB7CgkJCQkJdmFyIHllYXIgPSAodmFsdWUubWF0Y2goL2NbK1wtXS4qLykg PyBkcmF3WWVhciArIHBhcnNlSW50KHZhbHVlLnN1YnN0cmluZygxKSwgMTApIDoK CQkJCQkJKHZhbHVlLm1hdGNoKC9bK1wtXS4qLykgPyB0aGlzWWVhciArIHBhcnNl SW50KHZhbHVlLCAxMCkgOgoJCQkJCQlwYXJzZUludCh2YWx1ZSwgMTApKSk7CgkJ CQkJcmV0dXJuIChpc05hTih5ZWFyKSA/IHRoaXNZZWFyIDogeWVhcik7CgkJCQl9 OwoJCQkJeWVhciA9IGRldGVybWluZVllYXIoeWVhcnNbMF0pOwoJCQkJZW5kWWVh ciA9IE1hdGgubWF4KHllYXIsIGRldGVybWluZVllYXIoeWVhcnNbMV0gfHwgIiIp KTsKCQkJCXllYXIgPSAobWluRGF0ZSA/IE1hdGgubWF4KHllYXIsIG1pbkRhdGUu Z2V0RnVsbFllYXIoKSkgOiB5ZWFyKTsKCQkJCWVuZFllYXIgPSAobWF4RGF0ZSA/ IE1hdGgubWluKGVuZFllYXIsIG1heERhdGUuZ2V0RnVsbFllYXIoKSkgOiBlbmRZ ZWFyKTsKCQkJCWluc3QueWVhcnNodG1sICs9ICI8c2VsZWN0IGNsYXNzPSd1aS1k YXRlcGlja2VyLXllYXInIGRhdGEtaGFuZGxlcj0nc2VsZWN0WWVhcicgZGF0YS1l dmVudD0nY2hhbmdlJz4iOwoJCQkJZm9yICg7IHllYXIgPD0gZW5kWWVhcjsgeWVh cisrKSB7CgkJCQkJaW5zdC55ZWFyc2h0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIg KyB5ZWFyICsgIiciICsKCQkJCQkJKHllYXIgPT09IGRyYXdZZWFyID8gIiBzZWxl Y3RlZD0nc2VsZWN0ZWQnIiA6ICIiKSArCgkJCQkJCSI+IiArIHllYXIgKyAiPC9v cHRpb24+IjsKCQkJCX0KCQkJCWluc3QueWVhcnNodG1sICs9ICI8L3NlbGVjdD4i OwoKCQkJCWh0bWwgKz0gaW5zdC55ZWFyc2h0bWw7CgkJCQlpbnN0LnllYXJzaHRt bCA9IG51bGw7CgkJCX0KCQl9CgoJCWh0bWwgKz0gdGhpcy5fZ2V0KGluc3QsICJ5 ZWFyU3VmZml4Iik7CgkJaWYgKHNob3dNb250aEFmdGVyWWVhcikgewoJCQlodG1s ICs9IChzZWNvbmRhcnkgfHwgIShjaGFuZ2VNb250aCAmJiBjaGFuZ2VZZWFyKSA/ ICImI3hhMDsiIDogIiIpICsgbW9udGhIdG1sOwoJCX0KCQlodG1sICs9ICI8L2Rp dj4iOyAvLyBDbG9zZSBkYXRlcGlja2VyX2hlYWRlcgoJCXJldHVybiBodG1sOwoJ fSwKCgkvKiBBZGp1c3Qgb25lIG9mIHRoZSBkYXRlIHN1Yi1maWVsZHMuICovCglf YWRqdXN0SW5zdERhdGU6IGZ1bmN0aW9uKGluc3QsIG9mZnNldCwgcGVyaW9kKSB7 CgkJdmFyIHllYXIgPSBpbnN0LmRyYXdZZWFyICsgKHBlcmlvZCA9PT0gIlkiID8g b2Zmc2V0IDogMCksCgkJCW1vbnRoID0gaW5zdC5kcmF3TW9udGggKyAocGVyaW9k ID09PSAiTSIgPyBvZmZzZXQgOiAwKSwKCQkJZGF5ID0gTWF0aC5taW4oaW5zdC5z ZWxlY3RlZERheSwgdGhpcy5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpKSAr IChwZXJpb2QgPT09ICJEIiA/IG9mZnNldCA6IDApLAoJCQlkYXRlID0gdGhpcy5f cmVzdHJpY3RNaW5NYXgoaW5zdCwgdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3Qo bmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpKTsKCgkJaW5zdC5zZWxlY3RlZERh eSA9IGRhdGUuZ2V0RGF0ZSgpOwoJCWluc3QuZHJhd01vbnRoID0gaW5zdC5zZWxl Y3RlZE1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwoJCWluc3QuZHJhd1llYXIgPSBp bnN0LnNlbGVjdGVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCQlpZiAocGVy aW9kID09PSAiTSIgfHwgcGVyaW9kID09PSAiWSIpIHsKCQkJdGhpcy5fbm90aWZ5 Q2hhbmdlKGluc3QpOwoJCX0KCX0sCgoJLyogRW5zdXJlIGEgZGF0ZSBpcyB3aXRo aW4gYW55IG1pbi9tYXggYm91bmRzLiAqLwoJX3Jlc3RyaWN0TWluTWF4OiBmdW5j dGlvbihpbnN0LCBkYXRlKSB7CgkJdmFyIG1pbkRhdGUgPSB0aGlzLl9nZXRNaW5N YXhEYXRlKGluc3QsICJtaW4iKSwKCQkJbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1h eERhdGUoaW5zdCwgIm1heCIpLAoJCQluZXdEYXRlID0gKG1pbkRhdGUgJiYgZGF0 ZSA8IG1pbkRhdGUgPyBtaW5EYXRlIDogZGF0ZSk7CgkJcmV0dXJuIChtYXhEYXRl ICYmIG5ld0RhdGUgPiBtYXhEYXRlID8gbWF4RGF0ZSA6IG5ld0RhdGUpOwoJfSwK CgkvKiBOb3RpZnkgY2hhbmdlIG9mIG1vbnRoL3llYXIuICovCglfbm90aWZ5Q2hh bmdlOiBmdW5jdGlvbihpbnN0KSB7CgkJdmFyIG9uQ2hhbmdlID0gdGhpcy5fZ2V0 KGluc3QsICJvbkNoYW5nZU1vbnRoWWVhciIpOwoJCWlmIChvbkNoYW5nZSkgewoJ CQlvbkNoYW5nZS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRbMF0gOiBu dWxsKSwKCQkJCVtpbnN0LnNlbGVjdGVkWWVhciwgaW5zdC5zZWxlY3RlZE1vbnRo ICsgMSwgaW5zdF0pOwoJCX0KCX0sCgoJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIg b2YgbW9udGhzIHRvIHNob3cuICovCglfZ2V0TnVtYmVyT2ZNb250aHM6IGZ1bmN0 aW9uKGluc3QpIHsKCQl2YXIgbnVtTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJu dW1iZXJPZk1vbnRocyIpOwoJCXJldHVybiAobnVtTW9udGhzID09IG51bGwgPyBb MSwgMV0gOiAodHlwZW9mIG51bU1vbnRocyA9PT0gIm51bWJlciIgPyBbMSwgbnVt TW9udGhzXSA6IG51bU1vbnRocykpOwoJfSwKCgkvKiBEZXRlcm1pbmUgdGhlIGN1 cnJlbnQgbWF4aW11bSBkYXRlIC0gZW5zdXJlIG5vIHRpbWUgY29tcG9uZW50cyBh cmUgc2V0LiAqLwoJX2dldE1pbk1heERhdGU6IGZ1bmN0aW9uKGluc3QsIG1pbk1h eCkgewoJCXJldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGluc3QsIHRoaXMuX2dl dChpbnN0LCBtaW5NYXggKyAiRGF0ZSIpLCBudWxsKTsKCX0sCgoJLyogRmluZCB0 aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBnaXZlbiBtb250aC4gKi8KCV9nZXREYXlz SW5Nb250aDogZnVuY3Rpb24oeWVhciwgbW9udGgpIHsKCQlyZXR1cm4gMzIgLSB0 aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLCBtb250aCwg MzIpKS5nZXREYXRlKCk7Cgl9LAoKCS8qIEZpbmQgdGhlIGRheSBvZiB0aGUgd2Vl ayBvZiB0aGUgZmlyc3Qgb2YgYSBtb250aC4gKi8KCV9nZXRGaXJzdERheU9mTW9u dGg6IGZ1bmN0aW9uKHllYXIsIG1vbnRoKSB7CgkJcmV0dXJuIG5ldyBEYXRlKHll YXIsIG1vbnRoLCAxKS5nZXREYXkoKTsKCX0sCgoJLyogRGV0ZXJtaW5lcyBpZiB3 ZSBzaG91bGQgYWxsb3cgYSAibmV4dC9wcmV2IiBtb250aCBkaXNwbGF5IGNoYW5n ZS4gKi8KCV9jYW5BZGp1c3RNb250aDogZnVuY3Rpb24oaW5zdCwgb2Zmc2V0LCBj dXJZZWFyLCBjdXJNb250aCkgewoJCXZhciBudW1Nb250aHMgPSB0aGlzLl9nZXRO dW1iZXJPZk1vbnRocyhpbnN0KSwKCQkJZGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2 aW5nQWRqdXN0KG5ldyBEYXRlKGN1clllYXIsCgkJCWN1ck1vbnRoICsgKG9mZnNl dCA8IDAgPyBvZmZzZXQgOiBudW1Nb250aHNbMF0gKiBudW1Nb250aHNbMV0pLCAx KSk7CgoJCWlmIChvZmZzZXQgPCAwKSB7CgkJCWRhdGUuc2V0RGF0ZSh0aGlzLl9n ZXREYXlzSW5Nb250aChkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgo KSkpOwoJCX0KCQlyZXR1cm4gdGhpcy5faXNJblJhbmdlKGluc3QsIGRhdGUpOwoJ fSwKCgkvKiBJcyB0aGUgZ2l2ZW4gZGF0ZSBpbiB0aGUgYWNjZXB0ZWQgcmFuZ2U/ ICovCglfaXNJblJhbmdlOiBmdW5jdGlvbihpbnN0LCBkYXRlKSB7CgkJdmFyIHll YXJTcGxpdCwgY3VycmVudFllYXIsCgkJCW1pbkRhdGUgPSB0aGlzLl9nZXRNaW5N YXhEYXRlKGluc3QsICJtaW4iKSwKCQkJbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1h eERhdGUoaW5zdCwgIm1heCIpLAoJCQltaW5ZZWFyID0gbnVsbCwKCQkJbWF4WWVh ciA9IG51bGwsCgkJCXllYXJzID0gdGhpcy5fZ2V0KGluc3QsICJ5ZWFyUmFuZ2Ui KTsKCQkJaWYgKHllYXJzKXsKCQkJCXllYXJTcGxpdCA9IHllYXJzLnNwbGl0KCI6 Iik7CgkJCQljdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTsK CQkJCW1pblllYXIgPSBwYXJzZUludCh5ZWFyU3BsaXRbMF0sIDEwKSArIGN1cnJl bnRZZWFyOwoJCQkJbWF4WWVhciA9IHBhcnNlSW50KHllYXJTcGxpdFsxXSwgMTAp ICsgY3VycmVudFllYXI7CgkJCX0KCgkJcmV0dXJuICgoIW1pbkRhdGUgfHwgZGF0 ZS5nZXRUaW1lKCkgPj0gbWluRGF0ZS5nZXRUaW1lKCkpICYmCgkJCSghbWF4RGF0 ZSB8fCBkYXRlLmdldFRpbWUoKSA8PSBtYXhEYXRlLmdldFRpbWUoKSkgJiYKCQkJ KCFtaW5ZZWFyIHx8IGRhdGUuZ2V0RnVsbFllYXIoKSA+PSBtaW5ZZWFyKSAmJgoJ CQkoIW1heFllYXIgfHwgZGF0ZS5nZXRGdWxsWWVhcigpIDw9IG1heFllYXIpKTsK CX0sCgoJLyogUHJvdmlkZSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3Ig Zm9ybWF0dGluZy9wYXJzaW5nLiAqLwoJX2dldEZvcm1hdENvbmZpZzogZnVuY3Rp b24oaW5zdCkgewoJCXZhciBzaG9ydFllYXJDdXRvZmYgPSB0aGlzLl9nZXQoaW5z dCwgInNob3J0WWVhckN1dG9mZiIpOwoJCXNob3J0WWVhckN1dG9mZiA9ICh0eXBl b2Ygc2hvcnRZZWFyQ3V0b2ZmICE9PSAic3RyaW5nIiA/IHNob3J0WWVhckN1dG9m ZiA6CgkJCW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArIHBhcnNlSW50 KHNob3J0WWVhckN1dG9mZiwgMTApKTsKCQlyZXR1cm4ge3Nob3J0WWVhckN1dG9m Zjogc2hvcnRZZWFyQ3V0b2ZmLAoJCQlkYXlOYW1lc1Nob3J0OiB0aGlzLl9nZXQo aW5zdCwgImRheU5hbWVzU2hvcnQiKSwgZGF5TmFtZXM6IHRoaXMuX2dldChpbnN0 LCAiZGF5TmFtZXMiKSwKCQkJbW9udGhOYW1lc1Nob3J0OiB0aGlzLl9nZXQoaW5z dCwgIm1vbnRoTmFtZXNTaG9ydCIpLCBtb250aE5hbWVzOiB0aGlzLl9nZXQoaW5z dCwgIm1vbnRoTmFtZXMiKX07Cgl9LAoKCS8qIEZvcm1hdCB0aGUgZ2l2ZW4gZGF0 ZSBmb3IgZGlzcGxheS4gKi8KCV9mb3JtYXREYXRlOiBmdW5jdGlvbihpbnN0LCBk YXksIG1vbnRoLCB5ZWFyKSB7CgkJaWYgKCFkYXkpIHsKCQkJaW5zdC5jdXJyZW50 RGF5ID0gaW5zdC5zZWxlY3RlZERheTsKCQkJaW5zdC5jdXJyZW50TW9udGggPSBp bnN0LnNlbGVjdGVkTW9udGg7CgkJCWluc3QuY3VycmVudFllYXIgPSBpbnN0LnNl bGVjdGVkWWVhcjsKCQl9CgkJdmFyIGRhdGUgPSAoZGF5ID8gKHR5cGVvZiBkYXkg PT09ICJvYmplY3QiID8gZGF5IDoKCQkJdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1 c3QobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpKSA6CgkJCXRoaXMuX2RheWxp Z2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsIGluc3Qu Y3VycmVudE1vbnRoLCBpbnN0LmN1cnJlbnREYXkpKSk7CgkJcmV0dXJuIHRoaXMu Zm9ybWF0RGF0ZSh0aGlzLl9nZXQoaW5zdCwgImRhdGVGb3JtYXQiKSwgZGF0ZSwg dGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKTsKCX0KfSk7CgovKgogKiBCaW5k IGhvdmVyIGV2ZW50cyBmb3IgZGF0ZXBpY2tlciBlbGVtZW50cy4KICogRG9uZSB2 aWEgZGVsZWdhdGUgc28gdGhlIGJpbmRpbmcgb25seSBvY2N1cnMgb25jZSBpbiB0 aGUgbGlmZXRpbWUgb2YgdGhlIHBhcmVudCBkaXYuCiAqIEdsb2JhbCBpbnN0QWN0 aXZlLCBzZXQgYnkgX3VwZGF0ZURhdGVwaWNrZXIgYWxsb3dzIHRoZSBoYW5kbGVy cyB0byBmaW5kIHRoZWlyIHdheSBiYWNrIHRvIHRoZSBhY3RpdmUgcGlja2VyLgog Ki8KZnVuY3Rpb24gYmluZEhvdmVyKGRwRGl2KSB7Cgl2YXIgc2VsZWN0b3IgPSAi YnV0dG9uLCAudWktZGF0ZXBpY2tlci1wcmV2LCAudWktZGF0ZXBpY2tlci1uZXh0 LCAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhIjsKCXJldHVybiBkcERpdi5k ZWxlZ2F0ZShzZWxlY3RvciwgIm1vdXNlb3V0IiwgZnVuY3Rpb24oKSB7CgkJCSQo dGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIik7CgkJCWlmICh0aGlz LmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSAhPT0gLTEp IHsKCQkJCSQodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1o b3ZlciIpOwoJCQl9CgkJCWlmICh0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1k YXRlcGlja2VyLW5leHQiKSAhPT0gLTEpIHsKCQkJCSQodGhpcykucmVtb3ZlQ2xh c3MoInVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpOwoJCQl9CgkJfSkKCQkuZGVs ZWdhdGUoc2VsZWN0b3IsICJtb3VzZW92ZXIiLCBmdW5jdGlvbigpewoJCQlpZiAo ISQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoIGluc3RBY3RpdmUu aW5saW5lID8gZHBEaXYucGFyZW50KClbMF0gOiBpbnN0QWN0aXZlLmlucHV0WzBd KSkgewoJCQkJJCh0aGlzKS5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRh ciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKTsKCQkJ CSQodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIik7CgkJCQlpZiAodGhp cy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikgIT09IC0x KSB7CgkJCQkJJCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhv dmVyIik7CgkJCQl9CgkJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWkt ZGF0ZXBpY2tlci1uZXh0IikgIT09IC0xKSB7CgkJCQkJJCh0aGlzKS5hZGRDbGFz cygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIik7CgkJCQl9CgkJCX0KCQl9KTsK fQoKLyogalF1ZXJ5IGV4dGVuZCBub3cgaWdub3JlcyBudWxscyEgKi8KZnVuY3Rp b24gZXh0ZW5kUmVtb3ZlKHRhcmdldCwgcHJvcHMpIHsKCSQuZXh0ZW5kKHRhcmdl dCwgcHJvcHMpOwoJZm9yICh2YXIgbmFtZSBpbiBwcm9wcykgewoJCWlmIChwcm9w c1tuYW1lXSA9PSBudWxsKSB7CgkJCXRhcmdldFtuYW1lXSA9IHByb3BzW25hbWVd OwoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn0KCi8qIEludm9rZSB0aGUgZGF0ZXBp Y2tlciBmdW5jdGlvbmFsaXR5LgogICBAcGFyYW0gIG9wdGlvbnMgIHN0cmluZyAt IGEgY29tbWFuZCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIHBh cmFtZXRlcnMgb3IKCQkJCQlPYmplY3QgLSBzZXR0aW5ncyBmb3IgYXR0YWNoaW5n IG5ldyBkYXRlcGlja2VyIGZ1bmN0aW9uYWxpdHkKICAgQHJldHVybiAgalF1ZXJ5 IG9iamVjdCAqLwokLmZuLmRhdGVwaWNrZXIgPSBmdW5jdGlvbihvcHRpb25zKXsK CgkvKiBWZXJpZnkgYW4gZW1wdHkgY29sbGVjdGlvbiB3YXNuJ3QgcGFzc2VkIC0g Rml4ZXMgIzY5NzYgKi8KCWlmICggIXRoaXMubGVuZ3RoICkgewoJCXJldHVybiB0 aGlzOwoJfQoKCS8qIEluaXRpYWxpc2UgdGhlIGRhdGUgcGlja2VyLiAqLwoJaWYg KCEkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQpIHsKCQkkKGRvY3VtZW50KS5tb3Vz ZWRvd24oJC5kYXRlcGlja2VyLl9jaGVja0V4dGVybmFsQ2xpY2spOwoJCSQuZGF0 ZXBpY2tlci5pbml0aWFsaXplZCA9IHRydWU7Cgl9CgoJLyogQXBwZW5kIGRhdGVw aWNrZXIgbWFpbiBjb250YWluZXIgdG8gYm9keSBpZiBub3QgZXhpc3QuICovCglp ZiAoJCgiIyIrJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aCA9PT0gMCkg ewoJCSQoImJvZHkiKS5hcHBlbmQoJC5kYXRlcGlja2VyLmRwRGl2KTsKCX0KCgl2 YXIgb3RoZXJBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1l bnRzLCAxKTsKCWlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgJiYgKG9w dGlvbnMgPT09ICJpc0Rpc2FibGVkIiB8fCBvcHRpb25zID09PSAiZ2V0RGF0ZSIg fHwgb3B0aW9ucyA9PT0gIndpZGdldCIpKSB7CgkJcmV0dXJuICQuZGF0ZXBpY2tl clsiXyIgKyBvcHRpb25zICsgIkRhdGVwaWNrZXIiXS4KCQkJYXBwbHkoJC5kYXRl cGlja2VyLCBbdGhpc1swXV0uY29uY2F0KG90aGVyQXJncykpOwoJfQoJaWYgKG9w dGlvbnMgPT09ICJvcHRpb24iICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYg dHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gInN0cmluZyIpIHsKCQlyZXR1cm4gJC5k YXRlcGlja2VyWyJfIiArIG9wdGlvbnMgKyAiRGF0ZXBpY2tlciJdLgoJCQlhcHBs eSgkLmRhdGVwaWNrZXIsIFt0aGlzWzBdXS5jb25jYXQob3RoZXJBcmdzKSk7Cgl9 CglyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCXR5cGVvZiBvcHRpb25z ID09PSAic3RyaW5nIiA/CgkJCSQuZGF0ZXBpY2tlclsiXyIgKyBvcHRpb25zICsg IkRhdGVwaWNrZXIiXS4KCQkJCWFwcGx5KCQuZGF0ZXBpY2tlciwgW3RoaXNdLmNv bmNhdChvdGhlckFyZ3MpKSA6CgkJCSQuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBp Y2tlcih0aGlzLCBvcHRpb25zKTsKCX0pOwp9OwoKJC5kYXRlcGlja2VyID0gbmV3 IERhdGVwaWNrZXIoKTsgLy8gc2luZ2xldG9uIGluc3RhbmNlCiQuZGF0ZXBpY2tl ci5pbml0aWFsaXplZCA9IGZhbHNlOwokLmRhdGVwaWNrZXIudXVpZCA9IG5ldyBE YXRlKCkuZ2V0VGltZSgpOwokLmRhdGVwaWNrZXIudmVyc2lvbiA9ICIxLjEwLjAi OwoKLy8gV29ya2Fyb3VuZCBmb3IgIzQwNTUKLy8gQWRkIGFub3RoZXIgZ2xvYmFs IHRvIGF2b2lkIG5vQ29uZmxpY3QgaXNzdWVzIHdpdGggaW5saW5lIGV2ZW50IGhh bmRsZXJzCndpbmRvd1siRFBfalF1ZXJ5XyIgKyBkcHV1aWRdID0gJDsKCn0pKGpR dWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsKCnZhciBzaXplUmVs YXRlZE9wdGlvbnMgPSB7CgkJYnV0dG9uczogdHJ1ZSwKCQloZWlnaHQ6IHRydWUs CgkJbWF4SGVpZ2h0OiB0cnVlLAoJCW1heFdpZHRoOiB0cnVlLAoJCW1pbkhlaWdo dDogdHJ1ZSwKCQltaW5XaWR0aDogdHJ1ZSwKCQl3aWR0aDogdHJ1ZQoJfSwKCXJl c2l6YWJsZVJlbGF0ZWRPcHRpb25zID0gewoJCW1heEhlaWdodDogdHJ1ZSwKCQlt YXhXaWR0aDogdHJ1ZSwKCQltaW5IZWlnaHQ6IHRydWUsCgkJbWluV2lkdGg6IHRy dWUKCX07CgokLndpZGdldCggInVpLmRpYWxvZyIsIHsKCXZlcnNpb246ICIxLjEw LjAiLAoJb3B0aW9uczogewoJCWFwcGVuZFRvOiAiYm9keSIsCgkJYXV0b09wZW46 IHRydWUsCgkJYnV0dG9uczogW10sCgkJY2xvc2VPbkVzY2FwZTogdHJ1ZSwKCQlj bG9zZVRleHQ6ICJjbG9zZSIsCgkJZGlhbG9nQ2xhc3M6ICIiLAoJCWRyYWdnYWJs ZTogdHJ1ZSwKCQloaWRlOiBudWxsLAoJCWhlaWdodDogImF1dG8iLAoJCW1heEhl aWdodDogbnVsbCwKCQltYXhXaWR0aDogbnVsbCwKCQltaW5IZWlnaHQ6IDE1MCwK CQltaW5XaWR0aDogMTUwLAoJCW1vZGFsOiBmYWxzZSwKCQlwb3NpdGlvbjogewoJ CQlteTogImNlbnRlciIsCgkJCWF0OiAiY2VudGVyIiwKCQkJb2Y6IHdpbmRvdywK CQkJY29sbGlzaW9uOiAiZml0IiwKCQkJLy8gRW5zdXJlIHRoZSB0aXRsZWJhciBp cyBhbHdheXMgdmlzaWJsZQoJCQl1c2luZzogZnVuY3Rpb24oIHBvcyApIHsKCQkJ CXZhciB0b3BPZmZzZXQgPSAkKCB0aGlzICkuY3NzKCBwb3MgKS5vZmZzZXQoKS50 b3A7CgkJCQlpZiAoIHRvcE9mZnNldCA8IDAgKSB7CgkJCQkJJCggdGhpcyApLmNz cyggInRvcCIsIHBvcy50b3AgLSB0b3BPZmZzZXQgKTsKCQkJCX0KCQkJfQoJCX0s CgkJcmVzaXphYmxlOiB0cnVlLAoJCXNob3c6IG51bGwsCgkJdGl0bGU6IG51bGws CgkJd2lkdGg6IDMwMCwKCgkJLy8gY2FsbGJhY2tzCgkJYmVmb3JlQ2xvc2U6IG51 bGwsCgkJY2xvc2U6IG51bGwsCgkJZHJhZzogbnVsbCwKCQlkcmFnU3RhcnQ6IG51 bGwsCgkJZHJhZ1N0b3A6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJb3BlbjogbnVs bCwKCQlyZXNpemU6IG51bGwsCgkJcmVzaXplU3RhcnQ6IG51bGwsCgkJcmVzaXpl U3RvcDogbnVsbAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLm9y aWdpbmFsQ3NzID0gewoJCQlkaXNwbGF5OiB0aGlzLmVsZW1lbnRbMF0uc3R5bGUu ZGlzcGxheSwKCQkJd2lkdGg6IHRoaXMuZWxlbWVudFswXS5zdHlsZS53aWR0aCwK CQkJbWluSGVpZ2h0OiB0aGlzLmVsZW1lbnRbMF0uc3R5bGUubWluSGVpZ2h0LAoJ CQltYXhIZWlnaHQ6IHRoaXMuZWxlbWVudFswXS5zdHlsZS5tYXhIZWlnaHQsCgkJ CWhlaWdodDogdGhpcy5lbGVtZW50WzBdLnN0eWxlLmhlaWdodAoJCX07CgkJdGhp cy5vcmlnaW5hbFBvc2l0aW9uID0gewoJCQlwYXJlbnQ6IHRoaXMuZWxlbWVudC5w YXJlbnQoKSwKCQkJaW5kZXg6IHRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJl bigpLmluZGV4KCB0aGlzLmVsZW1lbnQgKQoJCX07CgkJdGhpcy5vcmlnaW5hbFRp dGxlID0gdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIik7CgkJdGhpcy5vcHRpb25z LnRpdGxlID0gdGhpcy5vcHRpb25zLnRpdGxlIHx8IHRoaXMub3JpZ2luYWxUaXRs ZTsKCgkJdGhpcy5fY3JlYXRlV3JhcHBlcigpOwoKCQl0aGlzLmVsZW1lbnQKCQkJ LnNob3coKQoJCQkucmVtb3ZlQXR0cigidGl0bGUiKQoJCQkuYWRkQ2xhc3MoInVp LWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikKCQkJLmFwcGVuZFRv KCB0aGlzLnVpRGlhbG9nICk7CgoJCXRoaXMuX2NyZWF0ZVRpdGxlYmFyKCk7CgkJ dGhpcy5fY3JlYXRlQnV0dG9uUGFuZSgpOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5k cmFnZ2FibGUgJiYgJC5mbi5kcmFnZ2FibGUgKSB7CgkJCXRoaXMuX21ha2VEcmFn Z2FibGUoKTsKCQl9CgkJaWYgKCB0aGlzLm9wdGlvbnMucmVzaXphYmxlICYmICQu Zm4ucmVzaXphYmxlICkgewoJCQl0aGlzLl9tYWtlUmVzaXphYmxlKCk7CgkJfQoK CQl0aGlzLl9pc09wZW4gPSBmYWxzZTsKCX0sCgoJX2luaXQ6IGZ1bmN0aW9uKCkg ewoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9PcGVuICkgewoJCQl0aGlzLm9wZW4o KTsKCQl9Cgl9LAoKCV9hcHBlbmRUbzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW1l bnQgPSB0aGlzLm9wdGlvbnMuYXBwZW5kVG87CgkJaWYgKCBlbGVtZW50ICYmIChl bGVtZW50LmpxdWVyeSB8fCBlbGVtZW50Lm5vZGVUeXBlKSApIHsKCQkJcmV0dXJu ICQoIGVsZW1lbnQgKTsKCQl9CgkJcmV0dXJuIHRoaXMuZG9jdW1lbnQuZmluZCgg ZWxlbWVudCB8fCAiYm9keSIgKS5lcSggMCApOwoJfSwKCglfZGVzdHJveTogZnVu Y3Rpb24oKSB7CgkJdmFyIG5leHQsCgkJCW9yaWdpbmFsUG9zaXRpb24gPSB0aGlz Lm9yaWdpbmFsUG9zaXRpb247CgoJCXRoaXMuX2Rlc3Ryb3lPdmVybGF5KCk7CgoJ CXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlVW5pcXVlSWQoKQoJCQkucmVtb3ZlQ2xh c3MoInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IikKCQkJLmNz cyggdGhpcy5vcmlnaW5hbENzcyApCgkJCS8vIFdpdGhvdXQgZGV0YWNoaW5nIGZp cnN0LCB0aGUgZm9sbG93aW5nIGJlY29tZXMgcmVhbGx5IHNsb3cKCQkJLmRldGFj aCgpOwoKCQl0aGlzLnVpRGlhbG9nLnN0b3AoIHRydWUsIHRydWUgKS5yZW1vdmUo KTsKCgkJaWYgKCB0aGlzLm9yaWdpbmFsVGl0bGUgKSB7CgkJCXRoaXMuZWxlbWVu dC5hdHRyKCAidGl0bGUiLCB0aGlzLm9yaWdpbmFsVGl0bGUgKTsKCQl9CgoJCW5l eHQgPSBvcmlnaW5hbFBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbigpLmVxKCBvcmln aW5hbFBvc2l0aW9uLmluZGV4ICk7CgkJLy8gRG9uJ3QgdHJ5IHRvIHBsYWNlIHRo ZSBkaWFsb2cgbmV4dCB0byBpdHNlbGYgKCM4NjEzKQoJCWlmICggbmV4dC5sZW5n dGggJiYgbmV4dFswXSAhPT0gdGhpcy5lbGVtZW50WzBdICkgewoJCQluZXh0LmJl Zm9yZSggdGhpcy5lbGVtZW50ICk7CgkJfSBlbHNlIHsKCQkJb3JpZ2luYWxQb3Np dGlvbi5wYXJlbnQuYXBwZW5kKCB0aGlzLmVsZW1lbnQgKTsKCQl9Cgl9LAoKCXdp ZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudWlEaWFsb2c7Cgl9LAoK CWRpc2FibGU6ICQubm9vcCwKCWVuYWJsZTogJC5ub29wLAoKCWNsb3NlOiBmdW5j dGlvbiggZXZlbnQgKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQlpZiAoICF0aGlz Ll9pc09wZW4gfHwgdGhpcy5fdHJpZ2dlciggImJlZm9yZUNsb3NlIiwgZXZlbnQg KSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX2lzT3BlbiA9 IGZhbHNlOwoJCXRoaXMuX2Rlc3Ryb3lPdmVybGF5KCk7CgoJCWlmICggIXRoaXMu b3BlbmVyLmZpbHRlcigiOmZvY3VzYWJsZSIpLmZvY3VzKCkubGVuZ3RoICkgewoJ CQkvLyBIaWRpbmcgYSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCB0cmlnZ2VyIGJs dXIgaW4gV2ViS2l0CgkJCS8vIHNvIGluIGNhc2Ugd2UgaGF2ZSBub3RoaW5nIHRv IGZvY3VzIG9uLCBleHBsaWNpdGx5IGJsdXIgdGhlIGFjdGl2ZSBlbGVtZW50CgkJ CS8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzE4 MgoJCQkkKCB0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQgKS5ibHVyKCk7 CgkJfQoKCQl0aGlzLl9oaWRlKCB0aGlzLnVpRGlhbG9nLCB0aGlzLm9wdGlvbnMu aGlkZSwgZnVuY3Rpb24oKSB7CgkJCXRoYXQuX3RyaWdnZXIoICJjbG9zZSIsIGV2 ZW50ICk7CgkJfSk7Cgl9LAoKCWlzT3BlbjogZnVuY3Rpb24oKSB7CgkJcmV0dXJu IHRoaXMuX2lzT3BlbjsKCX0sCgoJbW92ZVRvVG9wOiBmdW5jdGlvbigpIHsKCQl0 aGlzLl9tb3ZlVG9Ub3AoKTsKCX0sCgoJX21vdmVUb1RvcDogZnVuY3Rpb24oIGV2 ZW50LCBzaWxlbnQgKSB7CgkJdmFyIG1vdmVkID0gISF0aGlzLnVpRGlhbG9nLm5l eHRBbGwoIjp2aXNpYmxlIikuaW5zZXJ0QmVmb3JlKCB0aGlzLnVpRGlhbG9nICku bGVuZ3RoOwoJCWlmICggbW92ZWQgJiYgIXNpbGVudCApIHsKCQkJdGhpcy5fdHJp Z2dlciggImZvY3VzIiwgZXZlbnQgKTsKCQl9CgkJcmV0dXJuIG1vdmVkOwoJfSwK CglvcGVuOiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMuX2lzT3BlbiApIHsKCQkJ aWYgKCB0aGlzLl9tb3ZlVG9Ub3AoKSApIHsKCQkJCXRoaXMuX2ZvY3VzVGFiYmFi bGUoKTsKCQkJfQoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLm9wZW5lciA9ICQoIHRo aXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCApOwoKCQl0aGlzLl9zaXplKCk7 CgkJdGhpcy5fcG9zaXRpb24oKTsKCQl0aGlzLl9jcmVhdGVPdmVybGF5KCk7CgkJ dGhpcy5fbW92ZVRvVG9wKCBudWxsLCB0cnVlICk7CgkJdGhpcy5fc2hvdyggdGhp cy51aURpYWxvZywgdGhpcy5vcHRpb25zLnNob3cgKTsKCgkJdGhpcy5fZm9jdXNU YWJiYWJsZSgpOwoKCQl0aGlzLl9pc09wZW4gPSB0cnVlOwoJCXRoaXMuX3RyaWdn ZXIoIm9wZW4iKTsKCQl0aGlzLl90cmlnZ2VyKCJmb2N1cyIpOwoJfSwKCglfZm9j dXNUYWJiYWJsZTogZnVuY3Rpb24oKSB7CgkJLy8gU2V0IGZvY3VzIHRvIHRoZSBm aXJzdCBtYXRjaDoKCQkvLyAxLiBGaXJzdCBlbGVtZW50IGluc2lkZSB0aGUgZGlh bG9nIG1hdGNoaW5nIFthdXRvZm9jdXNdCgkJLy8gMi4gVGFiYmFibGUgZWxlbWVu dCBpbnNpZGUgdGhlIGNvbnRlbnQgZWxlbWVudAoJCS8vIDMuIFRhYmJhYmxlIGVs ZW1lbnQgaW5zaWRlIHRoZSBidXR0b25wYW5lCgkJLy8gNC4gVGhlIGNsb3NlIGJ1 dHRvbgoJCS8vIDUuIFRoZSBkaWFsb2cgaXRzZWxmCgkJdmFyIGhhc0ZvY3VzID0g dGhpcy5lbGVtZW50LmZpbmQoIlthdXRvZm9jdXNdIik7CgkJaWYgKCAhaGFzRm9j dXMubGVuZ3RoICkgewoJCQloYXNGb2N1cyA9IHRoaXMuZWxlbWVudC5maW5kKCI6 dGFiYmFibGUiKTsKCQl9CgkJaWYgKCAhaGFzRm9jdXMubGVuZ3RoICkgewoJCQlo YXNGb2N1cyA9IHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoIjp0YWJiYWJs ZSIpOwoJCX0KCQlpZiAoICFoYXNGb2N1cy5sZW5ndGggKSB7CgkJCWhhc0ZvY3Vz ID0gdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UuZmlsdGVyKCI6dGFiYmFibGUi KTsKCQl9CgkJaWYgKCAhaGFzRm9jdXMubGVuZ3RoICkgewoJCQloYXNGb2N1cyA9 IHRoaXMudWlEaWFsb2c7CgkJfQoJCWhhc0ZvY3VzLmVxKCAwICkuZm9jdXMoKTsK CX0sCgoJX2tlZXBGb2N1czogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWZ1bmN0aW9u IGNoZWNrRm9jdXMoKSB7CgkJCXZhciBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1 bWVudFswXS5hY3RpdmVFbGVtZW50LAoJCQkJaXNBY3RpdmUgPSB0aGlzLnVpRGlh bG9nWzBdID09PSBhY3RpdmVFbGVtZW50IHx8CgkJCQkJJC5jb250YWlucyggdGhp cy51aURpYWxvZ1swXSwgYWN0aXZlRWxlbWVudCApOwoJCQlpZiAoICFpc0FjdGl2 ZSApIHsKCQkJCXRoaXMuX2ZvY3VzVGFiYmFibGUoKTsKCQkJfQoJCX0KCQlldmVu dC5wcmV2ZW50RGVmYXVsdCgpOwoJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoJ CS8vIHN1cHBvcnQ6IElFCgkJLy8gSUUgPD0gOCBkb2Vzbid0IHByZXZlbnQgbW92 aW5nIGZvY3VzIGV2ZW4gd2l0aCBldmVudC5wcmV2ZW50RGVmYXVsdCgpCgkJLy8g c28gd2UgY2hlY2sgYWdhaW4gbGF0ZXIKCQl0aGlzLl9kZWxheSggY2hlY2tGb2N1 cyApOwoJfSwKCglfY3JlYXRlV3JhcHBlcjogZnVuY3Rpb24oKSB7CgkJdGhpcy51 aURpYWxvZyA9ICQoIjxkaXY+IikKCQkJLmFkZENsYXNzKCAidWktZGlhbG9nIHVp LXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLWZyb250 ICIgKwoJCQkJdGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzICkKCQkJLmhpZGUoKQoJ CQkuYXR0cih7CgkJCQkvLyBTZXR0aW5nIHRhYkluZGV4IG1ha2VzIHRoZSBkaXYg Zm9jdXNhYmxlCgkJCQl0YWJJbmRleDogLTEsCgkJCQlyb2xlOiAiZGlhbG9nIgoJ CQl9KQoJCQkuYXBwZW5kVG8oIHRoaXMuX2FwcGVuZFRvKCkgKTsKCgkJdGhpcy5f b24oIHRoaXMudWlEaWFsb2csIHsKCQkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50 ICkgewoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSAmJiAhZXZl bnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgZXZlbnQua2V5Q29kZSAmJgoJCQkJ CQlldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuRVNDQVBFICkgewoJCQkJ CWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJdGhpcy5jbG9zZSggZXZlbnQg KTsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJLy8gcHJldmVudCB0YWJiaW5nIG91 dCBvZiBkaWFsb2dzCgkJCQlpZiAoIGV2ZW50LmtleUNvZGUgIT09ICQudWkua2V5 Q29kZS5UQUIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJdmFyIHRhYmJhYmxl cyA9IHRoaXMudWlEaWFsb2cuZmluZCgiOnRhYmJhYmxlIiksCgkJCQkJZmlyc3Qg PSB0YWJiYWJsZXMuZmlsdGVyKCI6Zmlyc3QiKSwKCQkJCQlsYXN0ICA9IHRhYmJh Ymxlcy5maWx0ZXIoIjpsYXN0Iik7CgoJCQkJaWYgKCAoIGV2ZW50LnRhcmdldCA9 PT0gbGFzdFswXSB8fCBldmVudC50YXJnZXQgPT09IHRoaXMudWlEaWFsb2dbMF0g KSAmJiAhZXZlbnQuc2hpZnRLZXkgKSB7CgkJCQkJZmlyc3QuZm9jdXMoIDEgKTsK CQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfSBlbHNlIGlmICggKCBl dmVudC50YXJnZXQgPT09IGZpcnN0WzBdIHx8IGV2ZW50LnRhcmdldCA9PT0gdGhp cy51aURpYWxvZ1swXSApICYmIGV2ZW50LnNoaWZ0S2V5ICkgewoJCQkJCWxhc3Qu Zm9jdXMoIDEgKTsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJ CQl9LAoJCQltb3VzZWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICgg dGhpcy5fbW92ZVRvVG9wKCBldmVudCApICkgewoJCQkJCXRoaXMuX2ZvY3VzVGFi YmFibGUoKTsKCQkJCX0KCQkJfQoJCX0pOwoKCQkvLyBXZSBhc3N1bWUgdGhhdCBh bnkgZXhpc3RpbmcgYXJpYS1kZXNjcmliZWRieSBhdHRyaWJ1dGUgbWVhbnMKCQkv LyB0aGF0IHRoZSBkaWFsb2cgY29udGVudCBpcyBtYXJrZWQgdXAgcHJvcGVybHkK CQkvLyBvdGhlcndpc2Ugd2UgYnJ1dGUgZm9yY2UgdGhlIGNvbnRlbnQgYXMgdGhl IGRlc2NyaXB0aW9uCgkJaWYgKCAhdGhpcy5lbGVtZW50LmZpbmQoIlthcmlhLWRl c2NyaWJlZGJ5XSIpLmxlbmd0aCApIHsKCQkJdGhpcy51aURpYWxvZy5hdHRyKHsK CQkJCSJhcmlhLWRlc2NyaWJlZGJ5IjogdGhpcy5lbGVtZW50LnVuaXF1ZUlkKCku YXR0cigiaWQiKQoJCQl9KTsKCQl9Cgl9LAoKCV9jcmVhdGVUaXRsZWJhcjogZnVu Y3Rpb24oKSB7CgkJdmFyIHVpRGlhbG9nVGl0bGU7CgoJCXRoaXMudWlEaWFsb2dU aXRsZWJhciA9ICQoIjxkaXY+IikKCQkJLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0 bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1j bGVhcmZpeCIpCgkJCS5wcmVwZW5kVG8oIHRoaXMudWlEaWFsb2cgKTsKCQl0aGlz Ll9vbiggdGhpcy51aURpYWxvZ1RpdGxlYmFyLCB7CgkJCW1vdXNlZG93bjogZnVu Y3Rpb24oIGV2ZW50ICkgewoJCQkJLy8gRG9uJ3QgcHJldmVudCBjbGljayBvbiBj bG9zZSBidXR0b24gKCM4ODM4KQoJCQkJLy8gRm9jdXNpbmcgYSBkaWFsb2cgdGhh dCBpcyBwYXJ0aWFsbHkgc2Nyb2xsZWQgb3V0IG9mIHZpZXcKCQkJCS8vIGNhdXNl cyB0aGUgYnJvd3NlciB0byBzY3JvbGwgaXQgaW50byB2aWV3LCBwcmV2ZW50aW5n IHRoZSBjbGljayBldmVudAoJCQkJaWYgKCAhJCggZXZlbnQudGFyZ2V0ICkuY2xv c2VzdCgiLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIpICkgewoJCQkJCS8vIERp YWxvZyBpc24ndCBnZXR0aW5nIGZvY3VzIHdoZW4gZHJhZ2dpbmcgKCM4MDYzKQoJ CQkJCXRoaXMudWlEaWFsb2cuZm9jdXMoKTsKCQkJCX0KCQkJfQoJCX0pOwoKCQl0 aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZSA9ICQoIjxidXR0b24+PC9idXR0b24+ IikKCQkJLmJ1dHRvbih7CgkJCQlsYWJlbDogdGhpcy5vcHRpb25zLmNsb3NlVGV4 dCwKCQkJCWljb25zOiB7CgkJCQkJcHJpbWFyeTogInVpLWljb24tY2xvc2V0aGlj ayIKCQkJCX0sCgkJCQl0ZXh0OiBmYWxzZQoJCQl9KQoJCQkuYWRkQ2xhc3MoInVp LWRpYWxvZy10aXRsZWJhci1jbG9zZSIpCgkJCS5hcHBlbmRUbyggdGhpcy51aURp YWxvZ1RpdGxlYmFyICk7CgkJdGhpcy5fb24oIHRoaXMudWlEaWFsb2dUaXRsZWJh ckNsb3NlLCB7CgkJCWNsaWNrOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlldmVu dC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJdGhpcy5jbG9zZSggZXZlbnQgKTsKCQkJ fQoJCX0pOwoKCQl1aURpYWxvZ1RpdGxlID0gJCgiPHNwYW4+IikKCQkJLnVuaXF1 ZUlkKCkKCQkJLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGUiKQoJCQkucHJlcGVu ZFRvKCB0aGlzLnVpRGlhbG9nVGl0bGViYXIgKTsKCQl0aGlzLl90aXRsZSggdWlE aWFsb2dUaXRsZSApOwoKCQl0aGlzLnVpRGlhbG9nLmF0dHIoewoJCQkiYXJpYS1s YWJlbGxlZGJ5IjogdWlEaWFsb2dUaXRsZS5hdHRyKCJpZCIpCgkJfSk7Cgl9LAoK CV90aXRsZTogZnVuY3Rpb24oIHRpdGxlICkgewoJCWlmICggIXRoaXMub3B0aW9u cy50aXRsZSApIHsKCQkJdGl0bGUuaHRtbCgiJiMxNjA7Iik7CgkJfQoJCXRpdGxl LnRleHQoIHRoaXMub3B0aW9ucy50aXRsZSApOwoJfSwKCglfY3JlYXRlQnV0dG9u UGFuZTogZnVuY3Rpb24oKSB7CgkJdGhpcy51aURpYWxvZ0J1dHRvblBhbmUgPSAk KCI8ZGl2PiIpCgkJCS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWkt d2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4Iik7CgoJCXRoaXMudWlC dXR0b25TZXQgPSAkKCI8ZGl2PiIpCgkJCS5hZGRDbGFzcygidWktZGlhbG9nLWJ1 dHRvbnNldCIpCgkJCS5hcHBlbmRUbyggdGhpcy51aURpYWxvZ0J1dHRvblBhbmUg KTsKCgkJdGhpcy5fY3JlYXRlQnV0dG9ucygpOwoJfSwKCglfY3JlYXRlQnV0dG9u czogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlidXR0b25zID0g dGhpcy5vcHRpb25zLmJ1dHRvbnM7CgoJCS8vIGlmIHdlIGFscmVhZHkgaGF2ZSBh IGJ1dHRvbiBwYW5lLCByZW1vdmUgaXQKCQl0aGlzLnVpRGlhbG9nQnV0dG9uUGFu ZS5yZW1vdmUoKTsKCQl0aGlzLnVpQnV0dG9uU2V0LmVtcHR5KCk7CgoJCWlmICgg JC5pc0VtcHR5T2JqZWN0KCBidXR0b25zICkgKSB7CgkJCXRoaXMudWlEaWFsb2cu cmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIik7CgkJCXJldHVybjsKCQl9 CgoJCSQuZWFjaCggYnV0dG9ucywgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkgewoJ CQl2YXIgY2xpY2ssIGJ1dHRvbk9wdGlvbnM7CgkJCXByb3BzID0gJC5pc0Z1bmN0 aW9uKCBwcm9wcyApID8KCQkJCXsgY2xpY2s6IHByb3BzLCB0ZXh0OiBuYW1lIH0g OgoJCQkJcHJvcHM7CgkJCS8vIERlZmF1bHQgdG8gYSBub24tc3VibWl0dGluZyBi dXR0b24KCQkJcHJvcHMgPSAkLmV4dGVuZCggeyB0eXBlOiAiYnV0dG9uIiB9LCBw cm9wcyApOwoJCQkvLyBDaGFuZ2UgdGhlIGNvbnRleHQgZm9yIHRoZSBjbGljayBj YWxsYmFjayB0byBiZSB0aGUgbWFpbiBlbGVtZW50CgkJCWNsaWNrID0gcHJvcHMu Y2xpY2s7CgkJCXByb3BzLmNsaWNrID0gZnVuY3Rpb24oKSB7CgkJCQljbGljay5h cHBseSggdGhhdC5lbGVtZW50WzBdLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJYnV0 dG9uT3B0aW9ucyA9IHsKCQkJCWljb25zOiBwcm9wcy5pY29ucywKCQkJCXRleHQ6 IHByb3BzLnNob3dUZXh0CgkJCX07CgkJCWRlbGV0ZSBwcm9wcy5pY29uczsKCQkJ ZGVsZXRlIHByb3BzLnNob3dUZXh0OwoJCQkkKCAiPGJ1dHRvbj48L2J1dHRvbj4i LCBwcm9wcyApCgkJCQkuYnV0dG9uKCBidXR0b25PcHRpb25zICkKCQkJCS5hcHBl bmRUbyggdGhhdC51aUJ1dHRvblNldCApOwoJCX0pOwoJCXRoaXMudWlEaWFsb2cu YWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIik7CgkJdGhpcy51aURpYWxvZ0J1 dHRvblBhbmUuYXBwZW5kVG8oIHRoaXMudWlEaWFsb2cgKTsKCX0sCgoJX21ha2VE cmFnZ2FibGU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0 aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJZnVuY3Rpb24gZmlsdGVyZWRVaSggdWkg KSB7CgkJCXJldHVybiB7CgkJCQlwb3NpdGlvbjogdWkucG9zaXRpb24sCgkJCQlv ZmZzZXQ6IHVpLm9mZnNldAoJCQl9OwoJCX0KCgkJdGhpcy51aURpYWxvZy5kcmFn Z2FibGUoewoJCQljYW5jZWw6ICIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFs b2ctdGl0bGViYXItY2xvc2UiLAoJCQloYW5kbGU6ICIudWktZGlhbG9nLXRpdGxl YmFyIiwKCQkJY29udGFpbm1lbnQ6ICJkb2N1bWVudCIsCgkJCXN0YXJ0OiBmdW5j dGlvbiggZXZlbnQsIHVpICkgewoJCQkJJCggdGhpcyApLmFkZENsYXNzKCJ1aS1k aWFsb2ctZHJhZ2dpbmciKTsKCQkJCXRoYXQuX3RyaWdnZXIoICJkcmFnU3RhcnQi LCBldmVudCwgZmlsdGVyZWRVaSggdWkgKSApOwoJCQl9LAoJCQlkcmFnOiBmdW5j dGlvbiggZXZlbnQsIHVpICkgewoJCQkJdGhhdC5fdHJpZ2dlciggImRyYWciLCBl dmVudCwgZmlsdGVyZWRVaSggdWkgKSApOwoJCQl9LAoJCQlzdG9wOiBmdW5jdGlv biggZXZlbnQsIHVpICkgewoJCQkJb3B0aW9ucy5wb3NpdGlvbiA9IFsKCQkJCQl1 aS5wb3NpdGlvbi5sZWZ0IC0gdGhhdC5kb2N1bWVudC5zY3JvbGxMZWZ0KCksCgkJ CQkJdWkucG9zaXRpb24udG9wIC0gdGhhdC5kb2N1bWVudC5zY3JvbGxUb3AoKQoJ CQkJXTsKCQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdn aW5nIik7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiZHJhZ1N0b3AiLCBldmVudCwgZmls dGVyZWRVaSggdWkgKSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9tYWtlUmVzaXphYmxl OiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0 aGlzLm9wdGlvbnMsCgkJCWhhbmRsZXMgPSBvcHRpb25zLnJlc2l6YWJsZSwKCQkJ Ly8gLnVpLXJlc2l6YWJsZSBoYXMgcG9zaXRpb246IHJlbGF0aXZlIGRlZmluZWQg aW4gdGhlIHN0eWxlc2hlZXQKCQkJLy8gYnV0IGRpYWxvZ3MgaGF2ZSB0byB1c2Ug YWJzb2x1dGUgb3IgZml4ZWQgcG9zaXRpb25pbmcKCQkJcG9zaXRpb24gPSB0aGlz LnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSwKCQkJcmVzaXplSGFuZGxlcyA9IHR5 cGVvZiBoYW5kbGVzID09PSAic3RyaW5nIiA/CgkJCQloYW5kbGVzCToKCQkJCSJu LGUscyx3LHNlLHN3LG5lLG53IjsKCgkJZnVuY3Rpb24gZmlsdGVyZWRVaSggdWkg KSB7CgkJCXJldHVybiB7CgkJCQlvcmlnaW5hbFBvc2l0aW9uOiB1aS5vcmlnaW5h bFBvc2l0aW9uLAoJCQkJb3JpZ2luYWxTaXplOiB1aS5vcmlnaW5hbFNpemUsCgkJ CQlwb3NpdGlvbjogdWkucG9zaXRpb24sCgkJCQlzaXplOiB1aS5zaXplCgkJCX07 CgkJfQoKCQl0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7CgkJCWNhbmNlbDogIi51 aS1kaWFsb2ctY29udGVudCIsCgkJCWNvbnRhaW5tZW50OiAiZG9jdW1lbnQiLAoJ CQlhbHNvUmVzaXplOiB0aGlzLmVsZW1lbnQsCgkJCW1heFdpZHRoOiBvcHRpb25z Lm1heFdpZHRoLAoJCQltYXhIZWlnaHQ6IG9wdGlvbnMubWF4SGVpZ2h0LAoJCQlt aW5XaWR0aDogb3B0aW9ucy5taW5XaWR0aCwKCQkJbWluSGVpZ2h0OiB0aGlzLl9t aW5IZWlnaHQoKSwKCQkJaGFuZGxlczogcmVzaXplSGFuZGxlcywKCQkJc3RhcnQ6 IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkkKCB0aGlzICkuYWRkQ2xhc3Mo InVpLWRpYWxvZy1yZXNpemluZyIpOwoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6 ZVN0YXJ0IiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJfSwKCQkJcmVz aXplOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJdGhhdC5fdHJpZ2dlcigg InJlc2l6ZSIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCXN0 b3A6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQlvcHRpb25zLmhlaWdodCA9 ICQoIHRoaXMgKS5oZWlnaHQoKTsKCQkJCW9wdGlvbnMud2lkdGggPSAkKCB0aGlz ICkud2lkdGgoKTsKCQkJCSQoIHRoaXMgKS5yZW1vdmVDbGFzcygidWktZGlhbG9n LXJlc2l6aW5nIik7CgkJCQl0aGF0Ll90cmlnZ2VyKCAicmVzaXplU3RvcCIsIGV2 ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0KCQl9KQoJCS5jc3MoICJwb3Np dGlvbiIsIHBvc2l0aW9uICk7Cgl9LAoKCV9taW5IZWlnaHQ6IGZ1bmN0aW9uKCkg ewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQlyZXR1cm4gb3B0aW9u cy5oZWlnaHQgPT09ICJhdXRvIiA/CgkJCW9wdGlvbnMubWluSGVpZ2h0IDoKCQkJ TWF0aC5taW4oIG9wdGlvbnMubWluSGVpZ2h0LCBvcHRpb25zLmhlaWdodCApOwoJ fSwKCglfcG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCS8vIE5lZWQgdG8gc2hvdyB0 aGUgZGlhbG9nIHRvIGdldCB0aGUgYWN0dWFsIG9mZnNldCBpbiB0aGUgcG9zaXRp b24gcGx1Z2luCgkJdmFyIGlzVmlzaWJsZSA9IHRoaXMudWlEaWFsb2cuaXMoIjp2 aXNpYmxlIik7CgkJaWYgKCAhaXNWaXNpYmxlICkgewoJCQl0aGlzLnVpRGlhbG9n LnNob3coKTsKCQl9CgkJdGhpcy51aURpYWxvZy5wb3NpdGlvbiggdGhpcy5vcHRp b25zLnBvc2l0aW9uICk7CgkJaWYgKCAhaXNWaXNpYmxlICkgewoJCQl0aGlzLnVp RGlhbG9nLmhpZGUoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb25zOiBmdW5jdGlvbigg b3B0aW9ucyApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXJlc2l6ZSA9IGZhbHNl LAoJCQlyZXNpemFibGVPcHRpb25zID0ge307CgoJCSQuZWFjaCggb3B0aW9ucywg ZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCXRoYXQuX3NldE9wdGlvbigga2V5 LCB2YWx1ZSApOwoKCQkJaWYgKCBrZXkgaW4gc2l6ZVJlbGF0ZWRPcHRpb25zICkg ewoJCQkJcmVzaXplID0gdHJ1ZTsKCQkJfQoJCQlpZiAoIGtleSBpbiByZXNpemFi bGVSZWxhdGVkT3B0aW9ucyApIHsKCQkJCXJlc2l6YWJsZU9wdGlvbnNbIGtleSBd ID0gdmFsdWU7CgkJCX0KCQl9KTsKCgkJaWYgKCByZXNpemUgKSB7CgkJCXRoaXMu X3NpemUoKTsKCQkJdGhpcy5fcG9zaXRpb24oKTsKCQl9CgkJaWYgKCB0aGlzLnVp RGlhbG9nLmlzKCI6ZGF0YSh1aS1yZXNpemFibGUpIikgKSB7CgkJCXRoaXMudWlE aWFsb2cucmVzaXphYmxlKCAib3B0aW9uIiwgcmVzaXphYmxlT3B0aW9ucyApOwoJ CX0KCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJ Lypqc2hpbnQgbWF4Y29tcGxleGl0eToxNSovCgkJdmFyIGlzRHJhZ2dhYmxlLCBp c1Jlc2l6YWJsZSwKCQkJdWlEaWFsb2cgPSB0aGlzLnVpRGlhbG9nOwoKCQlpZiAo IGtleSA9PT0gImRpYWxvZ0NsYXNzIiApIHsKCQkJdWlEaWFsb2cKCQkJCS5yZW1v dmVDbGFzcyggdGhpcy5vcHRpb25zLmRpYWxvZ0NsYXNzICkKCQkJCS5hZGRDbGFz cyggdmFsdWUgKTsKCQl9CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJ CQlyZXR1cm47CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQlp ZiAoIGtleSA9PT0gImFwcGVuZFRvIiApIHsKCQkJdGhpcy51aURpYWxvZy5hcHBl bmRUbyggdGhpcy5fYXBwZW5kVG8oKSApOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJi dXR0b25zIiApIHsKCQkJdGhpcy5fY3JlYXRlQnV0dG9ucygpOwoJCX0KCgkJaWYg KCBrZXkgPT09ICJjbG9zZVRleHQiICkgewoJCQl0aGlzLnVpRGlhbG9nVGl0bGVi YXJDbG9zZS5idXR0b24oewoJCQkJLy8gRW5zdXJlIHRoYXQgd2UgYWx3YXlzIHBh c3MgYSBzdHJpbmcKCQkJCWxhYmVsOiAiIiArIHZhbHVlCgkJCX0pOwoJCX0KCgkJ aWYgKCBrZXkgPT09ICJkcmFnZ2FibGUiICkgewoJCQlpc0RyYWdnYWJsZSA9IHVp RGlhbG9nLmlzKCI6ZGF0YSh1aS1kcmFnZ2FibGUpIik7CgkJCWlmICggaXNEcmFn Z2FibGUgJiYgIXZhbHVlICkgewoJCQkJdWlEaWFsb2cuZHJhZ2dhYmxlKCJkZXN0 cm95Iik7CgkJCX0KCgkJCWlmICggIWlzRHJhZ2dhYmxlICYmIHZhbHVlICkgewoJ CQkJdGhpcy5fbWFrZURyYWdnYWJsZSgpOwoJCQl9CgkJfQoKCQlpZiAoIGtleSA9 PT0gInBvc2l0aW9uIiApIHsKCQkJdGhpcy5fcG9zaXRpb24oKTsKCQl9CgoJCWlm ICgga2V5ID09PSAicmVzaXphYmxlIiApIHsKCQkJLy8gY3VycmVudGx5IHJlc2l6 YWJsZSwgYmVjb21pbmcgbm9uLXJlc2l6YWJsZQoJCQlpc1Jlc2l6YWJsZSA9IHVp RGlhbG9nLmlzKCI6ZGF0YSh1aS1yZXNpemFibGUpIik7CgkJCWlmICggaXNSZXNp emFibGUgJiYgIXZhbHVlICkgewoJCQkJdWlEaWFsb2cucmVzaXphYmxlKCJkZXN0 cm95Iik7CgkJCX0KCgkJCS8vIGN1cnJlbnRseSByZXNpemFibGUsIGNoYW5naW5n IGhhbmRsZXMKCQkJaWYgKCBpc1Jlc2l6YWJsZSAmJiB0eXBlb2YgdmFsdWUgPT09 ICJzdHJpbmciICkgewoJCQkJdWlEaWFsb2cucmVzaXphYmxlKCAib3B0aW9uIiwg ImhhbmRsZXMiLCB2YWx1ZSApOwoJCQl9CgoJCQkvLyBjdXJyZW50bHkgbm9uLXJl c2l6YWJsZSwgYmVjb21pbmcgcmVzaXphYmxlCgkJCWlmICggIWlzUmVzaXphYmxl ICYmIHZhbHVlICE9PSBmYWxzZSApIHsKCQkJCXRoaXMuX21ha2VSZXNpemFibGUo KTsKCQkJfQoJCX0KCgkJaWYgKCBrZXkgPT09ICJ0aXRsZSIgKSB7CgkJCXRoaXMu X3RpdGxlKCB0aGlzLnVpRGlhbG9nVGl0bGViYXIuZmluZCgiLnVpLWRpYWxvZy10 aXRsZSIpICk7CgkJfQoJfSwKCglfc2l6ZTogZnVuY3Rpb24oKSB7CgkJLy8gSWYg dGhlIHVzZXIgaGFzIHJlc2l6ZWQgdGhlIGRpYWxvZywgdGhlIC51aS1kaWFsb2cg YW5kIC51aS1kaWFsb2ctY29udGVudAoJCS8vIGRpdnMgd2lsbCBib3RoIGhhdmUg d2lkdGggYW5kIGhlaWdodCBzZXQsIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlbQoJ CXZhciBub25Db250ZW50SGVpZ2h0LCBtaW5Db250ZW50SGVpZ2h0LCBtYXhDb250 ZW50SGVpZ2h0LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQkvLyBSZXNl dCBjb250ZW50IHNpemluZwoJCXRoaXMuZWxlbWVudC5zaG93KCkuY3NzKHsKCQkJ d2lkdGg6ICJhdXRvIiwKCQkJbWluSGVpZ2h0OiAwLAoJCQltYXhIZWlnaHQ6ICJu b25lIiwKCQkJaGVpZ2h0OiAwCgkJfSk7CgoJCWlmICggb3B0aW9ucy5taW5XaWR0 aCA+IG9wdGlvbnMud2lkdGggKSB7CgkJCW9wdGlvbnMud2lkdGggPSBvcHRpb25z Lm1pbldpZHRoOwoJCX0KCgkJLy8gcmVzZXQgd3JhcHBlciBzaXppbmcKCQkvLyBk ZXRlcm1pbmUgdGhlIGhlaWdodCBvZiBhbGwgdGhlIG5vbi1jb250ZW50IGVsZW1l bnRzCgkJbm9uQ29udGVudEhlaWdodCA9IHRoaXMudWlEaWFsb2cuY3NzKHsKCQkJ CWhlaWdodDogImF1dG8iLAoJCQkJd2lkdGg6IG9wdGlvbnMud2lkdGgKCQkJfSkK CQkJLm91dGVySGVpZ2h0KCk7CgkJbWluQ29udGVudEhlaWdodCA9IE1hdGgubWF4 KCAwLCBvcHRpb25zLm1pbkhlaWdodCAtIG5vbkNvbnRlbnRIZWlnaHQgKTsKCQlt YXhDb250ZW50SGVpZ2h0ID0gdHlwZW9mIG9wdGlvbnMubWF4SGVpZ2h0ID09PSAi bnVtYmVyIiA/CgkJCU1hdGgubWF4KCAwLCBvcHRpb25zLm1heEhlaWdodCAtIG5v bkNvbnRlbnRIZWlnaHQgKSA6CgkJCSJub25lIjsKCgkJaWYgKCBvcHRpb25zLmhl aWdodCA9PT0gImF1dG8iICkgewoJCQl0aGlzLmVsZW1lbnQuY3NzKHsKCQkJCW1p bkhlaWdodDogbWluQ29udGVudEhlaWdodCwKCQkJCW1heEhlaWdodDogbWF4Q29u dGVudEhlaWdodCwKCQkJCWhlaWdodDogImF1dG8iCgkJCX0pOwoJCX0gZWxzZSB7 CgkJCXRoaXMuZWxlbWVudC5oZWlnaHQoIE1hdGgubWF4KCAwLCBvcHRpb25zLmhl aWdodCAtIG5vbkNvbnRlbnRIZWlnaHQgKSApOwoJCX0KCgkJaWYgKHRoaXMudWlE aWFsb2cuaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSApIHsKCQkJdGhpcy51aURp YWxvZy5yZXNpemFibGUoICJvcHRpb24iLCAibWluSGVpZ2h0IiwgdGhpcy5fbWlu SGVpZ2h0KCkgKTsKCQl9Cgl9LAoKCV9jcmVhdGVPdmVybGF5OiBmdW5jdGlvbigp IHsKCQlpZiAoICF0aGlzLm9wdGlvbnMubW9kYWwgKSB7CgkJCXJldHVybjsKCQl9 CgoJCWlmICggISQudWkuZGlhbG9nLm92ZXJsYXlJbnN0YW5jZXMgKSB7CgkJCS8v IFByZXZlbnQgdXNlIG9mIGFuY2hvcnMgYW5kIGlucHV0cy4KCQkJLy8gV2UgdXNl IGEgZGVsYXkgaW4gY2FzZSB0aGUgb3ZlcmxheSBpcyBjcmVhdGVkIGZyb20gYW4K CQkJLy8gZXZlbnQgdGhhdCB3ZSdyZSBnb2luZyB0byBiZSBjYW5jZWxsaW5nLiAo IzI4MDQpCgkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJLy8gSGFuZGxl IC5kaWFsb2coKS5kaWFsb2coImNsb3NlIikgKCM0MDY1KQoJCQkJaWYgKCAkLnVp LmRpYWxvZy5vdmVybGF5SW5zdGFuY2VzICkgewoJCQkJCXRoaXMuX29uKCB0aGlz LmRvY3VtZW50LCB7CgkJCQkJCWZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHsK CQkJCQkJCWlmICggISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIi51aS1kaWFs b2ciKS5sZW5ndGggKSB7CgkJCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsK CQkJCQkJCQkkKCIudWktZGlhbG9nOnZpc2libGU6bGFzdCAudWktZGlhbG9nLWNv bnRlbnQiKQoJCQkJCQkJCQkuZGF0YSgidWktZGlhbG9nIikuX2ZvY3VzVGFiYmFi bGUoKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0pOwoJCQkJfQoJCQl9KTsKCQl9 CgoJCXRoaXMub3ZlcmxheSA9ICQoIjxkaXY+IikKCQkJLmFkZENsYXNzKCJ1aS13 aWRnZXQtb3ZlcmxheSB1aS1mcm9udCIpCgkJCS5hcHBlbmRUbyggdGhpcy5kb2N1 bWVudFswXS5ib2R5ICk7CgkJdGhpcy5fb24oIHRoaXMub3ZlcmxheSwgewoJCQlt b3VzZWRvd246ICJfa2VlcEZvY3VzIgoJCX0pOwoJCSQudWkuZGlhbG9nLm92ZXJs YXlJbnN0YW5jZXMrKzsKCX0sCgoJX2Rlc3Ryb3lPdmVybGF5OiBmdW5jdGlvbigp IHsKCQlpZiAoICF0aGlzLm9wdGlvbnMubW9kYWwgKSB7CgkJCXJldHVybjsKCQl9 CgoJCSQudWkuZGlhbG9nLm92ZXJsYXlJbnN0YW5jZXMtLTsKCQlpZiAoICEkLnVp LmRpYWxvZy5vdmVybGF5SW5zdGFuY2VzICkgewoJCQl0aGlzLl9vZmYoIHRoaXMu ZG9jdW1lbnQsICJmb2N1c2luIiApOwoJCX0KCQl0aGlzLm92ZXJsYXkucmVtb3Zl KCk7Cgl9Cn0pOwoKJC51aS5kaWFsb2cub3ZlcmxheUluc3RhbmNlcyA9IDA7Cgov LyBERVBSRUNBVEVECmlmICggJC51aUJhY2tDb21wYXQgIT09IGZhbHNlICkgewoJ Ly8gcG9zaXRpb24gb3B0aW9uIHdpdGggYXJyYXkgbm90YXRpb24KCS8vIGp1c3Qg b3ZlcnJpZGUgd2l0aCBvbGQgaW1wbGVtZW50YXRpb24KCSQud2lkZ2V0KCAidWku ZGlhbG9nIiwgJC51aS5kaWFsb2csIHsKCQlfcG9zaXRpb246IGZ1bmN0aW9uKCkg ewoJCQl2YXIgcG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb24sCgkJCQlt eUF0ID0gW10sCgkJCQlvZmZzZXQgPSBbIDAsIDAgXSwKCQkJCWlzVmlzaWJsZTsK CgkJCWlmICggcG9zaXRpb24gKSB7CgkJCQlpZiAoIHR5cGVvZiBwb3NpdGlvbiA9 PT0gInN0cmluZyIgfHwgKHR5cGVvZiBwb3NpdGlvbiA9PT0gIm9iamVjdCIgJiYg IjAiIGluIHBvc2l0aW9uICkgKSB7CgkJCQkJbXlBdCA9IHBvc2l0aW9uLnNwbGl0 ID8gcG9zaXRpb24uc3BsaXQoIiAiKSA6IFsgcG9zaXRpb25bMF0sIHBvc2l0aW9u WzFdIF07CgkJCQkJaWYgKCBteUF0Lmxlbmd0aCA9PT0gMSApIHsKCQkJCQkJbXlB dFsxXSA9IG15QXRbMF07CgkJCQkJfQoKCQkJCQkkLmVhY2goIFsgImxlZnQiLCAi dG9wIiBdLCBmdW5jdGlvbiggaSwgb2Zmc2V0UG9zaXRpb24gKSB7CgkJCQkJCWlm ICggK215QXRbIGkgXSA9PT0gbXlBdFsgaSBdICkgewoJCQkJCQkJb2Zmc2V0WyBp IF0gPSBteUF0WyBpIF07CgkJCQkJCQlteUF0WyBpIF0gPSBvZmZzZXRQb3NpdGlv bjsKCQkJCQkJfQoJCQkJCX0pOwoKCQkJCQlwb3NpdGlvbiA9IHsKCQkJCQkJbXk6 IG15QXRbMF0gKyAob2Zmc2V0WzBdIDwgMCA/IG9mZnNldFswXSA6ICIrIiArIG9m ZnNldFswXSkgKyAiICIgKwoJCQkJCQkJbXlBdFsxXSArIChvZmZzZXRbMV0gPCAw ID8gb2Zmc2V0WzFdIDogIisiICsgb2Zmc2V0WzFdKSwKCQkJCQkJYXQ6IG15QXQu am9pbigiICIpCgkJCQkJfTsKCQkJCX0KCgkJCQlwb3NpdGlvbiA9ICQuZXh0ZW5k KCB7fSwgJC51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb24sIHBv c2l0aW9uICk7CgkJCX0gZWxzZSB7CgkJCQlwb3NpdGlvbiA9ICQudWkuZGlhbG9n LnByb3RvdHlwZS5vcHRpb25zLnBvc2l0aW9uOwoJCQl9CgoJCQkvLyBuZWVkIHRv IHNob3cgdGhlIGRpYWxvZyB0byBnZXQgdGhlIGFjdHVhbCBvZmZzZXQgaW4gdGhl IHBvc2l0aW9uIHBsdWdpbgoJCQlpc1Zpc2libGUgPSB0aGlzLnVpRGlhbG9nLmlz KCI6dmlzaWJsZSIpOwoJCQlpZiAoICFpc1Zpc2libGUgKSB7CgkJCQl0aGlzLnVp RGlhbG9nLnNob3coKTsKCQkJfQoJCQl0aGlzLnVpRGlhbG9nLnBvc2l0aW9uKCBw b3NpdGlvbiApOwoJCQlpZiAoICFpc1Zpc2libGUgKSB7CgkJCQl0aGlzLnVpRGlh bG9nLmhpZGUoKTsKCQkJfQoJCX0KCX0pOwp9Cgp9KCBqUXVlcnkgKSApOwoKKGZ1 bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgcnZlcnRpY2FsID0gL3VwfGRv d258dmVydGljYWwvLAoJcnBvc2l0aXZlbW90aW9uID0gL3VwfGxlZnR8dmVydGlj YWx8aG9yaXpvbnRhbC87CgokLmVmZmVjdHMuZWZmZWN0LmJsaW5kID0gZnVuY3Rp b24oIG8sIGRvbmUgKSB7CgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0gJCgg dGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIs ICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2RlID0g JC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImhpZGUiICksCgkJZGly ZWN0aW9uID0gby5kaXJlY3Rpb24gfHwgInVwIiwKCQl2ZXJ0aWNhbCA9IHJ2ZXJ0 aWNhbC50ZXN0KCBkaXJlY3Rpb24gKSwKCQlyZWYgPSB2ZXJ0aWNhbCA/ICJoZWln aHQiIDogIndpZHRoIiwKCQlyZWYyID0gdmVydGljYWwgPyAidG9wIiA6ICJsZWZ0 IiwKCQltb3Rpb24gPSBycG9zaXRpdmVtb3Rpb24udGVzdCggZGlyZWN0aW9uICks CgkJYW5pbWF0aW9uID0ge30sCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQl3 cmFwcGVyLCBkaXN0YW5jZSwgbWFyZ2luOwoKCS8vIGlmIGFscmVhZHkgd3JhcHBl ZCwgdGhlIHdyYXBwZXIncyBwcm9wZXJ0aWVzIGFyZSBteSBwcm9wZXJ0eS4gIzYy NDUKCWlmICggZWwucGFyZW50KCkuaXMoICIudWktZWZmZWN0cy13cmFwcGVyIiAp ICkgewoJCSQuZWZmZWN0cy5zYXZlKCBlbC5wYXJlbnQoKSwgcHJvcHMgKTsKCX0g ZWxzZSB7CgkJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJfQoJZWwuc2hv dygpOwoJd3JhcHBlciA9ICQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApLmNz cyh7CgkJb3ZlcmZsb3c6ICJoaWRkZW4iCgl9KTsKCglkaXN0YW5jZSA9IHdyYXBw ZXJbIHJlZiBdKCk7CgltYXJnaW4gPSBwYXJzZUZsb2F0KCB3cmFwcGVyLmNzcygg cmVmMiApICkgfHwgMDsKCglhbmltYXRpb25bIHJlZiBdID0gc2hvdyA/IGRpc3Rh bmNlIDogMDsKCWlmICggIW1vdGlvbiApIHsKCQllbAoJCQkuY3NzKCB2ZXJ0aWNh bCA/ICJib3R0b20iIDogInJpZ2h0IiwgMCApCgkJCS5jc3MoIHZlcnRpY2FsID8g InRvcCIgOiAibGVmdCIsICJhdXRvIiApCgkJCS5jc3MoeyBwb3NpdGlvbjogImFi c29sdXRlIiB9KTsKCgkJYW5pbWF0aW9uWyByZWYyIF0gPSBzaG93ID8gbWFyZ2lu IDogZGlzdGFuY2UgKyBtYXJnaW47Cgl9CgoJLy8gc3RhcnQgYXQgMCBpZiB3ZSBh cmUgc2hvd2luZwoJaWYgKCBzaG93ICkgewoJCXdyYXBwZXIuY3NzKCByZWYsIDAg KTsKCQlpZiAoICEgbW90aW9uICkgewoJCQl3cmFwcGVyLmNzcyggcmVmMiwgbWFy Z2luICsgZGlzdGFuY2UgKTsKCQl9Cgl9CgoJLy8gQW5pbWF0ZQoJd3JhcHBlci5h bmltYXRlKCBhbmltYXRpb24sIHsKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQll YXNpbmc6IG8uZWFzaW5nLAoJCXF1ZXVlOiBmYWxzZSwKCQljb21wbGV0ZTogZnVu Y3Rpb24oKSB7CgkJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJZWwuaGlk ZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkJ JC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJCWRvbmUoKTsKCQl9Cgl9 KTsKCn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7 CgokLmVmZmVjdHMuZWZmZWN0LmJvdW5jZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkg ewoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAi dG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0 aCIgXSwKCgkJLy8gZGVmYXVsdHM6CgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2Rl KCBlbCwgby5tb2RlIHx8ICJlZmZlY3QiICksCgkJaGlkZSA9IG1vZGUgPT09ICJo aWRlIiwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8u ZGlyZWN0aW9uIHx8ICJ1cCIsCgkJZGlzdGFuY2UgPSBvLmRpc3RhbmNlLAoJCXRp bWVzID0gby50aW1lcyB8fCA1LAoKCQkvLyBudW1iZXIgb2YgaW50ZXJuYWwgYW5p bWF0aW9ucwoJCWFuaW1zID0gdGltZXMgKiAyICsgKCBzaG93IHx8IGhpZGUgPyAx IDogMCApLAoJCXNwZWVkID0gby5kdXJhdGlvbiAvIGFuaW1zLAoJCWVhc2luZyA9 IG8uZWFzaW5nLAoKCQkvLyB1dGlsaXR5OgoJCXJlZiA9ICggZGlyZWN0aW9uID09 PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImRvd24iICkgPyAidG9wIiA6ICJsZWZ0 IiwKCQltb3Rpb24gPSAoIGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24g PT09ICJsZWZ0IiApLAoJCWksCgkJdXBBbmltLAoJCWRvd25BbmltLAoKCQkvLyB3 ZSB3aWxsIG5lZWQgdG8gcmUtYXNzZW1ibGUgdGhlIHF1ZXVlIHRvIHN0YWNrIG91 ciBhbmltYXRpb25zIGluIHBsYWNlCgkJcXVldWUgPSBlbC5xdWV1ZSgpLAoJCXF1 ZXVlbGVuID0gcXVldWUubGVuZ3RoOwoKCS8vIEF2b2lkIHRvdWNoaW5nIG9wYWNp dHkgdG8gcHJldmVudCBjbGVhclR5cGUgYW5kIFBORyBpc3N1ZXMgaW4gSUUKCWlm ICggc2hvdyB8fCBoaWRlICkgewoJCXByb3BzLnB1c2goICJvcGFjaXR5IiApOwoJ fQoKCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCSQu ZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApOyAvLyBDcmVhdGUgV3JhcHBlcgoK CS8vIGRlZmF1bHQgZGlzdGFuY2UgZm9yIHRoZSBCSUdHRVNUIGJvdW5jZSBpcyB0 aGUgb3V0ZXIgRGlzdGFuY2UgLyAzCglpZiAoICFkaXN0YW5jZSApIHsKCQlkaXN0 YW5jZSA9IGVsWyByZWYgPT09ICJ0b3AiID8gIm91dGVySGVpZ2h0IiA6ICJvdXRl cldpZHRoIiBdKCkgLyAzOwoJfQoKCWlmICggc2hvdyApIHsKCQlkb3duQW5pbSA9 IHsgb3BhY2l0eTogMSB9OwoJCWRvd25BbmltWyByZWYgXSA9IDA7CgoJCS8vIGlm IHdlIGFyZSBzaG93aW5nLCBmb3JjZSBvcGFjaXR5IDAgYW5kIHNldCB0aGUgaW5p dGlhbCBwb3NpdGlvbgoJCS8vIHRoZW4gZG8gdGhlICJmaXJzdCIgYW5pbWF0aW9u CgkJZWwuY3NzKCAib3BhY2l0eSIsIDAgKQoJCQkuY3NzKCByZWYsIG1vdGlvbiA/ IC1kaXN0YW5jZSAqIDIgOiBkaXN0YW5jZSAqIDIgKQoJCQkuYW5pbWF0ZSggZG93 bkFuaW0sIHNwZWVkLCBlYXNpbmcgKTsKCX0KCgkvLyBzdGFydCBhdCB0aGUgc21h bGxlc3QgZGlzdGFuY2UgaWYgd2UgYXJlIGhpZGluZwoJaWYgKCBoaWRlICkgewoJ CWRpc3RhbmNlID0gZGlzdGFuY2UgLyBNYXRoLnBvdyggMiwgdGltZXMgLSAxICk7 Cgl9CgoJZG93bkFuaW0gPSB7fTsKCWRvd25BbmltWyByZWYgXSA9IDA7CgkvLyBC b3VuY2VzIHVwL2Rvd24vbGVmdC9yaWdodCB0aGVuIGJhY2sgdG8gMCAtLSB0aW1l cyAqIDIgYW5pbWF0aW9ucyBoYXBwZW4gaGVyZQoJZm9yICggaSA9IDA7IGkgPCB0 aW1lczsgaSsrICkgewoJCXVwQW5pbSA9IHt9OwoJCXVwQW5pbVsgcmVmIF0gPSAo IG1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZTsKCgkJZWwuYW5pbWF0 ZSggdXBBbmltLCBzcGVlZCwgZWFzaW5nICkKCQkJLmFuaW1hdGUoIGRvd25Bbmlt LCBzcGVlZCwgZWFzaW5nICk7CgoJCWRpc3RhbmNlID0gaGlkZSA/IGRpc3RhbmNl ICogMiA6IGRpc3RhbmNlIC8gMjsKCX0KCgkvLyBMYXN0IEJvdW5jZSB3aGVuIEhp ZGluZwoJaWYgKCBoaWRlICkgewoJCXVwQW5pbSA9IHsgb3BhY2l0eTogMCB9OwoJ CXVwQW5pbVsgcmVmIF0gPSAoIG1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0 YW5jZTsKCgkJZWwuYW5pbWF0ZSggdXBBbmltLCBzcGVlZCwgZWFzaW5nICk7Cgl9 CgoJZWwucXVldWUoZnVuY3Rpb24oKSB7CgkJaWYgKCBoaWRlICkgewoJCQllbC5o aWRlKCk7CgkJfQoJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkk LmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQlkb25lKCk7Cgl9KTsKCgkv LyBpbmplY3QgYWxsIHRoZSBhbmltYXRpb25zIHdlIGp1c3QgcXVldWVkIHRvIGJl IGZpcnN0IGluIGxpbmUgKGFmdGVyICJpbnByb2dyZXNzIikKCWlmICggcXVldWVs ZW4gPiAxKSB7CgkJcXVldWUuc3BsaWNlLmFwcGx5KCBxdWV1ZSwKCQkJWyAxLCAw IF0uY29uY2F0KCBxdWV1ZS5zcGxpY2UoIHF1ZXVlbGVuLCBhbmltcyArIDEgKSAp ICk7Cgl9CgllbC5kZXF1ZXVlKCk7Cgp9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlv biggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5jbGlwID0gZnVu Y3Rpb24oIG8sIGRvbmUgKSB7CgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0g JCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRv bSIsICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2Rl ID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImhpZGUiICksCgkJ c2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlv biB8fCAidmVydGljYWwiLAoJCXZlcnQgPSBkaXJlY3Rpb24gPT09ICJ2ZXJ0aWNh bCIsCgkJc2l6ZSA9IHZlcnQgPyAiaGVpZ2h0IiA6ICJ3aWR0aCIsCgkJcG9zaXRp b24gPSB2ZXJ0ID8gInRvcCIgOiAibGVmdCIsCgkJYW5pbWF0aW9uID0ge30sCgkJ d3JhcHBlciwgYW5pbWF0ZSwgZGlzdGFuY2U7CgoJLy8gU2F2ZSAmIFNob3cKCSQu ZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCgkvLyBDcmVh dGUgV3JhcHBlcgoJd3JhcHBlciA9ICQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBl bCApLmNzcyh7CgkJb3ZlcmZsb3c6ICJoaWRkZW4iCgl9KTsKCWFuaW1hdGUgPSAo IGVsWzBdLnRhZ05hbWUgPT09ICJJTUciICkgPyB3cmFwcGVyIDogZWw7CglkaXN0 YW5jZSA9IGFuaW1hdGVbIHNpemUgXSgpOwoKCS8vIFNoaWZ0CglpZiAoIHNob3cg KSB7CgkJYW5pbWF0ZS5jc3MoIHNpemUsIDAgKTsKCQlhbmltYXRlLmNzcyggcG9z aXRpb24sIGRpc3RhbmNlIC8gMiApOwoJfQoKCS8vIENyZWF0ZSBBbmltYXRpb24g T2JqZWN0OgoJYW5pbWF0aW9uWyBzaXplIF0gPSBzaG93ID8gZGlzdGFuY2UgOiAw OwoJYW5pbWF0aW9uWyBwb3NpdGlvbiBdID0gc2hvdyA/IDAgOiBkaXN0YW5jZSAv IDI7CgoJLy8gQW5pbWF0ZQoJYW5pbWF0ZS5hbmltYXRlKCBhbmltYXRpb24sIHsK CQlxdWV1ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5n OiBvLmVhc2luZywKCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCWlmICggIXNo b3cgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUo IGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsK CQkJZG9uZSgpOwoJCX0KCX0pOwoKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24o ICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QuZHJvcCA9IGZ1bmN0 aW9uKCBvLCBkb25lICkgewoKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9 IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIs ICJvcGFjaXR5IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2RlID0gJC5lZmZl Y3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImhpZGUiICksCgkJc2hvdyA9IG1v ZGUgPT09ICJzaG93IiwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAibGVm dCIsCgkJcmVmID0gKCBkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09 PSAiZG93biIgKSA/ICJ0b3AiIDogImxlZnQiLAoJCW1vdGlvbiA9ICggZGlyZWN0 aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImxlZnQiICkgPyAicG9zIiA6 ICJuZWciLAoJCWFuaW1hdGlvbiA9IHsKCQkJb3BhY2l0eTogc2hvdyA/IDEgOiAw CgkJfSwKCQlkaXN0YW5jZTsKCgkvLyBBZGp1c3QKCSQuZWZmZWN0cy5zYXZlKCBl bCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCSQuZWZmZWN0cy5jcmVhdGVXcmFwcGVy KCBlbCApOwoKCWRpc3RhbmNlID0gby5kaXN0YW5jZSB8fCBlbFsgcmVmID09PSAi dG9wIiA/ICJvdXRlckhlaWdodCI6ICJvdXRlcldpZHRoIiBdKCB0cnVlICkgLyAy OwoKCWlmICggc2hvdyApIHsKCQllbAoJCQkuY3NzKCAib3BhY2l0eSIsIDAgKQoJ CQkuY3NzKCByZWYsIG1vdGlvbiA9PT0gInBvcyIgPyAtZGlzdGFuY2UgOiBkaXN0 YW5jZSApOwoJfQoKCS8vIEFuaW1hdGlvbgoJYW5pbWF0aW9uWyByZWYgXSA9ICgg c2hvdyA/CgkJKCBtb3Rpb24gPT09ICJwb3MiID8gIis9IiA6ICItPSIgKSA6CgkJ KCBtb3Rpb24gPT09ICJwb3MiID8gIi09IiA6ICIrPSIgKSApICsKCQlkaXN0YW5j ZTsKCgkvLyBBbmltYXRlCgllbC5hbmltYXRlKCBhbmltYXRpb24sIHsKCQlxdWV1 ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVh c2luZywKCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCWlmICggbW9kZSA9PT0g ImhpZGUiICkgewoJCQkJZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0 b3JlKCBlbCwgcHJvcHMgKTsKCQkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVs ICk7CgkJCWRvbmUoKTsKCQl9Cgl9KTsKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rp b24oICQsIHVuZGVmaW5lZCApIHsKCiQuZWZmZWN0cy5lZmZlY3QuZXhwbG9kZSA9 IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCXZhciByb3dzID0gby5waWVjZXMgPyBN YXRoLnJvdW5kKCBNYXRoLnNxcnQoIG8ucGllY2VzICkgKSA6IDMsCgkJY2VsbHMg PSByb3dzLAoJCWVsID0gJCggdGhpcyApLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0 TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0g InNob3ciLAoKCQkvLyBzaG93IGFuZCB0aGVuIHZpc2liaWxpdHk6aGlkZGVuIHRo ZSBlbGVtZW50IGJlZm9yZSBjYWxjdWxhdGluZyBvZmZzZXQKCQlvZmZzZXQgPSBl bC5zaG93KCkuY3NzKCAidmlzaWJpbGl0eSIsICJoaWRkZW4iICkub2Zmc2V0KCks CgoJCS8vIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBwaWVjZQoJCXdpZHRoID0gTWF0 aC5jZWlsKCBlbC5vdXRlcldpZHRoKCkgLyBjZWxscyApLAoJCWhlaWdodCA9IE1h dGguY2VpbCggZWwub3V0ZXJIZWlnaHQoKSAvIHJvd3MgKSwKCQlwaWVjZXMgPSBb XSwKCgkJLy8gbG9vcAoJCWksIGosIGxlZnQsIHRvcCwgbXgsIG15OwoKCS8vIGNo aWxkcmVuIGFuaW1hdGUgY29tcGxldGU6CglmdW5jdGlvbiBjaGlsZENvbXBsZXRl KCkgewoJCXBpZWNlcy5wdXNoKCB0aGlzICk7CgkJaWYgKCBwaWVjZXMubGVuZ3Ro ID09PSByb3dzICogY2VsbHMgKSB7CgkJCWFuaW1Db21wbGV0ZSgpOwoJCX0KCX0K CgkvLyBjbG9uZSB0aGUgZWxlbWVudCBmb3IgZWFjaCByb3cgYW5kIGNlbGwuCglm b3IoIGkgPSAwOyBpIDwgcm93cyA7IGkrKyApIHsgLy8gPT09PgoJCXRvcCA9IG9m ZnNldC50b3AgKyBpICogaGVpZ2h0OwoJCW15ID0gaSAtICggcm93cyAtIDEgKSAv IDIgOwoKCQlmb3IoIGogPSAwOyBqIDwgY2VsbHMgOyBqKysgKSB7IC8vIHx8fAoJ CQlsZWZ0ID0gb2Zmc2V0LmxlZnQgKyBqICogd2lkdGg7CgkJCW14ID0gaiAtICgg Y2VsbHMgLSAxICkgLyAyIDsKCgkJCS8vIENyZWF0ZSBhIGNsb25lIG9mIHRoZSBu b3cgaGlkZGVuIG1haW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgYWJzb2x1dGUgcG9z aXRpb25lZAoJCQkvLyB3aXRoaW4gYSB3cmFwcGVyIGRpdiBvZmYgdGhlIC1sZWZ0 IGFuZCAtdG9wIGVxdWFsIHRvIHNpemUgb2Ygb3VyIHBpZWNlcwoJCQllbAoJCQkJ LmNsb25lKCkKCQkJCS5hcHBlbmRUbyggImJvZHkiICkKCQkJCS53cmFwKCAiPGRp dj48L2Rpdj4iICkKCQkJCS5jc3MoewoJCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUi LAoJCQkJCXZpc2liaWxpdHk6ICJ2aXNpYmxlIiwKCQkJCQlsZWZ0OiAtaiAqIHdp ZHRoLAoJCQkJCXRvcDogLWkgKiBoZWlnaHQKCQkJCX0pCgoJCQkvLyBzZWxlY3Qg dGhlIHdyYXBwZXIgLSBtYWtlIGl0IG92ZXJmbG93OiBoaWRkZW4gYW5kIGFic29s dXRlIHBvc2l0aW9uZWQgYmFzZWQgb24KCQkJLy8gd2hlcmUgdGhlIG9yaWdpbmFs IHdhcyBsb2NhdGVkICtsZWZ0IGFuZCArdG9wIGVxdWFsIHRvIHRoZSBzaXplIG9m IHBpZWNlcwoJCQkJLnBhcmVudCgpCgkJCQkuYWRkQ2xhc3MoICJ1aS1lZmZlY3Rz LWV4cGxvZGUiICkKCQkJCS5jc3MoewoJCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUi LAoJCQkJCW92ZXJmbG93OiAiaGlkZGVuIiwKCQkJCQl3aWR0aDogd2lkdGgsCgkJ CQkJaGVpZ2h0OiBoZWlnaHQsCgkJCQkJbGVmdDogbGVmdCArICggc2hvdyA/IG14 ICogd2lkdGggOiAwICksCgkJCQkJdG9wOiB0b3AgKyAoIHNob3cgPyBteSAqIGhl aWdodCA6IDAgKSwKCQkJCQlvcGFjaXR5OiBzaG93ID8gMCA6IDEKCQkJCX0pLmFu aW1hdGUoewoJCQkJCWxlZnQ6IGxlZnQgKyAoIHNob3cgPyAwIDogbXggKiB3aWR0 aCApLAoJCQkJCXRvcDogdG9wICsgKCBzaG93ID8gMCA6IG15ICogaGVpZ2h0ICks CgkJCQkJb3BhY2l0eTogc2hvdyA/IDEgOiAwCgkJCQl9LCBvLmR1cmF0aW9uIHx8 IDUwMCwgby5lYXNpbmcsIGNoaWxkQ29tcGxldGUgKTsKCQl9Cgl9CgoJZnVuY3Rp b24gYW5pbUNvbXBsZXRlKCkgewoJCWVsLmNzcyh7CgkJCXZpc2liaWxpdHk6ICJ2 aXNpYmxlIgoJCX0pOwoJCSQoIHBpZWNlcyApLnJlbW92ZSgpOwoJCWlmICggIXNo b3cgKSB7CgkJCWVsLmhpZGUoKTsKCQl9CgkJZG9uZSgpOwoJfQp9OwoKfSkoalF1 ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVm ZmVjdC5mYWRlID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7Cgl2YXIgZWwgPSAkKCB0 aGlzICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8 ICJ0b2dnbGUiICk7CgoJZWwuYW5pbWF0ZSh7CgkJb3BhY2l0eTogbW9kZQoJfSwg ewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNp bmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBkb25lCgl9KTsKfTsKCn0pKCBqUXVl cnkgKTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVm ZmVjdC5mb2xkID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJLy8gQ3JlYXRlIGVs ZW1lbnQKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9u IiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAi d2lkdGgiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2Rl IHx8ICJoaWRlIiApLAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgkJaGlkZSA9 IG1vZGUgPT09ICJoaWRlIiwKCQlzaXplID0gby5zaXplIHx8IDE1LAoJCXBlcmNl bnQgPSAvKFswLTldKyklLy5leGVjKCBzaXplICksCgkJaG9yaXpGaXJzdCA9ICEh by5ob3JpekZpcnN0LAoJCXdpZHRoRmlyc3QgPSBzaG93ICE9PSBob3JpekZpcnN0 LAoJCXJlZiA9IHdpZHRoRmlyc3QgPyBbICJ3aWR0aCIsICJoZWlnaHQiIF0gOiBb ICJoZWlnaHQiLCAid2lkdGgiIF0sCgkJZHVyYXRpb24gPSBvLmR1cmF0aW9uIC8g MiwKCQl3cmFwcGVyLCBkaXN0YW5jZSwKCQlhbmltYXRpb24xID0ge30sCgkJYW5p bWF0aW9uMiA9IHt9OwoKCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCWVs LnNob3coKTsKCgkvLyBDcmVhdGUgV3JhcHBlcgoJd3JhcHBlciA9ICQuZWZmZWN0 cy5jcmVhdGVXcmFwcGVyKCBlbCApLmNzcyh7CgkJb3ZlcmZsb3c6ICJoaWRkZW4i Cgl9KTsKCWRpc3RhbmNlID0gd2lkdGhGaXJzdCA/CgkJWyB3cmFwcGVyLndpZHRo KCksIHdyYXBwZXIuaGVpZ2h0KCkgXSA6CgkJWyB3cmFwcGVyLmhlaWdodCgpLCB3 cmFwcGVyLndpZHRoKCkgXTsKCglpZiAoIHBlcmNlbnQgKSB7CgkJc2l6ZSA9IHBh cnNlSW50KCBwZXJjZW50WyAxIF0sIDEwICkgLyAxMDAgKiBkaXN0YW5jZVsgaGlk ZSA/IDAgOiAxIF07Cgl9CglpZiAoIHNob3cgKSB7CgkJd3JhcHBlci5jc3MoIGhv cml6Rmlyc3QgPyB7CgkJCWhlaWdodDogMCwKCQkJd2lkdGg6IHNpemUKCQl9IDog ewoJCQloZWlnaHQ6IHNpemUsCgkJCXdpZHRoOiAwCgkJfSk7Cgl9CgoJLy8gQW5p bWF0aW9uCglhbmltYXRpb24xWyByZWZbIDAgXSBdID0gc2hvdyA/IGRpc3RhbmNl WyAwIF0gOiBzaXplOwoJYW5pbWF0aW9uMlsgcmVmWyAxIF0gXSA9IHNob3cgPyBk aXN0YW5jZVsgMSBdIDogMDsKCgkvLyBBbmltYXRlCgl3cmFwcGVyCgkJLmFuaW1h dGUoIGFuaW1hdGlvbjEsIGR1cmF0aW9uLCBvLmVhc2luZyApCgkJLmFuaW1hdGUo IGFuaW1hdGlvbjIsIGR1cmF0aW9uLCBvLmVhc2luZywgZnVuY3Rpb24oKSB7CgkJ CWlmICggaGlkZSApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMu cmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVy KCBlbCApOwoJCQlkb25lKCk7CgkJfSk7Cgp9OwoKfSkoalF1ZXJ5KTsKCihmdW5j dGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC5lZmZlY3RzLmVmZmVjdC5oaWdobGln aHQgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbGVtID0gJCggdGhpcyAp LAoJCXByb3BzID0gWyAiYmFja2dyb3VuZEltYWdlIiwgImJhY2tncm91bmRDb2xv ciIsICJvcGFjaXR5IiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWxl bSwgby5tb2RlIHx8ICJzaG93IiApLAoJCWFuaW1hdGlvbiA9IHsKCQkJYmFja2dy b3VuZENvbG9yOiBlbGVtLmNzcyggImJhY2tncm91bmRDb2xvciIgKQoJCX07CgoJ aWYgKG1vZGUgPT09ICJoaWRlIikgewoJCWFuaW1hdGlvbi5vcGFjaXR5ID0gMDsK CX0KCgkkLmVmZmVjdHMuc2F2ZSggZWxlbSwgcHJvcHMgKTsKCgllbGVtCgkJLnNo b3coKQoJCS5jc3MoewoJCQliYWNrZ3JvdW5kSW1hZ2U6ICJub25lIiwKCQkJYmFj a2dyb3VuZENvbG9yOiBvLmNvbG9yIHx8ICIjZmZmZjk5IgoJCX0pCgkJLmFuaW1h dGUoIGFuaW1hdGlvbiwgewoJCQlxdWV1ZTogZmFsc2UsCgkJCWR1cmF0aW9uOiBv LmR1cmF0aW9uLAoJCQllYXNpbmc6IG8uZWFzaW5nLAoJCQljb21wbGV0ZTogZnVu Y3Rpb24oKSB7CgkJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCQllbGVt LmhpZGUoKTsKCQkJCX0KCQkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbGVtLCBwcm9w cyApOwoJCQkJZG9uZSgpOwoJCQl9CgkJfSk7Cn07Cgp9KShqUXVlcnkpOwoKKGZ1 bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LnB1bHNh dGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbGVtID0gJCggdGhpcyAp LAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWxlbSwgby5tb2RlIHx8ICJz aG93IiApLAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgkJaGlkZSA9IG1vZGUg PT09ICJoaWRlIiwKCQlzaG93aGlkZSA9ICggc2hvdyB8fCBtb2RlID09PSAiaGlk ZSIgKSwKCgkJLy8gc2hvd2luZyBvciBoaWRpbmcgbGVhdmVzIG9mIHRoZSAibGFz dCIgYW5pbWF0aW9uCgkJYW5pbXMgPSAoICggby50aW1lcyB8fCA1ICkgKiAyICkg KyAoIHNob3doaWRlID8gMSA6IDAgKSwKCQlkdXJhdGlvbiA9IG8uZHVyYXRpb24g LyBhbmltcywKCQlhbmltYXRlVG8gPSAwLAoJCXF1ZXVlID0gZWxlbS5xdWV1ZSgp LAoJCXF1ZXVlbGVuID0gcXVldWUubGVuZ3RoLAoJCWk7CgoJaWYgKCBzaG93IHx8 ICFlbGVtLmlzKCI6dmlzaWJsZSIpKSB7CgkJZWxlbS5jc3MoICJvcGFjaXR5Iiwg MCApLnNob3coKTsKCQlhbmltYXRlVG8gPSAxOwoJfQoKCS8vIGFuaW1zIC0gMSBv cGFjaXR5ICJ0b2dnbGVzIgoJZm9yICggaSA9IDE7IGkgPCBhbmltczsgaSsrICkg ewoJCWVsZW0uYW5pbWF0ZSh7CgkJCW9wYWNpdHk6IGFuaW1hdGVUbwoJCX0sIGR1 cmF0aW9uLCBvLmVhc2luZyApOwoJCWFuaW1hdGVUbyA9IDEgLSBhbmltYXRlVG87 Cgl9CgoJZWxlbS5hbmltYXRlKHsKCQlvcGFjaXR5OiBhbmltYXRlVG8KCX0sIGR1 cmF0aW9uLCBvLmVhc2luZyk7CgoJZWxlbS5xdWV1ZShmdW5jdGlvbigpIHsKCQlp ZiAoIGhpZGUgKSB7CgkJCWVsZW0uaGlkZSgpOwoJCX0KCQlkb25lKCk7Cgl9KTsK CgkvLyBXZSBqdXN0IHF1ZXVlZCB1cCAiYW5pbXMiIGFuaW1hdGlvbnMsIHdlIG5l ZWQgdG8gcHV0IHRoZW0gbmV4dCBpbiB0aGUgcXVldWUKCWlmICggcXVldWVsZW4g PiAxICkgewoJCXF1ZXVlLnNwbGljZS5hcHBseSggcXVldWUsCgkJCVsgMSwgMCBd LmNvbmNhdCggcXVldWUuc3BsaWNlKCBxdWV1ZWxlbiwgYW5pbXMgKyAxICkgKSAp OwoJfQoJZWxlbS5kZXF1ZXVlKCk7Cn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9u KCAkLCB1bmRlZmluZWQgKSB7CgokLmVmZmVjdHMuZWZmZWN0LnB1ZmYgPSBmdW5j dGlvbiggbywgZG9uZSApIHsKCXZhciBlbGVtID0gJCggdGhpcyApLAoJCW1vZGUg PSAkLmVmZmVjdHMuc2V0TW9kZSggZWxlbSwgby5tb2RlIHx8ICJoaWRlIiApLAoJ CWhpZGUgPSBtb2RlID09PSAiaGlkZSIsCgkJcGVyY2VudCA9IHBhcnNlSW50KCBv LnBlcmNlbnQsIDEwICkgfHwgMTUwLAoJCWZhY3RvciA9IHBlcmNlbnQgLyAxMDAs CgkJb3JpZ2luYWwgPSB7CgkJCWhlaWdodDogZWxlbS5oZWlnaHQoKSwKCQkJd2lk dGg6IGVsZW0ud2lkdGgoKSwKCQkJb3V0ZXJIZWlnaHQ6IGVsZW0ub3V0ZXJIZWln aHQoKSwKCQkJb3V0ZXJXaWR0aDogZWxlbS5vdXRlcldpZHRoKCkKCQl9OwoKCSQu ZXh0ZW5kKCBvLCB7CgkJZWZmZWN0OiAic2NhbGUiLAoJCXF1ZXVlOiBmYWxzZSwK CQlmYWRlOiB0cnVlLAoJCW1vZGU6IG1vZGUsCgkJY29tcGxldGU6IGRvbmUsCgkJ cGVyY2VudDogaGlkZSA/IHBlcmNlbnQgOiAxMDAsCgkJZnJvbTogaGlkZSA/CgkJ CW9yaWdpbmFsIDoKCQkJewoJCQkJaGVpZ2h0OiBvcmlnaW5hbC5oZWlnaHQgKiBm YWN0b3IsCgkJCQl3aWR0aDogb3JpZ2luYWwud2lkdGggKiBmYWN0b3IsCgkJCQlv dXRlckhlaWdodDogb3JpZ2luYWwub3V0ZXJIZWlnaHQgKiBmYWN0b3IsCgkJCQlv dXRlcldpZHRoOiBvcmlnaW5hbC5vdXRlcldpZHRoICogZmFjdG9yCgkJCX0KCX0p OwoKCWVsZW0uZWZmZWN0KCBvICk7Cn07CgokLmVmZmVjdHMuZWZmZWN0LnNjYWxl ID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJLy8gQ3JlYXRlIGVsZW1lbnQKCXZh ciBlbCA9ICQoIHRoaXMgKSwKCQlvcHRpb25zID0gJC5leHRlbmQoIHRydWUsIHt9 LCBvICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8 ICJlZmZlY3QiICksCgkJcGVyY2VudCA9IHBhcnNlSW50KCBvLnBlcmNlbnQsIDEw ICkgfHwKCQkJKCBwYXJzZUludCggby5wZXJjZW50LCAxMCApID09PSAwID8gMCA6 ICggbW9kZSA9PT0gImhpZGUiID8gMCA6IDEwMCApICksCgkJZGlyZWN0aW9uID0g by5kaXJlY3Rpb24gfHwgImJvdGgiLAoJCW9yaWdpbiA9IG8ub3JpZ2luLAoJCW9y aWdpbmFsID0gewoJCQloZWlnaHQ6IGVsLmhlaWdodCgpLAoJCQl3aWR0aDogZWwu d2lkdGgoKSwKCQkJb3V0ZXJIZWlnaHQ6IGVsLm91dGVySGVpZ2h0KCksCgkJCW91 dGVyV2lkdGg6IGVsLm91dGVyV2lkdGgoKQoJCX0sCgkJZmFjdG9yID0gewoJCQl5 OiBkaXJlY3Rpb24gIT09ICJob3Jpem9udGFsIiA/IChwZXJjZW50IC8gMTAwKSA6 IDEsCgkJCXg6IGRpcmVjdGlvbiAhPT0gInZlcnRpY2FsIiA/IChwZXJjZW50IC8g MTAwKSA6IDEKCQl9OwoKCS8vIFdlIGFyZSBnb2luZyB0byBwYXNzIHRoaXMgZWZm ZWN0IHRvIHRoZSBzaXplIGVmZmVjdDoKCW9wdGlvbnMuZWZmZWN0ID0gInNpemUi OwoJb3B0aW9ucy5xdWV1ZSA9IGZhbHNlOwoJb3B0aW9ucy5jb21wbGV0ZSA9IGRv bmU7CgoJLy8gU2V0IGRlZmF1bHQgb3JpZ2luIGFuZCByZXN0b3JlIGZvciBzaG93 L2hpZGUKCWlmICggbW9kZSAhPT0gImVmZmVjdCIgKSB7CgkJb3B0aW9ucy5vcmln aW4gPSBvcmlnaW4gfHwgWyJtaWRkbGUiLCJjZW50ZXIiXTsKCQlvcHRpb25zLnJl c3RvcmUgPSB0cnVlOwoJfQoKCW9wdGlvbnMuZnJvbSA9IG8uZnJvbSB8fCAoIG1v ZGUgPT09ICJzaG93IiA/IHsKCQloZWlnaHQ6IDAsCgkJd2lkdGg6IDAsCgkJb3V0 ZXJIZWlnaHQ6IDAsCgkJb3V0ZXJXaWR0aDogMAoJfSA6IG9yaWdpbmFsICk7Cglv cHRpb25zLnRvID0gewoJCWhlaWdodDogb3JpZ2luYWwuaGVpZ2h0ICogZmFjdG9y LnksCgkJd2lkdGg6IG9yaWdpbmFsLndpZHRoICogZmFjdG9yLngsCgkJb3V0ZXJI ZWlnaHQ6IG9yaWdpbmFsLm91dGVySGVpZ2h0ICogZmFjdG9yLnksCgkJb3V0ZXJX aWR0aDogb3JpZ2luYWwub3V0ZXJXaWR0aCAqIGZhY3Rvci54Cgl9OwoKCS8vIEZh ZGUgb3B0aW9uIHRvIHN1cHBvcnQgcHVmZgoJaWYgKCBvcHRpb25zLmZhZGUgKSB7 CgkJaWYgKCBtb2RlID09PSAic2hvdyIgKSB7CgkJCW9wdGlvbnMuZnJvbS5vcGFj aXR5ID0gMDsKCQkJb3B0aW9ucy50by5vcGFjaXR5ID0gMTsKCQl9CgkJaWYgKCBt b2RlID09PSAiaGlkZSIgKSB7CgkJCW9wdGlvbnMuZnJvbS5vcGFjaXR5ID0gMTsK CQkJb3B0aW9ucy50by5vcGFjaXR5ID0gMDsKCQl9Cgl9CgoJLy8gQW5pbWF0ZQoJ ZWwuZWZmZWN0KCBvcHRpb25zICk7Cgp9OwoKJC5lZmZlY3RzLmVmZmVjdC5zaXpl ID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJLy8gQ3JlYXRlIGVsZW1lbnQKCXZh ciBvcmlnaW5hbCwgYmFzZWxpbmUsIGZhY3RvciwKCQllbCA9ICQoIHRoaXMgKSwK CQlwcm9wczAgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQi LCAicmlnaHQiLCAid2lkdGgiLCAiaGVpZ2h0IiwgIm92ZXJmbG93IiwgIm9wYWNp dHkiIF0sCgoJCS8vIEFsd2F5cyByZXN0b3JlCgkJcHJvcHMxID0gWyAicG9zaXRp b24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgIm92ZXJmbG93 IiwgIm9wYWNpdHkiIF0sCgoJCS8vIENvcHkgZm9yIGNoaWxkcmVuCgkJcHJvcHMy ID0gWyAid2lkdGgiLCAiaGVpZ2h0IiwgIm92ZXJmbG93IiBdLAoJCWNQcm9wcyA9 IFsgImZvbnRTaXplIiBdLAoJCXZQcm9wcyA9IFsgImJvcmRlclRvcFdpZHRoIiwg ImJvcmRlckJvdHRvbVdpZHRoIiwgInBhZGRpbmdUb3AiLCAicGFkZGluZ0JvdHRv bSIgXSwKCQloUHJvcHMgPSBbICJib3JkZXJMZWZ0V2lkdGgiLCAiYm9yZGVyUmln aHRXaWR0aCIsICJwYWRkaW5nTGVmdCIsICJwYWRkaW5nUmlnaHQiIF0sCgoJCS8v IFNldCBvcHRpb25zCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5t b2RlIHx8ICJlZmZlY3QiICksCgkJcmVzdG9yZSA9IG8ucmVzdG9yZSB8fCBtb2Rl ICE9PSAiZWZmZWN0IiwKCQlzY2FsZSA9IG8uc2NhbGUgfHwgImJvdGgiLAoJCW9y aWdpbiA9IG8ub3JpZ2luIHx8IFsgIm1pZGRsZSIsICJjZW50ZXIiIF0sCgkJcG9z aXRpb24gPSBlbC5jc3MoICJwb3NpdGlvbiIgKSwKCQlwcm9wcyA9IHJlc3RvcmUg PyBwcm9wczAgOiBwcm9wczEsCgkJemVybyA9IHsKCQkJaGVpZ2h0OiAwLAoJCQl3 aWR0aDogMCwKCQkJb3V0ZXJIZWlnaHQ6IDAsCgkJCW91dGVyV2lkdGg6IDAKCQl9 OwoKCWlmICggbW9kZSA9PT0gInNob3ciICkgewoJCWVsLnNob3coKTsKCX0KCW9y aWdpbmFsID0gewoJCWhlaWdodDogZWwuaGVpZ2h0KCksCgkJd2lkdGg6IGVsLndp ZHRoKCksCgkJb3V0ZXJIZWlnaHQ6IGVsLm91dGVySGVpZ2h0KCksCgkJb3V0ZXJX aWR0aDogZWwub3V0ZXJXaWR0aCgpCgl9OwoKCWlmICggby5tb2RlID09PSAidG9n Z2xlIiAmJiBtb2RlID09PSAic2hvdyIgKSB7CgkJZWwuZnJvbSA9IG8udG8gfHwg emVybzsKCQllbC50byA9IG8uZnJvbSB8fCBvcmlnaW5hbDsKCX0gZWxzZSB7CgkJ ZWwuZnJvbSA9IG8uZnJvbSB8fCAoIG1vZGUgPT09ICJzaG93IiA/IHplcm8gOiBv cmlnaW5hbCApOwoJCWVsLnRvID0gby50byB8fCAoIG1vZGUgPT09ICJoaWRlIiA/ IHplcm8gOiBvcmlnaW5hbCApOwoJfQoKCS8vIFNldCBzY2FsaW5nIGZhY3RvcgoJ ZmFjdG9yID0gewoJCWZyb206IHsKCQkJeTogZWwuZnJvbS5oZWlnaHQgLyBvcmln aW5hbC5oZWlnaHQsCgkJCXg6IGVsLmZyb20ud2lkdGggLyBvcmlnaW5hbC53aWR0 aAoJCX0sCgkJdG86IHsKCQkJeTogZWwudG8uaGVpZ2h0IC8gb3JpZ2luYWwuaGVp Z2h0LAoJCQl4OiBlbC50by53aWR0aCAvIG9yaWdpbmFsLndpZHRoCgkJfQoJfTsK CgkvLyBTY2FsZSB0aGUgY3NzIGJveAoJaWYgKCBzY2FsZSA9PT0gImJveCIgfHwg c2NhbGUgPT09ICJib3RoIiApIHsKCgkJLy8gVmVydGljYWwgcHJvcHMgc2NhbGlu ZwoJCWlmICggZmFjdG9yLmZyb20ueSAhPT0gZmFjdG9yLnRvLnkgKSB7CgkJCXBy b3BzID0gcHJvcHMuY29uY2F0KCB2UHJvcHMgKTsKCQkJZWwuZnJvbSA9ICQuZWZm ZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgdlByb3BzLCBmYWN0b3IuZnJvbS55LCBl bC5mcm9tICk7CgkJCWVsLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVs LCB2UHJvcHMsIGZhY3Rvci50by55LCBlbC50byApOwoJCX0KCgkJLy8gSG9yaXpv bnRhbCBwcm9wcyBzY2FsaW5nCgkJaWYgKCBmYWN0b3IuZnJvbS54ICE9PSBmYWN0 b3IudG8ueCApIHsKCQkJcHJvcHMgPSBwcm9wcy5jb25jYXQoIGhQcm9wcyApOwoJ CQllbC5mcm9tID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVsLCBoUHJvcHMs IGZhY3Rvci5mcm9tLngsIGVsLmZyb20gKTsKCQkJZWwudG8gPSAkLmVmZmVjdHMu c2V0VHJhbnNpdGlvbiggZWwsIGhQcm9wcywgZmFjdG9yLnRvLngsIGVsLnRvICk7 CgkJfQoJfQoKCS8vIFNjYWxlIHRoZSBjb250ZW50CglpZiAoIHNjYWxlID09PSAi Y29udGVudCIgfHwgc2NhbGUgPT09ICJib3RoIiApIHsKCgkJLy8gVmVydGljYWwg cHJvcHMgc2NhbGluZwoJCWlmICggZmFjdG9yLmZyb20ueSAhPT0gZmFjdG9yLnRv LnkgKSB7CgkJCXByb3BzID0gcHJvcHMuY29uY2F0KCBjUHJvcHMgKS5jb25jYXQo IHByb3BzMiApOwoJCQllbC5mcm9tID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24o IGVsLCBjUHJvcHMsIGZhY3Rvci5mcm9tLnksIGVsLmZyb20gKTsKCQkJZWwudG8g PSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggZWwsIGNQcm9wcywgZmFjdG9yLnRv LnksIGVsLnRvICk7CgkJfQoJfQoKCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMg KTsKCWVsLnNob3coKTsKCSQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApOwoJ ZWwuY3NzKCAib3ZlcmZsb3ciLCAiaGlkZGVuIiApLmNzcyggZWwuZnJvbSApOwoK CS8vIEFkanVzdAoJaWYgKG9yaWdpbikgeyAvLyBDYWxjdWxhdGUgYmFzZWxpbmUg c2hpZnRzCgkJYmFzZWxpbmUgPSAkLmVmZmVjdHMuZ2V0QmFzZWxpbmUoIG9yaWdp biwgb3JpZ2luYWwgKTsKCQllbC5mcm9tLnRvcCA9ICggb3JpZ2luYWwub3V0ZXJI ZWlnaHQgLSBlbC5vdXRlckhlaWdodCgpICkgKiBiYXNlbGluZS55OwoJCWVsLmZy b20ubGVmdCA9ICggb3JpZ2luYWwub3V0ZXJXaWR0aCAtIGVsLm91dGVyV2lkdGgo KSApICogYmFzZWxpbmUueDsKCQllbC50by50b3AgPSAoIG9yaWdpbmFsLm91dGVy SGVpZ2h0IC0gZWwudG8ub3V0ZXJIZWlnaHQgKSAqIGJhc2VsaW5lLnk7CgkJZWwu dG8ubGVmdCA9ICggb3JpZ2luYWwub3V0ZXJXaWR0aCAtIGVsLnRvLm91dGVyV2lk dGggKSAqIGJhc2VsaW5lLng7Cgl9CgllbC5jc3MoIGVsLmZyb20gKTsgLy8gc2V0 IHRvcCAmIGxlZnQKCgkvLyBBbmltYXRlCglpZiAoIHNjYWxlID09PSAiY29udGVu dCIgfHwgc2NhbGUgPT09ICJib3RoIiApIHsgLy8gU2NhbGUgdGhlIGNoaWxkcmVu CgoJCS8vIEFkZCBtYXJnaW5zL2ZvbnQtc2l6ZQoJCXZQcm9wcyA9IHZQcm9wcy5j b25jYXQoWyAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIgXSkuY29uY2F0KGNQ cm9wcyk7CgkJaFByb3BzID0gaFByb3BzLmNvbmNhdChbICJtYXJnaW5MZWZ0Iiwg Im1hcmdpblJpZ2h0IiBdKTsKCQlwcm9wczIgPSBwcm9wczAuY29uY2F0KHZQcm9w cykuY29uY2F0KGhQcm9wcyk7CgoJCWVsLmZpbmQoICIqW3dpZHRoXSIgKS5lYWNo KCBmdW5jdGlvbigpewoJCQl2YXIgY2hpbGQgPSAkKCB0aGlzICksCgkJCQljX29y aWdpbmFsID0gewoJCQkJCWhlaWdodDogY2hpbGQuaGVpZ2h0KCksCgkJCQkJd2lk dGg6IGNoaWxkLndpZHRoKCksCgkJCQkJb3V0ZXJIZWlnaHQ6IGNoaWxkLm91dGVy SGVpZ2h0KCksCgkJCQkJb3V0ZXJXaWR0aDogY2hpbGQub3V0ZXJXaWR0aCgpCgkJ CQl9OwoJCQlpZiAocmVzdG9yZSkgewoJCQkJJC5lZmZlY3RzLnNhdmUoY2hpbGQs IHByb3BzMik7CgkJCX0KCgkJCWNoaWxkLmZyb20gPSB7CgkJCQloZWlnaHQ6IGNf b3JpZ2luYWwuaGVpZ2h0ICogZmFjdG9yLmZyb20ueSwKCQkJCXdpZHRoOiBjX29y aWdpbmFsLndpZHRoICogZmFjdG9yLmZyb20ueCwKCQkJCW91dGVySGVpZ2h0OiBj X29yaWdpbmFsLm91dGVySGVpZ2h0ICogZmFjdG9yLmZyb20ueSwKCQkJCW91dGVy V2lkdGg6IGNfb3JpZ2luYWwub3V0ZXJXaWR0aCAqIGZhY3Rvci5mcm9tLngKCQkJ fTsKCQkJY2hpbGQudG8gPSB7CgkJCQloZWlnaHQ6IGNfb3JpZ2luYWwuaGVpZ2h0 ICogZmFjdG9yLnRvLnksCgkJCQl3aWR0aDogY19vcmlnaW5hbC53aWR0aCAqIGZh Y3Rvci50by54LAoJCQkJb3V0ZXJIZWlnaHQ6IGNfb3JpZ2luYWwuaGVpZ2h0ICog ZmFjdG9yLnRvLnksCgkJCQlvdXRlcldpZHRoOiBjX29yaWdpbmFsLndpZHRoICog ZmFjdG9yLnRvLngKCQkJfTsKCgkJCS8vIFZlcnRpY2FsIHByb3BzIHNjYWxpbmcK CQkJaWYgKCBmYWN0b3IuZnJvbS55ICE9PSBmYWN0b3IudG8ueSApIHsKCQkJCWNo aWxkLmZyb20gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggY2hpbGQsIHZQcm9w cywgZmFjdG9yLmZyb20ueSwgY2hpbGQuZnJvbSApOwoJCQkJY2hpbGQudG8gPSAk LmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggY2hpbGQsIHZQcm9wcywgZmFjdG9yLnRv LnksIGNoaWxkLnRvICk7CgkJCX0KCgkJCS8vIEhvcml6b250YWwgcHJvcHMgc2Nh bGluZwoJCQlpZiAoIGZhY3Rvci5mcm9tLnggIT09IGZhY3Rvci50by54ICkgewoJ CQkJY2hpbGQuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBjaGlsZCwg aFByb3BzLCBmYWN0b3IuZnJvbS54LCBjaGlsZC5mcm9tICk7CgkJCQljaGlsZC50 byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBjaGlsZCwgaFByb3BzLCBmYWN0 b3IudG8ueCwgY2hpbGQudG8gKTsKCQkJfQoKCQkJLy8gQW5pbWF0ZSBjaGlsZHJl bgoJCQljaGlsZC5jc3MoIGNoaWxkLmZyb20gKTsKCQkJY2hpbGQuYW5pbWF0ZSgg Y2hpbGQudG8sIG8uZHVyYXRpb24sIG8uZWFzaW5nLCBmdW5jdGlvbigpIHsKCgkJ CQkvLyBSZXN0b3JlIGNoaWxkcmVuCgkJCQlpZiAoIHJlc3RvcmUgKSB7CgkJCQkJ JC5lZmZlY3RzLnJlc3RvcmUoIGNoaWxkLCBwcm9wczIgKTsKCQkJCX0KCQkJfSk7 CgkJfSk7Cgl9CgoJLy8gQW5pbWF0ZQoJZWwuYW5pbWF0ZSggZWwudG8sIHsKCQlx dWV1ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBv LmVhc2luZywKCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCWlmICggZWwudG8u b3BhY2l0eSA9PT0gMCApIHsKCQkJCWVsLmNzcyggIm9wYWNpdHkiLCBlbC5mcm9t Lm9wYWNpdHkgKTsKCQkJfQoJCQlpZiggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJ ZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMg KTsKCQkJaWYgKCAhcmVzdG9yZSApIHsKCgkJCQkvLyB3ZSBuZWVkIHRvIGNhbGN1 bGF0ZSBvdXIgbmV3IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBzY2FsaW5nCgkJ CQlpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKCQkJCQllbC5jc3MoewoJ CQkJCQlwb3NpdGlvbjogInJlbGF0aXZlIiwKCQkJCQkJdG9wOiBlbC50by50b3As CgkJCQkJCWxlZnQ6IGVsLnRvLmxlZnQKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJ CQkJJC5lYWNoKFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaWR4LCBwb3Mg KSB7CgkJCQkJCWVsLmNzcyggcG9zLCBmdW5jdGlvbiggXywgc3RyICkgewoJCQkJ CQkJdmFyIHZhbCA9IHBhcnNlSW50KCBzdHIsIDEwICksCgkJCQkJCQkJdG9SZWYg PSBpZHggPyBlbC50by5sZWZ0IDogZWwudG8udG9wOwoKCQkJCQkJCS8vIGlmIG9y aWdpbmFsIHdhcyAiYXV0byIsIHJlY2FsY3VsYXRlIHRoZSBuZXcgdmFsdWUgZnJv bSB3cmFwcGVyCgkJCQkJCQlpZiAoIHN0ciA9PT0gImF1dG8iICkgewoJCQkJCQkJ CXJldHVybiB0b1JlZiArICJweCI7CgkJCQkJCQl9CgoJCQkJCQkJcmV0dXJuIHZh bCArIHRvUmVmICsgInB4IjsKCQkJCQkJfSk7CgkJCQkJfSk7CgkJCQl9CgkJCX0K CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJ fQoJfSk7Cgp9OwoKfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiggJCwgdW5kZWZpbmVk ICkgewoKJC5lZmZlY3RzLmVmZmVjdC5zaGFrZSA9IGZ1bmN0aW9uKCBvLCBkb25l ICkgewoKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9u IiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAi d2lkdGgiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2Rl IHx8ICJlZmZlY3QiICksCgkJZGlyZWN0aW9uID0gby5kaXJlY3Rpb24gfHwgImxl ZnQiLAoJCWRpc3RhbmNlID0gby5kaXN0YW5jZSB8fCAyMCwKCQl0aW1lcyA9IG8u dGltZXMgfHwgMywKCQlhbmltcyA9IHRpbWVzICogMiArIDEsCgkJc3BlZWQgPSBN YXRoLnJvdW5kKG8uZHVyYXRpb24vYW5pbXMpLAoJCXJlZiA9IChkaXJlY3Rpb24g PT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAiZG93biIpID8gInRvcCIgOiAibGVm dCIsCgkJcG9zaXRpdmVNb3Rpb24gPSAoZGlyZWN0aW9uID09PSAidXAiIHx8IGRp cmVjdGlvbiA9PT0gImxlZnQiKSwKCQlhbmltYXRpb24gPSB7fSwKCQlhbmltYXRp b24xID0ge30sCgkJYW5pbWF0aW9uMiA9IHt9LAoJCWksCgoJCS8vIHdlIHdpbGwg bmVlZCB0byByZS1hc3NlbWJsZSB0aGUgcXVldWUgdG8gc3RhY2sgb3VyIGFuaW1h dGlvbnMgaW4gcGxhY2UKCQlxdWV1ZSA9IGVsLnF1ZXVlKCksCgkJcXVldWVsZW4g PSBxdWV1ZS5sZW5ndGg7CgoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJ ZWwuc2hvdygpOwoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICk7CgoJLy8g QW5pbWF0aW9uCglhbmltYXRpb25bIHJlZiBdID0gKCBwb3NpdGl2ZU1vdGlvbiA/ ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZTsKCWFuaW1hdGlvbjFbIHJlZiBdID0g KCBwb3NpdGl2ZU1vdGlvbiA/ICIrPSIgOiAiLT0iICkgKyBkaXN0YW5jZSAqIDI7 CglhbmltYXRpb24yWyByZWYgXSA9ICggcG9zaXRpdmVNb3Rpb24gPyAiLT0iIDog Iis9IiApICsgZGlzdGFuY2UgKiAyOwoKCS8vIEFuaW1hdGUKCWVsLmFuaW1hdGUo IGFuaW1hdGlvbiwgc3BlZWQsIG8uZWFzaW5nICk7CgoJLy8gU2hha2VzCglmb3Ig KCBpID0gMTsgaSA8IHRpbWVzOyBpKysgKSB7CgkJZWwuYW5pbWF0ZSggYW5pbWF0 aW9uMSwgc3BlZWQsIG8uZWFzaW5nICkuYW5pbWF0ZSggYW5pbWF0aW9uMiwgc3Bl ZWQsIG8uZWFzaW5nICk7Cgl9CgllbAoJCS5hbmltYXRlKCBhbmltYXRpb24xLCBz cGVlZCwgby5lYXNpbmcgKQoJCS5hbmltYXRlKCBhbmltYXRpb24sIHNwZWVkIC8g Miwgby5lYXNpbmcgKQoJCS5xdWV1ZShmdW5jdGlvbigpIHsKCQkJaWYgKCBtb2Rl ID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3Rz LnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBl ciggZWwgKTsKCQkJZG9uZSgpOwoJCX0pOwoKCS8vIGluamVjdCBhbGwgdGhlIGFu aW1hdGlvbnMgd2UganVzdCBxdWV1ZWQgdG8gYmUgZmlyc3QgaW4gbGluZSAoYWZ0 ZXIgImlucHJvZ3Jlc3MiKQoJaWYgKCBxdWV1ZWxlbiA+IDEpIHsKCQlxdWV1ZS5z cGxpY2UuYXBwbHkoIHF1ZXVlLAoJCQlbIDEsIDAgXS5jb25jYXQoIHF1ZXVlLnNw bGljZSggcXVldWVsZW4sIGFuaW1zICsgMSApICkgKTsKCX0KCWVsLmRlcXVldWUo KTsKCn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7 CgokLmVmZmVjdHMuZWZmZWN0LnNsaWRlID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7 CgoJLy8gQ3JlYXRlIGVsZW1lbnQKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9w cyA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdo dCIsICJ3aWR0aCIsICJoZWlnaHQiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRN b2RlKCBlbCwgby5tb2RlIHx8ICJzaG93IiApLAoJCXNob3cgPSBtb2RlID09PSAi c2hvdyIsCgkJZGlyZWN0aW9uID0gby5kaXJlY3Rpb24gfHwgImxlZnQiLAoJCXJl ZiA9IChkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAiZG93biIp ID8gInRvcCIgOiAibGVmdCIsCgkJcG9zaXRpdmVNb3Rpb24gPSAoZGlyZWN0aW9u ID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImxlZnQiKSwKCQlkaXN0YW5jZSwK CQlhbmltYXRpb24gPSB7fTsKCgkvLyBBZGp1c3QKCSQuZWZmZWN0cy5zYXZlKCBl bCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCWRpc3RhbmNlID0gby5kaXN0YW5jZSB8 fCBlbFsgcmVmID09PSAidG9wIiA/ICJvdXRlckhlaWdodCIgOiAib3V0ZXJXaWR0 aCIgXSggdHJ1ZSApOwoKCSQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApLmNz cyh7CgkJb3ZlcmZsb3c6ICJoaWRkZW4iCgl9KTsKCglpZiAoIHNob3cgKSB7CgkJ ZWwuY3NzKCByZWYsIHBvc2l0aXZlTW90aW9uID8gKGlzTmFOKGRpc3RhbmNlKSA/ ICItIiArIGRpc3RhbmNlIDogLWRpc3RhbmNlKSA6IGRpc3RhbmNlICk7Cgl9CgoJ Ly8gQW5pbWF0aW9uCglhbmltYXRpb25bIHJlZiBdID0gKCBzaG93ID8KCQkoIHBv c2l0aXZlTW90aW9uID8gIis9IiA6ICItPSIpIDoKCQkoIHBvc2l0aXZlTW90aW9u ID8gIi09IiA6ICIrPSIpKSArCgkJZGlzdGFuY2U7CgoJLy8gQW5pbWF0ZQoJZWwu YW5pbWF0ZSggYW5pbWF0aW9uLCB7CgkJcXVldWU6IGZhbHNlLAoJCWR1cmF0aW9u OiBvLmR1cmF0aW9uLAoJCWVhc2luZzogby5lYXNpbmcsCgkJY29tcGxldGU6IGZ1 bmN0aW9uKCkgewoJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCWVsLmhp ZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJ CSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJ fSk7Cn07Cgp9KShqUXVlcnkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7 CgokLmVmZmVjdHMuZWZmZWN0LnRyYW5zZmVyID0gZnVuY3Rpb24oIG8sIGRvbmUg KSB7Cgl2YXIgZWxlbSA9ICQoIHRoaXMgKSwKCQl0YXJnZXQgPSAkKCBvLnRvICks CgkJdGFyZ2V0Rml4ZWQgPSB0YXJnZXQuY3NzKCAicG9zaXRpb24iICkgPT09ICJm aXhlZCIsCgkJYm9keSA9ICQoImJvZHkiKSwKCQlmaXhUb3AgPSB0YXJnZXRGaXhl ZCA/IGJvZHkuc2Nyb2xsVG9wKCkgOiAwLAoJCWZpeExlZnQgPSB0YXJnZXRGaXhl ZCA/IGJvZHkuc2Nyb2xsTGVmdCgpIDogMCwKCQllbmRQb3NpdGlvbiA9IHRhcmdl dC5vZmZzZXQoKSwKCQlhbmltYXRpb24gPSB7CgkJCXRvcDogZW5kUG9zaXRpb24u dG9wIC0gZml4VG9wICwKCQkJbGVmdDogZW5kUG9zaXRpb24ubGVmdCAtIGZpeExl ZnQgLAoJCQloZWlnaHQ6IHRhcmdldC5pbm5lckhlaWdodCgpLAoJCQl3aWR0aDog dGFyZ2V0LmlubmVyV2lkdGgoKQoJCX0sCgkJc3RhcnRQb3NpdGlvbiA9IGVsZW0u b2Zmc2V0KCksCgkJdHJhbnNmZXIgPSAkKCAiPGRpdiBjbGFzcz0ndWktZWZmZWN0 cy10cmFuc2Zlcic+PC9kaXY+IiApCgkJCS5hcHBlbmRUbyggZG9jdW1lbnQuYm9k eSApCgkJCS5hZGRDbGFzcyggby5jbGFzc05hbWUgKQoJCQkuY3NzKHsKCQkJCXRv cDogc3RhcnRQb3NpdGlvbi50b3AgLSBmaXhUb3AgLAoJCQkJbGVmdDogc3RhcnRQ b3NpdGlvbi5sZWZ0IC0gZml4TGVmdCAsCgkJCQloZWlnaHQ6IGVsZW0uaW5uZXJI ZWlnaHQoKSwKCQkJCXdpZHRoOiBlbGVtLmlubmVyV2lkdGgoKSwKCQkJCXBvc2l0 aW9uOiB0YXJnZXRGaXhlZCA/ICJmaXhlZCIgOiAiYWJzb2x1dGUiCgkJCX0pCgkJ CS5hbmltYXRlKCBhbmltYXRpb24sIG8uZHVyYXRpb24sIG8uZWFzaW5nLCBmdW5j dGlvbigpIHsKCQkJCXRyYW5zZmVyLnJlbW92ZSgpOwoJCQkJZG9uZSgpOwoJCQl9 KTsKfTsKCn0pKGpRdWVyeSk7CgooZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHsK CiQud2lkZ2V0KCAidWkubWVudSIsIHsKCXZlcnNpb246ICIxLjEwLjAiLAoJZGVm YXVsdEVsZW1lbnQ6ICI8dWw+IiwKCWRlbGF5OiAzMDAsCglvcHRpb25zOiB7CgkJ aWNvbnM6IHsKCQkJc3VibWVudTogInVpLWljb24tY2FyYXQtMS1lIgoJCX0sCgkJ bWVudXM6ICJ1bCIsCgkJcG9zaXRpb246IHsKCQkJbXk6ICJsZWZ0IHRvcCIsCgkJ CWF0OiAicmlnaHQgdG9wIgoJCX0sCgkJcm9sZTogIm1lbnUiLAoKCQkvLyBjYWxs YmFja3MKCQlibHVyOiBudWxsLAoJCWZvY3VzOiBudWxsLAoJCXNlbGVjdDogbnVs bAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLmFjdGl2ZU1lbnUg PSB0aGlzLmVsZW1lbnQ7CgkJLy8gZmxhZyB1c2VkIHRvIHByZXZlbnQgZmlyaW5n IG9mIHRoZSBjbGljayBoYW5kbGVyCgkJLy8gYXMgdGhlIGV2ZW50IGJ1YmJsZXMg dXAgdGhyb3VnaCBuZXN0ZWQgbWVudXMKCQl0aGlzLm1vdXNlSGFuZGxlZCA9IGZh bHNlOwoJCXRoaXMuZWxlbWVudAoJCQkudW5pcXVlSWQoKQoJCQkuYWRkQ2xhc3Mo ICJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXIt YWxsIiApCgkJCS50b2dnbGVDbGFzcyggInVpLW1lbnUtaWNvbnMiLCAhIXRoaXMu ZWxlbWVudC5maW5kKCAiLnVpLWljb24iICkubGVuZ3RoICkKCQkJLmF0dHIoewoJ CQkJcm9sZTogdGhpcy5vcHRpb25zLnJvbGUsCgkJCQl0YWJJbmRleDogMAoJCQl9 KQoJCQkvLyBuZWVkIHRvIGNhdGNoIGFsbCBjbGlja3Mgb24gZGlzYWJsZWQgbWVu dQoJCQkvLyBub3QgcG9zc2libGUgdGhyb3VnaCBfb24KCQkJLmJpbmQoICJjbGlj ayIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCAkLnByb3h5KGZ1bmN0aW9uKCBldmVu dCApIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQkJCWV2 ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQl9CgkJCX0sIHRoaXMgKSk7CgoJCWlm ICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQl0aGlzLmVsZW1lbnQKCQkJ CS5hZGRDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApCgkJCQkuYXR0ciggImFy aWEtZGlzYWJsZWQiLCAidHJ1ZSIgKTsKCQl9CgoJCXRoaXMuX29uKHsKCQkJLy8g UHJldmVudCBmb2N1cyBmcm9tIHN0aWNraW5nIHRvIGxpbmtzIGluc2lkZSBtZW51 IGFmdGVyIGNsaWNraW5nCgkJCS8vIHRoZW0gKGZvY3VzIHNob3VsZCBhbHdheXMg c3RheSBvbiBVTCBkdXJpbmcgbmF2aWdhdGlvbikuCgkJCSJtb3VzZWRvd24gLnVp LW1lbnUtaXRlbSA+IGEiOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlldmVudC5w cmV2ZW50RGVmYXVsdCgpOwoJCQl9LAoJCQkiY2xpY2sgLnVpLXN0YXRlLWRpc2Fi bGVkID4gYSI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnRE ZWZhdWx0KCk7CgkJCX0sCgkJCSJjbGljayAudWktbWVudS1pdGVtOmhhcyhhKSI6 IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCXZhciB0YXJnZXQgPSAkKCBldmVudC50 YXJnZXQgKS5jbG9zZXN0KCAiLnVpLW1lbnUtaXRlbSIgKTsKCQkJCWlmICggIXRo aXMubW91c2VIYW5kbGVkICYmIHRhcmdldC5ub3QoICIudWktc3RhdGUtZGlzYWJs ZWQiICkubGVuZ3RoICkgewoJCQkJCXRoaXMubW91c2VIYW5kbGVkID0gdHJ1ZTsK CgkJCQkJdGhpcy5zZWxlY3QoIGV2ZW50ICk7CgkJCQkJLy8gT3BlbiBzdWJtZW51 IG9uIGNsaWNrCgkJCQkJaWYgKCB0YXJnZXQuaGFzKCAiLnVpLW1lbnUiICkubGVu Z3RoICkgewoJCQkJCQl0aGlzLmV4cGFuZCggZXZlbnQgKTsKCQkJCQl9IGVsc2Ug aWYgKCAhdGhpcy5lbGVtZW50LmlzKCAiOmZvY3VzIiApICkgewoJCQkJCQkvLyBS ZWRpcmVjdCBmb2N1cyB0byB0aGUgbWVudQoJCQkJCQl0aGlzLmVsZW1lbnQudHJp Z2dlciggImZvY3VzIiwgWyB0cnVlIF0gKTsKCgkJCQkJCS8vIElmIHRoZSBhY3Rp dmUgaXRlbSBpcyBvbiB0aGUgdG9wIGxldmVsLCBsZXQgaXQgc3RheSBhY3RpdmUu CgkJCQkJCS8vIE90aGVyd2lzZSwgYmx1ciB0aGUgYWN0aXZlIGl0ZW0gc2luY2Ug aXQgaXMgbm8gbG9uZ2VyIHZpc2libGUuCgkJCQkJCWlmICggdGhpcy5hY3RpdmUg JiYgdGhpcy5hY3RpdmUucGFyZW50cyggIi51aS1tZW51IiApLmxlbmd0aCA9PT0g MSApIHsKCQkJCQkJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCQkJCQl9 CgkJCQkJfQoJCQkJfQoJCQl9LAoJCQkibW91c2VlbnRlciAudWktbWVudS1pdGVt IjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJdmFyIHRhcmdldCA9ICQoIGV2ZW50 LmN1cnJlbnRUYXJnZXQgKTsKCQkJCS8vIFJlbW92ZSB1aS1zdGF0ZS1hY3RpdmUg Y2xhc3MgZnJvbSBzaWJsaW5ncyBvZiB0aGUgbmV3bHkgZm9jdXNlZCBtZW51IGl0 ZW0KCQkJCS8vIHRvIGF2b2lkIGEganVtcCBjYXVzZWQgYnkgYWRqYWNlbnQgZWxl bWVudHMgYm90aCBoYXZpbmcgYSBjbGFzcyB3aXRoIGEgYm9yZGVyCgkJCQl0YXJn ZXQuc2libGluZ3MoKS5jaGlsZHJlbiggIi51aS1zdGF0ZS1hY3RpdmUiICkucmVt b3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl0aGlzLmZvY3VzKCBl dmVudCwgdGFyZ2V0ICk7CgkJCX0sCgkJCW1vdXNlbGVhdmU6ICJjb2xsYXBzZUFs bCIsCgkJCSJtb3VzZWxlYXZlIC51aS1tZW51IjogImNvbGxhcHNlQWxsIiwKCQkJ Zm9jdXM6IGZ1bmN0aW9uKCBldmVudCwga2VlcEFjdGl2ZUl0ZW0gKSB7CgkJCQkv LyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gYWN0aXZlIGl0ZW0sIGtlZXAgaXQgYWN0 aXZlCgkJCQkvLyBJZiBub3QsIGFjdGl2YXRlIHRoZSBmaXJzdCBpdGVtCgkJCQl2 YXIgaXRlbSA9IHRoaXMuYWN0aXZlIHx8IHRoaXMuZWxlbWVudC5jaGlsZHJlbigg Ii51aS1tZW51LWl0ZW0iICkuZXEoIDAgKTsKCgkJCQlpZiAoICFrZWVwQWN0aXZl SXRlbSApIHsKCQkJCQl0aGlzLmZvY3VzKCBldmVudCwgaXRlbSApOwoJCQkJfQoJ CQl9LAoJCQlibHVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl0aGlzLl9kZWxh eShmdW5jdGlvbigpIHsKCQkJCQlpZiAoICEkLmNvbnRhaW5zKCB0aGlzLmVsZW1l bnRbMF0sIHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCApICkgewoJCQkJ CQl0aGlzLmNvbGxhcHNlQWxsKCBldmVudCApOwoJCQkJCX0KCQkJCX0pOwoJCQl9 LAoJCQlrZXlkb3duOiAiX2tleWRvd24iCgkJfSk7CgoJCXRoaXMucmVmcmVzaCgp OwoKCQkvLyBDbGlja3Mgb3V0c2lkZSBvZiBhIG1lbnUgY29sbGFwc2UgYW55IG9w ZW4gbWVudXMKCQl0aGlzLl9vbiggdGhpcy5kb2N1bWVudCwgewoJCQljbGljazog ZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCAhJCggZXZlbnQudGFyZ2V0ICku Y2xvc2VzdCggIi51aS1tZW51IiApLmxlbmd0aCApIHsKCQkJCQl0aGlzLmNvbGxh cHNlQWxsKCBldmVudCApOwoJCQkJfQoKCQkJCS8vIFJlc2V0IHRoZSBtb3VzZUhh bmRsZWQgZmxhZwoJCQkJdGhpcy5tb3VzZUhhbmRsZWQgPSBmYWxzZTsKCQkJfQoJ CX0pOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJLy8gRGVzdHJveSAo c3ViKW1lbnVzCgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1h Y3RpdmVkZXNjZW5kYW50IiApCgkJCS5maW5kKCAiLnVpLW1lbnUiICkuYWRkQmFj aygpCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRn ZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLW1lbnUtaWNvbnMiICkKCQkJCS5y ZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIg KQoJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWxhYmVsbGVkYnkiICkKCQkJCS5yZW1v dmVBdHRyKCAiYXJpYS1leHBhbmRlZCIgKQoJCQkJLnJlbW92ZUF0dHIoICJhcmlh LWhpZGRlbiIgKQoJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWRpc2FibGVkIiApCgkJ CQkucmVtb3ZlVW5pcXVlSWQoKQoJCQkJLnNob3coKTsKCgkJLy8gRGVzdHJveSBt ZW51IGl0ZW1zCgkJdGhpcy5lbGVtZW50LmZpbmQoICIudWktbWVudS1pdGVtIiAp CgkJCS5yZW1vdmVDbGFzcyggInVpLW1lbnUtaXRlbSIgKQoJCQkucmVtb3ZlQXR0 ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWRpc2FibGVkIiApCgkJ CS5jaGlsZHJlbiggImEiICkKCQkJCS5yZW1vdmVVbmlxdWVJZCgpCgkJCQkucmVt b3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWhvdmVyIiApCgkJCQku cmVtb3ZlQXR0ciggInRhYkluZGV4IiApCgkJCQkucmVtb3ZlQXR0ciggInJvbGUi ICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oYXNwb3B1cCIgKQoJCQkJLmNoaWxk cmVuKCkuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQkJdmFyIGVsZW0gPSAkKCB0aGlz ICk7CgkJCQkJaWYgKCBlbGVtLmRhdGEoICJ1aS1tZW51LXN1Ym1lbnUtY2FyYXQi ICkgKSB7CgkJCQkJCWVsZW0ucmVtb3ZlKCk7CgkJCQkJfQoJCQkJfSk7CgoJCS8v IERlc3Ryb3kgbWVudSBkaXZpZGVycwoJCXRoaXMuZWxlbWVudC5maW5kKCAiLnVp LW1lbnUtZGl2aWRlciIgKS5yZW1vdmVDbGFzcyggInVpLW1lbnUtZGl2aWRlciB1 aS13aWRnZXQtY29udGVudCIgKTsKCX0sCgoJX2tleWRvd246IGZ1bmN0aW9uKCBl dmVudCApIHsKCQkvKmpzaGludCBtYXhjb21wbGV4aXR5OjIwKi8KCQl2YXIgbWF0 Y2gsIHByZXYsIGNoYXJhY3Rlciwgc2tpcCwgcmVnZXgsCgkJCXByZXZlbnREZWZh dWx0ID0gdHJ1ZTsKCgkJZnVuY3Rpb24gZXNjYXBlKCB2YWx1ZSApIHsKCQkJcmV0 dXJuIHZhbHVlLnJlcGxhY2UoIC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9n LCAiXFwkJiIgKTsKCQl9CgoJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJ Y2FzZSAkLnVpLmtleUNvZGUuUEFHRV9VUDoKCQkJdGhpcy5wcmV2aW91c1BhZ2Uo IGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfRE9X TjoKCQkJdGhpcy5uZXh0UGFnZSggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAk LnVpLmtleUNvZGUuSE9NRToKCQkJdGhpcy5fbW92ZSggImZpcnN0IiwgImZpcnN0 IiwgZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNvZGUuRU5EOgoJ CQl0aGlzLl9tb3ZlKCAibGFzdCIsICJsYXN0IiwgZXZlbnQgKTsKCQkJYnJlYWs7 CgkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCXRoaXMucHJldmlvdXMoIGV2ZW50 ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCXRoaXMu bmV4dCggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNvZGUuTEVG VDoKCQkJdGhpcy5jb2xsYXBzZSggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAk LnVpLmtleUNvZGUuUklHSFQ6CgkJCWlmICggdGhpcy5hY3RpdmUgJiYgIXRoaXMu YWN0aXZlLmlzKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQkJdGhpcy5l eHBhbmQoIGV2ZW50ICk7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNv ZGUuRU5URVI6CgkJY2FzZSAkLnVpLmtleUNvZGUuU1BBQ0U6CgkJCXRoaXMuX2Fj dGl2YXRlKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5F U0NBUEU6CgkJCXRoaXMuY29sbGFwc2UoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWRl ZmF1bHQ6CgkJCXByZXZlbnREZWZhdWx0ID0gZmFsc2U7CgkJCXByZXYgPSB0aGlz LnByZXZpb3VzRmlsdGVyIHx8ICIiOwoJCQljaGFyYWN0ZXIgPSBTdHJpbmcuZnJv bUNoYXJDb2RlKCBldmVudC5rZXlDb2RlICk7CgkJCXNraXAgPSBmYWxzZTsKCgkJ CWNsZWFyVGltZW91dCggdGhpcy5maWx0ZXJUaW1lciApOwoKCQkJaWYgKCBjaGFy YWN0ZXIgPT09IHByZXYgKSB7CgkJCQlza2lwID0gdHJ1ZTsKCQkJfSBlbHNlIHsK CQkJCWNoYXJhY3RlciA9IHByZXYgKyBjaGFyYWN0ZXI7CgkJCX0KCgkJCXJlZ2V4 ID0gbmV3IFJlZ0V4cCggIl4iICsgZXNjYXBlKCBjaGFyYWN0ZXIgKSwgImkiICk7 CgkJCW1hdGNoID0gdGhpcy5hY3RpdmVNZW51LmNoaWxkcmVuKCAiLnVpLW1lbnUt aXRlbSIgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gcmVnZXgudGVz dCggJCggdGhpcyApLmNoaWxkcmVuKCAiYSIgKS50ZXh0KCkgKTsKCQkJfSk7CgkJ CW1hdGNoID0gc2tpcCAmJiBtYXRjaC5pbmRleCggdGhpcy5hY3RpdmUubmV4dCgp ICkgIT09IC0xID8KCQkJCXRoaXMuYWN0aXZlLm5leHRBbGwoICIudWktbWVudS1p dGVtIiApIDoKCQkJCW1hdGNoOwoKCQkJLy8gSWYgbm8gbWF0Y2hlcyBvbiB0aGUg Y3VycmVudCBmaWx0ZXIsIHJlc2V0IHRvIHRoZSBsYXN0IGNoYXJhY3RlciBwcmVz c2VkCgkJCS8vIHRvIG1vdmUgZG93biB0aGUgbWVudSB0byB0aGUgZmlyc3QgaXRl bSB0aGF0IHN0YXJ0cyB3aXRoIHRoYXQgY2hhcmFjdGVyCgkJCWlmICggIW1hdGNo Lmxlbmd0aCApIHsKCQkJCWNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUo IGV2ZW50LmtleUNvZGUgKTsKCQkJCXJlZ2V4ID0gbmV3IFJlZ0V4cCggIl4iICsg ZXNjYXBlKCBjaGFyYWN0ZXIgKSwgImkiICk7CgkJCQltYXRjaCA9IHRoaXMuYWN0 aXZlTWVudS5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iICkuZmlsdGVyKGZ1bmN0 aW9uKCkgewoJCQkJCXJldHVybiByZWdleC50ZXN0KCAkKCB0aGlzICkuY2hpbGRy ZW4oICJhIiApLnRleHQoKSApOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggbWF0Y2gu bGVuZ3RoICkgewoJCQkJdGhpcy5mb2N1cyggZXZlbnQsIG1hdGNoICk7CgkJCQlp ZiAoIG1hdGNoLmxlbmd0aCA+IDEgKSB7CgkJCQkJdGhpcy5wcmV2aW91c0ZpbHRl ciA9IGNoYXJhY3RlcjsKCQkJCQl0aGlzLmZpbHRlclRpbWVyID0gdGhpcy5fZGVs YXkoZnVuY3Rpb24oKSB7CgkJCQkJCWRlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVy OwoJCQkJCX0sIDEwMDAgKTsKCQkJCX0gZWxzZSB7CgkJCQkJZGVsZXRlIHRoaXMu cHJldmlvdXNGaWx0ZXI7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgdGhp cy5wcmV2aW91c0ZpbHRlcjsKCQkJfQoJCX0KCgkJaWYgKCBwcmV2ZW50RGVmYXVs dCApIHsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9LAoKCV9hY3Rp dmF0ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggIXRoaXMuYWN0aXZlLmlz KCAiLnVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQlpZiAoIHRoaXMuYWN0aXZl LmNoaWxkcmVuKCAiYVthcmlhLWhhc3BvcHVwPSd0cnVlJ10iICkubGVuZ3RoICkg ewoJCQkJdGhpcy5leHBhbmQoIGV2ZW50ICk7CgkJCX0gZWxzZSB7CgkJCQl0aGlz LnNlbGVjdCggZXZlbnQgKTsKCQkJfQoJCX0KCX0sCgoJcmVmcmVzaDogZnVuY3Rp b24oKSB7CgkJdmFyIG1lbnVzLAoJCQlpY29uID0gdGhpcy5vcHRpb25zLmljb25z LnN1Ym1lbnUsCgkJCXN1Ym1lbnVzID0gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMu b3B0aW9ucy5tZW51cyApOwoKCQkvLyBJbml0aWFsaXplIG5lc3RlZCBtZW51cwoJ CXN1Ym1lbnVzLmZpbHRlciggIjpub3QoLnVpLW1lbnUpIiApCgkJCS5hZGRDbGFz cyggInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5l ci1hbGwiICkKCQkJLmhpZGUoKQoJCQkuYXR0cih7CgkJCQlyb2xlOiB0aGlzLm9w dGlvbnMucm9sZSwKCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIiwKCQkJCSJhcmlh LWV4cGFuZGVkIjogImZhbHNlIgoJCQl9KQoJCQkuZWFjaChmdW5jdGlvbigpIHsK CQkJCXZhciBtZW51ID0gJCggdGhpcyApLAoJCQkJCWl0ZW0gPSBtZW51LnByZXYo ICJhIiApLAoJCQkJCXN1Ym1lbnVDYXJhdCA9ICQoICI8c3Bhbj4iICkKCQkJCQkJ LmFkZENsYXNzKCAidWktbWVudS1pY29uIHVpLWljb24gIiArIGljb24gKQoJCQkJ CQkuZGF0YSggInVpLW1lbnUtc3VibWVudS1jYXJhdCIsIHRydWUgKTsKCgkJCQlp dGVtCgkJCQkJLmF0dHIoICJhcmlhLWhhc3BvcHVwIiwgInRydWUiICkKCQkJCQku cHJlcGVuZCggc3VibWVudUNhcmF0ICk7CgkJCQltZW51LmF0dHIoICJhcmlhLWxh YmVsbGVkYnkiLCBpdGVtLmF0dHIoICJpZCIgKSApOwoJCQl9KTsKCgkJbWVudXMg PSBzdWJtZW51cy5hZGQoIHRoaXMuZWxlbWVudCApOwoKCQkvLyBEb24ndCByZWZy ZXNoIGxpc3QgaXRlbXMgdGhhdCBhcmUgYWxyZWFkeSBhZGFwdGVkCgkJbWVudXMu Y2hpbGRyZW4oICI6bm90KC51aS1tZW51LWl0ZW0pOmhhcyhhKSIgKQoJCQkuYWRk Q2xhc3MoICJ1aS1tZW51LWl0ZW0iICkKCQkJLmF0dHIoICJyb2xlIiwgInByZXNl bnRhdGlvbiIgKQoJCQkuY2hpbGRyZW4oICJhIiApCgkJCQkudW5pcXVlSWQoKQoJ CQkJLmFkZENsYXNzKCAidWktY29ybmVyLWFsbCIgKQoJCQkJLmF0dHIoewoJCQkJ CXRhYkluZGV4OiAtMSwKCQkJCQlyb2xlOiB0aGlzLl9pdGVtUm9sZSgpCgkJCQl9 KTsKCgkJLy8gSW5pdGlhbGl6ZSB1bmxpbmtlZCBtZW51LWl0ZW1zIGNvbnRhaW5p bmcgc3BhY2VzIGFuZC9vciBkYXNoZXMgb25seSBhcyBkaXZpZGVycwoJCW1lbnVz LmNoaWxkcmVuKCAiOm5vdCgudWktbWVudS1pdGVtKSIgKS5lYWNoKGZ1bmN0aW9u KCkgewoJCQl2YXIgaXRlbSA9ICQoIHRoaXMgKTsKCQkJLy8gaHlwaGVuLCBlbSBk YXNoLCBlbiBkYXNoCgkJCWlmICggIS9bXlwt4oCU4oCTXHNdLy50ZXN0KCBpdGVt LnRleHQoKSApICkgewoJCQkJaXRlbS5hZGRDbGFzcyggInVpLXdpZGdldC1jb250 ZW50IHVpLW1lbnUtZGl2aWRlciIgKTsKCQkJfQoJCX0pOwoKCQkvLyBBZGQgYXJp YS1kaXNhYmxlZCBhdHRyaWJ1dGUgdG8gYW55IGRpc2FibGVkIG1lbnUgaXRlbQoJ CW1lbnVzLmNoaWxkcmVuKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApLmF0dHIoICJh cmlhLWRpc2FibGVkIiwgInRydWUiICk7CgoJCS8vIElmIHRoZSBhY3RpdmUgaXRl bSBoYXMgYmVlbiByZW1vdmVkLCBibHVyIHRoZSBtZW51CgkJaWYgKCB0aGlzLmFj dGl2ZSAmJiAhJC5jb250YWlucyggdGhpcy5lbGVtZW50WyAwIF0sIHRoaXMuYWN0 aXZlWyAwIF0gKSApIHsKCQkJdGhpcy5ibHVyKCk7CgkJfQoJfSwKCglfaXRlbVJv bGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCW1lbnU6ICJtZW51aXRlbSIs CgkJCWxpc3Rib3g6ICJvcHRpb24iCgkJfVsgdGhpcy5vcHRpb25zLnJvbGUgXTsK CX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYg KCBrZXkgPT09ICJpY29ucyIgKSB7CgkJCXRoaXMuZWxlbWVudC5maW5kKCAiLnVp LW1lbnUtaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuaWNv bnMuc3VibWVudSApCgkJCQkuYWRkQ2xhc3MoIHZhbHVlLnN1Ym1lbnUgKTsKCQl9 CgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCX0sCgoJZm9jdXM6IGZ1bmN0 aW9uKCBldmVudCwgaXRlbSApIHsKCQl2YXIgbmVzdGVkLCBmb2N1c2VkOwoJCXRo aXMuYmx1ciggZXZlbnQsIGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICJmb2N1cyIg KTsKCgkJdGhpcy5fc2Nyb2xsSW50b1ZpZXcoIGl0ZW0gKTsKCgkJdGhpcy5hY3Rp dmUgPSBpdGVtLmZpcnN0KCk7CgkJZm9jdXNlZCA9IHRoaXMuYWN0aXZlLmNoaWxk cmVuKCAiYSIgKS5hZGRDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCS8vIE9u bHkgdXBkYXRlIGFyaWEtYWN0aXZlZGVzY2VuZGFudCBpZiB0aGVyZSdzIGEgcm9s ZQoJCS8vIG90aGVyd2lzZSB3ZSBhc3N1bWUgZm9jdXMgaXMgbWFuYWdlZCBlbHNl d2hlcmUKCQlpZiAoIHRoaXMub3B0aW9ucy5yb2xlICkgewoJCQl0aGlzLmVsZW1l bnQuYXR0ciggImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsIGZvY3VzZWQuYXR0cigg ImlkIiApICk7CgkJfQoKCQkvLyBIaWdobGlnaHQgYWN0aXZlIHBhcmVudCBtZW51 IGl0ZW0sIGlmIGFueQoJCXRoaXMuYWN0aXZlCgkJCS5wYXJlbnQoKQoJCQkuY2xv c2VzdCggIi51aS1tZW51LWl0ZW0iICkKCQkJLmNoaWxkcmVuKCAiYTpmaXJzdCIg KQoJCQkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgoJCWlmICggZXZl bnQgJiYgZXZlbnQudHlwZSA9PT0gImtleWRvd24iICkgewoJCQl0aGlzLl9jbG9z ZSgpOwoJCX0gZWxzZSB7CgkJCXRoaXMudGltZXIgPSB0aGlzLl9kZWxheShmdW5j dGlvbigpIHsKCQkJCXRoaXMuX2Nsb3NlKCk7CgkJCX0sIHRoaXMuZGVsYXkgKTsK CQl9CgoJCW5lc3RlZCA9IGl0ZW0uY2hpbGRyZW4oICIudWktbWVudSIgKTsKCQlp ZiAoIG5lc3RlZC5sZW5ndGggJiYgKCAvXm1vdXNlLy50ZXN0KCBldmVudC50eXBl ICkgKSApIHsKCQkJdGhpcy5fc3RhcnRPcGVuaW5nKG5lc3RlZCk7CgkJfQoJCXRo aXMuYWN0aXZlTWVudSA9IGl0ZW0ucGFyZW50KCk7CgoJCXRoaXMuX3RyaWdnZXIo ICJmb2N1cyIsIGV2ZW50LCB7IGl0ZW06IGl0ZW0gfSApOwoJfSwKCglfc2Nyb2xs SW50b1ZpZXc6IGZ1bmN0aW9uKCBpdGVtICkgewoJCXZhciBib3JkZXJUb3AsIHBh ZGRpbmdUb3AsIG9mZnNldCwgc2Nyb2xsLCBlbGVtZW50SGVpZ2h0LCBpdGVtSGVp Z2h0OwoJCWlmICggdGhpcy5faGFzU2Nyb2xsKCkgKSB7CgkJCWJvcmRlclRvcCA9 IHBhcnNlRmxvYXQoICQuY3NzKCB0aGlzLmFjdGl2ZU1lbnVbMF0sICJib3JkZXJU b3BXaWR0aCIgKSApIHx8IDA7CgkJCXBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KCAk LmNzcyggdGhpcy5hY3RpdmVNZW51WzBdLCAicGFkZGluZ1RvcCIgKSApIHx8IDA7 CgkJCW9mZnNldCA9IGl0ZW0ub2Zmc2V0KCkudG9wIC0gdGhpcy5hY3RpdmVNZW51 Lm9mZnNldCgpLnRvcCAtIGJvcmRlclRvcCAtIHBhZGRpbmdUb3A7CgkJCXNjcm9s bCA9IHRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKTsKCQkJZWxlbWVudEhlaWdo dCA9IHRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKTsKCQkJaXRlbUhlaWdodCA9IGl0 ZW0uaGVpZ2h0KCk7CgoJCQlpZiAoIG9mZnNldCA8IDAgKSB7CgkJCQl0aGlzLmFj dGl2ZU1lbnUuc2Nyb2xsVG9wKCBzY3JvbGwgKyBvZmZzZXQgKTsKCQkJfSBlbHNl IGlmICggb2Zmc2V0ICsgaXRlbUhlaWdodCA+IGVsZW1lbnRIZWlnaHQgKSB7CgkJ CQl0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKCBzY3JvbGwgKyBvZmZzZXQgLSBl bGVtZW50SGVpZ2h0ICsgaXRlbUhlaWdodCApOwoJCQl9CgkJfQoJfSwKCglibHVy OiBmdW5jdGlvbiggZXZlbnQsIGZyb21Gb2N1cyApIHsKCQlpZiAoICFmcm9tRm9j dXMgKSB7CgkJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCX0KCgkJaWYg KCAhdGhpcy5hY3RpdmUgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuYWN0aXZl LmNoaWxkcmVuKCAiYSIgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiAp OwoJCXRoaXMuYWN0aXZlID0gbnVsbDsKCgkJdGhpcy5fdHJpZ2dlciggImJsdXIi LCBldmVudCwgeyBpdGVtOiB0aGlzLmFjdGl2ZSB9ICk7Cgl9LAoKCV9zdGFydE9w ZW5pbmc6IGZ1bmN0aW9uKCBzdWJtZW51ICkgewoJCWNsZWFyVGltZW91dCggdGhp cy50aW1lciApOwoKCQkvLyBEb24ndCBvcGVuIGlmIGFscmVhZHkgb3BlbiBmaXhl cyBhIEZpcmVmb3ggYnVnIHRoYXQgY2F1c2VkIGEgLjUgcGl4ZWwKCQkvLyBzaGlm dCBpbiB0aGUgc3VibWVudSBwb3NpdGlvbiB3aGVuIG1vdXNpbmcgb3ZlciB0aGUg Y2FyYXQgaWNvbgoJCWlmICggc3VibWVudS5hdHRyKCAiYXJpYS1oaWRkZW4iICkg IT09ICJ0cnVlIiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy50aW1lciA9IHRo aXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQl0aGlzLl9jbG9zZSgpOwoJCQl0aGlz Ll9vcGVuKCBzdWJtZW51ICk7CgkJfSwgdGhpcy5kZWxheSApOwoJfSwKCglfb3Bl bjogZnVuY3Rpb24oIHN1Ym1lbnUgKSB7CgkJdmFyIHBvc2l0aW9uID0gJC5leHRl bmQoewoJCQlvZjogdGhpcy5hY3RpdmUKCQl9LCB0aGlzLm9wdGlvbnMucG9zaXRp b24gKTsKCgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJdGhpcy5lbGVt ZW50LmZpbmQoICIudWktbWVudSIgKS5ub3QoIHN1Ym1lbnUucGFyZW50cyggIi51 aS1tZW51IiApICkKCQkJLmhpZGUoKQoJCQkuYXR0ciggImFyaWEtaGlkZGVuIiwg InRydWUiICk7CgoJCXN1Ym1lbnUKCQkJLnNob3coKQoJCQkucmVtb3ZlQXR0cigg ImFyaWEtaGlkZGVuIiApCgkJCS5hdHRyKCAiYXJpYS1leHBhbmRlZCIsICJ0cnVl IiApCgkJCS5wb3NpdGlvbiggcG9zaXRpb24gKTsKCX0sCgoJY29sbGFwc2VBbGw6 IGZ1bmN0aW9uKCBldmVudCwgYWxsICkgewoJCWNsZWFyVGltZW91dCggdGhpcy50 aW1lciApOwoJCXRoaXMudGltZXIgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsK CQkJLy8gSWYgd2Ugd2VyZSBwYXNzZWQgYW4gZXZlbnQsIGxvb2sgZm9yIHRoZSBz dWJtZW51IHRoYXQgY29udGFpbnMgdGhlIGV2ZW50CgkJCXZhciBjdXJyZW50TWVu dSA9IGFsbCA/IHRoaXMuZWxlbWVudCA6CgkJCQkkKCBldmVudCAmJiBldmVudC50 YXJnZXQgKS5jbG9zZXN0KCB0aGlzLmVsZW1lbnQuZmluZCggIi51aS1tZW51IiAp ICk7CgoJCQkvLyBJZiB3ZSBmb3VuZCBubyB2YWxpZCBzdWJtZW51IGFuY2VzdG9y LCB1c2UgdGhlIG1haW4gbWVudSB0byBjbG9zZSBhbGwgc3ViIG1lbnVzIGFueXdh eQoJCQlpZiAoICFjdXJyZW50TWVudS5sZW5ndGggKSB7CgkJCQljdXJyZW50TWVu dSA9IHRoaXMuZWxlbWVudDsKCQkJfQoKCQkJdGhpcy5fY2xvc2UoIGN1cnJlbnRN ZW51ICk7CgoJCQl0aGlzLmJsdXIoIGV2ZW50ICk7CgkJCXRoaXMuYWN0aXZlTWVu dSA9IGN1cnJlbnRNZW51OwoJCX0sIHRoaXMuZGVsYXkgKTsKCX0sCgoJLy8gV2l0 aCBubyBhcmd1bWVudHMsIGNsb3NlcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBtZW51 IC0gaWYgbm90aGluZyBpcyBhY3RpdmUKCS8vIGl0IGNsb3NlcyBhbGwgbWVudXMu ICBJZiBwYXNzZWQgYW4gYXJndW1lbnQsIGl0IHdpbGwgc2VhcmNoIGZvciBtZW51 cyBCRUxPVwoJX2Nsb3NlOiBmdW5jdGlvbiggc3RhcnRNZW51ICkgewoJCWlmICgg IXN0YXJ0TWVudSApIHsKCQkJc3RhcnRNZW51ID0gdGhpcy5hY3RpdmUgPyB0aGlz LmFjdGl2ZS5wYXJlbnQoKSA6IHRoaXMuZWxlbWVudDsKCQl9CgoJCXN0YXJ0TWVu dQoJCQkuZmluZCggIi51aS1tZW51IiApCgkJCQkuaGlkZSgpCgkJCQkuYXR0cigg ImFyaWEtaGlkZGVuIiwgInRydWUiICkKCQkJCS5hdHRyKCAiYXJpYS1leHBhbmRl ZCIsICJmYWxzZSIgKQoJCQkuZW5kKCkKCQkJLmZpbmQoICJhLnVpLXN0YXRlLWFj dGl2ZSIgKQoJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJ fSwKCgljb2xsYXBzZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBuZXdJdGVt ID0gdGhpcy5hY3RpdmUgJiYKCQkJdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2Vz dCggIi51aS1tZW51LWl0ZW0iLCB0aGlzLmVsZW1lbnQgKTsKCQlpZiAoIG5ld0l0 ZW0gJiYgbmV3SXRlbS5sZW5ndGggKSB7CgkJCXRoaXMuX2Nsb3NlKCk7CgkJCXRo aXMuZm9jdXMoIGV2ZW50LCBuZXdJdGVtICk7CgkJfQoJfSwKCglleHBhbmQ6IGZ1 bmN0aW9uKCBldmVudCApIHsKCQl2YXIgbmV3SXRlbSA9IHRoaXMuYWN0aXZlICYm CgkJCXRoaXMuYWN0aXZlCgkJCQkuY2hpbGRyZW4oICIudWktbWVudSAiICkKCQkJ CS5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iICkKCQkJCS5maXJzdCgpOwoKCQlp ZiAoIG5ld0l0ZW0gJiYgbmV3SXRlbS5sZW5ndGggKSB7CgkJCXRoaXMuX29wZW4o IG5ld0l0ZW0ucGFyZW50KCkgKTsKCgkJCS8vIERlbGF5IHNvIEZpcmVmb3ggd2ls bCBub3QgaGlkZSBhY3RpdmVkZXNjZW5kYW50IGNoYW5nZSBpbiBleHBhbmRpbmcg c3VibWVudSBmcm9tIEFUCgkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJ dGhpcy5mb2N1cyggZXZlbnQsIG5ld0l0ZW0gKTsKCQkJfSk7CgkJfQoJfSwKCglu ZXh0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdGhpcy5fbW92ZSggIm5leHQiLCAi Zmlyc3QiLCBldmVudCApOwoJfSwKCglwcmV2aW91czogZnVuY3Rpb24oIGV2ZW50 ICkgewoJCXRoaXMuX21vdmUoICJwcmV2IiwgImxhc3QiLCBldmVudCApOwoJfSwK Cglpc0ZpcnN0SXRlbTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuYWN0aXZl ICYmICF0aGlzLmFjdGl2ZS5wcmV2QWxsKCAiLnVpLW1lbnUtaXRlbSIgKS5sZW5n dGg7Cgl9LAoKCWlzTGFzdEl0ZW06IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlz LmFjdGl2ZSAmJiAhdGhpcy5hY3RpdmUubmV4dEFsbCggIi51aS1tZW51LWl0ZW0i ICkubGVuZ3RoOwoJfSwKCglfbW92ZTogZnVuY3Rpb24oIGRpcmVjdGlvbiwgZmls dGVyLCBldmVudCApIHsKCQl2YXIgbmV4dDsKCQlpZiAoIHRoaXMuYWN0aXZlICkg ewoJCQlpZiAoIGRpcmVjdGlvbiA9PT0gImZpcnN0IiB8fCBkaXJlY3Rpb24gPT09 ICJsYXN0IiApIHsKCQkJCW5leHQgPSB0aGlzLmFjdGl2ZQoJCQkJCVsgZGlyZWN0 aW9uID09PSAiZmlyc3QiID8gInByZXZBbGwiIDogIm5leHRBbGwiIF0oICIudWkt bWVudS1pdGVtIiApCgkJCQkJLmVxKCAtMSApOwoJCQl9IGVsc2UgewoJCQkJbmV4 dCA9IHRoaXMuYWN0aXZlCgkJCQkJWyBkaXJlY3Rpb24gKyAiQWxsIiBdKCAiLnVp LW1lbnUtaXRlbSIgKQoJCQkJCS5lcSggMCApOwoJCQl9CgkJfQoJCWlmICggIW5l eHQgfHwgIW5leHQubGVuZ3RoIHx8ICF0aGlzLmFjdGl2ZSApIHsKCQkJbmV4dCA9 IHRoaXMuYWN0aXZlTWVudS5jaGlsZHJlbiggIi51aS1tZW51LWl0ZW0iIClbIGZp bHRlciBdKCk7CgkJfQoKCQl0aGlzLmZvY3VzKCBldmVudCwgbmV4dCApOwoJfSwK CgluZXh0UGFnZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBpdGVtLCBiYXNl LCBoZWlnaHQ7CgoJCWlmICggIXRoaXMuYWN0aXZlICkgewoJCQl0aGlzLm5leHQo IGV2ZW50ICk7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLmlzTGFzdEl0ZW0o KSApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIHRoaXMuX2hhc1Njcm9sbCgpICkg ewoJCQliYXNlID0gdGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wOwoJCQloZWlnaHQg PSB0aGlzLmVsZW1lbnQuaGVpZ2h0KCk7CgkJCXRoaXMuYWN0aXZlLm5leHRBbGwo ICIudWktbWVudS1pdGVtIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpdGVtID0g JCggdGhpcyApOwoJCQkJcmV0dXJuIGl0ZW0ub2Zmc2V0KCkudG9wIC0gYmFzZSAt IGhlaWdodCA8IDA7CgkJCX0pOwoKCQkJdGhpcy5mb2N1cyggZXZlbnQsIGl0ZW0g KTsKCQl9IGVsc2UgewoJCQl0aGlzLmZvY3VzKCBldmVudCwgdGhpcy5hY3RpdmVN ZW51LmNoaWxkcmVuKCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkJWyAhdGhpcy5hY3Rp dmUgPyAiZmlyc3QiIDogImxhc3QiIF0oKSApOwoJCX0KCX0sCgoJcHJldmlvdXNQ YWdlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIGl0ZW0sIGJhc2UsIGhlaWdo dDsKCQlpZiAoICF0aGlzLmFjdGl2ZSApIHsKCQkJdGhpcy5uZXh0KCBldmVudCAp OwoJCQlyZXR1cm47CgkJfQoJCWlmICggdGhpcy5pc0ZpcnN0SXRlbSgpICkgewoJ CQlyZXR1cm47CgkJfQoJCWlmICggdGhpcy5faGFzU2Nyb2xsKCkgKSB7CgkJCWJh c2UgPSB0aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3A7CgkJCWhlaWdodCA9IHRoaXMu ZWxlbWVudC5oZWlnaHQoKTsKCQkJdGhpcy5hY3RpdmUucHJldkFsbCggIi51aS1t ZW51LWl0ZW0iICkuZWFjaChmdW5jdGlvbigpIHsKCQkJCWl0ZW0gPSAkKCB0aGlz ICk7CgkJCQlyZXR1cm4gaXRlbS5vZmZzZXQoKS50b3AgLSBiYXNlICsgaGVpZ2h0 ID4gMDsKCQkJfSk7CgoJCQl0aGlzLmZvY3VzKCBldmVudCwgaXRlbSApOwoJCX0g ZWxzZSB7CgkJCXRoaXMuZm9jdXMoIGV2ZW50LCB0aGlzLmFjdGl2ZU1lbnUuY2hp bGRyZW4oICIudWktbWVudS1pdGVtIiApLmZpcnN0KCkgKTsKCQl9Cgl9LAoKCV9o YXNTY3JvbGw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVsZW1lbnQub3V0 ZXJIZWlnaHQoKSA8IHRoaXMuZWxlbWVudC5wcm9wKCAic2Nyb2xsSGVpZ2h0IiAp OwoJfSwKCglzZWxlY3Q6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkvLyBUT0RPOiBJ dCBzaG91bGQgbmV2ZXIgYmUgcG9zc2libGUgdG8gbm90IGhhdmUgYW4gYWN0aXZl IGl0ZW0gYXQgdGhpcwoJCS8vIHBvaW50LCBidXQgdGhlIHRlc3RzIGRvbid0IHRy aWdnZXIgbW91c2VlbnRlciBiZWZvcmUgY2xpY2suCgkJdGhpcy5hY3RpdmUgPSB0 aGlzLmFjdGl2ZSB8fCAkKCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCAiLnVpLW1l bnUtaXRlbSIgKTsKCQl2YXIgdWkgPSB7IGl0ZW06IHRoaXMuYWN0aXZlIH07CgkJ aWYgKCAhdGhpcy5hY3RpdmUuaGFzKCAiLnVpLW1lbnUiICkubGVuZ3RoICkgewoJ CQl0aGlzLmNvbGxhcHNlQWxsKCBldmVudCwgdHJ1ZSApOwoJCX0KCQl0aGlzLl90 cmlnZ2VyKCAic2VsZWN0IiwgZXZlbnQsIHVpICk7Cgl9Cn0pOwoKfSggalF1ZXJ5 ICkpOwoKKGZ1bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgokLnVpID0gJC51aSB8 fCB7fTsKCnZhciBjYWNoZWRTY3JvbGxiYXJXaWR0aCwKCW1heCA9IE1hdGgubWF4 LAoJYWJzID0gTWF0aC5hYnMsCglyb3VuZCA9IE1hdGgucm91bmQsCglyaG9yaXpv bnRhbCA9IC9sZWZ0fGNlbnRlcnxyaWdodC8sCglydmVydGljYWwgPSAvdG9wfGNl bnRlcnxib3R0b20vLAoJcm9mZnNldCA9IC9bXCtcLV1cZCslPy8sCglycG9zaXRp b24gPSAvXlx3Ky8sCglycGVyY2VudCA9IC8lJC8sCglfcG9zaXRpb24gPSAkLmZu LnBvc2l0aW9uOwoKZnVuY3Rpb24gZ2V0T2Zmc2V0cyggb2Zmc2V0cywgd2lkdGgs IGhlaWdodCApIHsKCXJldHVybiBbCgkJcGFyc2VJbnQoIG9mZnNldHNbIDAgXSwg MTAgKSAqICggcnBlcmNlbnQudGVzdCggb2Zmc2V0c1sgMCBdICkgPyB3aWR0aCAv IDEwMCA6IDEgKSwKCQlwYXJzZUludCggb2Zmc2V0c1sgMSBdLCAxMCApICogKCBy cGVyY2VudC50ZXN0KCBvZmZzZXRzWyAxIF0gKSA/IGhlaWdodCAvIDEwMCA6IDEg KQoJXTsKfQoKZnVuY3Rpb24gcGFyc2VDc3MoIGVsZW1lbnQsIHByb3BlcnR5ICkg ewoJcmV0dXJuIHBhcnNlSW50KCAkLmNzcyggZWxlbWVudCwgcHJvcGVydHkgKSwg MTAgKSB8fCAwOwp9CgpmdW5jdGlvbiBnZXREaW1lbnNpb25zKCBlbGVtICkgewoJ dmFyIHJhdyA9IGVsZW1bMF07CglpZiAoIHJhdy5ub2RlVHlwZSA9PT0gOSApIHsK CQlyZXR1cm4gewoJCQl3aWR0aDogZWxlbS53aWR0aCgpLAoJCQloZWlnaHQ6IGVs ZW0uaGVpZ2h0KCksCgkJCW9mZnNldDogeyB0b3A6IDAsIGxlZnQ6IDAgfQoJCX07 Cgl9CglpZiAoICQuaXNXaW5kb3coIHJhdyApICkgewoJCXJldHVybiB7CgkJCXdp ZHRoOiBlbGVtLndpZHRoKCksCgkJCWhlaWdodDogZWxlbS5oZWlnaHQoKSwKCQkJ b2Zmc2V0OiB7IHRvcDogZWxlbS5zY3JvbGxUb3AoKSwgbGVmdDogZWxlbS5zY3Jv bGxMZWZ0KCkgfQoJCX07Cgl9CglpZiAoIHJhdy5wcmV2ZW50RGVmYXVsdCApIHsK CQlyZXR1cm4gewoJCQl3aWR0aDogMCwKCQkJaGVpZ2h0OiAwLAoJCQlvZmZzZXQ6 IHsgdG9wOiByYXcucGFnZVksIGxlZnQ6IHJhdy5wYWdlWCB9CgkJfTsKCX0KCXJl dHVybiB7CgkJd2lkdGg6IGVsZW0ub3V0ZXJXaWR0aCgpLAoJCWhlaWdodDogZWxl bS5vdXRlckhlaWdodCgpLAoJCW9mZnNldDogZWxlbS5vZmZzZXQoKQoJfTsKfQoK JC5wb3NpdGlvbiA9IHsKCXNjcm9sbGJhcldpZHRoOiBmdW5jdGlvbigpIHsKCQlp ZiAoIGNhY2hlZFNjcm9sbGJhcldpZHRoICE9PSB1bmRlZmluZWQgKSB7CgkJCXJl dHVybiBjYWNoZWRTY3JvbGxiYXJXaWR0aDsKCQl9CgkJdmFyIHcxLCB3MiwKCQkJ ZGl2ID0gJCggIjxkaXYgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7d2lkdGg6NTBweDto ZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Jz48ZGl2IHN0eWxlPSdoZWlnaHQ6 MTAwcHg7d2lkdGg6YXV0bzsnPjwvZGl2PjwvZGl2PiIgKSwKCQkJaW5uZXJEaXYg PSBkaXYuY2hpbGRyZW4oKVswXTsKCgkJJCggImJvZHkiICkuYXBwZW5kKCBkaXYg KTsKCQl3MSA9IGlubmVyRGl2Lm9mZnNldFdpZHRoOwoJCWRpdi5jc3MoICJvdmVy ZmxvdyIsICJzY3JvbGwiICk7CgoJCXcyID0gaW5uZXJEaXYub2Zmc2V0V2lkdGg7 CgoJCWlmICggdzEgPT09IHcyICkgewoJCQl3MiA9IGRpdlswXS5jbGllbnRXaWR0 aDsKCQl9CgoJCWRpdi5yZW1vdmUoKTsKCgkJcmV0dXJuIChjYWNoZWRTY3JvbGxi YXJXaWR0aCA9IHcxIC0gdzIpOwoJfSwKCWdldFNjcm9sbEluZm86IGZ1bmN0aW9u KCB3aXRoaW4gKSB7CgkJdmFyIG92ZXJmbG93WCA9IHdpdGhpbi5pc1dpbmRvdyA/ ICIiIDogd2l0aGluLmVsZW1lbnQuY3NzKCAib3ZlcmZsb3cteCIgKSwKCQkJb3Zl cmZsb3dZID0gd2l0aGluLmlzV2luZG93ID8gIiIgOiB3aXRoaW4uZWxlbWVudC5j c3MoICJvdmVyZmxvdy15IiApLAoJCQloYXNPdmVyZmxvd1ggPSBvdmVyZmxvd1gg PT09ICJzY3JvbGwiIHx8CgkJCQkoIG92ZXJmbG93WCA9PT0gImF1dG8iICYmIHdp dGhpbi53aWR0aCA8IHdpdGhpbi5lbGVtZW50WzBdLnNjcm9sbFdpZHRoICksCgkJ CWhhc092ZXJmbG93WSA9IG92ZXJmbG93WSA9PT0gInNjcm9sbCIgfHwKCQkJCSgg b3ZlcmZsb3dZID09PSAiYXV0byIgJiYgd2l0aGluLmhlaWdodCA8IHdpdGhpbi5l bGVtZW50WzBdLnNjcm9sbEhlaWdodCApOwoJCXJldHVybiB7CgkJCXdpZHRoOiBo YXNPdmVyZmxvd1ggPyAkLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCkgOiAwLAoJ CQloZWlnaHQ6IGhhc092ZXJmbG93WSA/ICQucG9zaXRpb24uc2Nyb2xsYmFyV2lk dGgoKSA6IDAKCQl9OwoJfSwKCWdldFdpdGhpbkluZm86IGZ1bmN0aW9uKCBlbGVt ZW50ICkgewoJCXZhciB3aXRoaW5FbGVtZW50ID0gJCggZWxlbWVudCB8fCB3aW5k b3cgKSwKCQkJaXNXaW5kb3cgPSAkLmlzV2luZG93KCB3aXRoaW5FbGVtZW50WzBd ICk7CgkJcmV0dXJuIHsKCQkJZWxlbWVudDogd2l0aGluRWxlbWVudCwKCQkJaXNX aW5kb3c6IGlzV2luZG93LAoJCQlvZmZzZXQ6IHdpdGhpbkVsZW1lbnQub2Zmc2V0 KCkgfHwgeyBsZWZ0OiAwLCB0b3A6IDAgfSwKCQkJc2Nyb2xsTGVmdDogd2l0aGlu RWxlbWVudC5zY3JvbGxMZWZ0KCksCgkJCXNjcm9sbFRvcDogd2l0aGluRWxlbWVu dC5zY3JvbGxUb3AoKSwKCQkJd2lkdGg6IGlzV2luZG93ID8gd2l0aGluRWxlbWVu dC53aWR0aCgpIDogd2l0aGluRWxlbWVudC5vdXRlcldpZHRoKCksCgkJCWhlaWdo dDogaXNXaW5kb3cgPyB3aXRoaW5FbGVtZW50LmhlaWdodCgpIDogd2l0aGluRWxl bWVudC5vdXRlckhlaWdodCgpCgkJfTsKCX0KfTsKCiQuZm4ucG9zaXRpb24gPSBm dW5jdGlvbiggb3B0aW9ucyApIHsKCWlmICggIW9wdGlvbnMgfHwgIW9wdGlvbnMu b2YgKSB7CgkJcmV0dXJuIF9wb3NpdGlvbi5hcHBseSggdGhpcywgYXJndW1lbnRz ICk7Cgl9CgoJLy8gbWFrZSBhIGNvcHksIHdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5 IGFyZ3VtZW50cwoJb3B0aW9ucyA9ICQuZXh0ZW5kKCB7fSwgb3B0aW9ucyApOwoK CXZhciBhdE9mZnNldCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgdGFyZ2V0 T2Zmc2V0LCBiYXNlUG9zaXRpb24sIGRpbWVuc2lvbnMsCgkJdGFyZ2V0ID0gJCgg b3B0aW9ucy5vZiApLAoJCXdpdGhpbiA9ICQucG9zaXRpb24uZ2V0V2l0aGluSW5m byggb3B0aW9ucy53aXRoaW4gKSwKCQlzY3JvbGxJbmZvID0gJC5wb3NpdGlvbi5n ZXRTY3JvbGxJbmZvKCB3aXRoaW4gKSwKCQljb2xsaXNpb24gPSAoIG9wdGlvbnMu Y29sbGlzaW9uIHx8ICJmbGlwIiApLnNwbGl0KCAiICIgKSwKCQlvZmZzZXRzID0g e307CgoJZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoIHRhcmdldCApOwoJaWYg KCB0YXJnZXRbMF0ucHJldmVudERlZmF1bHQgKSB7CgkJLy8gZm9yY2UgbGVmdCB0 b3AgdG8gYWxsb3cgZmxpcHBpbmcKCQlvcHRpb25zLmF0ID0gImxlZnQgdG9wIjsK CX0KCXRhcmdldFdpZHRoID0gZGltZW5zaW9ucy53aWR0aDsKCXRhcmdldEhlaWdo dCA9IGRpbWVuc2lvbnMuaGVpZ2h0OwoJdGFyZ2V0T2Zmc2V0ID0gZGltZW5zaW9u cy5vZmZzZXQ7CgkvLyBjbG9uZSB0byByZXVzZSBvcmlnaW5hbCB0YXJnZXRPZmZz ZXQgbGF0ZXIKCWJhc2VQb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgdGFyZ2V0T2Zm c2V0ICk7CgoJLy8gZm9yY2UgbXkgYW5kIGF0IHRvIGhhdmUgdmFsaWQgaG9yaXpv bnRhbCBhbmQgdmVydGljYWwgcG9zaXRpb25zCgkvLyBpZiBhIHZhbHVlIGlzIG1p c3Npbmcgb3IgaW52YWxpZCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2VudGVy CgkkLmVhY2goIFsgIm15IiwgImF0IiBdLCBmdW5jdGlvbigpIHsKCQl2YXIgcG9z ID0gKCBvcHRpb25zWyB0aGlzIF0gfHwgIiIgKS5zcGxpdCggIiAiICksCgkJCWhv cml6b250YWxPZmZzZXQsCgkJCXZlcnRpY2FsT2Zmc2V0OwoKCQlpZiAoIHBvcy5s ZW5ndGggPT09IDEpIHsKCQkJcG9zID0gcmhvcml6b250YWwudGVzdCggcG9zWyAw IF0gKSA/CgkJCQlwb3MuY29uY2F0KCBbICJjZW50ZXIiIF0gKSA6CgkJCQlydmVy dGljYWwudGVzdCggcG9zWyAwIF0gKSA/CgkJCQkJWyAiY2VudGVyIiBdLmNvbmNh dCggcG9zICkgOgoJCQkJCVsgImNlbnRlciIsICJjZW50ZXIiIF07CgkJfQoJCXBv c1sgMCBdID0gcmhvcml6b250YWwudGVzdCggcG9zWyAwIF0gKSA/IHBvc1sgMCBd IDogImNlbnRlciI7CgkJcG9zWyAxIF0gPSBydmVydGljYWwudGVzdCggcG9zWyAx IF0gKSA/IHBvc1sgMSBdIDogImNlbnRlciI7CgoJCS8vIGNhbGN1bGF0ZSBvZmZz ZXRzCgkJaG9yaXpvbnRhbE9mZnNldCA9IHJvZmZzZXQuZXhlYyggcG9zWyAwIF0g KTsKCQl2ZXJ0aWNhbE9mZnNldCA9IHJvZmZzZXQuZXhlYyggcG9zWyAxIF0gKTsK CQlvZmZzZXRzWyB0aGlzIF0gPSBbCgkJCWhvcml6b250YWxPZmZzZXQgPyBob3Jp em9udGFsT2Zmc2V0WyAwIF0gOiAwLAoJCQl2ZXJ0aWNhbE9mZnNldCA/IHZlcnRp Y2FsT2Zmc2V0WyAwIF0gOiAwCgkJXTsKCgkJLy8gcmVkdWNlIHRvIGp1c3QgdGhl IHBvc2l0aW9ucyB3aXRob3V0IHRoZSBvZmZzZXRzCgkJb3B0aW9uc1sgdGhpcyBd ID0gWwoJCQlycG9zaXRpb24uZXhlYyggcG9zWyAwIF0gKVsgMCBdLAoJCQlycG9z aXRpb24uZXhlYyggcG9zWyAxIF0gKVsgMCBdCgkJXTsKCX0pOwoKCS8vIG5vcm1h bGl6ZSBjb2xsaXNpb24gb3B0aW9uCglpZiAoIGNvbGxpc2lvbi5sZW5ndGggPT09 IDEgKSB7CgkJY29sbGlzaW9uWyAxIF0gPSBjb2xsaXNpb25bIDAgXTsKCX0KCglp ZiAoIG9wdGlvbnMuYXRbIDAgXSA9PT0gInJpZ2h0IiApIHsKCQliYXNlUG9zaXRp b24ubGVmdCArPSB0YXJnZXRXaWR0aDsKCX0gZWxzZSBpZiAoIG9wdGlvbnMuYXRb IDAgXSA9PT0gImNlbnRlciIgKSB7CgkJYmFzZVBvc2l0aW9uLmxlZnQgKz0gdGFy Z2V0V2lkdGggLyAyOwoJfQoKCWlmICggb3B0aW9ucy5hdFsgMSBdID09PSAiYm90 dG9tIiApIHsKCQliYXNlUG9zaXRpb24udG9wICs9IHRhcmdldEhlaWdodDsKCX0g ZWxzZSBpZiAoIG9wdGlvbnMuYXRbIDEgXSA9PT0gImNlbnRlciIgKSB7CgkJYmFz ZVBvc2l0aW9uLnRvcCArPSB0YXJnZXRIZWlnaHQgLyAyOwoJfQoKCWF0T2Zmc2V0 ID0gZ2V0T2Zmc2V0cyggb2Zmc2V0cy5hdCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhl aWdodCApOwoJYmFzZVBvc2l0aW9uLmxlZnQgKz0gYXRPZmZzZXRbIDAgXTsKCWJh c2VQb3NpdGlvbi50b3AgKz0gYXRPZmZzZXRbIDEgXTsKCglyZXR1cm4gdGhpcy5l YWNoKGZ1bmN0aW9uKCkgewoJCXZhciBjb2xsaXNpb25Qb3NpdGlvbiwgdXNpbmcs CgkJCWVsZW0gPSAkKCB0aGlzICksCgkJCWVsZW1XaWR0aCA9IGVsZW0ub3V0ZXJX aWR0aCgpLAoJCQllbGVtSGVpZ2h0ID0gZWxlbS5vdXRlckhlaWdodCgpLAoJCQlt YXJnaW5MZWZ0ID0gcGFyc2VDc3MoIHRoaXMsICJtYXJnaW5MZWZ0IiApLAoJCQlt YXJnaW5Ub3AgPSBwYXJzZUNzcyggdGhpcywgIm1hcmdpblRvcCIgKSwKCQkJY29s bGlzaW9uV2lkdGggPSBlbGVtV2lkdGggKyBtYXJnaW5MZWZ0ICsgcGFyc2VDc3Mo IHRoaXMsICJtYXJnaW5SaWdodCIgKSArIHNjcm9sbEluZm8ud2lkdGgsCgkJCWNv bGxpc2lvbkhlaWdodCA9IGVsZW1IZWlnaHQgKyBtYXJnaW5Ub3AgKyBwYXJzZUNz cyggdGhpcywgIm1hcmdpbkJvdHRvbSIgKSArIHNjcm9sbEluZm8uaGVpZ2h0LAoJ CQlwb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgYmFzZVBvc2l0aW9uICksCgkJCW15 T2Zmc2V0ID0gZ2V0T2Zmc2V0cyggb2Zmc2V0cy5teSwgZWxlbS5vdXRlcldpZHRo KCksIGVsZW0ub3V0ZXJIZWlnaHQoKSApOwoKCQlpZiAoIG9wdGlvbnMubXlbIDAg XSA9PT0gInJpZ2h0IiApIHsKCQkJcG9zaXRpb24ubGVmdCAtPSBlbGVtV2lkdGg7 CgkJfSBlbHNlIGlmICggb3B0aW9ucy5teVsgMCBdID09PSAiY2VudGVyIiApIHsK CQkJcG9zaXRpb24ubGVmdCAtPSBlbGVtV2lkdGggLyAyOwoJCX0KCgkJaWYgKCBv cHRpb25zLm15WyAxIF0gPT09ICJib3R0b20iICkgewoJCQlwb3NpdGlvbi50b3Ag LT0gZWxlbUhlaWdodDsKCQl9IGVsc2UgaWYgKCBvcHRpb25zLm15WyAxIF0gPT09 ICJjZW50ZXIiICkgewoJCQlwb3NpdGlvbi50b3AgLT0gZWxlbUhlaWdodCAvIDI7 CgkJfQoKCQlwb3NpdGlvbi5sZWZ0ICs9IG15T2Zmc2V0WyAwIF07CgkJcG9zaXRp b24udG9wICs9IG15T2Zmc2V0WyAxIF07CgoJCS8vIGlmIHRoZSBicm93c2VyIGRv ZXNuJ3Qgc3VwcG9ydCBmcmFjdGlvbnMsIHRoZW4gcm91bmQgZm9yIGNvbnNpc3Rl bnQgcmVzdWx0cwoJCWlmICggISQuc3VwcG9ydC5vZmZzZXRGcmFjdGlvbnMgKSB7 CgkJCXBvc2l0aW9uLmxlZnQgPSByb3VuZCggcG9zaXRpb24ubGVmdCApOwoJCQlw b3NpdGlvbi50b3AgPSByb3VuZCggcG9zaXRpb24udG9wICk7CgkJfQoKCQljb2xs aXNpb25Qb3NpdGlvbiA9IHsKCQkJbWFyZ2luTGVmdDogbWFyZ2luTGVmdCwKCQkJ bWFyZ2luVG9wOiBtYXJnaW5Ub3AKCQl9OwoKCQkkLmVhY2goIFsgImxlZnQiLCAi dG9wIiBdLCBmdW5jdGlvbiggaSwgZGlyICkgewoJCQlpZiAoICQudWkucG9zaXRp b25bIGNvbGxpc2lvblsgaSBdIF0gKSB7CgkJCQkkLnVpLnBvc2l0aW9uWyBjb2xs aXNpb25bIGkgXSBdWyBkaXIgXSggcG9zaXRpb24sIHsKCQkJCQl0YXJnZXRXaWR0 aDogdGFyZ2V0V2lkdGgsCgkJCQkJdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQs CgkJCQkJZWxlbVdpZHRoOiBlbGVtV2lkdGgsCgkJCQkJZWxlbUhlaWdodDogZWxl bUhlaWdodCwKCQkJCQljb2xsaXNpb25Qb3NpdGlvbjogY29sbGlzaW9uUG9zaXRp b24sCgkJCQkJY29sbGlzaW9uV2lkdGg6IGNvbGxpc2lvbldpZHRoLAoJCQkJCWNv bGxpc2lvbkhlaWdodDogY29sbGlzaW9uSGVpZ2h0LAoJCQkJCW9mZnNldDogWyBh dE9mZnNldFsgMCBdICsgbXlPZmZzZXRbIDAgXSwgYXRPZmZzZXQgWyAxIF0gKyBt eU9mZnNldFsgMSBdIF0sCgkJCQkJbXk6IG9wdGlvbnMubXksCgkJCQkJYXQ6IG9w dGlvbnMuYXQsCgkJCQkJd2l0aGluOiB3aXRoaW4sCgkJCQkJZWxlbSA6IGVsZW0K CQkJCX0pOwoJCQl9CgkJfSk7CgoJCWlmICggb3B0aW9ucy51c2luZyApIHsKCQkJ Ly8gYWRkcyBmZWVkYmFjayBhcyBzZWNvbmQgYXJndW1lbnQgdG8gdXNpbmcgY2Fs bGJhY2ssIGlmIHByZXNlbnQKCQkJdXNpbmcgPSBmdW5jdGlvbiggcHJvcHMgKSB7 CgkJCQl2YXIgbGVmdCA9IHRhcmdldE9mZnNldC5sZWZ0IC0gcG9zaXRpb24ubGVm dCwKCQkJCQlyaWdodCA9IGxlZnQgKyB0YXJnZXRXaWR0aCAtIGVsZW1XaWR0aCwK CQkJCQl0b3AgPSB0YXJnZXRPZmZzZXQudG9wIC0gcG9zaXRpb24udG9wLAoJCQkJ CWJvdHRvbSA9IHRvcCArIHRhcmdldEhlaWdodCAtIGVsZW1IZWlnaHQsCgkJCQkJ ZmVlZGJhY2sgPSB7CgkJCQkJCXRhcmdldDogewoJCQkJCQkJZWxlbWVudDogdGFy Z2V0LAoJCQkJCQkJbGVmdDogdGFyZ2V0T2Zmc2V0LmxlZnQsCgkJCQkJCQl0b3A6 IHRhcmdldE9mZnNldC50b3AsCgkJCQkJCQl3aWR0aDogdGFyZ2V0V2lkdGgsCgkJ CQkJCQloZWlnaHQ6IHRhcmdldEhlaWdodAoJCQkJCQl9LAoJCQkJCQllbGVtZW50 OiB7CgkJCQkJCQllbGVtZW50OiBlbGVtLAoJCQkJCQkJbGVmdDogcG9zaXRpb24u bGVmdCwKCQkJCQkJCXRvcDogcG9zaXRpb24udG9wLAoJCQkJCQkJd2lkdGg6IGVs ZW1XaWR0aCwKCQkJCQkJCWhlaWdodDogZWxlbUhlaWdodAoJCQkJCQl9LAoJCQkJ CQlob3Jpem9udGFsOiByaWdodCA8IDAgPyAibGVmdCIgOiBsZWZ0ID4gMCA/ICJy aWdodCIgOiAiY2VudGVyIiwKCQkJCQkJdmVydGljYWw6IGJvdHRvbSA8IDAgPyAi dG9wIiA6IHRvcCA+IDAgPyAiYm90dG9tIiA6ICJtaWRkbGUiCgkJCQkJfTsKCQkJ CWlmICggdGFyZ2V0V2lkdGggPCBlbGVtV2lkdGggJiYgYWJzKCBsZWZ0ICsgcmln aHQgKSA8IHRhcmdldFdpZHRoICkgewoJCQkJCWZlZWRiYWNrLmhvcml6b250YWwg PSAiY2VudGVyIjsKCQkJCX0KCQkJCWlmICggdGFyZ2V0SGVpZ2h0IDwgZWxlbUhl aWdodCAmJiBhYnMoIHRvcCArIGJvdHRvbSApIDwgdGFyZ2V0SGVpZ2h0ICkgewoJ CQkJCWZlZWRiYWNrLnZlcnRpY2FsID0gIm1pZGRsZSI7CgkJCQl9CgkJCQlpZiAo IG1heCggYWJzKCBsZWZ0ICksIGFicyggcmlnaHQgKSApID4gbWF4KCBhYnMoIHRv cCApLCBhYnMoIGJvdHRvbSApICkgKSB7CgkJCQkJZmVlZGJhY2suaW1wb3J0YW50 ID0gImhvcml6b250YWwiOwoJCQkJfSBlbHNlIHsKCQkJCQlmZWVkYmFjay5pbXBv cnRhbnQgPSAidmVydGljYWwiOwoJCQkJfQoJCQkJb3B0aW9ucy51c2luZy5jYWxs KCB0aGlzLCBwcm9wcywgZmVlZGJhY2sgKTsKCQkJfTsKCQl9CgoJCWVsZW0ub2Zm c2V0KCAkLmV4dGVuZCggcG9zaXRpb24sIHsgdXNpbmc6IHVzaW5nIH0gKSApOwoJ fSk7Cn07CgokLnVpLnBvc2l0aW9uID0gewoJZml0OiB7CgkJbGVmdDogZnVuY3Rp b24oIHBvc2l0aW9uLCBkYXRhICkgewoJCQl2YXIgd2l0aGluID0gZGF0YS53aXRo aW4sCgkJCQl3aXRoaW5PZmZzZXQgPSB3aXRoaW4uaXNXaW5kb3cgPyB3aXRoaW4u c2Nyb2xsTGVmdCA6IHdpdGhpbi5vZmZzZXQubGVmdCwKCQkJCW91dGVyV2lkdGgg PSB3aXRoaW4ud2lkdGgsCgkJCQljb2xsaXNpb25Qb3NMZWZ0ID0gcG9zaXRpb24u bGVmdCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCwKCQkJCW92 ZXJMZWZ0ID0gd2l0aGluT2Zmc2V0IC0gY29sbGlzaW9uUG9zTGVmdCwKCQkJCW92 ZXJSaWdodCA9IGNvbGxpc2lvblBvc0xlZnQgKyBkYXRhLmNvbGxpc2lvbldpZHRo IC0gb3V0ZXJXaWR0aCAtIHdpdGhpbk9mZnNldCwKCQkJCW5ld092ZXJSaWdodDsK CgkJCS8vIGVsZW1lbnQgaXMgd2lkZXIgdGhhbiB3aXRoaW4KCQkJaWYgKCBkYXRh LmNvbGxpc2lvbldpZHRoID4gb3V0ZXJXaWR0aCApIHsKCQkJCS8vIGVsZW1lbnQg aXMgaW5pdGlhbGx5IG92ZXIgdGhlIGxlZnQgc2lkZSBvZiB3aXRoaW4KCQkJCWlm ICggb3ZlckxlZnQgPiAwICYmIG92ZXJSaWdodCA8PSAwICkgewoJCQkJCW5ld092 ZXJSaWdodCA9IHBvc2l0aW9uLmxlZnQgKyBvdmVyTGVmdCArIGRhdGEuY29sbGlz aW9uV2lkdGggLSBvdXRlcldpZHRoIC0gd2l0aGluT2Zmc2V0OwoJCQkJCXBvc2l0 aW9uLmxlZnQgKz0gb3ZlckxlZnQgLSBuZXdPdmVyUmlnaHQ7CgkJCQkvLyBlbGVt ZW50IGlzIGluaXRpYWxseSBvdmVyIHJpZ2h0IHNpZGUgb2Ygd2l0aGluCgkJCQl9 IGVsc2UgaWYgKCBvdmVyUmlnaHQgPiAwICYmIG92ZXJMZWZ0IDw9IDAgKSB7CgkJ CQkJcG9zaXRpb24ubGVmdCA9IHdpdGhpbk9mZnNldDsKCQkJCS8vIGVsZW1lbnQg aXMgaW5pdGlhbGx5IG92ZXIgYm90aCBsZWZ0IGFuZCByaWdodCBzaWRlcyBvZiB3 aXRoaW4KCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCBvdmVyTGVmdCA+IG92ZXJSaWdo dCApIHsKCQkJCQkJcG9zaXRpb24ubGVmdCA9IHdpdGhpbk9mZnNldCArIG91dGVy V2lkdGggLSBkYXRhLmNvbGxpc2lvbldpZHRoOwoJCQkJCX0gZWxzZSB7CgkJCQkJ CXBvc2l0aW9uLmxlZnQgPSB3aXRoaW5PZmZzZXQ7CgkJCQkJfQoJCQkJfQoJCQkv LyB0b28gZmFyIGxlZnQgLT4gYWxpZ24gd2l0aCBsZWZ0IGVkZ2UKCQkJfSBlbHNl IGlmICggb3ZlckxlZnQgPiAwICkgewoJCQkJcG9zaXRpb24ubGVmdCArPSBvdmVy TGVmdDsKCQkJLy8gdG9vIGZhciByaWdodCAtPiBhbGlnbiB3aXRoIHJpZ2h0IGVk Z2UKCQkJfSBlbHNlIGlmICggb3ZlclJpZ2h0ID4gMCApIHsKCQkJCXBvc2l0aW9u LmxlZnQgLT0gb3ZlclJpZ2h0OwoJCQkvLyBhZGp1c3QgYmFzZWQgb24gcG9zaXRp b24gYW5kIG1hcmdpbgoJCQl9IGVsc2UgewoJCQkJcG9zaXRpb24ubGVmdCA9IG1h eCggcG9zaXRpb24ubGVmdCAtIGNvbGxpc2lvblBvc0xlZnQsIHBvc2l0aW9uLmxl ZnQgKTsKCQkJfQoJCX0sCgkJdG9wOiBmdW5jdGlvbiggcG9zaXRpb24sIGRhdGEg KSB7CgkJCXZhciB3aXRoaW4gPSBkYXRhLndpdGhpbiwKCQkJCXdpdGhpbk9mZnNl dCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxUb3AgOiB3aXRoaW4u b2Zmc2V0LnRvcCwKCQkJCW91dGVySGVpZ2h0ID0gZGF0YS53aXRoaW4uaGVpZ2h0 LAoJCQkJY29sbGlzaW9uUG9zVG9wID0gcG9zaXRpb24udG9wIC0gZGF0YS5jb2xs aXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsCgkJCQlvdmVyVG9wID0gd2l0aGluT2Zm c2V0IC0gY29sbGlzaW9uUG9zVG9wLAoJCQkJb3ZlckJvdHRvbSA9IGNvbGxpc2lv blBvc1RvcCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSB3 aXRoaW5PZmZzZXQsCgkJCQluZXdPdmVyQm90dG9tOwoKCQkJLy8gZWxlbWVudCBp cyB0YWxsZXIgdGhhbiB3aXRoaW4KCQkJaWYgKCBkYXRhLmNvbGxpc2lvbkhlaWdo dCA+IG91dGVySGVpZ2h0ICkgewoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkg b3ZlciB0aGUgdG9wIG9mIHdpdGhpbgoJCQkJaWYgKCBvdmVyVG9wID4gMCAmJiBv dmVyQm90dG9tIDw9IDAgKSB7CgkJCQkJbmV3T3ZlckJvdHRvbSA9IHBvc2l0aW9u LnRvcCArIG92ZXJUb3AgKyBkYXRhLmNvbGxpc2lvbkhlaWdodCAtIG91dGVySGVp Z2h0IC0gd2l0aGluT2Zmc2V0OwoJCQkJCXBvc2l0aW9uLnRvcCArPSBvdmVyVG9w IC0gbmV3T3ZlckJvdHRvbTsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92 ZXIgYm90dG9tIG9mIHdpdGhpbgoJCQkJfSBlbHNlIGlmICggb3ZlckJvdHRvbSA+ IDAgJiYgb3ZlclRvcCA8PSAwICkgewoJCQkJCXBvc2l0aW9uLnRvcCA9IHdpdGhp bk9mZnNldDsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgYm90aCB0 b3AgYW5kIGJvdHRvbSBvZiB3aXRoaW4KCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCBv dmVyVG9wID4gb3ZlckJvdHRvbSApIHsKCQkJCQkJcG9zaXRpb24udG9wID0gd2l0 aGluT2Zmc2V0ICsgb3V0ZXJIZWlnaHQgLSBkYXRhLmNvbGxpc2lvbkhlaWdodDsK CQkJCQl9IGVsc2UgewoJCQkJCQlwb3NpdGlvbi50b3AgPSB3aXRoaW5PZmZzZXQ7 CgkJCQkJfQoJCQkJfQoJCQkvLyB0b28gZmFyIHVwIC0+IGFsaWduIHdpdGggdG9w CgkJCX0gZWxzZSBpZiAoIG92ZXJUb3AgPiAwICkgewoJCQkJcG9zaXRpb24udG9w ICs9IG92ZXJUb3A7CgkJCS8vIHRvbyBmYXIgZG93biAtPiBhbGlnbiB3aXRoIGJv dHRvbSBlZGdlCgkJCX0gZWxzZSBpZiAoIG92ZXJCb3R0b20gPiAwICkgewoJCQkJ cG9zaXRpb24udG9wIC09IG92ZXJCb3R0b207CgkJCS8vIGFkanVzdCBiYXNlZCBv biBwb3NpdGlvbiBhbmQgbWFyZ2luCgkJCX0gZWxzZSB7CgkJCQlwb3NpdGlvbi50 b3AgPSBtYXgoIHBvc2l0aW9uLnRvcCAtIGNvbGxpc2lvblBvc1RvcCwgcG9zaXRp b24udG9wICk7CgkJCX0KCQl9Cgl9LAoJZmxpcDogewoJCWxlZnQ6IGZ1bmN0aW9u KCBwb3NpdGlvbiwgZGF0YSApIHsKCQkJdmFyIHdpdGhpbiA9IGRhdGEud2l0aGlu LAoJCQkJd2l0aGluT2Zmc2V0ID0gd2l0aGluLm9mZnNldC5sZWZ0ICsgd2l0aGlu LnNjcm9sbExlZnQsCgkJCQlvdXRlcldpZHRoID0gd2l0aGluLndpZHRoLAoJCQkJ b2Zmc2V0TGVmdCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxMZWZ0 IDogd2l0aGluLm9mZnNldC5sZWZ0LAoJCQkJY29sbGlzaW9uUG9zTGVmdCA9IHBv c2l0aW9uLmxlZnQgLSBkYXRhLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQs CgkJCQlvdmVyTGVmdCA9IGNvbGxpc2lvblBvc0xlZnQgLSBvZmZzZXRMZWZ0LAoJ CQkJb3ZlclJpZ2h0ID0gY29sbGlzaW9uUG9zTGVmdCArIGRhdGEuY29sbGlzaW9u V2lkdGggLSBvdXRlcldpZHRoIC0gb2Zmc2V0TGVmdCwKCQkJCW15T2Zmc2V0ID0g ZGF0YS5teVsgMCBdID09PSAibGVmdCIgPwoJCQkJCS1kYXRhLmVsZW1XaWR0aCA6 CgkJCQkJZGF0YS5teVsgMCBdID09PSAicmlnaHQiID8KCQkJCQkJZGF0YS5lbGVt V2lkdGggOgoJCQkJCQkwLAoJCQkJYXRPZmZzZXQgPSBkYXRhLmF0WyAwIF0gPT09 ICJsZWZ0IiA/CgkJCQkJZGF0YS50YXJnZXRXaWR0aCA6CgkJCQkJZGF0YS5hdFsg MCBdID09PSAicmlnaHQiID8KCQkJCQkJLWRhdGEudGFyZ2V0V2lkdGggOgoJCQkJ CQkwLAoJCQkJb2Zmc2V0ID0gLTIgKiBkYXRhLm9mZnNldFsgMCBdLAoJCQkJbmV3 T3ZlclJpZ2h0LAoJCQkJbmV3T3ZlckxlZnQ7CgoJCQlpZiAoIG92ZXJMZWZ0IDwg MCApIHsKCQkJCW5ld092ZXJSaWdodCA9IHBvc2l0aW9uLmxlZnQgKyBteU9mZnNl dCArIGF0T2Zmc2V0ICsgb2Zmc2V0ICsgZGF0YS5jb2xsaXNpb25XaWR0aCAtIG91 dGVyV2lkdGggLSB3aXRoaW5PZmZzZXQ7CgkJCQlpZiAoIG5ld092ZXJSaWdodCA8 IDAgfHwgbmV3T3ZlclJpZ2h0IDwgYWJzKCBvdmVyTGVmdCApICkgewoJCQkJCXBv c2l0aW9uLmxlZnQgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJ CX0KCQkJfQoJCQllbHNlIGlmICggb3ZlclJpZ2h0ID4gMCApIHsKCQkJCW5ld092 ZXJMZWZ0ID0gcG9zaXRpb24ubGVmdCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24u bWFyZ2luTGVmdCArIG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQgLSBvZmZz ZXRMZWZ0OwoJCQkJaWYgKCBuZXdPdmVyTGVmdCA+IDAgfHwgYWJzKCBuZXdPdmVy TGVmdCApIDwgb3ZlclJpZ2h0ICkgewoJCQkJCXBvc2l0aW9uLmxlZnQgKz0gbXlP ZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCX0sCgkJdG9w OiBmdW5jdGlvbiggcG9zaXRpb24sIGRhdGEgKSB7CgkJCXZhciB3aXRoaW4gPSBk YXRhLndpdGhpbiwKCQkJCXdpdGhpbk9mZnNldCA9IHdpdGhpbi5vZmZzZXQudG9w ICsgd2l0aGluLnNjcm9sbFRvcCwKCQkJCW91dGVySGVpZ2h0ID0gd2l0aGluLmhl aWdodCwKCQkJCW9mZnNldFRvcCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5z Y3JvbGxUb3AgOiB3aXRoaW4ub2Zmc2V0LnRvcCwKCQkJCWNvbGxpc2lvblBvc1Rv cCA9IHBvc2l0aW9uLnRvcCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2lu VG9wLAoJCQkJb3ZlclRvcCA9IGNvbGxpc2lvblBvc1RvcCAtIG9mZnNldFRvcCwK CQkJCW92ZXJCb3R0b20gPSBjb2xsaXNpb25Qb3NUb3AgKyBkYXRhLmNvbGxpc2lv bkhlaWdodCAtIG91dGVySGVpZ2h0IC0gb2Zmc2V0VG9wLAoJCQkJdG9wID0gZGF0 YS5teVsgMSBdID09PSAidG9wIiwKCQkJCW15T2Zmc2V0ID0gdG9wID8KCQkJCQkt ZGF0YS5lbGVtSGVpZ2h0IDoKCQkJCQlkYXRhLm15WyAxIF0gPT09ICJib3R0b20i ID8KCQkJCQkJZGF0YS5lbGVtSGVpZ2h0IDoKCQkJCQkJMCwKCQkJCWF0T2Zmc2V0 ID0gZGF0YS5hdFsgMSBdID09PSAidG9wIiA/CgkJCQkJZGF0YS50YXJnZXRIZWln aHQgOgoJCQkJCWRhdGEuYXRbIDEgXSA9PT0gImJvdHRvbSIgPwoJCQkJCQktZGF0 YS50YXJnZXRIZWlnaHQgOgoJCQkJCQkwLAoJCQkJb2Zmc2V0ID0gLTIgKiBkYXRh Lm9mZnNldFsgMSBdLAoJCQkJbmV3T3ZlclRvcCwKCQkJCW5ld092ZXJCb3R0b207 CgkJCWlmICggb3ZlclRvcCA8IDAgKSB7CgkJCQluZXdPdmVyQm90dG9tID0gcG9z aXRpb24udG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCArIGRhdGEu Y29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSB3aXRoaW5PZmZzZXQ7CgkJ CQlpZiAoICggcG9zaXRpb24udG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9m ZnNldCkgPiBvdmVyVG9wICYmICggbmV3T3ZlckJvdHRvbSA8IDAgfHwgbmV3T3Zl ckJvdHRvbSA8IGFicyggb3ZlclRvcCApICkgKSB7CgkJCQkJcG9zaXRpb24udG9w ICs9IG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQ7CgkJCQl9CgkJCX0KCQkJ ZWxzZSBpZiAoIG92ZXJCb3R0b20gPiAwICkgewoJCQkJbmV3T3ZlclRvcCA9IHBv c2l0aW9uLnRvcCAtICBkYXRhLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCAr IG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQgLSBvZmZzZXRUb3A7CgkJCQlp ZiAoICggcG9zaXRpb24udG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNl dCkgPiBvdmVyQm90dG9tICYmICggbmV3T3ZlclRvcCA+IDAgfHwgYWJzKCBuZXdP dmVyVG9wICkgPCBvdmVyQm90dG9tICkgKSB7CgkJCQkJcG9zaXRpb24udG9wICs9 IG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQ7CgkJCQl9CgkJCX0KCQl9Cgl9 LAoJZmxpcGZpdDogewoJCWxlZnQ6IGZ1bmN0aW9uKCkgewoJCQkkLnVpLnBvc2l0 aW9uLmZsaXAubGVmdC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCSQudWku cG9zaXRpb24uZml0LmxlZnQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0s CgkJdG9wOiBmdW5jdGlvbigpIHsKCQkJJC51aS5wb3NpdGlvbi5mbGlwLnRvcC5h cHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCSQudWkucG9zaXRpb24uZml0LnRv cC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfQp9OwoKLy8gZnJhY3Rp b24gc3VwcG9ydCB0ZXN0CihmdW5jdGlvbiAoKSB7Cgl2YXIgdGVzdEVsZW1lbnQs IHRlc3RFbGVtZW50UGFyZW50LCB0ZXN0RWxlbWVudFN0eWxlLCBvZmZzZXRMZWZ0 LCBpLAoJCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImJv ZHkiIClbIDAgXSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2 IiApOwoKCS8vQ3JlYXRlIGEgImZha2UgYm9keSIgZm9yIHRlc3RpbmcgYmFzZWQg b24gbWV0aG9kIHVzZWQgaW4galF1ZXJ5LnN1cHBvcnQKCXRlc3RFbGVtZW50ID0g ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggYm9keSA/ICJkaXYiIDogImJvZHkiICk7 Cgl0ZXN0RWxlbWVudFN0eWxlID0gewoJCXZpc2liaWxpdHk6ICJoaWRkZW4iLAoJ CXdpZHRoOiAwLAoJCWhlaWdodDogMCwKCQlib3JkZXI6IDAsCgkJbWFyZ2luOiAw LAoJCWJhY2tncm91bmQ6ICJub25lIgoJfTsKCWlmICggYm9keSApIHsKCQkkLmV4 dGVuZCggdGVzdEVsZW1lbnRTdHlsZSwgewoJCQlwb3NpdGlvbjogImFic29sdXRl IiwKCQkJbGVmdDogIi0xMDAwcHgiLAoJCQl0b3A6ICItMTAwMHB4IgoJCX0pOwoJ fQoJZm9yICggaSBpbiB0ZXN0RWxlbWVudFN0eWxlICkgewoJCXRlc3RFbGVtZW50 LnN0eWxlWyBpIF0gPSB0ZXN0RWxlbWVudFN0eWxlWyBpIF07Cgl9Cgl0ZXN0RWxl bWVudC5hcHBlbmRDaGlsZCggZGl2ICk7Cgl0ZXN0RWxlbWVudFBhcmVudCA9IGJv ZHkgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoJdGVzdEVsZW1lbnRQYXJl bnQuaW5zZXJ0QmVmb3JlKCB0ZXN0RWxlbWVudCwgdGVzdEVsZW1lbnRQYXJlbnQu Zmlyc3RDaGlsZCApOwoKCWRpdi5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOiBh YnNvbHV0ZTsgbGVmdDogMTAuNzQzMjIyMnB4OyI7CgoJb2Zmc2V0TGVmdCA9ICQo IGRpdiApLm9mZnNldCgpLmxlZnQ7CgkkLnN1cHBvcnQub2Zmc2V0RnJhY3Rpb25z ID0gb2Zmc2V0TGVmdCA+IDEwICYmIG9mZnNldExlZnQgPCAxMTsKCgl0ZXN0RWxl bWVudC5pbm5lckhUTUwgPSAiIjsKCXRlc3RFbGVtZW50UGFyZW50LnJlbW92ZUNo aWxkKCB0ZXN0RWxlbWVudCApOwp9KSgpOwoKfSggalF1ZXJ5ICkgKTsKCihmdW5j dGlvbiggJCwgdW5kZWZpbmVkICkgewoKJC53aWRnZXQoICJ1aS5wcm9ncmVzc2Jh ciIsIHsKCXZlcnNpb246ICIxLjEwLjAiLAoJb3B0aW9uczogewoJCW1heDogMTAw LAoJCXZhbHVlOiAwLAoKCQljaGFuZ2U6IG51bGwsCgkJY29tcGxldGU6IG51bGwK CX0sCgoJbWluOiAwLAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCS8vIENvbnN0 cmFpbiBpbml0aWFsIHZhbHVlCgkJdGhpcy5vbGRWYWx1ZSA9IHRoaXMub3B0aW9u cy52YWx1ZSA9IHRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoKTsKCgkJdGhpcy5lbGVt ZW50CgkJCS5hZGRDbGFzcyggInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13 aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiApCgkJCS5hdHRyKHsKCQkJCS8v IE9ubHkgc2V0IHN0YXRpYyB2YWx1ZXMsIGFyaWEtdmFsdWVub3cgYW5kIGFyaWEt dmFsdWVtYXggYXJlCgkJCQkvLyBzZXQgaW5zaWRlIF9yZWZyZXNoVmFsdWUoKQoJ CQkJcm9sZTogInByb2dyZXNzYmFyIiwKCQkJCSJhcmlhLXZhbHVlbWluIjogdGhp cy5taW4KCQkJfSk7CgoJCXRoaXMudmFsdWVEaXYgPSAkKCAiPGRpdiBjbGFzcz0n dWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXIt bGVmdCc+PC9kaXY+IiApCgkJCS5hcHBlbmRUbyggdGhpcy5lbGVtZW50ICk7CgoJ CXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24o KSB7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLXByb2dyZXNz YmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiAp CgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEt dmFsdWVtaW4iICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbWF4IiApCgkJ CS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW5vdyIgKTsKCgkJdGhpcy52YWx1ZURp di5yZW1vdmUoKTsKCX0sCgoJdmFsdWU6IGZ1bmN0aW9uKCBuZXdWYWx1ZSApIHsK CQlpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlz Lm9wdGlvbnMudmFsdWU7CgkJfQoKCQl0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlz Ll9jb25zdHJhaW5lZFZhbHVlKCBuZXdWYWx1ZSApOwoJCXRoaXMuX3JlZnJlc2hW YWx1ZSgpOwoJfSwKCglfY29uc3RyYWluZWRWYWx1ZTogZnVuY3Rpb24oIG5ld1Zh bHVlICkgewoJCWlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJbmV3 VmFsdWUgPSB0aGlzLm9wdGlvbnMudmFsdWU7CgkJfQoKCQl0aGlzLmluZGV0ZXJt aW5hdGUgPSBuZXdWYWx1ZSA9PT0gZmFsc2U7CgoJCS8vIHNhbml0aXplIHZhbHVl CgkJaWYgKCB0eXBlb2YgbmV3VmFsdWUgIT09ICJudW1iZXIiICkgewoJCQluZXdW YWx1ZSA9IDA7CgkJfQoKCQlyZXR1cm4gdGhpcy5pbmRldGVybWluYXRlID8gZmFs c2UgOgoJCQlNYXRoLm1pbiggdGhpcy5vcHRpb25zLm1heCwgTWF0aC5tYXgoIHRo aXMubWluLCBuZXdWYWx1ZSApICk7Cgl9LAoKCV9zZXRPcHRpb25zOiBmdW5jdGlv biggb3B0aW9ucyApIHsKCQkvLyBFbnN1cmUgInZhbHVlIiBvcHRpb24gaXMgc2V0 IGFmdGVyIG90aGVyIHZhbHVlcyAobGlrZSBtYXgpCgkJdmFyIHZhbHVlID0gb3B0 aW9ucy52YWx1ZTsKCQlkZWxldGUgb3B0aW9ucy52YWx1ZTsKCgkJdGhpcy5fc3Vw ZXIoIG9wdGlvbnMgKTsKCgkJdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5fY29u c3RyYWluZWRWYWx1ZSggdmFsdWUgKTsKCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsK CX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYg KCBrZXkgPT09ICJtYXgiICkgewoJCQkvLyBEb24ndCBhbGxvdyBhIG1heCBsZXNz IHRoYW4gbWluCgkJCXZhbHVlID0gTWF0aC5tYXgoIHRoaXMubWluLCB2YWx1ZSAp OwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCX0sCgoJX3BlcmNl bnRhZ2U6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGUg PyAxMDAgOiAxMDAgKiAoIHRoaXMub3B0aW9ucy52YWx1ZSAtIHRoaXMubWluICkg LyAoIHRoaXMub3B0aW9ucy5tYXggLSB0aGlzLm1pbiApOwoJfSwKCglfcmVmcmVz aFZhbHVlOiBmdW5jdGlvbigpIHsKCQl2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnMu dmFsdWUsCgkJCXBlcmNlbnRhZ2UgPSB0aGlzLl9wZXJjZW50YWdlKCk7CgoJCXRo aXMudmFsdWVEaXYKCQkJLnRvZ2dsZSggdGhpcy5pbmRldGVybWluYXRlIHx8IHZh bHVlID4gdGhpcy5taW4gKQoJCQkudG9nZ2xlQ2xhc3MoICJ1aS1jb3JuZXItcmln aHQiLCB2YWx1ZSA9PT0gdGhpcy5vcHRpb25zLm1heCApCgkJCS53aWR0aCggcGVy Y2VudGFnZS50b0ZpeGVkKDApICsgIiUiICk7CgoJCXRoaXMuZWxlbWVudC50b2dn bGVDbGFzcyggInVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUiLCB0aGlzLmlu ZGV0ZXJtaW5hdGUgKTsKCgkJaWYgKCB0aGlzLmluZGV0ZXJtaW5hdGUgKSB7CgkJ CXRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW5vdyIgKTsKCQkJ aWYgKCAhdGhpcy5vdmVybGF5RGl2ICkgewoJCQkJdGhpcy5vdmVybGF5RGl2ID0g JCggIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLW92ZXJsYXknPjwvZGl2PiIg KS5hcHBlbmRUbyggdGhpcy52YWx1ZURpdiApOwoJCQl9CgkJfSBlbHNlIHsKCQkJ dGhpcy5lbGVtZW50LmF0dHIoewoJCQkJImFyaWEtdmFsdWVtYXgiOiB0aGlzLm9w dGlvbnMubWF4LAoJCQkJImFyaWEtdmFsdWVub3ciOiB2YWx1ZQoJCQl9KTsKCQkJ aWYgKCB0aGlzLm92ZXJsYXlEaXYgKSB7CgkJCQl0aGlzLm92ZXJsYXlEaXYucmVt b3ZlKCk7CgkJCQl0aGlzLm92ZXJsYXlEaXYgPSBudWxsOwoJCQl9CgkJfQoKCQlp ZiAoIHRoaXMub2xkVmFsdWUgIT09IHZhbHVlICkgewoJCQl0aGlzLm9sZFZhbHVl ID0gdmFsdWU7CgkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiICk7CgkJfQoJCWlm ICggdmFsdWUgPT09IHRoaXMub3B0aW9ucy5tYXggKSB7CgkJCXRoaXMuX3RyaWdn ZXIoICJjb21wbGV0ZSIgKTsKCQl9Cgl9Cn0pOwoKfSkoIGpRdWVyeSApOwoKKGZ1 bmN0aW9uKCAkLCB1bmRlZmluZWQgKSB7CgovLyBudW1iZXIgb2YgcGFnZXMgaW4g YSBzbGlkZXIKLy8gKGhvdyBtYW55IHRpbWVzIGNhbiB5b3UgcGFnZSB1cC9kb3du IHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHJhbmdlKQp2YXIgbnVtUGFnZXMgPSA1 OwoKJC53aWRnZXQoICJ1aS5zbGlkZXIiLCAkLnVpLm1vdXNlLCB7Cgl2ZXJzaW9u OiAiMS4xMC4wIiwKCXdpZGdldEV2ZW50UHJlZml4OiAic2xpZGUiLAoKCW9wdGlv bnM6IHsKCQlhbmltYXRlOiBmYWxzZSwKCQlkaXN0YW5jZTogMCwKCQltYXg6IDEw MCwKCQltaW46IDAsCgkJb3JpZW50YXRpb246ICJob3Jpem9udGFsIiwKCQlyYW5n ZTogZmFsc2UsCgkJc3RlcDogMSwKCQl2YWx1ZTogMCwKCQl2YWx1ZXM6IG51bGws CgoJCS8vIGNhbGxiYWNrcwoJCWNoYW5nZTogbnVsbCwKCQlzbGlkZTogbnVsbCwK CQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0 aW9uKCkgewoJCXZhciBpLCBoYW5kbGVDb3VudCwKCQkJbyA9IHRoaXMub3B0aW9u cywKCQkJZXhpc3RpbmdIYW5kbGVzID0gdGhpcy5lbGVtZW50LmZpbmQoICIudWkt c2xpZGVyLWhhbmRsZSIgKS5hZGRDbGFzcyggInVpLXN0YXRlLWRlZmF1bHQgdWkt Y29ybmVyLWFsbCIgKSwKCQkJaGFuZGxlID0gIjxhIGNsYXNzPSd1aS1zbGlkZXIt aGFuZGxlIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcgaHJlZj0nIyc+ PC9hPiIsCgkJCWhhbmRsZXMgPSBbXTsKCgkJdGhpcy5fa2V5U2xpZGluZyA9IGZh bHNlOwoJCXRoaXMuX21vdXNlU2xpZGluZyA9IGZhbHNlOwoJCXRoaXMuX2FuaW1h dGVPZmYgPSB0cnVlOwoJCXRoaXMuX2hhbmRsZUluZGV4ID0gbnVsbDsKCQl0aGlz Ll9kZXRlY3RPcmllbnRhdGlvbigpOwoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCQl0 aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVp LXNsaWRlci0iICsgdGhpcy5vcmllbnRhdGlvbiArCgkJCQkiIHVpLXdpZGdldCIg KwoJCQkJIiB1aS13aWRnZXQtY29udGVudCIgKwoJCQkJIiB1aS1jb3JuZXItYWxs Iik7CgoJCXRoaXMucmFuZ2UgPSAkKFtdKTsKCgkJaWYgKCBvLnJhbmdlICkgewoJ CQlpZiAoIG8ucmFuZ2UgPT09IHRydWUgKSB7CgkJCQlpZiAoICFvLnZhbHVlcyAp IHsKCQkJCQlvLnZhbHVlcyA9IFsgdGhpcy5fdmFsdWVNaW4oKSwgdGhpcy5fdmFs dWVNaW4oKSBdOwoJCQkJfSBlbHNlIGlmICggby52YWx1ZXMubGVuZ3RoICYmIG8u dmFsdWVzLmxlbmd0aCAhPT0gMiApIHsKCQkJCQlvLnZhbHVlcyA9IFsgby52YWx1 ZXNbMF0sIG8udmFsdWVzWzBdIF07CgkJCQl9IGVsc2UgaWYgKCAkLmlzQXJyYXko IG8udmFsdWVzICkgKSB7CgkJCQkJby52YWx1ZXMgPSBvLnZhbHVlcy5zbGljZSgw KTsKCQkJCX0KCQkJfQoKCQkJdGhpcy5yYW5nZSA9ICQoICI8ZGl2PjwvZGl2PiIg KQoJCQkJLmFwcGVuZFRvKCB0aGlzLmVsZW1lbnQgKQoJCQkJLmFkZENsYXNzKCAi dWktc2xpZGVyLXJhbmdlIiArCgkJCQkvLyBub3RlOiB0aGlzIGlzbid0IHRoZSBt b3N0IGZpdHRpbmdseSBzZW1hbnRpYyBmcmFtZXdvcmsgY2xhc3MgZm9yIHRoaXMg ZWxlbWVudCwKCQkJCS8vIGJ1dCB3b3JrZWQgYmVzdCB2aXN1YWxseSB3aXRoIGEg dmFyaWV0eSBvZiB0aGVtZXMKCQkJCSIgdWktd2lkZ2V0LWhlYWRlciIgKwoJCQkJ KCAoIG8ucmFuZ2UgPT09ICJtaW4iIHx8IG8ucmFuZ2UgPT09ICJtYXgiICkgPyAi IHVpLXNsaWRlci1yYW5nZS0iICsgby5yYW5nZSA6ICIiICkgKTsKCQl9CgoJCWhh bmRsZUNvdW50ID0gKCBvLnZhbHVlcyAmJiBvLnZhbHVlcy5sZW5ndGggKSB8fCAx OwoKCQlmb3IgKCBpID0gZXhpc3RpbmdIYW5kbGVzLmxlbmd0aDsgaSA8IGhhbmRs ZUNvdW50OyBpKysgKSB7CgkJCWhhbmRsZXMucHVzaCggaGFuZGxlICk7CgkJfQoK CQl0aGlzLmhhbmRsZXMgPSBleGlzdGluZ0hhbmRsZXMuYWRkKCAkKCBoYW5kbGVz LmpvaW4oICIiICkgKS5hcHBlbmRUbyggdGhpcy5lbGVtZW50ICkgKTsKCgkJdGhp cy5oYW5kbGUgPSB0aGlzLmhhbmRsZXMuZXEoIDAgKTsKCgkJdGhpcy5oYW5kbGVz LmFkZCggdGhpcy5yYW5nZSApLmZpbHRlciggImEiICkKCQkJLmNsaWNrKGZ1bmN0 aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0p CgkJCS5tb3VzZWVudGVyKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAhby5kaXNhYmxl ZCApIHsKCQkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIg KTsKCQkJCX0KCQkJfSkKCQkJLm1vdXNlbGVhdmUoZnVuY3Rpb24oKSB7CgkJCQkk KCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSkK CQkJLmZvY3VzKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAhby5kaXNhYmxlZCApIHsK CQkJCQkkKCAiLnVpLXNsaWRlciAudWktc3RhdGUtZm9jdXMiICkucmVtb3ZlQ2xh c3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJCQkkKCB0aGlzICkuYWRkQ2xhc3Mo ICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJCX0gZWxzZSB7CgkJCQkJJCggdGhpcyAp LmJsdXIoKTsKCQkJCX0KCQkJfSkKCQkJLmJsdXIoZnVuY3Rpb24oKSB7CgkJCQkk KCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSk7 CgoJCXRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkkKCB0aGlz ICkuZGF0YSggInVpLXNsaWRlci1oYW5kbGUtaW5kZXgiLCBpICk7CgkJfSk7CgoJ CXRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgby5kaXNhYmxlZCApOwoKCQl0 aGlzLl9vbiggdGhpcy5oYW5kbGVzLCB0aGlzLl9oYW5kbGVFdmVudHMgKTsKCgkJ dGhpcy5fcmVmcmVzaFZhbHVlKCk7CgoJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxz ZTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlcy5y ZW1vdmUoKTsKCQl0aGlzLnJhbmdlLnJlbW92ZSgpOwoKCQl0aGlzLmVsZW1lbnQK CQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVpLXNsaWRlci1o b3Jpem9udGFsIiArCgkJCQkiIHVpLXNsaWRlci12ZXJ0aWNhbCIgKwoJCQkJIiB1 aS13aWRnZXQiICsKCQkJCSIgdWktd2lkZ2V0LWNvbnRlbnQiICsKCQkJCSIgdWkt Y29ybmVyLWFsbCIgKTsKCgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9t b3VzZUNhcHR1cmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgcG9zaXRpb24s IG5vcm1WYWx1ZSwgZGlzdGFuY2UsIGNsb3Nlc3RIYW5kbGUsIGluZGV4LCBhbGxv d2VkLCBvZmZzZXQsIG1vdXNlT3ZlckhhbmRsZSwKCQkJdGhhdCA9IHRoaXMsCgkJ CW8gPSB0aGlzLm9wdGlvbnM7CgoJCWlmICggby5kaXNhYmxlZCApIHsKCQkJcmV0 dXJuIGZhbHNlOwoJCX0KCgkJdGhpcy5lbGVtZW50U2l6ZSA9IHsKCQkJd2lkdGg6 IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogdGhpcy5lbGVt ZW50Lm91dGVySGVpZ2h0KCkKCQl9OwoJCXRoaXMuZWxlbWVudE9mZnNldCA9IHRo aXMuZWxlbWVudC5vZmZzZXQoKTsKCgkJcG9zaXRpb24gPSB7IHg6IGV2ZW50LnBh Z2VYLCB5OiBldmVudC5wYWdlWSB9OwoJCW5vcm1WYWx1ZSA9IHRoaXMuX25vcm1W YWx1ZUZyb21Nb3VzZSggcG9zaXRpb24gKTsKCQlkaXN0YW5jZSA9IHRoaXMuX3Zh bHVlTWF4KCkgLSB0aGlzLl92YWx1ZU1pbigpICsgMTsKCQl0aGlzLmhhbmRsZXMu ZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHRoaXNEaXN0YW5jZSA9IE1hdGgu YWJzKCBub3JtVmFsdWUgLSB0aGF0LnZhbHVlcyhpKSApOwoJCQlpZiAoKCBkaXN0 YW5jZSA+IHRoaXNEaXN0YW5jZSApIHx8CgkJCQkoIGRpc3RhbmNlID09PSB0aGlz RGlzdGFuY2UgJiYKCQkJCQkoaSA9PT0gdGhhdC5fbGFzdENoYW5nZWRWYWx1ZSB8 fCB0aGF0LnZhbHVlcyhpKSA9PT0gby5taW4gKSkpIHsKCQkJCWRpc3RhbmNlID0g dGhpc0Rpc3RhbmNlOwoJCQkJY2xvc2VzdEhhbmRsZSA9ICQoIHRoaXMgKTsKCQkJ CWluZGV4ID0gaTsKCQkJfQoJCX0pOwoKCQlhbGxvd2VkID0gdGhpcy5fc3RhcnQo IGV2ZW50LCBpbmRleCApOwoJCWlmICggYWxsb3dlZCA9PT0gZmFsc2UgKSB7CgkJ CXJldHVybiBmYWxzZTsKCQl9CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gdHJ1ZTsK CgkJdGhpcy5faGFuZGxlSW5kZXggPSBpbmRleDsKCgkJY2xvc2VzdEhhbmRsZQoJ CQkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICkKCQkJLmZvY3VzKCk7CgoJ CW9mZnNldCA9IGNsb3Nlc3RIYW5kbGUub2Zmc2V0KCk7CgkJbW91c2VPdmVySGFu ZGxlID0gISQoIGV2ZW50LnRhcmdldCApLnBhcmVudHMoKS5hZGRCYWNrKCkuaXMo ICIudWktc2xpZGVyLWhhbmRsZSIgKTsKCQl0aGlzLl9jbGlja09mZnNldCA9IG1v dXNlT3ZlckhhbmRsZSA/IHsgbGVmdDogMCwgdG9wOiAwIH0gOiB7CgkJCWxlZnQ6 IGV2ZW50LnBhZ2VYIC0gb2Zmc2V0LmxlZnQgLSAoIGNsb3Nlc3RIYW5kbGUud2lk dGgoKSAvIDIgKSwKCQkJdG9wOiBldmVudC5wYWdlWSAtIG9mZnNldC50b3AgLQoJ CQkJKCBjbG9zZXN0SGFuZGxlLmhlaWdodCgpIC8gMiApIC0KCQkJCSggcGFyc2VJ bnQoIGNsb3Nlc3RIYW5kbGUuY3NzKCJib3JkZXJUb3BXaWR0aCIpLCAxMCApIHx8 IDAgKSAtCgkJCQkoIHBhcnNlSW50KCBjbG9zZXN0SGFuZGxlLmNzcygiYm9yZGVy Qm90dG9tV2lkdGgiKSwgMTAgKSB8fCAwKSArCgkJCQkoIHBhcnNlSW50KCBjbG9z ZXN0SGFuZGxlLmNzcygibWFyZ2luVG9wIiksIDEwICkgfHwgMCkKCQl9OwoKCQlp ZiAoICF0aGlzLmhhbmRsZXMuaGFzQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKSAp IHsKCQkJdGhpcy5fc2xpZGUoIGV2ZW50LCBpbmRleCwgbm9ybVZhbHVlICk7CgkJ fQoJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwK CglfbW91c2VTdGFydDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoK CV9tb3VzZURyYWc6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgcG9zaXRpb24g PSB7IHg6IGV2ZW50LnBhZ2VYLCB5OiBldmVudC5wYWdlWSB9LAoJCQlub3JtVmFs dWUgPSB0aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoIHBvc2l0aW9uICk7CgoJCXRo aXMuX3NsaWRlKCBldmVudCwgdGhpcy5faGFuZGxlSW5kZXgsIG5vcm1WYWx1ZSAp OwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKCBl dmVudCApIHsKCQl0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1h Y3RpdmUiICk7CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gZmFsc2U7CgoJCXRoaXMu X3N0b3AoIGV2ZW50LCB0aGlzLl9oYW5kbGVJbmRleCApOwoJCXRoaXMuX2NoYW5n ZSggZXZlbnQsIHRoaXMuX2hhbmRsZUluZGV4ICk7CgoJCXRoaXMuX2hhbmRsZUlu ZGV4ID0gbnVsbDsKCQl0aGlzLl9jbGlja09mZnNldCA9IG51bGw7CgkJdGhpcy5f YW5pbWF0ZU9mZiA9IGZhbHNlOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9kZXRl Y3RPcmllbnRhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmllbnRhdGlvbiA9 ICggdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAidmVydGljYWwiICkgPyAi dmVydGljYWwiIDogImhvcml6b250YWwiOwoJfSwKCglfbm9ybVZhbHVlRnJvbU1v dXNlOiBmdW5jdGlvbiggcG9zaXRpb24gKSB7CgkJdmFyIHBpeGVsVG90YWwsCgkJ CXBpeGVsTW91c2UsCgkJCXBlcmNlbnRNb3VzZSwKCQkJdmFsdWVUb3RhbCwKCQkJ dmFsdWVNb3VzZTsKCgkJaWYgKCB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpv bnRhbCIgKSB7CgkJCXBpeGVsVG90YWwgPSB0aGlzLmVsZW1lbnRTaXplLndpZHRo OwoJCQlwaXhlbE1vdXNlID0gcG9zaXRpb24ueCAtIHRoaXMuZWxlbWVudE9mZnNl dC5sZWZ0IC0gKCB0aGlzLl9jbGlja09mZnNldCA/IHRoaXMuX2NsaWNrT2Zmc2V0 LmxlZnQgOiAwICk7CgkJfSBlbHNlIHsKCQkJcGl4ZWxUb3RhbCA9IHRoaXMuZWxl bWVudFNpemUuaGVpZ2h0OwoJCQlwaXhlbE1vdXNlID0gcG9zaXRpb24ueSAtIHRo aXMuZWxlbWVudE9mZnNldC50b3AgLSAoIHRoaXMuX2NsaWNrT2Zmc2V0ID8gdGhp cy5fY2xpY2tPZmZzZXQudG9wIDogMCApOwoJCX0KCgkJcGVyY2VudE1vdXNlID0g KCBwaXhlbE1vdXNlIC8gcGl4ZWxUb3RhbCApOwoJCWlmICggcGVyY2VudE1vdXNl ID4gMSApIHsKCQkJcGVyY2VudE1vdXNlID0gMTsKCQl9CgkJaWYgKCBwZXJjZW50 TW91c2UgPCAwICkgewoJCQlwZXJjZW50TW91c2UgPSAwOwoJCX0KCQlpZiAoIHRo aXMub3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgKSB7CgkJCXBlcmNlbnRNb3Vz ZSA9IDEgLSBwZXJjZW50TW91c2U7CgkJfQoKCQl2YWx1ZVRvdGFsID0gdGhpcy5f dmFsdWVNYXgoKSAtIHRoaXMuX3ZhbHVlTWluKCk7CgkJdmFsdWVNb3VzZSA9IHRo aXMuX3ZhbHVlTWluKCkgKyBwZXJjZW50TW91c2UgKiB2YWx1ZVRvdGFsOwoKCQly ZXR1cm4gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbHVlTW91c2UgKTsKCX0sCgoJ X3N0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIGluZGV4ICkgewoJCXZhciB1aUhhc2gg PSB7CgkJCWhhbmRsZTogdGhpcy5oYW5kbGVzWyBpbmRleCBdLAoJCQl2YWx1ZTog dGhpcy52YWx1ZSgpCgkJfTsKCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYg dGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCXVpSGFzaC52YWx1ZSA9 IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQl1aUhhc2gudmFsdWVzID0gdGhpcy52 YWx1ZXMoKTsKCQl9CgkJcmV0dXJuIHRoaXMuX3RyaWdnZXIoICJzdGFydCIsIGV2 ZW50LCB1aUhhc2ggKTsKCX0sCgoJX3NsaWRlOiBmdW5jdGlvbiggZXZlbnQsIGlu ZGV4LCBuZXdWYWwgKSB7CgkJdmFyIG90aGVyVmFsLAoJCQluZXdWYWx1ZXMsCgkJ CWFsbG93ZWQ7CgoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9w dGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJb3RoZXJWYWwgPSB0aGlzLnZhbHVl cyggaW5kZXggPyAwIDogMSApOwoKCQkJaWYgKCAoIHRoaXMub3B0aW9ucy52YWx1 ZXMubGVuZ3RoID09PSAyICYmIHRoaXMub3B0aW9ucy5yYW5nZSA9PT0gdHJ1ZSAp ICYmCgkJCQkJKCAoIGluZGV4ID09PSAwICYmIG5ld1ZhbCA+IG90aGVyVmFsKSB8 fCAoIGluZGV4ID09PSAxICYmIG5ld1ZhbCA8IG90aGVyVmFsICkgKQoJCQkJKSB7 CgkJCQluZXdWYWwgPSBvdGhlclZhbDsKCQkJfQoKCQkJaWYgKCBuZXdWYWwgIT09 IHRoaXMudmFsdWVzKCBpbmRleCApICkgewoJCQkJbmV3VmFsdWVzID0gdGhpcy52 YWx1ZXMoKTsKCQkJCW5ld1ZhbHVlc1sgaW5kZXggXSA9IG5ld1ZhbDsKCQkJCS8v IEEgc2xpZGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHJldHVybmluZyBmYWxzZSBmcm9t IHRoZSBzbGlkZSBjYWxsYmFjawoJCQkJYWxsb3dlZCA9IHRoaXMuX3RyaWdnZXIo ICJzbGlkZSIsIGV2ZW50LCB7CgkJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGlu ZGV4IF0sCgkJCQkJdmFsdWU6IG5ld1ZhbCwKCQkJCQl2YWx1ZXM6IG5ld1ZhbHVl cwoJCQkJfSApOwoJCQkJb3RoZXJWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggPyAw IDogMSApOwoJCQkJaWYgKCBhbGxvd2VkICE9PSBmYWxzZSApIHsKCQkJCQl0aGlz LnZhbHVlcyggaW5kZXgsIG5ld1ZhbCwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfSBl bHNlIHsKCQkJaWYgKCBuZXdWYWwgIT09IHRoaXMudmFsdWUoKSApIHsKCQkJCS8v IEEgc2xpZGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHJldHVybmluZyBmYWxzZSBmcm9t IHRoZSBzbGlkZSBjYWxsYmFjawoJCQkJYWxsb3dlZCA9IHRoaXMuX3RyaWdnZXIo ICJzbGlkZSIsIGV2ZW50LCB7CgkJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGlu ZGV4IF0sCgkJCQkJdmFsdWU6IG5ld1ZhbAoJCQkJfSApOwoJCQkJaWYgKCBhbGxv d2VkICE9PSBmYWxzZSApIHsKCQkJCQl0aGlzLnZhbHVlKCBuZXdWYWwgKTsKCQkJ CX0KCQkJfQoJCX0KCX0sCgoJX3N0b3A6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXgg KSB7CgkJdmFyIHVpSGFzaCA9IHsKCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGlu ZGV4IF0sCgkJCXZhbHVlOiB0aGlzLnZhbHVlKCkKCQl9OwoJCWlmICggdGhpcy5v cHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsK CQkJdWlIYXNoLnZhbHVlID0gdGhpcy52YWx1ZXMoIGluZGV4ICk7CgkJCXVpSGFz aC52YWx1ZXMgPSB0aGlzLnZhbHVlcygpOwoJCX0KCgkJdGhpcy5fdHJpZ2dlcigg InN0b3AiLCBldmVudCwgdWlIYXNoICk7Cgl9LAoKCV9jaGFuZ2U6IGZ1bmN0aW9u KCBldmVudCwgaW5kZXggKSB7CgkJaWYgKCAhdGhpcy5fa2V5U2xpZGluZyAmJiAh dGhpcy5fbW91c2VTbGlkaW5nICkgewoJCQl2YXIgdWlIYXNoID0gewoJCQkJaGFu ZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQl2YWx1ZTogdGhpcy52YWx1 ZSgpCgkJCX07CgkJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9w dGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJCXVpSGFzaC52YWx1ZSA9IHRoaXMu dmFsdWVzKCBpbmRleCApOwoJCQkJdWlIYXNoLnZhbHVlcyA9IHRoaXMudmFsdWVz KCk7CgkJCX0KCgkJCS8vc3RvcmUgdGhlIGxhc3QgY2hhbmdlZCB2YWx1ZSBpbmRl eCBmb3IgcmVmZXJlbmNlIHdoZW4gaGFuZGxlcyBvdmVybGFwCgkJCXRoaXMuX2xh c3RDaGFuZ2VkVmFsdWUgPSBpbmRleDsKCgkJCXRoaXMuX3RyaWdnZXIoICJjaGFu Z2UiLCBldmVudCwgdWlIYXNoICk7CgkJfQoJfSwKCgl2YWx1ZTogZnVuY3Rpb24o IG5ld1ZhbHVlICkgewoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdGhp cy5vcHRpb25zLnZhbHVlID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVl ICk7CgkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQl0aGlzLl9jaGFuZ2UoIG51 bGwsIDAgKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmV0dXJuIHRoaXMuX3ZhbHVlKCk7 Cgl9LAoKCXZhbHVlczogZnVuY3Rpb24oIGluZGV4LCBuZXdWYWx1ZSApIHsKCQl2 YXIgdmFscywKCQkJbmV3VmFsdWVzLAoJCQlpOwoKCQlpZiAoIGFyZ3VtZW50cy5s ZW5ndGggPiAxICkgewoJCQl0aGlzLm9wdGlvbnMudmFsdWVzWyBpbmRleCBdID0g dGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVlICk7CgkJCXRoaXMuX3JlZnJl c2hWYWx1ZSgpOwoJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIGluZGV4ICk7CgkJCXJl dHVybjsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCAk LmlzQXJyYXkoIGFyZ3VtZW50c1sgMCBdICkgKSB7CgkJCQl2YWxzID0gdGhpcy5v cHRpb25zLnZhbHVlczsKCQkJCW5ld1ZhbHVlcyA9IGFyZ3VtZW50c1sgMCBdOwoJ CQkJZm9yICggaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSArPSAxICkgewoJCQkJ CXZhbHNbIGkgXSA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBuZXdWYWx1ZXNbIGkg XSApOwoJCQkJCXRoaXMuX2NoYW5nZSggbnVsbCwgaSApOwoJCQkJfQoJCQkJdGhp cy5fcmVmcmVzaFZhbHVlKCk7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHRoaXMub3B0 aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJ CQkJcmV0dXJuIHRoaXMuX3ZhbHVlcyggaW5kZXggKTsKCQkJCX0gZWxzZSB7CgkJ CQkJcmV0dXJuIHRoaXMudmFsdWUoKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJ CXJldHVybiB0aGlzLl92YWx1ZXMoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1 bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBpLAoJCQl2YWxzTGVuZ3RoID0g MDsKCgkJaWYgKCAkLmlzQXJyYXkoIHRoaXMub3B0aW9ucy52YWx1ZXMgKSApIHsK CQkJdmFsc0xlbmd0aCA9IHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoOwoJCX0K CgkJJC5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkoIHRoaXMsIGFy Z3VtZW50cyApOwoKCQlzd2l0Y2ggKCBrZXkgKSB7CgkJCWNhc2UgImRpc2FibGVk IjoKCQkJCWlmICggdmFsdWUgKSB7CgkJCQkJdGhpcy5oYW5kbGVzLmZpbHRlcigg Ii51aS1zdGF0ZS1mb2N1cyIgKS5ibHVyKCk7CgkJCQkJdGhpcy5oYW5kbGVzLnJl bW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCQkJdGhpcy5oYW5kbGVz LnByb3AoICJkaXNhYmxlZCIsIHRydWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhp cy5oYW5kbGVzLnByb3AoICJkaXNhYmxlZCIsIGZhbHNlICk7CgkJCQl9CgkJCQli cmVhazsKCQkJY2FzZSAib3JpZW50YXRpb24iOgoJCQkJdGhpcy5fZGV0ZWN0T3Jp ZW50YXRpb24oKTsKCQkJCXRoaXMuZWxlbWVudAoJCQkJCS5yZW1vdmVDbGFzcygg InVpLXNsaWRlci1ob3Jpem9udGFsIHVpLXNsaWRlci12ZXJ0aWNhbCIgKQoJCQkJ CS5hZGRDbGFzcyggInVpLXNsaWRlci0iICsgdGhpcy5vcmllbnRhdGlvbiApOwoJ CQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCQlicmVhazsKCQkJY2FzZSAidmFs dWUiOgoJCQkJdGhpcy5fYW5pbWF0ZU9mZiA9IHRydWU7CgkJCQl0aGlzLl9yZWZy ZXNoVmFsdWUoKTsKCQkJCXRoaXMuX2NoYW5nZSggbnVsbCwgMCApOwoJCQkJdGhp cy5fYW5pbWF0ZU9mZiA9IGZhbHNlOwoJCQkJYnJlYWs7CgkJCWNhc2UgInZhbHVl cyI6CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gdHJ1ZTsKCQkJCXRoaXMuX3JlZnJl c2hWYWx1ZSgpOwoJCQkJZm9yICggaSA9IDA7IGkgPCB2YWxzTGVuZ3RoOyBpICs9 IDEgKSB7CgkJCQkJdGhpcy5fY2hhbmdlKCBudWxsLCBpICk7CgkJCQl9CgkJCQl0 aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSAibWlu IjoKCQkJY2FzZSAibWF4IjoKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJ CQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0g ZmFsc2U7CgkJCQlicmVhazsKCQl9Cgl9LAoKCS8vaW50ZXJuYWwgdmFsdWUgZ2V0 dGVyCgkvLyBfdmFsdWUoKSByZXR1cm5zIHZhbHVlIHRyaW1tZWQgYnkgbWluIGFu ZCBtYXgsIGFsaWduZWQgYnkgc3RlcAoJX3ZhbHVlOiBmdW5jdGlvbigpIHsKCQl2 YXIgdmFsID0gdGhpcy5vcHRpb25zLnZhbHVlOwoJCXZhbCA9IHRoaXMuX3RyaW1B bGlnblZhbHVlKCB2YWwgKTsKCgkJcmV0dXJuIHZhbDsKCX0sCgoJLy9pbnRlcm5h bCB2YWx1ZXMgZ2V0dGVyCgkvLyBfdmFsdWVzKCkgcmV0dXJucyBhcnJheSBvZiB2 YWx1ZXMgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCgkv LyBfdmFsdWVzKCBpbmRleCApIHJldHVybnMgc2luZ2xlIHZhbHVlIHRyaW1tZWQg YnkgbWluIGFuZCBtYXgsIGFsaWduZWQgYnkgc3RlcAoJX3ZhbHVlczogZnVuY3Rp b24oIGluZGV4ICkgewoJCXZhciB2YWwsCgkJCXZhbHMsCgkJCWk7CgoJCWlmICgg YXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdmFsID0gdGhpcy5vcHRpb25zLnZhbHVl c1sgaW5kZXggXTsKCQkJdmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbCAp OwoKCQkJcmV0dXJuIHZhbDsKCQl9IGVsc2UgewoJCQkvLyAuc2xpY2UoKSBjcmVh dGVzIGEgY29weSBvZiB0aGUgYXJyYXkKCQkJLy8gdGhpcyBjb3B5IGdldHMgdHJp bW1lZCBieSBtaW4gYW5kIG1heCBhbmQgdGhlbiByZXR1cm5lZAoJCQl2YWxzID0g dGhpcy5vcHRpb25zLnZhbHVlcy5zbGljZSgpOwoJCQlmb3IgKCBpID0gMDsgaSA8 IHZhbHMubGVuZ3RoOyBpKz0gMSkgewoJCQkJdmFsc1sgaSBdID0gdGhpcy5fdHJp bUFsaWduVmFsdWUoIHZhbHNbIGkgXSApOwoJCQl9CgoJCQlyZXR1cm4gdmFsczsK CQl9Cgl9LAoKCS8vIHJldHVybnMgdGhlIHN0ZXAtYWxpZ25lZCB2YWx1ZSB0aGF0 IHZhbCBpcyBjbG9zZXN0IHRvLCBiZXR3ZWVuIChpbmNsdXNpdmUpIG1pbiBhbmQg bWF4CglfdHJpbUFsaWduVmFsdWU6IGZ1bmN0aW9uKCB2YWwgKSB7CgkJaWYgKCB2 YWwgPD0gdGhpcy5fdmFsdWVNaW4oKSApIHsKCQkJcmV0dXJuIHRoaXMuX3ZhbHVl TWluKCk7CgkJfQoJCWlmICggdmFsID49IHRoaXMuX3ZhbHVlTWF4KCkgKSB7CgkJ CXJldHVybiB0aGlzLl92YWx1ZU1heCgpOwoJCX0KCQl2YXIgc3RlcCA9ICggdGhp cy5vcHRpb25zLnN0ZXAgPiAwICkgPyB0aGlzLm9wdGlvbnMuc3RlcCA6IDEsCgkJ CXZhbE1vZFN0ZXAgPSAodmFsIC0gdGhpcy5fdmFsdWVNaW4oKSkgJSBzdGVwLAoJ CQlhbGlnblZhbHVlID0gdmFsIC0gdmFsTW9kU3RlcDsKCgkJaWYgKCBNYXRoLmFi cyh2YWxNb2RTdGVwKSAqIDIgPj0gc3RlcCApIHsKCQkJYWxpZ25WYWx1ZSArPSAo IHZhbE1vZFN0ZXAgPiAwICkgPyBzdGVwIDogKCAtc3RlcCApOwoJCX0KCgkJLy8g U2luY2UgSmF2YVNjcmlwdCBoYXMgcHJvYmxlbXMgd2l0aCBsYXJnZSBmbG9hdHMs IHJvdW5kCgkJLy8gdGhlIGZpbmFsIHZhbHVlIHRvIDUgZGlnaXRzIGFmdGVyIHRo ZSBkZWNpbWFsIHBvaW50IChzZWUgIzQxMjQpCgkJcmV0dXJuIHBhcnNlRmxvYXQo IGFsaWduVmFsdWUudG9GaXhlZCg1KSApOwoJfSwKCglfdmFsdWVNaW46IGZ1bmN0 aW9uKCkgewoJCXJldHVybiB0aGlzLm9wdGlvbnMubWluOwoJfSwKCglfdmFsdWVN YXg6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm9wdGlvbnMubWF4OwoJfSwK CglfcmVmcmVzaFZhbHVlOiBmdW5jdGlvbigpIHsKCQl2YXIgbGFzdFZhbFBlcmNl bnQsIHZhbFBlcmNlbnQsIHZhbHVlLCB2YWx1ZU1pbiwgdmFsdWVNYXgsCgkJCW9S YW5nZSA9IHRoaXMub3B0aW9ucy5yYW5nZSwKCQkJbyA9IHRoaXMub3B0aW9ucywK CQkJdGhhdCA9IHRoaXMsCgkJCWFuaW1hdGUgPSAoICF0aGlzLl9hbmltYXRlT2Zm ICkgPyBvLmFuaW1hdGUgOiBmYWxzZSwKCQkJX3NldCA9IHt9OwoKCQlpZiAoIHRo aXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgg KSB7CgkJCXRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJdmFs UGVyY2VudCA9ICggdGhhdC52YWx1ZXMoaSkgLSB0aGF0Ll92YWx1ZU1pbigpICkg LyAoIHRoYXQuX3ZhbHVlTWF4KCkgLSB0aGF0Ll92YWx1ZU1pbigpICkgKiAxMDA7 CgkJCQlfc2V0WyB0aGF0Lm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAi bGVmdCIgOiAiYm90dG9tIiBdID0gdmFsUGVyY2VudCArICIlIjsKCQkJCSQoIHRo aXMgKS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBd KCBfc2V0LCBvLmFuaW1hdGUgKTsKCQkJCWlmICggdGhhdC5vcHRpb25zLnJhbmdl ID09PSB0cnVlICkgewoJCQkJCWlmICggdGhhdC5vcmllbnRhdGlvbiA9PT0gImhv cml6b250YWwiICkgewoJCQkJCQlpZiAoIGkgPT09IDAgKSB7CgkJCQkJCQl0aGF0 LnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3Mi IF0oIHsgbGVmdDogdmFsUGVyY2VudCArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJ CQkJfQoJCQkJCQlpZiAoIGkgPT09IDEgKSB7CgkJCQkJCQl0aGF0LnJhbmdlWyBh bmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyB3aWR0aDogKCB2YWxQZXJj ZW50IC0gbGFzdFZhbFBlcmNlbnQgKSArICIlIiB9LCB7IHF1ZXVlOiBmYWxzZSwg ZHVyYXRpb246IG8uYW5pbWF0ZSB9ICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJ CQkJCQlpZiAoIGkgPT09IDAgKSB7CgkJCQkJCQl0aGF0LnJhbmdlLnN0b3AoIDEs IDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgYm90dG9tOiAo IHZhbFBlcmNlbnQgKSArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJCQkJfQoJCQkJ CQlpZiAoIGkgPT09IDEgKSB7CgkJCQkJCQl0aGF0LnJhbmdlWyBhbmltYXRlID8g ImFuaW1hdGUiIDogImNzcyIgXSggeyBoZWlnaHQ6ICggdmFsUGVyY2VudCAtIGxh c3RWYWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9u OiBvLmFuaW1hdGUgfSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJbGFzdFZh bFBlcmNlbnQgPSB2YWxQZXJjZW50OwoJCQl9KTsKCQl9IGVsc2UgewoJCQl2YWx1 ZSA9IHRoaXMudmFsdWUoKTsKCQkJdmFsdWVNaW4gPSB0aGlzLl92YWx1ZU1pbigp OwoJCQl2YWx1ZU1heCA9IHRoaXMuX3ZhbHVlTWF4KCk7CgkJCXZhbFBlcmNlbnQg PSAoIHZhbHVlTWF4ICE9PSB2YWx1ZU1pbiApID8KCQkJCQkoIHZhbHVlIC0gdmFs dWVNaW4gKSAvICggdmFsdWVNYXggLSB2YWx1ZU1pbiApICogMTAwIDoKCQkJCQkw OwoJCQlfc2V0WyB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAi bGVmdCIgOiAiYm90dG9tIiBdID0gdmFsUGVyY2VudCArICIlIjsKCQkJdGhpcy5o YW5kbGUuc3RvcCggMSwgMSApWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIg XSggX3NldCwgby5hbmltYXRlICk7CgoJCQlpZiAoIG9SYW5nZSA9PT0gIm1pbiIg JiYgdGhpcy5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICkgewoJCQkJdGhp cy5yYW5nZS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3Nz IiBdKCB7IHdpZHRoOiB2YWxQZXJjZW50ICsgIiUiIH0sIG8uYW5pbWF0ZSApOwoJ CQl9CgkJCWlmICggb1JhbmdlID09PSAibWF4IiAmJiB0aGlzLm9yaWVudGF0aW9u ID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCQl0aGlzLnJhbmdlWyBhbmltYXRlID8g ImFuaW1hdGUiIDogImNzcyIgXSggeyB3aWR0aDogKCAxMDAgLSB2YWxQZXJjZW50 ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUg fSApOwoJCQl9CgkJCWlmICggb1JhbmdlID09PSAibWluIiAmJiB0aGlzLm9yaWVu dGF0aW9uID09PSAidmVydGljYWwiICkgewoJCQkJdGhpcy5yYW5nZS5zdG9wKCAx LCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IGhlaWdodDog dmFsUGVyY2VudCArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJfQoJCQlpZiAoIG9S YW5nZSA9PT0gIm1heCIgJiYgdGhpcy5vcmllbnRhdGlvbiA9PT0gInZlcnRpY2Fs IiApIHsKCQkJCXRoaXMucmFuZ2VbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3Nz IiBdKCB7IGhlaWdodDogKCAxMDAgLSB2YWxQZXJjZW50ICkgKyAiJSIgfSwgeyBx dWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQl9CgkJfQoJ fSwKCglfaGFuZGxlRXZlbnRzOiB7CgkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50 ICkgewoJCQkvKmpzaGludCBtYXhjb21wbGV4aXR5OjI1Ki8KCQkJdmFyIGFsbG93 ZWQsIGN1clZhbCwgbmV3VmFsLCBzdGVwLAoJCQkJaW5kZXggPSAkKCBldmVudC50 YXJnZXQgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIgKTsKCgkJCXN3 aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJCQljYXNlICQudWkua2V5Q29kZS5I T01FOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuRU5EOgoJCQkJY2FzZSAkLnVpLmtl eUNvZGUuUEFHRV9VUDoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfRE9XTjoK CQkJCWNhc2UgJC51aS5rZXlDb2RlLlVQOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUu UklHSFQ6CgkJCQljYXNlICQudWkua2V5Q29kZS5ET1dOOgoJCQkJY2FzZSAkLnVp LmtleUNvZGUuTEVGVDoKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJ CWlmICggIXRoaXMuX2tleVNsaWRpbmcgKSB7CgkJCQkJCXRoaXMuX2tleVNsaWRp bmcgPSB0cnVlOwoJCQkJCQkkKCBldmVudC50YXJnZXQgKS5hZGRDbGFzcyggInVp LXN0YXRlLWFjdGl2ZSIgKTsKCQkJCQkJYWxsb3dlZCA9IHRoaXMuX3N0YXJ0KCBl dmVudCwgaW5kZXggKTsKCQkJCQkJaWYgKCBhbGxvd2VkID09PSBmYWxzZSApIHsK CQkJCQkJCXJldHVybjsKCQkJCQkJfQoJCQkJCX0KCQkJCQlicmVhazsKCQkJfQoK CQkJc3RlcCA9IHRoaXMub3B0aW9ucy5zdGVwOwoJCQlpZiAoIHRoaXMub3B0aW9u cy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCQlj dXJWYWwgPSBuZXdWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggKTsKCQkJfSBlbHNl IHsKCQkJCWN1clZhbCA9IG5ld1ZhbCA9IHRoaXMudmFsdWUoKTsKCQkJfQoKCQkJ c3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJCWNhc2UgJC51aS5rZXlDb2Rl LkhPTUU6CgkJCQkJbmV3VmFsID0gdGhpcy5fdmFsdWVNaW4oKTsKCQkJCQlicmVh azsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkVORDoKCQkJCQluZXdWYWwgPSB0aGlz Ll92YWx1ZU1heCgpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUu UEFHRV9VUDoKCQkJCQluZXdWYWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggY3Vy VmFsICsgKCAodGhpcy5fdmFsdWVNYXgoKSAtIHRoaXMuX3ZhbHVlTWluKCkpIC8g bnVtUGFnZXMgKSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUu UEFHRV9ET1dOOgoJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBj dXJWYWwgLSAoICh0aGlzLl92YWx1ZU1heCgpIC0gdGhpcy5fdmFsdWVNaW4oKSkg LyBudW1QYWdlcyApICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICQudWkua2V5Q29k ZS5VUDoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlJJR0hUOgoJCQkJCWlmICggY3Vy VmFsID09PSB0aGlzLl92YWx1ZU1heCgpICkgewoJCQkJCQlyZXR1cm47CgkJCQkJ fQoJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBjdXJWYWwgKyBz dGVwICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICQudWkua2V5Q29kZS5ET1dOOgoJ CQkJY2FzZSAkLnVpLmtleUNvZGUuTEVGVDoKCQkJCQlpZiAoIGN1clZhbCA9PT0g dGhpcy5fdmFsdWVNaW4oKSApIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQlu ZXdWYWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggY3VyVmFsIC0gc3RlcCApOwoJ CQkJCWJyZWFrOwoJCQl9CgoJCQl0aGlzLl9zbGlkZSggZXZlbnQsIGluZGV4LCBu ZXdWYWwgKTsKCQl9LAoJCWtleXVwOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZh ciBpbmRleCA9ICQoIGV2ZW50LnRhcmdldCApLmRhdGEoICJ1aS1zbGlkZXItaGFu ZGxlLWluZGV4IiApOwoKCQkJaWYgKCB0aGlzLl9rZXlTbGlkaW5nICkgewoJCQkJ dGhpcy5fa2V5U2xpZGluZyA9IGZhbHNlOwoJCQkJdGhpcy5fc3RvcCggZXZlbnQs IGluZGV4ICk7CgkJCQl0aGlzLl9jaGFuZ2UoIGV2ZW50LCBpbmRleCApOwoJCQkJ JCggZXZlbnQudGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUi ICk7CgkJCX0KCQl9Cgl9Cgp9KTsKCn0oalF1ZXJ5KSk7CgooZnVuY3Rpb24oICQg KSB7CgpmdW5jdGlvbiBtb2RpZmllciggZm4gKSB7CglyZXR1cm4gZnVuY3Rpb24o KSB7CgkJdmFyIHByZXZpb3VzID0gdGhpcy5lbGVtZW50LnZhbCgpOwoJCWZuLmFw cGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl0aGlzLl9yZWZyZXNoKCk7CgkJaWYg KCBwcmV2aW91cyAhPT0gdGhpcy5lbGVtZW50LnZhbCgpICkgewoJCQl0aGlzLl90 cmlnZ2VyKCAiY2hhbmdlIiApOwoJCX0KCX07Cn0KCiQud2lkZ2V0KCAidWkuc3Bp bm5lciIsIHsKCXZlcnNpb246ICIxLjEwLjAiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8 aW5wdXQ+IiwKCXdpZGdldEV2ZW50UHJlZml4OiAic3BpbiIsCglvcHRpb25zOiB7 CgkJY3VsdHVyZTogbnVsbCwKCQlpY29uczogewoJCQlkb3duOiAidWktaWNvbi10 cmlhbmdsZS0xLXMiLAoJCQl1cDogInVpLWljb24tdHJpYW5nbGUtMS1uIgoJCX0s CgkJaW5jcmVtZW50YWw6IHRydWUsCgkJbWF4OiBudWxsLAoJCW1pbjogbnVsbCwK CQludW1iZXJGb3JtYXQ6IG51bGwsCgkJcGFnZTogMTAsCgkJc3RlcDogMSwKCgkJ Y2hhbmdlOiBudWxsLAoJCXNwaW46IG51bGwsCgkJc3RhcnQ6IG51bGwsCgkJc3Rv cDogbnVsbAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQkvLyBoYW5kbGUg c3RyaW5nIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgcGFyc2VkCgkJdGhpcy5fc2V0 T3B0aW9uKCAibWF4IiwgdGhpcy5vcHRpb25zLm1heCApOwoJCXRoaXMuX3NldE9w dGlvbiggIm1pbiIsIHRoaXMub3B0aW9ucy5taW4gKTsKCQl0aGlzLl9zZXRPcHRp b24oICJzdGVwIiwgdGhpcy5vcHRpb25zLnN0ZXAgKTsKCgkJLy8gZm9ybWF0IHRo ZSB2YWx1ZSwgYnV0IGRvbid0IGNvbnN0cmFpbgoJCXRoaXMuX3ZhbHVlKCB0aGlz LmVsZW1lbnQudmFsKCksIHRydWUgKTsKCgkJdGhpcy5fZHJhdygpOwoJCXRoaXMu X29uKCB0aGlzLl9ldmVudHMgKTsKCQl0aGlzLl9yZWZyZXNoKCk7CgoJCS8vIHR1 cm5pbmcgb2ZmIGF1dG9jb21wbGV0ZSBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9t IHJlbWVtYmVyaW5nIHRoZQoJCS8vIHZhbHVlIHdoZW4gbmF2aWdhdGluZyB0aHJv dWdoIGhpc3RvcnksIHNvIHdlIHJlLWVuYWJsZSBhdXRvY29tcGxldGUKCQkvLyBp ZiB0aGUgcGFnZSBpcyB1bmxvYWRlZCBiZWZvcmUgdGhlIHdpZGdldCBpcyBkZXN0 cm95ZWQuICM3NzkwCgkJdGhpcy5fb24oIHRoaXMud2luZG93LCB7CgkJCWJlZm9y ZXVubG9hZDogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQXR0 ciggImF1dG9jb21wbGV0ZSIgKTsKCQkJfQoJCX0pOwoJfSwKCglfZ2V0Q3JlYXRl T3B0aW9uczogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB7fSwKCQkJZWxl bWVudCA9IHRoaXMuZWxlbWVudDsKCgkJJC5lYWNoKCBbICJtaW4iLCAibWF4Iiwg InN0ZXAiIF0sIGZ1bmN0aW9uKCBpLCBvcHRpb24gKSB7CgkJCXZhciB2YWx1ZSA9 IGVsZW1lbnQuYXR0ciggb3B0aW9uICk7CgkJCWlmICggdmFsdWUgIT09IHVuZGVm aW5lZCAmJiB2YWx1ZS5sZW5ndGggKSB7CgkJCQlvcHRpb25zWyBvcHRpb24gXSA9 IHZhbHVlOwoJCQl9CgkJfSk7CgoJCXJldHVybiBvcHRpb25zOwoJfSwKCglfZXZl bnRzOiB7CgkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQlpZiAoIHRo aXMuX3N0YXJ0KCBldmVudCApICYmIHRoaXMuX2tleWRvd24oIGV2ZW50ICkgKSB7 CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9CgkJfSwKCQlrZXl1cDog Il9zdG9wIiwKCQlmb2N1czogZnVuY3Rpb24oKSB7CgkJCXRoaXMucHJldmlvdXMg PSB0aGlzLmVsZW1lbnQudmFsKCk7CgkJfSwKCQlibHVyOiBmdW5jdGlvbiggZXZl bnQgKSB7CgkJCWlmICggdGhpcy5jYW5jZWxCbHVyICkgewoJCQkJZGVsZXRlIHRo aXMuY2FuY2VsQmx1cjsKCQkJCXJldHVybjsKCQkJfQoKCQkJdGhpcy5fcmVmcmVz aCgpOwoJCQlpZiAoIHRoaXMucHJldmlvdXMgIT09IHRoaXMuZWxlbWVudC52YWwo KSApIHsKCQkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiLCBldmVudCApOwoJCQl9 CgkJfSwKCQltb3VzZXdoZWVsOiBmdW5jdGlvbiggZXZlbnQsIGRlbHRhICkgewoJ CQlpZiAoICFkZWx0YSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoICF0aGlz LnNwaW5uaW5nICYmICF0aGlzLl9zdGFydCggZXZlbnQgKSApIHsKCQkJCXJldHVy biBmYWxzZTsKCQkJfQoKCQkJdGhpcy5fc3BpbiggKGRlbHRhID4gMCA/IDEgOiAt MSkgKiB0aGlzLm9wdGlvbnMuc3RlcCwgZXZlbnQgKTsKCQkJY2xlYXJUaW1lb3V0 KCB0aGlzLm1vdXNld2hlZWxUaW1lciApOwoJCQl0aGlzLm1vdXNld2hlZWxUaW1l ciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJaWYgKCB0aGlzLnNwaW5u aW5nICkgewoJCQkJCXRoaXMuX3N0b3AoIGV2ZW50ICk7CgkJCQl9CgkJCX0sIDEw MCApOwoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0sCgkJIm1vdXNlZG93 biAudWktc3Bpbm5lci1idXR0b24iOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZh ciBwcmV2aW91czsKCgkJCS8vIFdlIG5ldmVyIHdhbnQgdGhlIGJ1dHRvbnMgdG8g aGF2ZSBmb2N1czsgd2hlbmV2ZXIgdGhlIHVzZXIgaXMKCQkJLy8gaW50ZXJhY3Rp bmcgd2l0aCB0aGUgc3Bpbm5lciwgdGhlIGZvY3VzIHNob3VsZCBiZSBvbiB0aGUg aW5wdXQuCgkJCS8vIElmIHRoZSBpbnB1dCBpcyBmb2N1c2VkIHRoZW4gdGhpcy5w cmV2aW91cyBpcyBwcm9wZXJseSBzZXQgZnJvbQoJCQkvLyB3aGVuIHRoZSBpbnB1 dCBmaXJzdCByZWNlaXZlZCBmb2N1cy4gSWYgdGhlIGlucHV0IGlzIG5vdCBmb2N1 c2VkCgkJCS8vIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhpcy5wcmV2aW91cyBiYXNl ZCBvbiB0aGUgdmFsdWUgYmVmb3JlIHNwaW5uaW5nLgoJCQlwcmV2aW91cyA9IHRo aXMuZWxlbWVudFswXSA9PT0gdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50 ID8KCQkJCXRoaXMucHJldmlvdXMgOiB0aGlzLmVsZW1lbnQudmFsKCk7CgkJCWZ1 bmN0aW9uIGNoZWNrRm9jdXMoKSB7CgkJCQl2YXIgaXNBY3RpdmUgPSB0aGlzLmVs ZW1lbnRbMF0gPT09IHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudDsKCQkJ CWlmICggIWlzQWN0aXZlICkgewoJCQkJCXRoaXMuZWxlbWVudC5mb2N1cygpOwoJ CQkJCXRoaXMucHJldmlvdXMgPSBwcmV2aW91czsKCQkJCQkvLyBzdXBwb3J0OiBJ RQoJCQkJCS8vIElFIHNldHMgZm9jdXMgYXN5bmNocm9ub3VzbHksIHNvIHdlIG5l ZWQgdG8gY2hlY2sgaWYgZm9jdXMKCQkJCQkvLyBtb3ZlZCBvZmYgb2YgdGhlIGlu cHV0IGJlY2F1c2UgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgYnV0dG9uLgoJCQkJ CXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCQl0aGlzLnByZXZpb3VzID0g cHJldmlvdXM7CgkJCQkJfSk7CgkJCQl9CgkJCX0KCgkJCS8vIGVuc3VyZSBmb2N1 cyBpcyBvbiAob3Igc3RheXMgb24pIHRoZSB0ZXh0IGZpZWxkCgkJCWV2ZW50LnBy ZXZlbnREZWZhdWx0KCk7CgkJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoKCQkJ Ly8gc3VwcG9ydDogSUUKCQkJLy8gSUUgZG9lc24ndCBwcmV2ZW50IG1vdmluZyBm b2N1cyBldmVuIHdpdGggZXZlbnQucHJldmVudERlZmF1bHQoKQoJCQkvLyBzbyB3 ZSBzZXQgYSBmbGFnIHRvIGtub3cgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBi bHVyIGV2ZW50CgkJCS8vIGFuZCBjaGVjayAoYWdhaW4pIGlmIGZvY3VzIG1vdmVk IG9mZiBvZiB0aGUgaW5wdXQuCgkJCXRoaXMuY2FuY2VsQmx1ciA9IHRydWU7CgkJ CXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJZGVsZXRlIHRoaXMuY2FuY2Vs Qmx1cjsKCQkJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoJCQl9KTsKCgkJCWlm ICggdGhpcy5fc3RhcnQoIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQkJcmV0dXJu OwoJCQl9CgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsICQoIGV2ZW50LmN1cnJlbnRU YXJnZXQgKS5oYXNDbGFzcyggInVpLXNwaW5uZXItdXAiICkgPyAxIDogLTEsIGV2 ZW50ICk7CgkJfSwKCQkibW91c2V1cCAudWktc3Bpbm5lci1idXR0b24iOiAiX3N0 b3AiLAoJCSJtb3VzZWVudGVyIC51aS1zcGlubmVyLWJ1dHRvbiI6IGZ1bmN0aW9u KCBldmVudCApIHsKCQkJLy8gYnV0dG9uIHdpbGwgYWRkIHVpLXN0YXRlLWFjdGl2 ZSBpZiBtb3VzZSB3YXMgZG93biB3aGlsZSBtb3VzZWxlYXZlIGFuZCBrZXB0IGRv d24KCQkJaWYgKCAhJCggZXZlbnQuY3VycmVudFRhcmdldCApLmhhc0NsYXNzKCAi dWktc3RhdGUtYWN0aXZlIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAo IHRoaXMuX3N0YXJ0KCBldmVudCApID09PSBmYWxzZSApIHsKCQkJCXJldHVybiBm YWxzZTsKCQkJfQoJCQl0aGlzLl9yZXBlYXQoIG51bGwsICQoIGV2ZW50LmN1cnJl bnRUYXJnZXQgKS5oYXNDbGFzcyggInVpLXNwaW5uZXItdXAiICkgPyAxIDogLTEs IGV2ZW50ICk7CgkJfSwKCQkvLyBUT0RPOiBkbyB3ZSByZWFsbHkgd2FudCB0byBj b25zaWRlciB0aGlzIGEgc3RvcD8KCQkvLyBzaG91bGRuJ3Qgd2UganVzdCBzdG9w IHRoZSByZXBlYXRlciBhbmQgd2FpdCB1bnRpbCBtb3VzZXVwIGJlZm9yZQoJCS8v IHdlIHRyaWdnZXIgdGhlIHN0b3AgZXZlbnQ/CgkJIm1vdXNlbGVhdmUgLnVpLXNw aW5uZXItYnV0dG9uIjogIl9zdG9wIgoJfSwKCglfZHJhdzogZnVuY3Rpb24oKSB7 CgkJdmFyIHVpU3Bpbm5lciA9IHRoaXMudWlTcGlubmVyID0gdGhpcy5lbGVtZW50 CgkJCS5hZGRDbGFzcyggInVpLXNwaW5uZXItaW5wdXQiICkKCQkJLmF0dHIoICJh dXRvY29tcGxldGUiLCAib2ZmIiApCgkJCS53cmFwKCB0aGlzLl91aVNwaW5uZXJI dG1sKCkgKQoJCQkucGFyZW50KCkKCQkJCS8vIGFkZCBidXR0b25zCgkJCQkuYXBw ZW5kKCB0aGlzLl9idXR0b25IdG1sKCkgKTsKCgkJdGhpcy5lbGVtZW50LmF0dHIo ICJyb2xlIiwgInNwaW5idXR0b24iICk7CgoJCS8vIGJ1dHRvbiBiaW5kaW5ncwoJ CXRoaXMuYnV0dG9ucyA9IHVpU3Bpbm5lci5maW5kKCAiLnVpLXNwaW5uZXItYnV0 dG9uIiApCgkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSApCgkJCS5idXR0b24oKQoJ CQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBJRSA2IGRv ZXNuJ3QgdW5kZXJzdGFuZCBoZWlnaHQ6IDUwJSBmb3IgdGhlIGJ1dHRvbnMKCQkv LyB1bmxlc3MgdGhlIHdyYXBwZXIgaGFzIGFuIGV4cGxpY2l0IGhlaWdodAoJCWlm ICggdGhpcy5idXR0b25zLmhlaWdodCgpID4gTWF0aC5jZWlsKCB1aVNwaW5uZXIu aGVpZ2h0KCkgKiAwLjUgKSAmJgoJCQkJdWlTcGlubmVyLmhlaWdodCgpID4gMCAp IHsKCQkJdWlTcGlubmVyLmhlaWdodCggdWlTcGlubmVyLmhlaWdodCgpICk7CgkJ fQoKCQkvLyBkaXNhYmxlIHNwaW5uZXIgaWYgZWxlbWVudCB3YXMgYWxyZWFkeSBk aXNhYmxlZAoJCWlmICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQl0aGlz LmRpc2FibGUoKTsKCQl9Cgl9LAoKCV9rZXlkb3duOiBmdW5jdGlvbiggZXZlbnQg KSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWtleUNvZGUgPSAk LnVpLmtleUNvZGU7CgoJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJY2Fz ZSBrZXlDb2RlLlVQOgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsIDEsIGV2ZW50ICk7 CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQl0aGlzLl9y ZXBlYXQoIG51bGwsIC0xLCBldmVudCApOwoJCQlyZXR1cm4gdHJ1ZTsKCQljYXNl IGtleUNvZGUuUEFHRV9VUDoKCQkJdGhpcy5fcmVwZWF0KCBudWxsLCBvcHRpb25z LnBhZ2UsIGV2ZW50ICk7CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5Q QUdFX0RPV046CgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgLW9wdGlvbnMucGFnZSwg ZXZlbnQgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9 LAoKCV91aVNwaW5uZXJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIjxzcGFu IGNsYXNzPSd1aS1zcGlubmVyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1 aS1jb3JuZXItYWxsJz48L3NwYW4+IjsKCX0sCgoJX2J1dHRvbkh0bWw6IGZ1bmN0 aW9uKCkgewoJCXJldHVybiAiIiArCgkJCSI8YSBjbGFzcz0ndWktc3Bpbm5lci1i dXR0b24gdWktc3Bpbm5lci11cCB1aS1jb3JuZXItdHInPiIgKwoJCQkJIjxzcGFu IGNsYXNzPSd1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMudXAgKyAiJz4m Izk2NTA7PC9zcGFuPiIgKwoJCQkiPC9hPiIgKwoJCQkiPGEgY2xhc3M9J3VpLXNw aW5uZXItYnV0dG9uIHVpLXNwaW5uZXItZG93biB1aS1jb3JuZXItYnInPiIgKwoJ CQkJIjxzcGFuIGNsYXNzPSd1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMu ZG93biArICInPiYjOTY2MDs8L3NwYW4+IiArCgkJCSI8L2E+IjsKCX0sCgoJX3N0 YXJ0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5zcGlubmluZyAm JiB0aGlzLl90cmlnZ2VyKCAic3RhcnQiLCBldmVudCApID09PSBmYWxzZSApIHsK CQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCAhdGhpcy5jb3VudGVyICkgewoJ CQl0aGlzLmNvdW50ZXIgPSAxOwoJCX0KCQl0aGlzLnNwaW5uaW5nID0gdHJ1ZTsK CQlyZXR1cm4gdHJ1ZTsKCX0sCgoJX3JlcGVhdDogZnVuY3Rpb24oIGksIHN0ZXBz LCBldmVudCApIHsKCQlpID0gaSB8fCA1MDA7CgoJCWNsZWFyVGltZW91dCggdGhp cy50aW1lciApOwoJCXRoaXMudGltZXIgPSB0aGlzLl9kZWxheShmdW5jdGlvbigp IHsKCQkJdGhpcy5fcmVwZWF0KCA0MCwgc3RlcHMsIGV2ZW50ICk7CgkJfSwgaSAp OwoKCQl0aGlzLl9zcGluKCBzdGVwcyAqIHRoaXMub3B0aW9ucy5zdGVwLCBldmVu dCApOwoJfSwKCglfc3BpbjogZnVuY3Rpb24oIHN0ZXAsIGV2ZW50ICkgewoJCXZh ciB2YWx1ZSA9IHRoaXMudmFsdWUoKSB8fCAwOwoKCQlpZiAoICF0aGlzLmNvdW50 ZXIgKSB7CgkJCXRoaXMuY291bnRlciA9IDE7CgkJfQoKCQl2YWx1ZSA9IHRoaXMu X2FkanVzdFZhbHVlKCB2YWx1ZSArIHN0ZXAgKiB0aGlzLl9pbmNyZW1lbnQoIHRo aXMuY291bnRlciApICk7CgoJCWlmICggIXRoaXMuc3Bpbm5pbmcgfHwgdGhpcy5f dHJpZ2dlciggInNwaW4iLCBldmVudCwgeyB2YWx1ZTogdmFsdWUgfSApICE9PSBm YWxzZSkgewoJCQl0aGlzLl92YWx1ZSggdmFsdWUgKTsKCQkJdGhpcy5jb3VudGVy Kys7CgkJfQoJfSwKCglfaW5jcmVtZW50OiBmdW5jdGlvbiggaSApIHsKCQl2YXIg aW5jcmVtZW50YWwgPSB0aGlzLm9wdGlvbnMuaW5jcmVtZW50YWw7CgoJCWlmICgg aW5jcmVtZW50YWwgKSB7CgkJCXJldHVybiAkLmlzRnVuY3Rpb24oIGluY3JlbWVu dGFsICkgPwoJCQkJaW5jcmVtZW50YWwoIGkgKSA6CgkJCQlNYXRoLmZsb29yKCBp KmkqaS81MDAwMCAtIGkqaS81MDAgKyAxNyppLzIwMCArIDEgKTsKCQl9CgoJCXJl dHVybiAxOwoJfSwKCglfcHJlY2lzaW9uOiBmdW5jdGlvbigpIHsKCQl2YXIgcHJl Y2lzaW9uID0gdGhpcy5fcHJlY2lzaW9uT2YoIHRoaXMub3B0aW9ucy5zdGVwICk7 CgkJaWYgKCB0aGlzLm9wdGlvbnMubWluICE9PSBudWxsICkgewoJCQlwcmVjaXNp b24gPSBNYXRoLm1heCggcHJlY2lzaW9uLCB0aGlzLl9wcmVjaXNpb25PZiggdGhp cy5vcHRpb25zLm1pbiApICk7CgkJfQoJCXJldHVybiBwcmVjaXNpb247Cgl9LAoK CV9wcmVjaXNpb25PZjogZnVuY3Rpb24oIG51bSApIHsKCQl2YXIgc3RyID0gbnVt LnRvU3RyaW5nKCksCgkJCWRlY2ltYWwgPSBzdHIuaW5kZXhPZiggIi4iICk7CgkJ cmV0dXJuIGRlY2ltYWwgPT09IC0xID8gMCA6IHN0ci5sZW5ndGggLSBkZWNpbWFs IC0gMTsKCX0sCgoJX2FkanVzdFZhbHVlOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJ dmFyIGJhc2UsIGFib3ZlTWluLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoK CQkvLyBtYWtlIHN1cmUgd2UncmUgYXQgYSB2YWxpZCBzdGVwCgkJLy8gLSBmaW5k IG91dCB3aGVyZSB3ZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgKG1pbiBvciAw KQoJCWJhc2UgPSBvcHRpb25zLm1pbiAhPT0gbnVsbCA/IG9wdGlvbnMubWluIDog MDsKCQlhYm92ZU1pbiA9IHZhbHVlIC0gYmFzZTsKCQkvLyAtIHJvdW5kIHRvIHRo ZSBuZWFyZXN0IHN0ZXAKCQlhYm92ZU1pbiA9IE1hdGgucm91bmQoYWJvdmVNaW4g LyBvcHRpb25zLnN0ZXApICogb3B0aW9ucy5zdGVwOwoJCS8vIC0gcm91bmRpbmcg aXMgYmFzZWQgb24gMCwgc28gYWRqdXN0IGJhY2sgdG8gb3VyIGJhc2UKCQl2YWx1 ZSA9IGJhc2UgKyBhYm92ZU1pbjsKCgkJLy8gZml4IHByZWNpc2lvbiBmcm9tIGJh ZCBKUyBmbG9hdGluZyBwb2ludCBtYXRoCgkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2 YWx1ZS50b0ZpeGVkKCB0aGlzLl9wcmVjaXNpb24oKSApICk7CgoJCS8vIGNsYW1w IHRoZSB2YWx1ZQoJCWlmICggb3B0aW9ucy5tYXggIT09IG51bGwgJiYgdmFsdWUg PiBvcHRpb25zLm1heCkgewoJCQlyZXR1cm4gb3B0aW9ucy5tYXg7CgkJfQoJCWlm ICggb3B0aW9ucy5taW4gIT09IG51bGwgJiYgdmFsdWUgPCBvcHRpb25zLm1pbiAp IHsKCQkJcmV0dXJuIG9wdGlvbnMubWluOwoJCX0KCgkJcmV0dXJuIHZhbHVlOwoJ fSwKCglfc3RvcDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggIXRoaXMuc3Bp bm5pbmcgKSB7CgkJCXJldHVybjsKCQl9CgoJCWNsZWFyVGltZW91dCggdGhpcy50 aW1lciApOwoJCWNsZWFyVGltZW91dCggdGhpcy5tb3VzZXdoZWVsVGltZXIgKTsK CQl0aGlzLmNvdW50ZXIgPSAwOwoJCXRoaXMuc3Bpbm5pbmcgPSBmYWxzZTsKCQl0 aGlzLl90cmlnZ2VyKCAic3RvcCIsIGV2ZW50ICk7Cgl9LAoKCV9zZXRPcHRpb246 IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCWlmICgga2V5ID09PSAiY3VsdHVy ZSIgfHwga2V5ID09PSAibnVtYmVyRm9ybWF0IiApIHsKCQkJdmFyIHByZXZWYWx1 ZSA9IHRoaXMuX3BhcnNlKCB0aGlzLmVsZW1lbnQudmFsKCkgKTsKCQkJdGhpcy5v cHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl0aGlzLmVsZW1lbnQudmFsKCB0aGlz Ll9mb3JtYXQoIHByZXZWYWx1ZSApICk7CgkJCXJldHVybjsKCQl9CgoJCWlmICgg a2V5ID09PSAibWF4IiB8fCBrZXkgPT09ICJtaW4iIHx8IGtleSA9PT0gInN0ZXAi ICkgewoJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJCQl2 YWx1ZSA9IHRoaXMuX3BhcnNlKCB2YWx1ZSApOwoJCQl9CgkJfQoJCWlmICgga2V5 ID09PSAiaWNvbnMiICkgewoJCQl0aGlzLmJ1dHRvbnMuZmlyc3QoKS5maW5kKCAi LnVpLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggdGhpcy5vcHRpb25zLmljb25z LnVwICkKCQkJCS5hZGRDbGFzcyggdmFsdWUudXAgKTsKCQkJdGhpcy5idXR0b25z Lmxhc3QoKS5maW5kKCAiLnVpLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggdGhp cy5vcHRpb25zLmljb25zLmRvd24gKQoJCQkJLmFkZENsYXNzKCB2YWx1ZS5kb3du ICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQlpZiAoIGtl eSA9PT0gImRpc2FibGVkIiApIHsKCQkJaWYgKCB2YWx1ZSApIHsKCQkJCXRoaXMu ZWxlbWVudC5wcm9wKCAiZGlzYWJsZWQiLCB0cnVlICk7CgkJCQl0aGlzLmJ1dHRv bnMuYnV0dG9uKCAiZGlzYWJsZSIgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuZWxl bWVudC5wcm9wKCAiZGlzYWJsZWQiLCBmYWxzZSApOwoJCQkJdGhpcy5idXR0b25z LmJ1dHRvbiggImVuYWJsZSIgKTsKCQkJfQoJCX0KCX0sCgoJX3NldE9wdGlvbnM6 IG1vZGlmaWVyKGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXRoaXMuX3N1cGVyKCBv cHRpb25zICk7CgkJdGhpcy5fdmFsdWUoIHRoaXMuZWxlbWVudC52YWwoKSApOwoJ fSksCgoJX3BhcnNlOiBmdW5jdGlvbiggdmFsICkgewoJCWlmICggdHlwZW9mIHZh bCA9PT0gInN0cmluZyIgJiYgdmFsICE9PSAiIiApIHsKCQkJdmFsID0gd2luZG93 Lkdsb2JhbGl6ZSAmJiB0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0ID8KCQkJCUds b2JhbGl6ZS5wYXJzZUZsb2F0KCB2YWwsIDEwLCB0aGlzLm9wdGlvbnMuY3VsdHVy ZSApIDogK3ZhbDsKCQl9CgkJcmV0dXJuIHZhbCA9PT0gIiIgfHwgaXNOYU4oIHZh bCApID8gbnVsbCA6IHZhbDsKCX0sCgoJX2Zvcm1hdDogZnVuY3Rpb24oIHZhbHVl ICkgewoJCWlmICggdmFsdWUgPT09ICIiICkgewoJCQlyZXR1cm4gIiI7CgkJfQoJ CXJldHVybiB3aW5kb3cuR2xvYmFsaXplICYmIHRoaXMub3B0aW9ucy5udW1iZXJG b3JtYXQgPwoJCQlHbG9iYWxpemUuZm9ybWF0KCB2YWx1ZSwgdGhpcy5vcHRpb25z Lm51bWJlckZvcm1hdCwgdGhpcy5vcHRpb25zLmN1bHR1cmUgKSA6CgkJCXZhbHVl OwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LmF0 dHIoewoJCQkiYXJpYS12YWx1ZW1pbiI6IHRoaXMub3B0aW9ucy5taW4sCgkJCSJh cmlhLXZhbHVlbWF4IjogdGhpcy5vcHRpb25zLm1heCwKCQkJLy8gVE9ETzogd2hh dCBzaG91bGQgd2UgZG8gd2l0aCB2YWx1ZXMgdGhhdCBjYW4ndCBiZSBwYXJzZWQ/ CgkJCSJhcmlhLXZhbHVlbm93IjogdGhpcy5fcGFyc2UoIHRoaXMuZWxlbWVudC52 YWwoKSApCgkJfSk7Cgl9LAoKCS8vIHVwZGF0ZSB0aGUgdmFsdWUgd2l0aG91dCB0 cmlnZ2VyaW5nIGNoYW5nZQoJX3ZhbHVlOiBmdW5jdGlvbiggdmFsdWUsIGFsbG93 QW55ICkgewoJCXZhciBwYXJzZWQ7CgkJaWYgKCB2YWx1ZSAhPT0gIiIgKSB7CgkJ CXBhcnNlZCA9IHRoaXMuX3BhcnNlKCB2YWx1ZSApOwoJCQlpZiAoIHBhcnNlZCAh PT0gbnVsbCApIHsKCQkJCWlmICggIWFsbG93QW55ICkgewoJCQkJCXBhcnNlZCA9 IHRoaXMuX2FkanVzdFZhbHVlKCBwYXJzZWQgKTsKCQkJCX0KCQkJCXZhbHVlID0g dGhpcy5fZm9ybWF0KCBwYXJzZWQgKTsKCQkJfQoJCX0KCQl0aGlzLmVsZW1lbnQu dmFsKCB2YWx1ZSApOwoJCXRoaXMuX3JlZnJlc2goKTsKCX0sCgoJX2Rlc3Ryb3k6 IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1 aS1zcGlubmVyLWlucHV0IiApCgkJCS5wcm9wKCAiZGlzYWJsZWQiLCBmYWxzZSAp CgkJCS5yZW1vdmVBdHRyKCAiYXV0b2NvbXBsZXRlIiApCgkJCS5yZW1vdmVBdHRy KCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVtaW4iICkKCQkJ LnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbWF4IiApCgkJCS5yZW1vdmVBdHRyKCAi YXJpYS12YWx1ZW5vdyIgKTsKCQl0aGlzLnVpU3Bpbm5lci5yZXBsYWNlV2l0aCgg dGhpcy5lbGVtZW50ICk7Cgl9LAoKCXN0ZXBVcDogbW9kaWZpZXIoZnVuY3Rpb24o IHN0ZXBzICkgewoJCXRoaXMuX3N0ZXBVcCggc3RlcHMgKTsKCX0pLAoJX3N0ZXBV cDogZnVuY3Rpb24oIHN0ZXBzICkgewoJCWlmICggdGhpcy5fc3RhcnQoKSApIHsK CQkJdGhpcy5fc3BpbiggKHN0ZXBzIHx8IDEpICogdGhpcy5vcHRpb25zLnN0ZXAg KTsKCQkJdGhpcy5fc3RvcCgpOwoJCX0KCX0sCgoJc3RlcERvd246IG1vZGlmaWVy KGZ1bmN0aW9uKCBzdGVwcyApIHsKCQl0aGlzLl9zdGVwRG93biggc3RlcHMgKTsK CX0pLAoJX3N0ZXBEb3duOiBmdW5jdGlvbiggc3RlcHMgKSB7CgkJaWYgKCB0aGlz Ll9zdGFydCgpICkgewoJCQl0aGlzLl9zcGluKCAoc3RlcHMgfHwgMSkgKiAtdGhp cy5vcHRpb25zLnN0ZXAgKTsKCQkJdGhpcy5fc3RvcCgpOwoJCX0KCX0sCgoJcGFn ZVVwOiBtb2RpZmllcihmdW5jdGlvbiggcGFnZXMgKSB7CgkJdGhpcy5fc3RlcFVw KCAocGFnZXMgfHwgMSkgKiB0aGlzLm9wdGlvbnMucGFnZSApOwoJfSksCgoJcGFn ZURvd246IG1vZGlmaWVyKGZ1bmN0aW9uKCBwYWdlcyApIHsKCQl0aGlzLl9zdGVw RG93biggKHBhZ2VzIHx8IDEpICogdGhpcy5vcHRpb25zLnBhZ2UgKTsKCX0pLAoK CXZhbHVlOiBmdW5jdGlvbiggbmV3VmFsICkgewoJCWlmICggIWFyZ3VtZW50cy5s ZW5ndGggKSB7CgkJCXJldHVybiB0aGlzLl9wYXJzZSggdGhpcy5lbGVtZW50LnZh bCgpICk7CgkJfQoJCW1vZGlmaWVyKCB0aGlzLl92YWx1ZSApLmNhbGwoIHRoaXMs IG5ld1ZhbCApOwoJfSwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0 aGlzLnVpU3Bpbm5lcjsKCX0KfSk7Cgp9KCBqUXVlcnkgKSApOwoKKGZ1bmN0aW9u KCAkLCB1bmRlZmluZWQgKSB7Cgp2YXIgdGFiSWQgPSAwLAoJcmhhc2ggPSAvIy4q JC87CgpmdW5jdGlvbiBnZXROZXh0VGFiSWQoKSB7CglyZXR1cm4gKyt0YWJJZDsK fQoKZnVuY3Rpb24gaXNMb2NhbCggYW5jaG9yICkgewoJcmV0dXJuIGFuY2hvci5o YXNoLmxlbmd0aCA+IDEgJiYKCQlkZWNvZGVVUklDb21wb25lbnQoIGFuY2hvci5o cmVmLnJlcGxhY2UoIHJoYXNoLCAiIiApICkgPT09CgkJCWRlY29kZVVSSUNvbXBv bmVudCggbG9jYXRpb24uaHJlZi5yZXBsYWNlKCByaGFzaCwgIiIgKSApOwp9Cgok LndpZGdldCggInVpLnRhYnMiLCB7Cgl2ZXJzaW9uOiAiMS4xMC4wIiwKCWRlbGF5 OiAzMDAsCglvcHRpb25zOiB7CgkJYWN0aXZlOiBudWxsLAoJCWNvbGxhcHNpYmxl OiBmYWxzZSwKCQlldmVudDogImNsaWNrIiwKCQloZWlnaHRTdHlsZTogImNvbnRl bnQiLAoJCWhpZGU6IG51bGwsCgkJc2hvdzogbnVsbCwKCgkJLy8gY2FsbGJhY2tz CgkJYWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwsCgkJYmVm b3JlTG9hZDogbnVsbCwKCQlsb2FkOiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0 aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0 aW9uczsKCgkJdGhpcy5ydW5uaW5nID0gZmFsc2U7CgoJCXRoaXMuZWxlbWVudAoJ CQkuYWRkQ2xhc3MoICJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVu dCB1aS1jb3JuZXItYWxsIiApCgkJCS50b2dnbGVDbGFzcyggInVpLXRhYnMtY29s bGFwc2libGUiLCBvcHRpb25zLmNvbGxhcHNpYmxlICkKCQkJLy8gUHJldmVudCB1 c2VycyBmcm9tIGZvY3VzaW5nIGRpc2FibGVkIHRhYnMgdmlhIGNsaWNrCgkJCS5k ZWxlZ2F0ZSggIi51aS10YWJzLW5hdiA+IGxpIiwgIm1vdXNlZG93biIgKyB0aGlz LmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoICQo IHRoaXMgKS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJCQlldmVu dC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9KQoJCQkvLyBzdXBwb3J0OiBJ RSA8OQoJCQkvLyBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGFjdGlvbiBpbiBtb3Vz ZWRvd24gZG9lc24ndCBwcmV2ZW50IElFCgkJCS8vIGZyb20gZm9jdXNpbmcgdGhl IGVsZW1lbnQsIHNvIGlmIHRoZSBhbmNob3IgZ2V0cyBmb2N1c2VkLCBibHVyLgoJ CQkvLyBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGZvY3VzaW5nIHRoZSBw cmV2aW91c2x5IGZvY3VzZWQKCQkJLy8gZWxlbWVudCBzaW5jZSBjbGlja2luZyBv biBhIG5vbi1mb2N1c2FibGUgZWxlbWVudCBzaG91bGQgZm9jdXMKCQkJLy8gdGhl IGJvZHkgYW55d2F5LgoJCQkuZGVsZWdhdGUoICIudWktdGFicy1hbmNob3IiLCAi Zm9jdXMiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlp ZiAoICQoIHRoaXMgKS5jbG9zZXN0KCAibGkiICkuaXMoICIudWktc3RhdGUtZGlz YWJsZWQiICkgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQl9CgkJCX0pOwoKCQl0 aGlzLl9wcm9jZXNzVGFicygpOwoJCW9wdGlvbnMuYWN0aXZlID0gdGhpcy5faW5p dGlhbEFjdGl2ZSgpOwoKCQkvLyBUYWtlIGRpc2FibGluZyB0YWJzIHZpYSBjbGFz cyBhdHRyaWJ1dGUgZnJvbSBIVE1MCgkJLy8gaW50byBhY2NvdW50IGFuZCB1cGRh dGUgb3B0aW9uIHByb3Blcmx5LgoJCWlmICggJC5pc0FycmF5KCBvcHRpb25zLmRp c2FibGVkICkgKSB7CgkJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLnVuaXF1ZSggb3B0 aW9ucy5kaXNhYmxlZC5jb25jYXQoCgkJCQkkLm1hcCggdGhpcy50YWJzLmZpbHRl ciggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSwgZnVuY3Rpb24oIGxpICkgewoJCQkJ CXJldHVybiB0aGF0LnRhYnMuaW5kZXgoIGxpICk7CgkJCQl9KQoJCQkpICkuc29y dCgpOwoJCX0KCgkJLy8gY2hlY2sgZm9yIGxlbmd0aCBhdm9pZHMgZXJyb3Igd2hl biBpbml0aWFsaXppbmcgZW1wdHkgbGlzdAoJCWlmICggdGhpcy5vcHRpb25zLmFj dGl2ZSAhPT0gZmFsc2UgJiYgdGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJdGhp cy5hY3RpdmUgPSB0aGlzLl9maW5kQWN0aXZlKCBvcHRpb25zLmFjdGl2ZSApOwoJ CX0gZWxzZSB7CgkJCXRoaXMuYWN0aXZlID0gJCgpOwoJCX0KCgkJdGhpcy5fcmVm cmVzaCgpOwoKCQlpZiAoIHRoaXMuYWN0aXZlLmxlbmd0aCApIHsKCQkJdGhpcy5s b2FkKCBvcHRpb25zLmFjdGl2ZSApOwoJCX0KCX0sCgoJX2luaXRpYWxBY3RpdmU6 IGZ1bmN0aW9uKCkgewoJCXZhciBhY3RpdmUgPSB0aGlzLm9wdGlvbnMuYWN0aXZl LAoJCQljb2xsYXBzaWJsZSA9IHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSwKCQkJ bG9jYXRpb25IYXNoID0gbG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoIDEgKTsKCgkJ aWYgKCBhY3RpdmUgPT09IG51bGwgKSB7CgkJCS8vIGNoZWNrIHRoZSBmcmFnbWVu dCBpZGVudGlmaWVyIGluIHRoZSBVUkwKCQkJaWYgKCBsb2NhdGlvbkhhc2ggKSB7 CgkJCQl0aGlzLnRhYnMuZWFjaChmdW5jdGlvbiggaSwgdGFiICkgewoJCQkJCWlm ICggJCggdGFiICkuYXR0ciggImFyaWEtY29udHJvbHMiICkgPT09IGxvY2F0aW9u SGFzaCApIHsKCQkJCQkJYWN0aXZlID0gaTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJ CQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBjaGVjayBmb3IgYSB0YWIgbWFya2Vk IGFjdGl2ZSB2aWEgYSBjbGFzcwoJCQlpZiAoIGFjdGl2ZSA9PT0gbnVsbCApIHsK CQkJCWFjdGl2ZSA9IHRoaXMudGFicy5pbmRleCggdGhpcy50YWJzLmZpbHRlcigg Ii51aS10YWJzLWFjdGl2ZSIgKSApOwoJCQl9CgoJCQkvLyBubyBhY3RpdmUgdGFi LCBzZXQgdG8gZmFsc2UKCQkJaWYgKCBhY3RpdmUgPT09IG51bGwgfHwgYWN0aXZl ID09PSAtMSApIHsKCQkJCWFjdGl2ZSA9IHRoaXMudGFicy5sZW5ndGggPyAwIDog ZmFsc2U7CgkJCX0KCQl9CgoJCS8vIGhhbmRsZSBudW1iZXJzOiBuZWdhdGl2ZSwg b3V0IG9mIHJhbmdlCgkJaWYgKCBhY3RpdmUgIT09IGZhbHNlICkgewoJCQlhY3Rp dmUgPSB0aGlzLnRhYnMuaW5kZXgoIHRoaXMudGFicy5lcSggYWN0aXZlICkgKTsK CQkJaWYgKCBhY3RpdmUgPT09IC0xICkgewoJCQkJYWN0aXZlID0gY29sbGFwc2li bGUgPyBmYWxzZSA6IDA7CgkJCX0KCQl9CgoJCS8vIGRvbid0IGFsbG93IGNvbGxh cHNpYmxlOiBmYWxzZSBhbmQgYWN0aXZlOiBmYWxzZQoJCWlmICggIWNvbGxhcHNp YmxlICYmIGFjdGl2ZSA9PT0gZmFsc2UgJiYgdGhpcy5hbmNob3JzLmxlbmd0aCAp IHsKCQkJYWN0aXZlID0gMDsKCQl9CgoJCXJldHVybiBhY3RpdmU7Cgl9LAoKCV9n ZXRDcmVhdGVFdmVudERhdGE6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCXRh YjogdGhpcy5hY3RpdmUsCgkJCXBhbmVsOiAhdGhpcy5hY3RpdmUubGVuZ3RoID8g JCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlICkKCQl9OwoJ fSwKCglfdGFiS2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8qanNoaW50 IG1heGNvbXBsZXhpdHk6MTUqLwoJCXZhciBmb2N1c2VkVGFiID0gJCggdGhpcy5k b2N1bWVudFswXS5hY3RpdmVFbGVtZW50ICkuY2xvc2VzdCggImxpIiApLAoJCQlz ZWxlY3RlZEluZGV4ID0gdGhpcy50YWJzLmluZGV4KCBmb2N1c2VkVGFiICksCgkJ CWdvaW5nRm9yd2FyZCA9IHRydWU7CgoJCWlmICggdGhpcy5faGFuZGxlUGFnZU5h diggZXZlbnQgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJc3dpdGNoICggZXZlbnQu a2V5Q29kZSApIHsKCQkJY2FzZSAkLnVpLmtleUNvZGUuUklHSFQ6CgkJCWNhc2Ug JC51aS5rZXlDb2RlLkRPV046CgkJCQlzZWxlY3RlZEluZGV4Kys7CgkJCQlicmVh azsKCQkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCWNhc2UgJC51aS5rZXlDb2Rl LkxFRlQ6CgkJCQlnb2luZ0ZvcndhcmQgPSBmYWxzZTsKCQkJCXNlbGVjdGVkSW5k ZXgtLTsKCQkJCWJyZWFrOwoJCQljYXNlICQudWkua2V5Q29kZS5FTkQ6CgkJCQlz ZWxlY3RlZEluZGV4ID0gdGhpcy5hbmNob3JzLmxlbmd0aCAtIDE7CgkJCQlicmVh azsKCQkJY2FzZSAkLnVpLmtleUNvZGUuSE9NRToKCQkJCXNlbGVjdGVkSW5kZXgg PSAwOwoJCQkJYnJlYWs7CgkJCWNhc2UgJC51aS5rZXlDb2RlLlNQQUNFOgoJCQkJ Ly8gQWN0aXZhdGUgb25seSwgbm8gY29sbGFwc2luZwoJCQkJZXZlbnQucHJldmVu dERlZmF1bHQoKTsKCQkJCWNsZWFyVGltZW91dCggdGhpcy5hY3RpdmF0aW5nICk7 CgkJCQl0aGlzLl9hY3RpdmF0ZSggc2VsZWN0ZWRJbmRleCApOwoJCQkJcmV0dXJu OwoJCQljYXNlICQudWkua2V5Q29kZS5FTlRFUjoKCQkJCS8vIFRvZ2dsZSAoY2Fu Y2VsIGRlbGF5ZWQgYWN0aXZhdGlvbiwgYWxsb3cgY29sbGFwc2luZykKCQkJCWV2 ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQljbGVhclRpbWVvdXQoIHRoaXMuYWN0 aXZhdGluZyApOwoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb2xsYXBz ZSBvciBhY3RpdmF0ZQoJCQkJdGhpcy5fYWN0aXZhdGUoIHNlbGVjdGVkSW5kZXgg PT09IHRoaXMub3B0aW9ucy5hY3RpdmUgPyBmYWxzZSA6IHNlbGVjdGVkSW5kZXgg KTsKCQkJCXJldHVybjsKCQkJZGVmYXVsdDoKCQkJCXJldHVybjsKCQl9CgoJCS8v IEZvY3VzIHRoZSBhcHByb3ByaWF0ZSB0YWIsIGJhc2VkIG9uIHdoaWNoIGtleSB3 YXMgcHJlc3NlZAoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJY2xlYXJUaW1l b3V0KCB0aGlzLmFjdGl2YXRpbmcgKTsKCQlzZWxlY3RlZEluZGV4ID0gdGhpcy5f Zm9jdXNOZXh0VGFiKCBzZWxlY3RlZEluZGV4LCBnb2luZ0ZvcndhcmQgKTsKCgkJ Ly8gTmF2aWdhdGluZyB3aXRoIGNvbnRyb2wga2V5IHdpbGwgcHJldmVudCBhdXRv bWF0aWMgYWN0aXZhdGlvbgoJCWlmICggIWV2ZW50LmN0cmxLZXkgKSB7CgkJCS8v IFVwZGF0ZSBhcmlhLXNlbGVjdGVkIGltbWVkaWF0ZWx5IHNvIHRoYXQgQVQgdGhp bmsgdGhlIHRhYiBpcyBhbHJlYWR5IHNlbGVjdGVkLgoJCQkvLyBPdGhlcndpc2Ug QVQgbWF5IGNvbmZ1c2UgdGhlIHVzZXIgYnkgc3RhdGluZyB0aGF0IHRoZXkgbmVl ZCB0byBhY3RpdmF0ZSB0aGUgdGFiLAoJCQkvLyBidXQgdGhlIHRhYiB3aWxsIGFs cmVhZHkgYmUgYWN0aXZhdGVkIGJ5IHRoZSB0aW1lIHRoZSBhbm5vdW5jZW1lbnQg ZmluaXNoZXMuCgkJCWZvY3VzZWRUYWIuYXR0ciggImFyaWEtc2VsZWN0ZWQiLCAi ZmFsc2UiICk7CgkJCXRoaXMudGFicy5lcSggc2VsZWN0ZWRJbmRleCApLmF0dHIo ICJhcmlhLXNlbGVjdGVkIiwgInRydWUiICk7CgoJCQl0aGlzLmFjdGl2YXRpbmcg PSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCXRoaXMub3B0aW9uKCAiYWN0 aXZlIiwgc2VsZWN0ZWRJbmRleCApOwoJCQl9LCB0aGlzLmRlbGF5ICk7CgkJfQoJ fSwKCglfcGFuZWxLZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCB0 aGlzLl9oYW5kbGVQYWdlTmF2KCBldmVudCApICkgewoJCQlyZXR1cm47CgkJfQoK CQkvLyBDdHJsK3VwIG1vdmVzIGZvY3VzIHRvIHRoZSBjdXJyZW50IHRhYgoJCWlm ICggZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNv ZGUuVVAgKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCXRoaXMuYWN0 aXZlLmZvY3VzKCk7CgkJfQoJfSwKCgkvLyBBbHQrcGFnZSB1cC9kb3duIG1vdmVz IGZvY3VzIHRvIHRoZSBwcmV2aW91cy9uZXh0IHRhYiAoYW5kIGFjdGl2YXRlcykK CV9oYW5kbGVQYWdlTmF2OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVu dC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLlBBR0Vf VVAgKSB7CgkJCXRoaXMuX2FjdGl2YXRlKCB0aGlzLl9mb2N1c05leHRUYWIoIHRo aXMub3B0aW9ucy5hY3RpdmUgLSAxLCBmYWxzZSApICk7CgkJCXJldHVybiB0cnVl OwoJCX0KCQlpZiAoIGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSAk LnVpLmtleUNvZGUuUEFHRV9ET1dOICkgewoJCQl0aGlzLl9hY3RpdmF0ZSggdGhp cy5fZm9jdXNOZXh0VGFiKCB0aGlzLm9wdGlvbnMuYWN0aXZlICsgMSwgdHJ1ZSAp ICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCX0sCgoJX2ZpbmROZXh0VGFiOiBmdW5j dGlvbiggaW5kZXgsIGdvaW5nRm9yd2FyZCApIHsKCQl2YXIgbGFzdFRhYkluZGV4 ID0gdGhpcy50YWJzLmxlbmd0aCAtIDE7CgoJCWZ1bmN0aW9uIGNvbnN0cmFpbigp IHsKCQkJaWYgKCBpbmRleCA+IGxhc3RUYWJJbmRleCApIHsKCQkJCWluZGV4ID0g MDsKCQkJfQoJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCWluZGV4ID0gbGFzdFRh YkluZGV4OwoJCQl9CgkJCXJldHVybiBpbmRleDsKCQl9CgoJCXdoaWxlICggJC5p bkFycmF5KCBjb25zdHJhaW4oKSwgdGhpcy5vcHRpb25zLmRpc2FibGVkICkgIT09 IC0xICkgewoJCQlpbmRleCA9IGdvaW5nRm9yd2FyZCA/IGluZGV4ICsgMSA6IGlu ZGV4IC0gMTsKCQl9CgoJCXJldHVybiBpbmRleDsKCX0sCgoJX2ZvY3VzTmV4dFRh YjogZnVuY3Rpb24oIGluZGV4LCBnb2luZ0ZvcndhcmQgKSB7CgkJaW5kZXggPSB0 aGlzLl9maW5kTmV4dFRhYiggaW5kZXgsIGdvaW5nRm9yd2FyZCApOwoJCXRoaXMu dGFicy5lcSggaW5kZXggKS5mb2N1cygpOwoJCXJldHVybiBpbmRleDsKCX0sCgoJ X3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkg PT09ICJhY3RpdmUiICkgewoJCQkvLyBfYWN0aXZhdGUoKSB3aWxsIGhhbmRsZSBp bnZhbGlkIHZhbHVlcyBhbmQgdXBkYXRlIHRoaXMub3B0aW9ucwoJCQl0aGlzLl9h Y3RpdmF0ZSggdmFsdWUgKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgPT09 ICJkaXNhYmxlZCIgKSB7CgkJCS8vIGRvbid0IHVzZSB0aGUgd2lkZ2V0IGZhY3Rv cnkncyBkaXNhYmxlZCBoYW5kbGluZwoJCQl0aGlzLl9zZXR1cERpc2FibGVkKCB2 YWx1ZSApOwoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1 ZSk7CgoJCWlmICgga2V5ID09PSAiY29sbGFwc2libGUiICkgewoJCQl0aGlzLmVs ZW1lbnQudG9nZ2xlQ2xhc3MoICJ1aS10YWJzLWNvbGxhcHNpYmxlIiwgdmFsdWUg KTsKCQkJLy8gU2V0dGluZyBjb2xsYXBzaWJsZTogZmFsc2Ugd2hpbGUgY29sbGFw c2VkOyBvcGVuIGZpcnN0IHBhbmVsCgkJCWlmICggIXZhbHVlICYmIHRoaXMub3B0 aW9ucy5hY3RpdmUgPT09IGZhbHNlICkgewoJCQkJdGhpcy5fYWN0aXZhdGUoIDAg KTsKCQkJfQoJCX0KCgkJaWYgKCBrZXkgPT09ICJldmVudCIgKSB7CgkJCXRoaXMu X3NldHVwRXZlbnRzKCB2YWx1ZSApOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJoZWln aHRTdHlsZSIgKSB7CgkJCXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHZhbHVlICk7 CgkJfQoJfSwKCglfdGFiSWQ6IGZ1bmN0aW9uKCB0YWIgKSB7CgkJcmV0dXJuIHRh Yi5hdHRyKCAiYXJpYS1jb250cm9scyIgKSB8fCAidWktdGFicy0iICsgZ2V0TmV4 dFRhYklkKCk7Cgl9LAoKCV9zYW5pdGl6ZVNlbGVjdG9yOiBmdW5jdGlvbiggaGFz aCApIHsKCQlyZXR1cm4gaGFzaCA/IGhhc2gucmVwbGFjZSggL1shIiQlJicoKSor LC5cLzo7PD0+P0BcW1xdXF5ge3x9fl0vZywgIlxcJCYiICkgOiAiIjsKCX0sCgoJ cmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlv bnMsCgkJCWxpcyA9IHRoaXMudGFibGlzdC5jaGlsZHJlbiggIjpoYXMoYVtocmVm XSkiICk7CgoJCS8vIGdldCBkaXNhYmxlZCB0YWJzIGZyb20gY2xhc3MgYXR0cmli dXRlIGZyb20gSFRNTAoJCS8vIHRoaXMgd2lsbCBnZXQgY29udmVydGVkIHRvIGEg Ym9vbGVhbiBpZiBuZWVkZWQgaW4gX3JlZnJlc2goKQoJCW9wdGlvbnMuZGlzYWJs ZWQgPSAkLm1hcCggbGlzLmZpbHRlciggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSwg ZnVuY3Rpb24oIHRhYiApIHsKCQkJcmV0dXJuIGxpcy5pbmRleCggdGFiICk7CgkJ fSk7CgoJCXRoaXMuX3Byb2Nlc3NUYWJzKCk7CgoJCS8vIHdhcyBjb2xsYXBzZWQg b3Igbm8gdGFicwoJCWlmICggb3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlIHx8ICF0 aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNl OwoJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0 aXZlIHRhYiBpcyBnb25lCgkJfSBlbHNlIGlmICggdGhpcy5hY3RpdmUubGVuZ3Ro ICYmICEkLmNvbnRhaW5zKCB0aGlzLnRhYmxpc3RbIDAgXSwgdGhpcy5hY3RpdmVb IDAgXSApICkgewoJCQkvLyBhbGwgcmVtYWluaW5nIHRhYnMgYXJlIGRpc2FibGVk CgkJCWlmICggdGhpcy50YWJzLmxlbmd0aCA9PT0gb3B0aW9ucy5kaXNhYmxlZC5s ZW5ndGggKSB7CgkJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQkJdGhpcy5h Y3RpdmUgPSAkKCk7CgkJCS8vIGFjdGl2YXRlIHByZXZpb3VzIHRhYgoJCQl9IGVs c2UgewoJCQkJdGhpcy5fYWN0aXZhdGUoIHRoaXMuX2ZpbmROZXh0VGFiKCBNYXRo Lm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICksIGZhbHNlICkgKTsKCQkJfQoJ CS8vIHdhcyBhY3RpdmUsIGFjdGl2ZSB0YWIgc3RpbGwgZXhpc3RzCgkJfSBlbHNl IHsKCQkJLy8gbWFrZSBzdXJlIGFjdGl2ZSBpbmRleCBpcyBjb3JyZWN0CgkJCW9w dGlvbnMuYWN0aXZlID0gdGhpcy50YWJzLmluZGV4KCB0aGlzLmFjdGl2ZSApOwoJ CX0KCgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24o KSB7CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggdGhpcy5vcHRpb25zLmRpc2FibGVk ICk7CgkJdGhpcy5fc2V0dXBFdmVudHMoIHRoaXMub3B0aW9ucy5ldmVudCApOwoJ CXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHls ZSApOwoKCQl0aGlzLnRhYnMubm90KCB0aGlzLmFjdGl2ZSApLmF0dHIoewoJCQki YXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCXRhYkluZGV4OiAtMQoJCX0pOwoJ CXRoaXMucGFuZWxzLm5vdCggdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0 aXZlICkgKQoJCQkuaGlkZSgpCgkJCS5hdHRyKHsKCQkJCSJhcmlhLWV4cGFuZGVk IjogImZhbHNlIiwKCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCQl9KTsKCgkJ Ly8gTWFrZSBzdXJlIG9uZSB0YWIgaXMgaW4gdGhlIHRhYiBvcmRlcgoJCWlmICgg IXRoaXMuYWN0aXZlLmxlbmd0aCApIHsKCQkJdGhpcy50YWJzLmVxKCAwICkuYXR0 ciggInRhYkluZGV4IiwgMCApOwoJCX0gZWxzZSB7CgkJCXRoaXMuYWN0aXZlCgkJ CQkuYWRkQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICkK CQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCQl0 YWJJbmRleDogMAoJCQkJfSk7CgkJCXRoaXMuX2dldFBhbmVsRm9yVGFiKCB0aGlz LmFjdGl2ZSApCgkJCQkuc2hvdygpCgkJCQkuYXR0cih7CgkJCQkJImFyaWEtZXhw YW5kZWQiOiAidHJ1ZSIsCgkJCQkJImFyaWEtaGlkZGVuIjogImZhbHNlIgoJCQkJ fSk7CgkJfQoJfSwKCglfcHJvY2Vzc1RhYnM6IGZ1bmN0aW9uKCkgewoJCXZhciB0 aGF0ID0gdGhpczsKCgkJdGhpcy50YWJsaXN0ID0gdGhpcy5fZ2V0TGlzdCgpCgkJ CS5hZGRDbGFzcyggInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxw ZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiApCgkJ CS5hdHRyKCAicm9sZSIsICJ0YWJsaXN0IiApOwoKCQl0aGlzLnRhYnMgPSB0aGlz LnRhYmxpc3QuZmluZCggIj4gbGk6aGFzKGFbaHJlZl0pIiApCgkJCS5hZGRDbGFz cyggInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIgKQoJCQkuYXR0cih7 CgkJCQlyb2xlOiAidGFiIiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KTsKCgkJdGhp cy5hbmNob3JzID0gdGhpcy50YWJzLm1hcChmdW5jdGlvbigpIHsKCQkJCXJldHVy biAkKCAiYSIsIHRoaXMgKVsgMCBdOwoJCQl9KQoJCQkuYWRkQ2xhc3MoICJ1aS10 YWJzLWFuY2hvciIgKQoJCQkuYXR0cih7CgkJCQlyb2xlOiAicHJlc2VudGF0aW9u IiwKCQkJCXRhYkluZGV4OiAtMQoJCQl9KTsKCgkJdGhpcy5wYW5lbHMgPSAkKCk7 CgoJCXRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCBpLCBhbmNob3IgKSB7CgkJ CXZhciBzZWxlY3RvciwgcGFuZWwsIHBhbmVsSWQsCgkJCQlhbmNob3JJZCA9ICQo IGFuY2hvciApLnVuaXF1ZUlkKCkuYXR0ciggImlkIiApLAoJCQkJdGFiID0gJCgg YW5jaG9yICkuY2xvc2VzdCggImxpIiApLAoJCQkJb3JpZ2luYWxBcmlhQ29udHJv bHMgPSB0YWIuYXR0ciggImFyaWEtY29udHJvbHMiICk7CgoJCQkvLyBpbmxpbmUg dGFiCgkJCWlmICggaXNMb2NhbCggYW5jaG9yICkgKSB7CgkJCQlzZWxlY3RvciA9 IGFuY2hvci5oYXNoOwoJCQkJcGFuZWwgPSB0aGF0LmVsZW1lbnQuZmluZCggdGhh dC5fc2FuaXRpemVTZWxlY3Rvciggc2VsZWN0b3IgKSApOwoJCQkvLyByZW1vdGUg dGFiCgkJCX0gZWxzZSB7CgkJCQlwYW5lbElkID0gdGhhdC5fdGFiSWQoIHRhYiAp OwoJCQkJc2VsZWN0b3IgPSAiIyIgKyBwYW5lbElkOwoJCQkJcGFuZWwgPSB0aGF0 LmVsZW1lbnQuZmluZCggc2VsZWN0b3IgKTsKCQkJCWlmICggIXBhbmVsLmxlbmd0 aCApIHsKCQkJCQlwYW5lbCA9IHRoYXQuX2NyZWF0ZVBhbmVsKCBwYW5lbElkICk7 CgkJCQkJcGFuZWwuaW5zZXJ0QWZ0ZXIoIHRoYXQucGFuZWxzWyBpIC0gMSBdIHx8 IHRoYXQudGFibGlzdCApOwoJCQkJfQoJCQkJcGFuZWwuYXR0ciggImFyaWEtbGl2 ZSIsICJwb2xpdGUiICk7CgkJCX0KCgkJCWlmICggcGFuZWwubGVuZ3RoKSB7CgkJ CQl0aGF0LnBhbmVscyA9IHRoYXQucGFuZWxzLmFkZCggcGFuZWwgKTsKCQkJfQoJ CQlpZiAoIG9yaWdpbmFsQXJpYUNvbnRyb2xzICkgewoJCQkJdGFiLmRhdGEoICJ1 aS10YWJzLWFyaWEtY29udHJvbHMiLCBvcmlnaW5hbEFyaWFDb250cm9scyApOwoJ CQl9CgkJCXRhYi5hdHRyKHsKCQkJCSJhcmlhLWNvbnRyb2xzIjogc2VsZWN0b3Iu c3Vic3RyaW5nKCAxICksCgkJCQkiYXJpYS1sYWJlbGxlZGJ5IjogYW5jaG9ySWQK CQkJfSk7CgkJCXBhbmVsLmF0dHIoICJhcmlhLWxhYmVsbGVkYnkiLCBhbmNob3JJ ZCApOwoJCX0pOwoKCQl0aGlzLnBhbmVscwoJCQkuYWRkQ2xhc3MoICJ1aS10YWJz LXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJ LmF0dHIoICJyb2xlIiwgInRhYnBhbmVsIiApOwoJfSwKCgkvLyBhbGxvdyBvdmVy cmlkaW5nIGhvdyB0byBmaW5kIHRoZSBsaXN0IGZvciByYXJlIHVzYWdlIHNjZW5h cmlvcyAoIzc3MTUpCglfZ2V0TGlzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRo aXMuZWxlbWVudC5maW5kKCAib2wsdWwiICkuZXEoIDAgKTsKCX0sCgoJX2NyZWF0 ZVBhbmVsOiBmdW5jdGlvbiggaWQgKSB7CgkJcmV0dXJuICQoICI8ZGl2PiIgKQoJ CQkuYXR0ciggImlkIiwgaWQgKQoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVs IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmRhdGEo ICJ1aS10YWJzLWRlc3Ryb3kiLCB0cnVlICk7Cgl9LAoKCV9zZXR1cERpc2FibGVk OiBmdW5jdGlvbiggZGlzYWJsZWQgKSB7CgkJaWYgKCAkLmlzQXJyYXkoIGRpc2Fi bGVkICkgKSB7CgkJCWlmICggIWRpc2FibGVkLmxlbmd0aCApIHsKCQkJCWRpc2Fi bGVkID0gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIGRpc2FibGVkLmxlbmd0aCA9PT0g dGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gdHJ1ZTsKCQkJ fQoJCX0KCgkJLy8gZGlzYWJsZSB0YWJzCgkJZm9yICggdmFyIGkgPSAwLCBsaTsg KCBsaSA9IHRoaXMudGFic1sgaSBdICk7IGkrKyApIHsKCQkJaWYgKCBkaXNhYmxl ZCA9PT0gdHJ1ZSB8fCAkLmluQXJyYXkoIGksIGRpc2FibGVkICkgIT09IC0xICkg ewoJCQkJJCggbGkgKQoJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWRpc2FibGVk IiApCgkJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgInRydWUiICk7CgkJCX0g ZWxzZSB7CgkJCQkkKCBsaSApCgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUt ZGlzYWJsZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICk7 CgkJCX0KCQl9CgoJCXRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGRpc2FibGVkOwoJ fSwKCglfc2V0dXBFdmVudHM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgZXZl bnRzID0gewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQu cHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX07CgkJaWYgKCBldmVudCApIHsKCQkJ JC5lYWNoKCBldmVudC5zcGxpdCgiICIpLCBmdW5jdGlvbiggaW5kZXgsIGV2ZW50 TmFtZSApIHsKCQkJCWV2ZW50c1sgZXZlbnROYW1lIF0gPSAiX2V2ZW50SGFuZGxl ciI7CgkJCX0pOwoJCX0KCgkJdGhpcy5fb2ZmKCB0aGlzLmFuY2hvcnMuYWRkKCB0 aGlzLnRhYnMgKS5hZGQoIHRoaXMucGFuZWxzICkgKTsKCQl0aGlzLl9vbiggdGhp cy5hbmNob3JzLCBldmVudHMgKTsKCQl0aGlzLl9vbiggdGhpcy50YWJzLCB7IGtl eWRvd246ICJfdGFiS2V5ZG93biIgfSApOwoJCXRoaXMuX29uKCB0aGlzLnBhbmVs cywgeyBrZXlkb3duOiAiX3BhbmVsS2V5ZG93biIgfSApOwoKCQl0aGlzLl9mb2N1 c2FibGUoIHRoaXMudGFicyApOwoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy50YWJz ICk7Cgl9LAoKCV9zZXR1cEhlaWdodFN0eWxlOiBmdW5jdGlvbiggaGVpZ2h0U3R5 bGUgKSB7CgkJdmFyIG1heEhlaWdodCwKCQkJcGFyZW50ID0gdGhpcy5lbGVtZW50 LnBhcmVudCgpOwoKCQlpZiAoIGhlaWdodFN0eWxlID09PSAiZmlsbCIgKSB7CgkJ CW1heEhlaWdodCA9IHBhcmVudC5oZWlnaHQoKTsKCQkJbWF4SGVpZ2h0IC09IHRo aXMuZWxlbWVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5lbGVtZW50LmhlaWdodCgp OwoKCQkJdGhpcy5lbGVtZW50LnNpYmxpbmdzKCAiOnZpc2libGUiICkuZWFjaChm dW5jdGlvbigpIHsKCQkJCXZhciBlbGVtID0gJCggdGhpcyApLAoJCQkJCXBvc2l0 aW9uID0gZWxlbS5jc3MoICJwb3NpdGlvbiIgKTsKCgkJCQlpZiAoIHBvc2l0aW9u ID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJ CXJldHVybjsKCQkJCX0KCQkJCW1heEhlaWdodCAtPSBlbGVtLm91dGVySGVpZ2h0 KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90 KCB0aGlzLnBhbmVscyApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQltYXhIZWlnaHQg LT0gJCggdGhpcyApLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhp cy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5oZWlnaHQo IE1hdGgubWF4KCAwLCBtYXhIZWlnaHQgLQoJCQkJCSQoIHRoaXMgKS5pbm5lckhl aWdodCgpICsgJCggdGhpcyApLmhlaWdodCgpICkgKTsKCQkJfSkKCQkJLmNzcygg Im92ZXJmbG93IiwgImF1dG8iICk7CgkJfSBlbHNlIGlmICggaGVpZ2h0U3R5bGUg PT09ICJhdXRvIiApIHsKCQkJbWF4SGVpZ2h0ID0gMDsKCQkJdGhpcy5wYW5lbHMu ZWFjaChmdW5jdGlvbigpIHsKCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KCBtYXhI ZWlnaHQsICQoIHRoaXMgKS5oZWlnaHQoICIiICkuaGVpZ2h0KCkgKTsKCQkJfSku aGVpZ2h0KCBtYXhIZWlnaHQgKTsKCQl9Cgl9LAoKCV9ldmVudEhhbmRsZXI6IGZ1 bmN0aW9uKCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywK CQkJYWN0aXZlID0gdGhpcy5hY3RpdmUsCgkJCWFuY2hvciA9ICQoIGV2ZW50LmN1 cnJlbnRUYXJnZXQgKSwKCQkJdGFiID0gYW5jaG9yLmNsb3Nlc3QoICJsaSIgKSwK CQkJY2xpY2tlZElzQWN0aXZlID0gdGFiWyAwIF0gPT09IGFjdGl2ZVsgMCBdLAoJ CQljb2xsYXBzaW5nID0gY2xpY2tlZElzQWN0aXZlICYmIG9wdGlvbnMuY29sbGFw c2libGUsCgkJCXRvU2hvdyA9IGNvbGxhcHNpbmcgPyAkKCkgOiB0aGlzLl9nZXRQ YW5lbEZvclRhYiggdGFiICksCgkJCXRvSGlkZSA9ICFhY3RpdmUubGVuZ3RoID8g JCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIGFjdGl2ZSApLAoJCQlldmVudERh dGEgPSB7CgkJCQlvbGRUYWI6IGFjdGl2ZSwKCQkJCW9sZFBhbmVsOiB0b0hpZGUs CgkJCQluZXdUYWI6IGNvbGxhcHNpbmcgPyAkKCkgOiB0YWIsCgkJCQluZXdQYW5l bDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlm ICggdGFiLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgfHwKCQkJCS8v IHRhYiBpcyBhbHJlYWR5IGxvYWRpbmcKCQkJCXRhYi5oYXNDbGFzcyggInVpLXRh YnMtbG9hZGluZyIgKSB8fAoJCQkJLy8gY2FuJ3Qgc3dpdGNoIGR1cm5pbmcgYW4g YW5pbWF0aW9uCgkJCQl0aGlzLnJ1bm5pbmcgfHwKCQkJCS8vIGNsaWNrIG9uIGFj dGl2ZSBoZWFkZXIsIGJ1dCBub3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElz QWN0aXZlICYmICFvcHRpb25zLmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93 IGNhbmNlbGluZyBhY3RpdmF0aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZv cmVBY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsK CQkJcmV0dXJuOwoJCX0KCgkJb3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8g ZmFsc2UgOiB0aGlzLnRhYnMuaW5kZXgoIHRhYiApOwoKCQl0aGlzLmFjdGl2ZSA9 IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IHRhYjsKCQlpZiAoIHRoaXMueGhyICkg ewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJaWYgKCAhdG9IaWRlLmxlbmd0 aCAmJiAhdG9TaG93Lmxlbmd0aCApIHsKCQkJJC5lcnJvciggImpRdWVyeSBVSSBU YWJzOiBNaXNtYXRjaGluZyBmcmFnbWVudCBpZGVudGlmaWVyLiIgKTsKCQl9CgoJ CWlmICggdG9TaG93Lmxlbmd0aCApIHsKCQkJdGhpcy5sb2FkKCB0aGlzLnRhYnMu aW5kZXgoIHRhYiApLCBldmVudCApOwoJCX0KCQl0aGlzLl90b2dnbGUoIGV2ZW50 LCBldmVudERhdGEgKTsKCX0sCgoJLy8gaGFuZGxlcyBzaG93L2hpZGUgZm9yIHNl bGVjdGluZyB0YWJzCglfdG9nZ2xlOiBmdW5jdGlvbiggZXZlbnQsIGV2ZW50RGF0 YSApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRvU2hvdyA9IGV2ZW50RGF0YS5u ZXdQYW5lbCwKCQkJdG9IaWRlID0gZXZlbnREYXRhLm9sZFBhbmVsOwoKCQl0aGlz LnJ1bm5pbmcgPSB0cnVlOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsKCQkJdGhh dC5ydW5uaW5nID0gZmFsc2U7CgkJCXRoYXQuX3RyaWdnZXIoICJhY3RpdmF0ZSIs IGV2ZW50LCBldmVudERhdGEgKTsKCQl9CgoJCWZ1bmN0aW9uIHNob3coKSB7CgkJ CWV2ZW50RGF0YS5uZXdUYWIuY2xvc2VzdCggImxpIiApLmFkZENsYXNzKCAidWkt dGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApOwoKCQkJaWYgKCB0b1Nob3cu bGVuZ3RoICYmIHRoYXQub3B0aW9ucy5zaG93ICkgewoJCQkJdGhhdC5fc2hvdygg dG9TaG93LCB0aGF0Lm9wdGlvbnMuc2hvdywgY29tcGxldGUgKTsKCQkJfSBlbHNl IHsKCQkJCXRvU2hvdy5zaG93KCk7CgkJCQljb21wbGV0ZSgpOwoJCQl9CgkJfQoK CQkvLyBzdGFydCBvdXQgYnkgaGlkaW5nLCB0aGVuIHNob3dpbmcsIHRoZW4gY29t cGxldGluZwoJCWlmICggdG9IaWRlLmxlbmd0aCAmJiB0aGlzLm9wdGlvbnMuaGlk ZSApIHsKCQkJdGhpcy5faGlkZSggdG9IaWRlLCB0aGlzLm9wdGlvbnMuaGlkZSwg ZnVuY3Rpb24oKSB7CgkJCQlldmVudERhdGEub2xkVGFiLmNsb3Nlc3QoICJsaSIg KS5yZW1vdmVDbGFzcyggInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIg KTsKCQkJCXNob3coKTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJZXZlbnREYXRhLm9s ZFRhYi5jbG9zZXN0KCAibGkiICkucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLWFjdGl2 ZSB1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCXRvSGlkZS5oaWRlKCk7CgkJCXNob3co KTsKCQl9CgoJCXRvSGlkZS5hdHRyKHsKCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFs c2UiLAoJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIKCQl9KTsKCQlldmVudERhdGEu b2xkVGFiLmF0dHIoICJhcmlhLXNlbGVjdGVkIiwgImZhbHNlIiApOwoJCS8vIElm IHdlJ3JlIHN3aXRjaGluZyB0YWJzLCByZW1vdmUgdGhlIG9sZCB0YWIgZnJvbSB0 aGUgdGFiIG9yZGVyLgoJCS8vIElmIHdlJ3JlIG9wZW5pbmcgZnJvbSBjb2xsYXBz ZWQgc3RhdGUsIHJlbW92ZSB0aGUgcHJldmlvdXMgdGFiIGZyb20gdGhlIHRhYiBv cmRlci4KCQkvLyBJZiB3ZSdyZSBjb2xsYXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNv bGxhcHNpbmcgdGFiIGluIHRoZSB0YWIgb3JkZXIuCgkJaWYgKCB0b1Nob3cubGVu Z3RoICYmIHRvSGlkZS5sZW5ndGggKSB7CgkJCWV2ZW50RGF0YS5vbGRUYWIuYXR0 ciggInRhYkluZGV4IiwgLTEgKTsKCQl9IGVsc2UgaWYgKCB0b1Nob3cubGVuZ3Ro ICkgewoJCQl0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJu ICQoIHRoaXMgKS5hdHRyKCAidGFiSW5kZXgiICkgPT09IDA7CgkJCX0pCgkJCS5h dHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0KCgkJdG9TaG93LmF0dHIoewoJCQki YXJpYS1leHBhbmRlZCI6ICJ0cnVlIiwKCQkJImFyaWEtaGlkZGVuIjogImZhbHNl IgoJCX0pOwoJCWV2ZW50RGF0YS5uZXdUYWIuYXR0cih7CgkJCSJhcmlhLXNlbGVj dGVkIjogInRydWUiLAoJCQl0YWJJbmRleDogMAoJCX0pOwoJfSwKCglfYWN0aXZh dGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQl2YXIgYW5jaG9yLAoJCQlhY3RpdmUg PSB0aGlzLl9maW5kQWN0aXZlKCBpbmRleCApOwoKCQkvLyB0cnlpbmcgdG8gYWN0 aXZhdGUgdGhlIGFscmVhZHkgYWN0aXZlIHBhbmVsCgkJaWYgKCBhY3RpdmVbIDAg XSA9PT0gdGhpcy5hY3RpdmVbIDAgXSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8g dHJ5aW5nIHRvIGNvbGxhcHNlLCBzaW11bGF0ZSBhIGNsaWNrIG9uIHRoZSBjdXJy ZW50IGFjdGl2ZSBoZWFkZXIKCQlpZiAoICFhY3RpdmUubGVuZ3RoICkgewoJCQlh Y3RpdmUgPSB0aGlzLmFjdGl2ZTsKCQl9CgoJCWFuY2hvciA9IGFjdGl2ZS5maW5k KCAiLnVpLXRhYnMtYW5jaG9yIiApWyAwIF07CgkJdGhpcy5fZXZlbnRIYW5kbGVy KHsKCQkJdGFyZ2V0OiBhbmNob3IsCgkJCWN1cnJlbnRUYXJnZXQ6IGFuY2hvciwK CQkJcHJldmVudERlZmF1bHQ6ICQubm9vcAoJCX0pOwoJfSwKCglfZmluZEFjdGl2 ZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXJldHVybiBpbmRleCA9PT0gZmFsc2Ug PyAkKCkgOiB0aGlzLnRhYnMuZXEoIGluZGV4ICk7Cgl9LAoKCV9nZXRJbmRleDog ZnVuY3Rpb24oIGluZGV4ICkgewoJCS8vIG1ldGEtZnVuY3Rpb24gdG8gZ2l2ZSB1 c2VycyBvcHRpb24gdG8gcHJvdmlkZSBhIGhyZWYgc3RyaW5nIGluc3RlYWQgb2Yg YSBudW1lcmljYWwgaW5kZXguCgkJaWYgKCB0eXBlb2YgaW5kZXggPT09ICJzdHJp bmciICkgewoJCQlpbmRleCA9IHRoaXMuYW5jaG9ycy5pbmRleCggdGhpcy5hbmNo b3JzLmZpbHRlciggIltocmVmJD0nIiArIGluZGV4ICsgIiddIiApICk7CgkJfQoK CQlyZXR1cm4gaW5kZXg7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQlp ZiAoIHRoaXMueGhyICkgewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJdGhp cy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktdGFicyB1aS13aWRnZXQgdWktd2lk Z2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIiAp OwoKCQl0aGlzLnRhYmxpc3QKCQkJLnJlbW92ZUNsYXNzKCAidWktdGFicy1uYXYg dWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVh ZGVyIHVpLWNvcm5lci1hbGwiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApOwoK CQl0aGlzLmFuY2hvcnMKCQkJLnJlbW92ZUNsYXNzKCAidWktdGFicy1hbmNob3Ii ICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAidGFi SW5kZXgiICkKCQkJLnJlbW92ZVVuaXF1ZUlkKCk7CgoJCXRoaXMudGFicy5hZGQo IHRoaXMucGFuZWxzICkuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYgKCAkLmRhdGEo IHRoaXMsICJ1aS10YWJzLWRlc3Ryb3kiICkgKSB7CgkJCQkkKCB0aGlzICkucmVt b3ZlKCk7CgkJCX0gZWxzZSB7CgkJCQkkKCB0aGlzICkKCQkJCQkucmVtb3ZlQ2xh c3MoICJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1k aXNhYmxlZCAiICsKCQkJCQkJInVpLWNvcm5lci10b3AgdWktY29ybmVyLWJvdHRv bSB1aS13aWRnZXQtY29udGVudCB1aS10YWJzLWFjdGl2ZSB1aS10YWJzLXBhbmVs IiApCgkJCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIgKQoJCQkJCS5yZW1vdmVB dHRyKCAiYXJpYS1saXZlIiApCgkJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWJ1c3ki ICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtc2VsZWN0ZWQiICkKCQkJCQkucmVt b3ZlQXR0ciggImFyaWEtbGFiZWxsZWRieSIgKQoJCQkJCS5yZW1vdmVBdHRyKCAi YXJpYS1oaWRkZW4iICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZXhwYW5kZWQi ICkKCQkJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgkJCX0KCQl9KTsKCgkJdGhp cy50YWJzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBsaSA9ICQoIHRoaXMgKSwK CQkJCXByZXYgPSBsaS5kYXRhKCAidWktdGFicy1hcmlhLWNvbnRyb2xzIiApOwoJ CQlpZiAoIHByZXYgKSB7CgkJCQlsaQoJCQkJCS5hdHRyKCAiYXJpYS1jb250cm9s cyIsIHByZXYgKQoJCQkJCS5yZW1vdmVEYXRhKCAidWktdGFicy1hcmlhLWNvbnRy b2xzIiApOwoJCQl9IGVsc2UgewoJCQkJbGkucmVtb3ZlQXR0ciggImFyaWEtY29u dHJvbHMiICk7CgkJCX0KCQl9KTsKCgkJdGhpcy5wYW5lbHMuc2hvdygpOwoKCQlp ZiAoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSAhPT0gImNvbnRlbnQiICkgewoJ CQl0aGlzLnBhbmVscy5jc3MoICJoZWlnaHQiLCAiIiApOwoJCX0KCX0sCgoJZW5h YmxlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIGRpc2FibGVkID0gdGhpcy5v cHRpb25zLmRpc2FibGVkOwoJCWlmICggZGlzYWJsZWQgPT09IGZhbHNlICkgewoJ CQlyZXR1cm47CgkJfQoKCQlpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7CgkJ CWRpc2FibGVkID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkJaW5kZXggPSB0aGlzLl9n ZXRJbmRleCggaW5kZXggKTsKCQkJaWYgKCAkLmlzQXJyYXkoIGRpc2FibGVkICkg KSB7CgkJCQlkaXNhYmxlZCA9ICQubWFwKCBkaXNhYmxlZCwgZnVuY3Rpb24oIG51 bSApIHsKCQkJCQlyZXR1cm4gbnVtICE9PSBpbmRleCA/IG51bSA6IG51bGw7CgkJ CQl9KTsKCQkJfSBlbHNlIHsKCQkJCWRpc2FibGVkID0gJC5tYXAoIHRoaXMudGFi cywgZnVuY3Rpb24oIGxpLCBudW0gKSB7CgkJCQkJcmV0dXJuIG51bSAhPT0gaW5k ZXggPyBudW0gOiBudWxsOwoJCQkJfSk7CgkJCX0KCQl9CgkJdGhpcy5fc2V0dXBE aXNhYmxlZCggZGlzYWJsZWQgKTsKCX0sCgoJZGlzYWJsZTogZnVuY3Rpb24oIGlu ZGV4ICkgewoJCXZhciBkaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDsK CQlpZiAoIGRpc2FibGVkID09PSB0cnVlICkgewoJCQlyZXR1cm47CgkJfQoKCQlp ZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7CgkJCWRpc2FibGVkID0gdHJ1ZTsK CQl9IGVsc2UgewoJCQlpbmRleCA9IHRoaXMuX2dldEluZGV4KCBpbmRleCApOwoJ CQlpZiAoICQuaW5BcnJheSggaW5kZXgsIGRpc2FibGVkICkgIT09IC0xICkgewoJ CQkJcmV0dXJuOwoJCQl9CgkJCWlmICggJC5pc0FycmF5KCBkaXNhYmxlZCApICkg ewoJCQkJZGlzYWJsZWQgPSAkLm1lcmdlKCBbIGluZGV4IF0sIGRpc2FibGVkICku c29ydCgpOwoJCQl9IGVsc2UgewoJCQkJZGlzYWJsZWQgPSBbIGluZGV4IF07CgkJ CX0KCQl9CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggZGlzYWJsZWQgKTsKCX0sCgoJ bG9hZDogZnVuY3Rpb24oIGluZGV4LCBldmVudCApIHsKCQlpbmRleCA9IHRoaXMu X2dldEluZGV4KCBpbmRleCApOwoJCXZhciB0aGF0ID0gdGhpcywKCQkJdGFiID0g dGhpcy50YWJzLmVxKCBpbmRleCApLAoJCQlhbmNob3IgPSB0YWIuZmluZCggIi51 aS10YWJzLWFuY2hvciIgKSwKCQkJcGFuZWwgPSB0aGlzLl9nZXRQYW5lbEZvclRh YiggdGFiICksCgkJCWV2ZW50RGF0YSA9IHsKCQkJCXRhYjogdGFiLAoJCQkJcGFu ZWw6IHBhbmVsCgkJCX07CgoJCS8vIG5vdCByZW1vdGUKCQlpZiAoIGlzTG9jYWwo IGFuY2hvclsgMCBdICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMueGhyID0g JC5hamF4KCB0aGlzLl9hamF4U2V0dGluZ3MoIGFuY2hvciwgZXZlbnQsIGV2ZW50 RGF0YSApICk7CgoJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJLy8galF1ZXJ5 IDwxLjggcmV0dXJucyBmYWxzZSBpZiB0aGUgcmVxdWVzdCBpcyBjYW5jZWxlZCBp biBiZWZvcmVTZW5kLAoJCS8vIGJ1dCBhcyBvZiAxLjgsICQuYWpheCgpIGFsd2F5 cyByZXR1cm5zIGEganFYSFIgb2JqZWN0LgoJCWlmICggdGhpcy54aHIgJiYgdGhp cy54aHIuc3RhdHVzVGV4dCAhPT0gImNhbmNlbGVkIiApIHsKCQkJdGFiLmFkZENs YXNzKCAidWktdGFicy1sb2FkaW5nIiApOwoJCQlwYW5lbC5hdHRyKCAiYXJpYS1i dXN5IiwgInRydWUiICk7CgoJCQl0aGlzLnhocgoJCQkJLnN1Y2Nlc3MoZnVuY3Rp b24oIHJlc3BvbnNlICkgewoJCQkJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJ CQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTE3NzgKCQkJCQlz ZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCQlwYW5lbC5odG1sKCByZXNwb25z ZSApOwoJCQkJCQl0aGF0Ll90cmlnZ2VyKCAibG9hZCIsIGV2ZW50LCBldmVudERh dGEgKTsKCQkJCQl9LCAxICk7CgkJCQl9KQoJCQkJLmNvbXBsZXRlKGZ1bmN0aW9u KCBqcVhIUiwgc3RhdHVzICkgewoJCQkJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44 CgkJCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTE3NzgKCQkJ CQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIHN0YXR1cyA9PT0g ImFib3J0IiApIHsKCQkJCQkJCXRoYXQucGFuZWxzLnN0b3AoIGZhbHNlLCB0cnVl ICk7CgkJCQkJCX0KCgkJCQkJCXRhYi5yZW1vdmVDbGFzcyggInVpLXRhYnMtbG9h ZGluZyIgKTsKCQkJCQkJcGFuZWwucmVtb3ZlQXR0ciggImFyaWEtYnVzeSIgKTsK CgkJCQkJCWlmICgganFYSFIgPT09IHRoYXQueGhyICkgewoJCQkJCQkJZGVsZXRl IHRoYXQueGhyOwoJCQkJCQl9CgkJCQkJfSwgMSApOwoJCQkJfSk7CgkJfQoJfSwK CglfYWpheFNldHRpbmdzOiBmdW5jdGlvbiggYW5jaG9yLCBldmVudCwgZXZlbnRE YXRhICkgewoJCXZhciB0aGF0ID0gdGhpczsKCQlyZXR1cm4gewoJCQl1cmw6IGFu Y2hvci5hdHRyKCAiaHJlZiIgKSwKCQkJYmVmb3JlU2VuZDogZnVuY3Rpb24oIGpx WEhSLCBzZXR0aW5ncyApIHsKCQkJCXJldHVybiB0aGF0Ll90cmlnZ2VyKCAiYmVm b3JlTG9hZCIsIGV2ZW50LAoJCQkJCSQuZXh0ZW5kKCB7IGpxWEhSIDoganFYSFIs IGFqYXhTZXR0aW5nczogc2V0dGluZ3MgfSwgZXZlbnREYXRhICkgKTsKCQkJfQoJ CX07Cgl9LAoKCV9nZXRQYW5lbEZvclRhYjogZnVuY3Rpb24oIHRhYiApIHsKCQl2 YXIgaWQgPSAkKCB0YWIgKS5hdHRyKCAiYXJpYS1jb250cm9scyIgKTsKCQlyZXR1 cm4gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMuX3Nhbml0aXplU2VsZWN0b3IoICIj IiArIGlkICkgKTsKCX0KfSk7Cgp9KSggalF1ZXJ5ICk7CgooZnVuY3Rpb24oICQg KSB7Cgp2YXIgaW5jcmVtZW50cyA9IDA7CgpmdW5jdGlvbiBhZGREZXNjcmliZWRC eSggZWxlbSwgaWQgKSB7Cgl2YXIgZGVzY3JpYmVkYnkgPSAoZWxlbS5hdHRyKCAi YXJpYS1kZXNjcmliZWRieSIgKSB8fCAiIikuc3BsaXQoIC9ccysvICk7CglkZXNj cmliZWRieS5wdXNoKCBpZCApOwoJZWxlbQoJCS5kYXRhKCAidWktdG9vbHRpcC1p ZCIsIGlkICkKCQkuYXR0ciggImFyaWEtZGVzY3JpYmVkYnkiLCAkLnRyaW0oIGRl c2NyaWJlZGJ5LmpvaW4oICIgIiApICkgKTsKfQoKZnVuY3Rpb24gcmVtb3ZlRGVz Y3JpYmVkQnkoIGVsZW0gKSB7Cgl2YXIgaWQgPSBlbGVtLmRhdGEoICJ1aS10b29s dGlwLWlkIiApLAoJCWRlc2NyaWJlZGJ5ID0gKGVsZW0uYXR0ciggImFyaWEtZGVz Y3JpYmVkYnkiICkgfHwgIiIpLnNwbGl0KCAvXHMrLyApLAoJCWluZGV4ID0gJC5p bkFycmF5KCBpZCwgZGVzY3JpYmVkYnkgKTsKCWlmICggaW5kZXggIT09IC0xICkg ewoJCWRlc2NyaWJlZGJ5LnNwbGljZSggaW5kZXgsIDEgKTsKCX0KCgllbGVtLnJl bW92ZURhdGEoICJ1aS10b29sdGlwLWlkIiApOwoJZGVzY3JpYmVkYnkgPSAkLnRy aW0oIGRlc2NyaWJlZGJ5LmpvaW4oICIgIiApICk7CglpZiAoIGRlc2NyaWJlZGJ5 ICkgewoJCWVsZW0uYXR0ciggImFyaWEtZGVzY3JpYmVkYnkiLCBkZXNjcmliZWRi eSApOwoJfSBlbHNlIHsKCQllbGVtLnJlbW92ZUF0dHIoICJhcmlhLWRlc2NyaWJl ZGJ5IiApOwoJfQp9CgokLndpZGdldCggInVpLnRvb2x0aXAiLCB7Cgl2ZXJzaW9u OiAiMS4xMC4wIiwKCW9wdGlvbnM6IHsKCQljb250ZW50OiBmdW5jdGlvbigpIHsK CQkJLy8gc3VwcG9ydDogSUU8OSwgT3BlcmEgaW4galF1ZXJ5IDwxLjcKCQkJLy8g LnRleHQoKSBjYW4ndCBhY2NlcHQgdW5kZWZpbmVkLCBzbyBjb2VyY2UgdG8gYSBz dHJpbmcKCQkJdmFyIHRpdGxlID0gJCggdGhpcyApLmF0dHIoICJ0aXRsZSIgKSB8 fCAiIjsKCQkJLy8gRXNjYXBlIHRpdGxlLCBzaW5jZSB3ZSdyZSBnb2luZyBmcm9t IGFuIGF0dHJpYnV0ZSB0byByYXcgSFRNTAoJCQlyZXR1cm4gJCggIjxhPiIgKS50 ZXh0KCB0aXRsZSApLmh0bWwoKTsKCQl9LAoJCWhpZGU6IHRydWUsCgkJLy8gRGlz YWJsZWQgZWxlbWVudHMgaGF2ZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3Nz IGJyb3dzZXJzICgjODY2MSkKCQlpdGVtczogIlt0aXRsZV06bm90KFtkaXNhYmxl ZF0pIiwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQgdG9wKzE1IiwKCQkJYXQ6 ICJsZWZ0IGJvdHRvbSIsCgkJCWNvbGxpc2lvbjogImZsaXBmaXQgZmxpcCIKCQl9 LAoJCXNob3c6IHRydWUsCgkJdG9vbHRpcENsYXNzOiBudWxsLAoJCXRyYWNrOiBm YWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY2xvc2U6IG51bGwsCgkJb3BlbjogbnVs bAoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9vbih7CgkJCW1v dXNlb3ZlcjogIm9wZW4iLAoJCQlmb2N1c2luOiAib3BlbiIKCQl9KTsKCgkJLy8g SURzIG9mIGdlbmVyYXRlZCB0b29sdGlwcywgbmVlZGVkIGZvciBkZXN0cm95CgkJ dGhpcy50b29sdGlwcyA9IHt9OwoJCS8vIElEcyBvZiBwYXJlbnQgdG9vbHRpcHMg d2hlcmUgd2UgcmVtb3ZlZCB0aGUgdGl0bGUgYXR0cmlidXRlCgkJdGhpcy5wYXJl bnRzID0ge307CgoJCWlmICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQl0 aGlzLl9kaXNhYmxlKCk7CgkJfQoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigg a2V5LCB2YWx1ZSApIHsKCQl2YXIgdGhhdCA9IHRoaXM7CgoJCWlmICgga2V5ID09 PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzWyB2YWx1ZSA/ICJfZGlzYWJsZSIgOiAi X2VuYWJsZSIgXSgpOwoJCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgkJ CS8vIGRpc2FibGUgZWxlbWVudCBzdHlsZSBjaGFuZ2VzCgkJCXJldHVybjsKCQl9 CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgoJCWlmICgga2V5ID09PSAi Y29udGVudCIgKSB7CgkJCSQuZWFjaCggdGhpcy50b29sdGlwcywgZnVuY3Rpb24o IGlkLCBlbGVtZW50ICkgewoJCQkJdGhhdC5fdXBkYXRlQ29udGVudCggZWxlbWVu dCApOwoJCQl9KTsKCQl9Cgl9LAoKCV9kaXNhYmxlOiBmdW5jdGlvbigpIHsKCQl2 YXIgdGhhdCA9IHRoaXM7CgoJCS8vIGNsb3NlIG9wZW4gdG9vbHRpcHMKCQkkLmVh Y2goIHRoaXMudG9vbHRpcHMsIGZ1bmN0aW9uKCBpZCwgZWxlbWVudCApIHsKCQkJ dmFyIGV2ZW50ID0gJC5FdmVudCggImJsdXIiICk7CgkJCWV2ZW50LnRhcmdldCA9 IGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50WzBdOwoJCQl0aGF0LmNsb3Nl KCBldmVudCwgdHJ1ZSApOwoJCX0pOwoKCQkvLyByZW1vdmUgdGl0bGUgYXR0cmli dXRlcyB0byBwcmV2ZW50IG5hdGl2ZSB0b29sdGlwcwoJCXRoaXMuZWxlbWVudC5m aW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlv bigpIHsKCQkJdmFyIGVsZW1lbnQgPSAkKCB0aGlzICk7CgkJCWlmICggZWxlbWVu dC5pcyggIlt0aXRsZV0iICkgKSB7CgkJCQllbGVtZW50CgkJCQkJLmRhdGEoICJ1 aS10b29sdGlwLXRpdGxlIiwgZWxlbWVudC5hdHRyKCAidGl0bGUiICkgKQoJCQkJ CS5hdHRyKCAidGl0bGUiLCAiIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9lbmFibGU6 IGZ1bmN0aW9uKCkgewoJCS8vIHJlc3RvcmUgdGl0bGUgYXR0cmlidXRlcwoJCXRo aXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5hZGRCYWNrKCku ZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW1lbnQgPSAkKCB0aGlzICk7CgkJ CWlmICggZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJ CWVsZW1lbnQuYXR0ciggInRpdGxlIiwgZWxlbWVudC5kYXRhKCAidWktdG9vbHRp cC10aXRsZSIgKSApOwoJCQl9CgkJfSk7Cgl9LAoKCW9wZW46IGZ1bmN0aW9uKCBl dmVudCApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRhcmdldCA9ICQoIGV2ZW50 ID8gZXZlbnQudGFyZ2V0IDogdGhpcy5lbGVtZW50ICkKCQkJCS8vIHdlIG5lZWQg Y2xvc2VzdCBoZXJlIGR1ZSB0byBtb3VzZW92ZXIgYnViYmxpbmcsCgkJCQkvLyBi dXQgYWx3YXlzIHBvaW50aW5nIGF0IHRoZSBzYW1lIGV2ZW50IHRhcmdldAoJCQkJ LmNsb3Nlc3QoIHRoaXMub3B0aW9ucy5pdGVtcyApOwoKCQkvLyBObyBlbGVtZW50 IHRvIHNob3cgYSB0b29sdGlwIGZvciBvciB0aGUgdG9vbHRpcCBpcyBhbHJlYWR5 IG9wZW4KCQlpZiAoICF0YXJnZXQubGVuZ3RoIHx8IHRhcmdldC5kYXRhKCAidWkt dG9vbHRpcC1pZCIgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCB0YXJnZXQu YXR0ciggInRpdGxlIiApICkgewoJCQl0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAt dGl0bGUiLCB0YXJnZXQuYXR0ciggInRpdGxlIiApICk7CgkJfQoKCQl0YXJnZXQu ZGF0YSggInVpLXRvb2x0aXAtb3BlbiIsIHRydWUgKTsKCgkJLy8ga2lsbCBwYXJl bnQgdG9vbHRpcHMsIGN1c3RvbSBvciBuYXRpdmUsIGZvciBob3ZlcgoJCWlmICgg ZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gIm1vdXNlb3ZlciIgKSB7CgkJCXRhcmdl dC5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBwYXJlbnQgPSAk KCB0aGlzICksCgkJCQkJYmx1ckV2ZW50OwoJCQkJaWYgKCBwYXJlbnQuZGF0YSgg InVpLXRvb2x0aXAtb3BlbiIgKSApIHsKCQkJCQlibHVyRXZlbnQgPSAkLkV2ZW50 KCAiYmx1ciIgKTsKCQkJCQlibHVyRXZlbnQudGFyZ2V0ID0gYmx1ckV2ZW50LmN1 cnJlbnRUYXJnZXQgPSB0aGlzOwoJCQkJCXRoYXQuY2xvc2UoIGJsdXJFdmVudCwg dHJ1ZSApOwoJCQkJfQoJCQkJaWYgKCBwYXJlbnQuYXR0ciggInRpdGxlIiApICkg ewoJCQkJCXBhcmVudC51bmlxdWVJZCgpOwoJCQkJCXRoYXQucGFyZW50c1sgdGhp cy5pZCBdID0gewoJCQkJCQllbGVtZW50OiB0aGlzLAoJCQkJCQl0aXRsZTogcGFy ZW50LmF0dHIoICJ0aXRsZSIgKQoJCQkJCX07CgkJCQkJcGFyZW50LmF0dHIoICJ0 aXRsZSIsICIiICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJdGhpcy5fdXBkYXRlQ29u dGVudCggdGFyZ2V0LCBldmVudCApOwoJfSwKCglfdXBkYXRlQ29udGVudDogZnVu Y3Rpb24oIHRhcmdldCwgZXZlbnQgKSB7CgkJdmFyIGNvbnRlbnQsCgkJCWNvbnRl bnRPcHRpb24gPSB0aGlzLm9wdGlvbnMuY29udGVudCwKCQkJdGhhdCA9IHRoaXMs CgkJCWV2ZW50VHlwZSA9IGV2ZW50ID8gZXZlbnQudHlwZSA6IG51bGw7CgoJCWlm ICggdHlwZW9mIGNvbnRlbnRPcHRpb24gPT09ICJzdHJpbmciICkgewoJCQlyZXR1 cm4gdGhpcy5fb3BlbiggZXZlbnQsIHRhcmdldCwgY29udGVudE9wdGlvbiApOwoJ CX0KCgkJY29udGVudCA9IGNvbnRlbnRPcHRpb24uY2FsbCggdGFyZ2V0WzBdLCBm dW5jdGlvbiggcmVzcG9uc2UgKSB7CgkJCS8vIGlnbm9yZSBhc3luYyByZXNwb25z ZSBpZiB0b29sdGlwIHdhcyBjbG9zZWQgYWxyZWFkeQoJCQlpZiAoICF0YXJnZXQu ZGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKSApIHsKCQkJCXJldHVybjsKCQkJfQoJ CQkvLyBJRSBtYXkgaW5zdGFudGx5IHNlcnZlIGEgY2FjaGVkIHJlc3BvbnNlIGZv ciBhamF4IHJlcXVlc3RzCgkJCS8vIGRlbGF5IHRoaXMgY2FsbCB0byBfb3BlbiBz byB0aGUgb3RoZXIgY2FsbCB0byBfb3BlbiBydW5zIGZpcnN0CgkJCXRoYXQuX2Rl bGF5KGZ1bmN0aW9uKCkgewoJCQkJLy8galF1ZXJ5IGNyZWF0ZXMgYSBzcGVjaWFs IGV2ZW50IGZvciBmb2N1c2luIHdoZW4gaXQgZG9lc24ndAoJCQkJLy8gZXhpc3Qg bmF0aXZlbHkuIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHRoZSBuYXRpdmUgZXZl bnQKCQkJCS8vIG9iamVjdCBpcyByZXVzZWQgYW5kIHRoZSB0eXBlIGlzIGNoYW5n ZWQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QKCQkJCS8vIHJlbHkgb24gdGhlIHR5cGUg YmVpbmcgY29ycmVjdCBhZnRlciB0aGUgZXZlbnQgZmluaXNoZWQKCQkJCS8vIGJ1 YmJsaW5nLCBzbyB3ZSBzZXQgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUu ICgjODc0MCkKCQkJCWlmICggZXZlbnQgKSB7CgkJCQkJZXZlbnQudHlwZSA9IGV2 ZW50VHlwZTsKCQkJCX0KCQkJCXRoaXMuX29wZW4oIGV2ZW50LCB0YXJnZXQsIHJl c3BvbnNlICk7CgkJCX0pOwoJCX0pOwoJCWlmICggY29udGVudCApIHsKCQkJdGhp cy5fb3BlbiggZXZlbnQsIHRhcmdldCwgY29udGVudCApOwoJCX0KCX0sCgoJX29w ZW46IGZ1bmN0aW9uKCBldmVudCwgdGFyZ2V0LCBjb250ZW50ICkgewoJCXZhciB0 b29sdGlwLCBldmVudHMsIGRlbGF5ZWRTaG93LAoJCQlwb3NpdGlvbk9wdGlvbiA9 ICQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uICk7CgoJCWlmICgg IWNvbnRlbnQgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENvbnRlbnQgY2FuIGJl IHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMuIElmIHRoZSB0b29sdGlwIGFscmVhZHkK CQkvLyBleGlzdHMsIHRoZW4ganVzdCB1cGRhdGUgdGhlIGNvbnRlbnQgYW5kIGJh aWwuCgkJdG9vbHRpcCA9IHRoaXMuX2ZpbmQoIHRhcmdldCApOwoJCWlmICggdG9v bHRpcC5sZW5ndGggKSB7CgkJCXRvb2x0aXAuZmluZCggIi51aS10b29sdGlwLWNv bnRlbnQiICkuaHRtbCggY29udGVudCApOwoJCQlyZXR1cm47CgkJfQoKCQkvLyBp ZiB3ZSBoYXZlIGEgdGl0bGUsIGNsZWFyIGl0IHRvIHByZXZlbnQgdGhlIG5hdGl2 ZSB0b29sdGlwCgkJLy8gd2UgaGF2ZSB0byBjaGVjayBmaXJzdCB0byBhdm9pZCBk ZWZpbmluZyBhIHRpdGxlIGlmIG5vbmUgZXhpc3RzCgkJLy8gKHdlIGRvbid0IHdh bnQgdG8gY2F1c2UgYW4gZWxlbWVudCB0byBzdGFydCBtYXRjaGluZyBbdGl0bGVd KQoJCS8vCgkJLy8gV2UgdXNlIHJlbW92ZUF0dHIgb25seSBmb3Iga2V5IGV2ZW50 cywgdG8gYWxsb3cgSUUgdG8gZXhwb3J0IHRoZSBjb3JyZWN0CgkJLy8gYWNjZXNz aWJsZSBhdHRyaWJ1dGVzLiBGb3IgbW91c2UgZXZlbnRzLCBzZXQgdG8gZW1wdHkg c3RyaW5nIHRvIGF2b2lkCgkJLy8gbmF0aXZlIHRvb2x0aXAgc2hvd2luZyB1cCAo aGFwcGVucyBvbmx5IHdoZW4gcmVtb3ZpbmcgaW5zaWRlIG1vdXNlb3ZlcikuCgkJ aWYgKCB0YXJnZXQuaXMoICJbdGl0bGVdIiApICkgewoJCQlpZiAoIGV2ZW50ICYm IGV2ZW50LnR5cGUgPT09ICJtb3VzZW92ZXIiICkgewoJCQkJdGFyZ2V0LmF0dHIo ICJ0aXRsZSIsICIiICk7CgkJCX0gZWxzZSB7CgkJCQl0YXJnZXQucmVtb3ZlQXR0 ciggInRpdGxlIiApOwoJCQl9CgkJfQoKCQl0b29sdGlwID0gdGhpcy5fdG9vbHRp cCggdGFyZ2V0ICk7CgkJYWRkRGVzY3JpYmVkQnkoIHRhcmdldCwgdG9vbHRpcC5h dHRyKCAiaWQiICkgKTsKCQl0b29sdGlwLmZpbmQoICIudWktdG9vbHRpcC1jb250 ZW50IiApLmh0bWwoIGNvbnRlbnQgKTsKCgkJZnVuY3Rpb24gcG9zaXRpb24oIGV2 ZW50ICkgewoJCQlwb3NpdGlvbk9wdGlvbi5vZiA9IGV2ZW50OwoJCQlpZiAoIHRv b2x0aXAuaXMoICI6aGlkZGVuIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXRv b2x0aXAucG9zaXRpb24oIHBvc2l0aW9uT3B0aW9uICk7CgkJfQoJCWlmICggdGhp cy5vcHRpb25zLnRyYWNrICYmIGV2ZW50ICYmIC9ebW91c2UvLnRlc3QoIGV2ZW50 LnR5cGUgKSApIHsKCQkJdGhpcy5fb24oIHRoaXMuZG9jdW1lbnQsIHsKCQkJCW1v dXNlbW92ZTogcG9zaXRpb24KCQkJfSk7CgkJCS8vIHRyaWdnZXIgb25jZSB0byBv dmVycmlkZSBlbGVtZW50LXJlbGF0aXZlIHBvc2l0aW9uaW5nCgkJCXBvc2l0aW9u KCBldmVudCApOwoJCX0gZWxzZSB7CgkJCXRvb2x0aXAucG9zaXRpb24oICQuZXh0 ZW5kKHsKCQkJCW9mOiB0YXJnZXQKCQkJfSwgdGhpcy5vcHRpb25zLnBvc2l0aW9u ICkgKTsKCQl9CgoJCXRvb2x0aXAuaGlkZSgpOwoKCQl0aGlzLl9zaG93KCB0b29s dGlwLCB0aGlzLm9wdGlvbnMuc2hvdyApOwoJCS8vIEhhbmRsZSB0cmFja2luZyB0 b29sdGlwcyB0aGF0IGFyZSBzaG93biB3aXRoIGEgZGVsYXkgKCM4NjQ0KS4gQXMg c29vbgoJCS8vIGFzIHRoZSB0b29sdGlwIGlzIHZpc2libGUsIHBvc2l0aW9uIHRo ZSB0b29sdGlwIHVzaW5nIHRoZSBtb3N0IHJlY2VudAoJCS8vIGV2ZW50LgoJCWlm ICggdGhpcy5vcHRpb25zLnNob3cgJiYgdGhpcy5vcHRpb25zLnNob3cuZGVsYXkg KSB7CgkJCWRlbGF5ZWRTaG93ID0gdGhpcy5kZWxheWVkU2hvdyA9IHNldEludGVy dmFsKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCB0b29sdGlwLmlzKCAiOnZpc2libGUi ICkgKSB7CgkJCQkJcG9zaXRpb24oIHBvc2l0aW9uT3B0aW9uLm9mICk7CgkJCQkJ Y2xlYXJJbnRlcnZhbCggZGVsYXllZFNob3cgKTsKCQkJCX0KCQkJfSwgJC5meC5p bnRlcnZhbCApOwoJCX0KCgkJdGhpcy5fdHJpZ2dlciggIm9wZW4iLCBldmVudCwg eyB0b29sdGlwOiB0b29sdGlwIH0gKTsKCgkJZXZlbnRzID0gewoJCQlrZXl1cDog ZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCBldmVudC5rZXlDb2RlID09PSAk LnVpLmtleUNvZGUuRVNDQVBFICkgewoJCQkJCXZhciBmYWtlRXZlbnQgPSAkLkV2 ZW50KGV2ZW50KTsKCQkJCQlmYWtlRXZlbnQuY3VycmVudFRhcmdldCA9IHRhcmdl dFswXTsKCQkJCQl0aGlzLmNsb3NlKCBmYWtlRXZlbnQsIHRydWUgKTsKCQkJCX0K CQkJfSwKCQkJcmVtb3ZlOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuX3JlbW92ZVRv b2x0aXAoIHRvb2x0aXAgKTsKCQkJfQoJCX07CgkJaWYgKCAhZXZlbnQgfHwgZXZl bnQudHlwZSA9PT0gIm1vdXNlb3ZlciIgKSB7CgkJCWV2ZW50cy5tb3VzZWxlYXZl ID0gImNsb3NlIjsKCQl9CgkJaWYgKCAhZXZlbnQgfHwgZXZlbnQudHlwZSA9PT0g ImZvY3VzaW4iICkgewoJCQlldmVudHMuZm9jdXNvdXQgPSAiY2xvc2UiOwoJCX0K CQl0aGlzLl9vbiggdHJ1ZSwgdGFyZ2V0LCBldmVudHMgKTsKCX0sCgoJY2xvc2U6 IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRhcmdl dCA9ICQoIGV2ZW50ID8gZXZlbnQuY3VycmVudFRhcmdldCA6IHRoaXMuZWxlbWVu dCApLAoJCQl0b29sdGlwID0gdGhpcy5fZmluZCggdGFyZ2V0ICk7CgoJCS8vIGRp c2FibGluZyBjbG9zZXMgdGhlIHRvb2x0aXAsIHNvIHdlIG5lZWQgdG8gdHJhY2sg d2hlbiB3ZSdyZSBjbG9zaW5nCgkJLy8gdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9v cCBpbiBjYXNlIHRoZSB0b29sdGlwIGJlY29tZXMgZGlzYWJsZWQgb24gY2xvc2UK CQlpZiAoIHRoaXMuY2xvc2luZyApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xl YXIgdGhlIGludGVydmFsIGZvciBkZWxheWVkIHRyYWNraW5nIHRvb2x0aXBzCgkJ Y2xlYXJJbnRlcnZhbCggdGhpcy5kZWxheWVkU2hvdyApOwoKCQkvLyBvbmx5IHNl dCB0aXRsZSBpZiB3ZSBoYWQgb25lIGJlZm9yZSAoc2VlIGNvbW1lbnQgaW4gX29w ZW4oKSkKCQlpZiAoIHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSAp IHsKCQkJdGFyZ2V0LmF0dHIoICJ0aXRsZSIsIHRhcmdldC5kYXRhKCAidWktdG9v bHRpcC10aXRsZSIgKSApOwoJCX0KCgkJcmVtb3ZlRGVzY3JpYmVkQnkoIHRhcmdl dCApOwoKCQl0b29sdGlwLnN0b3AoIHRydWUgKTsKCQl0aGlzLl9oaWRlKCB0b29s dGlwLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCXRoYXQuX3Jl bW92ZVRvb2x0aXAoICQoIHRoaXMgKSApOwoJCX0pOwoKCQl0YXJnZXQucmVtb3Zl RGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKTsKCQl0aGlzLl9vZmYoIHRhcmdldCwg Im1vdXNlbGVhdmUgZm9jdXNvdXQga2V5dXAiICk7CgkJLy8gUmVtb3ZlICdyZW1v dmUnIGJpbmRpbmcgb25seSBvbiBkZWxlZ2F0ZWQgdGFyZ2V0cwoJCWlmICggdGFy Z2V0WzBdICE9PSB0aGlzLmVsZW1lbnRbMF0gKSB7CgkJCXRoaXMuX29mZiggdGFy Z2V0LCAicmVtb3ZlIiApOwoJCX0KCQl0aGlzLl9vZmYoIHRoaXMuZG9jdW1lbnQs ICJtb3VzZW1vdmUiICk7CgoJCWlmICggZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0g Im1vdXNlbGVhdmUiICkgewoJCQkkLmVhY2goIHRoaXMucGFyZW50cywgZnVuY3Rp b24oIGlkLCBwYXJlbnQgKSB7CgkJCQkkKCBwYXJlbnQuZWxlbWVudCApLmF0dHIo ICJ0aXRsZSIsIHBhcmVudC50aXRsZSApOwoJCQkJZGVsZXRlIHRoYXQucGFyZW50 c1sgaWQgXTsKCQkJfSk7CgkJfQoKCQl0aGlzLmNsb3NpbmcgPSB0cnVlOwoJCXRo aXMuX3RyaWdnZXIoICJjbG9zZSIsIGV2ZW50LCB7IHRvb2x0aXA6IHRvb2x0aXAg fSApOwoJCXRoaXMuY2xvc2luZyA9IGZhbHNlOwoJfSwKCglfdG9vbHRpcDogZnVu Y3Rpb24oIGVsZW1lbnQgKSB7CgkJdmFyIGlkID0gInVpLXRvb2x0aXAtIiArIGlu Y3JlbWVudHMrKywKCQkJdG9vbHRpcCA9ICQoICI8ZGl2PiIgKQoJCQkJLmF0dHIo ewoJCQkJCWlkOiBpZCwKCQkJCQlyb2xlOiAidG9vbHRpcCIKCQkJCX0pCgkJCQku YWRkQ2xhc3MoICJ1aS10b29sdGlwIHVpLXdpZGdldCB1aS1jb3JuZXItYWxsIHVp LXdpZGdldC1jb250ZW50ICIgKwoJCQkJCSggdGhpcy5vcHRpb25zLnRvb2x0aXBD bGFzcyB8fCAiIiApICk7CgkJJCggIjxkaXY+IiApCgkJCS5hZGRDbGFzcyggInVp LXRvb2x0aXAtY29udGVudCIgKQoJCQkuYXBwZW5kVG8oIHRvb2x0aXAgKTsKCQl0 b29sdGlwLmFwcGVuZFRvKCB0aGlzLmRvY3VtZW50WzBdLmJvZHkgKTsKCQl0aGlz LnRvb2x0aXBzWyBpZCBdID0gZWxlbWVudDsKCQlyZXR1cm4gdG9vbHRpcDsKCX0s CgoJX2ZpbmQ6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIGlkID0gdGFyZ2V0 LmRhdGEoICJ1aS10b29sdGlwLWlkIiApOwoJCXJldHVybiBpZCA/ICQoICIjIiAr IGlkICkgOiAkKCk7Cgl9LAoKCV9yZW1vdmVUb29sdGlwOiBmdW5jdGlvbiggdG9v bHRpcCApIHsKCQl0b29sdGlwLnJlbW92ZSgpOwoJCWRlbGV0ZSB0aGlzLnRvb2x0 aXBzWyB0b29sdGlwLmF0dHIoICJpZCIgKSBdOwoJfSwKCglfZGVzdHJveTogZnVu Y3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQkvLyBjbG9zZSBvcGVuIHRv b2x0aXBzCgkJJC5lYWNoKCB0aGlzLnRvb2x0aXBzLCBmdW5jdGlvbiggaWQsIGVs ZW1lbnQgKSB7CgkJCS8vIERlbGVnYXRlIHRvIGNsb3NlIG1ldGhvZCB0byBoYW5k bGUgY29tbW9uIGNsZWFudXAKCQkJdmFyIGV2ZW50ID0gJC5FdmVudCggImJsdXIi ICk7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVt ZW50WzBdOwoJCQl0aGF0LmNsb3NlKCBldmVudCwgdHJ1ZSApOwoKCQkJLy8gUmVt b3ZlIGltbWVkaWF0ZWx5OyBkZXN0cm95aW5nIGFuIG9wZW4gdG9vbHRpcCBkb2Vz bid0IHVzZSB0aGUKCQkJLy8gaGlkZSBhbmltYXRpb24KCQkJJCggIiMiICsgaWQg KS5yZW1vdmUoKTsKCgkJCS8vIFJlc3RvcmUgdGhlIHRpdGxlCgkJCWlmICggZWxl bWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJCWVsZW1lbnQu YXR0ciggInRpdGxlIiwgZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIg KSApOwoJCQkJZWxlbWVudC5yZW1vdmVEYXRhKCAidWktdG9vbHRpcC10aXRsZSIg KTsKCQkJfQoJCX0pOwoJfQp9KTsKCn0oIGpRdWVyeSApICk7Cg== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=scripts.js Content-Type: text/javascript; name=scripts.js Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/scripts.js Content-Transfer-Encoding: 8bit $(document).ready(function() { var elements = document.getElementsByTagName('a'); for (var i = 0, len = elements.length; i < len; i++) { elements[i].removeAttribute('title'); } var elements = document.getElementsByTagName('img'); for (var i = 0, len = elements.length; i < len; i++) { elements[i].removeAttribute('title'); } $(".btn-city").click(function() { $("#panel").fadeToggle("fast"); return false; }); $("body").click(function() { $("#panel").fadeOut("fast") }); $(".login-open").click(function() { $(".login-form").toggleClass("opened", 200 ); return false; }); $("body").click(function() { $(".login-form").removeClass("opened", 200 ); }); $(".noclose").click(function(e){ e.stopPropagation(); }); }); ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=favicon.ico Content-Type: image/x-icon; name=favicon.ico Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/icons/favicon.ico Content-Transfer-Encoding: Base64 AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAA AAAAAAAAAAAAAAAAAAD///8A////AP///wDw5PJpzaTUwv79/hj///8A////AP// /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A59PrgYYe mf+9isfV/fz9Iv///wD///8A////AP///wD///8A////AP///wD///8A////AP// /wD///8A////AOfS64OGHZn/hh2Z/7Z7wN78+vwu////AP///wD///8A////AP// /wD///8A////AP///wD+/v4S2r3fnLh+wtujWLHyhh2Z/4Ydmf+GHZn/oFKv9bV4 wOC1eMDgtXjA4LV4wOC1eMDgtnvA3dKu2az+/f4f2Lndp4Ydmf+GHZn/hh2Z/4Yd mf+GHZn/hh2Z/4kjm/+KJJz/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+GHZn/x5rPybl/ w96GHZn/hh2Z/4Ydmf+GHZn/hh2Z/44soP/t3vD/9ez2/5xHq/+GHZn/hh2Z/4Yd mf+GHZn/hh2Z/6plt/+5f8Pehh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+LJ53/5tHq//Ln 9P+WPKf/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+qZbf/uX/D3oYdmf+GHZn/hh2Z/4Yd mf+GHZn/hh2Z/4gim/+KJJz/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+GHZn/qmW3/7l/ w96GHZn/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf/hyOb/3L/i/4Ydmf+GHZn/hh2Z/4Yd mf+GHZn/hh2Z/6plt/+5f8Pehh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+GHZn/6tnu/+PL 5/+GHZn/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+qZbf/uX/D3oYdmf+GHZn/hh2Z/4Yd mf+GHZn/hx+Z//Ln9P/r2+7/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+GHZn/qmW3/7l/ w96GHZn/hh2Z/4Ydmf+GHZn/hh2Z/4snnf/17vf/8uf0/4cfmv+GHZn/hh2Z/4Yd mf+GHZn/hh2Z/6plt/+5f8Pehh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+PL6H/+fT6//Xu 9/+LJ53/hh2Z/4Ydmf+GHZn/hh2Z/4Ydmf+qZbf/uX/D3oYdmf+GHZn/hh2Z/4Yd mf+GHZn/lDil//37/f/48/n/jy6g/4Ydmf+GHZn/hh2Z/4Ydmf+GHZn/qmW3/da3 3KqGHpn/hh2Z/4Ydmf+GHZn/hh2Z/4ggmv+bRav/plq0/4olnP+GHZn/hh2Z/4Yd mf+GHZn/hh2Z/8aZzsr+/v4U17jdpbd7wd61eMDgtXjA4LV4wOC1eMDgtXjA4LV4 wOC1eMDgtXjA4LV4wOC1eMDgtXjA4NCq17L9/P0h9/8AAOP/AADh/wAAgAEAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=normalize.css Content-Type: text/css; name=normalize.css Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/normalize.css?ver=1.0 Content-Transfer-Encoding: 8bit /*! normalize.css v1.0.1 | MIT License | git.io/normalize */ /* ========================================================================== HTML5 display definitions ========================================================================== */ /* * Corrects `block` display not defined in IE 6/7/8/9 and Firefox 3. */ article, aside, details, figcaption, figure, footer, header, hgroup, nav, section, summary { display: block; } /* * Corrects `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } /* * Prevents modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /* * Addresses styling for `hidden` attribute not present in IE 7/8/9, Firefox 3, * and Safari 4. * Known issue: no IE 6 support. */ [hidden] { display: none; } /* ========================================================================== Base ========================================================================== */ /* * 1. Corrects text resizing oddly in IE 6/7 when body `font-size` is set using * `em` units. * 2. Prevents iOS text size adjust after orientation change, without disabling * user zoom. */ html { font-size: 100%; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ -ms-text-size-adjust: 100%; /* 2 */ } /* * Addresses `font-family` inconsistency between `textarea` and other form * elements. */ html, button, input, select, textarea { font-family: sans-serif; } /* * Addresses margins handled incorrectly in IE 6/7. */ body { margin: 0; } /* ========================================================================== Links ========================================================================== */ /* * Addresses `outline` inconsistency between Chrome and other browsers. */ a:focus { outline: thin dotted; } /* * Improves readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /* ========================================================================== Typography ========================================================================== */ /* * Addresses font sizes and margins set differently in IE 6/7. * Addresses font sizes within `section` and `article` in Firefox 4+, Safari 5, * and Chrome. */ h1 { font-size: 2em; margin: 0.67em 0; } h2 { font-size: 1.5em; margin: 0.83em 0; } h3 { font-size: 1.17em; margin: 0; } h4 { font-size: 1em; margin: 1.33em 0; } h5 { font-size: 0.83em; margin: 1.67em 0; } h6 { font-size: 0.75em; margin: 2.33em 0; } /* * Addresses styling not present in IE 7/8/9, Safari 5, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } /* * Addresses style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */ b, strong { font-weight: bold; } blockquote { margin: 1em 40px; } /* * Addresses styling not present in Safari 5 and Chrome. */ dfn { font-style: italic; } /* * Addresses styling not present in IE 6/7/8/9. */ mark { background: #ff0; color: #000; } /* * Addresses margins set differently in IE 6/7. */ p, pre { margin: 1em 0; } /* * Corrects font family set oddly in IE 6, Safari 4/5, and Chrome. */ code, kbd, pre, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; } /* * Improves readability of pre-formatted text in all browsers. */ pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } /* * Addresses CSS quotes not supported in IE 6/7. */ q { quotes: none; } /* * Addresses `quotes` property not supported in Safari 4. */ q:before, q:after { content: ''; content: none; } /* * Addresses inconsistent and variable font size in all browsers. */ small { font-size: 80%; } /* * Prevents `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* ========================================================================== Lists ========================================================================== */ /* * Addresses margins set differently in IE 6/7. */ dl, menu, ol, ul { margin: 1em 0; } dd { margin: 0 0 0 40px; } /* * Addresses paddings set differently in IE 6/7. */ menu, ol, ul { padding: 0 0 0 40px; } /* * Corrects list images handled incorrectly in IE 7. */ nav ul, nav ol { list-style: none; list-style-image: none; } /* ========================================================================== Embedded content ========================================================================== */ /* * 1. Removes border when inside `a` element in IE 6/7/8/9 and Firefox 3. * 2. Improves image quality when scaled in IE 7. */ img { border: 0; /* 1 */ -ms-interpolation-mode: bicubic; /* 2 */ } /* * Corrects overflow displayed oddly in IE 9. */ svg:not(:root) { overflow: hidden; } /* ========================================================================== Figures ========================================================================== */ /* * Addresses margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ figure { margin: 0; } /* ========================================================================== Forms ========================================================================== */ /* * Corrects margin displayed oddly in IE 6/7. */ form { margin: 0; } /* * Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /* * 1. Corrects color not being inherited in IE 6/7/8/9. * 2. Corrects text not wrapping in Firefox 3. * 3. Corrects alignment displayed oddly in IE 6/7. */ legend { border: 0; /* 1 */ padding: 0; white-space: normal; /* 2 */ *margin-left: -7px; /* 3 */ } /* * 1. Corrects font size not being inherited in all browsers. * 2. Addresses margins set differently in IE 6/7, Firefox 3+, Safari 5, * and Chrome. * 3. Improves appearance and consistency in all browsers. */ button, input, select, textarea { font-size: 100%; /* 1 */ margin: 0; /* 2 */ vertical-align: baseline; /* 3 */ *vertical-align: middle; /* 3 */ } /* * Addresses Firefox 3+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ button, input { line-height: normal; } /* * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Corrects inability to style clickable `input` types in iOS. * 3. Improves usability and consistency of cursor style between image-type * `input` and others. * 4. Removes inner spacing in IE 7 without affecting normal text inputs. * Known issue: inner spacing remains in IE 6. */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; /* 4 */ } /* * Re-set default cursor for disabled elements. */ button[disabled], input[disabled] { cursor: default; } /* * 1. Addresses box sizing set to content-box in IE 8/9. * 2. Removes excess padding in IE 8/9. * 3. Removes excess padding in IE 7. * Known issue: excess padding remains in IE 6. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ *height: 13px; /* 3 */ *width: 13px; /* 3 */ } /* * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome * (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /* * Removes inner padding and search cancel button in Safari 5 and Chrome * on OS X. */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /* * Removes inner padding and border in Firefox 3+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /* * 1. Removes default vertical scrollbar in IE 6/7/8/9. * 2. Improves readability and alignment in all browsers. */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /* ========================================================================== Tables ========================================================================== */ /* * Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/jpeg Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/topnav.jpg Content-Transfer-Encoding: Base64 /9j/4QNrRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEb AAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodp AAQAAAABAAAApAAAANAACvyAAAAnEAAK/IAAACcQQWRvYmUgUGhvdG9zaG9wIENT NSBXaW5kb3dzADIwMTM6MDE6MzEgMTE6Mjk6NTAAAAAAA6ABAAMAAAABAAEAAKAC AAQAAAABAAAAAaADAAQAAAABAAAAGgAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAA AAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAA AAEAAAI1AAAAAAAAAEgAAAABAAAASAAAAAH/2P/tAAxBZG9iZV9DTQAB/+4ADkFk b2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwM DAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQU Dg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgAGgABAwEiAAIRAQMRAf/dAAQAAf/EAT8AAAEFAQEBAQEBAAAAAAAAAAMA AQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQC BQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT 8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV 5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhED ITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLS RJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYn N0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A55JJJab0j//Q55Jew/8AsOktG5/ux/xv /QHfvN+5D/Hl/wCqn//Z/+0KnFBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAA AAAAAAAAAAAAAAAAADhCSU0EOgAAAAAAkwAAABAAAAABAAAAAAALcHJpbnRPdXRw dXQAAAAFAAAAAENsclNlbnVtAAAAAENsclMAAAAAUkdCQwAAAABJbnRlZW51bQAA AABJbnRlAAAAAENscm0AAAAATXBCbGJvb2wBAAAAD3ByaW50U2l4dGVlbkJpdGJv b2wAAAAAC3ByaW50ZXJOYW1lVEVYVAAAAAEAAAA4QklNBDsAAAAAAbIAAAAQAAAA AQAAAAAAEnByaW50T3V0cHV0T3B0aW9ucwAAABIAAAAAQ3B0bmJvb2wAAAAAAENs YnJib29sAAAAAABSZ3NNYm9vbAAAAAAAQ3JuQ2Jvb2wAAAAAAENudENib29sAAAA AABMYmxzYm9vbAAAAAAATmd0dmJvb2wAAAAAAEVtbERib29sAAAAAABJbnRyYm9v bAAAAAAAQmNrZ09iamMAAAABAAAAAAAAUkdCQwAAAAMAAAAAUmQgIGRvdWJAb+AA AAAAAAAAAABHcm4gZG91YkBv4AAAAAAAAAAAAEJsICBkb3ViQG/gAAAAAAAAAAAA QnJkVFVudEYjUmx0AAAAAAAAAAAAAAAAQmxkIFVudEYjUmx0AAAAAAAAAAAAAAAA UnNsdFVudEYjUHhsQFIAAAAAAAAAAAAKdmVjdG9yRGF0YWJvb2wBAAAAAFBnUHNl bnVtAAAAAFBnUHMAAAAAUGdQQwAAAABMZWZ0VW50RiNSbHQAAAAAAAAAAAAAAABU b3AgVW50RiNSbHQAAAAAAAAAAAAAAABTY2wgVW50RiNQcmNAWQAAAAAAADhCSU0D 7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AA ADhCSU0EDQAAAAAABAAAAHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAA AAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEA bGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEA NQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////// //////8D6AAAAAD/////////////////////////////A+gAAAAA//////////// /////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJ TQQAAAAAAAACAAI4QklNBAIAAAAAAAYAAAAAAAA4QklNBDAAAAAAAAMBAQEAOEJJ TQQtAAAAAAAGAAEAAAADOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0E HgAAAAAABAAAAAA4QklNBBoAAAAAA0kAAAAGAAAAAAAAAAAAAAAaAAAAAQAAAAoA VQBuAHQAaQB0AGwAZQBkAC0ANAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA AAAAAAAAAQAAABoAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQ AAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAA AAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAA ABoAAAAAUmdodGxvbmcAAAABAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAA AAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAA AAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVk AAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpj AAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAA AAAAAAAAQnRvbWxvbmcAAAAaAAAAAFJnaHRsb25nAAAAAQAAAAN1cmxURVhUAAAA AQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRh Z1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRF WFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAH ZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdk ZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAA AABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAA AAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAA ADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EFAAAAAAABAAAAAM4QklNBAwA AAAAAlEAAAABAAAAAQAAABoAAAAEAAAAaAAAAjUAGAAB/9j/7QAMQWRvYmVfQ00A Af/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUT ExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4O EBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDP/AABEIABoAAQMBIgACEQEDEQH/3QAEAAH/xAE/AAABBQEBAQEBAQAA AAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAA AQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRy gtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE 1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcG BTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhai soMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaW prbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/AOeSSSWm9I//0OeSXsP/ALDp LRuf7sf8b/0B37zfuQ/x5f8Aqp//2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBk AG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABv AHQAbwBzAGgAbwBwACAAQwBTADUAAAABADhCSU0EBgAAAAAABwAGAAAAAQEA/+EO M2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLv u78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4 bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUg NS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAi PiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIv MjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i IiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5z OmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhv dG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxu czp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6 c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJj ZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdp bmRvd3MiIHhtcDpDcmVhdGVEYXRlPSIyMDEzLTAxLTMwVDEyOjQxKzA0OjAwIiB4 bXA6TW9kaWZ5RGF0ZT0iMjAxMy0wMS0zMVQxMToyOTo1MCswNDowMCIgeG1wOk1l dGFkYXRhRGF0ZT0iMjAxMy0wMS0zMVQxMToyOTo1MCswNDowMCIgZGM6Zm9ybWF0 PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6 SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHhtcE1NOkluc3RhbmNlSUQ9 InhtcC5paWQ6Q0E2QzhEMzREOTZBRTIxMUE2MDNBMTc5QTAzMDQzMkIiIHhtcE1N OkRvY3VtZW50SUQ9InhtcC5kaWQ6Qzk2QzhEMzREOTZBRTIxMUE2MDNBMTc5QTAz MDQzMkIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpDOTZDOEQz NEQ5NkFFMjExQTYwM0ExNzlBMDMwNDMyQiI+IDx4bXBNTTpIaXN0b3J5PiA8cmRm OlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3Rh bmNlSUQ9InhtcC5paWQ6Qzk2QzhEMzREOTZBRTIxMUE2MDNBMTc5QTAzMDQzMkIi IHN0RXZ0OndoZW49IjIwMTMtMDEtMzBUMTI6NDErMDQ6MDAiIHN0RXZ0OnNvZnR3 YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIvPiA8cmRmOmxp IHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9t IGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIv PiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9 InhtcC5paWQ6Q0E2QzhEMzREOTZBRTIxMUE2MDNBMTc5QTAzMDQzMkIiIHN0RXZ0 OndoZW49IjIwMTMtMDEtMzFUMTE6Mjk6NTArMDQ6MDAiIHN0RXZ0OnNvZnR3YXJl QWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdl ZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3Jp cHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklM RQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZU AAAAAElFQyBzUkdCAAAAAAAAAAAAAAABAAD21gABAAAAANMtSFAgIAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQ AAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALE AAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQM AAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8 AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBD b21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAA AAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeF AAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93 d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAA AAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JH QgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNw YWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZl cmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAA AAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAF AAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8 AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2 APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJd AmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNa A2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSM BJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2 BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZ B6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5 CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuY C7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34 DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCb ELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxOD E6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxay FtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3s HhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7 IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZX JocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysC KzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+ MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVN NYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrv Oy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDn QSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1 R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03c TiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1Tb VShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1 XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2Pr ZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/ bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRw dMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1B faF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAG kG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8 mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRW pMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7 urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XI xkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+ 0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c 3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl 63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ +Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkQAAAAAH/2wCE AAICAgICAgICAgIDAgICAwQDAgIDBAUEBAQEBAUGBQUFBQUFBgYHBwgHBwYJCQoK CQkMDAwMDAwMDAwMDAwMDAwBAwMDBQQFCQYGCQ0KCQoNDw4ODg4PDwwMDAwMDw8M DAwMDAwPDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIABoAAQMBEQAC EQEDEQH/3QAEAAH/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAIC AwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQA BSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5Oj szYXVGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaW prbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6 SlpqeoqaqrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGR MqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRon ZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eH l6e3x9fn9zhIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/ 2gAMAwEAAhEDEQA/APG2+ep7dz9NP//Q8b56m/TT/9HxvnqdP01b/9L6/f8AhIYq /wD/2Q== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/jpeg Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/bg-menu.jpg Content-Transfer-Encoding: Base64 /9j/4QNuRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEb AAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodp AAQAAAABAAAApAAAANAACvyAAAAnEAAK/IAAACcQQWRvYmUgUGhvdG9zaG9wIENT NSBXaW5kb3dzADIwMTM6MDQ6MTAgMTI6MjI6NTEAAAAAA6ABAAMAAAABAAEAAKAC AAQAAAABAAAAAaADAAQAAAABAAAAKgAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAA AAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAA AAEAAAI4AAAAAAAAAEgAAAABAAAASAAAAAH/2P/tAAxBZG9iZV9DTQAB/+4ADkFk b2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwM DAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQU Dg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgAKgABAwEiAAIRAQMRAf/dAAQAAf/EAT8AAAEFAQEBAQEBAAAAAAAAAAMA AQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQC BQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT 8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV 5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhED ITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLS RJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYn N0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A2tElFJYltZ//0NaUlCUlhW1X/9F/2xjf uv8AuH/kklkJLG/V+LX0f//Z/+0KmlBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQ AAAAAAAAAAAAAAAAAAAAADhCSU0EOgAAAAAAkwAAABAAAAABAAAAAAALcHJpbnRP dXRwdXQAAAAFAAAAAENsclNlbnVtAAAAAENsclMAAAAAUkdCQwAAAABJbnRlZW51 bQAAAABJbnRlAAAAAENscm0AAAAATXBCbGJvb2wBAAAAD3ByaW50U2l4dGVlbkJp dGJvb2wAAAAAC3ByaW50ZXJOYW1lVEVYVAAAAAEAAAA4QklNBDsAAAAAAbIAAAAQ AAAAAQAAAAAAEnByaW50T3V0cHV0T3B0aW9ucwAAABIAAAAAQ3B0bmJvb2wAAAAA AENsYnJib29sAAAAAABSZ3NNYm9vbAAAAAAAQ3JuQ2Jvb2wAAAAAAENudENib29s AAAAAABMYmxzYm9vbAAAAAAATmd0dmJvb2wAAAAAAEVtbERib29sAAAAAABJbnRy Ym9vbAAAAAAAQmNrZ09iamMAAAABAAAAAAAAUkdCQwAAAAMAAAAAUmQgIGRvdWJA b+AAAAAAAAAAAABHcm4gZG91YkBv4AAAAAAAAAAAAEJsICBkb3ViQG/gAAAAAAAA AAAAQnJkVFVudEYjUmx0AAAAAAAAAAAAAAAAQmxkIFVudEYjUmx0AAAAAAAAAAAA AAAAUnNsdFVudEYjUHhsQFIAAAAAAAAAAAAKdmVjdG9yRGF0YWJvb2wBAAAAAFBn UHNlbnVtAAAAAFBnUHMAAAAAUGdQQwAAAABMZWZ0VW50RiNSbHQAAAAAAAAAAAAA AABUb3AgVW50RiNSbHQAAAAAAAAAAAAAAABTY2wgVW50RiNQcmNAWQAAAAAAADhC SU0D7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAA P4AAADhCSU0EDQAAAAAABAAAAHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJ AAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2Zm AAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAA AAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////// //////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAA OEJJTQQAAAAAAAACAAE4QklNBAIAAAAAAAQAAAAAOEJJTQQwAAAAAAACAQE4QklN BC0AAAAAAAYAAQAAAAI4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQe AAAAAAAEAAAAADhCSU0EGgAAAAADSQAAAAYAAAAAAAAAAAAAACoAAAABAAAACgBV AG4AdABpAHQAbABlAGQALQAxAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA AAAAAAABAAAAKgAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAA AAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAA BAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAA KgAAAABSZ2h0bG9uZwAAAAEAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAA BXNsaWNlAAAAEgAAAAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAA AAAABm9yaWdpbmVudW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQA AAAAVHlwZWVudW0AAAAKRVNsaWNlVHlwZQAAAABJbWcgAAAABmJvdW5kc09iamMA AAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAA AAAAAABCdG9tbG9uZwAAACoAAAAAUmdodGxvbmcAAAABAAAAA3VybFRFWFQAAAAB AAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFn VEVYVAAAAAEAAAAAAA5jZWxsVGV4dElzSFRNTGJvb2wBAAAACGNlbGxUZXh0VEVY VAAAAAEAAAAAAAlob3J6QWxpZ25lbnVtAAAAD0VTbGljZUhvcnpBbGlnbgAAAAdk ZWZhdWx0AAAACXZlcnRBbGlnbmVudW0AAAAPRVNsaWNlVmVydEFsaWduAAAAB2Rl ZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAAEUVTbGljZUJHQ29sb3JUeXBlAAAA AE5vbmUAAAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91dHNldGxvbmcAAAAA AAAADGJvdHRvbU91dHNldGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAAAAAA OEJJTQQoAAAAAAAMAAAAAj/wAAAAAAAAOEJJTQQUAAAAAAAEAAAAAjhCSU0EDAAA AAACVAAAAAEAAAABAAAAKgAAAAQAAACoAAACOAAYAAH/2P/tAAxBZG9iZV9DTQAB /+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMT GBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4Q FA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwM/8AAEQgAKgABAwEiAAIRAQMRAf/dAAQAAf/EAT8AAAEFAQEBAQEBAAAA AAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAAB BAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC 0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU 5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYF NQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A2tElFJYltZ//0NaUlCUlhW1X /9F/2xjfuv8AuH/kklkJLG/V+LX0f//ZOEJJTQQhAAAAAABVAAAAAQEAAAAPAEEA ZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwAAAAEwBBAGQAbwBiAGUAIABQAGgA bwB0AG8AcwBoAG8AcAAgAEMAUwA1AAAAAQA4QklNBAYAAAAAAAcABgAAAAEBAP/h DlxodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i 77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEg eG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3Jl IDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAg Ij4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAy LzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9 IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxu czp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6 c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJj ZUV2ZW50IyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bo b3Rvc2hvcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1l bnRzLzEuMS8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBX aW5kb3dzIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxMy0wNC0xMFQxMjoyMjo1MSswNDow MCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxMy0wNC0xMFQxMjoyMjo1MSswNDowMCIg eG1wOk1vZGlmeURhdGU9IjIwMTMtMDQtMTBUMTI6MjI6NTErMDQ6MDAiIHhtcE1N Okluc3RhbmNlSUQ9InhtcC5paWQ6NjlDRkM0RDVCN0ExRTIxMUJBQzVFRkVERjYz NEYyRDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjhDRkM0RDVCN0ExRTIx MUJBQzVFRkVERjYzNEYyRDgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1w LmRpZDo2OENGQzRENUI3QTFFMjExQkFDNUVGRURGNjM0RjJEOCIgcGhvdG9zaG9w OkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5 NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciPiA8eG1wTU06SGlzdG9yeT4g PHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDpp bnN0YW5jZUlEPSJ4bXAuaWlkOjY4Q0ZDNEQ1QjdBMUUyMTFCQUM1RUZFREY2MzRG MkQ4IiBzdEV2dDp3aGVuPSIyMDEzLTA0LTEwVDEyOjIyOjUxKzA0OjAwIiBzdEV2 dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiLz4g PHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4 bXAuaWlkOjY5Q0ZDNEQ1QjdBMUUyMTFCQUM1RUZFREY2MzRGMkQ4IiBzdEV2dDp3 aGVuPSIyMDEzLTA0LTEwVDEyOjIyOjUxKzA0OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9 Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDxwaG90b3Nob3A6RG9j dW1lbnRBbmNlc3RvcnM+IDxyZGY6QmFnPiA8cmRmOmxpPnhtcC5kaWQ6NjM3NzAy QjI5ODZCRTIxMUE2MDNBMTc5QTAzMDQzMkI8L3JkZjpsaT4gPC9yZGY6QmFnPiA8 L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPC9yZGY6RGVzY3JpcHRpb24+ IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAA DEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElF QyBzUkdCAAAAAAAAAAAAAAABAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl c2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdY WVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1 ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRl eHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55 AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0Ig SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZ WiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVj LmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklF QyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA AAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0g c1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2Ug Vmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVm ZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwAD XJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAA AAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCL AJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEH AQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGp AbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6 AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2 BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYn BjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfS B+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6 Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvh C/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5J DmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1 ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPl FAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqe GsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5q HpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtybo JxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSud K9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCk MNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9 Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGs Qe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63 TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXC Vg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTp ZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20I bWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWF deF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4ef iASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/ kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWp phqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1 sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7Lrun vCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dB x7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE 08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v 4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG 7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH +lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkQAAAAAH/2wCEAAICAgIC AgICAgIDAgICAwQDAgIDBAUEBAQEBAUGBQUFBQUFBgYHBwgHBwYJCQoKCQkMDAwM DAwMDAwMDAwMDAwBAwMDBQQFCQYGCQ0KCQoNDw4ODg4PDwwMDAwMDw8MDAwMDAwP DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIACoAAQMBEQACEQEDEQH/ 3QAEAAH/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEB AAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFR BhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0 w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2 N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6Slpqeoqa qrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB 0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kj s8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3x9fn 9zhIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEA AhEDEQA/APT1U/zAzwuw8y//0PSVT7Z4PxvL2//R9Beof8zngTy7/9LuXre2fPu7 yr//0xH/ACuDy3/ywan/AMi4f+queJ/yVl74/b+p5vwT5P8A/9Tz3nl7pn//2Q== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/jpeg Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/foot-bg.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMThCNDVFNTQ5MTIxMUUy OThFQkJBRTk1NzAzNUU4QiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCMThC NDVFNjQ5MTIxMUUyOThFQkJBRTk1NzAzNUU4QiI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkIxOEI0NUUzNDkxMjExRTI5OEVC QkFFOTU3MDM1RThCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkIxOEI0NUU0 NDkxMjExRTI5OEVCQkFFOTU3MDM1RThCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwM DAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRof Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f /8AAEQgABAACAwERAAIRAQMRAf/EAE8AAQAAAAAAAAAAAAAAAAAAAAgBAQAAAAAA AAAAAAAAAAAAAAAQAAEFAAAAAAAAAAAAAAAAADIAYdFiJBEBAAAAAAAAAAAAAAAA AAAAAP/aAAwDAQACEQMRAD8ATeqhOEoP/9k= ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/soc-2.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7DAAAO wwHHb6hkAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq YAAAOpgAABdvkl/FRgAABBRJREFUeNrEl01oXVUQx3/n3HPve/kg3zE1oibVxFBb sS0VMZDahWJrLSJ+bVLcKIgLKRRR3Ai67EIXVheliiKCBgpqglUDUiwWGrFGG2lT 27QxbaMxSfPx8vLevWdc3Jdg3su7N9bYDgx3MXPmzJ2Z/8wZ9cgr7wOglGoDXgC2 AQ2sPgkwDHSLyNvAqAiYnHCniLwH1PH/Uj2wCXgyx/1GRNqAD4Eqrh3dAXws0G5E ZM81vnyB1gl0GiuyjetHDxkRqY7TSmd8bBAUkSpQ4VdrjWc0WquVOlBrxEpE2Qoa YdemRmorSrFSqCsC2cAynZpneGyGUxevkEpDiWdW5IGxYosKQ98CdrZvoOW2plhj 1s/w69kRDnT38cPZMZKeyaGvOGlrheJssVaYywYr+httPO5sbeb15x5m7ZpK0pks 0fYFLSLEcT6NT6U4+vMQ3/9ynpPnLhfolJeV8uCWVjIZP9a2sTYqBYLGhon+B/00 OMLe/V+QMAYBHr9/PXue2orWelHnproKFGEU/0MKQi44pMDVGmPCC788NsDon38t 0Zmay+AHNtZ2TBEKFltQRr61pDJZAoF5P6CxMonrLIXe0f6h8LzYGBREwDB0QAoK ubaihI1NlTgKqko9Hu1YT11tzaL8s+9O8u2PZ0i4DlH2cw7ERyCf7m69hYOvdmKt xfVc0O6irKu3jzc++AaLprzEWwUHlIAqNOJ4SZxlzmzdeDulruJgTx+Dl65QknCX RdKiA1FCsYJoIddrF2k6lebC6CRKKbSCmooybqguD+dtTRU7Ojazed1ant/3Kb9d nCAR0RWjI2AXamCpk8cHzvPiW4dIuC4KIekZOrdv4dld96FU6GxDXTXP7LiHl9/t xjgapYrC0BLH+UGyIvi+T+D7+EHA+HSK/V1HOD00snTeNt9IWdLFD4Kitq+qDyzA YiE5xtFkfZ/xicklWq4xaK0IrL26PhCI4CxTI75vmZ5Nk/UsKPB9n3tb6mi5uSGv Zc8yk5pHaVW0H0T3gVwN5Gs0ranm6Y5WtFI4juLWhiq2t99FXX39Er3evtPMpjOU lySWHeUrK0JFwUhta25k397dkfg+Mfg7Hx0+juc6kfMgGoYiiBU81/lX76zDxwZ4 7UAPkzNzJD0T3QeiUiAiWBHOXZogWTZWAMfcQkEQWManZhkc/oPevlMcOXEGa0N4 xndCsZEPON/CS+/0LOK7WKrmsz7pTAalFCUJF2McgphRDCgjMeNKgHSQjQxjbrOi NOGFuBRip+CC70ZELuc2luLGcxfE7l4icU/AfBoxVqQb2HA9lgIFh4yIvAk8BrRe 4/u/EujS4ZYqT4hI/0oeqKvEX4PsBuYX5mQ/0CEincADufXcWd1okwEuAJ8rpT4B sgB/DwBnFzDv1tE1bgAAAABJRU5ErkJggg== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/soc-1.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAC4jAAAu IwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq YAAAOpgAABdvkl/FRgAABZNJREFUeNqslk1sXFcVx3/n3Ptmxq49dtvEdj7cKqVS SlWqgFq1XQA7pFZCCJAoQoguuqgQG1jApnSB2CO6Y8EKdmGFkKDbSgikfqAKUUUk IXE98tRxEtuTsWee33v3Xhbvc5xx0iS9m3ffzH3nf87//M+5R65s7NOKDLvD+NQ/ /7X+s8vr26/EiVtSFeFzWFKY8T6ETstcf/KxR9558dzqbxa7nV6SOqS3FdPr7774 p7/957yJotWVpUVUIHOez2sJYIwSAly7cQufZRvf/sYXv//YycW/y8f/2135/fkP PlhYnD/1cHeWXv8mg+EI78ODhI00ohcEVaU73+HUiYcZDGOGg/3N175z7jnz5a/+ 4K3tYfLy8vEuFy5vMBiOJ6i7lxVCzlyaerLMk7mQP7OA94EkSRkMx5xYXmQUZ3Oj cSL2v2s3vnli+VF6GzcZxynW6H0F7VwgAGfPPMoXVheZads8dsk56G8N+fDjLZIk 49NrA5aPd7nS233FJqlfFhEGwxFG7x98dibiR996hheePTn1zEcXtnjv35u0W5a9 /ZiVpS6p88esMUrmHN4H7lf3qsIb3zvHs2eXjjyTpA4RQTTPVeY8xqjog5ZYknqe e2bljuAAUaQguSBpiNM+SG2XjB0FvjdKubi2jfeBK70B1igiEJDKjr1X2mvw/GlU mZ9t33Zuf5zy9h8+5PL6DtYYjJGcBQTNeQABm2UeEcGoEgiEACGEI8FFhBDy8gIh y/zU8/2tPS59skOrZVHJdSKiaGFDRPAhYK9u3KQ7P8vmzVvMdlp02hZrlFIeoehk ZUsLATqtiGOLMyCQZr4oucnVbhnOnF7AGEVEiA8cO4OYA5cRH2QsLHTY2NzFZs4z jhPWN7cRUVqRoR1ZOi1Lu2VptyIia7BGsUbJXOCJ04v8/PUX6iqYksfVlS6//PFL 1fu776/z69/9A6tCCLByfI7MhVwDdQogTTOSJGO4X1OuIhijGM1VvzBvMSp368aY hmMhBNLEEc1ERTpyu5PchRy0PCAF/aXgnA+kmSvyf6+9QlHVCrgoyEkHRKhE0hSd NC4YYxQXYG+UVN/NtC3mUAt3PjCOs6pUx3GGqqCi9T3TZKACaYCXniKgRRPptCMu fbLND3/xZxBIUs+vfvI1nv/SiQkHLl7d5s233yWyBhEpxBoVQVHYbDqgNS2iUu4o NSL5BgVc5rmxOwKEg8SRpNltlKeZ48ZOTBQZtEhrftEVNotzVqjbYg6u9S+HwEsX RcGIEkTwHmRKR1fNK6pkoLLVaKFFJ2z+WbghoKX4qsjrc6UBpRQsd2xcFQb1vgzZ ltFqo79PjXoCvJx47jy4lIBafTtZVZQMcDfKG+AT73eZnEQnbUrT+SKA6jISrT0u gfQQ5U0Kq5RJmOqEUKexLufCAS2oCGCprkat8zYl3/VvzTOl0emjsGjj8qHJQr1s PblOB5eJ1NAQqtRdc6oTDWC0KO3blxWZBFedFvUhCg85OM1yrR/NbR7Vop0LRJEl sqZWxhHgVcRFT680w53L8PDorpI3Je9D0P3RwaZR4dgjczgfCvGVQPm+mT+Z8t6y OmUGNFOdc94zP99CjTCO0+v2IHF/6W/devqpJ5YZDGNG45TIKnVmp4HXXc2ostYf 8tBsa4L+qxu3aDIfAnjv6bQtqye7bO/EJKn/q3z9tT+uqOr7X3n69OmHZlpcXLvO zmCEc6Xi9ZDyb9+HwIQwpTGul+DGCPNzLVZPdjk4yLi8ttP3nuetim56H7770YWN 808+fuzxs2eWcM6TZK6+JUuTk48q3mombFAuh0Y5axQ1wvZOTP/aXs/78KqI9G0x Ur0XAi9dunr9p71PBy/PzbZXrFUjjfG5OROUyq+en2G09i74cZxtJql7R0R+KyIb AP8fAJiQ8kQy7FgpAAAAAElFTkSuQmCC ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/soc-3.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAAL EwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq 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 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/soc-4.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAAL EwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq 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 AABJRU5ErkJggg== ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/soc-5.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAArwAAAK 8AFCrDSYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq 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 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline Content-Type: image/png Content-Location: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAIAAABi9+OQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpi+v//PxM2zMDAQEtxgAADAF2uTe9L4getAAAAAElFTkSuQmCC Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAIAAABi9+OQAAAAGXRFWHRTb2Z0d2Fy ZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpi+v//PxM2zMDAQEtxgAAD AF2uTe9L4getAAAAAElFTkSuQmCC ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=style.css Content-Type: text/css; name=style.css Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/style.css?ver=1.0 Content-Transfer-Encoding: 8bit /* Theme Name: nbn-help-new Theme URI: http://netbynet.ru Description: Новая тема для help Version: 1.0.0 Author: soft */ /*------------------------------------*\ MAIN \*------------------------------------*/ /* global box-sizing */ *, *:after, *:before { box-sizing:border-box; -webkit-box-sizing:border-box; -moz-box-sizing:border-box; -webkit-font-smoothing:antialiased; font-smoothing:antialiased; text-rendering:optimizeLegibility; } body { font:300 12px/1.4 'Helvetica Neue', Helvetica, Arial, sans-serif; color:#444; } /* clear */ .clear:before, .clear:after { content:' '; display:table; } .clear:after { clear:both; } .clear { *zoom:1; } img { max-width:100%; vertical-align:bottom; } a { color:#444; text-decoration:none; } a:hover { color:#444; } a:focus { outline:0; } a:hover, a:active { outline:0; } input:focus { outline:0; border:1px solid #04A4CC; } /*------------------------------------*\ Шрифты \*------------------------------------*/ @font-face { font-family: 'medium'; src: url('fonts/metamediumcyr-roman-webfont.eot'); src: url('fonts/metamediumcyr-roman-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/metamediumcyr-roman-webfont.svg') format('svg'), url('fonts/metamediumcyr-roman-webfont.woff') format('woff'), url('fonts/metamediumcyr-roman-webfont.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'normal'; src: url('fonts/metanormalcyr-roman-webfont.eot'); src: url('fonts/metanormalcyr-roman-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/metanormalcyr-roman-webfont.svg') format('svg'), url('fonts/metanormalcyr-roman-webfont.woff') format('woff'), url('fonts/metanormalcyr-roman-webfont.ttf') format('truetype'); font-weight: normal; font-style: normal; } @font-face { font-family: 'daxline'; src: url('fonts/daxline_pos_lf_regular-webfont.eot'); src: url('fonts/daxline_pos_lf_regular-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/daxline_pos_lf_regular-webfont.svg') format('svg'), url('fonts/daxline_pos_lf_regular-webfont.woff') format('woff'), url('fonts/daxline_pos_lf_regular-webfont.ttf') format('truetype'); font-weight: normal; font-style: normal; } /*------------------------------------*\ STRUCTURE \*------------------------------------*/ #topnav { background-color: #9f1a85; height: 26px; background: url(img/topnav.jpg); width:100%; background-repeat: repeat-x; } .topmenu { width: 990px; margin: auto; padding:0; } .topmenu li { display: inline; } .topmenu a.selected { padding: 4px; padding-left: 20px; padding-right: 20px; color: #000; background-color: #fff; text-shadow: none; } .topmenu a { display: inline; font-size: 15px; color: #fff; text-decoration: none; line-height: 1.6; padding-left: 20px; padding-right: 20px; text-shadow: 1px 1px #000; } .topmenu a:hover { text-decoration:underline; } .citySelect{ margin-top:30px; margin-left:15px; } .btn-city{ display:block; width: 253px; height: 25px; background:url(img/city.jpg); padding:3px; padding-left:10px; text-decoration:none; color:#bebdbd; font-size:11pt; } .btn-city:hover{ background-position: 0 25px; color:#bebdbd; } #panel { clear:both; z-index:999997; position: absolute; display: none; background: #f5f5f5; width:340px; box-shadow: 0px 0px 5px #e1e1e1; } .cities a{ background: #f5f5f5; display:block; clear:both; text-decoration:none; padding:3px; font-size:11pt; padding-left:20px; border-bottom:1px solid #f1eff0; border-right:1px solid #f1eff0; border-left:1px solid #fff; border-top:1px solid #fff; color:#666; } .cities a:hover{ background:#fff; } .cities{ width:170px; float:left; } /* wrapper */ .wrapper { width:990px; margin:0 auto; position:relative; } .wrapper:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } #header { color:#666; width: 990px; height: 100px; } .logo{ width:15%; float:left; text-align:center; height:100px; } .city{ width:35%; float:left; height:100px; } .phones{ display:inline; width:247px; float:left; font-size:11pt; height:80px; line-height:1; padding-top:20px; } .phones h1{ font-family: 'daxline'; color:#9f1a84; font-size:27px; margin:0; margin-top:3px; } .phones h2{ font-family: 'daxline'; font-size:27px; margin:0; margin-top:3px; } /* Навигация */ #navigation{ width:990px; height:38px; } ul.nav{ font-size:0; margin:0; padding:0; width:990px; } .nav li{ display:block; float:left; background:url(img/bg-menu.jpg); background-repeat:repeat-x; position:relative; z-index:7899; width:25%; border-right:1px solid #6b953f; border-left:1px solid #a8cd7d; } .nav a{ display:block; padding-top:10px; font-size:16px; text-align:center; padding-bottom:10px; color:#fff; text-shadow:1px 1px #000; text-decoration:none; } .nav a:hover{ text-decoration:underline; } .nav li:first-child { border-left:0px; border-radius:5px 0px 0px 0px; } .nav li:last-child { border-right:0px; border-radius:0px 5px 0px 0px; } .nav ul { position:absolute; left:0; display:none; margin:0 0 0 -1px; padding:0; list-style:none; } .nav ul li. { background:#fff; width:165px; } .nav ul a { font-size:11pt; border:1px solid #e1e1e1; border-top:0; background:#fff; text-shadow:none; display:block; padding:7px; padding-left:0; padding-right:0; text-align:center; color:#666; } .nav ul a:hover { background:#f5f5f5; text-decoration:underline; } /*------------------------------------*\ PAGES \*------------------------------------*/ .white{ background: #fff; clear: both; position: relative; padding: 10px; margin: 5px; margin-left: 0px; margin-top: 10px; width: 725px; border: 1px solid #e1e1e1; border-radius: 5px; -moz-box-shadow: 5px 5px 5px #f5f5f5; -webkit-box-shadow: 5px 5px 5px #f5f5f5; box-shadow: 5px 5px 5px #f5f5f5; filter: progid:DXImageTransform.Microsoft.Shadow(color='#f5f5f5', Direction=145, Strength=3); } .sidemenu ul{ padding:0px;margin:0;margin-left:5px;list-style-type: none;} .sidemenu ul li{margin:5px;} .sidemenu ul li a{ font-size:15pt;color:#666;border-bottom: 1px dashed #ccc;} .sidemenu ul ul li a{ font-size:11pt;color:#666;} .sidemenu a:hover{color:#333;border-bottom:1px dashed #666} .sidemenu ul ul li{margin:5px;} .sidemenu ul ul {display:none;list-style-type: circle;margin-left:10px;} .sidemenu ul .current-menu-item ul, .sidemenu ul .current-page-ancestor ul {display:block;} #main{ width: 725px; float: left; padding:0; } #main h1{ font-family:"normal"; font-size:18pt; color:#333; clear:both; line-height:1; margin:0; padding:10px; padding-bottom:0; } .iconlist{ margin:0; padding:0; list-style:none; display:block; overflow:hidden; } .iconlist li{ display:inline; } .iconlist li img{ width: 80px; height: 80px; float: left; margin: 10px; padding: 5px; border: 1px solid #e1e1e1; border-radius: 5px; -moz-box-shadow: 5px 5px 5px #f5f5f5; -webkit-box-shadow: 5px 5px 5px #f5f5f5; box-shadow: 5px 5px 5px #f5f5f5; filter: progid:DXImageTransform.Microsoft.Shadow(color='#f5f5f5', Direction=145, Strength=3); } .iconlist li img:hover { border: 1px solid #bbb; } .anti-mar{ margin-left:-15px !important; margin-top:15px !important; margin-right:-15px !important; } .icon-router p{ margin:0; } .icon-router{ margin:0; padding:0; list-style:none; display:block; overflow:hidden; } .icon-router li{ float: left; overflow:hidden; margin: 5px; position:relative; width: 130px; height: 130px; padding: 5px; border: 1px solid #e1e1e1; border-radius: 5px; -moz-box-shadow: 5px 5px 5px #f5f5f5; -webkit-box-shadow: 5px 5px 5px #f5f5f5; box-shadow: 5px 5px 5px #f5f5f5; filter: progid:DXImageTransform.Microsoft.Shadow(color='#f5f5f5', Direction=145, Strength=3); } .icon-router li img{ width: 130px; height: 100px; margin-top:-15px; } .icon-router li:hover { border: 1px solid #bbb; } .icon-router li span{ text-align: center; display: block; position: absolute; background-color: #8dc73f; text-shadow: 1px 1px green; color: #fff; bottom:0; line-height: 1; font-size: 10pt; width: 130px; padding: 3px; left: 0; } .text-hold{ padding:15px; } #sidebar{ width: 265px; float: left; padding-left:15px; } #sidebar h1{ font-family:"normal"; font-size:18pt; color:#666; clear:both; line-height:1; margin:0; padding-bottom:0px; padding:10px; padding-left:0px; } .connect-form { width: 250px; padding: 10px; border: 1px solid #e1e1e1; border-radius: 5px; margin-top: 10px; margin-bottom: 10px; font-size: 11pt; background: #fcfcfc; -moz-box-shadow: 5px 5px 5px #f5f5f5; -webkit-box-shadow: 5px 5px 5px #f5f5f5; box-shadow: 5px 5px 5px #f5f5f5; filter: progid:DXImageTransform.Microsoft.Shadow(color='#f5f5f5', Direction=145, Strength=3); } .banner{ padding-top:10px; text-align:center; } #footer{ clear:both; margin-top:15px; height:170px; background: url(img/foot-bg.jpg); background-color:#fff; background-repeat:repeat-x; font-size:10pt; } #footer-content{ margin:auto; width:990px; padding-top:10px; overflow:hidden; } .footer-left{ float:left; width:495px; } .footer-links{ list-style:none; padding-left:15px; float:left; width:165px; } .footer-links li{ margin-bottom:15px; } .footer-links a{ border-bottom:1px dashed #ccc; } .footer-links a:hover{ border-bottom:1px dashed #000; color:#000; } .footer-right{ float:right; width:495px; padding-top:10px; } .soc_icons{ float:left; width:227px; } .soc_icons ul{ overflow:hidden; margin:0 0 10px; padding:0; } .soc_icons ul li{ float:left; list-style:none; margin:0; padding:0 6px 0 0; } .soc_icons ul li a{ margin-top:10px; margin-right:5px; display:block; width:32px; height:32px; } .soc_icons .vk{ background:url(img/soc-2.png) no-repeat top left; } .soc_icons .fb{ background:url(img/soc-1.png) no-repeat top left; } .soc_icons .tw{ background:url(img/soc-3.png) no-repeat top left; } .soc_icons .lj{ background:url(img/soc-4.png) no-repeat top left; } .soc_icons .yt{ background:url(img/soc-5.png) no-repeat top left; } .search{ width:265px; float:left; } .smi{ clear:both; color:#aaa; font-size:8pt; } #login { width:990px; margin:auto; position:relative; z-index:7900; } .login-form { height:150px; margin-top:-150px; margin-left:795px; position:absolute; padding: 0px; width: 200px; z-index:8000; } .login{ height:150px; font-size:10pt; text-shadow:1px 1px #fff; width:195px; padding:5px; padding-bottom:0px; background:#ebebeb; } .login-hold{ height:150px; padding:5px; background:#f7f7f7; width:185px; overflow:hidden; } .login a{ display:block; margin-top:12px; margin-left:10px; text-decoration:underline; } .login a:hover{ color:#000; } .alert { padding: 8px 35px 8px 14px; margin-top:20px; color: #c09853; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); background-color: #fcf8e3; border: 1px solid #fbeed5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } #main h2{ margin:0; margin-left:0px; padding-bottom:10px; font-weight:normal; color:#666; } #main h4{ margin:0; margin-left:0px; } p a{ line-height:1.8;} ol li{ margin:5px; } .opened{ margin-top:0px; } .login-open{ outline: 0; } .breadcrumbs{ width:100%; margin-top:15px; padding-left:10px; margin-bottom:0; color:#666; } .breadcrumbs a{ color:#666; } .breadcrumbs a:hover{ text-decoration:underline; color:#444; } input{ font-size:14px; border:1px solid #ccc; background: white; padding: 7px; border-radius: 4px; -webkit-transition: 0.3s ease-in-out box-shadow; -moz-transition: 0.3s ease-in-out box-shadow; -ms-transition: 0.3s ease-in-out box-shadow; -o-transition: 0.3s ease-in-out box-shadow; transition: 0.3s ease-in-out box-shadow; color:#666; } input:focus{ outline: 0; border-color: rgba(82, 168, 236, 0.8); -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); outline: 0; } textarea{ font-size:14px; border:1px solid #ccc; background: white; padding: 7px; border-radius: 4px; color:#666; resize: none; width:350px } textarea:focus{ outline-color: rgba(82, 168, 236, 0.8); } select{ font-size:14px; border:1px solid #ccc; background: white; padding: 6px; border-radius: 4px; color:#666; } select:focus{ outline-color: rgba(82, 168, 236, 0.8); } button.styled { padding: 5px 11px; outline: none; margin-top:5px; border: 1px solid #CCC; border-bottom-color: #B3B3B3; border-radius: 4px; background: #F1F1F1 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAeCAIAAABi9+OQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpi+v//PxM2zMDAQEtxgAADAF2uTe9L4getAAAAAElFTkSuQmCC) repeat-x; box-shadow: inset 1px -1px #F1F1F1, inset -1px 0 #F1F1F1, 0 1px 2px rgba(0,0,0,0.1); color: #666; text-shadow: 1px 1px #FFF; font: 14px Arial, Tahoma, sans-serif; cursor: pointer; } button.styled:hover, button.styled:hover, button.styled:focus, button.styled:focus { border-color: #bbb; -webkit-box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 8px; } button.styled:active { color:#999; background: #F5F5F5; box-shadow: inset 1px 1px 3px #DDD; } .ui-autocomplete { position: absolute; cursor: default; background:#fff;max-height: 132px; max-width: 247px; overflow: hidden; border-radius:3px;} * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ .ui-helper-hidden-accessible{ display:none; } .ui-menu { border:1px solid #ccc; border-bottom:0px solid #e1e1e1; list-style:none; display:block; } .ui-menu .ui-menu { margin-top: -3px; } .ui-menu .ui-menu-item { font-size:12px; border-bottom:1px solid #ccc; margin:0; padding: 0; width: 100%; cursor:pointer; } .ui-menu-item a:hover { background:#f9f9f9; } .ui-menu .ui-menu-item a { text-decoration:none; display:block; padding:7px; line-height:1.5; zoom:1; } .ui-corner-all{ background:#fff; } .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { margin: -1px; } /*------------------------------------*\ IMAGES \*------------------------------------*/ #main a{ color:#666; border-bottom: 1px dashed #ccc; } #main a:hover{ color:#333; border-bottom: 1px dashed #666; } .pdf{ position:absolute; right:10px; } .pdf a{ border-bottom:0 !important; } #main ol{ padding-left:10px; } /*------------------------------------*\ TYPOGRAPHY \*------------------------------------*/ @font-face { font-family:'Font-Name'; src:url('fonts/font-name.eot'); src:url('fonts/font-name.eot?#iefix') format('embedded-opentype'), url('fonts/font-name.woff') format('woff'), url('fonts/font-name.ttf') format('truetype'), url('fonts/font-name.svg#font-name') format('svg'); font-weight:normal; font-style:normal; } /*------------------------------------*\ RESPONSIVE \*------------------------------------*/ @media only screen and (min-width:320px) { } @media only screen and (min-width:480px) { } @media only screen and (min-width:768px) { } @media only screen and (min-width:1024px) { } @media only screen and (min-width:1140px) { } @media only screen and (min-width:1280px) { } @media only screen and (-webkit-min-device-pixel-ratio:1.5), only screen and (min-resolution:144dpi) { } /*------------------------------------*\ MISC \*------------------------------------*/ /*------------------------------------*\ WORDPRESS CORE \*------------------------------------*/ .alignnone { margin:5px 20px 20px 0; } .aligncenter, div.aligncenter { display:block; margin:5px auto 5px auto; } .alignright { float:right; margin:5px 0 20px 20px; } .alignleft { float:left; margin:5px 20px 20px 0; } .aligncenter { display:block; margin:5px auto 5px auto; } a img.alignright { float:right; margin:5px 0 20px 20px; } a img.alignnone { margin:5px 20px 20px 0; } a img.alignleft { float:left; margin:5px 20px 20px 0; } a img.aligncenter { display:block; margin-left:auto; margin-right:auto; } .wp-caption { background:#FFF; border:1px solid #F0F0F0; max-width:96%; padding:5px 3px 10px; text-align:center; } .wp-caption.alignnone { margin:5px 20px 20px 0; } .wp-caption.alignleft { margin:5px 20px 20px 0; } .wp-caption.alignright { margin:5px 0 20px 20px; } .wp-caption img { border:0 none; height:auto; margin:0; max-width:98.5%; padding:0; width:auto; } .wp-caption .wp-caption-text, .gallery-caption { font-size:11px; line-height:17px; margin:0; padding:0 4px 5px; } .sticky { } .bypostauthor { } /*------------------------------------*\ PRINT \*------------------------------------*/ @media print { * { background:transparent !important; color:#000 !important; box-shadow:none !important; text-shadow:none !important; } a, a:visited { text-decoration:underline; } a[href]:after { content:" (" attr(href) ")"; } abbr[title]:after { content:" (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content:""; } pre,blockquote { border:1px solid #999; page-break-inside:avoid; } thead { display:table-header-group; } tr,img { page-break-inside:avoid; } img { max-width:100% !important; } @page { margin:0.5cm; } p, h2, h3 { orphans:3; widows:3; margin:10px!important; } h2, h3 { page-break-after:avoid; } } ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=conditionizr.min.js Content-Type: application/javascript; charset=utf-8; name=conditionizr.min.js Content-Location: http://cdnjs.cloudflare.com/ajax/libs/conditionizr.js/2.2.0/conditionizr.min.js?ver=2.2.0 Content-Transfer-Encoding: Base64 LyoKCWNvbmRpdGlvbml6ciB2Mi4yLjAKCWNvbmRpdGlvbml6ci5jb20KCWJ5IFRv ZGQgTW90dG8gJiBNYXJrIEdvb2R5ZWFyCglAdG9kZG1vdHRvICAgICYgQG1hcmtn ZHlyCglMYXRlc3QgdmVyc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL2NvbmRpdGlv bml6ci9jb25kaXRpb25penIKCglDb25kaXRpb25penIsIHRoZSBjb25kaXRpb25h bCBmcmVlIGxlZ2FjeSwgcmV0aW5hLCB0b3VjaCwgc2NyaXB0IGFuZCBzdHlsZSBs b2FkZXIuCiovCjt2YXIgY29uZGl0aW9uaXpyPWZ1bmN0aW9uKGEpe2Z1bmN0aW9u IGUoYSxiKXtmb3IodmFyIGMgaW4gYil0cnl7YVtjXT1iW2NdLmNvbnN0cnVjdG9y PT1PYmplY3Q/ZShhW2NdLGJbY10pOmJbY119Y2F0Y2goZCl7YVtjXT1iW2NdfXJl dHVybiBhfWZ1bmN0aW9uIGYoKXtmb3IodmFyIGEgaW4gayl7dmFyIGU9a1thXSxm PWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtpZignY2xhc3Nlcyc9 PT1hJiZlJiYoYy5jbGFzc05hbWUrPScgJytsKSwnc2NyaXB0cyc9PT1hJiZlKXt2 YXIgZz1iLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO2cuc3JjPWQuc2NyaXB0U3Jj K2wrJy5qcycsZi5hcHBlbmRDaGlsZChnKX1pZignc3R5bGVzJz09PWEmJmUpe3Zh ciBoPWIuY3JlYXRlRWxlbWVudCgnbGluaycpO2gucmVsPSdzdHlsZXNoZWV0Jyxo LmhyZWY9ZC5zdHlsZVNyYytsKycuY3NzJyxmLmFwcGVuZENoaWxkKGgpfWlmKCdj dXN0b21TY3JpcHQnPT09YSYmZSlmb3IodmFyIGk9ay5jdXN0b21TY3JpcHQucmVw bGFjZSgvXHMvZywnJyksaj1pLnNwbGl0KCcsJyksbT0wO2oubGVuZ3RoPm07bSsr KXt2YXIgbj1iLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO24uc3JjPWpbbV0sZi5h cHBlbmRDaGlsZChuKX19fWZ1bmN0aW9uIG0oKXt2YXIgYT0tMTtpZignTWljcm9z b2Z0IEludGVybmV0IEV4cGxvcmVyJz09bmF2aWdhdG9yLmFwcE5hbWUpe3ZhciBi PW5hdmlnYXRvci51c2VyQWdlbnQsYz1SZWdFeHAoJ01TSUUgKFswLTldezEsfVsu MC05XXswLH0pJyk7bnVsbCE9Yy5leGVjKGIpJiYoYT1wYXJzZUZsb2F0KFJlZ0V4 cC4kMSkpfXJldHVybiBhfXZhciBiPWRvY3VtZW50LGM9Yi5kb2N1bWVudEVsZW1l bnQ7Yy5pZD0nY29uZGl0aW9uaXpyJzt2YXIgZD17ZGVidWc6ITEsc2NyaXB0U3Jj Oidqcy9jb25kaXRpb25penIvJyxzdHlsZVNyYzonY3NzL2NvbmRpdGlvbml6ci8n LGllTGVzc1RoYW46e2FjdGl2ZTohMSx2ZXJzaW9uOic5JyxzY3JpcHRzOiExLHN0 eWxlczohMSxjbGFzc2VzOiEwLGN1c3RvbVNjcmlwdDohMX0sY2hyb21lOntzY3Jp cHRzOiExLHN0eWxlczohMSxjbGFzc2VzOiEwLGN1c3RvbVNjcmlwdDohMX0sc2Fm YXJpOntzY3JpcHRzOiExLHN0eWxlczohMSxjbGFzc2VzOiEwLGN1c3RvbVNjcmlw dDohMX0sb3BlcmE6e3NjcmlwdHM6ITEsc3R5bGVzOiExLGNsYXNzZXM6ITAsY3Vz dG9tU2NyaXB0OiExfSxmaXJlZm94OntzY3JpcHRzOiExLHN0eWxlczohMSxjbGFz c2VzOiEwLGN1c3RvbVNjcmlwdDohMX0saWUxMDp7c2NyaXB0czohMSxzdHlsZXM6 ITEsY2xhc3NlczohMCxjdXN0b21TY3JpcHQ6ITF9LGllOTp7c2NyaXB0czohMSxz dHlsZXM6ITEsY2xhc3NlczohMCxjdXN0b21TY3JpcHQ6ITF9LGllODp7c2NyaXB0 czohMSxzdHlsZXM6ITEsY2xhc3NlczohMCxjdXN0b21TY3JpcHQ6ITF9LGllNzp7 c2NyaXB0czohMSxzdHlsZXM6ITEsY2xhc3NlczohMCxjdXN0b21TY3JpcHQ6ITF9 LGllNjp7c2NyaXB0czohMSxzdHlsZXM6ITEsY2xhc3NlczohMCxjdXN0b21TY3Jp cHQ6ITF9LHJldGluYTp7c2NyaXB0czohMSxzdHlsZXM6ITEsY2xhc3NlczohMCxj dXN0b21TY3JpcHQ6ITF9LHRvdWNoOntzY3JpcHRzOiExLHN0eWxlczohMSxjbGFz c2VzOiEwLGN1c3RvbVNjcmlwdDohMX0sbWFjOiEwLHdpbjohMCx4MTE6ITAsbGlu dXg6ITB9O2EmJmUoZCxhKTtmb3IodmFyIGc9JycsaD1be3Rlc3RXaXRoOidjaHJv bWUnLHRlc3RTZXR0aW5nczpkLmNocm9tZX0se3Rlc3RXaXRoOidzYWZhcmknLHRl c3RTZXR0aW5nczpkLnNhZmFyaX0se3Rlc3RXaXRoOidmaXJlZm94Jyx0ZXN0U2V0 dGluZ3M6ZC5maXJlZm94fSx7dGVzdFdpdGg6J29wZXJhJyx0ZXN0U2V0dGluZ3M6 ZC5vcGVyYX1dLGk9MDtoLmxlbmd0aD5pO2krKyl7dmFyIGo9aFtpXTtpZihuYXZp Z2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihqLnRlc3RXaXRo KT4tMSl7dmFyIGs9ai50ZXN0U2V0dGluZ3MsbD1qLnRlc3RXaXRoO2YoKSxnPWw7 YnJlYWt9fXZhciBuPW0oKTtpZihuPi0xKXtpZihkLmllTGVzc1RoYW4udmVyc2lv bisnLjAnPm4pe3ZhciBsPSdsdC1pZScrZC5pZUxlc3NUaGFuLnZlcnNpb24saz1k LmllTGVzc1RoYW47ZigpfWlmKDEwPT09bil2YXIgaz1kLmllMTA7ZWxzZSBpZig5 PT09bil2YXIgaz1kLmllOTtlbHNlIGlmKDg9PT1uKXZhciBrPWQuaWU4O2Vsc2Ug aWYoNz09PW4pdmFyIGs9ZC5pZTc7ZWxzZSBpZig2PT09bil2YXIgaz1kLmllNjt2 YXIgbD0naWUnK247ZigpLGc9bH12YXIgbz0nJztpZih3aW5kb3cuZGV2aWNlUGl4 ZWxSYXRpbz49Mil7dmFyIGs9ZC5yZXRpbmEsbD0ncmV0aW5hJztmKCksbys9JyAn K2wsbD1nfWVsc2UgYy5jbGFzc05hbWUrPScgbm8tcmV0aW5hJztpZignb250b3Vj aHN0YXJ0J2luIHdpbmRvdyl7dmFyIGs9ZC50b3VjaCxsPSd0b3VjaCc7ZigpLG8r PScgJytsLGw9Z31lbHNlIGMuY2xhc3NOYW1lKz0nIG5vLXRvdWNoJztmb3IodmFy IHA9W3t0ZXN0V2l0aDonV2luJyx0ZXN0U2V0dGluZ3M6ZC53aW59LHt0ZXN0V2l0 aDonTWFjJyx0ZXN0U2V0dGluZ3M6ZC5tYWN9LHt0ZXN0V2l0aDonWDExJyx0ZXN0 U2V0dGluZ3M6ZC54MTF9LHt0ZXN0V2l0aDonTGludXgnLHRlc3RTZXR0aW5nczpk LmxpbnV4fV0saT0wO3AubGVuZ3RoPmk7aSsrKXt2YXIgcT1wW2ldO2lmKG5hdmln YXRvci5hcHBWZXJzaW9uLmluZGV4T2YocS50ZXN0V2l0aCk+LTEpe3ZhciByPXEu dGVzdFNldHRpbmdzLHM9cS50ZXN0V2l0aDtyJiYoYy5jbGFzc05hbWUrPScgJytx LnRlc3RXaXRoLnRvTG93ZXJDYXNlKCkpO2JyZWFrfX1kLmRlYnVnJiYoY29uc29s ZS5sb2coJ1N0YXJ0IENvbmRpdGlvbml6ciBEZWJ1Z1xuJyksY29uc29sZS5sb2co J1NjcmlwdCBsb2NhdGlvbjogJytkLnNjcmlwdFNyYyksY29uc29sZS5sb2coJ1N0 eWxlIGxvY2F0aW9uOiAnK2Quc3R5bGVTcmMpLGNvbnNvbGUubG9nKCdCcm93c2Vy OiAnK2wpLG8mJmNvbnNvbGUubG9nKCdCcm93c2VyIEV4dHJhczogJytvKSxjb25z b2xlLmxvZygnT1M6ICcrcyksY29uc29sZS5sb2coJ0VuZCBDb25kaXRpb25penIg RGVidWdcbicpKX07 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=modernizr.min.js Content-Type: application/javascript; charset=utf-8; name=modernizr.min.js Content-Location: http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js?ver=2.6.2 Content-Transfer-Encoding: Base64 LyogTW9kZXJuaXpyIDIuNi4yIChDdXN0b20gQnVpbGQpIHwgTUlUICYgQlNECiAq IEJ1aWxkOiBodHRwOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZC8jLWZvbnRmYWNl LWJhY2tncm91bmRzaXplLWJvcmRlcmltYWdlLWJvcmRlcnJhZGl1cy1ib3hzaGFk b3ctZmxleGJveC1oc2xhLW11bHRpcGxlYmdzLW9wYWNpdHktcmdiYS10ZXh0c2hh ZG93LWNzc2FuaW1hdGlvbnMtY3NzY29sdW1ucy1nZW5lcmF0ZWRjb250ZW50LWNz c2dyYWRpZW50cy1jc3NyZWZsZWN0aW9ucy1jc3N0cmFuc2Zvcm1zLWNzc3RyYW5z Zm9ybXMzZC1jc3N0cmFuc2l0aW9ucy1hcHBsaWNhdGlvbmNhY2hlLWNhbnZhcy1j YW52YXN0ZXh0LWRyYWdhbmRkcm9wLWhhc2hjaGFuZ2UtaGlzdG9yeS1hdWRpby12 aWRlby1pbmRleGVkZGItaW5wdXQtaW5wdXR0eXBlcy1sb2NhbHN0b3JhZ2UtcG9z dG1lc3NhZ2Utc2Vzc2lvbnN0b3JhZ2Utd2Vic29ja2V0cy13ZWJzcWxkYXRhYmFz ZS13ZWJ3b3JrZXJzLWdlb2xvY2F0aW9uLWlubGluZXN2Zy1zbWlsLXN2Zy1zdmdj bGlwcGF0aHMtdG91Y2gtd2ViZ2wtc2hpdi1tcS1jc3NjbGFzc2VzLWFkZHRlc3Qt cHJlZml4ZWQtdGVzdHN0eWxlcy10ZXN0cHJvcC10ZXN0YWxscHJvcHMtaGFzZXZl bnQtcHJlZml4ZXMtZG9tcHJlZml4ZXMtbG9hZAogKi8KO3dpbmRvdy5Nb2Rlcm5p enI9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIEQoYSl7ai5jc3NUZXh0PWF9ZnVu Y3Rpb24gRShhLGIpe3JldHVybiBEKG4uam9pbihhKyI7IikrKGJ8fCIiKSl9ZnVu Y3Rpb24gRihhLGIpe3JldHVybiB0eXBlb2YgYT09PWJ9ZnVuY3Rpb24gRyhhLGIp e3JldHVybiEhfigiIithKS5pbmRleE9mKGIpfWZ1bmN0aW9uIEgoYSxiKXtmb3Io dmFyIGQgaW4gYSl7dmFyIGU9YVtkXTtpZighRyhlLCItIikmJmpbZV0hPT1jKXJl dHVybiBiPT0icGZ4Ij9lOiEwfXJldHVybiExfWZ1bmN0aW9uIEkoYSxiLGQpe2Zv cih2YXIgZSBpbiBhKXt2YXIgZj1iW2FbZV1dO2lmKGYhPT1jKXJldHVybiBkPT09 ITE/YVtlXTpGKGYsImZ1bmN0aW9uIik/Zi5iaW5kKGR8fGIpOmZ9cmV0dXJuITF9 ZnVuY3Rpb24gSihhLGIsYyl7dmFyIGQ9YS5jaGFyQXQoMCkudG9VcHBlckNhc2Uo KSthLnNsaWNlKDEpLGU9KGErIiAiK3Auam9pbihkKyIgIikrZCkuc3BsaXQoIiAi KTtyZXR1cm4gRihiLCJzdHJpbmciKXx8RihiLCJ1bmRlZmluZWQiKT9IKGUsYik6 KGU9KGErIiAiK3Euam9pbihkKyIgIikrZCkuc3BsaXQoIiAiKSxJKGUsYixjKSl9 ZnVuY3Rpb24gSygpe2UuaW5wdXQ9ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT1j Lmxlbmd0aDtkPGU7ZCsrKXVbY1tkXV09Y1tkXWluIGs7cmV0dXJuIHUubGlzdCYm KHUubGlzdD0hIWIuY3JlYXRlRWxlbWVudCgiZGF0YWxpc3QiKSYmISFhLkhUTUxE YXRhTGlzdEVsZW1lbnQpLHV9KCJhdXRvY29tcGxldGUgYXV0b2ZvY3VzIGxpc3Qg cGxhY2Vob2xkZXIgbWF4IG1pbiBtdWx0aXBsZSBwYXR0ZXJuIHJlcXVpcmVkIHN0 ZXAiLnNwbGl0KCIgIikpLGUuaW5wdXR0eXBlcz1mdW5jdGlvbihhKXtmb3IodmFy IGQ9MCxlLGYsaCxpPWEubGVuZ3RoO2Q8aTtkKyspay5zZXRBdHRyaWJ1dGUoInR5 cGUiLGY9YVtkXSksZT1rLnR5cGUhPT0idGV4dCIsZSYmKGsudmFsdWU9bCxrLnN0 eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVu OyIsL15yYW5nZSQvLnRlc3QoZikmJmsuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSE9 PWM/KGcuYXBwZW5kQ2hpbGQoayksaD1iLmRlZmF1bHRWaWV3LGU9aC5nZXRDb21w dXRlZFN0eWxlJiZoLmdldENvbXB1dGVkU3R5bGUoayxudWxsKS5XZWJraXRBcHBl YXJhbmNlIT09InRleHRmaWVsZCImJmsub2Zmc2V0SGVpZ2h0IT09MCxnLnJlbW92 ZUNoaWxkKGspKTovXihzZWFyY2h8dGVsKSQvLnRlc3QoZil8fCgvXih1cmx8ZW1h aWwpJC8udGVzdChmKT9lPWsuY2hlY2tWYWxpZGl0eSYmay5jaGVja1ZhbGlkaXR5 KCk9PT0hMTplPWsudmFsdWUhPWwpKSx0W2FbZF1dPSEhZTtyZXR1cm4gdH0oInNl YXJjaCB0ZWwgdXJsIGVtYWlsIGRhdGV0aW1lIGRhdGUgbW9udGggd2VlayB0aW1l IGRhdGV0aW1lLWxvY2FsIG51bWJlciByYW5nZSBjb2xvciIuc3BsaXQoIiAiKSl9 dmFyIGQ9IjIuNi4yIixlPXt9LGY9ITAsZz1iLmRvY3VtZW50RWxlbWVudCxoPSJt b2Rlcm5penIiLGk9Yi5jcmVhdGVFbGVtZW50KGgpLGo9aS5zdHlsZSxrPWIuY3Jl YXRlRWxlbWVudCgiaW5wdXQiKSxsPSI6KSIsbT17fS50b1N0cmluZyxuPSIgLXdl YmtpdC0gLW1vei0gLW8tIC1tcy0gIi5zcGxpdCgiICIpLG89IldlYmtpdCBNb3og TyBtcyIscD1vLnNwbGl0KCIgIikscT1vLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAi KSxyPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn0scz17fSx0PXt9 LHU9e30sdj1bXSx3PXYuc2xpY2UseCx5PWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBm LGksaixrLGw9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxtPWIuYm9keSxuPW18fGIu Y3JlYXRlRWxlbWVudCgiYm9keSIpO2lmKHBhcnNlSW50KGQsMTApKXdoaWxlKGQt LSlqPWIuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5pZD1lP2VbZF06aCsoZCsxKSxs LmFwcGVuZENoaWxkKGopO3JldHVybiBmPVsiJiMxNzM7IiwnPHN0eWxlIGlkPSJz JyxoLCciPicsYSwiPC9zdHlsZT4iXS5qb2luKCIiKSxsLmlkPWgsKG0/bDpuKS5p bm5lckhUTUwrPWYsbi5hcHBlbmRDaGlsZChsKSxtfHwobi5zdHlsZS5iYWNrZ3Jv dW5kPSIiLG4uc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsaz1nLnN0eWxlLm92ZXJm bG93LGcuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZy5hcHBlbmRDaGlsZChuKSks aT1jKGwsYSksbT9sLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCk6KG4ucGFyZW50 Tm9kZS5yZW1vdmVDaGlsZChuKSxnLnN0eWxlLm92ZXJmbG93PWspLCEhaX0sej1m dW5jdGlvbihiKXt2YXIgYz1hLm1hdGNoTWVkaWF8fGEubXNNYXRjaE1lZGlhO2lm KGMpcmV0dXJuIGMoYikubWF0Y2hlczt2YXIgZDtyZXR1cm4geSgiQG1lZGlhICIr YisiIHsgIyIraCsiIHsgcG9zaXRpb246IGFic29sdXRlOyB9IH0iLGZ1bmN0aW9u KGIpe2Q9KGEuZ2V0Q29tcHV0ZWRTdHlsZT9nZXRDb21wdXRlZFN0eWxlKGIsbnVs bCk6Yi5jdXJyZW50U3R5bGUpWyJwb3NpdGlvbiJdPT0iYWJzb2x1dGUifSksZH0s QT1mdW5jdGlvbigpe2Z1bmN0aW9uIGQoZCxlKXtlPWV8fGIuY3JlYXRlRWxlbWVu dChhW2RdfHwiZGl2IiksZD0ib24iK2Q7dmFyIGY9ZCBpbiBlO3JldHVybiBmfHwo ZS5zZXRBdHRyaWJ1dGV8fChlPWIuY3JlYXRlRWxlbWVudCgiZGl2IikpLGUuc2V0 QXR0cmlidXRlJiZlLnJlbW92ZUF0dHJpYnV0ZSYmKGUuc2V0QXR0cmlidXRlKGQs IiIpLGY9RihlW2RdLCJmdW5jdGlvbiIpLEYoZVtkXSwidW5kZWZpbmVkIil8fChl W2RdPWMpLGUucmVtb3ZlQXR0cmlidXRlKGQpKSksZT1udWxsLGZ9dmFyIGE9e3Nl bGVjdDoiaW5wdXQiLGNoYW5nZToiaW5wdXQiLHN1Ym1pdDoiZm9ybSIscmVzZXQ6 ImZvcm0iLGVycm9yOiJpbWciLGxvYWQ6ImltZyIsYWJvcnQ6ImltZyJ9O3JldHVy biBkfSgpLEI9e30uaGFzT3duUHJvcGVydHksQzshRihCLCJ1bmRlZmluZWQiKSYm IUYoQi5jYWxsLCJ1bmRlZmluZWQiKT9DPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEIu Y2FsbChhLGIpfTpDPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIgaW4gYSYmRihhLmNv bnN0cnVjdG9yLnByb3RvdHlwZVtiXSwidW5kZWZpbmVkIil9LEZ1bmN0aW9uLnBy b3RvdHlwZS5iaW5kfHwoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24o Yil7dmFyIGM9dGhpcztpZih0eXBlb2YgYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcg VHlwZUVycm9yO3ZhciBkPXcuY2FsbChhcmd1bWVudHMsMSksZT1mdW5jdGlvbigp e2lmKHRoaXMgaW5zdGFuY2VvZiBlKXt2YXIgYT1mdW5jdGlvbigpe307YS5wcm90 b3R5cGU9Yy5wcm90b3R5cGU7dmFyIGY9bmV3IGEsZz1jLmFwcGx5KGYsZC5jb25j YXQody5jYWxsKGFyZ3VtZW50cykpKTtyZXR1cm4gT2JqZWN0KGcpPT09Zz9nOmZ9 cmV0dXJuIGMuYXBwbHkoYixkLmNvbmNhdCh3LmNhbGwoYXJndW1lbnRzKSkpfTty ZXR1cm4gZX0pLHMuZmxleGJveD1mdW5jdGlvbigpe3JldHVybiBKKCJmbGV4V3Jh cCIpfSxzLmNhbnZhcz1mdW5jdGlvbigpe3ZhciBhPWIuY3JlYXRlRWxlbWVudCgi Y2FudmFzIik7cmV0dXJuISFhLmdldENvbnRleHQmJiEhYS5nZXRDb250ZXh0KCIy ZCIpfSxzLmNhbnZhc3RleHQ9ZnVuY3Rpb24oKXtyZXR1cm4hIWUuY2FudmFzJiYh IUYoYi5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLmZp bGxUZXh0LCJmdW5jdGlvbiIpfSxzLndlYmdsPWZ1bmN0aW9uKCl7cmV0dXJuISFh LldlYkdMUmVuZGVyaW5nQ29udGV4dH0scy50b3VjaD1mdW5jdGlvbigpe3ZhciBj O3JldHVybiJvbnRvdWNoc3RhcnQiaW4gYXx8YS5Eb2N1bWVudFRvdWNoJiZiIGlu c3RhbmNlb2YgRG9jdW1lbnRUb3VjaD9jPSEwOnkoWyJAbWVkaWEgKCIsbi5qb2lu KCJ0b3VjaC1lbmFibGVkKSwoIiksaCwiKSIsInsjbW9kZXJuaXpye3RvcDo5cHg7 cG9zaXRpb246YWJzb2x1dGV9fSJdLmpvaW4oIiIpLGZ1bmN0aW9uKGEpe2M9YS5v ZmZzZXRUb3A9PT05fSksY30scy5nZW9sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVy biJnZW9sb2NhdGlvbiJpbiBuYXZpZ2F0b3J9LHMucG9zdG1lc3NhZ2U9ZnVuY3Rp b24oKXtyZXR1cm4hIWEucG9zdE1lc3NhZ2V9LHMud2Vic3FsZGF0YWJhc2U9ZnVu Y3Rpb24oKXtyZXR1cm4hIWEub3BlbkRhdGFiYXNlfSxzLmluZGV4ZWREQj1mdW5j dGlvbigpe3JldHVybiEhSigiaW5kZXhlZERCIixhKX0scy5oYXNoY2hhbmdlPWZ1 bmN0aW9uKCl7cmV0dXJuIEEoImhhc2hjaGFuZ2UiLGEpJiYoYi5kb2N1bWVudE1v ZGU9PT1jfHxiLmRvY3VtZW50TW9kZT43KX0scy5oaXN0b3J5PWZ1bmN0aW9uKCl7 cmV0dXJuISFhLmhpc3RvcnkmJiEhaGlzdG9yeS5wdXNoU3RhdGV9LHMuZHJhZ2Fu ZGRyb3A9ZnVuY3Rpb24oKXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Jl dHVybiJkcmFnZ2FibGUiaW4gYXx8Im9uZHJhZ3N0YXJ0ImluIGEmJiJvbmRyb3Ai aW4gYX0scy53ZWJzb2NrZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIldlYlNvY2tldCJp biBhfHwiTW96V2ViU29ja2V0ImluIGF9LHMucmdiYT1mdW5jdGlvbigpe3JldHVy biBEKCJiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTUwLDI1NSwxNTAsLjUpIiksRyhq LmJhY2tncm91bmRDb2xvciwicmdiYSIpfSxzLmhzbGE9ZnVuY3Rpb24oKXtyZXR1 cm4gRCgiYmFja2dyb3VuZC1jb2xvcjpoc2xhKDEyMCw0MCUsMTAwJSwuNSkiKSxH KGouYmFja2dyb3VuZENvbG9yLCJyZ2JhIil8fEcoai5iYWNrZ3JvdW5kQ29sb3Is ImhzbGEiKX0scy5tdWx0aXBsZWJncz1mdW5jdGlvbigpe3JldHVybiBEKCJiYWNr Z3JvdW5kOnVybChodHRwczovLyksdXJsKGh0dHBzOi8vKSxyZWQgdXJsKGh0dHBz Oi8vKSIpLC8odXJsXHMqXCguKj8pezN9Ly50ZXN0KGouYmFja2dyb3VuZCl9LHMu YmFja2dyb3VuZHNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gSigiYmFja2dyb3VuZFNp emUiKX0scy5ib3JkZXJpbWFnZT1mdW5jdGlvbigpe3JldHVybiBKKCJib3JkZXJJ bWFnZSIpfSxzLmJvcmRlcnJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBKKCJib3Jk ZXJSYWRpdXMiKX0scy5ib3hzaGFkb3c9ZnVuY3Rpb24oKXtyZXR1cm4gSigiYm94 U2hhZG93Iil9LHMudGV4dHNoYWRvdz1mdW5jdGlvbigpe3JldHVybiBiLmNyZWF0 ZUVsZW1lbnQoImRpdiIpLnN0eWxlLnRleHRTaGFkb3c9PT0iIn0scy5vcGFjaXR5 PWZ1bmN0aW9uKCl7cmV0dXJuIEUoIm9wYWNpdHk6LjU1IiksL14wLjU1JC8udGVz dChqLm9wYWNpdHkpfSxzLmNzc2FuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4g SigiYW5pbWF0aW9uTmFtZSIpfSxzLmNzc2NvbHVtbnM9ZnVuY3Rpb24oKXtyZXR1 cm4gSigiY29sdW1uQ291bnQiKX0scy5jc3NncmFkaWVudHM9ZnVuY3Rpb24oKXt2 YXIgYT0iYmFja2dyb3VuZC1pbWFnZToiLGI9ImdyYWRpZW50KGxpbmVhcixsZWZ0 IHRvcCxyaWdodCBib3R0b20sZnJvbSgjOWY5KSx0byh3aGl0ZSkpOyIsYz0ibGlu ZWFyLWdyYWRpZW50KGxlZnQgdG9wLCM5ZjksIHdoaXRlKTsiO3JldHVybiBEKChh KyItd2Via2l0LSAiLnNwbGl0KCIgIikuam9pbihiK2EpK24uam9pbihjK2EpKS5z bGljZSgwLC1hLmxlbmd0aCkpLEcoai5iYWNrZ3JvdW5kSW1hZ2UsImdyYWRpZW50 Iil9LHMuY3NzcmVmbGVjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gSigiYm94UmVm bGVjdCIpfSxzLmNzc3RyYW5zZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4hIUooInRy YW5zZm9ybSIpfSxzLmNzc3RyYW5zZm9ybXMzZD1mdW5jdGlvbigpe3ZhciBhPSEh SigicGVyc3BlY3RpdmUiKTtyZXR1cm4gYSYmIndlYmtpdFBlcnNwZWN0aXZlImlu IGcuc3R5bGUmJnkoIkBtZWRpYSAodHJhbnNmb3JtLTNkKSwoLXdlYmtpdC10cmFu c2Zvcm0tM2QpeyNtb2Rlcm5penJ7bGVmdDo5cHg7cG9zaXRpb246YWJzb2x1dGU7 aGVpZ2h0OjNweDt9fSIsZnVuY3Rpb24oYixjKXthPWIub2Zmc2V0TGVmdD09PTkm JmIub2Zmc2V0SGVpZ2h0PT09M30pLGF9LHMuY3NzdHJhbnNpdGlvbnM9ZnVuY3Rp b24oKXtyZXR1cm4gSigidHJhbnNpdGlvbiIpfSxzLmZvbnRmYWNlPWZ1bmN0aW9u KCl7dmFyIGE7cmV0dXJuIHkoJ0Bmb250LWZhY2Uge2ZvbnQtZmFtaWx5OiJmb250 IjtzcmM6dXJsKCJodHRwczovLyIpfScsZnVuY3Rpb24oYyxkKXt2YXIgZT1iLmdl dEVsZW1lbnRCeUlkKCJzbW9kZXJuaXpyIiksZj1lLnNoZWV0fHxlLnN0eWxlU2hl ZXQsZz1mP2YuY3NzUnVsZXMmJmYuY3NzUnVsZXNbMF0/Zi5jc3NSdWxlc1swXS5j c3NUZXh0OmYuY3NzVGV4dHx8IiI6IiI7YT0vc3JjL2kudGVzdChnKSYmZy5pbmRl eE9mKGQuc3BsaXQoIiAiKVswXSk9PT0wfSksYX0scy5nZW5lcmF0ZWRjb250ZW50 PWZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIHkoWyIjIixoLCJ7Zm9udDowLzAgYX0j IixoLCc6YWZ0ZXJ7Y29udGVudDoiJyxsLCciO3Zpc2liaWxpdHk6aGlkZGVuO2Zv bnQ6M3B4LzEgYX0nXS5qb2luKCIiKSxmdW5jdGlvbihiKXthPWIub2Zmc2V0SGVp Z2h0Pj0zfSksYX0scy52aWRlbz1mdW5jdGlvbigpe3ZhciBhPWIuY3JlYXRlRWxl bWVudCgidmlkZW8iKSxjPSExO3RyeXtpZihjPSEhYS5jYW5QbGF5VHlwZSljPW5l dyBCb29sZWFuKGMpLGMub2dnPWEuY2FuUGxheVR5cGUoJ3ZpZGVvL29nZzsgY29k ZWNzPSJ0aGVvcmEiJykucmVwbGFjZSgvXm5vJC8sIiIpLGMuaDI2ND1hLmNhblBs YXlUeXBlKCd2aWRlby9tcDQ7IGNvZGVjcz0iYXZjMS40MkUwMUUiJykucmVwbGFj ZSgvXm5vJC8sIiIpLGMud2VibT1hLmNhblBsYXlUeXBlKCd2aWRlby93ZWJtOyBj b2RlY3M9InZwOCwgdm9yYmlzIicpLnJlcGxhY2UoL15ubyQvLCIiKX1jYXRjaChk KXt9cmV0dXJuIGN9LHMuYXVkaW89ZnVuY3Rpb24oKXt2YXIgYT1iLmNyZWF0ZUVs ZW1lbnQoImF1ZGlvIiksYz0hMTt0cnl7aWYoYz0hIWEuY2FuUGxheVR5cGUpYz1u ZXcgQm9vbGVhbihjKSxjLm9nZz1hLmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNv ZGVjcz0idm9yYmlzIicpLnJlcGxhY2UoL15ubyQvLCIiKSxjLm1wMz1hLmNhblBs YXlUeXBlKCJhdWRpby9tcGVnOyIpLnJlcGxhY2UoL15ubyQvLCIiKSxjLndhdj1h LmNhblBsYXlUeXBlKCdhdWRpby93YXY7IGNvZGVjcz0iMSInKS5yZXBsYWNlKC9e bm8kLywiIiksYy5tNGE9KGEuY2FuUGxheVR5cGUoImF1ZGlvL3gtbTRhOyIpfHxh LmNhblBsYXlUeXBlKCJhdWRpby9hYWM7IikpLnJlcGxhY2UoL15ubyQvLCIiKX1j YXRjaChkKXt9cmV0dXJuIGN9LHMubG9jYWxzdG9yYWdlPWZ1bmN0aW9uKCl7dHJ5 e3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShoLGgpLGxvY2FsU3RvcmFnZS5y ZW1vdmVJdGVtKGgpLCEwfWNhdGNoKGEpe3JldHVybiExfX0scy5zZXNzaW9uc3Rv cmFnZT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gc2Vzc2lvblN0b3JhZ2Uuc2V0SXRl bShoLGgpLHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oaCksITB9Y2F0Y2goYSl7 cmV0dXJuITF9fSxzLndlYndvcmtlcnM9ZnVuY3Rpb24oKXtyZXR1cm4hIWEuV29y a2VyfSxzLmFwcGxpY2F0aW9uY2FjaGU9ZnVuY3Rpb24oKXtyZXR1cm4hIWEuYXBw bGljYXRpb25DYWNoZX0scy5zdmc9ZnVuY3Rpb24oKXtyZXR1cm4hIWIuY3JlYXRl RWxlbWVudE5TJiYhIWIuY3JlYXRlRWxlbWVudE5TKHIuc3ZnLCJzdmciKS5jcmVh dGVTVkdSZWN0fSxzLmlubGluZXN2Zz1mdW5jdGlvbigpe3ZhciBhPWIuY3JlYXRl RWxlbWVudCgiZGl2Iik7cmV0dXJuIGEuaW5uZXJIVE1MPSI8c3ZnLz4iLChhLmZp cnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5uYW1lc3BhY2VVUkkpPT1yLnN2Z30scy5z bWlsPWZ1bmN0aW9uKCl7cmV0dXJuISFiLmNyZWF0ZUVsZW1lbnROUyYmL1NWR0Fu aW1hdGUvLnRlc3QobS5jYWxsKGIuY3JlYXRlRWxlbWVudE5TKHIuc3ZnLCJhbmlt YXRlIikpKX0scy5zdmdjbGlwcGF0aHM9ZnVuY3Rpb24oKXtyZXR1cm4hIWIuY3Jl YXRlRWxlbWVudE5TJiYvU1ZHQ2xpcFBhdGgvLnRlc3QobS5jYWxsKGIuY3JlYXRl RWxlbWVudE5TKHIuc3ZnLCJjbGlwUGF0aCIpKSl9O2Zvcih2YXIgTCBpbiBzKUMo cyxMKSYmKHg9TC50b0xvd2VyQ2FzZSgpLGVbeF09c1tMXSgpLHYucHVzaCgoZVt4 XT8iIjoibm8tIikreCkpO3JldHVybiBlLmlucHV0fHxLKCksZS5hZGRUZXN0PWZ1 bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJvYmplY3QiKWZvcih2YXIgZCBpbiBh KUMoYSxkKSYmZS5hZGRUZXN0KGQsYVtkXSk7ZWxzZXthPWEudG9Mb3dlckNhc2Uo KTtpZihlW2FdIT09YylyZXR1cm4gZTtiPXR5cGVvZiBiPT0iZnVuY3Rpb24iP2Io KTpiLHR5cGVvZiBmIT0idW5kZWZpbmVkIiYmZiYmKGcuY2xhc3NOYW1lKz0iICIr KGI/IiI6Im5vLSIpK2EpLGVbYV09Yn1yZXR1cm4gZX0sRCgiIiksaT1rPW51bGws ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBrKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVt ZW50KCJwIiksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGEu ZG9jdW1lbnRFbGVtZW50O3JldHVybiBjLmlubmVySFRNTD0ieDxzdHlsZT4iK2Ir Ijwvc3R5bGU+IixkLmluc2VydEJlZm9yZShjLmxhc3RDaGlsZCxkLmZpcnN0Q2hp bGQpfWZ1bmN0aW9uIGwoKXt2YXIgYT1yLmVsZW1lbnRzO3JldHVybiB0eXBlb2Yg YT09InN0cmluZyI/YS5zcGxpdCgiICIpOmF9ZnVuY3Rpb24gbShhKXt2YXIgYj1p W2FbZ11dO3JldHVybiBifHwoYj17fSxoKyssYVtnXT1oLGlbaF09YiksYn1mdW5j dGlvbiBuKGEsYyxmKXtjfHwoYz1iKTtpZihqKXJldHVybiBjLmNyZWF0ZUVsZW1l bnQoYSk7Znx8KGY9bShjKSk7dmFyIGc7cmV0dXJuIGYuY2FjaGVbYV0/Zz1mLmNh Y2hlW2FdLmNsb25lTm9kZSgpOmUudGVzdChhKT9nPShmLmNhY2hlW2FdPWYuY3Jl YXRlRWxlbShhKSkuY2xvbmVOb2RlKCk6Zz1mLmNyZWF0ZUVsZW0oYSksZy5jYW5I YXZlQ2hpbGRyZW4mJiFkLnRlc3QoYSk/Zi5mcmFnLmFwcGVuZENoaWxkKGcpOmd9 ZnVuY3Rpb24gbyhhLGMpe2F8fChhPWIpO2lmKGopcmV0dXJuIGEuY3JlYXRlRG9j dW1lbnRGcmFnbWVudCgpO2M9Y3x8bShhKTt2YXIgZD1jLmZyYWcuY2xvbmVOb2Rl KCksZT0wLGY9bCgpLGc9Zi5sZW5ndGg7Zm9yKDtlPGc7ZSsrKWQuY3JlYXRlRWxl bWVudChmW2VdKTtyZXR1cm4gZH1mdW5jdGlvbiBwKGEsYil7Yi5jYWNoZXx8KGIu Y2FjaGU9e30sYi5jcmVhdGVFbGVtPWEuY3JlYXRlRWxlbWVudCxiLmNyZWF0ZUZy YWc9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50LGIuZnJhZz1iLmNyZWF0ZUZyYWco KSksYS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGMpe3JldHVybiByLnNoaXZNZXRo b2RzP24oYyxhLGIpOmIuY3JlYXRlRWxlbShjKX0sYS5jcmVhdGVEb2N1bWVudEZy YWdtZW50PUZ1bmN0aW9uKCJoLGYiLCJyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1m LmNsb25lTm9kZSgpLGM9bi5jcmVhdGVFbGVtZW50O2guc2hpdk1ldGhvZHMmJigi K2woKS5qb2luKCkucmVwbGFjZSgvXHcrL2csZnVuY3Rpb24oYSl7cmV0dXJuIGIu Y3JlYXRlRWxlbShhKSxiLmZyYWcuY3JlYXRlRWxlbWVudChhKSwnYygiJythKyci KSd9KSsiKTtyZXR1cm4gbn0iKShyLGIuZnJhZyl9ZnVuY3Rpb24gcShhKXthfHwo YT1iKTt2YXIgYz1tKGEpO3JldHVybiByLnNoaXZDU1MmJiFmJiYhYy5oYXNDU1Mm JihjLmhhc0NTUz0hIWsoYSwiYXJ0aWNsZSxhc2lkZSxmaWdjYXB0aW9uLGZpZ3Vy ZSxmb290ZXIsaGVhZGVyLGhncm91cCxuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2Nr fW1hcmt7YmFja2dyb3VuZDojRkYwO2NvbG9yOiMwMDB9IikpLGp8fHAoYSxjKSxh fXZhciBjPWEuaHRtbDV8fHt9LGQ9L148fF4oPzpidXR0b258bWFwfHNlbGVjdHx0 ZXh0YXJlYXxvYmplY3R8aWZyYW1lfG9wdGlvbnxvcHRncm91cCkkL2ksZT0vXig/ OmF8Ynxjb2RlfGRpdnxmaWVsZHNldHxoMXxoMnxoM3xoNHxoNXxoNnxpfGxhYmVs fGxpfG9sfHB8cXxzcGFufHN0cm9uZ3xzdHlsZXx0YWJsZXx0Ym9keXx0ZHx0aHx0 cnx1bCkkL2ksZixnPSJfaHRtbDVzaGl2IixoPTAsaT17fSxqOyhmdW5jdGlvbigp e3RyeXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImEiKTthLmlubmVySFRNTD0iPHh5 ej48L3h5ej4iLGY9ImhpZGRlbiJpbiBhLGo9YS5jaGlsZE5vZGVzLmxlbmd0aD09 MXx8ZnVuY3Rpb24oKXtiLmNyZWF0ZUVsZW1lbnQoImEiKTt2YXIgYT1iLmNyZWF0 ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4gdHlwZW9mIGEuY2xvbmVOb2RlPT0i dW5kZWZpbmVkInx8dHlwZW9mIGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVu ZGVmaW5lZCJ8fHR5cGVvZiBhLmNyZWF0ZUVsZW1lbnQ9PSJ1bmRlZmluZWQifSgp fWNhdGNoKGMpe2Y9ITAsaj0hMH19KSgpO3ZhciByPXtlbGVtZW50czpjLmVsZW1l bnRzfHwiYWJiciBhcnRpY2xlIGFzaWRlIGF1ZGlvIGJkaSBjYW52YXMgZGF0YSBk YXRhbGlzdCBkZXRhaWxzIGZpZ2NhcHRpb24gZmlndXJlIGZvb3RlciBoZWFkZXIg aGdyb3VwIG1hcmsgbWV0ZXIgbmF2IG91dHB1dCBwcm9ncmVzcyBzZWN0aW9uIHN1 bW1hcnkgdGltZSB2aWRlbyIsc2hpdkNTUzpjLnNoaXZDU1MhPT0hMSxzdXBwb3J0 c1Vua25vd25FbGVtZW50czpqLHNoaXZNZXRob2RzOmMuc2hpdk1ldGhvZHMhPT0h MSx0eXBlOiJkZWZhdWx0IixzaGl2RG9jdW1lbnQ6cSxjcmVhdGVFbGVtZW50Om4s Y3JlYXRlRG9jdW1lbnRGcmFnbWVudDpvfTthLmh0bWw1PXIscShiKX0odGhpcyxi KSxlLl92ZXJzaW9uPWQsZS5fcHJlZml4ZXM9bixlLl9kb21QcmVmaXhlcz1xLGUu X2Nzc29tUHJlZml4ZXM9cCxlLm1xPXosZS5oYXNFdmVudD1BLGUudGVzdFByb3A9 ZnVuY3Rpb24oYSl7cmV0dXJuIEgoW2FdKX0sZS50ZXN0QWxsUHJvcHM9SixlLnRl c3RTdHlsZXM9eSxlLnByZWZpeGVkPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj9K KGEsYixjKTpKKGEsInBmeCIpfSxnLmNsYXNzTmFtZT1nLmNsYXNzTmFtZS5yZXBs YWNlKC8oXnxccyluby1qcyhcc3wkKS8sIiQxJDIiKSsoZj8iIGpzICIrdi5qb2lu KCIgIik6IiIpLGV9KHRoaXMsdGhpcy5kb2N1bWVudCksZnVuY3Rpb24oYSxiLGMp e2Z1bmN0aW9uIGQoYSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09by5jYWxs KGEpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhfWZ1bmN0 aW9uIGYoKXt9ZnVuY3Rpb24gZyhhKXtyZXR1cm4hYXx8ImxvYWRlZCI9PWF8fCJj b21wbGV0ZSI9PWF8fCJ1bmluaXRpYWxpemVkIj09YX1mdW5jdGlvbiBoKCl7dmFy IGE9cC5zaGlmdCgpO3E9MSxhP2EudD9tKGZ1bmN0aW9uKCl7KCJjIj09YS50P0Iu aW5qZWN0Q3NzOkIuaW5qZWN0SnMpKGEucywwLGEuYSxhLngsYS5lLDEpfSwwKToo YSgpLGgoKSk6cT0wfWZ1bmN0aW9uIGkoYSxjLGQsZSxmLGksail7ZnVuY3Rpb24g ayhiKXtpZighbyYmZyhsLnJlYWR5U3RhdGUpJiYodS5yPW89MSwhcSYmaCgpLGwu b25sb2FkPWwub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsYikpeyJpbWciIT1hJiZt KGZ1bmN0aW9uKCl7dC5yZW1vdmVDaGlsZChsKX0sNTApO2Zvcih2YXIgZCBpbiB5 W2NdKXlbY10uaGFzT3duUHJvcGVydHkoZCkmJnlbY11bZF0ub25sb2FkKCl9fXZh ciBqPWp8fEIuZXJyb3JUaW1lb3V0LGw9Yi5jcmVhdGVFbGVtZW50KGEpLG89MCxy PTAsdT17dDpkLHM6YyxlOmYsYTppLHg6an07MT09PXlbY10mJihyPTEseVtjXT1b XSksIm9iamVjdCI9PWE/bC5kYXRhPWM6KGwuc3JjPWMsbC50eXBlPWEpLGwud2lk dGg9bC5oZWlnaHQ9IjAiLGwub25lcnJvcj1sLm9ubG9hZD1sLm9ucmVhZHlzdGF0 ZWNoYW5nZT1mdW5jdGlvbigpe2suY2FsbCh0aGlzLHIpfSxwLnNwbGljZShlLDAs dSksImltZyIhPWEmJihyfHwyPT09eVtjXT8odC5pbnNlcnRCZWZvcmUobCxzP251 bGw6biksbShrLGopKTp5W2NdLnB1c2gobCkpfWZ1bmN0aW9uIGooYSxiLGMsZCxm KXtyZXR1cm4gcT0wLGI9Ynx8ImoiLGUoYSk/aSgiYyI9PWI/djp1LGEsYix0aGlz LmkrKyxjLGQsZik6KHAuc3BsaWNlKHRoaXMuaSsrLDAsYSksMT09cC5sZW5ndGgm JmgoKSksdGhpc31mdW5jdGlvbiBrKCl7dmFyIGE9QjtyZXR1cm4gYS5sb2FkZXI9 e2xvYWQ6aixpOjB9LGF9dmFyIGw9Yi5kb2N1bWVudEVsZW1lbnQsbT1hLnNldFRp bWVvdXQsbj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSxvPXt9 LnRvU3RyaW5nLHA9W10scT0wLHI9Ik1vekFwcGVhcmFuY2UiaW4gbC5zdHlsZSxz PXImJiEhYi5jcmVhdGVSYW5nZSgpLmNvbXBhcmVOb2RlLHQ9cz9sOm4ucGFyZW50 Tm9kZSxsPWEub3BlcmEmJiJbb2JqZWN0IE9wZXJhXSI9PW8uY2FsbChhLm9wZXJh KSxsPSEhYi5hdHRhY2hFdmVudCYmIWwsdT1yPyJvYmplY3QiOmw/InNjcmlwdCI6 ImltZyIsdj1sPyJzY3JpcHQiOnUsdz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihh KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1vLmNhbGwoYSl9LHg9W10seT17fSx6 PXt0aW1lb3V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIubGVuZ3RoJiYoYS50aW1l b3V0PWJbMF0pLGF9fSxBLEI7Qj1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3Zh ciBhPWEuc3BsaXQoIiEiKSxiPXgubGVuZ3RoLGM9YS5wb3AoKSxkPWEubGVuZ3Ro LGM9e3VybDpjLG9yaWdVcmw6YyxwcmVmaXhlczphfSxlLGYsZztmb3IoZj0wO2Y8 ZDtmKyspZz1hW2ZdLnNwbGl0KCI9IiksKGU9eltnLnNoaWZ0KCldKSYmKGM9ZShj LGcpKTtmb3IoZj0wO2Y8YjtmKyspYz14W2ZdKGMpO3JldHVybiBjfWZ1bmN0aW9u IGcoYSxlLGYsZyxoKXt2YXIgaT1iKGEpLGo9aS5hdXRvQ2FsbGJhY2s7aS51cmwu c3BsaXQoIi4iKS5wb3AoKS5zcGxpdCgiPyIpLnNoaWZ0KCksaS5ieXBhc3N8fChl JiYoZT1kKGUpP2U6ZVthXXx8ZVtnXXx8ZVthLnNwbGl0KCIvIikucG9wKCkuc3Bs aXQoIj8iKVswXV0pLGkuaW5zdGVhZD9pLmluc3RlYWQoYSxlLGYsZyxoKTooeVtp LnVybF0/aS5ub2V4ZWM9ITA6eVtpLnVybF09MSxmLmxvYWQoaS51cmwsaS5mb3Jj ZUNTU3x8IWkuZm9yY2VKUyYmImNzcyI9PWkudXJsLnNwbGl0KCIuIikucG9wKCku c3BsaXQoIj8iKS5zaGlmdCgpPyJjIjpjLGkubm9leGVjLGkuYXR0cnMsaS50aW1l b3V0KSwoZChlKXx8ZChqKSkmJmYubG9hZChmdW5jdGlvbigpe2soKSxlJiZlKGku b3JpZ1VybCxoLGcpLGomJmooaS5vcmlnVXJsLGgsZykseVtpLnVybF09Mn0pKSl9 ZnVuY3Rpb24gaChhLGIpe2Z1bmN0aW9uIGMoYSxjKXtpZihhKXtpZihlKGEpKWN8 fChqPWZ1bmN0aW9uKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2su YXBwbHkodGhpcyxhKSxsKCl9KSxnKGEsaixiLDAsaCk7ZWxzZSBpZihPYmplY3Qo YSk9PT1hKWZvcihuIGluIG09ZnVuY3Rpb24oKXt2YXIgYj0wLGM7Zm9yKGMgaW4g YSlhLmhhc093blByb3BlcnR5KGMpJiZiKys7cmV0dXJuIGJ9KCksYSlhLmhhc093 blByb3BlcnR5KG4pJiYoIWMmJiEtLW0mJihkKGopP2o9ZnVuY3Rpb24oKXt2YXIg YT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ay5hcHBseSh0aGlzLGEpLGwoKX06 altuXT1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYj1bXS5zbGlj ZS5jYWxsKGFyZ3VtZW50cyk7YSYmYS5hcHBseSh0aGlzLGIpLGwoKX19KGtbbl0p KSxnKGFbbl0saixiLG4saCkpfWVsc2UhYyYmbCgpfXZhciBoPSEhYS50ZXN0LGk9 YS5sb2FkfHxhLmJvdGgsaj1hLmNhbGxiYWNrfHxmLGs9aixsPWEuY29tcGxldGV8 fGYsbSxuO2MoaD9hLnllcDphLm5vcGUsISFpKSxpJiZjKGkpfXZhciBpLGosbD10 aGlzLnllcG5vcGUubG9hZGVyO2lmKGUoYSkpZyhhLDAsbCwwKTtlbHNlIGlmKHco YSkpZm9yKGk9MDtpPGEubGVuZ3RoO2krKylqPWFbaV0sZShqKT9nKGosMCxsLDAp Oncoaik/QihqKTpPYmplY3Qoaik9PT1qJiZoKGosbCk7ZWxzZSBPYmplY3QoYSk9 PT1hJiZoKGEsbCl9LEIuYWRkUHJlZml4PWZ1bmN0aW9uKGEsYil7elthXT1ifSxC LmFkZEZpbHRlcj1mdW5jdGlvbihhKXt4LnB1c2goYSl9LEIuZXJyb3JUaW1lb3V0 PTFlNCxudWxsPT1iLnJlYWR5U3RhdGUmJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIu cmVhZHlTdGF0ZT0ibG9hZGluZyIsYi5hZGRFdmVudExpc3RlbmVyKCJET01Db250 ZW50TG9hZGVkIixBPWZ1bmN0aW9uKCl7Yi5yZW1vdmVFdmVudExpc3RlbmVyKCJE T01Db250ZW50TG9hZGVkIixBLDApLGIucmVhZHlTdGF0ZT0iY29tcGxldGUifSww KSksYS55ZXBub3BlPWsoKSxhLnllcG5vcGUuZXhlY3V0ZVN0YWNrPWgsYS55ZXBu b3BlLmluamVjdEpzPWZ1bmN0aW9uKGEsYyxkLGUsaSxqKXt2YXIgaz1iLmNyZWF0 ZUVsZW1lbnQoInNjcmlwdCIpLGwsbyxlPWV8fEIuZXJyb3JUaW1lb3V0O2suc3Jj PWE7Zm9yKG8gaW4gZClrLnNldEF0dHJpYnV0ZShvLGRbb10pO2M9aj9oOmN8fGYs ay5vbnJlYWR5c3RhdGVjaGFuZ2U9ay5vbmxvYWQ9ZnVuY3Rpb24oKXshbCYmZyhr LnJlYWR5U3RhdGUpJiYobD0xLGMoKSxrLm9ubG9hZD1rLm9ucmVhZHlzdGF0ZWNo YW5nZT1udWxsKX0sbShmdW5jdGlvbigpe2x8fChsPTEsYygxKSl9LGUpLGk/ay5v bmxvYWQoKTpuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssbil9LGEueWVwbm9w ZS5pbmplY3RDc3M9ZnVuY3Rpb24oYSxjLGQsZSxnLGkpe3ZhciBlPWIuY3JlYXRl RWxlbWVudCgibGluayIpLGosYz1pP2g6Y3x8ZjtlLmhyZWY9YSxlLnJlbD0ic3R5 bGVzaGVldCIsZS50eXBlPSJ0ZXh0L2NzcyI7Zm9yKGogaW4gZCllLnNldEF0dHJp YnV0ZShqLGRbal0pO2d8fChuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsbiks bShjLDApKX19KHRoaXMsZG9jdW1lbnQpLE1vZGVybml6ci5sb2FkPWZ1bmN0aW9u KCl7eWVwbm9wZS5hcHBseSh3aW5kb3csW10uc2xpY2UuY2FsbChhcmd1bWVudHMs MCkpfTsK ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=comment-reply.min.js Content-Type: text/javascript; name=comment-reply.min.js Content-Location: http://help.netbynet.ru/wp-includes/js/comment-reply.min.js?ver=3.7.1 Content-Transfer-Encoding: 8bit addComment={moveForm:function(a,b,c,d){var e,f=this,g=f.I(a),h=f.I(c),i=f.I("cancel-comment-reply-link"),j=f.I("comment_parent"),k=f.I("comment_post_ID");if(g&&h&&i&&j){f.respondId=c,d=d||!1,f.I("wp-temp-form-div")||(e=document.createElement("div"),e.id="wp-temp-form-div",e.style.display="none",h.parentNode.insertBefore(e,h)),g.parentNode.insertBefore(h,g.nextSibling),k&&d&&(k.value=d),j.value=b,i.style.display="",i.onclick=function(){var a=addComment,b=a.I("wp-temp-form-div"),c=a.I(a.respondId);if(b&&c)return a.I("comment_parent").value="0",b.parentNode.insertBefore(c,b),b.parentNode.removeChild(b),this.style.display="none",this.onclick=null,!1};try{f.I("comment").focus()}catch(l){}return!1}},I:function(a){return document.getElementById(a)}}; ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=login.png Content-Type: image/png; name=login.png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/login.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAM0AAAAjCAYAAAA38o6bAAAACXBIWXMAAAsTAAAL EwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq 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 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=logo.png Content-Type: image/png; name=logo.png Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/img/logo.png Content-Transfer-Encoding: Base64 iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAC4jAAAu IwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj33 3vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEs DIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIe EeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH /w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAn f+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJ V2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4 mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHg g/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl 7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/A V/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5 WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQ WHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAA RKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv 1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4 IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGy UT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPE bDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPE NyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD 5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2h tlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0 dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHK CpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2ep O6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN 2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIp G6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3n U9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36 p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYP jGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLn m+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cR p7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0H DYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dn F2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofc n8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh 7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJ gUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85 ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7 F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/R NtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9 MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo 1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5 sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWF fevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTP ZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJ zs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ +7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3v dy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtb Ylu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ7 52PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7 nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9 zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9D BY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfy l5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT 0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq 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 RK5CYII= ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=pdf.jpg Content-Type: image/jpeg; name=pdf.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2012/02/pdf.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCODQ4OUZBRjU3RDExMUUx QUYwNkQ4NTBGQzlENEYyRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCODQ4 OUZCMDU3RDExMUUxQUYwNkQ4NTBGQzlENEYyRCI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI4NDg5RkFENTdEMTExRTFBRjA2 RDg1MEZDOUQ0RjJEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkI4NDg5RkFF NTdEMTExRTFBRjA2RDg1MEZDOUQ0RjJEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4AJkFk b2JlAGTAAAAAAQMAFQQDBgoNAAALAwAAGqkAACIKAAAqVf/bAIQAAQEBAQEBAQEB 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 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=15.jpg Content-Type: image/jpeg; name=15.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2011/11/15.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABGAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBQjI3N0RFNjE2NjUxMUUx OUU3QkVBN0YzOEQ0MTI4RCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBQjI3 N0RFNzE2NjUxMUUxOUU3QkVBN0YzOEQ0MTI4RCI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFCMjc3REU0MTY2NTExRTE5RTdC RUE3RjM4RDQxMjhEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkFCMjc3REU1 MTY2NTExRTE5RTdCRUE3RjM4RDQxMjhEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ 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 v5Nq2WGTcmBNVYhDW0JbbCO6urfiWV64dXHymNrdy70S7L6ZYl8+MflCfjVmcS3T Dq8pj7F27I9MsS+fGPyhPxqnEt0wcpj7F27I9MsS+fGPyhPxqcS3TBymPsXbsojm WJ3t57Y25R6wlf8AhrXEs0wcpj7F27I9MsTvqCbY25Q6ymAj9enFs0wcnj7F27Jh mWJ8s2xvz9YS8anFs0wcnj7F27J+mWJfPjH5Qn41OLZpg5PH2Lt2R6ZYl8+MflCf jU4tmmDk8fYu3ZHpliXz4x+UJ+NTi2aYOTx9i7dkemWJfPjH5Qn41OLZpg5PH2Lt 2R6ZYl8+MflCfjU4tmmDk8fYu3ZHpliXz4x+UJ+NWeJbpheTx9i7dk/TPEvnxj8o T8anEt0wcnj7F27I9M8S+fGPyhPxqcS3TByePsXbsj0zxL58Y/KE/GpxLdMHJ4+x duyXpliXz4x+UJ+NTiW6YOTx9i7dkwzPErf++MflCfjU4lumDk8fYu3ZHpniXz4x +UJ+NTiW6YOTx9i7dkemeJfPjH5Qn41OJbphOTx9i7dk/TPEvnxj8oT8anEt0wvJ 4+xduyXpniXz4x+UJ+NTiW6YOTx9i7dkemeJfPjH5Qn41OJbpg5PH2Lt2R6Z4l8+ MflCfjU4lumDk8fYu3ZHpniXz4x+UJ+NV4lumDk8fYu3ZHpniXz4x+UJ+NTiW6YT k8fYu3ZP0zxL58Y/KE/GpxLdMHJ4+xduyPTPEvnxj8oT8arxbNMHJ4+xduyfpniX z4x+UJ+NU4lumDk8fYu3ZHpniXz4x+UJ+NTiW6YOTx9i7dkemeJfPjH5Qn41OJbp g5PH2Lt2R6Z4l8+MflCfjU4lumDk8fYu3ZHpniXz4x+UJ+NTiW6YOTx9i7dkemeJ fPjH5Qn41OJbpg5PH2Lt2R6Z4l8+MflCfjU4lumDk8fYu3ZHpniXz4x+UJ+NTiW6 YOTx9i7dkemeJfPjH5Qn41OJbpg5PH2Lt2R6Z4l8+MflCfjU4lumDk8fYu3ZHpni Xz4x+UJ+NTiW6YOTx9i7dkemeJfPjH5Qn41OJbpg5PH2Lt2R6Z4l8+MflCfjU4lu mDk8fYu3ZHpniXz4x+UJ+NTiW6YOUx9i7dk/TPEvnxj8oT8anEt0wcpj7F27Jeme I/PjH5Qn41OJbpg5TH2Lt2T9MsS+fGPyhPxqcS3TBymPsXbstdz3LMYdYRkiDeZZ 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 ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=21.jpg Content-Type: image/jpeg; name=21.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2011/11/21.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABGAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDMjRDOEY1MjE2NjUxMUUx OEU1OUEzN0ZFNjFBMjk1OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDMjRD OEY1MzE2NjUxMUUxOEU1OUEzN0ZFNjFBMjk1OCI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkMyNEM4RjUwMTY2NTExRTE4RTU5 QTM3RkU2MUEyOTU4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMyNEM4RjUx MTY2NTExRTE4RTU5QTM3RkU2MUEyOTU4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ CQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU /8AAEQgB/AIbAwERAAIRAQMRAf/EAN8AAQABBQEBAQAAAAAAAAAAAAABBAUGBwgD AgkBAQACAwEBAQAAAAAAAAAAAAABAgMEBQYHCBAAAQMDAgIEBgoNBgkJBQgDAQID BAARBRIGIQcxQRMUUWHRIlKScZEyQlPTFVUWF/CBwtIjk5S01IU2JwhyM7MkdXah sWKiQ1R0hDfB8aM1RWUmVhiyRMQlOOGCY3OD42SVNKRGEQEAAQMBBAYGBwUIAgEF AAAAARECAwQhMUESUXFSExQFYZGhIjIGgbHB0UJyU+GSczQV8GLC0jOTFjbxoiOy 4mMkB//aAAwDAQACEQMRAD8A3zs7ljsb6K4ybk8cibKlRWZciS+tY4uoDh9yoAAX rJdkmrbvz3800lZ0yuRbkhCPkRYxzjwjN5gxpYxpeJ0hIkk6Onr6Kw+JitKtydNq oivor6adTNV8suW6EFxeCjBsDUpWpwDSON76+isveXdLnd9f0sWagcmXVoJ28tGO fcDLOWcjykQFrKtIAfJ08TwB6D4a0bfMsc3U5vR6G1OPPG32cWUL5Y8tkILi8FGS 0kalL1OAADje+vorf7y7panf39KyN7b5RuLbJ292cV5XZszXW5CIq1HgLOFVuPV4 ad5d0p76/pX8creXFv8AqBj7SnPv6d5d0o72/pPqt5cjo2/H9Zz7+neXdJ3t/SfV dy7+YWPWc+/p3l3Sd7d0n1XcuuvAsD2FO/f0jLd0ne3dJ9V3LodGBY9Zz7+p727p R3l3SfVdy7P/AGBH9tz7+ne3dJ3l3SfVdy76PkCOPYU59/TvbulHPd0n1W8ur3+Q WPWc+/qe+v6TnnpT9V/Lv5hY9Zz7+nfX9Jzz0n1YcvB/2Cxbw6nPv6d7f0o5pPqy 5e/MTHrOD7unfX9JzSn6s+Xx/wCwWPWc+/qe/v6UVk+rPl70fILPru/f07+/pD6s OXvzEx7bn39O/v6UH1Y8vfmJj1nPv6eIydIfVjy9+YmPWc+/p4jJ0oofVny9HRgm PWc++p3+TtSUhP1ZcvfmJj23Pv6nxGTtSUg+rLl78xMe259/TxGTtSUg+rPl78xM X9lz7+niMnakpC0DbfJw5P5HRDhLyWvsSwlxxRDtr9mSFEBduOm96eIydqSkLseW XL0jjgWLeHU59/TxGTtSUhH1Z8vfmFj1nPv6eJy9qSkH1ZcverAsX6/Oc+/p4nL2 pKQfVny9P/YLHj4uff08Tl7UlIPqy5e/MLHrOn7unicvakpCfqw5e/MLF+rznR93 TxOXtSUhH1ZcveP/AMiY9Zz7+nicvalHLAeWXL0jjgmLfynOr/79PE5O1JywDljy 9JAGCY8XFz7+nicnak5YPqx5eHpwLN/Zc+/qfE5O1JywfVhy6tf5CYt/Kc9j06eJ ydqTlhQQNi8q8mp9ELCsOKjL7KQPw6ShzjdKtShYi3EdVPE5O1JyQrjyu5dA8cCx cf5Tn39T4rL2pR3dqfqv5d9eBY9Zz7+nisvaOS3oPqw5dfMLHrOff08Vl7RyW9B9 WHLvo+QmCP5Tn39PFZe0clvQfVhy6+YWPWc+/p4rL2jkt6D6r+XfzCx6zn39PFZe 0clvQfVfy7+YWPWc+/p4rL2kd3b0H1X8u/mFj1nPv6eLy9o7u3oPqv5ddeBY9Zz7 +ni8vaO7t6D6ruXXVgWL/wApz7+p8Xm7Und29CByu5d9WBY9Zz7+njM3ak7u3oPq u5dfMLHrOff08Xm7UndW9B9V/LvrwEf7anPv6eMzdqTurehH1W8uen6Px/bd+/p4 vN2kd1b0B5W8uevb8f1nfv6eMzdqTureh8nlXy4PTt+Of/vO/f08Xm7UndW9B9VP Lbp+j0f1nfv6eMzdo7q3oR9VPLQ//wDOx/bd+/qfGZu0d1b0H1TctOH/AIdj+s79 /TxmbtSd1Z0H1S8tD07djfaU79/TxmbtHdWdCPql5af+XY/rO/f08Zm7UndWdB9U 3LIdG3o/rO/f08bm7Uo7mzoT9U/LP/y7H9Z37+njc3ak7mzoPqn5af8Al2P6zv39 PG5u1J3NnQfVNy06tux7/wAp37+njc3ak7mzoSOVHLUH9n4/tu/f1Pjc3ak7izoe UnlHy2kMLZGCaa1ggONLdStPjB1njUxrs0filE4LOh4/w3GLi8LuPB9tqdiZySyl SuBUllttsH7emtnzO/nusu6bY+1TT20iY9LeV65DaaRxUdeU5bwcY272S5uEajJd HSkvRAgK+1e9L4rWGxZfFmWLp4T9rVR5a5Re3BgOwnJllIYLZbX3QJ6ArtraNPX7 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 Iv4K+kZ8Hl2jy2Yb8Uct8T72+m2I2z9O95DDl1mpsuyW3zW2fh6epsfkrzKnbyjz cPnCDm8WEqU9bSXWlkpBUmwspJFjXkfmbyWzQ3W5MX+nf7Jeh8o192osm2/4rW2a 8Y75QKBQQTYXoMAy29J6Mi+1jkvKhtkIbWiOpaVEDziFFBvxv0V0cemtm2s73Ny6 m6LpiNz7hcwVstFvIQJr7+q4W2xpGjhwIOniONVu0u3ZMJs1dI2xKrb5i45TiUuQ JzSCbKcWz5qR4TYngKpOkupvheNXbM7pZe24l1tDrZCm3EhSFjiCCLitSlG9Evuo CgUCgUCgUCgUCgUCgUCgUCgUCgHiDQcWcndP1hb30/8AmXI39nvCqz5uHUrDtX3n 6u+7rAsxvYSdGxtsJT0JxMAD8mRRad8sioqUHOG50v7r3jL2My63CxyX5OTzcles uyI4nONiM0EKRbXp89V+A9mgyfb+18Ls4PtbahNR0ZJ1OtKSpPaLQiyRdSiSAE2A 8tBge4/lXam7Je6H22nsJnHokTKxgFsympSlFlMhKbFDl9SErHuuF6sOidnHVtHA KB4HHQyPxCKgXuoCgUEUHPeOyK5G/sqXkhc+O9k32WVcQuRGQ6pkW67BKbD/ACa+ nX4uXQ2U+G6LIr6JpX65eUmZnUzXfHN9q8YWMJbe0uwgNZGBn1vTNzZuS0h/UtLp T3cvL9wu40JSDqUqtPNdFs5vemycdIx2RNOHxU4xx6KMuO2sWbObm23TP1NY8wsp Lh4rHRcoz8n5V3Jzp0TE27NyJjnVJDaFN8CgKUCUpIHDj116nynBbdlumyea2LLb Zu7V8b5rx2b5cjWTPLbzRS7mmYjotdMbAkSZeyNvSZV+8O4+MpZPSbtpsT7I418n 81sts1eWLd3Pd9b2ummZxW16IZHXMbBQKCD0UHPWI5W7u3RzYyeVyMUp2B8qylPr WsIU8lGqwbHuiC5YE+zXvI82wYPL7bLZ/wDm5fVt4/Q8b/Tc+XXXX3R/8VfXs4fS 39t7l9tbbOTkZTDwhHkSEJbtcqShIvfRqvbVfjxryefzDPnsi2+axD02HR4sV03W xSqy85tnzt37Imw8Gwl3cbGh7GKJShQWlYK0hSuHnI1C1bfk+tt02pib59yfiavm mluz4Jiz4uBsBp9jYu2WJKSiS1i4SHkL4KStMdAUD4wa52rui7PfMbpun627pYmM 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 BQKBQRQPaoHj4XoIsOINiDQQttt1Oh1KVo6bKAIuOI4Gg+rD2B4KCaBQKBQKBQKB QKCkyEBjIMFh8AoI66DHfoDh79Fh02FBP0Bw/o0D6A4f0aB9AcP6NA+gOH9GgfQH D+iCKC8YnCQ8OgoipCQaC53oFBNAoFAoFAoIoBsRY2oIAHHo4/46CQB0dVB8IabQ pSkJSgrN1lIAKj4TQelAoFAoFAoFAoFAoIoFBNAoFAoFAoIoBItQcSck/wDiFvz+ 9OS/pzWbJw6lYdve8/V33dYVmIbNTp2jt/zlADGw/fK+AR46iN0LXfFKvymXxeEh OZLM5BrHY9n+clS5AYZSDwF1rUAL1Krzwuewm44IyW38oxlcepRQJUKQH2tSelOp tShcX4i9BcOPSFqI6vOV5aB4POV4/PV5aCTe/AqsOnz1eWge+tqX66vLQLH0l+ur y0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfr q8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX 66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0 l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx 9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tA sfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vL QLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ur y0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfrq8tAsfSX66vLQLH0l+ury0Cx9Jfr q8tAsfSX66vLQLH0l+ury0Cx9JXrq8tBxpyRFuYG+v70ZL+nNZsnDqUt4u3vefq7 7usK7E9pADamDAHRjogH4hNRG6Frt8sD5wbczWSyeydx4/FK3Bjdt5RczK4Nst9q 607HWyh1tLpCFrZUrWEqPscalVi2+2eaO68xiHdjYvJbbxMyBl4OXdeW1HcZLqY6 m5AabdUC8sJW0yo8UKOo9HEKbAbc5gfSHbX06iZyfhhgMbGa+T5pbRFyyFK72uaG 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 Fx4aBceGgXHhoIuPDQTceGgXHhoFx4aBceGgXHhoFx4aCLjw0C48NBNx4aBceGgX HhoIuKCbjw0EXHhoFx4aBceGgm48NAuPDQLjw0C48NAuPDQLjw0EXHhoBI8NBx7y d/b/AHn/AHjyH9Oa2M3DqUtdq+8/V33da67GNhMs/QXbH4NJPyTAvwHT3ZvxUWu3 yumXyeD2/j3svnZUXGYqMAZE6Y42ww2FKCE63F2SLqIAuek0VU+B3DtbdUV2dtnJ QcxCYeVGekQHmpLaH0JStTalNkgKCVpJSeoigunZM/BJ49HAeSgnsmLX7NHtCgdk x8Enj4h5KB2LPwSfaFA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsW fgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUDsWfgk+0PJQOxZ+CT7Q8lA7Fn4JPtDyUAss /BJ9oVA4x5Pp08wt6gAAfSTI2A/2hVbObh1KWu1Pefq77utddjewv2G2z/ZMD82R Ra7fLXnP2TmslH2vsXC4KVm/l3KMS8m3EUw3px+JeblOo1yXWmwpwpSlOpfh6aKt KzHtztbgnbcyO18xAkZXmCrNPYiPKYYcl4zKYwIQwJUaT2Oq8ZWodsALi5F6C+I2 7zNwMHY22Wsk9E3duFWVwuSxL0sy5ELASpLklqSpxC1pLsRkdmlevpUEgqNqDOH+ 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 /wDNmU/ENfHUD65Nv/NmU/ENfHUD65Nv/NmU/ENfHUD65Nv/ADZlPxDXx1A+uTb/ AM2ZT8Q18dQPrk2/82ZT8Q18dQR9cm3/AJsyn4hr46gn65NvHpxuUA//ACGvjqDR /KXaeda3huHJux9LGVy8rIx03uoMyXStIVw4KseIrLkvi6lOhW2KOv8AucjTbTx7 l2XT77Ve3tViWXhfZ6Va7abcfYoNe5n6Dd+V3rT29vO06bUFB+777NNA/d99mmgf u++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99mmgfu++zTQP3ffZpoH7vvs00D 9332aaB+777NNA/d99mmgfu++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99mmg fu++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99mmgfu++zTQP3ffZpoH7vvs00 D9332aaB+777NNA/d99mmgfu++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99mm gfu++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99mmgfu++zTQP3ffZpoH7vvs0 0D9332aaB+777NNA/d99mmgfu++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99m mgfu++zTQP3ffZpoH7vvs00D9332aaB+777NNA/d99mmgfu++zTQP3ffZpoMg2v9 Eu2X8lae2vx1WoMzoP/Z ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=91.jpg Content-Type: image/jpeg; name=91.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2011/11/91.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABGAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2RDdGNDM4NDE2NjYxMUUx QUU1OEQwNEFCQ0Q3MTI5RSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2RDdG NDM4NTE2NjYxMUUxQUU1OEQwNEFCQ0Q3MTI5RSI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjZEN0Y0MzgyMTY2NjExRTFBRTU4 RDA0QUJDRDcxMjlFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZEN0Y0Mzgz MTY2NjExRTFBRTU4RDA0QUJDRDcxMjlFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ CQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU /8AAEQgCXgK4AwERAAIRAQMRAf/EAOcAAQABBQEBAAAAAAAAAAAAAAABAgQFBgcD CAEBAAIDAQEAAAAAAAAAAAAAAAEDAgQFBgcQAAAFAgEECAsPDwgJAgUEAwABAgME EQUGIRITBzFBUdMUlFUWYZHRIlKS0pMVVhdxgaEycrJTc7M0VHQ1CBjwseFCYoLC 4iMklbU2plfBM8NkJUV1N0Njo0S0ZSZ2J4RG8aKD1IWkpWaWhkc4EQEAAQICBgMN BQcEAgEFAAAAAQIDEQQxURITFAUhMlJBYXGR0XKiM1OTVBUGobHBIqOBQpLCNDUW 8LIjdOFzYvGCJCUH/9oADAMBAAIRAxEAPwDdtTGpvC2J8MN4nxS27L4a6+iNGQ+4 yhLbLims5WhUlRqNSTPKYtqq7kOhevVU1YR0YOjSNRup2G3pZVrOO0n/AErtxmIT 0zkEQx25a/EXNamJqR1NTkaSDbeEILZUzcpjhdNMgyDblHEV63v5BNU5f3I5x+d/ 9wI251nEXNbHSNUmoiHKRClMMMTFZEx3LtJQ6ZnuIVJIzETfiJwmYZxeuzDIp1C6 pTIjTZVmk9gynzqGXfxltyw4ivWpc1FaoWEKdetC2W07K13CalPTN8g25OIr1vKJ qZ1LzjMoMBMpSdnQ3OW5Tzc2QYjbnWcRc1rryEaqduyuGe7w+d/I+J25TxFzWnyE aqSy+BHOPzt/Dbk4i5rPIVqq2rI5T49O38NuTiLmv7ElqK1Vll8DOF0OHTd/Dbk4 i5rT5DNVh/3Ovj03fw25TxFzX9x5DNVhZSs66/Hpu/htycRc1/cqLUfqv27Ovj03 fw25OIua/uPIhqvPKVncyf16bv4bcnEXNf3JLUlqx5Hcyf16bv4bcnEXNf3HkS1Y n/c7mT+vTd/Dbk4i5r+48ierA/7nXx6bv4bcnEXNf3HkR1Yn/c6+PTd/Dbk4i5r+ 48ierHkdfHpp/wBOG3JxFev7k+RXVjyOvjs3fw25OIr1nkU1Y8jr47N38NuTiK9Z 5E9WJ/3Ovjs3fwiuTiK9afIrqy2Cs66/HZu/idudaOIuazyKatOR18dm7+G8qjun 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 57wNjXuf/vmy03PBeT64bvM9uPEcZyT4e57w0GvfY582Wn+Gbvnhu8z248RxnJPh 7nvE6DXv482X9F/ZDd5ntx4jjOSfD3PeI0Gvfx5sv6L3PPDd5ntx4jjOSfD3PeJ0 GvjJ/wBc2XJ/yv7IbvM9uPEcZyT4e57xGg18VqWObL5ngzJk88N3me3HiOM5J8Pc 94aDXvlPnzZansn4L+yG7zPbjxHGck+Hue8ToNe/jzZf0X9kN3me3HiOM5J8Pc94 g2NfBlTnzZcmx/Zn2Q3eZ7ceI4zknw9z3hoNe/jzZd35L+yG7zPbjxHGck+Hue8C Y17kVCxzZaf4Z9kN3me3HiOM5J8Pc94aDXv482XzfBf2Q3eZ7ceI4zknw9z3hoNf FKc+bL0P7M+yG7zPbjxHGck+Hue8NBr38ebL+jPshu8z248RxnJPh7nvDQa9/Hmy 7p/2X9kN3me3HiOM5J8Pc94aDXv482X9GfZDd5ntx4jjOSfD3PeGg17l/wC+bL+j Pshu8z248RxnJPh7nvAmNe5f++bL+jPshu8z248RxnJPh7nvDQa96U582Wn+F/ZD d5ntx4jjOSfD3PeJNjXuZ1582Wv+F/ZDd5ntx4jjOSfD3PeGg17ns45smX/lf2Q3 eZ7ceI4zknw9z3igomvMlKWnG1jJxdCUsrURKMi2KnWobvM9uPEcZyT4e57xXoNe 9a8+bLl2f7L+yG7zPbjxHGck+Hue8RoNe+xz5stNzwX9kN3me3HiOM5J8Pc94aDX x49WX9GfZDd5ntx4jjOSfD3PeGg17kdefNl/Rf2Q3eZ7ceI4zknw9z3hode/jzZv 0X9kN3me3HiTxnJPh7nvDRa9/Hmzfov7IbvM9uPEcZyT4e57w0Wvfx5s36L+yG7z PbjxHGck+Hue8ZbU7j+/4gtF+bxhLYmXa0XyZaUSI7RMNraiIaIjJJbqjUeUZZS7 VXFW10zFUw1vqHJZfLXbW4pmmm5aouYTOPTVNX4N5u7qXblalp2DKR/RjeeXZ9v0 ifMAVgAAAAAAAAAAAAAAAAADFYm/Zy8fEZPuShlRpgl8sah/k+B6khbmPWSxp0O0 /N2L/wAQ2P264frCQKal93rS6mIVAAAAAAAAAAAAAAAAACD2gGAP9pYvtb34IDYA AAAAGHxYVcL3v/D5fuKhVd6k+BuZH+ot+fT98ORaq0rd1V4PbSqhHCKvbrFGT9TT 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 ExOCGseRV7l5PEz38b/Gd5r7jvp8irvLqeJnv4cX3jcd88irvLqeJnv4cX3jcd88 irvLqeJnv4cX3jcd9HkUd2fDxcUPfw4vvG474epR0zIzvxZP6me/hxfeNx30+RV7 l1PEz38OL7xuO+eRV3l1PEz38OL7xuO+jyKvcup4me/hxfeNx30+RV7l1PEz38OL 7xuO+eRV3l1PEz38OL7xuO+eRV3l1PEz38OL7xuO+jyKu8up4me/hxfeTue+tLPq 8XhnF0aaq5FKI2H29GTGi9Nm5a6RYpu39uMMGdNvZb/oeiNZYaHohik0PRDEND0Q xQw+K2aYXvZ53+4SvcVCu7P5J8Et3I/1Fvz6fvhyjVK3XVfg867MIvXqGtkp/wCG nwOx9T/3O/534Q7NCYpHbPO2hu4vNrkk5q6VqArECjbASAAAAAAACDykZbPQAYuV h63yn1yzN9h93+cVFkPRjVTbVolJqfmhCHlzXhfCrj+kJm+icEnNeF8KuP6Qmb6G Ac14Xwq4/pCZvoYBzXhfCrj+kJm+hgHNeF8KuP6Qmb6GAc14Xwq4/pCZvoYBzXhf Crj+kJm+hgHNeF8KuP6Qmb6GAc14Xwq4/pCZvoYBzXhfCrj+kJm+hgHNeF8KuP6Q mb6GAc14Xwq4/pCZvoYCjm5BqouE3HrToZ+EZe/BgI5u2+qfzu4UURmR+EZe1T/X dEMBJ4bgFT87uGcZVIvCMvfgwEnhu3l/vk/J/wAxl78GAc24Gycu4Zu74Rmb6GAF hu3mrN4XcP0jM34MAPDUAjocu4V/xGXvwYCebMAqVl3Aq/8AMZe/BgIPDdvIiM5l wy7H9ozN+DADw3b0nmqmXBJ9G4y9+DAQWHLcZZxTJ5l0LjM34MBPNu37PC7hQ/8A mMvfgwDm1A+F3D9Iy9nvwYCOblvqX55cMux/aMzfgwE827fUklMuBmf/ADGZvoYA rDUBJZZdwrStPCMvfgwDm3Ay/ndwyHT5Rl78GAc27f8AC7hk2f7Rl7X/ANYMA5tQ Phdw3S/tGXlLvwYCtjDttQ6iQa5Elxk6tlKlPyEJPdJLq1FURhIy1SI8m2YShwPV YpKYesCp7GNrz9dkc7Jfv+fV+D2X1P1sr/1rX8zoN0nQ4XgyXMkNR4zZPG4884lt tJKNoiqpR0LKdMo6LxzMMYmw85cSsbV2hLvaUEs7amS0qVmKKpK0RKz6GWWuaAqj 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 8+r8HuPqjrZX/rWv5nSJfvi0+ZI/ox0HjmyN+kT5gCoAAAAAAAABJAJAAAAARCKk +R7U165wBkQGKxL+zt4+IyfclCaUTofLGoj3hA9SQtv9eUU6HddROTVjaq+zXD/j 5AopX3evLo4lUtbj7yc+99cQDbgAAAAAAAAAAAAAAAAGpXP5fieoe+skBd7ZgAAA AMbiGK/OsN0hRUaSTJhyGWUVIs5xxpSUlUzIiqZjCuJmmcNTZytyLd6iqZwiKon7 Xzdhy6a3sFYas2FpGrY5CrUyTBSTvcJvSmRmdc0iXm7OxnGOZZrv26Ip3eOH/wAo e65nluU5zNV3+M2duccNzXOH7ehvEfWdriSwhKdUmcgiyKPEUEvQNsW76/7L0oc7 5Tyn439Cvyq/Khrizq+SMv8A+xwN7DfX/ZelB8p5T8b+hX5Q9aGuL+EZF/8A5HA3 sN9f9l6UHynlHx36FflQes/XF/CT94oG9hvr/svSg+U8o+O/Qr8p5T9cf8JP3igb 2G+v+y9KD5Tyj479CvynlP1x/wAJP3igb2G+v+y9KD5Tyj479CvynlP1x/wk/eKB vYb6/wCy9KD5Tyj479CvynlP1x/wk/eKBvYb6/7L0oPlPKPjv0K/KeU/XH/CT94o G9hvr/svSg+U8o+O/Qr8p5T9cf8ACT94oG9hvr/svSg+U8o+O/Qr8p5T9cf8JP3i gb2G+v8AsvSg+U8o+O/Qr8qT1oa4v4R/vHA3sTvr/svSg+U8p+O/Rr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP3jg72G/zHsvSg+U8p+O/Qr8p5UNcf8JP 3jg72G/zHsvSg+U8p+O/Qr8p5UNcW3qj/eODvYib2Y9l6UEcp5T8d+hX5UeU/XFt aoi6Bc4oJ1/2Ynf5juWvShE8p5TEf136NflYzVna8QWayYjdxVbfA9yvOIZ94bgG +1KzGZqWVJ/KMqUk6KSpNToeStCqMsnRVTTVtRhjVM+NR9S5rLXrtmmxc3lNq1RR jhMYzTtdye90/tdBl/z9pPdKR/RjeeVbK36RPmAKgAAAAAAAAEkQCQAAAACH7+f9 qa9c4AyADFYlP/p28fEZPuShNKJ0PljUR7wgepIXX+vKKdDuuov/ACytXttw/wCP kDXp0L7vXl0cSqWtx95Ofe+uIBtwAAAAAAAAAAAAAAAADUrn8vxPUPfWSAu9swAA AAEGVclK+gCYYS8WXhxktOQy2CIOhGDHJw9KQRESz3KB0IwQdhl1pnnUOgwDsEzs zDoMFPgGX2aumJ6DBPgCX2aumYdBgeAJfZq6Zh0GB4Al9mrpmHQYIOwyy+3V0zDo MDwFK7NXTDoMDwFL2c9XTDoMElYJZ/bq6Zh0GCnwHKpU3FF55h0GCfAUvJ16svRD oMDwDKP/AEh9Mw6DA8Ay6VNai88w6DA8AzOyV0w6DA8Ay+zV0w6DAKwzOyV0w6DB HgKV2aumYdBgnwFK9kPpmHQYHgGX2aumYdBgeAZfZq6Zh0GB4Bmdkrph0GB4Bl9m rph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl 9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4 Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0G B4Bl9mrph0GB4Bl9mrph0GB4Bl9mrph0GB4ClkddIoujUOgwUHhp5xSVOqNZFWhd ExDKVV3YJiZZ2yKlCkf0YIZxsizE+YAroW6QBQt0gChbpAFC3SAKFukAjJukAZNv IZ7BbYCfr7nogAAAAABCOs9/2pr1zgDIAMViYv8Apu80+AyfclDKnTBOh8r6hstu gH9yQtv9eWNOh3bUX/llavbbh/x8ga9Ohfd68ujiVS1uPvJz731xANuAAAAAAAAA AAAAAAAAalc/l+J6h76yQF3tmAAAAAAACNssnogKDLrwE0AU7YB53ogHneiAed6I B5peiAtzPr15/pM7rgFRrUWcSTIiQWxugBvHU1ER5EZwClxa1J8xBGfnmAnSqTUq poSvQoAaRdD6J0IBWaloLOUqqd0BSa3DMiUoiNRZxZNoBBOmebkPrk0LzQAluL0Z ZxEZ9DcADdUZIIz2TMukAKdVQs3KRqzAA38hKr1xFUy8zIAqUbhqR11DVtUIAS9R RoVUz2CMB6dDb80BWSDplVQBFMtM8BJJPsj6QBmn2RgGadaZwBmn2QCDI+yM/MIB OaeQs48uxkAM0+yPpAGadaEo/NoCMUUqZES6mYGJmn2RgJzTpXOyAIpt5/1gMU5p 9kZgGafZH0gDNPsj6QBmn2R9IAzT7I+kAZpl9sfSAxRm1OmcdPMBKdH92dAGvX60 vXK6WptuauHoykVUhCHK10e0sjoAzCMITs1NL6/sewMdyAr5oT+XXuLx+5AOaE/l 17i8fuQDmhP5de4vH7kA5oT+XXuLx+5AOaM/l17i8fuQFJ4UmkRmq/PERFU6x45U LtQHnzVuC2icj35xypEps1MsGhRHsZUprTzAGPtsl2XE0jvWvodejvkn0ukiuqYW aegZoMyAXoAAAACIRfn8j2pr1zgDIgMViY/+m7z8Rle4qGVPcJ0PlbULlttv9SQt v9eWNOh3bUSolasLSospG7cP+PkENanQvu9eXSBkqWtx95Ofe+uIBtwAAAAAAAAA AAAAAAADUrn8vxPUPfWSAu9swAAAAAAANsgFB+nMBICjbASAAAAAp0aTrXYPKYCF NoUdTSAqzS2ipkp5wChbRLSZbBnQvOIANpBlTNoWQ/NMgE6MjPLsbIAtGeVD9L2O 6AhTRKURnlIip5wCTbTkptbHQAQpojUky2EkfogJNCaEnNyFlr0QDRJNJJOmQ6lt AKTbQZEWb0MgCok7BkR5NjzwDRlWtDqAqOu4AqV1yDrkAWhqM2yMvtDIjPomoB7E txa1lXNJNSIqbgCklrM0GZ1qZlTzAAnFGRL2s6lAA3F55Ek6JJwk0AVIdzs5Jqoq p0ydEBRplElZnlNs6qLboAsMR3KTbsP3W5xTST8SM++xnFnFntNKUVS2yqQwrnCm Z7zZytuLl6iidFVURPgmYcTwvedfWKcMWzE7OJLDGjXRgn2mHYLhrQRmZUUaTptD m2pzNyiKoqpjHvPb8wo5LlMxXZqtXZmicMduF6Xl50ZOJxVh/Z+AvdUW7GZ7VPia HEcj9jd/jhXXX7nqzcVYeqZFX8wdp9cNjM9qnxHEcj9jd/jhSXl7WZJVivD9cv8A uDvVEbGZ7VPiOI5H7G7/ABwlZa+klTnXh4+hwB7qidjM9qnxHEcj9jd/jhW2Wv0i qWK8PJ6HAHuqGxme1T4jiOR+xu/xwr/8/eNuHeIPdURsZntU+I4jkfsb38cH/n7x tw7xB7qhsZntU+I4jkfsb38cH/n7xtw7xB7qhsZntU+I4jkfsb38cBnr9LZxbh3i D3VDYzPap8RxHI/Y3f44DPX6RH/1bh3iD3VE7GZj96nxHE8j9jd/jhVgbHOP2NY8 /BeObnb7gwzaE3Nl+3x1MFnuSEtERmo6nQs4RZuXd7sVzE9GKeZZTIzy+jNZamuj G5sfmqx/dxdmjy25BZzaqkY6LxrHXR/Q3a2q3Uv/ANGA2Rq4dYnzNwBX4RL6iAPC JfUQB4RL6iAPCJfUQAdxL6iAazjydCcwlcmJ96OwQ3mjbfupERmy2vIdM6hEe1UB aasZNqiYOhQrRfzxJbYtWItyMiIzQnLmGZGdc3YIwFNjUSo0oyyl4RuWXzZ74DKA AAAAEM/z9/2pr1zgDIAMTij9mrxT4FK9xUJp0wTofK2oL5Mt3qS+uLb/AF5Y06Hc fm+/5UWdVa1duH6wkDWo0Nm/6yXThmoWtx95Ofe+uIBtwAAAAAAAAAAAAAAAADUr n8vxPUPfWSAu9swAAAAAAANsgFB+nMBICjbASAAAAAAAAAAAAAAAAAAAC2Wo+vqe wZEQCz0KrnfYtoddWiAph+S6lCjbNZMqaQlNU5aVdr5wDOc0MPbbLlfjUnfQGuYn matMHHHbxDKOLIl53BYxSJTj7pI9MaG0OGoyLbMiyAL/AA/CwHiq2N3nDz/hC2um aUSGJchSc5J0Uk6O5DI9kjAZM8IYcPZjumR/1mTvoCjmbhrNzSYcJNa04TJ832UB PM/DnpuDuZx7P5zJ30ALB2GslIzmTL75k7f/ANUBHM3DJGX5u55nCpO+gJ5nYbM8 kZzIdffMnZ76AFg3DZ1pHcIj2T4VJ30BQ9g2yKaWiIl6M8ZHmOpkPKMjodDMlrUR +eQDU7pJObq7uElzK45aZS1nunoF5RXd6k+CW7kP6m359P8AuhxrD06TG1MYLajv GyctmLFUtPpkpecURmQs5RRFdNETqdH6qq2eYX5/+TbYOCrC7GQp1Ly1GVTUqXKK vSdIvQHpN3Pc+6HieIl4Xyz4Fw3AXdL2/wABhINKDeenykEa1nRKS/LZVKPIRFlM Y1UzTGM/dHkTF6ZnCFjh5nV3ilyQ3ZXXnX4hIU+0uTPZcQl2uaZpccSdDzToIpia tH3R5E1XZjSz/MnDtT/JPGXx2Zs9+Ge7q/1EeRjxCOZOHvYnsuX35M2O/Bu6v9RH kOIkLBWHT2G3T/8AWzN+EbFX+ojyHEHMnDx1o08dNmkyZvwbFX+ojyHEScycO+xu 8dmeb7MJ3dX+ojyE5iTmVh32N6vx2ZvwjYqn/wCkeQnMSxl7sUKwQ3LvanHWX4ua 4aTkPPJWWcRGk0urUWUjGe42owmGVvMTNUQxi7UhnX7do6chIwqw4R13ZtB4mP6q fM/F9Hu/2Gj/AN8/7HXMMLzWc1R5SPZ6A6DxzzxTdbbbrnaVXCW1FQspBIU8tLZH TR7GcZAL9vFuFsxP9sw9j2dvqgKuduFeWYXf2+qAc7cK8swu/t9UA524V5Zhd/b6 oBztwryzC7+31QDnbhblmF39vqgLW4X3Bd0hP26dc4L0SSg2nmzfbNKkKyGR1MB4 2i74Hw/bItptVwiIhREJbYYadSszItnInKpRnlPIArw8TnATcUg2+EvS5SW1FQyT IlOPJIy3c1YDLAAAAAIhF+fyPamvXOAMiAxGJ/2avNNngUr3FQyp0widD5W1AHW1 W4/uS+uLL3XlFOh3H5vn+U1l9uuH6wkDXo0Q2sx6yXTxk11rcfeTn3vriAbcAAAA AAAAAAAAAAAAA1K5/L8T1D31kgLvbMAAAAAAADbIBQfpzASAo2wEgAAAAAAAAAAA AAAAAAAAo0ZV3anUwGNJ02sUxFJy/wBnTPd4gDPcOX2Po1AcUn4gtuDtfNyxBjWW zbbRdbFFi4eu9wfSxDbcjuuKkxydcMkIWozJebnFUgGiSYabphjWxjixzbjCssi4 eEcNTrfOlwGnnUtJbffbJhbZONLVlSZkaVbJAMpiW94h1eXjAFzsM26TbHCgO3PE dtfly7kuUzIOOy6s9MtxatEThuISWxTIA153GmstjAmN5Ui4Szf5320rq45IeaXb LJPjwZL7KXWUOrYbZS8bbjjSDUhOcssuUBmomKMYwLHhFGHMRW3ETj2NVx4TcO/S rhDKC5a5MjgUu4Gw48vMV15Z7bh0zK1PKQeNy1kYys2Gb9eb09IK5QscIinAt0t+ UjQqziTEYcU0ypSFKzU00aS3SAesdeLbrYNZ72L73c0Xu1rZuUBEG4SoKYS34hr0 CCYcbM0JydaqpZ2UBc4hxRcdW9h1U3O23Rak3N8pV1TiC9y248tTtodcUhyS+UpR VXRTbeYZZ9KEA7vhHFjuKsMWnEi7e9bV3SK1LODIyOtaVJKzTrTzjplLaIBm0zFm ZZDIqlneYA0N4v8AxjN/waT7gsV3epPglu5D+pt+fT/uhxS2qUjUxgNSPTZ0GhVp /pVDZ5HPUjvNz6wnDPZjzpb5CmzuCt1aM8mSqvsD3MWqNb5fvqtTnWtK4PW3EOBM S3pg+adnuUhd0dVnLYjvPw3mY0h4iIyShDiqZ55EmojqQ08xbopqoqmfyxM4+Lo+ 1t2LtVVNVMR+adHf6elGP9YrdywjKdwdeGZDbEqEi9XC0yESXIkB94kvOEto1Egy SRkatlKeuC9NGzjRV4cNRZ29rCqnXhj3Za5ab/bTexTCYxCuTq9YREOBdZd6kNMp uK0ma2SuaXDczTyGotIdDydAU00UTNUbX5ejpx7vhZ1V1xFMzT+acejDueBikY/c Y1d2203vEJwpd0vRwm7m9cVMI4G26RuKZmrWhxbKUZEvKVnKFcTTuoiasJmcP9T+ K6dreThToj/XQ9LRrEtbGD8QxkXld3goxGUKPJTfHUFHjPpZJpb88luOtR84l/lK nXKRZRNNVuKJ/Nj+bDT989yETt7cdGH5dX3R3Vqq93G8am8UXI7tMK6YZl3Bu3SY V1l6RphbiHGScdSbSn05ivyS3k1NFD2xEUxXZqna6aZmOiUxXNN6mMOirDuM9ivF 1y1X4qsjVvdcmW0rRNedttzusg3ZLunbMiZN1MhTr2UybbOmSvXEQzvbNmuMJxjD uz4PtV2sbtE49HT3I/10O0xbnOlR2ZJxlt6ZCXCaWfXJziI6Hk2R0Yt0TGOOloVX asdDEYrlS1WSYS2jSjNSSjqZnTOLaoMq7dFNEzGpbl7tU3aYw7r3k/8A/Q15/wC0 Y/8Axw+Y0/1U+b+L7Fdn/wDQ0f8Avn/Y6Xhksiv5R0HjnniRCFXK1EtOcVJFCPKR fzW6AySGWc1P5NOxuF1AFWga9iR2pAGga9iR2pAGga9iR2pAGga9iR2pAGga9iR2 pAGgZ9iR2pAGgaJVSbLJsUSX8oD0pTYqfm7PmAJAAAAAIZ/n7/tTXrnAGQAYnFH7 NXmmzwGV7ioZU6YJ0PlP5v3yRbfUl9cxZe68sadDufzfP8prL7dcP1hIGtRobWY6 8unjNrrW4+8nPvfXEA24AAAAAAAAAAAAAAAABqVz+X4nqHvrJAXe2YAAAAAAAG2Q Cg/TmAkBRtgJAAAAAAAAAAAAAAAAIyPYygACCMj2AE1LdAYe5olxrjDu8ZhUtDTL 0d6O2aSWaHlNrqnOoVSU2W2AgsRLMqlZbjT2tjfgHm7e0PpzH7DPdb2cxbUdRVrX beAVFfqJzCslxJsiyJJqPTzKacAViAzOqrJcTOlK6OPkLvwAd+Lrs6x3Hrj649FH y7WX8sApRfEtESWrDPbQk6oSTccqGe3QnqAKjv8AXZsdxOp5x1bjmedu/wA/sgJ5 wn139iXHL6b8mxl838uAhd9SaUpOxXE0l9po4+Q+h+WASWIVFkKy3HvbG/AIXf5R kfBbNNKTSjZvJaQ2RnsGo0uqOnnALK8Qztur+6QlmRqYtMpCjLYMyYWKrvUnwS3c h/U2/Pp/3Q43ha2Sbpqawa3CSS5cZiNKabVkJZsuKPNrTbDldzYt0T3nS+qqNvmF +nXVLfoFxktxUIewpd88iym2mGpFegZyUmZecPRcbGt4GeX195cLua1JMjwleVV2 jbhGX/FiJzkayOX195Q1OSy2TTeD7whBbCEtQSR0ilEHGRrPl9UoTNQls204PvCU HUzQTMEk9LhYRnIjoxT8vrnp6Fm/Htsi5xLu/gq8Lnwm3G4z2ihZyEO5FJIuF0y+ YMOKiZxxhlwNyIwiRiPbWLjLuzWCbumfObaZluaGEekbYzjbSouF063PUMozcY44 ojIV4YdC+Rccwj/6QvJZ3pyJmCVTyF8KGXGRrY/L6+8lVxNVM7CF5MyyEeihVp5v ChHGd9M8vq7mCoro5sHhO9ec3C/+7CM532M8uqx7jHXOBc8Tt+CIuH5tvbkKSh+b P0CEobJRGeaTLzpmeToBXnY2ZjFfZyNVNcTOHQxMzJ84e81Kn/SUevm8OHk4/qp8 z8X0q7/YaP8A3z/sdKw1kSqu2RjoPHKMR/KVp8yR9ZoBlGz6xPmAK6kAVIAqQBUg CpAFSAKkAVAAAAAAEQvf8j2pr1zgDIgMRiehYZvXxGV7ioZU6YJ0PlT5vnyPbfUl 9cxZe68sadDufzezLyTWX264frCQNejRDazHrJdPGTXWtx95Ofe+uIBtwAAAAAAA AAAAAAAAADUrn8vxPUPfggLvbMAAAAAAADbIBQfpzASAo2wEgAAAAAAAAAAAAAC2 cMy0lD2DT6ICttRpz1EWajaSYCo3CMiNGSu6ApJ2rSVJLKZ0MBGlVo87NKpKoQAb xpJVfTJ2PPADeUaKGXXkqmwZbAD16/bpUBNC2yygPN6mjMyyGWQBCjJbqUbFSM+k AlpSjQaSPYMyI/PAeRmpNM4uvr6AD1dzjzSLbMASRJcWnaT9cBCyopB7p0MvOMBB 9cpypmRpSVCqAt50SPcrfIgyUmpiWyuO6klGkzQ6k0qKpZdgxExjGE6FluubdUVx ppmJj9jht2+b1q/t5ttw405LSMmYU+TQi6BZ+Qc/5fa7/jl66frDmEzjM0T/APZT 5Hm1qS1cZhaSNcjVt0uMovwxPAWu/wCOWP8Al+f10e7p8ivyJatvgty/SMruw4C1 3/HJ/l+f10e7p8h5EtW3wW5fpGV3YcBa7/jk/wAvz+uj3dPkPIlq2+C3L9Iyu7Dg LXf8cn+X5/XR7unyHkS1bfBbl+kZXdhwFrv+OT/L8/ro93T5DyJatvgty/SMruw4 C13/AByf5fn9dHu6fIeRLVt8FuX6Rld2HAWu/wCOT/L8/ro93T5DyJatvgty/SMr uw4C13/HJ/l+f10e7p8h5EdW3wW5fpGV3YcBa7/jk/y/P66Pd0+RHkS1b1963Kn+ Iy98DgLXf8ck/V+f10fwU+Rl8OavsI4JnSbth2LJRcZbBxHnZEl6TVk1kvNLSqOm VJC21laLVW1T97ncx57ms9bi3dmNmmcYwpiOnDDuOlYabWhrOcIyMy2xtuA88SfK Vp8yT/RAMo36RPmAKgAAAAAAAAEkAkAAAAAhn+fv+1NeucAZABiMU/sxeqbPAZXu KhlTpgnQ+U/m95bNbPUl9cxZe68sadDufzev8prIe1prh+sJA16dDazHrJdQGTXW tx95Ofe+uIBtwAAAAAAAAAAAAAAAADUrmZFf4hmdOseIvNOgC6JVfM2gEgAAAAAC DPYAUn6cBOwAorlAKkAVIAqQBUgCpAFSAKkAVIAqQBUgCpAKDQk877qnoAKqkZ0p kAUqQSq1M8mwe2Ao0OUqGZEXRAFN0yEdSqR9I6gKtEnKR5TVTrq5SoAqNBGnNMzP LWuyZABJpt16J7ICqpAKXE56c2uTzQA0EZEmtKbBgBISkqEYCMws4lHlMtjKAg0E olEqtTOpH5gCSQkkmktkzymYAtvOXnV9LsZaABoI1GqvmgGaR0PYJO0AoeisP1Nx NagPDwXD7AgDwZD7AukAeDIfYF0gDwZD7AukAeDIfYF0gDwZD7AukAeDIfYF0gDw ZD7AukAeDIfYF0gDwZD7AukAnwXD20FTzAFw2w0yVEFQiAa7iJSVXO1JSdVEmQZl tkR6On1gGVb9InzAFQAAAAAAAACSASAAAAAiF7/ke1NeucAZEBiMU05s3r4hK9xU Jp0wTofKPzeDrZLWf3H4Ri2915Y06HdPm8/5SWX264frCQNenQ2b/rJdRGSha3H3 k59764gG3AAAAAAAAAAAAAAAAgwGrYqszlwazmVKQ82ec0tB0USt0jAc1mWrWCl5 RM3yWlH2pETOx3sBb+DdY/L0zpM72AeDdY/LszpM72AeDdY/LszpM72AeDdY/Lsz pM72AeDdY/LszpM72Ag7brHp8uzOkzvYDG3FjWXHmxmUX6YROtvLPIz/AKNTZex/ dAPPRazaH/1BLL71jewFlHc1nLaQs8QzOuKvpWN7AetdZvjDM7VjewCus3xhmdqx vYBXWb4wzO1Y3sArrN8YZnasb2AV1m+MMztWN7AK6zfGGZ2rG9gFdZvjBM7VjewC us3xgmdqxvYBXWb4wTO1Y3sArrN8YJnasb2AV1m+MEztWN7AK6zfGCZ2rG9gFdZv jBM7VjewCus3xgmdqxvYBXWb4wTO1Y3sArrN8YJnasb2AV1m+MEztWN7AK6zfGCZ 2rG9gFdZvjBM7VjewCus3xhmdqxvYBXWb4wTO1Y3sArrN8YJnasb2AV1m+MEztWN 7AK6zfGCZ2rG9gFdZvjBM7VjewCus3xgmdqxvYBXWb4wTO1Y3sArrN8YJnasb2AV 1m+MEztWN7AK6zfGCZ2rG9gFdZvjBM7VjewCus3xgmdqxvYBXWb4wTO1Y3sArrN8 YJnasb2AV1m+MEztWN7AK6zfGCZ2rG9gFdZvjBM7VjewCus3xgmdqxvYBXWb4wTO 1Y3sArrN8YJnasb2AH5TfGCZ2rG9gK2/KZnJzsQTDKuXrWN7Abfh603HT8NushyX NURJN52hnmlsZCIiLzgG6EWwW0RbICc0AzQDNAM0AzQDNARQA2NgBIAAAABD9/P+ 1NeucAZABiMVU5sXsy+ASvcViY0widD5Q+brlsVq9R+EYsu9aUU6HdPm7n/4ksp7 WluH6wkCmnQ2L3rJdSEqVrcfeTn3vriAbcAAAAAAAAAAAAAAAAAhSUqKiiqA8VRG FHXMIvOARwJjsS6QBwJjsS6QBwJjsS6QBwJjsS6QBwJjsS6QCOBsEXpS6QDA3mKx 4Uglml/MStr7tgB5HEj09KXSAYeHEY4M11pel3OiAuOCR+xLpAHBI/Yl0gDgkfsS 6QBwSP2JdIA4JH7EukAHEjlloXSAeLCrdJQtyM60822pTbi21JWlK0emSZkZ0Mts gExygS2USIrjb8dwqtutGS0KLdJSakYD14MxuF0gDgzFK5pU2a0AOCsdiWXYyABR WD2EkfnAHBWNnNKnmAHBWOxLpAI4MxuF0gDg0ctosnQATwZjsS6QBwZjcLb2tzZA RwZjcLpAJ4Ix2JdIBazZFntiEruMqPEbWokIVIWholKPYIjWZVM9wAlybNb20uz5 UeK0s6IW+tDaVGZVoRqMq5AFLs2xsxUTnpsZuE7Qm5K3EJaUZ1pRZnQ9g9sB7RTt 05kpEJ1qSwqua6yaXEHTZoaTMgHkmVZlzVW1EuOq4pTnqiE4g3iTumgjzqecApcn 2FmUUF2dFbnKMkpjKdbS6albBEgzrU/MARJn2GFITEmToseUuhpYddbbcMlZColR keXaAXi2YraTW5moQkqqUqhERFtmZgPCI/aJ7ByoMliVFKpG8wtDjZZuz1yTMsgD ziz7DOWtuFOiyXGyznEMutuGlJbJmSTOhAESdYp7qmIM6LKfRU1NMutuLIiyHUkm ZgPWY7a7dHVLuEhmJFQZEt99SWmyMzoVVKMiLKA9kMxXEJcbzVtrIlJUmhkZHlIy MgFXBmOxLpAHBmOxLpAHBmOxLpAHBmOxLpAHBmOxLpAHBmOxLpAHBmOxLpAHBmOx LpAHBWD+1LpAPRCEoyJIiIBVnHsAJqYBUwCpgFTAKmAVMAqYCQAAAAAAh+/3/amv XOAMgAw+Ky/6WvnxCV7ioZU6UTofJ/zczrYLUf3H4RjO71pRTod1+br/AJQ2L264 frCQKadDZv8ArJdTEqFrcfeTn3vriAbcAAAAAAAAAAAAAAAAAAAAAAAAAAIMBgb1 8qwPaJXr2AHkYDDwvezXqQFwAAAAAAKHcja/MMB8fYOnXfDFvvmCIDrrb2tCXc3L E+k1GbMwrvIgXBxOyRG1HNt8vazAbVhPEj2F9T+ELDh26T7fd+B3iVGi26PClLVG t0xxJreXcOsS02akEuh56s7rQGwWXHeMseXfC9li3rmszPwxFxHMlx2Iz0iXIlKU lTbPCm3m0obzaqoiuXZAel31m4mg6wrngZt82IC5VsixL++w0cWLwiOTjpKNNKuu n/N56Mzo7QCq9ayLpCx9a4lnukybZnr7Hw9cWHosFu3JceJJLSh3JKU6jOJVS6za AbnrXvV8tFrsLNgnqtky7Xy2Wp6ehph9xDE2QlpzMQ+hxGdQ8lUmA5/cMe45w1Fx nZnr0Vxn23E1mw/br3MjRkHFYvESE8t5xEdtptWYqQvMzk0qaagMqjHWJcNK1h2K 7XhN7ewzb48y1Xlxhhl1Umc0omo7qGEIaNROZtKIKpKKoDHM47x/haLjBV3uS7/L s1giXaKzJjRmNHKkpI1pPgrTVUpM9g6nkAXGIMWY0wdqyi4o5xLxDdb4u2tofTGg Nswk3BxCFrYShtpKiSS+t061ZSymAs8R3zW3adV+I8TzLtLs92w+485blyItqcdn xFpaNtUlDTTrSVJUbifyWZUqGYDOYuxnibV3iLDGHHrm7iKbebfd+DtyWI7T0y5t vwkREHwdptKENpecUs0JLrCNR1MgGc1WXnFWKMJWG9X+7JO5EqUi5tNMsobkqbWa E0LNqkm6faUrXKA6QnYKoDnus+VhltuFAnWWLfcVXMnoVhgyG2lqNTifyijW4lWj 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 0ReDpjb7m0RIWnL98kgH/9k= ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=101.jpg Content-Type: image/jpeg; name=101.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2011/11/101.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABGAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4NDlDQkNCRTE2NjYxMUUx QTE2RkNERTEzOTUzNTA0RSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4NDlD QkNCRjE2NjYxMUUxQTE2RkNERTEzOTUzNTA0RSI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjg0OUNCQ0JDMTY2NjExRTFBMTZG Q0RFMTM5NTM1MDRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjg0OUNCQ0JE MTY2NjExRTFBMTZGQ0RFMTM5NTM1MDRFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ CQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU /8AAEQgCYgK/AwERAAIRAQMRAf/EAN4AAQACAgMBAAAAAAAAAAAAAAABBQQGAwcI AgEBAAIDAQEBAAAAAAAAAAAAAAEDAgQFBgcIEAAABQEDBAsHDA0HCgUEAwEAAQID BAUREgYhMRMHQVHRk9MUlBVVFhdhkSLSU3OzcYEyUpKyM1TUdTYIobHBQnIjY6M0 ZHS0OGJDJEVlVlfwgqKEJTW1Jjcog8NEpBjh8cSV5IUnRxEBAAECAwMFDAoBBAMB AQEAAAECAxFRFBITBEFSklMFITGBkaGxMkLSMxUWcdHhcrJD0zRUNQbwYSIjgpNE JMEl/9oADAMBAAIRAxEAPwDtzVpq4oWIaEVexATj+ncdRGiodcZQlDLht3j0ZpMz M0meUxnNTpcRxFVNWEdzBt8zVjquprJyJ8RMWMnKbsioSW0e6U8RDHawa8X7k9yJ 7rjp+rbVRVmzepTDc1ks64lSkPJ90h8w2spJv3ae/Msvsf1dll5tc5bL4YNqWOou Zq6Rq91PwpBRJeiYlq9iw7VJDbhme0lT5GYib0R3JllF67MM9OqDV0aSUimOqSZW kopssyMu5+OGW3LDUV5oc1S6uGUG67T1tNllNa50tKS9fTEJ2pNRXm4YmrXVVNM0 wmEyVp9kTNRkuGXuXzDGU6i5myy1SavrP93On3eOy+FDblG/uZpLVHq92aa9yyXw obcm/uZoPVDq8M/93O8sl8KJ25Tv7mb5PU/q7PLzc7yyXwwbyqOVG+rzOyDV4f8A VzvLJfCid5VmjfVZnY/q6PPTXPXmS+GExeqzRvKp5XyrU7q5M/8Adbh/65L4YTv6 s2M1yjsc1cffUpzlsz7jwb+vkk2pk7G9W3RbvrTZvDBv7maMZSWpzVuealu5P12Z 914NRczTjKS1PautimOl/rsvhg39zNG1KS1Q6vOjXeWy+FEb+5mbUp7I9XnRzvLJ nDCd/czRtB6otXnRrvLJnDCdRXmYo7IdXh/1a7yyZwojUXM0HY/q72aa6ZbXHJfC hqLmYHqf1cn/AFW768yXwonUXMxHY7q5PJzW560yXwonUXMxHY7q5LJzW7y2Zwwa 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 AAAAAAAAAAAAAAAAAAAAAACDAUtf+Fpvn1+gcAYx5jAVLGd7z7vvzAcwAAAAAAAK 6qUKk1tUFdVipkqpspE+CazUWilNJUlLibDLKRLUWXbAVdTwDhGsHUjn0pp1ysOM vVFdq0G67GSSGnLUqK6tKSIrybDAa/VtS+CKnTqfR+KqYo0KbzhJiNPPkcp2ywjf dv6Q7M5GagCDqWwRTKxPqEGM6mDVoK6dVaW5IkPsym1qIyW4brqlXkpI0lZsGAtK 1q6w9Nw7NpNKiM0+S7Q5eHIEpJKsYhykJToySR+xJSUKPZ8EB8YO1Z4WwjHYciQk OVQoTcCRLcW67faQkr6Uk6pRIQpWU0oIiAc9H1Z4IoE1yoUuktsSnG1skZrdcJDT p2rQ2lxaktkduUkEQDHhapdXlPjTIkSgspjz2VRZTa3HnSNhxV9SE6RariTVlsRY AR9U2AIsefFboyDYqkdEOooW8+5p2GlGtCXDW4ZndMzsPP3bAFvVsF4XrzlReq9N blO1aE3SqipZrI3oTK3HENKsUXgkp1Z5MuUB9JwdhhKzWmlMWcRTSDTd8AoCDUpL N227dI1K2AGFStXeEaLBl02nQltwpqNE+ycmStOjI7SSm+6dwi/kWANDx+0TeuTV y02ViEQK2lJbRFGSRZTHPvR/+i39FXmex7O/puL+9a/E2bBFeo0CJFg1GY1DlRWW 47rT6iQd5lBN2lbZkO7aOhDxsS2SLPwBCqs+uRZsFqrVQmkz5RPEanijpuN3rVWe CkrMhCcUqKThzU7LpkKjrKAmDTnFvQUtSVtLZW6Zms0uNuJWV4zylesDEWpq1bqZ pMd2XDdRQ3UyKWbkg1qZeSRpJZKUszM7FH7IzDEXBYswsX9cRN+TuhiJ624X6Yib 8jdDEOtuF+mIm/I3QxDrbhfpiJvyN0MQ624X6Yib8jdDEOtuF+mIm/I3QxDrbhfp iJvyN0MQ624X6Yib8jdDEOtuF+mIm/I3QxDrbhfpiJvyN0MQ624X6Yib8jdDEOtu F+mIm/I3QxDrbhfpiJvyN0MQ624X6Yib8jdDEOtuF+mIm/I3QxDrbhfpiJvyN0MQ 624X6Yib8jdDEOtuF+mIm/I3QxDrbhfpiJvyN0MQ624X6Yib8jdDEOtuF+mIm/I3 QxDrbhfpiJvyN0MQ624X6Yib8jdDEOtuF+mIm/I3QxDrbhfpiJvyN0MQ624X6Yib 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 pvy6Yy+8poo5uOU9K1aFOZu00exLYINqnM3Fzmz4pYtWkaqK43KRVKNHkLmNKZff XTkKeNK0mgzvmg1W2HkMNqnM3Fzmz4pZVLrmr2jwWqdBjKSw1HRDvKimpa47ZWJQ tRptUktow2qczcXObPillpxbgdLhvJYsdUyUZSyh2GbCczZmSfYF7XMG1Tmbi5zZ 8UvpvGWC2lsuNNKbcjNmxHWiIaTbZO7a2gyLwUndT4JZMhbQbVOZuLnNnxShvF+C Gkx0NMXERDNUVKYd0mjVaRmgiT4NpHsBtU5m4uc2fFLK7QcNeVkbwsNqnM3Fzmz4 pVGIcU0uu09UKC5dbQopDzz5EyREz4ZERLMjMzMtgY1VU7M91bZs3Nun/jPfjk/3 dc6mS/8A8nwnlyaOR+9vDV4D3FP+uV6H/Lf7W99NP4aXdsL9Gb9QbzyjJAAAAAAA BwyD+B88178gFsAgwHhbXL/Fm53aVF9AL/y2E996hwl9DKz81y/QLFPKzXOq/wCh 0b9pnfvjogbgAxKl+gPfg/dAbeAAAAAAAAAAAAAAAAAAAAAAAAAAIMBS1/4Wm+fX 6BwBjHmMBUsZ3vPu+/MBzAAAAAAAAAAAAAAAAAAAAAAAA1DG+rvB+OUsO4npSKlI hJWmGtTjrZtk5YarNGtNtt0s417vD27kxNUY4OvwHbHF8DFUWK9iKsMe5E976Yl1 eWpTVmzIUlzDKHEW2EWllWWeqTuYU6CxzfO6nzb2r109Gn2WT2NaqM3VNs7Py8o/ /ODQWOb5z5t7V66ejT7J2Nap/wC6Te/SuGDQWOb5z5t7V66ejT7J2Nap/wC6Te/S uGDQWOb5z5t7V66ejT7J2Nap/wC6Te/SuGDQWOb5z5t7V66ejT7KexrVR/dJvfpf DBoLHN85829q9dPRp9kPU3qoPPhJvfpXDBoLHN85829q9dPRp9lHY1qn/uk3v0rh g0Fjm+c+be1euno0+ydjWqf+6Te/SuGDQWOb5z5t7V66ejT7J2Nap/7pN79K4YNB Y5vnPm3tXrp6NPsnY1qn/uk3v0rhg0Fjm+c+be1euno0+ydjWqj+6Te/S+GDQWOb 5z5t7V66ejT7IeprVP8A3TbLum9L4YNBY5vnPm3tXrp6NPsnY1qo2MJN2bH46WZn 62mDQWOb5z5t7V66ejT7IWprVQZEfVJsiPMZvyuGDQWOb5z5t7V66ejT7L67GNVH 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 A//Z ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=111.jpg Content-Type: image/jpeg; name=111.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2011/11/111.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABGAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5Njg3MTJCNDE2NjYxMUUx QkQ3M0MzOTM4NzFDNEYwQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5Njg3 MTJCNTE2NjYxMUUxQkQ3M0MzOTM4NzFDNEYwQSI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjk2ODcxMkIyMTY2NjExRTFCRDcz QzM5Mzg3MUM0RjBBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjk2ODcxMkIz MTY2NjExRTFCRDczQzM5Mzg3MUM0RjBBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ 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 gbJHNFA2SOaKBskc0UDZI5ooGyRzRQNkjmigbJHNFA2SOaKBskc0UDZI5ooGyRzR QNkjmigbJHNFA2SOaKBskc0UEFpHNHioOW7yGm/a7LR1RiUPfrJrsXKP+3U9jl3r 95I07OaEd9+UsAMOwrr8TjdeYqfzEv2YvoN1h/8AGr/xKf6It8y7obeHFgon8Irf eSg5PurI7ZkAHHCS6P8Anmg+k6DU8sx5EezNNSHkvPpdka7qG9mk4yHDoTrKw4eW gzGqeWgap5aDxlw2psR+FI8qPIbWy6nlQ4kpV8RqYRsjaOQ3HJdsMIZeztlw5gts dSVxJIiic2vU0NqU2kFSHANB0YfgNd3MITy/rOFNcJ5Z4xk+Vnsu5Xdl3iHdl282 q0WsEW+I4kNuKXq6iTs06EJSnQkVRer7GeTsQ9Taulz5Ue1H1s3b8lNwMw5uv3ph cObBEC2C3qiP6HF9G0K1vK1vncAwrkOm5hcv8ua5VutdqRmJpbNqtkK3MOzbamU4 05bnA6l6MVSBsC4UgOhOJUPyhQXUjddmvMt5z7bLjdEW/KGZJlv9NQiJrvzYse3x GnvR3tuNjrqbW0rWQ5o4KDMStzkh+ZNhMX3Y5KuF3RmCZZTECn/TEaiihEnbDBpS m0qKNkTw4K00GRg7qxGnWe6yLsqTc7ffJmYpr5YCEynpsOTD2YQHP2aUIfGrpV83 w40GLyBuVc3fy7jcbZeme0JbMlhlxi3pjNkypape1lJQ+TJdQVbNC1KTgjRQdWaD qWkJdWFuhIC1pTqBSgNJCcThieLGg0XfXj3TZx0/4ZI/VrUvn7mb2O/+Xf6lQ+3B osV1DF/yQ8+oNsoiw9ZxRwAGwSK7dzhbdf7IPN4r6L9NbvTfpdY3Xy41qyzOi3F5 uNIXmHM8tDbqwlRYmZgnyWHACfmuNOIcSeNJBrT5U+iKeZLpboL9ZsP+/wAf6RPy 1PKn0HMl0nb1m+vx/pE/LTlT6DmS6Tt6zfX4/wBIn5acqfQcyXSdvWb6/H+kT8tO VPoOZLpO3rN9fj/SJ+WnKn0HMl0nb1m+vx/pE/LTlT6DmS6Tt6zfX4/0iflpyp9B zJdJ29Zvr8f6RPy05U+g5kuk7es31+P9In5acqfQcyXSdvWb6/H+kT8tOVPoOZLp O3rN9fj/AEiflpyp9BzJdJ29Zvr8f6RPy05U+g5kuk7es31+P9In5acqfQcyXSdv Wb6/H+kT8tOVPoOZLpO3rN9fj/SJ+WnKn0HMl0nb1m+vx/pE/LTlT6DmS6Tt6zfX 4/0iflpyp9BzJdJ29Zvr8f6RPy05U+g5kuk7es31+P8ASJ+WnKn0HMl0nb1m+vx/ pE/LTlT6DmS6Tt6zfX4/0iflpyp9BzJdJ29Zvr8f6RPy05U+g5kuk7es31+P9In5 acqfQcyXSdvWb6/H+kT8tOVPoOZLpO3rN9fj/SJ+WnKn0HMl0nb1m+vx/pE/LTlT 6DmS6UG/WfDRPj/SJ+WnJn0HMl0ub5+mxJubMumG8iRqJdCtmoKw8pPDhXUukkZa U8Yws9DmXqaE1SSzS1HOX/8AuGUh/wDYrp/Mbry9T+Yk+zF9Eu39Gr/xaf6It7y9 rbJ4jiBw8JwIrfeRg5PunKzdXS5gXC+4VkDAaxWcdFEvpWg12zfZ4/iyP566DIUE Y8HLQDhhp4OOgsJN6t0R30Z97XfSNYstNrecAVzktpUR+Gg9Ys+LOQXIboeSnQvD QpJ/tA6R+GguNOAI/DQUqOIPx0EaeD8ANAPwglJ0UEjhNBNAoNV3kWGfmjIeYcvW wt9oXKG7GjbVWqjXcGA1iAcB+Cte8SRnpxlh8sHVwi9SXW+U609vZkmhGNjiE+3b 3CiDbZ+X7C4qEw2w056bIxIZSEAkhHHhUXe8XujCyWEut173dsDvM8Z5qlb9aMY/ Ul+WPte4sm9fDRlzLo0esJPmVuZnfd2TW0MqwDq1+GXansXex7u5d6/J8ymZ33dk MpwDrV+GXadi72Pd3LvX5PmUzO+7shlOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDr V+GXadi72Pd3LvX5PmUzO+7shlOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDrV+GXa di72Pd3LvX5PmUzO+7shlOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDrV+GXadi72P d3LvX5PmUzO+7shlOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDrV+GXadi72Pd3LvX 5PmUzO+7shlOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDrV+GXadi72Pd3LvX5PmUz O+7shlOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDrV+GXadi72Pd3LvX5PmUzO+7sh lOAdavwy7TsXex7u5d6/J8ymZ33dkMpwDrV+GXadi72Pd3LvX5PmUzO+7shlOAda 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 Q2twwo4iyIxS0h0t669VpjV1igayuICg9M77qL/mTPftfZrkxbSYMe1OK8tbrkMq f9KbIAAGsHElBx+cOCg1k7jMxwLRlJuP6NOXYIc+1TbSm4y7Yw5EnPa6S3JYZcWC kAJUhTWCh8FBkb1uQut4F3W1JNsRJyvaLDbIMW5TAy3ItvpOuiQpKEbZpIdQlC1p JVpJSOMLXOO47NGbZN+D0+GLXLscWHb4RW6Au6xoxjpdkEN/u28SUYYnE4kaBQdJ RlO4DeJFzaVx+zmcvu2dbesrbekuSmXwoDUw1MG1adbHHDRQavukyBnvJFxmpvNy aFgcMtTVuYmyJzbj0mW4+l4IfaaTHwQsJUhvWBOnGg67tFc7TQYqCvWzBdkHSdlF OPFoSvGg4hvUSVb0b+kcJ3bzcMPDca1qMbL7LH/D/qesj/QY/wDs/wDFFsOWLNMd jlSVq1fAdHxV76F4kfH5pZ2f7Fnc9fjNWd4kV9ifSdizuevxmneKZ2J9IbLOw+ev xmneJDsT6XN07v8AeJludmVnKyIc61ZllLuCXZsl6M5ClSG0tPEobYdDqDqhY8tG nR4a0uZ2e1CWyyb0+z+5uRsm7PajH0ej0fKwg/y9XZiVBkQrkI82y2piPZbqnW27 VyZeedWtTeGqWVh3VUnWxIJHhqvsS+j0+qHoj86znR1x9PsdWtFnzIu2xVXzZtXc tJ9NbiOLdYD35WzWtCFFJOkYprelvEtkLYQaM0kbY2R9C97Fnc9fjNZ94psexPpO xZ3PX4zTvFM7E+lPYs7T5a8ANJxNRG8SIjJPpeGXYbsXeDDDqyoqtFx+cccB6Tb/ AMdcvFKsJqcsIaXbwqEYRmt+b/q1HdV9hZi//qrz/rFeMuX1ZvtTPpf5n/f0v4FL /K7bA+z0/mn8Vb7yTh27H7el/wBW9/MNB9IUGu2b7PH8WR/PXQZCgUCgUEGgigpo FAoFAoHLhx0Hnsk4EHx8dBSWMQRrnT8HyUE7ElSipRwIAw+AYaaCrZjWxBOHJooC WkpxwJ8A4qApoFRUCQTQA2EqKkkjHi0UFrLtjM6N6PJKtXQUqScFJUNIUk8RFBZ9 i3EAJTfp2qOAFMU4fhLGNBBs10xGGYJuGOnyYvB9BQT2PdODt+bh+bF6Cgnse5cd /mn/AJMXoKAbPcuK+zf0YvQ0EdjXLWx7fm6ujABMX8P/AENAFmuesSb/ADfBgiLw fQUEps9y061/m8OjBEXg+goJ7Gn+v52P5kXoKCOxrhw+0E7H82L0FBeW+2x7eFlD i3XnTrPPukKcWrgxJAA4KDhm8y+WzLW+dN1vsWW7ZJeT12wuRIrslJfduO01VbNJ w8hB4a5tWrCleITRts7Nnq+d7u4XKe+4PGlTjL2oV+1ZNNCX0cuy30+1iLFvKyZb mtkxfs0w2AMG47Ns2qUpHAApyItWHwmtqOKy/Pqi5EfybeY9P3km1me9rKPvPm37 nb/uFM1l+fVFHwZePw/eS7Tvayl7z5t+52/7hTNZdEdUT4MvH4fvJdp3tZR9582/ c7f9wpmsuiOqJ8GXj8P3ku072co+8+bfudv+4VOay/PqifBd4/D95LtO9rKXvPm3 7nb/ALhUZrLojqifBl4/D95LtO9rKXvPm37nb/uFM1l0R1RPgy8fh+8l2ne1lL3n zb9zt/3Cmay6I6onwZePw/eS7Tvayl7z5t+52/7hTNZdEdUT4MvH4fvJdod7WUiP /M+bfudv+4UzWXRHVFPwZePw/eS7V5Zd8G7azy3bg49mC43J5AZVMmWySVhoHW1E pbZbQkY4Y6qaxmxKWb12+j5orJPyje5PVy4f+STatd0T+3ytdppadYam5hukthMh tTLhZfdC0KKFgEYg1TcY2yR+1Ff+aYQlvNOW2EYy0qcsbI2+mELIu4QVp9AAGnBJ /FXQeQcP3XLQ5e5LiDrIVKeKSOMFw0H0jQa5Zfs8fxZH89dBkaBQKBQQaCKCmgUC gUCgUCgUA0CgUCgUCgUCgUCgYgcNBGNAxFA0UDRy0DRy0DRy0FncGPSI60A6SMOG g1hmz3KOTsVEJx5KD19DuvPPioHol0558VA9EunPPioHol0558VA9EunPPioHol0 558VA9EunPPioHol0558VA9EunPPioI9DunPPJwUHmqzzpLiC8rFKTpxoNpaSGoh bxGhJBHHoHJQcL3TqSu7PLQQUKkOKSUnFJBWSMDxig+laDSX7tcbDGLCsv3GZqLd Wp2MhpTeDjiljAqcSeBXJQazM3y2q3HVuFnnxl44arpjJPxvUFr375Z+oTP0ovT0 Dv3yz9QmfpRenoHfvln6hM/Si9PQUO7+stIbUsW6YopBOqFRcTgOAft6Dz7/AHLZ /wAMnaf7UXH+fQUHf/lvXKeyrho48YuH8+gHf/lsf4VP8cXp6Dy/3hsshAc7HuWB OGrqx9Yfg22NB6f7wGW/VU/xxenoHf8A5b9VT/HF6egd/wDlv1VP8cXp6B3/AOW/ VU/xxenoHf8A5b9VT/HF6egd/wDlv1VP8cXp6B3/AOW/VU/xxenoPN7/ADC5bZaW 6bRcVhsElDfoy1nDiCUvEnGghj/MNlp9KlCz3JvVJSQ4IyDo4wFPDEeGg9e//Lfq qf44vT0Dv/y36qn+OL09A7/8t+qp/ji9PQO//Lfqqf44vT0Dv/y36qn+OL09A7/8 t+qp/ji9PQQd/wDlsrbR2TcCFq1SrGLgnQTif2/BooLrv2yuf8Pl6P7cXpqB365Y 9XzP04vT0Dv1yx6vmfpxenoHfrlj1fM/Ti9PQO/XLHq+Z+nF6egd+uWPV8z9OL09 A79Mr+rpf6UXp6B365X9Xy/0ovT0Dv1yv6vl/pRenoHfrlf1fL/Si9PQO/XK/q+X +lF6egd+uV/V8v8ASi9PQO/XK/q+X+lF6egd+uV/V8v9KL09A79cr+r5f6UXp6B3 65X9Xy/0ovT0Dv1yv6vl/pRenoHfrlf1fL/Si9PQO/XK/q+X+lF6eguYe+zKctzZ vRn46DjitxcZKcMP4xoNQ3XR19tSFR0a0YyXS0tOlJQXDgUnjBHBQfR2C+aaC8Wl stqCyNTDyseDDw0HJ86ZZyhNfDki6wI69bHUekstnH/lKFBqnsZkv15auux/PoHs Zkv15auux/PoHsZkv15auux/PoIOTMlcd8tXXY/n0D2MyVj9uWrH+tjY/r0AZMyX j9uWvrsbz6CTk3JXHfLV12N59BHsZknjvlq67H4f06B7GZK9eWrrsfz6B7GZK9eW rrsfz6B7GZK9eWrrsfz6B7GZK9eWrrsfz6B7GZK9eWrrsfz6B7GZK9eWrrsfz6B7 GZK9eWrrsfz6B7GZJ0f/AFy1aP8A42Nyfn0AZMyRxXy1ddjefQPYzJXry1ddj+fQ PYzJXry1ddj+fQPYzJXry1ddj+fQPYzJXry1ddj+fQPYzJXry1ddj+fQPYzJXry1 ddj+fQPYzJOBxvlqw4/9NjefQBkzJWGi+Wrrsfz6CfYzJfry1ddj+fQPYzJfry1d dj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYz Jfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj +fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQPYzJf ry1ddj+fQPYzJfry1ddj+fQPYzJfry1ddj+fQQcm5L475auXTMj+fQdLyRZst25p PoE6LKcw0bB5t39Qmg3rFPJQf//Z ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=121.jpg Content-Type: image/jpeg; name=121.jpg Content-Location: http://help.netbynet.ru/wp-content/uploads/2011/11/121.jpg Content-Transfer-Encoding: Base64 /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABGAAD/ 4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAg ICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0 PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1s bnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5z OnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy Y2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2lu ZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBN0VFRUI4QzE2NjYxMUUx QTE4QjlEMjY2REIyNzc1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBN0VF RUI4RDE2NjYxMUUxQTE4QjlEMjY2REIyNzc1MCI+IDx4bXBNTTpEZXJpdmVkRnJv bSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE3RUVFQjhBMTY2NjExRTFBMThC OUQyNjZEQjI3NzUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE3RUVFQjhC MTY2NjExRTFBMThCOUQyNjZEQjI3NzUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8 L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFk b2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ CQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU /8AAEQgCZQK/AwERAAIRAQMRAf/EAMYAAQACAwEBAQAAAAAAAAAAAAABBAMFBgIH CAEBAQEBAQEBAQEAAAAAAAAAAAECAwQFBgcIEAAABQICBAUMDQgFCQcEAgMAAQID BBEFEgYhMRMHQVEUFRZhkdEiUpLSk7NUlFVxgTIzU3PTNHTUdTYXobEjQzWVVghC YnJjV8GCJES0JUVGN/CissKDZITho2Um8aTDxCcRAQABAgQEBgICAgMBAQAAAAAB EQIxURIDITITBEFhkVIUBXGBoULwwdEiBnIj/9oADAMBAAIRAxEAPwD9B7vsh5TL KtruFytka4TrhGaluuzGkSDrIQS6FtCOhFWmgXU9W7u3apiJpTJYzErc7lJLScxW +zwXHNLaFQmnHFF1EIbUr8gxO5FvjQ2rd7c5YmVjL8LdJmqKuVl22Wacwk8Lmzhs Yk/2kqbJRe2QsX1wlN2N3bml1bW3VknIiEVVlu1EkiMzUcKPTDrOtUUoQ1MzjVy6 l0eMuUXdNxaJhwFxbIT5L2ZmUFs2yXWlNoTWCtf6w83y9uLtOri7xZv0rETR1beT MhuoS41l20qbWVUqKHHMjI+GpIHp1S4TffnKpccu7trSzt7jYrRGZM6Eo4bFVHxE RIqftBqk135yr2y2brby4tm3We1OSCKptHCabXTjwrbSYapTXfnLbFkvJNPu3bPb hMeCGqTqXZydCskn/wAt2z0JjwA1Sa7s5QeScj8OW7ZX6Ex4AVnM6l+co6E5G/hu 2ehMeALWc5Nd2cp6EZGP/ly2ehMeAEXTnJrnOToPkb+HLZ6Ex4Auuc5SbpzQeR8j fw1a1ezCY8ANd2cpqlHQfIx/8s2rR/7JjwBOpfnK6pOg+RFaDyzatH/smPAF13Zy mqToNkTgyzavQmPAF13Zz6mqU9CcjaujVrL2ITHgCa7s59StQsk5H4MuWz0Jgv8A yCdS/OSXroXknV0ctnobHgC9S/OUR0JyPw5ctnoTHgC67s59Q6EZG/hy2ehMeAGu 7OQ6EZG/hy2ehMeAGu7OQPI+Rv4cth9TkTHgBruzn1HnoRkU9HRi1ehMeAHVuzn1 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 wI46SIiqalgPmFo355jtGW8pZ8zfOI8puyrvZMzOrZjpWl9h51MKUo2SwpUZsEyt LasBqcqXAAz3O973Ctm765Tc4zbLcM5XNEa6WpiDanG4TMuNLnIabORDcXtGSbbZ NS1HXCZ69IDG7vE3tTM/3Wx2Bc2bHytOhwn45tWlEeVGcbSp6RKU6Tb6VKxGpvky UIpooZgPGct92e7KzvEbt8GY+VkuDMe13hpqCcSI04lJml1LjqXVa9eyUA6d+bnz 8ZWsrt56uCMuPWqRfeRFCtJ0UxNjslGJaoRr2RodMjPFj1dsA4z8c89T50e2WmS2 srdnCdacxXBbDRkiEVykx4cJBEnCS9i2la10xEWE69sYDWX/ADJm7NucMv3xWaOa Fx71fYduiNRYiytyIMehbQ3kLNa1kXb46l3JEA35b9s4JXlVhom5V5zHl6e5braT aUNyrwxNZjNPmZVUlkmzW6siOhIqdNACq7vzz5Ycp7ur1LQ7f512t1+fvjMSOy1y h624Ni6pKcKm2kGZqcJmqsOpKj0ANznXeXfrTliBzVmybOzOVkezA49aIVrVEfZL EaXXjmkRJj4iNBJZVtTLjMBurHvQzJdLvLbXISiEnJ7N7YZJtuiZ7hFVZKw4jL+q ZmXUAc+9vtzPardu0lvq5wuWarG88u3IQ2g514WiOUdJGlPaJNbhmvDRKU1M9BAN ba9+GdrRl3IczMstF1vd3lZmt05mMw2wmfPttxOHCbbJKTNCa6DpqTVSq0AfTdzG c8zZgyWc7OspuTmBu53CE+8y2hhr/RpK20IQlNPckVOMwH0M7tHTiM3CIkaFmaiI iPiPToP2QHvnAuI/bAa3ME412C6pItcOTXTxtKIBq4BUgxuLZI6+EgFoAAAAAAAA B4d97X7BgLcLTCjn/dN/mIBYAfAv5jv2vkH6VcPINixhI7bKP3MvX2bL8gsQdRkj 7mZe+zofkEgN+Arv++QvpcfyhAOsAAAAAAAAAAAAAAAAAAAAAAAAAAABo7985tvx rnklAK4DVR/13xzvlFAMoAAAAAAAAAAAAAAAAAAAAAAAPKuD84DTW28QrG7PiXRa o21lOSWXDQpSFpdItBGkj0lQBf6X5aM9M4jLqtO+AA0yVbt02VzLexilYXlLcetx RllHUt1031maMFO2cM1n1QGvu1k3PXyau5Xa2QJk9xpEdyQ9EWtamm6ElJmaP6JE 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 eLz40uwFYyDke+L+Obz40uwGryDke+L+OLz40uwGryEci3x/x1ei/wDVLsC6oyDk W+T+Or140uwGqMkDhb5P46vXjS7AaoyKI5Dvl/ju9eNLsC6oyKIODvl/jy9eNLsB qjIocg3zfx5ei9h0uwGqMihyDfN/Ht78aXYDVGRQ5Dvm/j29eNLsBqjIoHA3zH/z 7e/Gl2A1RkURzfvm/j69+NLsBqjIoc375v4+vfjS7AaoyKHN++b+Pb340uwGqMij wq276D1Z/vaS6jpdgNUZFHnmrfR/iDfPGl2A1RkUQdq30/4hXzxpdgNUZFDmnfT/ AIhXzxpdgNcZFE81b6f8Q7741PYDVGRQ5q30/wCId98ansBqjIojmnfT/iFfPGp7 Aa4yKHNO+n/EK+eNT2A1xkUOaN9P+Id98ansBrjIpJzTvq/xDvnjU9gNcZFJOad9 f+Id88ansBrjIpKOad9f+Id88ansBqjIonmnfX/iHfPGp7AaoySk5o5p32f4iXzx pdgNUZGnzOad9n+Il88ansBqjI0+ZzTvs/xEvnjU9gNUZGnzOad9n+Il88aXYDVG Rp80c077P8RL54xPYDVGSafM5o32/wCIt88YnsBqjI0+ZzRvs/xFvvjE9gNUZGnz OZ99n+It98YnsBqjI0+aOZ99n+It98YnsBqjJdPmcz77P8Rb74xPYDVGRp8zmffZ /iLffGJ7AaoyNPmcz77P8Rr74xPYDVGRp8zmffb/AIjX3xiewGqMk0+ZzPvt/wAR r74xPYDVGRp8zmffb/iNffGJ7AaoyXT5nM++z/Ea++MT2A1RkUnM5m32/wCI198Y nsBqjI0+aeZ99f8AiLffGJ7AuuMk0+aStO+vh3iXynxiewGu32waZzUbJuuzNIzc zmC+3mXd55pUg3pZ41UV1RbtyttKGnjV+scuZblRco3RlajI3oMhpJGWmq2VJ/yj i2+ocOgBz+Y+Y9gfOZkWnTQiNX5aAOVpkju196jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tfeI8IApkju194jwgCmSO7X3iPCAKZI7tfeI8IAp kju194jwgCmSO7X3iPCAKZI7tXeo8IBagFk3lLewVVyujElJf5QHcp5PyXtacmwn WmrDTSA//9k= ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=scripts.js Content-Type: text/javascript; name=scripts.js Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/js/scripts.js?ver=1.0.0 Content-Transfer-Encoding: 8bit // DOM Ready $(function() { // SVG fallback // toddmotto.com/mastering-svg-use-for-a-retina-web-fallbacks-with-png-script#update if (!Modernizr.svg) { var imgs = document.getElementsByTagName('img'); var dotSVG = /.*\.svg$/; for (var i = 0; i != imgs.length; ++i) { if(imgs[i].src.match(dotSVG)) { imgs[i].src = imgs[i].src.slice(0, -3) + "png"; } } } }); ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=metanormalcyr-roman-webfont.svg Content-Type: image/svg+xml; name=metanormalcyr-roman-webfont.svg Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/fonts/metanormalcyr-roman-webfont.svg Content-Transfer-Encoding: 8bit ------------VIkciIu2gJEL5dl14ihIzo Content-Disposition: inline; filename=daxline_pos_lf_regular-webfont.svg Content-Type: image/svg+xml; name=daxline_pos_lf_regular-webfont.svg Content-Location: http://help.netbynet.ru/wp-content/themes/nbn-help-new/fonts/daxline_pos_lf_regular-webfont.svg Content-Transfer-Encoding: 8bit ------------VIkciIu2gJEL5dl14ihIzo--