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">2023-05-31T00: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="Parameters2" RefId="5">
        <TN RefId="4">
          <T>System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[PSModuleDevelopment.Template.Parameter.ParameterBase, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T>
          <T>System.Object</T>
        </TN>
        <DCT />
      </Obj>
      <Obj N="Children" RefId="6">
        <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="7">
            <TN RefId="6">
              <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="8">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                  <S>module</S>
                </LST>
              </Obj>
              <Obj N="ContentParameterScript" RefId="9">
                <TNRef RefId="2" />
                <LST />
              </Obj>
              <S N="Name">þnameþ.provider.ps1</S>
              <S N="RelativePath"></S>
              <S N="Identifier">þ</S>
              <Obj N="FileSystemParameterFlat" RefId="10">
                <TNRef RefId="2" />
                <LST>
                  <S>name</S>
                </LST>
              </Obj>
              <Obj N="FileSystemParameterScript" RefId="11">
                <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>
      <I32 N="Generation">1</I32>
    </Props>
    <MS>
      <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUMAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMLUGFyYW1ldGVyczIIQ2hpbGRyZW4KR2VuZXJhdGlvbgEEAwEBAAMDAwMDAClQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlVHlwZQIAAAAOU3lzdGVtLlZlcnNpb24Nf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXYACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXYgCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlci5QYXJhbWV0ZXJCYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQgCAAAABgMAAAASUFNGTG9nZ2luZ1Byb3ZpZGVyBfz///8pUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZVR5cGUBAAAAB3ZhbHVlX18ACAIAAAAAAAAACQUAAAAGBgAAABlBIEN1c3RvbSBMb2dmaWxlIFByb3ZpZGVyBgcAAAASRnJpZWRyaWNoIFdlaW5tYW5uAIAw+mlh24gJCAAAAAkJAAAACQoAAAAJCwAAAAkMAAAAAQAAAAQFAAAADlN5c3RlbS5WZXJzaW9uBAAAAAZfTWFqb3IGX01pbm9yBl9CdWlsZAlfUmV2aXNpb24AAAAACAgICAEAAAAAAAAAAAAAAAAAAAAECAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkNAAAAAwAAAAAAAAABCQAAAAgAAAAJDgAAAAIAAAACAAAABAoAAACAAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUAAwAIFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIIAAAAAAkPAAAAAAAAAAQLAAAAiAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyLlBhcmFtZXRlckJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAAB1ZlcnNpb24IQ29tcGFyZXIISGFzaFNpemUAAwAIFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIIAAAAAAkPAAAAAAAAAAQMAAAAngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZVtdAgAAAAgICRAAAAABAAAAAQAAABENAAAAAwAAAAYRAAAAB2xvZ2dpbmcGEgAAAAhwcm92aWRlcgYTAAAABGZpbGURDgAAAAQAAAAGFAAAAARuYW1lBhUAAAAGbW9kdWxlDQIEDwAAABZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAQAAAAtfaWdub3JlQ2FzZQABAQcQAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACRYAAAANAwUWAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYXAAAA/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+IiAtUmVnaXN0cmF0aW9uRXZlbnQgJHJlZ2lzdHJhdGlvbkV2ZW50IC1CZWdpbkV2ZW50ICRiZWdpbl9ldmVudCAtU3RhcnRFdmVudCAkc3RhcnRfZXZlbnQgLU1lc3NhZ2VFdmVudCAkbWVzc2FnZV9FdmVudCAtRXJyb3JFdmVudCAkZXJyb3JfRXZlbnQgLUVuZEV2ZW50ICRlbmRfZXZlbnQgLUZpbmFsRXZlbnQgJGZpbmFsX2V2ZW50IC1Db25maWd1cmF0aW9uUGFyYW1ldGVycyAkY29uZmlndXJhdGlvblBhcmFtZXRlcnMgLUNvbmZpZ3VyYXRpb25TY3JpcHQgJGNvbmZpZ3VyYXRpb25TY3JpcHQgLUlzSW5zdGFsbGVkU2NyaXB0ICRpc0luc3RhbGxlZFNjcmlwdCAtSW5zdGFsbGF0aW9uU2NyaXB0ICRpbnN0YWxsYXRpb25TY3JpcHQgLUluc3RhbGxhdGlvblBhcmFtZXRlcnMgJGluc3RhbGxhdGlvblBhcmFtZXRlcnMgLUNvbmZpZ3VyYXRpb25TZXR0aW5ncyAkY29uZmlndXJhdGlvbl9TZXR0aW5ncwEJGAAAAAkZAAAABhoAAAAVw75uYW1lw74ucHJvdmlkZXIucHMxBhsAAAAABhwAAAACw74JHQAAAAkeAAAAARgAAAAIAAAACR8AAAACAAAAAgAAAAEZAAAACAAAAAkgAAAAAAAAAAAAAAABHQAAAAgAAAAJIQAAAAEAAAABAAAAAR4AAAAIAAAACSAAAAAAAAAAAAAAABEfAAAABAAAAAYjAAAABG5hbWUGJAAAAAZtb2R1bGUNAhEgAAAAAAAAABEhAAAABAAAAAYlAAAABG5hbWUNAws=</BA>
    </MS>
  </Obj>
</Objs>