eCQM QICore Content Implementation Guide
2025.0.0 - CI Build

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

: CMS871HHHyperFHIR - JSON Representation

Active as of 2025-05-23

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS871HHHyperFHIR",
  "meta" : {
    "profile" : [
      🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"
    ]
  },
  "language" : "en",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"> \n         <table class=\"grid dict\"> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Title: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">CMS871HHHyperFHIR</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Id: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">CMS871HHHyperFHIR</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Version: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">0.3.000</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Url: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">https://madie.cms.gov/Library/CMS871HHHyperFHIR</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b> official </b> \n               </th> \n               <td style=\"padding-left: 4px;\"> \n                  <p style=\"margin-bottom: 5px;\"> \n                     <span>CMS871HHHyperFHIR</span> \n                  </p> \n               </td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Type: </b> \n               </th> \n               <td style=\"padding-left: 4px;\"> \n                  <p style=\"margin-bottom: 5px;\"> \n                     <b>system: </b> \n                     <span>http://terminology.hl7.org/CodeSystem/library-type</span> \n                  </p> \n                  <p style=\"margin-bottom: 5px;\"> \n                     <b>code: </b> \n                     <span>logic-library</span> \n                  </p> \n               </td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Date: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">2025-05-23T20:52:30+00:00</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Publisher: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">Centers for Medicare &amp; Medicaid Services (CMS)</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Description: </b> \n               </th> \n               <td style=\"padding-left: 4px;\">CMS871HHHyperFHIR</td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Related Artifacts: </b> \n               </th> \n               <td style=\"padding-left: 4px;\"> \n                  <p> \n                     <b>Dependencies</b> \n                  </p> \n                  <ul> \n                     <li>https://madie.cms.gov/Library/SupplementalDataElements|5.1.000</li> \n                     <li>https://madie.cms.gov/Library/FHIRHelpers|4.4.000</li> \n                     <li>https://madie.cms.gov/Library/CQMCommon|4.1.000</li> \n                     <li>https://madie.cms.gov/Library/QICoreCommon|4.0.000</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209</li> \n                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207</li> \n                  </ul> \n               </td> \n            </tr> \n            <tr> \n               <th scope=\"row\"> \n                  <b>Data Requirements:</b> \n               </th> \n               <td style=\"padding-left: 4px;\"> \n                  <table class=\"grid-dict\"> \n                     <tr> \n                        <th> \n                           <b>Type</b> \n                        </th> \n                        <th> \n                           <b>Profile</b> \n                        </th> \n                        <th> \n                           <b>MS</b> \n                        </th> \n                        <th> \n                           <b>Code Filter</b> \n                        </th> \n                     </tr> \n                     <tr> \n                        <th>Patient</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-patient</th> \n                        <th>;;</th> \n                        <th> </th> \n                     </tr> \n                     <tr> \n                        <th>MedicationAdministration</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medicationadministration</th> \n                        <th>;</th> \n                        <th> \n                           <b>code filter: </b> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>path: </b> \n                              <span>medication</span> \n                           </span> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>value set: </b> \n                              <span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394</span> \n                           </span> \n                        </th> \n                     </tr> \n                     <tr> \n                        <th>MedicationAdministration</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medicationadministration</th> \n                        <th>;</th> \n                        <th> </th> \n                     </tr> \n                     <tr> \n                        <th>Medication</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medication</th> \n                        <th>;;</th> \n                        <th> </th> \n                     </tr> \n                     <tr> \n                        <th>Observation</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-observation-lab</th> \n                        <th>;;;;;;;</th> \n                        <th> \n                           <b>code filter: </b> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>path: </b> \n                              <span>code</span> \n                           </span> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>value set: </b> \n                              <span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34</span> \n                           </span> \n                        </th> \n                     </tr> \n                     <tr> \n                        <th>ServiceRequest</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-servicerequest</th> \n                        <th>;</th> \n                        <th> \n                           <b>code filter: </b> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>path: </b> \n                              <span>code</span> \n                           </span> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>value set: </b> \n                              <span>http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45</span> \n                           </span> \n                        </th> \n                     </tr> \n                     <tr> \n                        <th>Procedure</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-procedure</th> \n                        <th>;</th> \n                        <th> \n                           <b>code filter: </b> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>path: </b> \n                              <span>code</span> \n                           </span> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>value set: </b> \n                              <span>http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45</span> \n                           </span> \n                        </th> \n                     </tr> \n                     <tr> \n                        <th>Coverage</th> \n                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-coverage</th> \n                        <th>;;</th> \n                        <th> \n                           <b>code filter: </b> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>path: </b> \n                              <span>type</span> \n                           </span> \n                           <br/> \n                           <span style=\"padding-left: 4px;\"> \n                              <b>value set: </b> \n                              <span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.3591</span> \n                           </span> \n                        </th> \n                     </tr> \n                  </table> \n               </td> \n            </tr> \n            <tr> \n               <td colspan=\"2\"> \n                  <table> \n                     <tr> \n                        <th> \n                           <a id=\"cql-content\"> \n                              <b>Content: </b> \n                           </a> text/cql \n                        </th> \n                     </tr> \n                     <tr> \n                        <td> \n                           <pre><code class=\"language-cql\">library CMS871HHHyperFHIR version '0.3.000'\n\nusing QICore version '6.0.0'\n\ninclude FHIRHelpers version '4.4.000' called FHIRHelpers\ninclude SupplementalDataElements version '5.1.000' called SDE\ninclude CQMCommon version '4.1.000' called CQMCommon\ninclude QICoreCommon version '4.0.000' called QICoreCommon\ninclude CumulativeMedicationDuration version '5.0.000' called CMD\n\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\n\nvalueset &quot;birth date&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.560.100.4'\nvalueset &quot;Comfort Measures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'\nvalueset &quot;Diabetes&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001'\nvalueset &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'\nvalueset &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'\nvalueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\nvalueset &quot;Glucose Lab Test Mass Per Volume&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34'\nvalueset &quot;Hypoglycemics Treatment Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394'\n\ncode &quot;Birth date&quot;: '21112-8' from &quot;LOINC&quot; display 'Birth date'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n\ncontext Patient\n\n/***/\n\n\ndefine &quot;Comfort Measures Care&quot;:\n  [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;]\n    union [&quot;Procedure&quot;: &quot;Comfort Measures&quot;]\n\ndefine &quot;Days in Hospitalization&quot;:\n  &quot;Measurement Population&quot; EligibleInpatientHospitalization\n    let period: CQMCommon.&quot;HospitalizationWithObservation&quot; ( EligibleInpatientHospitalization ),\n    relevantPeriod: &quot;Hospital Days Max 10&quot;(period)\n    return Tuple {\n      encounter: EligibleInpatientHospitalization,\n      hospitalizationPeriod: period,\n      relevantPeriod: relevantPeriod,\n      relevantDays: &quot;Days In Period&quot;(relevantPeriod)\n    }\n\ndefine &quot;Days with Glucose Results&quot;:\n  &quot;Days in Hospitalization&quot; InpatientHospitalDays\n    return Tuple {\n      encounter: InpatientHospitalDays.encounter,\n      relevantPeriod: InpatientHospitalDays.relevantPeriod,\n      relevantDays: ( InpatientHospitalDays.relevantDays EncounterDay\n          return Tuple {\n            dayNumber: EncounterDay.dayNumber,\n            dayPeriod: EncounterDay.dayPeriod,\n            hasSevereResult: exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n                where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n                  and GlucoseTest.value &gt; 300 'mg/dL'\n                  and QICoreCommon.&quot;Earliest&quot; ( GlucoseTest.effective ) during EncounterDay.dayPeriod\n            ),\n            hasElevatedResult: exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n                where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n                  and GlucoseTest.value &gt;= 200 'mg/dL'\n                  and QICoreCommon.&quot;Earliest&quot; ( GlucoseTest.effective ) during EncounterDay.dayPeriod\n            ),\n            hasNoGlucoseTest: not exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n                where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n                  and QICoreCommon.&quot;Earliest&quot; ( GlucoseTest.effective ) during EncounterDay.dayPeriod\n            )\n          }\n      )\n    }\n\n/*# hyper days uses &quot;Relevant Encounters With Glucose Result Days&quot; to find if hyper event on each day. Skips 1st day in 'RelevantDays`. Returns boolean based on: Today high result OR Today no result AND Yesterday high result AND 2 days ago high result*/\n\n\ndefine &quot;Days with Hyperglycemic Events&quot;:\n  &quot;Days with Glucose Results&quot; EncounterWithResultDays\n    let eligibleEventDays: EncounterWithResultDays.relevantDays EncounterDay\n      where EncounterDay.dayNumber &gt; 1\n      return Tuple {\n        dayIndex: EncounterDay.dayNumber,\n        dayPeriod: EncounterDay.dayPeriod,\n        hasHyperglycemicEvent: ( EncounterDay.hasSevereResult\n            or ( EncounterDay.hasNoGlucoseTest\n                and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 2].hasElevatedResult\n                and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 3].hasElevatedResult\n            )\n        )\n      }\n    return Tuple {\n      encounter: EncounterWithResultDays.encounter,\n      relevantPeriod: EncounterWithResultDays.relevantPeriod,\n      eligibleEventDays: eligibleEventDays\n    }\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;\n\ndefine &quot;Encounter with Comfort Measures during Hospitalization&quot;:\n  &quot;Initial Population&quot; InpatientHospitalization\n    with &quot;Comfort Measures Care&quot; ComfortCare\n      such that Coalesce(ComfortCare.performed.toInterval(), ComfortCare.authoredOn.toInterval()) during CQMCommon.&quot;HospitalizationWithObservation&quot; ( InpatientHospitalization )\n\ndefine &quot;Encounter with Discharge for Hospice Care&quot;:\n  &quot;Initial Population&quot; InpatientHospitalization\n    where InpatientHospitalization.hospitalization.dischargeDisposition in &quot;Discharged to Home for Hospice Care&quot;\n      or InpatientHospitalization.hospitalization.dischargeDisposition in &quot;Discharged to Health Care Facility for Hospice Care&quot;\n\ndefine &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;:\n  &quot;Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;\n    union &quot;Encounter with Comfort Measures during Hospitalization&quot;\n    union &quot;Encounter with Discharge for Hospice Care&quot;\n\n\n/**\n * Using the already calculated pairing of hospitalization periods with encounters, filter on ones with \n * any elevated (&gt;= 200) blood glucose reading during the hospitalization*/\n\n\ndefine &quot;Encounter with Elevated Glucose Greater Than or Equal to 200&quot;:\n  &quot;Encounter with Hospitalization Period&quot; Hospitalization\n    with [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n      such that QICoreCommon.&quot;Earliest&quot; ( GlucoseTest.effective ) during Hospitalization.hospitalizationPeriod\n        and GlucoseTest.status in { 'final', 'amended', 'corrected' }\n            //and GlucoseTest.status != 'cancelled'\n        \n        and GlucoseTest.value &gt;= 200 'mg/dL'\n    return Hospitalization.encounter\n\n/**\n * Using the already calculated pairing of hospitalization periods with encounters, filter on ones with \n * diabetes and return the encounter.*/\n\n\ndefine &quot;Encounter with Existing Diabetes Diagnosis&quot;:\n  &quot;Encounter with Hospitalization Period&quot; Hospitalization\n    with [&quot;ConditionEncounterDiagnosis&quot;: &quot;Diabetes&quot;] Diabetes\n      such that ( QICoreCommon.&quot;ToPrevalenceInterval&quot; ( Diabetes ) starts before end of Hospitalization.hospitalizationPeriod )\n    return Hospitalization.encounter\n\ndefine &quot;Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  from\n    &quot;Initial Population&quot; InpatientHospitalization,\n    &quot;Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; EarlyGlucoseResult\n    where EarlyGlucoseResult.value as Quantity &gt; 600 'mg/dL'\n      and EarlyGlucoseResult.status in { 'final', 'amended', 'corrected' }\n      and QICoreCommon.&quot;Earliest&quot; ( EarlyGlucoseResult.effective ) during Interval[( start of CQMCommon.&quot;HospitalizationWithObservation&quot; ( InpatientHospitalization ) - 1 hour ), ( start of CQMCommon.&quot;HospitalizationWithObservation&quot; ( InpatientHospitalization ) + 6 hours )]\n    return InpatientHospitalization\n\n\n/**\n * Create paring of encounters to hospitalization period so this calculation can be inspected and the result \n * can be reused, making the logic faster.*/\n\n\ndefine &quot;Encounter with Hospitalization Period&quot;:\n  &quot;Qualifying Encounter&quot; QualifyingHospitalization\n    return Tuple {\n      encounter: QualifyingHospitalization,\n      hospitalizationPeriod: CQMCommon.&quot;HospitalizationWithObservation&quot; ( QualifyingHospitalization )\n    }\n\n/***/\n\n\ndefine &quot;Encounter with Hyperglycemic Events&quot;:\n  &quot;Days with Hyperglycemic Events&quot; HyperglycemicEventDays\n    where exists ( HyperglycemicEventDays.eligibleEventDays EligibleEventDay\n        where EligibleEventDay.hasHyperglycemicEvent\n    )\n    return HyperglycemicEventDays.encounter\n\n/**\n * Using the already calculated pairing of hospitalization periods with encounters, filter on ones with \n * hypoglycemic medicatons and return the encounter.*/\n\n\ndefine &quot;Encounter with Hypoglycemic Medication&quot;:\n  from\n    &quot;Encounter with Hospitalization Period&quot; Hospitalization,\n    [&quot;MedicationAdministration&quot;: &quot;Hypoglycemics Treatment Medications&quot;] HypoglycemicMed\n    where HypoglycemicMed.status in { 'completed', 'in-progress' }\n          //and HypoglycemicMed.status != 'not-done'\n      \n      and QICoreCommon.&quot;ToInterval&quot; ( HypoglycemicMed.effective ) during Hospitalization.hospitalizationPeriod\n    return Hospitalization.encounter\n\ndefine &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  from\n    &quot;Initial Population&quot; InpatientHospitalization,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n    let HospitalizationInterval: CQMCommon.&quot;HospitalizationWithObservation&quot; ( InpatientHospitalization ),\n    GlucoseTestTime: QICoreCommon.&quot;Earliest&quot; ( GlucoseTest.effective )\n    where GlucoseTest.value as Quantity &gt; 600 'mg/dL'\n      and GlucoseTest.status in { 'final', 'amended', 'corrected' }\n      and GlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hours )]\n    return GlucoseTest\n\ndefine &quot;Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  from\n    &quot;Initial Population&quot; InpatientHospitalization,\n    &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; GlucoseResult600,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] EarlierGlucoseTest\n    let HospitalizationInterval: CQMCommon.&quot;HospitalizationWithObservation&quot; ( InpatientHospitalization ),\n    GlucoseTest600Time: QICoreCommon.&quot;Earliest&quot; ( GlucoseResult600.effective ),\n    EarlierGlucoseTestTime: QICoreCommon.&quot;Earliest&quot; ( EarlierGlucoseTest.effective )\n    where GlucoseTest600Time during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hour )]\n      and EarlierGlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), GlucoseTest600Time )\n      and EarlierGlucoseTest.id !~ GlucoseResult600.id\n    return GlucoseResult600\n\ndefine &quot;Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; GlucoseResult600\n    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 )\n\ndefine &quot;Initial Population&quot;:\n  &quot;Encounter with Existing Diabetes Diagnosis&quot;\n    union &quot;Encounter with Hypoglycemic Medication&quot;\n    union &quot;Encounter with Elevated Glucose Greater Than or Equal to 200&quot;\n\ndefine &quot;Measurement Population&quot;:\n  &quot;Denominator&quot;\n\ndefine &quot;Numerator&quot;:\n  &quot;Encounter with Hyperglycemic Events&quot;\n\ndefine &quot;Numerator Exclusions&quot;:\n  &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;\n\ndefine &quot;Qualifying Encounter&quot;:\n  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter\n    where AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18\n      and InpatientEncounter.period ends during day of &quot;Measurement Period&quot;\n      and InpatientEncounter.status = 'finished'\n\ndefine &quot;SDE Ethnicity&quot;:\n  SDE.&quot;SDE Ethnicity&quot;\n\ndefine &quot;SDE Payer&quot;:\n  SDE.&quot;SDE Payer&quot;\n\ndefine &quot;SDE Race&quot;:\n  SDE.&quot;SDE Race&quot;\n\ndefine &quot;SDE Sex&quot;:\n  SDE.&quot;SDE Sex&quot;\n\n/**\n * Crops an interval to a maximum length of 10 days.*/\n\n\ndefine function &quot;Hospital Days Max 10&quot;(Period Interval&lt;DateTime&gt;):\n  Interval[start of Period, Min({ \n    end of Period, start of Period + 10 days }\n  )]\n\n/**\n * Creates a list of integers from 1 to how many days are in the interval. Note, this wont create an index for\n * the final day if it is less than 24 hours. This also includes the first 24 hour period.*/\n\n\ndefine function &quot;Interval To Day Numbers&quot;(Period Interval&lt;DateTime&gt;):\n  ( expand { Interval[1, duration in days between start of Period and end of Period]} ) DayExpand\n    return end of DayExpand\n\n/**\n * Counts the number of eligible days in an encounter. This simply filters and counts the data built in\n * &quot;Relevant Encounters With Hyperglycemic Event Days&quot;.*/\n\n\ndefine function &quot;Denominator Observations&quot;(QualifyingEncounter Encounter):\n  if QualifyingEncounter.id in &quot;Denominator Exclusions&quot;.id then singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return 0\n  ) \n    else singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return Count(EncounterWithEventDays.eligibleEventDays)\n  )\n\n/**\n * Counts the number of eligible days with a hyperglycemic event in an encounter. This simply filters and counts the data built in\n * &quot;Relevant Encounters With Hyperglycemic Event Days&quot;.*/\n\n\ndefine function &quot;Numerator Observations&quot;(QualifyingEncounter Encounter):\n  if QualifyingEncounter.id in &quot;Denominator Exclusions&quot;.id then singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return 0\n  ) \n    else singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return Count(EncounterWithEventDays.eligibleEventDays EligibleEventDay\n          where EligibleEventDay.hasHyperglycemicEvent\n      )\n  )\n\n/**\n * Creates a list of 24 hour long intervals in an interval paired with the index (1 indexed) to which 24 hour interval it is.*/\n\n\ndefine function &quot;Days In Period&quot;(Period Interval&lt;DateTime&gt;):\n  ( &quot;Interval To Day Numbers&quot;(Period) ) DayNumber\n    let startPeriod: start of Period + ( 24 hours * ( DayNumber - 1 ) ),\n    endPeriod: if ( hours between startPeriod and end of Period &lt; 24 ) then startPeriod \n      else start of Period + ( 24 hours * DayNumber )\n    return Tuple {\n      dayNumber: DayNumber,\n      dayPeriod: Interval[startPeriod, endPeriod )\n    }</code></pre> \n                        </td> \n                     </tr> \n                  </table> \n               </td> \n            </tr> \n         </table> \n      </div>"
  },
  "contained" : [
    {
      "resourceType" : "Parameters",
      "id" : "options",
      "parameter" : [
        {
          "name" : "translatorVersion",
          "valueString" : "3.25.0"
        },
        {
          "name" : "option",
          "valueString" : "EnableAnnotations"
        },
        {
          "name" : "option",
          "valueString" : "EnableLocators"
        },
        {
          "name" : "option",
          "valueString" : "DisableListDemotion"
        },
        {
          "name" : "option",
          "valueString" : "DisableListPromotion"
        },
        {
          "name" : "format",
          "valueString" : "JSON"
        },
        {
          "name" : "format",
          "valueString" : "XML"
        },
        {
          "name" : "analyzeDataRequirements",
          "valueBoolean" : false
        },
        {
          "name" : "collapseDataRequirements",
          "valueBoolean" : false
        },
        {
          "name" : "compatibilityLevel",
          "valueString" : "1.5"
        },
        {
          "name" : "enableCqlOnly",
          "valueBoolean" : false
        },
        {
          "name" : "errorLevel",
          "valueString" : "Info"
        },
        {
          "name" : "signatureLevel",
          "valueString" : "Overloads"
        },
        {
          "name" : "validateUnits",
          "valueBoolean" : true
        },
        {
          "name" : "verifyOnly",
          "valueBoolean" : false
        }
      ]
    }
  ],
  "extension" : [
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode",
      "valueCoding" : {
        "system" : "http://loinc.org",
        "code" : "21112-8",
        "display" : "Birth date"
      }
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-cqlOptions",
      "valueReference" : {
        "reference" : "#options"
      }
    }
  ],
  "url" : "https://madie.cms.gov/Library/CMS871HHHyperFHIR",
  "identifier" : [
    {
      "use" : "official",
      "system" : "https://madie.cms.gov/login",
      "value" : "CMS871HHHyperFHIR"
    }
  ],
  "version" : "0.3.000",
  "name" : "CMS871HHHyperFHIR",
  "title" : "CMS871HHHyperFHIR",
  "status" : "active",
  "experimental" : false,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2025-05-23T20:52:30+00:00",
  "publisher" : "Centers for Medicare & Medicaid Services (CMS)",
  "description" : "CMS871HHHyperFHIR",
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "bGlicmFyeSBDTVM4NzFISEh5cGVyRkhJUiB2ZXJzaW9uICcwLjMuMDAwJw0KDQp1c2luZyBRSUNvcmUgdmVyc2lvbiAnNi4wLjAnDQoNCmluY2x1ZGUgRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC40LjAwMCcgY2FsbGVkIEZISVJIZWxwZXJzDQppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc1LjEuMDAwJyBjYWxsZWQgU0RFDQppbmNsdWRlIENRTUNvbW1vbiB2ZXJzaW9uICc0LjEuMDAwJyBjYWxsZWQgQ1FNQ29tbW9uDQppbmNsdWRlIFFJQ29yZUNvbW1vbiB2ZXJzaW9uICc0LjAuMDAwJyBjYWxsZWQgUUlDb3JlQ29tbW9uDQppbmNsdWRlIEN1bXVsYXRpdmVNZWRpY2F0aW9uRHVyYXRpb24gdmVyc2lvbiAnNS4wLjAwMCcgY2FsbGVkIENNRA0KDQpjb2Rlc3lzdGVtICJMT0lOQyI6ICdodHRwOi8vbG9pbmMub3JnJw0KDQp2YWx1ZXNldCAiYmlydGggZGF0ZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41NjAuMTAwLjQnDQp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnDQp2YWx1ZXNldCAiRGlhYmV0ZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAzLjEyLjEwMDEnDQp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIZWFsdGggQ2FyZSBGYWNpbGl0eSBmb3IgSG9zcGljZSBDYXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMDcnDQp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwOScNCnZhbHVlc2V0ICJFbmNvdW50ZXIgSW5wYXRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjY2Ni41LjMwNycNCnZhbHVlc2V0ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMzQnDQp2YWx1ZXNldCAiSHlwb2dseWNlbWljcyBUcmVhdG1lbnQgTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTk2LjM5NCcNCg0KY29kZSAiQmlydGggZGF0ZSI6ICcyMTExMi04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnQmlydGggZGF0ZScNCg0KcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPg0KDQpjb250ZXh0IFBhdGllbnQNCg0KLyoqKi8NCg0KDQpkZWZpbmUgIkNvbWZvcnQgTWVhc3VyZXMgQ2FyZSI6DQogIFsiU2VydmljZVJlcXVlc3QiOiAiQ29tZm9ydCBNZWFzdXJlcyJdDQogICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiQ29tZm9ydCBNZWFzdXJlcyJdDQoNCmRlZmluZSAiRGF5cyBpbiBIb3NwaXRhbGl6YXRpb24iOg0KICAiTWVhc3VyZW1lbnQgUG9wdWxhdGlvbiIgRWxpZ2libGVJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24NCiAgICBsZXQgcGVyaW9kOiBDUU1Db21tb24uIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiIgKCBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbiApLA0KICAgIHJlbGV2YW50UGVyaW9kOiAiSG9zcGl0YWwgRGF5cyBNYXggMTAiKHBlcmlvZCkNCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVyOiBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbiwNCiAgICAgIGhvc3BpdGFsaXphdGlvblBlcmlvZDogcGVyaW9kLA0KICAgICAgcmVsZXZhbnRQZXJpb2Q6IHJlbGV2YW50UGVyaW9kLA0KICAgICAgcmVsZXZhbnREYXlzOiAiRGF5cyBJbiBQZXJpb2QiKHJlbGV2YW50UGVyaW9kKQ0KICAgIH0NCg0KZGVmaW5lICJEYXlzIHdpdGggR2x1Y29zZSBSZXN1bHRzIjoNCiAgIkRheXMgaW4gSG9zcGl0YWxpemF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbERheXMNCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVyOiBJbnBhdGllbnRIb3NwaXRhbERheXMuZW5jb3VudGVyLA0KICAgICAgcmVsZXZhbnRQZXJpb2Q6IElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudFBlcmlvZCwNCiAgICAgIHJlbGV2YW50RGF5czogKCBJbnBhdGllbnRIb3NwaXRhbERheXMucmVsZXZhbnREYXlzIEVuY291bnRlckRheQ0KICAgICAgICAgIHJldHVybiBUdXBsZSB7DQogICAgICAgICAgICBkYXlOdW1iZXI6IEVuY291bnRlckRheS5kYXlOdW1iZXIsDQogICAgICAgICAgICBkYXlQZXJpb2Q6IEVuY291bnRlckRheS5kYXlQZXJpb2QsDQogICAgICAgICAgICBoYXNTZXZlcmVSZXN1bHQ6IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QNCiAgICAgICAgICAgICAgICB3aGVyZSBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC52YWx1ZSA+IDMwMCAnbWcvZEwnDQogICAgICAgICAgICAgICAgICBhbmQgUUlDb3JlQ29tbW9uLiJFYXJsaWVzdCIgKCBHbHVjb3NlVGVzdC5lZmZlY3RpdmUgKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGhhc0VsZXZhdGVkUmVzdWx0OiBleGlzdHMgKCBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEdsdWNvc2VUZXN0DQogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QudmFsdWUgPj0gMjAwICdtZy9kTCcNCiAgICAgICAgICAgICAgICAgIGFuZCBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kDQogICAgICAgICAgICApLA0KICAgICAgICAgICAgaGFzTm9HbHVjb3NlVGVzdDogbm90IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QNCiAgICAgICAgICAgICAgICB3aGVyZSBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgICAgICAgICAgICAgIGFuZCBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kDQogICAgICAgICAgICApDQogICAgICAgICAgfQ0KICAgICAgKQ0KICAgIH0NCg0KLyojIGh5cGVyIGRheXMgdXNlcyAiUmVsZXZhbnQgRW5jb3VudGVycyBXaXRoIEdsdWNvc2UgUmVzdWx0IERheXMiIHRvIGZpbmQgaWYgaHlwZXIgZXZlbnQgb24gZWFjaCBkYXkuIFNraXBzIDFzdCBkYXkgaW4gJ1JlbGV2YW50RGF5c2AuIFJldHVybnMgYm9vbGVhbiBiYXNlZCBvbjogVG9kYXkgaGlnaCByZXN1bHQgT1IgVG9kYXkgbm8gcmVzdWx0IEFORCBZZXN0ZXJkYXkgaGlnaCByZXN1bHQgQU5EIDIgZGF5cyBhZ28gaGlnaCByZXN1bHQqLw0KDQoNCmRlZmluZSAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIjoNCiAgIkRheXMgd2l0aCBHbHVjb3NlIFJlc3VsdHMiIEVuY291bnRlcldpdGhSZXN1bHREYXlzDQogICAgbGV0IGVsaWdpYmxlRXZlbnREYXlzOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5DQogICAgICB3aGVyZSBFbmNvdW50ZXJEYXkuZGF5TnVtYmVyID4gMQ0KICAgICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgICAgZGF5SW5kZXg6IEVuY291bnRlckRheS5kYXlOdW1iZXIsDQogICAgICAgIGRheVBlcmlvZDogRW5jb3VudGVyRGF5LmRheVBlcmlvZCwNCiAgICAgICAgaGFzSHlwZXJnbHljZW1pY0V2ZW50OiAoIEVuY291bnRlckRheS5oYXNTZXZlcmVSZXN1bHQNCiAgICAgICAgICAgIG9yICggRW5jb3VudGVyRGF5Lmhhc05vR2x1Y29zZVRlc3QNCiAgICAgICAgICAgICAgICBhbmQgRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnREYXlzW0VuY291bnRlckRheS5kYXlOdW1iZXIgLSAyXS5oYXNFbGV2YXRlZFJlc3VsdA0KICAgICAgICAgICAgICAgIGFuZCBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXNbRW5jb3VudGVyRGF5LmRheU51bWJlciAtIDNdLmhhc0VsZXZhdGVkUmVzdWx0DQogICAgICAgICAgICApDQogICAgICAgICkNCiAgICAgIH0NCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVyOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5lbmNvdW50ZXIsDQogICAgICByZWxldmFudFBlcmlvZDogRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnRQZXJpb2QsDQogICAgICBlbGlnaWJsZUV2ZW50RGF5czogZWxpZ2libGVFdmVudERheXMNCiAgICB9DQoNCmRlZmluZSAiRGVub21pbmF0b3IiOg0KICAiSW5pdGlhbCBQb3B1bGF0aW9uIg0KDQpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiOg0KICAiRW5jb3VudGVyIHdpdGggRWFybHkgR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIG9yIHdpdGggQ29tZm9ydCBvciBIb3NwaWNlIENhcmUiDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoNCiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uDQogICAgd2l0aCAiQ29tZm9ydCBNZWFzdXJlcyBDYXJlIiBDb21mb3J0Q2FyZQ0KICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKENvbWZvcnRDYXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRDYXJlLmF1dGhvcmVkT24udG9JbnRlcnZhbCgpKSBkdXJpbmcgQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICkNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSI6DQogICJJbml0aWFsIFBvcHVsYXRpb24iIElucGF0aWVudEhvc3BpdGFsaXphdGlvbg0KICAgIHdoZXJlIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24gaW4gIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIg0KICAgICAgb3IgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvbi5kaXNjaGFyZ2VEaXNwb3NpdGlvbiBpbiAiRGlzY2hhcmdlZCB0byBIZWFsdGggQ2FyZSBGYWNpbGl0eSBmb3IgSG9zcGljZSBDYXJlIg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVhcmx5IEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCBvciB3aXRoIENvbWZvcnQgb3IgSG9zcGljZSBDYXJlIjoNCiAgIkVuY291bnRlciB3aXRoIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCINCiAgICB1bmlvbiAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIg0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSINCg0KDQovKioNCiAqIFVzaW5nIHRoZSBhbHJlYWR5IGNhbGN1bGF0ZWQgcGFpcmluZyBvZiBob3NwaXRhbGl6YXRpb24gcGVyaW9kcyB3aXRoIGVuY291bnRlcnMsIGZpbHRlciBvbiBvbmVzIHdpdGggDQogKiBhbnkgZWxldmF0ZWQgKD49IDIwMCkgYmxvb2QgZ2x1Y29zZSByZWFkaW5nIGR1cmluZyB0aGUgaG9zcGl0YWxpemF0aW9uKi8NCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVsZXZhdGVkIEdsdWNvc2UgR3JlYXRlciBUaGFuIG9yIEVxdWFsIHRvIDIwMCI6DQogICJFbmNvdW50ZXIgd2l0aCBIb3NwaXRhbGl6YXRpb24gUGVyaW9kIiBIb3NwaXRhbGl6YXRpb24NCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QNCiAgICAgIHN1Y2ggdGhhdCBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApIGR1cmluZyBIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uUGVyaW9kDQogICAgICAgIGFuZCBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgICAgICAgIC8vYW5kIEdsdWNvc2VUZXN0LnN0YXR1cyAhPSAnY2FuY2VsbGVkJw0KICAgICAgICANCiAgICAgICAgYW5kIEdsdWNvc2VUZXN0LnZhbHVlID49IDIwMCAnbWcvZEwnDQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXINCg0KLyoqDQogKiBVc2luZyB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIHBhaXJpbmcgb2YgaG9zcGl0YWxpemF0aW9uIHBlcmlvZHMgd2l0aCBlbmNvdW50ZXJzLCBmaWx0ZXIgb24gb25lcyB3aXRoIA0KICogZGlhYmV0ZXMgYW5kIHJldHVybiB0aGUgZW5jb3VudGVyLiovDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBFeGlzdGluZyBEaWFiZXRlcyBEaWFnbm9zaXMiOg0KICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uDQogICAgd2l0aCBbIkNvbmRpdGlvbkVuY291bnRlckRpYWdub3NpcyI6ICJEaWFiZXRlcyJdIERpYWJldGVzDQogICAgICBzdWNoIHRoYXQgKCBRSUNvcmVDb21tb24uIlRvUHJldmFsZW5jZUludGVydmFsIiAoIERpYWJldGVzICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZCApDQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXINCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiOg0KICBmcm9tDQogICAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLA0KICAgICJJbml0aWFsIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgRWFybHlHbHVjb3NlUmVzdWx0DQogICAgd2hlcmUgRWFybHlHbHVjb3NlUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ID4gNjAwICdtZy9kTCcNCiAgICAgIGFuZCBFYXJseUdsdWNvc2VSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgUUlDb3JlQ29tbW9uLiJFYXJsaWVzdCIgKCBFYXJseUdsdWNvc2VSZXN1bHQuZWZmZWN0aXZlICkgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICkgLSAxIGhvdXIgKSwgKCBzdGFydCBvZiBDUU1Db21tb24uIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiIgKCBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24gKSArIDYgaG91cnMgKV0NCiAgICByZXR1cm4gSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uDQoNCg0KLyoqDQogKiBDcmVhdGUgcGFyaW5nIG9mIGVuY291bnRlcnMgdG8gaG9zcGl0YWxpemF0aW9uIHBlcmlvZCBzbyB0aGlzIGNhbGN1bGF0aW9uIGNhbiBiZSBpbnNwZWN0ZWQgYW5kIHRoZSByZXN1bHQgDQogKiBjYW4gYmUgcmV1c2VkLCBtYWtpbmcgdGhlIGxvZ2ljIGZhc3Rlci4qLw0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCI6DQogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0hvc3BpdGFsaXphdGlvbg0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBlbmNvdW50ZXI6IFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24sDQogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IENRTUNvbW1vbi4iSG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uIiAoIFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24gKQ0KICAgIH0NCg0KLyoqKi8NCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIjoNCiAgIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgSHlwZXJnbHljZW1pY0V2ZW50RGF5cw0KICAgIHdoZXJlIGV4aXN0cyAoIEh5cGVyZ2x5Y2VtaWNFdmVudERheXMuZWxpZ2libGVFdmVudERheXMgRWxpZ2libGVFdmVudERheQ0KICAgICAgICB3aGVyZSBFbGlnaWJsZUV2ZW50RGF5Lmhhc0h5cGVyZ2x5Y2VtaWNFdmVudA0KICAgICkNCiAgICByZXR1cm4gSHlwZXJnbHljZW1pY0V2ZW50RGF5cy5lbmNvdW50ZXINCg0KLyoqDQogKiBVc2luZyB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIHBhaXJpbmcgb2YgaG9zcGl0YWxpemF0aW9uIHBlcmlvZHMgd2l0aCBlbmNvdW50ZXJzLCBmaWx0ZXIgb24gb25lcyB3aXRoIA0KICogaHlwb2dseWNlbWljIG1lZGljYXRvbnMgYW5kIHJldHVybiB0aGUgZW5jb3VudGVyLiovDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uLA0KICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIkh5cG9nbHljZW1pY3MgVHJlYXRtZW50IE1lZGljYXRpb25zIl0gSHlwb2dseWNlbWljTWVkDQogICAgd2hlcmUgSHlwb2dseWNlbWljTWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0NCiAgICAgICAgICAvL2FuZCBIeXBvZ2x5Y2VtaWNNZWQuc3RhdHVzICE9ICdub3QtZG9uZScNCiAgICAgIA0KICAgICAgYW5kIFFJQ29yZUNvbW1vbi4iVG9JbnRlcnZhbCIgKCBIeXBvZ2x5Y2VtaWNNZWQuZWZmZWN0aXZlICkgZHVyaW5nIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QNCiAgICByZXR1cm4gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlcg0KDQpkZWZpbmUgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6DQogIGZyb20NCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdA0KICAgIGxldCBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbDogQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICksDQogICAgR2x1Y29zZVRlc3RUaW1lOiBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApDQogICAgd2hlcmUgR2x1Y29zZVRlc3QudmFsdWUgYXMgUXVhbnRpdHkgPiA2MDAgJ21nL2RMJw0KICAgICAgYW5kIEdsdWNvc2VUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQ0KICAgICAgYW5kIEdsdWNvc2VUZXN0VGltZSBkdXJpbmcgSW50ZXJ2YWxbKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCAtIDEgaG91ciApLCAoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsICsgNiBob3VycyApXQ0KICAgIHJldHVybiBHbHVjb3NlVGVzdA0KDQpkZWZpbmUgIkdsdWNvc2UgVGVzdHMgRWFybGllciBUaGFuIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6DQogIGZyb20NCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sDQogICAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMCwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEVhcmxpZXJHbHVjb3NlVGVzdA0KICAgIGxldCBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbDogQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICksDQogICAgR2x1Y29zZVRlc3Q2MDBUaW1lOiBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VSZXN1bHQ2MDAuZWZmZWN0aXZlICksDQogICAgRWFybGllckdsdWNvc2VUZXN0VGltZTogUUlDb3JlQ29tbW9uLiJFYXJsaWVzdCIgKCBFYXJsaWVyR2x1Y29zZVRlc3QuZWZmZWN0aXZlICkNCiAgICB3aGVyZSBHbHVjb3NlVGVzdDYwMFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCArIDYgaG91ciApXQ0KICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgR2x1Y29zZVRlc3Q2MDBUaW1lICkNCiAgICAgIGFuZCBFYXJsaWVyR2x1Y29zZVRlc3QuaWQgIX4gR2x1Y29zZVJlc3VsdDYwMC5pZA0KICAgIHJldHVybiBHbHVjb3NlUmVzdWx0NjAwDQoNCmRlZmluZSAiSW5pdGlhbCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiOg0KICAiR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IiBHbHVjb3NlUmVzdWx0NjAwDQogICAgd2hlcmUgbm90ICggR2x1Y29zZVJlc3VsdDYwMC5pZCBpbiAiR2x1Y29zZSBUZXN0cyBFYXJsaWVyIFRoYW4gR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0Ii5pZCApDQoNCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoNCiAgIkVuY291bnRlciB3aXRoIEV4aXN0aW5nIERpYWJldGVzIERpYWdub3NpcyINCiAgICB1bmlvbiAiRW5jb3VudGVyIHdpdGggSHlwb2dseWNlbWljIE1lZGljYXRpb24iDQogICAgdW5pb24gIkVuY291bnRlciB3aXRoIEVsZXZhdGVkIEdsdWNvc2UgR3JlYXRlciBUaGFuIG9yIEVxdWFsIHRvIDIwMCINCg0KZGVmaW5lICJNZWFzdXJlbWVudCBQb3B1bGF0aW9uIjoNCiAgIkRlbm9taW5hdG9yIg0KDQpkZWZpbmUgIk51bWVyYXRvciI6DQogICJFbmNvdW50ZXIgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyINCg0KZGVmaW5lICJOdW1lcmF0b3IgRXhjbHVzaW9ucyI6DQogICJFbmNvdW50ZXIgd2l0aCBFYXJseSBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgb3Igd2l0aCBDb21mb3J0IG9yIEhvc3BpY2UgQ2FyZSINCg0KZGVmaW5lICJRdWFsaWZ5aW5nIEVuY291bnRlciI6DQogIFsiRW5jb3VudGVyIjogIkVuY291bnRlciBJbnBhdGllbnQiXSBJbnBhdGllbnRFbmNvdW50ZXINCiAgICB3aGVyZSBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4DQogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZCBlbmRzIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCINCiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIuc3RhdHVzID0gJ2ZpbmlzaGVkJw0KDQpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOg0KICBTREUuIlNERSBFdGhuaWNpdHkiDQoNCmRlZmluZSAiU0RFIFBheWVyIjoNCiAgU0RFLiJTREUgUGF5ZXIiDQoNCmRlZmluZSAiU0RFIFJhY2UiOg0KICBTREUuIlNERSBSYWNlIg0KDQpkZWZpbmUgIlNERSBTZXgiOg0KICBTREUuIlNERSBTZXgiDQoNCi8qKg0KICogQ3JvcHMgYW4gaW50ZXJ2YWwgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZiAxMCBkYXlzLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbCBEYXlzIE1heCAxMCIoUGVyaW9kIEludGVydmFsPERhdGVUaW1lPik6DQogIEludGVydmFsW3N0YXJ0IG9mIFBlcmlvZCwgTWluKHsgDQogICAgZW5kIG9mIFBlcmlvZCwgc3RhcnQgb2YgUGVyaW9kICsgMTAgZGF5cyB9DQogICldDQoNCi8qKg0KICogQ3JlYXRlcyBhIGxpc3Qgb2YgaW50ZWdlcnMgZnJvbSAxIHRvIGhvdyBtYW55IGRheXMgYXJlIGluIHRoZSBpbnRlcnZhbC4gTm90ZSwgdGhpcyB3b250IGNyZWF0ZSBhbiBpbmRleCBmb3INCiAqIHRoZSBmaW5hbCBkYXkgaWYgaXQgaXMgbGVzcyB0aGFuIDI0IGhvdXJzLiBUaGlzIGFsc28gaW5jbHVkZXMgdGhlIGZpcnN0IDI0IGhvdXIgcGVyaW9kLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJJbnRlcnZhbCBUbyBEYXkgTnVtYmVycyIoUGVyaW9kIEludGVydmFsPERhdGVUaW1lPik6DQogICggZXhwYW5kIHsgSW50ZXJ2YWxbMSwgZHVyYXRpb24gaW4gZGF5cyBiZXR3ZWVuIHN0YXJ0IG9mIFBlcmlvZCBhbmQgZW5kIG9mIFBlcmlvZF19ICkgRGF5RXhwYW5kDQogICAgcmV0dXJuIGVuZCBvZiBEYXlFeHBhbmQNCg0KLyoqDQogKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGlnaWJsZSBkYXlzIGluIGFuIGVuY291bnRlci4gVGhpcyBzaW1wbHkgZmlsdGVycyBhbmQgY291bnRzIHRoZSBkYXRhIGJ1aWx0IGluDQogKiAiUmVsZXZhbnQgRW5jb3VudGVycyBXaXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnQgRGF5cyIuKi8NCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkRlbm9taW5hdG9yIE9ic2VydmF0aW9ucyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBpZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkIGluICJEZW5vbWluYXRvciBFeGNsdXNpb25zIi5pZCB0aGVuIHNpbmdsZXRvbiBmcm9tICggIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgRW5jb3VudGVyV2l0aEV2ZW50RGF5cw0KICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgICByZXR1cm4gMA0KICApIA0KICAgIGVsc2Ugc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzDQogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICAgIHJldHVybiBDb3VudChFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVsaWdpYmxlRXZlbnREYXlzKQ0KICApDQoNCi8qKg0KICogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxpZ2libGUgZGF5cyB3aXRoIGEgaHlwZXJnbHljZW1pYyBldmVudCBpbiBhbiBlbmNvdW50ZXIuIFRoaXMgc2ltcGx5IGZpbHRlcnMgYW5kIGNvdW50cyB0aGUgZGF0YSBidWlsdCBpbg0KICogIlJlbGV2YW50IEVuY291bnRlcnMgV2l0aCBIeXBlcmdseWNlbWljIEV2ZW50IERheXMiLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJOdW1lcmF0b3IgT2JzZXJ2YXRpb25zIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIGlmIFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQgaW4gIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiLmlkIHRoZW4gc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzDQogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICAgIHJldHVybiAwDQogICkgDQogICAgZWxzZSBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMNCiAgICAgIHdoZXJlIEVuY291bnRlcldpdGhFdmVudERheXMuZW5jb3VudGVyID0gUXVhbGlmeWluZ0VuY291bnRlcg0KICAgICAgcmV0dXJuIENvdW50KEVuY291bnRlcldpdGhFdmVudERheXMuZWxpZ2libGVFdmVudERheXMgRWxpZ2libGVFdmVudERheQ0KICAgICAgICAgIHdoZXJlIEVsaWdpYmxlRXZlbnREYXkuaGFzSHlwZXJnbHljZW1pY0V2ZW50DQogICAgICApDQogICkNCg0KLyoqDQogKiBDcmVhdGVzIGEgbGlzdCBvZiAyNCBob3VyIGxvbmcgaW50ZXJ2YWxzIGluIGFuIGludGVydmFsIHBhaXJlZCB3aXRoIHRoZSBpbmRleCAoMSBpbmRleGVkKSB0byB3aGljaCAyNCBob3VyIGludGVydmFsIGl0IGlzLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJEYXlzIEluIFBlcmlvZCIoUGVyaW9kIEludGVydmFsPERhdGVUaW1lPik6DQogICggIkludGVydmFsIFRvIERheSBOdW1iZXJzIihQZXJpb2QpICkgRGF5TnVtYmVyDQogICAgbGV0IHN0YXJ0UGVyaW9kOiBzdGFydCBvZiBQZXJpb2QgKyAoIDI0IGhvdXJzICogKCBEYXlOdW1iZXIgLSAxICkgKSwNCiAgICBlbmRQZXJpb2Q6IGlmICggaG91cnMgYmV0d2VlbiBzdGFydFBlcmlvZCBhbmQgZW5kIG9mIFBlcmlvZCA8IDI0ICkgdGhlbiBzdGFydFBlcmlvZCANCiAgICAgIGVsc2Ugc3RhcnQgb2YgUGVyaW9kICsgKCAyNCBob3VycyAqIERheU51bWJlciApDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGRheU51bWJlcjogRGF5TnVtYmVyLA0KICAgICAgZGF5UGVyaW9kOiBJbnRlcnZhbFtzdGFydFBlcmlvZCwgZW5kUGVyaW9kICkNCiAgICB9"
    }
  ]
}