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

: CMS871FHIRHHHyper - XML Representation

Draft as of 2026-09-19

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="CMS871FHIRHHHyper"/>
  <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"><a name="metadata"> </a>Metadata</th>


</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">Status</th>



<td class="content-container">Draft</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 CMS871FHIRHHHyper 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.USCoreCommon version '2.0.0-ballot' called USCoreCommon
include hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements

include CQMCommon version '5.1.000' called CQMCommon
include USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon
include SupplementalDataElements version '6.1.000' called SDE
include Status version '2.1.000' called Status

valueset &quot;Comfort Measures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'
valueset &quot;Diabetes&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001'
valueset &quot;Discharged to Health Care Facility for Hospice Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207'
valueset &quot;Discharged to Home for Hospice Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209'
valueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'
valueset &quot;Glucose Lab Test Mass Per Volume&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34'
valueset &quot;Hypoglycemics Treatment Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394'

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;Comfort Measures Care&quot;:
  ( [&quot;Procedure&quot;: &quot;Comfort Measures&quot;] ProcedureCM
      where ProcedureCM.status = 'completed'
  )
    union ( [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;] ServiceReq
        where ServiceReq.status in { 'active', 'completed' }
    )

define &quot;Days in Hospitalization&quot;:
  &quot;Measurement Population&quot; EligibleInpatientHospitalization
    let period: EligibleInpatientHospitalization.hospitalizationWithObservation ( ),
    relevantPeriod: period.hospitalDaysMax10 ( )
    return Tuple {
      encounter: EligibleInpatientHospitalization,
      hospitalizationPeriod: period,
      relevantPeriod: relevantPeriod,
      relevantDays: relevantPeriod.daysInPeriod ( )
    }

define &quot;Days with Glucose Results&quot;:
  &quot;Days in Hospitalization&quot; InpatientHospitalDays
    return Tuple {
      encounter: InpatientHospitalDays.encounter,
      relevantPeriod: InpatientHospitalDays.relevantPeriod,
      relevantDays: ( InpatientHospitalDays.relevantDays EncounterDay
          return Tuple {
            dayNumber: EncounterDay.dayIndex,
            dayPeriod: EncounterDay.dayPeriod,
            hasSevereResult: exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest
                where GlucoseTest.status in { 'final', 'amended', 'corrected' }
                  and GlucoseTest.value &gt; 300 'mg/dL'
                  and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod
            ),
            hasElevatedResult: exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest
                where GlucoseTest.status in { 'final', 'amended', 'corrected' }
                  and GlucoseTest.value &gt;= 200 'mg/dL'
                  and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod
            ),
            hasNoGlucoseTest: not exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest
                where GlucoseTest.status in { 'final', 'amended', 'corrected' }
                  and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod
            )
          }
      )
    }

define &quot;Days with Hyperglycemic Events&quot;:
  &quot;Days with Glucose Results&quot; EncounterWithResultDays
    let eligibleEventDays: EncounterWithResultDays.relevantDays EncounterDay
      where EncounterDay.dayNumber &gt; 1
      return Tuple {
        dayIndex: EncounterDay.dayNumber,
        dayPeriod: EncounterDay.dayPeriod,
        hasHyperglycemicEvent: ( EncounterDay.hasSevereResult
            or ( EncounterDay.hasNoGlucoseTest
                and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 2].hasElevatedResult
                and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 3].hasElevatedResult
            )
        )
      }
    return Tuple {
      encounter: EncounterWithResultDays.encounter,
      relevantPeriod: EncounterWithResultDays.relevantPeriod,
      eligibleEventDays: eligibleEventDays
    }

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

define &quot;Denominator Exclusions&quot;:
  &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;

define &quot;Encounter with Comfort Measures during Hospitalization&quot;:
  &quot;Initial Population&quot; InpatientHospitalization
    with &quot;Comfort Measures Care&quot; ComfortCare
      such that Coalesce(ComfortCare.performed.toInterval(), ComfortCare.authoredOn.toInterval()) starts during InpatientHospitalization.hospitalizationWithObservation ( )

