eCQM QICore Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/ecqm-content-qicore-2025/ and changes regularly. See the Directory of published versions
Active as of 2025-05-27 |
@prefix fhir: <http://hl7.org/fhir/> . @prefix loinc: <https://loinc.org/rdf/> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix sct: <http://snomed.info/id/> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . # - resource ------------------------------------------------------------------- a fhir:Library ; fhir:nodeRole fhir:treeRoot ; fhir:id [ fhir:v "CMS832HHAKIFHIR"] ; # fhir:meta [ ( fhir:profile [ fhir:v "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary> ] [ fhir:v "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary> ] [ fhir:v "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary> ] [ fhir:v "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary> ] [ fhir:v "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library> ] [ fhir:v "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library> ] [ fhir:v "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"^^xsd:anyURI ; fhir:link <http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library> ] ) ] ; # fhir:language [ fhir:v "en"] ; # fhir:text [ fhir:status [ fhir:v "extensions" ] ; fhir:div "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n <table class=\"grid dict\">\n \n \n <tr>\n <th scope=\"row\"><b>Title: </b></th>\n <td style=\"padding-left: 4px;\">CMS832HHAKIFHIR</td>\n </tr>\n \n\n \n \n <tr>\n <th scope=\"row\"><b>Id: </b></th>\n <td style=\"padding-left: 4px;\">CMS832HHAKIFHIR</td>\n </tr>\n \n\n \n \n <tr>\n <th scope=\"row\"><b>Version: </b></th>\n <td style=\"padding-left: 4px;\">0.2.000</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Url: </b></th>\n <td style=\"padding-left: 4px;\">https://madie.cms.gov/Library/CMS832HHAKIFHIR</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\">\n <b>\n \n official\n \n </b>\n </th>\n <td style=\"padding-left: 4px;\">\n \n <p style=\"margin-bottom: 5px;\">\n <span>CMS832HHAKIFHIR</span>\n </p>\n \n </td>\n </tr>\n \n\n \n\n \n\n \n\n \n <tr>\n <th scope=\"row\"><b>Type: </b></th>\n <td style=\"padding-left: 4px;\">\n \n \n \n <p style=\"margin-bottom: 5px;\">\n <b>system: </b> <span>http://terminology.hl7.org/CodeSystem/library-type</span>\n </p>\n \n \n <p style=\"margin-bottom: 5px;\">\n <b>code: </b> <span>logic-library</span>\n </p>\n \n \n \n \n \n </td>\n </tr>\n \n\n \n\n \n <tr>\n <th scope=\"row\"><b>Date: </b></th>\n <td style=\"padding-left: 4px;\">2025-05-27T15:45:19+00:00</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Publisher: </b></th>\n <td style=\"padding-left: 4px;\">Centers for Medicare & Medicaid Services (CMS)</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Description: </b></th>\n <td style=\"padding-left: 4px;\">CMS832HHAKIFHIR</td>\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 <tr>\n <th scope=\"row\"><b>Related Artifacts: </b></th>\n <td style=\"padding-left: 4px;\">\n \n \n \n <p><b>Dependencies</b></p>\n <ul>\n \n <li>https://madie.cms.gov/Library/FHIRHelpers|4.4.000</li>\n \n <li>https://madie.cms.gov/Library/CQMCommon|4.1.000</li>\n \n <li>https://madie.cms.gov/Library/QICoreCommon|4.0.000</li>\n \n <li>https://madie.cms.gov/Library/SupplementalDataElements|5.1.000</li>\n \n <li>http://loinc.org</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.21</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.33</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.199</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.152</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.12</li>\n \n <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.19</li>\n \n </ul>\n \n \n \n \n \n </td>\n </tr>\n \n\n \n\n \n <tr>\n <th scope=\"row\"><b>Data Requirements:</b></th>\n <td style=\"padding-left: 4px;\">\n <table class=\"grid-dict\">\n <tr><th><b>Type</b></th><th><b>Profile</b></th><th><b>MS</b></th><th><b>Code Filter</b></th></tr>\n \n <tr>\n <th>Patient</th>\n <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-patient</th>\n <th>;;</th>\n <th>\n \n </th>\n </tr>\n \n <tr>\n <th>Claim</th>\n <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-claim</th>\n <th>;;;;;;</th>\n <th>\n \n </th>\n </tr>\n \n <tr>\n <th>Coverage</th>\n <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-coverage</th>\n <th>;;</th>\n <th>\n \n <b>code filter: </b>\n \n <br/>\n \n \n <span style=\"padding-left: 4px;\">\n <b>path: </b><span>type</span>\n </span>\n \n <br/>\n \n \n \n <span style=\"padding-left: 4px;\">\n <b>value set: </b><span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.3591</span>\n </span>\n \n \n \n </th>\n </tr>\n \n </table>\n </td>\n </tr>\n \n\n \n \n <tr>\n <td colspan=\"2\">\n <table>\n <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n <tr><td><pre><code class=\"language-cql\">library CMS832HHAKIFHIR version '0.2.000'#xD;\n#xD;\nusing QICore version '6.0.0'#xD;\n#xD;\ninclude FHIRHelpers version '4.4.000' called FHIRHelpers#xD;\ninclude SupplementalDataElements version '5.1.000' called SDE#xD;\ninclude CQMCommon version '4.1.000' called CQMCommon#xD;\ninclude QICoreCommon version '4.0.000' called QICoreCommon#xD;\ninclude CumulativeMedicationDuration version '5.0.000' called CMD#xD;\ninclude HospitalHarm version '2.5.000' called HospitalHarm#xD;\n#xD;\ncodesystem \"SNOMEDCT\": 'http://snomed.info/sct'#xD;\ncodesystem \"LOINC\": 'http://loinc.org'#xD;\n#xD;\nvalueset \"Body temperature\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.152'#xD;\nvalueset \"Creatinine Mass Per Volume\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.21'#xD;\nvalueset \"Emergency Department Visit\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292'#xD;\nvalueset \"Encounter Inpatient\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'#xD;\nvalueset \"Glomerular Filtration Rate\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.17.4077.2.2038'#xD;\nvalueset \"High Risk Diagnosis for AKI\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.12'#xD;\nvalueset \"High Risk Procedures for AKI\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.19'#xD;\nvalueset \"Hospital Based Dialysis Services\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.199'#xD;\nvalueset \"Observation Services\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1111.143'#xD;\nvalueset \"Obstetrics and VTE Obstetrics\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.33'#xD;\nvalueset \"Present on Admission or Clinically Undetermined\": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'#xD;\n#xD;\ncode \"Female (finding)\": '248152002' from \"SNOMEDCT\" display 'Female'#xD;\ncode \"Male (finding)\": '248153007' from \"SNOMEDCT\" display 'Male'#xD;\ncode \"Heart rate\": '8867-4' from \"LOINC\" display 'Heart rate'#xD;\ncode \"Respiratory rate\": '9279-1' from \"LOINC\" display 'Respiratory rate'#xD;\ncode \"Systolic blood pressure\": '8480-6' from \"LOINC\" display 'Systolic blood pressure'#xD;\n#xD;\nparameter \"Measurement Period\" Interval<DateTime>#xD;\n#xD;\ncontext Patient#xD;\n#xD;\ndefine \"SDE Ethnicity\":#xD;\n SDE.\"SDE Ethnicity\"#xD;\n#xD;\ndefine \"SDE Payer\":#xD;\n SDE.\"SDE Payer\"#xD;\n#xD;\ndefine \"SDE Race\":#xD;\n SDE.\"SDE Race\"#xD;\n#xD;\ndefine \"SDE Sex\":#xD;\n SDE.\"SDE Sex\"#xD;\n#xD;\n// -------------------------------- Population Definitions -----------------------------#xD;\n#xD;\n#xD;\ndefine \"Initial Population\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\"#xD;\n#xD;\ndefine \"Denominator\":#xD;\n \"Initial Population\"#xD;\n#xD;\ndefine \"Denominator Exclusion\":#xD;\n \"Encounter with Less Than 2 Creatinine Results within 48 Hours of Arrival\" // clause 1#xD;\n #xD;\n union \"Encounter with Index eGFR Less Than 60 within First 48 Hours\" // clause 2#xD;\n #xD;\n union \"Encounter with 0.3 mg dL or More Increase in Creatinine\" // clause 3#xD;\n #xD;\n union \"Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival without High Creatinine\" // clause 4#xD;\n #xD;\n union \"Encounter with High Risk Diagnosis for AKI\" // clause 5#xD;\n #xD;\n union \"Encounter with High Risk Procedures for AKI\" // clause 6 #xD;\n#xD;\n#xD;\ndefine \"Numerator\":#xD;\n \"Encounter with 2 Times Serum Creatinine Increase\" // clause 1#xD;\n #xD;\n union \"Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival without High Creatinine\" // clause 2#xD;\n#xD;\n#xD;\n//-------------------------------- Supporting Definitions for Initial Population -----------------------------#xD;\n#xD;\n// Supports Initial Population#xD;\n// Used in other definitions throughout#xD;\n#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine \"Encounter with Creatinine and without Obstetrical Conditions\":#xD;\n \"Inpatient Encounter with Creatinine\" EncounterWithCreatinine#xD;\n where not exists ( ( EncounterWithCreatinine.encounterDiagnosis ( ) ) EncounterDiagnosis#xD;\n where EncounterDiagnosis.code in \"Obstetrics and VTE Obstetrics\"#xD;\n )#xD;\n#xD;\n#xD;\n// Supports Initial Population#xD;\n#xD;\n#xD;\ndefine \"Inpatient Encounter with Creatinine\":#xD;\n from#xD;\n \"Encounter with Age 18 and Length of Stay 48 Hours or More\" Encounter48Hours,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] CreatinineTest#xD;\n let HospitalizationPeriod: Encounter48Hours.hospitalizationWithObservation ( ),#xD;\n CreatinineTestStart: CreatinineTest.effective.earliest ( )#xD;\n where CreatinineTest.value is not null#xD;\n and CreatinineTestStart during Interval[start of HospitalizationPeriod + 48 hours, end of HospitalizationPeriod]#xD;\n and CreatinineTest.status in { 'final', 'amended', 'corrected' }#xD;\n return Encounter48Hours#xD;\n #xD;\n// Supports Initial Population#xD;\n#xD;\n/*#xD;\ndefine \"Encounter with Age 18 and Length of Stay 48 Hours or More\":#xD;\n [\"Encounter\": \"Encounter Inpatient\"] InpatientEncounter#xD;\n where InpatientEncounter.period ends during day of \"Measurement Period\"#xD;\n and AgeInYearsAt(date from start of InpatientEncounter.period)>= 18#xD;\n and ( duration in hours of InpatientEncounter.hospitalizationWithObservation() >= 48 )*/ #xD;\n#xD;\n#xD;\n#xD;\ndefine \"Encounter with Age 18 and Length of Stay 48 Hours or More\":#xD;\n [\"Encounter\": \"Encounter Inpatient\"] InpatientEncounter#xD;\n where Patient.sex in { '248153007', '248152002' }#xD;\n and InpatientEncounter.period ends during day of \"Measurement Period\"#xD;\n and AgeInYearsAt(date from start of InpatientEncounter.period) >= 18#xD;\n and ( duration in hours of InpatientEncounter.hospitalizationWithObservation ( ) >= 48 )#xD;\n#xD;\n// -------------------------------- Supporting Definitions for Denominator Exclusion -----------------------------#xD;\n#xD;\n// Denominator Exclusion clause 1#xD;\n#xD;\n#xD;\n#xD;\ndefine \"Encounter with Less Than 2 Creatinine Results within 48 Hours of Arrival\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n where ( Count(\"CreatinineLabTestwithResultwithinFirst48Hours\"(QualifyingEncounter)) < 2 ) #xD;\n#xD;\n// Denonminator Exclusion clause 2#xD;\n#xD;\n#xD;\ndefine \"Encounter with Index eGFR Less Than 60 within First 48 Hours\":#xD;\n \"Male Encounter with eGFR Less Than 60\"#xD;\n union \"Female Encounter with eGFR Less Than 60\"#xD;\n#xD;\n// Supporting Denominator Exclusion clause 2 #xD;\n#xD;\n#xD;\ndefine \"Female Encounter with eGFR Less Than 60\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n where \"FemaleeGFR\"(QualifyingEncounter) is not null#xD;\n and \"FemaleeGFR\"(QualifyingEncounter) as Decimal < 60#xD;\n#xD;\n// Supporting Denominator Exclusion clause 2 #xD;\n#xD;\n#xD;\ndefine \"Male Encounter with eGFR Less Than 60\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n where \"MaleeGFR\"(QualifyingEncounter) is not null#xD;\n and \"MaleeGFR\"(QualifyingEncounter) as Decimal < 60#xD;\n#xD;\n// Denominator Exclusion clause 3 (Coalesce doesn't seem to work as intended)#xD;\n#xD;\n#xD;\ndefine \"Encounter with 0.3 mg dL or More Increase in Creatinine\":#xD;\n \"Increase of 0.3 or More Using Lowest Creatinine within 24 Hours\"#xD;\n union \"Increase of 0.3 or More Using First Creatinine within First 48 Hours\"#xD;\n#xD;\n #xD;\n//define \"Encounter with 0.3 mg dL or More Increase in Creatinine\":#xD;\n //Coalesce(\"Increase of 0.3 or More Using Lowest Creatinine within 24 Hours\",\"Increase of 0.3 or More Using First Creatinine within First 48 Hours\")#xD;\n#xD;\n/*#xD;\ndefine \"Encounter with 0.3 mg dL or More Increase in Creatinine\":#xD;\n case#xD;\n when \"Increase of 0.3 or More Using Lowest Creatinine within 24 Hours\" is not null#xD;\n then \"Increase of 0.3 or More Using Lowest Creatinine within 24 Hours\"#xD;\n when \"Increase of 0.3 or More Using First Creatinine within First 48 Hours\" is not null#xD;\n then \"Increase of 0.3 or More Using First Creatinine within First 48 Hours\"#xD;\n else null#xD;\n end */#xD;\n#xD;\n #xD;\n// Supporting Denominator Exclusion clause 3#xD;\n#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine \"Increase of 0.3 or More Using Lowest Creatinine within 24 Hours\":#xD;\n from#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] IndexCreatinineLabResult,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] SubsequentCreatinineLabResult#xD;\n let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),#xD;\n SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),#xD;\n HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }#xD;\n and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }#xD;\n and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) > 0.299 'mg/dL'#xD;\n and IndexCreatinineLabResult.value = \"LowestSerumCreatinineResult\"(QualifyingEncounter)#xD;\n and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]#xD;\n and IndexCreatinineLabResultTime during HospitalWithObservationPeriod#xD;\n and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 24 hours]#xD;\n and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod#xD;\n and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]#xD;\n and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id#xD;\n return QualifyingEncounter#xD;\n#xD;\n// Supporting Denominator Exclusion clause 3 #xD;\n#xD;\n#xD;\ndefine \"Increase of 0.3 or More Using First Creatinine within First 48 Hours\":#xD;\n from#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] IndexCreatinineLabResult,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] SubsequentCreatinineLabResult#xD;\n let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),#xD;\n SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),#xD;\n HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }#xD;\n and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }#xD;\n and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) > 0.299 'mg/dL'#xD;\n and IndexCreatinineLabResult.value as Quantity = singleton from \"EarliestSerumCreatinineResult\"(QualifyingEncounter)#xD;\n and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]#xD;\n and IndexCreatinineLabResultTime during HospitalWithObservationPeriod#xD;\n and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]#xD;\n and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod#xD;\n and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]#xD;\n and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]#xD;\n and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id#xD;\n return QualifyingEncounter#xD;\n #xD;\n// Denominator Exclusion clause 4#xD;\n#xD;\n#xD;\ndefine \"Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival without High Creatinine\":#xD;\n \"Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival\" EncounterWithKidneyDialysis48HoursOrAfter#xD;\n where not ( exists ( \"Encounter with 2 Times Serum Creatinine Increase\" EncounterWithHighCreatinine#xD;\n where ( EncounterWithHighCreatinine.period includes EncounterWithKidneyDialysis48HoursOrAfter.period )#xD;\n )#xD;\n )#xD;\n #xD;\n// Supporting Denominator Exclusion clause 4#xD;\n#xD;\n#xD;\ndefine \"Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival\":#xD;\n from#xD;\n [\"Procedure\": \"Hospital Based Dialysis Services\"] Dialysis,#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n where Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]#xD;\n and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod#xD;\n return QualifyingEncounter#xD;\n#xD;\n#xD;\n// Supporting Denominator Exclusion clause 4#xD;\n// Also Supporting Numerator clause 1#xD;\n#xD;\n#xD;\n#xD;\ndefine \"Encounter with 2 Times Serum Creatinine Increase\":#xD;\n from#xD;\n \"Encounter with 1.5 Times Serum Creatinine Increase\" EncounterWithHighCreatinine,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] HighCreatinineTest,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] LowCreatinineTest#xD;\n let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),#xD;\n HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),#xD;\n HospitalWithObservationPeriod: EncounterWithHighCreatinine.hospitalizationWithObservation ( )#xD;\n where ( HighCreatinineTest.value > \"Serum Creatinine Normal\" )#xD;\n and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }#xD;\n and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }#xD;\n and HighCreatinineTest.value = \"HighestSerumCreatinineResult\"(EncounterWithHighCreatinine)#xD;\n and LowCreatinineTest.value = \"LowestSerumCreatinineResult\"(EncounterWithHighCreatinine)#xD;\n and ( HighCreatinineTest.value as Quantity ) >= ( LowCreatinineTest.value as Quantity )#xD;\n and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime#xD;\n and LowCreatinineTestTime during HospitalWithObservationPeriod#xD;\n and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]#xD;\n and HighCreatinineTestTime during HospitalWithObservationPeriod#xD;\n return EncounterWithHighCreatinine#xD;\n#xD;\n#xD;\n#xD;\n// Supports \"Encounter with 2 Times Serum Creatinine Increase\"#xD;\n// Supports \"Encounter with 1.5 Times Serum Creatinine Increase\"#xD;\n#xD;\n#xD;\n#xD;\ndefine \"Serum Creatinine Normal\":#xD;\n if ( Patient.sex = '248152002' ) then 1.02 'mg/dL' #xD;\n else 1.18 'mg/dL' #xD;\n#xD;\n#xD;\n// Denominator Exclusion clause 5#xD;\n#xD;\n#xD;\ndefine \"Encounter with High Risk Diagnosis for AKI\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n where exists ( ( QualifyingEncounter.encounterDiagnosis ( ) ) EncounterDiagnosis#xD;\n where ( EncounterDiagnosis.code in \"High Risk Diagnosis for AKI\" )#xD;\n )#xD;\n#xD;\n#xD;\n// Denominator Exclusion clause 6#xD;\n#xD;\n#xD;\ndefine \"Encounter with High Risk Procedures for AKI\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n with [\"Procedure\": \"High Risk Procedures for AKI\"] HighRiskProcedures#xD;\n such that HighRiskProcedures.performed.toInterval ( ) starts during QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n#xD;\n#xD;\n// -------------------------------- Supporting Definitions for Numerator -----------------------------#xD;\n#xD;\n// Numerator clause 1: See \"Encounter with 2 Times Serum Creatinine Increase\"#xD;\n#xD;\n// Numerator union clause 2#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine \"Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival without High Creatinine\":#xD;\n \"Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival\" EncounterWithDialysisAfter48Hours#xD;\n where not ( exists ( \"Encounter with 2 Times Serum Creatinine Increase\" EncounterWithHighCreatinine#xD;\n where ( EncounterWithHighCreatinine.period includes EncounterWithDialysisAfter48Hours.period )#xD;\n )#xD;\n )#xD;\n#xD;\n// Supports Numerator union clause 2#xD;\n#xD;\n#xD;\ndefine \"Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival\":#xD;\n from#xD;\n [\"Procedure\": \"Hospital Based Dialysis Services\"] Dialysis,#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n where Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod + 48 hours, end of HospitalWithObservationPeriod]#xD;\n and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod#xD;\n return QualifyingEncounter#xD;\n#xD;\n#xD;\n// -------------------------------- Supporting Definitions for Creatinine calculations -----------------------------#xD;\n#xD;\n// Used throughout creatinine functions and defines #xD;\n#xD;\n#xD;\n#xD;\ndefine \"Qualifying Creatinine Lab Result by Time\":#xD;\n from#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] CreatinineTestByTime#xD;\n let CrEncId: QualifyingEncounter.id,#xD;\n CrHospPeriod: QualifyingEncounter.hospitalizationWithObservation ( ),#xD;\n CrLabId: CreatinineTestByTime.id,#xD;\n CrTime: CreatinineTestByTime.effective.earliest ( ),#xD;\n CrTimeIssued: CreatinineTestByTime.issued,#xD;\n CrResult: CreatinineTestByTime.value as Quantity,#xD;\n CrResultValue: CrResult.value,#xD;\n CrResultUnit: CrResult.unit#xD;\n where CrTime during CrHospPeriod#xD;\n and CreatinineTestByTime.isLaboratory ( )#xD;\n and CreatinineTestByTime.status in { 'final', 'amended', 'corrected' }#xD;\n and CrResultUnit = 'mg/dL'#xD;\n and CreatinineTestByTime.value is not null#xD;\n and CreatinineTestByTime.value as Quantity > 0 'mg/dL'#xD;\n return Tuple {#xD;\n CrEncInPtId: CrEncId,#xD;\n CrHospitalization: CrHospPeriod,#xD;\n CrLabObsId: CrLabId,#xD;\n// LabCategory: CreatinineTestByQuantity.isLaboratory(),#xD;\n #xD;\n CrLabObsCategory: if CreatinineTestByTime.isLaboratory ( ) then 'laboratory' #xD;\n else CreatinineTestByTime.isLaboratory ( ),#xD;\n CrLabObsStatus: CreatinineTestByTime.status,#xD;\n CrLabResult: CrResult,#xD;\n CrLabResultUnit: CrResultUnit,#xD;\n CrLabResultValue: CrResultValue,#xD;\n CrLabTime: CrTime,#xD;\n CrLabTimeIssued: CrTimeIssued#xD;\n }#xD;\n sort by CrLabTime #xD;\n#xD;\n// Supporting Denominator Exclusion clause 4#xD;\n// Supporting Numerator #xD;\n#xD;\n#xD;\n#xD;\ndefine \"Encounter with 1.5 Times Serum Creatinine Increase\":#xD;\n from#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] HighCreatinineTest,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] LowCreatinineTest#xD;\n let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),#xD;\n HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),#xD;\n HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n where ( HighCreatinineTest.value > \"Serum Creatinine Normal\" )#xD;\n and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }#xD;\n and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }#xD;\n and HighCreatinineTest.value = \"HighestSerumCreatinineResult\"(QualifyingEncounter)#xD;\n and LowCreatinineTest.value = \"LowestSerumCreatinineResult\"(QualifyingEncounter)#xD;\n and \"1.5IncreaseInCreatinine\"(QualifyingEncounter) >= LowCreatinineTest.value#xD;\n and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime#xD;\n and LowCreatinineTestTime during HospitalWithObservationPeriod#xD;\n and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]#xD;\n and HighCreatinineTestTime during HospitalWithObservationPeriod#xD;\n return QualifyingEncounter#xD;\n#xD;\n/*#xD;\ndefine \"Encounter with 1.5 Times Serum Creatinine Increase\":#xD;\n from#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter,#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] CreatinineTest#xD;\n let #xD;\n LowestCreatinineTestWithin7DaysPrior: \"LowestSerumCreatinineWithin7DaysPrior\"(QualifyingEncounter, CreatinineTest),#xD;\n CreatinineTestTime: CreatinineTest.effective.earliest(),#xD;\n HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation()#xD;\n where #xD;\n CreatinineTest.value >= LowestCreatinineTestWithin7DaysPrior * 1.5#xD;\n and CreatinineTest.value > \"Serum Creatinine Normal\"#xD;\n and CreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]#xD;\n return QualifyingEncounter*/#xD;\n #xD;\n#xD;\n// -------------------------------- Supporting Functions for Creatinine calculations -----------------------------#xD;\n#xD;\n// Supports Denominator Exclusion clause 1#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"CreatinineLabTestwithResultwithinFirst48Hours\"(QualifyingEncounter Encounter):#xD;\n from#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] CreatinineTest#xD;\n where CreatinineTest.value is not null#xD;\n and CreatinineTest.effective.earliest ( ) during Interval[start of QualifyingEncounter.hospitalizationWithObservation ( ), start of QualifyingEncounter.hospitalizationWithObservation ( ) + 48 hours]#xD;\n and CreatinineTest.effective.earliest ( ) during QualifyingEncounter.hospitalizationWithObservation ( )#xD;\n and CreatinineTest.status in { 'final', 'amended', 'corrected' }#xD;\n return CreatinineTest#xD;\n#xD;\n// eGFR functions return as decimal value rather than Quantity#xD;\n// Supports Denominator Exclusion clause 2#xD;\n// Supports risk variable \"Risk Variable Estimated Glomerular Filtration Rate for Females\"#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"FemaleeGFR\"(QualifyingEncounter Encounter):#xD;\n if Patient.sex = '248152002' then ( 142 * Min({(\"IndexCreatinine\"(QualifyingEncounter).value / 0.7), 1 }) ^ ( - 0.241 ) * Max({(\"IndexCreatinine\"(QualifyingEncounter).value / 0.7), 1 }) ^ ( - 1.200 ) * 0.9938 ^ ( AgeInYearsAt(start of QualifyingEncounter.hospitalizationWithObservation()) ) * 1.012 ) #xD;\n else null#xD;\n#xD;\n// eGFR functions return as decimal value rather than Quantity#xD;\n// Supports Denominator Exclusion clause 2#xD;\n// Supports risk variable \"Risk Variable Estimated Glomerular Filtration Rate for Females\"#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"MaleeGFR\"(QualifyingEncounter Encounter):#xD;\n if Patient.sex = '248153007' then ( 142 * Min({(\"IndexCreatinine\"(QualifyingEncounter).value / 0.9), 1 }) ^ ( - 0.302 ) * Max({(\"IndexCreatinine\"(QualifyingEncounter).value / 0.9), 1 }) ^ ( - 1.200 ) * 0.9938 ^ ( AgeInYearsAt(start of QualifyingEncounter.hospitalizationWithObservation()) ) ) #xD;\n else null#xD;\n#xD;\n#xD;\n// Used in GFR calculations, above#xD;\n#xD;\n#xD;\ndefine function \"IndexCreatinine\"(QualifyingEncounter Encounter):#xD;\n Coalesce(\"LowestSerumCreatinineIn24Hours\"(QualifyingEncounter), singleton from \"FirstSerumCreatinineIn48Hours\"(QualifyingEncounter)) #xD;\n#xD;\n// Supports IndexCreatinine function #xD;\n#xD;\n#xD;\ndefine function \"LowestSerumCreatinineIn24Hours\"(QualifyingEncounter Encounter):#xD;\n Min((from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTestsLow#xD;\n let LabResult: LabTestsLow.CrLabResult#xD;\n where LabTestsLow.CrEncInPtId = QualifyingEncounter.id#xD;\n and LabTestsLow.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 24 hours]#xD;\n ).CrLabResult#xD;\n ) #xD;\n#xD;\n// Find result from earliest time in 48 hrs#xD;\n// Supports IndexCreatinine function#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"FirstSerumCreatinineIn48Hours\"(QualifyingEncounter Encounter):#xD;\n from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTests#xD;\n let LabResult: LabTests.CrLabResult#xD;\n where ( \"EarliestSerumCreatinineTimeIn48Hours\"(QualifyingEncounter) = LabTests.CrLabTime )#xD;\n return LabResult as Quantity#xD;\n#xD;\n#xD;\n// Find earliest time in 48 hrs#xD;\n// Supports FirstSerumCreatinineIn48Hours function#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"EarliestSerumCreatinineTimeIn48Hours\"(QualifyingEncounter Encounter):#xD;\n ( Min((from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTests48#xD;\n let LabResult48: LabTests48.CrLabResult#xD;\n where LabTests48.CrEncInPtId = QualifyingEncounter.id#xD;\n and LabTests48.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 48 hours]#xD;\n ).CrLabTime#xD;\n )#xD;\n )#xD;\n#xD;\n// Supports Denominator Exclusion clause 3#xD;\n#xD;\n#xD;\ndefine function \"EarliestSerumCreatinineResult\"(QualifyingEncounter Encounter):#xD;\n from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTests#xD;\n let LabResult: LabTests.CrLabResult#xD;\n where ( \"EarliestSerumCreatinineTime\"(QualifyingEncounter) = LabTests.CrLabTime )#xD;\n return LabResult as Quantity#xD;\n#xD;\n// Supports Denominator Exclusion clause 3 via \"EarliestSerumCreatinineResult\" function #xD;\n#xD;\n#xD;\ndefine function \"EarliestSerumCreatinineTime\"(QualifyingEncounter Encounter):#xD;\n ( Min((from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTestsEarly#xD;\n let LabResultEarly: LabTestsEarly.CrLabResult#xD;\n where LabTestsEarly.CrEncInPtId = QualifyingEncounter.id#xD;\n ).CrLabTime#xD;\n )#xD;\n )#xD;\n#xD;\n// Not used anywhere#xD;\n#xD;\n#xD;\ndefine function \"SerumCreatinineSequencebyTime\"(QualifyingEncounter Encounter):#xD;\n [\"LaboratoryResultObservation\": \"Creatinine Mass Per Volume\"] CreatinineTestByTime#xD;\n let HospitalWithObservation: QualifyingEncounter.hospitalization ( )#xD;\n where CreatinineTestByTime.effective.earliest ( ) during HospitalWithObservation#xD;\n and CreatinineTestByTime.value is not null#xD;\n and CreatinineTestByTime.isLaboratory ( )#xD;\n and CreatinineTestByTime.status in { 'final', 'amended', 'corrected' }#xD;\n return CreatinineTestByTime#xD;\n#xD;\n// The following functions work with Cr result as Quantity (not decimal, but Quantity value is decimal)#xD;\n#xD;\n// Supporting Denominator Exclusion clause 4 via \"Encounter with 2 Times Serum Creatinine Increase\"#xD;\n// Supporting Numerator via \"Encounter with 2 Times Serum Creatinine Increase\"#xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"HighestSerumCreatinineResult\"(QualifyingEncounter Encounter):#xD;\n ( Max((from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTests#xD;\n let LabResult: LabTests.CrLabResult#xD;\n where LabTests.CrEncInPtId = QualifyingEncounter.id#xD;\n ).CrLabResult#xD;\n )#xD;\n )#xD;\n#xD;\n// Supporting Denominator Exclusion clause 4 via \"Encounter with 1.5 Times Serum Creatinine Increase\"#xD;\n// Supporting Numerator via \"Encounter with 1.5 Times Serum Creatinine Increase\" #xD;\n#xD;\n#xD;\n#xD;\ndefine function \"1.5IncreaseInCreatinine\"(QualifyingEncounter Encounter):#xD;\n \"HighestSerumCreatinineResult\"(QualifyingEncounter) / 1.5#xD;\n#xD;\n// Supporting Denominator Exclusion clause 4 via \"Encounter with 1.5 Times Serum Creatinine Increase\"#xD;\n// Supporting Numerator via \"Encounter with 1.5 Times Serum Creatinine Increase\" #xD;\n#xD;\n#xD;\n#xD;\ndefine function \"2.0IncreaseInCreatinine\"(QualifyingEncounter Encounter):#xD;\n \"HighestSerumCreatinineResult\"(QualifyingEncounter) / 2#xD;\n#xD;\n// Supporting Denominator Exclusion clause 3 via \"Increase of 0.3 or More Using Lowest Creatinine within 24 Hours\"#xD;\n// and clause 4 via \"Encounter with 1.5 Times Serum Creatinine Increase\"#xD;\n// Supporting Numerator via \"Encounter with 1.5 Times Serum Creatinine Increase\" #xD;\n#xD;\n#xD;\n#xD;\n#xD;\ndefine function \"LowestSerumCreatinineResult\"(QualifyingEncounter Encounter):#xD;\n ( Min((from#xD;\n \"Qualifying Creatinine Lab Result by Time\" LabTests#xD;\n let LabResult: LabTests.CrLabResult#xD;\n where LabTests.CrEncInPtId = QualifyingEncounter.id#xD;\n ).CrLabResult#xD;\n )#xD;\n )#xD;\n#xD;\n// -------------------------------- Risk Variable Definitions -----------------------------#xD;\n#xD;\n#xD;\ndefine \"Risk Variable Estimated Glomerular Filtration Rate for Females\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n return Tuple {#xD;\n encounterId: QualifyingEncounter.id,#xD;\n eGFR: \"FemaleeGFR\"(QualifyingEncounter)#xD;\n }#xD;\n#xD;\ndefine \"Risk Variable Estimated Glomerular Filtration Rate for Males\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n return Tuple {#xD;\n encounterId: QualifyingEncounter.id,#xD;\n eGFR: \"MaleeGFR\"(QualifyingEncounter)#xD;\n }#xD;\n#xD;\ndefine \"Risk Variable All Encounter Diagnoses with POA Indication\":#xD;\n from#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter,#xD;\n [Claim] claim#xD;\n where claim.status = 'active'#xD;\n and claim.use = 'claim'#xD;\n and exists ( claim.item I#xD;\n where I.encounter.references ( QualifyingEncounter )#xD;\n and exists ( claim.diagnosis D#xD;\n where D.sequence in claim.item.diagnosisSequence#xD;\n and D.onAdmission in \"Present on Admission or Clinically Undetermined\"#xD;\n )#xD;\n )#xD;\n#xD;\ndefine \"Risk Variable First Heart Rate in Encounter\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n return Tuple {#xD;\n encounterId: QualifyingEncounter.id,#xD;\n firstHeartRate: \"FirstHeartRate\"(QualifyingEncounter)#xD;\n }#xD;\n#xD;\ndefine \"Risk Variable First Respiratory Rate in Encounter\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n return Tuple {#xD;\n encounterId: QualifyingEncounter.id,#xD;\n firstRespiratoryRate: \"FirstRespiratoryRate\"(QualifyingEncounter)#xD;\n }#xD;\n#xD;\ndefine \"Risk Variable First Systolic Blood Pressure in Encounter\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n return Tuple {#xD;\n encounterId: QualifyingEncounter.id,#xD;\n firstSystolicBP: \"FirstSystolicBloodPressure\"(QualifyingEncounter)#xD;\n }#xD;\n#xD;\ndefine \"Risk Variable First Temperature in Encounter\":#xD;\n \"Encounter with Creatinine and without Obstetrical Conditions\" QualifyingEncounter#xD;\n return Tuple {#xD;\n encounterId: QualifyingEncounter.id,#xD;\n firstTemperature: \"FirstBodyTemperature\"(QualifyingEncounter)#xD;\n }#xD;\n#xD;\n// -------------------------------- Risk Variable supportin functions -----------------------------#xD;\n#xD;\n#xD;\ndefine function \"FirstBodyTemperature\"(QualifyingEncounter Encounter):#xD;\n First([\"USCoreBodyTemperatureProfile\": \"Body temperature\"] FirstTemperature#xD;\n where FirstTemperature.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()#xD;\n and FirstTemperature.value is not null#xD;\n sort by effective.earliest()#xD;\n ).value as Quantity#xD;\n#xD;\ndefine function \"FirstHeartRate\"(QualifyingEncounter Encounter):#xD;\n First([\"USCoreHeartRateProfile\": \"Heart rate\"] FirstHeartBeats#xD;\n where FirstHeartBeats.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()#xD;\n and FirstHeartBeats.value is not null#xD;\n sort by effective.earliest()#xD;\n ).value as Quantity#xD;\n#xD;\ndefine function \"FirstRespiratoryRate\"(QualifyingEncounter Encounter):#xD;\n First([\"USCoreRespiratoryRateProfile\": \"Respiratory rate\"] FirstRespiration#xD;\n where FirstRespiration.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()#xD;\n and FirstRespiration.value is not null#xD;\n sort by effective.earliest()#xD;\n ).value as Quantity#xD;\n#xD;\ndefine \"Qualifying Systolic Blood Pressure Reading\":#xD;\n [\"USCoreBloodPressureProfile\"] BloodPressure#xD;\n where BloodPressure.effective.earliest ( ) during day of \"Measurement Period\"#xD;\n#xD;\ndefine function \"FirstSystolicBloodPressure\"(QualifyingEncounter Encounter):#xD;\n First(\"Qualifying Systolic Blood Pressure Reading\" SBPReading#xD;\n where SBPReading.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()#xD;\n return singleton from(SBPReading.component SBPComponent#xD;\n where SBPComponent.code ~ \"Systolic blood pressure\"#xD;\n return SBPComponent.value as Quantity#xD;\n )#xD;\n )#xD;\n/* #xD;\ndefine function \"FirstSystolicBloodPressureTest\"(QualifyingEncounter Encounter ):#xD;\n First([\"USCoreBloodPressureProfile\": \"Systolic blood pressure\"] FirstSystolic#xD;\n where FirstSystolic.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()#xD;\n and FirstSystolic.value is not null#xD;\n sort by effective.earliest()#xD;\n ).value as Quantity#xD;\n*/#xD;\n#xD;\n// --------------------------------- Temporary debugging defines should go here ---------------------------------------------------#xD;\n#xD;\n</code></pre></td></tr>\n </table>\n </td>\n </tr>\n \n \n \n </table>\n</div>"^^rdf:XMLLiteral ] ; # fhir:contained ( [ a fhir:Parameters ; fhir:id [ fhir:v "options" ] ; ( fhir:parameter [ fhir:name [ fhir:v "translatorVersion" ] ; fhir:value [ a fhir:string ; fhir:v "3.25.0" ] ] [ fhir:name [ fhir:v "option" ] ; fhir:value [ a fhir:string ; fhir:v "EnableAnnotations" ] ] [ fhir:name [ fhir:v "option" ] ; fhir:value [ a fhir:string ; fhir:v "EnableLocators" ] ] [ fhir:name [ fhir:v "option" ] ; fhir:value [ a fhir:string ; fhir:v "DisableListDemotion" ] ] [ fhir:name [ fhir:v "option" ] ; fhir:value [ a fhir:string ; fhir:v "DisableListPromotion" ] ] [ fhir:name [ fhir:v "format" ] ; fhir:value [ a fhir:string ; fhir:v "JSON" ] ] [ fhir:name [ fhir:v "format" ] ; fhir:value [ a fhir:string ; fhir:v "XML" ] ] [ fhir:name [ fhir:v "analyzeDataRequirements" ] ; fhir:value [ a fhir:boolean ; fhir:v false ] ] [ fhir:name [ fhir:v "collapseDataRequirements" ] ; fhir:value [ a fhir:boolean ; fhir:v false ] ] [ fhir:name [ fhir:v "compatibilityLevel" ] ; fhir:value [ a fhir:string ; fhir:v "1.5" ] ] [ fhir:name [ fhir:v "enableCqlOnly" ] ; fhir:value [ a fhir:boolean ; fhir:v false ] ] [ fhir:name [ fhir:v "errorLevel" ] ; fhir:value [ a fhir:string ; fhir:v "Info" ] ] [ fhir:name [ fhir:v "signatureLevel" ] ; fhir:value [ a fhir:string ; fhir:v "Overloads" ] ] [ fhir:name [ fhir:v "validateUnits" ] ; fhir:value [ a fhir:boolean ; fhir:v true ] ] [ fhir:name [ fhir:v "verifyOnly" ] ; fhir:value [ a fhir:boolean ; fhir:v false ] ] ) ] ) ; # fhir:extension ( [ fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode"^^xsd:anyURI ] ; fhir:value [ a fhir:Coding, sct:248152002 ; fhir:system [ fhir:v "http://snomed.info/sct"^^xsd:anyURI ] ; fhir:code [ fhir:v "248152002" ] ; fhir:display [ fhir:v "Female (finding)" ] ] ] [ fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode"^^xsd:anyURI ] ; fhir:value [ a fhir:Coding, sct:248153007 ; fhir:system [ fhir:v "http://snomed.info/sct"^^xsd:anyURI ] ; fhir:code [ fhir:v "248153007" ] ; fhir:display [ fhir:v "Male (finding)" ] ] ] [ fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode"^^xsd:anyURI ] ; fhir:value [ a fhir:Coding, loinc:8867-4 ; fhir:system [ fhir:v "http://loinc.org"^^xsd:anyURI ] ; fhir:code [ fhir:v "8867-4" ] ; fhir:display [ fhir:v "Heart rate" ] ] ] [ fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode"^^xsd:anyURI ] ; fhir:value [ a fhir:Coding, loinc:9279-1 ; fhir:system [ fhir:v "http://loinc.org"^^xsd:anyURI ] ; fhir:code [ fhir:v "9279-1" ] ; fhir:display [ fhir:v "Respiratory rate" ] ] ] [ fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode"^^xsd:anyURI ] ; fhir:value [ a fhir:Coding, loinc:8480-6 ; fhir:system [ fhir:v "http://loinc.org"^^xsd:anyURI ] ; fhir:code [ fhir:v "8480-6" ] ; fhir:display [ fhir:v "Systolic blood pressure" ] ] ] [ fhir:url [ fhir:v "http://hl7.org/fhir/StructureDefinition/cqf-cqlOptions"^^xsd:anyURI ] ; fhir:value [ a fhir:Reference ; fhir:reference [ fhir:v "#options" ] ] ] ) ; # fhir:url [ fhir:v "https://madie.cms.gov/Library/CMS832HHAKIFHIR"^^xsd:anyURI] ; # fhir:identifier ( [ fhir:use [ fhir:v "official" ] ; fhir:system [ fhir:v "https://madie.cms.gov/login"^^xsd:anyURI ] ; fhir:value [ fhir:v "CMS832HHAKIFHIR" ] ] ) ; # fhir:version [ fhir:v "0.2.000"] ; # fhir:name [ fhir:v "CMS832HHAKIFHIR"] ; # fhir:title [ fhir:v "CMS832HHAKIFHIR"] ; # fhir:status [ fhir:v "active"] ; # fhir:experimental [ fhir:v false] ; # fhir:type [ ( fhir:coding [ fhir:system [ fhir:v "http://terminology.hl7.org/CodeSystem/library-type"^^xsd:anyURI ] ; fhir:code [ fhir:v "logic-library" ] ] ) ] ; # fhir:date [ fhir:v "2025-05-27T15:45:19+00:00"^^xsd:dateTime] ; # fhir:publisher [ fhir:v "Centers for Medicare & Medicaid Services (CMS)"] ; # fhir:description [ fhir:v "CMS832HHAKIFHIR"] ; # fhir:content ( [ fhir:contentType [ fhir:v "text/cql" ] ; fhir:data [ fhir:v "bGlicmFyeSBDTVM4MzJISEFLSUZISVIgdmVyc2lvbiAnMC4yLjAwMCcNCg0KdXNpbmcgUUlDb3JlIHZlcnNpb24gJzYuMC4wJw0KDQppbmNsdWRlIEZISVJIZWxwZXJzIHZlcnNpb24gJzQuNC4wMDAnIGNhbGxlZCBGSElSSGVscGVycw0KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIFNERQ0KaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNC4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbg0KaW5jbHVkZSBRSUNvcmVDb21tb24gdmVyc2lvbiAnNC4wLjAwMCcgY2FsbGVkIFFJQ29yZUNvbW1vbg0KaW5jbHVkZSBDdW11bGF0aXZlTWVkaWNhdGlvbkR1cmF0aW9uIHZlcnNpb24gJzUuMC4wMDAnIGNhbGxlZCBDTUQNCmluY2x1ZGUgSG9zcGl0YWxIYXJtIHZlcnNpb24gJzIuNS4wMDAnIGNhbGxlZCBIb3NwaXRhbEhhcm0NCg0KY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcNCmNvZGVzeXN0ZW0gIkxPSU5DIjogJ2h0dHA6Ly9sb2luYy5vcmcnDQoNCnZhbHVlc2V0ICJCb2R5IHRlbXBlcmF0dXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4xNTInDQp2YWx1ZXNldCAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIxJw0KdmFsdWVzZXQgIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yOTInDQp2YWx1ZXNldCAiRW5jb3VudGVyIElucGF0aWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4zMDcnDQp2YWx1ZXNldCAiR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjE3LjQwNzcuMi4yMDM4Jw0KdmFsdWVzZXQgIkhpZ2ggUmlzayBEaWFnbm9zaXMgZm9yIEFLSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTInDQp2YWx1ZXNldCAiSGlnaCBSaXNrIFByb2NlZHVyZXMgZm9yIEFLSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTknDQp2YWx1ZXNldCAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE5OScNCnZhbHVlc2V0ICJPYnNlcnZhdGlvbiBTZXJ2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTEuMTQzJw0KdmFsdWVzZXQgIk9ic3RldHJpY3MgYW5kIFZURSBPYnN0ZXRyaWNzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4zMycNCnZhbHVlc2V0ICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk3Jw0KDQpjb2RlICJGZW1hbGUgKGZpbmRpbmcpIjogJzI0ODE1MjAwMicgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0ZlbWFsZScNCmNvZGUgIk1hbGUgKGZpbmRpbmcpIjogJzI0ODE1MzAwNycgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ01hbGUnDQpjb2RlICJIZWFydCByYXRlIjogJzg4NjctNCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0hlYXJ0IHJhdGUnDQpjb2RlICJSZXNwaXJhdG9yeSByYXRlIjogJzkyNzktMScgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1Jlc3BpcmF0b3J5IHJhdGUnDQpjb2RlICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSI6ICc4NDgwLTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdTeXN0b2xpYyBibG9vZCBwcmVzc3VyZScNCg0KcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPg0KDQpjb250ZXh0IFBhdGllbnQNCg0KZGVmaW5lICJTREUgRXRobmljaXR5IjoNCiAgU0RFLiJTREUgRXRobmljaXR5Ig0KDQpkZWZpbmUgIlNERSBQYXllciI6DQogIFNERS4iU0RFIFBheWVyIg0KDQpkZWZpbmUgIlNERSBSYWNlIjoNCiAgU0RFLiJTREUgUmFjZSINCg0KZGVmaW5lICJTREUgU2V4IjoNCiAgU0RFLiJTREUgU2V4Ig0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3B1bGF0aW9uIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIg0KDQpkZWZpbmUgIkRlbm9taW5hdG9yIjoNCiAgIkluaXRpYWwgUG9wdWxhdGlvbiINCg0KZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb24iOg0KICAiRW5jb3VudGVyIHdpdGggTGVzcyBUaGFuIDIgQ3JlYXRpbmluZSBSZXN1bHRzIHdpdGhpbiA0OCBIb3VycyBvZiBBcnJpdmFsIiAvLyBjbGF1c2UgMQ0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBJbmRleCBlR0ZSIExlc3MgVGhhbiA2MCB3aXRoaW4gRmlyc3QgNDggSG91cnMiICAgICAvLyBjbGF1c2UgMg0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCAwLjMgbWcgZEwgb3IgTW9yZSBJbmNyZWFzZSBpbiBDcmVhdGluaW5lIiAgICAgICAgICAvLyBjbGF1c2UgMw0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCA0OCBIb3VycyBvciBMZXNzIEFmdGVyIEFycml2YWwgd2l0aG91dCBIaWdoIENyZWF0aW5pbmUiICAvLyBjbGF1c2UgNA0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIaWdoIFJpc2sgRGlhZ25vc2lzIGZvciBBS0kiICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGF1c2UgNQ0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIaWdoIFJpc2sgUHJvY2VkdXJlcyBmb3IgQUtJIiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGF1c2UgNiANCg0KDQpkZWZpbmUgIk51bWVyYXRvciI6DQogICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIC8vIGNsYXVzZSAxDQogICAgDQogICAgdW5pb24gIkVuY291bnRlciB3aXRoIEtpZG5leSBEaWFseXNpcyBTdGFydGVkIE1vcmUgVGhhbiA0OCBIb3VycyBBZnRlciBBcnJpdmFsIHdpdGhvdXQgSGlnaCBDcmVhdGluaW5lIiAgIC8vIGNsYXVzZSAyDQoNCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0aW5nIERlZmluaXRpb25zIGZvciBJbml0aWFsIFBvcHVsYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8gU3VwcG9ydHMgSW5pdGlhbCBQb3B1bGF0aW9uDQovLyBVc2VkIGluIG90aGVyIGRlZmluaXRpb25zIHRocm91Z2hvdXQNCg0KDQoNCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyI6DQogICJJbnBhdGllbnQgRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSIgRW5jb3VudGVyV2l0aENyZWF0aW5pbmUNCiAgICB3aGVyZSBub3QgZXhpc3RzICggKCBFbmNvdW50ZXJXaXRoQ3JlYXRpbmluZS5lbmNvdW50ZXJEaWFnbm9zaXMgKCApICkgRW5jb3VudGVyRGlhZ25vc2lzDQogICAgICAgIHdoZXJlIEVuY291bnRlckRpYWdub3Npcy5jb2RlIGluICJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyINCiAgICApDQoNCg0KLy8gU3VwcG9ydHMgSW5pdGlhbCBQb3B1bGF0aW9uDQoNCg0KZGVmaW5lICJJbnBhdGllbnQgRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggQWdlIDE4IGFuZCBMZW5ndGggb2YgU3RheSA0OCBIb3VycyBvciBNb3JlIiBFbmNvdW50ZXI0OEhvdXJzLA0KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3QNCiAgICBsZXQgSG9zcGl0YWxpemF0aW9uUGVyaW9kOiBFbmNvdW50ZXI0OEhvdXJzLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICksDQogICAgQ3JlYXRpbmluZVRlc3RTdGFydDogQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQ0KICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGlzIG5vdCBudWxsDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RTdGFydCBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uUGVyaW9kICsgNDggaG91cnMsIGVuZCBvZiBIb3NwaXRhbGl6YXRpb25QZXJpb2RdDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgcmV0dXJuIEVuY291bnRlcjQ4SG91cnMNCiAgICAgICAgICAgICAgICANCi8vIFN1cHBvcnRzIEluaXRpYWwgUG9wdWxhdGlvbg0KDQovKg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBBZ2UgMTggYW5kIExlbmd0aCBvZiBTdGF5IDQ4IEhvdXJzIG9yIE1vcmUiOg0KICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyDQogICAgICAgICAgICAgICAgICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiDQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kKT49IDE4DQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgKCBkdXJhdGlvbiBpbiBob3VycyBvZiBJbnBhdGllbnRFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkgPj0gNDggKSovIA0KDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBBZ2UgMTggYW5kIExlbmd0aCBvZiBTdGF5IDQ4IEhvdXJzIG9yIE1vcmUiOg0KICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyDQogICAgd2hlcmUgUGF0aWVudC5zZXggaW4geyAnMjQ4MTUzMDA3JywgJzI0ODE1MjAwMicgfQ0KICAgICAgYW5kIElucGF0aWVudEVuY291bnRlci5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiDQogICAgICBhbmQgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kKSA+PSAxOA0KICAgICAgYW5kICggZHVyYXRpb24gaW4gaG91cnMgb2YgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgPj0gNDggKQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0aW5nIERlZmluaXRpb25zIGZvciBEZW5vbWluYXRvciBFeGNsdXNpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgMQ0KDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBMZXNzIFRoYW4gMiBDcmVhdGluaW5lIFJlc3VsdHMgd2l0aGluIDQ4IEhvdXJzIG9mIEFycml2YWwiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgd2hlcmUgKCBDb3VudCgiQ3JlYXRpbmluZUxhYlRlc3R3aXRoUmVzdWx0d2l0aGluRmlyc3Q0OEhvdXJzIihRdWFsaWZ5aW5nRW5jb3VudGVyKSkgPCAyICkgDQoNCi8vIERlbm9ubWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDINCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEluZGV4IGVHRlIgTGVzcyBUaGFuIDYwIHdpdGhpbiBGaXJzdCA0OCBIb3VycyI6DQogICJNYWxlIEVuY291bnRlciB3aXRoIGVHRlIgTGVzcyBUaGFuIDYwIg0KICAgIHVuaW9uICJGZW1hbGUgRW5jb3VudGVyIHdpdGggZUdGUiBMZXNzIFRoYW4gNjAiDQoNCi8vIFN1cHBvcnRpbmcgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSAyICAgIA0KDQoNCmRlZmluZSAiRmVtYWxlIEVuY291bnRlciB3aXRoIGVHRlIgTGVzcyBUaGFuIDYwIjoNCiAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIHdoZXJlICJGZW1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyKSBpcyBub3QgbnVsbA0KICAgICAgYW5kICJGZW1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyKSBhcyBEZWNpbWFsIDwgNjANCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDIgIA0KDQoNCmRlZmluZSAiTWFsZSBFbmNvdW50ZXIgd2l0aCBlR0ZSIExlc3MgVGhhbiA2MCI6DQogICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICB3aGVyZSAiTWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpIGlzIG5vdCBudWxsDQogICAgICBhbmQgIk1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyKSBhcyBEZWNpbWFsIDwgNjANCg0KLy8gRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSAzICAoQ29hbGVzY2UgZG9lc24ndCBzZWVtIHRvIHdvcmsgYXMgaW50ZW5kZWQpDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCAwLjMgbWcgZEwgb3IgTW9yZSBJbmNyZWFzZSBpbiBDcmVhdGluaW5lIjoNCiAgIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIExvd2VzdCBDcmVhdGluaW5lIHdpdGhpbiAyNCBIb3VycyINCiAgICB1bmlvbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgRmlyc3QgQ3JlYXRpbmluZSB3aXRoaW4gRmlyc3QgNDggSG91cnMiDQoNCiAgIA0KLy9kZWZpbmUgIkVuY291bnRlciB3aXRoIDAuMyBtZyBkTCBvciBNb3JlIEluY3JlYXNlIGluIENyZWF0aW5pbmUiOg0KICAvL0NvYWxlc2NlKCJJbmNyZWFzZSBvZiAwLjMgb3IgTW9yZSBVc2luZyBMb3dlc3QgQ3JlYXRpbmluZSB3aXRoaW4gMjQgSG91cnMiLCJJbmNyZWFzZSBvZiAwLjMgb3IgTW9yZSBVc2luZyBGaXJzdCBDcmVhdGluaW5lIHdpdGhpbiBGaXJzdCA0OCBIb3VycyIpDQoNCi8qDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDAuMyBtZyBkTCBvciBNb3JlIEluY3JlYXNlIGluIENyZWF0aW5pbmUiOg0KICBjYXNlDQogICAgd2hlbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgTG93ZXN0IENyZWF0aW5pbmUgd2l0aGluIDI0IEhvdXJzIiBpcyBub3QgbnVsbA0KICAgICAgdGhlbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgTG93ZXN0IENyZWF0aW5pbmUgd2l0aGluIDI0IEhvdXJzIg0KICAgIHdoZW4gIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIEZpcnN0IENyZWF0aW5pbmUgd2l0aGluIEZpcnN0IDQ4IEhvdXJzIiBpcyBub3QgbnVsbA0KICAgICAgdGhlbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgRmlyc3QgQ3JlYXRpbmluZSB3aXRoaW4gRmlyc3QgNDggSG91cnMiDQogICAgZWxzZSBudWxsDQogIGVuZCAqLw0KDQogIA0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMNCg0KDQoNCg0KDQpkZWZpbmUgIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIExvd2VzdCBDcmVhdGluaW5lIHdpdGhpbiAyNCBIb3VycyI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLA0KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LA0KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQNCiAgICBsZXQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZTogSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lOiBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLA0KICAgIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICB3aGVyZSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgKCAoIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ICkgLSAoIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC52YWx1ZSBhcyBRdWFudGl0eSApICkgPiAwLjI5OSAnbWcvZEwnDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlID0gIkxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBJbnRlcnZhbFtTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgLSA0OCBob3VycywgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lXQ0KICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMjQgaG91cnNdDQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkDQogICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXINCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMgICAgICAgICAgICANCg0KDQpkZWZpbmUgIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIEZpcnN0IENyZWF0aW5pbmUgd2l0aGluIEZpcnN0IDQ4IEhvdXJzIjoNCiAgZnJvbQ0KICAgICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdA0KICAgIGxldCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lOiBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwNCiAgICBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWU6IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQ0KICAgIHdoZXJlIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCAoICggU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgKSAtICggSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ICkgKSA+IDAuMjk5ICdtZy9kTCcNCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgPSBzaW5nbGV0b24gZnJvbSAiRWFybGllc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIC0gNDggaG91cnMsIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZV0NCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzXQ0KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkDQogICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXINCiANCi8vIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgNA0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgNDggSG91cnMgb3IgTGVzcyBBZnRlciBBcnJpdmFsIHdpdGhvdXQgSGlnaCBDcmVhdGluaW5lIjoNCiAgIkVuY291bnRlciB3aXRoIEtpZG5leSBEaWFseXNpcyBTdGFydGVkIDQ4IEhvdXJzIG9yIExlc3MgQWZ0ZXIgQXJyaXZhbCIgRW5jb3VudGVyV2l0aEtpZG5leURpYWx5c2lzNDhIb3Vyc09yQWZ0ZXINCiAgICB3aGVyZSBub3QgKCBleGlzdHMgKCAiRW5jb3VudGVyIHdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUNCiAgICAgICAgICB3aGVyZSAoIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZS5wZXJpb2QgaW5jbHVkZXMgRW5jb3VudGVyV2l0aEtpZG5leURpYWx5c2lzNDhIb3Vyc09yQWZ0ZXIucGVyaW9kICkNCiAgICAgICkNCiAgICApDQogDQovLyBTdXBwb3J0aW5nIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgNA0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgNDggSG91cnMgb3IgTGVzcyBBZnRlciBBcnJpdmFsIjoNCiAgZnJvbQ0KICAgIFsiUHJvY2VkdXJlIjogIkhvc3BpdGFsIEJhc2VkIERpYWx5c2lzIFNlcnZpY2VzIl0gRGlhbHlzaXMsDQogICAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIGxldCBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApDQogICAgd2hlcmUgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QNCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcg0KDQoNCi8vIFN1cHBvcnRpbmcgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSA0DQovLyBBbHNvIFN1cHBvcnRpbmcgTnVtZXJhdG9yIGNsYXVzZSAxDQoNCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDIgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZSwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIEhpZ2hDcmVhdGluaW5lVGVzdCwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIExvd0NyZWF0aW5pbmVUZXN0DQogICAgbGV0IExvd0NyZWF0aW5pbmVUZXN0VGltZTogTG93Q3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwNCiAgICBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lOiBIaWdoQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwNCiAgICBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICB3aGVyZSAoIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA+ICJTZXJ1bSBDcmVhdGluaW5lIE5vcm1hbCIgKQ0KICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQ0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3QudmFsdWUgPSAiSGlnaGVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lKQ0KICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlID0gIkxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lKQ0KICAgICAgYW5kICggSGlnaENyZWF0aW5pbmVUZXN0LnZhbHVlIGFzIFF1YW50aXR5ICkgPj0gKCBMb3dDcmVhdGluaW5lVGVzdC52YWx1ZSBhcyBRdWFudGl0eSApDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIDcgZGF5cyBvciBsZXNzIGJlZm9yZSBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10NCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgIHJldHVybiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUNCg0KDQoNCi8vIFN1cHBvcnRzICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQovLyBTdXBwb3J0cyAiRW5jb3VudGVyIHdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQoNCg0KDQpkZWZpbmUgIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIjoNCiAgaWYgKCBQYXRpZW50LnNleCA9ICcyNDgxNTIwMDInICkgdGhlbiAxLjAyICdtZy9kTCcgDQogICAgZWxzZSAxLjE4ICdtZy9kTCcgDQoNCg0KLy8gRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSA1DQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIaWdoIFJpc2sgRGlhZ25vc2lzIGZvciBBS0kiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgd2hlcmUgZXhpc3RzICggKCBRdWFsaWZ5aW5nRW5jb3VudGVyLmVuY291bnRlckRpYWdub3NpcyAoICkgKSBFbmNvdW50ZXJEaWFnbm9zaXMNCiAgICAgICAgd2hlcmUgKCBFbmNvdW50ZXJEaWFnbm9zaXMuY29kZSBpbiAiSGlnaCBSaXNrIERpYWdub3NpcyBmb3IgQUtJIiApDQogICAgKQ0KDQoNCi8vIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgNg0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggSGlnaCBSaXNrIFByb2NlZHVyZXMgZm9yIEFLSSI6DQogICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICB3aXRoIFsiUHJvY2VkdXJlIjogIkhpZ2ggUmlzayBQcm9jZWR1cmVzIGZvciBBS0kiXSBIaWdoUmlza1Byb2NlZHVyZXMNCiAgICAgIHN1Y2ggdGhhdCBIaWdoUmlza1Byb2NlZHVyZXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApDQoNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3VwcG9ydGluZyBEZWZpbml0aW9ucyBmb3IgTnVtZXJhdG9yICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovLyBOdW1lcmF0b3IgY2xhdXNlIDE6ICBTZWUgIkVuY291bnRlciB3aXRoIDIgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCg0KLy8gTnVtZXJhdG9yIHVuaW9uIGNsYXVzZSAyDQoNCg0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwgd2l0aG91dCBIaWdoIENyZWF0aW5pbmUiOg0KICAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwiIEVuY291bnRlcldpdGhEaWFseXNpc0FmdGVyNDhIb3Vycw0KICAgIHdoZXJlIG5vdCAoIGV4aXN0cyAoICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZQ0KICAgICAgICAgIHdoZXJlICggRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLnBlcmlvZCBpbmNsdWRlcyBFbmNvdW50ZXJXaXRoRGlhbHlzaXNBZnRlcjQ4SG91cnMucGVyaW9kICkNCiAgICAgICkNCiAgICApDQoNCi8vIFN1cHBvcnRzIE51bWVyYXRvciB1bmlvbiBjbGF1c2UgMg0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwiOg0KICBmcm9tDQogICAgWyJQcm9jZWR1cmUiOiAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiXSBEaWFseXNpcywNCiAgICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgbGV0IEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICB3aGVyZSBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzLCBlbmQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2RdDQogICAgICBhbmQgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QNCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcg0KDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN1cHBvcnRpbmcgRGVmaW5pdGlvbnMgZm9yIENyZWF0aW5pbmUgY2FsY3VsYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIFVzZWQgdGhyb3VnaG91dCBjcmVhdGluaW5lIGZ1bmN0aW9ucyBhbmQgZGVmaW5lcyAgDQoNCg0KDQpkZWZpbmUgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiOg0KICBmcm9tDQogICAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIENyZWF0aW5pbmVUZXN0QnlUaW1lDQogICAgbGV0IENyRW5jSWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsDQogICAgQ3JIb3NwUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICksDQogICAgQ3JMYWJJZDogQ3JlYXRpbmluZVRlc3RCeVRpbWUuaWQsDQogICAgQ3JUaW1lOiBDcmVhdGluaW5lVGVzdEJ5VGltZS5lZmZlY3RpdmUuZWFybGllc3QgKCApLA0KICAgIENyVGltZUlzc3VlZDogQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNzdWVkLA0KICAgIENyUmVzdWx0OiBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBhcyBRdWFudGl0eSwNCiAgICBDclJlc3VsdFZhbHVlOiBDclJlc3VsdC52YWx1ZSwNCiAgICBDclJlc3VsdFVuaXQ6IENyUmVzdWx0LnVuaXQNCiAgICB3aGVyZSBDclRpbWUgZHVyaW5nIENySG9zcFBlcmlvZA0KICAgICAgYW5kIENyZWF0aW5pbmVUZXN0QnlUaW1lLmlzTGFib3JhdG9yeSAoICkNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCBDclJlc3VsdFVuaXQgPSAnbWcvZEwnDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUudmFsdWUgaXMgbm90IG51bGwNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBhcyBRdWFudGl0eSA+IDAgJ21nL2RMJw0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBDckVuY0luUHRJZDogQ3JFbmNJZCwNCiAgICAgIENySG9zcGl0YWxpemF0aW9uOiBDckhvc3BQZXJpb2QsDQogICAgICBDckxhYk9ic0lkOiBDckxhYklkLA0KLy8gICAgICAgICAgICAgICAgICAgIExhYkNhdGVnb3J5OiBDcmVhdGluaW5lVGVzdEJ5UXVhbnRpdHkuaXNMYWJvcmF0b3J5KCksDQogICAgICANCiAgICAgIENyTGFiT2JzQ2F0ZWdvcnk6IGlmIENyZWF0aW5pbmVUZXN0QnlUaW1lLmlzTGFib3JhdG9yeSAoICkgdGhlbiAnbGFib3JhdG9yeScgDQogICAgICAgIGVsc2UgQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNMYWJvcmF0b3J5ICggKSwNCiAgICAgIENyTGFiT2JzU3RhdHVzOiBDcmVhdGluaW5lVGVzdEJ5VGltZS5zdGF0dXMsDQogICAgICBDckxhYlJlc3VsdDogQ3JSZXN1bHQsDQogICAgICBDckxhYlJlc3VsdFVuaXQ6IENyUmVzdWx0VW5pdCwNCiAgICAgIENyTGFiUmVzdWx0VmFsdWU6IENyUmVzdWx0VmFsdWUsDQogICAgICBDckxhYlRpbWU6IENyVGltZSwNCiAgICAgIENyTGFiVGltZUlzc3VlZDogQ3JUaW1lSXNzdWVkDQogICAgfQ0KICAgIHNvcnQgYnkgQ3JMYWJUaW1lICANCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDQNCi8vIFN1cHBvcnRpbmcgTnVtZXJhdG9yICAgICAgICAgICAgICAgDQoNCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIjoNCiAgZnJvbQ0KICAgICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBIaWdoQ3JlYXRpbmluZVRlc3QsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBMb3dDcmVhdGluaW5lVGVzdA0KICAgIGxldCBMb3dDcmVhdGluaW5lVGVzdFRpbWU6IExvd0NyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgSGlnaENyZWF0aW5pbmVUZXN0VGltZTogSGlnaENyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQ0KICAgIHdoZXJlICggSGlnaENyZWF0aW5pbmVUZXN0LnZhbHVlID4gIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIiApDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgSGlnaENyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQ0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA9ICJIaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0IihRdWFsaWZ5aW5nRW5jb3VudGVyKQ0KICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlID0gIkxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICAgIGFuZCAiMS41SW5jcmVhc2VJbkNyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpID49IExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIDcgZGF5cyBvciBsZXNzIGJlZm9yZSBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10NCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyDQoNCi8qDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIjoNCiAgZnJvbQ0KICAgICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBDcmVhdGluaW5lVGVzdA0KICBsZXQgDQogICAgTG93ZXN0Q3JlYXRpbmluZVRlc3RXaXRoaW43RGF5c1ByaW9yOiAiTG93ZXN0U2VydW1DcmVhdGluaW5lV2l0aGluN0RheXNQcmlvciIoUXVhbGlmeWluZ0VuY291bnRlciwgQ3JlYXRpbmluZVRlc3QpLA0KICAgIENyZWF0aW5pbmVUZXN0VGltZTogQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0KCksDQogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkNCiAgd2hlcmUgDQogICAgQ3JlYXRpbmluZVRlc3QudmFsdWUgPj0gTG93ZXN0Q3JlYXRpbmluZVRlc3RXaXRoaW43RGF5c1ByaW9yICogMS41DQogICAgYW5kIENyZWF0aW5pbmVUZXN0LnZhbHVlID4gIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIg0KICAgIGFuZCBDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10NCiAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIqLw0KICAgICAgICAgICAgDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN1cHBvcnRpbmcgRnVuY3Rpb25zICBmb3IgQ3JlYXRpbmluZSBjYWxjdWxhdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIFN1cHBvcnRzIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgMQ0KDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkNyZWF0aW5pbmVMYWJUZXN0d2l0aFJlc3VsdHdpdGhpbkZpcnN0NDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBmcm9tDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBDcmVhdGluaW5lVGVzdA0KICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGlzIG5vdCBudWxsDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgKyA0OCBob3Vyc10NCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICByZXR1cm4gQ3JlYXRpbmluZVRlc3QNCg0KLy8gZUdGUiBmdW5jdGlvbnMgcmV0dXJuIGFzIGRlY2ltYWwgdmFsdWUgcmF0aGVyIHRoYW4gUXVhbnRpdHkNCi8vIFN1cHBvcnRzIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgMg0KLy8gU3VwcG9ydHMgcmlzayB2YXJpYWJsZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgZm9yIEZlbWFsZXMiDQoNCg0KDQoNCmRlZmluZSBmdW5jdGlvbiAiRmVtYWxlZUdGUiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBpZiBQYXRpZW50LnNleCA9ICcyNDgxNTIwMDInIHRoZW4gKCAxNDIgKiBNaW4oeygiSW5kZXhDcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyKS52YWx1ZSAvIDAuNyksIDEgfSkgXiAoIC0gMC4yNDEgKSAqIE1heCh7KCJJbmRleENyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLnZhbHVlIC8gMC43KSwgMSB9KSBeICggLSAxLjIwMCApICogMC45OTM4IF4gKCBBZ2VJblllYXJzQXQoc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKSkgKSAqIDEuMDEyICkgDQogICAgZWxzZSBudWxsDQoNCi8vIGVHRlIgZnVuY3Rpb25zIHJldHVybiBhcyBkZWNpbWFsIHZhbHVlIHJhdGhlciB0aGFuIFF1YW50aXR5DQovLyBTdXBwb3J0cyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDINCi8vIFN1cHBvcnRzIHJpc2sgdmFyaWFibGUgIlJpc2sgVmFyaWFibGUgRXN0aW1hdGVkIEdsb21lcnVsYXIgRmlsdHJhdGlvbiBSYXRlIGZvciBGZW1hbGVzIg0KDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIk1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIGlmIFBhdGllbnQuc2V4ID0gJzI0ODE1MzAwNycgdGhlbiAoIDE0MiAqIE1pbih7KCJJbmRleENyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLnZhbHVlIC8gMC45KSwgMSB9KSBeICggLSAwLjMwMiApICogTWF4KHsoIkluZGV4Q3JlYXRpbmluZSIoUXVhbGlmeWluZ0VuY291bnRlcikudmFsdWUgLyAwLjkpLCAxIH0pIF4gKCAtIDEuMjAwICkgKiAwLjk5MzggXiAoIEFnZUluWWVhcnNBdChzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpKSApICkgDQogICAgZWxzZSBudWxsDQoNCg0KLy8gVXNlZCBpbiBHRlIgY2FsY3VsYXRpb25zLCBhYm92ZQ0KDQoNCmRlZmluZSBmdW5jdGlvbiAiSW5kZXhDcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIENvYWxlc2NlKCJMb3dlc3RTZXJ1bUNyZWF0aW5pbmVJbjI0SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLCBzaW5nbGV0b24gZnJvbSAiRmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIpKSAgDQoNCi8vIFN1cHBvcnRzIEluZGV4Q3JlYXRpbmluZSBmdW5jdGlvbiAgDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJMb3dlc3RTZXJ1bUNyZWF0aW5pbmVJbjI0SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgTWluKChmcm9tDQogICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBieSBUaW1lIiBMYWJUZXN0c0xvdw0KICAgICAgICBsZXQgTGFiUmVzdWx0OiBMYWJUZXN0c0xvdy5DckxhYlJlc3VsdA0KICAgICAgICB3aGVyZSBMYWJUZXN0c0xvdy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQNCiAgICAgICAgICBhbmQgTGFiVGVzdHNMb3cuQ3JMYWJUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpLCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpICsgMjQgaG91cnNdDQogICAgKS5DckxhYlJlc3VsdA0KICApIA0KDQovLyBGaW5kIHJlc3VsdCBmcm9tIGVhcmxpZXN0IHRpbWUgaW4gNDggaHJzDQovLyBTdXBwb3J0cyBJbmRleENyZWF0aW5pbmUgZnVuY3Rpb24NCg0KDQoNCmRlZmluZSBmdW5jdGlvbiAiRmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgZnJvbQ0KICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBieSBUaW1lIiBMYWJUZXN0cw0KICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0DQogICAgd2hlcmUgKCAiRWFybGllc3RTZXJ1bUNyZWF0aW5pbmVUaW1lSW40OEhvdXJzIihRdWFsaWZ5aW5nRW5jb3VudGVyKSA9IExhYlRlc3RzLkNyTGFiVGltZSApDQogICAgcmV0dXJuIExhYlJlc3VsdCBhcyBRdWFudGl0eQ0KDQoNCi8vIEZpbmQgZWFybGllc3QgdGltZSBpbiA0OCBocnMNCi8vIFN1cHBvcnRzIEZpcnN0U2VydW1DcmVhdGluaW5lSW40OEhvdXJzIGZ1bmN0aW9uDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkVhcmxpZXN0U2VydW1DcmVhdGluaW5lVGltZUluNDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICAoIE1pbigoZnJvbQ0KICAgICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBieSBUaW1lIiBMYWJUZXN0czQ4DQogICAgICAgICAgbGV0IExhYlJlc3VsdDQ4OiBMYWJUZXN0czQ4LkNyTGFiUmVzdWx0DQogICAgICAgICAgd2hlcmUgTGFiVGVzdHM0OC5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQNCiAgICAgICAgICAgIGFuZCBMYWJUZXN0czQ4LkNyTGFiVGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKSwgc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKSArIDQ4IGhvdXJzXQ0KICAgICAgKS5DckxhYlRpbWUNCiAgICApDQogICkNCg0KLy8gU3VwcG9ydHMgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSAzDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJFYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBmcm9tDQogICAgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiIExhYlRlc3RzDQogICAgbGV0IExhYlJlc3VsdDogTGFiVGVzdHMuQ3JMYWJSZXN1bHQNCiAgICB3aGVyZSAoICJFYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVRpbWUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpID0gTGFiVGVzdHMuQ3JMYWJUaW1lICkNCiAgICByZXR1cm4gTGFiUmVzdWx0IGFzIFF1YW50aXR5DQoNCi8vICBTdXBwb3J0cyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMgdmlhICJFYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIgZnVuY3Rpb24gIA0KDQoNCmRlZmluZSBmdW5jdGlvbiAiRWFybGllc3RTZXJ1bUNyZWF0aW5pbmVUaW1lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogICggTWluKChmcm9tDQogICAgICAgICAgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiIExhYlRlc3RzRWFybHkNCiAgICAgICAgICBsZXQgTGFiUmVzdWx0RWFybHk6IExhYlRlc3RzRWFybHkuQ3JMYWJSZXN1bHQNCiAgICAgICAgICB3aGVyZSBMYWJUZXN0c0Vhcmx5LkNyRW5jSW5QdElkID0gUXVhbGlmeWluZ0VuY291bnRlci5pZA0KICAgICAgKS5DckxhYlRpbWUNCiAgICApDQogICkNCg0KLy8gTm90IHVzZWQgYW55d2hlcmUNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIlNlcnVtQ3JlYXRpbmluZVNlcXVlbmNlYnlUaW1lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3RCeVRpbWUNCiAgICBsZXQgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb246IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uICggKQ0KICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0QnlUaW1lLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUudmFsdWUgaXMgbm90IG51bGwNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS5pc0xhYm9yYXRvcnkgKCApDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgcmV0dXJuIENyZWF0aW5pbmVUZXN0QnlUaW1lDQoNCi8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdvcmsgd2l0aCBDciByZXN1bHQgYXMgUXVhbnRpdHkgKG5vdCBkZWNpbWFsLCBidXQgUXVhbnRpdHkgdmFsdWUgaXMgZGVjaW1hbCkNCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDQgdmlhICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQovLyBTdXBwb3J0aW5nIE51bWVyYXRvciB2aWEgIkVuY291bnRlciB3aXRoIDIgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCg0KDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJIaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0IihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogICggTWF4KChmcm9tDQogICAgICAgICAgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiIExhYlRlc3RzDQogICAgICAgICAgbGV0IExhYlJlc3VsdDogTGFiVGVzdHMuQ3JMYWJSZXN1bHQNCiAgICAgICAgICB3aGVyZSBMYWJUZXN0cy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQNCiAgICAgICkuQ3JMYWJSZXN1bHQNCiAgICApDQogICkNCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDQgdmlhICJFbmNvdW50ZXIgd2l0aCAxLjUgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCi8vIFN1cHBvcnRpbmcgTnVtZXJhdG9yICB2aWEgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiAgICAgICAgICAgICANCg0KDQoNCmRlZmluZSBmdW5jdGlvbiAiMS41SW5jcmVhc2VJbkNyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgIkhpZ2hlc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQiKFF1YWxpZnlpbmdFbmNvdW50ZXIpIC8gMS41DQoNCi8vIFN1cHBvcnRpbmcgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSA0IHZpYSAiRW5jb3VudGVyIHdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQovLyBTdXBwb3J0aW5nIE51bWVyYXRvciAgdmlhICJFbmNvdW50ZXIgd2l0aCAxLjUgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSIgICAgICAgICAgICAgDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIjIuMEluY3JlYXNlSW5DcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogICJIaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0IihRdWFsaWZ5aW5nRW5jb3VudGVyKSAvIDINCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMgdmlhICJJbmNyZWFzZSBvZiAwLjMgb3IgTW9yZSBVc2luZyBMb3dlc3QgQ3JlYXRpbmluZSB3aXRoaW4gMjQgSG91cnMiDQovLyBhbmQgY2xhdXNlIDQgdmlhICJFbmNvdW50ZXIgd2l0aCAxLjUgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCi8vIFN1cHBvcnRpbmcgTnVtZXJhdG9yICB2aWEgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiAgICAgICAgICAgICANCg0KDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJMb3dlc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgKCBNaW4oKGZyb20NCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgYnkgVGltZSIgTGFiVGVzdHMNCiAgICAgICAgICBsZXQgTGFiUmVzdWx0OiBMYWJUZXN0cy5DckxhYlJlc3VsdA0KICAgICAgICAgIHdoZXJlIExhYlRlc3RzLkNyRW5jSW5QdElkID0gUXVhbGlmeWluZ0VuY291bnRlci5pZA0KICAgICAgKS5DckxhYlJlc3VsdA0KICAgICkNCiAgKQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSaXNrIFZhcmlhYmxlIERlZmluaXRpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgZm9yIEZlbWFsZXMiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLA0KICAgICAgZUdGUjogIkZlbWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRXN0aW1hdGVkIEdsb21lcnVsYXIgRmlsdHJhdGlvbiBSYXRlIGZvciBNYWxlcyI6DQogICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsDQogICAgICBlR0ZSOiAiTWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgQWxsIEVuY291bnRlciBEaWFnbm9zZXMgd2l0aCBQT0EgSW5kaWNhdGlvbiI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLA0KICAgIFtDbGFpbV0gY2xhaW0NCiAgICB3aGVyZSBjbGFpbS5zdGF0dXMgPSAnYWN0aXZlJw0KICAgICAgYW5kIGNsYWltLnVzZSA9ICdjbGFpbScNCiAgICAgIGFuZCBleGlzdHMgKCBjbGFpbS5pdGVtIEkNCiAgICAgICAgICB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzICggUXVhbGlmeWluZ0VuY291bnRlciApDQogICAgICAgICAgICBhbmQgZXhpc3RzICggY2xhaW0uZGlhZ25vc2lzIEQNCiAgICAgICAgICAgICAgICB3aGVyZSBELnNlcXVlbmNlIGluIGNsYWltLml0ZW0uZGlhZ25vc2lzU2VxdWVuY2UNCiAgICAgICAgICAgICAgICAgIGFuZCBELm9uQWRtaXNzaW9uIGluICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCINCiAgICAgICAgICAgICkNCiAgICAgICkNCg0KZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEhlYXJ0IFJhdGUgaW4gRW5jb3VudGVyIjoNCiAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwNCiAgICAgIGZpcnN0SGVhcnRSYXRlOiAiRmlyc3RIZWFydFJhdGUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgUmVzcGlyYXRvcnkgUmF0ZSBpbiBFbmNvdW50ZXIiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLA0KICAgICAgZmlyc3RSZXNwaXJhdG9yeVJhdGU6ICJGaXJzdFJlc3BpcmF0b3J5UmF0ZSIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICB9DQoNCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSBpbiBFbmNvdW50ZXIiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLA0KICAgICAgZmlyc3RTeXN0b2xpY0JQOiAiRmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgVGVtcGVyYXR1cmUgaW4gRW5jb3VudGVyIjoNCiAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwNCiAgICAgIGZpcnN0VGVtcGVyYXR1cmU6ICJGaXJzdEJvZHlUZW1wZXJhdHVyZSIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICB9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJpc2sgVmFyaWFibGUgc3VwcG9ydGluIGZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkZpcnN0Qm9keVRlbXBlcmF0dXJlIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIEZpcnN0KFsiVVNDb3JlQm9keVRlbXBlcmF0dXJlUHJvZmlsZSI6ICJCb2R5IHRlbXBlcmF0dXJlIl0gRmlyc3RUZW1wZXJhdHVyZQ0KICAgICAgd2hlcmUgRmlyc3RUZW1wZXJhdHVyZS5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQ0KICAgICAgICBhbmQgRmlyc3RUZW1wZXJhdHVyZS52YWx1ZSBpcyBub3QgbnVsbA0KICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQ0KICApLnZhbHVlIGFzIFF1YW50aXR5DQoNCmRlZmluZSBmdW5jdGlvbiAiRmlyc3RIZWFydFJhdGUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgRmlyc3QoWyJVU0NvcmVIZWFydFJhdGVQcm9maWxlIjogIkhlYXJ0IHJhdGUiXSBGaXJzdEhlYXJ0QmVhdHMNCiAgICAgIHdoZXJlIEZpcnN0SGVhcnRCZWF0cy5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQ0KICAgICAgICBhbmQgRmlyc3RIZWFydEJlYXRzLnZhbHVlIGlzIG5vdCBudWxsDQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpDQogICkudmFsdWUgYXMgUXVhbnRpdHkNCg0KZGVmaW5lIGZ1bmN0aW9uICJGaXJzdFJlc3BpcmF0b3J5UmF0ZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBGaXJzdChbIlVTQ29yZVJlc3BpcmF0b3J5UmF0ZVByb2ZpbGUiOiAiUmVzcGlyYXRvcnkgcmF0ZSJdIEZpcnN0UmVzcGlyYXRpb24NCiAgICAgIHdoZXJlIEZpcnN0UmVzcGlyYXRpb24uZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkNCiAgICAgICAgYW5kIEZpcnN0UmVzcGlyYXRpb24udmFsdWUgaXMgbm90IG51bGwNCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkNCiAgKS52YWx1ZSBhcyBRdWFudGl0eQ0KDQpkZWZpbmUgIlF1YWxpZnlpbmcgU3lzdG9saWMgQmxvb2QgUHJlc3N1cmUgUmVhZGluZyI6DQogIFsiVVNDb3JlQmxvb2RQcmVzc3VyZVByb2ZpbGUiXSBCbG9vZFByZXNzdXJlDQogICAgd2hlcmUgQmxvb2RQcmVzc3VyZS5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCINCg0KZGVmaW5lIGZ1bmN0aW9uICJGaXJzdFN5c3RvbGljQmxvb2RQcmVzc3VyZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBGaXJzdCgiUXVhbGlmeWluZyBTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSBSZWFkaW5nIiBTQlBSZWFkaW5nDQogICAgICB3aGVyZSBTQlBSZWFkaW5nLmVmZmVjdGl2ZS5lYXJsaWVzdCgpIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpDQogICAgICByZXR1cm4gc2luZ2xldG9uIGZyb20oU0JQUmVhZGluZy5jb21wb25lbnQgU0JQQ29tcG9uZW50DQogICAgICAgICAgd2hlcmUgU0JQQ29tcG9uZW50LmNvZGUgfiAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUiDQogICAgICAgICAgcmV0dXJuIFNCUENvbXBvbmVudC52YWx1ZSBhcyBRdWFudGl0eQ0KICAgICAgKQ0KICApDQovKiANCmRlZmluZSBmdW5jdGlvbiAiRmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmVUZXN0IihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlciApOg0KICBGaXJzdChbIlVTQ29yZUJsb29kUHJlc3N1cmVQcm9maWxlIjogIlN5c3RvbGljIGJsb29kIHByZXNzdXJlIl0gRmlyc3RTeXN0b2xpYw0KICAgICAgd2hlcmUgRmlyc3RTeXN0b2xpYy5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQ0KICAgICAgICBhbmQgRmlyc3RTeXN0b2xpYy52YWx1ZSBpcyBub3QgbnVsbA0KICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQ0KICApLnZhbHVlIGFzIFF1YW50aXR5DQoqLw0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVtcG9yYXJ5IGRlYnVnZ2luZyBkZWZpbmVzIHNob3VsZCBnbyBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQo="^^xsd:base64Binary ] ] ) . #
IG © 2023+ cqframework. Package gov.healthit.ecqi.ecqms#2025.0.0 based on FHIR 4.0.1. Generated 2025-09-06
Links: Table of Contents |
QA Report
| Version History | License