<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.0">
    <Name>Collaboration</Name>
    <Version>6.5.0</Version>
    <Framework>6.5.x</Framework>
    <Vendor>wolkig.it - Stephan Lang</Vendor>
    <URL>https://wolkig.it</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <Description Lang="en">Microsoft 365 collaboration integration for Znuny - Avatar, Presence, Teams Chat/Call/Meeting</Description>
    <Description Lang="de">Microsoft 365 Kollaborations-Integration fuer Znuny - Avatar, Presence, Teams Chat/Anruf/Meeting</Description>

    <ChangeLog Version="6.5.0" Date="2026-09-20">
        Initial release for Znuny 6.5.x, ported from the 7.2.x line: Microsoft 365 avatar, presence and hover-card info for agents/customers, Teams chat/call deep links, and a meeting scheduler with Free/Busy lookup. Fixes the Ticket Information widget field-replacement selector for 6.5.x's markup (fields are flat siblings in one shared fieldset, unlike 7.x's per-field wrappers), a timezone conversion bug in appointment creation, and Teams chat deep links missing the required tenantId parameter.
    </ChangeLog>

    <Filelist>
        <!-- Configuration -->
        <File Permission="660" Location="Kernel/Config/Files/XML/Collaboration.xml" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTWFzdGVyIFN3aXRjaCAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFzdGVyIHN3aXRjaCBmb3IgdGhlIENvbGxhYm9yYXRpb24gYWRkLW9uLiBXaGVuIGRpc2FibGVkLCBubyBDb2xsYWJvcmF0aW9uIEphdmFTY3JpcHQgaXMgaW5pdGlhbGl6ZWQgYW5kIG5vIHBlci1wYWdlIGRhdGEgKHRpY2tldCBvd25lciwgY3VzdG9tZXIsIGFnZW50IGVtYWlsKSBpcyBnYXRoZXJlZCBvciBpbmplY3RlZCBpbnRvIHRoZSBwYWdlIC0gdGhlIGFkZC1vbiBiZWNvbWVzIGNvbXBsZXRlbHkgaW5lcnQgd2l0aG91dCBuZWVkaW5nIHRvIGJlIHVuaW5zdGFsbGVkLiBUbyBhbHNvIHN0b3AgdGhlIGFkZC1vbidzIEpTL0NTUyBmaWxlcyB0aGVtc2VsdmVzIGZyb20gYmVpbmcgbG9hZGVkIG9uIGV2ZXJ5IHBhZ2UsIGFkZGl0aW9uYWxseSBzZXQgTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMjIyMxMDAtQ29sbGFib3JhdGlvbiBhbmQgTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTIyMjMTAwLUNvbGxhYm9yYXRpb24gdG8gaW52YWxpZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFByb3ZpZGVyIFNlbGVjdGlvbiAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OlByb3ZpZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNlbGVjdCB0aGUgY29sbGFib3JhdGlvbiBwcm92aWRlciB0byB1c2UuIE0zNjUgPSBNaWNyb3NvZnQgMzY1LCBabnVueSA9IExvY2FsIGRhdGEgb25seSAoYXZhdGFycyB3aXRoIGluaXRpYWxzLCBwcm9maWxlIGZyb20gQ3VzdG9tZXJVc2VyL1VzZXIpLCBNb2NrID0gVGVzdC9EZXZlbG9wbWVudCBtb2RlIHdpdGggc3RhdGljIGRhdGEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9Ik0zNjUiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJNMzY1IiBUcmFuc2xhdGFibGU9IjEiPk1pY3Jvc29mdCAzNjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlpudW55IiBUcmFuc2xhdGFibGU9IjEiPlpudW55IChMb2NhbCBEYXRhIE9ubHkpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJNb2NrIiBUcmFuc2xhdGFibGU9IjEiPk1vY2sgKERldmVsb3BtZW50L1Rlc3RpbmcpPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpGYWxsYmFja1Byb3ZpZGVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZhbGxiYWNrIHByb3ZpZGVyIHdoZW4gcHJpbWFyeSBwcm92aWRlciBmYWlscyB0byByZXR1cm4gZGF0YSAoZS5nLiwgdXNlciBub3QgZm91bmQgaW4gTTM2NSkuIFpudW55IHVzZXMgbG9jYWwgQ3VzdG9tZXJVc2VyL1VzZXIgZGF0YS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iWm51bnkiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJabnVueSIgVHJhbnNsYXRhYmxlPSIxIj5abnVueSAoTG9jYWwgRGF0YSBPbmx5KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iIiBUcmFuc2xhdGFibGU9IjEiPk5vbmUgKE5vIEZhbGxiYWNrKTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIE1pY3Jvc29mdCAzNjUgUHJvdmlkZXIgU2V0dGluZ3MgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTo6VGVuYW50SUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWljcm9zb2Z0IEVudHJhIElEIChBenVyZSBBRCkgVGVuYW50IElELiBSZXF1aXJlZCBmb3IgTTM2NSBwcm92aWRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5bMC05YS1mQS1GLV0qJCI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iQ29sbGFib3JhdGlvbjo6UHJvdmlkZXI6Ok0zNjU6OkNsaWVudElEIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1pY3Jvc29mdCBFbnRyYSBJRCBBcHAgUmVnaXN0cmF0aW9uIENsaWVudCBJRC4gUmVxdWlyZWQgZm9yIE0zNjUgcHJvdmlkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeWzAtOWEtZkEtRi1dKiQiPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpSZWRpcmVjdFVSSSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PQXV0aCBSZWRpcmVjdCBVUkkuIFVzdWFsbHkgeW91ciBabnVueSBiYXNlIFVSTC4gTXVzdCBtYXRjaCB0aGUgUmVkaXJlY3QgVVJJIGNvbmZpZ3VyZWQgaW4gRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBGZWF0dXJlIFRvZ2dsZXMgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpFbmFibGVBdmF0YXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIGF2YXRhciAocHJvZmlsZSBwaWN0dXJlKSBkaXNwbGF5IGZyb20gY29sbGFib3JhdGlvbiBwcm92aWRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkZlYXR1cmVzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZVByZXNlbmNlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZSBwcmVzZW5jZSAob25saW5lIHN0YXR1cykgaW5kaWNhdG9yIG9uIGF2YXRhcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpGZWF0dXJlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpFbmFibGVIb3ZlckNhcmRzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZSBob3ZlciBjYXJkcyAocGVyc29uIGNhcmRzKSB3aXRoIGRldGFpbGVkIGNvbnRhY3QgaW5mb3JtYXRpb24gd2hlbiBob3ZlcmluZyBvdmVyIGF2YXRhcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpGZWF0dXJlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpFbmFibGVDaGF0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZSBjaGF0IGxpbmtzIChUZWFtcyBjaGF0IGRlZXAtbGlua3MpIGluIGhvdmVyIGNhcmRzIGFuZCB0aWNrZXQgem9vbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkZlYXR1cmVzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZUNhbGwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIGNhbGwgbGlua3MgKFRlYW1zIGNhbGwgZGVlcC1saW5rcykgaW4gaG92ZXIgY2FyZHMgYW5kIHRpY2tldCB6b29tLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6RmVhdHVyZXM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iQ29sbGFib3JhdGlvbjo6RW5hYmxlTWVldGluZ3MiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIG1lZXRpbmcgc2NoZWR1bGVyIHdpdGggZnJlZS9idXN5IGxvb2t1cCBhbmQgVGVhbXMgbWVldGluZyBjcmVhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkZlYXR1cmVzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZU93bmVySW5mb1BhbmVsIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgb3duZXIgaW5mbyBwYW5lbCAoYXZhdGFyLCBvdXQtb2Ytb2ZmaWNlIHN0YXR1cywgZnJlZS9idXN5IGNhbGVuZGFyKSB3aGVuIHNlbGVjdGluZyBhIHRpY2tldCBvd25lciBpbiBBZ2VudFRpY2tldE93bmVyLCBBZ2VudFRpY2tldFBob25lLCBldGMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpGZWF0dXJlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTWVldGluZyBTY2hlZHVsZXIgU2V0dGluZ3MgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpRdWV1ZUNhbGVuZGFyTWFwcGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYXBwaW5nIG9mIHF1ZXVlcyB0byBabnVueSBjYWxlbmRhcnMgZm9yIG1lZXRpbmcgYXBwb2ludG1lbnRzLiBTdWItcXVldWVzIGluaGVyaXQgdGhlIGNhbGVuZGFyIG9mIHRoZWlyIHBhcmVudCBxdWV1ZSB1bmxlc3MgdGhleSBoYXZlIHRoZWlyIG93biBtYXBwaW5nLiBFeGFtcGxlOiBRdWV1ZSAiSVQiIG1hcHMgdG8gIklULUNhbGVuZGFyIiwgdGhlbiAiSVQ6OkhhcmR3YXJlIiBhbmQgIklUOjpTb2Z0d2FyZSIgd2lsbCBhbHNvIHVzZSAiSVQtQ2FsZW5kYXIiIHVubGVzcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgb3RoZXJ3aXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6TWVldGluZ3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVQtUXVldWUiPkt1bmRlbiBNZWV0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWlzYyI+RGVmYXVsdCBDYWxlbmRhcjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFVJIFNldHRpbmdzIC0gV2hlcmUgdG8gc2hvdyBjb2xsYWJvcmF0aW9uIGZlYXR1cmVzIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iQ29sbGFib3JhdGlvbjo6U2hvd0luSGVhZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgbG9nZ2VkLWluIGFnZW50IGF2YXRhciBhbmQgbG9naW4gYnV0dG9uIGluIHRoZSBoZWFkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpVSTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpTaG93SW5UaWNrZXRJbmZvIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgYXZhdGFycyBmb3IgdGlja2V0IG93bmVyIGFuZCBjdXN0b21lciBpbiB0aGUgdGlja2V0IGluZm8gc2lkZWJhci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlVJPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OlNob3dJbkFydGljbGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgYXZhdGFyIGZvciBhcnRpY2xlIHNlbmRlciBpbiBhcnRpY2xlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpVSTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpTaG93Q3VzdG9tZXJJbmZvV2lkZ2V0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgZW5oYW5jZWQgY3VzdG9tZXIgaW5mb3JtYXRpb24gd2lkZ2V0IGluIHRpY2tldCB6b29tIHNpZGViYXIgd2l0aCBhdmF0YXIsIHByZXNlbmNlLCBhbmQgcXVpY2sgYWN0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlVJPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkhpZGVOYXRpdmVDdXN0b21lckluZm8iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SGlkZSB0aGUgbmF0aXZlIFpudW55IEN1c3RvbWVyIEluZm9ybWF0aW9uIHdpZGdldCB3aGVuIENvbGxhYm9yYXRpb24gQ3VzdG9tZXJJbmZvIHdpZGdldCBpcyBlbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6VUk8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIENhY2hpbmcgU2V0dGluZ3MgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpDYWNoZTo6QXZhdGFyVFRMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBhdmF0YXIgaW1hZ2VzLiBEZWZhdWx0OiAzNjAwICgxIGhvdXIpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6Q2FjaGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjM2MDA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpDYWNoZTo6UHJlc2VuY2VUVEwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgY2FjaGVkIHByZXNlbmNlIHN0YXR1cy4gRGVmYXVsdDogNjAgKDEgbWludXRlKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkNhY2hlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5cZCskIj42MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkNhY2hlOjpQcm9maWxlVFRMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBwcm9maWxlIGRhdGEuIERlZmF1bHQ6IDg2NDAwICgyNCBob3VycykuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpDYWNoZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeXGQrJCI+ODY0MDA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTGlua09iamVjdCBDb25maWd1cmF0aW9uIC0gRGVmaW5lIGFuZCBhbGxvdyBDb2xsYWJvcmF0aW9uIGxpbmsgdHlwZSAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDwhLS0gRGVmaW5lIHRoZSBDb2xsYWJvcmF0aW9uIGxpbmsgdHlwZSAocmVxdWlyZWQgZm9yIFR5cGVMaXN0KSAtLT4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNDb2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpbmsgdHlwZSAnQ29sbGFib3JhdGlvbicgZm9yIGxpbmtpbmcgdGlja2V0cyB3aXRoIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBjcmVhdGVkIHZpYSB0aGUgQ29sbGFib3JhdGlvbiBBZGQtb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q29sbGFib3JhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Db2xsYWJvcmF0aW9uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tIEFsbG93IENvbGxhYm9yYXRpb24gbGlua3MgYmV0d2VlbiBBcHBvaW50bWVudCBhbmQgVGlja2V0IC0tPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjOTEwMC1Db2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIkNvbGxhYm9yYXRpb24iIHR5cGUgbGluayAoZm9yIENvbGxhYm9yYXRpb24gQWRkLW9uIG1lZXRpbmdzKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+QXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Q29sbGFib3JhdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIE91dHB1dCBGaWx0ZXIgUmVnaXN0cmF0aW9uIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyQ29udGVudCMjI091dHB1dEZpbHRlckNvbGxhYm9yYXRpb25Jbml0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkluamVjdHMgY29sbGFib3JhdGlvbiBpbml0aWFsaXphdGlvbiBKYXZhU2NyaXB0IGludG8gYWxsIGFnZW50IHBhZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpPdXRwdXRGaWx0ZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6RmlsdGVyQ29udGVudDo6Q29sbGFib3JhdGlvbkluaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRlbXBsYXRlcyI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSGVhZGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIEFKQVggTW9kdWxlIFJlZ2lzdHJhdGlvbiAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudENvbGxhYm9yYXRpb25BSkFYIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFKQVggZW5kcG9pbnQgZm9yIENvbGxhYm9yYXRpb24gZGF0YSAoY3VzdG9tZXIgdGlja2V0IGNvdW50LCBjdXN0b21lciBkYXRhKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNvbGxhYm9yYXRpb24gQUpBWCBCYWNrZW5kPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5Db2xsYWJvcmF0aW9uQUpBWDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT51c2VyczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTG9hZGVyIENvbmZpZ3VyYXRpb24gLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6OkFnZW50OjpDb21tb25KUyMjIzEwMC1Db2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZSAoQ29sbGFib3JhdGlvbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnRoaXJkcGFydHkvbXNhbC1icm93c2VyLTQuMjcuMC9tc2FsLWJyb3dzZXIubWluLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2suanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NS5qczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueS5qczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSS5qczwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6QWdlbnQ6OkNvbW1vbkNTUyMjIzEwMC1Db2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgQ1NTIGZpbGVzIHRvIGFsd2F5cyBiZSBsb2FkZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UgKENvbGxhYm9yYXRpb24pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkNvbGxhYm9yYXRpb24uY3NzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cgo8L290cnNfY29uZmlnPgo=</File>

        <!-- Language Files -->
        <File Permission="660" Location="Kernel/Language/de_Collaboration.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0NvbGxhYm9yYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFN5c0NvbmZpZyBEZXNjcmlwdGlvbnMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgdGhlIGNvbGxhYm9yYXRpb24gcHJvdmlkZXIgdG8gdXNlLiBNMzY1ID0gTWljcm9zb2Z0IDM2NSwgTW9jayA9IFRlc3QvRGV2ZWxvcG1lbnQgbW9kZSB3aXRoIHN0YXRpYyBkYXRhLid9ID0KICAgICAgICAnV8OkaGxlbiBTaWUgZGVuIEtvbGxhYm9yYXRpb25zLVByb3ZpZGVyLiBNMzY1ID0gTWljcm9zb2Z0IDM2NSwgTW9jayA9IFRlc3QtL0VudHdpY2tsdW5nc21vZHVzIG1pdCBzdGF0aXNjaGVuIERhdGVuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9jayAoRGV2ZWxvcG1lbnQvVGVzdGluZyknfSA9ICdNb2NrIChFbnR3aWNrbHVuZy9UZXN0KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWNyb3NvZnQgMzY1J30gPSAnTWljcm9zb2Z0IDM2NSc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWljcm9zb2Z0IEVudHJhIElEIChBenVyZSBBRCkgVGVuYW50IElELiBSZXF1aXJlZCBmb3IgTTM2NSBwcm92aWRlci4nfSA9CiAgICAgICAgJ01pY3Jvc29mdCBFbnRyYSBJRCAoQXp1cmUgQUQpIFRlbmFudCBJRC4gRXJmb3JkZXJsaWNoIGbDvHIgTTM2NSBQcm92aWRlci4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pY3Jvc29mdCBFbnRyYSBJRCBBcHAgUmVnaXN0cmF0aW9uIENsaWVudCBJRC4gUmVxdWlyZWQgZm9yIE0zNjUgcHJvdmlkZXIuJ30gPQogICAgICAgICdNaWNyb3NvZnQgRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbiBDbGllbnQgSUQuIEVyZm9yZGVybGljaCBmw7xyIE0zNjUgUHJvdmlkZXIuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPQXV0aCBSZWRpcmVjdCBVUkkuIFVzdWFsbHkgeW91ciBabnVueSBiYXNlIFVSTC4gTXVzdCBtYXRjaCB0aGUgUmVkaXJlY3QgVVJJIGNvbmZpZ3VyZWQgaW4gRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbi4nfSA9CiAgICAgICAgJ09BdXRoIFJlZGlyZWN0IFVSSS4gTm9ybWFsZXJ3ZWlzZSBJaHJlIFpudW55LUJhc2lzLVVSTC4gTXVzcyBtaXQgZGVyIFJlZGlyZWN0IFVSSSBpbiBkZXIgRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbiDDvGJlcmVpbnN0aW1tZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGUgYXZhdGFyIChwcm9maWxlIHBpY3R1cmUpIGRpc3BsYXkgZnJvbSBjb2xsYWJvcmF0aW9uIHByb3ZpZGVyLid9ID0KICAgICAgICAnQXZhdGFyIChQcm9maWxiaWxkKSB2b20gS29sbGFib3JhdGlvbnMtUHJvdmlkZXIgYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGUgcHJlc2VuY2UgKG9ubGluZSBzdGF0dXMpIGluZGljYXRvciBvbiBhdmF0YXJzLid9ID0KICAgICAgICAnUHLDpHNlbnogKE9ubGluZS1TdGF0dXMpIEluZGlrYXRvciBhdWYgQXZhdGFyZW4gYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGUgaG92ZXIgY2FyZHMgKHBlcnNvbiBjYXJkcykgd2l0aCBkZXRhaWxlZCBjb250YWN0IGluZm9ybWF0aW9uIHdoZW4gaG92ZXJpbmcgb3ZlciBhdmF0YXJzLid9ID0KICAgICAgICAnSG92ZXItQ2FyZHMgKFBlcnNvbmVua2FydGVuKSBtaXQgZGV0YWlsbGllcnRlbiBLb250YWt0aW5mb3JtYXRpb25lbiBiZWltIMOcYmVyZmFocmVuIHZvbiBBdmF0YXJlbiBhbnplaWdlbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZSBjaGF0IGxpbmtzIChUZWFtcyBjaGF0IGRlZXAtbGlua3MpIGluIGhvdmVyIGNhcmRzIGFuZCB0aWNrZXQgem9vbS4nfSA9CiAgICAgICAgJ0NoYXQtTGlua3MgKFRlYW1zLUNoYXQgRGVlcC1MaW5rcykgaW4gSG92ZXItQ2FyZHMgdW5kIFRpY2tldC1ab29tIGFuemVpZ2VuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlIGNhbGwgbGlua3MgKFRlYW1zIGNhbGwgZGVlcC1saW5rcykgaW4gaG92ZXIgY2FyZHMgYW5kIHRpY2tldCB6b29tLid9ID0KICAgICAgICAnQW5ydWYtTGlua3MgKFRlYW1zLUFucnVmIERlZXAtTGlua3MpIGluIEhvdmVyLUNhcmRzIHVuZCBUaWNrZXQtWm9vbSBhbnplaWdlbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZSBtZWV0aW5nIHNjaGVkdWxlciB3aXRoIGZyZWUvYnVzeSBsb29rdXAgYW5kIFRlYW1zIG1lZXRpbmcgY3JlYXRpb24uJ30gPQogICAgICAgICdNZWV0aW5nLVNjaGVkdWxlciBtaXQgRnJlaS9HZWJ1Y2h0LUFiZnJhZ2UgdW5kIFRlYW1zLU1lZXRpbmctRXJzdGVsbHVuZyBha3RpdmllcmVuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvd25lciBpbmZvIHBhbmVsIChhdmF0YXIsIG91dC1vZi1vZmZpY2Ugc3RhdHVzLCBmcmVlL2J1c3kgY2FsZW5kYXIpIHdoZW4gc2VsZWN0aW5nIGEgdGlja2V0IG93bmVyIGluIEFnZW50VGlja2V0T3duZXIsIEFnZW50VGlja2V0UGhvbmUsIGV0Yy4nfSA9CiAgICAgICAgJ0Jlc2l0emVyLUluZm8tUGFuZWwgYW56ZWlnZW4gKEF2YXRhciwgQWJ3ZXNlbmhlaXRzc3RhdHVzLCBGcmVpL0dlYnVjaHQtS2FsZW5kZXIpIGJlaSBkZXIgQXVzd2FobCBlaW5lcyBUaWNrZXQtQmVzaXR6ZXJzIGluIEFnZW50VGlja2V0T3duZXIsIEFnZW50VGlja2V0UGhvbmUsIGV0Yy4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgbG9nZ2VkLWluIGFnZW50IGF2YXRhciBhbmQgbG9naW4gYnV0dG9uIGluIHRoZSBoZWFkZXIuJ30gPQogICAgICAgICdBdmF0YXIgZGVzIGFuZ2VtZWxkZXRlbiBBZ2VudGVuIHVuZCBMb2dpbi1CdXR0b24gaW0gSGVhZGVyIGFuemVpZ2VuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhdmF0YXJzIGZvciB0aWNrZXQgb3duZXIgYW5kIGN1c3RvbWVyIGluIHRoZSB0aWNrZXQgaW5mbyBzaWRlYmFyLid9ID0KICAgICAgICAnQXZhdGFyZSBmw7xyIFRpY2tldC1CZXNpdHplciB1bmQgS3VuZGUgaW4gZGVyIFRpY2tldC1JbmZvLVNpZGViYXIgYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGF2YXRhciBmb3IgYXJ0aWNsZSBzZW5kZXIgaW4gYXJ0aWNsZSB2aWV3Lid9ID0KICAgICAgICAnQXZhdGFyIGRlcyBBcnRpa2VsLUFic2VuZGVycyBpbiBkZXIgQXJ0aWtlbGFuc2ljaHQgYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGNvbGxhYm9yYXRpb24gYWN0aW9ucyB3aWRnZXQgaW4gdGlja2V0IHpvb20gKGNoYXQsIGNhbGwsIG1lZXRpbmcgYnV0dG9ucykuJ30gPQogICAgICAgICdLb2xsYWJvcmF0aW9ucy1Ba3Rpb25zLVdpZGdldCBpbSBUaWNrZXQtWm9vbSBhbnplaWdlbiAoQ2hhdCwgQW5ydWYsIE1lZXRpbmcgQnV0dG9ucykuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciBjYWNoZWQgYXZhdGFyIGltYWdlcy4gRGVmYXVsdDogMzYwMCAoMSBob3VyKS4nfSA9CiAgICAgICAgJ0xlYmVuc2RhdWVyIChpbiBTZWt1bmRlbikgZsO8ciBnZWNhY2h0ZSBBdmF0YXItQmlsZGVyLiBTdGFuZGFyZDogMzYwMCAoMSBTdHVuZGUpLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgY2FjaGVkIHByZXNlbmNlIHN0YXR1cy4gRGVmYXVsdDogNjAgKDEgbWludXRlKS4nfSA9CiAgICAgICAgJ0xlYmVuc2RhdWVyIChpbiBTZWt1bmRlbikgZsO8ciBnZWNhY2h0ZW4gUHLDpHNlbnotU3RhdHVzLiBTdGFuZGFyZDogNjAgKDEgTWludXRlKS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBwcm9maWxlIGRhdGEuIERlZmF1bHQ6IDg2NDAwICgyNCBob3VycykuJ30gPQogICAgICAgICdMZWJlbnNkYXVlciAoaW4gU2VrdW5kZW4pIGbDvHIgZ2VjYWNodGUgUHJvZmlsZGF0ZW4uIFN0YW5kYXJkOiA4NjQwMCAoMjQgU3R1bmRlbikuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmplY3RzIGNvbGxhYm9yYXRpb24gaW5pdGlhbGl6YXRpb24gSmF2YVNjcmlwdCBpbnRvIGFsbCBhZ2VudCBwYWdlcy4nfSA9CiAgICAgICAgJ0bDvGd0IEtvbGxhYm9yYXRpb25zLUluaXRpYWxpc2llcnVuZ3MtSmF2YVNjcmlwdCBpbiBhbGxlIEFnZW50ZW4tU2VpdGVuIGVpbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZSAoQ29sbGFib3JhdGlvbikuJ30gPQogICAgICAgICdMaXN0ZSBkZXIgSlMtRGF0ZWllbiwgZGllIGltbWVyIGbDvHIgZGFzIEFnZW50ZW4tSW50ZXJmYWNlIGdlbGFkZW4gd2VyZGVuIChDb2xsYWJvcmF0aW9uKS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgQ1NTIGZpbGVzIHRvIGFsd2F5cyBiZSBsb2FkZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UgKENvbGxhYm9yYXRpb24pLid9ID0KICAgICAgICAnTGlzdGUgZGVyIENTUy1EYXRlaWVuLCBkaWUgaW1tZXIgZsO8ciBkYXMgQWdlbnRlbi1JbnRlcmZhY2UgZ2VsYWRlbiB3ZXJkZW4gKENvbGxhYm9yYXRpb24pLic7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBVSSBTdHJpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBMb2dpbi9Mb2dvdXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvZ2luIHdpdGggTWljcm9zb2Z0J30gPSAnTWl0IE1pY3Jvc29mdCBhbm1lbGRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2dvdXQnfSA9ICdBYm1lbGRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2dnZWQgaW4gYXMnfSA9ICdBbmdlbWVsZGV0IGFscyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3QgbG9nZ2VkIGluJ30gPSAnTmljaHQgYW5nZW1lbGRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2dpbiByZXF1aXJlZCd9ID0gJ0FubWVsZHVuZyBlcmZvcmRlcmxpY2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgdG8gbG9naW4gd2l0aCB5b3VyIE1pY3Jvc29mdCAzNjUgYWNjb3VudCd9ID0gJ0tsaWNrZW4gU2llIGhpZXIsIHVtIHNpY2ggbWl0IElocmVtIE1pY3Jvc29mdCAzNjUgS29udG8gYW56dW1lbGRlbic7CgogICAgIyBQcmVzZW5jZSBTdGF0dXMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F2YWlsYWJsZSd9ID0gJ1ZlcmbDvGdiYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVzeSd9ID0gJ0Jlc2Now6RmdGlndCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBd2F5J30gPSAnQWJ3ZXNlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8gbm90IGRpc3R1cmInfSA9ICdOaWNodCBzdMO2cmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09mZmxpbmUnfSA9ICdPZmZsaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Vua25vd24nfSA9ICdVbmJla2FubnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW4gYSBjYWxsJ30gPSAnSW0gQW5ydWYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW4gYSBtZWV0aW5nJ30gPSAnSW0gTWVldGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmVzZW50aW5nJ30gPSAnUHLDpHNlbnRpZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlIHJpZ2h0IGJhY2snfSA9ICdCaW4gZ2xlaWNoIHp1csO8Y2snOwoKICAgICMgV29yayBMb2NhdGlvbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29yayBsb2NhdGlvbid9ID0gJ0FyYmVpdHNvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2ZmaWNlJ30gPSAnQsO8cm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVtb3RlJ30gPSAnUmVtb3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgb2ZmJ30gPSAnQWJ3ZXNlbmQnOwoKICAgICMgT3V0IG9mIE9mZmljZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0IG9mIE9mZmljZSd9ID0gJ0Fid2VzZW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjaGVkdWxlZCBBYnNlbmNlJ30gPSAnR2VwbGFudGUgQWJ3ZXNlbmhlaXQnOwoKICAgICMgSG92ZXIgQ2FyZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyc29uIENhcmQnfSA9ICdQZXJzb25lbmthcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGFydG1lbnQnfSA9ICdBYnRlaWx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlcid9ID0gJ1Zvcmdlc2V0enRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSd9ID0gJ1RlbGVmb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9iaWxlJ30gPSAnTW9iaWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1haWwnfSA9ICdFLU1haWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSm9iIFRpdGxlJ30gPSAnUG9zaXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmlldyBtYW5hZ2VyJ30gPSAnVm9yZ2VzZXR6dGVuIGFuemVpZ2VuJzsKCiAgICAjIEFjdGlvbnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXQnfSA9ICdDaGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGwnfSA9ICdBbnJ1Zic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWV0aW5nJ30gPSAnTWVldGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBDaGF0J30gPSAnQ2hhdCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IENhbGwnfSA9ICdBbnJ1ZiBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IFZpZGVvIENhbGwnfSA9ICdWaWRlb2FucnVmIHN0YXJ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2NoZWR1bGUgTWVldGluZyd9ID0gJ01lZXRpbmcgcGxhbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbmQgRW1haWwnfSA9ICdFLU1haWwgc2VuZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGwgUGhvbmUnfSA9ICdUZWxlZm9uIGFucnVmZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsbCBNb2JpbGUnfSA9ICdNb2JpbCBhbnJ1ZmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgdG8gY2xpcGJvYXJkJ30gPSAnSW4gWndpc2NoZW5hYmxhZ2Uga29waWVyZW4nOwoKICAgICMgVGVhbXMgQWN0aW9ucwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbXMgQ2hhdCd9ID0gJ1RlYW1zIENoYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbXMgQ2FsbCd9ID0gJ1RlYW1zIEFucnVmJzsKCiAgICAjIFRpY2tldCBab29tIFdpZGdldAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sbGFib3JhdGlvbid9ID0gJ0tvbGxhYm9yYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGFjdCBDdXN0b21lcid9ID0gJ0t1bmRlIGtvbnRha3RpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGF0IHdpdGggQ3VzdG9tZXInfSA9ICdNaXQgS3VuZGUgY2hhdHRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxsIEN1c3RvbWVyJ30gPSAnS3VuZGUgYW5ydWZlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2hlZHVsZSBNZWV0aW5nIHdpdGggQ3VzdG9tZXInfSA9ICdNZWV0aW5nIG1pdCBLdW5kZSBwbGFuZW4nOwoKICAgICMgQ3VzdG9tZXIgSW5mbyBXaWRnZXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbWVyIEluZm9ybWF0aW9uJ30gPSAnS3VuZGVuaW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2NoZWR1bGUgQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gZWluc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFRpY2tldHMgKEN1c3RvbWVyKSd9ID0gJ09mZmVuZSBUaWNrZXRzIChLdW5kZSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBUaWNrZXRzIChVc2VyKSd9ID0gJ09mZmVuZSBUaWNrZXRzIChCZW51dHplciknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tZXInfSA9ICdLdW5kZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWV0aW5nIHNjaGVkdWxpbmcgcmVxdWlyZXMgTWljcm9zb2Z0IDM2NSBsb2dpbi4nfSA9ICdUZXJtaW5wbGFudW5nIGVyZm9yZGVydCBNaWNyb3NvZnQgMzY1IEFubWVsZHVuZy4nOwogICAgIyBEeW5hbWljIEN1c3RvbWVyIFNlbGVjdGlvbiAoVGlja2V0IENyZWF0ZSBQYWdlcykKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGN1c3RvbWVyIHNlbGVjdGVkJ30gPSAnS2VpbiBLdW5kZSBhdXNnZXfDpGhsdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBjdXN0b21lciB0byBzZWUgZGV0YWlscyd9ID0gJ1fDpGhsZW4gU2llIGVpbmVuIEt1bmRlbiBhdXMsIHVtIERldGFpbHMgenUgc2VoZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBlbmhhbmNlZCBjdXN0b21lciBpbmZvcm1hdGlvbiB3aWRnZXQgaW4gdGlja2V0IHpvb20gc2lkZWJhciB3aXRoIGF2YXRhciwgcHJlc2VuY2UsIGFuZCBxdWljayBhY3Rpb25zLid9ID0KICAgICAgICAnRXJ3ZWl0ZXJ0ZXMgS3VuZGVuaW5mb3JtYXRpb25zLVdpZGdldCBpbSBUaWNrZXQtWm9vbSBtaXQgQXZhdGFyLCBQcsOkc2VueiB1bmQgU2NobmVsbGFrdGlvbmVuIGFuemVpZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaWRlIHRoZSBuYXRpdmUgWm51bnkgQ3VzdG9tZXIgSW5mb3JtYXRpb24gd2lkZ2V0IHdoZW4gQ29sbGFib3JhdGlvbiBDdXN0b21lckluZm8gd2lkZ2V0IGlzIGVuYWJsZWQuJ30gPQogICAgICAgICdOYXRpdmVzIFpudW55IEt1bmRlbmluZm9ybWF0aW9ucy1XaWRnZXQgYXVzYmxlbmRlbiwgd2VubiBDb2xsYWJvcmF0aW9uIEN1c3RvbWVySW5mbyBXaWRnZXQgYWt0aXZpZXJ0IGlzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQUpBWCBlbmRwb2ludCBmb3IgQ29sbGFib3JhdGlvbiBkYXRhIChjdXN0b21lciB0aWNrZXQgY291bnQsIGN1c3RvbWVyIGRhdGEpLid9ID0KICAgICAgICAnQUpBWC1FbmRwdW5rdCBmw7xyIEtvbGxhYm9yYXRpb25zZGF0ZW4gKEt1bmRlbi1UaWNrZXQtQW56YWhsLCBLdW5kZW5kYXRlbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbGxhYm9yYXRpb24gQUpBWCBCYWNrZW5kJ30gPSAnS29sbGFib3JhdGlvbiBBSkFYIEJhY2tlbmQnOwoKICAgICMgTWVldGluZyBTY2hlZHVsZXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lZXRpbmcgRHVyYXRpb24nfSA9ICdNZWV0aW5nLURhdWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzE1IG1pbnV0ZXMnfSA9ICcxNSBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzMwIG1pbnV0ZXMnfSA9ICczMCBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzQ1IG1pbnV0ZXMnfSA9ICc0NSBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzYwIG1pbnV0ZXMnfSA9ICc2MCBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSBkdXJhdGlvbid9ID0gJ0VpZ2VuZSBEYXVlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydtaW51dGVzJ30gPSAnTWludXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBdmFpbGFibGUgU2xvdHMnfSA9ICdWZXJmw7xnYmFyZSBaZWl0c2xvdHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9hZGluZyBhdmFpbGFibGUgdGltZXMuLi4nfSA9ICdMYWRlIHZlcmbDvGdiYXJlIFplaXRlbi4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhdmFpbGFibGUgc2xvdHMgZm91bmQnfSA9ICdLZWluZSB2ZXJmw7xnYmFyZW4gWmVpdHNsb3RzIGdlZnVuZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgbW9yZSBzbG90cyd9ID0gJ1dlaXRlcmUgWmVpdHNsb3RzIGFuemVpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBNZWV0aW5nJ30gPSAnTWVldGluZyBlcnN0ZWxsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVldGluZyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSd9ID0gJ01lZXRpbmcgZXJmb2xncmVpY2ggZXJzdGVsbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkIHRvIGNyZWF0ZSBtZWV0aW5nJ30gPSAnRmVobGVyIGJlaW0gRXJzdGVsbGVuIGRlcyBNZWV0aW5ncyc7CgogICAgIyBNZWV0aW5nIFNjaGVkdWxlciBEaWFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F0dGVuZGVlcyd9ID0gJ1RlaWxuZWhtZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3ViamVjdCd9ID0gJ0JldHJlZmYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVldGluZyBUeXBlJ30gPSAnVGVybWluYXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW1zIE1lZXRpbmcnfSA9ICdUZWFtcyBNZWV0aW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09uLXNpdGUnfSA9ICdWb3IgT3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09uLXNpdGUgTWVldGluZyd9ID0gJ1Zvci1PcnQtVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvY2F0aW9uJ30gPSAnT3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VudGVyIG1lZXRpbmcgbG9jYXRpb24uLi4nfSA9ICdWZXJhbnN0YWx0dW5nc29ydCBlaW5nZWJlbi4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXJhdGlvbid9ID0gJ0RhdWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pbid9ID0gJ01pbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlJ30gPSAnRGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXZhaWxhYmxlIFRpbWVzJ30gPSAnVmVyZsO8Z2JhcmUgWmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09ubHkgdGltZXMgd2hlbiBib3RoIGF0dGVuZGVlcyBhcmUgYXZhaWxhYmxlIGFyZSBzaG93bi4nfSA9ICdOdXIgWmVpdGVuLCB6dSBkZW5lbiBiZWlkZSBUZWlsbmVobWVyIHZlcmbDvGdiYXIgc2luZCwgd2VyZGVuIGFuZ2V6ZWlndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIEFwcG9pbnRtZW50J30gPSAnVGVybWluIGVyc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGluZy4uLid9ID0gJ1dpcmQgZXJzdGVsbHQuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuJ30gPSAnS2VpbmUgdmVyZsO8Z2JhcmVuIFplaXRlbiBmw7xyIGRpZXNlcyBEYXR1bS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkIHRvIGxvYWQgYXZhaWxhYmlsaXR5IGRhdGEuJ30gPSAnRmVobGVyIGJlaW0gTGFkZW4gZGVyIFZlcmbDvGdiYXJrZWl0c2RhdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKb2luIFVSTCd9ID0gJ0JlaXRyZXRlbi1VUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3duZXInfSA9ICdCZXNpdHplcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNwb25zaWJsZSd9ID0gJ1ZlcmFudHdvcnRsaWNoZXInOwoKICAgICMgTGluayBUeXBlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHR5cGUgZm9yIENvbGxhYm9yYXRpb24gYXBwb2ludG1lbnRzLiBVc2VkIHRvIGlkZW50aWZ5IGFwcG9pbnRtZW50cyBjcmVhdGVkIHRocm91Z2ggdGhlIENvbGxhYm9yYXRpb24gQWRkLW9uIGZvciBtZWV0aW5nIHNjaGVkdWxpbmcuJ30gPQogICAgICAgICdMaW5rLVR5cCBmw7xyIEtvbGxhYm9yYXRpb25zLVRlcm1pbmUuIFdpcmQgenVyIElkZW50aWZpemllcnVuZyB2b24gVGVybWluZW4gdmVyd2VuZGV0LCBkaWUgw7xiZXIgZGFzIENvbGxhYm9yYXRpb24gQWRkLW9uIGVyc3RlbGx0IHd1cmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiQ29sbGFib3JhdGlvbiIgdHlwZSBsaW5rLiBVc2VkIGJ5IHRoZSBDb2xsYWJvcmF0aW9uIEFkZC1vbiBmb3IgbWVldGluZyBzY2hlZHVsaW5nLid9ID0KICAgICAgICAnVmVya27DvHBmdCBUZXJtaW5lIHVuZCBUaWNrZXRzIG1pdCBlaW5lbSAiS29sbGFib3JhdGlvbiItTGluay4gV2lyZCB2b20gQ29sbGFib3JhdGlvbiBBZGQtb24gZsO8ciBUZXJtaW5wbGFudW5nIHZlcndlbmRldC4nOwoKICAgICMgQXBwb2ludG1lbnQgQ2FuY2VsbGF0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5jZWwgQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gYWJzYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsIHRoaXMgYXBwb2ludG1lbnQ/IEF0dGVuZGVlcyB3aWxsIGJlIG5vdGlmaWVkLid9ID0KICAgICAgICAnU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBkaWVzZW4gVGVybWluIGFic2FnZW4gbcO2Y2h0ZW4/IERpZSBUZWlsbmVobWVyIHdlcmRlbiBiZW5hY2hyaWNodGlndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FuY2VsbGVkLiBBdHRlbmRlZXMgaGF2ZSBiZWVuIG5vdGlmaWVkLid9ID0KICAgICAgICAnVGVybWluIGFiZ2VzYWd0LiBEaWUgVGVpbG5laG1lciB3dXJkZW4gYmVuYWNocmljaHRpZ3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1pudW55IGFwcG9pbnRtZW50IGRlbGV0ZWQsIGJ1dCBmYWlsZWQgdG8gY2FuY2VsIE91dGxvb2sgZXZlbnQuJ30gPQogICAgICAgICdabnVueS1UZXJtaW4gZ2Vsw7ZzY2h0LCBhYmVyIE91dGxvb2stVGVybWluIGtvbm50ZSBuaWNodCBhYmdlc2FndCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbmNlbGxlZC4nfSA9ICdUZXJtaW4gYWJnZXNhZ3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCB0byBjYW5jZWwgYXBwb2ludG1lbnQuJ30gPSAnRmVobGVyIGJlaW0gQWJzYWdlbiBkZXMgVGVybWlucy4nOwoKICAgICMgRXJyb3IgTWVzc2FnZXMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvZ2luIGZhaWxlZCd9ID0gJ0FubWVsZHVuZyBmZWhsZ2VzY2hsYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgbG9hZCBhdmF0YXInfSA9ICdBdmF0YXIga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBsb2FkIHByZXNlbmNlJ30gPSAnUHLDpHNlbnoga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBsb2FkIHByb2ZpbGUnfSA9ICdQcm9maWwga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3ZpZGVyIG5vdCBjb25maWd1cmVkJ30gPSAnUHJvdmlkZXIgbmljaHQga29uZmlndXJpZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZlYXR1cmUgbm90IGF2YWlsYWJsZSd9ID0gJ0Z1bmt0aW9uIG5pY2h0IHZlcmbDvGdiYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGxvZ2luIGZpcnN0J30gPSAnQml0dGUgenVlcnN0IGFubWVsZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nlc3Npb24gZXhwaXJlZCwgcGxlYXNlIGxvZ2luIGFnYWluJ30gPSAnU2l0enVuZyBhYmdlbGF1ZmVuLCBiaXR0ZSBlcm5ldXQgYW5tZWxkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXIgQ29uZmlndXJlZCd9ID0gJ0tlaW4gS2FsZW5kZXIga29uZmlndXJpZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFyIGlzIGNvbmZpZ3VyZWQgZm9yIHF1ZXVlICVzLid9ID0gJ0bDvHIgZGllIFF1ZXVlICVzIGlzdCBrZWluIEthbGVuZGVyIGtvbmZpZ3VyaWVydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yIHRvIGNvbmZpZ3VyZSBhIGNhbGVuZGFyIG1hcHBpbmcgZm9yIHRoaXMgcXVldWUgaW4gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIChDb2xsYWJvcmF0aW9uOjpRdWV1ZUNhbGVuZGFyTWFwcGluZykuJ30gPQogICAgICAgICdCaXR0ZSBrb250YWt0aWVyZW4gU2llIElocmVuIEFkbWluaXN0cmF0b3IsIHVtIGVpbmUgS2FsZW5kZXItWnVvcmRudW5nIGbDvHIgZGllc2UgUXVldWUgaW4gZGVyIFN5c3RlbWtvbmZpZ3VyYXRpb24genUgaGludGVybGVnZW4gKENvbGxhYm9yYXRpb246OlF1ZXVlQ2FsZW5kYXJNYXBwaW5nKS4nOwoKICAgICMgQ29uZmlndXJhdGlvbiBFcnJvcnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbGxhYm9yYXRpb24gQWRkLW9uOid9ID0gJ0NvbGxhYm9yYXRpb24gQWRkLW9uOic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydub3QgY29uZmlndXJlZC4nfSA9ICduaWNodCBrb25maWd1cmllcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gc2V0dGluZ3MnfSA9ICdFaW5zdGVsbHVuZ2VuIMO2ZmZuZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLid9ID0gJ0JpdHRlIGtvbnRha3RpZXJlbiBTaWUgSWhyZW4gQWRtaW5pc3RyYXRvci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xvc2UgdGhpcyBtZXNzYWdlJ30gPSAnRGllc2UgTmFjaHJpY2h0IHNjaGxpZcOfZW4nOwoKICAgICMgRGlhbG9nIFVJCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnRXJmb2xnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yJ30gPSAnRmVobGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1dhcm5pbmcnfSA9ICdXYXJudW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luZm9ybWF0aW9uJ30gPSAnSW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29uZmlybSd9ID0gJ0Jlc3TDpHRpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbmNlbCd9ID0gJ0FiYnJlY2hlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZZXMsIGNhbmNlbCd9ID0gJ0phLCBhYnNhZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vJ30gPSAnTmVpbic7CgogICAgIyBBcHBvaW50bWVudCBNZXNzYWdlcwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY3JlYXRlZCd9ID0gJ1Rlcm1pbiBlcnN0ZWxsdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEnfSA9ICdUZXJtaW4gZXJmb2xncmVpY2ggZXJzdGVsbHQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09uLXNpdGUgYXBwb2ludG1lbnQgY3JlYXRlZCBzdWNjZXNzZnVsbHkhJ30gPSAnVm9yLU9ydC1UZXJtaW4gZXJmb2xncmVpY2ggZXJzdGVsbHQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGVuZGFyIGV2ZW50IGNyZWF0ZWQsIGJ1dCBabnVueSBhcHBvaW50bWVudCBmYWlsZWQuJ30gPSAnS2FsZW5kZXJlcmVpZ25pcyBlcnN0ZWxsdCwgYWJlciBabnVueS1UZXJtaW4gZmVobGdlc2NobGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCB0byBjcmVhdGUgbWVldGluZy4nfSA9ICdGZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVzIE1lZXRpbmdzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQgdG8gY3JlYXRlIGFwcG9pbnRtZW50Lid9ID0gJ0ZlaGxlciBiZWltIEVyc3RlbGxlbiBkZXMgVGVybWlucy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkIHRvIGxvYWQgdGlja2V0IGRhdGEuJ30gPSAnRmVobGVyIGJlaW0gTGFkZW4gZGVyIFRpY2tldC1EYXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBvbi1zaXRlIG1lZXRpbmcuJ30gPSAnQml0dGUgZ2ViZW4gU2llIGVpbmVuIE9ydCBmw7xyIGRlbiBWb3ItT3J0LVRlcm1pbiBlaW4uJzsKCiAgICAjIERpYWxvZyBBY3Rpb24gQnV0dG9ucwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29weSBMaW5rJ30gPSAnTGluayBrb3BpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3BpZWQhJ30gPSAnS29waWVydCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSm9pbiBNZWV0aW5nJ30gPSAnTWVldGluZyBiZWl0cmV0ZW4nOwoKICAgICMgV2lkZ2V0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2FkaW5nLi4uJ30gPSAnV2lyZCBnZWxhZGVuLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0phdmFTY3JpcHQgaXMgcmVxdWlyZWQgZm9yIGNvbGxhYm9yYXRpb24gZmVhdHVyZXMuJ30gPSAnSmF2YVNjcmlwdCB3aXJkIGbDvHIgS29sbGFib3JhdGlvbnNmdW5rdGlvbmVuIGJlbsO2dGlndC4nOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>

        <!-- Custom Template Override (CSP for Microsoft 365) -->
        <File Permission="660" Location="Custom/Kernel/Output/HTML/Templates/Standard/HTTPHeaders.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIxIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIxIFpudW55IEdtYkgsIGh0dHBzOi8vem51bnkub3JnLwojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCiMgTW9kaWZpZWQgZm9yIENvbGxhYm9yYXRpb24gQWRkLW9uOiBBZGRlZCBNaWNyb3NvZnQgMzY1IGVuZHBvaW50cyB0byBDU1AgY29ubmVjdC1zcmMKIyAtLQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOApbJSBJRiBEYXRhLkNvbnRlbnREaXNwb3NpdGlvbiAtJV0KQ29udGVudC1EaXNwb3NpdGlvbjogWyUgRGF0YS5Db250ZW50RGlzcG9zaXRpb24gJV0KWyUgRU5EIC0lXQpbJSBJRiAhQ29uZmlnKCdTZWN1cmU6OkRpc2FibGVCYW5uZXInKSAtJV0KWC1Qb3dlcmVkLUJ5OiBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSAoaHR0cHM6Ly93d3cuem51bnkub3JnLykKWyUgRU5EIC0lXQpYLVVBLUNvbXBhdGlibGU6IElFPWVkZ2UsY2hyb21lPTEKWyUgSUYgIUNvbmZpZygiRGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWQiKSAmJiAhRGF0YS5EaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCAtJV0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lOClslIEVORCAtJV0KWyUgSUYgIUNvbmZpZygiRGlzYWJsZUNvbnRlbnRTZWN1cml0eVBvbGljeSIpIC0lXQojIFNFQ1VSSVRZIE5PVEU6ICd1bnNhZmUtaW5saW5lJy8ndW5zYWZlLWV2YWwnIGluIHNjcmlwdC1zcmMgbWFrZSB0aGlzIENTUAojIGluZWZmZWN0aXZlIGFnYWluc3Qgc2NyaXB0IGluamVjdGlvbiAtIE1TQUwuanMgc3RvcmVzIHRoZSBNMzY1IE9BdXRoCiMgYWNjZXNzL3JlZnJlc2ggdG9rZW4gaW4gbG9jYWxTdG9yYWdlIChieSBkZXNpZ24sIHNlZSBDb2xsYWJvcmF0aW9uCiMgQ0xBVURFLm1kKSwgd2hpY2ggYW55IFhTUyBhbnl3aGVyZSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIGNvdWxkIHRoZW4KIyByZWFkIGFuZCBleGZpbHRyYXRlLiBUaGlzIGlzIE5PVCBhIHNhZmUgZ2FwIHRvIGNsb3NlIGhlcmU6IFpudW55IGNvcmUncwojIG93biB0ZW1wbGF0ZXMgcmVseSBleHRlbnNpdmVseSBvbiBpbmxpbmUgPHNjcmlwdD4gYmxvY2tzIHRocm91Z2hvdXQgdGhlCiMgYWdlbnQgaW50ZXJmYWNlLCBzbyByZW1vdmluZyAndW5zYWZlLWlubGluZScgZnJvbSBzY3JpcHQtc3JjIHdvdWxkIGJyZWFrCiMgY29yZSBVSSBmYXIgYmV5b25kIHRoaXMgYWRkLW9uJ3Mgc2NvcGUsIG5vdCBqdXN0IENvbGxhYm9yYXRpb24uIEEgcmVhbAojIGZpeCBuZWVkcyBhIG5vbmNlLWJhc2VkIENTUCBhcHBsaWVkIHByb2R1Y3Qtd2lkZSBieSBabnVueSBpdHNlbGYsIG5vdCBhCiMgcGVyLWFkZC1vbiB0ZW1wbGF0ZSBvdmVycmlkZS4gTGVmdCB1bmNoYW5nZWQ7IGZsYWdnZWQgaGVyZSBzbyBpdCBpc24ndAojIG1pc3Rha2VuIGZvciBhbiBvdmVyc2lnaHQuCkNvbnRlbnQtU2VjdXJpdHktUG9saWN5OiBkZWZhdWx0LXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnICd1bnNhZmUtZXZhbCcgZGF0YTogYmxvYjo7IGltZy1zcmMgJ3NlbGYnIGRhdGE6IGJsb2I6IGh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbSBodHRwczovLyouc2hhcmVwb2ludC5jb207IGNvbm5lY3Qtc3JjICdzZWxmJyBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20gaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tIGh0dHBzOi8vKi5zaGFyZXBvaW50LmNvbQpbJSBFTkQgLSVdClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYKUmVmZXJyZXItUG9saWN5OiBuby1yZWZlcnJlcgpbJSBJRiBEYXRhLlhMb2dpbkhlYWRlciAtJV0KIyBXaXRoIHRoaXMgWC1IZWFkZXIsIENvcmUuQUpBWCBjYW4gcmVjb2duaXplIHRoYXQgdGhlIEFKQVggcmVxdWVzdCByZXR1cm5lZCB0aGUgbG9naW4gcGFnZSAoc2Vzc2lvbiB0aW1lb3V0KSBhbmQgcGVyZm9ybSBhIHJlZGlyZWN0LgpYLU9UUlMtTG9naW46IFslIEVudigiQmFzZWxpbmsiKSAlXQpbJSBFTkQgLSVdCkV4cGlyZXM6IFR1ZSwgMSBKYW4gMTk4MCAxMjowMDowMCBHTVQKQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUKUHJhZ21hOiBuby1jYWNoZQo=</File>

        <!-- JavaScript - Core -->
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50CiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gUHJvdmlkZXIgQWJzdHJhY3Rpb24gTGF5ZXIKICoKICogICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBjb2xsYWJvcmF0aW9uIHByb3ZpZGVycwogKiAgICAgIChNaWNyb3NvZnQgMzY1LCBHb29nbGUgV29ya3NwYWNlLCBldGMuKS4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgogKiAgICAgIGlzIGRlbGVnYXRlZCB0byBwcm92aWRlci1zcGVjaWZpYyBtb2R1bGVzLgogKgogKiAgICAgIEFyY2hpdGVjdHVyZToKICogICAgICAtIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5qcyAodGhpcyBmaWxlKSAtIEludGVyZmFjZS9SZWdpc3RyeQogKiAgICAgIC0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2suanMgLSBEZXZlbG9wbWVudC9UZXN0aW5nCiAqICAgICAgLSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NS5qcyAtIE1pY3Jvc29mdCAzNjUKICogICAgICAtIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSS5qcyAtIFVJIENvbXBvbmVudHMKICovCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgpDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIFZhcmlhYmxlcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdHJ5IG9mIGF2YWlsYWJsZSBwcm92aWRlcnMKICAgICAqLwogICAgdmFyIFByb3ZpZGVycyA9IHt9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50bHkgYWN0aXZlIHByb3ZpZGVyIGluc3RhbmNlCiAgICAgKi8KICAgIHZhciBBY3RpdmVQcm92aWRlciA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZhbGxiYWNrIHByb3ZpZGVyIGluc3RhbmNlICh1c2VkIHdoZW4gcHJpbWFyeSBmYWlscykKICAgICAqLwogICAgdmFyIEZhbGxiYWNrUHJvdmlkZXIgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnCiAgICAgKi8KICAgIHZhciBDb25maWcgPSB7CiAgICAgICAgUHJvdmlkZXI6ICdNb2NrJywKICAgICAgICBFbmFibGVBdmF0YXI6IHRydWUsCiAgICAgICAgRW5hYmxlUHJlc2VuY2U6IHRydWUsCiAgICAgICAgRW5hYmxlSG92ZXJDYXJkczogdHJ1ZSwKICAgICAgICBFbmFibGVDaGF0OiB0cnVlLAogICAgICAgIEVuYWJsZUNhbGw6IHRydWUsCiAgICAgICAgRW5hYmxlTWVldGluZ3M6IGZhbHNlLAogICAgICAgIFNob3dJbkhlYWRlcjogdHJ1ZSwKICAgICAgICBTaG93SW5UaWNrZXRJbmZvOiB0cnVlLAogICAgICAgIFNob3dJbkFydGljbGVzOiB0cnVlLAogICAgICAgIFNob3dDdXN0b21lckluZm9XaWRnZXQ6IHRydWUsCiAgICAgICAgSGlkZU5hdGl2ZUN1c3RvbWVySW5mbzogdHJ1ZSwKICAgICAgICBDYWNoZTogewogICAgICAgICAgICBBdmF0YXJUVEw6IDM2MDAsCiAgICAgICAgICAgIFByZXNlbmNlVFRMOiA2MCwKICAgICAgICAgICAgUHJvZmlsZVRUTDogODY0MDAKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBmb3IgYXZhdGFycywgcHJlc2VuY2UsIHByb2ZpbGVzCiAgICAgKi8KICAgIHZhciBDYWNoZSA9IHsKICAgICAgICBBdmF0YXJzOiB7fSwKICAgICAgICBQcmVzZW5jZToge30sCiAgICAgICAgUHJvZmlsZXM6IHt9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNYXBzIGVtYWlsIHRvIHByb3ZpZGVyIG5hbWUgKCdwcmltYXJ5JyBvciAnZmFsbGJhY2snKQogICAgICogICAgICAgICAgICAgIERldGVybWluZWQgYnkgR2V0UHJvZmlsZSAtIGlmIHByaW1hcnkgcHJvdmlkZXIga25vd3MgdGhlIHVzZXIsCiAgICAgKiAgICAgICAgICAgICAgYWxsIGRhdGEgY29tZXMgZnJvbSBwcmltYXJ5LiBJZiBub3QsIGFsbCBkYXRhIGZyb20gZmFsbGJhY2suCiAgICAgKi8KICAgIHZhciBVc2VyUHJvdmlkZXJNYXAgPSB7fTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gVHJhY2tzIHBlbmRpbmcgcmVxdWVzdHMgdG8gYXZvaWQgZHVwbGljYXRlIHBhcmFsbGVsIGNhbGxzCiAgICAgKiAgICAgICAgICAgICAgRm9ybWF0OiB7ICdBdmF0YXJzJzogeyAnZW1haWwnOiBQcm9taXNlIH0sICdQcmVzZW5jZSc6IHsgJ2VtYWlsJzogUHJvbWlzZSB9IH0KICAgICAqLwogICAgdmFyIFBlbmRpbmdSZXF1ZXN0cyA9IHsKICAgICAgICBBdmF0YXJzOiB7fSwKICAgICAgICBQcmVzZW5jZToge30KICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGxpc3RlbmVycwogICAgICovCiAgICB2YXIgRXZlbnRMaXN0ZW5lcnMgPSB7CiAgICAgICAgJ2xvZ2luJzogW10sCiAgICAgICAgJ2xvZ291dCc6IFtdLAogICAgICAgICdwcmVzZW5jZUNoYW5nZSc6IFtdLAogICAgICAgICdlcnJvcic6IFtdCiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBtb2R1bGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKICAgICAqLwogICAgdmFyIEluaXRpYWxpemVkID0gZmFsc2U7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIEhlbHBlciBGdW5jdGlvbnMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFRyYW5zbGF0ZQogICAgICogQGRlc2NyaXB0aW9uIEhlbHBlciB0byB0cmFuc2xhdGUgdGV4dCB2aWEgQ29yZS5MYW5ndWFnZSBpZiBhdmFpbGFibGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBUZXh0IC0gVGV4dCB0byB0cmFuc2xhdGUKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRyYW5zbGF0ZWQgdGV4dCBvciBvcmlnaW5hbAogICAgICovCiAgICBmdW5jdGlvbiBUcmFuc2xhdGUoVGV4dCkgewogICAgICAgIGlmICh0eXBlb2YgQ29yZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQ29yZS5MYW5ndWFnZSAmJiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSkgewogICAgICAgICAgICByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoVGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBUZXh0OwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dNZXNzYWdlQm94CiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBhIFpudW55LXN0eWxlIE1lc3NhZ2VCb3ggbm90aWZpY2F0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gVHlwZSAtICdFcnJvcicgb3IgJ1dhcm5pbmcnCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTWVzc2FnZSAtIE1lc3NhZ2UgdG8gZGlzcGxheQogICAgICovCiAgICBmdW5jdGlvbiBTaG93TWVzc2FnZUJveChUeXBlLCBNZXNzYWdlKSB7CiAgICAgICAgdmFyIGljb24gPSBUeXBlID09PSAnRXJyb3InID8gJ2ZhLWV4Y2xhbWF0aW9uLWNpcmNsZScgOiAnZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnOwogICAgICAgIHZhciBjc3NDbGFzcyA9ICdNZXNzYWdlQm94IENvbGxhYm9yYXRpb25NZXNzYWdlICcgKyBUeXBlOwoKICAgICAgICAvLyBPbmx5IGFkZCBpZiBub3QgYWxyZWFkeSBwcmVzZW50CiAgICAgICAgaWYgKCQoJy5Db2xsYWJvcmF0aW9uTWVzc2FnZS4nICsgVHlwZSkubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgJG1lc3NhZ2VCb3ggPSAkKAogICAgICAgICAgICAnPGRpdiBjbGFzcz0iJyArIGNzc0NsYXNzICsgJyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4+PGkgY2xhc3M9ImZhICcgKyBpY29uICsgJyI+PC9pPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8cD4nICsgTWVzc2FnZSArICc8L3A+JyArCiAgICAgICAgICAgICAgICAnPGEgY2xhc3M9IkNsb3NlIGljb24taG92ZXIiIHRpdGxlPSInICsgVHJhbnNsYXRlKCdDbG9zZSB0aGlzIG1lc3NhZ2UnKSArICciIGhyZWY9IiMiPicgKwogICAgICAgICAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT4nICsKICAgICAgICAgICAgICAgICc8L2E+JyArCiAgICAgICAgICAgICc8L2Rpdj4nCiAgICAgICAgKTsKCiAgICAgICAgLy8gQWRkIGNsb3NlIGhhbmRsZXIKICAgICAgICAkbWVzc2FnZUJveC5maW5kKCcuQ2xvc2UnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuTWVzc2FnZUJveCcpLnJlbW92ZSgpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbnNlcnQgaW4gdGhlIG5vdGlmaWNhdGlvbiBhcmVhIChiZXR3ZWVuIEhlYWRlciBhbmQgTWFpbkJveCkKICAgICAgICAvLyBabnVueSBwbGFjZXMgTWVzc2FnZUJveGVzIGFmdGVyICNIZWFkZXIsIGJlZm9yZSAuTWFpbkJveAogICAgICAgIHZhciAkbWFpbkJveCA9ICQoJy5NYWluQm94JykuZmlyc3QoKTsKICAgICAgICB2YXIgJGV4aXN0aW5nTWVzc2FnZXMgPSAkKCcjQXBwV3JhcHBlciA+IC5NZXNzYWdlQm94JykubGFzdCgpOwoKICAgICAgICBpZiAoJGV4aXN0aW5nTWVzc2FnZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBJbnNlcnQgYWZ0ZXIgbGFzdCBleGlzdGluZyBNZXNzYWdlQm94CiAgICAgICAgICAgICRleGlzdGluZ01lc3NhZ2VzLmFmdGVyKCRtZXNzYWdlQm94KTsKICAgICAgICB9IGVsc2UgaWYgKCRtYWluQm94Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSBNYWluQm94IChzYW1lIHBvc2l0aW9uIGFzIG5hdGl2ZSBabnVueSBub3RpZmljYXRpb25zKQogICAgICAgICAgICAkbWFpbkJveC5iZWZvcmUoJG1lc3NhZ2VCb3gpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpbnNlcnQgYWZ0ZXIgSGVhZGVyCiAgICAgICAgICAgIHZhciAkaGVhZGVyID0gJCgnI0hlYWRlcicpOwogICAgICAgICAgICBpZiAoJGhlYWRlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAkaGVhZGVyLmFmdGVyKCRtZXNzYWdlQm94KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIExhc3QgcmVzb3J0OiBwcmVwZW5kIHRvIEFwcFdyYXBwZXIKICAgICAgICAgICAgICAgICQoJyNBcHBXcmFwcGVyJykucHJlcGVuZCgkbWVzc2FnZUJveCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2hvd0NvbmZpZ3VyYXRpb25FcnJvcgogICAgICogQGRlc2NyaXB0aW9uIFNob3cgYSB2aXNpYmxlIGVycm9yIG5vdGlmaWNhdGlvbiBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBNZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dDb25maWd1cmF0aW9uRXJyb3IoTWVzc2FnZSkgewogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gTTM2NSBjb25maWd1cmF0aW9uIGVycm9yIGFuZCBhZGQgYSBkaXJlY3QgbGluawogICAgICAgIHZhciBEaXNwbGF5TWVzc2FnZSA9IE1lc3NhZ2U7CiAgICAgICAgaWYgKE1lc3NhZ2UuaW5kZXhPZignTTM2NSBQcm92aWRlcicpICE9PSAtMSAmJiBNZXNzYWdlLmluZGV4T2YoJ01pc3NpbmcgcmVxdWlyZWQgU3lzQ29uZmlnJykgIT09IC0xKSB7CiAgICAgICAgICAgIC8vIEV4dHJhY3QgbWlzc2luZyBzZXR0aW5ncyBmcm9tIG1lc3NhZ2UgYW5kIGZvcm1hdCB0aGVtIG5pY2VseQogICAgICAgICAgICB2YXIgTWlzc2luZ1NldHRpbmdzID0gW107CiAgICAgICAgICAgIGlmIChNZXNzYWdlLmluZGV4T2YoJ1RlbmFudElEJykgIT09IC0xKSBNaXNzaW5nU2V0dGluZ3MucHVzaCgnVGVuYW50SUQnKTsKICAgICAgICAgICAgaWYgKE1lc3NhZ2UuaW5kZXhPZignQ2xpZW50SUQnKSAhPT0gLTEpIE1pc3NpbmdTZXR0aW5ncy5wdXNoKCdDbGllbnRJRCcpOwogICAgICAgICAgICBpZiAoTWVzc2FnZS5pbmRleE9mKCdSZWRpcmVjdFVSSScpICE9PSAtMSkgTWlzc2luZ1NldHRpbmdzLnB1c2goJ1JlZGlyZWN0VVJJJyk7CgogICAgICAgICAgICAvLyBCdWlsZCBsaW5rIHRvIFN5c0NvbmZpZyBzZWFyY2ggZm9yIGFsbCBNMzY1IHNldHRpbmdzCiAgICAgICAgICAgIHZhciBCYXNlbGluayA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSB8fCAnaW5kZXgucGw/JzsKICAgICAgICAgICAgdmFyIFN5c0NvbmZpZ0xpbmsgPSBCYXNlbGluayArICdBY3Rpb249QWRtaW5TeXN0ZW1Db25maWd1cmF0aW9uO1N1YmFjdGlvbj1TZWFyY2g7U2VhcmNoPUNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1JzsKCiAgICAgICAgICAgIC8vIEZvcm1hdDogIkNvbGxhYm9yYXRpb24gQWRkLW9uOiBUZW5hbnRJRCwgQ2xpZW50SUQsIFJlZGlyZWN0VVJJIG5pY2h0IGtvbmZpZ3VyaWVydC4gW0xpbmtdIgogICAgICAgICAgICBEaXNwbGF5TWVzc2FnZSA9IFRyYW5zbGF0ZSgnQ29sbGFib3JhdGlvbiBBZGQtb246JykgKyAnICcgKwogICAgICAgICAgICAgICAgTWlzc2luZ1NldHRpbmdzLmpvaW4oJywgJykgKyAnICcgKyBUcmFuc2xhdGUoJ25vdCBjb25maWd1cmVkLicpICsgJyAnICsKICAgICAgICAgICAgICAgICc8YSBocmVmPSInICsgU3lzQ29uZmlnTGluayArICciIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsiPicgKwogICAgICAgICAgICAgICAgVHJhbnNsYXRlKCdPcGVuIHNldHRpbmdzJykgKyAnPC9hPic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgRGlzcGxheU1lc3NhZ2UgPSBNZXNzYWdlICsgJyAnICsgVHJhbnNsYXRlKCdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuJyk7CiAgICAgICAgfQogICAgICAgIFNob3dNZXNzYWdlQm94KCdFcnJvcicsIERpc3BsYXlNZXNzYWdlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBTaG93Q29uZmlndXJhdGlvbldhcm5pbmcKICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGEgdmlzaWJsZSB3YXJuaW5nIG5vdGlmaWNhdGlvbiBhYm91dCByZWNvbW1lbmRlZCBjb25maWd1cmF0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTWVzc2FnZSAtIFdhcm5pbmcgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dDb25maWd1cmF0aW9uV2FybmluZyhNZXNzYWdlKSB7CiAgICAgICAgU2hvd01lc3NhZ2VCb3goJ1dhcm5pbmcnLCBNZXNzYWdlKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIEludGVyZmFjZSBEZWZpbml0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBQcm92aWRlciBJbnRlcmZhY2UgLSBBbGwgcHJvdmlkZXJzIG11c3QgaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMuCiAgICAgKiAgICAgIE1ldGhvZHMgcmV0dXJuIFByb21pc2VzIGZvciBhc3luYyBvcGVyYXRpb25zLgogICAgICoKICAgICAqIEBpbnRlcmZhY2UgUHJvdmlkZXJJbnRlcmZhY2UKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGluaXQoY29uZmlnKSAtIEluaXRpYWxpemUgcHJvdmlkZXIKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxvZ2luKCkgLSBJbnRlcmFjdGl2ZSBsb2dpbgogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbG9nb3V0KCkgLSBMb2dvdXQKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGlzTG9nZ2VkSW4oKSAtIENoZWNrIGxvZ2luIHN0YXR1cwogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0Q3VycmVudFVzZXIoKSAtIEdldCBsb2dnZWQtaW4gdXNlciBpbmZvCiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRBdmF0YXIoZW1haWwpIC0gR2V0IGF2YXRhciBVUkwKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFByZXNlbmNlKGVtYWlsKSAtIEdldCBvbmxpbmUgc3RhdHVzCiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRQcm9maWxlKGVtYWlsKSAtIEdldCB1c2VyIHByb2ZpbGUKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldEZyZWVCdXN5KGVtYWlscywgc3RhcnQsIGVuZCkgLSBHZXQgYXZhaWxhYmlsaXR5CiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBjcmVhdGVNZWV0aW5nKGRldGFpbHMpIC0gQ3JlYXRlIG9ubGluZSBtZWV0aW5nCiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRDaGF0TGluayhlbWFpbCkgLSBHZXQgY2hhdCBkZWVwLWxpbmsKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldENhbGxMaW5rKGVtYWlsKSAtIEdldCBjYWxsIGRlZXAtbGluawogICAgICogQHByb3BlcnR5IHtPYmplY3R9IGNhcGFiaWxpdGllcyAtIFdoYXQgZmVhdHVyZXMgdGhpcyBwcm92aWRlciBzdXBwb3J0cwogICAgICovCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIEluaXRpYWxpemF0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIENvbGxhYm9yYXRpb24gbW9kdWxlIHdpdGggY29uZmlndXJhdGlvbgogICAgICogQHBhcmFtIHtPYmplY3R9IFVzZXJDb25maWcgLSBDb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoVXNlckNvbmZpZykgewogICAgICAgIGlmIChJbml0aWFsaXplZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBNZXJnZSB1c2VyIGNvbmZpZyB3aXRoIGRlZmF1bHRzCiAgICAgICAgaWYgKFVzZXJDb25maWcpIHsKICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgQ29uZmlnLCBVc2VyQ29uZmlnKTsKICAgICAgICB9CgogICAgICAgIC8vIExvYWQgY29uZmlnIGZyb20gQ29yZS5Db25maWcgaWYgYXZhaWxhYmxlIChzZXQgYnkgdGVtcGxhdGUpCiAgICAgICAgTG9hZENvbmZpZ0Zyb21abnVueSgpOwoKICAgICAgICAvLyBTZWxlY3QgYW5kIGluaXRpYWxpemUgcHJpbWFyeSBwcm92aWRlcgogICAgICAgIHZhciBQcm92aWRlck5hbWUgPSBDb25maWcuUHJvdmlkZXIgfHwgJ01vY2snOwogICAgICAgIGlmIChQcm92aWRlcnNbUHJvdmlkZXJOYW1lXSkgewogICAgICAgICAgICBBY3RpdmVQcm92aWRlciA9IFByb3ZpZGVyc1tQcm92aWRlck5hbWVdOwoKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBwcm92aWRlciB3aXRoIGNvbmZpZwogICAgICAgICAgICB2YXIgUHJvdmlkZXJDb25maWcgPSBDb25maWdbJ1Byb3ZpZGVyJyArIFByb3ZpZGVyTmFtZV0gfHwge307CiAgICAgICAgICAgIEFjdGl2ZVByb3ZpZGVyLmluaXQoUHJvdmlkZXJDb25maWcpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gVHJ5IHNpbGVudCBsb2dpbgogICAgICAgICAgICAgICAgVHJ5U2lsZW50TG9naW4oKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKEVycm9yKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbQ29sbGFib3JhdGlvbl0gUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkOicsIEVycm9yLm1lc3NhZ2UgfHwgRXJyb3IpOwogICAgICAgICAgICAgICAgVHJpZ2dlckV2ZW50KCdlcnJvcicsIHsgdHlwZTogJ2luaXQnLCBlcnJvcjogRXJyb3IgfSk7CgogICAgICAgICAgICAgICAgLy8gU2hvdyB1c2VyLXZpc2libGUgbm90aWZpY2F0aW9uIGZvciBjb25maWd1cmF0aW9uIGVycm9ycwogICAgICAgICAgICAgICAgaWYgKEVycm9yLm1lc3NhZ2UgJiYgRXJyb3IubWVzc2FnZS5pbmRleE9mKCdNaXNzaW5nIHJlcXVpcmVkIFN5c0NvbmZpZycpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIFNob3dDb25maWd1cmF0aW9uRXJyb3IoRXJyb3IubWVzc2FnZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgfQoKICAgICAgICAvLyBJbml0aWFsaXplIGZhbGxiYWNrIHByb3ZpZGVyIChpZiBjb25maWd1cmVkIGFuZCBkaWZmZXJlbnQgZnJvbSBwcmltYXJ5KQogICAgICAgIHZhciBGYWxsYmFja1Byb3ZpZGVyTmFtZSA9IENvbmZpZy5GYWxsYmFja1Byb3ZpZGVyIHx8ICcnOwogICAgICAgIGlmIChGYWxsYmFja1Byb3ZpZGVyTmFtZSAmJiBGYWxsYmFja1Byb3ZpZGVyTmFtZSAhPT0gUHJvdmlkZXJOYW1lICYmIFByb3ZpZGVyc1tGYWxsYmFja1Byb3ZpZGVyTmFtZV0pIHsKICAgICAgICAgICAgRmFsbGJhY2tQcm92aWRlciA9IFByb3ZpZGVyc1tGYWxsYmFja1Byb3ZpZGVyTmFtZV07CiAgICAgICAgICAgIEZhbGxiYWNrUHJvdmlkZXIuaW5pdCh7fSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChFcnJvcikgewogICAgICAgICAgICAgICAgRmFsbGJhY2tQcm92aWRlciA9IG51bGw7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFJlZ2lzdGVyUHJvdmlkZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgY29sbGFib3JhdGlvbiBwcm92aWRlcgogICAgICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgLSBQcm92aWRlciBuYW1lIChlLmcuLCAnTTM2NScsICdNb2NrJykKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBQcm92aWRlciAtIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uCiAgICAgKi8KICAgIFRhcmdldE5TLlJlZ2lzdGVyUHJvdmlkZXIgPSBmdW5jdGlvbiAoTmFtZSwgUHJvdmlkZXIpIHsKICAgICAgICBpZiAoIU5hbWUgfHwgIVByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFZhbGlkYXRlIHByb3ZpZGVyIGltcGxlbWVudHMgcmVxdWlyZWQgbWV0aG9kcwogICAgICAgIHZhciBSZXF1aXJlZE1ldGhvZHMgPSBbJ2luaXQnLCAnbG9naW4nLCAnbG9nb3V0JywgJ2lzTG9nZ2VkSW4nLCAnZ2V0QXZhdGFyJ107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBSZXF1aXJlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm92aWRlcltSZXF1aXJlZE1ldGhvZHNbaV1dICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIFByb3ZpZGVyc1tOYW1lXSA9IFByb3ZpZGVyOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldENvbmZpZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbgogICAgICogQHJldHVybnMge09iamVjdH0gQ3VycmVudCBjb25maWcKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0Q29uZmlnID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAkLmV4dGVuZCh0cnVlLCB7fSwgQ29uZmlnKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBJc0ZlYXR1cmVFbmFibGVkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiBhIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgICogQHBhcmFtIHtTdHJpbmd9IEZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgKGUuZy4sICdBdmF0YXInLCAnUHJlc2VuY2UnKQogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgZW5hYmxlZAogICAgICovCiAgICBUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkID0gZnVuY3Rpb24gKEZlYXR1cmUpIHsKICAgICAgICB2YXIgQ29uZmlnS2V5ID0gJ0VuYWJsZScgKyBGZWF0dXJlOwogICAgICAgIHJldHVybiBDb25maWdbQ29uZmlnS2V5XSA9PT0gdHJ1ZSB8fCBDb25maWdbQ29uZmlnS2V5XSA9PT0gJzEnIHx8IENvbmZpZ1tDb25maWdLZXldID09PSAxOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEhhc0NhcGFiaWxpdHkKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGN1cnJlbnQgcHJvdmlkZXIgc3VwcG9ydHMgYSBjYXBhYmlsaXR5CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ2FwYWJpbGl0eSAtIENhcGFiaWxpdHkgbmFtZQogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgc3VwcG9ydGVkCiAgICAgKi8KICAgIFRhcmdldE5TLkhhc0NhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQ2FwYWJpbGl0eSkgewogICAgICAgIGlmICghQWN0aXZlUHJvdmlkZXIgfHwgIUFjdGl2ZVByb3ZpZGVyLmNhcGFiaWxpdGllcykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5jYXBhYmlsaXRpZXNbQ2FwYWJpbGl0eV0gPT09IHRydWU7CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBBdXRoZW50aWNhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBMb2dpbgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhdGUgaW50ZXJhY3RpdmUgbG9naW4KICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIGxvZ2luIHN1Y2Nlc3NmdWwKICAgICAqLwogICAgVGFyZ2V0TlMuTG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlcikgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBwcm92aWRlciBjb25maWd1cmVkJykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmxvZ2luKCkudGhlbihmdW5jdGlvbiAoVXNlcikgewogICAgICAgICAgICBUcmlnZ2VyRXZlbnQoJ2xvZ2luJywgVXNlcik7CiAgICAgICAgICAgIHJldHVybiBVc2VyOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIExvZ291dAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gTG9nb3V0IGZyb20gcHJvdmlkZXIKICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIGxvZ291dCBjb21wbGV0ZQogICAgICovCiAgICBUYXJnZXROUy5Mb2dvdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlcikgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBwcm92aWRlciBjb25maWd1cmVkJykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmxvZ291dCgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDbGVhckNhY2hlKCk7CiAgICAgICAgICAgIFRyaWdnZXJFdmVudCgnbG9nb3V0Jywge30pOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIElzTG9nZ2VkSW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIHVzZXIgaXMgbG9nZ2VkIGluCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBsb2dnZWQgaW4KICAgICAqLwogICAgVGFyZ2V0TlMuSXNMb2dnZWRJbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmlzTG9nZ2VkSW4oKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRDdXJyZW50VXNlcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnRseSBsb2dnZWQtaW4gdXNlcgogICAgICogQHJldHVybnMge09iamVjdHxudWxsfSBVc2VyIG9iamVjdCBvciBudWxsCiAgICAgKi8KICAgIFRhcmdldE5TLkdldEN1cnJlbnRVc2VyID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghQWN0aXZlUHJvdmlkZXIgfHwgIUFjdGl2ZVByb3ZpZGVyLmdldEN1cnJlbnRVc2VyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuZ2V0Q3VycmVudFVzZXIoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRMb2dpbkluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBsb2dpbiBVSSBtZXRhZGF0YSBmcm9tIGFjdGl2ZSBwcm92aWRlcgogICAgICogQHJldHVybnMge09iamVjdHxudWxsfSBMb2dpbiBpbmZvIHtsYWJlbCwgaWNvbiwgcmVxdWlyZXNFeHBsaWNpdExvZ2lufSBvciBudWxsIGlmIG5vIGxvZ2luIG5lZWRlZAogICAgICovCiAgICBUYXJnZXROUy5HZXRMb2dpbkluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuZ2V0TG9naW5JbmZvKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOyAgLy8gUHJvdmlkZXIgZG9lc24ndCByZXF1aXJlIGV4cGxpY2l0IGxvZ2luCiAgICAgICAgfQogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5nZXRMb2dpbkluZm8oKTsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIEF2YXRhciAmIFByZXNlbmNlCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEdldEF2YXRhcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGF2YXRhciBVUkwgZm9yIGVtYWlsIGFkZHJlc3MuCiAgICAgKiAgICAgICAgICAgICAgVXNlcyB0aGUgcHJvdmlkZXIgZGV0ZXJtaW5lZCBieSBHZXRQcm9maWxlIChVc2VyUHJvdmlkZXJNYXApLgogICAgICogICAgICAgICAgICAgIElmIHByb3ZpZGVyIGRvZXNuJ3QgaGF2ZSBhdmF0YXIsIHJldHVybnMgU1ZHIGZhbGxiYWNrLgogICAgICogICAgICAgICAgICAgIEltcGxlbWVudHMgcmVxdWVzdCBkZWR1cGxpY2F0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8U3RyaW5nPn0gQXZhdGFyIFVSTCBvciBmYWxsYmFjawogICAgICovCiAgICBUYXJnZXROUy5HZXRBdmF0YXIgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoVGFyZ2V0TlMuR2V0RmFsbGJhY2tBdmF0YXJVcmwoJycpKTsKICAgICAgICB9CgogICAgICAgIEVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QKICAgICAgICB2YXIgQ2FjaGVkID0gR2V0RnJvbUNhY2hlKCdBdmF0YXJzJywgRW1haWwsIENvbmZpZy5DYWNoZS5BdmF0YXJUVEwpOwogICAgICAgIGlmIChDYWNoZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDYWNoZWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbHJlYWR5IGEgcGVuZGluZyByZXF1ZXN0IGZvciB0aGlzIGVtYWlsCiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlbiBtdWx0aXBsZSBjYWxsZXJzIHJlcXVlc3QgdGhlIHNhbWUgYXZhdGFyCiAgICAgICAgaWYgKFBlbmRpbmdSZXF1ZXN0cy5BdmF0YXJzW0VtYWlsXSkgewogICAgICAgICAgICByZXR1cm4gUGVuZGluZ1JlcXVlc3RzLkF2YXRhcnNbRW1haWxdOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgZmVhdHVyZSBlbmFibGVkCiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdBdmF0YXInKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFRhcmdldE5TLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvdmlkZXIgdG8gdXNlIGJhc2VkIG9uIFVzZXJQcm92aWRlck1hcCAoc2V0IGJ5IEdldFByb2ZpbGUpCiAgICAgICAgdmFyIFVzZVByb3ZpZGVyID0gVXNlclByb3ZpZGVyTWFwW0VtYWlsXTsKICAgICAgICB2YXIgUmVxdWVzdFByb21pc2U7CgogICAgICAgIC8vIElmIHVzZXIgaXMgbWFwcGVkIHRvIGZhbGxiYWNrIHByb3ZpZGVyLCB1c2UgZmFsbGJhY2sKICAgICAgICBpZiAoVXNlUHJvdmlkZXIgPT09ICdmYWxsYmFjaycpIHsKICAgICAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXIgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMuYXZhdGFyKSB7CiAgICAgICAgICAgICAgICBSZXF1ZXN0UHJvbWlzZSA9IEZhbGxiYWNrUHJvdmlkZXIuZ2V0QXZhdGFyKEVtYWlsKQogICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ0F2YXRhcnMnLCBFbWFpbCwgVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVybDsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBGYWxsYmFjayA9IFRhcmdldE5TLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKTsKICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ0F2YXRhcnMnLCBFbWFpbCwgRmFsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFRhcmdldE5TLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSWYgbm90IGxvZ2dlZCBpbiB0byBwcmltYXJ5IHByb3ZpZGVyLCB1c2UgZmFsbGJhY2sKICAgICAgICBlbHNlIGlmICghVGFyZ2V0TlMuSXNMb2dnZWRJbigpKSB7CiAgICAgICAgICAgIGlmIChGYWxsYmFja1Byb3ZpZGVyICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzLmF2YXRhcikgewogICAgICAgICAgICAgICAgUmVxdWVzdFByb21pc2UgPSBGYWxsYmFja1Byb3ZpZGVyLmdldEF2YXRhcihFbWFpbCkKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNldENhY2hlKCdBdmF0YXJzJywgRW1haWwsIFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVcmw7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0TlMuR2V0RmFsbGJhY2tBdmF0YXJVcmwoRW1haWwpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShUYXJnZXROUy5HZXRGYWxsYmFja0F2YXRhclVybChFbWFpbCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVzZSBwcmltYXJ5IHByb3ZpZGVyIC0gaWYgaXQgZmFpbHMsIHVzZSBTVkcgKE5PVCBmYWxsYmFjayBwcm92aWRlcikKICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsOiBpZiBwcmltYXJ5IGtub3dzIHRoZSB1c2VyIGJ1dCBoYXMgbm8gYXZhdGFyLCB3ZSBkb24ndCBhc2sgZmFsbGJhY2sKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgUmVxdWVzdFByb21pc2UgPSBBY3RpdmVQcm92aWRlci5nZXRBdmF0YXIoRW1haWwpCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ0F2YXRhcnMnLCBFbWFpbCwgVXJsKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVXJsOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeSBmYWlsZWQgLSB1c2UgU1ZHIGZhbGxiYWNrLCBOT1QgZmFsbGJhY2sgcHJvdmlkZXIKICAgICAgICAgICAgICAgICAgICB2YXIgRmFsbGJhY2sgPSBUYXJnZXROUy5HZXRGYWxsYmFja0F2YXRhclVybChFbWFpbCk7CiAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ0F2YXRhcnMnLCBFbWFpbCwgRmFsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxsYmFjazsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gVHJhY2sgdGhlIHBlbmRpbmcgcmVxdWVzdCBhbmQgY2xlYW4gdXAgd2hlbiBkb25lCiAgICAgICAgUGVuZGluZ1JlcXVlc3RzLkF2YXRhcnNbRW1haWxdID0gUmVxdWVzdFByb21pc2UuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGRlbGV0ZSBQZW5kaW5nUmVxdWVzdHMuQXZhdGFyc1tFbWFpbF07CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBQZW5kaW5nUmVxdWVzdHMuQXZhdGFyc1tFbWFpbF07CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0UHJlc2VuY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBwcmVzZW5jZS9vbmxpbmUgc3RhdHVzIGZvciBlbWFpbC4KICAgICAqICAgICAgICAgICAgICBVc2VzIHRoZSBwcm92aWRlciBkZXRlcm1pbmVkIGJ5IEdldFByb2ZpbGUgKFVzZXJQcm92aWRlck1hcCkuCiAgICAgKiAgICAgICAgICAgICAgSWYgcHJvdmlkZXIgZG9lc24ndCBoYXZlIHByZXNlbmNlLCByZXR1cm5zICd1bmtub3duJy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFByZXNlbmNlIG9iamVjdCB7c3RhdHVzLCBhY3Rpdml0eX0KICAgICAqLwogICAgVGFyZ2V0TlMuR2V0UHJlc2VuY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICB2YXIgRGVmYXVsdFByZXNlbmNlID0geyBzdGF0dXM6ICd1bmtub3duJywgYWN0aXZpdHk6ICd1bmtub3duJyB9OwoKICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByZXNlbmNlKTsKICAgICAgICB9CgogICAgICAgIEVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gQ2hlY2sgY2FjaGUKICAgICAgICB2YXIgQ2FjaGVkID0gR2V0RnJvbUNhY2hlKCdQcmVzZW5jZScsIEVtYWlsLCBDb25maWcuQ2FjaGUuUHJlc2VuY2VUVEwpOwogICAgICAgIGlmIChDYWNoZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDYWNoZWQpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgZmVhdHVyZSBlbmFibGVkCiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdQcmVzZW5jZScpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByZXNlbmNlKTsKICAgICAgICB9CgogICAgICAgIC8vIERldGVybWluZSB3aGljaCBwcm92aWRlciB0byB1c2UgYmFzZWQgb24gVXNlclByb3ZpZGVyTWFwIChzZXQgYnkgR2V0UHJvZmlsZSkKICAgICAgICB2YXIgVXNlUHJvdmlkZXIgPSBVc2VyUHJvdmlkZXJNYXBbRW1haWxdOwoKICAgICAgICAvLyBJZiB1c2VyIGlzIG1hcHBlZCB0byBmYWxsYmFjayBwcm92aWRlciwgdXNlIGZhbGxiYWNrCiAgICAgICAgaWYgKFVzZVByb3ZpZGVyID09PSAnZmFsbGJhY2snKSB7CiAgICAgICAgICAgIGlmIChGYWxsYmFja1Byb3ZpZGVyICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzLnByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsbGJhY2tQcm92aWRlci5nZXRQcmVzZW5jZShFbWFpbCkKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ1ByZXNlbmNlJywgRW1haWwsIFByZXNlbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByZXNlbmNlOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRQcmVzZW5jZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERlZmF1bHRQcmVzZW5jZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBub3QgbG9nZ2VkIGluIHRvIHByaW1hcnkgcHJvdmlkZXIsIHVzZSBmYWxsYmFjawogICAgICAgIGlmICghVGFyZ2V0TlMuSXNMb2dnZWRJbigpKSB7CiAgICAgICAgICAgIGlmIChGYWxsYmFja1Byb3ZpZGVyICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzLnByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsbGJhY2tQcm92aWRlci5nZXRQcmVzZW5jZShFbWFpbCkKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ1ByZXNlbmNlJywgRW1haWwsIFByZXNlbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByZXNlbmNlOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRQcmVzZW5jZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERlZmF1bHRQcmVzZW5jZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBjYXBhYmlsaXR5CiAgICAgICAgaWYgKCFUYXJnZXROUy5IYXNDYXBhYmlsaXR5KCdwcmVzZW5jZScpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByZXNlbmNlKTsKICAgICAgICB9CgogICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmZXRjaCBwcmVzZW5jZSB3aXRoIHVzZXIgSUQKICAgICAgICBmdW5jdGlvbiBGZXRjaFByZXNlbmNlV2l0aElkKFVzZXJJZCwgT3JpZ2luYWxFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuZ2V0UHJlc2VuY2UoVXNlcklkLCBPcmlnaW5hbEVtYWlsKS50aGVuKGZ1bmN0aW9uIChQcmVzZW5jZSkgewogICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ1ByZXNlbmNlJywgT3JpZ2luYWxFbWFpbCwgUHJlc2VuY2UpOwogICAgICAgICAgICAgICAgcmV0dXJuIFByZXNlbmNlOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdFByZXNlbmNlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjYWNoZWQgcHJvZmlsZSB3aXRoIHVzZXIgSUQgKEdVSUQpIC0gcHJlc2VuY2UgQVBJIHdvcmtzIGJldHRlciB3aXRoIElECiAgICAgICAgdmFyIENhY2hlZFByb2ZpbGUgPSBHZXRGcm9tQ2FjaGUoJ1Byb2ZpbGVzJywgRW1haWwsIENvbmZpZy5DYWNoZS5Qcm9maWxlVFRMKTsKCiAgICAgICAgaWYgKENhY2hlZFByb2ZpbGUgJiYgQ2FjaGVkUHJvZmlsZS5pZCkgewogICAgICAgICAgICAvLyBXZSBoYXZlIGEgY2FjaGVkIHByb2ZpbGUgd2l0aCBHVUlEIC0gdXNlIGl0IGRpcmVjdGx5CiAgICAgICAgICAgIHJldHVybiBGZXRjaFByZXNlbmNlV2l0aElkKENhY2hlZFByb2ZpbGUuaWQsIEVtYWlsKTsKICAgICAgICB9CgogICAgICAgIC8vIE5vIGNhY2hlZCBwcm9maWxlIC0gbG9hZCBwcm9maWxlIGZpcnN0IHRvIGdldCB0aGUgR1VJRCwgdGhlbiBmZXRjaCBwcmVzZW5jZQogICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgdXNlIEdVSUQgZm9yIHByZXNlbmNlIHF1ZXJpZXMgKGVtYWlsLWJhc2VkIHF1ZXJpZXMgcmV0dXJuIFByZXNlbmNlVW5rbm93bikKICAgICAgICByZXR1cm4gVGFyZ2V0TlMuR2V0UHJvZmlsZShFbWFpbCkudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICBpZiAoUHJvZmlsZSAmJiBQcm9maWxlLmlkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRmV0Y2hQcmVzZW5jZVdpdGhJZChQcm9maWxlLmlkLCBFbWFpbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUHJvZmlsZSBsb2FkZWQgYnV0IG5vIElEIChmYWxsYmFjayBwcm92aWRlcj8pIC0gdHJ5IHdpdGggZW1haWwgYW55d2F5CiAgICAgICAgICAgIHJldHVybiBGZXRjaFByZXNlbmNlV2l0aElkKEVtYWlsLCBFbWFpbCk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVmYXVsdFByZXNlbmNlOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFJlZnJlc2hQcmVzZW5jZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gRm9yY2UgcmVmcmVzaCBwcmVzZW5jZSBzdGF0dXMgZm9yIGVtYWlsIChieXBhc3NlcyBjYWNoZSkuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcmVzZW5jZSBvYmplY3Qge3N0YXR1cywgYWN0aXZpdHl9CiAgICAgKi8KICAgIFRhcmdldE5TLlJlZnJlc2hQcmVzZW5jZSA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIGlmICghRW1haWwpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHN0YXR1czogJ3Vua25vd24nLCBhY3Rpdml0eTogJ3Vua25vd24nIH0pOwogICAgICAgIH0KCiAgICAgICAgRW1haWwgPSBFbWFpbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAvLyBDbGVhciBjYWNoZWQgcHJlc2VuY2UgZm9yIHRoaXMgZW1haWwKICAgICAgICBpZiAoQ2FjaGUuUHJlc2VuY2UgJiYgQ2FjaGUuUHJlc2VuY2VbRW1haWxdKSB7CiAgICAgICAgICAgIGRlbGV0ZSBDYWNoZS5QcmVzZW5jZVtFbWFpbF07CiAgICAgICAgfQoKICAgICAgICAvLyBGZXRjaCBmcmVzaCBwcmVzZW5jZQogICAgICAgIHJldHVybiBUYXJnZXROUy5HZXRQcmVzZW5jZShFbWFpbCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQ2xlYXJDYWNoZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ2xlYXIgYWxsIGNhY2hlcyBvciBzcGVjaWZpYyBjYWNoZSB0eXBlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFtUeXBlXSAtIE9wdGlvbmFsOiAnUHJlc2VuY2UnLCAnUHJvZmlsZXMnLCAnQXZhdGFycycuIElmIGVtcHR5LCBjbGVhcnMgYWxsLgogICAgICogQHBhcmFtIHtTdHJpbmd9IFtFbWFpbF0gLSBPcHRpb25hbDogQ2xlYXIgb25seSBmb3Igc3BlY2lmaWMgZW1haWwuCiAgICAgKi8KICAgIFRhcmdldE5TLkNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoVHlwZSwgRW1haWwpIHsKICAgICAgICBpZiAoRW1haWwpIHsKICAgICAgICAgICAgRW1haWwgPSBFbWFpbC50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFR5cGUgJiYgRW1haWwpIHsKICAgICAgICAgICAgLy8gQ2xlYXIgc3BlY2lmaWMgdHlwZSBhbmQgZW1haWwKICAgICAgICAgICAgaWYgKENhY2hlW1R5cGVdICYmIENhY2hlW1R5cGVdW0VtYWlsXSkgewogICAgICAgICAgICAgICAgZGVsZXRlIENhY2hlW1R5cGVdW0VtYWlsXTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoVHlwZSkgewogICAgICAgICAgICAvLyBDbGVhciBlbnRpcmUgdHlwZQogICAgICAgICAgICBDYWNoZVtUeXBlXSA9IHt9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENsZWFyIGFsbAogICAgICAgICAgICBDYWNoZS5BdmF0YXJzID0ge307CiAgICAgICAgICAgIENhY2hlLlByZXNlbmNlID0ge307CiAgICAgICAgICAgIENhY2hlLlByb2ZpbGVzID0ge307CiAgICAgICAgICAgIFVzZXJQcm92aWRlck1hcCA9IHt9OwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRQcm9maWxlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdXNlciBwcm9maWxlIGZvciBlbWFpbC4KICAgICAqICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoaWNoIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgdXNlci4KICAgICAqICAgICAgICAgICAgICBJZiBwcmltYXJ5IHByb3ZpZGVyIGtub3dzIHRoZSB1c2VyLCBhbGwgZGF0YSBjb21lcyBmcm9tIHByaW1hcnkuCiAgICAgKiAgICAgICAgICAgICAgSWYgbm90LCBhbGwgZGF0YSBjb21lcyBmcm9tIGZhbGxiYWNrIHByb3ZpZGVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gUHJvZmlsZSBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0UHJvZmlsZSA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIHZhciBEZWZhdWx0UHJvZmlsZSA9IHsgZGlzcGxheU5hbWU6IEVtYWlsLCBlbWFpbDogRW1haWwgfTsKCiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERlZmF1bHRQcm9maWxlKTsKICAgICAgICB9CgogICAgICAgIEVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gQ2hlY2sgY2FjaGUKICAgICAgICB2YXIgQ2FjaGVkID0gR2V0RnJvbUNhY2hlKCdQcm9maWxlcycsIEVtYWlsLCBDb25maWcuQ2FjaGUuUHJvZmlsZVRUTCk7CiAgICAgICAgaWYgKENhY2hlZCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENhY2hlZCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBmZWF0dXJlIGVuYWJsZWQKICAgICAgICBpZiAoIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ0hvdmVyQ2FyZHMnKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERlZmF1bHRQcm9maWxlKTsKICAgICAgICB9CgogICAgICAgIC8vIElmIG5vdCBsb2dnZWQgaW4gdG8gcHJpbWFyeSBwcm92aWRlciwgdXNlIGZhbGxiYWNrIHByb3ZpZGVyCiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0xvZ2dlZEluKCkpIHsKICAgICAgICAgICAgVXNlclByb3ZpZGVyTWFwW0VtYWlsLnRvTG93ZXJDYXNlKCldID0gJ2ZhbGxiYWNrJzsKICAgICAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXIgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMucHJvZmlsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEZhbGxiYWNrUHJvdmlkZXIuZ2V0UHJvZmlsZShFbWFpbCkKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnUHJvZmlsZXMnLCBFbWFpbCwgUHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9maWxlOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRQcm9maWxlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByb2ZpbGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgY2FwYWJpbGl0eQogICAgICAgIGlmICghVGFyZ2V0TlMuSGFzQ2FwYWJpbGl0eSgncHJvZmlsZScpKSB7CiAgICAgICAgICAgIFVzZXJQcm92aWRlck1hcFtFbWFpbC50b0xvd2VyQ2FzZSgpXSA9ICdmYWxsYmFjayc7CiAgICAgICAgICAgIGlmIChGYWxsYmFja1Byb3ZpZGVyICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzLnByb2ZpbGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBGYWxsYmFja1Byb3ZpZGVyLmdldFByb2ZpbGUoRW1haWwpCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKFByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ1Byb2ZpbGVzJywgRW1haWwsIFByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0UHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERlZmF1bHRQcm9maWxlKTsKICAgICAgICB9CgogICAgICAgIC8vIEdldCBmcm9tIHByaW1hcnkgcHJvdmlkZXIKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuZ2V0UHJvZmlsZShFbWFpbCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKFByb2ZpbGUpIHsKICAgICAgICAgICAgICAgIC8vIFByaW1hcnkgcHJvdmlkZXIga25vd3MgdGhpcyB1c2VyIC0gbWFyayBmb3IgYWxsIGZ1dHVyZSByZXF1ZXN0cwogICAgICAgICAgICAgICAgVXNlclByb3ZpZGVyTWFwW0VtYWlsLnRvTG93ZXJDYXNlKCldID0gJ3ByaW1hcnknOwogICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ1Byb2ZpbGVzJywgRW1haWwsIFByb2ZpbGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIFByb2ZpbGU7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IHByb3ZpZGVyIGRvZXNuJ3Qga25vdyB0aGlzIHVzZXIgLSB0cnkgZmFsbGJhY2sKICAgICAgICAgICAgICAgIFVzZXJQcm92aWRlck1hcFtFbWFpbC50b0xvd2VyQ2FzZSgpXSA9ICdmYWxsYmFjayc7CiAgICAgICAgICAgICAgICBpZiAoRmFsbGJhY2tQcm92aWRlciAmJiBGYWxsYmFja1Byb3ZpZGVyLmNhcGFiaWxpdGllcyAmJiBGYWxsYmFja1Byb3ZpZGVyLmNhcGFiaWxpdGllcy5wcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbGxiYWNrUHJvdmlkZXIuZ2V0UHJvZmlsZShFbWFpbCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKFByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldENhY2hlKCdQcm9maWxlcycsIEVtYWlsLCBQcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9maWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRQcm9maWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0UHJvZmlsZTsKICAgICAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0T3V0T2ZPZmZpY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlcHJlY2F0ZWQgVXNlIEdldFByZXNlbmNlKCkgYW5kIGNoZWNrIHByZXNlbmNlLmFjdGl2aXR5ID09PSAnT3V0T2ZPZmZpY2UnCiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gT09GIHN0YXR1cyBpcyBub3cgZW1iZWRkZWQgaW4gcHJlc2VuY2UgcmVzcG9uc2UuCiAgICAgKiAgICAgICAgICAgICAgVXNlIEdldFByZXNlbmNlKCkudGhlbihwID0+IHAub3V0T2ZPZmZpY2UpIGluc3RlYWQuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3R8bnVsbD59IE9PRiBvYmplY3QgZGVyaXZlZCBmcm9tIHByZXNlbmNlLCBvciBudWxsCiAgICAgKi8KICAgIFRhcmdldE5TLkdldE91dE9mT2ZmaWNlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVyaXZlIE9PRiBmcm9tIHByZXNlbmNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgICAgcmV0dXJuIFRhcmdldE5TLkdldFByZXNlbmNlKEVtYWlsKS50aGVuKGZ1bmN0aW9uIChQcmVzZW5jZSkgewogICAgICAgICAgICBpZiAoUHJlc2VuY2UgJiYgUHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScpIHsKICAgICAgICAgICAgICAgIHJldHVybiBQcmVzZW5jZS5vdXRPZk9mZmljZSB8fCB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnYWx3YXlzRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkU3RhcnREYXRlVGltZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRFbmREYXRlVGltZTogbnVsbAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gQ29tbXVuaWNhdGlvbiBMaW5rcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRDaGF0TGluawogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGNoYXQgZGVlcC1saW5rIGZvciBlbWFpbAogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ3xudWxsfSBDaGF0IFVSTCBvciBudWxsCiAgICAgKi8KICAgIFRhcmdldE5TLkdldENoYXRMaW5rID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCB8fCAhVGFyZ2V0TlMuSXNGZWF0dXJlRW5hYmxlZCgnQ2hhdCcpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuZ2V0Q2hhdExpbmspIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuZ2V0Q2hhdExpbmsoRW1haWwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldENhbGxMaW5rCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY2FsbCBkZWVwLWxpbmsgZm9yIGVtYWlsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9IENhbGwgVVJMIG9yIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0Q2FsbExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsIHx8ICFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdDYWxsJykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5nZXRDYWxsTGluaykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5nZXRDYWxsTGluayhFbWFpbCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0VXNlclByb3ZpZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtTdHJpbmd9ICdwcmltYXJ5JywgJ2ZhbGxiYWNrJywgb3IgJ3Vua25vd24nCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsCiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB3aGljaCBwcm92aWRlciBpcyB1c2VkIGZvciB0aGlzIHVzZXIuCiAgICAgKiAgICAgICAgICAgICAgT25seSB2YWxpZCBhZnRlciBHZXRQcm9maWxlKCkgd2FzIGNhbGxlZCBmb3IgdGhpcyBlbWFpbC4KICAgICAqICAgICAgICAgICAgICBVc2UgdGhpcyB0byBjaGVjayBpZiBUZWFtcyBhY3Rpb25zIHNob3VsZCBiZSBzaG93bi4KICAgICAqLwogICAgVGFyZ2V0TlMuR2V0VXNlclByb3ZpZGVyID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgcmV0dXJuICd1bmtub3duJzsKICAgICAgICByZXR1cm4gVXNlclByb3ZpZGVyTWFwW0VtYWlsLnRvTG93ZXJDYXNlKCldIHx8ICd1bmtub3duJzsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIE1lZXRpbmdzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEdldEZyZWVCdXN5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZnJlZS9idXN5IGluZm9ybWF0aW9uIGZvciB1c2VycwogICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBFbWFpbHMgLSBFbWFpbCBhZGRyZXNzZXMKICAgICAqIEBwYXJhbSB7RGF0ZX0gU3RhcnQgLSBTdGFydCB0aW1lCiAgICAgKiBAcGFyYW0ge0RhdGV9IEVuZCAtIEVuZCB0aW1lCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBGcmVlL2J1c3kgc2xvdHMKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0RnJlZUJ1c3kgPSBmdW5jdGlvbiAoRW1haWxzLCBTdGFydCwgRW5kKSB7CiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdNZWV0aW5ncycpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01lZXRpbmdzIGZlYXR1cmUgbm90IGVuYWJsZWQnKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIVRhcmdldE5TLkhhc0NhcGFiaWxpdHkoJ2ZyZWVCdXN5JykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBmcmVlL2J1c3knKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5nZXRGcmVlQnVzeSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBwcm92aWRlciBjb25maWd1cmVkJykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmdldEZyZWVCdXN5KEVtYWlscywgU3RhcnQsIEVuZCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQ3JlYXRlTWVldGluZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGFuIG9ubGluZSBtZWV0aW5nIChsZWdhY3kgLSB1c2UgQ3JlYXRlQ2FsZW5kYXJFdmVudCBpbnN0ZWFkKQogICAgICogQHBhcmFtIHtPYmplY3R9IERldGFpbHMgLSBNZWV0aW5nIGRldGFpbHMKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IE1lZXRpbmcgaW5mbyB3aXRoIGpvaW4gVVJMCiAgICAgKi8KICAgIFRhcmdldE5TLkNyZWF0ZU1lZXRpbmcgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIGlmICghVGFyZ2V0TlMuSXNGZWF0dXJlRW5hYmxlZCgnTWVldGluZ3MnKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdNZWV0aW5ncyBmZWF0dXJlIG5vdCBlbmFibGVkJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFUYXJnZXROUy5IYXNDYXBhYmlsaXR5KCdjcmVhdGVNZWV0aW5nJykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBtZWV0aW5nIGNyZWF0aW9uJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuY3JlYXRlTWVldGluZykgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBwcm92aWRlciBjb25maWd1cmVkJykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmNyZWF0ZU1lZXRpbmcoRGV0YWlscyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQ3JlYXRlQ2FsZW5kYXJFdmVudAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgY2FsZW5kYXIgZXZlbnQgKHdpdGggb3B0aW9uYWwgVGVhbXMgbWVldGluZykKICAgICAqICAgICAgICAgICAgICBVc2VzIEdyYXBoIEFQSSAvbWUvZXZlbnRzIHdoaWNoIHNlbmRzIGludml0YXRpb25zIGFuZCBhbGxvd3MgY2FuY2VsbGF0aW9uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGV0YWlscyAtIEV2ZW50IGRldGFpbHMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLnN1YmplY3QgLSBFdmVudCBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5zdGFydERhdGVUaW1lIC0gU3RhcnQgdGltZSAoSVNPIGZvcm1hdCkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLmVuZERhdGVUaW1lIC0gRW5kIHRpbWUgKElTTyBmb3JtYXQpCiAgICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IERldGFpbHMuYXR0ZW5kZWVzIC0gRW1haWwgYWRkcmVzc2VzIG9mIGF0dGVuZGVlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBEZXRhaWxzLmlzT25saW5lTWVldGluZyAtIFRydWUgZm9yIFRlYW1zIG1lZXRpbmcsIGZhbHNlIGZvciBvbi1zaXRlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5sb2NhdGlvbiAtIExvY2F0aW9uIChmb3Igb24tc2l0ZSBtZWV0aW5ncykKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEV2ZW50IGluZm8ge2lkLCBqb2luVXJsfQogICAgICovCiAgICBUYXJnZXROUy5DcmVhdGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKERldGFpbHMpIHsKICAgICAgICBpZiAoIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ01lZXRpbmdzJykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTWVldGluZ3MgZmVhdHVyZSBub3QgZW5hYmxlZCcpKTsKICAgICAgICB9CgogICAgICAgIGlmICghVGFyZ2V0TlMuSGFzQ2FwYWJpbGl0eSgnY3JlYXRlQ2FsZW5kYXJFdmVudCcpKSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGNyZWF0ZU1lZXRpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgIGlmIChEZXRhaWxzLmlzT25saW5lTWVldGluZyAmJiBUYXJnZXROUy5IYXNDYXBhYmlsaXR5KCdjcmVhdGVNZWV0aW5nJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXROUy5DcmVhdGVNZWV0aW5nKERldGFpbHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Byb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgY2FsZW5kYXIgZXZlbnRzJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuY3JlYXRlQ2FsZW5kYXJFdmVudCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBwcm92aWRlciBjb25maWd1cmVkJykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmNyZWF0ZUNhbGVuZGFyRXZlbnQoRGV0YWlscyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgRGVsZXRlQ2FsZW5kYXJFdmVudAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlL2NhbmNlbCBhIGNhbGVuZGFyIGV2ZW50IChzZW5kcyBjYW5jZWxsYXRpb24gdG8gYXR0ZW5kZWVzKQogICAgICogQHBhcmFtIHtTdHJpbmd9IEV2ZW50SWQgLSBHcmFwaCBBUEkgZXZlbnQgSUQKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFJlc3VsdCB7c3VjY2VzczogdHJ1ZX0KICAgICAqLwogICAgVGFyZ2V0TlMuRGVsZXRlQ2FsZW5kYXJFdmVudCA9IGZ1bmN0aW9uIChFdmVudElkKSB7CiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdNZWV0aW5ncycpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01lZXRpbmdzIGZlYXR1cmUgbm90IGVuYWJsZWQnKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIVRhcmdldE5TLkhhc0NhcGFiaWxpdHkoJ2RlbGV0ZUNhbGVuZGFyRXZlbnQnKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IGNhbGVuZGFyIGV2ZW50IGRlbGV0aW9uJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuZGVsZXRlQ2FsZW5kYXJFdmVudCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBwcm92aWRlciBjb25maWd1cmVkJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFFdmVudElkKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0V2ZW50SWQgaXMgcmVxdWlyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuZGVsZXRlQ2FsZW5kYXJFdmVudChFdmVudElkKTsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIEV2ZW50cwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBPbgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXIKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFdmVudCAtIEV2ZW50IG5hbWUgKGxvZ2luLCBsb2dvdXQsIHByZXNlbmNlQ2hhbmdlLCBlcnJvcikKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IENhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqLwogICAgVGFyZ2V0TlMuT24gPSBmdW5jdGlvbiAoRXZlbnQsIENhbGxiYWNrKSB7CiAgICAgICAgaWYgKEV2ZW50TGlzdGVuZXJzW0V2ZW50XSAmJiB0eXBlb2YgQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgRXZlbnRMaXN0ZW5lcnNbRXZlbnRdLnB1c2goQ2FsbGJhY2spOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBPZmYKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBldmVudCBsaXN0ZW5lcgogICAgICogQHBhcmFtIHtTdHJpbmd9IEV2ZW50IC0gRXZlbnQgbmFtZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgLSBDYWxsYmFjayB0byByZW1vdmUKICAgICAqLwogICAgVGFyZ2V0TlMuT2ZmID0gZnVuY3Rpb24gKEV2ZW50LCBDYWxsYmFjaykgewogICAgICAgIGlmIChFdmVudExpc3RlbmVyc1tFdmVudF0pIHsKICAgICAgICAgICAgdmFyIEluZGV4ID0gRXZlbnRMaXN0ZW5lcnNbRXZlbnRdLmluZGV4T2YoQ2FsbGJhY2spOwogICAgICAgICAgICBpZiAoSW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lcnNbRXZlbnRdLnNwbGljZShJbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0VXNlclRpbWVab25lCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIHVzZXIncyB0aW1lem9uZSBmcm9tIHRoZSBicm93c2VyCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBJQU5BIHRpbWV6b25lIHN0cmluZyAoZS5nLiwgJ0V1cm9wZS9CZXJsaW4nKQogICAgICovCiAgICBUYXJnZXROUy5HZXRVc2VyVGltZVpvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBicm93c2VycwogICAgICAgICAgICByZXR1cm4gJ1VUQyc7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBVdGlsaXR5IE1ldGhvZHMgKGZvciB1c2UgYnkgcHJvdmlkZXJzKQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRGYWxsYmFja0F2YXRhclVybAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcHVibGljCiAgICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGUgZmFsbGJhY2sgYXZhdGFyIFVSTCAoU1ZHIHdpdGggaW5pdGlhbHMpCiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2VudHJhbCBpbXBsZW1lbnRhdGlvbiAtIHByb3ZpZGVycyBzaG91bGQgdXNlIHRoaXMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MgZm9yIGNvbG9yIGFuZCBpbml0aWFscwogICAgICogQHBhcmFtIHtTdHJpbmd9IFtEaXNwbGF5TmFtZV0gLSBPcHRpb25hbCBkaXNwbGF5IG5hbWUgZm9yIGJldHRlciBpbml0aWFscwogICAgICogQHJldHVybnMge1N0cmluZ30gRGF0YSBVUkkgZm9yIFNWRyBhdmF0YXIKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0RmFsbGJhY2tBdmF0YXJVcmwgPSBmdW5jdGlvbiAoRW1haWwsIERpc3BsYXlOYW1lKSB7CiAgICAgICAgdmFyIEluaXRpYWxzID0gVGFyZ2V0TlMuR2V0SW5pdGlhbHMoRGlzcGxheU5hbWUgfHwgRW1haWwpOwogICAgICAgIHZhciBDb2xvciA9IFRhcmdldE5TLkdldENvbG9yRm9yRW1haWwoRW1haWwpOwoKICAgICAgICAvLyBTRUNVUklUWTogSW5pdGlhbHMgYXJlIGN1cnJlbnRseSBhbHdheXMgPD0yIGNoYXJhY3RlcnMgZnJvbQogICAgICAgIC8vIEdldEluaXRpYWxzKCksIHNvIHRoaXMgaXMgYSBuby1vcCB0b2RheSAtIGVzY2FwZWQgZGVmZW5zaXZlbHkKICAgICAgICAvLyBzbyBhIGZ1dHVyZSBjaGFuZ2UgdGhlcmUgY2FuJ3QgcmVvcGVuIGFuIFNWRy9IVE1MIGluamVjdGlvbgogICAgICAgIC8vIHZlY3RvciB0aHJvdWdoIHRoaXMgc3RyaW5nLWJ1aWx0IG1hcmt1cC4KICAgICAgICB2YXIgRXNjYXBlZEluaXRpYWxzID0gU3RyaW5nKEluaXRpYWxzKS5yZXBsYWNlKC9bJjw+IiddL2csIGZ1bmN0aW9uIChDaGFyKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJyInOiAnJnF1b3Q7JywgIiciOiAnJiMzOTsnCiAgICAgICAgICAgIH1bQ2hhcl07CiAgICAgICAgfSk7CgogICAgICAgIC8vIENyZWF0ZSBTVkcgZGF0YSBVUkkKICAgICAgICB2YXIgU1ZHID0gJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiPicgKwogICAgICAgICAgICAnPGNpcmNsZSBjeD0iMzIiIGN5PSIzMiIgcj0iMzIiIGZpbGw9IicgKyBDb2xvciArICciLz4nICsKICAgICAgICAgICAgJzx0ZXh0IHg9IjMyIiB5PSIzMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZHk9IjAuMzVlbSIgJyArCiAgICAgICAgICAgICdmaWxsPSIjZmZmIiBmb250LWZhbWlseT0iQXJpYWwsc2Fucy1zZXJpZiIgZm9udC1zaXplPSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+JyArCiAgICAgICAgICAgIEVzY2FwZWRJbml0aWFscyArICc8L3RleHQ+PC9zdmc+JzsKCiAgICAgICAgcmV0dXJuICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCcgKyBidG9hKFNWRyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0SW5pdGlhbHMKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQHB1YmxpYwogICAgICogQGRlc2NyaXB0aW9uIEdldCBpbml0aWFscyBmcm9tIG5hbWUgb3IgZW1haWwKICAgICAqICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjZW50cmFsIGltcGxlbWVudGF0aW9uIC0gcHJvdmlkZXJzIHNob3VsZCB1c2UgdGhpcwogICAgICogQHBhcmFtIHtTdHJpbmd9IE5hbWVPckVtYWlsIC0gRGlzcGxheSBuYW1lIG9yIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IDEtMiBjaGFyYWN0ZXIgaW5pdGlhbHMKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0SW5pdGlhbHMgPSBmdW5jdGlvbiAoTmFtZU9yRW1haWwpIHsKICAgICAgICBpZiAoIU5hbWVPckVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiAnPyc7CiAgICAgICAgfQoKICAgICAgICAvLyBSZW1vdmUgZW1haWwgZG9tYWluIGlmIHByZXNlbnQKICAgICAgICB2YXIgTmFtZSA9IE5hbWVPckVtYWlsLnNwbGl0KCdAJylbMF07CgogICAgICAgIC8vIFNwbGl0IGJ5IGNvbW1vbiBzZXBhcmF0b3JzIChzcGFjZSwgZG90LCB1bmRlcnNjb3JlLCBoeXBoZW4pCiAgICAgICAgdmFyIFBhcnRzID0gTmFtZS5zcGxpdCgvW1xzLl8tXSsvKTsKCiAgICAgICAgaWYgKFBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgIC8vIFVzZSBmaXJzdCBhbmQgbGFzdCBwYXJ0IGZvciBpbml0aWFscwogICAgICAgICAgICByZXR1cm4gKFBhcnRzWzBdWzBdICsgUGFydHNbUGFydHMubGVuZ3RoIC0gMV1bMF0pLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfSBlbHNlIGlmIChQYXJ0c1swXS5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXR1cm4gUGFydHNbMF0uc3Vic3RyaW5nKDAsIDIpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFBhcnRzWzBdLnRvVXBwZXJDYXNlKCkgfHwgJz8nOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRDb2xvckZvckVtYWlsCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwdWJsaWMKICAgICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZSBjb25zaXN0ZW50IGNvbG9yIGZvciBlbWFpbAogICAgICogICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNlbnRyYWwgaW1wbGVtZW50YXRpb24gLSBwcm92aWRlcnMgc2hvdWxkIHVzZSB0aGlzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBIZXggY29sb3IgY29kZQogICAgICovCiAgICBUYXJnZXROUy5HZXRDb2xvckZvckVtYWlsID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgdmFyIENvbG9ycyA9IFsKICAgICAgICAgICAgJyM2MDdkOGInLCAnIzc5NTU0OCcsICcjOWMyN2IwJywgJyM2NzNhYjcnLAogICAgICAgICAgICAnIzNmNTFiNScsICcjMjE5NmYzJywgJyMwMDk2ODgnLCAnIzRjYWY1MCcsCiAgICAgICAgICAgICcjZmY5ODAwJywgJyNmZjU3MjInLCAnI2U5MWU2MycsICcjMDBiY2Q0JwogICAgICAgIF07CgogICAgICAgIGlmICghRW1haWwpIHsKICAgICAgICAgICAgcmV0dXJuIENvbG9yc1swXTsKICAgICAgICB9CgogICAgICAgIC8vIFNpbXBsZSBoYXNoCiAgICAgICAgdmFyIEhhc2ggPSAwOwogICAgICAgIHZhciBTdHIgPSBFbWFpbC50b0xvd2VyQ2FzZSgpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIEhhc2ggPSAoKEhhc2ggPDwgNSkgLSBIYXNoKSArIFN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBIYXNoID0gSGFzaCAmIEhhc2g7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQ29sb3JzW01hdGguYWJzKEhhc2gpICUgQ29sb3JzLmxlbmd0aF07CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gTG9hZCBjb25maWd1cmF0aW9uIGZyb20gWm51bnkncyBDb3JlLkNvbmZpZwogICAgICovCiAgICBmdW5jdGlvbiBMb2FkQ29uZmlnRnJvbVpudW55KCkgewogICAgICAgIGlmICh0eXBlb2YgQ29yZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQ29yZS5Db25maWcgJiYgQ29yZS5Db25maWcuR2V0KSB7CiAgICAgICAgICAgIHZhciBabnVueUNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ29sbGFib3JhdGlvbicpOwogICAgICAgICAgICBpZiAoWm51bnlDb25maWcpIHsKICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIENvbmZpZywgWm51bnlDb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBUcnkgc2lsZW50IGxvZ2luIChTU08pCiAgICAgKi8KICAgIGZ1bmN0aW9uIFRyeVNpbGVudExvZ2luKCkgewogICAgICAgIGlmICghQWN0aXZlUHJvdmlkZXIgfHwgIUFjdGl2ZVByb3ZpZGVyLnRyeVNpbGVudExvZ2luKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIEFjdGl2ZVByb3ZpZGVyLnRyeVNpbGVudExvZ2luKCkudGhlbihmdW5jdGlvbiAoVXNlcikgewogICAgICAgICAgICBpZiAoVXNlcikgewogICAgICAgICAgICAgICAgVHJpZ2dlckV2ZW50KCdsb2dpbicsIFVzZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyBTaWxlbnQgbG9naW4gZmFpbGVkIC0gdGhpcyBpcyBleHBlY3RlZCwgdXNlciBuZWVkcyB0byBsb2dpbiBtYW51YWxseQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBUcmlnZ2VyIGFuIGV2ZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIFRyaWdnZXJFdmVudChFdmVudCwgRGF0YSkgewogICAgICAgIC8vIENsZWFyIGNhY2hlIG9uIGxvZ2luIHRvIGVuc3VyZSBmcmVzaCBkYXRhIGZyb20gdGhlIG5ldyBwcm92aWRlciBjb250ZXh0CiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBmYWxsYmFjayBhdmF0YXJzIGZyb20gYmVpbmcgdXNlZCBhZnRlciBNMzY1IGxvZ2luCiAgICAgICAgaWYgKEV2ZW50ID09PSAnbG9naW4nKSB7CiAgICAgICAgICAgIENsZWFyQ2FjaGUoKTsKICAgICAgICB9CgogICAgICAgIGlmIChFdmVudExpc3RlbmVyc1tFdmVudF0pIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBFdmVudExpc3RlbmVyc1tFdmVudF0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lcnNbRXZlbnRdW2ldKERhdGEpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgaXRlbSBmcm9tIGNhY2hlIGlmIG5vdCBleHBpcmVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldEZyb21DYWNoZShUeXBlLCBLZXksIFRUTCkgewogICAgICAgIGlmICghQ2FjaGVbVHlwZV0gfHwgIUNhY2hlW1R5cGVdW0tleV0pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgRW50cnkgPSBDYWNoZVtUeXBlXVtLZXldOwogICAgICAgIHZhciBOb3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTsKCiAgICAgICAgaWYgKE5vdyAtIEVudHJ5LnRpbWUgPiBUVEwpIHsKICAgICAgICAgICAgZGVsZXRlIENhY2hlW1R5cGVdW0tleV07CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEVudHJ5LnZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgaXRlbSBpbiBjYWNoZQogICAgICovCiAgICBmdW5jdGlvbiBTZXRDYWNoZShUeXBlLCBLZXksIFZhbHVlKSB7CiAgICAgICAgaWYgKCFDYWNoZVtUeXBlXSkgewogICAgICAgICAgICBDYWNoZVtUeXBlXSA9IHt9OwogICAgICAgIH0KCiAgICAgICAgQ2FjaGVbVHlwZV1bS2V5XSA9IHsKICAgICAgICAgICAgdmFsdWU6IFZhbHVlLAogICAgICAgICAgICB0aW1lOiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKQogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENsZWFyIGFsbCBjYWNoZXMgYW5kIHBlbmRpbmcgcmVxdWVzdHMKICAgICAqICAgICAgICAgICAgICBDYWxsZWQgb24gbG9naW4vbG9nb3V0IHRvIGVuc3VyZSBmcmVzaCBkYXRhCiAgICAgKiAgICAgICAgICAgICAgUGVuZGluZ1JlcXVlc3RzIE1VU1QgYmUgY2xlYXJlZCBvbiBsb2dpbiBiZWNhdXNlOgogICAgICogICAgICAgICAgICAgIC0gUmVxdWVzdHMgc3RhcnRlZCBiZWZvcmUgbG9naW4gdXNlIHRoZSBmYWxsYmFjayBwcm92aWRlcgogICAgICogICAgICAgICAgICAgIC0gQWZ0ZXIgbG9naW4sIHdlIHdhbnQgZnJlc2ggcmVxdWVzdHMgdXNpbmcgTTM2NSBwcm92aWRlcgogICAgICogICAgICAgICAgICAgIC0gSWYgd2UgZG9uJ3QgY2xlYXIsIHRoZSBvbGQgcHJvbWlzZXMgYXJlIHJldXNlZCBhbmQgcmV0dXJuIHN0YWxlIGRhdGEKICAgICAqLwogICAgZnVuY3Rpb24gQ2xlYXJDYWNoZSgpIHsKICAgICAgICBDYWNoZS5BdmF0YXJzID0ge307CiAgICAgICAgQ2FjaGUuUHJlc2VuY2UgPSB7fTsKICAgICAgICBDYWNoZS5Qcm9maWxlcyA9IHt9OwogICAgICAgIFVzZXJQcm92aWRlck1hcCA9IHt9OwogICAgICAgIC8vIENsZWFyIHBlbmRpbmcgcmVxdWVzdHMgc28gbmV3IGNhbGxzIGFmdGVyIGxvZ2luIGNyZWF0ZSBmcmVzaCByZXF1ZXN0cwogICAgICAgIFBlbmRpbmdSZXF1ZXN0cy5BdmF0YXJzID0ge307CiAgICAgICAgUGVuZGluZ1JlcXVlc3RzLlByZXNlbmNlID0ge307CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIFVJIE5vdGlmaWNhdGlvbnMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgU2hvd0Vycm9yCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGFuIGVycm9yIG1lc3NhZ2UgaW4gWm51bnkgTWVzc2FnZUJveCBzdHlsZQogICAgICogQHBhcmFtIHtTdHJpbmd9IE1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkKICAgICAqLwogICAgVGFyZ2V0TlMuU2hvd0Vycm9yID0gZnVuY3Rpb24gKE1lc3NhZ2UpIHsKICAgICAgICBTaG93TWVzc2FnZUJveCgnRXJyb3InLCBNZXNzYWdlKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93V2FybmluZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBhIHdhcm5pbmcgbWVzc2FnZSBpbiBabnVueSBNZXNzYWdlQm94IHN0eWxlCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTWVzc2FnZSAtIFdhcm5pbmcgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dXYXJuaW5nID0gZnVuY3Rpb24gKE1lc3NhZ2UpIHsKICAgICAgICBTaG93TWVzc2FnZUJveCgnV2FybmluZycsIE1lc3NhZ2UpOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uIHx8IHt9KSk7Cg==</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.UI.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICogQGRlc2NyaXB0aW9uCiAqICAgICAgVUkgQ29tcG9uZW50cyBmb3IgQ29sbGFib3JhdGlvbiBBZGQtb24KICoKICogICAgICBDb21wb25lbnRzOgogKiAgICAgIC0gQXZhdGFyIHdpdGggUHJlc2VuY2UgaW5kaWNhdG9yCiAqICAgICAgLSBIb3ZlciBDYXJkIChQZXJzb24gQ2FyZCkKICogICAgICAtIEhlYWRlciBMb2dpbiBCdXR0b24KICogICAgICAtIFRpY2tldCBab29tIEFjdGlvbnMgV2lkZ2V0CiAqICAgICAgLSBNZWV0aW5nIFNjaGVkdWxlciBEaWFsb2cKICogICAgICAtIENoYXQgRXhwb3J0IERpYWxvZwogKi8KdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIHZhciBDb2xsYWIgPSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb247CiAgICB2YXIgSG92ZXJDYXJkVGltZW91dCA9IG51bGw7CiAgICB2YXIgQWN0aXZlSG92ZXJDYXJkID0gbnVsbDsKICAgIHZhciBIb3ZlckNhcmREZWxheSA9IDMwMDsgLy8gbXMgYmVmb3JlIHNob3dpbmcgaG92ZXIgY2FyZAogICAgdmFyIEN1c3RvbWVySW5mb1dpZGdldEluaXRpYWxpemVkID0gZmFsc2U7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcmVzZW5jZSBTdGF0dXMgTWFwcGluZwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgdmFyIFByZXNlbmNlTWFwID0gewogICAgICAgICdhdmFpbGFibGUnOiB7IGNsYXNzOiAnYXZhaWxhYmxlJywgbGFiZWw6ICdBdmFpbGFibGUnIH0sCiAgICAgICAgJ2J1c3knOiB7IGNsYXNzOiAnYnVzeScsIGxhYmVsOiAnQnVzeScgfSwKICAgICAgICAnZG5kJzogeyBjbGFzczogJ2RuZCcsIGxhYmVsOiAnRG8gbm90IGRpc3R1cmInIH0sCiAgICAgICAgJ2Rvbm90ZGlzdHVyYic6IHsgY2xhc3M6ICdkbmQnLCBsYWJlbDogJ0RvIG5vdCBkaXN0dXJiJyB9LAogICAgICAgICdhd2F5JzogeyBjbGFzczogJ2F3YXknLCBsYWJlbDogJ0F3YXknIH0sCiAgICAgICAgJ2JlcmlnaHRiYWNrJzogeyBjbGFzczogJ2JlcmlnaHRiYWNrJywgbGFiZWw6ICdCZSByaWdodCBiYWNrJyB9LAogICAgICAgICdvZmZsaW5lJzogeyBjbGFzczogJ29mZmxpbmUnLCBsYWJlbDogJ09mZmxpbmUnIH0sCiAgICAgICAgJ3ByZXNlbmNldW5rbm93bic6IHsgY2xhc3M6ICd1bmtub3duJywgbGFiZWw6ICdVbmtub3duJyB9LAogICAgICAgICd1bmtub3duJzogeyBjbGFzczogJ3Vua25vd24nLCBsYWJlbDogJ1Vua25vd24nIH0sCiAgICAgICAgJ2luY2FsbCc6IHsgY2xhc3M6ICdidXN5JywgbGFiZWw6ICdJbiBhIGNhbGwnIH0sCiAgICAgICAgJ2luYWNhbGwnOiB7IGNsYXNzOiAnYnVzeScsIGxhYmVsOiAnSW4gYSBjYWxsJyB9LAogICAgICAgICdpbmFtZWV0aW5nJzogeyBjbGFzczogJ2J1c3knLCBsYWJlbDogJ0luIGEgbWVldGluZycgfSwKICAgICAgICAncHJlc2VudGluZyc6IHsgY2xhc3M6ICdidXN5JywgbGFiZWw6ICdQcmVzZW50aW5nJyB9CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kYWwgRGlhbG9nIEZ1bmN0aW9ucwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93RGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGEgc3R5bGVkIG1vZGFsIGRpYWxvZyAocmVwbGFjZXMgYnJvd3NlciBhbGVydCkKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLnRpdGxlIC0gRGlhbG9nIHRpdGxlIChvcHRpb25hbCkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLm1lc3NhZ2UgLSBNYWluIG1lc3NhZ2UgdGV4dAogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMuZGV0YWlsIC0gQWRkaXRpb25hbCBkZXRhaWwgdGV4dCAob3B0aW9uYWwsIHNob3duIGluIHNtYWxsZXIgZm9udCkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLnR5cGUgLSBEaWFsb2cgdHlwZTogJ2luZm8nLCAnc3VjY2VzcycsICdlcnJvcicsICd3YXJuaW5nJwogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMuYnV0dG9uVGV4dCAtIE9LIGJ1dHRvbiB0ZXh0IChkZWZhdWx0OiAnT0snKQogICAgICogQHBhcmFtIHtBcnJheX0gT3B0aW9ucy5idXR0b25zIC0gQ3VzdG9tIGFjdGlvbiBidXR0b25zIFt7dGV4dCwgaWNvbiwgb25DbGljaywgY2xhc3N9XQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gT3B0aW9ucy5vbkNsb3NlIC0gQ2FsbGJhY2sgd2hlbiBkaWFsb2cgY2xvc2VzCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dEaWFsb2cgPSBmdW5jdGlvbihPcHRpb25zKSB7CiAgICAgICAgT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgICAgICAgICAgdGl0bGU6ICcnLAogICAgICAgICAgICBtZXNzYWdlOiAnJywKICAgICAgICAgICAgZGV0YWlsOiAnJywKICAgICAgICAgICAgdHlwZTogJ2luZm8nLAogICAgICAgICAgICBidXR0b25UZXh0OiAnT0snLAogICAgICAgICAgICBidXR0b25zOiBbXSwKICAgICAgICAgICAgb25DbG9zZTogbnVsbAogICAgICAgIH0sIE9wdGlvbnMpOwoKICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXN0aW5nIGRpYWxvZwogICAgICAgICQoJy5Db2xsYWJEaWFsb2ctb3ZlcmxheScpLnJlbW92ZSgpOwoKICAgICAgICAvLyBJY29uIGJhc2VkIG9uIHR5cGUKICAgICAgICB2YXIgSWNvbkNsYXNzID0gJ2ZhLWluZm8tY2lyY2xlJzsKICAgICAgICBpZiAoT3B0aW9ucy50eXBlID09PSAnc3VjY2VzcycpIEljb25DbGFzcyA9ICdmYS1jaGVjay1jaXJjbGUnOwogICAgICAgIGVsc2UgaWYgKE9wdGlvbnMudHlwZSA9PT0gJ2Vycm9yJykgSWNvbkNsYXNzID0gJ2ZhLWV4Y2xhbWF0aW9uLWNpcmNsZSc7CiAgICAgICAgZWxzZSBpZiAoT3B0aW9ucy50eXBlID09PSAnd2FybmluZycpIEljb25DbGFzcyA9ICdmYS1leGNsYW1hdGlvbi10cmlhbmdsZSc7CgogICAgICAgIC8vIEJ1aWxkIGN1c3RvbSBidXR0b25zIEhUTUwKICAgICAgICB2YXIgQ3VzdG9tQnV0dG9uc0hUTUwgPSAnJzsKICAgICAgICBpZiAoT3B0aW9ucy5idXR0b25zICYmIE9wdGlvbnMuYnV0dG9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIEN1c3RvbUJ1dHRvbnNIVE1MID0gJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19fYWN0aW9ucyI+JzsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBPcHRpb25zLmJ1dHRvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBCdG4gPSBPcHRpb25zLmJ1dHRvbnNbaV07CiAgICAgICAgICAgICAgICB2YXIgQnRuQ2xhc3MgPSBCdG4uY2xhc3MgfHwgJ0NvbGxhYkRpYWxvZ19fYWN0aW9uQnRuJzsKICAgICAgICAgICAgICAgIHZhciBJY29uSFRNTCA9IEJ0bi5pY29uID8gJzxpIGNsYXNzPSJmYSAnICsgQnRuLmljb24gKyAnIj48L2k+ICcgOiAnJzsKICAgICAgICAgICAgICAgIEN1c3RvbUJ1dHRvbnNIVE1MICs9ICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicgKyBCdG5DbGFzcyArICciIGRhdGEtYWN0aW9uLWluZGV4PSInICsgaSArICciPicgKwogICAgICAgICAgICAgICAgICAgIEljb25IVE1MICsgRXNjYXBlSHRtbChCdG4udGV4dCkgKyAnPC9idXR0b24+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBDdXN0b21CdXR0b25zSFRNTCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIEJ1aWxkIGRpYWxvZyBIVE1MCiAgICAgICAgdmFyIERpYWxvZ0hUTUwgPSAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nLW92ZXJsYXkiPicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nIENvbGxhYkRpYWxvZy0tJyArIE9wdGlvbnMudHlwZSArICciPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19faGVhZGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhICcgKyBJY29uQ2xhc3MgKyAnIENvbGxhYkRpYWxvZ19faWNvbiI+PC9pPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iQ29sbGFiRGlhbG9nX190aXRsZSI+JyArIChPcHRpb25zLnRpdGxlIHx8IEdldERpYWxvZ1RpdGxlKE9wdGlvbnMudHlwZSkpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDb2xsYWJEaWFsb2dfX2Nsb3NlIiBhcmlhLWxhYmVsPSJDbG9zZSI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19ib2R5Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19tZXNzYWdlIj4nICsgRXNjYXBlSHRtbChPcHRpb25zLm1lc3NhZ2UpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgIChPcHRpb25zLmRldGFpbCA/ICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2dfX2RldGFpbCI+JyArIEVzY2FwZUh0bWwoT3B0aW9ucy5kZXRhaWwpICsgJzwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgIEN1c3RvbUJ1dHRvbnNIVE1MICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2dfX2Zvb3RlciI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iQ29sbGFiRGlhbG9nX19idG4gQ29sbGFiRGlhbG9nX19idG4tLXByaW1hcnkiPicgKyBFc2NhcGVIdG1sKE9wdGlvbnMuYnV0dG9uVGV4dCkgKyAnPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgdmFyICREaWFsb2cgPSAkKERpYWxvZ0hUTUwpOwogICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJERpYWxvZyk7CgogICAgICAgIC8vIEZvY3VzIHRoZSBPSyBidXR0b24KICAgICAgICAkRGlhbG9nLmZpbmQoJy5Db2xsYWJEaWFsb2dfX2J0bi0tcHJpbWFyeScpLmZvY3VzKCk7CgogICAgICAgIC8vIENsb3NlIGhhbmRsZXJzCiAgICAgICAgZnVuY3Rpb24gQ2xvc2VEaWFsb2coKSB7CiAgICAgICAgICAgICREaWFsb2cuYWRkQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5LS1jbG9zaW5nJyk7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9mZigna2V5ZG93bi5jb2xsYWJEaWFsb2cnKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICREaWFsb2cucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBpZiAoT3B0aW9ucy5vbkNsb3NlKSB7CiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucy5vbkNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDdXN0b20gYWN0aW9uIGJ1dHRvbiBoYW5kbGVycwogICAgICAgICREaWFsb2cuZmluZCgnLkNvbGxhYkRpYWxvZ19fYWN0aW9ucyBidXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIEluZGV4ID0gcGFyc2VJbnQoJCh0aGlzKS5hdHRyKCdkYXRhLWFjdGlvbi1pbmRleCcpLCAxMCk7CiAgICAgICAgICAgIHZhciBCdG4gPSBPcHRpb25zLmJ1dHRvbnNbSW5kZXhdOwogICAgICAgICAgICBpZiAoQnRuICYmIEJ0bi5vbkNsaWNrKSB7CiAgICAgICAgICAgICAgICBCdG4ub25DbGljaygkRGlhbG9nLCBDbG9zZURpYWxvZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJERpYWxvZy5maW5kKCcuQ29sbGFiRGlhbG9nX19jbG9zZSwgLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5Jykub24oJ2NsaWNrJywgQ2xvc2VEaWFsb2cpOwogICAgICAgICREaWFsb2cub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5JykpIHsKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gRVNDIGtleSB0byBjbG9zZQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duLmNvbGxhYkRpYWxvZycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQW5pbWF0ZSBpbgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICREaWFsb2cuYWRkQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5LS12aXNpYmxlJyk7CiAgICAgICAgfSwgMTApOwoKICAgICAgICByZXR1cm4gJERpYWxvZzsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93Q29uZmlybURpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBhIHN0eWxlZCBjb25maXJtYXRpb24gZGlhbG9nIChyZXBsYWNlcyBicm93c2VyIGNvbmZpcm0pCiAgICAgKiBAcGFyYW0ge09iamVjdH0gT3B0aW9ucyAtIERpYWxvZyBvcHRpb25zCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gT3B0aW9ucy50aXRsZSAtIERpYWxvZyB0aXRsZSAob3B0aW9uYWwpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gT3B0aW9ucy5tZXNzYWdlIC0gTWFpbiBtZXNzYWdlIHRleHQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLmNvbmZpcm1UZXh0IC0gQ29uZmlybSBidXR0b24gdGV4dCAoZGVmYXVsdDogJ09LJykKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLmNhbmNlbFRleHQgLSBDYW5jZWwgYnV0dG9uIHRleHQgKGRlZmF1bHQ6ICdBYmJyZWNoZW4nKQogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMudHlwZSAtIERpYWxvZyB0eXBlOiAnd2FybmluZycsICdkYW5nZXInCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBPcHRpb25zLm9uQ29uZmlybSAtIENhbGxiYWNrIHdoZW4gY29uZmlybWVkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBPcHRpb25zLm9uQ2FuY2VsIC0gQ2FsbGJhY2sgd2hlbiBjYW5jZWxsZWQKICAgICAqLwogICAgVGFyZ2V0TlMuU2hvd0NvbmZpcm1EaWFsb2cgPSBmdW5jdGlvbihPcHRpb25zKSB7CiAgICAgICAgT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgICAgICAgICAgdGl0bGU6ICcnLAogICAgICAgICAgICBtZXNzYWdlOiAnJywKICAgICAgICAgICAgY29uZmlybVRleHQ6ICdPSycsCiAgICAgICAgICAgIGNhbmNlbFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwnKSwKICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICBvbkNvbmZpcm06IG51bGwsCiAgICAgICAgICAgIG9uQ2FuY2VsOiBudWxsCiAgICAgICAgfSwgT3B0aW9ucyk7CgogICAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgZGlhbG9nCiAgICAgICAgJCgnLkNvbGxhYkRpYWxvZy1vdmVybGF5JykucmVtb3ZlKCk7CgogICAgICAgIC8vIEljb24gYmFzZWQgb24gdHlwZQogICAgICAgIHZhciBJY29uQ2xhc3MgPSAnZmEtcXVlc3Rpb24tY2lyY2xlJzsKICAgICAgICBpZiAoT3B0aW9ucy50eXBlID09PSAnZGFuZ2VyJykgSWNvbkNsYXNzID0gJ2ZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJzsKCiAgICAgICAgLy8gQnVpbGQgZGlhbG9nIEhUTUwKICAgICAgICB2YXIgRGlhbG9nSFRNTCA9ICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2ctb3ZlcmxheSI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2cgQ29sbGFiRGlhbG9nLS1jb25maXJtIENvbGxhYkRpYWxvZy0tJyArIE9wdGlvbnMudHlwZSArICciPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19faGVhZGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhICcgKyBJY29uQ2xhc3MgKyAnIENvbGxhYkRpYWxvZ19faWNvbiI+PC9pPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iQ29sbGFiRGlhbG9nX190aXRsZSI+JyArIChPcHRpb25zLnRpdGxlIHx8IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb25maXJtJykpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDb2xsYWJEaWFsb2dfX2Nsb3NlIiBhcmlhLWxhYmVsPSJDbG9zZSI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19ib2R5Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19tZXNzYWdlIj4nICsgRXNjYXBlSHRtbChPcHRpb25zLm1lc3NhZ2UpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19fZm9vdGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDb2xsYWJEaWFsb2dfX2J0biBDb2xsYWJEaWFsb2dfX2J0bi0tc2Vjb25kYXJ5Ij4nICsgRXNjYXBlSHRtbChPcHRpb25zLmNhbmNlbFRleHQpICsgJzwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IkNvbGxhYkRpYWxvZ19fYnRuIENvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5Ij4nICsgRXNjYXBlSHRtbChPcHRpb25zLmNvbmZpcm1UZXh0KSArICc8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8L2Rpdj4nOwoKICAgICAgICB2YXIgJERpYWxvZyA9ICQoRGlhbG9nSFRNTCk7CiAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkRGlhbG9nKTsKCiAgICAgICAgLy8gRm9jdXMgdGhlIGNvbmZpcm0gYnV0dG9uCiAgICAgICAgJERpYWxvZy5maW5kKCcuQ29sbGFiRGlhbG9nX19idG4tLXByaW1hcnknKS5mb2N1cygpOwoKICAgICAgICAvLyBDbG9zZSBoYW5kbGVycwogICAgICAgIGZ1bmN0aW9uIENsb3NlRGlhbG9nKGNvbmZpcm1lZCkgewogICAgICAgICAgICAkRGlhbG9nLmFkZENsYXNzKCdDb2xsYWJEaWFsb2ctb3ZlcmxheS0tY2xvc2luZycpOwogICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24uY29sbGFiRGlhbG9nJyk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkRGlhbG9nLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCAmJiBPcHRpb25zLm9uQ29uZmlybSkgewogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMub25Db25maXJtKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjb25maXJtZWQgJiYgT3B0aW9ucy5vbkNhbmNlbCkgewogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMub25DYW5jZWwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICB9CgogICAgICAgICREaWFsb2cuZmluZCgnLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7IENsb3NlRGlhbG9nKHRydWUpOyB9KTsKICAgICAgICAkRGlhbG9nLmZpbmQoJy5Db2xsYWJEaWFsb2dfX2J0bi0tc2Vjb25kYXJ5LCAuQ29sbGFiRGlhbG9nX19jbG9zZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBDbG9zZURpYWxvZyhmYWxzZSk7IH0pOwogICAgICAgICREaWFsb2cub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5JykpIHsKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBFU0MgdG8gY2FuY2VsLCBFbnRlciB0byBjb25maXJtCiAgICAgICAgJChkb2N1bWVudCkub24oJ2tleWRvd24uY29sbGFiRGlhbG9nJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykgeyAvLyBFU0MKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKGZhbHNlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDEzKSB7IC8vIEVudGVyCiAgICAgICAgICAgICAgICBDbG9zZURpYWxvZyh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBBbmltYXRlIGluCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgJERpYWxvZy5hZGRDbGFzcygnQ29sbGFiRGlhbG9nLW92ZXJsYXktLXZpc2libGUnKTsKICAgICAgICB9LCAxMCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZGVmYXVsdCBkaWFsb2cgdGl0bGUgYmFzZWQgb24gdHlwZQogICAgICovCiAgICBmdW5jdGlvbiBHZXREaWFsb2dUaXRsZShUeXBlKSB7CiAgICAgICAgc3dpdGNoIChUeXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3N1Y2Nlc3MnOiByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1Y2Nlc3MnKTsKICAgICAgICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Vycm9yJyk7CiAgICAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOiByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dhcm5pbmcnKTsKICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdJbmZvcm1hdGlvbicpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRXNjYXBlIEhUTUwgdG8gcHJldmVudCBYU1MKICAgICAqLwogICAgZnVuY3Rpb24gRXNjYXBlSHRtbChUZXh0KSB7CiAgICAgICAgaWYgKCFUZXh0KSByZXR1cm4gJyc7CiAgICAgICAgcmV0dXJuIFN0cmluZyhUZXh0KQogICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JykKICAgICAgICAgICAgLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzAzOTsnKQogICAgICAgICAgICAucmVwbGFjZSgvXG4vZywgJzxicj4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSB0ZXh0IHRvIGNsaXBib2FyZAogICAgICovCiAgICBmdW5jdGlvbiBDb3B5VG9DbGlwYm9hcmQoVGV4dCkgewogICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KFRleHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBicm93c2VycwogICAgICAgICAgICB2YXIgJFRlbXAgPSAkKCc8dGV4dGFyZWE+JykudmFsKFRleHQpLmFwcGVuZFRvKCdib2R5Jykuc2VsZWN0KCk7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7CiAgICAgICAgICAgICRUZW1wLnJlbW92ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gSW5pdGlhbGl6YXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZSBVSSBjb21wb25lbnRzCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgQ29sbGFib3JhdGlvbiBjb25maWcgd2FzIGluamVjdGVkIGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgb24gYXV0aGVudGljYXRlZCBwYWdlcykKICAgICAgICAvLyBUaGUgT3V0cHV0IEZpbHRlciBzZXRzIENvcmUuQ29uZmlnLkNvbGxhYm9yYXRpb24gb25seSBmb3IgbG9nZ2VkLWluIHVzZXJzCiAgICAgICAgdmFyIFNlcnZlckNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ29sbGFib3JhdGlvbicpOwogICAgICAgIGlmICghU2VydmVyQ29uZmlnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBDb25maWcgPSBDb2xsYWIuR2V0Q29uZmlnKCk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzCiAgICAgICAgQ29sbGFiLk9uKCdsb2dpbicsIE9uTG9naW4pOwogICAgICAgIENvbGxhYi5PbignbG9nb3V0JywgT25Mb2dvdXQpOwoKICAgICAgICAvLyBJbml0aWFsaXplIGhlYWRlciBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKENvbmZpZy5TaG93SW5IZWFkZXIpIHsKICAgICAgICAgICAgSW5pdEhlYWRlcigpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2V0dXAgZ2xvYmFsIGhvdmVyIGNhcmQgaGFuZGxlcgogICAgICAgIFNldHVwSG92ZXJDYXJkSGFuZGxlcigpOwoKICAgICAgICAvLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZAogICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gUHJvY2VzcyBleGlzdGluZyBhdmF0YXJzIG9uIHBhZ2UKICAgICAgICAgICAgUHJvY2Vzc0F2YXRhcnNPblBhZ2UoKTsKCiAgICAgICAgICAgIC8vIFByb2Nlc3MgbmF0aXZlIGFydGljbGUgYXZhdGFycyBpbiB0aWNrZXQgem9vbQogICAgICAgICAgICBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMoKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY3VzdG9tZXIgaW5mbyB3aWRnZXQgaWYgb24gdGlja2V0IHBhZ2UKICAgICAgICAgICAgLy8gTm90ZTogWm51bnkgc3RvcmVzIFRpY2tldElEIGluIENvcmUuQ29uZmlnLCBub3QgYXMgYSBET00gZWxlbWVudAogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdUaWNrZXRJRCcpKSB7CiAgICAgICAgICAgICAgICBJbml0Q3VzdG9tZXJJbmZvV2lkZ2V0KCk7CgogICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBvd25lci9yZXNwb25zaWJsZSBhdmF0YXJzIGluIFRpY2tldCBJbmZvcm1hdGlvbiB3aWRnZXQKICAgICAgICAgICAgICAgIEluaXRUaWNrZXRJbmZvQXZhdGFycygpOwoKICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY2FuY2VsIGJ1dHRvbnMgZm9yIGxpbmtlZCBhcHBvaW50bWVudHMKICAgICAgICAgICAgICAgIEluaXRDYW5jZWxBcHBvaW50bWVudEJ1dHRvbnMoKTsKCiAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZHluYW1pY2FsbHkgbG9hZGVkIGFydGljbGVzIChzaW5nbGUgYXJ0aWNsZSB2aWV3IHN3aXRjaGluZykKICAgICAgICAgICAgICAgIFNldHVwQXJ0aWNsZU9ic2VydmVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZHluYW1pYyBjdXN0b21lciBpbmZvIHdpZGdldCBvbiB0aWNrZXQgY3JlYXRlIHBhZ2VzCiAgICAgICAgICAgIC8vIChBZ2VudFRpY2tldFBob25lLCBBZ2VudFRpY2tldEVtYWlsLCBBZ2VudFRpY2tldEN1c3RvbWVyKQogICAgICAgICAgICB2YXIgQ29sbGFiQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwogICAgICAgICAgICBpZiAoQ29sbGFiQ29uZmlnLkR5bmFtaWNDdXN0b21lclNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgSW5pdER5bmFtaWNDdXN0b21lckluZm9XaWRnZXQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBPd25lciBJbmZvIFBhbmVsIGZvciBvd25lciBzZWxlY3Rpb24gZHJvcGRvd25zCiAgICAgICAgICAgIGlmIChDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uT3duZXJJbmZvUGFuZWwgJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsLkluaXQpIHsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Pd25lckluZm9QYW5lbC5Jbml0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFNldHVwIG9ic2VydmVyIGZvciBkeW5hbWljYWxseSBsb2FkZWQgYXJ0aWNsZXMKICAgICAqICAgICAgICAgICAgICBXYXRjaGVzICNBcnRpY2xlSXRlbXMgY29udGFpbmVyIGZvciBhcnRpY2xlIHN3aXRjaGluZwogICAgICovCiAgICBmdW5jdGlvbiBTZXR1cEFydGljbGVPYnNlcnZlcigpIHsKICAgICAgICB2YXIgUHJvY2Vzc1BlbmRpbmcgPSBmYWxzZTsKICAgICAgICB2YXIgUHJvY2Vzc1RpbWVvdXQgPSBudWxsOwoKICAgICAgICAvLyBUaHJvdHRsZWQgcHJvY2Vzc2luZyBmdW5jdGlvbgogICAgICAgIGZ1bmN0aW9uIFRocm90dGxlZFByb2Nlc3MoKSB7CiAgICAgICAgICAgIGlmIChQcm9jZXNzUGVuZGluZykgcmV0dXJuOwogICAgICAgICAgICBQcm9jZXNzUGVuZGluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBDbGVhciBhbnkgcGVuZGluZyB0aW1lb3V0CiAgICAgICAgICAgIGlmIChQcm9jZXNzVGltZW91dCkgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KFByb2Nlc3NUaW1lb3V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGVsYXkgdG8gYmF0Y2ggbXVsdGlwbGUgbXV0YXRpb25zCiAgICAgICAgICAgIFByb2Nlc3NUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1bnByb2Nlc3NlZCBhcnRpY2xlIGF2YXRhcnMKICAgICAgICAgICAgICAgIHZhciAkVW5wcm9jZXNzZWQgPSAkKCcuQXZhdGFyIC5BcnRpY2xlU2VuZGVySW5pdGlhbHMnKS5maWx0ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEkKHRoaXMpLmNsb3Nlc3QoJy5XaWRnZXRTaW1wbGUnKS5oYXNDbGFzcygnQ29sbGFiQXJ0aWNsZS0tcHJvY2Vzc2VkJyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoJFVucHJvY2Vzc2VkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBQcm9jZXNzUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgUHJvY2Vzc1RpbWVvdXQgPSBudWxsOwogICAgICAgICAgICB9LCAxMDApOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJpbWFyeSB0YXJnZXQ6ICNBcnRpY2xlSXRlbXMgY29udGFpbmVyICh3aGVyZSBhcnRpY2xlIGNvbnRlbnQgY2hhbmdlcykKICAgICAgICB2YXIgJEFydGljbGVJdGVtcyA9ICQoJyNBcnRpY2xlSXRlbXMnKTsKCiAgICAgICAgaWYgKCRBcnRpY2xlSXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgb24gI0FydGljbGVJdGVtcyAtIHRoZSBzcGVjaWZpYyBjb250YWluZXIgd2hlcmUgY2hhbmdlcyBoYXBwZW4KICAgICAgICAgICAgdmFyIE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oTXV0YXRpb25zKSB7CiAgICAgICAgICAgICAgICAvLyBBbnkgY2hhbmdlIGluc2lkZSBBcnRpY2xlSXRlbXMgdHJpZ2dlcnMgcHJvY2Vzc2luZwogICAgICAgICAgICAgICAgVGhyb3R0bGVkUHJvY2VzcygpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIE9ic2VydmVyLm9ic2VydmUoJEFydGljbGVJdGVtc1swXSwgewogICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEZhbGxiYWNrOiBIb29rIGludG8gWm51bnkncyBBSkFYIGNvbXBsZXRlIGV2ZW50cwogICAgICAgICQoZG9jdW1lbnQpLmFqYXhDb21wbGV0ZShmdW5jdGlvbihFdmVudCwgWEhSLCBTZXR0aW5ncykgewogICAgICAgICAgICAvLyBQcm9jZXNzIGFmdGVyIGFueSBBSkFYIHRoYXQgbWlnaHQgbG9hZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICAgICAgaWYgKFNldHRpbmdzLnVybCAmJiAoCiAgICAgICAgICAgICAgICBTZXR0aW5ncy51cmwuaW5kZXhPZignQXJ0aWNsZUlEJykgPiAtMSB8fAogICAgICAgICAgICAgICAgU2V0dGluZ3MudXJsLmluZGV4T2YoJ1RpY2tldFpvb20nKSA+IC0xIHx8CiAgICAgICAgICAgICAgICBTZXR0aW5ncy51cmwuaW5kZXhPZignQXJ0aWNsZScpID4gLTEgfHwKICAgICAgICAgICAgICAgIFNldHRpbmdzLnVybC5pbmRleE9mKCdBZ2VudFRpY2tldFpvb20nKSA+IC0xCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIFNtYWxsIGRlbGF5IHRvIGxldCBET00gdXBkYXRlCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFRocm90dGxlZFByb2Nlc3MsIDUwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBBdmF0YXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgQ3JlYXRlQXZhdGFyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW4gYXZhdGFyIGVsZW1lbnQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIC0gQXZhdGFyIG9wdGlvbnMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLmVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMuc2l6ZSAtIFNpemU6IHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4bGFyZ2UKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gT3B0aW9ucy5zaG93UHJlc2VuY2UgLSBTaG93IHByZXNlbmNlIGluZGljYXRvcgogICAgICogQHBhcmFtIHtCb29sZWFufSBPcHRpb25zLmNsaWNrYWJsZSAtIEVuYWJsZSBob3ZlciBjYXJkIG9uIGNsaWNrCiAgICAgKiBAcmV0dXJucyB7alF1ZXJ5fSBBdmF0YXIgZWxlbWVudAogICAgICovCiAgICBUYXJnZXROUy5DcmVhdGVBdmF0YXIgPSBmdW5jdGlvbiAoT3B0aW9ucykgewogICAgICAgIE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICAgICAgICAgIGVtYWlsOiAnJywKICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsCiAgICAgICAgICAgIHNob3dQcmVzZW5jZTogdHJ1ZSwKICAgICAgICAgICAgY2xpY2thYmxlOiB0cnVlCiAgICAgICAgfSwgT3B0aW9ucyk7CgogICAgICAgIHZhciAkQXZhdGFyID0gJCgnPGRpdj4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhcicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyLS0nICsgT3B0aW9ucy5zaXplKQogICAgICAgICAgICAuYXR0cignZGF0YS1lbWFpbCcsIE9wdGlvbnMuZW1haWwpOwoKICAgICAgICBpZiAoT3B0aW9ucy5jbGlja2FibGUgJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0hvdmVyQ2FyZHMnKSkgewogICAgICAgICAgICAkQXZhdGFyLmFkZENsYXNzKCdDb2xsYWJBdmF0YXItLWNsaWNrYWJsZScpOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIHBsYWNlaG9sZGVyICh0ZXh0LWJhc2VkIGluaXRpYWxzIGZhbGxiYWNrKQogICAgICAgIHZhciAkRmFsbGJhY2sgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpCiAgICAgICAgICAgIC50ZXh0KEdldEluaXRpYWxzKE9wdGlvbnMuZW1haWwpKTsKICAgICAgICAkQXZhdGFyLmFwcGVuZCgkRmFsbGJhY2spOwoKICAgICAgICAvLyBDcmVhdGUgaW1nIGVsZW1lbnQgSU1NRURJQVRFTFkgKHN5bmNocm9ub3VzbHkpIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zCiAgICAgICAgLy8gd2l0aCBVcGRhdGVBdmF0YXIgd2hpY2ggbWlnaHQgcnVuIGJlZm9yZSBvdXIgR2V0QXZhdGFyIHByb21pc2UgcmVzb2x2ZXMuCiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIFVwZGF0ZUF2YXRhciBhbHdheXMgZmluZHMgYW4gZXhpc3RpbmcgaW1nIGVsZW1lbnQuCiAgICAgICAgdmFyICRJbWcgPSBudWxsOwogICAgICAgIGlmIChDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnQXZhdGFyJykpIHsKICAgICAgICAgICAgJEltZyA9ICQoJzxpbWc+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19pbWFnZScpCiAgICAgICAgICAgICAgICAuYXR0cignYWx0JywgJycpCiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICRGYWxsYmFjay5zaG93KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gUHJlcGVuZCBpbWcgaW1tZWRpYXRlbHkgKHdpdGggbm8gc3JjIHlldCkKICAgICAgICAgICAgJEF2YXRhci5wcmVwZW5kKCRJbWcpOwoKICAgICAgICAgICAgLy8gTG9hZCBhdmF0YXIgVVJMIGFzeW5jaHJvbm91c2x5CiAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoT3B0aW9ucy5lbWFpbCkudGhlbihmdW5jdGlvbiAoVXJsKSB7CiAgICAgICAgICAgICAgICBpZiAoIVVybCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHNyYyBpZiBuZXcgdmFsdWUgaXMgImJldHRlciIgKHJlYWwgaW1hZ2UgdnMgU1ZHIGZhbGxiYWNrKQogICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRTcmMgPSAkSW1nLmF0dHIoJ3NyYycpIHx8ICcnOwogICAgICAgICAgICAgICAgdmFyIE5ld0lzU3ZnRmFsbGJhY2sgPSBVcmwuaW5kZXhPZignZGF0YTppbWFnZS9zdmcnKSA9PT0gMDsKICAgICAgICAgICAgICAgIHZhciBDdXJyZW50SXNTdmdGYWxsYmFjayA9ICFDdXJyZW50U3JjIHx8IEN1cnJlbnRTcmMuaW5kZXhPZignZGF0YTppbWFnZS9zdmcnKSA9PT0gMDsKICAgICAgICAgICAgICAgIHZhciBTaG91bGRVcGRhdGUgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50SXNTdmdGYWxsYmFjayB8fCAhTmV3SXNTdmdGYWxsYmFjazsKICAgICAgICAgICAgICAgIGlmIChTaG91bGRVcGRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAkSW1nLmF0dHIoJ3NyYycsIFVybCk7CiAgICAgICAgICAgICAgICAgICAgJEZhbGxiYWNrLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgcHJlc2VuY2UgaW5kaWNhdG9yCiAgICAgICAgaWYgKE9wdGlvbnMuc2hvd1ByZXNlbmNlICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdQcmVzZW5jZScpKSB7CiAgICAgICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlJykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UtLXVua25vd24nKTsKICAgICAgICAgICAgJEF2YXRhci5hcHBlbmQoJFByZXNlbmNlKTsKCiAgICAgICAgICAgIC8vIExvYWQgcHJlc2VuY2UKICAgICAgICAgICAgQ29sbGFiLkdldFByZXNlbmNlKE9wdGlvbnMuZW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICBVcGRhdGVQcmVzZW5jZUluZGljYXRvcigkUHJlc2VuY2UsIFByZXNlbmNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJEF2YXRhcjsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBVcGRhdGVBdmF0YXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBhbiBleGlzdGluZyBhdmF0YXIgZWxlbWVudAogICAgICogQHBhcmFtIHtqUXVlcnl9ICRBdmF0YXIgLSBBdmF0YXIgZWxlbWVudAogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVBdmF0YXIgPSBmdW5jdGlvbiAoJEF2YXRhcikgewogICAgICAgIHZhciBFbWFpbCA9ICRBdmF0YXIuYXR0cignZGF0YS1lbWFpbCcpOwogICAgICAgIGlmICghRW1haWwpIHJldHVybjsKCiAgICAgICAgLy8gRmluZCBleGlzdGluZyBpbWcgZWxlbWVudCAtIENyZWF0ZUF2YXRhciBjcmVhdGVzIGl0IHN5bmNocm9ub3VzbHksCiAgICAgICAgLy8gc28gaXQgc2hvdWxkIGFsd2F5cyBleGlzdC4gSWYgbm90LCBza2lwIChhdmF0YXIgZmVhdHVyZSBtaWdodCBiZSBkaXNhYmxlZCkuCiAgICAgICAgdmFyICRJbWcgPSAkQXZhdGFyLmZpbmQoJy5Db2xsYWJBdmF0YXJfX2ltYWdlJyk7CiAgICAgICAgaWYgKCEkSW1nLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAvLyBVcGRhdGUgYXZhdGFyIGltYWdlCiAgICAgICAgQ29sbGFiLkdldEF2YXRhcihFbWFpbCkudGhlbihmdW5jdGlvbiAoVXJsKSB7CiAgICAgICAgICAgIGlmICghVXJsKSByZXR1cm47CgogICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBzcmMgaWYgbmV3IHZhbHVlIGlzICJiZXR0ZXIiIChyZWFsIGltYWdlIHZzIFNWRyBmYWxsYmFjaykKICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBmYWxsYmFjayByZXNwb25zZXMgZnJvbSBvdmVyd3JpdGluZyByZWFsIGF2YXRhcnMKICAgICAgICAgICAgdmFyIEN1cnJlbnRTcmMgPSAkSW1nLmF0dHIoJ3NyYycpIHx8ICcnOwogICAgICAgICAgICB2YXIgTmV3SXNTdmdGYWxsYmFjayA9IFVybC5pbmRleE9mKCdkYXRhOmltYWdlL3N2ZycpID09PSAwOwogICAgICAgICAgICB2YXIgQ3VycmVudElzU3ZnRmFsbGJhY2sgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50U3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2Uvc3ZnJykgPT09IDA7CiAgICAgICAgICAgIHZhciBTaG91bGRVcGRhdGUgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50SXNTdmdGYWxsYmFjayB8fCAhTmV3SXNTdmdGYWxsYmFjazsKICAgICAgICAgICAgaWYgKFNob3VsZFVwZGF0ZSkgewogICAgICAgICAgICAgICAgJEltZy5hdHRyKCdzcmMnLCBVcmwpOwogICAgICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBVcGRhdGUgcHJlc2VuY2UKICAgICAgICB2YXIgJFByZXNlbmNlID0gJEF2YXRhci5maW5kKCcuQ29sbGFiUHJlc2VuY2UnKTsKICAgICAgICBpZiAoJFByZXNlbmNlLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoRW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICBVcGRhdGVQcmVzZW5jZUluZGljYXRvcigkUHJlc2VuY2UsIFByZXNlbmNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gSG92ZXIgQ2FyZAogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93SG92ZXJDYXJkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGhvdmVyIGNhcmQgZm9yIGVtYWlsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJEFuY2hvciAtIEVsZW1lbnQgdG8gYW5jaG9yIHRoZSBjYXJkIHRvCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dIb3ZlckNhcmQgPSBmdW5jdGlvbiAoRW1haWwsICRBbmNob3IpIHsKICAgICAgICAvLyBPbmx5IGNoZWNrIGZlYXR1cmUgZW5hYmxlZCAtIEdldFByb2ZpbGUgaGFuZGxlcyBmYWxsYmFjayB3aGVuIG5vdCBsb2dnZWQgaW4KICAgICAgICBpZiAoIUNvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdIb3ZlckNhcmRzJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSGlkZSBhbnkgZXhpc3RpbmcgaG92ZXIgY2FyZAogICAgICAgIEhpZGVIb3ZlckNhcmQoKTsKCiAgICAgICAgLy8gQ3JlYXRlIGhvdmVyIGNhcmQKICAgICAgICB2YXIgJENhcmQgPSBDcmVhdGVIb3ZlckNhcmRFbGVtZW50KCk7CiAgICAgICAgJENhcmQuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZC0tbG9hZGluZycpOwoKICAgICAgICAvLyBQb3NpdGlvbiBuZWFyIGFuY2hvcgogICAgICAgIFBvc2l0aW9uSG92ZXJDYXJkKCRDYXJkLCAkQW5jaG9yKTsKCiAgICAgICAgLy8gQWRkIHRvIHBhZ2UKICAgICAgICAkKCdib2R5JykuYXBwZW5kKCRDYXJkKTsKICAgICAgICBBY3RpdmVIb3ZlckNhcmQgPSAkQ2FyZDsKCiAgICAgICAgLy8gU2hvdyB3aXRoIGFuaW1hdGlvbgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkQ2FyZC5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkLS12aXNpYmxlJyk7CiAgICAgICAgfSwgMTApOwoKICAgICAgICAvLyBMb2FkIHByb2ZpbGUgZGF0YSAoT09GIGlzIG5vdyBkZXJpdmVkIGZyb20gcHJlc2VuY2UuYWN0aXZpdHkpCiAgICAgICAgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBDb2xsYWIuR2V0UHJvZmlsZShFbWFpbCksCiAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoRW1haWwpLAogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoRW1haWwpCiAgICAgICAgXSkudGhlbihmdW5jdGlvbiAoUmVzdWx0cykgewogICAgICAgICAgICB2YXIgUHJvZmlsZSA9IFJlc3VsdHNbMF07CiAgICAgICAgICAgIHZhciBBdmF0YXJVcmwgPSBSZXN1bHRzWzFdOwogICAgICAgICAgICB2YXIgUHJlc2VuY2UgPSBSZXN1bHRzWzJdOwoKICAgICAgICAgICAgUG9wdWxhdGVIb3ZlckNhcmQoJENhcmQsIFByb2ZpbGUsIEF2YXRhclVybCwgUHJlc2VuY2UpOwogICAgICAgICAgICAkQ2FyZC5yZW1vdmVDbGFzcygnQ29sbGFiSG92ZXJDYXJkLS1sb2FkaW5nJyk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkQ2FyZC5maW5kKCcuQ29sbGFiSG92ZXJDYXJkX19ib2R5JykuaHRtbCgKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0icGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzk5OTsiPicgKwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvdWxkIG5vdCBsb2FkIHByb2ZpbGUnKSArCiAgICAgICAgICAgICAgICAnPC9wPicKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJENhcmQucmVtb3ZlQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZC0tbG9hZGluZycpOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEhpZGVIb3ZlckNhcmQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEhpZGUgYWN0aXZlIGhvdmVyIGNhcmQKICAgICAqLwogICAgVGFyZ2V0TlMuSGlkZUhvdmVyQ2FyZCA9IEhpZGVIb3ZlckNhcmQ7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIEhlYWRlcgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBVcGRhdGVIZWFkZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBoZWFkZXIgLSByZXBsYWNlcyBabnVueSBVc2VyQXZhdGFyIHdpdGggSGVhZGVyVXNlckJhZGdlIHdoZW4gY29ubmVjdGVkCiAgICAgKi8KICAgIFRhcmdldE5TLlVwZGF0ZUhlYWRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJFVzZXJBdmF0YXIgPSBHZXRVc2VyQXZhdGFyRWxlbWVudCgpOwogICAgICAgIGlmICghJFVzZXJBdmF0YXIubGVuZ3RoKSByZXR1cm47CgogICAgICAgIGlmIChDb2xsYWIuSXNMb2dnZWRJbigpKSB7CiAgICAgICAgICAgIHZhciBVc2VyID0gQ29sbGFiLkdldEN1cnJlbnRVc2VyKCk7CiAgICAgICAgICAgIGlmICghVXNlcikgcmV0dXJuOwoKICAgICAgICAgICAgLy8gTWFyayBhcyBjb25uZWN0ZWQKICAgICAgICAgICAgJFVzZXJBdmF0YXIuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZS0tY29ubmVjdGVkJyk7CgogICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgb3VyIGN1c3RvbSBjb250ZW50CiAgICAgICAgICAgIHZhciAkQmFkZ2UgPSAkVXNlckF2YXRhci5maW5kKCcuQ29sbGFiVXNlckJhZGdlX19jb250ZW50Jyk7CiAgICAgICAgICAgIGlmICghJEJhZGdlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy8gSGlkZSBvcmlnaW5hbCBabnVueSBjb250ZW50CiAgICAgICAgICAgICAgICAkVXNlckF2YXRhci5maW5kKCc+IGEnKS5maXJzdCgpLmFkZENsYXNzKCdDb2xsYWJIaWRkZW4nKTsKICAgICAgICAgICAgICAgIEdldFVzZXJBdmF0YXJTdWJtZW51KCRVc2VyQXZhdGFyKS5hZGRDbGFzcygnQ29sbGFiSGlkZGVuJyk7CgogICAgICAgICAgICAgICAgLy8gQ3JlYXRlIEhlYWRlclVzZXJCYWRnZSBjb250ZW50IChzdHlsZWQgbGlrZSBIb3ZlckNhcmRIZWFkZXIpLgogICAgICAgICAgICAgICAgLy8gQnVpbHQgZnJvbSA8c3Bhbj4sIG5vdCA8ZGl2PjogWm51bnkgNi41LnggTFRTJ3Mgb3duIGNvcmUgQ1NTCiAgICAgICAgICAgICAgICAvLyBoYXMgIiNUb29sQmFyIGxpLlVzZXJBdmF0YXIgZGl2IHsgZGlzcGxheTogbm9uZTsgLi4uIH0iIC0gYW4KICAgICAgICAgICAgICAgIC8vIHVuc2NvcGVkIGRlc2NlbmRhbnQgc2VsZWN0b3IgdGhhdCBoaWRlcyBFVkVSWSA8ZGl2PiBhbnl3aGVyZQogICAgICAgICAgICAgICAgLy8gaW5zaWRlIC5Vc2VyQXZhdGFyLCBub3QganVzdCBpdHMgbmF0aXZlIGRyb3Bkb3duLiBTaW5jZSBpdAogICAgICAgICAgICAgICAgLy8gYmVhdHMgdGhpcyBmaWxlJ3MgY2xhc3MtYmFzZWQgcnVsZXMgb24gc3BlY2lmaWNpdHksIGFueQogICAgICAgICAgICAgICAgLy8gPGRpdj4gd2UgaW5qZWN0IGhlcmUgZW5kcyB1cCBpbnZpc2libGUgb24gNi41LnguIEV2ZXJ5IGNsYXNzCiAgICAgICAgICAgICAgICAvLyBiZWxvdyBhbHJlYWR5IHNldHMgaXRzIG93biBleHBsaWNpdCBgZGlzcGxheWAgKG9yIGJlY29tZXMKICAgICAgICAgICAgICAgIC8vIGEgZmxleCBpdGVtIC8gZ2V0cyBwb3NpdGlvbjphYnNvbHV0ZSwgYm90aCBvZiB3aGljaCBmb3JjZQogICAgICAgICAgICAgICAgLy8gYmxvY2tpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0YWcgLSBzZWUgQ1NTIHNwZWMpLCBzbyB1c2luZwogICAgICAgICAgICAgICAgLy8gPHNwYW4+IGNoYW5nZXMgbm90aGluZyB2aXN1YWxseSBhbmQgc2ltcGx5IGlzbid0IG1hdGNoZWQgYnkKICAgICAgICAgICAgICAgIC8vIHRoYXQgc2VsZWN0b3IgYXQgYWxsLCBvbiBhbnkgWm51bnkgbGluZS4KICAgICAgICAgICAgICAgICRCYWRnZSA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQnKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBob3ZlciB0cmlnZ2VyIHRvIGVudGlyZSBiYWRnZSAobm90IGp1c3QgYXZhdGFyKQogICAgICAgICAgICAgICAgaWYgKENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdIb3ZlckNhcmRzJykpIHsKICAgICAgICAgICAgICAgICAgICAkQmFkZ2UuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyVHJpZ2dlcicpLmF0dHIoJ2RhdGEtZW1haWwnLCBVc2VyLmVtYWlsKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBBdmF0YXIgd2l0aCBwcmVzZW5jZSAobGFyZ2Ugc2l6ZSAtIHNhbWUgYXMgSG92ZXJDYXJkSGVhZGVyKQogICAgICAgICAgICAgICAgdmFyICRBdmF0YXJXcmFwID0gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZV9fYXZhdGFyJyk7CiAgICAgICAgICAgICAgICB2YXIgJEF2YXRhciA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXIgQ29sbGFiQXZhdGFyLS1sYXJnZScpOwogICAgICAgICAgICAgICAgdmFyICRGYWxsYmFjayA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykudGV4dChHZXRJbml0aWFscyhVc2VyLmVtYWlsLCBVc2VyLmRpc3BsYXlOYW1lKSk7CiAgICAgICAgICAgICAgICB2YXIgJFByZXNlbmNlID0gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlIENvbGxhYlByZXNlbmNlLS11bmtub3duJyk7CiAgICAgICAgICAgICAgICAkQXZhdGFyLmFwcGVuZCgkRmFsbGJhY2ssICRQcmVzZW5jZSk7CiAgICAgICAgICAgICAgICAkQXZhdGFyV3JhcC5hcHBlbmQoJEF2YXRhcik7CgogICAgICAgICAgICAgICAgLy8gSW5mbyBhcmVhIChsaWtlIEhvdmVyQ2FyZEhlYWRlcikKICAgICAgICAgICAgICAgIHZhciAkSW5mbyA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2luZm8nKTsKICAgICAgICAgICAgICAgIHZhciAkTmFtZSA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX25hbWUnKS50ZXh0KFVzZXIuZGlzcGxheU5hbWUgfHwgVXNlci5lbWFpbC5zcGxpdCgnQCcpWzBdKTsKICAgICAgICAgICAgICAgIHZhciAkVGl0bGUgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiVXNlckJhZGdlX190aXRsZScpLnRleHQoVXNlci5qb2JUaXRsZSB8fCAnQ29ubmVjdGVkJyk7CiAgICAgICAgICAgICAgICAkSW5mby5hcHBlbmQoJE5hbWUsICRUaXRsZSk7CgogICAgICAgICAgICAgICAgJEJhZGdlLmFwcGVuZCgkQXZhdGFyV3JhcCwgJEluZm8pOwogICAgICAgICAgICAgICAgJFVzZXJBdmF0YXIucHJlcGVuZCgkQmFkZ2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBVcGRhdGUgYXZhdGFyIGltYWdlIGZyb20gcHJvdmlkZXIKICAgICAgICAgICAgQ29sbGFiLkdldEF2YXRhcihVc2VyLmVtYWlsKS50aGVuKGZ1bmN0aW9uIChBdmF0YXJVcmwpIHsKICAgICAgICAgICAgICAgIHZhciAkQXZhdGFyID0gJEJhZGdlLmZpbmQoJy5Db2xsYWJBdmF0YXInKTsKICAgICAgICAgICAgICAgIGlmIChBdmF0YXJVcmwpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJEltZyA9ICRBdmF0YXIuZmluZCgnLkNvbGxhYkF2YXRhcl9faW1hZ2UnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRJbWcubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJbWcgPSAkKCc8aW1nPicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ltYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRBdmF0YXIuZmluZCgnLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2snKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRBdmF0YXIucHJlcGVuZCgkSW1nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEltZy5hdHRyKCdzcmMnLCBBdmF0YXJVcmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFVwZGF0ZSBwcmVzZW5jZSBpbmRpY2F0b3IKICAgICAgICAgICAgQ29sbGFiLkdldFByZXNlbmNlKFVzZXIuZW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICB2YXIgJFByZXNlbmNlID0gJEJhZGdlLmZpbmQoJy5Db2xsYWJQcmVzZW5jZScpOwogICAgICAgICAgICAgICAgdmFyIFByZXNlbmNlQ2xhc3MgPSBHZXRQcmVzZW5jZUNsYXNzKFByZXNlbmNlLnN0YXR1cyk7CiAgICAgICAgICAgICAgICAkUHJlc2VuY2UKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoZnVuY3Rpb24gKGksIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjLm1hdGNoKC9Db2xsYWJQcmVzZW5jZS0tXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlICcgKyBQcmVzZW5jZUNsYXNzKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBVcGRhdGUgbmFtZSBhbmQgam9iIHRpdGxlIGZyb20gcHJvZmlsZSAoZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIGZhbGxiYWNrIHVzZXJzKQogICAgICAgICAgICBDb2xsYWIuR2V0UHJvZmlsZShVc2VyLmVtYWlsKS50aGVuKGZ1bmN0aW9uIChQcm9maWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5TmFtZSBpZiBwcm9maWxlIGhhcyBiZXR0ZXIgZGF0YQogICAgICAgICAgICAgICAgICAgIGlmIChQcm9maWxlLmRpc3BsYXlOYW1lICYmIFByb2ZpbGUuZGlzcGxheU5hbWUgIT09IFVzZXIuZW1haWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEJhZGdlLmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX25hbWUnKS50ZXh0KFByb2ZpbGUuZGlzcGxheU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaW5pdGlhbHMgdG9vCiAgICAgICAgICAgICAgICAgICAgICAgICRCYWRnZS5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLnRleHQoR2V0SW5pdGlhbHMoVXNlci5lbWFpbCwgUHJvZmlsZS5kaXNwbGF5TmFtZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoUHJvZmlsZS5qb2JUaXRsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQmFkZ2UuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9fdGl0bGUnKS50ZXh0KFByb2ZpbGUuam9iVGl0bGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE5vdCBjb25uZWN0ZWQgLSByZXN0b3JlIG9yaWdpbmFsIFpudW55IGNvbnRlbnQKICAgICAgICAgICAgJFVzZXJBdmF0YXIucmVtb3ZlQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZS0tY29ubmVjdGVkJyk7CgogICAgICAgICAgICAvLyBSZW1vdmUgb3VyIGN1c3RvbSBjb250ZW50CiAgICAgICAgICAgICRVc2VyQXZhdGFyLmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQnKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIFNob3cgb3JpZ2luYWwgWm51bnkgY29udGVudAogICAgICAgICAgICAkVXNlckF2YXRhci5maW5kKCc+IGEnKS5maXJzdCgpLnJlbW92ZUNsYXNzKCdDb2xsYWJIaWRkZW4nKTsKICAgICAgICAgICAgR2V0VXNlckF2YXRhclN1Ym1lbnUoJFVzZXJBdmF0YXIpLnJlbW92ZUNsYXNzKCdDb2xsYWJIaWRkZW4nKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgQ1NTIGNsYXNzIGZvciBwcmVzZW5jZSBzdGF0dXMKICAgICAqLwogICAgZnVuY3Rpb24gR2V0UHJlc2VuY2VDbGFzcyhTdGF0dXMpIHsKICAgICAgICB2YXIgU3RhdHVzTG93ZXIgPSAoU3RhdHVzIHx8ICd1bmtub3duJykudG9Mb3dlckNhc2UoKTsKICAgICAgICB2YXIgTWFwID0gewogICAgICAgICAgICAnYXZhaWxhYmxlJzogJ0NvbGxhYlByZXNlbmNlLS1hdmFpbGFibGUnLAogICAgICAgICAgICAnYnVzeSc6ICdDb2xsYWJQcmVzZW5jZS0tYnVzeScsCiAgICAgICAgICAgICdkbmQnOiAnQ29sbGFiUHJlc2VuY2UtLWRuZCcsCiAgICAgICAgICAgICdkb25vdGRpc3R1cmInOiAnQ29sbGFiUHJlc2VuY2UtLWRuZCcsCiAgICAgICAgICAgICdhd2F5JzogJ0NvbGxhYlByZXNlbmNlLS1hd2F5JywKICAgICAgICAgICAgJ2JlcmlnaHRiYWNrJzogJ0NvbGxhYlByZXNlbmNlLS1iZXJpZ2h0YmFjaycsCiAgICAgICAgICAgICdvZmZsaW5lJzogJ0NvbGxhYlByZXNlbmNlLS1vZmZsaW5lJywKICAgICAgICAgICAgJ3Vua25vd24nOiAnQ29sbGFiUHJlc2VuY2UtLXVua25vd24nCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gTWFwW1N0YXR1c0xvd2VyXSB8fCAnQ29sbGFiUHJlc2VuY2UtLXVua25vd24nOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBDdXN0b21lciBJbmZvIFdpZGdldAogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0Q3VzdG9tZXJJbmZvV2lkZ2V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIHRoZSBjdXN0b21lciBpbmZvcm1hdGlvbiB3aWRnZXQgaW4gdGlja2V0IHpvb20KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEN1c3RvbWVySW5mb1dpZGdldCA9IEluaXRDdXN0b21lckluZm9XaWRnZXQ7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMgLSBIZWFkZXIgKEludGVncmF0aW9uIHdpdGggWm51bnkgVXNlckF2YXRhcikKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGaW5kIFpudW55J3MgaGVhZGVyIHVzZXItYXZhdGFyIDxsaT4uIFNlbGVjdGVkIGJ5IGNsYXNzLAogICAgICogbm90ICNVc2VyQXZhdGFyLCBiZWNhdXNlIFpudW55IDYuNS54IExUUyByZW5kZXJzIDxsaSBjbGFzcz0iVXNlckF2YXRhciI+CiAgICAgKiB3aXRoIG5vIGlkIGF0dHJpYnV0ZSBhdCBhbGwgLSB0aGUgaWQgd2FzIGFkZGVkIGxhdGVyIChwcmVzZW50IGJ5IDcuMi54KS4KICAgICAqIFRoZSBjbGFzcyBpcyBwcmVzZW50IG9uIGV2ZXJ5IFpudW55IGxpbmUgc2VlbiBzbyBmYXIgKDYuNS54LTcuMy54KS4KICAgICAqIEByZXR1cm5zIHtqUXVlcnl9IFRoZSBVc2VyQXZhdGFyIGVsZW1lbnQsIG9yIGFuIGVtcHR5IGpRdWVyeSBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldFVzZXJBdmF0YXJFbGVtZW50KCkgewogICAgICAgIHJldHVybiAkKCcuVXNlckF2YXRhcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGaW5kIHRoZSBVc2VyQXZhdGFyIGRyb3Bkb3duIHN1Ym1lbnUgd2l0aGluICRVc2VyQXZhdGFyLgogICAgICogWm51bnkgNy4yLngrIHdyYXBzIGl0IGluIDxkaXYgY2xhc3M9IlVzZXJBdmF0YXJfc3VibWVudSI+OyBabnVueSA2LjUueAogICAgICogTFRTIHVzZXMgYSBwbGFpbiwgdW5jbGFzc2VkIDxkaXY+IGluIHRoZSBzYW1lIHBvc2l0aW9uLiBGYWxsIGJhY2sgdG8KICAgICAqIHRoYXQgcG9zaXRpb25hbCBtYXRjaCBzbyB0aGUgaGVhZGVyIGludGVncmF0aW9uIHN0aWxsIHdvcmtzIHRoZXJlLgogICAgICogQHBhcmFtIHtqUXVlcnl9ICRVc2VyQXZhdGFyIC0gVGhlIFVzZXJBdmF0YXIgZWxlbWVudC4KICAgICAqIEByZXR1cm5zIHtqUXVlcnl9IFRoZSBzdWJtZW51IGVsZW1lbnQsIG9yIGFuIGVtcHR5IGpRdWVyeSBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldFVzZXJBdmF0YXJTdWJtZW51KCRVc2VyQXZhdGFyKSB7CiAgICAgICAgdmFyICRTdWJtZW51ID0gJFVzZXJBdmF0YXIuZmluZCgnLlVzZXJBdmF0YXJfc3VibWVudScpOwogICAgICAgIGlmICghJFN1Ym1lbnUubGVuZ3RoKSB7CiAgICAgICAgICAgICRTdWJtZW51ID0gJFVzZXJBdmF0YXIuY2hpbGRyZW4oJ2RpdicpLmZpcnN0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU3VibWVudTsKICAgIH0KCiAgICBmdW5jdGlvbiBJbml0SGVhZGVyKCkgewogICAgICAgIC8vIEZpbmQgWm51bnkncyBleGlzdGluZyBVc2VyQXZhdGFyIGVsZW1lbnQKICAgICAgICB2YXIgJFVzZXJBdmF0YXIgPSBHZXRVc2VyQXZhdGFyRWxlbWVudCgpOwogICAgICAgIGlmICghJFVzZXJBdmF0YXIubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgICAgICBpZiAoJFVzZXJBdmF0YXIuaGFzQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZS0taW5pdGlhbGl6ZWQnKSkgcmV0dXJuOwogICAgICAgICRVc2VyQXZhdGFyLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2UtLWluaXRpYWxpemVkJyk7CgogICAgICAgIC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgZWxzZXdoZXJlIChmb3IgWm51bnkgZHJvcGRvd24gd2hlbiBub3QgY29ubmVjdGVkKQogICAgICAgIC8vIFVzZSBuYW1lc3BhY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgaGFuZGxlcnMKICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLmNvbGxhYkhlYWRlcicpLm9uKCdjbGljay5jb2xsYWJIZWFkZXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgaWYgKCEkKEV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLlVzZXJBdmF0YXInKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIEdldFVzZXJBdmF0YXJTdWJtZW51KCRVc2VyQXZhdGFyKS5yZW1vdmVDbGFzcygnc2hvdycpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIEFkZCBsb2dpbiBtZW51IGl0ZW0gdG8gVXNlckF2YXRhcl9zdWJtZW51IChmb3IgcHJvdmlkZXJzIHdpdGggbG9naW4gY2FwYWJpbGl0eSkKICAgICAgICB2YXIgTG9naW5JbmZvID0gQ29sbGFiLkdldExvZ2luSW5mbygpOwogICAgICAgIGlmIChMb2dpbkluZm8gJiYgTG9naW5JbmZvLnJlcXVpcmVzRXhwbGljaXRMb2dpbikgewogICAgICAgICAgICBBZGRMb2dpbk1lbnVJdGVtKCRVc2VyQXZhdGFyLCBMb2dpbkluZm8pOwogICAgICAgIH0KCiAgICAgICAgLy8gVXBkYXRlIGhlYWRlciBzdGF0ZSAtIHRoaXMgd2lsbCByZXBsYWNlIGNvbnRlbnQgaWYgY29ubmVjdGVkCiAgICAgICAgVGFyZ2V0TlMuVXBkYXRlSGVhZGVyKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEFkZCBsb2dpbiBtZW51IGl0ZW0gdG8gVXNlckF2YXRhciBkcm9wZG93bgogICAgICogQHBhcmFtIHtqUXVlcnl9ICRVc2VyQXZhdGFyIC0gVGhlIFVzZXJBdmF0YXIgZWxlbWVudAogICAgICogQHBhcmFtIHtPYmplY3R9IExvZ2luSW5mbyAtIExvZ2luIGluZm8gZnJvbSBwcm92aWRlciB7bGFiZWwsIGljb24sIHJlcXVpcmVzRXhwbGljaXRMb2dpbn0KICAgICAqLwogICAgZnVuY3Rpb24gQWRkTG9naW5NZW51SXRlbSgkVXNlckF2YXRhciwgTG9naW5JbmZvKSB7CiAgICAgICAgLy8gRmluZCB0aGUgc3VibWVudSAtIFpudW55IHVzZXMgc3BhbiB3aXRoIGxpbmtzLCBub3QgdWwvbGkKICAgICAgICB2YXIgJFN1Ym1lbnUgPSBHZXRVc2VyQXZhdGFyU3VibWVudSgkVXNlckF2YXRhcik7CiAgICAgICAgaWYgKCEkU3VibWVudS5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgbWVudSBpdGVtIGFscmVhZHkgZXhpc3RzCiAgICAgICAgaWYgKCRTdWJtZW51LmZpbmQoJyNDb2xsYWJQcm92aWRlckxvZ2luJykubGVuZ3RoKSByZXR1cm47CgogICAgICAgIC8vIFVzZSBsb2dpbiBpbmZvIGZyb20gcHJvdmlkZXIgKG5vIGhhcmRjb2RlZCBwcm92aWRlciBrbm93bGVkZ2UpCiAgICAgICAgdmFyIExhYmVsID0gTG9naW5JbmZvLmxhYmVsIHx8ICdQcm92aWRlcic7CiAgICAgICAgdmFyIEljb24gPSBMb2dpbkluZm8uaWNvbiB8fCAnZmEtcGx1Zyc7CgogICAgICAgIC8vIFNFQ1VSSVRZIChTNik6IFZhbGlkYXRlIGljb24gY2xhc3MgdG8gcHJldmVudCBYU1MKICAgICAgICAvLyBPbmx5IGFsbG93IHZhbGlkIEZvbnQgQXdlc29tZSBpY29uIGNsYXNzIG5hbWVzIChmYS0qKQogICAgICAgIHZhciBWYWxpZEljb25QYXR0ZXJuID0gL15mYS1bYS16MC05LV0rJC87CiAgICAgICAgaWYgKCFWYWxpZEljb25QYXR0ZXJuLnRlc3QoSWNvbikpIHsKICAgICAgICAgICAgSWNvbiA9ICdmYS1wbHVnJzsgIC8vIFNhZmUgZGVmYXVsdAogICAgICAgIH0KCiAgICAgICAgLy8gQ3JlYXRlIGEgbGFiZWwgZm9yIHRoZSBwcm92aWRlciBzZWN0aW9uCiAgICAgICAgdmFyICRMYWJlbCA9ICQoJzxsYWJlbD4nKS50ZXh0KExhYmVsKS5hZGRDbGFzcygnQ29sbGFiUHJvdmlkZXJMYWJlbCcpOwoKICAgICAgICAvLyBDcmVhdGUgbG9naW4gbGluawogICAgICAgIHZhciAkTG9naW5MaW5rID0gJCgnPGEgaHJlZj0iIyIgaWQ9IkNvbGxhYlByb3ZpZGVyTG9naW4iPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJvdmlkZXJMb2dpbkl0ZW0nKQogICAgICAgICAgICAuaHRtbCgnPGkgY2xhc3M9ImZhICcgKyBJY29uICsgJyI+PC9pPiA8c3Ryb25nPkFubWVsZGVuPC9zdHJvbmc+JykKICAgICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBwcm92aWRlciBsb2dpbgogICAgICAgICAgICAgICAgQ29sbGFiLkxvZ2luKCkudGhlbihmdW5jdGlvbihVc2VyKSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuVXBkYXRlSGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gSGlkZSBsb2dpbiBpdGVtLCBzaG93IGxvZ291dAogICAgICAgICAgICAgICAgICAgICRMb2dpbkxpbmsuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICRMb2dvdXRMaW5rLnNob3coKTsKICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9naW4gZmFpbGVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IExhYmVsICsgJyAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0xvZ2luIGZhaWxlZCcpLAogICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IEVycm9yLm1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gQ3JlYXRlIGxvZ291dCBsaW5rIChoaWRkZW4gaW5pdGlhbGx5KQogICAgICAgIHZhciAkTG9nb3V0TGluayA9ICQoJzxhIGhyZWY9IiMiIGlkPSJDb2xsYWJQcm92aWRlckxvZ291dCI+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJQcm92aWRlckxvZ291dEl0ZW0nKQogICAgICAgICAgICAuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLXNpZ24tb3V0Ij48L2k+IDxzdHJvbmc+QWJtZWxkZW48L3N0cm9uZz4nKQogICAgICAgICAgICAuaGlkZSgpCiAgICAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbihFdmVudCkgewogICAgICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgbG9nb3V0CiAgICAgICAgICAgICAgICBDb2xsYWIuTG9nb3V0KCk7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5VcGRhdGVIZWFkZXIoKTsKICAgICAgICAgICAgICAgIC8vIFNob3cgbG9naW4gaXRlbSwgaGlkZSBsb2dvdXQKICAgICAgICAgICAgICAgICRMb2dpbkxpbmsuc2hvdygpOwogICAgICAgICAgICAgICAgJExvZ291dExpbmsuaGlkZSgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gQ3JlYXRlIGEgc3BhbiB3cmFwcGVyIGZvciBwcm92aWRlciBsaW5rcyAobWF0Y2hlcyBabnVueSBzdHJ1Y3R1cmUpCiAgICAgICAgdmFyICRQcm92aWRlclNlY3Rpb24gPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiUHJvdmlkZXJTZWN0aW9uJyk7CiAgICAgICAgJFByb3ZpZGVyU2VjdGlvbi5hcHBlbmQoJExvZ2luTGluaywgJExvZ291dExpbmspOwoKICAgICAgICAvLyBJbnNlcnQgYWZ0ZXIgdGhlICJLb250byIgbGFiZWwKICAgICAgICB2YXIgJEtvbnRvTGFiZWwgPSAkU3VibWVudS5maW5kKCdsYWJlbCcpLmZpbHRlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICQodGhpcykudGV4dCgpLnRyaW0oKSA9PT0gJ0tvbnRvJzsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKCRLb250b0xhYmVsLmxlbmd0aCkgewogICAgICAgICAgICAvLyBJbnNlcnQgcHJvdmlkZXIgc2VjdGlvbiBiZWZvcmUgS29udG8gc2VjdGlvbgogICAgICAgICAgICAkTGFiZWwuaW5zZXJ0QmVmb3JlKCRLb250b0xhYmVsKTsKICAgICAgICAgICAgJFByb3ZpZGVyU2VjdGlvbi5pbnNlcnRCZWZvcmUoJEtvbnRvTGFiZWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpbnNlcnQgYWZ0ZXIgY29sdW1uLXdyYXBwZXIgKHVzZXIgbmFtZSkKICAgICAgICAgICAgdmFyICRDb2x1bW5XcmFwcGVyID0gJFN1Ym1lbnUuZmluZCgnLmNvbHVtbi13cmFwcGVyJyk7CiAgICAgICAgICAgIGlmICgkQ29sdW1uV3JhcHBlci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICRDb2x1bW5XcmFwcGVyLmFmdGVyKCRQcm92aWRlclNlY3Rpb24pLmFmdGVyKCRMYWJlbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBMYXN0IGZhbGxiYWNrOiBwcmVwZW5kIHRvIHN1Ym1lbnUKICAgICAgICAgICAgICAgICRTdWJtZW51LnByZXBlbmQoJFByb3ZpZGVyU2VjdGlvbikucHJlcGVuZCgkTGFiZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBiYXNlZCBvbiBjdXJyZW50IGxvZ2luIHN0YXRlCiAgICAgICAgaWYgKENvbGxhYi5Jc0xvZ2dlZEluKCkpIHsKICAgICAgICAgICAgJExvZ2luTGluay5oaWRlKCk7CiAgICAgICAgICAgICRMb2dvdXRMaW5rLnNob3coKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMgLSBIb3ZlciBDYXJkCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBTZXR1cEhvdmVyQ2FyZEhhbmRsZXIoKSB7CiAgICAgICAgLy8gVXNlIG5hbWVzcGFjZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBoYW5kbGVycyBvbiByZS1pbml0aWFsaXphdGlvbgogICAgICAgIHZhciBucyA9ICcuY29sbGFiSG92ZXJDYXJkJzsKCiAgICAgICAgLy8gU2VsZWN0b3JzIGZvciBob3ZlciB0cmlnZ2VyczoKICAgICAgICAvLyAtIC5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTogSW5kaXZpZHVhbCBhdmF0YXJzIChhcnRpY2xlIGF2YXRhcnMpCiAgICAgICAgLy8gLSAuQ29sbGFiSG92ZXJUcmlnZ2VyOiBCYWRnZSBjb250YWluZXJzIChIZWFkZXJVc2VyQmFkZ2UsIEN1c3RvbWVySW5mbyB3aWRnZXQpCiAgICAgICAgdmFyIFRyaWdnZXJTZWxlY3RvciA9ICcuQ29sbGFiQXZhdGFyLS1jbGlja2FibGUsIC5Db2xsYWJIb3ZlclRyaWdnZXInOwoKICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXN0aW5nIGhhbmRsZXJzIGZpcnN0CiAgICAgICAgJChkb2N1bWVudCkub2ZmKCdtb3VzZWVudGVyJyArIG5zICsgJyBtb3VzZWxlYXZlJyArIG5zICsgJyBjbGljaycgKyBucyArICcga2V5ZG93bicgKyBucyk7CgogICAgICAgIC8vIERlbGVnYXRlIGhvdmVyIGV2ZW50cyBmb3IgYWxsIGhvdmVyIHRyaWdnZXJzCiAgICAgICAgJChkb2N1bWVudCkub24oJ21vdXNlZW50ZXInICsgbnMsIFRyaWdnZXJTZWxlY3RvciwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJFRyaWdnZXIgPSAkKHRoaXMpOwogICAgICAgICAgICB2YXIgRW1haWwgPSAkVHJpZ2dlci5hdHRyKCdkYXRhLWVtYWlsJyk7CgogICAgICAgICAgICBpZiAoIUVtYWlsKSByZXR1cm47CgogICAgICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgdGltZW91dCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcwogICAgICAgICAgICBpZiAoSG92ZXJDYXJkVGltZW91dCkgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KEhvdmVyQ2FyZFRpbWVvdXQpOwogICAgICAgICAgICAgICAgSG92ZXJDYXJkVGltZW91dCA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEhvdmVyQ2FyZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dIb3ZlckNhcmQoRW1haWwsICRUcmlnZ2VyKTsKICAgICAgICAgICAgfSwgSG92ZXJDYXJkRGVsYXkpOwogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2VsZWF2ZScgKyBucywgVHJpZ2dlclNlbGVjdG9yLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChIb3ZlckNhcmRUaW1lb3V0KSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoSG92ZXJDYXJkVGltZW91dCk7CiAgICAgICAgICAgICAgICBIb3ZlckNhcmRUaW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBLZWVwIGhvdmVyIGNhcmQgb3BlbiB3aGVuIG1vdXNlIGlzIG92ZXIgaXQKICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2VlbnRlcicgKyBucywgJy5Db2xsYWJIb3ZlckNhcmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChIb3ZlckNhcmRUaW1lb3V0KSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoSG92ZXJDYXJkVGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJChkb2N1bWVudCkub24oJ21vdXNlbGVhdmUnICsgbnMsICcuQ29sbGFiSG92ZXJDYXJkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBIaWRlSG92ZXJDYXJkKCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIENsb3NlIG9uIGNsaWNrIG91dHNpZGUKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snICsgbnMsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBpZiAoQWN0aXZlSG92ZXJDYXJkICYmICEkKEV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLkNvbGxhYkhvdmVyQ2FyZCwgLkNvbGxhYkF2YXRhciwgLkNvbGxhYkhvdmVyVHJpZ2dlcicpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgSGlkZUhvdmVyQ2FyZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIENsb3NlIG9uIGVzY2FwZQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJyArIG5zLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgaWYgKEV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgQWN0aXZlSG92ZXJDYXJkKSB7CiAgICAgICAgICAgICAgICBIaWRlSG92ZXJDYXJkKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBDcmVhdGVIb3ZlckNhcmRFbGVtZW50KCkgewogICAgICAgIHZhciAkQ2FyZCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZCcpOwoKICAgICAgICAvLyBIZWFkZXIKICAgICAgICB2YXIgJEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9faGVhZGVyJyk7CiAgICAgICAgdmFyICRBdmF0YXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXIgQ29sbGFiQXZhdGFyLS1sYXJnZScpOwogICAgICAgIHZhciAkSW5mbyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9faW5mbycpOwogICAgICAgIHZhciAkTmFtZSA9ICQoJzxoMz4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19uYW1lJykudGV4dCgnLi4uJyk7CiAgICAgICAgdmFyICRUaXRsZSA9ICQoJzxwPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX3RpdGxlJykudGV4dCgnLi4uJyk7CgogICAgICAgICRJbmZvLmFwcGVuZCgkTmFtZSwgJFRpdGxlKTsKICAgICAgICAkSGVhZGVyLmFwcGVuZCgkQXZhdGFyLCAkSW5mbyk7CgogICAgICAgIC8vIEJvZHkKICAgICAgICB2YXIgJEJvZHkgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2JvZHknKTsKCiAgICAgICAgLy8gRm9vdGVyCiAgICAgICAgdmFyICRGb290ZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2Zvb3RlcicpOwoKICAgICAgICAkQ2FyZC5hcHBlbmQoJEhlYWRlciwgJEJvZHksICRGb290ZXIpOwoKICAgICAgICByZXR1cm4gJENhcmQ7CiAgICB9CgogICAgZnVuY3Rpb24gUG9wdWxhdGVIb3ZlckNhcmQoJENhcmQsIFByb2ZpbGUsIEF2YXRhclVybCwgUHJlc2VuY2UpIHsKICAgICAgICAvLyBVcGRhdGUgYXZhdGFyIC0gdXNpbmcgRE9NIEFQSSB0byBwcmV2ZW50IFhTUwogICAgICAgIHZhciAkQXZhdGFyID0gJENhcmQuZmluZCgnLkNvbGxhYkF2YXRhcicpLmVtcHR5KCk7CiAgICAgICAgaWYgKEF2YXRhclVybCkgewogICAgICAgICAgICB2YXIgJEltZyA9ICQoJzxpbWc+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19pbWFnZScpCiAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgQXZhdGFyVXJsKQogICAgICAgICAgICAgICAgLmF0dHIoJ2FsdCcsICcnKTsKICAgICAgICAgICAgJEF2YXRhci5hcHBlbmQoJEltZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyICRGYWxsYmFjayA9ICQoJzxkaXY+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpCiAgICAgICAgICAgICAgICAudGV4dChHZXRJbml0aWFscyhQcm9maWxlLmVtYWlsLCBQcm9maWxlLmRpc3BsYXlOYW1lKSk7CiAgICAgICAgICAgICRBdmF0YXIuYXBwZW5kKCRGYWxsYmFjayk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgcHJlc2VuY2UgLSB1c2luZyBET00gQVBJIHRvIHByZXZlbnQgWFNTCiAgICAgICAgdmFyIFByZXNlbmNlSW5mbyA9IEdldFByZXNlbmNlSW5mbyhQcmVzZW5jZS5zdGF0dXMpOwogICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UnKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlLS0nICsgUHJlc2VuY2VJbmZvLmNsYXNzKTsKICAgICAgICAkQXZhdGFyLmFwcGVuZCgkUHJlc2VuY2UpOwoKICAgICAgICAvLyBVcGRhdGUgbmFtZSBhbmQgdGl0bGUKICAgICAgICAkQ2FyZC5maW5kKCcuQ29sbGFiSG92ZXJDYXJkX19uYW1lJykudGV4dChQcm9maWxlLmRpc3BsYXlOYW1lIHx8IFByb2ZpbGUuZW1haWwpOwogICAgICAgICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX3RpdGxlJykudGV4dChQcm9maWxlLmpvYlRpdGxlIHx8ICcnKTsKCiAgICAgICAgLy8gQnVpbGQgYm9keSBjb250ZW50IC0gdXNpbmcgRE9NIEFQSSB0byBwcmV2ZW50IFhTUwogICAgICAgIHZhciAkQm9keSA9ICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX2JvZHknKS5lbXB0eSgpOwoKICAgICAgICAvLyBTaG93IE9PRiBtZXNzYWdlIGJhbm5lciBpZiB1c2VyIGlzIG91dCBvZiBvZmZpY2UKICAgICAgICBpZiAoUHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScgJiYgUHJlc2VuY2Uub3V0T2ZPZmZpY2UgJiYgUHJlc2VuY2Uub3V0T2ZPZmZpY2UubWVzc2FnZSkgewogICAgICAgICAgICB2YXIgJE9PRkJhbm5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fb29mQmFubmVyJyk7CiAgICAgICAgICAgIC8vIEhlYWRlciB3aXRoIGljb24gYW5kIHRpdGxlIGlubGluZQogICAgICAgICAgICB2YXIgJE9PRkhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fb29mSGVhZGVyJyk7CiAgICAgICAgICAgIHZhciAkT09GSWNvbiA9ICQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS1zaWduLW91dCBDb2xsYWJIb3ZlckNhcmRfX29vZkljb24nKTsKICAgICAgICAgICAgdmFyICRPT0ZUaXRsZSA9ICQoJzxzcGFuPicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fb29mVGl0bGUnKQogICAgICAgICAgICAgICAgLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ091dCBvZiBPZmZpY2UnKSk7CiAgICAgICAgICAgICRPT0ZIZWFkZXIuYXBwZW5kKCRPT0ZJY29uLCAkT09GVGl0bGUpOwogICAgICAgICAgICAvLyBNZXNzYWdlIHRha2VzIGZ1bGwgd2lkdGggYmVsb3cgaGVhZGVyCiAgICAgICAgICAgIHZhciBDbGVhbk1lc3NhZ2UgPSBQcmVzZW5jZS5vdXRPZk9mZmljZS5tZXNzYWdlCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXlxzK3xccyskL2csICcnKSAgLy8gdHJpbQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xuezMsfS9nLCAnXG5cbicpOyAgLy8gbWF4IDIgbmV3bGluZXMKICAgICAgICAgICAgdmFyICRPT0ZNZXNzYWdlID0gJCgnPGRpdj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX29vZk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgLnRleHQoQ2xlYW5NZXNzYWdlKTsKICAgICAgICAgICAgJE9PRkJhbm5lci5hcHBlbmQoJE9PRkhlYWRlciwgJE9PRk1lc3NhZ2UpOwogICAgICAgICAgICAkQm9keS5hcHBlbmQoJE9PRkJhbm5lcik7CiAgICAgICAgfQoKICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcm93IHdpdGggc2FmZSB0ZXh0IG9yIGVsZW1lbnQgdmFsdWUKICAgICAgICBmdW5jdGlvbiBBZGRSb3coTGFiZWwsIFZhbHVlT3JFbGVtZW50KSB7CiAgICAgICAgICAgIHZhciAkUm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19yb3cnKTsKICAgICAgICAgICAgJFJvdy5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fbGFiZWwnKS50ZXh0KExhYmVsKSk7CiAgICAgICAgICAgIHZhciAkVmFsdWUgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX192YWx1ZScpOwogICAgICAgICAgICBpZiAodHlwZW9mIFZhbHVlT3JFbGVtZW50ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgJFZhbHVlLnRleHQoVmFsdWVPckVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVlLmFwcGVuZChWYWx1ZU9yRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJvdy5hcHBlbmQoJFZhbHVlKTsKICAgICAgICAgICAgJEJvZHkuYXBwZW5kKCRSb3cpOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGNvcHkgYnV0dG9uIGZvciBjb250YWN0IGRhdGEKICAgICAgICBmdW5jdGlvbiBDcmVhdGVDb3B5QnV0dG9uKFRleHRUb0NvcHkpIHsKICAgICAgICAgICAgdmFyICRDb3B5QnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIENvbGxhYkJ1dHRvbi0tY29weScpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvcHkgdG8gY2xpcGJvYXJkJykpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS1jb3B5JykpOwogICAgICAgICAgICAkQ29weUJ0bi5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoVGV4dFRvQ29weSkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAvLyBWaXN1YWwgZmVlZGJhY2sgLSBzaG93IGNoZWNrbWFyayBicmllZmx5CiAgICAgICAgICAgICAgICAgICAgJENvcHlCdG4uZmluZCgnaScpLnJlbW92ZUNsYXNzKCdmYS1jb3B5JykuYWRkQ2xhc3MoJ2ZhLWNoZWNrJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENvcHlCdG4uZmluZCgnaScpLnJlbW92ZUNsYXNzKCdmYS1jaGVjaycpLmFkZENsYXNzKCdmYS1jb3B5Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiAkQ29weUJ0bjsKICAgICAgICB9CgogICAgICAgIGlmIChQcm9maWxlLmRlcGFydG1lbnQpIHsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZXBhcnRtZW50JyksIFByb2ZpbGUuZGVwYXJ0bWVudCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoUHJvZmlsZS5tYW5hZ2VyICYmIFByb2ZpbGUubWFuYWdlci5kaXNwbGF5TmFtZSkgewogICAgICAgICAgICAvLyBDcmVhdGUgbWFuYWdlciBlbGVtZW50IHNhZmVseSB3aXRoIERPTSBBUEkKICAgICAgICAgICAgdmFyICRNYW5hZ2VyID0gJCgnPHNwYW4+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19tYW5hZ2VyJykKICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWVtYWlsJywgUHJvZmlsZS5tYW5hZ2VyLmVtYWlsIHx8ICcnKQogICAgICAgICAgICAgICAgLnRleHQoUHJvZmlsZS5tYW5hZ2VyLmRpc3BsYXlOYW1lICsgJyAnKQogICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aT4nKS5hZGRDbGFzcygnZmEgZmEtZXh0ZXJuYWwtbGluaycpKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYW5hZ2VyJyksICRNYW5hZ2VyKTsKICAgICAgICB9CgogICAgICAgIGlmIChQcm9maWxlLm9mZmljZUxvY2F0aW9uKSB7CiAgICAgICAgICAgIEFkZFJvdyhDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2ZmaWNlJyksIFByb2ZpbGUub2ZmaWNlTG9jYXRpb24pOwogICAgICAgIH0KCiAgICAgICAgaWYgKFByb2ZpbGUuYnVzaW5lc3NQaG9uZXMgJiYgUHJvZmlsZS5idXNpbmVzc1Bob25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gQ3JlYXRlIHBob25lIGxpbmsgd2l0aCBjb3B5IGJ1dHRvbgogICAgICAgICAgICB2YXIgJFBob25lV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2NvcHlhYmxlJyk7CiAgICAgICAgICAgIHZhciAkUGhvbmVMaW5rID0gJCgnPGE+JykKICAgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJ3RlbDonICsgUHJvZmlsZS5idXNpbmVzc1Bob25lc1swXSkKICAgICAgICAgICAgICAgIC50ZXh0KFByb2ZpbGUuYnVzaW5lc3NQaG9uZXNbMF0pOwogICAgICAgICAgICAkUGhvbmVXcmFwLmFwcGVuZCgkUGhvbmVMaW5rLCBDcmVhdGVDb3B5QnV0dG9uKFByb2ZpbGUuYnVzaW5lc3NQaG9uZXNbMF0pKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQaG9uZScpLCAkUGhvbmVXcmFwKTsKICAgICAgICB9CgogICAgICAgIGlmIChQcm9maWxlLm1vYmlsZVBob25lKSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBtb2JpbGUgbGluayB3aXRoIGNvcHkgYnV0dG9uCiAgICAgICAgICAgIHZhciAkTW9iaWxlV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2NvcHlhYmxlJyk7CiAgICAgICAgICAgIHZhciAkTW9iaWxlTGluayA9ICQoJzxhPicpCiAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsICd0ZWw6JyArIFByb2ZpbGUubW9iaWxlUGhvbmUpCiAgICAgICAgICAgICAgICAudGV4dChQcm9maWxlLm1vYmlsZVBob25lKTsKICAgICAgICAgICAgJE1vYmlsZVdyYXAuYXBwZW5kKCRNb2JpbGVMaW5rLCBDcmVhdGVDb3B5QnV0dG9uKFByb2ZpbGUubW9iaWxlUGhvbmUpKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb2JpbGUnKSwgJE1vYmlsZVdyYXApOwogICAgICAgIH0KCiAgICAgICAgaWYgKFByb2ZpbGUuZW1haWwpIHsKICAgICAgICAgICAgLy8gQ3JlYXRlIGVtYWlsIGxpbmsgd2l0aCBjb3B5IGJ1dHRvbgogICAgICAgICAgICB2YXIgJEVtYWlsV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2NvcHlhYmxlJyk7CiAgICAgICAgICAgIHZhciAkRW1haWxMaW5rID0gJCgnPGE+JykKICAgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJ21haWx0bzonICsgUHJvZmlsZS5lbWFpbCkKICAgICAgICAgICAgICAgIC50ZXh0KFByb2ZpbGUuZW1haWwpOwogICAgICAgICAgICAkRW1haWxXcmFwLmFwcGVuZCgkRW1haWxMaW5rLCBDcmVhdGVDb3B5QnV0dG9uKFByb2ZpbGUuZW1haWwpKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdFbWFpbCcpLCAkRW1haWxXcmFwKTsKICAgICAgICB9CgogICAgICAgIC8vIFByZXNlbmNlIHN0YXR1cyAtIHVzaW5nIERPTSBBUEkKICAgICAgICB2YXIgJFN0YXR1c1NwYW4gPSAkKCc8c3Bhbj4nKQogICAgICAgICAgICAuY3NzKCdjb2xvcicsICd2YXIoLS1jb2xsYWItcHJlc2VuY2UtJyArIFByZXNlbmNlSW5mby5jbGFzcyArICcpJykKICAgICAgICAgICAgLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoUHJlc2VuY2VJbmZvLmxhYmVsKSk7CiAgICAgICAgQWRkUm93KCdTdGF0dXMnLCAkU3RhdHVzU3Bhbik7CgogICAgICAgIC8vIFdvcmsgbG9jYXRpb24gKG9mZmljZS9yZW1vdGUpIG9yIFRpbWUgb2ZmICh3aGVuIE9PRiBpcyBhY3RpdmUpCiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkxhYmVscyA9IHsKICAgICAgICAgICAgJ29mZmljZSc6ICdPZmZpY2UnLAogICAgICAgICAgICAncmVtb3RlJzogJ1JlbW90ZScsCiAgICAgICAgICAgICd0aW1lT2ZmJzogJ1RpbWUgb2ZmJwogICAgICAgIH07CiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkljb25zID0gewogICAgICAgICAgICAnb2ZmaWNlJzogJ2ZhLWJ1aWxkaW5nJywKICAgICAgICAgICAgJ3JlbW90ZSc6ICdmYS1ob21lJywKICAgICAgICAgICAgJ3RpbWVPZmYnOiAnZmEtc2lnbi1vdXQnCiAgICAgICAgfTsKCiAgICAgICAgLy8gRGV0ZXJtaW5lIGxvY2F0aW9uIHR5cGU6IE9PRiB0YWtlcyBwcmVjZWRlbmNlLCB0aGVuIHdvcmtMb2NhdGlvbgogICAgICAgIHZhciBMb2NhdGlvblR5cGUgPSBudWxsOwogICAgICAgIGlmIChQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICBMb2NhdGlvblR5cGUgPSAndGltZU9mZic7CiAgICAgICAgfSBlbHNlIGlmIChQcmVzZW5jZS53b3JrTG9jYXRpb24gJiYgUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGUpIHsKICAgICAgICAgICAgTG9jYXRpb25UeXBlID0gUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoTG9jYXRpb25UeXBlKSB7CiAgICAgICAgICAgIHZhciBMb2NhdGlvbkxhYmVsID0gV29ya0xvY2F0aW9uTGFiZWxzW0xvY2F0aW9uVHlwZV0gfHwgTG9jYXRpb25UeXBlOwogICAgICAgICAgICB2YXIgTG9jYXRpb25JY29uID0gV29ya0xvY2F0aW9uSWNvbnNbTG9jYXRpb25UeXBlXSB8fCAnZmEtbWFwLW1hcmtlcic7CiAgICAgICAgICAgIHZhciAkTG9jYXRpb25TcGFuID0gJCgnPHNwYW4+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiV29ya0xvY2F0aW9uIENvbGxhYldvcmtMb2NhdGlvbi0tJyArIExvY2F0aW9uVHlwZSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhICcgKyBMb2NhdGlvbkljb24pKQogICAgICAgICAgICAgICAgLmFwcGVuZCgnICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZShMb2NhdGlvbkxhYmVsKSk7CiAgICAgICAgICAgIEFkZFJvdyhDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV29yayBsb2NhdGlvbicpLCAkTG9jYXRpb25TcGFuKTsKICAgICAgICB9CgogICAgICAgIC8vIE1hbmFnZXIgY2xpY2sgaGFuZGxlcgogICAgICAgICRCb2R5LmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX21hbmFnZXInKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBNYW5hZ2VyRW1haWwgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtZW1haWwnKTsKICAgICAgICAgICAgaWYgKE1hbmFnZXJFbWFpbCkgewogICAgICAgICAgICAgICAgdmFyICRBbmNob3IgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0hvdmVyQ2FyZChNYW5hZ2VyRW1haWwsICRBbmNob3IpOwogICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBCdWlsZCBmb290ZXIgYnV0dG9ucyAtIHVzaW5nIERPTSBBUEkgdG8gcHJldmVudCBYU1MKICAgICAgICB2YXIgJEZvb3RlciA9ICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX2Zvb3RlcicpLmVtcHR5KCk7CgogICAgICAgIC8vIEhlbHBlciB0byBjcmVhdGUgaWNvbiBidXR0b24gd2l0aCBwcm9wZXIgZXNjYXBpbmcKICAgICAgICBmdW5jdGlvbiBDcmVhdGVJY29uQnV0dG9uKFRhZywgSHJlZiwgVGl0bGUsIEljb25DbGFzcywgVGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciAkQnRuID0gJCgnPCcgKyBUYWcgKyAnPicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkJ1dHRvbiBDb2xsYWJCdXR0b24tLWljb24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgVGl0bGUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpPicpLmFkZENsYXNzKEljb25DbGFzcykpOwogICAgICAgICAgICBpZiAoSHJlZikgewogICAgICAgICAgICAgICAgJEJ0bi5hdHRyKCdocmVmJywgSHJlZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFRhcmdldCkgewogICAgICAgICAgICAgICAgJEJ0bi5hdHRyKCd0YXJnZXQnLCBUYXJnZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkQnRuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgY3VycmVudCB1c2VyJ3Mgb3duIGNhcmQKICAgICAgICB2YXIgQ3VycmVudFVzZXIgPSBDb2xsYWIuR2V0Q3VycmVudFVzZXIoKTsKICAgICAgICB2YXIgSXNDdXJyZW50VXNlciA9IEN1cnJlbnRVc2VyICYmIEN1cnJlbnRVc2VyLmVtYWlsID09PSBQcm9maWxlLmVtYWlsOwoKICAgICAgICAvLyBDaGVjayBpZiB1c2VyIGlzIGZyb20gcHJpbWFyeSBwcm92aWRlciAoTTM2NSkgLSBvbmx5IHRoZW4gVGVhbXMgaXMgYXZhaWxhYmxlCiAgICAgICAgLy8gRmFsbGJhY2sgcHJvdmlkZXIgKFpudW55KSB1c2VycyBkb24ndCBoYXZlIFRlYW1zCiAgICAgICAgdmFyIFVzZXJQcm92aWRlciA9IENvbGxhYi5HZXRVc2VyUHJvdmlkZXIoUHJvZmlsZS5lbWFpbCk7CiAgICAgICAgdmFyIEhhc1RlYW1zID0gVXNlclByb3ZpZGVyID09PSAncHJpbWFyeSc7CgogICAgICAgIC8vIFRlYW1zIGFjdGlvbiBidXR0b25zIC0gb25seSBzaG93IGZvciBvdGhlciBwZW9wbGUgQU5EIG9ubHkgaWYgZnJvbSBwcmltYXJ5IHByb3ZpZGVyIChNMzY1KQogICAgICAgIC8vIE5vdGU6IEVtYWlsL1Bob25lL01vYmlsZSBhcmUgYWxyZWFkeSBjbGlja2FibGUgbGlua3MgaW4gdGhlIGJvZHksIHNvIHdlIG9ubHkgc2hvdyBUZWFtcyBhY3Rpb25zIGhlcmUKICAgICAgICBpZiAoIUlzQ3VycmVudFVzZXIgJiYgSGFzVGVhbXMpIHsKICAgICAgICAgICAgLy8gVGVhbXMgQ2hhdCBidXR0b24KICAgICAgICAgICAgdmFyIENoYXRMaW5rID0gQ29sbGFiLkdldENoYXRMaW5rKFByb2ZpbGUuZW1haWwpOwogICAgICAgICAgICBpZiAoQ2hhdExpbmsgJiYgQ29sbGFiLklzTG9nZ2VkSW4oKSAmJiBDb2xsYWIuSGFzQ2FwYWJpbGl0eSgnY2hhdCcpKSB7CiAgICAgICAgICAgICAgICAkRm9vdGVyLmFwcGVuZChDcmVhdGVJY29uQnV0dG9uKCdhJywgQ2hhdExpbmssCiAgICAgICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RlYW1zIENoYXQnKSwgJ2ZhIGZhLWNvbW1lbnQnLCAnX2JsYW5rJykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUZWFtcyBDYWxsIGJ1dHRvbgogICAgICAgICAgICB2YXIgQ2FsbExpbmsgPSBDb2xsYWIuR2V0Q2FsbExpbmsoUHJvZmlsZS5lbWFpbCk7CiAgICAgICAgICAgIGlmIChDYWxsTGluayAmJiBDb2xsYWIuSXNMb2dnZWRJbigpICYmIENvbGxhYi5IYXNDYXBhYmlsaXR5KCdjYWxsJykpIHsKICAgICAgICAgICAgICAgICRGb290ZXIuYXBwZW5kKENyZWF0ZUljb25CdXR0b24oJ2EnLCBDYWxsTGluaywKICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGVhbXMgQ2FsbCcpLCAnZmEgZmEtcGhvbmUtc3F1YXJlJywgJ19ibGFuaycpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU2V0dGluZ3MgYW5kIGxvZ291dCAtIG9ubHkgZm9yIGN1cnJlbnQgdXNlcidzIG93biBjYXJkCiAgICAgICAgaWYgKElzQ3VycmVudFVzZXIpIHsKICAgICAgICAgICAgLy8gUGVyc29uYWwgcHJlZmVyZW5jZXMgbGluayAoWm51bnkgc2V0dGluZ3MpCiAgICAgICAgICAgIHZhciBQcmVmZXJlbmNlc1VybCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRQcmVmZXJlbmNlcyc7CiAgICAgICAgICAgICRGb290ZXIuYXBwZW5kKENyZWF0ZUljb25CdXR0b24oJ2EnLCBQcmVmZXJlbmNlc1VybCwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQZXJzb25hbCBwcmVmZXJlbmNlcycpLCAnZmEgZmEtY29nJykpOwoKICAgICAgICAgICAgLy8gTG9nb3V0IGJ1dHRvbiAtIGxvZ3Mgb3V0IGZyb20gYm90aCBDb2xsYWJvcmF0aW9uIEFORCBabnVueQogICAgICAgICAgICB2YXIgJExvZ291dEJ0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQnV0dG9uIENvbGxhYkJ1dHRvbi0taWNvbiBDb2xsYWJCdXR0b24tLWxvZ291dCcpCiAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9nb3V0JykpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS1zaWduLW91dCcpKTsKICAgICAgICAgICAgJExvZ291dEJ0bi5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBIaWRlSG92ZXJDYXJkKCk7CiAgICAgICAgICAgICAgICAvLyBGaXJzdCBsb2dvdXQgZnJvbSBDb2xsYWJvcmF0aW9uIHByb3ZpZGVyCiAgICAgICAgICAgICAgICBDb2xsYWIuTG9nb3V0KCk7CiAgICAgICAgICAgICAgICAvLyBUaGVuIHJlZGlyZWN0IHRvIFpudW55IGxvZ291dAogICAgICAgICAgICAgICAgdmFyIExvZ291dFVybCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249TG9nb3V0JzsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTG9nb3V0VXJsOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJEZvb3Rlci5hcHBlbmQoJExvZ291dEJ0bik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIFBvc2l0aW9uSG92ZXJDYXJkKCRDYXJkLCAkQW5jaG9yKSB7CiAgICAgICAgdmFyIEFuY2hvck9mZnNldCA9ICRBbmNob3Iub2Zmc2V0KCk7CiAgICAgICAgdmFyIEFuY2hvcldpZHRoID0gJEFuY2hvci5vdXRlcldpZHRoKCk7CiAgICAgICAgdmFyIEFuY2hvckhlaWdodCA9ICRBbmNob3Iub3V0ZXJIZWlnaHQoKTsKICAgICAgICB2YXIgV2luZG93V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTsKICAgICAgICB2YXIgV2luZG93SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpOwogICAgICAgIHZhciBTY3JvbGxUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7CiAgICAgICAgdmFyIENhcmRXaWR0aCA9IDMyMDsKICAgICAgICB2YXIgQ2FyZEhlaWdodCA9IDM1MDsgLy8gQXBwcm94aW1hdGUKCiAgICAgICAgLy8gQ2FsY3VsYXRlIGF2YWlsYWJsZSBzcGFjZSBpbiBlYWNoIGRpcmVjdGlvbgogICAgICAgIHZhciBTcGFjZUJlbG93ID0gKFdpbmRvd0hlaWdodCArIFNjcm9sbFRvcCkgLSAoQW5jaG9yT2Zmc2V0LnRvcCArIEFuY2hvckhlaWdodCk7CiAgICAgICAgdmFyIFNwYWNlQWJvdmUgPSBBbmNob3JPZmZzZXQudG9wIC0gU2Nyb2xsVG9wOwogICAgICAgIHZhciBTcGFjZVJpZ2h0ID0gV2luZG93V2lkdGggLSAoQW5jaG9yT2Zmc2V0LmxlZnQgKyBBbmNob3JXaWR0aCk7CiAgICAgICAgdmFyIFNwYWNlTGVmdCA9IEFuY2hvck9mZnNldC5sZWZ0OwoKICAgICAgICB2YXIgTGVmdCwgVG9wOwogICAgICAgIHZhciBQb3NpdGlvbkFib3ZlID0gZmFsc2U7CgogICAgICAgIC8vIERldGVybWluZSBob3Jpem9udGFsIHBvc2l0aW9uCiAgICAgICAgLy8gQ2hlY2sgaWYgYW5jaG9yIGlzIGluIHNpZGViYXIgKHJpZ2h0IHNpZGUgb2YgcGFnZSkKICAgICAgICB2YXIgSXNJblNpZGViYXIgPSBBbmNob3JPZmZzZXQubGVmdCA+IFdpbmRvd1dpZHRoIC8gMjsKCiAgICAgICAgaWYgKElzSW5TaWRlYmFyICYmIFNwYWNlTGVmdCA+IENhcmRXaWR0aCArIDIwKSB7CiAgICAgICAgICAgIC8vIFNpZGViYXI6IHBvc2l0aW9uIGNhcmQgdG8gdGhlIExFRlQgb2YgYW5jaG9yCiAgICAgICAgICAgIExlZnQgPSBBbmNob3JPZmZzZXQubGVmdCAtIENhcmRXaWR0aCAtIDEwOwogICAgICAgIH0gZWxzZSBpZiAoU3BhY2VSaWdodCA+IENhcmRXaWR0aCArIDIwKSB7CiAgICAgICAgICAgIC8vIERlZmF1bHQ6IHBvc2l0aW9uIHRvIHRoZSByaWdodCBvZiBhbmNob3IKICAgICAgICAgICAgTGVmdCA9IEFuY2hvck9mZnNldC5sZWZ0ICsgQW5jaG9yV2lkdGggKyAxMDsKICAgICAgICB9IGVsc2UgaWYgKFNwYWNlTGVmdCA+IENhcmRXaWR0aCArIDIwKSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBwb3NpdGlvbiB0byB0aGUgbGVmdAogICAgICAgICAgICBMZWZ0ID0gQW5jaG9yT2Zmc2V0LmxlZnQgLSBDYXJkV2lkdGggLSAxMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBObyBzcGFjZSBvbiBzaWRlczogY2VudGVyIGhvcml6b250YWxseQogICAgICAgICAgICBMZWZ0ID0gTWF0aC5tYXgoMTAsIChXaW5kb3dXaWR0aCAtIENhcmRXaWR0aCkgLyAyKTsKICAgICAgICB9CgogICAgICAgIC8vIERldGVybWluZSB2ZXJ0aWNhbCBwb3NpdGlvbgogICAgICAgIC8vIFByZWZlciBzaG93aW5nIGJlbG93IGFuY2hvciwgYnV0IHN3aXRjaCB0byBhYm92ZSBpZiBub3QgZW5vdWdoIHNwYWNlCiAgICAgICAgaWYgKFNwYWNlQmVsb3cgPj0gQ2FyZEhlaWdodCArIDIwKSB7CiAgICAgICAgICAgIC8vIEVub3VnaCBzcGFjZSBiZWxvdzogYWxpZ24gdG9wIG9mIGNhcmQgd2l0aCB0b3Agb2YgYW5jaG9yCiAgICAgICAgICAgIFRvcCA9IEFuY2hvck9mZnNldC50b3A7CiAgICAgICAgfSBlbHNlIGlmIChTcGFjZUFib3ZlID49IENhcmRIZWlnaHQgKyAyMCkgewogICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHNwYWNlIGJlbG93LCBidXQgZW5vdWdoIGFib3ZlOiBwb3NpdGlvbiBhYm92ZSBhbmNob3IKICAgICAgICAgICAgVG9wID0gQW5jaG9yT2Zmc2V0LnRvcCArIEFuY2hvckhlaWdodCAtIENhcmRIZWlnaHQ7CiAgICAgICAgICAgIFBvc2l0aW9uQWJvdmUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE5laXRoZXIgaGFzIGVub3VnaCBzcGFjZTogcG9zaXRpb24gdG8gZml0IHZpc2libGUgYXJlYQogICAgICAgICAgICAvLyBQcmVmZXIgc2hvd2luZyBmcm9tIHRvcCBvZiBhbmNob3IsIGNsYW1wZWQgdG8gdmlld3BvcnQKICAgICAgICAgICAgVG9wID0gQW5jaG9yT2Zmc2V0LnRvcDsKICAgICAgICAgICAgdmFyIE1heFRvcCA9IFdpbmRvd0hlaWdodCArIFNjcm9sbFRvcCAtIENhcmRIZWlnaHQgLSAyMDsKICAgICAgICAgICAgdmFyIE1pblRvcCA9IFNjcm9sbFRvcCArIDEwOwoKICAgICAgICAgICAgaWYgKFRvcCA+IE1heFRvcCkgewogICAgICAgICAgICAgICAgVG9wID0gTWF4VG9wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChUb3AgPCBNaW5Ub3ApIHsKICAgICAgICAgICAgICAgIFRvcCA9IE1pblRvcDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRmluYWwgYm91bmRhcnkgY2hlY2sKICAgICAgICBpZiAoTGVmdCA8IDEwKSB7CiAgICAgICAgICAgIExlZnQgPSAxMDsKICAgICAgICB9CiAgICAgICAgaWYgKExlZnQgKyBDYXJkV2lkdGggPiBXaW5kb3dXaWR0aCAtIDEwKSB7CiAgICAgICAgICAgIExlZnQgPSBXaW5kb3dXaWR0aCAtIENhcmRXaWR0aCAtIDEwOwogICAgICAgIH0KCiAgICAgICAgJENhcmQuY3NzKHsKICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICAgIGxlZnQ6IExlZnQgKyAncHgnLAogICAgICAgICAgICB0b3A6IFRvcCArICdweCcKICAgICAgICB9KTsKCiAgICAgICAgLy8gQWRkIGNsYXNzIGZvciBwb3NpdGlvbmluZyAodXNlZnVsIGZvciBDU1MgYXJyb3cgZGlyZWN0aW9uKQogICAgICAgICRDYXJkLnJlbW92ZUNsYXNzKCdDb2xsYWJIb3ZlckNhcmQtLWFib3ZlIENvbGxhYkhvdmVyQ2FyZC0tYmVsb3cnKTsKICAgICAgICAkQ2FyZC5hZGRDbGFzcyhQb3NpdGlvbkFib3ZlID8gJ0NvbGxhYkhvdmVyQ2FyZC0tYWJvdmUnIDogJ0NvbGxhYkhvdmVyQ2FyZC0tYmVsb3cnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBIaWRlSG92ZXJDYXJkKCkgewogICAgICAgIGlmIChBY3RpdmVIb3ZlckNhcmQpIHsKICAgICAgICAgICAgQWN0aXZlSG92ZXJDYXJkLnJlbW92ZUNsYXNzKCdDb2xsYWJIb3ZlckNhcmQtLXZpc2libGUnKTsKICAgICAgICAgICAgdmFyICRDYXJkID0gQWN0aXZlSG92ZXJDYXJkOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRDYXJkLnJlbW92ZSgpOwogICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICBBY3RpdmVIb3ZlckNhcmQgPSBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgTWV0aG9kcyAtIEN1c3RvbWVyIEluZm8gV2lkZ2V0CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBUcmFjayBwZW5kaW5nIEFKQVggcmVxdWVzdCBmb3IgZHluYW1pYyB3aWRnZXQgdXBkYXRlcwogICAgdmFyIER5bmFtaWNXaWRnZXRQZW5kaW5nUmVxdWVzdCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZpbmRzIHRoZSBvdXRlciB3aWRnZXQgImJveCIgdG8gaGlkZS9tZWFzdXJlLCBnaXZlbiBhbnkgZWxlbWVudAogICAgICogICAgICAgICAgICAgIGluIG9yIGFyb3VuZCBpdC4gWm51bnkgNy4zLjEncyBHVUkgcmVkZXNpZ24gd3JhcHMgc2lkZWJhciB3aWRnZXRzCiAgICAgKiAgICAgICAgICAgICAgKEN1c3RvbWVyIEluZm9ybWF0aW9uLCBUaWNrZXQgSW5mb3JtYXRpb24sIC4uLikgaW4gYW4gb3V0ZXIKICAgICAqICAgICAgICAgICAgICAiLm1vZC5tb2RTaWRlYmFyV2lkZ2V0IiBjb250YWluZXIsIHdpdGggdGhlIHdpZGdldCdzIG93biB0aXRsZQogICAgICogICAgICAgICAgICAgIG1vdmVkIE9VVFNJREUgdGhlIG9sZCAiLldpZGdldFNpbXBsZSIvIi5IZWFkZXIiIG1hcmt1cCBpbnRvIGEKICAgICAqICAgICAgICAgICAgICBzaWJsaW5nICIuc2lkZWJhcldpZGdldFRpdGxlIi4gU29tZSByZWRlc2lnbmVkIHdpZGdldHMgKGUuZy4KICAgICAqICAgICAgICAgICAgICBUaWNrZXQgSW5mb3JtYXRpb24pIGRvbid0IGV2ZW4gaGF2ZSBhICIuV2lkZ2V0U2ltcGxlIiBlbGVtZW50CiAgICAgKiAgICAgICAgICAgICAgYXQgYWxsIGFueW1vcmUuIFRoaXMgY2hlY2tzIHRoZSBuZXcgd3JhcHBlciBmaXJzdCwgdGhlbiBmYWxscwogICAgICogICAgICAgICAgICAgIGJhY2sgdG8gdGhlIHByZS03LjMuMSAiLldpZGdldFNpbXBsZSIgY29udmVudGlvbiAoYXMgYW4KICAgICAqICAgICAgICAgICAgICBhbmNlc3Rvciwgb3IgLSBpZiAkRWwgaXRzZWxmIGlzIHRoZSBvdXRlciBib3ggLSBhIGRlc2NlbmRhbnQpLgogICAgICovCiAgICBmdW5jdGlvbiBSZXNvbHZlV2lkZ2V0Qm94KCRFbCkgewogICAgICAgIHZhciAkQm94ID0gJEVsLmNsb3Nlc3QoJy5tb2QubW9kU2lkZWJhcldpZGdldCcpOwogICAgICAgIGlmICgkQm94Lmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gJEJveDsKICAgICAgICB9CiAgICAgICAgJEJveCA9ICRFbC5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJyk7CiAgICAgICAgaWYgKCRCb3gubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAkQm94OwogICAgICAgIH0KICAgICAgICByZXR1cm4gJEVsLmlzKCcuV2lkZ2V0U2ltcGxlJykgPyAkRWwgOiAkRWwuZmluZCgnLldpZGdldFNpbXBsZScpLmZpcnN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZpbmRzIHRoZSBzaWRlYmFyIGNvbnRhaW5lciB0byBpbnNlcnQvc2VhcmNoIHdpZGdldHMgaW4uIFByZWZlcnMKICAgICAqICAgICAgICAgICAgICBabnVueSA3LjMuMSdzIEdVSS1yZWRlc2lnbiAiLnNpZGViYXJDb250ZW50IiwgZmFsbHMgYmFjayB0byB0aGUKICAgICAqICAgICAgICAgICAgICBwcmUtNy4zLjEgIi5TaWRlYmFyQ29sdW1uIi4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0U2lkZWJhckNvbnRhaW5lcigpIHsKICAgICAgICB2YXIgJFNpZGViYXIgPSAkKCcuc2lkZWJhckNvbnRlbnQnKS5maXJzdCgpOwogICAgICAgIGlmICgkU2lkZWJhci5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuICRTaWRlYmFyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJCgnLlNpZGViYXJDb2x1bW4nKS5maXJzdCgpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIHRoZSBkeW5hbWljIGN1c3RvbWVyIGluZm9ybWF0aW9uIHdpZGdldCBmb3IgdGlja2V0IGNyZWF0ZSBwYWdlcwogICAgICogICAgICAgICAgICAgIChBZ2VudFRpY2tldFBob25lLCBBZ2VudFRpY2tldEVtYWlsLCBBZ2VudFRpY2tldEN1c3RvbWVyKQogICAgICogICAgICAgICAgICAgIFRoZXNlIHBhZ2VzIGhhdmUgZHluYW1pYyBjdXN0b21lciBzZWxlY3Rpb24gdmlhIGF1dG9jb21wbGV0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gSW5pdER5bmFtaWNDdXN0b21lckluZm9XaWRnZXQoKSB7CiAgICAgICAgdmFyIENvbmZpZyA9IENvbGxhYi5HZXRDb25maWcoKTsKCiAgICAgICAgaWYgKCFDb25maWcuU2hvd0N1c3RvbWVySW5mb1dpZGdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBIaWRlIHRoZSBuYXRpdmUgI0N1c3RvbWVySW5mbyB3aWRnZXQKICAgICAgICBpZiAoQ29uZmlnLkhpZGVOYXRpdmVDdXN0b21lckluZm8pIHsKICAgICAgICAgICAgSGlkZU5hdGl2ZUN1c3RvbWVySW5mb1dpZGdldEJ5SWQoKTsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSBlbXB0eSB3aWRnZXQgd2l0aCBwbGFjZWhvbGRlcgogICAgICAgIHZhciAkRW1wdHlXaWRnZXQgPSBDcmVhdGVFbXB0eUN1c3RvbWVySW5mb1dpZGdldCgpOwoKICAgICAgICAvLyBJbnNlcnQgaW50byBzaWRlYmFyCiAgICAgICAgdmFyICRTaWRlYmFyID0gR2V0U2lkZWJhckNvbnRhaW5lcigpOwogICAgICAgIGlmICgkU2lkZWJhci5sZW5ndGgpIHsKICAgICAgICAgICAgJFNpZGViYXIucHJlcGVuZCgkRW1wdHlXaWRnZXQpOwogICAgICAgIH0KCiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIFpudW55J3MgY3VzdG9tZXIgc2VsZWN0aW9uIGV2ZW50CiAgICAgICAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgY3VzdG9tZXIgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgYXV0b2NvbXBsZXRlCiAgICAgICAgaWYgKENvcmUuQXBwICYmIENvcmUuQXBwLlN1YnNjcmliZSkgewogICAgICAgICAgICBDb3JlLkFwcC5TdWJzY3JpYmUoJ0V2ZW50LkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVySW5mby5DYWxsYmFjaycsIGZ1bmN0aW9uKEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgIC8vIEN1c3RvbWVySUQgaXMgdGhlIEN1c3RvbWVyVXNlcklEIChsb2dpbiksIG5vdCB0aGUgZW1haWwKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZmV0Y2ggdGhlIGVtYWlsIGZyb20gdGhlIGJhY2tlbmQKICAgICAgICAgICAgICAgIFVwZGF0ZUR5bmFtaWNDdXN0b21lckluZm9XaWRnZXQoQ3VzdG9tZXJJRCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQWxzbyB3YXRjaCBmb3IgY3VzdG9tZXIgcmVtb3ZhbCAod2hlbiBTZWxlY3RlZEN1c3RvbWVyVXNlciBiZWNvbWVzIGVtcHR5KQogICAgICAgIHZhciAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKTsKICAgICAgICBpZiAoJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLmxlbmd0aCkgewogICAgICAgICAgICAvLyBVc2UgTXV0YXRpb25PYnNlcnZlciB0byBkZXRlY3QgY2hhbmdlcyB0byB0aGUgaGlkZGVuIGlucHV0CiAgICAgICAgICAgIHZhciBPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykgewogICAgICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24obXV0YXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE5ld1ZhbHVlID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU5ld1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDdXN0b21lciB3YXMgcmVtb3ZlZCAtIHNob3cgZW1wdHkgd2lkZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93RW1wdHlDdXN0b21lckluZm9XaWRnZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgT2JzZXJ2ZXIub2JzZXJ2ZSgkU2VsZWN0ZWRDdXN0b21lclVzZXJbMF0sIHsgYXR0cmlidXRlczogdHJ1ZSB9KTsKCiAgICAgICAgICAgIC8vIEFsc28gbGlzdGVuIGZvciBkaXJlY3QgdmFsdWUgY2hhbmdlcyAoZmFsbGJhY2spCiAgICAgICAgICAgICRTZWxlY3RlZEN1c3RvbWVyVXNlci5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoISQodGhpcykudmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICBTaG93RW1wdHlDdXN0b21lckluZm9XaWRnZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBGYWxsYmFjazogV2F0Y2ggZm9yIERPTSBjaGFuZ2VzIHRvIHRoZSBuYXRpdmUgd2lkZ2V0IGNvbnRlbnQKICAgICAgICAvLyBJbiBjYXNlIHRoZSBldmVudCBkb2Vzbid0IGZpcmUgcmVsaWFibHkKICAgICAgICB2YXIgJE5hdGl2ZVdpZGdldCA9ICQoJyNDdXN0b21lckluZm8nKTsKICAgICAgICBpZiAoJE5hdGl2ZVdpZGdldC5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIENvbnRlbnRPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbmF0aXZlIHdpZGdldCBoYXMgY29udGVudCBub3cKICAgICAgICAgICAgICAgIHZhciAkQ29udGVudCA9ICROYXRpdmVXaWRnZXQuZmluZCgnLkNvbnRlbnQnKTsKICAgICAgICAgICAgICAgIHZhciBDb250ZW50VGV4dCA9ICRDb250ZW50LnRleHQoKS50cmltKCk7CgogICAgICAgICAgICAgICAgLy8gSWYgY29udGVudCBpcyBub3QgIm5vbmUiIGFuZCBub3QgZW1wdHksIHRyeSB0byBleHRyYWN0IGN1c3RvbWVyIGRhdGEKICAgICAgICAgICAgICAgIGlmIChDb250ZW50VGV4dCAmJiBDb250ZW50VGV4dCAhPT0gJ25vbmUnICYmIENvbnRlbnRUZXh0ICE9PSBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnbm9uZScpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCBDdXN0b21lclVzZXJJRCBmcm9tIHRoZSBwYWdlCiAgICAgICAgICAgICAgICAgICAgdmFyIEN1c3RvbWVyVXNlcklEID0gJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEN1c3RvbWVyVXNlcklEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZUR5bmFtaWNDdXN0b21lckluZm9XaWRnZXQoQ3VzdG9tZXJVc2VySUQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB2YXIgJE5hdGl2ZUNvbnRlbnQgPSAkTmF0aXZlV2lkZ2V0LmZpbmQoJy5Db250ZW50Jyk7CiAgICAgICAgICAgIGlmICgkTmF0aXZlQ29udGVudC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIENvbnRlbnRPYnNlcnZlci5vYnNlcnZlKCROYXRpdmVDb250ZW50WzBdLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgYSBjdXN0b21lciBpcyBhbHJlYWR5IHNlbGVjdGVkIChlLmcuLCBvbiBBZ2VudFRpY2tldEN1c3RvbWVyIHdoZW4gZWRpdGluZyBleGlzdGluZyB0aWNrZXQpCiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIHRoZSBwYWdlIGxvYWRzIHdpdGggYSBwcmUtc2VsZWN0ZWQgY3VzdG9tZXIKICAgICAgICB2YXIgJEluaXRpYWxDdXN0b21lciA9ICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpOwogICAgICAgIGlmICgkSW5pdGlhbEN1c3RvbWVyLmxlbmd0aCAmJiAkSW5pdGlhbEN1c3RvbWVyLnZhbCgpKSB7CiAgICAgICAgICAgIFVwZGF0ZUR5bmFtaWNDdXN0b21lckluZm9XaWRnZXQoJEluaXRpYWxDdXN0b21lci52YWwoKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBIaWRlIHRoZSBuYXRpdmUgQ3VzdG9tZXJJbmZvIHdpZGdldCBieSBJRCAoZm9yIHRpY2tldCBjcmVhdGUgcGFnZXMpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhpZGVOYXRpdmVDdXN0b21lckluZm9XaWRnZXRCeUlkKCkgewogICAgICAgIGZ1bmN0aW9uIEhpZGVXaWRnZXQoKSB7CiAgICAgICAgICAgIC8vIE9uIHRpY2tldCBjcmVhdGUgcGFnZXMsIHRoZSB3aWRnZXQgaGFzIElEICNDdXN0b21lckluZm8KICAgICAgICAgICAgdmFyICROYXRpdmVXaWRnZXQgPSAkKCcjQ3VzdG9tZXJJbmZvJyk7CiAgICAgICAgICAgIGlmICgkTmF0aXZlV2lkZ2V0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgbm90IG91ciB3aWRnZXQKICAgICAgICAgICAgICAgIGlmICghJE5hdGl2ZVdpZGdldC5pcygnI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCcpICYmCiAgICAgICAgICAgICAgICAgICAgISROYXRpdmVXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mbycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIEhpZGUgdGhlIHdob2xlIG91dGVyIGJveCwgbm90IGp1c3QgI0N1c3RvbWVySW5mbyBpdHNlbGY6CiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgWm51bnkgNy4zLjEsICNDdXN0b21lckluZm8ncyB0aXRsZSBsaXZlcyBpbiBhIHNpYmxpbmcKICAgICAgICAgICAgICAgICAgICAvLyAiLnNpZGViYXJXaWRnZXRUaXRsZSIsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBsZWZ0IGJlaGluZAogICAgICAgICAgICAgICAgICAgIC8vIGFzIGFuIGVtcHR5LWxvb2tpbmcgaGVhZGVyIHdpdGggbm90aGluZyB1bmRlcm5lYXRoLgogICAgICAgICAgICAgICAgICAgIFJlc29sdmVXaWRnZXRCb3goJE5hdGl2ZVdpZGdldCkuYWRkQ2xhc3MoJ0NvbGxhYkhpZGRlbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBSdW4gaW1tZWRpYXRlbHkgYW5kIHdpdGggZGVsYXlzCiAgICAgICAgSGlkZVdpZGdldCgpOwogICAgICAgIHNldFRpbWVvdXQoSGlkZVdpZGdldCwgMTAwKTsKICAgICAgICBzZXRUaW1lb3V0KEhpZGVXaWRnZXQsIDUwMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBhbiBlbXB0eSBjdXN0b21lciBpbmZvIHdpZGdldCB3aXRoIHBsYWNlaG9sZGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZUVtcHR5Q3VzdG9tZXJJbmZvV2lkZ2V0KCkgewogICAgICAgIHZhciBDb250ZW50SWQgPSAnQ29sbGFiQ3VzdG9tZXJJbmZvX0NvbnRlbnRfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSk7CgogICAgICAgIHZhciAkV2lkZ2V0ID0gJCgnPGRpdj4nKQogICAgICAgICAgICAuYXR0cignaWQnLCAnQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0JykKICAgICAgICAgICAgLmFkZENsYXNzKCdXaWRnZXRTaW1wbGUgRXhwYW5kZWQgQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0LS1lbXB0eScpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWN1c3RvbWVyLWVtYWlsJywgJycpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWN1c3RvbWVyLWxvZ2luJywgJycpOwoKICAgICAgICAvLyBIZWFkZXIKICAgICAgICB2YXIgJEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0hlYWRlcicpOwogICAgICAgIHZhciAkVG9nZ2xlID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnV2lkZ2V0QWN0aW9uIFRvZ2dsZScpOwogICAgICAgIHZhciAkVG9nZ2xlTGluayA9ICQoJzxhPicpCiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAuYXR0cigndGl0bGUnLCAnSW5oYWx0IGVpbmJsZW5kZW4gb2RlciBhdXNibGVuZGVuJykKICAgICAgICAgICAgLmF0dHIoJ2FyaWEtY29udHJvbHMnLCBDb250ZW50SWQpCiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKQogICAgICAgICAgICAuYXBwZW5kKCc8aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT4nKQogICAgICAgICAgICAuYXBwZW5kKCc8aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPicpOwogICAgICAgICRUb2dnbGUuYXBwZW5kKCRUb2dnbGVMaW5rKTsKICAgICAgICAkSGVhZGVyLmFwcGVuZCgkVG9nZ2xlKTsKICAgICAgICAkSGVhZGVyLmFwcGVuZCgnPGgyPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3VzdG9tZXIgSW5mb3JtYXRpb24nKSArICc8L2gyPicpOwogICAgICAgICRXaWRnZXQuYXBwZW5kKCRIZWFkZXIpOwoKICAgICAgICAvLyBDb250ZW50IHdpdGggcGxhY2Vob2xkZXIKICAgICAgICB2YXIgJENvbnRlbnQgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29udGVudCcpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsIENvbnRlbnRJZCk7CgogICAgICAgIHZhciAkUGxhY2Vob2xkZXIgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19wbGFjZWhvbGRlcicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxpIGNsYXNzPSJmYSBmYS11c2VyLWNpcmNsZSI+PC9pPicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxzcGFuPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gY3VzdG9tZXIgc2VsZWN0ZWQnKSArICc8L3NwYW4+JykKICAgICAgICAgICAgLmFwcGVuZCgnPHNtYWxsPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgdG8gc2VlIGRldGFpbHMnKSArICc8L3NtYWxsPicpOwoKICAgICAgICAkQ29udGVudC5hcHBlbmQoJFBsYWNlaG9sZGVyKTsKICAgICAgICAkV2lkZ2V0LmFwcGVuZCgkQ29udGVudCk7CgogICAgICAgIC8vIFNldHVwIHRvZ2dsZSBmdW5jdGlvbmFsaXR5CiAgICAgICAgJFRvZ2dsZUxpbmsub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICRXaWRnZXQudG9nZ2xlQ2xhc3MoJ0V4cGFuZGVkIENvbGxhcHNlZCcpOwogICAgICAgICAgICB2YXIgSXNFeHBhbmRlZCA9ICRXaWRnZXQuaGFzQ2xhc3MoJ0V4cGFuZGVkJyk7CiAgICAgICAgICAgICQodGhpcykuYXR0cignYXJpYS1leHBhbmRlZCcsIElzRXhwYW5kZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuICRXaWRnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFNob3cgZW1wdHkgcGxhY2Vob2xkZXIgaW4gdGhlIHdpZGdldAogICAgICovCiAgICBmdW5jdGlvbiBTaG93RW1wdHlDdXN0b21lckluZm9XaWRnZXQoKSB7CiAgICAgICAgdmFyICRXaWRnZXQgPSAkKCcjQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0Jyk7CiAgICAgICAgaWYgKCEkV2lkZ2V0Lmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAkV2lkZ2V0LmFkZENsYXNzKCdDb2xsYWJDdXN0b21lckluZm9XaWRnZXQtLWVtcHR5Jyk7CiAgICAgICAgJFdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWVtYWlsJywgJycpOwogICAgICAgICRXaWRnZXQuYXR0cignZGF0YS1jdXN0b21lci1sb2dpbicsICcnKTsKCiAgICAgICAgdmFyICRDb250ZW50ID0gJFdpZGdldC5maW5kKCcuQ29udGVudCcpOwogICAgICAgICRDb250ZW50LmVtcHR5KCk7CgogICAgICAgIHZhciAkUGxhY2Vob2xkZXIgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19wbGFjZWhvbGRlcicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxpIGNsYXNzPSJmYSBmYS11c2VyLWNpcmNsZSI+PC9pPicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxzcGFuPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gY3VzdG9tZXIgc2VsZWN0ZWQnKSArICc8L3NwYW4+JykKICAgICAgICAgICAgLmFwcGVuZCgnPHNtYWxsPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgdG8gc2VlIGRldGFpbHMnKSArICc8L3NtYWxsPicpOwoKICAgICAgICAkQ29udGVudC5hcHBlbmQoJFBsYWNlaG9sZGVyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBkeW5hbWljIGN1c3RvbWVyIGluZm8gd2lkZ2V0IHdpdGggY3VzdG9tZXIgZGF0YQogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyVXNlcklEIC0gVGhlIGN1c3RvbWVyIHVzZXIgbG9naW4vSUQKICAgICAqLwogICAgZnVuY3Rpb24gVXBkYXRlRHluYW1pY0N1c3RvbWVySW5mb1dpZGdldChDdXN0b21lclVzZXJJRCkgewogICAgICAgIGlmICghQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgU2hvd0VtcHR5Q3VzdG9tZXJJbmZvV2lkZ2V0KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciAkV2lkZ2V0ID0gJCgnI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCcpOwogICAgICAgIGlmICghJFdpZGdldC5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3QKICAgICAgICBpZiAoRHluYW1pY1dpZGdldFBlbmRpbmdSZXF1ZXN0KSB7CiAgICAgICAgICAgIER5bmFtaWNXaWRnZXRQZW5kaW5nUmVxdWVzdC5hYm9ydCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvdyBsb2FkaW5nIHN0YXRlCiAgICAgICAgJFdpZGdldC5yZW1vdmVDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0LS1lbXB0eScpOwogICAgICAgIHZhciAkQ29udGVudCA9ICRXaWRnZXQuZmluZCgnLkNvbnRlbnQnKTsKICAgICAgICAkQ29udGVudC5odG1sKCc8ZGl2IGNsYXNzPSJDb2xsYWJDdXN0b21lckluZm9fX2xvYWRpbmciPjxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT48L2Rpdj4nKTsKCiAgICAgICAgLy8gRmV0Y2ggY3VzdG9tZXIgZGF0YSBmcm9tIGJhY2tlbmQKICAgICAgICAvLyBGb3JUaWNrZXRDcmVhdGU9MSBza2lwcyB0aWNrZXQgcGVybWlzc2lvbiBjaGVjayAoYWdlbnQgaXMgY3JlYXRpbmcgYSBuZXcgdGlja2V0KQogICAgICAgIER5bmFtaWNXaWRnZXRQZW5kaW5nUmVxdWVzdCA9ICQuYWpheCh7CiAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnR2V0Q3VzdG9tZXJEYXRhJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luOiBDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgIEZvclRpY2tldENyZWF0ZTogMQogICAgICAgICAgICB9LAogICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihSZXNwb25zZSkgewogICAgICAgICAgICAgICAgRHluYW1pY1dpZGdldFBlbmRpbmdSZXF1ZXN0ID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcyAmJiBSZXNwb25zZS5EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEN1c3RvbWVyRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IFJlc3BvbnNlLkRhdGEuVXNlckVtYWlsIHx8IEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBsb2dpbjogUmVzcG9uc2UuRGF0YS5Vc2VyTG9naW4gfHwgQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFJlc3BvbnNlLkRhdGEuVXNlckZ1bGxuYW1lIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55OiBSZXNwb25zZS5EYXRhLlVzZXJDdXN0b21lcklEIHx8ICcnCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWVtYWlsJywgQ3VzdG9tZXJEYXRhLmVtYWlsKTsKICAgICAgICAgICAgICAgICAgICAkV2lkZ2V0LmF0dHIoJ2RhdGEtY3VzdG9tZXItbG9naW4nLCBDdXN0b21lckRhdGEubG9naW4pOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAvLyBJdCBuZWVkcyBhIGZpZWxkc2V0IHdpdGggY2xhc3MgQ29sbGFiQ3VzdG9tZXJJbmZvIGluIHRoZSBDb250ZW50CiAgICAgICAgICAgICAgICAgICAgdmFyICRDb250ZW50QXJlYSA9ICRXaWRnZXQuZmluZCgnLkNvbnRlbnQnKTsKICAgICAgICAgICAgICAgICAgICAkQ29udGVudEFyZWEuaHRtbCgnPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyBDb2xsYWJDdXN0b21lckluZm8iPjxkaXYgY2xhc3M9IkNvbGxhYkN1c3RvbWVySW5mb19fbG9hZGluZyI+PGkgY2xhc3M9ImZhIGZhLXNwaW5uZXIgZmEtc3BpbiI+PC9pPjwvZGl2PjwvZmllbGRzZXQ+Jyk7CgogICAgICAgICAgICAgICAgICAgIFBvcHVsYXRlQ3VzdG9tZXJJbmZvV2lkZ2V0KCRXaWRnZXQsIEN1c3RvbWVyRGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEVycm9yIG9yIG5vIGRhdGEgLSBzaG93IGVycm9yIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnQuaHRtbCgnPGRpdiBjbGFzcz0iQ29sbGFiQ3VzdG9tZXJJbmZvX19lcnJvciI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIj48L2k+ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuRXJyb3IgPyBSZXNwb25zZS5FcnJvciA6ICdGYWlsZWQgdG8gbG9hZCBjdXN0b21lciBkYXRhJykgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbih4aHIsIHN0YXR1cykgewogICAgICAgICAgICAgICAgRHluYW1pY1dpZGdldFBlbmRpbmdSZXF1ZXN0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAkQ29udGVudC5odG1sKCc8ZGl2IGNsYXNzPSJDb2xsYWJDdXN0b21lckluZm9fX2Vycm9yIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi1jaXJjbGUiPjwvaT4gRmFpbGVkIHRvIGxvYWQgY3VzdG9tZXIgZGF0YScgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZSB0aGUgY3VzdG9tZXIgaW5mb3JtYXRpb24gd2lkZ2V0CiAgICAgKi8KICAgIGZ1bmN0aW9uIEluaXRDdXN0b21lckluZm9XaWRnZXQoKSB7CiAgICAgICAgdmFyIENvbmZpZyA9IENvbGxhYi5HZXRDb25maWcoKTsKCiAgICAgICAgaWYgKCFDb25maWcuU2hvd0N1c3RvbWVySW5mb1dpZGdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IG9uIHRpY2tldCB6b29tIHBhZ2VzCiAgICAgICAgaWYgKCFDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldElEJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJldmVudCBkb3VibGUgaW5pdGlhbGl6YXRpb24KICAgICAgICBpZiAoQ3VzdG9tZXJJbmZvV2lkZ2V0SW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBDdXN0b21lckluZm9XaWRnZXRJbml0aWFsaXplZCA9IHRydWU7CgogICAgICAgIC8vIEhpZGUgbmF0aXZlIHdpZGdldCBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKENvbmZpZy5IaWRlTmF0aXZlQ3VzdG9tZXJJbmZvKSB7CiAgICAgICAgICAgIEhpZGVOYXRpdmVDdXN0b21lckluZm9XaWRnZXQoKTsKICAgICAgICB9CgogICAgICAgIC8vIEdldCBjdXN0b21lciBkYXRhIGZyb20gcGFnZQogICAgICAgIHZhciBDdXN0b21lckRhdGEgPSBHZXRDdXN0b21lckRhdGFGcm9tUGFnZUZvcldpZGdldCgpOwogICAgICAgIGlmICghQ3VzdG9tZXJEYXRhIHx8ICFDdXN0b21lckRhdGEuZW1haWwpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ3JlYXRlIHdpZGdldCBjb250YWluZXIKICAgICAgICB2YXIgJFdpZGdldCA9IENyZWF0ZUN1c3RvbWVySW5mb1dpZGdldEVsZW1lbnQoQ3VzdG9tZXJEYXRhKTsKCiAgICAgICAgLy8gSW5zZXJ0IGF0IFRPUCBvZiBzaWRlYmFyIChiZWZvcmUgYWxsIG90aGVyIHdpZGdldHMpCiAgICAgICAgdmFyICRTaWRlYmFyID0gR2V0U2lkZWJhckNvbnRhaW5lcigpOwogICAgICAgIGlmICgkU2lkZWJhci5sZW5ndGgpIHsKICAgICAgICAgICAgJFNpZGViYXIucHJlcGVuZCgkV2lkZ2V0KTsKICAgICAgICB9CgogICAgICAgIC8vIFBvcHVsYXRlIHdpdGggZGF0YQogICAgICAgIFBvcHVsYXRlQ3VzdG9tZXJJbmZvV2lkZ2V0KCRXaWRnZXQsIEN1c3RvbWVyRGF0YSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEhpZGUgdGhlIG5hdGl2ZSBabnVueSBDdXN0b21lciBJbmZvcm1hdGlvbiB3aWRnZXQKICAgICAqICAgICAgICAgICAgICBPTkxZIGhpZGVzICJLdW5kZW5pbmZvcm1hdGlvbiIgLyAiQ3VzdG9tZXIgSW5mb3JtYXRpb24iIC0gTk9UICJUaWNrZXQtSW5mb3JtYXRpb25lbiIKICAgICAqLwogICAgZnVuY3Rpb24gSGlkZU5hdGl2ZUN1c3RvbWVySW5mb1dpZGdldCgpIHsKICAgICAgICAvLyBGdW5jdGlvbiB0byBoaWRlIHRoZSB3aWRnZXQgb25jZSBmb3VuZAogICAgICAgIGZ1bmN0aW9uIEhpZGVXaWRnZXQoKSB7CiAgICAgICAgICAgIC8vIEFwcHJvYWNoIDE6IFdpZGdldCBieSBoZWFkZXIgdGV4dCAobW9zdCByZWxpYWJsZSAtIEdlcm1hbi9FbmdsaXNoKQogICAgICAgICAgICAvLyBCZSB2ZXJ5IHNwZWNpZmljOiBvbmx5IGV4YWN0IG1hdGNoZXMgZm9yIGN1c3RvbWVyIGluZm8gd2lkZ2V0IHRpdGxlcy4KICAgICAgICAgICAgLy8gU2luY2UgWm51bnkgNy4zLjEsIHRoZSB0aXRsZSBsaXZlcyBpbiAiLnNpZGViYXJXaWRnZXRUaXRsZSBoMyIKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgb2xkICIuV2lkZ2V0U2ltcGxlIC5IZWFkZXIgaDIiIC0gY2hlY2sgYm90aC4KICAgICAgICAgICAgJCgnLlNpZGViYXJDb2x1bW4gLldpZGdldFNpbXBsZSAuSGVhZGVyIGgyLCAuc2lkZWJhckNvbnRlbnQgLnNpZGViYXJXaWRnZXRUaXRsZSBoMycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgVGV4dCA9ICQodGhpcykudGV4dCgpLnRyaW0oKTsKICAgICAgICAgICAgICAgIC8vIE9ubHkgaGlkZSBpZiBoZWFkZXIgbWF0Y2hlcyBjdXN0b21lciBpbmZvcm1hdGlvbiBleGFjdGx5CiAgICAgICAgICAgICAgICAvLyBOT1QgIlRpY2tldC1JbmZvcm1hdGlvbmVuIiBvciBzaW1pbGFyCiAgICAgICAgICAgICAgICBpZiAoVGV4dCA9PT0gJ0N1c3RvbWVyIEluZm9ybWF0aW9uJyB8fAogICAgICAgICAgICAgICAgICAgIFRleHQgPT09ICdLdW5kZW5pbmZvcm1hdGlvbicgfHwKICAgICAgICAgICAgICAgICAgICBUZXh0ID09PSAnQ3VzdG9tZXIgVXNlciBJbmZvcm1hdGlvbicgfHwKICAgICAgICAgICAgICAgICAgICBUZXh0ID09PSAnS3VuZGVuYmVudXR6ZXItSW5mb3JtYXRpb25lbicpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJFdpZGdldCA9IFJlc29sdmVXaWRnZXRCb3goJCh0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgaGlkZSBvdXIgb3duIHdpZGdldAogICAgICAgICAgICAgICAgICAgIGlmICgkV2lkZ2V0Lmxlbmd0aCAmJgogICAgICAgICAgICAgICAgICAgICAgICAhJFdpZGdldC5pcygnI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCcpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICEkV2lkZ2V0LmZpbmQoJy5Db2xsYWJDdXN0b21lckluZm8nKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5hZGRDbGFzcygnQ29sbGFiSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIEFwcHJvYWNoIDI6IEFzeW5jIHdpZGdldCBieSBzcGVjaWZpYyBJRCBwYXR0ZXJuCiAgICAgICAgICAgIC8vIFpudW55IHVzZXMgZm9ybWF0IGxpa2UgIkFzeW5jXzAyMDAtQ3VzdG9tZXJJbmZvcm1hdGlvbiIKICAgICAgICAgICAgJCgnW2lkKj0iLUN1c3RvbWVySW5mb3JtYXRpb24iXScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgJFdpZGdldCA9IFJlc29sdmVXaWRnZXRCb3goJCh0aGlzKSk7CiAgICAgICAgICAgICAgICBpZiAoJFdpZGdldC5sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAhJFdpZGdldC5pcygnI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCcpICYmCiAgICAgICAgICAgICAgICAgICAgISRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mbycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICRXaWRnZXQuYWRkQ2xhc3MoJ0NvbGxhYkhpZGRlbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIFJ1biBpbW1lZGlhdGVseQogICAgICAgIEhpZGVXaWRnZXQoKTsKCiAgICAgICAgLy8gQWxzbyBydW4gYWZ0ZXIgYSBkZWxheSAoZm9yIGFzeW5jIHdpZGdldHMpCiAgICAgICAgc2V0VGltZW91dChIaWRlV2lkZ2V0LCA1MDApOwogICAgICAgIHNldFRpbWVvdXQoSGlkZVdpZGdldCwgMTUwMCk7CgogICAgICAgIC8vIFVzZSBNdXRhdGlvbk9ic2VydmVyIHRvIGNhdGNoIGFzeW5jIHdpZGdldCBsb2FkaW5nCiAgICAgICAgdmFyIE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEhpZGVXaWRnZXQoKTsKICAgICAgICB9KTsKICAgICAgICBPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwoKICAgICAgICAvLyBTdG9wIG9ic2VydmluZyBhZnRlciA1IHNlY29uZHMKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBPYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgfSwgNTAwMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXN0b21lciBkYXRhIGZyb20gcGFnZSBmb3IgdGhlIHdpZGdldAogICAgICovCiAgICBmdW5jdGlvbiBHZXRDdXN0b21lckRhdGFGcm9tUGFnZUZvcldpZGdldCgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBsb2dpbjogJycsCiAgICAgICAgICAgIG5hbWU6ICcnLAogICAgICAgICAgICBlbWFpbDogJycsCiAgICAgICAgICAgIGNvbXBhbnk6ICcnCiAgICAgICAgfTsKCiAgICAgICAgLy8gUHJpbWFyeSBzb3VyY2U6IFNlcnZlci1zaWRlIGluamVjdGVkIGRhdGEgZnJvbSBPdXRwdXQgRmlsdGVyCiAgICAgICAgaWYgKENvbmZpZy5DdXN0b21lckVtYWlsKSB7CiAgICAgICAgICAgIERhdGEuZW1haWwgPSBDb25maWcuQ3VzdG9tZXJFbWFpbDsKICAgICAgICAgICAgRGF0YS5sb2dpbiA9IENvbmZpZy5DdXN0b21lckxvZ2luIHx8IENvbmZpZy5DdXN0b21lckVtYWlsOwogICAgICAgICAgICBEYXRhLm5hbWUgPSBDb25maWcuQ3VzdG9tZXJOYW1lIHx8ICcnOwogICAgICAgICAgICByZXR1cm4gRGF0YTsKICAgICAgICB9CgogICAgICAgIC8vIEZhbGxiYWNrOiBUcnkgdG8gZ2V0IGZyb20gZXhpc3RpbmcgdGlja2V0IGluZm8KICAgICAgICAvLyBNZXRob2QgMTogRnJvbSBzaWRlYmFyIGxpbmtzCiAgICAgICAgdmFyICRDdXN0b21lckxpbmsgPSBHZXRTaWRlYmFyQ29udGFpbmVyKCkuZmluZCgnYVtocmVmKj0iQWdlbnRDdXN0b21lckluZm9ybWF0aW9uQ2VudGVyIl0nKS5maXJzdCgpOwogICAgICAgIGlmICgkQ3VzdG9tZXJMaW5rLmxlbmd0aCkgewogICAgICAgICAgICBEYXRhLm5hbWUgPSAkQ3VzdG9tZXJMaW5rLnRleHQoKS50cmltKCk7CgogICAgICAgICAgICAvLyBFeHRyYWN0IEN1c3RvbWVyVXNlckxvZ2luIGZyb20gVVJMCiAgICAgICAgICAgIHZhciBIcmVmID0gJEN1c3RvbWVyTGluay5hdHRyKCdocmVmJykgfHwgJyc7CiAgICAgICAgICAgIHZhciBNYXRjaCA9IEhyZWYubWF0Y2goL0N1c3RvbWVyVXNlckxvZ2luPShbXiY7XSspLyk7CiAgICAgICAgICAgIGlmIChNYXRjaCkgewogICAgICAgICAgICAgICAgRGF0YS5sb2dpbiA9IGRlY29kZVVSSUNvbXBvbmVudChNYXRjaFsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE1ldGhvZCAyOiBMb29rIGZvciBlbWFpbCBpbiBzaWRlYmFyIHRleHQKICAgICAgICBpZiAoIURhdGEuZW1haWwpIHsKICAgICAgICAgICAgR2V0U2lkZWJhckNvbnRhaW5lcigpLmZpbmQoJy5WYWx1ZSwgdGQsIC5GaWVsZFZhbHVlJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBUZXh0ID0gJCh0aGlzKS50ZXh0KCk7CiAgICAgICAgICAgICAgICB2YXIgRW1haWxNYXRjaCA9IFRleHQubWF0Y2goL1tcdy4tXStAW1x3Li1dK1wuXHcrLyk7CiAgICAgICAgICAgICAgICBpZiAoRW1haWxNYXRjaCkgewogICAgICAgICAgICAgICAgICAgIERhdGEuZW1haWwgPSBFbWFpbE1hdGNoWzBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYnJlYWsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBNZXRob2QgNDogRnJvbSBleGlzdGluZyBDb2xsYWJXaWRnZXQgY29udGFpbmVyCiAgICAgICAgdmFyICRDb2xsYWJXaWRnZXQgPSAkKCcjQ29sbGFiV2lkZ2V0Jyk7CiAgICAgICAgaWYgKCRDb2xsYWJXaWRnZXQubGVuZ3RoICYmICRDb2xsYWJXaWRnZXQuYXR0cignZGF0YS1jdXN0b21lci1lbWFpbCcpKSB7CiAgICAgICAgICAgIERhdGEuZW1haWwgPSAkQ29sbGFiV2lkZ2V0LmF0dHIoJ2RhdGEtY3VzdG9tZXItZW1haWwnKTsKICAgICAgICB9CgogICAgICAgIC8vIFVzZSBlbWFpbCBhcyBsb2dpbiBmYWxsYmFjawogICAgICAgIGlmICghRGF0YS5sb2dpbiAmJiBEYXRhLmVtYWlsKSB7CiAgICAgICAgICAgIERhdGEubG9naW4gPSBEYXRhLmVtYWlsOwogICAgICAgIH0KCiAgICAgICAgLy8gVXNlIGxvZ2luIGFzIGVtYWlsIGZhbGxiYWNrIChpZiBsb2dpbiBsb29rcyBsaWtlIGVtYWlsKQogICAgICAgIGlmICghRGF0YS5lbWFpbCAmJiBEYXRhLmxvZ2luICYmIERhdGEubG9naW4uaW5kZXhPZignQCcpID4gLTEpIHsKICAgICAgICAgICAgRGF0YS5lbWFpbCA9IERhdGEubG9naW47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gRGF0YTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIHRoZSBjdXN0b21lciBpbmZvIHdpZGdldCBlbGVtZW50IChtYXRjaGluZyBuYXRpdmUgWm51bnkgc3RydWN0dXJlKQogICAgICovCiAgICBmdW5jdGlvbiBDcmVhdGVDdXN0b21lckluZm9XaWRnZXRFbGVtZW50KEN1c3RvbWVyRGF0YSkgewogICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBJRCBmb3IgYXJpYS1jb250cm9scwogICAgICAgIHZhciBDb250ZW50SWQgPSAnQ29sbGFiQ3VzdG9tZXJJbmZvX0NvbnRlbnRfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSk7CgogICAgICAgIHZhciAkV2lkZ2V0ID0gJCgnPGRpdj4nKQogICAgICAgICAgICAuYXR0cignaWQnLCAnQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0JykKICAgICAgICAgICAgLmFkZENsYXNzKCdXaWRnZXRTaW1wbGUgRXhwYW5kZWQnKQogICAgICAgICAgICAuYXR0cignZGF0YS1jdXN0b21lci1lbWFpbCcsIEN1c3RvbWVyRGF0YS5lbWFpbCkKICAgICAgICAgICAgLmF0dHIoJ2RhdGEtY3VzdG9tZXItbG9naW4nLCBDdXN0b21lckRhdGEubG9naW4pOwoKICAgICAgICAvLyBIZWFkZXIgKGV4YWN0IG5hdGl2ZSBabnVueSBzdHJ1Y3R1cmUpCiAgICAgICAgdmFyICRIZWFkZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdIZWFkZXInKTsKCiAgICAgICAgLy8gVG9nZ2xlIGJ1dHRvbiAobmF0aXZlIFpudW55IGNvbGxhcHNpYmxlIHdpZGdldCkKICAgICAgICB2YXIgJFRvZ2dsZSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ1dpZGdldEFjdGlvbiBUb2dnbGUnKTsKICAgICAgICB2YXIgJFRvZ2dsZUxpbmsgPSAkKCc8YT4nKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgJ0luaGFsdCBlaW5ibGVuZGVuIG9kZXIgYXVzYmxlbmRlbicpCiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWNvbnRyb2xzJywgQ29udGVudElkKQogICAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJykKICAgICAgICAgICAgLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+Jyk7CiAgICAgICAgJFRvZ2dsZS5hcHBlbmQoJFRvZ2dsZUxpbmspOwogICAgICAgICRIZWFkZXIuYXBwZW5kKCRUb2dnbGUpOwoKICAgICAgICAvLyBUaXRsZQogICAgICAgICRIZWFkZXIuYXBwZW5kKCc8aDI+S3VuZGVuaW5mb3JtYXRpb248L2gyPicpOwogICAgICAgICRXaWRnZXQuYXBwZW5kKCRIZWFkZXIpOwoKICAgICAgICAvLyBDb250ZW50IGNvbnRhaW5lciAobmF0aXZlIFpudW55IHN0cnVjdHVyZSkKICAgICAgICB2YXIgJENvbnRlbnQgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb250ZW50JykuYXR0cignaWQnLCBDb250ZW50SWQpOwoKICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIGluc2lkZSBmaWVsZHNldAogICAgICAgIHZhciAkRmllbGRzZXQgPSAkKCc8ZmllbGRzZXQ+JykuYWRkQ2xhc3MoJ1RhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93IENvbGxhYkN1c3RvbWVySW5mbycpOwogICAgICAgICRGaWVsZHNldC5hcHBlbmQoCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJDdXN0b21lckluZm9fX2xvYWRpbmciIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjIwcHg7Ij4nICsKICAgICAgICAgICAgJzxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT4nICsKICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICApOwoKICAgICAgICAkQ29udGVudC5hcHBlbmQoJEZpZWxkc2V0KTsKICAgICAgICAkV2lkZ2V0LmFwcGVuZCgkQ29udGVudCk7CgogICAgICAgIHJldHVybiAkV2lkZ2V0OwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBQb3B1bGF0ZSB0aGUgY3VzdG9tZXIgaW5mbyB3aWRnZXQgd2l0aCBkYXRhCiAgICAgKiAgICAgICAgICAgICAgVXNlcyBzYW1lIHN0cnVjdHVyZSBhcyBIZWFkZXJVc2VyQmFkZ2UgKENvbGxhYlVzZXJCYWRnZSBjbGFzc2VzKQogICAgICovCiAgICBmdW5jdGlvbiBQb3B1bGF0ZUN1c3RvbWVySW5mb1dpZGdldCgkV2lkZ2V0LCBDdXN0b21lckRhdGEpIHsKICAgICAgICB2YXIgJEZpZWxkc2V0ID0gJFdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvJyk7CgogICAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGUKICAgICAgICAkRmllbGRzZXQuaHRtbCgnPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PicpOwoKICAgICAgICAvLyBDdXN0b21lciBiYWRnZSAtIHJldXNlIENvbGxhYlVzZXJCYWRnZSBzdHJ1Y3R1cmUgKGxpa2UgSGVhZGVyVXNlckJhZGdlKQogICAgICAgIHZhciAkQmFkZ2UgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQgQ29sbGFiQ3VzdG9tZXJJbmZvX19iYWRnZScpOwoKICAgICAgICAvLyBNYWluIHJvdyAtIGNvbnRhaW5zIEF2YXRhciArIEluZm8gKHRoaXMgaXMgdGhlIGhvdmVyIHRyaWdnZXIgYXJlYSkKICAgICAgICB2YXIgJE1haW5Sb3cgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJDdXN0b21lckluZm9fX21haW5Sb3cnKTsKICAgICAgICAvLyBBZGQgaG92ZXIgdHJpZ2dlciBvbmx5IHRvIG1haW4gcm93IChhdmF0YXIsIG5hbWUsIHRpdGxlKSAtIG5vdCBiYWRnZXMKICAgICAgICBpZiAoQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0hvdmVyQ2FyZHMnKSkgewogICAgICAgICAgICAkTWFpblJvdy5hZGRDbGFzcygnQ29sbGFiSG92ZXJUcmlnZ2VyJykuYXR0cignZGF0YS1lbWFpbCcsIEN1c3RvbWVyRGF0YS5lbWFpbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBBdmF0YXIgd3JhcHBlciAtIHNhbWUgc3RydWN0dXJlIGFzIEhlYWRlclVzZXJCYWRnZQogICAgICAgIHZhciAkQXZhdGFyV3JhcCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZV9fYXZhdGFyJyk7CgogICAgICAgIC8vIENyZWF0ZSBhdmF0YXIgbWFudWFsbHkgKGxpa2UgSGVhZGVyVXNlckJhZGdlIGRvZXMpCiAgICAgICAgdmFyICRBdmF0YXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXIgQ29sbGFiQXZhdGFyLS1sYXJnZScpOwogICAgICAgIHZhciAkRmFsbGJhY2sgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykudGV4dChHZXRJbml0aWFscyhDdXN0b21lckRhdGEuZW1haWwsIEN1c3RvbWVyRGF0YS5uYW1lKSk7CiAgICAgICAgdmFyICRQcmVzZW5jZSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlIENvbGxhYlByZXNlbmNlLS11bmtub3duJyk7CgogICAgICAgIC8vIENyZWF0ZSBpbWcgZWxlbWVudCBTWU5DSFJPTk9VU0xZIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggUmVmcmVzaEN1c3RvbWVySW5mb1dpZGdldAogICAgICAgIHZhciAkSW1nID0gbnVsbDsKICAgICAgICBpZiAoQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0F2YXRhcicpKSB7CiAgICAgICAgICAgICRJbWcgPSAkKCc8aW1nPicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ltYWdlJykuYXR0cignYWx0JywgJycpOwogICAgICAgICAgICAkQXZhdGFyLnByZXBlbmQoJEltZyk7CiAgICAgICAgfQogICAgICAgICRBdmF0YXIuYXBwZW5kKCRGYWxsYmFjaywgJFByZXNlbmNlKTsKICAgICAgICAkQXZhdGFyV3JhcC5hcHBlbmQoJEF2YXRhcik7CgogICAgICAgIC8vIEluZm8gYXJlYSAtIHNhbWUgc3RydWN0dXJlIGFzIEhlYWRlclVzZXJCYWRnZQogICAgICAgIHZhciAkSW5mbyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZV9faW5mbycpOwogICAgICAgIHZhciAkTmFtZSA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX25hbWUnKS50ZXh0KEN1c3RvbWVyRGF0YS5uYW1lIHx8IEN1c3RvbWVyRGF0YS5lbWFpbCk7CiAgICAgICAgdmFyICRUaXRsZSA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX3RpdGxlJykudGV4dCgnJyk7IC8vIEZpbGxlZCBsYXRlciB2aWEgQUpBWAogICAgICAgICRJbmZvLmFwcGVuZCgkTmFtZSwgJFRpdGxlKTsKCiAgICAgICAgJE1haW5Sb3cuYXBwZW5kKCRBdmF0YXJXcmFwLCAkSW5mbyk7CgogICAgICAgICRCYWRnZS5hcHBlbmQoJE1haW5Sb3cpOwogICAgICAgICRGaWVsZHNldC5hcHBlbmQoJEJhZGdlKTsKCiAgICAgICAgLy8gTG9hZCBhdmF0YXIgVVJMIGFzeW5jaHJvbm91c2x5CiAgICAgICAgJFdpZGdldC5hdHRyKCdkYXRhLWF2YXRhci1sb2FkaW5nJywgJ3RydWUnKTsKICAgICAgICBpZiAoQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0F2YXRhcicpICYmICRJbWcpIHsKICAgICAgICAgICAgQ29sbGFiLkdldEF2YXRhcihDdXN0b21lckRhdGEuZW1haWwpLnRoZW4oZnVuY3Rpb24oQXZhdGFyVXJsKSB7CiAgICAgICAgICAgICAgICBpZiAoQXZhdGFyVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgc3JjIGlmIG5ldyB2YWx1ZSBpcyAiYmV0dGVyIiAocmVhbCBpbWFnZSB2cyBTVkcgZmFsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRTcmMgPSAkSW1nLmF0dHIoJ3NyYycpIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIHZhciBOZXdJc1N2Z0ZhbGxiYWNrID0gQXZhdGFyVXJsLmluZGV4T2YoJ2RhdGE6aW1hZ2Uvc3ZnJykgPT09IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRJc1N2Z0ZhbGxiYWNrID0gIUN1cnJlbnRTcmMgfHwgQ3VycmVudFNyYy5pbmRleE9mKCdkYXRhOmltYWdlL3N2ZycpID09PSAwOwogICAgICAgICAgICAgICAgICAgIHZhciBTaG91bGRVcGRhdGUgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50SXNTdmdGYWxsYmFjayB8fCAhTmV3SXNTdmdGYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICBpZiAoU2hvdWxkVXBkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJbWcuYXR0cignc3JjJywgQXZhdGFyVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEZhbGxiYWNrLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJFdpZGdldC5yZW1vdmVBdHRyKCdkYXRhLWF2YXRhci1sb2FkaW5nJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRXaWRnZXQucmVtb3ZlQXR0cignZGF0YS1hdmF0YXItbG9hZGluZycpOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9hZCBwcmVzZW5jZSBhc3luY2hyb25vdXNseSAobGlrZSBIZWFkZXJVc2VyQmFkZ2UpCiAgICAgICAgaWYgKENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdQcmVzZW5jZScpKSB7CiAgICAgICAgICAgIENvbGxhYi5HZXRQcmVzZW5jZShDdXN0b21lckRhdGEuZW1haWwpLnRoZW4oZnVuY3Rpb24oUHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgIHZhciBQcmVzZW5jZUNsYXNzID0gR2V0UHJlc2VuY2VDbGFzcyhQcmVzZW5jZS5zdGF0dXMpOwogICAgICAgICAgICAgICAgJFByZXNlbmNlCiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKGZ1bmN0aW9uKGksIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjLm1hdGNoKC9Db2xsYWJQcmVzZW5jZS0tXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlICcgKyBQcmVzZW5jZUNsYXNzKTsKCiAgICAgICAgICAgICAgICAvLyBTaG93IHdvcmsgbG9jYXRpb24gYmFkZ2UgKG9mZmljZS9yZW1vdGUpIG9yIFRpbWUgb2ZmICh3aGVuIE9PRiBpcyBhY3RpdmUpCiAgICAgICAgICAgICAgICB2YXIgV29ya0xvY2F0aW9uTGFiZWxzID0gewogICAgICAgICAgICAgICAgICAgICdvZmZpY2UnOiAnT2ZmaWNlJywKICAgICAgICAgICAgICAgICAgICAncmVtb3RlJzogJ1JlbW90ZScsCiAgICAgICAgICAgICAgICAgICAgJ3RpbWVPZmYnOiAnVGltZSBvZmYnCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkljb25zID0gewogICAgICAgICAgICAgICAgICAgICdvZmZpY2UnOiAnZmEtYnVpbGRpbmcnLAogICAgICAgICAgICAgICAgICAgICdyZW1vdGUnOiAnZmEtaG9tZScsCiAgICAgICAgICAgICAgICAgICAgJ3RpbWVPZmYnOiAnZmEtc2lnbi1vdXQnCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBsb2NhdGlvbiB0eXBlOiBPT0YgdGFrZXMgcHJlY2VkZW5jZSwgdGhlbiB3b3JrTG9jYXRpb24KICAgICAgICAgICAgICAgIHZhciBMb2NhdGlvblR5cGUgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKFByZXNlbmNlLmFjdGl2aXR5ID09PSAnT3V0T2ZPZmZpY2UnKSB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25UeXBlID0gJ3RpbWVPZmYnOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQcmVzZW5jZS53b3JrTG9jYXRpb24gJiYgUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBMb2NhdGlvblR5cGUgPSBQcmVzZW5jZS53b3JrTG9jYXRpb24udHlwZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoTG9jYXRpb25UeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIExvY2F0aW9uTGFiZWwgPSBXb3JrTG9jYXRpb25MYWJlbHNbTG9jYXRpb25UeXBlXSB8fCBMb2NhdGlvblR5cGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIExvY2F0aW9uSWNvbiA9IFdvcmtMb2NhdGlvbkljb25zW0xvY2F0aW9uVHlwZV0gfHwgJ2ZhLW1hcC1tYXJrZXInOwoKICAgICAgICAgICAgICAgICAgICAvLyBBZGQgd29yayBsb2NhdGlvbiBiYWRnZSBpbmxpbmUgYWZ0ZXIgdGl0bGUKICAgICAgICAgICAgICAgICAgICB2YXIgJFdvcmtMb2NhdGlvbiA9ICQoJzxzcGFuPicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiV29ya0xvY2F0aW9uIENvbGxhYldvcmtMb2NhdGlvbi0tJyArIExvY2F0aW9uVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aT4nKS5hZGRDbGFzcygnZmEgJyArIExvY2F0aW9uSWNvbikpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJyAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoTG9jYXRpb25MYWJlbCkpOwogICAgICAgICAgICAgICAgICAgICRXaWRnZXQuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9faW5mbycpLmFwcGVuZCgkV29ya0xvY2F0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBJdGVtUm93IGxpc3QgZm9yIGxpbmtzIChuYXRpdmUgWm51bnkgc3RydWN0dXJlKQogICAgICAgIHZhciAkSXRlbUxpc3QgPSAkKCc8dWw+JykuYWRkQ2xhc3MoJ0l0ZW1Sb3cnKTsKCiAgICAgICAgLy8gT3BlbiBUaWNrZXRzIChDdXN0b21lcikgbGluayAtIGFsbCB0aWNrZXRzIG9mIHRoZSBjdXN0b21lci9jb21wYW55CiAgICAgICAgdmFyICRUaWNrZXRJdGVtID0gJCgnPGxpPicpOwogICAgICAgIHZhciAkVGlja2V0SWNvbiA9ICQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS1pbmR1c3RyeSBPcGVuVGlja2V0Jyk7CiAgICAgICAgdmFyICRUaWNrZXRMaW5rID0gJCgnPGE+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdPcGVuVGlja2V0IENvbGxhYkN1c3RvbWVySW5mb19fdGlja2V0TGluaycpCiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpCiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPcGVuIFRpY2tldHMgKEN1c3RvbWVyKScpKQogICAgICAgICAgICAuaHRtbChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT3BlbiBUaWNrZXRzIChDdXN0b21lciknKSArICcgPHNwYW4gY2xhc3M9IkNvbGxhYkN1c3RvbWVySW5mb19fdGlja2V0Q291bnQiPiguLi4pPC9zcGFuPicpOwogICAgICAgICRUaWNrZXRMaW5rLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAvLyBVc2UgU2VhcmNoVVJMIGZyb20gYmFja2VuZCBpZiBhdmFpbGFibGUgKGNvbnRhaW5zIGNvcnJlY3QgQ3VzdG9tZXJJRCkKICAgICAgICAgICAgdmFyIFNlYXJjaFVSTCA9ICQodGhpcykuYXR0cignZGF0YS1zZWFyY2gtdXJsJyk7CiAgICAgICAgICAgIGlmIChTZWFyY2hVUkwpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKFNlYXJjaFVSTCwgJ19ibGFuaycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBDdXN0b21lclVzZXJMb2dpbiAobWF5IG5vdCBiZSBhY2N1cmF0ZSBmb3IgbXVsdGktdXNlciBjdXN0b21lcnMpCiAgICAgICAgICAgICAgICBPcGVuQ3VzdG9tZXJUaWNrZXRTZWFyY2goQ3VzdG9tZXJEYXRhLmxvZ2luKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgICRUaWNrZXRJdGVtLmFwcGVuZCgkVGlja2V0SWNvbiwgJFRpY2tldExpbmspOwogICAgICAgICRJdGVtTGlzdC5hcHBlbmQoJFRpY2tldEl0ZW0pOwoKICAgICAgICAvLyBPcGVuIFRpY2tldHMgKFVzZXIpIGxpbmsgLSB0aWNrZXRzIHdoZXJlIHRoaXMgc3BlY2lmaWMgQ3VzdG9tZXJVc2VyIGlzIGFzc2lnbmVkCiAgICAgICAgdmFyICRVc2VyVGlja2V0SXRlbSA9ICQoJzxsaT4nKTsKICAgICAgICB2YXIgJFVzZXJUaWNrZXRJY29uID0gJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhIGZhLXVzZXIgT3BlblRpY2tldCcpOwogICAgICAgIHZhciAkVXNlclRpY2tldExpbmsgPSAkKCc8YT4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ09wZW5UaWNrZXQgQ29sbGFiQ3VzdG9tZXJJbmZvX191c2VyVGlja2V0TGluaycpCiAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAuYXR0cigndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT3BlbiBUaWNrZXRzIChVc2VyKScpKQogICAgICAgICAgICAuaHRtbChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT3BlbiBUaWNrZXRzIChVc2VyKScpICsgJyA8c3BhbiBjbGFzcz0iQ29sbGFiQ3VzdG9tZXJJbmZvX191c2VyVGlja2V0Q291bnQiPiguLi4pPC9zcGFuPicpOwogICAgICAgICRVc2VyVGlja2V0TGluay5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgT3BlbkN1c3RvbWVyVXNlclRpY2tldFNlYXJjaChDdXN0b21lckRhdGEubG9naW4pOwogICAgICAgIH0pOwogICAgICAgICRVc2VyVGlja2V0SXRlbS5hcHBlbmQoJFVzZXJUaWNrZXRJY29uLCAkVXNlclRpY2tldExpbmspOwogICAgICAgICRJdGVtTGlzdC5hcHBlbmQoJFVzZXJUaWNrZXRJdGVtKTsKCiAgICAgICAgJEZpZWxkc2V0LmFwcGVuZCgkSXRlbUxpc3QpOwoKICAgICAgICAvLyBBY3Rpb24gYnV0dG9ucyBjb250YWluZXIgLSB3aWxsIGJlIHBvcHVsYXRlZCBhZnRlciBHZXRQcm9maWxlKCkgZGV0ZXJtaW5lcyB0aGUgcHJvdmlkZXIKICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Uga25vdyBpZiB0aGUgY3VzdG9tZXIgaXMgZnJvbSBNMzY1IChoYXMgVGVhbXMpIG9yIFpudW55IGZhbGxiYWNrIChubyBUZWFtcykKICAgICAgICB2YXIgJEFjdGlvbnMgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJDdXN0b21lckluZm9fX2FjdGlvbnMnKS5hdHRyKCdpZCcsICdDb2xsYWJDdXN0b21lckFjdGlvbnMnKTsKCiAgICAgICAgLy8gRmV0Y2ggYWRkaXRpb25hbCBkYXRhIGFzeW5jaHJvbm91c2x5IC0gdGhpcyB3aWxsIGFsc28gcmVuZGVyIHRoZSBhY3Rpb24gYnV0dG9ucwogICAgICAgIEZldGNoQ3VzdG9tZXJFbnJpY2htZW50RGF0YSgkV2lkZ2V0LCBDdXN0b21lckRhdGEsICRBY3Rpb25zKTsKICAgICAgICBGZXRjaEN1c3RvbWVyVGlja2V0Q291bnQoJFdpZGdldCwgQ3VzdG9tZXJEYXRhKTsKICAgICAgICBGZXRjaEN1c3RvbWVyVXNlclRpY2tldENvdW50KCRXaWRnZXQsIEN1c3RvbWVyRGF0YSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZldGNoIGN1c3RvbWVyIGVucmljaG1lbnQgZGF0YSBmcm9tIE0zNjUgb3IgWm51bnkKICAgICAqICAgICAgICAgICAgICBBbHNvIHJlbmRlcnMgYWN0aW9uIGJ1dHRvbnMgYWZ0ZXIgR2V0UHJvZmlsZSgpIGRldGVybWluZXMgdGhlIHByb3ZpZGVyIChpZiAkQWN0aW9ucyBpcyBwcm92aWRlZCkKICAgICAqLwogICAgZnVuY3Rpb24gRmV0Y2hDdXN0b21lckVucmljaG1lbnREYXRhKCRXaWRnZXQsIEN1c3RvbWVyRGF0YSwgJEFjdGlvbnMpIHsKICAgICAgICAvLyBHZXQgTTM2NSBwcm9maWxlIGRhdGEgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgKENvbGxhYi5Jc0xvZ2dlZEluKCkgJiYgQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ3Byb2ZpbGUnKSkgewogICAgICAgICAgICAvLyBGZXRjaCBwcm9maWxlIGFuZCBwcmVzZW5jZSBkYXRhIGluIHBhcmFsbGVsIChPT0YgaXMgZGVyaXZlZCBmcm9tIHByZXNlbmNlLmFjdGl2aXR5KQogICAgICAgICAgICBQcm9taXNlLmFsbChbCiAgICAgICAgICAgICAgICBDb2xsYWIuR2V0UHJvZmlsZShDdXN0b21lckRhdGEuZW1haWwpLAogICAgICAgICAgICAgICAgQ29sbGFiLkdldFByZXNlbmNlKEN1c3RvbWVyRGF0YS5lbWFpbCkuY2F0Y2goZnVuY3Rpb24oKSB7IHJldHVybiB7IHN0YXR1czogJ3Vua25vd24nIH07IH0pCiAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24oUmVzdWx0cykgewogICAgICAgICAgICAgICAgdmFyIFByb2ZpbGUgPSBSZXN1bHRzWzBdOwogICAgICAgICAgICAgICAgdmFyIFByZXNlbmNlID0gUmVzdWx0c1sxXTsKCiAgICAgICAgICAgICAgICBpZiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBqb2IgdGl0bGUgKHVzaW5nIENvbGxhYlVzZXJCYWRnZSBjbGFzc2VzKQogICAgICAgICAgICAgICAgICAgIHZhciAkVGl0bGUgPSAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFByb2ZpbGUuam9iVGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpdGxlLnRleHQoUHJvZmlsZS5qb2JUaXRsZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbmFtZSBpZiBNMzY1IGhhcyBiZXR0ZXIgZGF0YQogICAgICAgICAgICAgICAgICAgIGlmIChQcm9maWxlLmRpc3BsYXlOYW1lICYmIFByb2ZpbGUuZGlzcGxheU5hbWUgIT09IEN1c3RvbWVyRGF0YS5lbWFpbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX25hbWUnKS50ZXh0KFByb2ZpbGUuZGlzcGxheU5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBHZXRQcm9maWxlKCkgaGFzIHNldCBVc2VyUHJvdmlkZXJNYXAsIHJlbmRlciB0aGUgYWN0aW9uIGJ1dHRvbnMgKGlmICRBY3Rpb25zIHByb3ZpZGVkKQogICAgICAgICAgICAgICAgaWYgKCRBY3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgUmVuZGVyQ3VzdG9tZXJBY3Rpb25CdXR0b25zKCRXaWRnZXQsIEN1c3RvbWVyRGF0YSwgJEFjdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIE0zNjUgZGF0YSBub3QgYXZhaWxhYmxlIC0gdXNlIFpudW55IGZhbGxiYWNrCiAgICAgICAgICAgICAgICBGZXRjaFpudW55Q3VzdG9tZXJEYXRhKCRXaWRnZXQsIEN1c3RvbWVyRGF0YSk7CiAgICAgICAgICAgICAgICAvLyBTdGlsbCByZW5kZXIgYWN0aW9uIGJ1dHRvbnMgKHdpbGwgc2hvdyBubyBUZWFtcyBidXR0b25zIGZvciBmYWxsYmFjayB1c2VycykKICAgICAgICAgICAgICAgIGlmICgkQWN0aW9ucykgewogICAgICAgICAgICAgICAgICAgIFJlbmRlckN1c3RvbWVyQWN0aW9uQnV0dG9ucygkV2lkZ2V0LCBDdXN0b21lckRhdGEsICRBY3Rpb25zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gTm90IGxvZ2dlZCBpbiB0byBNMzY1IC0gdXNlIFpudW55IGRhdGEKICAgICAgICAgICAgRmV0Y2habnVueUN1c3RvbWVyRGF0YSgkV2lkZ2V0LCBDdXN0b21lckRhdGEpOwogICAgICAgICAgICAvLyBSZW5kZXIgYWN0aW9uIGJ1dHRvbnMgKG5vIFRlYW1zIGJ1dHRvbnMgd2hlbiBub3QgbG9nZ2VkIGluKQogICAgICAgICAgICBpZiAoJEFjdGlvbnMpIHsKICAgICAgICAgICAgICAgIFJlbmRlckN1c3RvbWVyQWN0aW9uQnV0dG9ucygkV2lkZ2V0LCBDdXN0b21lckRhdGEsICRBY3Rpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUmVuZGVyIGFjdGlvbiBidXR0b25zIGZvciBjdXN0b21lciBpbmZvIHdpZGdldAogICAgICogICAgICAgICAgICAgIENhbGxlZCBhZnRlciBHZXRQcm9maWxlKCkgdG8gZW5zdXJlIFVzZXJQcm92aWRlck1hcCBpcyBzZXQKICAgICAqLwogICAgZnVuY3Rpb24gUmVuZGVyQ3VzdG9tZXJBY3Rpb25CdXR0b25zKCRXaWRnZXQsIEN1c3RvbWVyRGF0YSwgJEFjdGlvbnMpIHsKICAgICAgICAvLyBBbHdheXMgdXNlIHRoZSBET00gZWxlbWVudCBpZiBpdCBleGlzdHMgKGhhbmRsZXMgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gaW5pdGlhbCBsb2FkIGFuZCByZWZyZXNoKQogICAgICAgIHZhciAkRXhpc3RpbmdBY3Rpb25zID0gJFdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25zJyk7CiAgICAgICAgaWYgKCRFeGlzdGluZ0FjdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICRBY3Rpb25zID0gJEV4aXN0aW5nQWN0aW9uczsKICAgICAgICB9CgogICAgICAgIC8vIENsZWFyIGV4aXN0aW5nIGJ1dHRvbnMgdG8gYXZvaWQgZHVwbGljYXRlcwogICAgICAgICRBY3Rpb25zLmVtcHR5KCk7CgogICAgICAgIC8vIEhlbHBlciB0byBjcmVhdGUgaWNvbiBidXR0b24gKHNhbWUgc3R5bGUgYXMgSG92ZXJDYXJkKQogICAgICAgIGZ1bmN0aW9uIENyZWF0ZUljb25CdXR0b24oVGFnLCBIcmVmLCBUaXRsZSwgSWNvbkNsYXNzLCBUYXJnZXQpIHsKICAgICAgICAgICAgdmFyICRCdG4gPSAkKCc8JyArIFRhZyArICc+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQnV0dG9uIENvbGxhYkJ1dHRvbi0taWNvbicpCiAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBUaXRsZSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoSWNvbkNsYXNzKSk7CiAgICAgICAgICAgIGlmIChIcmVmKSB7CiAgICAgICAgICAgICAgICAkQnRuLmF0dHIoJ2hyZWYnLCBIcmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoVGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAkQnRuLmF0dHIoJ3RhcmdldCcsIFRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRCdG47CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBjdXN0b21lciBpcyBmcm9tIHByaW1hcnkgcHJvdmlkZXIgKE0zNjUpIC0gb25seSB0aGVuIFRlYW1zIGlzIGF2YWlsYWJsZQogICAgICAgIC8vIEZhbGxiYWNrIHByb3ZpZGVyIChabnVueSkgdXNlcnMgZG9uJ3QgaGF2ZSBUZWFtcwogICAgICAgIHZhciBVc2VyUHJvdmlkZXIgPSBDb2xsYWIuR2V0VXNlclByb3ZpZGVyKEN1c3RvbWVyRGF0YS5lbWFpbCk7CiAgICAgICAgdmFyIEhhc1RlYW1zID0gVXNlclByb3ZpZGVyID09PSAncHJpbWFyeSc7CgogICAgICAgIC8vIFRlYW1zIENoYXQgYnV0dG9uIChsZWZ0LWFsaWduZWQpIC0gb25seSBpZiBNMzY1IHVzZXIKICAgICAgICBpZiAoSGFzVGVhbXMgJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0NoYXQnKSAmJiBDb2xsYWIuSXNMb2dnZWRJbigpICYmIENvbGxhYi5IYXNDYXBhYmlsaXR5KCdjaGF0JykpIHsKICAgICAgICAgICAgdmFyIENoYXRMaW5rID0gQ29sbGFiLkdldENoYXRMaW5rKEN1c3RvbWVyRGF0YS5lbWFpbCk7CiAgICAgICAgICAgICRBY3Rpb25zLmFwcGVuZChDcmVhdGVJY29uQnV0dG9uKCdhJywgQ2hhdExpbmssCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGVhbXMgQ2hhdCcpLCAnZmEgZmEtY29tbWVudCcsICdfYmxhbmsnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBUZWFtcyBDYWxsIGJ1dHRvbiAobGVmdC1hbGlnbmVkKSAtIG9ubHkgaWYgTTM2NSB1c2VyCiAgICAgICAgaWYgKEhhc1RlYW1zICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdDYWxsJykgJiYgQ29sbGFiLklzTG9nZ2VkSW4oKSAmJiBDb2xsYWIuSGFzQ2FwYWJpbGl0eSgnY2FsbCcpKSB7CiAgICAgICAgICAgIHZhciBDYWxsTGluayA9IENvbGxhYi5HZXRDYWxsTGluayhDdXN0b21lckRhdGEuZW1haWwpOwogICAgICAgICAgICAkQWN0aW9ucy5hcHBlbmQoQ3JlYXRlSWNvbkJ1dHRvbignYScsIENhbGxMaW5rLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RlYW1zIENhbGwnKSwgJ2ZhIGZhLXBob25lLXNxdWFyZScsICdfYmxhbmsnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBNZWV0aW5nIGJ1dHRvbiAtIHJpZ2h0LWFsaWduZWQsIG9ubHkgc2hvdyBpZiBNMzY1IHVzZXIsIGxvZ2dlZCBpbiwgY2FwYWJpbGl0eSBhdmFpbGFibGUsIGFuZCBjdXJyZW50IGFnZW50IGlzIHRpY2tldCBvd25lcgogICAgICAgIHZhciBTZXJ2ZXJDb25maWcgPSBDb3JlLkNvbmZpZy5HZXQoJ0NvbGxhYm9yYXRpb24nKSB8fCB7fTsKICAgICAgICBpZiAoSGFzVGVhbXMgJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ01lZXRpbmdzJykgJiYgQ29sbGFiLklzTG9nZ2VkSW4oKSAmJiBDb2xsYWIuSGFzQ2FwYWJpbGl0eSgnY3JlYXRlTWVldGluZycpICYmIFNlcnZlckNvbmZpZy5Jc1RpY2tldE93bmVyKSB7CiAgICAgICAgICAgIC8vIFNwYWNlciB0byBwdXNoIG1lZXRpbmcgYnV0dG9uIHRvIHRoZSByaWdodAogICAgICAgICAgICAkQWN0aW9ucy5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25zU3BhY2VyJykpOwoKICAgICAgICAgICAgdmFyICRNZWV0aW5nQnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2NoZWR1bGUgTWVldGluZycpKQogICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aT4nKS5hZGRDbGFzcygnZmEgZmEtY2FsZW5kYXInKSk7CiAgICAgICAgICAgICRNZWV0aW5nQnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgU2hvd01lZXRpbmdTY2hlZHVsZXJGb3JDdXN0b21lcihDdXN0b21lckRhdGEuZW1haWwsIEN1c3RvbWVyRGF0YS5uYW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICRBY3Rpb25zLmFwcGVuZCgkTWVldGluZ0J0bik7CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IGFwcGVuZCB0byBET00gaWYgbm90IGFscmVhZHkgdGhlcmUgYW5kIGhhcyBjb250ZW50CiAgICAgICAgaWYgKCRBY3Rpb25zLmNoaWxkcmVuKCkubGVuZ3RoID4gMCAmJiAhJEFjdGlvbnMucGFyZW50KCkubGVuZ3RoKSB7CiAgICAgICAgICAgICRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mbycpLmFwcGVuZCgkQWN0aW9ucyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGZXRjaCBjdXN0b21lciBkYXRhIGZyb20gWm51bnkgYmFja2VuZAogICAgICovCiAgICBmdW5jdGlvbiBGZXRjaFpudW55Q3VzdG9tZXJEYXRhKCRXaWRnZXQsIEN1c3RvbWVyRGF0YSkgewogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDb2xsYWJvcmF0aW9uQUpBWCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdHZXRDdXN0b21lckRhdGEnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW46IEN1c3RvbWVyRGF0YS5sb2dpbgogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbihSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MgJiYgUmVzcG9uc2UuRGF0YSkgewogICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIENvbGxhYlVzZXJCYWRnZSBjbGFzc2VzIChzYW1lIGFzIEhlYWRlclVzZXJCYWRnZSkKICAgICAgICAgICAgICAgICAgICB2YXIgJFRpdGxlID0gJFdpZGdldC5maW5kKCcuQ29sbGFiVXNlckJhZGdlX190aXRsZScpOwogICAgICAgICAgICAgICAgICAgIC8vIFVzZSBVc2VyVGl0bGUgZnJvbSBabnVueSBDdXN0b21lclVzZXIKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRGF0YS5Vc2VyVGl0bGUgJiYgISRUaXRsZS50ZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpdGxlLnRleHQoUmVzcG9uc2UuRGF0YS5Vc2VyVGl0bGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgbmFtZSBpZiBuZWVkZWQgYW5kIGN1cnJlbnQgaXMganVzdCBlbWFpbAogICAgICAgICAgICAgICAgICAgIHZhciAkTmFtZSA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9fbmFtZScpOwogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5EYXRhLlVzZXJGdWxsbmFtZSAmJiAkTmFtZS50ZXh0KCkgPT09IEN1c3RvbWVyRGF0YS5lbWFpbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkTmFtZS50ZXh0KFJlc3BvbnNlLkRhdGEuVXNlckZ1bGxuYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdqc29uJwogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZldGNoIGN1c3RvbWVyIHRpY2tldCBjb3VudCBmcm9tIFpudW55IGJhY2tlbmQKICAgICAqLwogICAgZnVuY3Rpb24gRmV0Y2hDdXN0b21lclRpY2tldENvdW50KCRXaWRnZXQsIEN1c3RvbWVyRGF0YSkgewogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDb2xsYWJvcmF0aW9uQUpBWCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdHZXRDdXN0b21lclRpY2tldENvdW50JywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luOiBDdXN0b21lckRhdGEubG9naW4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRDb3VudCA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mb19fdGlja2V0Q291bnQnKTsKICAgICAgICAgICAgICAgICAgICAkQ291bnQudGV4dCgnKCcgKyBSZXNwb25zZS5UaWNrZXRDb3VudCArICcpJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHNlYXJjaCBVUkwgZm9yIGxhdGVyIHVzZQogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TZWFyY2hVUkwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvX190aWNrZXRMaW5rJykuYXR0cignZGF0YS1zZWFyY2gtdXJsJywgUmVzcG9uc2UuU2VhcmNoVVJMKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdqc29uJwogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZldGNoIGN1c3RvbWVyIHVzZXIgdGlja2V0IGNvdW50IGZyb20gWm51bnkgYmFja2VuZCAoc3BlY2lmaWMgdXNlciwgbm90IGN1c3RvbWVyIGNvbXBhbnkpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZldGNoQ3VzdG9tZXJVc2VyVGlja2V0Q291bnQoJFdpZGdldCwgQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudENvbGxhYm9yYXRpb25BSkFYJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldEN1c3RvbWVyVXNlclRpY2tldENvdW50JywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luOiBDdXN0b21lckRhdGEubG9naW4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRDb3VudCA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mb19fdXNlclRpY2tldENvdW50Jyk7CiAgICAgICAgICAgICAgICAgICAgJENvdW50LnRleHQoJygnICsgUmVzcG9uc2UuVGlja2V0Q291bnQgKyAnKScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnanNvbicKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIGN1c3RvbWVyIHRpY2tldCBzZWFyY2gKICAgICAqLwogICAgZnVuY3Rpb24gT3BlbkN1c3RvbWVyVGlja2V0U2VhcmNoKEN1c3RvbWVyVXNlckxvZ2luKSB7CiAgICAgICAgLy8gT3BlbiB0aWNrZXQgc2VhcmNoIGZpbHRlcmVkIGJ5IGN1c3RvbWVyIChDdXN0b21lcklEKSBpbiBuZXcgd2luZG93CiAgICAgICAgdmFyIFVybCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArCiAgICAgICAgICAgICdBY3Rpb249QWdlbnRUaWNrZXRTZWFyY2g7U3ViYWN0aW9uPVNlYXJjaDsnICsKICAgICAgICAgICAgJ0N1c3RvbWVySURSYXc9JyArIGVuY29kZVVSSUNvbXBvbmVudChDdXN0b21lclVzZXJMb2dpbikgKyAnOycgKwogICAgICAgICAgICAnU3RhdGVUeXBlPU9wZW4nOwogICAgICAgIHdpbmRvdy5vcGVuKFVybCwgJ19ibGFuaycpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIGN1c3RvbWVyIHVzZXIgdGlja2V0IHNlYXJjaCAoc3BlY2lmaWMgdXNlciwgbm90IGN1c3RvbWVyIGNvbXBhbnkpCiAgICAgKi8KICAgIGZ1bmN0aW9uIE9wZW5DdXN0b21lclVzZXJUaWNrZXRTZWFyY2goQ3VzdG9tZXJVc2VyTG9naW4pIHsKICAgICAgICAvLyBPcGVuIHRpY2tldCBzZWFyY2ggZmlsdGVyZWQgYnkgc3BlY2lmaWMgQ3VzdG9tZXJVc2VyIChDdXN0b21lclVzZXJMb2dpbikKICAgICAgICB2YXIgVXJsID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsKICAgICAgICAgICAgJ0FjdGlvbj1BZ2VudFRpY2tldFNlYXJjaDtTdWJhY3Rpb249U2VhcmNoOycgKwogICAgICAgICAgICAnQ3VzdG9tZXJVc2VyTG9naW5SYXc9JyArIGVuY29kZVVSSUNvbXBvbmVudChDdXN0b21lclVzZXJMb2dpbikgKyAnOycgKwogICAgICAgICAgICAnU3RhdGVUeXBlPU9wZW4nOwogICAgICAgIHdpbmRvdy5vcGVuKFVybCwgJ19ibGFuaycpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTWVldGluZyBTY2hlZHVsZXIgRGlhbG9nCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICB2YXIgTWVldGluZ1NjaGVkdWxlclN0YXRlID0gewogICAgICAgICREaWFsb2c6IG51bGwsCiAgICAgICAgVGlja2V0RGF0YTogbnVsbCwKICAgICAgICBDdXN0b21lckRhdGE6IG51bGwsCiAgICAgICAgT3duZXJEYXRhOiBudWxsLAogICAgICAgIFNlbGVjdGVkRHVyYXRpb246IDMwLAogICAgICAgIFNlbGVjdGVkRGF0ZTogbnVsbCwKICAgICAgICBTZWxlY3RlZFNsb3Q6IG51bGwsCiAgICAgICAgRnJlZVNsb3RzOiBbXSwKICAgICAgICBJc0NyZWF0aW5nOiBmYWxzZSwKICAgICAgICBNZWV0aW5nVHlwZTogJ3RlYW1zJywgIC8vICd0ZWFtcycgb3IgJ29uc2l0ZScKICAgICAgICBMb2NhdGlvbjogJycKICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFNob3cgbWVldGluZyBzY2hlZHVsZXIgZm9yIGN1c3RvbWVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dNZWV0aW5nU2NoZWR1bGVyRm9yQ3VzdG9tZXIoQ3VzdG9tZXJFbWFpbCwgQ3VzdG9tZXJOYW1lKSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgbWVldGluZyBjYXBhYmlsaXR5IGlzIGF2YWlsYWJsZQogICAgICAgIGlmICghQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ2NyZWF0ZU1lZXRpbmcnKSkgewogICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNZWV0aW5nIHNjaGVkdWxpbmcgcmVxdWlyZXMgTWljcm9zb2Z0IDM2NSBsb2dpbi4nKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gR2V0IHRpY2tldCBJRCBmcm9tIGNvbmZpZwogICAgICAgIHZhciBUaWNrZXRJRCA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0SUQnKTsKICAgICAgICBpZiAoIVRpY2tldElEKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEluaXRpYWxpemUgc3RhdGUKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuQ3VzdG9tZXJEYXRhID0gewogICAgICAgICAgICBlbWFpbDogQ3VzdG9tZXJFbWFpbCwKICAgICAgICAgICAgbmFtZTogQ3VzdG9tZXJOYW1lIHx8IEN1c3RvbWVyRW1haWwKICAgICAgICB9OwogICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSgpOwogICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZFNsb3QgPSBudWxsOwogICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5GcmVlU2xvdHMgPSBbXTsKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTWVldGluZ1R5cGUgPSAndGVhbXMnOyAgLy8gRGVmYXVsdCB0byBUZWFtcwogICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Mb2NhdGlvbiA9ICcnOwoKICAgICAgICAvLyBGZXRjaCB0aWNrZXQgZGF0YSAoaW5jbHVkZXMgb3duZXIgaW5mbyBhbmQgY2FsZW5kYXIgYXZhaWxhYmlsaXR5KQogICAgICAgIEZldGNoVGlja2V0RGF0YUZvck1lZXRpbmcoVGlja2V0SUQsIGZ1bmN0aW9uKFRpY2tldERhdGEpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSBjYWxlbmRhciBpcyBjb25maWd1cmVkIGZvciB0aGlzIHF1ZXVlCiAgICAgICAgICAgIGlmICghVGlja2V0RGF0YS5IYXNDYWxlbmRhcikgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gQ2FsZW5kYXIgQ29uZmlndXJlZCcpLAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdObyBjYWxlbmRhciBpcyBjb25maWd1cmVkIGZvciBxdWV1ZSAlcy4nLCBUaWNrZXREYXRhLlF1ZXVlKSwKICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IgdG8gY29uZmlndXJlIGEgY2FsZW5kYXIgbWFwcGluZyBmb3IgdGhpcyBxdWV1ZSBpbiB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKENvbGxhYm9yYXRpb246OlF1ZXVlQ2FsZW5kYXJNYXBwaW5nKS4nKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5UaWNrZXREYXRhID0gVGlja2V0RGF0YTsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLk93bmVyRGF0YSA9IHsKICAgICAgICAgICAgICAgIGVtYWlsOiBUaWNrZXREYXRhLk93bmVyRW1haWwsCiAgICAgICAgICAgICAgICBuYW1lOiBUaWNrZXREYXRhLk93bmVyRnVsbG5hbWUgfHwgVGlja2V0RGF0YS5Pd25lckxvZ2luCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHNob3cgZGlhbG9nCiAgICAgICAgICAgIENyZWF0ZU1lZXRpbmdTY2hlZHVsZXJEaWFsb2coKTsKICAgICAgICAgICAgU2hvd01lZXRpbmdTY2hlZHVsZXJEaWFsb2coKTsKCiAgICAgICAgICAgIC8vIExvYWQgaW5pdGlhbCBmcmVlL2J1c3kgZGF0YQogICAgICAgICAgICBMb2FkRnJlZUJ1c3lTbG90cygpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGZXRjaCB0aWNrZXQgZGF0YSBmcm9tIGJhY2tlbmQKICAgICAqLwogICAgZnVuY3Rpb24gRmV0Y2hUaWNrZXREYXRhRm9yTWVldGluZyhUaWNrZXRJRCwgQ2FsbGJhY2spIHsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnR2V0VGlja2V0RGF0YScsCiAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0SUQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzICYmIFJlc3BvbnNlLkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayhSZXNwb25zZS5EYXRhKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGYWlsZWQgdG8gbG9hZCB0aWNrZXQgZGF0YS4nKQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnanNvbicKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgdGhlIG1lZXRpbmcgc2NoZWR1bGVyIGRpYWxvZyBlbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZU1lZXRpbmdTY2hlZHVsZXJEaWFsb2coKSB7CiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGRpYWxvZyBpZiBhbnkKICAgICAgICBpZiAoTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cucmVtb3ZlKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgVGlja2V0RGF0YSA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5UaWNrZXREYXRhOwogICAgICAgIHZhciBDdXN0b21lckRhdGEgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuQ3VzdG9tZXJEYXRhOwogICAgICAgIHZhciBPd25lckRhdGEgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuT3duZXJEYXRhOwoKICAgICAgICAvLyBDcmVhdGUgZGlhbG9nIHN0cnVjdHVyZQogICAgICAgIHZhciAkRGlhbG9nID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcicpOwoKICAgICAgICB2YXIgJERpYWxvZ0JveCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RpYWxvZycpOwoKICAgICAgICAvLyBIZWFkZXIKICAgICAgICB2YXIgJEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2hlYWRlcicpOwogICAgICAgICRIZWFkZXIuYXBwZW5kKCQoJzxoMz4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdGl0bGUnKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTY2hlZHVsZSBBcHBvaW50bWVudCcpKSk7CiAgICAgICAgdmFyICRDbG9zZUJ0biA9ICQoJzxidXR0b24+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2Nsb3NlJykuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+Jyk7CiAgICAgICAgJENsb3NlQnRuLm9uKCdjbGljaycsIEhpZGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKTsKICAgICAgICAkSGVhZGVyLmFwcGVuZCgkQ2xvc2VCdG4pOwogICAgICAgICREaWFsb2dCb3guYXBwZW5kKCRIZWFkZXIpOwoKICAgICAgICAvLyBCb2R5CiAgICAgICAgdmFyICRCb2R5ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYm9keScpOwoKICAgICAgICAvLyBBdHRlbmRlZXMgU2VjdGlvbgogICAgICAgIHZhciAkQXR0ZW5kZWVzU2VjdGlvbiA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3NlY3Rpb24nKTsKICAgICAgICAkQXR0ZW5kZWVzU2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F0dGVuZGVlcycpKSk7CgogICAgICAgIHZhciAkQXR0ZW5kZWVzID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVzJyk7CgogICAgICAgIC8vIE93bmVyIGF0dGVuZGVlCiAgICAgICAgJEF0dGVuZGVlcy5hcHBlbmQoQ3JlYXRlQXR0ZW5kZWVFbGVtZW50KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPd25lcicpLCBPd25lckRhdGEuZW1haWwsIE93bmVyRGF0YS5uYW1lKSk7CgogICAgICAgIC8vIEN1c3RvbWVyIGF0dGVuZGVlCiAgICAgICAgJEF0dGVuZGVlcy5hcHBlbmQoQ3JlYXRlQXR0ZW5kZWVFbGVtZW50KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDdXN0b21lcicpLCBDdXN0b21lckRhdGEuZW1haWwsIEN1c3RvbWVyRGF0YS5uYW1lKSk7CgogICAgICAgICRBdHRlbmRlZXNTZWN0aW9uLmFwcGVuZCgkQXR0ZW5kZWVzKTsKICAgICAgICAkQm9keS5hcHBlbmQoJEF0dGVuZGVlc1NlY3Rpb24pOwoKICAgICAgICAvLyBTdWJqZWN0IFNlY3Rpb24KICAgICAgICB2YXIgJFN1YmplY3RTZWN0aW9uID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbicpOwogICAgICAgICRTdWJqZWN0U2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1YmplY3QnKSkpOwogICAgICAgIHZhciBEZWZhdWx0U3ViamVjdCA9ICdUaWNrZXQjJyArIFRpY2tldERhdGEuVGlja2V0TnVtYmVyICsgJzogJyArIFRpY2tldERhdGEuVGl0bGU7CiAgICAgICAgdmFyICRTdWJqZWN0SW5wdXQgPSAkKCc8aW5wdXQ+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19pbnB1dCcpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ3RleHQnKQogICAgICAgICAgICAuYXR0cignaWQnLCAnQ29sbGFiTWVldGluZ1N1YmplY3QnKQogICAgICAgICAgICAudmFsKERlZmF1bHRTdWJqZWN0KTsKICAgICAgICAkU3ViamVjdFNlY3Rpb24uYXBwZW5kKCRTdWJqZWN0SW5wdXQpOwogICAgICAgICRCb2R5LmFwcGVuZCgkU3ViamVjdFNlY3Rpb24pOwoKICAgICAgICAvLyBNZWV0aW5nIFR5cGUgU2VjdGlvbgogICAgICAgIHZhciAkVHlwZVNlY3Rpb24gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zZWN0aW9uJyk7CiAgICAgICAgJFR5cGVTZWN0aW9uLmFwcGVuZCgkKCc8bGFiZWw+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2xhYmVsJykudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWVldGluZyBUeXBlJykpKTsKICAgICAgICB2YXIgJFR5cGVzID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZXMnKTsKCiAgICAgICAgLy8gVGVhbXMgYnV0dG9uCiAgICAgICAgdmFyICRUZWFtc0J0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlJykKICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykKICAgICAgICAgICAgLmF0dHIoJ2RhdGEtdHlwZScsICd0ZWFtcycpCiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtdmlkZW8tY2FtZXJhIj48L2k+ICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGVhbXMgTWVldGluZycpKTsKICAgICAgICBpZiAoTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID09PSAndGVhbXMnKSB7CiAgICAgICAgICAgICRUZWFtc0J0bi5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZS0tc2VsZWN0ZWQnKTsKICAgICAgICB9CgogICAgICAgIC8vIE9uLXNpdGUgYnV0dG9uCiAgICAgICAgdmFyICRPbnNpdGVCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZScpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLXR5cGUnLCAnb25zaXRlJykKICAgICAgICAgICAgLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1tYXAtbWFya2VyIj48L2k+ICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT24tc2l0ZScpKTsKICAgICAgICBpZiAoTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID09PSAnb25zaXRlJykgewogICAgICAgICAgICAkT25zaXRlQnRuLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCcpOwogICAgICAgIH0KCiAgICAgICAgLy8gVHlwZSBzZWxlY3Rpb24gaGFuZGxlcgogICAgICAgICRUZWFtc0J0bi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID0gJ3RlYW1zJzsKICAgICAgICAgICAgJFR5cGVzLmZpbmQoJy5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlJykucmVtb3ZlQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGUtLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGUtLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICQoJyNDb2xsYWJNZWV0aW5nTG9jYXRpb25TZWN0aW9uJykuaGlkZSgpOwogICAgICAgICAgICBVcGRhdGVDcmVhdGVCdXR0b25TdGF0ZSgpOwogICAgICAgIH0pOwoKICAgICAgICAkT25zaXRlQnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTWVldGluZ1R5cGUgPSAnb25zaXRlJzsKICAgICAgICAgICAgJFR5cGVzLmZpbmQoJy5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlJykucmVtb3ZlQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGUtLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGUtLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICQoJyNDb2xsYWJNZWV0aW5nTG9jYXRpb25TZWN0aW9uJykuc2hvdygpOwogICAgICAgICAgICBVcGRhdGVDcmVhdGVCdXR0b25TdGF0ZSgpOwogICAgICAgIH0pOwoKICAgICAgICAkVHlwZXMuYXBwZW5kKCRUZWFtc0J0biwgJE9uc2l0ZUJ0bik7CiAgICAgICAgJFR5cGVTZWN0aW9uLmFwcGVuZCgkVHlwZXMpOwogICAgICAgICRCb2R5LmFwcGVuZCgkVHlwZVNlY3Rpb24pOwoKICAgICAgICAvLyBMb2NhdGlvbiBTZWN0aW9uIChvbmx5IGZvciBvbi1zaXRlIG1lZXRpbmdzKQogICAgICAgIHZhciAkTG9jYXRpb25TZWN0aW9uID0gJCgnPGRpdj4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3NlY3Rpb24nKQogICAgICAgICAgICAuYXR0cignaWQnLCAnQ29sbGFiTWVldGluZ0xvY2F0aW9uU2VjdGlvbicpCiAgICAgICAgICAgIC5jc3MoJ2Rpc3BsYXknLCBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTWVldGluZ1R5cGUgPT09ICdvbnNpdGUnID8gJ2Jsb2NrJyA6ICdub25lJyk7CiAgICAgICAgJExvY2F0aW9uU2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0xvY2F0aW9uJykgKyAnIConKSk7CiAgICAgICAgdmFyICRMb2NhdGlvbklucHV0ID0gJCgnPGlucHV0PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9faW5wdXQnKQogICAgICAgICAgICAuYXR0cigndHlwZScsICd0ZXh0JykKICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ0NvbGxhYk1lZXRpbmdMb2NhdGlvbicpCiAgICAgICAgICAgIC5hdHRyKCdwbGFjZWhvbGRlcicsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdFbnRlciBtZWV0aW5nIGxvY2F0aW9uLi4uJykpCiAgICAgICAgICAgIC52YWwoTWVldGluZ1NjaGVkdWxlclN0YXRlLkxvY2F0aW9uKTsKICAgICAgICAkTG9jYXRpb25JbnB1dC5vbignaW5wdXQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLkxvY2F0aW9uID0gJCh0aGlzKS52YWwoKTsKICAgICAgICAgICAgVXBkYXRlQ3JlYXRlQnV0dG9uU3RhdGUoKTsKICAgICAgICB9KTsKICAgICAgICAkTG9jYXRpb25TZWN0aW9uLmFwcGVuZCgkTG9jYXRpb25JbnB1dCk7CiAgICAgICAgJEJvZHkuYXBwZW5kKCRMb2NhdGlvblNlY3Rpb24pOwoKICAgICAgICAvLyBEdXJhdGlvbiBTZWN0aW9uCiAgICAgICAgdmFyICREdXJhdGlvblNlY3Rpb24gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zZWN0aW9uJyk7CiAgICAgICAgJER1cmF0aW9uU2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0R1cmF0aW9uJykpKTsKICAgICAgICB2YXIgJER1cmF0aW9ucyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9ucycpOwogICAgICAgIFsxNSwgMzAsIDQ1LCA2MF0uZm9yRWFjaChmdW5jdGlvbihNaW51dGVzKSB7CiAgICAgICAgICAgIHZhciAkQnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbicpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtZHVyYXRpb24nLCBNaW51dGVzKQogICAgICAgICAgICAgICAgLnRleHQoTWludXRlcyArICcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNaW4nKSk7CiAgICAgICAgICAgIGlmIChNaW51dGVzID09PSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREdXJhdGlvbikgewogICAgICAgICAgICAgICAgJEJ0bi5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZHVyYXRpb24tLXNlbGVjdGVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEJ0bi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZER1cmF0aW9uID0gTWludXRlczsKICAgICAgICAgICAgICAgICREdXJhdGlvbnMuZmluZCgnLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9uJykucmVtb3ZlQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9uLS1zZWxlY3RlZCcpOwogICAgICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZHVyYXRpb24tLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICAgICBMb2FkRnJlZUJ1c3lTbG90cygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJER1cmF0aW9ucy5hcHBlbmQoJEJ0bik7CiAgICAgICAgfSk7CiAgICAgICAgJER1cmF0aW9uU2VjdGlvbi5hcHBlbmQoJER1cmF0aW9ucyk7CiAgICAgICAgJEJvZHkuYXBwZW5kKCREdXJhdGlvblNlY3Rpb24pOwoKICAgICAgICAvLyBEYXRlIFNlY3Rpb24KICAgICAgICB2YXIgJERhdGVTZWN0aW9uID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbicpOwogICAgICAgICREYXRlU2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RhdGUnKSkpOwogICAgICAgIHZhciAkRGF0ZVBpY2tlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RhdGVQaWNrZXInKTsKICAgICAgICB2YXIgVG9kYXkgPSBuZXcgRGF0ZSgpOwogICAgICAgIFRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIHZhciAkRGF0ZUlucHV0ID0gJCgnPGlucHV0PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZUlucHV0JykKICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnZGF0ZScpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsICdDb2xsYWJNZWV0aW5nRGF0ZScpCiAgICAgICAgICAgIC5hdHRyKCdtaW4nLCBGb3JtYXREYXRlRm9ySW5wdXQoVG9kYXkpKSAgLy8gUHJldmVudCBwYXN0IGRhdGVzCiAgICAgICAgICAgIC52YWwoRm9ybWF0RGF0ZUZvcklucHV0KE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGUpKTsKICAgICAgICAkRGF0ZUlucHV0Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIE5ld0RhdGUgPSBuZXcgRGF0ZSgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgLy8gRW5zdXJlIGRhdGUgaXMgbm90IGluIHRoZSBwYXN0CiAgICAgICAgICAgIGlmIChOZXdEYXRlIDwgVG9kYXkpIHsKICAgICAgICAgICAgICAgIE5ld0RhdGUgPSBuZXcgRGF0ZShUb2RheSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbChGb3JtYXREYXRlRm9ySW5wdXQoTmV3RGF0ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGUgPSBOZXdEYXRlOwogICAgICAgICAgICBMb2FkRnJlZUJ1c3lTbG90cygpOwogICAgICAgIH0pOwogICAgICAgICREYXRlUGlja2VyLmFwcGVuZCgkRGF0ZUlucHV0KTsKCiAgICAgICAgdmFyICREYXRlTmF2ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZU5hdicpOwogICAgICAgIHZhciAkUHJldkJ0biA9ICQoJzxidXR0b24+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RhdGVCdG4nKS5hdHRyKCd0eXBlJywgJ2J1dHRvbicpLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jaGV2cm9uLWxlZnQiPjwvaT4nKTsKICAgICAgICAkUHJldkJ0bi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIE5ld0RhdGUgPSBuZXcgRGF0ZShNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlKTsKICAgICAgICAgICAgTmV3RGF0ZS5zZXREYXRlKE5ld0RhdGUuZ2V0RGF0ZSgpIC0gMSk7CiAgICAgICAgICAgIC8vIFByZXZlbnQgZ29pbmcgYmVmb3JlIHRvZGF5CiAgICAgICAgICAgIGlmIChOZXdEYXRlIDwgVG9kYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlID0gTmV3RGF0ZTsKICAgICAgICAgICAgJERhdGVJbnB1dC52YWwoRm9ybWF0RGF0ZUZvcklucHV0KE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGUpKTsKICAgICAgICAgICAgTG9hZEZyZWVCdXN5U2xvdHMoKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgJE5leHRCdG4gPSAkKCc8YnV0dG9uPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlQnRuJykuYXR0cigndHlwZScsICdidXR0b24nKS5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi1yaWdodCI+PC9pPicpOwogICAgICAgICROZXh0QnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlLnNldERhdGUoTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkRGF0ZS5nZXREYXRlKCkgKyAxKTsKICAgICAgICAgICAgJERhdGVJbnB1dC52YWwoRm9ybWF0RGF0ZUZvcklucHV0KE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGUpKTsKICAgICAgICAgICAgTG9hZEZyZWVCdXN5U2xvdHMoKTsKICAgICAgICB9KTsKICAgICAgICAkRGF0ZU5hdi5hcHBlbmQoJFByZXZCdG4sICROZXh0QnRuKTsKICAgICAgICAkRGF0ZVBpY2tlci5hcHBlbmQoJERhdGVOYXYpOwogICAgICAgICREYXRlU2VjdGlvbi5hcHBlbmQoJERhdGVQaWNrZXIpOwogICAgICAgICRCb2R5LmFwcGVuZCgkRGF0ZVNlY3Rpb24pOwoKICAgICAgICAvLyBUaW1lIFNsb3RzIFNlY3Rpb24KICAgICAgICB2YXIgJFNsb3RzU2VjdGlvbiA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3NlY3Rpb24nKTsKICAgICAgICAkU2xvdHNTZWN0aW9uLmFwcGVuZCgkKCc8bGFiZWw+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2xhYmVsJykudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXZhaWxhYmxlIFRpbWVzJykpKTsKICAgICAgICB2YXIgJFNsb3RzQ29udGFpbmVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdHMnKS5hdHRyKCdpZCcsICdDb2xsYWJNZWV0aW5nU2xvdHNDb250YWluZXInKTsKICAgICAgICAkU2xvdHNDb250YWluZXIuYXBwZW5kKAogICAgICAgICAgICAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sb2FkaW5nJykuaHRtbCgKICAgICAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+JyArCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9hZGluZyBhdmFpbGFibGUgdGltZXMuLi4nKQogICAgICAgICAgICApCiAgICAgICAgKTsKICAgICAgICAkU2xvdHNTZWN0aW9uLmFwcGVuZCgkU2xvdHNDb250YWluZXIpOwogICAgICAgICRTbG90c1NlY3Rpb24uYXBwZW5kKCQoJzxwPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19oaW50JykudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT25seSB0aW1lcyB3aGVuIGJvdGggYXR0ZW5kZWVzIGFyZSBhdmFpbGFibGUgYXJlIHNob3duLicpKSk7CiAgICAgICAgJEJvZHkuYXBwZW5kKCRTbG90c1NlY3Rpb24pOwoKICAgICAgICAkRGlhbG9nQm94LmFwcGVuZCgkQm9keSk7CgogICAgICAgIC8vIEZvb3RlcgogICAgICAgIHZhciAkRm9vdGVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZm9vdGVyJyk7CiAgICAgICAgdmFyICRDYW5jZWxCdG4gPSAkKCc8YnV0dG9uPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19idG4nKS5hdHRyKCd0eXBlJywgJ2J1dHRvbicpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NhbmNlbCcpKTsKICAgICAgICAkQ2FuY2VsQnRuLm9uKCdjbGljaycsIEhpZGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKTsKICAgICAgICB2YXIgJENyZWF0ZUJ0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19idG4gQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYnRuLS1wcmltYXJ5JykKICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykKICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ0NvbGxhYk1lZXRpbmdDcmVhdGVCdG4nKQogICAgICAgICAgICAuYXR0cignZGlzYWJsZWQnLCB0cnVlKQogICAgICAgICAgICAudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3JlYXRlIEFwcG9pbnRtZW50JykpOwogICAgICAgICRDcmVhdGVCdG4ub24oJ2NsaWNrJywgQ3JlYXRlTWVldGluZ0Zyb21EaWFsb2cpOwogICAgICAgICRGb290ZXIuYXBwZW5kKCRDYW5jZWxCdG4sICRDcmVhdGVCdG4pOwogICAgICAgICREaWFsb2dCb3guYXBwZW5kKCRGb290ZXIpOwoKICAgICAgICAkRGlhbG9nLmFwcGVuZCgkRGlhbG9nQm94KTsKCiAgICAgICAgLy8gQ2xvc2Ugb24gb3ZlcmxheSBjbGljawogICAgICAgICREaWFsb2cub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoJChlLnRhcmdldCkuaXMoJy5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyJykpIHsKICAgICAgICAgICAgICAgIEhpZGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2xvc2Ugb24gZXNjYXBlIC0gcmVtb3ZlIGZpcnN0IHRvIHByZXZlbnQgZHVwbGljYXRlcwogICAgICAgICQoZG9jdW1lbnQpLm9mZigna2V5ZG93bi5tZWV0aW5nU2NoZWR1bGVyJykub24oJ2tleWRvd24ubWVldGluZ1NjaGVkdWxlcicsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgewogICAgICAgICAgICAgICAgSGlkZU1lZXRpbmdTY2hlZHVsZXJEaWFsb2coKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZyA9ICREaWFsb2c7CiAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkRGlhbG9nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGFuIGF0dGVuZGVlIGVsZW1lbnQgZm9yIHRoZSBkaWFsb2cKICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlQXR0ZW5kZWVFbGVtZW50KFJvbGUsIEVtYWlsLCBOYW1lKSB7CiAgICAgICAgdmFyICRBdHRlbmRlZSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlJyk7CgogICAgICAgICRBdHRlbmRlZS5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlUm9sZScpLnRleHQoUm9sZSkpOwoKICAgICAgICAvLyBBdmF0YXIKICAgICAgICB2YXIgJEF2YXRhcldyYXAgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZUF2YXRhcicpOwogICAgICAgIHZhciAkQXZhdGFyID0gVGFyZ2V0TlMuQ3JlYXRlQXZhdGFyKHsKICAgICAgICAgICAgZW1haWw6IEVtYWlsLAogICAgICAgICAgICBzaXplOiAnbWVkaXVtJywKICAgICAgICAgICAgc2hvd1ByZXNlbmNlOiB0cnVlLAogICAgICAgICAgICBjbGlja2FibGU6IGZhbHNlCiAgICAgICAgfSk7CiAgICAgICAgJEF2YXRhcldyYXAuYXBwZW5kKCRBdmF0YXIpOwogICAgICAgICRBdHRlbmRlZS5hcHBlbmQoJEF2YXRhcldyYXApOwoKICAgICAgICAvLyBJbmZvCiAgICAgICAgdmFyICRJbmZvID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVJbmZvJyk7CiAgICAgICAgJEluZm8uYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlTmFtZScpLnRleHQoTmFtZSkpOwogICAgICAgICRJbmZvLmFwcGVuZCgkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZUVtYWlsJykudGV4dChFbWFpbCkpOwogICAgICAgICRBdHRlbmRlZS5hcHBlbmQoJEluZm8pOwoKICAgICAgICByZXR1cm4gJEF0dGVuZGVlOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IHRoZSBtZWV0aW5nIHNjaGVkdWxlciBkaWFsb2cKICAgICAqLwogICAgZnVuY3Rpb24gU2hvd01lZXRpbmdTY2hlZHVsZXJEaWFsb2coKSB7CiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS4kRGlhbG9nKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZy5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlci0tdmlzaWJsZScpOwogICAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBIaWRlIHRoZSBtZWV0aW5nIHNjaGVkdWxlciBkaWFsb2cKICAgICAqLwogICAgZnVuY3Rpb24gSGlkZU1lZXRpbmdTY2hlZHVsZXJEaWFsb2coKSB7CiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS4kRGlhbG9nKSB7CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS4kRGlhbG9nLnJlbW92ZUNsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyLS12aXNpYmxlJyk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cpIHsKICAgICAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZy5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZyA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgfQogICAgICAgICQoZG9jdW1lbnQpLm9mZigna2V5ZG93bi5tZWV0aW5nU2NoZWR1bGVyJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIExvYWQgZnJlZS9idXN5IHNsb3RzIGZvciBzZWxlY3RlZCBkYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIExvYWRGcmVlQnVzeVNsb3RzKCkgewogICAgICAgIHZhciAkQ29udGFpbmVyID0gJCgnI0NvbGxhYk1lZXRpbmdTbG90c0NvbnRhaW5lcicpOwogICAgICAgIGlmICghJENvbnRhaW5lci5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgLy8gU2hvdyBsb2FkaW5nCiAgICAgICAgJENvbnRhaW5lci5odG1sKAogICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbG9hZGluZyI+JyArCiAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+JyArCiAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2FkaW5nIGF2YWlsYWJsZSB0aW1lcy4uLicpICsKICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICApOwoKICAgICAgICAvLyBEaXNhYmxlIGNyZWF0ZSBidXR0b24KICAgICAgICAkKCcjQ29sbGFiTWVldGluZ0NyZWF0ZUJ0bicpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkU2xvdCA9IG51bGw7CgogICAgICAgIHZhciBPd25lckVtYWlsID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLk93bmVyRGF0YS5lbWFpbDsKICAgICAgICB2YXIgQ3VzdG9tZXJFbWFpbCA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5DdXN0b21lckRhdGEuZW1haWw7CiAgICAgICAgdmFyIFNlbGVjdGVkRGF0ZSA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGU7CiAgICAgICAgdmFyIER1cmF0aW9uID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkRHVyYXRpb247CgogICAgICAgIC8vIENhbGN1bGF0ZSBzdGFydC9lbmQgb2YgZGF5CiAgICAgICAgdmFyIFN0YXJ0T2ZEYXkgPSBuZXcgRGF0ZShTZWxlY3RlZERhdGUpOwogICAgICAgIFN0YXJ0T2ZEYXkuc2V0SG91cnMoOCwgMCwgMCwgMCk7CiAgICAgICAgdmFyIEVuZE9mRGF5ID0gbmV3IERhdGUoU2VsZWN0ZWREYXRlKTsKICAgICAgICBFbmRPZkRheS5zZXRIb3VycygxOCwgMCwgMCwgMCk7CgogICAgICAgIC8vIEdldCBmcmVlL2J1c3kgZm9yIGJvdGggYXR0ZW5kZWVzCiAgICAgICAgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBDb2xsYWIuR2V0RnJlZUJ1c3koW093bmVyRW1haWxdLCBTdGFydE9mRGF5LCBFbmRPZkRheSksCiAgICAgICAgICAgIENvbGxhYi5HZXRGcmVlQnVzeShbQ3VzdG9tZXJFbWFpbF0sIFN0YXJ0T2ZEYXksIEVuZE9mRGF5KQogICAgICAgIF0pLnRoZW4oZnVuY3Rpb24oUmVzdWx0cykgewogICAgICAgICAgICB2YXIgT3duZXJTY2hlZHVsZSA9IFJlc3VsdHNbMF0gJiYgUmVzdWx0c1swXVtPd25lckVtYWlsXSA/IFJlc3VsdHNbMF1bT3duZXJFbWFpbF0gOiBbXTsKICAgICAgICAgICAgdmFyIEN1c3RvbWVyU2NoZWR1bGUgPSBSZXN1bHRzWzFdICYmIFJlc3VsdHNbMV1bQ3VzdG9tZXJFbWFpbF0gPyBSZXN1bHRzWzFdW0N1c3RvbWVyRW1haWxdIDogW107CgogICAgICAgICAgICAvLyBHZW5lcmF0ZSBhbGwgcG9zc2libGUgc2xvdHMKICAgICAgICAgICAgdmFyIEFsbFNsb3RzID0gR2VuZXJhdGVUaW1lU2xvdHMoU3RhcnRPZkRheSwgRW5kT2ZEYXksIER1cmF0aW9uKTsKCiAgICAgICAgICAgIC8vIEZpbHRlciB0byBvbmx5IGZyZWUgc2xvdHMgKGJvdGggYXR0ZW5kZWVzIGF2YWlsYWJsZSkKICAgICAgICAgICAgdmFyIEZyZWVTbG90cyA9IEFsbFNsb3RzLmZpbHRlcihmdW5jdGlvbihTbG90KSB7CiAgICAgICAgICAgICAgICB2YXIgT3duZXJGcmVlID0gSXNTbG90RnJlZShTbG90LCBPd25lclNjaGVkdWxlKTsKICAgICAgICAgICAgICAgIHZhciBDdXN0b21lckZyZWUgPSBJc1Nsb3RGcmVlKFNsb3QsIEN1c3RvbWVyU2NoZWR1bGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE93bmVyRnJlZSAmJiBDdXN0b21lckZyZWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLkZyZWVTbG90cyA9IEZyZWVTbG90czsKCiAgICAgICAgICAgIC8vIFJlbmRlciBzbG90cwogICAgICAgICAgICBSZW5kZXJUaW1lU2xvdHMoJENvbnRhaW5lciwgRnJlZVNsb3RzKTsKCiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICRDb250YWluZXIuaHRtbCgKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19lbXB0eSI+JyArCiAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIj48L2k+JyArCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmFpbGVkIHRvIGxvYWQgYXZhaWxhYmlsaXR5IGRhdGEuJykgKwogICAgICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGUgdGltZSBzbG90cyBmb3IgYSBnaXZlbiByYW5nZSAob25seSBmdXR1cmUgc2xvdHMpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdlbmVyYXRlVGltZVNsb3RzKFN0YXJ0LCBFbmQsIER1cmF0aW9uTWludXRlcykgewogICAgICAgIHZhciBTbG90cyA9IFtdOwogICAgICAgIHZhciBDdXJyZW50ID0gbmV3IERhdGUoU3RhcnQpOwogICAgICAgIHZhciBOb3cgPSBuZXcgRGF0ZSgpOwoKICAgICAgICB3aGlsZSAoQ3VycmVudCA8IEVuZCkgewogICAgICAgICAgICB2YXIgU2xvdEVuZCA9IG5ldyBEYXRlKEN1cnJlbnQuZ2V0VGltZSgpICsgRHVyYXRpb25NaW51dGVzICogNjAgKiAxMDAwKTsKICAgICAgICAgICAgLy8gT25seSBpbmNsdWRlIHNsb3RzIHRoYXQgc3RhcnQgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICBpZiAoU2xvdEVuZCA8PSBFbmQgJiYgQ3VycmVudCA+IE5vdykgewogICAgICAgICAgICAgICAgU2xvdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG5ldyBEYXRlKEN1cnJlbnQpLAogICAgICAgICAgICAgICAgICAgIGVuZDogU2xvdEVuZAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ3VycmVudCA9IG5ldyBEYXRlKEN1cnJlbnQuZ2V0VGltZSgpICsgRHVyYXRpb25NaW51dGVzICogNjAgKiAxMDAwKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTbG90czsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgYSBzbG90IGlzIGZyZWUgYmFzZWQgb24gYnVzeSBwZXJpb2RzCiAgICAgKi8KICAgIGZ1bmN0aW9uIElzU2xvdEZyZWUoU2xvdCwgQnVzeVBlcmlvZHMpIHsKICAgICAgICBpZiAoIUJ1c3lQZXJpb2RzIHx8ICFCdXN5UGVyaW9kcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIE5vIGJ1c3kgcGVyaW9kcyA9IGZyZWUKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQnVzeVBlcmlvZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIEJ1c3kgPSBCdXN5UGVyaW9kc1tpXTsKICAgICAgICAgICAgdmFyIEJ1c3lTdGFydCA9IG5ldyBEYXRlKEJ1c3kuc3RhcnQpOwogICAgICAgICAgICB2YXIgQnVzeUVuZCA9IG5ldyBEYXRlKEJ1c3kuZW5kKTsKCiAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVybGFwCiAgICAgICAgICAgIGlmIChTbG90LnN0YXJ0IDwgQnVzeUVuZCAmJiBTbG90LmVuZCA+IEJ1c3lTdGFydCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBPdmVybGFwIGZvdW5kCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgdGhlIGNyZWF0ZSBidXR0b24gc3RhdGUgYmFzZWQgb24gY3VycmVudCBmb3JtIHZhbGlkaXR5CiAgICAgKi8KICAgIGZ1bmN0aW9uIFVwZGF0ZUNyZWF0ZUJ1dHRvblN0YXRlKCkgewogICAgICAgIHZhciAkQ3JlYXRlQnRuID0gJCgnI0NvbGxhYk1lZXRpbmdDcmVhdGVCdG4nKTsKICAgICAgICBpZiAoISRDcmVhdGVCdG4ubGVuZ3RoKSByZXR1cm47CgogICAgICAgIHZhciBJc1ZhbGlkID0gdHJ1ZTsKCiAgICAgICAgLy8gTXVzdCBoYXZlIGEgc2VsZWN0ZWQgc2xvdAogICAgICAgIGlmICghTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkU2xvdCkgewogICAgICAgICAgICBJc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3Igb24tc2l0ZSBtZWV0aW5ncywgbG9jYXRpb24gaXMgcmVxdWlyZWQKICAgICAgICBpZiAoTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID09PSAnb25zaXRlJyAmJiAhTWVldGluZ1NjaGVkdWxlclN0YXRlLkxvY2F0aW9uLnRyaW0oKSkgewogICAgICAgICAgICBJc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkQ3JlYXRlQnRuLmF0dHIoJ2Rpc2FibGVkJywgIUlzVmFsaWQpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBSZW5kZXIgdGltZSBzbG90cyBpbiBjb250YWluZXIKICAgICAqLwogICAgZnVuY3Rpb24gUmVuZGVyVGltZVNsb3RzKCRDb250YWluZXIsIFNsb3RzKSB7CiAgICAgICAgJENvbnRhaW5lci5lbXB0eSgpOwoKICAgICAgICBpZiAoIVNsb3RzLmxlbmd0aCkgewogICAgICAgICAgICAkQ29udGFpbmVyLmh0bWwoCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZW1wdHkiPicgKwogICAgICAgICAgICAgICAgJzxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhci10aW1lcy1vIj48L2k+JyArCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuJykgKwogICAgICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgU2xvdHMuZm9yRWFjaChmdW5jdGlvbihTbG90LCBJbmRleCkgewogICAgICAgICAgICB2YXIgJFNsb3QgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3QnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtaW5kZXgnLCBJbmRleCk7CgogICAgICAgICAgICAkU2xvdC5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdFJhZGlvJykpOwogICAgICAgICAgICAkU2xvdC5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RUaW1lJykudGV4dCgKICAgICAgICAgICAgICAgIEZvcm1hdFRpbWUoU2xvdC5zdGFydCkgKyAnIC0gJyArIEZvcm1hdFRpbWUoU2xvdC5lbmQpCiAgICAgICAgICAgICkpOwoKICAgICAgICAgICAgLy8gRmlyc3Qgc2xvdCBpbmRpY2F0b3IKICAgICAgICAgICAgaWYgKEluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgICAkU2xvdC5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RJbmRpY2F0b3InKS5odG1sKCc8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPicpKTsKICAgICAgICAgICAgICAgIC8vIEF1dG8tc2VsZWN0IGZpcnN0IHNsb3QKICAgICAgICAgICAgICAgICRTbG90LmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90LS1zZWxlY3RlZCcpOwogICAgICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkU2xvdCA9IFNsb3Q7CiAgICAgICAgICAgICAgICBVcGRhdGVDcmVhdGVCdXR0b25TdGF0ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2xvdC5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICRDb250YWluZXIuZmluZCgnLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3QnKS5yZW1vdmVDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdC0tc2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3QtLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWRTbG90ID0gU2xvdHNbSW5kZXhdOwogICAgICAgICAgICAgICAgVXBkYXRlQ3JlYXRlQnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkQ29udGFpbmVyLmFwcGVuZCgkU2xvdCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBtZWV0aW5nIGZyb20gZGlhbG9nIGRhdGEKICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlTWVldGluZ0Zyb21EaWFsb2coKSB7CiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Jc0NyZWF0aW5nKSByZXR1cm47CiAgICAgICAgaWYgKCFNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWRTbG90KSByZXR1cm47CgogICAgICAgIC8vIFZhbGlkYXRlIGxvY2F0aW9uIGZvciBvbi1zaXRlIG1lZXRpbmdzCiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5NZWV0aW5nVHlwZSA9PT0gJ29uc2l0ZScgJiYgIU1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Mb2NhdGlvbi50cmltKCkpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBvbi1zaXRlIG1lZXRpbmcuJyksCiAgICAgICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjQ29sbGFiTWVldGluZ0xvY2F0aW9uJykuZm9jdXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Jc0NyZWF0aW5nID0gdHJ1ZTsKCiAgICAgICAgdmFyICRDcmVhdGVCdG4gPSAkKCcjQ29sbGFiTWVldGluZ0NyZWF0ZUJ0bicpOwogICAgICAgICRDcmVhdGVCdG4uYXR0cignZGlzYWJsZWQnLCB0cnVlKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDcmVhdGluZy4uLicpKTsKCiAgICAgICAgdmFyIFN1YmplY3QgPSAkKCcjQ29sbGFiTWVldGluZ1N1YmplY3QnKS52YWwoKSB8fCAnTWVldGluZyc7CiAgICAgICAgdmFyIFNsb3QgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWRTbG90OwogICAgICAgIHZhciBUaWNrZXREYXRhID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLlRpY2tldERhdGE7CiAgICAgICAgdmFyIEN1c3RvbWVyRW1haWwgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuQ3VzdG9tZXJEYXRhLmVtYWlsOwogICAgICAgIHZhciBPd25lckVtYWlsID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLk93bmVyRGF0YS5lbWFpbDsKICAgICAgICB2YXIgTWVldGluZ1R5cGUgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTWVldGluZ1R5cGU7CgogICAgICAgIGlmIChNZWV0aW5nVHlwZSA9PT0gJ3RlYW1zJykgewogICAgICAgICAgICAvLyBUZWFtcyBNZWV0aW5nOiBDcmVhdGUgVGVhbXMgbWVldGluZyBmaXJzdCwgdGhlbiBabnVueSBhcHBvaW50bWVudAogICAgICAgICAgICBDcmVhdGVUZWFtc01lZXRpbmdBbmRBcHBvaW50bWVudChTdWJqZWN0LCBTbG90LCBUaWNrZXREYXRhLCBDdXN0b21lckVtYWlsLCBPd25lckVtYWlsLCAkQ3JlYXRlQnRuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBPbi1zaXRlIE1lZXRpbmc6IE9ubHkgY3JlYXRlIFpudW55IGFwcG9pbnRtZW50CiAgICAgICAgICAgIENyZWF0ZU9uc2l0ZUFwcG9pbnRtZW50KFN1YmplY3QsIFNsb3QsIFRpY2tldERhdGEsIEN1c3RvbWVyRW1haWwsIE93bmVyRW1haWwsICRDcmVhdGVCdG4pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIFRlYW1zIG1lZXRpbmcgKHZpYSBDYWxlbmRhciBFdmVudCBBUEkpIGFuZCB0aGVuIFpudW55IGFwcG9pbnRtZW50CiAgICAgKiAgICAgICAgICAgICAgVXNlcyBDcmVhdGVDYWxlbmRhckV2ZW50IHdoaWNoIHN0b3JlcyBHcmFwaEV2ZW50SUQgZm9yIGxhdGVyIGNhbmNlbGxhdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBDcmVhdGVUZWFtc01lZXRpbmdBbmRBcHBvaW50bWVudChTdWJqZWN0LCBTbG90LCBUaWNrZXREYXRhLCBDdXN0b21lckVtYWlsLCBPd25lckVtYWlsLCAkQ3JlYXRlQnRuKSB7CiAgICAgICAgdmFyIEV2ZW50RGV0YWlscyA9IHsKICAgICAgICAgICAgc3ViamVjdDogU3ViamVjdCwKICAgICAgICAgICAgc3RhcnREYXRlVGltZTogRm9ybWF0TG9jYWxJU09TdHJpbmcoU2xvdC5zdGFydCksCiAgICAgICAgICAgIGVuZERhdGVUaW1lOiBGb3JtYXRMb2NhbElTT1N0cmluZyhTbG90LmVuZCksCiAgICAgICAgICAgIGF0dGVuZGVlczogW0N1c3RvbWVyRW1haWwsIE93bmVyRW1haWxdLAogICAgICAgICAgICBpc09ubGluZU1lZXRpbmc6IHRydWUsICAvLyBDcmVhdGVzIFRlYW1zIG1lZXRpbmcgdmlhIENhbGVuZGFyIEV2ZW50cyBBUEkKICAgICAgICAgICAgdGltZVpvbmU6IENvbGxhYi5HZXRVc2VyVGltZVpvbmUoKQogICAgICAgIH07CgogICAgICAgIENvbGxhYi5DcmVhdGVDYWxlbmRhckV2ZW50KEV2ZW50RGV0YWlscykudGhlbihmdW5jdGlvbihDYWxlbmRhckV2ZW50KSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBabnVueSBhcHBvaW50bWVudCB3aXRoIEdyYXBoRXZlbnRJRCBmb3IgbGF0ZXIgY2FuY2VsbGF0aW9uCiAgICAgICAgICAgIHZhciBEZXNjcmlwdGlvbiA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUZWFtcyBNZWV0aW5nJykgKyAnXG5cbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3JhcGhFdmVudElEOiAnICsgQ2FsZW5kYXJFdmVudC5pZCArICdcbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSm9pbiBVUkwnKSArICc6ICcgKyBDYWxlbmRhckV2ZW50LmpvaW5VcmwgKyAnXG5cbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXR0ZW5kZWVzJykgKyAnOlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctICcgKyBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuT3duZXJEYXRhLm5hbWUgKyAnICgnICsgT3duZXJFbWFpbCArICcpXG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0gJyArIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5DdXN0b21lckRhdGEubmFtZSArICcgKCcgKyBDdXN0b21lckVtYWlsICsgJyknOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudENvbGxhYm9yYXRpb25BSkFYJywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdDcmVhdGVBcHBvaW50bWVudCcsCiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwgIC8vIFNFQ1VSSVRZOiBDU1JGIHByb3RlY3Rpb24KICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0RGF0YS5UaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBUaXRsZTogU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWU6IEZvcm1hdERhdGVUaW1lRm9yWm51bnkoU2xvdC5zdGFydCksCiAgICAgICAgICAgICAgICAgICAgRW5kVGltZTogRm9ybWF0RGF0ZVRpbWVGb3JabnVueShTbG90LmVuZCksCiAgICAgICAgICAgICAgICAgICAgVGltZVpvbmU6IENvbGxhYi5HZXRVc2VyVGltZVpvbmUoKSwgIC8vIFN0YXJ0VGltZS9FbmRUaW1lIGFyZSB3YWxsLWNsb2NrLCBub3QgVVRDIC0gYmFja2VuZCBjb252ZXJ0cyB1c2luZyB0aGlzCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uOiAnTWljcm9zb2Z0IFRlYW1zIE1lZXRpbmcnICAvLyBTaG9ydCBsb2NhdGlvbiwgZnVsbCBVUkwgaW4gRGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbihSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Jc0NyZWF0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBNZXNzYWdlID0gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRGV0YWlsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5XYXJuaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICs9ICdcbicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm90ZScpICsgJzogJyArIFJlc3BvbnNlLldhcm5pbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbGVuZGFyRXZlbnQuam9pblVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsID0gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0pvaW4gVVJMJykgKyAnOlxuJyArIENhbGVuZGFyRXZlbnQuam9pblVybDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBIaWRlTWVldGluZ1NjaGVkdWxlckRpYWxvZygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgYWN0aW9uIGJ1dHRvbnMgZm9yIFRlYW1zIG1lZXRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEFjdGlvbkJ1dHRvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbGVuZGFyRXZlbnQuam9pblVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBsaW5rIGJ1dHRvbiAoYWx3YXlzIHNob3duKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uQnV0dG9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ29weSBMaW5rJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2ZhLWNvcHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKCREaWFsb2cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weVRvQ2xpcGJvYXJkKENhbGVuZGFyRXZlbnQuam9pblVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkQnRuID0gJERpYWxvZy5maW5kKCdbZGF0YS1hY3Rpb24taW5kZXg9IjAiXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQnRuLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jaGVjayI+PC9pPiAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvcGllZCEnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQnRuLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jb3B5Ij48L2k+ICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ29weSBMaW5rJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKb2luIG1lZXRpbmcgYnV0dG9uIChvbmx5IGlmIG1lZXRpbmcgc3RhcnRzIHdpdGhpbiAxNSBtaW51dGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE5vdyA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWludXRlc1VudGlsU3RhcnQgPSAoU2xvdC5zdGFydC5nZXRUaW1lKCkgLSBOb3cuZ2V0VGltZSgpKSAvICgxMDAwICogNjApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1pbnV0ZXNVbnRpbFN0YXJ0IDw9IDE1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uQnV0dG9ucy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0pvaW4gTWVldGluZycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnZmEtdmlkZW8tY2FtZXJhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdDb2xsYWJEaWFsb2dfX2FjdGlvbkJ0biBDb2xsYWJEaWFsb2dfX2FjdGlvbkJ0bi0tcHJpbWFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKCREaWFsb2csIENsb3NlRGlhbG9nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihDYWxlbmRhckV2ZW50LmpvaW5VcmwsICdfYmxhbmsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQgY3JlYXRlZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogRGV0YWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogQWN0aW9uQnV0dG9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBwYWdlIHRvIHNob3cgdGhlIGFwcG9pbnRtZW50IGxpbmsgaW4gdGlja2V0IHpvb20KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFcnJvck1zZyA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYWxlbmRhciBldmVudCBjcmVhdGVkLCBidXQgWm51bnkgYXBwb2ludG1lbnQgZmFpbGVkLicpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRXJyb3JEZXRhaWwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckRldGFpbCA9IFJlc3BvbnNlLkVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxlbmRhckV2ZW50LmpvaW5VcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yRGV0YWlsICs9IChFcnJvckRldGFpbCA/ICdcblxuJyA6ICcnKSArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKb2luIFVSTCcpICsgJzpcbicgKyBDYWxlbmRhckV2ZW50LmpvaW5Vcmw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogRXJyb3JEZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRDcmVhdGVCdG4uYXR0cignZGlzYWJsZWQnLCBmYWxzZSkudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3JlYXRlIEFwcG9pbnRtZW50JykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKCiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oRXJyb3IpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLklzQ3JlYXRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbWVzc2FnZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZhaWxlZCB0byBjcmVhdGUgbWVldGluZy4nKSwKICAgICAgICAgICAgICAgIGRldGFpbDogRXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoRXJyb3IpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkQ3JlYXRlQnRuLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NyZWF0ZSBBcHBvaW50bWVudCcpKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIG9uLXNpdGUgYXBwb2ludG1lbnQgKHZpYSBDYWxlbmRhciBFdmVudCBBUEkgKyBabnVueSkKICAgICAqICAgICAgICAgICAgICBDcmVhdGVzIE91dGxvb2sgY2FsZW5kYXIgZXZlbnQgKHdpdGhvdXQgVGVhbXMpIGZvciBpbnZpdGF0aW9uL2NhbmNlbGxhdGlvbiBlbWFpbHMKICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlT25zaXRlQXBwb2ludG1lbnQoU3ViamVjdCwgU2xvdCwgVGlja2V0RGF0YSwgQ3VzdG9tZXJFbWFpbCwgT3duZXJFbWFpbCwgJENyZWF0ZUJ0bikgewogICAgICAgIHZhciBMb2NhdGlvbiA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Mb2NhdGlvbi50cmltKCk7CgogICAgICAgIHZhciBFdmVudERldGFpbHMgPSB7CiAgICAgICAgICAgIHN1YmplY3Q6IFN1YmplY3QsCiAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IEZvcm1hdExvY2FsSVNPU3RyaW5nKFNsb3Quc3RhcnQpLAogICAgICAgICAgICBlbmREYXRlVGltZTogRm9ybWF0TG9jYWxJU09TdHJpbmcoU2xvdC5lbmQpLAogICAgICAgICAgICBhdHRlbmRlZXM6IFtDdXN0b21lckVtYWlsLCBPd25lckVtYWlsXSwKICAgICAgICAgICAgaXNPbmxpbmVNZWV0aW5nOiBmYWxzZSwgIC8vIE5vIFRlYW1zIG1lZXRpbmcgLSBqdXN0IGNhbGVuZGFyIGV2ZW50CiAgICAgICAgICAgIGxvY2F0aW9uOiBMb2NhdGlvbiwKICAgICAgICAgICAgdGltZVpvbmU6IENvbGxhYi5HZXRVc2VyVGltZVpvbmUoKQogICAgICAgIH07CgogICAgICAgIENvbGxhYi5DcmVhdGVDYWxlbmRhckV2ZW50KEV2ZW50RGV0YWlscykudGhlbihmdW5jdGlvbihDYWxlbmRhckV2ZW50KSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBabnVueSBhcHBvaW50bWVudCB3aXRoIEdyYXBoRXZlbnRJRCBmb3IgbGF0ZXIgY2FuY2VsbGF0aW9uCiAgICAgICAgICAgIHZhciBEZXNjcmlwdGlvbiA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPbi1zaXRlIE1lZXRpbmcnKSArICdcblxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHcmFwaEV2ZW50SUQ6ICcgKyBDYWxlbmRhckV2ZW50LmlkICsgJ1xuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2NhdGlvbicpICsgJzogJyArIExvY2F0aW9uICsgJ1xuXG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F0dGVuZGVlcycpICsgJzpcbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLSAnICsgTWVldGluZ1NjaGVkdWxlclN0YXRlLk93bmVyRGF0YS5uYW1lICsgJyAoJyArIE93bmVyRW1haWwgKyAnKVxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctICcgKyBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuQ3VzdG9tZXJEYXRhLm5hbWUgKyAnICgnICsgQ3VzdG9tZXJFbWFpbCArICcpJzsKCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDb2xsYWJvcmF0aW9uQUpBWCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnQ3JlYXRlQXBwb2ludG1lbnQnLAogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksICAvLyBTRUNVUklUWTogQ1NSRiBwcm90ZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldERhdGEuVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVGl0bGU6IFN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBGb3JtYXREYXRlVGltZUZvclpudW55KFNsb3Quc3RhcnQpLAogICAgICAgICAgICAgICAgICAgIEVuZFRpbWU6IEZvcm1hdERhdGVUaW1lRm9yWm51bnkoU2xvdC5lbmQpLAogICAgICAgICAgICAgICAgICAgIFRpbWVab25lOiBDb2xsYWIuR2V0VXNlclRpbWVab25lKCksICAvLyBTdGFydFRpbWUvRW5kVGltZSBhcmUgd2FsbC1jbG9jaywgbm90IFVUQyAtIGJhY2tlbmQgY29udmVydHMgdXNpbmcgdGhpcwogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiBEZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbjogTG9jYXRpb24KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbihSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Jc0NyZWF0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBNZXNzYWdlID0gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09uLXNpdGUgYXBwb2ludG1lbnQgY3JlYXRlZCBzdWNjZXNzZnVsbHkhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5XYXJuaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICs9ICdcbicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm90ZScpICsgJzogJyArIFJlc3BvbnNlLldhcm5pbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERldGFpbCA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2NhdGlvbicpICsgJzogJyArIExvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBIaWRlTWVldGluZ1NjaGVkdWxlckRpYWxvZygpOwogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQgY3JlYXRlZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogRGV0YWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgdG8gc2hvdyB0aGUgYXBwb2ludG1lbnQgbGluayBpbiB0aWNrZXQgem9vbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEVycm9yTXNnID0gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NhbGVuZGFyIGV2ZW50IGNyZWF0ZWQsIGJ1dCBabnVueSBhcHBvaW50bWVudCBmYWlsZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFcnJvckRldGFpbCA9IChSZXNwb25zZSAmJiBSZXNwb25zZS5FcnJvcikgPyBSZXNwb25zZS5FcnJvciA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IEVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBFcnJvckRldGFpbAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgJENyZWF0ZUJ0bi5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDcmVhdGUgQXBwb2ludG1lbnQnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwoKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihFcnJvcikgewogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuSXNDcmVhdGluZyA9IGZhbHNlOwogICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmFpbGVkIHRvIGNyZWF0ZSBhcHBvaW50bWVudC4nKSwKICAgICAgICAgICAgICAgIGRldGFpbDogRXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoRXJyb3IpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkQ3JlYXRlQnRuLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NyZWF0ZSBBcHBvaW50bWVudCcpKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0IGRhdGUgZm9yIGlucHV0W3R5cGU9ZGF0ZV0KICAgICAqLwogICAgZnVuY3Rpb24gRm9ybWF0RGF0ZUZvcklucHV0KERhdGUpIHsKICAgICAgICB2YXIgWWVhciA9IERhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICB2YXIgTW9udGggPSBTdHJpbmcoRGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgRGF5ID0gU3RyaW5nKERhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHJldHVybiBZZWFyICsgJy0nICsgTW9udGggKyAnLScgKyBEYXk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZvcm1hdCB0aW1lIGZvciBkaXNwbGF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIEZvcm1hdFRpbWUoRGF0ZSkgewogICAgICAgIHZhciBIb3VycyA9IFN0cmluZyhEYXRlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIE1pbnV0ZXMgPSBTdHJpbmcoRGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgcmV0dXJuIEhvdXJzICsgJzonICsgTWludXRlczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0IGRhdGV0aW1lIGZvciBabnVueSAoWVlZWS1NTS1ERCBISDpNTTpTUykKICAgICAqLwogICAgZnVuY3Rpb24gRm9ybWF0RGF0ZVRpbWVGb3JabnVueShEYXRlKSB7CiAgICAgICAgdmFyIFllYXIgPSBEYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgdmFyIE1vbnRoID0gU3RyaW5nKERhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIERheSA9IFN0cmluZyhEYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgSG91cnMgPSBTdHJpbmcoRGF0ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBNaW51dGVzID0gU3RyaW5nKERhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBTZWNvbmRzID0gU3RyaW5nKERhdGUuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHJldHVybiBZZWFyICsgJy0nICsgTW9udGggKyAnLScgKyBEYXkgKyAnICcgKyBIb3VycyArICc6JyArIE1pbnV0ZXMgKyAnOicgKyBTZWNvbmRzOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGb3JtYXQgZGF0ZSBhcyBsb2NhbCBJU08gc3RyaW5nICh3aXRob3V0IFVUQyBjb252ZXJzaW9uKQogICAgICogICAgICAgICAgICAgIElNUE9SVEFOVDogdG9JU09TdHJpbmcoKSBjb252ZXJ0cyB0byBVVEMgd2hpY2ggY2F1c2VzIHRpbWV6b25lIG9mZnNldCBpc3N1ZXMKICAgICAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgbG9jYWwgdGltZSBjb21wb25lbnRzIGZvciBHcmFwaCBBUEkgY2FsbHMKICAgICAqLwogICAgZnVuY3Rpb24gRm9ybWF0TG9jYWxJU09TdHJpbmcoRGF0ZSkgewogICAgICAgIHZhciBZZWFyID0gRGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICAgIHZhciBNb250aCA9IFN0cmluZyhEYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBEYXkgPSBTdHJpbmcoRGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIEhvdXJzID0gU3RyaW5nKERhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgTWludXRlcyA9IFN0cmluZyhEYXRlLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgU2Vjb25kcyA9IFN0cmluZyhEYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICByZXR1cm4gWWVhciArICctJyArIE1vbnRoICsgJy0nICsgRGF5ICsgJ1QnICsgSG91cnMgKyAnOicgKyBNaW51dGVzICsgJzonICsgU2Vjb25kczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaCBjdXN0b21lciBpbmZvIHdpZGdldCAoY2FsbGVkIGFmdGVyIE0zNjUgbG9naW4pCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlZnJlc2hDdXN0b21lckluZm9XaWRnZXQoKSB7CiAgICAgICAgdmFyICRXaWRnZXQgPSAkKCcjQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0Jyk7CiAgICAgICAgaWYgKCEkV2lkZ2V0Lmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICB2YXIgQ3VzdG9tZXJEYXRhID0gewogICAgICAgICAgICBlbWFpbDogJFdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWVtYWlsJyksCiAgICAgICAgICAgIGxvZ2luOiAkV2lkZ2V0LmF0dHIoJ2RhdGEtY3VzdG9tZXItbG9naW4nKSwKICAgICAgICAgICAgbmFtZTogJFdpZGdldC5maW5kKCcuQ29sbGFiVXNlckJhZGdlX19uYW1lJykudGV4dCgpCiAgICAgICAgfTsKCiAgICAgICAgaWYgKCFDdXN0b21lckRhdGEuZW1haWwpIHJldHVybjsKCiAgICAgICAgLy8gUmVmcmVzaCBhdmF0YXIgKHdhcyBsb2FkZWQgYmVmb3JlIGxvZ2luLCBtaWdodCBoYXZlIGZhbGxiYWNrKQogICAgICAgIHZhciAkQXZhdGFyID0gJFdpZGdldC5maW5kKCcuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcicpOwogICAgICAgIC8vIEZpbmQgZXhpc3RpbmcgaW1nIC0gUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQgY3JlYXRlcyBpdCBzeW5jaHJvbm91c2x5CiAgICAgICAgdmFyICRJbWcgPSAkQXZhdGFyLmZpbmQoJy5Db2xsYWJBdmF0YXJfX2ltYWdlJyk7CgogICAgICAgIC8vIE9ubHkgcmVmcmVzaCBpZiBpbWcgZXhpc3RzIChQb3B1bGF0ZUN1c3RvbWVySW5mb1dpZGdldCBzaG91bGQgaGF2ZSBjcmVhdGVkIGl0KQogICAgICAgIGlmICgkSW1nLmxlbmd0aCAmJiBDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnQXZhdGFyJykpIHsKICAgICAgICAgICAgLy8gU2tpcCBpZiB3aWRnZXQgaXMgc3RpbGwgbG9hZGluZyBmcm9tIGluaXRpYWwgUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQgY2FsbAogICAgICAgICAgICBpZiAoJFdpZGdldC5hdHRyKCdkYXRhLWF2YXRhci1sb2FkaW5nJykgIT09ICd0cnVlJykgewogICAgICAgICAgICAgICAgQ29sbGFiLkdldEF2YXRhcihDdXN0b21lckRhdGEuZW1haWwpLnRoZW4oZnVuY3Rpb24oQXZhdGFyVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEF2YXRhclVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBzcmMgaWYgbmV3IHZhbHVlIGlzICJiZXR0ZXIiIChyZWFsIGltYWdlIHZzIFNWRyBmYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRTcmMgPSAkSW1nLmF0dHIoJ3NyYycpIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTmV3SXNTdmdGYWxsYmFjayA9IEF2YXRhclVybC5pbmRleE9mKCdkYXRhOmltYWdlL3N2ZycpID09PSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ3VycmVudElzU3ZnRmFsbGJhY2sgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50U3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2Uvc3ZnJykgPT09IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTaG91bGRVcGRhdGUgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50SXNTdmdGYWxsYmFjayB8fCAhTmV3SXNTdmdGYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZFVwZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEltZy5hdHRyKCdzcmMnLCBBdmF0YXJVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFJlZnJlc2ggcHJlc2VuY2UKICAgICAgICB2YXIgJFByZXNlbmNlID0gJFdpZGdldC5maW5kKCcuQ29sbGFiUHJlc2VuY2UnKTsKICAgICAgICBpZiAoJFByZXNlbmNlLmxlbmd0aCAmJiBDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnUHJlc2VuY2UnKSkgewogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoQ3VzdG9tZXJEYXRhLmVtYWlsKS50aGVuKGZ1bmN0aW9uKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICB2YXIgUHJlc2VuY2VDbGFzcyA9IEdldFByZXNlbmNlQ2xhc3MoUHJlc2VuY2Uuc3RhdHVzKTsKICAgICAgICAgICAgICAgICRQcmVzZW5jZQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhmdW5jdGlvbihpLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYy5tYXRjaCgvQ29sbGFiUHJlc2VuY2UtLVxTKy9nKSB8fCBbXSkuam9pbignICcpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZSAnICsgUHJlc2VuY2VDbGFzcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVmcmVzaCBlbnJpY2htZW50IGRhdGEgKG5hbWUsIHRpdGxlKSBhbmQgYWN0aW9uIGJ1dHRvbnMKICAgICAgICAvLyBGaW5kIG9yIGNyZWF0ZSB0aGUgYWN0aW9ucyBjb250YWluZXIKICAgICAgICB2YXIgJEFjdGlvbnMgPSAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJDdXN0b21lckluZm9fX2FjdGlvbnMnKTsKICAgICAgICBpZiAoISRBY3Rpb25zLmxlbmd0aCkgewogICAgICAgICAgICAvLyBDcmVhdGUgYWN0aW9ucyBjb250YWluZXIgaWYgaXQgZG9lc24ndCBleGlzdAogICAgICAgICAgICAkQWN0aW9ucyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9ucycpLmF0dHIoJ2lkJywgJ0NvbGxhYkN1c3RvbWVyQWN0aW9ucycpOwogICAgICAgICAgICAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJDdXN0b21lckluZm8nKS5hcHBlbmQoJEFjdGlvbnMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENsZWFyIGV4aXN0aW5nIGJ1dHRvbnMgZm9yIHJlLXJlbmRlcgogICAgICAgICAgICAkQWN0aW9ucy5lbXB0eSgpOwogICAgICAgIH0KICAgICAgICBGZXRjaEN1c3RvbWVyRW5yaWNobWVudERhdGEoJFdpZGdldCwgQ3VzdG9tZXJEYXRhLCAkQWN0aW9ucyk7CgogICAgICAgIC8vIFJlZnJlc2ggd29yayBsb2NhdGlvbiAobWlnaHQgbm90IGhhdmUgYmVlbiBhdmFpbGFibGUgYmVmb3JlIGxvZ2luKQogICAgICAgIGlmIChDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnUHJlc2VuY2UnKSkgewogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoQ3VzdG9tZXJEYXRhLmVtYWlsKS50aGVuKGZ1bmN0aW9uKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgd29yayBsb2NhdGlvbiBiYWRnZSBpZiBhbnkKICAgICAgICAgICAgICAgICRXaWRnZXQuZmluZCgnLkNvbGxhYldvcmtMb2NhdGlvbicpLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIC8vIFdvcmsgbG9jYXRpb24gbGFiZWxzIGFuZCBpY29ucwogICAgICAgICAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkxhYmVscyA9IHsKICAgICAgICAgICAgICAgICAgICAnb2ZmaWNlJzogJ09mZmljZScsCiAgICAgICAgICAgICAgICAgICAgJ3JlbW90ZSc6ICdSZW1vdGUnLAogICAgICAgICAgICAgICAgICAgICd0aW1lT2ZmJzogJ1RpbWUgb2ZmJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBXb3JrTG9jYXRpb25JY29ucyA9IHsKICAgICAgICAgICAgICAgICAgICAnb2ZmaWNlJzogJ2ZhLWJ1aWxkaW5nJywKICAgICAgICAgICAgICAgICAgICAncmVtb3RlJzogJ2ZhLWhvbWUnLAogICAgICAgICAgICAgICAgICAgICd0aW1lT2ZmJzogJ2ZhLXNpZ24tb3V0JwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgbG9jYXRpb24gdHlwZTogT09GIHRha2VzIHByZWNlZGVuY2UsIHRoZW4gd29ya0xvY2F0aW9uCiAgICAgICAgICAgICAgICB2YXIgTG9jYXRpb25UeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uVHlwZSA9ICd0aW1lT2ZmJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHJlc2VuY2Uud29ya0xvY2F0aW9uICYmIFByZXNlbmNlLndvcmtMb2NhdGlvbi50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25UeXBlID0gUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKExvY2F0aW9uVHlwZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBMb2NhdGlvbkxhYmVsID0gV29ya0xvY2F0aW9uTGFiZWxzW0xvY2F0aW9uVHlwZV0gfHwgTG9jYXRpb25UeXBlOwogICAgICAgICAgICAgICAgICAgIHZhciBMb2NhdGlvbkljb24gPSBXb3JrTG9jYXRpb25JY29uc1tMb2NhdGlvblR5cGVdIHx8ICdmYS1tYXAtbWFya2VyJzsKCiAgICAgICAgICAgICAgICAgICAgdmFyICRXb3JrTG9jYXRpb24gPSAkKCc8c3Bhbj4nKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYldvcmtMb2NhdGlvbiBDb2xsYWJXb3JrTG9jYXRpb24tLScgKyBMb2NhdGlvblR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhICcgKyBMb2NhdGlvbkljb24pKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKExvY2F0aW9uTGFiZWwpKTsKICAgICAgICAgICAgICAgICAgICAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX2luZm8nKS5hcHBlbmQoJFdvcmtMb2NhdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEFwcG9pbnRtZW50IENhbmNlbGxhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENhbmNlbCBhbiBhcHBvaW50bWVudCAoR3JhcGggRXZlbnQgKyBabnVueSBBcHBvaW50bWVudCkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBBcHBvaW50bWVudElEIC0gWm51bnkgQXBwb2ludG1lbnQgSUQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBUaWNrZXRJRCAtIFJlbGF0ZWQgVGlja2V0IElECiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbmNlbEFwcG9pbnRtZW50KEFwcG9pbnRtZW50SUQsIFRpY2tldElEKSB7CiAgICAgICAgVGFyZ2V0TlMuU2hvd0NvbmZpcm1EaWFsb2coewogICAgICAgICAgICB0aXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NhbmNlbCBBcHBvaW50bWVudCcpLAogICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCB0aGlzIGFwcG9pbnRtZW50PyBBdHRlbmRlZXMgd2lsbCBiZSBub3RpZmllZC4nKSwKICAgICAgICAgICAgY29uZmlybVRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdZZXMsIGNhbmNlbCcpLAogICAgICAgICAgICBjYW5jZWxUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8nKSwKICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICBvbkNvbmZpcm06IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgLy8gU3RlcCAxOiBHZXQgR3JhcGhFdmVudElEIGFuZCBkZWxldGUgWm51bnkgYXBwb2ludG1lbnQgdmlhIGJhY2tlbmQKICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDb2xsYWJvcmF0aW9uQUpBWCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0NhbmNlbEFwcG9pbnRtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwgIC8vIFNFQ1VSSVRZOiBDU1JGIHByb3RlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRDogQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldElECiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAyOiBEZWxldGUgR3JhcGggY2FsZW5kYXIgZXZlbnQgKHNlbmRzIGNhbmNlbGxhdGlvbiBlbWFpbCB0byBhdHRlbmRlZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuR3JhcGhFdmVudElEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFiLkRlbGV0ZUNhbGVuZGFyRXZlbnQoUmVzcG9uc2UuR3JhcGhFdmVudElEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQgY2FuY2VsbGVkLiBBdHRlbmRlZXMgaGF2ZSBiZWVuIG5vdGlmaWVkLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdabnVueSBhcHBvaW50bWVudCBkZWxldGVkLCBidXQgZmFpbGVkIHRvIGNhbmNlbCBPdXRsb29rIGV2ZW50LicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogRXJyb3IubWVzc2FnZSB8fCBTdHJpbmcoRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBHcmFwaCBldmVudCAoYXBwb2ludG1lbnQgY3JlYXRlZCB3aXRob3V0IE0zNjUgb3IgbGVnYWN5IGFwcG9pbnRtZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHBvaW50bWVudCBjYW5jZWxsZWQuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGYWlsZWQgdG8gY2FuY2VsIGFwcG9pbnRtZW50LicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogUmVzcG9uc2UuRXJyb3IgfHwgJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGNhbmNlbCBidXR0b25zIHRvIENvbGxhYm9yYXRpb24tbGlua2VkIGFwcG9pbnRtZW50cyBpbiBMaW5rZWRPYmplY3RzIHdpZGdldAogICAgICovCiAgICBmdW5jdGlvbiBBZGRDYW5jZWxCdXR0b25zVG9MaW5rZWRBcHBvaW50bWVudHMoKSB7CiAgICAgICAgdmFyIFRpY2tldElEID0gQ29yZS5Db25maWcuR2V0KCdUaWNrZXRJRCcpOwogICAgICAgIGlmICghVGlja2V0SUQpIHJldHVybjsKCiAgICAgICAgLy8gRmluZCB0aGUgQXBwb2ludG1lbnQgd2lkZ2V0IChabnVueSB1c2VzICNXaWRnZXRBcHBvaW50bWVudCBmb3IgbGlua2VkIGFwcG9pbnRtZW50cykKICAgICAgICB2YXIgJEFwcG9pbnRtZW50V2lkZ2V0ID0gJCgnI1dpZGdldEFwcG9pbnRtZW50Jyk7CiAgICAgICAgaWYgKCEkQXBwb2ludG1lbnRXaWRnZXQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIFRyeSBhbHRlcm5hdGl2ZSBzZWxlY3RvcnMKICAgICAgICAgICAgJEFwcG9pbnRtZW50V2lkZ2V0ID0gJCgnW2lkKj0iQXBwb2ludG1lbnQiXS5XaWRnZXRTaW1wbGUnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkQXBwb2ludG1lbnRXaWRnZXQubGVuZ3RoKSByZXR1cm47CgogICAgICAgIC8vIEZpbmQgYWxsIHJvd3MgaW4gdGhlIGFwcG9pbnRtZW50IHRhYmxlCiAgICAgICAgJEFwcG9pbnRtZW50V2lkZ2V0LmZpbmQoJ3RhYmxlIHRib2R5IHRyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICRSb3cgPSAkKHRoaXMpOwoKICAgICAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZAogICAgICAgICAgICBpZiAoJFJvdy5oYXNDbGFzcygnQ29sbGFiQ2FuY2VsUHJvY2Vzc2VkJykpIHJldHVybjsKICAgICAgICAgICAgJFJvdy5hZGRDbGFzcygnQ29sbGFiQ2FuY2VsUHJvY2Vzc2VkJyk7CgogICAgICAgICAgICB2YXIgUm93VGV4dCA9ICRSb3cudGV4dCgpOwoKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIENvbGxhYm9yYXRpb24vS29sbGFib3JhdGlvbiBsaW5rIHR5cGUgaW4gdGhlIHJvdyB0ZXh0CiAgICAgICAgICAgIC8vIChzaG93biBpbiAiVmVya251ZXBmdCBhbHMiIC8gIkxpbmtlZCBhcyIgY29sdW1uKQogICAgICAgICAgICB2YXIgSXNDb2xsYWJvcmF0aW9uVHlwZSA9ICgKICAgICAgICAgICAgICAgIFJvd1RleHQuaW5kZXhPZignQ29sbGFib3JhdGlvbicpID4gLTEgfHwKICAgICAgICAgICAgICAgIFJvd1RleHQuaW5kZXhPZignS29sbGFib3JhdGlvbicpID4gLTEKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBDb2xsYWJvcmF0aW9uLXR5cGUgbGlua3MKICAgICAgICAgICAgaWYgKCFJc0NvbGxhYm9yYXRpb25UeXBlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEV4dHJhY3QgQXBwb2ludG1lbnRJRCBmcm9tIHRoZSBkZWxldGUgbGluaydzIGRhdGEgYXR0cmlidXRlCiAgICAgICAgICAgIHZhciAkRGVsZXRlTGluayA9ICRSb3cuZmluZCgnLkluc3RhbnRMaW5rRGVsZXRlJyk7CiAgICAgICAgICAgIHZhciBBcHBvaW50bWVudElEID0gJERlbGV0ZUxpbmsuYXR0cignZGF0YS1kZWxldGUtbGluay1zb3VyY2VrZXknKTsKCiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgdG8gZXh0cmFjdCBmcm9tIGhyZWYKICAgICAgICAgICAgaWYgKCFBcHBvaW50bWVudElEKSB7CiAgICAgICAgICAgICAgICB2YXIgJExpbmsgPSAkUm93LmZpbmQoJ2FbaHJlZio9IkFwcG9pbnRtZW50SUQiXScpOwogICAgICAgICAgICAgICAgdmFyIEhyZWZNYXRjaCA9ICgkTGluay5hdHRyKCdocmVmJykgfHwgJycpLm1hdGNoKC9BcHBvaW50bWVudElEPShcZCspLyk7CiAgICAgICAgICAgICAgICBpZiAoSHJlZk1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9IEhyZWZNYXRjaFsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFBcHBvaW50bWVudElEKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGxpbmsKICAgICAgICAgICAgaWYgKCREZWxldGVMaW5rLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJERlbGV0ZUxpbmsuYWRkQ2xhc3MoJ0NvbGxhYkhpZGRlbicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBGaW5kIHRoZSBhY3Rpb24gY2VsbCAobGFzdCBjb2x1bW4gd2l0aCBkZWxldGUgbGluaykKICAgICAgICAgICAgdmFyICRBY3Rpb25DZWxsID0gJFJvdy5maW5kKCd0ZDpsYXN0LWNoaWxkJyk7CiAgICAgICAgICAgIGlmICghJEFjdGlvbkNlbGwubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkQWN0aW9uQ2VsbCA9ICRSb3c7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENyZWF0ZSBjYW5jZWwgYnV0dG9uCiAgICAgICAgICAgIHZhciAkQ2FuY2VsQnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJDYW5jZWxBcHBvaW50bWVudCcpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NhbmNlbCBBcHBvaW50bWVudCcpKQogICAgICAgICAgICAgICAgLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhci10aW1lcy1vIj48L2k+Jyk7CgogICAgICAgICAgICAkQ2FuY2VsQnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICBDYW5jZWxBcHBvaW50bWVudChBcHBvaW50bWVudElELCBUaWNrZXRJRCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJEFjdGlvbkNlbGwuYXBwZW5kKCRDYW5jZWxCdG4pOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgY2FuY2VsIGJ1dHRvbnMgdG8gQ29sbGFib3JhdGlvbi1saW5rZWQgYXBwb2ludG1lbnRzIGluIHN0YW5kYXJkIExpbmtlZE9iamVjdHMgd2lkZ2V0ICh3aXRob3V0IElUU00pCiAgICAgKiAgICAgICAgICAgICAgVGhpcyB3aWRnZXQgdXNlcyBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUgd2l0aCBoMyBoZWFkZXJzIGZvciBsaW5rIHR5cGVzCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFkZENhbmNlbEJ1dHRvbnNUb1N0YW5kYXJkTGlua2VkT2JqZWN0cygpIHsKICAgICAgICB2YXIgVGlja2V0SUQgPSBDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldElEJyk7CiAgICAgICAgaWYgKCFUaWNrZXRJRCkgcmV0dXJuOwoKICAgICAgICAvLyBGaW5kIHRoZSBzdGFuZGFyZCBMaW5rZWRPYmplY3RzIHdpZGdldCAoY2xhc3M6IFdpZGdldFNpbXBsZSBMaW5rVGFibGUpCiAgICAgICAgdmFyICRMaW5rVGFibGVXaWRnZXRzID0gJCgnLldpZGdldFNpbXBsZS5MaW5rVGFibGUnKTsKICAgICAgICBpZiAoISRMaW5rVGFibGVXaWRnZXRzLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAkTGlua1RhYmxlV2lkZ2V0cy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgJFdpZGdldCA9ICQodGhpcyk7CgogICAgICAgICAgICAvLyBGaW5kIGgzIGhlYWRlcnMgd2l0aCAiS29sbGFib3JhdGlvbiIgb3IgIkNvbGxhYm9yYXRpb24iIHRleHQKICAgICAgICAgICAgJFdpZGdldC5maW5kKCdoMycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgJEhlYWRlciA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICB2YXIgSGVhZGVyVGV4dCA9ICRIZWFkZXIudGV4dCgpLnRyaW0oKTsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgQ29sbGFib3JhdGlvbiBzZWN0aW9uCiAgICAgICAgICAgICAgICB2YXIgSXNDb2xsYWJvcmF0aW9uVHlwZSA9ICgKICAgICAgICAgICAgICAgICAgICBIZWFkZXJUZXh0LmluZGV4T2YoJ0NvbGxhYm9yYXRpb24nKSA+IC0xIHx8CiAgICAgICAgICAgICAgICAgICAgSGVhZGVyVGV4dC5pbmRleE9mKCdLb2xsYWJvcmF0aW9uJykgPiAtMQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoIUlzQ29sbGFib3JhdGlvblR5cGUpIHJldHVybjsKCiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSB0YWJsZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBoMwogICAgICAgICAgICAgICAgdmFyICRUYWJsZSA9ICRIZWFkZXIubmV4dCgndGFibGUuRGF0YVRhYmxlJyk7CiAgICAgICAgICAgICAgICBpZiAoISRUYWJsZS5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggcm93IGluIHRoaXMgQ29sbGFib3JhdGlvbiB0YWJsZQogICAgICAgICAgICAgICAgJFRhYmxlLmZpbmQoJ3Rib2R5IHRyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJFJvdyA9ICQodGhpcyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQKICAgICAgICAgICAgICAgICAgICBpZiAoJFJvdy5oYXNDbGFzcygnQ29sbGFiQ2FuY2VsUHJvY2Vzc2VkJykpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAkUm93LmFkZENsYXNzKCdDb2xsYWJDYW5jZWxQcm9jZXNzZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgYXBwb2ludG1lbnQgbGluawogICAgICAgICAgICAgICAgICAgIHZhciAkTGluayA9ICRSb3cuZmluZCgnYVtocmVmKj0iQXBwb2ludG1lbnRJRCJdJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkTGluay5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBBcHBvaW50bWVudElEIGZyb20gaHJlZgogICAgICAgICAgICAgICAgICAgIHZhciBIcmVmTWF0Y2ggPSAoJExpbmsuYXR0cignaHJlZicpIHx8ICcnKS5tYXRjaCgvQXBwb2ludG1lbnRJRD0oXGQrKS8pOwogICAgICAgICAgICAgICAgICAgIGlmICghSHJlZk1hdGNoKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIHZhciBBcHBvaW50bWVudElEID0gSHJlZk1hdGNoWzFdOwoKICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjZWxsIGNvbnRhaW5pbmcgdGhlIGxpbmsKICAgICAgICAgICAgICAgICAgICB2YXIgJENlbGwgPSAkTGluay5jbG9zZXN0KCd0ZCcpOwogICAgICAgICAgICAgICAgICAgIGlmICghJENlbGwubGVuZ3RoKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjbGFzcyBmb3IgcG9zaXRpb25pbmcKICAgICAgICAgICAgICAgICAgICAkQ2VsbC5hZGRDbGFzcygnQ29sbGFiQ2FuY2VsQ2VsbCcpOwoKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgY2FuY2VsIGJ1dHRvbiAoaW5saW5lIHZhcmlhbnQgZm9yIHJpZ2h0LWFsaWduZWQgcG9zaXRpb25pbmcpCiAgICAgICAgICAgICAgICAgICAgdmFyICRDYW5jZWxCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQgQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQtLWlubGluZScpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwgQXBwb2ludG1lbnQnKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jYWxlbmRhci10aW1lcy1vIj48L2k+Jyk7CgogICAgICAgICAgICAgICAgICAgICRDYW5jZWxCdG4ub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbEFwcG9pbnRtZW50KEFwcG9pbnRtZW50SUQsIFRpY2tldElEKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgJENlbGwuYXBwZW5kKCRDYW5jZWxCdG4pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBNZXRob2RzIC0gVGlja2V0IEluZm8gQXZhdGFycwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgYXZhdGFycyBmb3IgT3duZXIvUmVzcG9uc2libGUgaW4gVGlja2V0LUluZm9ybWF0aW9uIHdpZGdldAogICAgICogICAgICAgICAgICAgIFJlcGxhY2VzIHRleHQgbmFtZXMgd2l0aCBhdmF0YXIgKyBuYW1lIGRpc3BsYXkgaW5jbHVkaW5nIGhvdmVyLWNhcmRzCiAgICAgKi8KICAgIGZ1bmN0aW9uIEluaXRUaWNrZXRJbmZvQXZhdGFycygpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwoKICAgICAgICAvLyBDaGVjayBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgICAgICBpZiAoIUNvbmZpZy5FbmFibGVPd25lckluZm9QYW5lbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBPbmx5IG9uIHRpY2tldCB6b29tIHBhZ2VzCiAgICAgICAgaWYgKCFDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldElEJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gR2V0IG93bmVyL3Jlc3BvbnNpYmxlIGRhdGEgZnJvbSBjb25maWcgKGluamVjdGVkIGJ5IE91dHB1dCBGaWx0ZXIpCiAgICAgICAgdmFyIE93bmVyRW1haWwgPSBDb25maWcuT3duZXJFbWFpbDsKICAgICAgICB2YXIgT3duZXJOYW1lID0gQ29uZmlnLk93bmVyTmFtZTsKICAgICAgICB2YXIgUmVzcG9uc2libGVFbWFpbCA9IENvbmZpZy5SZXNwb25zaWJsZUVtYWlsOwogICAgICAgIHZhciBSZXNwb25zaWJsZU5hbWUgPSBDb25maWcuUmVzcG9uc2libGVOYW1lOwoKICAgICAgICAvLyBQcm9jZXNzIGFmdGVyIHNob3J0IGRlbGF5IHRvIGVuc3VyZSBET00gaXMgcmVhZHkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBSZXBsYWNlVGlja2V0SW5mb0ZpZWxkKCdPd25lcicsIE93bmVyRW1haWwsIE93bmVyTmFtZSk7CiAgICAgICAgICAgIFJlcGxhY2VUaWNrZXRJbmZvRmllbGQoJ1Jlc3BvbnNpYmxlJywgUmVzcG9uc2libGVFbWFpbCwgUmVzcG9uc2libGVOYW1lKTsKICAgICAgICB9LCAxMDApOwoKICAgICAgICAvLyBBbHNvIHJ1biBhZnRlciBsb25nZXIgZGVsYXkgZm9yIGFzeW5jIHdpZGdldHMKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBSZXBsYWNlVGlja2V0SW5mb0ZpZWxkKCdPd25lcicsIE93bmVyRW1haWwsIE93bmVyTmFtZSk7CiAgICAgICAgICAgIFJlcGxhY2VUaWNrZXRJbmZvRmllbGQoJ1Jlc3BvbnNpYmxlJywgUmVzcG9uc2libGVFbWFpbCwgUmVzcG9uc2libGVOYW1lKTsKICAgICAgICB9LCAxMDAwKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUmVwbGFjZSBhIHNwZWNpZmljIGZpZWxkIGluIFRpY2tldC1JbmZvcm1hdGlvbiB3aWRnZXQgd2l0aCBhdmF0YXIgZGlzcGxheQogICAgICogQHBhcmFtIHtTdHJpbmd9IEZpZWxkVHlwZSAtICdPd25lcicgb3IgJ1Jlc3BvbnNpYmxlJwogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcyBmb3IgYXZhdGFyL2hvdmVyLWNhcmQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBOYW1lIC0gRGlzcGxheSBuYW1lCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlcGxhY2VUaWNrZXRJbmZvRmllbGQoRmllbGRUeXBlLCBFbWFpbCwgTmFtZSkgewogICAgICAgIC8vIFNraXAgaWYgbm8gZGF0YQogICAgICAgIGlmICghRW1haWwgJiYgIU5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTGFiZWxzIHRvIHNlYXJjaCBmb3IgKEdlcm1hbiBhbmQgRW5nbGlzaCkKICAgICAgICB2YXIgTGFiZWxzID0gewogICAgICAgICAgICAnT3duZXInOiBbJ0Jlc2l0emVyJywgJ093bmVyJ10sCiAgICAgICAgICAgICdSZXNwb25zaWJsZSc6IFsnVmVyYW50d29ydGxpY2hlcicsICdSZXNwb25zaWJsZSddCiAgICAgICAgfTsKCiAgICAgICAgdmFyIFNlYXJjaExhYmVscyA9IExhYmVsc1tGaWVsZFR5cGVdIHx8IFtdOwogICAgICAgIGlmICghU2VhcmNoTGFiZWxzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBGaW5kIFRpY2tldC1JbmZvcm1hdGlvbmVuIHdpZGdldCBieSBoZWFkZXIgdGV4dAogICAgICAgIHZhciAkVGlja2V0SW5mb1dpZGdldCA9IG51bGw7CiAgICAgICAgLy8gU2luY2UgWm51bnkgNy4zLjEsIHRoaXMgd2lkZ2V0J3MgdGl0bGUgbGl2ZXMgaW4gIi5zaWRlYmFyV2lkZ2V0VGl0bGUgaDMiCiAgICAgICAgLy8gYW5kIHRoZSB3aWRnZXQgaXRzZWxmIG5vIGxvbmdlciBoYXMgYSAiLldpZGdldFNpbXBsZSIgY2xhc3MgYXQgYWxsIC0KICAgICAgICAvLyBjaGVjayBib3RoIGNvbnZlbnRpb25zIGFuZCByZXNvbHZlIHZpYSBSZXNvbHZlV2lkZ2V0Qm94KCkuCiAgICAgICAgLy8gT24gcHJvY2VzcyB0aWNrZXRzLCBabnVueSByZW5kZXJzIHRoZSB2ZXJ5IHNhbWUgd2lkZ2V0IChPd25lciwKICAgICAgICAvLyBDdXN0b21lciBJRCwgZXRjLiBhbGwgcHJlc2VudCwgc2FtZSBtYXJrdXApIHRpdGxlZCAiUHJvY2VzcwogICAgICAgIC8vIEluZm9ybWF0aW9uIiAvICJQcm96ZXNzaW5mb3JtYXRpb25lbiIgaW5zdGVhZCAtIHdpdGhvdXQgdGhpcywKICAgICAgICAvLyB0aGUgZmVhdHVyZSBzaWxlbnRseSBkaWQgbm90aGluZyBvbiBwcm9jZXNzIHRpY2tldHMuCiAgICAgICAgdmFyIFRpY2tldEluZm9UaXRsZXMgPSBbCiAgICAgICAgICAgICdUaWNrZXQtSW5mb3JtYXRpb25lbicsICdUaWNrZXQgSW5mb3JtYXRpb24nLAogICAgICAgICAgICAnUHJvemVzc2luZm9ybWF0aW9uZW4nLCAnUHJvY2VzcyBJbmZvcm1hdGlvbicKICAgICAgICBdOwogICAgICAgICQoJy5TaWRlYmFyQ29sdW1uIC5XaWRnZXRTaW1wbGUgLkhlYWRlciBoMiwgLlNpZGViYXJDb2x1bW4gLldpZGdldFNpbXBsZSAuSGVhZGVyIGgzLCAuc2lkZWJhckNvbnRlbnQgLnNpZGViYXJXaWRnZXRUaXRsZSBoMycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBUZXh0ID0gJCh0aGlzKS50ZXh0KCkudHJpbSgpOwogICAgICAgICAgICBpZiAoVGlja2V0SW5mb1RpdGxlcy5pbmRleE9mKFRleHQpID4gLTEpIHsKICAgICAgICAgICAgICAgICRUaWNrZXRJbmZvV2lkZ2V0ID0gUmVzb2x2ZVdpZGdldEJveCgkKHRoaXMpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAoISRUaWNrZXRJbmZvV2lkZ2V0IHx8ICEkVGlja2V0SW5mb1dpZGdldC5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gRmluZCB0aGUgbGFiZWwgZWxlbWVudCB3aXRoaW4gdGhlIHdpZGdldAogICAgICAgIHZhciAkVmFsdWVFbGVtZW50ID0gbnVsbDsKCiAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBzZWxlY3RvcnMgKFpudW55IHVzZXMgdmFyaW91cyBzdHJ1Y3R1cmVzKQogICAgICAgIC8vIFBhdHRlcm4gMTogPGxhYmVsPkJlc2l0emVyOjwvbGFiZWw+IGZvbGxvd2VkIGJ5IDxwIGNsYXNzPSJWYWx1ZSI+TmFtZTwvcD4KICAgICAgICAvLwogICAgICAgIC8vIElNUE9SVEFOVDogbGFiZWwgYW5kIHZhbHVlIGFyZSBOT1QgaW5kaXZpZHVhbGx5IHdyYXBwZWQgLSBabnVueSdzCiAgICAgICAgLy8gVGlja2V0L1Byb2Nlc3MgSW5mb3JtYXRpb24gd2lkZ2V0IHB1dHMgQUxMIGZpZWxkcyBhcyBmbGF0CiAgICAgICAgLy8gc2libGluZ3MgaW5zaWRlIE9ORSBzaGFyZWQgPGZpZWxkc2V0PiAoQ3VzdG9tZXIgSUQsIEFjY291bnRlZAogICAgICAgIC8vIHRpbWUsIE93bmVyLCAuLi4gYWxsIGFzIGRpcmVjdCBjaGlsZHJlbikuIFRha2luZyB0aGUgbGFiZWwncwogICAgICAgIC8vIC5wYXJlbnQoKSBhbmQgc2VhcmNoaW5nIC5maW5kKCcuVmFsdWUnKS5maXJzdCgpIHRoZXJlZm9yZQogICAgICAgIC8vIHJldHVybnMgdGhlIEZJUlNUIHZhbHVlIGluIHRoZSB3aG9sZSBmaWVsZHNldCAtIGUuZy4gIkN1c3RvbWVyCiAgICAgICAgLy8gSUQiJ3MgdmFsdWUgd2hlbiBPd25lciBpc24ndCB0aGUgZmlyc3QgZmllbGQgLSBub3QgdGhlIHZhbHVlCiAgICAgICAgLy8gdGhhdCBhY3R1YWxseSBiZWxvbmdzIHRvIHRoaXMgbGFiZWwuIEFsd2F5cyB0YWtlIHRoZQogICAgICAgIC8vIGltbWVkaWF0ZWx5LWZvbGxvd2luZyBWYWx1ZSBzaWJsaW5nIGluc3RlYWQuCiAgICAgICAgJFRpY2tldEluZm9XaWRnZXQuZmluZCgnbGFiZWwnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgTGFiZWxUZXh0ID0gJCh0aGlzKS50ZXh0KCkudHJpbSgpLnJlcGxhY2UoJzonLCAnJyk7CiAgICAgICAgICAgIGlmIChTZWFyY2hMYWJlbHMuaW5kZXhPZihMYWJlbFRleHQpID4gLTEpIHsKICAgICAgICAgICAgICAgIHZhciAkVmFsdWUgPSAkKHRoaXMpLm5leHRBbGwoJy5WYWx1ZSwgcC5WYWx1ZSwgc3Bhbi5WYWx1ZScpLmZpcnN0KCk7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IHByb2Nlc3NlZCAocGVyLWZpZWxkLCBub3QgcGVyLXNoYXJlZC1jb250YWluZXIpCiAgICAgICAgICAgICAgICBpZiAoISRWYWx1ZS5sZW5ndGggfHwgJFZhbHVlLmZpbmQoJy5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFZhbHVlRWxlbWVudCA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBQYXR0ZXJuIDI6IGZpZWxkc2V0IHdpdGggPHNwYW4gY2xhc3M9IktleSI+QmVzaXR6ZXI8L3NwYW4+IDxzcGFuIGNsYXNzPSJWYWx1ZSI+TmFtZTwvc3Bhbj4KICAgICAgICBpZiAoISRWYWx1ZUVsZW1lbnQgfHwgISRWYWx1ZUVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgICRUaWNrZXRJbmZvV2lkZ2V0LmZpbmQoJy5LZXksIHNwYW4uS2V5JykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBLZXlUZXh0ID0gJCh0aGlzKS50ZXh0KCkudHJpbSgpLnJlcGxhY2UoJzonLCAnJyk7CiAgICAgICAgICAgICAgICBpZiAoU2VhcmNoTGFiZWxzLmluZGV4T2YoS2V5VGV4dCkgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIHZhciAkVmFsdWUgPSAkKHRoaXMpLm5leHRBbGwoJy5WYWx1ZSwgc3Bhbi5WYWx1ZScpLmZpcnN0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkVmFsdWUubGVuZ3RoIHx8ICRWYWx1ZS5maW5kKCcuQ29sbGFiVGlja2V0SW5mb0F2YXRhcicpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRWYWx1ZUVsZW1lbnQgPSAkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmICghJFZhbHVlRWxlbWVudCB8fCAhJFZhbHVlRWxlbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTWFyayBhcyBwcm9jZXNzZWQgdG8gcHJldmVudCBkb3VibGUgcHJvY2Vzc2luZyAtIG1hcmtlZCBvbiB0aGUKICAgICAgICAvLyBWYWx1ZSBlbGVtZW50IGl0c2VsZiAobm90IGEgc2hhcmVkIGFuY2VzdG9yKSwgc2luY2UgT3duZXIgYW5kCiAgICAgICAgLy8gUmVzcG9uc2libGUgY2FuIHNpdCBpbiB0aGUgdmVyeSBzYW1lIGZpZWxkc2V0LgogICAgICAgICRWYWx1ZUVsZW1lbnQuYWRkQ2xhc3MoJ0NvbGxhYlRpY2tldEluZm8tLXByb2Nlc3NlZCcpOwoKICAgICAgICAvLyBDcmVhdGUgYXZhdGFyIGVsZW1lbnQKICAgICAgICB2YXIgJEF2YXRhckNvbnRhaW5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYlRpY2tldEluZm9BdmF0YXInKTsKCiAgICAgICAgLy8gTWFpbiByb3cgd2l0aCBhdmF0YXIgYW5kIGluZm8gKGhvdmVyIHRyaWdnZXIpCiAgICAgICAgdmFyICRNYWluUm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fcm93Jyk7CiAgICAgICAgaWYgKEVtYWlsICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdIb3ZlckNhcmRzJykpIHsKICAgICAgICAgICAgJE1haW5Sb3cuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyVHJpZ2dlcicpLmF0dHIoJ2RhdGEtZW1haWwnLCBFbWFpbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBBdmF0YXIgd3JhcHBlcgogICAgICAgIHZhciAkQXZhdGFyV3JhcCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhcicpOwoKICAgICAgICAvLyBDcmVhdGUgYXZhdGFyIChzbWFsbCBzaXplIGZvciBpbmxpbmUgZGlzcGxheSkKICAgICAgICB2YXIgJEF2YXRhciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhciBDb2xsYWJBdmF0YXItLW1lZGl1bScpOwogICAgICAgIHZhciAkRmFsbGJhY2sgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykudGV4dChHZXRJbml0aWFscyhFbWFpbCwgTmFtZSkpOwogICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZSBDb2xsYWJQcmVzZW5jZS0tdW5rbm93bicpOwogICAgICAgICRBdmF0YXIuYXBwZW5kKCRGYWxsYmFjaywgJFByZXNlbmNlKTsKICAgICAgICAkQXZhdGFyV3JhcC5hcHBlbmQoJEF2YXRhcik7CgogICAgICAgIC8vIEluZm8gYXJlYSB3aXRoIG5hbWUKICAgICAgICB2YXIgJEluZm8gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJUaWNrZXRJbmZvQXZhdGFyX19pbmZvJyk7CiAgICAgICAgdmFyICROYW1lU3BhbiA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJUaWNrZXRJbmZvQXZhdGFyX19uYW1lJykudGV4dChOYW1lIHx8IEVtYWlsIHx8ICctJyk7CiAgICAgICAgJEluZm8uYXBwZW5kKCROYW1lU3Bhbik7CgogICAgICAgICRNYWluUm93LmFwcGVuZCgkQXZhdGFyV3JhcCwgJEluZm8pOwogICAgICAgICRBdmF0YXJDb250YWluZXIuYXBwZW5kKCRNYWluUm93KTsKCiAgICAgICAgLy8gUmVwbGFjZSB2YWx1ZSBlbGVtZW50IGNvbnRlbnQKICAgICAgICAkVmFsdWVFbGVtZW50LmVtcHR5KCkuYXBwZW5kKCRBdmF0YXJDb250YWluZXIpOwoKICAgICAgICAvLyBMb2FkIGF2YXRhciBpbWFnZSBhc3luY2hyb25vdXNseQogICAgICAgIGlmIChFbWFpbCAmJiBDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnQXZhdGFyJykpIHsKICAgICAgICAgICAgQ29sbGFiLkdldEF2YXRhcihFbWFpbCkudGhlbihmdW5jdGlvbihBdmF0YXJVcmwpIHsKICAgICAgICAgICAgICAgIGlmIChBdmF0YXJVcmwpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJEltZyA9ICQoJzxpbWc+JykuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhcl9faW1hZ2UnKS5hdHRyKCdzcmMnLCBBdmF0YXJVcmwpOwogICAgICAgICAgICAgICAgICAgICRBdmF0YXIuZmluZCgnLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2snKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJEF2YXRhci5wcmVwZW5kKCRJbWcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIEtlZXAgZmFsbGJhY2sgaW5pdGlhbHMKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBMb2FkIHByZXNlbmNlIGFzeW5jaHJvbm91c2x5CiAgICAgICAgaWYgKEVtYWlsICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdQcmVzZW5jZScpKSB7CiAgICAgICAgICAgIENvbGxhYi5HZXRQcmVzZW5jZShFbWFpbCkudGhlbihmdW5jdGlvbihQcmVzZW5jZSkgewogICAgICAgICAgICAgICAgaWYgKFByZXNlbmNlICYmIFByZXNlbmNlLnN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHZhciBQcmVzZW5jZUNsYXNzID0gR2V0UHJlc2VuY2VDbGFzcyhQcmVzZW5jZS5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICRQcmVzZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoZnVuY3Rpb24oaSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjLm1hdGNoKC9Db2xsYWJQcmVzZW5jZS0tXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UgJyArIFByZXNlbmNlQ2xhc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIEtlZXAgdW5rbm93biBwcmVzZW5jZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgY2FuY2VsIGJ1dHRvbnMgZm9yIGxpbmtlZCBhcHBvaW50bWVudHMKICAgICAqICAgICAgICAgICAgICBDYWxsZWQgb24gcGFnZSBsb2FkIGFuZCBhZnRlciBhc3luYyB3aWRnZXQgbG9hZGluZwogICAgICovCiAgICBmdW5jdGlvbiBJbml0Q2FuY2VsQXBwb2ludG1lbnRCdXR0b25zKCkgewogICAgICAgIC8vIFJ1biBpbW1lZGlhdGVseSBmb3IgYm90aCB3aWRnZXQgdHlwZXMKICAgICAgICBBZGRDYW5jZWxCdXR0b25zVG9MaW5rZWRBcHBvaW50bWVudHMoKTsgICAgICAvLyBJVFNNIHdpZGdldAogICAgICAgIEFkZENhbmNlbEJ1dHRvbnNUb1N0YW5kYXJkTGlua2VkT2JqZWN0cygpOyAgIC8vIFN0YW5kYXJkIExpbmtlZE9iamVjdHMgd2lkZ2V0CgogICAgICAgIC8vIEFsc28gcnVuIGFmdGVyIGRlbGF5cyBmb3IgYXN5bmMgd2lkZ2V0IGxvYWRpbmcKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBZGRDYW5jZWxCdXR0b25zVG9MaW5rZWRBcHBvaW50bWVudHMoKTsKICAgICAgICAgICAgQWRkQ2FuY2VsQnV0dG9uc1RvU3RhbmRhcmRMaW5rZWRPYmplY3RzKCk7CiAgICAgICAgfSwgNTAwKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBZGRDYW5jZWxCdXR0b25zVG9MaW5rZWRBcHBvaW50bWVudHMoKTsKICAgICAgICAgICAgQWRkQ2FuY2VsQnV0dG9uc1RvU3RhbmRhcmRMaW5rZWRPYmplY3RzKCk7CiAgICAgICAgfSwgMTUwMCk7CgogICAgICAgIC8vIFVzZSBNdXRhdGlvbk9ic2VydmVyIHRvIGNhdGNoIGFzeW5jIHdpZGdldCBsb2FkaW5nCiAgICAgICAgdmFyIE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIEFkZENhbmNlbEJ1dHRvbnNUb0xpbmtlZEFwcG9pbnRtZW50cygpOwogICAgICAgICAgICBBZGRDYW5jZWxCdXR0b25zVG9TdGFuZGFyZExpbmtlZE9iamVjdHMoKTsKICAgICAgICB9KTsKICAgICAgICBPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwoKICAgICAgICAvLyBTdG9wIG9ic2VydmluZyBhZnRlciAxMCBzZWNvbmRzCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgIH0sIDEwMDAwKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgTWV0aG9kcyAtIFBhZ2UgUHJvY2Vzc2luZwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gUHJvY2Vzc0F2YXRhcnNPblBhZ2UoKSB7CiAgICAgICAgLy8gRmluZCBhbGwgcGxhY2Vob2xkZXIgZWxlbWVudHMgdGhhdCBzaG91bGQgYmVjb21lIGF2YXRhcnMKICAgICAgICAkKCdbZGF0YS1jb2xsYWItZW1haWxdJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkUGxhY2Vob2xkZXIgPSAkKHRoaXMpOwogICAgICAgICAgICB2YXIgRW1haWwgPSAkUGxhY2Vob2xkZXIuYXR0cignZGF0YS1jb2xsYWItZW1haWwnKTsKICAgICAgICAgICAgdmFyIFNpemUgPSAkUGxhY2Vob2xkZXIuYXR0cignZGF0YS1jb2xsYWItc2l6ZScpIHx8ICdtZWRpdW0nOwogICAgICAgICAgICB2YXIgU2hvd1ByZXNlbmNlID0gJFBsYWNlaG9sZGVyLmF0dHIoJ2RhdGEtY29sbGFiLXByZXNlbmNlJykgIT09ICdmYWxzZSc7CgogICAgICAgICAgICAvLyBTa2lwIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgYXZhdGFycyBvciBwYXJ0IG9mIGEgVXNlckJhZGdlCiAgICAgICAgICAgIC8vIChVc2VyQmFkZ2UgbWFuYWdlcyBpdHMgb3duIGF2YXRhcikKICAgICAgICAgICAgaWYgKCRQbGFjZWhvbGRlci5oYXNDbGFzcygnQ29sbGFiQXZhdGFyJykgfHwKICAgICAgICAgICAgICAgICRQbGFjZWhvbGRlci5oYXNDbGFzcygnQ29sbGFiVXNlckJhZGdlX19jb250ZW50JykgfHwKICAgICAgICAgICAgICAgICRQbGFjZWhvbGRlci5jbG9zZXN0KCcuQ29sbGFiVXNlckJhZGdlX19jb250ZW50JykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47IC8vIHNraXAgdGhpcyBlbGVtZW50CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChFbWFpbCkgewogICAgICAgICAgICAgICAgdmFyICRBdmF0YXIgPSBUYXJnZXROUy5DcmVhdGVBdmF0YXIoewogICAgICAgICAgICAgICAgICAgIGVtYWlsOiBFbWFpbCwKICAgICAgICAgICAgICAgICAgICBzaXplOiBTaXplLAogICAgICAgICAgICAgICAgICAgIHNob3dQcmVzZW5jZTogU2hvd1ByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgJFBsYWNlaG9sZGVyLnJlcGxhY2VXaXRoKCRBdmF0YXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBhdmF0YXJzCiAgICAgICAgJCgnLkNvbGxhYkF2YXRhcicpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBUYXJnZXROUy5VcGRhdGVBdmF0YXIoJCh0aGlzKSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gVHJhY2sgcHJvY2Vzc2VkIGFydGljbGUgd2lkZ2V0cyBieSB0aGVpciBhcnRpY2xlIElEIHRvIHByZXZlbnQgZHVwbGljYXRlcwogICAgLy8gVGhpcyBzdXJ2aXZlcyBET00gcmUtcmVuZGVycyBiZXR0ZXIgdGhhbiBDU1MgY2xhc3NlcwogICAgdmFyIFByb2Nlc3NlZEFydGljbGVXaWRnZXRzID0ge307CgogICAgLyoqCiAgICAgKiBAbmFtZSBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzIG5hdGl2ZSBabnVueSBhcnRpY2xlIGF2YXRhcnMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIENvbGxhYm9yYXRpb24gYXZhdGFycwogICAgICovCiAgICBmdW5jdGlvbiBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMoKSB7CiAgICAgICAgLy8gRmluZCBhbGwgbmF0aXZlIGFydGljbGUgYXZhdGFycyAoQXJ0aWNsZVNlbmRlckluaXRpYWxzKQogICAgICAgICQoJy5BdmF0YXIgLkFydGljbGVTZW5kZXJJbml0aWFscycpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJEluaXRpYWxzQ29udGFpbmVyID0gJCh0aGlzKTsKICAgICAgICAgICAgdmFyICRBdmF0YXJDb250YWluZXIgPSAkSW5pdGlhbHNDb250YWluZXIuY2xvc2VzdCgnLkF2YXRhcicpOwoKICAgICAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IGFydGljbGUgd2lkZ2V0IEZJUlNUCiAgICAgICAgICAgIHZhciAkV2lkZ2V0ID0gJEF2YXRhckNvbnRhaW5lci5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJyk7CiAgICAgICAgICAgIGlmICghJFdpZGdldC5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgICAgIC8vIEdldCBhcnRpY2xlIElEIGZyb20gd2lkZ2V0IGZvciB0cmFja2luZyAobW9yZSByZWxpYWJsZSB0aGFuIERPTSBjbGFzc2VzKQogICAgICAgICAgICB2YXIgQXJ0aWNsZUlEID0gJFdpZGdldC5hdHRyKCdpZCcpIHx8ICRXaWRnZXQuZGF0YSgnYXJ0aWNsZS1pZCcpOwogICAgICAgICAgICBpZiAoIUFydGljbGVJRCkgewogICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYXJ0aWNsZSBJRCBmcm9tIGhlYWRlciBsaW5rCiAgICAgICAgICAgICAgICB2YXIgJEhlYWRlckxpbmsgPSAkV2lkZ2V0LmZpbmQoJy5IZWFkZXIgaDIgYVtuYW1lXScpOwogICAgICAgICAgICAgICAgaWYgKCRIZWFkZXJMaW5rLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9ICRIZWFkZXJMaW5rLmF0dHIoJ25hbWUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUFJJTUFSWSBDSEVDSzogU2tpcCBpZiBhIENvbGxhYkF2YXRhciBhbHJlYWR5IGV4aXN0cyBBTllXSEVSRSBpbiB0aGlzIHdpZGdldAogICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIGNoZWNrIC0gaWYgb3VyIGF2YXRhciBpcyB0aGVyZSwgZG9uJ3QgY3JlYXRlIGFub3RoZXIKICAgICAgICAgICAgaWYgKCRXaWRnZXQuZmluZCgnLkNvbGxhYkF2YXRhcicpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgbmF0aXZlIGF2YXRhciBpcyBoaWRkZW4gKG1pZ2h0IGJlIHZpc2libGUgYWZ0ZXIgcmUtcmVuZGVyKQogICAgICAgICAgICAgICAgJEF2YXRhckNvbnRhaW5lci5hZGRDbGFzcygnQ29sbGFiSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAvLyBNYXJrIHdpZGdldCBhcyBwcm9jZXNzZWQgKGNsYXNzIG1pZ2h0IGhhdmUgYmVlbiBsb3N0IGR1cmluZyByZS1yZW5kZXIpCiAgICAgICAgICAgICAgICAkV2lkZ2V0LmFkZENsYXNzKCdDb2xsYWJBcnRpY2xlLS1wcm9jZXNzZWQnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU0VDT05EQVJZIENIRUNLOiBTa2lwIGlmIHRoaXMgd2lkZ2V0IHdhcyBhbHJlYWR5IHByb2Nlc3NlZCAoQ1NTIGNsYXNzKQogICAgICAgICAgICBpZiAoJFdpZGdldC5oYXNDbGFzcygnQ29sbGFiQXJ0aWNsZS0tcHJvY2Vzc2VkJykpIHJldHVybjsKCiAgICAgICAgICAgIC8vIFRFUlRJQVJZIENIRUNLOiBTa2lwIGlmIHdlJ3ZlIHByb2Nlc3NlZCB0aGlzIGFydGljbGUgSUQgYmVmb3JlIChKUyB0cmFja2luZykKICAgICAgICAgICAgaWYgKEFydGljbGVJRCAmJiBQcm9jZXNzZWRBcnRpY2xlV2lkZ2V0c1tBcnRpY2xlSURdKSB7CiAgICAgICAgICAgICAgICAkV2lkZ2V0LmFkZENsYXNzKCdDb2xsYWJBcnRpY2xlLS1wcm9jZXNzZWQnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTWFyayBhcyBwcm9jZXNzZWQgSU1NRURJQVRFTFkgdXNpbmcgYWxsIHRocmVlIG1ldGhvZHMKICAgICAgICAgICAgJFdpZGdldC5hZGRDbGFzcygnQ29sbGFiQXJ0aWNsZS0tcHJvY2Vzc2VkJyk7CiAgICAgICAgICAgIGlmIChBcnRpY2xlSUQpIHsKICAgICAgICAgICAgICAgIFByb2Nlc3NlZEFydGljbGVXaWRnZXRzW0FydGljbGVJRF0gPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBFeHRyYWN0IGVtYWlsIGZyb20gSGlkZGVuIHNwYW4gaW4gaGVhZGVyCiAgICAgICAgICAgIC8vIEZvcm1hdDogIkRpc3BsYXkgTmFtZSIgPGVtYWlsQGRvbWFpbi5kZT4KICAgICAgICAgICAgdmFyICRIaWRkZW5TcGFuID0gJFdpZGdldC5maW5kKCcuSGVhZGVyIGgyIC5IaWRkZW4nKS5maXJzdCgpOwogICAgICAgICAgICB2YXIgSGlkZGVuVGV4dCA9ICRIaWRkZW5TcGFuLnRleHQoKTsKICAgICAgICAgICAgdmFyIEVtYWlsTWF0Y2ggPSBIaWRkZW5UZXh0Lm1hdGNoKC88KFtePl0rKT4vKTsKICAgICAgICAgICAgdmFyIEVtYWlsID0gRW1haWxNYXRjaCA/IEVtYWlsTWF0Y2hbMV0gOiBudWxsOwoKICAgICAgICAgICAgLy8gRXh0cmFjdCBkaXNwbGF5IG5hbWUgZm9yIGJldHRlciBpbml0aWFscwogICAgICAgICAgICB2YXIgTmFtZU1hdGNoID0gSGlkZGVuVGV4dC5tYXRjaCgvIihbXiJdKykiLyk7CiAgICAgICAgICAgIHZhciBEaXNwbGF5TmFtZSA9IE5hbWVNYXRjaCA/IE5hbWVNYXRjaFsxXSA6IG51bGw7CgogICAgICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgICAgICAvLyBObyBlbWFpbCBmb3VuZCwgc2tpcCB0aGlzIGF2YXRhcgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBIaWRlIHRoZSBvcmlnaW5hbCBabnVueSBhdmF0YXIgY29udGFpbmVyIGNvbXBsZXRlbHkKICAgICAgICAgICAgJEF2YXRhckNvbnRhaW5lci5hZGRDbGFzcygnQ29sbGFiSGlkZGVuJyk7CgogICAgICAgICAgICAvLyBDcmVhdGUgQ29sbGFib3JhdGlvbiBhdmF0YXIKICAgICAgICAgICAgdmFyICRDb2xsYWJBdmF0YXIgPSBUYXJnZXROUy5DcmVhdGVBdmF0YXIoewogICAgICAgICAgICAgICAgZW1haWw6IEVtYWlsLAogICAgICAgICAgICAgICAgc2l6ZTogJ3hsYXJnZScsICAvLyA2NHB4IC0gbWF0Y2hlcyBuYXRpdmUgYXZhdGFyIHNpemUKICAgICAgICAgICAgICAgIHNob3dQcmVzZW5jZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkaXNwbGF5IG5hbWUsIHVwZGF0ZSB0aGUgZmFsbGJhY2sgaW5pdGlhbHMKICAgICAgICAgICAgaWYgKERpc3BsYXlOYW1lKSB7CiAgICAgICAgICAgICAgICAkQ29sbGFiQXZhdGFyLmZpbmQoJy5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykudGV4dChHZXRJbml0aWFscyhFbWFpbCwgRGlzcGxheU5hbWUpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSW5zZXJ0IG91ciBhdmF0YXIgQkVGT1JFIHRoZSBoaWRkZW4gbmF0aXZlIGF2YXRhciAoYXMgc2libGluZykKICAgICAgICAgICAgJEF2YXRhckNvbnRhaW5lci5iZWZvcmUoJENvbGxhYkF2YXRhcik7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIEhlbHBlciBGdW5jdGlvbnMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIEdldEluaXRpYWxzKE5hbWVPckVtYWlsLCBEaXNwbGF5TmFtZSkgewogICAgICAgIC8vIFByZWZlciBkaXNwbGF5TmFtZSBpZiBwcm92aWRlZAogICAgICAgIGlmIChEaXNwbGF5TmFtZSkgewogICAgICAgICAgICB2YXIgTmFtZVBhcnRzID0gRGlzcGxheU5hbWUudHJpbSgpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgaWYgKE5hbWVQYXJ0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgcmV0dXJuIChOYW1lUGFydHNbMF1bMF0gKyBOYW1lUGFydHNbTmFtZVBhcnRzLmxlbmd0aCAtIDFdWzBdKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBEaXNwbGF5TmFtZS5zdWJzdHJpbmcoMCwgMikudG9VcHBlckNhc2UoKTsKICAgICAgICB9CgogICAgICAgIC8vIEZhbGxiYWNrIHRvIGVtYWlsCiAgICAgICAgaWYgKCFOYW1lT3JFbWFpbCkgcmV0dXJuICc/JzsKCiAgICAgICAgdmFyIE5hbWUgPSBOYW1lT3JFbWFpbC5zcGxpdCgnQCcpWzBdOwogICAgICAgIHZhciBQYXJ0cyA9IE5hbWUuc3BsaXQoL1suXy1dLyk7CgogICAgICAgIGlmIChQYXJ0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICByZXR1cm4gKFBhcnRzWzBdWzBdICsgUGFydHNbMV1bMF0pLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gTmFtZS5zdWJzdHJpbmcoMCwgMikudG9VcHBlckNhc2UoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRQcmVzZW5jZUluZm8oU3RhdHVzKSB7CiAgICAgICAgdmFyIExvd2VyU3RhdHVzID0gKFN0YXR1cyB8fCAndW5rbm93bicpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csICcnKTsKICAgICAgICByZXR1cm4gUHJlc2VuY2VNYXBbTG93ZXJTdGF0dXNdIHx8IFByZXNlbmNlTWFwWyd1bmtub3duJ107CiAgICB9CgogICAgZnVuY3Rpb24gVXBkYXRlUHJlc2VuY2VJbmRpY2F0b3IoJEVsZW1lbnQsIFByZXNlbmNlKSB7CiAgICAgICAgdmFyIEluZm8gPSBHZXRQcmVzZW5jZUluZm8oUHJlc2VuY2Uuc3RhdHVzKTsKCiAgICAgICAgLy8gUmVtb3ZlIGFsbCBzdGF0dXMgY2xhc3NlcwogICAgICAgICRFbGVtZW50LnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChJbmRleCwgQ2xhc3NOYW1lKSB7CiAgICAgICAgICAgIHJldHVybiAoQ2xhc3NOYW1lLm1hdGNoKC9Db2xsYWJQcmVzZW5jZS0tXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEFkZCBuZXcgc3RhdHVzIGNsYXNzCiAgICAgICAgJEVsZW1lbnQuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlLS0nICsgSW5mby5jbGFzcyk7CiAgICAgICAgJEVsZW1lbnQuYXR0cigndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZShJbmZvLmxhYmVsKSk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBIYW5kbGVycwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgZnVuY3Rpb24gT25Mb2dpbihVc2VyKSB7CiAgICAgICAgVGFyZ2V0TlMuVXBkYXRlSGVhZGVyKCk7CiAgICAgICAgUHJvY2Vzc0F2YXRhcnNPblBhZ2UoKTsKICAgICAgICBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMoKTsKICAgICAgICAvLyBSZWZyZXNoIGN1c3RvbWVyIGluZm8gd2lkZ2V0IHdpdGggTTM2NSBkYXRhCiAgICAgICAgUmVmcmVzaEN1c3RvbWVySW5mb1dpZGdldCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIE9uTG9nb3V0KCkgewogICAgICAgIFRhcmdldE5TLlVwZGF0ZUhlYWRlcigpOwoKICAgICAgICAvLyBSZXNldCBhdmF0YXJzIHRvIGZhbGxiYWNrCiAgICAgICAgJCgnLkNvbGxhYkF2YXRhcicpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJEF2YXRhciA9ICQodGhpcyk7CiAgICAgICAgICAgICRBdmF0YXIuZmluZCgnLkNvbGxhYkF2YXRhcl9faW1hZ2UnKS5yZW1vdmUoKTsKICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLnNob3coKTsKICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiUHJlc2VuY2UnKQogICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChpLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjLm1hdGNoKC9Db2xsYWJQcmVzZW5jZS0tXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZS0tdW5rbm93bicpOwogICAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkgfHwge30pKTsKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBBdXRvLUluaXRpYWxpemUKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAvLyBJbml0aWFsaXplIFVJIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gZW5zdXJlIENvbGxhYm9yYXRpb24gY29yZSBpcyByZWFkeQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiAmJiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkpIHsKICAgICAgICAgICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJLkluaXQoKTsKICAgICAgICB9CiAgICB9LCAxMDApOwp9KTsK</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.OwnerInfoPanel.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICogQGRlc2NyaXB0aW9uCiAqICAgICAgT3duZXIgSW5mbyBQYW5lbCBmb3IgQ29sbGFib3JhdGlvbiBBZGQtb24KICoKICogICAgICBEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlbGVjdGVkIHRpY2tldCBvd25lcjoKICogICAgICAtIEF2YXRhciB3aXRoIGhvdmVyLWNhcmQKICogICAgICAtIE91dC1vZi1PZmZpY2UgYmFubmVyIChpZiBhY3RpdmUpCiAqICAgICAgLSBGcmVlL0J1c3kgd2VlayBjYWxlbmRhciB2aWV3CiAqCiAqICAgICAgQXR0YWNoZXMgdG8gb3duZXIgZHJvcGRvd24gZmllbGRzIChOZXdPd25lcklELCBOZXdSZXNwb25zaWJsZUlELCBldGMuKQogKi8KdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIHZhciBDb2xsYWIgPSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb247CiAgICAvLyBOb3RlOiBDb2xsYWJVSSBpcyBhY2Nlc3NlZCBsYXppbHkgc2luY2UgVUkuanMgbG9hZHMgYWZ0ZXIgdGhpcyBmaWxlCgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnRseSBkaXNwbGF5ZWQgZW1haWwgaW4gYWN0aXZlIHBhbmVsCiAgICAgKi8KICAgIHZhciBBY3RpdmVFbWFpbCA9IG51bGw7CgogICAgLy8gTm90ZTogV2VlayBvZmZzZXQgaXMgbm93IHN0b3JlZCBwZXItY2FsZW5kYXIgYXMgZGF0YSBhdHRyaWJ1dGUgKGRhdGEtd2Vlay1vZmZzZXQpCiAgICAvLyB0byBzdXBwb3J0IG11bHRpcGxlIGNhbGVuZGFycyBvbiBzYW1lIHBhZ2UgKE93bmVyICsgUmVzcG9uc2libGUpCgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIE93bmVyIGRyb3Bkb3duIHNlbGVjdG9ycyB0byB3YXRjaAogICAgICogICAgICAgICAgICAgIE5vdGU6IFNvbWUgcGFnZXMgdXNlIE5ld1VzZXJJRCBpbnN0ZWFkIG9mIE5ld093bmVySUQgKGUuZy4sIEFnZW50VGlja2V0RW1haWwsIEFnZW50VGlja2V0UGhvbmUpCiAgICAgKi8KICAgIHZhciBPd25lclNlbGVjdG9ycyA9IFsKICAgICAgICAnI05ld093bmVySUQnLAogICAgICAgICcjTmV3VXNlcklEJywKICAgICAgICAnI05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICcjT3duZXJJRCcsCiAgICAgICAgJ3NlbGVjdFtuYW1lPSJOZXdPd25lcklEIl0nLAogICAgICAgICdzZWxlY3RbbmFtZT0iTmV3VXNlcklEIl0nLAogICAgICAgICdzZWxlY3RbbmFtZT0iT3duZXJJRCJdJywKICAgICAgICAnc2VsZWN0W25hbWU9Ik5ld1Jlc3BvbnNpYmxlSUQiXScKICAgIF07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIERheSBuYW1lcyAoR2VybWFuIGFiYnJldmlhdGlvbnMpCiAgICAgKi8KICAgIHZhciBEYXlOYW1lcyA9IFsnTW8nLCAnRGknLCAnTWknLCAnRG8nLCAnRnInLCAnU2EnLCAnU28nXTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uT3duZXJJbmZvUGFuZWwKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgb3duZXIgaW5mbyBwYW5lbCBsaXN0ZW5lcnMKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwoKICAgICAgICBpZiAoIUNvbmZpZy5FbmFibGVPd25lckluZm9QYW5lbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBCaW5kIHRvIG93bmVyIGRyb3Bkb3ducyBvbiBwYWdlCiAgICAgICAgQmluZE93bmVyRHJvcGRvd25zKCk7CgogICAgICAgIC8vIEFsc28gc2V0IHVwIGRvY3VtZW50LWxldmVsIElucHV0RmllbGQgZXZlbnQgbGlzdGVuZXIgZm9yIGR5bmFtaWNhbGx5IGxvYWRlZCBkcm9wZG93bnMKICAgICAgICBTZXR1cERvY3VtZW50TGV2ZWxMaXN0ZW5lcnMoKTsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBCaW5kIGNoYW5nZSBoYW5kbGVycyB0byBvd25lciBkcm9wZG93bnMKICAgICAqLwogICAgZnVuY3Rpb24gQmluZE93bmVyRHJvcGRvd25zKCkgewogICAgICAgICQoT3duZXJTZWxlY3RvcnMuam9pbignLCcpKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQmluZFNpbmdsZURyb3Bkb3duKCQodGhpcykpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgc2luZ2xlIGRyb3Bkb3duIGVsZW1lbnQKICAgICAqLwogICAgZnVuY3Rpb24gQmluZFNpbmdsZURyb3Bkb3duKCRTZWxlY3QpIHsKICAgICAgICBpZiAoISRTZWxlY3QgfHwgISRTZWxlY3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBib3VuZAogICAgICAgIGlmICgkU2VsZWN0LmRhdGEoJ2NvbGxhYi1vd25lci1ib3VuZCcpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFNlbGVjdC5kYXRhKCdjb2xsYWItb3duZXItYm91bmQnLCB0cnVlKTsKCiAgICAgICAgLy8gRmluZCB0aGUgY29udGFpbmVyIC0gbG9vayBmb3IgcGFyZW50IC5GaWVsZCBvciBJbnB1dEZpZWxkX0NvbnRhaW5lcgogICAgICAgIHZhciAkRmllbGRDb250YWluZXIgPSAkU2VsZWN0LmNsb3Nlc3QoJy5GaWVsZCcpOwogICAgICAgIGlmICghJEZpZWxkQ29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAkRmllbGRDb250YWluZXIgPSAkU2VsZWN0LmNsb3Nlc3QoJy5JbnB1dEZpZWxkX0NvbnRhaW5lcicpOwogICAgICAgIH0KICAgICAgICBpZiAoISRGaWVsZENvbnRhaW5lci5sZW5ndGgpIHsKICAgICAgICAgICAgJEZpZWxkQ29udGFpbmVyID0gJFNlbGVjdC5wYXJlbnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSBwYW5lbCBjb250YWluZXIgYWZ0ZXIgdGhlIGZpZWxkIGNvbnRhaW5lcgogICAgICAgIHZhciBDb250YWluZXJJRCA9ICdDb2xsYWJPd25lckluZm9QYW5lbF8nICsgJFNlbGVjdC5hdHRyKCdpZCcpOwogICAgICAgIHZhciAkQ29udGFpbmVyID0gJCgnIycgKyBDb250YWluZXJJRCk7CiAgICAgICAgaWYgKCEkQ29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAkQ29udGFpbmVyID0gJCgnPGRpdj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY29udGFpbmVyJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIENvbnRhaW5lcklEKTsKICAgICAgICAgICAgJEZpZWxkQ29udGFpbmVyLmFmdGVyKCRDb250YWluZXIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQmluZCBjaGFuZ2UgZXZlbnQgLSB3b3JrcyB3aXRoIGJvdGggbmF0aXZlIGFuZCBNb2Rlcm5pemUgZHJvcGRvd25zCiAgICAgICAgJFNlbGVjdC5vbignY2hhbmdlLmNvbGxhYk93bmVyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBPbk93bmVyQ2hhbmdlKCRTZWxlY3QsICRDb250YWluZXIpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgdXAgZG9jdW1lbnQtbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGZvciBkeW5hbWljYWxseSBsb2FkZWQgZHJvcGRvd25zCiAgICAgKiAgICAgICAgICAgICAgVGhpcyBjYXRjaGVzIGRyb3Bkb3ducyB0aGF0IGFyZSBsb2FkZWQgYWZ0ZXIgSW5pdCgpIHJ1bnMKICAgICAqLwogICAgZnVuY3Rpb24gU2V0dXBEb2N1bWVudExldmVsTGlzdGVuZXJzKCkgewogICAgICAgIC8vIEZpZWxkIElEcyB0byB3YXRjaCBmb3IKICAgICAgICB2YXIgT3duZXJGaWVsZElEcyA9IFsKICAgICAgICAgICAgJ05ld093bmVySUQnLAogICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICdPd25lcklEJwogICAgICAgIF07CgogICAgICAgIC8vIExpc3RlbiBmb3IgSW5wdXRGaWVsZCBldmVudHMgYXQgZG9jdW1lbnQgbGV2ZWwgKFpudW55IE1vZGVybml6ZSkKICAgICAgICAkKGRvY3VtZW50KS5vbignSW5wdXRGaWVsZFNlYXJjaENvbXBsZXRlLmNvbGxhYk93bmVyR2xvYmFsJywgZnVuY3Rpb24gKEV2ZW50LCBEYXRhKSB7CiAgICAgICAgICAgIGlmICghRGF0YSB8fCAhRGF0YS5GaWVsZElEKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gb3duZXItcmVsYXRlZCBmaWVsZAogICAgICAgICAgICBpZiAoT3duZXJGaWVsZElEcy5pbmRleE9mKERhdGEuRmllbGRJRCkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciAkU2VsZWN0ID0gJCgnIycgKyBEYXRhLkZpZWxkSUQpOwogICAgICAgICAgICBpZiAoISRTZWxlY3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZHJvcGRvd24gaXMgYm91bmQgKGZvciBkeW5hbWljYWxseSBsb2FkZWQgZmllbGRzKQogICAgICAgICAgICBCaW5kU2luZ2xlRHJvcGRvd24oJFNlbGVjdCk7CgogICAgICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIGNvbnRhaW5lcgogICAgICAgICAgICB2YXIgQ29udGFpbmVySUQgPSAnQ29sbGFiT3duZXJJbmZvUGFuZWxfJyArIERhdGEuRmllbGRJRDsKICAgICAgICAgICAgdmFyICRDb250YWluZXIgPSAkKCcjJyArIENvbnRhaW5lcklEKTsKCiAgICAgICAgICAgIGlmICgkQ29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgT25Pd25lckNoYW5nZSgkU2VsZWN0LCAkQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQWxzbyB0cnkgdG8gYmluZCBhZnRlciBzaG9ydCBkZWxheSBmb3IgQUpBWC1sb2FkZWQgY29udGVudAogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBCaW5kT3duZXJEcm9wZG93bnMoKTsKICAgICAgICB9LCA1MDApOwoKICAgICAgICAvLyBBbmQgYWZ0ZXIgbG9uZ2VyIGRlbGF5IGFzIGZhbGxiYWNrCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEJpbmRPd25lckRyb3Bkb3ducygpOwogICAgICAgIH0sIDE1MDApOwoKICAgICAgICAvLyBMaXN0ZW4gZm9yIEFKQVggbG9hZGVyIGNvbXBsZXRlIGV2ZW50cyAoWm51bnkgbG9hZHMgY29udGVudCB2aWEgQUpBWCkKICAgICAgICBpZiAoQ29yZS5BcHAgJiYgQ29yZS5BcHAuU3Vic2NyaWJlKSB7CiAgICAgICAgICAgIENvcmUuQXBwLlN1YnNjcmliZSgnQUpBWExvYWRlckNvbXBsZXRlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gUmUtY2hlY2sgZm9yIG93bmVyIGRyb3Bkb3ducyBhZnRlciBBSkFYIGNvbnRlbnQgbG9hZHMKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIEJpbmRPd25lckRyb3Bkb3ducygpOwogICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHNvIGxpc3RlbiBmb3IgSW5wdXRGaWVsZCBpbml0aWFsaXphdGlvbiBldmVudHMKICAgICAgICAkKGRvY3VtZW50KS5vbignSW5wdXRGaWVsZEluaXQuY29sbGFiT3duZXJHbG9iYWwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQmluZE93bmVyRHJvcGRvd25zKCk7CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBvd25lciBkcm9wZG93biBjaGFuZ2UKICAgICAqLwogICAgZnVuY3Rpb24gT25Pd25lckNoYW5nZSgkU2VsZWN0LCAkQ29udGFpbmVyKSB7CiAgICAgICAgdmFyIFVzZXJJRCA9ICRTZWxlY3QudmFsKCk7CgogICAgICAgIC8vIENsZWFyIHBhbmVsIGlmIG5vIHNlbGVjdGlvbgogICAgICAgIGlmICghVXNlcklEIHx8IFVzZXJJRCA9PT0gJycgfHwgVXNlcklEID09PSAnMCcgfHwgVXNlcklEID09PSAnLScpIHsKICAgICAgICAgICAgJENvbnRhaW5lci5lbXB0eSgpLmhpZGUoKTsKICAgICAgICAgICAgQWN0aXZlRW1haWwgPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93IGxvYWRpbmcgc3RhdGUKICAgICAgICAkQ29udGFpbmVyLmh0bWwoCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJPd25lckluZm9QYW5lbCBDb2xsYWJPd25lckluZm9QYW5lbC0tbG9hZGluZyI+JyArCiAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+ICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9hZGluZy4uLicpICsKICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICApLnNob3coKTsKCiAgICAgICAgLy8gR2V0IGFnZW50IGVtYWlsIGJ5IFVzZXJJRAogICAgICAgIEdldEFnZW50RW1haWwoVXNlcklEKS50aGVuKGZ1bmN0aW9uIChBZ2VudERhdGEpIHsKICAgICAgICAgICAgaWYgKCFBZ2VudERhdGEgfHwgIUFnZW50RGF0YS5lbWFpbCkgewogICAgICAgICAgICAgICAgJENvbnRhaW5lci5lbXB0eSgpLmhpZGUoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWN0aXZlRW1haWwgPSBBZ2VudERhdGEuZW1haWw7CgogICAgICAgICAgICAvLyBMb2FkIGFsbCBkYXRhIGluIHBhcmFsbGVsIHdpdGggaW5kaXZpZHVhbCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgb25lIGZhaWxpbmcgY2FsbCBkb2Vzbid0IGJyZWFrIHRoZSBlbnRpcmUgcGFuZWwKICAgICAgICAgICAgdmFyIFByb2ZpbGVQcm9taXNlID0gQ29sbGFiLkdldFByb2ZpbGUoQWdlbnREYXRhLmVtYWlsKQogICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkaXNwbGF5TmFtZTogQWdlbnREYXRhLmZ1bGxuYW1lLCBlbWFpbDogQWdlbnREYXRhLmVtYWlsIH07CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBGcmVlQnVzeVByb21pc2UgPSBMb2FkV2Vla0ZyZWVCdXN5KEFnZW50RGF0YS5lbWFpbCwgMCkKICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBQcmVzZW5jZVByb21pc2UgPSBDb2xsYWIuR2V0UHJlc2VuY2UoQWdlbnREYXRhLmVtYWlsKQogICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICd1bmtub3duJyB9OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1Byb2ZpbGVQcm9taXNlLCBGcmVlQnVzeVByb21pc2UsIFByZXNlbmNlUHJvbWlzZV0pCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgIHZhciBQcm9maWxlID0gUmVzdWx0c1swXTsKICAgICAgICAgICAgICAgICAgICB2YXIgRnJlZUJ1c3kgPSBSZXN1bHRzWzFdOwogICAgICAgICAgICAgICAgICAgIHZhciBQcmVzZW5jZSA9IFJlc3VsdHNbMl07CgogICAgICAgICAgICAgICAgICAgIC8vIERlcml2ZSBPT0YgZnJvbSBwcmVzZW5jZSBhY3Rpdml0eSAobm8gc2VwYXJhdGUgQVBJIGNhbGwgbmVlZGVkKQogICAgICAgICAgICAgICAgICAgIHZhciBPT0YgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChQcmVzZW5jZSAmJiBQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICAgICAgICAgICAgICBPT0YgPSBQcmVzZW5jZS5vdXRPZk9mZmljZSB8fCB7IHN0YXR1czogJ2Fsd2F5c0VuYWJsZWQnIH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBSZW5kZXJPd25lckluZm9QYW5lbCgkQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU6IFByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mT2ZmaWNlOiBPT0YsCiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVCdXN5OiBGcmVlQnVzeSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2U6IFByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogQWdlbnREYXRhLmVtYWlsLAogICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZTogQWdlbnREYXRhLmZ1bGxuYW1lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRDb250YWluZXIuZW1wdHkoKS5oaWRlKCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdldCBhZ2VudCBlbWFpbCBieSBVc2VySUQgdmlhIEFKQVgKICAgICAqLwogICAgZnVuY3Rpb24gR2V0QWdlbnRFbWFpbChVc2VySUQpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldEFnZW50QnlVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRDogVXNlcklECiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySUQ6IFJlc3BvbnNlLlVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBSZXNwb25zZS5FbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lOiBSZXNwb25zZS5GdWxsbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luOiBSZXNwb25zZS5Mb2dpbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gTG9hZCBmcmVlL2J1c3kgZGF0YSBmb3IgYSBzcGVjaWZpYyB3ZWVrCiAgICAgKi8KICAgIGZ1bmN0aW9uIExvYWRXZWVrRnJlZUJ1c3koRW1haWwsIFdlZWtPZmZzZXQpIHsKICAgICAgICAvLyBDYWxjdWxhdGUgd2VlayBib3VuZGFyaWVzIChNb25kYXkgdG8gU3VuZGF5KQogICAgICAgIHZhciBUb2RheSA9IG5ldyBEYXRlKCk7CiAgICAgICAgdmFyIERheU9mV2VlayA9IFRvZGF5LmdldERheSgpOwogICAgICAgIHZhciBNb25kYXkgPSBuZXcgRGF0ZShUb2RheSk7CiAgICAgICAgTW9uZGF5LnNldERhdGUoVG9kYXkuZ2V0RGF0ZSgpIC0gKERheU9mV2VlayA9PT0gMCA/IDYgOiBEYXlPZldlZWsgLSAxKSArIChXZWVrT2Zmc2V0ICogNykpOwogICAgICAgIE1vbmRheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKCiAgICAgICAgdmFyIFN1bmRheSA9IG5ldyBEYXRlKE1vbmRheSk7CiAgICAgICAgU3VuZGF5LnNldERhdGUoTW9uZGF5LmdldERhdGUoKSArIDYpOwogICAgICAgIFN1bmRheS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwoKICAgICAgICAvLyBDaGVjayBpZiBNZWV0aW5ncyBmZWF0dXJlIGlzIGVuYWJsZWQKICAgICAgICBpZiAoIUNvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdNZWV0aW5ncycpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiB1c2VyIGlzIGxvZ2dlZCBpbiAocmVxdWlyZWQgZm9yIEdyYXBoIEFQSSkKICAgICAgICBpZiAoIUNvbGxhYi5Jc0xvZ2dlZEluKCkpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIHByb3ZpZGVyIHN1cHBvcnRzIGZyZWUvYnVzeQogICAgICAgIGlmICghQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ2ZyZWVCdXN5JykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDb2xsYWIuR2V0RnJlZUJ1c3koW0VtYWlsXSwgTW9uZGF5LCBTdW5kYXkpCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChEYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHdlZWtTdGFydDogTW9uZGF5LAogICAgICAgICAgICAgICAgICAgIHdlZWtFbmQ6IFN1bmRheSwKICAgICAgICAgICAgICAgICAgICB3ZWVrT2Zmc2V0OiBXZWVrT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIGJ1c3lQZXJpb2RzOiBEYXRhW0VtYWlsXSB8fCBbXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUmVuZGVyIHRoZSBvd25lciBpbmZvIHBhbmVsCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlbmRlck93bmVySW5mb1BhbmVsKCRDb250YWluZXIsIERhdGEpIHsKICAgICAgICB2YXIgJFBhbmVsID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWwnKTsKCiAgICAgICAgLy8gPT09IEhlYWRlcjogQXZhdGFyICsgTmFtZSArIE9PRiBCYWRnZSArIFRvZ2dsZSA9PT0KICAgICAgICB2YXIgJEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19oZWFkZXInKTsKCiAgICAgICAgLy8gQXZhdGFyIHdpdGggaG92ZXItY2FyZCBmdW5jdGlvbmFsaXR5CiAgICAgICAgdmFyICRBdmF0YXJXcmFwID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2F2YXRhcicpOwogICAgICAgIHZhciBDb2xsYWJVSSA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSTsKICAgICAgICBpZiAoQ29sbGFiVUkgJiYgQ29sbGFiVUkuQ3JlYXRlQXZhdGFyKSB7CiAgICAgICAgICAgIHZhciAkQXZhdGFyID0gQ29sbGFiVUkuQ3JlYXRlQXZhdGFyKHsKICAgICAgICAgICAgICAgIGVtYWlsOiBEYXRhLmVtYWlsLAogICAgICAgICAgICAgICAgc2l6ZTogJ2xhcmdlJywKICAgICAgICAgICAgICAgIHNob3dQcmVzZW5jZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJEF2YXRhcldyYXAuYXBwZW5kKCRBdmF0YXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIFVJIG5vdCBsb2FkZWQKICAgICAgICAgICAgJEF2YXRhcldyYXAuaHRtbCgnPGRpdiBjbGFzcz0iQ29sbGFiQXZhdGFyIENvbGxhYkF2YXRhci0tbGFyZ2UiPjwvZGl2PicpOwogICAgICAgIH0KICAgICAgICAkSGVhZGVyLmFwcGVuZCgkQXZhdGFyV3JhcCk7CgogICAgICAgIC8vIEluZm8gY29udGFpbmVyIHdpdGggbmFtZSBhbmQgdGl0bGUKICAgICAgICB2YXIgJEluZm8gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faW5mbycpOwoKICAgICAgICAvLyBOYW1lIHJvdyAoanVzdCBuYW1lLCBiYWRnZXMgbW92ZWQgdG8gaGVhZGVyKQogICAgICAgIHZhciAkTmFtZVJvdyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19uYW1lUm93Jyk7CiAgICAgICAgdmFyIERpc3BsYXlOYW1lID0gRGF0YS5wcm9maWxlLmRpc3BsYXlOYW1lIHx8IERhdGEuZnVsbG5hbWUgfHwgRGF0YS5lbWFpbDsKICAgICAgICAkTmFtZVJvdy5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19uYW1lJykudGV4dChEaXNwbGF5TmFtZSkpOwogICAgICAgICRJbmZvLmFwcGVuZCgkTmFtZVJvdyk7CgogICAgICAgIGlmIChEYXRhLnByb2ZpbGUuam9iVGl0bGUpIHsKICAgICAgICAgICAgJEluZm8uYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX190aXRsZScpLnRleHQoRGF0YS5wcm9maWxlLmpvYlRpdGxlKSk7CiAgICAgICAgfQogICAgICAgICRIZWFkZXIuYXBwZW5kKCRJbmZvKTsKCiAgICAgICAgLy8gQWRkIHN0YXR1cyBiYWRnZSB0byBoZWFkZXIgLSBvbmx5IE9ORSBiYWRnZSAoT09GIGhhcyBwcmlvcml0eSBvdmVyIFdvcmtMb2NhdGlvbikKICAgICAgICAvLyBXaGVuIE9PRiBpcyBhY3RpdmUsIE1pY3Jvc29mdCBkb2Vzbid0IHJldHVybiB3b3JrTG9jYXRpb24gYW55d2F5CiAgICAgICAgaWYgKERhdGEub3V0T2ZPZmZpY2UpIHsKICAgICAgICAgICAgLy8gT09GIGFjdGl2ZTogU2hvdyAiQWJ3ZXNlbmQiIGJhZGdlIHVzaW5nIFdvcmtMb2NhdGlvbiBzdHlsZQogICAgICAgICAgICB2YXIgJE9PRkJhZGdlID0gQ3JlYXRlV29ya0xvY2F0aW9uQmFkZ2UoeyB0eXBlOiAndGltZU9mZicgfSk7CiAgICAgICAgICAgICRIZWFkZXIuYXBwZW5kKCRPT0ZCYWRnZSk7CiAgICAgICAgfSBlbHNlIGlmIChEYXRhLnByZXNlbmNlICYmIERhdGEucHJlc2VuY2Uud29ya0xvY2F0aW9uICYmIERhdGEucHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGUpIHsKICAgICAgICAgICAgdmFyICRXb3JrTG9jQmFkZ2UgPSBDcmVhdGVXb3JrTG9jYXRpb25CYWRnZShEYXRhLnByZXNlbmNlLndvcmtMb2NhdGlvbik7CiAgICAgICAgICAgICRIZWFkZXIuYXBwZW5kKCRXb3JrTG9jQmFkZ2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsZW5kYXIgdG9nZ2xlIGJ1dHRvbiAob25seSBpZiBmcmVlQnVzeSBkYXRhIGF2YWlsYWJsZSkKICAgICAgICBpZiAoRGF0YS5mcmVlQnVzeSkgewogICAgICAgICAgICB2YXIgJFRvZ2dsZSA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX3RvZ2dsZScpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RvZ2dsZSBjYWxlbmRhcicpKQogICAgICAgICAgICAgICAgLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jYXJldC11cCI+PC9pPicpOwogICAgICAgICAgICAkSGVhZGVyLmFwcGVuZCgkVG9nZ2xlKTsKICAgICAgICB9CgogICAgICAgICRQYW5lbC5hcHBlbmQoJEhlYWRlcik7CgogICAgICAgIC8vID09PSBXZWVrIENhbGVuZGFyIChjb2xsYXBzaWJsZSkgPT09CiAgICAgICAgaWYgKERhdGEuZnJlZUJ1c3kpIHsKICAgICAgICAgICAgdmFyICRDYWxlbmRhcldyYXBwZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY2FsZW5kYXJXcmFwcGVyJyk7CiAgICAgICAgICAgIHZhciAkQ2FsZW5kYXIgPSBDcmVhdGVXZWVrQ2FsZW5kYXIoRGF0YS5mcmVlQnVzeSwgRGF0YS5lbWFpbCk7CiAgICAgICAgICAgICRDYWxlbmRhcldyYXBwZXIuYXBwZW5kKCRDYWxlbmRhcik7CiAgICAgICAgICAgICRQYW5lbC5hcHBlbmQoJENhbGVuZGFyV3JhcHBlcik7CgogICAgICAgICAgICAvLyBUb2dnbGUgaGFuZGxlciAtIHJvdGF0ZXMgYXJyb3cgdmlhIENTUyBjbGFzcwogICAgICAgICAgICAkUGFuZWwuZmluZCgnLkNvbGxhYk93bmVySW5mb1BhbmVsX190b2dnbGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJEJ0biA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICB2YXIgJFdyYXBwZXIgPSAkUGFuZWwuZmluZCgnLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxlbmRhcldyYXBwZXInKTsKICAgICAgICAgICAgICAgICRXcmFwcGVyLnRvZ2dsZUNsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY2FsZW5kYXJXcmFwcGVyLS1jb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICRCdG4udG9nZ2xlQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX190b2dnbGUtLWNvbGxhcHNlZCcpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgICRDb250YWluZXIuZW1wdHkoKS5hcHBlbmQoJFBhbmVsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIFdvcmsgTG9jYXRpb24gYmFkZ2UgKG9mZmljZS9yZW1vdGUvdGltZU9mZikKICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlV29ya0xvY2F0aW9uQmFkZ2UoV29ya0xvY2F0aW9uKSB7CiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkxhYmVscyA9IHsKICAgICAgICAgICAgJ29mZmljZSc6ICdPZmZpY2UnLAogICAgICAgICAgICAncmVtb3RlJzogJ1JlbW90ZScsCiAgICAgICAgICAgICd0aW1lT2ZmJzogJ1RpbWUgb2ZmJwogICAgICAgIH07CiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkljb25zID0gewogICAgICAgICAgICAnb2ZmaWNlJzogJ2ZhLWJ1aWxkaW5nJywKICAgICAgICAgICAgJ3JlbW90ZSc6ICdmYS1ob21lJywKICAgICAgICAgICAgJ3RpbWVPZmYnOiAnZmEtc2lnbi1vdXQnCiAgICAgICAgfTsKCiAgICAgICAgdmFyIExvY2F0aW9uVHlwZSA9IFdvcmtMb2NhdGlvbi50eXBlIHx8IFdvcmtMb2NhdGlvbjsKICAgICAgICB2YXIgTG9jYXRpb25MYWJlbCA9IFdvcmtMb2NhdGlvbkxhYmVsc1tMb2NhdGlvblR5cGVdIHx8IExvY2F0aW9uVHlwZTsKICAgICAgICB2YXIgTG9jYXRpb25JY29uID0gV29ya0xvY2F0aW9uSWNvbnNbTG9jYXRpb25UeXBlXSB8fCAnZmEtbWFwLW1hcmtlcic7CgogICAgICAgIHZhciAkQmFkZ2UgPSAkKCc8c3Bhbj4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYldvcmtMb2NhdGlvbiBDb2xsYWJXb3JrTG9jYXRpb24tLScgKyBMb2NhdGlvblR5cGUpCiAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhICcgKyBMb2NhdGlvbkljb24pKQogICAgICAgICAgICAuYXBwZW5kKCcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKExvY2F0aW9uTGFiZWwpKTsKCiAgICAgICAgcmV0dXJuICRCYWRnZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGRldGFpbGVkIHdlZWsgY2FsZW5kYXIgdmlldyB3aXRoIGhhbGYtaG91cmx5IGRpc3BsYXkgKDQ4IGJsb2NrcyBwZXIgZGF5KQogICAgICogICAgICAgICAgICAgIEZlYXR1cmVzOiBTY3JvbGxhYmxlIHRpbWVsaW5lLCBzdGlja3kgZGF5IGxhYmVscywgYXV0by1zY3JvbGwgdG8gN2FtCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZVdlZWtDYWxlbmRhcihGcmVlQnVzeSwgRW1haWwsIFdlZWtPZmZzZXQpIHsKICAgICAgICB2YXIgJENhbGVuZGFyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbGVuZGFyJyk7CgogICAgICAgIC8vIFN0b3JlIHdlZWsgb2Zmc2V0IHBlciBjYWxlbmRhciAoc3VwcG9ydHMgbXVsdGlwbGUgY2FsZW5kYXJzIG9uIHNhbWUgcGFnZSkKICAgICAgICAvLyBVc2UgcHJvdmlkZWQgV2Vla09mZnNldCBvciBkZWZhdWx0IHRvIDAKICAgICAgICBXZWVrT2Zmc2V0ID0gV2Vla09mZnNldCB8fCAwOwogICAgICAgICRDYWxlbmRhci5kYXRhKCd3ZWVrT2Zmc2V0JywgV2Vla09mZnNldCk7CgogICAgICAgIC8vIEhlYWRlciB3aXRoIG5hdmlnYXRpb24KICAgICAgICB2YXIgJENhbEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19jYWxIZWFkZXInKTsKICAgICAgICB2YXIgJFByZXZCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbE5hdicpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQcmV2aW91cyB3ZWVrJykpCiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi1sZWZ0Ij48L2k+Jyk7CgogICAgICAgIC8vIERpc2FibGUgcHJldmlvdXMgYnV0dG9uIGlmIG9uIGN1cnJlbnQgd2VlayAoZG9uJ3QgYWxsb3cgbmF2aWdhdGluZyB0byBwYXN0KQogICAgICAgIGlmIChXZWVrT2Zmc2V0IDw9IDApIHsKICAgICAgICAgICAgJFByZXZCdG4ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIHZhciAkTmV4dEJ0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY2FsTmF2JykKICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05leHQgd2VlaycpKQogICAgICAgICAgICAuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tcmlnaHQiPjwvaT4nKTsKICAgICAgICB2YXIgJFdlZWtMYWJlbCA9ICQoJzxzcGFuPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbExhYmVsJykKICAgICAgICAgICAgLnRleHQoRm9ybWF0V2Vla0xhYmVsKEZyZWVCdXN5LndlZWtTdGFydCwgRnJlZUJ1c3kud2Vla0VuZCkpOwoKICAgICAgICAkQ2FsSGVhZGVyLmFwcGVuZCgkUHJldkJ0biwgJFdlZWtMYWJlbCwgJE5leHRCdG4pOwogICAgICAgICRDYWxlbmRhci5hcHBlbmQoJENhbEhlYWRlcik7CgogICAgICAgIC8vIE1haW4gY2FsZW5kYXIgYm9keSB3aXRoIHN0aWNreSBkYXkgbGFiZWxzIGFuZCBzY3JvbGxhYmxlIHRpbWVsaW5lCiAgICAgICAgdmFyICRDYWxCb2R5ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbEJvZHknKTsKCiAgICAgICAgLy8gRGF5IGxhYmVscyBjb2x1bW4gKHN0aWNreSBsZWZ0IHNpZGUpCiAgICAgICAgdmFyICREYXlMYWJlbHNDb2wgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWxzQ29sJyk7CiAgICAgICAgLy8gRW1wdHkgY2VsbCBmb3IgaG91ciBsYWJlbHMgcm93IGFsaWdubWVudAogICAgICAgICREYXlMYWJlbHNDb2wuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbEhlYWRlcicpKTsKCiAgICAgICAgdmFyIFRvZGF5ID0gbmV3IERhdGUoKTsKICAgICAgICBUb2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKCiAgICAgICAgLy8gSW5uZXIgY29udGFpbmVyIGZvciBkYXkgbGFiZWxzIHdpdGggZ2FwCiAgICAgICAgdmFyICREYXlMYWJlbHNJbm5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbHNJbm5lcicpOwoKICAgICAgICAvLyBDcmVhdGUgZGF5IGxhYmVscwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgICAgICAgIHZhciBEYXlEYXRlID0gbmV3IERhdGUoRnJlZUJ1c3kud2Vla1N0YXJ0KTsKICAgICAgICAgICAgRGF5RGF0ZS5zZXREYXRlKEZyZWVCdXN5LndlZWtTdGFydC5nZXREYXRlKCkgKyBpKTsKICAgICAgICAgICAgdmFyIElzVG9kYXkgPSBJc1NhbWVEYXkoRGF5RGF0ZSwgVG9kYXkpOwogICAgICAgICAgICB2YXIgSXNXZWVrZW5kID0gKGkgPj0gNSk7CgogICAgICAgICAgICB2YXIgJERheUxhYmVsID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsJyk7CiAgICAgICAgICAgIGlmIChJc1RvZGF5KSB7CiAgICAgICAgICAgICAgICAkRGF5TGFiZWwuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0tdG9kYXknKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoSXNXZWVrZW5kKSB7CiAgICAgICAgICAgICAgICAkRGF5TGFiZWwuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0td2Vla2VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXlMYWJlbC5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlOYW1lJykudGV4dChEYXlOYW1lc1tpXSkpOwogICAgICAgICAgICB2YXIgZGF5TnVtID0gRGF5RGF0ZS5nZXREYXRlKCk7CiAgICAgICAgICAgICREYXlMYWJlbC5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlOdW0nKS50ZXh0KGRheU51bSA8IDEwID8gJzAnICsgZGF5TnVtIDogZGF5TnVtKSk7CiAgICAgICAgICAgICREYXlMYWJlbHNJbm5lci5hcHBlbmQoJERheUxhYmVsKTsKICAgICAgICB9CiAgICAgICAgJERheUxhYmVsc0NvbC5hcHBlbmQoJERheUxhYmVsc0lubmVyKTsKICAgICAgICAkQ2FsQm9keS5hcHBlbmQoJERheUxhYmVsc0NvbCk7CgogICAgICAgIC8vIFNjcm9sbGFibGUgdGltZWxpbmUgYXJlYQogICAgICAgIHZhciAkVGltZWxpbmVTY3JvbGwgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fdGltZWxpbmVTY3JvbGwnKTsKCiAgICAgICAgLy8gSG91ciBsYWJlbHMgcm93ICg0OCBoYWxmLWhvdXIgc2xvdHMpCiAgICAgICAgdmFyICRIb3VyTGFiZWxzID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJMYWJlbHNSb3cnKTsKICAgICAgICBmb3IgKHZhciBzbG90ID0gMDsgc2xvdCA8IDQ4OyBzbG90KyspIHsKICAgICAgICAgICAgdmFyICRIb3VyTGFiZWwgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsJyk7CiAgICAgICAgICAgIC8vIEFkZCBib3JkZXIgY2xhc3MgYXQgZnVsbCBob3VycyAoZXZlcnkgMiBzbG90cykgdG8gYWxpZ24gd2l0aCBibG9ja3MKICAgICAgICAgICAgaWYgKHNsb3QgJSAyID09PSAwKSB7CiAgICAgICAgICAgICAgICAkSG91ckxhYmVsLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsLS1ob3VyU3RhcnQnKTsKICAgICAgICAgICAgICAgIHZhciBob3VyID0gc2xvdCAvIDI7CiAgICAgICAgICAgICAgICAkSG91ckxhYmVsLnRleHQoaG91ciA8IDEwID8gJzAnICsgaG91ciA6IGhvdXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRIb3VyTGFiZWxzLmFwcGVuZCgkSG91ckxhYmVsKTsKICAgICAgICB9CiAgICAgICAgJFRpbWVsaW5lU2Nyb2xsLmFwcGVuZCgkSG91ckxhYmVscyk7CgogICAgICAgIC8vIFdlZWsgZ3JpZCAtIG9uZSByb3cgcGVyIGRheQogICAgICAgIHZhciAkR3JpZCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlzR3JpZCcpOwoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDc7IGkrKykgewogICAgICAgICAgICB2YXIgRGF5RGF0ZSA9IG5ldyBEYXRlKEZyZWVCdXN5LndlZWtTdGFydCk7CiAgICAgICAgICAgIERheURhdGUuc2V0RGF0ZShGcmVlQnVzeS53ZWVrU3RhcnQuZ2V0RGF0ZSgpICsgaSk7CiAgICAgICAgICAgIHZhciBJc1dlZWtlbmQgPSAoaSA+PSA1KTsKCiAgICAgICAgICAgIHZhciAkUm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdycpOwogICAgICAgICAgICBpZiAoSXNXZWVrZW5kKSB7CiAgICAgICAgICAgICAgICAkUm93LmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93LS13ZWVrZW5kJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIDQ4IGhhbGYtaG91ciBibG9ja3MKICAgICAgICAgICAgdmFyIERheUJ1c3kgPSBHZXRCdXN5QmxvY2tzRm9yRGF5KEZyZWVCdXN5LmJ1c3lQZXJpb2RzLCBEYXlEYXRlKTsKICAgICAgICAgICAgdmFyIEhhbGZIb3VybHlCdXN5ID0gR2V0SGFsZkhvdXJseUJ1c3lTdGF0dXMoRGF5QnVzeSwgRGF5RGF0ZSk7CgogICAgICAgICAgICBmb3IgKHZhciBzbG90ID0gMDsgc2xvdCA8IDQ4OyBzbG90KyspIHsKICAgICAgICAgICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihzbG90IC8gMik7CiAgICAgICAgICAgICAgICB2YXIgaXNGaXJzdEhhbGYgPSAoc2xvdCAlIDIgPT09IDApOwogICAgICAgICAgICAgICAgdmFyICRIb3VyQmxvY2sgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrJyk7CgogICAgICAgICAgICAgICAgLy8gTWFyayB3b3JrIGhvdXJzICg4LTE4KQogICAgICAgICAgICAgICAgaWYgKGhvdXIgPj0gOCAmJiBob3VyIDwgMTgpIHsKICAgICAgICAgICAgICAgICAgICAkSG91ckJsb2NrLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS13b3JrSG91cnMnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBBZGQgaG91ciBzZXBhcmF0b3IgY2xhc3MgZm9yIGZpcnN0IGhhbGYgb2YgZWFjaCBob3VyCiAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdEhhbGYpIHsKICAgICAgICAgICAgICAgICAgICAkSG91ckJsb2NrLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS1ob3VyU3RhcnQnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgdGltZUxhYmVsID0gaG91ciArICc6JyArIChpc0ZpcnN0SGFsZiA/ICcwMCcgOiAnMzAnKTsKICAgICAgICAgICAgICAgIGlmIChIYWxmSG91cmx5QnVzeVtzbG90XSkgewogICAgICAgICAgICAgICAgICAgICRIb3VyQmxvY2suYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2stLWJ1c3knKTsKICAgICAgICAgICAgICAgICAgICAkSG91ckJsb2NrLmF0dHIoJ3RpdGxlJywgdGltZUxhYmVsICsgJyAtICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQnVzeScpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhvdXJCbG9jay5hdHRyKCd0aXRsZScsIHRpbWVMYWJlbCArICcgLSAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyZWUnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUm93LmFwcGVuZCgkSG91ckJsb2NrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdyaWQuYXBwZW5kKCRSb3cpOwogICAgICAgIH0KCiAgICAgICAgJFRpbWVsaW5lU2Nyb2xsLmFwcGVuZCgkR3JpZCk7CiAgICAgICAgJENhbEJvZHkuYXBwZW5kKCRUaW1lbGluZVNjcm9sbCk7CiAgICAgICAgJENhbGVuZGFyLmFwcGVuZCgkQ2FsQm9keSk7CgogICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRvIDdhbSBhZnRlciByZW5kZXJpbmcgKHNsb3QgMTQgPSA3OjAwKQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgQmxvY2tXaWR0aCA9IDE0OyAvLyBXaWR0aCBvZiBlYWNoIGhhbGYtaG91ciBibG9jayBpbiBweAogICAgICAgICAgICB2YXIgU2Nyb2xsVG8gPSAxNCAqIEJsb2NrV2lkdGg7IC8vIDdhbSA9IHNsb3QgMTQKICAgICAgICAgICAgJFRpbWVsaW5lU2Nyb2xsLnNjcm9sbExlZnQoU2Nyb2xsVG8pOwogICAgICAgIH0sIDUwKTsKCiAgICAgICAgLy8gTmF2aWdhdGlvbiBoYW5kbGVycyAodXNlIHBlci1jYWxlbmRhciB3ZWVrT2Zmc2V0KQogICAgICAgICRQcmV2QnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFdlZWtPZmZzZXQgPSAkQ2FsZW5kYXIuZGF0YSgnd2Vla09mZnNldCcpIHx8IDA7CiAgICAgICAgICAgIGlmIChXZWVrT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyLmRhdGEoJ3dlZWtPZmZzZXQnLCBXZWVrT2Zmc2V0IC0gMSk7CiAgICAgICAgICAgICAgICBOYXZpZ2F0ZVdlZWsoRW1haWwsICRDYWxlbmRhcik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJE5leHRCdG4ub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgV2Vla09mZnNldCA9ICRDYWxlbmRhci5kYXRhKCd3ZWVrT2Zmc2V0JykgfHwgMDsKICAgICAgICAgICAgJENhbGVuZGFyLmRhdGEoJ3dlZWtPZmZzZXQnLCBXZWVrT2Zmc2V0ICsgMSk7CiAgICAgICAgICAgIE5hdmlnYXRlV2VlayhFbWFpbCwgJENhbGVuZGFyKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuICRDYWxlbmRhcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGJ1c3kgc3RhdHVzIGZvciBlYWNoIGhhbGYtaG91ciBzbG90IG9mIGEgZGF5ICgwLTQ3KQogICAgICogICAgICAgICAgICAgIFNsb3QgMCA9IDAwOjAwLTAwOjMwLCBTbG90IDEgPSAwMDozMC0wMTowMCwgZXRjLgogICAgICovCiAgICBmdW5jdGlvbiBHZXRIYWxmSG91cmx5QnVzeVN0YXR1cyhCdXN5UGVyaW9kcywgRGF5RGF0ZSkgewogICAgICAgIHZhciBIYWxmSG91cmx5U3RhdHVzID0gW107CiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCA0ODsgcysrKSB7CiAgICAgICAgICAgIEhhbGZIb3VybHlTdGF0dXNbc10gPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIEJ1c3lQZXJpb2RzLmZvckVhY2goZnVuY3Rpb24gKFBlcmlvZCkgewogICAgICAgICAgICB2YXIgU3RhcnQgPSBuZXcgRGF0ZShQZXJpb2Quc3RhcnQpOwogICAgICAgICAgICB2YXIgRW5kID0gbmV3IERhdGUoUGVyaW9kLmVuZCk7CgogICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG92ZXJsYXAgd2l0aCB0aGlzIGRheQogICAgICAgICAgICB2YXIgRGF5U3RhcnQgPSBuZXcgRGF0ZShEYXlEYXRlKTsKICAgICAgICAgICAgRGF5U3RhcnQuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgIHZhciBEYXlFbmQgPSBuZXcgRGF0ZShEYXlEYXRlKTsKICAgICAgICAgICAgRGF5RW5kLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CgogICAgICAgICAgICAvLyBHZXQgZWZmZWN0aXZlIHN0YXJ0L2VuZCB3aXRoaW4gdGhpcyBkYXkKICAgICAgICAgICAgdmFyIEVmZmVjdGl2ZVN0YXJ0ID0gU3RhcnQgPCBEYXlTdGFydCA/IERheVN0YXJ0IDogU3RhcnQ7CiAgICAgICAgICAgIHZhciBFZmZlY3RpdmVFbmQgPSBFbmQgPiBEYXlFbmQgPyBEYXlFbmQgOiBFbmQ7CgogICAgICAgICAgICBpZiAoRWZmZWN0aXZlU3RhcnQgPD0gRWZmZWN0aXZlRW5kKSB7CiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGhhbGYtaG91ciBzbG90cwogICAgICAgICAgICAgICAgdmFyIFN0YXJ0U2xvdCA9IEVmZmVjdGl2ZVN0YXJ0LmdldEhvdXJzKCkgKiAyICsgKEVmZmVjdGl2ZVN0YXJ0LmdldE1pbnV0ZXMoKSA+PSAzMCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIHZhciBFbmRTbG90ID0gRWZmZWN0aXZlRW5kLmdldEhvdXJzKCkgKiAyICsgKEVmZmVjdGl2ZUVuZC5nZXRNaW51dGVzKCkgPiAzMCA/IDEgOiAwKTsKCiAgICAgICAgICAgICAgICAvLyBJZiBlbmQgaXMgZXhhY3RseSBvbiBhIGhhbGYtaG91ciBib3VuZGFyeSwgZG9uJ3QgbWFyayB0aGF0IHNsb3QKICAgICAgICAgICAgICAgIGlmIChFZmZlY3RpdmVFbmQuZ2V0TWludXRlcygpID09PSAwICYmIEVmZmVjdGl2ZUVuZC5nZXRTZWNvbmRzKCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBFbmRTbG90ID0gTWF0aC5tYXgoMCwgRW5kU2xvdCAtIDEpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFZmZlY3RpdmVFbmQuZ2V0TWludXRlcygpID09PSAzMCAmJiBFZmZlY3RpdmVFbmQuZ2V0U2Vjb25kcygpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgRW5kU2xvdCA9IE1hdGgubWF4KDAsIEVuZFNsb3QgLSAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBNYXJrIGhhbGYtaG91ciBzbG90cyBhcyBidXN5CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gU3RhcnRTbG90OyBzIDw9IEVuZFNsb3QgJiYgcyA8IDQ4OyBzKyspIHsKICAgICAgICAgICAgICAgICAgICBIYWxmSG91cmx5U3RhdHVzW3NdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gSGFsZkhvdXJseVN0YXR1czsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gTmF2aWdhdGUgdG8gZGlmZmVyZW50IHdlZWsKICAgICAqLwogICAgZnVuY3Rpb24gTmF2aWdhdGVXZWVrKEVtYWlsLCAkQ2FsZW5kYXIpIHsKICAgICAgICAvLyBHZXQgd2VlayBvZmZzZXQgZnJvbSB0aGlzIHNwZWNpZmljIGNhbGVuZGFyCiAgICAgICAgdmFyIFdlZWtPZmZzZXQgPSAkQ2FsZW5kYXIuZGF0YSgnd2Vla09mZnNldCcpIHx8IDA7CgogICAgICAgIC8vIFNob3cgbG9hZGluZyBzdGF0ZSBvbiBncmlkCiAgICAgICAgJENhbGVuZGFyLmZpbmQoJy5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5c0dyaWQnKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nJyk7CgogICAgICAgIC8vIEZldGNoIG5ldyBkYXRhCiAgICAgICAgTG9hZFdlZWtGcmVlQnVzeShFbWFpbCwgV2Vla09mZnNldCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKEZyZWVCdXN5KSB7CiAgICAgICAgICAgICAgICBpZiAoIUZyZWVCdXN5KSB7CiAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyLmZpbmQoJy5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5c0dyaWQnKS5yZW1vdmVDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlLXJlbmRlciBjYWxlbmRhciB3aXRoIGNvcnJlY3Qgd2VlayBvZmZzZXQKICAgICAgICAgICAgICAgIHZhciAkTmV3Q2FsZW5kYXIgPSBDcmVhdGVXZWVrQ2FsZW5kYXIoRnJlZUJ1c3ksIEVtYWlsLCBXZWVrT2Zmc2V0KTsKICAgICAgICAgICAgICAgICRDYWxlbmRhci5yZXBsYWNlV2l0aCgkTmV3Q2FsZW5kYXIpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyLmZpbmQoJy5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5c0dyaWQnKS5yZW1vdmVDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nJyk7CiAgICAgICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGVscGVyIEZ1bmN0aW9ucwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFN0cmlwIEhUTUwgdGFncyBmcm9tIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBTdHJpcEhUTUwoSFRNTCkgewogICAgICAgIHZhciBUZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgVGVtcC5pbm5lckhUTUwgPSBIVE1MOwogICAgICAgIHJldHVybiBUZW1wLnRleHRDb250ZW50IHx8IFRlbXAuaW5uZXJUZXh0IHx8ICcnOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGb3JtYXQgZGF0ZSBhcyBERC5NTS5ZWVlZCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZvcm1hdERhdGUoRGF0ZU9iaikgewogICAgICAgIHZhciBEYXkgPSBTdHJpbmcoRGF0ZU9iai5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIE1vbnRoID0gU3RyaW5nKERhdGVPYmouZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIFllYXIgPSBEYXRlT2JqLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgcmV0dXJuIERheSArICcuJyArIE1vbnRoICsgJy4nICsgWWVhcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0IHdlZWsgbGFiZWwgKERELk1NLiAtIERELk1NLllZWVkgfCBLVyBYWCkKICAgICAqLwogICAgZnVuY3Rpb24gRm9ybWF0V2Vla0xhYmVsKFN0YXJ0LCBFbmQpIHsKICAgICAgICB2YXIgU3RhcnREYXkgPSBTdHJpbmcoU3RhcnQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBTdGFydE1vbnRoID0gU3RyaW5nKFN0YXJ0LmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBFbmREYXkgPSBTdHJpbmcoRW5kLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgRW5kTW9udGggPSBTdHJpbmcoRW5kLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBFbmRZZWFyID0gRW5kLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgdmFyIFdlZWtOdW1iZXIgPSBHZXRJU09XZWVrTnVtYmVyKFN0YXJ0KTsKICAgICAgICByZXR1cm4gU3RhcnREYXkgKyAnLicgKyBTdGFydE1vbnRoICsgJy4gLSAnICsgRW5kRGF5ICsgJy4nICsgRW5kTW9udGggKyAnLicgKyBFbmRZZWFyICsgJyB8IEtXICcgKyBXZWVrTnVtYmVyOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgSVNPIHdlZWsgbnVtYmVyIGZvciBhIGRhdGUKICAgICAqLwogICAgZnVuY3Rpb24gR2V0SVNPV2Vla051bWJlcihEYXRlT2JqKSB7CiAgICAgICAgdmFyIFRlbXBEYXRlID0gbmV3IERhdGUoRGF0ZU9iai5nZXRUaW1lKCkpOwogICAgICAgIFRlbXBEYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIC8vIFRodXJzZGF5IGluIGN1cnJlbnQgd2VlayBkZWNpZGVzIHRoZSB5ZWFyCiAgICAgICAgVGVtcERhdGUuc2V0RGF0ZShUZW1wRGF0ZS5nZXREYXRlKCkgKyAzIC0gKFRlbXBEYXRlLmdldERheSgpICsgNikgJSA3KTsKICAgICAgICAvLyBKYW51YXJ5IDQgaXMgYWx3YXlzIGluIHdlZWsgMQogICAgICAgIHZhciBXZWVrMSA9IG5ldyBEYXRlKFRlbXBEYXRlLmdldEZ1bGxZZWFyKCksIDAsIDQpOwogICAgICAgIC8vIEFkanVzdCB0byBUaHVyc2RheSBpbiB3ZWVrIDEgYW5kIGNvdW50IG51bWJlciBvZiB3ZWVrcyBmcm9tIGRhdGUgdG8gd2VlazEKICAgICAgICByZXR1cm4gMSArIE1hdGgucm91bmQoKChUZW1wRGF0ZS5nZXRUaW1lKCkgLSBXZWVrMS5nZXRUaW1lKCkpIC8gODY0MDAwMDAgLSAzICsgKFdlZWsxLmdldERheSgpICsgNikgJSA3KSAvIDcpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiB0d28gZGF0ZXMgYXJlIHRoZSBzYW1lIGRheQogICAgICovCiAgICBmdW5jdGlvbiBJc1NhbWVEYXkoRGF0ZTEsIERhdGUyKSB7CiAgICAgICAgcmV0dXJuIERhdGUxLmdldEZ1bGxZZWFyKCkgPT09IERhdGUyLmdldEZ1bGxZZWFyKCkgJiYKICAgICAgICAgICAgICAgRGF0ZTEuZ2V0TW9udGgoKSA9PT0gRGF0ZTIuZ2V0TW9udGgoKSAmJgogICAgICAgICAgICAgICBEYXRlMS5nZXREYXRlKCkgPT09IERhdGUyLmdldERhdGUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGJ1c3kgYmxvY2tzIHRoYXQgb3ZlcmxhcCB3aXRoIGEgc3BlY2lmaWMgZGF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldEJ1c3lCbG9ja3NGb3JEYXkoQnVzeVBlcmlvZHMsIERheURhdGUpIHsKICAgICAgICB2YXIgRGF5U3RhcnQgPSBuZXcgRGF0ZShEYXlEYXRlKTsKICAgICAgICBEYXlTdGFydC5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICB2YXIgRGF5RW5kID0gbmV3IERhdGUoRGF5RGF0ZSk7CiAgICAgICAgRGF5RW5kLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CgogICAgICAgIHJldHVybiBCdXN5UGVyaW9kcy5maWx0ZXIoZnVuY3Rpb24gKFBlcmlvZCkgewogICAgICAgICAgICB2YXIgU3RhcnQgPSBuZXcgRGF0ZShQZXJpb2Quc3RhcnQpOwogICAgICAgICAgICB2YXIgRW5kID0gbmV3IERhdGUoUGVyaW9kLmVuZCk7CiAgICAgICAgICAgIHJldHVybiBTdGFydCA8IERheUVuZCAmJiBFbmQgPiBEYXlTdGFydDsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ2F0ZWdvcml6ZSBidXN5IHBlcmlvZHMgaW50byBtb3JuaW5nL2FmdGVybm9vbi9ldmVuaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhdGVnb3JpemVCdXN5UGVyaW9kcyhCdXN5UGVyaW9kcywgRGF5RGF0ZSkgewogICAgICAgIHZhciBSZXN1bHQgPSB7IG1vcm5pbmc6IGZhbHNlLCBhZnRlcm5vb246IGZhbHNlLCBldmVuaW5nOiBmYWxzZSB9OwoKICAgICAgICBCdXN5UGVyaW9kcy5mb3JFYWNoKGZ1bmN0aW9uIChQZXJpb2QpIHsKICAgICAgICAgICAgdmFyIFN0YXJ0ID0gbmV3IERhdGUoUGVyaW9kLnN0YXJ0KTsKICAgICAgICAgICAgdmFyIEVuZCA9IG5ldyBEYXRlKFBlcmlvZC5lbmQpOwoKICAgICAgICAgICAgLy8gR2V0IGhvdXJzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkYXkKICAgICAgICAgICAgdmFyIERheVN0YXJ0ID0gbmV3IERhdGUoRGF5RGF0ZSk7CiAgICAgICAgICAgIERheVN0YXJ0LnNldEhvdXJzKDAsIDAsIDAsIDApOwoKICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGVmZmVjdGl2ZSBzdGFydC9lbmQgaG91cnMgZm9yIHRoaXMgZGF5CiAgICAgICAgICAgIHZhciBFZmZlY3RpdmVTdGFydCA9IFN0YXJ0IDwgRGF5U3RhcnQgPyAwIDogU3RhcnQuZ2V0SG91cnMoKTsKICAgICAgICAgICAgdmFyIEVmZmVjdGl2ZUVuZCA9IEVuZC5nZXRIb3VycygpIHx8IDI0OwoKICAgICAgICAgICAgLy8gTW9ybmluZzogNi0xMiwgQWZ0ZXJub29uOiAxMi0xOCwgRXZlbmluZzogMTgtMjIKICAgICAgICAgICAgaWYgKEVmZmVjdGl2ZVN0YXJ0IDwgMTIgJiYgRWZmZWN0aXZlRW5kID4gNikgewogICAgICAgICAgICAgICAgUmVzdWx0Lm1vcm5pbmcgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChFZmZlY3RpdmVTdGFydCA8IDE4ICYmIEVmZmVjdGl2ZUVuZCA+IDEyKSB7CiAgICAgICAgICAgICAgICBSZXN1bHQuYWZ0ZXJub29uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoRWZmZWN0aXZlU3RhcnQgPCAyMiAmJiBFZmZlY3RpdmVFbmQgPiAxOCkgewogICAgICAgICAgICAgICAgUmVzdWx0LmV2ZW5pbmcgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBSZXN1bHQ7CiAgICB9CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Pd25lckluZm9QYW5lbCB8fCB7fSkpOwo=</File>

        <!-- JavaScript - Providers -->
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.Provider.Mock.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlcgogKiBAZGVzY3JpcHRpb24KICogICAgICBNb2NrIFByb3ZpZGVyIGZvciBDb2xsYWJvcmF0aW9uIEFkZC1vbgogKgogKiAgICAgIFRoaXMgcHJvdmlkZXIgcmV0dXJucyBzdGF0aWMgdGVzdCBkYXRhIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZy4KICogICAgICBJdCBzaW11bGF0ZXMgQVBJIGxhdGVuY3kgYW5kIHZhcmlvdXMgdXNlciBzdGF0ZXMuCiAqCiAqICAgICAgRmVhdHVyZXM6CiAqICAgICAgLSBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZAogKiAgICAgIC0gQ29uZmlndXJhYmxlIGRlbGF5IHRvIHNpbXVsYXRlIG5ldHdvcmsgbGF0ZW5jeQogKiAgICAgIC0gVmFyaW91cyB0ZXN0IHVzZXJzIHdpdGggZGlmZmVyZW50IHN0YXRlcwogKiAgICAgIC0gUmFuZG9tIHByZXNlbmNlIGNoYW5nZXMgZm9yIHRlc3RpbmcKICovCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBDb25maWd1cmF0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gU2ltdWxhdGVkIG5ldHdvcmsgZGVsYXkgaW4gbWlsbGlzZWNvbmRzCiAgICAgKi8KICAgIHZhciBTaW11bGF0ZWREZWxheSA9IDIwMDsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB1c2VyIGlzICJsb2dnZWQgaW4iCiAgICAgKi8KICAgIHZhciBMb2dnZWRJbiA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IG1vY2sgdXNlcgogICAgICovCiAgICB2YXIgQ3VycmVudFVzZXIgPSBudWxsOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVGVzdCBEYXRhIChmYWxsYmFjayAtIG92ZXJ3cml0dGVuIGJ5IGNvbmZpZyBpZiBhdmFpbGFibGUpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciBleHRlcm5hbCBjb25maWcgaGFzIGJlZW4gbG9hZGVkCiAgICAgKi8KICAgIHZhciBDb25maWdMb2FkZWQgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUHJvbWlzZSBmb3IgY29uZmlnIGxvYWRpbmcgKHRvIHByZXZlbnQgZHVwbGljYXRlIGxvYWRzKQogICAgICovCiAgICB2YXIgQ29uZmlnTG9hZFByb21pc2UgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNb2NrIHVzZXJzIGRhdGFiYXNlIC0gbG9hZGVkIGZyb20gZXh0ZXJuYWwgY29uZmlnIChkZXYtZW52aXJvbm1lbnQuanNvbikKICAgICAqICAgICAgICAgICAgICBObyBoYXJkY29kZWQgZmFsbGJhY2sgZGF0YSAtIGNvbmZpZyBtdXN0IGJlIGF2YWlsYWJsZQogICAgICovCiAgICB2YXIgTW9ja1VzZXJzID0ge307CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm92aWRlciBDYXBhYmlsaXRpZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHB1YmxpYwogICAgICogQGRlc2NyaXB0aW9uIENhcGFiaWxpdGllcyB0aGlzIHByb3ZpZGVyIHN1cHBvcnRzCiAgICAgKi8KICAgIFRhcmdldE5TLmNhcGFiaWxpdGllcyA9IHsKICAgICAgICBhdmF0YXI6IHRydWUsCiAgICAgICAgcHJlc2VuY2U6IHRydWUsCiAgICAgICAgcHJvZmlsZTogdHJ1ZSwKICAgICAgICBjaGF0OiB0cnVlLAogICAgICAgIGNhbGw6IHRydWUsCiAgICAgICAgZnJlZUJ1c3k6IHRydWUsCiAgICAgICAgY3JlYXRlTWVldGluZzogdHJ1ZSwKICAgICAgICBjcmVhdGVDYWxlbmRhckV2ZW50OiB0cnVlLAogICAgICAgIGRlbGV0ZUNhbGVuZGFyRXZlbnQ6IHRydWUsCiAgICAgICAgb3V0T2ZPZmZpY2U6IGZhbHNlICAvLyBEZXByZWNhdGVkIC0gdXNlIHByZXNlbmNlLmFjdGl2aXR5ID09PSAnT3V0T2ZPZmZpY2UnIGluc3RlYWQKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRMb2dpbkluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGxvZ2luIFVJIG1ldGFkYXRhIGZvciB0aGlzIHByb3ZpZGVyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMb2dpbiBpbmZvIHtsYWJlbCwgaWNvbiwgcmVxdWlyZXNFeHBsaWNpdExvZ2lufQogICAgICovCiAgICBUYXJnZXROUy5nZXRMb2dpbkluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbGFiZWw6ICdNb2NrIFByb3ZpZGVyJywKICAgICAgICAgICAgaWNvbjogJ2ZhLXNpZ24taW4nLAogICAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0TG9naW46IHRydWUKICAgICAgICB9OwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBpbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIG1vY2sgcHJvdmlkZXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBDb25maWcgLSBQcm92aWRlciBjb25maWd1cmF0aW9uCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBpbml0aWFsaXplZAogICAgICovCiAgICBUYXJnZXROUy5pbml0ID0gZnVuY3Rpb24gKENvbmZpZykgewogICAgICAgIGlmIChDb25maWcgJiYgQ29uZmlnLlNpbXVsYXRlZERlbGF5KSB7CiAgICAgICAgICAgIFNpbXVsYXRlZERlbGF5ID0gQ29uZmlnLlNpbXVsYXRlZERlbGF5OwogICAgICAgIH0KCiAgICAgICAgLy8gTG9hZCBleHRlcm5hbCB1c2VyIGNvbmZpZywgdGhlbiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgogICAgICAgIHJldHVybiBMb2FkTW9ja1VzZXJzKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBEZWxheSg1MCk7CiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgdHJ5U2lsZW50TG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gVHJ5IHNpbGVudCBsb2dpbiAtIG9ubHkgc3VjY2VlZHMgaWYgdXNlciBpcyBpbiBtb2NrIGRhdGEKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFVzZXIgb2JqZWN0IG9yIHJlamVjdHMgaWYgdXNlciBub3QgZm91bmQKICAgICAqLwogICAgVGFyZ2V0TlMudHJ5U2lsZW50TG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIERlbGF5KDEwMCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IFpudW55IHVzZXIncyBlbWFpbCBmcm9tIENvbGxhYm9yYXRpb24gY29uZmlnCiAgICAgICAgICAgIHZhciBDb2xsYWJDb25maWcgPSBDb3JlLkNvbmZpZy5HZXQoJ0NvbGxhYm9yYXRpb24nKSB8fCB7fTsKICAgICAgICAgICAgdmFyIFpudW55VXNlckVtYWlsID0gQ29sbGFiQ29uZmlnLlVzZXJFbWFpbCB8fCAnJzsKICAgICAgICAgICAgdmFyIE1vY2tVc2VyID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChabnVueVVzZXJFbWFpbCkgewogICAgICAgICAgICAgICAgTW9ja1VzZXIgPSBHZXRNb2NrVXNlcihabnVueVVzZXJFbWFpbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZvciB0ZXN0aW5nOiBpZiBubyBVc2VyRW1haWwgY29uZmlndXJlZCwgdXNlIGZpcnN0IGF2YWlsYWJsZSB0ZXN0IHVzZXIKICAgICAgICAgICAgaWYgKCFNb2NrVXNlciAmJiAhWm51bnlVc2VyRW1haWwpIHsKICAgICAgICAgICAgICAgIHZhciBGaXJzdEtleSA9IE9iamVjdC5rZXlzKE1vY2tVc2VycylbMF07CiAgICAgICAgICAgICAgICBpZiAoRmlyc3RLZXkpIHsKICAgICAgICAgICAgICAgICAgICBNb2NrVXNlciA9IE1vY2tVc2Vyc1tGaXJzdEtleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHVzZXIgbm90IGluIG1vY2sgZGF0YSwgZmFpbCBzaWxlbnQgbG9naW4gKGNvbnNpc3RlbnQgd2l0aCBNMzY1IGJlaGF2aW9yKQogICAgICAgICAgICBpZiAoIU1vY2tVc2VyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGZvdW5kIGluIG1vY2sgZGF0YScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMb2dnZWRJbiA9IHRydWU7CiAgICAgICAgICAgIEN1cnJlbnRVc2VyID0gTW9ja1VzZXI7CiAgICAgICAgICAgIHJldHVybiBDdXJyZW50VXNlcjsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2dpbgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5Nb2NrCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBJbnRlcmFjdGl2ZSBsb2dpbiAtIG9ubHkgc3VjY2VlZHMgaWYgdXNlciBpcyBpbiBtb2NrIGRhdGEKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFVzZXIgb2JqZWN0IG9yIHJlamVjdHMgaWYgdXNlciBub3QgZm91bmQKICAgICAqLwogICAgVGFyZ2V0TlMubG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIERlbGF5KFNpbXVsYXRlZERlbGF5KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgWm51bnkgdXNlcidzIGVtYWlsIGZyb20gQ29sbGFib3JhdGlvbiBjb25maWcKICAgICAgICAgICAgdmFyIENvbGxhYkNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ29sbGFib3JhdGlvbicpIHx8IHt9OwogICAgICAgICAgICB2YXIgWm51bnlVc2VyRW1haWwgPSBDb2xsYWJDb25maWcuVXNlckVtYWlsIHx8ICcnOwogICAgICAgICAgICB2YXIgTW9ja1VzZXIgPSBudWxsOwoKICAgICAgICAgICAgaWYgKFpudW55VXNlckVtYWlsKSB7CiAgICAgICAgICAgICAgICBNb2NrVXNlciA9IEdldE1vY2tVc2VyKFpudW55VXNlckVtYWlsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgdXNlciBub3QgaW4gbW9jayBkYXRhLCBmYWlsIGxvZ2luCiAgICAgICAgICAgIGlmICghTW9ja1VzZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgZm91bmQgaW4gbW9jayBkYXRhLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMb2dnZWRJbiA9IHRydWU7CiAgICAgICAgICAgIEN1cnJlbnRVc2VyID0gTW9ja1VzZXI7CiAgICAgICAgICAgIHJldHVybiBDdXJyZW50VXNlcjsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2dvdXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gTG9nb3V0CiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBsb2dnZWQgb3V0CiAgICAgKi8KICAgIFRhcmdldE5TLmxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gRGVsYXkoMTAwKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgTG9nZ2VkSW4gPSBmYWxzZTsKICAgICAgICAgICAgQ3VycmVudFVzZXIgPSBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGlzTG9nZ2VkSW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgbG9naW4gc3RhdHVzCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBsb2dnZWQgaW4KICAgICAqLwogICAgVGFyZ2V0TlMuaXNMb2dnZWRJbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gTG9nZ2VkSW47CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q3VycmVudFVzZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgdXNlcgogICAgICogQHJldHVybnMge09iamVjdHxudWxsfSBDdXJyZW50IHVzZXIKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIEN1cnJlbnRVc2VyOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEF2YXRhcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5Nb2NrCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgYXZhdGFyIFVSTCBmb3IgZW1haWwKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEF2YXRhciBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0QXZhdGFyID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBNb2NrVXNlcnMKICAgICAgICByZXR1cm4gTG9hZE1vY2tVc2VycygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVXNlciA9IEdldE1vY2tVc2VyKEVtYWlsKTsKCiAgICAgICAgICAgIGlmIChVc2VyICYmIFVzZXIuaGFzQXZhdGFyKSB7CiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gY3VzdG9tIGF2YXRhciBVUkwgaWYgZGVmaW5lZCAoZS5nLiwgZm9yIG1heF9tdXN0ZXJtYW5uLmpwZykKICAgICAgICAgICAgICAgIGlmIChVc2VyLmF2YXRhclVybCkgewogICAgICAgICAgICAgICAgICAgIC8vIFVzZSBabnVueSdzIFdlYlBhdGggZm9yIHN0YXRpYyBmaWxlcyAoZS5nLiwgL3pudW55LXdlYi8pCiAgICAgICAgICAgICAgICAgICAgdmFyIFdlYlBhdGggPSBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSB8fCAnL3pudW55LXdlYi8nOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXZWJQYXRoICsgVXNlci5hdmF0YXJVcmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdXNlIGNlbnRyYWwgZmFsbGJhY2sgYXZhdGFyIHdpdGggZGlzcGxheSBuYW1lCiAgICAgICAgICAgICAgICByZXR1cm4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkdldEZhbGxiYWNrQXZhdGFyVXJsKFVzZXIuZW1haWwsIFVzZXIuZGlzcGxheU5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBObyBhdmF0YXIgLSBsZXQgdGhlIG1haW4gbW9kdWxlIGhhbmRsZSBmYWxsYmFjawogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBhdmF0YXInKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0UHJlc2VuY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHByZXNlbmNlIGZvciBlbWFpbAogICAgICogQHBhcmFtIHtTdHJpbmd9IFVzZXJJZE9yRW1haWwgLSBVc2VyIElEIG9yIGVtYWlsIChmb3IgTTM2NSBjb21wYXRpYmlsaXR5KQogICAgICogQHBhcmFtIHtTdHJpbmd9IE9yaWdpbmFsRW1haWwgLSBPcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChvcHRpb25hbCwgdXNlZCB3aGVuIGZpcnN0IHBhcmFtIGlzIElEKQogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gUHJlc2VuY2Ugb2JqZWN0CiAgICAgKi8KICAgIFRhcmdldE5TLmdldFByZXNlbmNlID0gZnVuY3Rpb24gKFVzZXJJZE9yRW1haWwsIE9yaWdpbmFsRW1haWwpIHsKICAgICAgICAvLyBVc2UgT3JpZ2luYWxFbWFpbCBpZiBwcm92aWRlZCAoTTM2NS1zdHlsZSBjYWxsKSwgb3RoZXJ3aXNlIHVzZSBmaXJzdCBwYXJhbQogICAgICAgIHZhciBFbWFpbCA9IE9yaWdpbmFsRW1haWwgfHwgVXNlcklkT3JFbWFpbDsKCiAgICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBNb2NrVXNlcnMKICAgICAgICByZXR1cm4gTG9hZE1vY2tVc2VycygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgLyAyKTsKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFVzZXIgPSBHZXRNb2NrVXNlcihFbWFpbCk7CgogICAgICAgICAgICBpZiAoVXNlcikgewogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgT09GIGlzIGN1cnJlbnRseSBhY3RpdmUKICAgICAgICAgICAgICAgIHZhciBJc09PRiA9IElzT09GQ3VycmVudGx5QWN0aXZlKFVzZXIub3V0T2ZPZmZpY2UpOwogICAgICAgICAgICAgICAgdmFyIEFjdGl2aXR5ID0gSXNPT0YgPyAnT3V0T2ZPZmZpY2UnIDogKFVzZXIuYWN0aXZpdHkgfHwgJ0F2YWlsYWJsZScpOwoKICAgICAgICAgICAgICAgIHZhciBSZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBVc2VyLnByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiBBY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrTG9jYXRpb24gaXMgbnVsbCB3aGVuIE9PRiBpcyBhY3RpdmUgKE1pY3Jvc29mdCBiZWhhdmlvcikKICAgICAgICAgICAgICAgICAgICB3b3JrTG9jYXRpb246IElzT09GID8gbnVsbCA6IChVc2VyLndvcmtMb2NhdGlvbiB8fCBudWxsKQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBFbWJlZCBPT0YgZGF0YSBpbiBwcmVzZW5jZSByZXNwb25zZSBmb3IgZGF0ZSBkaXNwbGF5CiAgICAgICAgICAgICAgICBpZiAoSXNPT0YgJiYgVXNlci5vdXRPZk9mZmljZSkgewogICAgICAgICAgICAgICAgICAgIFJlc3VsdC5vdXRPZk9mZmljZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBVc2VyLm91dE9mT2ZmaWNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkU3RhcnREYXRlVGltZTogVXNlci5vdXRPZk9mZmljZS5zY2hlZHVsZWRTdGFydERhdGVUaW1lIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZEVuZERhdGVUaW1lOiBVc2VyLm91dE9mT2ZmaWNlLnNjaGVkdWxlZEVuZERhdGVUaW1lIHx8IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVzZXIgbm90IGluIE1vY2sgZGF0YWJhc2UgLSBsZXQgZmFsbGJhY2sgcHJvdmlkZXIgaGFuZGxlIGl0CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1VzZXIgbm90IGZvdW5kIGluIE1vY2sgcHJvdmlkZXInKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiBPT0YgaXMgY3VycmVudGx5IGFjdGl2ZQogICAgICogQHBhcmFtIHtPYmplY3R9IE9PRiAtIE9PRiBjb25maWd1cmF0aW9uIG9iamVjdAogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgT09GIGlzIGN1cnJlbnRseSBhY3RpdmUKICAgICAqLwogICAgZnVuY3Rpb24gSXNPT0ZDdXJyZW50bHlBY3RpdmUoT09GKSB7CiAgICAgICAgaWYgKCFPT0YgfHwgT09GLnN0YXR1cyA9PT0gJ2Rpc2FibGVkJykgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChPT0Yuc3RhdHVzID09PSAnYWx3YXlzRW5hYmxlZCcpIHJldHVybiB0cnVlOwoKICAgICAgICAvLyBGb3Igc2NoZWR1bGVkIE9PRiwgY2hlY2sgaWYgY3VycmVudCB0aW1lIGlzIHdpdGhpbiByYW5nZQogICAgICAgIGlmIChPT0Yuc3RhdHVzID09PSAnc2NoZWR1bGVkJykgewogICAgICAgICAgICB2YXIgTm93ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgaWYgKE9PRi5zY2hlZHVsZWRTdGFydERhdGVUaW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgU3RhcnQgPSBuZXcgRGF0ZShPT0Yuc2NoZWR1bGVkU3RhcnREYXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZiAoTm93IDwgU3RhcnQpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoT09GLnNjaGVkdWxlZEVuZERhdGVUaW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgRW5kID0gbmV3IERhdGUoT09GLnNjaGVkdWxlZEVuZERhdGVUaW1lKTsKICAgICAgICAgICAgICAgIGlmIChOb3cgPiBFbmQpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0T3V0T2ZPZmZpY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgcHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScgaW5zdGVhZAogICAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIE9PRiBzdGF0dXMgaXMgbm93IGVtYmVkZGVkIGluIHByZXNlbmNlIHJlc3BvbnNlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8bnVsbD59IEFsd2F5cyByZXR1cm5zIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHByb2ZpbGUgZm9yIGVtYWlsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5nZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBNb2NrVXNlcnMKICAgICAgICByZXR1cm4gTG9hZE1vY2tVc2VycygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVXNlciA9IEdldE1vY2tVc2VyKEVtYWlsKTsKCiAgICAgICAgICAgIGlmIChVc2VyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGlkOiBVc2VyLmlkLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBVc2VyLmRpc3BsYXlOYW1lLAogICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZTogVXNlci5naXZlbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3VybmFtZTogVXNlci5zdXJuYW1lLAogICAgICAgICAgICAgICAgICAgIGVtYWlsOiBVc2VyLmVtYWlsLAogICAgICAgICAgICAgICAgICAgIGpvYlRpdGxlOiBVc2VyLmpvYlRpdGxlLAogICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IFVzZXIuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbjogVXNlci5vZmZpY2VMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc1Bob25lczogVXNlci5idXNpbmVzc1Bob25lcywKICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogVXNlci5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBVc2VyLm1hbmFnZXIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVzZXIgbm90IGluIE1vY2sgZGF0YWJhc2UgLSBsZXQgZmFsbGJhY2sgcHJvdmlkZXIgaGFuZGxlIGl0CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1VzZXIgbm90IGZvdW5kIGluIE1vY2sgcHJvdmlkZXInKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q2hhdExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IFRlYW1zIGNoYXQgZGVlcC1saW5rCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBDaGF0IFVSTAogICAgICovCiAgICBUYXJnZXROUy5nZXRDaGF0TGluayA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIC8vIFRlYW1zIGRlZXAtbGluayBmb3JtYXQKICAgICAgICByZXR1cm4gJ2h0dHBzOi8vdGVhbXMubWljcm9zb2Z0LmNvbS9sL2NoYXQvMC8wP3VzZXJzPScgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldENhbGxMaW5rCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBUZWFtcyBjYWxsIGRlZXAtbGluawogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gQ2FsbCBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q2FsbExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICAvLyBUZWFtcyBkZWVwLWxpbmsgZm9ybWF0CiAgICAgICAgcmV0dXJuICdodHRwczovL3RlYW1zLm1pY3Jvc29mdC5jb20vbC9jYWxsLzAvMD91c2Vycz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEVtYWlsKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRGcmVlQnVzeQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5Nb2NrCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZnJlZS9idXN5IGRhdGEgLSByZXR1cm5zIEJVU1kgcGVyaW9kcyBmb3IgdGVzdGluZwogICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBFbWFpbHMgLSBFbWFpbCBhZGRyZXNzZXMKICAgICAqIEBwYXJhbSB7RGF0ZX0gU3RhcnQgLSBTdGFydCB0aW1lCiAgICAgKiBAcGFyYW0ge0RhdGV9IEVuZCAtIEVuZCB0aW1lCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qga2V5ZWQgYnkgZW1haWwgd2l0aCBidXN5IHBlcmlvZHMKICAgICAqCiAgICAgKiBSZXR1cm5zIGZvcm1hdDogeyAnZW1haWxAZXhhbXBsZS5jb20nOiBbe3N0YXJ0LCBlbmR9LCAuLi5dLCAuLi4gfQogICAgICogVGhlIFVJIHVzZXMgdGhlc2UgYnVzeSBwZXJpb2RzIHRvIGRldGVybWluZSB3aGljaCBzbG90cyBhcmUgRlJFRQogICAgICovCiAgICBUYXJnZXROUy5nZXRGcmVlQnVzeSA9IGZ1bmN0aW9uIChFbWFpbHMsIFN0YXJ0LCBFbmQpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgKiAyKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gR2VuZXJhdGUgQlVTWSBwZXJpb2RzIChub3QgZnJlZSBzbG90cykKICAgICAgICAgICAgLy8gVGhlIFVJIHdpbGwgZmlsdGVyIHRoZXNlIG91dCB0byBzaG93IG9ubHkgZnJlZSB0aW1lcwogICAgICAgICAgICB2YXIgUmVzdWx0ID0ge307CgogICAgICAgICAgICAvLyBEZWZpbmUgYnVzeSBwZXJpb2RzIGZvciB0aGUgcmVxdWVzdGVkIGRheQogICAgICAgICAgICAvLyAxMjowMC0xMzowMCA9IEx1bmNoIGJyZWFrIChidXN5KQogICAgICAgICAgICAvLyAxNTowMC0xNTozMCA9IFRlYW0gbWVldGluZyAoYnVzeSkKICAgICAgICAgICAgdmFyIFJlcXVlc3REYXRlID0gbmV3IERhdGUoU3RhcnQpOwoKICAgICAgICAgICAgRW1haWxzLmZvckVhY2goZnVuY3Rpb24oRW1haWwpIHsKICAgICAgICAgICAgICAgIHZhciBCdXN5UGVyaW9kcyA9IFtdOwoKICAgICAgICAgICAgICAgIC8vIEx1bmNoIGJyZWFrOiAxMjowMC0xMzowMAogICAgICAgICAgICAgICAgdmFyIEx1bmNoU3RhcnQgPSBuZXcgRGF0ZShSZXF1ZXN0RGF0ZSk7CiAgICAgICAgICAgICAgICBMdW5jaFN0YXJ0LnNldEhvdXJzKDEyLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgIHZhciBMdW5jaEVuZCA9IG5ldyBEYXRlKFJlcXVlc3REYXRlKTsKICAgICAgICAgICAgICAgIEx1bmNoRW5kLnNldEhvdXJzKDEzLCAwLCAwLCAwKTsKCiAgICAgICAgICAgICAgICBpZiAoTHVuY2hTdGFydCA+PSBTdGFydCAmJiBMdW5jaEVuZCA8PSBFbmQpIHsKICAgICAgICAgICAgICAgICAgICBCdXN5UGVyaW9kcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IEx1bmNoU3RhcnQudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBMdW5jaEVuZC50b0lTT1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVGVhbSBtZWV0aW5nOiAxNTowMC0xNTozMAogICAgICAgICAgICAgICAgdmFyIE1lZXRpbmdTdGFydCA9IG5ldyBEYXRlKFJlcXVlc3REYXRlKTsKICAgICAgICAgICAgICAgIE1lZXRpbmdTdGFydC5zZXRIb3VycygxNSwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICB2YXIgTWVldGluZ0VuZCA9IG5ldyBEYXRlKFJlcXVlc3REYXRlKTsKICAgICAgICAgICAgICAgIE1lZXRpbmdFbmQuc2V0SG91cnMoMTUsIDMwLCAwLCAwKTsKCiAgICAgICAgICAgICAgICBpZiAoTWVldGluZ1N0YXJ0ID49IFN0YXJ0ICYmIE1lZXRpbmdFbmQgPD0gRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgQnVzeVBlcmlvZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBNZWV0aW5nU3RhcnQudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBNZWV0aW5nRW5kLnRvSVNPU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBSZXN1bHRbRW1haWxdID0gQnVzeVBlcmlvZHM7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBvbmxpbmUgbWVldGluZwogICAgICogQHBhcmFtIHtPYmplY3R9IERldGFpbHMgLSBNZWV0aW5nIGRldGFpbHMKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IE1lZXRpbmcgaW5mbwogICAgICovCiAgICBUYXJnZXROUy5jcmVhdGVNZWV0aW5nID0gZnVuY3Rpb24gKERldGFpbHMpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgKiAyKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIE1lZXRpbmdJZCA9ICdtb2NrLW1lZXRpbmctJyArIERhdGUubm93KCk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IE1lZXRpbmdJZCwKICAgICAgICAgICAgICAgIHN1YmplY3Q6IERldGFpbHMuc3ViamVjdCB8fCAnWm51bnkgTWVldGluZycsCiAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lOiBEZXRhaWxzLnN0YXJ0RGF0ZVRpbWUsCiAgICAgICAgICAgICAgICBlbmREYXRlVGltZTogRGV0YWlscy5lbmREYXRlVGltZSwKICAgICAgICAgICAgICAgIGpvaW5Vcmw6ICdodHRwczovL3RlYW1zLm1pY3Jvc29mdC5jb20vbC9tZWV0dXAtam9pbi8nICsgTWVldGluZ0lkLAogICAgICAgICAgICAgICAgb3JnYW5pemVyOiBDdXJyZW50VXNlciA/IEN1cnJlbnRVc2VyLmVtYWlsIDogJ2FnZW50QGV4YW1wbGUuY29tJywKICAgICAgICAgICAgICAgIGF0dGVuZGVlczogRGV0YWlscy5hdHRlbmRlZXMgfHwgW10KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBjYWxlbmRhciBldmVudCAod2l0aCBvcHRpb25hbCBUZWFtcyBtZWV0aW5nKQogICAgICogQHBhcmFtIHtPYmplY3R9IERldGFpbHMgLSBFdmVudCBkZXRhaWxzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5zdWJqZWN0IC0gRXZlbnQgc3ViamVjdAogICAgICogQHBhcmFtIHtTdHJpbmd9IERldGFpbHMuc3RhcnREYXRlVGltZSAtIFN0YXJ0IHRpbWUgKElTTyBzdHJpbmcpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5lbmREYXRlVGltZSAtIEVuZCB0aW1lIChJU08gc3RyaW5nKQogICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBEZXRhaWxzLmF0dGVuZGVlcyAtIEF0dGVuZGVlIGVtYWlsIGFkZHJlc3NlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBEZXRhaWxzLmlzT25saW5lTWVldGluZyAtIFdoZXRoZXIgdG8gY3JlYXRlIFRlYW1zIG1lZXRpbmcKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbRGV0YWlscy5sb2NhdGlvbl0gLSBMb2NhdGlvbiBmb3Igb24tc2l0ZSBtZWV0aW5ncwogICAgICogQHBhcmFtIHtTdHJpbmd9IFtEZXRhaWxzLnRpbWVab25lXSAtIElBTkEgdGltZXpvbmUgKGUuZy4sICdFdXJvcGUvQmVybGluJykKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEV2ZW50IGluZm8gd2l0aCBpZCBhbmQgb3B0aW9uYWwgam9pblVybAogICAgICovCiAgICBUYXJnZXROUy5jcmVhdGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKERldGFpbHMpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgKiAyKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIEV2ZW50SWQgPSAnbW9jay1ldmVudC0nICsgRGF0ZS5ub3coKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogRXZlbnRJZCwKICAgICAgICAgICAgICAgIHN1YmplY3Q6IERldGFpbHMuc3ViamVjdCB8fCAnWm51bnkgQXBwb2ludG1lbnQnLAogICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogRGV0YWlscy5zdGFydERhdGVUaW1lLAogICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWU6IERldGFpbHMuZW5kRGF0ZVRpbWUsCiAgICAgICAgICAgICAgICB0aW1lWm9uZTogRGV0YWlscy50aW1lWm9uZSB8fCAnVVRDJywKICAgICAgICAgICAgICAgIGpvaW5Vcmw6IERldGFpbHMuaXNPbmxpbmVNZWV0aW5nCiAgICAgICAgICAgICAgICAgICAgPyAnaHR0cHM6Ly90ZWFtcy5taWNyb3NvZnQuY29tL2wvbWVldHVwLWpvaW4vJyArIEV2ZW50SWQKICAgICAgICAgICAgICAgICAgICA6IG51bGwsCiAgICAgICAgICAgICAgICBvcmdhbml6ZXI6IEN1cnJlbnRVc2VyID8gQ3VycmVudFVzZXIuZW1haWwgOiAnYWdlbnRAZXhhbXBsZS5jb20nLAogICAgICAgICAgICAgICAgYXR0ZW5kZWVzOiBEZXRhaWxzLmF0dGVuZGVlcyB8fCBbXQogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGRlbGV0ZUNhbGVuZGFyRXZlbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlL2NhbmNlbCBjYWxlbmRhciBldmVudCAoc2VuZHMgY2FuY2VsbGF0aW9uIHRvIGF0dGVuZGVlcykKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFdmVudElkIC0gRXZlbnQgSUQgdG8gZGVsZXRlCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBTdWNjZXNzIHN0YXR1cwogICAgICovCiAgICBUYXJnZXROUy5kZWxldGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKEV2ZW50SWQpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgSGVscGVyIEZ1bmN0aW9ucwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIExvYWQgbW9jayB1c2VycyBmcm9tIGV4dGVybmFsIGNvbmZpZyBmaWxlCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBjb25maWcgaXMgbG9hZGVkLCByZWplY3RzIG9uIGVycm9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIExvYWRNb2NrVXNlcnMoKSB7CiAgICAgICAgaWYgKENvbmZpZ0xvYWRQcm9taXNlKSB7CiAgICAgICAgICAgIHJldHVybiBDb25maWdMb2FkUHJvbWlzZTsKICAgICAgICB9CgogICAgICAgIHZhciBXZWJQYXRoID0gQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgfHwgJy96bnVueS13ZWIvJzsKICAgICAgICB2YXIgQ29uZmlnVXJsID0gV2ViUGF0aCArICdqcy9kZXYtZW52aXJvbm1lbnQuanNvbic7CgogICAgICAgIENvbmZpZ0xvYWRQcm9taXNlID0gZmV0Y2goQ29uZmlnVXJsKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZyBub3QgZm91bmQ6ICcgKyBSZXNwb25zZS5zdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKENvbmZpZykgewogICAgICAgICAgICAgICAgLy8gQnVpbGQgTW9ja1VzZXJzIGZyb20gY29uZmlnCiAgICAgICAgICAgICAgICB2YXIgTmV3TW9ja1VzZXJzID0ge307CgogICAgICAgICAgICAgICAgLy8gQWRkIGFnZW50cyB3aXRoIG1vY2tQcm9maWxlCiAgICAgICAgICAgICAgICAoQ29uZmlnLmFnZW50cyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoQWdlbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQWdlbnQubW9ja1Byb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb2ZpbGUgPSBBZ2VudC5tb2NrUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgTmV3TW9ja1VzZXJzW0FnZW50LmVtYWlsLnRvTG93ZXJDYXNlKCldID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFByb2ZpbGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogQWdlbnQuZmlyc3ROYW1lICsgJyAnICsgQWdlbnQubGFzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbk5hbWU6IEFnZW50LmZpcnN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cm5hbWU6IEFnZW50Lmxhc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IEFnZW50LmVtYWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iVGl0bGU6IFByb2ZpbGUuam9iVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBhcnRtZW50OiBQcm9maWxlLmRlcGFydG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbjogUHJvZmlsZS5vZmZpY2VMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzUGhvbmVzOiBQcm9maWxlLmJ1c2luZXNzUGhvbmVzIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlUGhvbmU6IFByb2ZpbGUubW9iaWxlUGhvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBQcm9maWxlLm1hbmFnZXIgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbmNlOiBQcm9maWxlLnByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHk6IFByb2ZpbGUuYWN0aXZpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrTG9jYXRpb246IFByb2ZpbGUud29ya0xvY2F0aW9uIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdmF0YXI6IFByb2ZpbGUuaGFzQXZhdGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyVXJsOiBQcm9maWxlLmF2YXRhclVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mT2ZmaWNlOiBQcm9maWxlLm91dE9mT2ZmaWNlIHx8IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBBZGQgY3VzdG9tZXJzIHdpdGggbW9ja1Byb2ZpbGUKICAgICAgICAgICAgICAgIChDb25maWcuY3VzdG9tZXJzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChDdXN0b21lcikgewogICAgICAgICAgICAgICAgICAgIGlmIChDdXN0b21lci5tb2NrUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHJvZmlsZSA9IEN1c3RvbWVyLm1vY2tQcm9maWxlOwogICAgICAgICAgICAgICAgICAgICAgICBOZXdNb2NrVXNlcnNbQ3VzdG9tZXIuZW1haWwudG9Mb3dlckNhc2UoKV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogUHJvZmlsZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBDdXN0b21lci5maXJzdE5hbWUgKyAnICcgKyBDdXN0b21lci5sYXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZTogQ3VzdG9tZXIuZmlyc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VybmFtZTogQ3VzdG9tZXIubGFzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogQ3VzdG9tZXIuZW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZTogUHJvZmlsZS5qb2JUaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IFByb2ZpbGUuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uOiBQcm9maWxlLm9mZmljZUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXM6IFByb2ZpbGUuYnVzaW5lc3NQaG9uZXMgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogUHJvZmlsZS5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IFByb2ZpbGUubWFuYWdlciB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2U6IFByb2ZpbGUucHJlc2VuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogUHJvZmlsZS5hY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtMb2NhdGlvbjogUHJvZmlsZS53b3JrTG9jYXRpb24gfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F2YXRhcjogUHJvZmlsZS5oYXNBdmF0YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXJVcmw6IFByb2ZpbGUuYXZhdGFyVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZPZmZpY2U6IFByb2ZpbGUub3V0T2ZPZmZpY2UgfHwgbnVsbAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIEFkZCB0ZXN0IHVzZXJzCiAgICAgICAgICAgICAgICAoQ29uZmlnLnRlc3RVc2VycyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoVGVzdFVzZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoVGVzdFVzZXIubW9ja1Byb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb2ZpbGUgPSBUZXN0VXNlci5tb2NrUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgTmV3TW9ja1VzZXJzW1Rlc3RVc2VyLmVtYWlsLnRvTG93ZXJDYXNlKCldID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFByb2ZpbGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogUHJvZmlsZS5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZTogUHJvZmlsZS5naXZlbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJuYW1lOiBQcm9maWxlLnN1cm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogVGVzdFVzZXIuZW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZTogUHJvZmlsZS5qb2JUaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IFByb2ZpbGUuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uOiBQcm9maWxlLm9mZmljZUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXM6IFByb2ZpbGUuYnVzaW5lc3NQaG9uZXMgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogUHJvZmlsZS5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IFByb2ZpbGUubWFuYWdlciB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2U6IFByb2ZpbGUucHJlc2VuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogUHJvZmlsZS5hY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtMb2NhdGlvbjogUHJvZmlsZS53b3JrTG9jYXRpb24gfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F2YXRhcjogUHJvZmlsZS5oYXNBdmF0YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXJVcmw6IFByb2ZpbGUuYXZhdGFyVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZPZmZpY2U6IFByb2ZpbGUub3V0T2ZPZmZpY2UgfHwgbnVsbAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgTW9ja1VzZXJzIHdpdGggbG9hZGVkIGNvbmZpZwogICAgICAgICAgICAgICAgTW9ja1VzZXJzID0gTmV3TW9ja1VzZXJzOwogICAgICAgICAgICAgICAgQ29uZmlnTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChFcnJvcikgewogICAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgZXJyb3IgLSBNb2NrIHByb3ZpZGVyIGNhbm5vdCBmdW5jdGlvbiB3aXRob3V0IGNvbmZpZwogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3I7CiAgICAgICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gQ29uZmlnTG9hZFByb21pc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFNpbXVsYXRlIG5ldHdvcmsgZGVsYXkKICAgICAqLwogICAgZnVuY3Rpb24gRGVsYXkoTXMpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKFJlc29sdmUpIHsKICAgICAgICAgICAgc2V0VGltZW91dChSZXNvbHZlLCBNcyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdldCBtb2NrIHVzZXIgYnkgZW1haWwgKGNhc2UtaW5zZW5zaXRpdmUpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldE1vY2tVc2VyKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciBMb3dlckVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gRGlyZWN0IG1hdGNoCiAgICAgICAgaWYgKE1vY2tVc2Vyc1tMb3dlckVtYWlsXSkgewogICAgICAgICAgICByZXR1cm4gTW9ja1VzZXJzW0xvd2VyRW1haWxdOwogICAgICAgIH0KCiAgICAgICAgLy8gU2VhcmNoIGFsbCB1c2VycwogICAgICAgIGZvciAodmFyIEtleSBpbiBNb2NrVXNlcnMpIHsKICAgICAgICAgICAgaWYgKE1vY2tVc2Vycy5oYXNPd25Qcm9wZXJ0eShLZXkpICYmIEtleS50b0xvd2VyQ2FzZSgpID09PSBMb3dlckVtYWlsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTW9ja1VzZXJzW0tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUmVnaXN0ZXIgUHJvdmlkZXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIEF1dG8tcmVnaXN0ZXIgd2hlbiBzY3JpcHQgbG9hZHMKICAgIGlmIChDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlJlZ2lzdGVyUHJvdmlkZXIpIHsKICAgICAgICBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUmVnaXN0ZXJQcm92aWRlcignTW9jaycsIFRhcmdldE5TKTsKICAgIH0KCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sgfHwge30pKTsK</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.Provider.M365.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlcgogKiBAZGVzY3JpcHRpb24KICogICAgICBNaWNyb3NvZnQgMzY1IFByb3ZpZGVyIGZvciBDb2xsYWJvcmF0aW9uIEFkZC1vbgogKgogKiAgICAgIFRoaXMgcHJvdmlkZXIgaW50ZWdyYXRlcyB3aXRoIE1pY3Jvc29mdCBHcmFwaCBBUEkgdmlhIE1TQUwuanMgZm9yOgogKiAgICAgIC0gQXV0aGVudGljYXRpb24gKFNpbGVudCBTU08gKyBJbnRlcmFjdGl2ZSBMb2dpbikKICogICAgICAtIFVzZXIgQXZhdGFycyBmcm9tIEV4Y2hhbmdlL0VudHJhIElECiAqICAgICAgLSBQcmVzZW5jZSBTdGF0dXMgZnJvbSBUZWFtcwogKiAgICAgIC0gVXNlciBQcm9maWxlcyBmcm9tIEVudHJhIElECiAqICAgICAgLSBGcmVlL0J1c3kgQ2FsZW5kYXIgRGF0YQogKiAgICAgIC0gVGVhbXMgTWVldGluZyBDcmVhdGlvbgogKiAgICAgIC0gVGVhbXMgQ2hhdC9DYWxsIERlZXAgTGlua3MKICoKICogICAgICBSZXF1aXJlZCBFbnRyYSBJRCBBcHAgUmVnaXN0cmF0aW9uIFBlcm1pc3Npb25zOgogKiAgICAgIC0gVXNlci5SZWFkIChkZWxlZ2F0ZWQpIC0gT3duIHByb2ZpbGUKICogICAgICAtIFVzZXIuUmVhZC5BbGwgKGRlbGVnYXRlZCkgLSBPdGhlciB1c2VycycgcHJvZmlsZXMgYW5kIGF2YXRhcnMKICogICAgICAtIFByZXNlbmNlLlJlYWQuQWxsIChkZWxlZ2F0ZWQpIC0gUHJlc2VuY2Ugc3RhdHVzCiAqICAgICAgLSBDYWxlbmRhcnMuUmVhZC5TaGFyZWQgKGRlbGVnYXRlZCkgLSBGcmVlL0J1c3kKICogICAgICAtIENhbGVuZGFycy5SZWFkV3JpdGUgKGRlbGVnYXRlZCkgLSBDcmVhdGUvZGVsZXRlIG1lZXRpbmdzCiAqLwp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gPSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gfHwge307CkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlciA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlciB8fCB7fTsKCkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNU0FMIFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIGluc3RhbmNlCiAgICAgKi8KICAgIHZhciBNc2FsSW5zdGFuY2UgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGF1dGhlbnRpY2F0ZWQgYWNjb3VudAogICAgICovCiAgICB2YXIgQ3VycmVudEFjY291bnQgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDYWNoZWQgdXNlciBwcm9maWxlIGZyb20gR3JhcGggQVBJIChoYXMgZnVsbCBkaXNwbGF5TmFtZSkKICAgICAqLwogICAgdmFyIEN1cnJlbnRVc2VyUHJvZmlsZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVyIGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgdmFyIENvbmZpZyA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdyYXBoIEFQSSBiYXNlIFVSTAogICAgICovCiAgICB2YXIgR3JhcGhCYXNlVXJsID0gJ2h0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wJzsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hpdGVsaXN0IG9mIGFsbG93ZWQgR3JhcGggQVBJIGVuZHBvaW50IHBhdHRlcm5zCiAgICAgKiAgICAgICAgICAgICAgU2VjdXJpdHk6IFByZXZlbnRzIGFyYml0cmFyeSBBUEkgY2FsbHMgdmlhIEdyYXBoQXBpQ2FsbAogICAgICovCiAgICB2YXIgQWxsb3dlZEVuZHBvaW50UGF0dGVybnMgPSBbCiAgICAgICAgLy8gQ3VycmVudCB1c2VyIGVuZHBvaW50cwogICAgICAgIC9eXC9tZShcPy4qKT8kLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvbWUsIC9tZT8kc2VsZWN0PS4uLgogICAgICAgIC9eXC9tZVwvcGhvdG9cL1wkdmFsdWUkLywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvbWUvcGhvdG8vJHZhbHVlCiAgICAgICAgL15cL21lXC9wcmVzZW5jZSQvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC9tZS9wcmVzZW5jZSAob3duIHByZXNlbmNlKQogICAgICAgIC9eXC9tZVwvY2FsZW5kYXJcL2dldFNjaGVkdWxlJC8sICAgICAgICAgICAgICAgICAgICAvLyAvbWUvY2FsZW5kYXIvZ2V0U2NoZWR1bGUgKFBPU1QpCiAgICAgICAgL15cL21lXC9ldmVudHMoXD8uKik/JC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC9tZS9ldmVudHMgKFBPU1QgZm9yIGNyZWF0ZSkKICAgICAgICAvXlwvbWVcL2V2ZW50c1wvW15cL10rJC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gL21lL2V2ZW50cy97aWR9IChERUxFVEUpCgogICAgICAgIC8vIE90aGVyIHVzZXIgZW5kcG9pbnRzIChyZWFkLW9ubHkpCiAgICAgICAgL15cL3VzZXJzXC9bXlwvXSsoXD8uKik/JC8sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c2Vycy97ZW1haWx9PyRzZWxlY3Q9Li4uCiAgICAgICAgL15cL3VzZXJzXC9bXlwvXStcL3Bob3RvXC9cJHZhbHVlJC8sICAgICAgICAgICAgICAgIC8vIC91c2Vycy97ZW1haWx9L3Bob3RvLyR2YWx1ZQogICAgICAgIC9eXC91c2Vyc1wvW15cL10rXC9wcmVzZW5jZSQvLCAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNlcnMve2VtYWlsfS9wcmVzZW5jZQogICAgICAgIC9eXC91c2Vyc1wvW15cL10rXC9tYW5hZ2VyKFw/LiopPyQvICAgICAgICAgICAgICAgICAvLyAvdXNlcnMve2VtYWlsfS9tYW5hZ2VyCiAgICBdOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTY29wZXMgZm9yIEdyYXBoIEFQSSBhY2Nlc3MKICAgICAqLwogICAgdmFyIEdyYXBoU2NvcGVzID0gWwogICAgICAgICdVc2VyLlJlYWQnLAogICAgICAgICdVc2VyLlJlYWQuQWxsJywKICAgICAgICAnUHJlc2VuY2UuUmVhZCcsCiAgICAgICAgJ1ByZXNlbmNlLlJlYWQuQWxsJywKICAgICAgICAnQ2FsZW5kYXJzLlJlYWQuU2hhcmVkJywKICAgICAgICAnQ2FsZW5kYXJzLlJlYWRXcml0ZScKICAgIF07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm92aWRlciBDYXBhYmlsaXRpZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHB1YmxpYwogICAgICogQGRlc2NyaXB0aW9uIENhcGFiaWxpdGllcyB0aGlzIHByb3ZpZGVyIHN1cHBvcnRzCiAgICAgKi8KICAgIFRhcmdldE5TLmNhcGFiaWxpdGllcyA9IHsKICAgICAgICBhdmF0YXI6IHRydWUsCiAgICAgICAgcHJlc2VuY2U6IHRydWUsCiAgICAgICAgcHJvZmlsZTogdHJ1ZSwKICAgICAgICBjaGF0OiB0cnVlLAogICAgICAgIGNhbGw6IHRydWUsCiAgICAgICAgZnJlZUJ1c3k6IHRydWUsCiAgICAgICAgY3JlYXRlTWVldGluZzogdHJ1ZSwKICAgICAgICBjcmVhdGVDYWxlbmRhckV2ZW50OiB0cnVlLAogICAgICAgIGRlbGV0ZUNhbGVuZGFyRXZlbnQ6IHRydWUsCiAgICAgICAgb3V0T2ZPZmZpY2U6IGZhbHNlICAvLyBEZXByZWNhdGVkIC0gdXNlIHByZXNlbmNlLmFjdGl2aXR5ID09PSAnT3V0T2ZPZmZpY2UnIGluc3RlYWQKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRMb2dpbkluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGxvZ2luIFVJIG1ldGFkYXRhIGZvciB0aGlzIHByb3ZpZGVyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMb2dpbiBpbmZvIHtsYWJlbCwgaWNvbiwgcmVxdWlyZXNFeHBsaWNpdExvZ2lufQogICAgICovCiAgICBUYXJnZXROUy5nZXRMb2dpbkluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbGFiZWw6ICdNaWNyb3NvZnQgMzY1JywKICAgICAgICAgICAgaWNvbjogJ2ZhLXdpbmRvd3MnLAogICAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0TG9naW46IHRydWUKICAgICAgICB9OwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBpbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIE0zNjUgcHJvdmlkZXIgd2l0aCBNU0FMCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUHJvdmlkZXJDb25maWcgLSBQcm92aWRlciBjb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUHJvdmlkZXJDb25maWcuVGVuYW50SUQgLSBFbnRyYSBJRCBUZW5hbnQgSUQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQcm92aWRlckNvbmZpZy5DbGllbnRJRCAtIEFwcCBSZWdpc3RyYXRpb24gQ2xpZW50IElECiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUHJvdmlkZXJDb25maWcuUmVkaXJlY3RVUkkgLSBPQXV0aCBSZWRpcmVjdCBVUkkKICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIGluaXRpYWxpemVkCiAgICAgKi8KICAgIFRhcmdldE5TLmluaXQgPSBmdW5jdGlvbiAoUHJvdmlkZXJDb25maWcpIHsKICAgICAgICBDb25maWcgPSBQcm92aWRlckNvbmZpZzsKCiAgICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiB3aXRoIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzCiAgICAgICAgdmFyIG1pc3NpbmdDb25maWcgPSBbXTsKICAgICAgICBpZiAoIUNvbmZpZy5UZW5hbnRJRCkgewogICAgICAgICAgICBtaXNzaW5nQ29uZmlnLnB1c2goJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpUZW5hbnRJRCcpOwogICAgICAgIH0KICAgICAgICBpZiAoIUNvbmZpZy5DbGllbnRJRCkgewogICAgICAgICAgICBtaXNzaW5nQ29uZmlnLnB1c2goJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpDbGllbnRJRCcpOwogICAgICAgIH0KICAgICAgICBpZiAoIUNvbmZpZy5SZWRpcmVjdFVSSSkgewogICAgICAgICAgICBtaXNzaW5nQ29uZmlnLnB1c2goJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpSZWRpcmVjdFVSSScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG1pc3NpbmdDb25maWcubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSAnTTM2NSBQcm92aWRlcjogTWlzc2luZyByZXF1aXJlZCBTeXNDb25maWcgc2V0dGluZ3M6ICcgKyBtaXNzaW5nQ29uZmlnLmpvaW4oJywgJykgKwogICAgICAgICAgICAgICAgJy4gUGxlYXNlIGNvbmZpZ3VyZSB0aGVzZSBzZXR0aW5ncyBpbiBBZG1pbiA+IFN5c3RlbSBDb25maWd1cmF0aW9uLic7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb2xsYWJvcmF0aW9uIE0zNjVdICcgKyBlcnJvck1zZyk7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNc2cpKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIE1TQUwgaXMgbG9hZGVkCiAgICAgICAgaWYgKHR5cGVvZiBtc2FsID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB2YXIgbXNhbEVycm9yID0gJ01TQUwuanMgbGlicmFyeSBub3QgbG9hZGVkLiBDaGVjayBicm93c2VyIGNvbnNvbGUgZm9yIHNjcmlwdCBsb2FkaW5nIGVycm9ycy4nOwogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbQ29sbGFib3JhdGlvbiBNMzY1XSAnICsgbXNhbEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihtc2FsRXJyb3IpKTsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSBNU0FMIGNvbmZpZ3VyYXRpb24KICAgICAgICB2YXIgbXNhbENvbmZpZyA9IHsKICAgICAgICAgICAgYXV0aDogewogICAgICAgICAgICAgICAgY2xpZW50SWQ6IENvbmZpZy5DbGllbnRJRCwKICAgICAgICAgICAgICAgIGF1dGhvcml0eTogJ2h0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS8nICsgQ29uZmlnLlRlbmFudElELAogICAgICAgICAgICAgICAgcmVkaXJlY3RVcmk6IENvbmZpZy5SZWRpcmVjdFVSSSB8fCB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgcG9zdExvZ291dFJlZGlyZWN0VXJpOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgbmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybDogZmFsc2UsCiAgICAgICAgICAgICAgICAvLyBBdm9pZCBuZXR3b3JrIGRpc2NvdmVyeSBjYWxsIChDU1AgbWF5IGJsb2NrIGl0KQogICAgICAgICAgICAgICAga25vd25BdXRob3JpdGllczogWydsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tJ10KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2FjaGU6IHsKICAgICAgICAgICAgICAgIGNhY2hlTG9jYXRpb246ICdsb2NhbFN0b3JhZ2UnLCAgLy8gVXNlIGxvY2FsU3RvcmFnZSB0byBwZXJzaXN0IGFjcm9zcyB0YWJzCiAgICAgICAgICAgICAgICBzdG9yZUF1dGhTdGF0ZUluQ29va2llOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICBzeXN0ZW06IHsKICAgICAgICAgICAgICAgIGxvZ2dlck9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBsb2dMZXZlbDogbXNhbC5Mb2dMZXZlbC5FcnJvciwKICAgICAgICAgICAgICAgICAgICBsb2dnZXJDYWxsYmFjazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2dnaW5nIGRpc2FibGVkIGZvciBwcm9kdWN0aW9uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgTXNhbEluc3RhbmNlID0gbmV3IG1zYWwuUHVibGljQ2xpZW50QXBwbGljYXRpb24obXNhbENvbmZpZyk7CgogICAgICAgICAgICAvLyBIYW5kbGUgcmVkaXJlY3QgcHJvbWlzZSAoZm9yIHBvcHVwL3JlZGlyZWN0IGZsb3dzKQogICAgICAgICAgICByZXR1cm4gTXNhbEluc3RhbmNlLmluaXRpYWxpemUoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1zYWxJbnN0YW5jZS5oYW5kbGVSZWRpcmVjdFByb21pc2UoKTsKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFJldHVybmVkIGZyb20gbG9naW4gcmVkaXJlY3QKICAgICAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IHJlc3BvbnNlLmFjY291bnQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBhY2NvdW50IGluIGNhY2hlIHRoYXQgbWF0Y2hlcyBvdXIgdGVuYW50CiAgICAgICAgICAgICAgICAgICAgdmFyIGFjY291bnRzID0gTXNhbEluc3RhbmNlLmdldEFsbEFjY291bnRzKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nQWNjb3VudCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjb3VudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY291bnRzW2ldLnRlbmFudElkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50c1tpXS50ZW5hbnRJZC50b0xvd2VyQ2FzZSgpID09PSBDb25maWcuVGVuYW50SUQudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdBY2NvdW50ID0gYWNjb3VudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nQWNjb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IG1hdGNoaW5nQWNjb3VudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIE1TQUwgaW5pdGlhbGl6YXRpb24gaXNzdWVzIC0gbG9nZ2VkIGJ1dCBub3QgYmxvY2tpbmcKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgdHJ5U2lsZW50TG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gVHJ5IHRvIGFjcXVpcmUgdG9rZW4gc2lsZW50bHkgKFNTTykKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFVzZXIgb2JqZWN0IGlmIHN1Y2Nlc3NmdWwKICAgICAqLwogICAgVGFyZ2V0TlMudHJ5U2lsZW50TG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFNc2FsSW5zdGFuY2UpIHsKICAgICAgICAgICAgLy8gU2lsZW50IGZhaWwgLSBpbml0KCkgYWxyZWFkeSBzaG93ZWQgdGhlIGVycm9yCiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ00zNjUgUHJvdmlkZXIgbm90IGluaXRpYWxpemVkIC0gY2hlY2sgU3lzQ29uZmlnIHNldHRpbmdzJykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGFjY291bnRzID0gTXNhbEluc3RhbmNlLmdldEFsbEFjY291bnRzKCk7CiAgICAgICAgaWYgKGFjY291bnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBhY2NvdW50cycpKTsKICAgICAgICB9CgogICAgICAgIC8vIEZpbmQgYWNjb3VudCBtYXRjaGluZyBvdXIgdGVuYW50CiAgICAgICAgdmFyIG1hdGNoaW5nQWNjb3VudCA9IG51bGw7CiAgICAgICAgdmFyIGV4cGVjdGVkQXV0aG9yaXR5ID0gJ2h0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS8nICsgQ29uZmlnLlRlbmFudElELnRvTG93ZXJDYXNlKCkgKyAnLyc7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjb3VudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGFjY291bnQgPSBhY2NvdW50c1tpXTsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWNjb3VudCdzIGVudmlyb25tZW50IG1hdGNoZXMgb3VyIHRlbmFudAogICAgICAgICAgICBpZiAoYWNjb3VudC50ZW5hbnRJZCAmJiBhY2NvdW50LnRlbmFudElkLnRvTG93ZXJDYXNlKCkgPT09IENvbmZpZy5UZW5hbnRJRC50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICAgICAgICBtYXRjaGluZ0FjY291bnQgPSBhY2NvdW50OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghbWF0Y2hpbmdBY2NvdW50KSB7CiAgICAgICAgICAgIC8vIENsZWFyIG1pc21hdGNoZWQgYWNjb3VudHMgdG8gYXZvaWQgZnV0dXJlIGF1dGhvcml0eV9taXNtYXRjaCBlcnJvcnMKICAgICAgICAgICAgYWNjb3VudHMuZm9yRWFjaChmdW5jdGlvbihhY2NvdW50KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIE1zYWxJbnN0YW5jZS5zZXRBY3RpdmVBY2NvdW50KG51bGwpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gbWF0Y2hpbmcgYWNjb3VudCcpKTsKICAgICAgICB9CgogICAgICAgIHZhciBzaWxlbnRSZXF1ZXN0ID0gewogICAgICAgICAgICBhY2NvdW50OiBtYXRjaGluZ0FjY291bnQsCiAgICAgICAgICAgIHNjb3BlczogR3JhcGhTY29wZXMsCiAgICAgICAgICAgIGZvcmNlUmVmcmVzaDogZmFsc2UKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gTXNhbEluc3RhbmNlLmFjcXVpcmVUb2tlblNpbGVudChzaWxlbnRSZXF1ZXN0KQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIEN1cnJlbnRBY2NvdW50ID0gcmVzcG9uc2UuYWNjb3VudDsKICAgICAgICAgICAgICAgIHJldHVybiBHZXRDdXJyZW50VXNlclByb2ZpbGUoKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgLy8gSGFuZGxlIGF1dGhvcml0eSBtaXNtYXRjaCBieSBjbGVhcmluZyBzdGFsZSBjYWNoZQogICAgICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yQ29kZSA9PT0gJ2F1dGhvcml0eV9taXNtYXRjaCcgfHwKICAgICAgICAgICAgICAgICAgICAoZXJyb3IubWVzc2FnZSAmJiBlcnJvci5tZXNzYWdlLmluZGV4T2YoJ2F1dGhvcml0eV9taXNtYXRjaCcpICE9PSAtMSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBhbGwgYWNjb3VudHMgLSB0aGV5J3JlIGZyb20gd3JvbmcgYXV0aG9yaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbEFjY291bnRzID0gTXNhbEluc3RhbmNlLmdldEFsbEFjY291bnRzKCk7CiAgICAgICAgICAgICAgICAgICAgYWxsQWNjb3VudHMuZm9yRWFjaChmdW5jdGlvbihhY2NvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNc2FsSW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IG51bGw7CiAgICAgICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSBudWxsOwogICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGxvZ2luCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEludGVyYWN0aXZlIGxvZ2luIHZpYSBwb3B1cAogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gVXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMubG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFNc2FsSW5zdGFuY2UpIHsKICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gJ00zNjUgbG9naW4gZmFpbGVkOiBQcm92aWRlciBub3QgaW5pdGlhbGl6ZWQuICcgKwogICAgICAgICAgICAgICAgJ1BsZWFzZSBjaGVjayB0aGF0IFRlbmFudElEIGFuZCBDbGllbnRJRCBhcmUgY29uZmlndXJlZCBpbiBBZG1pbiA+IFN5c3RlbSBDb25maWd1cmF0aW9uICcgKwogICAgICAgICAgICAgICAgJyhDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTo6VGVuYW50SUQgYW5kIENvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpDbGllbnRJRCkuJzsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0NvbGxhYm9yYXRpb24gTTM2NV0gJyArIGVycm9yTXNnKTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvck1zZykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxvZ2luUmVxdWVzdCA9IHsKICAgICAgICAgICAgc2NvcGVzOiBHcmFwaFNjb3BlcywKICAgICAgICAgICAgcHJvbXB0OiAnc2VsZWN0X2FjY291bnQnCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIE1zYWxJbnN0YW5jZS5sb2dpblBvcHVwKGxvZ2luUmVxdWVzdCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IHJlc3BvbnNlLmFjY291bnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q3VycmVudFVzZXJQcm9maWxlKCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb2xsYWJvcmF0aW9uIE0zNjVdIExvZ2luIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlIHx8IGVycm9yKTsKICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2dvdXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gTG9nb3V0IGFuZCBjbGVhciBzZXNzaW9uCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBsb2dnZWQgb3V0CiAgICAgKi8KICAgIFRhcmdldE5TLmxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIU1zYWxJbnN0YW5jZSB8fCAhQ3VycmVudEFjY291bnQpIHsKICAgICAgICAgICAgQ3VycmVudEFjY291bnQgPSBudWxsOwogICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSBudWxsOwogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgbG9nb3V0UmVxdWVzdCA9IHsKICAgICAgICAgICAgYWNjb3VudDogQ3VycmVudEFjY291bnQsCiAgICAgICAgICAgIHBvc3RMb2dvdXRSZWRpcmVjdFVyaTogd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIH07CgogICAgICAgIHJldHVybiBNc2FsSW5zdGFuY2UubG9nb3V0UG9wdXAobG9nb3V0UmVxdWVzdCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFjY291bnQgPSBudWxsOwogICAgICAgICAgICAgICAgQ3VycmVudFVzZXJQcm9maWxlID0gbnVsbDsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsZWFyIGxvY2FsIHN0YXRlIGV2ZW4gaWYgbG9nb3V0IGZhaWxzCiAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IG51bGw7CiAgICAgICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSBudWxsOwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBpc0xvZ2dlZEluCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIHVzZXIgaXMgbG9nZ2VkIGluCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBsb2dnZWQgaW4KICAgICAqLwogICAgVGFyZ2V0TlMuaXNMb2dnZWRJbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gQ3VycmVudEFjY291bnQgIT09IG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q3VycmVudFVzZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgYXV0aGVudGljYXRlZCB1c2VyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFDdXJyZW50QWNjb3VudCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gUHJlZmVyIGNhY2hlZCBHcmFwaCBBUEkgcHJvZmlsZSAoaGFzIGZ1bGwgZGlzcGxheU5hbWUgbGlrZSAiTWF4IEFnZW50IikKICAgICAgICAvLyBpbnN0ZWFkIG9mIE1TQUwgYWNjb3VudC5uYW1lIChzaG9ydCBuYW1lIGxpa2UgIm1heCIpCiAgICAgICAgaWYgKEN1cnJlbnRVc2VyUHJvZmlsZSkgewogICAgICAgICAgICByZXR1cm4gQ3VycmVudFVzZXJQcm9maWxlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjayB0byBNU0FMIGFjY291bnQgaW5mbyAoYmVmb3JlIHByb2ZpbGUgaXMgbG9hZGVkKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGlkOiBDdXJyZW50QWNjb3VudC5sb2NhbEFjY291bnRJZCwKICAgICAgICAgICAgZGlzcGxheU5hbWU6IEN1cnJlbnRBY2NvdW50Lm5hbWUsCiAgICAgICAgICAgIGVtYWlsOiBDdXJyZW50QWNjb3VudC51c2VybmFtZSwKICAgICAgICAgICAgdGVuYW50SWQ6IEN1cnJlbnRBY2NvdW50LnRlbmFudElkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRBdmF0YXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHVzZXIgYXZhdGFyIGZyb20gR3JhcGggQVBJCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEJhc2U2NCBkYXRhIFVSTCBvZiBhdmF0YXIgaW1hZ2UKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0QXZhdGFyID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgcmV0dXJuIEdyYXBoQXBpQ2FsbCgnL3VzZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpICsgJy9waG90by8kdmFsdWUnLCB7CiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InCiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYmxvYikgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgIC8vIDQwNCA9IG5vIHBob3RvLCBsZXQgbWFpbiBtb2R1bGUgaGFuZGxlIGZhbGxiYWNrCiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwNCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gYXZhdGFyJykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByZXNlbmNlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCB1c2VyIHByZXNlbmNlIHN0YXR1cyBmcm9tIEdyYXBoIEFQSQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gVXNlciBlbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcmVzZW5jZSBvYmplY3Qgd2l0aCBzdGF0dXMgYW5kIGFjdGl2aXR5CiAgICAgKi8KICAgIFRhcmdldE5TLmdldFByZXNlbmNlID0gZnVuY3Rpb24gKFVzZXJJZE9yRW1haWwsIE9yaWdpbmFsRW1haWwpIHsKICAgICAgICAvLyBVc2VySWRPckVtYWlsIGNhbiBiZSBhIEdVSUQgKHVzZXIgSUQpIG9yIGVtYWlsIGFkZHJlc3MKICAgICAgICAvLyBPcmlnaW5hbEVtYWlsIGlzIHRoZSBvcmlnaW5hbCBlbWFpbCBmb3IgbG9nZ2luZyAob3B0aW9uYWwpCiAgICAgICAgdmFyIGRpc3BsYXlFbWFpbCA9IE9yaWdpbmFsRW1haWwgfHwgVXNlcklkT3JFbWFpbDsKCiAgICAgICAgLy8gVXNlIC9tZS9wcmVzZW5jZSBmb3IgY3VycmVudCB1c2VyIChtb3JlIHJlbGlhYmxlKSwgL3VzZXJzL3tpZH0vcHJlc2VuY2UgZm9yIG90aGVycwogICAgICAgIHZhciBjdXJyZW50VXNlckVtYWlsID0gQ3VycmVudEFjY291bnQgPyBDdXJyZW50QWNjb3VudC51c2VybmFtZS50b0xvd2VyQ2FzZSgpIDogJyc7CiAgICAgICAgdmFyIGlzQ3VycmVudFVzZXIgPSAoVXNlcklkT3JFbWFpbC50b0xvd2VyQ2FzZSgpID09PSBjdXJyZW50VXNlckVtYWlsKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAoT3JpZ2luYWxFbWFpbCAmJiBPcmlnaW5hbEVtYWlsLnRvTG93ZXJDYXNlKCkgPT09IGN1cnJlbnRVc2VyRW1haWwpOwogICAgICAgIHZhciBlbmRwb2ludCA9IGlzQ3VycmVudFVzZXIKICAgICAgICAgICAgPyAnL21lL3ByZXNlbmNlJwogICAgICAgICAgICA6ICcvdXNlcnMvJyArIGVuY29kZVVSSUNvbXBvbmVudChVc2VySWRPckVtYWlsKSArICcvcHJlc2VuY2UnOwoKICAgICAgICByZXR1cm4gR3JhcGhBcGlDYWxsKGVuZHBvaW50KQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgLy8gTWFwIE1pY3Jvc29mdCBhdmFpbGFiaWxpdHkgdG8gb3VyIHN0YW5kYXJkIHN0YXR1cyAobWF0Y2hpbmcgVGVhbXMgaWNvbnMpCiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzTWFwID0gewogICAgICAgICAgICAgICAgICAgICdBdmFpbGFibGUnOiAnYXZhaWxhYmxlJywKICAgICAgICAgICAgICAgICAgICAnQXZhaWxhYmxlSWRsZSc6ICdhdmFpbGFibGUnLAogICAgICAgICAgICAgICAgICAgICdCdXN5JzogJ2J1c3knLAogICAgICAgICAgICAgICAgICAgICdCdXN5SWRsZSc6ICdidXN5JywKICAgICAgICAgICAgICAgICAgICAnRG9Ob3REaXN0dXJiJzogJ2RvTm90RGlzdHVyYicsCiAgICAgICAgICAgICAgICAgICAgJ0F3YXknOiAnYXdheScsCiAgICAgICAgICAgICAgICAgICAgJ0JlUmlnaHRCYWNrJzogJ2JlcmlnaHRiYWNrJywKICAgICAgICAgICAgICAgICAgICAnT2ZmbGluZSc6ICdvZmZsaW5lJywKICAgICAgICAgICAgICAgICAgICAnUHJlc2VuY2VVbmtub3duJzogJ3Vua25vd24nCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgd29yayBsb2NhdGlvbiBpZiBhdmFpbGFibGUgKG9mZmljZSwgcmVtb3RlLCB0aW1lT2ZmLCB1bnNwZWNpZmllZCkKICAgICAgICAgICAgICAgIHZhciB3b3JrTG9jYXRpb24gPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGRhdGEud29ya0xvY2F0aW9uICYmIGRhdGEud29ya0xvY2F0aW9uLndvcmtMb2NhdGlvblR5cGUgJiYKICAgICAgICAgICAgICAgICAgICBkYXRhLndvcmtMb2NhdGlvbi53b3JrTG9jYXRpb25UeXBlICE9PSAndW5zcGVjaWZpZWQnICYmCiAgICAgICAgICAgICAgICAgICAgZGF0YS53b3JrTG9jYXRpb24ud29ya0xvY2F0aW9uVHlwZSAhPT0gJ3Vua25vd25GdXR1cmVWYWx1ZScpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrTG9jYXRpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEud29ya0xvY2F0aW9uLndvcmtMb2NhdGlvblR5cGUsICAvLyBvZmZpY2UsIHJlbW90ZSwgdGltZU9mZgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGRhdGEud29ya0xvY2F0aW9uLnNvdXJjZSB8fCAndW5rbm93bicsICAvLyBtYW51YWwsIHNjaGVkdWxlZCwgYXV0b21hdGljCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlSWQ6IGRhdGEud29ya0xvY2F0aW9uLnBsYWNlSWQgfHwgbnVsbAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c01hcFtkYXRhLmF2YWlsYWJpbGl0eV0gfHwgJ3Vua25vd24nLAogICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiBkYXRhLmFjdGl2aXR5IHx8IGRhdGEuYXZhaWxhYmlsaXR5LAogICAgICAgICAgICAgICAgICAgIHdvcmtMb2NhdGlvbjogd29ya0xvY2F0aW9uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBPT0Ygc3RhdHVzOgogICAgICAgICAgICAgICAgLy8gMS4gVmlhIGFjdGl2aXR5IGZpZWxkIChvbGRlciBBUEkgYmVoYXZpb3IpOiBhY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJwogICAgICAgICAgICAgICAgLy8gMi4gVmlhIG91dE9mT2ZmaWNlU2V0dGluZ3MgKGN1cnJlbnQgQVBJIGJlaGF2aW9yKTogb3V0T2ZPZmZpY2VTZXR0aW5ncy5pc091dE9mT2ZmaWNlID09PSB0cnVlCiAgICAgICAgICAgICAgICB2YXIgaXNPdXRPZk9mZmljZSA9IChyZXN1bHQuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScpIHx8CiAgICAgICAgICAgICAgICAgICAgKGRhdGEub3V0T2ZPZmZpY2VTZXR0aW5ncyAmJiBkYXRhLm91dE9mT2ZmaWNlU2V0dGluZ3MuaXNPdXRPZk9mZmljZSA9PT0gdHJ1ZSk7CgogICAgICAgICAgICAgICAgaWYgKGlzT3V0T2ZPZmZpY2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSBhY3Rpdml0eSB0byAnT3V0T2ZPZmZpY2UnIGZvciBjb25zaXN0ZW50IFVJIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gJ091dE9mT2ZmaWNlJzsKICAgICAgICAgICAgICAgICAgICByZXN1bHQub3V0T2ZPZmZpY2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2Fsd2F5c0VuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRTdGFydERhdGVUaW1lOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRFbmREYXRlVGltZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5vdXRPZk9mZmljZVNldHRpbmdzID8gZGF0YS5vdXRPZk9mZmljZVNldHRpbmdzLm1lc3NhZ2UgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB3b3JrTG9jYXRpb24gd2hlbiBPT0YgKE1pY3Jvc29mdCBiZWhhdmlvcikKICAgICAgICAgICAgICAgICAgICByZXN1bHQud29ya0xvY2F0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHVua25vd24gLSBkb24ndCByZWplY3QsIGxldCBhYnN0cmFjdGlvbiBsYXllciBoYW5kbGUgcHJvdmlkZXIgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3Vua25vd24nLAogICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiAnVW5rbm93bicsCiAgICAgICAgICAgICAgICAgICAgd29ya0xvY2F0aW9uOiBudWxsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRPdXRPZk9mZmljZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXByZWNhdGVkIFVzZSBwcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJyBpbnN0ZWFkCiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gT09GIHN0YXR1cyBpcyBub3cgZGVyaXZlZCBmcm9tIHByZXNlbmNlLgogICAgICogICAgICAgICAgICAgIFRoZSBtYWlsYm94U2V0dGluZ3MgQVBJIHJlcXVpcmVzIEV4Y2hhbmdlIEFkbWluIGZvciBvdGhlciB1c2Vycy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8bnVsbD59IEFsd2F5cyByZXR1cm5zIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHVzZXIgcHJvZmlsZSBmcm9tIEdyYXBoIEFQSQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gVXNlciBlbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5nZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgdmFyIHByb2ZpbGUgPSB7fTsKCiAgICAgICAgLy8gR2V0IHVzZXIgcHJvZmlsZQogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy91c2Vycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KEVtYWlsKSArICc/JHNlbGVjdD1pZCxkaXNwbGF5TmFtZSxnaXZlbk5hbWUsc3VybmFtZSxtYWlsLGpvYlRpdGxlLGRlcGFydG1lbnQsb2ZmaWNlTG9jYXRpb24sYnVzaW5lc3NQaG9uZXMsbW9iaWxlUGhvbmUnKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgcHJvZmlsZSA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZGF0YS5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICBnaXZlbk5hbWU6IGRhdGEuZ2l2ZW5OYW1lLAogICAgICAgICAgICAgICAgICAgIHN1cm5hbWU6IGRhdGEuc3VybmFtZSwKICAgICAgICAgICAgICAgICAgICBlbWFpbDogZGF0YS5tYWlsIHx8IEVtYWlsLAogICAgICAgICAgICAgICAgICAgIGpvYlRpdGxlOiBkYXRhLmpvYlRpdGxlLAogICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IGRhdGEuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbjogZGF0YS5vZmZpY2VMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc1Bob25lczogZGF0YS5idXNpbmVzc1Bob25lcyB8fCBbXSwKICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogZGF0YS5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBudWxsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgbWFuYWdlcgogICAgICAgICAgICAgICAgcmV0dXJuIEdyYXBoQXBpQ2FsbCgnL3VzZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpICsgJy9tYW5hZ2VyPyRzZWxlY3Q9ZGlzcGxheU5hbWUsbWFpbCcpCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuYWdlciBub3QgZm91bmQgb3Igbm90IGFjY2Vzc2libGUgLSBPSwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG1hbmFnZXJEYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAobWFuYWdlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBwcm9maWxlLm1hbmFnZXIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBtYW5hZ2VyRGF0YS5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IG1hbmFnZXJEYXRhLm1haWwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIC8vIFJlamVjdCBzbyBmYWxsYmFjayBwcm92aWRlciBjYW4gYmUgdXNlZAogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q2hhdExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IFRlYW1zIGNoYXQgZGVlcC1saW5rCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRlYW1zIGNoYXQgVVJMCiAgICAgKi8KICAgIFRhcmdldE5TLmdldENoYXRMaW5rID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgLy8gdGVuYW50SWQgaXMgcmVxdWlyZWQgcGVyIE1pY3Jvc29mdCdzIGN1cnJlbnQgZGVlcC1saW5rIGRvY3MKICAgICAgICAvLyAobGVhcm4ubWljcm9zb2Z0LmNvbS8uLi4vZGVlcC1saW5rLXRlYW1zLCAiQ29uZmlndXJlIGRlZXAgbGluawogICAgICAgIC8vIHRvIHN0YXJ0IGEgY2hhdCBtYW51YWxseSIpIC0gd2l0aG91dCBpdCwgVGVhbXMgV2ViIG9wZW5lZCBjb2xkCiAgICAgICAgLy8gZnJvbSBhbiBleHRlcm5hbCBwYWdlIChubyBleGlzdGluZyBzaWduZWQtaW4gdGVuYW50IGNvbnRleHQsCiAgICAgICAgLy8gdW5saWtlIHRoZSBkZXNrdG9wIGNsaWVudCkgY2FuIGZhaWwgdG8gcmVzb2x2ZSB3aGljaCB0ZW5hbnQgdG8KICAgICAgICAvLyBvcGVuIHRoZSBjaGF0IGluLgogICAgICAgIHJldHVybiAnaHR0cHM6Ly90ZWFtcy5taWNyb3NvZnQuY29tL2wvY2hhdC8wLzA/dGVuYW50SWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChDb25maWcuVGVuYW50SUQpICsKICAgICAgICAgICAgJyZ1c2Vycz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEVtYWlsKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRDYWxsTGluawogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgVGVhbXMgY2FsbCBkZWVwLWxpbmsKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gVGVhbXMgY2FsbCBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q2FsbExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gJ2h0dHBzOi8vdGVhbXMubWljcm9zb2Z0LmNvbS9sL2NhbGwvMC8wP3VzZXJzPScgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEZyZWVCdXN5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBmcmVlL2J1c3kgZGF0YSBmb3IgdXNlcnMKICAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gRW1haWxzIC0gVXNlciBlbWFpbCBhZGRyZXNzZXMKICAgICAqIEBwYXJhbSB7RGF0ZX0gU3RhcnQgLSBTdGFydCB0aW1lCiAgICAgKiBAcGFyYW0ge0RhdGV9IEVuZCAtIEVuZCB0aW1lCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qgd2l0aCBidXN5IHBlcmlvZHMgcGVyIGVtYWlsCiAgICAgKi8KICAgIFRhcmdldE5TLmdldEZyZWVCdXN5ID0gZnVuY3Rpb24gKEVtYWlscywgU3RhcnQsIEVuZCkgewogICAgICAgIC8vIEdldCB0aW1lem9uZQogICAgICAgIHZhciBUaW1lWm9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnRXVyb3BlL0Jlcmxpbic7CgogICAgICAgIC8vIEZvcm1hdCBkYXRlIGFzIGxvY2FsIElTTyBzdHJpbmcgKHdpdGhvdXQgVVRDIGNvbnZlcnNpb24pCiAgICAgICAgLy8gdG9JU09TdHJpbmcoKSBjb252ZXJ0cyB0byBVVEMgd2hpY2ggY2F1c2VzIHRpbWV6b25lIG9mZnNldCBpc3N1ZXMKICAgICAgICBmdW5jdGlvbiB0b0xvY2FsSVNPU3RyaW5nKGRhdGUpIHsKICAgICAgICAgICAgdmFyIHBhZCA9IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9OwogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgJy0nICsKICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSArICctJyArCiAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXREYXRlKCkpICsgJ1QnICsKICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldEhvdXJzKCkpICsgJzonICsKICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldE1pbnV0ZXMoKSkgKyAnOicgKwogICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0U2Vjb25kcygpKTsKICAgICAgICB9CgogICAgICAgIHZhciByZXF1ZXN0Qm9keSA9IHsKICAgICAgICAgICAgc2NoZWR1bGVzOiBFbWFpbHMsCiAgICAgICAgICAgIHN0YXJ0VGltZTogewogICAgICAgICAgICAgICAgZGF0ZVRpbWU6IHRvTG9jYWxJU09TdHJpbmcoU3RhcnQpLAogICAgICAgICAgICAgICAgdGltZVpvbmU6IFRpbWVab25lCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZFRpbWU6IHsKICAgICAgICAgICAgICAgIGRhdGVUaW1lOiB0b0xvY2FsSVNPU3RyaW5nKEVuZCksCiAgICAgICAgICAgICAgICB0aW1lWm9uZTogVGltZVpvbmUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXZhaWxhYmlsaXR5Vmlld0ludGVydmFsOiAzMAogICAgICAgIH07CgogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy9tZS9jYWxlbmRhci9nZXRTY2hlZHVsZScsIHsKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RCb2R5KQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwoKICAgICAgICAgICAgaWYgKGRhdGEudmFsdWUpIHsKICAgICAgICAgICAgICAgIGRhdGEudmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW1haWwgPSBzY2hlZHVsZS5zY2hlZHVsZUlkOwogICAgICAgICAgICAgICAgICAgIHZhciBidXN5UGVyaW9kcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBzY2hlZHVsZUl0ZW1zIGZvciBhY3R1YWwgYnVzeSBwZXJpb2RzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlLnNjaGVkdWxlSXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUuc2NoZWR1bGVJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zdGF0dXMgIT09ICdmcmVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgQVBJIHRpbWVzIHRvIHByb3BlciBEYXRlIG9iamVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHcmFwaCBBUEkgcmV0dXJucyB0aW1lcyBpbiBVVEMgKHRpbWVab25lOiAnVVRDJyksIGJ1dCB3aXRob3V0ICdaJyBzdWZmaXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFwcGVuZCAnWicgc28gSmF2YVNjcmlwdCBwYXJzZXMgdGhlbSBhcyBVVEMsIG5vdCBsb2NhbCB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVRpbWUgPSBpdGVtLnN0YXJ0LmRhdGVUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmREYXRlVGltZSA9IGl0ZW0uZW5kLmRhdGVUaW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aW1lem9uZSBpcyBVVEMsIGFwcGVuZCBaIHNvIEpTIHBhcnNlcyBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zdGFydC50aW1lWm9uZSA9PT0gJ1VUQycgJiYgIXN0YXJ0RGF0ZVRpbWUuZW5kc1dpdGgoJ1onKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lID0gc3RhcnREYXRlVGltZSArICdaJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZW5kLnRpbWVab25lID09PSAnVVRDJyAmJiAhZW5kRGF0ZVRpbWUuZW5kc1dpdGgoJ1onKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlVGltZSA9IGVuZERhdGVUaW1lICsgJ1onOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBEYXRlIGFuZCBiYWNrIHRvIElTTyBzdHJpbmcgZm9yIGNvbnNpc3RlbnQgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGVUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IG5ldyBEYXRlKGVuZERhdGVUaW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzeVBlcmlvZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaXRlbS5zdGF0dXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXN1bHRbZW1haWxdID0gYnVzeVBlcmlvZHM7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBvbmxpbmUgbWVldGluZyAobGVnYWN5IC0gdXNlIGNyZWF0ZUNhbGVuZGFyRXZlbnQpCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGV0YWlscyAtIE1lZXRpbmcgZGV0YWlscwogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gTWVldGluZyBpbmZvCiAgICAgKi8KICAgIFRhcmdldE5TLmNyZWF0ZU1lZXRpbmcgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIC8vIERlbGVnYXRlIHRvIGNyZWF0ZUNhbGVuZGFyRXZlbnQgd2l0aCBpc09ubGluZU1lZXRpbmc9dHJ1ZQogICAgICAgIC8vIFVzZSAkLmV4dGVuZCB0byBhdm9pZCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgRGV0YWlscyBvYmplY3QKICAgICAgICB2YXIgTWVldGluZ0RldGFpbHMgPSAkLmV4dGVuZCh7fSwgRGV0YWlscywgeyBpc09ubGluZU1lZXRpbmc6IHRydWUgfSk7CiAgICAgICAgcmV0dXJuIFRhcmdldE5TLmNyZWF0ZUNhbGVuZGFyRXZlbnQoTWVldGluZ0RldGFpbHMpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGNyZWF0ZUNhbGVuZGFyRXZlbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGNhbGVuZGFyIGV2ZW50ICh3aXRoIG9wdGlvbmFsIFRlYW1zIG1lZXRpbmcpCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGV0YWlscyAtIEV2ZW50IGRldGFpbHMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLnN1YmplY3QgLSBFdmVudCBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5zdGFydERhdGVUaW1lIC0gU3RhcnQgdGltZSAoSVNPIHN0cmluZykKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLmVuZERhdGVUaW1lIC0gRW5kIHRpbWUgKElTTyBzdHJpbmcpCiAgICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IERldGFpbHMuYXR0ZW5kZWVzIC0gQXR0ZW5kZWUgZW1haWwgYWRkcmVzc2VzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IERldGFpbHMuaXNPbmxpbmVNZWV0aW5nIC0gV2hldGhlciB0byBjcmVhdGUgVGVhbXMgbWVldGluZwogICAgICogQHBhcmFtIHtTdHJpbmd9IFtEZXRhaWxzLmxvY2F0aW9uXSAtIExvY2F0aW9uIGZvciBvbi1zaXRlIG1lZXRpbmdzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW0RldGFpbHMudGltZVpvbmVdIC0gSUFOQSB0aW1lem9uZQogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gRXZlbnQgaW5mbyB3aXRoIGlkIGFuZCBvcHRpb25hbCBqb2luVXJsCiAgICAgKi8KICAgIFRhcmdldE5TLmNyZWF0ZUNhbGVuZGFyRXZlbnQgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIHZhciBUaW1lWm9uZSA9IERldGFpbHMudGltZVpvbmUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdFdXJvcGUvQmVybGluJzsKCiAgICAgICAgdmFyIGV2ZW50Qm9keSA9IHsKICAgICAgICAgICAgc3ViamVjdDogRGV0YWlscy5zdWJqZWN0IHx8ICdabnVueSBBcHBvaW50bWVudCcsCiAgICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgICAgICBkYXRlVGltZTogRGV0YWlscy5zdGFydERhdGVUaW1lLAogICAgICAgICAgICAgICAgdGltZVpvbmU6IFRpbWVab25lCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgICAgZGF0ZVRpbWU6IERldGFpbHMuZW5kRGF0ZVRpbWUsCiAgICAgICAgICAgICAgICB0aW1lWm9uZTogVGltZVpvbmUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXR0ZW5kZWVzOiAoRGV0YWlscy5hdHRlbmRlZXMgfHwgW10pLm1hcChmdW5jdGlvbiAoZW1haWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGVtYWlsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KQogICAgICAgIH07CgogICAgICAgIC8vIEFkZCBUZWFtcyBtZWV0aW5nIGlmIHJlcXVlc3RlZAogICAgICAgIGlmIChEZXRhaWxzLmlzT25saW5lTWVldGluZykgewogICAgICAgICAgICBldmVudEJvZHkuaXNPbmxpbmVNZWV0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgZXZlbnRCb2R5Lm9ubGluZU1lZXRpbmdQcm92aWRlciA9ICd0ZWFtc0ZvckJ1c2luZXNzJzsKICAgICAgICB9CgogICAgICAgIC8vIEFkZCBsb2NhdGlvbiBmb3Igb24tc2l0ZSBtZWV0aW5ncwogICAgICAgIGlmIChEZXRhaWxzLmxvY2F0aW9uKSB7CiAgICAgICAgICAgIGV2ZW50Qm9keS5sb2NhdGlvbiA9IHsKICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBEZXRhaWxzLmxvY2F0aW9uCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gR3JhcGhBcGlDYWxsKCcvbWUvZXZlbnRzJywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnRCb2R5KQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICAgICAgc3ViamVjdDogZGF0YS5zdWJqZWN0LAogICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogZGF0YS5zdGFydC5kYXRlVGltZSwKICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiBkYXRhLmVuZC5kYXRlVGltZSwKICAgICAgICAgICAgICAgIHRpbWVab25lOiBkYXRhLnN0YXJ0LnRpbWVab25lLAogICAgICAgICAgICAgICAgam9pblVybDogZGF0YS5vbmxpbmVNZWV0aW5nID8gZGF0YS5vbmxpbmVNZWV0aW5nLmpvaW5VcmwgOiBudWxsLAogICAgICAgICAgICAgICAgd2ViTGluazogZGF0YS53ZWJMaW5rLAogICAgICAgICAgICAgICAgb3JnYW5pemVyOiBDdXJyZW50QWNjb3VudCA/IEN1cnJlbnRBY2NvdW50LnVzZXJuYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIGF0dGVuZGVlczogRGV0YWlscy5hdHRlbmRlZXMgfHwgW10KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBkZWxldGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZS9jYW5jZWwgY2FsZW5kYXIgZXZlbnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFdmVudElkIC0gR3JhcGggZXZlbnQgSUQKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFN1Y2Nlc3Mgc3RhdHVzCiAgICAgKi8KICAgIFRhcmdldE5TLmRlbGV0ZUNhbGVuZGFyRXZlbnQgPSBmdW5jdGlvbiAoRXZlbnRJZCkgewogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy9tZS9ldmVudHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChFdmVudElkKSwgewogICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnCiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBIZWxwZXIgRnVuY3Rpb25zCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlIGZyb20gR3JhcGggQVBJCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBVc2VyIHByb2ZpbGUKICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VycmVudFVzZXJQcm9maWxlKCkgewogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy9tZT8kc2VsZWN0PWlkLGRpc3BsYXlOYW1lLG1haWwsam9iVGl0bGUnKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgLy8gQ2FjaGUgcHJvZmlsZSBmb3IgZ2V0Q3VycmVudFVzZXIoKSAtIGhhcyBmdWxsIGRpc3BsYXlOYW1lCiAgICAgICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRhdGEuZGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICAgICAgZW1haWw6IGRhdGEubWFpbCB8fCBDdXJyZW50QWNjb3VudC51c2VybmFtZSwKICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZTogZGF0YS5qb2JUaXRsZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBDdXJyZW50VXNlclByb2ZpbGU7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBhY2NvdW50IGluZm8KICAgICAgICAgICAgICAgIEN1cnJlbnRVc2VyUHJvZmlsZSA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogQ3VycmVudEFjY291bnQubG9jYWxBY2NvdW50SWQsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IEN1cnJlbnRBY2NvdW50Lm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZW1haWw6IEN1cnJlbnRBY2NvdW50LnVzZXJuYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIEN1cnJlbnRVc2VyUHJvZmlsZTsKICAgICAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGVuZHBvaW50IGlzIGluIHRoZSB3aGl0ZWxpc3QKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbmRwb2ludCAtIEFQSSBlbmRwb2ludCB0byB2YWxpZGF0ZQogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsb3dlZAogICAgICovCiAgICBmdW5jdGlvbiBJc0VuZHBvaW50QWxsb3dlZChFbmRwb2ludCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQWxsb3dlZEVuZHBvaW50UGF0dGVybnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKEFsbG93ZWRFbmRwb2ludFBhdHRlcm5zW2ldLnRlc3QoRW5kcG9pbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIE1ha2UgR3JhcGggQVBJIGNhbGwgd2l0aCBhdXRvbWF0aWMgdG9rZW4gYWNxdWlzaXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbmRwb2ludCAtIEFQSSBlbmRwb2ludCAoZS5nLiwgJy9tZS9waG90by8kdmFsdWUnKQogICAgICogQHBhcmFtIHtPYmplY3R9IFtPcHRpb25zXSAtIEZldGNoIG9wdGlvbnMKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fSBBUEkgcmVzcG9uc2UKICAgICAqLwogICAgZnVuY3Rpb24gR3JhcGhBcGlDYWxsKEVuZHBvaW50LCBPcHRpb25zKSB7CiAgICAgICAgT3B0aW9ucyA9IE9wdGlvbnMgfHwge307CgogICAgICAgIGlmICghTXNhbEluc3RhbmNlIHx8ICFDdXJyZW50QWNjb3VudCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdOb3QgYXV0aGVudGljYXRlZCcpKTsKICAgICAgICB9CgogICAgICAgIC8vIFNlY3VyaXR5OiBWYWxpZGF0ZSBlbmRwb2ludCBhZ2FpbnN0IHdoaXRlbGlzdAogICAgICAgIGlmICghSXNFbmRwb2ludEFsbG93ZWQoRW5kcG9pbnQpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0VuZHBvaW50IG5vdCBhbGxvd2VkOiAnICsgRW5kcG9pbnQpKTsKICAgICAgICB9CgogICAgICAgIHZhciB0b2tlblJlcXVlc3QgPSB7CiAgICAgICAgICAgIGFjY291bnQ6IEN1cnJlbnRBY2NvdW50LAogICAgICAgICAgICBzY29wZXM6IEdyYXBoU2NvcGVzCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIE1zYWxJbnN0YW5jZS5hY3F1aXJlVG9rZW5TaWxlbnQodG9rZW5SZXF1ZXN0KQogICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAvLyBUb2tlbiBleHBpcmVkIG9yIG5lZWRzIGludGVyYWN0aW9uCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtc2FsLkludGVyYWN0aW9uUmVxdWlyZWRBdXRoRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXNhbEluc3RhbmNlLmFjcXVpcmVUb2tlblBvcHVwKHRva2VuUmVxdWVzdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHRva2VuUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIHZhciBoZWFkZXJzID0gewogICAgICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgdG9rZW5SZXNwb25zZS5hY2Nlc3NUb2tlbgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZiAoT3B0aW9ucy5ib2R5KSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKEdyYXBoQmFzZVVybCArIEVuZHBvaW50LCB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBPcHRpb25zLm1ldGhvZCB8fCAnR0VUJywKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIGJvZHk6IE9wdGlvbnMuYm9keQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgLy8gSGFuZGxlIERFTEVURSAoMjA0IE5vIENvbnRlbnQpCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZXJyb3JzCiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdHcmFwaCBBUEkgZXJyb3I6ICcgKyByZXNwb25zZS5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIGVycm9yLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYmluYXJ5IHJlc3BvbnNlIChhdmF0YXIpCiAgICAgICAgICAgICAgICBpZiAoT3B0aW9ucy5yZXNwb25zZVR5cGUgPT09ICdibG9iJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSGFuZGxlIEpTT04gcmVzcG9uc2UKICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7CiAgICAgICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUmVnaXN0ZXIgUHJvdmlkZXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIEF1dG8tcmVnaXN0ZXIgd2hlbiBzY3JpcHQgbG9hZHMKICAgIGlmIChDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlJlZ2lzdGVyUHJvdmlkZXIpIHsKICAgICAgICBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUmVnaXN0ZXJQcm92aWRlcignTTM2NScsIFRhcmdldE5TKTsKICAgIH0KCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUgfHwge30pKTsK</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.Provider.Znuny.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqICAgICAgWm51bnkgUHJvdmlkZXIgZm9yIENvbGxhYm9yYXRpb24gQWRkLW9uCiAqCiAqICAgICAgVGhpcyBwcm92aWRlciB1c2VzIGxvY2FsIFpudW55IGRhdGEgKEN1c3RvbWVyVXNlciwgVXNlcikgYXMgYSBmYWxsYmFjawogKiAgICAgIHdoZW4gdGhlIHByaW1hcnkgcHJvdmlkZXIgKGUuZy4sIE0zNjUpIGZhaWxzIG9yIGlzIG5vdCBhdmFpbGFibGUuCiAqCiAqICAgICAgRmVhdHVyZXM6CiAqICAgICAgLSBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCAodXNlcyBjdXJyZW50IFpudW55IHNlc3Npb24pCiAqICAgICAgLSBTVkcgYXZhdGFycyB3aXRoIGluaXRpYWxzCiAqICAgICAgLSBQcm9maWxlIGRhdGEgZnJvbSBDdXN0b21lclVzZXIvVXNlciBkYXRhYmFzZQogKiAgICAgIC0gTm8gcHJlc2VuY2UsIGNoYXQsIGNhbGwsIG9yIG1lZXRpbmcgZmVhdHVyZXMKICoKICogICAgICBUeXBpY2FsIHVzZSBjYXNlOiBGYWxsYmFjayBwcm92aWRlciB3aGVuIE0zNjUgdXNlciBub3QgZm91bmQKICovCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHVzZXIgKGZyb20gWm51bnkgc2Vzc2lvbikKICAgICAqLwogICAgdmFyIEN1cnJlbnRVc2VyID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ2FjaGUgZm9yIHByb2ZpbGUgZGF0YSB0byBhdm9pZCByZXBlYXRlZCBBSkFYIGNhbGxzCiAgICAgKi8KICAgIHZhciBQcm9maWxlQ2FjaGUgPSB7fTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIENhcGFiaWxpdGllcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAZGVzY3JpcHRpb24gQ2FwYWJpbGl0aWVzIHRoaXMgcHJvdmlkZXIgc3VwcG9ydHMKICAgICAqLwogICAgVGFyZ2V0TlMuY2FwYWJpbGl0aWVzID0gewogICAgICAgIGF2YXRhcjogdHJ1ZSwgICAgICAgICAgIC8vIFNWRyB3aXRoIGluaXRpYWxzCiAgICAgICAgcHJlc2VuY2U6IGZhbHNlLCAgICAgICAgLy8gTm8gbGl2ZSBwcmVzZW5jZSBpbiBabnVueQogICAgICAgIHByb2ZpbGU6IHRydWUsICAgICAgICAgIC8vIEN1c3RvbWVyVXNlci9Vc2VyIGRhdGEKICAgICAgICBjaGF0OiBmYWxzZSwgICAgICAgICAgICAvLyBObyBjaGF0IGludGVncmF0aW9uCiAgICAgICAgY2FsbDogZmFsc2UsICAgICAgICAgICAgLy8gTm8gY2FsbCBpbnRlZ3JhdGlvbgogICAgICAgIGZyZWVCdXN5OiBmYWxzZSwgICAgICAgIC8vIE5vIGNhbGVuZGFyIGludGVncmF0aW9uCiAgICAgICAgY3JlYXRlTWVldGluZzogZmFsc2UsCiAgICAgICAgY3JlYXRlQ2FsZW5kYXJFdmVudDogZmFsc2UsCiAgICAgICAgZGVsZXRlQ2FsZW5kYXJFdmVudDogZmFsc2UsCiAgICAgICAgb3V0T2ZPZmZpY2U6IHRydWUgICAgICAgLy8gWm51bnkgYWdlbnQgT09GIHZpYSB1c2VyIHByZWZlcmVuY2VzCiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJvdmlkZXIgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIGluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIFpudW55IHByb3ZpZGVyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQ29uZmlnIC0gUHJvdmlkZXIgY29uZmlndXJhdGlvbiAobm90IHVzZWQpCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgaW1tZWRpYXRlbHkKICAgICAqLwogICAgVGFyZ2V0TlMuaW5pdCA9IGZ1bmN0aW9uIChDb25maWcpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgdHJ5U2lsZW50TG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFRyeSBzaWxlbnQgbG9naW4gLSBhbHdheXMgc3VjY2VlZHMgKHVzZXMgWm51bnkgc2Vzc2lvbikKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMudHJ5U2lsZW50TG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdXNlciBmcm9tIENvbGxhYm9yYXRpb24gY29uZmlnIChzZXQgYnkgYmFja2VuZCkKICAgICAgICB2YXIgQ29sbGFiQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdDb2xsYWJvcmF0aW9uJykgfHwge307CgogICAgICAgIEN1cnJlbnRVc2VyID0gewogICAgICAgICAgICBpZDogQ29yZS5Db25maWcuR2V0KCdVc2VySUQnKSB8fCAnem51bnktdXNlcicsCiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBDb2xsYWJDb25maWcuVXNlckZ1bGxuYW1lIHx8IENvcmUuQ29uZmlnLkdldCgnVXNlckZ1bGxuYW1lJykgfHwgJ1pudW55IEFnZW50JywKICAgICAgICAgICAgZW1haWw6IENvbGxhYkNvbmZpZy5Vc2VyRW1haWwgfHwgQ29yZS5Db25maWcuR2V0KCdVc2VyRW1haWwnKSB8fCAnJywKICAgICAgICAgICAgbG9naW5OYW1lOiBDb3JlLkNvbmZpZy5HZXQoJ1VzZXJMb2dpbicpIHx8ICcnCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDdXJyZW50VXNlcik7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgbG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEludGVyYWN0aXZlIGxvZ2luIC0gc2FtZSBhcyBzaWxlbnQgbG9naW4KICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMubG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gU2FtZSBhcyBzaWxlbnQgbG9naW4gZm9yIFpudW55IHByb3ZpZGVyCiAgICAgICAgcmV0dXJuIFRhcmdldE5TLnRyeVNpbGVudExvZ2luKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgbG9nb3V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBMb2dvdXQgLSBqdXN0IGNsZWFycyBsb2NhbCBzdGF0ZQogICAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIGltbWVkaWF0ZWx5CiAgICAgKi8KICAgIFRhcmdldE5TLmxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDdXJyZW50VXNlciA9IG51bGw7CiAgICAgICAgUHJvZmlsZUNhY2hlID0ge307CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGlzTG9nZ2VkSW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGxvZ2luIHN0YXR1cyAtIGFsd2F5cyB0cnVlIGlmIFpudW55IHNlc3Npb24gZXhpc3RzCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZQogICAgICovCiAgICBUYXJnZXROUy5pc0xvZ2dlZEluID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEN1cnJlbnRVc2VyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCB1c2VyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIEN1cnJlbnRVc2VyOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEF2YXRhcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGF2YXRhciAtIHVzZXMgY2VudHJhbCBTVkcgZ2VuZXJhdGlvbiB3aXRoIGluaXRpYWxzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEJhc2U2NCBkYXRhIFVSTCBvZiBTVkcgYXZhdGFyCiAgICAgKi8KICAgIFRhcmdldE5TLmdldEF2YXRhciA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIC8vIEZpcnN0IHRyeSB0byBnZXQgcHJvZmlsZSB0byB1c2UgcmVhbCBuYW1lIGZvciBpbml0aWFscwogICAgICAgIHJldHVybiBUYXJnZXROUy5nZXRQcm9maWxlKEVtYWlsKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgLy8gVXNlIGNlbnRyYWwgZmFsbGJhY2sgYXZhdGFyIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsLCBQcm9maWxlLmRpc3BsYXlOYW1lKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZW1haWwgZm9yIGluaXRpYWxzCiAgICAgICAgICAgICAgICByZXR1cm4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKTsKICAgICAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0UHJlc2VuY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBwcmVzZW5jZSAtIGFsd2F5cyByZXR1cm5zIHVua25vd24gKG5vdCBzdXBwb3J0ZWQpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFByZXNlbmNlIG9iamVjdCB3aXRoIHVua25vd24gc3RhdHVzCiAgICAgKi8KICAgIFRhcmdldE5TLmdldFByZXNlbmNlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7CiAgICAgICAgICAgIHN0YXR1czogJ3Vua25vd24nLAogICAgICAgICAgICBhY3Rpdml0eTogJ1Vua25vd24nCiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0T3V0T2ZPZmZpY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBvdXQtb2Ytb2ZmaWNlIHN0YXR1cyBmcm9tIFpudW55IGFnZW50IHByZWZlcmVuY2VzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdHxudWxsPn0gT09GIG9iamVjdCBvciBudWxsIGlmIG5vdCBhY3RpdmUKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldE91dE9mT2ZmaWNlJywKICAgICAgICAgICAgICAgICAgICBFbWFpbDogRW1haWwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFJlc3BvbnNlLk91dE9mT2ZmaWNlIHx8IG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBwcm9maWxlIGZyb20gWm51bnkgZGF0YWJhc2UgKEN1c3RvbWVyVXNlciBvciBVc2VyKQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gVXNlciBlbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5nZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBlbWFpbCBwcm92aWRlZCcpKTsKICAgICAgICB9CgogICAgICAgIHZhciBMb3dlckVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gU0VDVVJJVFkgKFM5KTogUmUtZW5hYmxlZCBjYWNoZSAod2FzIGRpc2FibGVkIGZvciB0ZXN0aW5nKQogICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0CiAgICAgICAgaWYgKFByb2ZpbGVDYWNoZVtMb3dlckVtYWlsXSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFByb2ZpbGVDYWNoZVtMb3dlckVtYWlsXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIGJhY2tlbmQgdG8gZ2V0IHByb2ZpbGUKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldFVzZXJQcm9maWxlJywKICAgICAgICAgICAgICAgICAgICBFbWFpbDogRW1haWwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcyAmJiBSZXNwb25zZS5Qcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUNhY2hlW0xvd2VyRW1haWxdID0gUmVzcG9uc2UuUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShSZXNwb25zZS5Qcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbWluaW1hbCBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBNaW5pbWFsUHJvZmlsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBFbWFpbC5zcGxpdCgnQCcpWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IEVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVDYWNoZVtMb3dlckVtYWlsXSA9IE1pbmltYWxQcm9maWxlOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKE1pbmltYWxQcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q2hhdExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBjaGF0IGxpbmsgLSBub3Qgc3VwcG9ydGVkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q2hhdExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRDYWxsTGluawogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGNhbGwgbGluayAtIG5vdCBzdXBwb3J0ZWQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gbnVsbAogICAgICovCiAgICBUYXJnZXROUy5nZXRDYWxsTGluayA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEZyZWVCdXN5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZnJlZS9idXN5IGRhdGEgLSBub3Qgc3VwcG9ydGVkCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBFbXB0eSByZXN1bHQKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0RnJlZUJ1c3kgPSBmdW5jdGlvbiAoRW1haWxzLCBTdGFydCwgRW5kKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCcpKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgbWVldGluZyAtIG5vdCBzdXBwb3J0ZWQKICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZWplY3RlZCBwcm9taXNlCiAgICAgKi8KICAgIFRhcmdldE5TLmNyZWF0ZU1lZXRpbmcgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgY3JlYXRlQ2FsZW5kYXJFdmVudAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGNhbGVuZGFyIGV2ZW50IC0gbm90IHN1cHBvcnRlZAogICAgICogQHJldHVybnMge1Byb21pc2V9IFJlamVjdGVkIHByb21pc2UKICAgICAqLwogICAgVGFyZ2V0TlMuY3JlYXRlQ2FsZW5kYXJFdmVudCA9IGZ1bmN0aW9uIChEZXRhaWxzKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCcpKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBkZWxldGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgY2FsZW5kYXIgZXZlbnQgLSBub3Qgc3VwcG9ydGVkCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVqZWN0ZWQgcHJvbWlzZQogICAgICovCiAgICBUYXJnZXROUy5kZWxldGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKEV2ZW50SWQpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkJykpOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFJlZ2lzdGVyIFByb3ZpZGVyCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBBdXRvLXJlZ2lzdGVyIHdoZW4gc2NyaXB0IGxvYWRzCiAgICBpZiAoQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uICYmIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5SZWdpc3RlclByb3ZpZGVyKSB7CiAgICAgICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlJlZ2lzdGVyUHJvdmlkZXIoJ1pudW55JywgVGFyZ2V0TlMpOwogICAgfQoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkgfHwge30pKTsK</File>

        <!-- JavaScript - Third Party (MSAL.js) -->
        <File Permission="660" Location="var/httpd/htdocs/js/thirdparty/msal-browser-4.27.0/msal-browser.min.js" Encode="Base64">LyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjQuMjcuMCAyMDI1LTEyLTA0ICovCiJ1c2Ugc3RyaWN0IjshZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP3QoZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sdCk6dCgoZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5tc2FsPXt9KX0odGhpcywoZnVuY3Rpb24oZSl7Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqLwpjb25zdCB0PXtMSUJSQVJZX05BTUU6Ik1TQUwuSlMiLFNLVToibXNhbC5qcy5jb21tb24iLERFRkFVTFRfQVVUSE9SSVRZOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY29tbW9uLyIsREVGQVVMVF9BVVRIT1JJVFlfSE9TVDoibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSIsREVGQVVMVF9DT01NT05fVEVOQU5UOiJjb21tb24iLEFERlM6ImFkZnMiLERTVFM6ImRzdHN2MiIsQUFEX0lOU1RBTkNFX0RJU0NPVkVSWV9FTkRQVDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2NvbW1vbi9kaXNjb3ZlcnkvaW5zdGFuY2U/YXBpLXZlcnNpb249MS4xJmF1dGhvcml6YXRpb25fZW5kcG9pbnQ9IixDSUFNX0FVVEhfVVJMOiIuY2lhbWxvZ2luLmNvbSIsQUFEX1RFTkFOVF9ET01BSU5fU1VGRklYOiIub25taWNyb3NvZnQuY29tIixSRVNPVVJDRV9ERUxJTToifCIsTk9fQUNDT1VOVDoiTk9fQUNDT1VOVCIsQ0xBSU1TOiJjbGFpbXMiLENPTlNVTUVSX1VUSUQ6IjkxODgwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsT1BFTklEX1NDT1BFOiJvcGVuaWQiLFBST0ZJTEVfU0NPUEU6InByb2ZpbGUiLE9GRkxJTkVfQUNDRVNTX1NDT1BFOiJvZmZsaW5lX2FjY2VzcyIsRU1BSUxfU0NPUEU6ImVtYWlsIixDT0RFX0dSQU5UX1RZUEU6ImF1dGhvcml6YXRpb25fY29kZSIsUlRfR1JBTlRfVFlQRToicmVmcmVzaF90b2tlbiIsUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0Q6IlMyNTYiLFVSTF9GT1JNX0NPTlRFTlRfVFlQRToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLEFVVEhPUklaQVRJT05fUEVORElORzoiYXV0aG9yaXphdGlvbl9wZW5kaW5nIixOT1RfREVGSU5FRDoibm90X2RlZmluZWQiLEVNUFRZX1NUUklORzoiIixOT1RfQVBQTElDQUJMRToiTi9BIixOT1RfQVZBSUxBQkxFOiJOb3QgQXZhaWxhYmxlIixGT1JXQVJEX1NMQVNIOiIvIixJTURTX0VORFBPSU5UOiJodHRwOi8vMTY5LjI1NC4xNjkuMjU0L21ldGFkYXRhL2luc3RhbmNlL2NvbXB1dGUvbG9jYXRpb24iLElNRFNfVkVSU0lPTjoiMjAyMC0wNi0wMSIsSU1EU19USU1FT1VUOjJlMyxBWlVSRV9SRUdJT05fQVVUT19ESVNDT1ZFUl9GTEFHOiJUcnlBdXRvRGV0ZWN0IixSRUdJT05BTF9BVVRIX1BVQkxJQ19DTE9VRF9TVUZGSVg6ImxvZ2luLm1pY3Jvc29mdC5jb20iLEtOT1dOX1BVQkxJQ19DTE9VRFM6WyJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIiwibG9naW4ud2luZG93cy5uZXQiLCJsb2dpbi5taWNyb3NvZnQuY29tIiwic3RzLndpbmRvd3MubmV0Il0sU0hSX05PTkNFX1ZBTElESVRZOjI0MCxJTlZBTElEX0lOU1RBTkNFOiJpbnZhbGlkX2luc3RhbmNlIn0scj0yMDAsbj00MDAsbz00MDAsaT00OTkscz01MDAsYT01OTksYz0iR0VUIixsPSJQT1NUIixoPVt0Lk9QRU5JRF9TQ09QRSx0LlBST0ZJTEVfU0NPUEUsdC5PRkZMSU5FX0FDQ0VTU19TQ09QRV0sZD1bLi4uaCx0LkVNQUlMX1NDT1BFXSx1PSJDb250ZW50LVR5cGUiLGc9IkNvbnRlbnQtTGVuZ3RoIixwPSJSZXRyeS1BZnRlciIsbT0iWC1BbmNob3JNYWlsYm94IixmPSJXV1ctQXV0aGVudGljYXRlIix5PSJBdXRoZW50aWNhdGlvbi1JbmZvIixDPSJ4LW1zLXJlcXVlc3QtaWQiLHc9IngtbXMtaHR0cHZlciIsdj0iYWN0aXZlLWFjY291bnQtZmlsdGVycyIsST0iY29tbW9uIixUPSJvcmdhbml6YXRpb25zIixBPSJjb25zdW1lcnMiLGs9ImFjY2Vzc190b2tlbiIsUz0ieG1zX2NjIixiPXtMT0dJTjoibG9naW4iLFNFTEVDVF9BQ0NPVU5UOiJzZWxlY3RfYWNjb3VudCIsQ09OU0VOVDoiY29uc2VudCIsTk9ORToibm9uZSIsQ1JFQVRFOiJjcmVhdGUiLE5PX1NFU1NJT046Im5vX3Nlc3Npb24ifSxFPSJjb2RlIixSPSJpZF90b2tlbiB0b2tlbiByZWZyZXNoX3Rva2VuIixfPXtRVUVSWToicXVlcnkiLEZSQUdNRU5UOiJmcmFnbWVudCJ9LFA9InF1ZXJ5IixNPSJhdXRob3JpemF0aW9uX2NvZGUiLE89InJlZnJlc2hfdG9rZW4iLHE9Ik1TU1RTIixOPSJBREZTIixVPSJHZW5lcmljIixMPSItIixEPSIuIixIPXtJRF9UT0tFTjoiSWRUb2tlbiIsQUNDRVNTX1RPS0VOOiJBY2Nlc3NUb2tlbiIsQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUU6IkFjY2Vzc1Rva2VuX1dpdGhfQXV0aFNjaGVtZSIsUkVGUkVTSF9UT0tFTjoiUmVmcmVzaFRva2VuIn0seD0iYXBwbWV0YWRhdGEiLEI9IjEiLEY9ImF1dGhvcml0eS1tZXRhZGF0YSIsej04NjQwMCxLPSJjb25maWciLEc9ImNhY2hlIiwkPSJuZXR3b3JrIixRPSJoYXJkY29kZWRfdmFsdWVzIixqPXtTQ0hFTUFfVkVSU0lPTjo1LE1BWF9MQVNUX0hFQURFUl9CWVRFUzozMzAsTUFYX0NBQ0hFRF9FUlJPUlM6NTAsQ0FDSEVfS0VZOiJzZXJ2ZXItdGVsZW1ldHJ5IixDQVRFR09SWV9TRVBBUkFUT1I6InwiLFZBTFVFX1NFUEFSQVRPUjoiLCIsT1ZFUkZMT1dfVFJVRToiMSIsT1ZFUkZMT1dfRkFMU0U6IjAiLFVOS05PV05fRVJST1I6InVua25vd25fZXJyb3IifSxXPXtCRUFSRVI6IkJlYXJlciIsUE9QOiJwb3AiLFNTSDoic3NoLWNlcnQifSxWPTYwLEo9MzYwMCxZPSJ0aHJvdHRsaW5nIixYPSJyZXRyeS1hZnRlciwgaDQyOSIsWj0iaW52YWxpZF9ncmFudCIsZWU9ImNsaWVudF9taXNtYXRjaCIsdGU9IjEiLHJlPSIzIixuZT0iNCIsb2U9IjIiLGllPSI0IixzZT0iNSIsYWU9IjAiLGNlPSIxIixsZT0iMiIsaGU9IjMiLGRlPSI0Iix1ZT17Snd0OiJKV1QiLEp3azoiSldLIixQb3A6InBvcCJ9LGdlPSJ1bmV4cGVjdGVkX2Vycm9yIixwZT0icG9zdF9yZXF1ZXN0X2ZhaWxlZCI7dmFyIG1lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBvc3RSZXF1ZXN0RmFpbGVkOnBlLHVuZXhwZWN0ZWRFcnJvcjpnZX0pOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBmZT17W2dlXToiVW5leHBlY3RlZCBlcnJvciBpbiBhdXRoZW50aWNhdGlvbi4iLFtwZV06IlBvc3QgcmVxdWVzdCBmYWlsZWQgZnJvbSB0aGUgbmV0d29yaywgY291bGQgYmUgYSA0eHgvNXh4IG9yIGEgbmV0d29yayB1bmF2YWlsYWJpbGl0eS4gUGxlYXNlIGNoZWNrIHRoZSBleGFjdCBlcnJvciBjb2RlIGZvciBkZXRhaWxzLiJ9LHllPXt1bmV4cGVjdGVkRXJyb3I6e2NvZGU6Z2UsZGVzYzpmZVtnZV19LHBvc3RSZXF1ZXN0RmFpbGVkOntjb2RlOnBlLGRlc2M6ZmVbcGVdfX07Y2xhc3MgQ2UgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIocj9gJHtlfTogJHtyfWA6ZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsQ2UucHJvdG90eXBlKSx0aGlzLmVycm9yQ29kZT1lfHx0LkVNUFRZX1NUUklORyx0aGlzLmVycm9yTWVzc2FnZT1yfHx0LkVNUFRZX1NUUklORyx0aGlzLnN1YkVycm9yPW58fHQuRU1QVFlfU1RSSU5HLHRoaXMubmFtZT0iQXV0aEVycm9yIn1zZXRDb3JyZWxhdGlvbklkKGUpe3RoaXMuY29ycmVsYXRpb25JZD1lfX1mdW5jdGlvbiB3ZShlLHQpe3JldHVybiBuZXcgQ2UoZSx0P2Ake2ZlW2VdfSAke3R9YDpmZVtlXSl9Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NvbnN0IHZlPSJjbGllbnRfaW5mb19kZWNvZGluZ19lcnJvciIsSWU9ImNsaWVudF9pbmZvX2VtcHR5X2Vycm9yIixUZT0idG9rZW5fcGFyc2luZ19lcnJvciIsQWU9Im51bGxfb3JfZW1wdHlfdG9rZW4iLGtlPSJlbmRwb2ludHNfcmVzb2x1dGlvbl9lcnJvciIsU2U9Im5ldHdvcmtfZXJyb3IiLGJlPSJvcGVuaWRfY29uZmlnX2Vycm9yIixFZT0iaGFzaF9ub3RfZGVzZXJpYWxpemVkIixSZT0iaW52YWxpZF9zdGF0ZSIsX2U9InN0YXRlX21pc21hdGNoIixQZT0ic3RhdGVfbm90X2ZvdW5kIixNZT0ibm9uY2VfbWlzbWF0Y2giLE9lPSJhdXRoX3RpbWVfbm90X2ZvdW5kIixxZT0ibWF4X2FnZV90cmFuc3BpcmVkIixOZT0ibXVsdGlwbGVfbWF0Y2hpbmdfdG9rZW5zIixVZT0ibXVsdGlwbGVfbWF0Y2hpbmdfYWNjb3VudHMiLExlPSJtdWx0aXBsZV9tYXRjaGluZ19hcHBNZXRhZGF0YSIsRGU9InJlcXVlc3RfY2Fubm90X2JlX21hZGUiLEhlPSJjYW5ub3RfcmVtb3ZlX2VtcHR5X3Njb3BlIix4ZT0iY2Fubm90X2FwcGVuZF9zY29wZXNldCIsQmU9ImVtcHR5X2lucHV0X3Njb3Blc2V0IixGZT0iZGV2aWNlX2NvZGVfcG9sbGluZ19jYW5jZWxsZWQiLHplPSJkZXZpY2VfY29kZV9leHBpcmVkIixLZT0iZGV2aWNlX2NvZGVfdW5rbm93bl9lcnJvciIsR2U9Im5vX2FjY291bnRfaW5fc2lsZW50X3JlcXVlc3QiLCRlPSJpbnZhbGlkX2NhY2hlX3JlY29yZCIsUWU9ImludmFsaWRfY2FjaGVfZW52aXJvbm1lbnQiLGplPSJub19hY2NvdW50X2ZvdW5kIixXZT0ibm9fY3J5cHRvX29iamVjdCIsVmU9InVuZXhwZWN0ZWRfY3JlZGVudGlhbF90eXBlIixKZT0iaW52YWxpZF9hc3NlcnRpb24iLFllPSJpbnZhbGlkX2NsaWVudF9jcmVkZW50aWFsIixYZT0idG9rZW5fcmVmcmVzaF9yZXF1aXJlZCIsWmU9InVzZXJfdGltZW91dF9yZWFjaGVkIixldD0idG9rZW5fY2xhaW1zX2NuZl9yZXF1aXJlZF9mb3Jfc2lnbmVkand0Iix0dD0iYXV0aG9yaXphdGlvbl9jb2RlX21pc3NpbmdfZnJvbV9zZXJ2ZXJfcmVzcG9uc2UiLHJ0PSJiaW5kaW5nX2tleV9ub3RfcmVtb3ZlZCIsbnQ9ImVuZF9zZXNzaW9uX2VuZHBvaW50X25vdF9zdXBwb3J0ZWQiLG90PSJrZXlfaWRfbWlzc2luZyIsaXQ9Im5vX25ldHdvcmtfY29ubmVjdGl2aXR5IixzdD0idXNlcl9jYW5jZWxlZCIsYXQ9Im1pc3NpbmdfdGVuYW50X2lkX2Vycm9yIixjdD0ibWV0aG9kX25vdF9pbXBsZW1lbnRlZCIsbHQ9Im5lc3RlZF9hcHBfYXV0aF9icmlkZ2VfZGlzYWJsZWQiLGh0PSJwbGF0Zm9ybV9icm9rZXJfZXJyb3IiO3ZhciBkdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhdXRoVGltZU5vdEZvdW5kOk9lLGF1dGhvcml6YXRpb25Db2RlTWlzc2luZ0Zyb21TZXJ2ZXJSZXNwb25zZTp0dCxiaW5kaW5nS2V5Tm90UmVtb3ZlZDpydCxjYW5ub3RBcHBlbmRTY29wZVNldDp4ZSxjYW5ub3RSZW1vdmVFbXB0eVNjb3BlOkhlLGNsaWVudEluZm9EZWNvZGluZ0Vycm9yOnZlLGNsaWVudEluZm9FbXB0eUVycm9yOkllLGRldmljZUNvZGVFeHBpcmVkOnplLGRldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkOkZlLGRldmljZUNvZGVVbmtub3duRXJyb3I6S2UsZW1wdHlJbnB1dFNjb3BlU2V0OkJlLGVuZFNlc3Npb25FbmRwb2ludE5vdFN1cHBvcnRlZDpudCxlbmRwb2ludFJlc29sdXRpb25FcnJvcjprZSxoYXNoTm90RGVzZXJpYWxpemVkOkVlLGludmFsaWRBc3NlcnRpb246SmUsaW52YWxpZENhY2hlRW52aXJvbm1lbnQ6UWUsaW52YWxpZENhY2hlUmVjb3JkOiRlLGludmFsaWRDbGllbnRDcmVkZW50aWFsOlllLGludmFsaWRTdGF0ZTpSZSxrZXlJZE1pc3Npbmc6b3QsbWF4QWdlVHJhbnNwaXJlZDpxZSxtZXRob2ROb3RJbXBsZW1lbnRlZDpjdCxtaXNzaW5nVGVuYW50SWRFcnJvcjphdCxtdWx0aXBsZU1hdGNoaW5nQWNjb3VudHM6VWUsbXVsdGlwbGVNYXRjaGluZ0FwcE1ldGFkYXRhOkxlLG11bHRpcGxlTWF0Y2hpbmdUb2tlbnM6TmUsbmVzdGVkQXBwQXV0aEJyaWRnZURpc2FibGVkOmx0LG5ldHdvcmtFcnJvcjpTZSxub0FjY291bnRGb3VuZDpqZSxub0FjY291bnRJblNpbGVudFJlcXVlc3Q6R2Usbm9DcnlwdG9PYmplY3Q6V2Usbm9OZXR3b3JrQ29ubmVjdGl2aXR5Oml0LG5vbmNlTWlzbWF0Y2g6TWUsbnVsbE9yRW1wdHlUb2tlbjpBZSxvcGVuSWRDb25maWdFcnJvcjpiZSxwbGF0Zm9ybUJyb2tlckVycm9yOmh0LHJlcXVlc3RDYW5ub3RCZU1hZGU6RGUsc3RhdGVNaXNtYXRjaDpfZSxzdGF0ZU5vdEZvdW5kOlBlLHRva2VuQ2xhaW1zQ25mUmVxdWlyZWRGb3JTaWduZWRKd3Q6ZXQsdG9rZW5QYXJzaW5nRXJyb3I6VGUsdG9rZW5SZWZyZXNoUmVxdWlyZWQ6WGUsdW5leHBlY3RlZENyZWRlbnRpYWxUeXBlOlZlLHVzZXJDYW5jZWxlZDpzdCx1c2VyVGltZW91dFJlYWNoZWQ6WmV9KTsKLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgdXQ9e1t2ZV06IlRoZSBjbGllbnQgaW5mbyBjb3VsZCBub3QgYmUgcGFyc2VkL2RlY29kZWQgY29ycmVjdGx5IixbSWVdOiJUaGUgY2xpZW50IGluZm8gd2FzIGVtcHR5IixbVGVdOiJUb2tlbiBjYW5ub3QgYmUgcGFyc2VkIixbQWVdOiJUaGUgdG9rZW4gaXMgbnVsbCBvciBlbXB0eSIsW2tlXToiRW5kcG9pbnRzIGNhbm5vdCBiZSByZXNvbHZlZCIsW1NlXToiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIsW2JlXToiQ291bGQgbm90IHJldHJpZXZlIGVuZHBvaW50cy4gQ2hlY2sgeW91ciBhdXRob3JpdHkgYW5kIHZlcmlmeSB0aGUgLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24gZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVxdWlyZWQgZW5kcG9pbnRzLiIsW0VlXToiVGhlIGhhc2ggcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkIixbUmVdOiJTdGF0ZSB3YXMgbm90IHRoZSBleHBlY3RlZCBmb3JtYXQiLFtfZV06IlN0YXRlIG1pc21hdGNoIGVycm9yIixbUGVdOiJTdGF0ZSBub3QgZm91bmQiLFtNZV06Ik5vbmNlIG1pc21hdGNoIGVycm9yIixbT2VdOiJNYXggQWdlIHdhcyByZXF1ZXN0ZWQgYW5kIHRoZSBJRCB0b2tlbiBpcyBtaXNzaW5nIHRoZSBhdXRoX3RpbWUgdmFyaWFibGUuIGF1dGhfdGltZSBpcyBhbiBvcHRpb25hbCBjbGFpbSBhbmQgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCAtIGl0IG11c3QgYmUgZW5hYmxlZC4gU2VlIGh0dHBzOi8vYWthLm1zL21zYWxqcy9vcHRpb25hbC1jbGFpbXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uIixbcWVdOiJNYXggQWdlIGlzIHNldCB0byAwLCBvciB0b28gbXVjaCB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGVuZC11c2VyIGF1dGhlbnRpY2F0aW9uLiIsW05lXToiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIHRva2VucyBzYXRpc2Z5aW5nIHRoZSByZXF1aXJlbWVudHMuIENhbGwgQWNxdWlyZVRva2VuIGFnYWluIHByb3ZpZGluZyBtb3JlIHJlcXVpcmVtZW50cyBzdWNoIGFzIGF1dGhvcml0eSBvciBhY2NvdW50LiIsW1VlXToiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFBsZWFzZSBwYXNzIG1vcmUgaW5mbyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgYWNjb3VudCIsW0xlXToiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIGFwcE1ldGFkYXRhIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFBsZWFzZSBwYXNzIG1vcmUgaW5mbyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgYXBwTWV0YWRhdGEiLFtEZV06IlRva2VuIHJlcXVlc3QgY2Fubm90IGJlIG1hZGUgd2l0aG91dCBhdXRob3JpemF0aW9uIGNvZGUgb3IgcmVmcmVzaCB0b2tlbi4iLFtIZV06IkNhbm5vdCByZW1vdmUgbnVsbCBvciBlbXB0eSBzY29wZSBmcm9tIFNjb3BlU2V0IixbeGVdOiJDYW5ub3QgYXBwZW5kIFNjb3BlU2V0IixbQmVdOiJFbXB0eSBpbnB1dCBTY29wZVNldCBjYW5ub3QgYmUgcHJvY2Vzc2VkIixbRmVdOiJDYWxsZXIgaGFzIGNhbmNlbGxlZCB0b2tlbiBlbmRwb2ludCBwb2xsaW5nIGR1cmluZyBkZXZpY2UgY29kZSBmbG93IGJ5IHNldHRpbmcgRGV2aWNlQ29kZVJlcXVlc3QuY2FuY2VsID0gdHJ1ZS4iLFt6ZV06IkRldmljZSBjb2RlIGlzIGV4cGlyZWQuIixbS2VdOiJEZXZpY2UgY29kZSBzdG9wcGVkIHBvbGxpbmcgZm9yIHVua25vd24gcmVhc29ucy4iLFtHZV06IlBsZWFzZSBwYXNzIGFuIGFjY291bnQgb2JqZWN0LCBzaWxlbnQgZmxvdyBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgYWNjb3VudCBpbmZvcm1hdGlvbiIsWyRlXToiQ2FjaGUgcmVjb3JkIG9iamVjdCB3YXMgbnVsbCBvciB1bmRlZmluZWQuIixbUWVdOiJJbnZhbGlkIGVudmlyb25tZW50IHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgY2FjaGUgZW50cnkiLFtqZV06Ik5vIGFjY291bnQgZm91bmQgaW4gY2FjaGUgZm9yIGdpdmVuIGtleS4iLFtXZV06Ik5vIGNyeXB0byBvYmplY3QgZGV0ZWN0ZWQuIixbVmVdOiJVbmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZS4iLFtKZV06IkNsaWVudCBhc3NlcnRpb24gbXVzdCBtZWV0IHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW4gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUiLFtZZV06IkNsaWVudCBjcmVkZW50aWFsIChzZWNyZXQsIGNlcnRpZmljYXRlLCBvciBhc3NlcnRpb24pIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gY3JlYXRpbmcgYSBjb25maWRlbnRpYWwgY2xpZW50LiBBbiBhcHBsaWNhdGlvbiBzaG91bGQgYXQgbW9zdCBoYXZlIG9uZSBjcmVkZW50aWFsIixbWGVdOiJDYW5ub3QgcmV0dXJuIHRva2VuIGZyb20gY2FjaGUgYmVjYXVzZSBpdCBtdXN0IGJlIHJlZnJlc2hlZC4gVGhpcyBtYXkgYmUgZHVlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6IGZvcmNlUmVmcmVzaCBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIGNsYWltcyBoYXZlIGJlZW4gcmVxdWVzdGVkLCB0aGVyZSBpcyBubyBjYWNoZWQgYWNjZXNzIHRva2VuIG9yIGl0IGlzIGV4cGlyZWQuIixbWmVdOiJVc2VyIGRlZmluZWQgdGltZW91dCBmb3IgZGV2aWNlIGNvZGUgcG9sbGluZyByZWFjaGVkIixbZXRdOiJDYW5ub3QgZ2VuZXJhdGUgYSBQT1Agand0IGlmIHRoZSB0b2tlbl9jbGFpbXMgYXJlIG5vdCBwb3B1bGF0ZWQiLFt0dF06IlNlcnZlciByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml6YXRpb24gY29kZSB0byBwcm9jZWVkIixbcnRdOiJDb3VsZCBub3QgcmVtb3ZlIHRoZSBjcmVkZW50aWFsJ3MgYmluZGluZyBrZXkgZnJvbSBzdG9yYWdlLiIsW250XToiVGhlIHByb3ZpZGVkIGF1dGhvcml0eSBkb2VzIG5vdCBzdXBwb3J0IGxvZ291dCIsW290XToiQSBrZXlJZCB2YWx1ZSBpcyBtaXNzaW5nIGZyb20gdGhlIHJlcXVlc3RlZCBib3VuZCB0b2tlbidzIGNhY2hlIHJlY29yZCBhbmQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIHRva2VuIHRvIGl0J3Mgc3RvcmVkIGJpbmRpbmcga2V5LiIsW2l0XToiTm8gbmV0d29yayBjb25uZWN0aXZpdHkuIENoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4iLFtzdF06IlVzZXIgY2FuY2VsbGVkIHRoZSBmbG93LiIsW2F0XToiQSB0ZW5hbnQgaWQgLSBub3QgY29tbW9uLCBvcmdhbml6YXRpb25zLCBvciBjb25zdW1lcnMgLSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHVzaW5nIHRoZSBjbGllbnRfY3JlZGVudGlhbHMgZmxvdy4iLFtjdF06IlRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCIsW2x0XToiVGhlIG5lc3RlZCBhcHAgYXV0aCBicmlkZ2UgaXMgZGlzYWJsZWQiLFtodF06IkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBuYXRpdmUgYnJva2VyLiBTZWUgdGhlIHBsYXRmb3JtQnJva2VyRXJyb3IgcHJvcGVydHkgZm9yIGRldGFpbHMuIn0sZ3Q9e2NsaWVudEluZm9EZWNvZGluZ0Vycm9yOntjb2RlOnZlLGRlc2M6dXRbdmVdfSxjbGllbnRJbmZvRW1wdHlFcnJvcjp7Y29kZTpJZSxkZXNjOnV0W0llXX0sdG9rZW5QYXJzaW5nRXJyb3I6e2NvZGU6VGUsZGVzYzp1dFtUZV19LG51bGxPckVtcHR5VG9rZW46e2NvZGU6QWUsZGVzYzp1dFtBZV19LGVuZHBvaW50UmVzb2x1dGlvbkVycm9yOntjb2RlOmtlLGRlc2M6dXRba2VdfSxuZXR3b3JrRXJyb3I6e2NvZGU6U2UsZGVzYzp1dFtTZV19LHVuYWJsZVRvR2V0T3BlbmlkQ29uZmlnRXJyb3I6e2NvZGU6YmUsZGVzYzp1dFtiZV19LGhhc2hOb3REZXNlcmlhbGl6ZWQ6e2NvZGU6RWUsZGVzYzp1dFtFZV19LGludmFsaWRTdGF0ZUVycm9yOntjb2RlOlJlLGRlc2M6dXRbUmVdfSxzdGF0ZU1pc21hdGNoRXJyb3I6e2NvZGU6X2UsZGVzYzp1dFtfZV19LHN0YXRlTm90Rm91bmRFcnJvcjp7Y29kZTpQZSxkZXNjOnV0W1BlXX0sbm9uY2VNaXNtYXRjaEVycm9yOntjb2RlOk1lLGRlc2M6dXRbTWVdfSxhdXRoVGltZU5vdEZvdW5kRXJyb3I6e2NvZGU6T2UsZGVzYzp1dFtPZV19LG1heEFnZVRyYW5zcGlyZWQ6e2NvZGU6cWUsZGVzYzp1dFtxZV19LG11bHRpcGxlTWF0Y2hpbmdUb2tlbnM6e2NvZGU6TmUsZGVzYzp1dFtOZV19LG11bHRpcGxlTWF0Y2hpbmdBY2NvdW50czp7Y29kZTpVZSxkZXNjOnV0W1VlXX0sbXVsdGlwbGVNYXRjaGluZ0FwcE1ldGFkYXRhOntjb2RlOkxlLGRlc2M6dXRbTGVdfSx0b2tlblJlcXVlc3RDYW5ub3RCZU1hZGU6e2NvZGU6RGUsZGVzYzp1dFtEZV19LHJlbW92ZUVtcHR5U2NvcGVFcnJvcjp7Y29kZTpIZSxkZXNjOnV0W0hlXX0sYXBwZW5kU2NvcGVTZXRFcnJvcjp7Y29kZTp4ZSxkZXNjOnV0W3hlXX0sZW1wdHlJbnB1dFNjb3BlU2V0RXJyb3I6e2NvZGU6QmUsZGVzYzp1dFtCZV19LERldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkOntjb2RlOkZlLGRlc2M6dXRbRmVdfSxEZXZpY2VDb2RlRXhwaXJlZDp7Y29kZTp6ZSxkZXNjOnV0W3plXX0sRGV2aWNlQ29kZVVua25vd25FcnJvcjp7Y29kZTpLZSxkZXNjOnV0W0tlXX0sTm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0Ontjb2RlOkdlLGRlc2M6dXRbR2VdfSxpbnZhbGlkQ2FjaGVSZWNvcmQ6e2NvZGU6JGUsZGVzYzp1dFskZV19LGludmFsaWRDYWNoZUVudmlyb25tZW50Ontjb2RlOlFlLGRlc2M6dXRbUWVdfSxub0FjY291bnRGb3VuZDp7Y29kZTpqZSxkZXNjOnV0W2plXX0sbm9DcnlwdG9PYmo6e2NvZGU6V2UsZGVzYzp1dFtXZV19LHVuZXhwZWN0ZWRDcmVkZW50aWFsVHlwZTp7Y29kZTpWZSxkZXNjOnV0W1ZlXX0saW52YWxpZEFzc2VydGlvbjp7Y29kZTpKZSxkZXNjOnV0W0plXX0saW52YWxpZENsaWVudENyZWRlbnRpYWw6e2NvZGU6WWUsZGVzYzp1dFtZZV19LHRva2VuUmVmcmVzaFJlcXVpcmVkOntjb2RlOlhlLGRlc2M6dXRbWGVdfSx1c2VyVGltZW91dFJlYWNoZWQ6e2NvZGU6WmUsZGVzYzp1dFtaZV19LHRva2VuQ2xhaW1zUmVxdWlyZWQ6e2NvZGU6ZXQsZGVzYzp1dFtldF19LG5vQXV0aG9yaXphdGlvbkNvZGVGcm9tU2VydmVyOntjb2RlOnR0LGRlc2M6dXRbdHRdfSxiaW5kaW5nS2V5Tm90UmVtb3ZlZEVycm9yOntjb2RlOnJ0LGRlc2M6dXRbcnRdfSxsb2dvdXROb3RTdXBwb3J0ZWQ6e2NvZGU6bnQsZGVzYzp1dFtudF19LGtleUlkTWlzc2luZzp7Y29kZTpvdCxkZXNjOnV0W290XX0sbm9OZXR3b3JrQ29ubmVjdGl2aXR5Ontjb2RlOml0LGRlc2M6dXRbaXRdfSx1c2VyQ2FuY2VsZWRFcnJvcjp7Y29kZTpzdCxkZXNjOnV0W3N0XX0sbWlzc2luZ1RlbmFudElkRXJyb3I6e2NvZGU6YXQsZGVzYzp1dFthdF19LG5lc3RlZEFwcEF1dGhCcmlkZ2VEaXNhYmxlZDp7Y29kZTpsdCxkZXNjOnV0W2x0XX0scGxhdGZvcm1Ccm9rZXJFcnJvcjp7Y29kZTpodCxkZXNjOnV0W2h0XX19O2NsYXNzIHB0IGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQ/YCR7dXRbZV19OiAke3R9YDp1dFtlXSksdGhpcy5uYW1lPSJDbGllbnRBdXRoRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHB0LnByb3RvdHlwZSl9fWZ1bmN0aW9uIG10KGUsdCl7cmV0dXJuIG5ldyBwdChlLHQpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBmdD17Y3JlYXRlTmV3R3VpZDooKT0+e3Rocm93IG10KGN0KX0sYmFzZTY0RGVjb2RlOigpPT57dGhyb3cgbXQoY3QpfSxiYXNlNjRFbmNvZGU6KCk9Pnt0aHJvdyBtdChjdCl9LGJhc2U2NFVybEVuY29kZTooKT0+e3Rocm93IG10KGN0KX0sZW5jb2RlS2lkOigpPT57dGhyb3cgbXQoY3QpfSxhc3luYyBnZXRQdWJsaWNLZXlUaHVtYnByaW50KCl7dGhyb3cgbXQoY3QpfSxhc3luYyByZW1vdmVUb2tlbkJpbmRpbmdLZXkoKXt0aHJvdyBtdChjdCl9LGFzeW5jIGNsZWFyS2V5c3RvcmUoKXt0aHJvdyBtdChjdCl9LGFzeW5jIHNpZ25Kd3QoKXt0aHJvdyBtdChjdCl9LGFzeW5jIGhhc2hTdHJpbmcoKXt0aHJvdyBtdChjdCl9fTsKLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovdmFyIHl0O2UuTG9nTGV2ZWw9dm9pZCAwLCh5dD1lLkxvZ0xldmVsfHwoZS5Mb2dMZXZlbD17fSkpW3l0LkVycm9yPTBdPSJFcnJvciIseXRbeXQuV2FybmluZz0xXT0iV2FybmluZyIseXRbeXQuSW5mbz0yXT0iSW5mbyIseXRbeXQuVmVyYm9zZT0zXT0iVmVyYm9zZSIseXRbeXQuVHJhY2U9NF09IlRyYWNlIjtjbGFzcyBDdHtjb25zdHJ1Y3RvcihyLG4sbyl7dGhpcy5sZXZlbD1lLkxvZ0xldmVsLkluZm87Y29uc3QgaT1yfHxDdC5jcmVhdGVEZWZhdWx0TG9nZ2VyT3B0aW9ucygpO3RoaXMubG9jYWxDYWxsYmFjaz1pLmxvZ2dlckNhbGxiYWNrfHwoKCk9Pnt9KSx0aGlzLnBpaUxvZ2dpbmdFbmFibGVkPWkucGlpTG9nZ2luZ0VuYWJsZWR8fCExLHRoaXMubGV2ZWw9Im51bWJlciI9PXR5cGVvZiBpLmxvZ0xldmVsP2kubG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLHRoaXMuY29ycmVsYXRpb25JZD1pLmNvcnJlbGF0aW9uSWR8fHQuRU1QVFlfU1RSSU5HLHRoaXMucGFja2FnZU5hbWU9bnx8dC5FTVBUWV9TVFJJTkcsdGhpcy5wYWNrYWdlVmVyc2lvbj1vfHx0LkVNUFRZX1NUUklOR31zdGF0aWMgY3JlYXRlRGVmYXVsdExvZ2dlck9wdGlvbnMoKXtyZXR1cm57bG9nZ2VyQ2FsbGJhY2s6KCk9Pnt9LHBpaUxvZ2dpbmdFbmFibGVkOiExLGxvZ0xldmVsOmUuTG9nTGV2ZWwuSW5mb319Y2xvbmUoZSx0LHIpe3JldHVybiBuZXcgQ3Qoe2xvZ2dlckNhbGxiYWNrOnRoaXMubG9jYWxDYWxsYmFjayxwaWlMb2dnaW5nRW5hYmxlZDp0aGlzLnBpaUxvZ2dpbmdFbmFibGVkLGxvZ0xldmVsOnRoaXMubGV2ZWwsY29ycmVsYXRpb25JZDpyfHx0aGlzLmNvcnJlbGF0aW9uSWR9LGUsdCl9bG9nTWVzc2FnZSh0LHIpe2lmKHIubG9nTGV2ZWw+dGhpcy5sZXZlbHx8IXRoaXMucGlpTG9nZ2luZ0VuYWJsZWQmJnIuY29udGFpbnNQaWkpcmV0dXJuO2NvbnN0IG49YCR7YFskeyhuZXcgRGF0ZSkudG9VVENTdHJpbmcoKX1dIDogWyR7ci5jb3JyZWxhdGlvbklkfHx0aGlzLmNvcnJlbGF0aW9uSWR8fCIifV1gfSA6ICR7dGhpcy5wYWNrYWdlTmFtZX1AJHt0aGlzLnBhY2thZ2VWZXJzaW9ufSA6ICR7ZS5Mb2dMZXZlbFtyLmxvZ0xldmVsXX0gLSAke3R9YDt0aGlzLmV4ZWN1dGVDYWxsYmFjayhyLmxvZ0xldmVsLG4sci5jb250YWluc1BpaXx8ITEpfWV4ZWN1dGVDYWxsYmFjayhlLHQscil7dGhpcy5sb2NhbENhbGxiYWNrJiZ0aGlzLmxvY2FsQ2FsbGJhY2soZSx0LHIpfWVycm9yKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuRXJyb3IsY29udGFpbnNQaWk6ITEsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfWVycm9yUGlpKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuRXJyb3IsY29udGFpbnNQaWk6ITAsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfXdhcm5pbmcocixuKXt0aGlzLmxvZ01lc3NhZ2Uocix7bG9nTGV2ZWw6ZS5Mb2dMZXZlbC5XYXJuaW5nLGNvbnRhaW5zUGlpOiExLGNvcnJlbGF0aW9uSWQ6bnx8dC5FTVBUWV9TVFJJTkd9KX13YXJuaW5nUGlpKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuV2FybmluZyxjb250YWluc1BpaTohMCxjb3JyZWxhdGlvbklkOm58fHQuRU1QVFlfU1RSSU5HfSl9aW5mbyhyLG4pe3RoaXMubG9nTWVzc2FnZShyLHtsb2dMZXZlbDplLkxvZ0xldmVsLkluZm8sY29udGFpbnNQaWk6ITEsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfWluZm9QaWkocixuKXt0aGlzLmxvZ01lc3NhZ2Uocix7bG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLGNvbnRhaW5zUGlpOiEwLGNvcnJlbGF0aW9uSWQ6bnx8dC5FTVBUWV9TVFJJTkd9KX12ZXJib3NlKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuVmVyYm9zZSxjb250YWluc1BpaTohMSxjb3JyZWxhdGlvbklkOm58fHQuRU1QVFlfU1RSSU5HfSl9dmVyYm9zZVBpaShyLG4pe3RoaXMubG9nTWVzc2FnZShyLHtsb2dMZXZlbDplLkxvZ0xldmVsLlZlcmJvc2UsY29udGFpbnNQaWk6ITAsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfXRyYWNlKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuVHJhY2UsY29udGFpbnNQaWk6ITEsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfXRyYWNlUGlpKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuVHJhY2UsY29udGFpbnNQaWk6ITAsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfWlzUGlpTG9nZ2luZ0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5waWlMb2dnaW5nRW5hYmxlZHx8ITF9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB3dD0iQGF6dXJlL21zYWwtY29tbW9uIix2dD0iMTUuMTMuMyIsSXQ9e05vbmU6Im5vbmUiLEF6dXJlUHVibGljOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iLEF6dXJlUHBlOiJodHRwczovL2xvZ2luLndpbmRvd3MtcHBlLm5ldCIsQXp1cmVDaGluYToiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuIixBenVyZUdlcm1hbnk6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmRlIixBenVyZVVzR292ZXJubWVudDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMifSxUdD0icmVkaXJlY3RfdXJpX2VtcHR5IixBdD0iY2xhaW1zX3JlcXVlc3RfcGFyc2luZ19lcnJvciIsa3Q9ImF1dGhvcml0eV91cmlfaW5zZWN1cmUiLFN0PSJ1cmxfcGFyc2VfZXJyb3IiLGJ0PSJlbXB0eV91cmxfZXJyb3IiLEV0PSJlbXB0eV9pbnB1dF9zY29wZXNfZXJyb3IiLFJ0PSJpbnZhbGlkX2NsYWltcyIsX3Q9InRva2VuX3JlcXVlc3RfZW1wdHkiLFB0PSJsb2dvdXRfcmVxdWVzdF9lbXB0eSIsTXQ9ImludmFsaWRfY29kZV9jaGFsbGVuZ2VfbWV0aG9kIixPdD0icGtjZV9wYXJhbXNfbWlzc2luZyIscXQ9ImludmFsaWRfY2xvdWRfZGlzY292ZXJ5X21ldGFkYXRhIixOdD0iaW52YWxpZF9hdXRob3JpdHlfbWV0YWRhdGEiLFV0PSJ1bnRydXN0ZWRfYXV0aG9yaXR5IixMdD0ibWlzc2luZ19zc2hfandrIixEdD0ibWlzc2luZ19zc2hfa2lkIixIdD0ibWlzc2luZ19ub25jZV9hdXRoZW50aWNhdGlvbl9oZWFkZXIiLHh0PSJpbnZhbGlkX2F1dGhlbnRpY2F0aW9uX2hlYWRlciIsQnQ9ImNhbm5vdF9zZXRfT0lEQ09wdGlvbnMiLEZ0PSJjYW5ub3RfYWxsb3dfcGxhdGZvcm1fYnJva2VyIix6dD0iYXV0aG9yaXR5X21pc21hdGNoIixLdD0iaW52YWxpZF9yZXF1ZXN0X21ldGhvZF9mb3JfRUFSIixHdD0iaW52YWxpZF9hdXRob3JpemVfcG9zdF9ib2R5X3BhcmFtZXRlcnMiLCR0PSJpbnZhbGlkX3BsYXRmb3JtX2Jyb2tlcl9jb25maWd1cmF0aW9uIjt2YXIgUXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYXV0aG9yaXR5TWlzbWF0Y2g6enQsYXV0aG9yaXR5VXJpSW5zZWN1cmU6a3QsY2Fubm90QWxsb3dQbGF0Zm9ybUJyb2tlcjpGdCxjYW5ub3RTZXRPSURDT3B0aW9uczpCdCxjbGFpbXNSZXF1ZXN0UGFyc2luZ0Vycm9yOkF0LGVtcHR5SW5wdXRTY29wZXNFcnJvcjpFdCxpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXI6eHQsaW52YWxpZEF1dGhvcml0eU1ldGFkYXRhOk50LGludmFsaWRBdXRob3JpemVQb3N0Qm9keVBhcmFtZXRlcnM6R3QsaW52YWxpZENsYWltczpSdCxpbnZhbGlkQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YTpxdCxpbnZhbGlkQ29kZUNoYWxsZW5nZU1ldGhvZDpNdCxpbnZhbGlkUGxhdGZvcm1Ccm9rZXJDb25maWd1cmF0aW9uOiR0LGludmFsaWRSZXF1ZXN0TWV0aG9kRm9yRUFSOkt0LGxvZ291dFJlcXVlc3RFbXB0eTpQdCxtaXNzaW5nTm9uY2VBdXRoZW50aWNhdGlvbkhlYWRlcjpIdCxtaXNzaW5nU3NoSndrOkx0LG1pc3NpbmdTc2hLaWQ6RHQscGtjZVBhcmFtc01pc3Npbmc6T3QscmVkaXJlY3RVcmlFbXB0eTpUdCx0b2tlblJlcXVlc3RFbXB0eTpfdCx1bnRydXN0ZWRBdXRob3JpdHk6VXQsdXJsRW1wdHlFcnJvcjpidCx1cmxQYXJzZUVycm9yOlN0fSk7Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NvbnN0IGp0PXtbVHRdOiJBIHJlZGlyZWN0IFVSSSBpcyByZXF1aXJlZCBmb3IgYWxsIGNhbGxzLCBhbmQgbm9uZSBoYXMgYmVlbiBzZXQuIixbQXRdOiJDb3VsZCBub3QgcGFyc2UgdGhlIGdpdmVuIGNsYWltcyByZXF1ZXN0IG9iamVjdC4iLFtrdF06IkF1dGhvcml0eSBVUklzIG11c3QgdXNlIGh0dHBzLiAgUGxlYXNlIHNlZSBoZXJlIGZvciB2YWxpZCBhdXRob3JpdHkgY29uZmlndXJhdGlvbiBvcHRpb25zOiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9hY3RpdmUtZGlyZWN0b3J5L2RldmVsb3AvbXNhbC1qcy1pbml0aWFsaXppbmctY2xpZW50LWFwcGxpY2F0aW9ucyNjb25maWd1cmF0aW9uLW9wdGlvbnMiLFtTdF06IlVSTCBjb3VsZCBub3QgYmUgcGFyc2VkIGludG8gYXBwcm9wcmlhdGUgc2VnbWVudHMuIixbYnRdOiJVUkwgd2FzIGVtcHR5IG9yIG51bGwuIixbRXRdOiJTY29wZXMgY2Fubm90IGJlIHBhc3NlZCBhcyBudWxsLCB1bmRlZmluZWQgb3IgZW1wdHkgYXJyYXkgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuLiIsW1J0XToiR2l2ZW4gY2xhaW1zIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QuIixbX3RdOiJUb2tlbiByZXF1ZXN0IHdhcyBlbXB0eSBhbmQgbm90IGZvdW5kIGluIGNhY2hlLiIsW1B0XToiVGhlIGxvZ291dCByZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iLFtNdF06J2NvZGVfY2hhbGxlbmdlX21ldGhvZCBwYXNzZWQgaXMgaW52YWxpZC4gVmFsaWQgdmFsdWVzIGFyZSAicGxhaW4iIGFuZCAiUzI1NiIuJyxbT3RdOiJCb3RoIHBhcmFtczogY29kZV9jaGFsbGVuZ2UgYW5kIGNvZGVfY2hhbGxlbmdlX21ldGhvZCBhcmUgdG8gYmUgcGFzc2VkIGlmIHRvIGJlIHNlbnQgaW4gdGhlIHJlcXVlc3QiLFtxdF06IkludmFsaWQgY2xvdWREaXNjb3ZlcnlNZXRhZGF0YSBwcm92aWRlZC4gTXVzdCBiZSBhIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludCBhbmQgbWV0YWRhdGEgZmllbGRzIixbTnRdOiJJbnZhbGlkIGF1dGhvcml0eU1ldGFkYXRhIHByb3ZpZGVkLiBNdXN0IGJ5IGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QgY29udGFpbmluZyBhdXRob3JpemF0aW9uX2VuZHBvaW50LCB0b2tlbl9lbmRwb2ludCwgaXNzdWVyIGZpZWxkcy4iLFtVdF06IlRoZSBwcm92aWRlZCBhdXRob3JpdHkgaXMgbm90IGEgdHJ1c3RlZCBhdXRob3JpdHkuIFBsZWFzZSBpbmNsdWRlIHRoaXMgYXV0aG9yaXR5IGluIHRoZSBrbm93bkF1dGhvcml0aWVzIGNvbmZpZyBwYXJhbWV0ZXIuIixbTHRdOiJNaXNzaW5nIHNzaEp3ayBpbiBTU0ggY2VydGlmaWNhdGUgcmVxdWVzdC4gQSBzdHJpbmdpZmllZCBKU09OIFdlYiBLZXkgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgU1NIIGF1dGhlbnRpY2F0aW9uIHNjaGVtZS4iLFtEdF06Ik1pc3Npbmcgc3NoS2lkIGluIFNTSCBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiBBIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHB1YmxpYyBTU0gga2V5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIFNTSCBhdXRoZW50aWNhdGlvbiBzY2hlbWUuIixbSHRdOiJVbmFibGUgdG8gZmluZCBhbiBhdXRoZW50aWNhdGlvbiBoZWFkZXIgY29udGFpbmluZyBzZXJ2ZXIgbm9uY2UuIEVpdGhlciB0aGUgQXV0aGVudGljYXRpb24tSW5mbyBvciBXV1ctQXV0aGVudGljYXRlIGhlYWRlcnMgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIG9idGFpbiBhIHNlcnZlciBub25jZS4iLFt4dF06IkludmFsaWQgYXV0aGVudGljYXRpb24gaGVhZGVyIHByb3ZpZGVkIixbQnRdOiJDYW5ub3Qgc2V0IE9JRENPcHRpb25zIHBhcmFtZXRlci4gUGxlYXNlIGNoYW5nZSB0aGUgcHJvdG9jb2wgbW9kZSB0byBPSURDIG9yIHVzZSBhIG5vbi1NaWNyb3NvZnQgYXV0aG9yaXR5LiIsW0Z0XToiQ2Fubm90IHNldCBhbGxvd1BsYXRmb3JtQnJva2VyIHBhcmFtZXRlciB0byB0cnVlIHdoZW4gbm90IGluIEFBRCBwcm90b2NvbCBtb2RlLiIsW3p0XToiQXV0aG9yaXR5IG1pc21hdGNoIGVycm9yLiBBdXRob3JpdHkgcHJvdmlkZWQgaW4gbG9naW4gcmVxdWVzdCBvciBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBjb25maWcgZG9lcyBub3QgbWF0Y2ggdGhlIGVudmlyb25tZW50IG9mIHRoZSBwcm92aWRlZCBhY2NvdW50LiBQbGVhc2UgdXNlIGEgbWF0Y2hpbmcgYWNjb3VudCBvciBtYWtlIGFuIGludGVyYWN0aXZlIHJlcXVlc3QgdG8gbG9naW4gdG8gdGhpcyBhdXRob3JpdHkuIixbR3RdOiJJbnZhbGlkIGF1dGhvcml6ZSBwb3N0IGJvZHkgcGFyYW1ldGVycyBwcm92aWRlZC4gSWYgeW91IGFyZSB1c2luZyBhdXRob3JpemVQb3N0Qm9keVBhcmFtZXRlcnMsIHRoZSByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlIFBPU1QuIFBsZWFzZSBjaGVjayB0aGUgcmVxdWVzdCBtZXRob2QgYW5kIHBhcmFtZXRlcnMuIixbS3RdOiJJbnZhbGlkIHJlcXVlc3QgbWV0aG9kIGZvciBFQVIgcHJvdG9jb2wgbW9kZS4gVGhlIHJlcXVlc3QgbWV0aG9kIGNhbm5vdCBiZSBHRVQgd2hlbiB1c2luZyBFQVIgcHJvdG9jb2wgbW9kZS4gUGxlYXNlIGNoYW5nZSB0aGUgcmVxdWVzdCBtZXRob2QgdG8gUE9TVC4iLFskdF06IkludmFsaWQgcGxhdGZvcm0gYnJva2VyIGNvbmZpZ3VyYXRpb24uIGBhbGxvd1BsYXRmb3JtQnJva2VyV2l0aERPTWAgY2FuIG9ubHkgYmUgZW5hYmxlZCB3aGVuIGBhbGxvd1BsYXRmb3JtQnJva2VyYCBpcyBlbmFibGVkLiJ9LFd0PXtyZWRpcmVjdFVyaU5vdFNldDp7Y29kZTpUdCxkZXNjOmp0W1R0XX0sY2xhaW1zUmVxdWVzdFBhcnNpbmdFcnJvcjp7Y29kZTpBdCxkZXNjOmp0W0F0XX0sYXV0aG9yaXR5VXJpSW5zZWN1cmU6e2NvZGU6a3QsZGVzYzpqdFtrdF19LHVybFBhcnNlRXJyb3I6e2NvZGU6U3QsZGVzYzpqdFtTdF19LHVybEVtcHR5RXJyb3I6e2NvZGU6YnQsZGVzYzpqdFtidF19LGVtcHR5U2NvcGVzRXJyb3I6e2NvZGU6RXQsZGVzYzpqdFtFdF19LGludmFsaWRDbGFpbXNSZXF1ZXN0Ontjb2RlOlJ0LGRlc2M6anRbUnRdfSx0b2tlblJlcXVlc3RFbXB0eUVycm9yOntjb2RlOl90LGRlc2M6anRbX3RdfSxsb2dvdXRSZXF1ZXN0RW1wdHlFcnJvcjp7Y29kZTpQdCxkZXNjOmp0W1B0XX0saW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2Q6e2NvZGU6TXQsZGVzYzpqdFtNdF19LGludmFsaWRDb2RlQ2hhbGxlbmdlUGFyYW1zOntjb2RlOk90LGRlc2M6anRbT3RdfSxpbnZhbGlkQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YTp7Y29kZTpxdCxkZXNjOmp0W3F0XX0saW52YWxpZEF1dGhvcml0eU1ldGFkYXRhOntjb2RlOk50LGRlc2M6anRbTnRdfSx1bnRydXN0ZWRBdXRob3JpdHk6e2NvZGU6VXQsZGVzYzpqdFtVdF19LG1pc3NpbmdTc2hKd2s6e2NvZGU6THQsZGVzYzpqdFtMdF19LG1pc3NpbmdTc2hLaWQ6e2NvZGU6RHQsZGVzYzpqdFtEdF19LG1pc3NpbmdOb25jZUF1dGhlbnRpY2F0aW9uSGVhZGVyOntjb2RlOkh0LGRlc2M6anRbSHRdfSxpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXI6e2NvZGU6eHQsZGVzYzpqdFt4dF19LGNhbm5vdFNldE9JRENPcHRpb25zOntjb2RlOkJ0LGRlc2M6anRbQnRdfSxjYW5ub3RBbGxvd1BsYXRmb3JtQnJva2VyOntjb2RlOkZ0LGRlc2M6anRbRnRdfSxhdXRob3JpdHlNaXNtYXRjaDp7Y29kZTp6dCxkZXNjOmp0W3p0XX0saW52YWxpZEF1dGhvcml6ZVBvc3RCb2R5UGFyYW1ldGVyczp7Y29kZTpHdCxkZXNjOmp0W0d0XX0saW52YWxpZFJlcXVlc3RNZXRob2RGb3JFQVI6e2NvZGU6S3QsZGVzYzpqdFtLdF19LGludmFsaWRQbGF0Zm9ybUJyb2tlckNvbmZpZ3VyYXRpb246e2NvZGU6JHQsZGVzYzpqdFskdF19fTtjbGFzcyBWdCBleHRlbmRzIENle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsanRbZV0pLHRoaXMubmFtZT0iQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yIixPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxWdC5wcm90b3R5cGUpfX1mdW5jdGlvbiBKdChlKXtyZXR1cm4gbmV3IFZ0KGUpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBZdHtzdGF0aWMgaXNFbXB0eU9iaihlKXtpZihlKXRyeXtjb25zdCB0PUpTT04ucGFyc2UoZSk7cmV0dXJuIDA9PT1PYmplY3Qua2V5cyh0KS5sZW5ndGh9Y2F0Y2goZSl7fXJldHVybiEwfXN0YXRpYyBzdGFydHNXaXRoKGUsdCl7cmV0dXJuIDA9PT1lLmluZGV4T2YodCl9c3RhdGljIGVuZHNXaXRoKGUsdCl7cmV0dXJuIGUubGVuZ3RoPj10Lmxlbmd0aCYmZS5sYXN0SW5kZXhPZih0KT09PWUubGVuZ3RoLXQubGVuZ3RofXN0YXRpYyBxdWVyeVN0cmluZ1RvT2JqZWN0KGUpe2NvbnN0IHQ9e30scj1lLnNwbGl0KCImIiksbj1lPT5kZWNvZGVVUklDb21wb25lbnQoZS5yZXBsYWNlKC9cKy9nLCIgIikpO3JldHVybiByLmZvckVhY2goKGU9PntpZihlLnRyaW0oKSl7Y29uc3RbcixvXT1lLnNwbGl0KC89KC4rKS9nLDIpO3ImJm8mJih0W24ocildPW4obykpfX0pKSx0fXN0YXRpYyB0cmltQXJyYXlFbnRyaWVzKGUpe3JldHVybiBlLm1hcCgoZT0+ZS50cmltKCkpKX1zdGF0aWMgcmVtb3ZlRW1wdHlTdHJpbmdzRnJvbUFycmF5KGUpe3JldHVybiBlLmZpbHRlcigoZT0+ISFlKSl9c3RhdGljIGpzb25QYXJzZUhlbHBlcihlKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fXN0YXRpYyBtYXRjaFBhdHRlcm4oZSx0KXtyZXR1cm4gbmV3IFJlZ0V4cChlLnJlcGxhY2UoL1xcL2csIlxcXFwiKS5yZXBsYWNlKC9cKi9nLCJbXiBdKiIpLnJlcGxhY2UoL1w/L2csIlxcPyIpKS50ZXN0KHQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3MgWHR7Y29uc3RydWN0b3IoZSl7Y29uc3QgdD1lP1l0LnRyaW1BcnJheUVudHJpZXMoWy4uLmVdKTpbXSxyPXQ/WXQucmVtb3ZlRW1wdHlTdHJpbmdzRnJvbUFycmF5KHQpOltdO2lmKCFyfHwhci5sZW5ndGgpdGhyb3cgSnQoRXQpO3RoaXMuc2NvcGVzPW5ldyBTZXQsci5mb3JFYWNoKChlPT50aGlzLnNjb3Blcy5hZGQoZSkpKX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCByPShlfHx0LkVNUFRZX1NUUklORykuc3BsaXQoIiAiKTtyZXR1cm4gbmV3IFh0KHIpfXN0YXRpYyBjcmVhdGVTZWFyY2hTY29wZXMoZSl7Y29uc3Qgcj1lJiZlLmxlbmd0aD4wP2U6Wy4uLmhdLG49bmV3IFh0KHIpO3JldHVybiBuLmNvbnRhaW5zT25seU9JRENTY29wZXMoKT9uLnJlbW92ZVNjb3BlKHQuT0ZGTElORV9BQ0NFU1NfU0NPUEUpOm4ucmVtb3ZlT0lEQ1Njb3BlcygpLG59Y29udGFpbnNTY29wZShlKXtjb25zdCB0PXRoaXMucHJpbnRTY29wZXNMb3dlckNhc2UoKS5zcGxpdCgiICIpLHI9bmV3IFh0KHQpO3JldHVybiEhZSYmci5zY29wZXMuaGFzKGUudG9Mb3dlckNhc2UoKSl9Y29udGFpbnNTY29wZVNldChlKXtyZXR1cm4hKCFlfHxlLnNjb3Blcy5zaXplPD0wKSYmKHRoaXMuc2NvcGVzLnNpemU+PWUuc2NvcGVzLnNpemUmJmUuYXNBcnJheSgpLmV2ZXJ5KChlPT50aGlzLmNvbnRhaW5zU2NvcGUoZSkpKSl9Y29udGFpbnNPbmx5T0lEQ1Njb3Blcygpe2xldCBlPTA7cmV0dXJuIGQuZm9yRWFjaCgodD0+e3RoaXMuY29udGFpbnNTY29wZSh0KSYmKGUrPTEpfSkpLHRoaXMuc2NvcGVzLnNpemU9PT1lfWFwcGVuZFNjb3BlKGUpe2UmJnRoaXMuc2NvcGVzLmFkZChlLnRyaW0oKSl9YXBwZW5kU2NvcGVzKGUpe3RyeXtlLmZvckVhY2goKGU9PnRoaXMuYXBwZW5kU2NvcGUoZSkpKX1jYXRjaChlKXt0aHJvdyBtdCh4ZSl9fXJlbW92ZVNjb3BlKGUpe2lmKCFlKXRocm93IG10KEhlKTt0aGlzLnNjb3Blcy5kZWxldGUoZS50cmltKCkpfXJlbW92ZU9JRENTY29wZXMoKXtkLmZvckVhY2goKGU9Pnt0aGlzLnNjb3Blcy5kZWxldGUoZSl9KSl9dW5pb25TY29wZVNldHMoZSl7aWYoIWUpdGhyb3cgbXQoQmUpO2NvbnN0IHQ9bmV3IFNldDtyZXR1cm4gZS5zY29wZXMuZm9yRWFjaCgoZT0+dC5hZGQoZS50b0xvd2VyQ2FzZSgpKSkpLHRoaXMuc2NvcGVzLmZvckVhY2goKGU9PnQuYWRkKGUudG9Mb3dlckNhc2UoKSkpKSx0fWludGVyc2VjdGluZ1Njb3BlU2V0cyhlKXtpZighZSl0aHJvdyBtdChCZSk7ZS5jb250YWluc09ubHlPSURDU2NvcGVzKCl8fGUucmVtb3ZlT0lEQ1Njb3BlcygpO2NvbnN0IHQ9dGhpcy51bmlvblNjb3BlU2V0cyhlKSxyPWUuZ2V0U2NvcGVDb3VudCgpLG49dGhpcy5nZXRTY29wZUNvdW50KCk7cmV0dXJuIHQuc2l6ZTxuK3J9Z2V0U2NvcGVDb3VudCgpe3JldHVybiB0aGlzLnNjb3Blcy5zaXplfWFzQXJyYXkoKXtjb25zdCBlPVtdO3JldHVybiB0aGlzLnNjb3Blcy5mb3JFYWNoKCh0PT5lLnB1c2godCkpKSxlfXByaW50U2NvcGVzKCl7aWYodGhpcy5zY29wZXMpe3JldHVybiB0aGlzLmFzQXJyYXkoKS5qb2luKCIgIil9cmV0dXJuIHQuRU1QVFlfU1RSSU5HfXByaW50U2NvcGVzTG93ZXJDYXNlKCl7cmV0dXJuIHRoaXMucHJpbnRTY29wZXMoKS50b0xvd2VyQ2FzZSgpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gWnQoZSx0KXtpZighZSl0aHJvdyBtdChJZSk7dHJ5e2NvbnN0IHI9dChlKTtyZXR1cm4gSlNPTi5wYXJzZShyKX1jYXRjaChlKXt0aHJvdyBtdCh2ZSl9fWZ1bmN0aW9uIGVyKGUpe2lmKCFlKXRocm93IG10KHZlKTtjb25zdCByPWUuc3BsaXQoRCwyKTtyZXR1cm57dWlkOnJbMF0sdXRpZDpyLmxlbmd0aDwyP3QuRU1QVFlfU1RSSU5HOnJbMV19fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiB0cihlLHQpe3JldHVybiEhZSYmISF0JiZlPT09dC5zcGxpdCgiLiIpWzFdfWZ1bmN0aW9uIHJyKGUsdCxyLG4pe2lmKG4pe2NvbnN0e29pZDp0LHN1YjpyLHRpZDpvLG5hbWU6aSx0ZnA6cyxhY3I6YSxwcmVmZXJyZWRfdXNlcm5hbWU6Yyx1cG46bCxsb2dpbl9oaW50Omh9PW4sZD1vfHxzfHxhfHwiIjtyZXR1cm57dGVuYW50SWQ6ZCxsb2NhbEFjY291bnRJZDp0fHxyfHwiIixuYW1lOmksdXNlcm5hbWU6Y3x8bHx8IiIsbG9naW5IaW50OmgsaXNIb21lVGVuYW50OnRyKGQsZSl9fXJldHVybnt0ZW5hbnRJZDpyLGxvY2FsQWNjb3VudElkOnQsdXNlcm5hbWU6IiIsaXNIb21lVGVuYW50OnRyKHIsZSl9fWZ1bmN0aW9uIG5yKGUsdCxyLG4pe2xldCBvPWU7aWYodCl7Y29uc3R7aXNIb21lVGVuYW50OnIsLi4ubn09dDtvPXsuLi5lLC4uLm59fWlmKHIpe2NvbnN0e2lzSG9tZVRlbmFudDp0LC4uLml9PXJyKGUuaG9tZUFjY291bnRJZCxlLmxvY2FsQWNjb3VudElkLGUudGVuYW50SWQscik7cmV0dXJuIG89ey4uLm8sLi4uaSxpZFRva2VuQ2xhaW1zOnIsaWRUb2tlbjpufSxvfXJldHVybiBvfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBvcj0wLGlyPTEsc3I9Mixhcj0zOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiBjcihlKXtpZihlKXtyZXR1cm4gZS50aWR8fGUudGZwfHxlLmFjcnx8bnVsbH1yZXR1cm4gbnVsbH0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgbHI9e0FBRDoiQUFEIixPSURDOiJPSURDIixFQVI6IkVBUiJ9OwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBocntzdGF0aWMgZ2V0QWNjb3VudEluZm8oZSl7cmV0dXJue2hvbWVBY2NvdW50SWQ6ZS5ob21lQWNjb3VudElkLGVudmlyb25tZW50OmUuZW52aXJvbm1lbnQsdGVuYW50SWQ6ZS5yZWFsbSx1c2VybmFtZTplLnVzZXJuYW1lLGxvY2FsQWNjb3VudElkOmUubG9jYWxBY2NvdW50SWQsbG9naW5IaW50OmUubG9naW5IaW50LG5hbWU6ZS5uYW1lLG5hdGl2ZUFjY291bnRJZDplLm5hdGl2ZUFjY291bnRJZCxhdXRob3JpdHlUeXBlOmUuYXV0aG9yaXR5VHlwZSx0ZW5hbnRQcm9maWxlczpuZXcgTWFwKChlLnRlbmFudFByb2ZpbGVzfHxbXSkubWFwKChlPT5bZS50ZW5hbnRJZCxlXSkpKSxkYXRhQm91bmRhcnk6ZS5kYXRhQm91bmRhcnl9fWlzU2luZ2xlVGVuYW50KCl7cmV0dXJuIXRoaXMudGVuYW50UHJvZmlsZXN9c3RhdGljIGNyZWF0ZUFjY291bnQoZSx0LHIpe2NvbnN0IG49bmV3IGhyO2xldCBvO3QuYXV0aG9yaXR5VHlwZT09PWlyP24uYXV0aG9yaXR5VHlwZT1OOnQucHJvdG9jb2xNb2RlPT09bHIuT0lEQz9uLmF1dGhvcml0eVR5cGU9VTpuLmF1dGhvcml0eVR5cGU9cSxlLmNsaWVudEluZm8mJnImJihvPVp0KGUuY2xpZW50SW5mbyxyKSxvLnhtc190ZGJyJiYobi5kYXRhQm91bmRhcnk9IkVVIj09PW8ueG1zX3RkYnI/IkVVIjoiTm9uZSIpKSxuLmNsaWVudEluZm89ZS5jbGllbnRJbmZvLG4uaG9tZUFjY291bnRJZD1lLmhvbWVBY2NvdW50SWQsbi5uYXRpdmVBY2NvdW50SWQ9ZS5uYXRpdmVBY2NvdW50SWQ7Y29uc3QgaT1lLmVudmlyb25tZW50fHx0JiZ0LmdldFByZWZlcnJlZENhY2hlKCk7aWYoIWkpdGhyb3cgbXQoUWUpO24uZW52aXJvbm1lbnQ9aSxuLnJlYWxtPW8/LnV0aWR8fGNyKGUuaWRUb2tlbkNsYWltcyl8fCIiLG4ubG9jYWxBY2NvdW50SWQ9bz8udWlkfHxlLmlkVG9rZW5DbGFpbXM/Lm9pZHx8ZS5pZFRva2VuQ2xhaW1zPy5zdWJ8fCIiO2NvbnN0IHM9ZS5pZFRva2VuQ2xhaW1zPy5wcmVmZXJyZWRfdXNlcm5hbWV8fGUuaWRUb2tlbkNsYWltcz8udXBuLGE9ZS5pZFRva2VuQ2xhaW1zPy5lbWFpbHM/ZS5pZFRva2VuQ2xhaW1zLmVtYWlsc1swXTpudWxsO2lmKG4udXNlcm5hbWU9c3x8YXx8IiIsbi5sb2dpbkhpbnQ9ZS5pZFRva2VuQ2xhaW1zPy5sb2dpbl9oaW50LG4ubmFtZT1lLmlkVG9rZW5DbGFpbXM/Lm5hbWV8fCIiLG4uY2xvdWRHcmFwaEhvc3ROYW1lPWUuY2xvdWRHcmFwaEhvc3ROYW1lLG4ubXNHcmFwaEhvc3Q9ZS5tc0dyYXBoSG9zdCxlLnRlbmFudFByb2ZpbGVzKW4udGVuYW50UHJvZmlsZXM9ZS50ZW5hbnRQcm9maWxlcztlbHNle2NvbnN0IHQ9cnIoZS5ob21lQWNjb3VudElkLG4ubG9jYWxBY2NvdW50SWQsbi5yZWFsbSxlLmlkVG9rZW5DbGFpbXMpO24udGVuYW50UHJvZmlsZXM9W3RdfXJldHVybiBufXN0YXRpYyBjcmVhdGVGcm9tQWNjb3VudEluZm8oZSx0LHIpe2NvbnN0IG49bmV3IGhyO3JldHVybiBuLmF1dGhvcml0eVR5cGU9ZS5hdXRob3JpdHlUeXBlfHxVLG4uaG9tZUFjY291bnRJZD1lLmhvbWVBY2NvdW50SWQsbi5sb2NhbEFjY291bnRJZD1lLmxvY2FsQWNjb3VudElkLG4ubmF0aXZlQWNjb3VudElkPWUubmF0aXZlQWNjb3VudElkLG4ucmVhbG09ZS50ZW5hbnRJZCxuLmVudmlyb25tZW50PWUuZW52aXJvbm1lbnQsbi51c2VybmFtZT1lLnVzZXJuYW1lLG4ubmFtZT1lLm5hbWUsbi5sb2dpbkhpbnQ9ZS5sb2dpbkhpbnQsbi5jbG91ZEdyYXBoSG9zdE5hbWU9dCxuLm1zR3JhcGhIb3N0PXIsbi50ZW5hbnRQcm9maWxlcz1BcnJheS5mcm9tKGUudGVuYW50UHJvZmlsZXM/LnZhbHVlcygpfHxbXSksbi5kYXRhQm91bmRhcnk9ZS5kYXRhQm91bmRhcnksbn1zdGF0aWMgZ2VuZXJhdGVIb21lQWNjb3VudElkKGUsdCxyLG4sbyl7aWYodCE9PWlyJiZ0IT09c3Ipe2lmKGUpdHJ5e2NvbnN0IHQ9WnQoZSxuLmJhc2U2NERlY29kZSk7aWYodC51aWQmJnQudXRpZClyZXR1cm5gJHt0LnVpZH0uJHt0LnV0aWR9YH1jYXRjaChlKXt9ci53YXJuaW5nKCJObyBjbGllbnQgaW5mbyBpbiByZXNwb25zZSIpfXJldHVybiBvPy5zdWJ8fCIifXN0YXRpYyBpc0FjY291bnRFbnRpdHkoZSl7cmV0dXJuISFlJiYoZS5oYXNPd25Qcm9wZXJ0eSgiaG9tZUFjY291bnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJlbnZpcm9ubWVudCIpJiZlLmhhc093blByb3BlcnR5KCJyZWFsbSIpJiZlLmhhc093blByb3BlcnR5KCJsb2NhbEFjY291bnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJ1c2VybmFtZSIpJiZlLmhhc093blByb3BlcnR5KCJhdXRob3JpdHlUeXBlIikpfXN0YXRpYyBhY2NvdW50SW5mb0lzRXF1YWwoZSx0LHIpe2lmKCFlfHwhdClyZXR1cm4hMTtsZXQgbj0hMDtpZihyKXtjb25zdCByPWUuaWRUb2tlbkNsYWltc3x8e30sbz10LmlkVG9rZW5DbGFpbXN8fHt9O249ci5pYXQ9PT1vLmlhdCYmci5ub25jZT09PW8ubm9uY2V9cmV0dXJuIGUuaG9tZUFjY291bnRJZD09PXQuaG9tZUFjY291bnRJZCYmZS5sb2NhbEFjY291bnRJZD09PXQubG9jYWxBY2NvdW50SWQmJmUudXNlcm5hbWU9PT10LnVzZXJuYW1lJiZlLnRlbmFudElkPT09dC50ZW5hbnRJZCYmZS5sb2dpbkhpbnQ9PT10LmxvZ2luSGludCYmZS5lbnZpcm9ubWVudD09PXQuZW52aXJvbm1lbnQmJmUubmF0aXZlQWNjb3VudElkPT09dC5uYXRpdmVBY2NvdW50SWQmJm59fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiBkcihlLHQpe2NvbnN0IHI9ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbXQoQWUpO2NvbnN0IHQ9L14oW15cLlxzXSopXC4oW15cLlxzXSspXC4oW15cLlxzXSopJC8uZXhlYyhlKTtpZighdHx8dC5sZW5ndGg8NCl0aHJvdyBtdChUZSk7cmV0dXJuIHRbMl19KGUpO3RyeXtjb25zdCBlPXQocik7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7dGhyb3cgbXQoVGUpfX1mdW5jdGlvbiB1cihlKXtpZighZS5zaWduaW5fc3RhdGUpcmV0dXJuITE7Y29uc3QgdD1bImttc2kiLCJkdmNfZG1qZCJdO3JldHVybiBlLnNpZ25pbl9zdGF0ZS5zb21lKChlPT50LmluY2x1ZGVzKGUudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSl9ZnVuY3Rpb24gZ3IoZSx0KXtpZigwPT09dHx8RGF0ZS5ub3coKS0zZTU+ZSt0KXRocm93IG10KHFlKX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gcHIoZSl7aWYoIWUpcmV0dXJuIGU7bGV0IHQ9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiBZdC5lbmRzV2l0aCh0LCI/Iik/dD10LnNsaWNlKDAsLTEpOll0LmVuZHNXaXRoKHQsIj8vIikmJih0PXQuc2xpY2UoMCwtMikpLFl0LmVuZHNXaXRoKHQsIi8iKXx8KHQrPSIvIiksdH1mdW5jdGlvbiBtcihlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCIjLyIpP2Uuc3Vic3RyaW5nKDIpOmUuc3RhcnRzV2l0aCgiIyIpfHxlLnN0YXJ0c1dpdGgoIj8iKT9lLnN1YnN0cmluZygxKTplfWZ1bmN0aW9uIGZyKGUpe2lmKCFlfHxlLmluZGV4T2YoIj0iKTwwKXJldHVybiBudWxsO3RyeXtjb25zdCB0PW1yKGUpLHI9T2JqZWN0LmZyb21FbnRyaWVzKG5ldyBVUkxTZWFyY2hQYXJhbXModCkpO2lmKHIuY29kZXx8ci5lYXJfandlfHxyLmVycm9yfHxyLmVycm9yX2Rlc2NyaXB0aW9ufHxyLnN0YXRlKXJldHVybiByfWNhdGNoKGUpe3Rocm93IG10KEVlKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5cihlLHQ9ITAscil7Y29uc3Qgbj1uZXcgQXJyYXk7cmV0dXJuIGUuZm9yRWFjaCgoKGUsbyk9PnshdCYmciYmbyBpbiByP24ucHVzaChgJHtvfT0ke2V9YCk6bi5wdXNoKGAke299PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWApfSkpLG4uam9pbigiJiIpfWZ1bmN0aW9uIENyKGUpe2lmKCFlKXJldHVybiBlO2NvbnN0IHQ9ZS5zcGxpdCgiIyIpWzBdO3RyeXtjb25zdCBlPW5ldyBVUkwodCk7cmV0dXJuIHByKGUub3JpZ2luK2UucGF0aG5hbWUrZS5zZWFyY2gpfWNhdGNoKGUpe3JldHVybiBwcih0KX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIHdye2dldCB1cmxTdHJpbmcoKXtyZXR1cm4gdGhpcy5fdXJsU3RyaW5nfWNvbnN0cnVjdG9yKGUpe2lmKHRoaXMuX3VybFN0cmluZz1lLCF0aGlzLl91cmxTdHJpbmcpdGhyb3cgSnQoYnQpO2UuaW5jbHVkZXMoIiMiKXx8KHRoaXMuX3VybFN0cmluZz13ci5jYW5vbmljYWxpemVVcmkoZSkpfXN0YXRpYyBjYW5vbmljYWxpemVVcmkoZSl7aWYoZSl7bGV0IHQ9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiBZdC5lbmRzV2l0aCh0LCI/Iik/dD10LnNsaWNlKDAsLTEpOll0LmVuZHNXaXRoKHQsIj8vIikmJih0PXQuc2xpY2UoMCwtMikpLFl0LmVuZHNXaXRoKHQsIi8iKXx8KHQrPSIvIiksdH1yZXR1cm4gZX12YWxpZGF0ZUFzVXJpKCl7bGV0IGU7dHJ5e2U9dGhpcy5nZXRVcmxDb21wb25lbnRzKCl9Y2F0Y2goZSl7dGhyb3cgSnQoU3QpfWlmKCFlLkhvc3ROYW1lQW5kUG9ydHx8IWUuUGF0aFNlZ21lbnRzKXRocm93IEp0KFN0KTtpZighZS5Qcm90b2NvbHx8Imh0dHBzOiIhPT1lLlByb3RvY29sLnRvTG93ZXJDYXNlKCkpdGhyb3cgSnQoa3QpfXN0YXRpYyBhcHBlbmRRdWVyeVN0cmluZyhlLHQpe3JldHVybiB0P2UuaW5kZXhPZigiPyIpPDA/YCR7ZX0/JHt0fWA6YCR7ZX0mJHt0fWA6ZX1zdGF0aWMgcmVtb3ZlSGFzaEZyb21VcmwoZSl7cmV0dXJuIHdyLmNhbm9uaWNhbGl6ZVVyaShlLnNwbGl0KCIjIilbMF0pfXJlcGxhY2VUZW5hbnRQYXRoKGUpe2NvbnN0IHQ9dGhpcy5nZXRVcmxDb21wb25lbnRzKCkscj10LlBhdGhTZWdtZW50cztyZXR1cm4hZXx8MD09PXIubGVuZ3RofHxyWzBdIT09SSYmclswXSE9PVR8fChyWzBdPWUpLHdyLmNvbnN0cnVjdEF1dGhvcml0eVVyaUZyb21PYmplY3QodCl9Z2V0VXJsQ29tcG9uZW50cygpe2NvbnN0IGU9UmVnRXhwKCJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/IiksdD10aGlzLnVybFN0cmluZy5tYXRjaChlKTtpZighdCl0aHJvdyBKdChTdCk7Y29uc3Qgcj17UHJvdG9jb2w6dFsxXSxIb3N0TmFtZUFuZFBvcnQ6dFs0XSxBYnNvbHV0ZVBhdGg6dFs1XSxRdWVyeVN0cmluZzp0WzddfTtsZXQgbj1yLkFic29sdXRlUGF0aC5zcGxpdCgiLyIpO3JldHVybiBuPW4uZmlsdGVyKChlPT5lJiZlLmxlbmd0aD4wKSksci5QYXRoU2VnbWVudHM9bixyLlF1ZXJ5U3RyaW5nJiZyLlF1ZXJ5U3RyaW5nLmVuZHNXaXRoKCIvIikmJihyLlF1ZXJ5U3RyaW5nPXIuUXVlcnlTdHJpbmcuc3Vic3RyaW5nKDAsci5RdWVyeVN0cmluZy5sZW5ndGgtMSkpLHJ9c3RhdGljIGdldERvbWFpbkZyb21VcmwoZSl7Y29uc3QgdD1SZWdFeHAoIl4oW146Lz8jXSs6Ly8pPyhbXi8/I10qKSIpLHI9ZS5tYXRjaCh0KTtpZighcil0aHJvdyBKdChTdCk7cmV0dXJuIHJbMl19c3RhdGljIGdldEFic29sdXRlVXJsKGUscil7aWYoZVswXT09PXQuRk9SV0FSRF9TTEFTSCl7Y29uc3QgdD1uZXcgd3IocikuZ2V0VXJsQ29tcG9uZW50cygpO3JldHVybiB0LlByb3RvY29sKyIvLyIrdC5Ib3N0TmFtZUFuZFBvcnQrZX1yZXR1cm4gZX1zdGF0aWMgY29uc3RydWN0QXV0aG9yaXR5VXJpRnJvbU9iamVjdChlKXtyZXR1cm4gbmV3IHdyKGUuUHJvdG9jb2wrIi8vIitlLkhvc3ROYW1lQW5kUG9ydCsiLyIrZS5QYXRoU2VnbWVudHMuam9pbigiLyIpKX1zdGF0aWMgaGFzaENvbnRhaW5zS25vd25Qcm9wZXJ0aWVzKGUpe3JldHVybiEhZnIoZSl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB2cj17ImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iOnt0b2tlbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvdG9rZW4iLGp3a3NfdXJpOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20ve3RlbmFudGlkfS9kaXNjb3ZlcnkvdjIuMC9rZXlzIixpc3N1ZXI6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L3YyLjAiLGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L29hdXRoMi92Mi4wL2F1dGhvcml6ZSIsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L29hdXRoMi92Mi4wL2xvZ291dCJ9LCJsb2dpbi5jaGluYWNsb3VkYXBpLmNuIjp7dG9rZW5fZW5kcG9pbnQ6Imh0dHBzOi8vbG9naW4uY2hpbmFjbG91ZGFwaS5jbi97dGVuYW50aWR9L29hdXRoMi92Mi4wL3Rva2VuIixqd2tzX3VyaToiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuL3t0ZW5hbnRpZH0vZGlzY292ZXJ5L3YyLjAva2V5cyIsaXNzdWVyOiJodHRwczovL2xvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuL3t0ZW5hbnRpZH0vdjIuMCIsYXV0aG9yaXphdGlvbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvYXV0aG9yaXplIixlbmRfc2Vzc2lvbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvbG9nb3V0In0sImxvZ2luLm1pY3Jvc29mdG9ubGluZS51cyI6e3Rva2VuX2VuZHBvaW50OiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS51cy97dGVuYW50aWR9L29hdXRoMi92Mi4wL3Rva2VuIixqd2tzX3VyaToiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMve3RlbmFudGlkfS9kaXNjb3ZlcnkvdjIuMC9rZXlzIixpc3N1ZXI6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLnVzL3t0ZW5hbnRpZH0vdjIuMCIsYXV0aG9yaXphdGlvbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMve3RlbmFudGlkfS9vYXV0aDIvdjIuMC9hdXRob3JpemUiLGVuZF9zZXNzaW9uX2VuZHBvaW50OiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS51cy97dGVuYW50aWR9L29hdXRoMi92Mi4wL2xvZ291dCJ9fSxJcj17bWV0YWRhdGE6W3twcmVmZXJyZWRfbmV0d29yazoibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSIscHJlZmVycmVkX2NhY2hlOiJsb2dpbi53aW5kb3dzLm5ldCIsYWxpYXNlczpbImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iLCJsb2dpbi53aW5kb3dzLm5ldCIsImxvZ2luLm1pY3Jvc29mdC5jb20iLCJzdHMud2luZG93cy5uZXQiXX0se3ByZWZlcnJlZF9uZXR3b3JrOiJsb2dpbi5wYXJ0bmVyLm1pY3Jvc29mdG9ubGluZS5jbiIscHJlZmVycmVkX2NhY2hlOiJsb2dpbi5wYXJ0bmVyLm1pY3Jvc29mdG9ubGluZS5jbiIsYWxpYXNlczpbImxvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuIiwibG9naW4uY2hpbmFjbG91ZGFwaS5jbiJdfSx7cHJlZmVycmVkX25ldHdvcms6ImxvZ2luLm1pY3Jvc29mdG9ubGluZS5kZSIscHJlZmVycmVkX2NhY2hlOiJsb2dpbi5taWNyb3NvZnRvbmxpbmUuZGUiLGFsaWFzZXM6WyJsb2dpbi5taWNyb3NvZnRvbmxpbmUuZGUiXX0se3ByZWZlcnJlZF9uZXR3b3JrOiJsb2dpbi5taWNyb3NvZnRvbmxpbmUudXMiLHByZWZlcnJlZF9jYWNoZToibG9naW4ubWljcm9zb2Z0b25saW5lLnVzIixhbGlhc2VzOlsibG9naW4ubWljcm9zb2Z0b25saW5lLnVzIiwibG9naW4udXNnb3ZjbG91ZGFwaS5uZXQiXX0se3ByZWZlcnJlZF9uZXR3b3JrOiJsb2dpbi11cy5taWNyb3NvZnRvbmxpbmUuY29tIixwcmVmZXJyZWRfY2FjaGU6ImxvZ2luLXVzLm1pY3Jvc29mdG9ubGluZS5jb20iLGFsaWFzZXM6WyJsb2dpbi11cy5taWNyb3NvZnRvbmxpbmUuY29tIl19XX0sVHI9bmV3IFNldDtmdW5jdGlvbiBBcihlLHQscixuKXtpZihuPy50cmFjZShgZ2V0QWxpYXNlc0Zyb21NZXRhZGF0YSBjYWxsZWQgd2l0aCBzb3VyY2U6ICR7cn1gKSxlJiZ0KXtjb25zdCBvPWtyKHQsZSk7aWYobylyZXR1cm4gbj8udHJhY2UoYGdldEFsaWFzZXNGcm9tTWV0YWRhdGE6IGZvdW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiAke3J9LCByZXR1cm5pbmcgYWxpYXNlc2ApLG8uYWxpYXNlcztuPy50cmFjZShgZ2V0QWxpYXNlc0Zyb21NZXRhZGF0YTogZGlkIG5vdCBmaW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiAke3J9YCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24ga3IoZSx0KXtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7Y29uc3Qgbj1lW3JdO2lmKG4uYWxpYXNlcy5pbmNsdWRlcyh0KSlyZXR1cm4gbn1yZXR1cm4gbnVsbH0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovSXIubWV0YWRhdGEuZm9yRWFjaCgoZT0+e2UuYWxpYXNlcy5mb3JFYWNoKChlPT57VHIuYWRkKGUpfSkpfSkpO2NvbnN0IFNyPSJjYWNoZV9xdW90YV9leGNlZWRlZCIsYnI9ImNhY2hlX2Vycm9yX3Vua25vd24iLEVyPXtbU3JdOiJFeGNlZWRlZCBjYWNoZSBzdG9yYWdlIGNhcGFjaXR5LiIsW2JyXToiVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGVuIHVzaW5nIGNhY2hlIHN0b3JhZ2UuIn07Y2xhc3MgUnIgZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe2NvbnN0IHI9dHx8KEVyW2VdP0VyW2VdOkVyW2JyXSk7c3VwZXIoYCR7ZX06ICR7cn1gKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxSci5wcm90b3R5cGUpLHRoaXMubmFtZT0iQ2FjaGVFcnJvciIsdGhpcy5lcnJvckNvZGU9ZSx0aGlzLmVycm9yTWVzc2FnZT1yfX1mdW5jdGlvbiBfcihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yPyJRdW90YUV4Y2VlZGVkRXJyb3IiPT09ZS5uYW1lfHwiTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQiPT09ZS5uYW1lfHxlLm1lc3NhZ2UuaW5jbHVkZXMoImV4Y2VlZGVkIHRoZSBxdW90YSIpP25ldyBScihTcik6bmV3IFJyKGUubmFtZSxlLm1lc3NhZ2UpOm5ldyBScihicil9Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIFBye2NvbnN0cnVjdG9yKGUsdCxyLG4sbyl7dGhpcy5jbGllbnRJZD1lLHRoaXMuY3J5cHRvSW1wbD10LHRoaXMuY29tbW9uTG9nZ2VyPXIuY2xvbmUod3QsdnQpLHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucz1vLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ9bn1nZXRBbGxBY2NvdW50cyhlLHQpe3JldHVybiB0aGlzLmJ1aWxkVGVuYW50UHJvZmlsZXModGhpcy5nZXRBY2NvdW50c0ZpbHRlcmVkQnkoZSx0KSx0LGUpfWdldEFjY291bnRJbmZvRmlsdGVyZWRCeShlLHQpe2lmKDA9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGh8fE9iamVjdC52YWx1ZXMoZSkuZXZlcnkoKGU9PiFlKSkpcmV0dXJuIHRoaXMuY29tbW9uTG9nZ2VyLndhcm5pbmcoImdldEFjY291bnRJbmZvRmlsdGVyZWRCeTogQWNjb3VudCBmaWx0ZXIgaXMgZW1wdHkgb3IgaW52YWxpZCwgcmV0dXJuaW5nIG51bGwiKSxudWxsO2NvbnN0IHI9dGhpcy5nZXRBbGxBY2NvdW50cyhlLHQpO2lmKHIubGVuZ3RoPjEpe3JldHVybiByLnNvcnQoKGU9PmUuaWRUb2tlbkNsYWltcz8tMToxKSlbMF19cmV0dXJuIDE9PT1yLmxlbmd0aD9yWzBdOm51bGx9Z2V0QmFzZUFjY291bnRJbmZvKGUsdCl7Y29uc3Qgcj10aGlzLmdldEFjY291bnRzRmlsdGVyZWRCeShlLHQpO3JldHVybiByLmxlbmd0aD4wP2hyLmdldEFjY291bnRJbmZvKHJbMF0pOm51bGx9YnVpbGRUZW5hbnRQcm9maWxlcyhlLHQscil7cmV0dXJuIGUuZmxhdE1hcCgoZT0+dGhpcy5nZXRUZW5hbnRQcm9maWxlc0Zyb21BY2NvdW50RW50aXR5KGUsdCxyPy50ZW5hbnRJZCxyKSkpfWdldFRlbmFudGVkQWNjb3VudEluZm9CeUZpbHRlcihlLHQscixuLG8pe2xldCBpLHM9bnVsbDtpZihvJiYhdGhpcy50ZW5hbnRQcm9maWxlTWF0Y2hlc0ZpbHRlcihyLG8pKXJldHVybiBudWxsO2NvbnN0IGE9dGhpcy5nZXRJZFRva2VuKGUsbix0LHIudGVuYW50SWQpO3JldHVybiBhJiYoaT1kcihhLnNlY3JldCx0aGlzLmNyeXB0b0ltcGwuYmFzZTY0RGVjb2RlKSwhdGhpcy5pZFRva2VuQ2xhaW1zTWF0Y2hUZW5hbnRQcm9maWxlRmlsdGVyKGksbykpP251bGw6KHM9bnIoZSxyLGksYT8uc2VjcmV0KSxzKX1nZXRUZW5hbnRQcm9maWxlc0Zyb21BY2NvdW50RW50aXR5KGUsdCxyLG4pe2NvbnN0IG89aHIuZ2V0QWNjb3VudEluZm8oZSk7bGV0IGk9by50ZW5hbnRQcm9maWxlc3x8bmV3IE1hcDtjb25zdCBzPXRoaXMuZ2V0VG9rZW5LZXlzKCk7aWYocil7Y29uc3QgZT1pLmdldChyKTtpZighZSlyZXR1cm5bXTtpPW5ldyBNYXAoW1tyLGVdXSl9Y29uc3QgYT1bXTtyZXR1cm4gaS5mb3JFYWNoKChlPT57Y29uc3Qgcj10aGlzLmdldFRlbmFudGVkQWNjb3VudEluZm9CeUZpbHRlcihvLHMsZSx0LG4pO3ImJmEucHVzaChyKX0pKSxhfXRlbmFudFByb2ZpbGVNYXRjaGVzRmlsdGVyKGUsdCl7cmV0dXJuISh0LmxvY2FsQWNjb3VudElkJiYhdGhpcy5tYXRjaExvY2FsQWNjb3VudElkRnJvbVRlbmFudFByb2ZpbGUoZSx0LmxvY2FsQWNjb3VudElkKSkmJigoIXQubmFtZXx8ZS5uYW1lPT09dC5uYW1lKSYmKHZvaWQgMD09PXQuaXNIb21lVGVuYW50fHxlLmlzSG9tZVRlbmFudD09PXQuaXNIb21lVGVuYW50KSl9aWRUb2tlbkNsYWltc01hdGNoVGVuYW50UHJvZmlsZUZpbHRlcihlLHQpe2lmKHQpe2lmKHQubG9jYWxBY2NvdW50SWQmJiF0aGlzLm1hdGNoTG9jYWxBY2NvdW50SWRGcm9tVG9rZW5DbGFpbXMoZSx0LmxvY2FsQWNjb3VudElkKSlyZXR1cm4hMTtpZih0LmxvZ2luSGludCYmIXRoaXMubWF0Y2hMb2dpbkhpbnRGcm9tVG9rZW5DbGFpbXMoZSx0LmxvZ2luSGludCkpcmV0dXJuITE7aWYodC51c2VybmFtZSYmIXRoaXMubWF0Y2hVc2VybmFtZShlLnByZWZlcnJlZF91c2VybmFtZSx0LnVzZXJuYW1lKSlyZXR1cm4hMTtpZih0Lm5hbWUmJiF0aGlzLm1hdGNoTmFtZShlLHQubmFtZSkpcmV0dXJuITE7aWYodC5zaWQmJiF0aGlzLm1hdGNoU2lkKGUsdC5zaWQpKXJldHVybiExfXJldHVybiEwfWFzeW5jIHNhdmVDYWNoZVJlY29yZChlLHQscixuKXtpZighZSl0aHJvdyBtdCgkZSk7dHJ5e2UuYWNjb3VudCYmYXdhaXQgdGhpcy5zZXRBY2NvdW50KGUuYWNjb3VudCx0LHIpLGUuaWRUb2tlbiYmITEhPT1uPy5pZFRva2VuJiZhd2FpdCB0aGlzLnNldElkVG9rZW5DcmVkZW50aWFsKGUuaWRUb2tlbix0LHIpLGUuYWNjZXNzVG9rZW4mJiExIT09bj8uYWNjZXNzVG9rZW4mJmF3YWl0IHRoaXMuc2F2ZUFjY2Vzc1Rva2VuKGUuYWNjZXNzVG9rZW4sdCxyKSxlLnJlZnJlc2hUb2tlbiYmITEhPT1uPy5yZWZyZXNoVG9rZW4mJmF3YWl0IHRoaXMuc2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbChlLnJlZnJlc2hUb2tlbix0LHIpLGUuYXBwTWV0YWRhdGEmJnRoaXMuc2V0QXBwTWV0YWRhdGEoZS5hcHBNZXRhZGF0YSx0KX1jYXRjaChlKXt0aHJvdyB0aGlzLmNvbW1vbkxvZ2dlcj8uZXJyb3IoIkNhY2hlTWFuYWdlci5zYXZlQ2FjaGVSZWNvcmQ6IGZhaWxlZCIpLGUgaW5zdGFuY2VvZiBDZT9lOl9yKGUpfX1hc3luYyBzYXZlQWNjZXNzVG9rZW4oZSx0LHIpe2NvbnN0IG49e2NsaWVudElkOmUuY2xpZW50SWQsY3JlZGVudGlhbFR5cGU6ZS5jcmVkZW50aWFsVHlwZSxlbnZpcm9ubWVudDplLmVudmlyb25tZW50LGhvbWVBY2NvdW50SWQ6ZS5ob21lQWNjb3VudElkLHJlYWxtOmUucmVhbG0sdG9rZW5UeXBlOmUudG9rZW5UeXBlLHJlcXVlc3RlZENsYWltc0hhc2g6ZS5yZXF1ZXN0ZWRDbGFpbXNIYXNofSxvPXRoaXMuZ2V0VG9rZW5LZXlzKCksaT1YdC5mcm9tU3RyaW5nKGUudGFyZ2V0KTtvLmFjY2Vzc1Rva2VuLmZvckVhY2goKGU9PntpZighdGhpcy5hY2Nlc3NUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSxuLCExKSlyZXR1cm47Y29uc3Qgcj10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLHQpO2lmKHImJnRoaXMuY3JlZGVudGlhbE1hdGNoZXNGaWx0ZXIocixuKSl7WHQuZnJvbVN0cmluZyhyLnRhcmdldCkuaW50ZXJzZWN0aW5nU2NvcGVTZXRzKGkpJiZ0aGlzLnJlbW92ZUFjY2Vzc1Rva2VuKGUsdCl9fSkpLGF3YWl0IHRoaXMuc2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGUsdCxyKX1nZXRBY2NvdW50c0ZpbHRlcmVkQnkoZSx0KXtjb25zdCByPXRoaXMuZ2V0QWNjb3VudEtleXMoKSxuPVtdO3JldHVybiByLmZvckVhY2goKHI9Pntjb25zdCBvPXRoaXMuZ2V0QWNjb3VudChyLHQpO2lmKCFvKXJldHVybjtpZihlLmhvbWVBY2NvdW50SWQmJiF0aGlzLm1hdGNoSG9tZUFjY291bnRJZChvLGUuaG9tZUFjY291bnRJZCkpcmV0dXJuO2lmKGUudXNlcm5hbWUmJiF0aGlzLm1hdGNoVXNlcm5hbWUoby51c2VybmFtZSxlLnVzZXJuYW1lKSlyZXR1cm47aWYoZS5lbnZpcm9ubWVudCYmIXRoaXMubWF0Y2hFbnZpcm9ubWVudChvLGUuZW52aXJvbm1lbnQpKXJldHVybjtpZihlLnJlYWxtJiYhdGhpcy5tYXRjaFJlYWxtKG8sZS5yZWFsbSkpcmV0dXJuO2lmKGUubmF0aXZlQWNjb3VudElkJiYhdGhpcy5tYXRjaE5hdGl2ZUFjY291bnRJZChvLGUubmF0aXZlQWNjb3VudElkKSlyZXR1cm47aWYoZS5hdXRob3JpdHlUeXBlJiYhdGhpcy5tYXRjaEF1dGhvcml0eVR5cGUobyxlLmF1dGhvcml0eVR5cGUpKXJldHVybjtjb25zdCBpPXtsb2NhbEFjY291bnRJZDplPy5sb2NhbEFjY291bnRJZCxuYW1lOmU/Lm5hbWV9LHM9by50ZW5hbnRQcm9maWxlcz8uZmlsdGVyKChlPT50aGlzLnRlbmFudFByb2ZpbGVNYXRjaGVzRmlsdGVyKGUsaSkpKTtzJiYwPT09cy5sZW5ndGh8fG4ucHVzaChvKX0pKSxufWNyZWRlbnRpYWxNYXRjaGVzRmlsdGVyKGUsdCl7aWYodC5jbGllbnRJZCYmIXRoaXMubWF0Y2hDbGllbnRJZChlLHQuY2xpZW50SWQpKXJldHVybiExO2lmKHQudXNlckFzc2VydGlvbkhhc2gmJiF0aGlzLm1hdGNoVXNlckFzc2VydGlvbkhhc2goZSx0LnVzZXJBc3NlcnRpb25IYXNoKSlyZXR1cm4hMTtpZigic3RyaW5nIj09dHlwZW9mIHQuaG9tZUFjY291bnRJZCYmIXRoaXMubWF0Y2hIb21lQWNjb3VudElkKGUsdC5ob21lQWNjb3VudElkKSlyZXR1cm4hMTtpZih0LmVudmlyb25tZW50JiYhdGhpcy5tYXRjaEVudmlyb25tZW50KGUsdC5lbnZpcm9ubWVudCkpcmV0dXJuITE7aWYodC5yZWFsbSYmIXRoaXMubWF0Y2hSZWFsbShlLHQucmVhbG0pKXJldHVybiExO2lmKHQuY3JlZGVudGlhbFR5cGUmJiF0aGlzLm1hdGNoQ3JlZGVudGlhbFR5cGUoZSx0LmNyZWRlbnRpYWxUeXBlKSlyZXR1cm4hMTtpZih0LmZhbWlseUlkJiYhdGhpcy5tYXRjaEZhbWlseUlkKGUsdC5mYW1pbHlJZCkpcmV0dXJuITE7aWYodC50YXJnZXQmJiF0aGlzLm1hdGNoVGFyZ2V0KGUsdC50YXJnZXQpKXJldHVybiExO2lmKCh0LnJlcXVlc3RlZENsYWltc0hhc2h8fGUucmVxdWVzdGVkQ2xhaW1zSGFzaCkmJmUucmVxdWVzdGVkQ2xhaW1zSGFzaCE9PXQucmVxdWVzdGVkQ2xhaW1zSGFzaClyZXR1cm4hMTtpZihlLmNyZWRlbnRpYWxUeXBlPT09SC5BQ0NFU1NfVE9LRU5fV0lUSF9BVVRIX1NDSEVNRSl7aWYodC50b2tlblR5cGUmJiF0aGlzLm1hdGNoVG9rZW5UeXBlKGUsdC50b2tlblR5cGUpKXJldHVybiExO2lmKHQudG9rZW5UeXBlPT09Vy5TU0gmJnQua2V5SWQmJiF0aGlzLm1hdGNoS2V5SWQoZSx0LmtleUlkKSlyZXR1cm4hMX1yZXR1cm4hMH1nZXRBcHBNZXRhZGF0YUZpbHRlcmVkQnkoZSl7Y29uc3QgdD10aGlzLmdldEtleXMoKSxyPXt9O3JldHVybiB0LmZvckVhY2goKHQ9PntpZighdGhpcy5pc0FwcE1ldGFkYXRhKHQpKXJldHVybjtjb25zdCBuPXRoaXMuZ2V0QXBwTWV0YWRhdGEodCk7biYmKGUuZW52aXJvbm1lbnQmJiF0aGlzLm1hdGNoRW52aXJvbm1lbnQobixlLmVudmlyb25tZW50KXx8ZS5jbGllbnRJZCYmIXRoaXMubWF0Y2hDbGllbnRJZChuLGUuY2xpZW50SWQpfHwoclt0XT1uKSl9KSkscn1nZXRBdXRob3JpdHlNZXRhZGF0YUJ5QWxpYXMoZSl7Y29uc3QgdD10aGlzLmdldEF1dGhvcml0eU1ldGFkYXRhS2V5cygpO2xldCByPW51bGw7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2lmKCF0aGlzLmlzQXV0aG9yaXR5TWV0YWRhdGEodCl8fC0xPT09dC5pbmRleE9mKHRoaXMuY2xpZW50SWQpKXJldHVybjtjb25zdCBuPXRoaXMuZ2V0QXV0aG9yaXR5TWV0YWRhdGEodCk7biYmLTEhPT1uLmFsaWFzZXMuaW5kZXhPZihlKSYmKHI9bil9KSkscn1yZW1vdmVBbGxBY2NvdW50cyhlKXt0aGlzLmdldEFsbEFjY291bnRzKHt9LGUpLmZvckVhY2goKHQ9Pnt0aGlzLnJlbW92ZUFjY291bnQodCxlKX0pKX1yZW1vdmVBY2NvdW50KGUsdCl7dGhpcy5yZW1vdmVBY2NvdW50Q29udGV4dChlLHQpO3RoaXMuZ2V0QWNjb3VudEtleXMoKS5maWx0ZXIoKHQ9PnQuaW5jbHVkZXMoZS5ob21lQWNjb3VudElkKSYmdC5pbmNsdWRlcyhlLmVudmlyb25tZW50KSkpLmZvckVhY2goKGU9Pnt0aGlzLnJlbW92ZUl0ZW0oZSx0KSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7YWNjb3VudHNSZW1vdmVkOjF9LHQpfSkpfXJlbW92ZUFjY291bnRDb250ZXh0KGUsdCl7Y29uc3Qgcj10aGlzLmdldFRva2VuS2V5cygpLG49dD0+dC5pbmNsdWRlcyhlLmhvbWVBY2NvdW50SWQpJiZ0LmluY2x1ZGVzKGUuZW52aXJvbm1lbnQpO3IuaWRUb2tlbi5maWx0ZXIobikuZm9yRWFjaCgoZT0+e3RoaXMucmVtb3ZlSWRUb2tlbihlLHQpfSkpLHIuYWNjZXNzVG9rZW4uZmlsdGVyKG4pLmZvckVhY2goKGU9Pnt0aGlzLnJlbW92ZUFjY2Vzc1Rva2VuKGUsdCl9KSksci5yZWZyZXNoVG9rZW4uZmlsdGVyKG4pLmZvckVhY2goKGU9Pnt0aGlzLnJlbW92ZVJlZnJlc2hUb2tlbihlLHQpfSkpfXJlbW92ZUFjY2Vzc1Rva2VuKGUsdCl7Y29uc3Qgcj10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLHQpO2lmKHRoaXMucmVtb3ZlSXRlbShlLHQpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHthY2Nlc3NUb2tlbnNSZW1vdmVkOjF9LHQpLCFyfHxyLmNyZWRlbnRpYWxUeXBlLnRvTG93ZXJDYXNlKCkhPT1ILkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FLnRvTG93ZXJDYXNlKCl8fHIudG9rZW5UeXBlIT09Vy5QT1ApcmV0dXJuO2NvbnN0IG49ci5rZXlJZDtuJiZ0aGlzLmNyeXB0b0ltcGwucmVtb3ZlVG9rZW5CaW5kaW5nS2V5KG4pLmNhdGNoKCgoKT0+e3RoaXMuY29tbW9uTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVtb3ZlIHRva2VuIGJpbmRpbmcga2V5ICR7bn1gLHQpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmluY3JlbWVudEZpZWxkcyh7cmVtb3ZlVG9rZW5CaW5kaW5nS2V5RmFpbHVyZToxfSx0KX0pKX1yZW1vdmVBcHBNZXRhZGF0YShlKXtyZXR1cm4gdGhpcy5nZXRLZXlzKCkuZm9yRWFjaCgodD0+e3RoaXMuaXNBcHBNZXRhZGF0YSh0KSYmdGhpcy5yZW1vdmVJdGVtKHQsZSl9KSksITB9Z2V0SWRUb2tlbihlLHQscixuLG8pe3RoaXMuY29tbW9uTG9nZ2VyLnRyYWNlKCJDYWNoZU1hbmFnZXIgLSBnZXRJZFRva2VuIGNhbGxlZCIpO2NvbnN0IGk9e2hvbWVBY2NvdW50SWQ6ZS5ob21lQWNjb3VudElkLGVudmlyb25tZW50OmUuZW52aXJvbm1lbnQsY3JlZGVudGlhbFR5cGU6SC5JRF9UT0tFTixjbGllbnRJZDp0aGlzLmNsaWVudElkLHJlYWxtOm59LHM9dGhpcy5nZXRJZFRva2Vuc0J5RmlsdGVyKGksdCxyKSxhPXMuc2l6ZTtpZihhPDEpcmV0dXJuIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRJZFRva2VuIC0gTm8gdG9rZW4gZm91bmQiKSxudWxsO2lmKGE+MSl7bGV0IHI9cztpZighbil7Y29uc3QgdD1uZXcgTWFwO3MuZm9yRWFjaCgoKHIsbik9PntyLnJlYWxtPT09ZS50ZW5hbnRJZCYmdC5zZXQobixyKX0pKTtjb25zdCBuPXQuc2l6ZTtpZihuPDEpcmV0dXJuIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRJZFRva2VuIC0gTXVsdGlwbGUgSUQgdG9rZW5zIGZvdW5kIGZvciBhY2NvdW50IGJ1dCBub25lIG1hdGNoIGFjY291bnQgZW50aXR5IHRlbmFudCBpZCwgcmV0dXJuaW5nIGZpcnN0IHJlc3VsdCIpLHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO2lmKDE9PT1uKXJldHVybiB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIE11bHRpcGxlIElEIHRva2VucyBmb3VuZCBmb3IgYWNjb3VudCwgZGVmYXVsdGluZyB0byBob21lIHRlbmFudCBwcm9maWxlIiksdC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7cj10fXJldHVybiB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIE11bHRpcGxlIG1hdGNoaW5nIElEIHRva2VucyBmb3VuZCwgY2xlYXJpbmcgdGhlbSIpLHIuZm9yRWFjaCgoKGUscik9Pnt0aGlzLnJlbW92ZUlkVG9rZW4ocix0KX0pKSxvJiZ0JiZvLmFkZEZpZWxkcyh7bXVsdGlNYXRjaGVkSUQ6cy5zaXplfSx0KSxudWxsfXJldHVybiB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIFJldHVybmluZyBJRCB0b2tlbiIpLHMudmFsdWVzKCkubmV4dCgpLnZhbHVlfWdldElkVG9rZW5zQnlGaWx0ZXIoZSx0LHIpe2NvbnN0IG49ciYmci5pZFRva2VufHx0aGlzLmdldFRva2VuS2V5cygpLmlkVG9rZW4sbz1uZXcgTWFwO3JldHVybiBuLmZvckVhY2goKHI9PntpZighdGhpcy5pZFRva2VuS2V5TWF0Y2hlc0ZpbHRlcihyLHtjbGllbnRJZDp0aGlzLmNsaWVudElkLC4uLmV9KSlyZXR1cm47Y29uc3Qgbj10aGlzLmdldElkVG9rZW5DcmVkZW50aWFsKHIsdCk7biYmdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihuLGUpJiZvLnNldChyLG4pfSkpLG99aWRUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSx0KXtjb25zdCByPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oIXQuY2xpZW50SWR8fC0xIT09ci5pbmRleE9mKHQuY2xpZW50SWQudG9Mb3dlckNhc2UoKSkpJiYoIXQuaG9tZUFjY291bnRJZHx8LTEhPT1yLmluZGV4T2YodC5ob21lQWNjb3VudElkLnRvTG93ZXJDYXNlKCkpKX1yZW1vdmVJZFRva2VuKGUsdCl7dGhpcy5yZW1vdmVJdGVtKGUsdCl9cmVtb3ZlUmVmcmVzaFRva2VuKGUsdCl7dGhpcy5yZW1vdmVJdGVtKGUsdCl9Z2V0QWNjZXNzVG9rZW4oZSx0LHIsbil7Y29uc3Qgbz10LmNvcnJlbGF0aW9uSWQ7dGhpcy5jb21tb25Mb2dnZXIudHJhY2UoIkNhY2hlTWFuYWdlciAtIGdldEFjY2Vzc1Rva2VuIGNhbGxlZCIsbyk7Y29uc3QgaT1YdC5jcmVhdGVTZWFyY2hTY29wZXModC5zY29wZXMpLHM9dC5hdXRoZW50aWNhdGlvblNjaGVtZXx8Vy5CRUFSRVIsYT1zJiZzLnRvTG93ZXJDYXNlKCkhPT1XLkJFQVJFUi50b0xvd2VyQ2FzZSgpP0guQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUU6SC5BQ0NFU1NfVE9LRU4sYz17aG9tZUFjY291bnRJZDplLmhvbWVBY2NvdW50SWQsZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudCxjcmVkZW50aWFsVHlwZTphLGNsaWVudElkOnRoaXMuY2xpZW50SWQscmVhbG06bnx8ZS50ZW5hbnRJZCx0YXJnZXQ6aSx0b2tlblR5cGU6cyxrZXlJZDp0LnNzaEtpZCxyZXF1ZXN0ZWRDbGFpbXNIYXNoOnQucmVxdWVzdGVkQ2xhaW1zSGFzaH0sbD1yJiZyLmFjY2Vzc1Rva2VufHx0aGlzLmdldFRva2VuS2V5cygpLmFjY2Vzc1Rva2VuLGg9W107bC5mb3JFYWNoKChlPT57aWYodGhpcy5hY2Nlc3NUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSxjLCEwKSl7Y29uc3QgdD10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLG8pO3QmJnRoaXMuY3JlZGVudGlhbE1hdGNoZXNGaWx0ZXIodCxjKSYmaC5wdXNoKHQpfX0pKTtjb25zdCBkPWgubGVuZ3RoO3JldHVybiBkPDE/KHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRBY2Nlc3NUb2tlbiAtIE5vIHRva2VuIGZvdW5kIixvKSxudWxsKTpkPjE/KHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRBY2Nlc3NUb2tlbiAtIE11bHRpcGxlIGFjY2VzcyB0b2tlbnMgZm91bmQsIGNsZWFyaW5nIHRoZW0iLG8pLGguZm9yRWFjaCgoZT0+e3RoaXMucmVtb3ZlQWNjZXNzVG9rZW4odGhpcy5nZW5lcmF0ZUNyZWRlbnRpYWxLZXkoZSksbyl9KSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe211bHRpTWF0Y2hlZEFUOmgubGVuZ3RofSxvKSxudWxsKToodGhpcy5jb21tb25Mb2dnZXIuaW5mbygiQ2FjaGVNYW5hZ2VyOmdldEFjY2Vzc1Rva2VuIC0gUmV0dXJuaW5nIGFjY2VzcyB0b2tlbiIsbyksaFswXSl9YWNjZXNzVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGUsdCxyKXtjb25zdCBuPWUudG9Mb3dlckNhc2UoKTtpZih0LmNsaWVudElkJiYtMT09PW4uaW5kZXhPZih0LmNsaWVudElkLnRvTG93ZXJDYXNlKCkpKXJldHVybiExO2lmKHQuaG9tZUFjY291bnRJZCYmLTE9PT1uLmluZGV4T2YodC5ob21lQWNjb3VudElkLnRvTG93ZXJDYXNlKCkpKXJldHVybiExO2lmKHQucmVhbG0mJi0xPT09bi5pbmRleE9mKHQucmVhbG0udG9Mb3dlckNhc2UoKSkpcmV0dXJuITE7aWYodC5yZXF1ZXN0ZWRDbGFpbXNIYXNoJiYtMT09PW4uaW5kZXhPZih0LnJlcXVlc3RlZENsYWltc0hhc2gudG9Mb3dlckNhc2UoKSkpcmV0dXJuITE7aWYodC50YXJnZXQpe2NvbnN0IGU9dC50YXJnZXQuYXNBcnJheSgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtpZihyJiYhbi5pbmNsdWRlcyhlW3RdLnRvTG93ZXJDYXNlKCkpKXJldHVybiExO2lmKCFyJiZuLmluY2x1ZGVzKGVbdF0udG9Mb3dlckNhc2UoKSkpcmV0dXJuITB9fXJldHVybiEwfWdldEFjY2Vzc1Rva2Vuc0J5RmlsdGVyKGUsdCl7Y29uc3Qgcj10aGlzLmdldFRva2VuS2V5cygpLG49W107cmV0dXJuIHIuYWNjZXNzVG9rZW4uZm9yRWFjaCgocj0+e2lmKCF0aGlzLmFjY2Vzc1Rva2VuS2V5TWF0Y2hlc0ZpbHRlcihyLGUsITApKXJldHVybjtjb25zdCBvPXRoaXMuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKHIsdCk7byYmdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihvLGUpJiZuLnB1c2gobyl9KSksbn1nZXRSZWZyZXNoVG9rZW4oZSx0LHIsbixvKXt0aGlzLmNvbW1vbkxvZ2dlci50cmFjZSgiQ2FjaGVNYW5hZ2VyIC0gZ2V0UmVmcmVzaFRva2VuIGNhbGxlZCIpO2NvbnN0IGk9dD9COnZvaWQgMCxzPXtob21lQWNjb3VudElkOmUuaG9tZUFjY291bnRJZCxlbnZpcm9ubWVudDplLmVudmlyb25tZW50LGNyZWRlbnRpYWxUeXBlOkguUkVGUkVTSF9UT0tFTixjbGllbnRJZDp0aGlzLmNsaWVudElkLGZhbWlseUlkOml9LGE9biYmbi5yZWZyZXNoVG9rZW58fHRoaXMuZ2V0VG9rZW5LZXlzKCkucmVmcmVzaFRva2VuLGM9W107YS5mb3JFYWNoKChlPT57aWYodGhpcy5yZWZyZXNoVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGUscykpe2NvbnN0IHQ9dGhpcy5nZXRSZWZyZXNoVG9rZW5DcmVkZW50aWFsKGUscik7dCYmdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcih0LHMpJiZjLnB1c2godCl9fSkpO2NvbnN0IGw9Yy5sZW5ndGg7cmV0dXJuIGw8MT8odGhpcy5jb21tb25Mb2dnZXIuaW5mbygiQ2FjaGVNYW5hZ2VyOmdldFJlZnJlc2hUb2tlbiAtIE5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIiksbnVsbCk6KGw+MSYmbyYmciYmby5hZGRGaWVsZHMoe211bHRpTWF0Y2hlZFJUOmx9LHIpLHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRSZWZyZXNoVG9rZW4gLSByZXR1cm5pbmcgcmVmcmVzaCB0b2tlbiIpLGNbMF0pfXJlZnJlc2hUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSx0KXtjb25zdCByPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oIXQuZmFtaWx5SWR8fC0xIT09ci5pbmRleE9mKHQuZmFtaWx5SWQudG9Mb3dlckNhc2UoKSkpJiYoISghdC5mYW1pbHlJZCYmdC5jbGllbnRJZCYmLTE9PT1yLmluZGV4T2YodC5jbGllbnRJZC50b0xvd2VyQ2FzZSgpKSkmJighdC5ob21lQWNjb3VudElkfHwtMSE9PXIuaW5kZXhPZih0LmhvbWVBY2NvdW50SWQudG9Mb3dlckNhc2UoKSkpKX1yZWFkQXBwTWV0YWRhdGFGcm9tQ2FjaGUoZSl7Y29uc3QgdD17ZW52aXJvbm1lbnQ6ZSxjbGllbnRJZDp0aGlzLmNsaWVudElkfSxyPXRoaXMuZ2V0QXBwTWV0YWRhdGFGaWx0ZXJlZEJ5KHQpLG49T2JqZWN0LmtleXMocikubWFwKChlPT5yW2VdKSksbz1uLmxlbmd0aDtpZihvPDEpcmV0dXJuIG51bGw7aWYobz4xKXRocm93IG10KExlKTtyZXR1cm4gblswXX1pc0FwcE1ldGFkYXRhRk9DSShlKXtjb25zdCB0PXRoaXMucmVhZEFwcE1ldGFkYXRhRnJvbUNhY2hlKGUpO3JldHVybiEoIXR8fHQuZmFtaWx5SWQhPT1CKX1tYXRjaEhvbWVBY2NvdW50SWQoZSx0KXtyZXR1cm4hKCJzdHJpbmciIT10eXBlb2YgZS5ob21lQWNjb3VudElkfHx0IT09ZS5ob21lQWNjb3VudElkKX1tYXRjaExvY2FsQWNjb3VudElkRnJvbVRva2VuQ2xhaW1zKGUsdCl7cmV0dXJuIHQ9PT0oZS5vaWR8fGUuc3ViKX1tYXRjaExvY2FsQWNjb3VudElkRnJvbVRlbmFudFByb2ZpbGUoZSx0KXtyZXR1cm4gZS5sb2NhbEFjY291bnRJZD09PXR9bWF0Y2hOYW1lKGUsdCl7cmV0dXJuISh0LnRvTG93ZXJDYXNlKCkhPT1lLm5hbWU/LnRvTG93ZXJDYXNlKCkpfW1hdGNoVXNlcm5hbWUoZSx0KXtyZXR1cm4hKCFlfHwic3RyaW5nIiE9dHlwZW9mIGV8fHQ/LnRvTG93ZXJDYXNlKCkhPT1lLnRvTG93ZXJDYXNlKCkpfW1hdGNoVXNlckFzc2VydGlvbkhhc2goZSx0KXtyZXR1cm4hKCFlLnVzZXJBc3NlcnRpb25IYXNofHx0IT09ZS51c2VyQXNzZXJ0aW9uSGFzaCl9bWF0Y2hFbnZpcm9ubWVudChlLHQpe2lmKHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucyl7Y29uc3Qgcj1mdW5jdGlvbihlLHQpe2xldCByO2NvbnN0IG49ZS5jYW5vbmljYWxBdXRob3JpdHk7aWYobil7Y29uc3Qgbz1uZXcgd3IobikuZ2V0VXJsQ29tcG9uZW50cygpLkhvc3ROYW1lQW5kUG9ydDtyPUFyKG8sZS5jbG91ZERpc2NvdmVyeU1ldGFkYXRhPy5tZXRhZGF0YSxLLHQpfHxBcihvLElyLm1ldGFkYXRhLFEsdCl8fGUua25vd25BdXRob3JpdGllc31yZXR1cm4gcnx8W119KHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucyx0aGlzLmNvbW1vbkxvZ2dlcik7aWYoci5pbmNsdWRlcyh0KSYmci5pbmNsdWRlcyhlLmVudmlyb25tZW50KSlyZXR1cm4hMH1jb25zdCByPXRoaXMuZ2V0QXV0aG9yaXR5TWV0YWRhdGFCeUFsaWFzKHQpO3JldHVybiEhKHImJnIuYWxpYXNlcy5pbmRleE9mKGUuZW52aXJvbm1lbnQpPi0xKX1tYXRjaENyZWRlbnRpYWxUeXBlKGUsdCl7cmV0dXJuIGUuY3JlZGVudGlhbFR5cGUmJnQudG9Mb3dlckNhc2UoKT09PWUuY3JlZGVudGlhbFR5cGUudG9Mb3dlckNhc2UoKX1tYXRjaENsaWVudElkKGUsdCl7cmV0dXJuISghZS5jbGllbnRJZHx8dCE9PWUuY2xpZW50SWQpfW1hdGNoRmFtaWx5SWQoZSx0KXtyZXR1cm4hKCFlLmZhbWlseUlkfHx0IT09ZS5mYW1pbHlJZCl9bWF0Y2hSZWFsbShlLHQpe3JldHVybiEoZS5yZWFsbT8udG9Mb3dlckNhc2UoKSE9PXQudG9Mb3dlckNhc2UoKSl9bWF0Y2hOYXRpdmVBY2NvdW50SWQoZSx0KXtyZXR1cm4hKCFlLm5hdGl2ZUFjY291bnRJZHx8dCE9PWUubmF0aXZlQWNjb3VudElkKX1tYXRjaExvZ2luSGludEZyb21Ub2tlbkNsYWltcyhlLHQpe3JldHVybiBlLmxvZ2luX2hpbnQ9PT10fHwoZS5wcmVmZXJyZWRfdXNlcm5hbWU9PT10fHxlLnVwbj09PXQpfW1hdGNoU2lkKGUsdCl7cmV0dXJuIGUuc2lkPT09dH1tYXRjaEF1dGhvcml0eVR5cGUoZSx0KXtyZXR1cm4hKCFlLmF1dGhvcml0eVR5cGV8fHQudG9Mb3dlckNhc2UoKSE9PWUuYXV0aG9yaXR5VHlwZS50b0xvd2VyQ2FzZSgpKX1tYXRjaFRhcmdldChlLHQpe2lmKGUuY3JlZGVudGlhbFR5cGUhPT1ILkFDQ0VTU19UT0tFTiYmZS5jcmVkZW50aWFsVHlwZSE9PUguQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUV8fCFlLnRhcmdldClyZXR1cm4hMTtyZXR1cm4gWHQuZnJvbVN0cmluZyhlLnRhcmdldCkuY29udGFpbnNTY29wZVNldCh0KX1tYXRjaFRva2VuVHlwZShlLHQpe3JldHVybiEoIWUudG9rZW5UeXBlfHxlLnRva2VuVHlwZSE9PXQpfW1hdGNoS2V5SWQoZSx0KXtyZXR1cm4hKCFlLmtleUlkfHxlLmtleUlkIT09dCl9aXNBcHBNZXRhZGF0YShlKXtyZXR1cm4tMSE9PWUuaW5kZXhPZih4KX1pc0F1dGhvcml0eU1ldGFkYXRhKGUpe3JldHVybi0xIT09ZS5pbmRleE9mKEYpfWdlbmVyYXRlQXV0aG9yaXR5TWV0YWRhdGFDYWNoZUtleShlKXtyZXR1cm5gJHtGfS0ke3RoaXMuY2xpZW50SWR9LSR7ZX1gfXN0YXRpYyB0b09iamVjdChlLHQpe2Zvcihjb25zdCByIGluIHQpZVtyXT10W3JdO3JldHVybiBlfX1jbGFzcyBNciBleHRlbmRzIFBye2FzeW5jIHNldEFjY291bnQoKXt0aHJvdyBtdChjdCl9Z2V0QWNjb3VudCgpe3Rocm93IG10KGN0KX1hc3luYyBzZXRJZFRva2VuQ3JlZGVudGlhbCgpe3Rocm93IG10KGN0KX1nZXRJZFRva2VuQ3JlZGVudGlhbCgpe3Rocm93IG10KGN0KX1hc3luYyBzZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwoKXt0aHJvdyBtdChjdCl9Z2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKCl7dGhyb3cgbXQoY3QpfWFzeW5jIHNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoKXt0aHJvdyBtdChjdCl9Z2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbCgpe3Rocm93IG10KGN0KX1zZXRBcHBNZXRhZGF0YSgpe3Rocm93IG10KGN0KX1nZXRBcHBNZXRhZGF0YSgpe3Rocm93IG10KGN0KX1zZXRTZXJ2ZXJUZWxlbWV0cnkoKXt0aHJvdyBtdChjdCl9Z2V0U2VydmVyVGVsZW1ldHJ5KCl7dGhyb3cgbXQoY3QpfXNldEF1dGhvcml0eU1ldGFkYXRhKCl7dGhyb3cgbXQoY3QpfWdldEF1dGhvcml0eU1ldGFkYXRhKCl7dGhyb3cgbXQoY3QpfWdldEF1dGhvcml0eU1ldGFkYXRhS2V5cygpe3Rocm93IG10KGN0KX1zZXRUaHJvdHRsaW5nQ2FjaGUoKXt0aHJvdyBtdChjdCl9Z2V0VGhyb3R0bGluZ0NhY2hlKCl7dGhyb3cgbXQoY3QpfXJlbW92ZUl0ZW0oKXt0aHJvdyBtdChjdCl9Z2V0S2V5cygpe3Rocm93IG10KGN0KX1nZXRBY2NvdW50S2V5cygpe3Rocm93IG10KGN0KX1nZXRUb2tlbktleXMoKXt0aHJvdyBtdChjdCl9Z2VuZXJhdGVDcmVkZW50aWFsS2V5KCl7dGhyb3cgbXQoY3QpfWdlbmVyYXRlQWNjb3VudEtleSgpe3Rocm93IG10KGN0KX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NvbnN0IE9yPXtBY3F1aXJlVG9rZW5CeUNvZGU6ImFjcXVpcmVUb2tlbkJ5Q29kZSIsQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW46ImFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuIixBY3F1aXJlVG9rZW5TaWxlbnQ6ImFjcXVpcmVUb2tlblNpbGVudCIsQWNxdWlyZVRva2VuU2lsZW50QXN5bmM6ImFjcXVpcmVUb2tlblNpbGVudEFzeW5jIixBY3F1aXJlVG9rZW5Qb3B1cDoiYWNxdWlyZVRva2VuUG9wdXAiLEFjcXVpcmVUb2tlblByZVJlZGlyZWN0OiJhY3F1aXJlVG9rZW5QcmVSZWRpcmVjdCIsQWNxdWlyZVRva2VuUmVkaXJlY3Q6ImFjcXVpcmVUb2tlblJlZGlyZWN0IixDcnlwdG9PcHRzR2V0UHVibGljS2V5VGh1bWJwcmludDoiY3J5cHRvT3B0c0dldFB1YmxpY0tleVRodW1icHJpbnQiLENyeXB0b09wdHNTaWduSnd0OiJjcnlwdG9PcHRzU2lnbkp3dCIsU2lsZW50Q2FjaGVDbGllbnRBY3F1aXJlVG9rZW46InNpbGVudENhY2hlQ2xpZW50QWNxdWlyZVRva2VuIixTaWxlbnRJZnJhbWVDbGllbnRBY3F1aXJlVG9rZW46InNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiIsQXdhaXRDb25jdXJyZW50SWZyYW1lOiJhd2FpdENvbmN1cnJlbnRJZnJhbWUiLFNpbGVudFJlZnJlc2hDbGllbnRBY3F1aXJlVG9rZW46InNpbGVudFJlZnJlc2hDbGllbnRBY3F1aXJlVG9rZW4iLFNzb1NpbGVudDoic3NvU2lsZW50IixTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eToic3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldERpc2NvdmVyZWRBdXRob3JpdHkiLEZldGNoQWNjb3VudElkV2l0aE5hdGl2ZUJyb2tlcjoiZmV0Y2hBY2NvdW50SWRXaXRoTmF0aXZlQnJva2VyIixOYXRpdmVJbnRlcmFjdGlvbkNsaWVudEFjcXVpcmVUb2tlbjoibmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW4iLEJhc2VDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzOiJiYXNlQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0SGVhZGVycyIsTmV0d29ya0NsaWVudFNlbmRQb3N0UmVxdWVzdEFzeW5jOiJuZXR3b3JrQ2xpZW50U2VuZFBvc3RSZXF1ZXN0QXN5bmMiLFJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50OiJyZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCIsQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludDoiYXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCIsQnJva2VySGFuZGhzaGFrZToiYnJva2VySGFuZHNoYWtlIixBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbkluQnJva2VyOiJhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbkluQnJva2VyIixBY3F1aXJlVG9rZW5CeUJyb2tlcjoiYWNxdWlyZVRva2VuQnlCcm9rZXIiLFJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3Q6InJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QiLFJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbjoicmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuIixSZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuOiJyZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuIixSZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbjoicmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4iLFJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHk6InJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHkiLEFjcXVpcmVUb2tlbkZyb21DYWNoZToiYWNxdWlyZVRva2VuRnJvbUNhY2hlIixTaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuOiJzaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuIixTaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQ6InNpbGVudEZsb3dDbGllbnRHZW5lcmF0ZVJlc3VsdEZyb21DYWNoZVJlY29yZCIsQWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWU6ImFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lIixJbml0aWFsaXplQmFzZVJlcXVlc3Q6ImluaXRpYWxpemVCYXNlUmVxdWVzdCIsSW5pdGlhbGl6ZVNpbGVudFJlcXVlc3Q6ImluaXRpYWxpemVTaWxlbnRSZXF1ZXN0IixJbml0aWFsaXplQ2xpZW50QXBwbGljYXRpb246ImluaXRpYWxpemVDbGllbnRBcHBsaWNhdGlvbiIsSW5pdGlhbGl6ZUNhY2hlOiJpbml0aWFsaXplQ2FjaGUiLFNpbGVudElmcmFtZUNsaWVudFRva2VuSGVscGVyOiJzaWxlbnRJZnJhbWVDbGllbnRUb2tlbkhlbHBlciIsU2lsZW50SGFuZGxlckluaXRpYXRlQXV0aFJlcXVlc3Q6InNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0IixTaWxlbnRIYW5kbGVyTW9uaXRvcklmcmFtZUZvckhhc2g6InNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCIsU2lsZW50SGFuZGxlckxvYWRGcmFtZToic2lsZW50SGFuZGxlckxvYWRGcmFtZSIsU2lsZW50SGFuZGxlckxvYWRGcmFtZVN5bmM6InNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jIixTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQ6InN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCIsU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldENsaWVudENvbmZpZ3VyYXRpb246InN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uIixTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0OiJzdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0IixHZXRBdXRoQ29kZVVybDoiZ2V0QXV0aENvZGVVcmwiLEdldFN0YW5kYXJkUGFyYW1zOiJnZXRTdGFuZGFyZFBhcmFtcyIsSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcjoiaGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciIsSGFuZGxlQ29kZVJlc3BvbnNlOiJoYW5kbGVDb2RlUmVzcG9uc2UiLEhhbmRsZVJlc3BvbnNlRWFyOiJoYW5kbGVSZXNwb25zZUVhciIsSGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlcjoiaGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlciIsSGFuZGxlUmVzcG9uc2VDb2RlOiJoYW5kbGVSZXNwb25zZUNvZGUiLFVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHk6InVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHkiLEF1dGhDbGllbnRBY3F1aXJlVG9rZW46ImF1dGhDbGllbnRBY3F1aXJlVG9rZW4iLEF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0OiJhdXRoQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCIsQXV0aENsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHk6ImF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5IixQb3BUb2tlbkdlbmVyYXRlQ25mOiJwb3BUb2tlbkdlbmVyYXRlQ25mIixQb3BUb2tlbkdlbmVyYXRlS2lkOiJwb3BUb2tlbkdlbmVyYXRlS2lkIixIYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlOiJoYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlIixEZXNlcmlhbGl6ZVJlc3BvbnNlOiJkZXNlcmlhbGl6ZVJlc3BvbnNlIixBdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlOiJhdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlIixBdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzQXN5bmM6ImF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYyIsQXV0aG9yaXR5UmVzb2x2ZUVuZHBvaW50c0Zyb21Mb2NhbFNvdXJjZXM6ImF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNGcm9tTG9jYWxTb3VyY2VzIixBdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcms6ImF1dGhvcml0eUdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTmV0d29yayIsQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YToiYXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSIsQXV0aG9yaXR5R2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrOiJhdXRob3JpdHlHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmsiLEF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGE6ImF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGEiLEF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb246ImF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24iLFJlZ2lvbkRpc2NvdmVyeURldGVjdFJlZ2lvbjoicmVnaW9uRGlzY292ZXJ5RGV0ZWN0UmVnaW9uIixSZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUzoicmVnaW9uRGlzY292ZXJ5R2V0UmVnaW9uRnJvbUlNRFMiLFJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uOiJyZWdpb25EaXNjb3ZlcnlHZXRDdXJyZW50VmVyc2lvbiIsQWNxdWlyZVRva2VuQnlDb2RlQXN5bmM6ImFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jIixHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6ImdldEVuZHBvaW50TWV0YWRhdGFGcm9tTmV0d29yayIsR2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrTWVhc3VyZW1lbnQ6ImdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTmV0d29ya01lYXN1cmVtZW50IixIYW5kbGVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudDoiaGFuZGxlUmVkaXJlY3RQcm9taXNlIixIYW5kbGVOYXRpdmVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudDoiaGFuZGxlTmF0aXZlUmVkaXJlY3RQcm9taXNlIixVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhTWVhc3VyZW1lbnQ6InVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFNZWFzdXJlbWVudCIsVXNlcm5hbWVQYXNzd29yZENsaWVudEFjcXVpcmVUb2tlbjoidXNlcm5hbWVQYXNzd29yZENsaWVudEFjcXVpcmVUb2tlbiIsTmF0aXZlTWVzc2FnZUhhbmRsZXJIYW5kc2hha2U6Im5hdGl2ZU1lc3NhZ2VIYW5kbGVySGFuZHNoYWtlIixOYXRpdmVHZW5lcmF0ZUF1dGhSZXN1bHQ6Im5hdGl2ZUdlbmVyYXRlQXV0aFJlc3VsdCIsUmVtb3ZlSGlkZGVuSWZyYW1lOiJyZW1vdmVIaWRkZW5JZnJhbWUiLENsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXM6ImNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMiLENhY2hlTWFuYWdlckdldFJlZnJlc2hUb2tlbjoiY2FjaGVNYW5hZ2VyR2V0UmVmcmVzaFRva2VuIixJbXBvcnRFeGlzdGluZ0NhY2hlOiJpbXBvcnRFeGlzdGluZ0NhY2hlIixTZXRVc2VyRGF0YToic2V0VXNlckRhdGEiLExvY2FsU3RvcmFnZVVwZGF0ZWQ6ImxvY2FsU3RvcmFnZVVwZGF0ZWQiLEdlbmVyYXRlUGtjZUNvZGVzOiJnZW5lcmF0ZVBrY2VDb2RlcyIsR2VuZXJhdGVDb2RlVmVyaWZpZXI6ImdlbmVyYXRlQ29kZVZlcmlmaWVyIixHZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXI6ImdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciIsU2hhMjU2RGlnZXN0OiJzaGEyNTZEaWdlc3QiLEdldFJhbmRvbVZhbHVlczoiZ2V0UmFuZG9tVmFsdWVzIixHZW5lcmF0ZUhLREY6ImdlbmVyYXRlSEtERiIsR2VuZXJhdGVCYXNlS2V5OiJnZW5lcmF0ZUJhc2VLZXkiLEJhc2U2NERlY29kZToiYmFzZTY0RGVjb2RlIixVcmxFbmNvZGVBcnI6InVybEVuY29kZUFyciIsRW5jcnlwdDoiZW5jcnlwdCIsRGVjcnlwdDoiZGVjcnlwdCIsR2VuZXJhdGVFYXJLZXk6ImdlbmVyYXRlRWFyS2V5IixEZWNyeXB0RWFyUmVzcG9uc2U6ImRlY3J5cHRFYXJSZXNwb25zZSJ9LHFyPW5ldyBNYXAoW1tPci5BY3F1aXJlVG9rZW5CeUNvZGUsIkFUQnlDb2RlIl0sW09yLkFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLCJBVEJ5UlQiXSxbT3IuQWNxdWlyZVRva2VuU2lsZW50LCJBVFMiXSxbT3IuQWNxdWlyZVRva2VuU2lsZW50QXN5bmMsIkFUU0FzeW5jIl0sW09yLkFjcXVpcmVUb2tlblBvcHVwLCJBVFBvcHVwIl0sW09yLkFjcXVpcmVUb2tlblJlZGlyZWN0LCJBVFJlZGlyZWN0Il0sW09yLkNyeXB0b09wdHNHZXRQdWJsaWNLZXlUaHVtYnByaW50LCJDcnlwdG9HZXRQS1RodW1iIl0sW09yLkNyeXB0b09wdHNTaWduSnd0LCJDcnlwdG9TaWduSnd0Il0sW09yLlNpbGVudENhY2hlQ2xpZW50QWNxdWlyZVRva2VuLCJTbHRDYWNoZUNsaWVudEFUIl0sW09yLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiwiU2x0SWZyYW1lQ2xpZW50QVQiXSxbT3IuU2lsZW50UmVmcmVzaENsaWVudEFjcXVpcmVUb2tlbiwiU2x0UkNsaWVudEFUIl0sW09yLlNzb1NpbGVudCwiU3NvU2x0Il0sW09yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LCJTdGRJbnRDbGllbnRHZXREaXNjQXV0aCJdLFtPci5GZXRjaEFjY291bnRJZFdpdGhOYXRpdmVCcm9rZXIsIkZldGNoQWNjSWRXaXRoTnR2QnJva2VyIl0sW09yLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLCJOdHZJbnRDbGllbnRBVCJdLFtPci5CYXNlQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0SGVhZGVycywiQmFzZUNsaWVudENyZWF0ZVRSZXFIZWFkIl0sW09yLk5ldHdvcmtDbGllbnRTZW5kUG9zdFJlcXVlc3RBc3luYywiTmV0Q2xpZW50U2VuZFBvc3QiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVBvc3RUb1Rva2VuRW5kcG9pbnQsIlJUQ2xpZW50RXhlY1Bvc3QiXSxbT3IuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCwiQXV0aENvZGVDbGllbnRFeGVjUG9zdCJdLFtPci5Ccm9rZXJIYW5kaHNoYWtlLCJCcm9rZXJIYW5kc2hha2UiXSxbT3IuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW5JbkJyb2tlciwiQVRCeVJUSW5Ccm9rZXIiXSxbT3IuQWNxdWlyZVRva2VuQnlCcm9rZXIsIkFUQnlCcm9rZXIiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCwiUlRDbGllbnRFeGVjVFJlcSJdLFtPci5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW4sIlJUQ2xpZW50QVQiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbiwiUlRDbGllbnRBVFdpdGhDYWNoZWRSVCJdLFtPci5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiwiUlRDbGllbnRBVEJ5UlQiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0Qm9keSwiUlRDbGllbnRDcmVhdGVUUmVxQm9keSJdLFtPci5BY3F1aXJlVG9rZW5Gcm9tQ2FjaGUsIkFURnJvbUNhY2hlIl0sW09yLlNpbGVudEZsb3dDbGllbnRBY3F1aXJlQ2FjaGVkVG9rZW4sIlNsdEZsb3dDbGllbnRBVENhY2hlZCJdLFtPci5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsIlNsdEZsb3dDbGllbnRHZW5SZXNGcm9tQ2FjaGUiXSxbT3IuQWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUsIkFUQnlTbHRJZnJhbWUiXSxbT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LCJJbml0QmFzZVJlcSJdLFtPci5Jbml0aWFsaXplU2lsZW50UmVxdWVzdCwiSW5pdFNsdFJlcSJdLFtPci5Jbml0aWFsaXplQ2xpZW50QXBwbGljYXRpb24sIkluaXRDbGllbnRBcHBsaWNhdGlvbiJdLFtPci5Jbml0aWFsaXplQ2FjaGUsIkluaXRDYWNoZSJdLFtPci5JbXBvcnRFeGlzdGluZ0NhY2hlLCJpbXBvcnRDYWNoZSJdLFtPci5TZXRVc2VyRGF0YSwic2V0VXNlckRhdGEiXSxbT3IuTG9jYWxTdG9yYWdlVXBkYXRlZCwibG9jYWxTdG9yYWdlVXBkYXRlZCJdLFtPci5TaWxlbnRJZnJhbWVDbGllbnRUb2tlbkhlbHBlciwiU0lDbGllbnRUSGVscGVyIl0sW09yLlNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0LCJTSGFuZGxlckluaXRBdXRoUmVxIl0sW09yLlNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCwiU2x0SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoIl0sW09yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUsIlNIYW5kbGVyTG9hZEZyYW1lIl0sW09yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jLCJTSGFuZGxlckxvYWRGcmFtZVN5bmMiXSxbT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LCJTdGRJbnRDbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCJdLFtPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbiwiU3RkSW50Q2xpZW50R2V0Q2xpZW50Q29uZiJdLFtPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LCJTdGRJbnRDbGllbnRJbml0QXV0aFJlcSJdLFtPci5HZXRBdXRoQ29kZVVybCwiR2V0QXV0aENvZGVVcmwiXSxbT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciwiSGFuZGxlQ29kZVJlc0Zyb21TZXJ2ZXIiXSxbT3IuSGFuZGxlQ29kZVJlc3BvbnNlLCJIYW5kbGVDb2RlUmVzcCJdLFtPci5IYW5kbGVSZXNwb25zZUVhciwiSGFuZGxlUmVzcEVhciJdLFtPci5IYW5kbGVSZXNwb25zZUNvZGUsIkhhbmRsZVJlc3BDb2RlIl0sW09yLkhhbmRsZVJlc3BvbnNlUGxhdGZvcm1Ccm9rZXIsIkhhbmRsZVJlc3BQbGF0QnJva2VyIl0sW09yLlVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHksIlVwZFRFbmRwb2ludEF1dGgiXSxbT3IuQXV0aENsaWVudEFjcXVpcmVUb2tlbiwiQXV0aENsaWVudEFUIl0sW09yLkF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LCJBdXRoQ2xpZW50RXhlY1RSZXEiXSxbT3IuQXV0aENsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksIkF1dGhDbGllbnRDcmVhdGVUUmVxQm9keSJdLFtPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLCJQb3BUR2VuQ25mIl0sW09yLlBvcFRva2VuR2VuZXJhdGVLaWQsIlBvcFRHZW5LaWQiXSxbT3IuSGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZSwiSGFuZGxlU2VydmVyVFJlcyJdLFtPci5EZXNlcmlhbGl6ZVJlc3BvbnNlLCJEZXNlcmlhbGl6ZVJlcyJdLFtPci5BdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLCJBdXRoRmFjdENyZWF0ZURpc2NJbnN0Il0sW09yLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYywiQXV0aFJlc29sdmVFbmRwb2ludHNBc3luYyJdLFtPci5BdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzRnJvbUxvY2FsU291cmNlcywiQXV0aFJlc29sdmVFbmRwb2ludHNGcm9tTG9jYWwiXSxbT3IuQXV0aG9yaXR5R2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrLCJBdXRoR2V0Q0RNZXRhRnJvbU5ldCJdLFtPci5BdXRob3JpdHlVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhLCJBdXRoVXBkQ0RNZXRhIl0sW09yLkF1dGhvcml0eUdldEVuZHBvaW50TWV0YWRhdGFGcm9tTmV0d29yaywiQXV0aFVwZENETWV0YUZyb21OZXQiXSxbT3IuQXV0aG9yaXR5VXBkYXRlRW5kcG9pbnRNZXRhZGF0YSwiQXV0aFVwZEVuZHBvaW50TWV0YSJdLFtPci5BdXRob3JpdHlVcGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLCJBdXRoVXBkTWV0YVdpdGhSZWdJbmZvIl0sW09yLlJlZ2lvbkRpc2NvdmVyeURldGVjdFJlZ2lvbiwiUmVnRGlzY0RldGVjdFJlZyJdLFtPci5SZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUywiUmVnRGlzY0dldFJlZ0Zyb21JTURTIl0sW09yLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLCJSZWdEaXNjR2V0Q3VycmVudFZlciJdLFtPci5BY3F1aXJlVG9rZW5CeUNvZGVBc3luYywiQVRCeUNvZGVBc3luYyJdLFtPci5HZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmssIkdldEVuZHBvaW50TWV0YUZyb21OZXQiXSxbT3IuR2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrTWVhc3VyZW1lbnQsIkdldENETWV0YUZyb21OZXQiXSxbT3IuSGFuZGxlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsIkhhbmRsZVJlZGlyZWN0UHJvbWlzZSJdLFtPci5IYW5kbGVOYXRpdmVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudCwiSGFuZGxlTnR2UmVkaXJlY3RQcm9taXNlIl0sW09yLlVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFNZWFzdXJlbWVudCwiVXBkYXRlQ0RNZXRhIl0sW09yLlVzZXJuYW1lUGFzc3dvcmRDbGllbnRBY3F1aXJlVG9rZW4sIlVzZXJQYXNzQ2xpZW50QVQiXSxbT3IuTmF0aXZlTWVzc2FnZUhhbmRsZXJIYW5kc2hha2UsIk50dk1zZ0hhbmRsZXJIYW5kc2hha2UiXSxbT3IuTmF0aXZlR2VuZXJhdGVBdXRoUmVzdWx0LCJOdHZHZW5BdXRoUmVzIl0sW09yLlJlbW92ZUhpZGRlbklmcmFtZSwiUmVtb3ZlSGlkZGVuSWZyYW1lIl0sW09yLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsIkNsZWFyVEFuZEtleXNXaXRoQ2xhaW1zIl0sW09yLkNhY2hlTWFuYWdlckdldFJlZnJlc2hUb2tlbiwiQ2FjaGVNYW5hZ2VyR2V0UlQiXSxbT3IuR2VuZXJhdGVQa2NlQ29kZXMsIkdlblBrY2VDb2RlcyJdLFtPci5HZW5lcmF0ZUNvZGVWZXJpZmllciwiR2VuQ29kZVZlcmlmaWVyIl0sW09yLkdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciwiR2VuQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciJdLFtPci5TaGEyNTZEaWdlc3QsIlNoYTI1NkRpZ2VzdCJdLFtPci5HZXRSYW5kb21WYWx1ZXMsIkdldFJhbmRvbVZhbHVlcyJdLFtPci5HZW5lcmF0ZUhLREYsImdlbkhLREYiXSxbT3IuR2VuZXJhdGVCYXNlS2V5LCJnZW5CYXNlS2V5Il0sW09yLkJhc2U2NERlY29kZSwiYjY0RGVjb2RlIl0sW09yLlVybEVuY29kZUFyciwidXJsRW5jQXJyIl0sW09yLkVuY3J5cHQsImVuY3J5cHQiXSxbT3IuRGVjcnlwdCwiZGVjcnlwdCJdLFtPci5HZW5lcmF0ZUVhcktleSwiZ2VuRWFyS2V5Il0sW09yLkRlY3J5cHRFYXJSZXNwb25zZSwiZGVjcnlwdEVhclJlc3AiXV0pLE5yPTEsVXI9MixMcj1uZXcgU2V0KFsiYWNjZXNzVG9rZW5TaXplIiwiZHVyYXRpb25NcyIsImlkVG9rZW5TaXplIiwibWF0c1NpbGVudFN0YXR1cyIsIm1hdHNIdHRwU3RhdHVzIiwicmVmcmVzaFRva2VuU2l6ZSIsInF1ZXVlZFRpbWVNcyIsInN0YXJ0VGltZU1zIiwic3RhdHVzIiwibXVsdGlNYXRjaGVkQVQiLCJtdWx0aU1hdGNoZWRJRCIsIm11bHRpTWF0Y2hlZFJUIiwidW5lbmNyeXB0ZWRDYWNoZUNvdW50IiwiZW5jcnlwdGVkQ2FjaGVFeHBpcmVkQ291bnQiLCJvbGRBY2NvdW50Q291bnQiLCJvbGRBY2Nlc3NDb3VudCIsIm9sZElkQ291bnQiLCJvbGRSZWZyZXNoQ291bnQiLCJjdXJyQWNjb3VudENvdW50IiwiY3VyckFjY2Vzc0NvdW50IiwiY3VycklkQ291bnQiLCJjdXJyUmVmcmVzaENvdW50IiwiZXhwaXJlZENhY2hlUmVtb3ZlZENvdW50IiwidXBncmFkZWRDYWNoZUNvdW50Il0pOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8KY2xhc3MgRHJ7c3RhcnRNZWFzdXJlbWVudCgpe31lbmRNZWFzdXJlbWVudCgpe31mbHVzaE1lYXN1cmVtZW50KCl7cmV0dXJuIG51bGx9fWNsYXNzIEhye2dlbmVyYXRlSWQoKXtyZXR1cm4iY2FsbGJhY2staWQifXN0YXJ0TWVhc3VyZW1lbnQoZSx0KXtyZXR1cm57ZW5kOigpPT5udWxsLGRpc2NhcmQ6KCk9Pnt9LGFkZDooKT0+e30saW5jcmVtZW50OigpPT57fSxldmVudDp7ZXZlbnRJZDp0aGlzLmdlbmVyYXRlSWQoKSxzdGF0dXM6TnIsYXV0aG9yaXR5OiIiLGxpYnJhcnlOYW1lOiIiLGxpYnJhcnlWZXJzaW9uOiIiLGNsaWVudElkOiIiLG5hbWU6ZSxzdGFydFRpbWVNczpEYXRlLm5vdygpLGNvcnJlbGF0aW9uSWQ6dHx8IiJ9LG1lYXN1cmVtZW50Om5ldyBEcn19c3RhcnRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KCl7cmV0dXJuIG5ldyBEcn1jYWxjdWxhdGVRdWV1ZWRUaW1lKCl7cmV0dXJuIDB9YWRkUXVldWVNZWFzdXJlbWVudCgpe31zZXRQcmVRdWV1ZVRpbWUoKXt9ZW5kTWVhc3VyZW1lbnQoKXtyZXR1cm4gbnVsbH1kaXNjYXJkTWVhc3VyZW1lbnRzKCl7fXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soKXtyZXR1cm4hMH1hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKCl7cmV0dXJuIiJ9ZW1pdEV2ZW50cygpe31hZGRGaWVsZHMoKXt9aW5jcmVtZW50RmllbGRzKCl7fWNhY2hlRXZlbnRCeUNvcnJlbGF0aW9uSWQoKXt9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB4cj17dG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kczozMDAscHJldmVudENvcnNQcmVmbGlnaHQ6ITF9LEJyPXtsb2dnZXJDYWxsYmFjazooKT0+e30scGlpTG9nZ2luZ0VuYWJsZWQ6ITEsbG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLGNvcnJlbGF0aW9uSWQ6dC5FTVBUWV9TVFJJTkd9LEZyPXtjbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkOiExfSx6cj17YXN5bmMgc2VuZEdldFJlcXVlc3RBc3luYygpe3Rocm93IG10KGN0KX0sYXN5bmMgc2VuZFBvc3RSZXF1ZXN0QXN5bmMoKXt0aHJvdyBtdChjdCl9fSxLcj17c2t1OnQuU0tVLHZlcnNpb246dnQsY3B1OnQuRU1QVFlfU1RSSU5HLG9zOnQuRU1QVFlfU1RSSU5HfSxHcj17Y2xpZW50U2VjcmV0OnQuRU1QVFlfU1RSSU5HLGNsaWVudEFzc2VydGlvbjp2b2lkIDB9LCRyPXthenVyZUNsb3VkSW5zdGFuY2U6SXQuTm9uZSx0ZW5hbnQ6YCR7dC5ERUZBVUxUX0NPTU1PTl9URU5BTlR9YH0sUXI9e2FwcGxpY2F0aW9uOnthcHBOYW1lOiIiLGFwcFZlcnNpb246IiJ9fTtmdW5jdGlvbiBqcihlKXtyZXR1cm4gZS5hdXRoT3B0aW9ucy5hdXRob3JpdHkub3B0aW9ucy5wcm90b2NvbE1vZGU9PT1sci5PSURDfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBXcj0iaG9tZV9hY2NvdW50X2lkIixWcj0iVVBOIixKcj0iY2xpZW50X2lkIixZcj0icmVkaXJlY3RfdXJpIixYcj0idG9rZW5fdHlwZSIsWnI9InJlcV9jbmYiLGVuPSJyZXR1cm5fc3BhX2NvZGUiLHRuPSJ4LWNsaWVudC14dHJhLXNrdSIscm49ImJya19jbGllbnRfaWQiLG5uPSJicmtfcmVkaXJlY3RfdXJpIixvbj0iaW5zdGFuY2VfYXdhcmUiOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmZ1bmN0aW9uIHNuKGUsdCxyKXtpZighdClyZXR1cm47Y29uc3Qgbj1lLmdldChKcik7biYmZS5oYXMocm4pJiZyPy5hZGRGaWVsZHMoe2VtYmVkZGVkQ2xpZW50SWQ6bixlbWJlZGRlZFJlZGlyZWN0VXJpOmUuZ2V0KFlyKX0sdCl9ZnVuY3Rpb24gYW4oZSx0KXtlLnNldCgicmVzcG9uc2VfdHlwZSIsdCl9ZnVuY3Rpb24gY24oZSx0LHI9ITAsbj1oKXshcnx8bi5pbmNsdWRlcygib3BlbmlkIil8fHQuaW5jbHVkZXMoIm9wZW5pZCIpfHxuLnB1c2goIm9wZW5pZCIpO2NvbnN0IG89cj9bLi4udHx8W10sLi4ubl06dHx8W10saT1uZXcgWHQobyk7ZS5zZXQoInNjb3BlIixpLnByaW50U2NvcGVzKCkpfWZ1bmN0aW9uIGxuKGUsdCl7ZS5zZXQoSnIsdCl9ZnVuY3Rpb24gaG4oZSx0KXtlLnNldChZcix0KX1mdW5jdGlvbiBkbihlLHQpe2Uuc2V0KCJsb2dpbl9oaW50Iix0KX1mdW5jdGlvbiB1bihlLHQpe2Uuc2V0KG0sYFVQTjoke3R9YCl9ZnVuY3Rpb24gZ24oZSx0KXtlLnNldChtLGBPaWQ6JHt0LnVpZH1AJHt0LnV0aWR9YCl9ZnVuY3Rpb24gcG4oZSx0KXtlLnNldCgic2lkIix0KX1mdW5jdGlvbiBtbihlLHQscil7Y29uc3Qgbj1Sbih0LHIpO3RyeXtKU09OLnBhcnNlKG4pfWNhdGNoKGUpe3Rocm93IEp0KFJ0KX1lLnNldCgiY2xhaW1zIixuKX1mdW5jdGlvbiBmbihlLHQpe2Uuc2V0KCJjbGllbnQtcmVxdWVzdC1pZCIsdCl9ZnVuY3Rpb24geW4oZSx0KXtlLnNldCgieC1jbGllbnQtU0tVIix0LnNrdSksZS5zZXQoIngtY2xpZW50LVZFUiIsdC52ZXJzaW9uKSx0Lm9zJiZlLnNldCgieC1jbGllbnQtT1MiLHQub3MpLHQuY3B1JiZlLnNldCgieC1jbGllbnQtQ1BVIix0LmNwdSl9ZnVuY3Rpb24gQ24oZSx0KXt0Py5hcHBOYW1lJiZlLnNldCgieC1hcHAtbmFtZSIsdC5hcHBOYW1lKSx0Py5hcHBWZXJzaW9uJiZlLnNldCgieC1hcHAtdmVyIix0LmFwcFZlcnNpb24pfWZ1bmN0aW9uIHduKGUsdCl7dCYmZS5zZXQoInN0YXRlIix0KX1mdW5jdGlvbiB2bihlLHQscil7aWYoIXR8fCFyKXRocm93IEp0KE90KTtlLnNldCgiY29kZV9jaGFsbGVuZ2UiLHQpLGUuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLHIpfWZ1bmN0aW9uIEluKGUsdCl7ZS5zZXQoImNsaWVudF9zZWNyZXQiLHQpfWZ1bmN0aW9uIFRuKGUsdCl7dCYmZS5zZXQoImNsaWVudF9hc3NlcnRpb24iLHQpfWZ1bmN0aW9uIEFuKGUsdCl7dCYmZS5zZXQoImNsaWVudF9hc3NlcnRpb25fdHlwZSIsdCl9ZnVuY3Rpb24ga24oZSx0KXtlLnNldCgiZ3JhbnRfdHlwZSIsdCl9ZnVuY3Rpb24gU24oZSl7ZS5zZXQoImNsaWVudF9pbmZvIiwiMSIpfWZ1bmN0aW9uIGJuKGUpe2UuaGFzKG9uKXx8ZS5zZXQob24sInRydWUiKX1mdW5jdGlvbiBFbihlLHQpe09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbdCxyXSk9PnshZS5oYXModCkmJnImJmUuc2V0KHQscil9KSl9ZnVuY3Rpb24gUm4oZSx0KXtsZXQgcjtpZihlKXRyeXtyPUpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7dGhyb3cgSnQoUnQpfWVsc2Ugcj17fTtyZXR1cm4gdCYmdC5sZW5ndGg+MCYmKHIuaGFzT3duUHJvcGVydHkoayl8fChyW2tdPXt9KSxyW2tdW1NdPXt2YWx1ZXM6dH0pLEpTT04uc3RyaW5naWZ5KHIpfWZ1bmN0aW9uIF9uKGUsdCl7dCYmKGUuc2V0KFhyLFcuUE9QKSxlLnNldChacix0KSl9ZnVuY3Rpb24gUG4oZSx0KXt0JiYoZS5zZXQoWHIsVy5TU0gpLGUuc2V0KFpyLHQpKX1mdW5jdGlvbiBNbihlLHQpe2Uuc2V0KCJ4LWNsaWVudC1jdXJyZW50LXRlbGVtZXRyeSIsdC5nZW5lcmF0ZUN1cnJlbnRSZXF1ZXN0SGVhZGVyVmFsdWUoKSksZS5zZXQoIngtY2xpZW50LWxhc3QtdGVsZW1ldHJ5Iix0LmdlbmVyYXRlTGFzdFJlcXVlc3RIZWFkZXJWYWx1ZSgpKX1mdW5jdGlvbiBPbihlKXtlLnNldCgieC1tcy1saWItY2FwYWJpbGl0eSIsWCl9ZnVuY3Rpb24gcW4oZSx0LHIpe2UuaGFzKHJuKXx8ZS5zZXQocm4sdCksZS5oYXMobm4pfHxlLnNldChubixyKX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmNvbnN0IE5uPShlLHQscixuLG8pPT4oLi4uaSk9PntyLnRyYWNlKGBFeGVjdXRpbmcgZnVuY3Rpb24gJHt0fWApO2NvbnN0IHM9bj8uc3RhcnRNZWFzdXJlbWVudCh0LG8pO2lmKG8pe2NvbnN0IGU9dCsiQ2FsbENvdW50IjtuPy5pbmNyZW1lbnRGaWVsZHMoe1tlXToxfSxvKX10cnl7Y29uc3Qgbj1lKC4uLmkpO3JldHVybiBzPy5lbmQoe3N1Y2Nlc3M6ITB9KSxyLnRyYWNlKGBSZXR1cm5pbmcgcmVzdWx0IGZyb20gJHt0fWApLG59Y2F0Y2goZSl7ci50cmFjZShgRXJyb3Igb2NjdXJyZWQgaW4gJHt0fWApO3RyeXtyLnRyYWNlKEpTT04uc3RyaW5naWZ5KGUpKX1jYXRjaChlKXtyLnRyYWNlKCJVbmFibGUgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZS4iKX10aHJvdyBzPy5lbmQoe3N1Y2Nlc3M6ITF9LGUpLGV9fSxVbj0oZSx0LHIsbixvKT0+KC4uLmkpPT57ci50cmFjZShgRXhlY3V0aW5nIGZ1bmN0aW9uICR7dH1gKTtjb25zdCBzPW4/LnN0YXJ0TWVhc3VyZW1lbnQodCxvKTtpZihvKXtjb25zdCBlPXQrIkNhbGxDb3VudCI7bj8uaW5jcmVtZW50RmllbGRzKHtbZV06MX0sbyl9cmV0dXJuIG4/LnNldFByZVF1ZXVlVGltZSh0LG8pLGUoLi4uaSkudGhlbigoZT0+KHIudHJhY2UoYFJldHVybmluZyByZXN1bHQgZnJvbSAke3R9YCkscz8uZW5kKHtzdWNjZXNzOiEwfSksZSkpKS5jYXRjaCgoZT0+e3IudHJhY2UoYEVycm9yIG9jY3VycmVkIGluICR7dH1gKTt0cnl7ci50cmFjZShKU09OLnN0cmluZ2lmeShlKSl9Y2F0Y2goZSl7ci50cmFjZSgiVW5hYmxlIHRvIHByaW50IGVycm9yIG1lc3NhZ2UuIil9dGhyb3cgcz8uZW5kKHtzdWNjZXNzOiExfSxlKSxlfSkpfTsKLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmNsYXNzIExue2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMubmV0d29ya0ludGVyZmFjZT1lLHRoaXMubG9nZ2VyPXQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudD1yLHRoaXMuY29ycmVsYXRpb25JZD1ufWFzeW5jIGRldGVjdFJlZ2lvbihlLG4pe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUmVnaW9uRGlzY292ZXJ5RGV0ZWN0UmVnaW9uLHRoaXMuY29ycmVsYXRpb25JZCk7bGV0IGk9ZTtpZihpKW4ucmVnaW9uX3NvdXJjZT1yZTtlbHNle2NvbnN0IGU9TG4uSU1EU19PUFRJT05TO3RyeXtjb25zdCBzPWF3YWl0IFVuKHRoaXMuZ2V0UmVnaW9uRnJvbUlNRFMuYmluZCh0aGlzKSxPci5SZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkodC5JTURTX1ZFUlNJT04sZSk7aWYocy5zdGF0dXM9PT1yJiYoaT1zLmJvZHksbi5yZWdpb25fc291cmNlPW5lKSxzLnN0YXR1cz09PW8pe2NvbnN0IHQ9YXdhaXQgVW4odGhpcy5nZXRDdXJyZW50VmVyc2lvbi5iaW5kKHRoaXMpLE9yLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShlKTtpZighdClyZXR1cm4gbi5yZWdpb25fc291cmNlPXRlLG51bGw7Y29uc3Qgbz1hd2FpdCBVbih0aGlzLmdldFJlZ2lvbkZyb21JTURTLmJpbmQodGhpcyksT3IuUmVnaW9uRGlzY292ZXJ5R2V0UmVnaW9uRnJvbUlNRFMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZSk7by5zdGF0dXM9PT1yJiYoaT1vLmJvZHksbi5yZWdpb25fc291cmNlPW5lKX19Y2F0Y2goZSl7cmV0dXJuIG4ucmVnaW9uX3NvdXJjZT10ZSxudWxsfX1yZXR1cm4gaXx8KG4ucmVnaW9uX3NvdXJjZT10ZSksaXx8bnVsbH1hc3luYyBnZXRSZWdpb25Gcm9tSU1EUyhlLHIpe3JldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZ2lvbkRpc2NvdmVyeUdldFJlZ2lvbkZyb21JTURTLHRoaXMuY29ycmVsYXRpb25JZCksdGhpcy5uZXR3b3JrSW50ZXJmYWNlLnNlbmRHZXRSZXF1ZXN0QXN5bmMoYCR7dC5JTURTX0VORFBPSU5UfT9hcGktdmVyc2lvbj0ke2V9JmZvcm1hdD10ZXh0YCxyLHQuSU1EU19USU1FT1VUKX1hc3luYyBnZXRDdXJyZW50VmVyc2lvbihlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLHRoaXMuY29ycmVsYXRpb25JZCk7dHJ5e2NvbnN0IHI9YXdhaXQgdGhpcy5uZXR3b3JrSW50ZXJmYWNlLnNlbmRHZXRSZXF1ZXN0QXN5bmMoYCR7dC5JTURTX0VORFBPSU5UfT9mb3JtYXQ9anNvbmAsZSk7cmV0dXJuIHIuc3RhdHVzPT09byYmci5ib2R5JiZyLmJvZHlbIm5ld2VzdC12ZXJzaW9ucyJdJiZyLmJvZHlbIm5ld2VzdC12ZXJzaW9ucyJdLmxlbmd0aD4wP3IuYm9keVsibmV3ZXN0LXZlcnNpb25zIl1bMF06bnVsbH1jYXRjaChlKXtyZXR1cm4gbnVsbH19fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8KZnVuY3Rpb24gRG4oKXtyZXR1cm4gTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpfWZ1bmN0aW9uIEhuKGUpe3JldHVybiBlLmdldFRpbWUoKS8xZTN9ZnVuY3Rpb24geG4oZSl7cmV0dXJuIGU/bmV3IERhdGUoMWUzKk51bWJlcihlKSk6bmV3IERhdGV9ZnVuY3Rpb24gQm4oZSx0KXtjb25zdCByPU51bWJlcihlKXx8MDtyZXR1cm4gRG4oKSt0PnJ9ZnVuY3Rpb24gRm4oZSx0KXtjb25zdCByPU51bWJlcihlKSsyNCp0KjYwKjYwKjFlMztyZXR1cm4gRGF0ZS5ub3coKT5yfWZ1bmN0aW9uIHpuKGUpe3JldHVybiBOdW1iZXIoZSk+RG4oKX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gS24oZSx0LHIsbixvKXtyZXR1cm57Y3JlZGVudGlhbFR5cGU6SC5JRF9UT0tFTixob21lQWNjb3VudElkOmUsZW52aXJvbm1lbnQ6dCxjbGllbnRJZDpuLHNlY3JldDpyLHJlYWxtOm8sbGFzdFVwZGF0ZWRBdDpEYXRlLm5vdygpLnRvU3RyaW5nKCl9fWZ1bmN0aW9uIEduKGUsdCxyLG4sbyxpLHMsYSxjLGwsaCxkLHUsZyxwKXtjb25zdCBtPXtob21lQWNjb3VudElkOmUsY3JlZGVudGlhbFR5cGU6SC5BQ0NFU1NfVE9LRU4sc2VjcmV0OnIsY2FjaGVkQXQ6RG4oKS50b1N0cmluZygpLGV4cGlyZXNPbjpzLnRvU3RyaW5nKCksZXh0ZW5kZWRFeHBpcmVzT246YS50b1N0cmluZygpLGVudmlyb25tZW50OnQsY2xpZW50SWQ6bixyZWFsbTpvLHRhcmdldDppLHRva2VuVHlwZTpofHxXLkJFQVJFUixsYXN0VXBkYXRlZEF0OkRhdGUubm93KCkudG9TdHJpbmcoKX07aWYoZCYmKG0udXNlckFzc2VydGlvbkhhc2g9ZCksbCYmKG0ucmVmcmVzaE9uPWwudG9TdHJpbmcoKSksZyYmKG0ucmVxdWVzdGVkQ2xhaW1zPWcsbS5yZXF1ZXN0ZWRDbGFpbXNIYXNoPXApLG0udG9rZW5UeXBlPy50b0xvd2VyQ2FzZSgpIT09Vy5CRUFSRVIudG9Mb3dlckNhc2UoKSlzd2l0Y2gobS5jcmVkZW50aWFsVHlwZT1ILkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FLG0udG9rZW5UeXBlKXtjYXNlIFcuUE9QOmNvbnN0IGU9ZHIocixjKTtpZighZT8uY25mPy5raWQpdGhyb3cgbXQoZXQpO20ua2V5SWQ9ZS5jbmYua2lkO2JyZWFrO2Nhc2UgVy5TU0g6bS5rZXlJZD11fXJldHVybiBtfWZ1bmN0aW9uICRuKGUsdCxyLG4sbyxpLHMpe2NvbnN0IGE9e2NyZWRlbnRpYWxUeXBlOkguUkVGUkVTSF9UT0tFTixob21lQWNjb3VudElkOmUsZW52aXJvbm1lbnQ6dCxjbGllbnRJZDpuLHNlY3JldDpyLGxhc3RVcGRhdGVkQXQ6RGF0ZS5ub3coKS50b1N0cmluZygpfTtyZXR1cm4gaSYmKGEudXNlckFzc2VydGlvbkhhc2g9aSksbyYmKGEuZmFtaWx5SWQ9bykscyYmKGEuZXhwaXJlc09uPXMudG9TdHJpbmcoKSksYX1mdW5jdGlvbiBRbihlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgiaG9tZUFjY291bnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJlbnZpcm9ubWVudCIpJiZlLmhhc093blByb3BlcnR5KCJjcmVkZW50aWFsVHlwZSIpJiZlLmhhc093blByb3BlcnR5KCJjbGllbnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJzZWNyZXQiKX1mdW5jdGlvbiBqbihlKXtyZXR1cm4hIWUmJihRbihlKSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVhbG0iKSYmZS5oYXNPd25Qcm9wZXJ0eSgidGFyZ2V0IikmJihlLmNyZWRlbnRpYWxUeXBlPT09SC5BQ0NFU1NfVE9LRU58fGUuY3JlZGVudGlhbFR5cGU9PT1ILkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FKSl9ZnVuY3Rpb24gV24oZSl7cmV0dXJuISFlJiYoUW4oZSkmJmUuY3JlZGVudGlhbFR5cGU9PT1ILlJFRlJFU0hfVE9LRU4pfWZ1bmN0aW9uIFZuKCl7cmV0dXJuIERuKCkren1mdW5jdGlvbiBKbihlLHQscil7ZS5hdXRob3JpemF0aW9uX2VuZHBvaW50PXQuYXV0aG9yaXphdGlvbl9lbmRwb2ludCxlLnRva2VuX2VuZHBvaW50PXQudG9rZW5fZW5kcG9pbnQsZS5lbmRfc2Vzc2lvbl9lbmRwb2ludD10LmVuZF9zZXNzaW9uX2VuZHBvaW50LGUuaXNzdWVyPXQuaXNzdWVyLGUuZW5kcG9pbnRzRnJvbU5ldHdvcms9cixlLmp3a3NfdXJpPXQuandrc191cml9ZnVuY3Rpb24gWW4oZSx0LHIpe2UuYWxpYXNlcz10LmFsaWFzZXMsZS5wcmVmZXJyZWRfY2FjaGU9dC5wcmVmZXJyZWRfY2FjaGUsZS5wcmVmZXJyZWRfbmV0d29yaz10LnByZWZlcnJlZF9uZXR3b3JrLGUuYWxpYXNlc0Zyb21OZXR3b3JrPXJ9ZnVuY3Rpb24gWG4oZSl7cmV0dXJuIGUuZXhwaXJlc0F0PD1EbigpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9Mbi5JTURTX09QVElPTlM9e2hlYWRlcnM6e01ldGFkYXRhOiJ0cnVlIn19O2NsYXNzIFpue2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSl7dGhpcy5jYW5vbmljYWxBdXRob3JpdHk9ZSx0aGlzLl9jYW5vbmljYWxBdXRob3JpdHkudmFsaWRhdGVBc1VyaSgpLHRoaXMubmV0d29ya0ludGVyZmFjZT10LHRoaXMuY2FjaGVNYW5hZ2VyPXIsdGhpcy5hdXRob3JpdHlPcHRpb25zPW4sdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YT17cmVnaW9uX3VzZWQ6dm9pZCAwLHJlZ2lvbl9zb3VyY2U6dm9pZCAwLHJlZ2lvbl9vdXRjb21lOnZvaWQgMH0sdGhpcy5sb2dnZXI9byx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXMsdGhpcy5jb3JyZWxhdGlvbklkPWksdGhpcy5tYW5hZ2VkSWRlbnRpdHk9YXx8ITEsdGhpcy5yZWdpb25EaXNjb3Zlcnk9bmV3IExuKHQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpfWdldEF1dGhvcml0eVR5cGUoZSl7aWYoZS5Ib3N0TmFtZUFuZFBvcnQuZW5kc1dpdGgodC5DSUFNX0FVVEhfVVJMKSlyZXR1cm4gYXI7Y29uc3Qgcj1lLlBhdGhTZWdtZW50cztpZihyLmxlbmd0aClzd2l0Y2goclswXS50b0xvd2VyQ2FzZSgpKXtjYXNlIHQuQURGUzpyZXR1cm4gaXI7Y2FzZSB0LkRTVFM6cmV0dXJuIHNyfXJldHVybiBvcn1nZXQgYXV0aG9yaXR5VHlwZSgpe3JldHVybiB0aGlzLmdldEF1dGhvcml0eVR5cGUodGhpcy5jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzKX1nZXQgcHJvdG9jb2xNb2RlKCl7cmV0dXJuIHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5wcm90b2NvbE1vZGV9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5hdXRob3JpdHlPcHRpb25zfWdldCBjYW5vbmljYWxBdXRob3JpdHkoKXtyZXR1cm4gdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LnVybFN0cmluZ31zZXQgY2Fub25pY2FsQXV0aG9yaXR5KGUpe3RoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eT1uZXcgd3IoZSksdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LnZhbGlkYXRlQXNVcmkoKSx0aGlzLl9jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzPW51bGx9Z2V0IGNhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMoKXtyZXR1cm4gdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50c3x8KHRoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHM9dGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LmdldFVybENvbXBvbmVudHMoKSksdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50c31nZXQgaG9zdG5hbWVBbmRQb3J0KCl7cmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQudG9Mb3dlckNhc2UoKX1nZXQgdGVuYW50KCl7cmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHNbMF19Z2V0IGF1dGhvcml6YXRpb25FbmRwb2ludCgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmF1dGhvcml6YXRpb25fZW5kcG9pbnQpO3Rocm93IG10KGtlKX1nZXQgdG9rZW5FbmRwb2ludCgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLnRva2VuX2VuZHBvaW50KTt0aHJvdyBtdChrZSl9Z2V0IGRldmljZUNvZGVFbmRwb2ludCgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLnRva2VuX2VuZHBvaW50LnJlcGxhY2UoIi90b2tlbiIsIi9kZXZpY2Vjb2RlIikpO3Rocm93IG10KGtlKX1nZXQgZW5kU2Vzc2lvbkVuZHBvaW50KCl7aWYodGhpcy5kaXNjb3ZlcnlDb21wbGV0ZSgpKXtpZighdGhpcy5tZXRhZGF0YS5lbmRfc2Vzc2lvbl9lbmRwb2ludCl0aHJvdyBtdChudCk7cmV0dXJuIHRoaXMucmVwbGFjZVBhdGgodGhpcy5tZXRhZGF0YS5lbmRfc2Vzc2lvbl9lbmRwb2ludCl9dGhyb3cgbXQoa2UpfWdldCBzZWxmU2lnbmVkSnd0QXVkaWVuY2UoKXtpZih0aGlzLmRpc2NvdmVyeUNvbXBsZXRlKCkpcmV0dXJuIHRoaXMucmVwbGFjZVBhdGgodGhpcy5tZXRhZGF0YS5pc3N1ZXIpO3Rocm93IG10KGtlKX1nZXQgandrc1VyaSgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmp3a3NfdXJpKTt0aHJvdyBtdChrZSl9Y2FuUmVwbGFjZVRlbmFudChlKXtyZXR1cm4gMT09PWUuUGF0aFNlZ21lbnRzLmxlbmd0aCYmIVpuLnJlc2VydmVkVGVuYW50RG9tYWlucy5oYXMoZS5QYXRoU2VnbWVudHNbMF0pJiZ0aGlzLmdldEF1dGhvcml0eVR5cGUoZSk9PT1vciYmdGhpcy5wcm90b2NvbE1vZGUhPT1sci5PSURDfXJlcGxhY2VUZW5hbnQoZSl7cmV0dXJuIGUucmVwbGFjZSgve3RlbmFudH18e3RlbmFudGlkfS9nLHRoaXMudGVuYW50KX1yZXBsYWNlUGF0aChlKXtsZXQgdD1lO2NvbnN0IHI9bmV3IHdyKHRoaXMubWV0YWRhdGEuY2Fub25pY2FsX2F1dGhvcml0eSkuZ2V0VXJsQ29tcG9uZW50cygpLG49ci5QYXRoU2VnbWVudHM7cmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHMuZm9yRWFjaCgoKGUsbyk9PntsZXQgaT1uW29dO2lmKDA9PT1vJiZ0aGlzLmNhblJlcGxhY2VUZW5hbnQocikpe2NvbnN0IGU9bmV3IHdyKHRoaXMubWV0YWRhdGEuYXV0aG9yaXphdGlvbl9lbmRwb2ludCkuZ2V0VXJsQ29tcG9uZW50cygpLlBhdGhTZWdtZW50c1swXTtpIT09ZSYmKHRoaXMubG9nZ2VyLnZlcmJvc2UoYFJlcGxhY2luZyB0ZW5hbnQgZG9tYWluIG5hbWUgJHtpfSB3aXRoIGlkICR7ZX1gKSxpPWUpfWUhPT1pJiYodD10LnJlcGxhY2UoYC8ke2l9L2AsYC8ke2V9L2ApKX0pKSx0aGlzLnJlcGxhY2VUZW5hbnQodCl9Z2V0IGRlZmF1bHRPcGVuSWRDb25maWd1cmF0aW9uRW5kcG9pbnQoKXtjb25zdCBlPXRoaXMuaG9zdG5hbWVBbmRQb3J0O3JldHVybiB0aGlzLmNhbm9uaWNhbEF1dGhvcml0eS5lbmRzV2l0aCgidjIuMC8iKXx8dGhpcy5hdXRob3JpdHlUeXBlPT09aXJ8fHRoaXMucHJvdG9jb2xNb2RlPT09bHIuT0lEQyYmIXRoaXMuaXNBbGlhc09mS25vd25NaWNyb3NvZnRBdXRob3JpdHkoZSk/YCR7dGhpcy5jYW5vbmljYWxBdXRob3JpdHl9LndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gOmAke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fXYyLjAvLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gfWRpc2NvdmVyeUNvbXBsZXRlKCl7cmV0dXJuISF0aGlzLm1ldGFkYXRhfWFzeW5jIHJlc29sdmVFbmRwb2ludHNBc3luYygpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aG9yaXR5UmVzb2x2ZUVuZHBvaW50c0FzeW5jLHRoaXMuY29ycmVsYXRpb25JZCk7Y29uc3QgZT10aGlzLmdldEN1cnJlbnRNZXRhZGF0YUVudGl0eSgpLHQ9YXdhaXQgVW4odGhpcy51cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhLmJpbmQodGhpcyksT3IuQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoZSk7dGhpcy5jYW5vbmljYWxBdXRob3JpdHk9dGhpcy5jYW5vbmljYWxBdXRob3JpdHkucmVwbGFjZSh0aGlzLmhvc3RuYW1lQW5kUG9ydCxlLnByZWZlcnJlZF9uZXR3b3JrKTtjb25zdCByPWF3YWl0IFVuKHRoaXMudXBkYXRlRW5kcG9pbnRNZXRhZGF0YS5iaW5kKHRoaXMpLE9yLkF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGEsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKGUpO3RoaXMudXBkYXRlQ2FjaGVkTWV0YWRhdGEoZSx0LHtzb3VyY2U6cn0pLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7Y2xvdWREaXNjb3ZlcnlTb3VyY2U6dCxhdXRob3JpdHlFbmRwb2ludFNvdXJjZTpyfSx0aGlzLmNvcnJlbGF0aW9uSWQpfWdldEN1cnJlbnRNZXRhZGF0YUVudGl0eSgpe2xldCBlPXRoaXMuY2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhQnlBbGlhcyh0aGlzLmhvc3RuYW1lQW5kUG9ydCk7cmV0dXJuIGV8fChlPXthbGlhc2VzOltdLHByZWZlcnJlZF9jYWNoZTp0aGlzLmhvc3RuYW1lQW5kUG9ydCxwcmVmZXJyZWRfbmV0d29yazp0aGlzLmhvc3RuYW1lQW5kUG9ydCxjYW5vbmljYWxfYXV0aG9yaXR5OnRoaXMuY2Fub25pY2FsQXV0aG9yaXR5LGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6IiIsdG9rZW5fZW5kcG9pbnQ6IiIsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IiIsaXNzdWVyOiIiLGFsaWFzZXNGcm9tTmV0d29yazohMSxlbmRwb2ludHNGcm9tTmV0d29yazohMSxleHBpcmVzQXQ6Vm4oKSxqd2tzX3VyaToiIn0pLGV9dXBkYXRlQ2FjaGVkTWV0YWRhdGEoZSx0LHIpe3QhPT1HJiZyPy5zb3VyY2UhPT1HJiYoZS5leHBpcmVzQXQ9Vm4oKSxlLmNhbm9uaWNhbF9hdXRob3JpdHk9dGhpcy5jYW5vbmljYWxBdXRob3JpdHkpO2NvbnN0IG49dGhpcy5jYWNoZU1hbmFnZXIuZ2VuZXJhdGVBdXRob3JpdHlNZXRhZGF0YUNhY2hlS2V5KGUucHJlZmVycmVkX2NhY2hlKTt0aGlzLmNhY2hlTWFuYWdlci5zZXRBdXRob3JpdHlNZXRhZGF0YShuLGUpLHRoaXMubWV0YWRhdGE9ZX1hc3luYyB1cGRhdGVFbmRwb2ludE1ldGFkYXRhKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aG9yaXR5VXBkYXRlRW5kcG9pbnRNZXRhZGF0YSx0aGlzLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9dGhpcy51cGRhdGVFbmRwb2ludE1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhlKTtpZih0KXtpZih0LnNvdXJjZT09PVEmJnRoaXMuYXV0aG9yaXR5T3B0aW9ucy5henVyZVJlZ2lvbkNvbmZpZ3VyYXRpb24/LmF6dXJlUmVnaW9uJiZ0Lm1ldGFkYXRhKXtKbihlLGF3YWl0IFVuKHRoaXMudXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbi5iaW5kKHRoaXMpLE9yLkF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQubWV0YWRhdGEpLCExKSxlLmNhbm9uaWNhbF9hdXRob3JpdHk9dGhpcy5jYW5vbmljYWxBdXRob3JpdHl9cmV0dXJuIHQuc291cmNlfWxldCByPWF3YWl0IFVuKHRoaXMuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrLmJpbmQodGhpcyksT3IuQXV0aG9yaXR5R2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKSgpO2lmKHIpcmV0dXJuIHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5henVyZVJlZ2lvbkNvbmZpZ3VyYXRpb24/LmF6dXJlUmVnaW9uJiYocj1hd2FpdCBVbih0aGlzLnVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24uYmluZCh0aGlzKSxPci5BdXRob3JpdHlVcGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShyKSksSm4oZSxyLCEwKSwkO3Rocm93IG10KGJlLHRoaXMuZGVmYXVsdE9wZW5JZENvbmZpZ3VyYXRpb25FbmRwb2ludCl9dXBkYXRlRW5kcG9pbnRNZXRhZGF0YUZyb21Mb2NhbFNvdXJjZXMoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiQXR0ZW1wdGluZyB0byBnZXQgZW5kcG9pbnQgbWV0YWRhdGEgZnJvbSBhdXRob3JpdHkgY29uZmlndXJhdGlvbiIpO2NvbnN0IHQ9dGhpcy5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUNvbmZpZygpO2lmKHQpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIkZvdW5kIGVuZHBvaW50IG1ldGFkYXRhIGluIGF1dGhvcml0eSBjb25maWd1cmF0aW9uIiksSm4oZSx0LCExKSx7c291cmNlOkt9O2lmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIkRpZCBub3QgZmluZCBlbmRwb2ludCBtZXRhZGF0YSBpbiB0aGUgY29uZmlnLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGVuZHBvaW50IG1ldGFkYXRhIGZyb20gdGhlIGhhcmRjb2RlZCB2YWx1ZXMuIiksdGhpcy5hdXRob3JpdHlPcHRpb25zLnNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlKXRoaXMubG9nZ2VyLnZlcmJvc2UoIlNraXBwaW5nIGhhcmRjb2RlZCBtZXRhZGF0YSBjYWNoZSBzaW5jZSBza2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZSBpcyBzZXQgdG8gdHJ1ZS4gQXR0ZW1wdGluZyB0byBnZXQgZW5kcG9pbnQgbWV0YWRhdGEgZnJvbSB0aGUgbmV0d29yayBtZXRhZGF0YSBjYWNoZS4iKTtlbHNle2NvbnN0IHQ9dGhpcy5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUhhcmRjb2RlZFZhbHVlcygpO2lmKHQpcmV0dXJuIEpuKGUsdCwhMSkse3NvdXJjZTpRLG1ldGFkYXRhOnR9O3RoaXMubG9nZ2VyLnZlcmJvc2UoIkRpZCBub3QgZmluZCBlbmRwb2ludCBtZXRhZGF0YSBpbiBoYXJkY29kZWQgdmFsdWVzLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGVuZHBvaW50IG1ldGFkYXRhIGZyb20gdGhlIG5ldHdvcmsgbWV0YWRhdGEgY2FjaGUuIil9Y29uc3Qgcj1YbihlKTtyZXR1cm4gdGhpcy5pc0F1dGhvcml0eVNhbWVUeXBlKGUpJiZlLmVuZHBvaW50c0Zyb21OZXR3b3JrJiYhcj8odGhpcy5sb2dnZXIudmVyYm9zZSgiRm91bmQgZW5kcG9pbnQgbWV0YWRhdGEgaW4gdGhlIGNhY2hlLiIpLHtzb3VyY2U6R30pOihyJiZ0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgbWV0YWRhdGEgZW50aXR5IGlzIGV4cGlyZWQuIiksbnVsbCl9aXNBdXRob3JpdHlTYW1lVHlwZShlKXtyZXR1cm4gbmV3IHdyKGUuY2Fub25pY2FsX2F1dGhvcml0eSkuZ2V0VXJsQ29tcG9uZW50cygpLlBhdGhTZWdtZW50cy5sZW5ndGg9PT10aGlzLmNhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMuUGF0aFNlZ21lbnRzLmxlbmd0aH1nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUNvbmZpZygpe2lmKHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5hdXRob3JpdHlNZXRhZGF0YSl0cnl7cmV0dXJuIEpTT04ucGFyc2UodGhpcy5hdXRob3JpdHlPcHRpb25zLmF1dGhvcml0eU1ldGFkYXRhKX1jYXRjaChlKXt0aHJvdyBKdChOdCl9cmV0dXJuIG51bGx9YXN5bmMgZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrKCl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5BdXRob3JpdHlHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmssdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBlPXt9LHQ9dGhpcy5kZWZhdWx0T3BlbklkQ29uZmlndXJhdGlvbkVuZHBvaW50O3RoaXMubG9nZ2VyLnZlcmJvc2UoYEF1dGhvcml0eS5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6IGF0dGVtcHRpbmcgdG8gcmV0cmlldmUgT0F1dGggZW5kcG9pbnRzIGZyb20gJHt0fWApO3RyeXtjb25zdCByPWF3YWl0IHRoaXMubmV0d29ya0ludGVyZmFjZS5zZW5kR2V0UmVxdWVzdEFzeW5jKHQsZSksbj0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc093blByb3BlcnR5KCJhdXRob3JpemF0aW9uX2VuZHBvaW50IikmJmUuaGFzT3duUHJvcGVydHkoInRva2VuX2VuZHBvaW50IikmJmUuaGFzT3duUHJvcGVydHkoImlzc3VlciIpJiZlLmhhc093blByb3BlcnR5KCJqd2tzX3VyaSIpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8oci5ib2R5KTtyZXR1cm4gbj9yLmJvZHk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoIkF1dGhvcml0eS5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6IGNvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBPcGVuSUQgY29uZmlndXJhdGlvbiIpLG51bGwpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKGBBdXRob3JpdHkuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrOiAke2V9YCksbnVsbH19Z2V0RW5kcG9pbnRNZXRhZGF0YUZyb21IYXJkY29kZWRWYWx1ZXMoKXtyZXR1cm4gdGhpcy5ob3N0bmFtZUFuZFBvcnQgaW4gdnI/dnJbdGhpcy5ob3N0bmFtZUFuZFBvcnRdOm51bGx9YXN5bmMgdXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24sdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCByPXRoaXMuYXV0aG9yaXR5T3B0aW9ucy5henVyZVJlZ2lvbkNvbmZpZ3VyYXRpb24/LmF6dXJlUmVnaW9uO2lmKHIpe2lmKHIhPT10LkFaVVJFX1JFR0lPTl9BVVRPX0RJU0NPVkVSX0ZMQUcpcmV0dXJuIHRoaXMucmVnaW9uRGlzY292ZXJ5TWV0YWRhdGEucmVnaW9uX291dGNvbWU9b2UsdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fdXNlZD1yLFpuLnJlcGxhY2VXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihlLHIpO2NvbnN0IG49YXdhaXQgVW4odGhpcy5yZWdpb25EaXNjb3ZlcnkuZGV0ZWN0UmVnaW9uLmJpbmQodGhpcy5yZWdpb25EaXNjb3ZlcnkpLE9yLlJlZ2lvbkRpc2NvdmVyeURldGVjdFJlZ2lvbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkodGhpcy5hdXRob3JpdHlPcHRpb25zLmF6dXJlUmVnaW9uQ29uZmlndXJhdGlvbj8uZW52aXJvbm1lbnRSZWdpb24sdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YSk7aWYobilyZXR1cm4gdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fb3V0Y29tZT1pZSx0aGlzLnJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhLnJlZ2lvbl91c2VkPW4sWm4ucmVwbGFjZVdpdGhSZWdpb25hbEluZm9ybWF0aW9uKGUsbik7dGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fb3V0Y29tZT1zZX1yZXR1cm4gZX1hc3luYyB1cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSx0aGlzLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9dGhpcy51cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhlKTtpZih0KXJldHVybiB0O2NvbnN0IHI9YXdhaXQgVW4odGhpcy5nZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmsuYmluZCh0aGlzKSxPci5BdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmssdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKCk7aWYocilyZXR1cm4gWW4oZSxyLCEwKSwkO3Rocm93IEp0KFV0KX11cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJBdHRlbXB0aW5nIHRvIGdldCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgIGZyb20gYXV0aG9yaXR5IGNvbmZpZ3VyYXRpb24iKSx0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBLbm93biBBdXRob3JpdGllczogJHt0aGlzLmF1dGhvcml0eU9wdGlvbnMua25vd25BdXRob3JpdGllc3x8dC5OT1RfQVBQTElDQUJMRX1gKSx0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBBdXRob3JpdHkgTWV0YWRhdGE6ICR7dGhpcy5hdXRob3JpdHlPcHRpb25zLmF1dGhvcml0eU1ldGFkYXRhfHx0Lk5PVF9BUFBMSUNBQkxFfWApLHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYENhbm9uaWNhbCBBdXRob3JpdHk6ICR7ZS5jYW5vbmljYWxfYXV0aG9yaXR5fHx0Lk5PVF9BUFBMSUNBQkxFfWApO2NvbnN0IHI9dGhpcy5nZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUNvbmZpZygpO2lmKHIpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIkZvdW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiBhdXRob3JpdHkgY29uZmlndXJhdGlvbiIpLFluKGUsciwhMSksSztpZih0aGlzLmxvZ2dlci52ZXJib3NlKCJEaWQgbm90IGZpbmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGluIHRoZSBjb25maWcuLi4gQXR0ZW1wdGluZyB0byBnZXQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGZyb20gdGhlIGhhcmRjb2RlZCB2YWx1ZXMuIiksdGhpcy5vcHRpb25zLnNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlKXRoaXMubG9nZ2VyLnZlcmJvc2UoIlNraXBwaW5nIGhhcmRjb2RlZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgY2FjaGUgc2luY2Ugc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGUgaXMgc2V0IHRvIHRydWUuIEF0dGVtcHRpbmcgdG8gZ2V0IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLiIpO2Vsc2V7Y29uc3QgdD0obj10aGlzLmhvc3RuYW1lQW5kUG9ydCxrcihJci5tZXRhZGF0YSxuKSk7aWYodClyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiRm91bmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGZyb20gaGFyZGNvZGVkIHZhbHVlcy4iKSxZbihlLHQsITEpLFE7dGhpcy5sb2dnZXIudmVyYm9zZSgiRGlkIG5vdCBmaW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiBoYXJkY29kZWQgdmFsdWVzLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLiIpfXZhciBuO2NvbnN0IG89WG4oZSk7cmV0dXJuIHRoaXMuaXNBdXRob3JpdHlTYW1lVHlwZShlKSYmZS5hbGlhc2VzRnJvbU5ldHdvcmsmJiFvPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJGb3VuZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgaW4gdGhlIGNhY2hlLiIpLEcpOihvJiZ0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgbWV0YWRhdGEgZW50aXR5IGlzIGV4cGlyZWQuIiksbnVsbCl9Z2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Db25maWcoKXtpZih0aGlzLmF1dGhvcml0eVR5cGU9PT1hcilyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiQ0lBTSBhdXRob3JpdGllcyBkbyBub3Qgc3VwcG9ydCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEsIGdlbmVyYXRlIHRoZSBhbGlhc2VzIGZyb20gYXV0aG9yaXR5IGhvc3QuIiksWm4uY3JlYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Ib3N0KHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtpZih0aGlzLmF1dGhvcml0eU9wdGlvbnMuY2xvdWREaXNjb3ZlcnlNZXRhZGF0YSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBoYXMgYmVlbiBwcm92aWRlZCBhcyBhIG5ldHdvcmsgcmVzcG9uc2UsIGluIHRoZSBjb25maWcuIik7dHJ5e3RoaXMubG9nZ2VyLnZlcmJvc2UoIkF0dGVtcHRpbmcgdG8gcGFyc2UgdGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YS4iKTtjb25zdCBlPWtyKEpTT04ucGFyc2UodGhpcy5hdXRob3JpdHlPcHRpb25zLmNsb3VkRGlzY292ZXJ5TWV0YWRhdGEpLm1ldGFkYXRhLHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtpZih0aGlzLmxvZ2dlci52ZXJib3NlKCJQYXJzZWQgdGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YS4iKSxlKXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGVyZSBpcyByZXR1cm5hYmxlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBwYXJzZWQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhLiIpLGU7dGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlcmUgaXMgbm8gbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhlIHBhcnNlZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEuIil9Y2F0Y2goZSl7dGhyb3cgdGhpcy5sb2dnZXIudmVyYm9zZSgiVW5hYmxlIHRvIHBhcnNlIHRoZSBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEuIFRocm93aW5nIEludmFsaWQgQ2xvdWQgRGlzY292ZXJ5IE1ldGFkYXRhIEVycm9yLiIpLEp0KHF0KX19cmV0dXJuIHRoaXMuaXNJbktub3duQXV0aG9yaXRpZXMoKT8odGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlIGhvc3QgaXMgaW5jbHVkZWQgaW4ga25vd25BdXRob3JpdGllcy4gQ3JlYXRpbmcgbmV3IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBob3N0LiIpLFpuLmNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdCh0aGlzLmhvc3RuYW1lQW5kUG9ydCkpOm51bGx9YXN5bmMgZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrKCl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5BdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmssdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBlPWAke3QuQUFEX0lOU1RBTkNFX0RJU0NPVkVSWV9FTkRQVH0ke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fW9hdXRoMi92Mi4wL2F1dGhvcml6ZWAscj17fTtsZXQgbj1udWxsO3RyeXtjb25zdCBvPWF3YWl0IHRoaXMubmV0d29ya0ludGVyZmFjZS5zZW5kR2V0UmVxdWVzdEFzeW5jKGUscik7bGV0IGkscztpZihmdW5jdGlvbihlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgidGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludCIpJiZlLmhhc093blByb3BlcnR5KCJtZXRhZGF0YSIpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8oby5ib2R5KSlpPW8uYm9keSxzPWkubWV0YWRhdGEsdGhpcy5sb2dnZXIudmVyYm9zZVBpaShgdGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludCBpczogJHtpLnRlbmFudF9kaXNjb3ZlcnlfZW5kcG9pbnR9YCk7ZWxzZXtpZighZnVuY3Rpb24oZSl7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkoImVycm9yIikmJmUuaGFzT3duUHJvcGVydHkoImVycm9yX2Rlc2NyaXB0aW9uIil9KG8uYm9keSkpcmV0dXJuIHRoaXMubG9nZ2VyLmVycm9yKCJBQUQgZGlkIG5vdCByZXR1cm4gYSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2Ugb3IgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2UiKSxudWxsO2lmKHRoaXMubG9nZ2VyLndhcm5pbmcoYEEgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2Ugd2FzIHJldHVybmVkLiBUaGUgY2xvdWQgaW5zdGFuY2UgZGlzY292ZXJ5IG5ldHdvcmsgcmVxdWVzdCdzIHN0YXR1cyBjb2RlIGlzOiAke28uc3RhdHVzfWApLGk9by5ib2R5LGkuZXJyb3I9PT10LklOVkFMSURfSU5TVEFOQ0UpcmV0dXJuIHRoaXMubG9nZ2VyLmVycm9yKCJUaGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2UgZXJyb3IgaXMgaW52YWxpZF9pbnN0YW5jZS4iKSxudWxsO3RoaXMubG9nZ2VyLndhcm5pbmcoYFRoZSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5RXJyb3JSZXNwb25zZSBlcnJvciBpcyAke2kuZXJyb3J9YCksdGhpcy5sb2dnZXIud2FybmluZyhgVGhlIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlIGVycm9yIGRlc2NyaXB0aW9uIGlzICR7aS5lcnJvcl9kZXNjcmlwdGlvbn1gKSx0aGlzLmxvZ2dlci53YXJuaW5nKCJTZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhIChyZXR1cm5lZCBmcm9tIHRoZSBuZXR3b3JrKSB0byBbXSIpLHM9W119dGhpcy5sb2dnZXIudmVyYm9zZSgiQXR0ZW1wdGluZyB0byBmaW5kIGEgbWF0Y2ggYmV0d2VlbiB0aGUgZGV2ZWxvcGVyJ3MgYXV0aG9yaXR5IGFuZCB0aGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhIHJldHVybmVkIGZyb20gdGhlIG5ldHdvcmsgcmVxdWVzdC4iKSxuPWtyKHMsdGhpcy5ob3N0bmFtZUFuZFBvcnQpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBDZSl0aGlzLmxvZ2dlci5lcnJvcihgVGhlcmUgd2FzIGEgbmV0d29yayBlcnJvciB3aGlsZSBhdHRlbXB0aW5nIHRvIGdldCB0aGUgY2xvdWQgZGlzY292ZXJ5IGluc3RhbmNlIG1ldGFkYXRhLlxuRXJyb3I6ICR7ZS5lcnJvckNvZGV9XG5FcnJvciBEZXNjcmlwdGlvbjogJHtlLmVycm9yTWVzc2FnZX1gKTtlbHNle2NvbnN0IHQ9ZTt0aGlzLmxvZ2dlci5lcnJvcihgQSBub24tTVNBTEpTIGVycm9yIHdhcyB0aHJvd24gd2hpbGUgYXR0ZW1wdGluZyB0byBnZXQgdGhlIGNsb3VkIGluc3RhbmNlIGRpc2NvdmVyeSBtZXRhZGF0YS5cbkVycm9yOiAke3QubmFtZX1cbkVycm9yIERlc2NyaXB0aW9uOiAke3QubWVzc2FnZX1gKX1yZXR1cm4gbnVsbH1yZXR1cm4gbnx8KHRoaXMubG9nZ2VyLndhcm5pbmcoIlRoZSBkZXZlbG9wZXIncyBhdXRob3JpdHkgd2FzIG5vdCBmb3VuZCB3aXRoaW4gdGhlIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlNZXRhZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBuZXR3b3JrIHJlcXVlc3QuIiksdGhpcy5sb2dnZXIudmVyYm9zZSgiQ3JlYXRpbmcgY3VzdG9tIEF1dGhvcml0eSBmb3IgY3VzdG9tIGRvbWFpbiBzY2VuYXJpby4iKSxuPVpuLmNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdCh0aGlzLmhvc3RuYW1lQW5kUG9ydCkpLG59aXNJbktub3duQXV0aG9yaXRpZXMoKXtyZXR1cm4gdGhpcy5hdXRob3JpdHlPcHRpb25zLmtub3duQXV0aG9yaXRpZXMuZmlsdGVyKChlPT5lJiZ3ci5nZXREb21haW5Gcm9tVXJsKGUpLnRvTG93ZXJDYXNlKCk9PT10aGlzLmhvc3RuYW1lQW5kUG9ydCkpLmxlbmd0aD4wfXN0YXRpYyBnZW5lcmF0ZUF1dGhvcml0eShlLHIpe2xldCBuO2lmKHImJnIuYXp1cmVDbG91ZEluc3RhbmNlIT09SXQuTm9uZSl7Y29uc3QgZT1yLnRlbmFudD9yLnRlbmFudDp0LkRFRkFVTFRfQ09NTU9OX1RFTkFOVDtuPWAke3IuYXp1cmVDbG91ZEluc3RhbmNlfS8ke2V9L2B9cmV0dXJuIG58fGV9c3RhdGljIGNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdChlKXtyZXR1cm57cHJlZmVycmVkX25ldHdvcms6ZSxwcmVmZXJyZWRfY2FjaGU6ZSxhbGlhc2VzOltlXX19Z2V0UHJlZmVycmVkQ2FjaGUoKXtpZih0aGlzLm1hbmFnZWRJZGVudGl0eSlyZXR1cm4gdC5ERUZBVUxUX0FVVEhPUklUWV9IT1NUO2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5tZXRhZGF0YS5wcmVmZXJyZWRfY2FjaGU7dGhyb3cgbXQoa2UpfWlzQWxpYXMoZSl7cmV0dXJuIHRoaXMubWV0YWRhdGEuYWxpYXNlcy5pbmRleE9mKGUpPi0xfWlzQWxpYXNPZktub3duTWljcm9zb2Z0QXV0aG9yaXR5KGUpe3JldHVybiBUci5oYXMoZSl9c3RhdGljIGlzUHVibGljQ2xvdWRBdXRob3JpdHkoZSl7cmV0dXJuIHQuS05PV05fUFVCTElDX0NMT1VEUy5pbmRleE9mKGUpPj0wfXN0YXRpYyBidWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKGUscixuKXtjb25zdCBvPW5ldyB3cihlKTtvLnZhbGlkYXRlQXNVcmkoKTtjb25zdCBpPW8uZ2V0VXJsQ29tcG9uZW50cygpO2xldCBzPWAke3J9LiR7aS5Ib3N0TmFtZUFuZFBvcnR9YDt0aGlzLmlzUHVibGljQ2xvdWRBdXRob3JpdHkoaS5Ib3N0TmFtZUFuZFBvcnQpJiYocz1gJHtyfS4ke3QuUkVHSU9OQUxfQVVUSF9QVUJMSUNfQ0xPVURfU1VGRklYfWApO2NvbnN0IGE9d3IuY29uc3RydWN0QXV0aG9yaXR5VXJpRnJvbU9iamVjdCh7Li4uby5nZXRVcmxDb21wb25lbnRzKCksSG9zdE5hbWVBbmRQb3J0OnN9KS51cmxTdHJpbmc7cmV0dXJuIG4/YCR7YX0/JHtufWA6YX1zdGF0aWMgcmVwbGFjZVdpdGhSZWdpb25hbEluZm9ybWF0aW9uKGUsdCl7Y29uc3Qgcj17Li4uZX07cmV0dXJuIHIuYXV0aG9yaXphdGlvbl9lbmRwb2ludD1abi5idWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKHIuYXV0aG9yaXphdGlvbl9lbmRwb2ludCx0KSxyLnRva2VuX2VuZHBvaW50PVpuLmJ1aWxkUmVnaW9uYWxBdXRob3JpdHlTdHJpbmcoci50b2tlbl9lbmRwb2ludCx0KSxyLmVuZF9zZXNzaW9uX2VuZHBvaW50JiYoci5lbmRfc2Vzc2lvbl9lbmRwb2ludD1abi5idWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKHIuZW5kX3Nlc3Npb25fZW5kcG9pbnQsdCkpLHJ9c3RhdGljIHRyYW5zZm9ybUNJQU1BdXRob3JpdHkoZSl7bGV0IHI9ZTtjb25zdCBuPW5ldyB3cihlKS5nZXRVcmxDb21wb25lbnRzKCk7aWYoMD09PW4uUGF0aFNlZ21lbnRzLmxlbmd0aCYmbi5Ib3N0TmFtZUFuZFBvcnQuZW5kc1dpdGgodC5DSUFNX0FVVEhfVVJMKSl7cj1gJHtyfSR7bi5Ib3N0TmFtZUFuZFBvcnQuc3BsaXQoIi4iKVswXX0ke3QuQUFEX1RFTkFOVF9ET01BSU5fU1VGRklYfWB9cmV0dXJuIHJ9fWZ1bmN0aW9uIGVvKGUpe3JldHVybiBlLmVuZHNXaXRoKHQuRk9SV0FSRF9TTEFTSCk/ZTpgJHtlfSR7dC5GT1JXQVJEX1NMQVNIfWB9ZnVuY3Rpb24gdG8oZSl7Y29uc3QgdD1lLmNsb3VkRGlzY292ZXJ5TWV0YWRhdGE7bGV0IHI7aWYodCl0cnl7cj1KU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IEp0KHF0KX1yZXR1cm57Y2Fub25pY2FsQXV0aG9yaXR5OmUuYXV0aG9yaXR5P2VvKGUuYXV0aG9yaXR5KTp2b2lkIDAsa25vd25BdXRob3JpdGllczplLmtub3duQXV0aG9yaXRpZXMsY2xvdWREaXNjb3ZlcnlNZXRhZGF0YTpyfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovYXN5bmMgZnVuY3Rpb24gcm8oZSx0LHIsbixvLGkscyl7cz8uYWRkUXVldWVNZWFzdXJlbWVudChPci5BdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLGkpO2NvbnN0IGE9Wm4udHJhbnNmb3JtQ0lBTUF1dGhvcml0eShlbyhlKSksYz1uZXcgWm4oYSx0LHIsbixvLGkscyk7dHJ5e3JldHVybiBhd2FpdCBVbihjLnJlc29sdmVFbmRwb2ludHNBc3luYy5iaW5kKGMpLE9yLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYyxvLHMsaSkoKSxjfWNhdGNoKGUpe3Rocm93IG10KGtlKX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL1puLnJlc2VydmVkVGVuYW50RG9tYWlucz1uZXcgU2V0KFsie3RlbmFudH0iLCJ7dGVuYW50aWR9IixJLEEsVF0pO2NsYXNzIG5vIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoZSx0LHIsbixvKXtzdXBlcihlLHQsciksdGhpcy5uYW1lPSJTZXJ2ZXJFcnJvciIsdGhpcy5lcnJvck5vPW4sdGhpcy5zdGF0dXM9byxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuby5wcm90b3R5cGUpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gb28oZSx0LHIpe3JldHVybntjbGllbnRJZDplLGF1dGhvcml0eTp0LmF1dGhvcml0eSxzY29wZXM6dC5zY29wZXMsaG9tZUFjY291bnRJZGVudGlmaWVyOnIsY2xhaW1zOnQuY2xhaW1zLGF1dGhlbnRpY2F0aW9uU2NoZW1lOnQuYXV0aGVudGljYXRpb25TY2hlbWUscmVzb3VyY2VSZXF1ZXN0TWV0aG9kOnQucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLHJlc291cmNlUmVxdWVzdFVyaTp0LnJlc291cmNlUmVxdWVzdFVyaSxzaHJDbGFpbXM6dC5zaHJDbGFpbXMsc3NoS2lkOnQuc3NoS2lkLGVtYmVkZGVkQ2xpZW50SWQ6dC5lbWJlZGRlZENsaWVudElkfHx0LnRva2VuQm9keVBhcmFtZXRlcnM/LmNsaWVudElkfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3MgaW97c3RhdGljIGdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkoZSl7cmV0dXJuYCR7WX0uJHtKU09OLnN0cmluZ2lmeShlKX1gfXN0YXRpYyBwcmVQcm9jZXNzKGUscixuKXtjb25zdCBvPWlvLmdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkociksaT1lLmdldFRocm90dGxpbmdDYWNoZShvKTtpZihpKXtpZihpLnRocm90dGxlVGltZTxEYXRlLm5vdygpKXJldHVybiB2b2lkIGUucmVtb3ZlSXRlbShvLG4pO3Rocm93IG5ldyBubyhpLmVycm9yQ29kZXM/LmpvaW4oIiAiKXx8dC5FTVBUWV9TVFJJTkcsaS5lcnJvck1lc3NhZ2UsaS5zdWJFcnJvcil9fXN0YXRpYyBwb3N0UHJvY2VzcyhlLHQscixuKXtpZihpby5jaGVja1Jlc3BvbnNlU3RhdHVzKHIpfHxpby5jaGVja1Jlc3BvbnNlRm9yUmV0cnlBZnRlcihyKSl7Y29uc3Qgbz17dGhyb3R0bGVUaW1lOmlvLmNhbGN1bGF0ZVRocm90dGxlVGltZShwYXJzZUludChyLmhlYWRlcnNbcF0pKSxlcnJvcjpyLmJvZHkuZXJyb3IsZXJyb3JDb2RlczpyLmJvZHkuZXJyb3JfY29kZXMsZXJyb3JNZXNzYWdlOnIuYm9keS5lcnJvcl9kZXNjcmlwdGlvbixzdWJFcnJvcjpyLmJvZHkuc3ViZXJyb3J9O2Uuc2V0VGhyb3R0bGluZ0NhY2hlKGlvLmdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkodCksbyxuKX19c3RhdGljIGNoZWNrUmVzcG9uc2VTdGF0dXMoZSl7cmV0dXJuIDQyOT09PWUuc3RhdHVzfHxlLnN0YXR1cz49NTAwJiZlLnN0YXR1czw2MDB9c3RhdGljIGNoZWNrUmVzcG9uc2VGb3JSZXRyeUFmdGVyKGUpe3JldHVybiEhZS5oZWFkZXJzJiYoZS5oZWFkZXJzLmhhc093blByb3BlcnR5KHApJiYoZS5zdGF0dXM8MjAwfHxlLnN0YXR1cz49MzAwKSl9c3RhdGljIGNhbGN1bGF0ZVRocm90dGxlVGltZShlKXtjb25zdCB0PWU8PTA/MDplLHI9RGF0ZS5ub3coKS8xZTM7cmV0dXJuIE1hdGguZmxvb3IoMWUzKk1hdGgubWluKHIrKHR8fFYpLHIrSikpfXN0YXRpYyByZW1vdmVUaHJvdHRsZShlLHQscixuKXtjb25zdCBvPW9vKHQscixuKSxpPXRoaXMuZ2VuZXJhdGVUaHJvdHRsaW5nU3RvcmFnZUtleShvKTtlLnJlbW92ZUl0ZW0oaSxyLmNvcnJlbGF0aW9uSWQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3Mgc28gZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoZS5lcnJvckNvZGUsZS5lcnJvck1lc3NhZ2UsZS5zdWJFcnJvciksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsc28ucHJvdG90eXBlKSx0aGlzLm5hbWU9Ik5ldHdvcmtFcnJvciIsdGhpcy5lcnJvcj1lLHRoaXMuaHR0cFN0YXR1cz10LHRoaXMucmVzcG9uc2VIZWFkZXJzPXJ9fWZ1bmN0aW9uIGFvKGUsdCxyLG4pe3JldHVybiBlLmVycm9yTWVzc2FnZT1gJHtlLmVycm9yTWVzc2FnZX0sIGFkZGl0aW9uYWxFcnJvckluZm86IGVycm9yLm5hbWU6JHtuPy5uYW1lfSwgZXJyb3IubWVzc2FnZToke24/Lm1lc3NhZ2V9YCxuZXcgc28oZSx0LHIpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBjb3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY29uZmlnPWZ1bmN0aW9uKHthdXRoT3B0aW9uczplLHN5c3RlbU9wdGlvbnM6dCxsb2dnZXJPcHRpb25zOnIsY2FjaGVPcHRpb25zOm4sc3RvcmFnZUludGVyZmFjZTpvLG5ldHdvcmtJbnRlcmZhY2U6aSxjcnlwdG9JbnRlcmZhY2U6cyxjbGllbnRDcmVkZW50aWFsczphLGxpYnJhcnlJbmZvOmMsdGVsZW1ldHJ5Omwsc2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpoLHBlcnNpc3RlbmNlUGx1Z2luOmQsc2VyaWFsaXphYmxlQ2FjaGU6dX0pe2NvbnN0IGc9ey4uLkJyLC4uLnJ9O3JldHVybnthdXRoT3B0aW9uczoocD1lLHtjbGllbnRDYXBhYmlsaXRpZXM6W10sYXp1cmVDbG91ZE9wdGlvbnM6JHIsc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6ITEsaW5zdGFuY2VBd2FyZTohMSxlbmNvZGVFeHRyYVF1ZXJ5UGFyYW1zOiExLC4uLnB9KSxzeXN0ZW1PcHRpb25zOnsuLi54ciwuLi50fSxsb2dnZXJPcHRpb25zOmcsY2FjaGVPcHRpb25zOnsuLi5GciwuLi5ufSxzdG9yYWdlSW50ZXJmYWNlOm98fG5ldyBNcihlLmNsaWVudElkLGZ0LG5ldyBDdChnKSxuZXcgSHIpLG5ldHdvcmtJbnRlcmZhY2U6aXx8enIsY3J5cHRvSW50ZXJmYWNlOnN8fGZ0LGNsaWVudENyZWRlbnRpYWxzOmF8fEdyLGxpYnJhcnlJbmZvOnsuLi5LciwuLi5jfSx0ZWxlbWV0cnk6ey4uLlFyLC4uLmx9LHNlcnZlclRlbGVtZXRyeU1hbmFnZXI6aHx8bnVsbCxwZXJzaXN0ZW5jZVBsdWdpbjpkfHxudWxsLHNlcmlhbGl6YWJsZUNhY2hlOnV8fG51bGx9O3ZhciBwfShlKSx0aGlzLmxvZ2dlcj1uZXcgQ3QodGhpcy5jb25maWcubG9nZ2VyT3B0aW9ucyx3dCx2dCksdGhpcy5jcnlwdG9VdGlscz10aGlzLmNvbmZpZy5jcnlwdG9JbnRlcmZhY2UsdGhpcy5jYWNoZU1hbmFnZXI9dGhpcy5jb25maWcuc3RvcmFnZUludGVyZmFjZSx0aGlzLm5ldHdvcmtDbGllbnQ9dGhpcy5jb25maWcubmV0d29ya0ludGVyZmFjZSx0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXI9dGhpcy5jb25maWcuc2VydmVyVGVsZW1ldHJ5TWFuYWdlcix0aGlzLmF1dGhvcml0eT10aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5hdXRob3JpdHksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10fWNyZWF0ZVRva2VuUmVxdWVzdEhlYWRlcnMoZSl7Y29uc3Qgcj17fTtpZihyW3VdPXQuVVJMX0ZPUk1fQ09OVEVOVF9UWVBFLCF0aGlzLmNvbmZpZy5zeXN0ZW1PcHRpb25zLnByZXZlbnRDb3JzUHJlZmxpZ2h0JiZlKXN3aXRjaChlLnR5cGUpe2Nhc2UgV3I6dHJ5e2NvbnN0IHQ9ZXIoZS5jcmVkZW50aWFsKTtyW21dPWBPaWQ6JHt0LnVpZH1AJHt0LnV0aWR9YH1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJDb3VsZCBub3QgcGFyc2UgaG9tZSBhY2NvdW50IElEIGZvciBDQ1MgSGVhZGVyOiAiK2UpfWJyZWFrO2Nhc2UgVnI6clttXT1gVVBOOiAke2UuY3JlZGVudGlhbH1gfXJldHVybiByfWFzeW5jIGV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50KGUsdCxyLG4sbyxpKXtpJiZ0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KGksbyk7Y29uc3Qgcz1hd2FpdCB0aGlzLnNlbmRQb3N0UmVxdWVzdChuLGUse2JvZHk6dCxoZWFkZXJzOnJ9LG8pO3JldHVybiB0aGlzLmNvbmZpZy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyJiZzLnN0YXR1czw1MDAmJjQyOSE9PXMuc3RhdHVzJiZ0aGlzLmNvbmZpZy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNsZWFyVGVsZW1ldHJ5Q2FjaGUoKSxzfWFzeW5jIHNlbmRQb3N0UmVxdWVzdChlLHQscixuKXtsZXQgbztpby5wcmVQcm9jZXNzKHRoaXMuY2FjaGVNYW5hZ2VyLGUsbik7dHJ5e289YXdhaXQgVW4odGhpcy5uZXR3b3JrQ2xpZW50LnNlbmRQb3N0UmVxdWVzdEFzeW5jLmJpbmQodGhpcy5uZXR3b3JrQ2xpZW50KSxPci5OZXR3b3JrQ2xpZW50U2VuZFBvc3RSZXF1ZXN0QXN5bmMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxuKSh0LHIpO2NvbnN0IGU9by5oZWFkZXJzfHx7fTt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRGaWVsZHMoe3JlZnJlc2hUb2tlblNpemU6by5ib2R5LnJlZnJlc2hfdG9rZW4/Lmxlbmd0aHx8MCxodHRwVmVyVG9rZW46ZVt3XXx8IiIscmVxdWVzdElkOmVbQ118fCIifSxuKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygc28pe2NvbnN0IHQ9ZS5yZXNwb25zZUhlYWRlcnM7dGhyb3cgdCYmdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtodHRwVmVyVG9rZW46dFt3XXx8IiIscmVxdWVzdElkOnRbQ118fCIiLGNvbnRlbnRUeXBlSGVhZGVyOnRbdV18fHZvaWQgMCxjb250ZW50TGVuZ3RoSGVhZGVyOnRbZ118fHZvaWQgMCxodHRwU3RhdHVzOmUuaHR0cFN0YXR1c30sbiksZS5lcnJvcn10aHJvdyBlIGluc3RhbmNlb2YgQ2U/ZTptdChTZSl9cmV0dXJuIGlvLnBvc3RQcm9jZXNzKHRoaXMuY2FjaGVNYW5hZ2VyLGUsbyxuKSxvfWFzeW5jIHVwZGF0ZUF1dGhvcml0eShlLHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuVXBkYXRlVG9rZW5FbmRwb2ludEF1dGhvcml0eSx0KTtjb25zdCByPWBodHRwczovLyR7ZX0vJHt0aGlzLmF1dGhvcml0eS50ZW5hbnR9L2Asbj1hd2FpdCBybyhyLHRoaXMubmV0d29ya0NsaWVudCx0aGlzLmNhY2hlTWFuYWdlcix0aGlzLmF1dGhvcml0eS5vcHRpb25zLHRoaXMubG9nZ2VyLHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7dGhpcy5hdXRob3JpdHk9bn1jcmVhdGVUb2tlblF1ZXJ5UGFyYW1ldGVycyhlKXtjb25zdCB0PW5ldyBNYXA7cmV0dXJuIGUuZW1iZWRkZWRDbGllbnRJZCYmcW4odCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSksZS50b2tlblF1ZXJ5UGFyYW1ldGVycyYmRW4odCxlLnRva2VuUXVlcnlQYXJhbWV0ZXJzKSxmbih0LGUuY29ycmVsYXRpb25JZCksc24odCxlLmNvcnJlbGF0aW9uSWQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkseXIodCl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBsbz0ibm9fdG9rZW5zX2ZvdW5kIixobz0ibmF0aXZlX2FjY291bnRfdW5hdmFpbGFibGUiLHVvPSJyZWZyZXNoX3Rva2VuX2V4cGlyZWQiLGdvPSJ1eF9ub3RfYWxsb3dlZCIscG89ImludGVyYWN0aW9uX3JlcXVpcmVkIixtbz0iY29uc2VudF9yZXF1aXJlZCIsZm89ImxvZ2luX3JlcXVpcmVkIix5bz0iYmFkX3Rva2VuIjt2YXIgQ289T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYmFkVG9rZW46eW8sY29uc2VudFJlcXVpcmVkOm1vLGludGVyYWN0aW9uUmVxdWlyZWQ6cG8sbG9naW5SZXF1aXJlZDpmbyxuYXRpdmVBY2NvdW50VW5hdmFpbGFibGU6aG8sbm9Ub2tlbnNGb3VuZDpsbyxyZWZyZXNoVG9rZW5FeHBpcmVkOnVvLHV4Tm90QWxsb3dlZDpnb30pOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB3bz1bcG8sbW8sZm8seW8sZ29dLHZvPVsibWVzc2FnZV9vbmx5IiwiYWRkaXRpb25hbF9hY3Rpb24iLCJiYXNpY19hY3Rpb24iLCJ1c2VyX3Bhc3N3b3JkX2V4cGlyZWQiLCJjb25zZW50X3JlcXVpcmVkIiwiYmFkX3Rva2VuIl0sSW89e1tsb106Ik5vIHJlZnJlc2ggdG9rZW4gZm91bmQgaW4gdGhlIGNhY2hlLiBQbGVhc2Ugc2lnbi1pbi4iLFtob106IlRoZSByZXF1ZXN0ZWQgYWNjb3VudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgYnJva2VyLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgbG9nZ2VkIG91dC4gUGxlYXNlIHNpZ24taW4gYWdhaW4gdXNpbmcgYW4gaW50ZXJhY3RpdmUgQVBJLiIsW3VvXToiUmVmcmVzaCB0b2tlbiBoYXMgZXhwaXJlZC4iLFt5b106IklkZW50aXR5IHByb3ZpZGVyIHJldHVybmVkIGJhZF90b2tlbiBkdWUgdG8gYW4gZXhwaXJlZCBvciBpbnZhbGlkIHJlZnJlc2ggdG9rZW4uIFBsZWFzZSBpbnZva2UgYW4gaW50ZXJhY3RpdmUgQVBJIHRvIHJlc29sdmUuIixbZ29dOiJgY2FuU2hvd1VJYCBmbGFnIGluIEVkZ2Ugd2FzIHNldCB0byBmYWxzZS4gVXNlciBpbnRlcmFjdGlvbiByZXF1aXJlZCBvbiB3ZWIgcGFnZS4gUGxlYXNlIGludm9rZSBhbiBpbnRlcmFjdGl2ZSBBUEkgdG8gcmVzb2x2ZS4ifSxUbz17bm9Ub2tlbnNGb3VuZEVycm9yOntjb2RlOmxvLGRlc2M6SW9bbG9dfSxuYXRpdmVfYWNjb3VudF91bmF2YWlsYWJsZTp7Y29kZTpobyxkZXNjOklvW2hvXX0sYmFkX3Rva2VuOntjb2RlOnlvLGRlc2M6SW9beW9dfX07Y2xhc3MgQW8gZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHIsbixvLGkscyxhLGMpe3N1cGVyKGUscixuKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxBby5wcm90b3R5cGUpLHRoaXMudGltZXN0YW1wPW98fHQuRU1QVFlfU1RSSU5HLHRoaXMudHJhY2VJZD1pfHx0LkVNUFRZX1NUUklORyx0aGlzLmNvcnJlbGF0aW9uSWQ9c3x8dC5FTVBUWV9TVFJJTkcsdGhpcy5jbGFpbXM9YXx8dC5FTVBUWV9TVFJJTkcsdGhpcy5uYW1lPSJJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yIix0aGlzLmVycm9yTm89Y319ZnVuY3Rpb24ga28oZSx0LHIpe2NvbnN0IG49ISFlJiZ3by5pbmRleE9mKGUpPi0xLG89ISFyJiZ2by5pbmRleE9mKHIpPi0xLGk9ISF0JiZ3by5zb21lKChlPT50LmluZGV4T2YoZSk+LTEpKTtyZXR1cm4gbnx8aXx8b31mdW5jdGlvbiBTbyhlKXtyZXR1cm4gbmV3IEFvKGUsSW9bZV0pfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBib3tzdGF0aWMgc2V0UmVxdWVzdFN0YXRlKGUscixuKXtjb25zdCBvPWJvLmdlbmVyYXRlTGlicmFyeVN0YXRlKGUsbik7cmV0dXJuIHI/YCR7b30ke3QuUkVTT1VSQ0VfREVMSU19JHtyfWA6b31zdGF0aWMgZ2VuZXJhdGVMaWJyYXJ5U3RhdGUoZSx0KXtpZighZSl0aHJvdyBtdChXZSk7Y29uc3Qgcj17aWQ6ZS5jcmVhdGVOZXdHdWlkKCl9O3QmJihyLm1ldGE9dCk7Y29uc3Qgbj1KU09OLnN0cmluZ2lmeShyKTtyZXR1cm4gZS5iYXNlNjRFbmNvZGUobil9c3RhdGljIHBhcnNlUmVxdWVzdFN0YXRlKGUscil7aWYoIWUpdGhyb3cgbXQoV2UpO2lmKCFyKXRocm93IG10KFJlKTt0cnl7Y29uc3Qgbj1yLnNwbGl0KHQuUkVTT1VSQ0VfREVMSU0pLG89blswXSxpPW4ubGVuZ3RoPjE/bi5zbGljZSgxKS5qb2luKHQuUkVTT1VSQ0VfREVMSU0pOnQuRU1QVFlfU1RSSU5HLHM9ZS5iYXNlNjREZWNvZGUobyksYT1KU09OLnBhcnNlKHMpO3JldHVybnt1c2VyUmVxdWVzdFN0YXRlOml8fHQuRU1QVFlfU1RSSU5HLGxpYnJhcnlTdGF0ZTphfX1jYXRjaChlKXt0aHJvdyBtdChSZSl9fX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgRW89InN3IjtjbGFzcyBSb3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY3J5cHRvVXRpbHM9ZSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXR9YXN5bmMgZ2VuZXJhdGVDbmYoZSx0KXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlBvcFRva2VuR2VuZXJhdGVDbmYsZS5jb3JyZWxhdGlvbklkKTtjb25zdCByPWF3YWl0IFVuKHRoaXMuZ2VuZXJhdGVLaWQuYmluZCh0aGlzKSxPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpLG49dGhpcy5jcnlwdG9VdGlscy5iYXNlNjRVcmxFbmNvZGUoSlNPTi5zdHJpbmdpZnkocikpO3JldHVybntraWQ6ci5raWQscmVxQ25mU3RyaW5nOm59fWFzeW5jIGdlbmVyYXRlS2lkKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUG9wVG9rZW5HZW5lcmF0ZUtpZCxlLmNvcnJlbGF0aW9uSWQpO3JldHVybntraWQ6YXdhaXQgdGhpcy5jcnlwdG9VdGlscy5nZXRQdWJsaWNLZXlUaHVtYnByaW50KGUpLHhtc19rc2w6RW99fWFzeW5jIHNpZ25Qb3BUb2tlbihlLHQscil7cmV0dXJuIHRoaXMuc2lnblBheWxvYWQoZSx0LHIpfWFzeW5jIHNpZ25QYXlsb2FkKGUsdCxyLG4pe2NvbnN0e3Jlc291cmNlUmVxdWVzdE1ldGhvZDpvLHJlc291cmNlUmVxdWVzdFVyaTppLHNockNsYWltczpzLHNock5vbmNlOmEsc2hyT3B0aW9uczpjfT1yLGw9aT9uZXcgd3IoaSk6dm9pZCAwLGg9bD8uZ2V0VXJsQ29tcG9uZW50cygpO3JldHVybiB0aGlzLmNyeXB0b1V0aWxzLnNpZ25Kd3Qoe2F0OmUsdHM6RG4oKSxtOm8/LnRvVXBwZXJDYXNlKCksdTpoPy5Ib3N0TmFtZUFuZFBvcnQsbm9uY2U6YXx8dGhpcy5jcnlwdG9VdGlscy5jcmVhdGVOZXdHdWlkKCkscDpoPy5BYnNvbHV0ZVBhdGgscTpoPy5RdWVyeVN0cmluZz9bW10saC5RdWVyeVN0cmluZ106dm9pZCAwLGNsaWVudF9jbGFpbXM6c3x8dm9pZCAwLC4uLm59LHQsYyxyLmNvcnJlbGF0aW9uSWQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3MgX297Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNhY2hlPWUsdGhpcy5oYXNDaGFuZ2VkPXR9Z2V0IGNhY2hlSGFzQ2hhbmdlZCgpe3JldHVybiB0aGlzLmhhc0NoYW5nZWR9Z2V0IHRva2VuQ2FjaGUoKXtyZXR1cm4gdGhpcy5jYWNoZX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIFBve2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMpe3RoaXMuY2xpZW50SWQ9ZSx0aGlzLmNhY2hlU3RvcmFnZT10LHRoaXMuY3J5cHRvT2JqPXIsdGhpcy5sb2dnZXI9bix0aGlzLnNlcmlhbGl6YWJsZUNhY2hlPW8sdGhpcy5wZXJzaXN0ZW5jZVBsdWdpbj1pLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ9c312YWxpZGF0ZVRva2VuUmVzcG9uc2UoZSxyKXtpZihlLmVycm9yfHxlLmVycm9yX2Rlc2NyaXB0aW9ufHxlLnN1YmVycm9yKXtjb25zdCBvPWBFcnJvcihzKTogJHtlLmVycm9yX2NvZGVzfHx0Lk5PVF9BVkFJTEFCTEV9IC0gVGltZXN0YW1wOiAke2UudGltZXN0YW1wfHx0Lk5PVF9BVkFJTEFCTEV9IC0gRGVzY3JpcHRpb246ICR7ZS5lcnJvcl9kZXNjcmlwdGlvbnx8dC5OT1RfQVZBSUxBQkxFfSAtIENvcnJlbGF0aW9uIElEOiAke2UuY29ycmVsYXRpb25faWR8fHQuTk9UX0FWQUlMQUJMRX0gLSBUcmFjZSBJRDogJHtlLnRyYWNlX2lkfHx0Lk5PVF9BVkFJTEFCTEV9YCxjPWUuZXJyb3JfY29kZXM/Lmxlbmd0aD9lLmVycm9yX2NvZGVzWzBdOnZvaWQgMCxsPW5ldyBubyhlLmVycm9yLG8sZS5zdWJlcnJvcixjLGUuc3RhdHVzKTtpZihyJiZlLnN0YXR1cyYmZS5zdGF0dXM+PXMmJmUuc3RhdHVzPD1hKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLndhcm5pbmcoYGV4ZWN1dGVUb2tlblJlcXVlc3Q6dmFsaWRhdGVUb2tlblJlc3BvbnNlIC0gQUFEIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBhbmQgdGhlIGFjY2VzcyB0b2tlbiBpcyB1bmFibGUgdG8gYmUgcmVmcmVzaGVkLlxuJHtsfWApO2lmKHImJmUuc3RhdHVzJiZlLnN0YXR1cz49biYmZS5zdGF0dXM8PWkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIud2FybmluZyhgZXhlY3V0ZVRva2VuUmVxdWVzdDp2YWxpZGF0ZVRva2VuUmVzcG9uc2UgLSBBQUQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBidXQgaXMgdW5hYmxlIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbi5cbiR7bH1gKTtpZihrbyhlLmVycm9yLGUuZXJyb3JfZGVzY3JpcHRpb24sZS5zdWJlcnJvcikpdGhyb3cgbmV3IEFvKGUuZXJyb3IsZS5lcnJvcl9kZXNjcmlwdGlvbixlLnN1YmVycm9yLGUudGltZXN0YW1wfHx0LkVNUFRZX1NUUklORyxlLnRyYWNlX2lkfHx0LkVNUFRZX1NUUklORyxlLmNvcnJlbGF0aW9uX2lkfHx0LkVNUFRZX1NUUklORyxlLmNsYWltc3x8dC5FTVBUWV9TVFJJTkcsYyk7dGhyb3cgbH19YXN5bmMgaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZShlLHIsbixvLGkscyxhLGMsbCl7bGV0IGgsZDtpZih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsZS5jb3JyZWxhdGlvbl9pZCksZS5pZF90b2tlbil7aWYoaD1kcihlLmlkX3Rva2VufHx0LkVNUFRZX1NUUklORyx0aGlzLmNyeXB0b09iai5iYXNlNjREZWNvZGUpLGkmJmkubm9uY2UmJmgubm9uY2UhPT1pLm5vbmNlKXRocm93IG10KE1lKTtpZihvLm1heEFnZXx8MD09PW8ubWF4QWdlKXtjb25zdCBlPWguYXV0aF90aW1lO2lmKCFlKXRocm93IG10KE9lKTtncihlLG8ubWF4QWdlKX19dGhpcy5ob21lQWNjb3VudElkZW50aWZpZXI9aHIuZ2VuZXJhdGVIb21lQWNjb3VudElkKGUuY2xpZW50X2luZm98fHQuRU1QVFlfU1RSSU5HLHIuYXV0aG9yaXR5VHlwZSx0aGlzLmxvZ2dlcix0aGlzLmNyeXB0b09iaixoKSxpJiZpLnN0YXRlJiYoZD1iby5wYXJzZVJlcXVlc3RTdGF0ZSh0aGlzLmNyeXB0b09iaixpLnN0YXRlKSksZS5rZXlfaWQ9ZS5rZXlfaWR8fG8uc3NoS2lkfHx2b2lkIDA7Y29uc3QgdT10aGlzLmdlbmVyYXRlQ2FjaGVSZWNvcmQoZSxyLG4sbyxoLHMsaSk7bGV0IGc7dHJ5e2lmKHRoaXMucGVyc2lzdGVuY2VQbHVnaW4mJnRoaXMuc2VyaWFsaXphYmxlQ2FjaGUmJih0aGlzLmxvZ2dlci52ZXJib3NlKCJQZXJzaXN0ZW5jZSBlbmFibGVkLCBjYWxsaW5nIGJlZm9yZUNhY2hlQWNjZXNzIiksZz1uZXcgX28odGhpcy5zZXJpYWxpemFibGVDYWNoZSwhMCksYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZVBsdWdpbi5iZWZvcmVDYWNoZUFjY2VzcyhnKSksYSYmIWMmJnUuYWNjb3VudCl7Y29uc3QgZT10aGlzLmNhY2hlU3RvcmFnZS5nZW5lcmF0ZUFjY291bnRLZXkoaHIuZ2V0QWNjb3VudEluZm8odS5hY2NvdW50KSk7aWYoIXRoaXMuY2FjaGVTdG9yYWdlLmdldEFjY291bnQoZSxvLmNvcnJlbGF0aW9uSWQpKXJldHVybiB0aGlzLmxvZ2dlci53YXJuaW5nKCJBY2NvdW50IHVzZWQgdG8gcmVmcmVzaCB0b2tlbnMgbm90IGluIHBlcnNpc3RlbmNlLCByZWZyZXNoZWQgdG9rZW5zIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUiKSxhd2FpdCBQby5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KHRoaXMuY3J5cHRvT2JqLHIsdSwhMSxvLGgsZCx2b2lkIDAsbCl9YXdhaXQgdGhpcy5jYWNoZVN0b3JhZ2Uuc2F2ZUNhY2hlUmVjb3JkKHUsby5jb3JyZWxhdGlvbklkLHVyKGh8fHt9KSxvLnN0b3JlSW5DYWNoZSl9ZmluYWxseXt0aGlzLnBlcnNpc3RlbmNlUGx1Z2luJiZ0aGlzLnNlcmlhbGl6YWJsZUNhY2hlJiZnJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiUGVyc2lzdGVuY2UgZW5hYmxlZCwgY2FsbGluZyBhZnRlckNhY2hlQWNjZXNzIiksYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZVBsdWdpbi5hZnRlckNhY2hlQWNjZXNzKGcpKX1yZXR1cm4gUG8uZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdCh0aGlzLmNyeXB0b09iaixyLHUsITEsbyxoLGQsZSxsKX1nZW5lcmF0ZUNhY2hlUmVjb3JkKGUsdCxyLG4sbyxpLHMpe2NvbnN0IGE9dC5nZXRQcmVmZXJyZWRDYWNoZSgpO2lmKCFhKXRocm93IG10KFFlKTtjb25zdCBjPWNyKG8pO2xldCBsLGg7ZS5pZF90b2tlbiYmbyYmKGw9S24odGhpcy5ob21lQWNjb3VudElkZW50aWZpZXIsYSxlLmlkX3Rva2VuLHRoaXMuY2xpZW50SWQsY3x8IiIpLGg9TW8odGhpcy5jYWNoZVN0b3JhZ2UsdCx0aGlzLmhvbWVBY2NvdW50SWRlbnRpZmllcix0aGlzLmNyeXB0b09iai5iYXNlNjREZWNvZGUsbi5jb3JyZWxhdGlvbklkLG8sZS5jbGllbnRfaW5mbyxhLGMscyx2b2lkIDAsdGhpcy5sb2dnZXIpKTtsZXQgZD1udWxsO2lmKGUuYWNjZXNzX3Rva2VuKXtjb25zdCBvPWUuc2NvcGU/WHQuZnJvbVN0cmluZyhlLnNjb3BlKTpuZXcgWHQobi5zY29wZXN8fFtdKSxzPSgic3RyaW5nIj09dHlwZW9mIGUuZXhwaXJlc19pbj9wYXJzZUludChlLmV4cGlyZXNfaW4sMTApOmUuZXhwaXJlc19pbil8fDAsbD0oInN0cmluZyI9PXR5cGVvZiBlLmV4dF9leHBpcmVzX2luP3BhcnNlSW50KGUuZXh0X2V4cGlyZXNfaW4sMTApOmUuZXh0X2V4cGlyZXNfaW4pfHwwLGg9KCJzdHJpbmciPT10eXBlb2YgZS5yZWZyZXNoX2luP3BhcnNlSW50KGUucmVmcmVzaF9pbiwxMCk6ZS5yZWZyZXNoX2luKXx8dm9pZCAwLHU9citzLGc9dStsLHA9aCYmaD4wP3IraDp2b2lkIDA7ZD1Hbih0aGlzLmhvbWVBY2NvdW50SWRlbnRpZmllcixhLGUuYWNjZXNzX3Rva2VuLHRoaXMuY2xpZW50SWQsY3x8dC50ZW5hbnR8fCIiLG8ucHJpbnRTY29wZXMoKSx1LGcsdGhpcy5jcnlwdG9PYmouYmFzZTY0RGVjb2RlLHAsZS50b2tlbl90eXBlLGksZS5rZXlfaWQsbi5jbGFpbXMsbi5yZXF1ZXN0ZWRDbGFpbXNIYXNoKX1sZXQgdT1udWxsO2lmKGUucmVmcmVzaF90b2tlbil7bGV0IHQ7aWYoZS5yZWZyZXNoX3Rva2VuX2V4cGlyZXNfaW4pe3Q9cisoInN0cmluZyI9PXR5cGVvZiBlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbj9wYXJzZUludChlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbiwxMCk6ZS5yZWZyZXNoX3Rva2VuX2V4cGlyZXNfaW4pfXU9JG4odGhpcy5ob21lQWNjb3VudElkZW50aWZpZXIsYSxlLnJlZnJlc2hfdG9rZW4sdGhpcy5jbGllbnRJZCxlLmZvY2ksaSx0KX1sZXQgZz1udWxsO3JldHVybiBlLmZvY2kmJihnPXtjbGllbnRJZDp0aGlzLmNsaWVudElkLGVudmlyb25tZW50OmEsZmFtaWx5SWQ6ZS5mb2NpfSkse2FjY291bnQ6aCxpZFRva2VuOmwsYWNjZXNzVG9rZW46ZCxyZWZyZXNoVG9rZW46dSxhcHBNZXRhZGF0YTpnfX1zdGF0aWMgYXN5bmMgZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdChlLHIsbixvLGkscyxhLGMsbCl7bGV0IGgsZCx1PXQuRU1QVFlfU1RSSU5HLGc9W10scD1udWxsLG09dC5FTVBUWV9TVFJJTkc7aWYobi5hY2Nlc3NUb2tlbil7aWYobi5hY2Nlc3NUb2tlbi50b2tlblR5cGUhPT1XLlBPUHx8aS5wb3BLaWQpdT1uLmFjY2Vzc1Rva2VuLnNlY3JldDtlbHNle2NvbnN0IHQ9bmV3IFJvKGUpLHtzZWNyZXQ6cixrZXlJZDpvfT1uLmFjY2Vzc1Rva2VuO2lmKCFvKXRocm93IG10KG90KTt1PWF3YWl0IHQuc2lnblBvcFRva2VuKHIsbyxpKX1nPVh0LmZyb21TdHJpbmcobi5hY2Nlc3NUb2tlbi50YXJnZXQpLmFzQXJyYXkoKSxwPXhuKG4uYWNjZXNzVG9rZW4uZXhwaXJlc09uKSxoPXhuKG4uYWNjZXNzVG9rZW4uZXh0ZW5kZWRFeHBpcmVzT24pLG4uYWNjZXNzVG9rZW4ucmVmcmVzaE9uJiYoZD14bihuLmFjY2Vzc1Rva2VuLnJlZnJlc2hPbikpfW4uYXBwTWV0YWRhdGEmJihtPW4uYXBwTWV0YWRhdGEuZmFtaWx5SWQ9PT1CP0I6IiIpO2NvbnN0IGY9cz8ub2lkfHxzPy5zdWJ8fCIiLHk9cz8udGlkfHwiIjtjPy5zcGFfYWNjb3VudGlkJiZuLmFjY291bnQmJihuLmFjY291bnQubmF0aXZlQWNjb3VudElkPWM/LnNwYV9hY2NvdW50aWQpO2NvbnN0IEM9bi5hY2NvdW50P25yKGhyLmdldEFjY291bnRJbmZvKG4uYWNjb3VudCksdm9pZCAwLHMsbi5pZFRva2VuPy5zZWNyZXQpOm51bGw7cmV0dXJue2F1dGhvcml0eTpyLmNhbm9uaWNhbEF1dGhvcml0eSx1bmlxdWVJZDpmLHRlbmFudElkOnksc2NvcGVzOmcsYWNjb3VudDpDLGlkVG9rZW46bj8uaWRUb2tlbj8uc2VjcmV0fHwiIixpZFRva2VuQ2xhaW1zOnN8fHt9LGFjY2Vzc1Rva2VuOnUsZnJvbUNhY2hlOm8sZXhwaXJlc09uOnAsZXh0RXhwaXJlc09uOmgscmVmcmVzaE9uOmQsY29ycmVsYXRpb25JZDppLmNvcnJlbGF0aW9uSWQscmVxdWVzdElkOmx8fHQuRU1QVFlfU1RSSU5HLGZhbWlseUlkOm0sdG9rZW5UeXBlOm4uYWNjZXNzVG9rZW4/LnRva2VuVHlwZXx8dC5FTVBUWV9TVFJJTkcsc3RhdGU6YT9hLnVzZXJSZXF1ZXN0U3RhdGU6dC5FTVBUWV9TVFJJTkcsY2xvdWRHcmFwaEhvc3ROYW1lOm4uYWNjb3VudD8uY2xvdWRHcmFwaEhvc3ROYW1lfHx0LkVNUFRZX1NUUklORyxtc0dyYXBoSG9zdDpuLmFjY291bnQ/Lm1zR3JhcGhIb3N0fHx0LkVNUFRZX1NUUklORyxjb2RlOmM/LnNwYV9jb2RlLGZyb21OYXRpdmVCcm9rZXI6ITF9fX1mdW5jdGlvbiBNbyhlLHQscixuLG8saSxzLGEsYyxsLGgsZCl7ZD8udmVyYm9zZSgic2V0Q2FjaGVkQWNjb3VudCBjYWxsZWQiKTtjb25zdCB1PWUuZ2V0QWNjb3VudEtleXMoKS5maW5kKChlPT5lLnN0YXJ0c1dpdGgocikpKTtsZXQgZz1udWxsO3UmJihnPWUuZ2V0QWNjb3VudCh1LG8pKTtjb25zdCBwPWd8fGhyLmNyZWF0ZUFjY291bnQoe2hvbWVBY2NvdW50SWQ6cixpZFRva2VuQ2xhaW1zOmksY2xpZW50SW5mbzpzLGVudmlyb25tZW50OmEsY2xvdWRHcmFwaEhvc3ROYW1lOmw/LmNsb3VkX2dyYXBoX2hvc3RfbmFtZSxtc0dyYXBoSG9zdDpsPy5tc2dyYXBoX2hvc3QsbmF0aXZlQWNjb3VudElkOmh9LHQsbiksbT1wLnRlbmFudFByb2ZpbGVzfHxbXSxmPWN8fHAucmVhbG07aWYoZiYmIW0uZmluZCgoZT0+ZS50ZW5hbnRJZD09PWYpKSl7Y29uc3QgZT1ycihyLHAubG9jYWxBY2NvdW50SWQsZixpKTttLnB1c2goZSl9cmV0dXJuIHAudGVuYW50UHJvZmlsZXM9bSxwfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9hc3luYyBmdW5jdGlvbiBPbyhlLHQscil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO3JldHVybiBlKHtjbGllbnRJZDp0LHRva2VuRW5kcG9pbnQ6cn0pfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBxbyBleHRlbmRzIGNve2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmluY2x1ZGVSZWRpcmVjdFVyaT0hMCx0aGlzLm9pZGNEZWZhdWx0U2NvcGVzPXRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmF1dGhvcml0eS5vcHRpb25zLk9JRENPcHRpb25zPy5kZWZhdWx0U2NvcGVzfWFzeW5jIGFjcXVpcmVUb2tlbihlLHQpe2lmKHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aENsaWVudEFjcXVpcmVUb2tlbixlLmNvcnJlbGF0aW9uSWQpLCFlLmNvZGUpdGhyb3cgbXQoRGUpO2NvbnN0IHI9RG4oKSxuPWF3YWl0IFVuKHRoaXMuZXhlY3V0ZVRva2VuUmVxdWVzdC5iaW5kKHRoaXMpLE9yLkF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKSh0aGlzLmF1dGhvcml0eSxlKSxvPW4uaGVhZGVycz8uW0NdLGk9bmV3IFBvKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLHRoaXMuY2FjaGVNYW5hZ2VyLHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5sb2dnZXIsdGhpcy5jb25maWcuc2VyaWFsaXphYmxlQ2FjaGUsdGhpcy5jb25maWcucGVyc2lzdGVuY2VQbHVnaW4sdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7cmV0dXJuIGkudmFsaWRhdGVUb2tlblJlc3BvbnNlKG4uYm9keSksVW4oaS5oYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlLmJpbmQoaSksT3IuSGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkobi5ib2R5LHRoaXMuYXV0aG9yaXR5LHIsZSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG8pfWdldExvZ291dFVyaShlKXtpZighZSl0aHJvdyBKdChQdCk7Y29uc3QgdD10aGlzLmNyZWF0ZUxvZ291dFVybFF1ZXJ5U3RyaW5nKGUpO3JldHVybiB3ci5hcHBlbmRRdWVyeVN0cmluZyh0aGlzLmF1dGhvcml0eS5lbmRTZXNzaW9uRW5kcG9pbnQsdCl9YXN5bmMgZXhlY3V0ZVRva2VuUmVxdWVzdChlLHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aENsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QsdC5jb3JyZWxhdGlvbklkKTtjb25zdCByPXRoaXMuY3JlYXRlVG9rZW5RdWVyeVBhcmFtZXRlcnModCksbj13ci5hcHBlbmRRdWVyeVN0cmluZyhlLnRva2VuRW5kcG9pbnQsciksbz1hd2FpdCBVbih0aGlzLmNyZWF0ZVRva2VuUmVxdWVzdEJvZHkuYmluZCh0aGlzKSxPci5BdXRoQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0Qm9keSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkodCk7bGV0IGk7aWYodC5jbGllbnRJbmZvKXRyeXtjb25zdCBlPVp0KHQuY2xpZW50SW5mbyx0aGlzLmNyeXB0b1V0aWxzLmJhc2U2NERlY29kZSk7aT17Y3JlZGVudGlhbDpgJHtlLnVpZH0ke0R9JHtlLnV0aWR9YCx0eXBlOldyfX1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJDb3VsZCBub3QgcGFyc2UgY2xpZW50IGluZm8gZm9yIENDUyBIZWFkZXI6ICIrZSl9Y29uc3Qgcz10aGlzLmNyZWF0ZVRva2VuUmVxdWVzdEhlYWRlcnMoaXx8dC5jY3NDcmVkZW50aWFsKSxhPW9vKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLHQpO3JldHVybiBVbih0aGlzLmV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50LmJpbmQodGhpcyksT3IuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkobixvLHMsYSx0LmNvcnJlbGF0aW9uSWQsT3IuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCl9YXN5bmMgY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keShlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LGUuY29ycmVsYXRpb25JZCk7Y29uc3QgdD1uZXcgTWFwO2lmKGxuKHQsZS5lbWJlZGRlZENsaWVudElkfHxlLnRva2VuQm9keVBhcmFtZXRlcnM/LltKcl18fHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkKSx0aGlzLmluY2x1ZGVSZWRpcmVjdFVyaSlobih0LGUucmVkaXJlY3RVcmkpO2Vsc2UgaWYoIWUucmVkaXJlY3RVcmkpdGhyb3cgSnQoVHQpO2lmKGNuKHQsZS5zY29wZXMsITAsdGhpcy5vaWRjRGVmYXVsdFNjb3BlcyksZnVuY3Rpb24oZSx0KXtlLnNldCgiY29kZSIsdCl9KHQsZS5jb2RlKSx5bih0LHRoaXMuY29uZmlnLmxpYnJhcnlJbmZvKSxDbih0LHRoaXMuY29uZmlnLnRlbGVtZXRyeS5hcHBsaWNhdGlvbiksT24odCksdGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyJiYhanIodGhpcy5jb25maWcpJiZNbih0LHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciksZS5jb2RlVmVyaWZpZXImJmZ1bmN0aW9uKGUsdCl7ZS5zZXQoImNvZGVfdmVyaWZpZXIiLHQpfSh0LGUuY29kZVZlcmlmaWVyKSx0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRTZWNyZXQmJkluKHQsdGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50U2VjcmV0KSx0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRBc3NlcnRpb24pe2NvbnN0IHI9dGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50QXNzZXJ0aW9uO1RuKHQsYXdhaXQgT28oci5hc3NlcnRpb24sdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQsZS5yZXNvdXJjZVJlcXVlc3RVcmkpKSxBbih0LHIuYXNzZXJ0aW9uVHlwZSl9aWYoa24odCxNKSxTbih0KSxlLmF1dGhlbnRpY2F0aW9uU2NoZW1lPT09Vy5QT1Ape2NvbnN0IHI9bmV3IFJvKHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7bGV0IG47aWYoZS5wb3BLaWQpbj10aGlzLmNyeXB0b1V0aWxzLmVuY29kZUtpZChlLnBvcEtpZCk7ZWxzZXtuPShhd2FpdCBVbihyLmdlbmVyYXRlQ25mLmJpbmQociksT3IuUG9wVG9rZW5HZW5lcmF0ZUNuZix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSx0aGlzLmxvZ2dlcikpLnJlcUNuZlN0cmluZ31fbih0LG4pfWVsc2UgaWYoZS5hdXRoZW50aWNhdGlvblNjaGVtZT09PVcuU1NIKXtpZighZS5zc2hKd2spdGhyb3cgSnQoTHQpO1BuKHQsZS5zc2hKd2spfWxldCByO2lmKCghWXQuaXNFbXB0eU9iaihlLmNsYWltcyl8fHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcyYmdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aD4wKSYmbW4odCxlLmNsYWltcyx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMpLGUuY2xpZW50SW5mbyl0cnl7Y29uc3QgdD1adChlLmNsaWVudEluZm8sdGhpcy5jcnlwdG9VdGlscy5iYXNlNjREZWNvZGUpO3I9e2NyZWRlbnRpYWw6YCR7dC51aWR9JHtEfSR7dC51dGlkfWAsdHlwZTpXcn19Y2F0Y2goZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiQ291bGQgbm90IHBhcnNlIGNsaWVudCBpbmZvIGZvciBDQ1MgSGVhZGVyOiAiK2UpfWVsc2Ugcj1lLmNjc0NyZWRlbnRpYWw7aWYodGhpcy5jb25maWcuc3lzdGVtT3B0aW9ucy5wcmV2ZW50Q29yc1ByZWZsaWdodCYmcilzd2l0Y2goci50eXBlKXtjYXNlIFdyOnRyeXtnbih0LGVyKHIuY3JlZGVudGlhbCkpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLnZlcmJvc2UoIkNvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXI6ICIrZSl9YnJlYWs7Y2FzZSBWcjp1bih0LHIuY3JlZGVudGlhbCl9cmV0dXJuIGUuZW1iZWRkZWRDbGllbnRJZCYmcW4odCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSksZS50b2tlbkJvZHlQYXJhbWV0ZXJzJiZFbih0LGUudG9rZW5Cb2R5UGFyYW1ldGVycyksIWUuZW5hYmxlU3BhQXV0aG9yaXphdGlvbkNvZGV8fGUudG9rZW5Cb2R5UGFyYW1ldGVycyYmZS50b2tlbkJvZHlQYXJhbWV0ZXJzW2VuXXx8RW4odCx7W2VuXToiMSJ9KSxzbih0LGUuY29ycmVsYXRpb25JZCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSx5cih0KX1jcmVhdGVMb2dvdXRVcmxRdWVyeVN0cmluZyhlKXtjb25zdCB0PW5ldyBNYXA7cmV0dXJuIGUucG9zdExvZ291dFJlZGlyZWN0VXJpJiZmdW5jdGlvbihlLHQpe2Uuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHQpfSh0LGUucG9zdExvZ291dFJlZGlyZWN0VXJpKSxlLmNvcnJlbGF0aW9uSWQmJmZuKHQsZS5jb3JyZWxhdGlvbklkKSxlLmlkVG9rZW5IaW50JiZmdW5jdGlvbihlLHQpe2Uuc2V0KCJpZF90b2tlbl9oaW50Iix0KX0odCxlLmlkVG9rZW5IaW50KSxlLnN0YXRlJiZ3bih0LGUuc3RhdGUpLGUubG9nb3V0SGludCYmZnVuY3Rpb24oZSx0KXtlLnNldCgibG9nb3V0X2hpbnQiLHQpfSh0LGUubG9nb3V0SGludCksZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyYmRW4odCxlLmV4dHJhUXVlcnlQYXJhbWV0ZXJzKSx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5pbnN0YW5jZUF3YXJlJiZibih0KSx5cih0LHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmVuY29kZUV4dHJhUXVlcnlQYXJhbXMsZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBObyBleHRlbmRzIGNve2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KX1hc3luYyBhY3F1aXJlVG9rZW4oZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW4sZS5jb3JyZWxhdGlvbklkKTtjb25zdCB0PURuKCkscj1hd2FpdCBVbih0aGlzLmV4ZWN1dGVUb2tlblJlcXVlc3QuYmluZCh0aGlzKSxPci5SZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShlLHRoaXMuYXV0aG9yaXR5KSxuPXIuaGVhZGVycz8uW0NdLG89bmV3IFBvKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLHRoaXMuY2FjaGVNYW5hZ2VyLHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5sb2dnZXIsdGhpcy5jb25maWcuc2VyaWFsaXphYmxlQ2FjaGUsdGhpcy5jb25maWcucGVyc2lzdGVuY2VQbHVnaW4pO3JldHVybiBvLnZhbGlkYXRlVG9rZW5SZXNwb25zZShyLmJvZHkpLFVuKG8uaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZS5iaW5kKG8pLE9yLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKHIuYm9keSx0aGlzLmF1dGhvcml0eSx0LGUsdm9pZCAwLHZvaWQgMCwhMCxlLmZvcmNlQ2FjaGUsbil9YXN5bmMgYWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4oZSl7aWYoIWUpdGhyb3cgSnQoX3QpO2lmKHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sZS5jb3JyZWxhdGlvbklkKSwhZS5hY2NvdW50KXRocm93IG10KEdlKTtpZih0aGlzLmNhY2hlTWFuYWdlci5pc0FwcE1ldGFkYXRhRk9DSShlLmFjY291bnQuZW52aXJvbm1lbnQpKXRyeXtyZXR1cm4gYXdhaXQgVW4odGhpcy5hY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuLmJpbmQodGhpcyksT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSwhMCl9Y2F0Y2godCl7Y29uc3Qgcj10IGluc3RhbmNlb2YgQW8mJnQuZXJyb3JDb2RlPT09bG8sbj10IGluc3RhbmNlb2Ygbm8mJnQuZXJyb3JDb2RlPT09WiYmdC5zdWJFcnJvcj09PWVlO2lmKHJ8fG4pcmV0dXJuIFVuKHRoaXMuYWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUsITEpO3Rocm93IHR9cmV0dXJuIFVuKHRoaXMuYWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUsITEpfWFzeW5jIGFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4oZSx0KXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4sZS5jb3JyZWxhdGlvbklkKTtjb25zdCByPU5uKHRoaXMuY2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMuY2FjaGVNYW5hZ2VyKSxPci5DYWNoZU1hbmFnZXJHZXRSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUuYWNjb3VudCx0LGUuY29ycmVsYXRpb25JZCx2b2lkIDAsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7aWYoIXIpdGhyb3cgU28obG8pO2lmKHIuZXhwaXJlc09uJiZCbihyLmV4cGlyZXNPbixlLnJlZnJlc2hUb2tlbkV4cGlyYXRpb25PZmZzZXRTZWNvbmRzfHwzMDApKXRocm93IHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7cnRFeHBpcmVzT25NczpOdW1iZXIoci5leHBpcmVzT24pfSxlLmNvcnJlbGF0aW9uSWQpLFNvKHVvKTtjb25zdCBuPXsuLi5lLHJlZnJlc2hUb2tlbjpyLnNlY3JldCxhdXRoZW50aWNhdGlvblNjaGVtZTplLmF1dGhlbnRpY2F0aW9uU2NoZW1lfHxXLkJFQVJFUixjY3NDcmVkZW50aWFsOntjcmVkZW50aWFsOmUuYWNjb3VudC5ob21lQWNjb3VudElkLHR5cGU6V3J9fTt0cnl7cmV0dXJuIGF3YWl0IFVuKHRoaXMuYWNxdWlyZVRva2VuLmJpbmQodGhpcyksT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShuKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgQW8mJih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRGaWVsZHMoe3J0RXhwaXJlc09uTXM6TnVtYmVyKHIuZXhwaXJlc09uKX0sZS5jb3JyZWxhdGlvbklkKSx0LnN1YkVycm9yPT09eW8pKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5XaXRoUmVmcmVzaFRva2VuOiBiYWQgcmVmcmVzaCB0b2tlbiwgcmVtb3ZpbmcgZnJvbSBjYWNoZSIpO2NvbnN0IHQ9dGhpcy5jYWNoZU1hbmFnZXIuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KHIpO3RoaXMuY2FjaGVNYW5hZ2VyLnJlbW92ZVJlZnJlc2hUb2tlbih0LGUuY29ycmVsYXRpb25JZCl9dGhyb3cgdH19YXN5bmMgZXhlY3V0ZVRva2VuUmVxdWVzdChlLHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCxlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHI9dGhpcy5jcmVhdGVUb2tlblF1ZXJ5UGFyYW1ldGVycyhlKSxuPXdyLmFwcGVuZFF1ZXJ5U3RyaW5nKHQudG9rZW5FbmRwb2ludCxyKSxvPWF3YWl0IFVuKHRoaXMuY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keS5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpLGk9dGhpcy5jcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzKGUuY2NzQ3JlZGVudGlhbCkscz1vbyh0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxlKTtyZXR1cm4gVW4odGhpcy5leGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludC5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShuLG8saSxzLGUuY29ycmVsYXRpb25JZCxPci5SZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCl9YXN5bmMgY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keShlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksZS5jb3JyZWxhdGlvbklkKTtjb25zdCB0PW5ldyBNYXA7aWYobG4odCxlLmVtYmVkZGVkQ2xpZW50SWR8fGUudG9rZW5Cb2R5UGFyYW1ldGVycz8uW0pyXXx8dGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQpLGUucmVkaXJlY3RVcmkmJmhuKHQsZS5yZWRpcmVjdFVyaSksY24odCxlLnNjb3BlcywhMCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5hdXRob3JpdHkub3B0aW9ucy5PSURDT3B0aW9ucz8uZGVmYXVsdFNjb3Blcyksa24odCxPKSxTbih0KSx5bih0LHRoaXMuY29uZmlnLmxpYnJhcnlJbmZvKSxDbih0LHRoaXMuY29uZmlnLnRlbGVtZXRyeS5hcHBsaWNhdGlvbiksT24odCksdGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyJiYhanIodGhpcy5jb25maWcpJiZNbih0LHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciksZnVuY3Rpb24oZSx0KXtlLnNldCgicmVmcmVzaF90b2tlbiIsdCl9KHQsZS5yZWZyZXNoVG9rZW4pLHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudFNlY3JldCYmSW4odCx0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRTZWNyZXQpLHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudEFzc2VydGlvbil7Y29uc3Qgcj10aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRBc3NlcnRpb247VG4odCxhd2FpdCBPbyhyLmFzc2VydGlvbix0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxlLnJlc291cmNlUmVxdWVzdFVyaSkpLEFuKHQsci5hc3NlcnRpb25UeXBlKX1pZihlLmF1dGhlbnRpY2F0aW9uU2NoZW1lPT09Vy5QT1Ape2NvbnN0IHI9bmV3IFJvKHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7bGV0IG47aWYoZS5wb3BLaWQpbj10aGlzLmNyeXB0b1V0aWxzLmVuY29kZUtpZChlLnBvcEtpZCk7ZWxzZXtuPShhd2FpdCBVbihyLmdlbmVyYXRlQ25mLmJpbmQociksT3IuUG9wVG9rZW5HZW5lcmF0ZUNuZix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSx0aGlzLmxvZ2dlcikpLnJlcUNuZlN0cmluZ31fbih0LG4pfWVsc2UgaWYoZS5hdXRoZW50aWNhdGlvblNjaGVtZT09PVcuU1NIKXtpZighZS5zc2hKd2spdGhyb3cgSnQoTHQpO1BuKHQsZS5zc2hKd2spfWlmKCghWXQuaXNFbXB0eU9iaihlLmNsYWltcyl8fHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcyYmdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aD4wKSYmbW4odCxlLmNsYWltcyx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMpLHRoaXMuY29uZmlnLnN5c3RlbU9wdGlvbnMucHJldmVudENvcnNQcmVmbGlnaHQmJmUuY2NzQ3JlZGVudGlhbClzd2l0Y2goZS5jY3NDcmVkZW50aWFsLnR5cGUpe2Nhc2UgV3I6dHJ5e2duKHQsZXIoZS5jY3NDcmVkZW50aWFsLmNyZWRlbnRpYWwpKX1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJDb3VsZCBub3QgcGFyc2UgaG9tZSBhY2NvdW50IElEIGZvciBDQ1MgSGVhZGVyOiAiK2UpfWJyZWFrO2Nhc2UgVnI6dW4odCxlLmNjc0NyZWRlbnRpYWwuY3JlZGVudGlhbCl9cmV0dXJuIGUuZW1iZWRkZWRDbGllbnRJZCYmcW4odCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSksZS50b2tlbkJvZHlQYXJhbWV0ZXJzJiZFbih0LGUudG9rZW5Cb2R5UGFyYW1ldGVycyksc24odCxlLmNvcnJlbGF0aW9uSWQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkseXIodCl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBVbyBleHRlbmRzIGNve2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KX1hc3luYyBhY3F1aXJlQ2FjaGVkVG9rZW4oZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuLGUuY29ycmVsYXRpb25JZCk7bGV0IHQ9YWU7aWYoZS5mb3JjZVJlZnJlc2h8fCF0aGlzLmNvbmZpZy5jYWNoZU9wdGlvbnMuY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZCYmIVl0LmlzRW1wdHlPYmooZS5jbGFpbXMpKXRocm93IHRoaXMuc2V0Q2FjaGVPdXRjb21lKGNlLGUuY29ycmVsYXRpb25JZCksbXQoWGUpO2lmKCFlLmFjY291bnQpdGhyb3cgbXQoR2UpO2NvbnN0IHI9ZS5hY2NvdW50LnRlbmFudElkfHxmdW5jdGlvbihlKXtjb25zdCB0PW5ldyB3cihlKS5nZXRVcmxDb21wb25lbnRzKCkscj10LlBhdGhTZWdtZW50cy5zbGljZSgtMSlbMF0/LnRvTG93ZXJDYXNlKCk7c3dpdGNoKHIpe2Nhc2UgSTpjYXNlIFQ6Y2FzZSBBOnJldHVybjtkZWZhdWx0OnJldHVybiByfX0oZS5hdXRob3JpdHkpLG49dGhpcy5jYWNoZU1hbmFnZXIuZ2V0VG9rZW5LZXlzKCksbz10aGlzLmNhY2hlTWFuYWdlci5nZXRBY2Nlc3NUb2tlbihlLmFjY291bnQsZSxuLHIpO2lmKCFvKXRocm93IHRoaXMuc2V0Q2FjaGVPdXRjb21lKGxlLGUuY29ycmVsYXRpb25JZCksbXQoWGUpO2lmKHpuKG8uY2FjaGVkQXQpfHxCbihvLmV4cGlyZXNPbix0aGlzLmNvbmZpZy5zeXN0ZW1PcHRpb25zLnRva2VuUmVuZXdhbE9mZnNldFNlY29uZHMpKXRocm93IHRoaXMuc2V0Q2FjaGVPdXRjb21lKGhlLGUuY29ycmVsYXRpb25JZCksbXQoWGUpO28ucmVmcmVzaE9uJiZCbihvLnJlZnJlc2hPbiwwKSYmKHQ9ZGUpO2NvbnN0IGk9ZS5hdXRob3JpdHl8fHRoaXMuYXV0aG9yaXR5LmdldFByZWZlcnJlZENhY2hlKCkscz17YWNjb3VudDp0aGlzLmNhY2hlTWFuYWdlci5nZXRBY2NvdW50KHRoaXMuY2FjaGVNYW5hZ2VyLmdlbmVyYXRlQWNjb3VudEtleShlLmFjY291bnQpLGUuY29ycmVsYXRpb25JZCksYWNjZXNzVG9rZW46byxpZFRva2VuOnRoaXMuY2FjaGVNYW5hZ2VyLmdldElkVG9rZW4oZS5hY2NvdW50LGUuY29ycmVsYXRpb25JZCxuLHIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkscmVmcmVzaFRva2VuOm51bGwsYXBwTWV0YWRhdGE6dGhpcy5jYWNoZU1hbmFnZXIucmVhZEFwcE1ldGFkYXRhRnJvbUNhY2hlKGkpfTtyZXR1cm4gdGhpcy5zZXRDYWNoZU91dGNvbWUodCxlLmNvcnJlbGF0aW9uSWQpLHRoaXMuY29uZmlnLnNlcnZlclRlbGVtZXRyeU1hbmFnZXImJnRoaXMuY29uZmlnLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIuaW5jcmVtZW50Q2FjaGVIaXRzKCksW2F3YWl0IFVuKHRoaXMuZ2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQuYmluZCh0aGlzKSxPci5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKHMsZSksdF19c2V0Q2FjaGVPdXRjb21lKGUsdCl7dGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyPy5zZXRDYWNoZU91dGNvbWUoZSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtjYWNoZU91dGNvbWU6ZX0sdCksZSE9PWFlJiZ0aGlzLmxvZ2dlci5pbmZvKGBUb2tlbiByZWZyZXNoIGlzIHJlcXVpcmVkIGR1ZSB0byBjYWNoZSBvdXRjb21lOiAke2V9YCl9YXN5bmMgZ2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQoZSx0KXtsZXQgcjtpZih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlNpbGVudEZsb3dDbGllbnRHZW5lcmF0ZVJlc3VsdEZyb21DYWNoZVJlY29yZCx0LmNvcnJlbGF0aW9uSWQpLGUuaWRUb2tlbiYmKHI9ZHIoZS5pZFRva2VuLnNlY3JldCx0aGlzLmNvbmZpZy5jcnlwdG9JbnRlcmZhY2UuYmFzZTY0RGVjb2RlKSksdC5tYXhBZ2V8fDA9PT10Lm1heEFnZSl7Y29uc3QgZT1yPy5hdXRoX3RpbWU7aWYoIWUpdGhyb3cgbXQoT2UpO2dyKGUsdC5tYXhBZ2UpfXJldHVybiBQby5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5hdXRob3JpdHksZSwhMCx0LHIpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgTG89e3NlbmRHZXRSZXF1ZXN0QXN5bmM6KCk9PlByb21pc2UucmVqZWN0KG10KGN0KSksc2VuZFBvc3RSZXF1ZXN0QXN5bmM6KCk9PlByb21pc2UucmVqZWN0KG10KGN0KSl9OwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiBEbyhlLHQscixuKXtjb25zdCBvPXQuY29ycmVsYXRpb25JZCxpPW5ldyBNYXA7bG4oaSx0LmVtYmVkZGVkQ2xpZW50SWR8fHQuZXh0cmFRdWVyeVBhcmFtZXRlcnM/LltKcl18fGUuY2xpZW50SWQpO2lmKGNuKGksWy4uLnQuc2NvcGVzfHxbXSwuLi50LmV4dHJhU2NvcGVzVG9Db25zZW50fHxbXV0sITAsZS5hdXRob3JpdHkub3B0aW9ucy5PSURDT3B0aW9ucz8uZGVmYXVsdFNjb3BlcyksaG4oaSx0LnJlZGlyZWN0VXJpKSxmbihpLG8pLGZ1bmN0aW9uKGUsdCl7ZS5zZXQoInJlc3BvbnNlX21vZGUiLHR8fFApfShpLHQucmVzcG9uc2VNb2RlKSxTbihpKSx0LnByb21wdCYmKCFmdW5jdGlvbihlLHQpe2Uuc2V0KCJwcm9tcHQiLHQpfShpLHQucHJvbXB0KSxuPy5hZGRGaWVsZHMoe3Byb21wdDp0LnByb21wdH0sbykpLHQuZG9tYWluSGludCYmKCFmdW5jdGlvbihlLHQpe2Uuc2V0KCJkb21haW5faGludCIsdCl9KGksdC5kb21haW5IaW50KSxuPy5hZGRGaWVsZHMoe2RvbWFpbkhpbnRGcm9tUmVxdWVzdDohMH0sbykpLHQucHJvbXB0IT09Yi5TRUxFQ1RfQUNDT1VOVClpZih0LnNpZCYmdC5wcm9tcHQ9PT1iLk5PTkUpci52ZXJib3NlKCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBQcm9tcHQgaXMgbm9uZSwgYWRkaW5nIHNpZCBmcm9tIHJlcXVlc3QiKSxwbihpLHQuc2lkKSxuPy5hZGRGaWVsZHMoe3NpZEZyb21SZXF1ZXN0OiEwfSxvKTtlbHNlIGlmKHQuYWNjb3VudCl7Y29uc3QgZT0ocz10LmFjY291bnQscy5pZFRva2VuQ2xhaW1zPy5zaWR8fG51bGwpO2xldCBhPWZ1bmN0aW9uKGUpe3JldHVybiBlLmxvZ2luSGludHx8ZS5pZFRva2VuQ2xhaW1zPy5sb2dpbl9oaW50fHxudWxsfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8odC5hY2NvdW50KTtpZihhJiZ0LmRvbWFpbkhpbnQmJihyLndhcm5pbmcoJ0F1dGhvcml6YXRpb25Db2RlQ2xpZW50LmNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6ICJkb21haW5IaW50IiBwYXJhbSBpcyBzZXQsIHNraXBwaW5nIG9wYXF1ZSAibG9naW5faGludCIgY2xhaW0uIFBsZWFzZSBjb25zaWRlciBub3QgcGFzc2luZyBkb21haW5IaW50JyksYT1udWxsKSxhKXtyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IGxvZ2luX2hpbnQgY2xhaW0gcHJlc2VudCBvbiBhY2NvdW50IiksZG4oaSxhKSxuPy5hZGRGaWVsZHMoe2xvZ2luSGludEZyb21DbGFpbTohMH0sbyk7dHJ5e2duKGksZXIodC5hY2NvdW50LmhvbWVBY2NvdW50SWQpKX1jYXRjaChlKXtyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IENvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXIiKX19ZWxzZSBpZihlJiZ0LnByb21wdD09PWIuTk9ORSl7ci52ZXJib3NlKCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBQcm9tcHQgaXMgbm9uZSwgYWRkaW5nIHNpZCBmcm9tIGFjY291bnQiKSxwbihpLGUpLG4/LmFkZEZpZWxkcyh7c2lkRnJvbUNsYWltOiEwfSxvKTt0cnl7Z24oaSxlcih0LmFjY291bnQuaG9tZUFjY291bnRJZCkpfWNhdGNoKGUpe3IudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogQ291bGQgbm90IHBhcnNlIGhvbWUgYWNjb3VudCBJRCBmb3IgQ0NTIEhlYWRlciIpfX1lbHNlIGlmKHQubG9naW5IaW50KXIudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogQWRkaW5nIGxvZ2luX2hpbnQgZnJvbSByZXF1ZXN0IiksZG4oaSx0LmxvZ2luSGludCksdW4oaSx0LmxvZ2luSGludCksbj8uYWRkRmllbGRzKHtsb2dpbkhpbnRGcm9tUmVxdWVzdDohMH0sbyk7ZWxzZSBpZih0LmFjY291bnQudXNlcm5hbWUpe3IudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogQWRkaW5nIGxvZ2luX2hpbnQgZnJvbSBhY2NvdW50IiksZG4oaSx0LmFjY291bnQudXNlcm5hbWUpLG4/LmFkZEZpZWxkcyh7bG9naW5IaW50RnJvbVVwbjohMH0sbyk7dHJ5e2duKGksZXIodC5hY2NvdW50LmhvbWVBY2NvdW50SWQpKX1jYXRjaChlKXtyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IENvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXIiKX19fWVsc2UgdC5sb2dpbkhpbnQmJihyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IE5vIGFjY291bnQsIGFkZGluZyBsb2dpbl9oaW50IGZyb20gcmVxdWVzdCIpLGRuKGksdC5sb2dpbkhpbnQpLHVuKGksdC5sb2dpbkhpbnQpLG4/LmFkZEZpZWxkcyh7bG9naW5IaW50RnJvbVJlcXVlc3Q6ITB9LG8pKTtlbHNlIHIudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogUHJvbXB0IGlzIHNlbGVjdF9hY2NvdW50LCBpZ25vcmluZyBhY2NvdW50IGhpbnRzIik7dmFyIHM7cmV0dXJuIHQubm9uY2UmJmZ1bmN0aW9uKGUsdCl7ZS5zZXQoIm5vbmNlIix0KX0oaSx0Lm5vbmNlKSx0LnN0YXRlJiZ3bihpLHQuc3RhdGUpLCh0LmNsYWltc3x8ZS5jbGllbnRDYXBhYmlsaXRpZXMmJmUuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aD4wKSYmbW4oaSx0LmNsYWltcyxlLmNsaWVudENhcGFiaWxpdGllcyksdC5lbWJlZGRlZENsaWVudElkJiZxbihpLGUuY2xpZW50SWQsZS5yZWRpcmVjdFVyaSksIWUuaW5zdGFuY2VBd2FyZXx8dC5leHRyYVF1ZXJ5UGFyYW1ldGVycyYmT2JqZWN0LmtleXModC5leHRyYVF1ZXJ5UGFyYW1ldGVycykuaW5jbHVkZXMob24pfHxibihpKSxpfWZ1bmN0aW9uIEhvKGUsdCxyLG4pe2NvbnN0IG89eXIodCxyLG4pO3JldHVybiB3ci5hcHBlbmRRdWVyeVN0cmluZyhlLmF1dGhvcml6YXRpb25FbmRwb2ludCxvKX1mdW5jdGlvbiB4byhlLHQpe2lmKCFlLnN0YXRlfHwhdCl0aHJvdyBlLnN0YXRlP210KFBlLCJDYWNoZWQgU3RhdGUiKTptdChQZSwiU2VydmVyIFN0YXRlIik7bGV0IHIsbjt0cnl7cj1kZWNvZGVVUklDb21wb25lbnQoZS5zdGF0ZSl9Y2F0Y2godCl7dGhyb3cgbXQoUmUsZS5zdGF0ZSl9dHJ5e249ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKHQpe3Rocm93IG10KFJlLGUuc3RhdGUpfWlmKHIhPT1uKXRocm93IG10KF9lKTtpZihlLmVycm9yfHxlLmVycm9yX2Rlc2NyaXB0aW9ufHxlLnN1YmVycm9yKXtjb25zdCB0PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9ImNvZGU9IixyPWUuZXJyb3JfdXJpPy5sYXN0SW5kZXhPZih0KTtyZXR1cm4gciYmcj49MD9lLmVycm9yX3VyaT8uc3Vic3RyaW5nKHIrdC5sZW5ndGgpOnZvaWQgMH0oZSk7aWYoa28oZS5lcnJvcixlLmVycm9yX2Rlc2NyaXB0aW9uLGUuc3ViZXJyb3IpKXRocm93IG5ldyBBbyhlLmVycm9yfHwiIixlLmVycm9yX2Rlc2NyaXB0aW9uLGUuc3ViZXJyb3IsZS50aW1lc3RhbXB8fCIiLGUudHJhY2VfaWR8fCIiLGUuY29ycmVsYXRpb25faWR8fCIiLGUuY2xhaW1zfHwiIix0KTt0aHJvdyBuZXcgbm8oZS5lcnJvcnx8IiIsZS5lcnJvcl9kZXNjcmlwdGlvbixlLnN1YmVycm9yLHQpfX1mdW5jdGlvbiBCbyhlKXtjb25zdHtza3VzOnQsbGlicmFyeU5hbWU6cixsaWJyYXJ5VmVyc2lvbjpuLGV4dGVuc2lvbk5hbWU6byxleHRlbnNpb25WZXJzaW9uOml9PWUscz1uZXcgTWFwKFtbMCxbcixuXV0sWzIsW28saV1dXSk7bGV0IGE9W107aWYodD8ubGVuZ3RoKXtpZihhPXQuc3BsaXQoIiwiKSxhLmxlbmd0aDw0KXJldHVybiB0fWVsc2UgYT1BcnJheS5mcm9tKHtsZW5ndGg6NH0sKCgpPT4ifCIpKTtyZXR1cm4gcy5mb3JFYWNoKCgoZSx0KT0+ezI9PT1lLmxlbmd0aCYmZVswXT8ubGVuZ3RoJiZlWzFdPy5sZW5ndGgmJmZ1bmN0aW9uKGUpe2NvbnN0e3NrdUFycjp0LGluZGV4OnIsc2t1TmFtZTpuLHNrdVZlcnNpb246b309ZTtpZihyPj10Lmxlbmd0aClyZXR1cm47dFtyXT1bbixvXS5qb2luKCJ8Iil9KHtza3VBcnI6YSxpbmRleDp0LHNrdU5hbWU6ZVswXSxza3VWZXJzaW9uOmVbMV19KX0pKSxhLmpvaW4oIiwiKX1jbGFzcyBGb3tjb25zdHJ1Y3RvcihlLHIpe3RoaXMuY2FjaGVPdXRjb21lPWFlLHRoaXMuY2FjaGVNYW5hZ2VyPXIsdGhpcy5hcGlJZD1lLmFwaUlkLHRoaXMuY29ycmVsYXRpb25JZD1lLmNvcnJlbGF0aW9uSWQsdGhpcy53cmFwcGVyU0tVPWUud3JhcHBlclNLVXx8dC5FTVBUWV9TVFJJTkcsdGhpcy53cmFwcGVyVmVyPWUud3JhcHBlclZlcnx8dC5FTVBUWV9TVFJJTkcsdGhpcy50ZWxlbWV0cnlDYWNoZUtleT1qLkNBQ0hFX0tFWStMK2UuY2xpZW50SWR9Z2VuZXJhdGVDdXJyZW50UmVxdWVzdEhlYWRlclZhbHVlKCl7Y29uc3QgZT1gJHt0aGlzLmFwaUlkfSR7ai5WQUxVRV9TRVBBUkFUT1J9JHt0aGlzLmNhY2hlT3V0Y29tZX1gLHQ9W3RoaXMud3JhcHBlclNLVSx0aGlzLndyYXBwZXJWZXJdLHI9dGhpcy5nZXROYXRpdmVCcm9rZXJFcnJvckNvZGUoKTtyPy5sZW5ndGgmJnQucHVzaChgYnJva2VyX2Vycm9yPSR7cn1gKTtjb25zdCBuPXQuam9pbihqLlZBTFVFX1NFUEFSQVRPUiksbz1bZSx0aGlzLmdldFJlZ2lvbkRpc2NvdmVyeUZpZWxkcygpXS5qb2luKGouVkFMVUVfU0VQQVJBVE9SKTtyZXR1cm5bai5TQ0hFTUFfVkVSU0lPTixvLG5dLmpvaW4oai5DQVRFR09SWV9TRVBBUkFUT1IpfWdlbmVyYXRlTGFzdFJlcXVlc3RIZWFkZXJWYWx1ZSgpe2NvbnN0IGU9dGhpcy5nZXRMYXN0UmVxdWVzdHMoKSx0PUZvLm1heEVycm9yc1RvU2VuZChlKSxyPWUuZmFpbGVkUmVxdWVzdHMuc2xpY2UoMCwyKnQpLmpvaW4oai5WQUxVRV9TRVBBUkFUT1IpLG49ZS5lcnJvcnMuc2xpY2UoMCx0KS5qb2luKGouVkFMVUVfU0VQQVJBVE9SKSxvPWUuZXJyb3JzLmxlbmd0aCxpPVtvLHQ8bz9qLk9WRVJGTE9XX1RSVUU6ai5PVkVSRkxPV19GQUxTRV0uam9pbihqLlZBTFVFX1NFUEFSQVRPUik7cmV0dXJuW2ouU0NIRU1BX1ZFUlNJT04sZS5jYWNoZUhpdHMscixuLGldLmpvaW4oai5DQVRFR09SWV9TRVBBUkFUT1IpfWNhY2hlRmFpbGVkUmVxdWVzdChlKXtjb25zdCB0PXRoaXMuZ2V0TGFzdFJlcXVlc3RzKCk7dC5lcnJvcnMubGVuZ3RoPj1qLk1BWF9DQUNIRURfRVJST1JTJiYodC5mYWlsZWRSZXF1ZXN0cy5zaGlmdCgpLHQuZmFpbGVkUmVxdWVzdHMuc2hpZnQoKSx0LmVycm9ycy5zaGlmdCgpKSx0LmZhaWxlZFJlcXVlc3RzLnB1c2godGhpcy5hcGlJZCx0aGlzLmNvcnJlbGF0aW9uSWQpLGUgaW5zdGFuY2VvZiBFcnJvciYmZSYmZS50b1N0cmluZygpP2UgaW5zdGFuY2VvZiBDZT9lLnN1YkVycm9yP3QuZXJyb3JzLnB1c2goZS5zdWJFcnJvcik6ZS5lcnJvckNvZGU/dC5lcnJvcnMucHVzaChlLmVycm9yQ29kZSk6dC5lcnJvcnMucHVzaChlLnRvU3RyaW5nKCkpOnQuZXJyb3JzLnB1c2goZS50b1N0cmluZygpKTp0LmVycm9ycy5wdXNoKGouVU5LTk9XTl9FUlJPUiksdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksdCx0aGlzLmNvcnJlbGF0aW9uSWQpfWluY3JlbWVudENhY2hlSGl0cygpe2NvbnN0IGU9dGhpcy5nZXRMYXN0UmVxdWVzdHMoKTtyZXR1cm4gZS5jYWNoZUhpdHMrPTEsdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksZSx0aGlzLmNvcnJlbGF0aW9uSWQpLGUuY2FjaGVIaXRzfWdldExhc3RSZXF1ZXN0cygpe3JldHVybiB0aGlzLmNhY2hlTWFuYWdlci5nZXRTZXJ2ZXJUZWxlbWV0cnkodGhpcy50ZWxlbWV0cnlDYWNoZUtleSl8fHtmYWlsZWRSZXF1ZXN0czpbXSxlcnJvcnM6W10sY2FjaGVIaXRzOjB9fWNsZWFyVGVsZW1ldHJ5Q2FjaGUoKXtjb25zdCBlPXRoaXMuZ2V0TGFzdFJlcXVlc3RzKCksdD1Gby5tYXhFcnJvcnNUb1NlbmQoZSk7aWYodD09PWUuZXJyb3JzLmxlbmd0aCl0aGlzLmNhY2hlTWFuYWdlci5yZW1vdmVJdGVtKHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksdGhpcy5jb3JyZWxhdGlvbklkKTtlbHNle2NvbnN0IHI9e2ZhaWxlZFJlcXVlc3RzOmUuZmFpbGVkUmVxdWVzdHMuc2xpY2UoMip0KSxlcnJvcnM6ZS5lcnJvcnMuc2xpY2UodCksY2FjaGVIaXRzOjB9O3RoaXMuY2FjaGVNYW5hZ2VyLnNldFNlcnZlclRlbGVtZXRyeSh0aGlzLnRlbGVtZXRyeUNhY2hlS2V5LHIsdGhpcy5jb3JyZWxhdGlvbklkKX19c3RhdGljIG1heEVycm9yc1RvU2VuZChlKXtsZXQgcixuPTAsbz0wO2NvbnN0IGk9ZS5lcnJvcnMubGVuZ3RoO2ZvcihyPTA7cjxpO3IrKyl7Y29uc3QgaT1lLmZhaWxlZFJlcXVlc3RzWzIqcl18fHQuRU1QVFlfU1RSSU5HLHM9ZS5mYWlsZWRSZXF1ZXN0c1syKnIrMV18fHQuRU1QVFlfU1RSSU5HLGE9ZS5lcnJvcnNbcl18fHQuRU1QVFlfU1RSSU5HO2lmKG8rPWkudG9TdHJpbmcoKS5sZW5ndGgrcy50b1N0cmluZygpLmxlbmd0aCthLmxlbmd0aCszLCEobzxqLk1BWF9MQVNUX0hFQURFUl9CWVRFUykpYnJlYWs7bis9MX1yZXR1cm4gbn1nZXRSZWdpb25EaXNjb3ZlcnlGaWVsZHMoKXtjb25zdCBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZWdpb25Vc2VkfHx0LkVNUFRZX1NUUklORyksZS5wdXNoKHRoaXMucmVnaW9uU291cmNlfHx0LkVNUFRZX1NUUklORyksZS5wdXNoKHRoaXMucmVnaW9uT3V0Y29tZXx8dC5FTVBUWV9TVFJJTkcpLGUuam9pbigiLCIpfXVwZGF0ZVJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhKGUpe3RoaXMucmVnaW9uVXNlZD1lLnJlZ2lvbl91c2VkLHRoaXMucmVnaW9uU291cmNlPWUucmVnaW9uX3NvdXJjZSx0aGlzLnJlZ2lvbk91dGNvbWU9ZS5yZWdpb25fb3V0Y29tZX1zZXRDYWNoZU91dGNvbWUoZSl7dGhpcy5jYWNoZU91dGNvbWU9ZX1zZXROYXRpdmVCcm9rZXJFcnJvckNvZGUoZSl7Y29uc3QgdD10aGlzLmdldExhc3RSZXF1ZXN0cygpO3QubmF0aXZlQnJva2VyRXJyb3JDb2RlPWUsdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksdCx0aGlzLmNvcnJlbGF0aW9uSWQpfWdldE5hdGl2ZUJyb2tlckVycm9yQ29kZSgpe3JldHVybiB0aGlzLmdldExhc3RSZXF1ZXN0cygpLm5hdGl2ZUJyb2tlckVycm9yQ29kZX1jbGVhck5hdGl2ZUJyb2tlckVycm9yQ29kZSgpe2NvbnN0IGU9dGhpcy5nZXRMYXN0UmVxdWVzdHMoKTtkZWxldGUgZS5uYXRpdmVCcm9rZXJFcnJvckNvZGUsdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksZSx0aGlzLmNvcnJlbGF0aW9uSWQpfXN0YXRpYyBtYWtlRXh0cmFTa3VTdHJpbmcoZSl7cmV0dXJuIEJvKGUpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3Qgem89Im1pc3Npbmdfa2lkX2Vycm9yIixLbz0ibWlzc2luZ19hbGdfZXJyb3IiLEdvPXtbem9dOiJUaGUgSk9TRSBIZWFkZXIgZm9yIHRoZSByZXF1ZXN0ZWQgSldULCBKV1Mgb3IgSldLIG9iamVjdCByZXF1aXJlcyBhIGtleUlkIHRvIGJlIGNvbmZpZ3VyZWQgYXMgdGhlICdraWQnIGhlYWRlciBjbGFpbS4gTm8gJ2tpZCcgdmFsdWUgd2FzIHByb3ZpZGVkLiIsW0tvXToiVGhlIEpPU0UgSGVhZGVyIGZvciB0aGUgcmVxdWVzdGVkIEpXVCwgSldTIG9yIEpXSyBvYmplY3QgcmVxdWlyZXMgYW4gYWxnb3JpdGhtIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgJ2FsZycgaGVhZGVyIGNsYWltLiBObyAnYWxnJyB2YWx1ZSB3YXMgcHJvdmlkZWQuIn07Y2xhc3MgJG8gZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5uYW1lPSJKb3NlSGVhZGVyRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCRvLnByb3RvdHlwZSl9fWZ1bmN0aW9uIFFvKGUpe3JldHVybiBuZXcgJG8oZSxHb1tlXSl9Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIGpve2NvbnN0cnVjdG9yKGUpe3RoaXMudHlwPWUudHlwLHRoaXMuYWxnPWUuYWxnLHRoaXMua2lkPWUua2lkfXN0YXRpYyBnZXRTaHJIZWFkZXJTdHJpbmcoZSl7aWYoIWUua2lkKXRocm93IFFvKHpvKTtpZighZS5hbGcpdGhyb3cgUW8oS28pO2NvbnN0IHQ9bmV3IGpvKHt0eXA6ZS50eXB8fHVlLlBvcCxraWQ6ZS5raWQsYWxnOmUuYWxnfSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gV28oZSx0LHIsbj01KXtpZihlIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGUgaW5zdGFuY2VvZiBDZT8oci5lcnJvckNvZGU9ZS5lcnJvckNvZGUsci5zdWJFcnJvckNvZGU9ZS5zdWJFcnJvcix2b2lkKChlIGluc3RhbmNlb2Ygbm98fGUgaW5zdGFuY2VvZiBBbykmJihyLnNlcnZlckVycm9yTm89ZS5lcnJvck5vKSkpOnZvaWQoZSBpbnN0YW5jZW9mIFJyP3IuZXJyb3JDb2RlPWUuZXJyb3JDb2RlOnIuZXJyb3JTdGFjaz8ubGVuZ3RoP3QudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50LmFkZEVycm9yU3RhY2s6IFN0YWNrIGFscmVhZHkgZXhpc3QiLHIuY29ycmVsYXRpb25JZCk6ZS5zdGFjaz8ubGVuZ3RoPyhlLnN0YWNrJiYoci5lcnJvclN0YWNrPWZ1bmN0aW9uKGUsdCl7aWYodDwwKXJldHVybltdO2NvbnN0IHI9ZS5zcGxpdCgiXG4iKXx8W10sbj1bXSxvPXJbMF07by5zdGFydHNXaXRoKCJUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5Iil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yOiBDYW5ub3Qgc2V0IHByb3BlcnR5Iil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yOiBDYW5ub3Qgc2V0IHByb3BlcnRpZXMgb2YiKXx8by5lbmRzV2l0aCgiaXMgbm90IGEgZnVuY3Rpb24iKT9uLnB1c2goVm8obykpOihvLnN0YXJ0c1dpdGgoIlN5bnRheEVycm9yIil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yIikpJiZuLnB1c2goVm8oby5yZXBsYWNlKC9bJ10uKlsnXXxbIl0uKlsiXS9nLCI8cmVkYWN0ZWQ+IikpKTtmb3IobGV0IGU9MTtlPHIubGVuZ3RoJiYhKG4ubGVuZ3RoPj10KTtlKyspe2NvbnN0IHQ9cltlXTtuLnB1c2goVm8odCkpfXJldHVybiBufShlLnN0YWNrLG4pKSxyLmVycm9yTmFtZT1lLm5hbWUpOnQudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50LmFkZEVycm9yU3RhY2s6IElucHV0IHN0YWNrIGlzIGVtcHR5IixyLmNvcnJlbGF0aW9uSWQpKTt0LnRyYWNlKCJQZXJmb3JtYW5jZUNsaWVudC5hZGRFcnJvclN0YWNrOiBJbnB1dCBlcnJvciBpcyBub3QgaW5zdGFuY2Ugb2YgRXJyb3IiLHIuY29ycmVsYXRpb25JZCl9ZnVuY3Rpb24gVm8oZSl7Y29uc3QgdD1lLmxhc3RJbmRleE9mKCIgIikrMTtpZih0PDEpcmV0dXJuIGU7Y29uc3Qgcj1lLnN1YnN0cmluZyh0KTtsZXQgbj1yLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIG49bjwwP3IubGFzdEluZGV4T2YoIlxcIik6bixuPj0wPyhlLnN1YnN0cmluZygwLHQpKyIoIityLnN1YnN0cmluZyhuKzEpKygiKSI9PT1yLmNoYXJBdChyLmxlbmd0aC0xKT8iIjoiKSIpKS50cmltU3RhcnQoKTplLnRyaW1TdGFydCgpfWNsYXNzIEpve2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSl7dGhpcy5hdXRob3JpdHk9dCx0aGlzLmxpYnJhcnlOYW1lPW4sdGhpcy5saWJyYXJ5VmVyc2lvbj1vLHRoaXMuYXBwbGljYXRpb25UZWxlbWV0cnk9aSx0aGlzLmNsaWVudElkPWUsdGhpcy5sb2dnZXI9cix0aGlzLmNhbGxiYWNrcz1uZXcgTWFwLHRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkPW5ldyBNYXAsdGhpcy5ldmVudFN0YWNrPW5ldyBNYXAsdGhpcy5xdWV1ZU1lYXN1cmVtZW50cz1uZXcgTWFwLHRoaXMucHJlUXVldWVUaW1lQnlDb3JyZWxhdGlvbklkPW5ldyBNYXAsdGhpcy5pbnRGaWVsZHM9c3x8bmV3IFNldDtmb3IoY29uc3QgZSBvZiBMcil0aGlzLmludEZpZWxkcy5hZGQoZSk7dGhpcy5hYmJyZXZpYXRpb25zPWF8fG5ldyBNYXA7Zm9yKGNvbnN0W2UsdF1vZiBxcil0aGlzLmFiYnJldmlhdGlvbnMuc2V0KGUsdCl9c3RhcnRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KGUsdCl7cmV0dXJue319Z2V0UHJlUXVldWVUaW1lKGUsdCl7Y29uc3Qgcj10aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5nZXQodCk7aWYocil7aWYoci5uYW1lPT09ZSlyZXR1cm4gci50aW1lO3RoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudC5nZXRQcmVRdWV1ZVRpbWU6IG5vIHByZS1xdWV1ZSB0aW1lIGZvdW5kIGZvciAke2V9LCB1bmFibGUgdG8gYWRkIHF1ZXVlIG1lYXN1cmVtZW50YCl9ZWxzZSB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQuZ2V0UHJlUXVldWVUaW1lOiBubyBwcmUtcXVldWUgdGltZXMgZm91bmQgZm9yIGNvcnJlbGF0aW9uSWQ6ICR7dH0sIHVuYWJsZSB0byBhZGQgcXVldWUgbWVhc3VyZW1lbnRgKX1jYWxjdWxhdGVRdWV1ZWRUaW1lKGUsdCl7cmV0dXJuIGU8MT8odGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBwcmVRdWV1ZVRpbWUgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbm90ICR7ZX1gKSwwKTp0PDE/KHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogY3VycmVudFRpbWUgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbm90ICR7dH1gKSwwKTp0PGU/KHRoaXMubG9nZ2VyLnRyYWNlKCJQZXJmb3JtYW5jZUNsaWVudDogY3VycmVudFRpbWUgaXMgbGVzcyB0aGFuIHByZVF1ZXVlVGltZSwgY2hlY2sgaG93IHRpbWUgaXMgYmVpbmcgcmV0cmlldmVkIiksMCk6dC1lfWFkZFF1ZXVlTWVhc3VyZW1lbnQoZSx0LHIsbil7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IGNvcnJlbGF0aW9uSWQgbm90IHByb3ZpZGVkIGZvciAke2V9LCBjYW5ub3QgYWRkIHF1ZXVlIG1lYXN1cmVtZW50YCk7aWYoMD09PXIpdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IHF1ZXVlIHRpbWUgcHJvdmlkZWQgZm9yICR7ZX0gaXMgJHtyfWApO2Vsc2UgaWYoIXIpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IG5vIHF1ZXVlIHRpbWUgcHJvdmlkZWQgZm9yICR7ZX1gKTtjb25zdCBvPXtldmVudE5hbWU6ZSxxdWV1ZVRpbWU6bj8wOnIsbWFudWFsbHlDb21wbGV0ZWQ6bn0saT10aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLmdldCh0KTtpZihpKWkucHVzaChvKSx0aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLnNldCh0LGkpO2Vsc2V7dGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IGFkZGluZyBjb3JyZWxhdGlvbklkICR7dH0gdG8gcXVldWUgbWVhc3VyZW1lbnRzYCk7Y29uc3QgZT1bb107dGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5zZXQodCxlKX10aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5kZWxldGUodCl9c3RhcnRNZWFzdXJlbWVudChlLHQpe2NvbnN0IHI9dHx8dGhpcy5nZW5lcmF0ZUlkKCk7dHx8dGhpcy5sb2dnZXIuaW5mbyhgUGVyZm9ybWFuY2VDbGllbnQ6IE5vIGNvcnJlbGF0aW9uIGlkIHByb3ZpZGVkIGZvciAke2V9LCBnZW5lcmF0aW5nYCxyKSx0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHN0YXJ0ZWQgZm9yICR7ZX1gLHIpO2NvbnN0IG49e2V2ZW50SWQ6dGhpcy5nZW5lcmF0ZUlkKCksc3RhdHVzOk5yLGF1dGhvcml0eTp0aGlzLmF1dGhvcml0eSxsaWJyYXJ5TmFtZTp0aGlzLmxpYnJhcnlOYW1lLGxpYnJhcnlWZXJzaW9uOnRoaXMubGlicmFyeVZlcnNpb24sY2xpZW50SWQ6dGhpcy5jbGllbnRJZCxuYW1lOmUsc3RhcnRUaW1lTXM6RGF0ZS5ub3coKSxjb3JyZWxhdGlvbklkOnIsYXBwTmFtZTp0aGlzLmFwcGxpY2F0aW9uVGVsZW1ldHJ5Py5hcHBOYW1lLGFwcFZlcnNpb246dGhpcy5hcHBsaWNhdGlvblRlbGVtZXRyeT8uYXBwVmVyc2lvbn07dmFyIG8saSxzO3JldHVybiB0aGlzLmNhY2hlRXZlbnRCeUNvcnJlbGF0aW9uSWQobiksbz1uLGk9dGhpcy5hYmJyZXZpYXRpb25zLChzPXRoaXMuZXZlbnRTdGFjay5nZXQocikpJiZzLnB1c2goe25hbWU6aS5nZXQoby5uYW1lKXx8by5uYW1lfSkse2VuZDooZSx0LHIpPT50aGlzLmVuZE1lYXN1cmVtZW50KHsuLi5uLC4uLmV9LHQsciksZGlzY2FyZDooKT0+dGhpcy5kaXNjYXJkTWVhc3VyZW1lbnRzKG4uY29ycmVsYXRpb25JZCksYWRkOmU9PnRoaXMuYWRkRmllbGRzKGUsbi5jb3JyZWxhdGlvbklkKSxpbmNyZW1lbnQ6ZT0+dGhpcy5pbmNyZW1lbnRGaWVsZHMoZSxuLmNvcnJlbGF0aW9uSWQpLGV2ZW50Om4sbWVhc3VyZW1lbnQ6bmV3IERyfX1lbmRNZWFzdXJlbWVudChlLHQscil7Y29uc3Qgbj10aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQoZS5jb3JyZWxhdGlvbklkKTtpZighbilyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBNZWFzdXJlbWVudCBub3QgZm91bmQgZm9yICR7ZS5ldmVudElkfWAsZS5jb3JyZWxhdGlvbklkKSxudWxsO2NvbnN0IG89ZS5ldmVudElkPT09bi5ldmVudElkO2xldCBpPXt0b3RhbFF1ZXVlVGltZTowLHRvdGFsUXVldWVDb3VudDowLG1hbnVhbGx5Q29tcGxldGVkQ291bnQ6MH07ZS5kdXJhdGlvbk1zPU1hdGgucm91bmQoZS5kdXJhdGlvbk1zfHx0aGlzLmdldER1cmF0aW9uTXMoZS5zdGFydFRpbWVNcykpO2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkoZnVuY3Rpb24oZSx0LHIsbil7aWYoIXI/Lmxlbmd0aClyZXR1cm47Y29uc3Qgbz1lPT5lLmxlbmd0aD9lW2UubGVuZ3RoLTFdOnZvaWQgMCxpPXQuZ2V0KGUubmFtZSl8fGUubmFtZSxzPW8ocik7aWYocz8ubmFtZSE9PWkpcmV0dXJuO2NvbnN0IGE9cj8ucG9wKCk7aWYoIWEpcmV0dXJuO2NvbnN0IGM9biBpbnN0YW5jZW9mIENlP24uZXJyb3JDb2RlOm4gaW5zdGFuY2VvZiBFcnJvcj9uLm5hbWU6dm9pZCAwLGw9biBpbnN0YW5jZW9mIENlP24uc3ViRXJyb3I6dm9pZCAwO2MmJmEuY2hpbGRFcnIhPT1jJiYoYS5lcnI9YyxsJiYoYS5zdWJFcnI9bCkpLGRlbGV0ZSBhLm5hbWUsZGVsZXRlIGEuY2hpbGRFcnI7Y29uc3QgaD17Li4uYSxkdXI6ZS5kdXJhdGlvbk1zfTtlLnN1Y2Nlc3N8fChoLmZhaWw9MSk7Y29uc3QgZD1vKHIpO2lmKCFkKXJldHVybntbaV06aH07bGV0IHU7aWYoYyYmKGQuY2hpbGRFcnI9YyksZFtpXSl7Y29uc3QgZT1PYmplY3Qua2V5cyhkKS5maWx0ZXIoKGU9PmUuc3RhcnRzV2l0aChpKSkpLmxlbmd0aDt1PWAke2l9XyR7ZSsxfWB9ZWxzZSB1PWk7cmV0dXJuIGRbdV09aCxkfShlLHRoaXMuYWJicmV2aWF0aW9ucyx0aGlzLmV2ZW50U3RhY2suZ2V0KG4uY29ycmVsYXRpb25JZCksdCkpO2lmKG8/KGk9dGhpcy5nZXRRdWV1ZUluZm8oZS5jb3JyZWxhdGlvbklkKSx0aGlzLmRpc2NhcmRNZWFzdXJlbWVudHMobi5jb3JyZWxhdGlvbklkKSk6bi5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzPy5kZWxldGUoZS5ldmVudElkKSx0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGVuZGVkIGZvciAke2UubmFtZX06ICR7ZS5kdXJhdGlvbk1zfSBtc2AsZS5jb3JyZWxhdGlvbklkKSx0JiZXbyh0LHRoaXMubG9nZ2VyLG4pLCFvKXJldHVybiBuW2UubmFtZSsiRHVyYXRpb25NcyJdPU1hdGguZmxvb3IoZS5kdXJhdGlvbk1zKSx7Li4ubn07byYmIXQmJihuLmVycm9yQ29kZXx8bi5zdWJFcnJvckNvZGUpJiYodGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBSZW1vdmUgZXJyb3IgYW5kIHN1Yi1lcnJvciBjb2RlcyBmb3Igcm9vdCBldmVudCAke2UubmFtZX0gYXMgaW50ZXJtZWRpYXRlIGVycm9yIHdhcyBzdWNjZXNzZnVsbHkgaGFuZGxlZGAsZS5jb3JyZWxhdGlvbklkKSxuLmVycm9yQ29kZT12b2lkIDAsbi5zdWJFcnJvckNvZGU9dm9pZCAwKTtsZXQgYT17Li4ubiwuLi5lfSxjPTA7cmV0dXJuIGEuaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50cz8uZm9yRWFjaCgodD0+e3RoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogSW5jb21wbGV0ZSBzdWJtZWFzdXJlbWVudCAke3QubmFtZX0gZm91bmQgZm9yICR7ZS5uYW1lfWAsYS5jb3JyZWxhdGlvbklkKSxjKyt9KSksYS5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzPXZvaWQgMCxhPXsuLi5hLHF1ZXVlZFRpbWVNczppLnRvdGFsUXVldWVUaW1lLHF1ZXVlZENvdW50OmkudG90YWxRdWV1ZUNvdW50LHF1ZXVlZE1hbnVhbGx5Q29tcGxldGVkQ291bnQ6aS5tYW51YWxseUNvbXBsZXRlZENvdW50LHN0YXR1czpVcixpbmNvbXBsZXRlU3Vic0NvdW50OmMsY29udGV4dDpzfSxyJiYoYS5hY2NvdW50VHlwZT1mdW5jdGlvbihlKXtjb25zdCB0PWU/LmlkVG9rZW5DbGFpbXM7cmV0dXJuIHQ/LnRmcHx8dD8uYWNyPyJCMkMiOnQ/LnRpZD8iOTE4ODA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkIj09PXQ/LnRpZD8iTVNBIjoiQUFEIjp2b2lkIDB9KHIpLGEuZGF0YUJvdW5kYXJ5PXIuZGF0YUJvdW5kYXJ5KSx0aGlzLnRydW5jYXRlSW50ZWdyYWxGaWVsZHMoYSksdGhpcy5lbWl0RXZlbnRzKFthXSxlLmNvcnJlbGF0aW9uSWQpLGF9YWRkRmllbGRzKGUsdCl7dGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBVcGRhdGluZyBzdGF0aWMgZmllbGRzIik7Y29uc3Qgcj10aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQodCk7cj90aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5zZXQodCx7Li4uciwuLi5lfSk6dGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBub3QgZm91bmQgZm9yIix0KX1pbmNyZW1lbnRGaWVsZHMoZSx0KXt0aGlzLmxvZ2dlci50cmFjZSgiUGVyZm9ybWFuY2VDbGllbnQ6IFVwZGF0aW5nIGNvdW50ZXJzIik7Y29uc3Qgcj10aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQodCk7aWYocilmb3IoY29uc3QgdCBpbiBlKXtpZihyLmhhc093blByb3BlcnR5KHQpKXtpZihpc05hTihOdW1iZXIoclt0XSkpKXJldHVybn1lbHNlIHJbdF09MDtyW3RdKz1lW3RdfWVsc2UgdGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBub3QgZm91bmQgZm9yIix0KX1jYWNoZUV2ZW50QnlDb3JyZWxhdGlvbklkKGUpe2NvbnN0IHQ9dGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuZ2V0KGUuY29ycmVsYXRpb25JZCk7dD8odGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmb3IgJHtlLm5hbWV9IGFkZGVkL3VwZGF0ZWRgLGUuY29ycmVsYXRpb25JZCksdC5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzPXQuaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50c3x8bmV3IE1hcCx0LmluY29tcGxldGVTdWJNZWFzdXJlbWVudHMuc2V0KGUuZXZlbnRJZCx7bmFtZTplLm5hbWUsc3RhcnRUaW1lTXM6ZS5zdGFydFRpbWVNc30pKToodGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmb3IgJHtlLm5hbWV9IHN0YXJ0ZWRgLGUuY29ycmVsYXRpb25JZCksdGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuc2V0KGUuY29ycmVsYXRpb25JZCx7Li4uZX0pLHRoaXMuZXZlbnRTdGFjay5zZXQoZS5jb3JyZWxhdGlvbklkLFtdKSl9Z2V0UXVldWVJbmZvKGUpe2NvbnN0IHQ9dGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5nZXQoZSk7dHx8dGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBubyBxdWV1ZSBtZWFzdXJlbWVudHMgZm91bmQgZm9yIGZvciBjb3JyZWxhdGlvbklkOiAke2V9YCk7bGV0IHI9MCxuPTAsbz0wO3JldHVybiB0Py5mb3JFYWNoKChlPT57cis9ZS5xdWV1ZVRpbWUsbisrLG8rPWUubWFudWFsbHlDb21wbGV0ZWQ/MTowfSkpLHt0b3RhbFF1ZXVlVGltZTpyLHRvdGFsUXVldWVDb3VudDpuLG1hbnVhbGx5Q29tcGxldGVkQ291bnQ6b319ZGlzY2FyZE1lYXN1cmVtZW50cyhlKXt0aGlzLmxvZ2dlci50cmFjZSgiUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyBkaXNjYXJkZWQiLGUpLHRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkLmRlbGV0ZShlKSx0aGlzLmxvZ2dlci50cmFjZSgiUGVyZm9ybWFuY2VDbGllbnQ6IFF1ZXVlTWVhc3VyZW1lbnRzIGRpc2NhcmRlZCIsZSksdGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5kZWxldGUoZSksdGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBQcmUtcXVldWUgdGltZXMgZGlzY2FyZGVkIixlKSx0aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5kZWxldGUoZSksdGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBzdGFjayBkaXNjYXJkZWQiLGUpLHRoaXMuZXZlbnRTdGFjay5kZWxldGUoZSl9YWRkUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtmb3IoY29uc3RbdCxyXW9mIHRoaXMuY2FsbGJhY2tzKWlmKHIudG9TdHJpbmcoKT09PWUudG9TdHJpbmcoKSlyZXR1cm4gdGhpcy5sb2dnZXIud2FybmluZyhgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIGNhbGxiYWNrIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIGlkOiAke3R9YCksdDtjb25zdCB0PXRoaXMuZ2VuZXJhdGVJZCgpO3JldHVybiB0aGlzLmNhbGxiYWNrcy5zZXQodCxlKSx0aGlzLmxvZ2dlci52ZXJib3NlKGBQZXJmb3JtYW5jZUNsaWVudDogUGVyZm9ybWFuY2UgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGlkOiAke3R9YCksdH1yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpe2NvbnN0IHQ9dGhpcy5jYWxsYmFja3MuZGVsZXRlKGUpO3JldHVybiB0P3RoaXMubG9nZ2VyLnZlcmJvc2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBjYWxsYmFjayAke2V9IHJlbW92ZWQuYCk6dGhpcy5sb2dnZXIudmVyYm9zZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIGNhbGxiYWNrICR7ZX0gbm90IHJlbW92ZWQuYCksdH1lbWl0RXZlbnRzKGUsdCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiUGVyZm9ybWFuY2VDbGllbnQ6IEVtaXR0aW5nIHBlcmZvcm1hbmNlIGV2ZW50cyIsdCksdGhpcy5jYWxsYmFja3MuZm9yRWFjaCgoKHIsbik9Pnt0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IEVtaXR0aW5nIGV2ZW50IHRvIGNhbGxiYWNrICR7bn1gLHQpLHIuYXBwbHkobnVsbCxbZV0pfSkpfXRydW5jYXRlSW50ZWdyYWxGaWVsZHMoZSl7dGhpcy5pbnRGaWVsZHMuZm9yRWFjaCgodD0+e3QgaW4gZSYmIm51bWJlciI9PXR5cGVvZiBlW3RdJiYoZVt0XT1NYXRoLmZsb29yKGVbdF0pKX0pKX1nZXREdXJhdGlvbk1zKGUpe2NvbnN0IHQ9RGF0ZS5ub3coKS1lO3JldHVybiB0PDA/dDowfX1jb25zdCBZbz0icGtjZV9ub3RfY3JlYXRlZCIsWG89ImVhcl9qd2tfZW1wdHkiLFpvPSJlYXJfandlX2VtcHR5IixlaT0iY3J5cHRvX25vbmV4aXN0ZW50Iix0aT0iZW1wdHlfbmF2aWdhdGVfdXJpIixyaT0iaGFzaF9lbXB0eV9lcnJvciIsbmk9Im5vX3N0YXRlX2luX2hhc2giLG9pPSJoYXNoX2RvZXNfbm90X2NvbnRhaW5fa25vd25fcHJvcGVydGllcyIsaWk9InVuYWJsZV90b19wYXJzZV9zdGF0ZSIsc2k9InN0YXRlX2ludGVyYWN0aW9uX3R5cGVfbWlzbWF0Y2giLGFpPSJpbnRlcmFjdGlvbl9pbl9wcm9ncmVzcyIsY2k9InBvcHVwX3dpbmRvd19lcnJvciIsbGk9ImVtcHR5X3dpbmRvd19lcnJvciIsaGk9InVzZXJfY2FuY2VsbGVkIixkaT0ibW9uaXRvcl9wb3B1cF90aW1lb3V0Iix1aT0ibW9uaXRvcl93aW5kb3dfdGltZW91dCIsZ2k9InJlZGlyZWN0X2luX2lmcmFtZSIscGk9ImJsb2NrX2lmcmFtZV9yZWxvYWQiLG1pPSJibG9ja19uZXN0ZWRfcG9wdXBzIixmaT0iaWZyYW1lX2Nsb3NlZF9wcmVtYXR1cmVseSIseWk9InNpbGVudF9sb2dvdXRfdW5zdXBwb3J0ZWQiLENpPSJub19hY2NvdW50X2Vycm9yIix3aT0ic2lsZW50X3Byb21wdF92YWx1ZV9lcnJvciIsdmk9Im5vX3Rva2VuX3JlcXVlc3RfY2FjaGVfZXJyb3IiLElpPSJ1bmFibGVfdG9fcGFyc2VfdG9rZW5fcmVxdWVzdF9jYWNoZV9lcnJvciIsVGk9ImF1dGhfcmVxdWVzdF9ub3Rfc2V0X2Vycm9yIixBaT0iaW52YWxpZF9jYWNoZV90eXBlIixraT0ibm9uX2Jyb3dzZXJfZW52aXJvbm1lbnQiLFNpPSJkYXRhYmFzZV9ub3Rfb3BlbiIsYmk9Im5vX25ldHdvcmtfY29ubmVjdGl2aXR5IixFaT0icG9zdF9yZXF1ZXN0X2ZhaWxlZCIsUmk9ImdldF9yZXF1ZXN0X2ZhaWxlZCIsX2k9ImZhaWxlZF90b19wYXJzZV9yZXNwb25zZSIsUGk9InVuYWJsZV90b19sb2FkX3Rva2VuIixNaT0iY3J5cHRvX2tleV9ub3RfZm91bmQiLE9pPSJhdXRoX2NvZGVfcmVxdWlyZWQiLHFpPSJhdXRoX2NvZGVfb3JfbmF0aXZlQWNjb3VudElkX3JlcXVpcmVkIixOaT0ic3BhX2NvZGVfYW5kX25hdGl2ZUFjY291bnRJZF9wcmVzZW50IixVaT0iZGF0YWJhc2VfdW5hdmFpbGFibGUiLExpPSJ1bmFibGVfdG9fYWNxdWlyZV90b2tlbl9mcm9tX25hdGl2ZV9wbGF0Zm9ybSIsRGk9Im5hdGl2ZV9oYW5kc2hha2VfdGltZW91dCIsSGk9Im5hdGl2ZV9leHRlbnNpb25fbm90X2luc3RhbGxlZCIseGk9Im5hdGl2ZV9jb25uZWN0aW9uX25vdF9lc3RhYmxpc2hlZCIsQmk9InVuaW5pdGlhbGl6ZWRfcHVibGljX2NsaWVudF9hcHBsaWNhdGlvbiIsRmk9Im5hdGl2ZV9wcm9tcHRfbm90X3N1cHBvcnRlZCIsemk9ImludmFsaWRfYmFzZTY0X3N0cmluZyIsS2k9ImludmFsaWRfcG9wX3Rva2VuX3JlcXVlc3QiLEdpPSJmYWlsZWRfdG9fYnVpbGRfaGVhZGVycyIsJGk9ImZhaWxlZF90b19wYXJzZV9oZWFkZXJzIixRaT0iZmFpbGVkX3RvX2RlY3J5cHRfZWFyX3Jlc3BvbnNlIixqaT0idGltZWRfb3V0Ijt2YXIgV2k9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYXV0aENvZGVPck5hdGl2ZUFjY291bnRJZFJlcXVpcmVkOnFpLGF1dGhDb2RlUmVxdWlyZWQ6T2ksYXV0aFJlcXVlc3ROb3RTZXRFcnJvcjpUaSxibG9ja0lmcmFtZVJlbG9hZDpwaSxibG9ja05lc3RlZFBvcHVwczptaSxjcnlwdG9LZXlOb3RGb3VuZDpNaSxjcnlwdG9Ob25FeGlzdGVudDplaSxkYXRhYmFzZU5vdE9wZW46U2ksZGF0YWJhc2VVbmF2YWlsYWJsZTpVaSxlYXJKd2VFbXB0eTpabyxlYXJKd2tFbXB0eTpYbyxlbXB0eU5hdmlnYXRlVXJpOnRpLGVtcHR5V2luZG93RXJyb3I6bGksZmFpbGVkVG9CdWlsZEhlYWRlcnM6R2ksZmFpbGVkVG9EZWNyeXB0RWFyUmVzcG9uc2U6UWksZmFpbGVkVG9QYXJzZUhlYWRlcnM6JGksZmFpbGVkVG9QYXJzZVJlc3BvbnNlOl9pLGdldFJlcXVlc3RGYWlsZWQ6UmksaGFzaERvZXNOb3RDb250YWluS25vd25Qcm9wZXJ0aWVzOm9pLGhhc2hFbXB0eUVycm9yOnJpLGlmcmFtZUNsb3NlZFByZW1hdHVyZWx5OmZpLGludGVyYWN0aW9uSW5Qcm9ncmVzczphaSxpbnZhbGlkQmFzZTY0U3RyaW5nOnppLGludmFsaWRDYWNoZVR5cGU6QWksaW52YWxpZFBvcFRva2VuUmVxdWVzdDpLaSxtb25pdG9yUG9wdXBUaW1lb3V0OmRpLG1vbml0b3JXaW5kb3dUaW1lb3V0OnVpLG5hdGl2ZUNvbm5lY3Rpb25Ob3RFc3RhYmxpc2hlZDp4aSxuYXRpdmVFeHRlbnNpb25Ob3RJbnN0YWxsZWQ6SGksbmF0aXZlSGFuZHNoYWtlVGltZW91dDpEaSxuYXRpdmVQcm9tcHROb3RTdXBwb3J0ZWQ6Rmksbm9BY2NvdW50RXJyb3I6Q2ksbm9OZXR3b3JrQ29ubmVjdGl2aXR5OmJpLG5vU3RhdGVJbkhhc2g6bmksbm9Ub2tlblJlcXVlc3RDYWNoZUVycm9yOnZpLG5vbkJyb3dzZXJFbnZpcm9ubWVudDpraSxwa2NlTm90Q3JlYXRlZDpZbyxwb3B1cFdpbmRvd0Vycm9yOmNpLHBvc3RSZXF1ZXN0RmFpbGVkOkVpLHJlZGlyZWN0SW5JZnJhbWU6Z2ksc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWQ6eWksc2lsZW50UHJvbXB0VmFsdWVFcnJvcjp3aSxzcGFDb2RlQW5kTmF0aXZlQWNjb3VudElkUHJlc2VudDpOaSxzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoOnNpLHRpbWVkT3V0OmppLHVuYWJsZVRvQWNxdWlyZVRva2VuRnJvbU5hdGl2ZVBsYXRmb3JtOkxpLHVuYWJsZVRvTG9hZFRva2VuOlBpLHVuYWJsZVRvUGFyc2VTdGF0ZTppaSx1bmFibGVUb1BhcnNlVG9rZW5SZXF1ZXN0Q2FjaGVFcnJvcjpJaSx1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb246QmksdXNlckNhbmNlbGxlZDpoaX0pO2NvbnN0IFZpPSJGb3IgbW9yZSB2aXNpdDogYWthLm1zL21zYWxqcy9icm93c2VyLWVycm9ycyIsSmk9e1tZb106IlRoZSBQS0NFIGNvZGUgY2hhbGxlbmdlIGFuZCB2ZXJpZmllciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLiIsW1hvXToiTm8gRUFSIGVuY3J5cHRpb24ga2V5IHByb3ZpZGVkLiBUaGlzIGlzIHVuZXhwZWN0ZWQuIixbWm9dOiJTZXJ2ZXIgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBlYXJfandlIHByb3BlcnR5LiBUaGlzIGlzIHVuZXhwZWN0ZWQuIixbZWldOiJUaGUgY3J5cHRvIG9iamVjdCBvciBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiIsW3RpXToiTmF2aWdhdGlvbiBVUkkgaXMgZW1wdHkuIFBsZWFzZSBjaGVjayBzdGFjayB0cmFjZSBmb3IgbW9yZSBpbmZvLiIsW3JpXTpgSGFzaCB2YWx1ZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2UgaXQgaXMgZW1wdHkuIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIHJlZGlyZWN0VXJpIGlzIG5vdCBjbGVhcmluZyB0aGUgaGFzaC4gJHtWaX1gLFtuaV06Ikhhc2ggZG9lcyBub3QgY29udGFpbiBzdGF0ZS4gUGxlYXNlIHZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQgZnJvbSBtc2FsLiIsW29pXTpgSGFzaCBkb2VzIG5vdCBjb250YWluIGtub3duIHByb3Blcml0ZXMuIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIHJlZGlyZWN0VXJpIGlzIG5vdCBjaGFuZ2luZyB0aGUgaGFzaC4gICR7Vml9YCxbaWldOiJVbmFibGUgdG8gcGFyc2Ugc3RhdGUuIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gbXNhbC4iLFtzaV06Ikhhc2ggY29udGFpbnMgc3RhdGUgYnV0IHRoZSBpbnRlcmFjdGlvbiB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxsZXIuIixbYWldOmBJbnRlcmFjdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuIFBsZWFzZSBlbnN1cmUgdGhhdCB0aGlzIGludGVyYWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyBhbiBpbnRlcmFjdGl2ZSBBUEkuICAgJHtWaX1gLFtjaV06IkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93LiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBJRSBvciBpZiBwb3B1cHMgYXJlIGJsb2NrZWQgaW4gdGhlIGJyb3dzZXIuIixbbGldOiJ3aW5kb3cub3BlbiByZXR1cm5lZCBudWxsIG9yIHVuZGVmaW5lZCB3aW5kb3cgb2JqZWN0LiIsW2hpXToiVXNlciBjYW5jZWxsZWQgdGhlIGZsb3cuIixbZGldOmBUb2tlbiBhY3F1aXNpdGlvbiBpbiBwb3B1cCBmYWlsZWQgZHVlIHRvIHRpbWVvdXQuICAke1ZpfWAsW3VpXTpgVG9rZW4gYWNxdWlzaXRpb24gaW4gaWZyYW1lIGZhaWxlZCBkdWUgdG8gdGltZW91dC4gICR7Vml9YCxbZ2ldOiJSZWRpcmVjdHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGlmcmFtZWQgb3IgYnJva2VyZWQgYXBwbGljYXRpb25zLiBQbGVhc2UgZW5zdXJlIHlvdSBhcmUgdXNpbmcgTVNBTC5qcyBpbiBhIHRvcCBmcmFtZSBvZiB0aGUgd2luZG93IGlmIHVzaW5nIHRoZSByZWRpcmVjdCBBUElzLCBvciB1c2UgdGhlIHBvcHVwIEFQSXMuIixbcGldOmBSZXF1ZXN0IHdhcyBibG9ja2VkIGluc2lkZSBhbiBpZnJhbWUgYmVjYXVzZSBNU0FMIGRldGVjdGVkIGFuIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlLiAgJHtWaX1gLFttaV06IlJlcXVlc3Qgd2FzIGJsb2NrZWQgaW5zaWRlIGEgcG9wdXAgYmVjYXVzZSBNU0FMIGRldGVjdGVkIGl0IHdhcyBydW5uaW5nIGluIGEgcG9wdXAuIixbZmldOiJUaGUgaWZyYW1lIGJlaW5nIG1vbml0b3JlZCB3YXMgY2xvc2VkIHByZW1hdHVyZWx5LiIsW3lpXToiU2lsZW50IGxvZ291dCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgY2FsbCBsb2dvdXRSZWRpcmVjdCBvciBsb2dvdXRQb3B1cCBpbnN0ZWFkLiIsW0NpXToiTm8gYWNjb3VudCBvYmplY3QgcHJvdmlkZWQgdG8gYWNxdWlyZVRva2VuU2lsZW50IGFuZCBubyBhY3RpdmUgYWNjb3VudCBoYXMgYmVlbiBzZXQuIFBsZWFzZSBjYWxsIHNldEFjdGl2ZUFjY291bnQgb3IgcHJvdmlkZSBhbiBhY2NvdW50IG9uIHRoZSByZXF1ZXN0LiIsW3dpXToiVGhlIHZhbHVlIGdpdmVuIGZvciB0aGUgcHJvbXB0IHZhbHVlIGlzIG5vdCB2YWxpZCBmb3Igc2lsZW50IHJlcXVlc3RzIC0gbXVzdCBiZSBzZXQgdG8gJ25vbmUnIG9yICdub19zZXNzaW9uJy4iLFt2aV06Ik5vIHRva2VuIHJlcXVlc3QgZm91bmQgaW4gY2FjaGUuIixbSWldOiJUaGUgY2FjaGVkIHRva2VuIHJlcXVlc3QgY291bGQgbm90IGJlIHBhcnNlZC4iLFtUaV06IkF1dGggUmVxdWVzdCBub3Qgc2V0LiBQbGVhc2UgZW5zdXJlIGluaXRpYXRlQXV0aFJlcXVlc3Qgd2FzIGNhbGxlZCBmcm9tIHRoZSBJbnRlcmFjdGlvbkhhbmRsZXIiLFtBaV06IkludmFsaWQgY2FjaGUgdHlwZSIsW2tpXToiTG9naW4gYW5kIHRva2VuIHJlcXVlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy4iLFtTaV06IkRhdGFiYXNlIGlzIG5vdCBvcGVuISIsW2JpXToiTm8gbmV0d29yayBjb25uZWN0aXZpdHkuIENoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4iLFtFaV06Ik5ldHdvcmsgcmVxdWVzdCBmYWlsZWQ6IElmIHRoZSBicm93c2VyIHRocmV3IGEgQ09SUyBlcnJvciwgY2hlY2sgdGhhdCB0aGUgcmVkaXJlY3RVcmkgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgQXp1cmUgQXBwIFBvcnRhbCBhcyB0eXBlICdTUEEnIixbUmldOiJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkLiBQbGVhc2UgY2hlY2sgdGhlIG5ldHdvcmsgdHJhY2UgdG8gZGV0ZXJtaW5lIHJvb3QgY2F1c2UuIixbX2ldOiJGYWlsZWQgdG8gcGFyc2UgbmV0d29yayByZXNwb25zZS4gQ2hlY2sgbmV0d29yayB0cmFjZS4iLFtQaV06IkVycm9yIGxvYWRpbmcgdG9rZW4gdG8gY2FjaGUuIixbTWldOiJDcnlwdG9ncmFwaGljIEtleSBvciBLZXlwYWlyIG5vdCBmb3VuZCBpbiBicm93c2VyIHN0b3JhZ2UuIixbT2ldOiJBbiBhdXRob3JpemF0aW9uIGNvZGUgbXVzdCBiZSBwcm92aWRlZCAoYXMgdGhlIGBjb2RlYCBwcm9wZXJ0eSBvbiB0aGUgcmVxdWVzdCkgdG8gdGhpcyBmbG93LiIsW3FpXToiQW4gYXV0aG9yaXphdGlvbiBjb2RlIG9yIG5hdGl2ZUFjY291bnRJZCBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoaXMgZmxvdy4iLFtOaV06IlJlcXVlc3QgY2Fubm90IGNvbnRhaW4gYm90aCBzcGEgY29kZSBhbmQgbmF0aXZlIGFjY291bnQgaWQuIixbVWldOiJJbmRleGVkREIsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwZXJzaXN0ZW50IGNyeXB0b2dyYXBoaWMga2V5IHN0b3JhZ2UsIGlzIHVuYXZhaWxhYmxlLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYnJvd3NlciBwcml2YWN5IGZlYXR1cmVzIHdoaWNoIGJsb2NrIHBlcnNpc3RlbnQgc3RvcmFnZSBpbiB0aGlyZC1wYXJ0eSBjb250ZXh0cy4iLFtMaV06YFVuYWJsZSB0byBhY3F1aXJlIHRva2VuIGZyb20gbmF0aXZlIHBsYXRmb3JtLiAgJHtWaX1gLFtEaV06IlRpbWVkIG91dCB3aGlsZSBhdHRlbXB0aW5nIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIGJyb3dzZXIgZXh0ZW5zaW9uIixbSGldOiJOYXRpdmUgZXh0ZW5zaW9uIGlzIG5vdCBpbnN0YWxsZWQuIElmIHlvdSB0aGluayB0aGlzIGlzIGEgbWlzdGFrZSBjYWxsIHRoZSBpbml0aWFsaXplIGZ1bmN0aW9uLiIsW3hpXTpgQ29ubmVjdGlvbiB0byBuYXRpdmUgcGxhdGZvcm0gaGFzIG5vdCBiZWVuIGVzdGFibGlzaGVkLiBQbGVhc2UgaW5zdGFsbCBhIGNvbXBhdGlibGUgYnJvd3NlciBleHRlbnNpb24gYW5kIHJ1biBpbml0aWFsaXplKCkuICAke1ZpfWAsW0JpXTpgWW91IG11c3QgY2FsbCBhbmQgYXdhaXQgdGhlIGluaXRpYWxpemUgZnVuY3Rpb24gYmVmb3JlIGF0dGVtcHRpbmcgdG8gY2FsbCBhbnkgb3RoZXIgTVNBTCBBUEkuICAke1ZpfWAsW0ZpXToiVGhlIHByb3ZpZGVkIHByb21wdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuYXRpdmUgcGxhdGZvcm0uIFRoaXMgcmVxdWVzdCBzaG91bGQgYmUgcm91dGVkIHRvIHRoZSB3ZWIgYmFzZWQgZmxvdy4iLFt6aV06IkludmFsaWQgYmFzZTY0IGVuY29kZWQgc3RyaW5nLiIsW0tpXToiSW52YWxpZCBQb1AgdG9rZW4gcmVxdWVzdC4gVGhlIHJlcXVlc3Qgc2hvdWxkIG5vdCBoYXZlIGJvdGggYSBwb3BLaWQgdmFsdWUgYW5kIHNpZ25Qb3BUb2tlbiBzZXQgdG8gdHJ1ZS4iLFtHaV06IkZhaWxlZCB0byBidWlsZCByZXF1ZXN0IGhlYWRlcnMgb2JqZWN0LiIsWyRpXToiRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGhlYWRlcnMiLFtRaV06IkZhaWxlZCB0byBkZWNyeXB0IGVhciByZXNwb25zZSIsW2ppXToiVGhlIHJlcXVlc3QgdGltZWQgb3V0LiJ9LFlpPXtwa2NlTm90R2VuZXJhdGVkOntjb2RlOllvLGRlc2M6SmlbWW9dfSxjcnlwdG9Eb2VzTm90RXhpc3Q6e2NvZGU6ZWksZGVzYzpKaVtlaV19LGVtcHR5TmF2aWdhdGVVcmlFcnJvcjp7Y29kZTp0aSxkZXNjOkppW3RpXX0saGFzaEVtcHR5RXJyb3I6e2NvZGU6cmksZGVzYzpKaVtyaV19LGhhc2hEb2VzTm90Q29udGFpblN0YXRlRXJyb3I6e2NvZGU6bmksZGVzYzpKaVtuaV19LGhhc2hEb2VzTm90Q29udGFpbktub3duUHJvcGVydGllc0Vycm9yOntjb2RlOm9pLGRlc2M6Smlbb2ldfSx1bmFibGVUb1BhcnNlU3RhdGVFcnJvcjp7Y29kZTppaSxkZXNjOkppW2lpXX0sc3RhdGVJbnRlcmFjdGlvblR5cGVNaXNtYXRjaEVycm9yOntjb2RlOnNpLGRlc2M6Smlbc2ldfSxpbnRlcmFjdGlvbkluUHJvZ3Jlc3M6e2NvZGU6YWksZGVzYzpKaVthaV19LHBvcHVwV2luZG93RXJyb3I6e2NvZGU6Y2ksZGVzYzpKaVtjaV19LGVtcHR5V2luZG93RXJyb3I6e2NvZGU6bGksZGVzYzpKaVtsaV19LHVzZXJDYW5jZWxsZWRFcnJvcjp7Y29kZTpoaSxkZXNjOkppW2hpXX0sbW9uaXRvclBvcHVwVGltZW91dEVycm9yOntjb2RlOmRpLGRlc2M6SmlbZGldfSxtb25pdG9ySWZyYW1lVGltZW91dEVycm9yOntjb2RlOnVpLGRlc2M6SmlbdWldfSxyZWRpcmVjdEluSWZyYW1lRXJyb3I6e2NvZGU6Z2ksZGVzYzpKaVtnaV19LGJsb2NrVG9rZW5SZXF1ZXN0c0luSGlkZGVuSWZyYW1lRXJyb3I6e2NvZGU6cGksZGVzYzpKaVtwaV19LGJsb2NrQWNxdWlyZVRva2VuSW5Qb3B1cHNFcnJvcjp7Y29kZTptaSxkZXNjOkppW21pXX0saWZyYW1lQ2xvc2VkUHJlbWF0dXJlbHlFcnJvcjp7Y29kZTpmaSxkZXNjOkppW2ZpXX0sc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWRFcnJvcjp7Y29kZTp5aSxkZXNjOkppW3lpXX0sbm9BY2NvdW50RXJyb3I6e2NvZGU6Q2ksZGVzYzpKaVtDaV19LHNpbGVudFByb21wdFZhbHVlRXJyb3I6e2NvZGU6d2ksZGVzYzpKaVt3aV19LG5vVG9rZW5SZXF1ZXN0Q2FjaGVFcnJvcjp7Y29kZTp2aSxkZXNjOkppW3ZpXX0sdW5hYmxlVG9QYXJzZVRva2VuUmVxdWVzdENhY2hlRXJyb3I6e2NvZGU6SWksZGVzYzpKaVtJaV19LGF1dGhSZXF1ZXN0Tm90U2V0Ontjb2RlOlRpLGRlc2M6SmlbVGldfSxpbnZhbGlkQ2FjaGVUeXBlOntjb2RlOkFpLGRlc2M6SmlbQWldfSxub3RJbkJyb3dzZXJFbnZpcm9ubWVudDp7Y29kZTpraSxkZXNjOkppW2tpXX0sZGF0YWJhc2VOb3RPcGVuOntjb2RlOlNpLGRlc2M6SmlbU2ldfSxub05ldHdvcmtDb25uZWN0aXZpdHk6e2NvZGU6YmksZGVzYzpKaVtiaV19LHBvc3RSZXF1ZXN0RmFpbGVkOntjb2RlOkVpLGRlc2M6SmlbRWldfSxnZXRSZXF1ZXN0RmFpbGVkOntjb2RlOlJpLGRlc2M6SmlbUmldfSxmYWlsZWRUb1BhcnNlTmV0d29ya1Jlc3BvbnNlOntjb2RlOl9pLGRlc2M6SmlbX2ldfSx1bmFibGVUb0xvYWRUb2tlbkVycm9yOntjb2RlOlBpLGRlc2M6SmlbUGldfSxzaWduaW5nS2V5Tm90Rm91bmRJblN0b3JhZ2U6e2NvZGU6TWksZGVzYzpKaVtNaV19LGF1dGhDb2RlUmVxdWlyZWQ6e2NvZGU6T2ksZGVzYzpKaVtPaV19LGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50UmVxdWlyZWQ6e2NvZGU6cWksZGVzYzpKaVtxaV19LHNwYUNvZGVBbmROYXRpdmVBY2NvdW50UHJlc2VudDp7Y29kZTpOaSxkZXNjOkppW05pXX0sZGF0YWJhc2VVbmF2YWlsYWJsZTp7Y29kZTpVaSxkZXNjOkppW1VpXX0sdW5hYmxlVG9BY3F1aXJlVG9rZW5Gcm9tTmF0aXZlUGxhdGZvcm06e2NvZGU6TGksZGVzYzpKaVtMaV19LG5hdGl2ZUhhbmRzaGFrZVRpbWVvdXQ6e2NvZGU6RGksZGVzYzpKaVtEaV19LG5hdGl2ZUV4dGVuc2lvbk5vdEluc3RhbGxlZDp7Y29kZTpIaSxkZXNjOkppW0hpXX0sbmF0aXZlQ29ubmVjdGlvbk5vdEVzdGFibGlzaGVkOntjb2RlOnhpLGRlc2M6SmlbeGldfSx1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb246e2NvZGU6QmksZGVzYzpKaVtCaV19LG5hdGl2ZVByb21wdE5vdFN1cHBvcnRlZDp7Y29kZTpGaSxkZXNjOkppW0ZpXX0saW52YWxpZEJhc2U2NFN0cmluZ0Vycm9yOntjb2RlOnppLGRlc2M6SmlbemldfSxpbnZhbGlkUG9wVG9rZW5SZXF1ZXN0Ontjb2RlOktpLGRlc2M6SmlbS2ldfX07Y2xhc3MgWGkgZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsSmlbZV0sdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsWGkucHJvdG90eXBlKSx0aGlzLm5hbWU9IkJyb3dzZXJBdXRoRXJyb3IifX1mdW5jdGlvbiBaaShlLHQpe3JldHVybiBuZXcgWGkoZSx0KX1jb25zdCBlcz0iaW52YWxpZF9ncmFudCIsdHM9NDgzLHJzPTYwMCxucz0ibXNhbCIsb3M9MzAsaXM9Im1zYWwuanMuYnJvd3NlciIsc3M9IjUzZWUyODRkLTkyMGEtNGI1OS05ZDMwLWE2MDMxNWIyNjgzNiIsYXM9InBwbmJucGVvbGdraWNnZWdrYmtiam1obGlkZW9waWppIixjcz0iTUFUUyIsbHM9Ik1pY3Jvc29mdEVudHJhIixocz0iRE9NIEFQSSIsZHM9ImdldC10b2tlbi1hbmQtc2lnbi1vdXQiLHVzPSJQbGF0Zm9ybUF1dGhET01IYW5kbGVyIixncz0iUGxhdGZvcm1BdXRoRXh0ZW5zaW9uSGFuZGxlciIscHM9IkhhbmRzaGFrZSIsbXM9IkhhbmRzaGFrZVJlc3BvbnNlIixmcz0iR2V0VG9rZW4iLHlzPSJSZXNwb25zZSIsQ3M9e0xvY2FsU3RvcmFnZToibG9jYWxTdG9yYWdlIixTZXNzaW9uU3RvcmFnZToic2Vzc2lvblN0b3JhZ2UiLE1lbW9yeVN0b3JhZ2U6Im1lbW9yeVN0b3JhZ2UifSx3cz0iR0VUIix2cz0iUE9TVCIsSXM9InNpZ25pbiIsVHM9InNpZ25vdXQiLEFzPSJyZXF1ZXN0Lm9yaWdpbiIsa3M9InVybEhhc2giLFNzPSJyZXF1ZXN0LnBhcmFtcyIsYnM9ImNvZGUudmVyaWZpZXIiLEVzPSJpbnRlcmFjdGlvbi5zdGF0dXMiLFJzPSJyZXF1ZXN0Lm5hdGl2ZSIsX3M9IndyYXBwZXIuc2t1IixQcz0id3JhcHBlci52ZXJzaW9uIixNcz17YWNxdWlyZVRva2VuUmVkaXJlY3Q6ODYxLGFjcXVpcmVUb2tlblBvcHVwOjg2Mixzc29TaWxlbnQ6ODYzLGFjcXVpcmVUb2tlblNpbGVudF9hdXRoQ29kZTo4NjQsaGFuZGxlUmVkaXJlY3RQcm9taXNlOjg2NSxhY3F1aXJlVG9rZW5CeUNvZGU6ODY2LGFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93OjYxLGxvZ291dDo5NjEsbG9nb3V0UG9wdXA6OTYyfTt2YXIgT3M7ZS5JbnRlcmFjdGlvblR5cGU9dm9pZCAwLChPcz1lLkludGVyYWN0aW9uVHlwZXx8KGUuSW50ZXJhY3Rpb25UeXBlPXt9KSkuUmVkaXJlY3Q9InJlZGlyZWN0IixPcy5Qb3B1cD0icG9wdXAiLE9zLlNpbGVudD0ic2lsZW50IixPcy5Ob25lPSJub25lIjtjb25zdCBxcz17U3RhcnR1cDoic3RhcnR1cCIsTG9naW46ImxvZ2luIixMb2dvdXQ6ImxvZ291dCIsQWNxdWlyZVRva2VuOiJhY3F1aXJlVG9rZW4iLFNzb1NpbGVudDoic3NvU2lsZW50IixIYW5kbGVSZWRpcmVjdDoiaGFuZGxlUmVkaXJlY3QiLE5vbmU6Im5vbmUifSxOcz17c2NvcGVzOmh9LFVzPSJtc2FsLmRiIixMcz1gJHtVc30ua2V5c2AsRHM9e0RlZmF1bHQ6MCxBY2Nlc3NUb2tlbjoxLEFjY2Vzc1Rva2VuQW5kUmVmcmVzaFRva2VuOjIsUmVmcmVzaFRva2VuOjMsUmVmcmVzaFRva2VuQW5kTmV0d29yazo0LFNraXA6NX0sSHM9W0RzLkRlZmF1bHQsRHMuU2tpcCxEcy5SZWZyZXNoVG9rZW5BbmROZXR3b3JrXTtmdW5jdGlvbiB4cyhlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEZzKGUpLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKSl9ZnVuY3Rpb24gQnMoZSl7cmV0dXJuIHpzKGUpLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX1mdW5jdGlvbiBGcyhlKXtyZXR1cm4genMoKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKX1mdW5jdGlvbiB6cyhlKXtjb25zdCB0PUFycmF5LmZyb20oZSwoZT0+U3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpKS5qb2luKCIiKTtyZXR1cm4gYnRvYSh0KX1mdW5jdGlvbiBLcyhlKXtyZXR1cm4obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoR3MoZSkpfWZ1bmN0aW9uIEdzKGUpe2xldCB0PWUucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIik7c3dpdGNoKHQubGVuZ3RoJTQpe2Nhc2UgMDpicmVhaztjYXNlIDI6dCs9Ij09IjticmVhaztjYXNlIDM6dCs9Ij0iO2JyZWFrO2RlZmF1bHQ6dGhyb3cgWmkoemkpfWNvbnN0IHI9YXRvYih0KTtyZXR1cm4gVWludDhBcnJheS5mcm9tKHIsKGU9PmUuY29kZVBvaW50QXQoMCl8fDApKX1jb25zdCAkcz0iQUVTLUdDTSIsUXM9IkhLREYiLGpzPSJTSEEtMjU2IixXcz1uZXcgVWludDhBcnJheShbMSwwLDFdKSxWcz0iMDEyMzQ1Njc4OWFiY2RlZiIsSnM9bmV3IFVpbnQzMkFycmF5KDEpLFlzPSJyYXciLFhzPSJlbmNyeXB0Iixacz0iZGVjcnlwdCIsZWE9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOmpzLG1vZHVsdXNMZW5ndGg6MjA0OCxwdWJsaWNFeHBvbmVudDpXc307YXN5bmMgZnVuY3Rpb24gdGEoZSx0LHIpe3Q/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU2hhMjU2RGlnZXN0LHIpO2NvbnN0IG49KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpO3JldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kaWdlc3QoanMsbil9ZnVuY3Rpb24gcmEoZSl7cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpfWZ1bmN0aW9uIG5hKCl7cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKEpzKSxKc1swXX1mdW5jdGlvbiBvYSgpe2NvbnN0IGU9RGF0ZS5ub3coKSx0PTEwMjQqbmEoKSsoMTAyMyZuYSgpKSxyPW5ldyBVaW50OEFycmF5KDE2KSxuPU1hdGgudHJ1bmModC8yKiozMCksbz10JjIqKjMwLTEsaT1uYSgpO3JbMF09ZS8yKio0MCxyWzFdPWUvMioqMzIsclsyXT1lLzIqKjI0LHJbM109ZS82NTUzNixyWzRdPWUvMjU2LHJbNV09ZSxyWzZdPTExMnxuPj4+OCxyWzddPW4scls4XT0xMjh8bz4+PjI0LHJbOV09bz4+PjE2LHJbMTBdPW8+Pj44LHJbMTFdPW8sclsxMl09aT4+PjI0LHJbMTNdPWk+Pj4xNixyWzE0XT1pPj4+OCxyWzE1XT1pO2xldCBzPSIiO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKXMrPVZzLmNoYXJBdChyW2VdPj4+NCkscys9VnMuY2hhckF0KDE1JnJbZV0pLDMhPT1lJiY1IT09ZSYmNyE9PWUmJjkhPT1lfHwocys9Ii0iKTtyZXR1cm4gc31hc3luYyBmdW5jdGlvbiBpYShlKXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJqd2siLGUpfWFzeW5jIGZ1bmN0aW9uIHNhKCl7Y29uc3QgZT1hd2FpdCBjYSgpLHQ9e2FsZzoiZGlyIixrdHk6Im9jdCIsazpCcyhuZXcgVWludDhBcnJheShlKSl9O3JldHVybiBGcyhKU09OLnN0cmluZ2lmeSh0KSl9YXN5bmMgZnVuY3Rpb24gYWEoZSx0KXtjb25zdCByPXQuc3BsaXQoIi4iKTtpZig1IT09ci5sZW5ndGgpdGhyb3cgWmkoUWksImp3ZV9sZW5ndGgiKTtjb25zdCBuPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9S3MoZSkscj1HcyhKU09OLnBhcnNlKHQpLmspO3JldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoWXMsciwkcywhMSxbWnNdKX0oZSkuY2F0Y2goKCgpPT57dGhyb3cgWmkoUWksImltcG9ydF9rZXkiKX0pKTt0cnl7Y29uc3QgZT0obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoclswXSksdD1HcyhyWzJdKSxvPUdzKHJbM10pLGk9R3Mocls0XSkscz04KmkuYnl0ZUxlbmd0aCxhPW5ldyBVaW50OEFycmF5KG8ubGVuZ3RoK2kubGVuZ3RoKTthLnNldChvKSxhLnNldChpLG8ubGVuZ3RoKTtjb25zdCBjPWF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoe25hbWU6JHMsaXY6dCx0YWdMZW5ndGg6cyxhZGRpdGlvbmFsRGF0YTplfSxuLGEpO3JldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShjKX1jYXRjaChlKXt0aHJvdyBaaShRaSwiZGVjcnlwdCIpfX1hc3luYyBmdW5jdGlvbiBjYSgpe2NvbnN0IGU9YXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoe25hbWU6JHMsbGVuZ3RoOjI1Nn0sITAsW1hzLFpzXSk7cmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShZcyxlKX1hc3luYyBmdW5jdGlvbiBsYShlKXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFlzLGUsUXMsITEsWyJkZXJpdmVLZXkiXSl9YXN5bmMgZnVuY3Rpb24gaGEoZSx0LHIpe3JldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoe25hbWU6UXMsc2FsdDp0LGhhc2g6anMsaW5mbzoobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUocil9LGUse25hbWU6JHMsbGVuZ3RoOjI1Nn0sITEsW1hzLFpzXSl9YXN5bmMgZnVuY3Rpb24gZGEoZSx0LHIpe2NvbnN0IG49KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpLG89d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKSxpPWF3YWl0IGhhKGUsbyxyKSxzPWF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6JHMsaXY6bmV3IFVpbnQ4QXJyYXkoMTIpfSxpLG4pO3JldHVybntkYXRhOkJzKG5ldyBVaW50OEFycmF5KHMpKSxub25jZTpCcyhvKX19YXN5bmMgZnVuY3Rpb24gdWEoZSx0LHIsbil7Y29uc3Qgbz1HcyhuKSxpPWF3YWl0IGhhKGUsR3ModCkscikscz1hd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOiRzLGl2Om5ldyBVaW50OEFycmF5KDEyKX0saSxvKTtyZXR1cm4obmV3IFRleHREZWNvZGVyKS5kZWNvZGUocyl9YXN5bmMgZnVuY3Rpb24gZ2EoZSl7Y29uc3QgdD1hd2FpdCB0YShlKTtyZXR1cm4gQnMobmV3IFVpbnQ4QXJyYXkodCkpfWNvbnN0IHBhPSJzdG9yYWdlX25vdF9zdXBwb3J0ZWQiLG1hPSJzdHViYmVkX3B1YmxpY19jbGllbnRfYXBwbGljYXRpb25fY2FsbGVkIixmYT0iaW5fbWVtX3JlZGlyZWN0X3VuYXZhaWxhYmxlIjt2YXIgeWE9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW5NZW1SZWRpcmVjdFVuYXZhaWxhYmxlOmZhLHN0b3JhZ2VOb3RTdXBwb3J0ZWQ6cGEsc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkOm1hfSk7Y29uc3QgQ2E9e1twYV06IkdpdmVuIHN0b3JhZ2UgY29uZmlndXJhdGlvbiBvcHRpb24gd2FzIG5vdCBzdXBwb3J0ZWQuIixbbWFdOiJTdHViIGluc3RhbmNlIG9mIFB1YmxpYyBDbGllbnQgQXBwbGljYXRpb24gd2FzIGNhbGxlZC4gSWYgdXNpbmcgbXNhbC1yZWFjdCwgcGxlYXNlIGVuc3VyZSBjb250ZXh0IGlzIG5vdCB1c2VkIHdpdGhvdXQgYSBwcm92aWRlci4gRm9yIG1vcmUgdmlzaXQ6IGFrYS5tcy9tc2FsanMvYnJvd3Nlci1lcnJvcnMiLFtmYV06IlJlZGlyZWN0IGNhbm5vdCBiZSBzdXBwb3J0ZWQuIEluLW1lbW9yeSBzdG9yYWdlIHdhcyBzZWxlY3RlZCBhbmQgc3RvcmVBdXRoU3RhdGVJbkNvb2tpZT1mYWxzZSwgd2hpY2ggd291bGQgY2F1c2UgdGhlIGxpYnJhcnkgdG8gYmUgdW5hYmxlIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgaGFzaC4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSByZWRpcmVjdCBBUEksIHBsZWFzZSB1c2Ugc2Vzc2lvbi9sb2NhbFN0b3JhZ2Ugb3Igc2V0IHN0b3JlQXV0aFN0YXRlSW5Db29raWU9dHJ1ZS4ifSx3YT17c3RvcmFnZU5vdFN1cHBvcnRlZEVycm9yOntjb2RlOnBhLGRlc2M6Q2FbcGFdfSxzdHViUGNhSW5zdGFuY2VDYWxsZWQ6e2NvZGU6bWEsZGVzYzpDYVttYV19LGluTWVtUmVkaXJlY3RVbmF2YWlsYWJsZTp7Y29kZTpmYSxkZXNjOkNhW2ZhXX19O2NsYXNzIHZhIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMubmFtZT0iQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHZhLnByb3RvdHlwZSl9fWZ1bmN0aW9uIElhKGUpe3JldHVybiBuZXcgdmEoZSxDYVtlXSl9ZnVuY3Rpb24gVGEoZSl7ZS5sb2NhdGlvbi5oYXNoPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmhpc3RvcnkucmVwbGFjZVN0YXRlJiZlLmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIiIsYCR7ZS5sb2NhdGlvbi5vcmlnaW59JHtlLmxvY2F0aW9uLnBhdGhuYW1lfSR7ZS5sb2NhdGlvbi5zZWFyY2h9YCl9ZnVuY3Rpb24gQWEoZSl7Y29uc3QgdD1lLnNwbGl0KCIjIik7dC5zaGlmdCgpLHdpbmRvdy5sb2NhdGlvbi5oYXNoPXQubGVuZ3RoPjA/dC5qb2luKCIjIik6IiJ9ZnVuY3Rpb24ga2EoKXtyZXR1cm4gd2luZG93LnBhcmVudCE9PXdpbmRvd31mdW5jdGlvbiBTYSgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYhIXdpbmRvdy5vcGVuZXImJndpbmRvdy5vcGVuZXIhPT13aW5kb3cmJiJzdHJpbmciPT10eXBlb2Ygd2luZG93Lm5hbWUmJjA9PT13aW5kb3cubmFtZS5pbmRleE9mKGAke25zfS5gKX1mdW5jdGlvbiBiYSgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubG9jYXRpb24/d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXS5zcGxpdCgiIyIpWzBdOiIifWZ1bmN0aW9uIEVhKCl7Y29uc3QgZT1uZXcgd3Iod2luZG93LmxvY2F0aW9uLmhyZWYpLmdldFVybENvbXBvbmVudHMoKTtyZXR1cm5gJHtlLlByb3RvY29sfS8vJHtlLkhvc3ROYW1lQW5kUG9ydH0vYH1mdW5jdGlvbiBSYSgpe2lmKHdyLmhhc2hDb250YWluc0tub3duUHJvcGVydGllcyh3aW5kb3cubG9jYXRpb24uaGFzaCkmJmthKCkpdGhyb3cgWmkocGkpfWZ1bmN0aW9uIF9hKGUpe2lmKGthKCkmJiFlKXRocm93IFppKGdpKX1mdW5jdGlvbiBQYSgpe2lmKFNhKCkpdGhyb3cgWmkobWkpfWZ1bmN0aW9uIE1hKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cpdGhyb3cgWmkoa2kpfWZ1bmN0aW9uIE9hKGUpe2lmKCFlKXRocm93IFppKEJpKX1mdW5jdGlvbiBxYShlKXtNYSgpLFJhKCksUGEoKSxPYShlKX1mdW5jdGlvbiBOYShlLHQpe2lmKHFhKGUpLF9hKHQuc3lzdGVtLmFsbG93UmVkaXJlY3RJbklmcmFtZSksdC5jYWNoZS5jYWNoZUxvY2F0aW9uPT09Q3MuTWVtb3J5U3RvcmFnZSYmIXQuY2FjaGUuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSl0aHJvdyBJYShmYSl9ZnVuY3Rpb24gVWEoZSl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7dC5yZWw9InByZWNvbm5lY3QiLHQuaHJlZj1uZXcgVVJMKGUpLm9yaWdpbix0LmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCksd2luZG93LnNldFRpbWVvdXQoKCgpPT57dHJ5e2RvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQodCl9Y2F0Y2h7fX0pLDFlNCl9ZnVuY3Rpb24gTGEoKXtyZXR1cm4gb2EoKX1jb25zdCBEYT1Sbjt2YXIgSGE9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYWRkQ2xpZW50Q2FwYWJpbGl0aWVzVG9DbGFpbXM6RGEsYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemU6T2EsYmxvY2tBY3F1aXJlVG9rZW5JblBvcHVwczpQYSxibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudDpNYSxibG9ja1JlZGlyZWN0SW5JZnJhbWU6X2EsYmxvY2tSZWxvYWRJbkhpZGRlbklmcmFtZXM6UmEsY2xlYXJIYXNoOlRhLGNyZWF0ZUd1aWQ6TGEsZ2V0Q3VycmVudFVyaTpiYSxnZXRIb21lcGFnZTpFYSxpbnZva2U6Tm4saW52b2tlQXN5bmM6VW4saXNJbklmcmFtZTprYSxpc0luUG9wdXA6U2EscHJlY29ubmVjdDpVYSxwcmVmbGlnaHRDaGVjazpxYSxyZWRpcmVjdFByZWZsaWdodENoZWNrOk5hLHJlcGxhY2VIYXNoOkFhfSk7Y2xhc3MgeGF7bmF2aWdhdGVJbnRlcm5hbChlLHQpe3JldHVybiB4YS5kZWZhdWx0TmF2aWdhdGVXaW5kb3coZSx0KX1uYXZpZ2F0ZUV4dGVybmFsKGUsdCl7cmV0dXJuIHhhLmRlZmF1bHROYXZpZ2F0ZVdpbmRvdyhlLHQpfXN0YXRpYyBkZWZhdWx0TmF2aWdhdGVXaW5kb3coZSx0KXtyZXR1cm4gdC5ub0hpc3Rvcnk/d2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZSk6d2luZG93LmxvY2F0aW9uLmFzc2lnbihlKSxuZXcgUHJvbWlzZSgoKGUscik9PntzZXRUaW1lb3V0KCgoKT0+e3IoWmkoamksImZhaWxlZF90b19yZWRpcmVjdCIpKX0pLHQudGltZW91dCl9KSl9fWNsYXNzIEJhe2FzeW5jIHNlbmRHZXRSZXF1ZXN0QXN5bmMoZSx0KXtsZXQgcixuPXt9LG89MDtjb25zdCBpPUZhKHQpO3RyeXtyPWF3YWl0IGZldGNoKGUse21ldGhvZDp3cyxoZWFkZXJzOml9KX1jYXRjaChlKXt0aHJvdyBhbyhaaSh3aW5kb3cubmF2aWdhdG9yLm9uTGluZT9SaTpiaSksdm9pZCAwLHZvaWQgMCxlKX1uPXphKHIuaGVhZGVycyk7dHJ5e3JldHVybiBvPXIuc3RhdHVzLHtoZWFkZXJzOm4sYm9keTphd2FpdCByLmpzb24oKSxzdGF0dXM6b319Y2F0Y2goZSl7dGhyb3cgYW8oWmkoX2kpLG8sbixlKX19YXN5bmMgc2VuZFBvc3RSZXF1ZXN0QXN5bmMoZSx0KXtjb25zdCByPXQmJnQuYm9keXx8IiIsbj1GYSh0KTtsZXQgbyxpPTAscz17fTt0cnl7bz1hd2FpdCBmZXRjaChlLHttZXRob2Q6dnMsaGVhZGVyczpuLGJvZHk6cn0pfWNhdGNoKGUpe3Rocm93IGFvKFppKHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lP0VpOmJpKSx2b2lkIDAsdm9pZCAwLGUpfXM9emEoby5oZWFkZXJzKTt0cnl7cmV0dXJuIGk9by5zdGF0dXMse2hlYWRlcnM6cyxib2R5OmF3YWl0IG8uanNvbigpLHN0YXR1czppfX1jYXRjaChlKXt0aHJvdyBhbyhaaShfaSksaSxzLGUpfX19ZnVuY3Rpb24gRmEoZSl7dHJ5e2NvbnN0IHQ9bmV3IEhlYWRlcnM7aWYoIWV8fCFlLmhlYWRlcnMpcmV0dXJuIHQ7Y29uc3Qgcj1lLmhlYWRlcnM7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHIpLmZvckVhY2goKChbZSxyXSk9Pnt0LmFwcGVuZChlLHIpfSkpLHR9Y2F0Y2goZSl7dGhyb3cgYW8oWmkoR2kpLHZvaWQgMCx2b2lkIDAsZSl9fWZ1bmN0aW9uIHphKGUpe3RyeXtjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2goKChlLHIpPT57dFtyXT1lfSkpLHR9Y2F0Y2goZSl7dGhyb3cgWmkoJGkpfX1jb25zdCBLYT0xZTQ7Y29uc3QgR2E9IkBhenVyZS9tc2FsLWJyb3dzZXIiLCRhPSI0LjI3LjAiLFFhPSJtc2FsIixqYT0iYnJvd3NlciIsV2E9YCR7UWF9LiR7amF9LmxvZy5sZXZlbGAsVmE9YCR7UWF9LiR7amF9LmxvZy5waWlgLEphPWAke1FhfS4ke2phfS5wZXJmb3JtYW5jZS5lbmFibGVkYCxZYT1gJHtRYX0udmVyc2lvbmAsWGE9ImFjY291bnQua2V5cyIsWmE9InRva2VuLmtleXMiO2Z1bmN0aW9uIGVjKGU9Mil7cmV0dXJuIGU8MT9gJHtRYX0uJHtYYX1gOmAke1FhfS4ke2V9LiR7WGF9YH1mdW5jdGlvbiB0YyhlLHQ9Mil7cmV0dXJuIHQ8MT9gJHtRYX0uJHtaYX0uJHtlfWA6YCR7UWF9LiR7dH0uJHtaYX0uJHtlfWB9Y2xhc3MgcmN7c3RhdGljIGxvZ2dlckNhbGxiYWNrKHQscil7c3dpdGNoKHQpe2Nhc2UgZS5Mb2dMZXZlbC5FcnJvcjpyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKHIpO2Nhc2UgZS5Mb2dMZXZlbC5JbmZvOnJldHVybiB2b2lkIGNvbnNvbGUuaW5mbyhyKTtjYXNlIGUuTG9nTGV2ZWwuVmVyYm9zZTpyZXR1cm4gdm9pZCBjb25zb2xlLmRlYnVnKHIpO2Nhc2UgZS5Mb2dMZXZlbC5XYXJuaW5nOnJldHVybiB2b2lkIGNvbnNvbGUud2FybihyKTtkZWZhdWx0OnJldHVybiB2b2lkIGNvbnNvbGUubG9nKHIpfX1jb25zdHJ1Y3RvcihyKXtsZXQgbjt0aGlzLmJyb3dzZXJFbnZpcm9ubWVudD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyx0aGlzLmNvbmZpZz1mdW5jdGlvbih7YXV0aDpyLGNhY2hlOm4sc3lzdGVtOm8sdGVsZW1ldHJ5Oml9LHMpe2NvbnN0IGE9e2NsaWVudElkOnQuRU1QVFlfU1RSSU5HLGF1dGhvcml0eTpgJHt0LkRFRkFVTFRfQVVUSE9SSVRZfWAsa25vd25BdXRob3JpdGllczpbXSxjbG91ZERpc2NvdmVyeU1ldGFkYXRhOnQuRU1QVFlfU1RSSU5HLGF1dGhvcml0eU1ldGFkYXRhOnQuRU1QVFlfU1RSSU5HLHJlZGlyZWN0VXJpOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P2JhKCk6IiIscG9zdExvZ291dFJlZGlyZWN0VXJpOnQuRU1QVFlfU1RSSU5HLG5hdmlnYXRlVG9Mb2dpblJlcXVlc3RVcmw6ITAsY2xpZW50Q2FwYWJpbGl0aWVzOltdLHByb3RvY29sTW9kZTpsci5BQUQsT0lEQ09wdGlvbnM6e3NlcnZlclJlc3BvbnNlVHlwZTpfLkZSQUdNRU5ULGRlZmF1bHRTY29wZXM6W3QuT1BFTklEX1NDT1BFLHQuUFJPRklMRV9TQ09QRSx0Lk9GRkxJTkVfQUNDRVNTX1NDT1BFXX0sYXp1cmVDbG91ZE9wdGlvbnM6e2F6dXJlQ2xvdWRJbnN0YW5jZTpJdC5Ob25lLHRlbmFudDp0LkVNUFRZX1NUUklOR30sc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6ITEsc3VwcG9ydHNOZXN0ZWRBcHBBdXRoOiExLGluc3RhbmNlQXdhcmU6ITEsZW5jb2RlRXh0cmFRdWVyeVBhcmFtczohMX0sYz17Y2FjaGVMb2NhdGlvbjpDcy5TZXNzaW9uU3RvcmFnZSxjYWNoZVJldGVudGlvbkRheXM6NSx0ZW1wb3JhcnlDYWNoZUxvY2F0aW9uOkNzLlNlc3Npb25TdG9yYWdlLHN0b3JlQXV0aFN0YXRlSW5Db29raWU6ITEsc2VjdXJlQ29va2llczohMSxjYWNoZU1pZ3JhdGlvbkVuYWJsZWQ6ISghbnx8bi5jYWNoZUxvY2F0aW9uIT09Q3MuTG9jYWxTdG9yYWdlKSxjbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkOiExfSxsPXtsb2dnZXJDYWxsYmFjazooKT0+e30sbG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLHBpaUxvZ2dpbmdFbmFibGVkOiExfSxoPXsuLi57Li4ueHIsbG9nZ2VyT3B0aW9uczpsLG5ldHdvcmtDbGllbnQ6cz9uZXcgQmE6TG8sbmF2aWdhdGlvbkNsaWVudDpuZXcgeGEsbG9hZEZyYW1lVGltZW91dDowLHdpbmRvd0hhc2hUaW1lb3V0Om8/LmxvYWRGcmFtZVRpbWVvdXR8fDZlNCxpZnJhbWVIYXNoVGltZW91dDpvPy5sb2FkRnJhbWVUaW1lb3V0fHxLYSxuYXZpZ2F0ZUZyYW1lV2FpdDowLHJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQ6M2U0LGFzeW5jUG9wdXBzOiExLGFsbG93UmVkaXJlY3RJbklmcmFtZTohMSxhbGxvd1BsYXRmb3JtQnJva2VyOiExLGFsbG93UGxhdGZvcm1Ccm9rZXJXaXRoRE9NOiExLG5hdGl2ZUJyb2tlckhhbmRzaGFrZVRpbWVvdXQ6bz8ubmF0aXZlQnJva2VySGFuZHNoYWtlVGltZW91dHx8MmUzLHBvbGxJbnRlcnZhbE1pbGxpc2Vjb25kczpvc30sLi4ubyxsb2dnZXJPcHRpb25zOm8/LmxvZ2dlck9wdGlvbnN8fGx9LGQ9e2FwcGxpY2F0aW9uOnthcHBOYW1lOnQuRU1QVFlfU1RSSU5HLGFwcFZlcnNpb246dC5FTVBUWV9TVFJJTkd9LGNsaWVudDpuZXcgSHJ9O3I/LnByb3RvY29sTW9kZSE9PWxyLk9JREMmJnI/Lk9JRENPcHRpb25zJiZuZXcgQ3QoaC5sb2dnZXJPcHRpb25zKS53YXJuaW5nKEpTT04uc3RyaW5naWZ5KEp0KEJ0KSkpO2lmKHI/LnByb3RvY29sTW9kZSYmci5wcm90b2NvbE1vZGU9PT1sci5PSURDJiZoPy5hbGxvd1BsYXRmb3JtQnJva2VyKXRocm93IEp0KEZ0KTtyZXR1cm57YXV0aDp7Li4uYSwuLi5yLE9JRENPcHRpb25zOnsuLi5hLk9JRENPcHRpb25zLC4uLnI/Lk9JRENPcHRpb25zfX0sY2FjaGU6ey4uLmMsLi4ubn0sc3lzdGVtOmgsdGVsZW1ldHJ5OnsuLi5kLC4uLml9fX0ocix0aGlzLmJyb3dzZXJFbnZpcm9ubWVudCk7dHJ5e249d2luZG93W0NzLlNlc3Npb25TdG9yYWdlXX1jYXRjaChlKXt9Y29uc3Qgbz1uPy5nZXRJdGVtKFdhKSxpPW4/LmdldEl0ZW0oVmEpPy50b0xvd2VyQ2FzZSgpLHM9InRydWUiPT09aXx8ImZhbHNlIiE9PWkmJnZvaWQgMCxhPXsuLi50aGlzLmNvbmZpZy5zeXN0ZW0ubG9nZ2VyT3B0aW9uc30sYz1vJiZPYmplY3Qua2V5cyhlLkxvZ0xldmVsKS5pbmNsdWRlcyhvKT9lLkxvZ0xldmVsW29dOnZvaWQgMDtjJiYoYS5sb2dnZXJDYWxsYmFjaz1yYy5sb2dnZXJDYWxsYmFjayxhLmxvZ0xldmVsPWMpLHZvaWQgMCE9PXMmJihhLnBpaUxvZ2dpbmdFbmFibGVkPXMpLHRoaXMubG9nZ2VyPW5ldyBDdChhLEdhLCRhKSx0aGlzLmF2YWlsYWJsZT0hMX1nZXRDb25maWcoKXtyZXR1cm4gdGhpcy5jb25maWd9Z2V0TG9nZ2VyKCl7cmV0dXJuIHRoaXMubG9nZ2VyfWlzQXZhaWxhYmxlKCl7cmV0dXJuIHRoaXMuYXZhaWxhYmxlfWlzQnJvd3NlckVudmlyb25tZW50KCl7cmV0dXJuIHRoaXMuYnJvd3NlckVudmlyb25tZW50fX1jb25zdCBuYz0iVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCIsb2M9IlVTRVJfQ0FOQ0VMIixpYz0iTk9fTkVUV09SSyIsc2M9IlRSQU5TSUVOVF9FUlJPUiIsYWM9IlBFUlNJU1RFTlRfRVJST1IiLGNjPSJESVNBQkxFRCIsbGM9IkFDQ09VTlRfVU5BVkFJTEFCTEUiLGhjPSJORVNURURfQVBQX0FVVEhfVU5BVkFJTEFCTEUiO2NsYXNzIGRje3N0YXRpYyBhc3luYyBpbml0aWFsaXplTmVzdGVkQXBwQXV0aEJyaWRnZSgpe2lmKHZvaWQgMD09PXdpbmRvdyl0aHJvdyBuZXcgRXJyb3IoIndpbmRvdyBpcyB1bmRlZmluZWQiKTtpZih2b2lkIDA9PT13aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZSl0aHJvdyBuZXcgRXJyb3IoIndpbmRvdy5uZXN0ZWRBcHBBdXRoQnJpZGdlIGlzIHVuZGVmaW5lZCIpO3RyeXt3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZT0+e2NvbnN0IHQ9InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5kYXRhLHI9SlNPTi5wYXJzZSh0KSxuPWRjLmJyaWRnZVJlcXVlc3RzLmZpbmQoKGU9PmUucmVxdWVzdElkPT09ci5yZXF1ZXN0SWQpKTt2b2lkIDAhPT1uJiYoZGMuYnJpZGdlUmVxdWVzdHMuc3BsaWNlKGRjLmJyaWRnZVJlcXVlc3RzLmluZGV4T2YobiksMSksci5zdWNjZXNzP24ucmVzb2x2ZShyKTpuLnJlamVjdChyLmVycm9yKSl9KSk7Y29uc3QgZT1hd2FpdCBuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPWRjLmJ1aWxkUmVxdWVzdCgiR2V0SW5pdENvbnRleHQiKSxuPXtyZXF1ZXN0SWQ6ci5yZXF1ZXN0SWQsbWV0aG9kOnIubWV0aG9kLHJlc29sdmU6ZSxyZWplY3Q6dH07ZGMuYnJpZGdlUmVxdWVzdHMucHVzaChuKSx3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShyKSl9KSk7cmV0dXJuIGRjLnZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhlLmluaXRDb250ZXh0KX1jYXRjaChlKXt0aHJvdyB3aW5kb3cuY29uc29sZS5sb2coZSksZX19Z2V0VG9rZW5JbnRlcmFjdGl2ZShlKXtyZXR1cm4gdGhpcy5nZXRUb2tlbigiR2V0VG9rZW5Qb3B1cCIsZSl9Z2V0VG9rZW5TaWxlbnQoZSl7cmV0dXJuIHRoaXMuZ2V0VG9rZW4oIkdldFRva2VuIixlKX1hc3luYyBnZXRUb2tlbihlLHQpe2NvbnN0IHI9YXdhaXQgdGhpcy5zZW5kUmVxdWVzdChlLHt0b2tlblBhcmFtczp0fSk7cmV0dXJue3Rva2VuOmRjLnZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhyLnRva2VuKSxhY2NvdW50OmRjLnZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhyLmFjY291bnQpfX1nZXRIb3N0Q2FwYWJpbGl0aWVzKCl7cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzPz9udWxsfWdldEFjY291bnRDb250ZXh0KCl7cmV0dXJuIHRoaXMuYWNjb3VudENvbnRleHQ/dGhpcy5hY2NvdW50Q29udGV4dDpudWxsfXN0YXRpYyBidWlsZFJlcXVlc3QoZSx0KXtyZXR1cm57bWVzc2FnZVR5cGU6Ik5lc3RlZEFwcEF1dGhSZXF1ZXN0IixtZXRob2Q6ZSxyZXF1ZXN0SWQ6b2EoKSxzZW5kVGltZTpEYXRlLm5vdygpLGNsaWVudExpYnJhcnk6aXMsY2xpZW50TGlicmFyeVZlcnNpb246JGEsLi4udH19c2VuZFJlcXVlc3QoZSx0KXtjb25zdCByPWRjLmJ1aWxkUmVxdWVzdChlLHQpO3JldHVybiBuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCBuPXtyZXF1ZXN0SWQ6ci5yZXF1ZXN0SWQsbWV0aG9kOnIubWV0aG9kLHJlc29sdmU6ZSxyZWplY3Q6dH07ZGMuYnJpZGdlUmVxdWVzdHMucHVzaChuKSx3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShyKSl9KSl9c3RhdGljIHZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhlKXtpZih2b2lkIDA9PT1lKXt0aHJvd3tzdGF0dXM6aGN9fXJldHVybiBlfWNvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuc2RrTmFtZT1lLHRoaXMuc2RrVmVyc2lvbj10LHRoaXMuYWNjb3VudENvbnRleHQ9cix0aGlzLmNhcGFiaWxpdGllcz1ufXN0YXRpYyBhc3luYyBjcmVhdGUoKXtjb25zdCBlPWF3YWl0IGRjLmluaXRpYWxpemVOZXN0ZWRBcHBBdXRoQnJpZGdlKCk7cmV0dXJuIG5ldyBkYyhlLnNka05hbWUsZS5zZGtWZXJzaW9uLGUuYWNjb3VudENvbnRleHQsZS5jYXBhYmlsaXRpZXMpfX1kYy5icmlkZ2VSZXF1ZXN0cz1bXTtjbGFzcyB1YyBleHRlbmRzIHJje2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmJyaWRnZVByb3h5PXZvaWQgMCx0aGlzLmFjY291bnRDb250ZXh0PW51bGx9Z2V0TW9kdWxlTmFtZSgpe3JldHVybiB1Yy5NT0RVTEVfTkFNRX1nZXRJZCgpe3JldHVybiB1Yy5JRH1nZXRCcmlkZ2VQcm94eSgpe3JldHVybiB0aGlzLmJyaWRnZVByb3h5fWFzeW5jIGluaXRpYWxpemUoKXt0cnl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19pbml0aWFsaXplTmVzdGVkQXBwQXV0aCYmYXdhaXQgd2luZG93Ll9faW5pdGlhbGl6ZU5lc3RlZEFwcEF1dGgoKTtjb25zdCBlPWF3YWl0IGRjLmNyZWF0ZSgpO3RoaXMuYWNjb3VudENvbnRleHQ9ZS5nZXRBY2NvdW50Q29udGV4dCgpLHRoaXMuYnJpZGdlUHJveHk9ZSx0aGlzLmF2YWlsYWJsZT12b2lkIDAhPT1lfX1jYXRjaChlKXt0aGlzLmxvZ2dlci5pbmZvUGlpKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBOZXN0ZWQgQXBwIEF1dGggYnJpZGdlICgke2V9KWApfXJldHVybiB0aGlzLmxvZ2dlci5pbmZvKGBOZXN0ZWQgQXBwIEF1dGggQnJpZGdlIGF2YWlsYWJsZTogJHt0aGlzLmF2YWlsYWJsZX1gKSx0aGlzLmF2YWlsYWJsZX19dWMuTU9EVUxFX05BTUU9IiIsdWMuSUQ9Ik5lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQiO2NsYXNzIGdjIGV4dGVuZHMgcmN7Z2V0TW9kdWxlTmFtZSgpe3JldHVybiBnYy5NT0RVTEVfTkFNRX1nZXRJZCgpe3JldHVybiBnYy5JRH1hc3luYyBpbml0aWFsaXplKCl7cmV0dXJuIHRoaXMuYXZhaWxhYmxlPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHRoaXMuYXZhaWxhYmxlfX1nYy5NT0RVTEVfTkFNRT0iIixnYy5JRD0iU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0IjtjbGFzcyBwY3tjb25zdHJ1Y3Rvcigpe3RoaXMuZGJOYW1lPVVzLHRoaXMudmVyc2lvbj0xLHRoaXMudGFibGVOYW1lPUxzLHRoaXMuZGJPcGVuPSExfWFzeW5jIG9wZW4oKXtyZXR1cm4gbmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgcj13aW5kb3cuaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsdGhpcy52ZXJzaW9uKTtyLmFkZEV2ZW50TGlzdGVuZXIoInVwZ3JhZGVuZWVkZWQiLChlPT57ZS50YXJnZXQucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKX0pKSxyLmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCh0PT57Y29uc3Qgcj10O3RoaXMuZGI9ci50YXJnZXQucmVzdWx0LHRoaXMuZGJPcGVuPSEwLGUoKX0pKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoKCk9PnQoWmkoVWkpKSkpfSkpfWNsb3NlQ29ubmVjdGlvbigpe2NvbnN0IGU9dGhpcy5kYjtlJiZ0aGlzLmRiT3BlbiYmKGUuY2xvc2UoKSx0aGlzLmRiT3Blbj0hMSl9YXN5bmMgdmFsaWRhdGVEYklzT3Blbigpe2lmKCF0aGlzLmRiT3BlbilyZXR1cm4gdGhpcy5vcGVuKCl9YXN5bmMgZ2V0SXRlbShlKXtyZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZURiSXNPcGVuKCksbmV3IFByb21pc2UoKCh0LHIpPT57aWYoIXRoaXMuZGIpcmV0dXJuIHIoWmkoU2kpKTtjb25zdCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oW3RoaXMudGFibGVOYW1lXSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkuZ2V0KGUpO24uYWRkRXZlbnRMaXN0ZW5lcigic3VjY2VzcyIsKGU9Pntjb25zdCByPWU7dGhpcy5jbG9zZUNvbm5lY3Rpb24oKSx0KHIudGFyZ2V0LnJlc3VsdCl9KSksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGU9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoZSl9KSl9KSl9YXN5bmMgc2V0SXRlbShlLHQpe3JldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKSxuZXcgUHJvbWlzZSgoKHIsbik9PntpZighdGhpcy5kYilyZXR1cm4gbihaaShTaSkpO2NvbnN0IG89dGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCJyZWFkd3JpdGUiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkucHV0KHQsZSk7by5hZGRFdmVudExpc3RlbmVyKCJzdWNjZXNzIiwoKCk9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoKX0pKSxvLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZT0+e3RoaXMuY2xvc2VDb25uZWN0aW9uKCksbihlKX0pKX0pKX1hc3luYyByZW1vdmVJdGVtKGUpe3JldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKSxuZXcgUHJvbWlzZSgoKHQscik9PntpZighdGhpcy5kYilyZXR1cm4gcihaaShTaSkpO2NvbnN0IG49dGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCJyZWFkd3JpdGUiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkuZGVsZXRlKGUpO24uYWRkRXZlbnRMaXN0ZW5lcigic3VjY2VzcyIsKCgpPT57dGhpcy5jbG9zZUNvbm5lY3Rpb24oKSx0KCl9KSksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGU9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoZSl9KSl9KSl9YXN5bmMgZ2V0S2V5cygpe3JldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKSxuZXcgUHJvbWlzZSgoKGUsdCk9PntpZighdGhpcy5kYilyZXR1cm4gdChaaShTaSkpO2NvbnN0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKS5nZXRBbGxLZXlzKCk7ci5hZGRFdmVudExpc3RlbmVyKCJzdWNjZXNzIiwodD0+e2NvbnN0IHI9dDt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLGUoci50YXJnZXQucmVzdWx0KX0pKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZT0+e3RoaXMuY2xvc2VDb25uZWN0aW9uKCksdChlKX0pKX0pKX1hc3luYyBjb250YWluc0tleShlKXtyZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZURiSXNPcGVuKCksbmV3IFByb21pc2UoKCh0LHIpPT57aWYoIXRoaXMuZGIpcmV0dXJuIHIoWmkoU2kpKTtjb25zdCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oW3RoaXMudGFibGVOYW1lXSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkuY291bnQoZSk7bi5hZGRFdmVudExpc3RlbmVyKCJzdWNjZXNzIiwoZT0+e2NvbnN0IHI9ZTt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHQoMT09PXIudGFyZ2V0LnJlc3VsdCl9KSksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGU9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoZSl9KSl9KSl9YXN5bmMgZGVsZXRlRGF0YWJhc2UoKXtyZXR1cm4gdGhpcy5kYiYmdGhpcy5kYk9wZW4mJnRoaXMuY2xvc2VDb25uZWN0aW9uKCksbmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgcj13aW5kb3cuaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKFVzKSxuPXNldFRpbWVvdXQoKCgpPT50KCExKSksMjAwKTtyLmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCgoKT0+KGNsZWFyVGltZW91dChuKSxlKCEwKSkpKSxyLmFkZEV2ZW50TGlzdGVuZXIoImJsb2NrZWQiLCgoKT0+KGNsZWFyVGltZW91dChuKSxlKCEwKSkpKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoKCk9PihjbGVhclRpbWVvdXQobiksdCghMSkpKSl9KSl9fWNsYXNzIG1je2NvbnN0cnVjdG9yKCl7dGhpcy5jYWNoZT1uZXcgTWFwfWFzeW5jIGluaXRpYWxpemUoKXt9Z2V0SXRlbShlKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQoZSl8fG51bGx9Z2V0VXNlckRhdGEoZSl7cmV0dXJuIHRoaXMuZ2V0SXRlbShlKX1zZXRJdGVtKGUsdCl7dGhpcy5jYWNoZS5zZXQoZSx0KX1hc3luYyBzZXRVc2VyRGF0YShlLHQpe3RoaXMuc2V0SXRlbShlLHQpfXJlbW92ZUl0ZW0oZSl7dGhpcy5jYWNoZS5kZWxldGUoZSl9Z2V0S2V5cygpe2NvbnN0IGU9W107cmV0dXJuIHRoaXMuY2FjaGUuZm9yRWFjaCgoKHQscik9PntlLnB1c2gocil9KSksZX1jb250YWluc0tleShlKXtyZXR1cm4gdGhpcy5jYWNoZS5oYXMoZSl9Y2xlYXIoKXt0aGlzLmNhY2hlLmNsZWFyKCl9ZGVjcnlwdERhdGEoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpfX1jbGFzcyBmY3tjb25zdHJ1Y3RvcihlKXt0aGlzLmluTWVtb3J5Q2FjaGU9bmV3IG1jLHRoaXMuaW5kZXhlZERCQ2FjaGU9bmV3IHBjLHRoaXMubG9nZ2VyPWV9aGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKXtpZighKGUgaW5zdGFuY2VvZiBYaSYmZS5lcnJvckNvZGU9PT1VaSkpdGhyb3cgZTt0aGlzLmxvZ2dlci5lcnJvcigiQ291bGQgbm90IGFjY2VzcyBwZXJzaXN0ZW50IHN0b3JhZ2UuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBicm93c2VyIHByaXZhY3kgZmVhdHVyZXMgd2hpY2ggYmxvY2sgcGVyc2lzdGVudCBzdG9yYWdlIGluIHRoaXJkLXBhcnR5IGNvbnRleHRzLiIpfWFzeW5jIGdldEl0ZW0oZSl7Y29uc3QgdD10aGlzLmluTWVtb3J5Q2FjaGUuZ2V0SXRlbShlKTtpZighdCl0cnl7cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlF1ZXJpZWQgaXRlbSBub3QgZm91bmQgaW4gaW4tbWVtb3J5IGNhY2hlLCBub3cgcXVlcnlpbmcgcGVyc2lzdGVudCBzdG9yYWdlLiIpLGF3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuZ2V0SXRlbShlKX1jYXRjaChlKXt0aGlzLmhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZSl9cmV0dXJuIHR9YXN5bmMgc2V0SXRlbShlLHQpe3RoaXMuaW5NZW1vcnlDYWNoZS5zZXRJdGVtKGUsdCk7dHJ5e2F3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuc2V0SXRlbShlLHQpfWNhdGNoKGUpe3RoaXMuaGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKX19YXN5bmMgcmVtb3ZlSXRlbShlKXt0aGlzLmluTWVtb3J5Q2FjaGUucmVtb3ZlSXRlbShlKTt0cnl7YXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5yZW1vdmVJdGVtKGUpfWNhdGNoKGUpe3RoaXMuaGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKX19YXN5bmMgZ2V0S2V5cygpe2NvbnN0IGU9dGhpcy5pbk1lbW9yeUNhY2hlLmdldEtleXMoKTtpZigwPT09ZS5sZW5ndGgpdHJ5e3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJJbi1tZW1vcnkgY2FjaGUgaXMgZW1wdHksIG5vdyBxdWVyeWluZyBwZXJzaXN0ZW50IHN0b3JhZ2UuIiksYXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5nZXRLZXlzKCl9Y2F0Y2goZSl7dGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpfXJldHVybiBlfWFzeW5jIGNvbnRhaW5zS2V5KGUpe2NvbnN0IHQ9dGhpcy5pbk1lbW9yeUNhY2hlLmNvbnRhaW5zS2V5KGUpO2lmKCF0KXRyeXtyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiS2V5IG5vdCBmb3VuZCBpbiBpbi1tZW1vcnkgY2FjaGUsIG5vdyBxdWVyeWluZyBwZXJzaXN0ZW50IHN0b3JhZ2UuIiksYXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5jb250YWluc0tleShlKX1jYXRjaChlKXt0aGlzLmhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZSl9cmV0dXJuIHR9Y2xlYXJJbk1lbW9yeSgpe3RoaXMubG9nZ2VyLnZlcmJvc2UoIkRlbGV0aW5nIGluLW1lbW9yeSBrZXlzdG9yZSIpLHRoaXMuaW5NZW1vcnlDYWNoZS5jbGVhcigpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIkluLW1lbW9yeSBrZXlzdG9yZSBkZWxldGVkIil9YXN5bmMgY2xlYXJQZXJzaXN0ZW50KCl7dHJ5e3RoaXMubG9nZ2VyLnZlcmJvc2UoIkRlbGV0aW5nIHBlcnNpc3RlbnQga2V5c3RvcmUiKTtjb25zdCBlPWF3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuZGVsZXRlRGF0YWJhc2UoKTtyZXR1cm4gZSYmdGhpcy5sb2dnZXIudmVyYm9zZSgiUGVyc2lzdGVudCBrZXlzdG9yZSBkZWxldGVkIiksZX1jYXRjaChlKXtyZXR1cm4gdGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpLCExfX19Y2xhc3MgeWN7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMubG9nZ2VyPWUsZnVuY3Rpb24oZSl7aWYoIXdpbmRvdyl0aHJvdyBaaShraSk7aWYoIXdpbmRvdy5jcnlwdG8pdGhyb3cgWmkoZWkpO2lmKCFlJiYhd2luZG93LmNyeXB0by5zdWJ0bGUpdGhyb3cgWmkoZWksImNyeXB0b19zdWJ0bGVfdW5kZWZpbmVkIil9KHI/PyExKSx0aGlzLmNhY2hlPW5ldyBmYyh0aGlzLmxvZ2dlciksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10fWNyZWF0ZU5ld0d1aWQoKXtyZXR1cm4gb2EoKX1iYXNlNjRFbmNvZGUoZSl7cmV0dXJuIEZzKGUpfWJhc2U2NERlY29kZShlKXtyZXR1cm4gS3MoZSl9YmFzZTY0VXJsRW5jb2RlKGUpe3JldHVybiB4cyhlKX1lbmNvZGVLaWQoZSl7cmV0dXJuIHRoaXMuYmFzZTY0VXJsRW5jb2RlKEpTT04uc3RyaW5naWZ5KHtraWQ6ZX0pKX1hc3luYyBnZXRQdWJsaWNLZXlUaHVtYnByaW50KGUpe2NvbnN0IHQ9dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uc3RhcnRNZWFzdXJlbWVudChPci5DcnlwdG9PcHRzR2V0UHVibGljS2V5VGh1bWJwcmludCxlLmNvcnJlbGF0aW9uSWQpLHI9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoZWEsZSx0KX0oeWMuRVhUUkFDVEFCTEUseWMuUE9QX0tFWV9VU0FHRVMpLG49YXdhaXQgaWEoci5wdWJsaWNLZXkpLG89Q2Moe2U6bi5lLGt0eTpuLmt0eSxuOm4ubn0pLGk9YXdhaXQgdGhpcy5oYXNoU3RyaW5nKG8pLHM9YXdhaXQgaWEoci5wcml2YXRlS2V5KSxhPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJqd2siLGUsZWEsdCxyKX0ocywhMSxbInNpZ24iXSk7cmV0dXJuIGF3YWl0IHRoaXMuY2FjaGUuc2V0SXRlbShpLHtwcml2YXRlS2V5OmEscHVibGljS2V5OnIucHVibGljS2V5LHJlcXVlc3RNZXRob2Q6ZS5yZXNvdXJjZVJlcXVlc3RNZXRob2QscmVxdWVzdFVyaTplLnJlc291cmNlUmVxdWVzdFVyaX0pLHQmJnQuZW5kKHtzdWNjZXNzOiEwfSksaX1hc3luYyByZW1vdmVUb2tlbkJpbmRpbmdLZXkoZSl7YXdhaXQgdGhpcy5jYWNoZS5yZW1vdmVJdGVtKGUpO2lmKGF3YWl0IHRoaXMuY2FjaGUuY29udGFpbnNLZXkoZSkpdGhyb3cgbXQocnQpfWFzeW5jIGNsZWFyS2V5c3RvcmUoKXt0aGlzLmNhY2hlLmNsZWFySW5NZW1vcnkoKTt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuY2FjaGUuY2xlYXJQZXJzaXN0ZW50KCksITB9Y2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj90aGlzLmxvZ2dlci5lcnJvcihgQ2xlYXJpbmcga2V5c3RvcmUgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZS5tZXNzYWdlfWApOnRoaXMubG9nZ2VyLmVycm9yKCJDbGVhcmluZyBrZXlzdG9yZSBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIiksITF9fWFzeW5jIHNpZ25Kd3QoZSx0LHIsbil7Y29uc3Qgbz10aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5zdGFydE1lYXN1cmVtZW50KE9yLkNyeXB0b09wdHNTaWduSnd0LG4pLGk9YXdhaXQgdGhpcy5jYWNoZS5nZXRJdGVtKHQpO2lmKCFpKXRocm93IFppKE1pKTtjb25zdCBzPWF3YWl0IGlhKGkucHVibGljS2V5KSxhPUNjKHMpLGM9eHMoSlNPTi5zdHJpbmdpZnkoe2tpZDp0fSkpLGw9eHMoam8uZ2V0U2hySGVhZGVyU3RyaW5nKHsuLi5yPy5oZWFkZXIsYWxnOnMuYWxnLGtpZDpjfSkpO2UuY25mPXtqd2s6SlNPTi5wYXJzZShhKX07Y29uc3QgaD1gJHtsfS4ke3hzKEpTT04uc3RyaW5naWZ5KGUpKX1gLGQ9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGgpLHU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuc2lnbihlYSxlLHQpfShpLnByaXZhdGVLZXksZCksZz1gJHtofS4ke0JzKG5ldyBVaW50OEFycmF5KHUpKX1gO3JldHVybiBvJiZvLmVuZCh7c3VjY2VzczohMH0pLGd9YXN5bmMgaGFzaFN0cmluZyhlKXtyZXR1cm4gZ2EoZSl9fWZ1bmN0aW9uIENjKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlLE9iamVjdC5rZXlzKGUpLnNvcnQoKSl9eWMuUE9QX0tFWV9VU0FHRVM9WyJzaWduIiwidmVyaWZ5Il0seWMuRVhUUkFDVEFCTEU9ITA7Y29uc3Qgd2M9ODY0ZTUsdmM9IkxheCIsSWM9Ik5vbmUiO2NsYXNzIFRje2luaXRpYWxpemUoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9Z2V0SXRlbShlKXtjb25zdCB0PWAke2VuY29kZVVSSUNvbXBvbmVudChlKX1gLHI9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7Iik7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2NvbnN0IG49cltlXSxbbywuLi5pXT1kZWNvZGVVUklDb21wb25lbnQobikudHJpbSgpLnNwbGl0KCI9Iikscz1pLmpvaW4oIj0iKTtpZihvPT09dClyZXR1cm4gc31yZXR1cm4iIn1nZXRVc2VyRGF0YSgpe3Rocm93IG10KGN0KX1zZXRJdGVtKGUsdCxyLG49ITAsbz12Yyl7bGV0IGk9YCR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX07cGF0aD0vO1NhbWVTaXRlPSR7b307YDtpZihyKXtjb25zdCBlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IERhdGUscj1uZXcgRGF0ZSh0LmdldFRpbWUoKStlKndjKTtyZXR1cm4gci50b1VUQ1N0cmluZygpfShyKTtpKz1gZXhwaXJlcz0ke2V9O2B9KG58fG89PT1JYykmJihpKz0iU2VjdXJlOyIpLGRvY3VtZW50LmNvb2tpZT1pfWFzeW5jIHNldFVzZXJEYXRhKCl7cmV0dXJuIFByb21pc2UucmVqZWN0KG10KGN0KSl9cmVtb3ZlSXRlbShlKXt0aGlzLnNldEl0ZW0oZSwiIiwtMSl9Z2V0S2V5cygpe2NvbnN0IGU9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7IiksdD1bXTtyZXR1cm4gZS5mb3JFYWNoKChlPT57Y29uc3Qgcj1kZWNvZGVVUklDb21wb25lbnQoZSkudHJpbSgpLnNwbGl0KCI9Iik7dC5wdXNoKHJbMF0pfSkpLHR9Y29udGFpbnNLZXkoZSl7cmV0dXJuIHRoaXMuZ2V0S2V5cygpLmluY2x1ZGVzKGUpfWRlY3J5cHREYXRhKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKX19ZnVuY3Rpb24gQWMoZSx0KXtjb25zdCByPWUuZ2V0SXRlbShlYyh0KSk7cmV0dXJuIHI/SlNPTi5wYXJzZShyKTpbXX1mdW5jdGlvbiBrYyhlLHQscil7Y29uc3Qgbj10LmdldEl0ZW0odGMoZSxyKSk7aWYobil7Y29uc3QgZT1KU09OLnBhcnNlKG4pO2lmKGUmJmUuaGFzT3duUHJvcGVydHkoImlkVG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWNjZXNzVG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVmcmVzaFRva2VuIikpcmV0dXJuIGV9cmV0dXJue2lkVG9rZW46W10sYWNjZXNzVG9rZW46W10scmVmcmVzaFRva2VuOltdfX1mdW5jdGlvbiBTYyhlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgiaWQiKSYmZS5oYXNPd25Qcm9wZXJ0eSgibm9uY2UiKSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YSIpfWNvbnN0IGJjPSJtc2FsLmNhY2hlLmVuY3J5cHRpb24iO2NsYXNzIEVje2NvbnN0cnVjdG9yKGUsdCxyKXtpZighd2luZG93LmxvY2FsU3RvcmFnZSl0aHJvdyBJYShwYSk7dGhpcy5tZW1vcnlTdG9yYWdlPW5ldyBtYyx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMuY2xpZW50SWQ9ZSx0aGlzLmxvZ2dlcj10LHRoaXMucGVyZm9ybWFuY2VDbGllbnQ9cix0aGlzLmJyb2FkY2FzdD1uZXcgQnJvYWRjYXN0Q2hhbm5lbCgibXNhbC5icm9hZGNhc3QuY2FjaGUiKX1hc3luYyBpbml0aWFsaXplKGUpe2NvbnN0IHQ9bmV3IFRjLHI9dC5nZXRJdGVtKGJjKTtsZXQgbj17a2V5OiIiLGlkOiIifTtpZihyKXRyeXtuPUpTT04ucGFyc2Uocil9Y2F0Y2goZSl7fWlmKG4ua2V5JiZuLmlkKXtjb25zdCB0PU5uKEdzLE9yLkJhc2U2NERlY29kZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKG4ua2V5KTt0aGlzLmVuY3J5cHRpb25Db29raWU9e2lkOm4uaWQsa2V5OmF3YWl0IFVuKGxhLE9yLkdlbmVyYXRlSEtERix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKHQpfX1lbHNle2NvbnN0IHI9b2EoKSxuPWF3YWl0IFVuKGNhLE9yLkdlbmVyYXRlQmFzZUtleSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKCksbz1ObihCcyxPci5VcmxFbmNvZGVBcnIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlKShuZXcgVWludDhBcnJheShuKSk7dGhpcy5lbmNyeXB0aW9uQ29va2llPXtpZDpyLGtleTphd2FpdCBVbihsYSxPci5HZW5lcmF0ZUhLREYsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlKShuKX07Y29uc3QgaT17aWQ6cixrZXk6b307dC5zZXRJdGVtKGJjLEpTT04uc3RyaW5naWZ5KGkpLDAsITAsSWMpfWF3YWl0IFVuKHRoaXMuaW1wb3J0RXhpc3RpbmdDYWNoZS5iaW5kKHRoaXMpLE9yLkltcG9ydEV4aXN0aW5nQ2FjaGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlKShlKSx0aGlzLmJyb2FkY2FzdC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnVwZGF0ZUNhY2hlLmJpbmQodGhpcykpLHRoaXMuaW5pdGlhbGl6ZWQ9ITB9Z2V0SXRlbShlKXtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpfWdldFVzZXJEYXRhKGUpe2lmKCF0aGlzLmluaXRpYWxpemVkKXRocm93IFppKEJpKTtyZXR1cm4gdGhpcy5tZW1vcnlTdG9yYWdlLmdldEl0ZW0oZSl9YXN5bmMgZGVjcnlwdERhdGEoZSx0LHIpe2lmKCF0aGlzLmluaXRpYWxpemVkfHwhdGhpcy5lbmNyeXB0aW9uQ29va2llKXRocm93IFppKEJpKTtpZih0LmlkIT09dGhpcy5lbmNyeXB0aW9uQ29va2llLmlkKXJldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7ZW5jcnlwdGVkQ2FjaGVFeHBpcmVkQ291bnQ6MX0sciksbnVsbDtjb25zdCBuPWF3YWl0IFVuKHVhLE9yLkRlY3J5cHQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxyKSh0aGlzLmVuY3J5cHRpb25Db29raWUua2V5LHQubm9uY2UsdGhpcy5nZXRDb250ZXh0KGUpLHQuZGF0YSk7aWYoIW4pcmV0dXJuIG51bGw7dHJ5e3JldHVybnsuLi5KU09OLnBhcnNlKG4pLGxhc3RVcGRhdGVkQXQ6dC5sYXN0VXBkYXRlZEF0fX1jYXRjaChlKXtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe2VuY3J5cHRlZENhY2hlQ29ycnVwdGlvbkNvdW50OjF9LHIpLG51bGx9fXNldEl0ZW0oZSx0KXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSx0KX1hc3luYyBzZXRVc2VyRGF0YShlLHQscixuLG8pe2lmKCF0aGlzLmluaXRpYWxpemVkfHwhdGhpcy5lbmNyeXB0aW9uQ29va2llKXRocm93IFppKEJpKTtpZihvKXRoaXMuc2V0SXRlbShlLHQpO2Vsc2V7Y29uc3R7ZGF0YTpvLG5vbmNlOml9PWF3YWl0IFVuKGRhLE9yLkVuY3J5cHQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxyKSh0aGlzLmVuY3J5cHRpb25Db29raWUua2V5LHQsdGhpcy5nZXRDb250ZXh0KGUpKSxzPXtpZDp0aGlzLmVuY3J5cHRpb25Db29raWUuaWQsbm9uY2U6aSxkYXRhOm8sbGFzdFVwZGF0ZWRBdDpufTt0aGlzLnNldEl0ZW0oZSxKU09OLnN0cmluZ2lmeShzKSl9dGhpcy5tZW1vcnlTdG9yYWdlLnNldEl0ZW0oZSx0KSx0aGlzLmJyb2FkY2FzdC5wb3N0TWVzc2FnZSh7a2V5OmUsdmFsdWU6dCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dChlKX0pfXJlbW92ZUl0ZW0oZSl7dGhpcy5tZW1vcnlTdG9yYWdlLmNvbnRhaW5zS2V5KGUpJiYodGhpcy5tZW1vcnlTdG9yYWdlLnJlbW92ZUl0ZW0oZSksdGhpcy5icm9hZGNhc3QucG9zdE1lc3NhZ2Uoe2tleTplLHZhbHVlOm51bGwsY29udGV4dDp0aGlzLmdldENvbnRleHQoZSl9KSksd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXMod2luZG93LmxvY2FsU3RvcmFnZSl9Y29udGFpbnNLZXkoZSl7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuaGFzT3duUHJvcGVydHkoZSl9Y2xlYXIoKXt0aGlzLm1lbW9yeVN0b3JhZ2UuY2xlYXIoKTtBYyh0aGlzKS5mb3JFYWNoKChlPT50aGlzLnJlbW92ZUl0ZW0oZSkpKTtjb25zdCBlPWtjKHRoaXMuY2xpZW50SWQsdGhpcyk7ZS5pZFRva2VuLmZvckVhY2goKGU9PnRoaXMucmVtb3ZlSXRlbShlKSkpLGUuYWNjZXNzVG9rZW4uZm9yRWFjaCgoZT0+dGhpcy5yZW1vdmVJdGVtKGUpKSksZS5yZWZyZXNoVG9rZW4uZm9yRWFjaCgoZT0+dGhpcy5yZW1vdmVJdGVtKGUpKSksdGhpcy5nZXRLZXlzKCkuZm9yRWFjaCgoZT0+eyhlLnN0YXJ0c1dpdGgoUWEpfHwtMSE9PWUuaW5kZXhPZih0aGlzLmNsaWVudElkKSkmJnRoaXMucmVtb3ZlSXRlbShlKX0pKX1hc3luYyBpbXBvcnRFeGlzdGluZ0NhY2hlKGUpe2lmKCF0aGlzLmVuY3J5cHRpb25Db29raWUpcmV0dXJuO2xldCB0PUFjKHRoaXMpO3Q9YXdhaXQgdGhpcy5pbXBvcnRBcnJheSh0LGUpLHQubGVuZ3RoP3RoaXMuc2V0SXRlbShlYygpLEpTT04uc3RyaW5naWZ5KHQpKTp0aGlzLnJlbW92ZUl0ZW0oZWMoKSk7Y29uc3Qgcj1rYyh0aGlzLmNsaWVudElkLHRoaXMpO3IuaWRUb2tlbj1hd2FpdCB0aGlzLmltcG9ydEFycmF5KHIuaWRUb2tlbixlKSxyLmFjY2Vzc1Rva2VuPWF3YWl0IHRoaXMuaW1wb3J0QXJyYXkoci5hY2Nlc3NUb2tlbixlKSxyLnJlZnJlc2hUb2tlbj1hd2FpdCB0aGlzLmltcG9ydEFycmF5KHIucmVmcmVzaFRva2VuLGUpLHIuaWRUb2tlbi5sZW5ndGh8fHIuYWNjZXNzVG9rZW4ubGVuZ3RofHxyLnJlZnJlc2hUb2tlbi5sZW5ndGg/dGhpcy5zZXRJdGVtKHRjKHRoaXMuY2xpZW50SWQpLEpTT04uc3RyaW5naWZ5KHIpKTp0aGlzLnJlbW92ZUl0ZW0odGModGhpcy5jbGllbnRJZCkpfWFzeW5jIGdldEl0ZW1Gcm9tRW5jcnlwdGVkQ2FjaGUoZSx0KXtpZighdGhpcy5lbmNyeXB0aW9uQ29va2llKXJldHVybiBudWxsO2NvbnN0IHI9dGhpcy5nZXRJdGVtKGUpO2lmKCFyKXJldHVybiBudWxsO2xldCBuO3RyeXtuPUpTT04ucGFyc2Uocil9Y2F0Y2goZSl7cmV0dXJuIG51bGx9cmV0dXJuIFNjKG4pP24uaWQhPT10aGlzLmVuY3J5cHRpb25Db29raWUuaWQ/KHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtlbmNyeXB0ZWRDYWNoZUV4cGlyZWRDb3VudDoxfSx0KSxudWxsKToodGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe2VuY3J5cHRlZENhY2hlQ291bnQ6MX0sdCksVW4odWEsT3IuRGVjcnlwdCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHRoaXMuZW5jcnlwdGlvbkNvb2tpZS5rZXksbi5ub25jZSx0aGlzLmdldENvbnRleHQoZSksbi5kYXRhKSk6KHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHt1bmVuY3J5cHRlZENhY2hlQ291bnQ6MX0sdCkscil9YXN5bmMgaW1wb3J0QXJyYXkoZSx0KXtjb25zdCByPVtdLG49W107cmV0dXJuIGUuZm9yRWFjaCgoZT0+e2NvbnN0IG89dGhpcy5nZXRJdGVtRnJvbUVuY3J5cHRlZENhY2hlKGUsdCkudGhlbigodD0+e3Q/KHRoaXMubWVtb3J5U3RvcmFnZS5zZXRJdGVtKGUsdCksci5wdXNoKGUpKTp0aGlzLnJlbW92ZUl0ZW0oZSl9KSk7bi5wdXNoKG8pfSkpLGF3YWl0IFByb21pc2UuYWxsKG4pLHJ9Z2V0Q29udGV4dChlKXtsZXQgdD0iIjtyZXR1cm4gZS5pbmNsdWRlcyh0aGlzLmNsaWVudElkKSYmKHQ9dGhpcy5jbGllbnRJZCksdH11cGRhdGVDYWNoZShlKXt0aGlzLmxvZ2dlci50cmFjZSgiVXBkYXRpbmcgaW50ZXJuYWwgY2FjaGUgZnJvbSBicm9hZGNhc3QgZXZlbnQiKTtjb25zdCB0PXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5Mb2NhbFN0b3JhZ2VVcGRhdGVkKTt0LmFkZCh7aXNCYWNrZ3JvdW5kOiEwfSk7Y29uc3R7a2V5OnIsdmFsdWU6bixjb250ZXh0Om99PWUuZGF0YTtyZXR1cm4gcj9vJiZvIT09dGhpcy5jbGllbnRJZD8odGhpcy5sb2dnZXIudHJhY2UoYElnbm9yaW5nIGJyb2FkY2FzdCBldmVudCBmcm9tIGNsaWVudElkOiAke299YCksdm9pZCB0LmVuZCh7c3VjY2VzczohMSxlcnJvckNvZGU6ImNvbnRleHRNaXNtYXRjaCJ9KSk6KG4/KHRoaXMubWVtb3J5U3RvcmFnZS5zZXRJdGVtKHIsbiksdGhpcy5sb2dnZXIudmVyYm9zZSgiVXBkYXRlZCBpdGVtIGluIGludGVybmFsIGNhY2hlIikpOih0aGlzLm1lbW9yeVN0b3JhZ2UucmVtb3ZlSXRlbShyKSx0aGlzLmxvZ2dlci52ZXJib3NlKCJSZW1vdmVkIGl0ZW0gZnJvbSBpbnRlcm5hbCBjYWNoZSIpKSx2b2lkIHQuZW5kKHtzdWNjZXNzOiEwfSkpOih0aGlzLmxvZ2dlci5lcnJvcigiQnJvYWRjYXN0IGV2ZW50IG1pc3Npbmcga2V5Iiksdm9pZCB0LmVuZCh7c3VjY2VzczohMSxlcnJvckNvZGU6Im5vS2V5In0pKX19Y2xhc3MgUmN7Y29uc3RydWN0b3IoKXtpZighd2luZG93LnNlc3Npb25TdG9yYWdlKXRocm93IElhKHBhKX1hc3luYyBpbml0aWFsaXplKCl7fWdldEl0ZW0oZSl7cmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGUpfWdldFVzZXJEYXRhKGUpe3JldHVybiB0aGlzLmdldEl0ZW0oZSl9c2V0SXRlbShlLHQpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsdCl9YXN5bmMgc2V0VXNlckRhdGEoZSx0KXt0aGlzLnNldEl0ZW0oZSx0KX1yZW1vdmVJdGVtKGUpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXMod2luZG93LnNlc3Npb25TdG9yYWdlKX1jb250YWluc0tleShlKXtyZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLmhhc093blByb3BlcnR5KGUpfWRlY3J5cHREYXRhKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKX19Y29uc3QgX2M9e0lOSVRJQUxJWkVfU1RBUlQ6Im1zYWw6aW5pdGlhbGl6ZVN0YXJ0IixJTklUSUFMSVpFX0VORDoibXNhbDppbml0aWFsaXplRW5kIixBQ0NPVU5UX0FEREVEOiJtc2FsOmFjY291bnRBZGRlZCIsQUNDT1VOVF9SRU1PVkVEOiJtc2FsOmFjY291bnRSZW1vdmVkIixBQ1RJVkVfQUNDT1VOVF9DSEFOR0VEOiJtc2FsOmFjdGl2ZUFjY291bnRDaGFuZ2VkIixMT0dJTl9TVEFSVDoibXNhbDpsb2dpblN0YXJ0IixMT0dJTl9TVUNDRVNTOiJtc2FsOmxvZ2luU3VjY2VzcyIsTE9HSU5fRkFJTFVSRToibXNhbDpsb2dpbkZhaWx1cmUiLEFDUVVJUkVfVE9LRU5fU1RBUlQ6Im1zYWw6YWNxdWlyZVRva2VuU3RhcnQiLEFDUVVJUkVfVE9LRU5fU1VDQ0VTUzoibXNhbDphY3F1aXJlVG9rZW5TdWNjZXNzIixBQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6Im1zYWw6YWNxdWlyZVRva2VuRmFpbHVyZSIsQUNRVUlSRV9UT0tFTl9ORVRXT1JLX1NUQVJUOiJtc2FsOmFjcXVpcmVUb2tlbkZyb21OZXR3b3JrU3RhcnQiLFNTT19TSUxFTlRfU1RBUlQ6Im1zYWw6c3NvU2lsZW50U3RhcnQiLFNTT19TSUxFTlRfU1VDQ0VTUzoibXNhbDpzc29TaWxlbnRTdWNjZXNzIixTU09fU0lMRU5UX0ZBSUxVUkU6Im1zYWw6c3NvU2lsZW50RmFpbHVyZSIsQUNRVUlSRV9UT0tFTl9CWV9DT0RFX1NUQVJUOiJtc2FsOmFjcXVpcmVUb2tlbkJ5Q29kZVN0YXJ0IixBQ1FVSVJFX1RPS0VOX0JZX0NPREVfU1VDQ0VTUzoibXNhbDphY3F1aXJlVG9rZW5CeUNvZGVTdWNjZXNzIixBQ1FVSVJFX1RPS0VOX0JZX0NPREVfRkFJTFVSRToibXNhbDphY3F1aXJlVG9rZW5CeUNvZGVGYWlsdXJlIixIQU5ETEVfUkVESVJFQ1RfU1RBUlQ6Im1zYWw6aGFuZGxlUmVkaXJlY3RTdGFydCIsSEFORExFX1JFRElSRUNUX0VORDoibXNhbDpoYW5kbGVSZWRpcmVjdEVuZCIsUE9QVVBfT1BFTkVEOiJtc2FsOnBvcHVwT3BlbmVkIixMT0dPVVRfU1RBUlQ6Im1zYWw6bG9nb3V0U3RhcnQiLExPR09VVF9TVUNDRVNTOiJtc2FsOmxvZ291dFN1Y2Nlc3MiLExPR09VVF9GQUlMVVJFOiJtc2FsOmxvZ291dEZhaWx1cmUiLExPR09VVF9FTkQ6Im1zYWw6bG9nb3V0RW5kIixSRVNUT1JFX0ZST01fQkZDQUNIRToibXNhbDpyZXN0b3JlRnJvbUJGQ2FjaGUiLEJST0tFUl9DT05ORUNUSU9OX0VTVEFCTElTSEVEOiJtc2FsOmJyb2tlckNvbm5lY3Rpb25Fc3RhYmxpc2hlZCJ9O2Z1bmN0aW9uIFBjKGUsdCl7Y29uc3Qgcj1lLmluZGV4T2YodCk7cj4tMSYmZS5zcGxpY2UociwxKX1jbGFzcyBNYyBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMpe3N1cGVyKGUscixuLG8scyksdGhpcy5jYWNoZUNvbmZpZz10LHRoaXMubG9nZ2VyPW4sdGhpcy5pbnRlcm5hbFN0b3JhZ2U9bmV3IG1jLHRoaXMuYnJvd3NlclN0b3JhZ2U9T2MoZSx0LmNhY2hlTG9jYXRpb24sbixvKSx0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZT1PYyhlLHQudGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbixuLG8pLHRoaXMuY29va2llU3RvcmFnZT1uZXcgVGMsdGhpcy5ldmVudEhhbmRsZXI9aX1hc3luYyBpbml0aWFsaXplKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtjYWNoZUxvY2F0aW9uOnRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbixjYWNoZVJldGVudGlvbkRheXM6dGhpcy5jYWNoZUNvbmZpZy5jYWNoZVJldGVudGlvbkRheXN9LGUpLGF3YWl0IHRoaXMuYnJvd3NlclN0b3JhZ2UuaW5pdGlhbGl6ZShlKSxhd2FpdCB0aGlzLm1pZ3JhdGVFeGlzdGluZ0NhY2hlKGUpLHRoaXMudHJhY2tWZXJzaW9uQ2hhbmdlcyhlKX1hc3luYyBtaWdyYXRlRXhpc3RpbmdDYWNoZShlKXtsZXQgdD1BYyh0aGlzLmJyb3dzZXJTdG9yYWdlKSxyPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSk7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe3ByZU1pZ3JhdGVBY250Q291bnQ6dC5sZW5ndGgscHJlTWlncmF0ZUFUQ291bnQ6ci5hY2Nlc3NUb2tlbi5sZW5ndGgscHJlTWlncmF0ZUlUQ291bnQ6ci5pZFRva2VuLmxlbmd0aCxwcmVNaWdyYXRlUlRDb3VudDpyLnJlZnJlc2hUb2tlbi5sZW5ndGh9LGUpO2ZvcihsZXQgdD0wO3Q8Mjt0Kyspe2NvbnN0IHI9dDthd2FpdCB0aGlzLnJlbW92ZVN0YWxlQWNjb3VudHModCxyLGUpfWZvcihsZXQgdD0wO3Q8Mjt0Kyspe2NvbnN0IHI9dDthd2FpdCB0aGlzLm1pZ3JhdGVJZFRva2Vucyh0LHIsZSl9Y29uc3Qgbj10aGlzLmdldEtNU0lWYWx1ZXMoKTtmb3IobGV0IHQ9MDt0PDI7dCsrKWF3YWl0IHRoaXMubWlncmF0ZUFjY2Vzc1Rva2Vucyh0LG4sZSksYXdhaXQgdGhpcy5taWdyYXRlUmVmcmVzaFRva2Vucyh0LG4sZSk7dD1BYyh0aGlzLmJyb3dzZXJTdG9yYWdlKSxyPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe3Bvc3RNaWdyYXRlQWNudENvdW50OnQubGVuZ3RoLHBvc3RNaWdyYXRlQVRDb3VudDpyLmFjY2Vzc1Rva2VuLmxlbmd0aCxwb3N0TWlncmF0ZUlUQ291bnQ6ci5pZFRva2VuLmxlbmd0aCxwb3N0TWlncmF0ZVJUQ291bnQ6ci5yZWZyZXNoVG9rZW4ubGVuZ3RofSxlKX1hc3luYyB1cGRhdGVPbGRFbnRyeShlLHQpe2NvbnN0IHI9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGUpLG49dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihyfHwiIik7aWYoIW4pcmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShlKSxudWxsO2lmKG4ubGFzdFVwZGF0ZWRBdCl7aWYoRm4obi5sYXN0VXBkYXRlZEF0LHRoaXMuY2FjaGVDb25maWcuY2FjaGVSZXRlbnRpb25EYXlzKSlyZXR1cm4gdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKGUpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtleHBpcmVkQ2FjaGVSZW1vdmVkQ291bnQ6MX0sdCksbnVsbH1lbHNlIG4ubGFzdFVwZGF0ZWRBdD1EYXRlLm5vdygpLnRvU3RyaW5nKCksdGhpcy5zZXRJdGVtKGUsSlNPTi5zdHJpbmdpZnkobiksdCk7Y29uc3Qgbz1TYyhuKT9hd2FpdCB0aGlzLmJyb3dzZXJTdG9yYWdlLmRlY3J5cHREYXRhKGUsbix0KTpuO3JldHVybiBvJiZRbihvKT8oam4obyl8fFduKG8pKSYmby5leHBpcmVzT24mJkJuKG8uZXhwaXJlc09uLDMwMCk/KHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShlKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7ZXhwaXJlZENhY2hlUmVtb3ZlZENvdW50OjF9LHQpLG51bGwpOm86KHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtpbnZhbGlkQ2FjaGVDb3VudDoxfSx0KSxudWxsKX1hc3luYyByZW1vdmVTdGFsZUFjY291bnRzKGUsdCxyKXtjb25zdCBuPUFjKHRoaXMuYnJvd3NlclN0b3JhZ2UsZSk7aWYoMCE9PW4ubGVuZ3RoKXtmb3IoY29uc3QgZSBvZlsuLi5uXSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe29sZEFjbnRDb3VudDoxfSxyKTtjb25zdCBvPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SXRlbShlKSxpPXRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24ob3x8IiIpO2k/aS5sYXN0VXBkYXRlZEF0P0ZuKGkubGFzdFVwZGF0ZWRBdCx0aGlzLmNhY2hlQ29uZmlnLmNhY2hlUmV0ZW50aW9uRGF5cykmJihhd2FpdCB0aGlzLnJlbW92ZUFjY291bnRPbGRTY2hlbWEoZSxpLHQsciksUGMobixlKSk6KGkubGFzdFVwZGF0ZWRBdD1EYXRlLm5vdygpLnRvU3RyaW5nKCksdGhpcy5zZXRJdGVtKGUsSlNPTi5zdHJpbmdpZnkoaSkscikpOlBjKG4sZSl9dGhpcy5zZXRBY2NvdW50S2V5cyhuLHIsZSl9fWFzeW5jIHJlbW92ZUFjY291bnRPbGRTY2hlbWEoZSx0LHIsbil7Y29uc3Qgbz1TYyh0KT9hd2FpdCB0aGlzLmJyb3dzZXJTdG9yYWdlLmRlY3J5cHREYXRhKGUsdCxuKTp0LGk9bz8uaG9tZUFjY291bnRJZDtpZihpKXtjb25zdCBlPXRoaXMuZ2V0VG9rZW5LZXlzKHIpO1suLi5lLmlkVG9rZW5dLmZpbHRlcigoZT0+ZS5pbmNsdWRlcyhpKSkpLmZvckVhY2goKHQ9Pnt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0odCksUGMoZS5pZFRva2VuLHQpfSkpLFsuLi5lLmFjY2Vzc1Rva2VuXS5maWx0ZXIoKGU9PmUuaW5jbHVkZXMoaSkpKS5mb3JFYWNoKCh0PT57dGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKHQpLFBjKGUuYWNjZXNzVG9rZW4sdCl9KSksWy4uLmUucmVmcmVzaFRva2VuXS5maWx0ZXIoKGU9PmUuaW5jbHVkZXMoaSkpKS5mb3JFYWNoKCh0PT57dGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKHQpLFBjKGUucmVmcmVzaFRva2VuLHQpfSkpLHRoaXMuc2V0VG9rZW5LZXlzKGUsbixyKX10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7ZXhwaXJlZEFjbnRSZW1vdmVkQ291bnQ6MX0sbiksdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEtNU0lWYWx1ZXMoKXtjb25zdCBlPXt9LHQ9dGhpcy5nZXRUb2tlbktleXMoKS5pZFRva2VuO2Zvcihjb25zdCByIG9mIHQpe2NvbnN0IHQ9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRVc2VyRGF0YShyKTtpZih0KXtjb25zdCByPUpTT04ucGFyc2UodCksbj1kcihyLnNlY3JldCxLcyk7biYmKGVbci5ob21lQWNjb3VudElkXT11cihuKSl9fXJldHVybiBlfWFzeW5jIG1pZ3JhdGVJZFRva2VucyhlLHQscil7Y29uc3Qgbj1rYyh0aGlzLmNsaWVudElkLHRoaXMuYnJvd3NlclN0b3JhZ2UsZSk7aWYoMD09PW4uaWRUb2tlbi5sZW5ndGgpcmV0dXJuO2NvbnN0IG89a2ModGhpcy5jbGllbnRJZCx0aGlzLmJyb3dzZXJTdG9yYWdlLDIpLGk9QWModGhpcy5icm93c2VyU3RvcmFnZSkscz1BYyh0aGlzLmJyb3dzZXJTdG9yYWdlLHQpO2Zvcihjb25zdCBlIG9mWy4uLm4uaWRUb2tlbl0pe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtvbGRJVENvdW50OjF9LHIpO2NvbnN0IHQ9YXdhaXQgdGhpcy51cGRhdGVPbGRFbnRyeShlLHIpO2lmKCF0KXtQYyhuLmlkVG9rZW4sZSk7Y29udGludWV9Y29uc3QgYT1pLmZpbmQoKGU9PmUuaW5jbHVkZXModC5ob21lQWNjb3VudElkKSkpLGM9cy5maW5kKChlPT5lLmluY2x1ZGVzKHQuaG9tZUFjY291bnRJZCkpKTtsZXQgbD1udWxsO2lmKGEpbD10aGlzLmdldEFjY291bnQoYSxyKTtlbHNlIGlmKGMpe2NvbnN0IGU9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGMpLHQ9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihlfHwiIik7bD10JiZTYyh0KT9hd2FpdCB0aGlzLmJyb3dzZXJTdG9yYWdlLmRlY3J5cHREYXRhKGMsdCxyKTp0fWlmKCFsKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7c2tpcElUTWlncmF0ZUNvdW50OjF9LHIpO2NvbnRpbnVlfWNvbnN0IGg9ZHIodC5zZWNyZXQsS3MpLGQ9dGhpcy5nZW5lcmF0ZUNyZWRlbnRpYWxLZXkodCksdT10aGlzLmdldElkVG9rZW5DcmVkZW50aWFsKGQsciksZz1PYmplY3Qua2V5cyhoKS5pbmNsdWRlcygic2lnbmluX3N0YXRlIikscD11JiZPYmplY3Qua2V5cyhkcih1LnNlY3JldCxLcyl8fHt9KS5pbmNsdWRlcygic2lnbmluX3N0YXRlIik7aWYoIXV8fHQubGFzdFVwZGF0ZWRBdD51Lmxhc3RVcGRhdGVkQXQmJihnfHwhcCkpe2NvbnN0IGU9bC50ZW5hbnRQcm9maWxlc3x8W10sbj1jcihoKXx8bC5yZWFsbTtpZihuJiYhZS5maW5kKChlPT5lLnRlbmFudElkPT09bikpKXtjb25zdCB0PXJyKGwuaG9tZUFjY291bnRJZCxsLmxvY2FsQWNjb3VudElkLG4saCk7ZS5wdXNoKHQpfWwudGVuYW50UHJvZmlsZXM9ZTtjb25zdCBzPXRoaXMuZ2VuZXJhdGVBY2NvdW50S2V5KGhyLmdldEFjY291bnRJbmZvKGwpKSxhPXVyKGgpO2F3YWl0IHRoaXMuc2V0VXNlckRhdGEocyxKU09OLnN0cmluZ2lmeShsKSxyLGwubGFzdFVwZGF0ZWRBdCxhKSxpLmluY2x1ZGVzKHMpfHxpLnB1c2gocyksYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShkLEpTT04uc3RyaW5naWZ5KHQpLHIsdC5sYXN0VXBkYXRlZEF0LGEpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHttaWdyYXRlZElUQ291bnQ6MX0sciksby5pZFRva2VuLnB1c2goZCl9fXRoaXMuc2V0VG9rZW5LZXlzKG4scixlKSx0aGlzLnNldFRva2VuS2V5cyhvLHIpLHRoaXMuc2V0QWNjb3VudEtleXMoaSxyKX1hc3luYyBtaWdyYXRlQWNjZXNzVG9rZW5zKGUsdCxyKXtjb25zdCBuPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSxlKTtpZigwPT09bi5hY2Nlc3NUb2tlbi5sZW5ndGgpcmV0dXJuO2NvbnN0IG89a2ModGhpcy5jbGllbnRJZCx0aGlzLmJyb3dzZXJTdG9yYWdlLDIpO2Zvcihjb25zdCBlIG9mWy4uLm4uYWNjZXNzVG9rZW5dKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7b2xkQVRDb3VudDoxfSxyKTtjb25zdCBpPWF3YWl0IHRoaXMudXBkYXRlT2xkRW50cnkoZSxyKTtpZighaSl7UGMobi5hY2Nlc3NUb2tlbixlKTtjb250aW51ZX1pZighT2JqZWN0LmtleXModCkuaW5jbHVkZXMoaS5ob21lQWNjb3VudElkKSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe3NraXBBVE1pZ3JhdGVDb3VudDoxfSxyKTtjb250aW51ZX1jb25zdCBzPXRoaXMuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGkpLGE9dFtpLmhvbWVBY2NvdW50SWRdO2lmKG8uYWNjZXNzVG9rZW4uaW5jbHVkZXMocykpe2NvbnN0IGU9dGhpcy5nZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwocyxyKTsoIWV8fGkubGFzdFVwZGF0ZWRBdD5lLmxhc3RVcGRhdGVkQXQpJiYoYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShzLEpTT04uc3RyaW5naWZ5KGkpLHIsaS5sYXN0VXBkYXRlZEF0LGEpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHttaWdyYXRlZEFUQ291bnQ6MX0scikpfWVsc2UgYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShzLEpTT04uc3RyaW5naWZ5KGkpLHIsaS5sYXN0VXBkYXRlZEF0LGEpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHttaWdyYXRlZEFUQ291bnQ6MX0sciksby5hY2Nlc3NUb2tlbi5wdXNoKHMpfXRoaXMuc2V0VG9rZW5LZXlzKG4scixlKSx0aGlzLnNldFRva2VuS2V5cyhvLHIpfWFzeW5jIG1pZ3JhdGVSZWZyZXNoVG9rZW5zKGUsdCxyKXtjb25zdCBuPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSxlKTtpZigwPT09bi5yZWZyZXNoVG9rZW4ubGVuZ3RoKXJldHVybjtjb25zdCBvPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSwyKTtmb3IoY29uc3QgZSBvZlsuLi5uLnJlZnJlc2hUb2tlbl0pe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtvbGRSVENvdW50OjF9LHIpO2NvbnN0IGk9YXdhaXQgdGhpcy51cGRhdGVPbGRFbnRyeShlLHIpO2lmKCFpKXtQYyhuLnJlZnJlc2hUb2tlbixlKTtjb250aW51ZX1pZighT2JqZWN0LmtleXModCkuaW5jbHVkZXMoaS5ob21lQWNjb3VudElkKSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe3NraXBSVE1pZ3JhdGVDb3VudDoxfSxyKTtjb250aW51ZX1jb25zdCBzPXRoaXMuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGkpLGE9dFtpLmhvbWVBY2NvdW50SWRdO2lmKG8ucmVmcmVzaFRva2VuLmluY2x1ZGVzKHMpKXtjb25zdCBlPXRoaXMuZ2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbChzLHIpOyghZXx8aS5sYXN0VXBkYXRlZEF0PmUubGFzdFVwZGF0ZWRBdCkmJihhd2FpdCB0aGlzLnNldFVzZXJEYXRhKHMsSlNPTi5zdHJpbmdpZnkoaSkscixpLmxhc3RVcGRhdGVkQXQsYSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe21pZ3JhdGVkUlRDb3VudDoxfSxyKSl9ZWxzZSBhd2FpdCB0aGlzLnNldFVzZXJEYXRhKHMsSlNPTi5zdHJpbmdpZnkoaSkscixpLmxhc3RVcGRhdGVkQXQsYSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe21pZ3JhdGVkUlRDb3VudDoxfSxyKSxvLnJlZnJlc2hUb2tlbi5wdXNoKHMpfXRoaXMuc2V0VG9rZW5LZXlzKG4scixlKSx0aGlzLnNldFRva2VuS2V5cyhvLHIpfXRyYWNrVmVyc2lvbkNoYW5nZXMoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0oWWEpO3QmJih0aGlzLmxvZ2dlci5pbmZvKGBNU0FMLmpzIHdhcyBsYXN0IGluaXRpYWxpemVkIGJ5IHZlcnNpb246ICR7dH1gKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7cHJldmlvdXNMaWJyYXJ5VmVyc2lvbjp0fSxlKSksdCE9PSRhJiZ0aGlzLnNldEl0ZW0oWWEsJGEsZSl9dmFsaWRhdGVBbmRQYXJzZUpzb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e2NvbnN0IHQ9SlNPTi5wYXJzZShlKTtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0P3Q6bnVsbH1jYXRjaChlKXtyZXR1cm4gbnVsbH19c2V0SXRlbShlLHQscil7Y29uc3Qgbj1uZXcgQXJyYXkoMykuZmlsbCgwKSxvPVtdO2ZvcihsZXQgaT0wO2k8PTIwO2krKyl0cnl7aWYodGhpcy5icm93c2VyU3RvcmFnZS5zZXRJdGVtKGUsdCksaT4wKWZvcihsZXQgZT0wO2U8PTI7ZSsrKXtjb25zdCB0PW4uc2xpY2UoMCxlKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApO2lmKHQ+PWkpYnJlYWs7Y29uc3Qgcz1pPnQrbltlXT90K25bZV06aTtpPnQmJm5bZV0+MCYmdGhpcy5yZW1vdmVBY2Nlc3NUb2tlbktleXMoby5zbGljZSh0LHMpLHIsZSl9YnJlYWt9Y2F0Y2gocyl7Y29uc3QgYT1fcihzKTtpZighKGEuZXJyb3JDb2RlPT09U3ImJmk8MjApKXRocm93IGE7aWYoIW8ubGVuZ3RoKWZvcihsZXQgcj0wO3I8PTI7cisrKWlmKGU9PT10Yyh0aGlzLmNsaWVudElkLHIpKXtjb25zdCBlPUpTT04ucGFyc2UodCkuYWNjZXNzVG9rZW47by5wdXNoKC4uLmUpLG5bcl09ZS5sZW5ndGh9ZWxzZXtjb25zdCBlPXRoaXMuZ2V0VG9rZW5LZXlzKHIpLmFjY2Vzc1Rva2VuO28ucHVzaCguLi5lKSxuW3JdPWUubGVuZ3RofWlmKG8ubGVuZ3RoPD1pKXRocm93IGE7dGhpcy5yZW1vdmVBY2Nlc3NUb2tlbihvW2ldLHIsITEpfX1hc3luYyBzZXRVc2VyRGF0YShlLHQscixuLG8pe2NvbnN0IGk9bmV3IEFycmF5KDMpLmZpbGwoMCkscz1bXTtmb3IobGV0IGE9MDthPD0yMDthKyspdHJ5e2lmKGF3YWl0IFVuKHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0VXNlckRhdGEuYmluZCh0aGlzLmJyb3dzZXJTdG9yYWdlKSxPci5TZXRVc2VyRGF0YSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KShlLHQscixuLG8pLGE+MClmb3IobGV0IGU9MDtlPD0yO2UrKyl7Y29uc3QgdD1pLnNsaWNlKDAsZSkucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKTtpZih0Pj1hKWJyZWFrO2NvbnN0IG49YT50K2lbZV0/dCtpW2VdOmE7YT50JiZpW2VdPjAmJnRoaXMucmVtb3ZlQWNjZXNzVG9rZW5LZXlzKHMuc2xpY2UodCxuKSxyLGUpfWJyZWFrfWNhdGNoKGUpe2NvbnN0IHQ9X3IoZSk7aWYoISh0LmVycm9yQ29kZT09PVNyJiZhPDIwKSl0aHJvdyB0O2lmKCFzLmxlbmd0aClmb3IobGV0IGU9MDtlPD0yO2UrKyl7Y29uc3QgdD10aGlzLmdldFRva2VuS2V5cyhlKS5hY2Nlc3NUb2tlbjtzLnB1c2goLi4udCksaVtlXT10Lmxlbmd0aH1pZihzLmxlbmd0aDw9YSl0aHJvdyB0O3RoaXMucmVtb3ZlQWNjZXNzVG9rZW4oc1thXSxyLCExKX19Z2V0QWNjb3VudChlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFjY291bnQgY2FsbGVkIik7Y29uc3Qgcj10aGlzLmJyb3dzZXJTdG9yYWdlLmdldFVzZXJEYXRhKGUpO2lmKCFyKXJldHVybiB0aGlzLnJlbW92ZUFjY291bnRLZXlGcm9tTWFwKGUsdCksbnVsbDtjb25zdCBuPXRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24ocik7cmV0dXJuIG4mJmhyLmlzQWNjb3VudEVudGl0eShuKT9Qci50b09iamVjdChuZXcgaHIsbik6bnVsbH1hc3luYyBzZXRBY2NvdW50KGUsdCxyKXt0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRBY2NvdW50IGNhbGxlZCIpO2NvbnN0IG49dGhpcy5nZW5lcmF0ZUFjY291bnRLZXkoaHIuZ2V0QWNjb3VudEluZm8oZSkpLG89RGF0ZS5ub3coKS50b1N0cmluZygpO2UubGFzdFVwZGF0ZWRBdD1vLGF3YWl0IHRoaXMuc2V0VXNlckRhdGEobixKU09OLnN0cmluZ2lmeShlKSx0LG8scik7Y29uc3QgaT10aGlzLmFkZEFjY291bnRLZXlUb01hcChuLHQpO3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtrbXNpOnJ9LHQpLHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZSYmaSYmdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDQ09VTlRfQURERUQsdm9pZCAwLGhyLmdldEFjY291bnRJbmZvKGUpKX1nZXRBY2NvdW50S2V5cygpe3JldHVybiBBYyh0aGlzLmJyb3dzZXJTdG9yYWdlKX1zZXRBY2NvdW50S2V5cyhlLHQscj0yKXswPT09ZS5sZW5ndGg/dGhpcy5yZW1vdmVJdGVtKGVjKHIpKTp0aGlzLnNldEl0ZW0oZWMociksSlNPTi5zdHJpbmdpZnkoZSksdCl9YWRkQWNjb3VudEtleVRvTWFwKGUsdCl7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuYWRkQWNjb3VudEtleVRvTWFwIGNhbGxlZCIpLHRoaXMubG9nZ2VyLnRyYWNlUGlpKGBCcm93c2VyQ2FjaGVNYW5hZ2VyLmFkZEFjY291bnRLZXlUb01hcCBjYWxsZWQgd2l0aCBrZXk6ICR7ZX1gKTtjb25zdCByPXRoaXMuZ2V0QWNjb3VudEtleXMoKTtyZXR1cm4tMT09PXIuaW5kZXhPZihlKT8oci5wdXNoKGUpLHRoaXMuc2V0SXRlbShlYygpLEpTT04uc3RyaW5naWZ5KHIpLHQpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuYWRkQWNjb3VudEtleVRvTWFwIGFjY291bnQga2V5IGFkZGVkIiksITApOih0aGlzLmxvZ2dlci52ZXJib3NlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmFkZEFjY291bnRLZXlUb01hcCBhY2NvdW50IGtleSBhbHJlYWR5IGV4aXN0cyBpbiBtYXAiKSwhMSl9cmVtb3ZlQWNjb3VudEtleUZyb21NYXAoZSx0KXt0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBjYWxsZWQiKSx0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBjYWxsZWQgd2l0aCBrZXk6ICR7ZX1gKTtjb25zdCByPXRoaXMuZ2V0QWNjb3VudEtleXMoKSxuPXIuaW5kZXhPZihlKTtuPi0xPyhyLnNwbGljZShuLDEpLHRoaXMuc2V0QWNjb3VudEtleXMocix0KSx0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBhY2NvdW50IGtleSByZW1vdmVkIikpOnRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlbW92ZUFjY291bnRLZXlGcm9tTWFwIGtleSBub3QgZm91bmQgaW4gZXhpc3RpbmcgbWFwIil9cmVtb3ZlQWNjb3VudChlLHQpe2NvbnN0IHI9dGhpcy5nZXRBY3RpdmVBY2NvdW50KHQpO3I/LmhvbWVBY2NvdW50SWQ9PT1lLmhvbWVBY2NvdW50SWQmJnI/LmVudmlyb25tZW50PT09ZS5lbnZpcm9ubWVudCYmdGhpcy5zZXRBY3RpdmVBY2NvdW50KG51bGwsdCksc3VwZXIucmVtb3ZlQWNjb3VudChlLHQpLHRoaXMucmVtb3ZlQWNjb3VudEtleUZyb21NYXAodGhpcy5nZW5lcmF0ZUFjY291bnRLZXkoZSksdCksdGhpcy5icm93c2VyU3RvcmFnZS5nZXRLZXlzKCkuZm9yRWFjaCgodD0+e3QuaW5jbHVkZXMoZS5ob21lQWNjb3VudElkKSYmdC5pbmNsdWRlcyhlLmVudmlyb25tZW50KSYmdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKHQpfSkpLHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZSYmdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDQ09VTlRfUkVNT1ZFRCx2b2lkIDAsZSl9cmVtb3ZlSWRUb2tlbihlLHQpe3N1cGVyLnJlbW92ZUlkVG9rZW4oZSx0KTtjb25zdCByPXRoaXMuZ2V0VG9rZW5LZXlzKCksbj1yLmlkVG9rZW4uaW5kZXhPZihlKTtuPi0xJiYodGhpcy5sb2dnZXIuaW5mbygiaWRUb2tlbiByZW1vdmVkIGZyb20gdG9rZW5LZXlzIG1hcCIpLHIuaWRUb2tlbi5zcGxpY2UobiwxKSx0aGlzLnNldFRva2VuS2V5cyhyLHQpKX1yZW1vdmVBY2Nlc3NUb2tlbihlLHQscj0hMCl7c3VwZXIucmVtb3ZlQWNjZXNzVG9rZW4oZSx0KSxyJiZ0aGlzLnJlbW92ZUFjY2Vzc1Rva2VuS2V5cyhbZV0sdCl9cmVtb3ZlQWNjZXNzVG9rZW5LZXlzKGUsdCxyPTIpe3RoaXMubG9nZ2VyLnRyYWNlKCJyZW1vdmVBY2Nlc3NUb2tlbktleSBjYWxsZWQiKTtjb25zdCBuPXRoaXMuZ2V0VG9rZW5LZXlzKHIpO2xldCBvPTA7aWYoZS5mb3JFYWNoKChlPT57Y29uc3QgdD1uLmFjY2Vzc1Rva2VuLmluZGV4T2YoZSk7dD4tMSYmKG4uYWNjZXNzVG9rZW4uc3BsaWNlKHQsMSksbysrKX0pKSxvPjApcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oYHJlbW92ZWQgJHtvfSBhY2Nlc3NUb2tlbiBrZXlzIGZyb20gdG9rZW5LZXlzIG1hcGApLHZvaWQgdGhpcy5zZXRUb2tlbktleXMobix0LHIpfXJlbW92ZVJlZnJlc2hUb2tlbihlLHQpe3N1cGVyLnJlbW92ZVJlZnJlc2hUb2tlbihlLHQpO2NvbnN0IHI9dGhpcy5nZXRUb2tlbktleXMoKSxuPXIucmVmcmVzaFRva2VuLmluZGV4T2YoZSk7bj4tMSYmKHRoaXMubG9nZ2VyLmluZm8oInJlZnJlc2hUb2tlbiByZW1vdmVkIGZyb20gdG9rZW5LZXlzIG1hcCIpLHIucmVmcmVzaFRva2VuLnNwbGljZShuLDEpLHRoaXMuc2V0VG9rZW5LZXlzKHIsdCkpfWdldFRva2VuS2V5cyhlPTIpe3JldHVybiBrYyh0aGlzLmNsaWVudElkLHRoaXMuYnJvd3NlclN0b3JhZ2UsZSl9c2V0VG9rZW5LZXlzKGUsdCxyPTIpezAhPT1lLmlkVG9rZW4ubGVuZ3RofHwwIT09ZS5hY2Nlc3NUb2tlbi5sZW5ndGh8fDAhPT1lLnJlZnJlc2hUb2tlbi5sZW5ndGg/dGhpcy5zZXRJdGVtKHRjKHRoaXMuY2xpZW50SWQsciksSlNPTi5zdHJpbmdpZnkoZSksdCk6dGhpcy5yZW1vdmVJdGVtKHRjKHRoaXMuY2xpZW50SWQscikpfWdldElkVG9rZW5DcmVkZW50aWFsKGUsdCl7Y29uc3Qgcj10aGlzLmJyb3dzZXJTdG9yYWdlLmdldFVzZXJEYXRhKGUpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRJZFRva2VuQ3JlZGVudGlhbDogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSx0aGlzLnJlbW92ZUlkVG9rZW4oZSx0KSxudWxsO2NvbnN0IG49dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihyKTtyZXR1cm4gbiYmKChvPW4pJiZRbihvKSYmby5oYXNPd25Qcm9wZXJ0eSgicmVhbG0iKSYmby5jcmVkZW50aWFsVHlwZT09PUguSURfVE9LRU4pPyh0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRJZFRva2VuQ3JlZGVudGlhbDogY2FjaGUgaGl0Iiksbik6KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldElkVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpO3ZhciBvfWFzeW5jIHNldElkVG9rZW5DcmVkZW50aWFsKGUsdCxyKXt0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRJZFRva2VuQ3JlZGVudGlhbCBjYWxsZWQiKTtjb25zdCBuPXRoaXMuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGUpLG89RGF0ZS5ub3coKS50b1N0cmluZygpO2UubGFzdFVwZGF0ZWRBdD1vLGF3YWl0IHRoaXMuc2V0VXNlckRhdGEobixKU09OLnN0cmluZ2lmeShlKSx0LG8scik7Y29uc3QgaT10aGlzLmdldFRva2VuS2V5cygpOy0xPT09aS5pZFRva2VuLmluZGV4T2YobikmJih0aGlzLmxvZ2dlci5pbmZvKCJCcm93c2VyQ2FjaGVNYW5hZ2VyOiBhZGRUb2tlbktleSAtIGlkVG9rZW4gYWRkZWQgdG8gbWFwIiksaS5pZFRva2VuLnB1c2gobiksdGhpcy5zZXRUb2tlbktleXMoaSx0KSl9Z2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGUsdCl7Y29uc3Qgcj10aGlzLmJyb3dzZXJTdG9yYWdlLmdldFVzZXJEYXRhKGUpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWw6IGNhbGxlZCwgbm8gY2FjaGUgaGl0IiksdGhpcy5yZW1vdmVBY2Nlc3NUb2tlbktleXMoW2VdLHQpLG51bGw7Y29uc3Qgbj10aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHIpO3JldHVybiBuJiZqbihuKT8odGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsOiBjYWNoZSBoaXQiKSxuKToodGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpfWFzeW5jIHNldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLHQscil7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsIGNhbGxlZCIpO2NvbnN0IG49dGhpcy5nZW5lcmF0ZUNyZWRlbnRpYWxLZXkoZSksbz1EYXRlLm5vdygpLnRvU3RyaW5nKCk7ZS5sYXN0VXBkYXRlZEF0PW8sYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShuLEpTT04uc3RyaW5naWZ5KGUpLHQsbyxyKTtjb25zdCBpPXRoaXMuZ2V0VG9rZW5LZXlzKCkscz1pLmFjY2Vzc1Rva2VuLmluZGV4T2Yobik7LTEhPT1zJiZpLmFjY2Vzc1Rva2VuLnNwbGljZShzLDEpLHRoaXMubG9nZ2VyLnRyYWNlKGBhY2Nlc3MgdG9rZW4gJHstMT09PXM/ImFkZGVkIHRvIjoidXBkYXRlZCBpbiJ9IG1hcGApLGkuYWNjZXNzVG9rZW4ucHVzaChuKSx0aGlzLnNldFRva2VuS2V5cyhpLHQpfWdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoZSx0KXtjb25zdCByPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0VXNlckRhdGEoZSk7aWYoIXIpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWw6IGNhbGxlZCwgbm8gY2FjaGUgaGl0IiksdGhpcy5yZW1vdmVSZWZyZXNoVG9rZW4oZSx0KSxudWxsO2NvbnN0IG49dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihyKTtyZXR1cm4gbiYmV24obik/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWw6IGNhY2hlIGhpdCIpLG4pOih0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRSZWZyZXNoVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpfWFzeW5jIHNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoZSx0LHIpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwgY2FsbGVkIik7Y29uc3Qgbj10aGlzLmdlbmVyYXRlQ3JlZGVudGlhbEtleShlKSxvPURhdGUubm93KCkudG9TdHJpbmcoKTtlLmxhc3RVcGRhdGVkQXQ9byxhd2FpdCB0aGlzLnNldFVzZXJEYXRhKG4sSlNPTi5zdHJpbmdpZnkoZSksdCxvLHIpO2NvbnN0IGk9dGhpcy5nZXRUb2tlbktleXMoKTstMT09PWkucmVmcmVzaFRva2VuLmluZGV4T2YobikmJih0aGlzLmxvZ2dlci5pbmZvKCJCcm93c2VyQ2FjaGVNYW5hZ2VyOiBhZGRUb2tlbktleSAtIHJlZnJlc2hUb2tlbiBhZGRlZCB0byBtYXAiKSxpLnJlZnJlc2hUb2tlbi5wdXNoKG4pLHRoaXMuc2V0VG9rZW5LZXlzKGksdCkpfWdldEFwcE1ldGFkYXRhKGUpe2NvbnN0IHQ9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGUpO2lmKCF0KXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBcHBNZXRhZGF0YTogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSxudWxsO2NvbnN0IHI9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbih0KTtyZXR1cm4gciYmKG49ZSwobz1yKSYmMD09PW4uaW5kZXhPZih4KSYmby5oYXNPd25Qcm9wZXJ0eSgiY2xpZW50SWQiKSYmby5oYXNPd25Qcm9wZXJ0eSgiZW52aXJvbm1lbnQiKSk/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFwcE1ldGFkYXRhOiBjYWNoZSBoaXQiKSxyKToodGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QXBwTWV0YWRhdGE6IGNhbGxlZCwgbm8gY2FjaGUgaGl0IiksbnVsbCk7dmFyIG4sb31zZXRBcHBNZXRhZGF0YShlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldEFwcE1ldGFkYXRhIGNhbGxlZCIpO2NvbnN0IHI9ZnVuY3Rpb24oe2Vudmlyb25tZW50OmUsY2xpZW50SWQ6dH0pe3JldHVyblt4LGUsdF0uam9pbihMKS50b0xvd2VyQ2FzZSgpfShlKTt0aGlzLnNldEl0ZW0ocixKU09OLnN0cmluZ2lmeShlKSx0KX1nZXRTZXJ2ZXJUZWxlbWV0cnkoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0oZSk7aWYoIXQpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSxudWxsO2NvbnN0IHI9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbih0KTtyZXR1cm4gciYmZnVuY3Rpb24oZSx0KXtjb25zdCByPTA9PT1lLmluZGV4T2Yoai5DQUNIRV9LRVkpO2xldCBuPSEwO3JldHVybiB0JiYobj10Lmhhc093blByb3BlcnR5KCJmYWlsZWRSZXF1ZXN0cyIpJiZ0Lmhhc093blByb3BlcnR5KCJlcnJvcnMiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiY2FjaGVIaXRzIikpLHImJm59KGUscik/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FjaGUgaGl0Iikscik6KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSxudWxsKX1zZXRTZXJ2ZXJUZWxlbWV0cnkoZSx0LHIpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldFNlcnZlclRlbGVtZXRyeSBjYWxsZWQiKSx0aGlzLnNldEl0ZW0oZSxKU09OLnN0cmluZ2lmeSh0KSxyKX1nZXRBdXRob3JpdHlNZXRhZGF0YShlKXtjb25zdCB0PXRoaXMuaW50ZXJuYWxTdG9yYWdlLmdldEl0ZW0oZSk7aWYoIXQpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGw7Y29uc3Qgcj10aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHQpO3JldHVybiByJiZmdW5jdGlvbihlLHQpe3JldHVybiEhdCYmMD09PWUuaW5kZXhPZihGKSYmdC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXNlcyIpJiZ0Lmhhc093blByb3BlcnR5KCJwcmVmZXJyZWRfY2FjaGUiKSYmdC5oYXNPd25Qcm9wZXJ0eSgicHJlZmVycmVkX25ldHdvcmsiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiY2Fub25pY2FsX2F1dGhvcml0eSIpJiZ0Lmhhc093blByb3BlcnR5KCJhdXRob3JpemF0aW9uX2VuZHBvaW50IikmJnQuaGFzT3duUHJvcGVydHkoInRva2VuX2VuZHBvaW50IikmJnQuaGFzT3duUHJvcGVydHkoImlzc3VlciIpJiZ0Lmhhc093blByb3BlcnR5KCJhbGlhc2VzRnJvbU5ldHdvcmsiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiZW5kcG9pbnRzRnJvbU5ldHdvcmsiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiZXhwaXJlc0F0IikmJnQuaGFzT3duUHJvcGVydHkoImp3a3NfdXJpIil9KGUscik/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhOiBjYWNoZSBoaXQiKSxyKTpudWxsfWdldEF1dGhvcml0eU1ldGFkYXRhS2V5cygpe3JldHVybiB0aGlzLmludGVybmFsU3RvcmFnZS5nZXRLZXlzKCkuZmlsdGVyKChlPT50aGlzLmlzQXV0aG9yaXR5TWV0YWRhdGEoZSkpKX1zZXRXcmFwcGVyTWV0YWRhdGEoZSx0KXt0aGlzLmludGVybmFsU3RvcmFnZS5zZXRJdGVtKF9zLGUpLHRoaXMuaW50ZXJuYWxTdG9yYWdlLnNldEl0ZW0oUHMsdCl9Z2V0V3JhcHBlck1ldGFkYXRhKCl7cmV0dXJuW3RoaXMuaW50ZXJuYWxTdG9yYWdlLmdldEl0ZW0oX3MpfHx0LkVNUFRZX1NUUklORyx0aGlzLmludGVybmFsU3RvcmFnZS5nZXRJdGVtKFBzKXx8dC5FTVBUWV9TVFJJTkddfXNldEF1dGhvcml0eU1ldGFkYXRhKGUsdCl7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0QXV0aG9yaXR5TWV0YWRhdGEgY2FsbGVkIiksdGhpcy5pbnRlcm5hbFN0b3JhZ2Uuc2V0SXRlbShlLEpTT04uc3RyaW5naWZ5KHQpKX1nZXRBY3RpdmVBY2NvdW50KGUpe2NvbnN0IHQ9dGhpcy5nZW5lcmF0ZUNhY2hlS2V5KHYpLHI9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKHQpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY3RpdmVBY2NvdW50OiBObyBhY3RpdmUgYWNjb3VudCBmaWx0ZXJzIGZvdW5kIiksbnVsbDtjb25zdCBuPXRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24ocik7cmV0dXJuIG4/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFjdGl2ZUFjY291bnQ6IEFjdGl2ZSBhY2NvdW50IGZpbHRlcnMgc2NoZW1hIGZvdW5kIiksdGhpcy5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoe2hvbWVBY2NvdW50SWQ6bi5ob21lQWNjb3VudElkLGxvY2FsQWNjb3VudElkOm4ubG9jYWxBY2NvdW50SWQsdGVuYW50SWQ6bi50ZW5hbnRJZH0sZSkpOih0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY3RpdmVBY2NvdW50OiBObyBhY3RpdmUgYWNjb3VudCBmb3VuZCIpLG51bGwpfXNldEFjdGl2ZUFjY291bnQoZSx0KXtjb25zdCByPXRoaXMuZ2VuZXJhdGVDYWNoZUtleSh2KTtpZihlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJzZXRBY3RpdmVBY2NvdW50OiBBY3RpdmUgYWNjb3VudCBzZXQiKTtjb25zdCBuPXtob21lQWNjb3VudElkOmUuaG9tZUFjY291bnRJZCxsb2NhbEFjY291bnRJZDplLmxvY2FsQWNjb3VudElkLHRlbmFudElkOmUudGVuYW50SWQsbGFzdFVwZGF0ZWRBdDpEbigpLnRvU3RyaW5nKCl9O3RoaXMuc2V0SXRlbShyLEpTT04uc3RyaW5naWZ5KG4pLHQpfWVsc2UgdGhpcy5sb2dnZXIudmVyYm9zZSgic2V0QWN0aXZlQWNjb3VudDogTm8gYWNjb3VudCBwYXNzZWQsIGFjdGl2ZSBhY2NvdW50IG5vdCBzZXQiKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0ocik7dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDVElWRV9BQ0NPVU5UX0NIQU5HRUQpfWdldFRocm90dGxpbmdDYWNoZShlKXtjb25zdCB0PXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SXRlbShlKTtpZighdClyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGw7Y29uc3Qgcj10aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHQpO3JldHVybiByJiZmdW5jdGlvbihlLHQpe2xldCByPSExO2UmJihyPTA9PT1lLmluZGV4T2YoWSkpO2xldCBuPSEwO3JldHVybiB0JiYobj10Lmhhc093blByb3BlcnR5KCJ0aHJvdHRsZVRpbWUiKSksciYmbn0oZSxyKT8odGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWNoZSBoaXQiKSxyKToodGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpfXNldFRocm90dGxpbmdDYWNoZShlLHQscil7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0VGhyb3R0bGluZ0NhY2hlIGNhbGxlZCIpLHRoaXMuc2V0SXRlbShlLEpTT04uc3RyaW5naWZ5KHQpLHIpfWdldFRlbXBvcmFyeUNhY2hlKGUsdCl7Y29uc3Qgcj10P3RoaXMuZ2VuZXJhdGVDYWNoZUtleShlKTplO2lmKHRoaXMuY2FjaGVDb25maWcuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSl7Y29uc3QgZT10aGlzLmNvb2tpZVN0b3JhZ2UuZ2V0SXRlbShyKTtpZihlKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUZW1wb3JhcnlDYWNoZTogc3RvcmVBdXRoU3RhdGVJbkNvb2tpZXMgc2V0IHRvIHRydWUsIHJldHJpZXZpbmcgZnJvbSBjb29raWVzIiksZX1jb25zdCBuPXRoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlLmdldEl0ZW0ocik7aWYoIW4pe2lmKHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZSl7Y29uc3QgZT10aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0ocik7aWYoZSlyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGVtcG9yYXJ5Q2FjaGU6IFRlbXBvcmFyeSBjYWNoZSBpdGVtIGZvdW5kIGluIGxvY2FsIHN0b3JhZ2UiKSxlfXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUZW1wb3JhcnlDYWNoZTogTm8gY2FjaGUgaXRlbSBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlIiksbnVsbH1yZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGVtcG9yYXJ5Q2FjaGU6IFRlbXBvcmFyeSBjYWNoZSBpdGVtIHJldHVybmVkIiksbn1zZXRUZW1wb3JhcnlDYWNoZShlLHQscil7Y29uc3Qgbj1yP3RoaXMuZ2VuZXJhdGVDYWNoZUtleShlKTplO3RoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlLnNldEl0ZW0obix0KSx0aGlzLmNhY2hlQ29uZmlnLnN0b3JlQXV0aFN0YXRlSW5Db29raWUmJih0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRUZW1wb3JhcnlDYWNoZTogc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSBzZXQgdG8gdHJ1ZSwgc2V0dGluZyBpdGVtIGNvb2tpZSIpLHRoaXMuY29va2llU3RvcmFnZS5zZXRJdGVtKG4sdCx2b2lkIDAsdGhpcy5jYWNoZUNvbmZpZy5zZWN1cmVDb29raWVzKSl9cmVtb3ZlSXRlbShlKXt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0oZSl9cmVtb3ZlVGVtcG9yYXJ5SXRlbShlKXt0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZS5yZW1vdmVJdGVtKGUpLHRoaXMuY2FjaGVDb25maWcuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSYmKHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlbW92ZUl0ZW06IHN0b3JlQXV0aFN0YXRlSW5Db29raWUgaXMgdHJ1ZSwgY2xlYXJpbmcgaXRlbSBjb29raWUiKSx0aGlzLmNvb2tpZVN0b3JhZ2UucmVtb3ZlSXRlbShlKSl9Z2V0S2V5cygpe3JldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEtleXMoKX1jbGVhcihlKXt0aGlzLnJlbW92ZUFsbEFjY291bnRzKGUpLHRoaXMucmVtb3ZlQXBwTWV0YWRhdGEoZSksdGhpcy50ZW1wb3JhcnlDYWNoZVN0b3JhZ2UuZ2V0S2V5cygpLmZvckVhY2goKGU9PnstMT09PWUuaW5kZXhPZihRYSkmJi0xPT09ZS5pbmRleE9mKHRoaXMuY2xpZW50SWQpfHx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0oZSl9KSksdGhpcy5icm93c2VyU3RvcmFnZS5nZXRLZXlzKCkuZm9yRWFjaCgoZT0+ey0xPT09ZS5pbmRleE9mKFFhKSYmLTE9PT1lLmluZGV4T2YodGhpcy5jbGllbnRJZCl8fHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShlKX0pKSx0aGlzLmludGVybmFsU3RvcmFnZS5jbGVhcigpfWNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMoZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsZSk7Y29uc3QgdD10aGlzLmdldFRva2VuS2V5cygpO2xldCByPTA7dC5hY2Nlc3NUb2tlbi5mb3JFYWNoKCh0PT57Y29uc3Qgbj10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbCh0LGUpO24/LnJlcXVlc3RlZENsYWltc0hhc2gmJnQuaW5jbHVkZXMobi5yZXF1ZXN0ZWRDbGFpbXNIYXNoLnRvTG93ZXJDYXNlKCkpJiYodGhpcy5yZW1vdmVBY2Nlc3NUb2tlbih0LGUpLHIrKyl9KSkscj4wJiZ0aGlzLmxvZ2dlci53YXJuaW5nKGAke3J9IGFjY2VzcyB0b2tlbnMgd2l0aCBjbGFpbXMgaW4gdGhlIGNhY2hlIGtleXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuYCl9Z2VuZXJhdGVDYWNoZUtleShlKXtyZXR1cm4gWXQuc3RhcnRzV2l0aChlLFFhKT9lOmAke1FhfS4ke3RoaXMuY2xpZW50SWR9LiR7ZX1gfWdlbmVyYXRlQ3JlZGVudGlhbEtleShlKXtjb25zdCB0PWUuY3JlZGVudGlhbFR5cGU9PT1ILlJFRlJFU0hfVE9LRU4mJmUuZmFtaWx5SWR8fGUuY2xpZW50SWQscj1lLnRva2VuVHlwZSYmZS50b2tlblR5cGUudG9Mb3dlckNhc2UoKSE9PVcuQkVBUkVSLnRvTG93ZXJDYXNlKCk/ZS50b2tlblR5cGUudG9Mb3dlckNhc2UoKToiIjtyZXR1cm5bYCR7UWF9LjJgLGUuaG9tZUFjY291bnRJZCxlLmVudmlyb25tZW50LGUuY3JlZGVudGlhbFR5cGUsdCxlLnJlYWxtfHwiIixlLnRhcmdldHx8IiIsZS5yZXF1ZXN0ZWRDbGFpbXNIYXNofHwiIixyXS5qb2luKCJ8IikudG9Mb3dlckNhc2UoKX1nZW5lcmF0ZUFjY291bnRLZXkoZSl7Y29uc3QgdD1lLmhvbWVBY2NvdW50SWQuc3BsaXQoIi4iKVsxXTtyZXR1cm5bYCR7UWF9LjJgLGUuaG9tZUFjY291bnRJZCxlLmVudmlyb25tZW50LHR8fGUudGVuYW50SWR8fCIiXS5qb2luKCJ8IikudG9Mb3dlckNhc2UoKX1yZXNldFJlcXVlc3RDYWNoZSgpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlc2V0UmVxdWVzdENhY2hlIGNhbGxlZCIpLHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoU3MpKSx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KGJzKSksdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKHRoaXMuZ2VuZXJhdGVDYWNoZUtleShBcykpLHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoa3MpKSx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KFJzKSksdGhpcy5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITEpfWNhY2hlQXV0aG9yaXplUmVxdWVzdChlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmNhY2hlQXV0aG9yaXplUmVxdWVzdCBjYWxsZWQiKTtjb25zdCByPUZzKEpTT04uc3RyaW5naWZ5KGUpKTtpZih0aGlzLnNldFRlbXBvcmFyeUNhY2hlKFNzLHIsITApLHQpe2NvbnN0IGU9RnModCk7dGhpcy5zZXRUZW1wb3JhcnlDYWNoZShicyxlLCEwKX19Z2V0Q2FjaGVkUmVxdWVzdCgpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldENhY2hlZFJlcXVlc3QgY2FsbGVkIik7Y29uc3QgZT10aGlzLmdldFRlbXBvcmFyeUNhY2hlKFNzLCEwKTtpZighZSl0aHJvdyBaaSh2aSk7Y29uc3QgdD10aGlzLmdldFRlbXBvcmFyeUNhY2hlKGJzLCEwKTtsZXQgcixuPSIiO3RyeXtyPUpTT04ucGFyc2UoS3MoZSkpLHQmJihuPUtzKHQpKX1jYXRjaCh0KXt0aHJvdyB0aGlzLmxvZ2dlci5lcnJvclBpaShgQXR0ZW1wdGVkIHRvIHBhcnNlOiAke2V9YCksdGhpcy5sb2dnZXIuZXJyb3IoYFBhcnNpbmcgY2FjaGVkIHRva2VuIHJlcXVlc3QgdGhyZXcgd2l0aCBlcnJvcjogJHt0fWApLFppKElpKX1yZXR1cm5bcixuXX1nZXRDYWNoZWROYXRpdmVSZXF1ZXN0KCl7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCBjYWxsZWQiKTtjb25zdCBlPXRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoUnMsITApO2lmKCFlKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRDYWNoZWROYXRpdmVSZXF1ZXN0OiBObyBjYWNoZWQgbmF0aXZlIHJlcXVlc3QgZm91bmQiKSxudWxsO2NvbnN0IHQ9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihlKTtyZXR1cm4gdHx8KHRoaXMubG9nZ2VyLmVycm9yKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldENhY2hlZE5hdGl2ZVJlcXVlc3Q6IFVuYWJsZSB0byBwYXJzZSBuYXRpdmUgcmVxdWVzdCIpLG51bGwpfWlzSW50ZXJhY3Rpb25JblByb2dyZXNzKGUpe2NvbnN0IHQ9dGhpcy5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKT8uY2xpZW50SWQ7cmV0dXJuIGU/dD09PXRoaXMuY2xpZW50SWQ6ISF0fWdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpe2NvbnN0IGU9YCR7UWF9LiR7RXN9YCx0PXRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoZSwhMSk7dHJ5e3JldHVybiB0P0pTT04ucGFyc2UodCk6bnVsbH1jYXRjaCh0KXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoIkNhbm5vdCBwYXJzZSBpbnRlcmFjdGlvbiBzdGF0dXMuIFJlbW92aW5nIHRlbXBvcmFyeSBjYWNoZSBpdGVtcyBhbmQgY2xlYXJpbmcgdXJsIGhhc2guIFJldHJ5aW5nIGludGVyYWN0aW9uIHNob3VsZCBmaXggdGhlIGVycm9yIiksdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKGUpLHRoaXMucmVzZXRSZXF1ZXN0Q2FjaGUoKSxUYSh3aW5kb3cpLG51bGx9fXNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhlLHQ9SXMpe2NvbnN0IHI9YCR7UWF9LiR7RXN9YDtpZihlKXtpZih0aGlzLmdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpKXRocm93IFppKGFpKTt0aGlzLnNldFRlbXBvcmFyeUNhY2hlKHIsSlNPTi5zdHJpbmdpZnkoe2NsaWVudElkOnRoaXMuY2xpZW50SWQsdHlwZTp0fSksITEpfWVsc2UgZXx8dGhpcy5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKT8uY2xpZW50SWQhPT10aGlzLmNsaWVudElkfHx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0ocil9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7Y29uc3Qgcj1LbihlLmFjY291bnQ/LmhvbWVBY2NvdW50SWQsZS5hY2NvdW50Py5lbnZpcm9ubWVudCxlLmlkVG9rZW4sdGhpcy5jbGllbnRJZCxlLnRlbmFudElkKTtsZXQgbjt0LmNsYWltcyYmKG49YXdhaXQgdGhpcy5jcnlwdG9JbXBsLmhhc2hTdHJpbmcodC5jbGFpbXMpKTtjb25zdCBvPXtpZFRva2VuOnIsYWNjZXNzVG9rZW46R24oZS5hY2NvdW50Py5ob21lQWNjb3VudElkLGUuYWNjb3VudC5lbnZpcm9ubWVudCxlLmFjY2Vzc1Rva2VuLHRoaXMuY2xpZW50SWQsZS50ZW5hbnRJZCxlLnNjb3Blcy5qb2luKCIgIiksZS5leHBpcmVzT24/SG4oZS5leHBpcmVzT24pOjAsZS5leHRFeHBpcmVzT24/SG4oZS5leHRFeHBpcmVzT24pOjAsS3Msdm9pZCAwLGUudG9rZW5UeXBlLHZvaWQgMCx0LnNzaEtpZCx0LmNsYWltcyxuKX07cmV0dXJuIHRoaXMuc2F2ZUNhY2hlUmVjb3JkKG8sZS5jb3JyZWxhdGlvbklkLHVyKGRyKGUuaWRUb2tlbixLcykpKX1hc3luYyBzYXZlQ2FjaGVSZWNvcmQoZSx0LHIsbil7dHJ5e2F3YWl0IHN1cGVyLnNhdmVDYWNoZVJlY29yZChlLHQscixuKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgUnImJnRoaXMucGVyZm9ybWFuY2VDbGllbnQmJnQpdHJ5e2NvbnN0IGU9dGhpcy5nZXRUb2tlbktleXMoKTt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7Y2FjaGVSdENvdW50OmUucmVmcmVzaFRva2VuLmxlbmd0aCxjYWNoZUlkQ291bnQ6ZS5pZFRva2VuLmxlbmd0aCxjYWNoZUF0Q291bnQ6ZS5hY2Nlc3NUb2tlbi5sZW5ndGh9LHQpfWNhdGNoKGUpe310aHJvdyBlfX19ZnVuY3Rpb24gT2MoZSx0LHIsbil7dHJ5e3N3aXRjaCh0KXtjYXNlIENzLkxvY2FsU3RvcmFnZTpyZXR1cm4gbmV3IEVjKGUscixuKTtjYXNlIENzLlNlc3Npb25TdG9yYWdlOnJldHVybiBuZXcgUmN9fWNhdGNoKGUpe3IuZXJyb3IoZSl9cmV0dXJuIG5ldyBtY31jb25zdCBxYz0oZSx0LHIsbik9Pm5ldyBNYyhlLHtjYWNoZUxvY2F0aW9uOkNzLk1lbW9yeVN0b3JhZ2UsY2FjaGVSZXRlbnRpb25EYXlzOjUsdGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbjpDcy5NZW1vcnlTdG9yYWdlLHN0b3JlQXV0aFN0YXRlSW5Db29raWU6ITEsc2VjdXJlQ29va2llczohMSxjYWNoZU1pZ3JhdGlvbkVuYWJsZWQ6ITEsY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDohMX0sZnQsdCxyLG4pO2Z1bmN0aW9uIE5jKGUsdCxyLG4sbyl7cmV0dXJuIGUudmVyYm9zZSgiZ2V0QWxsQWNjb3VudHMgY2FsbGVkIikscj90LmdldEFsbEFjY291bnRzKG98fHt9LG4pOltdfWZ1bmN0aW9uIFVjKGUsdCxyLG4pe2NvbnN0IG89ci5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoZSxuKTtyZXR1cm4gbz8odC52ZXJib3NlKCJnZXRBY2NvdW50OiBBY2NvdW50IG1hdGNoaW5nIHByb3ZpZGVkIGZpbHRlciBmb3VuZCwgcmV0dXJuaW5nIiksbyk6KHQudmVyYm9zZSgiZ2V0QWNjb3VudDogTm8gbWF0Y2hpbmcgYWNjb3VudCBmb3VuZCwgcmV0dXJuaW5nIG51bGwiKSxudWxsKX1mdW5jdGlvbiBMYyhlLHQscixuKXtpZih0LnRyYWNlKCJnZXRBY2NvdW50QnlVc2VybmFtZSBjYWxsZWQiKSwhZSlyZXR1cm4gdC53YXJuaW5nKCJnZXRBY2NvdW50QnlVc2VybmFtZTogTm8gdXNlcm5hbWUgcHJvdmlkZWQiKSxudWxsO2NvbnN0IG89ci5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoe3VzZXJuYW1lOmV9LG4pO3JldHVybiBvPyh0LnZlcmJvc2UoImdldEFjY291bnRCeVVzZXJuYW1lOiBBY2NvdW50IG1hdGNoaW5nIHVzZXJuYW1lIGZvdW5kLCByZXR1cm5pbmciKSx0LnZlcmJvc2VQaWkoYGdldEFjY291bnRCeVVzZXJuYW1lOiBSZXR1cm5pbmcgc2lnbmVkLWluIGFjY291bnRzIG1hdGNoaW5nIHVzZXJuYW1lOiAke2V9YCksbyk6KHQudmVyYm9zZSgiZ2V0QWNjb3VudEJ5VXNlcm5hbWU6IE5vIG1hdGNoaW5nIGFjY291bnQgZm91bmQsIHJldHVybmluZyBudWxsIiksbnVsbCl9ZnVuY3Rpb24gRGMoZSx0LHIsbil7aWYodC50cmFjZSgiZ2V0QWNjb3VudEJ5SG9tZUlkIGNhbGxlZCIpLCFlKXJldHVybiB0Lndhcm5pbmcoImdldEFjY291bnRCeUhvbWVJZDogTm8gaG9tZUFjY291bnRJZCBwcm92aWRlZCIpLG51bGw7Y29uc3Qgbz1yLmdldEFjY291bnRJbmZvRmlsdGVyZWRCeSh7aG9tZUFjY291bnRJZDplfSxuKTtyZXR1cm4gbz8odC52ZXJib3NlKCJnZXRBY2NvdW50QnlIb21lSWQ6IEFjY291bnQgbWF0Y2hpbmcgaG9tZUFjY291bnRJZCBmb3VuZCwgcmV0dXJuaW5nIiksdC52ZXJib3NlUGlpKGBnZXRBY2NvdW50QnlIb21lSWQ6IFJldHVybmluZyBzaWduZWQtaW4gYWNjb3VudHMgbWF0Y2hpbmcgaG9tZUFjY291bnRJZDogJHtlfWApLG8pOih0LnZlcmJvc2UoImdldEFjY291bnRCeUhvbWVJZDogTm8gbWF0Y2hpbmcgYWNjb3VudCBmb3VuZCwgcmV0dXJuaW5nIG51bGwiKSxudWxsKX1mdW5jdGlvbiBIYyhlLHQscixuKXtpZih0LnRyYWNlKCJnZXRBY2NvdW50QnlMb2NhbElkIGNhbGxlZCIpLCFlKXJldHVybiB0Lndhcm5pbmcoImdldEFjY291bnRCeUxvY2FsSWQ6IE5vIGxvY2FsQWNjb3VudElkIHByb3ZpZGVkIiksbnVsbDtjb25zdCBvPXIuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KHtsb2NhbEFjY291bnRJZDplfSxuKTtyZXR1cm4gbz8odC52ZXJib3NlKCJnZXRBY2NvdW50QnlMb2NhbElkOiBBY2NvdW50IG1hdGNoaW5nIGxvY2FsQWNjb3VudElkIGZvdW5kLCByZXR1cm5pbmciKSx0LnZlcmJvc2VQaWkoYGdldEFjY291bnRCeUxvY2FsSWQ6IFJldHVybmluZyBzaWduZWQtaW4gYWNjb3VudHMgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQ6ICR7ZX1gKSxvKToodC52ZXJib3NlKCJnZXRBY2NvdW50QnlMb2NhbElkOiBObyBtYXRjaGluZyBhY2NvdW50IGZvdW5kLCByZXR1cm5pbmcgbnVsbCIpLG51bGwpfWZ1bmN0aW9uIHhjKGUsdCxyKXt0LnNldEFjdGl2ZUFjY291bnQoZSxyKX1mdW5jdGlvbiBCYyhlLHQpe3JldHVybiBlLmdldEFjdGl2ZUFjY291bnQodCl9Y2xhc3MgRmN7Y29uc3RydWN0b3IoZSl7dGhpcy5ldmVudENhbGxiYWNrcz1uZXcgTWFwLHRoaXMubG9nZ2VyPWV8fG5ldyBDdCh7fSksInVuZGVmaW5lZCIhPXR5cGVvZiBCcm9hZGNhc3RDaGFubmVsJiYodGhpcy5icm9hZGNhc3RDaGFubmVsPW5ldyBCcm9hZGNhc3RDaGFubmVsKCJtc2FsLmJyb2FkY2FzdC5ldmVudCIpKSx0aGlzLmludm9rZUNyb3NzVGFiQ2FsbGJhY2tzPXRoaXMuaW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MuYmluZCh0aGlzKX1hZGRFdmVudENhbGxiYWNrKGUsdCxyKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7Y29uc3Qgbj1yfHxMYSgpO3JldHVybiB0aGlzLmV2ZW50Q2FsbGJhY2tzLmhhcyhuKT8odGhpcy5sb2dnZXIuZXJyb3IoYEV2ZW50IGNhbGxiYWNrIHdpdGggaWQ6ICR7bn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBQbGVhc2UgcHJvdmlkZSBhIHVuaXF1ZSBpZCBvciByZW1vdmUgdGhlIGV4aXN0aW5nIGNhbGxiYWNrIGFuZCB0cnkgYWdhaW4uYCksbnVsbCk6KHRoaXMuZXZlbnRDYWxsYmFja3Muc2V0KG4sW2UsdHx8W11dKSx0aGlzLmxvZ2dlci52ZXJib3NlKGBFdmVudCBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggaWQ6ICR7bn1gKSxuKX1yZXR1cm4gbnVsbH1yZW1vdmVFdmVudENhbGxiYWNrKGUpe3RoaXMuZXZlbnRDYWxsYmFja3MuZGVsZXRlKGUpLHRoaXMubG9nZ2VyLnZlcmJvc2UoYEV2ZW50IGNhbGxiYWNrICR7ZX0gcmVtb3ZlZC5gKX1lbWl0RXZlbnQoZSx0LHIsbil7Y29uc3Qgbz17ZXZlbnRUeXBlOmUsaW50ZXJhY3Rpb25UeXBlOnR8fG51bGwscGF5bG9hZDpyfHxudWxsLGVycm9yOm58fG51bGwsdGltZXN0YW1wOkRhdGUubm93KCl9O3N3aXRjaChlKXtjYXNlIF9jLkFDQ09VTlRfQURERUQ6Y2FzZSBfYy5BQ0NPVU5UX1JFTU9WRUQ6Y2FzZSBfYy5BQ1RJVkVfQUNDT1VOVF9DSEFOR0VEOnRoaXMuYnJvYWRjYXN0Q2hhbm5lbD8ucG9zdE1lc3NhZ2Uobyk7YnJlYWs7ZGVmYXVsdDp0aGlzLmludm9rZUNhbGxiYWNrcyhvKX19aW52b2tlQ2FsbGJhY2tzKGUpe3RoaXMuZXZlbnRDYWxsYmFja3MuZm9yRWFjaCgoKFt0LHJdLG4pPT57KDA9PT1yLmxlbmd0aHx8ci5pbmNsdWRlcyhlLmV2ZW50VHlwZSkpJiYodGhpcy5sb2dnZXIudmVyYm9zZShgRW1pdHRpbmcgZXZlbnQgdG8gY2FsbGJhY2sgJHtufTogJHtlLmV2ZW50VHlwZX1gKSx0LmFwcGx5KG51bGwsW2VdKSl9KSl9aW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MoZSl7Y29uc3QgdD1lLmRhdGE7dGhpcy5pbnZva2VDYWxsYmFja3ModCl9c3Vic2NyaWJlQ3Jvc3NUYWIoKXt0aGlzLmJyb2FkY2FzdENoYW5uZWw/LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuaW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MpfXVuc3Vic2NyaWJlQ3Jvc3NUYWIoKXt0aGlzLmJyb2FkY2FzdENoYW5uZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuaW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MpfX1jbGFzcyB6Y3tjb25zdHJ1Y3RvcihlLHQscixuLG8saSxzLGEsYyl7dGhpcy5jb25maWc9ZSx0aGlzLmJyb3dzZXJTdG9yYWdlPXQsdGhpcy5icm93c2VyQ3J5cHRvPXIsdGhpcy5uZXR3b3JrQ2xpZW50PXRoaXMuY29uZmlnLnN5c3RlbS5uZXR3b3JrQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyPW8sdGhpcy5uYXZpZ2F0aW9uQ2xpZW50PWksdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj1hLHRoaXMuY29ycmVsYXRpb25JZD1jfHxvYSgpLHRoaXMubG9nZ2VyPW4uY2xvbmUoaXMsJGEsdGhpcy5jb3JyZWxhdGlvbklkKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXN9YXN5bmMgY2xlYXJDYWNoZU9uTG9nb3V0KGUsdCl7aWYodCl0cnl7dGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVBY2NvdW50KHQsZSksdGhpcy5sb2dnZXIudmVyYm9zZSgiQ2xlYXJlZCBjYWNoZSBpdGVtcyBiZWxvbmdpbmcgdG8gdGhlIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIGxvZ291dCByZXF1ZXN0LiIpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLmVycm9yKCJBY2NvdW50IHByb3ZpZGVkIGluIGxvZ291dCByZXF1ZXN0IHdhcyBub3QgZm91bmQuIExvY2FsIGNhY2hlIHVuY2hhbmdlZC4iKX1lbHNlIHRyeXt0aGlzLmxvZ2dlci52ZXJib3NlKCJObyBhY2NvdW50IHByb3ZpZGVkIGluIGxvZ291dCByZXF1ZXN0LCBjbGVhcmluZyBhbGwgY2FjaGUgaXRlbXMuIix0aGlzLmNvcnJlbGF0aW9uSWQpLHRoaXMuYnJvd3NlclN0b3JhZ2UuY2xlYXIoZSksYXdhaXQgdGhpcy5icm93c2VyQ3J5cHRvLmNsZWFyS2V5c3RvcmUoKX1jYXRjaChlKXt0aGlzLmxvZ2dlci5lcnJvcigiQXR0ZW1wdGVkIHRvIGNsZWFyIGFsbCBNU0FMIGNhY2hlIGl0ZW1zIGFuZCBmYWlsZWQuIExvY2FsIGNhY2hlIHVuY2hhbmdlZC4iKX19Z2V0UmVkaXJlY3RVcmkoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiZ2V0UmVkaXJlY3RVcmkgY2FsbGVkIik7Y29uc3QgdD1lfHx0aGlzLmNvbmZpZy5hdXRoLnJlZGlyZWN0VXJpO3JldHVybiB3ci5nZXRBYnNvbHV0ZVVybCh0LGJhKCkpfWluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKGUsdCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIgY2FsbGVkIik7Y29uc3Qgcj17Y2xpZW50SWQ6dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxjb3JyZWxhdGlvbklkOnRoaXMuY29ycmVsYXRpb25JZCxhcGlJZDplLGZvcmNlUmVmcmVzaDp0fHwhMSx3cmFwcGVyU0tVOnRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0V3JhcHBlck1ldGFkYXRhKClbMF0sd3JhcHBlclZlcjp0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFdyYXBwZXJNZXRhZGF0YSgpWzFdfTtyZXR1cm4gbmV3IEZvKHIsdGhpcy5icm93c2VyU3RvcmFnZSl9YXN5bmMgZ2V0RGlzY292ZXJlZEF1dGhvcml0eShlKXtjb25zdHthY2NvdW50OnR9PWUscj1lLnJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVycyYmZS5yZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoImluc3RhbmNlX2F3YXJlIik/ZS5yZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnMuaW5zdGFuY2VfYXdhcmU6dm9pZCAwO3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmNvcnJlbGF0aW9uSWQpO2NvbnN0IG49e3Byb3RvY29sTW9kZTp0aGlzLmNvbmZpZy5hdXRoLnByb3RvY29sTW9kZSxPSURDT3B0aW9uczp0aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLGtub3duQXV0aG9yaXRpZXM6dGhpcy5jb25maWcuYXV0aC5rbm93bkF1dGhvcml0aWVzLGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6dGhpcy5jb25maWcuYXV0aC5jbG91ZERpc2NvdmVyeU1ldGFkYXRhLGF1dGhvcml0eU1ldGFkYXRhOnRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5TWV0YWRhdGEsc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6dGhpcy5jb25maWcuYXV0aC5za2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZX0sbz1lLnJlcXVlc3RBdXRob3JpdHl8fHRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5LGk9cj8ubGVuZ3RoPyJ0cnVlIj09PXI6dGhpcy5jb25maWcuYXV0aC5pbnN0YW5jZUF3YXJlLHM9dCYmaT90aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eS5yZXBsYWNlKHdyLmdldERvbWFpbkZyb21VcmwobyksdC5lbnZpcm9ubWVudCk6byxhPVpuLmdlbmVyYXRlQXV0aG9yaXR5KHMsZS5yZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnN8fHRoaXMuY29uZmlnLmF1dGguYXp1cmVDbG91ZE9wdGlvbnMpLGM9YXdhaXQgVW4ocm8sT3IuQXV0aG9yaXR5RmFjdG9yeUNyZWF0ZURpc2NvdmVyZWRJbnN0YW5jZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoYSx0aGlzLmNvbmZpZy5zeXN0ZW0ubmV0d29ya0NsaWVudCx0aGlzLmJyb3dzZXJTdG9yYWdlLG4sdGhpcy5sb2dnZXIsdGhpcy5jb3JyZWxhdGlvbklkLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO2lmKHQmJiFjLmlzQWxpYXModC5lbnZpcm9ubWVudCkpdGhyb3cgSnQoenQpO3JldHVybiBjfX1hc3luYyBmdW5jdGlvbiBLYyhlLHQscixuKXtyLmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LGUuY29ycmVsYXRpb25JZCk7Y29uc3Qgbz1lLmF1dGhvcml0eXx8dC5hdXRoLmF1dGhvcml0eSxpPVsuLi5lJiZlLnNjb3Blc3x8W11dLHM9ey4uLmUsY29ycmVsYXRpb25JZDplLmNvcnJlbGF0aW9uSWQsYXV0aG9yaXR5Om8sc2NvcGVzOml9O2lmKHMuYXV0aGVudGljYXRpb25TY2hlbWUpe2lmKHMuYXV0aGVudGljYXRpb25TY2hlbWU9PT1XLlNTSCl7aWYoIWUuc3NoSndrKXRocm93IEp0KEx0KTtpZighZS5zc2hLaWQpdGhyb3cgSnQoRHQpfW4udmVyYm9zZShgQXV0aGVudGljYXRpb24gU2NoZW1lIHNldCB0byAiJHtzLmF1dGhlbnRpY2F0aW9uU2NoZW1lfSIgYXMgY29uZmlndXJlZCBpbiBBdXRoIHJlcXVlc3RgKX1lbHNlIHMuYXV0aGVudGljYXRpb25TY2hlbWU9Vy5CRUFSRVIsbi52ZXJib3NlKCdBdXRoZW50aWNhdGlvbiBTY2hlbWUgd2FzblwndCBleHBsaWNpdGx5IHNldCBpbiByZXF1ZXN0LCBkZWZhdWx0aW5nIHRvICJCZWFyZXIiIHJlcXVlc3QnKTtyZXR1cm4gdC5jYWNoZS5jbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkJiZlLmNsYWltcyYmIVl0LmlzRW1wdHlPYmooZS5jbGFpbXMpJiYocy5yZXF1ZXN0ZWRDbGFpbXNIYXNoPWF3YWl0IGdhKGUuY2xhaW1zKSksc31hc3luYyBmdW5jdGlvbiBHYyhlLHQscixuLG8pe24uYWRkUXVldWVNZWFzdXJlbWVudChPci5Jbml0aWFsaXplU2lsZW50UmVxdWVzdCxlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IGk9YXdhaXQgVW4oS2MsT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LG8sbixlLmNvcnJlbGF0aW9uSWQpKGUscixuLG8pO3JldHVybnsuLi5lLC4uLmksYWNjb3VudDp0LGZvcmNlUmVmcmVzaDplLmZvcmNlUmVmcmVzaHx8ITF9fWZ1bmN0aW9uICRjKGUsdCl7bGV0IHI7Y29uc3Qgbj1lLmh0dHBNZXRob2Q7aWYodD09PWxyLkVBUil7aWYocj1ufHxsLHIhPT1sKXRocm93IEp0KEt0KX1lbHNlIHI9bnx8YztpZihlLmF1dGhvcml6ZVBvc3RCb2R5UGFyYW1ldGVycyYmciE9PWwpdGhyb3cgSnQoR3QpO3JldHVybiByfWNsYXNzIFFjIGV4dGVuZHMgemN7aW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiaW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QgY2FsbGVkIixlPy5jb3JyZWxhdGlvbklkKTtjb25zdCB0PXtjb3JyZWxhdGlvbklkOnRoaXMuY29ycmVsYXRpb25JZHx8b2EoKSwuLi5lfTtpZihlKWlmKGUubG9nb3V0SGludCl0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRIaW50IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIGxvZ291dFJlcXVlc3QiKTtlbHNlIGlmKGUuYWNjb3VudCl7Y29uc3Qgcj10aGlzLmdldExvZ291dEhpbnRGcm9tSWRUb2tlbkNsYWltcyhlLmFjY291bnQpO3ImJih0aGlzLmxvZ2dlci52ZXJib3NlKCJTZXR0aW5nIGxvZ291dEhpbnQgdG8gbG9naW5faGludCBJRCBUb2tlbiBDbGFpbSB2YWx1ZSBmb3IgdGhlIGFjY291bnQgcHJvdmlkZWQiKSx0LmxvZ291dEhpbnQ9cil9ZWxzZSB0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRIaW50IHdhcyBub3Qgc2V0IGFuZCBhY2NvdW50IHdhcyBub3QgcGFzc2VkIGludG8gbG9nb3V0IHJlcXVlc3QsIGxvZ291dEhpbnQgd2lsbCBub3QgYmUgc2V0Iik7ZWxzZSB0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRIaW50IHdpbGwgbm90IGJlIHNldCBzaW5jZSBubyBsb2dvdXQgcmVxdWVzdCB3YXMgY29uZmlndXJlZCIpO3JldHVybiBlJiZudWxsPT09ZS5wb3N0TG9nb3V0UmVkaXJlY3RVcmk/dGhpcy5sb2dnZXIudmVyYm9zZSgicG9zdExvZ291dFJlZGlyZWN0VXJpIHBhc3NlZCBhcyBudWxsLCBub3Qgc2V0dGluZyBwb3N0IGxvZ291dCByZWRpcmVjdCB1cmkiLHQuY29ycmVsYXRpb25JZCk6ZSYmZS5wb3N0TG9nb3V0UmVkaXJlY3RVcmk/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIlNldHRpbmcgcG9zdExvZ291dFJlZGlyZWN0VXJpIHRvIHVyaSBzZXQgb24gbG9nb3V0IHJlcXVlc3QiLHQuY29ycmVsYXRpb25JZCksdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmk9d3IuZ2V0QWJzb2x1dGVVcmwoZS5wb3N0TG9nb3V0UmVkaXJlY3RVcmksYmEoKSkpOm51bGw9PT10aGlzLmNvbmZpZy5hdXRoLnBvc3RMb2dvdXRSZWRpcmVjdFVyaT90aGlzLmxvZ2dlci52ZXJib3NlKCJwb3N0TG9nb3V0UmVkaXJlY3RVcmkgY29uZmlndXJlZCBhcyBudWxsIGFuZCBubyB1cmkgc2V0IG9uIHJlcXVlc3QsIG5vdCBwYXNzaW5nIHBvc3QgbG9nb3V0IHJlZGlyZWN0Iix0LmNvcnJlbGF0aW9uSWQpOnRoaXMuY29uZmlnLmF1dGgucG9zdExvZ291dFJlZGlyZWN0VXJpPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJTZXR0aW5nIHBvc3RMb2dvdXRSZWRpcmVjdFVyaSB0byBjb25maWd1cmVkIHVyaSIsdC5jb3JyZWxhdGlvbklkKSx0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaT13ci5nZXRBYnNvbHV0ZVVybCh0aGlzLmNvbmZpZy5hdXRoLnBvc3RMb2dvdXRSZWRpcmVjdFVyaSxiYSgpKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoIlNldHRpbmcgcG9zdExvZ291dFJlZGlyZWN0VXJpIHRvIGN1cnJlbnQgcGFnZSIsdC5jb3JyZWxhdGlvbklkKSx0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaT13ci5nZXRBYnNvbHV0ZVVybChiYSgpLGJhKCkpKSx0fWdldExvZ291dEhpbnRGcm9tSWRUb2tlbkNsYWltcyhlKXtjb25zdCB0PWUuaWRUb2tlbkNsYWltcztpZih0KXtpZih0LmxvZ2luX2hpbnQpcmV0dXJuIHQubG9naW5faGludDt0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgSUQgVG9rZW4gQ2xhaW1zIHRpZWQgdG8gdGhlIHByb3ZpZGVkIGFjY291bnQgZG8gbm90IGNvbnRhaW4gYSBsb2dpbl9oaW50IGNsYWltLCBsb2dvdXRIaW50IHdpbGwgbm90IGJlIGFkZGVkIHRvIGxvZ291dCByZXF1ZXN0Iil9ZWxzZSB0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgcHJvdmlkZWQgYWNjb3VudCBkb2VzIG5vdCBjb250YWluIElEIFRva2VuIENsYWltcywgbG9nb3V0SGludCB3aWxsIG5vdCBiZSBhZGRlZCB0byBsb2dvdXQgcmVxdWVzdCIpO3JldHVybiBudWxsfWFzeW5jIGNyZWF0ZUF1dGhDb2RlQ2xpZW50KGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCB0PWF3YWl0IFVuKHRoaXMuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShlKTtyZXR1cm4gbmV3IHFvKHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCl9YXN5bmMgZ2V0Q2xpZW50Q29uZmlndXJhdGlvbihlKXtjb25zdHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOnIscmVxdWVzdEF1dGhvcml0eTpuLHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczpvLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczppLGFjY291bnQ6c309ZTt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldENsaWVudENvbmZpZ3VyYXRpb24sdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBhPWUuYXV0aG9yaXR5fHxhd2FpdCBVbih0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3JlcXVlc3RBdXRob3JpdHk6bixyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6byxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6aSxhY2NvdW50OnN9KSxjPXRoaXMuY29uZmlnLnN5c3RlbS5sb2dnZXJPcHRpb25zO3JldHVybnthdXRoT3B0aW9uczp7Y2xpZW50SWQ6dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxhdXRob3JpdHk6YSxjbGllbnRDYXBhYmlsaXRpZXM6dGhpcy5jb25maWcuYXV0aC5jbGllbnRDYXBhYmlsaXRpZXMscmVkaXJlY3RVcmk6dGhpcy5jb25maWcuYXV0aC5yZWRpcmVjdFVyaX0sc3lzdGVtT3B0aW9uczp7dG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kczp0aGlzLmNvbmZpZy5zeXN0ZW0udG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kcyxwcmV2ZW50Q29yc1ByZWZsaWdodDohMH0sbG9nZ2VyT3B0aW9uczp7bG9nZ2VyQ2FsbGJhY2s6Yy5sb2dnZXJDYWxsYmFjayxwaWlMb2dnaW5nRW5hYmxlZDpjLnBpaUxvZ2dpbmdFbmFibGVkLGxvZ0xldmVsOmMubG9nTGV2ZWwsY29ycmVsYXRpb25JZDp0aGlzLmNvcnJlbGF0aW9uSWR9LGNhY2hlT3B0aW9uczp7Y2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDp0aGlzLmNvbmZpZy5jYWNoZS5jbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkfSxjcnlwdG9JbnRlcmZhY2U6dGhpcy5icm93c2VyQ3J5cHRvLG5ldHdvcmtJbnRlcmZhY2U6dGhpcy5uZXR3b3JrQ2xpZW50LHN0b3JhZ2VJbnRlcmZhY2U6dGhpcy5icm93c2VyU3RvcmFnZSxzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOnIsbGlicmFyeUluZm86e3NrdTppcyx2ZXJzaW9uOiRhLGNwdTp0LkVNUFRZX1NUUklORyxvczp0LkVNUFRZX1NUUklOR30sdGVsZW1ldHJ5OnRoaXMuY29uZmlnLnRlbGVtZXRyeX19YXN5bmMgaW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0KGUscil7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBuPXRoaXMuZ2V0UmVkaXJlY3RVcmkoZS5yZWRpcmVjdFVyaSksbz17aW50ZXJhY3Rpb25UeXBlOnJ9LGk9Ym8uc2V0UmVxdWVzdFN0YXRlKHRoaXMuYnJvd3NlckNyeXB0byxlJiZlLnN0YXRlfHx0LkVNUFRZX1NUUklORyxvKSxzPXsuLi5hd2FpdCBVbihLYyxPci5Jbml0aWFsaXplQmFzZVJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHsuLi5lLGNvcnJlbGF0aW9uSWQ6dGhpcy5jb3JyZWxhdGlvbklkfSx0aGlzLmNvbmZpZyx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyKSxyZWRpcmVjdFVyaTpuLHN0YXRlOmksbm9uY2U6ZS5ub25jZXx8b2EoKSxyZXNwb25zZU1vZGU6dGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGV9LGE9ey4uLnMsaHR0cE1ldGhvZDokYyhzLHRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlKX07aWYoZS5sb2dpbkhpbnR8fGUuc2lkKXJldHVybiBhO2NvbnN0IGM9ZS5hY2NvdW50fHx0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEFjdGl2ZUFjY291bnQodGhpcy5jb3JyZWxhdGlvbklkKTtyZXR1cm4gYyYmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlNldHRpbmcgdmFsaWRhdGVkIHJlcXVlc3QgYWNjb3VudCIsdGhpcy5jb3JyZWxhdGlvbklkKSx0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBTZXR0aW5nIHZhbGlkYXRlZCByZXF1ZXN0IGFjY291bnQ6ICR7Yy5ob21lQWNjb3VudElkfWAsdGhpcy5jb3JyZWxhdGlvbklkKSxhLmFjY291bnQ9YyksYX19ZnVuY3Rpb24gamMoZSx0LHIpe2NvbnN0IG49ZnIoZSk7aWYoIW4pdGhyb3cgbXIoZSk/KHIuZXJyb3IoYEEgJHt0fSBpcyBwcmVzZW50IGluIHRoZSBpZnJhbWUgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4ga25vd24gcHJvcGVydGllcy4gSXQncyBsaWtlbHkgdGhhdCB0aGUgJHt0fSBoYXMgYmVlbiByZXBsYWNlZCBieSBjb2RlIHJ1bm5pbmcgb24gdGhlIHJlZGlyZWN0VXJpIHBhZ2UuYCksci5lcnJvclBpaShgVGhlICR7dH0gZGV0ZWN0ZWQgaXM6ICR7ZX1gKSxaaShvaSkpOihyLmVycm9yKGBUaGUgcmVxdWVzdCBoYXMgcmV0dXJuZWQgdG8gdGhlIHJlZGlyZWN0VXJpIGJ1dCBhICR7dH0gaXMgbm90IHByZXNlbnQuIEl0J3MgbGlrZWx5IHRoYXQgdGhlICR7dH0gaGFzIGJlZW4gcmVtb3ZlZCBvciB0aGUgcGFnZSBoYXMgYmVlbiByZWRpcmVjdGVkIGJ5IGNvZGUgcnVubmluZyBvbiB0aGUgcmVkaXJlY3RVcmkgcGFnZS5gKSxaaShyaSkpO3JldHVybiBufWZ1bmN0aW9uIFdjKGUsdCxyKXtpZighZS5zdGF0ZSl0aHJvdyBaaShuaSk7Y29uc3Qgbj1mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiBudWxsO3RyeXtyZXR1cm4gYm8ucGFyc2VSZXF1ZXN0U3RhdGUoZSx0KS5saWJyYXJ5U3RhdGUubWV0YX1jYXRjaChlKXt0aHJvdyBtdChSZSl9fSh0LGUuc3RhdGUpO2lmKCFuKXRocm93IFppKGlpKTtpZihuLmludGVyYWN0aW9uVHlwZSE9PXIpdGhyb3cgWmkoc2kpfWNsYXNzIFZje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyl7dGhpcy5hdXRoTW9kdWxlPWUsdGhpcy5icm93c2VyU3RvcmFnZT10LHRoaXMuYXV0aENvZGVSZXF1ZXN0PXIsdGhpcy5sb2dnZXI9bix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PW99YXN5bmMgaGFuZGxlQ29kZVJlc3BvbnNlKGUsdCl7bGV0IHI7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkhhbmRsZUNvZGVSZXNwb25zZSx0LmNvcnJlbGF0aW9uSWQpO3RyeXtyPWZ1bmN0aW9uKGUsdCl7aWYoeG8oZSx0KSwhZS5jb2RlKXRocm93IG10KHR0KTtyZXR1cm4gZX0oZSx0LnN0YXRlKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2Ygbm8mJmUuc3ViRXJyb3I9PT1oaT9aaShoaSk6ZX1yZXR1cm4gVW4odGhpcy5oYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyLmJpbmQodGhpcyksT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkocix0KX1hc3luYyBoYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyKGUsdCxyPSEwKXtpZih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcix0LmNvcnJlbGF0aW9uSWQpLHRoaXMubG9nZ2VyLnRyYWNlKCJJbnRlcmFjdGlvbkhhbmRsZXIuaGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciBjYWxsZWQiKSx0aGlzLmF1dGhDb2RlUmVxdWVzdC5jb2RlPWUuY29kZSxlLmNsb3VkX2luc3RhbmNlX2hvc3RfbmFtZSYmYXdhaXQgVW4odGhpcy5hdXRoTW9kdWxlLnVwZGF0ZUF1dGhvcml0eS5iaW5kKHRoaXMuYXV0aE1vZHVsZSksT3IuVXBkYXRlVG9rZW5FbmRwb2ludEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkoZS5jbG91ZF9pbnN0YW5jZV9ob3N0X25hbWUsdC5jb3JyZWxhdGlvbklkKSxyJiYoZS5ub25jZT10Lm5vbmNlfHx2b2lkIDApLGUuc3RhdGU9dC5zdGF0ZSxlLmNsaWVudF9pbmZvKXRoaXMuYXV0aENvZGVSZXF1ZXN0LmNsaWVudEluZm89ZS5jbGllbnRfaW5mbztlbHNle2NvbnN0IGU9dGhpcy5jcmVhdGVDY3NDcmVkZW50aWFscyh0KTtlJiYodGhpcy5hdXRoQ29kZVJlcXVlc3QuY2NzQ3JlZGVudGlhbD1lKX1yZXR1cm4gYXdhaXQgVW4odGhpcy5hdXRoTW9kdWxlLmFjcXVpcmVUb2tlbi5iaW5kKHRoaXMuYXV0aE1vZHVsZSksT3IuQXV0aENsaWVudEFjcXVpcmVUb2tlbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkodGhpcy5hdXRoQ29kZVJlcXVlc3QsZSl9Y3JlYXRlQ2NzQ3JlZGVudGlhbHMoZSl7cmV0dXJuIGUuYWNjb3VudD97Y3JlZGVudGlhbDplLmFjY291bnQuaG9tZUFjY291bnRJZCx0eXBlOldyfTplLmxvZ2luSGludD97Y3JlZGVudGlhbDplLmxvZ2luSGludCx0eXBlOlZyfTpudWxsfX1jb25zdCBKYz0idXNlcl9zd2l0Y2giLFljPXtbSmNdOiJVc2VyIGF0dGVtcHRlZCB0byBzd2l0Y2ggYWNjb3VudHMgaW4gdGhlIG5hdGl2ZSBicm9rZXIsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBBbGwgbmV3IGFjY291bnRzIG11c3Qgc2lnbi1pbiB0aHJvdWdoIHRoZSBzdGFuZGFyZCB3ZWIgZmxvdyBmaXJzdCwgcGxlYXNlIHRyeSBhZ2Fpbi4ifTtjbGFzcyBYYyBleHRlbmRzIENle2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcihlLHQpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLFhjLnByb3RvdHlwZSksdGhpcy5uYW1lPSJOYXRpdmVBdXRoRXJyb3IiLHRoaXMuZXh0PXJ9fWZ1bmN0aW9uIFpjKGUpe2lmKGUuZXh0JiZlLmV4dC5zdGF0dXMmJiJESVNBQkxFRCI9PT1lLmV4dC5zdGF0dXMpcmV0dXJuITA7aWYoZS5leHQmJmUuZXh0LmVycm9yJiYtMjE0NzE4Njk0Mz09PWUuZXh0LmVycm9yKXJldHVybiEwO3N3aXRjaChlLmVycm9yQ29kZSl7Y2FzZSJDb250ZW50RXJyb3IiOmNhc2UiUGFnZUV4Y2VwdGlvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gZWwoZSx0LHIpe2lmKHImJnIuc3RhdHVzKXN3aXRjaChyLnN0YXR1cyl7Y2FzZSJBQ0NPVU5UX1VOQVZBSUxBQkxFIjpyZXR1cm4gU28oaG8pO2Nhc2UiVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCI6cmV0dXJuIG5ldyBBbyhlLHQpO2Nhc2UiVVNFUl9DQU5DRUwiOnJldHVybiBaaShoaSk7Y2FzZSJOT19ORVRXT1JLIjpyZXR1cm4gWmkoYmkpO2Nhc2UiVVhfTk9UX0FMTE9XRUQiOnJldHVybiBTbyhnbyl9cmV0dXJuIG5ldyBYYyhlLFljW2VdfHx0LHIpfWNsYXNzIHRsIGV4dGVuZHMgUWN7YXN5bmMgYWNxdWlyZVRva2VuKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRDYWNoZUNsaWVudEFjcXVpcmVUb2tlbixlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5hY3F1aXJlVG9rZW5TaWxlbnRfc2lsZW50Rmxvdykscj1hd2FpdCBVbih0aGlzLmdldENsaWVudENvbmZpZ3VyYXRpb24uYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6dCxyZXF1ZXN0QXV0aG9yaXR5OmUuYXV0aG9yaXR5LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLGFjY291bnQ6ZS5hY2NvdW50fSksbj1uZXcgVW8ocix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTt0aGlzLmxvZ2dlci52ZXJib3NlKCJTaWxlbnQgYXV0aCBjbGllbnQgY3JlYXRlZCIpO3RyeXtjb25zdCB0PShhd2FpdCBVbihuLmFjcXVpcmVDYWNoZWRUb2tlbi5iaW5kKG4pLE9yLlNpbGVudEZsb3dDbGllbnRBY3F1aXJlQ2FjaGVkVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpKVswXTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe2Zyb21DYWNoZTohMH0sZS5jb3JyZWxhdGlvbklkKSx0fWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBYaSYmZS5lcnJvckNvZGU9PT1NaSYmdGhpcy5sb2dnZXIudmVyYm9zZSgiU2lnbmluZyBrZXlwYWlyIGZvciBib3VuZCBhY2Nlc3MgdG9rZW4gbm90IGZvdW5kLiBSZWZyZXNoaW5nIGJvdW5kIGFjY2VzcyB0b2tlbiBhbmQgZ2VuZXJhdGluZyBhIG5ldyBjcnlwdG8ga2V5cGFpci4iKSxlfX1sb2dvdXQoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgibG9nb3V0UmVkaXJlY3QgY2FsbGVkIik7Y29uc3QgdD10aGlzLmluaXRpYWxpemVMb2dvdXRSZXF1ZXN0KGUpO3JldHVybiB0aGlzLmNsZWFyQ2FjaGVPbkxvZ291dCh0LmNvcnJlbGF0aW9uSWQsdD8uYWNjb3VudCl9fWNsYXNzIHJsIGV4dGVuZHMgemN7Y29uc3RydWN0b3IoZSx0LHIsbixvLGkscyxhLGMsbCxoLGQpe3N1cGVyKGUsdCxyLG4sbyxpLGEsYyxkKSx0aGlzLmFwaUlkPXMsdGhpcy5hY2NvdW50SWQ9bCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyPWMsdGhpcy5uYXRpdmVTdG9yYWdlTWFuYWdlcj1oLHRoaXMuc2lsZW50Q2FjaGVDbGllbnQ9bmV3IHRsKGUsdGhpcy5uYXRpdmVTdG9yYWdlTWFuYWdlcixyLG4sbyxpLGEsYyxkKTtjb25zdCB1PXRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuZ2V0RXh0ZW5zaW9uTmFtZSgpO3RoaXMuc2t1cz1Gby5tYWtlRXh0cmFTa3VTdHJpbmcoe2xpYnJhcnlOYW1lOmlzLGxpYnJhcnlWZXJzaW9uOiRhLGV4dGVuc2lvbk5hbWU6dSxleHRlbnNpb25WZXJzaW9uOnRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuZ2V0RXh0ZW5zaW9uVmVyc2lvbigpfSl9YWRkUmVxdWVzdFNLVXMoZSl7ZS5leHRyYVBhcmFtZXRlcnM9ey4uLmUuZXh0cmFQYXJhbWV0ZXJzLFt0bl06dGhpcy5za3VzfX1hc3luYyBhY3F1aXJlVG9rZW4oZSx0KXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuTmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW4sdGhpcy5jb3JyZWxhdGlvbklkKSx0aGlzLmxvZ2dlci50cmFjZSgiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBhY3F1aXJlVG9rZW4gY2FsbGVkLiIpO2NvbnN0IHI9dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLHRoaXMuY29ycmVsYXRpb25JZCksbj1EbigpLG89dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcih0aGlzLmFwaUlkKTt0cnl7Y29uc3QgaT1hd2FpdCB0aGlzLmluaXRpYWxpemVOYXRpdmVSZXF1ZXN0KGUpO3RyeXtjb25zdCBlPWF3YWl0IHRoaXMuYWNxdWlyZVRva2Vuc0Zyb21DYWNoZSh0aGlzLmFjY291bnRJZCxpKTtyZXR1cm4gci5lbmQoe3N1Y2Nlc3M6ITAsaXNOYXRpdmVCcm9rZXI6ITEsZnJvbUNhY2hlOiEwfSksZX1jYXRjaChlKXtpZih0PT09RHMuQWNjZXNzVG9rZW4pdGhyb3cgdGhpcy5sb2dnZXIuaW5mbygiTVNBTCBpbnRlcm5hbCBDYWNoZSBkb2VzIG5vdCBjb250YWluIHRva2VucywgcmV0dXJuIGVycm9yIGFzIHBlciBjYWNoZSBwb2xpY3kiKSxyLmVuZCh7c3VjY2VzczohMSxicm9rZXJFcnJvckNvZGU6ImNhY2hlX3JlcXVlc3RfZmFpbGVkIn0pLGU7dGhpcy5sb2dnZXIuaW5mbygiTVNBTCBpbnRlcm5hbCBDYWNoZSBkb2VzIG5vdCBjb250YWluIHRva2VucywgcHJvY2VlZCB0byBtYWtlIGEgbmF0aXZlIGNhbGwiKX1jb25zdCBzPWF3YWl0IHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuc2VuZE1lc3NhZ2UoaSk7cmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlTmF0aXZlUmVzcG9uc2UocyxpLG4pLnRoZW4oKGU9PihyLmVuZCh7c3VjY2VzczohMCxpc05hdGl2ZUJyb2tlcjohMCxyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9KSxvLmNsZWFyTmF0aXZlQnJva2VyRXJyb3JDb2RlKCksZSkpKS5jYXRjaCgoZT0+e3Rocm93IHIuZW5kKHtzdWNjZXNzOiExLGVycm9yQ29kZTplLmVycm9yQ29kZSxzdWJFcnJvckNvZGU6ZS5zdWJFcnJvcn0pLGV9KSl9Y2F0Y2goZSl7dGhyb3cgZSBpbnN0YW5jZW9mIFhjJiZvLnNldE5hdGl2ZUJyb2tlckVycm9yQ29kZShlLmVycm9yQ29kZSksci5lbmQoe3N1Y2Nlc3M6ITF9KSxlfX1jcmVhdGVTaWxlbnRDYWNoZVJlcXVlc3QoZSx0KXtyZXR1cm57YXV0aG9yaXR5OmUuYXV0aG9yaXR5LGNvcnJlbGF0aW9uSWQ6dGhpcy5jb3JyZWxhdGlvbklkLHNjb3BlczpYdC5mcm9tU3RyaW5nKGUuc2NvcGUpLmFzQXJyYXkoKSxhY2NvdW50OnQsZm9yY2VSZWZyZXNoOiExfX1hc3luYyBhY3F1aXJlVG9rZW5zRnJvbUNhY2hlKGUsdCl7aWYoIWUpdGhyb3cgdGhpcy5sb2dnZXIud2FybmluZygiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQ6YWNxdWlyZVRva2Vuc0Zyb21DYWNoZSAtIE5vIG5hdGl2ZUFjY291bnRJZCBwcm92aWRlZCIpLG10KGplKTtjb25zdCByPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0QmFzZUFjY291bnRJbmZvKHtuYXRpdmVBY2NvdW50SWQ6ZX0sdGhpcy5jb3JyZWxhdGlvbklkKTtpZighcil0aHJvdyBtdChqZSk7dHJ5e2NvbnN0IGU9dGhpcy5jcmVhdGVTaWxlbnRDYWNoZVJlcXVlc3QodCxyKSxuPWF3YWl0IHRoaXMuc2lsZW50Q2FjaGVDbGllbnQuYWNxdWlyZVRva2VuKGUpLG89ey4uLnIsaWRUb2tlbkNsYWltczpuPy5pZFRva2VuQ2xhaW1zLGlkVG9rZW46bj8uaWRUb2tlbn07cmV0dXJuey4uLm4sYWNjb3VudDpvfX1jYXRjaChlKXt0aHJvdyBlfX1hc3luYyBhY3F1aXJlVG9rZW5SZWRpcmVjdChlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGFjcXVpcmVUb2tlblJlZGlyZWN0IGNhbGxlZC4iKTtjb25zdHsuLi5yfT1lO2RlbGV0ZSByLm9uUmVkaXJlY3ROYXZpZ2F0ZTtjb25zdCBuPWF3YWl0IHRoaXMuaW5pdGlhbGl6ZU5hdGl2ZVJlcXVlc3Qocik7dHJ5e2F3YWl0IHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuc2VuZE1lc3NhZ2Uobil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFhjKXtpZih0aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpLnNldE5hdGl2ZUJyb2tlckVycm9yQ29kZShlLmVycm9yQ29kZSksWmMoZSkpdGhyb3cgZX19dGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShScyxKU09OLnN0cmluZ2lmeShuKSwhMCk7Y29uc3Qgbz17YXBpSWQ6TXMuYWNxdWlyZVRva2VuUmVkaXJlY3QsdGltZW91dDp0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCxub0hpc3Rvcnk6ITF9LGk9dGhpcy5jb25maWcuYXV0aC5uYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsP3dpbmRvdy5sb2NhdGlvbi5ocmVmOnRoaXMuZ2V0UmVkaXJlY3RVcmkoZS5yZWRpcmVjdFVyaSk7dC5lbmQoe3N1Y2Nlc3M6ITB9KSxhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVFeHRlcm5hbChpLG8pfWFzeW5jIGhhbmRsZVJlZGlyZWN0UHJvbWlzZShlLHQpe2lmKHRoaXMubG9nZ2VyLnRyYWNlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQuIiksIXRoaXMuYnJvd3NlclN0b3JhZ2UuaXNJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITApKXJldHVybiB0aGlzLmxvZ2dlci5pbmZvKCJoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbnRlcmFjdGlvbiBpbiBwcm9ncmVzcywgcmV0dXJuaW5nIG51bGwuIiksbnVsbDtjb25zdCByPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCgpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQgYnV0IHRoZXJlIGlzIG5vIGNhY2hlZCByZXF1ZXN0LCByZXR1cm5pbmcgbnVsbC4iKSxlJiZ0JiZlPy5hZGRGaWVsZHMoe2Vycm9yQ29kZToibm9fY2FjaGVkX3JlcXVlc3QifSx0KSxudWxsO2NvbnN0e3Byb21wdDpuLC4uLm99PXI7biYmdGhpcy5sb2dnZXIudmVyYm9zZSgiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGFuZCBwcm9tcHQgd2FzIGluY2x1ZGVkIGluIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCByZW1vdmluZyBwcm9tcHQgZnJvbSBjYWNoZWQgcmVxdWVzdCB0byBwcmV2ZW50IHNlY29uZCBpbnRlcmFjdGlvbiB3aXRoIG5hdGl2ZSBicm9rZXIgd2luZG93LiIpLHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmJyb3dzZXJTdG9yYWdlLmdlbmVyYXRlQ2FjaGVLZXkoUnMpKTtjb25zdCBpPURuKCk7dHJ5e3RoaXMubG9nZ2VyLnZlcmJvc2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gaGFuZGxlUmVkaXJlY3RQcm9taXNlIHNlbmRpbmcgbWVzc2FnZSB0byBuYXRpdmUgYnJva2VyLiIpO2NvbnN0IHQ9YXdhaXQgdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlci5zZW5kTWVzc2FnZShvKSxyPWF3YWl0IHRoaXMuaGFuZGxlTmF0aXZlUmVzcG9uc2UodCxvLGkpO3JldHVybiB0aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpLmNsZWFyTmF0aXZlQnJva2VyRXJyb3JDb2RlKCksZSYmdGhpcy5jb3JyZWxhdGlvbklkJiZ0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7aXNOYXRpdmVCcm9rZXI6ITB9LHRoaXMuY29ycmVsYXRpb25JZCkscn1jYXRjaChlKXt0aHJvdyBlfX1sb2dvdXQoKXtyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gbG9nb3V0IGNhbGxlZC4iKSxQcm9taXNlLnJlamVjdCgiTG9nb3V0IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKX1hc3luYyBoYW5kbGVOYXRpdmVSZXNwb25zZShlLHQscil7dGhpcy5sb2dnZXIudHJhY2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gaGFuZGxlTmF0aXZlUmVzcG9uc2UgY2FsbGVkLiIpO2NvbnN0IG49ZHIoZS5pZF90b2tlbixLcyksbz10aGlzLmNyZWF0ZUhvbWVBY2NvdW50SWRlbnRpZmllcihlLG4pLGk9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoe25hdGl2ZUFjY291bnRJZDp0LmFjY291bnRJZH0sdGhpcy5jb3JyZWxhdGlvbklkKT8uaG9tZUFjY291bnRJZDtpZih0LmV4dHJhUGFyYW1ldGVycz8uY2hpbGRfY2xpZW50X2lkJiZlLmFjY291bnQuaWQhPT10LmFjY291bnRJZCl0aGlzLmxvZ2dlci5pbmZvKCJoYW5kbGVOYXRpdmVTZXJ2ZXJSZXNwb25zZTogRG91YmxlIGJyb2tlciBmbG93IGRldGVjdGVkLCBpZ25vcmluZyBhY2NvdW50SWQgbWlzbWF0Y2giKTtlbHNlIGlmKG8hPT1pJiZlLmFjY291bnQuaWQhPT10LmFjY291bnRJZCl0aHJvdyBlbChKYyk7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkoe3JlcXVlc3RBdXRob3JpdHk6dC5hdXRob3JpdHl9KSxhPU1vKHRoaXMuYnJvd3NlclN0b3JhZ2UscyxvLEtzLHRoaXMuY29ycmVsYXRpb25JZCxuLGUuY2xpZW50X2luZm8sdm9pZCAwLG4udGlkLHZvaWQgMCxlLmFjY291bnQuaWQsdGhpcy5sb2dnZXIpO2UuZXhwaXJlc19pbj1OdW1iZXIoZS5leHBpcmVzX2luKTtjb25zdCBjPWF3YWl0IHRoaXMuZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdChlLHQsbixhLHMuY2Fub25pY2FsQXV0aG9yaXR5LHIpO3JldHVybiBhd2FpdCB0aGlzLmNhY2hlQWNjb3VudChhLHRoaXMuY29ycmVsYXRpb25JZCx1cihuKSksYXdhaXQgdGhpcy5jYWNoZU5hdGl2ZVRva2VucyhlLHQsbyxuLGUuYWNjZXNzX3Rva2VuLGMudGVuYW50SWQsciksY31jcmVhdGVIb21lQWNjb3VudElkZW50aWZpZXIoZSxyKXtyZXR1cm4gaHIuZ2VuZXJhdGVIb21lQWNjb3VudElkKGUuY2xpZW50X2luZm98fHQuRU1QVFlfU1RSSU5HLG9yLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlckNyeXB0byxyKX1nZW5lcmF0ZVNjb3BlcyhlLHQpe3JldHVybiB0P1h0LmZyb21TdHJpbmcodCk6WHQuZnJvbVN0cmluZyhlKX1hc3luYyBnZW5lcmF0ZVBvcEFjY2Vzc1Rva2VuKGUsdCl7aWYodC50b2tlblR5cGU9PT1XLlBPUCYmdC5zaWduUG9wVG9rZW4pe2lmKGUuc2hyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiaGFuZGxlTmF0aXZlU2VydmVyUmVzcG9uc2U6IFNIUiBpcyBlbmFibGVkIGluIG5hdGl2ZSBsYXllciIpLGUuc2hyO2NvbnN0IHI9bmV3IFJvKHRoaXMuYnJvd3NlckNyeXB0byksbj17cmVzb3VyY2VSZXF1ZXN0TWV0aG9kOnQucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLHJlc291cmNlUmVxdWVzdFVyaTp0LnJlc291cmNlUmVxdWVzdFVyaSxzaHJDbGFpbXM6dC5zaHJDbGFpbXMsc2hyTm9uY2U6dC5zaHJOb25jZX07aWYoIXQua2V5SWQpdGhyb3cgbXQob3QpO3JldHVybiByLnNpZ25Qb3BUb2tlbihlLmFjY2Vzc190b2tlbix0LmtleUlkLG4pfXJldHVybiBlLmFjY2Vzc190b2tlbn1hc3luYyBnZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KGUscixuLG8saSxzKXtjb25zdCBhPXRoaXMuYWRkVGVsZW1ldHJ5RnJvbU5hdGl2ZVJlc3BvbnNlKGUucHJvcGVydGllcy5NQVRTKSxjPXRoaXMuZ2VuZXJhdGVTY29wZXMoci5zY29wZSxlLnNjb3BlKSxsPWUuYWNjb3VudC5wcm9wZXJ0aWVzfHx7fSxoPWwuVUlEfHxuLm9pZHx8bi5zdWJ8fHQuRU1QVFlfU1RSSU5HLGQ9bC5UZW5hbnRJZHx8bi50aWR8fHQuRU1QVFlfU1RSSU5HLHU9bnIoaHIuZ2V0QWNjb3VudEluZm8obyksdm9pZCAwLG4sZS5pZF90b2tlbik7dS5uYXRpdmVBY2NvdW50SWQhPT1lLmFjY291bnQuaWQmJih1Lm5hdGl2ZUFjY291bnRJZD1lLmFjY291bnQuaWQpO2NvbnN0IGc9YXdhaXQgdGhpcy5nZW5lcmF0ZVBvcEFjY2Vzc1Rva2VuKGUscikscD1yLnRva2VuVHlwZT09PVcuUE9QP1cuUE9QOlcuQkVBUkVSO3JldHVybnthdXRob3JpdHk6aSx1bmlxdWVJZDpoLHRlbmFudElkOmQsc2NvcGVzOmMuYXNBcnJheSgpLGFjY291bnQ6dSxpZFRva2VuOmUuaWRfdG9rZW4saWRUb2tlbkNsYWltczpuLGFjY2Vzc1Rva2VuOmcsZnJvbUNhY2hlOiEhYSYmdGhpcy5pc1Jlc3BvbnNlRnJvbUNhY2hlKGEpLGV4cGlyZXNPbjp4bihzK2UuZXhwaXJlc19pbiksdG9rZW5UeXBlOnAsY29ycmVsYXRpb25JZDp0aGlzLmNvcnJlbGF0aW9uSWQsc3RhdGU6ZS5zdGF0ZSxmcm9tTmF0aXZlQnJva2VyOiEwfX1hc3luYyBjYWNoZUFjY291bnQoZSx0LHIpe2F3YWl0IHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0QWNjb3VudChlLHRoaXMuY29ycmVsYXRpb25JZCxyKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUFjY291bnRDb250ZXh0KGhyLmdldEFjY291bnRJbmZvKGUpLHQpfWNhY2hlTmF0aXZlVG9rZW5zKGUscixuLG8saSxzLGEpe2NvbnN0IGM9S24obixyLmF1dGhvcml0eSxlLmlkX3Rva2VufHwiIixyLmNsaWVudElkLG8udGlkfHwiIiksbD1hKyhyLnRva2VuVHlwZT09PVcuUE9QP3QuU0hSX05PTkNFX1ZBTElESVRZOigic3RyaW5nIj09dHlwZW9mIGUuZXhwaXJlc19pbj9wYXJzZUludChlLmV4cGlyZXNfaW4sMTApOmUuZXhwaXJlc19pbil8fDApLGg9dGhpcy5nZW5lcmF0ZVNjb3BlcyhlLnNjb3BlLHIuc2NvcGUpLGQ9e2lkVG9rZW46YyxhY2Nlc3NUb2tlbjpHbihuLHIuYXV0aG9yaXR5LGksci5jbGllbnRJZCxvLnRpZHx8cyxoLnByaW50U2NvcGVzKCksbCwwLEtzLHZvaWQgMCxyLnRva2VuVHlwZSx2b2lkIDAsci5rZXlJZCl9O3JldHVybiB0aGlzLm5hdGl2ZVN0b3JhZ2VNYW5hZ2VyLnNhdmVDYWNoZVJlY29yZChkLHRoaXMuY29ycmVsYXRpb25JZCx1cihvKSxyLnN0b3JlSW5DYWNoZSl9Z2V0RXhwaXJlc0luVmFsdWUoZSxyKXtyZXR1cm4gZT09PVcuUE9QP3QuU0hSX05PTkNFX1ZBTElESVRZOigic3RyaW5nIj09dHlwZW9mIHI/cGFyc2VJbnQociwxMCk6cil8fDB9YWRkVGVsZW1ldHJ5RnJvbU5hdGl2ZVJlc3BvbnNlKGUpe2NvbnN0IHQ9dGhpcy5nZXRNQVRTRnJvbVJlc3BvbnNlKGUpO3JldHVybiB0Pyh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7ZXh0ZW5zaW9uSWQ6dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlci5nZXRFeHRlbnNpb25JZCgpLGV4dGVuc2lvblZlcnNpb246dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlci5nZXRFeHRlbnNpb25WZXJzaW9uKCksbWF0c0Jyb2tlclZlcnNpb246dC5icm9rZXJfdmVyc2lvbixtYXRzQWNjb3VudEpvaW5PblN0YXJ0OnQuYWNjb3VudF9qb2luX29uX3N0YXJ0LG1hdHNBY2NvdW50Sm9pbk9uRW5kOnQuYWNjb3VudF9qb2luX29uX2VuZCxtYXRzRGV2aWNlSm9pbjp0LmRldmljZV9qb2luLG1hdHNQcm9tcHRCZWhhdmlvcjp0LnByb21wdF9iZWhhdmlvcixtYXRzQXBpRXJyb3JDb2RlOnQuYXBpX2Vycm9yX2NvZGUsbWF0c1VpVmlzaWJsZTp0LnVpX3Zpc2libGUsbWF0c1NpbGVudENvZGU6dC5zaWxlbnRfY29kZSxtYXRzU2lsZW50QmlTdWJDb2RlOnQuc2lsZW50X2JpX3N1Yl9jb2RlLG1hdHNTaWxlbnRNZXNzYWdlOnQuc2lsZW50X21lc3NhZ2UsbWF0c1NpbGVudFN0YXR1czp0LnNpbGVudF9zdGF0dXMsbWF0c0h0dHBTdGF0dXM6dC5odHRwX3N0YXR1cyxtYXRzSHR0cEV2ZW50Q291bnQ6dC5odHRwX2V2ZW50X2NvdW50fSx0aGlzLmNvcnJlbGF0aW9uSWQpLHQpOm51bGx9Z2V0TUFUU0Zyb21SZXNwb25zZShlKXtpZihlKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXt0aGlzLmxvZ2dlci5lcnJvcigiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBFcnJvciBwYXJzaW5nIE1BVFMgdGVsZW1ldHJ5LCByZXR1cm5pbmcgbnVsbCBpbnN0ZWFkIil9cmV0dXJuIG51bGx9aXNSZXNwb25zZUZyb21DYWNoZShlKXtyZXR1cm4gdm9pZCAwPT09ZS5pc19jYWNoZWQ/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gTUFUUyB0ZWxlbWV0cnkgZG9lcyBub3QgY29udGFpbiBmaWVsZCBpbmRpY2F0aW5nIGlmIHJlc3BvbnNlIHdhcyBzZXJ2ZWQgZnJvbSBjYWNoZS4gUmV0dXJuaW5nIGZhbHNlLiIpLCExKTohIWUuaXNfY2FjaGVkfWFzeW5jIGluaXRpYWxpemVOYXRpdmVSZXF1ZXN0KGUpe3RoaXMubG9nZ2VyLnRyYWNlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGluaXRpYWxpemVOYXRpdmVSZXF1ZXN0IGNhbGxlZCIpO2NvbnN0IHQ9YXdhaXQgdGhpcy5nZXRDYW5vbmljYWxBdXRob3JpdHkoZSkse3Njb3BlczpyLC4uLm59PWUsbz1uZXcgWHQocnx8W10pO28uYXBwZW5kU2NvcGVzKGgpO2NvbnN0IGk9ey4uLm4sYWNjb3VudElkOnRoaXMuYWNjb3VudElkLGNsaWVudElkOnRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsYXV0aG9yaXR5OnQudXJsU3RyaW5nLHNjb3BlOm8ucHJpbnRTY29wZXMoKSxyZWRpcmVjdFVyaTp0aGlzLmdldFJlZGlyZWN0VXJpKGUucmVkaXJlY3RVcmkpLHByb21wdDp0aGlzLmdldFByb21wdChlLnByb21wdCksY29ycmVsYXRpb25JZDp0aGlzLmNvcnJlbGF0aW9uSWQsdG9rZW5UeXBlOmUuYXV0aGVudGljYXRpb25TY2hlbWUsd2luZG93VGl0bGVTdWJzdHJpbmc6ZG9jdW1lbnQudGl0bGUsZXh0cmFQYXJhbWV0ZXJzOnsuLi5lLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLC4uLmUudG9rZW5RdWVyeVBhcmFtZXRlcnN9LGV4dGVuZGVkRXhwaXJ5VG9rZW46ITEsa2V5SWQ6ZS5wb3BLaWR9O2lmKGkuc2lnblBvcFRva2VuJiZlLnBvcEtpZCl0aHJvdyBaaShLaSk7aWYodGhpcy5oYW5kbGVFeHRyYUJyb2tlclBhcmFtcyhpKSxpLmV4dHJhUGFyYW1ldGVycz1pLmV4dHJhUGFyYW1ldGVyc3x8e30saS5leHRyYVBhcmFtZXRlcnMudGVsZW1ldHJ5PWNzLGUuYXV0aGVudGljYXRpb25TY2hlbWU9PT1XLlBPUCl7Y29uc3QgdD17cmVzb3VyY2VSZXF1ZXN0VXJpOmUucmVzb3VyY2VSZXF1ZXN0VXJpLHJlc291cmNlUmVxdWVzdE1ldGhvZDplLnJlc291cmNlUmVxdWVzdE1ldGhvZCxzaHJDbGFpbXM6ZS5zaHJDbGFpbXMsc2hyTm9uY2U6ZS5zaHJOb25jZX0scj1uZXcgUm8odGhpcy5icm93c2VyQ3J5cHRvKTtsZXQgbjtpZihpLmtleUlkKW49dGhpcy5icm93c2VyQ3J5cHRvLmJhc2U2NFVybEVuY29kZShKU09OLnN0cmluZ2lmeSh7a2lkOmkua2V5SWR9KSksaS5zaWduUG9wVG9rZW49ITE7ZWxzZXtjb25zdCBlPWF3YWl0IFVuKHIuZ2VuZXJhdGVDbmYuYmluZChyKSxPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKSh0LHRoaXMubG9nZ2VyKTtuPWUucmVxQ25mU3RyaW5nLGkua2V5SWQ9ZS5raWQsaS5zaWduUG9wVG9rZW49ITB9aS5yZXFDbmY9bn1yZXR1cm4gdGhpcy5hZGRSZXF1ZXN0U0tVcyhpKSxpfWFzeW5jIGdldENhbm9uaWNhbEF1dGhvcml0eShlKXtjb25zdCB0PWUuYXV0aG9yaXR5fHx0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eTtlLmFjY291bnQmJmF3YWl0IHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eSh7cmVxdWVzdEF1dGhvcml0eTp0LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLGFjY291bnQ6ZS5hY2NvdW50fSk7Y29uc3Qgcj1uZXcgd3IodCk7cmV0dXJuIHIudmFsaWRhdGVBc1VyaSgpLHJ9Z2V0UHJvbXB0KGUpe3N3aXRjaCh0aGlzLmFwaUlkKXtjYXNlIE1zLnNzb1NpbGVudDpjYXNlIE1zLmFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93OnJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiaW5pdGlhbGl6ZU5hdGl2ZVJlcXVlc3Q6IHNpbGVudCByZXF1ZXN0IHNldHMgcHJvbXB0IHRvIG5vbmUiKSxiLk5PTkV9aWYoZSlzd2l0Y2goZSl7Y2FzZSBiLk5PTkU6Y2FzZSBiLkNPTlNFTlQ6Y2FzZSBiLkxPR0lOOmNhc2UgYi5TRUxFQ1RfQUNDT1VOVDpyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoImluaXRpYWxpemVOYXRpdmVSZXF1ZXN0OiBwcm9tcHQgaXMgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSBmbG93IiksZTtkZWZhdWx0OnRocm93IHRoaXMubG9nZ2VyLnRyYWNlKGBpbml0aWFsaXplTmF0aXZlUmVxdWVzdDogcHJvbXB0ID0gJHtlfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSBmbG93YCksWmkoRmkpfWVsc2UgdGhpcy5sb2dnZXIudHJhY2UoImluaXRpYWxpemVOYXRpdmVSZXF1ZXN0OiBwcm9tcHQgd2FzIG5vdCBwcm92aWRlZCIpfWhhbmRsZUV4dHJhQnJva2VyUGFyYW1zKGUpe2NvbnN0IHQ9ZS5leHRyYVBhcmFtZXRlcnMmJmUuZXh0cmFQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KHJuKSYmZS5leHRyYVBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkobm4pJiZlLmV4dHJhUGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eShKcik7aWYoIWUuZW1iZWRkZWRDbGllbnRJZCYmIXQpcmV0dXJuO2xldCByPSIiO2NvbnN0IG49ZS5yZWRpcmVjdFVyaTtlLmVtYmVkZGVkQ2xpZW50SWQ/KGUucmVkaXJlY3RVcmk9dGhpcy5jb25maWcuYXV0aC5yZWRpcmVjdFVyaSxyPWUuZW1iZWRkZWRDbGllbnRJZCk6ZS5leHRyYVBhcmFtZXRlcnMmJihlLnJlZGlyZWN0VXJpPWUuZXh0cmFQYXJhbWV0ZXJzW25uXSxyPWUuZXh0cmFQYXJhbWV0ZXJzW0pyXSksZS5leHRyYVBhcmFtZXRlcnM9e2NoaWxkX2NsaWVudF9pZDpyLGNoaWxkX3JlZGlyZWN0X3VyaTpufSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRGaWVsZHMoe2VtYmVkZGVkQ2xpZW50SWQ6cixlbWJlZGRlZFJlZGlyZWN0VXJpOm59LHRoaXMuY29ycmVsYXRpb25JZCl9fWFzeW5jIGZ1bmN0aW9uIG5sKGUsdCxyLG4sbyl7Y29uc3QgaT1Ebyh7Li4uZS5hdXRoLGF1dGhvcml0eTp0fSxyLG4sbyk7aWYoeW4oaSx7c2t1OmlzLHZlcnNpb246JGEsb3M6IiIsY3B1OiIifSksZS5hdXRoLnByb3RvY29sTW9kZSE9PWxyLk9JREMmJkNuKGksZS50ZWxlbWV0cnkuYXBwbGljYXRpb24pLHIucGxhdGZvcm1Ccm9rZXImJihmdW5jdGlvbihlKXtlLnNldCgibmF0aXZlYnJva2VyIiwiMSIpfShpKSxvLmFkZEZpZWxkcyh7aXNQbGF0Zm9ybUF1dGhvcml6ZVJlcXVlc3Q6ITB9LHIuY29ycmVsYXRpb25JZCksci5hdXRoZW50aWNhdGlvblNjaGVtZT09PVcuUE9QKSl7Y29uc3QgZT1uZXcgeWMobixvKSx0PW5ldyBSbyhlKTtsZXQgcztpZihyLnBvcEtpZClzPWUuZW5jb2RlS2lkKHIucG9wS2lkKTtlbHNle3M9KGF3YWl0IFVuKHQuZ2VuZXJhdGVDbmYuYmluZCh0KSxPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLG4sbyxyLmNvcnJlbGF0aW9uSWQpKHIsbikpLnJlcUNuZlN0cmluZ31fbihpLHMpfXJldHVybiBzbihpLHIuY29ycmVsYXRpb25JZCxvKSxpfWFzeW5jIGZ1bmN0aW9uIG9sKGUscixuLG8saSl7aWYoIW4uY29kZUNoYWxsZW5nZSl0aHJvdyBKdChPdCk7Y29uc3Qgcz1hd2FpdCBVbihubCxPci5HZXRTdGFuZGFyZFBhcmFtcyxvLGksbi5jb3JyZWxhdGlvbklkKShlLHIsbixvLGkpO3JldHVybiBhbihzLEUpLHZuKHMsbi5jb2RlQ2hhbGxlbmdlLHQuUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0QpLEVuKHMsbi5leHRyYVF1ZXJ5UGFyYW1ldGVyc3x8e30pLEhvKHIscyxlLmF1dGguZW5jb2RlRXh0cmFRdWVyeVBhcmFtcyxuLmV4dHJhUXVlcnlQYXJhbWV0ZXJzKX1hc3luYyBmdW5jdGlvbiBpbChlLHIsbixvLGkscyl7aWYoIW8uZWFySndrKXRocm93IFppKFhvKTtjb25zdCBhPWF3YWl0IG5sKHIsbixvLGkscyk7YW4oYSxSKSxmdW5jdGlvbihlLHQpe2Uuc2V0KCJlYXJfandrIixlbmNvZGVVUklDb21wb25lbnQodCkpLGUuc2V0KCJlYXJfandlX2NyeXB0byIsImV5SmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNalUyUjBOTkluMCIpfShhLG8uZWFySndrKSx2bihhLG8uY29kZUNoYWxsZW5nZSx0LlMyNTZfQ09ERV9DSEFMTEVOR0VfTUVUSE9EKTtjb25zdCBjPW5ldyBNYXA7RW4oYyxvLmV4dHJhUXVlcnlQYXJhbWV0ZXJzfHx7fSk7cmV0dXJuIGFsKGUsSG8obixjLHIuYXV0aC5lbmNvZGVFeHRyYVF1ZXJ5UGFyYW1zLG8uZXh0cmFRdWVyeVBhcmFtZXRlcnMpLGEpfWFzeW5jIGZ1bmN0aW9uIHNsKGUscixuLG8saSxzKXtjb25zdCBhPWF3YWl0IG5sKHIsbixvLGkscyk7YW4oYSxFKSx2bihhLG8uY29kZUNoYWxsZW5nZSxvLmNvZGVDaGFsbGVuZ2VNZXRob2R8fHQuUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0QpLGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFt0LHJdKT0+e3ImJmUuc2V0KHQscil9KSl9KGEsby5hdXRob3JpemVQb3N0Qm9keVBhcmFtZXRlcnN8fHt9KTtjb25zdCBjPW5ldyBNYXA7RW4oYyxvLmV4dHJhUXVlcnlQYXJhbWV0ZXJzfHx7fSk7cmV0dXJuIGFsKGUsSG8obixjLHIuYXV0aC5lbmNvZGVFeHRyYVF1ZXJ5UGFyYW1zLG8uZXh0cmFRdWVyeVBhcmFtZXRlcnMpLGEpfWZ1bmN0aW9uIGFsKGUsdCxyKXtjb25zdCBuPWUuY3JlYXRlRWxlbWVudCgiZm9ybSIpO3JldHVybiBuLm1ldGhvZD0icG9zdCIsbi5hY3Rpb249dCxyLmZvckVhY2goKCh0LHIpPT57Y29uc3Qgbz1lLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7by5oaWRkZW49ITAsby5uYW1lPXIsby52YWx1ZT10LG4uYXBwZW5kQ2hpbGQobyl9KSksZS5ib2R5LmFwcGVuZENoaWxkKG4pLG59YXN5bmMgZnVuY3Rpb24gY2woZSx0LHIsbixvLGkscyxhLGMsbCl7aWYoYS52ZXJib3NlKCJBY2NvdW50IGlkIGZvdW5kLCBjYWxsaW5nIFdBTSBmb3IgdG9rZW4iKSwhbCl0aHJvdyBaaSh4aSk7Y29uc3QgaD1uZXcgeWMoYSxjKSxkPW5ldyBybChuLG8saCxhLHMsbi5zeXN0ZW0ubmF2aWdhdGlvbkNsaWVudCxyLGMsbCx0LGksZS5jb3JyZWxhdGlvbklkKSx7dXNlclJlcXVlc3RTdGF0ZTp1fT1iby5wYXJzZVJlcXVlc3RTdGF0ZShoLGUuc3RhdGUpO3JldHVybiBVbihkLmFjcXVpcmVUb2tlbi5iaW5kKGQpLE9yLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLGEsYyxlLmNvcnJlbGF0aW9uSWQpKHsuLi5lLHN0YXRlOnUscHJvbXB0OnZvaWQgMH0pfWFzeW5jIGZ1bmN0aW9uIGxsKGUsdCxyLG4sbyxpLHMsYSxjLGwsaCxkKXtpZihpby5yZW1vdmVUaHJvdHRsZShzLG8uYXV0aC5jbGllbnRJZCxlKSx0LmFjY291bnRJZClyZXR1cm4gVW4oY2wsT3IuSGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlcixsLGgsZS5jb3JyZWxhdGlvbklkKShlLHQuYWNjb3VudElkLG4sbyxzLGEsYyxsLGgsZCk7Y29uc3QgdT17Li4uZSxjb2RlOnQuY29kZXx8IiIsY29kZVZlcmlmaWVyOnJ9LGc9bmV3IFZjKGkscyx1LGwsaCk7cmV0dXJuIGF3YWl0IFVuKGcuaGFuZGxlQ29kZVJlc3BvbnNlLmJpbmQoZyksT3IuSGFuZGxlQ29kZVJlc3BvbnNlLGwsaCxlLmNvcnJlbGF0aW9uSWQpKHQsZSl9YXN5bmMgZnVuY3Rpb24gaGwoZSx0LHIsbixvLGkscyxhLGMsbCxoKXtpZihpby5yZW1vdmVUaHJvdHRsZShpLG4uYXV0aC5jbGllbnRJZCxlKSx4byh0LGUuc3RhdGUpLCF0LmVhcl9qd2UpdGhyb3cgWmkoWm8pO2lmKCFlLmVhckp3ayl0aHJvdyBaaShYbyk7Y29uc3QgZD1KU09OLnBhcnNlKGF3YWl0IFVuKGFhLE9yLkRlY3J5cHRFYXJSZXNwb25zZSxjLGwsZS5jb3JyZWxhdGlvbklkKShlLmVhckp3ayx0LmVhcl9qd2UpKTtpZihkLmFjY291bnRJZClyZXR1cm4gVW4oY2wsT3IuSGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlcixjLGwsZS5jb3JyZWxhdGlvbklkKShlLGQuYWNjb3VudElkLHIsbixpLHMsYSxjLGwsaCk7Y29uc3QgdT1uZXcgUG8obi5hdXRoLmNsaWVudElkLGksbmV3IHljKGMsbCksYyxudWxsLG51bGwsbCk7dS52YWxpZGF0ZVRva2VuUmVzcG9uc2UoZCk7Y29uc3QgZz17Y29kZToiIixzdGF0ZTplLnN0YXRlLG5vbmNlOmUubm9uY2UsY2xpZW50X2luZm86ZC5jbGllbnRfaW5mbyxjbG91ZF9ncmFwaF9ob3N0X25hbWU6ZC5jbG91ZF9ncmFwaF9ob3N0X25hbWUsY2xvdWRfaW5zdGFuY2VfaG9zdF9uYW1lOmQuY2xvdWRfaW5zdGFuY2VfaG9zdF9uYW1lLGNsb3VkX2luc3RhbmNlX25hbWU6ZC5jbG91ZF9pbnN0YW5jZV9uYW1lLG1zZ3JhcGhfaG9zdDpkLm1zZ3JhcGhfaG9zdH07cmV0dXJuIGF3YWl0IFVuKHUuaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZS5iaW5kKHUpLE9yLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsYyxsLGUuY29ycmVsYXRpb25JZCkoZCxvLERuKCksZSxnLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gZGwoZSx0LHIpe2UuYWRkUXVldWVNZWFzdXJlbWVudChPci5HZW5lcmF0ZVBrY2VDb2RlcyxyKTtjb25zdCBuPU5uKHVsLE9yLkdlbmVyYXRlQ29kZVZlcmlmaWVyLHQsZSxyKShlLHQscik7cmV0dXJue3ZlcmlmaWVyOm4sY2hhbGxlbmdlOmF3YWl0IFVuKGdsLE9yLkdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllcix0LGUscikobixlLHQscil9fWZ1bmN0aW9uIHVsKGUsdCxyKXt0cnl7Y29uc3Qgbj1uZXcgVWludDhBcnJheSgzMik7Tm4ocmEsT3IuR2V0UmFuZG9tVmFsdWVzLHQsZSxyKShuKTtyZXR1cm4gQnMobil9Y2F0Y2goZSl7dGhyb3cgWmkoWW8pfX1hc3luYyBmdW5jdGlvbiBnbChlLHQscixuKXt0LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuR2VuZXJhdGVDb2RlQ2hhbGxlbmdlRnJvbVZlcmlmaWVyLG4pO3RyeXtjb25zdCBvPWF3YWl0IFVuKHRhLE9yLlNoYTI1NkRpZ2VzdCxyLHQsbikoZSx0LG4pO3JldHVybiBCcyhuZXcgVWludDhBcnJheShvKSl9Y2F0Y2goZSl7dGhyb3cgWmkoWW8pfX1jbGFzcyBwbHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmxvZ2dlcj1lLHRoaXMuaGFuZHNoYWtlVGltZW91dE1zPXQsdGhpcy5leHRlbnNpb25JZD1uLHRoaXMucmVzb2x2ZXJzPW5ldyBNYXAsdGhpcy5oYW5kc2hha2VSZXNvbHZlcnM9bmV3IE1hcCx0aGlzLm1lc3NhZ2VDaGFubmVsPW5ldyBNZXNzYWdlQ2hhbm5lbCx0aGlzLndpbmRvd0xpc3RlbmVyPXRoaXMub25XaW5kb3dNZXNzYWdlLmJpbmQodGhpcyksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD1yLHRoaXMuaGFuZHNoYWtlRXZlbnQ9ci5zdGFydE1lYXN1cmVtZW50KE9yLk5hdGl2ZU1lc3NhZ2VIYW5kbGVySGFuZHNoYWtlKSx0aGlzLnBsYXRmb3JtQXV0aFR5cGU9Z3N9YXN5bmMgc2VuZE1lc3NhZ2UoZSl7dGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBzZW5kTWVzc2FnZSBjYWxsZWQuIik7Y29uc3QgdD17bWV0aG9kOmZzLHJlcXVlc3Q6ZX0scj17Y2hhbm5lbDpzcyxleHRlbnNpb25JZDp0aGlzLmV4dGVuc2lvbklkLHJlc3BvbnNlSWQ6b2EoKSxib2R5OnR9O3RoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gU2VuZGluZyByZXF1ZXN0IHRvIGJyb3dzZXIgZXh0ZW5zaW9uIiksdGhpcy5sb2dnZXIudHJhY2VQaWkodGhpcy5wbGF0Zm9ybUF1dGhUeXBlK2AgLSBTZW5kaW5nIHJlcXVlc3QgdG8gYnJvd3NlciBleHRlbnNpb246ICR7SlNPTi5zdHJpbmdpZnkocil9YCksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5wb3N0TWVzc2FnZShyKTtjb25zdCBuPWF3YWl0IG5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMucmVzb2x2ZXJzLnNldChyLnJlc3BvbnNlSWQse3Jlc29sdmU6ZSxyZWplY3Q6dH0pfSkpO3JldHVybiB0aGlzLnZhbGlkYXRlUGxhdGZvcm1Ccm9rZXJSZXNwb25zZShuKX1zdGF0aWMgYXN5bmMgY3JlYXRlUHJvdmlkZXIoZSx0LHIpe2UudHJhY2UoIlBsYXRmb3JtQXV0aEV4dGVuc2lvbkhhbmRsZXIgLSBjcmVhdGVQcm92aWRlciBjYWxsZWQuIik7dHJ5e2NvbnN0IG49bmV3IHBsKGUsdCxyLGFzKTtyZXR1cm4gYXdhaXQgbi5zZW5kSGFuZHNoYWtlUmVxdWVzdCgpLG59Y2F0Y2gobil7Y29uc3Qgbz1uZXcgcGwoZSx0LHIpO3JldHVybiBhd2FpdCBvLnNlbmRIYW5kc2hha2VSZXF1ZXN0KCksb319YXN5bmMgc2VuZEhhbmRzaGFrZVJlcXVlc3QoKXt0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrIiAtIHNlbmRIYW5kc2hha2VSZXF1ZXN0IGNhbGxlZC4iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy53aW5kb3dMaXN0ZW5lciwhMSk7Y29uc3QgZT17Y2hhbm5lbDpzcyxleHRlbnNpb25JZDp0aGlzLmV4dGVuc2lvbklkLHJlc3BvbnNlSWQ6b2EoKSxib2R5OnttZXRob2Q6cHN9fTtyZXR1cm4gdGhpcy5oYW5kc2hha2VFdmVudC5hZGQoe2V4dGVuc2lvbklkOnRoaXMuZXh0ZW5zaW9uSWQsZXh0ZW5zaW9uSGFuZHNoYWtlVGltZW91dE1zOnRoaXMuaGFuZHNoYWtlVGltZW91dE1zfSksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2U9ZT0+e3RoaXMub25DaGFubmVsTWVzc2FnZShlKX0sd2luZG93LnBvc3RNZXNzYWdlKGUsd2luZG93Lm9yaWdpbixbdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Ml0pLG5ldyBQcm9taXNlKCgodCxyKT0+e3RoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLnNldChlLnJlc3BvbnNlSWQse3Jlc29sdmU6dCxyZWplY3Q6cn0pLHRoaXMudGltZW91dElkPXdpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLndpbmRvd0xpc3RlbmVyLCExKSx0aGlzLm1lc3NhZ2VDaGFubmVsLnBvcnQxLmNsb3NlKCksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Mi5jbG9zZSgpLHRoaXMuaGFuZHNoYWtlRXZlbnQuZW5kKHtleHRlbnNpb25IYW5kc2hha2VUaW1lZE91dDohMCxzdWNjZXNzOiExfSkscihaaShEaSkpLHRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmRlbGV0ZShlLnJlc3BvbnNlSWQpfSksdGhpcy5oYW5kc2hha2VUaW1lb3V0TXMpfSkpfW9uV2luZG93TWVzc2FnZShlKXtpZih0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrIiAtIG9uV2luZG93TWVzc2FnZSBjYWxsZWQiKSxlLnNvdXJjZSE9PXdpbmRvdylyZXR1cm47Y29uc3QgdD1lLmRhdGE7aWYodC5jaGFubmVsJiZ0LmNoYW5uZWw9PT1zcyYmKCF0LmV4dGVuc2lvbklkfHx0LmV4dGVuc2lvbklkPT09dGhpcy5leHRlbnNpb25JZCkmJnQuYm9keS5tZXRob2Q9PT1wcyl7Y29uc3QgZT10aGlzLmhhbmRzaGFrZVJlc29sdmVycy5nZXQodC5yZXNwb25zZUlkKTtpZighZSlyZXR1cm4gdm9pZCB0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrYC5vbldpbmRvd01lc3NhZ2UgLSByZXNvbHZlciBjYW4ndCBiZSBmb3VuZCBmb3IgcmVxdWVzdCAke3QucmVzcG9uc2VJZH1gKTt0aGlzLmxvZ2dlci52ZXJib3NlKHQuZXh0ZW5zaW9uSWQ/YEV4dGVuc2lvbiB3aXRoIGlkOiAke3QuZXh0ZW5zaW9uSWR9IG5vdCBpbnN0YWxsZWRgOiJObyBleHRlbnNpb24gaW5zdGFsbGVkIiksY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKSx0aGlzLm1lc3NhZ2VDaGFubmVsLnBvcnQxLmNsb3NlKCksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Mi5jbG9zZSgpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLndpbmRvd0xpc3RlbmVyLCExKSx0aGlzLmhhbmRzaGFrZUV2ZW50LmVuZCh7c3VjY2VzczohMSxleHRlbnNpb25JbnN0YWxsZWQ6ITF9KSxlLnJlamVjdChaaShIaSkpfX1vbkNoYW5uZWxNZXNzYWdlKGUpe3RoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gb25DaGFubmVsTWVzc2FnZSBjYWxsZWQuIik7Y29uc3QgdD1lLmRhdGEscj10aGlzLnJlc29sdmVycy5nZXQodC5yZXNwb25zZUlkKSxuPXRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmdldCh0LnJlc3BvbnNlSWQpO3RyeXtjb25zdCBlPXQuYm9keS5tZXRob2Q7aWYoZT09PXlzKXtpZighcilyZXR1cm47Y29uc3QgZT10LmJvZHkucmVzcG9uc2U7aWYodGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBSZWNlaXZlZCByZXNwb25zZSBmcm9tIGJyb3dzZXIgZXh0ZW5zaW9uIiksdGhpcy5sb2dnZXIudHJhY2VQaWkodGhpcy5wbGF0Zm9ybUF1dGhUeXBlK2AgLSBSZWNlaXZlZCByZXNwb25zZSBmcm9tIGJyb3dzZXIgZXh0ZW5zaW9uOiAke0pTT04uc3RyaW5naWZ5KGUpfWApLCJTdWNjZXNzIiE9PWUuc3RhdHVzKXIucmVqZWN0KGVsKGUuY29kZSxlLmRlc2NyaXB0aW9uLGUuZXh0KSk7ZWxzZXtpZighZS5yZXN1bHQpdGhyb3cgd2UoZ2UsIkV2ZW50IGRvZXMgbm90IGNvbnRhaW4gcmVzdWx0LiIpO2UucmVzdWx0LmNvZGUmJmUucmVzdWx0LmRlc2NyaXB0aW9uP3IucmVqZWN0KGVsKGUucmVzdWx0LmNvZGUsZS5yZXN1bHQuZGVzY3JpcHRpb24sZS5yZXN1bHQuZXh0KSk6ci5yZXNvbHZlKGUucmVzdWx0KX10aGlzLnJlc29sdmVycy5kZWxldGUodC5yZXNwb25zZUlkKX1lbHNlIGlmKGU9PT1tcyl7aWYoIW4pcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlK2Aub25DaGFubmVsTWVzc2FnZSAtIHJlc29sdmVyIGNhbid0IGJlIGZvdW5kIGZvciByZXF1ZXN0ICR7dC5yZXNwb25zZUlkfWApO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud2luZG93TGlzdGVuZXIsITEpLHRoaXMuZXh0ZW5zaW9uSWQ9dC5leHRlbnNpb25JZCx0aGlzLmV4dGVuc2lvblZlcnNpb249dC5ib2R5LnZlcnNpb24sdGhpcy5sb2dnZXIudmVyYm9zZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrYCAtIFJlY2VpdmVkIEhhbmRzaGFrZVJlc3BvbnNlIGZyb20gZXh0ZW5zaW9uOiAke3RoaXMuZXh0ZW5zaW9uSWR9YCksdGhpcy5oYW5kc2hha2VFdmVudC5lbmQoe2V4dGVuc2lvbkluc3RhbGxlZDohMCxzdWNjZXNzOiEwfSksbi5yZXNvbHZlKCksdGhpcy5oYW5kc2hha2VSZXNvbHZlcnMuZGVsZXRlKHQucmVzcG9uc2VJZCl9fWNhdGNoKHQpe3RoaXMubG9nZ2VyLmVycm9yKCJFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGZyb20gV0FNIEV4dGVuc2lvbiIpLHRoaXMubG9nZ2VyLmVycm9yUGlpKGBFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGZyb20gV0FNIEV4dGVuc2lvbjogJHt0fWApLHRoaXMubG9nZ2VyLmVycm9yUGlpKGBVbmFibGUgdG8gcGFyc2UgJHtlfWApLHI/ci5yZWplY3QodCk6biYmbi5yZWplY3QodCl9fXZhbGlkYXRlUGxhdGZvcm1Ccm9rZXJSZXNwb25zZShlKXtpZihlLmhhc093blByb3BlcnR5KCJhY2Nlc3NfdG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiaWRfdG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiY2xpZW50X2luZm8iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWNjb3VudCIpJiZlLmhhc093blByb3BlcnR5KCJzY29wZSIpJiZlLmhhc093blByb3BlcnR5KCJleHBpcmVzX2luIikpcmV0dXJuIGU7dGhyb3cgd2UoZ2UsIlJlc3BvbnNlIG1pc3NpbmcgZXhwZWN0ZWQgcHJvcGVydGllcy4iKX1nZXRFeHRlbnNpb25JZCgpe3JldHVybiB0aGlzLmV4dGVuc2lvbklkfWdldEV4dGVuc2lvblZlcnNpb24oKXtyZXR1cm4gdGhpcy5leHRlbnNpb25WZXJzaW9ufWdldEV4dGVuc2lvbk5hbWUoKXtyZXR1cm4gdGhpcy5nZXRFeHRlbnNpb25JZCgpPT09YXM/ImNocm9tZSI6dGhpcy5nZXRFeHRlbnNpb25JZCgpPy5sZW5ndGg/InVua25vd24iOnZvaWQgMH19Y2xhc3MgbWx7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMubG9nZ2VyPWUsdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10LHRoaXMuY29ycmVsYXRpb25JZD1yLHRoaXMucGxhdGZvcm1BdXRoVHlwZT11c31zdGF0aWMgYXN5bmMgY3JlYXRlUHJvdmlkZXIoZSx0LHIpe2lmKGUudHJhY2UoIlBsYXRmb3JtQXV0aERPTUhhbmRsZXI6IGNyZWF0ZVByb3ZpZGVyIGNhbGxlZCIpLHdpbmRvdy5uYXZpZ2F0b3I/LnBsYXRmb3JtQXV0aGVudGljYXRpb24pe2NvbnN0IG49YXdhaXQgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybUF1dGhlbnRpY2F0aW9uLmdldFN1cHBvcnRlZENvbnRyYWN0cyhscyk7aWYobj8uaW5jbHVkZXMoZHMpKXJldHVybiBlLnRyYWNlKCJQbGF0Zm9ybSBhdXRoIGFwaSBhdmFpbGFibGUgaW4gRE9NIiksbmV3IG1sKGUsdCxyKX19Z2V0RXh0ZW5zaW9uSWQoKXtyZXR1cm4gbHN9Z2V0RXh0ZW5zaW9uVmVyc2lvbigpe3JldHVybiIifWdldEV4dGVuc2lvbk5hbWUoKXtyZXR1cm4gaHN9YXN5bmMgc2VuZE1lc3NhZ2UoZSl7dGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBTZW5kaW5nIHJlcXVlc3QgdG8gYnJvd3NlciBET00gQVBJIik7dHJ5e2NvbnN0IHQ9dGhpcy5pbml0aWFsaXplUGxhdGZvcm1ET01SZXF1ZXN0KGUpLHI9YXdhaXQgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybUF1dGhlbnRpY2F0aW9uLmV4ZWN1dGVHZXRUb2tlbih0KTtyZXR1cm4gdGhpcy52YWxpZGF0ZVBsYXRmb3JtQnJva2VyUmVzcG9uc2Uocil9Y2F0Y2goZSl7dGhyb3cgdGhpcy5sb2dnZXIuZXJyb3IodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBleGVjdXRlR2V0VG9rZW4gRE9NIEFQSSBlcnJvciIpLGV9fWluaXRpYWxpemVQbGF0Zm9ybURPTVJlcXVlc3QoZSl7dGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBpbml0aWFsaXplTmF0aXZlRE9NUmVxdWVzdCBjYWxsZWQiKTtjb25zdHthY2NvdW50SWQ6dCxjbGllbnRJZDpyLGF1dGhvcml0eTpuLHNjb3BlOm8scmVkaXJlY3RVcmk6aSxjb3JyZWxhdGlvbklkOnMsc3RhdGU6YSxzdG9yZUluQ2FjaGU6YyxlbWJlZGRlZENsaWVudElkOmwsZXh0cmFQYXJhbWV0ZXJzOmgsLi4uZH09ZSx1PXRoaXMuZ2V0RE9NRXh0cmFQYXJhbXMoZCk7cmV0dXJue2FjY291bnRJZDp0LGJyb2tlcklkOnRoaXMuZ2V0RXh0ZW5zaW9uSWQoKSxhdXRob3JpdHk6bixjbGllbnRJZDpyLGNvcnJlbGF0aW9uSWQ6c3x8dGhpcy5jb3JyZWxhdGlvbklkLGV4dHJhUGFyYW1ldGVyczp7Li4uaCwuLi51fSxpc1NlY3VyaXR5VG9rZW5TZXJ2aWNlOiExLHJlZGlyZWN0VXJpOmksc2NvcGU6byxzdGF0ZTphLHN0b3JlSW5DYWNoZTpjLGVtYmVkZGVkQ2xpZW50SWQ6bH19dmFsaWRhdGVQbGF0Zm9ybUJyb2tlclJlc3BvbnNlKGUpe2lmKGUuaGFzT3duUHJvcGVydHkoImlzU3VjY2VzcyIpKXtpZihlLmhhc093blByb3BlcnR5KCJhY2Nlc3NUb2tlbiIpJiZlLmhhc093blByb3BlcnR5KCJpZFRva2VuIikmJmUuaGFzT3duUHJvcGVydHkoImNsaWVudEluZm8iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWNjb3VudCIpJiZlLmhhc093blByb3BlcnR5KCJzY29wZXMiKSYmZS5oYXNPd25Qcm9wZXJ0eSgiZXhwaXJlc0luIikpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gcGxhdGZvcm0gYnJva2VyIHJldHVybmVkIHN1Y2Nlc3NmdWwgYW5kIHZhbGlkIHJlc3BvbnNlIiksdGhpcy5jb252ZXJ0VG9QbGF0Zm9ybUJyb2tlclJlc3BvbnNlKGUpO2lmKGUuaGFzT3duUHJvcGVydHkoImVycm9yIikpe2NvbnN0IHQ9ZTtpZighMT09PXQuaXNTdWNjZXNzJiZ0LmVycm9yJiZ0LmVycm9yLmNvZGUpdGhyb3cgdGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBwbGF0Zm9ybSBicm9rZXIgcmV0dXJuZWQgZXJyb3IgcmVzcG9uc2UiKSxlbCh0LmVycm9yLmNvZGUsdC5lcnJvci5kZXNjcmlwdGlvbix7ZXJyb3I6cGFyc2VJbnQodC5lcnJvci5lcnJvckNvZGUpLHByb3RvY29sX2Vycm9yOnQuZXJyb3IucHJvdG9jb2xFcnJvcixzdGF0dXM6dC5lcnJvci5zdGF0dXMscHJvcGVydGllczp0LmVycm9yLnByb3BlcnRpZXN9KX19dGhyb3cgd2UoZ2UsIlJlc3BvbnNlIG1pc3NpbmcgZXhwZWN0ZWQgcHJvcGVydGllcy4iKX1jb252ZXJ0VG9QbGF0Zm9ybUJyb2tlclJlc3BvbnNlKGUpe3RoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gY29udmVydFRvTmF0aXZlUmVzcG9uc2UgY2FsbGVkIik7cmV0dXJue2FjY2Vzc190b2tlbjplLmFjY2Vzc1Rva2VuLGlkX3Rva2VuOmUuaWRUb2tlbixjbGllbnRfaW5mbzplLmNsaWVudEluZm8sYWNjb3VudDplLmFjY291bnQsZXhwaXJlc19pbjplLmV4cGlyZXNJbixzY29wZTplLnNjb3BlcyxzdGF0ZTplLnN0YXRlfHwiIixwcm9wZXJ0aWVzOmUucHJvcGVydGllc3x8e30sZXh0ZW5kZWRMaWZldGltZVRva2VuOmUuZXh0ZW5kZWRMaWZldGltZVRva2VuPz8hMSxzaHI6ZS5wcm9vZk9mUG9zc2Vzc2lvblBheWxvYWR9fWdldERPTUV4dHJhUGFyYW1zKGUpe3JldHVybnsuLi5PYmplY3QuZW50cmllcyhlKS5yZWR1Y2UoKChlLFt0LHJdKT0+KGVbdF09U3RyaW5nKHIpLGUpKSx7fSl9fX1hc3luYyBmdW5jdGlvbiBmbChlLHQscixuLG8pe2xldCBpO2UudHJhY2UoImdldFBsYXRmb3JtQXV0aFByb3ZpZGVyIGNhbGxlZCIsciksZS50cmFjZSgiSGFzIGNsaWVudCBhbGxvd2VkIHBsYXRmb3JtIGF1dGggdmlhIERPTSBBUEk6ICIrbyk7dHJ5e28mJihpPWF3YWl0IG1sLmNyZWF0ZVByb3ZpZGVyKGUsdCxyKSksaXx8KGUudHJhY2UoIlBsYXRmb3JtIGF1dGggdmlhIERPTSBBUEkgbm90IGF2YWlsYWJsZSwgY2hlY2tpbmcgZm9yIGV4dGVuc2lvbiIpLGk9YXdhaXQgcGwuY3JlYXRlUHJvdmlkZXIoZSxufHwyZTMsdCkpfWNhdGNoKHQpe2UudHJhY2UoIlBsYXRmb3JtIGF1dGggbm90IGF2YWlsYWJsZSIsdCl9cmV0dXJuIGl9ZnVuY3Rpb24geWwoZSx0LHIsbil7aWYodC50cmFjZSgiaXNQbGF0Zm9ybUF1dGhBbGxvd2VkIGNhbGxlZCIpLCFlLnN5c3RlbS5hbGxvd1BsYXRmb3JtQnJva2VyJiZlLnN5c3RlbS5hbGxvd1BsYXRmb3JtQnJva2VyV2l0aERPTSl0aHJvdyBKdCgkdCk7aWYoIWUuc3lzdGVtLmFsbG93UGxhdGZvcm1Ccm9rZXIpcmV0dXJuIHQudHJhY2UoImlzUGxhdGZvcm1BdXRoQWxsb3dlZDogYWxsb3dQbGF0Zm9ybUJyb2tlciBpcyBub3QgZW5hYmxlZCwgcmV0dXJuaW5nIGZhbHNlIiksITE7aWYoIXIpcmV0dXJuIHQudHJhY2UoImlzUGxhdGZvcm1BdXRoQWxsb3dlZDogUGxhdGZvcm0gYXV0aCBwcm92aWRlciBpcyBub3QgaW5pdGlhbGl6ZWQsIHJldHVybmluZyBmYWxzZSIpLCExO2lmKG4pc3dpdGNoKG4pe2Nhc2UgVy5CRUFSRVI6Y2FzZSBXLlBPUDpyZXR1cm4gdC50cmFjZSgiaXNQbGF0Zm9ybUF1dGhBbGxvd2VkOiBhdXRoZW50aWNhdGlvblNjaGVtZSBpcyBzdXBwb3J0ZWQsIHJldHVybmluZyB0cnVlIiksITA7ZGVmYXVsdDpyZXR1cm4gdC50cmFjZSgiaXNQbGF0Zm9ybUF1dGhBbGxvd2VkOiBhdXRoZW50aWNhdGlvblNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm5pbmcgZmFsc2UiKSwhMX1yZXR1cm4hMH1jbGFzcyBDbCBleHRlbmRzIFFje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSxjLGwpe3N1cGVyKGUsdCxyLG4sbyxpLHMsYyxsKSx0aGlzLnVubG9hZFdpbmRvdz10aGlzLnVubG9hZFdpbmRvdy5iaW5kKHRoaXMpLHRoaXMubmF0aXZlU3RvcmFnZT1hLHRoaXMuZXZlbnRIYW5kbGVyPW99YWNxdWlyZVRva2VuKGUsdCl7bGV0IHI7dHJ5e2lmKHI9e3BvcHVwTmFtZTp0aGlzLmdlbmVyYXRlUG9wdXBOYW1lKGUuc2NvcGVzfHxoLGUuYXV0aG9yaXR5fHx0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eSkscG9wdXBXaW5kb3dBdHRyaWJ1dGVzOmUucG9wdXBXaW5kb3dBdHRyaWJ1dGVzfHx7fSxwb3B1cFdpbmRvd1BhcmVudDplLnBvcHVwV2luZG93UGFyZW50Pz93aW5kb3d9LHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtpc0FzeW5jUG9wdXA6dGhpcy5jb25maWcuc3lzdGVtLmFzeW5jUG9wdXBzfSx0aGlzLmNvcnJlbGF0aW9uSWQpLHRoaXMuY29uZmlnLnN5c3RlbS5hc3luY1BvcHVwcylyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiYXN5bmNQb3B1cHMgc2V0IHRvIHRydWUsIGFjcXVpcmluZyB0b2tlbiIpLHRoaXMuYWNxdWlyZVRva2VuUG9wdXBBc3luYyhlLHIsdCk7e2NvbnN0IG49ey4uLmUsaHR0cE1ldGhvZDokYyhlLHRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlKX07cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImFzeW5jUG9wdXAgc2V0IHRvIGZhbHNlLCBvcGVuaW5nIHBvcHVwIGJlZm9yZSBhY3F1aXJpbmcgdG9rZW4iKSxyLnBvcHVwPXRoaXMub3BlblNpemVkUG9wdXAoImFib3V0OmJsYW5rIixyKSx0aGlzLmFjcXVpcmVUb2tlblBvcHVwQXN5bmMobixyLHQpfX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fWxvZ291dChlKXt0cnl7dGhpcy5sb2dnZXIudmVyYm9zZSgibG9nb3V0UG9wdXAgY2FsbGVkIik7Y29uc3QgdD10aGlzLmluaXRpYWxpemVMb2dvdXRSZXF1ZXN0KGUpLHI9e3BvcHVwTmFtZTp0aGlzLmdlbmVyYXRlTG9nb3V0UG9wdXBOYW1lKHQpLHBvcHVwV2luZG93QXR0cmlidXRlczplPy5wb3B1cFdpbmRvd0F0dHJpYnV0ZXN8fHt9LHBvcHVwV2luZG93UGFyZW50OmU/LnBvcHVwV2luZG93UGFyZW50Pz93aW5kb3d9LG49ZSYmZS5hdXRob3JpdHksbz1lJiZlLm1haW5XaW5kb3dSZWRpcmVjdFVyaTtyZXR1cm4gdGhpcy5jb25maWcuc3lzdGVtLmFzeW5jUG9wdXBzPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJhc3luY1BvcHVwcyBzZXQgdG8gdHJ1ZSIpLHRoaXMubG9nb3V0UG9wdXBBc3luYyh0LHIsbixvKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoImFzeW5jUG9wdXAgc2V0IHRvIGZhbHNlLCBvcGVuaW5nIHBvcHVwIiksci5wb3B1cD10aGlzLm9wZW5TaXplZFBvcHVwKCJhYm91dDpibGFuayIsciksdGhpcy5sb2dvdXRQb3B1cEFzeW5jKHQscixuLG8pKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fWFzeW5jIGFjcXVpcmVUb2tlblBvcHVwQXN5bmModCxyLG4pe3RoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblBvcHVwQXN5bmMgY2FsbGVkIik7Y29uc3Qgbz1hd2FpdCBVbih0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXApO3IucG9wdXAmJlVhKG8uYXV0aG9yaXR5KTtjb25zdCBpPXlsKHRoaXMuY29uZmlnLHRoaXMubG9nZ2VyLHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsdC5hdXRoZW50aWNhdGlvblNjaGVtZSk7cmV0dXJuIG8ucGxhdGZvcm1Ccm9rZXI9aSx0aGlzLmNvbmZpZy5hdXRoLnByb3RvY29sTW9kZT09PWxyLkVBUj90aGlzLmV4ZWN1dGVFYXJGbG93KG8scixuKTp0aGlzLmV4ZWN1dGVDb2RlRmxvdyhvLHIsbil9YXN5bmMgZXhlY3V0ZUNvZGVGbG93KHQscixuKXtjb25zdCBvPXQuY29ycmVsYXRpb25JZCxpPXRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIoTXMuYWNxdWlyZVRva2VuUG9wdXApLHM9bnx8YXdhaXQgVW4oZGwsT3IuR2VuZXJhdGVQa2NlQ29kZXMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxvKSh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyLG8pLGE9ey4uLnQsY29kZUNoYWxsZW5nZTpzLmNoYWxsZW5nZX07dHJ5e2NvbnN0IG49YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LG8pKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOmkscmVxdWVzdEF1dGhvcml0eTphLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6YS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6YS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmEuYWNjb3VudH0pO2lmKGEuaHR0cE1ldGhvZD09PWwpcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUNvZGVGbG93V2l0aFBvc3QoYSxyLG4scy52ZXJpZmllcik7e2NvbnN0IGk9YXdhaXQgVW4ob2wsT3IuR2V0QXV0aENvZGVVcmwsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxvKSh0aGlzLmNvbmZpZyxuLmF1dGhvcml0eSxhLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpLGM9dGhpcy5pbml0aWF0ZUF1dGhSZXF1ZXN0KGkscik7dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLlBPUFVQX09QRU5FRCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx7cG9wdXBXaW5kb3c6Y30sbnVsbCk7Y29uc3QgbD1hd2FpdCB0aGlzLm1vbml0b3JQb3B1cEZvckhhc2goYyxyLnBvcHVwV2luZG93UGFyZW50KSxoPU5uKGpjLE9yLkRlc2VyaWFsaXplUmVzcG9uc2UsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKGwsdGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGUsdGhpcy5sb2dnZXIpO3JldHVybiBhd2FpdCBVbihsbCxPci5IYW5kbGVSZXNwb25zZUNvZGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxvKSh0LGgscy52ZXJpZmllcixNcy5hY3F1aXJlVG9rZW5Qb3B1cCx0aGlzLmNvbmZpZyxuLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9fWNhdGNoKGUpe3Rocm93IHIucG9wdXA/LmNsb3NlKCksZSBpbnN0YW5jZW9mIENlJiYoZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCksaS5jYWNoZUZhaWxlZFJlcXVlc3QoZSkpLGV9fWFzeW5jIGV4ZWN1dGVFYXJGbG93KGUsdCxyKXtjb25zdCBuPWUuY29ycmVsYXRpb25JZCxvPWF3YWl0IFVuKHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eS5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoe3JlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxpPWF3YWl0IFVuKHNhLE9yLkdlbmVyYXRlRWFyS2V5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoKSxzPXJ8fGF3YWl0IFVuKGRsLE9yLkdlbmVyYXRlUGtjZUNvZGVzLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikodGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixuKSxhPXsuLi5lLGVhckp3azppLGNvZGVDaGFsbGVuZ2U6cy5jaGFsbGVuZ2V9LGM9dC5wb3B1cHx8dGhpcy5vcGVuUG9wdXAoImFib3V0OmJsYW5rIix0KTsoYXdhaXQgaWwoYy5kb2N1bWVudCx0aGlzLmNvbmZpZyxvLGEsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkpLnN1Ym1pdCgpO2NvbnN0IGw9YXdhaXQgVW4odGhpcy5tb25pdG9yUG9wdXBGb3JIYXNoLmJpbmQodGhpcyksT3IuU2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoYyx0LnBvcHVwV2luZG93UGFyZW50KSxoPU5uKGpjLE9yLkRlc2VyaWFsaXplUmVzcG9uc2UsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKGwsdGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGUsdGhpcy5sb2dnZXIpO2lmKCFoLmVhcl9qd2UmJmguY29kZSl7Y29uc3QgdD1hd2FpdCBVbih0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5hY3F1aXJlVG9rZW5Qb3B1cCkscmVxdWVzdEF1dGhvcml0eTplLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6ZS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6ZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmUuYWNjb3VudCxhdXRob3JpdHk6b30pO3JldHVybiBVbihsbCxPci5IYW5kbGVSZXNwb25zZUNvZGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxuKShhLGgscy52ZXJpZmllcixNcy5hY3F1aXJlVG9rZW5Qb3B1cCx0aGlzLmNvbmZpZyx0LHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9cmV0dXJuIFVuKGhsLE9yLkhhbmRsZVJlc3BvbnNlRWFyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoYSxoLE1zLmFjcXVpcmVUb2tlblBvcHVwLHRoaXMuY29uZmlnLG8sdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLm5hdGl2ZVN0b3JhZ2UsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyKX1hc3luYyBleGVjdXRlQ29kZUZsb3dXaXRoUG9zdChlLHQscixuKXtjb25zdCBvPWUuY29ycmVsYXRpb25JZCxpPWF3YWl0IFVuKHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eS5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbykoe3JlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxzPXQucG9wdXB8fHRoaXMub3BlblBvcHVwKCJhYm91dDpibGFuayIsdCk7KGF3YWl0IHNsKHMuZG9jdW1lbnQsdGhpcy5jb25maWcsaSxlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpKS5zdWJtaXQoKTtjb25zdCBhPWF3YWl0IFVuKHRoaXMubW9uaXRvclBvcHVwRm9ySGFzaC5iaW5kKHRoaXMpLE9yLlNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LG8pKHMsdC5wb3B1cFdpbmRvd1BhcmVudCksYz1ObihqYyxPci5EZXNlcmlhbGl6ZVJlc3BvbnNlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShhLHRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlLHRoaXMubG9nZ2VyKTtyZXR1cm4gVW4obGwsT3IuSGFuZGxlUmVzcG9uc2VDb2RlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbykoZSxjLG4sTXMuYWNxdWlyZVRva2VuUG9wdXAsdGhpcy5jb25maWcscix0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMubmF0aXZlU3RvcmFnZSx0aGlzLmV2ZW50SGFuZGxlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpfWFzeW5jIGxvZ291dFBvcHVwQXN5bmModCxyLG4sbyl7dGhpcy5sb2dnZXIudmVyYm9zZSgibG9nb3V0UG9wdXBBc3luYyBjYWxsZWQiKSx0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuTE9HT1VUX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLHQpO2NvbnN0IGk9dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5sb2dvdXRQb3B1cCk7dHJ5e2F3YWl0IHRoaXMuY2xlYXJDYWNoZU9uTG9nb3V0KHRoaXMuY29ycmVsYXRpb25JZCx0LmFjY291bnQpO2NvbnN0IHM9YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6aSxyZXF1ZXN0QXV0aG9yaXR5Om4sYWNjb3VudDp0LmFjY291bnR8fHZvaWQgMH0pO3RyeXtzLmF1dGhvcml0eS5lbmRTZXNzaW9uRW5kcG9pbnR9Y2F0Y2h7aWYodC5hY2NvdW50Py5ob21lQWNjb3VudElkJiZ0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaSYmcy5hdXRob3JpdHkucHJvdG9jb2xNb2RlPT09bHIuT0lEQyl7aWYodGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLHQpLG8pe2NvbnN0IGU9e2FwaUlkOk1zLmxvZ291dFBvcHVwLHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSx0PXdyLmdldEFic29sdXRlVXJsKG8sYmEoKSk7YXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlSW50ZXJuYWwodCxlKX1yZXR1cm4gdm9pZCByLnBvcHVwPy5jbG9zZSgpfX1jb25zdCBhPXMuZ2V0TG9nb3V0VXJpKHQpO3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dPVVRfU1VDQ0VTUyxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx0KTtjb25zdCBjPXRoaXMub3BlblBvcHVwKGEscik7aWYodGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLlBPUFVQX09QRU5FRCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx7cG9wdXBXaW5kb3c6Y30sbnVsbCksYXdhaXQgdGhpcy5tb25pdG9yUG9wdXBGb3JIYXNoKGMsci5wb3B1cFdpbmRvd1BhcmVudCkuY2F0Y2goKCgpPT57fSkpLG8pe2NvbnN0IGU9e2FwaUlkOk1zLmxvZ291dFBvcHVwLHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSx0PXdyLmdldEFic29sdXRlVXJsKG8sYmEoKSk7dGhpcy5sb2dnZXIudmVyYm9zZSgiUmVkaXJlY3RpbmcgbWFpbiB3aW5kb3cgdG8gdXJsIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCIpLHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYFJlZGlyZWN0aW5nIG1haW4gd2luZG93IHRvOiAke3R9YCksYXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlSW50ZXJuYWwodCxlKX1lbHNlIHRoaXMubG9nZ2VyLnZlcmJvc2UoIk5vIG1haW4gd2luZG93IG5hdmlnYXRpb24gcmVxdWVzdGVkIil9Y2F0Y2godCl7dGhyb3cgci5wb3B1cD8uY2xvc2UoKSx0IGluc3RhbmNlb2YgQ2UmJih0LnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKSxpLmNhY2hlRmFpbGVkUmVxdWVzdCh0KSksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLG51bGwsdCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXApLHR9dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXApfWluaXRpYXRlQXV0aFJlcXVlc3QoZSx0KXtpZihlKXJldHVybiB0aGlzLmxvZ2dlci5pbmZvUGlpKGBOYXZpZ2F0ZSB0bzogJHtlfWApLHRoaXMub3BlblBvcHVwKGUsdCk7dGhyb3cgdGhpcy5sb2dnZXIuZXJyb3IoIk5hdmlnYXRlIHVybCBpcyBlbXB0eSIpLFppKHRpKX1tb25pdG9yUG9wdXBGb3JIYXNoKGUsdCl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e3RoaXMubG9nZ2VyLnZlcmJvc2UoIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gcG9sbGluZyBzdGFydGVkIik7Y29uc3Qgbj1zZXRJbnRlcnZhbCgoKCk9PntpZihlLmNsb3NlZClyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gd2luZG93IGNsb3NlZCIpLGNsZWFySW50ZXJ2YWwobiksdm9pZCByKFppKGhpKSk7bGV0IG89IiI7dHJ5e289ZS5sb2NhdGlvbi5ocmVmfWNhdGNoKGUpe31pZighb3x8ImFib3V0OmJsYW5rIj09PW8pcmV0dXJuO2NsZWFySW50ZXJ2YWwobik7bGV0IGk9IiI7Y29uc3Qgcz10aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLnNlcnZlclJlc3BvbnNlVHlwZTtlJiYoaT1zPT09Xy5RVUVSWT9lLmxvY2F0aW9uLnNlYXJjaDplLmxvY2F0aW9uLmhhc2gpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gcG9wdXAgd2luZG93IGlzIG9uIHNhbWUgb3JpZ2luIGFzIGNhbGxlciIpLHQoaSl9KSx0aGlzLmNvbmZpZy5zeXN0ZW0ucG9sbEludGVydmFsTWlsbGlzZWNvbmRzKX0pKS5maW5hbGx5KCgoKT0+e3RoaXMuY2xlYW5Qb3B1cChlLHQpfSkpfW9wZW5Qb3B1cChlLHQpe3RyeXtsZXQgcjtpZih0LnBvcHVwPyhyPXQucG9wdXAsdGhpcy5sb2dnZXIudmVyYm9zZVBpaShgTmF2aWdhdGluZyBwb3B1cCB3aW5kb3cgdG86ICR7ZX1gKSxyLmxvY2F0aW9uLmFzc2lnbihlKSk6dm9pZCAwPT09dC5wb3B1cCYmKHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYE9wZW5pbmcgcG9wdXAgd2luZG93IHRvOiAke2V9YCkscj10aGlzLm9wZW5TaXplZFBvcHVwKGUsdCkpLCFyKXRocm93IFppKGxpKTtyZXR1cm4gci5mb2N1cyYmci5mb2N1cygpLHRoaXMuY3VycmVudFdpbmRvdz1yLHQucG9wdXBXaW5kb3dQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIix0aGlzLnVubG9hZFdpbmRvdykscn1jYXRjaChlKXt0aHJvdyB0aGlzLmxvZ2dlci5lcnJvcigiZXJyb3Igb3BlbmluZyBwb3B1cCAiK2UubWVzc2FnZSksWmkoY2kpfX1vcGVuU2l6ZWRQb3B1cChlLHtwb3B1cE5hbWU6dCxwb3B1cFdpbmRvd0F0dHJpYnV0ZXM6cixwb3B1cFdpbmRvd1BhcmVudDpufSl7Y29uc3Qgbz1uLnNjcmVlbkxlZnQ/bi5zY3JlZW5MZWZ0Om4uc2NyZWVuWCxpPW4uc2NyZWVuVG9wP24uc2NyZWVuVG9wOm4uc2NyZWVuWSxzPW4uaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofHxkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGE9bi5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7bGV0IGM9ci5wb3B1cFNpemU/LndpZHRoLGw9ci5wb3B1cFNpemU/LmhlaWdodCxoPXIucG9wdXBQb3NpdGlvbj8udG9wLGQ9ci5wb3B1cFBvc2l0aW9uPy5sZWZ0O3JldHVybighY3x8YzwwfHxjPnMpJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiRGVmYXVsdCBwb3B1cCB3aW5kb3cgd2lkdGggdXNlZC4gV2luZG93IHdpZHRoIG5vdCBjb25maWd1cmVkIG9yIGludmFsaWQuIiksYz10cyksKCFsfHxsPDB8fGw+YSkmJih0aGlzLmxvZ2dlci52ZXJib3NlKCJEZWZhdWx0IHBvcHVwIHdpbmRvdyBoZWlnaHQgdXNlZC4gV2luZG93IGhlaWdodCBub3QgY29uZmlndXJlZCBvciBpbnZhbGlkLiIpLGw9cnMpLCghaHx8aDwwfHxoPmEpJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiRGVmYXVsdCBwb3B1cCB3aW5kb3cgdG9wIHBvc2l0aW9uIHVzZWQuIFdpbmRvdyB0b3Agbm90IGNvbmZpZ3VyZWQgb3IgaW52YWxpZC4iKSxoPU1hdGgubWF4KDAsYS8yLXJzLzIraSkpLCghZHx8ZDwwfHxkPnMpJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiRGVmYXVsdCBwb3B1cCB3aW5kb3cgbGVmdCBwb3NpdGlvbiB1c2VkLiBXaW5kb3cgbGVmdCBub3QgY29uZmlndXJlZCBvciBpbnZhbGlkLiIpLGQ9TWF0aC5tYXgoMCxzLzItdHMvMitvKSksbi5vcGVuKGUsdCxgd2lkdGg9JHtjfSwgaGVpZ2h0PSR7bH0sIHRvcD0ke2h9LCBsZWZ0PSR7ZH0sIHNjcm9sbGJhcnM9eWVzYCl9dW5sb2FkV2luZG93KGUpe3RoaXMuY3VycmVudFdpbmRvdyYmdGhpcy5jdXJyZW50V2luZG93LmNsb3NlKCksZS5wcmV2ZW50RGVmYXVsdCgpfWNsZWFuUG9wdXAoZSx0KXtlLmNsb3NlKCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLHRoaXMudW5sb2FkV2luZG93KX1nZW5lcmF0ZVBvcHVwTmFtZShlLHQpe3JldHVybmAke25zfS4ke3RoaXMuY29uZmlnLmF1dGguY2xpZW50SWR9LiR7ZS5qb2luKCItIil9LiR7dH0uJHt0aGlzLmNvcnJlbGF0aW9uSWR9YH1nZW5lcmF0ZUxvZ291dFBvcHVwTmFtZShlKXtjb25zdCB0PWUuYWNjb3VudCYmZS5hY2NvdW50LmhvbWVBY2NvdW50SWQ7cmV0dXJuYCR7bnN9LiR7dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZH0uJHt0fS4ke3RoaXMuY29ycmVsYXRpb25JZH1gfX1jbGFzcyB3bCBleHRlbmRzIFFje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSxjLGwpe3N1cGVyKGUsdCxyLG4sbyxpLHMsYyxsKSx0aGlzLm5hdGl2ZVN0b3JhZ2U9YX1hc3luYyBhY3F1aXJlVG9rZW4odCl7Y29uc3Qgcj1hd2FpdCBVbih0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpO3IucGxhdGZvcm1Ccm9rZXI9eWwodGhpcy5jb25maWcsdGhpcy5sb2dnZXIsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcix0LmF1dGhlbnRpY2F0aW9uU2NoZW1lKTtjb25zdCBuPXQ9Pnt0LnBlcnNpc3RlZCYmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlBhZ2Ugd2FzIHJlc3RvcmVkIGZyb20gYmFjay9mb3J3YXJkIGNhY2hlLiBDbGVhcmluZyB0ZW1wb3JhcnkgY2FjaGUuIiksdGhpcy5icm93c2VyU3RvcmFnZS5yZXNldFJlcXVlc3RDYWNoZSgpLHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5SRVNUT1JFX0ZST01fQkZDQUNIRSxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCkpfSxvPXRoaXMuZ2V0UmVkaXJlY3RTdGFydFBhZ2UodC5yZWRpcmVjdFN0YXJ0UGFnZSk7dGhpcy5sb2dnZXIudmVyYm9zZVBpaShgUmVkaXJlY3Qgc3RhcnQgcGFnZTogJHtvfWApLHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0VGVtcG9yYXJ5Q2FjaGUoQXMsbywhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VzaG93IixuKTt0cnl7dGhpcy5jb25maWcuYXV0aC5wcm90b2NvbE1vZGU9PT1sci5FQVI/YXdhaXQgdGhpcy5leGVjdXRlRWFyRmxvdyhyKTphd2FpdCB0aGlzLmV4ZWN1dGVDb2RlRmxvdyhyLHQub25SZWRpcmVjdE5hdmlnYXRlKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgQ2UmJmUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwYWdlc2hvdyIsbiksZX19YXN5bmMgZXhlY3V0ZUNvZGVGbG93KGUsdCl7Y29uc3Qgcj1lLmNvcnJlbGF0aW9uSWQsbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKE1zLmFjcXVpcmVUb2tlblJlZGlyZWN0KSxvPWF3YWl0IFVuKGRsLE9yLkdlbmVyYXRlUGtjZUNvZGVzLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQscikodGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixyKSxpPXsuLi5lLGNvZGVDaGFsbGVuZ2U6by5jaGFsbGVuZ2V9O3RoaXMuYnJvd3NlclN0b3JhZ2UuY2FjaGVBdXRob3JpemVSZXF1ZXN0KGksby52ZXJpZmllcik7dHJ5e2lmKGkuaHR0cE1ldGhvZD09PWwpcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUNvZGVGbG93V2l0aFBvc3QoaSk7e2NvbnN0IHI9YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6bixyZXF1ZXN0QXV0aG9yaXR5OmkuYXV0aG9yaXR5LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczppLmF6dXJlQ2xvdWRPcHRpb25zLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczppLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLGFjY291bnQ6aS5hY2NvdW50fSksbz1hd2FpdCBVbihvbCxPci5HZXRBdXRoQ29kZVVybCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkodGhpcy5jb25maWcsci5hdXRob3JpdHksaSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtyZXR1cm4gYXdhaXQgdGhpcy5pbml0aWF0ZUF1dGhSZXF1ZXN0KG8sdCl9fWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBDZSYmKGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLG4uY2FjaGVGYWlsZWRSZXF1ZXN0KGUpKSxlfX1hc3luYyBleGVjdXRlRWFyRmxvdyhlKXtjb25zdCB0PWUuY29ycmVsYXRpb25JZCxyPWF3YWl0IFVuKHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eS5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkoe3JlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxuPWF3YWl0IFVuKHNhLE9yLkdlbmVyYXRlRWFyS2V5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkoKSxvPWF3YWl0IFVuKGRsLE9yLkdlbmVyYXRlUGtjZUNvZGVzLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkodGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcix0KSxpPXsuLi5lLGVhckp3azpuLGNvZGVDaGFsbGVuZ2U6by5jaGFsbGVuZ2V9O3RoaXMuYnJvd3NlclN0b3JhZ2UuY2FjaGVBdXRob3JpemVSZXF1ZXN0KGksby52ZXJpZmllcik7cmV0dXJuKGF3YWl0IGlsKGRvY3VtZW50LHRoaXMuY29uZmlnLHIsaSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSkuc3VibWl0KCksbmV3IFByb21pc2UoKChlLHQpPT57c2V0VGltZW91dCgoKCk9Pnt0KFppKGppLCJmYWlsZWRfdG9fcmVkaXJlY3QiKSl9KSx0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCl9KSl9YXN5bmMgZXhlY3V0ZUNvZGVGbG93V2l0aFBvc3QoZSl7Y29uc3QgdD1lLmNvcnJlbGF0aW9uSWQscj1hd2FpdCBVbih0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHtyZXF1ZXN0QXV0aG9yaXR5OmUuYXV0aG9yaXR5LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczplLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLGFjY291bnQ6ZS5hY2NvdW50fSk7dGhpcy5icm93c2VyU3RvcmFnZS5jYWNoZUF1dGhvcml6ZVJlcXVlc3QoZSk7cmV0dXJuKGF3YWl0IHNsKGRvY3VtZW50LHRoaXMuY29uZmlnLHIsZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSkuc3VibWl0KCksbmV3IFByb21pc2UoKChlLHQpPT57c2V0VGltZW91dCgoKCk9Pnt0KFppKGppLCJmYWlsZWRfdG9fcmVkaXJlY3QiKSl9KSx0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCl9KSl9YXN5bmMgaGFuZGxlUmVkaXJlY3RQcm9taXNlKGU9IiIscixuLG8pe2NvbnN0IGk9dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5oYW5kbGVSZWRpcmVjdFByb21pc2UpO3RyeXtjb25zdFtzLGFdPXRoaXMuZ2V0UmVkaXJlY3RSZXNwb25zZShlfHwiIik7aWYoIXMpcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBkaWQgbm90IGRldGVjdCBhIHJlc3BvbnNlIGFzIGEgcmVzdWx0IG9mIGEgcmVkaXJlY3QuIENsZWFuaW5nIHRlbXBvcmFyeSBjYWNoZS4iKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCksImJhY2tfZm9yd2FyZCIhPT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93fHx2b2lkIDA9PT13aW5kb3cucGVyZm9ybWFuY2V8fCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSlyZXR1cm47Y29uc3QgZT13aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgibmF2aWdhdGlvbiIpLHQ9ZS5sZW5ndGg/ZVswXTp2b2lkIDA7cmV0dXJuIHQ/LnR5cGV9KCk/by5ldmVudC5lcnJvckNvZGU9Im5vX3NlcnZlcl9yZXNwb25zZSI6dGhpcy5sb2dnZXIudmVyYm9zZSgiQmFjayBuYXZpZ2F0aW9uIGV2ZW50IGRldGVjdGVkLiBNdXRpbmcgbm9fc2VydmVyX3Jlc3BvbnNlIGVycm9yIiksbnVsbDtjb25zdCBjPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0VGVtcG9yYXJ5Q2FjaGUoQXMsITApfHx0LkVNUFRZX1NUUklORyxsPUNyKGMpO2lmKGw9PT1Dcih3aW5kb3cubG9jYXRpb24uaHJlZikmJnRoaXMuY29uZmlnLmF1dGgubmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiQ3VycmVudCBwYWdlIGlzIGxvZ2luUmVxdWVzdFVybCwgaGFuZGxpbmcgcmVzcG9uc2UiKSxjLmluZGV4T2YoIiMiKT4tMSYmQWEoYyk7cmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUmVzcG9uc2UocyxyLG4saSl9aWYoIXRoaXMuY29uZmlnLmF1dGgubmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybClyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiTmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybCBzZXQgdG8gZmFsc2UsIGhhbmRsaW5nIHJlc3BvbnNlIiksYXdhaXQgdGhpcy5oYW5kbGVSZXNwb25zZShzLHIsbixpKTtpZigha2EoKXx8dGhpcy5jb25maWcuc3lzdGVtLmFsbG93UmVkaXJlY3RJbklmcmFtZSl7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShrcyxhLCEwKTtjb25zdCBlPXthcGlJZDpNcy5oYW5kbGVSZWRpcmVjdFByb21pc2UsdGltZW91dDp0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCxub0hpc3Rvcnk6ITB9O2xldCB0PSEwO2lmKGMmJiJudWxsIiE9PWMpdGhpcy5sb2dnZXIudmVyYm9zZShgTmF2aWdhdGluZyB0byBsb2dpblJlcXVlc3RVcmw6ICR7Y31gKSx0PWF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUludGVybmFsKGMsZSk7ZWxzZXtjb25zdCByPUVhKCk7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShBcyxyLCEwKSx0aGlzLmxvZ2dlci53YXJuaW5nKCJVbmFibGUgdG8gZ2V0IHZhbGlkIGxvZ2luIHJlcXVlc3QgdXJsIGZyb20gY2FjaGUsIHJlZGlyZWN0aW5nIHRvIGhvbWUgcGFnZSIpLHQ9YXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlSW50ZXJuYWwocixlKX1pZighdClyZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVSZXNwb25zZShzLHIsbixpKX1yZXR1cm4gbnVsbH1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgQ2UmJihlLnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKSxpLmNhY2hlRmFpbGVkUmVxdWVzdChlKSksZX19Z2V0UmVkaXJlY3RSZXNwb25zZSh0KXt0aGlzLmxvZ2dlci52ZXJib3NlKCJnZXRSZWRpcmVjdFJlc3BvbnNlSGFzaCBjYWxsZWQiKTtsZXQgcj10O3J8fChyPXRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlPT09Xy5RVUVSWT93aW5kb3cubG9jYXRpb24uc2VhcmNoOndpbmRvdy5sb2NhdGlvbi5oYXNoKTtsZXQgbj1mcihyKTtpZihuKXt0cnl7V2Mobix0aGlzLmJyb3dzZXJDcnlwdG8sZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQ2UmJnRoaXMubG9nZ2VyLmVycm9yKGBJbnRlcmFjdGlvbiB0eXBlIHZhbGlkYXRpb24gZmFpbGVkIGR1ZSB0byAke2UuZXJyb3JDb2RlfTogJHtlLmVycm9yTWVzc2FnZX1gKSxbbnVsbCwiIl19cmV0dXJuIFRhKHdpbmRvdyksdGhpcy5sb2dnZXIudmVyYm9zZSgiSGFzaCBjb250YWlucyBrbm93biBwcm9wZXJ0aWVzLCByZXR1cm5pbmcgcmVzcG9uc2UgaGFzaCIpLFtuLHJdfWNvbnN0IG89dGhpcy5icm93c2VyU3RvcmFnZS5nZXRUZW1wb3JhcnlDYWNoZShrcywhMCk7cmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmJyb3dzZXJTdG9yYWdlLmdlbmVyYXRlQ2FjaGVLZXkoa3MpKSxvJiYobj1mcihvKSxuKT8odGhpcy5sb2dnZXIudmVyYm9zZSgiSGFzaCBkb2VzIG5vdCBjb250YWluIGtub3duIHByb3BlcnRpZXMsIHJldHVybmluZyBjYWNoZWQgaGFzaCIpLFtuLG9dKTpbbnVsbCwiIl19YXN5bmMgaGFuZGxlUmVzcG9uc2UoZSx0LHIsbil7aWYoIWUuc3RhdGUpdGhyb3cgWmkobmkpO2lmKGUuZWFyX2p3ZSl7Y29uc3Qgcj1hd2FpdCBVbih0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkoe3JlcXVlc3RBdXRob3JpdHk6dC5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOnQuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOnQuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDp0LmFjY291bnR9KTtyZXR1cm4gVW4oaGwsT3IuSGFuZGxlUmVzcG9uc2VFYXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0LmNvcnJlbGF0aW9uSWQpKHQsZSxNcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCx0aGlzLmNvbmZpZyxyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9Y29uc3Qgbz1hd2FpdCBVbih0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKSh7c2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpuLHJlcXVlc3RBdXRob3JpdHk6dC5hdXRob3JpdHl9KTtyZXR1cm4gVW4obGwsT3IuSGFuZGxlUmVzcG9uc2VDb2RlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKSh0LGUscixNcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCx0aGlzLmNvbmZpZyxvLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9YXN5bmMgaW5pdGlhdGVBdXRoUmVxdWVzdChlLHQpe2lmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0IGNhbGxlZCIpLGUpe3RoaXMubG9nZ2VyLmluZm9QaWkoYFJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBOYXZpZ2F0ZSB0bzogJHtlfWApO2NvbnN0IHI9e2FwaUlkOk1zLmFjcXVpcmVUb2tlblJlZGlyZWN0LHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSxuPXR8fHRoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogSW52b2tpbmcgb25SZWRpcmVjdE5hdmlnYXRlIGNhbGxiYWNrIik7cmV0dXJuITEhPT1uKGUpPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogb25SZWRpcmVjdE5hdmlnYXRlIGRpZCBub3QgcmV0dXJuIGZhbHNlLCBuYXZpZ2F0aW5nIiksdm9pZCBhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVFeHRlcm5hbChlLHIpKTp2b2lkIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBvblJlZGlyZWN0TmF2aWdhdGUgcmV0dXJuZWQgZmFsc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24iKX1yZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiUmVkaXJlY3RIYW5kbGVyLmluaXRpYXRlQXV0aFJlcXVlc3Q6IE5hdmlnYXRpbmcgd2luZG93IHRvIG5hdmlnYXRlIHVybCIpLHZvaWQgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlRXh0ZXJuYWwoZSxyKX10aHJvdyB0aGlzLmxvZ2dlci5pbmZvKCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogTmF2aWdhdGUgdXJsIGlzIGVtcHR5IiksWmkodGkpfWFzeW5jIGxvZ291dCh0KXt0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRSZWRpcmVjdCBjYWxsZWQiKTtjb25zdCByPXRoaXMuaW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QodCksbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKE1zLmxvZ291dCk7dHJ5e3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dPVVRfU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCksYXdhaXQgdGhpcy5jbGVhckNhY2hlT25Mb2dvdXQodGhpcy5jb3JyZWxhdGlvbklkLHIuYWNjb3VudCk7Y29uc3Qgbz17YXBpSWQ6TXMubG9nb3V0LHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSxpPWF3YWl0IFVuKHRoaXMuY3JlYXRlQXV0aENvZGVDbGllbnQuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOm4scmVxdWVzdEF1dGhvcml0eTp0JiZ0LmF1dGhvcml0eSxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6dD8uZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDp0JiZ0LmFjY291bnR8fHZvaWQgMH0pO2lmKGkuYXV0aG9yaXR5LnByb3RvY29sTW9kZT09PWxyLk9JREMpdHJ5e2kuYXV0aG9yaXR5LmVuZFNlc3Npb25FbmRwb2ludH1jYXRjaHtpZihyLmFjY291bnQ/LmhvbWVBY2NvdW50SWQpcmV0dXJuIHZvaWQgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LHIpfWNvbnN0IHM9aS5nZXRMb2dvdXRVcmkocik7aWYodGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LHIpLCF0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5vblJlZGlyZWN0TmF2aWdhdGUpcmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCl8fHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCEwLFRzKSx2b2lkIGF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUV4dGVybmFsKHMsbyk7aWYoITEhPT10Lm9uUmVkaXJlY3ROYXZpZ2F0ZShzKSlyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiTG9nb3V0IG9uUmVkaXJlY3ROYXZpZ2F0ZSBkaWQgbm90IHJldHVybiBmYWxzZSwgbmF2aWdhdGluZyIpLHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCl8fHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCEwLFRzKSx2b2lkIGF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUV4dGVybmFsKHMsbyk7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITEpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIkxvZ291dCBvblJlZGlyZWN0TmF2aWdhdGUgcmV0dXJuZWQgZmFsc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24iKX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgQ2UmJih0LnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKSxuLmNhY2hlRmFpbGVkUmVxdWVzdCh0KSksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LG51bGwsdCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpLHR9dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpfWdldFJlZGlyZWN0U3RhcnRQYWdlKGUpe2NvbnN0IHQ9ZXx8d2luZG93LmxvY2F0aW9uLmhyZWY7cmV0dXJuIHdyLmdldEFic29sdXRlVXJsKHQsYmEoKSl9fWFzeW5jIGZ1bmN0aW9uIHZsKGUsdCxyLG4sbyl7aWYodC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0LG4pLCFlKXRocm93IHIuaW5mbygiTmF2aWdhdGUgdXJsIGlzIGVtcHR5IiksWmkodGkpO3JldHVybiBvP1VuKGtsLE9yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUscix0LG4pKGUsbyx0LG4pOk5uKFNsLE9yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jLHIsdCxuKShlKX1hc3luYyBmdW5jdGlvbiBJbChlLHQscixuLG8pe2NvbnN0IGk9YmwoKTtpZighaS5jb250ZW50RG9jdW1lbnQpdGhyb3ciTm8gZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIGlmcmFtZSEiO3JldHVybihhd2FpdCBzbChpLmNvbnRlbnREb2N1bWVudCxlLHQscixuLG8pKS5zdWJtaXQoKSxpfWFzeW5jIGZ1bmN0aW9uIFRsKGUsdCxyLG4sbyl7Y29uc3QgaT1ibCgpO2lmKCFpLmNvbnRlbnREb2N1bWVudCl0aHJvdyJObyBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggaWZyYW1lISI7cmV0dXJuKGF3YWl0IGlsKGkuY29udGVudERvY3VtZW50LGUsdCxyLG4sbykpLnN1Ym1pdCgpLGl9YXN5bmMgZnVuY3Rpb24gQWwoZSx0LHIsbixvLGkscyl7cmV0dXJuIG4uYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRIYW5kbGVyTW9uaXRvcklmcmFtZUZvckhhc2gsaSksbmV3IFByb21pc2UoKChuLGkpPT57dDxLYSYmby53YXJuaW5nKGBzeXN0ZW0ubG9hZEZyYW1lVGltZW91dCBvciBzeXN0ZW0uaWZyYW1lSGFzaFRpbWVvdXQgc2V0IHRvIGxvd2VyICgke3R9bXMpIHRoYW4gdGhlIGRlZmF1bHQgKDEwMDAwbXMpLiBUaGlzIG1heSByZXN1bHQgaW4gdGltZW91dHMuYCk7Y29uc3QgYT13aW5kb3cuc2V0VGltZW91dCgoKCk9Pnt3aW5kb3cuY2xlYXJJbnRlcnZhbChjKSxpKFppKHVpKSl9KSx0KSxjPXdpbmRvdy5zZXRJbnRlcnZhbCgoKCk9PntsZXQgdD0iIjtjb25zdCByPWUuY29udGVudFdpbmRvdzt0cnl7dD1yP3IubG9jYXRpb24uaHJlZjoiIn1jYXRjaChlKXt9aWYoIXR8fCJhYm91dDpibGFuayI9PT10KXJldHVybjtsZXQgbz0iIjtyJiYobz1zPT09Xy5RVUVSWT9yLmxvY2F0aW9uLnNlYXJjaDpyLmxvY2F0aW9uLmhhc2gpLHdpbmRvdy5jbGVhclRpbWVvdXQoYSksd2luZG93LmNsZWFySW50ZXJ2YWwoYyksbihvKX0pLHIpfSkpLmZpbmFsbHkoKCgpPT57Tm4oRWwsT3IuUmVtb3ZlSGlkZGVuSWZyYW1lLG8sbixpKShlKX0pKX1mdW5jdGlvbiBrbChlLHQscixuKXtyZXR1cm4gci5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUsbiksbmV3IFByb21pc2UoKChyLG4pPT57Y29uc3Qgbz1ibCgpO3dpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e28/KG8uc3JjPWUscihvKSk6bigiVW5hYmxlIHRvIGxvYWQgaWZyYW1lIil9KSx0KX0pKX1mdW5jdGlvbiBTbChlKXtjb25zdCB0PWJsKCk7cmV0dXJuIHQuc3JjPWUsdH1mdW5jdGlvbiBibCgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIGUuY2xhc3NOYW1lPSJtc2FsU2lsZW50SWZyYW1lIixlLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9ZS5zdHlsZS5oZWlnaHQ9IjAiLGUuc3R5bGUuYm9yZGVyPSIwIixlLnNldEF0dHJpYnV0ZSgic2FuZGJveCIsImFsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctZm9ybXMiKSxlLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJsb2NhbC1uZXR3b3JrLWFjY2VzcyAqIiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKSxlfWZ1bmN0aW9uIEVsKGUpe2RvY3VtZW50LmJvZHk9PT1lLnBhcmVudE5vZGUmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSl9Y2xhc3MgUmwgZXh0ZW5kcyBRY3tjb25zdHJ1Y3RvcihlLHQscixuLG8saSxzLGEsYyxsLGgpe3N1cGVyKGUsdCxyLG4sbyxpLGEsbCxoKSx0aGlzLmFwaUlkPXMsdGhpcy5uYXRpdmVTdG9yYWdlPWN9YXN5bmMgYWNxdWlyZVRva2VuKHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRJZnJhbWVDbGllbnRBY3F1aXJlVG9rZW4sdC5jb3JyZWxhdGlvbklkKSx0LmxvZ2luSGludHx8dC5zaWR8fHQuYWNjb3VudCYmdC5hY2NvdW50LnVzZXJuYW1lfHx0aGlzLmxvZ2dlci53YXJuaW5nKCJObyB1c2VyIGhpbnQgcHJvdmlkZWQuIFRoZSBhdXRob3JpemF0aW9uIHNlcnZlciBtYXkgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGNvbXBsZXRlIHRoaXMgcmVxdWVzdC4iKTtjb25zdCByPXsuLi50fTtyLnByb21wdD9yLnByb21wdCE9PWIuTk9ORSYmci5wcm9tcHQhPT1iLk5PX1NFU1NJT04mJih0aGlzLmxvZ2dlci53YXJuaW5nKGBTaWxlbnRJZnJhbWVDbGllbnQuIFJlcGxhY2luZyBpbnZhbGlkIHByb21wdCAke3IucHJvbXB0fSB3aXRoICR7Yi5OT05FfWApLHIucHJvbXB0PWIuTk9ORSk6ci5wcm9tcHQ9Yi5OT05FO2NvbnN0IG49YXdhaXQgVW4odGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKShyLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCk7cmV0dXJuIG4ucGxhdGZvcm1Ccm9rZXI9eWwodGhpcy5jb25maWcsdGhpcy5sb2dnZXIsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixuLmF1dGhlbnRpY2F0aW9uU2NoZW1lKSxVYShuLmF1dGhvcml0eSksdGhpcy5jb25maWcuYXV0aC5wcm90b2NvbE1vZGU9PT1sci5FQVI/dGhpcy5leGVjdXRlRWFyRmxvdyhuKTp0aGlzLmV4ZWN1dGVDb2RlRmxvdyhuKX1hc3luYyBleGVjdXRlQ29kZUZsb3coZSl7bGV0IHQ7Y29uc3Qgcj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpO3RyeXtyZXR1cm4gdD1hd2FpdCBVbih0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKSh7c2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpyLHJlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxhd2FpdCBVbih0aGlzLnNpbGVudFRva2VuSGVscGVyLmJpbmQodGhpcyksT3IuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKHQsZSl9Y2F0Y2gobil7aWYobiBpbnN0YW5jZW9mIENlJiYobi5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCksci5jYWNoZUZhaWxlZFJlcXVlc3QobikpLCEodCYmbiBpbnN0YW5jZW9mIENlJiZuLmVycm9yQ29kZT09PWVzKSl0aHJvdyBuO3JldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7cmV0cnlFcnJvcjpuLmVycm9yQ29kZX0sdGhpcy5jb3JyZWxhdGlvbklkKSxhd2FpdCBVbih0aGlzLnNpbGVudFRva2VuSGVscGVyLmJpbmQodGhpcyksT3IuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZSl9fWFzeW5jIGV4ZWN1dGVFYXJGbG93KGUpe2NvbnN0IHQ9ZS5jb3JyZWxhdGlvbklkLHI9YXdhaXQgVW4odGhpcy5nZXREaXNjb3ZlcmVkQXV0aG9yaXR5LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldERpc2NvdmVyZWRBdXRob3JpdHksdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KSh7cmVxdWVzdEF1dGhvcml0eTplLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6ZS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6ZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmUuYWNjb3VudH0pLG49YXdhaXQgVW4oc2EsT3IuR2VuZXJhdGVFYXJLZXksdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KSgpLG89YXdhaXQgVW4oZGwsT3IuR2VuZXJhdGVQa2NlQ29kZXMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KSh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyLHQpLGk9ey4uLmUsZWFySndrOm4sY29kZUNoYWxsZW5nZTpvLmNoYWxsZW5nZX0scz1hd2FpdCBVbihUbCxPci5TaWxlbnRIYW5kbGVySW5pdGlhdGVBdXRoUmVxdWVzdCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHRoaXMuY29uZmlnLHIsaSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSxhPXRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlLGM9YXdhaXQgVW4oQWwsT3IuU2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkocyx0aGlzLmNvbmZpZy5zeXN0ZW0uaWZyYW1lSGFzaFRpbWVvdXQsdGhpcy5jb25maWcuc3lzdGVtLnBvbGxJbnRlcnZhbE1pbGxpc2Vjb25kcyx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyLHQsYSksbD1ObihqYyxPci5EZXNlcmlhbGl6ZVJlc3BvbnNlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkoYyxhLHRoaXMubG9nZ2VyKTtpZighbC5lYXJfandlJiZsLmNvZGUpe2NvbnN0IG49YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOnRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIodGhpcy5hcGlJZCkscmVxdWVzdEF1dGhvcml0eTplLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6ZS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6ZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmUuYWNjb3VudCxhdXRob3JpdHk6cn0pO3JldHVybiBVbihsbCxPci5IYW5kbGVSZXNwb25zZUNvZGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KShpLGwsby52ZXJpZmllcix0aGlzLmFwaUlkLHRoaXMuY29uZmlnLG4sdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLm5hdGl2ZVN0b3JhZ2UsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyKX1yZXR1cm4gVW4oaGwsT3IuSGFuZGxlUmVzcG9uc2VFYXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KShpLGwsdGhpcy5hcGlJZCx0aGlzLmNvbmZpZyxyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9bG9nb3V0KCl7cmV0dXJuIFByb21pc2UucmVqZWN0KFppKHlpKSl9YXN5bmMgc2lsZW50VG9rZW5IZWxwZXIoZSx0KXtjb25zdCByPXQuY29ycmVsYXRpb25JZDt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIscik7Y29uc3Qgbj1hd2FpdCBVbihkbCxPci5HZW5lcmF0ZVBrY2VDb2Rlcyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5sb2dnZXIsciksbz17Li4udCxjb2RlQ2hhbGxlbmdlOm4uY2hhbGxlbmdlfTtsZXQgaTtpZih0Lmh0dHBNZXRob2Q9PT1sKWk9YXdhaXQgVW4oSWwsT3IuU2lsZW50SGFuZGxlckluaXRpYXRlQXV0aFJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxyKSh0aGlzLmNvbmZpZyxlLmF1dGhvcml0eSxvLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO2Vsc2V7Y29uc3QgdD1hd2FpdCBVbihvbCxPci5HZXRBdXRoQ29kZVVybCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHRoaXMuY29uZmlnLGUuYXV0aG9yaXR5LG8sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7aT1hd2FpdCBVbih2bCxPci5TaWxlbnRIYW5kbGVySW5pdGlhdGVBdXRoUmVxdWVzdCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixyLHRoaXMuY29uZmlnLnN5c3RlbS5uYXZpZ2F0ZUZyYW1lV2FpdCl9Y29uc3Qgcz10aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLnNlcnZlclJlc3BvbnNlVHlwZSxhPWF3YWl0IFVuKEFsLE9yLlNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKGksdGhpcy5jb25maWcuc3lzdGVtLmlmcmFtZUhhc2hUaW1lb3V0LHRoaXMuY29uZmlnLnN5c3RlbS5wb2xsSW50ZXJ2YWxNaWxsaXNlY29uZHMsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixyLHMpLGM9Tm4oamMsT3IuRGVzZXJpYWxpemVSZXNwb25zZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKGEscyx0aGlzLmxvZ2dlcik7cmV0dXJuIFVuKGxsLE9yLkhhbmRsZVJlc3BvbnNlQ29kZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHQsYyxuLnZlcmlmaWVyLHRoaXMuYXBpSWQsdGhpcy5jb25maWcsZSx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMubmF0aXZlU3RvcmFnZSx0aGlzLmV2ZW50SGFuZGxlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpfX1jbGFzcyBfbCBleHRlbmRzIFFje2FzeW5jIGFjcXVpcmVUb2tlbihlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU2lsZW50UmVmcmVzaENsaWVudEFjcXVpcmVUb2tlbixlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9YXdhaXQgVW4oS2MsT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShlLHRoaXMuY29uZmlnLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5sb2dnZXIpLHI9ey4uLmUsLi4udH07ZS5yZWRpcmVjdFVyaSYmKHIucmVkaXJlY3RVcmk9dGhpcy5nZXRSZWRpcmVjdFVyaShlLnJlZGlyZWN0VXJpKSk7Y29uc3Qgbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKE1zLmFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93KSxvPWF3YWl0IHRoaXMuY3JlYXRlUmVmcmVzaFRva2VuQ2xpZW50KHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOm4sYXV0aG9yaXR5VXJsOnIuYXV0aG9yaXR5LGF6dXJlQ2xvdWRPcHRpb25zOnIuYXp1cmVDbG91ZE9wdGlvbnMsYWNjb3VudDpyLmFjY291bnR9KTtyZXR1cm4gVW4oby5hY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbi5iaW5kKG8pLE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShyKS5jYXRjaCgoZT0+e3Rocm93IGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLG4uY2FjaGVGYWlsZWRSZXF1ZXN0KGUpLGV9KSl9bG9nb3V0KCl7cmV0dXJuIFByb21pc2UucmVqZWN0KFppKHlpKSl9YXN5bmMgY3JlYXRlUmVmcmVzaFRva2VuQ2xpZW50KGUpe2NvbnN0IHQ9YXdhaXQgVW4odGhpcy5nZXRDbGllbnRDb25maWd1cmF0aW9uLmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldENsaWVudENvbmZpZ3VyYXRpb24sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOmUuc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixyZXF1ZXN0QXV0aG9yaXR5OmUuYXV0aG9yaXR5VXJsLHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczplLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLGFjY291bnQ6ZS5hY2NvdW50fSk7cmV0dXJuIG5ldyBObyh0LHRoaXMucGVyZm9ybWFuY2VDbGllbnQpfX1jbGFzcyBQbHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmlzQnJvd3NlckVudmlyb25tZW50PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHRoaXMuY29uZmlnPWUsdGhpcy5zdG9yYWdlPXQsdGhpcy5sb2dnZXI9cix0aGlzLmNyeXB0b09iaj1ufWFzeW5jIGxvYWRFeHRlcm5hbFRva2VucyhlLHQscil7aWYoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpdGhyb3cgWmkoa2kpO2NvbnN0IG49ZS5jb3JyZWxhdGlvbklkfHxvYSgpLG89dC5pZF90b2tlbj9kcih0LmlkX3Rva2VuLEtzKTp2b2lkIDAsaT11cihvfHx7fSkscz17cHJvdG9jb2xNb2RlOnRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlLGtub3duQXV0aG9yaXRpZXM6dGhpcy5jb25maWcuYXV0aC5rbm93bkF1dGhvcml0aWVzLGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6dGhpcy5jb25maWcuYXV0aC5jbG91ZERpc2NvdmVyeU1ldGFkYXRhLGF1dGhvcml0eU1ldGFkYXRhOnRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5TWV0YWRhdGEsc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6dGhpcy5jb25maWcuYXV0aC5za2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZX0sYT1lLmF1dGhvcml0eT9uZXcgWm4oWm4uZ2VuZXJhdGVBdXRob3JpdHkoZS5hdXRob3JpdHksZS5henVyZUNsb3VkT3B0aW9ucyksdGhpcy5jb25maWcuc3lzdGVtLm5ldHdvcmtDbGllbnQsdGhpcy5zdG9yYWdlLHMsdGhpcy5sb2dnZXIsZS5jb3JyZWxhdGlvbklkfHxvYSgpKTp2b2lkIDAsYz1hd2FpdCB0aGlzLmxvYWRBY2NvdW50KGUsci5jbGllbnRJbmZvfHx0LmNsaWVudF9pbmZvfHwiIixuLG8sYSksbD1hd2FpdCB0aGlzLmxvYWRJZFRva2VuKHQsYy5ob21lQWNjb3VudElkLGMuZW52aXJvbm1lbnQsYy5yZWFsbSxuLGkpLGg9YXdhaXQgdGhpcy5sb2FkQWNjZXNzVG9rZW4oZSx0LGMuaG9tZUFjY291bnRJZCxjLmVudmlyb25tZW50LGMucmVhbG0scixuLGkpLGQ9YXdhaXQgdGhpcy5sb2FkUmVmcmVzaFRva2VuKHQsYy5ob21lQWNjb3VudElkLGMuZW52aXJvbm1lbnQsbixpKTtyZXR1cm4gdGhpcy5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KGUse2FjY291bnQ6YyxpZFRva2VuOmwsYWNjZXNzVG9rZW46aCxyZWZyZXNoVG9rZW46ZH0sbyxhKX1hc3luYyBsb2FkQWNjb3VudChlLHQscixuLG8pe2lmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBsb2FkaW5nIGFjY291bnQiKSxlLmFjY291bnQpe2NvbnN0IHQ9aHIuY3JlYXRlRnJvbUFjY291bnRJbmZvKGUuYWNjb3VudCk7cmV0dXJuIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXRBY2NvdW50KHQscix1cihufHx7fSkpLHR9aWYoIW98fCF0JiYhbil0aHJvdyB0aGlzLmxvZ2dlci5lcnJvcigiVG9rZW5DYWNoZSAtIGlmIGFuIGFjY291bnQgaXMgbm90IHByb3ZpZGVkIG9uIHRoZSByZXF1ZXN0LCBhdXRob3JpdHkgYW5kIGVpdGhlciBjbGllbnRJbmZvIG9yIGlkVG9rZW4gbXVzdCBiZSBwcm92aWRlZCBpbnN0ZWFkLiIpLFppKFBpKTtjb25zdCBpPWhyLmdlbmVyYXRlSG9tZUFjY291bnRJZCh0LG8uYXV0aG9yaXR5VHlwZSx0aGlzLmxvZ2dlcix0aGlzLmNyeXB0b09iaixuKSxzPW4/LnRpZCxhPU1vKHRoaXMuc3RvcmFnZSxvLGksS3MscixuLHQsby5ob3N0bmFtZUFuZFBvcnQscyx2b2lkIDAsdm9pZCAwLHRoaXMubG9nZ2VyKTtyZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLnNldEFjY291bnQoYSxyLHVyKG58fHt9KSksYX1hc3luYyBsb2FkSWRUb2tlbihlLHQscixuLG8saSl7aWYoIWUuaWRfdG9rZW4pcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBubyBpZCB0b2tlbiBmb3VuZCBpbiByZXNwb25zZSIpLG51bGw7dGhpcy5sb2dnZXIudmVyYm9zZSgiVG9rZW5DYWNoZSAtIGxvYWRpbmcgaWQgdG9rZW4iKTtjb25zdCBzPUtuKHQscixlLmlkX3Rva2VuLHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsbik7cmV0dXJuIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXRJZFRva2VuQ3JlZGVudGlhbChzLG8saSksc31hc3luYyBsb2FkQWNjZXNzVG9rZW4oZSx0LHIsbixvLGkscyxhKXtpZighdC5hY2Nlc3NfdG9rZW4pcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBubyBhY2Nlc3MgdG9rZW4gZm91bmQgaW4gcmVzcG9uc2UiKSxudWxsO2lmKCF0LmV4cGlyZXNfaW4pcmV0dXJuIHRoaXMubG9nZ2VyLmVycm9yKCJUb2tlbkNhY2hlIC0gbm8gZXhwaXJhdGlvbiBzZXQgb24gdGhlIGFjY2VzcyB0b2tlbi4gQ2Fubm90IGFkZCBpdCB0byB0aGUgY2FjaGUuIiksbnVsbDtpZighKHQuc2NvcGV8fGUuc2NvcGVzJiZlLnNjb3Blcy5sZW5ndGgpKXJldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiVG9rZW5DYWNoZSAtIHNjb3BlcyBub3Qgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlLiBDYW5ub3QgYWRkIHRva2VuIHRvIHRoZSBjYWNoZS4iKSxudWxsO3RoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBsb2FkaW5nIGFjY2VzcyB0b2tlbiIpO2NvbnN0IGM9dC5zY29wZT9YdC5mcm9tU3RyaW5nKHQuc2NvcGUpOm5ldyBYdChlLnNjb3BlcyksbD1pLmV4cGlyZXNPbnx8dC5leHBpcmVzX2luK0RuKCksaD1pLmV4dGVuZGVkRXhwaXJlc09ufHwodC5leHRfZXhwaXJlc19pbnx8dC5leHBpcmVzX2luKStEbigpLGQ9R24ocixuLHQuYWNjZXNzX3Rva2VuLHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsbyxjLnByaW50U2NvcGVzKCksbCxoLEtzKTtyZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLnNldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChkLHMsYSksZH1hc3luYyBsb2FkUmVmcmVzaFRva2VuKGUsdCxyLG4sbyl7aWYoIWUucmVmcmVzaF90b2tlbilyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiVG9rZW5DYWNoZSAtIG5vIHJlZnJlc2ggdG9rZW4gZm91bmQgaW4gcmVzcG9uc2UiKSxudWxsO3RoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBsb2FkaW5nIHJlZnJlc2ggdG9rZW4iKTtjb25zdCBpPSRuKHQscixlLnJlZnJlc2hfdG9rZW4sdGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxlLmZvY2ksdm9pZCAwLGUucmVmcmVzaF90b2tlbl9leHBpcmVzX2luKTtyZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLnNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoaSxuLG8pLGl9Z2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdChlLHQscixuKXtsZXQgbyxpPSIiLHM9W10sYT1udWxsO3Q/LmFjY2Vzc1Rva2VuJiYoaT10LmFjY2Vzc1Rva2VuLnNlY3JldCxzPVh0LmZyb21TdHJpbmcodC5hY2Nlc3NUb2tlbi50YXJnZXQpLmFzQXJyYXkoKSxhPXhuKHQuYWNjZXNzVG9rZW4uZXhwaXJlc09uKSxvPXhuKHQuYWNjZXNzVG9rZW4uZXh0ZW5kZWRFeHBpcmVzT24pKTtjb25zdCBjPXQuYWNjb3VudDtyZXR1cm57YXV0aG9yaXR5Om4/bi5jYW5vbmljYWxBdXRob3JpdHk6IiIsdW5pcXVlSWQ6dC5hY2NvdW50LmxvY2FsQWNjb3VudElkLHRlbmFudElkOnQuYWNjb3VudC5yZWFsbSxzY29wZXM6cyxhY2NvdW50OmhyLmdldEFjY291bnRJbmZvKGMpLGlkVG9rZW46dC5pZFRva2VuPy5zZWNyZXR8fCIiLGlkVG9rZW5DbGFpbXM6cnx8e30sYWNjZXNzVG9rZW46aSxmcm9tQ2FjaGU6ITAsZXhwaXJlc09uOmEsY29ycmVsYXRpb25JZDplLmNvcnJlbGF0aW9uSWR8fCIiLHJlcXVlc3RJZDoiIixleHRFeHBpcmVzT246byxmYW1pbHlJZDp0LnJlZnJlc2hUb2tlbj8uZmFtaWx5SWR8fCIiLHRva2VuVHlwZTp0Py5hY2Nlc3NUb2tlbj8udG9rZW5UeXBlfHwiIixzdGF0ZTplLnN0YXRlfHwiIixjbG91ZEdyYXBoSG9zdE5hbWU6Yy5jbG91ZEdyYXBoSG9zdE5hbWV8fCIiLG1zR3JhcGhIb3N0OmMubXNHcmFwaEhvc3R8fCIiLGZyb21OYXRpdmVCcm9rZXI6ITF9fX1jbGFzcyBNbCBleHRlbmRzIHFve2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuaW5jbHVkZVJlZGlyZWN0VXJpPSExfX1jbGFzcyBPbCBleHRlbmRzIFFje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSxjLGwpe3N1cGVyKGUsdCxyLG4sbyxpLGEsYyxsKSx0aGlzLmFwaUlkPXN9YXN5bmMgYWNxdWlyZVRva2VuKHQpe2lmKCF0LmNvZGUpdGhyb3cgWmkoT2kpO2NvbnN0IHI9YXdhaXQgVW4odGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKSh0LGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCksbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpO3RyeXtjb25zdCBlPXsuLi5yLGNvZGU6dC5jb2RlfSxvPWF3YWl0IFVuKHRoaXMuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKSh7c2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpuLHJlcXVlc3RBdXRob3JpdHk6ci5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOnIuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOnIuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDpyLmFjY291bnR9KSxpPW5ldyBNbChvKTt0aGlzLmxvZ2dlci52ZXJib3NlKCJBdXRoIGNvZGUgY2xpZW50IGNyZWF0ZWQiKTtjb25zdCBzPW5ldyBWYyhpLHRoaXMuYnJvd3NlclN0b3JhZ2UsZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtyZXR1cm4gYXdhaXQgVW4ocy5oYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyLmJpbmQocyksT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkoe2NvZGU6dC5jb2RlLG1zZ3JhcGhfaG9zdDp0Lm1zR3JhcGhIb3N0LGNsb3VkX2dyYXBoX2hvc3RfbmFtZTp0LmNsb3VkR3JhcGhIb3N0TmFtZSxjbG91ZF9pbnN0YW5jZV9ob3N0X25hbWU6dC5jbG91ZEluc3RhbmNlSG9zdE5hbWV9LHIsITEpfWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBDZSYmKGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLG4uY2FjaGVGYWlsZWRSZXF1ZXN0KGUpKSxlfX1sb2dvdXQoKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoWmkoeWkpKX19ZnVuY3Rpb24gcWwoZSx0LHIpe3RyeXtxYShlKX1jYXRjaChlKXt0aHJvdyB0LmVuZCh7c3VjY2VzczohMX0sZSxyKSxlfX1jbGFzcyBObHtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wZXJhdGluZ0NvbnRleHQ9ZSx0aGlzLmlzQnJvd3NlckVudmlyb25tZW50PXRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpLHRoaXMuY29uZmlnPWUuZ2V0Q29uZmlnKCksdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmxvZ2dlcj10aGlzLm9wZXJhdGluZ0NvbnRleHQuZ2V0TG9nZ2VyKCksdGhpcy5uZXR3b3JrQ2xpZW50PXRoaXMuY29uZmlnLnN5c3RlbS5uZXR3b3JrQ2xpZW50LHRoaXMubmF2aWdhdGlvbkNsaWVudD10aGlzLmNvbmZpZy5zeXN0ZW0ubmF2aWdhdGlvbkNsaWVudCx0aGlzLnJlZGlyZWN0UmVzcG9uc2U9bmV3IE1hcCx0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzPW5ldyBNYXAsdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10aGlzLmNvbmZpZy50ZWxlbWV0cnkuY2xpZW50LHRoaXMuYnJvd3NlckNyeXB0bz10aGlzLmlzQnJvd3NlckVudmlyb25tZW50P25ldyB5Yyh0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTpmdCx0aGlzLmV2ZW50SGFuZGxlcj1uZXcgRmModGhpcy5sb2dnZXIpLHRoaXMuYnJvd3NlclN0b3JhZ2U9dGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudD9uZXcgTWModGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCx0aGlzLmNvbmZpZy5jYWNoZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmV2ZW50SGFuZGxlcix0byh0aGlzLmNvbmZpZy5hdXRoKSk6cWModGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyKTtjb25zdCB0PXtjYWNoZUxvY2F0aW9uOkNzLk1lbW9yeVN0b3JhZ2UsY2FjaGVSZXRlbnRpb25EYXlzOjUsdGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbjpDcy5NZW1vcnlTdG9yYWdlLHN0b3JlQXV0aFN0YXRlSW5Db29raWU6ITEsc2VjdXJlQ29va2llczohMSxjYWNoZU1pZ3JhdGlvbkVuYWJsZWQ6ITEsY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDohMX07dGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2U9bmV3IE1jKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsdCx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmV2ZW50SGFuZGxlciksdGhpcy50b2tlbkNhY2hlPW5ldyBQbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlckNyeXB0byksdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzPW5ldyBNYXAsdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5PXRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eS5iaW5kKHRoaXMpLHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudD10aGlzLnRyYWNrUGFnZVZpc2liaWxpdHlXaXRoTWVhc3VyZW1lbnQuYmluZCh0aGlzKX1zdGF0aWMgYXN5bmMgY3JlYXRlQ29udHJvbGxlcihlLHQpe2NvbnN0IHI9bmV3IE5sKGUpO3JldHVybiBhd2FpdCByLmluaXRpYWxpemUodCkscn10cmFja1BhZ2VWaXNpYmlsaXR5KGUpe2UmJih0aGlzLmxvZ2dlci5pbmZvKCJQZXJmOiBWaXNpYmlsaXR5IGNoYW5nZSBkZXRlY3RlZCIpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHt2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6MX0sZSkpfWFzeW5jIGluaXRpYWxpemUoZSx0KXtpZih0aGlzLmxvZ2dlci50cmFjZSgiaW5pdGlhbGl6ZSBjYWxsZWQiKSx0aGlzLmluaXRpYWxpemVkKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmluZm8oImluaXRpYWxpemUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQsIGV4aXRpbmcgZWFybHkuIik7aWYoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oImluIG5vbi1icm93c2VyIGVudmlyb25tZW50LCBleGl0aW5nIGVhcmx5LiIpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsdm9pZCB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuSU5JVElBTElaRV9FTkQpO2NvbnN0IHI9ZT8uY29ycmVsYXRpb25JZHx8dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpLG49dGhpcy5jb25maWcuc3lzdGVtLmFsbG93UGxhdGZvcm1Ccm9rZXIsbz10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuSW5pdGlhbGl6ZUNsaWVudEFwcGxpY2F0aW9uLHIpO2lmKHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5JTklUSUFMSVpFX1NUQVJUKSwhdCl0cnl7dGhpcy5sb2dNdWx0aXBsZUluc3RhbmNlcyhvKX1jYXRjaHt9aWYoYXdhaXQgVW4odGhpcy5icm93c2VyU3RvcmFnZS5pbml0aWFsaXplLmJpbmQodGhpcy5icm93c2VyU3RvcmFnZSksT3IuSW5pdGlhbGl6ZUNhY2hlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQscikociksbil0cnl7dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj1hd2FpdCBmbCh0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIsdGhpcy5jb25maWcuc3lzdGVtLm5hdGl2ZUJyb2tlckhhbmRzaGFrZVRpbWVvdXQsdGhpcy5jb25maWcuc3lzdGVtLmFsbG93UGxhdGZvcm1Ccm9rZXJXaXRoRE9NKX1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKGUpfXRoaXMuY29uZmlnLmNhY2hlLmNsYWltc0Jhc2VkQ2FjaGluZ0VuYWJsZWR8fCh0aGlzLmxvZ2dlci52ZXJib3NlKCJDbGFpbXMtYmFzZWQgY2FjaGluZyBpcyBkaXNhYmxlZC4gQ2xlYXJpbmcgdGhlIHByZXZpb3VzIGNhY2hlIHdpdGggY2xhaW1zIiksTm4odGhpcy5icm93c2VyU3RvcmFnZS5jbGVhclRva2Vuc0FuZEtleXNXaXRoQ2xhaW1zLmJpbmQodGhpcy5icm93c2VyU3RvcmFnZSksT3IuQ2xlYXJUb2tlbnNBbmRLZXlzV2l0aENsYWltcyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHIpKSx0aGlzLmNvbmZpZy5zeXN0ZW0uYXN5bmNQb3B1cHMmJmF3YWl0IHRoaXMucHJlR2VuZXJhdGVQa2NlQ29kZXMociksdGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuSU5JVElBTElaRV9FTkQpLG8uZW5kKHthbGxvd1BsYXRmb3JtQnJva2VyOm4sc3VjY2VzczohMH0pfWFzeW5jIGhhbmRsZVJlZGlyZWN0UHJvbWlzZShlKXtpZih0aGlzLmxvZ2dlci52ZXJib3NlKCJoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIiksT2EodGhpcy5pbml0aWFsaXplZCksdGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudCl7Y29uc3QgdD1lfHwiIjtsZXQgcj10aGlzLnJlZGlyZWN0UmVzcG9uc2UuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1yPyhyPXRoaXMuaGFuZGxlUmVkaXJlY3RQcm9taXNlSW50ZXJuYWwoZSksdGhpcy5yZWRpcmVjdFJlc3BvbnNlLnNldCh0LHIpLHRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBoYXMgYmVlbiBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBzdG9yaW5nIHRoZSBwcm9taXNlIikpOnRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBoYXMgYmVlbiBjYWxsZWQgcHJldmlvdXNseSwgcmV0dXJuaW5nIHRoZSByZXN1bHQgZnJvbSB0aGUgZmlyc3QgY2FsbCIpLHJ9cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSByZXR1cm5zIG51bGwsIG5vdCBicm93c2VyIGVudmlyb25tZW50IiksbnVsbH1hc3luYyBoYW5kbGVSZWRpcmVjdFByb21pc2VJbnRlcm5hbCh0KXtpZighdGhpcy5icm93c2VyU3RvcmFnZS5pc0ludGVyYWN0aW9uSW5Qcm9ncmVzcyghMCkpcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQgYnV0IHRoZXJlIGlzIG5vIGludGVyYWN0aW9uIGluIHByb2dyZXNzLCByZXR1cm5pbmcgbnVsbC4iKSxudWxsO2NvbnN0IHI9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKT8udHlwZTtpZihyPT09VHMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSByZW1vdmluZyBpbnRlcmFjdGlvbl9pbl9wcm9ncmVzcyBmbGFnIGFuZCByZXR1cm5pbmcgbnVsbCBhZnRlciBzaWduLW91dCIpLHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCExKSxQcm9taXNlLnJlc29sdmUobnVsbCk7Y29uc3Qgbj10aGlzLmdldEFsbEFjY291bnRzKCksbz10aGlzLmJyb3dzZXJTdG9yYWdlLmdldENhY2hlZE5hdGl2ZVJlcXVlc3QoKSxpPW8mJnRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXImJiF0O2xldCBzLGE7dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkhBTkRMRV9SRURJUkVDVF9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCk7dHJ5e2lmKGkmJnRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpe3M9dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblJlZGlyZWN0LG8/LmNvcnJlbGF0aW9uSWR8fCIiKSx0aGlzLmxvZ2dlci50cmFjZSgiaGFuZGxlUmVkaXJlY3RQcm9taXNlIC0gYWNxdWlyaW5nIHRva2VuIGZyb20gbmF0aXZlIHBsYXRmb3JtIikscy5hZGQoe2lzUGxhdGZvcm1Ccm9rZXJSZXF1ZXN0OiEwfSk7Y29uc3QgZT1uZXcgcmwodGhpcy5jb25maWcsdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LE1zLmhhbmRsZVJlZGlyZWN0UHJvbWlzZSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsby5hY2NvdW50SWQsdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2Usby5jb3JyZWxhdGlvbklkKTthPVVuKGUuaGFuZGxlUmVkaXJlY3RQcm9taXNlLmJpbmQoZSksT3IuSGFuZGxlTmF0aXZlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxzLmV2ZW50LmNvcnJlbGF0aW9uSWQpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQscy5ldmVudC5jb3JyZWxhdGlvbklkKX1lbHNle2NvbnN0W2Uscl09dGhpcy5icm93c2VyU3RvcmFnZS5nZXRDYWNoZWRSZXF1ZXN0KCksbj1lLmNvcnJlbGF0aW9uSWQ7cz10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuUmVkaXJlY3QsbiksdGhpcy5sb2dnZXIudHJhY2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSAtIGFjcXVpcmluZyB0b2tlbiBmcm9tIHdlYiBmbG93Iik7Y29uc3Qgbz10aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KG4pO2E9VW4oby5oYW5kbGVSZWRpcmVjdFByb21pc2UuYmluZChvKSxPci5IYW5kbGVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHMuZXZlbnQuY29ycmVsYXRpb25JZCkodCxlLHIscyl9fWNhdGNoKGUpe3Rocm93IHRoaXMuYnJvd3NlclN0b3JhZ2UucmVzZXRSZXF1ZXN0Q2FjaGUoKSxlfXJldHVybiBhLnRoZW4oKHQ9PntpZih0KXt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCk7bi5sZW5ndGg8dGhpcy5nZXRBbGxBY2NvdW50cygpLmxlbmd0aD8odGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR0lOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCksdGhpcy5sb2dnZXIudmVyYm9zZSgiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSByZXR1cm5lZCByZXN1bHQsIGxvZ2luIHN1Y2Nlc3MiKSk6KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCksdGhpcy5sb2dnZXIudmVyYm9zZSgiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSByZXR1cm5lZCByZXN1bHQsIGFjcXVpcmUgdG9rZW4gc3VjY2VzcyIpKSxzLmVuZCh7c3VjY2VzczohMH0sdm9pZCAwLHQuYWNjb3VudCl9ZWxzZSBzLmV2ZW50LmVycm9yQ29kZT9zLmVuZCh7c3VjY2VzczohMX0sdm9pZCAwKTpzLmRpc2NhcmQoKTtyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkhBTkRMRV9SRURJUkVDVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpLHR9KSkuY2F0Y2goKHQ9Pnt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCk7Y29uc3Qgcj10O3Rocm93IG4ubGVuZ3RoPjA/dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCxudWxsLHIpOnRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dJTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LG51bGwsciksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkhBTkRMRV9SRURJUkVDVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpLHMuZW5kKHtzdWNjZXNzOiExfSxyKSx0fSkpfWFzeW5jIGFjcXVpcmVUb2tlblJlZGlyZWN0KHQpe2NvbnN0IHI9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCh0KTt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5SZWRpcmVjdCBjYWxsZWQiLHIpO2NvbnN0IG49dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblByZVJlZGlyZWN0LHIpO24uYWRkKHtzY2VuYXJpb0lkOnQuc2NlbmFyaW9JZH0pO2NvbnN0IG89dC5vblJlZGlyZWN0TmF2aWdhdGU7aWYobyl0Lm9uUmVkaXJlY3ROYXZpZ2F0ZT1lPT57Y29uc3Qgcj0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vKGUpOnZvaWQgMDtyZXR1cm4gbi5hZGQoe25hdmlnYXRlQ2FsbGJhY2tSZXN1bHQ6ITEhPT1yfSksbi5ldmVudD1uLmVuZCh7c3VjY2VzczohMH0sdm9pZCAwLHQuYWNjb3VudCl8fG4uZXZlbnQscn07ZWxzZXtjb25zdCBlPXRoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlO3RoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlPXI9Pntjb25zdCBvPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2Uocik6dm9pZCAwO3JldHVybiBuLmFkZCh7bmF2aWdhdGVDYWxsYmFja1Jlc3VsdDohMSE9PW99KSxuLmV2ZW50PW4uZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsdC5hY2NvdW50KXx8bi5ldmVudCxvfX1jb25zdCBpPXRoaXMuZ2V0QWxsQWNjb3VudHMoKS5sZW5ndGg+MDt0cnl7bGV0IG87aWYoTmEodGhpcy5pbml0aWFsaXplZCx0aGlzLmNvbmZpZyksdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITAsSXMpLGk/dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCk6dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR0lOX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LHQpLHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXImJnRoaXMuY2FuVXNlUGxhdGZvcm1Ccm9rZXIodCkpe289bmV3IHJsKHRoaXMuY29uZmlnLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubmF2aWdhdGlvbkNsaWVudCxNcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsdGhpcy5nZXROYXRpdmVBY2NvdW50SWQodCksdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UscikuYWNxdWlyZVRva2VuUmVkaXJlY3QodCxuKS5jYXRjaCgoZT0+e2lmKG4uYWRkKHticm9rZXJFcnJvck5hbWU6ZS5uYW1lLGJyb2tlckVycm9yQ29kZTplLmVycm9yQ29kZX0pLGUgaW5zdGFuY2VvZiBYYyYmWmMoZSkpe3RoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXI9dm9pZCAwO3JldHVybiB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KHIpLmFjcXVpcmVUb2tlbih0KX1pZihlIGluc3RhbmNlb2YgQW8pe3RoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblJlZGlyZWN0IC0gUmVzb2x2aW5nIGludGVyYWN0aW9uIHJlcXVpcmVkIGVycm9yIHRocm93biBieSBuYXRpdmUgYnJva2VyIGJ5IGZhbGxpbmcgYmFjayB0byB3ZWIgZmxvdyIpO3JldHVybiB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KHIpLmFjcXVpcmVUb2tlbih0KX10aHJvdyBlfSkpfWVsc2V7bz10aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KHIpLmFjcXVpcmVUb2tlbih0KX1yZXR1cm4gYXdhaXQgb31jYXRjaChvKXt0aHJvdyB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCksMj09PW4uZXZlbnQuc3RhdHVzP3RoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5BY3F1aXJlVG9rZW5SZWRpcmVjdCxyKS5lbmQoe3N1Y2Nlc3M6ITF9LG8sdC5hY2NvdW50KTpuLmVuZCh7c3VjY2VzczohMX0sbyx0LmFjY291bnQpLGk/dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCxudWxsLG8pOnRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dJTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LG51bGwsbyksb319YWNxdWlyZVRva2VuUG9wdXAodCl7Y29uc3Qgcj10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKHQpLG49dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblBvcHVwLHIpO24uYWRkKHtzY2VuYXJpb0lkOnQuc2NlbmFyaW9JZH0pO3RyeXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5Qb3B1cCBjYWxsZWQiLHIpLHFsKHRoaXMuaW5pdGlhbGl6ZWQsbix0LmFjY291bnQpLHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCEwLElzKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Y29uc3Qgbz10aGlzLmdldEFsbEFjY291bnRzKCk7bGV0IGk7by5sZW5ndGg+MD90aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx0KTp0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuTE9HSU5fU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsdCk7Y29uc3Qgcz10aGlzLmdldFByZUdlbmVyYXRlZFBrY2VDb2RlcyhyKTtpZih0aGlzLmNhblVzZVBsYXRmb3JtQnJva2VyKHQpKW4uYWRkKHtpc1BsYXRmb3JtQnJva2VyUmVxdWVzdDohMH0pLGk9dGhpcy5hY3F1aXJlVG9rZW5OYXRpdmUoey4uLnQsY29ycmVsYXRpb25JZDpyfSxNcy5hY3F1aXJlVG9rZW5Qb3B1cCkudGhlbigoZT0+KG4uZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsZS5hY2NvdW50KSxlKSkpLmNhdGNoKChlPT57aWYobi5hZGQoe2Jyb2tlckVycm9yTmFtZTplLm5hbWUsYnJva2VyRXJyb3JDb2RlOmUuZXJyb3JDb2RlfSksZSBpbnN0YW5jZW9mIFhjJiZaYyhlKSl7dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj12b2lkIDA7cmV0dXJuIHRoaXMuY3JlYXRlUG9wdXBDbGllbnQocikuYWNxdWlyZVRva2VuKHQscyl9aWYoZSBpbnN0YW5jZW9mIEFvKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5Qb3B1cCAtIFJlc29sdmluZyBpbnRlcmFjdGlvbiByZXF1aXJlZCBlcnJvciB0aHJvd24gYnkgbmF0aXZlIGJyb2tlciBieSBmYWxsaW5nIGJhY2sgdG8gd2ViIGZsb3ciKTtyZXR1cm4gdGhpcy5jcmVhdGVQb3B1cENsaWVudChyKS5hY3F1aXJlVG9rZW4odCxzKX10aHJvdyBlfSkpO2Vsc2V7aT10aGlzLmNyZWF0ZVBvcHVwQ2xpZW50KHIpLmFjcXVpcmVUb2tlbih0LHMpfXJldHVybiBpLnRoZW4oKHQ9PihvLmxlbmd0aDx0aGlzLmdldEFsbEFjY291bnRzKCkubGVuZ3RoP3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dJTl9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLHQpOnRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsdCksbi5lbmQoe3N1Y2Nlc3M6ITAsYWNjZXNzVG9rZW5TaXplOnQuYWNjZXNzVG9rZW4ubGVuZ3RoLGlkVG9rZW5TaXplOnQuaWRUb2tlbi5sZW5ndGh9LHZvaWQgMCx0LmFjY291bnQpLHQpKSkuY2F0Y2goKHI9PihvLmxlbmd0aD4wP3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsbnVsbCxyKTp0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuTE9HSU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCxudWxsLHIpLG4uZW5kKHtzdWNjZXNzOiExfSxyLHQuYWNjb3VudCksUHJvbWlzZS5yZWplY3QocikpKSkuZmluYWxseSgoYXN5bmMoKT0+e3RoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCExKSx0aGlzLmNvbmZpZy5zeXN0ZW0uYXN5bmNQb3B1cHMmJmF3YWl0IHRoaXMucHJlR2VuZXJhdGVQa2NlQ29kZXMocil9KSl9dHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCgpe2NvbnN0IGU9dGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudHx8dGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luY01lYXN1cmVtZW50O2UmJih0aGlzLmxvZ2dlci5pbmZvKCJQZXJmOiBWaXNpYmlsaXR5IGNoYW5nZSBkZXRlY3RlZCBpbiAiLGUuZXZlbnQubmFtZSksZS5pbmNyZW1lbnQoe3Zpc2liaWxpdHlDaGFuZ2VDb3VudDoxfSkpfWFzeW5jIHNzb1NpbGVudCh0KXtjb25zdCByPXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQodCksbj17Li4udCxwcm9tcHQ6dC5wcm9tcHQsY29ycmVsYXRpb25JZDpyfTtsZXQgbztpZih0aGlzLnNzb1NpbGVudE1lYXN1cmVtZW50PXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5Tc29TaWxlbnQsciksdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudD8uYWRkKHtzY2VuYXJpb0lkOnQuc2NlbmFyaW9JZH0pLHFsKHRoaXMuaW5pdGlhbGl6ZWQsdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudCx0LmFjY291bnQpLHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmluY3JlbWVudCh7dmlzaWJpbGl0eUNoYW5nZUNvdW50OjB9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLnRyYWNrUGFnZVZpc2liaWxpdHlXaXRoTWVhc3VyZW1lbnQpLHRoaXMubG9nZ2VyLnZlcmJvc2UoInNzb1NpbGVudCBjYWxsZWQiLHIpLHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5TU09fU0lMRU5UX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxuKSx0aGlzLmNhblVzZVBsYXRmb3JtQnJva2VyKG4pKXRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmFkZCh7aXNQbGF0Zm9ybUJyb2tlclJlcXVlc3Q6ITB9KSxvPXRoaXMuYWNxdWlyZVRva2VuTmF0aXZlKG4sTXMuc3NvU2lsZW50KS5jYXRjaCgoZT0+e2lmKHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmFkZCh7YnJva2VyRXJyb3JOYW1lOmUubmFtZSxicm9rZXJFcnJvckNvZGU6ZS5lcnJvckNvZGV9KSxlIGluc3RhbmNlb2YgWGMmJlpjKGUpKXt0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyPXZvaWQgMDtyZXR1cm4gdGhpcy5jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQobi5jb3JyZWxhdGlvbklkKS5hY3F1aXJlVG9rZW4obil9dGhyb3cgZX0pKTtlbHNle289dGhpcy5jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQobi5jb3JyZWxhdGlvbklkKS5hY3F1aXJlVG9rZW4obil9cmV0dXJuIG8udGhlbigodD0+KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5TU09fU0lMRU5UX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LHQpLHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmVuZCh7c3VjY2VzczohMCxhY2Nlc3NUb2tlblNpemU6dC5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6dC5pZFRva2VuLmxlbmd0aH0sdm9pZCAwLHQuYWNjb3VudCksdCkpKS5jYXRjaCgocj0+e3Rocm93IHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5TU09fU0lMRU5UX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG51bGwsciksdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudD8uZW5kKHtzdWNjZXNzOiExfSxyLHQuYWNjb3VudCkscn0pKS5maW5hbGx5KCgoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCl9KSl9YXN5bmMgYWNxdWlyZVRva2VuQnlDb2RlKHQpe2NvbnN0IHI9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCh0KTt0aGlzLmxvZ2dlci50cmFjZSgiYWNxdWlyZVRva2VuQnlDb2RlIGNhbGxlZCIscik7Y29uc3Qgbj10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuQnlDb2RlLHIpO3FsKHRoaXMuaW5pdGlhbGl6ZWQsbiksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fQllfQ09ERV9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQsdCksbi5hZGQoe3NjZW5hcmlvSWQ6dC5zY2VuYXJpb0lkfSk7dHJ5e2lmKHQuY29kZSYmdC5uYXRpdmVBY2NvdW50SWQpdGhyb3cgWmkoTmkpO2lmKHQuY29kZSl7Y29uc3Qgbz10LmNvZGU7bGV0IGk9dGhpcy5oeWJyaWRBdXRoQ29kZVJlc3BvbnNlcy5nZXQobyk7cmV0dXJuIGk/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIkV4aXN0aW5nIGFjcXVpcmVUb2tlbkJ5Q29kZSByZXF1ZXN0IGZvdW5kIixyKSxuLmRpc2NhcmQoKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoIkluaXRpYXRpbmcgbmV3IGFjcXVpcmVUb2tlbkJ5Q29kZSByZXF1ZXN0IixyKSxpPXRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmMoey4uLnQsY29ycmVsYXRpb25JZDpyfSkudGhlbigodD0+KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX0JZX0NPREVfU1VDQ0VTUyxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQsdCksdGhpcy5oeWJyaWRBdXRoQ29kZVJlc3BvbnNlcy5kZWxldGUobyksbi5lbmQoe3N1Y2Nlc3M6ITAsYWNjZXNzVG9rZW5TaXplOnQuYWNjZXNzVG9rZW4ubGVuZ3RoLGlkVG9rZW5TaXplOnQuaWRUb2tlbi5sZW5ndGh9LHZvaWQgMCx0LmFjY291bnQpLHQpKSkuY2F0Y2goKHQ9Pnt0aHJvdyB0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzLmRlbGV0ZShvKSx0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9CWV9DT0RFX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG51bGwsdCksbi5lbmQoe3N1Y2Nlc3M6ITF9LHQpLHR9KSksdGhpcy5oeWJyaWRBdXRoQ29kZVJlc3BvbnNlcy5zZXQobyxpKSksYXdhaXQgaX1pZih0Lm5hdGl2ZUFjY291bnRJZCl7aWYodGhpcy5jYW5Vc2VQbGF0Zm9ybUJyb2tlcih0LHQubmF0aXZlQWNjb3VudElkKSl7bi5hZGQoe2lzUGxhdGZvcm1Ccm9rZXJSZXF1ZXN0OiEwfSk7Y29uc3QgZT1hd2FpdCB0aGlzLmFjcXVpcmVUb2tlbk5hdGl2ZSh7Li4udCxjb3JyZWxhdGlvbklkOnJ9LE1zLmFjcXVpcmVUb2tlbkJ5Q29kZSx0Lm5hdGl2ZUFjY291bnRJZCkuY2F0Y2goKGU9Pnt0aHJvdyBlIGluc3RhbmNlb2YgWGMmJlpjKGUpJiYodGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj12b2lkIDApLG4uYWRkKHticm9rZXJFcnJvck5hbWU6ZS5uYW1lLGJyb2tlckVycm9yQ29kZTplLmVycm9yQ29kZX0pLGV9KSk7cmV0dXJuIG4uZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsZS5hY2NvdW50KSxlfXRocm93IFppKExpKX10aHJvdyBaaShxaSl9Y2F0Y2godCl7dGhyb3cgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fQllfQ09ERV9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxudWxsLHQpLG4uZW5kKHtzdWNjZXNzOiExfSx0KSx0fX1hc3luYyBhY3F1aXJlVG9rZW5CeUNvZGVBc3luYyhlKXt0aGlzLmxvZ2dlci50cmFjZSgiYWNxdWlyZVRva2VuQnlDb2RlQXN5bmMgY2FsbGVkIixlLmNvcnJlbGF0aW9uSWQpLHRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmNNZWFzdXJlbWVudD10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuQnlDb2RlQXN5bmMsZS5jb3JyZWxhdGlvbklkKSx0aGlzLmFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jTWVhc3VyZW1lbnQ/LmluY3JlbWVudCh7dmlzaWJpbGl0eUNoYW5nZUNvdW50OjB9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLnRyYWNrUGFnZVZpc2liaWxpdHlXaXRoTWVhc3VyZW1lbnQpO2NvbnN0IHQ9dGhpcy5jcmVhdGVTaWxlbnRBdXRoQ29kZUNsaWVudChlLmNvcnJlbGF0aW9uSWQpO3JldHVybiBhd2FpdCB0LmFjcXVpcmVUb2tlbihlKS50aGVuKChlPT4odGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luY01lYXN1cmVtZW50Py5lbmQoe3N1Y2Nlc3M6ITAsZnJvbUNhY2hlOmUuZnJvbUNhY2hlfSksZSkpKS5jYXRjaCgoZT0+e3Rocm93IHRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmNNZWFzdXJlbWVudD8uZW5kKHtzdWNjZXNzOiExfSxlKSxlfSkpLmZpbmFsbHkoKCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5V2l0aE1lYXN1cmVtZW50KX0pKX1hc3luYyBhY3F1aXJlVG9rZW5Gcm9tQ2FjaGUoZSx0KXtzd2l0Y2godGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlbkZyb21DYWNoZSxlLmNvcnJlbGF0aW9uSWQpLHQpe2Nhc2UgRHMuRGVmYXVsdDpjYXNlIERzLkFjY2Vzc1Rva2VuOmNhc2UgRHMuQWNjZXNzVG9rZW5BbmRSZWZyZXNoVG9rZW46Y29uc3QgdD10aGlzLmNyZWF0ZVNpbGVudENhY2hlQ2xpZW50KGUuY29ycmVsYXRpb25JZCk7cmV0dXJuIFVuKHQuYWNxdWlyZVRva2VuLmJpbmQodCksT3IuU2lsZW50Q2FjaGVDbGllbnRBY3F1aXJlVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpO2RlZmF1bHQ6dGhyb3cgbXQoWGUpfX1hc3luYyBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbihlLHQpe3N3aXRjaCh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sZS5jb3JyZWxhdGlvbklkKSx0KXtjYXNlIERzLkRlZmF1bHQ6Y2FzZSBEcy5BY2Nlc3NUb2tlbkFuZFJlZnJlc2hUb2tlbjpjYXNlIERzLlJlZnJlc2hUb2tlbjpjYXNlIERzLlJlZnJlc2hUb2tlbkFuZE5ldHdvcms6Y29uc3QgdD10aGlzLmNyZWF0ZVNpbGVudFJlZnJlc2hDbGllbnQoZS5jb3JyZWxhdGlvbklkKTtyZXR1cm4gVW4odC5hY3F1aXJlVG9rZW4uYmluZCh0KSxPci5TaWxlbnRSZWZyZXNoQ2xpZW50QWNxdWlyZVRva2VuLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShlKTtkZWZhdWx0OnRocm93IG10KFhlKX19YXN5bmMgYWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUoZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLGUuY29ycmVsYXRpb25JZCk7Y29uc3QgdD10aGlzLmNyZWF0ZVNpbGVudElmcmFtZUNsaWVudChlLmNvcnJlbGF0aW9uSWQpO3JldHVybiBVbih0LmFjcXVpcmVUb2tlbi5iaW5kKHQpLE9yLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSl9YXN5bmMgbG9nb3V0KGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChlKTtyZXR1cm4gdGhpcy5sb2dnZXIud2FybmluZygibG9nb3V0IEFQSSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gbXNhbC1icm93c2VyIHYzLjAuMC4gVXNlIGxvZ291dFJlZGlyZWN0IGluc3RlYWQuIix0KSx0aGlzLmxvZ291dFJlZGlyZWN0KHtjb3JyZWxhdGlvbklkOnQsLi4uZX0pfWFzeW5jIGxvZ291dFJlZGlyZWN0KGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChlKTtOYSh0aGlzLmluaXRpYWxpemVkLHRoaXMuY29uZmlnKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyghMCxUcyk7cmV0dXJuIHRoaXMuY3JlYXRlUmVkaXJlY3RDbGllbnQodCkubG9nb3V0KGUpfWxvZ291dFBvcHVwKGUpe3RyeXtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoZSk7cWEodGhpcy5pbml0aWFsaXplZCksdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITAsVHMpO3JldHVybiB0aGlzLmNyZWF0ZVBvcHVwQ2xpZW50KHQpLmxvZ291dChlKS5maW5hbGx5KCgoKT0+e3RoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCExKX0pKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fWFzeW5jIGNsZWFyQ2FjaGUoZSl7aWYoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIuaW5mbygiaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIHJldHVybmluZyBlYXJseS4iKTtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoZSk7cmV0dXJuIHRoaXMuY3JlYXRlU2lsZW50Q2FjaGVDbGllbnQodCkubG9nb3V0KGUpfWdldEFsbEFjY291bnRzKGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBOYyh0aGlzLmxvZ2dlcix0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQsdCxlKX1nZXRBY2NvdW50KGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBVYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWNjb3VudEJ5VXNlcm5hbWUoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKCk7cmV0dXJuIExjKGUsdGhpcy5sb2dnZXIsdGhpcy5icm93c2VyU3RvcmFnZSx0KX1nZXRBY2NvdW50QnlIb21lSWQoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKCk7cmV0dXJuIERjKGUsdGhpcy5sb2dnZXIsdGhpcy5icm93c2VyU3RvcmFnZSx0KX1nZXRBY2NvdW50QnlMb2NhbElkKGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBIYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9c2V0QWN0aXZlQWNjb3VudChlKXtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoKTt4YyhlLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWN0aXZlQWNjb3VudCgpe2NvbnN0IGU9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBCYyh0aGlzLmJyb3dzZXJTdG9yYWdlLGUpfWFzeW5jIGh5ZHJhdGVDYWNoZShlLHQpe3RoaXMubG9nZ2VyLnZlcmJvc2UoImh5ZHJhdGVDYWNoZSBjYWxsZWQiKTtjb25zdCByPWhyLmNyZWF0ZUZyb21BY2NvdW50SW5mbyhlLmFjY291bnQsZS5jbG91ZEdyYXBoSG9zdE5hbWUsZS5tc0dyYXBoSG9zdCk7cmV0dXJuIGF3YWl0IHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0QWNjb3VudChyLGUuY29ycmVsYXRpb25JZCx1cihlLmlkVG9rZW5DbGFpbXMpKSxlLmZyb21OYXRpdmVCcm9rZXI/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIlJlc3BvbnNlIHdhcyBmcm9tIG5hdGl2ZSBicm9rZXIsIHN0b3JpbmcgaW4tbWVtb3J5IiksdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UuaHlkcmF0ZUNhY2hlKGUsdCkpOnRoaXMuYnJvd3NlclN0b3JhZ2UuaHlkcmF0ZUNhY2hlKGUsdCl9YXN5bmMgYWNxdWlyZVRva2VuTmF0aXZlKGUsdCxyLG4pe2lmKHRoaXMubG9nZ2VyLnRyYWNlKCJhY3F1aXJlVG9rZW5OYXRpdmUgY2FsbGVkIiksIXRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpdGhyb3cgWmkoeGkpO3JldHVybiBuZXcgcmwodGhpcy5jb25maWcsdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLHJ8fHRoaXMuZ2V0TmF0aXZlQWNjb3VudElkKGUpLHRoaXMubmF0aXZlSW50ZXJuYWxTdG9yYWdlLGUuY29ycmVsYXRpb25JZCkuYWNxdWlyZVRva2VuKGUsbil9Y2FuVXNlUGxhdGZvcm1Ccm9rZXIoZSx0KXtpZih0aGlzLmxvZ2dlci50cmFjZSgiY2FuVXNlUGxhdGZvcm1Ccm9rZXIgY2FsbGVkIiksIXRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJjYW5Vc2VQbGF0Zm9ybUJyb2tlcjogcGxhdGZvcm0gYnJva2VyIHVuYXZpbGFibGUsIHJldHVybmluZyBmYWxzZSIpLCExO2lmKCF5bCh0aGlzLmNvbmZpZyx0aGlzLmxvZ2dlcix0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLGUuYXV0aGVudGljYXRpb25TY2hlbWUpKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiY2FuVXNlUGxhdGZvcm1Ccm9rZXI6IGlzQnJva2VyQXZhaWxhYmxlIHJldHVybmVkIGZhbHNlLCByZXR1cm5pbmcgZmFsc2UiKSwhMTtpZihlLnByb21wdClzd2l0Y2goZS5wcm9tcHQpe2Nhc2UgYi5OT05FOmNhc2UgYi5DT05TRU5UOmNhc2UgYi5MT0dJTjpjYXNlIGIuU0VMRUNUX0FDQ09VTlQ6dGhpcy5sb2dnZXIudHJhY2UoImNhblVzZVBsYXRmb3JtQnJva2VyOiBwcm9tcHQgaXMgY29tcGF0aWJsZSB3aXRoIHBsYXRmb3JtIGJyb2tlciBmbG93Iik7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoYGNhblVzZVBsYXRmb3JtQnJva2VyOiBwcm9tcHQgPSAke2UucHJvbXB0fSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHBsYXRmb3JtIGJyb2tlciBmbG93LCByZXR1cm5pbmcgZmFsc2VgKSwhMX1yZXR1cm4hKCF0JiYhdGhpcy5nZXROYXRpdmVBY2NvdW50SWQoZSkpfHwodGhpcy5sb2dnZXIudHJhY2UoImNhblVzZVBsYXRmb3JtQnJva2VyOiBuYXRpdmVBY2NvdW50SWQgaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJuaW5nIGZhbHNlIiksITEpfWdldE5hdGl2ZUFjY291bnRJZChlKXtjb25zdCB0PWUuYWNjb3VudHx8dGhpcy5nZXRBY2NvdW50KHtsb2dpbkhpbnQ6ZS5sb2dpbkhpbnQsc2lkOmUuc2lkfSl8fHRoaXMuZ2V0QWN0aXZlQWNjb3VudCgpO3JldHVybiB0JiZ0Lm5hdGl2ZUFjY291bnRJZHx8IiJ9Y3JlYXRlUG9wdXBDbGllbnQoZSl7cmV0dXJuIG5ldyBDbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLmV2ZW50SGFuZGxlcix0aGlzLm5hdmlnYXRpb25DbGllbnQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLm5hdGl2ZUludGVybmFsU3RvcmFnZSx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLGUpfWNyZWF0ZVJlZGlyZWN0Q2xpZW50KGUpe3JldHVybiBuZXcgd2wodGhpcy5jb25maWcsdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixlKX1jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQoZSl7cmV0dXJuIG5ldyBSbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLmV2ZW50SGFuZGxlcix0aGlzLm5hdmlnYXRpb25DbGllbnQsTXMuc3NvU2lsZW50LHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixlKX1jcmVhdGVTaWxlbnRDYWNoZUNsaWVudChlKXtyZXR1cm4gbmV3IHRsKHRoaXMuY29uZmlnLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubmF2aWdhdGlvbkNsaWVudCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsZSl9Y3JlYXRlU2lsZW50UmVmcmVzaENsaWVudChlKXtyZXR1cm4gbmV3IF9sKHRoaXMuY29uZmlnLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubmF2aWdhdGlvbkNsaWVudCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsZSl9Y3JlYXRlU2lsZW50QXV0aENvZGVDbGllbnQoZSl7cmV0dXJuIG5ldyBPbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLmV2ZW50SGFuZGxlcix0aGlzLm5hdmlnYXRpb25DbGllbnQsTXMuYWNxdWlyZVRva2VuQnlDb2RlLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixlKX1hZGRFdmVudENhbGxiYWNrKGUsdCl7cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLmFkZEV2ZW50Q2FsbGJhY2soZSx0KX1yZW1vdmVFdmVudENhbGxiYWNrKGUpe3RoaXMuZXZlbnRIYW5kbGVyLnJlbW92ZUV2ZW50Q2FsbGJhY2soZSl9YWRkUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtyZXR1cm4gTWEoKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl9cmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb25maWcuY2FjaGUuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZT90aGlzLmV2ZW50SGFuZGxlci5zdWJzY3JpYmVDcm9zc1RhYigpOnRoaXMubG9nZ2VyLmluZm8oIkFjY291bnQgc3RvcmFnZSBldmVudHMgYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4gY2FjaGVMb2NhdGlvbiBpcyBzZXQgdG8gbG9jYWxTdG9yYWdlIil9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb25maWcuY2FjaGUuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZT90aGlzLmV2ZW50SGFuZGxlci51bnN1YnNjcmliZUNyb3NzVGFiKCk6dGhpcy5sb2dnZXIuaW5mbygiQWNjb3VudCBzdG9yYWdlIGV2ZW50cyBhcmUgb25seSBhdmFpbGFibGUgd2hlbiBjYWNoZUxvY2F0aW9uIGlzIHNldCB0byBsb2NhbFN0b3JhZ2UiKX1nZXRUb2tlbkNhY2hlKCl7cmV0dXJuIHRoaXMudG9rZW5DYWNoZX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5sb2dnZXJ9c2V0TG9nZ2VyKGUpe3RoaXMubG9nZ2VyPWV9aW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRXcmFwcGVyTWV0YWRhdGEoZSx0KX1zZXROYXZpZ2F0aW9uQ2xpZW50KGUpe3RoaXMubmF2aWdhdGlvbkNsaWVudD1lfWdldENvbmZpZ3VyYXRpb24oKXtyZXR1cm4gdGhpcy5jb25maWd9Z2V0UGVyZm9ybWFuY2VDbGllbnQoKXtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudH1pc0Jyb3dzZXJFbnYoKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudH1nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChlKXtyZXR1cm4gZT8uY29ycmVsYXRpb25JZD9lLmNvcnJlbGF0aW9uSWQ6dGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudD9vYSgpOnQuRU1QVFlfU1RSSU5HfWFzeW5jIGxvZ2luUmVkaXJlY3QoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKGUpO3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dpblJlZGlyZWN0IGNhbGxlZCIsdCksdGhpcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCh7Y29ycmVsYXRpb25JZDp0LC4uLmV8fE5zfSl9bG9naW5Qb3B1cChlKXtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoZSk7cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImxvZ2luUG9wdXAgY2FsbGVkIix0KSx0aGlzLmFjcXVpcmVUb2tlblBvcHVwKHtjb3JyZWxhdGlvbklkOnQsLi4uZXx8TnN9KX1hc3luYyBhY3F1aXJlVG9rZW5TaWxlbnQoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKGUpLHI9dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblNpbGVudCx0KTtyLmFkZCh7Y2FjaGVMb29rdXBQb2xpY3k6ZS5jYWNoZUxvb2t1cFBvbGljeSxzY2VuYXJpb0lkOmUuc2NlbmFyaW9JZH0pLHFsKHRoaXMuaW5pdGlhbGl6ZWQscixlLmFjY291bnQpLHRoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblNpbGVudCBjYWxsZWQiLHQpO2NvbnN0IG49ZS5hY2NvdW50fHx0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtpZighbil0aHJvdyBaaShDaSk7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50RGVkdXBlZChlLG4sdCkudGhlbigobj0+KHIuZW5kKHtzdWNjZXNzOiEwLGZyb21DYWNoZTpuLmZyb21DYWNoZSxhY2Nlc3NUb2tlblNpemU6bi5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6bi5pZFRva2VuLmxlbmd0aH0sdm9pZCAwLG4uYWNjb3VudCksey4uLm4sc3RhdGU6ZS5zdGF0ZSxjb3JyZWxhdGlvbklkOnR9KSkpLmNhdGNoKChlPT57dGhyb3cgZSBpbnN0YW5jZW9mIENlJiZlLnNldENvcnJlbGF0aW9uSWQodCksci5lbmQoe3N1Y2Nlc3M6ITF9LGUsbiksZX0pKX1hc3luYyBhY3F1aXJlVG9rZW5TaWxlbnREZWR1cGVkKGUsdCxyKXtjb25zdCBuPW9vKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsey4uLmUsYXV0aG9yaXR5OmUuYXV0aG9yaXR5fHx0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eX0sdC5ob21lQWNjb3VudElkKSxvPUpTT04uc3RyaW5naWZ5KG4pLGk9dGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzLmdldChvKTtpZih2b2lkIDA9PT1pKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgc3RvcmluZyBhY3RpdmUgcmVxdWVzdCIsciksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe2RlZHVwZWQ6ITF9LHIpO2NvbnN0IG49VW4odGhpcy5hY3F1aXJlVG9rZW5TaWxlbnRBc3luYy5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQscikoey4uLmUsY29ycmVsYXRpb25JZDpyfSx0KTtyZXR1cm4gdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzLnNldChvLG4pLG4uZmluYWxseSgoKCk9Pnt0aGlzLmFjdGl2ZVNpbGVudFRva2VuUmVxdWVzdHMuZGVsZXRlKG8pfSkpfXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgaGFzIGJlZW4gY2FsbGVkIHByZXZpb3VzbHksIHJldHVybmluZyB0aGUgcmVzdWx0IGZyb20gdGhlIGZpcnN0IGNhbGwiLHIpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtkZWR1cGVkOiEwfSxyKSxpfWFzeW5jIGFjcXVpcmVUb2tlblNpbGVudEFzeW5jKHQscil7Y29uc3Qgbj0oKT0+dGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5KHQuY29ycmVsYXRpb25JZCk7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLHQuY29ycmVsYXRpb25JZCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LHQpLHQuY29ycmVsYXRpb25JZCYmdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe3Zpc2liaWxpdHlDaGFuZ2VDb3VudDowfSx0LmNvcnJlbGF0aW9uSWQpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG4pO2NvbnN0IG89YXdhaXQgVW4oR2MsT3IuSW5pdGlhbGl6ZVNpbGVudFJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0LmNvcnJlbGF0aW9uSWQpKHQscix0aGlzLmNvbmZpZyx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyKSxpPXQuY2FjaGVMb29rdXBQb2xpY3l8fERzLkRlZmF1bHQ7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50Tm9JZnJhbWUobyxpKS5jYXRjaCgoYXN5bmMgZT0+e2NvbnN0IHQ9ZnVuY3Rpb24oZSx0KXtjb25zdCByPSEoZSBpbnN0YW5jZW9mIEFvJiZlLnN1YkVycm9yIT09eW8pLG49ZS5lcnJvckNvZGU9PT1lc3x8ZS5lcnJvckNvZGU9PT1YZSxvPXImJm58fGUuZXJyb3JDb2RlPT09bG98fGUuZXJyb3JDb2RlPT09dW8saT1Icy5pbmNsdWRlcyh0KTtyZXR1cm4gbyYmaX0oZSxpKTtpZih0KXtpZih0aGlzLmFjdGl2ZUlmcmFtZVJlcXVlc3Qpe2lmKGkhPT1Ecy5Ta2lwKXtjb25zdFt0LHJdPXRoaXMuYWN0aXZlSWZyYW1lUmVxdWVzdDt0aGlzLmxvZ2dlci52ZXJib3NlKGBJZnJhbWUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBhd2FpdGluZyByZXNvbHV0aW9uIGZvciByZXF1ZXN0IHdpdGggY29ycmVsYXRpb25JZDogJHtyfWAsby5jb3JyZWxhdGlvbklkKTtjb25zdCBuPXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5Bd2FpdENvbmN1cnJlbnRJZnJhbWUsby5jb3JyZWxhdGlvbklkKTtuLmFkZCh7YXdhaXRJZnJhbWVDb3JyZWxhdGlvbklkOnJ9KTtjb25zdCBzPWF3YWl0IHQ7aWYobi5lbmQoe3N1Y2Nlc3M6c30pLHMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoYFBhcmFsbGVsIGlmcmFtZSByZXF1ZXN0IHdpdGggY29ycmVsYXRpb25JZDogJHtyfSBzdWNjZWVkZWQuIFJldHJ5aW5nIGNhY2hlIGFuZC9vciBSVCByZWRlbXB0aW9uYCxvLmNvcnJlbGF0aW9uSWQpLHRoaXMuYWNxdWlyZVRva2VuU2lsZW50Tm9JZnJhbWUobyxpKTt0aHJvdyB0aGlzLmxvZ2dlci5pbmZvKGBJZnJhbWUgcmVxdWVzdCB3aXRoIGNvcnJlbGF0aW9uSWQ6ICR7cn0gZmFpbGVkLiBJbnRlcmFjdGlvbiBpcyByZXF1aXJlZC5gKSxlfXJldHVybiB0aGlzLmxvZ2dlci53YXJuaW5nKCJBbm90aGVyIGlmcmFtZSByZXF1ZXN0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyBhbmQgQ2FjaGVMb29rdXBQb2xpY3kgaXMgc2V0IHRvIFNraXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBkZWdyYWRlZCBwZXJmb3JtYW5jZSBhbmQvb3IgcmVsaWFiaWxpdHkgZm9yIGJvdGggY2FsbHMuIFBsZWFzZSBjb25zaWRlciBjaGFuZ2luZyB0aGUgQ2FjaGVMb29rdXBQb2xpY3kgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgcmVxdWVzdCBxdWV1aW5nIGFuZCB0b2tlbiBjYWNoZS4iLG8uY29ycmVsYXRpb25JZCksVW4odGhpcy5hY3F1aXJlVG9rZW5CeVNpbGVudElmcmFtZS5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsby5jb3JyZWxhdGlvbklkKShvKX17bGV0IGU7cmV0dXJuIHRoaXMuYWN0aXZlSWZyYW1lUmVxdWVzdD1bbmV3IFByb21pc2UoKHQ9PntlPXR9KSksby5jb3JyZWxhdGlvbklkXSx0aGlzLmxvZ2dlci52ZXJib3NlKCJSZWZyZXNoIHRva2VuIGV4cGlyZWQvaW52YWxpZCBvciBDYWNoZUxvb2t1cFBvbGljeSBpcyBzZXQgdG8gU2tpcCwgYXR0ZW1wdGluZyBhY3F1aXJlIHRva2VuIGJ5IGlmcmFtZS4iLG8uY29ycmVsYXRpb25JZCksVW4odGhpcy5hY3F1aXJlVG9rZW5CeVNpbGVudElmcmFtZS5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsby5jb3JyZWxhdGlvbklkKShvKS50aGVuKCh0PT4oZSghMCksdCkpKS5jYXRjaCgodD0+e3Rocm93IGUoITEpLHR9KSkuZmluYWxseSgoKCk9Pnt0aGlzLmFjdGl2ZUlmcmFtZVJlcXVlc3Q9dm9pZCAwfSkpfX10aHJvdyBlfSkpLnRoZW4oKHI9Pih0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxyKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7ZnJvbUNhY2hlOnIuZnJvbUNhY2hlfSx0LmNvcnJlbGF0aW9uSWQpLHIpKSkuY2F0Y2goKHQ9Pnt0aHJvdyB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxudWxsLHQpLHR9KSkuZmluYWxseSgoKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKX0pKX1hc3luYyBhY3F1aXJlVG9rZW5TaWxlbnROb0lmcmFtZSh0LHIpe3JldHVybiB5bCh0aGlzLmNvbmZpZyx0aGlzLmxvZ2dlcix0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLHQuYXV0aGVudGljYXRpb25TY2hlbWUpJiZ0LmFjY291bnQubmF0aXZlQWNjb3VudElkPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgLSBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgdG9rZW4gZnJvbSBuYXRpdmUgcGxhdGZvcm0iKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7aXNQbGF0Zm9ybUJyb2tlclJlcXVlc3Q6ITB9LHQuY29ycmVsYXRpb25JZCksdGhpcy5hY3F1aXJlVG9rZW5OYXRpdmUodCxNcy5hY3F1aXJlVG9rZW5TaWxlbnRfc2lsZW50Rmxvdyx0LmFjY291bnQubmF0aXZlQWNjb3VudElkLHIpLmNhdGNoKChhc3luYyBlPT57aWYodGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe2Jyb2tlckVycm9yTmFtZTplLm5hbWUsYnJva2VyRXJyb3JDb2RlOmUuZXJyb3JDb2RlfSx0LmNvcnJlbGF0aW9uSWQpLGUgaW5zdGFuY2VvZiBYYyYmWmMoZSkpdGhyb3cgdGhpcy5sb2dnZXIudmVyYm9zZSgiYWNxdWlyZVRva2VuU2lsZW50IC0gbmF0aXZlIHBsYXRmb3JtIHVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gd2ViIGZsb3ciKSx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyPXZvaWQgMCxtdChYZSk7dGhyb3cgZX0pKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblNpbGVudCAtIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSB0b2tlbiBmcm9tIHdlYiBmbG93Iikscj09PURzLkFjY2Vzc1Rva2VuJiZ0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgLSBjYWNoZSBsb29rdXAgcG9saWN5IHNldCB0byBBY2Nlc3NUb2tlbiwgYXR0ZW1wdGluZyB0byBhY3F1aXJlIHRva2VuIGZyb20gbG9jYWwgY2FjaGUiKSxVbih0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZS5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlbkZyb21DYWNoZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkodCxyKS5jYXRjaCgobj0+e2lmKHI9PT1Ecy5BY2Nlc3NUb2tlbil0aHJvdyBuO3JldHVybiB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9ORVRXT1JLX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCx0KSxVbih0aGlzLmFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLmJpbmQodGhpcyksT3IuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0LmNvcnJlbGF0aW9uSWQpKHQscil9KSkpfWFzeW5jIHByZUdlbmVyYXRlUGtjZUNvZGVzKGUpe3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJHZW5lcmF0aW5nIG5ldyBQS0NFIGNvZGVzIiksdGhpcy5wa2NlQ29kZT1hd2FpdCBVbihkbCxPci5HZW5lcmF0ZVBrY2VDb2Rlcyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5sb2dnZXIsZSksUHJvbWlzZS5yZXNvbHZlKCl9Z2V0UHJlR2VuZXJhdGVkUGtjZUNvZGVzKGUpe3RoaXMubG9nZ2VyLnZlcmJvc2UoIkF0dGVtcHRpbmcgdG8gcGljayB1cCBwcmUtZ2VuZXJhdGVkIFBLQ0UgY29kZXMiKTtjb25zdCB0PXRoaXMucGtjZUNvZGU/ey4uLnRoaXMucGtjZUNvZGV9OnZvaWQgMDtyZXR1cm4gdGhpcy5wa2NlQ29kZT12b2lkIDAsdGhpcy5sb2dnZXIudmVyYm9zZSgodD8iRm91bmQiOiJEaWQgbm90IGZpbmQiKSsiIHByZS1nZW5lcmF0ZWQgUEtDRSBjb2RlcyIpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHt1c2VQcmVHZW5lcmF0ZWRQa2NlOiEhdH0sZSksdH1sb2dNdWx0aXBsZUluc3RhbmNlcyhlKXtjb25zdCB0PXRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQ7aWYoIXdpbmRvdylyZXR1cm47d2luZG93Lm1zYWw9d2luZG93Lm1zYWx8fHt9LHdpbmRvdy5tc2FsLmNsaWVudElkcz13aW5kb3cubXNhbC5jbGllbnRJZHN8fFtdO3dpbmRvdy5tc2FsLmNsaWVudElkcy5sZW5ndGg+MCYmdGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlcmUgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSBvZiBNU0FMLmpzIGluIHRoZSB3aW5kb3cuIiksd2luZG93Lm1zYWwuY2xpZW50SWRzLnB1c2godCksZnVuY3Rpb24oZSx0LHIpe2NvbnN0IG49d2luZG93Lm1zYWw/LmNsaWVudElkc3x8W10sbz1uLmxlbmd0aCxpPW4uZmlsdGVyKCh0PT50PT09ZSkpLmxlbmd0aDtpPjEmJnIud2FybmluZygiVGhlcmUgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSBvZiBNU0FMLmpzIGluIHRoZSB3aW5kb3cgd2l0aCB0aGUgc2FtZSBjbGllbnQgaWQuIiksdC5hZGQoe21zYWxJbnN0YW5jZUNvdW50Om8sc2FtZUNsaWVudElkSW5zdGFuY2VDb3VudDppfSl9KHQsZSx0aGlzLmxvZ2dlcil9fWNsYXNzIFVse2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuY2xpZW50SWQ9ZSx0aGlzLmNsaWVudENhcGFiaWxpdGllcz10LHRoaXMuY3J5cHRvPXIsdGhpcy5sb2dnZXI9bn10b05hYVRva2VuUmVxdWVzdChlKXtsZXQgdDt0PXZvaWQgMD09PWUuZXh0cmFRdWVyeVBhcmFtZXRlcnM/bmV3IE1hcDpuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGUuZXh0cmFRdWVyeVBhcmFtZXRlcnMpKTtjb25zdCByPWUuY29ycmVsYXRpb25JZHx8dGhpcy5jcnlwdG8uY3JlYXRlTmV3R3VpZCgpLG49Um4oZS5jbGFpbXMsdGhpcy5jbGllbnRDYXBhYmlsaXRpZXMpLG89ZS5zY29wZXN8fGg7cmV0dXJue3BsYXRmb3JtQnJva2VySWQ6ZS5hY2NvdW50Py5ob21lQWNjb3VudElkLGNsaWVudElkOnRoaXMuY2xpZW50SWQsYXV0aG9yaXR5OmUuYXV0aG9yaXR5LHNjb3BlOm8uam9pbigiICIpLGNvcnJlbGF0aW9uSWQ6cixjbGFpbXM6WXQuaXNFbXB0eU9iaihuKT92b2lkIDA6bixzdGF0ZTplLnN0YXRlLGF1dGhlbnRpY2F0aW9uU2NoZW1lOmUuYXV0aGVudGljYXRpb25TY2hlbWV8fFcuQkVBUkVSLGV4dHJhUGFyYW1ldGVyczp0fX1mcm9tTmFhVG9rZW5SZXNwb25zZShlLHQscil7aWYoIXQudG9rZW4uaWRfdG9rZW58fCF0LnRva2VuLmFjY2Vzc190b2tlbil0aHJvdyBtdChBZSk7Y29uc3Qgbj14bihyKyh0LnRva2VuLmV4cGlyZXNfaW58fDApKSxvPWRyKHQudG9rZW4uaWRfdG9rZW4sdGhpcy5jcnlwdG8uYmFzZTY0RGVjb2RlKSxpPXRoaXMuZnJvbU5hYUFjY291bnRJbmZvKHQuYWNjb3VudCx0LnRva2VuLmlkX3Rva2VuLG8pLHM9dC50b2tlbi5zY29wZXx8ZS5zY29wZTtyZXR1cm57YXV0aG9yaXR5OnQudG9rZW4uYXV0aG9yaXR5fHxpLmVudmlyb25tZW50LHVuaXF1ZUlkOmkubG9jYWxBY2NvdW50SWQsdGVuYW50SWQ6aS50ZW5hbnRJZCxzY29wZXM6cy5zcGxpdCgiICIpLGFjY291bnQ6aSxpZFRva2VuOnQudG9rZW4uaWRfdG9rZW4saWRUb2tlbkNsYWltczpvLGFjY2Vzc1Rva2VuOnQudG9rZW4uYWNjZXNzX3Rva2VuLGZyb21DYWNoZTohMSxleHBpcmVzT246bix0b2tlblR5cGU6ZS5hdXRoZW50aWNhdGlvblNjaGVtZXx8Vy5CRUFSRVIsY29ycmVsYXRpb25JZDplLmNvcnJlbGF0aW9uSWQsZXh0RXhwaXJlc09uOm4sc3RhdGU6ZS5zdGF0ZX19ZnJvbU5hYUFjY291bnRJbmZvKGUsdCxyKXtjb25zdCBuPXJ8fGUuaWRUb2tlbkNsYWltcyxvPWUubG9jYWxBY2NvdW50SWR8fG4/Lm9pZHx8bj8uc3VifHwiIixpPWUudGVuYW50SWR8fG4/LnRpZHx8IiIscz1lLmhvbWVBY2NvdW50SWR8fGAke299LiR7aX1gLGE9ZS51c2VybmFtZXx8bj8ucHJlZmVycmVkX3VzZXJuYW1lfHwiIixjPWUubmFtZXx8bj8ubmFtZSxsPWUubG9naW5IaW50fHxuPy5sb2dpbl9oaW50LGg9bmV3IE1hcCxkPXJyKHMsbyxpLG4pO2guc2V0KGksZCk7cmV0dXJue2hvbWVBY2NvdW50SWQ6cyxlbnZpcm9ubWVudDplLmVudmlyb25tZW50LHRlbmFudElkOmksdXNlcm5hbWU6YSxsb2NhbEFjY291bnRJZDpvLG5hbWU6Yyxsb2dpbkhpbnQ6bCxpZFRva2VuOnQsaWRUb2tlbkNsYWltczpuLHRlbmFudFByb2ZpbGVzOmh9fWZyb21CcmlkZ2VFcnJvcihlKXtpZighZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUuc3RhdHVzfShlKSlyZXR1cm4gbmV3IENlKCJ1bmtub3duX2Vycm9yIiwiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCIpO3N3aXRjaChlLnN0YXR1cyl7Y2FzZSBvYzpyZXR1cm4gbmV3IHB0KHN0KTtjYXNlIGljOnJldHVybiBuZXcgcHQoaXQpO2Nhc2UgbGM6cmV0dXJuIG5ldyBwdChqZSk7Y2FzZSBjYzpyZXR1cm4gbmV3IHB0KGx0KTtjYXNlIGhjOnJldHVybiBuZXcgcHQoZS5jb2RlfHxsdCxlLmRlc2NyaXB0aW9uKTtjYXNlIHNjOmNhc2UgYWM6cmV0dXJuIG5ldyBubyhlLmNvZGUsZS5kZXNjcmlwdGlvbik7Y2FzZSBuYzpyZXR1cm4gbmV3IEFvKGUuY29kZSxlLmRlc2NyaXB0aW9uKTtkZWZhdWx0OnJldHVybiBuZXcgQ2UoZS5jb2RlLGUuZGVzY3JpcHRpb24pfX10b0F1dGhlbnRpY2F0aW9uUmVzdWx0RnJvbUNhY2hlKGUsdCxyLG4sbyl7aWYoIXR8fCFyKXRocm93IG10KEFlKTtjb25zdCBpPWRyKHQuc2VjcmV0LHRoaXMuY3J5cHRvLmJhc2U2NERlY29kZSkscz1yLnRhcmdldHx8bi5zY29wZXMuam9pbigiICIpO3JldHVybnthdXRob3JpdHk6ci5lbnZpcm9ubWVudHx8ZS5lbnZpcm9ubWVudCx1bmlxdWVJZDplLmxvY2FsQWNjb3VudElkLHRlbmFudElkOmUudGVuYW50SWQsc2NvcGVzOnMuc3BsaXQoIiAiKSxhY2NvdW50OmUsaWRUb2tlbjp0LnNlY3JldCxpZFRva2VuQ2xhaW1zOml8fHt9LGFjY2Vzc1Rva2VuOnIuc2VjcmV0LGZyb21DYWNoZTohMCxleHBpcmVzT246eG4oci5leHBpcmVzT24pLGV4dEV4cGlyZXNPbjp4bihyLmV4dGVuZGVkRXhwaXJlc09uKSx0b2tlblR5cGU6bi5hdXRoZW50aWNhdGlvblNjaGVtZXx8Vy5CRUFSRVIsY29ycmVsYXRpb25JZDpvLHN0YXRlOm4uc3RhdGV9fX1jb25zdCBMbD17Y29kZToidW5zdXBwb3J0ZWRfbWV0aG9kIixkZXNjOiJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIG5lc3RlZCBhcHAgZW52aXJvbm1lbnQuIn07Y2xhc3MgRGwgZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsRGwucHJvdG90eXBlKSx0aGlzLm5hbWU9Ik5lc3RlZEFwcEF1dGhFcnJvciJ9c3RhdGljIGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKXtyZXR1cm4gbmV3IERsKExsLmNvZGUsTGwuZGVzYyl9fWNsYXNzIEhse2NvbnN0cnVjdG9yKGUpe3RoaXMub3BlcmF0aW5nQ29udGV4dD1lO2NvbnN0IHQ9dGhpcy5vcGVyYXRpbmdDb250ZXh0LmdldEJyaWRnZVByb3h5KCk7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQ6IGJyaWRnZVByb3h5IGlzIHVuZGVmaW5lZCIpO3RoaXMuYnJpZGdlUHJveHk9dCx0aGlzLmNvbmZpZz1lLmdldENvbmZpZygpLHRoaXMubG9nZ2VyPXRoaXMub3BlcmF0aW5nQ29udGV4dC5nZXRMb2dnZXIoKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXRoaXMuY29uZmlnLnRlbGVtZXRyeS5jbGllbnQsdGhpcy5icm93c2VyQ3J5cHRvPWUuaXNCcm93c2VyRW52aXJvbm1lbnQoKT9uZXcgeWModGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwhMCk6ZnQsdGhpcy5ldmVudEhhbmRsZXI9bmV3IEZjKHRoaXMubG9nZ2VyKSx0aGlzLmJyb3dzZXJTdG9yYWdlPXRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpP25ldyBNYyh0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLHRoaXMuY29uZmlnLmNhY2hlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyLHRvKHRoaXMuY29uZmlnLmF1dGgpKTpxYyh0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5ldmVudEhhbmRsZXIpLHRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXI9bmV3IFVsKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsdGhpcy5jb25maWcuYXV0aC5jbGllbnRDYXBhYmlsaXRpZXMsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyKTtjb25zdCByPXRoaXMuYnJpZGdlUHJveHkuZ2V0QWNjb3VudENvbnRleHQoKTt0aGlzLmN1cnJlbnRBY2NvdW50Q29udGV4dD1yfHxudWxsfXN0YXRpYyBhc3luYyBjcmVhdGVDb250cm9sbGVyKGUpe2NvbnN0IHQ9bmV3IEhsKGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9YXN5bmMgaW5pdGlhbGl6ZShlLHQpe2NvbnN0IHI9ZT8uY29ycmVsYXRpb25JZHx8b2EoKTtyZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyU3RvcmFnZS5pbml0aWFsaXplKHIpLFByb21pc2UucmVzb2x2ZSgpfWVuc3VyZVZhbGlkUmVxdWVzdChlKXtyZXR1cm4gZT8uY29ycmVsYXRpb25JZD9lOnsuLi5lLGNvcnJlbGF0aW9uSWQ6dGhpcy5icm93c2VyQ3J5cHRvLmNyZWF0ZU5ld0d1aWQoKX19YXN5bmMgYWNxdWlyZVRva2VuSW50ZXJhY3RpdmUodCl7Y29uc3Qgcj10aGlzLmVuc3VyZVZhbGlkUmVxdWVzdCh0KTt0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCxyKTtjb25zdCBuPXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5BY3F1aXJlVG9rZW5Qb3B1cCxyLmNvcnJlbGF0aW9uSWQpO24uYWRkKHtuZXN0ZWRBcHBBdXRoUmVxdWVzdDohMH0pO3RyeXtjb25zdCBvPXRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIudG9OYWFUb2tlblJlcXVlc3QociksaT1EbigpLHM9YXdhaXQgdGhpcy5icmlkZ2VQcm94eS5nZXRUb2tlbkludGVyYWN0aXZlKG8pLGE9ey4uLnRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIuZnJvbU5hYVRva2VuUmVzcG9uc2UobyxzLGkpfTt0cnl7YXdhaXQgdGhpcy5oeWRyYXRlQ2FjaGUoYSx0KX1jYXRjaChlKXt0aGlzLmxvZ2dlci53YXJuaW5nUGlpKGBGYWlsZWQgdG8gaHlkcmF0ZSBjYWNoZS4gRXJyb3I6ICR7ZX1gLHIuY29ycmVsYXRpb25JZCl9cmV0dXJuIHRoaXMuY3VycmVudEFjY291bnRDb250ZXh0PXtob21lQWNjb3VudElkOmEuYWNjb3VudC5ob21lQWNjb3VudElkLGVudmlyb25tZW50OmEuYWNjb3VudC5lbnZpcm9ubWVudCx0ZW5hbnRJZDphLmFjY291bnQudGVuYW50SWR9LHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsYSksbi5hZGQoe2FjY2Vzc1Rva2VuU2l6ZTphLmFjY2Vzc1Rva2VuLmxlbmd0aCxpZFRva2VuU2l6ZTphLmlkVG9rZW4ubGVuZ3RofSksbi5lbmQoe3N1Y2Nlc3M6ITAscmVxdWVzdElkOmEucmVxdWVzdElkfSx2b2lkIDAsYS5hY2NvdW50KSxhfWNhdGNoKHIpe2NvbnN0IG89ciBpbnN0YW5jZW9mIENlP3I6dGhpcy5uZXN0ZWRBcHBBdXRoQWRhcHRlci5mcm9tQnJpZGdlRXJyb3Iocik7dGhyb3cgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCxudWxsLHIpLG4uZW5kKHtzdWNjZXNzOiExfSxyLHQuYWNjb3VudCksb319YXN5bmMgYWNxdWlyZVRva2VuU2lsZW50SW50ZXJuYWwodCl7Y29uc3Qgcj10aGlzLmVuc3VyZVZhbGlkUmVxdWVzdCh0KTt0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQscik7Y29uc3Qgbj1hd2FpdCB0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZShyKTtpZihuKXJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxuKSxuO2NvbnN0IG89dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLlNzb1NpbGVudCxyLmNvcnJlbGF0aW9uSWQpO28uaW5jcmVtZW50KHt2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6MH0pLG8uYWRkKHtuZXN0ZWRBcHBBdXRoUmVxdWVzdDohMH0pO3RyeXtjb25zdCBuPXRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIudG9OYWFUb2tlblJlcXVlc3Qocik7bi5mb3JjZVJlZnJlc2g9ci5mb3JjZVJlZnJlc2g7Y29uc3QgaT1EbigpLHM9YXdhaXQgdGhpcy5icmlkZ2VQcm94eS5nZXRUb2tlblNpbGVudChuKSxhPXRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIuZnJvbU5hYVRva2VuUmVzcG9uc2UobixzLGkpO3RyeXthd2FpdCB0aGlzLmh5ZHJhdGVDYWNoZShhLHQpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLndhcm5pbmdQaWkoYEZhaWxlZCB0byBoeWRyYXRlIGNhY2hlLiBFcnJvcjogJHtlfWAsci5jb3JyZWxhdGlvbklkKX1yZXR1cm4gdGhpcy5jdXJyZW50QWNjb3VudENvbnRleHQ9e2hvbWVBY2NvdW50SWQ6YS5hY2NvdW50LmhvbWVBY2NvdW50SWQsZW52aXJvbm1lbnQ6YS5hY2NvdW50LmVudmlyb25tZW50LHRlbmFudElkOmEuYWNjb3VudC50ZW5hbnRJZH0sdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUyxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQsYSksbz8uYWRkKHthY2Nlc3NUb2tlblNpemU6YS5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6YS5pZFRva2VuLmxlbmd0aH0pLG8/LmVuZCh7c3VjY2VzczohMCxyZXF1ZXN0SWQ6YS5yZXF1ZXN0SWR9LHZvaWQgMCxhLmFjY291bnQpLGF9Y2F0Y2gocil7Y29uc3Qgbj1yIGluc3RhbmNlb2YgQ2U/cjp0aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyLmZyb21CcmlkZ2VFcnJvcihyKTt0aHJvdyB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxudWxsLHIpLG8/LmVuZCh7c3VjY2VzczohMX0scix0LmFjY291bnQpLG59fWFzeW5jIGFjcXVpcmVUb2tlbkZyb21DYWNoZSh0KXtjb25zdCByPXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5BY3F1aXJlVG9rZW5TaWxlbnQsdC5jb3JyZWxhdGlvbklkKTtpZihyPy5hZGQoe25lc3RlZEFwcEF1dGhSZXF1ZXN0OiEwfSksdC5jbGFpbXMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIkNsYWltcyBhcmUgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCwgc2tpcHBpbmcgY2FjaGUgbG9va3VwIiksbnVsbDtpZih0LmZvcmNlUmVmcmVzaClyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiZm9yY2VSZWZyZXNoIGlzIHNldCB0byB0cnVlLCBza2lwcGluZyBjYWNoZSBsb29rdXAiKSxudWxsO2xldCBuPW51bGw7c3dpdGNoKHQuY2FjaGVMb29rdXBQb2xpY3l8fCh0LmNhY2hlTG9va3VwUG9saWN5PURzLkRlZmF1bHQpLHQuY2FjaGVMb29rdXBQb2xpY3kpe2Nhc2UgRHMuRGVmYXVsdDpjYXNlIERzLkFjY2Vzc1Rva2VuOmNhc2UgRHMuQWNjZXNzVG9rZW5BbmRSZWZyZXNoVG9rZW46bj1hd2FpdCB0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZUludGVybmFsKHQpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9cmV0dXJuIG4/KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG4pLHIuYWRkKHthY2Nlc3NUb2tlblNpemU6bi5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6bi5pZFRva2VuLmxlbmd0aH0pLHIuZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsbi5hY2NvdW50KSxuKToodGhpcy5sb2dnZXIud2FybmluZygiQ2FjaGVkIHRva2VucyBhcmUgbm90IGZvdW5kIGZvciB0aGUgYWNjb3VudCwgcHJvY2VlZGluZyB3aXRoIHNpbGVudCB0b2tlbiByZXF1ZXN0LiIpLHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG51bGwpLHIuZW5kKHtzdWNjZXNzOiExfSx2b2lkIDAsdC5hY2NvdW50KSxudWxsKX1hc3luYyBhY3F1aXJlVG9rZW5Gcm9tQ2FjaGVJbnRlcm5hbChlKXtjb25zdCB0PXRoaXMuYnJpZGdlUHJveHkuZ2V0QWNjb3VudENvbnRleHQoKXx8dGhpcy5jdXJyZW50QWNjb3VudENvbnRleHQ7bGV0IHI9bnVsbDtjb25zdCBuPWUuY29ycmVsYXRpb25JZHx8dGhpcy5icm93c2VyQ3J5cHRvLmNyZWF0ZU5ld0d1aWQoKTtpZih0JiYocj1VYyh0LHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsbikpLCFyKXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJObyBhY3RpdmUgYWNjb3VudCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHRoZSBob3N0IiksUHJvbWlzZS5yZXNvbHZlKG51bGwpO3RoaXMubG9nZ2VyLnZlcmJvc2UoImFjdGl2ZSBhY2NvdW50IGZvdW5kLCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgdG9rZW4gc2lsZW50bHkiKTtjb25zdCBvPXsuLi5lLGNvcnJlbGF0aW9uSWQ6ZS5jb3JyZWxhdGlvbklkfHx0aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpLGF1dGhvcml0eTplLmF1dGhvcml0eXx8ci5lbnZpcm9ubWVudCxzY29wZXM6ZS5zY29wZXM/Lmxlbmd0aD9lLnNjb3BlczpbLi4uaF19LGk9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRUb2tlbktleXMoKSxzPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0QWNjZXNzVG9rZW4ocixvLGksci50ZW5hbnRJZCk7aWYoIXMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIk5vIGNhY2hlZCBhY2Nlc3MgdG9rZW4gZm91bmQiKSxQcm9taXNlLnJlc29sdmUobnVsbCk7aWYoem4ocy5jYWNoZWRBdCl8fEJuKHMuZXhwaXJlc09uLHRoaXMuY29uZmlnLnN5c3RlbS50b2tlblJlbmV3YWxPZmZzZXRTZWNvbmRzKSlyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiQ2FjaGVkIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZCIpLFByb21pc2UucmVzb2x2ZShudWxsKTtjb25zdCBhPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SWRUb2tlbihyLG8uY29ycmVsYXRpb25JZCxpLHIudGVuYW50SWQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7cmV0dXJuIGE/dGhpcy5uZXN0ZWRBcHBBdXRoQWRhcHRlci50b0F1dGhlbnRpY2F0aW9uUmVzdWx0RnJvbUNhY2hlKHIsYSxzLG8sby5jb3JyZWxhdGlvbklkKToodGhpcy5sb2dnZXIudmVyYm9zZSgiTm8gY2FjaGVkIGlkIHRva2VuIGZvdW5kIiksUHJvbWlzZS5yZXNvbHZlKG51bGwpKX1hc3luYyBhY3F1aXJlVG9rZW5Qb3B1cChlKXtyZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW5JbnRlcmFjdGl2ZShlKX1hY3F1aXJlVG9rZW5SZWRpcmVjdChlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YXN5bmMgYWNxdWlyZVRva2VuU2lsZW50KGUpe3JldHVybiB0aGlzLmFjcXVpcmVUb2tlblNpbGVudEludGVybmFsKGUpfWFjcXVpcmVUb2tlbkJ5Q29kZShlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YWNxdWlyZVRva2VuTmF0aXZlKGUsdCxyKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4oZSx0KXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmV2ZW50SGFuZGxlci5hZGRFdmVudENhbGxiYWNrKGUsdCl9cmVtb3ZlRXZlbnRDYWxsYmFjayhlKXt0aGlzLmV2ZW50SGFuZGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGUpfWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpe3Rocm93IERsLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKX1nZXRBbGxBY2NvdW50cyhlKXtjb25zdCB0PXRoaXMuYnJvd3NlckNyeXB0by5jcmVhdGVOZXdHdWlkKCk7cmV0dXJuIE5jKHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5pc0Jyb3dzZXJFbnYoKSx0LGUpfWdldEFjY291bnQoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBVYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWNjb3VudEJ5VXNlcm5hbWUoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBMYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWNjb3VudEJ5SG9tZUlkKGUpe2NvbnN0IHQ9dGhpcy5icm93c2VyQ3J5cHRvLmNyZWF0ZU5ld0d1aWQoKTtyZXR1cm4gRGMoZSx0aGlzLmxvZ2dlcix0aGlzLmJyb3dzZXJTdG9yYWdlLHQpfWdldEFjY291bnRCeUxvY2FsSWQoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBIYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9c2V0QWN0aXZlQWNjb3VudChlKXtjb25zdCB0PXRoaXMuYnJvd3NlckNyeXB0by5jcmVhdGVOZXdHdWlkKCk7cmV0dXJuIHhjKGUsdGhpcy5icm93c2VyU3RvcmFnZSx0KX1nZXRBY3RpdmVBY2NvdW50KCl7Y29uc3QgZT10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBCYyh0aGlzLmJyb3dzZXJTdG9yYWdlLGUpfWhhbmRsZVJlZGlyZWN0UHJvbWlzZShlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpfWxvZ2luUG9wdXAoZSl7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuSW50ZXJhY3RpdmUoZXx8TnMpfWxvZ2luUmVkaXJlY3QoZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWxvZ291dChlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9bG9nb3V0UmVkaXJlY3QoZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWxvZ291dFBvcHVwKGUpe3Rocm93IERsLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKX1zc29TaWxlbnQoZSl7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50SW50ZXJuYWwoZSl9Z2V0VG9rZW5DYWNoZSgpe3Rocm93IERsLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5sb2dnZXJ9c2V0TG9nZ2VyKGUpe3RoaXMubG9nZ2VyPWV9aW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl7fXNldE5hdmlnYXRpb25DbGllbnQoZSl7dGhpcy5sb2dnZXIud2FybmluZygic2V0TmF2aWdhdGlvbkNsaWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIG5lc3RlZCBhcHAgYXV0aCIpfWdldENvbmZpZ3VyYXRpb24oKXtyZXR1cm4gdGhpcy5jb25maWd9aXNCcm93c2VyRW52KCl7cmV0dXJuIHRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpfWdldEJyb3dzZXJDcnlwdG8oKXtyZXR1cm4gdGhpcy5icm93c2VyQ3J5cHRvfWdldFBlcmZvcm1hbmNlQ2xpZW50KCl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWdldFJlZGlyZWN0UmVzcG9uc2UoKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YXN5bmMgY2xlYXJDYWNoZShlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiaHlkcmF0ZUNhY2hlIGNhbGxlZCIpO2NvbnN0IHI9aHIuY3JlYXRlRnJvbUFjY291bnRJbmZvKGUuYWNjb3VudCxlLmNsb3VkR3JhcGhIb3N0TmFtZSxlLm1zR3JhcGhIb3N0KTtyZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRBY2NvdW50KHIsZS5jb3JyZWxhdGlvbklkLHVyKGUuaWRUb2tlbkNsYWltcykpLHRoaXMuYnJvd3NlclN0b3JhZ2UuaHlkcmF0ZUNhY2hlKGUsdCl9fWFzeW5jIGZ1bmN0aW9uIHhsKGUpe2NvbnN0IHQ9bmV3IGdjKGUpLHI9bmV3IHVjKGUpLG49W3QuaW5pdGlhbGl6ZSgpLHIuaW5pdGlhbGl6ZSgpXTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobiksci5pc0F2YWlsYWJsZSgpJiZlLmF1dGguc3VwcG9ydHNOZXN0ZWRBcHBBdXRoP0hsLmNyZWF0ZUNvbnRyb2xsZXIocik6dC5pc0F2YWlsYWJsZSgpP05sLmNyZWF0ZUNvbnRyb2xsZXIodCk6bnVsbH1jbGFzcyBCbHtzdGF0aWMgYXN5bmMgY3JlYXRlUHVibGljQ2xpZW50QXBwbGljYXRpb24oZSl7Y29uc3QgdD1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQpe2NvbnN0IHI9bmV3IGdjKGUpO3JldHVybiBhd2FpdCByLmluaXRpYWxpemUoKSxObC5jcmVhdGVDb250cm9sbGVyKHIsdCl9KGUpO3JldHVybiBuZXcgQmwoZSx0KX1jb25zdHJ1Y3RvcihlLHQpe3RoaXMuaXNCcm9rZXI9ITEsdGhpcy5jb250cm9sbGVyPXR8fG5ldyBObChuZXcgZ2MoZSkpfWFzeW5jIGluaXRpYWxpemUoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5pbml0aWFsaXplKGUsdGhpcy5pc0Jyb2tlcil9YXN5bmMgYWNxdWlyZVRva2VuUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5Qb3B1cChlKX1hY3F1aXJlVG9rZW5SZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblJlZGlyZWN0KGUpfWFjcXVpcmVUb2tlblNpbGVudChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblNpbGVudChlKX1hY3F1aXJlVG9rZW5CeUNvZGUoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5CeUNvZGUoZSl9YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuYWRkRXZlbnRDYWxsYmFjayhlLHQpfXJlbW92ZUV2ZW50Q2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGUpfWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpfWdldEFjY291bnQoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY2NvdW50KGUpfWdldEFjY291bnRCeUhvbWVJZChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeUhvbWVJZChlKX1nZXRBY2NvdW50QnlMb2NhbElkKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjb3VudEJ5TG9jYWxJZChlKX1nZXRBY2NvdW50QnlVc2VybmFtZShlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeVVzZXJuYW1lKGUpfWdldEFsbEFjY291bnRzKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWxsQWNjb3VudHMoZSl9aGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpfWxvZ2luUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblBvcHVwKGUpfWxvZ2luUmVkaXJlY3QoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblJlZGlyZWN0KGUpfWxvZ291dChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dChlKX1sb2dvdXRSZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dFJlZGlyZWN0KGUpfWxvZ291dFBvcHVwKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIubG9nb3V0UG9wdXAoZSl9c3NvU2lsZW50KGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuc3NvU2lsZW50KGUpfWdldFRva2VuQ2FjaGUoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFRva2VuQ2FjaGUoKX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldExvZ2dlcigpfXNldExvZ2dlcihlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TG9nZ2VyKGUpfXNldEFjdGl2ZUFjY291bnQoZSl7dGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZUFjY291bnQoZSl9Z2V0QWN0aXZlQWNjb3VudCgpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWN0aXZlQWNjb3VudCgpfWluaXRpYWxpemVXcmFwcGVyTGlicmFyeShlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl9c2V0TmF2aWdhdGlvbkNsaWVudChlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TmF2aWdhdGlvbkNsaWVudChlKX1nZXRDb25maWd1cmF0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRDb25maWd1cmF0aW9uKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5oeWRyYXRlQ2FjaGUoZSx0KX1jbGVhckNhY2hlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuY2xlYXJDYWNoZShlKX19YXN5bmMgZnVuY3Rpb24gRmwoZSl7Y29uc3QgdD1uZXcgQmwoZSk7cmV0dXJuIGF3YWl0IHQuaW5pdGlhbGl6ZSgpLHR9Y2xhc3Mgemx7Y29uc3RydWN0b3IoZSl7dGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLm9wZXJhdGluZ0NvbnRleHQ9ZSx0aGlzLmlzQnJvd3NlckVudmlyb25tZW50PXRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpLHRoaXMuY29uZmlnPWUuZ2V0Q29uZmlnKCksdGhpcy5sb2dnZXI9ZS5nZXRMb2dnZXIoKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXRoaXMuY29uZmlnLnRlbGVtZXRyeS5jbGllbnQsdGhpcy5icm93c2VyQ3J5cHRvPXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQ/bmV3IHljKHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpOmZ0LHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBGYyh0aGlzLmxvZ2dlciksdGhpcy5icm93c2VyU3RvcmFnZT10aGlzLmlzQnJvd3NlckVudmlyb25tZW50P25ldyBNYyh0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLHRoaXMuY29uZmlnLmNhY2hlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyLHZvaWQgMCk6cWModGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyKX1nZXRCcm93c2VyU3RvcmFnZSgpe3JldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlfWdldEFjY291bnQoZSl7cmV0dXJuIG51bGx9Z2V0QWNjb3VudEJ5SG9tZUlkKGUpe3JldHVybiBudWxsfWdldEFjY291bnRCeUxvY2FsSWQoZSl7cmV0dXJuIG51bGx9Z2V0QWNjb3VudEJ5VXNlcm5hbWUoZSl7cmV0dXJuIG51bGx9Z2V0QWxsQWNjb3VudHMoKXtyZXR1cm5bXX1pbml0aWFsaXplKCl7cmV0dXJuIHRoaXMuaW5pdGlhbGl6ZWQ9ITAsUHJvbWlzZS5yZXNvbHZlKCl9YWNxdWlyZVRva2VuUG9wdXAoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319YWNxdWlyZVRva2VuUmVkaXJlY3QoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCksUHJvbWlzZS5yZXNvbHZlKCl9YWNxdWlyZVRva2VuU2lsZW50KGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWFjcXVpcmVUb2tlbkJ5Q29kZShlKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1hY3F1aXJlVG9rZW5OYXRpdmUoZSx0LHIpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuKGUsdCl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiBudWxsfXJlbW92ZUV2ZW50Q2FsbGJhY2soZSl7fWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCksIiJ9cmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSwhMH1lbmFibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpe09hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCl9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX1oYW5kbGVSZWRpcmVjdFByb21pc2UoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLFByb21pc2UucmVzb2x2ZShudWxsKX1sb2dpblBvcHVwKGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWxvZ2luUmVkaXJlY3QoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319bG9nb3V0KGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWxvZ291dFJlZGlyZWN0KGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWxvZ291dFBvcHVwKGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fXNzb1NpbGVudChlKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1nZXRUb2tlbkNhY2hlKCl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319Z2V0TG9nZ2VyKCl7cmV0dXJuIHRoaXMubG9nZ2VyfXNldExvZ2dlcihlKXtPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpfXNldEFjdGl2ZUFjY291bnQoZSl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX1nZXRBY3RpdmVBY2NvdW50KCl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCksbnVsbH1pbml0aWFsaXplV3JhcHBlckxpYnJhcnkoZSx0KXt0aGlzLmJyb3dzZXJTdG9yYWdlLnNldFdyYXBwZXJNZXRhZGF0YShlLHQpfXNldE5hdmlnYXRpb25DbGllbnQoZSl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX1nZXRDb25maWd1cmF0aW9uKCl7cmV0dXJuIHRoaXMuY29uZmlnfWlzQnJvd3NlckVudigpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLCEwfWdldEJyb3dzZXJDcnlwdG8oKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1nZXRQZXJmb3JtYW5jZUNsaWVudCgpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWdldFJlZGlyZWN0UmVzcG9uc2UoKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1hc3luYyBjbGVhckNhY2hlKGUpe09hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX19Y2xhc3MgS2wgZXh0ZW5kcyByY3tnZXRJZCgpe3JldHVybiBLbC5JRH1nZXRNb2R1bGVOYW1lKCl7cmV0dXJuIEtsLk1PRFVMRV9OQU1FfWFzeW5jIGluaXRpYWxpemUoKXtyZXR1cm4hMH19S2wuTU9EVUxFX05BTUU9IiIsS2wuSUQ9IlVua25vd25PcGVyYXRpbmdDb250ZXh0IjtjbGFzcyBHbHtzdGF0aWMgYXN5bmMgY3JlYXRlUHVibGljQ2xpZW50QXBwbGljYXRpb24oZSl7Y29uc3QgdD1hd2FpdCB4bChlKTtsZXQgcjtyZXR1cm4gcj1udWxsIT09dD9uZXcgR2woZSx0KTpuZXcgR2woZSkscn1jb25zdHJ1Y3RvcihlLHQpe2lmKHRoaXMuY29uZmlndXJhdGlvbj1lLHQpdGhpcy5jb250cm9sbGVyPXQ7ZWxzZXtjb25zdCB0PW5ldyBLbChlKTt0aGlzLmNvbnRyb2xsZXI9bmV3IHpsKHQpfX1hc3luYyBpbml0aWFsaXplKCl7aWYodGhpcy5jb250cm9sbGVyIGluc3RhbmNlb2Ygemwpe2NvbnN0IGU9YXdhaXQgeGwodGhpcy5jb25maWd1cmF0aW9uKTtyZXR1cm4gbnVsbCE9PWUmJih0aGlzLmNvbnRyb2xsZXI9ZSksdGhpcy5jb250cm9sbGVyLmluaXRpYWxpemUoKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9YXN5bmMgYWNxdWlyZVRva2VuUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5Qb3B1cChlKX1hY3F1aXJlVG9rZW5SZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblJlZGlyZWN0KGUpfWFjcXVpcmVUb2tlblNpbGVudChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblNpbGVudChlKX1hY3F1aXJlVG9rZW5CeUNvZGUoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5CeUNvZGUoZSl9YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuYWRkRXZlbnRDYWxsYmFjayhlLHQpfXJlbW92ZUV2ZW50Q2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGUpfWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpfWdldEFjY291bnQoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY2NvdW50KGUpfWdldEFjY291bnRCeUhvbWVJZChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeUhvbWVJZChlKX1nZXRBY2NvdW50QnlMb2NhbElkKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjb3VudEJ5TG9jYWxJZChlKX1nZXRBY2NvdW50QnlVc2VybmFtZShlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeVVzZXJuYW1lKGUpfWdldEFsbEFjY291bnRzKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWxsQWNjb3VudHMoZSl9aGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpfWxvZ2luUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblBvcHVwKGUpfWxvZ2luUmVkaXJlY3QoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblJlZGlyZWN0KGUpfWxvZ291dChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dChlKX1sb2dvdXRSZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dFJlZGlyZWN0KGUpfWxvZ291dFBvcHVwKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIubG9nb3V0UG9wdXAoZSl9c3NvU2lsZW50KGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuc3NvU2lsZW50KGUpfWdldFRva2VuQ2FjaGUoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFRva2VuQ2FjaGUoKX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldExvZ2dlcigpfXNldExvZ2dlcihlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TG9nZ2VyKGUpfXNldEFjdGl2ZUFjY291bnQoZSl7dGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZUFjY291bnQoZSl9Z2V0QWN0aXZlQWNjb3VudCgpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWN0aXZlQWNjb3VudCgpfWluaXRpYWxpemVXcmFwcGVyTGlicmFyeShlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl9c2V0TmF2aWdhdGlvbkNsaWVudChlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TmF2aWdhdGlvbkNsaWVudChlKX1nZXRDb25maWd1cmF0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRDb25maWd1cmF0aW9uKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5oeWRyYXRlQ2FjaGUoZSx0KX1jbGVhckNhY2hlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuY2xlYXJDYWNoZShlKX19Y29uc3QgJGw9e2luaXRpYWxpemU6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWNxdWlyZVRva2VuUG9wdXA6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWNxdWlyZVRva2VuUmVkaXJlY3Q6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWNxdWlyZVRva2VuU2lsZW50OigpPT5Qcm9taXNlLnJlamVjdChJYShtYSkpLGFjcXVpcmVUb2tlbkJ5Q29kZTooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxnZXRBbGxBY2NvdW50czooKT0+W10sZ2V0QWNjb3VudDooKT0+bnVsbCxnZXRBY2NvdW50QnlIb21lSWQ6KCk9Pm51bGwsZ2V0QWNjb3VudEJ5VXNlcm5hbWU6KCk9Pm51bGwsZ2V0QWNjb3VudEJ5TG9jYWxJZDooKT0+bnVsbCxoYW5kbGVSZWRpcmVjdFByb21pc2U6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksbG9naW5Qb3B1cDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxsb2dpblJlZGlyZWN0OigpPT5Qcm9taXNlLnJlamVjdChJYShtYSkpLGxvZ291dDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxsb2dvdXRSZWRpcmVjdDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxsb2dvdXRQb3B1cDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxzc29TaWxlbnQ6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWRkRXZlbnRDYWxsYmFjazooKT0+bnVsbCxyZW1vdmVFdmVudENhbGxiYWNrOigpPT57fSxhZGRQZXJmb3JtYW5jZUNhbGxiYWNrOigpPT4iIixyZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrOigpPT4hMSxlbmFibGVBY2NvdW50U3RvcmFnZUV2ZW50czooKT0+e30sZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzOigpPT57fSxnZXRUb2tlbkNhY2hlOigpPT57dGhyb3cgSWEobWEpfSxnZXRMb2dnZXI6KCk9Pnt0aHJvdyBJYShtYSl9LHNldExvZ2dlcjooKT0+e30sc2V0QWN0aXZlQWNjb3VudDooKT0+e30sZ2V0QWN0aXZlQWNjb3VudDooKT0+bnVsbCxpbml0aWFsaXplV3JhcHBlckxpYnJhcnk6KCk9Pnt9LHNldE5hdmlnYXRpb25DbGllbnQ6KCk9Pnt9LGdldENvbmZpZ3VyYXRpb246KCk9Pnt0aHJvdyBJYShtYSl9LGh5ZHJhdGVDYWNoZTooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxjbGVhckNhY2hlOigpPT5Qcm9taXNlLnJlamVjdChJYShtYSkpfTtmdW5jdGlvbiBRbCgpe2xldCBlO3RyeXtlPXdpbmRvd1tDcy5TZXNzaW9uU3RvcmFnZV07Y29uc3QgdD1lPy5nZXRJdGVtKEphKTtpZigxPT09TnVtYmVyKHQpKXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBKbH0pKX1jYXRjaChlKXt9fWZ1bmN0aW9uIGpsKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJnZvaWQgMCE9PXdpbmRvdy5wZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3d9ZnVuY3Rpb24gV2woZSl7aWYoZSYmamwoKSlyZXR1cm4gTWF0aC5yb3VuZCh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktZSl9Y2xhc3MgVmx7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNvcnJlbGF0aW9uSWQ9dCx0aGlzLm1lYXN1cmVOYW1lPVZsLm1ha2VNZWFzdXJlTmFtZShlLHQpLHRoaXMuc3RhcnRNYXJrPVZsLm1ha2VTdGFydE1hcmsoZSx0KSx0aGlzLmVuZE1hcms9VmwubWFrZUVuZE1hcmsoZSx0KX1zdGF0aWMgbWFrZU1lYXN1cmVOYW1lKGUsdCl7cmV0dXJuYG1zYWwubWVhc3VyZS4ke2V9LiR7dH1gfXN0YXRpYyBtYWtlU3RhcnRNYXJrKGUsdCl7cmV0dXJuYG1zYWwuc3RhcnQuJHtlfS4ke3R9YH1zdGF0aWMgbWFrZUVuZE1hcmsoZSx0KXtyZXR1cm5gbXNhbC5lbmQuJHtlfS4ke3R9YH1zdGF0aWMgc3VwcG9ydHNCcm93c2VyUGVyZm9ybWFuY2UoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmdm9pZCAwIT09d2luZG93LnBlcmZvcm1hbmNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLm1hcmsmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UubWVhc3VyZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhck1hcmtzJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZX1zdGF0aWMgZmx1c2hNZWFzdXJlbWVudHMoZSx0KXtpZihWbC5zdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZSgpKXRyeXt0LmZvckVhY2goKHQ9Pntjb25zdCByPVZsLm1ha2VNZWFzdXJlTmFtZSh0Lm5hbWUsZSk7d2luZG93LnBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUociwibWVhc3VyZSIpLmxlbmd0aD4wJiYod2luZG93LnBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMociksd2luZG93LnBlcmZvcm1hbmNlLmNsZWFyTWFya3MoVmwubWFrZVN0YXJ0TWFyayhyLGUpKSx3aW5kb3cucGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhWbC5tYWtlRW5kTWFyayhyLGUpKSl9KSl9Y2F0Y2goZSl7fX1zdGFydE1lYXN1cmVtZW50KCl7aWYoVmwuc3VwcG9ydHNCcm93c2VyUGVyZm9ybWFuY2UoKSl0cnl7d2luZG93LnBlcmZvcm1hbmNlLm1hcmsodGhpcy5zdGFydE1hcmspfWNhdGNoKGUpe319ZW5kTWVhc3VyZW1lbnQoKXtpZihWbC5zdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZSgpKXRyeXt3aW5kb3cucGVyZm9ybWFuY2UubWFyayh0aGlzLmVuZE1hcmspLHdpbmRvdy5wZXJmb3JtYW5jZS5tZWFzdXJlKHRoaXMubWVhc3VyZU5hbWUsdGhpcy5zdGFydE1hcmssdGhpcy5lbmRNYXJrKX1jYXRjaChlKXt9fWZsdXNoTWVhc3VyZW1lbnQoKXtpZihWbC5zdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZSgpKXRyeXtjb25zdCBlPXdpbmRvdy5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHRoaXMubWVhc3VyZU5hbWUsIm1lYXN1cmUiKTtpZihlLmxlbmd0aD4wKXtjb25zdCB0PWVbMF0uZHVyYXRpb247cmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKHRoaXMubWVhc3VyZU5hbWUpLHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhck1hcmtzKHRoaXMuc3RhcnRNYXJrKSx3aW5kb3cucGVyZm9ybWFuY2UuY2xlYXJNYXJrcyh0aGlzLmVuZE1hcmspLHR9fWNhdGNoKGUpe31yZXR1cm4gbnVsbH19dmFyIEpsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJyb3dzZXJQZXJmb3JtYW5jZU1lYXN1cmVtZW50OlZsfSk7ZS5BY2NvdW50RW50aXR5PWhyLGUuQXBpSWQ9TXMsZS5BdXRoRXJyb3I9Q2UsZS5BdXRoRXJyb3JDb2Rlcz1tZSxlLkF1dGhFcnJvck1lc3NhZ2U9eWUsZS5BdXRoZW50aWNhdGlvbkhlYWRlclBhcnNlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmhlYWRlcnM9ZX1nZXRTaHJOb25jZSgpe2NvbnN0IGU9dGhpcy5oZWFkZXJzW3ldO2lmKGUpe2NvbnN0IHQ9dGhpcy5wYXJzZUNoYWxsZW5nZXMoZSk7aWYodC5uZXh0bm9uY2UpcmV0dXJuIHQubmV4dG5vbmNlO3Rocm93IEp0KHh0KX1jb25zdCB0PXRoaXMuaGVhZGVyc1tmXTtpZih0KXtjb25zdCBlPXRoaXMucGFyc2VDaGFsbGVuZ2VzKHQpO2lmKGUubm9uY2UpcmV0dXJuIGUubm9uY2U7dGhyb3cgSnQoeHQpfXRocm93IEp0KEh0KX1wYXJzZUNoYWxsZW5nZXMoZSl7Y29uc3Qgcj1lLmluZGV4T2YoIiAiKSxuPWUuc3Vic3RyKHIrMSkuc3BsaXQoIiwiKSxvPXt9O3JldHVybiBuLmZvckVhY2goKGU9Pntjb25zdFtyLG5dPWUuc3BsaXQoIj0iKTtvW3JdPXVuZXNjYXBlKG4ucmVwbGFjZSgvWyciXSsvZyx0LkVNUFRZX1NUUklORykpfSkpLG99fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8sZS5BdXRoZW50aWNhdGlvblNjaGVtZT1XLGUuQXp1cmVDbG91ZEluc3RhbmNlPUl0LGUuQnJvd3NlckF1dGhFcnJvcj1YaSxlLkJyb3dzZXJBdXRoRXJyb3JDb2Rlcz1XaSxlLkJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlPVlpLGUuQnJvd3NlckNhY2hlTG9jYXRpb249Q3MsZS5Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcj12YSxlLkJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXM9eWEsZS5Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvck1lc3NhZ2U9d2EsZS5Ccm93c2VyUGVyZm9ybWFuY2VDbGllbnQ9Y2xhc3MgZXh0ZW5kcyBKb3tjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIoZS5hdXRoLmNsaWVudElkLGUuYXV0aC5hdXRob3JpdHl8fGAke3QuREVGQVVMVF9BVVRIT1JJVFl9YCxuZXcgQ3QoZS5zeXN0ZW0/LmxvZ2dlck9wdGlvbnN8fHt9LEdhLCRhKSxHYSwkYSxlLnRlbGVtZXRyeT8uYXBwbGljYXRpb258fHthcHBOYW1lOiIiLGFwcFZlcnNpb246IiJ9LHIsbil9Z2VuZXJhdGVJZCgpe3JldHVybiBvYSgpfWdldFBhZ2VWaXNpYmlsaXR5KCl7cmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT8udG9TdHJpbmcoKXx8bnVsbH1kZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKGUpe1FsKCk/LnRoZW4oKHQ9Pntjb25zdCByPXRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkLmdldChlLmV2ZW50LmNvcnJlbGF0aW9uSWQpLG49ciYmci5ldmVudElkPT09ZS5ldmVudC5ldmVudElkLG89W107biYmcj8uaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50cyYmci5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzLmZvckVhY2goKGU9PntvLnB1c2goey4uLmV9KX0pKSx0LkJyb3dzZXJQZXJmb3JtYW5jZU1lYXN1cmVtZW50LmZsdXNoTWVhc3VyZW1lbnRzKGUuZXZlbnQuY29ycmVsYXRpb25JZCxvKX0pKX1zdGFydE1lYXN1cmVtZW50KGUsdCl7Y29uc3Qgcj10aGlzLmdldFBhZ2VWaXNpYmlsaXR5KCksbj1zdXBlci5zdGFydE1lYXN1cmVtZW50KGUsdCksbz1qbCgpP3dpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTp2b2lkIDAsaT1RbCgpPy50aGVuKCh0PT5uZXcgdC5Ccm93c2VyUGVyZm9ybWFuY2VNZWFzdXJlbWVudChlLG4uZXZlbnQuY29ycmVsYXRpb25JZCkpKTtyZXR1cm4gaT8udGhlbigoZT0+ZS5zdGFydE1lYXN1cmVtZW50KCkpKSx7Li4ubixlbmQ6KGUsdCxzKT0+e2NvbnN0IGE9bi5lbmQoey4uLmUsc3RhcnRQYWdlVmlzaWJpbGl0eTpyLGVuZFBhZ2VWaXNpYmlsaXR5OnRoaXMuZ2V0UGFnZVZpc2liaWxpdHkoKSxkdXJhdGlvbk1zOldsKG8pfSx0LHMpO3JldHVybiBpPy50aGVuKChlPT5lLmVuZE1lYXN1cmVtZW50KCkpKSx0aGlzLmRlbGV0ZUluY29tcGxldGVTdWJNZWFzdXJlbWVudHMobiksYX0sZGlzY2FyZDooKT0+e24uZGlzY2FyZCgpLGk/LnRoZW4oKGU9PmUuZmx1c2hNZWFzdXJlbWVudCgpKSksdGhpcy5kZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKG4pfX19c2V0UHJlUXVldWVUaW1lKGUsdCl7aWYoIWpsKCkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogd2luZG93IHBlcmZvcm1hbmNlIEFQSSBub3QgYXZhaWxhYmxlLCB1bmFibGUgdG8gc2V0IHRlbGVtZXRyeSBxdWV1ZSB0aW1lIGZvciAke2V9YCk7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogY29ycmVsYXRpb25JZCBmb3IgJHtlfSBub3QgcHJvdmlkZWQsIHVuYWJsZSB0byBzZXQgdGVsZW1ldHJ5IHF1ZXVlIHRpbWVgKTtjb25zdCByPXRoaXMucHJlUXVldWVUaW1lQnlDb3JyZWxhdGlvbklkLmdldCh0KTtyJiYodGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogSW5jb21wbGV0ZSBwcmUtcXVldWUgJHtyLm5hbWV9IGZvdW5kYCx0KSx0aGlzLmFkZFF1ZXVlTWVhc3VyZW1lbnQoci5uYW1lLHQsdm9pZCAwLCEwKSksdGhpcy5wcmVRdWV1ZVRpbWVCeUNvcnJlbGF0aW9uSWQuc2V0KHQse25hbWU6ZSx0aW1lOndpbmRvdy5wZXJmb3JtYW5jZS5ub3coKX0pfWFkZFF1ZXVlTWVhc3VyZW1lbnQoZSx0LHIsbil7aWYoIWpsKCkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogd2luZG93IHBlcmZvcm1hbmNlIEFQSSBub3QgYXZhaWxhYmxlLCB1bmFibGUgdG8gYWRkIHF1ZXVlIG1lYXN1cmVtZW50IGZvciAke2V9YCk7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogY29ycmVsYXRpb25JZCBmb3IgJHtlfSBub3QgcHJvdmlkZWQsIHVuYWJsZSB0byBhZGQgcXVldWUgbWVhc3VyZW1lbnRgKTtjb25zdCBvPXN1cGVyLmdldFByZVF1ZXVlVGltZShlLHQpO2lmKCFvKXJldHVybjtjb25zdCBpPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSxzPXJ8fHN1cGVyLmNhbGN1bGF0ZVF1ZXVlZFRpbWUobyxpKTtyZXR1cm4gc3VwZXIuYWRkUXVldWVNZWFzdXJlbWVudChlLHQscyxuKX19LGUuQnJvd3NlclBlcmZvcm1hbmNlTWVhc3VyZW1lbnQ9VmwsZS5Ccm93c2VyVXRpbHM9SGEsZS5DYWNoZUxvb2t1cFBvbGljeT1EcyxlLkNsaWVudEF1dGhFcnJvcj1wdCxlLkNsaWVudEF1dGhFcnJvckNvZGVzPWR0LGUuQ2xpZW50QXV0aEVycm9yTWVzc2FnZT1ndCxlLkNsaWVudENvbmZpZ3VyYXRpb25FcnJvcj1WdCxlLkNsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzPVF0LGUuQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZT1XdCxlLkRFRkFVTFRfSUZSQU1FX1RJTUVPVVRfTVM9S2EsZS5FdmVudEhhbmRsZXI9RmMsZS5FdmVudE1lc3NhZ2VVdGlscz1jbGFzc3tzdGF0aWMgZ2V0SW50ZXJhY3Rpb25TdGF0dXNGcm9tRXZlbnQodCxyKXtzd2l0Y2godC5ldmVudFR5cGUpe2Nhc2UgX2MuTE9HSU5fU1RBUlQ6cmV0dXJuIHFzLkxvZ2luO2Nhc2UgX2MuU1NPX1NJTEVOVF9TVEFSVDpyZXR1cm4gcXMuU3NvU2lsZW50O2Nhc2UgX2MuQUNRVUlSRV9UT0tFTl9TVEFSVDppZih0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0fHx0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwKXJldHVybiBxcy5BY3F1aXJlVG9rZW47YnJlYWs7Y2FzZSBfYy5IQU5ETEVfUkVESVJFQ1RfU1RBUlQ6cmV0dXJuIHFzLkhhbmRsZVJlZGlyZWN0O2Nhc2UgX2MuTE9HT1VUX1NUQVJUOnJldHVybiBxcy5Mb2dvdXQ7Y2FzZSBfYy5TU09fU0lMRU5UX1NVQ0NFU1M6Y2FzZSBfYy5TU09fU0lMRU5UX0ZBSUxVUkU6aWYociYmciE9PXFzLlNzb1NpbGVudClicmVhaztyZXR1cm4gcXMuTm9uZTtjYXNlIF9jLkxPR09VVF9FTkQ6aWYociYmciE9PXFzLkxvZ291dClicmVhaztyZXR1cm4gcXMuTm9uZTtjYXNlIF9jLkhBTkRMRV9SRURJUkVDVF9FTkQ6aWYociYmciE9PXFzLkhhbmRsZVJlZGlyZWN0KWJyZWFrO3JldHVybiBxcy5Ob25lO2Nhc2UgX2MuTE9HSU5fU1VDQ0VTUzpjYXNlIF9jLkxPR0lOX0ZBSUxVUkU6Y2FzZSBfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1M6Y2FzZSBfYy5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6Y2FzZSBfYy5SRVNUT1JFX0ZST01fQkZDQUNIRTppZih0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0fHx0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwKXtpZihyJiZyIT09cXMuTG9naW4mJnIhPT1xcy5BY3F1aXJlVG9rZW4pYnJlYWs7cmV0dXJuIHFzLk5vbmV9fXJldHVybiBudWxsfX0sZS5FdmVudFR5cGU9X2MsZS5JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yPUFvLGUuSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvckNvZGVzPUNvLGUuSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvck1lc3NhZ2U9VG8sZS5JbnRlcmFjdGlvblN0YXR1cz1xcyxlLkpzb25XZWJUb2tlblR5cGVzPXVlLGUuTG9jYWxTdG9yYWdlPUVjLGUuTG9nZ2VyPUN0LGUuTWVtb3J5U3RvcmFnZT1tYyxlLk5hdmlnYXRpb25DbGllbnQ9eGEsZS5PSURDX0RFRkFVTFRfU0NPUEVTPWgsZS5QZXJmb3JtYW5jZUV2ZW50cz1PcixlLlByb21wdFZhbHVlPWIsZS5Qcm90b2NvbE1vZGU9bHIsZS5QdWJsaWNDbGllbnRBcHBsaWNhdGlvbj1CbCxlLlB1YmxpY0NsaWVudE5leHQ9R2wsZS5TZXJ2ZXJFcnJvcj1ubyxlLlNlcnZlclJlc3BvbnNlVHlwZT1fLGUuU2Vzc2lvblN0b3JhZ2U9UmMsZS5TaWduZWRIdHRwUmVxdWVzdD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe2NvbnN0IHI9dCYmdC5sb2dnZXJPcHRpb25zfHx7fTt0aGlzLmxvZ2dlcj1uZXcgQ3QocixHYSwkYSksdGhpcy5jcnlwdG9PcHM9bmV3IHljKHRoaXMubG9nZ2VyKSx0aGlzLnBvcFRva2VuR2VuZXJhdG9yPW5ldyBSbyh0aGlzLmNyeXB0b09wcyksdGhpcy5zaHJQYXJhbWV0ZXJzPWV9YXN5bmMgZ2VuZXJhdGVQdWJsaWNLZXlUaHVtYnByaW50KCl7Y29uc3R7a2lkOmV9PWF3YWl0IHRoaXMucG9wVG9rZW5HZW5lcmF0b3IuZ2VuZXJhdGVLaWQodGhpcy5zaHJQYXJhbWV0ZXJzKTtyZXR1cm4gZX1hc3luYyBzaWduUmVxdWVzdChlLHQscil7cmV0dXJuIHRoaXMucG9wVG9rZW5HZW5lcmF0b3Iuc2lnblBheWxvYWQoZSx0LHRoaXMuc2hyUGFyYW1ldGVycyxyKX1hc3luYyByZW1vdmVLZXlzKGUpe3JldHVybiB0aGlzLmNyeXB0b09wcy5yZW1vdmVUb2tlbkJpbmRpbmdLZXkoZSkudGhlbigoKCk9PiEwKSkuY2F0Y2goKGU9PntpZihlIGluc3RhbmNlb2YgcHQmJmUuZXJyb3JDb2RlPT09cnQpcmV0dXJuITE7dGhyb3cgZX0pKX19LGUuU3RyaW5nVXRpbHM9WXQsZS5TdHViUGVyZm9ybWFuY2VDbGllbnQ9SHIsZS5VcmxTdHJpbmc9d3IsZS5XcmFwcGVyU0tVPXtSZWFjdDoiQGF6dXJlL21zYWwtcmVhY3QiLEFuZ3VsYXI6IkBhenVyZS9tc2FsLWFuZ3VsYXIifSxlLmNyZWF0ZU5lc3RhYmxlUHVibGljQ2xpZW50QXBwbGljYXRpb249YXN5bmMgZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgdWMoZSk7aWYoYXdhaXQgdC5pbml0aWFsaXplKCksdC5pc0F2YWlsYWJsZSgpKXtjb25zdCByPW5ldyBIbCh0KSxuPW5ldyBCbChlLHIpO3JldHVybiBhd2FpdCBuLmluaXRpYWxpemUoKSxufXJldHVybiBGbChlKX0sZS5jcmVhdGVTdGFuZGFyZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uPUZsLGUuaXNQbGF0Zm9ybUJyb2tlckF2YWlsYWJsZT1hc3luYyBmdW5jdGlvbihlLHQscixuKXtjb25zdCBvPW5ldyBDdChlfHx7fSxHYSwkYSk7by50cmFjZSgiaXNQbGF0Zm9ybUJyb2tlckF2YWlsYWJsZSBjYWxsZWQiKTtjb25zdCBpPXR8fG5ldyBIcjtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz8oby50cmFjZSgiTm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgZGV0ZWN0ZWQsIHJldHVybmluZyBmYWxzZSIpLCExKTohIWF3YWl0IGZsKG8saSxyfHxvYSgpLHZvaWQgMCxuKX0sZS5zdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb249JGwsZS52ZXJzaW9uPSRhfSkpOwo=</File>
        <File Permission="660" Location="var/httpd/htdocs/js/thirdparty/msal-browser-4.27.0/LICENSE.txt" Encode="Base64">TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCi0tLQoKTVNBTC5qcyAoTWljcm9zb2Z0IEF1dGhlbnRpY2F0aW9uIExpYnJhcnkgZm9yIEphdmFTY3JpcHQpClZlcnNpb246IDQuMjcuMApTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcwpOUE06IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BhenVyZS9tc2FsLWJyb3dzZXIK</File>

        <!-- CSS -->
        <File Permission="660" Location="var/httpd/htdocs/skins/Agent/default/css/Core.Agent.Collaboration.css" Encode="Base64">LyoqCiAqIFpudW55IENvbGxhYm9yYXRpb24gQWRkLW9uIC0gU3R5bGVzCiAqCiAqIERlc2lnbiBQaGlsb3NvcGh5OgogKiAtIFpudW55LW5hdGl2ZSBsb29rIGFuZCBmZWVsIChub3QgTWljcm9zb2Z0L1RlYW1zIGluc3BpcmVkKQogKiAtIFVzZSBabnVueSBjb2xvciBwYWxldHRlIGFuZCBleGlzdGluZyBwYXR0ZXJucwogKiAtIFN1YnRsZSBpbnRlZ3JhdGlvbiB0aGF0IGRvZXNuJ3QgZGlzdHJhY3QgZnJvbSB0aWNrZXQgd29yawogKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBDU1MgVmFyaWFibGVzIC0gWm51bnkgQ29sb3IgUGFsZXR0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgo6cm9vdCB7CiAgICAvKiBQcmVzZW5jZSBjb2xvcnMgLSBabnVueS1uYXRpdmUgcGFsZXR0ZSAqLwogICAgLS1jb2xsYWItcHJlc2VuY2UtYXZhaWxhYmxlOiAjNWNiODVjOyAgICAgLyogR3JlZW4gLSBhdmFpbGFibGUgKi8KICAgIC0tY29sbGFiLXByZXNlbmNlLWJ1c3k6ICNkOTUzNGY7ICAgICAgICAgIC8qIFJlZCAtIGJ1c3kvaW4gY2FsbCAqLwogICAgLS1jb2xsYWItcHJlc2VuY2UtYXdheTogI2YwYWQ0ZTsgICAgICAgICAgLyogWWVsbG93L09yYW5nZSAtIGF3YXkgKi8KICAgIC0tY29sbGFiLXByZXNlbmNlLWRuZDogI2Q5NTM0ZjsgICAgICAgICAgIC8qIFJlZCAtIGRvIG5vdCBkaXN0dXJiICovCiAgICAtLWNvbGxhYi1wcmVzZW5jZS1vZmZsaW5lOiAjOTk5OyAgICAgICAgICAvKiBHcmF5IC0gb2ZmbGluZSAqLwogICAgLS1jb2xsYWItcHJlc2VuY2UtdW5rbm93bjogIzk5OTsgICAgICAgICAgLyogR3JheSAtIHVua25vd24gKi8KCiAgICAvKiBVSSBjb2xvcnMgKi8KICAgIC0tY29sbGFiLWhvdmVyLWJnOiAjZjVmNWY1OwogICAgLS1jb2xsYWItYm9yZGVyOiAjZGRkOwogICAgLS1jb2xsYWItc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgLS1jb2xsYWItbGluazogI2Y5MjsgICAgICAgICAgICAgICAgICAgICAgLyogWm51bnkgb3JhbmdlICovCiAgICAtLWNvbGxhYi1saW5rLWhvdmVyOiAjZTgwOwogICAgLS1jb2xsYWItdGV4dDogIzMzMzsKICAgIC0tY29sbGFiLXRleHQtbXV0ZWQ6ICM3Nzc7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBBdmF0YXIgQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiQXZhdGFyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEF2YXRhciBzaXplcyAqLwouQ29sbGFiQXZhdGFyLS1zbWFsbCB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLkNvbGxhYkF2YXRhci0tbWVkaXVtIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgouQ29sbGFiQXZhdGFyLS1sYXJnZSB7CiAgICB3aWR0aDogNDhweDsKICAgIGhlaWdodDogNDhweDsKfQoKLkNvbGxhYkF2YXRhci0teGxhcmdlIHsKICAgIHdpZHRoOiA2NHB4OwogICAgaGVpZ2h0OiA2NHB4Owp9CgovKiBBdmF0YXIgaW1hZ2UgKi8KLkNvbGxhYkF2YXRhcl9faW1hZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1ob3Zlci1iZyk7Cn0KCi8qIEZhbGxiYWNrIGF2YXRhciAoaW5pdGlhbHMpICovCi5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZC1jb2xvcjogIzYwN2Q4YjsKICAgIGNvbG9yOiAjZmZmOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgouQ29sbGFiQXZhdGFyLS1zbWFsbCAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5Db2xsYWJBdmF0YXItLW1lZGl1bSAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5Db2xsYWJBdmF0YXItLWxhcmdlIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKfQoKLkNvbGxhYkF2YXRhci0teGxhcmdlIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKfQoKLyogQ2xpY2thYmxlIGF2YXRhciAoZm9yIHN0YW5kYWxvbmUgYXZhdGFycyBsaWtlIGFydGljbGUgYXZhdGFycykgKi8KLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLyogSG92ZXIgcmluZyBvbiBhdmF0YXIgY29udGFpbmVyIChub3Qgb24gaW1hZ2UpIGZvciBzZWFtbGVzcyBhcHBlYXJhbmNlICovCi5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciB7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tY29sbGFiLWxpbmspOwp9CgouQ29sbGFiQXZhdGFyLS1jbGlja2FibGU6aG92ZXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIEhvdmVyIHRyaWdnZXIgZm9yIGJhZGdlIGNvbnRhaW5lcnMgKEhlYWRlclVzZXJCYWRnZSwgQ3VzdG9tZXJJbmZvIHdpZGdldCkgKi8KLkNvbGxhYkhvdmVyVHJpZ2dlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIFNob3cgcmluZyBvbiBhdmF0YXIgd2hlbiBiYWRnZSBjb250YWluZXIgaXMgaG92ZXJlZCAqLwouQ29sbGFiSG92ZXJUcmlnZ2VyOmhvdmVyIC5Db2xsYWJBdmF0YXIgewogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLkNvbGxhYkhvdmVyVHJpZ2dlcjpob3ZlciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkNvbGxhYkhvdmVyVHJpZ2dlcjpob3ZlciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBQcmVzZW5jZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiUHJlc2VuY2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAwOwogICAgcmlnaHQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXI6IDJweCBzb2xpZCAjZmZmOwogICAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi8qIFByZXNlbmNlIHNpemVzIGJhc2VkIG9uIGF2YXRhciBzaXplICovCi5Db2xsYWJBdmF0YXItLXNtYWxsIC5Db2xsYWJQcmVzZW5jZSB7CiAgICB3aWR0aDogOHB4OwogICAgaGVpZ2h0OiA4cHg7CiAgICBib3JkZXItd2lkdGg6IDFweDsKfQoKLkNvbGxhYkF2YXRhci0tbWVkaXVtIC5Db2xsYWJQcmVzZW5jZSB7CiAgICB3aWR0aDogMTBweDsKICAgIGhlaWdodDogMTBweDsKfQoKLkNvbGxhYkF2YXRhci0tbGFyZ2UgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4Owp9CgouQ29sbGFiQXZhdGFyLS14bGFyZ2UgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4Owp9CgovKiBQcmVzZW5jZSBzdGF0dXMgY29sb3JzIGFuZCBpY29ucyAqLwovKiBOb3RlOiBBbGwgcHJlc2VuY2UgaW5kaWNhdG9ycyBpbmhlcml0IHBvc2l0aW9uOmFic29sdXRlIGZyb20gYmFzZSAuQ29sbGFiUHJlc2VuY2UgKi8KCi8qIEF2YWlsYWJsZSAtIGdyZWVuIHdpdGggc21hbGwgd2hpdGUgY2hlY2ttYXJrICovCi5Db2xsYWJQcmVzZW5jZS0tYXZhaWxhYmxlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1wcmVzZW5jZS1hdmFpbGFibGUpOwp9Ci5Db2xsYWJQcmVzZW5jZS0tYXZhaWxhYmxlOjphZnRlciB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzUlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDI1JTsKICAgIGhlaWdodDogNDUlOwogICAgYm9yZGVyOiBzb2xpZCAjZmZmOwogICAgYm9yZGVyLXdpZHRoOiAwIDEuNXB4IDEuNXB4IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSByb3RhdGUoNDVkZWcpOwp9CgovKiBCdXN5IC0gc29saWQgcmVkIChubyBpY29uKSAqLwouQ29sbGFiUHJlc2VuY2UtLWJ1c3ksCi5Db2xsYWJQcmVzZW5jZS0taW5jYWxsLAouQ29sbGFiUHJlc2VuY2UtLWlubWVldGluZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xsYWItcHJlc2VuY2UtYnVzeSk7Cn0KCi8qIEF3YXkgLSB5ZWxsb3cvb3JhbmdlIHNvbGlkIChubyBpY29uKSAqLwouQ29sbGFiUHJlc2VuY2UtLWF3YXkgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sbGFiLXByZXNlbmNlLWF3YXkpOwp9CgovKiBCZSByaWdodCBiYWNrIC0geWVsbG93L29yYW5nZSBzb2xpZCAobm8gaWNvbikgKi8KLkNvbGxhYlByZXNlbmNlLS1iZXJpZ2h0YmFjayB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xsYWItcHJlc2VuY2UtYXdheSk7Cn0KCi8qIERvIG5vdCBkaXN0dXJiIC0gcmVkIHdpdGggd2hpdGUgbWludXMgKi8KLkNvbGxhYlByZXNlbmNlLS1kbmQgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sbGFiLXByZXNlbmNlLWRuZCk7Cn0KLkNvbGxhYlByZXNlbmNlLS1kbmQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHdpZHRoOiA2MCU7CiAgICBoZWlnaHQ6IDJweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi8qIE9mZmxpbmUgLSBncmF5IHdpdGggc21hbGwgd2hpdGUgWCAqLwouQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmUgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sbGFiLXByZXNlbmNlLW9mZmxpbmUpOwp9Ci5Db2xsYWJQcmVzZW5jZS0tb2ZmbGluZTo6YmVmb3JlLAouQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmU6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNTAlOwogICAgaGVpZ2h0OiAxLjVweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KLkNvbGxhYlByZXNlbmNlLS1vZmZsaW5lOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDQ1ZGVnKTsKfQouQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmU6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHJvdGF0ZSgtNDVkZWcpOwp9CgovKiBVbmtub3duIC0gZ3JheSBzb2xpZCAobm8gaWNvbikgKi8KLkNvbGxhYlByZXNlbmNlLS11bmtub3duIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1wcmVzZW5jZS11bmtub3duKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIFdvcmsgTG9jYXRpb24gQmFkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5Db2xsYWJXb3JrTG9jYXRpb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLkNvbGxhYldvcmtMb2NhdGlvbiBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBPZmZpY2UgLSBwdXJwbGUvYmx1ZSBsaWtlIFRlYW1zICovCi5Db2xsYWJXb3JrTG9jYXRpb24tLW9mZmljZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlM2YzOwogICAgY29sb3I6ICM1YjRiOWU7Cn0KCi8qIFJlbW90ZSAtIHRlYWwvZ3JlZW4gKi8KLkNvbGxhYldvcmtMb2NhdGlvbi0tcmVtb3RlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2YzZWY7CiAgICBjb2xvcjogIzJlN2Q2ZTsKfQoKLyogVGltZSBvZmYgLSBvcmFuZ2UveWVsbG93ICovCi5Db2xsYWJXb3JrTG9jYXRpb24tLXRpbWVPZmYgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNlMDsKICAgIGNvbG9yOiAjZTY1MTAwOwp9CgovKiBXb3JrIGxvY2F0aW9uIGluIEhvdmVyQ2FyZCByb3cgKi8KLkNvbGxhYkhvdmVyQ2FyZF9fcm93IC5Db2xsYWJXb3JrTG9jYXRpb24gewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KCi8qIFdvcmsgbG9jYXRpb24gaW4gQ3VzdG9tZXJJbmZvIHdpZGdldCAtIG5vdyBoYW5kbGVkIGJ5IF9fYmFkZ2VzUm93ICovCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogSG92ZXIgQ2FyZCAoUGVyc29uIENhcmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYkhvdmVyQ2FyZCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiA5OTk5OwogICAgd2lkdGg6IDMyMHB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCB2YXIoLS1jb2xsYWItc2hhZG93KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCk7CiAgICBvcGFjaXR5OiAwOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIHZpc2liaWxpdHkgMC4ycyBlYXNlOwp9CgouQ29sbGFiSG92ZXJDYXJkLS12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgovKiBDYXJkIGhlYWRlciB3aXRoIGF2YXRhciBhbmQgbmFtZSAqLwouQ29sbGFiSG92ZXJDYXJkX19oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgovKiBEaXNhYmxlIGhvdmVyIGVmZmVjdCBvbiBhdmF0YXIgaW5zaWRlIGhvdmVyIGNhcmQgKi8KLkNvbGxhYkhvdmVyQ2FyZF9faGVhZGVyIC5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciB7CiAgICBib3gtc2hhZG93OiBub25lOwp9CgouQ29sbGFiSG92ZXJDYXJkX19oZWFkZXIgLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlOmhvdmVyIC5Db2xsYWJBdmF0YXJfX2ltYWdlLAouQ29sbGFiSG92ZXJDYXJkX19oZWFkZXIgLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlOmhvdmVyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX2luZm8gewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fbmFtZSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luOiAwIDAgMnB4IDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgouQ29sbGFiSG92ZXJDYXJkX190aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgbWFyZ2luOiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLyogQ2FyZCBib2R5IHdpdGggY29udGFjdCBkZXRhaWxzICovCi5Db2xsYWJIb3ZlckNhcmRfX2JvZHkgewogICAgcGFkZGluZzogMTZweDsKfQoKLyogT09GIE1lc3NhZ2UgQmFubmVyIGluIEhvdmVyQ2FyZCAqLwouQ29sbGFiSG92ZXJDYXJkX19vb2ZCYW5uZXIgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgbWFyZ2luOiAtMTZweCAtMTZweCAxMnB4IC0xNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZjNlMCAwJSwgI2ZmZTBiMiAxMDAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZjYzgwOwp9CgouQ29sbGFiSG92ZXJDYXJkX19vb2ZIZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1hcmdpbi1ib3R0b206IDZweDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fb29mSWNvbiB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogI2U2NTEwMDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fb29mVGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiAjZTY1MTAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fb29mTWVzc2FnZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogIzVkNDAzNzsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBtYXgtaGVpZ2h0OiAxMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgouQ29sbGFiSG92ZXJDYXJkX19yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNXB4IDA7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgouQ29sbGFiSG92ZXJDYXJkX19yb3c6Zmlyc3QtY2hpbGQgewogICAgcGFkZGluZy10b3A6IDA7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX3JvdzpsYXN0LWNoaWxkIHsKICAgIHBhZGRpbmctYm90dG9tOiAwOwp9CgouQ29sbGFiSG92ZXJDYXJkX19yb3c6bm90KDpsYXN0LWNoaWxkKSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogOTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIHBhZGRpbmctdG9wOiAycHg7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX3ZhbHVlIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUgYSB7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUgYTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmstaG92ZXIpOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KCi8qIE1hbmFnZXIgbGluayAqLwouQ29sbGFiSG92ZXJDYXJkX19tYW5hZ2VyIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX21hbmFnZXI6aG92ZXIgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyKTsKfQoKLyogQ2FyZCBmb290ZXIgd2l0aCBhY3Rpb24gYnV0dG9ucyAqLwouQ29sbGFiSG92ZXJDYXJkX19mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4Owp9CgovKiBTcGFjZXIgdG8gcHVzaCBzZXR0aW5ncy9sb2dvdXQgdG8gdGhlIHJpZ2h0ICovCi5Db2xsYWJIb3ZlckNhcmRfX2Zvb3RlclNwYWNlciB7CiAgICBmbGV4OiAxOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWN0aW9uIEJ1dHRvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYkJ1dHRvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLkNvbGxhYkJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiQnV0dG9uOmhvdmVyIGkgewogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJCdXR0b24gaSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlOwp9CgovKiBJY29uLW9ubHkgYnV0dG9uICovCi5Db2xsYWJCdXR0b24tLWljb24gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwOwp9CgouQ29sbGFiQnV0dG9uLS1pY29uIGkgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgovKiBQcmltYXJ5IGJ1dHRvbiAqLwouQ29sbGFiQnV0dG9uLS1wcmltYXJ5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJCdXR0b24tLXByaW1hcnkgaSB7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYkJ1dHRvbi0tcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluay1ob3Zlcik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyKTsKfQoKLyogTG9nb3V0IGJ1dHRvbiAtIHN1YnRsZSByZWQgb24gaG92ZXIgKi8KLkNvbGxhYkJ1dHRvbi0tbG9nb3V0IHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgouQ29sbGFiQnV0dG9uLS1sb2dvdXQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Q5NTM0ZjsKICAgIGJvcmRlci1jb2xvcjogI2Q5NTM0ZjsKICAgIGNvbG9yOiAjZmZmOwp9CgovKiBDb3B5IGJ1dHRvbiAtIHNtYWxsIGlubGluZSBidXR0b24gZm9yIGNvcHlpbmcgY29udGFjdCBkYXRhICovCi5Db2xsYWJCdXR0b24tLWNvcHkgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBtaW4td2lkdGg6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBvcGFjaXR5OiAwLjQ7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKfQoKLkNvbGxhYkJ1dHRvbi0tY29weTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIG9wYWNpdHk6IDE7Cn0KCi5Db2xsYWJCdXR0b24tLWNvcHkgaSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwp9CgouQ29sbGFiQnV0dG9uLS1jb3B5OmhvdmVyIGkgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogQ29weWFibGUgdmFsdWUgd3JhcHBlciAtIGlubGluZSBmbGV4IGZvciBsaW5rICsgY29weSBidXR0b24gKi8KLkNvbGxhYkhvdmVyQ2FyZF9fY29weWFibGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fY29weWFibGUgYSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBIZWFkZXIgTG9naW4gQnV0dG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiVXNlckJhZGdlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKfQoKLkNvbGxhYlVzZXJCYWRnZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLkNvbGxhYlVzZXJCYWRnZV9fY29udGVudCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBiYWNrZ3JvdW5kOiAjNjA3ZDhiOwp9CgouQ29sbGFiVXNlckJhZGdlX19pbmZvIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5Db2xsYWJVc2VyQmFkZ2VfX25hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogMTUwcHg7Cn0KCi5Db2xsYWJVc2VyQmFkZ2VfX3N0YXR1cyB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLkNvbGxhYlVzZXJCYWRnZV9fc3RhdHVzLS1jb25uZWN0ZWQgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogTm90IGxvZ2dlZCBpbiBzdGF0ZSAtIHN1YnRsZSBncmF5ICovCi5Db2xsYWJVc2VyQmFkZ2UtLWRpc2Nvbm5lY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKfQoKLkNvbGxhYlVzZXJCYWRnZS0tZGlzY29ubmVjdGVkOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxNTMsIDM0LCAwLjE1KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE1MywgMzQsIDAuNCk7Cn0KCi5Db2xsYWJVc2VyQmFkZ2UtLWRpc2Nvbm5lY3RlZCAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgYmFja2dyb3VuZDogIzYwN2Q4YjsKfQoKLkNvbGxhYlVzZXJCYWRnZS0tZGlzY29ubmVjdGVkIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjBjMCI7CiAgICBmb250LWZhbWlseTogRm9udEF3ZXNvbWU7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5Db2xsYWJVc2VyQmFkZ2UtLWRpc2Nvbm5lY3RlZCAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgZm9udC1zaXplOiAwOwp9CgovKiBMb2dnZWQgaW4gc3RhdGUgLSBubyBzcGVjaWFsIGJhY2tncm91bmQsIG5vIGJvcmRlciAqLwouQ29sbGFiVXNlckJhZGdlLS1jb25uZWN0ZWQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7Cn0KCi5Db2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIFRpY2tldCBab29tIFdpZGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5Db2xsYWJXaWRnZXQgewogICAgcGFkZGluZzogMTBweDsKfQoKLkNvbGxhYldpZGdldF9fdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5Db2xsYWJXaWRnZXRfX3RpdGxlIGkgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLkNvbGxhYldpZGdldF9fY3VzdG9tZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5Db2xsYWJXaWRnZXRfX2N1c3RvbWVySW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgouQ29sbGFiV2lkZ2V0X19jdXN0b21lck5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5Db2xsYWJXaWRnZXRfX2N1c3RvbWVyRW1haWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5Db2xsYWJXaWRnZXRfX2FjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogOHB4Owp9CgouQ29sbGFiV2lkZ2V0X19sb2dpbkhpbnQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMjBweCAxMHB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLkNvbGxhYldpZGdldF9fbG9naW5IaW50IGkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDI0cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogTWVldGluZyBTY2hlZHVsZXIgTW9kYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogTW9kYWwgT3ZlcmxheSAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICB6LWluZGV4OiA5OTk4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgdmlzaWJpbGl0eSAwLjJzIGVhc2U7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyLS12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgovKiBEaWFsb2cgQm94ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kaWFsb2cgewogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIHdpZHRoOiA0ODBweDsKICAgIG1heC13aWR0aDogOTV2dzsKICAgIG1heC1oZWlnaHQ6IDkwdmg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlci0tdmlzaWJsZSAuQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGlhbG9nIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7Cn0KCi8qIEhlYWRlciAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9faGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogMTZweCAyMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdGl0bGUgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbjogMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19jbG9zZSB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2Nsb3NlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZyk7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQpOwp9CgovKiBCb2R5ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19ib2R5IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMjBweDsKfQoKLyogU2VjdGlvbiAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbiB7CiAgICBtYXJnaW4tYm90dG9tOiAyMHB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLyogQXR0ZW5kZWVzIFNlY3Rpb24gKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTJweDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYmFja2dyb3VuZDogI2Y5ZjlmOTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNlZWU7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZVJvbGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbWluLXdpZHRoOiA2MHB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVBdmF0YXIgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlQXZhdGFyIC5Db2xsYWJBdmF0YXIgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZUF2YXRhciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlQXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVBdmF0YXIgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVJbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZU5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZUVtYWlsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgovKiBTdWJqZWN0IElucHV0ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2lucHV0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogRHVyYXRpb24gQnV0dG9ucyAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZHVyYXRpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDhweDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9uIHsKICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbi0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmspOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBjb2xvcjogI2ZmZjsKfQoKLyogTWVldGluZyBUeXBlIEJ1dHRvbnMgKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGVzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEwcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlIGkgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZS0tc2VsZWN0ZWQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmstaG92ZXIpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluay1ob3Zlcik7CiAgICBjb2xvcjogI2ZmZjsKfQoKLyogRGF0ZSBQaWNrZXIgKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RhdGVQaWNrZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlSW5wdXQgewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZU5hdiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA0cHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlQnRuIHsKICAgIHdpZHRoOiAzNnB4OwogICAgaGVpZ2h0OiAzNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZUJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiAjZmZmOwp9CgovKiBUaW1lIFNsb3RzICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90cyB7CiAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3QgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3Q6bGFzdC1jaGlsZCB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItaG92ZXItYmcpOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdC0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDE1MywgMzQsIDAuMSk7CiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RSYWRpbyB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90LS1zZWxlY3RlZCAuQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdFJhZGlvIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdC0tc2VsZWN0ZWQgLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RSYWRpbzo6YWZ0ZXIgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDNweDsKICAgIGxlZnQ6IDNweDsKICAgIHdpZHRoOiA2cHg7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RUaW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90SW5kaWNhdG9yIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLyogRW1wdHkgU3RhdGUgKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2VtcHR5IHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDQwcHggMjBweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19lbXB0eSBpIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiAzMnB4OwogICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIGNvbG9yOiAjY2NjOwp9CgovKiBMb2FkaW5nIFN0YXRlICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sb2FkaW5nIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDQwcHggMjBweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sb2FkaW5nIGkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDI0cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBhbmltYXRpb246IHNwaW4gMXMgbGluZWFyIGluZmluaXRlOwp9CgpAa2V5ZnJhbWVzIHNwaW4gewogICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KfQoKLyogRm9vdGVyICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwogICAgYm9yZGVyLXJhZGl1czogMCAwIDZweCA2cHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19idG4gewogICAgcGFkZGluZzogMTBweCAyMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZyk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19idG4tLXByaW1hcnkgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmspOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2J0bi0tcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluay1ob3Zlcik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyKTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2J0bi0tcHJpbWFyeTpkaXNhYmxlZCB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgYm9yZGVyLWNvbG9yOiAjY2NjOwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLyogU3VjY2Vzcy9FcnJvciBNZXNzYWdlcyAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbWVzc2FnZSB7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbWVzc2FnZS0tc3VjY2VzcyB7CiAgICBiYWNrZ3JvdW5kOiAjZDRlZGRhOwogICAgYm9yZGVyOiAxcHggc29saWQgI2MzZTZjYjsKICAgIGNvbG9yOiAjMTU1NzI0Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbWVzc2FnZS0tZXJyb3IgewogICAgYmFja2dyb3VuZDogI2Y4ZDdkYTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNmNWM2Y2I7CiAgICBjb2xvcjogIzcyMWMyNDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX21lc3NhZ2UtLXdhcm5pbmcgewogICAgYmFja2dyb3VuZDogI2ZmZjNjZDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmVlYmE7CiAgICBjb2xvcjogIzg1NjQwNDsKfQoKLyogSGludCB0ZXh0ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19oaW50IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBVdGlsaXR5IENsYXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiSGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLkNvbGxhYkxvYWRpbmcgewogICAgb3BhY2l0eTogMC42OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBBcnRpY2xlIEF2YXRhciAoaW4gdGlja2V0IHpvb20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQXJ0aWNsZU1ldGEgLkNvbGxhYkF2YXRhciB7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi8qIE5hdGl2ZSBabnVueSBhcnRpY2xlIGF2YXRhciBjb250YWluZXIgaW50ZWdyYXRpb24gKi8KLkF2YXRhciAuQ29sbGFiQXZhdGFyIHsKICAgIHdpZHRoOiA2NHB4OwogICAgaGVpZ2h0OiA2NHB4OwogICAgbWFyZ2luOiAwOwp9CgovKiBPdmVycmlkZSBabnVueSdzIGRlZmF1bHQgcm91bmRlZCBjb3JuZXJzIHdpdGggZnVsbHkgcm91bmQgYXZhdGFycyAqLwouQXZhdGFyIC5Db2xsYWJBdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5BdmF0YXIgLkNvbGxhYkF2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjaywKLkF2YXRhci5Db2xsYWJBdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5BdmF0YXIuQ29sbGFiQXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrLAouQXJ0aWNsZU1haWxDb250ZW50IC5BdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5BcnRpY2xlTWFpbENvbnRlbnQgLkF2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjaywKLkF2YXRhciAuQ29sbGFiQXZhdGFyIGltZywKLkF2YXRhci5Db2xsYWJBdmF0YXIgaW1nIHsKICAgIHdpZHRoOiA2NHB4OwogICAgaGVpZ2h0OiA2NHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlICFpbXBvcnRhbnQ7ICAvKiBGdWxseSByb3VuZCBsaWtlIEhlYWRlclVzZXJCYWRnZSAqLwp9CgouQXZhdGFyIC5Db2xsYWJBdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgZm9udC1zaXplOiAyMHB4OwogICAgYmFja2dyb3VuZDogI2U4ZThlODsKICAgIGNvbG9yOiAjODg4Owp9CgovKiBQcmVzZW5jZSBpbmRpY2F0b3IgaW4gYXJ0aWNsZSBhdmF0YXIgKi8KLkF2YXRhciAuQ29sbGFiUHJlc2VuY2UgewogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICBib3R0b206IDJweDsKICAgIHJpZ2h0OiAycHg7CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLyogRGlzYWJsZSBvcmFuZ2UgaG92ZXIgZWZmZWN0IG9uIGFydGljbGUgYXZhdGFycyAqLwouQXZhdGFyIC5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkF2YXRhciAuQ29sbGFiQXZhdGFyLS1jbGlja2FibGU6aG92ZXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgb3BhY2l0eTogMTsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBUaWNrZXQgSW5mbyBTaWRlYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouU2lkZWJhckNvbHVtbiAuQ29sbGFiQXZhdGFyIHsKICAgIG1hcmdpbi1yaWdodDogNnB4Owp9CgouVGlja2V0SW5mb3JtYXRpb25Sb3cgLkNvbGxhYkF2YXRhciB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogSGVhZGVyIFVzZXJBdmF0YXIgSW50ZWdyYXRpb24gKEhlYWRlclVzZXJCYWRnZSkgICAgICAgICAgICAgICovCi8qIERlc2lnbjogV2hpdGUgY2FyZCB3aXRoIG9yYW5nZSBib3JkZXIsIGF2YXRhciBsZWZ0LCBpbmZvIHJpZ2h0ICovCi8qIFNlbGVjdGVkIGJ5IC5Vc2VyQXZhdGFyIGNsYXNzLCBub3QgI1VzZXJBdmF0YXIgaWQgLSBabnVueSA2LjUueCBMVFMgICovCi8qIHJlbmRlcnMgPGxpIGNsYXNzPSJVc2VyQXZhdGFyIj4gd2l0aCBubyBpZCBhdCBhbGwgKGFkZGVkIGJ5IDcuMi54KS4gKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBIaWRlIG9yaWdpbmFsIFpudW55IGNvbnRlbnQgd2hlbiBjb25uZWN0ZWQgKi8KLlVzZXJBdmF0YXIuQ29sbGFiVXNlckJhZGdlLS1jb25uZWN0ZWQgPiBhOmZpcnN0LWNoaWxkLAouVXNlckF2YXRhci5Db2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZCAuVXNlckF2YXRhcl9zdWJtZW51IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogUmVtb3ZlIFpudW55J3MgbmF0aXZlIGJvcmRlciBvbiBVc2VyQXZhdGFyIGltYWdlcyAqLwouVXNlckF2YXRhciBpbWcgewogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qIENvbnRhaW5lciBzdHlsaW5nIHdoZW4gY29ubmVjdGVkICovCi8qIHdpZHRoL2hlaWdodDogYXV0byBvdmVycmlkZSBuZWVkZWQgb24gNi41LnggTFRTIG9ubHkgLSBpdHMgb3duIGNvcmUKICogQ1NTIGZpeGVzIEVWRVJZICNUb29sQmFyIGxpIChmbG9hdDpsZWZ0KSBhdCB3aWR0aDoyNHB4L2hlaWdodDozNHB4LAogKiBzaXplZCBmb3IgdGhlIG5hdGl2ZSBpY29uLW9ubHkgY29udGVudC4gT3VyIGNvbm5lY3RlZCBiYWRnZSBpcyBtdWNoCiAqIHdpZGVyIChuYW1lICsgdGl0bGUgbmV4dCB0byB0aGUgYXZhdGFyKTsgd2l0aG91dCB0aGlzLCB0aGUgPGxpPidzCiAqIG93biBib3ggc3RheXMgMjRweCB3aWRlIHdoaWxlIHRoZSBiYWRnZSB2aXN1YWxseSBvdmVyZmxvd3Mgb3V0IG9mCiAqIGl0LCBkcmF3aW5nIG9uIHRvcCBvZiB3aGF0ZXZlciB0b29sYmFyIGljb24gc2l0cyB0byBpdHMgcmlnaHQKICogaW5zdGVhZCBvZiBwdXNoaW5nIGl0IGFzaWRlLiAjVG9vbEJhciBpbiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyB0aGUKICogY29yZSBydWxlJ3Mgb3duIHNwZWNpZmljaXR5IChpZCArIGVsZW1lbnQpIHNvIHRoaXMgbmVlZHMgbm8KICogIWltcG9ydGFudDsgYXV0by13aWR0aCBvbiBhIGZsb2F0IHN0aWxsIHNocmlua3MgdG8gZml0IGl0cyBjb250ZW50LiAqLwojVG9vbEJhciAuVXNlckF2YXRhci5Db2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBhdXRvOwp9CgovKiBNYWluIGJhZGdlIGNvbnRhaW5lciAtIGNvbXBhY3QsIG5vIGJvcmRlciAqLwouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fY29udGVudDpob3ZlciAuQ29sbGFiVXNlckJhZGdlX19uYW1lLAouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50OmhvdmVyIC5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlIHsKICAgIGNvbG9yOiAjZmY4YTI1Owp9CgovKiBBdmF0YXIgd3JhcHBlciAtIGNvbnRhaW5zIHRoZSBDb2xsYWJBdmF0YXIgKi8KLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDQ4cHg7CiAgICBoZWlnaHQ6IDQ4cHg7Cn0KCi8qIE92ZXJyaWRlIGF2YXRhciBzaXplIGluc2lkZSBiYWRnZSAqLwouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhciB7CiAgICB3aWR0aDogNDhweDsKICAgIGhlaWdodDogNDhweDsKfQoKLyogIWltcG9ydGFudCBvbiB0aGUgPGltZz4gY2FzZSBvbmx5LCBuZWVkZWQgb24gNi41LnggTFRTOiBpdHMgb3duIGNvcmUKICogQ1NTIGhhcyAiI1Rvb2xCYXIgbGkuVXNlckF2YXRhciBpbWcgeyB3aWR0aDozNXB4OyBoZWlnaHQ6MzVweDsgLi4ufSIKICogKGlkK2NsYXNzK2VsZW1lbnQgc3BlY2lmaWNpdHkpIHNpemVkIGZvciB0aGUgbmF0aXZlIDM1cHggYXZhdGFyCiAqIHBob3RvLCB3aGljaCBvdGhlcndpc2Ugd2lucyBvdmVyIHRoaXMgcGxhaW4tY2xhc3MgcnVsZSBhbmQgbGVhdmVzIGEKICogMzVweCBwaG90byBmbG9hdGluZyBpbnNpZGUgb3VyIDQ4cHggYXZhdGFyIGNpcmNsZS4gVGhlIGZhbGxiYWNrCiAqIChpbml0aWFscykgc3BhbiBpc24ndCBhbiA8aW1nPiwgc28gdGhhdCBuYXRpdmUgcnVsZSBuZXZlciBtYXRjaGVzIGl0CiAqIGFuZCBubyAhaW1wb3J0YW50IGlzIG5lZWRlZCB0aGVyZS4gKi8KLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ltYWdlIHsKICAgIHdpZHRoOiA0OHB4ICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDQ4cHggIWltcG9ydGFudDsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiA0OHB4OwogICAgaGVpZ2h0OiA0OHB4Owp9CgouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgovKiBQcmVzZW5jZSBpbmRpY2F0b3Igc2l6ZSBmb3IgYmFkZ2UgYXZhdGFyICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiUHJlc2VuY2UgewogICAgd2lkdGg6IDEycHg7CiAgICBoZWlnaHQ6IDEycHg7CiAgICBib3JkZXItd2lkdGg6IDJweDsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgovKiBFbnN1cmUgcHJlc2VuY2UgaWNvbnMgYXJlIHZpc2libGUgaW4gaGVhZGVyIC0gZXhwbGljaXQgcnVsZXMgZm9yIHNwZWNpZmljaXR5ICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJQcmVzZW5jZS0tYXZhaWxhYmxlOjphZnRlciB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzUlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDI1JTsKICAgIGhlaWdodDogNDUlOwogICAgYm9yZGVyOiBzb2xpZCAjZmZmOwogICAgYm9yZGVyLXdpZHRoOiAwIDEuNXB4IDEuNXB4IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSByb3RhdGUoNDVkZWcpOwp9CgouVXNlckF2YXRhciAuQ29sbGFiUHJlc2VuY2UtLWRuZDo6YWZ0ZXIgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgd2lkdGg6IDYwJTsKICAgIGhlaWdodDogMnB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlByZXNlbmNlLS1vZmZsaW5lOjpiZWZvcmUsCi5Vc2VyQXZhdGFyIC5Db2xsYWJQcmVzZW5jZS0tb2ZmbGluZTo6YWZ0ZXIgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiA1MCU7CiAgICBoZWlnaHQ6IDEuNXB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlByZXNlbmNlLS1vZmZsaW5lOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDQ1ZGVnKTsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlByZXNlbmNlLS1vZmZsaW5lOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSByb3RhdGUoLTQ1ZGVnKTsKfQoKLyogSW5mbyBhcmVhIC0gbmFtZSBhbmQgdGl0bGUgc3RhY2tlZCB2ZXJ0aWNhbGx5ICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2luZm8gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBVc2VyIG5hbWUgLSBib2xkLiAjMzMzIChkYXJrKSBldmVyeXdoZXJlIGVsc2UgdGhpcyBjbGFzcyBpcyB1c2VkCiAqIChjdXN0b21lciBpbmZvIHdpZGdldCwgaG92ZXIgY2FyZHMpIHNpbmNlIHRob3NlIHNpdCBvbiBsaWdodC93aGl0ZQogKiBiYWNrZ3JvdW5kcywgYnV0IFpudW55IDYuNS54IExUUydzIG93biAjSGVhZGVyIGlzIGRhcmsgKCMzMzMgYmcsCiAqICNmZmYgdGV4dCAtIHNlZSBDb3JlLkhlYWRlci5jc3MpIC0gIzMzMy1vbi0jMzMzIGlzIHVucmVhZGFibGUgdGhlcmUuCiAqIFRoaXMgZmlsZSBpcyA2LjUueC1vbmx5LCBzbyBubyBuZWVkIHRvIHNjb3BlIGxpZ2h0LXZzLWRhcmsgZnVydGhlci4gKi8KLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fbmFtZSB7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICNmZmY7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiAyNTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7Cn0KCi8qIEpvYiB0aXRsZSAtIHNtYWxsZXIsIG11dGVkLiAjY2NjIHRvIG1hdGNoIDYuNS54J3Mgb3duIGRyb3Bkb3duIHRleHQKICogY29sb3IgKCNUb29sQmFyIGxpLlVzZXJBdmF0YXIgZGl2IHNwYW4pLCBub3QgIzc3NyB3aGljaCBpcyB1bnJlYWRhYmxlCiAqIG9uIHRoZSBkYXJrICNIZWFkZXIgYmFja2dyb3VuZCAtIHNlZSAuQ29sbGFiVXNlckJhZGdlX19uYW1lIGFib3ZlLiAqLwouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX190aXRsZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgY29sb3I6ICNjY2M7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiAyNTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7Cn0KCi8qIERlcHJlY2F0ZWQgLSB1c2UgX190aXRsZSBpbnN0ZWFkICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX3N0YXR1cyB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogIzc3NzsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX3N0YXR1cy0tY29ubmVjdGVkIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBDdXN0b21lciBJbmZvcm1hdGlvbiBXaWRnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIEN1c3RvbWVyIEluZm9ybWF0aW9uIFdpZGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogUmV1c2VzIENvbGxhYlVzZXJCYWRnZSBzdHJ1Y3R1cmUgKHNhbWUgYXMgSGVhZGVyVXNlckJhZGdlKSAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCB7CiAgICAvKiBXaWRnZXQgdXNlcyBuYXRpdmUgWm51bnkgV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIGNsYXNzZXMgKi8KfQoKLyogQ3VzdG9tZXIgYmFkZ2UgY29udGFpbmVyIC0gbm93IGNvbnRhaW5zIG1haW4gcm93ICsgYmFkZ2VzIHJvdyAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi8qIEF2YXRhciB3cmFwcGVyICovCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDQ4cHg7CiAgICBoZWlnaHQ6IDQ4cHg7Cn0KCi8qIEVuc3VyZSBhdmF0YXIgaW4gY3VzdG9tZXIgaW5mbyBpcyBhbHdheXMgNDh4NDggKi8KLkNvbGxhYkN1c3RvbWVySW5mbyAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhciB7CiAgICB3aWR0aDogNDhweDsKICAgIGhlaWdodDogNDhweDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mbyAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiA0OHB4OwogICAgaGVpZ2h0OiA0OHB4Owp9CgouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDE2cHg7Cn0KCi8qIFByZXNlbmNlIGluZGljYXRvciBzaXplICovCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJQcmVzZW5jZSB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci13aWR0aDogMnB4Owp9CgovKiBJbmZvIGFyZWEgLSBuYW1lIGFuZCB0aXRsZSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX2luZm8gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogVXNlciBuYW1lICovCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fbmFtZSB7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7Cn0KCi8qIEpvYiB0aXRsZSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICBjb2xvcjogIzc3NzsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKfQoKLyogSXRlbVJvdyBsaXN0IC0gbmF0aXZlIFpudW55IHN0eWxpbmcgKi8KLkNvbGxhYkN1c3RvbWVySW5mbyAuSXRlbVJvdyB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mbyAuSXRlbVJvdyBsaSB7CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mbyAuSXRlbVJvdyBsaSBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogIzc3NzsKfQoKLyogSWNvbiB1c2VzIGRlZmF1bHQgZ3JleSBjb2xvciBsaWtlIG90aGVyIGljb25zICovCgouQ29sbGFiQ3VzdG9tZXJJbmZvIC5JdGVtUm93IGxpIGEgewogICAgY29sb3I6ICMwMDA7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5Db2xsYWJDdXN0b21lckluZm8gLkl0ZW1Sb3cgbGkgYTpob3ZlciB7CiAgICBjb2xvcjogI2ZmOTkyMjsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLyogT3BlblRpY2tldCBsaW5rIHVzZXMgc2FtZSBjb2xvciBhcyBvdGhlciBsaW5rcyAoYmxhY2ssIG9yYW5nZSBvbiBob3ZlcikgKi8KCi5Db2xsYWJDdXN0b21lckluZm9fX3RpY2tldENvdW50IHsKICAgIC8qIElubGluZSB3aXRoIHRleHQgKi8KfQoKLyogQWN0aW9uIGJ1dHRvbnMgcm93IC0gVGVhbXMgQ2hhdCwgQXVkaW8sIFZpZGVvIChsZWZ0KSArIE1lZXRpbmcgKHJpZ2h0KSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlOwp9CgovKiBTcGFjZXIgdG8gcHVzaCBtZWV0aW5nIGJ1dHRvbiB0byB0aGUgcmlnaHQgKi8KLkNvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9uc1NwYWNlciB7CiAgICBmbGV4OiAxOwp9CgouQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25CdG4gewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgY29sb3I6ICMzMzM7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9uQnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmZjk5MjI7CiAgICBib3JkZXItY29sb3I6ICNmZjk5MjI7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9uQnRuOmhvdmVyIGkgewogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX2FjdGlvbkJ0biBpIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiAjNjY2OwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIENhbmNlbCBBcHBvaW50bWVudCBCdXR0b24gKExpbmtlZE9iamVjdHMgd2lkZ2V0KSAgICAgICAgICAgICAqLwovKiBTdHlsZWQgdG8gbWF0Y2ggWm51bnkncyBuYXRpdmUgLnRhYmxlLWljb24taG92ZXItbWQgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyLXJhZGl1cy14cywgNHB4KTsKICAgIHRyYW5zaXRpb246IHZhcigtLW1haW4tdHJhbnNpdGlvbiwgYWxsIDAuMTVzIGVhc2UpOwp9CgouQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgI2ZmOTkyMik7Cn0KCi5Db2xsYWJDYW5jZWxBcHBvaW50bWVudDpob3ZlciBpIHsKICAgIGNvbG9yOiB2YXIoLS13aGl0ZSwgI2ZmZik7Cn0KCi5Db2xsYWJDYW5jZWxBcHBvaW50bWVudCBpIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLWxnLCAxNnB4KTsKICAgIHRyYW5zaXRpb246IHZhcigtLW1haW4tdHJhbnNpdGlvbiwgYWxsIDAuMTVzIGVhc2UpOwp9CgovKiBJbmxpbmUgdmFyaWFudCBmb3Igc3RhbmRhcmQgTGlua2VkT2JqZWN0cyB3aWRnZXQgKHdpdGhvdXQgSVRTTSkgKi8KLkNvbGxhYkNhbmNlbEFwcG9pbnRtZW50LS1pbmxpbmUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDVweDsKICAgIHRvcDogNTAlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwp9CgovKiBFbnN1cmUgcGFyZW50IGNlbGwgaGFzIHJlbGF0aXZlIHBvc2l0aW9uaW5nIGFuZCBzcGFjZSBmb3IgYnV0dG9uICovCi5MaW5rVGFibGUgdGQuQ29sbGFiQ2FuY2VsQ2VsbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLXJpZ2h0OiA0MHB4Owp9CgovKiBVdGlsaXR5IGNsYXNzIHRvIGhpZGUgZWxlbWVudHMgKi8KLkNvbGxhYkhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBQcm92aWRlciBMb2dpbiBNZW51IEl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiUHJvdmlkZXJMb2dpbkl0ZW0sCi5Db2xsYWJQcm92aWRlckxvZ291dEl0ZW0gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxNXB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLkNvbGxhYlByb3ZpZGVyTG9naW5JdGVtOmhvdmVyLAouQ29sbGFiUHJvdmlkZXJMb2dvdXRJdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1ob3Zlci1iZywgI2Y1ZjVmNSk7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwp9CgouQ29sbGFiUHJvdmlkZXJMb2dpbkl0ZW0gaSwKLkNvbGxhYlByb3ZpZGVyTG9nb3V0SXRlbSBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgovKiBQcm92aWRlci1zcGVjaWZpYyBpY29uIGNvbG9ycyAqLwouQ29sbGFiUHJvdmlkZXJMb2dpbkl0ZW0gLmZhLXdpbmRvd3MgewogICAgY29sb3I6ICMwMDc4ZDQ7IC8qIE1pY3Jvc29mdCBibHVlICovCn0KCi5Db2xsYWJQcm92aWRlckxvZ2luSXRlbSAuZmEtZmxhc2sgewogICAgY29sb3I6ICM2Yzc1N2Q7IC8qIEdyYXkgZm9yIE1vY2sgKi8KfQoKLkNvbGxhYlByb3ZpZGVyTG9nb3V0SXRlbSBpIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCwgIzc3Nyk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBDb2xsYWJvcmF0aW9uIE1vZGFsIERpYWxvZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogU3R5bGVkIHJlcGxhY2VtZW50cyBmb3IgYnJvd3NlciBhbGVydCgpIGFuZCBjb25maXJtKCkgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogT3ZlcmxheSAqLwouQ29sbGFiRGlhbG9nLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgei1pbmRleDogMTAwMDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlOwp9CgouQ29sbGFiRGlhbG9nLW92ZXJsYXktLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKfQoKLkNvbGxhYkRpYWxvZy1vdmVybGF5LS1jbG9zaW5nIHsKICAgIG9wYWNpdHk6IDA7Cn0KCi8qIERpYWxvZyBDb250YWluZXIgKi8KLkNvbGxhYkRpYWxvZyB7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMzJweCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgbWluLXdpZHRoOiAzMjBweDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBtYXgtaGVpZ2h0OiA4MHZoOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpOwogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKfQoKLkNvbGxhYkRpYWxvZy1vdmVybGF5LS12aXNpYmxlIC5Db2xsYWJEaWFsb2cgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKfQoKLkNvbGxhYkRpYWxvZy1vdmVybGF5LS1jbG9zaW5nIC5Db2xsYWJEaWFsb2cgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTsKfQoKLyogRGlhbG9nIEhlYWRlciAqLwouQ29sbGFiRGlhbG9nX19oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7Cn0KCi5Db2xsYWJEaWFsb2dfX2ljb24gewogICAgZm9udC1zaXplOiAyMHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJEaWFsb2ctLWluZm8gLkNvbGxhYkRpYWxvZ19faWNvbiB7CiAgICBjb2xvcjogIzE3YTJiODsKfQoKLkNvbGxhYkRpYWxvZy0tc3VjY2VzcyAuQ29sbGFiRGlhbG9nX19pY29uIHsKICAgIGNvbG9yOiAjMjhhNzQ1Owp9CgouQ29sbGFiRGlhbG9nLS13YXJuaW5nIC5Db2xsYWJEaWFsb2dfX2ljb24sCi5Db2xsYWJEaWFsb2ctLWNvbmZpcm0gLkNvbGxhYkRpYWxvZ19faWNvbiB7CiAgICBjb2xvcjogI2YwYWQ0ZTsKfQoKLkNvbGxhYkRpYWxvZy0tZXJyb3IgLkNvbGxhYkRpYWxvZ19faWNvbiwKLkNvbGxhYkRpYWxvZy0tZGFuZ2VyIC5Db2xsYWJEaWFsb2dfX2ljb24gewogICAgY29sb3I6ICNkYzM1NDU7Cn0KCi5Db2xsYWJEaWFsb2dfX3RpdGxlIHsKICAgIGZsZXg6IDE7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKICAgIG1hcmdpbjogMDsKfQoKLkNvbGxhYkRpYWxvZ19fY2xvc2UgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM3NzcpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBmbGV4LXNocmluazogMDsKfQoKLkNvbGxhYkRpYWxvZ19fY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWhvdmVyLWJnLCAjZjVmNWY1KTsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCwgIzMzMyk7Cn0KCi8qIERpYWxvZyBCb2R5ICovCi5Db2xsYWJEaWFsb2dfX2JvZHkgewogICAgcGFkZGluZzogMjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5Db2xsYWJEaWFsb2dfX21lc3NhZ2UgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCi5Db2xsYWJEaWFsb2dfX2RldGFpbCB7CiAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkLCAjNzc3KTsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgd29yZC1icmVhazogbm9ybWFsOwogICAgbWF4LWhlaWdodDogMTUwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwp9CgovKiBEaWFsb2cgRm9vdGVyICovCi5Db2xsYWJEaWFsb2dfX2Zvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDE2cHggMjBweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7CiAgICBib3JkZXItcmFkaXVzOiAwIDAgNnB4IDZweDsKfQoKLyogRGlhbG9nIEJ1dHRvbnMgKi8KLkNvbGxhYkRpYWxvZ19fYnRuIHsKICAgIHBhZGRpbmc6IDEwcHggMjBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgIG1pbi13aWR0aDogODBweDsKfQoKLkNvbGxhYkRpYWxvZ19fYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZywgI2Y1ZjVmNSk7Cn0KCi5Db2xsYWJEaWFsb2dfX2J0bjpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoMjU1LCAxNTMsIDM0LCAwLjI1KTsKfQoKLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJEaWFsb2dfX2J0bi0tcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluay1ob3ZlciwgI2U4MCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyLCAjZTgwKTsKfQoKLkNvbGxhYkRpYWxvZ19fYnRuLS1zZWNvbmRhcnkgewogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQsICMzMzMpOwp9CgouQ29sbGFiRGlhbG9nX19idG4tLXNlY29uZGFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItaG92ZXItYmcsICNmNWY1ZjUpOwp9CgovKiBEYW5nZXIgdmFyaWFudCBmb3IgZGVzdHJ1Y3RpdmUgYWN0aW9ucyAqLwouQ29sbGFiRGlhbG9nLS1kYW5nZXIgLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5IHsKICAgIGJhY2tncm91bmQ6ICNkYzM1NDU7CiAgICBib3JkZXItY29sb3I6ICNkYzM1NDU7Cn0KCi5Db2xsYWJEaWFsb2ctLWRhbmdlciAuQ29sbGFiRGlhbG9nX19idG4tLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2M4MjMzMzsKICAgIGJvcmRlci1jb2xvcjogI2M4MjMzMzsKfQoKLyogRGlhbG9nIEFjdGlvbiBCdXR0b25zIChDb3B5IExpbmssIEpvaW4gTWVldGluZywgZXRjLikgKi8KLkNvbGxhYkRpYWxvZ19fYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luLXRvcDogMTZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLkNvbGxhYkRpYWxvZ19fYWN0aW9uQnRuIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwp9CgouQ29sbGFiRGlhbG9nX19hY3Rpb25CdG46aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWhvdmVyLWJnLCAjZjVmNWY1KTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKfQoKLkNvbGxhYkRpYWxvZ19fYWN0aW9uQnRuIGkgewogICAgZm9udC1zaXplOiAxNHB4Owp9CgovKiBQcmltYXJ5IGFjdGlvbiBidXR0b24gKGUuZy4sIEpvaW4gTWVldGluZykgKi8KLkNvbGxhYkRpYWxvZ19fYWN0aW9uQnRuLS1wcmltYXJ5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJEaWFsb2dfX2FjdGlvbkJ0bi0tcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluay1ob3ZlciwgI2U4MCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyLCAjZTgwKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiRGlhbG9nX19hY3Rpb25CdG4tLXByaW1hcnkgaSB7CiAgICBjb2xvcjogI2ZmZjsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIE93bmVyIEluZm8gUGFuZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NvbnRhaW5lciB7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsIHsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMDgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsLS1sb2FkaW5nIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM2NjYpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWwtLWxvYWRpbmcgaSB7CiAgICBtYXJnaW4tcmlnaHQ6IDZweDsKfQoKLyogUGFuZWwgSGVhZGVyICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9faGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19hdmF0YXIgewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9faW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19uYW1lUm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQsICMzMzMpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLyogQ2FsZW5kYXIgVG9nZ2xlIEJ1dHRvbiAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX3RvZ2dsZSB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCwgIzY2Nik7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cyBlYXNlOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdG9nZ2xlOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdG9nZ2xlIGkgewogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZTsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX190b2dnbGUtLWNvbGxhcHNlZCBpIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7Cn0KCi8qIEJhZGdlcyBpbiBoZWFkZXIgKFdvcmtMb2NhdGlvbikgLSBwdXNoIHRvIHJpZ2h0ICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9faGVhZGVyIC5Db2xsYWJXb3JrTG9jYXRpb24gewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEZpcnN0IGJhZGdlIGdldHMgYXV0byBtYXJnaW4gdG8gcHVzaCBiYWRnZXMgcmlnaHQgKHdoZW4gbm8gdG9nZ2xlKSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2luZm8gKyAuQ29sbGFiV29ya0xvY2F0aW9uIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgovKiBDYWxlbmRhciBXcmFwcGVyIChjb2xsYXBzaWJsZSkgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxlbmRhcldyYXBwZXIgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4zcyBlYXNlLCBvcGFjaXR5IDAuM3MgZWFzZTsKICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgb3BhY2l0eTogMTsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxlbmRhcldyYXBwZXItLWNvbGxhcHNlZCB7CiAgICBtYXgtaGVpZ2h0OiAwOwogICAgb3BhY2l0eTogMDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX190aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM2NjYpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLyogV2VlayBDYWxlbmRhciAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbGVuZGFyIHsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxIZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbE5hdiB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM2NjYpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBwYWRkaW5nOiAwOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbE5hdjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbE5hdjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxMYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKfQoKLyogQ2FsZW5kYXIgQm9keSAtIEZsZXggY29udGFpbmVyIGZvciBkYXkgbGFiZWxzICsgc2Nyb2xsYWJsZSB0aW1lbGluZSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbEJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7Cn0KCi8qIERheSBMYWJlbHMgQ29sdW1uIC0gU3RpY2t5IGxlZnQgc2lkZSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsc0NvbCB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsc0lubmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAzcHg7CiAgICBwYWRkaW5nOiAycHggMDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbEhlYWRlciB7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7Cn0KCi8qIERheSBMYWJlbCAoTW8gMjMpICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLyogVG9kYXkgaW5kaWNhdG9yIG9uIGRheSBsYWJlbCAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsLS10b2RheSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWwtLXRvZGF5IC5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TmFtZSwKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0tdG9kYXkgLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlOdW0gewogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0td2Vla2VuZCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwogICAgb3BhY2l0eTogMC44Owp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheU5hbWUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCwgIzY2Nik7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgd2lkdGg6IDIwcHg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TnVtIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQsICMzMzMpOwp9CgovKiBTY3JvbGxhYmxlIFRpbWVsaW5lIEFyZWEgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX190aW1lbGluZVNjcm9sbCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICNmZmY7Cn0KCi8qIEhvdXIgTGFiZWxzIFJvdyAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJMYWJlbHNSb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGhlaWdodDogMjhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsIHsKICAgIHdpZHRoOiAxNHB4OyAgLyogRWFjaCBoYWxmLWhvdXIgYmxvY2sgaXMgMTRweCAqLwogICAgZmxleC1zaHJpbms6IDA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM4ODgpOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHBhZGRpbmctbGVmdDogMXB4OwogICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgbW9ub3NwYWNlOwp9CgovKiBCb3JkZXIgb25seSBvbiBmdWxsIGhvdXIgbGFiZWxzIChldmVyeSAybmQgc2xvdCkgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyTGFiZWwtLWhvdXJTdGFydCB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyTGFiZWwtLWhvdXJTdGFydDpmaXJzdC1jaGlsZCB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKfQoKLyogRW1wdHkgcGxhY2Vob2xkZXIgZm9yIGFsaWdubWVudCAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJMYWJlbEVtcHR5IHsKICAgIHdpZHRoOiAxNHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIERheXMgR3JpZCAocm93cyBvZiBoYWxmLWhvdXIgYmxvY2tzKSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAzcHg7CiAgICBwYWRkaW5nOiAycHggMDsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgovKiBEYXkgUm93IChvbmUgcm93IG9mIGhhbGYtaG91ciBibG9ja3MpICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBoZWlnaHQ6IDI4cHg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93Omxhc3QtY2hpbGQgewogICAgLyogbm8gc3BlY2lhbCBzdHlsaW5nIG5lZWRlZCB3aXRoIGdhcCAqLwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdy0td2Vla2VuZCB7CiAgICBiYWNrZ3JvdW5kOiAjZjhmOGY4Owp9CgovKiBJbmRpdmlkdWFsIEhhbGYtSG91ciBCbG9jayAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jayB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjhweDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgYmFja2dyb3VuZDogI2U4ZjVlOTsgIC8qIExpZ2h0IGdyZWVuID0gZnJlZSAqLwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzIGVhc2U7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jazpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1yaWdodDogbm9uZTsKfQoKLyogRnVsbCBob3VyIHNlcGFyYXRvciAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jay0taG91clN0YXJ0IHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOwp9CgovKiBXb3JrIGhvdXJzICg4LTE4KSBzbGlnaHRseSBoaWdobGlnaHRlZCAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jay0td29ya0hvdXJzIHsKICAgIGJhY2tncm91bmQ6ICNjOGU2Yzk7ICAvKiBTbGlnaHRseSBkYXJrZXIgZ3JlZW4gZm9yIHdvcmsgaG91cnMgKi8KfQoKLyogQnVzeSBob3VyIGJsb2NrICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS1idXN5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1wcmVzZW5jZS1idXN5LCAjZDk1MzRmKSAhaW1wb3J0YW50Owp9CgovKiBIb3ZlciBlZmZlY3Qgb24gaG91ciBibG9ja3MgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2s6aG92ZXIgewogICAgZmlsdGVyOiBicmlnaHRuZXNzKDAuOSk7Cn0KCi8qIFdlZWtlbmQgcm93IGhvdXIgYmxvY2tzICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93LS13ZWVrZW5kIC5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrIHsKICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93LS13ZWVrZW5kIC5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS13b3JrSG91cnMgewogICAgYmFja2dyb3VuZDogI2U4ZThlODsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlSb3ctLXdlZWtlbmQgLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2stLWJ1c3kgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLXByZXNlbmNlLWJ1c3ksICNkOTUzNGYpICFpbXBvcnRhbnQ7Cn0KCi8qIFNjcm9sbGJhciBzdHlsaW5nIGZvciB0aW1lbGluZSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX3RpbWVsaW5lU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBoZWlnaHQ6IDhweDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX190aW1lbGluZVNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogI2YwZjBmMDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX190aW1lbGluZVNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX190aW1lbGluZVNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2FhYTsKfQoKLyogQ3VzdG9tZXJJbmZvIG1haW4gcm93IC0gaG92ZXIgdHJpZ2dlciBhcmVhIChhdmF0YXIsIG5hbWUsIHRpdGxlKSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvX19tYWluUm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgovKiBIb3ZlciBlZmZlY3Q6IHRleHQgdHVybnMgb3JhbmdlIG9uIG1haW4gcm93IGhvdmVyICovCi5Db2xsYWJDdXN0b21lckluZm9fX21haW5Sb3c6aG92ZXIgLkNvbGxhYlVzZXJCYWRnZV9fbmFtZSwKLkNvbGxhYkN1c3RvbWVySW5mb19fbWFpblJvdzpob3ZlciAuQ29sbGFiVXNlckJhZGdlX190aXRsZSB7CiAgICBjb2xvcjogI2ZmOTkyMjsKfQoKLyogV29yayBMb2NhdGlvbiBiYWRnZSBpbiBDdXN0b21lckluZm8gaW5mbyBhcmVhIC0gZml0cyBjb250ZW50LCBubyBzdHJldGNoICovCi5Db2xsYWJVc2VyQmFkZ2VfX2luZm8gLkNvbGxhYldvcmtMb2NhdGlvbiB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgbWFyZ2luLXRvcDogNHB4Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogRHluYW1pYyBDdXN0b21lciBJbmZvIFdpZGdldCAoVGlja2V0IENyZWF0ZSBQYWdlcykgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogRW1wdHkgc3RhdGUgd2lkZ2V0IG1vZGlmaWVyICovCi5Db2xsYWJDdXN0b21lckluZm9XaWRnZXQtLWVtcHR5IC5Db250ZW50IHsKICAgIHBhZGRpbmc6IDIwcHggMTVweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLyogUGxhY2Vob2xkZXIgc3R5bGluZyBmb3IgZW1wdHkgd2lkZ2V0ICovCi5Db2xsYWJDdXN0b21lckluZm9fX3BsYWNlaG9sZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgY29sb3I6ICM5OTk7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX3BsYWNlaG9sZGVyIGkgewogICAgZm9udC1zaXplOiA0OHB4OwogICAgY29sb3I6ICNjY2M7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX3BsYWNlaG9sZGVyIHNwYW4gewogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGNvbG9yOiAjNjY2Owp9CgouQ29sbGFiQ3VzdG9tZXJJbmZvX19wbGFjZWhvbGRlciBzbWFsbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogIzk5OTsKfQoKLyogTG9hZGluZyBzdGF0ZSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvX19sb2FkaW5nIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAzMHB4OwogICAgY29sb3I6ICM5OTk7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX2xvYWRpbmcgaSB7CiAgICBmb250LXNpemU6IDI0cHg7Cn0KCi8qIEVycm9yIHN0YXRlICovCi5Db2xsYWJDdXN0b21lckluZm9fX2Vycm9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxNXB4OwogICAgY29sb3I6ICNkOTUzNGY7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX2Vycm9yIGkgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogVGlja2V0IEluZm8gQXZhdGFycyAoT3duZXIvUmVzcG9uc2libGUgaW4gVGlja2V0LUluZm8gV2lkZ2V0KSAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgouQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyX19yb3c6aG92ZXIgLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX25hbWUgewogICAgY29sb3I6ICNmZjk5MjI7Cn0KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyX19hdmF0YXIgewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyX19hdmF0YXIgLkNvbGxhYkF2YXRhciB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyX19hdmF0YXIgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4OwogICAgYm90dG9tOiAtMXB4OwogICAgcmlnaHQ6IC0xcHg7CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2luZm8gewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fbmFtZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6ICMzMzM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKfQoKLyogRW5zdXJlIFZhbHVlIGVsZW1lbnQgZG9lc24ndCBhZGQgZXh0cmEgc3R5bGluZyAtIGNsYXNzIGlzIGFwcGxpZWQKICAgZGlyZWN0bHkgdG8gdGhlIHNwZWNpZmljIC5WYWx1ZSBlbGVtZW50IGJlaW5nIHJlcGxhY2VkLCBub3QgYSBzaGFyZWQKICAgYW5jZXN0b3IgKE93bmVyL1Jlc3BvbnNpYmxlL0N1c3RvbWVyIElEIGNhbiBiZSBzaWJsaW5ncyBpbiB0aGUgc2FtZQogICBmaWVsZHNldCwgc28gYSBzaGFyZWQtYW5jZXN0b3Igc2VsZWN0b3Igd291bGQgYWZmZWN0IGFsbCBvZiB0aGVtKS4gKi8KLlZhbHVlLkNvbGxhYlRpY2tldEluZm8tLXByb2Nlc3NlZCB7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwp9CgovKiBSZW1vdmUgbGluayBzdHlsaW5nIGZyb20gbmF0aXZlIGVsZW1lbnRzIHdoZW4gcmVwbGFjZWQgKi8KLlZhbHVlLkNvbGxhYlRpY2tldEluZm8tLXByb2Nlc3NlZCBhIHsKICAgIGRpc3BsYXk6IGNvbnRlbnRzOwp9Cg==</File>

        <!-- Templates -->
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/Collaboration/Init.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gSW5pdGlhbGl6YXRpb24gVGVtcGxhdGUKCiAgICBUaGlzIHRlbXBsYXRlIGluaXRpYWxpemVzIHRoZSBDb2xsYWJvcmF0aW9uIEphdmFTY3JpcHQgbW9kdWxlcyB3aXRoCiAgICBjb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnLiBJdCBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0aGUgcGFnZQogICAgaGVhZCB2aWEgYW4gT3V0cHV0IEZpbHRlci4KCiAgICBWYXJpYWJsZXMgcHJvdmlkZWQgYnkgdGhlIE91dHB1dCBGaWx0ZXI6CiAgICAtIERhdGEuUHJvdmlkZXIgICAgICAgICA6IEFjdGl2ZSBwcm92aWRlciBuYW1lIChNMzY1LCBNb2NrKQogICAgLSBEYXRhLkZhbGxiYWNrUHJvdmlkZXIgOiBGYWxsYmFjayBwcm92aWRlciBuYW1lIChabnVueSwgZW1wdHkpCiAgICAtIERhdGEuVGVuYW50SUQgICAgICAgICA6IE1pY3Jvc29mdCAzNjUgVGVuYW50IElECiAgICAtIERhdGEuQ2xpZW50SUQgICAgICAgICA6IE1pY3Jvc29mdCAzNjUgQ2xpZW50IElECiAgICAtIERhdGEuUmVkaXJlY3RVUkkgICAgICA6IE9BdXRoIFJlZGlyZWN0IFVSSQogICAgLSBEYXRhLkVuYWJsZUF2YXRhciAgICAgOiAxLzAKICAgIC0gRGF0YS5FbmFibGVQcmVzZW5jZSAgIDogMS8wCiAgICAtIERhdGEuRW5hYmxlSG92ZXJDYXJkcyA6IDEvMAogICAgLSBEYXRhLkVuYWJsZUNoYXQgICAgICAgOiAxLzAKICAgIC0gRGF0YS5FbmFibGVDYWxsICAgICAgIDogMS8wCiAgICAtIERhdGEuRW5hYmxlTWVldGluZ3MgICA6IDEvMAogICAgLSBEYXRhLkVuYWJsZU93bmVySW5mb1BhbmVsIDogMS8wCiAgICAtIERhdGEuT3duZXJFbWFpbCAgICAgICA6IE93bmVyIGVtYWlsIChvbiBBZ2VudFRpY2tldFpvb20pCiAgICAtIERhdGEuT3duZXJOYW1lICAgICAgICA6IE93bmVyIG5hbWUgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5Pd25lcklEICAgICAgICAgIDogT3duZXIgSUQgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5SZXNwb25zaWJsZUVtYWlsIDogUmVzcG9uc2libGUgZW1haWwgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5SZXNwb25zaWJsZU5hbWUgIDogUmVzcG9uc2libGUgbmFtZSAob24gQWdlbnRUaWNrZXRab29tKQogICAgLSBEYXRhLlJlc3BvbnNpYmxlSUQgICAgOiBSZXNwb25zaWJsZSBJRCAob24gQWdlbnRUaWNrZXRab29tKQogICAgLSBEYXRhLlNob3dJbkhlYWRlciAgICAgOiAxLzAKICAgIC0gRGF0YS5TaG93SW5UaWNrZXRJbmZvIDogMS8wCiAgICAtIERhdGEuU2hvd0luQXJ0aWNsZXMgICA6IDEvMAogICAgLSBEYXRhLlNob3dDdXN0b21lckluZm9XaWRnZXQgOiAxLzAKICAgIC0gRGF0YS5IaWRlTmF0aXZlQ3VzdG9tZXJJbmZvIDogMS8wCiAgICAtIERhdGEuRHluYW1pY0N1c3RvbWVyU2VsZWN0aW9uIDogMS8wIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlcykKICAgIC0gRGF0YS5DYWNoZUF2YXRhclRUTCAgIDogc2Vjb25kcwogICAgLSBEYXRhLkNhY2hlUHJlc2VuY2VUVEwgOiBzZWNvbmRzCiAgICAtIERhdGEuQ2FjaGVQcm9maWxlVFRMICA6IHNlY29uZHMKICAgIC0gRGF0YS5Vc2VyRW1haWwgICAgICAgIDogQ3VycmVudCBhZ2VudCdzIGVtYWlsIGFkZHJlc3MKICAgIC0gRGF0YS5DdXN0b21lckVtYWlsICAgIDogQ3VzdG9tZXIgZW1haWwgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5DdXN0b21lckxvZ2luICAgIDogQ3VzdG9tZXIgbG9naW4gKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5DdXN0b21lck5hbWUgICAgIDogQ3VzdG9tZXIgbmFtZSAob24gQWdlbnRUaWNrZXRab29tKQolXQoKWyUjIE1TQUwuanMgaXMgbG9hZGVkIHZpYSBabnVueSBMb2FkZXIgKENvbGxhYm9yYXRpb24ueG1sKSB0byBlbnN1cmUgY29ycmVjdCBsb2FkIG9yZGVyICVdClslIyBGYWxsYmFjazogTG9hZCBNU0FMLmpzIHZpYSBzY3JpcHQgdGFnIGlmIG5vdCBhbHJlYWR5IGxvYWRlZCAoZS5nLiwgbG9hZGVyIGNhY2hlIGlzc3VlKSAlXQpbJSBJRiBEYXRhLlByb3ZpZGVyID09ICdNMzY1JyAlXQo8c2NyaXB0PgppZiAodHlwZW9mIG1zYWwgPT09ICd1bmRlZmluZWQnKSB7CiAgICBkb2N1bWVudC53cml0ZSgnPHNjcmlwdCBzcmM9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXWpzL3RoaXJkcGFydHkvbXNhbC1icm93c2VyLTQuMjcuMC9tc2FsLWJyb3dzZXIubWluLmpzIj48XC9zY3JpcHQ+Jyk7Cn0KPC9zY3JpcHQ+ClslIEVORCAlXQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBDb2xsYWJvcmF0aW9uIENvbmZpZ3VyYXRpb24gLSB3YWl0IGZvciBDb3JlLkNvbmZpZyB0byBiZSBhdmFpbGFibGUKICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgQ29sbGFib3JhdGlvbkNvbmZpZyA9IHsKICAgICAgICAgICAgUHJvdmlkZXI6ICdbJSBEYXRhLlByb3ZpZGVyIHwgaHRtbCAlXScsCiAgICAgICAgICAgIEZhbGxiYWNrUHJvdmlkZXI6ICdbJSBEYXRhLkZhbGxiYWNrUHJvdmlkZXIgfCBodG1sICVdJywKICAgICAgICAgICAgUHJvdmlkZXJNMzY1OiB7CiAgICAgICAgICAgICAgICBUZW5hbnRJRDogJ1slIERhdGEuVGVuYW50SUQgfCBodG1sICVdJywKICAgICAgICAgICAgICAgIENsaWVudElEOiAnWyUgRGF0YS5DbGllbnRJRCB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgUmVkaXJlY3RVUkk6ICdbJSBEYXRhLlJlZGlyZWN0VVJJIHwgaHRtbCAlXScKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRW5hYmxlQXZhdGFyOiBbJSBJRiBEYXRhLkVuYWJsZUF2YXRhciAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIEVuYWJsZVByZXNlbmNlOiBbJSBJRiBEYXRhLkVuYWJsZVByZXNlbmNlICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlSG92ZXJDYXJkczogWyUgSUYgRGF0YS5FbmFibGVIb3ZlckNhcmRzICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlQ2hhdDogWyUgSUYgRGF0YS5FbmFibGVDaGF0ICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlQ2FsbDogWyUgSUYgRGF0YS5FbmFibGVDYWxsICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlTWVldGluZ3M6IFslIElGIERhdGEuRW5hYmxlTWVldGluZ3MgJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICBFbmFibGVPd25lckluZm9QYW5lbDogWyUgSUYgRGF0YS5FbmFibGVPd25lckluZm9QYW5lbCAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIFNob3dJbkhlYWRlcjogWyUgSUYgRGF0YS5TaG93SW5IZWFkZXIgJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICBTaG93SW5UaWNrZXRJbmZvOiBbJSBJRiBEYXRhLlNob3dJblRpY2tldEluZm8gJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICBTaG93SW5BcnRpY2xlczogWyUgSUYgRGF0YS5TaG93SW5BcnRpY2xlcyAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIFNob3dDdXN0b21lckluZm9XaWRnZXQ6IFslIElGIERhdGEuU2hvd0N1c3RvbWVySW5mb1dpZGdldCAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIEhpZGVOYXRpdmVDdXN0b21lckluZm86IFslIElGIERhdGEuSGlkZU5hdGl2ZUN1c3RvbWVySW5mbyAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIENhY2hlOiB7CiAgICAgICAgICAgICAgICBBdmF0YXJUVEw6IFslIERhdGEuQ2FjaGVBdmF0YXJUVEwgfHwgMzYwMCAlXSwKICAgICAgICAgICAgICAgIFByZXNlbmNlVFRMOiBbJSBEYXRhLkNhY2hlUHJlc2VuY2VUVEwgfHwgNjAgJV0sCiAgICAgICAgICAgICAgICBQcm9maWxlVFRMOiBbJSBEYXRhLkNhY2hlUHJvZmlsZVRUTCB8fCA4NjQwMCAlXQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDdXJyZW50IGFnZW50IGRhdGEKICAgICAgICAgICAgVXNlckVtYWlsOiAnWyUgRGF0YS5Vc2VyRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgVXNlckZ1bGxuYW1lOiAnWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdJywKICAgICAgICAgICAgLy8gQ3VzdG9tZXIgZGF0YSAob25seSBvbiBBZ2VudFRpY2tldFpvb20pCiAgICAgICAgICAgIEN1c3RvbWVyRW1haWw6ICdbJSBEYXRhLkN1c3RvbWVyRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgQ3VzdG9tZXJMb2dpbjogJ1slIERhdGEuQ3VzdG9tZXJMb2dpbiB8IGh0bWwgJV0nLAogICAgICAgICAgICBDdXN0b21lck5hbWU6ICdbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0nLAogICAgICAgICAgICAvLyBUaWNrZXQgb3duZXJzaGlwIChmb3Igc2hvd2luZyBNZWV0aW5nIGJ1dHRvbiBvbmx5IHRvIG93bmVyKQogICAgICAgICAgICBJc1RpY2tldE93bmVyOiBbJSBJRiBEYXRhLklzVGlja2V0T3duZXIgJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICAvLyBPd25lciBhbmQgUmVzcG9uc2libGUgZGF0YSAob25seSBvbiBBZ2VudFRpY2tldFpvb20pCiAgICAgICAgICAgIE93bmVyRW1haWw6ICdbJSBEYXRhLk93bmVyRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgT3duZXJOYW1lOiAnWyUgRGF0YS5Pd25lck5hbWUgfCBodG1sICVdJywKICAgICAgICAgICAgT3duZXJJRDogWyUgRGF0YS5Pd25lcklEIHx8IDAgJV0sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRW1haWw6ICdbJSBEYXRhLlJlc3BvbnNpYmxlRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgUmVzcG9uc2libGVOYW1lOiAnWyUgRGF0YS5SZXNwb25zaWJsZU5hbWUgfCBodG1sICVdJywKICAgICAgICAgICAgUmVzcG9uc2libGVJRDogWyUgRGF0YS5SZXNwb25zaWJsZUlEIHx8IDAgJV0sCiAgICAgICAgICAgIC8vIER5bmFtaWMgY3VzdG9tZXIgc2VsZWN0aW9uIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlczogQWdlbnRUaWNrZXRQaG9uZSwgQWdlbnRUaWNrZXRFbWFpbCwgQWdlbnRUaWNrZXRDdXN0b21lcikKICAgICAgICAgICAgRHluYW1pY0N1c3RvbWVyU2VsZWN0aW9uOiBbJSBJRiBEYXRhLkR5bmFtaWNDdXN0b21lclNlbGVjdGlvbiAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0KICAgICAgICB9OwoKICAgICAgICAvLyBGdW5jdGlvbiB0byBpbml0aWFsaXplIHdoZW4gcmVhZHkKICAgICAgICBmdW5jdGlvbiBJbml0Q29sbGFib3JhdGlvbigpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBDb3JlICE9PSAndW5kZWZpbmVkJyAmJiBDb3JlLkNvbmZpZyAmJiBDb3JlLkNvbmZpZy5TZXQpIHsKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLlNldCgnQ29sbGFib3JhdGlvbicsIENvbGxhYm9yYXRpb25Db25maWcpOwoKICAgICAgICAgICAgICAgIC8vIExvYWQgdHJhbnNsYXRpb25zIGZvciBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICBpZiAoQ29yZS5MYW5ndWFnZSAmJiBDb3JlLkxhbmd1YWdlLkxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLkxvYWQoe30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3VzdG9tZXIgSW5mbyBXaWRnZXQKICAgICAgICAgICAgICAgICAgICAgICAgJ09wZW4gVGlja2V0cyAoQ3VzdG9tZXIpJzogJ1slIFRyYW5zbGF0ZSgiT3BlbiBUaWNrZXRzIChDdXN0b21lcikiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT3BlbiBUaWNrZXRzIChVc2VyKSc6ICdbJSBUcmFuc2xhdGUoIk9wZW4gVGlja2V0cyAoVXNlcikiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXIgSW5mb3JtYXRpb24nOiAnWyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgJ0NoYXQnOiAnWyUgVHJhbnNsYXRlKCJDaGF0IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGwnOiAnWyUgVHJhbnNsYXRlKCJDYWxsIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ01lZXRpbmcnOiAnWyUgVHJhbnNsYXRlKCJNZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1RlYW1zIENoYXQnOiAnWyUgVHJhbnNsYXRlKCJUZWFtcyBDaGF0IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1RlYW1zIENhbGwnOiAnWyUgVHJhbnNsYXRlKCJUZWFtcyBDYWxsIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1NjaGVkdWxlIE1lZXRpbmcnOiAnWyUgVHJhbnNsYXRlKCJTY2hlZHVsZSBNZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1N0YXJ0IENoYXQnOiAnWyUgVHJhbnNsYXRlKCJTdGFydCBDaGF0IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1NlbmQgRW1haWwnOiAnWyUgVHJhbnNsYXRlKCJTZW5kIEVtYWlsIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGwgUGhvbmUnOiAnWyUgVHJhbnNsYXRlKCJDYWxsIFBob25lIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGwgTW9iaWxlJzogJ1slIFRyYW5zbGF0ZSgiQ2FsbCBNb2JpbGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnTWVldGluZyBzY2hlZHVsaW5nIHJlcXVpcmVzIE1pY3Jvc29mdCAzNjUgbG9naW4uJzogJ1slIFRyYW5zbGF0ZSgiTWVldGluZyBzY2hlZHVsaW5nIHJlcXVpcmVzIE1pY3Jvc29mdCAzNjUgbG9naW4uIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29yayBMb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAnV29yayBsb2NhdGlvbic6ICdbJSBUcmFuc2xhdGUoIldvcmsgbG9jYXRpb24iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT2ZmaWNlJzogJ1slIFRyYW5zbGF0ZSgiT2ZmaWNlIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbW90ZSc6ICdbJSBUcmFuc2xhdGUoIlJlbW90ZSIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lIG9mZic6ICdbJSBUcmFuc2xhdGUoIlRpbWUgb2ZmIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0IG9mIE9mZmljZQogICAgICAgICAgICAgICAgICAgICAgICAnT3V0IG9mIE9mZmljZSc6ICdbJSBUcmFuc2xhdGUoIk91dCBvZiBPZmZpY2UiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnU2NoZWR1bGVkIEFic2VuY2UnOiAnWyUgVHJhbnNsYXRlKCJTY2hlZHVsZWQgQWJzZW5jZSIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXNlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICdBdmFpbGFibGUnOiAnWyUgVHJhbnNsYXRlKCJBdmFpbGFibGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQnVzeSc6ICdbJSBUcmFuc2xhdGUoIkJ1c3kiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQXdheSc6ICdbJSBUcmFuc2xhdGUoIkF3YXkiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRG8gbm90IGRpc3R1cmInOiAnWyUgVHJhbnNsYXRlKCJEbyBub3QgZGlzdHVyYiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdCZSByaWdodCBiYWNrJzogJ1slIFRyYW5zbGF0ZSgiQmUgcmlnaHQgYmFjayIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdPZmZsaW5lJzogJ1slIFRyYW5zbGF0ZSgiT2ZmbGluZSIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJzogJ1slIFRyYW5zbGF0ZSgiVW5rbm93biIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdJbiBhIGNhbGwnOiAnWyUgVHJhbnNsYXRlKCJJbiBhIGNhbGwiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSW4gYSBtZWV0aW5nJzogJ1slIFRyYW5zbGF0ZSgiSW4gYSBtZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1ByZXNlbnRpbmcnOiAnWyUgVHJhbnNsYXRlKCJQcmVzZW50aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVldGluZyBTY2hlZHVsZXIgRGlhbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICdTY2hlZHVsZSBBcHBvaW50bWVudCc6ICdbJSBUcmFuc2xhdGUoIlNjaGVkdWxlIEFwcG9pbnRtZW50IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0F0dGVuZGVlcyc6ICdbJSBUcmFuc2xhdGUoIkF0dGVuZGVlcyIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JzogJ1slIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdNZWV0aW5nIFR5cGUnOiAnWyUgVHJhbnNsYXRlKCJNZWV0aW5nIFR5cGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnVGVhbXMgTWVldGluZyc6ICdbJSBUcmFuc2xhdGUoIlRlYW1zIE1lZXRpbmciKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT24tc2l0ZSc6ICdbJSBUcmFuc2xhdGUoIk9uLXNpdGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT24tc2l0ZSBNZWV0aW5nJzogJ1slIFRyYW5zbGF0ZSgiT24tc2l0ZSBNZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0xvY2F0aW9uJzogJ1slIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRW50ZXIgbWVldGluZyBsb2NhdGlvbi4uLic6ICdbJSBUcmFuc2xhdGUoIkVudGVyIG1lZXRpbmcgbG9jYXRpb24uLi4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRHVyYXRpb24nOiAnWyUgVHJhbnNsYXRlKCJEdXJhdGlvbiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdNaW4nOiAnWyUgVHJhbnNsYXRlKCJNaW4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZSc6ICdbJSBUcmFuc2xhdGUoIkRhdGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQXZhaWxhYmxlIFRpbWVzJzogJ1slIFRyYW5zbGF0ZSgiQXZhaWxhYmxlIFRpbWVzIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0xvYWRpbmcgYXZhaWxhYmxlIHRpbWVzLi4uJzogJ1slIFRyYW5zbGF0ZSgiTG9hZGluZyBhdmFpbGFibGUgdGltZXMuLi4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT25seSB0aW1lcyB3aGVuIGJvdGggYXR0ZW5kZWVzIGFyZSBhdmFpbGFibGUgYXJlIHNob3duLic6ICdbJSBUcmFuc2xhdGUoIk9ubHkgdGltZXMgd2hlbiBib3RoIGF0dGVuZGVlcyBhcmUgYXZhaWxhYmxlIGFyZSBzaG93bi4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuJzogJ1slIFRyYW5zbGF0ZSgiTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIGF2YWlsYWJpbGl0eSBkYXRhLic6ICdbJSBUcmFuc2xhdGUoIkZhaWxlZCB0byBsb2FkIGF2YWlsYWJpbGl0eSBkYXRhLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGUgQXBwb2ludG1lbnQnOiAnWyUgVHJhbnNsYXRlKCJDcmVhdGUgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRpbmcuLi4nOiAnWyUgVHJhbnNsYXRlKCJDcmVhdGluZy4uLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDYW5jZWwnOiAnWyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT3duZXInOiAnWyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZSc6ICdbJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyJzogJ1slIFRyYW5zbGF0ZSgiQ3VzdG9tZXIiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWV0aW5nIFN1Y2Nlc3MgRGlhbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjcmVhdGVkJzogJ1slIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgY3JlYXRlZCIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEnOiAnWyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT24tc2l0ZSBhcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEnOiAnWyUgVHJhbnNsYXRlKCJPbi1zaXRlIGFwcG9pbnRtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdKb2luIFVSTCc6ICdbJSBUcmFuc2xhdGUoIkpvaW4gVVJMIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvcHkgTGluayc6ICdbJSBUcmFuc2xhdGUoIkNvcHkgTGluayIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3BpZWQhJzogJ1slIFRyYW5zbGF0ZSgiQ29waWVkISIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdKb2luIE1lZXRpbmcnOiAnWyUgVHJhbnNsYXRlKCJKb2luIE1lZXRpbmciKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBvbi1zaXRlIG1lZXRpbmcuJzogJ1slIFRyYW5zbGF0ZSgiUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBvbi1zaXRlIG1lZXRpbmcuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBjcmVhdGUgbWVldGluZy4nOiAnWyUgVHJhbnNsYXRlKCJGYWlsZWQgdG8gY3JlYXRlIG1lZXRpbmcuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIHRpY2tldCBkYXRhLic6ICdbJSBUcmFuc2xhdGUoIkZhaWxlZCB0byBsb2FkIHRpY2tldCBkYXRhLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDYWxlbmRhciBldmVudCBjcmVhdGVkLCBidXQgWm51bnkgYXBwb2ludG1lbnQgZmFpbGVkLic6ICdbJSBUcmFuc2xhdGUoIkNhbGVuZGFyIGV2ZW50IGNyZWF0ZWQsIGJ1dCBabnVueSBhcHBvaW50bWVudCBmYWlsZWQuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gQ2FsZW5kYXIgV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgICAnTm8gQ2FsZW5kYXIgQ29uZmlndXJlZCc6ICdbJSBUcmFuc2xhdGUoIk5vIENhbGVuZGFyIENvbmZpZ3VyZWQiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnTm8gY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgcXVldWUgJXMuJzogJ1slIFRyYW5zbGF0ZSgiTm8gY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgcXVldWUgJXMuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvciB0byBjb25maWd1cmUgYSBjYWxlbmRhciBtYXBwaW5nIGZvciB0aGlzIHF1ZXVlIGluIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiAoQ29sbGFib3JhdGlvbjo6UXVldWVDYWxlbmRhck1hcHBpbmcpLic6ICdbJSBUcmFuc2xhdGUoIlBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvciB0byBjb25maWd1cmUgYSBjYWxlbmRhciBtYXBwaW5nIGZvciB0aGlzIHF1ZXVlIGluIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiAoQ29sbGFib3JhdGlvbjo6UXVldWVDYWxlbmRhck1hcHBpbmcpLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcG9pbnRtZW50IENhbmNlbGxhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAnQ2FuY2VsIEFwcG9pbnRtZW50JzogJ1slIFRyYW5zbGF0ZSgiQ2FuY2VsIEFwcG9pbnRtZW50IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgdGhpcyBhcHBvaW50bWVudD8gQXR0ZW5kZWVzIHdpbGwgYmUgbm90aWZpZWQuJzogJ1slIFRyYW5zbGF0ZSgiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCB0aGlzIGFwcG9pbnRtZW50PyBBdHRlbmRlZXMgd2lsbCBiZSBub3RpZmllZC4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnWWVzLCBjYW5jZWwnOiAnWyUgVHJhbnNsYXRlKCJZZXMsIGNhbmNlbCIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjYW5jZWxsZWQuIEF0dGVuZGVlcyBoYXZlIGJlZW4gbm90aWZpZWQuJzogJ1slIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgY2FuY2VsbGVkLiBBdHRlbmRlZXMgaGF2ZSBiZWVuIG5vdGlmaWVkLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjYW5jZWxsZWQuJzogJ1slIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgY2FuY2VsbGVkLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdabnVueSBhcHBvaW50bWVudCBkZWxldGVkLCBidXQgZmFpbGVkIHRvIGNhbmNlbCBPdXRsb29rIGV2ZW50Lic6ICdbJSBUcmFuc2xhdGUoIlpudW55IGFwcG9pbnRtZW50IGRlbGV0ZWQsIGJ1dCBmYWlsZWQgdG8gY2FuY2VsIE91dGxvb2sgZXZlbnQuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBjYW5jZWwgYXBwb2ludG1lbnQuJzogJ1slIFRyYW5zbGF0ZSgiRmFpbGVkIHRvIGNhbmNlbCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBEeW5hbWljIEN1c3RvbWVyIFNlbGVjdGlvbiAodGlja2V0IGNyZWF0ZSBwYWdlcykKICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1c3RvbWVyIHNlbGVjdGVkJzogJ1slIFRyYW5zbGF0ZSgiTm8gY3VzdG9tZXIgc2VsZWN0ZWQiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnU2VsZWN0IGEgY3VzdG9tZXIgdG8gc2VlIGRldGFpbHMnOiAnWyUgVHJhbnNsYXRlKCJTZWxlY3QgYSBjdXN0b21lciB0byBzZWUgZGV0YWlscyIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gRXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICdDb2xsYWJvcmF0aW9uIEFkZC1vbjonOiAnWyUgVHJhbnNsYXRlKCJDb2xsYWJvcmF0aW9uIEFkZC1vbjoiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnbm90IGNvbmZpZ3VyZWQuJzogJ1slIFRyYW5zbGF0ZSgibm90IGNvbmZpZ3VyZWQuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ09wZW4gc2V0dGluZ3MnOiAnWyUgVHJhbnNsYXRlKCJPcGVuIHNldHRpbmdzIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci4nOiAnWyUgVHJhbnNsYXRlKCJQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0Nsb3NlIHRoaXMgbWVzc2FnZSc6ICdbJSBUcmFuc2xhdGUoIkNsb3NlIHRoaXMgbWVzc2FnZSIpIHwgaHRtbCAlXScKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQ29yZS5BZ2VudCAmJiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkluaXQpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uSW5pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gaW5pdGlhbGl6ZSB3aGVuIERPTSBpcyByZWFkeQogICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIEluaXRDb2xsYWJvcmF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBET00gYWxyZWFkeSBsb2FkZWQsIGJ1dCBDb3JlLkNvbmZpZyBtaWdodCBub3QgYmUgcmVhZHkgeWV0CiAgICAgICAgICAgIC8vIFVzZSBhIHNtYWxsIGRlbGF5IHRvIGVuc3VyZSBabnVueSBjb3JlIEpTIGlzIGxvYWRlZAogICAgICAgICAgICBzZXRUaW1lb3V0KEluaXRDb2xsYWJvcmF0aW9uLCAxMDApOwogICAgICAgIH0KICAgIH0pKCk7Ci8vXV0+PC9zY3JpcHQ+Cg==</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/Collaboration/LoginButton.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gSGVhZGVyIExvZ2luIEJ1dHRvbiBUZW1wbGF0ZQoKICAgIFRoaXMgdGVtcGxhdGUgcmVuZGVycyB0aGUgbG9naW4gYnV0dG9uIGFuZCB1c2VyIGF2YXRhciBpbiB0aGUgaGVhZGVyLgogICAgVGhlIGFjdHVhbCBsb2dpYyBpcyBoYW5kbGVkIGJ5IEphdmFTY3JpcHQgKENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSSkuCiVdCgo8ZGl2IGlkPSJDb2xsYWJIZWFkZXJMb2dpbiIgY2xhc3M9IkNvbGxhYkhlYWRlckxvZ2luIENvbGxhYkhlYWRlckxvZ2luLS1ub3Rsb2dnZWRpbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnQ2xpY2sgdG8gbG9naW4gd2l0aCB5b3VyIE1pY3Jvc29mdCAzNjUgYWNjb3VudCcpIHwgaHRtbCAlXSI+CiAgICA8ZGl2IGNsYXNzPSJDb2xsYWJBdmF0YXIgQ29sbGFiQXZhdGFyLS1zbWFsbCBDb2xsYWJIZWFkZXJMb2dpbl9fYXZhdGFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXVzZXIiPjwvaT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhlYWRlckxvZ2luX190ZXh0Ij5bJSBUcmFuc2xhdGUoJ0xvZ2luIHdpdGggTWljcm9zb2Z0JykgfCBodG1sICVdPC9zcGFuPgo8L2Rpdj4K</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/Collaboration/PersonCard.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gUGVyc29uIENhcmQgKEhvdmVyIENhcmQpIFRlbXBsYXRlCgogICAgVGhpcyB0ZW1wbGF0ZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGhvdmVyIGNhcmQgc2hvd24gd2hlbgogICAgaG92ZXJpbmcgb3ZlciBhbiBhdmF0YXIuIFRoZSBjb250ZW50IGlzIHBvcHVsYXRlZCBkeW5hbWljYWxseQogICAgYnkgSmF2YVNjcmlwdCBiYXNlZCBvbiBwcm9maWxlIGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIuCgogICAgTm90ZTogVGhpcyB0ZW1wbGF0ZSBzZXJ2ZXMgYXMgYSByZWZlcmVuY2UuIFRoZSBhY3R1YWwgaG92ZXIgY2FyZAogICAgaXMgY3JlYXRlZCBkeW5hbWljYWxseSBieSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkuanMKJV0KCjxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZCI+CiAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2hlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29sbGFiQXZhdGFyIENvbGxhYkF2YXRhci0tbGFyZ2UiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrIj4/PzwvZGl2PgogICAgICAgICAgICA8IS0tIEF2YXRhciBpbWFnZSBsb2FkZWQgZHluYW1pY2FsbHkgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYlByZXNlbmNlIENvbGxhYlByZXNlbmNlLS11bmtub3duIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2luZm8iPgogICAgICAgICAgICA8aDMgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbmFtZSI+WyUgRGF0YS5EaXNwbGF5TmFtZSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICA8cCBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX190aXRsZSI+WyUgRGF0YS5Kb2JUaXRsZSB8IGh0bWwgJV08L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2JvZHkiPgogICAgICAgIFslIElGIERhdGEuRGVwYXJ0bWVudCAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnRGVwYXJ0bWVudCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPlslIERhdGEuRGVwYXJ0bWVudCB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIFslIElGIERhdGEuTWFuYWdlciAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnTWFuYWdlcicpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbWFuYWdlciIgZGF0YS1lbWFpbD0iWyUgRGF0YS5NYW5hZ2VyRW1haWwgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk1hbmFnZXIgfCBodG1sICVdIDxpIGNsYXNzPSJmYSBmYS1leHRlcm5hbC1saW5rIj48L2k+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICBbJSBFTkQgJV0KCiAgICAgICAgWyUgSUYgRGF0YS5PZmZpY2UgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX3JvdyI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2xhYmVsIj5bJSBUcmFuc2xhdGUoJ09mZmljZScpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPlslIERhdGEuT2ZmaWNlIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICBbJSBFTkQgJV0KCiAgICAgICAgWyUgSUYgRGF0YS5QaG9uZSAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnUGhvbmUnKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX3ZhbHVlIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InRlbDpbJSBEYXRhLlBob25lIHwgdXJpICVdIj5bJSBEYXRhLlBob25lIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIFslIEVORCAlXQoKICAgICAgICBbJSBJRiBEYXRhLk1vYmlsZSAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnTW9iaWxlJykgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX192YWx1ZSI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJ0ZWw6WyUgRGF0YS5Nb2JpbGUgfCB1cmkgJV0iPlslIERhdGEuTW9iaWxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIFslIEVORCAlXQoKICAgICAgICBbJSBJRiBEYXRhLkVtYWlsICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX19yb3ciPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX19sYWJlbCI+WyUgVHJhbnNsYXRlKCdFbWFpbCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPgogICAgICAgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOlslIERhdGEuRW1haWwgfCB1cmkgJV0iPlslIERhdGEuRW1haWwgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlN0YXR1czwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUgQ29sbGFiSG92ZXJDYXJkX19wcmVzZW5jZSI+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoJ1Vua25vd24nKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX19mb290ZXIiPgogICAgICAgIFslIElGIERhdGEuRW1haWwgJV0KICAgICAgICA8YSBocmVmPSJtYWlsdG86WyUgRGF0YS5FbWFpbCB8IHVyaSAlXSIgY2xhc3M9IkNvbGxhYkJ1dHRvbiBDb2xsYWJCdXR0b24tLWljb24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ1NlbmQgRW1haWwnKSB8IGh0bWwgJV0iPgogICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZW52ZWxvcGUiPjwvaT4KICAgICAgICA8L2E+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIFslIElGIERhdGEuQ2hhdExpbmsgJV0KICAgICAgICA8YSBocmVmPSJbJSBEYXRhLkNoYXRMaW5rIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdTdGFydCBDaGF0JykgfCBodG1sICVdIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvbW1lbnQiPjwvaT4KICAgICAgICA8L2E+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIFslIElGIERhdGEuQ2FsbExpbmsgJV0KICAgICAgICA8YSBocmVmPSJbJSBEYXRhLkNhbGxMaW5rIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdTdGFydCBDYWxsJykgfCBodG1sICVdIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBob25lIj48L2k+CiAgICAgICAgPC9hPgogICAgICAgIFslIEVORCAlXQoKICAgICAgICBbJSBJRiBEYXRhLlBob25lICVdCiAgICAgICAgPGEgaHJlZj0idGVsOlslIERhdGEuUGhvbmUgfCB1cmkgJV0iIGNsYXNzPSJDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdDYWxsIFBob25lJykgfCBodG1sICVdIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBob25lLXNxdWFyZSI+PC9pPgogICAgICAgIDwvYT4KICAgICAgICBbJSBFTkQgJV0KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentTicketZoom/CollaborationWidget.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gVGlja2V0IFpvb20gV2lkZ2V0IFRlbXBsYXRlCgogICAgVGhpcyB0ZW1wbGF0ZSByZW5kZXJzIHRoZSBjb2xsYWJvcmF0aW9uIGFjdGlvbnMgd2lkZ2V0IGluIHRoZQogICAgdGlja2V0IHpvb20gc2lkZWJhci4gSXQgc2hvd3MgdGhlIGN1c3RvbWVyIGF2YXRhciBhbmQgcHJvdmlkZXMKICAgIHF1aWNrIGFjdGlvbiBidXR0b25zIGZvciBjaGF0LCBjYWxsLCBhbmQgbWVldGluZy4KCiAgICBWYXJpYWJsZXM6CiAgICAtIERhdGEuQ3VzdG9tZXJFbWFpbCA6IEN1c3RvbWVyIGVtYWlsIGFkZHJlc3MKICAgIC0gRGF0YS5DdXN0b21lck5hbWUgIDogQ3VzdG9tZXIgZGlzcGxheSBuYW1lCiAgICAtIERhdGEuVGlja2V0SUQgICAgICA6IEN1cnJlbnQgdGlja2V0IElECiAgICAtIERhdGEuVGlja2V0TnVtYmVyICA6IEN1cnJlbnQgdGlja2V0IG51bWJlcgoKICAgIE5vdGU6IE1vc3Qgb2YgdGhlIHdpZGdldCBjb250ZW50IGlzIGdlbmVyYXRlZCBkeW5hbWljYWxseSBieQogICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJLmpzIHRvIGhhbmRsZSBsb2dpbiBzdGF0ZSBjaGFuZ2VzLgolXQoKPGRpdiBpZD0iQ29sbGFiV2lkZ2V0IiBjbGFzcz0iV2lkZ2V0U2ltcGxlIiBkYXRhLWN1c3RvbWVyLWVtYWlsPSJbJSBEYXRhLkN1c3RvbWVyRW1haWwgfCBodG1sICVdIj4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgyPgogICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdXNlcnMiPjwvaT4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCdDb2xsYWJvcmF0aW9uJykgfCBodG1sICVdCiAgICAgICAgPC9oMj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29sbGFiV2lkZ2V0Ij4KICAgICAgICAgICAgPCEtLSBDb250ZW50IHBvcHVsYXRlZCBieSBKYXZhU2NyaXB0IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJXaWRnZXRfX2xvYWRpbmciIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7Ij4KICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT4KICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgnTG9hZGluZy4uLicpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CgpbJSMKICAgIFN0YXRpYyB2ZXJzaW9uIGZvciB3aGVuIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQgb3Igbm90IHlldCBsb2FkZWQuCiAgICBUaGlzIHByb3ZpZGVzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCB0aGUgY29sbGFib3JhdGlvbiBmZWF0dXJlcy4KJV0KPG5vc2NyaXB0PgogICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCdDb2xsYWJvcmF0aW9uJykgfCBodG1sICVdPC9oMj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgPHAgc3R5bGU9InBhZGRpbmc6IDEwcHg7IGNvbG9yOiAjOTk5OyI+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoJ0phdmFTY3JpcHQgaXMgcmVxdWlyZWQgZm9yIGNvbGxhYm9yYXRpb24gZmVhdHVyZXMuJykgfCBodG1sICVdCiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L25vc2NyaXB0Pgo=</File>

        <!-- Output Filters -->
        <File Permission="660" Location="Kernel/Output/HTML/FilterContent/CollaborationInit.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGaWx0ZXJDb250ZW50OjpDb2xsYWJvcmF0aW9uSW5pdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZpbHRlckNvbnRlbnQ6OkNvbGxhYm9yYXRpb25Jbml0IC0gSW5qZWN0IENvbGxhYm9yYXRpb24gaW5pdGlhbGl6YXRpb24KCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBvdXRwdXQgZmlsdGVyIGluamVjdHMgdGhlIENvbGxhYm9yYXRpb24gaW5pdGlhbGl6YXRpb24gSmF2YVNjcmlwdAppbnRvIGFsbCBhZ2VudCBwYWdlcy4gSXQgcmVhZHMgY29uZmlndXJhdGlvbiBmcm9tIFN5c0NvbmZpZyBhbmQgcGFzc2VzCml0IHRvIHRoZSBJbml0LnR0IHRlbXBsYXRlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpFeGVjdXRlIHRoZSBvdXRwdXQgZmlsdGVyLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgTWFzdGVyIHN3aXRjaDogd2hlbiBkaXNhYmxlZCwgaW5qZWN0IG5vdGhpbmcgYXQgYWxsIC0gbm8gSW5pdC50dAogICAgIyBzY3JpcHQsIG5vIHBlci1wYWdlIHRpY2tldC9jdXN0b21lci9vd25lciBsb29rdXBzLiBDb21iaW5lZCB3aXRoCiAgICAjIG1hcmtpbmcgTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMjIyMxMDAtQ29sbGFib3JhdGlvbiBhbmQKICAgICMgTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTIyMjMTAwLUNvbGxhYm9yYXRpb24gYXMgaW52YWxpZCBpbgogICAgIyBTeXNDb25maWcgKHN0b3BzIHRoZSBhZGQtb24ncyBvd24gSlMvQ1NTIGZpbGVzIGZyb20gYmVpbmcgbG9hZGVkCiAgICAjIGF0IGFsbCksIHRoaXMgbWFrZXMgdGhlIGFkZC1vbiBmdWxseSBpbmVydCB3aXRob3V0IHVuaW5zdGFsbGluZyBpdC4KICAgIHJldHVybiAxIGlmICEoICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6RW5hYmxlZCcpIC8vIDEgKTsKCiAgICAjIENoZWNrIGlmIHdlIGhhdmUgdGVtcGxhdGUgZGF0YQogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtEYXRhfTsKICAgIHJldHVybiAxIGlmIHJlZiAkUGFyYW17RGF0YX0gbmUgJ1NDQUxBUic7CiAgICByZXR1cm4gMSBpZiAhJHsgJFBhcmFte0RhdGF9IH07CgogICAgIyBPbmx5IHByb2Nlc3MgZm9yIGFnZW50IGludGVyZmFjZQogICAgcmV0dXJuIDEgaWYgJExheW91dE9iamVjdC0+e1Nlc3Npb25Tb3VyY2V9ICYmICRMYXlvdXRPYmplY3QtPntTZXNzaW9uU291cmNlfSBuZSAnQWdlbnRJbnRlcmZhY2UnOwoKICAgICMgU2tpcCBsb2dpbiBwYWdlIC0gb25seSBzaG93IG9uIGF1dGhlbnRpY2F0ZWQgcGFnZXMKICAgICMgQ2hlY2sgaWYgdXNlciBpcyBsb2dnZWQgaW4gYnkgdmVyaWZ5aW5nIFVzZXJJRCBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eQogICAgcmV0dXJuIDEgaWYgISRMYXlvdXRPYmplY3QtPntVc2VySUR9OwoKICAgICMgR2V0IHByb3ZpZGVyIHNldHRpbmcKICAgIG15ICRQcm92aWRlciAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpQcm92aWRlcicpICAgICAgICAgfHwgJ01vY2snOwogICAgbXkgJEZhbGxiYWNrUHJvdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OkZhbGxiYWNrUHJvdmlkZXInKSB8fCAnWm51bnknOwoKICAgICMgR2V0IE1pY3Jvc29mdCAzNjUgc2V0dGluZ3MKICAgICMgQWxsIHRocmVlIHNldHRpbmdzIChUZW5hbnRJRCwgQ2xpZW50SUQsIFJlZGlyZWN0VVJJKSBhcmUgcmVxdWlyZWQgZm9yIE0zNjUgcHJvdmlkZXIKICAgICMgTWlzc2luZyBzZXR0aW5ncyB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGJyb3dzZXIgVUkKICAgIG15ICRUZW5hbnRJRCAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6UHJvdmlkZXI6Ok0zNjU6OlRlbmFudElEJykgfHwgJyc7CiAgICBteSAkQ2xpZW50SUQgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpDbGllbnRJRCcpIHx8ICcnOwogICAgbXkgJFJlZGlyZWN0VVJJID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTo6UmVkaXJlY3RVUkknKSB8fCAnJzsKCiAgICAjIEdldCBmZWF0dXJlIHRvZ2dsZXMKICAgIG15ICRFbmFibGVBdmF0YXIgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVBdmF0YXInKSAgICAgLy8gMTsKICAgIG15ICRFbmFibGVQcmVzZW5jZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVQcmVzZW5jZScpICAgLy8gMTsKICAgIG15ICRFbmFibGVIb3ZlckNhcmRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVIb3ZlckNhcmRzJykgLy8gMTsKICAgIG15ICRFbmFibGVDaGF0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVDaGF0JykgICAgICAgLy8gMTsKICAgIG15ICRFbmFibGVDYWxsICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVDYWxsJykgICAgICAgLy8gMTsKICAgIG15ICRFbmFibGVNZWV0aW5ncyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6RW5hYmxlTWVldGluZ3MnKSAgICAgICAvLyAwOwogICAgICAgIG15ICRFbmFibGVPd25lckluZm9QYW5lbCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6RW5hYmxlT3duZXJJbmZvUGFuZWwnKSAvLyAxOwoKICAgICMgR2V0IFVJIHNldHRpbmdzCiAgICBteSAkU2hvd0luSGVhZGVyICAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0luSGVhZGVyJykgICAgICAgICAgIC8vIDE7CiAgICBteSAkU2hvd0luVGlja2V0SW5mbyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0luVGlja2V0SW5mbycpICAgICAgIC8vIDE7CiAgICBteSAkU2hvd0luQXJ0aWNsZXMgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0luQXJ0aWNsZXMnKSAgICAgICAgIC8vIDE7CiAgICBteSAkU2hvd0N1c3RvbWVySW5mb1dpZGdldCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0N1c3RvbWVySW5mb1dpZGdldCcpIC8vIDE7CiAgICBteSAkSGlkZU5hdGl2ZUN1c3RvbWVySW5mbyA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6SGlkZU5hdGl2ZUN1c3RvbWVySW5mbycpIC8vIDE7CgogICAgIyBHZXQgY2FjaGUgc2V0dGluZ3MKICAgIG15ICRDYWNoZUF2YXRhclRUTCAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpDYWNoZTo6QXZhdGFyVFRMJykgICB8fCAzNjAwOwogICAgbXkgJENhY2hlUHJlc2VuY2VUVEwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OkNhY2hlOjpQcmVzZW5jZVRUTCcpIHx8IDYwOwogICAgbXkgJENhY2hlUHJvZmlsZVRUTCAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OkNhY2hlOjpQcm9maWxlVFRMJykgIHx8IDg2NDAwOwoKICAgICMgR2V0IGN1cnJlbnQgYWdlbnQncyBkYXRhCiAgICBteSAkVXNlckVtYWlsICAgID0gJExheW91dE9iamVjdC0+e1VzZXJFbWFpbH0gICAgfHwgJyc7CiAgICBteSAkVXNlckZ1bGxuYW1lID0gJExheW91dE9iamVjdC0+e1VzZXJGdWxsbmFtZX0gfHwgJyc7CgogICAgIyBHZXQgY3VzdG9tZXIgZGF0YSBpZiBvbiBBZ2VudFRpY2tldFpvb20KICAgIG15ICRDdXN0b21lckVtYWlsICA9ICcnOwogICAgbXkgJEN1c3RvbWVyTG9naW4gID0gJyc7CiAgICBteSAkQ3VzdG9tZXJOYW1lICAgPSAnJzsKICAgIG15ICRJc1RpY2tldE93bmVyICA9IDA7CgogICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgZGF0YQogICAgbXkgJE93bmVyRW1haWwgICAgICAgPSAnJzsKICAgIG15ICRPd25lck5hbWUgICAgICAgID0gJyc7CiAgICBteSAkT3duZXJJRCAgICAgICAgICA9IDA7CiAgICBteSAkUmVzcG9uc2libGVFbWFpbCA9ICcnOwogICAgbXkgJFJlc3BvbnNpYmxlTmFtZSAgPSAnJzsKICAgIG15ICRSZXNwb25zaWJsZUlEICAgID0gMDsKCiAgICAjIER5bmFtaWMgY3VzdG9tZXIgc2VsZWN0aW9uIGZsYWcgKGZvciB0aWNrZXQgY3JlYXRlIHBhZ2VzKQogICAgbXkgJER5bmFtaWNDdXN0b21lclNlbGVjdGlvbiA9IDA7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpb24nICkgfHwgJyc7CgogICAgIyBDaGVjayBpZiB3ZSdyZSBvbiBhIHRpY2tldCBjcmVhdGlvbiBwYWdlIHdpdGggZHluYW1pYyBjdXN0b21lciBzZWxlY3Rpb24KICAgIGlmICggJEFjdGlvbiA9fiAvXkFnZW50VGlja2V0KFBob25lfEVtYWlsfEN1c3RvbWVyKSQvICkgewogICAgICAgICREeW5hbWljQ3VzdG9tZXJTZWxlY3Rpb24gPSAxOwogICAgICAgICMgQ3VzdG9tZXIgZGF0YSB3aWxsIGJlIGxvYWRlZCBkeW5hbWljYWxseSB2aWEgSmF2YVNjcmlwdAogICAgICAgICMgTm8gc2VydmVyLXNpZGUgY3VzdG9tZXIgZGF0YSBleHRyYWN0aW9uIG5lZWRlZCBoZXJlCiAgICB9CgogICAgaWYgKCAkQWN0aW9uIGVxICdBZ2VudFRpY2tldFpvb20nICkgewogICAgICAgIG15ICRUaWNrZXRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKCiAgICAgICAgaWYgKCRUaWNrZXRJRCkgewogICAgICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICglVGlja2V0KSB7CiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIGN1cnJlbnQgYWdlbnQgaXMgdGlja2V0IG93bmVyCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gJiYgJExheW91dE9iamVjdC0+e1VzZXJJRH0gJiYgJFRpY2tldHtPd25lcklEfSA9PSAkTGF5b3V0T2JqZWN0LT57VXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXNUaWNrZXRPd25lciA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgT3duZXIgZGF0YQogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e093bmVySUR9ICYmICRUaWNrZXR7T3duZXJJRH0gIT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkT3duZXJJRCA9ICRUaWNrZXR7T3duZXJJRH07CiAgICAgICAgICAgICAgICAgICAgbXkgJU93bmVyRGF0YSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCVPd25lckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE93bmVyRW1haWwgPSAkT3duZXJEYXRhe1VzZXJFbWFpbH0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRPd25lck5hbWUgID0gJE93bmVyRGF0YXtVc2VyRnVsbG5hbWV9IHx8ICRPd25lckRhdGF7VXNlckZpcnN0bmFtZX0gLiAnICcgLiAkT3duZXJEYXRhe1VzZXJMYXN0bmFtZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgR2V0IFJlc3BvbnNpYmxlIGRhdGEKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtSZXNwb25zaWJsZUlEfSAmJiAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9ICE9IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlc3BvbnNpYmxlSUQgPSAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgICAgIG15ICVSZXNwb25zaWJsZURhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICglUmVzcG9uc2libGVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNwb25zaWJsZUVtYWlsID0gJFJlc3BvbnNpYmxlRGF0YXtVc2VyRW1haWx9IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2libGVOYW1lICA9ICRSZXNwb25zaWJsZURhdGF7VXNlckZ1bGxuYW1lfSB8fCAkUmVzcG9uc2libGVEYXRhe1VzZXJGaXJzdG5hbWV9IC4gJyAnIC4gJFJlc3BvbnNpYmxlRGF0YXtVc2VyTGFzdG5hbWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckxvZ2luID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CgogICAgICAgICAgICAgICAgICAgICMgR2V0IGN1c3RvbWVyIHVzZXIgZGF0YSBmb3IgZW1haWwKICAgICAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lckxvZ2luLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICglQ3VzdG9tZXJVc2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVtYWlsID0gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9IHx8ICRDdXN0b21lckxvZ2luOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJOYW1lICA9ICRDdXN0b21lclVzZXJ7VXNlckZ1bGxuYW1lfSB8fCAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9IC4gJyAnIC4gJEN1c3RvbWVyVXNlcntVc2VyTGFzdG5hbWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBGYWxsYmFjazogdXNlIEN1c3RvbWVyVXNlcklEIGFzIGVtYWlsIGlmIGl0IGxvb2tzIGxpa2UgYW4gZW1haWwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJMb2dpbiA9fiAvQC8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFbWFpbCA9ICRDdXN0b21lckxvZ2luOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgUmVuZGVyIHRoZSBpbml0aWFsaXphdGlvbiB0ZW1wbGF0ZQogICAgbXkgJEluaXRIVE1MID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ29sbGFib3JhdGlvbi9Jbml0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBQcm92aWRlciAgICAgICAgICAgICAgPT4gJFByb3ZpZGVyLAogICAgICAgICAgICBGYWxsYmFja1Byb3ZpZGVyICAgICAgPT4gJEZhbGxiYWNrUHJvdmlkZXIsCiAgICAgICAgICAgIFRlbmFudElEICAgICAgICAgICAgICA9PiAkVGVuYW50SUQsCiAgICAgICAgICAgIENsaWVudElEICAgICAgICAgICAgICA9PiAkQ2xpZW50SUQsCiAgICAgICAgICAgIFJlZGlyZWN0VVJJICAgICAgICAgICA9PiAkUmVkaXJlY3RVUkksCiAgICAgICAgICAgIEVuYWJsZUF2YXRhciAgICAgICAgICA9PiAkRW5hYmxlQXZhdGFyLAogICAgICAgICAgICBFbmFibGVQcmVzZW5jZSAgICAgICAgPT4gJEVuYWJsZVByZXNlbmNlLAogICAgICAgICAgICBFbmFibGVIb3ZlckNhcmRzICAgICAgPT4gJEVuYWJsZUhvdmVyQ2FyZHMsCiAgICAgICAgICAgIEVuYWJsZUNoYXQgICAgICAgICAgICA9PiAkRW5hYmxlQ2hhdCwKICAgICAgICAgICAgRW5hYmxlQ2FsbCAgICAgICAgICAgID0+ICRFbmFibGVDYWxsLAogICAgICAgICAgICBFbmFibGVNZWV0aW5ncyAgICAgICAgPT4gJEVuYWJsZU1lZXRpbmdzLAogICAgICAgICAgICBFbmFibGVPd25lckluZm9QYW5lbCAgPT4gJEVuYWJsZU93bmVySW5mb1BhbmVsLAogICAgICAgICAgICBTaG93SW5IZWFkZXIgICAgICAgICAgID0+ICRTaG93SW5IZWFkZXIsCiAgICAgICAgICAgIFNob3dJblRpY2tldEluZm8gICAgICAgPT4gJFNob3dJblRpY2tldEluZm8sCiAgICAgICAgICAgIFNob3dJbkFydGljbGVzICAgICAgICAgPT4gJFNob3dJbkFydGljbGVzLAogICAgICAgICAgICBTaG93Q3VzdG9tZXJJbmZvV2lkZ2V0ID0+ICRTaG93Q3VzdG9tZXJJbmZvV2lkZ2V0LAogICAgICAgICAgICBIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvID0+ICRIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvLAogICAgICAgICAgICBDYWNoZUF2YXRhclRUTCAgICAgICAgID0+ICRDYWNoZUF2YXRhclRUTCwKICAgICAgICAgICAgQ2FjaGVQcmVzZW5jZVRUTCAgICAgICA9PiAkQ2FjaGVQcmVzZW5jZVRUTCwKICAgICAgICAgICAgQ2FjaGVQcm9maWxlVFRMICAgICAgICA9PiAkQ2FjaGVQcm9maWxlVFRMLAogICAgICAgICAgICAjIEN1cnJlbnQgYWdlbnQgZGF0YQogICAgICAgICAgICBVc2VyRW1haWwgICAgICAgICAgICAgID0+ICRVc2VyRW1haWwsCiAgICAgICAgICAgIFVzZXJGdWxsbmFtZSAgICAgICAgICAgPT4gJFVzZXJGdWxsbmFtZSwKICAgICAgICAgICAgIyBDdXN0b21lciBkYXRhIGZvciB0aWNrZXQgem9vbQogICAgICAgICAgICBDdXN0b21lckVtYWlsICAgICAgICAgID0+ICRDdXN0b21lckVtYWlsLAogICAgICAgICAgICBDdXN0b21lckxvZ2luICAgICAgICAgID0+ICRDdXN0b21lckxvZ2luLAogICAgICAgICAgICBDdXN0b21lck5hbWUgICAgICAgICAgID0+ICRDdXN0b21lck5hbWUsCiAgICAgICAgICAgICMgVGlja2V0IG93bmVyc2hpcAogICAgICAgICAgICBJc1RpY2tldE93bmVyICAgICAgICAgID0+ICRJc1RpY2tldE93bmVyLAogICAgICAgICAgICAjIE93bmVyIGFuZCBSZXNwb25zaWJsZSBkYXRhCiAgICAgICAgICAgIE93bmVyRW1haWwgICAgICAgICAgICAgPT4gJE93bmVyRW1haWwsCiAgICAgICAgICAgIE93bmVyTmFtZSAgICAgICAgICAgICAgPT4gJE93bmVyTmFtZSwKICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgUmVzcG9uc2libGVFbWFpbCAgICAgICA9PiAkUmVzcG9uc2libGVFbWFpbCwKICAgICAgICAgICAgUmVzcG9uc2libGVOYW1lICAgICAgICA9PiAkUmVzcG9uc2libGVOYW1lLAogICAgICAgICAgICBSZXNwb25zaWJsZUlEICAgICAgICAgID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAjIER5bmFtaWMgY3VzdG9tZXIgc2VsZWN0aW9uIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlcykKICAgICAgICAgICAgRHluYW1pY0N1c3RvbWVyU2VsZWN0aW9uID0+ICREeW5hbWljQ3VzdG9tZXJTZWxlY3Rpb24sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBJbmplY3QgaW50byBwYWdlIGhlYWQgKGJlZm9yZSA8L2hlYWQ+KQogICAgaWYgKCRJbml0SFRNTCkgewogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHN7PC9oZWFkPn17JEluaXRIVE1MXG48L2hlYWQ+fWk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgoKPWN1dAo=</File>

        <!-- Modules -->
        <File Permission="660" Location="Kernel/Modules/AgentCollaborationAJAX.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRDb2xsYWJvcmF0aW9uQUpBWDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok1vZHVsZXM6OkFnZW50Q29sbGFib3JhdGlvbkFKQVggLSBBSkFYIGVuZHBvaW50IGZvciBDb2xsYWJvcmF0aW9uIEFkZC1vbgoKPWhlYWQxIERFU0NSSVBUSU9OCgpQcm92aWRlcyBBSkFYIGVuZHBvaW50cyBmb3I6Ci0gR2V0Q3VzdG9tZXJUaWNrZXRDb3VudDogQ291bnQgb3BlbiB0aWNrZXRzIGZvciBhIGN1c3RvbWVyIChieSBDdXN0b21lcklEKQotIEdldEN1c3RvbWVyVXNlclRpY2tldENvdW50OiBDb3VudCBvcGVuIHRpY2tldHMgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIgdXNlciAoYnkgQ3VzdG9tZXJVc2VyTG9naW4pCi0gR2V0Q3VzdG9tZXJEYXRhOiBHZXQgY3VzdG9tZXIgdXNlciBkYXRhIGZyb20gWm51bnkKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QuCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKRXhlY3V0ZSB0aGUgbW9kdWxlLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBNYXN0ZXIgc3dpdGNoOiByZWZ1c2UgdG8gZG8gYW55dGhpbmcgd2hpbGUgdGhlIGFkZC1vbiBpcyBkaXNhYmxlZCwKICAgICMgZXZlbiBpZiBhIHJlcXVlc3QgcmVhY2hlcyB0aGlzIGVuZHBvaW50IGRpcmVjdGx5IChlLmcuIGEgc3RhbGUKICAgICMgcGFnZSBzdGlsbCBob2xkaW5nIHRoZSBKUywgb3IgYSBjcmFmdGVkIHJlcXVlc3QpIHJhdGhlciB0aGFuIHZpYQogICAgIyB0aGUgbm9ybWFsLCBhbHJlYWR5LXN1cHByZXNzZWQgZnJvbnRlbmQgaW5pdC4KICAgIGlmICggISggJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVkJykgLy8gMSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdDb2xsYWJvcmF0aW9uIGFkZC1vbiBpcyBkaXNhYmxlZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZIChTMSk6IFZlcmlmeSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgYW55IHJlcXVlc3QKICAgIGlmICggISRTZWxmLT57VXNlcklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFN1YmFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJhY3Rpb24nICkgfHwgJyc7CgogICAgIyBEaXNwYXRjaCB0byBoYW5kbGVyCiAgICBpZiAoICRTdWJhY3Rpb24gZXEgJ0dldEN1c3RvbWVyVGlja2V0Q291bnQnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldEN1c3RvbWVyVGlja2V0Q291bnQoKTsKICAgIH0KICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnR2V0Q3VzdG9tZXJVc2VyVGlja2V0Q291bnQnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldEN1c3RvbWVyVXNlclRpY2tldENvdW50KCk7CiAgICB9CiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0dldEN1c3RvbWVyRGF0YScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0Q3VzdG9tZXJEYXRhKCk7CiAgICB9CiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0dldFRpY2tldERhdGEnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldFRpY2tldERhdGEoKTsKICAgIH0KICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnQ3JlYXRlQXBwb2ludG1lbnQnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0NyZWF0ZUFwcG9pbnRtZW50KCk7CiAgICB9CiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0NhbmNlbEFwcG9pbnRtZW50JyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9DYW5jZWxBcHBvaW50bWVudCgpOwogICAgfQogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdHZXRVc2VyUHJvZmlsZScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0VXNlclByb2ZpbGUoKTsKICAgIH0KICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnR2V0QWdlbnRCeVVzZXJJRCcgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0QWdlbnRCeVVzZXJJRCgpOwogICAgfQogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdHZXRPdXRPZk9mZmljZScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0T3V0T2ZPZmZpY2UoKTsKICAgIH0KCiAgICAjIEludmFsaWQgc3ViYWN0aW9uCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgU3ViYWN0aW9uJywKICAgICk7Cn0KCj1oZWFkMiBfR2V0Q3VzdG9tZXJUaWNrZXRDb3VudCgpCgpHZXQgY291bnQgb2Ygb3BlbiB0aWNrZXRzIGZvciBhIGN1c3RvbWVyLgoKUmV0dXJucyBKU09OOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgVGlja2V0Q291bnQ6IDUsCiAgICAgICAgU2VhcmNoVVJMOiAiaW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0U2VhcmNoLi4uIgogICAgfQoKPWN1dAoKc3ViIF9HZXRDdXN0b21lclRpY2tldENvdW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIEdldCBjdXN0b21lciBsb2dpbiBwYXJhbWV0ZXIKICAgIG15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXJMb2dpbicgKSB8fCAnJzsKCiAgICBpZiAoICEkQ3VzdG9tZXJVc2VyTG9naW4gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgQ3VzdG9tZXJVc2VyTG9naW4gcGFyYW1ldGVyJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IEN1c3RvbWVySUQgZnJvbSBDdXN0b21lclVzZXIgKHRvIHNlYXJjaCBmb3IgYWxsIHRpY2tldHMgb2YgdGhlIGN1c3RvbWVyL2NvbXBhbnkpCiAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICk7CgogICAgbXkgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2Vye1VzZXJDdXN0b21lcklEfSB8fCAkQ3VzdG9tZXJVc2VyTG9naW47CgogICAgIyBTZWFyY2ggZm9yIG9wZW4gdGlja2V0cyBieSBDdXN0b21lcklEIChhbGwgdGlja2V0cyBvZiB0aGUgY3VzdG9tZXIvY29tcGFueSkKICAgIG15ICRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBDdXN0b21lcklEUmF3ID0+ICRDdXN0b21lcklELAogICAgICAgIFN0YXRlVHlwZSAgICAgPT4gWyAnbmV3JywgJ29wZW4nLCAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgUmVzdWx0ICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFBlcm1pc3Npb24gICAgPT4gJ3JvJywKICAgICk7CgogICAgIyBCdWlsZCBzZWFyY2ggVVJMIGZvciBsaW5raW5nCiAgICBteSAkU2VhcmNoVVJMID0gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgIC4gJ0FjdGlvbj1BZ2VudFRpY2tldFNlYXJjaDtTdWJhY3Rpb249U2VhcmNoOycKICAgICAgICAuICdDdXN0b21lcklEUmF3PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDdXN0b21lcklEKSAuICc7JwogICAgICAgIC4gJ1N0YXRlVHlwZT1PcGVuJzsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICBUaWNrZXRDb3VudCA9PiAkVGlja2V0Q291bnQgfHwgMCwKICAgICAgICBTZWFyY2hVUkwgICA9PiAkU2VhcmNoVVJMLAogICAgKTsKfQoKPWhlYWQyIF9HZXRDdXN0b21lclVzZXJUaWNrZXRDb3VudCgpCgpHZXQgY291bnQgb2Ygb3BlbiB0aWNrZXRzIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyIHVzZXIgKHBlcnNvbikuClVubGlrZSBfR2V0Q3VzdG9tZXJUaWNrZXRDb3VudCB3aGljaCBzZWFyY2hlcyBieSBDdXN0b21lcklEIChjb21wYW55KSwKdGhpcyBzZWFyY2hlcyBieSBDdXN0b21lclVzZXJMb2dpbiAoc3BlY2lmaWMgcGVyc29uKS4KClJldHVybnMgSlNPTjoKICAgIHsKICAgICAgICBTdWNjZXNzOiAxLAogICAgICAgIFRpY2tldENvdW50OiAzCiAgICB9Cgo9Y3V0CgpzdWIgX0dldEN1c3RvbWVyVXNlclRpY2tldENvdW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBHZXQgY3VzdG9tZXIgdXNlciBsb2dpbiBwYXJhbWV0ZXIKICAgIG15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXJMb2dpbicgKSB8fCAnJzsKCiAgICBpZiAoICEkQ3VzdG9tZXJVc2VyTG9naW4gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgQ3VzdG9tZXJVc2VyTG9naW4gcGFyYW1ldGVyJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VhcmNoIGZvciBvcGVuIHRpY2tldHMgd2hlcmUgdGhpcyBzcGVjaWZpYyBDdXN0b21lclVzZXIgaXMgYXNzaWduZWQKICAgIG15ICRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpblJhdyA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgPT4gWyAnbmV3JywgJ29wZW4nLCAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgICAgPT4gJ0NPVU5UJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUGVybWlzc2lvbiAgICAgICAgICAgPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgIFN1Y2Nlc3MgICAgID0+IDEsCiAgICAgICAgVGlja2V0Q291bnQgPT4gJFRpY2tldENvdW50IHx8IDAsCiAgICApOwp9Cgo9aGVhZDIgX0dldEN1c3RvbWVyRGF0YSgpCgpHZXQgY3VzdG9tZXIgdXNlciBkYXRhIGZyb20gWm51bnkuCgpSZXR1cm5zIEpTT046CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBEYXRhOiB7CiAgICAgICAgICAgIFVzZXJMb2dpbjogImN1c3RvbWVyQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgVXNlckZpcnN0bmFtZTogIk1heCIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZTogIk11c3Rlcm1hbm4iLAogICAgICAgICAgICBVc2VyRnVsbG5hbWU6ICJNYXggTXVzdGVybWFubiIsCiAgICAgICAgICAgIFVzZXJFbWFpbDogImN1c3RvbWVyQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgVXNlckN1c3RvbWVySUQ6ICJDdXN0b21lckNvbXBhbnkiLAogICAgICAgICAgICBVc2VyVGl0bGU6ICJTdXBwb3J0IEFnZW50IiwKICAgICAgICAgICAgVXNlclBob25lOiAiKzQ5IDEyMyA0NTY3ODkiLAogICAgICAgICAgICBVc2VyTW9iaWxlOiAiKzQ5IDE3MCAxMjM0NTY3IgogICAgICAgIH0KICAgIH0KCj1jdXQKCnN1YiBfR2V0Q3VzdG9tZXJEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgR2V0IGN1c3RvbWVyIGxvZ2luIHBhcmFtZXRlcgogICAgbXkgJEN1c3RvbWVyVXNlckxvZ2luID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlckxvZ2luJyApIHx8ICcnOwoKICAgIGlmICggISRDdXN0b21lclVzZXJMb2dpbiApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBDdXN0b21lclVzZXJMb2dpbiBwYXJhbWV0ZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiB0aGlzIGlzIGNhbGxlZCBkdXJpbmcgdGlja2V0IGNyZWF0aW9uIChubyBleGlzdGluZyB0aWNrZXQgeWV0KQogICAgbXkgJEZvclRpY2tldENyZWF0ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JUaWNrZXRDcmVhdGUnICkgfHwgMDsKCiAgICBpZiAoICRGb3JUaWNrZXRDcmVhdGUgKSB7CiAgICAgICAgIyBTRUNVUklUWSAoUzVhKTogRm9yIHRpY2tldCBjcmVhdGlvbiwgdmVyaWZ5IGFnZW50IGNhbiBjcmVhdGUgdGlja2V0cwogICAgICAgICMgQWdlbnQgbXVzdCBoYXZlICdjcmVhdGUnIHBlcm1pc3Npb24gb24gYXQgbGVhc3Qgb25lIHF1ZXVlCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBpZiAoICElR3JvdXBMaXN0ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvciAgID0+ICdBY2Nlc3MgZGVuaWVkIC0gbm8gcGVybWlzc2lvbiB0byBjcmVhdGUgdGlja2V0cycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgUGVybWlzc2lvbiBPSyAtIGFnZW50IGNhbiBjcmVhdGUgdGlja2V0cywgYWxsb3cgY3VzdG9tZXIgZGF0YSBsb29rdXAKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgU0VDVVJJVFkgKFM1KTogVmVyaWZ5IGFnZW50IGhhcyBwZXJtaXNzaW9uIHRvIHZpZXcgdGhpcyBjdXN0b21lcidzIGRhdGEKICAgICAgICAjIENoZWNrIGlmIGFnZW50IGhhcyBhY2Nlc3MgdG8gYXQgbGVhc3Qgb25lIHRpY2tldCBmcm9tIHRoaXMgY3VzdG9tZXIKICAgICAgICBteSBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgTGltaXQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFAVGlja2V0SURzICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvciAgID0+ICdBY2Nlc3MgZGVuaWVkIC0gbm8gcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgY3VzdG9tZXInLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBjdXN0b21lciB1c2VyIGRhdGEKICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgKTsKCiAgICBpZiAoICElQ3VzdG9tZXJVc2VyICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdDdXN0b21lciBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBSZXR1cm4gcmVsZXZhbnQgZmllbGRzCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJMb2dpbn0gICAgICB8fCAnJywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRmlyc3RuYW1lfSAgfHwgJycsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSAgIHx8ICcnLAogICAgICAgICAgICBVc2VyRnVsbG5hbWUgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJGdWxsbmFtZX0gICB8fCAnJywKICAgICAgICAgICAgVXNlckVtYWlsICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9ICAgICAgfHwgJycsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICRDdXN0b21lclVzZXJ7VXNlckN1c3RvbWVySUR9IHx8ICcnLAogICAgICAgICAgICBVc2VyVGl0bGUgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJUaXRsZX0gICAgICB8fCAnJywKICAgICAgICAgICAgVXNlclBob25lICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyUGhvbmV9ICAgICAgfHwgJycsCiAgICAgICAgICAgIFVzZXJNb2JpbGUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlck1vYmlsZX0gICAgIHx8ICcnLAogICAgICAgICAgICBVc2VyU3RyZWV0ICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJTdHJlZXR9ICAgICB8fCAnJywKICAgICAgICAgICAgVXNlckNpdHkgICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyQ2l0eX0gICAgICAgfHwgJycsCiAgICAgICAgICAgIFVzZXJaaXAgICAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlclppcH0gICAgICAgIHx8ICcnLAogICAgICAgICAgICBVc2VyQ291bnRyeSAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJDb3VudHJ5fSAgICB8fCAnJywKICAgICAgICAgICAgVXNlckNvbW1lbnQgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyQ29tbWVudH0gICAgfHwgJycsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBfR2V0VGlja2V0RGF0YSgpCgpHZXQgdGlja2V0IGRhdGEgaW5jbHVkaW5nIG93bmVyIGluZm9ybWF0aW9uIGZvciBtZWV0aW5nIHNjaGVkdWxlci4KClJldHVybnMgSlNPTjoKICAgIHsKICAgICAgICBTdWNjZXNzOiAxLAogICAgICAgIERhdGE6IHsKICAgICAgICAgICAgVGlja2V0SUQ6IDEyMywKICAgICAgICAgICAgVGlja2V0TnVtYmVyOiAiMjAyNDAxMDExMjM0NTY3OCIsCiAgICAgICAgICAgIFRpdGxlOiAiVGlja2V0IFN1YmplY3QiLAogICAgICAgICAgICBRdWV1ZTogIklUOjpIYXJkd2FyZSIsCiAgICAgICAgICAgIE93bmVySUQ6IDIsCiAgICAgICAgICAgIE93bmVyTG9naW46ICJhZ2VudCIsCiAgICAgICAgICAgIE93bmVyRnVsbG5hbWU6ICJBZ2VudCBOYW1lIiwKICAgICAgICAgICAgT3duZXJFbWFpbDogImFnZW50QGNvbXBhbnkuY29tIgogICAgICAgIH0KICAgIH0KCj1jdXQKCnN1YiBfR2V0VGlja2V0RGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFVzZXJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBHZXQgdGlja2V0IElEIHBhcmFtZXRlcgogICAgbXkgJFRpY2tldElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApIHx8ICcnOwoKICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBUaWNrZXRJRCBwYXJhbWV0ZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgVGlja2V0SUQgaXMgbnVtZXJpYyB0byBwcmV2ZW50IGluamVjdGlvbgogICAgaWYgKCAkVGlja2V0SUQgIX4gL15cZCskLyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBUaWNrZXRJRCBmb3JtYXQgLSBtdXN0IGJlIG51bWVyaWMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWTogVmVyaWZ5IHRoZSByZXF1ZXN0aW5nIGFnZW50IGFjdHVhbGx5IGhhcyBhY2Nlc3MgdG8gdGhpcwogICAgIyB0aWNrZXQgKFRpY2tldEdldCBpdHNlbGYgZG9lcyBub3QgZW5mb3JjZSBwZXJtaXNzaW9ucykuCiAgICBteSAkSGFzQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gdmlldyB0aGlzIHRpY2tldCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISVUaWNrZXQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1RpY2tldCBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgb3duZXIgZGF0YQogICAgbXkgJU93bmVyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgKTsKCiAgICAjIENoZWNrIGlmIGEgY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgdGhpcyBxdWV1ZQogICAgbXkgJENhbGVuZGFyTmFtZSA9ICRTZWxmLT5fR2V0Q2FsZW5kYXJGb3JRdWV1ZSggJFRpY2tldHtRdWV1ZX0gKTsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICBUaWNrZXROdW1iZXIgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkVGlja2V0e1F1ZXVlfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRUaWNrZXR7T3duZXJJRH0sCiAgICAgICAgICAgIE93bmVyTG9naW4gICAgPT4gJE93bmVye1VzZXJMb2dpbn0gICAgfHwgJycsCiAgICAgICAgICAgIE93bmVyRnVsbG5hbWUgPT4gJE93bmVye1VzZXJGdWxsbmFtZX0gfHwgJycsCiAgICAgICAgICAgIE93bmVyRW1haWwgICAgPT4gJE93bmVye1VzZXJFbWFpbH0gICAgfHwgJycsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSAgPT4gJENhbGVuZGFyTmFtZSB8fCAnJywKICAgICAgICAgICAgSGFzQ2FsZW5kYXIgICA9PiAkQ2FsZW5kYXJOYW1lID8gMSA6IDAsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBfQ3JlYXRlQXBwb2ludG1lbnQoKQoKQ3JlYXRlIGEgWm51bnkgY2FsZW5kYXIgYXBwb2ludG1lbnQgYW5kIGxpbmsgaXQgdG8gYSB0aWNrZXQuCgpQYXJhbWV0ZXJzOgogICAgVGlja2V0SUQgICAgLSBUaWNrZXQgSUQgdG8gbGluayB0aGUgYXBwb2ludG1lbnQgdG8KICAgIFRpdGxlICAgICAgIC0gQXBwb2ludG1lbnQgdGl0bGUKICAgIFN0YXJ0VGltZSAgIC0gU3RhcnQgdGltZSAoWVlZWS1NTS1ERCBISDpNTTpTUyksIGluIHRoZSBhZ2VudCdzIG93bgogICAgICAgICAgICAgICAgICB3YWxsLWNsb2NrIHRpbWUgem9uZSAoc2VlIFRpbWVab25lKQogICAgRW5kVGltZSAgICAgLSBFbmQgdGltZSAoWVlZWS1NTS1ERCBISDpNTTpTUyksIHNhbWUgdGltZSB6b25lIGFzIFN0YXJ0VGltZQogICAgVGltZVpvbmUgICAgLSBJQU5BIHRpbWUgem9uZSBTdGFydFRpbWUvRW5kVGltZSBhcmUgZXhwcmVzc2VkIGluIChlLmcuCiAgICAgICAgICAgICAgICAgICJFdXJvcGUvQmVybGluIik7IGNvbnZlcnRlZCB0byB0aGUgc3lzdGVtJ3Mgc3RvcmFnZSB0aW1lCiAgICAgICAgICAgICAgICAgIHpvbmUgKE9UUlNUaW1lWm9uZSkgYmVmb3JlIHNhdmluZy4gRGVmYXVsdHMgdG8gVVRDLgogICAgRGVzY3JpcHRpb24gLSBPcHRpb25hbCBkZXNjcmlwdGlvbgogICAgTG9jYXRpb24gICAgLSBPcHRpb25hbCBsb2NhdGlvbiAoZS5nLiwgVGVhbXMgbWVldGluZyBVUkwpCgpSZXR1cm5zIEpTT046CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBBcHBvaW50bWVudElEOiAxMjMsCiAgICAgICAgQ2FsZW5kYXJOYW1lOiAiSVQtQ2FsZW5kYXIiCiAgICB9CgpJZiBubyBjYWxlbmRhciBpcyBjb25maWd1cmVkIGZvciB0aGUgcXVldWU6CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBBcHBvaW50bWVudElEOiAwLAogICAgICAgIFdhcm5pbmc6ICJObyBjYWxlbmRhciBjb25maWd1cmVkIGZvciB0aGlzIHF1ZXVlIC0gYXBwb2ludG1lbnQgc2tpcHBlZCIKICAgIH0KCj1jdXQKCnN1YiBfQ3JlYXRlQXBwb2ludG1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkTGlua09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgU0VDVVJJVFkgKFMyKTogVmFsaWRhdGUgQ1NSRiB0b2tlbiBmb3Igc3RhdGUtY2hhbmdpbmcgb3BlcmF0aW9uCiAgICBteSAkQ2hhbGxlbmdlVG9rZW4gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbGxlbmdlVG9rZW4nICkgfHwgJyc7CiAgICBpZiAoICEkQ2hhbGxlbmdlVG9rZW4gfHwgJENoYWxsZW5nZVRva2VuIG5lICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhbGxlbmdlVG9rZW59ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdJbnZhbGlkIHNlY3VyaXR5IHRva2VuIC0gcGxlYXNlIHJlbG9hZCB0aGUgcGFnZSBhbmQgdHJ5IGFnYWluJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHBhcmFtZXRlcnMKICAgIG15ICRUaWNrZXRJRCAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKSAgICB8fCAnJzsKICAgIG15ICRUaXRsZSAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaXRsZScgKSAgICAgICB8fCAnJzsKICAgIG15ICRTdGFydFRpbWUgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydFRpbWUnICkgICB8fCAnJzsKICAgIG15ICRFbmRUaW1lICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbmRUaW1lJyApICAgICB8fCAnJzsKICAgIG15ICREZXNjcmlwdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXNjcmlwdGlvbicgKSB8fCAnJzsKICAgIG15ICRMb2NhdGlvbiAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2NhdGlvbicgKSAgICB8fCAnJzsKCiAgICAjIFN0YXJ0VGltZS9FbmRUaW1lIGFyZSBuYWl2ZSAid2FsbCBjbG9jayIgc3RyaW5ncyBpbiB0aGUgYWdlbnQncyBvd24KICAgICMgYnJvd3NlciB0aW1lIHpvbmUgKGUuZy4gRXVyb3BlL0JlcmxpbiksIG5vdCB0aGUgc3lzdGVtJ3Mgc3RvcmFnZQogICAgIyB0aW1lIHpvbmUgKE9UUlNUaW1lWm9uZSwgdHlwaWNhbGx5IFVUQykuIFdpdGhvdXQgVGltZVpvbmUsIHRoZXknZAogICAgIyBiZSBzdG9yZWQgYXMgaWYgYWxyZWFkeSBpbiBPVFJTVGltZVpvbmUsIHNpbGVudGx5IHNoaWZ0aW5nIHRoZQogICAgIyBhcHBvaW50bWVudCBieSB0aGUgem9uZSdzIFVUQyBvZmZzZXQgLSBtaXNtYXRjaGluZyB0aGUgR3JhcGggQVBJCiAgICAjIG1lZXRpbmcvZXZlbnQsIHdoaWNoIElTIGdpdmVuIGJvdGggdGhlIHdhbGwtY2xvY2sgdGltZSBhbmQgYW4KICAgICMgZXhwbGljaXQgSUFOQSB6b25lIGFuZCByZXNvbHZlcyBpdCBjb3JyZWN0bHkuCiAgICBteSAkVGltZVpvbmUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGltZVpvbmUnICkgfHwgJ1VUQyc7CgogICAgIyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzCiAgICBpZiAoICEkVGlja2V0SUQgfHwgISRUaXRsZSB8fCAhJFN0YXJ0VGltZSB8fCAhJEVuZFRpbWUgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyAoVGlja2V0SUQsIFRpdGxlLCBTdGFydFRpbWUsIEVuZFRpbWUpJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIFRpY2tldElEIGlzIG51bWVyaWMgdG8gcHJldmVudCBpbmplY3Rpb24KICAgIGlmICggJFRpY2tldElEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgVGlja2V0SUQgZm9ybWF0IC0gbXVzdCBiZSBudW1lcmljJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIGRhdGV0aW1lIGZvcm1hdCAoWVlZWS1NTS1ERCBISDpNTTpTUykKICAgIG15ICREYXRlVGltZVJlZ2V4ID0gcXIvXlxkezR9LVxkezJ9LVxkezJ9XHNcZHsyfTpcZHsyfTpcZHsyfSQvOwogICAgaWYgKCAkU3RhcnRUaW1lICF+ICREYXRlVGltZVJlZ2V4ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdJbnZhbGlkIFN0YXJ0VGltZSBmb3JtYXQgLSBleHBlY3RlZCBZWVlZLU1NLUREIEhIOk1NOlNTJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkRW5kVGltZSAhfiAkRGF0ZVRpbWVSZWdleCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBFbmRUaW1lIGZvcm1hdCAtIGV4cGVjdGVkIFlZWVktTU0tREQgSEg6TU06U1MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgVGl0bGUgbGVuZ3RoCiAgICBpZiAoIGxlbmd0aCgkVGl0bGUpID4gMjU1ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdUaXRsZSB0b28gbG9uZyAtIG1heGltdW0gMjU1IGNoYXJhY3RlcnMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgRGVzY3JpcHRpb24gYW5kIExvY2F0aW9uIGxlbmd0aAogICAgaWYgKCBsZW5ndGgoJERlc2NyaXB0aW9uKSA+IDIwMDAgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0Rlc2NyaXB0aW9uIHRvbyBsb25nIC0gbWF4aW11bSAyMDAwIGNoYXJhY3RlcnMnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoIGxlbmd0aCgkTG9jYXRpb24pID4gMjU1ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdMb2NhdGlvbiB0b28gbG9uZyAtIG1heGltdW0gMjU1IGNoYXJhY3RlcnMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWSAoUzEwKTogVmFsaWRhdGUgTG9jYXRpb24gZm9yIG1hbGljaW91cyBjb250ZW50CiAgICBpZiAoICRMb2NhdGlvbiAmJiAkTG9jYXRpb24gPX4gL2phdmFzY3JpcHQ6fGRhdGE6fDxzY3JpcHR8PGlmcmFtZXxvblx3K1xzKj0vaSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBsb2NhdGlvbiBmb3JtYXQgLSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWTogVmVyaWZ5IHRoZSByZXF1ZXN0aW5nIGFnZW50IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhpcyB0aWNrZXQKICAgICMgYmVmb3JlIGNyZWF0aW5nIGFueXRoaW5nIGFnYWluc3QgaXQuCiAgICBteSAkSGFzQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncncnLAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoaXMgdGlja2V0JywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISVUaWNrZXQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1RpY2tldCBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgY2FsZW5kYXIgZm9yIHF1ZXVlICh3aXRoIGluaGVyaXRhbmNlKQogICAgbXkgJENhbGVuZGFyTmFtZSA9ICRTZWxmLT5fR2V0Q2FsZW5kYXJGb3JRdWV1ZSggJFRpY2tldHtRdWV1ZX0gKTsKCiAgICBpZiAoICEkQ2FsZW5kYXJOYW1lICkgewogICAgICAgICMgTm8gY2FsZW5kYXIgY29uZmlndXJlZCAtIHJldHVybiBzdWNjZXNzIGJ1dCBza2lwIGFwcG9pbnRtZW50CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzICAgICAgID0+IDEsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMCwKICAgICAgICAgICAgV2FybmluZyAgICAgICA9PiAnTm8gY2FsZW5kYXIgY29uZmlndXJlZCBmb3IgdGhpcyBxdWV1ZSAtIGFwcG9pbnRtZW50IHNraXBwZWQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgY2FsZW5kYXIgYnkgbmFtZSAoZGlyZWN0IGxvb2t1cCB3aXRob3V0IHVzZXIgcGVybWlzc2lvbiBmaWx0ZXJpbmcpCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgKTsKCiAgICBpZiAoICElQ2FsZW5kYXIgfHwgISRDYWxlbmRhcntDYWxlbmRhcklEfSApIHsKICAgICAgICAjIENhbGVuZGFyIGRvZXNuJ3QgZXhpc3QgLSBsaXN0IGF2YWlsYWJsZSBjYWxlbmRhcnMgZm9yIGRlYnVnZ2luZwogICAgICAgIG15IEBBbGxDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCggVmFsaWRJRCA9PiAxICk7CiAgICAgICAgbXkgQENhbGVuZGFyTmFtZXMgPSBtYXAgeyAkXy0+e0NhbGVuZGFyTmFtZX0gfSBAQWxsQ2FsZW5kYXJzOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgPT4gIkNhbGVuZGFyICckQ2FsZW5kYXJOYW1lJyBub3QgZm91bmQiLAogICAgICAgICAgICBBdmFpbGFibGVDYWxlbmRhcnMgPT4gXEBDYWxlbmRhck5hbWVzLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENhbGVuZGFySUQgPSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CgogICAgIyBTRUNVUklUWTogVGhlIGNhbGVuZGFyIGxvb2t1cCBhYm92ZSBpcyBieSBuYW1lIG9ubHksIHdpdGggbm8gdXNlcgogICAgIyBwZXJtaXNzaW9uIGZpbHRlcmluZy4gVmVyaWZ5IHRoZSBhZ2VudCBhY3R1YWxseSBoYXMgd3JpdGUgYWNjZXNzIHRvCiAgICAjIHRoaXMgc3BlY2lmaWMgY2FsZW5kYXIncyBncm91cCBiZWZvcmUgY3JlYXRpbmcgYW4gYXBwb2ludG1lbnQgaW4gaXQuCiAgICBteSAkQ2FsZW5kYXJQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkQ2FsZW5kYXJQZXJtaXNzaW9uIHx8ICRDYWxlbmRhclBlcm1pc3Npb24gZXEgJ3JvJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAiQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFwcG9pbnRtZW50cyBpbiBjYWxlbmRhciAnJENhbGVuZGFyTmFtZSciLAogICAgICAgICk7CiAgICB9CgogICAgIyBDb252ZXJ0IGZyb20gdGhlIGFnZW50J3Mgd2FsbC1jbG9jayB0aW1lIHpvbmUgdG8gdGhlIHN5c3RlbSdzCiAgICAjIHN0b3JhZ2UgdGltZSB6b25lIChPVFJTVGltZVpvbmUpIC0gc2VlIHRoZSBUaW1lWm9uZSBjb21tZW50IGFib3ZlLgogICAgIyBNaXJyb3JzIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEVkaXQncyBvd24KICAgICMgbmV3KFRpbWVab25lID0+IC4uLiktPlRvT1RSU1RpbWVab25lKCkgcGF0dGVybiBmb3IgdGhlIG5hdGl2ZQogICAgIyBhcHBvaW50bWVudCBlZGl0b3IuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICBUaW1lWm9uZSA9PiAkVGltZVpvbmUsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgIFRpbWVab25lID0+ICRUaW1lWm9uZSwKICAgICAgICB9LAogICAgKTsKICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgfHwgISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICJJbnZhbGlkIFRpbWVab25lICckVGltZVpvbmUnIiwKICAgICAgICApOwogICAgfQogICAgJFN0YXJ0VGltZU9iamVjdC0+VG9PVFJTVGltZVpvbmUoKTsKICAgICRFbmRUaW1lT2JqZWN0LT5Ub09UUlNUaW1lWm9uZSgpOwogICAgJFN0YXJ0VGltZSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAkRW5kVGltZSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgIyBDcmVhdGUgYXBwb2ludG1lbnQKICAgIG15ICRBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICBUaXRsZSAgICAgICA9PiAkVGl0bGUsCiAgICAgICAgU3RhcnRUaW1lICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICBFbmRUaW1lICAgICA9PiAkRW5kVGltZSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgTG9jYXRpb24gICAgPT4gJExvY2F0aW9uLAogICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJEFwcG9pbnRtZW50SUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ZhaWxlZCB0byBjcmVhdGUgYXBwb2ludG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBMaW5rIGFwcG9pbnRtZW50IHRvIHRpY2tldCAodXNpbmcgQ29sbGFib3JhdGlvbiBsaW5rIHR5cGUgZm9yIGlkZW50aWZpY2F0aW9uKQogICAgbXkgJExpbmtSZXN1bHQgPSAkTGlua09iamVjdC0+TGlua0FkZCgKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICBUYXJnZXRLZXkgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdDb2xsYWJvcmF0aW9uJywKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkTGlua1Jlc3VsdCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGYWlsZWQgdG8gbGluayBBcHBvaW50bWVudCAkQXBwb2ludG1lbnRJRCB0byBUaWNrZXQgJFRpY2tldElEIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICBTdWNjZXNzICAgICAgID0+IDEsCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBDYWxlbmRhck5hbWUgID0+ICRDYWxlbmRhck5hbWUsCiAgICApOwp9Cgo9aGVhZDIgX0NhbmNlbEFwcG9pbnRtZW50KCkKCkNhbmNlbCBhIFpudW55IGNhbGVuZGFyIGFwcG9pbnRtZW50IGFuZCByZW1vdmUgaXRzIGxpbmsgdG8gYSB0aWNrZXQuClJldHVybnMgdGhlIEdyYXBoRXZlbnRJRCBzbyB0aGUgZnJvbnRlbmQgY2FuIGNhbmNlbCB0aGUgT3V0bG9vayBjYWxlbmRhciBldmVudC4KClBhcmFtZXRlcnM6CiAgICBBcHBvaW50bWVudElEIC0gQXBwb2ludG1lbnQgSUQgdG8gY2FuY2VsCiAgICBUaWNrZXRJRCAgICAgIC0gVGlja2V0IElEIHRvIHVubGluayAob3B0aW9uYWwpCgpSZXR1cm5zIEpTT046CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBHcmFwaEV2ZW50SUQ6ICJBQU1rLi4uIiAob3IgZW1wdHkgaWYgbm90IGZvdW5kKQogICAgfQoKPWN1dAoKc3ViIF9DYW5jZWxBcHBvaW50bWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRBcHBvaW50bWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJExpbmtPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKTsKICAgIG15ICRMb2dPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIFNFQ1VSSVRZIChTMik6IFZhbGlkYXRlIENTUkYgdG9rZW4gZm9yIHN0YXRlLWNoYW5naW5nIG9wZXJhdGlvbgogICAgbXkgJENoYWxsZW5nZVRva2VuID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYWxsZW5nZVRva2VuJyApIHx8ICcnOwogICAgaWYgKCAhJENoYWxsZW5nZVRva2VuIHx8ICRDaGFsbGVuZ2VUb2tlbiBuZSAkTGF5b3V0T2JqZWN0LT57VXNlckNoYWxsZW5nZVRva2VufSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBzZWN1cml0eSB0b2tlbiAtIHBsZWFzZSByZWxvYWQgdGhlIHBhZ2UgYW5kIHRyeSBhZ2FpbicsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcHBvaW50bWVudElEJyApIHx8ICcnOwogICAgbXkgJFRpY2tldElEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICkgICAgICB8fCAnJzsKCiAgICBpZiAoICEkQXBwb2ludG1lbnRJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBBcHBvaW50bWVudElEIHBhcmFtZXRlcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBhcHBvaW50bWVudCBkYXRhICh0byBleHRyYWN0IEdyYXBoRXZlbnRJRCBmcm9tIGRlc2NyaXB0aW9uKQogICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgKTsKCiAgICBpZiAoICElQXBwb2ludG1lbnQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0FwcG9pbnRtZW50IG5vdCBmb3VuZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZOiBQdXJlIElEIGxvb2t1cCArIGRlbGV0ZSBoYXMgbm8gb3duZXJzaGlwIGNoZWNrIG90aGVyd2lzZSAtCiAgICAjIHJlcXVpcmUgdGhlIHNhbWUgY2FsZW5kYXIgd3JpdGUgcGVybWlzc2lvbiB0aGF0IGFwcG9pbnRtZW50IGNyZWF0aW9uCiAgICAjIGFscmVhZHkgcmVxdWlyZXMsIGtleWVkIG9mZiB0aGUgYXBwb2ludG1lbnQncyBvd24gQ2FsZW5kYXJJRCAobm90IHRoZQogICAgIyBvcHRpb25hbCwgY2xpZW50LXN1cHBsaWVkIFRpY2tldElEKS4KICAgIG15ICRDYWxlbmRhclBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkQ2FsZW5kYXJQZXJtaXNzaW9uIHx8ICRDYWxlbmRhclBlcm1pc3Npb24gZXEgJ3JvJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gY2FuY2VsIGFwcG9pbnRtZW50cyBpbiB0aGlzIGNhbGVuZGFyJywKICAgICAgICApOwogICAgfQoKICAgICMgRXh0cmFjdCBHcmFwaEV2ZW50SUQgZnJvbSBEZXNjcmlwdGlvbgogICAgbXkgJEdyYXBoRXZlbnRJRCA9ICcnOwogICAgaWYgKCAkQXBwb2ludG1lbnR7RGVzY3JpcHRpb259ICYmICRBcHBvaW50bWVudHtEZXNjcmlwdGlvbn0gPX4gL0dyYXBoRXZlbnRJRDpccyooW15cc1xuXSspLyApIHsKICAgICAgICAkR3JhcGhFdmVudElEID0gJDE7CiAgICB9CgogICAgIyBEZWxldGUgbGluayBmaXJzdCAoaWYgVGlja2V0SUQgcHJvdmlkZWQpCiAgICBpZiAoJFRpY2tldElEKSB7CiAgICAgICAgbXkgJExpbmtEZWxldGVSZXN1bHQgPSAkTGlua09iamVjdC0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgS2V5MSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIE9iamVjdDIgPT4gJ0FwcG9pbnRtZW50JywKICAgICAgICAgICAgS2V5MiAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnQ29sbGFib3JhdGlvbicsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRMaW5rRGVsZXRlUmVzdWx0ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIENvbGxhYm9yYXRpb24gbGluayBiZXR3ZWVuIFRpY2tldCAkVGlja2V0SUQgYW5kIEFwcG9pbnRtZW50ICRBcHBvaW50bWVudElEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBEZWxldGUgWm51bnkgYXBwb2ludG1lbnQKICAgIG15ICREZWxldGVTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICEkRGVsZXRlU3VjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnRmFpbGVkIHRvIGRlbGV0ZSBhcHBvaW50bWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkFwcG9pbnRtZW50ICRBcHBvaW50bWVudElEIGNhbmNlbGxlZCBieSB1c2VyICRTZWxmLT57VXNlcklEfSIsCiAgICApOwoKICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICBTdWNjZXNzICAgICAgPT4gMSwKICAgICAgICBHcmFwaEV2ZW50SUQgPT4gJEdyYXBoRXZlbnRJRCwKICAgICk7Cn0KCj1oZWFkMiBfR2V0VXNlclByb2ZpbGUoKQoKR2V0IHVzZXIgcHJvZmlsZSBieSBlbWFpbCBhZGRyZXNzLgpTZWFyY2hlcyBDdXN0b21lclVzZXIgZmlyc3QsIHRoZW4gVXNlciAoQWdlbnRzKS4KClBhcmFtZXRlcnM6CiAgICBFbWFpbCAtIEVtYWlsIGFkZHJlc3MgdG8gc2VhcmNoIGZvcgoKUmV0dXJucyBKU09OIChpbiBQcm92aWRlciBmb3JtYXQpOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgUHJvZmlsZTogewogICAgICAgICAgICBkaXNwbGF5TmFtZTogIk1heCBNdXN0ZXJtYW5uIiwKICAgICAgICAgICAgZ2l2ZW5OYW1lOiAiTWF4IiwKICAgICAgICAgICAgc3VybmFtZTogIk11c3Rlcm1hbm4iLAogICAgICAgICAgICBlbWFpbDogIm1heEBleGFtcGxlLmNvbSIsCiAgICAgICAgICAgIGpvYlRpdGxlOiAiU3VwcG9ydCBBZ2VudCIsCiAgICAgICAgICAgIGJ1c2luZXNzUGhvbmVzOiBbIis0OSAxMjMgNDU2Nzg5Il0sCiAgICAgICAgICAgIG1vYmlsZVBob25lOiAiKzQ5IDE3MCAxMjM0NTY3IiwKICAgICAgICAgICAgb2ZmaWNlTG9jYXRpb246ICJCZXJsaW4iLAogICAgICAgICAgICBkZXBhcnRtZW50OiBudWxsLAogICAgICAgICAgICBtYW5hZ2VyOiBudWxsLAogICAgICAgICAgICB0aWNrZXRDb3VudDogNSAgLy8gT25seSBmb3IgY3VzdG9tZXJzCiAgICAgICAgfQogICAgfQoKPWN1dAoKc3ViIF9HZXRVc2VyUHJvZmlsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJFVzZXJPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIEdldCBlbWFpbCBwYXJhbWV0ZXIKICAgIG15ICRFbWFpbCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbWFpbCcgKSB8fCAnJzsKCiAgICBpZiAoICEkRW1haWwgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgRW1haWwgcGFyYW1ldGVyJywKICAgICAgICApOwogICAgfQoKICAgICMgU0VDVVJJVFkgKFMzKTogVmFsaWRhdGUgZW1haWwgZm9ybWF0IHRvIHByZXZlbnQgZW51bWVyYXRpb24gYXR0YWNrcwogICAgaWYgKCAkRW1haWwgIX4gL15bXlxzXEBdK1xAW15cc1xAXStcLlteXHNcQF0rJC8gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgZW1haWwgZm9ybWF0JywKICAgICAgICApOwogICAgfQoKICAgICMgU0VDVVJJVFkgKFMzKTogVmFsaWRhdGUgZW1haWwgbGVuZ3RoCiAgICBpZiAoIGxlbmd0aCgkRW1haWwpID4gMjU0ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdFbWFpbCBhZGRyZXNzIHRvbyBsb25nJywKICAgICAgICApOwogICAgfQoKICAgICMgU0VDVVJJVFkgKFMzKTogUmF0ZSBsaW1pdGluZyAtIG1heCA2MCByZXF1ZXN0cyBwZXIgbWludXRlIHBlciB1c2VyCiAgICBpZiAoICEkU2VsZi0+X0NoZWNrUmF0ZUxpbWl0KCdHZXRVc2VyUHJvZmlsZScpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdSYXRlIGxpbWl0IGV4Y2VlZGVkIC0gcGxlYXNlIHdhaXQgYmVmb3JlIG1ha2luZyBtb3JlIHJlcXVlc3RzJywKICAgICAgICApOwogICAgfQoKICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgIE1lc3NhZ2UgID0+ICdbQ29sbGFib3JhdGlvbl0gR2V0VXNlclByb2ZpbGUgY2FsbGVkIGZvciBlbWFpbCcsCiAgICApOwoKICAgIG15ICVQcm9maWxlOwogICAgbXkgJElzQ3VzdG9tZXIgPSAwOwoKICAgICMgRmlyc3QsIHRyeSB0byBmaW5kIGFzIEN1c3RvbWVyVXNlciAoYnkgZW1haWwpCiAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEVtYWlsLAogICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMSwKICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgU0VDVVJJVFk6IExvZyBhdCBkZWJ1ZyBsZXZlbCBvbmx5LCBubyBQSUkgZXhwb3N1cmUKICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gQ3VzdG9tZXJTZWFyY2ggZm91bmQ6ICIgLiBzY2FsYXIoa2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCkgLiAiIHJlc3VsdHMiLAogICAgKTsKCiAgICBpZiAoJUN1c3RvbWVyVXNlckxpc3QpIHsKICAgICAgICBteSAoJEN1c3RvbWVyVXNlckxvZ2luKSA9IGtleXMgJUN1c3RvbWVyVXNlckxpc3Q7CiAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIGlmICglQ3VzdG9tZXJVc2VyKSB7CiAgICAgICAgICAgICRJc0N1c3RvbWVyID0gMTsKCiAgICAgICAgICAgICMgQnVpbGQgZGlzcGxheU5hbWUgZnJvbSBGaXJzdG5hbWUgKyBMYXN0bmFtZSBpZiBVc2VyRnVsbG5hbWUgaXMgZW1wdHkKICAgICAgICAgICAgbXkgJERpc3BsYXlOYW1lID0gJEN1c3RvbWVyVXNlcntVc2VyRnVsbG5hbWV9IHx8ICcnOwogICAgICAgICAgICBpZiAoICEkRGlzcGxheU5hbWUgJiYgKCAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9IHx8ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSApICkgewogICAgICAgICAgICAgICAgJERpc3BsYXlOYW1lID0gam9pbiggJyAnLAogICAgICAgICAgICAgICAgICAgIGdyZXAgeyBkZWZpbmVkICRfICYmICRfIG5lICcnIH0KICAgICAgICAgICAgICAgICAgICAoICRDdXN0b21lclVzZXJ7VXNlckZpcnN0bmFtZX0sICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSApCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlUHJvZmlsZSA9ICgKICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lICAgID0+ICREaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgIGdpdmVuTmFtZSAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckZpcnN0bmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICBzdXJuYW1lICAgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJMYXN0bmFtZX0gIHx8ICcnLAogICAgICAgICAgICAgICAgZW1haWwgICAgICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9ICAgICB8fCAkRW1haWwsCiAgICAgICAgICAgICAgICBqb2JUaXRsZSAgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJUaXRsZX0gICAgIHx8ICcnLAogICAgICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXMgPT4gJEN1c3RvbWVyVXNlcntVc2VyUGhvbmV9ID8gWyAkQ3VzdG9tZXJVc2Vye1VzZXJQaG9uZX0gXSA6IFtdLAogICAgICAgICAgICAgICAgbW9iaWxlUGhvbmUgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyTW9iaWxlfSAgICB8fCAnJywKICAgICAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uID0+ICRDdXN0b21lclVzZXJ7VXNlckNpdHl9ICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICBkZXBhcnRtZW50ICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgIG1hbmFnZXIgICAgICAgID0+IHVuZGVmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTRUNVUklUWTogVW5saWtlIF9HZXRDdXN0b21lckRhdGEsIHRoaXMgZW5kcG9pbnQgaGFkIG5vCiAgICAgICAgICAgICMgYXV0aG9yaXphdGlvbiBjaGVjayBhdCBhbGwgLSBhbnkgYWdlbnQgY291bGQgcHVsbCBhbnkKICAgICAgICAgICAgIyBjdXN0b21lcidzIHBob25lL21vYmlsZS9vZmZpY2UgYnkgZW1haWwuIFJlcXVpcmUgdGhlIHNhbWUKICAgICAgICAgICAgIyAiYWdlbnQgaGFzIGFuIGV4aXN0aW5nIHRpY2tldCB3aXRoIHRoaXMgY3VzdG9tZXIiIGJ1c2luZXNzCiAgICAgICAgICAgICMgcnVsZSBfR2V0Q3VzdG9tZXJEYXRhIGFscmVhZHkgZW5mb3JjZXMuIE9uIGZhaWx1cmUsIGRlZ3JhZGUKICAgICAgICAgICAgIyB0byB0aGUgc2FtZSBtaW5pbWFsIHByb2ZpbGUgdXNlZCBiZWxvdyBmb3IgInVzZXIgbm90IGZvdW5kIgogICAgICAgICAgICAjIHJhdGhlciB0aGFuIGVycm9yaW5nIG91dCwgc28gaG92ZXIgY2FyZHMgZWxzZXdoZXJlIGtlZXAKICAgICAgICAgICAgIyB3b3JraW5nIGFuZCBvbmx5IGxvc2UgdGhlIGVucmljaG1lbnQgdGhleSB3ZXJlIG5ldmVyCiAgICAgICAgICAgICMgZW50aXRsZWQgdG8gaW4gdGhlIGZpcnN0IHBsYWNlLgogICAgICAgICAgICBteSBAQXV0aFRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBQZXJtaXNzaW9uICAgICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhQEF1dGhUaWNrZXRJRHMgKSB7CiAgICAgICAgICAgICAgICAlUHJvZmlsZSAgICA9ICgpOwogICAgICAgICAgICAgICAgJElzQ3VzdG9tZXIgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgSWYgbm90IGZvdW5kIGFzIEN1c3RvbWVyVXNlciwgdHJ5IFVzZXIgKEFnZW50cykKICAgIGlmICggISVQcm9maWxlICkgewogICAgICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgICAgICMgVHJ5IGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoIHRocm91Z2ggYWxsIHVzZXJzCiAgICAgICAgbXkgJUFsbFVzZXJzID0gJFVzZXJPYmplY3QtPlVzZXJMaXN0KCBWYWxpZCA9PiAxICk7CiAgICAgICAgbXkgJExvd2VyRW1haWwgPSBsYygkRW1haWwpOwogICAgICAgIG15ICVVc2VyTGlzdDsKCiAgICAgICAgIyBTRUNVUklUWTogZGVidWcgbGV2ZWwgb25seSAtIGF2b2lkIHdyaXRpbmcgZXZlcnkgYWdlbnQncyBlbWFpbAogICAgICAgICMgaW50byB0aGUgc3lzdGVtIGxvZyBhdCBub3RpY2UgbGV2ZWwgZm9yIGV2ZXJ5IHByb2ZpbGUgbG9va3VwLgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltDb2xsYWJvcmF0aW9uXSBTZWFyY2hpbmcgZm9yIGFnZW50IHdpdGggZW1haWw6ICRFbWFpbCAoZm91bmQgIiAuIHNjYWxhcihrZXlzICVBbGxVc2VycykgLiAiIHVzZXJzKSIsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVBbGxVc2VycyApIHsKICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKCBVc2VySUQgPT4gJFVzZXJJRCApOwogICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtVc2VyRW1haWx9ICkgewogICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltDb2xsYWJvcmF0aW9uXSBDaGVja2luZyBVc2VyICRVc2VySUQgKCRVc2VyRGF0YXtVc2VyTG9naW59KTogZW1haWw9JyRVc2VyRGF0YXtVc2VyRW1haWx9JyB2cyBzZWFyY2g9JyRMb3dlckVtYWlsJyIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCBsYyggJFVzZXJEYXRhe1VzZXJFbWFpbH0gKSBlcSAkTG93ZXJFbWFpbCApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckxpc3R7JFVzZXJJRH0gPSAkQWxsVXNlcnN7JFVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiW0NvbGxhYm9yYXRpb25dIEZvdW5kIG1hdGNoOiBVc2VyICRVc2VySUQgKCRVc2VyRGF0YXtVc2VyTG9naW59KSIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJVVzZXJMaXN0ICkgewogICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgICAgICMgQnVpbGQgZGlzcGxheU5hbWUgZnJvbSBGaXJzdG5hbWUgKyBMYXN0bmFtZSBpZiBVc2VyRnVsbG5hbWUgaXMgZW1wdHkKICAgICAgICAgICAgICAgIG15ICREaXNwbGF5TmFtZSA9ICRVc2Vye1VzZXJGdWxsbmFtZX0gfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkRGlzcGxheU5hbWUgJiYgKCAkVXNlcntVc2VyRmlyc3RuYW1lfSB8fCAkVXNlcntVc2VyTGFzdG5hbWV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpc3BsYXlOYW1lID0gam9pbiggJyAnLAogICAgICAgICAgICAgICAgICAgICAgICBncmVwIHsgZGVmaW5lZCAkXyAmJiAkXyBuZSAnJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICggJFVzZXJ7VXNlckZpcnN0bmFtZX0sICRVc2Vye1VzZXJMYXN0bmFtZX0gKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJVByb2ZpbGUgPSAoCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWUgICAgPT4gJERpc3BsYXlOYW1lLAogICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZSAgICAgID0+ICRVc2Vye1VzZXJGaXJzdG5hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIHN1cm5hbWUgICAgICAgID0+ICRVc2Vye1VzZXJMYXN0bmFtZX0gIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIGVtYWlsICAgICAgICAgID0+ICRVc2Vye1VzZXJFbWFpbH0gICAgIHx8ICRFbWFpbCwKICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZSAgICAgICA9PiAkVXNlcntVc2VyVGl0bGV9ICAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc1Bob25lcyA9PiAkVXNlcntVc2VyUGhvbmV9ID8gWyAkVXNlcntVc2VyUGhvbmV9IF0gOiBbXSwKICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZSAgICA9PiAkVXNlcntVc2VyTW9iaWxlfSAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbiA9PiAkVXNlcntVc2VyQ2l0eX0gICAgICB8fCAnJywKICAgICAgICAgICAgICAgICAgICBkZXBhcnRtZW50ICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgSWYgc3RpbGwgbm90IGZvdW5kLCByZXR1cm4gbWluaW1hbCBwcm9maWxlCiAgICBpZiAoICElUHJvZmlsZSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gTm8gdXNlciBmb3VuZCBmb3IgJyRFbWFpbCcsIHJldHVybmluZyBtaW5pbWFsIHByb2ZpbGUiLAogICAgICAgICk7CgogICAgICAgIG15ICRMb2NhbFBhcnQgPSAkRW1haWw7CiAgICAgICAgJExvY2FsUGFydCA9fiBzL0AuKiQvLzsKICAgICAgICAkTG9jYWxQYXJ0ID1+IHMvWy5fLV0vIC9nOwogICAgICAgICRMb2NhbFBhcnQgPSB1Y2ZpcnN0KCRMb2NhbFBhcnQpOwoKICAgICAgICAlUHJvZmlsZSA9ICgKICAgICAgICAgICAgZGlzcGxheU5hbWUgICAgPT4gJExvY2FsUGFydCwKICAgICAgICAgICAgZ2l2ZW5OYW1lICAgICAgPT4gJycsCiAgICAgICAgICAgIHN1cm5hbWUgICAgICAgID0+ICcnLAogICAgICAgICAgICBlbWFpbCAgICAgICAgICA9PiAkRW1haWwsCiAgICAgICAgICAgIGpvYlRpdGxlICAgICAgID0+ICcnLAogICAgICAgICAgICBidXNpbmVzc1Bob25lcyA9PiBbXSwKICAgICAgICAgICAgbW9iaWxlUGhvbmUgICAgPT4gJycsCiAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uID0+ICcnLAogICAgICAgICAgICBkZXBhcnRtZW50ICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgbWFuYWdlciAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltDb2xsYWJvcmF0aW9uXSBGb3VuZCB1c2VyICckRW1haWwnOiBkaXNwbGF5TmFtZT0nJFByb2ZpbGV7ZGlzcGxheU5hbWV9JyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEFkZCB0aWNrZXQgY291bnQgZm9yIGN1c3RvbWVycwogICAgaWYgKCRJc0N1c3RvbWVyKSB7CiAgICAgICAgbXkgJFRpY2tldENvdW50ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpblJhdyA9PiAkUHJvZmlsZXtlbWFpbH0sCiAgICAgICAgICAgIFN0YXRlVHlwZSAgICAgICAgICAgID0+IFsgJ25ldycsICdvcGVuJywgJ3BlbmRpbmcgcmVtaW5kZXInLCAncGVuZGluZyBhdXRvJyBdLAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFBlcm1pc3Npb24gICAgICAgICAgID0+ICdybycsCiAgICAgICAgKTsKICAgICAgICAkUHJvZmlsZXt0aWNrZXRDb3VudH0gPSAkVGlja2V0Q291bnQgfHwgMDsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIFByb2ZpbGUgPT4gXCVQcm9maWxlLAogICAgKTsKfQoKPWhlYWQyIF9HZXRBZ2VudEJ5VXNlcklEKCkKCkdldCBhZ2VudCBkYXRhIGJ5IFVzZXJJRC4KVXNlZCBieSBPd25lckluZm9QYW5lbCB0byBnZXQgZW1haWwgYWRkcmVzcyBmb3IgYSBzZWxlY3RlZCBhZ2VudC4KClBhcmFtZXRlcnM6CiAgICBVc2VySUQgLSBabnVueSBVc2VySUQgb2YgdGhlIGFnZW50CgpSZXR1cm5zIEpTT046CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBVc2VySUQ6IDEyMywKICAgICAgICBFbWFpbDogImFnZW50QGV4YW1wbGUuY29tIiwKICAgICAgICBGdWxsbmFtZTogIk1heCBNdXN0ZXJtYW5uIiwKICAgICAgICBMb2dpbjogIm1heC5hZ2VudCIKICAgIH0KCj1jdXQKCnN1YiBfR2V0QWdlbnRCeVVzZXJJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRVc2VyT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBHZXQgVXNlcklEIHBhcmFtZXRlcgogICAgbXkgJFVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VySUQnICkgfHwgJyc7CgogICAgaWYgKCAhJFVzZXJJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBVc2VySUQgcGFyYW1ldGVyJywKICAgICAgICApOwogICAgfQoKICAgICMgU0VDVVJJVFk6IFZhbGlkYXRlIFVzZXJJRCBpcyBudW1lcmljCiAgICBpZiAoICRVc2VySUQgIX4gL15cZCskLyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBVc2VySUQgZm9ybWF0JywKICAgICAgICApOwogICAgfQoKICAgICMgU0VDVVJJVFk6IFJhdGUgbGltaXRpbmcgLSBib3VuZCBVc2VySUQgZW51bWVyYXRpb24KICAgIGlmICggISRTZWxmLT5fQ2hlY2tSYXRlTGltaXQoJ0dldEFnZW50QnlVc2VySUQnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnUmF0ZSBsaW1pdCBleGNlZWRlZCAtIHBsZWFzZSB3YWl0IGJlZm9yZSBtYWtpbmcgbW9yZSByZXF1ZXN0cycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBhZ2VudCBkYXRhCiAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICBWYWxpZCAgPT4gMSwKICAgICk7CgogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltDb2xsYWJvcmF0aW9uXSBHZXRBZ2VudEJ5VXNlcklEOiBVc2VyIG5vdCBmb3VuZCBmb3IgVXNlcklEICRVc2VySUQiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1VzZXIgbm90IGZvdW5kJywKICAgICAgICApOwogICAgfQoKICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gR2V0QWdlbnRCeVVzZXJJRDogRm91bmQgdXNlciAkVXNlcntVc2VyTG9naW59IGZvciBVc2VySUQgJFVzZXJJRCIsCiAgICApOwoKICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICBTdWNjZXNzICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+ICRVc2VySUQsCiAgICAgICAgRW1haWwgICAgPT4gJFVzZXJ7VXNlckVtYWlsfSB8fCAnJywKICAgICAgICBGdWxsbmFtZSA9PiAkVXNlcntVc2VyRnVsbG5hbWV9IHx8ICcnLAogICAgICAgIExvZ2luICAgID0+ICRVc2Vye1VzZXJMb2dpbn0gfHwgJycsCiAgICApOwp9Cgo9aGVhZDIgX0dldE91dE9mT2ZmaWNlKCkKCkdldCBvdXQtb2Ytb2ZmaWNlIHN0YXR1cyBmb3IgYW4gYWdlbnQgYnkgZW1haWwuCgpQYXJhbWV0ZXJzOgogICAgRW1haWwgLSBFbWFpbCBhZGRyZXNzIG9mIHRoZSBhZ2VudAoKUmV0dXJucyBKU09OOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgT3V0T2ZPZmZpY2U6IHsKICAgICAgICAgICAgc3RhdHVzOiAiYWx3YXlzRW5hYmxlZCIsCiAgICAgICAgICAgIGludGVybmFsUmVwbHlNZXNzYWdlOiAiSWNoIGJpbiBhYndlc2VuZC4uLiIsCiAgICAgICAgICAgIHNjaGVkdWxlZFN0YXJ0RGF0ZVRpbWU6ICIyMDI1LTEyLTI5VDAwOjAwOjAwWiIsCiAgICAgICAgICAgIHNjaGVkdWxlZEVuZERhdGVUaW1lOiAiMjAyNi0wMS0wNFQyMzo1OTo1OVoiCiAgICAgICAgfQogICAgfQoKSWYgT09GIGlzIG5vdCBhY3RpdmU6CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBPdXRPZk9mZmljZTogbnVsbAogICAgfQoKPWN1dAoKc3ViIF9HZXRPdXRPZk9mZmljZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRVc2VyT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBHZXQgZW1haWwgcGFyYW1ldGVyCiAgICBteSAkRW1haWwgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRW1haWwnICkgfHwgJyc7CgogICAgaWYgKCAhJEVtYWlsICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdNaXNzaW5nIEVtYWlsIHBhcmFtZXRlcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZOiBSYXRlIGxpbWl0aW5nIC0gYm91bmQgZW1haWwgZW51bWVyYXRpb24KICAgIGlmICggISRTZWxmLT5fQ2hlY2tSYXRlTGltaXQoJ0dldE91dE9mT2ZmaWNlJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1JhdGUgbGltaXQgZXhjZWVkZWQgLSBwbGVhc2Ugd2FpdCBiZWZvcmUgbWFraW5nIG1vcmUgcmVxdWVzdHMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBGaW5kIHVzZXIgYnkgZW1haWwgKGNhc2UtaW5zZW5zaXRpdmUpCiAgICBteSAlQWxsVXNlcnMgPSAkVXNlck9iamVjdC0+VXNlckxpc3QoIFZhbGlkID0+IDEgKTsKICAgIG15ICRMb3dlckVtYWlsID0gbGMoJEVtYWlsKTsKICAgIG15ICRVc2VySUQ7CgogICAgZm9yIG15ICRVSUQgKCBrZXlzICVBbGxVc2VycyApIHsKICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoIFVzZXJJRCA9PiAkVUlEICk7CiAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlckVtYWlsfSAmJiBsYyggJFVzZXJEYXRhe1VzZXJFbWFpbH0gKSBlcSAkTG93ZXJFbWFpbCApIHsKICAgICAgICAgICAgJFVzZXJJRCA9ICRVSUQ7CiAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVc2VySUQgKSB7CiAgICAgICAgIyBVc2VyIG5vdCBmb3VuZCAtIG5vIE9PRiBkYXRhCiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzICAgICA9PiAxLAogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiB1bmRlZiwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHVzZXIgcHJlZmVyZW5jZXMgZm9yIE9PRgogICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKCBVc2VySUQgPT4gJFVzZXJJRCApOwoKICAgICMgQ2hlY2sgaWYgT09GIGlzIGVuYWJsZWQKICAgIGlmICggISRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZX0gfHwgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlfSBuZSAnMScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzICAgICA9PiAxLAogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiB1bmRlZiwKICAgICAgICApOwogICAgfQoKICAgICMgQnVpbGQgZGF0ZSBzdHJpbmdzCiAgICBteSAkU3RhcnREYXRlOwogICAgbXkgJEVuZERhdGU7CgogICAgaWYgKCAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydFllYXJ9ICYmICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0TW9udGh9ICYmICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0RGF5fSApIHsKICAgICAgICAkU3RhcnREYXRlID0gc3ByaW50ZigKICAgICAgICAgICAgJyUwNGQtJTAyZC0lMDJkVDAwOjAwOjAwWicsCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0WWVhcn0sCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0TW9udGh9LAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydERheX0KICAgICAgICApOwogICAgfQoKICAgIGlmICggJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlRW5kWWVhcn0gJiYgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlRW5kTW9udGh9ICYmICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZERheX0gKSB7CiAgICAgICAgJEVuZERhdGUgPSBzcHJpbnRmKAogICAgICAgICAgICAnJTA0ZC0lMDJkLSUwMmRUMjM6NTk6NTlaJywKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlRW5kWWVhcn0sCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZE1vbnRofSwKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlRW5kRGF5fQogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiBPT0YgaXMgY3VycmVudGx5IGFjdGl2ZSAod2l0aGluIGRhdGUgcmFuZ2UpCiAgICBteSAkTm93ID0gdGltZSgpOwogICAgbXkgJElzQWN0aXZlID0gMTsKCiAgICBpZiAoJFN0YXJ0RGF0ZSkgewogICAgICAgICMgUGFyc2Ugc3RhcnQgZGF0ZQogICAgICAgIGlmICggJFN0YXJ0RGF0ZSA9fiAvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pLyApIHsKICAgICAgICAgICAgdXNlIFBPU0lYIHF3KG1rdGltZSk7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVzdGFtcCA9IFBPU0lYOjpta3RpbWUoIDAsIDAsIDAsICQzLCAkMiAtIDEsICQxIC0gMTkwMCApOwogICAgICAgICAgICBpZiAoICROb3cgPCAkU3RhcnRUaW1lc3RhbXAgKSB7CiAgICAgICAgICAgICAgICAkSXNBY3RpdmUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJElzQWN0aXZlICYmICRFbmREYXRlICkgewogICAgICAgICMgUGFyc2UgZW5kIGRhdGUKICAgICAgICBpZiAoICRFbmREYXRlID1+IC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkvICkgewogICAgICAgICAgICB1c2UgUE9TSVggcXcobWt0aW1lKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWVzdGFtcCA9IFBPU0lYOjpta3RpbWUoIDU5LCA1OSwgMjMsICQzLCAkMiAtIDEsICQxIC0gMTkwMCApOwogICAgICAgICAgICBpZiAoICROb3cgPiAkRW5kVGltZXN0YW1wICkgewogICAgICAgICAgICAgICAgJElzQWN0aXZlID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkSXNBY3RpdmUgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzICAgICA9PiAxLAogICAgICAgICAgICBPdXRPZk9mZmljZSA9PiB1bmRlZiwKICAgICAgICApOwogICAgfQoKICAgICMgQnVpbGQgT09GIG1lc3NhZ2UgKFpudW55IGRvZXNuJ3QgaGF2ZSBzZXBhcmF0ZSBpbnRlcm5hbC9leHRlcm5hbCBtZXNzYWdlcykKICAgICMgV2UgYnVpbGQgYSBzaW1wbGUgbWVzc2FnZSBmcm9tIHRoZSBkYXRlIHJhbmdlCiAgICBteSAkTWVzc2FnZSA9ICdBYndlc2VuZCc7CiAgICBpZiAoICRTdGFydERhdGUgJiYgJEVuZERhdGUgKSB7CiAgICAgICAgbXkgJFN0YXJ0Rm9ybWF0dGVkID0gc3ByaW50ZiggJyUwMmQuJTAyZC4lMDRkJywKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlU3RhcnREYXl9LAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydE1vbnRofSwKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlU3RhcnRZZWFyfQogICAgICAgICk7CiAgICAgICAgbXkgJEVuZEZvcm1hdHRlZCA9IHNwcmludGYoICclMDJkLiUwMmQuJTA0ZCcsCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZERheX0sCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZE1vbnRofSwKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlRW5kWWVhcn0KICAgICAgICApOwogICAgICAgICRNZXNzYWdlID0gIkFid2VzZW5kIHZvbSAkU3RhcnRGb3JtYXR0ZWQgYmlzICRFbmRGb3JtYXR0ZWQiOwogICAgfQoKICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gR2V0T3V0T2ZPZmZpY2U6IFVzZXIgJFVzZXJJRCBpcyBPT0YgdW50aWwgJEVuZERhdGUiLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICBPdXRPZk9mZmljZSA9PiB7CiAgICAgICAgICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgPT4gJ2Fsd2F5c0VuYWJsZWQnLAogICAgICAgICAgICBpbnRlcm5hbFJlcGx5TWVzc2FnZSAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICBleHRlcm5hbFJlcGx5TWVzc2FnZSAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICBleHRlcm5hbEF1ZGllbmNlICAgICAgID0+ICdhbGwnLAogICAgICAgICAgICBzY2hlZHVsZWRTdGFydERhdGVUaW1lID0+ICRTdGFydERhdGUsCiAgICAgICAgICAgIHNjaGVkdWxlZEVuZERhdGVUaW1lICAgPT4gJEVuZERhdGUsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBfR2V0Q2FsZW5kYXJGb3JRdWV1ZSgpCgpHZXQgdGhlIGNhbGVuZGFyIG5hbWUgZm9yIGEgcXVldWUsIHdpdGggaW5oZXJpdGFuY2UgZnJvbSBwYXJlbnQgcXVldWVzLgoKRXhhbXBsZTogRm9yIHF1ZXVlICJJVDo6SGFyZHdhcmU6OlByaW50ZXIiLCBjaGVja3M6CiAgICAxLiBJVDo6SGFyZHdhcmU6OlByaW50ZXIgKGRpcmVjdCBtYXRjaCkKICAgIDIuIElUOjpIYXJkd2FyZSAocGFyZW50KQogICAgMy4gSVQgKGdyYW5kcGFyZW50KQoKPWN1dAoKc3ViIF9HZXRDYWxlbmRhckZvclF1ZXVlIHsKICAgIG15ICggJFNlbGYsICRRdWV1ZU5hbWUgKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRNYXBwaW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpRdWV1ZUNhbGVuZGFyTWFwcGluZycpIHx8IHt9OwoKICAgICMgRGlyZWN0IG1hdGNoPwogICAgaWYgKCAkTWFwcGluZy0+eyRRdWV1ZU5hbWV9ICkgewogICAgICAgIHJldHVybiAkTWFwcGluZy0+eyRRdWV1ZU5hbWV9OwogICAgfQoKICAgICMgQ2hlY2sgcGFyZW50IHF1ZXVlcyAocmVjdXJzaXZlKQogICAgbXkgQFBhcnRzID0gc3BsaXQgLzo6LywgJFF1ZXVlTmFtZTsKICAgIHdoaWxlICggQFBhcnRzID4gMSApIHsKICAgICAgICBwb3AgQFBhcnRzOwogICAgICAgIG15ICRQYXJlbnRRdWV1ZSA9IGpvaW4gJzo6JywgQFBhcnRzOwogICAgICAgIGlmICggJE1hcHBpbmctPnskUGFyZW50UXVldWV9ICkgewogICAgICAgICAgICByZXR1cm4gJE1hcHBpbmctPnskUGFyZW50UXVldWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIE5vIG1hcHBpbmcgZm91bmQKICAgIHJldHVybjsKfQoKPWhlYWQyIF9DaGVja1JhdGVMaW1pdCgpCgpFbmZvcmNlIGEgcGVyLWFnZW50LCBwZXItZW5kcG9pbnQgcmF0ZSBsaW1pdCBvZiA2MCByZXF1ZXN0cy9taW51dGUsIHRvCmJvdW5kIHRoZSBlbnVtZXJhdGlvbiBzdXJmYWNlIG9mIGxvb2t1cCBlbmRwb2ludHMgKGVtYWlsL1VzZXJJRCAtPiBwcm9maWxlCmRhdGEpLiBFYWNoIG5hbWVkIGVuZHBvaW50IGdldHMgaXRzIG93biBpbmRlcGVuZGVudCBidWRnZXQgc28gaGVhdnkKbGVnaXRpbWF0ZSB1c2Ugb2Ygb25lIGVuZHBvaW50IChlLmcuIGhvdmVyIGNhcmRzKSBjYW4ndCBleGhhdXN0IGFub3RoZXIncy4KCiAgICBteSAkT2sgPSAkU2VsZi0+X0NoZWNrUmF0ZUxpbWl0KCdHZXRBZ2VudEJ5VXNlcklEJyk7CgpSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgd2l0aGluIGJ1ZGdldCAoYW5kIGNvdW50cyBpdCksIGZhbHNlIGlmCnRoZSBsaW1pdCB3YXMgYWxyZWFkeSByZWFjaGVkLgoKPWN1dAoKc3ViIF9DaGVja1JhdGVMaW1pdCB7CiAgICBteSAoICRTZWxmLCAkRW5kcG9pbnROYW1lICkgPSBAXzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICRMb2dPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBteSAkUmF0ZUxpbWl0S2V5ID0gIkNvbGxhYm9yYXRpb25SYXRlTGltaXQ6OiR7RW5kcG9pbnROYW1lfTo6JFNlbGYtPntVc2VySUR9IjsKICAgIG15ICRSZXF1ZXN0Q291bnQgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICdDb2xsYWJvcmF0aW9uJywKICAgICAgICBLZXkgID0+ICRSYXRlTGltaXRLZXksCiAgICApIHx8IDA7CgogICAgaWYgKCAkUmVxdWVzdENvdW50ID49IDYwICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gUmF0ZSBsaW1pdCBleGNlZWRlZCBmb3IgJEVuZHBvaW50TmFtZSwgVXNlcklEICRTZWxmLT57VXNlcklEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAnQ29sbGFib3JhdGlvbicsCiAgICAgICAgS2V5ICAgPT4gJFJhdGVMaW1pdEtleSwKICAgICAgICBWYWx1ZSA9PiAkUmVxdWVzdENvdW50ICsgMSwKICAgICAgICBUVEwgICA9PiA2MCwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfSlNPTlJlc3BvbnNlKCkKClJldHVybiBhIEpTT04gcmVzcG9uc2UuCgo9Y3V0CgpzdWIgX0pTT05SZXNwb25zZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkSlNPTk9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICBteSAkSlNPTiA9ICRKU09OT2JqZWN0LT5FbmNvZGUoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcsCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgoKPWN1dAo=</File>

        <!-- Unit Tests -->
        <File Permission="660" Location="scripts/test/Collaboration/AgentCollaborationAJAX.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXI7CgojIEdldCBoZWxwZXIgb2JqZWN0Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0IFNldHVwCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIENyZWF0ZSB0ZXN0IGN1c3RvbWVyIHVzZXIKbXkgJEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgKICAgIExhbmd1YWdlID0+ICdkZScsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRDdXN0b21lclVzZXJMb2dpbiwKICAgICdUZXN0IGN1c3RvbWVyIHVzZXIgY3JlYXRlZDogJyAuICgkQ3VzdG9tZXJVc2VyTG9naW4gfHwgJ0ZBSUxFRCcpLAopOwoKIyBHZXQgdGVzdCBjdXN0b21lciBlbWFpbApteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCik7CgpteSAkQ3VzdG9tZXJFbWFpbCA9ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSB8fCAnJzsKCiRTZWxmLT5UcnVlKAogICAgJEN1c3RvbWVyRW1haWwsCiAgICAnQ3VzdG9tZXIgZW1haWwgcmV0cmlldmVkOiAnIC4gJEN1c3RvbWVyRW1haWwsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdldFVzZXJQcm9maWxlIFRlc3RzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokU2VsZi0+VHJ1ZSgKICAgIDEsCiAgICAnLS0tIEdldFVzZXJQcm9maWxlIFRlc3RzIC0tLScsCik7CgojIFRlc3Q6IEdldCBwcm9maWxlIGZvciBleGlzdGluZyBjdXN0b21lcgpTS0lQOiB7CiAgICBpZiAoISRDdXN0b21lckVtYWlsKSB7CiAgICAgICAgJFNlbGYtPlRydWUoMSwgJ1NLSVA6IE5vIGN1c3RvbWVyIGVtYWlsIGZvciB0ZXN0Jyk7CiAgICAgICAgbGFzdCBTS0lQOwogICAgfQoKICAgICMgU2ltdWxhdGUgQUpBWCByZXF1ZXN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBXZSBjYW4ndCBlYXNpbHkgc2ltdWxhdGUgdGhlIGZ1bGwgQUpBWCBmbG93LCBzbyB3ZSB0ZXN0IHRoZSBtb2R1bGUgZGlyZWN0bHkKICAgIG15ICRBSkFYTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpNb2R1bGVzOjpBZ2VudENvbGxhYm9yYXRpb25BSkFYJyk7CgogICAgaWYgKCEkQUpBWE1vZHVsZSkgewogICAgICAgICRTZWxmLT5UcnVlKDEsICdTS0lQOiBBZ2VudENvbGxhYm9yYXRpb25BSkFYIG1vZHVsZSBub3QgbG9hZGVkJyk7CiAgICAgICAgbGFzdCBTS0lQOwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBSkFYTW9kdWxlLAogICAgICAgICdBZ2VudENvbGxhYm9yYXRpb25BSkFYIG1vZHVsZSBsb2FkZWQnLAogICAgKTsKfQoKIyBUZXN0OiBDdXN0b21lclVzZXIgc2VhcmNoIGJ5IGVtYWlsIHdvcmtzCnsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgbXkgJUN1c3RvbWVyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEN1c3RvbWVyRW1haWwsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLAogICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgc2NhbGFyIGtleXMgJUN1c3RvbWVyTGlzdCwKICAgICAgICAnQ3VzdG9tZXJTZWFyY2ggZmluZHMgY3VzdG9tZXIgYnkgZW1haWwnLAogICAgKTsKCiAgICBpZiAoJUN1c3RvbWVyTGlzdCkgewogICAgICAgIG15ICgkRm91bmRMb2dpbikgPSBrZXlzICVDdXN0b21lckxpc3Q7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkRm91bmRMb2dpbiwKICAgICAgICAgICAgJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAnRm91bmQgY3VzdG9tZXIgbG9naW4gbWF0Y2hlczogJyAuICRGb3VuZExvZ2luLAogICAgICAgICk7CiAgICB9Cn0KCiMgVGVzdDogQ3VzdG9tZXJVc2VyIGRhdGEgcmV0cmlldmFsCnsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICVDdXN0b21lckRhdGEsCiAgICAgICAgJ0N1c3RvbWVyVXNlckRhdGFHZXQgcmV0dXJucyBkYXRhJywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEN1c3RvbWVyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICdVc2VyRW1haWwgZXhpc3RzOiAnIC4gKCRDdXN0b21lckRhdGF7VXNlckVtYWlsfSB8fCAnJyksCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDdXN0b21lckRhdGF7VXNlckZ1bGxuYW1lfSB8fCAkQ3VzdG9tZXJEYXRhe1VzZXJGaXJzdG5hbWV9LAogICAgICAgICdVc2VyIG5hbWUgZXhpc3RzJywKICAgICk7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQWdlbnQgVXNlciBUZXN0cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJFNlbGYtPlRydWUoCiAgICAxLAogICAgJy0tLSBBZ2VudCBVc2VyIFRlc3RzIC0tLScsCik7CgojIFRlc3Q6IEZpbmQgYWdlbnQgYnkgZW1haWwgcHJlZmVyZW5jZQp7CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBHZXQgcm9vdCB1c2VyIGRhdGEKICAgIG15ICVSb290VXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJVJvb3RVc2VyLAogICAgICAgICdSb290IHVzZXIgZGF0YSByZXRyaWV2ZWQnLAogICAgKTsKCiAgICAjIEdldFVzZXJEYXRhKCkgZmFsbHMgYmFjayB0byBVc2VyTG9naW4gd2hlbmV2ZXIgbm8gVXNlckVtYWlsCiAgICAjIHByZWZlcmVuY2UgaXMgYWN0dWFsbHkgc3RvcmVkIChzZWUgS2VybmVsOjpTeXN0ZW06OlVzZXI6OkdldFVzZXJEYXRhLAogICAgIyAiaWYgKCEkUHJlZmVyZW5jZXN7VXNlckVtYWlsfSkgeyAkUHJlZmVyZW5jZXN7VXNlckVtYWlsfSA9CiAgICAjICREYXRhe1VzZXJMb2dpbn07IH0iKSAtIHJvb3QncyBsb2dpbiAocm9vdEBsb2NhbGhvc3QpIGhhcHBlbnMgdG8KICAgICMgbG9vayBsaWtlIGFuIGVtYWlsLCBidXQgdGhhdCBkb2Vzbid0IG1lYW4gYSByZWFsIFVzZXJFbWFpbAogICAgIyBwcmVmZXJlbmNlIHJvdyBleGlzdHMgdG8gZmluZC4gQ2hlY2sgdGhlIGFjdHVhbCBzdG9yZWQgcHJlZmVyZW5jZXMKICAgICMgZGlyZWN0bHkgaW5zdGVhZCBvZiB0cnVzdGluZyBHZXRVc2VyRGF0YSdzIGZhbGxiYWNrIHZhbHVlLCBvciB0aGlzCiAgICAjIGFzc2VydGlvbiBmYWlscyBmb3IgYW55IHVzZXIgcmVseWluZyBvbiB0aGF0IGZhbGxiYWNrICh3aGljaCBpcyB0aGUKICAgICMgY29tbW9uIGNhc2UsIG5vdCBhbiBlZGdlIGNhc2UpLgogICAgbXkgJVJvb3RQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+IDEgKTsKCiAgICBpZiAoICRSb290UHJlZmVyZW5jZXN7VXNlckVtYWlsfSApIHsKICAgICAgICBteSAlVXNlckxpc3QgPSAkVXNlck9iamVjdC0+U2VhcmNoUHJlZmVyZW5jZXMoCiAgICAgICAgICAgIEtleSAgID0+ICdVc2VyRW1haWwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUm9vdFByZWZlcmVuY2Vze1VzZXJFbWFpbH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIHNjYWxhciBrZXlzICVVc2VyTGlzdCwKICAgICAgICAgICAgJ1NlYXJjaFByZWZlcmVuY2VzIGZpbmRzIHVzZXIgYnkgZW1haWw6ICcgLiAkUm9vdFByZWZlcmVuY2Vze1VzZXJFbWFpbH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAnU0tJUDogUm9vdCB1c2VyIGhhcyBubyBVc2VyRW1haWwgcHJlZmVyZW5jZSBhY3R1YWxseSBzdG9yZWQgKEdldFVzZXJEYXRhIGZhbGxzIGJhY2sgdG8gVXNlckxvZ2luLCB3aGljaCBTZWFyY2hQcmVmZXJlbmNlcyBjYW5ub3QgZmluZCknLAogICAgICAgICk7CiAgICB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVGlja2V0IENvdW50IFRlc3RzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokU2VsZi0+VHJ1ZSgKICAgIDEsCiAgICAnLS0tIFRpY2tldCBDb3VudCBUZXN0cyAtLS0nLAopOwoKIyBUZXN0OiBUaWNrZXRTZWFyY2ggZm9yIGN1c3RvbWVyIHdvcmtzCnsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBDb3VudCB0aWNrZXRzIGZvciB0ZXN0IGN1c3RvbWVyIChzaG91bGQgYmUgMCBmb3IgbmV3IGN1c3RvbWVyKQogICAgbXkgJFRpY2tldENvdW50ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luUmF3ID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICBTdGF0ZVR5cGUgICAgICAgICAgICA9PiBbICduZXcnLCAnb3BlbicsICdwZW5kaW5nIHJlbWluZGVyJywgJ3BlbmRpbmcgYXV0bycgXSwKICAgICAgICBSZXN1bHQgICAgICAgICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiAgICAgICAgICAgPT4gJ3JvJywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgZGVmaW5lZCAkVGlja2V0Q291bnQsCiAgICAgICAgJ1RpY2tldFNlYXJjaCBDT1VOVCB3b3JrcyAocmVzdWx0OiAnIC4gKCRUaWNrZXRDb3VudCAvLyAndW5kZWYnKSAuICcpJywKICAgICk7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvZmlsZSBGb3JtYXQgVGVzdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gUHJvZmlsZSBGb3JtYXQgVGVzdHMgLS0tJywKKTsKCiMgVGVzdDogUHJvZmlsZSBzdHJ1Y3R1cmUgbWF0Y2hlcyBleHBlY3RlZCBmb3JtYXQKewogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICk7CgogICAgIyBCdWlsZCBwcm9maWxlIGluIGV4cGVjdGVkIGZvcm1hdAogICAgbXkgJVByb2ZpbGUgPSAoCiAgICAgICAgZGlzcGxheU5hbWUgICAgPT4gJEN1c3RvbWVyRGF0YXtVc2VyRnVsbG5hbWV9ICB8fCAnJywKICAgICAgICBnaXZlbk5hbWUgICAgICA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJGaXJzdG5hbWV9IHx8ICcnLAogICAgICAgIHN1cm5hbWUgICAgICAgID0+ICRDdXN0b21lckRhdGF7VXNlckxhc3RuYW1lfSAgfHwgJycsCiAgICAgICAgZW1haWwgICAgICAgICAgPT4gJEN1c3RvbWVyRGF0YXtVc2VyRW1haWx9ICAgICB8fCAnJywKICAgICAgICBqb2JUaXRsZSAgICAgICA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJUaXRsZX0gICAgIHx8ICcnLAogICAgICAgIGJ1c2luZXNzUGhvbmVzID0+ICRDdXN0b21lckRhdGF7VXNlclBob25lfSA/IFsgJEN1c3RvbWVyRGF0YXtVc2VyUGhvbmV9IF0gOiBbXSwKICAgICAgICBtb2JpbGVQaG9uZSAgICA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJNb2JpbGV9ICAgIHx8ICcnLAogICAgICAgIG9mZmljZUxvY2F0aW9uID0+ICRDdXN0b21lckRhdGF7VXNlckNpdHl9ICAgICAgfHwgJycsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRQcm9maWxle2Rpc3BsYXlOYW1lfSB8fCAkUHJvZmlsZXtlbWFpbH0sCiAgICAgICAgJ1Byb2ZpbGUgaGFzIGRpc3BsYXlOYW1lIG9yIGVtYWlsJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHJlZiAkUHJvZmlsZXtidXNpbmVzc1Bob25lc30sCiAgICAgICAgJ0FSUkFZJywKICAgICAgICAnYnVzaW5lc3NQaG9uZXMgaXMgYXJyYXknLAogICAgKTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBFZGdlIENhc2UgVGVzdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gRWRnZSBDYXNlIFRlc3RzIC0tLScsCik7CgojIFRlc3Q6IFVua25vd24gZW1haWwgcmV0dXJucyBtaW5pbWFsIHByb2ZpbGUgc3RydWN0dXJlCnsKICAgIG15ICRVbmtub3duRW1haWwgPSAnbm9uZXhpc3RlbnQtJyAuIHRpbWUoKSAuICdAbm93aGVyZS5pbnZhbGlkJzsKCiAgICAjIFNpbXVsYXRlIHdoYXQgdGhlIG1vZHVsZSBkb2VzCiAgICBteSAkTG9jYWxQYXJ0ID0gJFVua25vd25FbWFpbDsKICAgICRMb2NhbFBhcnQgPX4gcy9ALiokLy87CiAgICAkTG9jYWxQYXJ0ID1+IHMvWy5fLV0vIC9nOwogICAgJExvY2FsUGFydCA9IHVjZmlyc3QoJExvY2FsUGFydCk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJExvY2FsUGFydCwKICAgICAgICAnTG9jYWwgcGFydCBleHRyYWN0aW9uIHdvcmtzOiAnIC4gJExvY2FsUGFydCwKICAgICk7Cn0KCiMgVGVzdDogRW1haWwgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMKewogICAgbXkgJFNwZWNpYWxFbWFpbCA9ICd0ZXN0LnVzZXIrdGFnQGV4YW1wbGUuY29tJzsKICAgIG15ICRMb2NhbFBhcnQgPSAkU3BlY2lhbEVtYWlsOwogICAgJExvY2FsUGFydCA9fiBzL0AuKiQvLzsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvY2FsUGFydCwKICAgICAgICAndGVzdC51c2VyK3RhZycsCiAgICAgICAgJ1NwZWNpYWwgY2hhcmFjdGVycyBwcmVzZXJ2ZWQgaW4gbG9jYWwgcGFydCcsCiAgICApOwp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENsZWFudXAKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gVGVzdCBDb21wbGV0ZSAtLS0nLAopOwoKMTsK</File>
    </Filelist>

    <!-- Database: Create Collaboration link type for Ticket-Appointment links -->
    <DatabaseInstall Type="post">
        <!-- Add Collaboration link type if not exists -->
        <Insert Table="link_type">
            <Data Key="name" Type="Quote">Collaboration</Data>
            <Data Key="valid_id">1</Data>
            <Data Key="create_time">current_timestamp</Data>
            <Data Key="create_by">1</Data>
            <Data Key="change_time">current_timestamp</Data>
            <Data Key="change_by">1</Data>
        </Insert>
    </DatabaseInstall>

    <DatabaseUninstall Type="pre">
        <!-- Remove Collaboration link type on uninstall -->
        <Delete Table="link_type">
            <Where Column="name" CompareType="Equal" Type="Quote">Collaboration</Where>
        </Delete>
    </DatabaseUninstall>

    <IntroInstall Type="pre" Title="Installation Information" Lang="en"><![CDATA[
        <p><strong>Thank you for installing the Znuny Collaboration Add-on!</strong></p>
        <p>This add-on integrates Microsoft 365 (Teams, Outlook, Exchange) directly into Znuny.</p>
        <p><strong>After installation:</strong></p>
        <ol>
            <li>Create an App Registration in Microsoft Entra ID</li>
            <li>Configure SysConfig settings (TenantID, ClientID)</li>
            <li>Enable desired features</li>
        </ol>
        <p>See the documentation for detailed setup instructions.</p>
    ]]></IntroInstall>
    <IntroInstall Type="pre" Title="Installationsinformationen" Lang="de"><![CDATA[
        <p><strong>Vielen Dank fuer die Installation des Znuny Collaboration Add-ons!</strong></p>
        <p>Dieses Add-on integriert Microsoft 365 (Teams, Outlook, Exchange) direkt in Znuny.</p>
        <p><strong>Nach der Installation:</strong></p>
        <ol>
            <li>App Registration in Microsoft Entra ID erstellen</li>
            <li>SysConfig-Einstellungen konfigurieren (TenantID, ClientID)</li>
            <li>Gewuenschte Features aktivieren</li>
        </ol>
        <p>Detaillierte Anleitungen finden Sie in der Dokumentation.</p>
    ]]></IntroInstall>

    <IntroUninstall Type="pre" Title="Uninstall Information" Lang="en"><![CDATA[
        <p><strong>You are about to uninstall the Collaboration Add-on.</strong></p>
        <p><em>Note:</em> No data is stored in Znuny - all collaboration data comes from Microsoft 365.</p>
    ]]></IntroUninstall>
    <IntroUninstall Type="pre" Title="Deinstallationsinformationen" Lang="de"><![CDATA[
        <p><strong>Sie sind dabei, das Collaboration Add-on zu deinstallieren.</strong></p>
        <p><em>Hinweis:</em> Es werden keine Daten in Znuny gespeichert - alle Kollaborationsdaten kommen von Microsoft 365.</p>
    ]]></IntroUninstall>

</otrs_package>
