internal/templates/PSFLoggingProvider-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">PSFLoggingProvider</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>File</ToString>
        <I32>0</I32>
      </Obj>
      <Version N="Version">1.0.0.0</Version>
      <S N="Description">A Custom Logfile Provider</S>
      <S N="Author">Friedrich Weinmann</S>
      <DT N="CreatedOn">2020-05-30T00:00:00+00: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>logging</S>
          <S>provider</S>
          <S>file</S>
        </LST>
      </Obj>
      <Obj N="Parameters" RefId="3">
        <TNRef RefId="2" />
        <LST>
          <S>name</S>
          <S>module</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 />
      </Obj>
      <Obj N="Children" RefId="5">
        <TN RefId="4">
          <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="6">
            <TN RefId="5">
              <T>PSModuleDevelopment.Template.TemplateItemFile</T>
              <T>PSModuleDevelopment.Template.TemplateItemBase</T>
              <T>System.Object</T>
            </TN>
            <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString>
            <Props>
              <S N="Value"># Action that is performed on registration of the provider using Register-PSFLoggingProvider_x000D__x000A_$registrationEvent = {_x000D__x000A__x0009__x000D__x000A_}_x000D__x000A__x000D__x000A_#region Logging Execution_x000D__x000A_# Action that is performed when starting the logging script (or the very first time if enabled after launching the logging script)_x000D__x000A_$begin_event = {_x000D__x000A__x0009_function Get-þnameþPath_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_[CmdletBinding()]_x000D__x000A__x0009__x0009_param (_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009_)_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_$path = Get-PSFConfigValue -FullName 'þmoduleþ.Logging.þnameþ.FilePath'_x000D__x000A__x0009__x0009_$logname = Get-PSFConfigValue -FullName 'þmoduleþ.Logging.þnameþ.LogName'_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_$scriptBlock = {_x000D__x000A__x0009__x0009__x0009_param (_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$Match_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_$hash = @{_x000D__x000A__x0009__x0009__x0009__x0009_'%date%' = (Get-Date -Format 'yyyy-MM-dd')_x000D__x000A__x0009__x0009__x0009__x0009_'%dayofweek%' = (Get-Date).DayOfWeek_x000D__x000A__x0009__x0009__x0009__x0009_'%day%' = (Get-Date).Day_x000D__x000A__x0009__x0009__x0009__x0009_'%hour%' = (Get-Date).Hour_x000D__x000A__x0009__x0009__x0009__x0009_'%minute%' = (Get-Date).Minute_x000D__x000A__x0009__x0009__x0009__x0009_'%username%' = $env:USERNAME_x000D__x000A__x0009__x0009__x0009__x0009_'%userdomain%' = $env:USERDOMAIN_x000D__x000A__x0009__x0009__x0009__x0009_'%computername%' = $env:COMPUTERNAME_x000D__x000A__x0009__x0009__x0009__x0009_'%processid%' = $PID_x000D__x000A__x0009__x0009__x0009__x0009_'%logname%' = $logname_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_$hash.$Match_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_[regex]::Replace($path, '%day%|%computername%|%hour%|%processid%|%date%|%username%|%dayofweek%|%minute%|%userdomain%|%logname%', $scriptBlock)_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_function Write-þnameþMessage_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_[CmdletBinding()]_x000D__x000A__x0009__x0009_param (_x000D__x000A__x0009__x0009__x0009_[Parameter(ValueFromPipeline = $true)]_x000D__x000A__x0009__x0009__x0009_$Message,_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009_$IncludeHeader,_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009_$FileType,_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009_$Path,_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009_$CsvDelimiter,_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009_$Headers_x000D__x000A__x0009__x0009_)_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_$parent = Split-Path $Path_x000D__x000A__x0009__x0009_if (-not (Test-Path $parent))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$null = New-Item $parent -ItemType Directory -Force_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_$fileExists = Test-Path $Path_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_#region Type-Based Output_x000D__x000A__x0009__x0009_switch ($FileType)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_#region Csv_x000D__x000A__x0009__x0009__x0009_"Csv"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_if ((-not $fileExists) -and $IncludeHeader) { $Message | ConvertTo-Csv -NoTypeInformation -Delimiter $CsvDelimiter | Set-Content -Path $Path -Encoding UTF8 }_x000D__x000A__x0009__x0009__x0009__x0009_else { $Message | ConvertTo-Csv -NoTypeInformation -Delimiter $CsvDelimiter | Select-Object -Skip 1 | Add-Content -Path $Path -Encoding UTF8 }_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_#endregion Csv_x000D__x000A__x0009__x0009__x0009_#region Json_x000D__x000A__x0009__x0009__x0009_"Json"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_if ($fileExists) { Add-Content -Path $Path -Value "," -Encoding UTF8 }_x000D__x000A__x0009__x0009__x0009__x0009_$Message | ConvertTo-Json | Add-Content -Path $Path -NoNewline -Encoding UTF8_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_#endregion Json_x000D__x000A__x0009__x0009__x0009_#region XML_x000D__x000A__x0009__x0009__x0009_"XML"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_[xml]$xml = $message | ConvertTo-Xml -NoTypeInformation_x000D__x000A__x0009__x0009__x0009__x0009_$xml.Objects.InnerXml | Add-Content -Path $Path -Encoding UTF8_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_#endregion XML_x000D__x000A__x0009__x0009__x0009_#region Html_x000D__x000A__x0009__x0009__x0009_"Html"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_[xml]$xml = $message | ConvertTo-Html -Fragment_x000D__x000A__x0009__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009__x0009_if ((-not $fileExists) -and $IncludeHeader)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$xml.table.tr[0].OuterXml | Add-Content -Path $Path -Encoding UTF8_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x000D__x000A__x0009__x0009__x0009__x0009_$xml.table.tr[1].OuterXml | Add-Content -Path $Path -Encoding UTF8_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_#endregion Html_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_#endregion Type-Based Output_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_$þnameþ_includeheader = Get-PSFConfigValue -FullName 'þmoduleþ.Logging.þnameþ.IncludeHeader'_x000D__x000A__x0009_$þnameþ_headers = Get-PSFConfigValue -FullName 'þmoduleþ.Logging.þnameþ.Headers'_x000D__x000A__x0009_$þnameþ_filetype = Get-PSFConfigValue -FullName 'þmoduleþ.Logging.þnameþ.FileType'_x000D__x000A__x0009_$þnameþ_CsvDelimiter = Get-PSFConfigValue -FullName 'þmoduleþ.Logging.þnameþ.CsvDelimiter'_x000D__x000A__x0009__x000D__x000A__x0009_if ($þnameþ_headers -contains 'Tags')_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_$þnameþ_headers = $þnameþ_headers | ForEach-Object {_x000D__x000A__x0009__x0009__x0009_switch ($_)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_'Tags'_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_@{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Name_x0009_ = 'Tags'_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Expression = { $_.Tags -join "," }_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_'Message'_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_@{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Name_x0009_ = 'Message'_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Expression = { $_.LogMessage }_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_default { $_ }_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_$þnameþ_paramWriteLogFileMessage = @{_x000D__x000A__x0009__x0009_IncludeHeader = $þnameþ_includeheader_x000D__x000A__x0009__x0009_FileType_x0009__x0009_ = $þnameþ_filetype_x000D__x000A__x0009__x0009_CsvDelimiter_x0009_ = $þnameþ_CsvDelimiter_x000D__x000A__x0009__x0009_Headers_x0009__x0009_ = $þnameþ_headers_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A__x000D__x000A_# Action that is performed at the beginning of each logging cycle_x000D__x000A_$start_event = {_x000D__x000A__x0009_$þnameþ_paramWriteLogFileMessage["Path"] = Get-þnameþPath_x000D__x000A_}_x000D__x000A__x000D__x000A_# Action that is performed for each message item that is being logged_x000D__x000A_$message_Event = {_x000D__x000A__x0009_Param (_x000D__x000A__x0009__x0009_$Message_x000D__x000A__x0009_)_x000D__x000A__x0009__x000D__x000A__x0009_$Message | Select-Object $þnameþ_headers | Write-þnameþMessage @þnameþ_paramWriteLogFileMessage_x000D__x000A_}_x000D__x000A__x000D__x000A_# Action that is performed for each error item that is being logged_x000D__x000A_$error_Event = {_x000D__x000A__x0009_Param (_x000D__x000A__x0009__x0009_$ErrorItem_x000D__x000A__x0009_)_x000D__x000A__x0009__x000D__x000A__x0009__x000D__x000A_}_x000D__x000A__x000D__x000A_# Action that is performed at the end of each logging cycle_x000D__x000A_$end_event = {_x000D__x000A__x0009__x000D__x000A_}_x000D__x000A__x000D__x000A_# Action that is performed when stopping the logging script_x000D__x000A_$final_event = {_x000D__x000A__x0009__x000D__x000A_}_x000D__x000A_#endregion Logging Execution_x000D__x000A__x000D__x000A_#region Function Extension / Integration_x000D__x000A_# Script that generates the necessary dynamic parameter for Set-PSFLoggingProvider_x000D__x000A_$configurationParameters = {_x000D__x000A__x0009_$configroot = "þmoduleþ.Logging.þnameþ"_x000D__x000A__x0009__x000D__x000A__x0009_$configurations = Get-PSFConfig -FullName "$configroot.*"_x000D__x000A__x0009__x000D__x000A__x0009_$RuntimeParamDic = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary_x000D__x000A__x0009__x000D__x000A__x0009_foreach ($config in $configurations)_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_$ParamAttrib = New-Object System.Management.Automation.ParameterAttribute_x000D__x000A__x0009__x0009_$ParamAttrib.ParameterSetName = '__AllParameterSets'_x000D__x000A__x0009__x0009_$AttribColl = New-Object System.Collections.ObjectModel.Collection[System.Attribute]_x000D__x000A__x0009__x0009_$AttribColl.Add($ParamAttrib)_x000D__x000A__x0009__x0009_$RuntimeParam = New-Object System.Management.Automation.RuntimeDefinedParameter(($config.FullName.Replace($configroot, "").Trim(".")), $config.Value.GetType(), $AttribColl)_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_$RuntimeParamDic.Add(($config.FullName.Replace($configroot, "").Trim(".")), $RuntimeParam)_x000D__x000A__x0009_}_x000D__x000A__x0009_return $RuntimeParamDic_x000D__x000A_}_x000D__x000A__x000D__x000A_# Script that is executes when configuring the provider using Set-PSFLoggingProvider_x000D__x000A_$configurationScript = {_x000D__x000A__x0009_$configroot = "þmoduleþ.Logging.þnameþ"_x000D__x000A__x0009__x000D__x000A__x0009_$configurations = Get-PSFConfig -FullName "$configroot.*"_x000D__x000A__x0009__x000D__x000A__x0009_foreach ($config in $configurations)_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_if ($PSBoundParameters.ContainsKey(($config.FullName.Replace($configroot, "").Trim("."))))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_Set-PSFConfig -Module $config.Module -Name $config.Name -Value $PSBoundParameters[($config.FullName.Replace($configroot, "").Trim("."))]_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A__x000D__x000A_# Script that returns a boolean value. "True" if all prerequisites are installed, "False" if installation is required_x000D__x000A_$isInstalledScript = {_x000D__x000A__x0009_return $true_x000D__x000A_}_x000D__x000A__x000D__x000A_# Script that provides dynamic parameter for Install-PSFLoggingProvider_x000D__x000A_$installationParameters = {_x000D__x000A__x0009_# None needed_x000D__x000A_}_x000D__x000A__x000D__x000A_# Script that performs the actual installation, based on the parameters (if any) specified in the $installationParameters script_x000D__x000A_$installationScript = {_x000D__x000A__x0009_# Nothing to be done - if you need to install your filesystem, you probably have other issues you need to deal with first ;)_x000D__x000A_}_x000D__x000A_#endregion Function Extension / Integration_x000D__x000A__x000D__x000A_# Configuration settings to initialize_x000D__x000A_$configuration_Settings = {_x000D__x000A__x0009_Set-PSFConfig -Module þmoduleþ -Name 'Logging.þnameþ.FilePath' -Value "" -Initialize -Validation string -Handler { } -Description "The path to where the logfile is written. Supports some placeholders such as %Date% to allow for timestamp in the name. For full documentation on the supported wildcards, see the documentation on https://psframework.org"_x000D__x000A__x0009_Set-PSFConfig -Module þmoduleþ -Name 'Logging.þnameþ.Logname' -Value "" -Initialize -Validation string -Handler { } -Description "A special string you can use as a placeholder in the logfile path (by using '%logname%' as placeholder)"_x000D__x000A__x0009_Set-PSFConfig -Module þmoduleþ -Name 'Logging.þnameþ.IncludeHeader' -Value $true -Initialize -Validation bool -Handler { } -Description "Whether a written csv file will include headers"_x000D__x000A__x0009_Set-PSFConfig -Module þmoduleþ -Name 'Logging.þnameþ.Headers' -Value @('ComputerName', 'File', 'FunctionName', 'Level', 'Line', 'Message', 'ModuleName', 'Runspace', 'Tags', 'TargetObject', 'Timestamp', 'Type', 'Username') -Initialize -Validation stringarray -Handler { } -Description "The properties to export, in the order to select them."_x000D__x000A__x0009_Set-PSFConfig -Module þmoduleþ -Name 'Logging.þnameþ.FileType' -Value "CSV" -Initialize -Validation psframework.logfilefiletype -Handler { } -Description "In what format to write the logfile. Supported styles: CSV, XML, Html or Json. Html, XML and Json will be written as fragments."_x000D__x000A__x0009_Set-PSFConfig -Module þmoduleþ -Name 'Logging.þnameþ.CsvDelimiter' -Value "," -Initialize -Validation string -Handler { } -Description "The delimiter to use when writing to csv."_x000D__x000A__x0009__x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.Enabled' -Value $false -Initialize -Validation "bool" -Handler { if ([PSFramework.Logging.ProviderHost]::Providers['þnameþ']) { [PSFramework.Logging.ProviderHost]::Providers['þnameþ'].Enabled = $args[0] } } -Description "Whether the logging provider should be enabled on registration"_x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.AutoInstall' -Value $false -Initialize -Validation "bool" -Handler { } -Description "Whether the logging provider should be installed on registration"_x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.InstallOptional' -Value $true -Initialize -Validation "bool" -Handler { } -Description "Whether installing the logging provider is mandatory, in order for it to be enabled"_x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.IncludeModules' -Value @() -Initialize -Validation "stringarray" -Handler { if ([PSFramework.Logging.ProviderHost]::Providers['þnameþ']) { [PSFramework.Logging.ProviderHost]::Providers['þnameþ'].IncludeModules = ($args[0] | Write-Output) } } -Description "Module whitelist. Only messages from listed modules will be logged"_x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.ExcludeModules' -Value @() -Initialize -Validation "stringarray" -Handler { if ([PSFramework.Logging.ProviderHost]::Providers['þnameþ']) { [PSFramework.Logging.ProviderHost]::Providers['þnameþ'].ExcludeModules = ($args[0] | Write-Output) } } -Description "Module blacklist. Messages from listed modules will not be logged"_x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.IncludeTags' -Value @() -Initialize -Validation "stringarray" -Handler { if ([PSFramework.Logging.ProviderHost]::Providers['þnameþ']) { [PSFramework.Logging.ProviderHost]::Providers['þnameþ'].IncludeTags = ($args[0] | Write-Output) } } -Description "Tag whitelist. Only messages with these tags will be logged"_x000D__x000A__x0009_Set-PSFConfig -Module LoggingProvider -Name 'þnameþ.ExcludeTags' -Value @() -Initialize -Validation "stringarray" -Handler { if ([PSFramework.Logging.ProviderHost]::Providers['þnameþ']) { [PSFramework.Logging.ProviderHost]::Providers['þnameþ'].ExcludeTags = ($args[0] | Write-Output) } } -Description "Tag blacklist. Messages with these tags will not be logged"_x000D__x000A_}_x000D__x000A__x000D__x000A_Register-PSFLoggingProvider -Name "þnameþ" -RegistrationEvent $registrationEvent -BeginEvent $begin_event -StartEvent $start_event -MessageEvent $message_Event -ErrorEvent $error_Event -EndEvent $end_event -FinalEvent $final_event -ConfigurationParameters $configurationParameters -ConfigurationScript $configurationScript -IsInstalledScript $isInstalledScript -InstallationScript $installationScript -InstallationParameters $installationParameters -ConfigurationSettings $configuration_Settings</S>
              <B N="PlainText">true</B>
              <Obj N="ContentParameterFlat" RefId="7">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                  <S>module</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="8">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">þnameþ.provider.ps1</S>
              <S N="RelativePath"></S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="9">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="10">
                <TNRef RefId="2" />
                <LST />
              </Obj>
            </Props>
            <MS>
              <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAA/FYjIEFjdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCBvbiByZWdpc3RyYXRpb24gb2YgdGhlIHByb3ZpZGVyIHVzaW5nIFJlZ2lzdGVyLVBTRkxvZ2dpbmdQcm92aWRlcg0KJHJlZ2lzdHJhdGlvbkV2ZW50ID0gew0KCQ0KfQ0KDQojcmVnaW9uIExvZ2dpbmcgRXhlY3V0aW9uDQojIEFjdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCB3aGVuIHN0YXJ0aW5nIHRoZSBsb2dnaW5nIHNjcmlwdCAob3IgdGhlIHZlcnkgZmlyc3QgdGltZSBpZiBlbmFibGVkIGFmdGVyIGxhdW5jaGluZyB0aGUgbG9nZ2luZyBzY3JpcHQpDQokYmVnaW5fZXZlbnQgPSB7DQoJZnVuY3Rpb24gR2V0LcO+bmFtZcO+UGF0aA0KCXsNCgkJW0NtZGxldEJpbmRpbmcoKV0NCgkJcGFyYW0gKA0KCQkJDQoJCSkNCgkJDQoJCSRwYXRoID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSAnw75tb2R1bGXDvi5Mb2dnaW5nLsO+bmFtZcO+LkZpbGVQYXRoJw0KCQkkbG9nbmFtZSA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bW9kdWxlw74uTG9nZ2luZy7Dvm5hbWXDvi5Mb2dOYW1lJw0KCQkNCgkJJHNjcmlwdEJsb2NrID0gew0KCQkJcGFyYW0gKA0KCQkJCVtzdHJpbmddDQoJCQkJJE1hdGNoDQoJCQkpDQoJCQkNCgkJCSRoYXNoID0gQHsNCgkJCQknJWRhdGUlJyAgPSAoR2V0LURhdGUgLUZvcm1hdCAneXl5eS1NTS1kZCcpDQoJCQkJJyVkYXlvZndlZWslJyA9IChHZXQtRGF0ZSkuRGF5T2ZXZWVrDQoJCQkJJyVkYXklJyA9IChHZXQtRGF0ZSkuRGF5DQoJCQkJJyVob3VyJScgICA9IChHZXQtRGF0ZSkuSG91cg0KCQkJCSclbWludXRlJScgPSAoR2V0LURhdGUpLk1pbnV0ZQ0KCQkJCScldXNlcm5hbWUlJyA9ICRlbnY6VVNFUk5BTUUNCgkJCQknJXVzZXJkb21haW4lJyA9ICRlbnY6VVNFUkRPTUFJTg0KCQkJCSclY29tcHV0ZXJuYW1lJScgPSAkZW52OkNPTVBVVEVSTkFNRQ0KCQkJCSclcHJvY2Vzc2lkJScgPSAkUElEDQoJCQkJJyVsb2duYW1lJScgPSAkbG9nbmFtZQ0KCQkJfQ0KCQkJDQoJCQkkaGFzaC4kTWF0Y2gNCgkJfQ0KCQkNCgkJW3JlZ2V4XTo6UmVwbGFjZSgkcGF0aCwgJyVkYXklfCVjb21wdXRlcm5hbWUlfCVob3VyJXwlcHJvY2Vzc2lkJXwlZGF0ZSV8JXVzZXJuYW1lJXwlZGF5b2Z3ZWVrJXwlbWludXRlJXwldXNlcmRvbWFpbiV8JWxvZ25hbWUlJywgJHNjcmlwdEJsb2NrKQ0KCX0NCgkNCglmdW5jdGlvbiBXcml0ZS3Dvm5hbWXDvk1lc3NhZ2UNCgl7DQoJCVtDbWRsZXRCaW5kaW5nKCldDQoJCXBhcmFtICgNCgkJCVtQYXJhbWV0ZXIoVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldDQoJCQkkTWVzc2FnZSwNCgkJCQ0KCQkJW2Jvb2xdDQoJCQkkSW5jbHVkZUhlYWRlciwNCgkJCQ0KCQkJW3N0cmluZ10NCgkJCSRGaWxlVHlwZSwNCgkJCQ0KCQkJW3N0cmluZ10NCgkJCSRQYXRoLA0KCQkJDQoJCQlbc3RyaW5nXQ0KCQkJJENzdkRlbGltaXRlciwNCgkJCQ0KCQkJW3N0cmluZ1tdXQ0KCQkJJEhlYWRlcnMNCgkJKQ0KCQkNCgkJJHBhcmVudCA9IFNwbGl0LVBhdGggJFBhdGgNCgkJaWYgKC1ub3QgKFRlc3QtUGF0aCAkcGFyZW50KSkNCgkJew0KCQkJJG51bGwgPSBOZXctSXRlbSAkcGFyZW50IC1JdGVtVHlwZSBEaXJlY3RvcnkgLUZvcmNlDQoJCX0NCgkJJGZpbGVFeGlzdHMgPSBUZXN0LVBhdGggJFBhdGgNCgkJDQoJCSNyZWdpb24gVHlwZS1CYXNlZCBPdXRwdXQNCgkJc3dpdGNoICgkRmlsZVR5cGUpDQoJCXsNCgkJCSNyZWdpb24gQ3N2DQoJCQkiQ3N2Ig0KCQkJew0KCQkJCWlmICgoLW5vdCAkZmlsZUV4aXN0cykgLWFuZCAkSW5jbHVkZUhlYWRlcikgeyAkTWVzc2FnZSB8IENvbnZlcnRUby1Dc3YgLU5vVHlwZUluZm9ybWF0aW9uIC1EZWxpbWl0ZXIgJENzdkRlbGltaXRlciB8IFNldC1Db250ZW50IC1QYXRoICRQYXRoIC1FbmNvZGluZyBVVEY4IH0NCgkJCQllbHNlIHsgJE1lc3NhZ2UgfCBDb252ZXJ0VG8tQ3N2IC1Ob1R5cGVJbmZvcm1hdGlvbiAtRGVsaW1pdGVyICRDc3ZEZWxpbWl0ZXIgfCBTZWxlY3QtT2JqZWN0IC1Ta2lwIDEgfCBBZGQtQ29udGVudCAtUGF0aCAkUGF0aCAtRW5jb2RpbmcgVVRGOCB9DQoJCQl9DQoJCQkjZW5kcmVnaW9uIENzdg0KCQkJI3JlZ2lvbiBKc29uDQoJCQkiSnNvbiINCgkJCXsNCgkJCQlpZiAoJGZpbGVFeGlzdHMpIHsgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLVZhbHVlICIsIiAtRW5jb2RpbmcgVVRGOCB9DQoJCQkJJE1lc3NhZ2UgfCBDb252ZXJ0VG8tSnNvbiB8IEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1Ob05ld2xpbmUgLUVuY29kaW5nIFVURjgNCgkJCX0NCgkJCSNlbmRyZWdpb24gSnNvbg0KCQkJI3JlZ2lvbiBYTUwNCgkJCSJYTUwiDQoJCQl7DQoJCQkJW3htbF0keG1sID0gJG1lc3NhZ2UgfCBDb252ZXJ0VG8tWG1sIC1Ob1R5cGVJbmZvcm1hdGlvbg0KCQkJCSR4bWwuT2JqZWN0cy5Jbm5lclhtbCB8IEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1FbmNvZGluZyBVVEY4DQoJCQl9DQoJCQkjZW5kcmVnaW9uIFhNTA0KCQkJI3JlZ2lvbiBIdG1sDQoJCQkiSHRtbCINCgkJCXsNCgkJCQlbeG1sXSR4bWwgPSAkbWVzc2FnZSB8IENvbnZlcnRUby1IdG1sIC1GcmFnbWVudA0KCQkJCQ0KCQkJCWlmICgoLW5vdCAkZmlsZUV4aXN0cykgLWFuZCAkSW5jbHVkZUhlYWRlcikNCgkJCQl7DQoJCQkJCSR4bWwudGFibGUudHJbMF0uT3V0ZXJYbWwgfCBBZGQtQ29udGVudCAtUGF0aCAkUGF0aCAtRW5jb2RpbmcgVVRGOA0KCQkJCX0NCgkJCQkNCgkJCQkkeG1sLnRhYmxlLnRyWzFdLk91dGVyWG1sIHwgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLUVuY29kaW5nIFVURjgNCgkJCX0NCgkJCSNlbmRyZWdpb24gSHRtbA0KCQl9DQoJCSNlbmRyZWdpb24gVHlwZS1CYXNlZCBPdXRwdXQNCgl9DQoJDQoJJMO+bmFtZcO+X2luY2x1ZGVoZWFkZXIgPSBHZXQtUFNGQ29uZmlnVmFsdWUgLUZ1bGxOYW1lICfDvm1vZHVsZcO+LkxvZ2dpbmcuw75uYW1lw74uSW5jbHVkZUhlYWRlcicNCgkkw75uYW1lw75faGVhZGVycyA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bW9kdWxlw74uTG9nZ2luZy7Dvm5hbWXDvi5IZWFkZXJzJw0KCSTDvm5hbWXDvl9maWxldHlwZSA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bW9kdWxlw74uTG9nZ2luZy7Dvm5hbWXDvi5GaWxlVHlwZScNCgkkw75uYW1lw75fQ3N2RGVsaW1pdGVyID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSAnw75tb2R1bGXDvi5Mb2dnaW5nLsO+bmFtZcO+LkNzdkRlbGltaXRlcicNCgkNCglpZiAoJMO+bmFtZcO+X2hlYWRlcnMgLWNvbnRhaW5zICdUYWdzJykNCgl7DQoJCSTDvm5hbWXDvl9oZWFkZXJzID0gJMO+bmFtZcO+X2hlYWRlcnMgfCBGb3JFYWNoLU9iamVjdCB7DQoJCQlzd2l0Y2ggKCRfKQ0KCQkJew0KCQkJCSdUYWdzJw0KCQkJCXsNCgkJCQkJQHsNCgkJCQkJCU5hbWUJICAgPSAnVGFncycNCgkJCQkJCUV4cHJlc3Npb24gPSB7ICRfLlRhZ3MgLWpvaW4gIiwiIH0NCgkJCQkJfQ0KCQkJCX0NCgkJCQknTWVzc2FnZScNCgkJCQl7DQoJCQkJCUB7DQoJCQkJCQlOYW1lCSAgID0gJ01lc3NhZ2UnDQoJCQkJCQlFeHByZXNzaW9uID0geyAkXy5Mb2dNZXNzYWdlIH0NCgkJCQkJfQ0KCQkJCX0NCgkJCQlkZWZhdWx0IHsgJF8gfQ0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCSTDvm5hbWXDvl9wYXJhbVdyaXRlTG9nRmlsZU1lc3NhZ2UgPSBAew0KCQlJbmNsdWRlSGVhZGVyICAgID0gJMO+bmFtZcO+X2luY2x1ZGVoZWFkZXINCgkJRmlsZVR5cGUJCSA9ICTDvm5hbWXDvl9maWxldHlwZQ0KCQlDc3ZEZWxpbWl0ZXIJID0gJMO+bmFtZcO+X0NzdkRlbGltaXRlcg0KCQlIZWFkZXJzCQkgICAgID0gJMO+bmFtZcO+X2hlYWRlcnMNCgl9DQp9DQoNCiMgQWN0aW9uIHRoYXQgaXMgcGVyZm9ybWVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsb2dnaW5nIGN5Y2xlDQokc3RhcnRfZXZlbnQgPSB7DQoJJMO+bmFtZcO+X3BhcmFtV3JpdGVMb2dGaWxlTWVzc2FnZVsiUGF0aCJdID0gR2V0LcO+bmFtZcO+UGF0aA0KfQ0KDQojIEFjdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCBmb3IgZWFjaCBtZXNzYWdlIGl0ZW0gdGhhdCBpcyBiZWluZyBsb2dnZWQNCiRtZXNzYWdlX0V2ZW50ID0gew0KCVBhcmFtICgNCgkJJE1lc3NhZ2UNCgkpDQoJDQoJJE1lc3NhZ2UgfCBTZWxlY3QtT2JqZWN0ICTDvm5hbWXDvl9oZWFkZXJzIHwgV3JpdGUtw75uYW1lw75NZXNzYWdlIEDDvm5hbWXDvl9wYXJhbVdyaXRlTG9nRmlsZU1lc3NhZ2UNCn0NCg0KIyBBY3Rpb24gdGhhdCBpcyBwZXJmb3JtZWQgZm9yIGVhY2ggZXJyb3IgaXRlbSB0aGF0IGlzIGJlaW5nIGxvZ2dlZA0KJGVycm9yX0V2ZW50ID0gew0KCVBhcmFtICgNCgkJJEVycm9ySXRlbQ0KCSkNCgkNCgkNCn0NCg0KIyBBY3Rpb24gdGhhdCBpcyBwZXJmb3JtZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGxvZ2dpbmcgY3ljbGUNCiRlbmRfZXZlbnQgPSB7DQoJDQp9DQoNCiMgQWN0aW9uIHRoYXQgaXMgcGVyZm9ybWVkIHdoZW4gc3RvcHBpbmcgdGhlIGxvZ2dpbmcgc2NyaXB0DQokZmluYWxfZXZlbnQgPSB7DQoJDQp9DQojZW5kcmVnaW9uIExvZ2dpbmcgRXhlY3V0aW9uDQoNCiNyZWdpb24gRnVuY3Rpb24gRXh0ZW5zaW9uIC8gSW50ZWdyYXRpb24NCiMgU2NyaXB0IHRoYXQgZ2VuZXJhdGVzIHRoZSBuZWNlc3NhcnkgZHluYW1pYyBwYXJhbWV0ZXIgZm9yIFNldC1QU0ZMb2dnaW5nUHJvdmlkZXINCiRjb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IHsNCgkkY29uZmlncm9vdCA9ICLDvm1vZHVsZcO+LkxvZ2dpbmcuw75uYW1lw74iDQoJDQoJJGNvbmZpZ3VyYXRpb25zID0gR2V0LVBTRkNvbmZpZyAtRnVsbE5hbWUgIiRjb25maWdyb290LioiDQoJDQoJJFJ1bnRpbWVQYXJhbURpYyA9IE5ldy1PYmplY3QgIFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uUnVudGltZURlZmluZWRQYXJhbWV0ZXJEaWN0aW9uYXJ5DQoJDQoJZm9yZWFjaCAoJGNvbmZpZyBpbiAkY29uZmlndXJhdGlvbnMpDQoJew0KCQkkUGFyYW1BdHRyaWIgPSBOZXctT2JqZWN0IFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uUGFyYW1ldGVyQXR0cmlidXRlDQoJCSRQYXJhbUF0dHJpYi5QYXJhbWV0ZXJTZXROYW1lID0gJ19fQWxsUGFyYW1ldGVyU2V0cycNCgkJJEF0dHJpYkNvbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5Db2xsZWN0aW9uW1N5c3RlbS5BdHRyaWJ1dGVdDQoJCSRBdHRyaWJDb2xsLkFkZCgkUGFyYW1BdHRyaWIpDQoJCSRSdW50aW1lUGFyYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uUnVudGltZURlZmluZWRQYXJhbWV0ZXIoKCRjb25maWcuRnVsbE5hbWUuUmVwbGFjZSgkY29uZmlncm9vdCwgIiIpLlRyaW0oIi4iKSksICRjb25maWcuVmFsdWUuR2V0VHlwZSgpLCAkQXR0cmliQ29sbCkNCgkJDQoJCSRSdW50aW1lUGFyYW1EaWMuQWRkKCgkY29uZmlnLkZ1bGxOYW1lLlJlcGxhY2UoJGNvbmZpZ3Jvb3QsICIiKS5UcmltKCIuIikpLCAkUnVudGltZVBhcmFtKQ0KCX0NCglyZXR1cm4gJFJ1bnRpbWVQYXJhbURpYw0KfQ0KDQojIFNjcmlwdCB0aGF0IGlzIGV4ZWN1dGVzIHdoZW4gY29uZmlndXJpbmcgdGhlIHByb3ZpZGVyIHVzaW5nIFNldC1QU0ZMb2dnaW5nUHJvdmlkZXINCiRjb25maWd1cmF0aW9uU2NyaXB0ID0gew0KCSRjb25maWdyb290ID0gIsO+bW9kdWxlw74uTG9nZ2luZy7Dvm5hbWXDviINCgkNCgkkY29uZmlndXJhdGlvbnMgPSBHZXQtUFNGQ29uZmlnIC1GdWxsTmFtZSAiJGNvbmZpZ3Jvb3QuKiINCgkNCglmb3JlYWNoICgkY29uZmlnIGluICRjb25maWd1cmF0aW9ucykNCgl7DQoJCWlmICgkUFNCb3VuZFBhcmFtZXRlcnMuQ29udGFpbnNLZXkoKCRjb25maWcuRnVsbE5hbWUuUmVwbGFjZSgkY29uZmlncm9vdCwgIiIpLlRyaW0oIi4iKSkpKQ0KCQl7DQoJCQlTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJGNvbmZpZy5Nb2R1bGUgLU5hbWUgJGNvbmZpZy5OYW1lIC1WYWx1ZSAkUFNCb3VuZFBhcmFtZXRlcnNbKCRjb25maWcuRnVsbE5hbWUuUmVwbGFjZSgkY29uZmlncm9vdCwgIiIpLlRyaW0oIi4iKSldDQoJCX0NCgl9DQp9DQoNCiMgU2NyaXB0IHRoYXQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUuICJUcnVlIiBpZiBhbGwgcHJlcmVxdWlzaXRlcyBhcmUgaW5zdGFsbGVkLCAiRmFsc2UiIGlmIGluc3RhbGxhdGlvbiBpcyByZXF1aXJlZA0KJGlzSW5zdGFsbGVkU2NyaXB0ID0gew0KCXJldHVybiAkdHJ1ZQ0KfQ0KDQojIFNjcmlwdCB0aGF0IHByb3ZpZGVzIGR5bmFtaWMgcGFyYW1ldGVyIGZvciBJbnN0YWxsLVBTRkxvZ2dpbmdQcm92aWRlcg0KJGluc3RhbGxhdGlvblBhcmFtZXRlcnMgPSB7DQoJIyBOb25lIG5lZWRlZA0KfQ0KDQojIFNjcmlwdCB0aGF0IHBlcmZvcm1zIHRoZSBhY3R1YWwgaW5zdGFsbGF0aW9uLCBiYXNlZCBvbiB0aGUgcGFyYW1ldGVycyAoaWYgYW55KSBzcGVjaWZpZWQgaW4gdGhlICRpbnN0YWxsYXRpb25QYXJhbWV0ZXJzIHNjcmlwdA0KJGluc3RhbGxhdGlvblNjcmlwdCA9IHsNCgkjIE5vdGhpbmcgdG8gYmUgZG9uZSAtIGlmIHlvdSBuZWVkIHRvIGluc3RhbGwgeW91ciBmaWxlc3lzdGVtLCB5b3UgcHJvYmFibHkgaGF2ZSBvdGhlciBpc3N1ZXMgeW91IG5lZWQgdG8gZGVhbCB3aXRoIGZpcnN0IDspDQp9DQojZW5kcmVnaW9uIEZ1bmN0aW9uIEV4dGVuc2lvbiAvIEludGVncmF0aW9uDQoNCiMgQ29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byBpbml0aWFsaXplDQokY29uZmlndXJhdGlvbl9TZXR0aW5ncyA9IHsNCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgw75tb2R1bGXDviAtTmFtZSAnTG9nZ2luZy7Dvm5hbWXDvi5GaWxlUGF0aCcgLVZhbHVlICIiIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uIHN0cmluZyAtSGFuZGxlciB7IH0gLURlc2NyaXB0aW9uICJUaGUgcGF0aCB0byB3aGVyZSB0aGUgbG9nZmlsZSBpcyB3cml0dGVuLiBTdXBwb3J0cyBzb21lIHBsYWNlaG9sZGVycyBzdWNoIGFzICVEYXRlJSB0byBhbGxvdyBmb3IgdGltZXN0YW1wIGluIHRoZSBuYW1lLiBGb3IgZnVsbCBkb2N1bWVudGF0aW9uIG9uIHRoZSBzdXBwb3J0ZWQgd2lsZGNhcmRzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb24gaHR0cHM6Ly9wc2ZyYW1ld29yay5vcmciDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIMO+bW9kdWxlw74gLU5hbWUgJ0xvZ2dpbmcuw75uYW1lw74uTG9nbmFtZScgLVZhbHVlICIiIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uIHN0cmluZyAtSGFuZGxlciB7IH0gLURlc2NyaXB0aW9uICJBIHNwZWNpYWwgc3RyaW5nIHlvdSBjYW4gdXNlIGFzIGEgcGxhY2Vob2xkZXIgaW4gdGhlIGxvZ2ZpbGUgcGF0aCAoYnkgdXNpbmcgJyVsb2duYW1lJScgYXMgcGxhY2Vob2xkZXIpIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSDDvm1vZHVsZcO+IC1OYW1lICdMb2dnaW5nLsO+bmFtZcO+LkluY2x1ZGVIZWFkZXInIC1WYWx1ZSAkdHJ1ZSAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiBib29sIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIldoZXRoZXIgYSB3cml0dGVuIGNzdiBmaWxlIHdpbGwgaW5jbHVkZSBoZWFkZXJzIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSDDvm1vZHVsZcO+IC1OYW1lICdMb2dnaW5nLsO+bmFtZcO+LkhlYWRlcnMnIC1WYWx1ZSBAKCdDb21wdXRlck5hbWUnLCAnRmlsZScsICdGdW5jdGlvbk5hbWUnLCAnTGV2ZWwnLCAnTGluZScsICdNZXNzYWdlJywgJ01vZHVsZU5hbWUnLCAnUnVuc3BhY2UnLCAnVGFncycsICdUYXJnZXRPYmplY3QnLCAnVGltZXN0YW1wJywgJ1R5cGUnLCAnVXNlcm5hbWUnKSAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiBzdHJpbmdhcnJheSAtSGFuZGxlciB7IH0gLURlc2NyaXB0aW9uICJUaGUgcHJvcGVydGllcyB0byBleHBvcnQsIGluIHRoZSBvcmRlciB0byBzZWxlY3QgdGhlbS4iDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIMO+bW9kdWxlw74gLU5hbWUgJ0xvZ2dpbmcuw75uYW1lw74uRmlsZVR5cGUnIC1WYWx1ZSAiQ1NWIiAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiBwc2ZyYW1ld29yay5sb2dmaWxlZmlsZXR5cGUgLUhhbmRsZXIgeyB9IC1EZXNjcmlwdGlvbiAiSW4gd2hhdCBmb3JtYXQgdG8gd3JpdGUgdGhlIGxvZ2ZpbGUuIFN1cHBvcnRlZCBzdHlsZXM6IENTViwgWE1MLCBIdG1sIG9yIEpzb24uIEh0bWwsIFhNTCBhbmQgSnNvbiB3aWxsIGJlIHdyaXR0ZW4gYXMgZnJhZ21lbnRzLiINCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgw75tb2R1bGXDviAtTmFtZSAnTG9nZ2luZy7Dvm5hbWXDvi5Dc3ZEZWxpbWl0ZXInIC1WYWx1ZSAiLCIgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gc3RyaW5nIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIlRoZSBkZWxpbWl0ZXIgdG8gdXNlIHdoZW4gd3JpdGluZyB0byBjc3YuIg0KCQ0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSBMb2dnaW5nUHJvdmlkZXIgLU5hbWUgJ8O+bmFtZcO+LkVuYWJsZWQnIC1WYWx1ZSAkZmFsc2UgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gImJvb2wiIC1IYW5kbGVyIHsgaWYgKFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXSkgeyBbUFNGcmFtZXdvcmsuTG9nZ2luZy5Qcm92aWRlckhvc3RdOjpQcm92aWRlcnNbJ8O+bmFtZcO+J10uRW5hYmxlZCA9ICRhcmdzWzBdIH0gfSAtRGVzY3JpcHRpb24gIldoZXRoZXIgdGhlIGxvZ2dpbmcgcHJvdmlkZXIgc2hvdWxkIGJlIGVuYWJsZWQgb24gcmVnaXN0cmF0aW9uIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSBMb2dnaW5nUHJvdmlkZXIgLU5hbWUgJ8O+bmFtZcO+LkF1dG9JbnN0YWxsJyAtVmFsdWUgJGZhbHNlIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICJib29sIiAtSGFuZGxlciB7IH0gLURlc2NyaXB0aW9uICJXaGV0aGVyIHRoZSBsb2dnaW5nIHByb3ZpZGVyIHNob3VsZCBiZSBpbnN0YWxsZWQgb24gcmVnaXN0cmF0aW9uIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSBMb2dnaW5nUHJvdmlkZXIgLU5hbWUgJ8O+bmFtZcO+Lkluc3RhbGxPcHRpb25hbCcgLVZhbHVlICR0cnVlIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICJib29sIiAtSGFuZGxlciB7IH0gLURlc2NyaXB0aW9uICJXaGV0aGVyIGluc3RhbGxpbmcgdGhlIGxvZ2dpbmcgcHJvdmlkZXIgaXMgbWFuZGF0b3J5LCBpbiBvcmRlciBmb3IgaXQgdG8gYmUgZW5hYmxlZCINCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgTG9nZ2luZ1Byb3ZpZGVyIC1OYW1lICfDvm5hbWXDvi5JbmNsdWRlTW9kdWxlcycgLVZhbHVlIEAoKSAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiAic3RyaW5nYXJyYXkiIC1IYW5kbGVyIHsgaWYgKFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXSkgeyBbUFNGcmFtZXdvcmsuTG9nZ2luZy5Qcm92aWRlckhvc3RdOjpQcm92aWRlcnNbJ8O+bmFtZcO+J10uSW5jbHVkZU1vZHVsZXMgPSAoJGFyZ3NbMF0gfCBXcml0ZS1PdXRwdXQpIH0gfSAtRGVzY3JpcHRpb24gIk1vZHVsZSB3aGl0ZWxpc3QuIE9ubHkgbWVzc2FnZXMgZnJvbSBsaXN0ZWQgbW9kdWxlcyB3aWxsIGJlIGxvZ2dlZCINCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgTG9nZ2luZ1Byb3ZpZGVyIC1OYW1lICfDvm5hbWXDvi5FeGNsdWRlTW9kdWxlcycgLVZhbHVlIEAoKSAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiAic3RyaW5nYXJyYXkiIC1IYW5kbGVyIHsgaWYgKFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXSkgeyBbUFNGcmFtZXdvcmsuTG9nZ2luZy5Qcm92aWRlckhvc3RdOjpQcm92aWRlcnNbJ8O+bmFtZcO+J10uRXhjbHVkZU1vZHVsZXMgPSAoJGFyZ3NbMF0gfCBXcml0ZS1PdXRwdXQpIH0gfSAtRGVzY3JpcHRpb24gIk1vZHVsZSBibGFja2xpc3QuIE1lc3NhZ2VzIGZyb20gbGlzdGVkIG1vZHVsZXMgd2lsbCBub3QgYmUgbG9nZ2VkIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSBMb2dnaW5nUHJvdmlkZXIgLU5hbWUgJ8O+bmFtZcO+LkluY2x1ZGVUYWdzJyAtVmFsdWUgQCgpIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICJzdHJpbmdhcnJheSIgLUhhbmRsZXIgeyBpZiAoW1BTRnJhbWV3b3JrLkxvZ2dpbmcuUHJvdmlkZXJIb3N0XTo6UHJvdmlkZXJzWyfDvm5hbWXDviddKSB7IFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXS5JbmNsdWRlVGFncyA9ICgkYXJnc1swXSB8IFdyaXRlLU91dHB1dCkgfSB9IC1EZXNjcmlwdGlvbiAiVGFnIHdoaXRlbGlzdC4gT25seSBtZXNzYWdlcyB3aXRoIHRoZXNlIHRhZ3Mgd2lsbCBiZSBsb2dnZWQiDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIExvZ2dpbmdQcm92aWRlciAtTmFtZSAnw75uYW1lw74uRXhjbHVkZVRhZ3MnIC1WYWx1ZSBAKCkgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gInN0cmluZ2FycmF5IiAtSGFuZGxlciB7IGlmIChbUFNGcmFtZXdvcmsuTG9nZ2luZy5Qcm92aWRlckhvc3RdOjpQcm92aWRlcnNbJ8O+bmFtZcO+J10pIHsgW1BTRnJhbWV3b3JrLkxvZ2dpbmcuUHJvdmlkZXJIb3N0XTo6UHJvdmlkZXJzWyfDvm5hbWXDviddLkV4Y2x1ZGVUYWdzID0gKCRhcmdzWzBdIHwgV3JpdGUtT3V0cHV0KSB9IH0gLURlc2NyaXB0aW9uICJUYWcgYmxhY2tsaXN0LiBNZXNzYWdlcyB3aXRoIHRoZXNlIHRhZ3Mgd2lsbCBub3QgYmUgbG9nZ2VkIg0KfQ0KDQpSZWdpc3Rlci1QU0ZMb2dnaW5nUHJvdmlkZXIgLU5hbWUgIsO+bmFtZcO+IiAtUmVnaXN0cmF0aW9uRXZlbnQgJHJlZ2lzdHJhdGlvbkV2ZW50IC1CZWdpbkV2ZW50ICRiZWdpbl9ldmVudCAtU3RhcnRFdmVudCAkc3RhcnRfZXZlbnQgLU1lc3NhZ2VFdmVudCAkbWVzc2FnZV9FdmVudCAtRXJyb3JFdmVudCAkZXJyb3JfRXZlbnQgLUVuZEV2ZW50ICRlbmRfZXZlbnQgLUZpbmFsRXZlbnQgJGZpbmFsX2V2ZW50IC1Db25maWd1cmF0aW9uUGFyYW1ldGVycyAkY29uZmlndXJhdGlvblBhcmFtZXRlcnMgLUNvbmZpZ3VyYXRpb25TY3JpcHQgJGNvbmZpZ3VyYXRpb25TY3JpcHQgLUlzSW5zdGFsbGVkU2NyaXB0ICRpc0luc3RhbGxlZFNjcmlwdCAtSW5zdGFsbGF0aW9uU2NyaXB0ICRpbnN0YWxsYXRpb25TY3JpcHQgLUluc3RhbGxhdGlvblBhcmFtZXRlcnMgJGluc3RhbGxhdGlvblBhcmFtZXRlcnMgLUNvbmZpZ3VyYXRpb25TZXR0aW5ncyAkY29uZmlndXJhdGlvbl9TZXR0aW5ncwEJBAAAAAkFAAAABgYAAAAVw75uYW1lw74ucHJvdmlkZXIucHMxBgcAAAAABggAAAACw74JCQAAAAkKAAAABAQAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCwAAAAIAAAACAAAAAQUAAAAEAAAACQwAAAAAAAAAAAAAAAEJAAAABAAAAAkNAAAAAQAAAAEAAAABCgAAAAQAAAAJDAAAAAAAAAAAAAAAEQsAAAAEAAAABg8AAAAEbmFtZQYQAAAABm1vZHVsZQ0CEQwAAAAAAAAAEQ0AAAAEAAAABhEAAAAEbmFtZQ0DCw==</BA>
            </MS>
          </Obj>
        </LST>
      </Obj>
    </Props>
    <MS>
      <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUKAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMIQ2hpbGRyZW4BBAMBAQADAwMDKVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAgAAAA5TeXN0ZW0uVmVyc2lvbg1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dgAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQIAAAAGAwAAABJQU0ZMb2dnaW5nUHJvdmlkZXIF/P///ylQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlVHlwZQEAAAAHdmFsdWVfXwAIAgAAAAAAAAAJBQAAAAYGAAAAGUEgQ3VzdG9tIExvZ2ZpbGUgUHJvdmlkZXIGBwAAABJGcmllZHJpY2ggV2Vpbm1hbm4AgHJlLATYiAkIAAAACQkAAAAJCgAAAAkLAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAQAAAAAAAAAAAAAAAAAAAAQIAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQwAAAADAAAAAAAAAAEJAAAACAAAAAkNAAAAAgAAAAIAAAAECgAAAIACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQADAAgWU3lzdGVtLk9yZGluYWxDb21wYXJlcggAAAAACQ4AAAAAAAAABAsAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJDwAAAAEAAAABAAAAEQwAAAADAAAABhAAAAAHbG9nZ2luZwYRAAAACHByb3ZpZGVyBhIAAAAEZmlsZRENAAAABAAAAAYTAAAABG5hbWUGFAAAAAZtb2R1bGUNAgQOAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBBw8AAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJFQAAAA0DBRUAAAAtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1GaWxlCQAAAAVWYWx1ZQlQbGFpblRleHQUQ29udGVudFBhcmFtZXRlckZsYXQWQ29udGVudFBhcmFtZXRlclNjcmlwdAROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQBAAMDAQEBAwMBf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABhYAAAD8ViMgQWN0aW9uIHRoYXQgaXMgcGVyZm9ybWVkIG9uIHJlZ2lzdHJhdGlvbiBvZiB0aGUgcHJvdmlkZXIgdXNpbmcgUmVnaXN0ZXItUFNGTG9nZ2luZ1Byb3ZpZGVyDQokcmVnaXN0cmF0aW9uRXZlbnQgPSB7DQoJDQp9DQoNCiNyZWdpb24gTG9nZ2luZyBFeGVjdXRpb24NCiMgQWN0aW9uIHRoYXQgaXMgcGVyZm9ybWVkIHdoZW4gc3RhcnRpbmcgdGhlIGxvZ2dpbmcgc2NyaXB0IChvciB0aGUgdmVyeSBmaXJzdCB0aW1lIGlmIGVuYWJsZWQgYWZ0ZXIgbGF1bmNoaW5nIHRoZSBsb2dnaW5nIHNjcmlwdCkNCiRiZWdpbl9ldmVudCA9IHsNCglmdW5jdGlvbiBHZXQtw75uYW1lw75QYXRoDQoJew0KCQlbQ21kbGV0QmluZGluZygpXQ0KCQlwYXJhbSAoDQoJCQkNCgkJKQ0KCQkNCgkJJHBhdGggPSBHZXQtUFNGQ29uZmlnVmFsdWUgLUZ1bGxOYW1lICfDvm1vZHVsZcO+LkxvZ2dpbmcuw75uYW1lw74uRmlsZVBhdGgnDQoJCSRsb2duYW1lID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSAnw75tb2R1bGXDvi5Mb2dnaW5nLsO+bmFtZcO+LkxvZ05hbWUnDQoJCQ0KCQkkc2NyaXB0QmxvY2sgPSB7DQoJCQlwYXJhbSAoDQoJCQkJW3N0cmluZ10NCgkJCQkkTWF0Y2gNCgkJCSkNCgkJCQ0KCQkJJGhhc2ggPSBAew0KCQkJCSclZGF0ZSUnICA9IChHZXQtRGF0ZSAtRm9ybWF0ICd5eXl5LU1NLWRkJykNCgkJCQknJWRheW9md2VlayUnID0gKEdldC1EYXRlKS5EYXlPZldlZWsNCgkJCQknJWRheSUnID0gKEdldC1EYXRlKS5EYXkNCgkJCQknJWhvdXIlJyAgID0gKEdldC1EYXRlKS5Ib3VyDQoJCQkJJyVtaW51dGUlJyA9IChHZXQtRGF0ZSkuTWludXRlDQoJCQkJJyV1c2VybmFtZSUnID0gJGVudjpVU0VSTkFNRQ0KCQkJCScldXNlcmRvbWFpbiUnID0gJGVudjpVU0VSRE9NQUlODQoJCQkJJyVjb21wdXRlcm5hbWUlJyA9ICRlbnY6Q09NUFVURVJOQU1FDQoJCQkJJyVwcm9jZXNzaWQlJyA9ICRQSUQNCgkJCQknJWxvZ25hbWUlJyA9ICRsb2duYW1lDQoJCQl9DQoJCQkNCgkJCSRoYXNoLiRNYXRjaA0KCQl9DQoJCQ0KCQlbcmVnZXhdOjpSZXBsYWNlKCRwYXRoLCAnJWRheSV8JWNvbXB1dGVybmFtZSV8JWhvdXIlfCVwcm9jZXNzaWQlfCVkYXRlJXwldXNlcm5hbWUlfCVkYXlvZndlZWslfCVtaW51dGUlfCV1c2VyZG9tYWluJXwlbG9nbmFtZSUnLCAkc2NyaXB0QmxvY2spDQoJfQ0KCQ0KCWZ1bmN0aW9uIFdyaXRlLcO+bmFtZcO+TWVzc2FnZQ0KCXsNCgkJW0NtZGxldEJpbmRpbmcoKV0NCgkJcGFyYW0gKA0KCQkJW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0NCgkJCSRNZXNzYWdlLA0KCQkJDQoJCQlbYm9vbF0NCgkJCSRJbmNsdWRlSGVhZGVyLA0KCQkJDQoJCQlbc3RyaW5nXQ0KCQkJJEZpbGVUeXBlLA0KCQkJDQoJCQlbc3RyaW5nXQ0KCQkJJFBhdGgsDQoJCQkNCgkJCVtzdHJpbmddDQoJCQkkQ3N2RGVsaW1pdGVyLA0KCQkJDQoJCQlbc3RyaW5nW11dDQoJCQkkSGVhZGVycw0KCQkpDQoJCQ0KCQkkcGFyZW50ID0gU3BsaXQtUGF0aCAkUGF0aA0KCQlpZiAoLW5vdCAoVGVzdC1QYXRoICRwYXJlbnQpKQ0KCQl7DQoJCQkkbnVsbCA9IE5ldy1JdGVtICRwYXJlbnQgLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UNCgkJfQ0KCQkkZmlsZUV4aXN0cyA9IFRlc3QtUGF0aCAkUGF0aA0KCQkNCgkJI3JlZ2lvbiBUeXBlLUJhc2VkIE91dHB1dA0KCQlzd2l0Y2ggKCRGaWxlVHlwZSkNCgkJew0KCQkJI3JlZ2lvbiBDc3YNCgkJCSJDc3YiDQoJCQl7DQoJCQkJaWYgKCgtbm90ICRmaWxlRXhpc3RzKSAtYW5kICRJbmNsdWRlSGVhZGVyKSB7ICRNZXNzYWdlIHwgQ29udmVydFRvLUNzdiAtTm9UeXBlSW5mb3JtYXRpb24gLURlbGltaXRlciAkQ3N2RGVsaW1pdGVyIHwgU2V0LUNvbnRlbnQgLVBhdGggJFBhdGggLUVuY29kaW5nIFVURjggfQ0KCQkJCWVsc2UgeyAkTWVzc2FnZSB8IENvbnZlcnRUby1Dc3YgLU5vVHlwZUluZm9ybWF0aW9uIC1EZWxpbWl0ZXIgJENzdkRlbGltaXRlciB8IFNlbGVjdC1PYmplY3QgLVNraXAgMSB8IEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1FbmNvZGluZyBVVEY4IH0NCgkJCX0NCgkJCSNlbmRyZWdpb24gQ3N2DQoJCQkjcmVnaW9uIEpzb24NCgkJCSJKc29uIg0KCQkJew0KCQkJCWlmICgkZmlsZUV4aXN0cykgeyBBZGQtQ29udGVudCAtUGF0aCAkUGF0aCAtVmFsdWUgIiwiIC1FbmNvZGluZyBVVEY4IH0NCgkJCQkkTWVzc2FnZSB8IENvbnZlcnRUby1Kc29uIHwgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLU5vTmV3bGluZSAtRW5jb2RpbmcgVVRGOA0KCQkJfQ0KCQkJI2VuZHJlZ2lvbiBKc29uDQoJCQkjcmVnaW9uIFhNTA0KCQkJIlhNTCINCgkJCXsNCgkJCQlbeG1sXSR4bWwgPSAkbWVzc2FnZSB8IENvbnZlcnRUby1YbWwgLU5vVHlwZUluZm9ybWF0aW9uDQoJCQkJJHhtbC5PYmplY3RzLklubmVyWG1sIHwgQWRkLUNvbnRlbnQgLVBhdGggJFBhdGggLUVuY29kaW5nIFVURjgNCgkJCX0NCgkJCSNlbmRyZWdpb24gWE1MDQoJCQkjcmVnaW9uIEh0bWwNCgkJCSJIdG1sIg0KCQkJew0KCQkJCVt4bWxdJHhtbCA9ICRtZXNzYWdlIHwgQ29udmVydFRvLUh0bWwgLUZyYWdtZW50DQoJCQkJDQoJCQkJaWYgKCgtbm90ICRmaWxlRXhpc3RzKSAtYW5kICRJbmNsdWRlSGVhZGVyKQ0KCQkJCXsNCgkJCQkJJHhtbC50YWJsZS50clswXS5PdXRlclhtbCB8IEFkZC1Db250ZW50IC1QYXRoICRQYXRoIC1FbmNvZGluZyBVVEY4DQoJCQkJfQ0KCQkJCQ0KCQkJCSR4bWwudGFibGUudHJbMV0uT3V0ZXJYbWwgfCBBZGQtQ29udGVudCAtUGF0aCAkUGF0aCAtRW5jb2RpbmcgVVRGOA0KCQkJfQ0KCQkJI2VuZHJlZ2lvbiBIdG1sDQoJCX0NCgkJI2VuZHJlZ2lvbiBUeXBlLUJhc2VkIE91dHB1dA0KCX0NCgkNCgkkw75uYW1lw75faW5jbHVkZWhlYWRlciA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bW9kdWxlw74uTG9nZ2luZy7Dvm5hbWXDvi5JbmNsdWRlSGVhZGVyJw0KCSTDvm5hbWXDvl9oZWFkZXJzID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSAnw75tb2R1bGXDvi5Mb2dnaW5nLsO+bmFtZcO+LkhlYWRlcnMnDQoJJMO+bmFtZcO+X2ZpbGV0eXBlID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSAnw75tb2R1bGXDvi5Mb2dnaW5nLsO+bmFtZcO+LkZpbGVUeXBlJw0KCSTDvm5hbWXDvl9Dc3ZEZWxpbWl0ZXIgPSBHZXQtUFNGQ29uZmlnVmFsdWUgLUZ1bGxOYW1lICfDvm1vZHVsZcO+LkxvZ2dpbmcuw75uYW1lw74uQ3N2RGVsaW1pdGVyJw0KCQ0KCWlmICgkw75uYW1lw75faGVhZGVycyAtY29udGFpbnMgJ1RhZ3MnKQ0KCXsNCgkJJMO+bmFtZcO+X2hlYWRlcnMgPSAkw75uYW1lw75faGVhZGVycyB8IEZvckVhY2gtT2JqZWN0IHsNCgkJCXN3aXRjaCAoJF8pDQoJCQl7DQoJCQkJJ1RhZ3MnDQoJCQkJew0KCQkJCQlAew0KCQkJCQkJTmFtZQkgICA9ICdUYWdzJw0KCQkJCQkJRXhwcmVzc2lvbiA9IHsgJF8uVGFncyAtam9pbiAiLCIgfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCSdNZXNzYWdlJw0KCQkJCXsNCgkJCQkJQHsNCgkJCQkJCU5hbWUJICAgPSAnTWVzc2FnZScNCgkJCQkJCUV4cHJlc3Npb24gPSB7ICRfLkxvZ01lc3NhZ2UgfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCWRlZmF1bHQgeyAkXyB9DQoJCQl9DQoJCX0NCgl9DQoJDQoJJMO+bmFtZcO+X3BhcmFtV3JpdGVMb2dGaWxlTWVzc2FnZSA9IEB7DQoJCUluY2x1ZGVIZWFkZXIgICAgPSAkw75uYW1lw75faW5jbHVkZWhlYWRlcg0KCQlGaWxlVHlwZQkJID0gJMO+bmFtZcO+X2ZpbGV0eXBlDQoJCUNzdkRlbGltaXRlcgkgPSAkw75uYW1lw75fQ3N2RGVsaW1pdGVyDQoJCUhlYWRlcnMJCSAgICAgPSAkw75uYW1lw75faGVhZGVycw0KCX0NCn0NCg0KIyBBY3Rpb24gdGhhdCBpcyBwZXJmb3JtZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxvZ2dpbmcgY3ljbGUNCiRzdGFydF9ldmVudCA9IHsNCgkkw75uYW1lw75fcGFyYW1Xcml0ZUxvZ0ZpbGVNZXNzYWdlWyJQYXRoIl0gPSBHZXQtw75uYW1lw75QYXRoDQp9DQoNCiMgQWN0aW9uIHRoYXQgaXMgcGVyZm9ybWVkIGZvciBlYWNoIG1lc3NhZ2UgaXRlbSB0aGF0IGlzIGJlaW5nIGxvZ2dlZA0KJG1lc3NhZ2VfRXZlbnQgPSB7DQoJUGFyYW0gKA0KCQkkTWVzc2FnZQ0KCSkNCgkNCgkkTWVzc2FnZSB8IFNlbGVjdC1PYmplY3QgJMO+bmFtZcO+X2hlYWRlcnMgfCBXcml0ZS3Dvm5hbWXDvk1lc3NhZ2UgQMO+bmFtZcO+X3BhcmFtV3JpdGVMb2dGaWxlTWVzc2FnZQ0KfQ0KDQojIEFjdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCBmb3IgZWFjaCBlcnJvciBpdGVtIHRoYXQgaXMgYmVpbmcgbG9nZ2VkDQokZXJyb3JfRXZlbnQgPSB7DQoJUGFyYW0gKA0KCQkkRXJyb3JJdGVtDQoJKQ0KCQ0KCQ0KfQ0KDQojIEFjdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCBhdCB0aGUgZW5kIG9mIGVhY2ggbG9nZ2luZyBjeWNsZQ0KJGVuZF9ldmVudCA9IHsNCgkNCn0NCg0KIyBBY3Rpb24gdGhhdCBpcyBwZXJmb3JtZWQgd2hlbiBzdG9wcGluZyB0aGUgbG9nZ2luZyBzY3JpcHQNCiRmaW5hbF9ldmVudCA9IHsNCgkNCn0NCiNlbmRyZWdpb24gTG9nZ2luZyBFeGVjdXRpb24NCg0KI3JlZ2lvbiBGdW5jdGlvbiBFeHRlbnNpb24gLyBJbnRlZ3JhdGlvbg0KIyBTY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIG5lY2Vzc2FyeSBkeW5hbWljIHBhcmFtZXRlciBmb3IgU2V0LVBTRkxvZ2dpbmdQcm92aWRlcg0KJGNvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gew0KCSRjb25maWdyb290ID0gIsO+bW9kdWxlw74uTG9nZ2luZy7Dvm5hbWXDviINCgkNCgkkY29uZmlndXJhdGlvbnMgPSBHZXQtUFNGQ29uZmlnIC1GdWxsTmFtZSAiJGNvbmZpZ3Jvb3QuKiINCgkNCgkkUnVudGltZVBhcmFtRGljID0gTmV3LU9iamVjdCAgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5SdW50aW1lRGVmaW5lZFBhcmFtZXRlckRpY3Rpb25hcnkNCgkNCglmb3JlYWNoICgkY29uZmlnIGluICRjb25maWd1cmF0aW9ucykNCgl7DQoJCSRQYXJhbUF0dHJpYiA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5QYXJhbWV0ZXJBdHRyaWJ1dGUNCgkJJFBhcmFtQXR0cmliLlBhcmFtZXRlclNldE5hbWUgPSAnX19BbGxQYXJhbWV0ZXJTZXRzJw0KCQkkQXR0cmliQ29sbCA9IE5ldy1PYmplY3QgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25bU3lzdGVtLkF0dHJpYnV0ZV0NCgkJJEF0dHJpYkNvbGwuQWRkKCRQYXJhbUF0dHJpYikNCgkJJFJ1bnRpbWVQYXJhbSA9IE5ldy1PYmplY3QgU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5SdW50aW1lRGVmaW5lZFBhcmFtZXRlcigoJGNvbmZpZy5GdWxsTmFtZS5SZXBsYWNlKCRjb25maWdyb290LCAiIikuVHJpbSgiLiIpKSwgJGNvbmZpZy5WYWx1ZS5HZXRUeXBlKCksICRBdHRyaWJDb2xsKQ0KCQkNCgkJJFJ1bnRpbWVQYXJhbURpYy5BZGQoKCRjb25maWcuRnVsbE5hbWUuUmVwbGFjZSgkY29uZmlncm9vdCwgIiIpLlRyaW0oIi4iKSksICRSdW50aW1lUGFyYW0pDQoJfQ0KCXJldHVybiAkUnVudGltZVBhcmFtRGljDQp9DQoNCiMgU2NyaXB0IHRoYXQgaXMgZXhlY3V0ZXMgd2hlbiBjb25maWd1cmluZyB0aGUgcHJvdmlkZXIgdXNpbmcgU2V0LVBTRkxvZ2dpbmdQcm92aWRlcg0KJGNvbmZpZ3VyYXRpb25TY3JpcHQgPSB7DQoJJGNvbmZpZ3Jvb3QgPSAiw75tb2R1bGXDvi5Mb2dnaW5nLsO+bmFtZcO+Ig0KCQ0KCSRjb25maWd1cmF0aW9ucyA9IEdldC1QU0ZDb25maWcgLUZ1bGxOYW1lICIkY29uZmlncm9vdC4qIg0KCQ0KCWZvcmVhY2ggKCRjb25maWcgaW4gJGNvbmZpZ3VyYXRpb25zKQ0KCXsNCgkJaWYgKCRQU0JvdW5kUGFyYW1ldGVycy5Db250YWluc0tleSgoJGNvbmZpZy5GdWxsTmFtZS5SZXBsYWNlKCRjb25maWdyb290LCAiIikuVHJpbSgiLiIpKSkpDQoJCXsNCgkJCVNldC1QU0ZDb25maWcgLU1vZHVsZSAkY29uZmlnLk1vZHVsZSAtTmFtZSAkY29uZmlnLk5hbWUgLVZhbHVlICRQU0JvdW5kUGFyYW1ldGVyc1soJGNvbmZpZy5GdWxsTmFtZS5SZXBsYWNlKCRjb25maWdyb290LCAiIikuVHJpbSgiLiIpKV0NCgkJfQ0KCX0NCn0NCg0KIyBTY3JpcHQgdGhhdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZS4gIlRydWUiIGlmIGFsbCBwcmVyZXF1aXNpdGVzIGFyZSBpbnN0YWxsZWQsICJGYWxzZSIgaWYgaW5zdGFsbGF0aW9uIGlzIHJlcXVpcmVkDQokaXNJbnN0YWxsZWRTY3JpcHQgPSB7DQoJcmV0dXJuICR0cnVlDQp9DQoNCiMgU2NyaXB0IHRoYXQgcHJvdmlkZXMgZHluYW1pYyBwYXJhbWV0ZXIgZm9yIEluc3RhbGwtUFNGTG9nZ2luZ1Byb3ZpZGVyDQokaW5zdGFsbGF0aW9uUGFyYW1ldGVycyA9IHsNCgkjIE5vbmUgbmVlZGVkDQp9DQoNCiMgU2NyaXB0IHRoYXQgcGVyZm9ybXMgdGhlIGFjdHVhbCBpbnN0YWxsYXRpb24sIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXJzIChpZiBhbnkpIHNwZWNpZmllZCBpbiB0aGUgJGluc3RhbGxhdGlvblBhcmFtZXRlcnMgc2NyaXB0DQokaW5zdGFsbGF0aW9uU2NyaXB0ID0gew0KCSMgTm90aGluZyB0byBiZSBkb25lIC0gaWYgeW91IG5lZWQgdG8gaW5zdGFsbCB5b3VyIGZpbGVzeXN0ZW0sIHlvdSBwcm9iYWJseSBoYXZlIG90aGVyIGlzc3VlcyB5b3UgbmVlZCB0byBkZWFsIHdpdGggZmlyc3QgOykNCn0NCiNlbmRyZWdpb24gRnVuY3Rpb24gRXh0ZW5zaW9uIC8gSW50ZWdyYXRpb24NCg0KIyBDb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIGluaXRpYWxpemUNCiRjb25maWd1cmF0aW9uX1NldHRpbmdzID0gew0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSDDvm1vZHVsZcO+IC1OYW1lICdMb2dnaW5nLsO+bmFtZcO+LkZpbGVQYXRoJyAtVmFsdWUgIiIgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gc3RyaW5nIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIlRoZSBwYXRoIHRvIHdoZXJlIHRoZSBsb2dmaWxlIGlzIHdyaXR0ZW4uIFN1cHBvcnRzIHNvbWUgcGxhY2Vob2xkZXJzIHN1Y2ggYXMgJURhdGUlIHRvIGFsbG93IGZvciB0aW1lc3RhbXAgaW4gdGhlIG5hbWUuIEZvciBmdWxsIGRvY3VtZW50YXRpb24gb24gdGhlIHN1cHBvcnRlZCB3aWxkY2FyZHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBodHRwczovL3BzZnJhbWV3b3JrLm9yZyINCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgw75tb2R1bGXDviAtTmFtZSAnTG9nZ2luZy7Dvm5hbWXDvi5Mb2duYW1lJyAtVmFsdWUgIiIgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gc3RyaW5nIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIkEgc3BlY2lhbCBzdHJpbmcgeW91IGNhbiB1c2UgYXMgYSBwbGFjZWhvbGRlciBpbiB0aGUgbG9nZmlsZSBwYXRoIChieSB1c2luZyAnJWxvZ25hbWUlJyBhcyBwbGFjZWhvbGRlcikiDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIMO+bW9kdWxlw74gLU5hbWUgJ0xvZ2dpbmcuw75uYW1lw74uSW5jbHVkZUhlYWRlcicgLVZhbHVlICR0cnVlIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uIGJvb2wgLUhhbmRsZXIgeyB9IC1EZXNjcmlwdGlvbiAiV2hldGhlciBhIHdyaXR0ZW4gY3N2IGZpbGUgd2lsbCBpbmNsdWRlIGhlYWRlcnMiDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIMO+bW9kdWxlw74gLU5hbWUgJ0xvZ2dpbmcuw75uYW1lw74uSGVhZGVycycgLVZhbHVlIEAoJ0NvbXB1dGVyTmFtZScsICdGaWxlJywgJ0Z1bmN0aW9uTmFtZScsICdMZXZlbCcsICdMaW5lJywgJ01lc3NhZ2UnLCAnTW9kdWxlTmFtZScsICdSdW5zcGFjZScsICdUYWdzJywgJ1RhcmdldE9iamVjdCcsICdUaW1lc3RhbXAnLCAnVHlwZScsICdVc2VybmFtZScpIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uIHN0cmluZ2FycmF5IC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIlRoZSBwcm9wZXJ0aWVzIHRvIGV4cG9ydCwgaW4gdGhlIG9yZGVyIHRvIHNlbGVjdCB0aGVtLiINCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgw75tb2R1bGXDviAtTmFtZSAnTG9nZ2luZy7Dvm5hbWXDvi5GaWxlVHlwZScgLVZhbHVlICJDU1YiIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uIHBzZnJhbWV3b3JrLmxvZ2ZpbGVmaWxldHlwZSAtSGFuZGxlciB7IH0gLURlc2NyaXB0aW9uICJJbiB3aGF0IGZvcm1hdCB0byB3cml0ZSB0aGUgbG9nZmlsZS4gU3VwcG9ydGVkIHN0eWxlczogQ1NWLCBYTUwsIEh0bWwgb3IgSnNvbi4gSHRtbCwgWE1MIGFuZCBKc29uIHdpbGwgYmUgd3JpdHRlbiBhcyBmcmFnbWVudHMuIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSDDvm1vZHVsZcO+IC1OYW1lICdMb2dnaW5nLsO+bmFtZcO+LkNzdkRlbGltaXRlcicgLVZhbHVlICIsIiAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiBzdHJpbmcgLUhhbmRsZXIgeyB9IC1EZXNjcmlwdGlvbiAiVGhlIGRlbGltaXRlciB0byB1c2Ugd2hlbiB3cml0aW5nIHRvIGNzdi4iDQoJDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIExvZ2dpbmdQcm92aWRlciAtTmFtZSAnw75uYW1lw74uRW5hYmxlZCcgLVZhbHVlICRmYWxzZSAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiAiYm9vbCIgLUhhbmRsZXIgeyBpZiAoW1BTRnJhbWV3b3JrLkxvZ2dpbmcuUHJvdmlkZXJIb3N0XTo6UHJvdmlkZXJzWyfDvm5hbWXDviddKSB7IFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXS5FbmFibGVkID0gJGFyZ3NbMF0gfSB9IC1EZXNjcmlwdGlvbiAiV2hldGhlciB0aGUgbG9nZ2luZyBwcm92aWRlciBzaG91bGQgYmUgZW5hYmxlZCBvbiByZWdpc3RyYXRpb24iDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIExvZ2dpbmdQcm92aWRlciAtTmFtZSAnw75uYW1lw74uQXV0b0luc3RhbGwnIC1WYWx1ZSAkZmFsc2UgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gImJvb2wiIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIldoZXRoZXIgdGhlIGxvZ2dpbmcgcHJvdmlkZXIgc2hvdWxkIGJlIGluc3RhbGxlZCBvbiByZWdpc3RyYXRpb24iDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIExvZ2dpbmdQcm92aWRlciAtTmFtZSAnw75uYW1lw74uSW5zdGFsbE9wdGlvbmFsJyAtVmFsdWUgJHRydWUgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gImJvb2wiIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIldoZXRoZXIgaW5zdGFsbGluZyB0aGUgbG9nZ2luZyBwcm92aWRlciBpcyBtYW5kYXRvcnksIGluIG9yZGVyIGZvciBpdCB0byBiZSBlbmFibGVkIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSBMb2dnaW5nUHJvdmlkZXIgLU5hbWUgJ8O+bmFtZcO+LkluY2x1ZGVNb2R1bGVzJyAtVmFsdWUgQCgpIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICJzdHJpbmdhcnJheSIgLUhhbmRsZXIgeyBpZiAoW1BTRnJhbWV3b3JrLkxvZ2dpbmcuUHJvdmlkZXJIb3N0XTo6UHJvdmlkZXJzWyfDvm5hbWXDviddKSB7IFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXS5JbmNsdWRlTW9kdWxlcyA9ICgkYXJnc1swXSB8IFdyaXRlLU91dHB1dCkgfSB9IC1EZXNjcmlwdGlvbiAiTW9kdWxlIHdoaXRlbGlzdC4gT25seSBtZXNzYWdlcyBmcm9tIGxpc3RlZCBtb2R1bGVzIHdpbGwgYmUgbG9nZ2VkIg0KCVNldC1QU0ZDb25maWcgLU1vZHVsZSBMb2dnaW5nUHJvdmlkZXIgLU5hbWUgJ8O+bmFtZcO+LkV4Y2x1ZGVNb2R1bGVzJyAtVmFsdWUgQCgpIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICJzdHJpbmdhcnJheSIgLUhhbmRsZXIgeyBpZiAoW1BTRnJhbWV3b3JrLkxvZ2dpbmcuUHJvdmlkZXJIb3N0XTo6UHJvdmlkZXJzWyfDvm5hbWXDviddKSB7IFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXS5FeGNsdWRlTW9kdWxlcyA9ICgkYXJnc1swXSB8IFdyaXRlLU91dHB1dCkgfSB9IC1EZXNjcmlwdGlvbiAiTW9kdWxlIGJsYWNrbGlzdC4gTWVzc2FnZXMgZnJvbSBsaXN0ZWQgbW9kdWxlcyB3aWxsIG5vdCBiZSBsb2dnZWQiDQoJU2V0LVBTRkNvbmZpZyAtTW9kdWxlIExvZ2dpbmdQcm92aWRlciAtTmFtZSAnw75uYW1lw74uSW5jbHVkZVRhZ3MnIC1WYWx1ZSBAKCkgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gInN0cmluZ2FycmF5IiAtSGFuZGxlciB7IGlmIChbUFNGcmFtZXdvcmsuTG9nZ2luZy5Qcm92aWRlckhvc3RdOjpQcm92aWRlcnNbJ8O+bmFtZcO+J10pIHsgW1BTRnJhbWV3b3JrLkxvZ2dpbmcuUHJvdmlkZXJIb3N0XTo6UHJvdmlkZXJzWyfDvm5hbWXDviddLkluY2x1ZGVUYWdzID0gKCRhcmdzWzBdIHwgV3JpdGUtT3V0cHV0KSB9IH0gLURlc2NyaXB0aW9uICJUYWcgd2hpdGVsaXN0LiBPbmx5IG1lc3NhZ2VzIHdpdGggdGhlc2UgdGFncyB3aWxsIGJlIGxvZ2dlZCINCglTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgTG9nZ2luZ1Byb3ZpZGVyIC1OYW1lICfDvm5hbWXDvi5FeGNsdWRlVGFncycgLVZhbHVlIEAoKSAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiAic3RyaW5nYXJyYXkiIC1IYW5kbGVyIHsgaWYgKFtQU0ZyYW1ld29yay5Mb2dnaW5nLlByb3ZpZGVySG9zdF06OlByb3ZpZGVyc1snw75uYW1lw74nXSkgeyBbUFNGcmFtZXdvcmsuTG9nZ2luZy5Qcm92aWRlckhvc3RdOjpQcm92aWRlcnNbJ8O+bmFtZcO+J10uRXhjbHVkZVRhZ3MgPSAoJGFyZ3NbMF0gfCBXcml0ZS1PdXRwdXQpIH0gfSAtRGVzY3JpcHRpb24gIlRhZyBibGFja2xpc3QuIE1lc3NhZ2VzIHdpdGggdGhlc2UgdGFncyB3aWxsIG5vdCBiZSBsb2dnZWQiDQp9DQoNClJlZ2lzdGVyLVBTRkxvZ2dpbmdQcm92aWRlciAtTmFtZSAiw75uYW1lw74iIC1SZWdpc3RyYXRpb25FdmVudCAkcmVnaXN0cmF0aW9uRXZlbnQgLUJlZ2luRXZlbnQgJGJlZ2luX2V2ZW50IC1TdGFydEV2ZW50ICRzdGFydF9ldmVudCAtTWVzc2FnZUV2ZW50ICRtZXNzYWdlX0V2ZW50IC1FcnJvckV2ZW50ICRlcnJvcl9FdmVudCAtRW5kRXZlbnQgJGVuZF9ldmVudCAtRmluYWxFdmVudCAkZmluYWxfZXZlbnQgLUNvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzICRjb25maWd1cmF0aW9uUGFyYW1ldGVycyAtQ29uZmlndXJhdGlvblNjcmlwdCAkY29uZmlndXJhdGlvblNjcmlwdCAtSXNJbnN0YWxsZWRTY3JpcHQgJGlzSW5zdGFsbGVkU2NyaXB0IC1JbnN0YWxsYXRpb25TY3JpcHQgJGluc3RhbGxhdGlvblNjcmlwdCAtSW5zdGFsbGF0aW9uUGFyYW1ldGVycyAkaW5zdGFsbGF0aW9uUGFyYW1ldGVycyAtQ29uZmlndXJhdGlvblNldHRpbmdzICRjb25maWd1cmF0aW9uX1NldHRpbmdzAQkXAAAACRgAAAAGGQAAABXDvm5hbWXDvi5wcm92aWRlci5wczEGGgAAAAAGGwAAAALDvgkcAAAACR0AAAABFwAAAAgAAAAJHgAAAAIAAAACAAAAARgAAAAIAAAACR8AAAAAAAAAAAAAAAEcAAAACAAAAAkgAAAAAQAAAAEAAAABHQAAAAgAAAAJHwAAAAAAAAAAAAAAER4AAAAEAAAABiIAAAAEbmFtZQYjAAAABm1vZHVsZQ0CER8AAAAAAAAAESAAAAAEAAAABiQAAAAEbmFtZQ0DCw==</BA>
    </MS>
  </Obj>
</Objs>