<?xml version="1.0" encoding="UTF-8"?>

<Library xmlns="http://hl7.org/fhir">
  <id value="CMS832FHIRHHAKI"/>
  <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 CMS832FHIRHHAKI 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

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

valueset &quot;Body temperature&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.152'
valueset &quot;Creatinine Mass Per Volume&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.21'
valueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'
valueset &quot;Glomerular Filtration Rate&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.17.4077.2.2038'
valueset &quot;High Risk Diagnosis for AKI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.12'
valueset &quot;High Risk Procedures for AKI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.19'
valueset &quot;Hospital Based Dialysis Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.199'
valueset &quot;Obstetrics and VTE Obstetrics&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.33'
valueset &quot;Present on Admission or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'

code &quot;Female (finding)&quot;: '248152002' from &quot;SNOMEDCT&quot; display 'Female'
code &quot;Male (finding)&quot;: '248153007' from &quot;SNOMEDCT&quot; display 'Male'
code &quot;Heart rate&quot;: '8867-4' from &quot;LOINC&quot; display 'Heart rate'
code &quot;Respiratory rate&quot;: '9279-1' from &quot;LOINC&quot; display 'Respiratory rate'
code &quot;Systolic blood pressure&quot;: '8480-6' from &quot;LOINC&quot; display 'Systolic blood pressure'

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;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 &quot;Initial Population&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot;

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

define &quot;Denominator Exclusion&quot;:
  &quot;Encounter With Less Than 2 Creatinine Results Within 48 Hours Of Arrival&quot;
    union &quot;Encounter With Index eGFR Less Than 60 Within First 48 Hours&quot;
    union &quot;Encounter With 0.3 mg dL Or More Increase In Creatinine&quot;
    union &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival Without High Creatinine&quot;
    union &quot;Encounter With High Risk Diagnosis For AKI&quot;
    union &quot;Encounter With High Risk Procedures For AKI&quot;

define &quot;Numerator&quot;:
  &quot;Encounter With 2 Times Serum Creatinine Increase&quot;
    union &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival Without High Creatinine&quot;

define &quot;Encounter With Age 18 And Length Of Stay 48 Hours Or More&quot;:
  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter
    where Patient.sex ( ) in { &quot;Male (finding)&quot;.code, &quot;Female (finding)&quot;.code }
      and InpatientEncounter.period ends during day of &quot;Measurement Period&quot;
      and InpatientEncounter.status = 'finished'
      and AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18
      and ( duration in hours of InpatientEncounter.hospitalizationWithObservation ( ) &gt;= 48 )

define &quot;Inpatient Encounter With Creatinine&quot;:
  from
    &quot;Encounter With Age 18 And Length Of Stay 48 Hours Or More&quot; Encounter48Hours,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest
    let HospitalizationPeriod: Encounter48Hours.hospitalizationWithObservation ( ),
    CreatinineTestStart: CreatinineTest.effective.earliest ( )
    where CreatinineTest.value as Quantity is not null
      and CreatinineTestStart during Interval[start of HospitalizationPeriod + 48 hours, end of HospitalizationPeriod]
      and CreatinineTest.status in { 'final', 'amended', 'corrected' }
    return Encounter48Hours

define &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot;:
  &quot;Inpatient Encounter With Creatinine&quot; EncounterWithCreatinine
    where not ( EncounterWithCreatinine.reasonCode in &quot;Obstetrics and VTE Obstetrics&quot;
        or EncounterWithCreatinine.encounterDiagnosis ( ).code in &quot;Obstetrics and VTE Obstetrics&quot;
    )

define &quot;Encounter With Less Than 2 Creatinine Results Within 48 Hours Of Arrival&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    where ( Count(&quot;QualifyingEncounter&quot;.creatinineLabTestwithResultwithinFirst48Hours()) &lt; 2 )

define &quot;Encounter With Index eGFR Less Than 60 Within First 48 Hours&quot;:
  &quot;Male Encounter With eGFR Less Than 60&quot;
    union &quot;Female Encounter With eGFR Less Than 60&quot;

define &quot;Female Encounter With eGFR Less Than 60&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    where &quot;QualifyingEncounter&quot;.femaleeGFR ( ) is not null
      and &quot;QualifyingEncounter&quot;.femaleeGFR ( ) as Decimal &lt; 60

define &quot;Male Encounter With eGFR Less Than 60&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    where &quot;QualifyingEncounter&quot;.maleeGFR ( ) is not null
      and &quot;QualifyingEncounter&quot;.maleeGFR ( ) as Decimal &lt; 60

define &quot;Encounter With 0.3 mg dL Or More Increase In Creatinine&quot;:
  &quot;Increase Of 0.3 Or More Using Lowest Creatinine Within 24 Hours&quot;
    union &quot;Increase Of 0.3 Or More Using First Creatinine Within First 48 Hours&quot;

define &quot;Increase Of 0.3 Or More Using Lowest Creatinine Within 24 Hours&quot;:
  from
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] IndexCreatinineLabResult,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] SubsequentCreatinineLabResult
    let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),
    SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),
    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )
    where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }
      and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }
      and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) &gt; 0.299 'mg/dL'
      and IndexCreatinineLabResult.value = &quot;QualifyingEncounter&quot;.lowestSerumCreatinineResult ( )
      and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]
      and IndexCreatinineLabResultTime during HospitalWithObservationPeriod
      and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 24 hours]
      and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod
      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]
      and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id
    return QualifyingEncounter

define &quot;Increase Of 0.3 Or More Using First Creatinine Within First 48 Hours&quot;:
  from
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] IndexCreatinineLabResult,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] SubsequentCreatinineLabResult
    let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),
    SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),
    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )
    where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }
      and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }
      and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) &gt; 0.299 'mg/dL'
      and IndexCreatinineLabResult.value as Quantity = singleton from &quot;QualifyingEncounter&quot;.earliestSerumCreatinineResult ( )
      and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]
      and IndexCreatinineLabResultTime during HospitalWithObservationPeriod
      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]
      and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod
      and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]
      and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id
    return QualifyingEncounter

