Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build

Draft dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/dqm-content-cms-2025/ and changes regularly. See the Directory of published versions

: CMS2FHIRPCSDepScreenAndFollowUp - XML Representation

Active as of 2025-08-22

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="CMS2FHIRPCSDepScreenAndFollowUp"/>
  <meta>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"/>
  </meta>
  <text>
    <status value="extensions"/>
    <div xmlns="http://www.w3.org/1999/xhtml">
  <table class="narrative-table">
    <tbody>
<tr>


<th colspan="2" scope="row" class="row-header">Metadata</th>


</tr>

<tr>


<th scope="row" class="row-header">Title</th>



<td class="content-container">CMS2FHIRPCSDepScreenAndFollowUp</td>


</tr>



<tr>


<th scope="row" class="row-header">Version</th>



<td class="content-container">1.1.000</td>


</tr>
















<tr>


<th scope="row" class="row-header">Topic</th>



<td class="content-container">FHIR
</td>


</tr>

<tr>


<th scope="row" class="row-header">Topic</th>



<td class="content-container">CQL
</td>


</tr>







<tr>


<th scope="row" class="row-header">Steward (Publisher)</th>



<td class="content-container">Centers for Medicare &amp; Medicaid Services (CMS)</td>


</tr>







<tr>


<th scope="row" class="row-header">Description</th>



<td class="content-container"><div><p>CMS2FHIRPCSDepScreenAndFollowUp</p>
</div></td>


</tr>






<tr>


<th scope="row" class="row-header">Type</th>



<td class="content-container">
    logic-library from <a href="http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html">http://terminology.hl7.org/CodeSystem/library-type</a> 


</td>


</tr>








<tr>


<th colspan="2" scope="row" class="row-header"><a name="parameters"> </a>Parameters</th>


</tr>


<tr>


<th scope="row" class="row-header">Parameter</th>



<td class="content-container">None</td>


</tr>







  <tr>


<th colspan="2" scope="row" class="row-header">Library Content</th>


</tr>
  
    
    <tr>
      <th scope="row" class="row-header">CQL Content</th>
      <td>
        <a name="cql-content"> </a>
        <pre style="border: none;" class="content-container highlight language-cql"><code class="language-cql">/*
NOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.
*/
library CMS2FHIRPCSDepScreenAndFollowUp version '1.1.000'

using USQualityCore version '0.1.0-cibuild'
using USCore version '6.1.0-derived'
using FHIR version '4.0.1'

include hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers
include hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon
include hl7.fhir.us.cql.CumulativeMedicationDuration version '2.0.0-ballot' called CMD
include hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon
include hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements

include USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon
include SupplementalDataElements version '6.1.000' called SDE

codesystem &quot;LOINC&quot;: 'http://loinc.org'
codesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'

valueset &quot;Adolescent Depression Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1567'
valueset &quot;Adult Depression Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1566'
valueset &quot;Bipolar Disorder&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.128'
valueset &quot;Encounter to Screen for Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.600.1916'
valueset &quot;Follow Up for Adolescent Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1569'
valueset &quot;Follow Up for Adult Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1568'
valueset &quot;Medical Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007'
valueset &quot;Physical Therapy Evaluation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1022'
valueset &quot;Referral for Adolescent Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1570'
valueset &quot;Referral for Adult Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1571'
valueset &quot;Telephone Visits&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1080'

code &quot;Adolescent depression screening assessment&quot;: '73831-0' from &quot;LOINC&quot; display 'Adolescent depression screening assessment'
code &quot;Adult depression screening assessment&quot;: '73832-8' from &quot;LOINC&quot; display 'Adult depression screening assessment'
code &quot;Depression screening declined (situation)&quot;: '720834000' from &quot;SNOMEDCT&quot; display 'Depression screening declined (situation)'
code &quot;Depression screening negative (finding)&quot;: '428171000124102' from &quot;SNOMEDCT&quot; display 'Depression screening negative (finding)'
code &quot;Depression screening positive (finding)&quot;: '428181000124104' from &quot;SNOMEDCT&quot; display 'Depression screening positive (finding)'

parameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;
  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)

context Patient

define &quot;Initial Population&quot;:
  &quot;Patient Age 12 Years or Older at Start of Measurement Period&quot;
    and exists ( &quot;Qualifying Encounter During Measurement Period&quot; )

define &quot;Denominator&quot;:
  &quot;Initial Population&quot;

define &quot;Denominator Exclusions&quot;:
  exists &quot;History of Bipolar Diagnosis Before Qualifying Encounter&quot;

define &quot;Numerator&quot;:
  ( &quot;Patient Age 12 to 16 Years at Start of Measurement Period&quot;
      and ( &quot;Has Most Recent Adolescent Screening Negative&quot;
          or exists &quot;Most Recent Adolescent Depression Screening Positive and Follow Up Provided&quot;
      )
  )
    or ( &quot;Patient Age 17 Years at Start of Measurement Period&quot;
        and ( &quot;Has Most Recent Adolescent Screening Negative&quot;
            or exists &quot;Most Recent Adolescent Depression Screening Positive and Follow Up Provided&quot;
            or &quot;Has Most Recent Adult Screening Negative&quot;
            or exists &quot;Most Recent Adult Depression Screening Positive and Follow Up Provided&quot;
        )
    )
    or ( &quot;Patient Age 18 Years or Older at Start of Measurement Period&quot;
        and ( &quot;Has Most Recent Adult Screening Negative&quot;
            or exists &quot;Most Recent Adult Depression Screening Positive and Follow Up Provided&quot;
        )
    )

define &quot;Denominator Exceptions&quot;:
  false
/*
TODO: Need to reassess how we are representing given no ObservationCancelled profile
  ( exists &quot;Medical or Patient Reason for Not Screening Adolescent for Depression&quot;
      and not &quot;Has Adolescent Depression Screening&quot;
  )
    or ( exists &quot;Medical or Patient Reason for Not Screening Adult for Depression&quot;
        and not &quot;Has Adult Depression Screening&quot;
    )
*/

define &quot;Follow Up Intervention for Positive Adolescent Depression Screening&quot;:
  ( ( [USQualityCore.MedicationRequest: &quot;Adolescent Depression Medications&quot;] AdolescentMed
        with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
          such that &quot;Most Recent Adolescent Depression Screening&quot;.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period
            and AdolescentMed.medicationRequestPeriod ( ) overlaps after day of QualifyingEncounter.period
            and &quot;Most Recent Adolescent Depression Screening&quot;.value ~ &quot;Depression screening positive (finding)&quot;
            and AdolescentMed.status in { 'active', 'completed' }
            and AdolescentMed.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
    )
      union ( [USQualityCore.ServiceRequest: &quot;Referral for Adolescent Depression&quot;] AdolescentReferral
          where AdolescentReferral.status in { 'active', 'completed' }
      )
      union ( [USQualityCore.Procedure: &quot;Follow Up for Adolescent Depression&quot;] AdolescentFollowUp
          where AdolescentFollowUp.status = 'completed'
      )
  )

define &quot;Follow Up Intervention for Positive Adult Depression Screening&quot;:
  ( ( [USQualityCore.MedicationRequest: &quot;Adult Depression Medications&quot;] AdultMed
        with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
          such that &quot;Most Recent Adult Depression Screening&quot;.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period
            and AdultMed.medicationRequestPeriod ( ) overlaps after day of QualifyingEncounter.period
            and &quot;Most Recent Adult Depression Screening&quot;.value ~ &quot;Depression screening positive (finding)&quot;
            and AdultMed.status in { 'active', 'completed' }
            and AdultMed.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
    )
      union ( [USQualityCore.ServiceRequest: &quot;Referral for Adult Depression&quot;] AdultReferral
          where AdultReferral.status in { 'active', 'completed' }
      )
      union ( [USQualityCore.Procedure: &quot;Follow Up for Adult Depression&quot;] AdultFollowUp
          where AdultFollowUp.status = 'completed'
      )
  )

