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

: AHAOverall - XML Representation

Active as of 2025-08-22

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="AHAOverall"/>
  <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>
  <language value="en"/>
  <text>
    <status value="extensions"/>
    <div xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <table class="narrative-table">
    <tbody>
<tr>


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


</tr>

<tr>


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



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


</tr>





<tr>


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



<td class="content-container">5.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">Telligen</td>


</tr>







<tr>


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



<td class="content-container"><div><p>This version of the AHAOverall library is patterned after HFCommonDefinitionsQDM library version '3.0.000'</p>
</div></td>


</tr>









<tr>


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



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


</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 AHAOverall version '5.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.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

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

valueset &quot;Care Services in Long Term Residential Facility&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014'
valueset &quot;Ejection Fraction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1134'
valueset &quot;Heart Failure&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.376'
valueset &quot;Heart Transplant&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.33'
valueset &quot;Heart Transplant Complications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.56'
valueset &quot;Home Healthcare Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016'
valueset &quot;Left Ventricular Assist Device Complications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.58'
valueset &quot;Left Ventricular Assist Device Placement&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.61'
valueset &quot;Moderate or Severe&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1092'
valueset &quot;Moderate or Severe LVSD&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1090'
valueset &quot;Nursing Facility Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012'
valueset &quot;Office Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'
valueset &quot;Outpatient Consultation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008'
valueset &quot;Patient Provider Interaction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1012'

code &quot;Left ventricular systolic dysfunction (disorder)&quot;: '134401001' from &quot;SNOMEDCT&quot; display 'Left ventricular systolic dysfunction (disorder)'

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

/*
@description: Returns certain finished encounter types that overlap a Heart Failure condition and are during the measurement period: 
                * care services in long term residential facility (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014)
                * home healthcare services (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016)
                * nursing facility visits (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012)
                * office visits (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001)
                * outpatient consultation (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008)
*/
define &quot;Heart Failure Outpatient Encounter&quot;:
  &quot;Outpatient Encounter&quot; QualifyingEncounter
    with ( [Condition: &quot;Heart Failure&quot;] ) HeartFailure
      such that HeartFailure.prevalenceInterval ( ) overlaps day of QualifyingEncounter.period
        and HeartFailure.isVerified ( )
    where QualifyingEncounter.period during day of &quot;Measurement Period&quot;
      and QualifyingEncounter.isEncounterFinished ( )

define &quot;Outpatient Encounter&quot;:
  ( [Encounter: &quot;Care Services in Long Term Residential Facility&quot;]
      union [Encounter: &quot;Home Healthcare Services&quot;]
      union [Encounter: &quot;Nursing Facility Visit&quot;]
      union [Encounter: &quot;Office Visit&quot;]
      union [Encounter: &quot;Outpatient Consultation&quot;]
  ) 

/*
@description: Returns true if patient has confirmed heart transplant complications that start before the end of a heart failure outpatient encounter with history of moderate or severe LVSD 
*/
define &quot;Has Heart Transplant Complications&quot;:
  exists ( ( [Condition: &quot;Heart Transplant Complications&quot;] ) HeartTransplantComplications
      let diagnosisStart: Coalesce(start of HeartTransplantComplications.prevalenceInterval(), HeartTransplantComplications.recordedDate)
      with &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
        such that date from diagnosisStart on or before date from end of ModerateOrSevereLVSDHFOutpatientEncounter.period
      where HeartTransplantComplications.isVerified ( )
  )

/*
@description: Returns true if patient has a completed LVAD placement that starts before the end of a heart failure outpatient encounter with history of moderate or severe LVSD
*/
define &quot;Has Left Ventricular Assist Device&quot;:
  exists ( [Procedure: &quot;Left Ventricular Assist Device Placement&quot;] LVADPlacement
      with &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
        such that LVADPlacement.performed.toInterval ( ) starts before day of end of ModerateOrSevereLVSDHFOutpatientEncounter.period
      where LVADPlacement.status = 'completed'
  )

/*
@description: Returns true if patient has active LVAD complications that start before the end of a heart failure outpatient encounter with history of moderate or severe LVSD
*/
define &quot;Has Left Ventricular Assist Device Complications&quot;:
  exists ( ( [Condition: &quot;Left Ventricular Assist Device Complications&quot;] ) LVADComplications
      let diagnosisStart: Coalesce(start of LVADComplications.prevalenceInterval(), LVADComplications.recordedDate)
      with &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
        such that date from diagnosisStart on or before date from end of ModerateOrSevereLVSDHFOutpatientEncounter.period
      where LVADComplications.isVerified ( )
  )             

/*
@description: Returns certain finished encounter types that occurred during the measurement period: 
                * office visits (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001)
                * outpatient consultation (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008)
                * nursing facility visits (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012)
                * care services in long term residential facility (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014)
                * home healthcare services (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016)
                * patient provider interactions (http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1012) 
*/
define &quot;Qualifying Outpatient Encounter During Measurement Period&quot;:
  &quot;Outpatient Encounter or Patient Provider Interaction&quot; ValidEncounter
    where ValidEncounter.period during day of &quot;Measurement Period&quot;
      and ValidEncounter.isEncounterFinished ( )

define &quot;Outpatient Encounter or Patient Provider Interaction&quot;:
  &quot;Outpatient Encounter&quot;
    union [Encounter: &quot;Patient Provider Interaction&quot;]

/*
@description: Returns completed heart tansplant procedures that start before the end of a heart failure outpatient encounter with history of moderate or severe LVSD
*/
define &quot;Has Heart Transplant&quot;:
  exists ( [Procedure: &quot;Heart Transplant&quot;] HeartTransplant
      with &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
        such that HeartTransplant.performed.toInterval ( ) starts before end of ModerateOrSevereLVSDHFOutpatientEncounter.period
      where HeartTransplant.status = 'completed'
  )