define &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival Without High Creatinine&quot;:
  &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival&quot; EncounterWithKidneyDialysis48HoursOrAfter
    where not ( exists ( &quot;Encounter With 2 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine
          where ( EncounterWithHighCreatinine.period includes EncounterWithKidneyDialysis48HoursOrAfter.period )
      )
    )

define &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival&quot;:
  from
    [&quot;Procedure&quot;: &quot;Hospital Based Dialysis Services&quot;] Dialysis,
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )
    where Dialysis.status = 'completed'
      and Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]
      and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod
    return QualifyingEncounter

define &quot;Encounter With 2 Times Serum Creatinine Increase&quot;:
  from
    &quot;Encounter With 1.5 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] HighCreatinineTest,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] LowCreatinineTest
    let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),
    HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),
    HospitalWithObservationPeriod: EncounterWithHighCreatinine.hospitalizationWithObservation ( )
    where ( HighCreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot; )
      and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }
      and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }
      and HighCreatinineTest.value = &quot;EncounterWithHighCreatinine&quot;.highestSerumCreatinineResult ( )
      and LowCreatinineTest.value = &quot;EncounterWithHighCreatinine&quot;.lowestSerumCreatinineResult ( )
      and ( HighCreatinineTest.value as Quantity ) &gt;= ( LowCreatinineTest.value as Quantity )
      and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime
      and LowCreatinineTestTime during HospitalWithObservationPeriod
      and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]
      and HighCreatinineTestTime during HospitalWithObservationPeriod
    return EncounterWithHighCreatinine

define &quot;Serum Creatinine Normal&quot;:
  if ( Patient.sex ( ) = &quot;Female (finding)&quot;.code ) then 1.02 'mg/dL' 
    else 1.18 'mg/dL'

define &quot;Encounter With High Risk Diagnosis For AKI&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    where ( QualifyingEncounter.reasonCode in &quot;High Risk Diagnosis for AKI&quot;
        or QualifyingEncounter.encounterDiagnosis ( ).code in &quot;High Risk Diagnosis for AKI&quot;
    )

define &quot;Encounter With High Risk Procedures For AKI&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    with [&quot;Procedure&quot;: &quot;High Risk Procedures for AKI&quot;] HighRiskProcedures
      such that HighRiskProcedures.status = 'completed'
        and HighRiskProcedures.performed.toInterval ( ) starts during QualifyingEncounter.hospitalizationWithObservation ( )

define &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival Without High Creatinine&quot;:
  &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival&quot; EncounterWithDialysisAfter48Hours
    where not ( exists ( &quot;Encounter With 2 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine
          where ( EncounterWithHighCreatinine.period includes EncounterWithDialysisAfter48Hours.period )
      )
    )

define &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival&quot;:
  from
    [&quot;Procedure&quot;: &quot;Hospital Based Dialysis Services&quot;] Dialysis,
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )
    where Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod + 48 hours, end of HospitalWithObservationPeriod]
      and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod
      and Dialysis.status = 'completed'
    return QualifyingEncounter

define &quot;Qualifying Creatinine Lab Result By Time&quot;:
  from
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTestByTime
    let CrEncId: QualifyingEncounter.id,
    CrHospPeriod: QualifyingEncounter.hospitalizationWithObservation ( ),
    CrLabId: CreatinineTestByTime.id,
    CrTime: CreatinineTestByTime.effective.earliest ( ),
    CrTimeIssued: CreatinineTestByTime.issued,
    CrResult: CreatinineTestByTime.value as Quantity,
    CrResultValue: CrResult.value,
    CrResultUnit: CrResult.unit
    where CrTime during CrHospPeriod
      and CreatinineTestByTime.isLaboratory ( )
      and CreatinineTestByTime.status in { 'final', 'amended', 'corrected' }
      and CrResultUnit = 'mg/dL'
      and CreatinineTestByTime.value is not null
      and CreatinineTestByTime.value as Quantity &gt; 0 'mg/dL'
    return Tuple {
      CrEncInPtId: CrEncId,
      CrHospitalization: CrHospPeriod,
      CrLabObsId: CrLabId,
      CrLabObsCategory: if CreatinineTestByTime.isLaboratory ( ) then 'laboratory' 
        else CreatinineTestByTime.isLaboratory ( ),
      CrLabObsCategory: CreatinineTestByTime.category,
      CrLabObsStatus: CreatinineTestByTime.status,
      CrLabResult: CrResult,
      CrLabResultUnit: CrResultUnit,
      CrLabResultValue: CrResultValue,
      CrLabTime: CrTime,
      CrLabTimeIssued: CrTimeIssued
    }
    sort by CrLabTime

define &quot;Encounter With 1.5 Times Serum Creatinine Increase&quot;:
  from
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] HighCreatinineTest,
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] LowCreatinineTest
    let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),
    HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),
    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )
    where ( HighCreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot; )
      and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }
      and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }
      and HighCreatinineTest.value = &quot;QualifyingEncounter&quot;.highestSerumCreatinineResult ( )
      and LowCreatinineTest.value = &quot;QualifyingEncounter&quot;.lowestSerumCreatinineResult ( )
      and &quot;QualifyingEncounter&quot;.oneAndAHalfIncreaseInCreatinine ( ) &gt;= LowCreatinineTest.value
      and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime
      and LowCreatinineTestTime during HospitalWithObservationPeriod
      and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]
      and HighCreatinineTestTime during HospitalWithObservationPeriod
    return QualifyingEncounter

define &quot;Qualifying Blood Pressure Reading&quot;:
  [&quot;USCore.BloodPressureProfile&quot;] BloodPressure
    where BloodPressure.effective.earliest ( ) during day of &quot;Measurement Period&quot;

define fluent function &quot;creatinineLabTestwithResultwithinFirst48Hours&quot;(QualifyingEncounter Encounter):
  from
    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest
    where CreatinineTest.value as Quantity is not null
      and CreatinineTest.effective.earliest ( ) during Interval[start of QualifyingEncounter.hospitalizationWithObservation ( ), start of QualifyingEncounter.hospitalizationWithObservation ( ) + 48 hours]
      and CreatinineTest.effective.earliest ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
      and CreatinineTest.status in { 'final', 'amended', 'corrected' }
    return CreatinineTest