define &quot;Has Adolescent Depression Screening&quot;:
  exists ( [USQualityCore.ObservationScreeningAssessment: &quot;Adolescent depression screening assessment&quot;] AdolescentScreening
      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
        such that AdolescentScreening.effective.toInterval ( ) 14 days or less on or before day of start of QualifyingEncounter.period
          and AdolescentScreening.value is not null
          and AdolescentScreening.status in { 'final', 'amended', 'corrected' }
  )

define &quot;Has Adult Depression Screening&quot;:
  exists ( [USQualityCore.ObservationScreeningAssessment: &quot;Adult depression screening assessment&quot;] AdultScreening
      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
        such that AdultScreening.effective.toInterval ( ) 14 days or less on or before day of start of QualifyingEncounter.period
          and AdultScreening.value is not null
          and AdultScreening.status in { 'final', 'amended', 'corrected' }
  )

define &quot;Has Most Recent Adolescent Screening Negative&quot;:
  ( &quot;Most Recent Adolescent Depression Screening&quot; AdolescentScreen
      where AdolescentScreen.value ~ &quot;Depression screening negative (finding)&quot;
  ) is not null

define &quot;Has Most Recent Adult Screening Negative&quot;:
  ( &quot;Most Recent Adult Depression Screening&quot; AdultScreen
      where AdultScreen.value ~ &quot;Depression screening negative (finding)&quot;
  ) is not null

define &quot;History of Bipolar Diagnosis Before Qualifying Encounter&quot;:
  [USQualityCore.ConditionProblemsHealthConcerns: &quot;Bipolar Disorder&quot;] BipolarDiagnosis
    with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
      such that BipolarDiagnosis.prevalenceInterval ( ) starts before day of start of QualifyingEncounter.period

/*
TODO: Needs to be reassessed given the pattern change for ObservationCancelled, this should really be a ServiceRequest with a TaskRejected, yes?
define &quot;Medical or Patient Reason for Not Screening Adolescent for Depression&quot;:
  [USQualityCore.ObservationCancelled: code ~ &quot;Adolescent depression screening assessment&quot;] NoAdolescentScreen
    with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
      such that NoAdolescentScreen.issued during day of QualifyingEncounter.period
    where ( NoAdolescentScreen.notDoneReason ~ &quot;Depression screening declined (situation)&quot;
        or NoAdolescentScreen.notDoneReason in &quot;Medical Reason&quot;
    )

define &quot;Medical or Patient Reason for Not Screening Adult for Depression&quot;:
  [USQualityCore.ObservationCancelled: code ~ &quot;Adult depression screening assessment&quot;] NoAdultScreen
    with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
      such that NoAdultScreen.issued during day of QualifyingEncounter.period
    where ( NoAdultScreen.notDoneReason ~ &quot;Depression screening declined (situation)&quot;
        or NoAdultScreen.notDoneReason in &quot;Medical Reason&quot;
    )
*/

define &quot;Most Recent Adolescent Depression Screening&quot;:
  Last([USQualityCore.ObservationScreeningAssessment: &quot;Adolescent depression screening assessment&quot;] AdolescentDepressionScreening
      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
        such that AdolescentDepressionScreening.effective.toInterval() 14 days or less on or before day of start of QualifyingEncounter.period
          and AdolescentDepressionScreening.value is not null
          and AdolescentDepressionScreening.status in { 'final', 'amended', 'corrected' }
      sort by start of effective.toInterval()
  )

define &quot;Most Recent Adolescent Depression Screening Positive and Follow Up Provided&quot;:
  from
    &quot;Most Recent Adolescent Depression Screening&quot; LastAdolescentScreen,
    &quot;Follow Up Intervention for Positive Adolescent Depression Screening&quot; FollowUpPositiveAdolescentScreen,
    &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
    where LastAdolescentScreen.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period
      and LastAdolescentScreen.value ~ &quot;Depression screening positive (finding)&quot;
      and ( start of FollowUpPositiveAdolescentScreen.performed.toInterval ( ) during QualifyingEncounter.period
          or FollowUpPositiveAdolescentScreen.authoredOn 2 days or less on or after day of end of QualifyingEncounter.period
      )
      and ( Coalesce(start of FollowUpPositiveAdolescentScreen.performed.toInterval(), FollowUpPositiveAdolescentScreen.authoredOn) during day of &quot;Measurement Period&quot; )