define &quot;Encounter with Discharge for Hospice Care&quot;:
  &quot;Initial Population&quot; InpatientHospitalization
    where InpatientHospitalization.hospitalization.dischargeDisposition in &quot;Discharged to Home for Hospice Care&quot;
      or InpatientHospitalization.hospitalization.dischargeDisposition in &quot;Discharged to Health Care Facility for Hospice Care&quot;

define &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;:
  &quot;Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;
    union &quot;Encounter with Comfort Measures during Hospitalization&quot;
    union &quot;Encounter with Discharge for Hospice Care&quot;

define &quot;Encounter with Elevated Glucose Greater Than or Equal to 200&quot;:
  &quot;Encounter with Hospitalization Period&quot; Hospitalization
    with [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest
      such that GlucoseTest.effective.earliest ( ) during Hospitalization.hospitalizationPeriod
        and GlucoseTest.status in { 'final', 'amended', 'corrected' }
        and GlucoseTest.value &gt;= 200 'mg/dL'
    return Hospitalization.encounter

define &quot;Encounter with Existing Diabetes Diagnosis&quot;:
  &quot;Encounter with Hospitalization Period&quot; Hospitalization
    with ( ( [ConditionEncounterDiagnosis: &quot;Diabetes&quot;] DiabetesEncounter
        where ( Hospitalization.encounter.reasonReference.references ( DiabetesEncounter )
            or Hospitalization.encounter.reasonCode in &quot;Diabetes&quot;
        )
          and DiabetesEncounter.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod
    )
      union ( [ConditionProblemsHealthConcerns: &quot;Diabetes&quot;] DiabetesProblem
          where DiabetesProblem.verificationStatus is not null implies ( DiabetesProblem.verificationStatus ~ Status.&quot;confirmed&quot;
              or DiabetesProblem.verificationStatus ~ Status.&quot;unconfirmed&quot;
              or DiabetesProblem.verificationStatus ~ Status.&quot;provisional&quot;
              or DiabetesProblem.verificationStatus ~ Status.&quot;differential&quot;
          )
            and DiabetesProblem.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod
      ) ) DiabetesCondition
      such that DiabetesCondition.subject.reference = Hospitalization.encounter.subject.reference
    return Hospitalization.encounter

define &quot;Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:
  from
    &quot;Initial Population&quot; InpatientHospitalization,
    &quot;Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; EarlyGlucoseResult
    where EarlyGlucoseResult.value as Quantity &gt; 600 'mg/dL'
      and EarlyGlucoseResult.status in { 'final', 'amended', 'corrected' }
      and EarlyGlucoseResult.effective.earliest ( ) during Interval[( start of InpatientHospitalization.hospitalizationWithObservation ( ) - 1 hour ), ( start of InpatientHospitalization.hospitalizationWithObservation ( ) + 6 hours )]
    return InpatientHospitalization

define &quot;Encounter with Hospitalization Period&quot;:
  &quot;Qualifying Encounter&quot; QualifyingHospitalization
    return Tuple {
      encounter: QualifyingHospitalization,
      hospitalizationPeriod: QualifyingHospitalization.hospitalizationWithObservation ( )
    }

define &quot;Encounter with Hyperglycemic Events&quot;:
  &quot;Days with Hyperglycemic Events&quot; HyperglycemicEventDays
    where exists ( HyperglycemicEventDays.eligibleEventDays EligibleEventDay
        where EligibleEventDay.hasHyperglycemicEvent
    )
    return HyperglycemicEventDays.encounter

define &quot;Encounter with Hypoglycemic Medication&quot;:
  from
    &quot;Encounter with Hospitalization Period&quot; Hospitalization,
    [&quot;MedicationAdministration&quot;: &quot;Hypoglycemics Treatment Medications&quot;] HypoglycemicMed
    where HypoglycemicMed.status in { 'completed', 'in-progress' }
      and HypoglycemicMed.effective.toInterval ( ) during Hospitalization.hospitalizationPeriod
    return Hospitalization.encounter

define &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:
  from
    &quot;Initial Population&quot; InpatientHospitalization,
    [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest
    let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),
    GlucoseTestTime: GlucoseTest.effective.earliest ( )
    where GlucoseTest.value as Quantity &gt; 600 'mg/dL'
      and GlucoseTest.status in { 'final', 'amended', 'corrected' }
      and GlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hours )]
    return GlucoseTest