define fluent function &quot;femaleeGFR&quot;(QualifyingEncounter Encounter):
  if Patient.sex () = &quot;Female (finding)&quot;.code then ( 142 * Min({(&quot;QualifyingEncounter&quot;.indexCreatinine().value / 0.7), 1 }) ^ ( - 0.241 ) * Max({(&quot;QualifyingEncounter&quot;.indexCreatinine().value / 0.7), 1 }) ^ ( - 1.200 ) * 0.9938 ^ ( AgeInYearsAt(date from start of QualifyingEncounter.hospitalizationWithObservation()) ) * 1.012 ) 
    else null

define fluent function &quot;maleeGFR&quot;(QualifyingEncounter Encounter):
  if Patient.sex () = &quot;Male (finding)&quot;.code then ( 142 * Min({(&quot;QualifyingEncounter&quot;.indexCreatinine().value / 0.9), 1 }) ^ ( - 0.302 ) * Max({(&quot;QualifyingEncounter&quot;.indexCreatinine().value / 0.9), 1 }) ^ ( - 1.200 ) * 0.9938 ^ ( AgeInYearsAt(date from start of QualifyingEncounter.hospitalizationWithObservation()) ) ) 
    else null

define fluent function &quot;indexCreatinine&quot;(QualifyingEncounter Encounter):
  Coalesce(&quot;QualifyingEncounter&quot;.lowestSerumCreatinineIn24Hours(), singleton from &quot;QualifyingEncounter&quot;.firstSerumCreatinineIn48Hours())

define fluent function &quot;lowestSerumCreatinineIn24Hours&quot;(QualifyingEncounter Encounter):
  Min((from
        &quot;Qualifying Creatinine Lab Result By Time&quot; LabTestsLow
        let LabResult: LabTestsLow.CrLabResult
        where LabTestsLow.CrEncInPtId = QualifyingEncounter.id
          and LabTestsLow.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 24 hours]
    ).CrLabResult
  )

define fluent function &quot;firstSerumCreatinineIn48Hours&quot;(QualifyingEncounter Encounter):
  from
    &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests
    let LabResult: LabTests.CrLabResult
    where ( &quot;QualifyingEncounter&quot;.earliestSerumCreatinineTimeIn48Hours ( ) = LabTests.CrLabTime )
    return LabResult as Quantity

define fluent function &quot;earliestSerumCreatinineTimeIn48Hours&quot;(QualifyingEncounter Encounter):
  ( Min((from
          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests48
          let LabResult48: LabTests48.CrLabResult
          where LabTests48.CrEncInPtId = QualifyingEncounter.id
            and LabTests48.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 48 hours]
      ).CrLabTime
    )
  )

define fluent function &quot;earliestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):
  from
    &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests
    let LabResult: LabTests.CrLabResult
    where ( &quot;QualifyingEncounter&quot;.earliestSerumCreatinineTime ( ) = LabTests.CrLabTime )
    return LabResult as Quantity

define fluent function &quot;earliestSerumCreatinineTime&quot;(QualifyingEncounter Encounter):
  ( Min((from
          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTestsEarly
          let LabResultEarly: LabTestsEarly.CrLabResult
          where LabTestsEarly.CrEncInPtId = QualifyingEncounter.id
      ).CrLabTime
    )
  )

define fluent function &quot;highestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):
  ( Max((from
          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests
          let LabResult: LabTests.CrLabResult
          where LabTests.CrEncInPtId = QualifyingEncounter.id
      ).CrLabResult
    )
  )

define fluent function &quot;oneAndAHalfIncreaseInCreatinine&quot;(QualifyingEncounter Encounter):
  &quot;QualifyingEncounter&quot;.highestSerumCreatinineResult ( ) / 1.5

define fluent function &quot;lowestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):
  ( Min((from
          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests
          let LabResult: LabTests.CrLabResult
          where LabTests.CrEncInPtId = QualifyingEncounter.id
      ).CrLabResult
    )
  )

define &quot;Risk Variable Estimated Glomerular Filtration Rate For Females&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    return Tuple {
      encounterId: QualifyingEncounter.id,
      eGFR: &quot;QualifyingEncounter&quot;.femaleeGFR ( )
    }

define &quot;Risk Variable Estimated Glomerular Filtration Rate For Males&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    return Tuple {
      encounterId: QualifyingEncounter.id,
      eGFR: &quot;QualifyingEncounter&quot;.maleeGFR ( )
    }

define &quot;Risk Variable All Encounter Diagnoses With POA Indication&quot;:
  from
    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,
    [Claim] clm
    where clm.status = 'active'
      and clm.use = 'claim'
      and exists ( clm.item ClaimItem
          where ClaimItem.encounter.references ( QualifyingEncounter )
            and exists ( clm.diagnosis Dx
                where Dx.sequence in clm.item.diagnosisSequence
                  and Dx.onAdmission in &quot;Present on Admission or Clinically Undetermined&quot;
            )
      )

define &quot;Risk Variable First Heart Rate In Encounter&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    return Tuple {
      encounterId: QualifyingEncounter.id,
      firstHeartRate: &quot;QualifyingEncounter&quot;.firstHeartRate ( )
    }

define &quot;Risk Variable First Respiratory Rate In Encounter&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    return Tuple {
      encounterId: QualifyingEncounter.id,
      firstRespiratoryRate: &quot;QualifyingEncounter&quot;.firstRespiratoryRate ( )
    }

define &quot;Risk Variable First Systolic Blood Pressure In Encounter&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    return Tuple {
      encounterId: QualifyingEncounter.id,
      firstSystolicBP: &quot;QualifyingEncounter&quot;.firstSystolicBloodPressure ( )
    }

define &quot;Risk Variable First Temperature In Encounter&quot;:
  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter
    return Tuple {
      encounterId: QualifyingEncounter.id,
      firstTemperature: &quot;QualifyingEncounter&quot;.firstBodyTemperature ( )
    }