define &quot;Most Recent Adult Depression Screening&quot;:
  Last([USQualityCore.ObservationScreeningAssessment: &quot;Adult depression screening assessment&quot;] AdultDepressionScreening
      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
        such that AdultDepressionScreening.effective.toInterval() 14 days or less on or before day of start of QualifyingEncounter.period
          and AdultDepressionScreening.value is not null
          and AdultDepressionScreening.status in { 'final', 'amended', 'corrected' }
      sort by start of effective.toInterval()
  )

define &quot;Most Recent Adult Depression Screening Positive and Follow Up Provided&quot;:
  from
    &quot;Most Recent Adult Depression Screening&quot; LastAdultScreen,
    &quot;Follow Up Intervention for Positive Adult Depression Screening&quot; FollowUpPositiveAdultScreen,
    &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter
    where LastAdultScreen.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period
      and LastAdultScreen.value ~ &quot;Depression screening positive (finding)&quot;
      and ( start of FollowUpPositiveAdultScreen.performed.toInterval ( ) during QualifyingEncounter.period
          or FollowUpPositiveAdultScreen.authoredOn 2 days or less on or after day of end of QualifyingEncounter.period
      )
      and ( Coalesce(start of FollowUpPositiveAdultScreen.performed.toInterval(), FollowUpPositiveAdultScreen.authoredOn) during day of &quot;Measurement Period&quot; )

define &quot;Patient Age 12 to 16 Years at Start of Measurement Period&quot;:
  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) in Interval[12, 16]

define &quot;Patient Age 12 Years or Older at Start of Measurement Period&quot;:
  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 12

define &quot;Patient Age 17 Years at Start of Measurement Period&quot;:
  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) = 17

define &quot;Patient Age 18 Years or Older at Start of Measurement Period&quot;:
  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 18

define &quot;Qualifying Encounter During Measurement Period&quot;:
  ( [USQualityCore.Encounter: &quot;Encounter to Screen for Depression&quot;]
    union [USQualityCore.Encounter: &quot;Physical Therapy Evaluation&quot;]
    union [USQualityCore.Encounter: &quot;Telephone Visits&quot;] ) QualifyingEncounter
    where QualifyingEncounter.period during day of &quot;Measurement Period&quot;
      and QualifyingEncounter.status = 'finished'

define &quot;SDE Ethnicity&quot;:
  SDE.&quot;SDE Ethnicity&quot;

define &quot;SDE Payer&quot;:
  SDE.&quot;SDE Payer&quot;

define &quot;SDE Race&quot;:
  SDE.&quot;SDE Race&quot;

define &quot;SDE Sex&quot;:
  SDE.&quot;SDE Sex&quot;</code></pre>
      </td>
    </tr>
    
  

<tr>
  <th colspan="2" scope="row" class="row-header">Generated using version 0.5.4 of the sample-content-ig Liquid templates</th>
</tr>

    </tbody>
  </table>