/*
@description: Returns heart failure outpatient encounters that start before the end of a moderate or severe LVSD finding
*/
define &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot;:
  &quot;Heart Failure Outpatient Encounter&quot; HFOutpatientEncounter
    with &quot;Moderate or Severe LVSD Findings&quot; LVSDFindings
      such that Coalesce(LVSDFindings.prevalenceInterval(), LVSDFindings.effective.toInterval()) starts before end of HFOutpatientEncounter.period 

/*
@description: Returns a union  of the following:
                * Observations where the final, amended or correction ejection fraction result is &lt;= 40
                * Moderate or Severe LVSD conditions where the diagnosis has been confirmed as active
*/
define &quot;Moderate or Severe LVSD Findings&quot;:
  ( [ObservationClinicalResult: &quot;Ejection Fraction&quot;] EjectionFraction
      where EjectionFraction.value as Quantity &lt;= 40 '%'
        and EjectionFraction.status in { 'final', 'amended', 'corrected' }
  )
    union ( ( ( [Condition: &quot;Moderate or Severe LVSD&quot;] )
      union ( ( [Condition: &quot;Left ventricular systolic dysfunction (disorder)&quot;] ) LVSDDiagnosis
        where LVSDDiagnosis.severity in &quot;Moderate or Severe&quot;
      ) ) ModerateOrSevereLVSD
      where ModerateOrSevereLVSD.isVerified ( )
    ) 

/*
@description: Returns true if the patient meets the following criteria:
                * 18 years of age or older,
                * Has two Qualifying Outpatient Encounters During Measurement Period
                * Has a Heart Failure Outpatient Encounter
*/
define &quot;Is Adult With Two Qualifying Outpatient Encounters and One Heart Failure Outpatient Encounter During the Measurement Period&quot;:
  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 18
    and exists ( &quot;Qualifying Outpatient Encounter During Measurement Period&quot; Encounter1
        with &quot;Qualifying Outpatient Encounter During Measurement Period&quot; Encounter2
          such that Encounter2.id !~ Encounter1.id
    )
    and exists &quot;Heart Failure Outpatient Encounter&quot;   


/*
@description: Returns true if the given Encounter is finished
*/
define fluent function isEncounterFinished(Encounter Encounter):
  Encounter.status = 'finished'

/*
@description: Returns true if the given MedicationRequest is ordered during the heart failure outpatient encounter with history of moderate or severe LVSD at any point
*/
define fluent function isOrderedDuringHeartFailureOutpatientEncounter(MedicationRequest MedicationRequest):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where MedicationRequest.authoredOn during day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and MedicationRequest.status in { 'active', 'completed' }
        and MedicationRequest.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
        and not exists ( [&quot;TaskRejected&quot;] TaskReject
            where TaskReject.focus.references ( MedicationRequest )
              and TaskReject.code ~ USQualityCoreCommon.&quot;Fulfill&quot;
        )
  )

/*
@description: Returns true if the given MedicationNotRequested overlaps after the day of the heart failure outpatient encounter with history of moderate or severe LVSD
*/
define fluent function isMedicationNotRequestedOrderedDuringHeartFailureOutpatientEncounter(MedicationRequest MedicationNotRequested):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where MedicationRequest.authoredOn during day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and MedicationRequest.status in { 'completed', 'active' }
        and MedicationRequest.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
        and not exists ( [&quot;TaskRejected&quot;] TaskReject
            where TaskReject.focus.references ( MedicationRequest )
              and TaskReject.code ~ USQualityCoreCommon.&quot;Fulfill&quot;
        )
  )

/*
@description: Returns true if the given Condition overlaps the heart failure outpatient encounter with history of moderate or severe LVSD at any point
*/
define fluent function overlapsHeartFailureOutpatientEncounter(Condition USQualityCore.ConditionEncounterDiagnosis):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where Condition.prevalenceInterval ( ) overlaps day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and Condition.isVerified ( )
  )

/*
@overloaded
@description: Returns true if the given Condition overlaps after the day of the heart failure outpatient encounter with history of moderate or severe LVSD
*/
define fluent function overlapsAfterHeartFailureOutpatientEncounter(Condition USQualityCore.ConditionEncounterDiagnosis):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where Condition.prevalenceInterval ( ) overlaps after day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and Condition.isVerified ( )
  )

/*
@overloaded
@description: Returns true if the given Procedure overlaps after the day of the heart failure outpatient encounter with history of moderate or severe LVSD
*/
define fluent function overlapsAfterHeartFailureOutpatientEncounter(Procedure Procedure):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where Procedure.performed.toInterval ( ) overlaps after day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and Procedure.status = 'completed'
  )

/*
@overloaded
@description: Returns true if the given AllergyIntolerance overlaps after the day of the heart failure outpatient encounter with history of moderate or severe LVSD
*/
define fluent function overlapsAfterHeartFailureOutpatientEncounter(AllergyIntolerance AllergyIntolerance):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where Interval[start of AllergyIntolerance.prevalenceInterval ( ), AllergyIntolerance.lastOccurrence]overlaps after day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and AllergyIntolerance.isVerified ( )
  )
          