define &quot;Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:
  from
    &quot;Initial Population&quot; InpatientHospitalization,
    &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; GlucoseResult600,
    [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] EarlierGlucoseTest
    let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),
    GlucoseTest600Time: GlucoseResult600.effective.earliest ( ),
    EarlierGlucoseTestTime: EarlierGlucoseTest.effective.earliest ( )
    where GlucoseTest600Time during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hour )]
      and EarlierGlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), GlucoseTest600Time )
      and EarlierGlucoseTest.id !~ GlucoseResult600.id
    return GlucoseResult600

define &quot;Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:
  &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; GlucoseResult600
    where not ( GlucoseResult600.id in &quot;Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;.id )

define &quot;Initial Population&quot;:
  &quot;Encounter with Existing Diabetes Diagnosis&quot;
    union &quot;Encounter with Hypoglycemic Medication&quot;
    union &quot;Encounter with Elevated Glucose Greater Than or Equal to 200&quot;

define &quot;Measurement Population&quot;:
  &quot;Denominator&quot;

define &quot;Numerator&quot;:
  &quot;Encounter with Hyperglycemic Events&quot;

define &quot;Numerator Exclusions&quot;:
  &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;

define &quot;Qualifying Encounter&quot;:
  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter
    where AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18
      and InpatientEncounter.period ends during day of &quot;Measurement Period&quot;
      and InpatientEncounter.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;

define fluent function hospitalDaysMax10(Period Interval&lt;DateTime&gt;):
  Interval[start of Period, Min({ 
    end of Period, start of Period + 10 days }
  )]

define function &quot;Denominator Observations&quot;(QualifyingEncounter Encounter):
  if QualifyingEncounter.id in &quot;Denominator Exclusions&quot;.id then singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays
      where EncounterWithEventDays.encounter = QualifyingEncounter
      return 0
  ) 
    else singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays
      where EncounterWithEventDays.encounter = QualifyingEncounter
      return Count(EncounterWithEventDays.eligibleEventDays)
  )

