{
  "resourceType" : "Library",
  "id" : "CMS832FHIRHHAKI",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n  <table class=\"narrative-table\">\n    <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"metadata\"> </a>Metadata</th>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n\n<td class=\"content-container\">1.1.000</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Status</th>\n\n\n\n<td class=\"content-container\">Draft</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n\n<td class=\"content-container\">\n    <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library\n\n\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"parameters\"> </a>Parameters</th>\n\n\n</tr>\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Parameter</th>\n\n\n\n<td class=\"content-container\">None</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n  <tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Library Content</th>\n\n\n</tr>\n  \n    \n    <tr>\n      <th scope=\"row\" class=\"row-header\">CQL Content</th>\n      <td>\n        <a name=\"cql-content\"> </a>\n        <pre style=\"border: none;\" class=\"content-container highlight language-cql\"><code class=\"language-cql\">/*\nNOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.\n*/\nlibrary CMS832FHIRHHAKI version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude CQMCommon version '5.1.000' called CQMCommon\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\n\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\n\nvalueset &quot;Body temperature&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.152'\nvalueset &quot;Creatinine Mass Per Volume&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.21'\nvalueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\nvalueset &quot;Glomerular Filtration Rate&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.17.4077.2.2038'\nvalueset &quot;High Risk Diagnosis for AKI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.12'\nvalueset &quot;High Risk Procedures for AKI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.19'\nvalueset &quot;Hospital Based Dialysis Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.199'\nvalueset &quot;Obstetrics and VTE Obstetrics&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.33'\nvalueset &quot;Present on Admission or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'\n\ncode &quot;Female (finding)&quot;: '248152002' from &quot;SNOMEDCT&quot; display 'Female'\ncode &quot;Male (finding)&quot;: '248153007' from &quot;SNOMEDCT&quot; display 'Male'\ncode &quot;Heart rate&quot;: '8867-4' from &quot;LOINC&quot; display 'Heart rate'\ncode &quot;Respiratory rate&quot;: '9279-1' from &quot;LOINC&quot; display 'Respiratory rate'\ncode &quot;Systolic blood pressure&quot;: '8480-6' from &quot;LOINC&quot; display 'Systolic blood pressure'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\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\ndefine &quot;Initial Population&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot;\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusion&quot;:\n  &quot;Encounter With Less Than 2 Creatinine Results Within 48 Hours Of Arrival&quot;\n    union &quot;Encounter With Index eGFR Less Than 60 Within First 48 Hours&quot;\n    union &quot;Encounter With 0.3 mg dL Or More Increase In Creatinine&quot;\n    union &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival Without High Creatinine&quot;\n    union &quot;Encounter With High Risk Diagnosis For AKI&quot;\n    union &quot;Encounter With High Risk Procedures For AKI&quot;\n\ndefine &quot;Numerator&quot;:\n  &quot;Encounter With 2 Times Serum Creatinine Increase&quot;\n    union &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival Without High Creatinine&quot;\n\ndefine &quot;Encounter With Age 18 And Length Of Stay 48 Hours Or More&quot;:\n  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter\n    where Patient.sex ( ) in { &quot;Male (finding)&quot;.code, &quot;Female (finding)&quot;.code }\n      and InpatientEncounter.period ends during day of &quot;Measurement Period&quot;\n      and InpatientEncounter.status = 'finished'\n      and AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18\n      and ( duration in hours of InpatientEncounter.hospitalizationWithObservation ( ) &gt;= 48 )\n\ndefine &quot;Inpatient Encounter With Creatinine&quot;:\n  from\n    &quot;Encounter With Age 18 And Length Of Stay 48 Hours Or More&quot; Encounter48Hours,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest\n    let HospitalizationPeriod: Encounter48Hours.hospitalizationWithObservation ( ),\n    CreatinineTestStart: CreatinineTest.effective.earliest ( )\n    where CreatinineTest.value as Quantity is not null\n      and CreatinineTestStart during Interval[start of HospitalizationPeriod + 48 hours, end of HospitalizationPeriod]\n      and CreatinineTest.status in { 'final', 'amended', 'corrected' }\n    return Encounter48Hours\n\ndefine &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot;:\n  &quot;Inpatient Encounter With Creatinine&quot; EncounterWithCreatinine\n    where not ( EncounterWithCreatinine.reasonCode in &quot;Obstetrics and VTE Obstetrics&quot;\n        or EncounterWithCreatinine.encounterDiagnosis ( ).code in &quot;Obstetrics and VTE Obstetrics&quot;\n    )\n\ndefine &quot;Encounter With Less Than 2 Creatinine Results Within 48 Hours Of Arrival&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    where ( Count(&quot;QualifyingEncounter&quot;.creatinineLabTestwithResultwithinFirst48Hours()) &lt; 2 )\n\ndefine &quot;Encounter With Index eGFR Less Than 60 Within First 48 Hours&quot;:\n  &quot;Male Encounter With eGFR Less Than 60&quot;\n    union &quot;Female Encounter With eGFR Less Than 60&quot;\n\ndefine &quot;Female Encounter With eGFR Less Than 60&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    where &quot;QualifyingEncounter&quot;.femaleeGFR ( ) is not null\n      and &quot;QualifyingEncounter&quot;.femaleeGFR ( ) as Decimal &lt; 60\n\ndefine &quot;Male Encounter With eGFR Less Than 60&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    where &quot;QualifyingEncounter&quot;.maleeGFR ( ) is not null\n      and &quot;QualifyingEncounter&quot;.maleeGFR ( ) as Decimal &lt; 60\n\ndefine &quot;Encounter With 0.3 mg dL Or More Increase In Creatinine&quot;:\n  &quot;Increase Of 0.3 Or More Using Lowest Creatinine Within 24 Hours&quot;\n    union &quot;Increase Of 0.3 Or More Using First Creatinine Within First 48 Hours&quot;\n\ndefine &quot;Increase Of 0.3 Or More Using Lowest Creatinine Within 24 Hours&quot;:\n  from\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] IndexCreatinineLabResult,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] SubsequentCreatinineLabResult\n    let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),\n    SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\n    where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\n      and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\n      and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) &gt; 0.299 'mg/dL'\n      and IndexCreatinineLabResult.value = &quot;QualifyingEncounter&quot;.lowestSerumCreatinineResult ( )\n      and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]\n      and IndexCreatinineLabResultTime during HospitalWithObservationPeriod\n      and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 24 hours]\n      and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod\n      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\n      and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id\n    return QualifyingEncounter\n\ndefine &quot;Increase Of 0.3 Or More Using First Creatinine Within First 48 Hours&quot;:\n  from\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] IndexCreatinineLabResult,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] SubsequentCreatinineLabResult\n    let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),\n    SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\n    where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\n      and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\n      and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) &gt; 0.299 'mg/dL'\n      and IndexCreatinineLabResult.value as Quantity = singleton from &quot;QualifyingEncounter&quot;.earliestSerumCreatinineResult ( )\n      and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]\n      and IndexCreatinineLabResultTime during HospitalWithObservationPeriod\n      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\n      and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod\n      and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\n      and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id\n    return QualifyingEncounter\n\ndefine &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival Without High Creatinine&quot;:\n  &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival&quot; EncounterWithKidneyDialysis48HoursOrAfter\n    where not ( exists ( &quot;Encounter With 2 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine\n          where ( EncounterWithHighCreatinine.period includes EncounterWithKidneyDialysis48HoursOrAfter.period )\n      )\n    )\n\ndefine &quot;Encounter With Kidney Dialysis Started 48 Hours Or Less After Arrival&quot;:\n  from\n    [&quot;Procedure&quot;: &quot;Hospital Based Dialysis Services&quot;] Dialysis,\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\n    where Dialysis.status = 'completed'\n      and Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\n      and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod\n    return QualifyingEncounter\n\ndefine &quot;Encounter With 2 Times Serum Creatinine Increase&quot;:\n  from\n    &quot;Encounter With 1.5 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] HighCreatinineTest,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] LowCreatinineTest\n    let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),\n    HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),\n    HospitalWithObservationPeriod: EncounterWithHighCreatinine.hospitalizationWithObservation ( )\n    where ( HighCreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot; )\n      and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }\n      and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }\n      and HighCreatinineTest.value = &quot;EncounterWithHighCreatinine&quot;.highestSerumCreatinineResult ( )\n      and LowCreatinineTest.value = &quot;EncounterWithHighCreatinine&quot;.lowestSerumCreatinineResult ( )\n      and ( HighCreatinineTest.value as Quantity ) &gt;= ( LowCreatinineTest.value as Quantity )\n      and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime\n      and LowCreatinineTestTime during HospitalWithObservationPeriod\n      and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]\n      and HighCreatinineTestTime during HospitalWithObservationPeriod\n    return EncounterWithHighCreatinine\n\ndefine &quot;Serum Creatinine Normal&quot;:\n  if ( Patient.sex ( ) = &quot;Female (finding)&quot;.code ) then 1.02 'mg/dL' \n    else 1.18 'mg/dL'\n\ndefine &quot;Encounter With High Risk Diagnosis For AKI&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    where ( QualifyingEncounter.reasonCode in &quot;High Risk Diagnosis for AKI&quot;\n        or QualifyingEncounter.encounterDiagnosis ( ).code in &quot;High Risk Diagnosis for AKI&quot;\n    )\n\ndefine &quot;Encounter With High Risk Procedures For AKI&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    with [&quot;Procedure&quot;: &quot;High Risk Procedures for AKI&quot;] HighRiskProcedures\n      such that HighRiskProcedures.status = 'completed'\n        and HighRiskProcedures.performed.toInterval ( ) starts during QualifyingEncounter.hospitalizationWithObservation ( )\n\ndefine &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival Without High Creatinine&quot;:\n  &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival&quot; EncounterWithDialysisAfter48Hours\n    where not ( exists ( &quot;Encounter With 2 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine\n          where ( EncounterWithHighCreatinine.period includes EncounterWithDialysisAfter48Hours.period )\n      )\n    )\n\ndefine &quot;Encounter With Kidney Dialysis Started More Than 48 Hours After Arrival&quot;:\n  from\n    [&quot;Procedure&quot;: &quot;Hospital Based Dialysis Services&quot;] Dialysis,\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\n    where Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod + 48 hours, end of HospitalWithObservationPeriod]\n      and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod\n      and Dialysis.status = 'completed'\n    return QualifyingEncounter\n\ndefine &quot;Qualifying Creatinine Lab Result By Time&quot;:\n  from\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTestByTime\n    let CrEncId: QualifyingEncounter.id,\n    CrHospPeriod: QualifyingEncounter.hospitalizationWithObservation ( ),\n    CrLabId: CreatinineTestByTime.id,\n    CrTime: CreatinineTestByTime.effective.earliest ( ),\n    CrTimeIssued: CreatinineTestByTime.issued,\n    CrResult: CreatinineTestByTime.value as Quantity,\n    CrResultValue: CrResult.value,\n    CrResultUnit: CrResult.unit\n    where CrTime during CrHospPeriod\n      and CreatinineTestByTime.isLaboratory ( )\n      and CreatinineTestByTime.status in { 'final', 'amended', 'corrected' }\n      and CrResultUnit = 'mg/dL'\n      and CreatinineTestByTime.value is not null\n      and CreatinineTestByTime.value as Quantity &gt; 0 'mg/dL'\n    return Tuple {\n      CrEncInPtId: CrEncId,\n      CrHospitalization: CrHospPeriod,\n      CrLabObsId: CrLabId,\n      CrLabObsCategory: if CreatinineTestByTime.isLaboratory ( ) then 'laboratory' \n        else CreatinineTestByTime.isLaboratory ( ),\n      CrLabObsCategory: CreatinineTestByTime.category,\n      CrLabObsStatus: CreatinineTestByTime.status,\n      CrLabResult: CrResult,\n      CrLabResultUnit: CrResultUnit,\n      CrLabResultValue: CrResultValue,\n      CrLabTime: CrTime,\n      CrLabTimeIssued: CrTimeIssued\n    }\n    sort by CrLabTime\n\ndefine &quot;Encounter With 1.5 Times Serum Creatinine Increase&quot;:\n  from\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] HighCreatinineTest,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] LowCreatinineTest\n    let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),\n    HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\n    where ( HighCreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot; )\n      and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }\n      and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }\n      and HighCreatinineTest.value = &quot;QualifyingEncounter&quot;.highestSerumCreatinineResult ( )\n      and LowCreatinineTest.value = &quot;QualifyingEncounter&quot;.lowestSerumCreatinineResult ( )\n      and &quot;QualifyingEncounter&quot;.oneAndAHalfIncreaseInCreatinine ( ) &gt;= LowCreatinineTest.value\n      and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime\n      and LowCreatinineTestTime during HospitalWithObservationPeriod\n      and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]\n      and HighCreatinineTestTime during HospitalWithObservationPeriod\n    return QualifyingEncounter\n\ndefine &quot;Qualifying Blood Pressure Reading&quot;:\n  [&quot;USCore.BloodPressureProfile&quot;] BloodPressure\n    where BloodPressure.effective.earliest ( ) during day of &quot;Measurement Period&quot;\n\ndefine fluent function &quot;creatinineLabTestwithResultwithinFirst48Hours&quot;(QualifyingEncounter Encounter):\n  from\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest\n    where CreatinineTest.value as Quantity is not null\n      and CreatinineTest.effective.earliest ( ) during Interval[start of QualifyingEncounter.hospitalizationWithObservation ( ), start of QualifyingEncounter.hospitalizationWithObservation ( ) + 48 hours]\n      and CreatinineTest.effective.earliest ( ) during QualifyingEncounter.hospitalizationWithObservation ( )\n      and CreatinineTest.status in { 'final', 'amended', 'corrected' }\n    return CreatinineTest\n\ndefine fluent function &quot;femaleeGFR&quot;(QualifyingEncounter Encounter):\n  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 ) \n    else null\n\ndefine fluent function &quot;maleeGFR&quot;(QualifyingEncounter Encounter):\n  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()) ) ) \n    else null\n\ndefine fluent function &quot;indexCreatinine&quot;(QualifyingEncounter Encounter):\n  Coalesce(&quot;QualifyingEncounter&quot;.lowestSerumCreatinineIn24Hours(), singleton from &quot;QualifyingEncounter&quot;.firstSerumCreatinineIn48Hours())\n\ndefine fluent function &quot;lowestSerumCreatinineIn24Hours&quot;(QualifyingEncounter Encounter):\n  Min((from\n        &quot;Qualifying Creatinine Lab Result By Time&quot; LabTestsLow\n        let LabResult: LabTestsLow.CrLabResult\n        where LabTestsLow.CrEncInPtId = QualifyingEncounter.id\n          and LabTestsLow.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 24 hours]\n    ).CrLabResult\n  )\n\ndefine fluent function &quot;firstSerumCreatinineIn48Hours&quot;(QualifyingEncounter Encounter):\n  from\n    &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests\n    let LabResult: LabTests.CrLabResult\n    where ( &quot;QualifyingEncounter&quot;.earliestSerumCreatinineTimeIn48Hours ( ) = LabTests.CrLabTime )\n    return LabResult as Quantity\n\ndefine fluent function &quot;earliestSerumCreatinineTimeIn48Hours&quot;(QualifyingEncounter Encounter):\n  ( Min((from\n          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests48\n          let LabResult48: LabTests48.CrLabResult\n          where LabTests48.CrEncInPtId = QualifyingEncounter.id\n            and LabTests48.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 48 hours]\n      ).CrLabTime\n    )\n  )\n\ndefine fluent function &quot;earliestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):\n  from\n    &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests\n    let LabResult: LabTests.CrLabResult\n    where ( &quot;QualifyingEncounter&quot;.earliestSerumCreatinineTime ( ) = LabTests.CrLabTime )\n    return LabResult as Quantity\n\ndefine fluent function &quot;earliestSerumCreatinineTime&quot;(QualifyingEncounter Encounter):\n  ( Min((from\n          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTestsEarly\n          let LabResultEarly: LabTestsEarly.CrLabResult\n          where LabTestsEarly.CrEncInPtId = QualifyingEncounter.id\n      ).CrLabTime\n    )\n  )\n\ndefine fluent function &quot;highestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):\n  ( Max((from\n          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests\n          let LabResult: LabTests.CrLabResult\n          where LabTests.CrEncInPtId = QualifyingEncounter.id\n      ).CrLabResult\n    )\n  )\n\ndefine fluent function &quot;oneAndAHalfIncreaseInCreatinine&quot;(QualifyingEncounter Encounter):\n  &quot;QualifyingEncounter&quot;.highestSerumCreatinineResult ( ) / 1.5\n\ndefine fluent function &quot;lowestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):\n  ( Min((from\n          &quot;Qualifying Creatinine Lab Result By Time&quot; LabTests\n          let LabResult: LabTests.CrLabResult\n          where LabTests.CrEncInPtId = QualifyingEncounter.id\n      ).CrLabResult\n    )\n  )\n\ndefine &quot;Risk Variable Estimated Glomerular Filtration Rate For Females&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      eGFR: &quot;QualifyingEncounter&quot;.femaleeGFR ( )\n    }\n\ndefine &quot;Risk Variable Estimated Glomerular Filtration Rate For Males&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      eGFR: &quot;QualifyingEncounter&quot;.maleeGFR ( )\n    }\n\ndefine &quot;Risk Variable All Encounter Diagnoses With POA Indication&quot;:\n  from\n    &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter,\n    [Claim] clm\n    where clm.status = 'active'\n      and clm.use = 'claim'\n      and exists ( clm.item ClaimItem\n          where ClaimItem.encounter.references ( QualifyingEncounter )\n            and exists ( clm.diagnosis Dx\n                where Dx.sequence in clm.item.diagnosisSequence\n                  and Dx.onAdmission in &quot;Present on Admission or Clinically Undetermined&quot;\n            )\n      )\n\ndefine &quot;Risk Variable First Heart Rate In Encounter&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstHeartRate: &quot;QualifyingEncounter&quot;.firstHeartRate ( )\n    }\n\ndefine &quot;Risk Variable First Respiratory Rate In Encounter&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstRespiratoryRate: &quot;QualifyingEncounter&quot;.firstRespiratoryRate ( )\n    }\n\ndefine &quot;Risk Variable First Systolic Blood Pressure In Encounter&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstSystolicBP: &quot;QualifyingEncounter&quot;.firstSystolicBloodPressure ( )\n    }\n\ndefine &quot;Risk Variable First Temperature In Encounter&quot;:\n  &quot;Encounter With Creatinine And Without Obstetrical Conditions&quot; QualifyingEncounter\n    return Tuple {\n      encounterId: QualifyingEncounter.id,\n      firstTemperature: &quot;QualifyingEncounter&quot;.firstBodyTemperature ( )\n    }\n\ndefine fluent function &quot;firstBodyTemperature&quot;(QualifyingEncounter Encounter):\n  First([&quot;USCore.BodyTemperatureProfile&quot;] FirstTemperature\n      where FirstTemperature.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstTemperature.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function &quot;firstHeartRate&quot;(QualifyingEncounter Encounter):\n  First([&quot;USCore.HeartRateProfile&quot;] FirstHeartBeats\n      where FirstHeartBeats.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstHeartBeats.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function &quot;firstRespiratoryRate&quot;(QualifyingEncounter Encounter):\n  First([&quot;USCore.RespiratoryRateProfile&quot;] FirstRespiration\n      where FirstRespiration.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n        and FirstRespiration.value is not null\n      sort by effective.earliest()\n  ).value as Quantity\n\ndefine fluent function &quot;firstSystolicBloodPressure&quot;(QualifyingEncounter Encounter):\n  First(&quot;Qualifying Blood Pressure Reading&quot; SBPReading\n      where SBPReading.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\n      return singleton from(SBPReading.component SBPComponent\n          where SBPComponent.code ~ &quot;Systolic blood pressure&quot;\n          return SBPComponent.value as Quantity\n      )\n  )</code></pre>\n      </td>\n    </tr>\n    \n  \n\n\n\n<tr>\n  <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>\n</tr>\n\n    </tbody>\n  </table>\n</div>"
  },
  "extension" : [{
    "url" : "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem",
    "valueReference" : {
      "reference" : "Device/cqf-tooling"
    }
  }],
  "url" : "https://madie.cms.gov/Library/CMS832FHIRHHAKI",
  "version" : "1.1.000",
  "name" : "CMS832FHIRHHAKI",
  "status" : "draft",
  "type" : {
    "coding" : [{
      "system" : "http://terminology.hl7.org/CodeSystem/library-type",
      "code" : "logic-library"
    }]
  },
  "date" : "2026-09-19T16:31:14+00:00",
  "content" : [{
    "contentType" : "text/cql",
    "data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM4MzJGSElSSEhBS0kgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgQ1FNQ29tbW9uIHZlcnNpb24gJzUuMS4wMDAnIGNhbGxlZCBDUU1Db21tb24KaW5jbHVkZSBVU1F1YWxpdHlDb3JlQ29tbW9uIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnIGNhbGxlZCBVU1F1YWxpdHlDb3JlQ29tbW9uCmluY2x1ZGUgU3VwcGxlbWVudGFsRGF0YUVsZW1lbnRzIHZlcnNpb24gJzYuMS4wMDAnIGNhbGxlZCBTREUKaW5jbHVkZSBTdGF0dXMgdmVyc2lvbiAnMi4xLjAwMCcgY2FsbGVkIFN0YXR1cwoKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKCnZhbHVlc2V0ICJCb2R5IHRlbXBlcmF0dXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4xNTInCnZhbHVlc2V0ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMjEnCnZhbHVlc2V0ICJFbmNvdW50ZXIgSW5wYXRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjY2Ni41LjMwNycKdmFsdWVzZXQgIkdsb21lcnVsYXIgRmlsdHJhdGlvbiBSYXRlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4xNy40MDc3LjIuMjAzOCcKdmFsdWVzZXQgIkhpZ2ggUmlzayBEaWFnbm9zaXMgZm9yIEFLSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTInCnZhbHVlc2V0ICJIaWdoIFJpc2sgUHJvY2VkdXJlcyBmb3IgQUtJIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xOScKdmFsdWVzZXQgIkhvc3BpdGFsIEJhc2VkIERpYWx5c2lzIFNlcnZpY2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xOTknCnZhbHVlc2V0ICJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMzMnCnZhbHVlc2V0ICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk3JwoKY29kZSAiRmVtYWxlIChmaW5kaW5nKSI6ICcyNDgxNTIwMDInIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdGZW1hbGUnCmNvZGUgIk1hbGUgKGZpbmRpbmcpIjogJzI0ODE1MzAwNycgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ01hbGUnCmNvZGUgIkhlYXJ0IHJhdGUiOiAnODg2Ny00JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnSGVhcnQgcmF0ZScKY29kZSAiUmVzcGlyYXRvcnkgcmF0ZSI6ICc5Mjc5LTEnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdSZXNwaXJhdG9yeSByYXRlJwpjb2RlICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSI6ICc4NDgwLTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdTeXN0b2xpYyBibG9vZCBwcmVzc3VyZScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb24iOgogICJFbmNvdW50ZXIgV2l0aCBMZXNzIFRoYW4gMiBDcmVhdGluaW5lIFJlc3VsdHMgV2l0aGluIDQ4IEhvdXJzIE9mIEFycml2YWwiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggSW5kZXggZUdGUiBMZXNzIFRoYW4gNjAgV2l0aGluIEZpcnN0IDQ4IEhvdXJzIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIDAuMyBtZyBkTCBPciBNb3JlIEluY3JlYXNlIEluIENyZWF0aW5pbmUiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgNDggSG91cnMgT3IgTGVzcyBBZnRlciBBcnJpdmFsIFdpdGhvdXQgSGlnaCBDcmVhdGluaW5lIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEhpZ2ggUmlzayBEaWFnbm9zaXMgRm9yIEFLSSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBIaWdoIFJpc2sgUHJvY2VkdXJlcyBGb3IgQUtJIgoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJFbmNvdW50ZXIgV2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwgV2l0aG91dCBIaWdoIENyZWF0aW5pbmUiCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEFnZSAxOCBBbmQgTGVuZ3RoIE9mIFN0YXkgNDggSG91cnMgT3IgTW9yZSI6CiAgWyJFbmNvdW50ZXIiOiAiRW5jb3VudGVyIElucGF0aWVudCJdIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgUGF0aWVudC5zZXggKCApIGluIHsgIk1hbGUgKGZpbmRpbmcpIi5jb2RlLCAiRmVtYWxlIChmaW5kaW5nKSIuY29kZSB9CiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgYW5kIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZCkgPj0gMTgKICAgICAgYW5kICggZHVyYXRpb24gaW4gaG91cnMgb2YgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgPj0gNDggKQoKZGVmaW5lICJJbnBhdGllbnQgRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSI6CiAgZnJvbQogICAgIkVuY291bnRlciBXaXRoIEFnZSAxOCBBbmQgTGVuZ3RoIE9mIFN0YXkgNDggSG91cnMgT3IgTW9yZSIgRW5jb3VudGVyNDhIb3VycywKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3QKICAgIGxldCBIb3NwaXRhbGl6YXRpb25QZXJpb2Q6IEVuY291bnRlcjQ4SG91cnMuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSwKICAgIENyZWF0aW5pbmVUZXN0U3RhcnQ6IENyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkKICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGFzIFF1YW50aXR5IGlzIG5vdCBudWxsCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdFN0YXJ0IGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25QZXJpb2QgKyA0OCBob3VycywgZW5kIG9mIEhvc3BpdGFsaXphdGlvblBlcmlvZF0KICAgICAgYW5kIENyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgcmV0dXJuIEVuY291bnRlcjQ4SG91cnMKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIjoKICAiSW5wYXRpZW50IEVuY291bnRlciBXaXRoIENyZWF0aW5pbmUiIEVuY291bnRlcldpdGhDcmVhdGluaW5lCiAgICB3aGVyZSBub3QgKCBFbmNvdW50ZXJXaXRoQ3JlYXRpbmluZS5yZWFzb25Db2RlIGluICJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyIKICAgICAgICBvciBFbmNvdW50ZXJXaXRoQ3JlYXRpbmluZS5lbmNvdW50ZXJEaWFnbm9zaXMgKCApLmNvZGUgaW4gIk9ic3RldHJpY3MgYW5kIFZURSBPYnN0ZXRyaWNzIgogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBMZXNzIFRoYW4gMiBDcmVhdGluaW5lIFJlc3VsdHMgV2l0aGluIDQ4IEhvdXJzIE9mIEFycml2YWwiOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlICggQ291bnQoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmNyZWF0aW5pbmVMYWJUZXN0d2l0aFJlc3VsdHdpdGhpbkZpcnN0NDhIb3VycygpKSA8IDIgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBJbmRleCBlR0ZSIExlc3MgVGhhbiA2MCBXaXRoaW4gRmlyc3QgNDggSG91cnMiOgogICJNYWxlIEVuY291bnRlciBXaXRoIGVHRlIgTGVzcyBUaGFuIDYwIgogICAgdW5pb24gIkZlbWFsZSBFbmNvdW50ZXIgV2l0aCBlR0ZSIExlc3MgVGhhbiA2MCIKCmRlZmluZSAiRmVtYWxlIEVuY291bnRlciBXaXRoIGVHRlIgTGVzcyBUaGFuIDYwIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSAiUXVhbGlmeWluZ0VuY291bnRlciIuZmVtYWxlZUdGUiAoICkgaXMgbm90IG51bGwKICAgICAgYW5kICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5mZW1hbGVlR0ZSICggKSBhcyBEZWNpbWFsIDwgNjAKCmRlZmluZSAiTWFsZSBFbmNvdW50ZXIgV2l0aCBlR0ZSIExlc3MgVGhhbiA2MCI6CiAgIkVuY291bnRlciBXaXRoIENyZWF0aW5pbmUgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm1hbGVlR0ZSICggKSBpcyBub3QgbnVsbAogICAgICBhbmQgIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm1hbGVlR0ZSICggKSBhcyBEZWNpbWFsIDwgNjAKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggMC4zIG1nIGRMIE9yIE1vcmUgSW5jcmVhc2UgSW4gQ3JlYXRpbmluZSI6CiAgIkluY3JlYXNlIE9mIDAuMyBPciBNb3JlIFVzaW5nIExvd2VzdCBDcmVhdGluaW5lIFdpdGhpbiAyNCBIb3VycyIKICAgIHVuaW9uICJJbmNyZWFzZSBPZiAwLjMgT3IgTW9yZSBVc2luZyBGaXJzdCBDcmVhdGluaW5lIFdpdGhpbiBGaXJzdCA0OCBIb3VycyIKCmRlZmluZSAiSW5jcmVhc2UgT2YgMC4zIE9yIE1vcmUgVXNpbmcgTG93ZXN0IENyZWF0aW5pbmUgV2l0aGluIDI0IEhvdXJzIjoKICBmcm9tCiAgICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQsCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0CiAgICBsZXQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZTogSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWU6IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kICggKCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC52YWx1ZSBhcyBRdWFudGl0eSApIC0gKCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgKSApID4gMC4yOTkgJ21nL2RMJwogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlID0gIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCAoICkKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW1N1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSAtIDQ4IGhvdXJzLCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWVdCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMjQgaG91cnNdCiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kCiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzXQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJJbmNyZWFzZSBPZiAwLjMgT3IgTW9yZSBVc2luZyBGaXJzdCBDcmVhdGluaW5lIFdpdGhpbiBGaXJzdCA0OCBIb3VycyI6CiAgZnJvbQogICAgIkVuY291bnRlciBXaXRoIENyZWF0aW5pbmUgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LAogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdAogICAgbGV0IEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWU6IEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLAogICAgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lOiBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLAogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgd2hlcmUgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCAoICggU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgKSAtICggSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ICkgKSA+IDAuMjk5ICdtZy9kTCcKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC52YWx1ZSBhcyBRdWFudGl0eSA9IHNpbmdsZXRvbiBmcm9tICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5lYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCAoICkKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW1N1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSAtIDQ4IGhvdXJzLCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWVdCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCwgc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QgKyA0OCBob3Vyc10KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QKICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzXQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCA0OCBIb3VycyBPciBMZXNzIEFmdGVyIEFycml2YWwgV2l0aG91dCBIaWdoIENyZWF0aW5pbmUiOgogICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCA0OCBIb3VycyBPciBMZXNzIEFmdGVyIEFycml2YWwiIEVuY291bnRlcldpdGhLaWRuZXlEaWFseXNpczQ4SG91cnNPckFmdGVyCiAgICB3aGVyZSBub3QgKCBleGlzdHMgKCAiRW5jb3VudGVyIFdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUKICAgICAgICAgIHdoZXJlICggRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLnBlcmlvZCBpbmNsdWRlcyBFbmNvdW50ZXJXaXRoS2lkbmV5RGlhbHlzaXM0OEhvdXJzT3JBZnRlci5wZXJpb2QgKQogICAgICApCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEtpZG5leSBEaWFseXNpcyBTdGFydGVkIDQ4IEhvdXJzIE9yIExlc3MgQWZ0ZXIgQXJyaXZhbCI6CiAgZnJvbQogICAgWyJQcm9jZWR1cmUiOiAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiXSBEaWFseXNpcywKICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIGxldCBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSBEaWFseXNpcy5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdCiAgICAgIGFuZCBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIjoKICBmcm9tCiAgICAiRW5jb3VudGVyIFdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZSwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gSGlnaENyZWF0aW5pbmVUZXN0LAogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBMb3dDcmVhdGluaW5lVGVzdAogICAgbGV0IExvd0NyZWF0aW5pbmVUZXN0VGltZTogTG93Q3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwKICAgIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWU6IEhpZ2hDcmVhdGluaW5lVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLAogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZS5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSAoIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA+ICJTZXJ1bSBDcmVhdGluaW5lIE5vcm1hbCIgKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3QudmFsdWUgPSAiRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lIi5oaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0ICggKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3QudmFsdWUgPSAiRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lIi5sb3dlc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQgKCApCiAgICAgIGFuZCAoIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSBhcyBRdWFudGl0eSApID49ICggTG93Q3JlYXRpbmluZVRlc3QudmFsdWUgYXMgUXVhbnRpdHkgKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIDcgZGF5cyBvciBsZXNzIGJlZm9yZSBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lCiAgICAgIGFuZCBMb3dDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDMwIGRheXNdCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgcmV0dXJuIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZQoKZGVmaW5lICJTZXJ1bSBDcmVhdGluaW5lIE5vcm1hbCI6CiAgaWYgKCBQYXRpZW50LnNleCAoICkgPSAiRmVtYWxlIChmaW5kaW5nKSIuY29kZSApIHRoZW4gMS4wMiAnbWcvZEwnIAogICAgZWxzZSAxLjE4ICdtZy9kTCcKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggSGlnaCBSaXNrIERpYWdub3NpcyBGb3IgQUtJIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSAoIFF1YWxpZnlpbmdFbmNvdW50ZXIucmVhc29uQ29kZSBpbiAiSGlnaCBSaXNrIERpYWdub3NpcyBmb3IgQUtJIgogICAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuZW5jb3VudGVyRGlhZ25vc2lzICggKS5jb2RlIGluICJIaWdoIFJpc2sgRGlhZ25vc2lzIGZvciBBS0kiCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEhpZ2ggUmlzayBQcm9jZWR1cmVzIEZvciBBS0kiOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggWyJQcm9jZWR1cmUiOiAiSGlnaCBSaXNrIFByb2NlZHVyZXMgZm9yIEFLSSJdIEhpZ2hSaXNrUHJvY2VkdXJlcwogICAgICBzdWNoIHRoYXQgSGlnaFJpc2tQcm9jZWR1cmVzLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEhpZ2hSaXNrUHJvY2VkdXJlcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwgV2l0aG91dCBIaWdoIENyZWF0aW5pbmUiOgogICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCBNb3JlIFRoYW4gNDggSG91cnMgQWZ0ZXIgQXJyaXZhbCIgRW5jb3VudGVyV2l0aERpYWx5c2lzQWZ0ZXI0OEhvdXJzCiAgICB3aGVyZSBub3QgKCBleGlzdHMgKCAiRW5jb3VudGVyIFdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUKICAgICAgICAgIHdoZXJlICggRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLnBlcmlvZCBpbmNsdWRlcyBFbmNvdW50ZXJXaXRoRGlhbHlzaXNBZnRlcjQ4SG91cnMucGVyaW9kICkKICAgICAgKQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCBNb3JlIFRoYW4gNDggSG91cnMgQWZ0ZXIgQXJyaXZhbCI6CiAgZnJvbQogICAgWyJQcm9jZWR1cmUiOiAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiXSBEaWFseXNpcywKICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIGxldCBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICB3aGVyZSBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzLCBlbmQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2RdCiAgICAgIGFuZCBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZAogICAgICBhbmQgRGlhbHlzaXMuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IEJ5IFRpbWUiOgogIGZyb20KICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIENyZWF0aW5pbmVUZXN0QnlUaW1lCiAgICBsZXQgQ3JFbmNJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgIENySG9zcFBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgQ3JMYWJJZDogQ3JlYXRpbmluZVRlc3RCeVRpbWUuaWQsCiAgICBDclRpbWU6IENyZWF0aW5pbmVUZXN0QnlUaW1lLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBDclRpbWVJc3N1ZWQ6IENyZWF0aW5pbmVUZXN0QnlUaW1lLmlzc3VlZCwKICAgIENyUmVzdWx0OiBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBhcyBRdWFudGl0eSwKICAgIENyUmVzdWx0VmFsdWU6IENyUmVzdWx0LnZhbHVlLAogICAgQ3JSZXN1bHRVbml0OiBDclJlc3VsdC51bml0CiAgICB3aGVyZSBDclRpbWUgZHVyaW5nIENySG9zcFBlcmlvZAogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNMYWJvcmF0b3J5ICggKQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIGFuZCBDclJlc3VsdFVuaXQgPSAnbWcvZEwnCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUudmFsdWUgYXMgUXVhbnRpdHkgPiAwICdtZy9kTCcKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIENyRW5jSW5QdElkOiBDckVuY0lkLAogICAgICBDckhvc3BpdGFsaXphdGlvbjogQ3JIb3NwUGVyaW9kLAogICAgICBDckxhYk9ic0lkOiBDckxhYklkLAogICAgICBDckxhYk9ic0NhdGVnb3J5OiBpZiBDcmVhdGluaW5lVGVzdEJ5VGltZS5pc0xhYm9yYXRvcnkgKCApIHRoZW4gJ2xhYm9yYXRvcnknIAogICAgICAgIGVsc2UgQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNMYWJvcmF0b3J5ICggKSwKICAgICAgQ3JMYWJPYnNDYXRlZ29yeTogQ3JlYXRpbmluZVRlc3RCeVRpbWUuY2F0ZWdvcnksCiAgICAgIENyTGFiT2JzU3RhdHVzOiBDcmVhdGluaW5lVGVzdEJ5VGltZS5zdGF0dXMsCiAgICAgIENyTGFiUmVzdWx0OiBDclJlc3VsdCwKICAgICAgQ3JMYWJSZXN1bHRVbml0OiBDclJlc3VsdFVuaXQsCiAgICAgIENyTGFiUmVzdWx0VmFsdWU6IENyUmVzdWx0VmFsdWUsCiAgICAgIENyTGFiVGltZTogQ3JUaW1lLAogICAgICBDckxhYlRpbWVJc3N1ZWQ6IENyVGltZUlzc3VlZAogICAgfQogICAgc29ydCBieSBDckxhYlRpbWUKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiOgogIGZyb20KICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIEhpZ2hDcmVhdGluaW5lVGVzdCwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gTG93Q3JlYXRpbmluZVRlc3QKICAgIGxldCBMb3dDcmVhdGluaW5lVGVzdFRpbWU6IExvd0NyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lOiBIaWdoQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwKICAgIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKICAgIHdoZXJlICggSGlnaENyZWF0aW5pbmVUZXN0LnZhbHVlID4gIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIiApCiAgICAgIGFuZCBMb3dDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA9ICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5oaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0ICggKQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3QudmFsdWUgPSAiUXVhbGlmeWluZ0VuY291bnRlciIubG93ZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0ICggKQogICAgICBhbmQgIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm9uZUFuZEFIYWxmSW5jcmVhc2VJbkNyZWF0aW5pbmUgKCApID49IExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlCiAgICAgIGFuZCBMb3dDcmVhdGluaW5lVGVzdFRpbWUgNyBkYXlzIG9yIGxlc3MgYmVmb3JlIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUKICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0VGltZSBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QKICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJRdWFsaWZ5aW5nIEJsb29kIFByZXNzdXJlIFJlYWRpbmciOgogIFsiVVNDb3JlLkJsb29kUHJlc3N1cmVQcm9maWxlIl0gQmxvb2RQcmVzc3VyZQogICAgd2hlcmUgQmxvb2RQcmVzc3VyZS5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImNyZWF0aW5pbmVMYWJUZXN0d2l0aFJlc3VsdHdpdGhpbkZpcnN0NDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGZyb20KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3QKICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGFzIFF1YW50aXR5IGlzIG5vdCBudWxsCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICksIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSArIDQ4IGhvdXJzXQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgIHJldHVybiBDcmVhdGluaW5lVGVzdAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmVtYWxlZUdGUiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGlmIFBhdGllbnQuc2V4ICgpID0gIkZlbWFsZSAoZmluZGluZykiLmNvZGUgdGhlbiAoIDE0MiAqIE1pbih7KCJRdWFsaWZ5aW5nRW5jb3VudGVyIi5pbmRleENyZWF0aW5pbmUoKS52YWx1ZSAvIDAuNyksIDEgfSkgXiAoIC0gMC4yNDEgKSAqIE1heCh7KCJRdWFsaWZ5aW5nRW5jb3VudGVyIi5pbmRleENyZWF0aW5pbmUoKS52YWx1ZSAvIDAuNyksIDEgfSkgXiAoIC0gMS4yMDAgKSAqIDAuOTkzOCBeICggQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpKSApICogMS4wMTIgKSAKICAgIGVsc2UgbnVsbAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAibWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiBQYXRpZW50LnNleCAoKSA9ICJNYWxlIChmaW5kaW5nKSIuY29kZSB0aGVuICggMTQyICogTWluKHsoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmluZGV4Q3JlYXRpbmluZSgpLnZhbHVlIC8gMC45KSwgMSB9KSBeICggLSAwLjMwMiApICogTWF4KHsoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmluZGV4Q3JlYXRpbmluZSgpLnZhbHVlIC8gMC45KSwgMSB9KSBeICggLSAxLjIwMCApICogMC45OTM4IF4gKCBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkpICkgKSAKICAgIGVsc2UgbnVsbAoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiaW5kZXhDcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgQ29hbGVzY2UoIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmxvd2VzdFNlcnVtQ3JlYXRpbmluZUluMjRIb3VycygpLCBzaW5nbGV0b24gZnJvbSAiUXVhbGlmeWluZ0VuY291bnRlciIuZmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMoKSkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImxvd2VzdFNlcnVtQ3JlYXRpbmluZUluMjRIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIE1pbigoZnJvbQogICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBCeSBUaW1lIiBMYWJUZXN0c0xvdwogICAgICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzTG93LkNyTGFiUmVzdWx0CiAgICAgICAgd2hlcmUgTGFiVGVzdHNMb3cuQ3JFbmNJblB0SWQgPSBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkCiAgICAgICAgICBhbmQgTGFiVGVzdHNMb3cuQ3JMYWJUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpLCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpICsgMjQgaG91cnNdCiAgICApLkNyTGFiUmVzdWx0CiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBmcm9tCiAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHMKICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0CiAgICB3aGVyZSAoICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5lYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVRpbWVJbjQ4SG91cnMgKCApID0gTGFiVGVzdHMuQ3JMYWJUaW1lICkKICAgIHJldHVybiBMYWJSZXN1bHQgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImVhcmxpZXN0U2VydW1DcmVhdGluaW5lVGltZUluNDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogICggTWluKChmcm9tCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHM0OAogICAgICAgICAgbGV0IExhYlJlc3VsdDQ4OiBMYWJUZXN0czQ4LkNyTGFiUmVzdWx0CiAgICAgICAgICB3aGVyZSBMYWJUZXN0czQ4LkNyRW5jSW5QdElkID0gUXVhbGlmeWluZ0VuY291bnRlci5pZAogICAgICAgICAgICBhbmQgTGFiVGVzdHM0OC5DckxhYlRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCksIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkgKyA0OCBob3Vyc10KICAgICAgKS5DckxhYlRpbWUKICAgICkKICApCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uICJlYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGZyb20KICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBCeSBUaW1lIiBMYWJUZXN0cwogICAgbGV0IExhYlJlc3VsdDogTGFiVGVzdHMuQ3JMYWJSZXN1bHQKICAgIHdoZXJlICggIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmVhcmxpZXN0U2VydW1DcmVhdGluaW5lVGltZSAoICkgPSBMYWJUZXN0cy5DckxhYlRpbWUgKQogICAgcmV0dXJuIExhYlJlc3VsdCBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZWFybGllc3RTZXJ1bUNyZWF0aW5pbmVUaW1lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgKCBNaW4oKGZyb20KICAgICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBCeSBUaW1lIiBMYWJUZXN0c0Vhcmx5CiAgICAgICAgICBsZXQgTGFiUmVzdWx0RWFybHk6IExhYlRlc3RzRWFybHkuQ3JMYWJSZXN1bHQKICAgICAgICAgIHdoZXJlIExhYlRlc3RzRWFybHkuQ3JFbmNJblB0SWQgPSBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkCiAgICAgICkuQ3JMYWJUaW1lCiAgICApCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiaGlnaGVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogICggTWF4KChmcm9tCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHMKICAgICAgICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0CiAgICAgICAgICB3aGVyZSBMYWJUZXN0cy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQKICAgICAgKS5DckxhYlJlc3VsdAogICAgKQogICkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gIm9uZUFuZEFIYWxmSW5jcmVhc2VJbkNyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICAiUXVhbGlmeWluZ0VuY291bnRlciIuaGlnaGVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCAoICkgLyAxLjUKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogICggTWluKChmcm9tCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgQnkgVGltZSIgTGFiVGVzdHMKICAgICAgICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0CiAgICAgICAgICB3aGVyZSBMYWJUZXN0cy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQKICAgICAgKS5DckxhYlJlc3VsdAogICAgKQogICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgRm9yIEZlbWFsZXMiOgogICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLAogICAgICBlR0ZSOiAiUXVhbGlmeWluZ0VuY291bnRlciIuZmVtYWxlZUdGUiAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgRm9yIE1hbGVzIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZUdGUjogIlF1YWxpZnlpbmdFbmNvdW50ZXIiLm1hbGVlR0ZSICggKQogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEFsbCBFbmNvdW50ZXIgRGlhZ25vc2VzIFdpdGggUE9BIEluZGljYXRpb24iOgogIGZyb20KICAgICJFbmNvdW50ZXIgV2l0aCBDcmVhdGluaW5lIEFuZCBXaXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbQ2xhaW1dIGNsbQogICAgd2hlcmUgY2xtLnN0YXR1cyA9ICdhY3RpdmUnCiAgICAgIGFuZCBjbG0udXNlID0gJ2NsYWltJwogICAgICBhbmQgZXhpc3RzICggY2xtLml0ZW0gQ2xhaW1JdGVtCiAgICAgICAgICB3aGVyZSBDbGFpbUl0ZW0uZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBRdWFsaWZ5aW5nRW5jb3VudGVyICkKICAgICAgICAgICAgYW5kIGV4aXN0cyAoIGNsbS5kaWFnbm9zaXMgRHgKICAgICAgICAgICAgICAgIHdoZXJlIER4LnNlcXVlbmNlIGluIGNsbS5pdGVtLmRpYWdub3Npc1NlcXVlbmNlCiAgICAgICAgICAgICAgICAgIGFuZCBEeC5vbkFkbWlzc2lvbiBpbiAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiCiAgICAgICAgICAgICkKICAgICAgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEhlYXJ0IFJhdGUgSW4gRW5jb3VudGVyIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RIZWFydFJhdGU6ICJRdWFsaWZ5aW5nRW5jb3VudGVyIi5maXJzdEhlYXJ0UmF0ZSAoICkKICAgIH0KCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBSZXNwaXJhdG9yeSBSYXRlIEluIEVuY291bnRlciI6CiAgIkVuY291bnRlciBXaXRoIENyZWF0aW5pbmUgQW5kIFdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsCiAgICAgIGZpcnN0UmVzcGlyYXRvcnlSYXRlOiAiUXVhbGlmeWluZ0VuY291bnRlciIuZmlyc3RSZXNwaXJhdG9yeVJhdGUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgU3lzdG9saWMgQmxvb2QgUHJlc3N1cmUgSW4gRW5jb3VudGVyIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RTeXN0b2xpY0JQOiAiUXVhbGlmeWluZ0VuY291bnRlciIuZmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmUgKCApCiAgICB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgVGVtcGVyYXR1cmUgSW4gRW5jb3VudGVyIjoKICAiRW5jb3VudGVyIFdpdGggQ3JlYXRpbmluZSBBbmQgV2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgZmlyc3RUZW1wZXJhdHVyZTogIlF1YWxpZnlpbmdFbmNvdW50ZXIiLmZpcnN0Qm9keVRlbXBlcmF0dXJlICggKQogICAgfQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmlyc3RCb2R5VGVtcGVyYXR1cmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdChbIlVTQ29yZS5Cb2R5VGVtcGVyYXR1cmVQcm9maWxlIl0gRmlyc3RUZW1wZXJhdHVyZQogICAgICB3aGVyZSBGaXJzdFRlbXBlcmF0dXJlLmVmZmVjdGl2ZS5lYXJsaWVzdCgpIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpCiAgICAgICAgYW5kIEZpcnN0VGVtcGVyYXR1cmUudmFsdWUgaXMgbm90IG51bGwKICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQogICkudmFsdWUgYXMgUXVhbnRpdHkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gImZpcnN0SGVhcnRSYXRlIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgRmlyc3QoWyJVU0NvcmUuSGVhcnRSYXRlUHJvZmlsZSJdIEZpcnN0SGVhcnRCZWF0cwogICAgICB3aGVyZSBGaXJzdEhlYXJ0QmVhdHMuZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkKICAgICAgICBhbmQgRmlyc3RIZWFydEJlYXRzLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkKICApLnZhbHVlIGFzIFF1YW50aXR5CgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uICJmaXJzdFJlc3BpcmF0b3J5UmF0ZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIEZpcnN0KFsiVVNDb3JlLlJlc3BpcmF0b3J5UmF0ZVByb2ZpbGUiXSBGaXJzdFJlc3BpcmF0aW9uCiAgICAgIHdoZXJlIEZpcnN0UmVzcGlyYXRpb24uZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkKICAgICAgICBhbmQgRmlyc3RSZXNwaXJhdGlvbi52YWx1ZSBpcyBub3QgbnVsbAogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpCiAgKS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBGaXJzdCgiUXVhbGlmeWluZyBCbG9vZCBQcmVzc3VyZSBSZWFkaW5nIiBTQlBSZWFkaW5nCiAgICAgIHdoZXJlIFNCUFJlYWRpbmcuZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkKICAgICAgcmV0dXJuIHNpbmdsZXRvbiBmcm9tKFNCUFJlYWRpbmcuY29tcG9uZW50IFNCUENvbXBvbmVudAogICAgICAgICAgd2hlcmUgU0JQQ29tcG9uZW50LmNvZGUgfiAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUiCiAgICAgICAgICByZXR1cm4gU0JQQ29tcG9uZW50LnZhbHVlIGFzIFF1YW50aXR5CiAgICAgICkKICAp",
    "url" : "https://madie.cms.gov/Library-CMS832FHIRHHAKI.cql"
  }]
}