/*
@overloaded
@description: Returns true if the given MedicationRequest overlaps after the day of the heart failure outpatient encounter with history of moderate or severe LVSD
*/
define fluent function overlapsAfterHeartFailureOutpatientEncounter(MedicationRequest MedicationRequest):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where First((collapse(MedicationRequest.dosageInstruction.timing.repeat.bounds DoseTime
            return TimingBoundToInterval(MedicationRequest.authoredOn, DoseTime)
        )) DrugPeriods
          sort by start of $this
      ) overlaps after day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and MedicationRequest.status in { 'active', 'completed' }
        and MedicationRequest.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
        and not exists ( [&quot;TaskRejected&quot;] TaskReject
            where TaskReject.focus.references ( MedicationRequest )
              and TaskReject.code ~ USQualityCoreCommon.&quot;Fulfill&quot;
        )
  )

/*
@overloaded
@description: Returns true if the given HeartRateObservation overlaps after the day of the heart failure outpatient encounter with history of moderate or severe LVSD
*/
define fluent function overlapsAfterHeartFailureOutpatientEncounter(HeartRateObservation USCore.HeartRateProfile):
  exists ( &quot;Heart Failure Outpatient Encounter with History of Moderate or Severe LVSD&quot; ModerateOrSevereLVSDHFOutpatientEncounter
      where HeartRateObservation.effective.toInterval ( ) overlaps after day of ModerateOrSevereLVSDHFOutpatientEncounter.period
        and HeartRateObservation.status in { 'final', 'amended', 'corrected' }
  )

/*
@description: Converts the possible representations of the timing bound to an interval using the given date as an anchor for durations
*/ 
define function TimingBoundToInterval(startDate System.DateTime, choice Choice&lt;FHIR.Duration, FHIR.Range, FHIR.Period&gt;):
  case
    when choice is FHIR.Period then
        choice as FHIR.Period
    when choice is FHIR.Range then
        Interval[startDate + (choice.low as Quantity), startDate + (choice.high as Quantity)]
    when choice is FHIR.Duration then
        Interval[startDate, startDate + (choice as FHIR.Duration))
    else
		null as Interval&lt;DateTime&gt;
	end</code></pre>
      </td>
    </tr>
    
  



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

    </tbody>
  </table>