</div>
  </text>
  <url value="https://madie.cms.gov/Library/CMS2FHIRPCSDepScreenAndFollowUp"/>
  <version value="1.1.000"/>
  <name value="CMS2FHIRPCSDepScreenAndFollowUp"/>
  <title value="CMS2FHIRPCSDepScreenAndFollowUp"/>
  <status value="active"/>
  <experimental value="false"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2025-08-22T19:33:33+00:00"/>
  <publisher value="Centers for Medicare &amp; Medicaid Services (CMS)"/>
  <description value="CMS2FHIRPCSDepScreenAndFollowUp"/>
  <topic>
    <text value="FHIR"/>
  </topic>
  <topic>
    <text value="CQL"/>
  </topic>
  <content>
    <contentType value="text/cql"/>
    <data
          value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMyRkhJUlBDU0RlcFNjcmVlbkFuZEZvbGxvd1VwIHZlcnNpb24gJzEuMS4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5DdW11bGF0aXZlTWVkaWNhdGlvbkR1cmF0aW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIENNRAppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKCnZhbHVlc2V0ICJBZG9sZXNjZW50IERlcHJlc3Npb24gTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2NycKdmFsdWVzZXQgIkFkdWx0IERlcHJlc3Npb24gTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2NicKdmFsdWVzZXQgIkJpcG9sYXIgRGlzb3JkZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjcuMS4xMDEuMS4xMjgnCnZhbHVlc2V0ICJFbmNvdW50ZXIgdG8gU2NyZWVuIGZvciBEZXByZXNzaW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjYwMC4xOTE2Jwp2YWx1ZXNldCAiRm9sbG93IFVwIGZvciBBZG9sZXNjZW50IERlcHJlc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2OScKdmFsdWVzZXQgIkZvbGxvdyBVcCBmb3IgQWR1bHQgRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xNTY4Jwp2YWx1ZXNldCAiTWVkaWNhbCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwNycKdmFsdWVzZXQgIlBoeXNpY2FsIFRoZXJhcHkgRXZhbHVhdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDIyJwp2YWx1ZXNldCAiUmVmZXJyYWwgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xNTcwJwp2YWx1ZXNldCAiUmVmZXJyYWwgZm9yIEFkdWx0IERlcHJlc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU3MScKdmFsdWVzZXQgIlRlbGVwaG9uZSBWaXNpdHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwODAnCgpjb2RlICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiOiAnNzM4MzEtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0Fkb2xlc2NlbnQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCcKY29kZSAiQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCI6ICc3MzgzMi04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCcKY29kZSAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiOiAnNzIwODM0MDAwJyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbiknCmNvZGUgIkRlcHJlc3Npb24gc2NyZWVuaW5nIG5lZ2F0aXZlIChmaW5kaW5nKSI6ICc0MjgxNzEwMDAxMjQxMDInIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdEZXByZXNzaW9uIHNjcmVlbmluZyBuZWdhdGl2ZSAoZmluZGluZyknCmNvZGUgIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSI6ICc0MjgxODEwMDAxMjQxMDQnIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdEZXByZXNzaW9uIHNjcmVlbmluZyBwb3NpdGl2ZSAoZmluZGluZyknCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIlBhdGllbnQgQWdlIDEyIFllYXJzIG9yIE9sZGVyIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCIKICAgIGFuZCBleGlzdHMgKCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgKQoKZGVmaW5lICJEZW5vbWluYXRvciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyI6CiAgZXhpc3RzICJIaXN0b3J5IG9mIEJpcG9sYXIgRGlhZ25vc2lzIEJlZm9yZSBRdWFsaWZ5aW5nIEVuY291bnRlciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAoICJQYXRpZW50IEFnZSAxMiB0byAxNiBZZWFycyBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgIGFuZCAoICJIYXMgTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICBvciBleGlzdHMgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgKQogICkKICAgIG9yICggIlBhdGllbnQgQWdlIDE3IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgICBhbmQgKCAiSGFzIE1vc3QgUmVjZW50IEFkb2xlc2NlbnQgU2NyZWVuaW5nIE5lZ2F0aXZlIgogICAgICAgICAgICBvciBleGlzdHMgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICAgICAgb3IgIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICAgIG9yIGV4aXN0cyAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICApCiAgICApCiAgICBvciAoICJQYXRpZW50IEFnZSAxOCBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgYW5kICggIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICAgIG9yIGV4aXN0cyAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICApCiAgICApCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2VwdGlvbnMiOgogIGZhbHNlCi8qClRPRE86IE5lZWQgdG8gcmVhc3Nlc3MgaG93IHdlIGFyZSByZXByZXNlbnRpbmcgZ2l2ZW4gbm8gT2JzZXJ2YXRpb25DYW5jZWxsZWQgcHJvZmlsZQogICggZXhpc3RzICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkb2xlc2NlbnQgZm9yIERlcHJlc3Npb24iCiAgICAgIGFuZCBub3QgIkhhcyBBZG9sZXNjZW50IERlcHJlc3Npb24gU2NyZWVuaW5nIgogICkKICAgIG9yICggZXhpc3RzICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkdWx0IGZvciBEZXByZXNzaW9uIgogICAgICAgIGFuZCBub3QgIkhhcyBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyIKICAgICkKKi8KCmRlZmluZSAiRm9sbG93IFVwIEludGVydmVudGlvbiBmb3IgUG9zaXRpdmUgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgKCAoIFtVU1F1YWxpdHlDb3JlLk1lZGljYXRpb25SZXF1ZXN0OiAiQWRvbGVzY2VudCBEZXByZXNzaW9uIE1lZGljYXRpb25zIl0gQWRvbGVzY2VudE1lZAogICAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICAgIHN1Y2ggdGhhdCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIudmFsdWUgfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgcG9zaXRpdmUgKGZpbmRpbmcpIgogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgKQogICAgICB1bmlvbiAoIFtVU1F1YWxpdHlDb3JlLlNlcnZpY2VSZXF1ZXN0OiAiUmVmZXJyYWwgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiJdIEFkb2xlc2NlbnRSZWZlcnJhbAogICAgICAgICAgd2hlcmUgQWRvbGVzY2VudFJlZmVycmFsLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICkKICAgICAgdW5pb24gKCBbVVNRdWFsaXR5Q29yZS5Qcm9jZWR1cmU6ICJGb2xsb3cgVXAgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiJdIEFkb2xlc2NlbnRGb2xsb3dVcAogICAgICAgICAgd2hlcmUgQWRvbGVzY2VudEZvbGxvd1VwLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICkKICApCgpkZWZpbmUgIkZvbGxvdyBVcCBJbnRlcnZlbnRpb24gZm9yIFBvc2l0aXZlIEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICAoICggW1VTUXVhbGl0eUNvcmUuTWVkaWNhdGlvblJlcXVlc3Q6ICJBZHVsdCBEZXByZXNzaW9uIE1lZGljYXRpb25zIl0gQWR1bHRNZWQKICAgICAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgICAgICBzdWNoIHRoYXQgIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCBBZHVsdE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmciLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSIKICAgICAgICAgICAgYW5kIEFkdWx0TWVkLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgICAgIGFuZCBBZHVsdE1lZC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgKQogICAgICB1bmlvbiAoIFtVU1F1YWxpdHlDb3JlLlNlcnZpY2VSZXF1ZXN0OiAiUmVmZXJyYWwgZm9yIEFkdWx0IERlcHJlc3Npb24iXSBBZHVsdFJlZmVycmFsCiAgICAgICAgICB3aGVyZSBBZHVsdFJlZmVycmFsLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICkKICAgICAgdW5pb24gKCBbVVNRdWFsaXR5Q29yZS5Qcm9jZWR1cmU6ICJGb2xsb3cgVXAgZm9yIEFkdWx0IERlcHJlc3Npb24iXSBBZHVsdEZvbGxvd1VwCiAgICAgICAgICB3aGVyZSBBZHVsdEZvbGxvd1VwLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICkKICApCgpkZWZpbmUgIkhhcyBBZG9sZXNjZW50IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICBleGlzdHMgKCBbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZG9sZXNjZW50U2NyZWVuaW5nCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgQWRvbGVzY2VudFNjcmVlbmluZy5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBBZG9sZXNjZW50U2NyZWVuaW5nLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgICAgICBhbmQgQWRvbGVzY2VudFNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCgpkZWZpbmUgIkhhcyBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgZXhpc3RzICggW1VTUXVhbGl0eUNvcmUuT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCJdIEFkdWx0U2NyZWVuaW5nCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgQWR1bHRTY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICBhbmQgQWR1bHRTY3JlZW5pbmcudmFsdWUgaXMgbm90IG51bGwKICAgICAgICAgIGFuZCBBZHVsdFNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCgpkZWZpbmUgIkhhcyBNb3N0IFJlY2VudCBBZG9sZXNjZW50IFNjcmVlbmluZyBOZWdhdGl2ZSI6CiAgKCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIgQWRvbGVzY2VudFNjcmVlbgogICAgICB3aGVyZSBBZG9sZXNjZW50U2NyZWVuLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIG5lZ2F0aXZlIChmaW5kaW5nKSIKICApIGlzIG5vdCBudWxsCgpkZWZpbmUgIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiOgogICggIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIiBBZHVsdFNjcmVlbgogICAgICB3aGVyZSBBZHVsdFNjcmVlbi52YWx1ZSB+ICJEZXByZXNzaW9uIHNjcmVlbmluZyBuZWdhdGl2ZSAoZmluZGluZykiCiAgKSBpcyBub3QgbnVsbAoKZGVmaW5lICJIaXN0b3J5IG9mIEJpcG9sYXIgRGlhZ25vc2lzIEJlZm9yZSBRdWFsaWZ5aW5nIEVuY291bnRlciI6CiAgW1VTUXVhbGl0eUNvcmUuQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkJpcG9sYXIgRGlzb3JkZXIiXSBCaXBvbGFyRGlhZ25vc2lzCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBCaXBvbGFyRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKCi8qClRPRE86IE5lZWRzIHRvIGJlIHJlYXNzZXNzZWQgZ2l2ZW4gdGhlIHBhdHRlcm4gY2hhbmdlIGZvciBPYnNlcnZhdGlvbkNhbmNlbGxlZCwgdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgU2VydmljZVJlcXVlc3Qgd2l0aCBhIFRhc2tSZWplY3RlZCwgeWVzPwpkZWZpbmUgIk1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBTY3JlZW5pbmcgQWRvbGVzY2VudCBmb3IgRGVwcmVzc2lvbiI6CiAgW1VTUXVhbGl0eUNvcmUuT2JzZXJ2YXRpb25DYW5jZWxsZWQ6IGNvZGUgfiAiQWRvbGVzY2VudCBkZXByZXNzaW9uIHNjcmVlbmluZyBhc3Nlc3NtZW50Il0gTm9BZG9sZXNjZW50U2NyZWVuCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBOb0Fkb2xlc2NlbnRTY3JlZW4uaXNzdWVkIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgIHdoZXJlICggTm9BZG9sZXNjZW50U2NyZWVuLm5vdERvbmVSZWFzb24gfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiCiAgICAgICAgb3IgTm9BZG9sZXNjZW50U2NyZWVuLm5vdERvbmVSZWFzb24gaW4gIk1lZGljYWwgUmVhc29uIgogICAgKQoKZGVmaW5lICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkdWx0IGZvciBEZXByZXNzaW9uIjoKICBbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvbkNhbmNlbGxlZDogY29kZSB+ICJBZHVsdCBkZXByZXNzaW9uIHNjcmVlbmluZyBhc3Nlc3NtZW50Il0gTm9BZHVsdFNjcmVlbgogICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICBzdWNoIHRoYXQgTm9BZHVsdFNjcmVlbi5pc3N1ZWQgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgd2hlcmUgKCBOb0FkdWx0U2NyZWVuLm5vdERvbmVSZWFzb24gfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiCiAgICAgICAgb3IgTm9BZHVsdFNjcmVlbi5ub3REb25lUmVhc29uIGluICJNZWRpY2FsIFJlYXNvbiIKICAgICkKKi8KCmRlZmluZSAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgTGFzdChbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZG9sZXNjZW50RGVwcmVzc2lvblNjcmVlbmluZwogICAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgICAgc3VjaCB0aGF0IEFkb2xlc2NlbnREZXByZXNzaW9uU2NyZWVuaW5nLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBBZG9sZXNjZW50RGVwcmVzc2lvblNjcmVlbmluZy52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgYW5kIEFkb2xlc2NlbnREZXByZXNzaW9uU2NyZWVuaW5nLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICApCgpkZWZpbmUgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCI6CiAgZnJvbQogICAgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIExhc3RBZG9sZXNjZW50U2NyZWVuLAogICAgIkZvbGxvdyBVcCBJbnRlcnZlbnRpb24gZm9yIFBvc2l0aXZlIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIEZvbGxvd1VwUG9zaXRpdmVBZG9sZXNjZW50U2NyZWVuLAogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIExhc3RBZG9sZXNjZW50U2NyZWVuLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIExhc3RBZG9sZXNjZW50U2NyZWVuLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSIKICAgICAgYW5kICggc3RhcnQgb2YgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgb3IgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4uYXV0aG9yZWRPbiAyIGRheXMgb3IgbGVzcyBvbiBvciBhZnRlciBkYXkgb2YgZW5kIG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICkKICAgICAgYW5kICggQ29hbGVzY2Uoc3RhcnQgb2YgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSwgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4uYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICBMYXN0KFtVU1F1YWxpdHlDb3JlLk9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIkFkdWx0IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZHVsdERlcHJlc3Npb25TY3JlZW5pbmcKICAgICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHN1Y2ggdGhhdCBBZHVsdERlcHJlc3Npb25TY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgYW5kIEFkdWx0RGVwcmVzc2lvblNjcmVlbmluZy52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgYW5kIEFkdWx0RGVwcmVzc2lvblNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgc29ydCBieSBzdGFydCBvZiBlZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgKQoKZGVmaW5lICJNb3N0IFJlY2VudCBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyBQb3NpdGl2ZSBhbmQgRm9sbG93IFVwIFByb3ZpZGVkIjoKICBmcm9tCiAgICAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIExhc3RBZHVsdFNjcmVlbiwKICAgICJGb2xsb3cgVXAgSW50ZXJ2ZW50aW9uIGZvciBQb3NpdGl2ZSBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyIgRm9sbG93VXBQb3NpdGl2ZUFkdWx0U2NyZWVuLAogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIExhc3RBZHVsdFNjcmVlbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBMYXN0QWR1bHRTY3JlZW4udmFsdWUgfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgcG9zaXRpdmUgKGZpbmRpbmcpIgogICAgICBhbmQgKCBzdGFydCBvZiBGb2xsb3dVcFBvc2l0aXZlQWR1bHRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgb3IgRm9sbG93VXBQb3NpdGl2ZUFkdWx0U2NyZWVuLmF1dGhvcmVkT24gMiBkYXlzIG9yIGxlc3Mgb24gb3IgYWZ0ZXIgZGF5IG9mIGVuZCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICApCiAgICAgIGFuZCAoIENvYWxlc2NlKHN0YXJ0IG9mIEZvbGxvd1VwUG9zaXRpdmVBZHVsdFNjcmVlbi5wZXJmb3JtZWQudG9JbnRlcnZhbCgpLCBGb2xsb3dVcFBvc2l0aXZlQWR1bHRTY3JlZW4uYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIlBhdGllbnQgQWdlIDEyIHRvIDE2IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgaW4gSW50ZXJ2YWxbMTIsIDE2XQoKZGVmaW5lICJQYXRpZW50IEFnZSAxMiBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDEyCgpkZWZpbmUgIlBhdGllbnQgQWdlIDE3IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPSAxNwoKZGVmaW5lICJQYXRpZW50IEFnZSAxOCBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDE4CgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICggW1VTUXVhbGl0eUNvcmUuRW5jb3VudGVyOiAiRW5jb3VudGVyIHRvIFNjcmVlbiBmb3IgRGVwcmVzc2lvbiJdCiAgICB1bmlvbiBbVVNRdWFsaXR5Q29yZS5FbmNvdW50ZXI6ICJQaHlzaWNhbCBUaGVyYXB5IEV2YWx1YXRpb24iXQogICAgdW5pb24gW1VTUXVhbGl0eUNvcmUuRW5jb3VudGVyOiAiVGVsZXBob25lIFZpc2l0cyJdICkgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgUXVhbGlmeWluZ0VuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCI="/>
  </content>
</Library>