define function &quot;Numerator Observations&quot;(QualifyingEncounter Encounter):
  if QualifyingEncounter.id in &quot;Denominator Exclusions&quot;.id then singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays
      where EncounterWithEventDays.encounter = QualifyingEncounter
      return 0
  ) 
    else singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays
      where EncounterWithEventDays.encounter = QualifyingEncounter
      return Count(EncounterWithEventDays.eligibleEventDays EligibleEventDay
          where EligibleEventDay.hasHyperglycemicEvent
      )
  )</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/CMS871FHIRHHHyper"/>
  <version value="1.1.000"/>
  <name value="CMS871FHIRHHHyper"/>
  <status value="draft"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2026-09-19T16:31:14+00:00"/>
  <content>
    <contentType value="text/cql"/>
    <data
          value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM4NzFGSElSSEhIeXBlciB2ZXJzaW9uICcxLjEuMDAwJwoKdXNpbmcgVVNRdWFsaXR5Q29yZSB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlQ29tbW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVFbGVtZW50cyB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVFbGVtZW50cwoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFN0YXR1cyB2ZXJzaW9uICcyLjEuMDAwJyBjYWxsZWQgU3RhdHVzCgp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnCnZhbHVlc2V0ICJEaWFiZXRlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDMuMTIuMTAwMScKdmFsdWVzZXQgIkRpc2NoYXJnZWQgdG8gSGVhbHRoIENhcmUgRmFjaWxpdHkgZm9yIEhvc3BpY2UgQ2FyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA3Jwp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwOScKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3Jwp2YWx1ZXNldCAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM0Jwp2YWx1ZXNldCAiSHlwb2dseWNlbWljcyBUcmVhdG1lbnQgTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTk2LjM5NCcKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiQ29tZm9ydCBNZWFzdXJlcyBDYXJlIjoKICAoIFsiUHJvY2VkdXJlIjogIkNvbWZvcnQgTWVhc3VyZXMiXSBQcm9jZWR1cmVDTQogICAgICB3aGVyZSBQcm9jZWR1cmVDTS5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKICAgIHVuaW9uICggWyJTZXJ2aWNlUmVxdWVzdCI6ICJDb21mb3J0IE1lYXN1cmVzIl0gU2VydmljZVJlcQogICAgICAgIHdoZXJlIFNlcnZpY2VSZXEuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICkKCmRlZmluZSAiRGF5cyBpbiBIb3NwaXRhbGl6YXRpb24iOgogICJNZWFzdXJlbWVudCBQb3B1bGF0aW9uIiBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbgogICAgbGV0IHBlcmlvZDogRWxpZ2libGVJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSwKICAgIHJlbGV2YW50UGVyaW9kOiBwZXJpb2QuaG9zcGl0YWxEYXlzTWF4MTAgKCApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVsaWdpYmxlSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IHBlcmlvZCwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IHJlbGV2YW50UGVyaW9kLAogICAgICByZWxldmFudERheXM6IHJlbGV2YW50UGVyaW9kLmRheXNJblBlcmlvZCAoICkKICAgIH0KCmRlZmluZSAiRGF5cyB3aXRoIEdsdWNvc2UgUmVzdWx0cyI6CiAgIkRheXMgaW4gSG9zcGl0YWxpemF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbERheXMKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcjogSW5wYXRpZW50SG9zcGl0YWxEYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudFBlcmlvZCwKICAgICAgcmVsZXZhbnREYXlzOiAoIElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgICAgICByZXR1cm4gVHVwbGUgewogICAgICAgICAgICBkYXlOdW1iZXI6IEVuY291bnRlckRheS5kYXlJbmRleCwKICAgICAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgICAgICBoYXNTZXZlcmVSZXN1bHQ6IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIHdoZXJlIEdsdWNvc2VUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QudmFsdWUgPiAzMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNFbGV2YXRlZFJlc3VsdDogZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC52YWx1ZSA+PSAyMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNOb0dsdWNvc2VUZXN0OiBub3QgZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kCiAgICAgICAgICAgICkKICAgICAgICAgIH0KICAgICAgKQogICAgfQoKZGVmaW5lICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiOgogICJEYXlzIHdpdGggR2x1Y29zZSBSZXN1bHRzIiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cwogICAgbGV0IGVsaWdpYmxlRXZlbnREYXlzOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgIHdoZXJlIEVuY291bnRlckRheS5kYXlOdW1iZXIgPiAxCiAgICAgIHJldHVybiBUdXBsZSB7CiAgICAgICAgZGF5SW5kZXg6IEVuY291bnRlckRheS5kYXlOdW1iZXIsCiAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgIGhhc0h5cGVyZ2x5Y2VtaWNFdmVudDogKCBFbmNvdW50ZXJEYXkuaGFzU2V2ZXJlUmVzdWx0CiAgICAgICAgICAgIG9yICggRW5jb3VudGVyRGF5Lmhhc05vR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIGFuZCBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXNbRW5jb3VudGVyRGF5LmRheU51bWJlciAtIDJdLmhhc0VsZXZhdGVkUmVzdWx0CiAgICAgICAgICAgICAgICBhbmQgRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnREYXlzW0VuY291bnRlckRheS5kYXlOdW1iZXIgLSAzXS5oYXNFbGV2YXRlZFJlc3VsdAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICB9CiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLnJlbGV2YW50UGVyaW9kLAogICAgICBlbGlnaWJsZUV2ZW50RGF5czogZWxpZ2libGVFdmVudERheXMKICAgIH0KCmRlZmluZSAiRGVub21pbmF0b3IiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiOgogICJFbmNvdW50ZXIgd2l0aCBFYXJseSBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgb3Igd2l0aCBDb21mb3J0IG9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggIkNvbWZvcnQgTWVhc3VyZXMgQ2FyZSIgQ29tZm9ydENhcmUKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKENvbWZvcnRDYXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRDYXJlLmF1dGhvcmVkT24udG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIERpc2NoYXJnZSBmb3IgSG9zcGljZSBDYXJlIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdoZXJlIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24gaW4gIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIgogICAgICBvciBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uLmRpc2NoYXJnZURpc3Bvc2l0aW9uIGluICJEaXNjaGFyZ2VkIHRvIEhlYWx0aCBDYXJlIEZhY2lsaXR5IGZvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVhcmx5IEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCBvciB3aXRoIENvbWZvcnQgb3IgSG9zcGljZSBDYXJlIjoKICAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IgogICAgdW5pb24gIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZXMgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggRWxldmF0ZWQgR2x1Y29zZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgdG8gMjAwIjoKICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgc3VjaCB0aGF0IEdsdWNvc2VUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkgZHVyaW5nIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICAgICBhbmQgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEdsdWNvc2VUZXN0LnZhbHVlID49IDIwMCAnbWcvZEwnCiAgICByZXR1cm4gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBFeGlzdGluZyBEaWFiZXRlcyBEaWFnbm9zaXMiOgogICJFbmNvdW50ZXIgd2l0aCBIb3NwaXRhbGl6YXRpb24gUGVyaW9kIiBIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggKCAoIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJEaWFiZXRlcyJdIERpYWJldGVzRW5jb3VudGVyCiAgICAgICAgd2hlcmUgKCBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvblJlZmVyZW5jZS5yZWZlcmVuY2VzICggRGlhYmV0ZXNFbmNvdW50ZXIgKQogICAgICAgICAgICBvciBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvbkNvZGUgaW4gIkRpYWJldGVzIgogICAgICAgICkKICAgICAgICAgIGFuZCBEaWFiZXRlc0VuY291bnRlci5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICkKICAgICAgdW5pb24gKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkRpYWJldGVzIl0gRGlhYmV0ZXNQcm9ibGVtCiAgICAgICAgICB3aGVyZSBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIGlzIG5vdCBudWxsIGltcGxpZXMgKCBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJjb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4idW5jb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4icHJvdmlzaW9uYWwiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4iZGlmZmVyZW50aWFsIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgRGlhYmV0ZXNQcm9ibGVtLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgICApICkgRGlhYmV0ZXNDb25kaXRpb24KICAgICAgc3VjaCB0aGF0IERpYWJldGVzQ29uZGl0aW9uLnN1YmplY3QucmVmZXJlbmNlID0gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlci5zdWJqZWN0LnJlZmVyZW5jZQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICAiSW5pdGlhbCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiIEVhcmx5R2x1Y29zZVJlc3VsdAogICAgd2hlcmUgRWFybHlHbHVjb3NlUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ID4gNjAwICdtZy9kTCcKICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApIC0gMSBob3VyICksICggc3RhcnQgb2YgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgKyA2IGhvdXJzICldCiAgICByZXR1cm4gSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0hvc3BpdGFsaXphdGlvbgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVyOiBRdWFsaWZ5aW5nSG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgfQoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyI6CiAgIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgSHlwZXJnbHljZW1pY0V2ZW50RGF5cwogICAgd2hlcmUgZXhpc3RzICggSHlwZXJnbHljZW1pY0V2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cyBFbGlnaWJsZUV2ZW50RGF5CiAgICAgICAgd2hlcmUgRWxpZ2libGVFdmVudERheS5oYXNIeXBlcmdseWNlbWljRXZlbnQKICAgICkKICAgIHJldHVybiBIeXBlcmdseWNlbWljRXZlbnREYXlzLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiI6CiAgZnJvbQogICAgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiIEhvc3BpdGFsaXphdGlvbiwKICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIkh5cG9nbHljZW1pY3MgVHJlYXRtZW50IE1lZGljYXRpb25zIl0gSHlwb2dseWNlbWljTWVkCiAgICB3aGVyZSBIeXBvZ2x5Y2VtaWNNZWQuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICBhbmQgSHlwb2dseWNlbWljTWVkLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3RUaW1lOiBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApCiAgICB3aGVyZSBHbHVjb3NlVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDYwMCAnbWcvZEwnCiAgICAgIGFuZCBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEdsdWNvc2VUZXN0VGltZSBkdXJpbmcgSW50ZXJ2YWxbKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCAtIDEgaG91ciApLCAoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsICsgNiBob3VycyApXQogICAgcmV0dXJuIEdsdWNvc2VUZXN0CgpkZWZpbmUgIkdsdWNvc2UgVGVzdHMgRWFybGllciBUaGFuIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgZnJvbQogICAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMCwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gRWFybGllckdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3Q2MDBUaW1lOiBHbHVjb3NlUmVzdWx0NjAwLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBFYXJsaWVyR2x1Y29zZVRlc3RUaW1lOiBFYXJsaWVyR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgd2hlcmUgR2x1Y29zZVRlc3Q2MDBUaW1lIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsIC0gMSBob3VyICksICggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgKyA2IGhvdXIgKV0KICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgR2x1Y29zZVRlc3Q2MDBUaW1lICkKICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdC5pZCAhfiBHbHVjb3NlUmVzdWx0NjAwLmlkCiAgICByZXR1cm4gR2x1Y29zZVJlc3VsdDYwMAoKZGVmaW5lICJJbml0aWFsIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMAogICAgd2hlcmUgbm90ICggR2x1Y29zZVJlc3VsdDYwMC5pZCBpbiAiR2x1Y29zZSBUZXN0cyBFYXJsaWVyIFRoYW4gR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0Ii5pZCApCgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkVuY291bnRlciB3aXRoIEV4aXN0aW5nIERpYWJldGVzIERpYWdub3NpcyIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBFbGV2YXRlZCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiBvciBFcXVhbCB0byAyMDAiCgpkZWZpbmUgIk1lYXN1cmVtZW50IFBvcHVsYXRpb24iOgogICJEZW5vbWluYXRvciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAiRW5jb3VudGVyIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiCgpkZWZpbmUgIk51bWVyYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIHdpdGggRWFybHkgR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIG9yIHdpdGggQ29tZm9ydCBvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIjoKICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4CiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbERheXNNYXgxMChQZXJpb2QgSW50ZXJ2YWw8RGF0ZVRpbWU+KToKICBJbnRlcnZhbFtzdGFydCBvZiBQZXJpb2QsIE1pbih7IAogICAgZW5kIG9mIFBlcmlvZCwgc3RhcnQgb2YgUGVyaW9kICsgMTAgZGF5cyB9CiAgKV0KCmRlZmluZSBmdW5jdGlvbiAiRGVub21pbmF0b3IgT2JzZXJ2YXRpb25zIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgaWYgUXVhbGlmeWluZ0VuY291bnRlci5pZCBpbiAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyIuaWQgdGhlbiBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiAwCiAgKSAKICAgIGVsc2Ugc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzCiAgICAgIHdoZXJlIEVuY291bnRlcldpdGhFdmVudERheXMuZW5jb3VudGVyID0gUXVhbGlmeWluZ0VuY291bnRlcgogICAgICByZXR1cm4gQ291bnQoRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cykKICApCgpkZWZpbmUgZnVuY3Rpb24gIk51bWVyYXRvciBPYnNlcnZhdGlvbnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkIGluICJEZW5vbWluYXRvciBFeGNsdXNpb25zIi5pZCB0aGVuIHNpbmdsZXRvbiBmcm9tICggIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgRW5jb3VudGVyV2l0aEV2ZW50RGF5cwogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgcmV0dXJuIDAKICApIAogICAgZWxzZSBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiBDb3VudChFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVsaWdpYmxlRXZlbnREYXlzIEVsaWdpYmxlRXZlbnREYXkKICAgICAgICAgIHdoZXJlIEVsaWdpYmxlRXZlbnREYXkuaGFzSHlwZXJnbHljZW1pY0V2ZW50CiAgICAgICkKICAp"/>
    <url value="https://madie.cms.gov/Library-CMS871FHIRHHHyper.cql"/>
  </content>
</Library>