Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build

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

: CMS90FHIRFSAforHeartFailure - JSON Representation

Draft as of 2026-09-19

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS90FHIRFSAforHeartFailure",
  "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 CMS90FHIRFSAforHeartFailure 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 USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\ninclude Hospice version '7.1.000' called Hospice\n\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\n\nvalueset &quot;Heart Failure&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.376'\nvalueset &quot;Office Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'\nvalueset &quot;Virtual Encounter&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1089'\nvalueset &quot;Telephone Visits&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1080'\n\ncode &quot;Emotional score [MLHFQ]&quot;: '85609-6' from &quot;LOINC&quot; display 'Emotional score [MLHFQ]'\ncode &quot;Kansas City Cardiomyopathy Questionnaire - 12 item [KCCQ-12]&quot;: '86923-0' from &quot;LOINC&quot; display 'Kansas City Cardiomyopathy Questionnaire - 12 item [KCCQ-12]'\ncode &quot;Overall summary score [KCCQ-12]&quot;: '86924-8' from &quot;LOINC&quot; display 'Overall summary score [KCCQ-12]'\ncode &quot;Overall summary score [KCCQ]&quot;: '71940-1' from &quot;LOINC&quot; display 'Overall summary score [KCCQ]'\ncode &quot;Physical limitation score [KCCQ]&quot;: '72195-1' from &quot;LOINC&quot; display 'Physical limitation score [KCCQ]'\ncode &quot;Physical score [MLHFQ]&quot;: '85618-7' from &quot;LOINC&quot; display 'Physical score [MLHFQ]'\ncode &quot;PROMIS-10 Global Mental Health (GMH) score T-score&quot;: '71969-0' from &quot;LOINC&quot; display 'PROMIS-10 Global Mental Health (GMH) score T-score'\ncode &quot;PROMIS-10 Global Physical Health (GPH) score T-score&quot;: '71971-6' from &quot;LOINC&quot; display 'PROMIS-10 Global Physical Health (GPH) score T-score'\ncode &quot;PROMIS-29 Anxiety score T-score&quot;: '71967-4' from &quot;LOINC&quot; display 'PROMIS-29 Anxiety score T-score'\ncode &quot;PROMIS-29 Depression score T-score&quot;: '71965-8' from &quot;LOINC&quot; display 'PROMIS-29 Depression score T-score'\ncode &quot;PROMIS-29 Fatigue score T-score&quot;: '71963-3' from &quot;LOINC&quot; display 'PROMIS-29 Fatigue score T-score'\ncode &quot;PROMIS-29 Pain interference score T-score&quot;: '71961-7' from &quot;LOINC&quot; display 'PROMIS-29 Pain interference score T-score'\ncode &quot;PROMIS-29 Physical function score T-score&quot;: '71959-1' from &quot;LOINC&quot; display 'PROMIS-29 Physical function score T-score'\ncode &quot;PROMIS-29 Satisfaction with participation in social roles score T-score&quot;: '71957-5' from &quot;LOINC&quot; display 'PROMIS-29 Satisfaction with participation in social roles score T-score'\ncode &quot;PROMIS-29 Sleep disturbance score T-score&quot;: '71955-9' from &quot;LOINC&quot; display 'PROMIS-29 Sleep disturbance score T-score'\ncode &quot;Quality of life score [KCCQ]&quot;: '72189-4' from &quot;LOINC&quot; display 'Quality of life score [KCCQ]'\ncode &quot;Self-efficacy score [KCCQ]&quot;: '72190-2' from &quot;LOINC&quot; display 'Self-efficacy score [KCCQ]'\ncode &quot;Severe cognitive impairment (finding)&quot;: '702956004' from &quot;SNOMEDCT&quot; display 'Severe cognitive impairment (finding)'\ncode &quot;Social limitation score [KCCQ]&quot;: '72196-9' from &quot;LOINC&quot; display 'Social limitation score [KCCQ]'\ncode &quot;Symptom stability score [KCCQ]&quot;: '72194-4' from &quot;LOINC&quot; display 'Symptom stability score [KCCQ]'\ncode &quot;Total symptom score [KCCQ]&quot;: '72191-0' from &quot;LOINC&quot; display 'Total symptom score [KCCQ]'\ncode &quot;VR-12 Mental component summary (MCS) score - oblique method T-score&quot;: '72026-8' from &quot;LOINC&quot; display 'VR-12 Mental component summary (MCS) score - oblique method T-score'\ncode &quot;VR-12 Mental component summary (MCS) score - orthogonal method T-score&quot;: '72028-4' from &quot;LOINC&quot; display 'VR-12 Mental component summary (MCS) score - orthogonal method T-score'\ncode &quot;VR-12 Physical component summary (PCS) score - oblique method T-score&quot;: '72025-0' from &quot;LOINC&quot; display 'VR-12 Physical component summary (PCS) score - oblique method T-score'\ncode &quot;VR-12 Physical component summary (PCS) score - orthogonal method T-score&quot;: '72027-6' from &quot;LOINC&quot; display 'VR-12 Physical component summary (PCS) score - orthogonal method T-score'\ncode &quot;VR-36 Mental component summary (MCS) score - oblique method T-score&quot;: '71990-6' from &quot;LOINC&quot; display 'VR-36 Mental component summary (MCS) score - oblique method T-score'\ncode &quot;VR-36 Mental component summary (MCS) score - orthogonal method T-score&quot;: '72008-6' from &quot;LOINC&quot; display 'VR-36 Mental component summary (MCS) score - orthogonal method T-score'\ncode &quot;VR-36 Physical component summary (PCS) score - oblique method T-score&quot;: '71989-8' from &quot;LOINC&quot; display 'VR-36 Physical component summary (PCS) score - oblique method T-score'\ncode &quot;VR-36 Physical component summary (PCS) score - orthogonal method T-score&quot;: '72007-8' from &quot;LOINC&quot; display 'VR-36 Physical component summary (PCS) score - orthogonal method T-score'\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  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 18\n    and exists ( // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n      // Original:\n      //   ( ( [ConditionProblemsHealthConcerns: &quot;Heart Failure&quot;]\n      //       union [ConditionEncounterDiagnosis: &quot;Heart Failure&quot;]\n      //   ).verified ( ) )\n      ( ( [FHIR.Condition: &quot;Heart Failure&quot;] ).verified ( ) ) HeartFailure\n        where HeartFailure.prevalenceInterval ( ) overlaps before day of &quot;Measurement Period&quot;\n    )\n    and exists ( &quot;Outpatient Encounters with at least one subsequent Outpatient Encounter during Measurement Period&quot; )\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  Hospice.&quot;Has Hospice Services&quot;\n    or exists ( // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n      // Original:\n      //   ( ( [ConditionProblemsHealthConcerns: &quot;Severe cognitive impairment (finding)&quot;]\n      //       union [ConditionEncounterDiagnosis: &quot;Severe cognitive impairment (finding)&quot;]\n      //   ).verified ( ) )\n      ( ( [FHIR.Condition: &quot;Severe cognitive impairment (finding)&quot;] ).verified ( ) ) SevereCognitiveImpairment\n        where SevereCognitiveImpairment.prevalenceInterval ( ) overlaps day of &quot;Measurement Period&quot;\n    )\n\ndefine &quot;Numerator&quot;:\n  ( &quot;Has Encounter with Initial and Follow Up PROMIS10 Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up PROMIS29 Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up VR12 Oblique Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up VR12 Orthogonal Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up VR36 Oblique Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up VR36 Orthogonal Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up MLHFQ Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up KCCQ12 Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up KCCQ Domain Score Assessments&quot; )\n    or ( &quot;Has Encounter with Initial and Follow Up KCCQ Total Score Assessments&quot; )\n\ndefine &quot;Outpatient Encounters with at least one subsequent Outpatient Encounter during Measurement Period&quot;:\n  from\n    &quot;Qualifying Encounters&quot; OfficeVisit1\n    with &quot;Qualifying Encounters&quot; OfficeVisit2\n      such that OfficeVisit2.period starts 1 day or more after day of end of OfficeVisit1.period\n\ndefine &quot;Qualifying Encounters&quot;:\n  ( ( [Encounter: &quot;Office Visit&quot;]\n      union [Encounter: &quot;Telephone Visits&quot;]\n      union [Encounter: &quot;Virtual Encounter&quot;]\n  ).isEncounterPerformed ( ) ) ValidEncounter\n    where ValidEncounter.period during day of &quot;Measurement Period&quot;\n\ndefine &quot;Has Encounter with Initial and Follow Up PROMIS10 Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date PROMIS10 Total Assessment Completed&quot; InitialPROMIS10Date,\n      &quot;Date PROMIS10 Total Assessment Completed&quot; FollowupPROMIS10Date\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialPROMIS10Date 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupPROMIS10Date during day of Interval[date from InitialPROMIS10Date + 30 days, date from InitialPROMIS10Date + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date PROMIS10 Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-10 Global Mental Health (GMH) score T-score&quot;] ).isAssessmentPerformed ( ) ) PROMIS10MentalScore,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-10 Global Physical Health (GPH) score T-score&quot;] ).isAssessmentPerformed ( ) ) PROMIS10PhysicalScore\n    let PROMIS10MentalScoreDate: date from start of PROMIS10MentalScore.effective.toInterval ( ),\n    PROMIS10PhysicalScoreDate: date from start of PROMIS10PhysicalScore.effective.toInterval ( )\n    where PROMIS10MentalScoreDate same day as PROMIS10PhysicalScoreDate\n      and ( PROMIS10MentalScore as ObservationScreeningAssessment ).value is not null\n      and ( PROMIS10PhysicalScore as ObservationScreeningAssessment ).value is not null\n    return PROMIS10MentalScoreDate\n\ndefine &quot;Has Encounter with Initial and Follow Up PROMIS29 Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date PROMIS29 Total Assessment Completed&quot; InitialPROMIS29Date,\n      &quot;Date PROMIS29 Total Assessment Completed&quot; FollowupPROMIS29Date\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialPROMIS29Date 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupPROMIS29Date during day of Interval[date from InitialPROMIS29Date + 30 days, date from InitialPROMIS29Date + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date PROMIS29 Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Sleep disturbance score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29Sleep,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Satisfaction with participation in social roles score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29SocialRoles,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Physical function score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29Physical,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Pain interference score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29Pain,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Fatigue score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29Fatigue,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Depression score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29Depression,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-29 Anxiety score T-score&quot;] ).isAssessmentPerformed ( ) ) Promis29Anxiety\n    let Promis29SleepDate: date from start of Promis29Sleep.effective.toInterval ( ),\n    Promis29SocialRolesDate: date from start of Promis29SocialRoles.effective.toInterval ( ),\n    Promis29PhysicalDate: date from start of Promis29Physical.effective.toInterval ( ),\n    Promis29PainDate: date from start of Promis29Pain.effective.toInterval ( ),\n    Promis29FatigueDate: date from start of Promis29Fatigue.effective.toInterval ( ),\n    Promis29DepressionDate: date from start of Promis29Depression.effective.toInterval ( ),\n    Promis29AnxietyDate: date from start of Promis29Anxiety.effective.toInterval ( )\n    where Promis29SleepDate same day as Promis29SocialRolesDate\n      and Promis29SocialRoles.value is not null\n      and Promis29SleepDate same day as Promis29PhysicalDate\n      and Promis29Physical.value is not null\n      and Promis29SleepDate same day as Promis29PainDate\n      and Promis29Pain.value is not null\n      and Promis29SleepDate same day as Promis29FatigueDate\n      and Promis29Fatigue.value is not null\n      and Promis29SleepDate same day as Promis29DepressionDate\n      and Promis29Depression.value is not null\n      and Promis29SleepDate same day as Promis29AnxietyDate\n      and Promis29Anxiety.value is not null\n      and Promis29Sleep.value is not null\n    return Promis29SleepDate\n\ndefine &quot;Has Encounter with Initial and Follow Up VR12 Oblique Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date VR12 Oblique Total Assessment Completed&quot; InitialVR12ObliqueDate,\n      &quot;Date VR12 Oblique Total Assessment Completed&quot; FollowupVR12ObliqueDate\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialVR12ObliqueDate 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupVR12ObliqueDate during day of Interval[date from InitialVR12ObliqueDate + 30 days, date from InitialVR12ObliqueDate + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date VR12 Oblique Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Mental component summary (MCS) score - oblique method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12MentalAssessment,\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Physical component summary (PCS) score - oblique method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12PhysicalAssessment\n    let VR12MentalAssessmentDate: date from start of VR12MentalAssessment.effective.toInterval ( ),\n    VR12PhysicalAssessmentDate: date from start of VR12PhysicalAssessment.effective.toInterval ( )\n    where VR12MentalAssessmentDate same day as VR12PhysicalAssessmentDate\n      and ( VR12MentalAssessment as ObservationScreeningAssessment ).value is not null\n      and ( VR12PhysicalAssessment as ObservationScreeningAssessment ).value is not null\n    return VR12MentalAssessmentDate\n\ndefine &quot;Has Encounter with Initial and Follow Up VR12 Orthogonal Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date VR12 Orthogonal Total Assessment Completed&quot; InitialVR12OrthogonalDate,\n      &quot;Date VR12 Orthogonal Total Assessment Completed&quot; FollowupVR12OrthogonalDate\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialVR12OrthogonalDate 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupVR12OrthogonalDate during day of Interval[date from InitialVR12OrthogonalDate + 30 days, date from InitialVR12OrthogonalDate + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date VR12 Orthogonal Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Mental component summary (MCS) score - orthogonal method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12MentalAssessment,\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Physical component summary (PCS) score - orthogonal method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12PhysicalAssessment\n    let VR12MentalAssessmentDate: date from start of VR12MentalAssessment.effective.toInterval ( ),\n    VR12PhysicalAssessmentDate: date from start of VR12PhysicalAssessment.effective.toInterval ( )\n    where VR12MentalAssessmentDate same day as VR12PhysicalAssessmentDate\n      and ( VR12MentalAssessment as ObservationScreeningAssessment ).value is not null\n      and ( VR12PhysicalAssessment as ObservationScreeningAssessment ).value is not null\n    return VR12MentalAssessmentDate\n\ndefine &quot;Has Encounter with Initial and Follow Up VR36 Oblique Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date VR36 Oblique Total Assessment Completed&quot; InitialVR36ObliqueDate,\n      &quot;Date VR36 Oblique Total Assessment Completed&quot; FollowupVR36ObliqueDate\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialVR36ObliqueDate 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupVR36ObliqueDate during day of Interval[date from InitialVR36ObliqueDate + 30 days, date from InitialVR36ObliqueDate + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date VR36 Oblique Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;VR-36 Mental component summary (MCS) score - oblique method T-score&quot;] ).isAssessmentPerformed ( ) ) VR36MentalAssessment,\n    ( ( [ObservationScreeningAssessment: &quot;VR-36 Physical component summary (PCS) score - oblique method T-score&quot;] ).isAssessmentPerformed ( ) ) VR36PhysicalAssessment\n    let VR36MentalAssessmentDate: date from start of VR36MentalAssessment.effective.toInterval ( ),\n    VR36PhysicalAssessmentDate: date from start of VR36PhysicalAssessment.effective.toInterval ( )\n    where VR36MentalAssessmentDate same day as VR36PhysicalAssessmentDate\n      and ( VR36MentalAssessment as ObservationScreeningAssessment ).value is not null\n      and ( VR36PhysicalAssessment as ObservationScreeningAssessment ).value is not null\n    return VR36MentalAssessmentDate\n\ndefine &quot;Has Encounter with Initial and Follow Up VR36 Orthogonal Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date VR36 Orthogonal Total Assessment Completed&quot; InitialVR36OrthogonalDate,\n      &quot;Date VR36 Orthogonal Total Assessment Completed&quot; FollowupVR36OrthogonalDate\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialVR36OrthogonalDate 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupVR36OrthogonalDate during day of Interval[date from InitialVR36OrthogonalDate + 30 days, date from InitialVR36OrthogonalDate + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date VR36 Orthogonal Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;VR-36 Mental component summary (MCS) score - orthogonal method T-score&quot;] ).isAssessmentPerformed ( ) ) VR36MentalAssessment,\n    ( ( [ObservationScreeningAssessment: &quot;VR-36 Physical component summary (PCS) score - orthogonal method T-score&quot;] ).isAssessmentPerformed ( ) ) VR36PhysicalAssessment\n    let VR36MentalAssessmentDate: date from start of VR36MentalAssessment.effective.toInterval ( ),\n    VR36PhysicalAssessmentDate: date from start of VR36PhysicalAssessment.effective.toInterval ( )\n    where VR36MentalAssessmentDate same day as VR36PhysicalAssessmentDate\n      and ( VR36MentalAssessment as ObservationScreeningAssessment ).value is not null\n      and ( VR36PhysicalAssessment as ObservationScreeningAssessment ).value is not null\n    return VR36MentalAssessmentDate\n\ndefine &quot;Has Encounter with Initial and Follow Up MLHFQ Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date MLHFQ Total Assessment Completed&quot; InitialMLHFQDate,\n      &quot;Date MLHFQ Total Assessment Completed&quot; FollowupMLHFQDate\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialMLHFQDate 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupMLHFQDate during day of Interval[date from InitialMLHFQDate + 30 days, date from InitialMLHFQDate + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date MLHFQ Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;Physical score [MLHFQ]&quot;] ).isAssessmentPerformed ( ) ) MLHFQPhysical,\n    ( ( [ObservationScreeningAssessment: &quot;Emotional score [MLHFQ]&quot;] ).isAssessmentPerformed ( ) ) MLHFQEmotional\n    let MLHFQPhysicalDate: date from start of MLHFQPhysical.effective.toInterval ( ),\n    MLHFQEmotionalDate: date from start of MLHFQEmotional.effective.toInterval ( )\n    where MLHFQPhysicalDate same day as MLHFQEmotionalDate\n      and ( MLHFQPhysical as ObservationScreeningAssessment ).value is not null\n      and ( MLHFQEmotional as ObservationScreeningAssessment ).value is not null\n    return MLHFQPhysicalDate\n\ndefine &quot;Has Encounter with Initial and Follow Up KCCQ12 Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date KCCQ12 Total Assessment Completed&quot; InitialKCCQ12Date,\n      &quot;Date KCCQ12 Total Assessment Completed&quot; FollowupKCCQ12Date\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialKCCQ12Date 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupKCCQ12Date during day of Interval[date from InitialKCCQ12Date + 30 days, date from InitialKCCQ12Date + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date KCCQ12 Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;Kansas City Cardiomyopathy Questionnaire - 12 item [KCCQ-12]&quot;] ).isAssessmentPerformed ( ) ) KCCQ12Item,\n    ( ( [ObservationScreeningAssessment: &quot;Overall summary score [KCCQ-12]&quot;] ).isAssessmentPerformed ( ) ) KCCQ12Summary\n    let KCCQ12ItemDate: date from start of KCCQ12Item.effective.toInterval ( ),\n    KCCQ12SummaryDate: date from start of KCCQ12Summary.effective.toInterval ( )\n    where KCCQ12ItemDate same day as KCCQ12SummaryDate\n      and ( KCCQ12Item as ObservationScreeningAssessment ).value is not null\n      and ( KCCQ12Summary as ObservationScreeningAssessment ).value is not null\n    return KCCQ12ItemDate\n\ndefine &quot;Has Encounter with Initial and Follow Up KCCQ Domain Score Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date KCCQ Domain Assessment Completed&quot; InitialKCCQAssessmentDate,\n      &quot;Date KCCQ Domain Assessment Completed&quot; FollowupKCCQAssessmentDate\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialKCCQAssessmentDate 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupKCCQAssessmentDate during day of Interval[date from InitialKCCQAssessmentDate + 30 days, date from InitialKCCQAssessmentDate + 180 days]\n      return ValidEncounters\n  )\n\ndefine &quot;Date KCCQ Domain Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;Quality of life score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQLifeQuality,\n    ( ( [ObservationScreeningAssessment: &quot;Symptom stability score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQSymptomStability,\n    ( ( [ObservationScreeningAssessment: &quot;Self-efficacy score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQSelfEfficacy,\n    ( ( [ObservationScreeningAssessment: &quot;Total symptom score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQSymptoms,\n    ( ( [ObservationScreeningAssessment: &quot;Physical limitation score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQPhysicalLimits,\n    ( ( [ObservationScreeningAssessment: &quot;Social limitation score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQSocialLimits\n    let KCCQLifeQualityDate: date from start of KCCQLifeQuality.effective.toInterval ( ),\n    KCCQSymptomStabilityDate: date from start of KCCQSymptomStability.effective.toInterval ( ),\n    KCCQSelfEfficacyDate: date from start of KCCQSelfEfficacy.effective.toInterval ( ),\n    KCCQSymptomsDate: date from start of KCCQSymptoms.effective.toInterval ( ),\n    KCCQPhysicalLimitsDate: date from start of KCCQPhysicalLimits.effective.toInterval ( ),\n    KCCQSocialLimitsDate: date from start of KCCQSocialLimits.effective.toInterval ( )\n    where KCCQLifeQualityDate same day as KCCQSymptomStabilityDate\n      and ( KCCQSymptomStability as ObservationScreeningAssessment ).value is not null\n      and KCCQLifeQualityDate same day as KCCQSelfEfficacyDate\n      and ( KCCQSelfEfficacy as ObservationScreeningAssessment ).value is not null\n      and KCCQLifeQualityDate same day as KCCQSymptomsDate\n      and ( KCCQSymptoms as ObservationScreeningAssessment ).value is not null\n      and KCCQLifeQualityDate same day as KCCQPhysicalLimitsDate\n      and ( KCCQPhysicalLimits as ObservationScreeningAssessment ).value is not null\n      and KCCQLifeQualityDate same day as KCCQSocialLimitsDate\n      and ( KCCQSocialLimits as ObservationScreeningAssessment ).value is not null\n      and ( KCCQLifeQuality as ObservationScreeningAssessment ).value is not null\n    return KCCQLifeQualityDate\n\ndefine &quot;Date KCCQ Total Assessment Completed&quot;:\n  ( ( [ObservationScreeningAssessment: &quot;Overall summary score [KCCQ]&quot;] ).isAssessmentPerformed ( ) ) KCCQSummaryScore\n    where ( KCCQSummaryScore as ObservationScreeningAssessment ).value is not null\n    return date from start of KCCQSummaryScore.effective.toInterval ( )\n\ndefine &quot;Has Encounter with Initial and Follow Up KCCQ Total Score Assessments&quot;:\n  exists ( from\n      &quot;Qualifying Encounters&quot; ValidEncounters,\n      &quot;Date KCCQ Total Assessment Completed&quot; InitialKCCQTotalScore,\n      &quot;Date KCCQ Total Assessment Completed&quot; FollowupKCCQTotalScore\n      where ValidEncounters.period ends 180 days or more before day of end of &quot;Measurement Period&quot;\n        and InitialKCCQTotalScore 14 days or less on or before day of end of ValidEncounters.period\n        and date from FollowupKCCQTotalScore during day of Interval[date from InitialKCCQTotalScore + 30 days, date from InitialKCCQTotalScore + 180 days]\n      return ValidEncounters\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/CMS90FHIRFSAforHeartFailure",
  "version" : "1.1.000",
  "name" : "CMS90FHIRFSAforHeartFailure",
  "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" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM5MEZISVJGU0Fmb3JIZWFydEZhaWx1cmUgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgVVNRdWFsaXR5Q29yZUNvbW1vbiB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJyBjYWxsZWQgVVNRdWFsaXR5Q29yZUNvbW1vbgppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc2LjEuMDAwJyBjYWxsZWQgU0RFCmluY2x1ZGUgU3RhdHVzIHZlcnNpb24gJzIuMS4wMDAnIGNhbGxlZCBTdGF0dXMKaW5jbHVkZSBIb3NwaWNlIHZlcnNpb24gJzcuMS4wMDAnIGNhbGxlZCBIb3NwaWNlCgpjb2Rlc3lzdGVtICJMT0lOQyI6ICdodHRwOi8vbG9pbmMub3JnJwpjb2Rlc3lzdGVtICJTTk9NRURDVCI6ICdodHRwOi8vc25vbWVkLmluZm8vc2N0JwoKdmFsdWVzZXQgIkhlYXJ0IEZhaWx1cmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzc2Jwp2YWx1ZXNldCAiT2ZmaWNlIFZpc2l0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDAxJwp2YWx1ZXNldCAiVmlydHVhbCBFbmNvdW50ZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwODknCnZhbHVlc2V0ICJUZWxlcGhvbmUgVmlzaXRzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDgwJwoKY29kZSAiRW1vdGlvbmFsIHNjb3JlIFtNTEhGUV0iOiAnODU2MDktNicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0Vtb3Rpb25hbCBzY29yZSBbTUxIRlFdJwpjb2RlICJLYW5zYXMgQ2l0eSBDYXJkaW9teW9wYXRoeSBRdWVzdGlvbm5haXJlIC0gMTIgaXRlbSBbS0NDUS0xMl0iOiAnODY5MjMtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0thbnNhcyBDaXR5IENhcmRpb215b3BhdGh5IFF1ZXN0aW9ubmFpcmUgLSAxMiBpdGVtIFtLQ0NRLTEyXScKY29kZSAiT3ZlcmFsbCBzdW1tYXJ5IHNjb3JlIFtLQ0NRLTEyXSI6ICc4NjkyNC04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnT3ZlcmFsbCBzdW1tYXJ5IHNjb3JlIFtLQ0NRLTEyXScKY29kZSAiT3ZlcmFsbCBzdW1tYXJ5IHNjb3JlIFtLQ0NRXSI6ICc3MTk0MC0xJyBmcm9tICJMT0lOQyIgZGlzcGxheSAnT3ZlcmFsbCBzdW1tYXJ5IHNjb3JlIFtLQ0NRXScKY29kZSAiUGh5c2ljYWwgbGltaXRhdGlvbiBzY29yZSBbS0NDUV0iOiAnNzIxOTUtMScgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BoeXNpY2FsIGxpbWl0YXRpb24gc2NvcmUgW0tDQ1FdJwpjb2RlICJQaHlzaWNhbCBzY29yZSBbTUxIRlFdIjogJzg1NjE4LTcnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdQaHlzaWNhbCBzY29yZSBbTUxIRlFdJwpjb2RlICJQUk9NSVMtMTAgR2xvYmFsIE1lbnRhbCBIZWFsdGggKEdNSCkgc2NvcmUgVC1zY29yZSI6ICc3MTk2OS0wJyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUFJPTUlTLTEwIEdsb2JhbCBNZW50YWwgSGVhbHRoIChHTUgpIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0xMCBHbG9iYWwgUGh5c2ljYWwgSGVhbHRoIChHUEgpIHNjb3JlIFQtc2NvcmUiOiAnNzE5NzEtNicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BST01JUy0xMCBHbG9iYWwgUGh5c2ljYWwgSGVhbHRoIChHUEgpIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0yOSBBbnhpZXR5IHNjb3JlIFQtc2NvcmUiOiAnNzE5NjctNCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BST01JUy0yOSBBbnhpZXR5IHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0yOSBEZXByZXNzaW9uIHNjb3JlIFQtc2NvcmUiOiAnNzE5NjUtOCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BST01JUy0yOSBEZXByZXNzaW9uIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0yOSBGYXRpZ3VlIHNjb3JlIFQtc2NvcmUiOiAnNzE5NjMtMycgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BST01JUy0yOSBGYXRpZ3VlIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0yOSBQYWluIGludGVyZmVyZW5jZSBzY29yZSBULXNjb3JlIjogJzcxOTYxLTcnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdQUk9NSVMtMjkgUGFpbiBpbnRlcmZlcmVuY2Ugc2NvcmUgVC1zY29yZScKY29kZSAiUFJPTUlTLTI5IFBoeXNpY2FsIGZ1bmN0aW9uIHNjb3JlIFQtc2NvcmUiOiAnNzE5NTktMScgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BST01JUy0yOSBQaHlzaWNhbCBmdW5jdGlvbiBzY29yZSBULXNjb3JlJwpjb2RlICJQUk9NSVMtMjkgU2F0aXNmYWN0aW9uIHdpdGggcGFydGljaXBhdGlvbiBpbiBzb2NpYWwgcm9sZXMgc2NvcmUgVC1zY29yZSI6ICc3MTk1Ny01JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUFJPTUlTLTI5IFNhdGlzZmFjdGlvbiB3aXRoIHBhcnRpY2lwYXRpb24gaW4gc29jaWFsIHJvbGVzIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0yOSBTbGVlcCBkaXN0dXJiYW5jZSBzY29yZSBULXNjb3JlIjogJzcxOTU1LTknIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdQUk9NSVMtMjkgU2xlZXAgZGlzdHVyYmFuY2Ugc2NvcmUgVC1zY29yZScKY29kZSAiUXVhbGl0eSBvZiBsaWZlIHNjb3JlIFtLQ0NRXSI6ICc3MjE4OS00JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUXVhbGl0eSBvZiBsaWZlIHNjb3JlIFtLQ0NRXScKY29kZSAiU2VsZi1lZmZpY2FjeSBzY29yZSBbS0NDUV0iOiAnNzIxOTAtMicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1NlbGYtZWZmaWNhY3kgc2NvcmUgW0tDQ1FdJwpjb2RlICJTZXZlcmUgY29nbml0aXZlIGltcGFpcm1lbnQgKGZpbmRpbmcpIjogJzcwMjk1NjAwNCcgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ1NldmVyZSBjb2duaXRpdmUgaW1wYWlybWVudCAoZmluZGluZyknCmNvZGUgIlNvY2lhbCBsaW1pdGF0aW9uIHNjb3JlIFtLQ0NRXSI6ICc3MjE5Ni05JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnU29jaWFsIGxpbWl0YXRpb24gc2NvcmUgW0tDQ1FdJwpjb2RlICJTeW1wdG9tIHN0YWJpbGl0eSBzY29yZSBbS0NDUV0iOiAnNzIxOTQtNCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1N5bXB0b20gc3RhYmlsaXR5IHNjb3JlIFtLQ0NRXScKY29kZSAiVG90YWwgc3ltcHRvbSBzY29yZSBbS0NDUV0iOiAnNzIxOTEtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1RvdGFsIHN5bXB0b20gc2NvcmUgW0tDQ1FdJwpjb2RlICJWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlIjogJzcyMDI2LTgnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlJwpjb2RlICJWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlIjogJzcyMDI4LTQnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlJwpjb2RlICJWUi0xMiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ibGlxdWUgbWV0aG9kIFQtc2NvcmUiOiAnNzIwMjUtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1ZSLTEyIFBoeXNpY2FsIGNvbXBvbmVudCBzdW1tYXJ5IChQQ1MpIHNjb3JlIC0gb2JsaXF1ZSBtZXRob2QgVC1zY29yZScKY29kZSAiVlItMTIgUGh5c2ljYWwgY29tcG9uZW50IHN1bW1hcnkgKFBDUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlIjogJzcyMDI3LTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdWUi0xMiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUnCmNvZGUgIlZSLTM2IE1lbnRhbCBjb21wb25lbnQgc3VtbWFyeSAoTUNTKSBzY29yZSAtIG9ibGlxdWUgbWV0aG9kIFQtc2NvcmUiOiAnNzE5OTAtNicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1ZSLTM2IE1lbnRhbCBjb21wb25lbnQgc3VtbWFyeSAoTUNTKSBzY29yZSAtIG9ibGlxdWUgbWV0aG9kIFQtc2NvcmUnCmNvZGUgIlZSLTM2IE1lbnRhbCBjb21wb25lbnQgc3VtbWFyeSAoTUNTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUiOiAnNzIwMDgtNicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1ZSLTM2IE1lbnRhbCBjb21wb25lbnQgc3VtbWFyeSAoTUNTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUnCmNvZGUgIlZSLTM2IFBoeXNpY2FsIGNvbXBvbmVudCBzdW1tYXJ5IChQQ1MpIHNjb3JlIC0gb2JsaXF1ZSBtZXRob2QgVC1zY29yZSI6ICc3MTk4OS04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnVlItMzYgUGh5c2ljYWwgY29tcG9uZW50IHN1bW1hcnkgKFBDUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlJwpjb2RlICJWUi0zNiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUiOiAnNzIwMDctOCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1ZSLTM2IFBoeXNpY2FsIGNvbXBvbmVudCBzdW1tYXJ5IChQQ1MpIHNjb3JlIC0gb3J0aG9nb25hbCBtZXRob2QgVC1zY29yZScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDE4CiAgICBhbmQgZXhpc3RzICggLy8gW0UtMTNdIGJhc2UgRkhJUi5Db25kaXRpb24gcmV0cmlldmUgKGRlZmVjdC10cmFja2luZy9lbmdpbmUtaXNzdWVzLm1kIEUtMTMpCiAgICAgIC8vIE9yaWdpbmFsOgogICAgICAvLyAgICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkhlYXJ0IEZhaWx1cmUiXQogICAgICAvLyAgICAgICB1bmlvbiBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzOiAiSGVhcnQgRmFpbHVyZSJdCiAgICAgIC8vICAgKS52ZXJpZmllZCAoICkgKQogICAgICAoICggW0ZISVIuQ29uZGl0aW9uOiAiSGVhcnQgRmFpbHVyZSJdICkudmVyaWZpZWQgKCApICkgSGVhcnRGYWlsdXJlCiAgICAgICAgd2hlcmUgSGVhcnRGYWlsdXJlLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgYmVmb3JlIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgKQogICAgYW5kIGV4aXN0cyAoICJPdXRwYXRpZW50IEVuY291bnRlcnMgd2l0aCBhdCBsZWFzdCBvbmUgc3Vic2VxdWVudCBPdXRwYXRpZW50IEVuY291bnRlciBkdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICBIb3NwaWNlLiJIYXMgSG9zcGljZSBTZXJ2aWNlcyIKICAgIG9yIGV4aXN0cyAoIC8vIFtFLTEzXSBiYXNlIEZISVIuQ29uZGl0aW9uIHJldHJpZXZlIChkZWZlY3QtdHJhY2tpbmcvZW5naW5lLWlzc3Vlcy5tZCBFLTEzKQogICAgICAvLyBPcmlnaW5hbDoKICAgICAgLy8gICAoICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJTZXZlcmUgY29nbml0aXZlIGltcGFpcm1lbnQgKGZpbmRpbmcpIl0KICAgICAgLy8gICAgICAgdW5pb24gW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3NpczogIlNldmVyZSBjb2duaXRpdmUgaW1wYWlybWVudCAoZmluZGluZykiXQogICAgICAvLyAgICkudmVyaWZpZWQgKCApICkKICAgICAgKCAoIFtGSElSLkNvbmRpdGlvbjogIlNldmVyZSBjb2duaXRpdmUgaW1wYWlybWVudCAoZmluZGluZykiXSApLnZlcmlmaWVkICggKSApIFNldmVyZUNvZ25pdGl2ZUltcGFpcm1lbnQKICAgICAgICB3aGVyZSBTZXZlcmVDb2duaXRpdmVJbXBhaXJtZW50LnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICApCgpkZWZpbmUgIk51bWVyYXRvciI6CiAgKCAiSGFzIEVuY291bnRlciB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBQUk9NSVMxMCBBc3Nlc3NtZW50cyIgKQogICAgb3IgKCAiSGFzIEVuY291bnRlciB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBQUk9NSVMyOSBBc3Nlc3NtZW50cyIgKQogICAgb3IgKCAiSGFzIEVuY291bnRlciB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBWUjEyIE9ibGlxdWUgQXNzZXNzbWVudHMiICkKICAgIG9yICggIkhhcyBFbmNvdW50ZXIgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgVlIxMiBPcnRob2dvbmFsIEFzc2Vzc21lbnRzIiApCiAgICBvciAoICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIFZSMzYgT2JsaXF1ZSBBc3Nlc3NtZW50cyIgKQogICAgb3IgKCAiSGFzIEVuY291bnRlciB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBWUjM2IE9ydGhvZ29uYWwgQXNzZXNzbWVudHMiICkKICAgIG9yICggIkhhcyBFbmNvdW50ZXIgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgTUxIRlEgQXNzZXNzbWVudHMiICkKICAgIG9yICggIkhhcyBFbmNvdW50ZXIgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgS0NDUTEyIEFzc2Vzc21lbnRzIiApCiAgICBvciAoICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIEtDQ1EgRG9tYWluIFNjb3JlIEFzc2Vzc21lbnRzIiApCiAgICBvciAoICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIEtDQ1EgVG90YWwgU2NvcmUgQXNzZXNzbWVudHMiICkKCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXJzIHdpdGggYXQgbGVhc3Qgb25lIHN1YnNlcXVlbnQgT3V0cGF0aWVudCBFbmNvdW50ZXIgZHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgZnJvbQogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVycyIgT2ZmaWNlVmlzaXQxCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlcnMiIE9mZmljZVZpc2l0MgogICAgICBzdWNoIHRoYXQgT2ZmaWNlVmlzaXQyLnBlcmlvZCBzdGFydHMgMSBkYXkgb3IgbW9yZSBhZnRlciBkYXkgb2YgZW5kIG9mIE9mZmljZVZpc2l0MS5wZXJpb2QKCmRlZmluZSAiUXVhbGlmeWluZyBFbmNvdW50ZXJzIjoKICAoICggW0VuY291bnRlcjogIk9mZmljZSBWaXNpdCJdCiAgICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJUZWxlcGhvbmUgVmlzaXRzIl0KICAgICAgdW5pb24gW0VuY291bnRlcjogIlZpcnR1YWwgRW5jb3VudGVyIl0KICApLmlzRW5jb3VudGVyUGVyZm9ybWVkICggKSApIFZhbGlkRW5jb3VudGVyCiAgICB3aGVyZSBWYWxpZEVuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIFBST01JUzEwIEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCBmcm9tCiAgICAgICJRdWFsaWZ5aW5nIEVuY291bnRlcnMiIFZhbGlkRW5jb3VudGVycywKICAgICAgIkRhdGUgUFJPTUlTMTAgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxQUk9NSVMxMERhdGUsCiAgICAgICJEYXRlIFBST01JUzEwIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBGb2xsb3d1cFBST01JUzEwRGF0ZQogICAgICB3aGVyZSBWYWxpZEVuY291bnRlcnMucGVyaW9kIGVuZHMgMTgwIGRheXMgb3IgbW9yZSBiZWZvcmUgZGF5IG9mIGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICAgIGFuZCBJbml0aWFsUFJPTUlTMTBEYXRlIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIGVuZCBvZiBWYWxpZEVuY291bnRlcnMucGVyaW9kCiAgICAgICAgYW5kIGRhdGUgZnJvbSBGb2xsb3d1cFBST01JUzEwRGF0ZSBkdXJpbmcgZGF5IG9mIEludGVydmFsW2RhdGUgZnJvbSBJbml0aWFsUFJPTUlTMTBEYXRlICsgMzAgZGF5cywgZGF0ZSBmcm9tIEluaXRpYWxQUk9NSVMxMERhdGUgKyAxODAgZGF5c10KICAgICAgcmV0dXJuIFZhbGlkRW5jb3VudGVycwogICkKCmRlZmluZSAiRGF0ZSBQUk9NSVMxMCBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCI6CiAgZnJvbQogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQUk9NSVMtMTAgR2xvYmFsIE1lbnRhbCBIZWFsdGggKEdNSCkgc2NvcmUgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFBST01JUzEwTWVudGFsU2NvcmUsCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlBST01JUy0xMCBHbG9iYWwgUGh5c2ljYWwgSGVhbHRoIChHUEgpIHNjb3JlIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBQUk9NSVMxMFBoeXNpY2FsU2NvcmUKICAgIGxldCBQUk9NSVMxME1lbnRhbFNjb3JlRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFBST01JUzEwTWVudGFsU2NvcmUuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgUFJPTUlTMTBQaHlzaWNhbFNjb3JlRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFBST01JUzEwUGh5c2ljYWxTY29yZS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgIHdoZXJlIFBST01JUzEwTWVudGFsU2NvcmVEYXRlIHNhbWUgZGF5IGFzIFBST01JUzEwUGh5c2ljYWxTY29yZURhdGUKICAgICAgYW5kICggUFJPTUlTMTBNZW50YWxTY29yZSBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgKCBQUk9NSVMxMFBoeXNpY2FsU2NvcmUgYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgIHJldHVybiBQUk9NSVMxME1lbnRhbFNjb3JlRGF0ZQoKZGVmaW5lICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIFBST01JUzI5IEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCBmcm9tCiAgICAgICJRdWFsaWZ5aW5nIEVuY291bnRlcnMiIFZhbGlkRW5jb3VudGVycywKICAgICAgIkRhdGUgUFJPTUlTMjkgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxQUk9NSVMyOURhdGUsCiAgICAgICJEYXRlIFBST01JUzI5IFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBGb2xsb3d1cFBST01JUzI5RGF0ZQogICAgICB3aGVyZSBWYWxpZEVuY291bnRlcnMucGVyaW9kIGVuZHMgMTgwIGRheXMgb3IgbW9yZSBiZWZvcmUgZGF5IG9mIGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICAgIGFuZCBJbml0aWFsUFJPTUlTMjlEYXRlIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIGVuZCBvZiBWYWxpZEVuY291bnRlcnMucGVyaW9kCiAgICAgICAgYW5kIGRhdGUgZnJvbSBGb2xsb3d1cFBST01JUzI5RGF0ZSBkdXJpbmcgZGF5IG9mIEludGVydmFsW2RhdGUgZnJvbSBJbml0aWFsUFJPTUlTMjlEYXRlICsgMzAgZGF5cywgZGF0ZSBmcm9tIEluaXRpYWxQUk9NSVMyOURhdGUgKyAxODAgZGF5c10KICAgICAgcmV0dXJuIFZhbGlkRW5jb3VudGVycwogICkKCmRlZmluZSAiRGF0ZSBQUk9NSVMyOSBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCI6CiAgZnJvbQogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQUk9NSVMtMjkgU2xlZXAgZGlzdHVyYmFuY2Ugc2NvcmUgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFByb21pczI5U2xlZXAsCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlBST01JUy0yOSBTYXRpc2ZhY3Rpb24gd2l0aCBwYXJ0aWNpcGF0aW9uIGluIHNvY2lhbCByb2xlcyBzY29yZSBULXNjb3JlIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgUHJvbWlzMjlTb2NpYWxSb2xlcywKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiUFJPTUlTLTI5IFBoeXNpY2FsIGZ1bmN0aW9uIHNjb3JlIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBQcm9taXMyOVBoeXNpY2FsLAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQUk9NSVMtMjkgUGFpbiBpbnRlcmZlcmVuY2Ugc2NvcmUgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFByb21pczI5UGFpbiwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiUFJPTUlTLTI5IEZhdGlndWUgc2NvcmUgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFByb21pczI5RmF0aWd1ZSwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiUFJPTUlTLTI5IERlcHJlc3Npb24gc2NvcmUgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFByb21pczI5RGVwcmVzc2lvbiwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiUFJPTUlTLTI5IEFueGlldHkgc2NvcmUgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFByb21pczI5QW54aWV0eQogICAgbGV0IFByb21pczI5U2xlZXBEYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgUHJvbWlzMjlTbGVlcC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBQcm9taXMyOVNvY2lhbFJvbGVzRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFByb21pczI5U29jaWFsUm9sZXMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgUHJvbWlzMjlQaHlzaWNhbERhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBQcm9taXMyOVBoeXNpY2FsLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIFByb21pczI5UGFpbkRhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBQcm9taXMyOVBhaW4uZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgUHJvbWlzMjlGYXRpZ3VlRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFByb21pczI5RmF0aWd1ZS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBQcm9taXMyOURlcHJlc3Npb25EYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgUHJvbWlzMjlEZXByZXNzaW9uLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIFByb21pczI5QW54aWV0eURhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBQcm9taXMyOUFueGlldHkuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBQcm9taXMyOVNsZWVwRGF0ZSBzYW1lIGRheSBhcyBQcm9taXMyOVNvY2lhbFJvbGVzRGF0ZQogICAgICBhbmQgUHJvbWlzMjlTb2NpYWxSb2xlcy52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgUHJvbWlzMjlTbGVlcERhdGUgc2FtZSBkYXkgYXMgUHJvbWlzMjlQaHlzaWNhbERhdGUKICAgICAgYW5kIFByb21pczI5UGh5c2ljYWwudmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kIFByb21pczI5U2xlZXBEYXRlIHNhbWUgZGF5IGFzIFByb21pczI5UGFpbkRhdGUKICAgICAgYW5kIFByb21pczI5UGFpbi52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgUHJvbWlzMjlTbGVlcERhdGUgc2FtZSBkYXkgYXMgUHJvbWlzMjlGYXRpZ3VlRGF0ZQogICAgICBhbmQgUHJvbWlzMjlGYXRpZ3VlLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCBQcm9taXMyOVNsZWVwRGF0ZSBzYW1lIGRheSBhcyBQcm9taXMyOURlcHJlc3Npb25EYXRlCiAgICAgIGFuZCBQcm9taXMyOURlcHJlc3Npb24udmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kIFByb21pczI5U2xlZXBEYXRlIHNhbWUgZGF5IGFzIFByb21pczI5QW54aWV0eURhdGUKICAgICAgYW5kIFByb21pczI5QW54aWV0eS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgUHJvbWlzMjlTbGVlcC52YWx1ZSBpcyBub3QgbnVsbAogICAgcmV0dXJuIFByb21pczI5U2xlZXBEYXRlCgpkZWZpbmUgIkhhcyBFbmNvdW50ZXIgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgVlIxMiBPYmxpcXVlIEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCBmcm9tCiAgICAgICJRdWFsaWZ5aW5nIEVuY291bnRlcnMiIFZhbGlkRW5jb3VudGVycywKICAgICAgIkRhdGUgVlIxMiBPYmxpcXVlIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBJbml0aWFsVlIxMk9ibGlxdWVEYXRlLAogICAgICAiRGF0ZSBWUjEyIE9ibGlxdWUgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd3VwVlIxMk9ibGlxdWVEYXRlCiAgICAgIHdoZXJlIFZhbGlkRW5jb3VudGVycy5wZXJpb2QgZW5kcyAxODAgZGF5cyBvciBtb3JlIGJlZm9yZSBkYXkgb2YgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgYW5kIEluaXRpYWxWUjEyT2JsaXF1ZURhdGUgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2YgZW5kIG9mIFZhbGlkRW5jb3VudGVycy5wZXJpb2QKICAgICAgICBhbmQgZGF0ZSBmcm9tIEZvbGxvd3VwVlIxMk9ibGlxdWVEYXRlIGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbZGF0ZSBmcm9tIEluaXRpYWxWUjEyT2JsaXF1ZURhdGUgKyAzMCBkYXlzLCBkYXRlIGZyb20gSW5pdGlhbFZSMTJPYmxpcXVlRGF0ZSArIDE4MCBkYXlzXQogICAgICByZXR1cm4gVmFsaWRFbmNvdW50ZXJzCiAgKQoKZGVmaW5lICJEYXRlIFZSMTIgT2JsaXF1ZSBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCI6CiAgZnJvbQogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgVlIxMk1lbnRhbEFzc2Vzc21lbnQsCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlZSLTEyIFBoeXNpY2FsIGNvbXBvbmVudCBzdW1tYXJ5IChQQ1MpIHNjb3JlIC0gb2JsaXF1ZSBtZXRob2QgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnQKICAgIGxldCBWUjEyTWVudGFsQXNzZXNzbWVudERhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBWUjEyTWVudGFsQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50RGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnQuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBWUjEyTWVudGFsQXNzZXNzbWVudERhdGUgc2FtZSBkYXkgYXMgVlIxMlBoeXNpY2FsQXNzZXNzbWVudERhdGUKICAgICAgYW5kICggVlIxMk1lbnRhbEFzc2Vzc21lbnQgYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kICggVlIxMlBoeXNpY2FsQXNzZXNzbWVudCBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgcmV0dXJuIFZSMTJNZW50YWxBc3Nlc3NtZW50RGF0ZQoKZGVmaW5lICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIFZSMTIgT3J0aG9nb25hbCBBc3Nlc3NtZW50cyI6CiAgZXhpc3RzICggZnJvbQogICAgICAiUXVhbGlmeWluZyBFbmNvdW50ZXJzIiBWYWxpZEVuY291bnRlcnMsCiAgICAgICJEYXRlIFZSMTIgT3J0aG9nb25hbCBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCIgSW5pdGlhbFZSMTJPcnRob2dvbmFsRGF0ZSwKICAgICAgIkRhdGUgVlIxMiBPcnRob2dvbmFsIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBGb2xsb3d1cFZSMTJPcnRob2dvbmFsRGF0ZQogICAgICB3aGVyZSBWYWxpZEVuY291bnRlcnMucGVyaW9kIGVuZHMgMTgwIGRheXMgb3IgbW9yZSBiZWZvcmUgZGF5IG9mIGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICAgIGFuZCBJbml0aWFsVlIxMk9ydGhvZ29uYWxEYXRlIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIGVuZCBvZiBWYWxpZEVuY291bnRlcnMucGVyaW9kCiAgICAgICAgYW5kIGRhdGUgZnJvbSBGb2xsb3d1cFZSMTJPcnRob2dvbmFsRGF0ZSBkdXJpbmcgZGF5IG9mIEludGVydmFsW2RhdGUgZnJvbSBJbml0aWFsVlIxMk9ydGhvZ29uYWxEYXRlICsgMzAgZGF5cywgZGF0ZSBmcm9tIEluaXRpYWxWUjEyT3J0aG9nb25hbERhdGUgKyAxODAgZGF5c10KICAgICAgcmV0dXJuIFZhbGlkRW5jb3VudGVycwogICkKCmRlZmluZSAiRGF0ZSBWUjEyIE9ydGhvZ29uYWwgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiOgogIGZyb20KICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiVlItMTIgTWVudGFsIGNvbXBvbmVudCBzdW1tYXJ5IChNQ1MpIHNjb3JlIC0gb3J0aG9nb25hbCBtZXRob2QgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFZSMTJNZW50YWxBc3Nlc3NtZW50LAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJWUi0xMiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50CiAgICBsZXQgVlIxMk1lbnRhbEFzc2Vzc21lbnREYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgVlIxMk1lbnRhbEFzc2Vzc21lbnQuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgVlIxMlBoeXNpY2FsQXNzZXNzbWVudERhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50LmVmZmVjdGl2ZS50b0ludGVydmFsICggKQogICAgd2hlcmUgVlIxMk1lbnRhbEFzc2Vzc21lbnREYXRlIHNhbWUgZGF5IGFzIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnREYXRlCiAgICAgIGFuZCAoIFZSMTJNZW50YWxBc3Nlc3NtZW50IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCAoIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnQgYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgIHJldHVybiBWUjEyTWVudGFsQXNzZXNzbWVudERhdGUKCmRlZmluZSAiSGFzIEVuY291bnRlciB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBWUjM2IE9ibGlxdWUgQXNzZXNzbWVudHMiOgogIGV4aXN0cyAoIGZyb20KICAgICAgIlF1YWxpZnlpbmcgRW5jb3VudGVycyIgVmFsaWRFbmNvdW50ZXJzLAogICAgICAiRGF0ZSBWUjM2IE9ibGlxdWUgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxWUjM2T2JsaXF1ZURhdGUsCiAgICAgICJEYXRlIFZSMzYgT2JsaXF1ZSBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCIgRm9sbG93dXBWUjM2T2JsaXF1ZURhdGUKICAgICAgd2hlcmUgVmFsaWRFbmNvdW50ZXJzLnBlcmlvZCBlbmRzIDE4MCBkYXlzIG9yIG1vcmUgYmVmb3JlIGRheSBvZiBlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgICBhbmQgSW5pdGlhbFZSMzZPYmxpcXVlRGF0ZSAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBlbmQgb2YgVmFsaWRFbmNvdW50ZXJzLnBlcmlvZAogICAgICAgIGFuZCBkYXRlIGZyb20gRm9sbG93dXBWUjM2T2JsaXF1ZURhdGUgZHVyaW5nIGRheSBvZiBJbnRlcnZhbFtkYXRlIGZyb20gSW5pdGlhbFZSMzZPYmxpcXVlRGF0ZSArIDMwIGRheXMsIGRhdGUgZnJvbSBJbml0aWFsVlIzNk9ibGlxdWVEYXRlICsgMTgwIGRheXNdCiAgICAgIHJldHVybiBWYWxpZEVuY291bnRlcnMKICApCgpkZWZpbmUgIkRhdGUgVlIzNiBPYmxpcXVlIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIjoKICBmcm9tCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlZSLTM2IE1lbnRhbCBjb21wb25lbnQgc3VtbWFyeSAoTUNTKSBzY29yZSAtIG9ibGlxdWUgbWV0aG9kIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBWUjM2TWVudGFsQXNzZXNzbWVudCwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiVlItMzYgUGh5c2ljYWwgY29tcG9uZW50IHN1bW1hcnkgKFBDUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgVlIzNlBoeXNpY2FsQXNzZXNzbWVudAogICAgbGV0IFZSMzZNZW50YWxBc3Nlc3NtZW50RGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFZSMzZNZW50YWxBc3Nlc3NtZW50LmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIFZSMzZQaHlzaWNhbEFzc2Vzc21lbnREYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgVlIzNlBoeXNpY2FsQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgIHdoZXJlIFZSMzZNZW50YWxBc3Nlc3NtZW50RGF0ZSBzYW1lIGRheSBhcyBWUjM2UGh5c2ljYWxBc3Nlc3NtZW50RGF0ZQogICAgICBhbmQgKCBWUjM2TWVudGFsQXNzZXNzbWVudCBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgKCBWUjM2UGh5c2ljYWxBc3Nlc3NtZW50IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICByZXR1cm4gVlIzNk1lbnRhbEFzc2Vzc21lbnREYXRlCgpkZWZpbmUgIkhhcyBFbmNvdW50ZXIgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgVlIzNiBPcnRob2dvbmFsIEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCBmcm9tCiAgICAgICJRdWFsaWZ5aW5nIEVuY291bnRlcnMiIFZhbGlkRW5jb3VudGVycywKICAgICAgIkRhdGUgVlIzNiBPcnRob2dvbmFsIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBJbml0aWFsVlIzNk9ydGhvZ29uYWxEYXRlLAogICAgICAiRGF0ZSBWUjM2IE9ydGhvZ29uYWwgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd3VwVlIzNk9ydGhvZ29uYWxEYXRlCiAgICAgIHdoZXJlIFZhbGlkRW5jb3VudGVycy5wZXJpb2QgZW5kcyAxODAgZGF5cyBvciBtb3JlIGJlZm9yZSBkYXkgb2YgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgYW5kIEluaXRpYWxWUjM2T3J0aG9nb25hbERhdGUgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2YgZW5kIG9mIFZhbGlkRW5jb3VudGVycy5wZXJpb2QKICAgICAgICBhbmQgZGF0ZSBmcm9tIEZvbGxvd3VwVlIzNk9ydGhvZ29uYWxEYXRlIGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbZGF0ZSBmcm9tIEluaXRpYWxWUjM2T3J0aG9nb25hbERhdGUgKyAzMCBkYXlzLCBkYXRlIGZyb20gSW5pdGlhbFZSMzZPcnRob2dvbmFsRGF0ZSArIDE4MCBkYXlzXQogICAgICByZXR1cm4gVmFsaWRFbmNvdW50ZXJzCiAgKQoKZGVmaW5lICJEYXRlIFZSMzYgT3J0aG9nb25hbCBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCI6CiAgZnJvbQogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJWUi0zNiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgVlIzNk1lbnRhbEFzc2Vzc21lbnQsCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlZSLTM2IFBoeXNpY2FsIGNvbXBvbmVudCBzdW1tYXJ5IChQQ1MpIHNjb3JlIC0gb3J0aG9nb25hbCBtZXRob2QgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFZSMzZQaHlzaWNhbEFzc2Vzc21lbnQKICAgIGxldCBWUjM2TWVudGFsQXNzZXNzbWVudERhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBWUjM2TWVudGFsQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBWUjM2UGh5c2ljYWxBc3Nlc3NtZW50RGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFZSMzZQaHlzaWNhbEFzc2Vzc21lbnQuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBWUjM2TWVudGFsQXNzZXNzbWVudERhdGUgc2FtZSBkYXkgYXMgVlIzNlBoeXNpY2FsQXNzZXNzbWVudERhdGUKICAgICAgYW5kICggVlIzNk1lbnRhbEFzc2Vzc21lbnQgYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kICggVlIzNlBoeXNpY2FsQXNzZXNzbWVudCBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgcmV0dXJuIFZSMzZNZW50YWxBc3Nlc3NtZW50RGF0ZQoKZGVmaW5lICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIE1MSEZRIEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCBmcm9tCiAgICAgICJRdWFsaWZ5aW5nIEVuY291bnRlcnMiIFZhbGlkRW5jb3VudGVycywKICAgICAgIkRhdGUgTUxIRlEgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxNTEhGUURhdGUsCiAgICAgICJEYXRlIE1MSEZRIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBGb2xsb3d1cE1MSEZRRGF0ZQogICAgICB3aGVyZSBWYWxpZEVuY291bnRlcnMucGVyaW9kIGVuZHMgMTgwIGRheXMgb3IgbW9yZSBiZWZvcmUgZGF5IG9mIGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICAgIGFuZCBJbml0aWFsTUxIRlFEYXRlIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIGVuZCBvZiBWYWxpZEVuY291bnRlcnMucGVyaW9kCiAgICAgICAgYW5kIGRhdGUgZnJvbSBGb2xsb3d1cE1MSEZRRGF0ZSBkdXJpbmcgZGF5IG9mIEludGVydmFsW2RhdGUgZnJvbSBJbml0aWFsTUxIRlFEYXRlICsgMzAgZGF5cywgZGF0ZSBmcm9tIEluaXRpYWxNTEhGUURhdGUgKyAxODAgZGF5c10KICAgICAgcmV0dXJuIFZhbGlkRW5jb3VudGVycwogICkKCmRlZmluZSAiRGF0ZSBNTEhGUSBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCI6CiAgZnJvbQogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQaHlzaWNhbCBzY29yZSBbTUxIRlFdIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgTUxIRlFQaHlzaWNhbCwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiRW1vdGlvbmFsIHNjb3JlIFtNTEhGUV0iXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBNTEhGUUVtb3Rpb25hbAogICAgbGV0IE1MSEZRUGh5c2ljYWxEYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgTUxIRlFQaHlzaWNhbC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBNTEhGUUVtb3Rpb25hbERhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBNTEhGUUVtb3Rpb25hbC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgIHdoZXJlIE1MSEZRUGh5c2ljYWxEYXRlIHNhbWUgZGF5IGFzIE1MSEZRRW1vdGlvbmFsRGF0ZQogICAgICBhbmQgKCBNTEhGUVBoeXNpY2FsIGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCAoIE1MSEZRRW1vdGlvbmFsIGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICByZXR1cm4gTUxIRlFQaHlzaWNhbERhdGUKCmRlZmluZSAiSGFzIEVuY291bnRlciB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBLQ0NRMTIgQXNzZXNzbWVudHMiOgogIGV4aXN0cyAoIGZyb20KICAgICAgIlF1YWxpZnlpbmcgRW5jb3VudGVycyIgVmFsaWRFbmNvdW50ZXJzLAogICAgICAiRGF0ZSBLQ0NRMTIgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxLQ0NRMTJEYXRlLAogICAgICAiRGF0ZSBLQ0NRMTIgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd3VwS0NDUTEyRGF0ZQogICAgICB3aGVyZSBWYWxpZEVuY291bnRlcnMucGVyaW9kIGVuZHMgMTgwIGRheXMgb3IgbW9yZSBiZWZvcmUgZGF5IG9mIGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICAgIGFuZCBJbml0aWFsS0NDUTEyRGF0ZSAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBlbmQgb2YgVmFsaWRFbmNvdW50ZXJzLnBlcmlvZAogICAgICAgIGFuZCBkYXRlIGZyb20gRm9sbG93dXBLQ0NRMTJEYXRlIGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbZGF0ZSBmcm9tIEluaXRpYWxLQ0NRMTJEYXRlICsgMzAgZGF5cywgZGF0ZSBmcm9tIEluaXRpYWxLQ0NRMTJEYXRlICsgMTgwIGRheXNdCiAgICAgIHJldHVybiBWYWxpZEVuY291bnRlcnMKICApCgpkZWZpbmUgIkRhdGUgS0NDUTEyIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIjoKICBmcm9tCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIkthbnNhcyBDaXR5IENhcmRpb215b3BhdGh5IFF1ZXN0aW9ubmFpcmUgLSAxMiBpdGVtIFtLQ0NRLTEyXSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIEtDQ1ExMkl0ZW0sCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIk92ZXJhbGwgc3VtbWFyeSBzY29yZSBbS0NDUS0xMl0iXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBLQ0NRMTJTdW1tYXJ5CiAgICBsZXQgS0NDUTEySXRlbURhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBLQ0NRMTJJdGVtLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIEtDQ1ExMlN1bW1hcnlEYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgS0NDUTEyU3VtbWFyeS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgIHdoZXJlIEtDQ1ExMkl0ZW1EYXRlIHNhbWUgZGF5IGFzIEtDQ1ExMlN1bW1hcnlEYXRlCiAgICAgIGFuZCAoIEtDQ1ExMkl0ZW0gYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kICggS0NDUTEyU3VtbWFyeSBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgcmV0dXJuIEtDQ1ExMkl0ZW1EYXRlCgpkZWZpbmUgIkhhcyBFbmNvdW50ZXIgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgS0NDUSBEb21haW4gU2NvcmUgQXNzZXNzbWVudHMiOgogIGV4aXN0cyAoIGZyb20KICAgICAgIlF1YWxpZnlpbmcgRW5jb3VudGVycyIgVmFsaWRFbmNvdW50ZXJzLAogICAgICAiRGF0ZSBLQ0NRIERvbWFpbiBBc3Nlc3NtZW50IENvbXBsZXRlZCIgSW5pdGlhbEtDQ1FBc3Nlc3NtZW50RGF0ZSwKICAgICAgIkRhdGUgS0NDUSBEb21haW4gQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd3VwS0NDUUFzc2Vzc21lbnREYXRlCiAgICAgIHdoZXJlIFZhbGlkRW5jb3VudGVycy5wZXJpb2QgZW5kcyAxODAgZGF5cyBvciBtb3JlIGJlZm9yZSBkYXkgb2YgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgYW5kIEluaXRpYWxLQ0NRQXNzZXNzbWVudERhdGUgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2YgZW5kIG9mIFZhbGlkRW5jb3VudGVycy5wZXJpb2QKICAgICAgICBhbmQgZGF0ZSBmcm9tIEZvbGxvd3VwS0NDUUFzc2Vzc21lbnREYXRlIGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbZGF0ZSBmcm9tIEluaXRpYWxLQ0NRQXNzZXNzbWVudERhdGUgKyAzMCBkYXlzLCBkYXRlIGZyb20gSW5pdGlhbEtDQ1FBc3Nlc3NtZW50RGF0ZSArIDE4MCBkYXlzXQogICAgICByZXR1cm4gVmFsaWRFbmNvdW50ZXJzCiAgKQoKZGVmaW5lICJEYXRlIEtDQ1EgRG9tYWluIEFzc2Vzc21lbnQgQ29tcGxldGVkIjoKICBmcm9tCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlF1YWxpdHkgb2YgbGlmZSBzY29yZSBbS0NDUV0iXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBLQ0NRTGlmZVF1YWxpdHksCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlN5bXB0b20gc3RhYmlsaXR5IHNjb3JlIFtLQ0NRXSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIEtDQ1FTeW1wdG9tU3RhYmlsaXR5LAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJTZWxmLWVmZmljYWN5IHNjb3JlIFtLQ0NRXSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIEtDQ1FTZWxmRWZmaWNhY3ksCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlRvdGFsIHN5bXB0b20gc2NvcmUgW0tDQ1FdIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgS0NDUVN5bXB0b21zLAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQaHlzaWNhbCBsaW1pdGF0aW9uIHNjb3JlIFtLQ0NRXSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIEtDQ1FQaHlzaWNhbExpbWl0cywKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiU29jaWFsIGxpbWl0YXRpb24gc2NvcmUgW0tDQ1FdIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgS0NDUVNvY2lhbExpbWl0cwogICAgbGV0IEtDQ1FMaWZlUXVhbGl0eURhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBLQ0NRTGlmZVF1YWxpdHkuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgS0NDUVN5bXB0b21TdGFiaWxpdHlEYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgS0NDUVN5bXB0b21TdGFiaWxpdHkuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgS0NDUVNlbGZFZmZpY2FjeURhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBLQ0NRU2VsZkVmZmljYWN5LmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIEtDQ1FTeW1wdG9tc0RhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBLQ0NRU3ltcHRvbXMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgS0NDUVBoeXNpY2FsTGltaXRzRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIEtDQ1FQaHlzaWNhbExpbWl0cy5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBLQ0NRU29jaWFsTGltaXRzRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIEtDQ1FTb2NpYWxMaW1pdHMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBLQ0NRTGlmZVF1YWxpdHlEYXRlIHNhbWUgZGF5IGFzIEtDQ1FTeW1wdG9tU3RhYmlsaXR5RGF0ZQogICAgICBhbmQgKCBLQ0NRU3ltcHRvbVN0YWJpbGl0eSBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgS0NDUUxpZmVRdWFsaXR5RGF0ZSBzYW1lIGRheSBhcyBLQ0NRU2VsZkVmZmljYWN5RGF0ZQogICAgICBhbmQgKCBLQ0NRU2VsZkVmZmljYWN5IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCBLQ0NRTGlmZVF1YWxpdHlEYXRlIHNhbWUgZGF5IGFzIEtDQ1FTeW1wdG9tc0RhdGUKICAgICAgYW5kICggS0NDUVN5bXB0b21zIGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCBLQ0NRTGlmZVF1YWxpdHlEYXRlIHNhbWUgZGF5IGFzIEtDQ1FQaHlzaWNhbExpbWl0c0RhdGUKICAgICAgYW5kICggS0NDUVBoeXNpY2FsTGltaXRzIGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCBLQ0NRTGlmZVF1YWxpdHlEYXRlIHNhbWUgZGF5IGFzIEtDQ1FTb2NpYWxMaW1pdHNEYXRlCiAgICAgIGFuZCAoIEtDQ1FTb2NpYWxMaW1pdHMgYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kICggS0NDUUxpZmVRdWFsaXR5IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICByZXR1cm4gS0NDUUxpZmVRdWFsaXR5RGF0ZQoKZGVmaW5lICJEYXRlIEtDQ1EgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiOgogICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiT3ZlcmFsbCBzdW1tYXJ5IHNjb3JlIFtLQ0NRXSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIEtDQ1FTdW1tYXJ5U2NvcmUKICAgIHdoZXJlICggS0NDUVN1bW1hcnlTY29yZSBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgcmV0dXJuIGRhdGUgZnJvbSBzdGFydCBvZiBLQ0NRU3VtbWFyeVNjb3JlLmVmZmVjdGl2ZS50b0ludGVydmFsICggKQoKZGVmaW5lICJIYXMgRW5jb3VudGVyIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIEtDQ1EgVG90YWwgU2NvcmUgQXNzZXNzbWVudHMiOgogIGV4aXN0cyAoIGZyb20KICAgICAgIlF1YWxpZnlpbmcgRW5jb3VudGVycyIgVmFsaWRFbmNvdW50ZXJzLAogICAgICAiRGF0ZSBLQ0NRIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBJbml0aWFsS0NDUVRvdGFsU2NvcmUsCiAgICAgICJEYXRlIEtDQ1EgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd3VwS0NDUVRvdGFsU2NvcmUKICAgICAgd2hlcmUgVmFsaWRFbmNvdW50ZXJzLnBlcmlvZCBlbmRzIDE4MCBkYXlzIG9yIG1vcmUgYmVmb3JlIGRheSBvZiBlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgICBhbmQgSW5pdGlhbEtDQ1FUb3RhbFNjb3JlIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIGVuZCBvZiBWYWxpZEVuY291bnRlcnMucGVyaW9kCiAgICAgICAgYW5kIGRhdGUgZnJvbSBGb2xsb3d1cEtDQ1FUb3RhbFNjb3JlIGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbZGF0ZSBmcm9tIEluaXRpYWxLQ0NRVG90YWxTY29yZSArIDMwIGRheXMsIGRhdGUgZnJvbSBJbml0aWFsS0NDUVRvdGFsU2NvcmUgKyAxODAgZGF5c10KICAgICAgcmV0dXJuIFZhbGlkRW5jb3VudGVycwogICk=",
      "url" : "https://madie.cms.gov/Library-CMS90FHIRFSAforHeartFailure.cql"
    }
  ]
}