internal/templates/PSFProject-1.0.0.0.xml

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>PSModuleDevelopment.Template.Template</T>
      <T>System.Object</T>
    </TN>
    <ToString>PSModuleDevelopment.Template.Template</ToString>
    <Props>
      <S N="Name">PSFProject</S>
      <Obj N="Type" RefId="1">
        <TN RefId="1">
          <T>PSModuleDevelopment.Template.TemplateType</T>
          <T>System.Enum</T>
          <T>System.ValueType</T>
          <T>System.Object</T>
        </TN>
        <ToString>Project</ToString>
        <I32>1</I32>
      </Obj>
      <Version N="Version">1.0.0.0</Version>
      <S N="Description">PowerShell Framework based project scaffold</S>
      <S N="Author">Friedrich Weinmann</S>
      <DT N="CreatedOn">2018-03-08T00:00:00+01:00</DT>
      <Obj N="Tags" RefId="2">
        <TN RefId="2">
          <T>System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</T>
          <T>System.Object</T>
        </TN>
        <LST>
          <S>module</S>
          <S>psframework</S>
        </LST>
      </Obj>
      <Obj N="Parameters" RefId="3">
        <TNRef RefId="2" />
        <LST>
          <S>name</S>
          <S>author</S>
          <S>company</S>
          <S>description</S>
        </LST>
      </Obj>
      <Obj N="Scripts" RefId="4">
        <TN RefId="3">
          <T>System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[PSModuleDevelopment.Template.ParameterScript, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T>
          <T>System.Object</T>
        </TN>
        <DCT>
          <En>
            <S N="Key">guid4</S>
            <Obj N="Value" RefId="5">
              <TN RefId="4">
                <T>PSModuleDevelopment.Template.ParameterScript</T>
                <T>System.Object</T>
              </TN>
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</S>
                <S N="Name">guid4</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAFZ3VpZDQJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkL</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">year</S>
            <Obj N="Value" RefId="6">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy"_x000D__x000A__x0009__x0009_</S>
                <S N="Name">year</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy"_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEeWVhcgkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAAIA0KCQkJR2V0LURhdGUgLUZvcm1hdCAieXl5eSINCgkJCw==</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">guid2</S>
            <Obj N="Value" RefId="7">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</S>
                <S N="Name">guid2</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAFZ3VpZDIJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkL</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">date</S>
            <Obj N="Value" RefId="8">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy-MM-dd"_x000D__x000A__x0009__x0009_</S>
                <S N="Name">date</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy-MM-dd"_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEZGF0ZQkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAAJg0KCQkJR2V0LURhdGUgLUZvcm1hdCAieXl5eS1NTS1kZCINCgkJCw==</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">guid</S>
            <Obj N="Value" RefId="9">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString()_x000D__x000A__x0009__x0009_</S>
                <S N="Name">guid</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString()_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEZ3VpZAkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJCw==</BA>
              </MS>
            </Obj>
          </En>
          <En>
            <S N="Key">guid3</S>
            <Obj N="Value" RefId="10">
              <TNRef RefId="4" />
              <ToString>PSModuleDevelopment.Template.ParameterScript</ToString>
              <Props>
                <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</S>
                <S N="Name">guid3</S>
                <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</SBK>
              </Props>
              <MS>
                <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAFZ3VpZDMJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkL</BA>
              </MS>
            </Obj>
          </En>
        </DCT>
      </Obj>
      <Obj N="Children" RefId="11">
        <TN RefId="5">
          <T>System.Collections.Generic.List`1[[PSModuleDevelopment.Template.TemplateItemBase, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T>
          <T>System.Object</T>
        </TN>
        <LST>
          <Obj RefId="12">
            <TN RefId="6">
              <T>PSModuleDevelopment.Template.TemplateItemFolder</T>
              <T>PSModuleDevelopment.Template.TemplateItemBase</T>
              <T>System.Object</T>
            </TN>
            <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString>
            <Props>
              <Obj N="Children" RefId="13">
                <TNRef RefId="5" />
                <LST>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                </LST>
              </Obj>
              <S N="Name">build</S>
              <S N="RelativePath">build</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="14">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="15">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAABWJ1aWxkBgUAAAAFYnVpbGQGBgAAAALDvgkHAAAACQgAAAAEAwAAAJ4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAC9QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2VbXQIAAAAICAkJAAAAAgAAAAIAAAAEBwAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkKAAAAAAAAAAAAAAABCAAAAAcAAAAJCgAAAAAAAAAAAAAABwkAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJCwAAAAkMAAAADQIRCgAAAAAAAAAFCwAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGDQAAANADPCMNClRoaXMgc2NyaXB0IHB1Ymxpc2hlcyB0aGUgbW9kdWxlIHRvIHRoZSBnYWxsZXJ5Lg0KSXQgZXhwZWN0cyBhcyBpbnB1dCBhbiBBcGlLZXkgYXV0aG9yaXplZCB0byBwdWJsaXNoIHRoZSBtb2R1bGUuDQoNCkluc2VydCBhbnkgYnVpbGQgc3RlcHMgeW91IG1heSBuZWVkIHRvIHRha2UgYmVmb3JlIHB1Ymxpc2hpbmcgaXQgaGVyZS4NCiM+DQpwYXJhbSAoDQoJJEFwaUtleSwNCgkkV2hhdElmDQopDQoNCmlmICgkV2hhdElmKSB7IFB1Ymxpc2gtTW9kdWxlIC1QYXRoICIkKCRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZKVzDvm5hbWXDviIgLU51R2V0QXBpS2V5ICRBcGlLZXkgLUZvcmNlIC1XaGF0SWYgfQ0KZWxzZSB7IFB1Ymxpc2gtTW9kdWxlIC1QYXRoICIkKCRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZKVzDvm5hbWXDviIgLU51R2V0QXBpS2V5ICRBcGlLZXkgLUZvcmNlIH0BCQ4AAAAJDwAAAAYQAAAADnZzdHMtYnVpbGQucHMxBhEAAAAUYnVpbGRcdnN0cy1idWlsZC5wczEJBgAAAAkTAAAACRQAAAABDAAAAAsAAAAGFQAAAMoCIyBHdWlkZSBmb3IgYXZhaWxhYmxlIHZhcmlhYmxlcyBhbmQgd29ya2luZyB3aXRoIHNlY3JldHM6DQojIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3ZzdHMvYnVpbGQtcmVsZWFzZS9jb25jZXB0cy9kZWZpbml0aW9ucy9idWlsZC92YXJpYWJsZXM/dGFicz1wb3dlcnNoZWxsDQoNCiMgTmVlZHMgdG8gZW5zdXJlIHRoaW5ncyBhcmUgRG9uZSBSaWdodCBhbmQgb25seSBsZWdhbCBjb21taXRzIHRvIG1hc3RlciBnZXQgYnVpbHQNCg0KIyBSdW4gaW50ZXJuYWwgcGVzdGVyIHRlc3RzDQomICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+XHRlc3RzXHBlc3Rlci5wczEiAQkWAAAACRcAAAAGGAAAABF2c3RzLXZhbGlkYXRlLnBzMQYZAAAAF2J1aWxkXHZzdHMtdmFsaWRhdGUucHMxCQYAAAAJGwAAAAkcAAAAAQ4AAAAHAAAACR0AAAABAAAAAQAAAAEPAAAABwAAAAkKAAAAAAAAAAAAAAABEwAAAAcAAAAJCgAAAAAAAAAAAAAAARQAAAAHAAAACQoAAAAAAAAAAAAAAAEWAAAABwAAAAkfAAAAAQAAAAEAAAABFwAAAAcAAAAJCgAAAAAAAAAAAAAAARsAAAAHAAAACQoAAAAAAAAAAAAAAAEcAAAABwAAAAkKAAAAAAAAAAAAAAARHQAAAAQAAAAGIQAAAARuYW1lDQMRHwAAAAQAAAAGIgAAAARuYW1lDQML</BA>
            </MS>
          </Obj>
          <Obj RefId="16">
            <TNRef RefId="6" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString>
            <Props>
              <Obj N="Children" RefId="17">
                <TNRef RefId="5" />
                <LST>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                </LST>
              </Obj>
              <S N="Name">library</S>
              <S N="RelativePath">library</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="18">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="19">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAAB2xpYnJhcnkGBQAAAAdsaWJyYXJ5BgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAEAAAABAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAANAxEKAAAAAAAAAAELAAAAAQAAAAkMAAAABg0AAAAIw75uYW1lw74GDgAAABBsaWJyYXJ5XMO+bmFtZcO+CQYAAAAJEAAAAAkRAAAAAQwAAAADAAAACRIAAAACAAAAAgAAAAEQAAAABwAAAAkTAAAAAQAAAAEAAAABEQAAAAcAAAAJCgAAAAAAAAAAAAAABxIAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJFQAAAAkWAAAADQIREwAAAAQAAAAGFwAAAARuYW1lDQMBFQAAAAEAAAAJGAAAAAYZAAAACMO+bmFtZcO+BhoAAAAZbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvgkGAAAACRwAAAAJHQAAAAUWAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYeAAAAsQcNCk1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwDQojIFZpc3VhbCBTdHVkaW8gMTUNClZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI3MTMwLjIwMTANCk1pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xDQpQcm9qZWN0KCJ7w74hZ3VpZDIhw759IikgPSAiw75uYW1lw74iLCAiw75uYW1lw75cw75uYW1lw74uY3Nwcm9qIiwgInvDviFndWlkNCHDvn0iDQpFbmRQcm9qZWN0DQpHbG9iYWwNCglHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCglFbmRHbG9iYWxTZWN0aW9uDQoJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCgkJe8O+IWd1aWQ0IcO+fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCgkJe8O+IWd1aWQ0IcO+fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQoJCXvDviFndWlkNCHDvn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KCQl7w74hZ3VpZDQhw759LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQoJRW5kR2xvYmFsU2VjdGlvbg0KCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQoJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KCUVuZEdsb2JhbFNlY3Rpb24NCglHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KCQlTb2x1dGlvbkd1aWQgPSB7w74hZ3VpZDMhw759DQoJRW5kR2xvYmFsU2VjdGlvbg0KRW5kR2xvYmFsDQoBCR8AAAAJIAAAAAYhAAAADMO+bmFtZcO+LnNsbgYiAAAAHWxpYnJhcnlcw75uYW1lw75cw75uYW1lw74uc2xuCQYAAAAJJAAAAAklAAAAARgAAAADAAAACSYAAAAEAAAABAAAAAEcAAAABwAAAAknAAAAAQAAAAEAAAABHQAAAAcAAAAJCgAAAAAAAAAAAAAAAR8AAAAHAAAACSkAAAABAAAAAQAAAAEgAAAABwAAAAkqAAAABwAAAAcAAAABJAAAAAcAAAAJKwAAAAEAAAABAAAAASUAAAAHAAAACQoAAAAAAAAAAAAAAAcmAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACS0AAAAJLgAAAAkvAAAACTAAAAARJwAAAAQAAAAGMQAAAARuYW1lDQMRKQAAAAQAAAAGMgAAAARuYW1lDQMRKgAAAAgAAAAGMwAAAAVndWlkMgY0AAAABWd1aWQ0BjUAAAAFZ3VpZDQGNgAAAAVndWlkNAY3AAAABWd1aWQ0BjgAAAAFZ3VpZDQGOQAAAAVndWlkMwoRKwAAAAQAAAAGOgAAAARuYW1lDQMBLQAAAAEAAAAJOwAAAAY8AAAAA2JpbgY9AAAAHWxpYnJhcnlcw75uYW1lw75cw75uYW1lw75cYmluCQYAAAAJPwAAAAlAAAAAAS4AAAABAAAACUEAAAAGQgAAAANvYmoGQwAAAB1saWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XG9iagkGAAAACUUAAAAJRgAAAAEvAAAAFgAAAAZHAAAAUnVzaW5nIFN5c3RlbTsNCg0KbmFtZXNwYWNlIMO+bmFtZcO+DQp7DQogICAgcHVibGljIGNsYXNzIENsYXNzMQ0KICAgIHsNCiAgICB9DQp9DQoBCUgAAAAJSQAAAAZKAAAACUNsYXNzMS5jcwZLAAAAI2xpYnJhcnlcw75uYW1lw75cw75uYW1lw75cQ2xhc3MxLmNzCQYAAAAJTQAAAAlOAAAAATAAAAAWAAAABk8AAACEBDxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPg0KDQogIDxQcm9wZXJ0eUdyb3VwPg0KICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4NCiAgPC9Qcm9wZXJ0eUdyb3VwPg0KDQogIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8QW55Q1BVJyI+DQogICAgPE91dHB1dFBhdGg+Li5cLi5cLi5cw75uYW1lw75cYmluPC9PdXRwdXRQYXRoPg0KICAgIDxEb2N1bWVudGF0aW9uRmlsZT4uLlwuLlwuLlzDvm5hbWXDvlxiaW5cbmV0c3RhbmRhcmQyLjBcw75uYW1lw74ueG1sPC9Eb2N1bWVudGF0aW9uRmlsZT4NCiAgPC9Qcm9wZXJ0eUdyb3VwPg0KICANCiAgPFByb3BlcnR5R3JvdXA+DQogICAgPEFwcGVuZFRhcmdldEZyYW1ld29ya1RvT3V0cHV0UGF0aD5mYWxzZTwvQXBwZW5kVGFyZ2V0RnJhbWV3b3JrVG9PdXRwdXRQYXRoPg0KICA8L1Byb3BlcnR5R3JvdXA+DQoNCjwvUHJvamVjdD4NCgEJUAAAAAlRAAAABlIAAAAPw75uYW1lw74uY3Nwcm9qBlMAAAApbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlzDvm5hbWXDvi5jc3Byb2oJBgAAAAlVAAAACVYAAAABOwAAAAMAAAAJVwAAAAEAAAABAAAAAT8AAAAHAAAACQoAAAAAAAAAAAAAAAFAAAAABwAAAAkKAAAAAAAAAAAAAAABQQAAAAMAAAAJWQAAAAUAAAAFAAAAAUUAAAAHAAAACQoAAAAAAAAAAAAAAAFGAAAABwAAAAkKAAAAAAAAAAAAAAABSAAAAAcAAAAJWwAAAAEAAAABAAAAAUkAAAAHAAAACQoAAAAAAAAAAAAAAAFNAAAABwAAAAkKAAAAAAAAAAAAAAABTgAAAAcAAAAJCgAAAAAAAAAAAAAAAVAAAAAHAAAACV0AAAABAAAAAQAAAAFRAAAABwAAAAkKAAAAAAAAAAAAAAABVQAAAAcAAAAJXwAAAAEAAAABAAAAAVYAAAAHAAAACQoAAAAAAAAAAAAAAAdXAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACWEAAAANAwdZAAAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACWIAAAAJYwAAAAlkAAAACWUAAAAJZgAAAA0DEVsAAAAEAAAABmcAAAAEbmFtZQ0DEV0AAAAEAAAABmgAAAAEbmFtZQ0DEV8AAAAEAAAABmkAAAAEbmFtZQ0DAWEAAAABAAAACWoAAAAGawAAAAVEZWJ1ZwZsAAAAI2xpYnJhcnlcw75uYW1lw75cw75uYW1lw75cYmluXERlYnVnCQYAAAAJbgAAAAlvAAAAAWIAAAABAAAACXAAAAAGcQAAAAVEZWJ1ZwZyAAAAI2xpYnJhcnlcw75uYW1lw75cw75uYW1lw75cb2JqXERlYnVnCQYAAAAJdAAAAAl1AAAAAWMAAAAWAAAABnYAAACkW3sNCiAgInZlcnNpb24iOiAzLA0KICAidGFyZ2V0cyI6IHsNCiAgICAiLk5FVFN0YW5kYXJkLFZlcnNpb249djIuMCI6IHsNCiAgICAgICJNaWNyb3NvZnQuTkVUQ29yZS5QbGF0Zm9ybXMvMS4xLjAiOiB7DQogICAgICAgICJ0eXBlIjogInBhY2thZ2UiLA0KICAgICAgICAiY29tcGlsZSI6IHsNCiAgICAgICAgICAibGliL25ldHN0YW5kYXJkMS4wL18uXyI6IHt9DQogICAgICAgIH0sDQogICAgICAgICJydW50aW1lIjogew0KICAgICAgICAgICJsaWIvbmV0c3RhbmRhcmQxLjAvXy5fIjoge30NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5LzIuMC4wIjogew0KICAgICAgICAidHlwZSI6ICJwYWNrYWdlIiwNCiAgICAgICAgImRlcGVuZGVuY2llcyI6IHsNCiAgICAgICAgICAiTWljcm9zb2Z0Lk5FVENvcmUuUGxhdGZvcm1zIjogIjEuMS4wIg0KICAgICAgICB9LA0KICAgICAgICAiY29tcGlsZSI6IHsNCiAgICAgICAgICAibGliL25ldHN0YW5kYXJkMS4wL18uXyI6IHt9DQogICAgICAgIH0sDQogICAgICAgICJydW50aW1lIjogew0KICAgICAgICAgICJsaWIvbmV0c3RhbmRhcmQxLjAvXy5fIjoge30NCiAgICAgICAgfSwNCiAgICAgICAgImJ1aWxkIjogew0KICAgICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9ORVRTdGFuZGFyZC5MaWJyYXJ5LnRhcmdldHMiOiB7fQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9LA0KICAibGlicmFyaWVzIjogew0KICAgICJNaWNyb3NvZnQuTkVUQ29yZS5QbGF0Zm9ybXMvMS4xLjAiOiB7DQogICAgICAic2hhNTEyIjogImt6MFBFVzJsaHF5Z2VoSS9kNlhzUENRekQ3ZmY3Z1VKYVZHUFZFVFg2MTFlYWRHc0EzQTg3N0dkU2xVMExSVk1DVEgvK1AzbzJpRFRhaytTMDhWMitBPT0iLA0KICAgICAgInR5cGUiOiAicGFja2FnZSIsDQogICAgICAicGF0aCI6ICJtaWNyb3NvZnQubmV0Y29yZS5wbGF0Zm9ybXMvMS4xLjAiLA0KICAgICAgImZpbGVzIjogWw0KICAgICAgICAiVGhpcmRQYXJ0eU5vdGljZXMudHh0IiwNCiAgICAgICAgImRvdG5ldF9saWJyYXJ5X2xpY2Vuc2UudHh0IiwNCiAgICAgICAgImxpYi9uZXRzdGFuZGFyZDEuMC9fLl8iLA0KICAgICAgICAibWljcm9zb2Z0Lm5ldGNvcmUucGxhdGZvcm1zLjEuMS4wLm51cGtnLnNoYTUxMiIsDQogICAgICAgICJtaWNyb3NvZnQubmV0Y29yZS5wbGF0Zm9ybXMubnVzcGVjIiwNCiAgICAgICAgInJ1bnRpbWUuanNvbiINCiAgICAgIF0NCiAgICB9LA0KICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5LzIuMC4wIjogew0KICAgICAgInNoYTUxMiI6ICI3am5iUlUrTDA4RlhLTXhxVWZseEVYdFZ5bVd2Tk9yUzh5SGd1OXM2RU04QW5yNlQvd0lYNG5aMDhqL3UzQXN6K3RDdWZwM1lWd0ZTRXZGVFBZbUJQQT09IiwNCiAgICAgICJ0eXBlIjogInBhY2thZ2UiLA0KICAgICAgInBhdGgiOiAibmV0c3RhbmRhcmQubGlicmFyeS8yLjAuMCIsDQogICAgICAiZmlsZXMiOiBbDQogICAgICAgICJMSUNFTlNFLlRYVCIsDQogICAgICAgICJUSElSRC1QQVJUWS1OT1RJQ0VTLlRYVCIsDQogICAgICAgICJidWlsZC9ORVRTdGFuZGFyZC5MaWJyYXJ5LnRhcmdldHMiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvTkVUU3RhbmRhcmQuTGlicmFyeS50YXJnZXRzIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9NaWNyb3NvZnQuV2luMzIuUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5BcHBDb250ZXh0LmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkNvbGxlY3Rpb25zLkNvbmN1cnJlbnQuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uQ29sbGVjdGlvbnMuTm9uR2VuZXJpYy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db2xsZWN0aW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db21wb25lbnRNb2RlbC5Db21wb3NpdGlvbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db21wb25lbnRNb2RlbC5FdmVudEJhc2VkQXN5bmMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uQ29tcG9uZW50TW9kZWwuUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db21wb25lbnRNb2RlbC5UeXBlQ29udmVydGVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkNvbXBvbmVudE1vZGVsLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkNvbnNvbGUuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uQ29yZS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EYXRhLkNvbW1vbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EYXRhLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLkNvbnRyYWN0cy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Zy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EaWFnbm9zdGljcy5GaWxlVmVyc2lvbkluZm8uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EaWFnbm9zdGljcy5TdGFja1RyYWNlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRleHRXcml0ZXJUcmFjZUxpc3RlbmVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRvb2xzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRyYWNlU291cmNlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRyYWNpbmcuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uRHJhd2luZy5QcmltaXRpdmVzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRyYXdpbmcuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uRHluYW1pYy5SdW50aW1lLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkdsb2JhbGl6YXRpb24uQ2FsZW5kYXJzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkdsb2JhbGl6YXRpb24uRXh0ZW5zaW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5HbG9iYWxpemF0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwRmlsZS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5Db21wcmVzc2lvbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5GaWxlU3lzdGVtLkRyaXZlSW5mby5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5GaWxlU3lzdGVtLlByaW1pdGl2ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uSU8uRmlsZVN5c3RlbS5XYXRjaGVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLkZpbGVTeXN0ZW0uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uSU8uSXNvbGF0ZWRTdG9yYWdlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLk1lbW9yeU1hcHBlZEZpbGVzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLlBpcGVzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLlVubWFuYWdlZE1lbW9yeVN0cmVhbS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5MaW5xLkV4cHJlc3Npb25zLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkxpbnEuUGFyYWxsZWwuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTGlucS5RdWVyeWFibGUuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTGlucS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuSHR0cC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuTmFtZVJlc29sdXRpb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTmV0Lk5ldHdvcmtJbmZvcm1hdGlvbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuUGluZy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuUmVxdWVzdHMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTmV0LlNlY3VyaXR5LmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLk5ldC5Tb2NrZXRzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLk5ldC5XZWJIZWFkZXJDb2xsZWN0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLk5ldC5XZWJTb2NrZXRzLkNsaWVudC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuV2ViU29ja2V0cy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTnVtZXJpY3MuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uT2JqZWN0TW9kZWwuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUmVmbGVjdGlvbi5FeHRlbnNpb25zLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJlZmxlY3Rpb24uUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SZWZsZWN0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJlc291cmNlcy5SZWFkZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlci5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SZXNvdXJjZXMuV3JpdGVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5WaXN1YWxDLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuRXh0ZW5zaW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SdW50aW1lLkhhbmRsZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuUnVudGltZUluZm9ybWF0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuTnVtZXJpY3MuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkpzb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlhtbC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5TZWN1cml0eS5DbGFpbXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LkFsZ29yaXRobXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LkNzcC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuRW5jb2RpbmcuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlByaW1pdGl2ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlNlY3VyaXR5LlNlY3VyZVN0cmluZy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5TZXJ2aWNlTW9kZWwuV2ViLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRleHQuRW5jb2RpbmcuRXh0ZW5zaW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UZXh0LkVuY29kaW5nLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRocmVhZGluZy5PdmVybGFwcGVkLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRocmVhZGluZy5UYXNrcy5QYXJhbGxlbC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UaHJlYWRpbmcuVGFza3MuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UaHJlYWRpbmcuVGhyZWFkUG9vbC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UaHJlYWRpbmcuVGltZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uVGhyZWFkaW5nLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRyYW5zYWN0aW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5WYWx1ZVR1cGxlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLldlYi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5XaW5kb3dzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlhtbC5MaW5xLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlhtbC5SZWFkZXJXcml0ZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLlNlcmlhbGl6YXRpb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLlhEb2N1bWVudC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5YbWwuWFBhdGguWERvY3VtZW50LmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlhtbC5YUGF0aC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5YbWwuWG1sRG9jdW1lbnQuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLlhtbFNlcmlhbGl6ZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvbXNjb3JsaWIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9uZXRzdGFuZGFyZC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL25ldHN0YW5kYXJkLnhtbCIsDQogICAgICAgICJsaWIvbmV0c3RhbmRhcmQxLjAvXy5fIiwNCiAgICAgICAgIm5ldHN0YW5kYXJkLmxpYnJhcnkuMi4wLjAubnVwa2cuc2hhNTEyIiwNCiAgICAgICAgIm5ldHN0YW5kYXJkLmxpYnJhcnkubnVzcGVjIg0KICAgICAgXQ0KICAgIH0NCiAgfSwNCiAgInByb2plY3RGaWxlRGVwZW5kZW5jeUdyb3VwcyI6IHsNCiAgICAiLk5FVFN0YW5kYXJkLFZlcnNpb249djIuMCI6IFsNCiAgICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5ID49IDIuMC4wIg0KICAgIF0NCiAgfSwNCiAgInBhY2thZ2VGb2xkZXJzIjogew0KICAgICJDOlxcVXNlcnNcXEZyaWVkcmljaFxcLm51Z2V0XFxwYWNrYWdlc1xcIjoge30sDQogICAgIkM6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxNaWNyb3NvZnQgU0RLc1xcTnVHZXRQYWNrYWdlc0ZhbGxiYWNrXFwiOiB7fSwNCiAgICAiQzpcXFByb2dyYW0gRmlsZXNcXGRvdG5ldFxcc2RrXFxOdUdldEZhbGxiYWNrRm9sZGVyIjoge30NCiAgfSwNCiAgInByb2plY3QiOiB7DQogICAgInZlcnNpb24iOiAiMS4wLjAiLA0KICAgICJyZXN0b3JlU2V0dGluZ3MiOiB7DQogICAgICAiaGlkZVdhcm5pbmdzQW5kRXJyb3JzIjogdHJ1ZQ0KICAgIH0sDQogICAgInJlc3RvcmUiOiB7DQogICAgICAicHJvamVjdFVuaXF1ZU5hbWUiOiAiRjpcXENvZGVcXEdpdGh1YlxcUFNNb2R1bGVEZXZlbG9wbWVudFxcdGVtcGxhdGVzXFxQU0ZQcm9qZWN0XFxsaWJyYXJ5XFzDvm5hbWXDvlxcw75uYW1lw75cXMO+bmFtZcO+LmNzcHJvaiIsDQogICAgICAicHJvamVjdE5hbWUiOiAiw75uYW1lw74iLA0KICAgICAgInByb2plY3RQYXRoIjogIkY6XFxDb2RlXFxHaXRodWJcXFBTTW9kdWxlRGV2ZWxvcG1lbnRcXHRlbXBsYXRlc1xcUFNGUHJvamVjdFxcbGlicmFyeVxcw75uYW1lw75cXMO+bmFtZcO+XFzDvm5hbWXDvi5jc3Byb2oiLA0KICAgICAgInBhY2thZ2VzUGF0aCI6ICJDOlxcVXNlcnNcXEZyaWVkcmljaFxcLm51Z2V0XFxwYWNrYWdlc1xcIiwNCiAgICAgICJvdXRwdXRQYXRoIjogIkY6XFxDb2RlXFxHaXRodWJcXFBTTW9kdWxlRGV2ZWxvcG1lbnRcXHRlbXBsYXRlc1xcUFNGUHJvamVjdFxcbGlicmFyeVxcw75uYW1lw75cXMO+bmFtZcO+XFxvYmpcXCIsDQogICAgICAicHJvamVjdFN0eWxlIjogIlBhY2thZ2VSZWZlcmVuY2UiLA0KICAgICAgImZhbGxiYWNrRm9sZGVycyI6IFsNCiAgICAgICAgIkM6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxNaWNyb3NvZnQgU0RLc1xcTnVHZXRQYWNrYWdlc0ZhbGxiYWNrXFwiLA0KICAgICAgICAiQzpcXFByb2dyYW0gRmlsZXNcXGRvdG5ldFxcc2RrXFxOdUdldEZhbGxiYWNrRm9sZGVyIg0KICAgICAgXSwNCiAgICAgICJjb25maWdGaWxlUGF0aHMiOiBbDQogICAgICAgICJDOlxcVXNlcnNcXEZyaWVkcmljaFxcQXBwRGF0YVxcUm9hbWluZ1xcTnVHZXRcXE51R2V0LkNvbmZpZyIsDQogICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcTnVHZXRcXENvbmZpZ1xcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5PZmZsaW5lLmNvbmZpZyIsDQogICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcTnVHZXRcXENvbmZpZ1xcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5PZmZsaW5lLkZhbGxiYWNrLmNvbmZpZyINCiAgICAgIF0sDQogICAgICAib3JpZ2luYWxUYXJnZXRGcmFtZXdvcmtzIjogWw0KICAgICAgICAibmV0c3RhbmRhcmQyLjAiDQogICAgICBdLA0KICAgICAgInNvdXJjZXMiOiB7DQogICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcTWljcm9zb2Z0IFNES3NcXE51R2V0UGFja2FnZXNcXCI6IHt9LA0KICAgICAgICAiaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24iOiB7fQ0KICAgICAgfSwNCiAgICAgICJmcmFtZXdvcmtzIjogew0KICAgICAgICAibmV0c3RhbmRhcmQyLjAiOiB7DQogICAgICAgICAgInByb2plY3RSZWZlcmVuY2VzIjoge30NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJ3YXJuaW5nUHJvcGVydGllcyI6IHsNCiAgICAgICAgIndhcm5Bc0Vycm9yIjogWw0KICAgICAgICAgICJOVTE2MDUiDQogICAgICAgIF0NCiAgICAgIH0NCiAgICB9LA0KICAgICJmcmFtZXdvcmtzIjogew0KICAgICAgIm5ldHN0YW5kYXJkMi4wIjogew0KICAgICAgICAiZGVwZW5kZW5jaWVzIjogew0KICAgICAgICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5Ijogew0KICAgICAgICAgICAgInN1cHByZXNzUGFyZW50IjogIkFsbCIsDQogICAgICAgICAgICAidGFyZ2V0IjogIlBhY2thZ2UiLA0KICAgICAgICAgICAgInZlcnNpb24iOiAiWzIuMC4wLCApIiwNCiAgICAgICAgICAgICJhdXRvUmVmZXJlbmNlZCI6IHRydWUNCiAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgICJpbXBvcnRzIjogWw0KICAgICAgICAgICJuZXQ0NjEiDQogICAgICAgIF0sDQogICAgICAgICJhc3NldFRhcmdldEZhbGxiYWNrIjogdHJ1ZSwNCiAgICAgICAgIndhcm4iOiB0cnVlDQogICAgICB9DQogICAgfQ0KICB9DQp9AQl3AAAACXgAAAAGeQAAABNwcm9qZWN0LmFzc2V0cy5qc29uBnoAAAAxbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxvYmpccHJvamVjdC5hc3NldHMuanNvbgkGAAAACXwAAAAJfQAAAAFkAAAAFgAAAAZ+AAAAlQF7DQogICJ2ZXJzaW9uIjogMSwNCiAgImRnU3BlY0hhc2giOiAianRSTUQzOWpsSnVQclJCWWlYVDRtZTBjOThoV2U4QWJKWUYwQlpxYWNSSXk4bktnbjJXVWFlOWJrMms5M0JqNmk3eGR4MDF1VXpkWjlZVDd1UGtPSUE9PSIsDQogICJzdWNjZXNzIjogdHJ1ZQ0KfQEJfwAAAAmAAAAABoEAAAAbw75uYW1lw74uY3Nwcm9qLm51Z2V0LmNhY2hlBoIAAAA5bGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxvYmpcw75uYW1lw74uY3Nwcm9qLm51Z2V0LmNhY2hlCQYAAAAJhAAAAAmFAAAAAWUAAAAWAAAABoYAAACHCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiBzdGFuZGFsb25lPSJubyI/Pg0KPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCiAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRXhjbHVkZVJlc3RvcmVQYWNrYWdlSW1wb3J0cyknICE9ICd0cnVlJyAiPg0KICAgIDxSZXN0b3JlU3VjY2VzcyBDb25kaXRpb249IiAnJChSZXN0b3JlU3VjY2VzcyknID09ICcnICI+VHJ1ZTwvUmVzdG9yZVN1Y2Nlc3M+DQogICAgPFJlc3RvcmVUb29sIENvbmRpdGlvbj0iICckKFJlc3RvcmVUb29sKScgPT0gJycgIj5OdUdldDwvUmVzdG9yZVRvb2w+DQogICAgPFByb2plY3RBc3NldHNGaWxlIENvbmRpdGlvbj0iICckKFByb2plY3RBc3NldHNGaWxlKScgPT0gJycgIj5GOlxDb2RlXEdpdGh1YlxQU01vZHVsZURldmVsb3BtZW50XHRlbXBsYXRlc1xQU0ZQcm9qZWN0XGxpYnJhcnlcw75uYW1lw75cw75uYW1lw75cb2JqXHByb2plY3QuYXNzZXRzLmpzb248L1Byb2plY3RBc3NldHNGaWxlPg0KICAgIDxOdUdldFBhY2thZ2VSb290IENvbmRpdGlvbj0iICckKE51R2V0UGFja2FnZVJvb3QpJyA9PSAnJyAiPiQoVXNlclByb2ZpbGUpXC5udWdldFxwYWNrYWdlc1w8L051R2V0UGFja2FnZVJvb3Q+DQogICAgPE51R2V0UGFja2FnZUZvbGRlcnMgQ29uZGl0aW9uPSIgJyQoTnVHZXRQYWNrYWdlRm9sZGVycyknID09ICcnICI+QzpcVXNlcnNcRnJpZWRyaWNoXC5udWdldFxwYWNrYWdlc1w7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgU0RLc1xOdUdldFBhY2thZ2VzRmFsbGJhY2tcO0M6XFByb2dyYW0gRmlsZXNcZG90bmV0XHNka1xOdUdldEZhbGxiYWNrRm9sZGVyPC9OdUdldFBhY2thZ2VGb2xkZXJzPg0KICAgIDxOdUdldFByb2plY3RTdHlsZSBDb25kaXRpb249IiAnJChOdUdldFByb2plY3RTdHlsZSknID09ICcnICI+UGFja2FnZVJlZmVyZW5jZTwvTnVHZXRQcm9qZWN0U3R5bGU+DQogICAgPE51R2V0VG9vbFZlcnNpb24gQ29uZGl0aW9uPSIgJyQoTnVHZXRUb29sVmVyc2lvbiknID09ICcnICI+NC41LjA8L051R2V0VG9vbFZlcnNpb24+DQogIDwvUHJvcGVydHlHcm91cD4NCiAgPFByb3BlcnR5R3JvdXA+DQogICAgPE1TQnVpbGRBbGxQcm9qZWN0cz4kKE1TQnVpbGRBbGxQcm9qZWN0cyk7JChNU0J1aWxkVGhpc0ZpbGVGdWxsUGF0aCk8L01TQnVpbGRBbGxQcm9qZWN0cz4NCiAgPC9Qcm9wZXJ0eUdyb3VwPg0KPC9Qcm9qZWN0PgEJhwAAAAmIAAAABokAAAAdw75uYW1lw74uY3Nwcm9qLm51Z2V0LmcucHJvcHMGigAAADtsaWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XG9ialzDvm5hbWXDvi5jc3Byb2oubnVnZXQuZy5wcm9wcwkGAAAACYwAAAAJjQAAAAFmAAAAFgAAAAaOAAAApgU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCjxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQogIDxQcm9wZXJ0eUdyb3VwPg0KICAgIDxNU0J1aWxkQWxsUHJvamVjdHM+JChNU0J1aWxkQWxsUHJvamVjdHMpOyQoTVNCdWlsZFRoaXNGaWxlRnVsbFBhdGgpPC9NU0J1aWxkQWxsUHJvamVjdHM+DQogIDwvUHJvcGVydHlHcm91cD4NCiAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iICckKEV4Y2x1ZGVSZXN0b3JlUGFja2FnZUltcG9ydHMpJyAhPSAndHJ1ZScgIj4NCiAgICA8SW1wb3J0IFByb2plY3Q9IkM6XFByb2dyYW0gRmlsZXNcZG90bmV0XHNka1xOdUdldEZhbGxiYWNrRm9sZGVyXG5ldHN0YW5kYXJkLmxpYnJhcnlcMi4wLjBcYnVpbGRcbmV0c3RhbmRhcmQyLjBcTkVUU3RhbmRhcmQuTGlicmFyeS50YXJnZXRzIiBDb25kaXRpb249IkV4aXN0cygnQzpcUHJvZ3JhbSBGaWxlc1xkb3RuZXRcc2RrXE51R2V0RmFsbGJhY2tGb2xkZXJcbmV0c3RhbmRhcmQubGlicmFyeVwyLjAuMFxidWlsZFxuZXRzdGFuZGFyZDIuMFxORVRTdGFuZGFyZC5MaWJyYXJ5LnRhcmdldHMnKSIgLz4NCiAgPC9JbXBvcnRHcm91cD4NCjwvUHJvamVjdD4BCY8AAAAJkAAAAAaRAAAAH8O+bmFtZcO+LmNzcHJvai5udWdldC5nLnRhcmdldHMGkgAAAD1saWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XG9ialzDvm5hbWXDvi5jc3Byb2oubnVnZXQuZy50YXJnZXRzCQYAAAAJlAAAAAmVAAAAAWoAAAADAAAACZYAAAAAAAAAAAAAAAFuAAAABwAAAAkKAAAAAAAAAAAAAAABbwAAAAcAAAAJCgAAAAAAAAAAAAAAAXAAAAADAAAACZYAAAAAAAAAAAAAAAF0AAAABwAAAAkKAAAAAAAAAAAAAAABdQAAAAcAAAAJCgAAAAAAAAAAAAAAAXcAAAAHAAAACZoAAAABAAAAAQAAAAF4AAAABwAAAAkKAAAAAAAAAAAAAAABfAAAAAcAAAAJCgAAAAAAAAAAAAAAAX0AAAAHAAAACQoAAAAAAAAAAAAAAAF/AAAABwAAAAkKAAAAAAAAAAAAAAABgAAAAAcAAAAJCgAAAAAAAAAAAAAAAYQAAAAHAAAACZwAAAABAAAAAQAAAAGFAAAABwAAAAkKAAAAAAAAAAAAAAABhwAAAAcAAAAJngAAAAEAAAABAAAAAYgAAAAHAAAACQoAAAAAAAAAAAAAAAGMAAAABwAAAAmgAAAAAQAAAAEAAAABjQAAAAcAAAAJCgAAAAAAAAAAAAAAAY8AAAAHAAAACQoAAAAAAAAAAAAAAAGQAAAABwAAAAkKAAAAAAAAAAAAAAABlAAAAAcAAAAJogAAAAEAAAABAAAAAZUAAAAHAAAACQoAAAAAAAAAAAAAAAeWAAAAAAEAAAAAAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAAEZoAAAAEAAAABqQAAAAEbmFtZQ0DEZwAAAAEAAAABqUAAAAEbmFtZQ0DEZ4AAAAEAAAABqYAAAAEbmFtZQ0DEaAAAAAEAAAABqcAAAAEbmFtZQ0DEaIAAAAEAAAABqgAAAAEbmFtZQ0DCw==</BA>
            </MS>
          </Obj>
          <Obj RefId="20">
            <TNRef RefId="6" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString>
            <Props>
              <Obj N="Children" RefId="21">
                <TNRef RefId="5" />
                <LST>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFolder</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                  <S>PSModuleDevelopment.Template.TemplateItemFile</S>
                </LST>
              </Obj>
              <S N="Name">þnameþ</S>
              <S N="RelativePath">þnameþ</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="22">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="23">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAACMO+bmFtZcO+BgUAAAAIw75uYW1lw74GBgAAAALDvgkHAAAACQgAAAAEAwAAAJ4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAC9QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2VbXQIAAAAICAkJAAAACAAAAAgAAAAEBwAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkKAAAAAQAAAAEAAAABCAAAAAcAAAAJCwAAAAAAAAAAAAAABwkAAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAAEQoAAAAEAAAABhQAAAAEbmFtZQ0DEQsAAAAAAAAAAQwAAAABAAAACRUAAAAGFgAAAANiaW4GFwAAAAzDvm5hbWXDvlxiaW4JBgAAAAkZAAAACRoAAAABDQAAAAEAAAAJGwAAAAYcAAAABWVuLXVzBh0AAAAOw75uYW1lw75cZW4tdXMJBgAAAAkfAAAACSAAAAABDgAAAAEAAAAJIQAAAAYiAAAACWZ1bmN0aW9ucwYjAAAAEsO+bmFtZcO+XGZ1bmN0aW9ucwkGAAAACSUAAAAJJgAAAAEPAAAAAQAAAAknAAAABigAAAAIaW50ZXJuYWwGKQAAABHDvm5hbWXDvlxpbnRlcm5hbAkGAAAACSsAAAAJLAAAAAEQAAAAAQAAAAktAAAABi4AAAAFdGVzdHMGLwAAAA7Dvm5hbWXDvlx0ZXN0cwkGAAAACTEAAAAJMgAAAAERAAAAAQAAAAkzAAAABjQAAAADeG1sBjUAAAAMw75uYW1lw75ceG1sCQYAAAAJNwAAAAk4AAAABRIAAAAtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1GaWxlCQAAAAVWYWx1ZQlQbGFpblRleHQUQ29udGVudFBhcmFtZXRlckZsYXQWQ29udGVudFBhcmFtZXRlclNjcmlwdAROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQBAAMDAQEBAwMBf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABjkAAACeGEB7DQoJIyBTY3JpcHQgbW9kdWxlIG9yIGJpbmFyeSBtb2R1bGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYW5pZmVzdA0KCU1vZHVsZVRvUHJvY2VzcyA9ICfDvm5hbWXDvi5wc20xJw0KCQ0KCSMgVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBtb2R1bGUuDQoJTW9kdWxlVmVyc2lvbiA9ICcxLjAuMC4wJw0KCQ0KCSMgSUQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIG1vZHVsZQ0KCUdVSUQgPSAnw74hZ3VpZCHDvicNCgkNCgkjIEF1dGhvciBvZiB0aGlzIG1vZHVsZQ0KCUF1dGhvciA9ICfDvmF1dGhvcsO+Jw0KCQ0KCSMgQ29tcGFueSBvciB2ZW5kb3Igb2YgdGhpcyBtb2R1bGUNCglDb21wYW55TmFtZSA9ICfDvmNvbXBhbnnDvicNCgkNCgkjIENvcHlyaWdodCBzdGF0ZW1lbnQgZm9yIHRoaXMgbW9kdWxlDQoJQ29weXJpZ2h0ID0gJ0NvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+Jw0KCQ0KCSMgRGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUNCglEZXNjcmlwdGlvbiA9ICfDvmRlc2NyaXB0aW9uw74nDQoJDQoJIyBNaW5pbXVtIHZlcnNpb24gb2YgdGhlIFdpbmRvd3MgUG93ZXJTaGVsbCBlbmdpbmUgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCglQb3dlclNoZWxsVmVyc2lvbiA9ICc1LjAnDQoJDQoJIyBOYW1lIG9mIHRoZSBXaW5kb3dzIFBvd2VyU2hlbGwgaG9zdCByZXF1aXJlZCBieSB0aGlzIG1vZHVsZQ0KCSMgUG93ZXJTaGVsbEhvc3ROYW1lID0gJycNCgkNCgkjIE1pbmltdW0gdmVyc2lvbiBvZiB0aGUgV2luZG93cyBQb3dlclNoZWxsIGhvc3QgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCgkjIFBvd2VyU2hlbGxIb3N0VmVyc2lvbiA9ICcnDQoJDQoJIyBNaW5pbXVtIHZlcnNpb24gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIHJlcXVpcmVkIGJ5IHRoaXMgbW9kdWxlDQoJIyBEb3ROZXRGcmFtZXdvcmtWZXJzaW9uID0gJzIuMCcNCgkNCgkjIE1pbmltdW0gdmVyc2lvbiBvZiB0aGUgY29tbW9uIGxhbmd1YWdlIHJ1bnRpbWUgKENMUikgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCgkjIENMUlZlcnNpb24gPSAnMi4wLjUwNzI3Jw0KCQ0KCSMgUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSAoTm9uZSwgWDg2LCBBbWQ2NCwgSUE2NCkgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCgkjIFByb2Nlc3NvckFyY2hpdGVjdHVyZSA9ICdOb25lJw0KCQ0KCSMgTW9kdWxlcyB0aGF0IG11c3QgYmUgaW1wb3J0ZWQgaW50byB0aGUgZ2xvYmFsIGVudmlyb25tZW50IHByaW9yIHRvIGltcG9ydGluZw0KCSMgdGhpcyBtb2R1bGUNCglSZXF1aXJlZE1vZHVsZXMgPSBAKA0KCQlAeyBNb2R1bGVOYW1lPSdQU0ZyYW1ld29yayc7IE1vZHVsZVZlcnNpb249JzAuOS4xMC4yMycgfQ0KCSkNCgkNCgkjIEFzc2VtYmxpZXMgdGhhdCBtdXN0IGJlIGxvYWRlZCBwcmlvciB0byBpbXBvcnRpbmcgdGhpcyBtb2R1bGUNCgkjIFJlcXVpcmVkQXNzZW1ibGllcyA9IEAoKQ0KCQ0KCSMgU2NyaXB0IGZpbGVzICgucHMxKSB0aGF0IGFyZSBydW4gaW4gdGhlIGNhbGxlcidzIGVudmlyb25tZW50IHByaW9yIHRvDQoJIyBpbXBvcnRpbmcgdGhpcyBtb2R1bGUNCgkjIFNjcmlwdHNUb1Byb2Nlc3MgPSBAKCkNCgkNCgkjIFR5cGUgZmlsZXMgKC5wczF4bWwpIHRvIGJlIGxvYWRlZCB3aGVuIGltcG9ydGluZyB0aGlzIG1vZHVsZQ0KCSMgVHlwZXNUb1Byb2Nlc3MgPSBAKCd4bWxcw75uYW1lw74uVHlwZXMucHMxeG1sJykNCgkNCgkjIEZvcm1hdCBmaWxlcyAoLnBzMXhtbCkgdG8gYmUgbG9hZGVkIHdoZW4gaW1wb3J0aW5nIHRoaXMgbW9kdWxlDQoJIyBGb3JtYXRzVG9Qcm9jZXNzID0gQCgneG1sXMO+bmFtZcO+LkZvcm1hdC5wczF4bWwnKQ0KCQ0KCSMgTW9kdWxlcyB0byBpbXBvcnQgYXMgbmVzdGVkIG1vZHVsZXMgb2YgdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4NCgkjIE1vZHVsZVRvUHJvY2Vzcw0KCSMgTmVzdGVkTW9kdWxlcyA9IEAoKQ0KCQ0KCSMgRnVuY3Rpb25zIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJRnVuY3Rpb25zVG9FeHBvcnQgPSAnJw0KCQ0KCSMgQ21kbGV0cyB0byBleHBvcnQgZnJvbSB0aGlzIG1vZHVsZQ0KCUNtZGxldHNUb0V4cG9ydCA9ICcnDQoJDQoJIyBWYXJpYWJsZXMgdG8gZXhwb3J0IGZyb20gdGhpcyBtb2R1bGUNCglWYXJpYWJsZXNUb0V4cG9ydCA9ICcnDQoJDQoJIyBBbGlhc2VzIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJQWxpYXNlc1RvRXhwb3J0ID0gJycNCgkNCgkjIExpc3Qgb2YgYWxsIG1vZHVsZXMgcGFja2FnZWQgd2l0aCB0aGlzIG1vZHVsZQ0KCU1vZHVsZUxpc3QgPSBAKCkNCgkNCgkjIExpc3Qgb2YgYWxsIGZpbGVzIHBhY2thZ2VkIHdpdGggdGhpcyBtb2R1bGUNCglGaWxlTGlzdCA9IEAoKQ0KCQ0KCSMgUHJpdmF0ZSBkYXRhIHRvIHBhc3MgdG8gdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4gTW9kdWxlVG9Qcm9jZXNzLiBUaGlzIG1heSBhbHNvIGNvbnRhaW4gYSBQU0RhdGEgaGFzaHRhYmxlIHdpdGggYWRkaXRpb25hbCBtb2R1bGUgbWV0YWRhdGEgdXNlZCBieSBQb3dlclNoZWxsLg0KCVByaXZhdGVEYXRhID0gQHsNCgkJDQoJCSNTdXBwb3J0IGZvciBQb3dlclNoZWxsR2V0IGdhbGxlcmllcy4NCgkJUFNEYXRhID0gQHsNCgkJCQ0KCQkJIyBUYWdzIGFwcGxpZWQgdG8gdGhpcyBtb2R1bGUuIFRoZXNlIGhlbHAgd2l0aCBtb2R1bGUgZGlzY292ZXJ5IGluIG9ubGluZSBnYWxsZXJpZXMuDQoJCQkjIFRhZ3MgPSBAKCkNCgkJCQ0KCQkJIyBBIFVSTCB0byB0aGUgbGljZW5zZSBmb3IgdGhpcyBtb2R1bGUuDQoJCQkjIExpY2Vuc2VVcmkgPSAnJw0KCQkJDQoJCQkjIEEgVVJMIHRvIHRoZSBtYWluIHdlYnNpdGUgZm9yIHRoaXMgcHJvamVjdC4NCgkJCSMgUHJvamVjdFVyaSA9ICcnDQoJCQkNCgkJCSMgQSBVUkwgdG8gYW4gaWNvbiByZXByZXNlbnRpbmcgdGhpcyBtb2R1bGUuDQoJCQkjIEljb25VcmkgPSAnJw0KCQkJDQoJCQkjIFJlbGVhc2VOb3RlcyBvZiB0aGlzIG1vZHVsZQ0KCQkJIyBSZWxlYXNlTm90ZXMgPSAnJw0KCQkJDQoJCX0gIyBFbmQgb2YgUFNEYXRhIGhhc2h0YWJsZQ0KCQkNCgl9ICMgRW5kIG9mIFByaXZhdGVEYXRhIGhhc2h0YWJsZQ0KfQEJOgAAAAk7AAAABjwAAAANw75uYW1lw74ucHNkMQY9AAAAFsO+bmFtZcO+XMO+bmFtZcO+LnBzZDEJBgAAAAk/AAAACUAAAAABEwAAABIAAAAGQQAAAJENJHNjcmlwdDpNb2R1bGVSb290ID0gJFBTU2NyaXB0Um9vdA0KJHNjcmlwdDpNb2R1bGVWZXJzaW9uID0gIjEuMC4wLjAiDQoNCmZ1bmN0aW9uIEltcG9ydC1Nb2R1bGVGaWxlDQp7DQoJPCMNCgkJLlNZTk9QU0lTDQoJCQlMb2FkcyBmaWxlcyBpbnRvIHRoZSBtb2R1bGUgb24gbW9kdWxlIGltcG9ydC4NCgkJDQoJCS5ERVNDUklQVElPTg0KCQkJVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCBkdXJpbmcgbW9kdWxlIGluaXRpYWxpemF0aW9uLg0KCQkJSXQgc2hvdWxkIGFsd2F5cyBiZSBkb3Rzb3VyY2VkIGl0c2VsZiwgaW4gb3JkZXIgdG8gcHJvcGVyIGZ1bmN0aW9uLg0KCQkJDQoJCQlUaGlzIHByb3ZpZGVzIGEgY2VudHJhbCBsb2NhdGlvbiB0byByZWFjdCB0byBmaWxlcyBiZWluZyBpbXBvcnRlZCwgaWYgbGF0ZXIgZGVzaXJlZA0KCQkNCgkJLlBBUkFNRVRFUiBQYXRoDQoJCQlUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBsb2FkDQoJCQ0KCQkuRVhBTVBMRQ0KCQkJUFMgQzpcPiAuIEltcG9ydC1Nb2R1bGVGaWxlIC1GaWxlICRmdW5jdGlvbi5GdWxsTmFtZQ0KCQ0KCQkJSW1wb3J0cyB0aGUgZmlsZSBzdG9yZWQgaW4gJGZ1bmN0aW9uIGFjY29yZGluZyB0byBpbXBvcnQgcG9saWN5DQoJIz4NCglbQ21kbGV0QmluZGluZygpXQ0KCVBhcmFtICgNCgkJW3N0cmluZ10NCgkJJFBhdGgNCgkpDQoJDQoJaWYgKCRkb0RvdFNvdXJjZSkgeyAuICRQYXRoIH0NCgllbHNlIHsgJEV4ZWN1dGlvbkNvbnRleHQuSW52b2tlQ29tbWFuZC5JbnZva2VTY3JpcHQoJGZhbHNlLCAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKFtpby5maWxlXTo6UmVhZEFsbFRleHQoJFBhdGgpKSksICRudWxsLCAkbnVsbCkgfQ0KfQ0KDQojIERldGVjdCB3aGV0aGVyIGF0IHNvbWUgbGV2ZWwgZG90c291cmNpbmcgd2FzIGVuZm9yY2VkDQokc2NyaXB0OmRvRG90U291cmNlID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSDDvm5hbWXDvi5JbXBvcnQuRG9Eb3RTb3VyY2UgLUZhbGxiYWNrICRmYWxzZQ0KaWYgKCTDvm5hbWXDvl9kb3Rzb3VyY2Vtb2R1bGUpIHsgJHNjcmlwdDpkb0RvdFNvdXJjZSA9ICR0cnVlIH0NCg0KIyBFeGVjdXRlIFByZWltcG9ydCBhY3Rpb25zDQouIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICIkTW9kdWxlUm9vdFxpbnRlcm5hbFxzY3JpcHRzXHByZWltcG9ydC5wczEiDQoNCiMgSW1wb3J0IGFsbCBpbnRlcm5hbCBmdW5jdGlvbnMNCmZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQp7DQoJLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAkZnVuY3Rpb24uRnVsbE5hbWUNCn0NCg0KIyBJbXBvcnQgYWxsIHB1YmxpYyBmdW5jdGlvbnMNCmZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQp7DQoJLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAkZnVuY3Rpb24uRnVsbE5hbWUNCn0NCg0KIyBFeGVjdXRlIFBvc3RpbXBvcnQgYWN0aW9ucw0KLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcc2NyaXB0c1xwb3N0aW1wb3J0LnBzMSINCgEJQgAAAAlDAAAABkQAAAANw75uYW1lw74ucHNtMQZFAAAAFsO+bmFtZcO+XMO+bmFtZcO+LnBzbTEJBgAAAAlHAAAACUgAAAABFQAAAAMAAAAJSQAAAAAAAAAAAAAAARkAAAAHAAAACQsAAAAAAAAAAAAAAAEaAAAABwAAAAkLAAAAAAAAAAAAAAABGwAAAAMAAAAJSwAAAAEAAAABAAAAAR8AAAAHAAAACQsAAAAAAAAAAAAAAAEgAAAABwAAAAkLAAAAAAAAAAAAAAABIQAAAAMAAAAJTQAAAAEAAAABAAAAASUAAAAHAAAACQsAAAAAAAAAAAAAAAEmAAAABwAAAAkLAAAAAAAAAAAAAAABJwAAAAMAAAAJTwAAAAQAAAAEAAAAASsAAAAHAAAACQsAAAAAAAAAAAAAAAEsAAAABwAAAAkLAAAAAAAAAAAAAAABLQAAAAMAAAAJUQAAAAQAAAAEAAAAATEAAAAHAAAACQsAAAAAAAAAAAAAAAEyAAAABwAAAAkLAAAAAAAAAAAAAAABMwAAAAMAAAAJUwAAAAMAAAADAAAAATcAAAAHAAAACQsAAAAAAAAAAAAAAAE4AAAABwAAAAkLAAAAAAAAAAAAAAABOgAAAAcAAAAJVQAAAAQAAAAEAAAAATsAAAAHAAAACVYAAAACAAAAAgAAAAE/AAAABwAAAAlXAAAAAQAAAAEAAAABQAAAAAcAAAAJCwAAAAAAAAAAAAAAAUIAAAAHAAAACVkAAAABAAAAAQAAAAFDAAAABwAAAAkLAAAAAAAAAAAAAAABRwAAAAcAAAAJWwAAAAEAAAABAAAAAUgAAAAHAAAACQsAAAAAAAAAAAAAAAdJAAAAAAEAAAAAAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAAB0sAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJXQAAAA0DB00AAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJXgAAAA0DB08AAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJXwAAAAlgAAAACWEAAAAJYgAAAAdRAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACWMAAAAJZAAAAAllAAAACWYAAAAHUwAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAlnAAAACWgAAAAJaQAAAAoRVQAAAAQAAAAGagAAAARuYW1lBmsAAAAGYXV0aG9yBmwAAAAHY29tcGFueQZtAAAAC2Rlc2NyaXB0aW9uEVYAAAAEAAAABm4AAAAEZ3VpZAZvAAAABHllYXINAhFXAAAABAAAAAZwAAAABG5hbWUNAxFZAAAABAAAAAZxAAAABG5hbWUNAxFbAAAABAAAAAZyAAAABG5hbWUNAwFdAAAAEgAAAAZzAAAApQFUT1BJQw0KCWFib3V0X8O+bmFtZcO+DQoJDQpTSE9SVCBERVNDUklQVElPTg0KCUV4cGxhaW5zIGhvdyB0byB1c2UgdGhlIMO+bmFtZcO+IHBvd2Vyc2hlbGwgbW9kdWxlDQoJDQpMT05HIERFU0NSSVBUSU9ODQoJPEluc2VydCBDb250ZW50IGhlcmU+DQoNCktFWVdPUkRTDQoJw75uYW1lw74BCXQAAAAJdQAAAAZ2AAAAF2Fib3V0X8O+bmFtZcO+LmhlbHAudHh0BncAAAAmw75uYW1lw75cZW4tdXNcYWJvdXRfw75uYW1lw74uaGVscC50eHQJBgAAAAl5AAAACXoAAAABXgAAABIAAAAGewAAANIBIyBGdW5jdGlvbnMNCg0KVGhpcyBpcyB0aGUgZm9sZGVyIHdoZXJlIHRoZSBmdW5jdGlvbnMgZ28uDQoNCkRlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSBvZiB0aGUgbW9kdWxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzdWJkaXZpZGUgdGhlbSBpbnRvIHN1YmZvbGRlcnMuDQoNClRoZSBtb2R1bGUgd2lsbCBwaWNrIHVwIGFsbCAucHMxIGZpbGVzIHJlY3Vyc2l2ZWx5AQl8AAAACX0AAAAGfgAAAAlyZWFkbWUubWQGfwAAABzDvm5hbWXDvlxmdW5jdGlvbnNccmVhZG1lLm1kCQYAAAAJgQAAAAmCAAAAAV8AAAABAAAACYMAAAAGhAAAAA5jb25maWd1cmF0aW9ucwaFAAAAIMO+bmFtZcO+XGludGVybmFsXGNvbmZpZ3VyYXRpb25zCQYAAAAJhwAAAAmIAAAAAWAAAAABAAAACYkAAAAGigAAAAlmdW5jdGlvbnMGiwAAABvDvm5hbWXDvlxpbnRlcm5hbFxmdW5jdGlvbnMJBgAAAAmNAAAACY4AAAABYQAAAAEAAAAJjwAAAAaQAAAAB3NjcmlwdHMGkQAAABnDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzCQYAAAAJkwAAAAmUAAAAAWIAAAABAAAACZUAAAAGlgAAAAR0ZXBwBpcAAAAWw75uYW1lw75caW50ZXJuYWxcdGVwcAkGAAAACZkAAAAJmgAAAAFjAAAAAQAAAAmbAAAABpwAAAAJZnVuY3Rpb25zBp0AAAAYw75uYW1lw75cdGVzdHNcZnVuY3Rpb25zCQYAAAAJnwAAAAmgAAAAAWQAAAABAAAACaEAAAAGogAAAAdnZW5lcmFsBqMAAAAWw75uYW1lw75cdGVzdHNcZ2VuZXJhbAkGAAAACaUAAAAJpgAAAAFlAAAAEgAAAAanAAAA1RRwYXJhbSAoDQoJJFNob3cgPSAiTm9uZSINCikNCg0KV3JpdGUtSG9zdCAiU3RhcnRpbmcgVGVzdHMiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4NCmlmICgkZW52OkJVSUxEX0JVSUxEVVJJIC1saWtlICJ2c3RmcyoiKQ0Kew0KCVdyaXRlLUhvc3QgIkluc3RhbGxpbmcgUGVzdGVyIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4NCiAgICBJbnN0YWxsLU1vZHVsZSBQZXN0ZXIgLUZvcmNlIC1Ta2lwUHVibGlzaGVyQ2hlY2sNCglXcml0ZS1Ib3N0ICJJbnN0YWxsaW5nIFBTRnJhbWV3b3JrIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4NCglJbnZva2UtV2ViUmVxdWVzdCAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1Bvd2Vyc2hlbGxGcmFtZXdvcmtDb2xsZWN0aXZlL3BzZnJhbWV3b3JrL21hc3Rlci9pbnN0YWxsLnBzMSIgLVVzZUJhc2ljUGFyc2luZyB8IEludm9rZS1FeHByZXNzaW9uDQp9DQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiSW1wb3J0aW5nIE1vZHVsZSINCg0KUmVtb3ZlLU1vZHVsZSDDvm5hbWXDviAtRXJyb3JBY3Rpb24gSWdub3JlDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzZDEiDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzbTEiIC1Gb3JjZQ0KDQokdG90YWxGYWlsZWQgPSAwDQokdG90YWxSdW4gPSAwDQoNCiR0ZXN0cmVzdWx0cyA9IEAoKQ0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIk1vZHVsZXMgaW1wb3J0ZWQsIHByb2NlZWRpbmcgd2l0aCBnZW5lcmFsIHRlc3RzIg0KZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiRQU1NjcmlwdFJvb3RcZ2VuZXJhbCIgLUZpbHRlciAiKi5UZXN0cy5wczEiKSkNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBTaWduaWZpY2FudCAtTWVzc2FnZSAiICBFeGVjdXRpbmcgPGM9J2VtJz4kKCRmaWxlLk5hbWUpPC9jPiINCgkkcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLVNjcmlwdCAkZmlsZS5GdWxsTmFtZSAtU2hvdyAkU2hvdyAtUGFzc1RocnUNCglmb3JlYWNoICgkcmVzdWx0IGluICRyZXN1bHRzKQ0KCXsNCgkJJHRvdGFsUnVuICs9ICRyZXN1bHQuVG90YWxDb3VudA0KCQkkdG90YWxGYWlsZWQgKz0gJHJlc3VsdC5GYWlsZWRDb3VudA0KCQkkcmVzdWx0LlRlc3RSZXN1bHQgfCBXaGVyZS1PYmplY3QgeyAtbm90ICRfLlBhc3NlZCB9IHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJJG5hbWUgPSAkXy5OYW1lDQoJCQkkdGVzdHJlc3VsdHMgKz0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCQkJRGVzY3JpYmUgID0gJF8uRGVzY3JpYmUNCgkJCQlDb250ZXh0ICAgPSAkXy5Db250ZXh0DQoJCQkJTmFtZQkgID0gIkl0ICRuYW1lIg0KCQkJCVJlc3VsdCAgICA9ICRfLlJlc3VsdA0KCQkJCU1lc3NhZ2UgICA9ICRfLkZhaWx1cmVNZXNzYWdlDQoJCQl9DQoJCX0NCgl9DQp9DQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiUHJvY2VlZGluZyB3aXRoIGluZGl2aWR1YWwgdGVzdHMiDQpmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIipUZXN0cy4ucHMxIikpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nICQoJGZpbGUuTmFtZSkiDQoJJHJlc3VsdHMgPSBJbnZva2UtUGVzdGVyIC1TY3JpcHQgJGZpbGUuRnVsbE5hbWUgLVNob3cgTm9uZSAtUGFzc1RocnUNCglmb3JlYWNoICgkcmVzdWx0IGluICRyZXN1bHRzKQ0KCXsNCgkJJHRvdGFsUnVuICs9ICRyZXN1bHQuVG90YWxDb3VudA0KCQkkdG90YWxGYWlsZWQgKz0gJHJlc3VsdC5GYWlsZWRDb3VudA0KCQkkcmVzdWx0LlRlc3RSZXN1bHQgfCBXaGVyZS1PYmplY3QgeyAtbm90ICRfLlBhc3NlZCB9IHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJJG5hbWUgPSAkXy5OYW1lDQoJCQkkdGVzdHJlc3VsdHMgKz0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCQkJRGVzY3JpYmUgICA9ICRfLkRlc2NyaWJlDQoJCQkJQ29udGV4dCAgICA9ICRfLkNvbnRleHQNCgkJCQlOYW1lCSAgID0gIkl0ICRuYW1lIg0KCQkJCVJlc3VsdAkgICA9ICRfLlJlc3VsdA0KCQkJCU1lc3NhZ2UgICAgPSAkXy5GYWlsdXJlTWVzc2FnZQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQokdGVzdHJlc3VsdHMgfCBTb3J0LU9iamVjdCBEZXNjcmliZSwgQ29udGV4dCwgTmFtZSwgUmVzdWx0LCBNZXNzYWdlIHwgRm9ybWF0LUxpc3QNCg0KaWYgKCR0b3RhbEZhaWxlZCAtZXEgMCkgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBDcml0aWNhbCAtTWVzc2FnZSAiQWxsIDxjPSdlbSc+JHRvdGFsUnVuPC9jPiB0ZXN0cyBleGVjdXRlZCB3aXRob3V0IGEgc2luZ2xlIGZhaWx1cmUhIiB9DQplbHNlIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIjxjPSdlbSc+JHRvdGFsRmFpbGVkIHRlc3RzPC9jPiBvdXQgb2YgPGM9J3N1Yic+JHRvdGFsUnVuPC9jPiB0ZXN0cyBmYWlsZWQhIiB9DQoNCmlmICgkdG90YWxGYWlsZWQgLWd0IDApDQp7DQoJdGhyb3cgIiR0b3RhbEZhaWxlZCAvICR0b3RhbFJ1biB0ZXN0cyBmYWlsZWQhIg0KfQEJqAAAAAmpAAAABqoAAAAKcGVzdGVyLnBzMQarAAAAGcO+bmFtZcO+XHRlc3RzXHBlc3Rlci5wczEJBgAAAAmtAAAACa4AAAABZgAAABIAAAAGrwAAAKIHIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHRoZSBmb2xkZXIsIHdoZXJlIGFsbCB0aGUgdGVzdHMgZ28uDQoNClRob3NlIGFyZSBzdWJkaXZpZGVkIGluIHR3byBjYXRlZ29yaWVzOg0KDQogLSBHZW5lcmFsDQogLSBGdW5jdGlvbg0KDQojIyBHZW5lcmFsIFRlc3RzDQoNCkdlbmVyYWwgdGVzdHMgYXJlIGZ1bmN0aW9uIGdlbmVyaWMgYW5kIHRlc3QgZm9yIGdlbmVyYWwgcG9saWNpZXMuDQoNClRoZXNlIHRlc3Qgc2NhbiBhbnN3ZXIgcXVlc3Rpb25zIHN1Y2ggYXM6DQoNCiAtIElzIG15IG1vZHVsZSBmb2xsb3dpbmcgbXkgc3R5bGUgZ3VpZGVzPw0KIC0gRG9lcyBhbnkgb2YgbXkgc2NyaXB0cyBoYXZlIGEgc3ludGF4IGVycm9yPw0KIC0gRG8gbXkgc2NyaXB0cyB1c2UgY29tbWFuZHMgSSBkbyBub3Qgd2FudCB0aGVtIHRvIHVzZT8NCiAtIERvIG15IGNvbW1hbmRzIGZvbGxvdyBiZXN0IHByYWN0aWNlcz8NCiAtIERvIG15IGNvbW1hbmRzIGhhdmUgcHJvcGVyIGhlbHA/DQoNCkJhc2ljYWxseSwgdGhlc2UgYWxsb3cgYSBnZW5lcmFsIG1vZHVsZSBoZWFsdGggY2hlY2suDQoNClRoZXNlIHRlc3RzIGFyZSBhbHJlYWR5IHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhlIHRlbXBsYXRlLg0KDQojIyBGdW5jdGlvbiBUZXN0cw0KDQpBIGhlYWx0aHkgbW9kdWxlIHNob3VsZCBwcm92aWRlIHVuaXQgYW5kIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgY29tbWFuZHMgJiBjb21wb25lbnRzIGl0IHNoaXBzLg0KT25seSB0aGVuIGNhbiBiZSBndWFyYW50ZWVkLCB0aGF0IHRoZXkgd2lsbCBhY3R1YWxseSBwZXJmb3JtIGFzIHByb21pc2VkLg0KDQpIb3dldmVyLCBhcyBlYWNoIHN1Y2ggdGVzdCBtdXN0IGJlIHNwZWNpZmljIHRvIHRoZSBmdW5jdGlvbiBpdCB0ZXN0cywgdGhlcmUgY2Fubm90IGJlIG11Y2ggaW4gdGhlIHdheSBvZiB0ZW1wbGF0ZXMuAQmwAAAACbEAAAAGsgAAAAlyZWFkbWUubWQGswAAABjDvm5hbWXDvlx0ZXN0c1xyZWFkbWUubWQJBgAAAAm1AAAACbYAAAABZwAAABIAAAAGtwAAAKwLIyBYTUwNCg0KVGhpcyBpcyB0aGUgZm9sZGVyIHdoZXJlIHByb2plY3QgWE1MIGZpbGVzIGdvLCBub3RhYmx5Og0KDQogLSBGb3JtYXQgWE1MDQogLSBUeXBlIEV4dGVuc2lvbiBYTUwNCg0KRXh0ZXJuYWwgaGVscCBmaWxlcyBzaG91bGQgX25vdF8gYmUgcGxhY2VkIGluIHRoaXMgZm9sZGVyIQ0KDQojIyBOb3RlcyBvbiBGaWxlcyBhbmQgTmFtaW5nDQoNClRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBmb3JtYXQgZmlsZSBhbmQgb25lIHR5cGUgZXh0ZW5zaW9uIGZpbGUgcGVyIHByb2plY3QsIGFzIGltcG9ydGluZyB0aGVtIGhhcyBhIG5vdGFibGUgaW1wYWN0IG9uIGltcG9ydCB0aW1lcy4NCg0KIC0gVGhlIEZvcm1hdCBYTUwgc2hvdWxkIGJlIG5hbWVkIGDDvm5hbWXDvi5Gb3JtYXQucHMxeG1sYA0KIC0gVGhlIFR5cGUgRXh0ZW5zaW9uIFhNTCBzaG91bGQgYmUgbmFtZWQgYMO+bmFtZcO+LlR5cGVzLnBzMXhtbGANCg0KIyMgVG9vbHMNCg0KIyMjIE5ldy1QU01ERm9ybWF0VGFibGVEZWZpbml0aW9uDQoNClRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIGFuIGlucHV0IG9iamVjdCBhbmQgZ2VuZXJhdGUgZm9ybWF0IHhtbCBmb3IgYW4gYXV0by1zaXplZCB0YWJsZS4NCg0KSXQgcHJvdmlkZXMgYSBzaW1wbGUgd2F5IHRvIGdldCBzdGFydGVkIHdpdGggZm9ybWF0cy4NCg0KIyMjIEdldC1QU0ZUeXBlU2VyaWFsaXphdGlvbkRhdGENCg0KYGBgDQpDIyBXYXJuaW5nIQ0KVGhpcyBzZWN0aW9uIGlzIG9ubHkgaW50ZXJlc3QgaWYgeW91J3JlIHVzaW5nIEMjIHRvZ2V0aGVyIHdpdGggUG93ZXJTaGVsbC4NCmBgYA0KDQpUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyB0eXBlIGV4dGVuc2lvbiBYTUwgdGhhdCBhbGxvd3MgUG93ZXJTaGVsbCB0byBjb252ZXJ0IHR5cGVzIHdyaXR0ZW4gaW4gQyMgdG8gYmUgd3JpdHRlbiB0byBmaWxlIGFuZCByZXN0b3JlZCBmcm9tIGl0IHdpdGhvdXQgYmVpbmcgJ0Rlc2VyaWFsaXplZCcuIEFsc28gd29ya3MgZm9yIGpvYnMgb3IgcmVtb3RpbmcsIGlmIGJvdGggc2lkZXMgaGF2ZSB0aGUgYFBTRnJhbWV3b3JrYCBtb2R1bGUgYW5kIHR5cGUgZXh0ZW5zaW9uIGxvYWRlZC4NCg0KSW4gb3JkZXIgZm9yIGEgY2xhc3MgdG8gYmUgZWxpZ2libGUgZm9yIHRoaXMsIGl0IG5lZWRzIHRvIGNvbmZvcm0gdG8gdGhlIGZvbGxvd2luZyBydWxlczoNCg0KIC0gSGF2ZSB0aGUgYFtTZXJpYWxpemFibGVdYCBhdHRyaWJ1dGUNCiAtIEJlIHB1YmxpYw0KIC0gSGF2ZSBhbiBlbXB0eSBjb25zdHJ1Y3Rvcg0KIC0gQWxsb3cgYWxsIHB1YmxpYyBwcm9wZXJ0aWVzL2ZpZWxkcyB0byBiZSBzZXQgKGV2ZW4gaWYgc2V0dGluZyBpdCBkb2Vzbid0IGRvIGFueXRoaW5nKSB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4NCg0KYGBgDQpub24tcHVibGljIHByb3BlcnRpZXMgYW5kIGZpZWxkcyB3aWxsIGJlIGxvc3QgaW4gdGhpcyBwcm9jZXNzIQ0KYGBgAQm4AAAACbkAAAAGugAAAAlyZWFkbWUubWQGuwAAABbDvm5hbWXDvlx4bWxccmVhZG1lLm1kCQYAAAAJvQAAAAm+AAAAAWgAAAASAAAABr8AAADnBTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi0xNiI/Pg0KPENvbmZpZ3VyYXRpb24+DQoJPFZpZXdEZWZpbml0aW9ucz4NCgkJPCEtLSBGb28uQmFyIC0tPg0KCQk8Vmlldz4NCgkJCTxOYW1lPkZvby5CYXI8L05hbWU+DQoJCQk8Vmlld1NlbGVjdGVkQnk+DQoJCQkJPFR5cGVOYW1lPkZvby5CYXI8L1R5cGVOYW1lPg0KCQkJPC9WaWV3U2VsZWN0ZWRCeT4NCgkJCTxUYWJsZUNvbnRyb2w+DQoJCQkJPEF1dG9TaXplLz4NCgkJCQk8VGFibGVIZWFkZXJzPg0KCQkJCQk8VGFibGVDb2x1bW5IZWFkZXIvPg0KCQkJCQk8VGFibGVDb2x1bW5IZWFkZXIvPg0KCQkJCTwvVGFibGVIZWFkZXJzPg0KCQkJCTxUYWJsZVJvd0VudHJpZXM+DQoJCQkJCTxUYWJsZVJvd0VudHJ5Pg0KCQkJCQkJPFRhYmxlQ29sdW1uSXRlbXM+DQoJCQkJCQkJPFRhYmxlQ29sdW1uSXRlbT4NCgkJCQkJCQkJPFByb3BlcnR5TmFtZT5Gb288L1Byb3BlcnR5TmFtZT4NCgkJCQkJCQk8L1RhYmxlQ29sdW1uSXRlbT4NCgkJCQkJCQk8VGFibGVDb2x1bW5JdGVtPg0KCQkJCQkJCQk8UHJvcGVydHlOYW1lPkJhcjwvUHJvcGVydHlOYW1lPg0KCQkJCQkJCTwvVGFibGVDb2x1bW5JdGVtPg0KCQkJCQkJPC9UYWJsZUNvbHVtbkl0ZW1zPg0KCQkJCQk8L1RhYmxlUm93RW50cnk+DQoJCQkJPC9UYWJsZVJvd0VudHJpZXM+DQoJCQk8L1RhYmxlQ29udHJvbD4NCgkJPC9WaWV3Pg0KCTwvVmlld0RlZmluaXRpb25zPg0KPENvbmZpZ3VyYXRpb24+AQnAAAAACcEAAAAGwgAAABbDvm5hbWXDvi5Gb3JtYXQucHMxeG1sBsMAAAAjw75uYW1lw75ceG1sXMO+bmFtZcO+LkZvcm1hdC5wczF4bWwJBgAAAAnFAAAACcYAAAABaQAAABIAAAAGxwAAAOAHPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxUeXBlcz4NCiAgPCEtLSBGb28uQmFyIC0tPg0KICA8VHlwZT4NCiAgICA8TmFtZT5EZXNlcmlhbGl6ZWQuRm9vLkJhcjwvTmFtZT4NCiAgICA8TWVtYmVycz4NCiAgICAgIDxNZW1iZXJTZXQ+DQogICAgICAgIDxOYW1lPlBTU3RhbmRhcmRNZW1iZXJzPC9OYW1lPg0KICAgICAgICA8TWVtYmVycz4NCiAgICAgICAgICA8Tm90ZVByb3BlcnR5Pg0KICAgICAgICAgICAgPE5hbWU+DQogICAgICAgICAgICAgIFRhcmdldFR5cGVGb3JEZXNlcmlhbGl6YXRpb24NCiAgICAgICAgICAgIDwvTmFtZT4NCiAgICAgICAgICAgIDxWYWx1ZT4NCiAgICAgICAgICAgICAgRm9vLkJhcg0KICAgICAgICAgICAgPC9WYWx1ZT4NCiAgICAgICAgICA8L05vdGVQcm9wZXJ0eT4NCiAgICAgICAgPC9NZW1iZXJzPg0KICAgICAgPC9NZW1iZXJTZXQ+DQogICAgPC9NZW1iZXJzPg0KICA8L1R5cGU+DQogIDxUeXBlPg0KICAgIDxOYW1lPkZvby5CYXI8L05hbWU+DQogICAgPE1lbWJlcnM+DQogICAgICA8Q29kZVByb3BlcnR5IElzSGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgPE5hbWU+U2VyaWFsaXphdGlvbkRhdGE8L05hbWU+DQogICAgICAgIDxHZXRDb2RlUmVmZXJlbmNlPg0KICAgICAgICAgIDxUeXBlTmFtZT5QU0ZyYW1ld29yay5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UeXBlQ29udmVydGVyPC9UeXBlTmFtZT4NCiAgICAgICAgICA8TWV0aG9kTmFtZT5HZXRTZXJpYWxpemF0aW9uRGF0YTwvTWV0aG9kTmFtZT4NCiAgICAgICAgPC9HZXRDb2RlUmVmZXJlbmNlPg0KICAgICAgPC9Db2RlUHJvcGVydHk+DQogICAgPC9NZW1iZXJzPg0KICAgIDxUeXBlQ29udmVydGVyPg0KICAgICAgPFR5cGVOYW1lPlBTRnJhbWV3b3JrLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblR5cGVDb252ZXJ0ZXI8L1R5cGVOYW1lPg0KICAgIDwvVHlwZUNvbnZlcnRlcj4NCiAgPC9UeXBlPg0KPC9UeXBlcz4BCcgAAAAJyQAAAAbKAAAAFcO+bmFtZcO+LlR5cGVzLnBzMXhtbAbLAAAAIsO+bmFtZcO+XHhtbFzDvm5hbWXDvi5UeXBlcy5wczF4bWwJBgAAAAnNAAAACc4AAAABdAAAAAcAAAAJzwAAAAEAAAABAAAAAXUAAAAHAAAACQsAAAAAAAAAAAAAAAF5AAAABwAAAAnRAAAAAQAAAAEAAAABegAAAAcAAAAJCwAAAAAAAAAAAAAAAXwAAAAHAAAACQsAAAAAAAAAAAAAAAF9AAAABwAAAAkLAAAAAAAAAAAAAAABgQAAAAcAAAAJCwAAAAAAAAAAAAAAAYIAAAAHAAAACQsAAAAAAAAAAAAAAAGDAAAAAwAAAAnTAAAAAgAAAAIAAAABhwAAAAcAAAAJCwAAAAAAAAAAAAAAAYgAAAAHAAAACQsAAAAAAAAAAAAAAAGJAAAAAwAAAAnVAAAAAQAAAAEAAAABjQAAAAcAAAAJCwAAAAAAAAAAAAAAAY4AAAAHAAAACQsAAAAAAAAAAAAAAAGPAAAAAwAAAAnXAAAAAwAAAAMAAAABkwAAAAcAAAAJCwAAAAAAAAAAAAAAAZQAAAAHAAAACQsAAAAAAAAAAAAAAAGVAAAAAwAAAAnZAAAAAwAAAAMAAAABmQAAAAcAAAAJCwAAAAAAAAAAAAAAAZoAAAAHAAAACQsAAAAAAAAAAAAAAAGbAAAAAwAAAAnbAAAAAQAAAAEAAAABnwAAAAcAAAAJCwAAAAAAAAAAAAAAAaAAAAAHAAAACQsAAAAAAAAAAAAAAAGhAAAAAwAAAAndAAAABgAAAAYAAAABpQAAAAcAAAAJCwAAAAAAAAAAAAAAAaYAAAAHAAAACQsAAAAAAAAAAAAAAAGoAAAABwAAAAnfAAAAAQAAAAEAAAABqQAAAAcAAAAJCwAAAAAAAAAAAAAAAa0AAAAHAAAACQsAAAAAAAAAAAAAAAGuAAAABwAAAAkLAAAAAAAAAAAAAAABsAAAAAcAAAAJCwAAAAAAAAAAAAAAAbEAAAAHAAAACQsAAAAAAAAAAAAAAAG1AAAABwAAAAkLAAAAAAAAAAAAAAABtgAAAAcAAAAJCwAAAAAAAAAAAAAAAbgAAAAHAAAACeEAAAABAAAAAQAAAAG5AAAABwAAAAkLAAAAAAAAAAAAAAABvQAAAAcAAAAJCwAAAAAAAAAAAAAAAb4AAAAHAAAACQsAAAAAAAAAAAAAAAHAAAAABwAAAAkLAAAAAAAAAAAAAAABwQAAAAcAAAAJCwAAAAAAAAAAAAAAAcUAAAAHAAAACeMAAAABAAAAAQAAAAHGAAAABwAAAAkLAAAAAAAAAAAAAAAByAAAAAcAAAAJCwAAAAAAAAAAAAAAAckAAAAHAAAACQsAAAAAAAAAAAAAAAHNAAAABwAAAAnlAAAAAQAAAAEAAAABzgAAAAcAAAAJCwAAAAAAAAAAAAAAEc8AAAAEAAAABucAAAAEbmFtZQ0DEdEAAAAEAAAABugAAAAEbmFtZQ0DB9MAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJ6QAAAAnqAAAADQIH1QAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAnrAAAADQMH1wAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAnsAAAACe0AAAAJ7gAAAAoH2QAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAnvAAAACfAAAAAJ8QAAAAoH2wAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAnyAAAADQMH3QAAAAABAAAACAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAnzAAAACfQAAAAJ9QAAAAn2AAAACfcAAAAJ+AAAAA0CEd8AAAAEAAAABvkAAAAEbmFtZQ0DEeEAAAAEAAAABvoAAAAEbmFtZQ0DEeMAAAAEAAAABvsAAAAEbmFtZQ0DEeUAAAAEAAAABvwAAAAEbmFtZQ0DAekAAAASAAAABv0AAAD9AzwjDQpUaGlzIGlzIGFuIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlDQoNCkJ5IGRlZmF1bHQsIGl0IGlzIGVub3VnaCB0byBoYXZlIGEgc2luZ2xlIG9uZSBvZiB0aGVtLA0KaG93ZXZlciBpZiB5b3UgaGF2ZSBlbm91Z2ggY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byBqdXN0aWZ5IGhhdmluZyBtdWx0aXBsZSBjb3BpZXMgb2YgaXQsDQpmZWVsIHRvdGFsbHkgZnJlZSB0byBzcGxpdCB0aGVtIGludG8gbXVsdGlwbGUgZmlsZXMuDQojPg0KDQo8Iw0KIyBFeGFtcGxlIENvbmZpZ3VyYXRpb24NClNldC1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdFeGFtcGxlLlNldHRpbmcnIC1WYWx1ZSAxMCAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiAnaW50ZWdlcicgLUhhbmRsZXIgeyB9IC1EZXNjcmlwdGlvbiAiRXhhbXBsZSBjb25maWd1cmF0aW9uIHNldHRpbmcuIFlvdXIgbW9kdWxlIGNhbiB0aGVuIHVzZSB0aGUgc2V0dGluZyB1c2luZyAnR2V0LVBTRkNvbmZpZ1ZhbHVlJyINCiM+AQn+AAAACf8AAAAGAAEAABFjb25maWd1cmF0aW9uLnBzMQYBAQAAMsO+bmFtZcO+XGludGVybmFsXGNvbmZpZ3VyYXRpb25zXGNvbmZpZ3VyYXRpb24ucHMxCQYAAAAJAwEAAAkEAQAAAeoAAAASAAAABgUBAAD+AyMgQ29uZmlndXJhdGlvbnMNCg0KVGhyb3VnaCB0aGUgYFBTRnJhbWV3b3JrYCB5b3UgaGF2ZSBhIHNpbXBsZSBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIC4uLg0KDQogLSBQdWJsaXNoIHNldHRpbmdzDQogLSBXaXRoIG9uYm9hcmQgZG9jdW1lbnRhdGlvbg0KIC0gSW5wdXQgdmFsaWRhdGlvbg0KIC0gU2NyaXB0cyB0aGF0IHJ1biBvbiBjaGFuZ2Ugb2Ygc2V0dGluZ3MNCiAtIFRoYXQgY2FuIGJlIGRpc2NvdmVyZWQgYW5kIHVwZGF0ZWQgYnkgdGhlIHVzZXINCiAtIFRoYXQgY2FuIGJlIGFkbWluaXN0cmF0ZWQgYnkgcG9saWN5ICYgRFNDDQoNClRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBpcyBhIGJpdCB0b28gY29tcGxleCB0byBkZXNjcmliZSBpbiBhIGhlbHAgZmlsZSwgeW91IGNhbiBob3dldmVyIHZpc2l0IHVzIGF0IGh0dHA6Ly9wc2ZyYW1ld29yay5vcmcgZm9yIGRldGFpbGVkIGd1aWRhbmNlLg0KDQpBbiBleGFtcGxlIGNhbiBiZSBzZWVuIGluIHRoZSBhdHRhY2hlZCBwczEgZmlsZQEJBgEAAAkHAQAABggBAAAJcmVhZG1lLm1kBgkBAAAqw75uYW1lw75caW50ZXJuYWxcY29uZmlndXJhdGlvbnNccmVhZG1lLm1kCQYAAAAJCwEAAAkMAQAAAesAAAASAAAABg0BAADbASMgRnVuY3Rpb25zDQoNClRoaXMgaXMgdGhlIGZvbGRlciB3aGVyZSB0aGUgaW50ZXJuYWwgZnVuY3Rpb25zIGdvLg0KDQpEZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlIG1vZHVsZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3ViZGl2aWRlIHRoZW0gaW50byBzdWJmb2xkZXJzLg0KDQpUaGUgbW9kdWxlIHdpbGwgcGljayB1cCBhbGwgLnBzMSBmaWxlcyByZWN1cnNpdmVseQEJDgEAAAkPAQAABhABAAAJcmVhZG1lLm1kBhEBAAAlw75uYW1lw75caW50ZXJuYWxcZnVuY3Rpb25zXHJlYWRtZS5tZAkGAAAACRMBAAAJFAEAAAHsAAAAEgAAAAYVAQAA8QlOZXctUFNGTGljZW5zZSAtUHJvZHVjdCAnw75uYW1lw74nIC1NYW51ZmFjdHVyZXIgJ8O+YXV0aG9yw74nIC1Qcm9kdWN0VmVyc2lvbiAkUFNNb2R1bGVWZXJzaW9uIC1Qcm9kdWN0VHlwZSBNb2R1bGUgLU5hbWUgTUlUIC1WZXJzaW9uICIxLjAuMC4wIiAtRGF0ZSAoR2V0LURhdGUgIsO+IWRhdGUhw74iKSAtVGV4dCBAIg0KQ29weXJpZ2h0IChjKSDDviF5ZWFyIcO+IMO+YXV0aG9yw74NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsDQpjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQ0KU09GVFdBUkUuDQoiQAEJFgEAAAkXAQAABhgBAAALbGljZW5zZS5wczEGGQEAACXDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXGxpY2Vuc2UucHMxCQYAAAAJGwEAAAkcAQAAAe0AAAASAAAABh0BAADTBCMgQWRkIGFsbCB0aGluZ3MgeW91IHdhbnQgdG8gcnVuIGFmdGVyIGltcG9ydGluZyB0aGUgbWFpbiBjb2RlDQoNCiMgTG9hZCBDb25maWd1cmF0aW9ucw0KZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiRNb2R1bGVSb290XGludGVybmFsXGNvbmZpZ3VyYXRpb25zXCoucHMxIiAtRXJyb3JBY3Rpb24gSWdub3JlKSkgew0KCS4gSW1wb3J0LU1vZHVsZUZpbGUgLVBhdGggJGZpbGUuRnVsbE5hbWUNCn0NCg0KIyBMb2FkIFRhYiBFeHBhbnNpb24NCmZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkTW9kdWxlUm9vdFxpbnRlcm5hbFx0ZXBwXCoudGVwcC5wczEiIC1FcnJvckFjdGlvbiBJZ25vcmUpKSB7DQoJLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAkZmlsZS5GdWxsTmFtZQ0KfQ0KDQojIExvYWQgVGFiIEV4cGFuc2lvbiBBc3NpZ25tZW50DQouIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICIkTW9kdWxlUm9vdFxpbnRlcm5hbFx0ZXBwXGFzc2lnbm1lbnQucHMxIg0KDQojIExvYWQgTGljZW5zZQ0KLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcc2NyaXB0c1xsaWNlbnNlLnBzMSIBCR4BAAAJHwEAAAYgAQAADnBvc3RpbXBvcnQucHMxBiEBAAAow75uYW1lw75caW50ZXJuYWxcc2NyaXB0c1xwb3N0aW1wb3J0LnBzMQkGAAAACSMBAAAJJAEAAAHuAAAAEgAAAAYlAQAAPyMgQWRkIGFsbCB0aGluZ3MgeW91IHdhbnQgdG8gcnVuIGJlZm9yZSBpbXBvcnRpbmcgdGhlIG1haW4gY29kZQEJJgEAAAknAQAABigBAAANcHJlaW1wb3J0LnBzMQYpAQAAJ8O+bmFtZcO+XGludGVybmFsXHNjcmlwdHNccHJlaW1wb3J0LnBzMQkGAAAACSsBAAAJLAEAAAHvAAAAEgAAAAYtAQAAcTwjDQojIEV4YW1wbGU6DQpSZWdpc3Rlci1QU0ZUZXBwQXJndW1lbnRDb21wbGV0ZXIgLUNvbW1hbmQgR2V0LUFsY29ob2wgLVBhcmFtZXRlciBUeXBlIC1OYW1lIMO+bmFtZcO+LmFsY29ob2wNCiM+AQkuAQAACS8BAAAGMAEAAA5hc3NpZ25tZW50LnBzMQYxAQAAJcO+bmFtZcO+XGludGVybmFsXHRlcHBcYXNzaWdubWVudC5wczEJBgAAAAkzAQAACTQBAAAB8AAAABIAAAAGNQEAAKMBPCMNCiMgRXhhbXBsZToNClJlZ2lzdGVyLVBTRlRlcHBTY3JpcHRibG9jayAtTmFtZSAiw75uYW1lw74uYWxjb2hvbCIgLVNjcmlwdEJsb2NrIHsgJ0JlZXInLCdNZWFkJywnV2hpc2tleScsJ1dpbmUnLCdWb2RrYScsJ1J1bSAoM3kpJywgJ1J1bSAoNXkpJywgJ1J1bSAoN3kpJyB9DQojPgEJNgEAAAk3AQAABjgBAAAQZXhhbXBsZS50ZXBwLnBzMQY5AQAAJ8O+bmFtZcO+XGludGVybmFsXHRlcHBcZXhhbXBsZS50ZXBwLnBzMQkGAAAACTsBAAAJPAEAAAHxAAAAEgAAAAY9AQAAvgcjIFRhYiBFeHBhbnNpb24NCg0KIyMgRGVzY3JpcHRpb24NCg0KTW9kZXJuIFRhYiBFeHBhbnNpb24gd2FzIG9wZW5lZCB0byB1c2VycyB3aXRoIHRoZSBtb2R1bGUgYFRhYiBFeHBhbnNpb24gUGx1cyBQbHVzYCAoVEVQUCkuDQoNCkl0IGFsbG93cyB5b3UgdG8gZGVmaW5lLCB3aGF0IG9wdGlvbnMgYSB1c2VyIGlzIG9mZmVyZWQgd2hlbiB0YWJiaW5nIHRocm91Z2ggaW5wdXQgb3B0aW9ucy4gVGhpcyBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lIGZvciB0aGUgdXNlciBhbmQgaXMgY29uc2lkZXJlZCBhIGtleSBlbGVtZW50IGluIHVzZXIgZXhwZXJpZW5jZS4NCg0KVGhlIGBQU0ZyYW1ld29ya2Agb2ZmZXJzIGEgc2ltcGxpZmllZCB3YXkgb2Ygb2ZmZXJpbmcganVzdCB0aGlzLCBhcyB0aGUgdHdvIGV4YW1wbGUgZmlsZXMgc2hvdy4NCg0KIyMgQ29uY2VwdA0KDQpDdXN0b20gdGFiIGNvbXBsZXRpb24gaXMgZGVmaW5lZCBpbiB0d28gc3RlcHM6DQoNCiAtIERlZmluZSBhIHNjcmlwdGJsb2NrIHRoYXQgaXMgcnVuIHdoZW4gdGhlIHVzZXIgaGl0cyBgVEFCYCBhbmQgcHJvdmlkZXMgdGhlIHN0cmluZ3MgdGhhdCBhcmUgaGlzIG9wdGlvbnMuDQogLSBBc3NpZ24gdGhhdCBzY3JpcHRibG9jayB0byB0aGUgcGFyYW1ldGVyIG9mIGEgY29tbWFuZC4gWW91IGNhbiBhc3NpZ24gdGhlIHNhbWUgc2NyaXB0YmxvY2sgbXVsdGlwbGUgdGltZXMuDQoNCiMjIFN0cnVjdHVyZQ0KDQpJbXBvcnQgb3JkZXIgbWF0dGVycy4gSW4gb3JkZXIgdG8gbWFrZSB0aGluZ3Mgd29yayB3aXRoIHRoZSBkZWZhdWx0IHNjYWZmb2xkLCBmb2xsb3cgdGhvc2UgcnVsZXM6DQoNCiAtIEFsbCBzY3JpcHRmaWxlcyBfZGVmaW5pbmdfIGNvbXBsZXRpb24gc2NyaXB0YmxvY2tzIGxpa2UgdGhpczogYCoudGVwcC5wczFgDQogLSBQdXQgYWxsIHlvdXIgY29tcGxldGlvbiBhc3NpZ25tZW50cyBpbiBgYXNzaWdubWVudC5wczFgAQk+AQAACT8BAAAGQAEAAAlyZWFkbWUubWQGQQEAACDDvm5hbWXDvlxpbnRlcm5hbFx0ZXBwXHJlYWRtZS5tZAkGAAAACUMBAAAJRAEAAAHyAAAAEgAAAAZFAQAA1QEjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgd2hlcmUgdGhlIGZ1bmN0aW9uIHRlc3RzIGdvLg0KDQpNYWtlIHN1cmUgdG8gcHV0IHRoZW0gaW4gZm9sZGVycyByZWZsZWN0aW5nIHRoZSBhY3R1YWwgbW9kdWxlIHN0cnVjdHVyZS4NCg0KSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaW50ZXJuYWwgYW5kIHB1YmxpYyBmdW5jdGlvbnMgaGVyZS4BCUYBAAAJRwEAAAZIAQAACXJlYWRtZS5tZAZJAQAAIsO+bmFtZcO+XHRlc3RzXGZ1bmN0aW9uc1xyZWFkbWUubWQJBgAAAAlLAQAACUwBAAAB8wAAABIAAAAGTQEAAMwEIyBMaXN0IG9mIGZvcmJpZGRlbiBjb21tYW5kcw0KJGdsb2JhbDpCYW5uZWRDb21tYW5kcyA9IEAoDQoJJ1dyaXRlLUhvc3QnLA0KCSdXcml0ZS1WZXJib3NlJywNCgknV3JpdGUtV2FybmluZycsDQoJJ1dyaXRlLUVycm9yJywNCgknV3JpdGUtT3V0cHV0JywNCgknV3JpdGUtSW5mb3JtYXRpb24nLA0KCSdXcml0ZS1EZWJ1ZycNCikNCg0KPCMNCglDb250YWlucyBsaXN0IG9mIGV4Y2VwdGlvbnMgZm9yIGJhbm5lZCBjbWRsZXRzLg0KCUluc2VydCB0aGUgZmlsZSBuYW1lcyBvZiBmaWxlcyB0aGF0IG1heSBjb250YWluIHRoZW0uDQoJDQoJRXhhbXBsZToNCgkiV3JpdGUtSG9zdCIgID0gQCgnV3JpdGUtUFNGSG9zdENvbG9yLnBzMScsJ1dyaXRlLVBTRk1lc3NhZ2UucHMxJykNCiM+DQokZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kID0gQHsNCgkiV3JpdGUtSG9zdCIgID0gQCgpDQoJIldyaXRlLVZlcmJvc2UiID0gQCgpDQoJIldyaXRlLVdhcm5pbmciID0gQCgpDQoJIldyaXRlLUVycm9yIiAgPSBAKCkNCgkiV3JpdGUtT3V0cHV0IiA9IEAoKQ0KCSJXcml0ZS1JbmZvcm1hdGlvbiIgPSBAKCkNCgkiV3JpdGUtRGVidWciID0gQCgpDQp9AQlOAQAACU8BAAAGUAEAABxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxBlEBAAAzw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxCQYAAAAJUwEAAAlUAQAAAfQAAAASAAAABlUBAAC0FiRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLiIpLlBhdGgNCg0KLiAiJFBTU2NyaXB0Um9vdFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxIg0KDQpmdW5jdGlvbiBHZXQtRmlsZUVuY29kaW5nDQp7DQo8Iw0KCS5TWU5PUFNJUw0KCQlUZXN0cyBhIGZpbGUgZm9yIGVuY29kaW5nLg0KCQ0KCS5ERVNDUklQVElPTg0KCQlUZXN0cyBhIGZpbGUgZm9yIGVuY29kaW5nLg0KCQ0KCS5QQVJBTUVURVIgUGF0aA0KCQlUaGUgZmlsZSB0byB0ZXN0DQojPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJUGFyYW0gKA0KCQlbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRUcnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJFRydWUpXQ0KCQlbQWxpYXMoJ0Z1bGxOYW1lJyldDQoJCVtzdHJpbmddDQoJCSRQYXRoDQoJKQ0KCQ0KCVtieXRlW11dJGJ5dGUgPSBnZXQtY29udGVudCAtRW5jb2RpbmcgYnl0ZSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQ0KCWlmICgkYnl0ZVswXSAtZXEgMHhlZiAtYW5kICRieXRlWzFdIC1lcSAweGJiIC1hbmQgJGJ5dGVbMl0gLWVxIDB4YmYpIHsgJ1VURjgnIH0NCgllbHNlaWYgKCRieXRlWzBdIC1lcSAweGZlIC1hbmQgJGJ5dGVbMV0gLWVxIDB4ZmYpIHsgJ1VuaWNvZGUnIH0NCgllbHNlaWYgKCRieXRlWzBdIC1lcSAwIC1hbmQgJGJ5dGVbMV0gLWVxIDAgLWFuZCAkYnl0ZVsyXSAtZXEgMHhmZSAtYW5kICRieXRlWzNdIC1lcSAweGZmKSB7ICdVVEYzMicgfQ0KCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDB4MmIgLWFuZCAkYnl0ZVsxXSAtZXEgMHgyZiAtYW5kICRieXRlWzJdIC1lcSAweDc2KSB7ICdVVEY3JyB9DQoJZWxzZSB7ICdVbmtub3duLCBwb3NzaWJsZSBBU0NJSScgfQ0KfQ0KDQpEZXNjcmliZSAiVmVyaWZ5aW5nIGludGVncml0eSBvZiBtb2R1bGUgZmlsZXMiIHsNCglDb250ZXh0ICJWYWxpZGF0aW5nIFBTMSBTY3JpcHQgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSAtRmlsdGVyICIqLnBzMSIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2RpbmciIHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIEJlICdVVEY4Jw0KCQkJfQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyB0cmFpbGluZyBzcGFjZSIgew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDB9IHwgTWVhc3VyZS1PYmplY3QpLkNvdW50IHwgU2hvdWxkIEJlIDANCgkJCX0NCgkJCQ0KCQkJJHRva2VucyA9ICRudWxsDQoJCQkkcGFyc2VFcnJvcnMgPSAkbnVsbA0KCQkJJGFzdCA9IFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkxhbmd1YWdlLlBhcnNlcl06OlBhcnNlRmlsZSgkZmlsZS5GdWxsTmFtZSwgW3JlZl0kdG9rZW5zLCBbcmVmXSRwYXJzZUVycm9ycykNCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gc3ludGF4IGVycm9ycyIgew0KCQkJCSRwYXJzZUVycm9ycyB8IFNob3VsZCBCZSAkTnVsbA0KCQkJfQ0KCQkJDQoJCQlmb3JlYWNoICgkY29tbWFuZCBpbiAkZ2xvYmFsOkJhbm5lZENvbW1hbmRzKQ0KCQkJew0KCQkJCWlmICgkZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kWyIkY29tbWFuZCJdIC1ub3Rjb250YWlucyAkZmlsZS5OYW1lKQ0KCQkJCXsNCgkJCQkJSXQgIlskbmFtZV0gU2hvdWxkIG5vdCB1c2UgJGNvbW1hbmQiIHsNCgkJCQkJCSR0b2tlbnMgfCBXaGVyZS1PYmplY3QgVGV4dCAtRVEgJGNvbW1hbmQgfCBTaG91bGQgQmUgJG51bGwNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIG5vdCBjb250YWluIGFsaWFzZXMiIHsNCgkJCQkkdG9rZW5zIHwgV2hlcmUtT2JqZWN0IFRva2VuRmxhZ3MgLWVxIENvbW1hbmROYW1lIHwgV2hlcmUtT2JqZWN0IHsgVGVzdC1QYXRoICJhbGlhczpcJCgkXy5UZXh0KSIgfSB8IE1lYXN1cmUtT2JqZWN0IHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgQ291bnQgfCBTaG91bGQgQmUgMA0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIlZhbGlkYXRpbmcgaGVscC50eHQgaGVscCBmaWxlcyIgew0KCQkkYWxsRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRtb2R1bGVSb290IC1SZWN1cnNlIC1GaWx0ZXIgIiouaGVscC50eHQiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIiB7DQoJCQkJR2V0LUZpbGVFbmNvZGluZyAtUGF0aCAkZmlsZS5GdWxsTmFtZSB8IFNob3VsZCBCZSAnVVRGOCcNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwIH0gfCBNZWFzdXJlLU9iamVjdCkuQ291bnQgfCBTaG91bGQgQmUgMA0KCQkJfQ0KCQl9DQoJfQ0KfQEJVgEAAAlXAQAABlgBAAAXRmlsZUludGVncml0eS5UZXN0cy5wczEGWQEAAC7Dvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXEZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxCQYAAAAJWwEAAAlcAQAAAfUAAAASAAAABl0BAACdBSMgTGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaWdub3JlZA0KJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyA9IEAoDQogICAgDQopDQoNCjwjDQogIExpc3Qgb2YgYXJyYXllZCBlbnVtZXJhdGlvbnMuIFRoZXNlIG5lZWQgdG8gYmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQWRkIGZ1bGwgbmFtZS4NCiAgRXhhbXBsZToNCg0KICAiU3FsY29sbGFib3JhdGl2ZS5EYmF0b29scy5Db25uZWN0aW9uLk1hbmFnZW1lbnRDb25uZWN0aW9uVHlwZVtdIg0KIz4NCiRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzID0gQCgNCgkNCikNCg0KPCMNCiAgU29tZSB0eXBlcyBvbiBwYXJhbWV0ZXJzIGp1c3QgZmFpbCB0aGVpciB2YWxpZGF0aW9uIG5vIG1hdHRlciB3aGF0Lg0KICBGb3IgdGhvc2UgaXQgYmVjb21lcyBwb3NzaWJsZSB0byBza2lwIHRoZW0sIGJ5IGFkZGluZyB0aGVtIHRvIHRoaXMgaGFzaHRhYmxlLg0KICBBZGQgYnkgZm9sbG93aW5nIHRoaXMgY29udmVudGlvbjogPGNvbW1hbmQgbmFtZT4gPSBAKDxsaXN0IG9mIHBhcmFtZXRlciBuYW1lcz4pDQogIEV4YW1wbGU6DQoNCiAgIkdldC1EYmFDbU9iamVjdCIgICAgICAgPSBAKCJEb05vdFVzZSIpDQojPg0KJGdsb2JhbDpIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlID0gQHsNCiAgICANCn0NCgEJXgEAAAlfAQAABmABAAATSGVscC5FeGNlcHRpb25zLnBzMQZhAQAAKsO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcSGVscC5FeGNlcHRpb25zLnBzMQkGAAAACWMBAAAJZAEAAAH2AAAAEgAAAAZlAQAA7kU8Iw0KICAgIC5OT1RFUw0KICAgICAgICBUaGUgb3JpZ2luYWwgdGVzdCB0aGlzIGlzIGJhc2VkIHVwb24gd2FzIHdyaXR0ZW4gYnkgSnVuZSBCbGVuZGVyLg0KCQlBZnRlciBzZXZlcmFsIHJvdW5kcyBvZiBtb2RpZmljYXRpb25zIGl0IHN0YW5kcyBub3cgYXMgaXQgaXMsIGJ1dCB0aGUgaG9ub3IgcmVtYWlucyBoZXJzLg0KDQoJCVRoYW5rIHlvdSBKdW5lLCBmb3IgYWxsIHlvdSBoYXZlIGRvbmUhDQoNCiAgICAuREVTQ1JJUFRJT04NCgkJVGhpcyB0ZXN0IGV2YWx1YXRlcyB0aGUgaGVscCBmb3IgYWxsIGNvbW1hbmRzIGluIGEgbW9kdWxlLg0KDQoJLlBBUkFNRVRFUiBTa2lwVGVzdA0KCQlEaXNhYmxlcyB0aGlzIHRlc3QuDQoJDQoJLlBBUkFNRVRFUiBDb21tYW5kUGF0aA0KCQlMaXN0IG9mIHBhdGhzIHVuZGVyIHdoaWNoIHRoZSBzY3JpcHQgZmlsZXMgYXJlIHN0b3JlZC4NCgkJVGhpcyB0ZXN0IGFzc3VtZXMgdGhhdCBhbGwgZnVuY3Rpb25zIGhhdmUgdGhlaXIgb3duIGZpbGUgdGhhdCBpcyBuYW1lZCBhZnRlciB0aGVtc2VsdmVzLg0KCQlUaGVzZSBwYXRocyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGV4aXN0IGFuZCBiZSB0ZXN0ZWQuDQoJCVdpbGwgc2VhcmNoIHJlY3Vyc2l2ZWx5IGFuZCBhY2NlcHRzIHdpbGRjYXJkcywgbWFrZSBzdXJlIG9ubHkgZnVuY3Rpb25zIGFyZSBmb3VuZA0KDQoJLlBBUkFNRVRFUiBNb2R1bGVOYW1lDQoJCU5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSB0ZXN0ZWQuDQoJCVRoZSBtb2R1bGUgbXVzdCBhbHJlYWR5IGJlIGltcG9ydGVkDQoNCgkuUEFSQU1FVEVSIEV4Y2VwdGlvbnNGaWxlDQoJCUZpbGUgaW4gd2hpY2ggZXhjZXB0aW9ucyBhbmQgYWRqdXN0bWVudHMgYXJlIGNvbmZpZ3VyZWQuDQoJCUluIGl0IHRoZXJlIHNob3VsZCBiZSB0d28gYXJyYXlzIGFuZCBhIGhhc2h0YWJsZSBkZWZpbmVkOg0KCQkJJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucw0KCQkJJGdsb2JhbDpIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMNCgkJCSRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZQ0KCQlUaGVzZSBjYW4gYmUgdXNlZCB0byB0d2VhayB0aGUgdGVzdHMgc2xpZ2h0bHkgaW4gY2FzZXMgb2YgbmVlZC4NCgkJU2VlIHRoZSBleGFtcGxlIGZpbGUgZm9yIGV4cGxhbmF0aW9ucyBvbiBlYWNoIG9mIHRoZXNlIHVzYWdlIGFuZCBlZmZlY3QuDQojPg0KW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCgkNCglbc3RyaW5nW11dDQoJJENvbW1hbmRQYXRoID0gQCgiJFBTU2NyaXB0Um9vdFwuLlwuLlxmdW5jdGlvbnMiLCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxpbnRlcm5hbFxmdW5jdGlvbnMiKSwNCgkNCglbc3RyaW5nXQ0KCSRNb2R1bGVOYW1lID0gIsO+bmFtZcO+IiwNCgkNCglbc3RyaW5nXQ0KCSRFeGNlcHRpb25zRmlsZSA9ICIkUFNTY3JpcHRSb290XEhlbHAuRXhjZXB0aW9ucy5wczEiDQopDQppZiAoJFNraXBUZXN0KSB7IHJldHVybiB9DQouICRFeGNlcHRpb25zRmlsZQ0KDQokaW5jbHVkZWROYW1lcyA9IChHZXQtQ2hpbGRJdGVtICRDb21tYW5kUGF0aCAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSIpLkJhc2VOYW1lDQokY29tbWFuZHMgPSBHZXQtQ29tbWFuZCAtTW9kdWxlIChHZXQtTW9kdWxlICRNb2R1bGVOYW1lKSAtQ29tbWFuZFR5cGUgQ21kbGV0LCBGdW5jdGlvbiwgV29ya2Zsb3cgfCBXaGVyZS1PYmplY3QgTmFtZSAtaW4gJGluY2x1ZGVkTmFtZXMNCg0KIyMgV2hlbiB0ZXN0aW5nIGhlbHAsIHJlbWVtYmVyIHRoYXQgaGVscCBpcyBjYWNoZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNlc3Npb24uDQojIyBUbyB0ZXN0LCByZXN0YXJ0IHNlc3Npb24uDQoNCg0KZm9yZWFjaCAoJGNvbW1hbmQgaW4gJGNvbW1hbmRzKSB7DQogICAgJGNvbW1hbmROYW1lID0gJGNvbW1hbmQuTmFtZQ0KICAgIA0KICAgICMgU2tpcCBhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIG9uIHRoZSBleGNsdXNpb25zIGxpc3QNCiAgICBpZiAoJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyAtY29udGFpbnMgJGNvbW1hbmROYW1lKSB7IGNvbnRpbnVlIH0NCiAgICANCiAgICAjIFRoZSBtb2R1bGUtcXVhbGlmaWVkIGNvbW1hbmQgZmFpbHMgb24gTWljcm9zb2Z0LlBvd2VyU2hlbGwuQXJjaGl2ZSBjbWRsZXRzDQogICAgJEhlbHAgPSBHZXQtSGVscCAkY29tbWFuZE5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCiAgICAkdGVzdGhlbHBlcnJvcnMgPSAwDQogICAgJHRlc3RoZWxwYWxsID0gMA0KICAgIERlc2NyaWJlICJUZXN0IGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICANCiAgICAgICAgJHRlc3RoZWxwYWxsICs9IDENCiAgICAgICAgaWYgKCRIZWxwLlN5bm9wc2lzIC1saWtlICcqYFtgPENvbW1vblBhcmFtZXRlcnNgPmBdKicpIHsNCiAgICAgICAgICAgICMgSWYgaGVscCBpcyBub3QgZm91bmQsIHN5bm9wc2lzIGluIGF1dG8tZ2VuZXJhdGVkIGhlbHAgaXMgdGhlIHN5bnRheCBkaWFncmFtDQogICAgICAgICAgICBJdCAic2hvdWxkIG5vdCBiZSBhdXRvLWdlbmVyYXRlZCIgew0KICAgICAgICAgICAgICAgICRIZWxwLlN5bm9wc2lzIHwgU2hvdWxkIE5vdCBCZUxpa2UgJypgW2A8Q29tbW9uUGFyYW1ldGVyc2A+YF0qJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRlc3RoZWxwZXJyb3JzICs9IDENCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHRlc3RoZWxwYWxsICs9IDENCiAgICAgICAgaWYgKFtTdHJpbmddOjpJc051bGxPckVtcHR5KCRIZWxwLkRlc2NyaXB0aW9uLlRleHQpKSB7DQogICAgICAgICAgICAjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBmdW5jdGlvbg0KICAgICAgICAgICAgSXQgImdldHMgZGVzY3JpcHRpb24gZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgICAgICRIZWxwLkRlc2NyaXB0aW9uIHwgU2hvdWxkIE5vdCBCZU51bGxPckVtcHR5DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgKz0gMQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkdGVzdGhlbHBhbGwgKz0gMQ0KICAgICAgICBpZiAoW1N0cmluZ106OklzTnVsbE9yRW1wdHkoKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5Db2RlKSkgew0KICAgICAgICAgICAgIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUNCiAgICAgICAgICAgIEl0ICJnZXRzIGV4YW1wbGUgY29kZSBmcm9tICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgICAgICgkSGVscC5FeGFtcGxlcy5FeGFtcGxlIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuQ29kZSB8IFNob3VsZCBOb3QgQmVOdWxsT3JFbXB0eQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRlc3RoZWxwZXJyb3JzICs9IDENCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHRlc3RoZWxwYWxsICs9IDENCiAgICAgICAgaWYgKFtTdHJpbmddOjpJc051bGxPckVtcHR5KCgkSGVscC5FeGFtcGxlcy5FeGFtcGxlLlJlbWFya3MgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5UZXh0KSkgew0KICAgICAgICAgICAgIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUgZGVzY3JpcHRpb24NCiAgICAgICAgICAgIEl0ICJnZXRzIGV4YW1wbGUgaGVscCBmcm9tICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgICAgICgkSGVscC5FeGFtcGxlcy5FeGFtcGxlLlJlbWFya3MgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5UZXh0IHwgU2hvdWxkIE5vdCBCZU51bGxPckVtcHR5DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgKz0gMQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoJHRlc3RoZWxwZXJyb3JzIC1lcSAwKSB7DQogICAgICAgICAgICBJdCAiUmFuIHNpbGVudGx5ICR0ZXN0aGVscGFsbCB0ZXN0cyIgew0KICAgICAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyB8IFNob3VsZCBiZSAwDQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICR0ZXN0cGFyYW1zYWxsID0gMA0KICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyA9IDANCiAgICAgICAgQ29udGV4dCAiVGVzdCBwYXJhbWV0ZXIgaGVscCBmb3IgJGNvbW1hbmROYW1lIiB7DQogICAgICAgICAgICANCiAgICAgICAgICAgICRDb21tb24gPSAnRGVidWcnLCAnRXJyb3JBY3Rpb24nLCAnRXJyb3JWYXJpYWJsZScsICdJbmZvcm1hdGlvbkFjdGlvbicsICdJbmZvcm1hdGlvblZhcmlhYmxlJywgJ091dEJ1ZmZlcicsICdPdXRWYXJpYWJsZScsDQogICAgICAgICAgICAnUGlwZWxpbmVWYXJpYWJsZScsICdWZXJib3NlJywgJ1dhcm5pbmdBY3Rpb24nLCAnV2FybmluZ1ZhcmlhYmxlJw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcGFyYW1ldGVycyA9ICRjb21tYW5kLlBhcmFtZXRlclNldHMuUGFyYW1ldGVycyB8IFNvcnQtT2JqZWN0IC1Qcm9wZXJ0eSBOYW1lIC1VbmlxdWUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbm90aW4gJGNvbW1vbg0KICAgICAgICAgICAgJHBhcmFtZXRlck5hbWVzID0gJHBhcmFtZXRlcnMuTmFtZQ0KICAgICAgICAgICAgJEhlbHBQYXJhbWV0ZXJOYW1lcyA9ICRIZWxwLlBhcmFtZXRlcnMuUGFyYW1ldGVyLk5hbWUgfCBTb3J0LU9iamVjdCAtVW5pcXVlDQogICAgICAgICAgICBmb3JlYWNoICgkcGFyYW1ldGVyIGluICRwYXJhbWV0ZXJzKSB7DQogICAgICAgICAgICAgICAgJHBhcmFtZXRlck5hbWUgPSAkcGFyYW1ldGVyLk5hbWUNCiAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscCA9ICRIZWxwLnBhcmFtZXRlcnMucGFyYW1ldGVyIHwgV2hlcmUtT2JqZWN0IE5hbWUgLUVRICRwYXJhbWV0ZXJOYW1lDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNhbGwgKz0gMQ0KICAgICAgICAgICAgICAgIGlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkcGFyYW1ldGVySGVscC5EZXNjcmlwdGlvbi5UZXh0KSkgew0KICAgICAgICAgICAgICAgICAgICAjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBwYXJhbWV0ZXINCiAgICAgICAgICAgICAgICAgICAgSXQgImdldHMgaGVscCBmb3IgcGFyYW1ldGVyOiAkcGFyYW1ldGVyTmFtZSA6IGluICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAuRGVzY3JpcHRpb24uVGV4dCB8IFNob3VsZCBOb3QgQmVOdWxsT3JFbXB0eQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNhbGwgKz0gMQ0KICAgICAgICAgICAgICAgICRjb2RlTWFuZGF0b3J5ID0gJHBhcmFtZXRlci5Jc01hbmRhdG9yeS50b1N0cmluZygpDQogICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXJIZWxwLlJlcXVpcmVkIC1uZSAkY29kZU1hbmRhdG9yeSkgew0KICAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkIHZhbHVlIGluIEhlbHAgc2hvdWxkIG1hdGNoIElzTWFuZGF0b3J5IHByb3BlcnR5IG9mIHBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgICBJdCAiaGVscCBmb3IgJHBhcmFtZXRlck5hbWUgcGFyYW1ldGVyIGluICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBNYW5kYXRvcnkgdmFsdWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwLlJlcXVpcmVkIHwgU2hvdWxkIEJlICRjb2RlTWFuZGF0b3J5DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJEhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGVbJGNvbW1hbmROYW1lXSAtY29udGFpbnMgJHBhcmFtZXRlck5hbWUpIHsgY29udGludWUgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRjb2RlVHlwZSA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5OYW1lDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNhbGwgKz0gMQ0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuSXNFbnVtKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUpDQogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIC1uZSAkbmFtZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIGJlICRuYW1lcw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2VpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkZ1bGxOYW1lIC1pbiAkSGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gW0VudW1dOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRGVjbGFyZWRNZW1iZXJzWzBdLlJldHVyblR5cGUpDQogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIC1uZSAkbmFtZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIGJlICRuYW1lcw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGNhbGxpbmcgVHJpbSBtZXRob2Qgb24gYSBudWxsIG9iamVjdC4NCiAgICAgICAgICAgICAgICAgICAgJGhlbHBUeXBlID0gaWYgKCRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlKSB7ICRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlLlRyaW0oKSB9DQogICAgICAgICAgICAgICAgICAgIGlmICgkaGVscFR5cGUgLW5lICRjb2RlVHlwZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQogICAgICAgICAgICAgICAgICAgICAgICBJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWxwVHlwZSB8IFNob3VsZCBiZSAkY29kZVR5cGUNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcmVhY2ggKCRoZWxwUGFybSBpbiAkSGVscFBhcmFtZXRlck5hbWVzKSB7DQogICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNhbGwgKz0gMQ0KICAgICAgICAgICAgICAgIGlmICgkaGVscFBhcm0gLW5vdGluICRwYXJhbWV0ZXJOYW1lcykgew0KICAgICAgICAgICAgICAgICAgICAjIFNob3VsZG4ndCBmaW5kIGV4dHJhIHBhcmFtZXRlcnMgaW4gaGVscC4NCiAgICAgICAgICAgICAgICAgICAgSXQgImZpbmRzIGhlbHAgcGFyYW1ldGVyIGluIGNvZGU6ICRoZWxwUGFybSIgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGhlbHBQYXJtIC1pbiAkcGFyYW1ldGVyTmFtZXMgfCBTaG91bGQgQmUgJHRydWUNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCR0ZXN0cGFyYW1zZXJyb3JzIC1lcSAwKSB7DQogICAgICAgICAgICAgICAgSXQgIlJhbiBzaWxlbnRseSAkdGVzdHBhcmFtc2FsbCB0ZXN0cyIgew0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyB8IFNob3VsZCBiZSAwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQEJZgEAAAlnAQAABmgBAAAOSGVscC5UZXN0cy5wczEGaQEAACXDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXEhlbHAuVGVzdHMucHMxCQYAAAAJawEAAAlsAQAAAfcAAAASAAAABm0BAACzDURlc2NyaWJlICJWYWxpZGF0aW5nIHRoZSBtb2R1bGUgbWFuaWZlc3QiIHsNCgkkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi4iKS5QYXRoDQoJJG1hbmlmZXN0ID0gKChHZXQtQ29udGVudCAiJG1vZHVsZVJvb3Rcw75uYW1lw74ucHNkMSIpIC1qb2luICJgbiIpIHwgSW52b2tlLUV4cHJlc3Npb24NCglbdmVyc2lvbl0kbW9kdWxlVmVyc2lvbiA9IEdldC1JdGVtICIkbW9kdWxlUm9vdFzDvm5hbWXDvi5wc20xIiB8IFNlbGVjdC1TdHJpbmcgLVBhdHRlcm4gJ1wkc2NyaXB0OlBTTW9kdWxlVmVyc2lvbiA9ICIoLio/KSInIHwgRm9yRWFjaC1PYmplY3QgeyAkXy5NYXRjaGVzWzBdLkdyb3Vwc1sxXS5WYWx1ZSB9DQoJQ29udGV4dCAiQmFzaWMgcmVzb3VyY2VzIHZhbGlkYXRpb24iIHsNCgkJSXQgIkV4cG9ydHMgYWxsIGZ1bmN0aW9ucyBpbiB0aGUgcHVibGljIGZvbGRlciIgew0KCQkJJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSAtRmlsdGVyICIqLnBzMSINCgkJCSRjb3VudCA9IChDb21wYXJlLU9iamVjdCAtUmVmZXJlbmNlT2JqZWN0ICRmaWxlcy5CYXNlTmFtZSAtRGlmZmVyZW5jZU9iamVjdCAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQpLkNvdW50DQoJCQkkY291bnQgfCBTaG91bGQgYmUgMA0KCQl9DQoJCQ0KCQlJdCAiRXhwb3J0cyBub25lIG9mIGl0cyBpbnRlcm5hbCBmdW5jdGlvbnMiIHsNCgkJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGludGVybmFsXGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiDQoJCQkkZmlsZXMgfCBXaGVyZS1PYmplY3QgQmFzZU5hbWUgLUluICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFNob3VsZCBCZSAkbnVsbA0KCQl9DQoJCQ0KCQlJdCAiSGFzIHRoZSBzYW1lIHZlcnNpb24gYXMgdGhlIHBzbTEgZmlsZSIgew0KCQkJKFt2ZXJzaW9uXSRtYW5pZmVzdC5Nb2R1bGVWZXJzaW9uKSB8IFNob3VsZCBCZSAkbW9kdWxlVmVyc2lvbg0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIkluZGl2aWR1YWwgZmlsZSB2YWxpZGF0aW9uIiB7DQoJCUl0ICJUaGUgcm9vdCBtb2R1bGUgZmlsZSBleGlzdHMiIHsNCgkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJCgkbWFuaWZlc3QuUm9vdE1vZHVsZSkiIHwgU2hvdWxkIEJlICR0cnVlDQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRmb3JtYXQgaW4gJG1hbmlmZXN0LkZvcm1hdHNUb1Byb2Nlc3MpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkZm9ybWF0IHNob3VsZCBleGlzdCIgew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGZvcm1hdCIgfCBTaG91bGQgQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJHR5cGUgaW4gJG1hbmlmZXN0LlR5cGVzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJHR5cGUgc2hvdWxkIGV4aXN0IiB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkdHlwZSIgfCBTaG91bGQgQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGFzc2VtYmx5IGluICRtYW5pZmVzdC5SZXF1aXJlZEFzc2VtYmxpZXMpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkYXNzZW1ibHkgc2hvdWxkIGV4aXN0IiB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkYXNzZW1ibHkiIHwgU2hvdWxkIEJlICR0cnVlDQoJCQl9DQoJCX0NCgl9DQp9AQluAQAACW8BAAAGcAEAABJNYW5pZmVzdC5UZXN0cy5wczEGcQEAACnDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXE1hbmlmZXN0LlRlc3RzLnBzMQkGAAAACXMBAAAJdAEAAAH4AAAAEgAAAAZ1AQAApwhbQ21kbGV0QmluZGluZygpXQ0KUGFyYW0gKA0KCVtzd2l0Y2hdDQoJJFNraXBUZXN0LA0KCQ0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkUFNTY3JpcHRSb290XC4uXC4uXGZ1bmN0aW9ucyIsICIkUFNTY3JpcHRSb290XC4uXC4uXGludGVybmFsXGZ1bmN0aW9ucyIpDQopDQoNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCg0KaWYgKCRlbnY6QlVJTERfQlVJTERVUkkgLWxpa2UgInZzdGZzKiIpIHsgSW5zdGFsbC1Nb2R1bGUgUFNTY3JpcHRBbmFseXplciAtRm9yY2UgLVNraXBQdWJsaXNoZXJDaGVjayB9DQoNCiRsaXN0ID0gTmV3LU9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQoNCkRlc2NyaWJlICdJbnZva2luZyBQU1NjcmlwdEFuYWx5emVyIGFnYWluc3QgY29tbWFuZGJhc2UnIHsNCgkkY29tbWFuZEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkQ29tbWFuZFBhdGggLVJlY3Vyc2UgLUZpbHRlciAiKi5wczEiDQoJJHNjcmlwdEFuYWx5emVyUnVsZXMgPSBHZXQtU2NyaXB0QW5hbHl6ZXJSdWxlDQoJDQoJZm9yZWFjaCAoJGZpbGUgaW4gJGNvbW1hbmRGaWxlcykNCgl7DQoJCUNvbnRleHQgIkFuYWx5emluZyAkKCRmaWxlLkJhc2VOYW1lKSIgew0KCQkJJGFuYWx5c2lzID0gSW52b2tlLVNjcmlwdEFuYWx5emVyIC1QYXRoICRmaWxlLkZ1bGxOYW1lDQoJCQkNCgkJCWZvckVhY2ggKCRydWxlIGluICRzY3JpcHRBbmFseXplclJ1bGVzKQ0KCQkJew0KCQkJCUl0ICJTaG91bGQgcGFzcyAkcnVsZSIgew0KCQkJCQlJZiAoJGFuYWx5c2lzLlJ1bGVOYW1lIC1jb250YWlucyAkcnVsZSkNCgkJCQkJew0KCQkJCQkJJGFuYWx5c2lzIHwgV2hlcmUtT2JqZWN0IFJ1bGVOYW1lIC1FUSAkcnVsZSAtb3V0dmFyaWFibGUgZmFpbHVyZXMgfCBGb3JFYWNoLU9iamVjdCB7ICRsaXN0LkFkZCgkXykgfQ0KCQkJCQkJDQoJCQkJCQkxIHwgU2hvdWxkIEJlIDANCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCTAgfCBTaG91bGQgQmUgMA0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQokbGlzdCB8IE91dC1EZWZhdWx0AQl2AQAACXcBAAAGeAEAABpQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQZ5AQAAMcO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcUFNTY3JpcHRBbmFseXplci5UZXN0cy5wczEJBgAAAAl7AQAACXwBAAAB/gAAAAcAAAAJfQEAAAEAAAABAAAAAf8AAAAHAAAACQsAAAAAAAAAAAAAAAEDAQAABwAAAAkLAAAAAAAAAAAAAAABBAEAAAcAAAAJCwAAAAAAAAAAAAAAAQYBAAAHAAAACQsAAAAAAAAAAAAAAAEHAQAABwAAAAkLAAAAAAAAAAAAAAABCwEAAAcAAAAJCwAAAAAAAAAAAAAAAQwBAAAHAAAACQsAAAAAAAAAAAAAAAEOAQAABwAAAAkLAAAAAAAAAAAAAAABDwEAAAcAAAAJCwAAAAAAAAAAAAAAARMBAAAHAAAACQsAAAAAAAAAAAAAAAEUAQAABwAAAAkLAAAAAAAAAAAAAAABFgEAAAcAAAAJfwEAAAIAAAACAAAAARcBAAAHAAAACYABAAACAAAAAgAAAAEbAQAABwAAAAkLAAAAAAAAAAAAAAABHAEAAAcAAAAJCwAAAAAAAAAAAAAAAR4BAAAHAAAACQsAAAAAAAAAAAAAAAEfAQAABwAAAAkLAAAAAAAAAAAAAAABIwEAAAcAAAAJCwAAAAAAAAAAAAAAASQBAAAHAAAACQsAAAAAAAAAAAAAAAEmAQAABwAAAAkLAAAAAAAAAAAAAAABJwEAAAcAAAAJCwAAAAAAAAAAAAAAASsBAAAHAAAACQsAAAAAAAAAAAAAAAEsAQAABwAAAAkLAAAAAAAAAAAAAAABLgEAAAcAAAAJggEAAAEAAAABAAAAAS8BAAAHAAAACQsAAAAAAAAAAAAAAAEzAQAABwAAAAkLAAAAAAAAAAAAAAABNAEAAAcAAAAJCwAAAAAAAAAAAAAAATYBAAAHAAAACYQBAAABAAAAAQAAAAE3AQAABwAAAAkLAAAAAAAAAAAAAAABOwEAAAcAAAAJCwAAAAAAAAAAAAAAATwBAAAHAAAACQsAAAAAAAAAAAAAAAE+AQAABwAAAAkLAAAAAAAAAAAAAAABPwEAAAcAAAAJCwAAAAAAAAAAAAAAAUMBAAAHAAAACQsAAAAAAAAAAAAAAAFEAQAABwAAAAkLAAAAAAAAAAAAAAABRgEAAAcAAAAJCwAAAAAAAAAAAAAAAUcBAAAHAAAACQsAAAAAAAAAAAAAAAFLAQAABwAAAAkLAAAAAAAAAAAAAAABTAEAAAcAAAAJCwAAAAAAAAAAAAAAAU4BAAAHAAAACQsAAAAAAAAAAAAAAAFPAQAABwAAAAkLAAAAAAAAAAAAAAABUwEAAAcAAAAJCwAAAAAAAAAAAAAAAVQBAAAHAAAACQsAAAAAAAAAAAAAAAFWAQAABwAAAAkLAAAAAAAAAAAAAAABVwEAAAcAAAAJCwAAAAAAAAAAAAAAAVsBAAAHAAAACQsAAAAAAAAAAAAAAAFcAQAABwAAAAkLAAAAAAAAAAAAAAABXgEAAAcAAAAJCwAAAAAAAAAAAAAAAV8BAAAHAAAACQsAAAAAAAAAAAAAAAFjAQAABwAAAAkLAAAAAAAAAAAAAAABZAEAAAcAAAAJCwAAAAAAAAAAAAAAAWYBAAAHAAAACYYBAAABAAAAAQAAAAFnAQAABwAAAAkLAAAAAAAAAAAAAAABawEAAAcAAAAJCwAAAAAAAAAAAAAAAWwBAAAHAAAACQsAAAAAAAAAAAAAAAFuAQAABwAAAAmIAQAAAQAAAAEAAAABbwEAAAcAAAAJCwAAAAAAAAAAAAAAAXMBAAAHAAAACQsAAAAAAAAAAAAAAAF0AQAABwAAAAkLAAAAAAAAAAAAAAABdgEAAAcAAAAJCwAAAAAAAAAAAAAAAXcBAAAHAAAACQsAAAAAAAAAAAAAAAF7AQAABwAAAAkLAAAAAAAAAAAAAAABfAEAAAcAAAAJCwAAAAAAAAAAAAAAEX0BAAAEAAAABooBAAAEbmFtZQ0DEX8BAAAEAAAABosBAAAEbmFtZQaMAQAABmF1dGhvcg0CEYABAAAEAAAABo0BAAAEZGF0ZQaOAQAABHllYXINAhGCAQAABAAAAAaPAQAABG5hbWUNAxGEAQAABAAAAAaQAQAABG5hbWUNAxGGAQAABAAAAAaRAQAABG5hbWUNAxGIAQAABAAAAAaSAQAABG5hbWUNAws=</BA>
            </MS>
          </Obj>
          <Obj RefId="24">
            <TN RefId="7">
              <T>PSModuleDevelopment.Template.TemplateItemFile</T>
              <T>PSModuleDevelopment.Template.TemplateItemBase</T>
              <T>System.Object</T>
            </TN>
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value"># Auto detect text files and perform LF normalization_x000D__x000A_* text=auto</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="25">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="ContentParameterScript" RefId="26">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">.gitattributes</S>
              <S N="RelativePath">.gitattributes</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="27">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="28">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAQiMgQXV0byBkZXRlY3QgdGV4dCBmaWxlcyBhbmQgcGVyZm9ybSBMRiBub3JtYWxpemF0aW9uDQoqIHRleHQ9YXV0bwEJBAAAAAkFAAAABgYAAAAOLmdpdGF0dHJpYnV0ZXMGBwAAAA4uZ2l0YXR0cmlidXRlcwYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAAAAAAAAAAAAAEFAAAABAAAAAkLAAAAAAAAAAAAAAABCQAAAAQAAAAJCwAAAAAAAAAAAAAAAQoAAAAEAAAACQsAAAAAAAAAAAAAABELAAAAAAAAAAs=</BA>
            </MS>
          </Obj>
          <Obj RefId="29">
            <TNRef RefId="7" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value">_x000D__x000A_# ignore the settings folder and files for VSCode and PSS_x000D__x000A_.vscode/*_x000D__x000A_*.psproj_x000D__x000A_*TempPoint*_x000D__x000A__x000D__x000A_# Ignore staging info from Visual Studio_x000D__x000A_library/þnameþ/.vs/*_x000D__x000A_library/þnameþ/þnameþ/bin/*_x000D__x000A_library/þnameþ/þnameþ/obj/*_x000D__x000A__x000D__x000A_# ignore PowerShell Studio MetaData_x000D__x000A_þnameþ/þnameþ.psproj_x000D__x000A_þnameþ/þnameþ.psproj.bak_x000D__x000A_þnameþ/þnameþ.psprojs_x000D__x000A_þnameþ/þnameþ.psproj_x000D__x000A_</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="30">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="31">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">.gitignore</S>
              <S N="RelativePath">.gitignore</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="32">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="33">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAA+QINCiMgaWdub3JlIHRoZSBzZXR0aW5ncyBmb2xkZXIgYW5kIGZpbGVzIGZvciBWU0NvZGUgYW5kIFBTUw0KLnZzY29kZS8qDQoqLnBzcHJvag0KKlRlbXBQb2ludCoNCg0KIyBJZ25vcmUgc3RhZ2luZyBpbmZvIGZyb20gVmlzdWFsIFN0dWRpbw0KbGlicmFyeS/Dvm5hbWXDvi8udnMvKg0KbGlicmFyeS/Dvm5hbWXDvi/Dvm5hbWXDvi9iaW4vKg0KbGlicmFyeS/Dvm5hbWXDvi/Dvm5hbWXDvi9vYmovKg0KDQojIGlnbm9yZSBQb3dlclNoZWxsIFN0dWRpbyBNZXRhRGF0YQ0Kw75uYW1lw74vw75uYW1lw74ucHNwcm9qDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2ouYmFrDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2pzDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2oNCgEJBAAAAAkFAAAABgYAAAAKLmdpdGlnbm9yZQYHAAAACi5naXRpZ25vcmUGCAAAAALDvgkJAAAACQoAAAAEBAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkLAAAAAQAAAAEAAAABBQAAAAQAAAAJDAAAAAAAAAAAAAAAAQkAAAAEAAAACQwAAAAAAAAAAAAAAAEKAAAABAAAAAkMAAAAAAAAAAAAAAARCwAAAAQAAAAGDQAAAARuYW1lDQMRDAAAAAAAAAAL</BA>
            </MS>
          </Obj>
          <Obj RefId="34">
            <TNRef RefId="7" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value">&lt;#_x000D__x000A__x0009_.SYNOPSIS_x000D__x000A__x0009__x0009_Installs the PSModuleDevelopment Module from github_x000D__x000A__x0009__x0009__x000D__x000A__x0009_.DESCRIPTION_x000D__x000A__x0009__x0009_This script installs the PSModuleDevelopment Module from github._x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_It does so by ..._x000D__x000A__x0009__x0009_- downloading the specified branch as zip to $env:TEMP_x000D__x000A__x0009__x0009_- Unpacking that zip file to a folder in $env:TEMP_x000D__x000A__x0009__x0009_- Moving that content to a module folder in either program files (default) or the user profile_x000D__x000A__x0009__x000D__x000A__x0009_.PARAMETER Branch_x000D__x000A__x0009__x0009_The branch to install. Installs master by default._x000D__x000A__x0009__x0009_Unknown branches will terminate the script in error._x000D__x000A__x0009__x000D__x000A__x0009_.PARAMETER UserMode_x000D__x000A__x0009__x0009_The downloaded module will be moved to the user profile, rather than program files._x000D__x000A__x000D__x000A__x0009_.PARAMETER Force_x000D__x000A__x0009__x0009_The install script will overwrite an existing module._x000D__x000A_#&gt;_x000D__x000A_[CmdletBinding()]_x000D__x000A_Param (_x000D__x000A__x0009_[string]_x000D__x000A__x0009_$Branch = "master",_x000D__x000A__x0009__x000D__x000A__x0009_[switch]_x000D__x000A__x0009_$UserMode,_x000D__x000A__x0009__x000D__x000A__x0009_[switch]_x000D__x000A__x0009_$Force_x000D__x000A_)_x000D__x000A__x000D__x000A_#region Configuration for cloning script_x000D__x000A_# Name of the module that is being cloned_x000D__x000A_$ModuleName = "þnameþ"_x000D__x000A__x000D__x000A_# Base path to the github repository_x000D__x000A_$BaseUrl = "https://github.com/&lt;InsertUsernameHere&gt;/þnameþ"_x000D__x000A__x000D__x000A_# If the module is in a subfolder of the cloned repository, specify relative path here. Empty string to skip._x000D__x000A_$SubFolder = "þnameþ"_x000D__x000A_#endregion Configuration for cloning script_x000D__x000A__x000D__x000A_#region Utility Functions_x000D__x000A_function Compress-Archive_x000D__x000A_{_x000D__x000A__x0009_&lt;#_x000D__x000A__x0009__x0009_.SYNOPSIS_x000D__x000A__x0009__x0009__x0009_Creates an archive, or zipped file, from specified files and folders._x000D__x000A__x000D__x000A__x0009__x0009_.DESCRIPTION_x000D__x000A__x0009__x0009__x0009_The Compress-Archive cmdlet creates a zipped (or compressed) archive file from one or more specified files or folders. An archive file allows multiple files to be packaged, and optionally compressed, into a single zipped file for easier distribution and storage. An archive file can be compressed by using the compression algorithm specified by the CompressionLevel parameter._x000D__x000A__x000D__x000A__x0009__x0009__x0009_Because Compress-Archive relies upon the Microsoft .NET Framework API System.IO.Compression.ZipArchive to compress files, the maximum file size that you can compress by using Compress-Archive is currently 2 GB. This is a limitation of the underlying API._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Path_x000D__x000A__x0009__x0009__x0009_Specifies the path or paths to the files that you want to add to the archive zipped file. This parameter can accept wildcard characters. Wildcard characters allow you to add all files in a folder to your zipped archive file. To specify multiple paths, and include files in multiple locations in your output zipped file, use commas to separate the paths._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER LiteralPath_x000D__x000A__x0009__x0009__x0009_Specifies the path or paths to the files that you want to add to the archive zipped file. Unlike the Path parameter, the value of LiteralPath is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose each escape character in single quotation marks, to instruct Windows PowerShell not to interpret any characters as escape sequences. To specify multiple paths, and include files in multiple locations in your output zipped file, use commas to separate the paths._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER DestinationPath_x000D__x000A__x0009__x0009__x0009_Specifies the path to the archive output file. This parameter is required. The specified DestinationPath value should include the desired name of the output zipped file; it specifies either the absolute or relative path to the zipped file. If the file name specified in DestinationPath does not have a .zip file name extension, the cmdlet adds a .zip file name extension._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER CompressionLevel_x000D__x000A__x0009__x0009__x0009_Specifies how much compression to apply when you are creating the archive file. Faster compression requires less time to create the file, but can result in larger file sizes. The acceptable values for this parameter are:_x000D__x000A__x000D__x000A__x0009__x0009__x0009_- Fastest. Use the fastest compression method available to decrease processing time; this can result in larger file sizes._x000D__x000A__x0009__x0009__x0009_- NoCompression. Do not compress the source files._x000D__x000A__x0009__x0009__x0009_- Optimal. Processing time is dependent on file size._x000D__x000A__x000D__x000A__x0009__x0009__x0009_If this parameter is not specified, the command uses the default value, Optimal._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Update_x000D__x000A__x0009__x0009__x0009_Updates the specified archive by replacing older versions of files in the archive with newer versions of files that have the same names. You can also add this parameter to add files to an existing archive._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Force_x000D__x000A__x0009__x0009__x0009_@{Text=}_x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Confirm_x000D__x000A__x0009__x0009__x0009_Prompts you for confirmation before running the cmdlet._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER WhatIf_x000D__x000A__x0009__x0009__x0009_Shows what would happen if the cmdlet runs. The cmdlet is not run._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 1: Create an archive file_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\&gt;Compress-Archive -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command creates a new archive file, Draft.zip, by compressing two files, Draftdoc.docx and diagram2.vsd, specified by the LiteralPath parameter. The compression level specified for this operation is Optimal._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 2: Create an archive with wildcard characters_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\&gt;Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command creates a new archive file, Draft.zip, in the C:\Archives folder. Note that though the file name extension .zip was not added to the value of the DestinationPath parameter, Windows PowerShell appends this to the specified archive file name automatically. The new archive file contains every file in the C:\Reference folder, because a wildcard character was used in place of specific file names in the Path parameter. The specified compression level is Fastest, which might result in a larger output file, but compresses a large number of files faster._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 3: Update an existing archive file_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\&gt;Compress-Archive -Path C:\Reference\* -Update -DestinationPath C:\Archives\Draft.Zip_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command updates an existing archive file, Draft.Zip, in the C:\Archives folder. The command is run to update Draft.Zip with newer versions of existing files that came from the C:\Reference folder, and also to add new files that have been added to C:\Reference since Draft.Zip was initially created._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 4: Create an archive from an entire folder_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\&gt;Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command creates an archive from an entire folder, C:\Reference. Note that though the file name extension .zip was not added to the value of the DestinationPath parameter, Windows PowerShell appends this to the specified archive file name automatically._x000D__x000A__x0009_#&gt;_x000D__x000A__x0009_[CmdletBinding(DefaultParameterSetName = "Path", SupportsShouldProcess = $true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=393252")]_x000D__x000A__x0009_param_x000D__x000A__x0009_(_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, Position = 0, ParameterSetName = "Path", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, Position = 0, ParameterSetName = "PathWithForce", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, Position = 0, ParameterSetName = "PathWithUpdate", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009_$Path,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $true, ParameterSetName = "LiteralPath", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, ParameterSetName = "LiteralPathWithForce", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, ParameterSetName = "LiteralPathWithUpdate", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[Alias("PSPath")]_x000D__x000A__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009_$LiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Position = 1,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$DestinationPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (_x000D__x000A__x0009__x0009__x0009__x0009__x0009_mandatory = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[ValidateSet("Optimal", "NoCompression", "Fastest")]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$CompressionLevel = "Optimal",_x000D__x000A__x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "PathWithUpdate", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "LiteralPathWithUpdate", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[switch]_x000D__x000A__x0009__x0009_$Update = $false,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "PathWithForce", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "LiteralPathWithForce", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[switch]_x000D__x000A__x0009__x0009_$Force = $false_x000D__x000A__x0009_)_x000D__x000A__x000D__x000A__x0009_BEGIN_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression -ErrorAction Ignore_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction Ignore_x000D__x000A__x000D__x000A__x0009__x0009_$zipFileExtension = ".zip"_x000D__x000A__x000D__x000A__x0009__x0009_$LocalizedData = ConvertFrom-StringData @'_x000D__x000A_PathNotFoundError=The path '{0}' either does not exist or is not a valid file system path._x000D__x000A_ExpandArchiveInValidDestinationPath=The path '{0}' is not a valid file system directory path._x000D__x000A_InvalidZipFileExtensionError={0} is not a supported archive file format. {1} is the only supported archive file format._x000D__x000A_ArchiveFileIsReadOnly=The attributes of the archive file {0} is set to 'ReadOnly' hence it cannot be updated. If you intend to update the existing archive file, remove the 'ReadOnly' attribute on the archive file else use -Force parameter to override and create a new archive file._x000D__x000A_ZipFileExistError=The archive file {0} already exists. Use the -Update parameter to update the existing archive file or use the -Force parameter to overwrite the existing archive file._x000D__x000A_DuplicatePathFoundError=The input to {0} parameter contains a duplicate path '{1}'. Provide a unique set of paths as input to {2} parameter._x000D__x000A_ArchiveFileIsEmpty=The archive file {0} is empty._x000D__x000A_CompressProgressBarText=The archive file '{0}' creation is in progress..._x000D__x000A_ExpandProgressBarText=The archive file '{0}' expansion is in progress..._x000D__x000A_AppendArchiveFileExtensionMessage=The archive file path '{0}' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is appended to the supplied DestinationPath path and the archive file would be created at '{1}'._x000D__x000A_AddItemtoArchiveFile=Adding '{0}'._x000D__x000A_CreateFileAtExpandedPath=Created '{0}'._x000D__x000A_InvalidArchiveFilePathError=The archive file path '{0}' specified as input to the {1} parameter is resolving to multiple file system paths. Provide a unique path to the {2} parameter where the archive file has to be created._x000D__x000A_InvalidExpandedDirPathError=The directory path '{0}' specified as input to the DestinationPath parameter is resolving to multiple file system paths. Provide a unique path to the Destination parameter where the archive file contents have to be expanded._x000D__x000A_FileExistsError=Failed to create file '{0}' while expanding the archive file '{1}' contents as the file '{2}' already exists. Use the -Force parameter if you want to overwrite the existing directory '{3}' contents when expanding the archive file._x000D__x000A_DeleteArchiveFile=The partially created archive file '{0}' is deleted as it is not usable._x000D__x000A_InvalidDestinationPath=The destination path '{0}' does not contain a valid archive file name._x000D__x000A_PreparingToCompressVerboseMessage=Preparing to compress..._x000D__x000A_PreparingToExpandVerboseMessage=Preparing to expand..._x000D__x000A_'@_x000D__x000A__x000D__x000A__x0009__x0009_#region Utility Functions_x000D__x000A__x0009__x0009_function GetResolvedPathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isLiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.PSCmdlet]_x000D__x000A__x0009__x0009__x0009__x0009_$callerPSCmdlet_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isLiteralPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -LiteralPath $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -Path $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$exception = New-Object System.InvalidOperationException $errorMessage, $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ArchiveCmdletPathNotFound" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $currentPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$callerPSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentResolvedPath in $currentResolvedPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$resolvedPaths += $currentResolvedPath.ProviderPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function Add-CompressionAssemblies_x000D__x000A__x0009__x0009_{_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($PSEdition -eq "Desktop")_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function IsValidFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$result = $true;_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_if (!([System.IO.File]::Exists($currentPath) -or [System.IO.Directory]::Exists($currentPath)))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $result;_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x000D__x000A__x0009__x0009_function ValidateDuplicateFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$inputParameter,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$uniqueInputPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentInputPath = $currentPath.ToUpper()_x000D__x000A__x0009__x0009__x0009__x0009_if ($uniqueInputPaths.Contains($currentInputPath))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.DuplicatePathFoundError -f $inputParameter, $currentPath, $inputParameter)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "DuplicatePathFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$uniqueInputPaths += $currentInputPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressionLevelMapper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Optimal_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# CompressionLevel format is already validated at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_switch ($compressionLevel.ToString())_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_"Fastest"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Fastest_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_"NoCompression"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::NoCompression_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $compressionLevelFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$sourceFilePaths = @()_x000D__x000A__x0009__x0009__x0009_$sourceDirPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $sourcePath)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$result = Test-Path -LiteralPath $currentPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceFilePaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceDirPaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more directory (this directory can have files under it) and no files to be compressed._x000D__x000A__x0009__x0009__x0009_if ($sourceFilePaths.Count -eq 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]$sourceDirPaths.Count_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains only files to be compressed._x000D__x000A__x0009__x0009__x0009_elseIf ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -eq 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# $previousSegmentWeight is equal to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009_# $currentSegmentWeight is set to 100 as all files have equal weightage._x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more files and one or more directories (this directory can have files under it) to be compressed._x000D__x000A__x0009__x0009__x0009_elseif ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# each directory is considered as an individual segments &amp; all the individual files are clubed in to a separate sgemnet._x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]($sourceDirPaths.Count + 1)_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$count = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressFilesHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceFilePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $null $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressSingleDirHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$useParentDirAsRoot,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]$subDirFiles = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($useParentDirAsRoot)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirInfo = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirInfo.Parent.FullName_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# If the directory is present at the drive level the DirectoryInfo.Parent include '\' example: C:\_x000D__x000A__x0009__x0009__x0009__x0009_# On the other hand if the directory exists at a deper level then DirectoryInfo.Parent_x000D__x000A__x0009__x0009__x0009__x0009_# has just the path (without an ending '\'). example C:\source_x000D__x000A__x0009__x0009__x0009__x0009_if ($sourceDirFullName.Length -eq 3)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$dirContents = Get-ChildItem -LiteralPath $sourceDirPath -Recurse_x000D__x000A__x0009__x0009__x0009_foreach ($currentContent in $dirContents)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$isContainer = $currentContent -is [System.IO.DirectoryInfo]_x000D__x000A__x0009__x0009__x0009__x0009_if (!$isContainer)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The currentContent points to a directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# We need to check if the directory is an empty directory, if so such a_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# directory has to be explictly added to the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# if there are no files in the directory the GetFiles() API returns an empty array._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$files = $currentContent.GetFiles()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($files.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName + "\")_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $subDirFiles.ToArray() $destinationPath $compressionLevel $isUpdateMode $modifiedSourceDirFullName $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function ZipArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Create_x000D__x000A__x0009__x0009__x0009_$result = Test-Path -LiteralPath $DestinationPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Open_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# At this point we are sure that the archive file has write access._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($destinationPath, $fileMode)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Update, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.CompressProgressBarText -f $destinationPath)_x000D__x000A__x0009__x0009__x0009__x0009_$bufferSize = 4kb_x000D__x000A__x0009__x0009__x0009__x0009_$buffer = New-Object Byte[] $bufferSize_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentFilePath in $sourcePaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($modifiedSourceDirFullName -ne $null -and $modifiedSourceDirFullName.Length -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$index = $currentFilePath.IndexOf($modifiedSourceDirFullName, [System.StringComparison]::OrdinalIgnoreCase)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentFilePathSubString = $currentFilePath.Substring($index, $modifiedSourceDirFullName.Length)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = $currentFilePath.Replace($currentFilePathSubString, "").Trim()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = [System.IO.Path]::GetFileName($currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Update mode is selected._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Check to see if archive file already contains one or more zip files in it._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isUpdateMode -eq $true -and $zipArchive.Entries.Count -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file already exists in the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If so replace it with new file from the input source._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If the file does not exist in the archive file then default to_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# create mode and create the entry in the archive file._x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntry.FullName -eq $relativeFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $currentArchiveEntry_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_break_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($entryToBeUpdated -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated.Delete()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compression = CompressionLevelMapper $compressionLevel_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# If a directory needs to be added to an archive file,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# by convention the .Net API's expect the path of the diretcory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# to end with '\' to detect the path as an directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (!$relativeFilePath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream = [System.IO.File]::Open($currentFilePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Failed to access the file. Write a non terminating error to the pipeline_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and move on with the remaining files._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $_.Exception -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$null -ne $_.Exception.InnerException)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception.InnerException_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "CompressArchiveUnauthorizedAccessError" $null ([System.Management.Automation.ErrorCategory]::PermissionDenied) $exception $currentFilePath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream = New-Object System.IO.BinaryReader $currentFileStream_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry($relativeFilePath, $compression)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Updating the File Creation time so that the same timestamp would be retained after expanding the compressed file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# At this point we are sure that Get-ChildItem would succeed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry.LastWriteTime = (Get-Item -LiteralPath $currentFilePath).LastWriteTime_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream = New-Object System.IO.BinaryWriter $currentArchiveEntry.Open()_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_while ($numberOfBytesRead = $srcStream.Read($buffer, 0, $bufferSize))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Write($buffer, 0, $numberOfBytesRead)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Flush()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry("$relativeFilePath", $compression)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($null -ne $addItemtoArchiveFileMessage)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addItemtoArchiveFileMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Compress-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $sourcePaths.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Compress-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ValidateArchivePathHelper: This is a helper function used to validate the archive file_x000D__x000A_# path &amp; its file format. The only supported archive file format is .zip_x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ValidateArchivePathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ([System.IO.File]::Exists($archiveFile))_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Invalid file extension is specifed for the zip file._x000D__x000A__x0009__x0009__x0009__x0009_if ($extension -ne $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidZipFileExtensionError -f $extension, $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "NotSupportedArchiveFileExtension" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $extension_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $archiveFile_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ExpandArchiveHelper: This is a helper function used to expand the archive file contents_x000D__x000A_# to the specified directory._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ExpandArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedDir,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[ref]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedItems,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$force,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isVerbose,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isConfirm_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The existance of archive file has already been validated by ValidateArchivePathHelper_x000D__x000A__x0009__x0009__x0009__x0009_# before calling this helper function._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($archiveFile, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Read, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($zipArchive.Entries.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileIsEmpty = ($LocalizedData.ArchiveFileIsEmpty -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Write-Verbose $archiveFileIsEmpty_x000D__x000A__x0009__x0009__x0009__x0009__x0009_return_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.ExpandProgressBarText -f $archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# The archive entries can either be empty directories or files._x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath = Join-Path -Path $expandedDir -ChildPath $currentArchiveEntry.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($currentArchiveEntryPath)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The current archive entry is an empty directory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The FullName of the Archive Entry representing a directory would end with a trailing '\'._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($extension -eq [string]::Empty -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$pathExists = Test-Path -LiteralPath $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# The current archive entry expects an empty directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the existing directory is empty. If its not empty_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# then it means that user has added this directory by other means._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($pathExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryPath -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryPath -PathType Container)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addEmptyDirectorytoExpandedPathMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addEmptyDirectorytoExpandedPathMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryFileInfo = New-Object -TypeName System.IO.FileInfo -ArgumentList $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$parentDirExists = Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If the Parent directory of the current entry in the archive file does not exist, then create it._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($parentDirExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryFileInfo.DirectoryName -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!(Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The directory referred by $currentArchiveEntryFileInfo.DirectoryName was not successfully created._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryFileInfo.DirectoryName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file in to which the current archive entry contents_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be expanded already exists._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntryFileInfo.Exists)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($force)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Remove-Item -LiteralPath $currentArchiveEntryFileInfo.FullName -Force -ErrorVariable ev -Verbose:$isVerbose -Confirm:$isConfirm_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($ev -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryFileInfo.FullName -PathType Leaf)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The file referred by $currentArchiveEntryFileInfo.FullName was not successfully removed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Write non-terminating error to the pipeline._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.FileExistsError -f $currentArchiveEntryFileInfo.FullName, $archiveFile, $currentArchiveEntryFileInfo.FullName, $currentArchiveEntryFileInfo.FullName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ExpandArchiveFileExists" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidOperation) $null $currentArchiveEntryFileInfo.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!$hasNonTerminatingError)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_[System.IO.Compression.ZipFileExtensions]::ExtractToFile($currentArchiveEntry, $currentArchiveEntryPath, $false)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Add the expanded file path to the $expandedItems array,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# to keep track of all the expanded files created while expanding the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If user enters CTRL + C then at that point of time, all these expanded files_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be deleted as part of the clean up process._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addFiletoExpandedPathMessage = ($LocalizedData.CreateFileAtExpandedPath -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addFiletoExpandedPathMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $currentSegmentWeight is Set to 100 giving equal weightage to each file that is getting expanded._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $previousSegmentWeight is set to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Expand-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $zipArchive.Entries.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Expand-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ProgressBarHelper: This is a helper function used to display progress message._x000D__x000A_# This function is used by both Compress-Archive &amp; Expand-Archive to display archive file_x000D__x000A_# creation/expansion progress._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ProgressBarHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$cmdletName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$status,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($currentEntryCount -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight -ge 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$entryDefaultWeight = $currentSegmentWeight/[double]$totalNumberofEntries_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$percentComplete = $previousSegmentWeight + ($entryDefaultWeight * $currentEntryCount)_x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity $cmdletName -Status $status -PercentComplete $percentComplete_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# CSVHelper: This is a helper function used to append comma after each path specifid by_x000D__x000A_# the SourcePath array. This helper function is used to display all the user supplied paths_x000D__x000A_# in the WhatIf message._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function CSVHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# SourcePath has already been validated by the calling funcation._x000D__x000A__x0009__x0009__x0009_if ($sourcePath.Count -gt 1)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = "`n"_x000D__x000A__x0009__x0009__x0009__x0009_for ($currentIndex = 0; $currentIndex -lt $sourcePath.Count; $currentIndex++)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($currentIndex -eq $sourcePath.Count - 1)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex]_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex] + "`n"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = $sourcePath_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $sourcePathInCsvFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ThrowTerminatingErrorHelper: This is a helper function used to throw terminating error._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ThrowTerminatingErrorHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$innerException_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($innerException -eq $null)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage, $innerException_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_$PSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# CreateErrorRecordHelper: This is a helper function used to create an ErrorRecord_x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function CreateErrorRecordHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$exception,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($null -eq $exception)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_return $errorRecord_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_#endregion Utility Functions_x000D__x000A__x000D__x000A__x0009__x0009_$inputPaths = @()_x000D__x000A__x0009__x0009_$destinationParentDir = [system.IO.Path]::GetDirectoryName($DestinationPath)_x000D__x000A__x0009__x0009_if ($null -eq $destinationParentDir)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidDestinationPath -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_if ($destinationParentDir -eq [string]::Empty)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$destinationParentDir = '.'_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$achiveFileName = [system.IO.Path]::GetFileName($DestinationPath)_x000D__x000A__x0009__x0009_$destinationParentDir = GetResolvedPathHelper $destinationParentDir $false $PSCmdlet_x000D__x000A__x000D__x000A__x0009__x0009_if ($destinationParentDir.Count -gt 1)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidArchiveFilePathError -f $DestinationPath, "DestinationPath", "DestinationPath")_x000D__x000A__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_IsValidFileSystemPath $destinationParentDir | Out-Null_x000D__x000A__x0009__x0009_$DestinationPath = Join-Path -Path $destinationParentDir -ChildPath $achiveFileName_x000D__x000A__x000D__x000A__x0009__x0009_# GetExtension API does not validate for the actual existance of the path._x000D__x000A__x0009__x0009_$extension = [system.IO.Path]::GetExtension($DestinationPath)_x000D__x000A__x000D__x000A__x0009__x0009_# If user does not specify .Zip extension, we append it._x000D__x000A__x0009__x0009_If ($extension -eq [string]::Empty)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$DestinationPathWithOutExtension = $DestinationPath_x000D__x000A__x0009__x0009__x0009_$DestinationPath = $DestinationPathWithOutExtension + $zipFileExtension_x000D__x000A__x0009__x0009__x0009_$appendArchiveFileExtensionMessage = ($LocalizedData.AppendArchiveFileExtensionMessage -f $DestinationPathWithOutExtension, $DestinationPath)_x000D__x000A__x0009__x0009__x0009_Write-Verbose $appendArchiveFileExtensionMessage_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_else_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_# Invalid file extension is specified for the zip file to be created._x000D__x000A__x0009__x0009__x0009_if ($extension -ne $zipFileExtension)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidZipFileExtensionError -f $extension, $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "NotSupportedArchiveFileExtension" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $extension_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$archiveFileExist = Test-Path -LiteralPath $DestinationPath -PathType Leaf_x000D__x000A__x000D__x000A__x0009__x0009_if ($archiveFileExist -and ($Update -eq $false -and $Force -eq $false))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ZipFileExistError -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ThrowTerminatingErrorHelper "ArchiveFileExists" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_# If archive file already exists and if -Update is specified, then we check to see_x000D__x000A__x0009__x0009_# if we have write access permission to update the existing archive file._x000D__x000A__x0009__x0009_if ($archiveFileExist -and $Update -eq $true)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$item = Get-Item -Path $DestinationPath_x000D__x000A__x0009__x0009__x0009_if ($item.Attributes.ToString().Contains("ReadOnly"))_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ArchiveFileIsReadOnly -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "ArchiveFileIsReadOnly" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidOperation) $DestinationPath_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$isWhatIf = $psboundparameters.ContainsKey("WhatIf")_x000D__x000A__x0009__x0009_if (!$isWhatIf)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$preparingToCompressVerboseMessage = ($LocalizedData.PreparingToCompressVerboseMessage)_x000D__x000A__x0009__x0009__x0009_Write-Verbose $preparingToCompressVerboseMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.CompressProgressBarText -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ProgressBarHelper "Compress-Archive" $progressBarStatus 0 100 100 1_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009_PROCESS_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_if ($PsCmdlet.ParameterSetName -eq "Path" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "PathWithForce" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "PathWithUpdate")_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$inputPaths += $Path_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_if ($PsCmdlet.ParameterSetName -eq "LiteralPath" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithForce" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithUpdate")_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$inputPaths += $LiteralPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009_END_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_# If archive file already exists and if -Force is specified, we delete the_x000D__x000A__x0009__x0009_# existing artchive file and create a brand new one._x000D__x000A__x0009__x0009_if (($PsCmdlet.ParameterSetName -eq "PathWithForce" -or_x000D__x000A__x0009__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithForce") -and $archiveFileExist)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_Remove-Item -Path $DestinationPath -Force -ErrorAction Stop_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_# Validate Source Path depeding on parameter set being used._x000D__x000A__x0009__x0009_# The specified source path conatins one or more files or directories that needs_x000D__x000A__x0009__x0009_# to be compressed._x000D__x000A__x0009__x0009_$isLiteralPathUsed = $false_x000D__x000A__x0009__x0009_if ($PsCmdlet.ParameterSetName -eq "LiteralPath" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithForce" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithUpdate")_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$isLiteralPathUsed = $true_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_ValidateDuplicateFileSystemPath $PsCmdlet.ParameterSetName $inputPaths_x000D__x000A__x0009__x0009_$resolvedPaths = GetResolvedPathHelper $inputPaths $isLiteralPathUsed $PSCmdlet_x000D__x000A__x0009__x0009_IsValidFileSystemPath $resolvedPaths | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009_$sourcePath = $resolvedPaths;_x000D__x000A__x000D__x000A__x0009__x0009_# CSVHelper: This is a helper function used to append comma after each path specifid by_x000D__x000A__x0009__x0009_# the $sourcePath array. The comma saperated paths are displayed in the -WhatIf message._x000D__x000A__x0009__x0009_$sourcePathInCsvFormat = CSVHelper $sourcePath_x000D__x000A__x0009__x0009_if ($pscmdlet.ShouldProcess($sourcePathInCsvFormat))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# StopProcessing is not avaliable in Script cmdlets. However the pipleline execution_x000D__x000A__x0009__x0009__x0009__x0009_# is terminated when ever 'CTRL + C' is entered by user to terminate the cmdlet execution._x000D__x000A__x0009__x0009__x0009__x0009_# The finally block is executed whenever pipleline is terminated._x000D__x000A__x0009__x0009__x0009__x0009_# $isArchiveFileProcessingComplete variable is used to track if 'CTRL + C' is entered by the_x000D__x000A__x0009__x0009__x0009__x0009_# user._x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived = CompressArchiveHelper $sourcePath $DestinationPath $CompressionLevel $Update_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $true_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The $isArchiveFileProcessingComplete would be set to $false if user has typed 'CTRL + C' to_x000D__x000A__x0009__x0009__x0009__x0009_# terminate the cmdlet execution or if an unhandled exception is thrown._x000D__x000A__x0009__x0009__x0009__x0009_# $numberOfItemsArchived contains the count of number of files or directories add to the archive file._x000D__x000A__x0009__x0009__x0009__x0009_# If the newly created archive file is empty then we delete it as its not usable._x000D__x000A__x0009__x0009__x0009__x0009_if (($isArchiveFileProcessingComplete -eq $false) -or_x000D__x000A__x0009__x0009__x0009__x0009__x0009_($numberOfItemsArchived -eq 0))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$DeleteArchiveFileMessage = ($LocalizedData.DeleteArchiveFile -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Write-Verbose $DeleteArchiveFileMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# delete the partial archive file created._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (Test-Path $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Remove-Item -LiteralPath $DestinationPath -Force -Recurse -ErrorAction SilentlyContinue_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A__x000D__x000A_function Expand-Archive_x000D__x000A_{_x000D__x000A__x0009_&lt;#_x000D__x000A__x0009__x0009_.SYNOPSIS_x000D__x000A__x0009__x0009__x0009_Extracts files from a specified archive (zipped) file._x000D__x000A__x000D__x000A__x0009__x0009_.DESCRIPTION_x000D__x000A__x0009__x0009__x0009_The Expand-Archive cmdlet extracts files from a specified zipped archive file to a specified destination folder. An archive file allows multiple files to be packaged, and optionally compressed, into a single zipped file for easier distribution and storage._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Path_x000D__x000A__x0009__x0009__x0009_Specifies the path to the archive file._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER LiteralPath_x000D__x000A__x0009__x0009__x0009_Specifies the path to an archive file. Unlike the Path parameter, the value of LiteralPath is used exactly as it is typed. Wildcard characters are not supported. If the path includes escape characters, enclose each escape character in single quotation marks, to instruct Windows PowerShell not to interpret any characters as escape sequences._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER DestinationPath_x000D__x000A__x0009__x0009__x0009_Specifies the path to the folder in which you want the command to save extracted files. Enter the path to a folder, but do not specify a file name or file name extension. This parameter is required._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Force_x000D__x000A__x0009__x0009__x0009_Forces the command to run without asking for user confirmation._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Confirm_x000D__x000A__x0009__x0009__x0009_Prompts you for confirmation before running the cmdlet._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER WhatIf_x000D__x000A__x0009__x0009__x0009_Shows what would happen if the cmdlet runs. The cmdlet is not run._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 1: Extract the contents of an archive_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\&gt;Expand-Archive -LiteralPath C:\Archives\Draft.Zip -DestinationPath C:\Reference_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command extracts the contents of an existing archive file, Draft.zip, into the folder specified by the DestinationPath parameter, C:\Reference._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 2: Extract the contents of an archive in the current folder_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\&gt;Expand-Archive -Path Draft.Zip -DestinationPath C:\Reference_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command extracts the contents of an existing archive file in the current folder, Draft.zip, into the folder specified by the DestinationPath parameter, C:\Reference._x000D__x000A__x0009_#&gt;_x000D__x000A__x0009_[CmdletBinding(_x000D__x000A__x0009__x0009__x0009__x0009_ DefaultParameterSetName = "Path",_x000D__x000A__x0009__x0009__x0009__x0009_ SupportsShouldProcess = $true,_x000D__x000A__x0009__x0009__x0009__x0009_ HelpUri = "http://go.microsoft.com/fwlink/?LinkID=393253")]_x000D__x000A__x0009_param_x000D__x000A__x0009_(_x000D__x000A__x0009__x0009_[parameter (_x000D__x000A__x0009__x0009__x0009__x0009__x0009_mandatory = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Position = 0,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ParameterSetName = "Path",_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$Path,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (_x000D__x000A__x0009__x0009__x0009__x0009__x0009_mandatory = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ParameterSetName = "LiteralPath",_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[Alias("PSPath")]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$LiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Position = 1,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$DestinationPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[switch]_x000D__x000A__x0009__x0009_$Force_x000D__x000A__x0009_)_x000D__x000A__x000D__x000A__x0009_BEGIN_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression -ErrorAction Ignore_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction Ignore_x000D__x000A__x000D__x000A__x0009__x0009_$zipFileExtension = ".zip"_x000D__x000A__x000D__x000A__x0009__x0009_$LocalizedData = ConvertFrom-StringData @'_x000D__x000A_PathNotFoundError=The path '{0}' either does not exist or is not a valid file system path._x000D__x000A_ExpandArchiveInValidDestinationPath=The path '{0}' is not a valid file system directory path._x000D__x000A_InvalidZipFileExtensionError={0} is not a supported archive file format. {1} is the only supported archive file format._x000D__x000A_ArchiveFileIsReadOnly=The attributes of the archive file {0} is set to 'ReadOnly' hence it cannot be updated. If you intend to update the existing archive file, remove the 'ReadOnly' attribute on the archive file else use -Force parameter to override and create a new archive file._x000D__x000A_ZipFileExistError=The archive file {0} already exists. Use the -Update parameter to update the existing archive file or use the -Force parameter to overwrite the existing archive file._x000D__x000A_DuplicatePathFoundError=The input to {0} parameter contains a duplicate path '{1}'. Provide a unique set of paths as input to {2} parameter._x000D__x000A_ArchiveFileIsEmpty=The archive file {0} is empty._x000D__x000A_CompressProgressBarText=The archive file '{0}' creation is in progress..._x000D__x000A_ExpandProgressBarText=The archive file '{0}' expansion is in progress..._x000D__x000A_AppendArchiveFileExtensionMessage=The archive file path '{0}' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is appended to the supplied DestinationPath path and the archive file would be created at '{1}'._x000D__x000A_AddItemtoArchiveFile=Adding '{0}'._x000D__x000A_CreateFileAtExpandedPath=Created '{0}'._x000D__x000A_InvalidArchiveFilePathError=The archive file path '{0}' specified as input to the {1} parameter is resolving to multiple file system paths. Provide a unique path to the {2} parameter where the archive file has to be created._x000D__x000A_InvalidExpandedDirPathError=The directory path '{0}' specified as input to the DestinationPath parameter is resolving to multiple file system paths. Provide a unique path to the Destination parameter where the archive file contents have to be expanded._x000D__x000A_FileExistsError=Failed to create file '{0}' while expanding the archive file '{1}' contents as the file '{2}' already exists. Use the -Force parameter if you want to overwrite the existing directory '{3}' contents when expanding the archive file._x000D__x000A_DeleteArchiveFile=The partially created archive file '{0}' is deleted as it is not usable._x000D__x000A_InvalidDestinationPath=The destination path '{0}' does not contain a valid archive file name._x000D__x000A_PreparingToCompressVerboseMessage=Preparing to compress..._x000D__x000A_PreparingToExpandVerboseMessage=Preparing to expand..._x000D__x000A_'@_x000D__x000A__x000D__x000A__x0009__x0009_#region Utility Functions_x000D__x000A__x0009__x0009_function GetResolvedPathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isLiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.PSCmdlet]_x000D__x000A__x0009__x0009__x0009__x0009_$callerPSCmdlet_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isLiteralPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -LiteralPath $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -Path $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$exception = New-Object System.InvalidOperationException $errorMessage, $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ArchiveCmdletPathNotFound" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $currentPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$callerPSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentResolvedPath in $currentResolvedPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$resolvedPaths += $currentResolvedPath.ProviderPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function Add-CompressionAssemblies_x000D__x000A__x0009__x0009_{_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($PSEdition -eq "Desktop")_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function IsValidFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$result = $true;_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_if (!([System.IO.File]::Exists($currentPath) -or [System.IO.Directory]::Exists($currentPath)))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $result;_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x000D__x000A__x0009__x0009_function ValidateDuplicateFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$inputParameter,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$uniqueInputPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentInputPath = $currentPath.ToUpper()_x000D__x000A__x0009__x0009__x0009__x0009_if ($uniqueInputPaths.Contains($currentInputPath))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.DuplicatePathFoundError -f $inputParameter, $currentPath, $inputParameter)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "DuplicatePathFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$uniqueInputPaths += $currentInputPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressionLevelMapper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Optimal_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# CompressionLevel format is already validated at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_switch ($compressionLevel.ToString())_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_"Fastest"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Fastest_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_"NoCompression"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::NoCompression_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $compressionLevelFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$sourceFilePaths = @()_x000D__x000A__x0009__x0009__x0009_$sourceDirPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $sourcePath)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$result = Test-Path -LiteralPath $currentPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceFilePaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceDirPaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more directory (this directory can have files under it) and no files to be compressed._x000D__x000A__x0009__x0009__x0009_if ($sourceFilePaths.Count -eq 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]$sourceDirPaths.Count_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains only files to be compressed._x000D__x000A__x0009__x0009__x0009_elseIf ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -eq 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# $previousSegmentWeight is equal to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009_# $currentSegmentWeight is set to 100 as all files have equal weightage._x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more files and one or more directories (this directory can have files under it) to be compressed._x000D__x000A__x0009__x0009__x0009_elseif ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# each directory is considered as an individual segments &amp; all the individual files are clubed in to a separate sgemnet._x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]($sourceDirPaths.Count + 1)_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$count = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressFilesHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceFilePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $null $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressSingleDirHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$useParentDirAsRoot,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]$subDirFiles = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($useParentDirAsRoot)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirInfo = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirInfo.Parent.FullName_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# If the directory is present at the drive level the DirectoryInfo.Parent include '\' example: C:\_x000D__x000A__x0009__x0009__x0009__x0009_# On the other hand if the directory exists at a deper level then DirectoryInfo.Parent_x000D__x000A__x0009__x0009__x0009__x0009_# has just the path (without an ending '\'). example C:\source_x000D__x000A__x0009__x0009__x0009__x0009_if ($sourceDirFullName.Length -eq 3)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$dirContents = Get-ChildItem -LiteralPath $sourceDirPath -Recurse_x000D__x000A__x0009__x0009__x0009_foreach ($currentContent in $dirContents)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$isContainer = $currentContent -is [System.IO.DirectoryInfo]_x000D__x000A__x0009__x0009__x0009__x0009_if (!$isContainer)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The currentContent points to a directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# We need to check if the directory is an empty directory, if so such a_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# directory has to be explictly added to the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# if there are no files in the directory the GetFiles() API returns an empty array._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$files = $currentContent.GetFiles()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($files.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName + "\")_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $subDirFiles.ToArray() $destinationPath $compressionLevel $isUpdateMode $modifiedSourceDirFullName $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function ZipArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Create_x000D__x000A__x0009__x0009__x0009_$result = Test-Path -LiteralPath $DestinationPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Open_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# At this point we are sure that the archive file has write access._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($destinationPath, $fileMode)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Update, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.CompressProgressBarText -f $destinationPath)_x000D__x000A__x0009__x0009__x0009__x0009_$bufferSize = 4kb_x000D__x000A__x0009__x0009__x0009__x0009_$buffer = New-Object Byte[] $bufferSize_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentFilePath in $sourcePaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($modifiedSourceDirFullName -ne $null -and $modifiedSourceDirFullName.Length -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$index = $currentFilePath.IndexOf($modifiedSourceDirFullName, [System.StringComparison]::OrdinalIgnoreCase)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentFilePathSubString = $currentFilePath.Substring($index, $modifiedSourceDirFullName.Length)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = $currentFilePath.Replace($currentFilePathSubString, "").Trim()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = [System.IO.Path]::GetFileName($currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Update mode is selected._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Check to see if archive file already contains one or more zip files in it._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isUpdateMode -eq $true -and $zipArchive.Entries.Count -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file already exists in the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If so replace it with new file from the input source._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If the file does not exist in the archive file then default to_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# create mode and create the entry in the archive file._x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntry.FullName -eq $relativeFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $currentArchiveEntry_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_break_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($entryToBeUpdated -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated.Delete()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compression = CompressionLevelMapper $compressionLevel_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# If a directory needs to be added to an archive file,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# by convention the .Net API's expect the path of the diretcory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# to end with '\' to detect the path as an directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (!$relativeFilePath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream = [System.IO.File]::Open($currentFilePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Failed to access the file. Write a non terminating error to the pipeline_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and move on with the remaining files._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $_.Exception -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$null -ne $_.Exception.InnerException)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception.InnerException_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "CompressArchiveUnauthorizedAccessError" $null ([System.Management.Automation.ErrorCategory]::PermissionDenied) $exception $currentFilePath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream = New-Object System.IO.BinaryReader $currentFileStream_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry($relativeFilePath, $compression)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Updating the File Creation time so that the same timestamp would be retained after expanding the compressed file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# At this point we are sure that Get-ChildItem would succeed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry.LastWriteTime = (Get-Item -LiteralPath $currentFilePath).LastWriteTime_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream = New-Object System.IO.BinaryWriter $currentArchiveEntry.Open()_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_while ($numberOfBytesRead = $srcStream.Read($buffer, 0, $bufferSize))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Write($buffer, 0, $numberOfBytesRead)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Flush()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry("$relativeFilePath", $compression)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($null -ne $addItemtoArchiveFileMessage)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addItemtoArchiveFileMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Compress-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $sourcePaths.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Compress-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ValidateArchivePathHelper: This is a helper function used to validate the archive file_x000D__x000A_# path &amp; its file format. The only supported archive file format is .zip_x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ValidateArchivePathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ([System.IO.File]::Exists($archiveFile))_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Invalid file extension is specifed for the zip file._x000D__x000A__x0009__x0009__x0009__x0009_if ($extension -ne $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidZipFileExtensionError -f $extension, $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "NotSupportedArchiveFileExtension" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $extension_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $archiveFile_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ExpandArchiveHelper: This is a helper function used to expand the archive file contents_x000D__x000A_# to the specified directory._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ExpandArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedDir,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[ref]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedItems,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$force,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isVerbose,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isConfirm_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The existance of archive file has already been validated by ValidateArchivePathHelper_x000D__x000A__x0009__x0009__x0009__x0009_# before calling this helper function._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($archiveFile, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Read, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($zipArchive.Entries.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileIsEmpty = ($LocalizedData.ArchiveFileIsEmpty -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Write-Verbose $archiveFileIsEmpty_x000D__x000A__x0009__x0009__x0009__x0009__x0009_return_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.ExpandProgressBarText -f $archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# The archive entries can either be empty directories or files._x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath = Join-Path -Path $expandedDir -ChildPath $currentArchiveEntry.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($currentArchiveEntryPath)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The current archive entry is an empty directory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The FullName of the Archive Entry representing a directory would end with a trailing '\'._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($extension -eq [string]::Empty -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$pathExists = Test-Path -LiteralPath $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# The current archive entry expects an empty directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the existing directory is empty. If its not empty_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# then it means that user has added this directory by other means._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($pathExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryPath -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryPath -PathType Container)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addEmptyDirectorytoExpandedPathMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addEmptyDirectorytoExpandedPathMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryFileInfo = New-Object -TypeName System.IO.FileInfo -ArgumentList $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$parentDirExists = Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If the Parent directory of the current entry in the archive file does not exist, then create it._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($parentDirExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryFileInfo.DirectoryName -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!(Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The directory referred by $currentArchiveEntryFileInfo.DirectoryName was not successfully created._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryFileInfo.DirectoryName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file in to which the current archive entry contents_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be expanded already exists._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntryFileInfo.Exists)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($force)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Remove-Item -LiteralPath $currentArchiveEntryFileInfo.FullName -Force -ErrorVariable ev -Verbose:$isVerbose -Confirm:$isConfirm_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($ev -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryFileInfo.FullName -PathType Leaf)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The file referred by $currentArchiveEntryFileInfo.FullName was not successfully removed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Write non-terminating error to the pipeline._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.FileExistsError -f $currentArchiveEntryFileInfo.FullName, $archiveFile, $currentArchiveEntryFileInfo.FullName, $currentArchiveEntryFileInfo.FullName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ExpandArchiveFileExists" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidOperation) $null $currentArchiveEntryFileInfo.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!$hasNonTerminatingError)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_[System.IO.Compression.ZipFileExtensions]::ExtractToFile($currentArchiveEntry, $currentArchiveEntryPath, $false)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Add the expanded file path to the $expandedItems array,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# to keep track of all the expanded files created while expanding the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If user enters CTRL + C then at that point of time, all these expanded files_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be deleted as part of the clean up process._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addFiletoExpandedPathMessage = ($LocalizedData.CreateFileAtExpandedPath -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addFiletoExpandedPathMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $currentSegmentWeight is Set to 100 giving equal weightage to each file that is getting expanded._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $previousSegmentWeight is set to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Expand-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $zipArchive.Entries.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Expand-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ProgressBarHelper: This is a helper function used to display progress message._x000D__x000A_# This function is used by both Compress-Archive &amp; Expand-Archive to display archive file_x000D__x000A_# creation/expansion progress._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ProgressBarHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$cmdletName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$status,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($currentEntryCount -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight -ge 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$entryDefaultWeight = $currentSegmentWeight/[double]$totalNumberofEntries_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$percentComplete = $previousSegmentWeight + ($entryDefaultWeight * $currentEntryCount)_x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity $cmdletName -Status $status -PercentComplete $percentComplete_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# CSVHelper: This is a helper function used to append comma after each path specifid by_x000D__x000A_# the SourcePath array. This helper function is used to display all the user supplied paths_x000D__x000A_# in the WhatIf message._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function CSVHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# SourcePath has already been validated by the calling funcation._x000D__x000A__x0009__x0009__x0009_if ($sourcePath.Count -gt 1)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = "`n"_x000D__x000A__x0009__x0009__x0009__x0009_for ($currentIndex = 0; $currentIndex -lt $sourcePath.Count; $currentIndex++)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($currentIndex -eq $sourcePath.Count - 1)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex]_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex] + "`n"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = $sourcePath_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $sourcePathInCsvFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# ThrowTerminatingErrorHelper: This is a helper function used to throw terminating error._x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function ThrowTerminatingErrorHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$innerException_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($innerException -eq $null)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage, $innerException_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_$PSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_&lt;############################################################################################_x000D__x000A_# CreateErrorRecordHelper: This is a helper function used to create an ErrorRecord_x000D__x000A_############################################################################################&gt;_x000D__x000A__x0009__x0009_function CreateErrorRecordHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$exception,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($null -eq $exception)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_return $errorRecord_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_#endregion Utility Functions_x000D__x000A__x000D__x000A__x0009__x0009_$isVerbose = $psboundparameters.ContainsKey("Verbose")_x000D__x000A__x0009__x0009_$isConfirm = $psboundparameters.ContainsKey("Confirm")_x000D__x000A__x000D__x000A__x0009__x0009_$isDestinationPathProvided = $true_x000D__x000A__x0009__x0009_if ($DestinationPath -eq [string]::Empty)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$resolvedDestinationPath = $pwd_x000D__x000A__x0009__x0009__x0009_$isDestinationPathProvided = $false_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_else_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$destinationPathExists = Test-Path -Path $DestinationPath -PathType Container_x000D__x000A__x0009__x0009__x0009_if ($destinationPathExists)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$resolvedDestinationPath = GetResolvedPathHelper $DestinationPath $false $PSCmdlet_x000D__x000A__x0009__x0009__x0009__x0009_if ($resolvedDestinationPath.Count -gt 1)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidExpandedDirPathError -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidDestinationPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# At this point we are sure that the provided path resolves to a valid single path._x000D__x000A__x0009__x0009__x0009__x0009_# Calling Resolve-Path again to get the underlying provider name._x000D__x000A__x0009__x0009__x0009__x0009_$suppliedDestinationPath = Resolve-Path -Path $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_if ($suppliedDestinationPath.Provider.Name -ne "FileSystem")_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ExpandArchiveInValidDestinationPath -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidDirectoryPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$createdItem = New-Item -Path $DestinationPath -ItemType Directory -Confirm:$isConfirm -Verbose:$isVerbose -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009_if ($createdItem -ne $null -and $createdItem.PSProvider.Name -ne "FileSystem")_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Remove-Item "$DestinationPath" -Force -Recurse -ErrorAction SilentlyContinue_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ExpandArchiveInValidDestinationPath -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidDirectoryPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$resolvedDestinationPath = GetResolvedPathHelper $DestinationPath $true $PSCmdlet_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$isWhatIf = $psboundparameters.ContainsKey("WhatIf")_x000D__x000A__x0009__x0009_if (!$isWhatIf)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$preparingToExpandVerboseMessage = ($LocalizedData.PreparingToExpandVerboseMessage)_x000D__x000A__x0009__x0009__x0009_Write-Verbose $preparingToExpandVerboseMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.ExpandProgressBarText -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ProgressBarHelper "Expand-Archive" $progressBarStatus 0 100 100 1_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009_PROCESS_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_switch ($PsCmdlet.ParameterSetName)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_"Path"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$resolvedSourcePaths = GetResolvedPathHelper $Path $false $PSCmdlet_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($resolvedSourcePaths.Count -gt 1)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidArchiveFilePathError -f $Path, $PsCmdlet.ParameterSetName, $PsCmdlet.ParameterSetName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $Path_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_"LiteralPath"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$resolvedSourcePaths = GetResolvedPathHelper $LiteralPath $true $PSCmdlet_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($resolvedSourcePaths.Count -gt 1)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidArchiveFilePathError -f $LiteralPath, $PsCmdlet.ParameterSetName, $PsCmdlet.ParameterSetName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $LiteralPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_ValidateArchivePathHelper $resolvedSourcePaths_x000D__x000A__x000D__x000A__x0009__x0009_if ($pscmdlet.ShouldProcess($resolvedSourcePaths))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$expandedItems = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# StopProcessing is not avaliable in Script cmdlets. However the pipleline execution_x000D__x000A__x0009__x0009__x0009__x0009_# is terminated when ever 'CTRL + C' is entered by user to terminate the cmdlet execution._x000D__x000A__x0009__x0009__x0009__x0009_# The finally block is executed whenever pipleline is terminated._x000D__x000A__x0009__x0009__x0009__x0009_# $isArchiveFileProcessingComplete variable is used to track if 'CTRL + C' is entered by the_x000D__x000A__x0009__x0009__x0009__x0009_# user._x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# The User has not provided a destination path, hence we use '$pwd\ArchiveFileName' as the directory where the_x000D__x000A__x0009__x0009__x0009__x0009_# archive file contents would be expanded. If the path '$pwd\ArchiveFileName' already exists then we use the_x000D__x000A__x0009__x0009__x0009__x0009_# Windows default mechanism of appending a counter value at the end of the directory name where the contents_x000D__x000A__x0009__x0009__x0009__x0009_# would be expanded._x000D__x000A__x0009__x0009__x0009__x0009_if (!$isDestinationPathProvided)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFile = New-Object System.IO.FileInfo $resolvedSourcePaths_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$resolvedDestinationPath = Join-Path -Path $resolvedDestinationPath -ChildPath $archiveFile.BaseName_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$destinationPathExists = Test-Path -LiteralPath $resolvedDestinationPath -PathType Container_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (!$destinationPathExists)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_New-Item -Path $resolvedDestinationPath -ItemType Directory -Confirm:$isConfirm -Verbose:$isVerbose -ErrorAction Stop | Out-Null_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_ExpandArchiveHelper $resolvedSourcePaths $resolvedDestinationPath ([ref]$expandedItems) $Force $isVerbose $isConfirm_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $true_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The $isArchiveFileProcessingComplete would be set to $false if user has typed 'CTRL + C' to_x000D__x000A__x0009__x0009__x0009__x0009_# terminate the cmdlet execution or if an unhandled exception is thrown._x000D__x000A__x0009__x0009__x0009__x0009_if ($isArchiveFileProcessingComplete -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($expandedItems.Count -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# delete the expanded file/directory as the archive_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# file was not completly expanded._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems | ForEach-Object { Remove-Item $_ -Force -Recurse }_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A__x000D__x000A_function Write-LocalMessage_x000D__x000A_{_x000D__x000A_ [CmdletBinding()]_x000D__x000A_ Param (_x000D__x000A_ [string]$Message_x000D__x000A_ )_x000D__x000A__x000D__x000A_ if (Test-Path function:Write-PSFMessage) { Write-PSFMessage -Level Important -Message $Message }_x000D__x000A_ else { Write-Host $Message }_x000D__x000A_}_x000D__x000A_#endregion Utility Functions_x000D__x000A__x000D__x000A_try_x000D__x000A_{_x000D__x000A__x0009_[System.Net.ServicePointManager]::SecurityProtocol = "Tls12"_x000D__x000A__x000D__x000A__x0009_Write-LocalMessage -Message "Downloading repository from '$($BaseUrl)/archive/$($Branch).zip'"_x000D__x000A__x0009_Invoke-WebRequest -Uri "$($BaseUrl)/archive/$($Branch).zip" -UseBasicParsing -OutFile "$($env:TEMP)\$($ModuleName).zip" -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Creating temporary project folder: '$($env:TEMP)\$($ModuleName)'"_x000D__x000A__x0009_$null = New-Item -Path $env:TEMP -Name $ModuleName -ItemType Directory -Force -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Extracting archive to '$($env:TEMP)\$($ModuleName)'"_x000D__x000A__x0009_Expand-Archive -Path "$($env:TEMP)\$($ModuleName).zip" -DestinationPath "$($env:TEMP)\$($ModuleName)" -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_$basePath = Get-ChildItem "$($env:TEMP)\$($ModuleName)\*" | Select-Object -First 1_x000D__x000A__x0009_if ($SubFolder) { $basePath = "$($basePath)\$($SubFolder)" }_x000D__x000A__x0009__x000D__x000A__x0009_# Only needed for PS v5+ but doesn't hurt anyway_x000D__x000A__x0009_$manifest = "$($basePath)\$($ModuleName).psd1"_x000D__x000A__x0009_$manifestData = Invoke-Expression ([System.IO.File]::ReadAllText($manifest))_x000D__x000A__x0009_$moduleVersion = $manifestData.ModuleVersion_x000D__x000A__x0009_Write-LocalMessage -Message "Download concluded: $($ModuleName) | Branch $($Branch) | Version $($moduleVersion)"_x000D__x000A__x0009__x000D__x000A__x0009_# Determine output path_x000D__x000A__x0009_$path = "$($env:ProgramFiles)\WindowsPowerShell\Modules\$($ModuleName)"_x000D__x000A__x0009_if ($UserMode) { $path = "$($HOME)\Documents\WindowsPowerShell\Modules\$($ModuleName)" }_x000D__x000A__x0009_if ($PSVersionTable.PSVersion.Major -ge 5) { $path += "\$moduleVersion" }_x000D__x000A__x0009__x000D__x000A__x0009_if ((Test-Path $path) -and (-not $Force))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Write-LocalMessage -Message "Module already installed, interrupting installation"_x000D__x000A__x0009__x0009_return_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Creating folder: $($path)"_x000D__x000A__x0009_$null = New-Item -Path $path -ItemType Directory -Force -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Copying files to $($path)"_x000D__x000A__x0009_foreach ($file in (Get-ChildItem -Path $basePath))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Move-Item -Path $file.FullName -Destination $path -ErrorAction Stop_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Cleaning up temporary files"_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName)" -Force -Recurse_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName).zip" -Force_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Installation of the module $($ModuleName), Branch $($Branch), Version $($moduleVersion) completed successfully!"_x000D__x000A_}_x000D__x000A_catch_x000D__x000A_{_x000D__x000A__x0009_Write-LocalMessage -Message "Installation of the module $($ModuleName) failed!"_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Cleaning up temporary files"_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName)" -Force -Recurse_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName).zip" -Force_x000D__x000A__x0009__x000D__x000A__x0009_throw_x000D__x000A_}</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="35">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="36">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">install.ps1</S>
              <S N="RelativePath">install.ps1</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="37">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="38">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAr6gFPCMNCgkuU1lOT1BTSVMNCgkJSW5zdGFsbHMgdGhlIFBTTW9kdWxlRGV2ZWxvcG1lbnQgTW9kdWxlIGZyb20gZ2l0aHViDQoJCQ0KCS5ERVNDUklQVElPTg0KCQlUaGlzIHNjcmlwdCBpbnN0YWxscyB0aGUgUFNNb2R1bGVEZXZlbG9wbWVudCBNb2R1bGUgZnJvbSBnaXRodWIuDQoJCQ0KCQlJdCBkb2VzIHNvIGJ5IC4uLg0KCQktIGRvd25sb2FkaW5nIHRoZSBzcGVjaWZpZWQgYnJhbmNoIGFzIHppcCB0byAkZW52OlRFTVANCgkJLSBVbnBhY2tpbmcgdGhhdCB6aXAgZmlsZSB0byBhIGZvbGRlciBpbiAkZW52OlRFTVANCgkJLSBNb3ZpbmcgdGhhdCBjb250ZW50IHRvIGEgbW9kdWxlIGZvbGRlciBpbiBlaXRoZXIgcHJvZ3JhbSBmaWxlcyAoZGVmYXVsdCkgb3IgdGhlIHVzZXIgcHJvZmlsZQ0KCQ0KCS5QQVJBTUVURVIgQnJhbmNoDQoJCVRoZSBicmFuY2ggdG8gaW5zdGFsbC4gSW5zdGFsbHMgbWFzdGVyIGJ5IGRlZmF1bHQuDQoJCVVua25vd24gYnJhbmNoZXMgd2lsbCB0ZXJtaW5hdGUgdGhlIHNjcmlwdCBpbiBlcnJvci4NCgkNCgkuUEFSQU1FVEVSIFVzZXJNb2RlDQoJCVRoZSBkb3dubG9hZGVkIG1vZHVsZSB3aWxsIGJlIG1vdmVkIHRvIHRoZSB1c2VyIHByb2ZpbGUsIHJhdGhlciB0aGFuIHByb2dyYW0gZmlsZXMuDQoNCgkuUEFSQU1FVEVSIEZvcmNlDQoJCVRoZSBpbnN0YWxsIHNjcmlwdCB3aWxsIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBtb2R1bGUuDQojPg0KW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3RyaW5nXQ0KCSRCcmFuY2ggPSAibWFzdGVyIiwNCgkNCglbc3dpdGNoXQ0KCSRVc2VyTW9kZSwNCgkNCglbc3dpdGNoXQ0KCSRGb3JjZQ0KKQ0KDQojcmVnaW9uIENvbmZpZ3VyYXRpb24gZm9yIGNsb25pbmcgc2NyaXB0DQojIE5hbWUgb2YgdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIGNsb25lZA0KJE1vZHVsZU5hbWUgPSAiw75uYW1lw74iDQoNCiMgQmFzZSBwYXRoIHRvIHRoZSBnaXRodWIgcmVwb3NpdG9yeQ0KJEJhc2VVcmwgPSAiaHR0cHM6Ly9naXRodWIuY29tLzxJbnNlcnRVc2VybmFtZUhlcmU+L8O+bmFtZcO+Ig0KDQojIElmIHRoZSBtb2R1bGUgaXMgaW4gYSBzdWJmb2xkZXIgb2YgdGhlIGNsb25lZCByZXBvc2l0b3J5LCBzcGVjaWZ5IHJlbGF0aXZlIHBhdGggaGVyZS4gRW1wdHkgc3RyaW5nIHRvIHNraXAuDQokU3ViRm9sZGVyID0gIsO+bmFtZcO+Ig0KI2VuZHJlZ2lvbiBDb25maWd1cmF0aW9uIGZvciBjbG9uaW5nIHNjcmlwdA0KDQojcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQpmdW5jdGlvbiBDb21wcmVzcy1BcmNoaXZlDQp7DQoJPCMNCgkJLlNZTk9QU0lTDQoJCQlDcmVhdGVzIGFuIGFyY2hpdmUsIG9yIHppcHBlZCBmaWxlLCBmcm9tIHNwZWNpZmllZCBmaWxlcyBhbmQgZm9sZGVycy4NCg0KCQkuREVTQ1JJUFRJT04NCgkJCVRoZSBDb21wcmVzcy1BcmNoaXZlIGNtZGxldCBjcmVhdGVzIGEgemlwcGVkIChvciBjb21wcmVzc2VkKSBhcmNoaXZlIGZpbGUgZnJvbSBvbmUgb3IgbW9yZSBzcGVjaWZpZWQgZmlsZXMgb3IgZm9sZGVycy4gQW4gYXJjaGl2ZSBmaWxlIGFsbG93cyBtdWx0aXBsZSBmaWxlcyB0byBiZSBwYWNrYWdlZCwgYW5kIG9wdGlvbmFsbHkgY29tcHJlc3NlZCwgaW50byBhIHNpbmdsZSB6aXBwZWQgZmlsZSBmb3IgZWFzaWVyIGRpc3RyaWJ1dGlvbiBhbmQgc3RvcmFnZS4gQW4gYXJjaGl2ZSBmaWxlIGNhbiBiZSBjb21wcmVzc2VkIGJ5IHVzaW5nIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IHRoZSBDb21wcmVzc2lvbkxldmVsIHBhcmFtZXRlci4NCg0KCQkJQmVjYXVzZSBDb21wcmVzcy1BcmNoaXZlIHJlbGllcyB1cG9uIHRoZSBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgQVBJIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlIHRvIGNvbXByZXNzIGZpbGVzLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgdGhhdCB5b3UgY2FuIGNvbXByZXNzIGJ5IHVzaW5nIENvbXByZXNzLUFyY2hpdmUgaXMgY3VycmVudGx5IDIgR0IuIFRoaXMgaXMgYSBsaW1pdGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIEFQSS4NCg0KCQkuUEFSQU1FVEVSIFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCBvciBwYXRocyB0byB0aGUgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIGFyY2hpdmUgemlwcGVkIGZpbGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBhY2NlcHQgd2lsZGNhcmQgY2hhcmFjdGVycy4gV2lsZGNhcmQgY2hhcmFjdGVycyBhbGxvdyB5b3UgdG8gYWRkIGFsbCBmaWxlcyBpbiBhIGZvbGRlciB0byB5b3VyIHppcHBlZCBhcmNoaXZlIGZpbGUuIFRvIHNwZWNpZnkgbXVsdGlwbGUgcGF0aHMsIGFuZCBpbmNsdWRlIGZpbGVzIGluIG11bHRpcGxlIGxvY2F0aW9ucyBpbiB5b3VyIG91dHB1dCB6aXBwZWQgZmlsZSwgdXNlIGNvbW1hcyB0byBzZXBhcmF0ZSB0aGUgcGF0aHMuDQoNCgkJLlBBUkFNRVRFUiBMaXRlcmFsUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIG9yIHBhdGhzIHRvIHRoZSBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgYXJjaGl2ZSB6aXBwZWQgZmlsZS4gVW5saWtlIHRoZSBQYXRoIHBhcmFtZXRlciwgdGhlIHZhbHVlIG9mIExpdGVyYWxQYXRoIGlzIHVzZWQgZXhhY3RseSBhcyBpdCBpcyB0eXBlZC4gTm8gY2hhcmFjdGVycyBhcmUgaW50ZXJwcmV0ZWQgYXMgd2lsZGNhcmRzLiBJZiB0aGUgcGF0aCBpbmNsdWRlcyBlc2NhcGUgY2hhcmFjdGVycywgZW5jbG9zZSBlYWNoIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcywgdG8gaW5zdHJ1Y3QgV2luZG93cyBQb3dlclNoZWxsIG5vdCB0byBpbnRlcnByZXQgYW55IGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcy4gVG8gc3BlY2lmeSBtdWx0aXBsZSBwYXRocywgYW5kIGluY2x1ZGUgZmlsZXMgaW4gbXVsdGlwbGUgbG9jYXRpb25zIGluIHlvdXIgb3V0cHV0IHppcHBlZCBmaWxlLCB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBwYXRocy4NCg0KCQkuUEFSQU1FVEVSIERlc3RpbmF0aW9uUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBhcmNoaXZlIG91dHB1dCBmaWxlLiBUaGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZC4gVGhlIHNwZWNpZmllZCBEZXN0aW5hdGlvblBhdGggdmFsdWUgc2hvdWxkIGluY2x1ZGUgdGhlIGRlc2lyZWQgbmFtZSBvZiB0aGUgb3V0cHV0IHppcHBlZCBmaWxlOyBpdCBzcGVjaWZpZXMgZWl0aGVyIHRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIHRoZSB6aXBwZWQgZmlsZS4gSWYgdGhlIGZpbGUgbmFtZSBzcGVjaWZpZWQgaW4gRGVzdGluYXRpb25QYXRoIGRvZXMgbm90IGhhdmUgYSAuemlwIGZpbGUgbmFtZSBleHRlbnNpb24sIHRoZSBjbWRsZXQgYWRkcyBhIC56aXAgZmlsZSBuYW1lIGV4dGVuc2lvbi4NCg0KCQkuUEFSQU1FVEVSIENvbXByZXNzaW9uTGV2ZWwNCgkJCVNwZWNpZmllcyBob3cgbXVjaCBjb21wcmVzc2lvbiB0byBhcHBseSB3aGVuIHlvdSBhcmUgY3JlYXRpbmcgdGhlIGFyY2hpdmUgZmlsZS4gRmFzdGVyIGNvbXByZXNzaW9uIHJlcXVpcmVzIGxlc3MgdGltZSB0byBjcmVhdGUgdGhlIGZpbGUsIGJ1dCBjYW4gcmVzdWx0IGluIGxhcmdlciBmaWxlIHNpemVzLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoaXMgcGFyYW1ldGVyIGFyZToNCg0KCQkJLSBGYXN0ZXN0LiBVc2UgdGhlIGZhc3Rlc3QgY29tcHJlc3Npb24gbWV0aG9kIGF2YWlsYWJsZSB0byBkZWNyZWFzZSBwcm9jZXNzaW5nIHRpbWU7IHRoaXMgY2FuIHJlc3VsdCBpbiBsYXJnZXIgZmlsZSBzaXplcy4NCgkJCS0gTm9Db21wcmVzc2lvbi4gRG8gbm90IGNvbXByZXNzIHRoZSBzb3VyY2UgZmlsZXMuDQoJCQktIE9wdGltYWwuIFByb2Nlc3NpbmcgdGltZSBpcyBkZXBlbmRlbnQgb24gZmlsZSBzaXplLg0KDQoJCQlJZiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29tbWFuZCB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlLCBPcHRpbWFsLg0KDQoJCS5QQVJBTUVURVIgVXBkYXRlDQoJCQlVcGRhdGVzIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBieSByZXBsYWNpbmcgb2xkZXIgdmVyc2lvbnMgb2YgZmlsZXMgaW4gdGhlIGFyY2hpdmUgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBmaWxlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZXMuIFlvdSBjYW4gYWxzbyBhZGQgdGhpcyBwYXJhbWV0ZXIgdG8gYWRkIGZpbGVzIHRvIGFuIGV4aXN0aW5nIGFyY2hpdmUuDQoNCgkJLlBBUkFNRVRFUiBGb3JjZQ0KCQkJQHtUZXh0PX0NCg0KCQkuUEFSQU1FVEVSIENvbmZpcm0NCgkJCVByb21wdHMgeW91IGZvciBjb25maXJtYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIGNtZGxldC4NCg0KCQkuUEFSQU1FVEVSIFdoYXRJZg0KCQkJU2hvd3Mgd2hhdCB3b3VsZCBoYXBwZW4gaWYgdGhlIGNtZGxldCBydW5zLiBUaGUgY21kbGV0IGlzIG5vdCBydW4uDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMTogQ3JlYXRlIGFuIGFyY2hpdmUgZmlsZQ0KDQoJCQlQUyBDOlw+Q29tcHJlc3MtQXJjaGl2ZSAtTGl0ZXJhbFBhdGggQzpcUmVmZXJlbmNlXERyYWZ0ZG9jLmRvY3gsIEM6XFJlZmVyZW5jZVxJbWFnZXNcZGlhZ3JhbTIudnNkIC1Db21wcmVzc2lvbkxldmVsIE9wdGltYWwgLURlc3RpbmF0aW9uUGF0aCBDOlxBcmNoaXZlc1xEcmFmdC5aaXANCg0KCQkJVGhpcyBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmaWxlLCBEcmFmdC56aXAsIGJ5IGNvbXByZXNzaW5nIHR3byBmaWxlcywgRHJhZnRkb2MuZG9jeCBhbmQgZGlhZ3JhbTIudnNkLCBzcGVjaWZpZWQgYnkgdGhlIExpdGVyYWxQYXRoIHBhcmFtZXRlci4gVGhlIGNvbXByZXNzaW9uIGxldmVsIHNwZWNpZmllZCBmb3IgdGhpcyBvcGVyYXRpb24gaXMgT3B0aW1hbC4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSAyOiBDcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIHdpbGRjYXJkIGNoYXJhY3RlcnMNCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLVBhdGggQzpcUmVmZXJlbmNlXCogLUNvbXByZXNzaW9uTGV2ZWwgRmFzdGVzdCAtRGVzdGluYXRpb25QYXRoIEM6XEFyY2hpdmVzXERyYWZ0DQoNCgkJCVRoaXMgY29tbWFuZCBjcmVhdGVzIGEgbmV3IGFyY2hpdmUgZmlsZSwgRHJhZnQuemlwLCBpbiB0aGUgQzpcQXJjaGl2ZXMgZm9sZGVyLiBOb3RlIHRoYXQgdGhvdWdoIHRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIC56aXAgd2FzIG5vdCBhZGRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIsIFdpbmRvd3MgUG93ZXJTaGVsbCBhcHBlbmRzIHRoaXMgdG8gdGhlIHNwZWNpZmllZCBhcmNoaXZlIGZpbGUgbmFtZSBhdXRvbWF0aWNhbGx5LiBUaGUgbmV3IGFyY2hpdmUgZmlsZSBjb250YWlucyBldmVyeSBmaWxlIGluIHRoZSBDOlxSZWZlcmVuY2UgZm9sZGVyLCBiZWNhdXNlIGEgd2lsZGNhcmQgY2hhcmFjdGVyIHdhcyB1c2VkIGluIHBsYWNlIG9mIHNwZWNpZmljIGZpbGUgbmFtZXMgaW4gdGhlIFBhdGggcGFyYW1ldGVyLiBUaGUgc3BlY2lmaWVkIGNvbXByZXNzaW9uIGxldmVsIGlzIEZhc3Rlc3QsIHdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBhIGxhcmdlciBvdXRwdXQgZmlsZSwgYnV0IGNvbXByZXNzZXMgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgZmFzdGVyLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDM6IFVwZGF0ZSBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUNCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLVBhdGggQzpcUmVmZXJlbmNlXCogLVVwZGF0ZSAtRGVzdGluYXRpb25QYXRoIEM6XEFyY2hpdmVzXERyYWZ0LlppcA0KDQoJCQlUaGlzIGNvbW1hbmQgdXBkYXRlcyBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUsIERyYWZ0LlppcCwgaW4gdGhlIEM6XEFyY2hpdmVzIGZvbGRlci4gVGhlIGNvbW1hbmQgaXMgcnVuIHRvIHVwZGF0ZSBEcmFmdC5aaXAgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBleGlzdGluZyBmaWxlcyB0aGF0IGNhbWUgZnJvbSB0aGUgQzpcUmVmZXJlbmNlIGZvbGRlciwgYW5kIGFsc28gdG8gYWRkIG5ldyBmaWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBDOlxSZWZlcmVuY2Ugc2luY2UgRHJhZnQuWmlwIHdhcyBpbml0aWFsbHkgY3JlYXRlZC4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSA0OiBDcmVhdGUgYW4gYXJjaGl2ZSBmcm9tIGFuIGVudGlyZSBmb2xkZXINCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLVBhdGggQzpcUmVmZXJlbmNlIC1EZXN0aW5hdGlvblBhdGggQzpcQXJjaGl2ZXNcRHJhZnQNCg0KCQkJVGhpcyBjb21tYW5kIGNyZWF0ZXMgYW4gYXJjaGl2ZSBmcm9tIGFuIGVudGlyZSBmb2xkZXIsIEM6XFJlZmVyZW5jZS4gTm90ZSB0aGF0IHRob3VnaCB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiAuemlwIHdhcyBub3QgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyLCBXaW5kb3dzIFBvd2VyU2hlbGwgYXBwZW5kcyB0aGlzIHRvIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBmaWxlIG5hbWUgYXV0b21hdGljYWxseS4NCgkjPg0KCVtDbWRsZXRCaW5kaW5nKERlZmF1bHRQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGgiLCBTdXBwb3J0c1Nob3VsZFByb2Nlc3MgPSAkdHJ1ZSwgSGVscFVyaSA9ICJodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJRD0zOTMyNTIiKV0NCglwYXJhbQ0KCSgNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBvc2l0aW9uID0gMCwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBvc2l0aW9uID0gMCwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBvc2l0aW9uID0gMCwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aFVwZGF0ZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtzdHJpbmdbXV0NCgkJJFBhdGgsDQoNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGgiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGhXaXRoRm9yY2UiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGhXaXRoVXBkYXRlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtBbGlhcygiUFNQYXRoIildDQoJCVtzdHJpbmdbXV0NCgkJJExpdGVyYWxQYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLA0KCQkJCQlQb3NpdGlvbiA9IDEsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW3N0cmluZ10NCgkJJERlc3RpbmF0aW9uUGF0aCwNCg0KCQlbcGFyYW1ldGVyICgNCgkJCQkJbWFuZGF0b3J5ID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtWYWxpZGF0ZVNldCgiT3B0aW1hbCIsICJOb0NvbXByZXNzaW9uIiwgIkZhc3Rlc3QiKV0NCgkJW3N0cmluZ10NCgkJJENvbXByZXNzaW9uTGV2ZWwgPSAiT3B0aW1hbCIsDQoNCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aFVwZGF0ZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aFdpdGhVcGRhdGUiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtzd2l0Y2hdDQoJCSRVcGRhdGUgPSAkZmFsc2UsDQoNCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbcGFyYW1ldGVyKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbc3dpdGNoXQ0KCQkkRm9yY2UgPSAkZmFsc2UNCgkpDQoNCglCRUdJTg0KCXsNCgkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24gLUVycm9yQWN0aW9uIElnbm9yZQ0KCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtIC1FcnJvckFjdGlvbiBJZ25vcmUNCg0KCQkkemlwRmlsZUV4dGVuc2lvbiA9ICIuemlwIg0KDQoJCSRMb2NhbGl6ZWREYXRhID0gQ29udmVydEZyb20tU3RyaW5nRGF0YSBAJw0KUGF0aE5vdEZvdW5kRXJyb3I9VGhlIHBhdGggJ3swfScgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHZhbGlkIGZpbGUgc3lzdGVtIHBhdGguDQpFeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgcGF0aCAnezB9JyBpcyBub3QgYSB2YWxpZCBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgcGF0aC4NCkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3I9ezB9IGlzIG5vdCBhIHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0LiB7MX0gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQuDQpBcmNoaXZlRmlsZUlzUmVhZE9ubHk9VGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGFyY2hpdmUgZmlsZSB7MH0gaXMgc2V0IHRvICdSZWFkT25seScgaGVuY2UgaXQgY2Fubm90IGJlIHVwZGF0ZWQuIElmIHlvdSBpbnRlbmQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUsIHJlbW92ZSB0aGUgJ1JlYWRPbmx5JyBhdHRyaWJ1dGUgb24gdGhlIGFyY2hpdmUgZmlsZSBlbHNlIHVzZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGFuZCBjcmVhdGUgYSBuZXcgYXJjaGl2ZSBmaWxlLg0KWmlwRmlsZUV4aXN0RXJyb3I9VGhlIGFyY2hpdmUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIFVzZSB0aGUgLVVwZGF0ZSBwYXJhbWV0ZXIgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUgb3IgdXNlIHRoZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLg0KRHVwbGljYXRlUGF0aEZvdW5kRXJyb3I9VGhlIGlucHV0IHRvIHswfSBwYXJhbWV0ZXIgY29udGFpbnMgYSBkdXBsaWNhdGUgcGF0aCAnezF9Jy4gUHJvdmlkZSBhIHVuaXF1ZSBzZXQgb2YgcGF0aHMgYXMgaW5wdXQgdG8gezJ9IHBhcmFtZXRlci4NCkFyY2hpdmVGaWxlSXNFbXB0eT1UaGUgYXJjaGl2ZSBmaWxlIHswfSBpcyBlbXB0eS4NCkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0PVRoZSBhcmNoaXZlIGZpbGUgJ3swfScgY3JlYXRpb24gaXMgaW4gcHJvZ3Jlc3MuLi4NCkV4cGFuZFByb2dyZXNzQmFyVGV4dD1UaGUgYXJjaGl2ZSBmaWxlICd7MH0nIGV4cGFuc2lvbiBpcyBpbiBwcm9ncmVzcy4uLg0KQXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlPVRoZSBhcmNoaXZlIGZpbGUgcGF0aCAnezB9JyBzdXBwbGllZCB0byB0aGUgRGVzdGluYXRpb25QYXRoIHBhdGFtZXRlciBkb2VzIG5vdCBpbmNsdWRlIC56aXAgZXh0ZW5zaW9uLiBIZW5jZSAuemlwIGlzIGFwcGVuZGVkIHRvIHRoZSBzdXBwbGllZCBEZXN0aW5hdGlvblBhdGggcGF0aCBhbmQgdGhlIGFyY2hpdmUgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIGF0ICd7MX0nLg0KQWRkSXRlbXRvQXJjaGl2ZUZpbGU9QWRkaW5nICd7MH0nLg0KQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoPUNyZWF0ZWQgJ3swfScuDQpJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3I9VGhlIGFyY2hpdmUgZmlsZSBwYXRoICd7MH0nIHNwZWNpZmllZCBhcyBpbnB1dCB0byB0aGUgezF9IHBhcmFtZXRlciBpcyByZXNvbHZpbmcgdG8gbXVsdGlwbGUgZmlsZSBzeXN0ZW0gcGF0aHMuIFByb3ZpZGUgYSB1bmlxdWUgcGF0aCB0byB0aGUgezJ9IHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGhhcyB0byBiZSBjcmVhdGVkLg0KSW52YWxpZEV4cGFuZGVkRGlyUGF0aEVycm9yPVRoZSBkaXJlY3RvcnkgcGF0aCAnezB9JyBzcGVjaWZpZWQgYXMgaW5wdXQgdG8gdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIgaXMgcmVzb2x2aW5nIHRvIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzLiBQcm92aWRlIGEgdW5pcXVlIHBhdGggdG8gdGhlIERlc3RpbmF0aW9uIHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzIGhhdmUgdG8gYmUgZXhwYW5kZWQuDQpGaWxlRXhpc3RzRXJyb3I9RmFpbGVkIHRvIGNyZWF0ZSBmaWxlICd7MH0nIHdoaWxlIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlICd7MX0nIGNvbnRlbnRzIGFzIHRoZSBmaWxlICd7Mn0nIGFscmVhZHkgZXhpc3RzLiBVc2UgdGhlIC1Gb3JjZSBwYXJhbWV0ZXIgaWYgeW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgJ3szfScgY29udGVudHMgd2hlbiBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZS4NCkRlbGV0ZUFyY2hpdmVGaWxlPVRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBhcmNoaXZlIGZpbGUgJ3swfScgaXMgZGVsZXRlZCBhcyBpdCBpcyBub3QgdXNhYmxlLg0KSW52YWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgZGVzdGluYXRpb24gcGF0aCAnezB9JyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgYXJjaGl2ZSBmaWxlIG5hbWUuDQpQcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2U9UHJlcGFyaW5nIHRvIGNvbXByZXNzLi4uDQpQcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlPVByZXBhcmluZyB0byBleHBhbmQuLi4NCidADQoNCgkJI3JlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KCQlmdW5jdGlvbiBHZXRSZXNvbHZlZFBhdGhIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNMaXRlcmFsUGF0aCwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlBTQ21kbGV0XQ0KCQkJCSRjYWxsZXJQU0NtZGxldA0KCQkJKQ0KDQoJCQkkcmVzb2x2ZWRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJdHJ5DQoJCQkJew0KCQkJCQlpZiAoJGlzTGl0ZXJhbFBhdGgpDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50UmVzb2x2ZWRQYXRocyA9IFJlc29sdmUtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudFJlc29sdmVkUGF0aHMgPSBSZXNvbHZlLVBhdGggLVBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQl9DQoJCQkJY2F0Y2gNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGN1cnJlbnRQYXRoKQ0KCQkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkXy5FeGNlcHRpb24NCgkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkFyY2hpdmVDbWRsZXRQYXRoTm90Rm91bmQiICRudWxsIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXhjZXB0aW9uICRjdXJyZW50UGF0aA0KCQkJCQkkY2FsbGVyUFNDbWRsZXQuVGhyb3dUZXJtaW5hdGluZ0Vycm9yKCRlcnJvclJlY29yZCkNCgkJCQl9DQoNCgkJCQlmb3JlYWNoICgkY3VycmVudFJlc29sdmVkUGF0aCBpbiAkY3VycmVudFJlc29sdmVkUGF0aHMpDQoJCQkJew0KCQkJCQkkcmVzb2x2ZWRQYXRocyArPSAkY3VycmVudFJlc29sdmVkUGF0aC5Qcm92aWRlclBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCSRyZXNvbHZlZFBhdGhzDQoJCX0NCg0KCQlmdW5jdGlvbiBBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoJCXsNCg0KCQkJaWYgKCRQU0VkaXRpb24gLWVxICJEZXNrdG9wIikNCgkJCXsNCgkJCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbg0KCQkJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIElzVmFsaWRGaWxlU3lzdGVtUGF0aA0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkcmVzdWx0ID0gJHRydWU7DQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQlpZiAoIShbU3lzdGVtLklPLkZpbGVdOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSAtb3IgW1N5c3RlbS5JTy5EaXJlY3RvcnldOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSkpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRjdXJyZW50UGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJQYXRoTm90Rm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIFZhbGlkYXRlRHVwbGljYXRlRmlsZVN5c3RlbVBhdGgNCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRpbnB1dFBhcmFtZXRlciwNCg0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkdW5pcXVlSW5wdXRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJJGN1cnJlbnRJbnB1dFBhdGggPSAkY3VycmVudFBhdGguVG9VcHBlcigpDQoJCQkJaWYgKCR1bmlxdWVJbnB1dFBhdGhzLkNvbnRhaW5zKCRjdXJyZW50SW5wdXRQYXRoKSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRHVwbGljYXRlUGF0aEZvdW5kRXJyb3IgLWYgJGlucHV0UGFyYW1ldGVyLCAkY3VycmVudFBhdGgsICRpbnB1dFBhcmFtZXRlcikNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJEdXBsaWNhdGVQYXRoRm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkdW5pcXVlSW5wdXRQYXRocyArPSAkY3VycmVudElucHV0UGF0aA0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzaW9uTGV2ZWxNYXBwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsDQoJCQkpDQoNCgkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6T3B0aW1hbA0KDQoJCQkjIENvbXByZXNzaW9uTGV2ZWwgZm9ybWF0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlzd2l0Y2ggKCRjb21wcmVzc2lvbkxldmVsLlRvU3RyaW5nKCkpDQoJCQl7DQoJCQkJIkZhc3Rlc3QiDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06OkZhc3Rlc3QNCgkJCQl9DQoJCQkJIk5vQ29tcHJlc3Npb24iDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06Ok5vQ29tcHJlc3Npb24NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAkY29tcHJlc3Npb25MZXZlbEZvcm1hdA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRzb3VyY2VGaWxlUGF0aHMgPSBAKCkNCgkJCSRzb3VyY2VEaXJQYXRocyA9IEAoKQ0KDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHNvdXJjZVBhdGgpDQoJCQl7DQoJCQkJJHJlc3VsdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1QYXRoVHlwZSBMZWFmDQoJCQkJaWYgKCRyZXN1bHQgLWVxICR0cnVlKQ0KCQkJCXsNCgkJCQkJJHNvdXJjZUZpbGVQYXRocyArPSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHNvdXJjZURpclBhdGhzICs9ICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmUgb3IgbW9yZSBkaXJlY3RvcnkgKHRoaXMgZGlyZWN0b3J5IGNhbiBoYXZlIGZpbGVzIHVuZGVyIGl0KSBhbmQgbm8gZmlsZXMgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1lcSAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1ndCAwKQ0KCQkJew0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMC9bZG91YmxlXSRzb3VyY2VEaXJQYXRocy5Db3VudA0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoJCQl9DQoNCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25seSBmaWxlcyB0byBiZSBjb21wcmVzc2VkLg0KCQkJZWxzZUlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1ndCAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1lcSAwKQ0KCQkJew0KCQkJCSMgJHByZXZpb3VzU2VnbWVudFdlaWdodCBpcyBlcXVhbCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBzZXQgdG8gMTAwIGFzIGFsbCBmaWxlcyBoYXZlIGVxdWFsIHdlaWdodGFnZS4NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMA0KDQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IENvbXByZXNzRmlsZXNIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCX0NCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25lIG9yIG1vcmUgZmlsZXMgYW5kIG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzICh0aGlzIGRpcmVjdG9yeSBjYW4gaGF2ZSBmaWxlcyB1bmRlciBpdCkgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWVsc2VpZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZ3QgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZ3QgMCkNCgkJCXsNCgkJCQkjIGVhY2ggZGlyZWN0b3J5IGlzIGNvbnNpZGVyZWQgYXMgYW4gaW5kaXZpZHVhbCBzZWdtZW50cyAmIGFsbCB0aGUgaW5kaXZpZHVhbCBmaWxlcyBhcmUgY2x1YmVkIGluIHRvIGEgc2VwYXJhdGUgc2dlbW5ldC4NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDAvW2RvdWJsZV0oJHNvdXJjZURpclBhdGhzLkNvdW50ICsgMSkNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoNCgkJCQkkY291bnQgPSBDb21wcmVzc0ZpbGVzSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCX0NCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzRmlsZXNIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZUZpbGVQYXRocywNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IFppcEFyY2hpdmVIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJG51bGwgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzU2luZ2xlRGlySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkc291cmNlRGlyUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkdXNlUGFyZW50RGlyQXNSb290LA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W1N5c3RlbS5TdHJpbmddXSRzdWJEaXJGaWxlcyA9IEAoKQ0KDQoJCQlpZiAoJHVzZVBhcmVudERpckFzUm9vdCkNCgkJCXsNCgkJCQkkc291cmNlRGlySW5mbyA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvIC1Bcmd1bWVudExpc3QgJHNvdXJjZURpclBhdGgNCgkJCQkkc291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlySW5mby5QYXJlbnQuRnVsbE5hbWUNCg0KCQkJCSMgSWYgdGhlIGRpcmVjdG9yeSBpcyBwcmVzZW50IGF0IHRoZSBkcml2ZSBsZXZlbCB0aGUgRGlyZWN0b3J5SW5mby5QYXJlbnQgaW5jbHVkZSAnXCcgZXhhbXBsZTogQzpcDQoJCQkJIyBPbiB0aGUgb3RoZXIgaGFuZCBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBhdCBhIGRlcGVyIGxldmVsIHRoZW4gRGlyZWN0b3J5SW5mby5QYXJlbnQNCgkJCQkjIGhhcyBqdXN0IHRoZSBwYXRoICh3aXRob3V0IGFuIGVuZGluZyAnXCcpLiBleGFtcGxlIEM6XHNvdXJjZQ0KCQkJCWlmICgkc291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1lcSAzKQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUgKyAiXCINCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpclBhdGgNCgkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZSArICJcIg0KCQkJfQ0KDQoJCQkkZGlyQ29udGVudHMgPSBHZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAkc291cmNlRGlyUGF0aCAtUmVjdXJzZQ0KCQkJZm9yZWFjaCAoJGN1cnJlbnRDb250ZW50IGluICRkaXJDb250ZW50cykNCgkJCXsNCgkJCQkkaXNDb250YWluZXIgPSAkY3VycmVudENvbnRlbnQgLWlzIFtTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mb10NCgkJCQlpZiAoISRpc0NvbnRhaW5lcikNCgkJCQl7DQoJCQkJCSRzdWJEaXJGaWxlcy5BZGQoJGN1cnJlbnRDb250ZW50LkZ1bGxOYW1lKQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkjIFRoZSBjdXJyZW50Q29udGVudCBwb2ludHMgdG8gYSBkaXJlY3RvcnkuDQoJCQkJCSMgV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGFuIGVtcHR5IGRpcmVjdG9yeSwgaWYgc28gc3VjaCBhDQoJCQkJCSMgZGlyZWN0b3J5IGhhcyB0byBiZSBleHBsaWN0bHkgYWRkZWQgdG8gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJIyBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGUgR2V0RmlsZXMoKSBBUEkgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4NCgkJCQkJJGZpbGVzID0gJGN1cnJlbnRDb250ZW50LkdldEZpbGVzKCkNCgkJCQkJaWYgKCRmaWxlcy5Db3VudCAtZXEgMCkNCgkJCQkJew0KCQkJCQkJJHN1YkRpckZpbGVzLkFkZCgkY3VycmVudENvbnRlbnQuRnVsbE5hbWUgKyAiXCIpDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBaaXBBcmNoaXZlSGVscGVyICRzdWJEaXJGaWxlcy5Ub0FycmF5KCkgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBaaXBBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbU3lzdGVtLlN0cmluZ11dDQoJCQkJJHNvdXJjZVBhdGhzLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRmaWxlTW9kZSA9IFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpDcmVhdGUNCgkJCSRyZXN1bHQgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIExlYWYNCgkJCWlmICgkcmVzdWx0IC1lcSAkdHJ1ZSkNCgkJCXsNCgkJCQkkZmlsZU1vZGUgPSBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3Blbg0KCQkJfQ0KDQoJCQlBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhcmNoaXZlIGZpbGUgaGFzIHdyaXRlIGFjY2Vzcy4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkZGVzdGluYXRpb25QYXRoLCAkZmlsZU1vZGUpDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVTdHJlYW0gLUFyZ3VtZW50TGlzdCAkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzDQoNCgkJCQkkemlwQXJjaGl2ZUFyZ3MgPSBAKCRhcmNoaXZlRmlsZVN0cmVhbSwgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlTW9kZV06OlVwZGF0ZSwgJGZhbHNlKQ0KCQkJCSR6aXBBcmNoaXZlID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgLUFyZ3VtZW50TGlzdCAkemlwQXJjaGl2ZUFyZ3MNCg0KCQkJCSRjdXJyZW50RW50cnlDb3VudCA9IDANCgkJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuQ29tcHJlc3NQcm9ncmVzc0JhclRleHQgLWYgJGRlc3RpbmF0aW9uUGF0aCkNCgkJCQkkYnVmZmVyU2l6ZSA9IDRrYg0KCQkJCSRidWZmZXIgPSBOZXctT2JqZWN0IEJ5dGVbXSAkYnVmZmVyU2l6ZQ0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRGaWxlUGF0aCBpbiAkc291cmNlUGF0aHMpDQoJCQkJew0KCQkJCQlpZiAoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgLW5lICRudWxsIC1hbmQgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkaW5kZXggPSAkY3VycmVudEZpbGVQYXRoLkluZGV4T2YoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKQ0KCQkJCQkJJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZyA9ICRjdXJyZW50RmlsZVBhdGguU3Vic3RyaW5nKCRpbmRleCwgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoKQ0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSAkY3VycmVudEZpbGVQYXRoLlJlcGxhY2UoJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZywgIiIpLlRyaW0oKQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSBbU3lzdGVtLklPLlBhdGhdOjpHZXRGaWxlTmFtZSgkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQl9DQoNCgkJCQkJIyBVcGRhdGUgbW9kZSBpcyBzZWxlY3RlZC4NCgkJCQkJIyBDaGVjayB0byBzZWUgaWYgYXJjaGl2ZSBmaWxlIGFscmVhZHkgY29udGFpbnMgb25lIG9yIG1vcmUgemlwIGZpbGVzIGluIGl0Lg0KCQkJCQlpZiAoJGlzVXBkYXRlTW9kZSAtZXEgJHRydWUgLWFuZCAkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50IC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkZW50cnlUb0JlVXBkYXRlZCA9ICRudWxsDQoNCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJCSMgSWYgc28gcmVwbGFjZSBpdCB3aXRoIG5ldyBmaWxlIGZyb20gdGhlIGlucHV0IHNvdXJjZS4NCgkJCQkJCSMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUgZmlsZSB0aGVuIGRlZmF1bHQgdG8NCgkJCQkJCSMgY3JlYXRlIG1vZGUgYW5kIGNyZWF0ZSB0aGUgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCg0KCQkJCQkJZm9yZWFjaCAoJGN1cnJlbnRBcmNoaXZlRW50cnkgaW4gJHppcEFyY2hpdmUuRW50cmllcykNCgkJCQkJCXsNCgkJCQkJCQlpZiAoJGN1cnJlbnRBcmNoaXZlRW50cnkuRnVsbE5hbWUgLWVxICRyZWxhdGl2ZUZpbGVQYXRoKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQgPSAkY3VycmVudEFyY2hpdmVFbnRyeQ0KCQkJCQkJCQlicmVhaw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKCRlbnRyeVRvQmVVcGRhdGVkIC1uZSAkbnVsbCkNCgkJCQkJCXsNCgkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQuRGVsZXRlKCkNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCSRjb21wcmVzc2lvbiA9IENvbXByZXNzaW9uTGV2ZWxNYXBwZXIgJGNvbXByZXNzaW9uTGV2ZWwNCg0KCQkJCQkjIElmIGEgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGFkZGVkIHRvIGFuIGFyY2hpdmUgZmlsZSwNCgkJCQkJIyBieSBjb252ZW50aW9uIHRoZSAuTmV0IEFQSSdzIGV4cGVjdCB0aGUgcGF0aCBvZiB0aGUgZGlyZXRjb3J5DQoJCQkJCSMgdG8gZW5kIHdpdGggJ1wnIHRvIGRldGVjdCB0aGUgcGF0aCBhcyBhbiBkaXJlY3RvcnkuDQoJCQkJCWlmICghJHJlbGF0aXZlRmlsZVBhdGguRW5kc1dpdGgoIlwiLCBbU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkNCgkJCQkJew0KCQkJCQkJdHJ5DQoJCQkJCQl7DQoJCQkJCQkJdHJ5DQoJCQkJCQkJew0KCQkJCQkJCQkkY3VycmVudEZpbGVTdHJlYW0gPSBbU3lzdGVtLklPLkZpbGVdOjpPcGVuKCRjdXJyZW50RmlsZVBhdGgsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCQkJCX0NCgkJCQkJCQljYXRjaA0KCQkJCQkJCXsNCgkJCQkJCQkJIyBGYWlsZWQgdG8gYWNjZXNzIHRoZSBmaWxlLiBXcml0ZSBhIG5vbiB0ZXJtaW5hdGluZyBlcnJvciB0byB0aGUgcGlwZWxpbmUNCgkJCQkJCQkJIyBhbmQgbW92ZSBvbiB3aXRoIHRoZSByZW1haW5pbmcgZmlsZXMuDQoJCQkJCQkJCSRleGNlcHRpb24gPSAkXy5FeGNlcHRpb24NCgkJCQkJCQkJaWYgKCRudWxsIC1uZSAkXy5FeGNlcHRpb24gLWFuZA0KCQkJCQkJCQkJJG51bGwgLW5lICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbikNCgkJCQkJCQkJew0KCQkJCQkJCQkJJGV4Y2VwdGlvbiA9ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbg0KCQkJCQkJCQl9DQoJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJDb21wcmVzc0FyY2hpdmVVbmF1dGhvcml6ZWRBY2Nlc3NFcnJvciIgJG51bGwgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpQZXJtaXNzaW9uRGVuaWVkKSAkZXhjZXB0aW9uICRjdXJyZW50RmlsZVBhdGgNCgkJCQkJCQkJV3JpdGUtRXJyb3IgLUVycm9yUmVjb3JkICRlcnJvclJlY29yZA0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkJpbmFyeVJlYWRlciAkY3VycmVudEZpbGVTdHJlYW0NCg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeSA9ICR6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KCRyZWxhdGl2ZUZpbGVQYXRoLCAkY29tcHJlc3Npb24pDQoNCgkJCQkJCQkJIyBVcGRhdGluZyAgdGhlIEZpbGUgQ3JlYXRpb24gdGltZSBzbyB0aGF0IHRoZSBzYW1lIHRpbWVzdGFtcCB3b3VsZCBiZSByZXRhaW5lZCBhZnRlciBleHBhbmRpbmcgdGhlIGNvbXByZXNzZWQgZmlsZS4NCgkJCQkJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgR2V0LUNoaWxkSXRlbSB3b3VsZCBzdWNjZWVkLg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeS5MYXN0V3JpdGVUaW1lID0gKEdldC1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEZpbGVQYXRoKS5MYXN0V3JpdGVUaW1lDQoNCgkJCQkJCQkJJGRlc3RTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlXcml0ZXIgJGN1cnJlbnRBcmNoaXZlRW50cnkuT3BlbigpDQoNCgkJCQkJCQkJd2hpbGUgKCRudW1iZXJPZkJ5dGVzUmVhZCA9ICRzcmNTdHJlYW0uUmVhZCgkYnVmZmVyLCAwLCAkYnVmZmVyU2l6ZSkpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLldyaXRlKCRidWZmZXIsIDAsICRudW1iZXJPZkJ5dGVzUmVhZCkNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLkZsdXNoKCkNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gMQ0KCQkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZmluYWxseQ0KCQkJCQkJew0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGN1cnJlbnRGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRzcmNTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkgPSAkemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgiJHJlbGF0aXZlRmlsZVBhdGgiLCAkY29tcHJlc3Npb24pDQoJCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9IDENCgkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJfQ0KDQoJCQkJCWlmICgkbnVsbCAtbmUgJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSkNCgkJCQkJew0KCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlDQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQlQcm9ncmVzc0JhckhlbHBlciAiQ29tcHJlc3MtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICRzb3VyY2VQYXRocy5Db3VudCAgJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkJfQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCUlmICgkbnVsbCAtbmUgJHppcEFyY2hpdmUpDQoJCQkJew0KCQkJCQkkemlwQXJjaGl2ZS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQlJZiAoJG51bGwgLW5lICRhcmNoaXZlRmlsZVN0cmVhbSkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQkjIENvbXBsZXRlIHdyaXRpbmcgcHJvZ3Jlc3MuDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICJDb21wcmVzcy1BcmNoaXZlIiAtQ29tcGxldGVkDQoJCQl9DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXJjaGl2ZSBmaWxlDQojIHBhdGggJiBpdHMgZmlsZSBmb3JtYXQuIFRoZSBvbmx5IHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0IGlzIC56aXANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkYXJjaGl2ZUZpbGUNCgkJCSkNCg0KCQkJaWYgKFtTeXN0ZW0uSU8uRmlsZV06OkV4aXN0cygkYXJjaGl2ZUZpbGUpKQ0KCQkJew0KCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGFyY2hpdmVGaWxlKQ0KDQoJCQkJIyBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGlzIHNwZWNpZmVkIGZvciB0aGUgemlwIGZpbGUuDQoJCQkJaWYgKCRleHRlbnNpb24gLW5lICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yIC1mICRleHRlbnNpb24sICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIk5vdFN1cHBvcnRlZEFyY2hpdmVGaWxlRXh0ZW5zaW9uIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXh0ZW5zaW9uDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGFyY2hpdmVGaWxlKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiUGF0aE5vdEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkYXJjaGl2ZUZpbGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRXhwYW5kQXJjaGl2ZUhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGV4cGFuZCB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzDQojIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIEV4cGFuZEFyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRhcmNoaXZlRmlsZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGV4cGFuZGVkRGlyLA0KDQoJCQkJW3JlZl0NCgkJCQkkZXhwYW5kZWRJdGVtcywNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRmb3JjZSwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc1ZlcmJvc2UsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNDb25maXJtDQoJCQkpDQoNCgkJCUFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBUaGUgZXhpc3RhbmNlIG9mIGFyY2hpdmUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCQkJIyBiZWZvcmUgY2FsbGluZyB0aGlzIGhlbHBlciBmdW5jdGlvbi4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkYXJjaGl2ZUZpbGUsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlU3RyZWFtIC1Bcmd1bWVudExpc3QgJGFyY2hpdmVGaWxlU3RyZWFtQXJncw0KDQoJCQkJJHppcEFyY2hpdmVBcmdzID0gQCgkYXJjaGl2ZUZpbGVTdHJlYW0sIFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZU1vZGVdOjpSZWFkLCAkZmFsc2UpDQoJCQkJJHppcEFyY2hpdmUgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSAtQXJndW1lbnRMaXN0ICR6aXBBcmNoaXZlQXJncw0KDQoJCQkJaWYgKCR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgLWVxIDApDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVJc0VtcHR5ID0gKCRMb2NhbGl6ZWREYXRhLkFyY2hpdmVGaWxlSXNFbXB0eSAtZiAkYXJjaGl2ZUZpbGUpDQoJCQkJCVdyaXRlLVZlcmJvc2UgJGFyY2hpdmVGaWxlSXNFbXB0eQ0KCQkJCQlyZXR1cm4NCgkJCQl9DQoNCgkJCQkkY3VycmVudEVudHJ5Q291bnQgPSAwDQoJCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZFByb2dyZXNzQmFyVGV4dCAtZiAkYXJjaGl2ZUZpbGUpDQoNCgkJCQkjIFRoZSBhcmNoaXZlIGVudHJpZXMgY2FuIGVpdGhlciBiZSBlbXB0eSBkaXJlY3RvcmllcyBvciBmaWxlcy4NCgkJCQlmb3JlYWNoICgkY3VycmVudEFyY2hpdmVFbnRyeSBpbiAkemlwQXJjaGl2ZS5FbnRyaWVzKQ0KCQkJCXsNCgkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoID0gSm9pbi1QYXRoIC1QYXRoICRleHBhbmRlZERpciAtQ2hpbGRQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5LkZ1bGxOYW1lDQoJCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KDQoJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBpcyBhbiBlbXB0eSBkaXJlY3RvcnkNCgkJCQkJIyBUaGUgRnVsbE5hbWUgb2YgdGhlIEFyY2hpdmUgRW50cnkgcmVwcmVzZW50aW5nIGEgZGlyZWN0b3J5IHdvdWxkIGVuZCB3aXRoIGEgdHJhaWxpbmcgJ1wnLg0KCQkJCQlpZiAoJGV4dGVuc2lvbiAtZXEgW3N0cmluZ106OkVtcHR5IC1hbmQNCgkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aC5FbmRzV2l0aCgiXCIsIFtTdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKQ0KCQkJCQl7DQoJCQkJCQkkcGF0aEV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBleHBlY3RzIGFuIGVtcHR5IGRpcmVjdG9yeS4NCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSBpcyBlbXB0eS4gSWYgaXRzIG5vdCBlbXB0eQ0KCQkJCQkJIyB0aGVuIGl0IG1lYW5zIHRoYXQgdXNlciBoYXMgYWRkZWQgdGhpcyBkaXJlY3RvcnkgYnkgb3RoZXIgbWVhbnMuDQoJCQkJCQlpZiAoJHBhdGhFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCXsNCgkJCQkJCQlOZXctSXRlbSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIHwgT3V0LU51bGwNCg0KCQkJCQkJCWlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGFkZEVtcHR5RGlyZWN0b3J5dG9FeHBhbmRlZFBhdGhNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRW1wdHlEaXJlY3Rvcnl0b0V4cGFuZGVkUGF0aE1lc3NhZ2UNCg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQl0cnkNCgkJCQkJCXsNCgkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVJbmZvIC1Bcmd1bWVudExpc3QgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoJCQkJCQkJJHBhcmVudERpckV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXINCg0KCQkJCQkJCSMgSWYgdGhlIFBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGUgaXQuDQoJCQkJCQkJaWYgKCRwYXJlbnREaXJFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCQl7DQoJCQkJCQkJCU5ldy1JdGVtICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gfCBPdXQtTnVsbA0KDQoJCQkJCQkJCWlmICghKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXIpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkjIFRoZSBkaXJlY3RvcnkgcmVmZXJyZWQgYnkgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuDQoJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCSMgYW5kIGF1dGhvcml6YXRpb24gd2FzIG5vdCBwcm92aWRlZCB3aGVuIGNvbmZpcm1hdGlvbiB3YXMgcHJvbXB0ZWQuIEluIHN1Y2ggYSBzY2VuYXJpbywNCgkJCQkJCQkJCSMgd2Ugc2tpcCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBhcmNoaXZlIGFuZCBjb250aW51ZSB3aXRoIHRoZSByZW1haW5pbmcgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzLg0KCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZQ0KCQkJCQkJCX0NCg0KCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJGZhbHNlDQoNCgkJCQkJCQkjIENoZWNrIGlmIHRoZSBmaWxlIGluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgY29udGVudHMNCgkJCQkJCQkjIHdvdWxkIGJlIGV4cGFuZGVkIGFscmVhZHkgZXhpc3RzLg0KCQkJCQkJCWlmICgkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkV4aXN0cykNCgkJCQkJCQl7DQoJCQkJCQkJCWlmICgkZm9yY2UpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCVJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIC1Gb3JjZSAtRXJyb3JWYXJpYWJsZSBldiAtVmVyYm9zZTokaXNWZXJib3NlIC1Db25maXJtOiRpc0NvbmZpcm0NCgkJCQkJCQkJCWlmICgkZXYgLW5lICRudWxsKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSAtUGF0aFR5cGUgTGVhZikNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkjIFRoZSBmaWxlIHJlZmVycmVkIGJ5ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4NCgkJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCQkjIGFuZCBhdXRob3JpemF0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBjb25maXJtYXRpb24gd2FzIHByb21wdGVkLiBJbiBzdWNoIGEgc2NlbmFyaW8sDQoJCQkJCQkJCQkJIyB3ZSBza2lwIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGFyY2hpdmUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlbWFpbmluZyBhcmNoaXZlIGZpbGUgY29udGVudHMuDQoJCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSMgV3JpdGUgbm9uLXRlcm1pbmF0aW5nIGVycm9yIHRvIHRoZSBwaXBlbGluZS4NCgkJCQkJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRmlsZUV4aXN0c0Vycm9yIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUsICRhcmNoaXZlRmlsZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSkNCgkJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJFeHBhbmRBcmNoaXZlRmlsZUV4aXN0cyIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRPcGVyYXRpb24pICRudWxsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUNCgkJCQkJCQkJCVdyaXRlLUVycm9yIC1FcnJvclJlY29yZCAkZXJyb3JSZWNvcmQNCgkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICghJGhhc05vblRlcm1pbmF0aW5nRXJyb3IpDQoJCQkJCQkJew0KCQkJCQkJCQlbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVFeHRlbnNpb25zXTo6RXh0cmFjdFRvRmlsZSgkY3VycmVudEFyY2hpdmVFbnRyeSwgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoLCAkZmFsc2UpDQoNCgkJCQkJCQkJIyBBZGQgdGhlIGV4cGFuZGVkIGZpbGUgcGF0aCB0byB0aGUgJGV4cGFuZGVkSXRlbXMgYXJyYXksDQoJCQkJCQkJCSMgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIGV4cGFuZGVkIGZpbGVzIGNyZWF0ZWQgd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCQkJCSMgSWYgdXNlciBlbnRlcnMgQ1RSTCArIEMgdGhlbiBhdCB0aGF0IHBvaW50IG9mIHRpbWUsIGFsbCB0aGVzZSBleHBhbmRlZCBmaWxlcw0KCQkJCQkJCQkjIHdvdWxkIGJlIGRlbGV0ZWQgYXMgcGFydCBvZiB0aGUgY2xlYW4gdXAgcHJvY2Vzcy4NCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCQkJJGFkZEZpbGV0b0V4cGFuZGVkUGF0aE1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRmlsZXRvRXhwYW5kZWRQYXRoTWVzc2FnZQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWZpbmFsbHkNCgkJCQkJCXsNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KDQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkc3JjU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBTZXQgdG8gMTAwIGdpdmluZyBlcXVhbCB3ZWlnaHRhZ2UgdG8gZWFjaCBmaWxlIHRoYXQgaXMgZ2V0dGluZyBleHBhbmRlZC4NCgkJCQkJIyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0IGlzIHNldCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwDQoJCQkJCVByb2dyZXNzQmFySGVscGVyICJFeHBhbmQtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgICRjdXJyZW50RW50cnlDb3VudA0KCQkJCX0NCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQlJZiAoJG51bGwgLW5lICR6aXBBcmNoaXZlKQ0KCQkJCXsNCgkJCQkJJHppcEFyY2hpdmUuRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJSWYgKCRudWxsIC1uZSAkYXJjaGl2ZUZpbGVTdHJlYW0pDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJIyBDb21wbGV0ZSB3cml0aW5nIHByb2dyZXNzLg0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAiRXhwYW5kLUFyY2hpdmUiIC1Db21wbGV0ZWQNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgUHJvZ3Jlc3NCYXJIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG1lc3NhZ2UuDQojIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIENvbXByZXNzLUFyY2hpdmUgJiBFeHBhbmQtQXJjaGl2ZSB0byBkaXNwbGF5IGFyY2hpdmUgZmlsZQ0KIyBjcmVhdGlvbi9leHBhbnNpb24gcHJvZ3Jlc3MuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gUHJvZ3Jlc3NCYXJIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjbWRsZXROYW1lLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkc3RhdHVzLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQsDQoNCgkJCQlbaW50XQ0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcywNCg0KCQkJCVtpbnRdDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkpDQoNCgkJCWlmICgkY3VycmVudEVudHJ5Q291bnQgLWd0IDAgLWFuZA0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcyAtZ3QgMCAtYW5kDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCAtZ2UgMCAtYW5kDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0IC1ndCAwKQ0KCQkJew0KCQkJCSRlbnRyeURlZmF1bHRXZWlnaHQgPSAkY3VycmVudFNlZ21lbnRXZWlnaHQvW2RvdWJsZV0kdG90YWxOdW1iZXJvZkVudHJpZXMNCg0KCQkJCSRwZXJjZW50Q29tcGxldGUgPSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICsgKCRlbnRyeURlZmF1bHRXZWlnaHQgKiAkY3VycmVudEVudHJ5Q291bnQpDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICRjbWRsZXROYW1lIC1TdGF0dXMgJHN0YXR1cyAtUGVyY2VudENvbXBsZXRlICRwZXJjZW50Q29tcGxldGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ1NWSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvbW1hIGFmdGVyIGVhY2ggcGF0aCBzcGVjaWZpZCBieQ0KIyB0aGUgU291cmNlUGF0aCBhcnJheS4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNwbGF5IGFsbCB0aGUgdXNlciBzdXBwbGllZCBwYXRocw0KIyBpbiB0aGUgV2hhdElmIG1lc3NhZ2UuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gQ1NWSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoDQoJCQkpDQoNCgkJCSMgU291cmNlUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSB0aGUgY2FsbGluZyBmdW5jYXRpb24uDQoJCQlpZiAoJHNvdXJjZVBhdGguQ291bnQgLWd0IDEpDQoJCQl7DQoJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9ICJgbiINCgkJCQlmb3IgKCRjdXJyZW50SW5kZXggPSAwOyAkY3VycmVudEluZGV4IC1sdCAkc291cmNlUGF0aC5Db3VudDsgJGN1cnJlbnRJbmRleCsrKQ0KCQkJCXsNCgkJCQkJaWYgKCRjdXJyZW50SW5kZXggLWVxICRzb3VyY2VQYXRoLkNvdW50IC0gMSkNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XSArICJgbiINCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gJHNvdXJjZVBhdGgNCgkJCX0NCg0KCQkJcmV0dXJuICRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gdGhyb3cgdGVybWluYXRpbmcgZXJyb3IuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QsDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRpbm5lckV4Y2VwdGlvbg0KCQkJKQ0KDQoJCQlpZiAoJGlubmVyRXhjZXB0aW9uIC1lcSAkbnVsbCkNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LW9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkaW5uZXJFeGNlcHRpb24NCgkJCX0NCg0KCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCSRQU0NtZGxldC5UaHJvd1Rlcm1pbmF0aW5nRXJyb3IoJGVycm9yUmVjb3JkKQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDcmVhdGVFcnJvclJlY29yZEhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhbiBFcnJvclJlY29yZA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIENyZWF0ZUVycm9yUmVjb3JkSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRleGNlcHRpb24sDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QNCgkJCSkNCg0KCQkJaWYgKCRudWxsIC1lcSAkZXhjZXB0aW9uKQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQl9DQoNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCXJldHVybiAkZXJyb3JSZWNvcmQNCgkJfQ0KCQkjZW5kcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoNCgkJJGlucHV0UGF0aHMgPSBAKCkNCgkJJGRlc3RpbmF0aW9uUGFyZW50RGlyID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RGlyZWN0b3J5TmFtZSgkRGVzdGluYXRpb25QYXRoKQ0KCQlpZiAoJG51bGwgLWVxICRkZXN0aW5hdGlvblBhcmVudERpcikNCgkJew0KCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkRGVzdGluYXRpb25QYXRoIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWRBcmNoaXZlRmlsZVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJfQ0KDQoJCWlmICgkZGVzdGluYXRpb25QYXJlbnREaXIgLWVxIFtzdHJpbmddOjpFbXB0eSkNCgkJew0KCQkJJGRlc3RpbmF0aW9uUGFyZW50RGlyID0gJy4nDQoJCX0NCg0KCQkkYWNoaXZlRmlsZU5hbWUgPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRGaWxlTmFtZSgkRGVzdGluYXRpb25QYXRoKQ0KCQkkZGVzdGluYXRpb25QYXJlbnREaXIgPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJGRlc3RpbmF0aW9uUGFyZW50RGlyICRmYWxzZSAkUFNDbWRsZXQNCg0KCQlpZiAoJGRlc3RpbmF0aW9uUGFyZW50RGlyLkNvdW50IC1ndCAxKQ0KCQl7DQoJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRBcmNoaXZlRmlsZVBhdGhFcnJvciAtZiAkRGVzdGluYXRpb25QYXRoLCAiRGVzdGluYXRpb25QYXRoIiwgIkRlc3RpbmF0aW9uUGF0aCIpDQoJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWRBcmNoaXZlRmlsZVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJfQ0KDQoJCUlzVmFsaWRGaWxlU3lzdGVtUGF0aCAkZGVzdGluYXRpb25QYXJlbnREaXIgfCBPdXQtTnVsbA0KCQkkRGVzdGluYXRpb25QYXRoID0gSm9pbi1QYXRoIC1QYXRoICRkZXN0aW5hdGlvblBhcmVudERpciAtQ2hpbGRQYXRoICRhY2hpdmVGaWxlTmFtZQ0KDQoJCSMgR2V0RXh0ZW5zaW9uIEFQSSBkb2VzIG5vdCB2YWxpZGF0ZSBmb3IgdGhlIGFjdHVhbCBleGlzdGFuY2Ugb2YgdGhlIHBhdGguDQoJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJERlc3RpbmF0aW9uUGF0aCkNCg0KCQkjIElmIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSAuWmlwIGV4dGVuc2lvbiwgd2UgYXBwZW5kIGl0Lg0KCQlJZiAoJGV4dGVuc2lvbiAtZXEgW3N0cmluZ106OkVtcHR5KQ0KCQl7DQoJCQkkRGVzdGluYXRpb25QYXRoV2l0aE91dEV4dGVuc2lvbiA9ICREZXN0aW5hdGlvblBhdGgNCgkJCSREZXN0aW5hdGlvblBhdGggPSAkRGVzdGluYXRpb25QYXRoV2l0aE91dEV4dGVuc2lvbiArICR6aXBGaWxlRXh0ZW5zaW9uDQoJCQkkYXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZSAtZiAkRGVzdGluYXRpb25QYXRoV2l0aE91dEV4dGVuc2lvbiwgJERlc3RpbmF0aW9uUGF0aCkNCgkJCVdyaXRlLVZlcmJvc2UgJGFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJIyBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGlzIHNwZWNpZmllZCBmb3IgdGhlIHppcCBmaWxlIHRvIGJlIGNyZWF0ZWQuDQoJCQlpZiAoJGV4dGVuc2lvbiAtbmUgJHppcEZpbGVFeHRlbnNpb24pDQoJCQl7DQoJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yIC1mICRleHRlbnNpb24sICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiTm90U3VwcG9ydGVkQXJjaGl2ZUZpbGVFeHRlbnNpb24iICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRleHRlbnNpb24NCgkJCX0NCgkJfQ0KDQoJCSRhcmNoaXZlRmlsZUV4aXN0ID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkRGVzdGluYXRpb25QYXRoIC1QYXRoVHlwZSBMZWFmDQoNCgkJaWYgKCRhcmNoaXZlRmlsZUV4aXN0IC1hbmQgKCRVcGRhdGUgLWVxICRmYWxzZSAtYW5kICRGb3JjZSAtZXEgJGZhbHNlKSkNCgkJew0KCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5aaXBGaWxlRXhpc3RFcnJvciAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJBcmNoaXZlRmlsZUV4aXN0cyIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQl9DQoNCgkJIyBJZiBhcmNoaXZlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlmIC1VcGRhdGUgaXMgc3BlY2lmaWVkLCB0aGVuIHdlIGNoZWNrIHRvIHNlZQ0KCQkjIGlmIHdlIGhhdmUgd3JpdGUgYWNjZXNzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUuDQoJCWlmICgkYXJjaGl2ZUZpbGVFeGlzdCAtYW5kICRVcGRhdGUgLWVxICR0cnVlKQ0KCQl7DQoJCQkkaXRlbSA9IEdldC1JdGVtIC1QYXRoICREZXN0aW5hdGlvblBhdGgNCgkJCWlmICgkaXRlbS5BdHRyaWJ1dGVzLlRvU3RyaW5nKCkuQ29udGFpbnMoIlJlYWRPbmx5IikpDQoJCQl7DQoJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BcmNoaXZlRmlsZUlzUmVhZE9ubHkgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkFyY2hpdmVGaWxlSXNSZWFkT25seSIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRPcGVyYXRpb24pICREZXN0aW5hdGlvblBhdGgNCgkJCX0NCgkJfQ0KDQoJCSRpc1doYXRJZiA9ICRwc2JvdW5kcGFyYW1ldGVycy5Db250YWluc0tleSgiV2hhdElmIikNCgkJaWYgKCEkaXNXaGF0SWYpDQoJCXsNCgkJCSRwcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlKQ0KCQkJV3JpdGUtVmVyYm9zZSAkcHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlDQoNCgkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5Db21wcmVzc1Byb2dyZXNzQmFyVGV4dCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkNvbXByZXNzLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAwIDEwMCAxMDAgMQ0KCQl9DQoJfQ0KCVBST0NFU1MNCgl7DQoJCWlmICgkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIlBhdGgiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJQYXRoV2l0aEZvcmNlIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiUGF0aFdpdGhVcGRhdGUiKQ0KCQl7DQoJCQkkaW5wdXRQYXRocyArPSAkUGF0aA0KCQl9DQoNCgkJaWYgKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGgiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aFVwZGF0ZSIpDQoJCXsNCgkJCSRpbnB1dFBhdGhzICs9ICRMaXRlcmFsUGF0aA0KCQl9DQoJfQ0KCUVORA0KCXsNCgkJIyBJZiBhcmNoaXZlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlmIC1Gb3JjZSBpcyBzcGVjaWZpZWQsIHdlIGRlbGV0ZSB0aGUNCgkJIyBleGlzdGluZyBhcnRjaGl2ZSBmaWxlIGFuZCBjcmVhdGUgYSBicmFuZCBuZXcgb25lLg0KCQlpZiAoKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIpIC1hbmQgJGFyY2hpdmVGaWxlRXhpc3QpDQoJCXsNCgkJCVJlbW92ZS1JdGVtIC1QYXRoICREZXN0aW5hdGlvblBhdGggLUZvcmNlIC1FcnJvckFjdGlvbiBTdG9wDQoJCX0NCg0KCQkjIFZhbGlkYXRlIFNvdXJjZSBQYXRoIGRlcGVkaW5nIG9uIHBhcmFtZXRlciBzZXQgYmVpbmcgdXNlZC4NCgkJIyBUaGUgc3BlY2lmaWVkIHNvdXJjZSBwYXRoIGNvbmF0aW5zIG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgbmVlZHMNCgkJIyB0byBiZSBjb21wcmVzc2VkLg0KCQkkaXNMaXRlcmFsUGF0aFVzZWQgPSAkZmFsc2UNCgkJaWYgKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGgiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aFVwZGF0ZSIpDQoJCXsNCgkJCSRpc0xpdGVyYWxQYXRoVXNlZCA9ICR0cnVlDQoJCX0NCg0KCQlWYWxpZGF0ZUR1cGxpY2F0ZUZpbGVTeXN0ZW1QYXRoICRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lICRpbnB1dFBhdGhzDQoJCSRyZXNvbHZlZFBhdGhzID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICRpbnB1dFBhdGhzICRpc0xpdGVyYWxQYXRoVXNlZCAkUFNDbWRsZXQNCgkJSXNWYWxpZEZpbGVTeXN0ZW1QYXRoICRyZXNvbHZlZFBhdGhzIHwgT3V0LU51bGwNCg0KCQkkc291cmNlUGF0aCA9ICRyZXNvbHZlZFBhdGhzOw0KDQoJCSMgQ1NWSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvbW1hIGFmdGVyIGVhY2ggcGF0aCBzcGVjaWZpZCBieQ0KCQkjIHRoZSAkc291cmNlUGF0aCBhcnJheS4gVGhlIGNvbW1hIHNhcGVyYXRlZCBwYXRocyBhcmUgZGlzcGxheWVkIGluIHRoZSAtV2hhdElmIG1lc3NhZ2UuDQoJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgPSBDU1ZIZWxwZXIgJHNvdXJjZVBhdGgNCgkJaWYgKCRwc2NtZGxldC5TaG91bGRQcm9jZXNzKCRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQpKQ0KCQl7DQoJCQl0cnkNCgkJCXsNCgkJCQkjIFN0b3BQcm9jZXNzaW5nIGlzIG5vdCBhdmFsaWFibGUgaW4gU2NyaXB0IGNtZGxldHMuIEhvd2V2ZXIgdGhlIHBpcGxlbGluZSBleGVjdXRpb24NCgkJCQkjIGlzIHRlcm1pbmF0ZWQgd2hlbiBldmVyICdDVFJMICsgQycgaXMgZW50ZXJlZCBieSB1c2VyIHRvIHRlcm1pbmF0ZSB0aGUgY21kbGV0IGV4ZWN1dGlvbi4NCgkJCQkjIFRoZSBmaW5hbGx5IGJsb2NrIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHBpcGxlbGluZSBpcyB0ZXJtaW5hdGVkLg0KCQkJCSMgJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgdmFyaWFibGUgaXMgdXNlZCB0byB0cmFjayBpZiAnQ1RSTCArIEMnIGlzIGVudGVyZWQgYnkgdGhlDQoJCQkJIyB1c2VyLg0KCQkJCSRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlID0gJGZhbHNlDQoNCgkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gQ29tcHJlc3NBcmNoaXZlSGVscGVyICRzb3VyY2VQYXRoICREZXN0aW5hdGlvblBhdGggJENvbXByZXNzaW9uTGV2ZWwgJFVwZGF0ZQ0KDQoJCQkJJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgPSAkdHJ1ZQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCSMgVGhlICRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIHdvdWxkIGJlIHNldCB0byAkZmFsc2UgaWYgdXNlciBoYXMgdHlwZWQgJ0NUUkwgKyBDJyB0bw0KCQkJCSMgdGVybWluYXRlIHRoZSBjbWRsZXQgZXhlY3V0aW9uIG9yIGlmIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KCQkJCSMgJG51bWJlck9mSXRlbXNBcmNoaXZlZCBjb250YWlucyB0aGUgY291bnQgb2YgbnVtYmVyIG9mIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGFkZCB0byB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCSMgSWYgdGhlIG5ld2x5IGNyZWF0ZWQgYXJjaGl2ZSBmaWxlIGlzIGVtcHR5IHRoZW4gd2UgZGVsZXRlIGl0IGFzIGl0cyBub3QgdXNhYmxlLg0KCQkJCWlmICgoJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgLWVxICRmYWxzZSkgLW9yDQoJCQkJCSgkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkIC1lcSAwKSkNCgkJCQl7DQoJCQkJCSREZWxldGVBcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRGVsZXRlQXJjaGl2ZUZpbGUgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJV3JpdGUtVmVyYm9zZSAkRGVsZXRlQXJjaGl2ZUZpbGVNZXNzYWdlDQoNCgkJCQkJIyBkZWxldGUgdGhlIHBhcnRpYWwgYXJjaGl2ZSBmaWxlIGNyZWF0ZWQuDQoJCQkJCWlmIChUZXN0LVBhdGggJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJew0KCQkJCQkJUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLUZvcmNlIC1SZWN1cnNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIEV4cGFuZC1BcmNoaXZlDQp7DQoJPCMNCgkJLlNZTk9QU0lTDQoJCQlFeHRyYWN0cyBmaWxlcyBmcm9tIGEgc3BlY2lmaWVkIGFyY2hpdmUgKHppcHBlZCkgZmlsZS4NCg0KCQkuREVTQ1JJUFRJT04NCgkJCVRoZSBFeHBhbmQtQXJjaGl2ZSBjbWRsZXQgZXh0cmFjdHMgZmlsZXMgZnJvbSBhIHNwZWNpZmllZCB6aXBwZWQgYXJjaGl2ZSBmaWxlIHRvIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGZvbGRlci4gQW4gYXJjaGl2ZSBmaWxlIGFsbG93cyBtdWx0aXBsZSBmaWxlcyB0byBiZSBwYWNrYWdlZCwgYW5kIG9wdGlvbmFsbHkgY29tcHJlc3NlZCwgaW50byBhIHNpbmdsZSB6aXBwZWQgZmlsZSBmb3IgZWFzaWVyIGRpc3RyaWJ1dGlvbiBhbmQgc3RvcmFnZS4NCg0KCQkuUEFSQU1FVEVSIFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgYXJjaGl2ZSBmaWxlLg0KDQoJCS5QQVJBTUVURVIgTGl0ZXJhbFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCB0byBhbiBhcmNoaXZlIGZpbGUuIFVubGlrZSB0aGUgUGF0aCBwYXJhbWV0ZXIsIHRoZSB2YWx1ZSBvZiBMaXRlcmFsUGF0aCBpcyB1c2VkIGV4YWN0bHkgYXMgaXQgaXMgdHlwZWQuIFdpbGRjYXJkIGNoYXJhY3RlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuIElmIHRoZSBwYXRoIGluY2x1ZGVzIGVzY2FwZSBjaGFyYWN0ZXJzLCBlbmNsb3NlIGVhY2ggZXNjYXBlIGNoYXJhY3RlciBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLCB0byBpbnN0cnVjdCBXaW5kb3dzIFBvd2VyU2hlbGwgbm90IHRvIGludGVycHJldCBhbnkgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzLg0KDQoJCS5QQVJBTUVURVIgRGVzdGluYXRpb25QYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGZvbGRlciBpbiB3aGljaCB5b3Ugd2FudCB0aGUgY29tbWFuZCB0byBzYXZlIGV4dHJhY3RlZCBmaWxlcy4gRW50ZXIgdGhlIHBhdGggdG8gYSBmb2xkZXIsIGJ1dCBkbyBub3Qgc3BlY2lmeSBhIGZpbGUgbmFtZSBvciBmaWxlIG5hbWUgZXh0ZW5zaW9uLiBUaGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZC4NCg0KCQkuUEFSQU1FVEVSIEZvcmNlDQoJCQlGb3JjZXMgdGhlIGNvbW1hbmQgdG8gcnVuIHdpdGhvdXQgYXNraW5nIGZvciB1c2VyIGNvbmZpcm1hdGlvbi4NCg0KCQkuUEFSQU1FVEVSIENvbmZpcm0NCgkJCVByb21wdHMgeW91IGZvciBjb25maXJtYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIGNtZGxldC4NCg0KCQkuUEFSQU1FVEVSIFdoYXRJZg0KCQkJU2hvd3Mgd2hhdCB3b3VsZCBoYXBwZW4gaWYgdGhlIGNtZGxldCBydW5zLiBUaGUgY21kbGV0IGlzIG5vdCBydW4uDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMTogRXh0cmFjdCB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZQ0KDQoJCQlQUyBDOlw+RXhwYW5kLUFyY2hpdmUgLUxpdGVyYWxQYXRoIEM6XEFyY2hpdmVzXERyYWZ0LlppcCAtRGVzdGluYXRpb25QYXRoIEM6XFJlZmVyZW5jZQ0KDQoJCQlUaGlzIGNvbW1hbmQgZXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSwgRHJhZnQuemlwLCBpbnRvIHRoZSBmb2xkZXIgc3BlY2lmaWVkIGJ5IHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyLCBDOlxSZWZlcmVuY2UuDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMjogRXh0cmFjdCB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBpbiB0aGUgY3VycmVudCBmb2xkZXINCg0KCQkJUFMgQzpcPkV4cGFuZC1BcmNoaXZlIC1QYXRoIERyYWZ0LlppcCAtRGVzdGluYXRpb25QYXRoIEM6XFJlZmVyZW5jZQ0KDQoJCQlUaGlzIGNvbW1hbmQgZXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIsIERyYWZ0LnppcCwgaW50byB0aGUgZm9sZGVyIHNwZWNpZmllZCBieSB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciwgQzpcUmVmZXJlbmNlLg0KCSM+DQoJW0NtZGxldEJpbmRpbmcoDQoJCQkJICAgRGVmYXVsdFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aCIsDQoJCQkJICAgU3VwcG9ydHNTaG91bGRQcm9jZXNzID0gJHRydWUsDQoJCQkJICAgSGVscFVyaSA9ICJodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJRD0zOTMyNTMiKV0NCglwYXJhbQ0KCSgNCgkJW3BhcmFtZXRlciAoDQoJCQkJCW1hbmRhdG9yeSA9ICR0cnVlLA0KCQkJCQlQb3NpdGlvbiA9IDAsDQoJCQkJCVBhcmFtZXRlclNldE5hbWUgPSAiUGF0aCIsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtzdHJpbmddDQoJCSRQYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKA0KCQkJCQltYW5kYXRvcnkgPSAkdHJ1ZSwNCgkJCQkJUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aCIsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtBbGlhcygiUFNQYXRoIildDQoJCVtzdHJpbmddDQoJCSRMaXRlcmFsUGF0aCwNCg0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkZmFsc2UsDQoJCQkJCVBvc2l0aW9uID0gMSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbc3RyaW5nXQ0KCQkkRGVzdGluYXRpb25QYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbc3dpdGNoXQ0KCQkkRm9yY2UNCgkpDQoNCglCRUdJTg0KCXsNCgkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24gLUVycm9yQWN0aW9uIElnbm9yZQ0KCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtIC1FcnJvckFjdGlvbiBJZ25vcmUNCg0KCQkkemlwRmlsZUV4dGVuc2lvbiA9ICIuemlwIg0KDQoJCSRMb2NhbGl6ZWREYXRhID0gQ29udmVydEZyb20tU3RyaW5nRGF0YSBAJw0KUGF0aE5vdEZvdW5kRXJyb3I9VGhlIHBhdGggJ3swfScgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHZhbGlkIGZpbGUgc3lzdGVtIHBhdGguDQpFeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgcGF0aCAnezB9JyBpcyBub3QgYSB2YWxpZCBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgcGF0aC4NCkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3I9ezB9IGlzIG5vdCBhIHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0LiB7MX0gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQuDQpBcmNoaXZlRmlsZUlzUmVhZE9ubHk9VGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGFyY2hpdmUgZmlsZSB7MH0gaXMgc2V0IHRvICdSZWFkT25seScgaGVuY2UgaXQgY2Fubm90IGJlIHVwZGF0ZWQuIElmIHlvdSBpbnRlbmQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUsIHJlbW92ZSB0aGUgJ1JlYWRPbmx5JyBhdHRyaWJ1dGUgb24gdGhlIGFyY2hpdmUgZmlsZSBlbHNlIHVzZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGFuZCBjcmVhdGUgYSBuZXcgYXJjaGl2ZSBmaWxlLg0KWmlwRmlsZUV4aXN0RXJyb3I9VGhlIGFyY2hpdmUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIFVzZSB0aGUgLVVwZGF0ZSBwYXJhbWV0ZXIgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUgb3IgdXNlIHRoZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLg0KRHVwbGljYXRlUGF0aEZvdW5kRXJyb3I9VGhlIGlucHV0IHRvIHswfSBwYXJhbWV0ZXIgY29udGFpbnMgYSBkdXBsaWNhdGUgcGF0aCAnezF9Jy4gUHJvdmlkZSBhIHVuaXF1ZSBzZXQgb2YgcGF0aHMgYXMgaW5wdXQgdG8gezJ9IHBhcmFtZXRlci4NCkFyY2hpdmVGaWxlSXNFbXB0eT1UaGUgYXJjaGl2ZSBmaWxlIHswfSBpcyBlbXB0eS4NCkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0PVRoZSBhcmNoaXZlIGZpbGUgJ3swfScgY3JlYXRpb24gaXMgaW4gcHJvZ3Jlc3MuLi4NCkV4cGFuZFByb2dyZXNzQmFyVGV4dD1UaGUgYXJjaGl2ZSBmaWxlICd7MH0nIGV4cGFuc2lvbiBpcyBpbiBwcm9ncmVzcy4uLg0KQXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlPVRoZSBhcmNoaXZlIGZpbGUgcGF0aCAnezB9JyBzdXBwbGllZCB0byB0aGUgRGVzdGluYXRpb25QYXRoIHBhdGFtZXRlciBkb2VzIG5vdCBpbmNsdWRlIC56aXAgZXh0ZW5zaW9uLiBIZW5jZSAuemlwIGlzIGFwcGVuZGVkIHRvIHRoZSBzdXBwbGllZCBEZXN0aW5hdGlvblBhdGggcGF0aCBhbmQgdGhlIGFyY2hpdmUgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIGF0ICd7MX0nLg0KQWRkSXRlbXRvQXJjaGl2ZUZpbGU9QWRkaW5nICd7MH0nLg0KQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoPUNyZWF0ZWQgJ3swfScuDQpJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3I9VGhlIGFyY2hpdmUgZmlsZSBwYXRoICd7MH0nIHNwZWNpZmllZCBhcyBpbnB1dCB0byB0aGUgezF9IHBhcmFtZXRlciBpcyByZXNvbHZpbmcgdG8gbXVsdGlwbGUgZmlsZSBzeXN0ZW0gcGF0aHMuIFByb3ZpZGUgYSB1bmlxdWUgcGF0aCB0byB0aGUgezJ9IHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGhhcyB0byBiZSBjcmVhdGVkLg0KSW52YWxpZEV4cGFuZGVkRGlyUGF0aEVycm9yPVRoZSBkaXJlY3RvcnkgcGF0aCAnezB9JyBzcGVjaWZpZWQgYXMgaW5wdXQgdG8gdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIgaXMgcmVzb2x2aW5nIHRvIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzLiBQcm92aWRlIGEgdW5pcXVlIHBhdGggdG8gdGhlIERlc3RpbmF0aW9uIHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzIGhhdmUgdG8gYmUgZXhwYW5kZWQuDQpGaWxlRXhpc3RzRXJyb3I9RmFpbGVkIHRvIGNyZWF0ZSBmaWxlICd7MH0nIHdoaWxlIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlICd7MX0nIGNvbnRlbnRzIGFzIHRoZSBmaWxlICd7Mn0nIGFscmVhZHkgZXhpc3RzLiBVc2UgdGhlIC1Gb3JjZSBwYXJhbWV0ZXIgaWYgeW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgJ3szfScgY29udGVudHMgd2hlbiBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZS4NCkRlbGV0ZUFyY2hpdmVGaWxlPVRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBhcmNoaXZlIGZpbGUgJ3swfScgaXMgZGVsZXRlZCBhcyBpdCBpcyBub3QgdXNhYmxlLg0KSW52YWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgZGVzdGluYXRpb24gcGF0aCAnezB9JyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgYXJjaGl2ZSBmaWxlIG5hbWUuDQpQcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2U9UHJlcGFyaW5nIHRvIGNvbXByZXNzLi4uDQpQcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlPVByZXBhcmluZyB0byBleHBhbmQuLi4NCidADQoNCgkJI3JlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KCQlmdW5jdGlvbiBHZXRSZXNvbHZlZFBhdGhIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNMaXRlcmFsUGF0aCwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlBTQ21kbGV0XQ0KCQkJCSRjYWxsZXJQU0NtZGxldA0KCQkJKQ0KDQoJCQkkcmVzb2x2ZWRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJdHJ5DQoJCQkJew0KCQkJCQlpZiAoJGlzTGl0ZXJhbFBhdGgpDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50UmVzb2x2ZWRQYXRocyA9IFJlc29sdmUtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudFJlc29sdmVkUGF0aHMgPSBSZXNvbHZlLVBhdGggLVBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQl9DQoJCQkJY2F0Y2gNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGN1cnJlbnRQYXRoKQ0KCQkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkXy5FeGNlcHRpb24NCgkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkFyY2hpdmVDbWRsZXRQYXRoTm90Rm91bmQiICRudWxsIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXhjZXB0aW9uICRjdXJyZW50UGF0aA0KCQkJCQkkY2FsbGVyUFNDbWRsZXQuVGhyb3dUZXJtaW5hdGluZ0Vycm9yKCRlcnJvclJlY29yZCkNCgkJCQl9DQoNCgkJCQlmb3JlYWNoICgkY3VycmVudFJlc29sdmVkUGF0aCBpbiAkY3VycmVudFJlc29sdmVkUGF0aHMpDQoJCQkJew0KCQkJCQkkcmVzb2x2ZWRQYXRocyArPSAkY3VycmVudFJlc29sdmVkUGF0aC5Qcm92aWRlclBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCSRyZXNvbHZlZFBhdGhzDQoJCX0NCg0KCQlmdW5jdGlvbiBBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoJCXsNCg0KCQkJaWYgKCRQU0VkaXRpb24gLWVxICJEZXNrdG9wIikNCgkJCXsNCgkJCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbg0KCQkJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIElzVmFsaWRGaWxlU3lzdGVtUGF0aA0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkcmVzdWx0ID0gJHRydWU7DQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQlpZiAoIShbU3lzdGVtLklPLkZpbGVdOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSAtb3IgW1N5c3RlbS5JTy5EaXJlY3RvcnldOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSkpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRjdXJyZW50UGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJQYXRoTm90Rm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIFZhbGlkYXRlRHVwbGljYXRlRmlsZVN5c3RlbVBhdGgNCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRpbnB1dFBhcmFtZXRlciwNCg0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkdW5pcXVlSW5wdXRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJJGN1cnJlbnRJbnB1dFBhdGggPSAkY3VycmVudFBhdGguVG9VcHBlcigpDQoJCQkJaWYgKCR1bmlxdWVJbnB1dFBhdGhzLkNvbnRhaW5zKCRjdXJyZW50SW5wdXRQYXRoKSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRHVwbGljYXRlUGF0aEZvdW5kRXJyb3IgLWYgJGlucHV0UGFyYW1ldGVyLCAkY3VycmVudFBhdGgsICRpbnB1dFBhcmFtZXRlcikNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJEdXBsaWNhdGVQYXRoRm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkdW5pcXVlSW5wdXRQYXRocyArPSAkY3VycmVudElucHV0UGF0aA0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzaW9uTGV2ZWxNYXBwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsDQoJCQkpDQoNCgkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6T3B0aW1hbA0KDQoJCQkjIENvbXByZXNzaW9uTGV2ZWwgZm9ybWF0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlzd2l0Y2ggKCRjb21wcmVzc2lvbkxldmVsLlRvU3RyaW5nKCkpDQoJCQl7DQoJCQkJIkZhc3Rlc3QiDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06OkZhc3Rlc3QNCgkJCQl9DQoJCQkJIk5vQ29tcHJlc3Npb24iDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06Ok5vQ29tcHJlc3Npb24NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAkY29tcHJlc3Npb25MZXZlbEZvcm1hdA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRzb3VyY2VGaWxlUGF0aHMgPSBAKCkNCgkJCSRzb3VyY2VEaXJQYXRocyA9IEAoKQ0KDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHNvdXJjZVBhdGgpDQoJCQl7DQoJCQkJJHJlc3VsdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1QYXRoVHlwZSBMZWFmDQoJCQkJaWYgKCRyZXN1bHQgLWVxICR0cnVlKQ0KCQkJCXsNCgkJCQkJJHNvdXJjZUZpbGVQYXRocyArPSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHNvdXJjZURpclBhdGhzICs9ICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmUgb3IgbW9yZSBkaXJlY3RvcnkgKHRoaXMgZGlyZWN0b3J5IGNhbiBoYXZlIGZpbGVzIHVuZGVyIGl0KSBhbmQgbm8gZmlsZXMgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1lcSAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1ndCAwKQ0KCQkJew0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMC9bZG91YmxlXSRzb3VyY2VEaXJQYXRocy5Db3VudA0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoJCQl9DQoNCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25seSBmaWxlcyB0byBiZSBjb21wcmVzc2VkLg0KCQkJZWxzZUlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1ndCAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1lcSAwKQ0KCQkJew0KCQkJCSMgJHByZXZpb3VzU2VnbWVudFdlaWdodCBpcyBlcXVhbCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBzZXQgdG8gMTAwIGFzIGFsbCBmaWxlcyBoYXZlIGVxdWFsIHdlaWdodGFnZS4NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMA0KDQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IENvbXByZXNzRmlsZXNIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCX0NCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25lIG9yIG1vcmUgZmlsZXMgYW5kIG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzICh0aGlzIGRpcmVjdG9yeSBjYW4gaGF2ZSBmaWxlcyB1bmRlciBpdCkgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWVsc2VpZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZ3QgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZ3QgMCkNCgkJCXsNCgkJCQkjIGVhY2ggZGlyZWN0b3J5IGlzIGNvbnNpZGVyZWQgYXMgYW4gaW5kaXZpZHVhbCBzZWdtZW50cyAmIGFsbCB0aGUgaW5kaXZpZHVhbCBmaWxlcyBhcmUgY2x1YmVkIGluIHRvIGEgc2VwYXJhdGUgc2dlbW5ldC4NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDAvW2RvdWJsZV0oJHNvdXJjZURpclBhdGhzLkNvdW50ICsgMSkNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoNCgkJCQkkY291bnQgPSBDb21wcmVzc0ZpbGVzSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCX0NCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzRmlsZXNIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZUZpbGVQYXRocywNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IFppcEFyY2hpdmVIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJG51bGwgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzU2luZ2xlRGlySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkc291cmNlRGlyUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkdXNlUGFyZW50RGlyQXNSb290LA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W1N5c3RlbS5TdHJpbmddXSRzdWJEaXJGaWxlcyA9IEAoKQ0KDQoJCQlpZiAoJHVzZVBhcmVudERpckFzUm9vdCkNCgkJCXsNCgkJCQkkc291cmNlRGlySW5mbyA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvIC1Bcmd1bWVudExpc3QgJHNvdXJjZURpclBhdGgNCgkJCQkkc291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlySW5mby5QYXJlbnQuRnVsbE5hbWUNCg0KCQkJCSMgSWYgdGhlIGRpcmVjdG9yeSBpcyBwcmVzZW50IGF0IHRoZSBkcml2ZSBsZXZlbCB0aGUgRGlyZWN0b3J5SW5mby5QYXJlbnQgaW5jbHVkZSAnXCcgZXhhbXBsZTogQzpcDQoJCQkJIyBPbiB0aGUgb3RoZXIgaGFuZCBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBhdCBhIGRlcGVyIGxldmVsIHRoZW4gRGlyZWN0b3J5SW5mby5QYXJlbnQNCgkJCQkjIGhhcyBqdXN0IHRoZSBwYXRoICh3aXRob3V0IGFuIGVuZGluZyAnXCcpLiBleGFtcGxlIEM6XHNvdXJjZQ0KCQkJCWlmICgkc291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1lcSAzKQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUgKyAiXCINCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpclBhdGgNCgkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZSArICJcIg0KCQkJfQ0KDQoJCQkkZGlyQ29udGVudHMgPSBHZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAkc291cmNlRGlyUGF0aCAtUmVjdXJzZQ0KCQkJZm9yZWFjaCAoJGN1cnJlbnRDb250ZW50IGluICRkaXJDb250ZW50cykNCgkJCXsNCgkJCQkkaXNDb250YWluZXIgPSAkY3VycmVudENvbnRlbnQgLWlzIFtTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mb10NCgkJCQlpZiAoISRpc0NvbnRhaW5lcikNCgkJCQl7DQoJCQkJCSRzdWJEaXJGaWxlcy5BZGQoJGN1cnJlbnRDb250ZW50LkZ1bGxOYW1lKQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkjIFRoZSBjdXJyZW50Q29udGVudCBwb2ludHMgdG8gYSBkaXJlY3RvcnkuDQoJCQkJCSMgV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGFuIGVtcHR5IGRpcmVjdG9yeSwgaWYgc28gc3VjaCBhDQoJCQkJCSMgZGlyZWN0b3J5IGhhcyB0byBiZSBleHBsaWN0bHkgYWRkZWQgdG8gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJIyBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGUgR2V0RmlsZXMoKSBBUEkgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4NCgkJCQkJJGZpbGVzID0gJGN1cnJlbnRDb250ZW50LkdldEZpbGVzKCkNCgkJCQkJaWYgKCRmaWxlcy5Db3VudCAtZXEgMCkNCgkJCQkJew0KCQkJCQkJJHN1YkRpckZpbGVzLkFkZCgkY3VycmVudENvbnRlbnQuRnVsbE5hbWUgKyAiXCIpDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBaaXBBcmNoaXZlSGVscGVyICRzdWJEaXJGaWxlcy5Ub0FycmF5KCkgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBaaXBBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbU3lzdGVtLlN0cmluZ11dDQoJCQkJJHNvdXJjZVBhdGhzLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRmaWxlTW9kZSA9IFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpDcmVhdGUNCgkJCSRyZXN1bHQgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIExlYWYNCgkJCWlmICgkcmVzdWx0IC1lcSAkdHJ1ZSkNCgkJCXsNCgkJCQkkZmlsZU1vZGUgPSBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3Blbg0KCQkJfQ0KDQoJCQlBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhcmNoaXZlIGZpbGUgaGFzIHdyaXRlIGFjY2Vzcy4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkZGVzdGluYXRpb25QYXRoLCAkZmlsZU1vZGUpDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVTdHJlYW0gLUFyZ3VtZW50TGlzdCAkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzDQoNCgkJCQkkemlwQXJjaGl2ZUFyZ3MgPSBAKCRhcmNoaXZlRmlsZVN0cmVhbSwgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlTW9kZV06OlVwZGF0ZSwgJGZhbHNlKQ0KCQkJCSR6aXBBcmNoaXZlID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgLUFyZ3VtZW50TGlzdCAkemlwQXJjaGl2ZUFyZ3MNCg0KCQkJCSRjdXJyZW50RW50cnlDb3VudCA9IDANCgkJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuQ29tcHJlc3NQcm9ncmVzc0JhclRleHQgLWYgJGRlc3RpbmF0aW9uUGF0aCkNCgkJCQkkYnVmZmVyU2l6ZSA9IDRrYg0KCQkJCSRidWZmZXIgPSBOZXctT2JqZWN0IEJ5dGVbXSAkYnVmZmVyU2l6ZQ0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRGaWxlUGF0aCBpbiAkc291cmNlUGF0aHMpDQoJCQkJew0KCQkJCQlpZiAoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgLW5lICRudWxsIC1hbmQgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkaW5kZXggPSAkY3VycmVudEZpbGVQYXRoLkluZGV4T2YoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKQ0KCQkJCQkJJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZyA9ICRjdXJyZW50RmlsZVBhdGguU3Vic3RyaW5nKCRpbmRleCwgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoKQ0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSAkY3VycmVudEZpbGVQYXRoLlJlcGxhY2UoJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZywgIiIpLlRyaW0oKQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSBbU3lzdGVtLklPLlBhdGhdOjpHZXRGaWxlTmFtZSgkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQl9DQoNCgkJCQkJIyBVcGRhdGUgbW9kZSBpcyBzZWxlY3RlZC4NCgkJCQkJIyBDaGVjayB0byBzZWUgaWYgYXJjaGl2ZSBmaWxlIGFscmVhZHkgY29udGFpbnMgb25lIG9yIG1vcmUgemlwIGZpbGVzIGluIGl0Lg0KCQkJCQlpZiAoJGlzVXBkYXRlTW9kZSAtZXEgJHRydWUgLWFuZCAkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50IC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkZW50cnlUb0JlVXBkYXRlZCA9ICRudWxsDQoNCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJCSMgSWYgc28gcmVwbGFjZSBpdCB3aXRoIG5ldyBmaWxlIGZyb20gdGhlIGlucHV0IHNvdXJjZS4NCgkJCQkJCSMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUgZmlsZSB0aGVuIGRlZmF1bHQgdG8NCgkJCQkJCSMgY3JlYXRlIG1vZGUgYW5kIGNyZWF0ZSB0aGUgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCg0KCQkJCQkJZm9yZWFjaCAoJGN1cnJlbnRBcmNoaXZlRW50cnkgaW4gJHppcEFyY2hpdmUuRW50cmllcykNCgkJCQkJCXsNCgkJCQkJCQlpZiAoJGN1cnJlbnRBcmNoaXZlRW50cnkuRnVsbE5hbWUgLWVxICRyZWxhdGl2ZUZpbGVQYXRoKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQgPSAkY3VycmVudEFyY2hpdmVFbnRyeQ0KCQkJCQkJCQlicmVhaw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKCRlbnRyeVRvQmVVcGRhdGVkIC1uZSAkbnVsbCkNCgkJCQkJCXsNCgkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQuRGVsZXRlKCkNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCSRjb21wcmVzc2lvbiA9IENvbXByZXNzaW9uTGV2ZWxNYXBwZXIgJGNvbXByZXNzaW9uTGV2ZWwNCg0KCQkJCQkjIElmIGEgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGFkZGVkIHRvIGFuIGFyY2hpdmUgZmlsZSwNCgkJCQkJIyBieSBjb252ZW50aW9uIHRoZSAuTmV0IEFQSSdzIGV4cGVjdCB0aGUgcGF0aCBvZiB0aGUgZGlyZXRjb3J5DQoJCQkJCSMgdG8gZW5kIHdpdGggJ1wnIHRvIGRldGVjdCB0aGUgcGF0aCBhcyBhbiBkaXJlY3RvcnkuDQoJCQkJCWlmICghJHJlbGF0aXZlRmlsZVBhdGguRW5kc1dpdGgoIlwiLCBbU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkNCgkJCQkJew0KCQkJCQkJdHJ5DQoJCQkJCQl7DQoJCQkJCQkJdHJ5DQoJCQkJCQkJew0KCQkJCQkJCQkkY3VycmVudEZpbGVTdHJlYW0gPSBbU3lzdGVtLklPLkZpbGVdOjpPcGVuKCRjdXJyZW50RmlsZVBhdGgsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCQkJCX0NCgkJCQkJCQljYXRjaA0KCQkJCQkJCXsNCgkJCQkJCQkJIyBGYWlsZWQgdG8gYWNjZXNzIHRoZSBmaWxlLiBXcml0ZSBhIG5vbiB0ZXJtaW5hdGluZyBlcnJvciB0byB0aGUgcGlwZWxpbmUNCgkJCQkJCQkJIyBhbmQgbW92ZSBvbiB3aXRoIHRoZSByZW1haW5pbmcgZmlsZXMuDQoJCQkJCQkJCSRleGNlcHRpb24gPSAkXy5FeGNlcHRpb24NCgkJCQkJCQkJaWYgKCRudWxsIC1uZSAkXy5FeGNlcHRpb24gLWFuZA0KCQkJCQkJCQkJJG51bGwgLW5lICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbikNCgkJCQkJCQkJew0KCQkJCQkJCQkJJGV4Y2VwdGlvbiA9ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbg0KCQkJCQkJCQl9DQoJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJDb21wcmVzc0FyY2hpdmVVbmF1dGhvcml6ZWRBY2Nlc3NFcnJvciIgJG51bGwgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpQZXJtaXNzaW9uRGVuaWVkKSAkZXhjZXB0aW9uICRjdXJyZW50RmlsZVBhdGgNCgkJCQkJCQkJV3JpdGUtRXJyb3IgLUVycm9yUmVjb3JkICRlcnJvclJlY29yZA0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkJpbmFyeVJlYWRlciAkY3VycmVudEZpbGVTdHJlYW0NCg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeSA9ICR6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KCRyZWxhdGl2ZUZpbGVQYXRoLCAkY29tcHJlc3Npb24pDQoNCgkJCQkJCQkJIyBVcGRhdGluZyAgdGhlIEZpbGUgQ3JlYXRpb24gdGltZSBzbyB0aGF0IHRoZSBzYW1lIHRpbWVzdGFtcCB3b3VsZCBiZSByZXRhaW5lZCBhZnRlciBleHBhbmRpbmcgdGhlIGNvbXByZXNzZWQgZmlsZS4NCgkJCQkJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgR2V0LUNoaWxkSXRlbSB3b3VsZCBzdWNjZWVkLg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeS5MYXN0V3JpdGVUaW1lID0gKEdldC1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEZpbGVQYXRoKS5MYXN0V3JpdGVUaW1lDQoNCgkJCQkJCQkJJGRlc3RTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlXcml0ZXIgJGN1cnJlbnRBcmNoaXZlRW50cnkuT3BlbigpDQoNCgkJCQkJCQkJd2hpbGUgKCRudW1iZXJPZkJ5dGVzUmVhZCA9ICRzcmNTdHJlYW0uUmVhZCgkYnVmZmVyLCAwLCAkYnVmZmVyU2l6ZSkpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLldyaXRlKCRidWZmZXIsIDAsICRudW1iZXJPZkJ5dGVzUmVhZCkNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLkZsdXNoKCkNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gMQ0KCQkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZmluYWxseQ0KCQkJCQkJew0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGN1cnJlbnRGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRzcmNTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkgPSAkemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgiJHJlbGF0aXZlRmlsZVBhdGgiLCAkY29tcHJlc3Npb24pDQoJCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9IDENCgkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJfQ0KDQoJCQkJCWlmICgkbnVsbCAtbmUgJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSkNCgkJCQkJew0KCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlDQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQlQcm9ncmVzc0JhckhlbHBlciAiQ29tcHJlc3MtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICRzb3VyY2VQYXRocy5Db3VudCAgJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkJfQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCUlmICgkbnVsbCAtbmUgJHppcEFyY2hpdmUpDQoJCQkJew0KCQkJCQkkemlwQXJjaGl2ZS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQlJZiAoJG51bGwgLW5lICRhcmNoaXZlRmlsZVN0cmVhbSkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQkjIENvbXBsZXRlIHdyaXRpbmcgcHJvZ3Jlc3MuDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICJDb21wcmVzcy1BcmNoaXZlIiAtQ29tcGxldGVkDQoJCQl9DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXJjaGl2ZSBmaWxlDQojIHBhdGggJiBpdHMgZmlsZSBmb3JtYXQuIFRoZSBvbmx5IHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0IGlzIC56aXANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkYXJjaGl2ZUZpbGUNCgkJCSkNCg0KCQkJaWYgKFtTeXN0ZW0uSU8uRmlsZV06OkV4aXN0cygkYXJjaGl2ZUZpbGUpKQ0KCQkJew0KCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGFyY2hpdmVGaWxlKQ0KDQoJCQkJIyBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGlzIHNwZWNpZmVkIGZvciB0aGUgemlwIGZpbGUuDQoJCQkJaWYgKCRleHRlbnNpb24gLW5lICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yIC1mICRleHRlbnNpb24sICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIk5vdFN1cHBvcnRlZEFyY2hpdmVGaWxlRXh0ZW5zaW9uIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXh0ZW5zaW9uDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGFyY2hpdmVGaWxlKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiUGF0aE5vdEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkYXJjaGl2ZUZpbGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRXhwYW5kQXJjaGl2ZUhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGV4cGFuZCB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzDQojIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIEV4cGFuZEFyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRhcmNoaXZlRmlsZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGV4cGFuZGVkRGlyLA0KDQoJCQkJW3JlZl0NCgkJCQkkZXhwYW5kZWRJdGVtcywNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRmb3JjZSwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc1ZlcmJvc2UsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNDb25maXJtDQoJCQkpDQoNCgkJCUFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBUaGUgZXhpc3RhbmNlIG9mIGFyY2hpdmUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCQkJIyBiZWZvcmUgY2FsbGluZyB0aGlzIGhlbHBlciBmdW5jdGlvbi4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkYXJjaGl2ZUZpbGUsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlU3RyZWFtIC1Bcmd1bWVudExpc3QgJGFyY2hpdmVGaWxlU3RyZWFtQXJncw0KDQoJCQkJJHppcEFyY2hpdmVBcmdzID0gQCgkYXJjaGl2ZUZpbGVTdHJlYW0sIFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZU1vZGVdOjpSZWFkLCAkZmFsc2UpDQoJCQkJJHppcEFyY2hpdmUgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSAtQXJndW1lbnRMaXN0ICR6aXBBcmNoaXZlQXJncw0KDQoJCQkJaWYgKCR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgLWVxIDApDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVJc0VtcHR5ID0gKCRMb2NhbGl6ZWREYXRhLkFyY2hpdmVGaWxlSXNFbXB0eSAtZiAkYXJjaGl2ZUZpbGUpDQoJCQkJCVdyaXRlLVZlcmJvc2UgJGFyY2hpdmVGaWxlSXNFbXB0eQ0KCQkJCQlyZXR1cm4NCgkJCQl9DQoNCgkJCQkkY3VycmVudEVudHJ5Q291bnQgPSAwDQoJCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZFByb2dyZXNzQmFyVGV4dCAtZiAkYXJjaGl2ZUZpbGUpDQoNCgkJCQkjIFRoZSBhcmNoaXZlIGVudHJpZXMgY2FuIGVpdGhlciBiZSBlbXB0eSBkaXJlY3RvcmllcyBvciBmaWxlcy4NCgkJCQlmb3JlYWNoICgkY3VycmVudEFyY2hpdmVFbnRyeSBpbiAkemlwQXJjaGl2ZS5FbnRyaWVzKQ0KCQkJCXsNCgkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoID0gSm9pbi1QYXRoIC1QYXRoICRleHBhbmRlZERpciAtQ2hpbGRQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5LkZ1bGxOYW1lDQoJCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KDQoJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBpcyBhbiBlbXB0eSBkaXJlY3RvcnkNCgkJCQkJIyBUaGUgRnVsbE5hbWUgb2YgdGhlIEFyY2hpdmUgRW50cnkgcmVwcmVzZW50aW5nIGEgZGlyZWN0b3J5IHdvdWxkIGVuZCB3aXRoIGEgdHJhaWxpbmcgJ1wnLg0KCQkJCQlpZiAoJGV4dGVuc2lvbiAtZXEgW3N0cmluZ106OkVtcHR5IC1hbmQNCgkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aC5FbmRzV2l0aCgiXCIsIFtTdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKQ0KCQkJCQl7DQoJCQkJCQkkcGF0aEV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBleHBlY3RzIGFuIGVtcHR5IGRpcmVjdG9yeS4NCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSBpcyBlbXB0eS4gSWYgaXRzIG5vdCBlbXB0eQ0KCQkJCQkJIyB0aGVuIGl0IG1lYW5zIHRoYXQgdXNlciBoYXMgYWRkZWQgdGhpcyBkaXJlY3RvcnkgYnkgb3RoZXIgbWVhbnMuDQoJCQkJCQlpZiAoJHBhdGhFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCXsNCgkJCQkJCQlOZXctSXRlbSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIHwgT3V0LU51bGwNCg0KCQkJCQkJCWlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGFkZEVtcHR5RGlyZWN0b3J5dG9FeHBhbmRlZFBhdGhNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRW1wdHlEaXJlY3Rvcnl0b0V4cGFuZGVkUGF0aE1lc3NhZ2UNCg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQl0cnkNCgkJCQkJCXsNCgkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVJbmZvIC1Bcmd1bWVudExpc3QgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoJCQkJCQkJJHBhcmVudERpckV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXINCg0KCQkJCQkJCSMgSWYgdGhlIFBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGUgaXQuDQoJCQkJCQkJaWYgKCRwYXJlbnREaXJFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCQl7DQoJCQkJCQkJCU5ldy1JdGVtICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gfCBPdXQtTnVsbA0KDQoJCQkJCQkJCWlmICghKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXIpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkjIFRoZSBkaXJlY3RvcnkgcmVmZXJyZWQgYnkgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuDQoJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCSMgYW5kIGF1dGhvcml6YXRpb24gd2FzIG5vdCBwcm92aWRlZCB3aGVuIGNvbmZpcm1hdGlvbiB3YXMgcHJvbXB0ZWQuIEluIHN1Y2ggYSBzY2VuYXJpbywNCgkJCQkJCQkJCSMgd2Ugc2tpcCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBhcmNoaXZlIGFuZCBjb250aW51ZSB3aXRoIHRoZSByZW1haW5pbmcgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzLg0KCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZQ0KCQkJCQkJCX0NCg0KCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJGZhbHNlDQoNCgkJCQkJCQkjIENoZWNrIGlmIHRoZSBmaWxlIGluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgY29udGVudHMNCgkJCQkJCQkjIHdvdWxkIGJlIGV4cGFuZGVkIGFscmVhZHkgZXhpc3RzLg0KCQkJCQkJCWlmICgkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkV4aXN0cykNCgkJCQkJCQl7DQoJCQkJCQkJCWlmICgkZm9yY2UpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCVJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIC1Gb3JjZSAtRXJyb3JWYXJpYWJsZSBldiAtVmVyYm9zZTokaXNWZXJib3NlIC1Db25maXJtOiRpc0NvbmZpcm0NCgkJCQkJCQkJCWlmICgkZXYgLW5lICRudWxsKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSAtUGF0aFR5cGUgTGVhZikNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkjIFRoZSBmaWxlIHJlZmVycmVkIGJ5ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4NCgkJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCQkjIGFuZCBhdXRob3JpemF0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBjb25maXJtYXRpb24gd2FzIHByb21wdGVkLiBJbiBzdWNoIGEgc2NlbmFyaW8sDQoJCQkJCQkJCQkJIyB3ZSBza2lwIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGFyY2hpdmUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlbWFpbmluZyBhcmNoaXZlIGZpbGUgY29udGVudHMuDQoJCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSMgV3JpdGUgbm9uLXRlcm1pbmF0aW5nIGVycm9yIHRvIHRoZSBwaXBlbGluZS4NCgkJCQkJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRmlsZUV4aXN0c0Vycm9yIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUsICRhcmNoaXZlRmlsZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSkNCgkJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJFeHBhbmRBcmNoaXZlRmlsZUV4aXN0cyIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRPcGVyYXRpb24pICRudWxsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUNCgkJCQkJCQkJCVdyaXRlLUVycm9yIC1FcnJvclJlY29yZCAkZXJyb3JSZWNvcmQNCgkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICghJGhhc05vblRlcm1pbmF0aW5nRXJyb3IpDQoJCQkJCQkJew0KCQkJCQkJCQlbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVFeHRlbnNpb25zXTo6RXh0cmFjdFRvRmlsZSgkY3VycmVudEFyY2hpdmVFbnRyeSwgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoLCAkZmFsc2UpDQoNCgkJCQkJCQkJIyBBZGQgdGhlIGV4cGFuZGVkIGZpbGUgcGF0aCB0byB0aGUgJGV4cGFuZGVkSXRlbXMgYXJyYXksDQoJCQkJCQkJCSMgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIGV4cGFuZGVkIGZpbGVzIGNyZWF0ZWQgd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCQkJCSMgSWYgdXNlciBlbnRlcnMgQ1RSTCArIEMgdGhlbiBhdCB0aGF0IHBvaW50IG9mIHRpbWUsIGFsbCB0aGVzZSBleHBhbmRlZCBmaWxlcw0KCQkJCQkJCQkjIHdvdWxkIGJlIGRlbGV0ZWQgYXMgcGFydCBvZiB0aGUgY2xlYW4gdXAgcHJvY2Vzcy4NCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCQkJJGFkZEZpbGV0b0V4cGFuZGVkUGF0aE1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRmlsZXRvRXhwYW5kZWRQYXRoTWVzc2FnZQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWZpbmFsbHkNCgkJCQkJCXsNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KDQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkc3JjU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBTZXQgdG8gMTAwIGdpdmluZyBlcXVhbCB3ZWlnaHRhZ2UgdG8gZWFjaCBmaWxlIHRoYXQgaXMgZ2V0dGluZyBleHBhbmRlZC4NCgkJCQkJIyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0IGlzIHNldCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwDQoJCQkJCVByb2dyZXNzQmFySGVscGVyICJFeHBhbmQtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgICRjdXJyZW50RW50cnlDb3VudA0KCQkJCX0NCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQlJZiAoJG51bGwgLW5lICR6aXBBcmNoaXZlKQ0KCQkJCXsNCgkJCQkJJHppcEFyY2hpdmUuRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJSWYgKCRudWxsIC1uZSAkYXJjaGl2ZUZpbGVTdHJlYW0pDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJIyBDb21wbGV0ZSB3cml0aW5nIHByb2dyZXNzLg0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAiRXhwYW5kLUFyY2hpdmUiIC1Db21wbGV0ZWQNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgUHJvZ3Jlc3NCYXJIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG1lc3NhZ2UuDQojIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIENvbXByZXNzLUFyY2hpdmUgJiBFeHBhbmQtQXJjaGl2ZSB0byBkaXNwbGF5IGFyY2hpdmUgZmlsZQ0KIyBjcmVhdGlvbi9leHBhbnNpb24gcHJvZ3Jlc3MuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gUHJvZ3Jlc3NCYXJIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjbWRsZXROYW1lLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkc3RhdHVzLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQsDQoNCgkJCQlbaW50XQ0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcywNCg0KCQkJCVtpbnRdDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkpDQoNCgkJCWlmICgkY3VycmVudEVudHJ5Q291bnQgLWd0IDAgLWFuZA0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcyAtZ3QgMCAtYW5kDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCAtZ2UgMCAtYW5kDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0IC1ndCAwKQ0KCQkJew0KCQkJCSRlbnRyeURlZmF1bHRXZWlnaHQgPSAkY3VycmVudFNlZ21lbnRXZWlnaHQvW2RvdWJsZV0kdG90YWxOdW1iZXJvZkVudHJpZXMNCg0KCQkJCSRwZXJjZW50Q29tcGxldGUgPSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICsgKCRlbnRyeURlZmF1bHRXZWlnaHQgKiAkY3VycmVudEVudHJ5Q291bnQpDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICRjbWRsZXROYW1lIC1TdGF0dXMgJHN0YXR1cyAtUGVyY2VudENvbXBsZXRlICRwZXJjZW50Q29tcGxldGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ1NWSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvbW1hIGFmdGVyIGVhY2ggcGF0aCBzcGVjaWZpZCBieQ0KIyB0aGUgU291cmNlUGF0aCBhcnJheS4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNwbGF5IGFsbCB0aGUgdXNlciBzdXBwbGllZCBwYXRocw0KIyBpbiB0aGUgV2hhdElmIG1lc3NhZ2UuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gQ1NWSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoDQoJCQkpDQoNCgkJCSMgU291cmNlUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSB0aGUgY2FsbGluZyBmdW5jYXRpb24uDQoJCQlpZiAoJHNvdXJjZVBhdGguQ291bnQgLWd0IDEpDQoJCQl7DQoJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9ICJgbiINCgkJCQlmb3IgKCRjdXJyZW50SW5kZXggPSAwOyAkY3VycmVudEluZGV4IC1sdCAkc291cmNlUGF0aC5Db3VudDsgJGN1cnJlbnRJbmRleCsrKQ0KCQkJCXsNCgkJCQkJaWYgKCRjdXJyZW50SW5kZXggLWVxICRzb3VyY2VQYXRoLkNvdW50IC0gMSkNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XSArICJgbiINCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gJHNvdXJjZVBhdGgNCgkJCX0NCg0KCQkJcmV0dXJuICRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gdGhyb3cgdGVybWluYXRpbmcgZXJyb3IuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QsDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRpbm5lckV4Y2VwdGlvbg0KCQkJKQ0KDQoJCQlpZiAoJGlubmVyRXhjZXB0aW9uIC1lcSAkbnVsbCkNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LW9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkaW5uZXJFeGNlcHRpb24NCgkJCX0NCg0KCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCSRQU0NtZGxldC5UaHJvd1Rlcm1pbmF0aW5nRXJyb3IoJGVycm9yUmVjb3JkKQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDcmVhdGVFcnJvclJlY29yZEhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhbiBFcnJvclJlY29yZA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIENyZWF0ZUVycm9yUmVjb3JkSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRleGNlcHRpb24sDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QNCgkJCSkNCg0KCQkJaWYgKCRudWxsIC1lcSAkZXhjZXB0aW9uKQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQl9DQoNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCXJldHVybiAkZXJyb3JSZWNvcmQNCgkJfQ0KCQkjZW5kcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoNCgkJJGlzVmVyYm9zZSA9ICRwc2JvdW5kcGFyYW1ldGVycy5Db250YWluc0tleSgiVmVyYm9zZSIpDQoJCSRpc0NvbmZpcm0gPSAkcHNib3VuZHBhcmFtZXRlcnMuQ29udGFpbnNLZXkoIkNvbmZpcm0iKQ0KDQoJCSRpc0Rlc3RpbmF0aW9uUGF0aFByb3ZpZGVkID0gJHRydWUNCgkJaWYgKCREZXN0aW5hdGlvblBhdGggLWVxIFtzdHJpbmddOjpFbXB0eSkNCgkJew0KCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gJHB3ZA0KCQkJJGlzRGVzdGluYXRpb25QYXRoUHJvdmlkZWQgPSAkZmFsc2UNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRkZXN0aW5hdGlvblBhdGhFeGlzdHMgPSBUZXN0LVBhdGggLVBhdGggJERlc3RpbmF0aW9uUGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyDQoJCQlpZiAoJGRlc3RpbmF0aW9uUGF0aEV4aXN0cykNCgkJCXsNCgkJCQkkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJERlc3RpbmF0aW9uUGF0aCAkZmFsc2UgJFBTQ21kbGV0DQoJCQkJaWYgKCRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aC5Db3VudCAtZ3QgMSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZEV4cGFuZGVkRGlyUGF0aEVycm9yIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZERlc3RpbmF0aW9uUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQkJCX0NCg0KCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBwcm92aWRlZCBwYXRoIHJlc29sdmVzIHRvIGEgdmFsaWQgc2luZ2xlIHBhdGguDQoJCQkJIyBDYWxsaW5nIFJlc29sdmUtUGF0aCBhZ2FpbiB0byBnZXQgdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIgbmFtZS4NCgkJCQkkc3VwcGxpZWREZXN0aW5hdGlvblBhdGggPSBSZXNvbHZlLVBhdGggLVBhdGggJERlc3RpbmF0aW9uUGF0aA0KCQkJCWlmICgkc3VwcGxpZWREZXN0aW5hdGlvblBhdGguUHJvdmlkZXIuTmFtZSAtbmUgIkZpbGVTeXN0ZW0iKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWREaXJlY3RvcnlQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRjcmVhdGVkSXRlbSA9IE5ldy1JdGVtIC1QYXRoICREZXN0aW5hdGlvblBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIC1WZXJib3NlOiRpc1ZlcmJvc2UgLUVycm9yQWN0aW9uIFN0b3ANCgkJCQlpZiAoJGNyZWF0ZWRJdGVtIC1uZSAkbnVsbCAtYW5kICRjcmVhdGVkSXRlbS5QU1Byb3ZpZGVyLk5hbWUgLW5lICJGaWxlU3lzdGVtIikNCgkJCQl7DQoJCQkJCVJlbW92ZS1JdGVtICIkRGVzdGluYXRpb25QYXRoIiAtRm9yY2UgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWREaXJlY3RvcnlQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCQkJfQ0KDQoJCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICREZXN0aW5hdGlvblBhdGggJHRydWUgJFBTQ21kbGV0DQoJCQl9DQoJCX0NCg0KCQkkaXNXaGF0SWYgPSAkcHNib3VuZHBhcmFtZXRlcnMuQ29udGFpbnNLZXkoIldoYXRJZiIpDQoJCWlmICghJGlzV2hhdElmKQ0KCQl7DQoJCQkkcHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlKQ0KCQkJV3JpdGUtVmVyYm9zZSAkcHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZQ0KDQoJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuRXhwYW5kUHJvZ3Jlc3NCYXJUZXh0IC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQlQcm9ncmVzc0JhckhlbHBlciAiRXhwYW5kLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAwIDEwMCAxMDAgMQ0KCQl9DQoJfQ0KCVBST0NFU1MNCgl7DQoJCXN3aXRjaCAoJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUpDQoJCXsNCgkJCSJQYXRoIg0KCQkJew0KCQkJCSRyZXNvbHZlZFNvdXJjZVBhdGhzID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICRQYXRoICRmYWxzZSAkUFNDbWRsZXQNCg0KCQkJCWlmICgkcmVzb2x2ZWRTb3VyY2VQYXRocy5Db3VudCAtZ3QgMSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZEFyY2hpdmVGaWxlUGF0aEVycm9yIC1mICRQYXRoLCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSwgJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZEFyY2hpdmVGaWxlUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJFBhdGgNCgkJCQl9DQoJCQl9DQoJCQkiTGl0ZXJhbFBhdGgiDQoJCQl7DQoJCQkJJHJlc29sdmVkU291cmNlUGF0aHMgPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJExpdGVyYWxQYXRoICR0cnVlICRQU0NtZGxldA0KDQoJCQkJaWYgKCRyZXNvbHZlZFNvdXJjZVBhdGhzLkNvdW50IC1ndCAxKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3IgLWYgJExpdGVyYWxQYXRoLCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSwgJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZEFyY2hpdmVGaWxlUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJExpdGVyYWxQYXRoDQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlciAkcmVzb2x2ZWRTb3VyY2VQYXRocw0KDQoJCWlmICgkcHNjbWRsZXQuU2hvdWxkUHJvY2VzcygkcmVzb2x2ZWRTb3VyY2VQYXRocykpDQoJCXsNCgkJCSRleHBhbmRlZEl0ZW1zID0gQCgpDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgU3RvcFByb2Nlc3NpbmcgaXMgbm90IGF2YWxpYWJsZSBpbiBTY3JpcHQgY21kbGV0cy4gSG93ZXZlciB0aGUgcGlwbGVsaW5lIGV4ZWN1dGlvbg0KCQkJCSMgaXMgdGVybWluYXRlZCB3aGVuIGV2ZXIgJ0NUUkwgKyBDJyBpcyBlbnRlcmVkIGJ5IHVzZXIgdG8gdGVybWluYXRlIHRoZSBjbWRsZXQgZXhlY3V0aW9uLg0KCQkJCSMgVGhlIGZpbmFsbHkgYmxvY2sgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgcGlwbGVsaW5lIGlzIHRlcm1pbmF0ZWQuDQoJCQkJIyAkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSB2YXJpYWJsZSBpcyB1c2VkIHRvIHRyYWNrIGlmICdDVFJMICsgQycgaXMgZW50ZXJlZCBieSB0aGUNCgkJCQkjIHVzZXIuDQoJCQkJJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgPSAkZmFsc2UNCg0KCQkJCSMgVGhlIFVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIGRlc3RpbmF0aW9uIHBhdGgsIGhlbmNlIHdlIHVzZSAnJHB3ZFxBcmNoaXZlRmlsZU5hbWUnIGFzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlDQoJCQkJIyBhcmNoaXZlIGZpbGUgY29udGVudHMgd291bGQgYmUgZXhwYW5kZWQuIElmIHRoZSBwYXRoICckcHdkXEFyY2hpdmVGaWxlTmFtZScgYWxyZWFkeSBleGlzdHMgdGhlbiB3ZSB1c2UgdGhlDQoJCQkJIyBXaW5kb3dzIGRlZmF1bHQgbWVjaGFuaXNtIG9mIGFwcGVuZGluZyBhIGNvdW50ZXIgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5IG5hbWUgd2hlcmUgdGhlIGNvbnRlbnRzDQoJCQkJIyB3b3VsZCBiZSBleHBhbmRlZC4NCgkJCQlpZiAoISRpc0Rlc3RpbmF0aW9uUGF0aFByb3ZpZGVkKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZUluZm8gJHJlc29sdmVkU291cmNlUGF0aHMNCgkJCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gSm9pbi1QYXRoIC1QYXRoICRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCAtQ2hpbGRQYXRoICRhcmNoaXZlRmlsZS5CYXNlTmFtZQ0KCQkJCQkkZGVzdGluYXRpb25QYXRoRXhpc3RzID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIENvbnRhaW5lcg0KDQoJCQkJCWlmICghJGRlc3RpbmF0aW9uUGF0aEV4aXN0cykNCgkJCQkJew0KCQkJCQkJTmV3LUl0ZW0gLVBhdGggJHJlc29sdmVkRGVzdGluYXRpb25QYXRoIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSAtVmVyYm9zZTokaXNWZXJib3NlIC1FcnJvckFjdGlvbiBTdG9wIHwgT3V0LU51bGwNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCUV4cGFuZEFyY2hpdmVIZWxwZXIgJHJlc29sdmVkU291cmNlUGF0aHMgJHJlc29sdmVkRGVzdGluYXRpb25QYXRoIChbcmVmXSRleHBhbmRlZEl0ZW1zKSAkRm9yY2UgJGlzVmVyYm9zZSAkaXNDb25maXJtDQoNCgkJCQkkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSA9ICR0cnVlDQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJIyBUaGUgJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgd291bGQgYmUgc2V0IHRvICRmYWxzZSBpZiB1c2VyIGhhcyB0eXBlZCAnQ1RSTCArIEMnIHRvDQoJCQkJIyB0ZXJtaW5hdGUgdGhlIGNtZGxldCBleGVjdXRpb24gb3IgaWYgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQoJCQkJaWYgKCRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIC1lcSAkZmFsc2UpDQoJCQkJew0KCQkJCQlpZiAoJGV4cGFuZGVkSXRlbXMuQ291bnQgLWd0IDApDQoJCQkJCXsNCgkJCQkJCSMgZGVsZXRlIHRoZSBleHBhbmRlZCBmaWxlL2RpcmVjdG9yeSBhcyB0aGUgYXJjaGl2ZQ0KCQkJCQkJIyBmaWxlIHdhcyBub3QgY29tcGxldGx5IGV4cGFuZGVkLg0KCQkJCQkJJGV4cGFuZGVkSXRlbXMgfCBGb3JFYWNoLU9iamVjdCB7IFJlbW92ZS1JdGVtICRfIC1Gb3JjZSAtUmVjdXJzZSB9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIFdyaXRlLUxvY2FsTWVzc2FnZQ0Kew0KICAgIFtDbWRsZXRCaW5kaW5nKCldDQogICAgUGFyYW0gKA0KICAgICAgICBbc3RyaW5nXSRNZXNzYWdlDQogICAgKQ0KDQogICAgaWYgKFRlc3QtUGF0aCBmdW5jdGlvbjpXcml0ZS1QU0ZNZXNzYWdlKSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAkTWVzc2FnZSB9DQogICAgZWxzZSB7IFdyaXRlLUhvc3QgJE1lc3NhZ2UgfQ0KfQ0KI2VuZHJlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KDQp0cnkNCnsNCglbU3lzdGVtLk5ldC5TZXJ2aWNlUG9pbnRNYW5hZ2VyXTo6U2VjdXJpdHlQcm90b2NvbCA9ICJUbHMxMiINCg0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiRG93bmxvYWRpbmcgcmVwb3NpdG9yeSBmcm9tICckKCRCYXNlVXJsKS9hcmNoaXZlLyQoJEJyYW5jaCkuemlwJyINCglJbnZva2UtV2ViUmVxdWVzdCAtVXJpICIkKCRCYXNlVXJsKS9hcmNoaXZlLyQoJEJyYW5jaCkuemlwIiAtVXNlQmFzaWNQYXJzaW5nIC1PdXRGaWxlICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkuemlwIiAtRXJyb3JBY3Rpb24gU3RvcA0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiQ3JlYXRpbmcgdGVtcG9yYXJ5IHByb2plY3QgZm9sZGVyOiAnJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpJyINCgkkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRlbnY6VEVNUCAtTmFtZSAkTW9kdWxlTmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Gb3JjZSAtRXJyb3JBY3Rpb24gU3RvcA0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiRXh0cmFjdGluZyBhcmNoaXZlIHRvICckKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSknIg0KCUV4cGFuZC1BcmNoaXZlIC1QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkuemlwIiAtRGVzdGluYXRpb25QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkiIC1FcnJvckFjdGlvbiBTdG9wDQoJDQoJJGJhc2VQYXRoID0gR2V0LUNoaWxkSXRlbSAiJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpXCoiIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMQ0KCWlmICgkU3ViRm9sZGVyKSB7ICRiYXNlUGF0aCA9ICIkKCRiYXNlUGF0aClcJCgkU3ViRm9sZGVyKSIgfQ0KCQ0KCSMgT25seSBuZWVkZWQgZm9yIFBTIHY1KyBidXQgZG9lc24ndCBodXJ0IGFueXdheQ0KCSRtYW5pZmVzdCA9ICIkKCRiYXNlUGF0aClcJCgkTW9kdWxlTmFtZSkucHNkMSINCgkkbWFuaWZlc3REYXRhID0gSW52b2tlLUV4cHJlc3Npb24gKFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRtYW5pZmVzdCkpDQoJJG1vZHVsZVZlcnNpb24gPSAkbWFuaWZlc3REYXRhLk1vZHVsZVZlcnNpb24NCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkRvd25sb2FkIGNvbmNsdWRlZDogJCgkTW9kdWxlTmFtZSkgfCBCcmFuY2ggJCgkQnJhbmNoKSB8IFZlcnNpb24gJCgkbW9kdWxlVmVyc2lvbikiDQoJDQoJIyBEZXRlcm1pbmUgb3V0cHV0IHBhdGgNCgkkcGF0aCA9ICIkKCRlbnY6UHJvZ3JhbUZpbGVzKVxXaW5kb3dzUG93ZXJTaGVsbFxNb2R1bGVzXCQoJE1vZHVsZU5hbWUpIg0KCWlmICgkVXNlck1vZGUpIHsgJHBhdGggPSAiJCgkSE9NRSlcRG9jdW1lbnRzXFdpbmRvd3NQb3dlclNoZWxsXE1vZHVsZXNcJCgkTW9kdWxlTmFtZSkiIH0NCglpZiAoJFBTVmVyc2lvblRhYmxlLlBTVmVyc2lvbi5NYWpvciAtZ2UgNSkgeyAkcGF0aCArPSAiXCRtb2R1bGVWZXJzaW9uIiB9DQoJDQoJaWYgKChUZXN0LVBhdGggJHBhdGgpIC1hbmQgKC1ub3QgJEZvcmNlKSkNCgl7DQoJCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiTW9kdWxlIGFscmVhZHkgaW5zdGFsbGVkLCBpbnRlcnJ1cHRpbmcgaW5zdGFsbGF0aW9uIg0KCQlyZXR1cm4NCgl9DQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDcmVhdGluZyBmb2xkZXI6ICQoJHBhdGgpIg0KCSRudWxsID0gTmV3LUl0ZW0gLVBhdGggJHBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgLUVycm9yQWN0aW9uIFN0b3ANCgkNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkNvcHlpbmcgZmlsZXMgdG8gJCgkcGF0aCkiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gLVBhdGggJGJhc2VQYXRoKSkNCgl7DQoJCU1vdmUtSXRlbSAtUGF0aCAkZmlsZS5GdWxsTmFtZSAtRGVzdGluYXRpb24gJHBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgl9DQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMiDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUZvcmNlIC1SZWN1cnNlDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1Gb3JjZQ0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiSW5zdGFsbGF0aW9uIG9mIHRoZSBtb2R1bGUgJCgkTW9kdWxlTmFtZSksIEJyYW5jaCAkKCRCcmFuY2gpLCBWZXJzaW9uICQoJG1vZHVsZVZlcnNpb24pIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIg0KfQ0KY2F0Y2gNCnsNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkluc3RhbGxhdGlvbiBvZiB0aGUgbW9kdWxlICQoJE1vZHVsZU5hbWUpIGZhaWxlZCEiDQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMiDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUZvcmNlIC1SZWN1cnNlDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1Gb3JjZQ0KCQ0KCXRocm93DQp9AQkEAAAACQUAAAAGBgAAAAtpbnN0YWxsLnBzMQYHAAAAC2luc3RhbGwucHMxBggAAAACw74JCQAAAAkKAAAABAQAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCwAAAAEAAAABAAAAAQUAAAAEAAAACQwAAAAAAAAAAAAAAAEJAAAABAAAAAkMAAAAAAAAAAAAAAABCgAAAAQAAAAJDAAAAAAAAAAAAAAAEQsAAAAEAAAABg0AAAAEbmFtZQ0DEQwAAAAAAAAACw==</BA>
            </MS>
          </Obj>
          <Obj RefId="39">
            <TNRef RefId="7" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value">MIT License_x000D__x000A__x000D__x000A_Copyright (c) þ!year!þ þauthorþ_x000D__x000A__x000D__x000A_Permission is hereby granted, free of charge, to any person obtaining a copy_x000D__x000A_of this software and associated documentation files (the "Software"), to deal_x000D__x000A_in the Software without restriction, including without limitation the rights_x000D__x000A_to use, copy, modify, merge, publish, distribute, sublicense, and/or sell_x000D__x000A_copies of the Software, and to permit persons to whom the Software is_x000D__x000A_furnished to do so, subject to the following conditions:_x000D__x000A__x000D__x000A_The above copyright notice and this permission notice shall be included in all_x000D__x000A_copies or substantial portions of the Software._x000D__x000A__x000D__x000A_THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR_x000D__x000A_IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,_x000D__x000A_FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE_x000D__x000A_AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER_x000D__x000A_LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,_x000D__x000A_OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE_x000D__x000A_SOFTWARE.</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="40">
                <TNRef RefId="2" />
                <LST>
                  <S>author</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="41">
                <TNRef RefId="2" />
                <LST>
                  <S>year</S>
                </LST>
              </Obj>
              <S N="Name">LICENSE</S>
              <S N="RelativePath">LICENSE</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="42">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="43">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAxAhNSVQgTGljZW5zZQ0KDQpDb3B5cmlnaHQgKGMpIMO+IXllYXIhw74gw75hdXRob3LDvg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwNCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFDQpTT0ZUV0FSRS4BCQQAAAAJBQAAAAYGAAAAB0xJQ0VOU0UGBwAAAAdMSUNFTlNFBggAAAACw74JCQAAAAkKAAAABAQAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCwAAAAEAAAABAAAAAQUAAAAEAAAACQwAAAABAAAAAQAAAAEJAAAABAAAAAkNAAAAAAAAAAAAAAABCgAAAAQAAAAJDQAAAAAAAAAAAAAAEQsAAAAEAAAABg4AAAAGYXV0aG9yDQMRDAAAAAQAAAAGDwAAAAR5ZWFyDQMRDQAAAAAAAAAL</BA>
            </MS>
          </Obj>
          <Obj RefId="44">
            <TNRef RefId="7" />
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value"># Description_x000D__x000A__x000D__x000A_Insert a useful description for the þnameþ project here._x000D__x000A__x000D__x000A_Remember, it's the first thing a visitor will see.</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="45">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="46">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">README.md</S>
              <S N="RelativePath">README.md</S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="47">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="48">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAgQEjIERlc2NyaXB0aW9uDQoNCkluc2VydCBhIHVzZWZ1bCBkZXNjcmlwdGlvbiBmb3IgdGhlIMO+bmFtZcO+IHByb2plY3QgaGVyZS4NCg0KUmVtZW1iZXIsIGl0J3MgdGhlIGZpcnN0IHRoaW5nIGEgdmlzaXRvciB3aWxsIHNlZS4BCQQAAAAJBQAAAAYGAAAACVJFQURNRS5tZAYHAAAACVJFQURNRS5tZAYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAABAAAAAQAAAAEFAAAABAAAAAkMAAAAAAAAAAAAAAABCQAAAAQAAAAJDAAAAAAAAAAAAAAAAQoAAAAEAAAACQwAAAAAAAAAAAAAABELAAAABAAAAAYNAAAABG5hbWUNAxEMAAAAAAAAAAs=</BA>
            </MS>
          </Obj>
        </LST>
      </Obj>
    </Props>
    <MS>
      <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUKAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMIQ2hpbGRyZW4BBAMBAQADAwMDKVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAgAAAA5TeXN0ZW0uVmVyc2lvbg1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dgAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQIAAAAGAwAAAApQU0ZQcm9qZWN0Bfz///8pUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZVR5cGUBAAAAB3ZhbHVlX18ACAIAAAABAAAACQUAAAAGBgAAACtQb3dlclNoZWxsIEZyYW1ld29yayBiYXNlZCBwcm9qZWN0IHNjYWZmb2xkBgcAAAASRnJpZWRyaWNoIFdlaW5tYW5uAAAyiYeE1YgJCAAAAAkJAAAACQoAAAAJCwAAAAQFAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAEAAAAAAAAAAAAAAAAAAAAECAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkMAAAAAgAAAAAAAAABCQAAAAgAAAAJDQAAAAQAAAAEAAAABAoAAACAAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0EAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUNS2V5VmFsdWVQYWlycwADAAMIFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIIhAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV1bXQYAAAAJDgAAAAcAAAAJDwAAAAQLAAAAngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZVtdAgAAAAgICRAAAAAIAAAACAAAABEMAAAAAgAAAAYRAAAABm1vZHVsZQYSAAAAC3BzZnJhbWV3b3JrEQ0AAAAEAAAABhMAAAAEbmFtZQYUAAAABmF1dGhvcgYVAAAAB2NvbXBhbnkGFgAAAAtkZXNjcmlwdGlvbgQOAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBBw8AAAAAAQAAAAYAAAADggJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0E6f///4ICU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAgAAAANrZXkFdmFsdWUBBCxQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdAIAAAAGGAAAAAVndWlkNAkZAAAAAeb////p////BhsAAAAEeWVhcgkcAAAAAeP////p////Bh4AAAAFZ3VpZDIJHwAAAAHg////6f///wYhAAAABGRhdGUJIgAAAAHd////6f///wYkAAAABGd1aWQJJQAAAAHa////6f///wYnAAAABWd1aWQzCSgAAAAHEAAAAAABAAAACAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkpAAAACSoAAAAJKwAAAAksAAAACS0AAAAJLgAAAAkvAAAACTAAAAAMMQAAAF9TeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNQUZAAAALFBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0AgAAAAROYW1lC1NjcmlwdEJsb2NrAQQ7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIxAAAAAgAAAAkYAAAACTMAAAABHAAAABkAAAAJGwAAAAk1AAAAAR8AAAAZAAAACR4AAAAJNwAAAAEiAAAAGQAAAAkhAAAACTkAAAABJQAAABkAAAAJJAAAAAk7AAAAASgAAAAZAAAACScAAAAJPQAAAAUpAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJPgAAAAY/AAAABWJ1aWxkBkAAAAAFYnVpbGQGQQAAAALDvglCAAAACUMAAAABKgAAACkAAAAJRAAAAAZFAAAAB2xpYnJhcnkGRgAAAAdsaWJyYXJ5CUEAAAAJSAAAAAlJAAAAASsAAAApAAAACUoAAAAGSwAAAAjDvm5hbWXDvgZMAAAACMO+bmFtZcO+CUEAAAAJTgAAAAlPAAAABSwAAAAtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1GaWxlCQAAAAVWYWx1ZQlQbGFpblRleHQUQ29udGVudFBhcmFtZXRlckZsYXQWQ29udGVudFBhcmFtZXRlclNjcmlwdAROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQBAAMDAQEBAwMBf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABlAAAABCIyBBdXRvIGRldGVjdCB0ZXh0IGZpbGVzIGFuZCBwZXJmb3JtIExGIG5vcm1hbGl6YXRpb24NCiogdGV4dD1hdXRvAQlRAAAACVIAAAAGUwAAAA4uZ2l0YXR0cmlidXRlcwZUAAAADi5naXRhdHRyaWJ1dGVzCUEAAAAJVgAAAAlXAAAAAS0AAAAsAAAABlgAAAD5Ag0KIyBpZ25vcmUgdGhlIHNldHRpbmdzIGZvbGRlciBhbmQgZmlsZXMgZm9yIFZTQ29kZSBhbmQgUFNTDQoudnNjb2RlLyoNCioucHNwcm9qDQoqVGVtcFBvaW50Kg0KDQojIElnbm9yZSBzdGFnaW5nIGluZm8gZnJvbSBWaXN1YWwgU3R1ZGlvDQpsaWJyYXJ5L8O+bmFtZcO+Ly52cy8qDQpsaWJyYXJ5L8O+bmFtZcO+L8O+bmFtZcO+L2Jpbi8qDQpsaWJyYXJ5L8O+bmFtZcO+L8O+bmFtZcO+L29iai8qDQoNCiMgaWdub3JlIFBvd2VyU2hlbGwgU3R1ZGlvIE1ldGFEYXRhDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2oNCsO+bmFtZcO+L8O+bmFtZcO+LnBzcHJvai5iYWsNCsO+bmFtZcO+L8O+bmFtZcO+LnBzcHJvanMNCsO+bmFtZcO+L8O+bmFtZcO+LnBzcHJvag0KAQlZAAAACVoAAAAGWwAAAAouZ2l0aWdub3JlBlwAAAAKLmdpdGlnbm9yZQlBAAAACV4AAAAJXwAAAAEuAAAALAAAAAZgAAAAr6gFPCMNCgkuU1lOT1BTSVMNCgkJSW5zdGFsbHMgdGhlIFBTTW9kdWxlRGV2ZWxvcG1lbnQgTW9kdWxlIGZyb20gZ2l0aHViDQoJCQ0KCS5ERVNDUklQVElPTg0KCQlUaGlzIHNjcmlwdCBpbnN0YWxscyB0aGUgUFNNb2R1bGVEZXZlbG9wbWVudCBNb2R1bGUgZnJvbSBnaXRodWIuDQoJCQ0KCQlJdCBkb2VzIHNvIGJ5IC4uLg0KCQktIGRvd25sb2FkaW5nIHRoZSBzcGVjaWZpZWQgYnJhbmNoIGFzIHppcCB0byAkZW52OlRFTVANCgkJLSBVbnBhY2tpbmcgdGhhdCB6aXAgZmlsZSB0byBhIGZvbGRlciBpbiAkZW52OlRFTVANCgkJLSBNb3ZpbmcgdGhhdCBjb250ZW50IHRvIGEgbW9kdWxlIGZvbGRlciBpbiBlaXRoZXIgcHJvZ3JhbSBmaWxlcyAoZGVmYXVsdCkgb3IgdGhlIHVzZXIgcHJvZmlsZQ0KCQ0KCS5QQVJBTUVURVIgQnJhbmNoDQoJCVRoZSBicmFuY2ggdG8gaW5zdGFsbC4gSW5zdGFsbHMgbWFzdGVyIGJ5IGRlZmF1bHQuDQoJCVVua25vd24gYnJhbmNoZXMgd2lsbCB0ZXJtaW5hdGUgdGhlIHNjcmlwdCBpbiBlcnJvci4NCgkNCgkuUEFSQU1FVEVSIFVzZXJNb2RlDQoJCVRoZSBkb3dubG9hZGVkIG1vZHVsZSB3aWxsIGJlIG1vdmVkIHRvIHRoZSB1c2VyIHByb2ZpbGUsIHJhdGhlciB0aGFuIHByb2dyYW0gZmlsZXMuDQoNCgkuUEFSQU1FVEVSIEZvcmNlDQoJCVRoZSBpbnN0YWxsIHNjcmlwdCB3aWxsIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBtb2R1bGUuDQojPg0KW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3RyaW5nXQ0KCSRCcmFuY2ggPSAibWFzdGVyIiwNCgkNCglbc3dpdGNoXQ0KCSRVc2VyTW9kZSwNCgkNCglbc3dpdGNoXQ0KCSRGb3JjZQ0KKQ0KDQojcmVnaW9uIENvbmZpZ3VyYXRpb24gZm9yIGNsb25pbmcgc2NyaXB0DQojIE5hbWUgb2YgdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIGNsb25lZA0KJE1vZHVsZU5hbWUgPSAiw75uYW1lw74iDQoNCiMgQmFzZSBwYXRoIHRvIHRoZSBnaXRodWIgcmVwb3NpdG9yeQ0KJEJhc2VVcmwgPSAiaHR0cHM6Ly9naXRodWIuY29tLzxJbnNlcnRVc2VybmFtZUhlcmU+L8O+bmFtZcO+Ig0KDQojIElmIHRoZSBtb2R1bGUgaXMgaW4gYSBzdWJmb2xkZXIgb2YgdGhlIGNsb25lZCByZXBvc2l0b3J5LCBzcGVjaWZ5IHJlbGF0aXZlIHBhdGggaGVyZS4gRW1wdHkgc3RyaW5nIHRvIHNraXAuDQokU3ViRm9sZGVyID0gIsO+bmFtZcO+Ig0KI2VuZHJlZ2lvbiBDb25maWd1cmF0aW9uIGZvciBjbG9uaW5nIHNjcmlwdA0KDQojcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQpmdW5jdGlvbiBDb21wcmVzcy1BcmNoaXZlDQp7DQoJPCMNCgkJLlNZTk9QU0lTDQoJCQlDcmVhdGVzIGFuIGFyY2hpdmUsIG9yIHppcHBlZCBmaWxlLCBmcm9tIHNwZWNpZmllZCBmaWxlcyBhbmQgZm9sZGVycy4NCg0KCQkuREVTQ1JJUFRJT04NCgkJCVRoZSBDb21wcmVzcy1BcmNoaXZlIGNtZGxldCBjcmVhdGVzIGEgemlwcGVkIChvciBjb21wcmVzc2VkKSBhcmNoaXZlIGZpbGUgZnJvbSBvbmUgb3IgbW9yZSBzcGVjaWZpZWQgZmlsZXMgb3IgZm9sZGVycy4gQW4gYXJjaGl2ZSBmaWxlIGFsbG93cyBtdWx0aXBsZSBmaWxlcyB0byBiZSBwYWNrYWdlZCwgYW5kIG9wdGlvbmFsbHkgY29tcHJlc3NlZCwgaW50byBhIHNpbmdsZSB6aXBwZWQgZmlsZSBmb3IgZWFzaWVyIGRpc3RyaWJ1dGlvbiBhbmQgc3RvcmFnZS4gQW4gYXJjaGl2ZSBmaWxlIGNhbiBiZSBjb21wcmVzc2VkIGJ5IHVzaW5nIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IHRoZSBDb21wcmVzc2lvbkxldmVsIHBhcmFtZXRlci4NCg0KCQkJQmVjYXVzZSBDb21wcmVzcy1BcmNoaXZlIHJlbGllcyB1cG9uIHRoZSBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgQVBJIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlIHRvIGNvbXByZXNzIGZpbGVzLCB0aGUgbWF4aW11bSBmaWxlIHNpemUgdGhhdCB5b3UgY2FuIGNvbXByZXNzIGJ5IHVzaW5nIENvbXByZXNzLUFyY2hpdmUgaXMgY3VycmVudGx5IDIgR0IuIFRoaXMgaXMgYSBsaW1pdGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIEFQSS4NCg0KCQkuUEFSQU1FVEVSIFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCBvciBwYXRocyB0byB0aGUgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIGFyY2hpdmUgemlwcGVkIGZpbGUuIFRoaXMgcGFyYW1ldGVyIGNhbiBhY2NlcHQgd2lsZGNhcmQgY2hhcmFjdGVycy4gV2lsZGNhcmQgY2hhcmFjdGVycyBhbGxvdyB5b3UgdG8gYWRkIGFsbCBmaWxlcyBpbiBhIGZvbGRlciB0byB5b3VyIHppcHBlZCBhcmNoaXZlIGZpbGUuIFRvIHNwZWNpZnkgbXVsdGlwbGUgcGF0aHMsIGFuZCBpbmNsdWRlIGZpbGVzIGluIG11bHRpcGxlIGxvY2F0aW9ucyBpbiB5b3VyIG91dHB1dCB6aXBwZWQgZmlsZSwgdXNlIGNvbW1hcyB0byBzZXBhcmF0ZSB0aGUgcGF0aHMuDQoNCgkJLlBBUkFNRVRFUiBMaXRlcmFsUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIG9yIHBhdGhzIHRvIHRoZSBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgYXJjaGl2ZSB6aXBwZWQgZmlsZS4gVW5saWtlIHRoZSBQYXRoIHBhcmFtZXRlciwgdGhlIHZhbHVlIG9mIExpdGVyYWxQYXRoIGlzIHVzZWQgZXhhY3RseSBhcyBpdCBpcyB0eXBlZC4gTm8gY2hhcmFjdGVycyBhcmUgaW50ZXJwcmV0ZWQgYXMgd2lsZGNhcmRzLiBJZiB0aGUgcGF0aCBpbmNsdWRlcyBlc2NhcGUgY2hhcmFjdGVycywgZW5jbG9zZSBlYWNoIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcywgdG8gaW5zdHJ1Y3QgV2luZG93cyBQb3dlclNoZWxsIG5vdCB0byBpbnRlcnByZXQgYW55IGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcy4gVG8gc3BlY2lmeSBtdWx0aXBsZSBwYXRocywgYW5kIGluY2x1ZGUgZmlsZXMgaW4gbXVsdGlwbGUgbG9jYXRpb25zIGluIHlvdXIgb3V0cHV0IHppcHBlZCBmaWxlLCB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBwYXRocy4NCg0KCQkuUEFSQU1FVEVSIERlc3RpbmF0aW9uUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBhcmNoaXZlIG91dHB1dCBmaWxlLiBUaGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZC4gVGhlIHNwZWNpZmllZCBEZXN0aW5hdGlvblBhdGggdmFsdWUgc2hvdWxkIGluY2x1ZGUgdGhlIGRlc2lyZWQgbmFtZSBvZiB0aGUgb3V0cHV0IHppcHBlZCBmaWxlOyBpdCBzcGVjaWZpZXMgZWl0aGVyIHRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIHRoZSB6aXBwZWQgZmlsZS4gSWYgdGhlIGZpbGUgbmFtZSBzcGVjaWZpZWQgaW4gRGVzdGluYXRpb25QYXRoIGRvZXMgbm90IGhhdmUgYSAuemlwIGZpbGUgbmFtZSBleHRlbnNpb24sIHRoZSBjbWRsZXQgYWRkcyBhIC56aXAgZmlsZSBuYW1lIGV4dGVuc2lvbi4NCg0KCQkuUEFSQU1FVEVSIENvbXByZXNzaW9uTGV2ZWwNCgkJCVNwZWNpZmllcyBob3cgbXVjaCBjb21wcmVzc2lvbiB0byBhcHBseSB3aGVuIHlvdSBhcmUgY3JlYXRpbmcgdGhlIGFyY2hpdmUgZmlsZS4gRmFzdGVyIGNvbXByZXNzaW9uIHJlcXVpcmVzIGxlc3MgdGltZSB0byBjcmVhdGUgdGhlIGZpbGUsIGJ1dCBjYW4gcmVzdWx0IGluIGxhcmdlciBmaWxlIHNpemVzLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHRoaXMgcGFyYW1ldGVyIGFyZToNCg0KCQkJLSBGYXN0ZXN0LiBVc2UgdGhlIGZhc3Rlc3QgY29tcHJlc3Npb24gbWV0aG9kIGF2YWlsYWJsZSB0byBkZWNyZWFzZSBwcm9jZXNzaW5nIHRpbWU7IHRoaXMgY2FuIHJlc3VsdCBpbiBsYXJnZXIgZmlsZSBzaXplcy4NCgkJCS0gTm9Db21wcmVzc2lvbi4gRG8gbm90IGNvbXByZXNzIHRoZSBzb3VyY2UgZmlsZXMuDQoJCQktIE9wdGltYWwuIFByb2Nlc3NpbmcgdGltZSBpcyBkZXBlbmRlbnQgb24gZmlsZSBzaXplLg0KDQoJCQlJZiB0aGlzIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29tbWFuZCB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlLCBPcHRpbWFsLg0KDQoJCS5QQVJBTUVURVIgVXBkYXRlDQoJCQlVcGRhdGVzIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBieSByZXBsYWNpbmcgb2xkZXIgdmVyc2lvbnMgb2YgZmlsZXMgaW4gdGhlIGFyY2hpdmUgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBmaWxlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZXMuIFlvdSBjYW4gYWxzbyBhZGQgdGhpcyBwYXJhbWV0ZXIgdG8gYWRkIGZpbGVzIHRvIGFuIGV4aXN0aW5nIGFyY2hpdmUuDQoNCgkJLlBBUkFNRVRFUiBGb3JjZQ0KCQkJQHtUZXh0PX0NCg0KCQkuUEFSQU1FVEVSIENvbmZpcm0NCgkJCVByb21wdHMgeW91IGZvciBjb25maXJtYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIGNtZGxldC4NCg0KCQkuUEFSQU1FVEVSIFdoYXRJZg0KCQkJU2hvd3Mgd2hhdCB3b3VsZCBoYXBwZW4gaWYgdGhlIGNtZGxldCBydW5zLiBUaGUgY21kbGV0IGlzIG5vdCBydW4uDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMTogQ3JlYXRlIGFuIGFyY2hpdmUgZmlsZQ0KDQoJCQlQUyBDOlw+Q29tcHJlc3MtQXJjaGl2ZSAtTGl0ZXJhbFBhdGggQzpcUmVmZXJlbmNlXERyYWZ0ZG9jLmRvY3gsIEM6XFJlZmVyZW5jZVxJbWFnZXNcZGlhZ3JhbTIudnNkIC1Db21wcmVzc2lvbkxldmVsIE9wdGltYWwgLURlc3RpbmF0aW9uUGF0aCBDOlxBcmNoaXZlc1xEcmFmdC5aaXANCg0KCQkJVGhpcyBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmaWxlLCBEcmFmdC56aXAsIGJ5IGNvbXByZXNzaW5nIHR3byBmaWxlcywgRHJhZnRkb2MuZG9jeCBhbmQgZGlhZ3JhbTIudnNkLCBzcGVjaWZpZWQgYnkgdGhlIExpdGVyYWxQYXRoIHBhcmFtZXRlci4gVGhlIGNvbXByZXNzaW9uIGxldmVsIHNwZWNpZmllZCBmb3IgdGhpcyBvcGVyYXRpb24gaXMgT3B0aW1hbC4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSAyOiBDcmVhdGUgYW4gYXJjaGl2ZSB3aXRoIHdpbGRjYXJkIGNoYXJhY3RlcnMNCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLVBhdGggQzpcUmVmZXJlbmNlXCogLUNvbXByZXNzaW9uTGV2ZWwgRmFzdGVzdCAtRGVzdGluYXRpb25QYXRoIEM6XEFyY2hpdmVzXERyYWZ0DQoNCgkJCVRoaXMgY29tbWFuZCBjcmVhdGVzIGEgbmV3IGFyY2hpdmUgZmlsZSwgRHJhZnQuemlwLCBpbiB0aGUgQzpcQXJjaGl2ZXMgZm9sZGVyLiBOb3RlIHRoYXQgdGhvdWdoIHRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIC56aXAgd2FzIG5vdCBhZGRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIsIFdpbmRvd3MgUG93ZXJTaGVsbCBhcHBlbmRzIHRoaXMgdG8gdGhlIHNwZWNpZmllZCBhcmNoaXZlIGZpbGUgbmFtZSBhdXRvbWF0aWNhbGx5LiBUaGUgbmV3IGFyY2hpdmUgZmlsZSBjb250YWlucyBldmVyeSBmaWxlIGluIHRoZSBDOlxSZWZlcmVuY2UgZm9sZGVyLCBiZWNhdXNlIGEgd2lsZGNhcmQgY2hhcmFjdGVyIHdhcyB1c2VkIGluIHBsYWNlIG9mIHNwZWNpZmljIGZpbGUgbmFtZXMgaW4gdGhlIFBhdGggcGFyYW1ldGVyLiBUaGUgc3BlY2lmaWVkIGNvbXByZXNzaW9uIGxldmVsIGlzIEZhc3Rlc3QsIHdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBhIGxhcmdlciBvdXRwdXQgZmlsZSwgYnV0IGNvbXByZXNzZXMgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgZmFzdGVyLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDM6IFVwZGF0ZSBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUNCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLVBhdGggQzpcUmVmZXJlbmNlXCogLVVwZGF0ZSAtRGVzdGluYXRpb25QYXRoIEM6XEFyY2hpdmVzXERyYWZ0LlppcA0KDQoJCQlUaGlzIGNvbW1hbmQgdXBkYXRlcyBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUsIERyYWZ0LlppcCwgaW4gdGhlIEM6XEFyY2hpdmVzIGZvbGRlci4gVGhlIGNvbW1hbmQgaXMgcnVuIHRvIHVwZGF0ZSBEcmFmdC5aaXAgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBleGlzdGluZyBmaWxlcyB0aGF0IGNhbWUgZnJvbSB0aGUgQzpcUmVmZXJlbmNlIGZvbGRlciwgYW5kIGFsc28gdG8gYWRkIG5ldyBmaWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBDOlxSZWZlcmVuY2Ugc2luY2UgRHJhZnQuWmlwIHdhcyBpbml0aWFsbHkgY3JlYXRlZC4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSA0OiBDcmVhdGUgYW4gYXJjaGl2ZSBmcm9tIGFuIGVudGlyZSBmb2xkZXINCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLVBhdGggQzpcUmVmZXJlbmNlIC1EZXN0aW5hdGlvblBhdGggQzpcQXJjaGl2ZXNcRHJhZnQNCg0KCQkJVGhpcyBjb21tYW5kIGNyZWF0ZXMgYW4gYXJjaGl2ZSBmcm9tIGFuIGVudGlyZSBmb2xkZXIsIEM6XFJlZmVyZW5jZS4gTm90ZSB0aGF0IHRob3VnaCB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiAuemlwIHdhcyBub3QgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyLCBXaW5kb3dzIFBvd2VyU2hlbGwgYXBwZW5kcyB0aGlzIHRvIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBmaWxlIG5hbWUgYXV0b21hdGljYWxseS4NCgkjPg0KCVtDbWRsZXRCaW5kaW5nKERlZmF1bHRQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGgiLCBTdXBwb3J0c1Nob3VsZFByb2Nlc3MgPSAkdHJ1ZSwgSGVscFVyaSA9ICJodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJRD0zOTMyNTIiKV0NCglwYXJhbQ0KCSgNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBvc2l0aW9uID0gMCwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBvc2l0aW9uID0gMCwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBvc2l0aW9uID0gMCwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aFVwZGF0ZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtzdHJpbmdbXV0NCgkJJFBhdGgsDQoNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGgiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGhXaXRoRm9yY2UiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGhXaXRoVXBkYXRlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtBbGlhcygiUFNQYXRoIildDQoJCVtzdHJpbmdbXV0NCgkJJExpdGVyYWxQYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLA0KCQkJCQlQb3NpdGlvbiA9IDEsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW3N0cmluZ10NCgkJJERlc3RpbmF0aW9uUGF0aCwNCg0KCQlbcGFyYW1ldGVyICgNCgkJCQkJbWFuZGF0b3J5ID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtWYWxpZGF0ZVNldCgiT3B0aW1hbCIsICJOb0NvbXByZXNzaW9uIiwgIkZhc3Rlc3QiKV0NCgkJW3N0cmluZ10NCgkJJENvbXByZXNzaW9uTGV2ZWwgPSAiT3B0aW1hbCIsDQoNCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aFVwZGF0ZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aFdpdGhVcGRhdGUiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtzd2l0Y2hdDQoJCSRVcGRhdGUgPSAkZmFsc2UsDQoNCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbcGFyYW1ldGVyKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbc3dpdGNoXQ0KCQkkRm9yY2UgPSAkZmFsc2UNCgkpDQoNCglCRUdJTg0KCXsNCgkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24gLUVycm9yQWN0aW9uIElnbm9yZQ0KCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtIC1FcnJvckFjdGlvbiBJZ25vcmUNCg0KCQkkemlwRmlsZUV4dGVuc2lvbiA9ICIuemlwIg0KDQoJCSRMb2NhbGl6ZWREYXRhID0gQ29udmVydEZyb20tU3RyaW5nRGF0YSBAJw0KUGF0aE5vdEZvdW5kRXJyb3I9VGhlIHBhdGggJ3swfScgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHZhbGlkIGZpbGUgc3lzdGVtIHBhdGguDQpFeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgcGF0aCAnezB9JyBpcyBub3QgYSB2YWxpZCBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgcGF0aC4NCkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3I9ezB9IGlzIG5vdCBhIHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0LiB7MX0gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQuDQpBcmNoaXZlRmlsZUlzUmVhZE9ubHk9VGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGFyY2hpdmUgZmlsZSB7MH0gaXMgc2V0IHRvICdSZWFkT25seScgaGVuY2UgaXQgY2Fubm90IGJlIHVwZGF0ZWQuIElmIHlvdSBpbnRlbmQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUsIHJlbW92ZSB0aGUgJ1JlYWRPbmx5JyBhdHRyaWJ1dGUgb24gdGhlIGFyY2hpdmUgZmlsZSBlbHNlIHVzZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGFuZCBjcmVhdGUgYSBuZXcgYXJjaGl2ZSBmaWxlLg0KWmlwRmlsZUV4aXN0RXJyb3I9VGhlIGFyY2hpdmUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIFVzZSB0aGUgLVVwZGF0ZSBwYXJhbWV0ZXIgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUgb3IgdXNlIHRoZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLg0KRHVwbGljYXRlUGF0aEZvdW5kRXJyb3I9VGhlIGlucHV0IHRvIHswfSBwYXJhbWV0ZXIgY29udGFpbnMgYSBkdXBsaWNhdGUgcGF0aCAnezF9Jy4gUHJvdmlkZSBhIHVuaXF1ZSBzZXQgb2YgcGF0aHMgYXMgaW5wdXQgdG8gezJ9IHBhcmFtZXRlci4NCkFyY2hpdmVGaWxlSXNFbXB0eT1UaGUgYXJjaGl2ZSBmaWxlIHswfSBpcyBlbXB0eS4NCkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0PVRoZSBhcmNoaXZlIGZpbGUgJ3swfScgY3JlYXRpb24gaXMgaW4gcHJvZ3Jlc3MuLi4NCkV4cGFuZFByb2dyZXNzQmFyVGV4dD1UaGUgYXJjaGl2ZSBmaWxlICd7MH0nIGV4cGFuc2lvbiBpcyBpbiBwcm9ncmVzcy4uLg0KQXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlPVRoZSBhcmNoaXZlIGZpbGUgcGF0aCAnezB9JyBzdXBwbGllZCB0byB0aGUgRGVzdGluYXRpb25QYXRoIHBhdGFtZXRlciBkb2VzIG5vdCBpbmNsdWRlIC56aXAgZXh0ZW5zaW9uLiBIZW5jZSAuemlwIGlzIGFwcGVuZGVkIHRvIHRoZSBzdXBwbGllZCBEZXN0aW5hdGlvblBhdGggcGF0aCBhbmQgdGhlIGFyY2hpdmUgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIGF0ICd7MX0nLg0KQWRkSXRlbXRvQXJjaGl2ZUZpbGU9QWRkaW5nICd7MH0nLg0KQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoPUNyZWF0ZWQgJ3swfScuDQpJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3I9VGhlIGFyY2hpdmUgZmlsZSBwYXRoICd7MH0nIHNwZWNpZmllZCBhcyBpbnB1dCB0byB0aGUgezF9IHBhcmFtZXRlciBpcyByZXNvbHZpbmcgdG8gbXVsdGlwbGUgZmlsZSBzeXN0ZW0gcGF0aHMuIFByb3ZpZGUgYSB1bmlxdWUgcGF0aCB0byB0aGUgezJ9IHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGhhcyB0byBiZSBjcmVhdGVkLg0KSW52YWxpZEV4cGFuZGVkRGlyUGF0aEVycm9yPVRoZSBkaXJlY3RvcnkgcGF0aCAnezB9JyBzcGVjaWZpZWQgYXMgaW5wdXQgdG8gdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIgaXMgcmVzb2x2aW5nIHRvIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzLiBQcm92aWRlIGEgdW5pcXVlIHBhdGggdG8gdGhlIERlc3RpbmF0aW9uIHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzIGhhdmUgdG8gYmUgZXhwYW5kZWQuDQpGaWxlRXhpc3RzRXJyb3I9RmFpbGVkIHRvIGNyZWF0ZSBmaWxlICd7MH0nIHdoaWxlIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlICd7MX0nIGNvbnRlbnRzIGFzIHRoZSBmaWxlICd7Mn0nIGFscmVhZHkgZXhpc3RzLiBVc2UgdGhlIC1Gb3JjZSBwYXJhbWV0ZXIgaWYgeW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgJ3szfScgY29udGVudHMgd2hlbiBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZS4NCkRlbGV0ZUFyY2hpdmVGaWxlPVRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBhcmNoaXZlIGZpbGUgJ3swfScgaXMgZGVsZXRlZCBhcyBpdCBpcyBub3QgdXNhYmxlLg0KSW52YWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgZGVzdGluYXRpb24gcGF0aCAnezB9JyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgYXJjaGl2ZSBmaWxlIG5hbWUuDQpQcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2U9UHJlcGFyaW5nIHRvIGNvbXByZXNzLi4uDQpQcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlPVByZXBhcmluZyB0byBleHBhbmQuLi4NCidADQoNCgkJI3JlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KCQlmdW5jdGlvbiBHZXRSZXNvbHZlZFBhdGhIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNMaXRlcmFsUGF0aCwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlBTQ21kbGV0XQ0KCQkJCSRjYWxsZXJQU0NtZGxldA0KCQkJKQ0KDQoJCQkkcmVzb2x2ZWRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJdHJ5DQoJCQkJew0KCQkJCQlpZiAoJGlzTGl0ZXJhbFBhdGgpDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50UmVzb2x2ZWRQYXRocyA9IFJlc29sdmUtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudFJlc29sdmVkUGF0aHMgPSBSZXNvbHZlLVBhdGggLVBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQl9DQoJCQkJY2F0Y2gNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGN1cnJlbnRQYXRoKQ0KCQkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkXy5FeGNlcHRpb24NCgkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkFyY2hpdmVDbWRsZXRQYXRoTm90Rm91bmQiICRudWxsIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXhjZXB0aW9uICRjdXJyZW50UGF0aA0KCQkJCQkkY2FsbGVyUFNDbWRsZXQuVGhyb3dUZXJtaW5hdGluZ0Vycm9yKCRlcnJvclJlY29yZCkNCgkJCQl9DQoNCgkJCQlmb3JlYWNoICgkY3VycmVudFJlc29sdmVkUGF0aCBpbiAkY3VycmVudFJlc29sdmVkUGF0aHMpDQoJCQkJew0KCQkJCQkkcmVzb2x2ZWRQYXRocyArPSAkY3VycmVudFJlc29sdmVkUGF0aC5Qcm92aWRlclBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCSRyZXNvbHZlZFBhdGhzDQoJCX0NCg0KCQlmdW5jdGlvbiBBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoJCXsNCg0KCQkJaWYgKCRQU0VkaXRpb24gLWVxICJEZXNrdG9wIikNCgkJCXsNCgkJCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbg0KCQkJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIElzVmFsaWRGaWxlU3lzdGVtUGF0aA0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkcmVzdWx0ID0gJHRydWU7DQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQlpZiAoIShbU3lzdGVtLklPLkZpbGVdOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSAtb3IgW1N5c3RlbS5JTy5EaXJlY3RvcnldOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSkpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRjdXJyZW50UGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJQYXRoTm90Rm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIFZhbGlkYXRlRHVwbGljYXRlRmlsZVN5c3RlbVBhdGgNCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRpbnB1dFBhcmFtZXRlciwNCg0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkdW5pcXVlSW5wdXRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJJGN1cnJlbnRJbnB1dFBhdGggPSAkY3VycmVudFBhdGguVG9VcHBlcigpDQoJCQkJaWYgKCR1bmlxdWVJbnB1dFBhdGhzLkNvbnRhaW5zKCRjdXJyZW50SW5wdXRQYXRoKSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRHVwbGljYXRlUGF0aEZvdW5kRXJyb3IgLWYgJGlucHV0UGFyYW1ldGVyLCAkY3VycmVudFBhdGgsICRpbnB1dFBhcmFtZXRlcikNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJEdXBsaWNhdGVQYXRoRm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkdW5pcXVlSW5wdXRQYXRocyArPSAkY3VycmVudElucHV0UGF0aA0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzaW9uTGV2ZWxNYXBwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsDQoJCQkpDQoNCgkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6T3B0aW1hbA0KDQoJCQkjIENvbXByZXNzaW9uTGV2ZWwgZm9ybWF0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlzd2l0Y2ggKCRjb21wcmVzc2lvbkxldmVsLlRvU3RyaW5nKCkpDQoJCQl7DQoJCQkJIkZhc3Rlc3QiDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06OkZhc3Rlc3QNCgkJCQl9DQoJCQkJIk5vQ29tcHJlc3Npb24iDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06Ok5vQ29tcHJlc3Npb24NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAkY29tcHJlc3Npb25MZXZlbEZvcm1hdA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRzb3VyY2VGaWxlUGF0aHMgPSBAKCkNCgkJCSRzb3VyY2VEaXJQYXRocyA9IEAoKQ0KDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHNvdXJjZVBhdGgpDQoJCQl7DQoJCQkJJHJlc3VsdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1QYXRoVHlwZSBMZWFmDQoJCQkJaWYgKCRyZXN1bHQgLWVxICR0cnVlKQ0KCQkJCXsNCgkJCQkJJHNvdXJjZUZpbGVQYXRocyArPSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHNvdXJjZURpclBhdGhzICs9ICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmUgb3IgbW9yZSBkaXJlY3RvcnkgKHRoaXMgZGlyZWN0b3J5IGNhbiBoYXZlIGZpbGVzIHVuZGVyIGl0KSBhbmQgbm8gZmlsZXMgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1lcSAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1ndCAwKQ0KCQkJew0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMC9bZG91YmxlXSRzb3VyY2VEaXJQYXRocy5Db3VudA0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoJCQl9DQoNCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25seSBmaWxlcyB0byBiZSBjb21wcmVzc2VkLg0KCQkJZWxzZUlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1ndCAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1lcSAwKQ0KCQkJew0KCQkJCSMgJHByZXZpb3VzU2VnbWVudFdlaWdodCBpcyBlcXVhbCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBzZXQgdG8gMTAwIGFzIGFsbCBmaWxlcyBoYXZlIGVxdWFsIHdlaWdodGFnZS4NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMA0KDQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IENvbXByZXNzRmlsZXNIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCX0NCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25lIG9yIG1vcmUgZmlsZXMgYW5kIG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzICh0aGlzIGRpcmVjdG9yeSBjYW4gaGF2ZSBmaWxlcyB1bmRlciBpdCkgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWVsc2VpZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZ3QgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZ3QgMCkNCgkJCXsNCgkJCQkjIGVhY2ggZGlyZWN0b3J5IGlzIGNvbnNpZGVyZWQgYXMgYW4gaW5kaXZpZHVhbCBzZWdtZW50cyAmIGFsbCB0aGUgaW5kaXZpZHVhbCBmaWxlcyBhcmUgY2x1YmVkIGluIHRvIGEgc2VwYXJhdGUgc2dlbW5ldC4NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDAvW2RvdWJsZV0oJHNvdXJjZURpclBhdGhzLkNvdW50ICsgMSkNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoNCgkJCQkkY291bnQgPSBDb21wcmVzc0ZpbGVzSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCX0NCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzRmlsZXNIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZUZpbGVQYXRocywNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IFppcEFyY2hpdmVIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJG51bGwgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzU2luZ2xlRGlySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkc291cmNlRGlyUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkdXNlUGFyZW50RGlyQXNSb290LA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W1N5c3RlbS5TdHJpbmddXSRzdWJEaXJGaWxlcyA9IEAoKQ0KDQoJCQlpZiAoJHVzZVBhcmVudERpckFzUm9vdCkNCgkJCXsNCgkJCQkkc291cmNlRGlySW5mbyA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvIC1Bcmd1bWVudExpc3QgJHNvdXJjZURpclBhdGgNCgkJCQkkc291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlySW5mby5QYXJlbnQuRnVsbE5hbWUNCg0KCQkJCSMgSWYgdGhlIGRpcmVjdG9yeSBpcyBwcmVzZW50IGF0IHRoZSBkcml2ZSBsZXZlbCB0aGUgRGlyZWN0b3J5SW5mby5QYXJlbnQgaW5jbHVkZSAnXCcgZXhhbXBsZTogQzpcDQoJCQkJIyBPbiB0aGUgb3RoZXIgaGFuZCBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBhdCBhIGRlcGVyIGxldmVsIHRoZW4gRGlyZWN0b3J5SW5mby5QYXJlbnQNCgkJCQkjIGhhcyBqdXN0IHRoZSBwYXRoICh3aXRob3V0IGFuIGVuZGluZyAnXCcpLiBleGFtcGxlIEM6XHNvdXJjZQ0KCQkJCWlmICgkc291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1lcSAzKQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUgKyAiXCINCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpclBhdGgNCgkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZSArICJcIg0KCQkJfQ0KDQoJCQkkZGlyQ29udGVudHMgPSBHZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAkc291cmNlRGlyUGF0aCAtUmVjdXJzZQ0KCQkJZm9yZWFjaCAoJGN1cnJlbnRDb250ZW50IGluICRkaXJDb250ZW50cykNCgkJCXsNCgkJCQkkaXNDb250YWluZXIgPSAkY3VycmVudENvbnRlbnQgLWlzIFtTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mb10NCgkJCQlpZiAoISRpc0NvbnRhaW5lcikNCgkJCQl7DQoJCQkJCSRzdWJEaXJGaWxlcy5BZGQoJGN1cnJlbnRDb250ZW50LkZ1bGxOYW1lKQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkjIFRoZSBjdXJyZW50Q29udGVudCBwb2ludHMgdG8gYSBkaXJlY3RvcnkuDQoJCQkJCSMgV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGFuIGVtcHR5IGRpcmVjdG9yeSwgaWYgc28gc3VjaCBhDQoJCQkJCSMgZGlyZWN0b3J5IGhhcyB0byBiZSBleHBsaWN0bHkgYWRkZWQgdG8gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJIyBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGUgR2V0RmlsZXMoKSBBUEkgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4NCgkJCQkJJGZpbGVzID0gJGN1cnJlbnRDb250ZW50LkdldEZpbGVzKCkNCgkJCQkJaWYgKCRmaWxlcy5Db3VudCAtZXEgMCkNCgkJCQkJew0KCQkJCQkJJHN1YkRpckZpbGVzLkFkZCgkY3VycmVudENvbnRlbnQuRnVsbE5hbWUgKyAiXCIpDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBaaXBBcmNoaXZlSGVscGVyICRzdWJEaXJGaWxlcy5Ub0FycmF5KCkgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBaaXBBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbU3lzdGVtLlN0cmluZ11dDQoJCQkJJHNvdXJjZVBhdGhzLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRmaWxlTW9kZSA9IFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpDcmVhdGUNCgkJCSRyZXN1bHQgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIExlYWYNCgkJCWlmICgkcmVzdWx0IC1lcSAkdHJ1ZSkNCgkJCXsNCgkJCQkkZmlsZU1vZGUgPSBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3Blbg0KCQkJfQ0KDQoJCQlBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhcmNoaXZlIGZpbGUgaGFzIHdyaXRlIGFjY2Vzcy4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkZGVzdGluYXRpb25QYXRoLCAkZmlsZU1vZGUpDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVTdHJlYW0gLUFyZ3VtZW50TGlzdCAkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzDQoNCgkJCQkkemlwQXJjaGl2ZUFyZ3MgPSBAKCRhcmNoaXZlRmlsZVN0cmVhbSwgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlTW9kZV06OlVwZGF0ZSwgJGZhbHNlKQ0KCQkJCSR6aXBBcmNoaXZlID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgLUFyZ3VtZW50TGlzdCAkemlwQXJjaGl2ZUFyZ3MNCg0KCQkJCSRjdXJyZW50RW50cnlDb3VudCA9IDANCgkJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuQ29tcHJlc3NQcm9ncmVzc0JhclRleHQgLWYgJGRlc3RpbmF0aW9uUGF0aCkNCgkJCQkkYnVmZmVyU2l6ZSA9IDRrYg0KCQkJCSRidWZmZXIgPSBOZXctT2JqZWN0IEJ5dGVbXSAkYnVmZmVyU2l6ZQ0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRGaWxlUGF0aCBpbiAkc291cmNlUGF0aHMpDQoJCQkJew0KCQkJCQlpZiAoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgLW5lICRudWxsIC1hbmQgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkaW5kZXggPSAkY3VycmVudEZpbGVQYXRoLkluZGV4T2YoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKQ0KCQkJCQkJJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZyA9ICRjdXJyZW50RmlsZVBhdGguU3Vic3RyaW5nKCRpbmRleCwgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoKQ0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSAkY3VycmVudEZpbGVQYXRoLlJlcGxhY2UoJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZywgIiIpLlRyaW0oKQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSBbU3lzdGVtLklPLlBhdGhdOjpHZXRGaWxlTmFtZSgkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQl9DQoNCgkJCQkJIyBVcGRhdGUgbW9kZSBpcyBzZWxlY3RlZC4NCgkJCQkJIyBDaGVjayB0byBzZWUgaWYgYXJjaGl2ZSBmaWxlIGFscmVhZHkgY29udGFpbnMgb25lIG9yIG1vcmUgemlwIGZpbGVzIGluIGl0Lg0KCQkJCQlpZiAoJGlzVXBkYXRlTW9kZSAtZXEgJHRydWUgLWFuZCAkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50IC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkZW50cnlUb0JlVXBkYXRlZCA9ICRudWxsDQoNCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJCSMgSWYgc28gcmVwbGFjZSBpdCB3aXRoIG5ldyBmaWxlIGZyb20gdGhlIGlucHV0IHNvdXJjZS4NCgkJCQkJCSMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUgZmlsZSB0aGVuIGRlZmF1bHQgdG8NCgkJCQkJCSMgY3JlYXRlIG1vZGUgYW5kIGNyZWF0ZSB0aGUgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCg0KCQkJCQkJZm9yZWFjaCAoJGN1cnJlbnRBcmNoaXZlRW50cnkgaW4gJHppcEFyY2hpdmUuRW50cmllcykNCgkJCQkJCXsNCgkJCQkJCQlpZiAoJGN1cnJlbnRBcmNoaXZlRW50cnkuRnVsbE5hbWUgLWVxICRyZWxhdGl2ZUZpbGVQYXRoKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQgPSAkY3VycmVudEFyY2hpdmVFbnRyeQ0KCQkJCQkJCQlicmVhaw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKCRlbnRyeVRvQmVVcGRhdGVkIC1uZSAkbnVsbCkNCgkJCQkJCXsNCgkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQuRGVsZXRlKCkNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCSRjb21wcmVzc2lvbiA9IENvbXByZXNzaW9uTGV2ZWxNYXBwZXIgJGNvbXByZXNzaW9uTGV2ZWwNCg0KCQkJCQkjIElmIGEgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGFkZGVkIHRvIGFuIGFyY2hpdmUgZmlsZSwNCgkJCQkJIyBieSBjb252ZW50aW9uIHRoZSAuTmV0IEFQSSdzIGV4cGVjdCB0aGUgcGF0aCBvZiB0aGUgZGlyZXRjb3J5DQoJCQkJCSMgdG8gZW5kIHdpdGggJ1wnIHRvIGRldGVjdCB0aGUgcGF0aCBhcyBhbiBkaXJlY3RvcnkuDQoJCQkJCWlmICghJHJlbGF0aXZlRmlsZVBhdGguRW5kc1dpdGgoIlwiLCBbU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkNCgkJCQkJew0KCQkJCQkJdHJ5DQoJCQkJCQl7DQoJCQkJCQkJdHJ5DQoJCQkJCQkJew0KCQkJCQkJCQkkY3VycmVudEZpbGVTdHJlYW0gPSBbU3lzdGVtLklPLkZpbGVdOjpPcGVuKCRjdXJyZW50RmlsZVBhdGgsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCQkJCX0NCgkJCQkJCQljYXRjaA0KCQkJCQkJCXsNCgkJCQkJCQkJIyBGYWlsZWQgdG8gYWNjZXNzIHRoZSBmaWxlLiBXcml0ZSBhIG5vbiB0ZXJtaW5hdGluZyBlcnJvciB0byB0aGUgcGlwZWxpbmUNCgkJCQkJCQkJIyBhbmQgbW92ZSBvbiB3aXRoIHRoZSByZW1haW5pbmcgZmlsZXMuDQoJCQkJCQkJCSRleGNlcHRpb24gPSAkXy5FeGNlcHRpb24NCgkJCQkJCQkJaWYgKCRudWxsIC1uZSAkXy5FeGNlcHRpb24gLWFuZA0KCQkJCQkJCQkJJG51bGwgLW5lICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbikNCgkJCQkJCQkJew0KCQkJCQkJCQkJJGV4Y2VwdGlvbiA9ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbg0KCQkJCQkJCQl9DQoJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJDb21wcmVzc0FyY2hpdmVVbmF1dGhvcml6ZWRBY2Nlc3NFcnJvciIgJG51bGwgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpQZXJtaXNzaW9uRGVuaWVkKSAkZXhjZXB0aW9uICRjdXJyZW50RmlsZVBhdGgNCgkJCQkJCQkJV3JpdGUtRXJyb3IgLUVycm9yUmVjb3JkICRlcnJvclJlY29yZA0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkJpbmFyeVJlYWRlciAkY3VycmVudEZpbGVTdHJlYW0NCg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeSA9ICR6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KCRyZWxhdGl2ZUZpbGVQYXRoLCAkY29tcHJlc3Npb24pDQoNCgkJCQkJCQkJIyBVcGRhdGluZyAgdGhlIEZpbGUgQ3JlYXRpb24gdGltZSBzbyB0aGF0IHRoZSBzYW1lIHRpbWVzdGFtcCB3b3VsZCBiZSByZXRhaW5lZCBhZnRlciBleHBhbmRpbmcgdGhlIGNvbXByZXNzZWQgZmlsZS4NCgkJCQkJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgR2V0LUNoaWxkSXRlbSB3b3VsZCBzdWNjZWVkLg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeS5MYXN0V3JpdGVUaW1lID0gKEdldC1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEZpbGVQYXRoKS5MYXN0V3JpdGVUaW1lDQoNCgkJCQkJCQkJJGRlc3RTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlXcml0ZXIgJGN1cnJlbnRBcmNoaXZlRW50cnkuT3BlbigpDQoNCgkJCQkJCQkJd2hpbGUgKCRudW1iZXJPZkJ5dGVzUmVhZCA9ICRzcmNTdHJlYW0uUmVhZCgkYnVmZmVyLCAwLCAkYnVmZmVyU2l6ZSkpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLldyaXRlKCRidWZmZXIsIDAsICRudW1iZXJPZkJ5dGVzUmVhZCkNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLkZsdXNoKCkNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gMQ0KCQkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZmluYWxseQ0KCQkJCQkJew0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGN1cnJlbnRGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRzcmNTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkgPSAkemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgiJHJlbGF0aXZlRmlsZVBhdGgiLCAkY29tcHJlc3Npb24pDQoJCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9IDENCgkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJfQ0KDQoJCQkJCWlmICgkbnVsbCAtbmUgJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSkNCgkJCQkJew0KCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlDQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQlQcm9ncmVzc0JhckhlbHBlciAiQ29tcHJlc3MtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICRzb3VyY2VQYXRocy5Db3VudCAgJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkJfQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCUlmICgkbnVsbCAtbmUgJHppcEFyY2hpdmUpDQoJCQkJew0KCQkJCQkkemlwQXJjaGl2ZS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQlJZiAoJG51bGwgLW5lICRhcmNoaXZlRmlsZVN0cmVhbSkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQkjIENvbXBsZXRlIHdyaXRpbmcgcHJvZ3Jlc3MuDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICJDb21wcmVzcy1BcmNoaXZlIiAtQ29tcGxldGVkDQoJCQl9DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXJjaGl2ZSBmaWxlDQojIHBhdGggJiBpdHMgZmlsZSBmb3JtYXQuIFRoZSBvbmx5IHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0IGlzIC56aXANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkYXJjaGl2ZUZpbGUNCgkJCSkNCg0KCQkJaWYgKFtTeXN0ZW0uSU8uRmlsZV06OkV4aXN0cygkYXJjaGl2ZUZpbGUpKQ0KCQkJew0KCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGFyY2hpdmVGaWxlKQ0KDQoJCQkJIyBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGlzIHNwZWNpZmVkIGZvciB0aGUgemlwIGZpbGUuDQoJCQkJaWYgKCRleHRlbnNpb24gLW5lICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yIC1mICRleHRlbnNpb24sICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIk5vdFN1cHBvcnRlZEFyY2hpdmVGaWxlRXh0ZW5zaW9uIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXh0ZW5zaW9uDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGFyY2hpdmVGaWxlKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiUGF0aE5vdEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkYXJjaGl2ZUZpbGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRXhwYW5kQXJjaGl2ZUhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGV4cGFuZCB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzDQojIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIEV4cGFuZEFyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRhcmNoaXZlRmlsZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGV4cGFuZGVkRGlyLA0KDQoJCQkJW3JlZl0NCgkJCQkkZXhwYW5kZWRJdGVtcywNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRmb3JjZSwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc1ZlcmJvc2UsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNDb25maXJtDQoJCQkpDQoNCgkJCUFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBUaGUgZXhpc3RhbmNlIG9mIGFyY2hpdmUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCQkJIyBiZWZvcmUgY2FsbGluZyB0aGlzIGhlbHBlciBmdW5jdGlvbi4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkYXJjaGl2ZUZpbGUsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlU3RyZWFtIC1Bcmd1bWVudExpc3QgJGFyY2hpdmVGaWxlU3RyZWFtQXJncw0KDQoJCQkJJHppcEFyY2hpdmVBcmdzID0gQCgkYXJjaGl2ZUZpbGVTdHJlYW0sIFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZU1vZGVdOjpSZWFkLCAkZmFsc2UpDQoJCQkJJHppcEFyY2hpdmUgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSAtQXJndW1lbnRMaXN0ICR6aXBBcmNoaXZlQXJncw0KDQoJCQkJaWYgKCR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgLWVxIDApDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVJc0VtcHR5ID0gKCRMb2NhbGl6ZWREYXRhLkFyY2hpdmVGaWxlSXNFbXB0eSAtZiAkYXJjaGl2ZUZpbGUpDQoJCQkJCVdyaXRlLVZlcmJvc2UgJGFyY2hpdmVGaWxlSXNFbXB0eQ0KCQkJCQlyZXR1cm4NCgkJCQl9DQoNCgkJCQkkY3VycmVudEVudHJ5Q291bnQgPSAwDQoJCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZFByb2dyZXNzQmFyVGV4dCAtZiAkYXJjaGl2ZUZpbGUpDQoNCgkJCQkjIFRoZSBhcmNoaXZlIGVudHJpZXMgY2FuIGVpdGhlciBiZSBlbXB0eSBkaXJlY3RvcmllcyBvciBmaWxlcy4NCgkJCQlmb3JlYWNoICgkY3VycmVudEFyY2hpdmVFbnRyeSBpbiAkemlwQXJjaGl2ZS5FbnRyaWVzKQ0KCQkJCXsNCgkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoID0gSm9pbi1QYXRoIC1QYXRoICRleHBhbmRlZERpciAtQ2hpbGRQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5LkZ1bGxOYW1lDQoJCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KDQoJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBpcyBhbiBlbXB0eSBkaXJlY3RvcnkNCgkJCQkJIyBUaGUgRnVsbE5hbWUgb2YgdGhlIEFyY2hpdmUgRW50cnkgcmVwcmVzZW50aW5nIGEgZGlyZWN0b3J5IHdvdWxkIGVuZCB3aXRoIGEgdHJhaWxpbmcgJ1wnLg0KCQkJCQlpZiAoJGV4dGVuc2lvbiAtZXEgW3N0cmluZ106OkVtcHR5IC1hbmQNCgkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aC5FbmRzV2l0aCgiXCIsIFtTdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKQ0KCQkJCQl7DQoJCQkJCQkkcGF0aEV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBleHBlY3RzIGFuIGVtcHR5IGRpcmVjdG9yeS4NCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSBpcyBlbXB0eS4gSWYgaXRzIG5vdCBlbXB0eQ0KCQkJCQkJIyB0aGVuIGl0IG1lYW5zIHRoYXQgdXNlciBoYXMgYWRkZWQgdGhpcyBkaXJlY3RvcnkgYnkgb3RoZXIgbWVhbnMuDQoJCQkJCQlpZiAoJHBhdGhFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCXsNCgkJCQkJCQlOZXctSXRlbSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIHwgT3V0LU51bGwNCg0KCQkJCQkJCWlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGFkZEVtcHR5RGlyZWN0b3J5dG9FeHBhbmRlZFBhdGhNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRW1wdHlEaXJlY3Rvcnl0b0V4cGFuZGVkUGF0aE1lc3NhZ2UNCg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQl0cnkNCgkJCQkJCXsNCgkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVJbmZvIC1Bcmd1bWVudExpc3QgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoJCQkJCQkJJHBhcmVudERpckV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXINCg0KCQkJCQkJCSMgSWYgdGhlIFBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGUgaXQuDQoJCQkJCQkJaWYgKCRwYXJlbnREaXJFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCQl7DQoJCQkJCQkJCU5ldy1JdGVtICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gfCBPdXQtTnVsbA0KDQoJCQkJCQkJCWlmICghKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXIpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkjIFRoZSBkaXJlY3RvcnkgcmVmZXJyZWQgYnkgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuDQoJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCSMgYW5kIGF1dGhvcml6YXRpb24gd2FzIG5vdCBwcm92aWRlZCB3aGVuIGNvbmZpcm1hdGlvbiB3YXMgcHJvbXB0ZWQuIEluIHN1Y2ggYSBzY2VuYXJpbywNCgkJCQkJCQkJCSMgd2Ugc2tpcCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBhcmNoaXZlIGFuZCBjb250aW51ZSB3aXRoIHRoZSByZW1haW5pbmcgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzLg0KCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZQ0KCQkJCQkJCX0NCg0KCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJGZhbHNlDQoNCgkJCQkJCQkjIENoZWNrIGlmIHRoZSBmaWxlIGluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgY29udGVudHMNCgkJCQkJCQkjIHdvdWxkIGJlIGV4cGFuZGVkIGFscmVhZHkgZXhpc3RzLg0KCQkJCQkJCWlmICgkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkV4aXN0cykNCgkJCQkJCQl7DQoJCQkJCQkJCWlmICgkZm9yY2UpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCVJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIC1Gb3JjZSAtRXJyb3JWYXJpYWJsZSBldiAtVmVyYm9zZTokaXNWZXJib3NlIC1Db25maXJtOiRpc0NvbmZpcm0NCgkJCQkJCQkJCWlmICgkZXYgLW5lICRudWxsKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSAtUGF0aFR5cGUgTGVhZikNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkjIFRoZSBmaWxlIHJlZmVycmVkIGJ5ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4NCgkJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCQkjIGFuZCBhdXRob3JpemF0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBjb25maXJtYXRpb24gd2FzIHByb21wdGVkLiBJbiBzdWNoIGEgc2NlbmFyaW8sDQoJCQkJCQkJCQkJIyB3ZSBza2lwIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGFyY2hpdmUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlbWFpbmluZyBhcmNoaXZlIGZpbGUgY29udGVudHMuDQoJCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSMgV3JpdGUgbm9uLXRlcm1pbmF0aW5nIGVycm9yIHRvIHRoZSBwaXBlbGluZS4NCgkJCQkJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRmlsZUV4aXN0c0Vycm9yIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUsICRhcmNoaXZlRmlsZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSkNCgkJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJFeHBhbmRBcmNoaXZlRmlsZUV4aXN0cyIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRPcGVyYXRpb24pICRudWxsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUNCgkJCQkJCQkJCVdyaXRlLUVycm9yIC1FcnJvclJlY29yZCAkZXJyb3JSZWNvcmQNCgkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICghJGhhc05vblRlcm1pbmF0aW5nRXJyb3IpDQoJCQkJCQkJew0KCQkJCQkJCQlbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVFeHRlbnNpb25zXTo6RXh0cmFjdFRvRmlsZSgkY3VycmVudEFyY2hpdmVFbnRyeSwgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoLCAkZmFsc2UpDQoNCgkJCQkJCQkJIyBBZGQgdGhlIGV4cGFuZGVkIGZpbGUgcGF0aCB0byB0aGUgJGV4cGFuZGVkSXRlbXMgYXJyYXksDQoJCQkJCQkJCSMgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIGV4cGFuZGVkIGZpbGVzIGNyZWF0ZWQgd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCQkJCSMgSWYgdXNlciBlbnRlcnMgQ1RSTCArIEMgdGhlbiBhdCB0aGF0IHBvaW50IG9mIHRpbWUsIGFsbCB0aGVzZSBleHBhbmRlZCBmaWxlcw0KCQkJCQkJCQkjIHdvdWxkIGJlIGRlbGV0ZWQgYXMgcGFydCBvZiB0aGUgY2xlYW4gdXAgcHJvY2Vzcy4NCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCQkJJGFkZEZpbGV0b0V4cGFuZGVkUGF0aE1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRmlsZXRvRXhwYW5kZWRQYXRoTWVzc2FnZQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWZpbmFsbHkNCgkJCQkJCXsNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KDQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkc3JjU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBTZXQgdG8gMTAwIGdpdmluZyBlcXVhbCB3ZWlnaHRhZ2UgdG8gZWFjaCBmaWxlIHRoYXQgaXMgZ2V0dGluZyBleHBhbmRlZC4NCgkJCQkJIyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0IGlzIHNldCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwDQoJCQkJCVByb2dyZXNzQmFySGVscGVyICJFeHBhbmQtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgICRjdXJyZW50RW50cnlDb3VudA0KCQkJCX0NCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQlJZiAoJG51bGwgLW5lICR6aXBBcmNoaXZlKQ0KCQkJCXsNCgkJCQkJJHppcEFyY2hpdmUuRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJSWYgKCRudWxsIC1uZSAkYXJjaGl2ZUZpbGVTdHJlYW0pDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJIyBDb21wbGV0ZSB3cml0aW5nIHByb2dyZXNzLg0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAiRXhwYW5kLUFyY2hpdmUiIC1Db21wbGV0ZWQNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgUHJvZ3Jlc3NCYXJIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG1lc3NhZ2UuDQojIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIENvbXByZXNzLUFyY2hpdmUgJiBFeHBhbmQtQXJjaGl2ZSB0byBkaXNwbGF5IGFyY2hpdmUgZmlsZQ0KIyBjcmVhdGlvbi9leHBhbnNpb24gcHJvZ3Jlc3MuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gUHJvZ3Jlc3NCYXJIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjbWRsZXROYW1lLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkc3RhdHVzLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQsDQoNCgkJCQlbaW50XQ0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcywNCg0KCQkJCVtpbnRdDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkpDQoNCgkJCWlmICgkY3VycmVudEVudHJ5Q291bnQgLWd0IDAgLWFuZA0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcyAtZ3QgMCAtYW5kDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCAtZ2UgMCAtYW5kDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0IC1ndCAwKQ0KCQkJew0KCQkJCSRlbnRyeURlZmF1bHRXZWlnaHQgPSAkY3VycmVudFNlZ21lbnRXZWlnaHQvW2RvdWJsZV0kdG90YWxOdW1iZXJvZkVudHJpZXMNCg0KCQkJCSRwZXJjZW50Q29tcGxldGUgPSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICsgKCRlbnRyeURlZmF1bHRXZWlnaHQgKiAkY3VycmVudEVudHJ5Q291bnQpDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICRjbWRsZXROYW1lIC1TdGF0dXMgJHN0YXR1cyAtUGVyY2VudENvbXBsZXRlICRwZXJjZW50Q29tcGxldGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ1NWSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvbW1hIGFmdGVyIGVhY2ggcGF0aCBzcGVjaWZpZCBieQ0KIyB0aGUgU291cmNlUGF0aCBhcnJheS4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNwbGF5IGFsbCB0aGUgdXNlciBzdXBwbGllZCBwYXRocw0KIyBpbiB0aGUgV2hhdElmIG1lc3NhZ2UuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gQ1NWSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoDQoJCQkpDQoNCgkJCSMgU291cmNlUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSB0aGUgY2FsbGluZyBmdW5jYXRpb24uDQoJCQlpZiAoJHNvdXJjZVBhdGguQ291bnQgLWd0IDEpDQoJCQl7DQoJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9ICJgbiINCgkJCQlmb3IgKCRjdXJyZW50SW5kZXggPSAwOyAkY3VycmVudEluZGV4IC1sdCAkc291cmNlUGF0aC5Db3VudDsgJGN1cnJlbnRJbmRleCsrKQ0KCQkJCXsNCgkJCQkJaWYgKCRjdXJyZW50SW5kZXggLWVxICRzb3VyY2VQYXRoLkNvdW50IC0gMSkNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XSArICJgbiINCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gJHNvdXJjZVBhdGgNCgkJCX0NCg0KCQkJcmV0dXJuICRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gdGhyb3cgdGVybWluYXRpbmcgZXJyb3IuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QsDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRpbm5lckV4Y2VwdGlvbg0KCQkJKQ0KDQoJCQlpZiAoJGlubmVyRXhjZXB0aW9uIC1lcSAkbnVsbCkNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LW9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkaW5uZXJFeGNlcHRpb24NCgkJCX0NCg0KCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCSRQU0NtZGxldC5UaHJvd1Rlcm1pbmF0aW5nRXJyb3IoJGVycm9yUmVjb3JkKQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDcmVhdGVFcnJvclJlY29yZEhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhbiBFcnJvclJlY29yZA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIENyZWF0ZUVycm9yUmVjb3JkSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRleGNlcHRpb24sDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QNCgkJCSkNCg0KCQkJaWYgKCRudWxsIC1lcSAkZXhjZXB0aW9uKQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQl9DQoNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCXJldHVybiAkZXJyb3JSZWNvcmQNCgkJfQ0KCQkjZW5kcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoNCgkJJGlucHV0UGF0aHMgPSBAKCkNCgkJJGRlc3RpbmF0aW9uUGFyZW50RGlyID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RGlyZWN0b3J5TmFtZSgkRGVzdGluYXRpb25QYXRoKQ0KCQlpZiAoJG51bGwgLWVxICRkZXN0aW5hdGlvblBhcmVudERpcikNCgkJew0KCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkRGVzdGluYXRpb25QYXRoIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWRBcmNoaXZlRmlsZVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJfQ0KDQoJCWlmICgkZGVzdGluYXRpb25QYXJlbnREaXIgLWVxIFtzdHJpbmddOjpFbXB0eSkNCgkJew0KCQkJJGRlc3RpbmF0aW9uUGFyZW50RGlyID0gJy4nDQoJCX0NCg0KCQkkYWNoaXZlRmlsZU5hbWUgPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRGaWxlTmFtZSgkRGVzdGluYXRpb25QYXRoKQ0KCQkkZGVzdGluYXRpb25QYXJlbnREaXIgPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJGRlc3RpbmF0aW9uUGFyZW50RGlyICRmYWxzZSAkUFNDbWRsZXQNCg0KCQlpZiAoJGRlc3RpbmF0aW9uUGFyZW50RGlyLkNvdW50IC1ndCAxKQ0KCQl7DQoJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRBcmNoaXZlRmlsZVBhdGhFcnJvciAtZiAkRGVzdGluYXRpb25QYXRoLCAiRGVzdGluYXRpb25QYXRoIiwgIkRlc3RpbmF0aW9uUGF0aCIpDQoJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWRBcmNoaXZlRmlsZVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJfQ0KDQoJCUlzVmFsaWRGaWxlU3lzdGVtUGF0aCAkZGVzdGluYXRpb25QYXJlbnREaXIgfCBPdXQtTnVsbA0KCQkkRGVzdGluYXRpb25QYXRoID0gSm9pbi1QYXRoIC1QYXRoICRkZXN0aW5hdGlvblBhcmVudERpciAtQ2hpbGRQYXRoICRhY2hpdmVGaWxlTmFtZQ0KDQoJCSMgR2V0RXh0ZW5zaW9uIEFQSSBkb2VzIG5vdCB2YWxpZGF0ZSBmb3IgdGhlIGFjdHVhbCBleGlzdGFuY2Ugb2YgdGhlIHBhdGguDQoJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJERlc3RpbmF0aW9uUGF0aCkNCg0KCQkjIElmIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSAuWmlwIGV4dGVuc2lvbiwgd2UgYXBwZW5kIGl0Lg0KCQlJZiAoJGV4dGVuc2lvbiAtZXEgW3N0cmluZ106OkVtcHR5KQ0KCQl7DQoJCQkkRGVzdGluYXRpb25QYXRoV2l0aE91dEV4dGVuc2lvbiA9ICREZXN0aW5hdGlvblBhdGgNCgkJCSREZXN0aW5hdGlvblBhdGggPSAkRGVzdGluYXRpb25QYXRoV2l0aE91dEV4dGVuc2lvbiArICR6aXBGaWxlRXh0ZW5zaW9uDQoJCQkkYXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZSAtZiAkRGVzdGluYXRpb25QYXRoV2l0aE91dEV4dGVuc2lvbiwgJERlc3RpbmF0aW9uUGF0aCkNCgkJCVdyaXRlLVZlcmJvc2UgJGFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJIyBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGlzIHNwZWNpZmllZCBmb3IgdGhlIHppcCBmaWxlIHRvIGJlIGNyZWF0ZWQuDQoJCQlpZiAoJGV4dGVuc2lvbiAtbmUgJHppcEZpbGVFeHRlbnNpb24pDQoJCQl7DQoJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yIC1mICRleHRlbnNpb24sICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiTm90U3VwcG9ydGVkQXJjaGl2ZUZpbGVFeHRlbnNpb24iICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRleHRlbnNpb24NCgkJCX0NCgkJfQ0KDQoJCSRhcmNoaXZlRmlsZUV4aXN0ID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkRGVzdGluYXRpb25QYXRoIC1QYXRoVHlwZSBMZWFmDQoNCgkJaWYgKCRhcmNoaXZlRmlsZUV4aXN0IC1hbmQgKCRVcGRhdGUgLWVxICRmYWxzZSAtYW5kICRGb3JjZSAtZXEgJGZhbHNlKSkNCgkJew0KCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5aaXBGaWxlRXhpc3RFcnJvciAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJBcmNoaXZlRmlsZUV4aXN0cyIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQl9DQoNCgkJIyBJZiBhcmNoaXZlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlmIC1VcGRhdGUgaXMgc3BlY2lmaWVkLCB0aGVuIHdlIGNoZWNrIHRvIHNlZQ0KCQkjIGlmIHdlIGhhdmUgd3JpdGUgYWNjZXNzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUuDQoJCWlmICgkYXJjaGl2ZUZpbGVFeGlzdCAtYW5kICRVcGRhdGUgLWVxICR0cnVlKQ0KCQl7DQoJCQkkaXRlbSA9IEdldC1JdGVtIC1QYXRoICREZXN0aW5hdGlvblBhdGgNCgkJCWlmICgkaXRlbS5BdHRyaWJ1dGVzLlRvU3RyaW5nKCkuQ29udGFpbnMoIlJlYWRPbmx5IikpDQoJCQl7DQoJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BcmNoaXZlRmlsZUlzUmVhZE9ubHkgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkFyY2hpdmVGaWxlSXNSZWFkT25seSIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRPcGVyYXRpb24pICREZXN0aW5hdGlvblBhdGgNCgkJCX0NCgkJfQ0KDQoJCSRpc1doYXRJZiA9ICRwc2JvdW5kcGFyYW1ldGVycy5Db250YWluc0tleSgiV2hhdElmIikNCgkJaWYgKCEkaXNXaGF0SWYpDQoJCXsNCgkJCSRwcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlKQ0KCQkJV3JpdGUtVmVyYm9zZSAkcHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlDQoNCgkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5Db21wcmVzc1Byb2dyZXNzQmFyVGV4dCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkNvbXByZXNzLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAwIDEwMCAxMDAgMQ0KCQl9DQoJfQ0KCVBST0NFU1MNCgl7DQoJCWlmICgkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIlBhdGgiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJQYXRoV2l0aEZvcmNlIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiUGF0aFdpdGhVcGRhdGUiKQ0KCQl7DQoJCQkkaW5wdXRQYXRocyArPSAkUGF0aA0KCQl9DQoNCgkJaWYgKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGgiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aFVwZGF0ZSIpDQoJCXsNCgkJCSRpbnB1dFBhdGhzICs9ICRMaXRlcmFsUGF0aA0KCQl9DQoJfQ0KCUVORA0KCXsNCgkJIyBJZiBhcmNoaXZlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlmIC1Gb3JjZSBpcyBzcGVjaWZpZWQsIHdlIGRlbGV0ZSB0aGUNCgkJIyBleGlzdGluZyBhcnRjaGl2ZSBmaWxlIGFuZCBjcmVhdGUgYSBicmFuZCBuZXcgb25lLg0KCQlpZiAoKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIpIC1hbmQgJGFyY2hpdmVGaWxlRXhpc3QpDQoJCXsNCgkJCVJlbW92ZS1JdGVtIC1QYXRoICREZXN0aW5hdGlvblBhdGggLUZvcmNlIC1FcnJvckFjdGlvbiBTdG9wDQoJCX0NCg0KCQkjIFZhbGlkYXRlIFNvdXJjZSBQYXRoIGRlcGVkaW5nIG9uIHBhcmFtZXRlciBzZXQgYmVpbmcgdXNlZC4NCgkJIyBUaGUgc3BlY2lmaWVkIHNvdXJjZSBwYXRoIGNvbmF0aW5zIG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgbmVlZHMNCgkJIyB0byBiZSBjb21wcmVzc2VkLg0KCQkkaXNMaXRlcmFsUGF0aFVzZWQgPSAkZmFsc2UNCgkJaWYgKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGgiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aFVwZGF0ZSIpDQoJCXsNCgkJCSRpc0xpdGVyYWxQYXRoVXNlZCA9ICR0cnVlDQoJCX0NCg0KCQlWYWxpZGF0ZUR1cGxpY2F0ZUZpbGVTeXN0ZW1QYXRoICRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lICRpbnB1dFBhdGhzDQoJCSRyZXNvbHZlZFBhdGhzID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICRpbnB1dFBhdGhzICRpc0xpdGVyYWxQYXRoVXNlZCAkUFNDbWRsZXQNCgkJSXNWYWxpZEZpbGVTeXN0ZW1QYXRoICRyZXNvbHZlZFBhdGhzIHwgT3V0LU51bGwNCg0KCQkkc291cmNlUGF0aCA9ICRyZXNvbHZlZFBhdGhzOw0KDQoJCSMgQ1NWSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvbW1hIGFmdGVyIGVhY2ggcGF0aCBzcGVjaWZpZCBieQ0KCQkjIHRoZSAkc291cmNlUGF0aCBhcnJheS4gVGhlIGNvbW1hIHNhcGVyYXRlZCBwYXRocyBhcmUgZGlzcGxheWVkIGluIHRoZSAtV2hhdElmIG1lc3NhZ2UuDQoJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgPSBDU1ZIZWxwZXIgJHNvdXJjZVBhdGgNCgkJaWYgKCRwc2NtZGxldC5TaG91bGRQcm9jZXNzKCRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQpKQ0KCQl7DQoJCQl0cnkNCgkJCXsNCgkJCQkjIFN0b3BQcm9jZXNzaW5nIGlzIG5vdCBhdmFsaWFibGUgaW4gU2NyaXB0IGNtZGxldHMuIEhvd2V2ZXIgdGhlIHBpcGxlbGluZSBleGVjdXRpb24NCgkJCQkjIGlzIHRlcm1pbmF0ZWQgd2hlbiBldmVyICdDVFJMICsgQycgaXMgZW50ZXJlZCBieSB1c2VyIHRvIHRlcm1pbmF0ZSB0aGUgY21kbGV0IGV4ZWN1dGlvbi4NCgkJCQkjIFRoZSBmaW5hbGx5IGJsb2NrIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHBpcGxlbGluZSBpcyB0ZXJtaW5hdGVkLg0KCQkJCSMgJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgdmFyaWFibGUgaXMgdXNlZCB0byB0cmFjayBpZiAnQ1RSTCArIEMnIGlzIGVudGVyZWQgYnkgdGhlDQoJCQkJIyB1c2VyLg0KCQkJCSRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlID0gJGZhbHNlDQoNCgkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gQ29tcHJlc3NBcmNoaXZlSGVscGVyICRzb3VyY2VQYXRoICREZXN0aW5hdGlvblBhdGggJENvbXByZXNzaW9uTGV2ZWwgJFVwZGF0ZQ0KDQoJCQkJJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgPSAkdHJ1ZQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCSMgVGhlICRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIHdvdWxkIGJlIHNldCB0byAkZmFsc2UgaWYgdXNlciBoYXMgdHlwZWQgJ0NUUkwgKyBDJyB0bw0KCQkJCSMgdGVybWluYXRlIHRoZSBjbWRsZXQgZXhlY3V0aW9uIG9yIGlmIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KCQkJCSMgJG51bWJlck9mSXRlbXNBcmNoaXZlZCBjb250YWlucyB0aGUgY291bnQgb2YgbnVtYmVyIG9mIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGFkZCB0byB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCSMgSWYgdGhlIG5ld2x5IGNyZWF0ZWQgYXJjaGl2ZSBmaWxlIGlzIGVtcHR5IHRoZW4gd2UgZGVsZXRlIGl0IGFzIGl0cyBub3QgdXNhYmxlLg0KCQkJCWlmICgoJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgLWVxICRmYWxzZSkgLW9yDQoJCQkJCSgkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkIC1lcSAwKSkNCgkJCQl7DQoJCQkJCSREZWxldGVBcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRGVsZXRlQXJjaGl2ZUZpbGUgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJV3JpdGUtVmVyYm9zZSAkRGVsZXRlQXJjaGl2ZUZpbGVNZXNzYWdlDQoNCgkJCQkJIyBkZWxldGUgdGhlIHBhcnRpYWwgYXJjaGl2ZSBmaWxlIGNyZWF0ZWQuDQoJCQkJCWlmIChUZXN0LVBhdGggJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJew0KCQkJCQkJUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLUZvcmNlIC1SZWN1cnNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIEV4cGFuZC1BcmNoaXZlDQp7DQoJPCMNCgkJLlNZTk9QU0lTDQoJCQlFeHRyYWN0cyBmaWxlcyBmcm9tIGEgc3BlY2lmaWVkIGFyY2hpdmUgKHppcHBlZCkgZmlsZS4NCg0KCQkuREVTQ1JJUFRJT04NCgkJCVRoZSBFeHBhbmQtQXJjaGl2ZSBjbWRsZXQgZXh0cmFjdHMgZmlsZXMgZnJvbSBhIHNwZWNpZmllZCB6aXBwZWQgYXJjaGl2ZSBmaWxlIHRvIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGZvbGRlci4gQW4gYXJjaGl2ZSBmaWxlIGFsbG93cyBtdWx0aXBsZSBmaWxlcyB0byBiZSBwYWNrYWdlZCwgYW5kIG9wdGlvbmFsbHkgY29tcHJlc3NlZCwgaW50byBhIHNpbmdsZSB6aXBwZWQgZmlsZSBmb3IgZWFzaWVyIGRpc3RyaWJ1dGlvbiBhbmQgc3RvcmFnZS4NCg0KCQkuUEFSQU1FVEVSIFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgYXJjaGl2ZSBmaWxlLg0KDQoJCS5QQVJBTUVURVIgTGl0ZXJhbFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCB0byBhbiBhcmNoaXZlIGZpbGUuIFVubGlrZSB0aGUgUGF0aCBwYXJhbWV0ZXIsIHRoZSB2YWx1ZSBvZiBMaXRlcmFsUGF0aCBpcyB1c2VkIGV4YWN0bHkgYXMgaXQgaXMgdHlwZWQuIFdpbGRjYXJkIGNoYXJhY3RlcnMgYXJlIG5vdCBzdXBwb3J0ZWQuIElmIHRoZSBwYXRoIGluY2x1ZGVzIGVzY2FwZSBjaGFyYWN0ZXJzLCBlbmNsb3NlIGVhY2ggZXNjYXBlIGNoYXJhY3RlciBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLCB0byBpbnN0cnVjdCBXaW5kb3dzIFBvd2VyU2hlbGwgbm90IHRvIGludGVycHJldCBhbnkgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzLg0KDQoJCS5QQVJBTUVURVIgRGVzdGluYXRpb25QYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGZvbGRlciBpbiB3aGljaCB5b3Ugd2FudCB0aGUgY29tbWFuZCB0byBzYXZlIGV4dHJhY3RlZCBmaWxlcy4gRW50ZXIgdGhlIHBhdGggdG8gYSBmb2xkZXIsIGJ1dCBkbyBub3Qgc3BlY2lmeSBhIGZpbGUgbmFtZSBvciBmaWxlIG5hbWUgZXh0ZW5zaW9uLiBUaGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZC4NCg0KCQkuUEFSQU1FVEVSIEZvcmNlDQoJCQlGb3JjZXMgdGhlIGNvbW1hbmQgdG8gcnVuIHdpdGhvdXQgYXNraW5nIGZvciB1c2VyIGNvbmZpcm1hdGlvbi4NCg0KCQkuUEFSQU1FVEVSIENvbmZpcm0NCgkJCVByb21wdHMgeW91IGZvciBjb25maXJtYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIGNtZGxldC4NCg0KCQkuUEFSQU1FVEVSIFdoYXRJZg0KCQkJU2hvd3Mgd2hhdCB3b3VsZCBoYXBwZW4gaWYgdGhlIGNtZGxldCBydW5zLiBUaGUgY21kbGV0IGlzIG5vdCBydW4uDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMTogRXh0cmFjdCB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZQ0KDQoJCQlQUyBDOlw+RXhwYW5kLUFyY2hpdmUgLUxpdGVyYWxQYXRoIEM6XEFyY2hpdmVzXERyYWZ0LlppcCAtRGVzdGluYXRpb25QYXRoIEM6XFJlZmVyZW5jZQ0KDQoJCQlUaGlzIGNvbW1hbmQgZXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSwgRHJhZnQuemlwLCBpbnRvIHRoZSBmb2xkZXIgc3BlY2lmaWVkIGJ5IHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyLCBDOlxSZWZlcmVuY2UuDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMjogRXh0cmFjdCB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSBpbiB0aGUgY3VycmVudCBmb2xkZXINCg0KCQkJUFMgQzpcPkV4cGFuZC1BcmNoaXZlIC1QYXRoIERyYWZ0LlppcCAtRGVzdGluYXRpb25QYXRoIEM6XFJlZmVyZW5jZQ0KDQoJCQlUaGlzIGNvbW1hbmQgZXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIsIERyYWZ0LnppcCwgaW50byB0aGUgZm9sZGVyIHNwZWNpZmllZCBieSB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciwgQzpcUmVmZXJlbmNlLg0KCSM+DQoJW0NtZGxldEJpbmRpbmcoDQoJCQkJICAgRGVmYXVsdFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aCIsDQoJCQkJICAgU3VwcG9ydHNTaG91bGRQcm9jZXNzID0gJHRydWUsDQoJCQkJICAgSGVscFVyaSA9ICJodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJRD0zOTMyNTMiKV0NCglwYXJhbQ0KCSgNCgkJW3BhcmFtZXRlciAoDQoJCQkJCW1hbmRhdG9yeSA9ICR0cnVlLA0KCQkJCQlQb3NpdGlvbiA9IDAsDQoJCQkJCVBhcmFtZXRlclNldE5hbWUgPSAiUGF0aCIsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtzdHJpbmddDQoJCSRQYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKA0KCQkJCQltYW5kYXRvcnkgPSAkdHJ1ZSwNCgkJCQkJUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aCIsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtBbGlhcygiUFNQYXRoIildDQoJCVtzdHJpbmddDQoJCSRMaXRlcmFsUGF0aCwNCg0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkZmFsc2UsDQoJCQkJCVBvc2l0aW9uID0gMSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbc3RyaW5nXQ0KCQkkRGVzdGluYXRpb25QYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbc3dpdGNoXQ0KCQkkRm9yY2UNCgkpDQoNCglCRUdJTg0KCXsNCgkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24gLUVycm9yQWN0aW9uIElnbm9yZQ0KCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtIC1FcnJvckFjdGlvbiBJZ25vcmUNCg0KCQkkemlwRmlsZUV4dGVuc2lvbiA9ICIuemlwIg0KDQoJCSRMb2NhbGl6ZWREYXRhID0gQ29udmVydEZyb20tU3RyaW5nRGF0YSBAJw0KUGF0aE5vdEZvdW5kRXJyb3I9VGhlIHBhdGggJ3swfScgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHZhbGlkIGZpbGUgc3lzdGVtIHBhdGguDQpFeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgcGF0aCAnezB9JyBpcyBub3QgYSB2YWxpZCBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgcGF0aC4NCkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3I9ezB9IGlzIG5vdCBhIHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0LiB7MX0gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQuDQpBcmNoaXZlRmlsZUlzUmVhZE9ubHk9VGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGFyY2hpdmUgZmlsZSB7MH0gaXMgc2V0IHRvICdSZWFkT25seScgaGVuY2UgaXQgY2Fubm90IGJlIHVwZGF0ZWQuIElmIHlvdSBpbnRlbmQgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUsIHJlbW92ZSB0aGUgJ1JlYWRPbmx5JyBhdHRyaWJ1dGUgb24gdGhlIGFyY2hpdmUgZmlsZSBlbHNlIHVzZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGFuZCBjcmVhdGUgYSBuZXcgYXJjaGl2ZSBmaWxlLg0KWmlwRmlsZUV4aXN0RXJyb3I9VGhlIGFyY2hpdmUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIFVzZSB0aGUgLVVwZGF0ZSBwYXJhbWV0ZXIgdG8gdXBkYXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUgb3IgdXNlIHRoZSAtRm9yY2UgcGFyYW1ldGVyIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLg0KRHVwbGljYXRlUGF0aEZvdW5kRXJyb3I9VGhlIGlucHV0IHRvIHswfSBwYXJhbWV0ZXIgY29udGFpbnMgYSBkdXBsaWNhdGUgcGF0aCAnezF9Jy4gUHJvdmlkZSBhIHVuaXF1ZSBzZXQgb2YgcGF0aHMgYXMgaW5wdXQgdG8gezJ9IHBhcmFtZXRlci4NCkFyY2hpdmVGaWxlSXNFbXB0eT1UaGUgYXJjaGl2ZSBmaWxlIHswfSBpcyBlbXB0eS4NCkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0PVRoZSBhcmNoaXZlIGZpbGUgJ3swfScgY3JlYXRpb24gaXMgaW4gcHJvZ3Jlc3MuLi4NCkV4cGFuZFByb2dyZXNzQmFyVGV4dD1UaGUgYXJjaGl2ZSBmaWxlICd7MH0nIGV4cGFuc2lvbiBpcyBpbiBwcm9ncmVzcy4uLg0KQXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlPVRoZSBhcmNoaXZlIGZpbGUgcGF0aCAnezB9JyBzdXBwbGllZCB0byB0aGUgRGVzdGluYXRpb25QYXRoIHBhdGFtZXRlciBkb2VzIG5vdCBpbmNsdWRlIC56aXAgZXh0ZW5zaW9uLiBIZW5jZSAuemlwIGlzIGFwcGVuZGVkIHRvIHRoZSBzdXBwbGllZCBEZXN0aW5hdGlvblBhdGggcGF0aCBhbmQgdGhlIGFyY2hpdmUgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIGF0ICd7MX0nLg0KQWRkSXRlbXRvQXJjaGl2ZUZpbGU9QWRkaW5nICd7MH0nLg0KQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoPUNyZWF0ZWQgJ3swfScuDQpJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3I9VGhlIGFyY2hpdmUgZmlsZSBwYXRoICd7MH0nIHNwZWNpZmllZCBhcyBpbnB1dCB0byB0aGUgezF9IHBhcmFtZXRlciBpcyByZXNvbHZpbmcgdG8gbXVsdGlwbGUgZmlsZSBzeXN0ZW0gcGF0aHMuIFByb3ZpZGUgYSB1bmlxdWUgcGF0aCB0byB0aGUgezJ9IHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGhhcyB0byBiZSBjcmVhdGVkLg0KSW52YWxpZEV4cGFuZGVkRGlyUGF0aEVycm9yPVRoZSBkaXJlY3RvcnkgcGF0aCAnezB9JyBzcGVjaWZpZWQgYXMgaW5wdXQgdG8gdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIgaXMgcmVzb2x2aW5nIHRvIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzLiBQcm92aWRlIGEgdW5pcXVlIHBhdGggdG8gdGhlIERlc3RpbmF0aW9uIHBhcmFtZXRlciB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzIGhhdmUgdG8gYmUgZXhwYW5kZWQuDQpGaWxlRXhpc3RzRXJyb3I9RmFpbGVkIHRvIGNyZWF0ZSBmaWxlICd7MH0nIHdoaWxlIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlICd7MX0nIGNvbnRlbnRzIGFzIHRoZSBmaWxlICd7Mn0nIGFscmVhZHkgZXhpc3RzLiBVc2UgdGhlIC1Gb3JjZSBwYXJhbWV0ZXIgaWYgeW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgJ3szfScgY29udGVudHMgd2hlbiBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZS4NCkRlbGV0ZUFyY2hpdmVGaWxlPVRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBhcmNoaXZlIGZpbGUgJ3swfScgaXMgZGVsZXRlZCBhcyBpdCBpcyBub3QgdXNhYmxlLg0KSW52YWxpZERlc3RpbmF0aW9uUGF0aD1UaGUgZGVzdGluYXRpb24gcGF0aCAnezB9JyBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgYXJjaGl2ZSBmaWxlIG5hbWUuDQpQcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2U9UHJlcGFyaW5nIHRvIGNvbXByZXNzLi4uDQpQcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlPVByZXBhcmluZyB0byBleHBhbmQuLi4NCidADQoNCgkJI3JlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KCQlmdW5jdGlvbiBHZXRSZXNvbHZlZFBhdGhIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNMaXRlcmFsUGF0aCwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlBTQ21kbGV0XQ0KCQkJCSRjYWxsZXJQU0NtZGxldA0KCQkJKQ0KDQoJCQkkcmVzb2x2ZWRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJdHJ5DQoJCQkJew0KCQkJCQlpZiAoJGlzTGl0ZXJhbFBhdGgpDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50UmVzb2x2ZWRQYXRocyA9IFJlc29sdmUtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudFJlc29sdmVkUGF0aHMgPSBSZXNvbHZlLVBhdGggLVBhdGggJGN1cnJlbnRQYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJCX0NCgkJCQl9DQoJCQkJY2F0Y2gNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGN1cnJlbnRQYXRoKQ0KCQkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkXy5FeGNlcHRpb24NCgkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkFyY2hpdmVDbWRsZXRQYXRoTm90Rm91bmQiICRudWxsIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXhjZXB0aW9uICRjdXJyZW50UGF0aA0KCQkJCQkkY2FsbGVyUFNDbWRsZXQuVGhyb3dUZXJtaW5hdGluZ0Vycm9yKCRlcnJvclJlY29yZCkNCgkJCQl9DQoNCgkJCQlmb3JlYWNoICgkY3VycmVudFJlc29sdmVkUGF0aCBpbiAkY3VycmVudFJlc29sdmVkUGF0aHMpDQoJCQkJew0KCQkJCQkkcmVzb2x2ZWRQYXRocyArPSAkY3VycmVudFJlc29sdmVkUGF0aC5Qcm92aWRlclBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCSRyZXNvbHZlZFBhdGhzDQoJCX0NCg0KCQlmdW5jdGlvbiBBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoJCXsNCg0KCQkJaWYgKCRQU0VkaXRpb24gLWVxICJEZXNrdG9wIikNCgkJCXsNCgkJCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbg0KCQkJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIElzVmFsaWRGaWxlU3lzdGVtUGF0aA0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkcmVzdWx0ID0gJHRydWU7DQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQlpZiAoIShbU3lzdGVtLklPLkZpbGVdOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSAtb3IgW1N5c3RlbS5JTy5EaXJlY3RvcnldOjpFeGlzdHMoJGN1cnJlbnRQYXRoKSkpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRjdXJyZW50UGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJQYXRoTm90Rm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIFZhbGlkYXRlRHVwbGljYXRlRmlsZVN5c3RlbVBhdGgNCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRpbnB1dFBhcmFtZXRlciwNCg0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aA0KCQkJKQ0KDQoJCQkkdW5pcXVlSW5wdXRQYXRocyA9IEAoKQ0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJJGN1cnJlbnRJbnB1dFBhdGggPSAkY3VycmVudFBhdGguVG9VcHBlcigpDQoJCQkJaWYgKCR1bmlxdWVJbnB1dFBhdGhzLkNvbnRhaW5zKCRjdXJyZW50SW5wdXRQYXRoKSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRHVwbGljYXRlUGF0aEZvdW5kRXJyb3IgLWYgJGlucHV0UGFyYW1ldGVyLCAkY3VycmVudFBhdGgsICRpbnB1dFBhcmFtZXRlcikNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJEdXBsaWNhdGVQYXRoRm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkdW5pcXVlSW5wdXRQYXRocyArPSAkY3VycmVudElucHV0UGF0aA0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzaW9uTGV2ZWxNYXBwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsDQoJCQkpDQoNCgkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6T3B0aW1hbA0KDQoJCQkjIENvbXByZXNzaW9uTGV2ZWwgZm9ybWF0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlzd2l0Y2ggKCRjb21wcmVzc2lvbkxldmVsLlRvU3RyaW5nKCkpDQoJCQl7DQoJCQkJIkZhc3Rlc3QiDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06OkZhc3Rlc3QNCgkJCQl9DQoJCQkJIk5vQ29tcHJlc3Npb24iDQoJCQkJew0KCQkJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06Ok5vQ29tcHJlc3Npb24NCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAkY29tcHJlc3Npb25MZXZlbEZvcm1hdA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRzb3VyY2VGaWxlUGF0aHMgPSBAKCkNCgkJCSRzb3VyY2VEaXJQYXRocyA9IEAoKQ0KDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHNvdXJjZVBhdGgpDQoJCQl7DQoJCQkJJHJlc3VsdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRQYXRoIC1QYXRoVHlwZSBMZWFmDQoJCQkJaWYgKCRyZXN1bHQgLWVxICR0cnVlKQ0KCQkJCXsNCgkJCQkJJHNvdXJjZUZpbGVQYXRocyArPSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHNvdXJjZURpclBhdGhzICs9ICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmUgb3IgbW9yZSBkaXJlY3RvcnkgKHRoaXMgZGlyZWN0b3J5IGNhbiBoYXZlIGZpbGVzIHVuZGVyIGl0KSBhbmQgbm8gZmlsZXMgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1lcSAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1ndCAwKQ0KCQkJew0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMC9bZG91YmxlXSRzb3VyY2VEaXJQYXRocy5Db3VudA0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoJCQl9DQoNCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25seSBmaWxlcyB0byBiZSBjb21wcmVzc2VkLg0KCQkJZWxzZUlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1ndCAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1lcSAwKQ0KCQkJew0KCQkJCSMgJHByZXZpb3VzU2VnbWVudFdlaWdodCBpcyBlcXVhbCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBzZXQgdG8gMTAwIGFzIGFsbCBmaWxlcyBoYXZlIGVxdWFsIHdlaWdodGFnZS4NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMA0KDQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IENvbXByZXNzRmlsZXNIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCX0NCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25lIG9yIG1vcmUgZmlsZXMgYW5kIG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzICh0aGlzIGRpcmVjdG9yeSBjYW4gaGF2ZSBmaWxlcyB1bmRlciBpdCkgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWVsc2VpZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZ3QgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZ3QgMCkNCgkJCXsNCgkJCQkjIGVhY2ggZGlyZWN0b3J5IGlzIGNvbnNpZGVyZWQgYXMgYW4gaW5kaXZpZHVhbCBzZWdtZW50cyAmIGFsbCB0aGUgaW5kaXZpZHVhbCBmaWxlcyBhcmUgY2x1YmVkIGluIHRvIGEgc2VwYXJhdGUgc2dlbW5ldC4NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDAvW2RvdWJsZV0oJHNvdXJjZURpclBhdGhzLkNvdW50ICsgMSkNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRTb3VyY2VEaXJQYXRoIGluICRzb3VyY2VEaXJQYXRocykNCgkJCQl7DQoJCQkJCSRjb3VudCA9IENvbXByZXNzU2luZ2xlRGlySGVscGVyICRjdXJyZW50U291cmNlRGlyUGF0aCAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICR0cnVlICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCArPSAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQl9DQoNCgkJCQkkY291bnQgPSBDb21wcmVzc0ZpbGVzSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAkY291bnQNCgkJCX0NCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzRmlsZXNIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZUZpbGVQYXRocywNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IFppcEFyY2hpdmVIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJG51bGwgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzU2luZ2xlRGlySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkc291cmNlRGlyUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkdXNlUGFyZW50RGlyQXNSb290LA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W1N5c3RlbS5TdHJpbmddXSRzdWJEaXJGaWxlcyA9IEAoKQ0KDQoJCQlpZiAoJHVzZVBhcmVudERpckFzUm9vdCkNCgkJCXsNCgkJCQkkc291cmNlRGlySW5mbyA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5EaXJlY3RvcnlJbmZvIC1Bcmd1bWVudExpc3QgJHNvdXJjZURpclBhdGgNCgkJCQkkc291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlySW5mby5QYXJlbnQuRnVsbE5hbWUNCg0KCQkJCSMgSWYgdGhlIGRpcmVjdG9yeSBpcyBwcmVzZW50IGF0IHRoZSBkcml2ZSBsZXZlbCB0aGUgRGlyZWN0b3J5SW5mby5QYXJlbnQgaW5jbHVkZSAnXCcgZXhhbXBsZTogQzpcDQoJCQkJIyBPbiB0aGUgb3RoZXIgaGFuZCBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBhdCBhIGRlcGVyIGxldmVsIHRoZW4gRGlyZWN0b3J5SW5mby5QYXJlbnQNCgkJCQkjIGhhcyBqdXN0IHRoZSBwYXRoICh3aXRob3V0IGFuIGVuZGluZyAnXCcpLiBleGFtcGxlIEM6XHNvdXJjZQ0KCQkJCWlmICgkc291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1lcSAzKQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUgKyAiXCINCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpclBhdGgNCgkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZSArICJcIg0KCQkJfQ0KDQoJCQkkZGlyQ29udGVudHMgPSBHZXQtQ2hpbGRJdGVtIC1MaXRlcmFsUGF0aCAkc291cmNlRGlyUGF0aCAtUmVjdXJzZQ0KCQkJZm9yZWFjaCAoJGN1cnJlbnRDb250ZW50IGluICRkaXJDb250ZW50cykNCgkJCXsNCgkJCQkkaXNDb250YWluZXIgPSAkY3VycmVudENvbnRlbnQgLWlzIFtTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mb10NCgkJCQlpZiAoISRpc0NvbnRhaW5lcikNCgkJCQl7DQoJCQkJCSRzdWJEaXJGaWxlcy5BZGQoJGN1cnJlbnRDb250ZW50LkZ1bGxOYW1lKQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkjIFRoZSBjdXJyZW50Q29udGVudCBwb2ludHMgdG8gYSBkaXJlY3RvcnkuDQoJCQkJCSMgV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGFuIGVtcHR5IGRpcmVjdG9yeSwgaWYgc28gc3VjaCBhDQoJCQkJCSMgZGlyZWN0b3J5IGhhcyB0byBiZSBleHBsaWN0bHkgYWRkZWQgdG8gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJIyBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0aGUgR2V0RmlsZXMoKSBBUEkgcmV0dXJucyBhbiBlbXB0eSBhcnJheS4NCgkJCQkJJGZpbGVzID0gJGN1cnJlbnRDb250ZW50LkdldEZpbGVzKCkNCgkJCQkJaWYgKCRmaWxlcy5Db3VudCAtZXEgMCkNCgkJCQkJew0KCQkJCQkJJHN1YkRpckZpbGVzLkFkZCgkY3VycmVudENvbnRlbnQuRnVsbE5hbWUgKyAiXCIpDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBaaXBBcmNoaXZlSGVscGVyICRzdWJEaXJGaWxlcy5Ub0FycmF5KCkgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBaaXBBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbU3lzdGVtLlN0cmluZ11dDQoJCQkJJHNvdXJjZVBhdGhzLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IDANCgkJCSRmaWxlTW9kZSA9IFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpDcmVhdGUNCgkJCSRyZXN1bHQgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIExlYWYNCgkJCWlmICgkcmVzdWx0IC1lcSAkdHJ1ZSkNCgkJCXsNCgkJCQkkZmlsZU1vZGUgPSBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3Blbg0KCQkJfQ0KDQoJCQlBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBhcmNoaXZlIGZpbGUgaGFzIHdyaXRlIGFjY2Vzcy4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkZGVzdGluYXRpb25QYXRoLCAkZmlsZU1vZGUpDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVTdHJlYW0gLUFyZ3VtZW50TGlzdCAkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzDQoNCgkJCQkkemlwQXJjaGl2ZUFyZ3MgPSBAKCRhcmNoaXZlRmlsZVN0cmVhbSwgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlTW9kZV06OlVwZGF0ZSwgJGZhbHNlKQ0KCQkJCSR6aXBBcmNoaXZlID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgLUFyZ3VtZW50TGlzdCAkemlwQXJjaGl2ZUFyZ3MNCg0KCQkJCSRjdXJyZW50RW50cnlDb3VudCA9IDANCgkJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuQ29tcHJlc3NQcm9ncmVzc0JhclRleHQgLWYgJGRlc3RpbmF0aW9uUGF0aCkNCgkJCQkkYnVmZmVyU2l6ZSA9IDRrYg0KCQkJCSRidWZmZXIgPSBOZXctT2JqZWN0IEJ5dGVbXSAkYnVmZmVyU2l6ZQ0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRGaWxlUGF0aCBpbiAkc291cmNlUGF0aHMpDQoJCQkJew0KCQkJCQlpZiAoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgLW5lICRudWxsIC1hbmQgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoIC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkaW5kZXggPSAkY3VycmVudEZpbGVQYXRoLkluZGV4T2YoJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKQ0KCQkJCQkJJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZyA9ICRjdXJyZW50RmlsZVBhdGguU3Vic3RyaW5nKCRpbmRleCwgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUuTGVuZ3RoKQ0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSAkY3VycmVudEZpbGVQYXRoLlJlcGxhY2UoJGN1cnJlbnRGaWxlUGF0aFN1YlN0cmluZywgIiIpLlRyaW0oKQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHJlbGF0aXZlRmlsZVBhdGggPSBbU3lzdGVtLklPLlBhdGhdOjpHZXRGaWxlTmFtZSgkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQl9DQoNCgkJCQkJIyBVcGRhdGUgbW9kZSBpcyBzZWxlY3RlZC4NCgkJCQkJIyBDaGVjayB0byBzZWUgaWYgYXJjaGl2ZSBmaWxlIGFscmVhZHkgY29udGFpbnMgb25lIG9yIG1vcmUgemlwIGZpbGVzIGluIGl0Lg0KCQkJCQlpZiAoJGlzVXBkYXRlTW9kZSAtZXEgJHRydWUgLWFuZCAkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50IC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkkZW50cnlUb0JlVXBkYXRlZCA9ICRudWxsDQoNCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJCSMgSWYgc28gcmVwbGFjZSBpdCB3aXRoIG5ldyBmaWxlIGZyb20gdGhlIGlucHV0IHNvdXJjZS4NCgkJCQkJCSMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFyY2hpdmUgZmlsZSB0aGVuIGRlZmF1bHQgdG8NCgkJCQkJCSMgY3JlYXRlIG1vZGUgYW5kIGNyZWF0ZSB0aGUgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZS4NCg0KCQkJCQkJZm9yZWFjaCAoJGN1cnJlbnRBcmNoaXZlRW50cnkgaW4gJHppcEFyY2hpdmUuRW50cmllcykNCgkJCQkJCXsNCgkJCQkJCQlpZiAoJGN1cnJlbnRBcmNoaXZlRW50cnkuRnVsbE5hbWUgLWVxICRyZWxhdGl2ZUZpbGVQYXRoKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQgPSAkY3VycmVudEFyY2hpdmVFbnRyeQ0KCQkJCQkJCQlicmVhaw0KCQkJCQkJCX0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKCRlbnRyeVRvQmVVcGRhdGVkIC1uZSAkbnVsbCkNCgkJCQkJCXsNCgkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQuRGVsZXRlKCkNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCSRjb21wcmVzc2lvbiA9IENvbXByZXNzaW9uTGV2ZWxNYXBwZXIgJGNvbXByZXNzaW9uTGV2ZWwNCg0KCQkJCQkjIElmIGEgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGFkZGVkIHRvIGFuIGFyY2hpdmUgZmlsZSwNCgkJCQkJIyBieSBjb252ZW50aW9uIHRoZSAuTmV0IEFQSSdzIGV4cGVjdCB0aGUgcGF0aCBvZiB0aGUgZGlyZXRjb3J5DQoJCQkJCSMgdG8gZW5kIHdpdGggJ1wnIHRvIGRldGVjdCB0aGUgcGF0aCBhcyBhbiBkaXJlY3RvcnkuDQoJCQkJCWlmICghJHJlbGF0aXZlRmlsZVBhdGguRW5kc1dpdGgoIlwiLCBbU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkNCgkJCQkJew0KCQkJCQkJdHJ5DQoJCQkJCQl7DQoJCQkJCQkJdHJ5DQoJCQkJCQkJew0KCQkJCQkJCQkkY3VycmVudEZpbGVTdHJlYW0gPSBbU3lzdGVtLklPLkZpbGVdOjpPcGVuKCRjdXJyZW50RmlsZVBhdGgsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCQkJCX0NCgkJCQkJCQljYXRjaA0KCQkJCQkJCXsNCgkJCQkJCQkJIyBGYWlsZWQgdG8gYWNjZXNzIHRoZSBmaWxlLiBXcml0ZSBhIG5vbiB0ZXJtaW5hdGluZyBlcnJvciB0byB0aGUgcGlwZWxpbmUNCgkJCQkJCQkJIyBhbmQgbW92ZSBvbiB3aXRoIHRoZSByZW1haW5pbmcgZmlsZXMuDQoJCQkJCQkJCSRleGNlcHRpb24gPSAkXy5FeGNlcHRpb24NCgkJCQkJCQkJaWYgKCRudWxsIC1uZSAkXy5FeGNlcHRpb24gLWFuZA0KCQkJCQkJCQkJJG51bGwgLW5lICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbikNCgkJCQkJCQkJew0KCQkJCQkJCQkJJGV4Y2VwdGlvbiA9ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbg0KCQkJCQkJCQl9DQoJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJDb21wcmVzc0FyY2hpdmVVbmF1dGhvcml6ZWRBY2Nlc3NFcnJvciIgJG51bGwgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpQZXJtaXNzaW9uRGVuaWVkKSAkZXhjZXB0aW9uICRjdXJyZW50RmlsZVBhdGgNCgkJCQkJCQkJV3JpdGUtRXJyb3IgLUVycm9yUmVjb3JkICRlcnJvclJlY29yZA0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkJpbmFyeVJlYWRlciAkY3VycmVudEZpbGVTdHJlYW0NCg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeSA9ICR6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KCRyZWxhdGl2ZUZpbGVQYXRoLCAkY29tcHJlc3Npb24pDQoNCgkJCQkJCQkJIyBVcGRhdGluZyAgdGhlIEZpbGUgQ3JlYXRpb24gdGltZSBzbyB0aGF0IHRoZSBzYW1lIHRpbWVzdGFtcCB3b3VsZCBiZSByZXRhaW5lZCBhZnRlciBleHBhbmRpbmcgdGhlIGNvbXByZXNzZWQgZmlsZS4NCgkJCQkJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgR2V0LUNoaWxkSXRlbSB3b3VsZCBzdWNjZWVkLg0KCQkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeS5MYXN0V3JpdGVUaW1lID0gKEdldC1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEZpbGVQYXRoKS5MYXN0V3JpdGVUaW1lDQoNCgkJCQkJCQkJJGRlc3RTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlXcml0ZXIgJGN1cnJlbnRBcmNoaXZlRW50cnkuT3BlbigpDQoNCgkJCQkJCQkJd2hpbGUgKCRudW1iZXJPZkJ5dGVzUmVhZCA9ICRzcmNTdHJlYW0uUmVhZCgkYnVmZmVyLCAwLCAkYnVmZmVyU2l6ZSkpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLldyaXRlKCRidWZmZXIsIDAsICRudW1iZXJPZkJ5dGVzUmVhZCkNCgkJCQkJCQkJCSRkZXN0U3RyZWFtLkZsdXNoKCkNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gMQ0KCQkJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZmluYWxseQ0KCQkJCQkJew0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGN1cnJlbnRGaWxlU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGN1cnJlbnRGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRzcmNTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkgPSAkemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgiJHJlbGF0aXZlRmlsZVBhdGgiLCAkY29tcHJlc3Npb24pDQoJCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9IDENCgkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJfQ0KDQoJCQkJCWlmICgkbnVsbCAtbmUgJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSkNCgkJCQkJew0KCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlDQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQlQcm9ncmVzc0JhckhlbHBlciAiQ29tcHJlc3MtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICRzb3VyY2VQYXRocy5Db3VudCAgJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkJfQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCUlmICgkbnVsbCAtbmUgJHppcEFyY2hpdmUpDQoJCQkJew0KCQkJCQkkemlwQXJjaGl2ZS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQlJZiAoJG51bGwgLW5lICRhcmNoaXZlRmlsZVN0cmVhbSkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQkjIENvbXBsZXRlIHdyaXRpbmcgcHJvZ3Jlc3MuDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICJDb21wcmVzcy1BcmNoaXZlIiAtQ29tcGxldGVkDQoJCQl9DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXJjaGl2ZSBmaWxlDQojIHBhdGggJiBpdHMgZmlsZSBmb3JtYXQuIFRoZSBvbmx5IHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0IGlzIC56aXANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkYXJjaGl2ZUZpbGUNCgkJCSkNCg0KCQkJaWYgKFtTeXN0ZW0uSU8uRmlsZV06OkV4aXN0cygkYXJjaGl2ZUZpbGUpKQ0KCQkJew0KCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGFyY2hpdmVGaWxlKQ0KDQoJCQkJIyBJbnZhbGlkIGZpbGUgZXh0ZW5zaW9uIGlzIHNwZWNpZmVkIGZvciB0aGUgemlwIGZpbGUuDQoJCQkJaWYgKCRleHRlbnNpb24gLW5lICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yIC1mICRleHRlbnNpb24sICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIk5vdFN1cHBvcnRlZEFyY2hpdmVGaWxlRXh0ZW5zaW9uIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXh0ZW5zaW9uDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGFyY2hpdmVGaWxlKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiUGF0aE5vdEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkYXJjaGl2ZUZpbGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRXhwYW5kQXJjaGl2ZUhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGV4cGFuZCB0aGUgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzDQojIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIEV4cGFuZEFyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRhcmNoaXZlRmlsZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGV4cGFuZGVkRGlyLA0KDQoJCQkJW3JlZl0NCgkJCQkkZXhwYW5kZWRJdGVtcywNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRmb3JjZSwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc1ZlcmJvc2UsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNDb25maXJtDQoJCQkpDQoNCgkJCUFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBUaGUgZXhpc3RhbmNlIG9mIGFyY2hpdmUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyDQoJCQkJIyBiZWZvcmUgY2FsbGluZyB0aGlzIGhlbHBlciBmdW5jdGlvbi4NCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzID0gQCgkYXJjaGl2ZUZpbGUsIFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuLCBbU3lzdGVtLklPLkZpbGVBY2Nlc3NdOjpSZWFkKQ0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlU3RyZWFtIC1Bcmd1bWVudExpc3QgJGFyY2hpdmVGaWxlU3RyZWFtQXJncw0KDQoJCQkJJHppcEFyY2hpdmVBcmdzID0gQCgkYXJjaGl2ZUZpbGVTdHJlYW0sIFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZU1vZGVdOjpSZWFkLCAkZmFsc2UpDQoJCQkJJHppcEFyY2hpdmUgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSAtQXJndW1lbnRMaXN0ICR6aXBBcmNoaXZlQXJncw0KDQoJCQkJaWYgKCR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgLWVxIDApDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVJc0VtcHR5ID0gKCRMb2NhbGl6ZWREYXRhLkFyY2hpdmVGaWxlSXNFbXB0eSAtZiAkYXJjaGl2ZUZpbGUpDQoJCQkJCVdyaXRlLVZlcmJvc2UgJGFyY2hpdmVGaWxlSXNFbXB0eQ0KCQkJCQlyZXR1cm4NCgkJCQl9DQoNCgkJCQkkY3VycmVudEVudHJ5Q291bnQgPSAwDQoJCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZFByb2dyZXNzQmFyVGV4dCAtZiAkYXJjaGl2ZUZpbGUpDQoNCgkJCQkjIFRoZSBhcmNoaXZlIGVudHJpZXMgY2FuIGVpdGhlciBiZSBlbXB0eSBkaXJlY3RvcmllcyBvciBmaWxlcy4NCgkJCQlmb3JlYWNoICgkY3VycmVudEFyY2hpdmVFbnRyeSBpbiAkemlwQXJjaGl2ZS5FbnRyaWVzKQ0KCQkJCXsNCgkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoID0gSm9pbi1QYXRoIC1QYXRoICRleHBhbmRlZERpciAtQ2hpbGRQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5LkZ1bGxOYW1lDQoJCQkJCSRleHRlbnNpb24gPSBbc3lzdGVtLklPLlBhdGhdOjpHZXRFeHRlbnNpb24oJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KDQoJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBpcyBhbiBlbXB0eSBkaXJlY3RvcnkNCgkJCQkJIyBUaGUgRnVsbE5hbWUgb2YgdGhlIEFyY2hpdmUgRW50cnkgcmVwcmVzZW50aW5nIGEgZGlyZWN0b3J5IHdvdWxkIGVuZCB3aXRoIGEgdHJhaWxpbmcgJ1wnLg0KCQkJCQlpZiAoJGV4dGVuc2lvbiAtZXEgW3N0cmluZ106OkVtcHR5IC1hbmQNCgkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aC5FbmRzV2l0aCgiXCIsIFtTdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKQ0KCQkJCQl7DQoJCQkJCQkkcGF0aEV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCSMgVGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBleHBlY3RzIGFuIGVtcHR5IGRpcmVjdG9yeS4NCgkJCQkJCSMgQ2hlY2sgaWYgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSBpcyBlbXB0eS4gSWYgaXRzIG5vdCBlbXB0eQ0KCQkJCQkJIyB0aGVuIGl0IG1lYW5zIHRoYXQgdXNlciBoYXMgYWRkZWQgdGhpcyBkaXJlY3RvcnkgYnkgb3RoZXIgbWVhbnMuDQoJCQkJCQlpZiAoJHBhdGhFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCXsNCgkJCQkJCQlOZXctSXRlbSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIHwgT3V0LU51bGwNCg0KCQkJCQkJCWlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGFkZEVtcHR5RGlyZWN0b3J5dG9FeHBhbmRlZFBhdGhNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRW1wdHlEaXJlY3Rvcnl0b0V4cGFuZGVkUGF0aE1lc3NhZ2UNCg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQl0cnkNCgkJCQkJCXsNCgkJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVJbmZvIC1Bcmd1bWVudExpc3QgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoJCQkJCQkJJHBhcmVudERpckV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXINCg0KCQkJCQkJCSMgSWYgdGhlIFBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIGFyY2hpdmUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGUgaXQuDQoJCQkJCQkJaWYgKCRwYXJlbnREaXJFeGlzdHMgLWVxICRmYWxzZSkNCgkJCQkJCQl7DQoJCQkJCQkJCU5ldy1JdGVtICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gfCBPdXQtTnVsbA0KDQoJCQkJCQkJCWlmICghKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1QYXRoVHlwZSBDb250YWluZXIpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkjIFRoZSBkaXJlY3RvcnkgcmVmZXJyZWQgYnkgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuDQoJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCSMgYW5kIGF1dGhvcml6YXRpb24gd2FzIG5vdCBwcm92aWRlZCB3aGVuIGNvbmZpcm1hdGlvbiB3YXMgcHJvbXB0ZWQuIEluIHN1Y2ggYSBzY2VuYXJpbywNCgkJCQkJCQkJCSMgd2Ugc2tpcCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBhcmNoaXZlIGFuZCBjb250aW51ZSB3aXRoIHRoZSByZW1haW5pbmcgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzLg0KCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJfQ0KDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZQ0KCQkJCQkJCX0NCg0KCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJGZhbHNlDQoNCgkJCQkJCQkjIENoZWNrIGlmIHRoZSBmaWxlIGluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgY29udGVudHMNCgkJCQkJCQkjIHdvdWxkIGJlIGV4cGFuZGVkIGFscmVhZHkgZXhpc3RzLg0KCQkJCQkJCWlmICgkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkV4aXN0cykNCgkJCQkJCQl7DQoJCQkJCQkJCWlmICgkZm9yY2UpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCVJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIC1Gb3JjZSAtRXJyb3JWYXJpYWJsZSBldiAtVmVyYm9zZTokaXNWZXJib3NlIC1Db25maXJtOiRpc0NvbmZpcm0NCgkJCQkJCQkJCWlmICgkZXYgLW5lICRudWxsKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJCX0NCg0KCQkJCQkJCQkJaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSAtUGF0aFR5cGUgTGVhZikNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkjIFRoZSBmaWxlIHJlZmVycmVkIGJ5ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4NCgkJCQkJCQkJCQkjIFRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIC1Db25maXJtIHBhcmFtdGVyIHdoZW4gRXhwYW5kLUFyY2hpdmUgd2FzIGludm9rZWQNCgkJCQkJCQkJCQkjIGFuZCBhdXRob3JpemF0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBjb25maXJtYXRpb24gd2FzIHByb21wdGVkLiBJbiBzdWNoIGEgc2NlbmFyaW8sDQoJCQkJCQkJCQkJIyB3ZSBza2lwIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGFyY2hpdmUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlbWFpbmluZyBhcmNoaXZlIGZpbGUgY29udGVudHMuDQoJCQkJCQkJCQkJQ29udGludWUNCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSMgV3JpdGUgbm9uLXRlcm1pbmF0aW5nIGVycm9yIHRvIHRoZSBwaXBlbGluZS4NCgkJCQkJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRmlsZUV4aXN0c0Vycm9yIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUsICRhcmNoaXZlRmlsZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSkNCgkJCQkJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJFeHBhbmRBcmNoaXZlRmlsZUV4aXN0cyIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRPcGVyYXRpb24pICRudWxsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUNCgkJCQkJCQkJCVdyaXRlLUVycm9yIC1FcnJvclJlY29yZCAkZXJyb3JSZWNvcmQNCgkJCQkJCQkJCSRoYXNOb25UZXJtaW5hdGluZ0Vycm9yID0gJHRydWUNCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJCWlmICghJGhhc05vblRlcm1pbmF0aW5nRXJyb3IpDQoJCQkJCQkJew0KCQkJCQkJCQlbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEZpbGVFeHRlbnNpb25zXTo6RXh0cmFjdFRvRmlsZSgkY3VycmVudEFyY2hpdmVFbnRyeSwgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoLCAkZmFsc2UpDQoNCgkJCQkJCQkJIyBBZGQgdGhlIGV4cGFuZGVkIGZpbGUgcGF0aCB0byB0aGUgJGV4cGFuZGVkSXRlbXMgYXJyYXksDQoJCQkJCQkJCSMgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIGV4cGFuZGVkIGZpbGVzIGNyZWF0ZWQgd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCQkJCSMgSWYgdXNlciBlbnRlcnMgQ1RSTCArIEMgdGhlbiBhdCB0aGF0IHBvaW50IG9mIHRpbWUsIGFsbCB0aGVzZSBleHBhbmRlZCBmaWxlcw0KCQkJCQkJCQkjIHdvdWxkIGJlIGRlbGV0ZWQgYXMgcGFydCBvZiB0aGUgY2xlYW4gdXAgcHJvY2Vzcy4NCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoNCgkJCQkJCQkJJGFkZEZpbGV0b0V4cGFuZGVkUGF0aE1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQ3JlYXRlRmlsZUF0RXhwYW5kZWRQYXRoIC1mICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCgkJCQkJCQkJV3JpdGUtVmVyYm9zZSAkYWRkRmlsZXRvRXhwYW5kZWRQYXRoTWVzc2FnZQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWZpbmFsbHkNCgkJCQkJCXsNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRkZXN0U3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGRlc3RTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KDQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkc3JjU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkkY3VycmVudEVudHJ5Q291bnQgKz0gMQ0KCQkJCQkjICRjdXJyZW50U2VnbWVudFdlaWdodCBpcyBTZXQgdG8gMTAwIGdpdmluZyBlcXVhbCB3ZWlnaHRhZ2UgdG8gZWFjaCBmaWxlIHRoYXQgaXMgZ2V0dGluZyBleHBhbmRlZC4NCgkJCQkJIyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0IGlzIHNldCB0byAwIGFzIHRoZXJlIGFyZSBubyBwcmlvciBzZWdtZW50cy4NCgkJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwDQoJCQkJCVByb2dyZXNzQmFySGVscGVyICJFeHBhbmQtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0ICR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgICRjdXJyZW50RW50cnlDb3VudA0KCQkJCX0NCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQlJZiAoJG51bGwgLW5lICR6aXBBcmNoaXZlKQ0KCQkJCXsNCgkJCQkJJHppcEFyY2hpdmUuRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJSWYgKCRudWxsIC1uZSAkYXJjaGl2ZUZpbGVTdHJlYW0pDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJIyBDb21wbGV0ZSB3cml0aW5nIHByb2dyZXNzLg0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAiRXhwYW5kLUFyY2hpdmUiIC1Db21wbGV0ZWQNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgUHJvZ3Jlc3NCYXJIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG1lc3NhZ2UuDQojIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBib3RoIENvbXByZXNzLUFyY2hpdmUgJiBFeHBhbmQtQXJjaGl2ZSB0byBkaXNwbGF5IGFyY2hpdmUgZmlsZQ0KIyBjcmVhdGlvbi9leHBhbnNpb24gcHJvZ3Jlc3MuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gUHJvZ3Jlc3NCYXJIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjbWRsZXROYW1lLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkc3RhdHVzLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQsDQoNCgkJCQlbaW50XQ0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcywNCg0KCQkJCVtpbnRdDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkpDQoNCgkJCWlmICgkY3VycmVudEVudHJ5Q291bnQgLWd0IDAgLWFuZA0KCQkJCSR0b3RhbE51bWJlcm9mRW50cmllcyAtZ3QgMCAtYW5kDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCAtZ2UgMCAtYW5kDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0IC1ndCAwKQ0KCQkJew0KCQkJCSRlbnRyeURlZmF1bHRXZWlnaHQgPSAkY3VycmVudFNlZ21lbnRXZWlnaHQvW2RvdWJsZV0kdG90YWxOdW1iZXJvZkVudHJpZXMNCg0KCQkJCSRwZXJjZW50Q29tcGxldGUgPSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICsgKCRlbnRyeURlZmF1bHRXZWlnaHQgKiAkY3VycmVudEVudHJ5Q291bnQpDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICRjbWRsZXROYW1lIC1TdGF0dXMgJHN0YXR1cyAtUGVyY2VudENvbXBsZXRlICRwZXJjZW50Q29tcGxldGUNCgkJCX0NCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ1NWSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gYXBwZW5kIGNvbW1hIGFmdGVyIGVhY2ggcGF0aCBzcGVjaWZpZCBieQ0KIyB0aGUgU291cmNlUGF0aCBhcnJheS4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNwbGF5IGFsbCB0aGUgdXNlciBzdXBwbGllZCBwYXRocw0KIyBpbiB0aGUgV2hhdElmIG1lc3NhZ2UuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gQ1NWSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VQYXRoDQoJCQkpDQoNCgkJCSMgU291cmNlUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBieSB0aGUgY2FsbGluZyBmdW5jYXRpb24uDQoJCQlpZiAoJHNvdXJjZVBhdGguQ291bnQgLWd0IDEpDQoJCQl7DQoJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9ICJgbiINCgkJCQlmb3IgKCRjdXJyZW50SW5kZXggPSAwOyAkY3VycmVudEluZGV4IC1sdCAkc291cmNlUGF0aC5Db3VudDsgJGN1cnJlbnRJbmRleCsrKQ0KCQkJCXsNCgkJCQkJaWYgKCRjdXJyZW50SW5kZXggLWVxICRzb3VyY2VQYXRoLkNvdW50IC0gMSkNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCArPSAkc291cmNlUGF0aFskY3VycmVudEluZGV4XSArICJgbiINCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gJHNvdXJjZVBhdGgNCgkJCX0NCg0KCQkJcmV0dXJuICRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gdGhyb3cgdGVybWluYXRpbmcgZXJyb3IuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QsDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRpbm5lckV4Y2VwdGlvbg0KCQkJKQ0KDQoJCQlpZiAoJGlubmVyRXhjZXB0aW9uIC1lcSAkbnVsbCkNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LW9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlLCAkaW5uZXJFeGNlcHRpb24NCgkJCX0NCg0KCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCSRQU0NtZGxldC5UaHJvd1Rlcm1pbmF0aW5nRXJyb3IoJGVycm9yUmVjb3JkKQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDcmVhdGVFcnJvclJlY29yZEhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhbiBFcnJvclJlY29yZA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIENyZWF0ZUVycm9yUmVjb3JkSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JJZCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9yTWVzc2FnZSwNCg0KCQkJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldDQoJCQkJJGVycm9yQ2F0ZWdvcnksDQoNCgkJCQlbRXhjZXB0aW9uXQ0KCQkJCSRleGNlcHRpb24sDQoNCgkJCQlbb2JqZWN0XQ0KCQkJCSR0YXJnZXRPYmplY3QNCgkJCSkNCg0KCQkJaWYgKCRudWxsIC1lcSAkZXhjZXB0aW9uKQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQl9DQoNCgkJCSRlcnJvclJlY29yZCA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZCAkZXhjZXB0aW9uLCAkZXJyb3JJZCwgJGVycm9yQ2F0ZWdvcnksICR0YXJnZXRPYmplY3QNCgkJCXJldHVybiAkZXJyb3JSZWNvcmQNCgkJfQ0KCQkjZW5kcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoNCgkJJGlzVmVyYm9zZSA9ICRwc2JvdW5kcGFyYW1ldGVycy5Db250YWluc0tleSgiVmVyYm9zZSIpDQoJCSRpc0NvbmZpcm0gPSAkcHNib3VuZHBhcmFtZXRlcnMuQ29udGFpbnNLZXkoIkNvbmZpcm0iKQ0KDQoJCSRpc0Rlc3RpbmF0aW9uUGF0aFByb3ZpZGVkID0gJHRydWUNCgkJaWYgKCREZXN0aW5hdGlvblBhdGggLWVxIFtzdHJpbmddOjpFbXB0eSkNCgkJew0KCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gJHB3ZA0KCQkJJGlzRGVzdGluYXRpb25QYXRoUHJvdmlkZWQgPSAkZmFsc2UNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRkZXN0aW5hdGlvblBhdGhFeGlzdHMgPSBUZXN0LVBhdGggLVBhdGggJERlc3RpbmF0aW9uUGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyDQoJCQlpZiAoJGRlc3RpbmF0aW9uUGF0aEV4aXN0cykNCgkJCXsNCgkJCQkkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJERlc3RpbmF0aW9uUGF0aCAkZmFsc2UgJFBTQ21kbGV0DQoJCQkJaWYgKCRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aC5Db3VudCAtZ3QgMSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZEV4cGFuZGVkRGlyUGF0aEVycm9yIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZERlc3RpbmF0aW9uUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQkJCX0NCg0KCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBwcm92aWRlZCBwYXRoIHJlc29sdmVzIHRvIGEgdmFsaWQgc2luZ2xlIHBhdGguDQoJCQkJIyBDYWxsaW5nIFJlc29sdmUtUGF0aCBhZ2FpbiB0byBnZXQgdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIgbmFtZS4NCgkJCQkkc3VwcGxpZWREZXN0aW5hdGlvblBhdGggPSBSZXNvbHZlLVBhdGggLVBhdGggJERlc3RpbmF0aW9uUGF0aA0KCQkJCWlmICgkc3VwcGxpZWREZXN0aW5hdGlvblBhdGguUHJvdmlkZXIuTmFtZSAtbmUgIkZpbGVTeXN0ZW0iKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWREaXJlY3RvcnlQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRjcmVhdGVkSXRlbSA9IE5ldy1JdGVtIC1QYXRoICREZXN0aW5hdGlvblBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIC1WZXJib3NlOiRpc1ZlcmJvc2UgLUVycm9yQWN0aW9uIFN0b3ANCgkJCQlpZiAoJGNyZWF0ZWRJdGVtIC1uZSAkbnVsbCAtYW5kICRjcmVhdGVkSXRlbS5QU1Byb3ZpZGVyLk5hbWUgLW5lICJGaWxlU3lzdGVtIikNCgkJCQl7DQoJCQkJCVJlbW92ZS1JdGVtICIkRGVzdGluYXRpb25QYXRoIiAtRm9yY2UgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRBcmNoaXZlSW5WYWxpZERlc3RpbmF0aW9uUGF0aCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWREaXJlY3RvcnlQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCQkJfQ0KDQoJCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICREZXN0aW5hdGlvblBhdGggJHRydWUgJFBTQ21kbGV0DQoJCQl9DQoJCX0NCg0KCQkkaXNXaGF0SWYgPSAkcHNib3VuZHBhcmFtZXRlcnMuQ29udGFpbnNLZXkoIldoYXRJZiIpDQoJCWlmICghJGlzV2hhdElmKQ0KCQl7DQoJCQkkcHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlKQ0KCQkJV3JpdGUtVmVyYm9zZSAkcHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZQ0KDQoJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuRXhwYW5kUHJvZ3Jlc3NCYXJUZXh0IC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQlQcm9ncmVzc0JhckhlbHBlciAiRXhwYW5kLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAwIDEwMCAxMDAgMQ0KCQl9DQoJfQ0KCVBST0NFU1MNCgl7DQoJCXN3aXRjaCAoJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUpDQoJCXsNCgkJCSJQYXRoIg0KCQkJew0KCQkJCSRyZXNvbHZlZFNvdXJjZVBhdGhzID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICRQYXRoICRmYWxzZSAkUFNDbWRsZXQNCg0KCQkJCWlmICgkcmVzb2x2ZWRTb3VyY2VQYXRocy5Db3VudCAtZ3QgMSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZEFyY2hpdmVGaWxlUGF0aEVycm9yIC1mICRQYXRoLCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSwgJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZEFyY2hpdmVGaWxlUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJFBhdGgNCgkJCQl9DQoJCQl9DQoJCQkiTGl0ZXJhbFBhdGgiDQoJCQl7DQoJCQkJJHJlc29sdmVkU291cmNlUGF0aHMgPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJExpdGVyYWxQYXRoICR0cnVlICRQU0NtZGxldA0KDQoJCQkJaWYgKCRyZXNvbHZlZFNvdXJjZVBhdGhzLkNvdW50IC1ndCAxKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3IgLWYgJExpdGVyYWxQYXRoLCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSwgJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZEFyY2hpdmVGaWxlUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJExpdGVyYWxQYXRoDQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlciAkcmVzb2x2ZWRTb3VyY2VQYXRocw0KDQoJCWlmICgkcHNjbWRsZXQuU2hvdWxkUHJvY2VzcygkcmVzb2x2ZWRTb3VyY2VQYXRocykpDQoJCXsNCgkJCSRleHBhbmRlZEl0ZW1zID0gQCgpDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgU3RvcFByb2Nlc3NpbmcgaXMgbm90IGF2YWxpYWJsZSBpbiBTY3JpcHQgY21kbGV0cy4gSG93ZXZlciB0aGUgcGlwbGVsaW5lIGV4ZWN1dGlvbg0KCQkJCSMgaXMgdGVybWluYXRlZCB3aGVuIGV2ZXIgJ0NUUkwgKyBDJyBpcyBlbnRlcmVkIGJ5IHVzZXIgdG8gdGVybWluYXRlIHRoZSBjbWRsZXQgZXhlY3V0aW9uLg0KCQkJCSMgVGhlIGZpbmFsbHkgYmxvY2sgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgcGlwbGVsaW5lIGlzIHRlcm1pbmF0ZWQuDQoJCQkJIyAkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSB2YXJpYWJsZSBpcyB1c2VkIHRvIHRyYWNrIGlmICdDVFJMICsgQycgaXMgZW50ZXJlZCBieSB0aGUNCgkJCQkjIHVzZXIuDQoJCQkJJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgPSAkZmFsc2UNCg0KCQkJCSMgVGhlIFVzZXIgaGFzIG5vdCBwcm92aWRlZCBhIGRlc3RpbmF0aW9uIHBhdGgsIGhlbmNlIHdlIHVzZSAnJHB3ZFxBcmNoaXZlRmlsZU5hbWUnIGFzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlDQoJCQkJIyBhcmNoaXZlIGZpbGUgY29udGVudHMgd291bGQgYmUgZXhwYW5kZWQuIElmIHRoZSBwYXRoICckcHdkXEFyY2hpdmVGaWxlTmFtZScgYWxyZWFkeSBleGlzdHMgdGhlbiB3ZSB1c2UgdGhlDQoJCQkJIyBXaW5kb3dzIGRlZmF1bHQgbWVjaGFuaXNtIG9mIGFwcGVuZGluZyBhIGNvdW50ZXIgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5IG5hbWUgd2hlcmUgdGhlIGNvbnRlbnRzDQoJCQkJIyB3b3VsZCBiZSBleHBhbmRlZC4NCgkJCQlpZiAoISRpc0Rlc3RpbmF0aW9uUGF0aFByb3ZpZGVkKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZUluZm8gJHJlc29sdmVkU291cmNlUGF0aHMNCgkJCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gSm9pbi1QYXRoIC1QYXRoICRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCAtQ2hpbGRQYXRoICRhcmNoaXZlRmlsZS5CYXNlTmFtZQ0KCQkJCQkkZGVzdGluYXRpb25QYXRoRXhpc3RzID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIENvbnRhaW5lcg0KDQoJCQkJCWlmICghJGRlc3RpbmF0aW9uUGF0aEV4aXN0cykNCgkJCQkJew0KCQkJCQkJTmV3LUl0ZW0gLVBhdGggJHJlc29sdmVkRGVzdGluYXRpb25QYXRoIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSAtVmVyYm9zZTokaXNWZXJib3NlIC1FcnJvckFjdGlvbiBTdG9wIHwgT3V0LU51bGwNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCUV4cGFuZEFyY2hpdmVIZWxwZXIgJHJlc29sdmVkU291cmNlUGF0aHMgJHJlc29sdmVkRGVzdGluYXRpb25QYXRoIChbcmVmXSRleHBhbmRlZEl0ZW1zKSAkRm9yY2UgJGlzVmVyYm9zZSAkaXNDb25maXJtDQoNCgkJCQkkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSA9ICR0cnVlDQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJIyBUaGUgJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgd291bGQgYmUgc2V0IHRvICRmYWxzZSBpZiB1c2VyIGhhcyB0eXBlZCAnQ1RSTCArIEMnIHRvDQoJCQkJIyB0ZXJtaW5hdGUgdGhlIGNtZGxldCBleGVjdXRpb24gb3IgaWYgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQoJCQkJaWYgKCRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIC1lcSAkZmFsc2UpDQoJCQkJew0KCQkJCQlpZiAoJGV4cGFuZGVkSXRlbXMuQ291bnQgLWd0IDApDQoJCQkJCXsNCgkJCQkJCSMgZGVsZXRlIHRoZSBleHBhbmRlZCBmaWxlL2RpcmVjdG9yeSBhcyB0aGUgYXJjaGl2ZQ0KCQkJCQkJIyBmaWxlIHdhcyBub3QgY29tcGxldGx5IGV4cGFuZGVkLg0KCQkJCQkJJGV4cGFuZGVkSXRlbXMgfCBGb3JFYWNoLU9iamVjdCB7IFJlbW92ZS1JdGVtICRfIC1Gb3JjZSAtUmVjdXJzZSB9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIFdyaXRlLUxvY2FsTWVzc2FnZQ0Kew0KICAgIFtDbWRsZXRCaW5kaW5nKCldDQogICAgUGFyYW0gKA0KICAgICAgICBbc3RyaW5nXSRNZXNzYWdlDQogICAgKQ0KDQogICAgaWYgKFRlc3QtUGF0aCBmdW5jdGlvbjpXcml0ZS1QU0ZNZXNzYWdlKSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAkTWVzc2FnZSB9DQogICAgZWxzZSB7IFdyaXRlLUhvc3QgJE1lc3NhZ2UgfQ0KfQ0KI2VuZHJlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KDQp0cnkNCnsNCglbU3lzdGVtLk5ldC5TZXJ2aWNlUG9pbnRNYW5hZ2VyXTo6U2VjdXJpdHlQcm90b2NvbCA9ICJUbHMxMiINCg0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiRG93bmxvYWRpbmcgcmVwb3NpdG9yeSBmcm9tICckKCRCYXNlVXJsKS9hcmNoaXZlLyQoJEJyYW5jaCkuemlwJyINCglJbnZva2UtV2ViUmVxdWVzdCAtVXJpICIkKCRCYXNlVXJsKS9hcmNoaXZlLyQoJEJyYW5jaCkuemlwIiAtVXNlQmFzaWNQYXJzaW5nIC1PdXRGaWxlICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkuemlwIiAtRXJyb3JBY3Rpb24gU3RvcA0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiQ3JlYXRpbmcgdGVtcG9yYXJ5IHByb2plY3QgZm9sZGVyOiAnJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpJyINCgkkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRlbnY6VEVNUCAtTmFtZSAkTW9kdWxlTmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Gb3JjZSAtRXJyb3JBY3Rpb24gU3RvcA0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiRXh0cmFjdGluZyBhcmNoaXZlIHRvICckKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSknIg0KCUV4cGFuZC1BcmNoaXZlIC1QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkuemlwIiAtRGVzdGluYXRpb25QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkiIC1FcnJvckFjdGlvbiBTdG9wDQoJDQoJJGJhc2VQYXRoID0gR2V0LUNoaWxkSXRlbSAiJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpXCoiIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMQ0KCWlmICgkU3ViRm9sZGVyKSB7ICRiYXNlUGF0aCA9ICIkKCRiYXNlUGF0aClcJCgkU3ViRm9sZGVyKSIgfQ0KCQ0KCSMgT25seSBuZWVkZWQgZm9yIFBTIHY1KyBidXQgZG9lc24ndCBodXJ0IGFueXdheQ0KCSRtYW5pZmVzdCA9ICIkKCRiYXNlUGF0aClcJCgkTW9kdWxlTmFtZSkucHNkMSINCgkkbWFuaWZlc3REYXRhID0gSW52b2tlLUV4cHJlc3Npb24gKFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRtYW5pZmVzdCkpDQoJJG1vZHVsZVZlcnNpb24gPSAkbWFuaWZlc3REYXRhLk1vZHVsZVZlcnNpb24NCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkRvd25sb2FkIGNvbmNsdWRlZDogJCgkTW9kdWxlTmFtZSkgfCBCcmFuY2ggJCgkQnJhbmNoKSB8IFZlcnNpb24gJCgkbW9kdWxlVmVyc2lvbikiDQoJDQoJIyBEZXRlcm1pbmUgb3V0cHV0IHBhdGgNCgkkcGF0aCA9ICIkKCRlbnY6UHJvZ3JhbUZpbGVzKVxXaW5kb3dzUG93ZXJTaGVsbFxNb2R1bGVzXCQoJE1vZHVsZU5hbWUpIg0KCWlmICgkVXNlck1vZGUpIHsgJHBhdGggPSAiJCgkSE9NRSlcRG9jdW1lbnRzXFdpbmRvd3NQb3dlclNoZWxsXE1vZHVsZXNcJCgkTW9kdWxlTmFtZSkiIH0NCglpZiAoJFBTVmVyc2lvblRhYmxlLlBTVmVyc2lvbi5NYWpvciAtZ2UgNSkgeyAkcGF0aCArPSAiXCRtb2R1bGVWZXJzaW9uIiB9DQoJDQoJaWYgKChUZXN0LVBhdGggJHBhdGgpIC1hbmQgKC1ub3QgJEZvcmNlKSkNCgl7DQoJCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiTW9kdWxlIGFscmVhZHkgaW5zdGFsbGVkLCBpbnRlcnJ1cHRpbmcgaW5zdGFsbGF0aW9uIg0KCQlyZXR1cm4NCgl9DQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDcmVhdGluZyBmb2xkZXI6ICQoJHBhdGgpIg0KCSRudWxsID0gTmV3LUl0ZW0gLVBhdGggJHBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgLUVycm9yQWN0aW9uIFN0b3ANCgkNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkNvcHlpbmcgZmlsZXMgdG8gJCgkcGF0aCkiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gLVBhdGggJGJhc2VQYXRoKSkNCgl7DQoJCU1vdmUtSXRlbSAtUGF0aCAkZmlsZS5GdWxsTmFtZSAtRGVzdGluYXRpb24gJHBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgl9DQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMiDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUZvcmNlIC1SZWN1cnNlDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1Gb3JjZQ0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiSW5zdGFsbGF0aW9uIG9mIHRoZSBtb2R1bGUgJCgkTW9kdWxlTmFtZSksIEJyYW5jaCAkKCRCcmFuY2gpLCBWZXJzaW9uICQoJG1vZHVsZVZlcnNpb24pIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIg0KfQ0KY2F0Y2gNCnsNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkluc3RhbGxhdGlvbiBvZiB0aGUgbW9kdWxlICQoJE1vZHVsZU5hbWUpIGZhaWxlZCEiDQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMiDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUZvcmNlIC1SZWN1cnNlDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1Gb3JjZQ0KCQ0KCXRocm93DQp9AQlhAAAACWIAAAAGYwAAAAtpbnN0YWxsLnBzMQZkAAAAC2luc3RhbGwucHMxCUEAAAAJZgAAAAlnAAAAAS8AAAAsAAAABmgAAADECE1JVCBMaWNlbnNlDQoNCkNvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+DQoNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQpjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbA0KY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCg0KVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUNClNPRlRXQVJFLgEJaQAAAAlqAAAABmsAAAAHTElDRU5TRQZsAAAAB0xJQ0VOU0UJQQAAAAluAAAACW8AAAABMAAAACwAAAAGcAAAAIEBIyBEZXNjcmlwdGlvbg0KDQpJbnNlcnQgYSB1c2VmdWwgZGVzY3JpcHRpb24gZm9yIHRoZSDDvm5hbWXDviBwcm9qZWN0IGhlcmUuDQoNClJlbWVtYmVyLCBpdCdzIHRoZSBmaXJzdCB0aGluZyBhIHZpc2l0b3Igd2lsbCBzZWUuAQlxAAAACXIAAAAGcwAAAAlSRUFETUUubWQGdAAAAAlSRUFETUUubWQJQQAAAAl2AAAACXcAAAAFMwAAADtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgEAAAAKU2NyaXB0VGV4dAExAAAABngAAAA2DQoJCQlbU3lzdGVtLkd1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoKS5Ub1VwcGVyKCkNCgkJATUAAAAzAAAABnkAAAAgDQoJCQlHZXQtRGF0ZSAtRm9ybWF0ICJ5eXl5Ig0KCQkBNwAAADMAAAAGegAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkBOQAAADMAAAAGewAAACYNCgkJCUdldC1EYXRlIC1Gb3JtYXQgInl5eXktTU0tZGQiDQoJCQE7AAAAMwAAAAZ8AAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJAT0AAAAzAAAABn0AAAA2DQoJCQlbU3lzdGVtLkd1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoKS5Ub1VwcGVyKCkNCgkJAT4AAAALAAAACX4AAAACAAAAAgAAAAFCAAAACAAAAAl/AAAAAAAAAAAAAAABQwAAAAgAAAAJfwAAAAAAAAAAAAAAAUQAAAALAAAACYAAAAABAAAAAQAAAAFIAAAACAAAAAl/AAAAAAAAAAAAAAABSQAAAAgAAAAJfwAAAAAAAAAAAAAAAUoAAAALAAAACYIAAAAIAAAACAAAAAFOAAAACAAAAAmDAAAAAQAAAAEAAAABTwAAAAgAAAAJfwAAAAAAAAAAAAAAAVEAAAAIAAAACX8AAAAAAAAAAAAAAAFSAAAACAAAAAl/AAAAAAAAAAAAAAABVgAAAAgAAAAJfwAAAAAAAAAAAAAAAVcAAAAIAAAACX8AAAAAAAAAAAAAAAFZAAAACAAAAAmFAAAAAQAAAAEAAAABWgAAAAgAAAAJfwAAAAAAAAAAAAAAAV4AAAAIAAAACX8AAAAAAAAAAAAAAAFfAAAACAAAAAl/AAAAAAAAAAAAAAABYQAAAAgAAAAJhwAAAAEAAAABAAAAAWIAAAAIAAAACX8AAAAAAAAAAAAAAAFmAAAACAAAAAl/AAAAAAAAAAAAAAABZwAAAAgAAAAJfwAAAAAAAAAAAAAAAWkAAAAIAAAACYkAAAABAAAAAQAAAAFqAAAACAAAAAmKAAAAAQAAAAEAAAABbgAAAAgAAAAJfwAAAAAAAAAAAAAAAW8AAAAIAAAACX8AAAAAAAAAAAAAAAFxAAAACAAAAAmMAAAAAQAAAAEAAAABcgAAAAgAAAAJfwAAAAAAAAAAAAAAAXYAAAAIAAAACX8AAAAAAAAAAAAAAAF3AAAACAAAAAl/AAAAAAAAAAAAAAAHfgAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAmOAAAACY8AAAANAhF/AAAAAAAAAAeAAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACZAAAAANAweCAAAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACZEAAAAJkgAAAAmTAAAACZQAAAAJlQAAAAmWAAAACZcAAAAJmAAAABGDAAAABAAAAAaZAAAABG5hbWUNAxGFAAAABAAAAAaaAAAABG5hbWUNAxGHAAAABAAAAAabAAAABG5hbWUNAxGJAAAABAAAAAacAAAABmF1dGhvcg0DEYoAAAAEAAAABp0AAAAEeWVhcg0DEYwAAAAEAAAABp4AAAAEbmFtZQ0DAY4AAAAsAAAABp8AAADQAzwjDQpUaGlzIHNjcmlwdCBwdWJsaXNoZXMgdGhlIG1vZHVsZSB0byB0aGUgZ2FsbGVyeS4NCkl0IGV4cGVjdHMgYXMgaW5wdXQgYW4gQXBpS2V5IGF1dGhvcml6ZWQgdG8gcHVibGlzaCB0aGUgbW9kdWxlLg0KDQpJbnNlcnQgYW55IGJ1aWxkIHN0ZXBzIHlvdSBtYXkgbmVlZCB0byB0YWtlIGJlZm9yZSBwdWJsaXNoaW5nIGl0IGhlcmUuDQojPg0KcGFyYW0gKA0KCSRBcGlLZXksDQoJJFdoYXRJZg0KKQ0KDQppZiAoJFdoYXRJZikgeyBQdWJsaXNoLU1vZHVsZSAtUGF0aCAiJCgkZW52OlNZU1RFTV9ERUZBVUxUV09SS0lOR0RJUkVDVE9SWSlcw75uYW1lw74iIC1OdUdldEFwaUtleSAkQXBpS2V5IC1Gb3JjZSAtV2hhdElmIH0NCmVsc2UgeyBQdWJsaXNoLU1vZHVsZSAtUGF0aCAiJCgkZW52OlNZU1RFTV9ERUZBVUxUV09SS0lOR0RJUkVDVE9SWSlcw75uYW1lw74iIC1OdUdldEFwaUtleSAkQXBpS2V5IC1Gb3JjZSB9AQmgAAAACaEAAAAGogAAAA52c3RzLWJ1aWxkLnBzMQajAAAAFGJ1aWxkXHZzdHMtYnVpbGQucHMxCUEAAAAJpQAAAAmmAAAAAY8AAAAsAAAABqcAAADKAiMgR3VpZGUgZm9yIGF2YWlsYWJsZSB2YXJpYWJsZXMgYW5kIHdvcmtpbmcgd2l0aCBzZWNyZXRzOg0KIyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy92c3RzL2J1aWxkLXJlbGVhc2UvY29uY2VwdHMvZGVmaW5pdGlvbnMvYnVpbGQvdmFyaWFibGVzP3RhYnM9cG93ZXJzaGVsbA0KDQojIE5lZWRzIHRvIGVuc3VyZSB0aGluZ3MgYXJlIERvbmUgUmlnaHQgYW5kIG9ubHkgbGVnYWwgY29tbWl0cyB0byBtYXN0ZXIgZ2V0IGJ1aWx0DQoNCiMgUnVuIGludGVybmFsIHBlc3RlciB0ZXN0cw0KJiAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvlx0ZXN0c1xwZXN0ZXIucHMxIgEJqAAAAAmpAAAABqoAAAARdnN0cy12YWxpZGF0ZS5wczEGqwAAABdidWlsZFx2c3RzLXZhbGlkYXRlLnBzMQlBAAAACa0AAAAJrgAAAAGQAAAAKQAAAAmvAAAABrAAAAAIw75uYW1lw74GsQAAABBsaWJyYXJ5XMO+bmFtZcO+CUEAAAAJswAAAAm0AAAAAZEAAAApAAAACbUAAAAGtgAAAANiaW4GtwAAAAzDvm5hbWXDvlxiaW4JQQAAAAm5AAAACboAAAABkgAAACkAAAAJuwAAAAa8AAAABWVuLXVzBr0AAAAOw75uYW1lw75cZW4tdXMJQQAAAAm/AAAACcAAAAABkwAAACkAAAAJwQAAAAbCAAAACWZ1bmN0aW9ucwbDAAAAEsO+bmFtZcO+XGZ1bmN0aW9ucwlBAAAACcUAAAAJxgAAAAGUAAAAKQAAAAnHAAAABsgAAAAIaW50ZXJuYWwGyQAAABHDvm5hbWXDvlxpbnRlcm5hbAlBAAAACcsAAAAJzAAAAAGVAAAAKQAAAAnNAAAABs4AAAAFdGVzdHMGzwAAAA7Dvm5hbWXDvlx0ZXN0cwlBAAAACdEAAAAJ0gAAAAGWAAAAKQAAAAnTAAAABtQAAAADeG1sBtUAAAAMw75uYW1lw75ceG1sCUEAAAAJ1wAAAAnYAAAAAZcAAAAsAAAABtkAAACeGEB7DQoJIyBTY3JpcHQgbW9kdWxlIG9yIGJpbmFyeSBtb2R1bGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYW5pZmVzdA0KCU1vZHVsZVRvUHJvY2VzcyA9ICfDvm5hbWXDvi5wc20xJw0KCQ0KCSMgVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBtb2R1bGUuDQoJTW9kdWxlVmVyc2lvbiA9ICcxLjAuMC4wJw0KCQ0KCSMgSUQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIG1vZHVsZQ0KCUdVSUQgPSAnw74hZ3VpZCHDvicNCgkNCgkjIEF1dGhvciBvZiB0aGlzIG1vZHVsZQ0KCUF1dGhvciA9ICfDvmF1dGhvcsO+Jw0KCQ0KCSMgQ29tcGFueSBvciB2ZW5kb3Igb2YgdGhpcyBtb2R1bGUNCglDb21wYW55TmFtZSA9ICfDvmNvbXBhbnnDvicNCgkNCgkjIENvcHlyaWdodCBzdGF0ZW1lbnQgZm9yIHRoaXMgbW9kdWxlDQoJQ29weXJpZ2h0ID0gJ0NvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+Jw0KCQ0KCSMgRGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUNCglEZXNjcmlwdGlvbiA9ICfDvmRlc2NyaXB0aW9uw74nDQoJDQoJIyBNaW5pbXVtIHZlcnNpb24gb2YgdGhlIFdpbmRvd3MgUG93ZXJTaGVsbCBlbmdpbmUgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCglQb3dlclNoZWxsVmVyc2lvbiA9ICc1LjAnDQoJDQoJIyBOYW1lIG9mIHRoZSBXaW5kb3dzIFBvd2VyU2hlbGwgaG9zdCByZXF1aXJlZCBieSB0aGlzIG1vZHVsZQ0KCSMgUG93ZXJTaGVsbEhvc3ROYW1lID0gJycNCgkNCgkjIE1pbmltdW0gdmVyc2lvbiBvZiB0aGUgV2luZG93cyBQb3dlclNoZWxsIGhvc3QgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCgkjIFBvd2VyU2hlbGxIb3N0VmVyc2lvbiA9ICcnDQoJDQoJIyBNaW5pbXVtIHZlcnNpb24gb2YgdGhlIC5ORVQgRnJhbWV3b3JrIHJlcXVpcmVkIGJ5IHRoaXMgbW9kdWxlDQoJIyBEb3ROZXRGcmFtZXdvcmtWZXJzaW9uID0gJzIuMCcNCgkNCgkjIE1pbmltdW0gdmVyc2lvbiBvZiB0aGUgY29tbW9uIGxhbmd1YWdlIHJ1bnRpbWUgKENMUikgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCgkjIENMUlZlcnNpb24gPSAnMi4wLjUwNzI3Jw0KCQ0KCSMgUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSAoTm9uZSwgWDg2LCBBbWQ2NCwgSUE2NCkgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCgkjIFByb2Nlc3NvckFyY2hpdGVjdHVyZSA9ICdOb25lJw0KCQ0KCSMgTW9kdWxlcyB0aGF0IG11c3QgYmUgaW1wb3J0ZWQgaW50byB0aGUgZ2xvYmFsIGVudmlyb25tZW50IHByaW9yIHRvIGltcG9ydGluZw0KCSMgdGhpcyBtb2R1bGUNCglSZXF1aXJlZE1vZHVsZXMgPSBAKA0KCQlAeyBNb2R1bGVOYW1lPSdQU0ZyYW1ld29yayc7IE1vZHVsZVZlcnNpb249JzAuOS4xMC4yMycgfQ0KCSkNCgkNCgkjIEFzc2VtYmxpZXMgdGhhdCBtdXN0IGJlIGxvYWRlZCBwcmlvciB0byBpbXBvcnRpbmcgdGhpcyBtb2R1bGUNCgkjIFJlcXVpcmVkQXNzZW1ibGllcyA9IEAoKQ0KCQ0KCSMgU2NyaXB0IGZpbGVzICgucHMxKSB0aGF0IGFyZSBydW4gaW4gdGhlIGNhbGxlcidzIGVudmlyb25tZW50IHByaW9yIHRvDQoJIyBpbXBvcnRpbmcgdGhpcyBtb2R1bGUNCgkjIFNjcmlwdHNUb1Byb2Nlc3MgPSBAKCkNCgkNCgkjIFR5cGUgZmlsZXMgKC5wczF4bWwpIHRvIGJlIGxvYWRlZCB3aGVuIGltcG9ydGluZyB0aGlzIG1vZHVsZQ0KCSMgVHlwZXNUb1Byb2Nlc3MgPSBAKCd4bWxcw75uYW1lw74uVHlwZXMucHMxeG1sJykNCgkNCgkjIEZvcm1hdCBmaWxlcyAoLnBzMXhtbCkgdG8gYmUgbG9hZGVkIHdoZW4gaW1wb3J0aW5nIHRoaXMgbW9kdWxlDQoJIyBGb3JtYXRzVG9Qcm9jZXNzID0gQCgneG1sXMO+bmFtZcO+LkZvcm1hdC5wczF4bWwnKQ0KCQ0KCSMgTW9kdWxlcyB0byBpbXBvcnQgYXMgbmVzdGVkIG1vZHVsZXMgb2YgdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4NCgkjIE1vZHVsZVRvUHJvY2Vzcw0KCSMgTmVzdGVkTW9kdWxlcyA9IEAoKQ0KCQ0KCSMgRnVuY3Rpb25zIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJRnVuY3Rpb25zVG9FeHBvcnQgPSAnJw0KCQ0KCSMgQ21kbGV0cyB0byBleHBvcnQgZnJvbSB0aGlzIG1vZHVsZQ0KCUNtZGxldHNUb0V4cG9ydCA9ICcnDQoJDQoJIyBWYXJpYWJsZXMgdG8gZXhwb3J0IGZyb20gdGhpcyBtb2R1bGUNCglWYXJpYWJsZXNUb0V4cG9ydCA9ICcnDQoJDQoJIyBBbGlhc2VzIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJQWxpYXNlc1RvRXhwb3J0ID0gJycNCgkNCgkjIExpc3Qgb2YgYWxsIG1vZHVsZXMgcGFja2FnZWQgd2l0aCB0aGlzIG1vZHVsZQ0KCU1vZHVsZUxpc3QgPSBAKCkNCgkNCgkjIExpc3Qgb2YgYWxsIGZpbGVzIHBhY2thZ2VkIHdpdGggdGhpcyBtb2R1bGUNCglGaWxlTGlzdCA9IEAoKQ0KCQ0KCSMgUHJpdmF0ZSBkYXRhIHRvIHBhc3MgdG8gdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4gTW9kdWxlVG9Qcm9jZXNzLiBUaGlzIG1heSBhbHNvIGNvbnRhaW4gYSBQU0RhdGEgaGFzaHRhYmxlIHdpdGggYWRkaXRpb25hbCBtb2R1bGUgbWV0YWRhdGEgdXNlZCBieSBQb3dlclNoZWxsLg0KCVByaXZhdGVEYXRhID0gQHsNCgkJDQoJCSNTdXBwb3J0IGZvciBQb3dlclNoZWxsR2V0IGdhbGxlcmllcy4NCgkJUFNEYXRhID0gQHsNCgkJCQ0KCQkJIyBUYWdzIGFwcGxpZWQgdG8gdGhpcyBtb2R1bGUuIFRoZXNlIGhlbHAgd2l0aCBtb2R1bGUgZGlzY292ZXJ5IGluIG9ubGluZSBnYWxsZXJpZXMuDQoJCQkjIFRhZ3MgPSBAKCkNCgkJCQ0KCQkJIyBBIFVSTCB0byB0aGUgbGljZW5zZSBmb3IgdGhpcyBtb2R1bGUuDQoJCQkjIExpY2Vuc2VVcmkgPSAnJw0KCQkJDQoJCQkjIEEgVVJMIHRvIHRoZSBtYWluIHdlYnNpdGUgZm9yIHRoaXMgcHJvamVjdC4NCgkJCSMgUHJvamVjdFVyaSA9ICcnDQoJCQkNCgkJCSMgQSBVUkwgdG8gYW4gaWNvbiByZXByZXNlbnRpbmcgdGhpcyBtb2R1bGUuDQoJCQkjIEljb25VcmkgPSAnJw0KCQkJDQoJCQkjIFJlbGVhc2VOb3RlcyBvZiB0aGlzIG1vZHVsZQ0KCQkJIyBSZWxlYXNlTm90ZXMgPSAnJw0KCQkJDQoJCX0gIyBFbmQgb2YgUFNEYXRhIGhhc2h0YWJsZQ0KCQkNCgl9ICMgRW5kIG9mIFByaXZhdGVEYXRhIGhhc2h0YWJsZQ0KfQEJ2gAAAAnbAAAABtwAAAANw75uYW1lw74ucHNkMQbdAAAAFsO+bmFtZcO+XMO+bmFtZcO+LnBzZDEJQQAAAAnfAAAACeAAAAABmAAAACwAAAAG4QAAAJENJHNjcmlwdDpNb2R1bGVSb290ID0gJFBTU2NyaXB0Um9vdA0KJHNjcmlwdDpNb2R1bGVWZXJzaW9uID0gIjEuMC4wLjAiDQoNCmZ1bmN0aW9uIEltcG9ydC1Nb2R1bGVGaWxlDQp7DQoJPCMNCgkJLlNZTk9QU0lTDQoJCQlMb2FkcyBmaWxlcyBpbnRvIHRoZSBtb2R1bGUgb24gbW9kdWxlIGltcG9ydC4NCgkJDQoJCS5ERVNDUklQVElPTg0KCQkJVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCBkdXJpbmcgbW9kdWxlIGluaXRpYWxpemF0aW9uLg0KCQkJSXQgc2hvdWxkIGFsd2F5cyBiZSBkb3Rzb3VyY2VkIGl0c2VsZiwgaW4gb3JkZXIgdG8gcHJvcGVyIGZ1bmN0aW9uLg0KCQkJDQoJCQlUaGlzIHByb3ZpZGVzIGEgY2VudHJhbCBsb2NhdGlvbiB0byByZWFjdCB0byBmaWxlcyBiZWluZyBpbXBvcnRlZCwgaWYgbGF0ZXIgZGVzaXJlZA0KCQkNCgkJLlBBUkFNRVRFUiBQYXRoDQoJCQlUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBsb2FkDQoJCQ0KCQkuRVhBTVBMRQ0KCQkJUFMgQzpcPiAuIEltcG9ydC1Nb2R1bGVGaWxlIC1GaWxlICRmdW5jdGlvbi5GdWxsTmFtZQ0KCQ0KCQkJSW1wb3J0cyB0aGUgZmlsZSBzdG9yZWQgaW4gJGZ1bmN0aW9uIGFjY29yZGluZyB0byBpbXBvcnQgcG9saWN5DQoJIz4NCglbQ21kbGV0QmluZGluZygpXQ0KCVBhcmFtICgNCgkJW3N0cmluZ10NCgkJJFBhdGgNCgkpDQoJDQoJaWYgKCRkb0RvdFNvdXJjZSkgeyAuICRQYXRoIH0NCgllbHNlIHsgJEV4ZWN1dGlvbkNvbnRleHQuSW52b2tlQ29tbWFuZC5JbnZva2VTY3JpcHQoJGZhbHNlLCAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKFtpby5maWxlXTo6UmVhZEFsbFRleHQoJFBhdGgpKSksICRudWxsLCAkbnVsbCkgfQ0KfQ0KDQojIERldGVjdCB3aGV0aGVyIGF0IHNvbWUgbGV2ZWwgZG90c291cmNpbmcgd2FzIGVuZm9yY2VkDQokc2NyaXB0OmRvRG90U291cmNlID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSDDvm5hbWXDvi5JbXBvcnQuRG9Eb3RTb3VyY2UgLUZhbGxiYWNrICRmYWxzZQ0KaWYgKCTDvm5hbWXDvl9kb3Rzb3VyY2Vtb2R1bGUpIHsgJHNjcmlwdDpkb0RvdFNvdXJjZSA9ICR0cnVlIH0NCg0KIyBFeGVjdXRlIFByZWltcG9ydCBhY3Rpb25zDQouIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICIkTW9kdWxlUm9vdFxpbnRlcm5hbFxzY3JpcHRzXHByZWltcG9ydC5wczEiDQoNCiMgSW1wb3J0IGFsbCBpbnRlcm5hbCBmdW5jdGlvbnMNCmZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQp7DQoJLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAkZnVuY3Rpb24uRnVsbE5hbWUNCn0NCg0KIyBJbXBvcnQgYWxsIHB1YmxpYyBmdW5jdGlvbnMNCmZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQp7DQoJLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAkZnVuY3Rpb24uRnVsbE5hbWUNCn0NCg0KIyBFeGVjdXRlIFBvc3RpbXBvcnQgYWN0aW9ucw0KLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcc2NyaXB0c1xwb3N0aW1wb3J0LnBzMSINCgEJ4gAAAAnjAAAABuQAAAANw75uYW1lw74ucHNtMQblAAAAFsO+bmFtZcO+XMO+bmFtZcO+LnBzbTEJQQAAAAnnAAAACegAAAABoAAAAAgAAAAJ6QAAAAEAAAABAAAAAaEAAAAIAAAACX8AAAAAAAAAAAAAAAGlAAAACAAAAAl/AAAAAAAAAAAAAAABpgAAAAgAAAAJfwAAAAAAAAAAAAAAAagAAAAIAAAACesAAAABAAAAAQAAAAGpAAAACAAAAAl/AAAAAAAAAAAAAAABrQAAAAgAAAAJfwAAAAAAAAAAAAAAAa4AAAAIAAAACX8AAAAAAAAAAAAAAAGvAAAACwAAAAntAAAAAgAAAAIAAAABswAAAAgAAAAJ7gAAAAEAAAABAAAAAbQAAAAIAAAACX8AAAAAAAAAAAAAAAG1AAAACwAAAAnwAAAAAAAAAAAAAAABuQAAAAgAAAAJfwAAAAAAAAAAAAAAAboAAAAIAAAACX8AAAAAAAAAAAAAAAG7AAAACwAAAAnyAAAAAQAAAAEAAAABvwAAAAgAAAAJfwAAAAAAAAAAAAAAAcAAAAAIAAAACX8AAAAAAAAAAAAAAAHBAAAACwAAAAn0AAAAAQAAAAEAAAABxQAAAAgAAAAJfwAAAAAAAAAAAAAAAcYAAAAIAAAACX8AAAAAAAAAAAAAAAHHAAAACwAAAAn2AAAABAAAAAQAAAABywAAAAgAAAAJfwAAAAAAAAAAAAAAAcwAAAAIAAAACX8AAAAAAAAAAAAAAAHNAAAACwAAAAn4AAAABAAAAAQAAAAB0QAAAAgAAAAJfwAAAAAAAAAAAAAAAdIAAAAIAAAACX8AAAAAAAAAAAAAAAHTAAAACwAAAAn6AAAAAwAAAAMAAAAB1wAAAAgAAAAJfwAAAAAAAAAAAAAAAdgAAAAIAAAACX8AAAAAAAAAAAAAAAHaAAAACAAAAAn8AAAABAAAAAQAAAAB2wAAAAgAAAAJ/QAAAAIAAAACAAAAAd8AAAAIAAAACf4AAAABAAAAAQAAAAHgAAAACAAAAAl/AAAAAAAAAAAAAAAB4gAAAAgAAAAJAAEAAAEAAAABAAAAAeMAAAAIAAAACX8AAAAAAAAAAAAAAAHnAAAACAAAAAkCAQAAAQAAAAEAAAAB6AAAAAgAAAAJfwAAAAAAAAAAAAAAEekAAAAEAAAABgQBAAAEbmFtZQ0DEesAAAAEAAAABgUBAAAEbmFtZQ0DB+0AAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJBgEAAAkHAQAADQIR7gAAAAQAAAAGCAEAAARuYW1lDQMH8AAAAAABAAAAAAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAfyAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQkBAAANAwf0AAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQoBAAANAwf2AAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsBAAAJDAEAAAkNAQAACQ4BAAAH+AAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkPAQAACRABAAAJEQEAAAkSAQAAB/oAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJEwEAAAkUAQAACRUBAAAKEfwAAAAEAAAABhYBAAAEbmFtZQYXAQAABmF1dGhvcgYYAQAAB2NvbXBhbnkGGQEAAAtkZXNjcmlwdGlvbhH9AAAABAAAAAYaAQAABGd1aWQGGwEAAAR5ZWFyDQIR/gAAAAQAAAAGHAEAAARuYW1lDQMRAAEAAAQAAAAGHQEAAARuYW1lDQMRAgEAAAQAAAAGHgEAAARuYW1lDQMBBgEAACkAAAAJHwEAAAYgAQAACMO+bmFtZcO+BiEBAAAZbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvglBAAAACSMBAAAJJAEAAAEHAQAALAAAAAYlAQAAsQcNCk1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwDQojIFZpc3VhbCBTdHVkaW8gMTUNClZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI3MTMwLjIwMTANCk1pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xDQpQcm9qZWN0KCJ7w74hZ3VpZDIhw759IikgPSAiw75uYW1lw74iLCAiw75uYW1lw75cw75uYW1lw74uY3Nwcm9qIiwgInvDviFndWlkNCHDvn0iDQpFbmRQcm9qZWN0DQpHbG9iYWwNCglHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCglFbmRHbG9iYWxTZWN0aW9uDQoJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCgkJe8O+IWd1aWQ0IcO+fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCgkJe8O+IWd1aWQ0IcO+fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQoJCXvDviFndWlkNCHDvn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KCQl7w74hZ3VpZDQhw759LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQoJRW5kR2xvYmFsU2VjdGlvbg0KCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQoJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KCUVuZEdsb2JhbFNlY3Rpb24NCglHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KCQlTb2x1dGlvbkd1aWQgPSB7w74hZ3VpZDMhw759DQoJRW5kR2xvYmFsU2VjdGlvbg0KRW5kR2xvYmFsDQoBCSYBAAAJJwEAAAYoAQAADMO+bmFtZcO+LnNsbgYpAQAAHWxpYnJhcnlcw75uYW1lw75cw75uYW1lw74uc2xuCUEAAAAJKwEAAAksAQAAAQkBAAAsAAAABi0BAAClAVRPUElDDQoJYWJvdXRfw75uYW1lw74NCgkNClNIT1JUIERFU0NSSVBUSU9ODQoJRXhwbGFpbnMgaG93IHRvIHVzZSB0aGUgw75uYW1lw74gcG93ZXJzaGVsbCBtb2R1bGUNCgkNCkxPTkcgREVTQ1JJUFRJT04NCgk8SW5zZXJ0IENvbnRlbnQgaGVyZT4NCg0KS0VZV09SRFMNCgnDvm5hbWXDvgEJLgEAAAkvAQAABjABAAAXYWJvdXRfw75uYW1lw74uaGVscC50eHQGMQEAACbDvm5hbWXDvlxlbi11c1xhYm91dF/Dvm5hbWXDvi5oZWxwLnR4dAlBAAAACTMBAAAJNAEAAAEKAQAALAAAAAY1AQAA0gEjIEZ1bmN0aW9ucw0KDQpUaGlzIGlzIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGZ1bmN0aW9ucyBnby4NCg0KRGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBtb2R1bGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN1YmRpdmlkZSB0aGVtIGludG8gc3ViZm9sZGVycy4NCg0KVGhlIG1vZHVsZSB3aWxsIHBpY2sgdXAgYWxsIC5wczEgZmlsZXMgcmVjdXJzaXZlbHkBCTYBAAAJNwEAAAY4AQAACXJlYWRtZS5tZAY5AQAAHMO+bmFtZcO+XGZ1bmN0aW9uc1xyZWFkbWUubWQJQQAAAAk7AQAACTwBAAABCwEAACkAAAAJPQEAAAY+AQAADmNvbmZpZ3VyYXRpb25zBj8BAAAgw75uYW1lw75caW50ZXJuYWxcY29uZmlndXJhdGlvbnMJQQAAAAlBAQAACUIBAAABDAEAACkAAAAJQwEAAAZEAQAACWZ1bmN0aW9ucwZFAQAAG8O+bmFtZcO+XGludGVybmFsXGZ1bmN0aW9ucwlBAAAACUcBAAAJSAEAAAENAQAAKQAAAAlJAQAABkoBAAAHc2NyaXB0cwZLAQAAGcO+bmFtZcO+XGludGVybmFsXHNjcmlwdHMJQQAAAAlNAQAACU4BAAABDgEAACkAAAAJTwEAAAZQAQAABHRlcHAGUQEAABbDvm5hbWXDvlxpbnRlcm5hbFx0ZXBwCUEAAAAJUwEAAAlUAQAAAQ8BAAApAAAACVUBAAAGVgEAAAlmdW5jdGlvbnMGVwEAABjDvm5hbWXDvlx0ZXN0c1xmdW5jdGlvbnMJQQAAAAlZAQAACVoBAAABEAEAACkAAAAJWwEAAAZcAQAAB2dlbmVyYWwGXQEAABbDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsCUEAAAAJXwEAAAlgAQAAAREBAAAsAAAABmEBAADVFHBhcmFtICgNCgkkU2hvdyA9ICJOb25lIg0KKQ0KDQpXcml0ZS1Ib3N0ICJTdGFydGluZyBUZXN0cyIgLUZvcmVncm91bmRDb2xvciBHcmVlbg0KaWYgKCRlbnY6QlVJTERfQlVJTERVUkkgLWxpa2UgInZzdGZzKiIpDQp7DQoJV3JpdGUtSG9zdCAiSW5zdGFsbGluZyBQZXN0ZXIiIC1Gb3JlZ3JvdW5kQ29sb3IgQ3lhbg0KICAgIEluc3RhbGwtTW9kdWxlIFBlc3RlciAtRm9yY2UgLVNraXBQdWJsaXNoZXJDaGVjaw0KCVdyaXRlLUhvc3QgIkluc3RhbGxpbmcgUFNGcmFtZXdvcmsiIC1Gb3JlZ3JvdW5kQ29sb3IgQ3lhbg0KCUludm9rZS1XZWJSZXF1ZXN0ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUG93ZXJzaGVsbEZyYW1ld29ya0NvbGxlY3RpdmUvcHNmcmFtZXdvcmsvbWFzdGVyL2luc3RhbGwucHMxIiAtVXNlQmFzaWNQYXJzaW5nIHwgSW52b2tlLUV4cHJlc3Npb24NCn0NCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJJbXBvcnRpbmcgTW9kdWxlIg0KDQpSZW1vdmUtTW9kdWxlIMO+bmFtZcO+IC1FcnJvckFjdGlvbiBJZ25vcmUNCkltcG9ydC1Nb2R1bGUgIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw74ucHNkMSINCkltcG9ydC1Nb2R1bGUgIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw74ucHNtMSIgLUZvcmNlDQoNCiR0b3RhbEZhaWxlZCA9IDANCiR0b3RhbFJ1biA9IDANCg0KJHRlc3RyZXN1bHRzID0gQCgpDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiTW9kdWxlcyBpbXBvcnRlZCwgcHJvY2VlZGluZyB3aXRoIGdlbmVyYWwgdGVzdHMiDQpmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxnZW5lcmFsIiAtRmlsdGVyICIqLlRlc3RzLnBzMSIpKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIFNpZ25pZmljYW50IC1NZXNzYWdlICIgIEV4ZWN1dGluZyA8Yz0nZW0nPiQoJGZpbGUuTmFtZSk8L2M+Ig0KCSRyZXN1bHRzID0gSW52b2tlLVBlc3RlciAtU2NyaXB0ICRmaWxlLkZ1bGxOYW1lIC1TaG93ICRTaG93IC1QYXNzVGhydQ0KCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJew0KCQkkdG90YWxSdW4gKz0gJHJlc3VsdC5Ub3RhbENvdW50DQoJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCSRyZXN1bHQuVGVzdFJlc3VsdCB8IFdoZXJlLU9iamVjdCB7IC1ub3QgJF8uUGFzc2VkIH0gfCBGb3JFYWNoLU9iamVjdCB7DQoJCQkkbmFtZSA9ICRfLk5hbWUNCgkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQlEZXNjcmliZSAgPSAkXy5EZXNjcmliZQ0KCQkJCUNvbnRleHQgICA9ICRfLkNvbnRleHQNCgkJCQlOYW1lCSAgPSAiSXQgJG5hbWUiDQoJCQkJUmVzdWx0ICAgID0gJF8uUmVzdWx0DQoJCQkJTWVzc2FnZSAgID0gJF8uRmFpbHVyZU1lc3NhZ2UNCgkJCX0NCgkJfQ0KCX0NCn0NCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQcm9jZWVkaW5nIHdpdGggaW5kaXZpZHVhbCB0ZXN0cyINCmZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkUFNTY3JpcHRSb290XGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKlRlc3RzLi5wczEiKSkNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBTaWduaWZpY2FudCAtTWVzc2FnZSAiICBFeGVjdXRpbmcgJCgkZmlsZS5OYW1lKSINCgkkcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLVNjcmlwdCAkZmlsZS5GdWxsTmFtZSAtU2hvdyBOb25lIC1QYXNzVGhydQ0KCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJew0KCQkkdG90YWxSdW4gKz0gJHJlc3VsdC5Ub3RhbENvdW50DQoJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCSRyZXN1bHQuVGVzdFJlc3VsdCB8IFdoZXJlLU9iamVjdCB7IC1ub3QgJF8uUGFzc2VkIH0gfCBGb3JFYWNoLU9iamVjdCB7DQoJCQkkbmFtZSA9ICRfLk5hbWUNCgkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQlEZXNjcmliZSAgID0gJF8uRGVzY3JpYmUNCgkJCQlDb250ZXh0ICAgID0gJF8uQ29udGV4dA0KCQkJCU5hbWUJICAgPSAiSXQgJG5hbWUiDQoJCQkJUmVzdWx0CSAgID0gJF8uUmVzdWx0DQoJCQkJTWVzc2FnZSAgICA9ICRfLkZhaWx1cmVNZXNzYWdlDQoJCQl9DQoJCX0NCgl9DQp9DQoNCiR0ZXN0cmVzdWx0cyB8IFNvcnQtT2JqZWN0IERlc2NyaWJlLCBDb250ZXh0LCBOYW1lLCBSZXN1bHQsIE1lc3NhZ2UgfCBGb3JtYXQtTGlzdA0KDQppZiAoJHRvdGFsRmFpbGVkIC1lcSAwKSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICJBbGwgPGM9J2VtJz4kdG90YWxSdW48L2M+IHRlc3RzIGV4ZWN1dGVkIHdpdGhvdXQgYSBzaW5nbGUgZmFpbHVyZSEiIH0NCmVsc2UgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBDcml0aWNhbCAtTWVzc2FnZSAiPGM9J2VtJz4kdG90YWxGYWlsZWQgdGVzdHM8L2M+IG91dCBvZiA8Yz0nc3ViJz4kdG90YWxSdW48L2M+IHRlc3RzIGZhaWxlZCEiIH0NCg0KaWYgKCR0b3RhbEZhaWxlZCAtZ3QgMCkNCnsNCgl0aHJvdyAiJHRvdGFsRmFpbGVkIC8gJHRvdGFsUnVuIHRlc3RzIGZhaWxlZCEiDQp9AQliAQAACWMBAAAGZAEAAApwZXN0ZXIucHMxBmUBAAAZw75uYW1lw75cdGVzdHNccGVzdGVyLnBzMQlBAAAACWcBAAAJaAEAAAESAQAALAAAAAZpAQAAogcjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgdGhlIGZvbGRlciwgd2hlcmUgYWxsIHRoZSB0ZXN0cyBnby4NCg0KVGhvc2UgYXJlIHN1YmRpdmlkZWQgaW4gdHdvIGNhdGVnb3JpZXM6DQoNCiAtIEdlbmVyYWwNCiAtIEZ1bmN0aW9uDQoNCiMjIEdlbmVyYWwgVGVzdHMNCg0KR2VuZXJhbCB0ZXN0cyBhcmUgZnVuY3Rpb24gZ2VuZXJpYyBhbmQgdGVzdCBmb3IgZ2VuZXJhbCBwb2xpY2llcy4NCg0KVGhlc2UgdGVzdCBzY2FuIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczoNCg0KIC0gSXMgbXkgbW9kdWxlIGZvbGxvd2luZyBteSBzdHlsZSBndWlkZXM/DQogLSBEb2VzIGFueSBvZiBteSBzY3JpcHRzIGhhdmUgYSBzeW50YXggZXJyb3I/DQogLSBEbyBteSBzY3JpcHRzIHVzZSBjb21tYW5kcyBJIGRvIG5vdCB3YW50IHRoZW0gdG8gdXNlPw0KIC0gRG8gbXkgY29tbWFuZHMgZm9sbG93IGJlc3QgcHJhY3RpY2VzPw0KIC0gRG8gbXkgY29tbWFuZHMgaGF2ZSBwcm9wZXIgaGVscD8NCg0KQmFzaWNhbGx5LCB0aGVzZSBhbGxvdyBhIGdlbmVyYWwgbW9kdWxlIGhlYWx0aCBjaGVjay4NCg0KVGhlc2UgdGVzdHMgYXJlIGFscmVhZHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgdGVtcGxhdGUuDQoNCiMjIEZ1bmN0aW9uIFRlc3RzDQoNCkEgaGVhbHRoeSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kcyAmIGNvbXBvbmVudHMgaXQgc2hpcHMuDQpPbmx5IHRoZW4gY2FuIGJlIGd1YXJhbnRlZWQsIHRoYXQgdGhleSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYXMgcHJvbWlzZWQuDQoNCkhvd2V2ZXIsIGFzIGVhY2ggc3VjaCB0ZXN0IG11c3QgYmUgc3BlY2lmaWMgdG8gdGhlIGZ1bmN0aW9uIGl0IHRlc3RzLCB0aGVyZSBjYW5ub3QgYmUgbXVjaCBpbiB0aGUgd2F5IG9mIHRlbXBsYXRlcy4BCWoBAAAJawEAAAZsAQAACXJlYWRtZS5tZAZtAQAAGMO+bmFtZcO+XHRlc3RzXHJlYWRtZS5tZAlBAAAACW8BAAAJcAEAAAETAQAALAAAAAZxAQAArAsjIFhNTA0KDQpUaGlzIGlzIHRoZSBmb2xkZXIgd2hlcmUgcHJvamVjdCBYTUwgZmlsZXMgZ28sIG5vdGFibHk6DQoNCiAtIEZvcm1hdCBYTUwNCiAtIFR5cGUgRXh0ZW5zaW9uIFhNTA0KDQpFeHRlcm5hbCBoZWxwIGZpbGVzIHNob3VsZCBfbm90XyBiZSBwbGFjZWQgaW4gdGhpcyBmb2xkZXIhDQoNCiMjIE5vdGVzIG9uIEZpbGVzIGFuZCBOYW1pbmcNCg0KVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGZvcm1hdCBmaWxlIGFuZCBvbmUgdHlwZSBleHRlbnNpb24gZmlsZSBwZXIgcHJvamVjdCwgYXMgaW1wb3J0aW5nIHRoZW0gaGFzIGEgbm90YWJsZSBpbXBhY3Qgb24gaW1wb3J0IHRpbWVzLg0KDQogLSBUaGUgRm9ybWF0IFhNTCBzaG91bGQgYmUgbmFtZWQgYMO+bmFtZcO+LkZvcm1hdC5wczF4bWxgDQogLSBUaGUgVHlwZSBFeHRlbnNpb24gWE1MIHNob3VsZCBiZSBuYW1lZCBgw75uYW1lw74uVHlwZXMucHMxeG1sYA0KDQojIyBUb29scw0KDQojIyMgTmV3LVBTTURGb3JtYXRUYWJsZURlZmluaXRpb24NCg0KVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgYW4gaW5wdXQgb2JqZWN0IGFuZCBnZW5lcmF0ZSBmb3JtYXQgeG1sIGZvciBhbiBhdXRvLXNpemVkIHRhYmxlLg0KDQpJdCBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBmb3JtYXRzLg0KDQojIyMgR2V0LVBTRlR5cGVTZXJpYWxpemF0aW9uRGF0YQ0KDQpgYGANCkMjIFdhcm5pbmchDQpUaGlzIHNlY3Rpb24gaXMgb25seSBpbnRlcmVzdCBpZiB5b3UncmUgdXNpbmcgQyMgdG9nZXRoZXIgd2l0aCBQb3dlclNoZWxsLg0KYGBgDQoNClRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHR5cGUgZXh0ZW5zaW9uIFhNTCB0aGF0IGFsbG93cyBQb3dlclNoZWxsIHRvIGNvbnZlcnQgdHlwZXMgd3JpdHRlbiBpbiBDIyB0byBiZSB3cml0dGVuIHRvIGZpbGUgYW5kIHJlc3RvcmVkIGZyb20gaXQgd2l0aG91dCBiZWluZyAnRGVzZXJpYWxpemVkJy4gQWxzbyB3b3JrcyBmb3Igam9icyBvciByZW1vdGluZywgaWYgYm90aCBzaWRlcyBoYXZlIHRoZSBgUFNGcmFtZXdvcmtgIG1vZHVsZSBhbmQgdHlwZSBleHRlbnNpb24gbG9hZGVkLg0KDQpJbiBvcmRlciBmb3IgYSBjbGFzcyB0byBiZSBlbGlnaWJsZSBmb3IgdGhpcywgaXQgbmVlZHMgdG8gY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOg0KDQogLSBIYXZlIHRoZSBgW1NlcmlhbGl6YWJsZV1gIGF0dHJpYnV0ZQ0KIC0gQmUgcHVibGljDQogLSBIYXZlIGFuIGVtcHR5IGNvbnN0cnVjdG9yDQogLSBBbGxvdyBhbGwgcHVibGljIHByb3BlcnRpZXMvZmllbGRzIHRvIGJlIHNldCAoZXZlbiBpZiBzZXR0aW5nIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcpIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLg0KDQpgYGANCm5vbi1wdWJsaWMgcHJvcGVydGllcyBhbmQgZmllbGRzIHdpbGwgYmUgbG9zdCBpbiB0aGlzIHByb2Nlc3MhDQpgYGABCXIBAAAJcwEAAAZ0AQAACXJlYWRtZS5tZAZ1AQAAFsO+bmFtZcO+XHhtbFxyZWFkbWUubWQJQQAAAAl3AQAACXgBAAABFAEAACwAAAAGeQEAAOcFPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8Q29uZmlndXJhdGlvbj4NCgk8Vmlld0RlZmluaXRpb25zPg0KCQk8IS0tIEZvby5CYXIgLS0+DQoJCTxWaWV3Pg0KCQkJPE5hbWU+Rm9vLkJhcjwvTmFtZT4NCgkJCTxWaWV3U2VsZWN0ZWRCeT4NCgkJCQk8VHlwZU5hbWU+Rm9vLkJhcjwvVHlwZU5hbWU+DQoJCQk8L1ZpZXdTZWxlY3RlZEJ5Pg0KCQkJPFRhYmxlQ29udHJvbD4NCgkJCQk8QXV0b1NpemUvPg0KCQkJCTxUYWJsZUhlYWRlcnM+DQoJCQkJCTxUYWJsZUNvbHVtbkhlYWRlci8+DQoJCQkJCTxUYWJsZUNvbHVtbkhlYWRlci8+DQoJCQkJPC9UYWJsZUhlYWRlcnM+DQoJCQkJPFRhYmxlUm93RW50cmllcz4NCgkJCQkJPFRhYmxlUm93RW50cnk+DQoJCQkJCQk8VGFibGVDb2x1bW5JdGVtcz4NCgkJCQkJCQk8VGFibGVDb2x1bW5JdGVtPg0KCQkJCQkJCQk8UHJvcGVydHlOYW1lPkZvbzwvUHJvcGVydHlOYW1lPg0KCQkJCQkJCTwvVGFibGVDb2x1bW5JdGVtPg0KCQkJCQkJCTxUYWJsZUNvbHVtbkl0ZW0+DQoJCQkJCQkJCTxQcm9wZXJ0eU5hbWU+QmFyPC9Qcm9wZXJ0eU5hbWU+DQoJCQkJCQkJPC9UYWJsZUNvbHVtbkl0ZW0+DQoJCQkJCQk8L1RhYmxlQ29sdW1uSXRlbXM+DQoJCQkJCTwvVGFibGVSb3dFbnRyeT4NCgkJCQk8L1RhYmxlUm93RW50cmllcz4NCgkJCTwvVGFibGVDb250cm9sPg0KCQk8L1ZpZXc+DQoJPC9WaWV3RGVmaW5pdGlvbnM+DQo8Q29uZmlndXJhdGlvbj4BCXoBAAAJewEAAAZ8AQAAFsO+bmFtZcO+LkZvcm1hdC5wczF4bWwGfQEAACPDvm5hbWXDvlx4bWxcw75uYW1lw74uRm9ybWF0LnBzMXhtbAlBAAAACX8BAAAJgAEAAAEVAQAALAAAAAaBAQAA4Ac8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KPFR5cGVzPg0KICA8IS0tIEZvby5CYXIgLS0+DQogIDxUeXBlPg0KICAgIDxOYW1lPkRlc2VyaWFsaXplZC5Gb28uQmFyPC9OYW1lPg0KICAgIDxNZW1iZXJzPg0KICAgICAgPE1lbWJlclNldD4NCiAgICAgICAgPE5hbWU+UFNTdGFuZGFyZE1lbWJlcnM8L05hbWU+DQogICAgICAgIDxNZW1iZXJzPg0KICAgICAgICAgIDxOb3RlUHJvcGVydHk+DQogICAgICAgICAgICA8TmFtZT4NCiAgICAgICAgICAgICAgVGFyZ2V0VHlwZUZvckRlc2VyaWFsaXphdGlvbg0KICAgICAgICAgICAgPC9OYW1lPg0KICAgICAgICAgICAgPFZhbHVlPg0KICAgICAgICAgICAgICBGb28uQmFyDQogICAgICAgICAgICA8L1ZhbHVlPg0KICAgICAgICAgIDwvTm90ZVByb3BlcnR5Pg0KICAgICAgICA8L01lbWJlcnM+DQogICAgICA8L01lbWJlclNldD4NCiAgICA8L01lbWJlcnM+DQogIDwvVHlwZT4NCiAgPFR5cGU+DQogICAgPE5hbWU+Rm9vLkJhcjwvTmFtZT4NCiAgICA8TWVtYmVycz4NCiAgICAgIDxDb2RlUHJvcGVydHkgSXNIaWRkZW49InRydWUiPg0KICAgICAgICA8TmFtZT5TZXJpYWxpemF0aW9uRGF0YTwvTmFtZT4NCiAgICAgICAgPEdldENvZGVSZWZlcmVuY2U+DQogICAgICAgICAgPFR5cGVOYW1lPlBTRnJhbWV3b3JrLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblR5cGVDb252ZXJ0ZXI8L1R5cGVOYW1lPg0KICAgICAgICAgIDxNZXRob2ROYW1lPkdldFNlcmlhbGl6YXRpb25EYXRhPC9NZXRob2ROYW1lPg0KICAgICAgICA8L0dldENvZGVSZWZlcmVuY2U+DQogICAgICA8L0NvZGVQcm9wZXJ0eT4NCiAgICA8L01lbWJlcnM+DQogICAgPFR5cGVDb252ZXJ0ZXI+DQogICAgICA8VHlwZU5hbWU+UFNGcmFtZXdvcmsuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVHlwZUNvbnZlcnRlcjwvVHlwZU5hbWU+DQogICAgPC9UeXBlQ29udmVydGVyPg0KICA8L1R5cGU+DQo8L1R5cGVzPgEJggEAAAmDAQAABoQBAAAVw75uYW1lw74uVHlwZXMucHMxeG1sBoUBAAAiw75uYW1lw75ceG1sXMO+bmFtZcO+LlR5cGVzLnBzMXhtbAlBAAAACYcBAAAJiAEAAAEfAQAACwAAAAmJAQAABAAAAAQAAAABIwEAAAgAAAAJigEAAAEAAAABAAAAASQBAAAIAAAACX8AAAAAAAAAAAAAAAEmAQAACAAAAAmMAQAAAQAAAAEAAAABJwEAAAgAAAAJjQEAAAcAAAAHAAAAASsBAAAIAAAACY4BAAABAAAAAQAAAAEsAQAACAAAAAl/AAAAAAAAAAAAAAABLgEAAAgAAAAJkAEAAAEAAAABAAAAAS8BAAAIAAAACX8AAAAAAAAAAAAAAAEzAQAACAAAAAmSAQAAAQAAAAEAAAABNAEAAAgAAAAJfwAAAAAAAAAAAAAAATYBAAAIAAAACX8AAAAAAAAAAAAAAAE3AQAACAAAAAl/AAAAAAAAAAAAAAABOwEAAAgAAAAJfwAAAAAAAAAAAAAAATwBAAAIAAAACX8AAAAAAAAAAAAAAAE9AQAACwAAAAmUAQAAAgAAAAIAAAABQQEAAAgAAAAJfwAAAAAAAAAAAAAAAUIBAAAIAAAACX8AAAAAAAAAAAAAAAFDAQAACwAAAAmWAQAAAQAAAAEAAAABRwEAAAgAAAAJfwAAAAAAAAAAAAAAAUgBAAAIAAAACX8AAAAAAAAAAAAAAAFJAQAACwAAAAmYAQAAAwAAAAMAAAABTQEAAAgAAAAJfwAAAAAAAAAAAAAAAU4BAAAIAAAACX8AAAAAAAAAAAAAAAFPAQAACwAAAAmaAQAAAwAAAAMAAAABUwEAAAgAAAAJfwAAAAAAAAAAAAAAAVQBAAAIAAAACX8AAAAAAAAAAAAAAAFVAQAACwAAAAmcAQAAAQAAAAEAAAABWQEAAAgAAAAJfwAAAAAAAAAAAAAAAVoBAAAIAAAACX8AAAAAAAAAAAAAAAFbAQAACwAAAAmeAQAABgAAAAYAAAABXwEAAAgAAAAJfwAAAAAAAAAAAAAAAWABAAAIAAAACX8AAAAAAAAAAAAAAAFiAQAACAAAAAmgAQAAAQAAAAEAAAABYwEAAAgAAAAJfwAAAAAAAAAAAAAAAWcBAAAIAAAACX8AAAAAAAAAAAAAAAFoAQAACAAAAAl/AAAAAAAAAAAAAAABagEAAAgAAAAJfwAAAAAAAAAAAAAAAWsBAAAIAAAACX8AAAAAAAAAAAAAAAFvAQAACAAAAAl/AAAAAAAAAAAAAAABcAEAAAgAAAAJfwAAAAAAAAAAAAAAAXIBAAAIAAAACaIBAAABAAAAAQAAAAFzAQAACAAAAAl/AAAAAAAAAAAAAAABdwEAAAgAAAAJfwAAAAAAAAAAAAAAAXgBAAAIAAAACX8AAAAAAAAAAAAAAAF6AQAACAAAAAl/AAAAAAAAAAAAAAABewEAAAgAAAAJfwAAAAAAAAAAAAAAAX8BAAAIAAAACaQBAAABAAAAAQAAAAGAAQAACAAAAAl/AAAAAAAAAAAAAAABggEAAAgAAAAJfwAAAAAAAAAAAAAAAYMBAAAIAAAACX8AAAAAAAAAAAAAAAGHAQAACAAAAAmmAQAAAQAAAAEAAAABiAEAAAgAAAAJfwAAAAAAAAAAAAAAB4kBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJqAEAAAmpAQAACaoBAAAJqwEAABGKAQAABAAAAAasAQAABG5hbWUNAxGMAQAABAAAAAatAQAABG5hbWUNAxGNAQAACAAAAAauAQAABWd1aWQyBq8BAAAFZ3VpZDQGsAEAAAVndWlkNAaxAQAABWd1aWQ0BrIBAAAFZ3VpZDQGswEAAAVndWlkNAa0AQAABWd1aWQzChGOAQAABAAAAAa1AQAABG5hbWUNAxGQAQAABAAAAAa2AQAABG5hbWUNAxGSAQAABAAAAAa3AQAABG5hbWUNAweUAQAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACbgBAAAJuQEAAA0CB5YBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJugEAAA0DB5gBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJuwEAAAm8AQAACb0BAAAKB5oBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJvgEAAAm/AQAACcABAAAKB5wBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJwQEAAA0DB54BAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJwgEAAAnDAQAACcQBAAAJxQEAAAnGAQAACccBAAANAhGgAQAABAAAAAbIAQAABG5hbWUNAxGiAQAABAAAAAbJAQAABG5hbWUNAxGkAQAABAAAAAbKAQAABG5hbWUNAxGmAQAABAAAAAbLAQAABG5hbWUNAwGoAQAAKQAAAAnMAQAABs0BAAADYmluBs4BAAAdbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxiaW4JQQAAAAnQAQAACdEBAAABqQEAACkAAAAJ0gEAAAbTAQAAA29iagbUAQAAHWxpYnJhcnlcw75uYW1lw75cw75uYW1lw75cb2JqCUEAAAAJ1gEAAAnXAQAAAaoBAAAsAAAABtgBAABSdXNpbmcgU3lzdGVtOw0KDQpuYW1lc3BhY2Ugw75uYW1lw74NCnsNCiAgICBwdWJsaWMgY2xhc3MgQ2xhc3MxDQogICAgew0KICAgIH0NCn0NCgEJ2QEAAAnaAQAABtsBAAAJQ2xhc3MxLmNzBtwBAAAjbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxDbGFzczEuY3MJQQAAAAneAQAACd8BAAABqwEAACwAAAAG4AEAAIQEPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+DQoNCiAgPFByb3BlcnR5R3JvdXA+DQogICAgPFRhcmdldEZyYW1ld29yaz5uZXRzdGFuZGFyZDIuMDwvVGFyZ2V0RnJhbWV3b3JrPg0KICA8L1Byb3BlcnR5R3JvdXA+DQoNCiAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xBbnlDUFUnIj4NCiAgICA8T3V0cHV0UGF0aD4uLlwuLlwuLlzDvm5hbWXDvlxiaW48L091dHB1dFBhdGg+DQogICAgPERvY3VtZW50YXRpb25GaWxlPi4uXC4uXC4uXMO+bmFtZcO+XGJpblxuZXRzdGFuZGFyZDIuMFzDvm5hbWXDvi54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KICA8L1Byb3BlcnR5R3JvdXA+DQogIA0KICA8UHJvcGVydHlHcm91cD4NCiAgICA8QXBwZW5kVGFyZ2V0RnJhbWV3b3JrVG9PdXRwdXRQYXRoPmZhbHNlPC9BcHBlbmRUYXJnZXRGcmFtZXdvcmtUb091dHB1dFBhdGg+DQogIDwvUHJvcGVydHlHcm91cD4NCg0KPC9Qcm9qZWN0Pg0KAQnhAQAACeIBAAAG4wEAAA/Dvm5hbWXDvi5jc3Byb2oG5AEAAClsaWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XMO+bmFtZcO+LmNzcHJvaglBAAAACeYBAAAJ5wEAAAG4AQAALAAAAAboAQAA/QM8Iw0KVGhpcyBpcyBhbiBleGFtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZQ0KDQpCeSBkZWZhdWx0LCBpdCBpcyBlbm91Z2ggdG8gaGF2ZSBhIHNpbmdsZSBvbmUgb2YgdGhlbSwNCmhvd2V2ZXIgaWYgeW91IGhhdmUgZW5vdWdoIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8ganVzdGlmeSBoYXZpbmcgbXVsdGlwbGUgY29waWVzIG9mIGl0LA0KZmVlbCB0b3RhbGx5IGZyZWUgdG8gc3BsaXQgdGhlbSBpbnRvIG11bHRpcGxlIGZpbGVzLg0KIz4NCg0KPCMNCiMgRXhhbXBsZSBDb25maWd1cmF0aW9uDQpTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnRXhhbXBsZS5TZXR0aW5nJyAtVmFsdWUgMTAgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gJ2ludGVnZXInIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIkV4YW1wbGUgY29uZmlndXJhdGlvbiBzZXR0aW5nLiBZb3VyIG1vZHVsZSBjYW4gdGhlbiB1c2UgdGhlIHNldHRpbmcgdXNpbmcgJ0dldC1QU0ZDb25maWdWYWx1ZSciDQojPgEJ6QEAAAnqAQAABusBAAARY29uZmlndXJhdGlvbi5wczEG7AEAADLDvm5hbWXDvlxpbnRlcm5hbFxjb25maWd1cmF0aW9uc1xjb25maWd1cmF0aW9uLnBzMQlBAAAACe4BAAAJ7wEAAAG5AQAALAAAAAbwAQAA/gMjIENvbmZpZ3VyYXRpb25zDQoNClRocm91Z2ggdGhlIGBQU0ZyYW1ld29ya2AgeW91IGhhdmUgYSBzaW1wbGUgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byAuLi4NCg0KIC0gUHVibGlzaCBzZXR0aW5ncw0KIC0gV2l0aCBvbmJvYXJkIGRvY3VtZW50YXRpb24NCiAtIElucHV0IHZhbGlkYXRpb24NCiAtIFNjcmlwdHMgdGhhdCBydW4gb24gY2hhbmdlIG9mIHNldHRpbmdzDQogLSBUaGF0IGNhbiBiZSBkaXNjb3ZlcmVkIGFuZCB1cGRhdGVkIGJ5IHRoZSB1c2VyDQogLSBUaGF0IGNhbiBiZSBhZG1pbmlzdHJhdGVkIGJ5IHBvbGljeSAmIERTQw0KDQpUaGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gaXMgYSBiaXQgdG9vIGNvbXBsZXggdG8gZGVzY3JpYmUgaW4gYSBoZWxwIGZpbGUsIHlvdSBjYW4gaG93ZXZlciB2aXNpdCB1cyBhdCBodHRwOi8vcHNmcmFtZXdvcmsub3JnIGZvciBkZXRhaWxlZCBndWlkYW5jZS4NCg0KQW4gZXhhbXBsZSBjYW4gYmUgc2VlbiBpbiB0aGUgYXR0YWNoZWQgcHMxIGZpbGUBCfEBAAAJ8gEAAAbzAQAACXJlYWRtZS5tZAb0AQAAKsO+bmFtZcO+XGludGVybmFsXGNvbmZpZ3VyYXRpb25zXHJlYWRtZS5tZAlBAAAACfYBAAAJ9wEAAAG6AQAALAAAAAb4AQAA2wEjIEZ1bmN0aW9ucw0KDQpUaGlzIGlzIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGludGVybmFsIGZ1bmN0aW9ucyBnby4NCg0KRGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBtb2R1bGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN1YmRpdmlkZSB0aGVtIGludG8gc3ViZm9sZGVycy4NCg0KVGhlIG1vZHVsZSB3aWxsIHBpY2sgdXAgYWxsIC5wczEgZmlsZXMgcmVjdXJzaXZlbHkBCfkBAAAJ+gEAAAb7AQAACXJlYWRtZS5tZAb8AQAAJcO+bmFtZcO+XGludGVybmFsXGZ1bmN0aW9uc1xyZWFkbWUubWQJQQAAAAn+AQAACf8BAAABuwEAACwAAAAGAAIAAPEJTmV3LVBTRkxpY2Vuc2UgLVByb2R1Y3QgJ8O+bmFtZcO+JyAtTWFudWZhY3R1cmVyICfDvmF1dGhvcsO+JyAtUHJvZHVjdFZlcnNpb24gJFBTTW9kdWxlVmVyc2lvbiAtUHJvZHVjdFR5cGUgTW9kdWxlIC1OYW1lIE1JVCAtVmVyc2lvbiAiMS4wLjAuMCIgLURhdGUgKEdldC1EYXRlICLDviFkYXRlIcO+IikgLVRleHQgQCINCkNvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+DQoNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQpjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbA0KY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCg0KVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUNClNPRlRXQVJFLg0KIkABCQECAAAJAgIAAAYDAgAAC2xpY2Vuc2UucHMxBgQCAAAlw75uYW1lw75caW50ZXJuYWxcc2NyaXB0c1xsaWNlbnNlLnBzMQlBAAAACQYCAAAJBwIAAAG8AQAALAAAAAYIAgAA0wQjIEFkZCBhbGwgdGhpbmdzIHlvdSB3YW50IHRvIHJ1biBhZnRlciBpbXBvcnRpbmcgdGhlIG1haW4gY29kZQ0KDQojIExvYWQgQ29uZmlndXJhdGlvbnMNCmZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkTW9kdWxlUm9vdFxpbnRlcm5hbFxjb25maWd1cmF0aW9uc1wqLnBzMSIgLUVycm9yQWN0aW9uIElnbm9yZSkpIHsNCgkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRmaWxlLkZ1bGxOYW1lDQp9DQoNCiMgTG9hZCBUYWIgRXhwYW5zaW9uDQpmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcdGVwcFwqLnRlcHAucHMxIiAtRXJyb3JBY3Rpb24gSWdub3JlKSkgew0KCS4gSW1wb3J0LU1vZHVsZUZpbGUgLVBhdGggJGZpbGUuRnVsbE5hbWUNCn0NCg0KIyBMb2FkIFRhYiBFeHBhbnNpb24gQXNzaWdubWVudA0KLiBJbXBvcnQtTW9kdWxlRmlsZSAtUGF0aCAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcdGVwcFxhc3NpZ25tZW50LnBzMSINCg0KIyBMb2FkIExpY2Vuc2UNCi4gSW1wb3J0LU1vZHVsZUZpbGUgLVBhdGggIiRNb2R1bGVSb290XGludGVybmFsXHNjcmlwdHNcbGljZW5zZS5wczEiAQkJAgAACQoCAAAGCwIAAA5wb3N0aW1wb3J0LnBzMQYMAgAAKMO+bmFtZcO+XGludGVybmFsXHNjcmlwdHNccG9zdGltcG9ydC5wczEJQQAAAAkOAgAACQ8CAAABvQEAACwAAAAGEAIAAD8jIEFkZCBhbGwgdGhpbmdzIHlvdSB3YW50IHRvIHJ1biBiZWZvcmUgaW1wb3J0aW5nIHRoZSBtYWluIGNvZGUBCRECAAAJEgIAAAYTAgAADXByZWltcG9ydC5wczEGFAIAACfDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXHByZWltcG9ydC5wczEJQQAAAAkWAgAACRcCAAABvgEAACwAAAAGGAIAAHE8Iw0KIyBFeGFtcGxlOg0KUmVnaXN0ZXItUFNGVGVwcEFyZ3VtZW50Q29tcGxldGVyIC1Db21tYW5kIEdldC1BbGNvaG9sIC1QYXJhbWV0ZXIgVHlwZSAtTmFtZSDDvm5hbWXDvi5hbGNvaG9sDQojPgEJGQIAAAkaAgAABhsCAAAOYXNzaWdubWVudC5wczEGHAIAACXDvm5hbWXDvlxpbnRlcm5hbFx0ZXBwXGFzc2lnbm1lbnQucHMxCUEAAAAJHgIAAAkfAgAAAb8BAAAsAAAABiACAACjATwjDQojIEV4YW1wbGU6DQpSZWdpc3Rlci1QU0ZUZXBwU2NyaXB0YmxvY2sgLU5hbWUgIsO+bmFtZcO+LmFsY29ob2wiIC1TY3JpcHRCbG9jayB7ICdCZWVyJywnTWVhZCcsJ1doaXNrZXknLCdXaW5lJywnVm9ka2EnLCdSdW0gKDN5KScsICdSdW0gKDV5KScsICdSdW0gKDd5KScgfQ0KIz4BCSECAAAJIgIAAAYjAgAAEGV4YW1wbGUudGVwcC5wczEGJAIAACfDvm5hbWXDvlxpbnRlcm5hbFx0ZXBwXGV4YW1wbGUudGVwcC5wczEJQQAAAAkmAgAACScCAAABwAEAACwAAAAGKAIAAL4HIyBUYWIgRXhwYW5zaW9uDQoNCiMjIERlc2NyaXB0aW9uDQoNCk1vZGVybiBUYWIgRXhwYW5zaW9uIHdhcyBvcGVuZWQgdG8gdXNlcnMgd2l0aCB0aGUgbW9kdWxlIGBUYWIgRXhwYW5zaW9uIFBsdXMgUGx1c2AgKFRFUFApLg0KDQpJdCBhbGxvd3MgeW91IHRvIGRlZmluZSwgd2hhdCBvcHRpb25zIGEgdXNlciBpcyBvZmZlcmVkIHdoZW4gdGFiYmluZyB0aHJvdWdoIGlucHV0IG9wdGlvbnMuIFRoaXMgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZSBmb3IgdGhlIHVzZXIgYW5kIGlzIGNvbnNpZGVyZWQgYSBrZXkgZWxlbWVudCBpbiB1c2VyIGV4cGVyaWVuY2UuDQoNClRoZSBgUFNGcmFtZXdvcmtgIG9mZmVycyBhIHNpbXBsaWZpZWQgd2F5IG9mIG9mZmVyaW5nIGp1c3QgdGhpcywgYXMgdGhlIHR3byBleGFtcGxlIGZpbGVzIHNob3cuDQoNCiMjIENvbmNlcHQNCg0KQ3VzdG9tIHRhYiBjb21wbGV0aW9uIGlzIGRlZmluZWQgaW4gdHdvIHN0ZXBzOg0KDQogLSBEZWZpbmUgYSBzY3JpcHRibG9jayB0aGF0IGlzIHJ1biB3aGVuIHRoZSB1c2VyIGhpdHMgYFRBQmAgYW5kIHByb3ZpZGVzIHRoZSBzdHJpbmdzIHRoYXQgYXJlIGhpcyBvcHRpb25zLg0KIC0gQXNzaWduIHRoYXQgc2NyaXB0YmxvY2sgdG8gdGhlIHBhcmFtZXRlciBvZiBhIGNvbW1hbmQuIFlvdSBjYW4gYXNzaWduIHRoZSBzYW1lIHNjcmlwdGJsb2NrIG11bHRpcGxlIHRpbWVzLg0KDQojIyBTdHJ1Y3R1cmUNCg0KSW1wb3J0IG9yZGVyIG1hdHRlcnMuIEluIG9yZGVyIHRvIG1ha2UgdGhpbmdzIHdvcmsgd2l0aCB0aGUgZGVmYXVsdCBzY2FmZm9sZCwgZm9sbG93IHRob3NlIHJ1bGVzOg0KDQogLSBBbGwgc2NyaXB0ZmlsZXMgX2RlZmluaW5nXyBjb21wbGV0aW9uIHNjcmlwdGJsb2NrcyBsaWtlIHRoaXM6IGAqLnRlcHAucHMxYA0KIC0gUHV0IGFsbCB5b3VyIGNvbXBsZXRpb24gYXNzaWdubWVudHMgaW4gYGFzc2lnbm1lbnQucHMxYAEJKQIAAAkqAgAABisCAAAJcmVhZG1lLm1kBiwCAAAgw75uYW1lw75caW50ZXJuYWxcdGVwcFxyZWFkbWUubWQJQQAAAAkuAgAACS8CAAABwQEAACwAAAAGMAIAANUBIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHdoZXJlIHRoZSBmdW5jdGlvbiB0ZXN0cyBnby4NCg0KTWFrZSBzdXJlIHRvIHB1dCB0aGVtIGluIGZvbGRlcnMgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vZHVsZSBzdHJ1Y3R1cmUuDQoNCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGFuZCBwdWJsaWMgZnVuY3Rpb25zIGhlcmUuAQkxAgAACTICAAAGMwIAAAlyZWFkbWUubWQGNAIAACLDvm5hbWXDvlx0ZXN0c1xmdW5jdGlvbnNccmVhZG1lLm1kCUEAAAAJNgIAAAk3AgAAAcIBAAAsAAAABjgCAADMBCMgTGlzdCBvZiBmb3JiaWRkZW4gY29tbWFuZHMNCiRnbG9iYWw6QmFubmVkQ29tbWFuZHMgPSBAKA0KCSdXcml0ZS1Ib3N0JywNCgknV3JpdGUtVmVyYm9zZScsDQoJJ1dyaXRlLVdhcm5pbmcnLA0KCSdXcml0ZS1FcnJvcicsDQoJJ1dyaXRlLU91dHB1dCcsDQoJJ1dyaXRlLUluZm9ybWF0aW9uJywNCgknV3JpdGUtRGVidWcnDQopDQoNCjwjDQoJQ29udGFpbnMgbGlzdCBvZiBleGNlcHRpb25zIGZvciBiYW5uZWQgY21kbGV0cy4NCglJbnNlcnQgdGhlIGZpbGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBtYXkgY29udGFpbiB0aGVtLg0KCQ0KCUV4YW1wbGU6DQoJIldyaXRlLUhvc3QiICA9IEAoJ1dyaXRlLVBTRkhvc3RDb2xvci5wczEnLCdXcml0ZS1QU0ZNZXNzYWdlLnBzMScpDQojPg0KJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZCA9IEB7DQoJIldyaXRlLUhvc3QiICA9IEAoKQ0KCSJXcml0ZS1WZXJib3NlIiA9IEAoKQ0KCSJXcml0ZS1XYXJuaW5nIiA9IEAoKQ0KCSJXcml0ZS1FcnJvciIgID0gQCgpDQoJIldyaXRlLU91dHB1dCIgPSBAKCkNCgkiV3JpdGUtSW5mb3JtYXRpb24iID0gQCgpDQoJIldyaXRlLURlYnVnIiA9IEAoKQ0KfQEJOQIAAAk6AgAABjsCAAAcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQY8AgAAM8O+bmFtZcO+XHRlc3RzXGdlbmVyYWxcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQlBAAAACT4CAAAJPwIAAAHDAQAALAAAAAZAAgAAtBYkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi4iKS5QYXRoDQoNCi4gIiRQU1NjcmlwdFJvb3RcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMSINCg0KZnVuY3Rpb24gR2V0LUZpbGVFbmNvZGluZw0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkNCgkuREVTQ1JJUFRJT04NCgkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkNCgkuUEFSQU1FVEVSIFBhdGgNCgkJVGhlIGZpbGUgdG8gdGVzdA0KIz4NCglbQ21kbGV0QmluZGluZygpXQ0KCVBhcmFtICgNCgkJW1BhcmFtZXRlcihNYW5kYXRvcnkgPSAkVHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRUcnVlKV0NCgkJW0FsaWFzKCdGdWxsTmFtZScpXQ0KCQlbc3RyaW5nXQ0KCQkkUGF0aA0KCSkNCgkNCglbYnl0ZVtdXSRieXRlID0gZ2V0LWNvbnRlbnQgLUVuY29kaW5nIGJ5dGUgLVJlYWRDb3VudCA0IC1Ub3RhbENvdW50IDQgLVBhdGggJFBhdGgNCgkNCglpZiAoJGJ5dGVbMF0gLWVxIDB4ZWYgLWFuZCAkYnl0ZVsxXSAtZXEgMHhiYiAtYW5kICRieXRlWzJdIC1lcSAweGJmKSB7ICdVVEY4JyB9DQoJZWxzZWlmICgkYnl0ZVswXSAtZXEgMHhmZSAtYW5kICRieXRlWzFdIC1lcSAweGZmKSB7ICdVbmljb2RlJyB9DQoJZWxzZWlmICgkYnl0ZVswXSAtZXEgMCAtYW5kICRieXRlWzFdIC1lcSAwIC1hbmQgJGJ5dGVbMl0gLWVxIDB4ZmUgLWFuZCAkYnl0ZVszXSAtZXEgMHhmZikgeyAnVVRGMzInIH0NCgllbHNlaWYgKCRieXRlWzBdIC1lcSAweDJiIC1hbmQgJGJ5dGVbMV0gLWVxIDB4MmYgLWFuZCAkYnl0ZVsyXSAtZXEgMHg3NikgeyAnVVRGNycgfQ0KCWVsc2UgeyAnVW5rbm93biwgcG9zc2libGUgQVNDSUknIH0NCn0NCg0KRGVzY3JpYmUgIlZlcmlmeWluZyBpbnRlZ3JpdHkgb2YgbW9kdWxlIGZpbGVzIiB7DQoJQ29udGV4dCAiVmFsaWRhdGluZyBQUzEgU2NyaXB0IGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgLUZpbHRlciAiKi5wczEiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIiB7DQoJCQkJR2V0LUZpbGVFbmNvZGluZyAtUGF0aCAkZmlsZS5GdWxsTmFtZSB8IFNob3VsZCBCZSAnVVRGOCcNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwfSB8IE1lYXN1cmUtT2JqZWN0KS5Db3VudCB8IFNob3VsZCBCZSAwDQoJCQl9DQoJCQkNCgkJCSR0b2tlbnMgPSAkbnVsbA0KCQkJJHBhcnNlRXJyb3JzID0gJG51bGwNCgkJCSRhc3QgPSBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5MYW5ndWFnZS5QYXJzZXJdOjpQYXJzZUZpbGUoJGZpbGUuRnVsbE5hbWUsIFtyZWZdJHRva2VucywgW3JlZl0kcGFyc2VFcnJvcnMpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHN5bnRheCBlcnJvcnMiIHsNCgkJCQkkcGFyc2VFcnJvcnMgfCBTaG91bGQgQmUgJE51bGwNCgkJCX0NCgkJCQ0KCQkJZm9yZWFjaCAoJGNvbW1hbmQgaW4gJGdsb2JhbDpCYW5uZWRDb21tYW5kcykNCgkJCXsNCgkJCQlpZiAoJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZFsiJGNvbW1hbmQiXSAtbm90Y29udGFpbnMgJGZpbGUuTmFtZSkNCgkJCQl7DQoJCQkJCUl0ICJbJG5hbWVdIFNob3VsZCBub3QgdXNlICRjb21tYW5kIiB7DQoJCQkJCQkkdG9rZW5zIHwgV2hlcmUtT2JqZWN0IFRleHQgLUVRICRjb21tYW5kIHwgU2hvdWxkIEJlICRudWxsDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBub3QgY29udGFpbiBhbGlhc2VzIiB7DQoJCQkJJHRva2VucyB8IFdoZXJlLU9iamVjdCBUb2tlbkZsYWdzIC1lcSBDb21tYW5kTmFtZSB8IFdoZXJlLU9iamVjdCB7IFRlc3QtUGF0aCAiYWxpYXM6XCQoJF8uVGV4dCkiIH0gfCBNZWFzdXJlLU9iamVjdCB8IFNlbGVjdC1PYmplY3QgLUV4cGFuZFByb3BlcnR5IENvdW50IHwgU2hvdWxkIEJlIDANCgkJCX0NCgkJfQ0KCX0NCgkNCglDb250ZXh0ICJWYWxpZGF0aW5nIGhlbHAudHh0IGhlbHAgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSAtRmlsdGVyICIqLmhlbHAudHh0IiB8IFdoZXJlLU9iamVjdCBGdWxsTmFtZSAtTm90TGlrZSAiJG1vZHVsZVJvb3RcdGVzdHNcKiINCgkJDQoJCWZvcmVhY2ggKCRmaWxlIGluICRhbGxGaWxlcykNCgkJew0KCQkJJG5hbWUgPSAkZmlsZS5GdWxsTmFtZS5SZXBsYWNlKCIkbW9kdWxlUm9vdFwiLCAnJykNCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgVVRGOCBlbmNvZGluZyIgew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgQmUgJ1VURjgnDQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlIiB7DQoJCQkJKCRmaWxlIHwgU2VsZWN0LVN0cmluZyAiXHMkIiB8IFdoZXJlLU9iamVjdCB7ICRfLkxpbmUuVHJpbSgpLkxlbmd0aCAtZ3QgMCB9IHwgTWVhc3VyZS1PYmplY3QpLkNvdW50IHwgU2hvdWxkIEJlIDANCgkJCX0NCgkJfQ0KCX0NCn0BCUECAAAJQgIAAAZDAgAAF0ZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxBkQCAAAuw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LlRlc3RzLnBzMQlBAAAACUYCAAAJRwIAAAHEAQAALAAAAAZIAgAAnQUjIExpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCiRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgPSBAKA0KICAgIA0KKQ0KDQo8Iw0KICBMaXN0IG9mIGFycmF5ZWQgZW51bWVyYXRpb25zLiBUaGVzZSBuZWVkIHRvIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkuIEFkZCBmdWxsIG5hbWUuDQogIEV4YW1wbGU6DQoNCiAgIlNxbGNvbGxhYm9yYXRpdmUuRGJhdG9vbHMuQ29ubmVjdGlvbi5NYW5hZ2VtZW50Q29ubmVjdGlvblR5cGVbXSINCiM+DQokZ2xvYmFsOkhlbHBUZXN0RW51bWVyYXRlZEFycmF5cyA9IEAoDQoJDQopDQoNCjwjDQogIFNvbWUgdHlwZXMgb24gcGFyYW1ldGVycyBqdXN0IGZhaWwgdGhlaXIgdmFsaWRhdGlvbiBubyBtYXR0ZXIgd2hhdC4NCiAgRm9yIHRob3NlIGl0IGJlY29tZXMgcG9zc2libGUgdG8gc2tpcCB0aGVtLCBieSBhZGRpbmcgdGhlbSB0byB0aGlzIGhhc2h0YWJsZS4NCiAgQWRkIGJ5IGZvbGxvd2luZyB0aGlzIGNvbnZlbnRpb246IDxjb21tYW5kIG5hbWU+ID0gQCg8bGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXM+KQ0KICBFeGFtcGxlOg0KDQogICJHZXQtRGJhQ21PYmplY3QiICAgICAgID0gQCgiRG9Ob3RVc2UiKQ0KIz4NCiRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZSA9IEB7DQogICAgDQp9DQoBCUkCAAAJSgIAAAZLAgAAE0hlbHAuRXhjZXB0aW9ucy5wczEGTAIAACrDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXEhlbHAuRXhjZXB0aW9ucy5wczEJQQAAAAlOAgAACU8CAAABxQEAACwAAAAGUAIAAO5FPCMNCiAgICAuTk9URVMNCiAgICAgICAgVGhlIG9yaWdpbmFsIHRlc3QgdGhpcyBpcyBiYXNlZCB1cG9uIHdhcyB3cml0dGVuIGJ5IEp1bmUgQmxlbmRlci4NCgkJQWZ0ZXIgc2V2ZXJhbCByb3VuZHMgb2YgbW9kaWZpY2F0aW9ucyBpdCBzdGFuZHMgbm93IGFzIGl0IGlzLCBidXQgdGhlIGhvbm9yIHJlbWFpbnMgaGVycy4NCg0KCQlUaGFuayB5b3UgSnVuZSwgZm9yIGFsbCB5b3UgaGF2ZSBkb25lIQ0KDQogICAgLkRFU0NSSVBUSU9ODQoJCVRoaXMgdGVzdCBldmFsdWF0ZXMgdGhlIGhlbHAgZm9yIGFsbCBjb21tYW5kcyBpbiBhIG1vZHVsZS4NCg0KCS5QQVJBTUVURVIgU2tpcFRlc3QNCgkJRGlzYWJsZXMgdGhpcyB0ZXN0Lg0KCQ0KCS5QQVJBTUVURVIgQ29tbWFuZFBhdGgNCgkJTGlzdCBvZiBwYXRocyB1bmRlciB3aGljaCB0aGUgc2NyaXB0IGZpbGVzIGFyZSBzdG9yZWQuDQoJCVRoaXMgdGVzdCBhc3N1bWVzIHRoYXQgYWxsIGZ1bmN0aW9ucyBoYXZlIHRoZWlyIG93biBmaWxlIHRoYXQgaXMgbmFtZWQgYWZ0ZXIgdGhlbXNlbHZlcy4NCgkJVGhlc2UgcGF0aHMgYXJlIHVzZWQgdG8gc2VhcmNoIGZvciBjb21tYW5kcyB0aGF0IHNob3VsZCBleGlzdCBhbmQgYmUgdGVzdGVkLg0KCQlXaWxsIHNlYXJjaCByZWN1cnNpdmVseSBhbmQgYWNjZXB0cyB3aWxkY2FyZHMsIG1ha2Ugc3VyZSBvbmx5IGZ1bmN0aW9ucyBhcmUgZm91bmQNCg0KCS5QQVJBTUVURVIgTW9kdWxlTmFtZQ0KCQlOYW1lIG9mIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLg0KCQlUaGUgbW9kdWxlIG11c3QgYWxyZWFkeSBiZSBpbXBvcnRlZA0KDQoJLlBBUkFNRVRFUiBFeGNlcHRpb25zRmlsZQ0KCQlGaWxlIGluIHdoaWNoIGV4Y2VwdGlvbnMgYW5kIGFkanVzdG1lbnRzIGFyZSBjb25maWd1cmVkLg0KCQlJbiBpdCB0aGVyZSBzaG91bGQgYmUgdHdvIGFycmF5cyBhbmQgYSBoYXNodGFibGUgZGVmaW5lZDoNCgkJCSRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMNCgkJCSRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzDQoJCQkkZ2xvYmFsOkhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGUNCgkJVGhlc2UgY2FuIGJlIHVzZWQgdG8gdHdlYWsgdGhlIHRlc3RzIHNsaWdodGx5IGluIGNhc2VzIG9mIG5lZWQuDQoJCVNlZSB0aGUgZXhhbXBsZSBmaWxlIGZvciBleHBsYW5hdGlvbnMgb24gZWFjaCBvZiB0aGVzZSB1c2FnZSBhbmQgZWZmZWN0Lg0KIz4NCltDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRQU1NjcmlwdFJvb3RcLi5cLi5cZnVuY3Rpb25zIiwgIiRQU1NjcmlwdFJvb3RcLi5cLi5caW50ZXJuYWxcZnVuY3Rpb25zIiksDQoJDQoJW3N0cmluZ10NCgkkTW9kdWxlTmFtZSA9ICLDvm5hbWXDviIsDQoJDQoJW3N0cmluZ10NCgkkRXhjZXB0aW9uc0ZpbGUgPSAiJFBTU2NyaXB0Um9vdFxIZWxwLkV4Y2VwdGlvbnMucHMxIg0KKQ0KaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KLiAkRXhjZXB0aW9uc0ZpbGUNCg0KJGluY2x1ZGVkTmFtZXMgPSAoR2V0LUNoaWxkSXRlbSAkQ29tbWFuZFBhdGggLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiKS5CYXNlTmFtZQ0KJGNvbW1hbmRzID0gR2V0LUNvbW1hbmQgLU1vZHVsZSAoR2V0LU1vZHVsZSAkTW9kdWxlTmFtZSkgLUNvbW1hbmRUeXBlIENtZGxldCwgRnVuY3Rpb24sIFdvcmtmbG93IHwgV2hlcmUtT2JqZWN0IE5hbWUgLWluICRpbmNsdWRlZE5hbWVzDQoNCiMjIFdoZW4gdGVzdGluZyBoZWxwLCByZW1lbWJlciB0aGF0IGhlbHAgaXMgY2FjaGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZXNzaW9uLg0KIyMgVG8gdGVzdCwgcmVzdGFydCBzZXNzaW9uLg0KDQoNCmZvcmVhY2ggKCRjb21tYW5kIGluICRjb21tYW5kcykgew0KICAgICRjb21tYW5kTmFtZSA9ICRjb21tYW5kLk5hbWUNCiAgICANCiAgICAjIFNraXAgYWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSBvbiB0aGUgZXhjbHVzaW9ucyBsaXN0DQogICAgaWYgKCRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgLWNvbnRhaW5zICRjb21tYW5kTmFtZSkgeyBjb250aW51ZSB9DQogICAgDQogICAgIyBUaGUgbW9kdWxlLXF1YWxpZmllZCBjb21tYW5kIGZhaWxzIG9uIE1pY3Jvc29mdC5Qb3dlclNoZWxsLkFyY2hpdmUgY21kbGV0cw0KICAgICRIZWxwID0gR2V0LUhlbHAgJGNvbW1hbmROYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQogICAgJHRlc3RoZWxwZXJyb3JzID0gMA0KICAgICR0ZXN0aGVscGFsbCA9IDANCiAgICBEZXNjcmliZSAiVGVzdCBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmICgkSGVscC5TeW5vcHNpcyAtbGlrZSAnKmBbYDxDb21tb25QYXJhbWV0ZXJzYD5gXSonKSB7DQogICAgICAgICAgICAjIElmIGhlbHAgaXMgbm90IGZvdW5kLCBzeW5vcHNpcyBpbiBhdXRvLWdlbmVyYXRlZCBoZWxwIGlzIHRoZSBzeW50YXggZGlhZ3JhbQ0KICAgICAgICAgICAgSXQgInNob3VsZCBub3QgYmUgYXV0by1nZW5lcmF0ZWQiIHsNCiAgICAgICAgICAgICAgICAkSGVscC5TeW5vcHNpcyB8IFNob3VsZCBOb3QgQmVMaWtlICcqYFtgPENvbW1vblBhcmFtZXRlcnNgPmBdKicNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyArPSAxDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkSGVscC5EZXNjcmlwdGlvbi5UZXh0KSkgew0KICAgICAgICAgICAgIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgZnVuY3Rpb24NCiAgICAgICAgICAgIEl0ICJnZXRzIGRlc2NyaXB0aW9uIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAkSGVscC5EZXNjcmlwdGlvbiB8IFNob3VsZCBOb3QgQmVOdWxsT3JFbXB0eQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRlc3RoZWxwZXJyb3JzICs9IDENCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHRlc3RoZWxwYWxsICs9IDENCiAgICAgICAgaWYgKFtTdHJpbmddOjpJc051bGxPckVtcHR5KCgkSGVscC5FeGFtcGxlcy5FeGFtcGxlIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuQ29kZSkpIHsNCiAgICAgICAgICAgICMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlDQogICAgICAgICAgICBJdCAiZ2V0cyBleGFtcGxlIGNvZGUgZnJvbSAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZSB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLkNvZGUgfCBTaG91bGQgTm90IEJlTnVsbE9yRW1wdHkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyArPSAxDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZS5SZW1hcmtzIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuVGV4dCkpIHsNCiAgICAgICAgICAgICMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlIGRlc2NyaXB0aW9uDQogICAgICAgICAgICBJdCAiZ2V0cyBleGFtcGxlIGhlbHAgZnJvbSAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZS5SZW1hcmtzIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuVGV4dCB8IFNob3VsZCBOb3QgQmVOdWxsT3JFbXB0eQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRlc3RoZWxwZXJyb3JzICs9IDENCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKCR0ZXN0aGVscGVycm9ycyAtZXEgMCkgew0KICAgICAgICAgICAgSXQgIlJhbiBzaWxlbnRseSAkdGVzdGhlbHBhbGwgdGVzdHMiIHsNCiAgICAgICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgfCBTaG91bGQgYmUgMA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkdGVzdHBhcmFtc2FsbCA9IDANCiAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgPSAwDQogICAgICAgIENvbnRleHQgIlRlc3QgcGFyYW1ldGVyIGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgDQogICAgICAgICAgICAkQ29tbW9uID0gJ0RlYnVnJywgJ0Vycm9yQWN0aW9uJywgJ0Vycm9yVmFyaWFibGUnLCAnSW5mb3JtYXRpb25BY3Rpb24nLCAnSW5mb3JtYXRpb25WYXJpYWJsZScsICdPdXRCdWZmZXInLCAnT3V0VmFyaWFibGUnLA0KICAgICAgICAgICAgJ1BpcGVsaW5lVmFyaWFibGUnLCAnVmVyYm9zZScsICdXYXJuaW5nQWN0aW9uJywgJ1dhcm5pbmdWYXJpYWJsZScNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHBhcmFtZXRlcnMgPSAkY29tbWFuZC5QYXJhbWV0ZXJTZXRzLlBhcmFtZXRlcnMgfCBTb3J0LU9iamVjdCAtUHJvcGVydHkgTmFtZSAtVW5pcXVlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLW5vdGluICRjb21tb24NCiAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lcyA9ICRwYXJhbWV0ZXJzLk5hbWUNCiAgICAgICAgICAgICRIZWxwUGFyYW1ldGVyTmFtZXMgPSAkSGVscC5QYXJhbWV0ZXJzLlBhcmFtZXRlci5OYW1lIHwgU29ydC1PYmplY3QgLVVuaXF1ZQ0KICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmFtZXRlciBpbiAkcGFyYW1ldGVycykgew0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lID0gJHBhcmFtZXRlci5OYW1lDQogICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAgPSAkSGVscC5wYXJhbWV0ZXJzLnBhcmFtZXRlciB8IFdoZXJlLU9iamVjdCBOYW1lIC1FUSAkcGFyYW1ldGVyTmFtZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICBpZiAoW1N0cmluZ106OklzTnVsbE9yRW1wdHkoJHBhcmFtZXRlckhlbHAuRGVzY3JpcHRpb24uVGV4dCkpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgcGFyYW1ldGVyDQogICAgICAgICAgICAgICAgICAgIEl0ICJnZXRzIGhlbHAgZm9yIHBhcmFtZXRlcjogJHBhcmFtZXRlck5hbWUgOiBpbiAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwLkRlc2NyaXB0aW9uLlRleHQgfCBTaG91bGQgTm90IEJlTnVsbE9yRW1wdHkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICAkY29kZU1hbmRhdG9yeSA9ICRwYXJhbWV0ZXIuSXNNYW5kYXRvcnkudG9TdHJpbmcoKQ0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVySGVscC5SZXF1aXJlZCAtbmUgJGNvZGVNYW5kYXRvcnkpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBSZXF1aXJlZCB2YWx1ZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBJc01hbmRhdG9yeSBwcm9wZXJ0eSBvZiBwYXJhbWV0ZXINCiAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRwYXJhbWV0ZXJOYW1lIHBhcmFtZXRlciBpbiAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgTWFuZGF0b3J5IHZhbHVlIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscC5SZXF1aXJlZCB8IFNob3VsZCBCZSAkY29kZU1hbmRhdG9yeQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlWyRjb21tYW5kTmFtZV0gLWNvbnRhaW5zICRwYXJhbWV0ZXJOYW1lKSB7IGNvbnRpbnVlIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkY29kZVR5cGUgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuTmFtZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLklzRW51bSkgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlKQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSAtbmUgJG5hbWVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCBiZSAkbmFtZXMNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlaWYgKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5GdWxsTmFtZSAtaW4gJEhlbHBUZXN0RW51bWVyYXRlZEFycmF5cykgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9IFtFbnVtXTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkRlY2xhcmVkTWVtYmVyc1swXS5SZXR1cm5UeXBlKQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSAtbmUgJG5hbWVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCBiZSAkbmFtZXMNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBjYWxsaW5nIFRyaW0gbWV0aG9kIG9uIGEgbnVsbCBvYmplY3QuDQogICAgICAgICAgICAgICAgICAgICRoZWxwVHlwZSA9IGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZSkgeyAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZS5UcmltKCkgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJGhlbHBUeXBlIC1uZSAkY29kZVR5cGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVscFR5cGUgfCBTaG91bGQgYmUgJGNvZGVUeXBlDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3JlYWNoICgkaGVscFBhcm0gaW4gJEhlbHBQYXJhbWV0ZXJOYW1lcykgew0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICBpZiAoJGhlbHBQYXJtIC1ub3RpbiAkcGFyYW1ldGVyTmFtZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBTaG91bGRuJ3QgZmluZCBleHRyYSBwYXJhbWV0ZXJzIGluIGhlbHAuDQogICAgICAgICAgICAgICAgICAgIEl0ICJmaW5kcyBoZWxwIHBhcmFtZXRlciBpbiBjb2RlOiAkaGVscFBhcm0iIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoZWxwUGFybSAtaW4gJHBhcmFtZXRlck5hbWVzIHwgU2hvdWxkIEJlICR0cnVlDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgkdGVzdHBhcmFtc2Vycm9ycyAtZXEgMCkgew0KICAgICAgICAgICAgICAgIEl0ICJSYW4gc2lsZW50bHkgJHRlc3RwYXJhbXNhbGwgdGVzdHMiIHsNCiAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgfCBTaG91bGQgYmUgMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0BCVECAAAJUgIAAAZTAgAADkhlbHAuVGVzdHMucHMxBlQCAAAlw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxIZWxwLlRlc3RzLnBzMQlBAAAACVYCAAAJVwIAAAHGAQAALAAAAAZYAgAAsw1EZXNjcmliZSAiVmFsaWRhdGluZyB0aGUgbW9kdWxlIG1hbmlmZXN0IiB7DQoJJG1vZHVsZVJvb3QgPSAoUmVzb2x2ZS1QYXRoICIkUFNTY3JpcHRSb290XC4uXC4uIikuUGF0aA0KCSRtYW5pZmVzdCA9ICgoR2V0LUNvbnRlbnQgIiRtb2R1bGVSb290XMO+bmFtZcO+LnBzZDEiKSAtam9pbiAiYG4iKSB8IEludm9rZS1FeHByZXNzaW9uDQoJW3ZlcnNpb25dJG1vZHVsZVZlcnNpb24gPSBHZXQtSXRlbSAiJG1vZHVsZVJvb3Rcw75uYW1lw74ucHNtMSIgfCBTZWxlY3QtU3RyaW5nIC1QYXR0ZXJuICdcJHNjcmlwdDpQU01vZHVsZVZlcnNpb24gPSAiKC4qPykiJyB8IEZvckVhY2gtT2JqZWN0IHsgJF8uTWF0Y2hlc1swXS5Hcm91cHNbMV0uVmFsdWUgfQ0KCUNvbnRleHQgIkJhc2ljIHJlc291cmNlcyB2YWxpZGF0aW9uIiB7DQoJCUl0ICJFeHBvcnRzIGFsbCBmdW5jdGlvbnMgaW4gdGhlIHB1YmxpYyBmb2xkZXIiIHsNCgkJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiDQoJCQkkY291bnQgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0KS5Db3VudA0KCQkJJGNvdW50IHwgU2hvdWxkIGJlIDANCgkJfQ0KCQkNCgkJSXQgIkV4cG9ydHMgbm9uZSBvZiBpdHMgaW50ZXJuYWwgZnVuY3Rpb25zIiB7DQoJCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxpbnRlcm5hbFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIg0KCQkJJGZpbGVzIHwgV2hlcmUtT2JqZWN0IEJhc2VOYW1lIC1JbiAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBTaG91bGQgQmUgJG51bGwNCgkJfQ0KCQkNCgkJSXQgIkhhcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHRoZSBwc20xIGZpbGUiIHsNCgkJCShbdmVyc2lvbl0kbWFuaWZlc3QuTW9kdWxlVmVyc2lvbikgfCBTaG91bGQgQmUgJG1vZHVsZVZlcnNpb24NCgkJfQ0KCX0NCgkNCglDb250ZXh0ICJJbmRpdmlkdWFsIGZpbGUgdmFsaWRhdGlvbiIgew0KCQlJdCAiVGhlIHJvb3QgbW9kdWxlIGZpbGUgZXhpc3RzIiB7DQoJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCQoJG1hbmlmZXN0LlJvb3RNb2R1bGUpIiB8IFNob3VsZCBCZSAkdHJ1ZQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkZm9ybWF0IGluICRtYW5pZmVzdC5Gb3JtYXRzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJGZvcm1hdCBzaG91bGQgZXhpc3QiIHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCRmb3JtYXQiIHwgU2hvdWxkIEJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCR0eXBlIGluICRtYW5pZmVzdC5UeXBlc1RvUHJvY2VzcykNCgkJew0KCQkJSXQgIlRoZSBmaWxlICR0eXBlIHNob3VsZCBleGlzdCIgew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJHR5cGUiIHwgU2hvdWxkIEJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRhc3NlbWJseSBpbiAkbWFuaWZlc3QuUmVxdWlyZWRBc3NlbWJsaWVzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJGFzc2VtYmx5IHNob3VsZCBleGlzdCIgew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGFzc2VtYmx5IiB8IFNob3VsZCBCZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJfQ0KfQEJWQIAAAlaAgAABlsCAAASTWFuaWZlc3QuVGVzdHMucHMxBlwCAAApw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxNYW5pZmVzdC5UZXN0cy5wczEJQQAAAAleAgAACV8CAAABxwEAACwAAAAGYAIAAKcIW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCgkNCglbc3RyaW5nW11dDQoJJENvbW1hbmRQYXRoID0gQCgiJFBTU2NyaXB0Um9vdFwuLlwuLlxmdW5jdGlvbnMiLCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxpbnRlcm5hbFxmdW5jdGlvbnMiKQ0KKQ0KDQppZiAoJFNraXBUZXN0KSB7IHJldHVybiB9DQoNCmlmICgkZW52OkJVSUxEX0JVSUxEVVJJIC1saWtlICJ2c3RmcyoiKSB7IEluc3RhbGwtTW9kdWxlIFBTU2NyaXB0QW5hbHl6ZXIgLUZvcmNlIC1Ta2lwUHVibGlzaGVyQ2hlY2sgfQ0KDQokbGlzdCA9IE5ldy1PYmplY3QgU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdA0KDQpEZXNjcmliZSAnSW52b2tpbmcgUFNTY3JpcHRBbmFseXplciBhZ2FpbnN0IGNvbW1hbmRiYXNlJyB7DQoJJGNvbW1hbmRGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJENvbW1hbmRQYXRoIC1SZWN1cnNlIC1GaWx0ZXIgIioucHMxIg0KCSRzY3JpcHRBbmFseXplclJ1bGVzID0gR2V0LVNjcmlwdEFuYWx5emVyUnVsZQ0KCQ0KCWZvcmVhY2ggKCRmaWxlIGluICRjb21tYW5kRmlsZXMpDQoJew0KCQlDb250ZXh0ICJBbmFseXppbmcgJCgkZmlsZS5CYXNlTmFtZSkiIHsNCgkJCSRhbmFseXNpcyA9IEludm9rZS1TY3JpcHRBbmFseXplciAtUGF0aCAkZmlsZS5GdWxsTmFtZQ0KCQkJDQoJCQlmb3JFYWNoICgkcnVsZSBpbiAkc2NyaXB0QW5hbHl6ZXJSdWxlcykNCgkJCXsNCgkJCQlJdCAiU2hvdWxkIHBhc3MgJHJ1bGUiIHsNCgkJCQkJSWYgKCRhbmFseXNpcy5SdWxlTmFtZSAtY29udGFpbnMgJHJ1bGUpDQoJCQkJCXsNCgkJCQkJCSRhbmFseXNpcyB8IFdoZXJlLU9iamVjdCBSdWxlTmFtZSAtRVEgJHJ1bGUgLW91dHZhcmlhYmxlIGZhaWx1cmVzIHwgRm9yRWFjaC1PYmplY3QgeyAkbGlzdC5BZGQoJF8pIH0NCgkJCQkJCQ0KCQkJCQkJMSB8IFNob3VsZCBCZSAwDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkwIHwgU2hvdWxkIEJlIDANCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCg0KJGxpc3QgfCBPdXQtRGVmYXVsdAEJYQIAAAliAgAABmMCAAAaUFNTY3JpcHRBbmFseXplci5UZXN0cy5wczEGZAIAADHDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXFBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxCUEAAAAJZgIAAAlnAgAAAcwBAAALAAAACWgCAAABAAAAAQAAAAHQAQAACAAAAAl/AAAAAAAAAAAAAAAB0QEAAAgAAAAJfwAAAAAAAAAAAAAAAdIBAAALAAAACWoCAAAFAAAABQAAAAHWAQAACAAAAAl/AAAAAAAAAAAAAAAB1wEAAAgAAAAJfwAAAAAAAAAAAAAAAdkBAAAIAAAACWwCAAABAAAAAQAAAAHaAQAACAAAAAl/AAAAAAAAAAAAAAAB3gEAAAgAAAAJfwAAAAAAAAAAAAAAAd8BAAAIAAAACX8AAAAAAAAAAAAAAAHhAQAACAAAAAluAgAAAQAAAAEAAAAB4gEAAAgAAAAJfwAAAAAAAAAAAAAAAeYBAAAIAAAACXACAAABAAAAAQAAAAHnAQAACAAAAAl/AAAAAAAAAAAAAAAB6QEAAAgAAAAJcgIAAAEAAAABAAAAAeoBAAAIAAAACX8AAAAAAAAAAAAAAAHuAQAACAAAAAl/AAAAAAAAAAAAAAAB7wEAAAgAAAAJfwAAAAAAAAAAAAAAAfEBAAAIAAAACX8AAAAAAAAAAAAAAAHyAQAACAAAAAl/AAAAAAAAAAAAAAAB9gEAAAgAAAAJfwAAAAAAAAAAAAAAAfcBAAAIAAAACX8AAAAAAAAAAAAAAAH5AQAACAAAAAl/AAAAAAAAAAAAAAAB+gEAAAgAAAAJfwAAAAAAAAAAAAAAAf4BAAAIAAAACX8AAAAAAAAAAAAAAAH/AQAACAAAAAl/AAAAAAAAAAAAAAABAQIAAAgAAAAJdAIAAAIAAAACAAAAAQICAAAIAAAACXUCAAACAAAAAgAAAAEGAgAACAAAAAl/AAAAAAAAAAAAAAABBwIAAAgAAAAJfwAAAAAAAAAAAAAAAQkCAAAIAAAACX8AAAAAAAAAAAAAAAEKAgAACAAAAAl/AAAAAAAAAAAAAAABDgIAAAgAAAAJfwAAAAAAAAAAAAAAAQ8CAAAIAAAACX8AAAAAAAAAAAAAAAERAgAACAAAAAl/AAAAAAAAAAAAAAABEgIAAAgAAAAJfwAAAAAAAAAAAAAAARYCAAAIAAAACX8AAAAAAAAAAAAAAAEXAgAACAAAAAl/AAAAAAAAAAAAAAABGQIAAAgAAAAJdwIAAAEAAAABAAAAARoCAAAIAAAACX8AAAAAAAAAAAAAAAEeAgAACAAAAAl/AAAAAAAAAAAAAAABHwIAAAgAAAAJfwAAAAAAAAAAAAAAASECAAAIAAAACXkCAAABAAAAAQAAAAEiAgAACAAAAAl/AAAAAAAAAAAAAAABJgIAAAgAAAAJfwAAAAAAAAAAAAAAAScCAAAIAAAACX8AAAAAAAAAAAAAAAEpAgAACAAAAAl/AAAAAAAAAAAAAAABKgIAAAgAAAAJfwAAAAAAAAAAAAAAAS4CAAAIAAAACX8AAAAAAAAAAAAAAAEvAgAACAAAAAl/AAAAAAAAAAAAAAABMQIAAAgAAAAJfwAAAAAAAAAAAAAAATICAAAIAAAACX8AAAAAAAAAAAAAAAE2AgAACAAAAAl/AAAAAAAAAAAAAAABNwIAAAgAAAAJfwAAAAAAAAAAAAAAATkCAAAIAAAACX8AAAAAAAAAAAAAAAE6AgAACAAAAAl/AAAAAAAAAAAAAAABPgIAAAgAAAAJfwAAAAAAAAAAAAAAAT8CAAAIAAAACX8AAAAAAAAAAAAAAAFBAgAACAAAAAl/AAAAAAAAAAAAAAABQgIAAAgAAAAJfwAAAAAAAAAAAAAAAUYCAAAIAAAACX8AAAAAAAAAAAAAAAFHAgAACAAAAAl/AAAAAAAAAAAAAAABSQIAAAgAAAAJfwAAAAAAAAAAAAAAAUoCAAAIAAAACX8AAAAAAAAAAAAAAAFOAgAACAAAAAl/AAAAAAAAAAAAAAABTwIAAAgAAAAJfwAAAAAAAAAAAAAAAVECAAAIAAAACXsCAAABAAAAAQAAAAFSAgAACAAAAAl/AAAAAAAAAAAAAAABVgIAAAgAAAAJfwAAAAAAAAAAAAAAAVcCAAAIAAAACX8AAAAAAAAAAAAAAAFZAgAACAAAAAl9AgAAAQAAAAEAAAABWgIAAAgAAAAJfwAAAAAAAAAAAAAAAV4CAAAIAAAACX8AAAAAAAAAAAAAAAFfAgAACAAAAAl/AAAAAAAAAAAAAAABYQIAAAgAAAAJfwAAAAAAAAAAAAAAAWICAAAIAAAACX8AAAAAAAAAAAAAAAFmAgAACAAAAAl/AAAAAAAAAAAAAAABZwIAAAgAAAAJfwAAAAAAAAAAAAAAB2gCAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJfwIAAA0DB2oCAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJgAIAAAmBAgAACYICAAAJgwIAAAmEAgAADQMRbAIAAAQAAAAGhQIAAARuYW1lDQMRbgIAAAQAAAAGhgIAAARuYW1lDQMRcAIAAAQAAAAGhwIAAARuYW1lDQMRcgIAAAQAAAAGiAIAAARuYW1lDQMRdAIAAAQAAAAGiQIAAARuYW1lBooCAAAGYXV0aG9yDQIRdQIAAAQAAAAGiwIAAARkYXRlBowCAAAEeWVhcg0CEXcCAAAEAAAABo0CAAAEbmFtZQ0DEXkCAAAEAAAABo4CAAAEbmFtZQ0DEXsCAAAEAAAABo8CAAAEbmFtZQ0DEX0CAAAEAAAABpACAAAEbmFtZQ0DAX8CAAApAAAACZECAAAGkgIAAAVEZWJ1ZwaTAgAAI2xpYnJhcnlcw75uYW1lw75cw75uYW1lw75cYmluXERlYnVnCUEAAAAJlQIAAAmWAgAAAYACAAApAAAACZcCAAAGmAIAAAVEZWJ1ZwaZAgAAI2xpYnJhcnlcw75uYW1lw75cw75uYW1lw75cb2JqXERlYnVnCUEAAAAJmwIAAAmcAgAAAYECAAAsAAAABp0CAACkW3sNCiAgInZlcnNpb24iOiAzLA0KICAidGFyZ2V0cyI6IHsNCiAgICAiLk5FVFN0YW5kYXJkLFZlcnNpb249djIuMCI6IHsNCiAgICAgICJNaWNyb3NvZnQuTkVUQ29yZS5QbGF0Zm9ybXMvMS4xLjAiOiB7DQogICAgICAgICJ0eXBlIjogInBhY2thZ2UiLA0KICAgICAgICAiY29tcGlsZSI6IHsNCiAgICAgICAgICAibGliL25ldHN0YW5kYXJkMS4wL18uXyI6IHt9DQogICAgICAgIH0sDQogICAgICAgICJydW50aW1lIjogew0KICAgICAgICAgICJsaWIvbmV0c3RhbmRhcmQxLjAvXy5fIjoge30NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5LzIuMC4wIjogew0KICAgICAgICAidHlwZSI6ICJwYWNrYWdlIiwNCiAgICAgICAgImRlcGVuZGVuY2llcyI6IHsNCiAgICAgICAgICAiTWljcm9zb2Z0Lk5FVENvcmUuUGxhdGZvcm1zIjogIjEuMS4wIg0KICAgICAgICB9LA0KICAgICAgICAiY29tcGlsZSI6IHsNCiAgICAgICAgICAibGliL25ldHN0YW5kYXJkMS4wL18uXyI6IHt9DQogICAgICAgIH0sDQogICAgICAgICJydW50aW1lIjogew0KICAgICAgICAgICJsaWIvbmV0c3RhbmRhcmQxLjAvXy5fIjoge30NCiAgICAgICAgfSwNCiAgICAgICAgImJ1aWxkIjogew0KICAgICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9ORVRTdGFuZGFyZC5MaWJyYXJ5LnRhcmdldHMiOiB7fQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9LA0KICAibGlicmFyaWVzIjogew0KICAgICJNaWNyb3NvZnQuTkVUQ29yZS5QbGF0Zm9ybXMvMS4xLjAiOiB7DQogICAgICAic2hhNTEyIjogImt6MFBFVzJsaHF5Z2VoSS9kNlhzUENRekQ3ZmY3Z1VKYVZHUFZFVFg2MTFlYWRHc0EzQTg3N0dkU2xVMExSVk1DVEgvK1AzbzJpRFRhaytTMDhWMitBPT0iLA0KICAgICAgInR5cGUiOiAicGFja2FnZSIsDQogICAgICAicGF0aCI6ICJtaWNyb3NvZnQubmV0Y29yZS5wbGF0Zm9ybXMvMS4xLjAiLA0KICAgICAgImZpbGVzIjogWw0KICAgICAgICAiVGhpcmRQYXJ0eU5vdGljZXMudHh0IiwNCiAgICAgICAgImRvdG5ldF9saWJyYXJ5X2xpY2Vuc2UudHh0IiwNCiAgICAgICAgImxpYi9uZXRzdGFuZGFyZDEuMC9fLl8iLA0KICAgICAgICAibWljcm9zb2Z0Lm5ldGNvcmUucGxhdGZvcm1zLjEuMS4wLm51cGtnLnNoYTUxMiIsDQogICAgICAgICJtaWNyb3NvZnQubmV0Y29yZS5wbGF0Zm9ybXMubnVzcGVjIiwNCiAgICAgICAgInJ1bnRpbWUuanNvbiINCiAgICAgIF0NCiAgICB9LA0KICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5LzIuMC4wIjogew0KICAgICAgInNoYTUxMiI6ICI3am5iUlUrTDA4RlhLTXhxVWZseEVYdFZ5bVd2Tk9yUzh5SGd1OXM2RU04QW5yNlQvd0lYNG5aMDhqL3UzQXN6K3RDdWZwM1lWd0ZTRXZGVFBZbUJQQT09IiwNCiAgICAgICJ0eXBlIjogInBhY2thZ2UiLA0KICAgICAgInBhdGgiOiAibmV0c3RhbmRhcmQubGlicmFyeS8yLjAuMCIsDQogICAgICAiZmlsZXMiOiBbDQogICAgICAgICJMSUNFTlNFLlRYVCIsDQogICAgICAgICJUSElSRC1QQVJUWS1OT1RJQ0VTLlRYVCIsDQogICAgICAgICJidWlsZC9ORVRTdGFuZGFyZC5MaWJyYXJ5LnRhcmdldHMiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvTkVUU3RhbmRhcmQuTGlicmFyeS50YXJnZXRzIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9NaWNyb3NvZnQuV2luMzIuUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5BcHBDb250ZXh0LmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkNvbGxlY3Rpb25zLkNvbmN1cnJlbnQuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uQ29sbGVjdGlvbnMuTm9uR2VuZXJpYy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db2xsZWN0aW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db21wb25lbnRNb2RlbC5Db21wb3NpdGlvbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db21wb25lbnRNb2RlbC5FdmVudEJhc2VkQXN5bmMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uQ29tcG9uZW50TW9kZWwuUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5Db21wb25lbnRNb2RlbC5UeXBlQ29udmVydGVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkNvbXBvbmVudE1vZGVsLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkNvbnNvbGUuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uQ29yZS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EYXRhLkNvbW1vbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EYXRhLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLkNvbnRyYWN0cy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Zy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EaWFnbm9zdGljcy5GaWxlVmVyc2lvbkluZm8uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5EaWFnbm9zdGljcy5TdGFja1RyYWNlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRleHRXcml0ZXJUcmFjZUxpc3RlbmVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRvb2xzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRyYWNlU291cmNlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRpYWdub3N0aWNzLlRyYWNpbmcuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uRHJhd2luZy5QcmltaXRpdmVzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkRyYXdpbmcuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uRHluYW1pYy5SdW50aW1lLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkdsb2JhbGl6YXRpb24uQ2FsZW5kYXJzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkdsb2JhbGl6YXRpb24uRXh0ZW5zaW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5HbG9iYWxpemF0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwRmlsZS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5Db21wcmVzc2lvbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5GaWxlU3lzdGVtLkRyaXZlSW5mby5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5GaWxlU3lzdGVtLlByaW1pdGl2ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uSU8uRmlsZVN5c3RlbS5XYXRjaGVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLkZpbGVTeXN0ZW0uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uSU8uSXNvbGF0ZWRTdG9yYWdlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLk1lbW9yeU1hcHBlZEZpbGVzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLlBpcGVzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLklPLlVubWFuYWdlZE1lbW9yeVN0cmVhbS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5JTy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5MaW5xLkV4cHJlc3Npb25zLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLkxpbnEuUGFyYWxsZWwuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTGlucS5RdWVyeWFibGUuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTGlucS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuSHR0cC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuTmFtZVJlc29sdXRpb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTmV0Lk5ldHdvcmtJbmZvcm1hdGlvbi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuUGluZy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuUmVxdWVzdHMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTmV0LlNlY3VyaXR5LmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLk5ldC5Tb2NrZXRzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLk5ldC5XZWJIZWFkZXJDb2xsZWN0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLk5ldC5XZWJTb2NrZXRzLkNsaWVudC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuV2ViU29ja2V0cy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5OZXQuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uTnVtZXJpY3MuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uT2JqZWN0TW9kZWwuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUmVmbGVjdGlvbi5FeHRlbnNpb25zLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJlZmxlY3Rpb24uUHJpbWl0aXZlcy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SZWZsZWN0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJlc291cmNlcy5SZWFkZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlci5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SZXNvdXJjZXMuV3JpdGVyLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5WaXN1YWxDLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuRXh0ZW5zaW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SdW50aW1lLkhhbmRsZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuUnVudGltZUluZm9ybWF0aW9uLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlJ1bnRpbWUuTnVtZXJpY3MuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkZvcm1hdHRlcnMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLkpzb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlhtbC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uUnVudGltZS5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5TZWN1cml0eS5DbGFpbXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LkFsZ29yaXRobXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LkNzcC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuRW5jb2RpbmcuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlByaW1pdGl2ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXMuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlNlY3VyaXR5LlNlY3VyZVN0cmluZy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5TZXJ2aWNlTW9kZWwuV2ViLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRleHQuRW5jb2RpbmcuRXh0ZW5zaW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UZXh0LkVuY29kaW5nLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRocmVhZGluZy5PdmVybGFwcGVkLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRocmVhZGluZy5UYXNrcy5QYXJhbGxlbC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UaHJlYWRpbmcuVGFza3MuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UaHJlYWRpbmcuVGhyZWFkUG9vbC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5UaHJlYWRpbmcuVGltZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uVGhyZWFkaW5nLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlRyYW5zYWN0aW9ucy5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5WYWx1ZVR1cGxlLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLldlYi5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5XaW5kb3dzLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlhtbC5MaW5xLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlhtbC5SZWFkZXJXcml0ZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLlNlcmlhbGl6YXRpb24uZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLlhEb2N1bWVudC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5YbWwuWFBhdGguWERvY3VtZW50LmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLlhtbC5YUGF0aC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL1N5c3RlbS5YbWwuWG1sRG9jdW1lbnQuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLlhtbFNlcmlhbGl6ZXIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9TeXN0ZW0uWG1sLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvU3lzdGVtLmRsbCIsDQogICAgICAgICJidWlsZC9uZXRzdGFuZGFyZDIuMC9yZWYvbXNjb3JsaWIuZGxsIiwNCiAgICAgICAgImJ1aWxkL25ldHN0YW5kYXJkMi4wL3JlZi9uZXRzdGFuZGFyZC5kbGwiLA0KICAgICAgICAiYnVpbGQvbmV0c3RhbmRhcmQyLjAvcmVmL25ldHN0YW5kYXJkLnhtbCIsDQogICAgICAgICJsaWIvbmV0c3RhbmRhcmQxLjAvXy5fIiwNCiAgICAgICAgIm5ldHN0YW5kYXJkLmxpYnJhcnkuMi4wLjAubnVwa2cuc2hhNTEyIiwNCiAgICAgICAgIm5ldHN0YW5kYXJkLmxpYnJhcnkubnVzcGVjIg0KICAgICAgXQ0KICAgIH0NCiAgfSwNCiAgInByb2plY3RGaWxlRGVwZW5kZW5jeUdyb3VwcyI6IHsNCiAgICAiLk5FVFN0YW5kYXJkLFZlcnNpb249djIuMCI6IFsNCiAgICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5ID49IDIuMC4wIg0KICAgIF0NCiAgfSwNCiAgInBhY2thZ2VGb2xkZXJzIjogew0KICAgICJDOlxcVXNlcnNcXEZyaWVkcmljaFxcLm51Z2V0XFxwYWNrYWdlc1xcIjoge30sDQogICAgIkM6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxNaWNyb3NvZnQgU0RLc1xcTnVHZXRQYWNrYWdlc0ZhbGxiYWNrXFwiOiB7fSwNCiAgICAiQzpcXFByb2dyYW0gRmlsZXNcXGRvdG5ldFxcc2RrXFxOdUdldEZhbGxiYWNrRm9sZGVyIjoge30NCiAgfSwNCiAgInByb2plY3QiOiB7DQogICAgInZlcnNpb24iOiAiMS4wLjAiLA0KICAgICJyZXN0b3JlU2V0dGluZ3MiOiB7DQogICAgICAiaGlkZVdhcm5pbmdzQW5kRXJyb3JzIjogdHJ1ZQ0KICAgIH0sDQogICAgInJlc3RvcmUiOiB7DQogICAgICAicHJvamVjdFVuaXF1ZU5hbWUiOiAiRjpcXENvZGVcXEdpdGh1YlxcUFNNb2R1bGVEZXZlbG9wbWVudFxcdGVtcGxhdGVzXFxQU0ZQcm9qZWN0XFxsaWJyYXJ5XFzDvm5hbWXDvlxcw75uYW1lw75cXMO+bmFtZcO+LmNzcHJvaiIsDQogICAgICAicHJvamVjdE5hbWUiOiAiw75uYW1lw74iLA0KICAgICAgInByb2plY3RQYXRoIjogIkY6XFxDb2RlXFxHaXRodWJcXFBTTW9kdWxlRGV2ZWxvcG1lbnRcXHRlbXBsYXRlc1xcUFNGUHJvamVjdFxcbGlicmFyeVxcw75uYW1lw75cXMO+bmFtZcO+XFzDvm5hbWXDvi5jc3Byb2oiLA0KICAgICAgInBhY2thZ2VzUGF0aCI6ICJDOlxcVXNlcnNcXEZyaWVkcmljaFxcLm51Z2V0XFxwYWNrYWdlc1xcIiwNCiAgICAgICJvdXRwdXRQYXRoIjogIkY6XFxDb2RlXFxHaXRodWJcXFBTTW9kdWxlRGV2ZWxvcG1lbnRcXHRlbXBsYXRlc1xcUFNGUHJvamVjdFxcbGlicmFyeVxcw75uYW1lw75cXMO+bmFtZcO+XFxvYmpcXCIsDQogICAgICAicHJvamVjdFN0eWxlIjogIlBhY2thZ2VSZWZlcmVuY2UiLA0KICAgICAgImZhbGxiYWNrRm9sZGVycyI6IFsNCiAgICAgICAgIkM6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxNaWNyb3NvZnQgU0RLc1xcTnVHZXRQYWNrYWdlc0ZhbGxiYWNrXFwiLA0KICAgICAgICAiQzpcXFByb2dyYW0gRmlsZXNcXGRvdG5ldFxcc2RrXFxOdUdldEZhbGxiYWNrRm9sZGVyIg0KICAgICAgXSwNCiAgICAgICJjb25maWdGaWxlUGF0aHMiOiBbDQogICAgICAgICJDOlxcVXNlcnNcXEZyaWVkcmljaFxcQXBwRGF0YVxcUm9hbWluZ1xcTnVHZXRcXE51R2V0LkNvbmZpZyIsDQogICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcTnVHZXRcXENvbmZpZ1xcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5PZmZsaW5lLmNvbmZpZyIsDQogICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcTnVHZXRcXENvbmZpZ1xcTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5PZmZsaW5lLkZhbGxiYWNrLmNvbmZpZyINCiAgICAgIF0sDQogICAgICAib3JpZ2luYWxUYXJnZXRGcmFtZXdvcmtzIjogWw0KICAgICAgICAibmV0c3RhbmRhcmQyLjAiDQogICAgICBdLA0KICAgICAgInNvdXJjZXMiOiB7DQogICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcTWljcm9zb2Z0IFNES3NcXE51R2V0UGFja2FnZXNcXCI6IHt9LA0KICAgICAgICAiaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24iOiB7fQ0KICAgICAgfSwNCiAgICAgICJmcmFtZXdvcmtzIjogew0KICAgICAgICAibmV0c3RhbmRhcmQyLjAiOiB7DQogICAgICAgICAgInByb2plY3RSZWZlcmVuY2VzIjoge30NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJ3YXJuaW5nUHJvcGVydGllcyI6IHsNCiAgICAgICAgIndhcm5Bc0Vycm9yIjogWw0KICAgICAgICAgICJOVTE2MDUiDQogICAgICAgIF0NCiAgICAgIH0NCiAgICB9LA0KICAgICJmcmFtZXdvcmtzIjogew0KICAgICAgIm5ldHN0YW5kYXJkMi4wIjogew0KICAgICAgICAiZGVwZW5kZW5jaWVzIjogew0KICAgICAgICAgICJORVRTdGFuZGFyZC5MaWJyYXJ5Ijogew0KICAgICAgICAgICAgInN1cHByZXNzUGFyZW50IjogIkFsbCIsDQogICAgICAgICAgICAidGFyZ2V0IjogIlBhY2thZ2UiLA0KICAgICAgICAgICAgInZlcnNpb24iOiAiWzIuMC4wLCApIiwNCiAgICAgICAgICAgICJhdXRvUmVmZXJlbmNlZCI6IHRydWUNCiAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgICJpbXBvcnRzIjogWw0KICAgICAgICAgICJuZXQ0NjEiDQogICAgICAgIF0sDQogICAgICAgICJhc3NldFRhcmdldEZhbGxiYWNrIjogdHJ1ZSwNCiAgICAgICAgIndhcm4iOiB0cnVlDQogICAgICB9DQogICAgfQ0KICB9DQp9AQmeAgAACZ8CAAAGoAIAABNwcm9qZWN0LmFzc2V0cy5qc29uBqECAAAxbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxvYmpccHJvamVjdC5hc3NldHMuanNvbglBAAAACaMCAAAJpAIAAAGCAgAALAAAAAalAgAAlQF7DQogICJ2ZXJzaW9uIjogMSwNCiAgImRnU3BlY0hhc2giOiAianRSTUQzOWpsSnVQclJCWWlYVDRtZTBjOThoV2U4QWJKWUYwQlpxYWNSSXk4bktnbjJXVWFlOWJrMms5M0JqNmk3eGR4MDF1VXpkWjlZVDd1UGtPSUE9PSIsDQogICJzdWNjZXNzIjogdHJ1ZQ0KfQEJpgIAAAmnAgAABqgCAAAbw75uYW1lw74uY3Nwcm9qLm51Z2V0LmNhY2hlBqkCAAA5bGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxvYmpcw75uYW1lw74uY3Nwcm9qLm51Z2V0LmNhY2hlCUEAAAAJqwIAAAmsAgAAAYMCAAAsAAAABq0CAACHCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiBzdGFuZGFsb25lPSJubyI/Pg0KPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCiAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoRXhjbHVkZVJlc3RvcmVQYWNrYWdlSW1wb3J0cyknICE9ICd0cnVlJyAiPg0KICAgIDxSZXN0b3JlU3VjY2VzcyBDb25kaXRpb249IiAnJChSZXN0b3JlU3VjY2VzcyknID09ICcnICI+VHJ1ZTwvUmVzdG9yZVN1Y2Nlc3M+DQogICAgPFJlc3RvcmVUb29sIENvbmRpdGlvbj0iICckKFJlc3RvcmVUb29sKScgPT0gJycgIj5OdUdldDwvUmVzdG9yZVRvb2w+DQogICAgPFByb2plY3RBc3NldHNGaWxlIENvbmRpdGlvbj0iICckKFByb2plY3RBc3NldHNGaWxlKScgPT0gJycgIj5GOlxDb2RlXEdpdGh1YlxQU01vZHVsZURldmVsb3BtZW50XHRlbXBsYXRlc1xQU0ZQcm9qZWN0XGxpYnJhcnlcw75uYW1lw75cw75uYW1lw75cb2JqXHByb2plY3QuYXNzZXRzLmpzb248L1Byb2plY3RBc3NldHNGaWxlPg0KICAgIDxOdUdldFBhY2thZ2VSb290IENvbmRpdGlvbj0iICckKE51R2V0UGFja2FnZVJvb3QpJyA9PSAnJyAiPiQoVXNlclByb2ZpbGUpXC5udWdldFxwYWNrYWdlc1w8L051R2V0UGFja2FnZVJvb3Q+DQogICAgPE51R2V0UGFja2FnZUZvbGRlcnMgQ29uZGl0aW9uPSIgJyQoTnVHZXRQYWNrYWdlRm9sZGVycyknID09ICcnICI+QzpcVXNlcnNcRnJpZWRyaWNoXC5udWdldFxwYWNrYWdlc1w7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgU0RLc1xOdUdldFBhY2thZ2VzRmFsbGJhY2tcO0M6XFByb2dyYW0gRmlsZXNcZG90bmV0XHNka1xOdUdldEZhbGxiYWNrRm9sZGVyPC9OdUdldFBhY2thZ2VGb2xkZXJzPg0KICAgIDxOdUdldFByb2plY3RTdHlsZSBDb25kaXRpb249IiAnJChOdUdldFByb2plY3RTdHlsZSknID09ICcnICI+UGFja2FnZVJlZmVyZW5jZTwvTnVHZXRQcm9qZWN0U3R5bGU+DQogICAgPE51R2V0VG9vbFZlcnNpb24gQ29uZGl0aW9uPSIgJyQoTnVHZXRUb29sVmVyc2lvbiknID09ICcnICI+NC41LjA8L051R2V0VG9vbFZlcnNpb24+DQogIDwvUHJvcGVydHlHcm91cD4NCiAgPFByb3BlcnR5R3JvdXA+DQogICAgPE1TQnVpbGRBbGxQcm9qZWN0cz4kKE1TQnVpbGRBbGxQcm9qZWN0cyk7JChNU0J1aWxkVGhpc0ZpbGVGdWxsUGF0aCk8L01TQnVpbGRBbGxQcm9qZWN0cz4NCiAgPC9Qcm9wZXJ0eUdyb3VwPg0KPC9Qcm9qZWN0PgEJrgIAAAmvAgAABrACAAAdw75uYW1lw74uY3Nwcm9qLm51Z2V0LmcucHJvcHMGsQIAADtsaWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XG9ialzDvm5hbWXDvi5jc3Byb2oubnVnZXQuZy5wcm9wcwlBAAAACbMCAAAJtAIAAAGEAgAALAAAAAa1AgAApgU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgc3RhbmRhbG9uZT0ibm8iPz4NCjxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQogIDxQcm9wZXJ0eUdyb3VwPg0KICAgIDxNU0J1aWxkQWxsUHJvamVjdHM+JChNU0J1aWxkQWxsUHJvamVjdHMpOyQoTVNCdWlsZFRoaXNGaWxlRnVsbFBhdGgpPC9NU0J1aWxkQWxsUHJvamVjdHM+DQogIDwvUHJvcGVydHlHcm91cD4NCiAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iICckKEV4Y2x1ZGVSZXN0b3JlUGFja2FnZUltcG9ydHMpJyAhPSAndHJ1ZScgIj4NCiAgICA8SW1wb3J0IFByb2plY3Q9IkM6XFByb2dyYW0gRmlsZXNcZG90bmV0XHNka1xOdUdldEZhbGxiYWNrRm9sZGVyXG5ldHN0YW5kYXJkLmxpYnJhcnlcMi4wLjBcYnVpbGRcbmV0c3RhbmRhcmQyLjBcTkVUU3RhbmRhcmQuTGlicmFyeS50YXJnZXRzIiBDb25kaXRpb249IkV4aXN0cygnQzpcUHJvZ3JhbSBGaWxlc1xkb3RuZXRcc2RrXE51R2V0RmFsbGJhY2tGb2xkZXJcbmV0c3RhbmRhcmQubGlicmFyeVwyLjAuMFxidWlsZFxuZXRzdGFuZGFyZDIuMFxORVRTdGFuZGFyZC5MaWJyYXJ5LnRhcmdldHMnKSIgLz4NCiAgPC9JbXBvcnRHcm91cD4NCjwvUHJvamVjdD4BCbYCAAAJtwIAAAa4AgAAH8O+bmFtZcO+LmNzcHJvai5udWdldC5nLnRhcmdldHMGuQIAAD1saWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XG9ialzDvm5hbWXDvi5jc3Byb2oubnVnZXQuZy50YXJnZXRzCUEAAAAJuwIAAAm8AgAAAZECAAALAAAACfAAAAAAAAAAAAAAAAGVAgAACAAAAAl/AAAAAAAAAAAAAAABlgIAAAgAAAAJfwAAAAAAAAAAAAAAAZcCAAALAAAACfAAAAAAAAAAAAAAAAGbAgAACAAAAAl/AAAAAAAAAAAAAAABnAIAAAgAAAAJfwAAAAAAAAAAAAAAAZ4CAAAIAAAACcECAAABAAAAAQAAAAGfAgAACAAAAAl/AAAAAAAAAAAAAAABowIAAAgAAAAJfwAAAAAAAAAAAAAAAaQCAAAIAAAACX8AAAAAAAAAAAAAAAGmAgAACAAAAAl/AAAAAAAAAAAAAAABpwIAAAgAAAAJfwAAAAAAAAAAAAAAAasCAAAIAAAACcMCAAABAAAAAQAAAAGsAgAACAAAAAl/AAAAAAAAAAAAAAABrgIAAAgAAAAJxQIAAAEAAAABAAAAAa8CAAAIAAAACX8AAAAAAAAAAAAAAAGzAgAACAAAAAnHAgAAAQAAAAEAAAABtAIAAAgAAAAJfwAAAAAAAAAAAAAAAbYCAAAIAAAACX8AAAAAAAAAAAAAAAG3AgAACAAAAAl/AAAAAAAAAAAAAAABuwIAAAgAAAAJyQIAAAEAAAABAAAAAbwCAAAIAAAACX8AAAAAAAAAAAAAABHBAgAABAAAAAbLAgAABG5hbWUNAxHDAgAABAAAAAbMAgAABG5hbWUNAxHFAgAABAAAAAbNAgAABG5hbWUNAxHHAgAABAAAAAbOAgAABG5hbWUNAxHJAgAABAAAAAbPAgAABG5hbWUNAws=</BA>
    </MS>
  </Obj>
</Objs>