<?xml version="1.0" encoding="utf-8"?>
<otrs_package version="1.0">
    <Name>WarrantySync</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">Automatic warranty information retrieval for IT hardware assets from manufacturer APIs (Dell, Lenovo).</Description>
    <Description Lang="de">Automatischer Abruf von Garantieinformationen fuer IT-Hardware-Assets ueber Hersteller-APIs (Dell, Lenovo).</Description>

    <ChangeLog Version="6.5.0" Date="2026-09-20">Initial release for Znuny 6.5.x, ported from the 7.2.x line, functionally identical: automatic warranty sync for CMDB assets via Dell TechDirect API v5 and Lenovo PC Support API v4. Configurable field mapping to class attributes. Automatic warranty status recalculation. Separate recheck intervals for active/expired warranties. Expiry notification tickets with configurable templates, filters and duplicate protection. Retry logic with exponential backoff. Separate tracking table for check timestamps (no CMDB version bloat). Portable SQL for MySQL, PostgreSQL and Oracle. Adds a 78-assertion unit test suite covering the orchestrator, both providers and the CLI command.</ChangeLog>
    <ChangeLog Version="7.2.0" Date="2026-04-14">Initial release: Automatic warranty sync for CMDB assets via Dell TechDirect API v5 and Lenovo PC Support API v4. Configurable field mapping to class attributes. Automatic warranty status recalculation. Separate recheck intervals for active/expired warranties. Expiry notification tickets with configurable templates, filters and duplicate protection. Retry logic with exponential backoff. Separate tracking table for check timestamps (no CMDB version bloat). Portable SQL for MySQL, PostgreSQL and Oracle.</ChangeLog>

    <IntroInstall Type="post" Lang="en" Title="Installation Complete"><![CDATA[
        <h2>WarrantySync successfully installed!</h2>

        <p>The add-on will automatically check warranty information for your CMDB hardware assets
        via manufacturer APIs. The Znuny Daemon runs the sync daily at 02:00.</p>

        <h3>Setup Steps</h3>
        <ol>
            <li>Enable the feature: <strong>Admin &rarr; SysConfig &rarr; WarrantySync::Enabled</strong></li>
            <li>Configure API credentials for your manufacturers (Dell, Lenovo)</li>
            <li>Configure the vendor mapping to match your CMDB vendor names</li>
            <li>Run a manual sync: <code>bin/znuny.Console.pl Maint::WarrantySync::Run --force</code></li>
        </ol>

        <h3>Supported Manufacturers</h3>
        <table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse;">
            <tr style="background-color: #f5f5f5;">
                <th>Manufacturer</th>
                <th>API</th>
                <th>Requirements</th>
            </tr>
            <tr>
                <td><strong>Dell</strong></td>
                <td>TechDirect API v5</td>
                <td>Client ID + Client Secret from <a href="https://techdirect.dell.com">techdirect.dell.com</a></td>
            </tr>
            <tr>
                <td><strong>Lenovo</strong></td>
                <td>PC Support API v4</td>
                <td>No API key required (public API)</td>
            </tr>
        </table>

        <p><em>Documentation: see Admin Manual</em></p>
    ]]></IntroInstall>

    <IntroInstall Type="post" Lang="de" Title="Installation abgeschlossen"><![CDATA[
        <h2>WarrantySync erfolgreich installiert!</h2>

        <p>Das Add-on prueft automatisch die Garantieinformationen Ihrer CMDB-Hardware-Assets
        ueber Hersteller-APIs. Der Znuny Daemon fuehrt den Sync taeglich um 02:00 Uhr aus.</p>

        <h3>Einrichtung</h3>
        <ol>
            <li>Feature aktivieren: <strong>Admin &rarr; SysConfig &rarr; WarrantySync::Enabled</strong></li>
            <li>API-Zugangsdaten fuer Ihre Hersteller konfigurieren (Dell, Lenovo)</li>
            <li>Vendor-Mapping an Ihre CMDB-Herstellernamen anpassen</li>
            <li>Manuellen Sync ausfuehren: <code>bin/znuny.Console.pl Maint::WarrantySync::Run --force</code></li>
        </ol>

        <p><em>Dokumentation: siehe Admin-Handbuch</em></p>
    ]]></IntroInstall>

    <IntroUninstall Type="pre" Lang="en" Title="Uninstall Warning"><![CDATA[
        <h2>Uninstalling WarrantySync</h2>
        <p>Warranty data stored in ConfigItem class attributes will be preserved.
        The scheduled cron task will be removed automatically.</p>
    ]]></IntroUninstall>

    <IntroUninstall Type="pre" Lang="de" Title="Deinstallations-Warnung"><![CDATA[
        <h2>WarrantySync wird deinstalliert</h2>
        <p>Garantiedaten in den ConfigItem-Klassenattributen bleiben erhalten.
        Der geplante Cron-Task wird automatisch entfernt.</p>
    ]]></IntroUninstall>

    <Filelist>
        <!-- SysConfig -->
        <File Permission="660" Location="Kernel/Config/Files/XML/WarrantySync.xml" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjIuMCIgaW5pdD0iQXBwbGljYXRpb24iPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIEZlYXR1cmUgVG9nZ2xlICAgICAgICAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpFbmFibGVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHdhcnJhbnR5IHN5bmMgZmVhdHVyZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OldhcnJhbnR5U3luYzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBDcm9uIFRhc2sgICAgICAgICAgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkRhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjV2FycmFudHlTeW5jIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNjaGVkdWxlZCB0YXNrIHRvIHN5bmMgd2FycmFudHkgaW5mb3JtYXRpb24gZnJvbSBtYW51ZmFjdHVyZXIgQVBJcy4gUnVucyBkYWlseSBhdCAwMjowMCBieSBkZWZhdWx0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2s8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFza05hbWUiPldhcnJhbnR5U3luYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2NoZWR1bGUiPjAgMiAqICogKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGdW5jdGlvbiI+UnVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlBhcmFtcyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIENvbmZpZ0l0ZW0gU291cmNlIChJbnB1dCkgICAgICAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpDb25maWdJdGVtOjpDbGFzc2VzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNNREIgY2xhc3NlcyB0byBzZWFyY2ggZm9yIGhhcmR3YXJlIGFzc2V0cy4gVGhlIHdhcnJhbnR5IHN5bmMgd2lsbCBjaGVjayBhbGwgQ29uZmlnSXRlbXMgaW4gdGhlc2UgY2xhc3Nlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OldhcnJhbnR5U3luYzo6Q29uZmlnSXRlbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbXB1dGVyPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk9ubHkgY2hlY2sgQ29uZmlnSXRlbXMgaW4gdGhlc2UgZGVwbG95bWVudCBzdGF0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW08L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5Qcm9kdWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TWFpbnRlbmFuY2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5QaWxvdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlBsYW5uZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5SZXZpZXc8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OlZlbmRvckF0dHJpYnV0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZSBuYW1lIGNvbnRhaW5pbmcgdGhlIHZlbmRvci9tYW51ZmFjdHVyZXIuIFRoaXMgaXMgdGhlIGtleSBuYW1lIGZyb20geW91ciBDTURCIGNsYXNzIGRlZmluaXRpb24gKFlBTUwpLiBEZWZhdWx0IG1hdGNoZXMgdGhlIHN0YW5kYXJkIElUU00gQ29tcHV0ZXIgY2xhc3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW08L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5WZW5kb3I8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OlNlcmlhbEF0dHJpYnV0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Db25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZSBuYW1lIGNvbnRhaW5pbmcgdGhlIHNlcmlhbCBudW1iZXIgLyBzZXJ2aWNlIHRhZy4gVGhpcyBpcyB0aGUga2V5IG5hbWUgZnJvbSB5b3VyIENNREIgY2xhc3MgZGVmaW5pdGlvbiAoWUFNTCkuIERlZmF1bHQgbWF0Y2hlcyB0aGUgc3RhbmRhcmQgSVRTTSBDb21wdXRlciBjbGFzcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OldhcnJhbnR5U3luYzo6Q29uZmlnSXRlbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPlNlcmlhbE51bWJlcjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFZlbmRvciB0byBQcm92aWRlciBNYXBwaW5nICAgICAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpWZW5kb3JNYXBwaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1hcHMgQ01EQiB2ZW5kb3IgdmFsdWVzIHRvIHdhcnJhbnR5IHByb3ZpZGVyIG5hbWVzLiBLZXkgPSB2ZW5kb3IgdmFsdWUgYXMgaXQgYXBwZWFycyBpbiB5b3VyIENNREIgKGV4YWN0IG1hdGNoKSwgVmFsdWUgPSBwcm92aWRlciBuYW1lIChEZWxsLCBMZW5vdm8pLiBGb3IgR2VuZXJhbENhdGFsb2ctdHlwZSB2ZW5kb3IgZmllbGRzLCB1c2UgdGhlIGNhdGFsb2cgaXRlbSBuYW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlbGwgSW5jLiI+RGVsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVsbCI+RGVsbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGVub3ZvIj5MZW5vdm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikxlbm92byBHcm91cCI+TGVub3ZvPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBPdXRwdXQgRmllbGQgTWFwcGluZyAgICAgICAgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6T3V0cHV0OjpGaWVsZE1hcHBpbmciIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFwcyB3YXJyYW50eSBBUEkgcmVzdWx0IGZpZWxkcyB0byBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZXMuIEtleSA9IEFQSSByZXN1bHQgZmllbGQgbmFtZSwgVmFsdWUgPSBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZSBuYW1lIGZyb20geW91ciBDTURCIGNsYXNzIGRlZmluaXRpb24gKFlBTUwpLiBTZXQgYSB2YWx1ZSB0byBlbXB0eSBzdHJpbmcgdG8gc2tpcCB0aGF0IGZpZWxkLiBUaGUgZGVmYXVsdCAnV2FycmFudHlFeHBpcmF0aW9uRGF0ZScgbWF0Y2hlcyB0aGUgc3RhbmRhcmQgSVRTTSBDb21wdXRlciBjbGFzcy4gQWxsIG90aGVyIGZpZWxkcyByZXF1aXJlIGFkZGluZyBjdXN0b20gYXR0cmlidXRlcyB0byB5b3VyIGNsYXNzIGRlZmluaXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW08L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV2FycmFudHlFbmQiPldhcnJhbnR5RXhwaXJhdGlvbkRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IldhcnJhbnR5U3RhcnQiPldhcnJhbnR5U3RhcnREYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXYXJyYW50eVR5cGUiPldhcnJhbnR5VHlwZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iV2FycmFudHlTdGF0dXMiPldhcnJhbnR5U3RhdHVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJXYXJyYW50eVByb2R1Y3QiPlZlbmRvclByb2R1Y3ROYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTaGlwRGF0ZSI+U2hpcERhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNoaXBDb3VudHJ5Ij5TaGlwVG9Db3VudHJ5PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBSZWNoZWNrIFNldHRpbmdzICAgICAgICAgICAgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6UmVjaGVja0FmdGVyRXhwaXJ5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklmIGVuYWJsZWQsIGFzc2V0cyB3aXRoIGV4cGlyZWQgd2FycmFudGllcyB3aWxsIGJlIHJlY2hlY2tlZCBwZXJpb2RpY2FsbHkgaW4gY2FzZSB0aGUgd2FycmFudHkgd2FzIGV4dGVuZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6UmVjaGVja0ludGVydmFsIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1pbmltdW0gbnVtYmVyIG9mIGRheXMgYmV0d2VlbiB3YXJyYW50eSByZWNoZWNrcyBmb3IgYXNzZXRzIHdpdGggYWN0aXZlIHdhcnJhbnR5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5cZCskIj4zMDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6UmVjaGVja0ludGVydmFsRXhwaXJlZCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NaW5pbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gd2FycmFudHkgcmVjaGVja3MgZm9yIGFzc2V0cyB3aXRoIGV4cGlyZWQgd2FycmFudHkuIFNldCBoaWdoZXIgdG8gc2F2ZSBBUEkgY2FsbHMgaWYgZXh0ZW5zaW9ucyBhcmUgcmFyZSwgb3IgbG93ZXIgaWYgeW91IGZyZXF1ZW50bHkgZXh0ZW5kIHdhcnJhbnRpZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjMwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gQVBJIFJlcXVlc3QgU2V0dGluZ3MgICAgICAgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6QVBJOjpNYXhSZXRyaWVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1heGltdW0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzIGZvciBmYWlsZWQgQVBJIHJlcXVlc3RzIChyYXRlIGxpbWl0aW5nLCBzZXJ2ZXIgZXJyb3JzKS4gVXNlcyBleHBvbmVudGlhbCBiYWNrb2ZmOiAycywgNHMsIDhzLCBldGMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjM8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIEV4cGlyeSBOb3RpZmljYXRpb24gKFRpY2tldCBDcmVhdGlvbikgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkVuYWJsZWQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWYgZW5hYmxlZCwgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgdGlja2V0IHdoZW4gYSB3YXJyYW50eSBpcyBhYm91dCB0byBleHBpcmUuIFJ1bnMgYWZ0ZXIgZWFjaCBzeW5jLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkRheXNCZWZvcmUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TnVtYmVyIG9mIGRheXMgYmVmb3JlIHdhcnJhbnR5IGV4cGlyYXRpb24gdG8gY3JlYXRlIGEgbm90aWZpY2F0aW9uIHRpY2tldC4gRXhhbXBsZTogOTAgbWVhbnMgYSB0aWNrZXQgaXMgY3JlYXRlZCB3aGVuIHRoZSB3YXJyYW50eSBleHBpcmVzIHdpdGhpbiB0aGUgbmV4dCA5MCBkYXlzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjkwPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OlF1ZXVlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlF1ZXVlIGZvciB3YXJyYW50eSBleHBpcnkgbm90aWZpY2F0aW9uIHRpY2tldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIj5SYXc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQgdHlwZSBmb3Igd2FycmFudHkgZXhwaXJ5IG5vdGlmaWNhdGlvbiB0aWNrZXRzLiBMZWF2ZSBlbXB0eSBmb3IgZGVmYXVsdCB0eXBlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJUeXBlIj5VbmNsYXNzaWZpZWQ8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6UHJpb3JpdHkiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UHJpb3JpdHkgZm9yIHdhcnJhbnR5IGV4cGlyeSBub3RpZmljYXRpb24gdGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OldhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUHJpb3JpdHkiIFZhbHVlUmVnZXg9IiI+MyBub3JtYWw8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SW5pdGlhbCBzdGF0ZSBmb3Igd2FycmFudHkgZXhwaXJ5IG5vdGlmaWNhdGlvbiB0aWNrZXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJTdGF0ZSIgVmFsdWVSZWdleD0iIj5uZXc8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6U3ViamVjdFRlbXBsYXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlN1YmplY3QgdGVtcGxhdGUgZm9yIHdhcnJhbnR5IGV4cGlyeSB0aWNrZXRzLiBQbGFjZWhvbGRlcnM6ICZsdDtBU1NFVF9OQU1FJmd0OywgJmx0O1NFUklBTCZndDssICZsdDtXQVJSQU5UWV9FTkQmZ3Q7LCAmbHQ7VkVORE9SJmd0OywgJmx0O0RBWVNfTEVGVCZndDs8L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OldhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciPldhcnJhbnR5IGV4cGlyaW5nOiAmbHQ7QVNTRVRfTkFNRSZndDsgKCZsdDtTRVJJQUwmZ3Q7KSAtICZsdDtXQVJSQU5UWV9FTkQmZ3Q7PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkJvZHlUZW1wbGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Cb2R5IHRlbXBsYXRlIGZvciB3YXJyYW50eSBleHBpcnkgdGlja2V0cy4gUGxhY2Vob2xkZXJzOiAmbHQ7QVNTRVRfTkFNRSZndDssICZsdDtTRVJJQUwmZ3Q7LCAmbHQ7V0FSUkFOVFlfRU5EJmd0OywgJmx0O1dBUlJBTlRZX1NUQVJUJmd0OywgJmx0O1dBUlJBTlRZX1RZUEUmZ3Q7LCAmbHQ7VkVORE9SJmd0OywgJmx0O1BST0RVQ1RfTkFNRSZndDssICZsdDtEQVlTX0xFRlQmZ3Q7LCAmbHQ7Q09ORklHX0lURU1fSUQmZ3Q7PC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5UaGUgd2FycmFudHkgZm9yIHRoZSBmb2xsb3dpbmcgYXNzZXQgZXhwaXJlcyBvbiAmbHQ7V0FSUkFOVFlfRU5EJmd0OzpcblxuQXNzZXQ6ICZsdDtBU1NFVF9OQU1FJmd0O1xuU2VyaWFsIE51bWJlcjogJmx0O1NFUklBTCZndDtcblZlbmRvcjogJmx0O1ZFTkRPUiZndDtcblByb2R1Y3Q6ICZsdDtQUk9EVUNUX05BTUUmZ3Q7XG5cbldhcnJhbnR5IFR5cGU6ICZsdDtXQVJSQU5UWV9UWVBFJmd0O1xuV2FycmFudHkgU3RhcnQ6ICZsdDtXQVJSQU5UWV9TVEFSVCZndDtcbldhcnJhbnR5IEVuZDogJmx0O1dBUlJBTlRZX0VORCZndDtcblxuUGxlYXNlIHJldmlldyB3aGV0aGVyIHRoZSB3YXJyYW50eSBzaG91bGQgYmUgcmVuZXdlZC5cblxuQ29uZmlnSXRlbSBJRDogJmx0O0NPTkZJR19JVEVNX0lEJmd0OzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpGaWx0ZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RmlsdGVyIHdoaWNoIGFzc2V0cyBnZXQgZXhwaXJ5IG5vdGlmaWNhdGlvbiB0aWNrZXRzLiBLZXkgPSBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLCBWYWx1ZSA9IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzLiBFeGFtcGxlOiBUeXBlPVNlcnZlcixMYXB0b3AgbWVhbnMgb25seSBhc3NldHMgd2hlcmUgdGhlIFR5cGUgYXR0cmlidXRlIGlzIFNlcnZlciBvciBMYXB0b3AuIE11bHRpcGxlIGtleXMgdXNlIEFORCBsb2dpYy4gTGVhdmUgZW1wdHkgaGFzaCB0byBub3RpZnkgZm9yIGFsbCBhc3NldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBUZXN0IE1vZGUgICAgICAgICAgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6VGVzdE1vZGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjIwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWYgZW5hYmxlZCwgdXNlcyB0ZXN0IGRhdGEgaW5zdGVhZCBvZiBxdWVyeWluZyB0aGUgQ01EQi4gRm9yIGRldmVsb3BtZW50IG9ubHkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gRGVsbCBQcm92aWRlciAgICAgICAgIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsOjpFbmFibGVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgdGhlIERlbGwgVGVjaERpcmVjdCB3YXJyYW50eSBBUEkgcHJvdmlkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6UHJvdmlkZXI6OkRlbGw6OkNsaWVudElEIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiIENvbmZpZ0xldmVsPSIxMDAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlbGwgVGVjaERpcmVjdCBBUEkgQ2xpZW50IElELiBPYnRhaW4gZnJvbSB0ZWNoZGlyZWN0LmRlbGwuY29tLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6V2FycmFudHlTeW5jOjpQcm92aWRlcjo6RGVsbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IldhcnJhbnR5U3luYzo6UHJvdmlkZXI6OkRlbGw6OkNsaWVudFNlY3JldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWxsIFRlY2hEaXJlY3QgQVBJIENsaWVudCBTZWNyZXQuIE9idGFpbiBmcm9tIHRlY2hkaXJlY3QuZGVsbC5jb20uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJQYXNzd29yZCI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTGVub3ZvIFByb3ZpZGVyICAgICAgIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpMZW5vdm86OkVuYWJsZWQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgTGVub3ZvIHdhcnJhbnR5IHByb3ZpZGVyLiBVc2VzIHRoZSBwdWJsaWMgTGVub3ZvIFBDIFN1cHBvcnQgQVBJIC0gbm8gQVBJIGtleSByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6Okxlbm92bzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCjwvb3Ryc19jb25maWc+Cg==</File>

        <!-- Core Modules -->
        <File Permission="660" Location="Kernel/System/WarrantySync.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpabnVueUhlbHBlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYyAtIFdhcnJhbnR5IGluZm9ybWF0aW9uIHN5bmMgZnJvbSBtYW51ZmFjdHVyZXIgQVBJcwoKPWhlYWQxIERFU0NSSVBUSU9OCgpNYWluIG9yY2hlc3RyYXRvciBmb3IgcmV0cmlldmluZyB3YXJyYW50eSBpbmZvcm1hdGlvbiBmcm9tIERlbGwgYW5kIExlbm92bwpBUElzIGFuZCBzdG9yaW5nIHRoZW0gaW4gQ01EQiBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZXMuCgpVc2VzIFpudW55SGVscGVyIHRvIHJlYWQvd3JpdGUgQ29uZmlnSXRlbSB2ZXJzaW9uIGRhdGEgKFhNTERhdGEpLgpFYWNoIHVwZGF0ZSBjcmVhdGVzIGEgbmV3IENvbmZpZ0l0ZW0gdmVyc2lvbiwgcHJvdmlkaW5nIGF1dG9tYXRpYyBoaXN0b3J5LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKCk1haW4gZW50cnkgcG9pbnQgY2FsbGVkIGJ5IHRoZSBabnVueSBEYWVtb24gc2NoZWR1bGVyIGFuZCBDb25zb2xlIENvbW1hbmQuCgogICAgbXkgJFN0YXRzID0gJFdhcnJhbnR5U3luY09iamVjdC0+UnVuKCk7CiAgICBteSAkU3RhdHMgPSAkV2FycmFudHlTeW5jT2JqZWN0LT5SdW4oIEZvcmNlID0+IDEgKTsKClJldHVybnMgYSBoYXNocmVmIHdpdGggc3RhdHM6IHsgQ2hlY2tlZCA9PiBOLCBVcGRhdGVkID0+IE4sIEVycm9ycyA9PiBOLCBTa2lwcGVkID0+IE4gfQoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBteSAlU3RhdHMgPSAoCiAgICAgICAgQ2hlY2tlZCAgPT4gMCwKICAgICAgICBVcGRhdGVkICA9PiAwLAogICAgICAgIEVycm9ycyAgID0+IDAsCiAgICAgICAgU2tpcHBlZCAgPT4gMCwKICAgICk7CgogICAgIyBDaGVjayBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRFbmFibGVkID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkVuYWJsZWQnKTsKICAgIGlmICggISRFbmFibGVkICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnV2FycmFudHlTeW5jOiBGZWF0dXJlIGlzIGRpc2FibGVkLiBTZXQgV2FycmFudHlTeW5jOjpFbmFibGVkIHRvIGFjdGl2YXRlLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gXCVTdGF0czsKICAgIH0KCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICdXYXJyYW50eVN5bmM6IFN0YXJ0aW5nIHdhcnJhbnR5IHN5bmMgcnVuLicsCiAgICApOwoKICAgICMgR2V0IGFzc2V0cyB0byBjaGVjawogICAgbXkgQEFzc2V0cyA9ICRTZWxmLT5fR2V0QXNzZXRzVG9DaGVjayggRm9yY2UgPT4gJFBhcmFte0ZvcmNlfSApOwoKICAgIGlmICggIUBBc3NldHMgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdXYXJyYW50eVN5bmM6IE5vIGFzc2V0cyB0byBjaGVjay4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIFwlU3RhdHM7CiAgICB9CgogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOiBGb3VuZCAiIC4gc2NhbGFyKEBBc3NldHMpIC4gIiBhc3NldChzKSB0byBjaGVjay4iLAogICAgKTsKCiAgICAjIEdyb3VwIGFzc2V0cyBieSBwcm92aWRlcgogICAgbXkgJUFzc2V0c0J5UHJvdmlkZXIgPSAkU2VsZi0+X0dyb3VwQnlQcm92aWRlcihAQXNzZXRzKTsKCiAgICAjIFByb2Nlc3MgZWFjaCBwcm92aWRlcgogICAgZm9yIG15ICRQcm92aWRlck5hbWUgKCBzb3J0IGtleXMgJUFzc2V0c0J5UHJvdmlkZXIgKSB7CiAgICAgICAgbXkgQFByb3ZpZGVyQXNzZXRzID0gQHsgJEFzc2V0c0J5UHJvdmlkZXJ7JFByb3ZpZGVyTmFtZX0gfTsKCiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IFByb2Nlc3NpbmcgJFByb3ZpZGVyTmFtZSBwcm92aWRlciB3aXRoICIKICAgICAgICAgICAgICAgIC4gc2NhbGFyKEBQcm92aWRlckFzc2V0cykgLiAiIGFzc2V0KHMpLiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFByb3ZpZGVyTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjokUHJvdmlkZXJOYW1lIjsKCiAgICAgICAgIyBDaGVjayBpZiBwcm92aWRlciBpcyBlbmFibGVkCiAgICAgICAgbXkgJFByb3ZpZGVyRW5hYmxlZCA9ICRDb25maWdPYmplY3QtPkdldCgiV2FycmFudHlTeW5jOjpQcm92aWRlcjo6JHtQcm92aWRlck5hbWV9OjpFbmFibGVkIik7CiAgICAgICAgaWYgKCAhJFByb3ZpZGVyRW5hYmxlZCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOiBQcm92aWRlciAkUHJvdmlkZXJOYW1lIGlzIGRpc2FibGVkLCBza2lwcGluZyAiCiAgICAgICAgICAgICAgICAgICAgLiBzY2FsYXIoQFByb3ZpZGVyQXNzZXRzKSAuICIgYXNzZXQocykuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN0YXRze1NraXBwZWR9ICs9IHNjYWxhcihAUHJvdmlkZXJBc3NldHMpOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgIyBMb2FkIHByb3ZpZGVyIG1vZHVsZQogICAgICAgIG15ICRMb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRQcm92aWRlck1vZHVsZSk7CiAgICAgICAgaWYgKCAhJExvYWRlZCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IENvdWxkIG5vdCBsb2FkIHByb3ZpZGVyIG1vZHVsZSAkUHJvdmlkZXJNb2R1bGUuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN0YXRze0Vycm9yc30gKz0gc2NhbGFyKEBQcm92aWRlckFzc2V0cyk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBteSAkUHJvdmlkZXJPYmplY3QgPSAkUHJvdmlkZXJNb2R1bGUtPm5ldygpOwoKICAgICAgICAjIEdldCBzZXJpYWwgbnVtYmVycyBmb3IgYmF0Y2ggcXVlcnkKICAgICAgICBteSAlU2VyaWFsVG9Bc3NldDsKICAgICAgICBmb3IgbXkgJEFzc2V0IChAUHJvdmlkZXJBc3NldHMpIHsKICAgICAgICAgICAgJFNlcmlhbFRvQXNzZXR7ICRBc3NldC0+e1NlcmlhbE51bWJlcn0gfSA9ICRBc3NldDsKICAgICAgICB9CgogICAgICAgICMgUXVlcnkgd2FycmFudHkgaW5mb3JtYXRpb24KICAgICAgICBteSAkUmVzdWx0cyA9ICRQcm92aWRlck9iamVjdC0+R2V0V2FycmFudHlJbmZvKAogICAgICAgICAgICBTZXJpYWxOdW1iZXJzID0+IFsga2V5cyAlU2VyaWFsVG9Bc3NldCBdLAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHRzICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldhcnJhbnR5U3luYzogUHJvdmlkZXIgJFByb3ZpZGVyTmFtZSByZXR1cm5lZCBubyByZXN1bHRzLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdGF0c3tFcnJvcnN9ICs9IHNjYWxhcihAUHJvdmlkZXJBc3NldHMpOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KCiAgICAgICAgIyBQcm9jZXNzIHJlc3VsdHMKICAgICAgICBmb3IgbXkgJFNlcmlhbE51bWJlciAoIGtleXMgJXskUmVzdWx0c30gKSB7CiAgICAgICAgICAgIG15ICRBc3NldCAgPSAkU2VyaWFsVG9Bc3NldHskU2VyaWFsTnVtYmVyfTsKICAgICAgICAgICAgbXkgJFJlc3VsdCA9ICRSZXN1bHRzLT57JFNlcmlhbE51bWJlcn07CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0IHx8ICRSZXN1bHQtPntFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICBteSAkRXJyb3JNc2cgPSAkUmVzdWx0ID8gJFJlc3VsdC0+e0Vycm9yfSA6ICdObyBkYXRhIHJldHVybmVkJzsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IEVycm9yIGZvciAkU2VyaWFsTnVtYmVyICgkUHJvdmlkZXJOYW1lKTogJEVycm9yTXNnIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RhdHN7RXJyb3JzfSsrOwogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFN0YXRze0NoZWNrZWR9Kys7CgogICAgICAgICAgICBteSAkVXBkYXRlZCA9ICRTZWxmLT5fVXBkYXRlQXNzZXRXYXJyYW50eSgKICAgICAgICAgICAgICAgIEFzc2V0ICA9PiAkQXNzZXQsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJFJlc3VsdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkVXBkYXRlZCkgewogICAgICAgICAgICAgICAgJFN0YXRze1VwZGF0ZWR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBSZWNhbGN1bGF0ZSB3YXJyYW50eSBzdGF0dXMgZm9yIEFMTCBhc3NldHMgd2l0aCBhIFdhcnJhbnR5RW5kIGRhdGUKICAgICMgVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGxvY2FsIG9wZXJhdGlvbiAobm8gQVBJIGNhbGxzKSB0aGF0IGtlZXBzCiAgICAjIHRoZSBzdGF0dXMgZmllbGQgY3VycmVudCBldmVuIGJldHdlZW4gc3luYyBydW5zCiAgICBteSAkU3RhdHVzVXBkYXRlZCA9ICRTZWxmLT5fUmVjYWxjdWxhdGVXYXJyYW50eVN0YXR1cygpOwogICAgaWYgKCRTdGF0dXNVcGRhdGVkKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IFJlY2FsY3VsYXRlZCB3YXJyYW50eSBzdGF0dXMgZm9yICRTdGF0dXNVcGRhdGVkIGFzc2V0KHMpLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENyZWF0ZSB0aWNrZXRzIGZvciBleHBpcmluZyB3YXJyYW50aWVzIChpZiBlbmFibGVkKQogICAgbXkgJFRpY2tldHNDcmVhdGVkID0gJFNlbGYtPl9DcmVhdGVFeHBpcnlUaWNrZXRzKCk7CiAgICBpZiAoJFRpY2tldHNDcmVhdGVkKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IENyZWF0ZWQgJFRpY2tldHNDcmVhdGVkIGV4cGlyeSBub3RpZmljYXRpb24gdGlja2V0KHMpLiIsCiAgICAgICAgKTsKICAgIH0KICAgICRTdGF0c3tUaWNrZXRzQ3JlYXRlZH0gPSAkVGlja2V0c0NyZWF0ZWQgfHwgMDsKCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IFJ1biBjb21wbGV0ZS4gQ2hlY2tlZDogJFN0YXRze0NoZWNrZWR9LCBVcGRhdGVkOiAkU3RhdHN7VXBkYXRlZH0sICIKICAgICAgICAgICAgLiAiRXJyb3JzOiAkU3RhdHN7RXJyb3JzfSwgU2tpcHBlZDogJFN0YXRze1NraXBwZWR9LiIsCiAgICApOwoKICAgIHJldHVybiBcJVN0YXRzOwp9Cgo9aGVhZDIgX0dldEFzc2V0c1RvQ2hlY2soKQoKUmV0dXJucyBhIGxpc3Qgb2YgYXNzZXRzIHRoYXQgbmVlZCB3YXJyYW50eSBjaGVja2luZy4KCkluIFRlc3RNb2RlLCByZXR1cm5zIHRlc3QgZGF0YS4gT3RoZXJ3aXNlIHF1ZXJpZXMgdGhlIENNREIuCgo9Y3V0CgpzdWIgX0dldEFzc2V0c1RvQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgbXkgJFRlc3RNb2RlID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OlRlc3RNb2RlJyk7CgogICAgaWYgKCRUZXN0TW9kZSkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldFRlc3RBc3NldHMoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9HZXRDTURCQXNzZXRzKCBGb3JjZSA9PiAkUGFyYW17Rm9yY2V9ICk7Cn0KCj1oZWFkMiBfR2V0VGVzdEFzc2V0cygpCgpSZXR1cm5zIHRlc3QgZGF0YSBmb3IgZGV2ZWxvcG1lbnQgd2hlbiBubyBDTURCIGRhdGEgaXMgYXZhaWxhYmxlLgoKPWN1dAoKc3ViIF9HZXRUZXN0QXNzZXRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIFRyeSB0byBsb2FkIFRlc3REYXRhIG1vZHVsZSAobm90IGluIHJlcG8sIGRldmVsb3BlciBtdXN0IGNyZWF0ZSBpdCkKICAgIG15ICRUZXN0RGF0YU1vZHVsZSA9ICdLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOjpUZXN0RGF0YSc7CiAgICBteSAkTG9hZGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgKICAgICAgICAkVGVzdERhdGFNb2R1bGUsCiAgICAgICAgU2lsZW50ID0+IDEsCiAgICApOwoKICAgIGlmICggISRMb2FkZWQgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1dhcnJhbnR5U3luYzogVGVzdE1vZGUgZW5hYmxlZCBidXQgVGVzdERhdGEucG0gbm90IGZvdW5kLiAnCiAgICAgICAgICAgICAgICAuICdDcmVhdGUgS2VybmVsL1N5c3RlbS9XYXJyYW50eVN5bmMvVGVzdERhdGEucG0gZnJvbSBUZXN0RGF0YS5wbS5leGFtcGxlLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gKCk7CiAgICB9CgogICAgbXkgJFRlc3REYXRhT2JqZWN0ID0gJFRlc3REYXRhTW9kdWxlLT5uZXcoKTsKICAgIHJldHVybiAkVGVzdERhdGFPYmplY3QtPkdldFRlc3RBc3NldHMoKTsKfQoKPWhlYWQyIF9HZXRDTURCQXNzZXRzKCkKClF1ZXJpZXMgdGhlIENNREIgZm9yIGhhcmR3YXJlIGFzc2V0cyB0aGF0IG5lZWQgd2FycmFudHkgY2hlY2tpbmcuCgpSZWFkcyBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZXMgdmlhIFpudW55SGVscGVyIHRvIGZpbmQgdmVuZG9yIGFuZCBzZXJpYWwgbnVtYmVyLgpBcHBsaWVzIHJlY2hlY2sgbG9naWMgYmFzZWQgb24gdGhlIExhc3RDaGVjayBhdHRyaWJ1dGUuCgo9Y3V0CgpzdWIgX0dldENNREJBc3NldHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMb2dPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkWm51bnlIZWxwZXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlpudW55SGVscGVyJyk7CgogICAgIyBSZWFkIGNvbmZpZ3VyYXRpb24KICAgIG15ICRDbGFzc2VzICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6Q29uZmlnSXRlbTo6Q2xhc3NlcycpICAgICAgICAgICB8fCBbJ0NvbXB1dGVyJ107CiAgICBteSAkRGVwbFN0YXRlcyAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZXMnKSAgfHwgW107CiAgICBteSAkVmVuZG9yQXR0ciAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OlZlbmRvckF0dHJpYnV0ZScpICAgfHwgJ1ZlbmRvcic7CiAgICBteSAkU2VyaWFsQXR0ciAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OlNlcmlhbEF0dHJpYnV0ZScpICAgfHwgJ1NlcmlhbE51bWJlcic7CiAgICBteSAkVmVuZG9yTWFwcGluZyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OlZlbmRvck1hcHBpbmcnKSAgICAgICAgICAgICAgICAgfHwge307CiAgICBteSAkUmVjaGVja0ludGVydmFsICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpSZWNoZWNrSW50ZXJ2YWwnKSAgICAgICAgICB8fCAzMDsKICAgIG15ICRSZWNoZWNrSW50ZXJ2YWxFeHBpcmVkID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OlJlY2hlY2tJbnRlcnZhbEV4cGlyZWQnKSB8fCAkUmVjaGVja0ludGVydmFsOwogICAgbXkgJFJlY2hlY2tFeHBpcnkgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6UmVjaGVja0FmdGVyRXhwaXJ5Jyk7CiAgICBteSAkRmllbGRNYXBwaW5nICAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpPdXRwdXQ6OkZpZWxkTWFwcGluZycpICAgfHwge307CiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgRGV0ZXJtaW5lIHRoZSBhdHRyaWJ1dGUgbmFtZSB1c2VkIGZvciBXYXJyYW50eUVuZCAodG8gY2hlY2sgZXhwaXJ5KQogICAgbXkgJFdhcnJhbnR5RW5kQXR0ciAgICA9ICRGaWVsZE1hcHBpbmctPntXYXJyYW50eUVuZH0gICAgfHwgJyc7CiAgICBteSAkV2FycmFudHlTdGF0dXNBdHRyID0gJEZpZWxkTWFwcGluZy0+e1dhcnJhbnR5U3RhdHVzfSB8fCAnJzsKCiAgICAjIFRyeSB0byBsb2FkIElUU01Db25maWdJdGVtIG1vZHVsZQogICAgbXkgJENvbmZpZ0l0ZW1Mb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIFNpbGVudCA9PiAxLAogICAgKTsKCiAgICBpZiAoICEkQ29uZmlnSXRlbUxvYWRlZCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdXYXJyYW50eVN5bmM6IElUU00gQ29uZmlnSXRlbSBtb2R1bGUgbm90IGF2YWlsYWJsZS4gJwogICAgICAgICAgICAgICAgLiAnSW5zdGFsbCBJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQgb3IgZW5hYmxlIFRlc3RNb2RlLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gKCk7CiAgICB9CgogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICAjIFJlc29sdmUgY2xhc3MgbmFtZXMgdG8gSURzIHZpYSBHZW5lcmFsQ2F0YWxvZwogICAgbXkgJENsYXNzTGlzdFJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CiAgICBteSAlQ2xhc3NOYW1lVG9JRDsKICAgIGZvciBteSAkSUQgKCBrZXlzICV7JENsYXNzTGlzdFJlZn0gKSB7CiAgICAgICAgJENsYXNzTmFtZVRvSUR7ICRDbGFzc0xpc3RSZWYtPnskSUR9IH0gPSAkSUQ7CiAgICB9CgogICAgbXkgQENsYXNzSURzOwogICAgZm9yIG15ICRDbGFzc05hbWUgKCBAeyRDbGFzc2VzfSApIHsKICAgICAgICBpZiAoICRDbGFzc05hbWVUb0lEeyRDbGFzc05hbWV9ICkgewogICAgICAgICAgICBwdXNoIEBDbGFzc0lEcywgJENsYXNzTmFtZVRvSUR7JENsYXNzTmFtZX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldhcnJhbnR5U3luYzogQ01EQiBjbGFzcyAnJENsYXNzTmFtZScgbm90IGZvdW5kLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUBDbGFzc0lEcyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdXYXJyYW50eVN5bmM6IE5vIHZhbGlkIENNREIgY2xhc3NlcyBmb3VuZC4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICgpOwogICAgfQoKICAgICMgU2VhcmNoIGZvciBDb25maWdJdGVtcyAocmV0dXJucyBBcnJheVJlZikKICAgIG15ICRDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgQ2xhc3NJRHMgICA9PiBcQENsYXNzSURzLAogICAgICAgIERlcGxTdGF0ZXMgPT4gJERlcGxTdGF0ZXMsCiAgICApIHx8IFtdOwoKICAgIG15IEBBc3NldHM7CiAgICBteSAkTm93ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkTm93RGF0ZVN0ciA9ICROb3ctPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCcgKTsKCiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JENvbmZpZ0l0ZW1JRHN9ICkgewoKICAgICAgICAjIFJlYWQgY3VycmVudCB2ZXJzaW9uIGRhdGEgdmlhIFpudW55SGVscGVyIChmbGF0IFhNTERhdGEgaGFzaCkKICAgICAgICBteSAlVmVyc2lvbkRhdGEgPSAkWm51bnlIZWxwZXJPYmplY3QtPl9JVFNNQ29uZmlnSXRlbVZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICk7CgogICAgICAgIG5leHQgaWYgISVWZXJzaW9uRGF0YTsKCiAgICAgICAgIyBSZWFkIHZlbmRvciBhbmQgc2VyaWFsIGZyb20gY2xhc3MgYXR0cmlidXRlcwogICAgICAgICMgWm51bnlIZWxwZXIgbWF5IHJldHVybiBmbGF0IGtleXMgKCdWZW5kb3InKSBvciBpbmRleGVkICgnVmVuZG9yOjoxJykKICAgICAgICBteSAkVmVuZG9yICAgICAgID0gJFZlcnNpb25EYXRhe1hNTERhdGF9eyRWZW5kb3JBdHRyfQogICAgICAgICAgICAvLyAkVmVyc2lvbkRhdGF7WE1MRGF0YX17IiR7VmVuZG9yQXR0cn06OjEifSAvLyAnJzsKICAgICAgICBteSAkU2VyaWFsTnVtYmVyID0gJFZlcnNpb25EYXRhe1hNTERhdGF9eyRTZXJpYWxBdHRyfQogICAgICAgICAgICAvLyAkVmVyc2lvbkRhdGF7WE1MRGF0YX17IiR7U2VyaWFsQXR0cn06OjEifSAvLyAnJzsKCiAgICAgICAgbmV4dCBpZiAhJFZlbmRvciB8fCAhJFNlcmlhbE51bWJlcjsKCiAgICAgICAgIyBDaGVjayBpZiB2ZW5kb3IgbWFwcyB0byBhIGtub3duIHByb3ZpZGVyCiAgICAgICAgbXkgJFByb3ZpZGVyID0gJFZlbmRvck1hcHBpbmctPnskVmVuZG9yfTsKICAgICAgICBuZXh0IGlmICEkUHJvdmlkZXI7CgogICAgICAgICMgUmVjaGVjayBsb2dpYzogcmVhZCBsYXN0X2NoZWNrIGZyb20gd2FycmFudHlfc3luY19zdGF0dXMgdGFibGUKICAgICAgICBpZiAoICEkUGFyYW17Rm9yY2V9ICkgewogICAgICAgICAgICBteSAkTGFzdENoZWNrRGF0ZSA9ICRTZWxmLT5fR2V0TGFzdENoZWNrKCBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCApOwoKICAgICAgICAgICAgaWYgKCRMYXN0Q2hlY2tEYXRlKSB7CiAgICAgICAgICAgICAgICBteSAkTGFzdENoZWNrRFQgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAiJHtMYXN0Q2hlY2tEYXRlfSAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCRMYXN0Q2hlY2tEVCkgewogICAgICAgICAgICAgICAgICAgIG15ICREZWx0YSA9ICROb3ctPkRlbHRhKCBEYXRlVGltZU9iamVjdCA9PiAkTGFzdENoZWNrRFQgKTsKICAgICAgICAgICAgICAgICAgICBteSAkRGF5c1NpbmNlQ2hlY2sgPSBpbnQoICREZWx0YS0+e0Fic29sdXRlU2Vjb25kc30gLyA4NjQwMCApOwoKICAgICAgICAgICAgICAgICAgICAjIERldGVybWluZSBpZiB3YXJyYW50eSBpcyBleHBpcmVkIChjaGVjayBzdGF0dXMgb3IgZW5kIGRhdGUpCiAgICAgICAgICAgICAgICAgICAgbXkgJElzRXhwaXJlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXR1c1ZhbCA9ICRWZXJzaW9uRGF0YXtYTUxEYXRhfXskV2FycmFudHlTdGF0dXNBdHRyfQogICAgICAgICAgICAgICAgICAgICAgICAvLyAkVmVyc2lvbkRhdGF7WE1MRGF0YX17IiR7V2FycmFudHlTdGF0dXNBdHRyfTo6MSJ9IC8vICcnOwogICAgICAgICAgICAgICAgICAgIGlmICggJFN0YXR1c1ZhbCBlcSAnRXhwaXJlZCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJc0V4cGlyZWQgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRXYXJyYW50eUVuZEF0dHIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbmRWYWwgPSAkVmVyc2lvbkRhdGF7WE1MRGF0YX17JFdhcnJhbnR5RW5kQXR0cn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICRWZXJzaW9uRGF0YXtYTUxEYXRhfXsiJHtXYXJyYW50eUVuZEF0dHJ9OjoxIn0gLy8gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEVuZFZhbCAmJiAkRW5kVmFsIGx0ICROb3dEYXRlU3RyICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElzRXhwaXJlZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkSXNFeHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYgISRSZWNoZWNrRXhwaXJ5OwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmICREYXlzU2luY2VDaGVjayA8ICRSZWNoZWNrSW50ZXJ2YWxFeHBpcmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAkRGF5c1NpbmNlQ2hlY2sgPCAkUmVjaGVja0ludGVydmFsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQXNzZXRzLCB7CiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBWZW5kb3IgICAgICAgPT4gJFZlbmRvciwKICAgICAgICAgICAgU2VyaWFsTnVtYmVyID0+ICRTZXJpYWxOdW1iZXIsCiAgICAgICAgICAgIFByb3ZpZGVyICAgICA9PiAkUHJvdmlkZXIsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVmVyc2lvbkRhdGF7TmFtZX0gfHwgIkNvbmZpZ0l0ZW0jJENvbmZpZ0l0ZW1JRCIsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gQEFzc2V0czsKfQoKPWhlYWQyIF9Hcm91cEJ5UHJvdmlkZXIoKQoKR3JvdXBzIGFzc2V0cyBieSB0aGVpciB3YXJyYW50eSBwcm92aWRlciBuYW1lLgoKPWN1dAoKc3ViIF9Hcm91cEJ5UHJvdmlkZXIgewogICAgbXkgKCAkU2VsZiwgQEFzc2V0cyApID0gQF87CgogICAgbXkgJUdyb3VwZWQ7CiAgICBmb3IgbXkgJEFzc2V0IChAQXNzZXRzKSB7CiAgICAgICAgcHVzaCBAeyAkR3JvdXBlZHsgJEFzc2V0LT57UHJvdmlkZXJ9IH0gfSwgJEFzc2V0OwogICAgfQoKICAgIHJldHVybiAlR3JvdXBlZDsKfQoKPWhlYWQyIF9VcGRhdGVBc3NldFdhcnJhbnR5KCkKClVwZGF0ZXMgd2FycmFudHkgZGF0YSBvbiBhIENvbmZpZ0l0ZW0gYnkgd3JpdGluZyBjbGFzcyBhdHRyaWJ1dGVzIHZpYSBabnVueUhlbHBlci4KCkNyZWF0ZXMgYSBuZXcgQ29uZmlnSXRlbSB2ZXJzaW9uIChhdXRvbWF0aWMgaGlzdG9yeS9hdWRpdCB0cmFpbCkuClVzZXMgdGhlIGNvbmZpZ3VyYWJsZSBGaWVsZE1hcHBpbmcgZnJvbSBTeXNDb25maWcgdG8gZGV0ZXJtaW5lIHdoaWNoCkFQSSByZXN1bHQgZmllbGRzIGFyZSB3cml0dGVuIHRvIHdoaWNoIGNsYXNzIGF0dHJpYnV0ZXMuCgo9Y3V0CgpzdWIgX1VwZGF0ZUFzc2V0V2FycmFudHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkWm51bnlIZWxwZXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlpudW55SGVscGVyJyk7CgogICAgbXkgJEFzc2V0ICAgPSAkUGFyYW17QXNzZXR9OwogICAgbXkgJFJlc3VsdCAgPSAkUGFyYW17UmVzdWx0fTsKICAgIG15ICRUZXN0TW9kZSA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpUZXN0TW9kZScpOwoKICAgICMgUmVhZCBmaWVsZCBtYXBwaW5nIGZyb20gU3lzQ29uZmlnCiAgICBteSAkRmllbGRNYXBwaW5nICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6T3V0cHV0OjpGaWVsZE1hcHBpbmcnKSB8fCB7fTsKCiAgICAjIERldGVybWluZSB3YXJyYW50eSBzdGF0dXMgZnJvbSBlbmQgZGF0ZQogICAgbXkgJFdhcnJhbnR5U3RhdHVzID0gJ1Vua25vd24nOwogICAgaWYgKCAkUmVzdWx0LT57V2FycmFudHlFbmR9ICkgewogICAgICAgIG15ICROb3cgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICBpZiAoICRSZXN1bHQtPntXYXJyYW50eUVuZH0gZ2UgJE5vdy0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVZLSVtLSVkJyApICkgewogICAgICAgICAgICAkV2FycmFudHlTdGF0dXMgPSAnQWN0aXZlJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRXYXJyYW50eVN0YXR1cyA9ICdFeHBpcmVkJzsKICAgICAgICB9CiAgICB9CgogICAgIyBBUEkgcmVzdWx0IGRhdGEgYXZhaWxhYmxlIGZvciBtYXBwaW5nCiAgICBteSAlQVBJRGF0YSA9ICgKICAgICAgICBXYXJyYW50eUVuZCAgICAgPT4gJFJlc3VsdC0+e1dhcnJhbnR5RW5kfSAgIHx8ICcnLAogICAgICAgIFdhcnJhbnR5U3RhcnQgICA9PiAkUmVzdWx0LT57V2FycmFudHlTdGFydH0gfHwgJycsCiAgICAgICAgV2FycmFudHlUeXBlICAgID0+ICRSZXN1bHQtPntXYXJyYW50eVR5cGV9ICB8fCAnJywKICAgICAgICBXYXJyYW50eVN0YXR1cyAgPT4gJFdhcnJhbnR5U3RhdHVzLAogICAgICAgIFdhcnJhbnR5UHJvZHVjdCA9PiAkUmVzdWx0LT57UHJvZHVjdE5hbWV9ICAgfHwgJycsCiAgICAgICAgU2hpcERhdGUgICAgICAgID0+ICRSZXN1bHQtPntTaGlwRGF0ZX0gICAgICB8fCAnJywKICAgICAgICBTaGlwQ291bnRyeSAgICAgPT4gJFJlc3VsdC0+e1NoaXBDb3VudHJ5fSAgIHx8ICcnLAogICAgKTsKCiAgICAjIEluIHRlc3QgbW9kZSwganVzdCBsb2cgd2hhdCB3b3VsZCBiZSB1cGRhdGVkCiAgICBpZiAoJFRlc3RNb2RlKSB7CiAgICAgICAgZm9yIG15ICRBUElGaWVsZCAoIHNvcnQga2V5cyAlQVBJRGF0YSApIHsKICAgICAgICAgICAgbXkgJFRhcmdldEF0dHIgPSAkRmllbGRNYXBwaW5nLT57JEFQSUZpZWxkfSB8fCAnJzsKICAgICAgICAgICAgbXkgJExhYmVsID0gJFRhcmdldEF0dHIgPyAiIC0+ICRUYXJnZXRBdHRyIiA6ICcgKG5vdCBtYXBwZWQpJzsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldhcnJhbnR5U3luYyBbVGVzdE1vZGVdOiAkQXNzZXQtPntOYW1lfSAoJEFzc2V0LT57U2VyaWFsTnVtYmVyfSk6ICIKICAgICAgICAgICAgICAgICAgICAuICIkQVBJRmllbGQgPSAnJEFQSURhdGF7JEFQSUZpZWxkfSckTGFiZWwiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIFJlYWQgY3VycmVudCB2ZXJzaW9uIHRvIGNvbXBhcmUgdmFsdWVzCiAgICBteSAlQ3VycmVudFZlcnNpb24gPSAkWm51bnlIZWxwZXJPYmplY3QtPl9JVFNNQ29uZmlnSXRlbVZlcnNpb25HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRBc3NldC0+e0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIGlmICggISVDdXJyZW50VmVyc2lvbiApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6IENvdWxkIG5vdCByZWFkIENvbmZpZ0l0ZW0jJEFzc2V0LT57Q29uZmlnSXRlbUlEfS4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQnVpbGQgbGlzdCBvZiBjaGFuZ2VkIGF0dHJpYnV0ZXMgKG9ubHkgZm9yIG1hcHBlZCBmaWVsZHMpCiAgICBteSAlTmV3VmFsdWVzOwogICAgbXkgJEFueUNoYW5nZWQgPSAwOwoKICAgIGZvciBteSAkQVBJRmllbGQgKCBrZXlzICVBUElEYXRhICkgewogICAgICAgIG15ICRUYXJnZXRBdHRyID0gJEZpZWxkTWFwcGluZy0+eyRBUElGaWVsZH07CgogICAgICAgICMgU2tpcCB1bm1hcHBlZCBmaWVsZHMgKGVtcHR5IG9yIG1pc3NpbmcgaW4gbWFwcGluZykKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUYXJnZXRBdHRyIHx8ICRUYXJnZXRBdHRyIGVxICcnOwoKICAgICAgICBteSAkTmV3VmFsdWUgPSAkQVBJRGF0YXskQVBJRmllbGR9OwogICAgICAgIG15ICRPbGRWYWx1ZSA9ICRDdXJyZW50VmVyc2lvbntYTUxEYXRhfXskVGFyZ2V0QXR0cn0gLy8gJyc7CgogICAgICAgIGlmICggJE9sZFZhbHVlIG5lICROZXdWYWx1ZSApIHsKICAgICAgICAgICAgJEFueUNoYW5nZWQgPSAxOwogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOiAkQXNzZXQtPntOYW1lfSAoQ29uZmlnSXRlbSMkQXNzZXQtPntDb25maWdJdGVtSUR9LCAiCiAgICAgICAgICAgICAgICAgICAgLiAiJEFzc2V0LT57U2VyaWFsTnVtYmVyfSk6ICRUYXJnZXRBdHRyIGNoYW5nZWQgZnJvbSAnJE9sZFZhbHVlJyB0byAnJE5ld1ZhbHVlJyIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTmV3VmFsdWVzeyRUYXJnZXRBdHRyfSA9ICROZXdWYWx1ZTsKICAgIH0KCiAgICAjIFJlY29yZCBsYXN0IGNoZWNrIGluIERCIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgZGF0YSBjaGFuZ2VkKQogICAgJFNlbGYtPl9TZXRMYXN0Q2hlY2soIENvbmZpZ0l0ZW1JRCA9PiAkQXNzZXQtPntDb25maWdJdGVtSUR9ICk7CgogICAgIyBPbmx5IHdyaXRlIHRvIENNREIgaWYgYWN0dWFsIHdhcnJhbnR5IGRhdGEgY2hhbmdlZAogICAgaWYgKCAhJEFueUNoYW5nZWQgKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyBCdWlsZCBwcm9wZXIgWE1MRGF0YSBzdHJ1Y3R1cmUgZm9yIFZlcnNpb25BZGQKICAgICMgTWVyZ2UgbmV3IHZhbHVlcyBpbnRvIGV4aXN0aW5nIHZlcnNpb24gZGF0YQogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIEdldCBjdXJyZW50IHJhdyB2ZXJzaW9uIHRvIHByZXNlcnZlIGV4aXN0aW5nIFhNTCBzdHJ1Y3R1cmUKICAgIG15ICRDdXJyZW50UmF3VmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXNzZXQtPntDb25maWdJdGVtSUR9LAogICAgICAgIFhNTERhdGFHZXQgICA9PiAxLAogICAgKTsKCiAgICBteSAkWE1MRGF0YSA9ICRDdXJyZW50UmF3VmVyc2lvbi0+e1hNTERhdGF9IHx8IFtdOwoKICAgICMgVXBkYXRlIG9yIGFkZCBhdHRyaWJ1dGVzIGluIHRoZSBWZXJzaW9uIG5vZGUKICAgIG15ICRWZXJzaW9uTm9kZSA9ICRYTUxEYXRhLT5bMV17VmVyc2lvbn1bMV0gfHwge307CiAgICBmb3IgbXkgJEF0dHJOYW1lICgga2V5cyAlTmV3VmFsdWVzICkgewogICAgICAgICRWZXJzaW9uTm9kZS0+eyRBdHRyTmFtZX0gPSBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJE5ld1ZhbHVlc3skQXR0ck5hbWV9IH0gXTsKICAgIH0KICAgICRYTUxEYXRhLT5bMV17VmVyc2lvbn1bMV0gPSAkVmVyc2lvbk5vZGU7CgogICAgbXkgJFZlcnNpb25JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQXNzZXQtPntDb25maWdJdGVtSUR9LAogICAgICAgIE5hbWUgICAgICAgICA9PiAkQ3VycmVudFJhd1ZlcnNpb24tPntOYW1lfSwKICAgICAgICBEZWZpbml0aW9uSUQgPT4gJEN1cnJlbnRSYXdWZXJzaW9uLT57RGVmaW5pdGlvbklEfSwKICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJEN1cnJlbnRSYXdWZXJzaW9uLT57RGVwbFN0YXRlSUR9LAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAkQ3VycmVudFJhd1ZlcnNpb24tPntJbmNpU3RhdGVJRH0sCiAgICAgICAgWE1MRGF0YSAgICAgID0+ICRYTUxEYXRhLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCiAgICBpZiAoICEkVmVyc2lvbklEICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldhcnJhbnR5U3luYzogRmFpbGVkIHRvIHVwZGF0ZSBDb25maWdJdGVtIyRBc3NldC0+e0NvbmZpZ0l0ZW1JRH0uIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJEFueUNoYW5nZWQ7Cn0KCj1oZWFkMiBfUmVjYWxjdWxhdGVXYXJyYW50eVN0YXR1cygpCgpSZWNhbGN1bGF0ZXMgdGhlIFdhcnJhbnR5U3RhdHVzIGZpZWxkIGZvciBhbGwgQ01EQiBhc3NldHMgdGhhdCBoYXZlIGEKV2FycmFudHlFbmQgZGF0ZS4gVGhpcyBpcyBhIGxvY2FsIG9wZXJhdGlvbiAobm8gQVBJIGNhbGxzKSB0aGF0IHJ1bnMKYWZ0ZXIgdGhlIHN5bmMgdG8ga2VlcCB0aGUgc3RhdHVzIGZpZWxkIGN1cnJlbnQuCgpSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXNzZXRzIHdob3NlIHN0YXR1cyB3YXMgdXBkYXRlZC4KCj1jdXQKCnN1YiBfUmVjYWxjdWxhdGVXYXJyYW50eVN0YXR1cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBteSAkRmllbGRNYXBwaW5nICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6Ok91dHB1dDo6RmllbGRNYXBwaW5nJykgICAgICAgICAgfHwge307CiAgICBteSAkV2FycmFudHlFbmRBdHRyID0gJEZpZWxkTWFwcGluZy0+e1dhcnJhbnR5RW5kfSAgICB8fCAnJzsKICAgIG15ICRTdGF0dXNBdHRyICAgICAgPSAkRmllbGRNYXBwaW5nLT57V2FycmFudHlTdGF0dXN9IHx8ICcnOwoKICAgICMgTm90aGluZyB0byBkbyBpZiBuZWl0aGVyIGVuZCBub3Igc3RhdHVzIGZpZWxkIGlzIG1hcHBlZAogICAgaWYgKCAhJFdhcnJhbnR5RW5kQXR0ciB8fCAhJFN0YXR1c0F0dHIgKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJENsYXNzZXMgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6Q29uZmlnSXRlbTo6Q2xhc3NlcycpICAgICAgICAgIHx8IFsnQ29tcHV0ZXInXTsKICAgIG15ICREZXBsU3RhdGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZXMnKSB8fCBbXTsKCiAgICBteSAkQ29uZmlnSXRlbUxvYWRlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU2lsZW50ID0+IDEsCiAgICApOwogICAgcmV0dXJuIDAgaWYgISRDb25maWdJdGVtTG9hZGVkOwoKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBSZXNvbHZlIGNsYXNzIElEcwogICAgbXkgJENsYXNzTGlzdFJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CiAgICBteSAlQ2xhc3NOYW1lVG9JRDsKICAgIGZvciBteSAkSUQgKCBrZXlzICV7JENsYXNzTGlzdFJlZn0gKSB7CiAgICAgICAgJENsYXNzTmFtZVRvSUR7ICRDbGFzc0xpc3RSZWYtPnskSUR9IH0gPSAkSUQ7CiAgICB9CiAgICBteSBAQ2xhc3NJRHMgPSBncmVwIHsgZGVmaW5lZCB9IG1hcCB7ICRDbGFzc05hbWVUb0lEeyRffSB9IEB7JENsYXNzZXN9OwogICAgcmV0dXJuIDAgaWYgIUBDbGFzc0lEczsKCiAgICBteSAkQ29uZmlnSXRlbUlEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIENsYXNzSURzICAgPT4gXEBDbGFzc0lEcywKICAgICAgICBEZXBsU3RhdGVzID0+ICREZXBsU3RhdGVzLAogICAgKSB8fCBbXTsKCiAgICBteSAkTm93ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkVG9kYXlTdHIgPSAkTm93LT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVktJW0tJWQnICk7CiAgICBteSAkVXBkYXRlZCA9IDA7CgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRDb25maWdJdGVtSURzfSApIHsKCiAgICAgICAgbXkgJFZlcnNpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIFhNTERhdGFHZXQgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbmV4dCBpZiAhJFZlcnNpb247CgogICAgICAgIG15ICRWZXJzaW9uTm9kZSA9ICRWZXJzaW9uLT57WE1MRGF0YX1bMV17VmVyc2lvbn1bMV0gfHwge307CiAgICAgICAgbXkgJFdhcnJhbnR5RW5kID0gJyc7CiAgICAgICAgaWYgKCAkVmVyc2lvbk5vZGUtPnskV2FycmFudHlFbmRBdHRyfSApIHsKICAgICAgICAgICAgJFdhcnJhbnR5RW5kID0gJFZlcnNpb25Ob2RlLT57JFdhcnJhbnR5RW5kQXR0cn1bMV17Q29udGVudH0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIFNraXAgYXNzZXRzIHdpdGhvdXQgd2FycmFudHkgZW5kIGRhdGUKICAgICAgICBuZXh0IGlmICEkV2FycmFudHlFbmQ7CgogICAgICAgICMgQ2FsY3VsYXRlIGNvcnJlY3Qgc3RhdHVzCiAgICAgICAgbXkgJENvcnJlY3RTdGF0dXMgPSAkV2FycmFudHlFbmQgZ2UgJFRvZGF5U3RyID8gJ0FjdGl2ZScgOiAnRXhwaXJlZCc7CgogICAgICAgICMgUmVhZCBjdXJyZW50IHN0YXR1cwogICAgICAgIG15ICRDdXJyZW50U3RhdHVzID0gJyc7CiAgICAgICAgaWYgKCAkVmVyc2lvbk5vZGUtPnskU3RhdHVzQXR0cn0gKSB7CiAgICAgICAgICAgICRDdXJyZW50U3RhdHVzID0gJFZlcnNpb25Ob2RlLT57JFN0YXR1c0F0dHJ9WzFde0NvbnRlbnR9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBPbmx5IHVwZGF0ZSBpZiBzdGF0dXMgY2hhbmdlZAogICAgICAgIG5leHQgaWYgJEN1cnJlbnRTdGF0dXMgZXEgJENvcnJlY3RTdGF0dXM7CgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOiAkVmVyc2lvbi0+e05hbWV9IChDb25maWdJdGVtIyRDb25maWdJdGVtSUQpOiAiCiAgICAgICAgICAgICAgICAuICIkU3RhdHVzQXR0ciBjaGFuZ2VkIGZyb20gJyRDdXJyZW50U3RhdHVzJyB0byAnJENvcnJlY3RTdGF0dXMnIiwKICAgICAgICApOwoKICAgICAgICAjIFdyaXRlIG5ldyB2ZXJzaW9uIHdpdGggdXBkYXRlZCBzdGF0dXMKICAgICAgICAkVmVyc2lvbk5vZGUtPnskU3RhdHVzQXR0cn0gPSBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJENvcnJlY3RTdGF0dXMgfSBdOwogICAgICAgICRWZXJzaW9uLT57WE1MRGF0YX1bMV17VmVyc2lvbn1bMV0gPSAkVmVyc2lvbk5vZGU7CgogICAgICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVmVyc2lvbi0+e05hbWV9LAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJFZlcnNpb24tPntEZWZpbml0aW9uSUR9LAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFZlcnNpb24tPntEZXBsU3RhdGVJRH0sCiAgICAgICAgICAgIEluY2lTdGF0ZUlEICA9PiAkVmVyc2lvbi0+e0luY2lTdGF0ZUlEfSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgID0+ICRWZXJzaW9uLT57WE1MRGF0YX0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggISRWZXJzaW9uSUQgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOiBGYWlsZWQgdG8gdXBkYXRlIHN0YXR1cyBmb3IgQ29uZmlnSXRlbSMkQ29uZmlnSXRlbUlELiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICAkVXBkYXRlZCsrOwogICAgfQoKICAgIHJldHVybiAkVXBkYXRlZDsKfQoKPWhlYWQyIF9HZXRMYXN0Q2hlY2soKQoKUmVhZHMgdGhlIGxhc3QgY2hlY2sgZGF0ZSBmb3IgYSBDb25maWdJdGVtIGZyb20gdGhlIHdhcnJhbnR5X3N5bmNfc3RhdHVzIHRhYmxlLgoKUmV0dXJucyBhIGRhdGUgc3RyaW5nIChZWVlZLU1NLUREKSBvciBlbXB0eSBzdHJpbmcgaWYgbmV2ZXIgY2hlY2tlZC4KCj1jdXQKCnN1YiBfR2V0TGFzdENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuICcnIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBsYXN0X2NoZWNrIEZST00gd2FycmFudHlfc3luY19zdGF0dXMgV0hFUkUgY29uZmlnX2l0ZW1faWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRMYXN0Q2hlY2sgPSAnJzsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMYXN0Q2hlY2sgPSAkUm93WzBdIHx8ICcnOwogICAgICAgICRMYXN0Q2hlY2sgPX4gcy8gLiokLy87ICAgICMgc3RyaXAgdGltZSBpZiBwcmVzZW50CiAgICB9CgogICAgcmV0dXJuICRMYXN0Q2hlY2s7Cn0KCj1oZWFkMiBfU2V0TGFzdENoZWNrKCkKCldyaXRlcyBvciB1cGRhdGVzIHRoZSBsYXN0IGNoZWNrIHRpbWVzdGFtcCBmb3IgYSBDb25maWdJdGVtIGluIHRoZSB3YXJyYW50eV9zeW5jX3N0YXR1cyB0YWJsZS4KCj1jdXQKCnN1YiBfU2V0TGFzdENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJE5vdyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgbXkgJE5vd1N0ciA9ICROb3ctPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCAlSDolTTolUycgKTsKCiAgICAjIERlY2lkZSBVUERBVEUgdnMuIElOU0VSVCBmcm9tIGFuIGV4cGxpY2l0IGV4aXN0ZW5jZSBjaGVjaywgbm90IGZyb20KICAgICMgdGhlIFVQREFURSdzIGFmZmVjdGVkLXJvdyBjb3VudDogREJEOjpteXNxbCByZXBvcnRzIHJvd3MgKmNoYW5nZWQqLAogICAgIyBub3Qgcm93cyAqbWF0Y2hlZCosIHNvIGEgc2FtZS1zZWNvbmQgcmVwZWF0IGNhbGwgKHdyaXRpbmcgdGhlIHNhbWUKICAgICMgbGFzdF9jaGVjayB2YWx1ZSB0aGUgcm93IGFscmVhZHkgaGFzKSB3b3VsZCByZXBvcnQgMCAiYWZmZWN0ZWQiCiAgICAjIHJvd3MgZXZlbiB0aG91Z2ggdGhlIHJvdyBleGlzdHMsIHdyb25nbHkgdHJpZ2dlcmluZyBhIGR1cGxpY2F0ZQogICAgIyBJTlNFUlQgYXR0ZW1wdCAoYW5kIGEgcHJpbWFyeS1rZXkgdmlvbGF0aW9uLCBzaW5jZSBjb25maWdfaXRlbV9pZAogICAgIyBpcyB0aGUgdGFibGUncyBwcmltYXJ5IGtleSkuCiAgICByZXR1cm4gJycgaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIDEgRlJPTSB3YXJyYW50eV9zeW5jX3N0YXR1cyBXSEVSRSBjb25maWdfaXRlbV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkUm93RXhpc3RzID0gMDsKICAgIHdoaWxlICggJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJvd0V4aXN0cyA9IDE7CiAgICB9CgogICAgbXkgJFN1Y2Nlc3M7CiAgICBpZiAoJFJvd0V4aXN0cykgewogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIHdhcnJhbnR5X3N5bmNfc3RhdHVzIFNFVCBsYXN0X2NoZWNrID0gPyBXSEVSRSBjb25maWdfaXRlbV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCROb3dTdHIsIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0lOU0VSVCBJTlRPIHdhcnJhbnR5X3N5bmNfc3RhdHVzIChjb25maWdfaXRlbV9pZCwgbGFzdF9jaGVjaykgVkFMVUVTICg/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0sIFwkTm93U3RyIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1oZWFkMiBfQ3JlYXRlRXhwaXJ5VGlja2V0cygpCgpDcmVhdGVzIG5vdGlmaWNhdGlvbiB0aWNrZXRzIGZvciBhc3NldHMgd2hvc2Ugd2FycmFudHkgZXhwaXJlcyB3aXRoaW4gdGhlCmNvbmZpZ3VyZWQgbnVtYmVyIG9mIGRheXMuIE9ubHkgY3JlYXRlcyBvbmUgdGlja2V0IHBlciBhc3NldCBwZXIgd2FycmFudHkKZW5kIGRhdGUgKHRyYWNrZWQgdmlhIGV4cGlyeV90aWNrZXRfZW5kX2RhdGUgaW4gd2FycmFudHlfc3luY19zdGF0dXMpLgoKUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpY2tldHMgY3JlYXRlZC4KCj1jdXQKCnN1YiBfQ3JlYXRlRXhwaXJ5VGlja2V0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIENoZWNrIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEVuYWJsZWQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpFbmFibGVkJyk7CiAgICByZXR1cm4gMCBpZiAhJEVuYWJsZWQ7CgogICAgbXkgJERheXNCZWZvcmUgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6RGF5c0JlZm9yZScpICAgICB8fCA5MDsKICAgIG15ICRRdWV1ZSAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OlF1ZXVlJykgICAgICAgICAgfHwgJ1Jhdyc7CiAgICBteSAkVGlja2V0VHlwZSAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpUeXBlJykgICAgICAgICAgIHx8ICcnOwogICAgbXkgJFByaW9yaXR5ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6UHJpb3JpdHknKSAgICAgICB8fCAnMyBub3JtYWwnOwogICAgbXkgJFN0YXRlICAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6U3RhdGUnKSAgICAgICAgICB8fCAnbmV3JzsKICAgIG15ICRTdWJqZWN0VHBsICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OlN1YmplY3RUZW1wbGF0ZScpIHx8ICdXYXJyYW50eSBleHBpcmluZzogPEFTU0VUX05BTUU+JzsKICAgIG15ICRCb2R5VHBsICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkJvZHlUZW1wbGF0ZScpICAgfHwgJyc7CiAgICBteSAkRmlsdGVyICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpGaWx0ZXInKSAgICAgICAgIHx8IHt9OwogICAgbXkgJEZpZWxkTWFwcGluZyAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6Ok91dHB1dDo6RmllbGRNYXBwaW5nJykgICAgICAgICAgICAgICB8fCB7fTsKICAgIG15ICRDbGFzc2VzICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpDb25maWdJdGVtOjpDbGFzc2VzJykgICAgICAgICAgICAgICAgIHx8IFsnQ29tcHV0ZXInXTsKICAgIG15ICREZXBsU3RhdGVzICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGVzJykgICAgICAgIHx8IFtdOwogICAgbXkgJFZlbmRvckF0dHIgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkNvbmZpZ0l0ZW06OlZlbmRvckF0dHJpYnV0ZScpICAgICAgICAgfHwgJ1ZlbmRvcic7CiAgICBteSAkU2VyaWFsQXR0ciAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6Q29uZmlnSXRlbTo6U2VyaWFsQXR0cmlidXRlJykgICAgICAgICB8fCAnU2VyaWFsTnVtYmVyJzsKCiAgICBteSAkV2FycmFudHlFbmRBdHRyICAgPSAkRmllbGRNYXBwaW5nLT57V2FycmFudHlFbmR9ICAgIHx8ICcnOwogICAgbXkgJFdhcnJhbnR5U3RhcnRBdHRyID0gJEZpZWxkTWFwcGluZy0+e1dhcnJhbnR5U3RhcnR9ICB8fCAnJzsKICAgIG15ICRXYXJyYW50eVR5cGVBdHRyICA9ICRGaWVsZE1hcHBpbmctPntXYXJyYW50eVR5cGV9ICAgfHwgJyc7CiAgICBteSAkUHJvZHVjdE5hbWVBdHRyICAgPSAkRmllbGRNYXBwaW5nLT57V2FycmFudHlQcm9kdWN0fSB8fCAnJzsKCiAgICBpZiAoICEkV2FycmFudHlFbmRBdHRyICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjogTm8gV2FycmFudHlFbmQgZmllbGQgbWFwcGVkLCBza2lwcGluZy4nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgIyBMb2FkIHJlcXVpcmVkIG1vZHVsZXMKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIGZvciBteSAkTW9kdWxlICggJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyApIHsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJE1vZHVsZSwgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjogJE1vZHVsZSBub3QgYXZhaWxhYmxlLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQ2hhbm5lbCgKICAgICAgICBDaGFubmVsTmFtZSA9PiAnSW50ZXJuYWwnLAogICAgKTsKCiAgICBpZiAoICEkQXJ0aWNsZUJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246IENvdWxkIG5vdCBnZXQgSW50ZXJuYWwgYXJ0aWNsZSBiYWNrZW5kLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIENhbGN1bGF0ZSB0aHJlc2hvbGQgZGF0ZQogICAgbXkgJE5vdyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgbXkgJFRocmVzaG9sZERUID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAkVGhyZXNob2xkRFQtPkFkZCggRGF5cyA9PiAkRGF5c0JlZm9yZSApOwogICAgbXkgJFRvZGF5U3RyICAgICA9ICROb3ctPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCcgKTsKICAgIG15ICRUaHJlc2hvbGRTdHIgPSAkVGhyZXNob2xkRFQtPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCcgKTsKCiAgICAjIFJlc29sdmUgY2xhc3MgSURzCiAgICBteSAkQ2xhc3NMaXN0UmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCggQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJyApOwogICAgbXkgJUNsYXNzTmFtZVRvSUQ7CiAgICBmb3IgbXkgJElEICgga2V5cyAleyRDbGFzc0xpc3RSZWZ9ICkgewogICAgICAgICRDbGFzc05hbWVUb0lEeyAkQ2xhc3NMaXN0UmVmLT57JElEfSB9ID0gJElEOwogICAgfQogICAgbXkgQENsYXNzSURzID0gZ3JlcCB7IGRlZmluZWQgfSBtYXAgeyAkQ2xhc3NOYW1lVG9JRHskX30gfSBAeyRDbGFzc2VzfTsKICAgIHJldHVybiAwIGlmICFAQ2xhc3NJRHM7CgogICAgbXkgJENvbmZpZ0l0ZW1JRHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBDbGFzc0lEcyAgID0+IFxAQ2xhc3NJRHMsCiAgICAgICAgRGVwbFN0YXRlcyA9PiAkRGVwbFN0YXRlcywKICAgICkgfHwgW107CgogICAgbXkgJENyZWF0ZWQgPSAwOwoKICAgIENPTkZJR0lURU06CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JENvbmZpZ0l0ZW1JRHN9ICkgewoKICAgICAgICBteSAkVmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENPTkZJR0lURU0gaWYgISRWZXJzaW9uOwoKICAgICAgICBteSAkVmVyc2lvbk5vZGUgPSAkVmVyc2lvbi0+e1hNTERhdGF9WzFde1ZlcnNpb259WzFdIHx8IHt9OwoKICAgICAgICAjIEdldCB3YXJyYW50eSBlbmQgZGF0ZQogICAgICAgIG15ICRXYXJyYW50eUVuZCA9ICRWZXJzaW9uTm9kZS0+eyRXYXJyYW50eUVuZEF0dHJ9WzFde0NvbnRlbnR9IHx8ICcnOwogICAgICAgIG5leHQgQ09ORklHSVRFTSBpZiAhJFdhcnJhbnR5RW5kOwoKICAgICAgICAjIENoZWNrIGlmIHdhcnJhbnR5IGV4cGlyZXMgd2l0aGluIHRocmVzaG9sZCBhbmQgaXMgbm90IGFscmVhZHkgZXhwaXJlZAogICAgICAgIG5leHQgQ09ORklHSVRFTSBpZiAkV2FycmFudHlFbmQgbHQgJFRvZGF5U3RyOyAgICAgICMgYWxyZWFkeSBleHBpcmVkCiAgICAgICAgbmV4dCBDT05GSUdJVEVNIGlmICRXYXJyYW50eUVuZCBndCAkVGhyZXNob2xkU3RyOyAgICMgdG9vIGZhciBpbiBmdXR1cmUKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBhbHJlYWR5IGNyZWF0ZWQgYSB0aWNrZXQgZm9yIHRoaXMgZW5kIGRhdGUKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgZXhwaXJ5X3RpY2tldF9lbmRfZGF0ZSBGUk9NIHdhcnJhbnR5X3N5bmNfc3RhdHVzIFdIRVJFIGNvbmZpZ19pdGVtX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICRFeGlzdGluZ0VuZERhdGUgPSAnJzsKICAgICAgICBteSAkU3RhdHVzUm93RXhpc3RzID0gMDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEV4aXN0aW5nRW5kRGF0ZSA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgICAgICRTdGF0dXNSb3dFeGlzdHMgPSAxOwogICAgICAgIH0KICAgICAgICBuZXh0IENPTkZJR0lURU0gaWYgJEV4aXN0aW5nRW5kRGF0ZSBlcSAkV2FycmFudHlFbmQ7CgogICAgICAgICMgQXBwbHkgZmlsdGVyCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRmlsdGVyKSApIHsKICAgICAgICAgICAgbXkgJE1hdGNoZXMgPSAxOwogICAgICAgICAgICBmb3IgbXkgJEF0dHJOYW1lICgga2V5cyAleyRGaWx0ZXJ9ICkgewogICAgICAgICAgICAgICAgbXkgJEF0dHJWYWx1ZSA9ICRWZXJzaW9uTm9kZS0+eyRBdHRyTmFtZX1bMV17Q29udGVudH0gfHwgJyc7CiAgICAgICAgICAgICAgICBteSBAQWxsb3dlZFZhbHVlcyA9IHNwbGl0IC9ccyosXHMqLywgJEZpbHRlci0+eyRBdHRyTmFtZX07CiAgICAgICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEF0dHJWYWx1ZSB9IEBBbGxvd2VkVmFsdWVzICkgewogICAgICAgICAgICAgICAgICAgICRNYXRjaGVzID0gMDsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTSBpZiAhJE1hdGNoZXM7CiAgICAgICAgfQoKICAgICAgICAjIEdhdGhlciBkYXRhIGZvciB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnMKICAgICAgICBteSAkVmVuZG9yICAgICAgID0gJFZlcnNpb25Ob2RlLT57JFZlbmRvckF0dHJ9WzFde0NvbnRlbnR9ICB8fCAnJzsKICAgICAgICBteSAkU2VyaWFsICAgICAgID0gJFZlcnNpb25Ob2RlLT57JFNlcmlhbEF0dHJ9WzFde0NvbnRlbnR9ICB8fCAnJzsKICAgICAgICBteSAkV2FycmFudHlTdGFydCA9ICRXYXJyYW50eVN0YXJ0QXR0ciA/ICggJFZlcnNpb25Ob2RlLT57JFdhcnJhbnR5U3RhcnRBdHRyfVsxXXtDb250ZW50fSB8fCAnJyApIDogJyc7CiAgICAgICAgbXkgJFdhcnJhbnR5VHlwZSAgPSAkV2FycmFudHlUeXBlQXR0ciAgPyAoICRWZXJzaW9uTm9kZS0+eyRXYXJyYW50eVR5cGVBdHRyfVsxXXtDb250ZW50fSAgfHwgJycgKSA6ICcnOwogICAgICAgIG15ICRQcm9kdWN0TmFtZSAgID0gJFByb2R1Y3ROYW1lQXR0ciAgID8gKCAkVmVyc2lvbk5vZGUtPnskUHJvZHVjdE5hbWVBdHRyfVsxXXtDb250ZW50fSAgIHx8ICcnICkgOiAnJzsKICAgICAgICBteSAkQXNzZXROYW1lICAgICA9ICRWZXJzaW9uLT57TmFtZX0gfHwgIkNvbmZpZ0l0ZW0jJENvbmZpZ0l0ZW1JRCI7CgogICAgICAgICMgQ2FsY3VsYXRlIGRheXMgbGVmdAogICAgICAgIG15ICRFbmREVCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4geyBTdHJpbmcgPT4gIiR7V2FycmFudHlFbmR9IDIzOjU5OjU5IiB9LAogICAgICAgICk7CiAgICAgICAgbXkgJERheXNMZWZ0ID0gMDsKICAgICAgICBpZiAoJEVuZERUKSB7CiAgICAgICAgICAgIG15ICREZWx0YSA9ICRFbmREVC0+RGVsdGEoIERhdGVUaW1lT2JqZWN0ID0+ICROb3cgKTsKICAgICAgICAgICAgJERheXNMZWZ0ID0gaW50KCAkRGVsdGEtPntBYnNvbHV0ZVNlY29uZHN9IC8gODY0MDAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSBwbGFjZWhvbGRlcnMKICAgICAgICBteSAlUGxhY2Vob2xkZXJzID0gKAogICAgICAgICAgICAnPEFTU0VUX05BTUU+JyAgICAgID0+ICRBc3NldE5hbWUsCiAgICAgICAgICAgICc8U0VSSUFMPicgICAgICAgICAgPT4gJFNlcmlhbCwKICAgICAgICAgICAgJzxXQVJSQU5UWV9FTkQ+JyAgICA9PiAkV2FycmFudHlFbmQsCiAgICAgICAgICAgICc8V0FSUkFOVFlfU1RBUlQ+JyAgPT4gJFdhcnJhbnR5U3RhcnQsCiAgICAgICAgICAgICc8V0FSUkFOVFlfVFlQRT4nICAgPT4gJFdhcnJhbnR5VHlwZSwKICAgICAgICAgICAgJzxWRU5ET1I+JyAgICAgICAgICA9PiAkVmVuZG9yLAogICAgICAgICAgICAnPFBST0RVQ1RfTkFNRT4nICAgID0+ICRQcm9kdWN0TmFtZSwKICAgICAgICAgICAgJzxEQVlTX0xFRlQ+JyAgICAgICA9PiAkRGF5c0xlZnQsCiAgICAgICAgICAgICc8Q09ORklHX0lURU1fSUQ+JyAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBteSAkU3ViamVjdCA9ICRTdWJqZWN0VHBsOwogICAgICAgIG15ICRCb2R5ICAgID0gJEJvZHlUcGw7CiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVQbGFjZWhvbGRlcnMgKSB7CiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRQbGFjZWhvbGRlcnN7JEtleX07CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFEkS2V5XEUvJFZhbHVlL2c7CiAgICAgICAgICAgICRCb2R5ICAgID1+IHMvXFEkS2V5XEUvJFZhbHVlL2c7CiAgICAgICAgfQoKICAgICAgICAjIENvbnZlcnQgbGl0ZXJhbCBcbiB0byBuZXdsaW5lcyAoU3lzQ29uZmlnIFN0cmluZyB0eXBlIGNhbm5vdCBzdG9yZSByZWFsIG5ld2xpbmVzKQogICAgICAgICRCb2R5ID1+IHMvXFxuL1xuL2c7CgogICAgICAgICMgQ3JlYXRlIHRpY2tldAogICAgICAgIG15ICVUaWNrZXRQYXJhbXMgPSAoCiAgICAgICAgICAgIFRpdGxlICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICBRdWV1ZSAgICA9PiAkUXVldWUsCiAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSA9PiAkUHJpb3JpdHksCiAgICAgICAgICAgIFN0YXRlICAgID0+ICRTdGF0ZSwKICAgICAgICAgICAgT3duZXJJRCAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkVGlja2V0VHlwZSkgewogICAgICAgICAgICAkVGlja2V0UGFyYW1ze1R5cGV9ID0gJFRpY2tldFR5cGU7CiAgICAgICAgfQoKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoJVRpY2tldFBhcmFtcyk7CgogICAgICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjogRmFpbGVkIHRvIGNyZWF0ZSB0aWNrZXQgZm9yICIKICAgICAgICAgICAgICAgICAgICAuICIkQXNzZXROYW1lICgkU2VyaWFsKS4iLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IENPTkZJR0lURU07CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBhcnRpY2xlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnc3lzdGVtJywKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMCwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICBDb250ZW50VHlwZSAgICAgICAgICA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcsCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAnV2FycmFudHlTeW5jIGV4cGlyeSBub3RpZmljYXRpb24nLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246IEZhaWxlZCB0byBjcmVhdGUgYXJ0aWNsZSBmb3IgIgogICAgICAgICAgICAgICAgICAgIC4gInRpY2tldCMkVGlja2V0SUQgKCRBc3NldE5hbWUpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIExpbmsgdGlja2V0IHRvIENvbmZpZ0l0ZW0KICAgICAgICBteSAkTGlua1Jlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1JlbGV2YW50VG8nLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJExpbmtSZXN1bHQgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOiBDb3VsZCBub3QgbGluayB0aWNrZXQjJFRpY2tldElEICIKICAgICAgICAgICAgICAgICAgICAuICJ0byBDb25maWdJdGVtIyRDb25maWdJdGVtSUQuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVjb3JkIHRoYXQgd2UgY3JlYXRlZCBhIHRpY2tldCBmb3IgdGhpcyBlbmQgZGF0ZS4gV2hldGhlciB0bwogICAgICAgICMgVVBEQVRFIG9yIElOU0VSVCBpcyBkZWNpZGVkIGZyb20gJFN0YXR1c1Jvd0V4aXN0cyAoc2V0IGZ1cnRoZXIKICAgICAgICAjIGFib3ZlIGZyb20gdGhlIGRlZHVwIFNFTEVDVCksIG5vdCBmcm9tIHRoZSBVUERBVEUncyBhZmZlY3RlZC1yb3cKICAgICAgICAjIGNvdW50OiBEQkQ6Om15c3FsIHJlcG9ydHMgcm93cyAqY2hhbmdlZCosIG5vdCByb3dzICptYXRjaGVkKiwgc28KICAgICAgICAjIHJlLXJ1bm5pbmcgdGhpcyB3aXRoIHRoZSBzYW1lIFdhcnJhbnR5RW5kIHRoZSByb3cgYWxyZWFkeSBoYXMKICAgICAgICAjIHdvdWxkIHJlcG9ydCAwICJhZmZlY3RlZCIgcm93cyBldmVuIHRob3VnaCB0aGUgcm93IGV4aXN0cywKICAgICAgICAjIHdyb25nbHkgdHJpZ2dlcmluZyBhIGR1cGxpY2F0ZSBJTlNFUlQgYXR0ZW1wdC4KICAgICAgICBteSAkTm93U3RyID0gJE5vdy0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVZLSVtLSVkICVIOiVNOiVTJyApOwogICAgICAgIGlmICgkU3RhdHVzUm93RXhpc3RzKSB7CiAgICAgICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdVUERBVEUgd2FycmFudHlfc3luY19zdGF0dXMgU0VUIGV4cGlyeV90aWNrZXRfZW5kX2RhdGUgPSA/IFdIRVJFIGNvbmZpZ19pdGVtX2lkID0gPycsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRXYXJyYW50eUVuZCwgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdJTlNFUlQgSU5UTyB3YXJyYW50eV9zeW5jX3N0YXR1cyAoY29uZmlnX2l0ZW1faWQsIGxhc3RfY2hlY2ssIGV4cGlyeV90aWNrZXRfZW5kX2RhdGUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkQ29uZmlnSXRlbUlELCBcJE5vd1N0ciwgXCRXYXJyYW50eUVuZCBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjogQ3JlYXRlZCB0aWNrZXQjJFRpY2tldElEIGZvciAiCiAgICAgICAgICAgICAgICAuICIkQXNzZXROYW1lICgkU2VyaWFsKSwgd2FycmFudHkgZXhwaXJlcyAkV2FycmFudHlFbmQgKCREYXlzTGVmdCBkYXlzKS4iLAogICAgICAgICk7CgogICAgICAgICRDcmVhdGVkKys7CiAgICB9CgogICAgcmV0dXJuICRDcmVhdGVkOwp9CgoxOwo=</File>
        <File Permission="660" Location="Kernel/System/WarrantySync/Provider/Dell.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOjpQcm92aWRlcjo6RGVsbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBVUkk6OkVzY2FwZSBxdyh1cmlfZXNjYXBlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYlVzZXJBZ2VudCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6OkRlbGwgLSBEZWxsIFRlY2hEaXJlY3QgQVBJIHY1IHdhcnJhbnR5IHByb3ZpZGVyCgo9aGVhZDEgREVTQ1JJUFRJT04KClJldHJpZXZlcyB3YXJyYW50eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEZWxsIFRlY2hEaXJlY3QgQVBJIHY1LgoKQVBJIGRvY3M6IGh0dHBzOi8vdGVjaGRpcmVjdC5kZWxsLmNvbQoKQXV0aGVudGljYXRpb246IE9BdXRoIDIuMCBDbGllbnQgQ3JlZGVudGlhbHMgZmxvdy4KQmF0Y2ggc3VwcG9ydDogVXAgdG8gMTAwIHNlcnZpY2UgdGFncyBwZXIgcmVxdWVzdC4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEdldFdhcnJhbnR5SW5mbygpCgpRdWVyaWVzIHRoZSBEZWxsIFRlY2hEaXJlY3QgQVBJIGZvciB3YXJyYW50eSBpbmZvcm1hdGlvbi4KCiAgICBteSAkUmVzdWx0cyA9ICRQcm92aWRlck9iamVjdC0+R2V0V2FycmFudHlJbmZvKAogICAgICAgIFNlcmlhbE51bWJlcnMgPT4gWydBQkMxMjM0JywgJ0RFRjU2NzgnXSwKICAgICk7CgpSZXR1cm5zIGEgaGFzaHJlZiB3aXRoIHNlcmlhbCBudW1iZXJzIGFzIGtleXM6CgogICAgewogICAgICAgICdBQkMxMjM0JyA9PiB7CiAgICAgICAgICAgIFdhcnJhbnR5U3RhcnQgPT4gJzIwMjMtMDEtMTUnLAogICAgICAgICAgICBXYXJyYW50eUVuZCAgID0+ICcyMDI2LTAxLTE1JywKICAgICAgICAgICAgV2FycmFudHlUeXBlICA9PiAnUHJvU3VwcG9ydCBOZXh0IEJ1c2luZXNzIERheScsCiAgICAgICAgICAgIFByb2R1Y3ROYW1lICAgPT4gJ0xhdGl0dWRlIDU1NDAnLAogICAgICAgIH0sCiAgICAgICAgJ0RFRjU2NzgnID0+IHsKICAgICAgICAgICAgRXJyb3IgPT4gJ05vdCBmb3VuZCcsCiAgICAgICAgfSwKICAgIH0KCj1jdXQKCnN1YiBHZXRXYXJyYW50eUluZm8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgbXkgJENsaWVudElEICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpQcm92aWRlcjo6RGVsbDo6Q2xpZW50SUQnKSAgICAgfHwgJyc7CiAgICBteSAkQ2xpZW50U2VjcmV0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsOjpDbGllbnRTZWNyZXQnKSB8fCAnJzsKCiAgICBpZiAoICEkQ2xpZW50SUQgfHwgISRDbGllbnRTZWNyZXQgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnV2FycmFudHlTeW5jOjpEZWxsOiBDbGllbnRJRCBvciBDbGllbnRTZWNyZXQgbm90IGNvbmZpZ3VyZWQuJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17U2VyaWFsTnVtYmVyc30gfHwgIUB7ICRQYXJhbXtTZXJpYWxOdW1iZXJzfSB9ICkgewogICAgICAgIHJldHVybiB7fTsKICAgIH0KCiAgICAjIFN0ZXAgMTogR2V0IE9BdXRoIHRva2VuCiAgICBteSAkVG9rZW4gPSAkU2VsZi0+X0dldEFjY2Vzc1Rva2VuKAogICAgICAgIENsaWVudElEICAgICA9PiAkQ2xpZW50SUQsCiAgICAgICAgQ2xpZW50U2VjcmV0ID0+ICRDbGllbnRTZWNyZXQsCiAgICApOwoKICAgIGlmICggISRUb2tlbiApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdXYXJyYW50eVN5bmM6OkRlbGw6IEZhaWxlZCB0byBvYnRhaW4gT0F1dGggYWNjZXNzIHRva2VuLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBTdGVwIDI6IFF1ZXJ5IHdhcnJhbnR5IGluZm8gaW4gYmF0Y2hlcyBvZiAxMDAKICAgIG15IEBBbGxTZXJpYWxzID0gQHsgJFBhcmFte1NlcmlhbE51bWJlcnN9IH07CiAgICBteSAlQWxsUmVzdWx0czsKCiAgICB3aGlsZSAoQEFsbFNlcmlhbHMpIHsKICAgICAgICBteSBAQmF0Y2ggPSBzcGxpY2UoIEBBbGxTZXJpYWxzLCAwLCAxMDAgKTsKICAgICAgICBteSAkQmF0Y2hSZXN1bHRzID0gJFNlbGYtPl9RdWVyeVdhcnJhbnR5KAogICAgICAgICAgICBUb2tlbiAgICAgICAgID0+ICRUb2tlbiwKICAgICAgICAgICAgU2VydmljZVRhZ3MgICA9PiBcQEJhdGNoLAogICAgICAgICk7CgogICAgICAgIGlmICgkQmF0Y2hSZXN1bHRzKSB7CiAgICAgICAgICAgICVBbGxSZXN1bHRzID0gKCAlQWxsUmVzdWx0cywgJXskQmF0Y2hSZXN1bHRzfSApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVBbGxSZXN1bHRzOwp9Cgo9aGVhZDIgX0dldEFjY2Vzc1Rva2VuKCkKCk9idGFpbnMgYW4gT0F1dGggMi4wIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBEZWxsIEFQSSBnYXRld2F5LgoKPWN1dAoKc3ViIF9HZXRBY2Nlc3NUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJE1heFJldHJpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1dhcnJhbnR5U3luYzo6QVBJOjpNYXhSZXRyaWVzJykgfHwgMzsKCiAgICBteSAkV2ViVXNlckFnZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYlVzZXJBZ2VudCcpOwoKICAgIG15ICVSZXNwb25zZTsKICAgIG15ICRBdHRlbXB0ID0gMDsKCiAgICBSRVRSWToKICAgIHdoaWxlICggJEF0dGVtcHQgPCAkTWF4UmV0cmllcyApIHsKICAgICAgICAkQXR0ZW1wdCsrOwoKICAgICAgICAlUmVzcG9uc2UgPSAkV2ViVXNlckFnZW50T2JqZWN0LT5SZXF1ZXN0KAogICAgICAgICAgICBVUkwgID0+ICdodHRwczovL2FwaWd0d2IyYy51cy5kZWxsLmNvbS9hdXRoL29hdXRoL3YyL3Rva2VuJywKICAgICAgICAgICAgVHlwZSA9PiAnUE9TVCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgZ3JhbnRfdHlwZSAgICA9PiAnY2xpZW50X2NyZWRlbnRpYWxzJywKICAgICAgICAgICAgICAgIGNsaWVudF9pZCAgICAgPT4gJFBhcmFte0NsaWVudElEfSwKICAgICAgICAgICAgICAgIGNsaWVudF9zZWNyZXQgPT4gJFBhcmFte0NsaWVudFNlY3JldH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEhlYWRlciA9PiB7CiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBsYXN0IFJFVFJZIGlmICRSZXNwb25zZXtTdGF0dXN9ID1+IC9eMi87CgogICAgICAgICMgUmV0cnkgb24gcmF0ZSBsaW1pdCAoNDI5KSBvciBzZXJ2ZXIgZXJyb3IgKDV4eCkKICAgICAgICBpZiAoICRSZXNwb25zZXtTdGF0dXN9ID1+IC9eKDQyOXw1XGRcZCkvICYmICRBdHRlbXB0IDwgJE1heFJldHJpZXMgKSB7CiAgICAgICAgICAgIG15ICRXYWl0ID0gMiAqKiAkQXR0ZW1wdDsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOjpEZWxsOiBPQXV0aCByZXF1ZXN0IHJldHVybmVkICRSZXNwb25zZXtTdGF0dXN9LCAiCiAgICAgICAgICAgICAgICAgICAgLiAicmV0cnkgJEF0dGVtcHQvJE1heFJldHJpZXMgaW4gJHtXYWl0fXMuIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2xlZXAgJFdhaXQ7CiAgICAgICAgICAgIG5leHQgUkVUUlk7CiAgICAgICAgfQoKICAgICAgICBsYXN0IFJFVFJZOwogICAgfQoKICAgIGlmICggJFJlc3BvbnNle1N0YXR1c30gIX4gL14yLyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6OkRlbGw6IE9BdXRoIHRva2VuIHJlcXVlc3QgZmFpbGVkIGFmdGVyICRBdHRlbXB0IGF0dGVtcHQocykuICIKICAgICAgICAgICAgICAgIC4gIlN0YXR1czogJFJlc3BvbnNle1N0YXR1c30iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb250ZW50ID0gJHsgJFJlc3BvbnNle0NvbnRlbnR9IH07CiAgICBteSAkRGF0YTsKICAgIGV2YWwgewogICAgICAgICREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKS0+RGVjb2RlKCBEYXRhID0+ICRDb250ZW50ICk7CiAgICB9OwogICAgaWYgKCRAKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOjpEZWxsOiBGYWlsZWQgdG8gcGFyc2UgT0F1dGggcmVzcG9uc2U6ICRAIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJERhdGEtPnthY2Nlc3NfdG9rZW59Owp9Cgo9aGVhZDIgX1F1ZXJ5V2FycmFudHkoKQoKUXVlcmllcyB0aGUgRGVsbCB3YXJyYW50eSBlbmRwb2ludCBmb3IgYSBiYXRjaCBvZiBzZXJ2aWNlIHRhZ3MuCgo9Y3V0CgpzdWIgX1F1ZXJ5V2FycmFudHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRNYXhSZXRyaWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdXYXJyYW50eVN5bmM6OkFQSTo6TWF4UmV0cmllcycpIHx8IDM7CgogICAgIyBTRUNVUklUWTogQ01EQiBzZXJpYWwgbnVtYmVycyBhcmUgZWRpdGFibGUgYnkgYW55IGFnZW50IHdpdGggQ01EQgogICAgIyB3cml0ZSByaWdodHMgYW5kIGFyZSBqb2luZWQgc3RyYWlnaHQgaW50byB0aGUgcmVxdWVzdCBVUkwgYmVsb3cgLQogICAgIyBlc2NhcGUgZWFjaCBvbmUgc28gYSB2YWx1ZSBjb250YWluaW5nICcmJyBvciBvdGhlciByZXNlcnZlZAogICAgIyBjaGFyYWN0ZXJzIGNhbid0IGluamVjdC9hbHRlciBxdWVyeSBwYXJhbWV0ZXJzIHNlbnQgdG8gRGVsbCdzIEFQSS4KICAgIG15ICRUYWdTdHJpbmcgPSBqb2luKCAnLCcsIG1hcCB7IHVyaV9lc2NhcGUoJF8pIH0gQHsgJFBhcmFte1NlcnZpY2VUYWdzfSB9ICk7CgogICAgbXkgJFdlYlVzZXJBZ2VudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWJVc2VyQWdlbnQnKTsKCiAgICBteSAlUmVzcG9uc2U7CiAgICBteSAkQXR0ZW1wdCA9IDA7CgogICAgUkVUUlk6CiAgICB3aGlsZSAoICRBdHRlbXB0IDwgJE1heFJldHJpZXMgKSB7CiAgICAgICAgJEF0dGVtcHQrKzsKCiAgICAgICAgJVJlc3BvbnNlID0gJFdlYlVzZXJBZ2VudE9iamVjdC0+UmVxdWVzdCgKICAgICAgICAgICAgVVJMICA9PiAiaHR0cHM6Ly9hcGlndHdiMmMudXMuZGVsbC5jb20vUFJPRC9zYmlsL2VhcGkvdjUvYXNzZXQtZW50aXRsZW1lbnRzP3NlcnZpY2V0YWdzPSRUYWdTdHJpbmciLAogICAgICAgICAgICBUeXBlID0+ICdHRVQnLAogICAgICAgICAgICBIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbiA9PiAiQmVhcmVyICRQYXJhbXtUb2tlbn0iLAogICAgICAgICAgICAgICAgQWNjZXB0ICAgICAgICA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbGFzdCBSRVRSWSBpZiAkUmVzcG9uc2V7U3RhdHVzfSA9fiAvXjIvOwoKICAgICAgICBpZiAoICRSZXNwb25zZXtTdGF0dXN9ID1+IC9eKDQyOXw1XGRcZCkvICYmICRBdHRlbXB0IDwgJE1heFJldHJpZXMgKSB7CiAgICAgICAgICAgIG15ICRXYWl0ID0gMiAqKiAkQXR0ZW1wdDsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOjpEZWxsOiBXYXJyYW50eSBxdWVyeSByZXR1cm5lZCAkUmVzcG9uc2V7U3RhdHVzfSwgIgogICAgICAgICAgICAgICAgICAgIC4gInJldHJ5ICRBdHRlbXB0LyRNYXhSZXRyaWVzIGluICR7V2FpdH1zLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHNsZWVwICRXYWl0OwogICAgICAgICAgICBuZXh0IFJFVFJZOwogICAgICAgIH0KCiAgICAgICAgbGFzdCBSRVRSWTsKICAgIH0KCiAgICBpZiAoICRSZXNwb25zZXtTdGF0dXN9ICF+IC9eMi8gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiV2FycmFudHlTeW5jOjpEZWxsOiBXYXJyYW50eSBxdWVyeSBmYWlsZWQgYWZ0ZXIgJEF0dGVtcHQgYXR0ZW1wdChzKS4gIgogICAgICAgICAgICAgICAgLiAiU3RhdHVzOiAkUmVzcG9uc2V7U3RhdHVzfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENvbnRlbnQgPSAkeyAkUmVzcG9uc2V7Q29udGVudH0gfTsKICAgIG15ICREYXRhOwogICAgZXZhbCB7CiAgICAgICAgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoIERhdGEgPT4gJENvbnRlbnQgKTsKICAgIH07CiAgICBpZiAoJEApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6OkRlbGw6IEZhaWxlZCB0byBwYXJzZSB3YXJyYW50eSByZXNwb25zZTogJEAiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgUGFyc2UgcmVzcG9uc2UgaW50byBub3JtYWxpemVkIGZvcm1hdAogICAgbXkgJVJlc3VsdHM7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHskRGF0YX0gKSB7CiAgICAgICAgICAgIG15ICRTZXJ2aWNlVGFnID0gJEVudHJ5LT57c2VydmljZVRhZ30gfHwgbmV4dDsKCiAgICAgICAgICAgICMgRmluZCB0aGUgbGF0ZXN0IGVudGl0bGVtZW50IGVuZCBkYXRlIGFuZCBiZXN0IHNlcnZpY2UgbGV2ZWwKICAgICAgICAgICAgbXkgJExhdGVzdEVuZCAgICAgPSAnJzsKICAgICAgICAgICAgbXkgJEVhcmxpZXN0U3RhcnQgPSAnJzsKICAgICAgICAgICAgbXkgJEJlc3RUeXBlICAgICAgPSAnJzsKCiAgICAgICAgICAgIGlmICggJEVudHJ5LT57ZW50aXRsZW1lbnRzfSAmJiByZWYgJEVudHJ5LT57ZW50aXRsZW1lbnRzfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRpdGxlbWVudCAoIEB7ICRFbnRyeS0+e2VudGl0bGVtZW50c30gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RhcnREYXRlID0gJEVudGl0bGVtZW50LT57c3RhcnREYXRlfSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkRW5kRGF0ZSAgID0gJEVudGl0bGVtZW50LT57ZW5kRGF0ZX0gICB8fCAnJzsKCiAgICAgICAgICAgICAgICAgICAgIyBOb3JtYWxpemUgSVNPIDg2MDEgZGF0ZXMgdG8gWVlZWS1NTS1ERAogICAgICAgICAgICAgICAgICAgICRTdGFydERhdGUgPX4gcy9ULiokLy8gaWYgJFN0YXJ0RGF0ZTsKICAgICAgICAgICAgICAgICAgICAkRW5kRGF0ZSAgID1+IHMvVC4qJC8vIGlmICRFbmREYXRlOwoKICAgICAgICAgICAgICAgICAgICAjIFRyYWNrIGVhcmxpZXN0IHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU3RhcnREYXRlICYmICggISRFYXJsaWVzdFN0YXJ0IHx8ICRTdGFydERhdGUgbHQgJEVhcmxpZXN0U3RhcnQgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVhcmxpZXN0U3RhcnQgPSAkU3RhcnREYXRlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBUcmFjayBsYXRlc3QgZW5kIGFuZCBpdHMgc2VydmljZSBsZXZlbAogICAgICAgICAgICAgICAgICAgIGlmICggJEVuZERhdGUgJiYgKCAhJExhdGVzdEVuZCB8fCAkRW5kRGF0ZSBndCAkTGF0ZXN0RW5kICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXRlc3RFbmQgPSAkRW5kRGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgJEJlc3RUeXBlICA9ICRFbnRpdGxlbWVudC0+e3NlcnZpY2VMZXZlbERlc2NyaXB0aW9ufSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVXNlIHNoaXBEYXRlIGFzIGZhbGxiYWNrIGZvciB3YXJyYW50eSBzdGFydAogICAgICAgICAgICBpZiAoICEkRWFybGllc3RTdGFydCAmJiAkRW50cnktPntzaGlwRGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAkRWFybGllc3RTdGFydCA9ICRFbnRyeS0+e3NoaXBEYXRlfTsKICAgICAgICAgICAgICAgICRFYXJsaWVzdFN0YXJ0ID1+IHMvVC4qJC8vOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFNoaXAgZGF0ZSAoYWx3YXlzIGZyb20gdG9wLWxldmVsIGVudHJ5KQogICAgICAgICAgICBteSAkU2hpcERhdGUgPSAkRW50cnktPntzaGlwRGF0ZX0gfHwgJyc7CiAgICAgICAgICAgICRTaGlwRGF0ZSA9fiBzL1QuKiQvLyBpZiAkU2hpcERhdGU7CgogICAgICAgICAgICAjIEJ1aWxkIHByb2R1Y3QgbmFtZTogIkRlbGwgUFJFQ0lTSU9OIDU1NTAiCiAgICAgICAgICAgIG15ICRQcm9kdWN0TmFtZSA9ICRFbnRyeS0+e3Byb2R1Y3RMaW5lRGVzY3JpcHRpb259CiAgICAgICAgICAgICAgICB8fCAkRW50cnktPntzeXN0ZW1EZXNjcmlwdGlvbn0KICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgJFJlc3VsdHN7JFNlcnZpY2VUYWd9ID0gewogICAgICAgICAgICAgICAgV2FycmFudHlTdGFydCA9PiAkRWFybGllc3RTdGFydCwKICAgICAgICAgICAgICAgIFdhcnJhbnR5RW5kICAgPT4gJExhdGVzdEVuZCwKICAgICAgICAgICAgICAgIFdhcnJhbnR5VHlwZSAgPT4gJEJlc3RUeXBlLAogICAgICAgICAgICAgICAgUHJvZHVjdE5hbWUgICA9PiAkUHJvZHVjdE5hbWUgPyAiRGVsbCAkUHJvZHVjdE5hbWUiIDogJycsCiAgICAgICAgICAgICAgICBTaGlwRGF0ZSAgICAgID0+ICRTaGlwRGF0ZSwKICAgICAgICAgICAgICAgIFNoaXBDb3VudHJ5ICAgPT4gJEVudHJ5LT57Y291bnRyeUNvZGV9IHx8ICcnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXCVSZXN1bHRzOwp9CgoxOwo=</File>
        <File Permission="660" Location="Kernel/System/WarrantySync/Provider/Lenovo.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOjpQcm92aWRlcjo6TGVub3ZvOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViVXNlckFnZW50JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOjpQcm92aWRlcjo6TGVub3ZvIC0gTGVub3ZvIHdhcnJhbnR5IHByb3ZpZGVyIHZpYSBwY3N1cHBvcnQubGVub3ZvLmNvbQoKPWhlYWQxIERFU0NSSVBUSU9OCgpSZXRyaWV2ZXMgd2FycmFudHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgTGVub3ZvIFBDIFN1cHBvcnQgd2Vic2l0ZSdzIGludGVybmFsIEFQSS4KClVzZXMgdHdvIHB1YmxpYyBlbmRwb2ludHMgKG5vIEFQSSBrZXkgcmVxdWlyZWQpOgoKMS4gUHJvZHVjdCBpbmZvOiBHRVQgL2FwaS92NC9tc2UvZ2V0cHJvZHVjdHM/cHJvZHVjdElkPTxTZXJpYWxOdW1iZXI+CjIuIFdhcnJhbnR5IGluZm86IFBPU1QgL2FwaS92NC91cHNlbGwvcmVkcG9ydC9nZXRJYmFzZUluZm8KClRoZSB3YXJyYW50eSBlbmRwb2ludCByZXF1aXJlcyBvbmx5IHNlcmlhbE51bWJlciwgbGFuZ3VhZ2UsIGFuZCBjb3VudHJ5LgptYWNoaW5lVHlwZSBpcyBvcHRpb25hbCBhbmQgbm90IG5lZWRlZC4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEdldFdhcnJhbnR5SW5mbygpCgpRdWVyaWVzIHRoZSBMZW5vdm8gUEMgU3VwcG9ydCBBUEkgZm9yIHdhcnJhbnR5IGluZm9ybWF0aW9uLgoKICAgIG15ICRSZXN1bHRzID0gJFByb3ZpZGVyT2JqZWN0LT5HZXRXYXJyYW50eUluZm8oCiAgICAgICAgU2VyaWFsTnVtYmVycyA9PiBbJ1BGMTIzNEFCJywgJ1BDNTY3OENEJ10sCiAgICApOwoKUmV0dXJucyBhIGhhc2hyZWYgd2l0aCBzZXJpYWwgbnVtYmVycyBhcyBrZXlzOgoKICAgIHsKICAgICAgICAnUEYxMjM0QUInID0+IHsKICAgICAgICAgICAgV2FycmFudHlTdGFydCA9PiAnMjAyMy0wMy0wMScsCiAgICAgICAgICAgIFdhcnJhbnR5RW5kICAgPT4gJzIwMjYtMDMtMDEnLAogICAgICAgICAgICBXYXJyYW50eVR5cGUgID0+ICdCYXNlIFdhcnJhbnR5JywKICAgICAgICAgICAgUHJvZHVjdE5hbWUgICA9PiAnVGhpbmtQYWQgVDE0IEdlbiA0JywKICAgICAgICB9LAogICAgfQoKPWN1dAoKc3ViIEdldFdhcnJhbnR5SW5mbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgaWYgKCAhJFBhcmFte1NlcmlhbE51bWJlcnN9IHx8ICFAeyAkUGFyYW17U2VyaWFsTnVtYmVyc30gfSApIHsKICAgICAgICByZXR1cm4ge307CiAgICB9CgogICAgbXkgJUFsbFJlc3VsdHM7CgogICAgIyBRdWVyeSBlYWNoIHNlcmlhbCBpbmRpdmlkdWFsbHkgKHRoZSB3YXJyYW50eSBlbmRwb2ludCBpcyBwZXItZGV2aWNlKQogICAgZm9yIG15ICRTZXJpYWwgKCBAeyAkUGFyYW17U2VyaWFsTnVtYmVyc30gfSApIHsKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9RdWVyeVdhcnJhbnR5KCBTZXJpYWxOdW1iZXIgPT4gJFNlcmlhbCApOwoKICAgICAgICBpZiAoJFJlc3VsdCkgewogICAgICAgICAgICAkQWxsUmVzdWx0c3skU2VyaWFsfSA9ICRSZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQWxsUmVzdWx0c3skU2VyaWFsfSA9IHsgRXJyb3IgPT4gJ1F1ZXJ5IGZhaWxlZCcgfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlQWxsUmVzdWx0czsKfQoKPWhlYWQyIF9RdWVyeVdhcnJhbnR5KCkKClF1ZXJpZXMgdGhlIExlbm92byB3YXJyYW50eSBlbmRwb2ludCBmb3IgYSBzaW5nbGUgc2VyaWFsIG51bWJlci4KClVzZXMgdGhlIHBjc3VwcG9ydC5sZW5vdm8uY29tIGludGVybmFsIEFQSToKUE9TVCBodHRwczovL3Bjc3VwcG9ydC5sZW5vdm8uY29tL3VzL2VuL2FwaS92NC91cHNlbGwvcmVkcG9ydC9nZXRJYmFzZUluZm8KCkJvZHk6IHsgInNlcmlhbE51bWJlciI6ICIuLi4iLCAibGFuZ3VhZ2UiOiAiZW4iLCAiY291bnRyeSI6ICJ1cyIgfQoKPWN1dAoKc3ViIF9RdWVyeVdhcnJhbnR5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkSlNPTk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CiAgICBteSAkTWF4UmV0cmllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnV2FycmFudHlTeW5jOjpBUEk6Ok1heFJldHJpZXMnKSB8fCAzOwoKICAgIG15ICRTZXJpYWwgPSAkUGFyYW17U2VyaWFsTnVtYmVyfTsKCiAgICAjIEJ1aWxkIEpTT04gcmVxdWVzdCBib2R5IC0gbWFjaGluZVR5cGUgaXMgbm90IHJlcXVpcmVkCiAgICBteSAkUmVxdWVzdEJvZHkgPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBzZXJpYWxOdW1iZXIgPT4gJFNlcmlhbCwKICAgICAgICAgICAgbGFuZ3VhZ2UgICAgID0+ICdlbicsCiAgICAgICAgICAgIGNvdW50cnkgICAgICA9PiAndXMnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVXNlIExXUDo6VXNlckFnZW50IGRpcmVjdGx5IGJlY2F1c2UgWm51bnkncyBXZWJVc2VyQWdlbnQgZG9lcyBub3QKICAgICMgc3VwcG9ydCByYXcgSlNPTiBQT1NUIGJvZGllcyAoaXQgcmVxdWlyZXMgRGF0YSBhcyBoYXNocmVmL2FycmF5cmVmKQogICAgcmVxdWlyZSBMV1A6OlVzZXJBZ2VudDsKICAgIHJlcXVpcmUgSFRUUDo6UmVxdWVzdDsKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KAogICAgICAgIHRpbWVvdXQgID0+IDMwLAogICAgICAgIHNzbF9vcHRzID0+IHsgdmVyaWZ5X2hvc3RuYW1lID0+IDEgfSwKICAgICk7CgogICAgbXkgJEhUVFBSZXNwb25zZTsKICAgIG15ICRBdHRlbXB0ID0gMDsKCiAgICBSRVRSWToKICAgIHdoaWxlICggJEF0dGVtcHQgPCAkTWF4UmV0cmllcyApIHsKICAgICAgICAkQXR0ZW1wdCsrOwoKICAgICAgICBteSAkSFRUUFJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoCiAgICAgICAgICAgICdQT1NUJywKICAgICAgICAgICAgJ2h0dHBzOi8vcGNzdXBwb3J0Lmxlbm92by5jb20vdXMvZW4vYXBpL3Y0L3Vwc2VsbC9yZWRwb3J0L2dldEliYXNlSW5mbycsCiAgICAgICAgKTsKICAgICAgICAkSFRUUFJlcXVlc3QtPmhlYWRlciggJ0NvbnRlbnQtVHlwZScgICAgPT4gJ2FwcGxpY2F0aW9uL2pzb24nICk7CiAgICAgICAgJEhUVFBSZXF1ZXN0LT5oZWFkZXIoICdBY2NlcHQnICAgICAgICAgID0+ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonICk7CiAgICAgICAgJEhUVFBSZXF1ZXN0LT5oZWFkZXIoICdBY2NlcHQtTGFuZ3VhZ2UnID0+ICdlbi1VUyxlbjtxPTAuNScgKTsKICAgICAgICAkSFRUUFJlcXVlc3QtPmhlYWRlciggJ1VzZXItQWdlbnQnICAgICAgPT4KICAgICAgICAgICAgJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQ7IHJ2OjEyOC4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94LzEyOC4wJyApOwogICAgICAgICRIVFRQUmVxdWVzdC0+Y29udGVudCgkUmVxdWVzdEJvZHkpOwoKICAgICAgICAkSFRUUFJlc3BvbnNlID0gJFVzZXJBZ2VudC0+cmVxdWVzdCgkSFRUUFJlcXVlc3QpOwoKICAgICAgICBsYXN0IFJFVFJZIGlmICRIVFRQUmVzcG9uc2UtPmlzX3N1Y2Nlc3MoKTsKCiAgICAgICAgIyBSZXRyeSBvbiByYXRlIGxpbWl0ICg0MjkpIG9yIHNlcnZlciBlcnJvciAoNXh4KQogICAgICAgIG15ICRDb2RlID0gJEhUVFBSZXNwb25zZS0+Y29kZSgpIHx8IDA7CiAgICAgICAgaWYgKCAkQ29kZSA9fiAvXig0Mjl8NVxkXGQpJC8gJiYgJEF0dGVtcHQgPCAkTWF4UmV0cmllcyApIHsKICAgICAgICAgICAgbXkgJFdhaXQgPSAyICoqICRBdHRlbXB0OwogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6Okxlbm92bzogUXVlcnkgZm9yICRTZXJpYWwgcmV0dXJuZWQgJENvZGUsICIKICAgICAgICAgICAgICAgICAgICAuICJyZXRyeSAkQXR0ZW1wdC8kTWF4UmV0cmllcyBpbiAke1dhaXR9cy4iLAogICAgICAgICAgICApOwogICAgICAgICAgICBzbGVlcCAkV2FpdDsKICAgICAgICAgICAgbmV4dCBSRVRSWTsKICAgICAgICB9CgogICAgICAgIGxhc3QgUkVUUlk7CiAgICB9CgogICAgaWYgKCAhJEhUVFBSZXNwb25zZS0+aXNfc3VjY2VzcygpICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIldhcnJhbnR5U3luYzo6TGVub3ZvOiBXYXJyYW50eSBxdWVyeSBmYWlsZWQgZm9yICRTZXJpYWwgYWZ0ZXIgIgogICAgICAgICAgICAgICAgLiAiJEF0dGVtcHQgYXR0ZW1wdChzKS4gU3RhdHVzOiAiIC4gJEhUVFBSZXNwb25zZS0+c3RhdHVzX2xpbmUoKSwKICAgICAgICApOwogICAgICAgIHJldHVybiB7IEVycm9yID0+ICJIVFRQICIgLiAkSFRUUFJlc3BvbnNlLT5jb2RlKCkgfTsKICAgIH0KCiAgICBteSAkQ29udGVudCA9ICRIVFRQUmVzcG9uc2UtPmRlY29kZWRfY29udGVudCgpOwogICAgbXkgJERhdGE7CiAgICBldmFsIHsKICAgICAgICAkRGF0YSA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJENvbnRlbnQgKTsKICAgIH07CiAgICBpZiAoJEApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6Okxlbm92bzogRmFpbGVkIHRvIHBhcnNlIHdhcnJhbnR5IHJlc3BvbnNlIGZvciAkU2VyaWFsOiAkQCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4geyBFcnJvciA9PiAnSlNPTiBwYXJzZSBlcnJvcicgfTsKICAgIH0KCiAgICAjIFJlc3BvbnNlIHN0cnVjdHVyZToKICAgICMgeyBkYXRhOiB7IG1hY2hpbmVJbmZvOiB7Li4ufSwgYmFzZVdhcnJhbnRpZXM6IFsuLi5dLCB1cGdyYWRlV2FycmFudGllczogWy4uLl0sCiAgICAjICAgICAgICAgICBjdXJyZW50V2FycmFudHk6IHsuLi59LCB3YXJyYW50eVN0YXR1czogIkluIHdhcnJhbnR5InwiT3V0IG9mIHdhcnJhbnR5IiB9IH0KICAgICMgTm90ZTogQVBJIHJldHVybnMgImRhdGEiIChsb3dlcmNhc2UpIGluIEpTT04KICAgIG15ICRSZXNwb25zZURhdGEgPSAkRGF0YS0+e2RhdGF9IHx8ICREYXRhLT57RGF0YX07CgogICAgaWYgKCAhJFJlc3BvbnNlRGF0YSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJXYXJyYW50eVN5bmM6Okxlbm92bzogTm8gZGF0YSBpbiByZXNwb25zZSBmb3IgJFNlcmlhbC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHsgRXJyb3IgPT4gJ05vIGRhdGEgaW4gcmVzcG9uc2UnIH07CiAgICB9CgogICAgIyBVc2UgY3VycmVudFdhcnJhbnR5IGlmIGF2YWlsYWJsZSAtIHRoaXMgaXMgdGhlIGFjdGl2ZSBoaWdoZXN0LXRpZXIgd2FycmFudHkKICAgICMgc2VsZWN0ZWQgYnkgTGVub3ZvLCB3aGljaCBnaXZlcyB1cyB0aGUgYmVzdCBzaW5nbGUgYW5zd2VyCiAgICBteSAkQ3VycmVudFdhcnJhbnR5ID0gJFJlc3BvbnNlRGF0YS0+e2N1cnJlbnRXYXJyYW50eX07CiAgICBteSAkRWFybGllc3RTdGFydCAgID0gJyc7CiAgICBteSAkTGF0ZXN0RW5kICAgICAgID0gJyc7CiAgICBteSAkQmVzdFR5cGUgICAgICAgID0gJyc7CgogICAgaWYgKCAkQ3VycmVudFdhcnJhbnR5ICYmICRDdXJyZW50V2FycmFudHktPntlbmREYXRlfSApIHsKICAgICAgICAkRWFybGllc3RTdGFydCA9ICRDdXJyZW50V2FycmFudHktPntzdGFydERhdGV9IHx8ICcnOwogICAgICAgICRMYXRlc3RFbmQgICAgID0gJEN1cnJlbnRXYXJyYW50eS0+e2VuZERhdGV9ICAgfHwgJyc7CiAgICAgICAgJEJlc3RUeXBlICAgICAgPSAkQ3VycmVudFdhcnJhbnR5LT57bmFtZX0gICAgICB8fCAkQ3VycmVudFdhcnJhbnR5LT57ZGVsaXZlcnlUeXBlTmFtZX0gfHwgJyc7CiAgICB9CgogICAgIyBBbHNvIHNjYW4gYWxsIHdhcnJhbnRpZXMgdG8gZmluZCB0aGUgYWJzb2x1dGUgbGF0ZXN0IGVuZCBkYXRlCiAgICAjIChjdXJyZW50V2FycmFudHkgbWlnaHQgbm90IGFsd2F5cyBiZSB0aGUgb25lIHdpdGggdGhlIGxhdGVzdCBlbmQpCiAgICBteSBAQWxsV2FycmFudGllczsKICAgIG15ICRCYXNlV2FycmFudGllcyAgICA9ICRSZXNwb25zZURhdGEtPntiYXNlV2FycmFudGllc30gICAgfHwgW107CiAgICBteSAkVXBncmFkZVdhcnJhbnRpZXMgPSAkUmVzcG9uc2VEYXRhLT57dXBncmFkZVdhcnJhbnRpZXN9IHx8IFtdOwoKICAgIGlmICggcmVmICRCYXNlV2FycmFudGllcyBlcSAnQVJSQVknICkgewogICAgICAgIHB1c2ggQEFsbFdhcnJhbnRpZXMsIEB7JEJhc2VXYXJyYW50aWVzfTsKICAgIH0KICAgIGlmICggcmVmICRVcGdyYWRlV2FycmFudGllcyBlcSAnQVJSQVknICkgewogICAgICAgICMgT25seSBjb25zaWRlciBub24tc3ViLWl0ZW1zICh0aGUgbWFpbiB3YXJyYW50eSwgbm90IGl0cyBidW5kbGVkIGNvbXBvbmVudHMpCiAgICAgICAgcHVzaCBAQWxsV2FycmFudGllcywgZ3JlcCB7ICEkXy0+e3BsdXNCdW5kbGVTdWJJdGVtfSB9IEB7JFVwZ3JhZGVXYXJyYW50aWVzfTsKICAgIH0KCiAgICBmb3IgbXkgJFdhcnJhbnR5IChAQWxsV2FycmFudGllcykgewogICAgICAgICMgU2tpcCBjb21wb25lbnQgd2FycmFudGllcyAoZS5nLiBiYXR0ZXJ5KSAtIGZvY3VzIG9uIG1hY2hpbmUgd2FycmFudGllcwogICAgICAgIG5leHQgaWYgKCAkV2FycmFudHktPntjYXRlZ29yeX0gfHwgJycgKSBlcSAnQ09NUE9ORU5UJzsKCiAgICAgICAgbXkgJFN0YXJ0ID0gJFdhcnJhbnR5LT57c3RhcnREYXRlfSB8fCAnJzsKICAgICAgICBteSAkRW5kICAgPSAkV2FycmFudHktPntlbmREYXRlfSAgIHx8ICcnOwoKICAgICAgICAjIE5vcm1hbGl6ZSBkYXRlIGZvcm1hdCAocmVtb3ZlIHRpbWUgcG9ydGlvbiBpZiBwcmVzZW50KQogICAgICAgICRTdGFydCA9fiBzL1QuKiQvLyBpZiAkU3RhcnQ7CiAgICAgICAgJEVuZCAgID1+IHMvVC4qJC8vIGlmICRFbmQ7CgogICAgICAgIGlmICggJFN0YXJ0ICYmICggISRFYXJsaWVzdFN0YXJ0IHx8ICRTdGFydCBsdCAkRWFybGllc3RTdGFydCApICkgewogICAgICAgICAgICAkRWFybGllc3RTdGFydCA9ICRTdGFydDsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRW5kICYmICggISRMYXRlc3RFbmQgfHwgJEVuZCBndCAkTGF0ZXN0RW5kICkgKSB7CiAgICAgICAgICAgICRMYXRlc3RFbmQgPSAkRW5kOwogICAgICAgICAgICAkQmVzdFR5cGUgID0gJFdhcnJhbnR5LT57bmFtZX0gfHwgJFdhcnJhbnR5LT57ZGVsaXZlcnlUeXBlTmFtZX0gfHwgJ1dhcnJhbnR5JzsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgcHJvZHVjdCBpbmZvIGZyb20gbWFjaGluZUluZm8KICAgIG15ICRNYWNoaW5lSW5mbyA9ICRSZXNwb25zZURhdGEtPnttYWNoaW5lSW5mb30gfHwge307CiAgICBteSAkUHJvZHVjdE5hbWUgPSAkTWFjaGluZUluZm8tPntwcm9kdWN0TmFtZX0gfHwgJyc7CgogICAgIyBGYWxsYmFjazogY29uc3RydWN0IGZyb20gcHJvZHVjdCArIG1vZGVsIGlmIHByb2R1Y3ROYW1lIG5vdCBhdmFpbGFibGUKICAgIGlmICggISRQcm9kdWN0TmFtZSApIHsKICAgICAgICBteSAkUHJvZHVjdCA9ICRNYWNoaW5lSW5mby0+e3Byb2R1Y3R9IHx8ICcnOwogICAgICAgIG15ICRNb2RlbCAgID0gJE1hY2hpbmVJbmZvLT57bW9kZWx9ICAgfHwgJyc7CiAgICAgICAgJFByb2R1Y3ROYW1lID0gJFByb2R1Y3Q7CiAgICAgICAgJFByb2R1Y3ROYW1lIC49ICIgKCRNb2RlbCkiIGlmICRNb2RlbCAmJiAkTW9kZWwgbmUgJFByb2R1Y3Q7CiAgICB9CgogICAgIyBTaGlwIGRhdGUgZnJvbSBtYWNoaW5lSW5mbwogICAgbXkgJFNoaXBEYXRlID0gJE1hY2hpbmVJbmZvLT57c2hpcERhdGV9IHx8ICcnOwogICAgJFNoaXBEYXRlID1+IHMvVC4qJC8vIGlmICRTaGlwRGF0ZTsKCiAgICByZXR1cm4gewogICAgICAgIFdhcnJhbnR5U3RhcnQgPT4gJEVhcmxpZXN0U3RhcnQsCiAgICAgICAgV2FycmFudHlFbmQgICA9PiAkTGF0ZXN0RW5kLAogICAgICAgIFdhcnJhbnR5VHlwZSAgPT4gJEJlc3RUeXBlLAogICAgICAgIFByb2R1Y3ROYW1lICAgPT4gJFByb2R1Y3ROYW1lID8gIkxlbm92byAkUHJvZHVjdE5hbWUiIDogJycsCiAgICAgICAgU2hpcERhdGUgICAgICA9PiAkU2hpcERhdGUsCiAgICAgICAgU2hpcENvdW50cnkgICA9PiAkTWFjaGluZUluZm8tPntzaGlwVG9Db3VudHJ5fSB8fCAnJywKICAgIH07Cn0KCjE7Cg==</File>

        <!-- Console Command -->
        <File Permission="660" Location="Kernel/System/Console/Command/Maint/WarrantySync/Run.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OldhcnJhbnR5U3luYzo6UnVuOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXYXJyYW50eVN5bmMnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6V2FycmFudHlTeW5jOjpSdW4gLSBNYW51YWxseSBydW4gd2FycmFudHkgc3luYwoKPWhlYWQxIERFU0NSSVBUSU9OCgpDb25zb2xlIGNvbW1hbmQgdG8gbWFudWFsbHkgdHJpZ2dlciB3YXJyYW50eSBpbmZvcm1hdGlvbiBzeW5jIGZyb20gbWFudWZhY3R1cmVyIEFQSXMuCgpVc2FnZToKICAgIGJpbi96bnVueS5Db25zb2xlLnBsIE1haW50OjpXYXJyYW50eVN5bmM6OlJ1bgogICAgYmluL3pudW55LkNvbnNvbGUucGwgTWFpbnQ6OldhcnJhbnR5U3luYzo6UnVuIC0tZm9yY2UKICAgIGJpbi96bnVueS5Db25zb2xlLnBsIE1haW50OjpXYXJyYW50eVN5bmM6OlJ1biAtLXRlc3QtbW9kZQoKPWN1dAoKc3ViIENvbmZpZ3VyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5EZXNjcmlwdGlvbignU3luYyB3YXJyYW50eSBpbmZvcm1hdGlvbiBmcm9tIG1hbnVmYWN0dXJlciBBUElzIGZvciBDTURCIGhhcmR3YXJlIGFzc2V0cy4nKTsKCiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdmb3JjZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1J1biBldmVuIGlmIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkIGluIFN5c0NvbmZpZy4nLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMCwKICAgICk7CgogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAndGVzdC1tb2RlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVXNlIHRlc3QgZGF0YSBpbnN0ZWFkIG9mIENNREIgKG92ZXJyaWRlcyBTeXNDb25maWcgVGVzdE1vZGUgc2V0dGluZykuJywKICAgICAgICBSZXF1aXJlZCAgICA9PiAwLAogICAgICAgIEhhc1ZhbHVlICAgID0+IDAsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFByZVJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEZvcmNlICAgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ2ZvcmNlJyk7CgogICAgaWYgKCAhJEZvcmNlICkgewogICAgICAgIG15ICRFbmFibGVkID0gJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkVuYWJsZWQnKTsKICAgICAgICBpZiAoICEkRW5hYmxlZCApIHsKICAgICAgICAgICAgZGllICJXYXJyYW50eVN5bmMgaXMgZGlzYWJsZWQuIFVzZSAtLWZvcmNlIHRvIHJ1biBhbnl3YXksICIKICAgICAgICAgICAgICAgIC4gIm9yIGVuYWJsZSB2aWEgU3lzQ29uZmlnIChXYXJyYW50eVN5bmM6OkVuYWJsZWQpLlxuIjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBPdmVycmlkZSBUZXN0TW9kZSBpZiAtLXRlc3QtbW9kZSBmbGFnIGlzIHNldAogICAgbXkgJFRlc3RNb2RlRmxhZyA9ICRTZWxmLT5HZXRPcHRpb24oJ3Rlc3QtbW9kZScpOwogICAgaWYgKCRUZXN0TW9kZUZsYWcpIHsKICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OlRlc3RNb2RlJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgT3ZlcnJpZGUgRW5hYmxlZCBpZiAtLWZvcmNlIGZsYWcgaXMgc2V0CiAgICBteSAkRm9yY2UgPSAkU2VsZi0+R2V0T3B0aW9uKCdmb3JjZScpOwogICAgaWYgKCRGb3JjZSkgewogICAgICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6RW5hYmxlZCcsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+U3RhcnRpbmcgd2FycmFudHkgc3luYy4uLjwveWVsbG93PlxuXG4iKTsKCiAgICBteSAkV2FycmFudHlTeW5jT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYycpOwoKICAgIG15ICRTdGF0cyA9ICRXYXJyYW50eVN5bmNPYmplY3QtPlJ1biggRm9yY2UgPT4gJEZvcmNlICk7CgogICAgaWYgKCRTdGF0cykgewogICAgICAgICRTZWxmLT5QcmludCgiICBDaGVja2VkOiAgJFN0YXRzLT57Q2hlY2tlZH1cbiIpOwogICAgICAgICRTZWxmLT5QcmludCgiICBVcGRhdGVkOiAgJFN0YXRzLT57VXBkYXRlZH1cbiIpOwogICAgICAgICRTZWxmLT5QcmludCgiICBFcnJvcnM6ICAgJFN0YXRzLT57RXJyb3JzfVxuIik7CiAgICAgICAgJFNlbGYtPlByaW50KCIgIFNraXBwZWQ6ICAkU3RhdHMtPntTa2lwcGVkfVxuIik7CiAgICAgICAgaWYgKCAkU3RhdHMtPntUaWNrZXRzQ3JlYXRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiICBUaWNrZXRzOiAgJFN0YXRzLT57VGlja2V0c0NyZWF0ZWR9XG4iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPlByaW50KCJcbiIpOwoKICAgICAgICBpZiAoICRTdGF0cy0+e0Vycm9yc30gPiAwICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+V2FycmFudHkgc3luYyBjb21wbGV0ZWQgd2l0aCAkU3RhdHMtPntFcnJvcnN9IGVycm9yKHMpLiBDaGVjayB0aGUgc3lzdGVtIGxvZyBmb3IgZGV0YWlscy48L3llbGxvdz5cbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+V2FycmFudHkgc3luYyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LjwvZ3JlZW4+XG4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7CiAgICB9CgogICAgJFNlbGYtPlByaW50RXJyb3IoIldhcnJhbnR5IHN5bmMgZmFpbGVkLiBDaGVjayB0aGUgc3lzdGVtIGxvZyBmb3IgZGV0YWlscy5cbiIpOwogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7Cn0KCjE7Cg==</File>

        <!-- Translations -->
        <File Permission="660" Location="Kernel/Language/de_WarrantySync.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9XYXJyYW50eVN5bmM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufSA9IHsKCiAgICAgICAgIyBGZWF0dXJlCiAgICAgICAgJ0VuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHdhcnJhbnR5IHN5bmMgZmVhdHVyZS4nCiAgICAgICAgICAgID0+ICdBa3RpdmllcnQgb2RlciBkZWFrdGl2aWVydCBkaWUgR2FyYW50aWUtU3luY2hyb25pc2F0aW9uLicsCgogICAgICAgICMgQ3JvbgogICAgICAgICdTY2hlZHVsZWQgdGFzayB0byBzeW5jIHdhcnJhbnR5IGluZm9ybWF0aW9uIGZyb20gbWFudWZhY3R1cmVyIEFQSXMuIFJ1bnMgZGFpbHkgYXQgMDI6MDAgYnkgZGVmYXVsdC4nCiAgICAgICAgICAgID0+ICdHZXBsYW50ZSBBdWZnYWJlIHp1ciBTeW5jaHJvbmlzYXRpb24gdm9uIEdhcmFudGllaW5mb3JtYXRpb25lbiB1ZWJlciBIZXJzdGVsbGVyLUFQSXMuIExhZXVmdCBzdGFuZGFyZG1hZXNzaWcgdGFlZ2xpY2ggdW0gMDI6MDAgVWhyLicsCgogICAgICAgICMgQ29uZmlnSXRlbSBTb3VyY2UKICAgICAgICAnQ01EQiBjbGFzc2VzIHRvIHNlYXJjaCBmb3IgaGFyZHdhcmUgYXNzZXRzLiBUaGUgd2FycmFudHkgc3luYyB3aWxsIGNoZWNrIGFsbCBDb25maWdJdGVtcyBpbiB0aGVzZSBjbGFzc2VzLicKICAgICAgICAgICAgPT4gJ0NNREItS2xhc3NlbiBmdWVyIGRpZSBTdWNoZSBuYWNoIEhhcmR3YXJlLUFzc2V0cy4gRGllIEdhcmFudGllLVN5bmNocm9uaXNhdGlvbiBwcnVlZnQgYWxsZSBDb25maWdJdGVtcyBpbiBkaWVzZW4gS2xhc3Nlbi4nLAoKICAgICAgICAnT25seSBjaGVjayBDb25maWdJdGVtcyBpbiB0aGVzZSBkZXBsb3ltZW50IHN0YXRlcy4nCiAgICAgICAgICAgID0+ICdOdXIgQ29uZmlnSXRlbXMgaW4gZGllc2VuIFZlcndlbmR1bmdzc3RhdHVzIHBydWVmZW4uJywKCiAgICAgICAgJ0NvbmZpZ0l0ZW0gY2xhc3MgYXR0cmlidXRlIG5hbWUgY29udGFpbmluZyB0aGUgdmVuZG9yL21hbnVmYWN0dXJlci4gVGhpcyBpcyB0aGUga2V5IG5hbWUgZnJvbSB5b3VyIENNREIgY2xhc3MgZGVmaW5pdGlvbiAoWUFNTCkuIERlZmF1bHQgbWF0Y2hlcyB0aGUgc3RhbmRhcmQgSVRTTSBDb21wdXRlciBjbGFzcy4nCiAgICAgICAgICAgID0+ICdOYW1lIGRlcyBDb25maWdJdGVtLUtsYXNzZW5hdHRyaWJ1dHMgbWl0IGRlbSBIZXJzdGVsbGVyLiBEaWVzIGlzdCBkZXIgU2NobHVlc3NlbG5hbWUgYXVzIElocmVyIENNREItS2xhc3NlbmRlZmluaXRpb24gKFlBTUwpLiBTdGFuZGFyZCBlbnRzcHJpY2h0IGRlciBJVFNNLUtsYXNzZSBDb21wdXRlci4nLAoKICAgICAgICAnQ29uZmlnSXRlbSBjbGFzcyBhdHRyaWJ1dGUgbmFtZSBjb250YWluaW5nIHRoZSBzZXJpYWwgbnVtYmVyIC8gc2VydmljZSB0YWcuIFRoaXMgaXMgdGhlIGtleSBuYW1lIGZyb20geW91ciBDTURCIGNsYXNzIGRlZmluaXRpb24gKFlBTUwpLiBEZWZhdWx0IG1hdGNoZXMgdGhlIHN0YW5kYXJkIElUU00gQ29tcHV0ZXIgY2xhc3MuJwogICAgICAgICAgICA9PiAnTmFtZSBkZXMgQ29uZmlnSXRlbS1LbGFzc2VuYXR0cmlidXRzIG1pdCBkZXIgU2VyaWVubnVtbWVyIC8gU2VydmljZSBUYWcuIERpZXMgaXN0IGRlciBTY2hsdWVzc2VsbmFtZSBhdXMgSWhyZXIgQ01EQi1LbGFzc2VuZGVmaW5pdGlvbiAoWUFNTCkuIFN0YW5kYXJkIGVudHNwcmljaHQgZGVyIElUU00tS2xhc3NlIENvbXB1dGVyLicsCgogICAgICAgICMgVmVuZG9yIE1hcHBpbmcKICAgICAgICAnTWFwcyBDTURCIHZlbmRvciB2YWx1ZXMgdG8gd2FycmFudHkgcHJvdmlkZXIgbmFtZXMuIEtleSA9IHZlbmRvciB2YWx1ZSBhcyBpdCBhcHBlYXJzIGluIHlvdXIgQ01EQiAoZXhhY3QgbWF0Y2gpLCBWYWx1ZSA9IHByb3ZpZGVyIG5hbWUgKERlbGwsIExlbm92bykuIEZvciBHZW5lcmFsQ2F0YWxvZy10eXBlIHZlbmRvciBmaWVsZHMsIHVzZSB0aGUgY2F0YWxvZyBpdGVtIG5hbWUuJwogICAgICAgICAgICA9PiAnT3JkbmV0IENNREItSGVyc3RlbGxlcndlcnRlIGRlbiBHYXJhbnRpZS1Qcm92aWRlcm4genUuIFNjaGx1ZXNzZWwgPSBIZXJzdGVsbGVyd2VydCB3aWUgaW4gZGVyIENNREIgKGV4YWt0ZSBVZWJlcmVpbnN0aW1tdW5nKSwgV2VydCA9IFByb3ZpZGVyLU5hbWUgKERlbGwsIExlbm92bykuIEJlaSBHZW5lcmFsQ2F0YWxvZy1GZWxkZXJuIGRlbiBLYXRhbG9nLUVpbnRyYWdzbmFtZW4gdmVyd2VuZGVuLicsCgogICAgICAgICMgT3V0cHV0IEZpZWxkIE1hcHBpbmcKICAgICAgICAnTWFwcyB3YXJyYW50eSBBUEkgcmVzdWx0IGZpZWxkcyB0byBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZXMuIEtleSA9IEFQSSByZXN1bHQgZmllbGQgbmFtZSwgVmFsdWUgPSBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZSBuYW1lIGZyb20geW91ciBDTURCIGNsYXNzIGRlZmluaXRpb24gKFlBTUwpLiBTZXQgYSB2YWx1ZSB0byBlbXB0eSBzdHJpbmcgdG8gc2tpcCB0aGF0IGZpZWxkLiBUaGUgZGVmYXVsdCBcJ1dhcnJhbnR5RXhwaXJhdGlvbkRhdGVcJyBtYXRjaGVzIHRoZSBzdGFuZGFyZCBJVFNNIENvbXB1dGVyIGNsYXNzLiBBbGwgb3RoZXIgZmllbGRzIHJlcXVpcmUgYWRkaW5nIGN1c3RvbSBhdHRyaWJ1dGVzIHRvIHlvdXIgY2xhc3MgZGVmaW5pdGlvbi4nCiAgICAgICAgICAgID0+ICdPcmRuZXQgR2FyYW50aWUtQVBJLUVyZ2VibmlzZmVsZGVyIGRlbiBDb25maWdJdGVtLUtsYXNzZW5hdHRyaWJ1dGVuIHp1LiBTY2hsdWVzc2VsID0gQVBJLUZlbGRuYW1lLCBXZXJ0ID0gS2xhc3NlbmF0dHJpYnV0LU5hbWUgYXVzIGRlciBDTURCLUtsYXNzZW5kZWZpbml0aW9uIChZQU1MKS4gTGVlcmVyIFdlcnQgPSBGZWxkIHdpcmQgdWViZXJzcHJ1bmdlbi4gU3RhbmRhcmQgXCdXYXJyYW50eUV4cGlyYXRpb25EYXRlXCcgZW50c3ByaWNodCBkZXIgSVRTTS1LbGFzc2UgQ29tcHV0ZXIuIEFsbGUgYW5kZXJlbiBGZWxkZXIgZXJmb3JkZXJuIGVpZ2VuZSBBdHRyaWJ1dGUgaW4gZGVyIEtsYXNzZW5kZWZpbml0aW9uLicsCgogICAgICAgICMgRXhwaXJ5IE5vdGlmaWNhdGlvbgogICAgICAgICdJZiBlbmFibGVkLCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSB0aWNrZXQgd2hlbiBhIHdhcnJhbnR5IGlzIGFib3V0IHRvIGV4cGlyZS4gUnVucyBhZnRlciBlYWNoIHN5bmMuJwogICAgICAgICAgICA9PiAnV2VubiBha3RpdmllcnQsIHdpcmQgYXV0b21hdGlzY2ggZWluIFRpY2tldCBlcnN0ZWxsdCB3ZW5uIGVpbmUgR2FyYW50aWUgYmFsZCBhYmxhZXVmdC4gV2lyZCBuYWNoIGplZGVtIFN5bmMgYXVzZ2VmdWVocnQuJywKCiAgICAgICAgJ051bWJlciBvZiBkYXlzIGJlZm9yZSB3YXJyYW50eSBleHBpcmF0aW9uIHRvIGNyZWF0ZSBhIG5vdGlmaWNhdGlvbiB0aWNrZXQuIEV4YW1wbGU6IDkwIG1lYW5zIGEgdGlja2V0IGlzIGNyZWF0ZWQgd2hlbiB0aGUgd2FycmFudHkgZXhwaXJlcyB3aXRoaW4gdGhlIG5leHQgOTAgZGF5cy4nCiAgICAgICAgICAgID0+ICdBbnphaGwgVGFnZSB2b3IgR2FyYW50aWVhYmxhdWYgZnVlciBkaWUgRXJzdGVsbHVuZyBlaW5lcyBCZW5hY2hyaWNodGlndW5nc3RpY2tldHMuIEJlaXNwaWVsOiA5MCBiZWRldXRldCwgZWluIFRpY2tldCB3aXJkIGVyc3RlbGx0IHdlbm4gZGllIEdhcmFudGllIGlubmVyaGFsYiBkZXIgbmFlY2hzdGVuIDkwIFRhZ2UgYWJsYWV1ZnQuJywKCiAgICAgICAgJ1F1ZXVlIGZvciB3YXJyYW50eSBleHBpcnkgbm90aWZpY2F0aW9uIHRpY2tldHMuJwogICAgICAgICAgICA9PiAnUXVldWUgZnVlciBHYXJhbnRpZS1BYmxhdWYtQmVuYWNocmljaHRpZ3VuZ3N0aWNrZXRzLicsCgogICAgICAgICdUaWNrZXQgdHlwZSBmb3Igd2FycmFudHkgZXhwaXJ5IG5vdGlmaWNhdGlvbiB0aWNrZXRzLiBMZWF2ZSBlbXB0eSBmb3IgZGVmYXVsdCB0eXBlLicKICAgICAgICAgICAgPT4gJ1RpY2tldC1UeXAgZnVlciBHYXJhbnRpZS1BYmxhdWYtQmVuYWNocmljaHRpZ3VuZ3N0aWNrZXRzLiBMZWVyIGxhc3NlbiBmdWVyIFN0YW5kYXJkLVR5cC4nLAoKICAgICAgICAnUHJpb3JpdHkgZm9yIHdhcnJhbnR5IGV4cGlyeSBub3RpZmljYXRpb24gdGlja2V0cy4nCiAgICAgICAgICAgID0+ICdQcmlvcml0YWV0IGZ1ZXIgR2FyYW50aWUtQWJsYXVmLUJlbmFjaHJpY2h0aWd1bmdzdGlja2V0cy4nLAoKICAgICAgICAnSW5pdGlhbCBzdGF0ZSBmb3Igd2FycmFudHkgZXhwaXJ5IG5vdGlmaWNhdGlvbiB0aWNrZXRzLicKICAgICAgICAgICAgPT4gJ0FuZmFuZ3NzdGF0dXMgZnVlciBHYXJhbnRpZS1BYmxhdWYtQmVuYWNocmljaHRpZ3VuZ3N0aWNrZXRzLicsCgogICAgICAgICdTdWJqZWN0IHRlbXBsYXRlIGZvciB3YXJyYW50eSBleHBpcnkgdGlja2V0cy4gUGxhY2Vob2xkZXJzOiA8QVNTRVRfTkFNRT4sIDxTRVJJQUw+LCA8V0FSUkFOVFlfRU5EPiwgPFZFTkRPUj4sIDxEQVlTX0xFRlQ+JwogICAgICAgICAgICA9PiAnQmV0cmVmZi1Wb3JsYWdlIGZ1ZXIgR2FyYW50aWUtQWJsYXVmLVRpY2tldHMuIFBsYXR6aGFsdGVyOiA8QVNTRVRfTkFNRT4sIDxTRVJJQUw+LCA8V0FSUkFOVFlfRU5EPiwgPFZFTkRPUj4sIDxEQVlTX0xFRlQ+JywKCiAgICAgICAgJ0JvZHkgdGVtcGxhdGUgZm9yIHdhcnJhbnR5IGV4cGlyeSB0aWNrZXRzLiBQbGFjZWhvbGRlcnM6IDxBU1NFVF9OQU1FPiwgPFNFUklBTD4sIDxXQVJSQU5UWV9FTkQ+LCA8V0FSUkFOVFlfU1RBUlQ+LCA8V0FSUkFOVFlfVFlQRT4sIDxWRU5ET1I+LCA8UFJPRFVDVF9OQU1FPiwgPERBWVNfTEVGVD4sIDxDT05GSUdfSVRFTV9JRD4nCiAgICAgICAgICAgID0+ICdUZXh0LVZvcmxhZ2UgZnVlciBHYXJhbnRpZS1BYmxhdWYtVGlja2V0cy4gUGxhdHpoYWx0ZXI6IDxBU1NFVF9OQU1FPiwgPFNFUklBTD4sIDxXQVJSQU5UWV9FTkQ+LCA8V0FSUkFOVFlfU1RBUlQ+LCA8V0FSUkFOVFlfVFlQRT4sIDxWRU5ET1I+LCA8UFJPRFVDVF9OQU1FPiwgPERBWVNfTEVGVD4sIDxDT05GSUdfSVRFTV9JRD4nLAoKICAgICAgICAnRmlsdGVyIHdoaWNoIGFzc2V0cyBnZXQgZXhwaXJ5IG5vdGlmaWNhdGlvbiB0aWNrZXRzLiBLZXkgPSBDb25maWdJdGVtIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLCBWYWx1ZSA9IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzLiBFeGFtcGxlOiBUeXBlPVNlcnZlcixMYXB0b3AgbWVhbnMgb25seSBhc3NldHMgd2hlcmUgdGhlIFR5cGUgYXR0cmlidXRlIGlzIFNlcnZlciBvciBMYXB0b3AuIE11bHRpcGxlIGtleXMgdXNlIEFORCBsb2dpYy4gTGVhdmUgZW1wdHkgaGFzaCB0byBub3RpZnkgZm9yIGFsbCBhc3NldHMuJwogICAgICAgICAgICA9PiAnRmlsdGVyIHdlbGNoZSBBc3NldHMgQWJsYXVmLUJlbmFjaHJpY2h0aWd1bmdzdGlja2V0cyBlcmhhbHRlbi4gU2NobHVlc3NlbCA9IENvbmZpZ0l0ZW0tS2xhc3NlbmF0dHJpYnV0LU5hbWUsIFdlcnQgPSBrb21tYWdldHJlbm50ZSBMaXN0ZSBlcmxhdWJ0ZXIgV2VydGUuIEJlaXNwaWVsOiBUeXBlPVNlcnZlcixMYXB0b3AgYmVkZXV0ZXQgbnVyIEFzc2V0cyBkZXJlbiBUeXBlLUF0dHJpYnV0IFNlcnZlciBvZGVyIExhcHRvcCBpc3QuIE1laHJlcmUgU2NobHVlc3NlbCB2ZXJ3ZW5kZW4gVU5ELUxvZ2lrLiBMZWVyZXIgSGFzaCA9IEJlbmFjaHJpY2h0aWd1bmcgZnVlciBhbGxlIEFzc2V0cy4nLAoKICAgICAgICAjIFJlY2hlY2sKICAgICAgICAnSWYgZW5hYmxlZCwgYXNzZXRzIHdpdGggZXhwaXJlZCB3YXJyYW50aWVzIHdpbGwgYmUgcmVjaGVja2VkIHBlcmlvZGljYWxseSBpbiBjYXNlIHRoZSB3YXJyYW50eSB3YXMgZXh0ZW5kZWQuJwogICAgICAgICAgICA9PiAnV2VubiBha3RpdmllcnQsIHdlcmRlbiBBc3NldHMgbWl0IGFiZ2VsYXVmZW5lciBHYXJhbnRpZSBwZXJpb2Rpc2NoIGVybmV1dCBnZXBydWVmdCwgZmFsbHMgZGllIEdhcmFudGllIHZlcmxhZW5nZXJ0IHd1cmRlLicsCgogICAgICAgICdNaW5pbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gd2FycmFudHkgcmVjaGVja3MgZm9yIGFzc2V0cyB3aXRoIGFjdGl2ZSB3YXJyYW50eS4nCiAgICAgICAgICAgID0+ICdNaW5kZXN0YW56YWhsIFRhZ2Ugendpc2NoZW4gZXJuZXV0ZW4gR2FyYW50aWVwcnVlZnVuZ2VuIGZ1ZXIgQXNzZXRzIG1pdCBha3RpdmVyIEdhcmFudGllLicsCgogICAgICAgICdNaW5pbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gd2FycmFudHkgcmVjaGVja3MgZm9yIGFzc2V0cyB3aXRoIGV4cGlyZWQgd2FycmFudHkuIFNldCBoaWdoZXIgdG8gc2F2ZSBBUEkgY2FsbHMgaWYgZXh0ZW5zaW9ucyBhcmUgcmFyZSwgb3IgbG93ZXIgaWYgeW91IGZyZXF1ZW50bHkgZXh0ZW5kIHdhcnJhbnRpZXMuJwogICAgICAgICAgICA9PiAnTWluZGVzdGFuemFobCBUYWdlIHp3aXNjaGVuIGVybmV1dGVuIEdhcmFudGllcHJ1ZWZ1bmdlbiBmdWVyIEFzc2V0cyBtaXQgYWJnZWxhdWZlbmVyIEdhcmFudGllLiBIb2VoZXIgc2V0emVuIHVtIEFQSS1BdWZydWZlIHp1IHNwYXJlbiB3ZW5uIFZlcmxhZW5nZXJ1bmdlbiBzZWx0ZW4gc2luZCwgbmllZHJpZ2VyIHdlbm4gaGFldWZpZyB2ZXJsYWVuZ2VydCB3aXJkLicsCgogICAgICAgICMgQVBJIFJlcXVlc3QgU2V0dGluZ3MKICAgICAgICAnTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgZm9yIGZhaWxlZCBBUEkgcmVxdWVzdHMgKHJhdGUgbGltaXRpbmcsIHNlcnZlciBlcnJvcnMpLiBVc2VzIGV4cG9uZW50aWFsIGJhY2tvZmY6IDJzLCA0cywgOHMsIGV0Yy4nCiAgICAgICAgICAgID0+ICdNYXhpbWFsZSBBbnphaGwgV2llZGVyaG9sdW5nc3ZlcnN1Y2hlIGJlaSBmZWhsZ2VzY2hsYWdlbmVuIEFQSS1BbmZyYWdlbiAoUmF0ZSBMaW1pdGluZywgU2VydmVyZmVobGVyKS4gVmVyd2VuZGV0IGV4cG9uZW50aWVsbGVzIEJhY2tvZmY6IDJzLCA0cywgOHMsIHVzdy4nLAoKICAgICAgICAjIFRlc3QgTW9kZQogICAgICAgICdJZiBlbmFibGVkLCB1c2VzIHRlc3QgZGF0YSBpbnN0ZWFkIG9mIHF1ZXJ5aW5nIHRoZSBDTURCLiBGb3IgZGV2ZWxvcG1lbnQgb25seS4nCiAgICAgICAgICAgID0+ICdXZW5uIGFrdGl2aWVydCwgd2VyZGVuIFRlc3RkYXRlbiBzdGF0dCBkZXIgQ01EQiB2ZXJ3ZW5kZXQuIE51ciBmdWVyIGRpZSBFbnR3aWNrbHVuZy4nLAoKICAgICAgICAjIERlbGwKICAgICAgICAnRW5hYmxlcyB0aGUgRGVsbCBUZWNoRGlyZWN0IHdhcnJhbnR5IEFQSSBwcm92aWRlci4nCiAgICAgICAgICAgID0+ICdBa3RpdmllcnQgZGVuIERlbGwgVGVjaERpcmVjdCBHYXJhbnRpZS1BUEktUHJvdmlkZXIuJywKCiAgICAgICAgJ0RlbGwgVGVjaERpcmVjdCBBUEkgQ2xpZW50IElELiBPYnRhaW4gZnJvbSB0ZWNoZGlyZWN0LmRlbGwuY29tLicKICAgICAgICAgICAgPT4gJ0RlbGwgVGVjaERpcmVjdCBBUEkgQ2xpZW50IElELiBFcmhhbHRlbiBTaWUgZGllc2UgdW50ZXIgdGVjaGRpcmVjdC5kZWxsLmNvbS4nLAoKICAgICAgICAnRGVsbCBUZWNoRGlyZWN0IEFQSSBDbGllbnQgU2VjcmV0LiBPYnRhaW4gZnJvbSB0ZWNoZGlyZWN0LmRlbGwuY29tLicKICAgICAgICAgICAgPT4gJ0RlbGwgVGVjaERpcmVjdCBBUEkgQ2xpZW50IFNlY3JldC4gRXJoYWx0ZW4gU2llIGRpZXNlcyB1bnRlciB0ZWNoZGlyZWN0LmRlbGwuY29tLicsCgogICAgICAgICMgTGVub3ZvCiAgICAgICAgJ0VuYWJsZXMgdGhlIExlbm92byB3YXJyYW50eSBwcm92aWRlci4gVXNlcyB0aGUgcHVibGljIExlbm92byBQQyBTdXBwb3J0IEFQSSAtIG5vIEFQSSBrZXkgcmVxdWlyZWQuJwogICAgICAgICAgICA9PiAnQWt0aXZpZXJ0IGRlbiBMZW5vdm8gR2FyYW50aWUtUHJvdmlkZXIuIFZlcndlbmRldCBkaWUgb2VmZmVudGxpY2hlIExlbm92byBQQyBTdXBwb3J0IEFQSSAtIGtlaW4gQVBJLVNjaGx1ZXNzZWwgZXJmb3JkZXJsaWNoLicsCgogICAgICAgICMgV2FycmFudHkgc3RhdHVzIHZhbHVlcwogICAgICAgICdBY3RpdmUnICA9PiAnQWt0aXYnLAogICAgICAgICdFeHBpcmVkJyA9PiAnQWJnZWxhdWZlbicsCiAgICAgICAgJ1Vua25vd24nID0+ICdVbmJla2FubnQnLAogICAgfTsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>

        <!-- Unit Tests -->
        <File Permission="660" Location="scripts/test/WarrantySync/Core.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAxOiBfR3JvdXBCeVByb3ZpZGVyCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnJlcXVpcmUgS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzsKbXkgJFN5bmNPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jLT5uZXcoKTsKCm15IEBUZXN0QXNzZXRzID0gKAogICAgeyBDb25maWdJdGVtSUQgPT4gMSwgVmVuZG9yID0+ICdEZWxsJywgICBTZXJpYWxOdW1iZXIgPT4gJ0RMMDAxJywgUHJvdmlkZXIgPT4gJ0RlbGwnLCAgIE5hbWUgPT4gJ0xhcHRvcDEnIH0sCiAgICB7IENvbmZpZ0l0ZW1JRCA9PiAyLCBWZW5kb3IgPT4gJ0RlbGwnLCAgIFNlcmlhbE51bWJlciA9PiAnREwwMDInLCBQcm92aWRlciA9PiAnRGVsbCcsICAgTmFtZSA9PiAnTGFwdG9wMicgfSwKICAgIHsgQ29uZmlnSXRlbUlEID0+IDMsIFZlbmRvciA9PiAnTGVub3ZvJywgU2VyaWFsTnVtYmVyID0+ICdMTjAwMScsIFByb3ZpZGVyID0+ICdMZW5vdm8nLCBOYW1lID0+ICdMYXB0b3AzJyB9LAopOwoKbXkgJUdyb3VwZWQgPSAkU3luY09iamVjdC0+X0dyb3VwQnlQcm92aWRlcihAVGVzdEFzc2V0cyk7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIga2V5cyAlR3JvdXBlZCwKICAgIDIsCiAgICAnR3JvdXBCeVByb3ZpZGVyOiAyIGdyb3VwcyAoRGVsbCwgTGVub3ZvKScsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQHsgJEdyb3VwZWR7RGVsbH0gfSwKICAgIDIsCiAgICAnR3JvdXBCeVByb3ZpZGVyOiBEZWxsIGdyb3VwIGhhcyAyIGFzc2V0cycsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQHsgJEdyb3VwZWR7TGVub3ZvfSB9LAogICAgMSwKICAgICdHcm91cEJ5UHJvdmlkZXI6IExlbm92byBncm91cCBoYXMgMSBhc3NldCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAyOiBXYXJyYW50eSBzdGF0dXMgY2FsY3VsYXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBUaGUgc3RhdHVzIGNhbGN1bGF0aW9uIGhhcHBlbnMgaW4gX1VwZGF0ZUFzc2V0V2FycmFudHkgYW5kIF9SZWNhbGN1bGF0ZVdhcnJhbnR5U3RhdHVzCiMgV2UgdGVzdCB0aGUgbG9naWMgZGlyZWN0bHk6IFdhcnJhbnR5RW5kIHZzIHRvZGF5ID0+IEFjdGl2ZSBvciBFeHBpcmVkCgpteSAkTm93ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7Cm15ICRUb2RheVN0ciA9ICROb3ctPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCcgKTsKCiMgRnV0dXJlIGRhdGUgPSBBY3RpdmUKbXkgJEZ1dHVyZURhdGUgPSAnMjA5OS0xMi0zMSc7Cm15ICRTdGF0dXNGdXR1cmUgPSAoICRGdXR1cmVEYXRlIGdlICRUb2RheVN0ciApID8gJ0FjdGl2ZScgOiAnRXhwaXJlZCc7CiRTZWxmLT5JcygKICAgICRTdGF0dXNGdXR1cmUsCiAgICAnQWN0aXZlJywKICAgICdTdGF0dXMgY2FsY3VsYXRpb246IEZ1dHVyZSB3YXJyYW50eSBlbmQgZGF0ZSA9IEFjdGl2ZScsCik7CgojIFBhc3QgZGF0ZSA9IEV4cGlyZWQKbXkgJFBhc3REYXRlID0gJzIwMjAtMDEtMDEnOwpteSAkU3RhdHVzUGFzdCA9ICggJFBhc3REYXRlIGdlICRUb2RheVN0ciApID8gJ0FjdGl2ZScgOiAnRXhwaXJlZCc7CiRTZWxmLT5JcygKICAgICRTdGF0dXNQYXN0LAogICAgJ0V4cGlyZWQnLAogICAgJ1N0YXR1cyBjYWxjdWxhdGlvbjogUGFzdCB3YXJyYW50eSBlbmQgZGF0ZSA9IEV4cGlyZWQnLAopOwoKIyBUb2RheSA9IEFjdGl2ZSAoc3RpbGwgaW4gd2FycmFudHkgb24gdGhlIGxhc3QgZGF5KQpteSAkU3RhdHVzVG9kYXkgPSAoICRUb2RheVN0ciBnZSAkVG9kYXlTdHIgKSA/ICdBY3RpdmUnIDogJ0V4cGlyZWQnOwokU2VsZi0+SXMoCiAgICAkU3RhdHVzVG9kYXksCiAgICAnQWN0aXZlJywKICAgICdTdGF0dXMgY2FsY3VsYXRpb246IFRvZGF5ID0gc3RpbGwgQWN0aXZlJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDM6IEZpZWxkIG1hcHBpbmcgY29uZmlndXJhdGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6Ok91dHB1dDo6RmllbGRNYXBwaW5nJywKICAgIFZhbHVlID0+IHsKICAgICAgICBXYXJyYW50eUVuZCAgICA9PiAnV2FycmFudHlFeHBpcmF0aW9uRGF0ZScsCiAgICAgICAgV2FycmFudHlTdGFydCAgPT4gJ1dhcnJhbnR5U3RhcnREYXRlJywKICAgICAgICBXYXJyYW50eVR5cGUgICA9PiAnV2FycmFudHlUeXBlJywKICAgICAgICBXYXJyYW50eVN0YXR1cyA9PiAnV2FycmFudHlTdGF0dXMnLAogICAgICAgIFByb2R1Y3ROYW1lICAgID0+ICdWZW5kb3JQcm9kdWN0TmFtZScsCiAgICAgICAgU2hpcERhdGUgICAgICAgPT4gJ1NoaXBEYXRlJywKICAgICAgICBTaGlwQ291bnRyeSAgICA9PiAnU2hpcFRvQ291bnRyeScsCiAgICB9LAopOwoKbXkgJEZpZWxkTWFwcGluZyA9ICRDb25maWdPYmplY3QtPkdldCgnV2FycmFudHlTeW5jOjpPdXRwdXQ6OkZpZWxkTWFwcGluZycpOwoKJFNlbGYtPlRydWUoCiAgICBJc0hhc2hSZWZXaXRoRGF0YSgkRmllbGRNYXBwaW5nKSwKICAgICdGaWVsZE1hcHBpbmc6IElzIGEgbm9uLWVtcHR5IGhhc2hyZWYnLAopOwoKJFNlbGYtPklzKAogICAgJEZpZWxkTWFwcGluZy0+e1dhcnJhbnR5RW5kfSwKICAgICdXYXJyYW50eUV4cGlyYXRpb25EYXRlJywKICAgICdGaWVsZE1hcHBpbmc6IFdhcnJhbnR5RW5kIG1hcHMgdG8gV2FycmFudHlFeHBpcmF0aW9uRGF0ZScsCik7CgokU2VsZi0+SXMoCiAgICAkRmllbGRNYXBwaW5nLT57U2hpcENvdW50cnl9LAogICAgJ1NoaXBUb0NvdW50cnknLAogICAgJ0ZpZWxkTWFwcGluZzogU2hpcENvdW50cnkgbWFwcyB0byBTaGlwVG9Db3VudHJ5JywKKTsKCiMgRW1wdHkgbWFwcGluZyBzaG91bGQgc2tpcCB0aGUgZmllbGQKJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpPdXRwdXQ6OkZpZWxkTWFwcGluZycsCiAgICBWYWx1ZSA9PiB7CiAgICAgICAgV2FycmFudHlFbmQgICAgPT4gJ1dhcnJhbnR5RXhwaXJhdGlvbkRhdGUnLAogICAgICAgIFdhcnJhbnR5U3RhcnQgID0+ICcnLAogICAgICAgIFdhcnJhbnR5VHlwZSAgID0+ICcnLAogICAgICAgIFdhcnJhbnR5U3RhdHVzID0+ICcnLAogICAgICAgIFByb2R1Y3ROYW1lICAgID0+ICcnLAogICAgICAgIFNoaXBEYXRlICAgICAgID0+ICcnLAogICAgICAgIFNoaXBDb3VudHJ5ICAgID0+ICcnLAogICAgfSwKKTsKCiRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCggT2JqZWN0cyA9PiBbJ0tlcm5lbDo6Q29uZmlnJ10gKTsKJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiRGaWVsZE1hcHBpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6T3V0cHV0OjpGaWVsZE1hcHBpbmcnKTsKCm15IEBNYXBwZWRGaWVsZHMgPSBncmVwIHsgJEZpZWxkTWFwcGluZy0+eyRffSB9IGtleXMgJXskRmllbGRNYXBwaW5nfTsKJFNlbGYtPklzKAogICAgc2NhbGFyIEBNYXBwZWRGaWVsZHMsCiAgICAxLAogICAgJ0ZpZWxkTWFwcGluZzogT25seSAxIGZpZWxkIG1hcHBlZCB3aGVuIG90aGVycyBhcmUgZW1wdHknLAopOwoKJFNlbGYtPklzKAogICAgJE1hcHBlZEZpZWxkc1swXSwKICAgICdXYXJyYW50eUVuZCcsCiAgICAnRmllbGRNYXBwaW5nOiBPbmx5IFdhcnJhbnR5RW5kIGlzIG1hcHBlZCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCA0OiBWZW5kb3IgbWFwcGluZwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OlZlbmRvck1hcHBpbmcnLAogICAgVmFsdWUgPT4gewogICAgICAgICdEZWxsJyAgICAgID0+ICdEZWxsJywKICAgICAgICAnRGVsbCBJbmMuJyA9PiAnRGVsbCcsCiAgICAgICAgJ0xlbm92bycgICAgPT4gJ0xlbm92bycsCiAgICAgICAgJ0xFTk9WTycgICAgPT4gJ0xlbm92bycsCiAgICB9LAopOwoKJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSApOwokQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJFZlbmRvck1hcHBpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6VmVuZG9yTWFwcGluZycpOwoKJFNlbGYtPklzKAogICAgJFZlbmRvck1hcHBpbmctPnsnRGVsbCd9LAogICAgJ0RlbGwnLAogICAgJ1ZlbmRvck1hcHBpbmc6IERlbGwgbWFwcyB0byBEZWxsIHByb3ZpZGVyJywKKTsKCiRTZWxmLT5JcygKICAgICRWZW5kb3JNYXBwaW5nLT57J0RlbGwgSW5jLid9LAogICAgJ0RlbGwnLAogICAgJ1ZlbmRvck1hcHBpbmc6IERlbGwgSW5jLiBtYXBzIHRvIERlbGwgcHJvdmlkZXInLAopOwoKJFNlbGYtPklzKAogICAgJFZlbmRvck1hcHBpbmctPnsnTGVub3ZvJ30sCiAgICAnTGVub3ZvJywKICAgICdWZW5kb3JNYXBwaW5nOiBMZW5vdm8gbWFwcyB0byBMZW5vdm8gcHJvdmlkZXInLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJFZlbmRvck1hcHBpbmctPnsnSFAnfSwKICAgICdWZW5kb3JNYXBwaW5nOiBIUCBoYXMgbm8gbWFwcGluZyAocmVtb3ZlZCknLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgNTogUmVjaGVjayBpbnRlcnZhbCBsb2dpYwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OlJlY2hlY2tJbnRlcnZhbCcsCiAgICBWYWx1ZSA9PiAnMzAnLAopOwoKJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpSZWNoZWNrSW50ZXJ2YWxFeHBpcmVkJywKICAgIFZhbHVlID0+ICc5MCcsCik7CgokS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddICk7CiRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKJFNlbGYtPklzKAogICAgJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OlJlY2hlY2tJbnRlcnZhbCcpLAogICAgJzMwJywKICAgICdSZWNoZWNrSW50ZXJ2YWw6IEFjdGl2ZSB3YXJyYW50aWVzIHJlY2hlY2sgYWZ0ZXIgMzAgZGF5cycsCik7CgokU2VsZi0+SXMoCiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1dhcnJhbnR5U3luYzo6UmVjaGVja0ludGVydmFsRXhwaXJlZCcpLAogICAgJzkwJywKICAgICdSZWNoZWNrSW50ZXJ2YWxFeHBpcmVkOiBFeHBpcmVkIHdhcnJhbnRpZXMgcmVjaGVjayBhZnRlciA5MCBkYXlzJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDY6IEZlYXR1cmUgdG9nZ2xlCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6RW5hYmxlZCcsCiAgICBWYWx1ZSA9PiAwLAopOwoKJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSApOwoKbXkgJFN5bmNPYmplY3QyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYy0+bmV3KCk7Cm15ICRSdW5SZXN1bHQgPSAkU3luY09iamVjdDItPlJ1bigpOwoKJFNlbGYtPlRydWUoCiAgICAkUnVuUmVzdWx0LAogICAgJ1J1bjogUmV0dXJucyB0cnV0aHkgdmFsdWUgd2hlbiBmZWF0dXJlIGlzIGRpc2FibGVkIChuby1vcCknLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgNzogX0dldExhc3RDaGVjayAvIF9TZXRMYXN0Q2hlY2sgKERCIHRhYmxlKQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCm15ICRTeW5jT2JqZWN0MyA9IEtlcm5lbDo6U3lzdGVtOjpXYXJyYW50eVN5bmMtPm5ldygpOwoKIyBDcmVhdGUgYSByZWFsIENvbmZpZ0l0ZW0gdG8gc2F0aXNmeSBGSyBjb25zdHJhaW50Cm15ICRDb25maWdJdGVtTG9hZGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLCBTaWxlbnQgPT4gMSwKKTsKClNLSVA6IHsKICAgIGlmICggISRDb25maWdJdGVtTG9hZGVkICkgewogICAgICAgICRTZWxmLT5UcnVlKCAxLCAnREIgTGFzdENoZWNrOiBTa2lwcGVkIChJVFNNIG5vdCBpbnN0YWxsZWQpJyApOwogICAgICAgIGxhc3QgU0tJUDsKICAgIH0KCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KCBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnICk7CiAgICBteSAlQ1IgPSByZXZlcnNlICV7ICRDbGFzc0xpc3QgfHwge30gfTsKICAgIG15ICRDbGFzc0lEID0gJENSe0NvbXB1dGVyfTsKCiAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAkU2VsZi0+VHJ1ZSggMSwgJ0RCIExhc3RDaGVjazogU2tpcHBlZCAobm8gQ29tcHV0ZXIgY2xhc3MpJyApOwogICAgICAgIGxhc3QgU0tJUDsKICAgIH0KCiAgICBteSAkVGVzdENJSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFRlc3RDSUlELAogICAgICAgICJEQiBMYXN0Q2hlY2s6IENyZWF0ZWQgdGVzdCBDb25maWdJdGVtIyRUZXN0Q0lJRCIsCiAgICApOwoKICAgICMgVGVzdCBfR2V0TGFzdENoZWNrIG9uIG5ldyBlbnRyeSAobm90IHlldCBjaGVja2VkKQogICAgbXkgJE5vQ2hlY2sgPSAkU3luY09iamVjdDMtPl9HZXRMYXN0Q2hlY2soIENvbmZpZ0l0ZW1JRCA9PiAkVGVzdENJSUQgKTsKICAgICRTZWxmLT5JcygKICAgICAgICAkTm9DaGVjaywKICAgICAgICAnJywKICAgICAgICAnREIgTGFzdENoZWNrOiBSZXR1cm5zIGVtcHR5IHN0cmluZyBmb3IgdW5jaGVja2VkIENvbmZpZ0l0ZW0nLAogICAgKTsKCiAgICAjIFRlc3QgX1NldExhc3RDaGVjayAoSU5TRVJUKQogICAgbXkgJFNldFJlc3VsdCA9ICRTeW5jT2JqZWN0My0+X1NldExhc3RDaGVjayggQ29uZmlnSXRlbUlEID0+ICRUZXN0Q0lJRCApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNldFJlc3VsdCwKICAgICAgICAnREIgTGFzdENoZWNrOiBfU2V0TGFzdENoZWNrIElOU0VSVCBzdWNjZWVkcycsCiAgICApOwoKICAgIG15ICRGaXJzdENoZWNrID0gJFN5bmNPYmplY3QzLT5fR2V0TGFzdENoZWNrKCBDb25maWdJdGVtSUQgPT4gJFRlc3RDSUlEICk7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRmlyc3RDaGVjayA9fiAvXlxkezR9LVxkezJ9LVxkezJ9JC8sCiAgICAgICAgIkRCIExhc3RDaGVjazogX0dldExhc3RDaGVjayByZXR1cm5zIGRhdGUgYWZ0ZXIgSU5TRVJUICgkRmlyc3RDaGVjaykiLAogICAgKTsKCiAgICAjIFRlc3QgX1NldExhc3RDaGVjayAoVVBEQVRFKQogICAgbXkgJFVwZGF0ZVJlc3VsdCA9ICRTeW5jT2JqZWN0My0+X1NldExhc3RDaGVjayggQ29uZmlnSXRlbUlEID0+ICRUZXN0Q0lJRCApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFVwZGF0ZVJlc3VsdCwKICAgICAgICAnREIgTGFzdENoZWNrOiBfU2V0TGFzdENoZWNrIFVQREFURSBzdWNjZWVkcycsCiAgICApOwoKICAgIG15ICRTZWNvbmRDaGVjayA9ICRTeW5jT2JqZWN0My0+X0dldExhc3RDaGVjayggQ29uZmlnSXRlbUlEID0+ICRUZXN0Q0lJRCApOwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFNlY29uZENoZWNrID1+IC9eXGR7NH0tXGR7Mn0tXGR7Mn0kLywKICAgICAgICAiREIgTGFzdENoZWNrOiBfR2V0TGFzdENoZWNrIHJldHVybnMgZGF0ZSBhZnRlciBVUERBVEUgKCRTZWNvbmRDaGVjaykiLAogICAgKTsKCiAgICAjIENsZWFuIHVwIHRlc3QgZGF0YSBleHBsaWNpdGx5IChSZXN0b3JlRGF0YWJhc2UgY2Fubm90IHJvbGxiYWNrCiAgICAjIGFjcm9zcyBGSyBjb25zdHJhaW50cyB3aXRoIEF1dG9Db21taXQpCiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHdhcnJhbnR5X3N5bmNfc3RhdHVzIFdIRVJFIGNvbmZpZ19pdGVtX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkVGVzdENJSUQgXSwKICAgICk7CiAgICAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFRlc3RDSUlELAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgODogX0NyZWF0ZUV4cGlyeVRpY2tldHMgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpFbmFibGVkJywKICAgIFZhbHVlID0+IDAsCik7CgokS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddICk7CgpteSAkU3luY09iamVjdDQgPSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jLT5uZXcoKTsKbXkgJFRpY2tldHNXaGVuRGlzYWJsZWQgPSAkU3luY09iamVjdDQtPl9DcmVhdGVFeHBpcnlUaWNrZXRzKCk7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0c1doZW5EaXNhYmxlZCwKICAgIDAsCiAgICAnRXhwaXJ5Tm90aWZpY2F0aW9uOiBSZXR1cm5zIDAgd2hlbiBkaXNhYmxlZCcsCik7CgojIFRlc3Qgd2l0aCBlbmFibGVkIGJ1dCBubyBXYXJyYW50eUVuZCBmaWVsZCBtYXBwZWQKJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkVuYWJsZWQnLAogICAgVmFsdWUgPT4gMSwKKTsKJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpPdXRwdXQ6OkZpZWxkTWFwcGluZycsCiAgICBWYWx1ZSA9PiB7CiAgICAgICAgV2FycmFudHlFbmQgPT4gJycsCiAgICB9LAopOwoKJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSApOwoKbXkgJFN5bmNPYmplY3Q1ID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYy0+bmV3KCk7Cm15ICRUaWNrZXRzTm9NYXBwaW5nID0gJFN5bmNPYmplY3Q1LT5fQ3JlYXRlRXhwaXJ5VGlja2V0cygpOwoKJFNlbGYtPklzKAogICAgJFRpY2tldHNOb01hcHBpbmcsCiAgICAwLAogICAgJ0V4cGlyeU5vdGlmaWNhdGlvbjogUmV0dXJucyAwIHdoZW4gV2FycmFudHlFbmQgbm90IG1hcHBlZCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCA5OiBFeHBpcnlOb3RpZmljYXRpb24gU3lzQ29uZmlnIGRlZmF1bHRzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpEYXlzQmVmb3JlJywKICAgIFZhbHVlID0+ICc5MCcsCik7CgokS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddICk7CiRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKJFNlbGYtPklzKAogICAgJENvbmZpZ09iamVjdC0+R2V0KCdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6RGF5c0JlZm9yZScpLAogICAgJzkwJywKICAgICdFeHBpcnlOb3RpZmljYXRpb246IERheXNCZWZvcmUgZGVmYXVsdCBpcyA5MCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAxMDogRXhwaXJ5Tm90aWZpY2F0aW9uIC0gUG9zaXRpdmUgdGVzdCAodGlja2V0IGNyZWF0aW9uKQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpFWFBJUllfVEVTVDogewogICAgbXkgJENJTG9hZGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJywgU2lsZW50ID0+IDEsCiAgICApOwogICAgbXkgJFRpY2tldExvYWRlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLCBTaWxlbnQgPT4gMSwKICAgICk7CgogICAgaWYgKCAhJENJTG9hZGVkIHx8ICEkVGlja2V0TG9hZGVkICkgewogICAgICAgICRTZWxmLT5UcnVlKCAxLCAnRXhwaXJ5Tm90aWZpY2F0aW9uIHBvc2l0aXZlOiBTa2lwcGVkIChJVFNNIG9yIFRpY2tldCBub3QgYXZhaWxhYmxlKScgKTsKICAgICAgICBsYXN0IEVYUElSWV9URVNUOwogICAgfQoKICAgIG15ICRDSU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJEdDT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICBteSAkVE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkREJPYmogICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIEdldCBDb21wdXRlciBjbGFzcwogICAgbXkgJENsYXNzTGlzdCA9ICRHQ09iamVjdC0+SXRlbUxpc3QoIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycgKTsKICAgIG15ICVDUiA9IHJldmVyc2UgJXsgJENsYXNzTGlzdCB8fCB7fSB9OwogICAgbXkgJENsYXNzSUQgPSAkQ1J7Q29tcHV0ZXJ9OwogICAgaWYgKCAhJENsYXNzSUQgKSB7CiAgICAgICAgJFNlbGYtPlRydWUoIDEsICdFeHBpcnlOb3RpZmljYXRpb24gcG9zaXRpdmU6IFNraXBwZWQgKG5vIENvbXB1dGVyIGNsYXNzKScgKTsKICAgICAgICBsYXN0IEVYUElSWV9URVNUOwogICAgfQoKICAgICMgR2V0IGRlcGxveW1lbnQgKyBpbmNpZGVudCBzdGF0ZXMKICAgIG15ICREZXBsTGlzdCA9ICRHQ09iamVjdC0+SXRlbUxpc3QoIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnICk7CiAgICBteSAlRFIgPSByZXZlcnNlICV7ICREZXBsTGlzdCB8fCB7fSB9OwogICAgbXkgJERlcGxTdGF0ZUlEID0gJERSe1Byb2R1Y3Rpb259OwogICAgbXkgJEluY2lMaXN0ID0gJEdDT2JqZWN0LT5JdGVtTGlzdCggQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnICk7CiAgICBteSAlSVIgPSByZXZlcnNlICV7ICRJbmNpTGlzdCB8fCB7fSB9OwogICAgbXkgJEluY2lTdGF0ZUlEID0gJElSe09wZXJhdGlvbmFsfTsKCiAgICAjIEdldCBjdXJyZW50IGRlZmluaXRpb24KICAgIG15ICREZWYgPSAkQ0lPYmplY3QtPkRlZmluaXRpb25HZXQoIENsYXNzSUQgPT4gJENsYXNzSUQgKTsKICAgIGlmICggISREZWYgfHwgISREZWYtPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgICRTZWxmLT5UcnVlKCAxLCAnRXhwaXJ5Tm90aWZpY2F0aW9uIHBvc2l0aXZlOiBTa2lwcGVkIChubyBjbGFzcyBkZWZpbml0aW9uKScgKTsKICAgICAgICBsYXN0IEVYUElSWV9URVNUOwogICAgfQoKICAgICMgQ3JlYXRlIGEgQ29uZmlnSXRlbSB3aXRoIHdhcnJhbnR5IGV4cGlyaW5nIGluIDMwIGRheXMKICAgIG15ICRGdXR1cmVEVCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgJEZ1dHVyZURULT5BZGQoIERheXMgPT4gMzAgKTsKICAgIG15ICRGdXR1cmVFbmQgPSAkRnV0dXJlRFQtPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCcgKTsKCiAgICBteSAkVGVzdENJSUQgPSAkQ0lPYmplY3QtPkNvbmZpZ0l0ZW1BZGQoIENsYXNzSUQgPT4gJENsYXNzSUQsIFVzZXJJRCA9PiAxICk7CiAgICAkU2VsZi0+VHJ1ZSggJFRlc3RDSUlELCAiRXhwaXJ5Tm90aWZpY2F0aW9uOiBDcmVhdGVkIHRlc3QgQ0kjJFRlc3RDSUlEIiApOwoKICAgIG15ICRWSUQgPSAkQ0lPYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRUZXN0Q0lJRCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0V4cGlyeVRlc3QtU2VydmVyLTAwMScsCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWYtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlSUQsCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVJRCwKICAgICAgICBYTUxEYXRhICAgICAgPT4gWyB1bmRlZiwgeyBWZXJzaW9uID0+IFsgdW5kZWYsIHsKICAgICAgICAgICAgVmVuZG9yICAgICAgICAgICAgICAgICA9PiBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJ0RlbGwnIH0gXSwKICAgICAgICAgICAgU2VyaWFsTnVtYmVyICAgICAgICAgICA9PiBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJ0VYUFRFU1QxJyB9IF0sCiAgICAgICAgICAgIFdhcnJhbnR5RXhwaXJhdGlvbkRhdGUgPT4gWyB1bmRlZiwgeyBDb250ZW50ID0+ICRGdXR1cmVFbmQgfSBdLAogICAgICAgICAgICBXYXJyYW50eVR5cGUgICAgICAgICAgID0+IFsgdW5kZWYsIHsgQ29udGVudCA9PiAnUHJvU3VwcG9ydCBOQkQnIH0gXSwKICAgICAgICAgICAgVmVuZG9yUHJvZHVjdE5hbWUgICAgICA9PiBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJ0RlbGwgTEFUSVRVREUgNTU0MCcgfSBdLAogICAgICAgIH1dfV0sCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwogICAgJFNlbGYtPlRydWUoICRWSUQsICJFeHBpcnlOb3RpZmljYXRpb246IENyZWF0ZWQgdmVyc2lvbiBmb3IgQ0kjJFRlc3RDSUlEIiApOwoKICAgICMgQ29uZmlndXJlIEV4cGlyeU5vdGlmaWNhdGlvbgogICAgJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSggVmFsaWQgPT4gMSwgS2V5ID0+ICdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6RW5hYmxlZCcsIFZhbHVlID0+IDEgKTsKICAgICRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoIFZhbGlkID0+IDEsIEtleSA9PiAnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkRheXNCZWZvcmUnLCBWYWx1ZSA9PiAnOTAnICk7CiAgICAkSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKCBWYWxpZCA9PiAxLCBLZXkgPT4gJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpRdWV1ZScsIFZhbHVlID0+ICdSYXcnICk7CiAgICAkSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKCBWYWxpZCA9PiAxLCBLZXkgPT4gJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpQcmlvcml0eScsIFZhbHVlID0+ICczIG5vcm1hbCcgKTsKICAgICRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoIFZhbGlkID0+IDEsIEtleSA9PiAnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OlN0YXRlJywgVmFsdWUgPT4gJ25ldycgKTsKICAgICRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoIFZhbGlkID0+IDEsIEtleSA9PiAnV2FycmFudHlTeW5jOjpFeHBpcnlOb3RpZmljYXRpb246OkZpbHRlcicsIFZhbHVlID0+IHt9ICk7CiAgICAkSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpTdWJqZWN0VGVtcGxhdGUnLAogICAgICAgIFZhbHVlID0+ICdXYXJyYW50eSBleHBpcmluZzogPEFTU0VUX05BTUU+ICg8U0VSSUFMPikgLSA8V0FSUkFOVFlfRU5EPicsCiAgICApOwogICAgJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OkV4cGlyeU5vdGlmaWNhdGlvbjo6Qm9keVRlbXBsYXRlJywKICAgICAgICBWYWx1ZSA9PiAnQXNzZXQ6IDxBU1NFVF9OQU1FPlxuU2VyaWFsOiA8U0VSSUFMPlxuRW5kOiA8V0FSUkFOVFlfRU5EPicsCiAgICApOwogICAgJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6Ok91dHB1dDo6RmllbGRNYXBwaW5nJywKICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgIFdhcnJhbnR5RW5kICAgID0+ICdXYXJyYW50eUV4cGlyYXRpb25EYXRlJywKICAgICAgICAgICAgV2FycmFudHlTdGFydCAgPT4gJ1dhcnJhbnR5U3RhcnREYXRlJywKICAgICAgICAgICAgV2FycmFudHlUeXBlICAgPT4gJ1dhcnJhbnR5VHlwZScsCiAgICAgICAgICAgIFdhcnJhbnR5U3RhdHVzID0+ICdXYXJyYW50eVN0YXR1cycsCiAgICAgICAgICAgIFdhcnJhbnR5UHJvZHVjdCA9PiAnVmVuZG9yUHJvZHVjdE5hbWUnLAogICAgICAgICAgICBTaGlwRGF0ZSAgICAgICA9PiAnU2hpcERhdGUnLAogICAgICAgICAgICBTaGlwQ291bnRyeSAgICA9PiAnU2hpcFRvQ291bnRyeScsCiAgICAgICAgfSwKICAgICk7CiAgICAkSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6Q29uZmlnSXRlbTo6Q2xhc3NlcycsCiAgICAgICAgVmFsdWUgPT4gWydDb21wdXRlciddLAogICAgKTsKCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddICk7CgogICAgIyBSdW4gX0NyZWF0ZUV4cGlyeVRpY2tldHMKICAgIG15ICRTeW5jT2JqID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYy0+bmV3KCk7CiAgICBteSAkQ3JlYXRlZCA9ICRTeW5jT2JqLT5fQ3JlYXRlRXhwaXJ5VGlja2V0cygpOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDcmVhdGVkID49IDEsCiAgICAgICAgIkV4cGlyeU5vdGlmaWNhdGlvbjogQ3JlYXRlZCAkQ3JlYXRlZCB0aWNrZXQocykgZm9yIGV4cGlyaW5nIHdhcnJhbnR5IiwKICAgICk7CgogICAgIyBWZXJpZnkgdGlja2V0IGV4aXN0cyB3aXRoIGNvcnJlY3Qgc3ViamVjdAogICAgbXkgQFRpY2tldElEcyA9ICRUT2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgVGl0bGUgID0+ICdXYXJyYW50eSBleHBpcmluZzogRXhwaXJ5VGVzdC1TZXJ2ZXItMDAxKicsCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgIHNjYWxhciBAVGlja2V0SURzID49IDEsCiAgICAgICAgJ0V4cGlyeU5vdGlmaWNhdGlvbjogVGlja2V0IGZvdW5kIGJ5IHRpdGxlIHNlYXJjaCcsCiAgICApOwoKICAgICMgUnVuIGFnYWluIC0gc2hvdWxkIE5PVCBjcmVhdGUgZHVwbGljYXRlCiAgICBteSAkQ3JlYXRlZEFnYWluID0gJFN5bmNPYmotPl9DcmVhdGVFeHBpcnlUaWNrZXRzKCk7CiAgICBteSBAVGlja2V0SURzQWZ0ZXIgPSAkVE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgIFRpdGxlICA9PiAnV2FycmFudHkgZXhwaXJpbmc6IEV4cGlyeVRlc3QtU2VydmVyLTAwMSonLAogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgc2NhbGFyIEBUaWNrZXRJRHNBZnRlciwKICAgICAgICBzY2FsYXIgQFRpY2tldElEcywKICAgICAgICAnRXhwaXJ5Tm90aWZpY2F0aW9uOiBObyBkdXBsaWNhdGUgdGlja2V0IG9uIHNlY29uZCBydW4nLAogICAgKTsKCiAgICAjIFRlc3QgZmlsdGVyOiBzZXQgZmlsdGVyIHRoYXQgZXhjbHVkZXMgb3VyIGFzc2V0CiAgICAkSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6RXhwaXJ5Tm90aWZpY2F0aW9uOjpGaWx0ZXInLAogICAgICAgIFZhbHVlID0+IHsgVHlwZSA9PiAnU2VydmVyT25seScgfSwKICAgICk7CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddICk7CgogICAgIyBDcmVhdGUgYW5vdGhlciBDSSAod2l0aG91dCBtYXRjaGluZyBmaWx0ZXIpIHRvIHRlc3QgZmlsdGVyIGxvZ2ljCiAgICBteSAkVGVzdENJSUQyID0gJENJT2JqZWN0LT5Db25maWdJdGVtQWRkKCBDbGFzc0lEID0+ICRDbGFzc0lELCBVc2VySUQgPT4gMSApOwogICAgbXkgJFZJRDIgPSAkQ0lPYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRUZXN0Q0lJRDIsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdFeHBpcnlUZXN0LUZpbHRlcmVkLTAwMicsCiAgICAgICAgRGVmaW5pdGlvbklEID0+ICREZWYtPntEZWZpbml0aW9uSUR9LAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkRGVwbFN0YXRlSUQsCiAgICAgICAgSW5jaVN0YXRlSUQgID0+ICRJbmNpU3RhdGVJRCwKICAgICAgICBYTUxEYXRhICAgICAgPT4gWyB1bmRlZiwgeyBWZXJzaW9uID0+IFsgdW5kZWYsIHsKICAgICAgICAgICAgVmVuZG9yICAgICAgICAgICAgICAgICA9PiBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJ0xlbm92bycgfSBdLAogICAgICAgICAgICBTZXJpYWxOdW1iZXIgICAgICAgICAgID0+IFsgdW5kZWYsIHsgQ29udGVudCA9PiAnRVhQVEVTVDInIH0gXSwKICAgICAgICAgICAgV2FycmFudHlFeHBpcmF0aW9uRGF0ZSA9PiBbIHVuZGVmLCB7IENvbnRlbnQgPT4gJEZ1dHVyZUVuZCB9IF0sCiAgICAgICAgfV19XSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgJFN5bmNPYmoyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYy0+bmV3KCk7CiAgICBteSAkRmlsdGVyZWRDcmVhdGVkID0gJFN5bmNPYmoyLT5fQ3JlYXRlRXhwaXJ5VGlja2V0cygpOwoKICAgICMgVGhlIG5ldyBDSSBoYXMgbm8gVHlwZSBhdHRyaWJ1dGUgc2V0LCBzbyBpdCB3b24ndCBtYXRjaCAiU2VydmVyT25seSIKICAgIG15IEBGaWx0ZXJlZFRpY2tldHMgPSAkVE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgIFRpdGxlICA9PiAnV2FycmFudHkgZXhwaXJpbmc6IEV4cGlyeVRlc3QtRmlsdGVyZWQtMDAyKicsCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICBzY2FsYXIgQEZpbHRlcmVkVGlja2V0cywKICAgICAgICAwLAogICAgICAgICdFeHBpcnlOb3RpZmljYXRpb246IEZpbHRlciBwcmV2ZW50ZWQgdGlja2V0IGZvciBub24tbWF0Y2hpbmcgYXNzZXQnLAogICAgKTsKCiAgICAjIENsZWFudXAKICAgICREQk9iai0+RG8oIFNRTCA9PiAnREVMRVRFIEZST00gd2FycmFudHlfc3luY19zdGF0dXMgV0hFUkUgY29uZmlnX2l0ZW1faWQgSU4gKD8sID8pJywgQmluZCA9PiBbIFwkVGVzdENJSUQsIFwkVGVzdENJSUQyIF0gKTsKICAgIGZvciBteSAkVElEICggQFRpY2tldElEcywgQFRpY2tldElEc0FmdGVyICkgewogICAgICAgICRUT2JqZWN0LT5UaWNrZXREZWxldGUoIFRpY2tldElEID0+ICRUSUQsIFVzZXJJRCA9PiAxICk7CiAgICB9CiAgICAkQ0lPYmplY3QtPkNvbmZpZ0l0ZW1EZWxldGUoIENvbmZpZ0l0ZW1JRCA9PiAkVGVzdENJSUQsIFVzZXJJRCA9PiAxICk7CiAgICAkQ0lPYmplY3QtPkNvbmZpZ0l0ZW1EZWxldGUoIENvbmZpZ0l0ZW1JRCA9PiAkVGVzdENJSUQyLCBVc2VySUQgPT4gMSApOwp9CgoxOwo=</File>
        <File Permission="660" Location="scripts/test/WarrantySync/Dell.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRKU09OT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENvbmZpZ3VyZSBEZWxsIHByb3ZpZGVyIGZvciB0ZXN0aW5nCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpQcm92aWRlcjo6RGVsbDo6Q2xpZW50SUQnLAogICAgVmFsdWUgPT4gJ3Rlc3QtY2xpZW50LWlkJywKKTsKJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpQcm92aWRlcjo6RGVsbDo6Q2xpZW50U2VjcmV0JywKICAgIFZhbHVlID0+ICd0ZXN0LWNsaWVudC1zZWNyZXQnLAopOwokSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OkFQSTo6TWF4UmV0cmllcycsCiAgICAjIE11c3QgYmUgPjEgc28gdGhlICJBdHRlbXB0Q291bnQgPiAxIiByZXRyeSBhc3NlcnRpb24gYmVsb3cgKFRlc3QgNSkKICAgICMgaXMgYWN0dWFsbHkgcmVhY2hhYmxlIC0gdGhlIHByb3ZpZGVyJ3MgcmV0cnkgbG9vcCBpcyBib3VuZGVkIGJ5CiAgICAjIGB3aGlsZSAoJEF0dGVtcHQgPCAkTWF4UmV0cmllcylgLCBzbyBNYXhSZXRyaWVzPTEgbWFrZXMgaXQKICAgICMgaW1wb3NzaWJsZSB0byBldmVyIHNlZSBhIHNlY29uZCBhdHRlbXB0LCByZWdhcmRsZXNzIG9mIHRoZSBtb2NrLgogICAgVmFsdWUgPT4gJzInLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJ1aWxkIG1vY2sgcmVzcG9uc2UgZGF0YSBzdHJ1Y3R1cmVzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbXkgJE9BdXRoSlNPTiA9ICRKU09OT2JqZWN0LT5FbmNvZGUoCiAgICBEYXRhID0+IHsKICAgICAgICBhY2Nlc3NfdG9rZW4gPT4gJ21vY2stdG9rZW4tMTIzNDUnLAogICAgICAgIHRva2VuX3R5cGUgICA9PiAnQmVhcmVyJywKICAgICAgICBleHBpcmVzX2luICAgPT4gMzYwMCwKICAgIH0sCik7CgpteSAkV2FycmFudHlKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgIERhdGEgPT4gWwogICAgICAgIHsKICAgICAgICAgICAgc2VydmljZVRhZyAgICAgICAgICAgICA9PiAnVEVTVERMMScsCiAgICAgICAgICAgIHNoaXBEYXRlICAgICAgICAgICAgICAgPT4gJzIwMjMtMDYtMTVUMDA6MDA6MDBaJywKICAgICAgICAgICAgY291bnRyeUNvZGUgICAgICAgICAgICA9PiAnREUnLAogICAgICAgICAgICBwcm9kdWN0TGluZURlc2NyaXB0aW9uID0+ICdMQVRJVFVERSA1NTQwJywKICAgICAgICAgICAgc3lzdGVtRGVzY3JpcHRpb24gICAgICA9PiAnTGF0aXR1ZGUgNTU0MCcsCiAgICAgICAgICAgIGVudGl0bGVtZW50cyAgICAgICAgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSAgICAgICAgICAgICAgPT4gJzIwMjMtMDYtMTVUMDA6MDA6MDBaJywKICAgICAgICAgICAgICAgICAgICBlbmREYXRlICAgICAgICAgICAgICAgID0+ICcyMDI0LTA2LTE1VDIzOjU5OjU5WicsCiAgICAgICAgICAgICAgICAgICAgZW50aXRsZW1lbnRUeXBlICAgICAgICA9PiAnSU5JVElBTCcsCiAgICAgICAgICAgICAgICAgICAgc2VydmljZUxldmVsRGVzY3JpcHRpb24gPT4gJ0Jhc2ljIFN1cHBvcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUgICAgICAgICAgICAgID0+ICcyMDIzLTA2LTE1VDAwOjAwOjAwWicsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSAgICAgICAgICAgICAgICA9PiAnMjAyNy0wNi0xNVQyMzo1OTo1OVonLAogICAgICAgICAgICAgICAgICAgIGVudGl0bGVtZW50VHlwZSAgICAgICAgPT4gJ0VYVEVOREVEJywKICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTGV2ZWxEZXNjcmlwdGlvbiA9PiAnUHJvU3VwcG9ydCBOZXh0IEJ1c2luZXNzIERheScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBzZXJ2aWNlVGFnICAgICAgICAgICAgID0+ICdURVNUREwyJywKICAgICAgICAgICAgc2hpcERhdGUgICAgICAgICAgICAgICA9PiAnMjAyNC0wMS0xMFQwMDowMDowMFonLAogICAgICAgICAgICBjb3VudHJ5Q29kZSAgICAgICAgICAgID0+ICdVUycsCiAgICAgICAgICAgIHByb2R1Y3RMaW5lRGVzY3JpcHRpb24gPT4gJ1BSRUNJU0lPTiA3NjgwJywKICAgICAgICAgICAgZW50aXRsZW1lbnRzICAgICAgICAgICA9PiBbXSwKICAgICAgICB9LAogICAgXSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2NrIFdlYlVzZXJBZ2VudCB2aWEgZGlyZWN0IG92ZXJyaWRlCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbXkgJENhbGxDb3VudCA9IDA7CgpubyB3YXJuaW5ncyAncmVkZWZpbmUnOyAgICAjIyBubyBjcml0aWMKbXkgJE9yaWdSZXF1ZXN0ID0gXCZLZXJuZWw6OlN5c3RlbTo6V2ViVXNlckFnZW50OjpSZXF1ZXN0Owpsb2NhbCAqS2VybmVsOjpTeXN0ZW06OldlYlVzZXJBZ2VudDo6UmVxdWVzdCA9IHN1YiB7CiAgICBteSAoICRJblNlbGYsICVQYXJhbSApID0gQF87CiAgICAkQ2FsbENvdW50Kys7CiAgICBpZiAoICRDYWxsQ291bnQgPT0gMSApIHsKICAgICAgICByZXR1cm4gKCBDb250ZW50ID0+IFwkT0F1dGhKU09OLCBTdGF0dXMgPT4gJzIwMCBPSycgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAoIENvbnRlbnQgPT4gXCRXYXJyYW50eUpTT04sIFN0YXR1cyA9PiAnMjAwIE9LJyApOwogICAgfQp9Owp1c2Ugd2FybmluZ3MgJ3JlZGVmaW5lJzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUZXN0IDE6IFJlc3BvbnNlIHBhcnNpbmcgLSBtdWx0aXBsZSBlbnRpdGxlbWVudHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpyZXF1aXJlIEtlcm5lbDo6U3lzdGVtOjpXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsOwpteSAkRGVsbFByb3ZpZGVyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6OkRlbGwtPm5ldygpOwoKJENhbGxDb3VudCA9IDA7Cm15ICRSZXN1bHRzID0gJERlbGxQcm92aWRlci0+R2V0V2FycmFudHlJbmZvKAogICAgU2VyaWFsTnVtYmVycyA9PiBbICdURVNUREwxJywgJ1RFU1RETDInIF0sCik7CgokU2VsZi0+VHJ1ZSgKICAgICRSZXN1bHRzLAogICAgJ0RlbGw6IEdldFdhcnJhbnR5SW5mbyByZXR1cm5lZCByZXN1bHRzJywKKTsKCiRTZWxmLT5JcygKICAgIHJlZiAkUmVzdWx0cywKICAgICdIQVNIJywKICAgICdEZWxsOiBSZXN1bHQgaXMgYSBoYXNocmVmJywKKTsKCiMgQ2hlY2sgVEVTVERMMSAtIHNob3VsZCBwaWNrIGxhdGVzdCBlbmQgZGF0ZSAoMjAyNykgYW5kIGl0cyBzZXJ2aWNlIGxldmVsCiRTZWxmLT5JcygKICAgICRSZXN1bHRzLT57VEVTVERMMX17V2FycmFudHlFbmR9LAogICAgJzIwMjctMDYtMTUnLAogICAgJ0RlbGw6IFRFU1RETDEgV2FycmFudHlFbmQgaXMgbGF0ZXN0IGVudGl0bGVtZW50IGVuZCBkYXRlJywKKTsKCiRTZWxmLT5JcygKICAgICRSZXN1bHRzLT57VEVTVERMMX17V2FycmFudHlTdGFydH0sCiAgICAnMjAyMy0wNi0xNScsCiAgICAnRGVsbDogVEVTVERMMSBXYXJyYW50eVN0YXJ0IGlzIGVhcmxpZXN0IHN0YXJ0IGRhdGUnLAopOwoKJFNlbGYtPklzKAogICAgJFJlc3VsdHMtPntURVNUREwxfXtXYXJyYW50eVR5cGV9LAogICAgJ1Byb1N1cHBvcnQgTmV4dCBCdXNpbmVzcyBEYXknLAogICAgJ0RlbGw6IFRFU1RETDEgV2FycmFudHlUeXBlIGlzIGZyb20gbGF0ZXN0IGVudGl0bGVtZW50JywKKTsKCiRTZWxmLT5JcygKICAgICRSZXN1bHRzLT57VEVTVERMMX17UHJvZHVjdE5hbWV9LAogICAgJ0RlbGwgTEFUSVRVREUgNTU0MCcsCiAgICAnRGVsbDogVEVTVERMMSBQcm9kdWN0TmFtZSBoYXMgRGVsbCBwcmVmaXgnLAopOwoKJFNlbGYtPklzKAogICAgJFJlc3VsdHMtPntURVNUREwxfXtTaGlwRGF0ZX0sCiAgICAnMjAyMy0wNi0xNScsCiAgICAnRGVsbDogVEVTVERMMSBTaGlwRGF0ZSBwYXJzZWQgZnJvbSBJU08gODYwMScsCik7CgokU2VsZi0+SXMoCiAgICAkUmVzdWx0cy0+e1RFU1RETDF9e1NoaXBDb3VudHJ5fSwKICAgICdERScsCiAgICAnRGVsbDogVEVTVERMMSBTaGlwQ291bnRyeSBpcyBERScsCik7CgojIENoZWNrIFRFU1RETDIgLSBubyBlbnRpdGxlbWVudHMsIHNob3VsZCB1c2Ugc2hpcERhdGUgYXMgZmFsbGJhY2sKJFNlbGYtPklzKAogICAgJFJlc3VsdHMtPntURVNUREwyfXtXYXJyYW50eUVuZH0sCiAgICAnJywKICAgICdEZWxsOiBURVNUREwyIFdhcnJhbnR5RW5kIGlzIGVtcHR5IChubyBlbnRpdGxlbWVudHMpJywKKTsKCiRTZWxmLT5JcygKICAgICRSZXN1bHRzLT57VEVTVERMMn17V2FycmFudHlTdGFydH0sCiAgICAnMjAyNC0wMS0xMCcsCiAgICAnRGVsbDogVEVTVERMMiBXYXJyYW50eVN0YXJ0IGZhbGxzIGJhY2sgdG8gc2hpcERhdGUnLAopOwoKJFNlbGYtPklzKAogICAgJFJlc3VsdHMtPntURVNUREwyfXtTaGlwQ291bnRyeX0sCiAgICAnVVMnLAogICAgJ0RlbGw6IFRFU1RETDIgU2hpcENvdW50cnkgaXMgVVMnLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRlc3QgMjogRW1wdHkgc2VyaWFsIGxpc3QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpteSAkRW1wdHlSZXN1bHQgPSAkRGVsbFByb3ZpZGVyLT5HZXRXYXJyYW50eUluZm8oCiAgICBTZXJpYWxOdW1iZXJzID0+IFtdLAopOwoKJFNlbGYtPklzRGVlcGx5KAogICAgJEVtcHR5UmVzdWx0LAogICAge30sCiAgICAnRGVsbDogRW1wdHkgc2VyaWFsIGxpc3QgcmV0dXJucyBlbXB0eSBoYXNocmVmJywKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUZXN0IDM6IE9BdXRoIGZhaWx1cmUgaGFuZGxpbmcKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp7CiAgICBubyB3YXJuaW5ncyAncmVkZWZpbmUnOyAgICAjIyBubyBjcml0aWMKICAgIGxvY2FsICpLZXJuZWw6OlN5c3RlbTo6V2ViVXNlckFnZW50OjpSZXF1ZXN0ID0gc3ViIHsKICAgICAgICByZXR1cm4gKCBDb250ZW50ID0+IFwnJywgU3RhdHVzID0+ICc0MDEgVW5hdXRob3JpemVkJyApOwogICAgfTsKICAgIHVzZSB3YXJuaW5ncyAncmVkZWZpbmUnOwoKICAgIG15ICRGYWlsUmVzdWx0ID0gJERlbGxQcm92aWRlci0+R2V0V2FycmFudHlJbmZvKAogICAgICAgIFNlcmlhbE51bWJlcnMgPT4gWydURVNUMSddLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEZhaWxSZXN1bHQsCiAgICAgICAgJ0RlbGw6IE9BdXRoIGZhaWx1cmUgcmV0dXJucyB1bmRlZicsCiAgICApOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGVzdCA0OiBNaXNzaW5nIGNyZWRlbnRpYWxzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpQcm92aWRlcjo6RGVsbDo6Q2xpZW50SUQnLAogICAgVmFsdWUgPT4gJycsCik7CiRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCggT2JqZWN0cyA9PiBbJ0tlcm5lbDo6Q29uZmlnJ10gKTsKCm15ICREZWxsUHJvdmlkZXIyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6OkRlbGwtPm5ldygpOwpteSAkTm9DcmVkUmVzdWx0ID0gJERlbGxQcm92aWRlcjItPkdldFdhcnJhbnR5SW5mbygKICAgIFNlcmlhbE51bWJlcnMgPT4gWydURVNUMSddLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJE5vQ3JlZFJlc3VsdCwKICAgICdEZWxsOiBNaXNzaW5nIGNyZWRlbnRpYWxzIHJldHVybnMgdW5kZWYnLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRlc3QgNTogQVBJIGVycm9yICg1eHgpIHJldHVybnMgdW5kZWYKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQokSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsOjpDbGllbnRJRCcsCiAgICBWYWx1ZSA9PiAndGVzdC1pZCcsCik7CiRIZWxwZXJPYmplY3QtPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ1dhcnJhbnR5U3luYzo6UHJvdmlkZXI6OkRlbGw6OkNsaWVudFNlY3JldCcsCiAgICBWYWx1ZSA9PiAndGVzdC1zZWNyZXQnLAopOwokS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddICk7Cgp7CiAgICBteSAkQXR0ZW1wdENvdW50ID0gMDsKICAgIG5vIHdhcm5pbmdzICdyZWRlZmluZSc7ICAgICMjIG5vIGNyaXRpYwogICAgbG9jYWwgKktlcm5lbDo6U3lzdGVtOjpXZWJVc2VyQWdlbnQ6OlJlcXVlc3QgPSBzdWIgewogICAgICAgICRBdHRlbXB0Q291bnQrKzsKICAgICAgICByZXR1cm4gKCBDb250ZW50ID0+IFwnU2VydmVyIEVycm9yJywgU3RhdHVzID0+ICc1MDMgU2VydmljZSBVbmF2YWlsYWJsZScgKTsKICAgIH07CiAgICB1c2Ugd2FybmluZ3MgJ3JlZGVmaW5lJzsKCiAgICBteSAkRGVsbFByb3ZpZGVyMyA9IEtlcm5lbDo6U3lzdGVtOjpXYXJyYW50eVN5bmM6OlByb3ZpZGVyOjpEZWxsLT5uZXcoKTsKICAgIG15ICRFcnJvclJlc3VsdCA9ICREZWxsUHJvdmlkZXIzLT5HZXRXYXJyYW50eUluZm8oCiAgICAgICAgU2VyaWFsTnVtYmVycyA9PiBbJ1RFU1QxJ10sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkRXJyb3JSZXN1bHQsCiAgICAgICAgJ0RlbGw6IDUwMyBlcnJvciByZXR1cm5zIHVuZGVmIGFmdGVyIHJldHJpZXMnLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXR0ZW1wdENvdW50ID4gMSwKICAgICAgICAiRGVsbDogUmV0cnkgbG9naWMgYXR0ZW1wdGVkICRBdHRlbXB0Q291bnQgdGltZXMgb24gNTAzIiwKICAgICk7Cn0KCjE7Cg==</File>
        <File Permission="660" Location="scripts/test/WarrantySync/Lenovo.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJEpTT05PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CgokSGVscGVyT2JqZWN0LT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgVmFsaWQgPT4gMSwKICAgIEtleSAgID0+ICdXYXJyYW50eVN5bmM6OkFQSTo6TWF4UmV0cmllcycsCiAgICAjIE11c3QgYmUgPjEgc28gdGhlICJBdHRlbXB0Q291bnQgPiAxIiByZXRyeSBhc3NlcnRpb24gYmVsb3cgKFRlc3QgMykKICAgICMgaXMgYWN0dWFsbHkgcmVhY2hhYmxlIC0gdGhlIHByb3ZpZGVyJ3MgcmV0cnkgbG9vcCBpcyBib3VuZGVkIGJ5CiAgICAjIGB3aGlsZSAoJEF0dGVtcHQgPCAkTWF4UmV0cmllcylgLCBzbyBNYXhSZXRyaWVzPTEgbWFrZXMgaXQKICAgICMgaW1wb3NzaWJsZSB0byBldmVyIHNlZSBhIHNlY29uZCBhdHRlbXB0LCByZWdhcmRsZXNzIG9mIHRoZSBtb2NrLgogICAgVmFsdWUgPT4gJzInLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEJ1aWxkIG1vY2sgTGVub3ZvIEFQSSByZXNwb25zZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpteSAkTW9ja1N1Y2Nlc3NKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgIERhdGEgPT4gewogICAgICAgIGNvZGUgPT4gMCwKICAgICAgICBtc2cgID0+IHsgZGVzYyA9PiAnU3VjY2VzcycgfSwKICAgICAgICBkYXRhID0+IHsKICAgICAgICAgICAgbWFjaGluZUluZm8gPT4gewogICAgICAgICAgICAgICAgcHJvZHVjdCAgICAgICA9PiAnMjFLWDAwMURHRScsCiAgICAgICAgICAgICAgICBwcm9kdWN0TmFtZSAgID0+ICdQMTZ2IEdlbiAyIChUeXBlIDIxS1gsIDIxS1kpIExhcHRvcHMgKFRoaW5rUGFkKSAtIFR5cGUgMjFLWCcsCiAgICAgICAgICAgICAgICBzZXJpYWwgICAgICAgID0+ICdURVNUTE4xJywKICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgPT4gJzIxS1gnLAogICAgICAgICAgICAgICAgbW9kZWwgICAgICAgICA9PiAnMDAxREdFJywKICAgICAgICAgICAgICAgIHNoaXBEYXRlICAgICAgPT4gJzIwMjQtMTAtMTAnLAogICAgICAgICAgICAgICAgc2hpcFRvQ291bnRyeSA9PiAnREUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBiYXNlV2FycmFudGllcyA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSAgICAgID0+ICdCQVNFJywKICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSAgPT4gJ01BQ0hJTkUnLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9PiAnMjAyNS0wMi0wNScsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSAgID0+ICcyMDI4LTAyLTA0JywKICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgPT4gJzNZIERlcG90IFdhcnJhbnR5JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSAgICAgID0+ICdCQVNFJywKICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSAgPT4gJ0NPTVBPTkVOVCcsCiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlID0+ICcyMDI1LTAyLTA1JywKICAgICAgICAgICAgICAgICAgICBlbmREYXRlICAgPT4gJzIwMjYtMDItMDQnLAogICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICA9PiAnMVlSIEJhdHRlcnkgV2FycmFudHknLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgdXBncmFkZVdhcnJhbnRpZXMgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgPT4gJ1VQR1JBREUnLAogICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ICAgICAgICAgPT4gJ01BQ0hJTkUnLAogICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5VHlwZU5hbWUgPT4gJ1ByZW1pZXIgU3VwcG9ydCBQbHVzLCBBRFAsIEtZRCcsCiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlICAgICAgICA9PiAnMjAyNS0wMi0wNScsCiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZSAgICAgICAgICA9PiAnMjAzMC0wMi0wNCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZSAgICAgICAgICAgICA9PiAnNVkgUHJlbWllciBTdXBwb3J0IFBsdXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgY3VycmVudFdhcnJhbnR5ID0+IHsKICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgPT4gJ1VQR1JBREUnLAogICAgICAgICAgICAgICAgZGVsaXZlcnlUeXBlTmFtZSA9PiAnUHJlbWllciBTdXBwb3J0IFBsdXMsIEFEUCwgS1lEJywKICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSAgICAgICAgPT4gJzIwMjUtMDItMDUnLAogICAgICAgICAgICAgICAgZW5kRGF0ZSAgICAgICAgICA9PiAnMjAzMC0wMi0wNCcsCiAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgICAgID0+ICc1WSBQcmVtaWVyIFN1cHBvcnQgUGx1cycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHdhcnJhbnR5U3RhdHVzID0+ICdJbiB3YXJyYW50eScsCiAgICAgICAgfSwKICAgIH0sCik7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTW9jayBMV1A6OlVzZXJBZ2VudCAoTGVub3ZvIHVzZXMgaXQgZGlyZWN0bHkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcmVxdWlyZSBMV1A6OlVzZXJBZ2VudDsKcmVxdWlyZSBIVFRQOjpSZXNwb25zZTsKcmVxdWlyZSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOjpQcm92aWRlcjo6TGVub3ZvOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRlc3QgMTogU3VjY2Vzc2Z1bCByZXNwb25zZSBwYXJzaW5nCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KewogICAgbXkgJE1vY2tKU09OID0gJE1vY2tTdWNjZXNzSlNPTjsKICAgIG5vIHdhcm5pbmdzICdyZWRlZmluZSc7ICAgICMjIG5vIGNyaXRpYwogICAgbG9jYWwgKkxXUDo6VXNlckFnZW50OjpuZXcgPSBzdWIgeyByZXR1cm4gYmxlc3Mge30sICdMV1A6OlVzZXJBZ2VudCcgfTsKICAgIGxvY2FsICpMV1A6OlVzZXJBZ2VudDo6cmVxdWVzdCA9IHN1YiB7CiAgICAgICAgbXkgJFJlc3BvbnNlID0gSFRUUDo6UmVzcG9uc2UtPm5ldyggMjAwLCAnT0snICk7CiAgICAgICAgJFJlc3BvbnNlLT5jb250ZW50KCRNb2NrSlNPTik7CiAgICAgICAgJFJlc3BvbnNlLT5oZWFkZXIoICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyApOwogICAgICAgIHJldHVybiAkUmVzcG9uc2U7CiAgICB9OwogICAgdXNlIHdhcm5pbmdzICdyZWRlZmluZSc7CgogICAgbXkgJExlbm92b1Byb3ZpZGVyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6Okxlbm92by0+bmV3KCk7CiAgICBteSAkUmVzdWx0cyA9ICRMZW5vdm9Qcm92aWRlci0+R2V0V2FycmFudHlJbmZvKAogICAgICAgIFNlcmlhbE51bWJlcnMgPT4gWydURVNUTE4xJ10sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRSZXN1bHRzLAogICAgICAgICdMZW5vdm86IEdldFdhcnJhbnR5SW5mbyByZXR1cm5lZCByZXN1bHRzJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHJlZiAkUmVzdWx0cywKICAgICAgICAnSEFTSCcsCiAgICAgICAgJ0xlbm92bzogUmVzdWx0IGlzIGEgaGFzaHJlZicsCiAgICApOwoKICAgICMgY3VycmVudFdhcnJhbnR5L3VwZ3JhZGUgc2hvdWxkIGdpdmUgdGhlIGxhdGVzdCBlbmQgZGF0ZQogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHRzLT57VEVTVExOMX17V2FycmFudHlFbmR9LAogICAgICAgICcyMDMwLTAyLTA0JywKICAgICAgICAnTGVub3ZvOiBXYXJyYW50eUVuZCB1c2VzIHVwZ3JhZGUvY3VycmVudFdhcnJhbnR5IGVuZCBkYXRlJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgICRSZXN1bHRzLT57VEVTVExOMX17V2FycmFudHlTdGFydH0sCiAgICAgICAgJzIwMjUtMDItMDUnLAogICAgICAgICdMZW5vdm86IFdhcnJhbnR5U3RhcnQgZnJvbSBlYXJsaWVzdCB3YXJyYW50eScsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVzdWx0cy0+e1RFU1RMTjF9e1dhcnJhbnR5VHlwZX0sCiAgICAgICAgJzVZIFByZW1pZXIgU3VwcG9ydCBQbHVzJywKICAgICAgICAnTGVub3ZvOiBXYXJyYW50eVR5cGUgZnJvbSBjdXJyZW50V2FycmFudHkgbmFtZScsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRSZXN1bHRzLT57VEVTVExOMX17UHJvZHVjdE5hbWV9ID1+IC9MZW5vdm8vLAogICAgICAgICdMZW5vdm86IFByb2R1Y3ROYW1lIGhhcyBMZW5vdm8gcHJlZml4JywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFJlc3VsdHMtPntURVNUTE4xfXtQcm9kdWN0TmFtZX0gPX4gL1AxNnYgR2VuIDIvLAogICAgICAgICdMZW5vdm86IFByb2R1Y3ROYW1lIGNvbnRhaW5zIHByb2R1Y3QgbmFtZScsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVzdWx0cy0+e1RFU1RMTjF9e1NoaXBEYXRlfSwKICAgICAgICAnMjAyNC0xMC0xMCcsCiAgICAgICAgJ0xlbm92bzogU2hpcERhdGUgZnJvbSBtYWNoaW5lSW5mbycsCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkUmVzdWx0cy0+e1RFU1RMTjF9e1NoaXBDb3VudHJ5fSwKICAgICAgICAnREUnLAogICAgICAgICdMZW5vdm86IFNoaXBDb3VudHJ5IGZyb20gbWFjaGluZUluZm8nLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRlc3QgMjogRW1wdHkgc2VyaWFsIGxpc3QKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp7CiAgICBteSAkTGVub3ZvUHJvdmlkZXIgPSBLZXJuZWw6OlN5c3RlbTo6V2FycmFudHlTeW5jOjpQcm92aWRlcjo6TGVub3ZvLT5uZXcoKTsKICAgIG15ICRFbXB0eVJlc3VsdCA9ICRMZW5vdm9Qcm92aWRlci0+R2V0V2FycmFudHlJbmZvKAogICAgICAgIFNlcmlhbE51bWJlcnMgPT4gW10sCiAgICApOwoKICAgICRTZWxmLT5Jc0RlZXBseSgKICAgICAgICAkRW1wdHlSZXN1bHQsCiAgICAgICAge30sCiAgICAgICAgJ0xlbm92bzogRW1wdHkgc2VyaWFsIGxpc3QgcmV0dXJucyBlbXB0eSBoYXNocmVmJywKICAgICk7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUZXN0IDM6IEhUVFAgZXJyb3Igd2l0aCByZXRyeQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnsKICAgIG15ICRBdHRlbXB0Q291bnQgPSAwOwogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsgICAgIyMgbm8gY3JpdGljCiAgICBsb2NhbCAqTFdQOjpVc2VyQWdlbnQ6Om5ldyA9IHN1YiB7IHJldHVybiBibGVzcyB7fSwgJ0xXUDo6VXNlckFnZW50JyB9OwogICAgbG9jYWwgKkxXUDo6VXNlckFnZW50OjpyZXF1ZXN0ID0gc3ViIHsKICAgICAgICAkQXR0ZW1wdENvdW50Kys7CiAgICAgICAgbXkgJFJlc3BvbnNlID0gSFRUUDo6UmVzcG9uc2UtPm5ldyggNTAzLCAnU2VydmljZSBVbmF2YWlsYWJsZScgKTsKICAgICAgICAkUmVzcG9uc2UtPmNvbnRlbnQoJ1NlcnZlciBFcnJvcicpOwogICAgICAgIHJldHVybiAkUmVzcG9uc2U7CiAgICB9OwogICAgdXNlIHdhcm5pbmdzICdyZWRlZmluZSc7CgogICAgbXkgJExlbm92b1Byb3ZpZGVyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6Okxlbm92by0+bmV3KCk7CiAgICBteSAkRXJyb3JSZXN1bHQgPSAkTGVub3ZvUHJvdmlkZXItPkdldFdhcnJhbnR5SW5mbygKICAgICAgICBTZXJpYWxOdW1iZXJzID0+IFsnVEVTVExOMiddLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRXJyb3JSZXN1bHQtPntURVNUTE4yfXtFcnJvcn0sCiAgICAgICAgJ0xlbm92bzogRXJyb3IgcmVzdWx0IGNvbnRhaW5zIEVycm9yIGtleSBvbiA1MDMnLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkQXR0ZW1wdENvdW50ID4gMSwKICAgICAgICAiTGVub3ZvOiBSZXRyeSBsb2dpYyBhdHRlbXB0ZWQgJEF0dGVtcHRDb3VudCB0aW1lcyBvbiA1MDMiLAogICAgKTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRlc3QgNDogQ2xpZW50IGVycm9yICg0MDQpIC0gbm8gcmV0cnkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp7CiAgICBteSAkQXR0ZW1wdENvdW50ID0gMDsKICAgIG5vIHdhcm5pbmdzICdyZWRlZmluZSc7ICAgICMjIG5vIGNyaXRpYwogICAgbG9jYWwgKkxXUDo6VXNlckFnZW50OjpuZXcgPSBzdWIgeyByZXR1cm4gYmxlc3Mge30sICdMV1A6OlVzZXJBZ2VudCcgfTsKICAgIGxvY2FsICpMV1A6OlVzZXJBZ2VudDo6cmVxdWVzdCA9IHN1YiB7CiAgICAgICAgJEF0dGVtcHRDb3VudCsrOwogICAgICAgIG15ICRSZXNwb25zZSA9IEhUVFA6OlJlc3BvbnNlLT5uZXcoIDQwNCwgJ05vdCBGb3VuZCcgKTsKICAgICAgICAkUmVzcG9uc2UtPmNvbnRlbnQoJ05vdCBGb3VuZCcpOwogICAgICAgIHJldHVybiAkUmVzcG9uc2U7CiAgICB9OwogICAgdXNlIHdhcm5pbmdzICdyZWRlZmluZSc7CgogICAgbXkgJExlbm92b1Byb3ZpZGVyID0gS2VybmVsOjpTeXN0ZW06OldhcnJhbnR5U3luYzo6UHJvdmlkZXI6Okxlbm92by0+bmV3KCk7CiAgICBteSAkTm90Rm91bmRSZXN1bHQgPSAkTGVub3ZvUHJvdmlkZXItPkdldFdhcnJhbnR5SW5mbygKICAgICAgICBTZXJpYWxOdW1iZXJzID0+IFsnQkFEU0VSSUFMJ10sCiAgICApOwoKICAgICRTZWxmLT5JcygKICAgICAgICAkQXR0ZW1wdENvdW50LAogICAgICAgIDEsCiAgICAgICAgJ0xlbm92bzogTm8gcmV0cnkgb24gNDA0IChjbGllbnQgZXJyb3IpJywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJE5vdEZvdW5kUmVzdWx0LT57QkFEU0VSSUFMfXtFcnJvcn0sCiAgICAgICAgJ0xlbm92bzogRXJyb3IgcmVzdWx0IGZvciA0MDQnLAogICAgKTsKfQoKMTsK</File>
        <File Permission="660" Location="scripts/test/WarrantySync/ConsoleCommand.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQgLSBTdGVwaGFuIExhbmcKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgojIC0tCiMgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBsaWNlbnNlZCB1bmRlcjoKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDMKIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0IDE6IENvbW1hbmQgbW9kdWxlIGNhbiBiZSBsb2FkZWQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJENvbW1hbmRNb2R1bGUgPSAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpXYXJyYW50eVN5bmM6OlJ1bic7Cm15ICRMb2FkZWQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRDb21tYW5kTW9kdWxlKTsKCiRTZWxmLT5UcnVlKAogICAgJExvYWRlZCwKICAgICdDb25zb2xlIGNvbW1hbmQgbW9kdWxlIGNhbiBiZSBsb2FkZWQnLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRlc3QgMjogQ29tbWFuZCBvYmplY3QgY2FuIGJlIGluc3RhbnRpYXRlZAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkQ29tbWFuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJENvbW1hbmRNb2R1bGUpOwoKJFNlbGYtPlRydWUoCiAgICAkQ29tbWFuZE9iamVjdCwKICAgICdDb25zb2xlIGNvbW1hbmQgb2JqZWN0IGNyZWF0ZWQnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ29tbWFuZE9iamVjdC0+aXNhKCdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQnKSwKICAgICdDb25zb2xlIGNvbW1hbmQgaW5oZXJpdHMgZnJvbSBCYXNlQ29tbWFuZCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVGVzdCAzOiBIZWxwIHRleHQgY29udGFpbnMgZXhwZWN0ZWQgY29udGVudAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkRGVzY3JpcHRpb24gPSAkQ29tbWFuZE9iamVjdC0+RGVzY3JpcHRpb24oKTsKCiRTZWxmLT5UcnVlKAogICAgJERlc2NyaXB0aW9uID1+IC93YXJyYW50eS9pLAogICAgJ0NvbW1hbmQgZGVzY3JpcHRpb24gbWVudGlvbnMgd2FycmFudHknLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRlc3QgNDogUnVuIHdpdGggZGlzYWJsZWQgZmVhdHVyZSAobm8gLS1mb3JjZSkgc2hvdWxkIGZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJEhlbHBlck9iamVjdC0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgIFZhbGlkID0+IDEsCiAgICBLZXkgICA9PiAnV2FycmFudHlTeW5jOjpFbmFibGVkJywKICAgIFZhbHVlID0+IDAsCik7CgojIFByZVJ1biBjaGVja3MgRW5hYmxlZCBmbGFnIGFuZCBkaWVzIHdpdGhvdXQgLS1mb3JjZQojIFdlIHRlc3QgdGhpcyBieSBjYWxsaW5nIFByZVJ1biBpbiBhbiBldmFsCm15ICRDb21tYW5kT2JqZWN0MiA9ICRDb21tYW5kTW9kdWxlLT5uZXcoCiAgICBOYW1lID0+ICdNYWludDo6V2FycmFudHlTeW5jOjpSdW4nLAopOwoKIyBTaW11bGF0ZSBubyAtLWZvcmNlIChkZWZhdWx0KQpteSAkUHJlUnVuRXJyb3I7CmV2YWwgewogICAgIyBPdmVycmlkZSBHZXRPcHRpb24gdG8gcmV0dXJuIGZhbHNlIGZvciAnZm9yY2UnCiAgICBubyB3YXJuaW5ncyAncmVkZWZpbmUnOwogICAgbG9jYWwgKktlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6V2FycmFudHlTeW5jOjpSdW46OkdldE9wdGlvbiA9IHN1YiB7CiAgICAgICAgbXkgKCRJblNlbGYsICROYW1lKSA9IEBfOwogICAgICAgIHJldHVybiAwIGlmICROYW1lIGVxICdmb3JjZSc7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9OwogICAgJENvbW1hbmRPYmplY3QyLT5QcmVSdW4oKTsKfTsKJFByZVJ1bkVycm9yID0gJEA7CgokU2VsZi0+VHJ1ZSgKICAgICRQcmVSdW5FcnJvciwKICAgICdQcmVSdW4gZGllcyB3aGVuIGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIG5vIC0tZm9yY2UnLAopOwoKJFNlbGYtPlRydWUoCiAgICAkUHJlUnVuRXJyb3IgPX4gL2Rpc2FibGVkL2ksCiAgICAnUHJlUnVuIGVycm9yIG1lc3NhZ2UgbWVudGlvbnMgZGlzYWJsZWQnLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFRlc3QgNTogUnVuIHdpdGggLS1mb3JjZSBzaG91bGQgcGFzcyBQcmVSdW4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJFByZVJ1blN1Y2Nlc3M7CmV2YWwgewogICAgbm8gd2FybmluZ3MgJ3JlZGVmaW5lJzsKICAgIGxvY2FsICpLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OldhcnJhbnR5U3luYzo6UnVuOjpHZXRPcHRpb24gPSBzdWIgewogICAgICAgIG15ICgkSW5TZWxmLCAkTmFtZSkgPSBAXzsKICAgICAgICByZXR1cm4gMSBpZiAkTmFtZSBlcSAnZm9yY2UnOwogICAgICAgIHJldHVybiAwOwogICAgfTsKICAgICRQcmVSdW5TdWNjZXNzID0gJENvbW1hbmRPYmplY3QyLT5QcmVSdW4oKTsKfTsKCiRTZWxmLT5GYWxzZSgKICAgICRALAogICAgJ1ByZVJ1biBzdWNjZWVkcyB3aXRoIC0tZm9yY2UgZXZlbiB3aGVuIGRpc2FibGVkJywKKTsKCjE7Cg==</File>
    </Filelist>

    <!-- Database: tracking table for last check timestamps.
         Stored separately from ConfigItem versions to avoid creating
         a new CMDB version on every sync run when nothing changed. -->

    <DatabaseInstall Type="post">
        <TableCreate Name="warranty_sync_status">
            <Column Name="config_item_id" Required="true" Type="BIGINT"/>
            <Column Name="last_check" Required="true" Type="DATE"/>
            <Column Name="expiry_ticket_end_date" Required="false" Size="10" Type="VARCHAR"/>
            <Unique Name="warranty_sync_status_config_item_id">
                <UniqueColumn Name="config_item_id"/>
            </Unique>
            <ForeignKey ForeignTable="configitem">
                <Reference Local="config_item_id" Foreign="id"/>
            </ForeignKey>
        </TableCreate>
    </DatabaseInstall>

    <DatabaseUninstall Type="pre">
        <TableDrop Name="warranty_sync_status"/>
    </DatabaseUninstall>

</otrs_package>