</div>
  </text>
  <extension
             url="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem">
    <valueReference>
      <reference value="Device/cqf-tooling"/>
    </valueReference>
  </extension>
  <url value="https://madie.cms.gov/Library/AHAOverall"/>
  <version value="5.1.000"/>
  <name value="AHAOverall"/>
  <title value="AHAOverall"/>
  <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:19:03+00:00"/>
  <publisher value="Telligen"/>
  <description
               value="This version of the AHAOverall library is patterned after HFCommonDefinitionsQDM library version '3.0.000'"/>
  <topic>
    <text value="FHIR"/>
  </topic>
  <topic>
    <text value="CQL"/>
  </topic>
  <content>
    <contentType value="text/cql"/>
    <data
          value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBBSEFPdmVyYWxsIHZlcnNpb24gJzUuMS4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KCmNvZGVzeXN0ZW0gIlNOT01FRENUIjogJ2h0dHA6Ly9zbm9tZWQuaW5mby9zY3QnCgp2YWx1ZXNldCAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTQnCnZhbHVlc2V0ICJFamVjdGlvbiBGcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMTM0Jwp2YWx1ZXNldCAiSGVhcnQgRmFpbHVyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNzYnCnZhbHVlc2V0ICJIZWFydCBUcmFuc3BsYW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE3OC4zMycKdmFsdWVzZXQgIkhlYXJ0IFRyYW5zcGxhbnQgQ29tcGxpY2F0aW9ucyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNzguNTYnCnZhbHVlc2V0ICJIb21lIEhlYWx0aGNhcmUgU2VydmljZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTYnCnZhbHVlc2V0ICJMZWZ0IFZlbnRyaWN1bGFyIEFzc2lzdCBEZXZpY2UgQ29tcGxpY2F0aW9ucyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNzguNTgnCnZhbHVlc2V0ICJMZWZ0IFZlbnRyaWN1bGFyIEFzc2lzdCBEZXZpY2UgUGxhY2VtZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE3OC42MScKdmFsdWVzZXQgIk1vZGVyYXRlIG9yIFNldmVyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDkyJwp2YWx1ZXNldCAiTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTA5MCcKdmFsdWVzZXQgIk51cnNpbmcgRmFjaWxpdHkgVmlzaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTInCnZhbHVlc2V0ICJPZmZpY2UgVmlzaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMDEnCnZhbHVlc2V0ICJPdXRwYXRpZW50IENvbnN1bHRhdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwOCcKdmFsdWVzZXQgIlBhdGllbnQgUHJvdmlkZXIgSW50ZXJhY3Rpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAxMicKCmNvZGUgIkxlZnQgdmVudHJpY3VsYXIgc3lzdG9saWMgZHlzZnVuY3Rpb24gKGRpc29yZGVyKSI6ICcxMzQ0MDEwMDEnIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdMZWZ0IHZlbnRyaWN1bGFyIHN5c3RvbGljIGR5c2Z1bmN0aW9uIChkaXNvcmRlciknCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgY2VydGFpbiBmaW5pc2hlZCBlbmNvdW50ZXIgdHlwZXMgdGhhdCBvdmVybGFwIGEgSGVhcnQgRmFpbHVyZSBjb25kaXRpb24gYW5kIGFyZSBkdXJpbmcgdGhlIG1lYXN1cmVtZW50IHBlcmlvZDogCiAgICAgICAgICAgICAgICAqIGNhcmUgc2VydmljZXMgaW4gbG9uZyB0ZXJtIHJlc2lkZW50aWFsIGZhY2lsaXR5IChodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAxNCkKICAgICAgICAgICAgICAgICogaG9tZSBoZWFsdGhjYXJlIHNlcnZpY2VzIChodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAxNikKICAgICAgICAgICAgICAgICogbnVyc2luZyBmYWNpbGl0eSB2aXNpdHMgKGh0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDEyKQogICAgICAgICAgICAgICAgKiBvZmZpY2UgdmlzaXRzIChodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwMSkKICAgICAgICAgICAgICAgICogb3V0cGF0aWVudCBjb25zdWx0YXRpb24gKGh0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDA4KQoqLwpkZWZpbmUgIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIiOgogICJPdXRwYXRpZW50IEVuY291bnRlciIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAoIFtDb25kaXRpb246ICJIZWFydCBGYWlsdXJlIl0gKSBIZWFydEZhaWx1cmUKICAgICAgc3VjaCB0aGF0IEhlYXJ0RmFpbHVyZS5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgIGFuZCBIZWFydEZhaWx1cmUuaXNWZXJpZmllZCAoICkKICAgIHdoZXJlIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgYW5kIFF1YWxpZnlpbmdFbmNvdW50ZXIuaXNFbmNvdW50ZXJGaW5pc2hlZCAoICkKCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXIiOgogICggW0VuY291bnRlcjogIkNhcmUgU2VydmljZXMgaW4gTG9uZyBUZXJtIFJlc2lkZW50aWFsIEZhY2lsaXR5Il0KICAgICAgdW5pb24gW0VuY291bnRlcjogIkhvbWUgSGVhbHRoY2FyZSBTZXJ2aWNlcyJdCiAgICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJOdXJzaW5nIEZhY2lsaXR5IFZpc2l0Il0KICAgICAgdW5pb24gW0VuY291bnRlcjogIk9mZmljZSBWaXNpdCJdCiAgICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IENvbnN1bHRhdGlvbiJdCiAgKSAKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0cnVlIGlmIHBhdGllbnQgaGFzIGNvbmZpcm1lZCBoZWFydCB0cmFuc3BsYW50IGNvbXBsaWNhdGlvbnMgdGhhdCBzdGFydCBiZWZvcmUgdGhlIGVuZCBvZiBhIGhlYXJ0IGZhaWx1cmUgb3V0cGF0aWVudCBlbmNvdW50ZXIgd2l0aCBoaXN0b3J5IG9mIG1vZGVyYXRlIG9yIHNldmVyZSBMVlNEIAoqLwpkZWZpbmUgIkhhcyBIZWFydCBUcmFuc3BsYW50IENvbXBsaWNhdGlvbnMiOgogIGV4aXN0cyAoICggW0NvbmRpdGlvbjogIkhlYXJ0IFRyYW5zcGxhbnQgQ29tcGxpY2F0aW9ucyJdICkgSGVhcnRUcmFuc3BsYW50Q29tcGxpY2F0aW9ucwogICAgICBsZXQgZGlhZ25vc2lzU3RhcnQ6IENvYWxlc2NlKHN0YXJ0IG9mIEhlYXJ0VHJhbnNwbGFudENvbXBsaWNhdGlvbnMucHJldmFsZW5jZUludGVydmFsKCksIEhlYXJ0VHJhbnNwbGFudENvbXBsaWNhdGlvbnMucmVjb3JkZWREYXRlKQogICAgICB3aXRoICJIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIHdpdGggSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgZGF0ZSBmcm9tIGRpYWdub3Npc1N0YXJ0IG9uIG9yIGJlZm9yZSBkYXRlIGZyb20gZW5kIG9mIE1vZGVyYXRlT3JTZXZlcmVMVlNESEZPdXRwYXRpZW50RW5jb3VudGVyLnBlcmlvZAogICAgICB3aGVyZSBIZWFydFRyYW5zcGxhbnRDb21wbGljYXRpb25zLmlzVmVyaWZpZWQgKCApCiAgKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRydWUgaWYgcGF0aWVudCBoYXMgYSBjb21wbGV0ZWQgTFZBRCBwbGFjZW1lbnQgdGhhdCBzdGFydHMgYmVmb3JlIHRoZSBlbmQgb2YgYSBoZWFydCBmYWlsdXJlIG91dHBhdGllbnQgZW5jb3VudGVyIHdpdGggaGlzdG9yeSBvZiBtb2RlcmF0ZSBvciBzZXZlcmUgTFZTRAoqLwpkZWZpbmUgIkhhcyBMZWZ0IFZlbnRyaWN1bGFyIEFzc2lzdCBEZXZpY2UiOgogIGV4aXN0cyAoIFtQcm9jZWR1cmU6ICJMZWZ0IFZlbnRyaWN1bGFyIEFzc2lzdCBEZXZpY2UgUGxhY2VtZW50Il0gTFZBRFBsYWNlbWVudAogICAgICB3aXRoICJIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIHdpdGggSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgTFZBRFBsYWNlbWVudC5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBkYXkgb2YgZW5kIG9mIE1vZGVyYXRlT3JTZXZlcmVMVlNESEZPdXRwYXRpZW50RW5jb3VudGVyLnBlcmlvZAogICAgICB3aGVyZSBMVkFEUGxhY2VtZW50LnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRydWUgaWYgcGF0aWVudCBoYXMgYWN0aXZlIExWQUQgY29tcGxpY2F0aW9ucyB0aGF0IHN0YXJ0IGJlZm9yZSB0aGUgZW5kIG9mIGEgaGVhcnQgZmFpbHVyZSBvdXRwYXRpZW50IGVuY291bnRlciB3aXRoIGhpc3Rvcnkgb2YgbW9kZXJhdGUgb3Igc2V2ZXJlIExWU0QKKi8KZGVmaW5lICJIYXMgTGVmdCBWZW50cmljdWxhciBBc3Npc3QgRGV2aWNlIENvbXBsaWNhdGlvbnMiOgogIGV4aXN0cyAoICggW0NvbmRpdGlvbjogIkxlZnQgVmVudHJpY3VsYXIgQXNzaXN0IERldmljZSBDb21wbGljYXRpb25zIl0gKSBMVkFEQ29tcGxpY2F0aW9ucwogICAgICBsZXQgZGlhZ25vc2lzU3RhcnQ6IENvYWxlc2NlKHN0YXJ0IG9mIExWQURDb21wbGljYXRpb25zLnByZXZhbGVuY2VJbnRlcnZhbCgpLCBMVkFEQ29tcGxpY2F0aW9ucy5yZWNvcmRlZERhdGUpCiAgICAgIHdpdGggIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIgd2l0aCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlcgogICAgICAgIHN1Y2ggdGhhdCBkYXRlIGZyb20gZGlhZ25vc2lzU3RhcnQgb24gb3IgYmVmb3JlIGRhdGUgZnJvbSBlbmQgb2YgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIucGVyaW9kCiAgICAgIHdoZXJlIExWQURDb21wbGljYXRpb25zLmlzVmVyaWZpZWQgKCApCiAgKSAgICAgICAgICAgICAKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBjZXJ0YWluIGZpbmlzaGVkIGVuY291bnRlciB0eXBlcyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kOiAKICAgICAgICAgICAgICAgICogb2ZmaWNlIHZpc2l0cyAoaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMDEpCiAgICAgICAgICAgICAgICAqIG91dHBhdGllbnQgY29uc3VsdGF0aW9uIChodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwOCkKICAgICAgICAgICAgICAgICogbnVyc2luZyBmYWNpbGl0eSB2aXNpdHMgKGh0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDEyKQogICAgICAgICAgICAgICAgKiBjYXJlIHNlcnZpY2VzIGluIGxvbmcgdGVybSByZXNpZGVudGlhbCBmYWNpbGl0eSAoaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTQpCiAgICAgICAgICAgICAgICAqIGhvbWUgaGVhbHRoY2FyZSBzZXJ2aWNlcyAoaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTYpCiAgICAgICAgICAgICAgICAqIHBhdGllbnQgcHJvdmlkZXIgaW50ZXJhY3Rpb25zIChodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDEyKSAKKi8KZGVmaW5lICJRdWFsaWZ5aW5nIE91dHBhdGllbnQgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJPdXRwYXRpZW50IEVuY291bnRlciBvciBQYXRpZW50IFByb3ZpZGVyIEludGVyYWN0aW9uIiBWYWxpZEVuY291bnRlcgogICAgd2hlcmUgVmFsaWRFbmNvdW50ZXIucGVyaW9kIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgYW5kIFZhbGlkRW5jb3VudGVyLmlzRW5jb3VudGVyRmluaXNoZWQgKCApCgpkZWZpbmUgIk91dHBhdGllbnQgRW5jb3VudGVyIG9yIFBhdGllbnQgUHJvdmlkZXIgSW50ZXJhY3Rpb24iOgogICJPdXRwYXRpZW50IEVuY291bnRlciIKICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJQYXRpZW50IFByb3ZpZGVyIEludGVyYWN0aW9uIl0KCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBjb21wbGV0ZWQgaGVhcnQgdGFuc3BsYW50IHByb2NlZHVyZXMgdGhhdCBzdGFydCBiZWZvcmUgdGhlIGVuZCBvZiBhIGhlYXJ0IGZhaWx1cmUgb3V0cGF0aWVudCBlbmNvdW50ZXIgd2l0aCBoaXN0b3J5IG9mIG1vZGVyYXRlIG9yIHNldmVyZSBMVlNECiovCmRlZmluZSAiSGFzIEhlYXJ0IFRyYW5zcGxhbnQiOgogIGV4aXN0cyAoIFtQcm9jZWR1cmU6ICJIZWFydCBUcmFuc3BsYW50Il0gSGVhcnRUcmFuc3BsYW50CiAgICAgIHdpdGggIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIgd2l0aCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlcgogICAgICAgIHN1Y2ggdGhhdCBIZWFydFRyYW5zcGxhbnQucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIE1vZGVyYXRlT3JTZXZlcmVMVlNESEZPdXRwYXRpZW50RW5jb3VudGVyLnBlcmlvZAogICAgICB3aGVyZSBIZWFydFRyYW5zcGxhbnQuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICApCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgaGVhcnQgZmFpbHVyZSBvdXRwYXRpZW50IGVuY291bnRlcnMgdGhhdCBzdGFydCBiZWZvcmUgdGhlIGVuZCBvZiBhIG1vZGVyYXRlIG9yIHNldmVyZSBMVlNEIGZpbmRpbmcKKi8KZGVmaW5lICJIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIHdpdGggSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIiIEhGT3V0cGF0aWVudEVuY291bnRlcgogICAgd2l0aCAiTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QgRmluZGluZ3MiIExWU0RGaW5kaW5ncwogICAgICBzdWNoIHRoYXQgQ29hbGVzY2UoTFZTREZpbmRpbmdzLnByZXZhbGVuY2VJbnRlcnZhbCgpLCBMVlNERmluZGluZ3MuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSEZPdXRwYXRpZW50RW5jb3VudGVyLnBlcmlvZCAKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBhIHVuaW9uICBvZiB0aGUgZm9sbG93aW5nOgogICAgICAgICAgICAgICAgKiBPYnNlcnZhdGlvbnMgd2hlcmUgdGhlIGZpbmFsLCBhbWVuZGVkIG9yIGNvcnJlY3Rpb24gZWplY3Rpb24gZnJhY3Rpb24gcmVzdWx0IGlzIDw9IDQwCiAgICAgICAgICAgICAgICAqIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIGNvbmRpdGlvbnMgd2hlcmUgdGhlIGRpYWdub3NpcyBoYXMgYmVlbiBjb25maXJtZWQgYXMgYWN0aXZlCiovCmRlZmluZSAiTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QgRmluZGluZ3MiOgogICggW09ic2VydmF0aW9uQ2xpbmljYWxSZXN1bHQ6ICJFamVjdGlvbiBGcmFjdGlvbiJdIEVqZWN0aW9uRnJhY3Rpb24KICAgICAgd2hlcmUgRWplY3Rpb25GcmFjdGlvbi52YWx1ZSBhcyBRdWFudGl0eSA8PSA0MCAnJScKICAgICAgICBhbmQgRWplY3Rpb25GcmFjdGlvbi5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCiAgICB1bmlvbiAoICggKCBbQ29uZGl0aW9uOiAiTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiXSApCiAgICAgIHVuaW9uICggKCBbQ29uZGl0aW9uOiAiTGVmdCB2ZW50cmljdWxhciBzeXN0b2xpYyBkeXNmdW5jdGlvbiAoZGlzb3JkZXIpIl0gKSBMVlNERGlhZ25vc2lzCiAgICAgICAgd2hlcmUgTFZTRERpYWdub3Npcy5zZXZlcml0eSBpbiAiTW9kZXJhdGUgb3IgU2V2ZXJlIgogICAgICApICkgTW9kZXJhdGVPclNldmVyZUxWU0QKICAgICAgd2hlcmUgTW9kZXJhdGVPclNldmVyZUxWU0QuaXNWZXJpZmllZCAoICkKICAgICkgCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aWVudCBtZWV0cyB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgogICAgICAgICAgICAgICAgKiAxOCB5ZWFycyBvZiBhZ2Ugb3Igb2xkZXIsCiAgICAgICAgICAgICAgICAqIEhhcyB0d28gUXVhbGlmeWluZyBPdXRwYXRpZW50IEVuY291bnRlcnMgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZAogICAgICAgICAgICAgICAgKiBIYXMgYSBIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyCiovCmRlZmluZSAiSXMgQWR1bHQgV2l0aCBUd28gUXVhbGlmeWluZyBPdXRwYXRpZW50IEVuY291bnRlcnMgYW5kIE9uZSBIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIER1cmluZyB0aGUgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxOAogICAgYW5kIGV4aXN0cyAoICJRdWFsaWZ5aW5nIE91dHBhdGllbnQgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIEVuY291bnRlcjEKICAgICAgICB3aXRoICJRdWFsaWZ5aW5nIE91dHBhdGllbnQgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIEVuY291bnRlcjIKICAgICAgICAgIHN1Y2ggdGhhdCBFbmNvdW50ZXIyLmlkICF+IEVuY291bnRlcjEuaWQKICAgICkKICAgIGFuZCBleGlzdHMgIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIiICAgCgoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIEVuY291bnRlciBpcyBmaW5pc2hlZAoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzRW5jb3VudGVyRmluaXNoZWQoRW5jb3VudGVyIEVuY291bnRlcik6CiAgRW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBNZWRpY2F0aW9uUmVxdWVzdCBpcyBvcmRlcmVkIGR1cmluZyB0aGUgaGVhcnQgZmFpbHVyZSBvdXRwYXRpZW50IGVuY291bnRlciB3aXRoIGhpc3Rvcnkgb2YgbW9kZXJhdGUgb3Igc2V2ZXJlIExWU0QgYXQgYW55IHBvaW50CiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaXNPcmRlcmVkRHVyaW5nSGVhcnRGYWlsdXJlT3V0cGF0aWVudEVuY291bnRlcihNZWRpY2F0aW9uUmVxdWVzdCBNZWRpY2F0aW9uUmVxdWVzdCk6CiAgZXhpc3RzICggIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIgd2l0aCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlcgogICAgICB3aGVyZSBNZWRpY2F0aW9uUmVxdWVzdC5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgYW5kIE1lZGljYXRpb25SZXF1ZXN0LnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgYW5kIE1lZGljYXRpb25SZXF1ZXN0LmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgYW5kIG5vdCBleGlzdHMgKCBbIlRhc2tSZWplY3RlZCJdIFRhc2tSZWplY3QKICAgICAgICAgICAgd2hlcmUgVGFza1JlamVjdC5mb2N1cy5yZWZlcmVuY2VzICggTWVkaWNhdGlvblJlcXVlc3QgKQogICAgICAgICAgICAgIGFuZCBUYXNrUmVqZWN0LmNvZGUgfiBVU1F1YWxpdHlDb3JlQ29tbW9uLiJGdWxmaWxsIgogICAgICAgICkKICApCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gTWVkaWNhdGlvbk5vdFJlcXVlc3RlZCBvdmVybGFwcyBhZnRlciB0aGUgZGF5IG9mIHRoZSBoZWFydCBmYWlsdXJlIG91dHBhdGllbnQgZW5jb3VudGVyIHdpdGggaGlzdG9yeSBvZiBtb2RlcmF0ZSBvciBzZXZlcmUgTFZTRAoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzTWVkaWNhdGlvbk5vdFJlcXVlc3RlZE9yZGVyZWREdXJpbmdIZWFydEZhaWx1cmVPdXRwYXRpZW50RW5jb3VudGVyKE1lZGljYXRpb25SZXF1ZXN0IE1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQpOgogIGV4aXN0cyAoICJIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIHdpdGggSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIKICAgICAgd2hlcmUgTWVkaWNhdGlvblJlcXVlc3QuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mIE1vZGVyYXRlT3JTZXZlcmVMVlNESEZPdXRwYXRpZW50RW5jb3VudGVyLnBlcmlvZAogICAgICAgIGFuZCBNZWRpY2F0aW9uUmVxdWVzdC5zdGF0dXMgaW4geyAnY29tcGxldGVkJywgJ2FjdGl2ZScgfQogICAgICAgIGFuZCBNZWRpY2F0aW9uUmVxdWVzdC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICAgIGFuZCBub3QgZXhpc3RzICggWyJUYXNrUmVqZWN0ZWQiXSBUYXNrUmVqZWN0CiAgICAgICAgICAgIHdoZXJlIFRhc2tSZWplY3QuZm9jdXMucmVmZXJlbmNlcyAoIE1lZGljYXRpb25SZXF1ZXN0ICkKICAgICAgICAgICAgICBhbmQgVGFza1JlamVjdC5jb2RlIH4gVVNRdWFsaXR5Q29yZUNvbW1vbi4iRnVsZmlsbCIKICAgICAgICApCiAgKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIENvbmRpdGlvbiBvdmVybGFwcyB0aGUgaGVhcnQgZmFpbHVyZSBvdXRwYXRpZW50IGVuY291bnRlciB3aXRoIGhpc3Rvcnkgb2YgbW9kZXJhdGUgb3Igc2V2ZXJlIExWU0QgYXQgYW55IHBvaW50CiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNIZWFydEZhaWx1cmVPdXRwYXRpZW50RW5jb3VudGVyKENvbmRpdGlvbiBVU1F1YWxpdHlDb3JlLkNvbmRpdGlvbkVuY291bnRlckRpYWdub3Npcyk6CiAgZXhpc3RzICggIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIgd2l0aCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlcgogICAgICB3aGVyZSBDb25kaXRpb24ucHJldmFsZW5jZUludGVydmFsICggKSBvdmVybGFwcyBkYXkgb2YgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgYW5kIENvbmRpdGlvbi5pc1ZlcmlmaWVkICggKQogICkKCi8qCkBvdmVybG9hZGVkCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBDb25kaXRpb24gb3ZlcmxhcHMgYWZ0ZXIgdGhlIGRheSBvZiB0aGUgaGVhcnQgZmFpbHVyZSBvdXRwYXRpZW50IGVuY291bnRlciB3aXRoIGhpc3Rvcnkgb2YgbW9kZXJhdGUgb3Igc2V2ZXJlIExWU0QKKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBvdmVybGFwc0FmdGVySGVhcnRGYWlsdXJlT3V0cGF0aWVudEVuY291bnRlcihDb25kaXRpb24gVVNRdWFsaXR5Q29yZS5Db25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXMpOgogIGV4aXN0cyAoICJIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIHdpdGggSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIKICAgICAgd2hlcmUgQ29uZGl0aW9uLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIE1vZGVyYXRlT3JTZXZlcmVMVlNESEZPdXRwYXRpZW50RW5jb3VudGVyLnBlcmlvZAogICAgICAgIGFuZCBDb25kaXRpb24uaXNWZXJpZmllZCAoICkKICApCgovKgpAb3ZlcmxvYWRlZApAZGVzY3JpcHRpb246IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gUHJvY2VkdXJlIG92ZXJsYXBzIGFmdGVyIHRoZSBkYXkgb2YgdGhlIGhlYXJ0IGZhaWx1cmUgb3V0cGF0aWVudCBlbmNvdW50ZXIgd2l0aCBoaXN0b3J5IG9mIG1vZGVyYXRlIG9yIHNldmVyZSBMVlNECiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNBZnRlckhlYXJ0RmFpbHVyZU91dHBhdGllbnRFbmNvdW50ZXIoUHJvY2VkdXJlIFByb2NlZHVyZSk6CiAgZXhpc3RzICggIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIgd2l0aCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlcgogICAgICB3aGVyZSBQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlci5wZXJpb2QKICAgICAgICBhbmQgUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgKQoKLyoKQG92ZXJsb2FkZWQKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIEFsbGVyZ3lJbnRvbGVyYW5jZSBvdmVybGFwcyBhZnRlciB0aGUgZGF5IG9mIHRoZSBoZWFydCBmYWlsdXJlIG91dHBhdGllbnQgZW5jb3VudGVyIHdpdGggaGlzdG9yeSBvZiBtb2RlcmF0ZSBvciBzZXZlcmUgTFZTRAoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIG92ZXJsYXBzQWZ0ZXJIZWFydEZhaWx1cmVPdXRwYXRpZW50RW5jb3VudGVyKEFsbGVyZ3lJbnRvbGVyYW5jZSBBbGxlcmd5SW50b2xlcmFuY2UpOgogIGV4aXN0cyAoICJIZWFydCBGYWlsdXJlIE91dHBhdGllbnQgRW5jb3VudGVyIHdpdGggSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIKICAgICAgd2hlcmUgSW50ZXJ2YWxbc3RhcnQgb2YgQWxsZXJneUludG9sZXJhbmNlLnByZXZhbGVuY2VJbnRlcnZhbCAoICksIEFsbGVyZ3lJbnRvbGVyYW5jZS5sYXN0T2NjdXJyZW5jZV1vdmVybGFwcyBhZnRlciBkYXkgb2YgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgYW5kIEFsbGVyZ3lJbnRvbGVyYW5jZS5pc1ZlcmlmaWVkICggKQogICkKICAgICAgICAgIAovKgpAb3ZlcmxvYWRlZApAZGVzY3JpcHRpb246IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gTWVkaWNhdGlvblJlcXVlc3Qgb3ZlcmxhcHMgYWZ0ZXIgdGhlIGRheSBvZiB0aGUgaGVhcnQgZmFpbHVyZSBvdXRwYXRpZW50IGVuY291bnRlciB3aXRoIGhpc3Rvcnkgb2YgbW9kZXJhdGUgb3Igc2V2ZXJlIExWU0QKKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBvdmVybGFwc0FmdGVySGVhcnRGYWlsdXJlT3V0cGF0aWVudEVuY291bnRlcihNZWRpY2F0aW9uUmVxdWVzdCBNZWRpY2F0aW9uUmVxdWVzdCk6CiAgZXhpc3RzICggIkhlYXJ0IEZhaWx1cmUgT3V0cGF0aWVudCBFbmNvdW50ZXIgd2l0aCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlcgogICAgICB3aGVyZSBGaXJzdCgoY29sbGFwc2UoTWVkaWNhdGlvblJlcXVlc3QuZG9zYWdlSW5zdHJ1Y3Rpb24udGltaW5nLnJlcGVhdC5ib3VuZHMgRG9zZVRpbWUKICAgICAgICAgICAgcmV0dXJuIFRpbWluZ0JvdW5kVG9JbnRlcnZhbChNZWRpY2F0aW9uUmVxdWVzdC5hdXRob3JlZE9uLCBEb3NlVGltZSkKICAgICAgICApKSBEcnVnUGVyaW9kcwogICAgICAgICAgc29ydCBieSBzdGFydCBvZiAkdGhpcwogICAgICApIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBNb2RlcmF0ZU9yU2V2ZXJlTFZTREhGT3V0cGF0aWVudEVuY291bnRlci5wZXJpb2QKICAgICAgICBhbmQgTWVkaWNhdGlvblJlcXVlc3Quc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgTWVkaWNhdGlvblJlcXVlc3QuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICBhbmQgbm90IGV4aXN0cyAoIFsiVGFza1JlamVjdGVkIl0gVGFza1JlamVjdAogICAgICAgICAgICB3aGVyZSBUYXNrUmVqZWN0LmZvY3VzLnJlZmVyZW5jZXMgKCBNZWRpY2F0aW9uUmVxdWVzdCApCiAgICAgICAgICAgICAgYW5kIFRhc2tSZWplY3QuY29kZSB+IFVTUXVhbGl0eUNvcmVDb21tb24uIkZ1bGZpbGwiCiAgICAgICAgKQogICkKCi8qCkBvdmVybG9hZGVkCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBIZWFydFJhdGVPYnNlcnZhdGlvbiBvdmVybGFwcyBhZnRlciB0aGUgZGF5IG9mIHRoZSBoZWFydCBmYWlsdXJlIG91dHBhdGllbnQgZW5jb3VudGVyIHdpdGggaGlzdG9yeSBvZiBtb2RlcmF0ZSBvciBzZXZlcmUgTFZTRAoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIG92ZXJsYXBzQWZ0ZXJIZWFydEZhaWx1cmVPdXRwYXRpZW50RW5jb3VudGVyKEhlYXJ0UmF0ZU9ic2VydmF0aW9uIFVTQ29yZS5IZWFydFJhdGVQcm9maWxlKToKICBleGlzdHMgKCAiSGVhcnQgRmFpbHVyZSBPdXRwYXRpZW50IEVuY291bnRlciB3aXRoIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIE1vZGVyYXRlT3JTZXZlcmVMVlNESEZPdXRwYXRpZW50RW5jb3VudGVyCiAgICAgIHdoZXJlIEhlYXJ0UmF0ZU9ic2VydmF0aW9uLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBvdmVybGFwcyBhZnRlciBkYXkgb2YgTW9kZXJhdGVPclNldmVyZUxWU0RIRk91dHBhdGllbnRFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgYW5kIEhlYXJ0UmF0ZU9ic2VydmF0aW9uLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICkKCi8qCkBkZXNjcmlwdGlvbjogQ29udmVydHMgdGhlIHBvc3NpYmxlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgdGltaW5nIGJvdW5kIHRvIGFuIGludGVydmFsIHVzaW5nIHRoZSBnaXZlbiBkYXRlIGFzIGFuIGFuY2hvciBmb3IgZHVyYXRpb25zCiovIApkZWZpbmUgZnVuY3Rpb24gVGltaW5nQm91bmRUb0ludGVydmFsKHN0YXJ0RGF0ZSBTeXN0ZW0uRGF0ZVRpbWUsIGNob2ljZSBDaG9pY2U8RkhJUi5EdXJhdGlvbiwgRkhJUi5SYW5nZSwgRkhJUi5QZXJpb2Q+KToKICBjYXNlCiAgICB3aGVuIGNob2ljZSBpcyBGSElSLlBlcmlvZCB0aGVuCiAgICAgICAgY2hvaWNlIGFzIEZISVIuUGVyaW9kCiAgICB3aGVuIGNob2ljZSBpcyBGSElSLlJhbmdlIHRoZW4KICAgICAgICBJbnRlcnZhbFtzdGFydERhdGUgKyAoY2hvaWNlLmxvdyBhcyBRdWFudGl0eSksIHN0YXJ0RGF0ZSArIChjaG9pY2UuaGlnaCBhcyBRdWFudGl0eSldCiAgICB3aGVuIGNob2ljZSBpcyBGSElSLkR1cmF0aW9uIHRoZW4KICAgICAgICBJbnRlcnZhbFtzdGFydERhdGUsIHN0YXJ0RGF0ZSArIChjaG9pY2UgYXMgRkhJUi5EdXJhdGlvbikpCiAgICBlbHNlCgkJbnVsbCBhcyBJbnRlcnZhbDxEYXRlVGltZT4KCWVuZA=="/>
    <url value="https://madie.cms.gov/Library-AHAOverall.cql"/>
  </content>
</Library>