define fluent function &quot;firstBodyTemperature&quot;(QualifyingEncounter Encounter):
  First([&quot;USCore.BodyTemperatureProfile&quot;] FirstTemperature
      where FirstTemperature.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()
        and FirstTemperature.value is not null
      sort by effective.earliest()
  ).value as Quantity

define fluent function &quot;firstHeartRate&quot;(QualifyingEncounter Encounter):
  First([&quot;USCore.HeartRateProfile&quot;] FirstHeartBeats
      where FirstHeartBeats.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()
        and FirstHeartBeats.value is not null
      sort by effective.earliest()
  ).value as Quantity

define fluent function &quot;firstRespiratoryRate&quot;(QualifyingEncounter Encounter):
  First([&quot;USCore.RespiratoryRateProfile&quot;] FirstRespiration
      where FirstRespiration.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()
        and FirstRespiration.value is not null
      sort by effective.earliest()
  ).value as Quantity

define fluent function &quot;firstSystolicBloodPressure&quot;(QualifyingEncounter Encounter):
  First(&quot;Qualifying Blood Pressure Reading&quot; SBPReading
      where SBPReading.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()
      return singleton from(SBPReading.component SBPComponent
          where SBPComponent.code ~ &quot;Systolic blood pressure&quot;
          return SBPComponent.value as Quantity
      )
  )</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/CMS832FHIRHHAKI"/>
  <version value="1.1.000"/>
  <name value="CMS832FHIRHHAKI"/>
  <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="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM4MzJGSElSSEhBS0kgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgQ1FNQ29tbW9uIHZlcnNpb24gJzUuMS4wMDAnIGNhbGxlZCBDUU1Db21tb24KaW5jbHVkZSBVU1F1YWxpdHlDb3JlQ29tbW9uIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnIGNhbGxlZCBVU1F1YWxpdHlDb3JlQ29tbW9uCmluY2x1ZGUgU3VwcGxlbWVudGFsRGF0YUVsZW1lbnRzIHZlcnNpb24gJzYuMS4wMDAnIGNhbGxlZCBTREUKaW5jbHVkZSBTdGF0dXMgdmVyc2lvbiAnMi4xLjAwMCcgY2FsbGVkIFN0YXR1cwoKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKCnZhbHVlc2V0ICJCb2R5IHRlbXBlcmF0dXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4xNTInCnZhbHVlc2V0ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjEnCnZhbHVlc2V0ICJFbmNvdW50ZXIgSW5wYXRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjY2Ni41LjMwNycKdmFsdWVzZXQgIkdsb21lcnVsYXIgRmlsdHJhdGlvbiBSYXRlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4xNy40MDc3LjIuMjAzOCcKdmFsdWVzZXQgIkhpZ2ggUmlzayBEaWFnbm9zaXMgZm9yIEFLSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTInCnZhbHVlc2V0ICJIaWdoIFJpc2sgUHJvY2VkdXJlcyBmb3IgQUtJIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xOScKdmFsdWVzZXQgIkhvc3BpdGFsIEJhc2VkIERpYWx5c2lzIFNlcnZpY2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xOTknCnZhbHVlc2V0ICJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMzMnCnZhbHVlc2V0ICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk3JwoKY29kZSAiRmVtYWxlIChmaW5kaW5nKSI6ICcyNDgxNTIwMDInIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdGZW1hbGUnCmNvZGUgIk1hbGUgKGZpbmRpbmcpIjogJzI0ODE1MzAwNycgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ01hbGUnCmNvZGUgIkhlYXJ0IHJhdGUiOiAnODg2Ny00JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnSGVhcnQgcmF0ZScKY29kZSAiUmVzcGlyYXRvcnkgcmF0ZSI6ICc5Mjc5LTEnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdSZXNwaXJhdG9yeSByYXRlJwpjb2RlICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSI6ICc4NDgwLTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdTeXN0b2xpYyBibG9vZCBwcmVzc3VyZScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb24iOgogICJFbmNvdW50ZXIgV2l0aCBMZXNzIFRoYW4gMiBDcmVhdGluaW5lIFJlc3VsdHMgV2l0aGluIDQ4IEhvdXJzIE9mIEFycml2YWwiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggSW5kZXggZUdGUiBMZXNzIFRoYW4gNjAgV2l0aGluIEZpcnN0IDQ4IEhvdXJzIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIDAuMyBtZyBkTCBPciBNb3JlIEluY3JlYXNlIEluIENyZWF0aW5pbmUiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgNDggSG91cnMgT3IgTGVzcyBBZnRlciBBcnJpdmFsIFdpdGhvdXQgSGlnaCBDcmVhdGluaW5lIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEhpZ2ggUmlzayBEaWFnbm9zaXMgRm9yIEFLSSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBIaWdoIFJpc2sgUHJvY2VkdXJlcyBGb3IgQUtJIgoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJFbmNvdW50ZXIgV2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwgV2l0aG91dCBIaWdoIENyZWF0aW5pbmUiCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEFnZSAxOCBBbmQgTGVuZ3RoIE9mIFN0YXkgNDggSG91cnMgT3IgTW9yZSI6CiAgWyJFbmNvdW50ZXIiOiAiRW5jb3VudGVyIElucGF0aWVudCJdIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgUGF0aWVudC5zZXggKCApIGluIHsgIk1hbGUgKGZpbmRpbmcpIi5jb2RlLCAiRmVtYWxlIChmaW5kaW5nKSIuY29kZSB9CiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgYW5kIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZCkgPj0gMTgKICAgICAgYW5kICggZHVyYXRpb24gaW4gaG91cnMgb2YgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgPj0gNDggKQoKZGVmaW5lICJJbnBhdGllbnQgRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSI6CiAgZnJvbQogICAgIkVuY291bnRlciBXaXRoIEFnZSAxOCBBbmQgTGVuZ3RoIE9mIFN0YXkgNDggSG91cnMgT3IgTW9yZSIgRW5jb3VudGVyNDhIb3VycywKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3QKICAgIGxldCBIb3NwaXRhbGl6YXRpb25QZXJpb2Q6IEVuY291bnRlcjQ4SG91cnMuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSwKICAgIENyZWF0aW5pbmVUZXN0U3RhcnQ6IENyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkKICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGFzIFF1YW50aXR5IGlzIG5vdCBudWxsCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdFN0YXJ0IGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25QZXJpb2QgKyA0OCBob3VycywgZW5kIG9mIEhvc3BpdGFsaXphdGlvblBlcmlvZF0KICAgICAgYW5kIENyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgcmV0dXJuIEVuY291bnRlcjQ4SG91cnMKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIjoKICAiSW5wYXRpZW50IEVuY291bnRlciBXaXRoIENyZWF0aW5pbmUiIEVuY291bnRlcldpdGhDcmVhdGluaW5lCiAgICB3aGVyZSBub3QgKCBFbmNvdW50ZXJXaXRoQ3JlYXRpbmluZS5yZWFzb25Db2RlIGluICJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyIKICAgICAgICBvciBFbmNvdW50ZXJXaXRoQ3JlYXRpbmluZS5lbmNvdW50ZXJEaWFnbm9zaXMgKCApLmNvZGUgaW4gIk9ic3RldHJpY3MgYW5kIFZURSBPYnN0ZXRyaWNzIgogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBMZXNzIFRoYW4gMiBDcmVhdGluaW5lIFJlc3VsdHMgV2l0aGluIDQ4IEhvdXJzIE9mIEFycml2YWwiOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlICggQ291bnQoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmNyZWF0aW5pbmVMYWJUZXN0d2l0aFJlc3VsdHdpdGhpbkZpcnN0NDhIb3VycygpKSA8IDIgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBJbmRleCBlR0ZSIExlc3MgVGhhbiA2MCBXaXRoaW4gRmlyc3QgNDggSG91cnMiOgogICJNYWxlIEVuY291bnRlciBXaXRoIGVHRlIgTGVzcyBUaGFuIDYwIgogICAgdW5pb24gIkZlbWFsZSBFbmNvdW50ZXIgV2l0aCBlR0ZSIExlc3MgVGhhbiA2MCIKCmRlZmluZSAiRmVtYWxlIEVuY291bnRlciBXaXRoIGVHRlIgTGVzcyBUaGFuIDYwIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSAiUXVhbGlmeWluZ0VuY291bnRlciIuZmVtYWxlZUdGUiAoICkgaXMgbm90IG51bGwKICAgICAgYW5kICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5mZW1hbGVlR0ZSICggKSBhcyBEZWNpbWFsIDwgNjAKCmRlZmluZSAiTWFsZSBFbmNvdW50ZXIgV2l0aCBlR0ZSIExlc3MgVGhhbiA2MCI6CiAgIkVuY291bnRlciBXaXRoIENyZWF0aW5pbmUgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm1hbGVlR0ZSICggKSBpcyBub3QgbnVsbAogICAgICBhbmQgIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm1hbGVlR0ZSICggKSBhcyBEZWNpbWFsIDwgNjAKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggMC4zIG1nIGRMIE9yIE1vcmUgSW5jcmVhc2UgSW4gQ3JlYXRpbmluZSI6CiAgIkluY3JlYXNlIE9mIDAuMyBPciBNb3JlIFVzaW5nIExvd2VzdCBDcmVhdGluaW5lIFdpdGhpbiAyNCBIb3VycyIKICAgIHVuaW9uICJJbmNyZWFzZSBPZiAwLjMgT3IgTW9yZSBVc2luZyBGaXJzdCBDcmVhdGluaW5lIFdpdGhpbiBGaXJzdCA0OCBIb3VycyIKCmRlZmluZSAiSW5jcmVhc2UgT2YgMC4zIE9yIE1vcmUgVXNpbmcgTG93ZXN0IENyZWF0aW5pbmUgV2l0aGluIDI0IEhvdXJzIjoKICBmcm9tCiAgICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQsCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0CiAgICBsZXQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZTogSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWU6IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kICggKCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC52YWx1ZSBhcyBRdWFudGl0eSApIC0gKCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgKSApID4gMC4yOTkgJ21nL2RMJwogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlID0gIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCAoICkKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW1N1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSAtIDQ4IGhvdXJzLCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWVdCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMjQgaG91cnNdCiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kCiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzXQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJJbmNyZWFzZSBPZiAwLjMgT3IgTW9yZSBVc2luZyBGaXJzdCBDcmVhdGluaW5lIFdpdGhpbiBGaXJzdCA0OCBIb3VycyI6CiAgZnJvbQogICAgIkVuY291bnRlciBXaXRoIENyZWF0aW5pbmUgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LAogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdAogICAgbGV0IEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWU6IEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLAogICAgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lOiBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLAogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgd2hlcmUgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCAoICggU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgKSAtICggSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ICkgKSA+IDAuMjk5ICdtZy9kTCcKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC52YWx1ZSBhcyBRdWFudGl0eSA9IHNpbmdsZXRvbiBmcm9tICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5lYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCAoICkKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW1N1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSAtIDQ4IGhvdXJzLCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWVdCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCwgc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QgKyA0OCBob3Vyc10KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzXQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCA0OCBIb3VycyBPciBMZXNzIEFmdGVyIEFycml2YWwgV2l0aG91dCBIaWdoIENyZWF0aW5pbmUiOgogICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCA0OCBIb3VycyBPciBMZXNzIEFmdGVyIEFycml2YWwiIEVuY291bnRlcldpdGhLaWRuZXlEaWFseXNpczQ4SG91cnNPckFmdGVyCiAgICB3aGVyZSBub3QgKCBleGlzdHMgKCAiRW5jb3VudGVyIFdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUKICAgICAgICAgIHdoZXJlICggRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLnBlcmlvZCBpbmNsdWRlcyBFbmNvdW50ZXJXaXRoS2lkbmV5RGlhbHlzaXM0OEhvdXJzT3JBZnRlci5wZXJpb2QgKQogICAgICApCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEtpZG5leSBEaWFseXNpcyBTdGFydGVkIDQ4IEhvdXJzIE9yIExlc3MgQWZ0ZXIgQXJyaXZhbCI6CiAgZnJvbQogICAgWyJQcm9jZWR1cmUiOiAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiXSBEaWFseXNpcywKICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIGxldCBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSBEaWFseXNpcy5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdCiAgICAgIGFuZCBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIjoKICBmcm9tCiAgICAiRW5jb3VudGVyIFdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZSwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gSGlnaENyZWF0aW5pbmVUZXN0LAogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBMb3dDcmVhdGluaW5lVGVzdAogICAgbGV0IExvd0NyZWF0aW5pbmVUZXN0VGltZTogTG93Q3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwKICAgIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWU6IEhpZ2hDcmVhdGluaW5lVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLAogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZS5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSAoIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA+ICJTZXJ1bSBDcmVhdGluaW5lIE5vcm1hbCIgKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3QudmFsdWUgPSAiRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lIi5oaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0ICggKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3QudmFsdWUgPSAiRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lIi5sb3dlc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQgKCApCiAgICAgIGFuZCAoIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSBhcyBRdWFudGl0eSApID49ICggTG93Q3JlYXRpbmluZVRlc3QudmFsdWUgYXMgUXVhbnRpdHkgKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIDcgZGF5cyBvciBsZXNzIGJlZm9yZSBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lCiAgICAgIGFuZCBMb3dDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDMwIGRheXNdCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgcmV0dXJuIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZQoKZGVmaW5lICJTZXJ1bSBDcmVhdGluaW5lIE5vcm1hbCI6CiAgaWYgKCBQYXRpZW50LnNleCAoICkgPSAiRmVtYWxlIChmaW5kaW5nKSIuY29kZSApIHRoZW4gMS4wMiAnbWcvZEwnIAogICAgZWxzZSAxLjE4ICdtZy9kTCcKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggSGlnaCBSaXNrIERpYWdub3NpcyBGb3IgQUtJIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSAoIFF1YWxpZnlpbmdFbmNvdW50ZXIucmVhc29uQ29kZSBpbiAiSGlnaCBSaXNrIERpYWdub3NpcyBmb3IgQUtJIgogICAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuZW5jb3VudGVyRGlhZ25vc2lzICggKS5jb2RlIGluICJIaWdoIFJpc2sgRGlhZ25vc2lzIGZvciBBS0kiCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEhpZ2ggUmlzayBQcm9jZWR1cmVzIEZvciBBS0kiOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggWyJQcm9jZWR1cmUiOiAiSGlnaCBSaXNrIFByb2NlZHVyZXMgZm9yIEFLSSJdIEhpZ2hSaXNrUHJvY2VkdXJlcwogICAgICBzdWNoIHRoYXQgSGlnaFJpc2tQcm9jZWR1cmVzLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEhpZ2hSaXNrUHJvY2VkdXJlcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwgV2l0aG91dCBIaWdoIENyZWF0aW5pbmUiOgogICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCBNb3JlIFRoYW4gNDggSG91cnMgQWZ0ZXIgQXJyaXZhbCIgRW5jb3VudGVyV2l0aERpYWx5c2lzQWZ0ZXI0OEhvdXJzCiAgICB3aGVyZSBub3QgKCBleGlzdHMgKCAiRW5jb3VudGVyIFdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUKICAgICAgICAgIHdoZXJlICggRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLnBlcmlvZCBpbmNsdWRlcyBFbmNvdW50ZXJXaXRoRGlhbHlzaXNBZnRlcjQ4SG91cnMucGVyaW9kICkKICAgICAgKQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCBNb3JlIFRoYW4gNDggSG91cnMgQWZ0ZXIgQXJyaXZhbCI6CiAgZnJvbQogICAgWyJQcm9jZWR1cmUiOiAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiXSBEaWFseXNpcywKICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIGxldCBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzLCBlbmQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2RdCiAgICAgIGFuZCBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgICBhbmQgRGlhbHlzaXMuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IEJ5IFRpbWUiOgogIGZyb20KICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIENyZWF0aW5pbmVUZXN0QnlUaW1lCiAgICBsZXQgQ3JFbmNJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgIENySG9zcFBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgQ3JMYWJJZDogQ3JlYXRpbmluZVRlc3RCeVRpbWUuaWQsCiAgICBDclRpbWU6IENyZWF0aW5pbmVUZXN0QnlUaW1lLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBDclRpbWVJc3N1ZWQ6IENyZWF0aW5pbmVUZXN0QnlUaW1lLmlzc3VlZCwKICAgIENyUmVzdWx0OiBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBhcyBRdWFudGl0eSwKICAgIENyUmVzdWx0VmFsdWU6IENyUmVzdWx0LnZhbHVlLAogICAgQ3JSZXN1bHRVbml0OiBDclJlc3VsdC51bml0CiAgICB3aGVyZSBDclRpbWUgZHVyaW5nIENySG9zcFBlcmlvZAogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNMYWJvcmF0b3J5ICggKQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBDclJlc3VsdFVuaXQgPSAnbWcvZEwnCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUudmFsdWUgYXMgUXVhbnRpdHkgPiAwICdtZy9kTCcKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIENyRW5jSW5QdElkOiBDckVuY0lkLAogICAgICBDckhvc3BpdGFsaXphdGlvbjogQ3JIb3NwUGVyaW9kLAogICAgICBDckxhYk9ic0lkOiBDckxhYklkLAogICAgICBDckxhYk9ic0NhdGVnb3J5OiBpZiBDcmVhdGluaW5lVGVzdEJ5VGltZS5pc0xhYm9yYXRvcnkgKCApIHRoZW4gJ2xhYm9yYXRvcnknIAogICAgICAgIGVsc2UgQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNMYWJvcmF0b3J5ICggKSwKICAgICAgQ3JMYWJPYnNDYXRlZ29yeTogQ3JlYXRpbmluZVRlc3RCeVRpbWUuY2F0ZWdvcnksCiAgICAgIENyTGFiT2JzU3RhdHVzOiBDcmVhdGluaW5lVGVzdEJ5VGltZS5zdGF0dXMsCiAgICAgIENyTGFiUmVzdWx0OiBDclJlc3VsdCwKICAgICAgQ3JMYWJSZXN1bHRVbml0OiBDclJlc3VsdFVuaXQsCiAgICAgIENyTGFiUmVzdWx0VmFsdWU6IENyUmVzdWx0VmFsdWUsCiAgICAgIENyTGFiVGltZTogQ3JUaW1lLAogICAgICBDckxhYlRpbWVJc3N1ZWQ6IENyVGltZUlzc3VlZAogICAgfQogICAgc29ydCBieSBDckxhYlRpbWUKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiOgogIGZyb20KICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIEhpZ2hDcmVhdGluaW5lVGVzdCwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gTG93Q3JlYXRpbmluZVRlc3QKICAgIGxldCBMb3dDcmVhdGluaW5lVGVzdFRpbWU6IExvd0NyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lOiBIaWdoQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwKICAgIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKICAgIHdoZXJlICggSGlnaENyZWF0aW5pbmVUZXN0LnZhbHVlID4gIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIiApCiAgICAgIGFuZCBMb3dDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA9ICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5oaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0ICggKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3QudmFsdWUgPSAiUXVhbGlmeWluZ0VuY291bnRlciIubG93ZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0ICggKQogICAgICBhbmQgIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm9uZUFuZEFIYWxmSW5jcmVhc2VJbkNyZWF0aW5pbmUgKCApID49IExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlCiAgICAgIGFuZCBMb3dDcmVhdGluaW5lVGVzdFRpbWUgNyBkYXlzIG9yIGxlc3MgYmVmb3JlIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUKICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0VGltZSBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QKICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJRdWFsaWZ5aW5nIEJsb29kIFByZXNzdXJlIFJlYWRpbmciOgogIFsiVVNDb3JlLkJsb29kUHJlc3N1cmVQcm9maWxlIl0gQmxvb2RQcmVzc3VyZQogICAgd2hlcmUgQmxvb2RQcmVzc3VyZS5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImNyZWF0aW5pbmVMYWJUZXN0d2l0aFJlc3VsdHdpdGhpbkZpcnN0NDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGZyb20KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3QKICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGFzIFF1YW50aXR5IGlzIG5vdCBudWxsCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICksIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSArIDQ4IGhvdXJzXQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgIHJldHVybiBDcmVhdGluaW5lVGVzdAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmVtYWxlZUdGUiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGlmIFBhdGllbnQuc2V4ICgpID0gIkZlbWFsZSAoZmluZGluZykiLmNvZGUgdGhlbiAoIDE0MiAqIE1pbih7KCJRdWFsaWZ5aW5nRW5jb3VudGVyIi5pbmRleENyZWF0aW5pbmUoKS52YWx1ZSAvIDAuNyksIDEgfSkgXiAoIC0gMC4yNDEgKSAqIE1heCh7KCJRdWFsaWZ5aW5nRW5jb3VudGVyIi5pbmRleENyZWF0aW5pbmUoKS52YWx1ZSAvIDAuNyksIDEgfSkgXiAoIC0gMS4yMDAgKSAqIDAuOTkzOCBeICggQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpKSApICogMS4wMTIgKSAKICAgIGVsc2UgbnVsbAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAibWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiBQYXRpZW50LnNleCAoKSA9ICJNYWxlIChmaW5kaW5nKSIuY29kZSB0aGVuICggMTQyICogTWluKHsoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmluZGV4Q3JlYXRpbmluZSgpLnZhbHVlIC8gMC45KSwgMSB9KSBeICggLSAwLjMwMiApICogTWF4KHsoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmluZGV4Q3JlYXRpbmluZSgpLnZhbHVlIC8gMC45KSwgMSB9KSBeICggLSAxLjIwMCApICogMC45OTM4IF4gKCBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkpICkgKSAKICAgIGVsc2UgbnVsbAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiaW5kZXhDcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgQ29hbGVzY2UoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmxvd2VzdFNlcnVtQ3JlYXRpbmluZUluMjRIb3VycygpLCBzaW5nbGV0b24gZnJvbSAiUXVhbGlmeWluZ0VuY291bnRlciIuZmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMoKSkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImxvd2VzdFNlcnVtQ3JlYXRpbmluZUluMjRIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIE1pbigoZnJvbQogICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBCeSBUaW1lIiBMYWJUZXN0c0xvdwogICAgICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzTG93LkNyTGFiUmVzdWx0CiAgICAgICAgd2hlcmUgTGFiVGVzdHNMb3cuQ3JFbmNJblB0SWQgPSBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkCiAgICAgICAgICBhbmQgTGFiVGVzdHNMb3cuQ3JMYWJUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpLCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpICsgMjQgaG91cnNdCiAgICApLkNyTGFiUmVzdWx0CiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBmcm9tCiAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHMKICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0CiAgICB3aGVyZSAoICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5lYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVRpbWVJbjQ4SG91cnMgKCApID0gTGFiVGVzdHMuQ3JMYWJUaW1lICkKICAgIHJldHVybiBMYWJSZXN1bHQgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImVhcmxpZXN0U2VydW1DcmVhdGluaW5lVGltZUluNDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogICggTWluKChmcm9tCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHM0OAogICAgICAgICAgbGV0IExhYlJlc3VsdDQ4OiBMYWJUZXN0czQ4LkNyTGFiUmVzdWx0CiAgICAgICAgICB3aGVyZSBMYWJUZXN0czQ4LkNyRW5jSW5QdElkID0gUXVhbGlmeWluZ0VuY291bnRlci5pZAogICAgICAgICAgICBhbmQgTGFiVGVzdHM0OC5DckxhYlRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCksIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkgKyA0OCBob3Vyc10KICAgICAgKS5DckxhYlRpbWUKICAgICkKICApCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uICJlYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGZyb20KICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBCeSBUaW1lIiBMYWJUZXN0cwogICAgbGV0IExhYlJlc3VsdDogTGFiVGVzdHMuQ3JMYWJSZXN1bHQKICAgIHdoZXJlICggIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmVhcmxpZXN0U2VydW1DcmVhdGluaW5lVGltZSAoICkgPSBMYWJUZXN0cy5DckxhYlRpbWUgKQogICAgcmV0dXJuIExhYlJlc3VsdCBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZWFybGllc3RTZXJ1bUNyZWF0aW5pbmVUaW1lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgKCBNaW4oKGZyb20KICAgICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBCeSBUaW1lIiBMYWJUZXN0c0Vhcmx5CiAgICAgICAgICBsZXQgTGFiUmVzdWx0RWFybHk6IExhYlRlc3RzRWFybHkuQ3JMYWJSZXN1bHQKICAgICAgICAgIHdoZXJlIExhYlRlc3RzRWFybHkuQ3JFbmNJblB0SWQgPSBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkCiAgICAgICkuQ3JMYWJUaW1lCiAgICApCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiaGlnaGVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogICggTWF4KChmcm9tCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHMKICAgICAgICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0CiAgICAgICAgICB3aGVyZSBMYWJUZXN0cy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQKICAgICAgKS5DckxhYlJlc3VsdAogICAgKQogICkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gIm9uZUFuZEFIYWxmSW5jcmVhc2VJbkNyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICAiUXVhbGlmeWluZ0VuY291bnRlciIuaGlnaGVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCAoICkgLyAxLjUKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogICggTWluKChmcm9tCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHMKICAgICAgICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0CiAgICAgICAgICB3aGVyZSBMYWJUZXN0cy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQKICAgICAgKS5DckxhYlJlc3VsdAogICAgKQogICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgRm9yIEZlbWFsZXMiOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBlR0ZSOiAiUXVhbGlmeWluZ0VuY291bnRlciIuZmVtYWxlZUdGUiAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgRm9yIE1hbGVzIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZUdGUjogIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm1hbGVlR0ZSICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEFsbCBFbmNvdW50ZXIgRGlhZ25vc2VzIFdpdGggUE9BIEluZGljYXRpb24iOgogIGZyb20KICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbQ2xhaW1dIGNsbQogICAgd2hlcmUgY2xtLnN0YXR1cyA9ICdhY3RpdmUnCiAgICAgIGFuZCBjbG0udXNlID0gJ2NsYWltJwogICAgICBhbmQgZXhpc3RzICggY2xtLml0ZW0gQ2xhaW1JdGVtCiAgICAgICAgICB3aGVyZSBDbGFpbUl0ZW0uZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBRdWFsaWZ5aW5nRW5jb3VudGVyICkKICAgICAgICAgICAgYW5kIGV4aXN0cyAoIGNsbS5kaWFnbm9zaXMgRHgKICAgICAgICAgICAgICAgIHdoZXJlIER4LnNlcXVlbmNlIGluIGNsbS5pdGVtLmRpYWdub3Npc1NlcXVlbmNlCiAgICAgICAgICAgICAgICAgIGFuZCBEeC5vbkFkbWlzc2lvbiBpbiAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiCiAgICAgICAgICAgICkKICAgICAgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEhlYXJ0IFJhdGUgSW4gRW5jb3VudGVyIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RIZWFydFJhdGU6ICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5maXJzdEhlYXJ0UmF0ZSAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBSZXNwaXJhdG9yeSBSYXRlIEluIEVuY291bnRlciI6CiAgIkVuY291bnRlciBXaXRoIENyZWF0aW5pbmUgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0UmVzcGlyYXRvcnlSYXRlOiAiUXVhbGlmeWluZ0VuY291bnRlciIuZmlyc3RSZXNwaXJhdG9yeVJhdGUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgU3lzdG9saWMgQmxvb2QgUHJlc3N1cmUgSW4gRW5jb3VudGVyIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RTeXN0b2xpY0JQOiAiUXVhbGlmeWluZ0VuY291bnRlciIuZmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgVGVtcGVyYXR1cmUgSW4gRW5jb3VudGVyIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RUZW1wZXJhdHVyZTogIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmZpcnN0Qm9keVRlbXBlcmF0dXJlICggKQogICAgfQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmlyc3RCb2R5VGVtcGVyYXR1cmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbIlVTQ29yZS5Cb2R5VGVtcGVyYXR1cmVQcm9maWxlIl0gRmlyc3RUZW1wZXJhdHVyZQogICAgICB3aGVyZSBGaXJzdFRlbXBlcmF0dXJlLmVmZmVjdGl2ZS5lYXJsaWVzdCgpIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpCiAgICAgICAgYW5kIEZpcnN0VGVtcGVyYXR1cmUudmFsdWUgaXMgbm90IG51bGwKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImZpcnN0SGVhcnRSYXRlIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoWyJVU0NvcmUuSGVhcnRSYXRlUHJvZmlsZSJdIEZpcnN0SGVhcnRCZWF0cwogICAgICB3aGVyZSBGaXJzdEhlYXJ0QmVhdHMuZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkKICAgICAgICBhbmQgRmlyc3RIZWFydEJlYXRzLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uICJmaXJzdFJlc3BpcmF0b3J5UmF0ZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFsiVVNDb3JlLlJlc3BpcmF0b3J5UmF0ZVByb2ZpbGUiXSBGaXJzdFJlc3BpcmF0aW9uCiAgICAgIHdoZXJlIEZpcnN0UmVzcGlyYXRpb24uZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkKICAgICAgICBhbmQgRmlyc3RSZXNwaXJhdGlvbi52YWx1ZSBpcyBub3QgbnVsbAogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdCgiUXVhbGlmeWluZyBCbG9vZCBQcmVzc3VyZSBSZWFkaW5nIiBTQlBSZWFkaW5nCiAgICAgIHdoZXJlIFNCUFJlYWRpbmcuZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkKICAgICAgcmV0dXJuIHNpbmdsZXRvbiBmcm9tKFNCUFJlYWRpbmcuY29tcG9uZW50IFNCUENvbXBvbmVudAogICAgICAgICAgd2hlcmUgU0JQQ29tcG9uZW50LmNvZGUgfiAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUiCiAgICAgICAgICByZXR1cm4gU0JQQ29tcG9uZW50LnZhbHVlIGFzIFF1YW50aXR5CiAgICAgICkKICAp"/>
    <url value="https://madie.cms.gov/Library-CMS832FHIRHHAKI.cql"/>
  </content>
</Library>