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

: CMS646FHIRIntravesicalBCGTherapy - JSON Representation

Draft as of 2026-09-19

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS646FHIRIntravesicalBCGTherapy",
  "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 CMS646FHIRIntravesicalBCGTherapy version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude CQMCommon version '5.1.000' called CQMCommon\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\n\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\ncodesystem &quot;ICD10CM&quot;: 'http://hl7.org/fhir/sid/icd-10-cm'\ncodesystem &quot;ActCode&quot;: 'http://terminology.hl7.org/CodeSystem/v3-ActCode'\n\nvalueset &quot;Bacillus Calmette Guerin for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.353'\nvalueset &quot;Bladder Cancer for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.354'\nvalueset &quot;Chemotherapy Agents for Advanced Cancer&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.355'\nvalueset &quot;Cystectomy for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.358'\nvalueset &quot;HIV&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.120.12.1003'\nvalueset &quot;Immunocompromised Conditions&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.363'\nvalueset &quot;Immunosuppressive Drugs for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.364'\nvalueset &quot;Mixed Histology Urothelial Cell Carcinoma for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.365'\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;Tuberculosis for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.351'\nvalueset &quot;Unavailability of Bacillus Calmette Guerin for Urology Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.369'\n\ncode &quot;American Joint Committee on Cancer cT1 (qualifier value)&quot;: '1228889001' from &quot;SNOMEDCT&quot; display 'American Joint Committee on Cancer cT1 (qualifier value)'\ncode &quot;American Joint Committee on Cancer cTa (qualifier value)&quot;: '1228883000' from &quot;SNOMEDCT&quot; display 'American Joint Committee on Cancer cTa (qualifier value)'\ncode &quot;American Joint Committee on Cancer cTis (qualifier value)&quot;: '1228884006' from &quot;SNOMEDCT&quot; display 'American Joint Committee on Cancer cTis (qualifier value)'\ncode &quot;Carcinoma in situ of bladder&quot;: 'D09.0' from &quot;ICD10CM&quot; display 'Carcinoma in situ of bladder'\ncode &quot;Combined radiotherapy (procedure)&quot;: '169331000' from &quot;SNOMEDCT&quot; display 'Combined radiotherapy (procedure)'\ncode &quot;Tumor staging (tumor staging)&quot;: '254292007' from &quot;SNOMEDCT&quot; display 'Tumor staging (tumor staging)'\ncode &quot;virtual&quot;: 'VR' from &quot;ActCode&quot; display 'virtual'\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;Initial Population&quot;:\n  &quot;Has Most Recent Bladder Cancer Tumor Staging is T1, Tis, Ta HG&quot;\n    and &quot;Has Qualifying Encounter&quot;\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusion&quot;:\n  exists &quot;Acute Tuberculosis Diagnosis&quot;\n    or exists &quot;Immunosuppressive Drugs&quot;\n    or exists &quot;Cystectomy Done&quot;\n    or &quot;Has Excluding HIV, Immunocompromised Conditions or Mixed Histology Before Staging&quot;\n    or &quot;Has Excluding Chemotherapy or Radiotherapy Procedure Before Staging&quot;\n\ndefine &quot;Denominator Exception&quot;:\n  exists &quot;BCG Not Available Within 6 Months After Bladder Cancer Staging&quot;\n\ndefine &quot;Numerator&quot;:\n  &quot;First BCG Administered&quot; is not null\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;July 1 of Year Prior to the Measurement Period&quot;:\n  Date((year from start of &quot;Measurement Period&quot; - 1), 7, 1)\n\ndefine &quot;June 30 of the Measurement Period&quot;:\n  Date((year from start of &quot;Measurement Period&quot;), 6, 30)\n\ndefine &quot;Acute Tuberculosis Diagnosis&quot;:\n  // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n  // Original:\n  //   ( [ConditionProblemsHealthConcerns: &quot;Tuberculosis for Urology Care&quot;]\n  //     union [ConditionEncounterDiagnosis: &quot;Tuberculosis for Urology Care&quot;] )\n  ( [FHIR.Condition: &quot;Tuberculosis for Urology Care&quot;] ) ActiveTuberculosis\n    with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n      such that ( ( ActiveTuberculosis.prevalenceInterval ( ) overlaps after day of FirstBladderCancerStaging.performed.toInterval ( ) )\n          or ( ActiveTuberculosis.prevalenceInterval ( ) overlaps after day of FirstBladderCancerStaging.performed.toInterval ( )\n              and ( ( ActiveTuberculosis.abatement.toInterval ( ) overlaps after day of FirstBladderCancerStaging.performed.toInterval ( ) )\n                  or ( ActiveTuberculosis.abatement is null )\n              )\n          )\n      )\n    where ActiveTuberculosis.isVerified ( )\n\ndefine &quot;Cystectomy Done&quot;:\n  [Procedure: &quot;Cystectomy for Urology Care&quot;] Cystectomy\n    with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n      such that Cystectomy.performed.toInterval ( ) 6 months or less before day of start of FirstBladderCancerStaging.performed.toInterval ( )\n    where Cystectomy.status = 'completed'\n\ndefine &quot;Has Excluding HIV, Immunocompromised Conditions or Mixed Histology Before Staging&quot;:\n  // [E-13] base FHIR.Condition retrieves (defect-tracking/engine-issues.md E-13)\n  // Original:\n  //   exists ( ( ( [ConditionProblemsHealthConcerns: &quot;HIV&quot;]\n  //         union [ConditionEncounterDiagnosis: &quot;HIV&quot;]\n  //     )\n  //       union ( [ConditionProblemsHealthConcerns: &quot;Immunocompromised Conditions&quot;]\n  //           union [ConditionEncounterDiagnosis: &quot;Immunocompromised Conditions&quot;]\n  //       )\n  //       union ( [ConditionProblemsHealthConcerns: &quot;Mixed Histology Urothelial Cell Carcinoma for Urology Care&quot;]\n  //           union [ConditionEncounterDiagnosis: &quot;Mixed Histology Urothelial Cell Carcinoma for Urology Care&quot;]\n  //       ) ) ExclusionDiagnosis\n  exists ( ( ( [FHIR.Condition: &quot;HIV&quot;]\n    )\n      union ( [FHIR.Condition: &quot;Immunocompromised Conditions&quot;]\n      )\n      union ( [FHIR.Condition: &quot;Mixed Histology Urothelial Cell Carcinoma for Urology Care&quot;]\n      ) ) ExclusionDiagnosis\n      with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n        such that ( ( ExclusionDiagnosis.prevalenceInterval ( ) starts on or before day of start of FirstBladderCancerStaging.performed.toInterval ( ) )\n            or ( ExclusionDiagnosis.prevalenceInterval ( ) starts on or before day of start of FirstBladderCancerStaging.performed.toInterval ( ) )\n        )\n      where ExclusionDiagnosis.isVerified ( )\n  )\n\ndefine &quot;Has Excluding Chemotherapy or Radiotherapy Procedure Before Staging&quot;:\n  exists ( ( [MedicationRequest: &quot;Chemotherapy Agents for Advanced Cancer&quot;] ExclusionMed\n        let firstMedicationPeriod: First((collapse(ExclusionMed.dosageInstruction.timing.repeat.bounds DoseTime\n              return DoseTime.toInterval()\n          )) DrugPeriods\n            sort by start of $this\n        )\n        with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n          such that firstMedicationPeriod starts 6 months or less before FirstBladderCancerStaging.performed.toInterval ( )\n        where ExclusionMed.status in { 'active', 'completed' }\n          and ExclusionMed.intent = 'order'\n    )\n      union ( [Procedure: &quot;Combined radiotherapy (procedure)&quot;] ExclusionProcedure\n          with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n            such that ExclusionProcedure.performed.toInterval ( ) starts 6 months or less before FirstBladderCancerStaging.performed.toInterval ( )\n          where ExclusionProcedure.status in { 'completed', 'in-progress' }\n      )\n  )\n\ndefine &quot;First Bladder Cancer Staging Procedure&quot;:\n  First([Procedure: &quot;Tumor staging (tumor staging)&quot;] BladderCancerStaging\n      with &quot;Bladder Cancer Diagnosis&quot; BladderCancer\n        such that BladderCancerStaging.performed.toInterval() starts on or before day of start of BladderCancer.prevalenceInterval ( )\n      where BladderCancerStaging.status = 'completed'\n      sort by start of performed.toInterval()\n  )\n\ndefine &quot;Has Qualifying Encounter&quot;:\n  exists ( [Encounter: &quot;Office Visit&quot;] ValidEncounter\n      where ValidEncounter.period during day of &quot;Measurement Period&quot;\n        and ValidEncounter.class !~ &quot;virtual&quot;\n        and ValidEncounter.status = 'finished'\n  )\n\ndefine &quot;Bladder Cancer Diagnosis&quot;:\n  // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n  // Original:\n  //   ( [ConditionProblemsHealthConcerns: &quot;Bladder Cancer for Urology Care&quot;]\n  //     union [ConditionEncounterDiagnosis: &quot;Bladder Cancer for Urology Care&quot;] )\n  ( [FHIR.Condition: &quot;Bladder Cancer for Urology Care&quot;] ) BladderCancer\n    where ( BladderCancer.prevalenceInterval ( ) starts before day of end of &quot;Measurement Period&quot;\n        or BladderCancer.prevalenceInterval ( ) before day of end of &quot;Measurement Period&quot;\n    )\n      and BladderCancer.isVerified ( )\n\ndefine &quot;BCG Not Available Within 6 Months After Bladder Cancer Staging&quot;:\n  [MedicationAdministrationNotDone: &quot;Bacillus Calmette Guerin for Urology Care&quot;] BCGNotGiven\n    with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n      such that BCGNotGiven.effective 6 months or less after day of start of FirstBladderCancerStaging.performed.toInterval ( )\n    where BCGNotGiven.statusReason in &quot;Unavailability of Bacillus Calmette Guerin for Urology Care&quot;\n\ndefine &quot;First Bladder Cancer Staging Procedure during 6 Months Prior to Measurement Period through the First 6 Months of Measurement Period&quot;:\n  &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n    where FirstBladderCancerStaging.performed.toInterval ( ) during day of Interval[&quot;July 1 of Year Prior to the Measurement Period&quot;, &quot;June 30 of the Measurement Period&quot;]\n\ndefine &quot;First BCG Administered&quot;:\n  First([MedicationAdministration: &quot;Bacillus Calmette Guerin for Urology Care&quot;] BCG\n      with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n        such that BCG.effective.toInterval() starts 6 months or less after day of start of FirstBladderCancerStaging.performed.toInterval()\n          and BCG.effective.toInterval() starts during day of &quot;Measurement Period&quot;\n      where BCG.status in { 'in-progress', 'completed' }\n      sort by start of effective.toInterval()\n  )\n\n/*Ta High Grade only to be included.  Ta low grade is to be excluded from this measure.*/\n\n\ndefine &quot;Has Most Recent Bladder Cancer Tumor Staging is T1, Tis, Ta HG&quot;:\n  exists ( [LaboratoryResultObservation] StagingObservation\n      where StagingObservation.getStagingProcedure ( ) is not null\n        and ( StagingObservation.value as CodeableConcept ~ &quot;American Joint Committee on Cancer cT1 (qualifier value)&quot;\n            or StagingObservation.value as CodeableConcept ~ &quot;American Joint Committee on Cancer cTis (qualifier value)&quot;\n            or StagingObservation.value as CodeableConcept ~ &quot;American Joint Committee on Cancer cTa (qualifier value)&quot;\n            or StagingObservation.value as CodeableConcept ~ &quot;Carcinoma in situ of bladder&quot;\n        )\n        and StagingObservation.status in { 'final', 'amended', 'corrected' }\n  )\n\ndefine fluent function getStagingProcedure(StagingObservation LaboratoryResultObservation):\n  StagingObservation.partOf StagingReference\n    return &quot;First Bladder Cancer Staging Procedure during 6 Months Prior to Measurement Period through the First 6 Months of Measurement Period&quot; FirstBladderCancerStagingMP\n      where FirstBladderCancerStagingMP.id = StagingReference.reference.getId ( )\n\ndefine &quot;Immunosuppressive Drugs&quot;:\n  [MedicationRequest: &quot;Immunosuppressive Drugs for Urology Care&quot;] ImmunosuppressiveDrugs\n    let firstMedicationPeriod: First((collapse(ImmunosuppressiveDrugs.dosageInstruction.timing.repeat.bounds DoseTime\n          return DoseTime.toInterval()\n      )) DrugPeriods\n        sort by start of $this\n    ),\n    //get the very first event\n    \n    firstMedicationEvent: First((ImmunosuppressiveDrugs.dosageInstruction.timing dosageTiming\n        //return first event for the specific dosageTiming\n        \n        return First(dosageTiming.event dosageTimingEvents\n            sort ascending\n        )) firstEvents\n        sort ascending\n    ),\n    medicationPeriod: Coalesce(firstMedicationEvent.toInterval(), firstMedicationPeriod)\n    with &quot;First Bladder Cancer Staging Procedure&quot; FirstBladderCancerStaging\n      such that medicationPeriod starts on or before day of start of FirstBladderCancerStaging.performed.toInterval ( )\n    where ImmunosuppressiveDrugs.status in { 'active', 'completed' }\n      and ImmunosuppressiveDrugs.intent = 'order'\n\ndefine fluent function isVerified(condition Choice&lt;ConditionEncounterDiagnosis, ConditionProblemsHealthConcerns&gt;):\n  condition.verificationStatus is not null implies ( condition.verificationStatus ~ Status.&quot;confirmed&quot;\n      or condition.verificationStatus ~ Status.&quot;unconfirmed&quot;\n      or condition.verificationStatus ~ Status.&quot;provisional&quot;\n      or condition.verificationStatus ~ Status.&quot;differential&quot;\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/CMS646FHIRIntravesicalBCGTherapy",
  "version" : "1.1.000",
  "name" : "CMS646FHIRIntravesicalBCGTherapy",
  "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" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM2NDZGSElSSW50cmF2ZXNpY2FsQkNHVGhlcmFweSB2ZXJzaW9uICcxLjEuMDAwJwoKdXNpbmcgVVNRdWFsaXR5Q29yZSB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlQ29tbW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVFbGVtZW50cyB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVFbGVtZW50cwoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFN0YXR1cyB2ZXJzaW9uICcyLjEuMDAwJyBjYWxsZWQgU3RhdHVzCgpjb2Rlc3lzdGVtICJTTk9NRURDVCI6ICdodHRwOi8vc25vbWVkLmluZm8vc2N0Jwpjb2Rlc3lzdGVtICJJQ0QxMENNIjogJ2h0dHA6Ly9obDcub3JnL2ZoaXIvc2lkL2ljZC0xMC1jbScKY29kZXN5c3RlbSAiQWN0Q29kZSI6ICdodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL3YzLUFjdENvZGUnCgp2YWx1ZXNldCAiQmFjaWxsdXMgQ2FsbWV0dGUgR3VlcmluIGZvciBVcm9sb2d5IENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM1MycKdmFsdWVzZXQgIkJsYWRkZXIgQ2FuY2VyIGZvciBVcm9sb2d5IENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM1NCcKdmFsdWVzZXQgIkNoZW1vdGhlcmFweSBBZ2VudHMgZm9yIEFkdmFuY2VkIENhbmNlciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMzU1Jwp2YWx1ZXNldCAiQ3lzdGVjdG9teSBmb3IgVXJvbG9neSBDYXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4zNTgnCnZhbHVlc2V0ICJISVYiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTIwLjEyLjEwMDMnCnZhbHVlc2V0ICJJbW11bm9jb21wcm9taXNlZCBDb25kaXRpb25zIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4zNjMnCnZhbHVlc2V0ICJJbW11bm9zdXBwcmVzc2l2ZSBEcnVncyBmb3IgVXJvbG9neSBDYXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4zNjQnCnZhbHVlc2V0ICJNaXhlZCBIaXN0b2xvZ3kgVXJvdGhlbGlhbCBDZWxsIENhcmNpbm9tYSBmb3IgVXJvbG9neSBDYXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4zNjUnCnZhbHVlc2V0ICJPZmZpY2UgVmlzaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMDEnCnZhbHVlc2V0ICJUdWJlcmN1bG9zaXMgZm9yIFVyb2xvZ3kgQ2FyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMzUxJwp2YWx1ZXNldCAiVW5hdmFpbGFiaWxpdHkgb2YgQmFjaWxsdXMgQ2FsbWV0dGUgR3VlcmluIGZvciBVcm9sb2d5IENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM2OScKCmNvZGUgIkFtZXJpY2FuIEpvaW50IENvbW1pdHRlZSBvbiBDYW5jZXIgY1QxIChxdWFsaWZpZXIgdmFsdWUpIjogJzEyMjg4ODkwMDEnIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdBbWVyaWNhbiBKb2ludCBDb21taXR0ZWUgb24gQ2FuY2VyIGNUMSAocXVhbGlmaWVyIHZhbHVlKScKY29kZSAiQW1lcmljYW4gSm9pbnQgQ29tbWl0dGVlIG9uIENhbmNlciBjVGEgKHF1YWxpZmllciB2YWx1ZSkiOiAnMTIyODg4MzAwMCcgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0FtZXJpY2FuIEpvaW50IENvbW1pdHRlZSBvbiBDYW5jZXIgY1RhIChxdWFsaWZpZXIgdmFsdWUpJwpjb2RlICJBbWVyaWNhbiBKb2ludCBDb21taXR0ZWUgb24gQ2FuY2VyIGNUaXMgKHF1YWxpZmllciB2YWx1ZSkiOiAnMTIyODg4NDAwNicgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0FtZXJpY2FuIEpvaW50IENvbW1pdHRlZSBvbiBDYW5jZXIgY1RpcyAocXVhbGlmaWVyIHZhbHVlKScKY29kZSAiQ2FyY2lub21hIGluIHNpdHUgb2YgYmxhZGRlciI6ICdEMDkuMCcgZnJvbSAiSUNEMTBDTSIgZGlzcGxheSAnQ2FyY2lub21hIGluIHNpdHUgb2YgYmxhZGRlcicKY29kZSAiQ29tYmluZWQgcmFkaW90aGVyYXB5IChwcm9jZWR1cmUpIjogJzE2OTMzMTAwMCcgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0NvbWJpbmVkIHJhZGlvdGhlcmFweSAocHJvY2VkdXJlKScKY29kZSAiVHVtb3Igc3RhZ2luZyAodHVtb3Igc3RhZ2luZykiOiAnMjU0MjkyMDA3JyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnVHVtb3Igc3RhZ2luZyAodHVtb3Igc3RhZ2luZyknCmNvZGUgInZpcnR1YWwiOiAnVlInIGZyb20gIkFjdENvZGUiIGRpc3BsYXkgJ3ZpcnR1YWwnCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkhhcyBNb3N0IFJlY2VudCBCbGFkZGVyIENhbmNlciBUdW1vciBTdGFnaW5nIGlzIFQxLCBUaXMsIFRhIEhHIgogICAgYW5kICJIYXMgUXVhbGlmeWluZyBFbmNvdW50ZXIiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb24iOgogIGV4aXN0cyAiQWN1dGUgVHViZXJjdWxvc2lzIERpYWdub3NpcyIKICAgIG9yIGV4aXN0cyAiSW1tdW5vc3VwcHJlc3NpdmUgRHJ1Z3MiCiAgICBvciBleGlzdHMgIkN5c3RlY3RvbXkgRG9uZSIKICAgIG9yICJIYXMgRXhjbHVkaW5nIEhJViwgSW1tdW5vY29tcHJvbWlzZWQgQ29uZGl0aW9ucyBvciBNaXhlZCBIaXN0b2xvZ3kgQmVmb3JlIFN0YWdpbmciCiAgICBvciAiSGFzIEV4Y2x1ZGluZyBDaGVtb3RoZXJhcHkgb3IgUmFkaW90aGVyYXB5IFByb2NlZHVyZSBCZWZvcmUgU3RhZ2luZyIKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjZXB0aW9uIjoKICBleGlzdHMgIkJDRyBOb3QgQXZhaWxhYmxlIFdpdGhpbiA2IE1vbnRocyBBZnRlciBCbGFkZGVyIENhbmNlciBTdGFnaW5nIgoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJGaXJzdCBCQ0cgQWRtaW5pc3RlcmVkIiBpcyBub3QgbnVsbAoKZGVmaW5lICJTREUgRXRobmljaXR5IjoKICBTREUuIlNERSBFdGhuaWNpdHkiCgpkZWZpbmUgIlNERSBQYXllciI6CiAgU0RFLiJTREUgUGF5ZXIiCgpkZWZpbmUgIlNERSBSYWNlIjoKICBTREUuIlNERSBSYWNlIgoKZGVmaW5lICJTREUgU2V4IjoKICBTREUuIlNERSBTZXgiCgpkZWZpbmUgIkp1bHkgMSBvZiBZZWFyIFByaW9yIHRvIHRoZSBNZWFzdXJlbWVudCBQZXJpb2QiOgogIERhdGUoKHllYXIgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiAtIDEpLCA3LCAxKQoKZGVmaW5lICJKdW5lIDMwIG9mIHRoZSBNZWFzdXJlbWVudCBQZXJpb2QiOgogIERhdGUoKHllYXIgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiksIDYsIDMwKQoKZGVmaW5lICJBY3V0ZSBUdWJlcmN1bG9zaXMgRGlhZ25vc2lzIjoKICAvLyBbRS0xM10gYmFzZSBGSElSLkNvbmRpdGlvbiByZXRyaWV2ZSAoZGVmZWN0LXRyYWNraW5nL2VuZ2luZS1pc3N1ZXMubWQgRS0xMykKICAvLyBPcmlnaW5hbDoKICAvLyAgICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJUdWJlcmN1bG9zaXMgZm9yIFVyb2xvZ3kgQ2FyZSJdCiAgLy8gICAgIHVuaW9uIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJUdWJlcmN1bG9zaXMgZm9yIFVyb2xvZ3kgQ2FyZSJdICkKICAoIFtGSElSLkNvbmRpdGlvbjogIlR1YmVyY3Vsb3NpcyBmb3IgVXJvbG9neSBDYXJlIl0gKSBBY3RpdmVUdWJlcmN1bG9zaXMKICAgIHdpdGggIkZpcnN0IEJsYWRkZXIgQ2FuY2VyIFN0YWdpbmcgUHJvY2VkdXJlIiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nCiAgICAgIHN1Y2ggdGhhdCAoICggQWN0aXZlVHViZXJjdWxvc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkKICAgICAgICAgIG9yICggQWN0aXZlVHViZXJjdWxvc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICAgICAgICAgICAgYW5kICggKCBBY3RpdmVUdWJlcmN1bG9zaXMuYWJhdGVtZW50LnRvSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApCiAgICAgICAgICAgICAgICAgIG9yICggQWN0aXZlVHViZXJjdWxvc2lzLmFiYXRlbWVudCBpcyBudWxsICkKICAgICAgICAgICAgICApCiAgICAgICAgICApCiAgICAgICkKICAgIHdoZXJlIEFjdGl2ZVR1YmVyY3Vsb3Npcy5pc1ZlcmlmaWVkICggKQoKZGVmaW5lICJDeXN0ZWN0b215IERvbmUiOgogIFtQcm9jZWR1cmU6ICJDeXN0ZWN0b215IGZvciBVcm9sb2d5IENhcmUiXSBDeXN0ZWN0b215CiAgICB3aXRoICJGaXJzdCBCbGFkZGVyIENhbmNlciBTdGFnaW5nIFByb2NlZHVyZSIgRmlyc3RCbGFkZGVyQ2FuY2VyU3RhZ2luZwogICAgICBzdWNoIHRoYXQgQ3lzdGVjdG9teS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgNiBtb250aHMgb3IgbGVzcyBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBDeXN0ZWN0b215LnN0YXR1cyA9ICdjb21wbGV0ZWQnCgpkZWZpbmUgIkhhcyBFeGNsdWRpbmcgSElWLCBJbW11bm9jb21wcm9taXNlZCBDb25kaXRpb25zIG9yIE1peGVkIEhpc3RvbG9neSBCZWZvcmUgU3RhZ2luZyI6CiAgLy8gW0UtMTNdIGJhc2UgRkhJUi5Db25kaXRpb24gcmV0cmlldmVzIChkZWZlY3QtdHJhY2tpbmcvZW5naW5lLWlzc3Vlcy5tZCBFLTEzKQogIC8vIE9yaWdpbmFsOgogIC8vICAgZXhpc3RzICggKCAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiSElWIl0KICAvLyAgICAgICAgIHVuaW9uIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJISVYiXQogIC8vICAgICApCiAgLy8gICAgICAgdW5pb24gKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkltbXVub2NvbXByb21pc2VkIENvbmRpdGlvbnMiXQogIC8vICAgICAgICAgICB1bmlvbiBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzOiAiSW1tdW5vY29tcHJvbWlzZWQgQ29uZGl0aW9ucyJdCiAgLy8gICAgICAgKQogIC8vICAgICAgIHVuaW9uICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJNaXhlZCBIaXN0b2xvZ3kgVXJvdGhlbGlhbCBDZWxsIENhcmNpbm9tYSBmb3IgVXJvbG9neSBDYXJlIl0KICAvLyAgICAgICAgICAgdW5pb24gW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3NpczogIk1peGVkIEhpc3RvbG9neSBVcm90aGVsaWFsIENlbGwgQ2FyY2lub21hIGZvciBVcm9sb2d5IENhcmUiXQogIC8vICAgICAgICkgKSBFeGNsdXNpb25EaWFnbm9zaXMKICBleGlzdHMgKCAoICggW0ZISVIuQ29uZGl0aW9uOiAiSElWIl0KICAgICkKICAgICAgdW5pb24gKCBbRkhJUi5Db25kaXRpb246ICJJbW11bm9jb21wcm9taXNlZCBDb25kaXRpb25zIl0KICAgICAgKQogICAgICB1bmlvbiAoIFtGSElSLkNvbmRpdGlvbjogIk1peGVkIEhpc3RvbG9neSBVcm90aGVsaWFsIENlbGwgQ2FyY2lub21hIGZvciBVcm9sb2d5IENhcmUiXQogICAgICApICkgRXhjbHVzaW9uRGlhZ25vc2lzCiAgICAgIHdpdGggIkZpcnN0IEJsYWRkZXIgQ2FuY2VyIFN0YWdpbmcgUHJvY2VkdXJlIiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nCiAgICAgICAgc3VjaCB0aGF0ICggKCBFeGNsdXNpb25EaWFnbm9zaXMucHJldmFsZW5jZUludGVydmFsICggKSBzdGFydHMgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApCiAgICAgICAgICAgIG9yICggRXhjbHVzaW9uRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgRmlyc3RCbGFkZGVyQ2FuY2VyU3RhZ2luZy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKQogICAgICAgICkKICAgICAgd2hlcmUgRXhjbHVzaW9uRGlhZ25vc2lzLmlzVmVyaWZpZWQgKCApCiAgKQoKZGVmaW5lICJIYXMgRXhjbHVkaW5nIENoZW1vdGhlcmFweSBvciBSYWRpb3RoZXJhcHkgUHJvY2VkdXJlIEJlZm9yZSBTdGFnaW5nIjoKICBleGlzdHMgKCAoIFtNZWRpY2F0aW9uUmVxdWVzdDogIkNoZW1vdGhlcmFweSBBZ2VudHMgZm9yIEFkdmFuY2VkIENhbmNlciJdIEV4Y2x1c2lvbk1lZAogICAgICAgIGxldCBmaXJzdE1lZGljYXRpb25QZXJpb2Q6IEZpcnN0KChjb2xsYXBzZShFeGNsdXNpb25NZWQuZG9zYWdlSW5zdHJ1Y3Rpb24udGltaW5nLnJlcGVhdC5ib3VuZHMgRG9zZVRpbWUKICAgICAgICAgICAgICByZXR1cm4gRG9zZVRpbWUudG9JbnRlcnZhbCgpCiAgICAgICAgICApKSBEcnVnUGVyaW9kcwogICAgICAgICAgICBzb3J0IGJ5IHN0YXJ0IG9mICR0aGlzCiAgICAgICAgKQogICAgICAgIHdpdGggIkZpcnN0IEJsYWRkZXIgQ2FuY2VyIFN0YWdpbmcgUHJvY2VkdXJlIiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nCiAgICAgICAgICBzdWNoIHRoYXQgZmlyc3RNZWRpY2F0aW9uUGVyaW9kIHN0YXJ0cyA2IG1vbnRocyBvciBsZXNzIGJlZm9yZSBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nLnBlcmZvcm1lZC50b0ludGVydmFsICggKQogICAgICAgIHdoZXJlIEV4Y2x1c2lvbk1lZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgICAgYW5kIEV4Y2x1c2lvbk1lZC5pbnRlbnQgPSAnb3JkZXInCiAgICApCiAgICAgIHVuaW9uICggW1Byb2NlZHVyZTogIkNvbWJpbmVkIHJhZGlvdGhlcmFweSAocHJvY2VkdXJlKSJdIEV4Y2x1c2lvblByb2NlZHVyZQogICAgICAgICAgd2l0aCAiRmlyc3QgQmxhZGRlciBDYW5jZXIgU3RhZ2luZyBQcm9jZWR1cmUiIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcKICAgICAgICAgICAgc3VjaCB0aGF0IEV4Y2x1c2lvblByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIDYgbW9udGhzIG9yIGxlc3MgYmVmb3JlIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICAgICAgICB3aGVyZSBFeGNsdXNpb25Qcm9jZWR1cmUuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICApCiAgKQoKZGVmaW5lICJGaXJzdCBCbGFkZGVyIENhbmNlciBTdGFnaW5nIFByb2NlZHVyZSI6CiAgRmlyc3QoW1Byb2NlZHVyZTogIlR1bW9yIHN0YWdpbmcgKHR1bW9yIHN0YWdpbmcpIl0gQmxhZGRlckNhbmNlclN0YWdpbmcKICAgICAgd2l0aCAiQmxhZGRlciBDYW5jZXIgRGlhZ25vc2lzIiBCbGFkZGVyQ2FuY2VyCiAgICAgICAgc3VjaCB0aGF0IEJsYWRkZXJDYW5jZXJTdGFnaW5nLnBlcmZvcm1lZC50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgQmxhZGRlckNhbmNlci5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApCiAgICAgIHdoZXJlIEJsYWRkZXJDYW5jZXJTdGFnaW5nLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgIHNvcnQgYnkgc3RhcnQgb2YgcGVyZm9ybWVkLnRvSW50ZXJ2YWwoKQogICkKCmRlZmluZSAiSGFzIFF1YWxpZnlpbmcgRW5jb3VudGVyIjoKICBleGlzdHMgKCBbRW5jb3VudGVyOiAiT2ZmaWNlIFZpc2l0Il0gVmFsaWRFbmNvdW50ZXIKICAgICAgd2hlcmUgVmFsaWRFbmNvdW50ZXIucGVyaW9kIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgICBhbmQgVmFsaWRFbmNvdW50ZXIuY2xhc3MgIX4gInZpcnR1YWwiCiAgICAgICAgYW5kIFZhbGlkRW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKICApCgpkZWZpbmUgIkJsYWRkZXIgQ2FuY2VyIERpYWdub3NpcyI6CiAgLy8gW0UtMTNdIGJhc2UgRkhJUi5Db25kaXRpb24gcmV0cmlldmUgKGRlZmVjdC10cmFja2luZy9lbmdpbmUtaXNzdWVzLm1kIEUtMTMpCiAgLy8gT3JpZ2luYWw6CiAgLy8gICAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQmxhZGRlciBDYW5jZXIgZm9yIFVyb2xvZ3kgQ2FyZSJdCiAgLy8gICAgIHVuaW9uIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJCbGFkZGVyIENhbmNlciBmb3IgVXJvbG9neSBDYXJlIl0gKQogICggW0ZISVIuQ29uZGl0aW9uOiAiQmxhZGRlciBDYW5jZXIgZm9yIFVyb2xvZ3kgQ2FyZSJdICkgQmxhZGRlckNhbmNlcgogICAgd2hlcmUgKCBCbGFkZGVyQ2FuY2VyLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBkYXkgb2YgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgb3IgQmxhZGRlckNhbmNlci5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIGJlZm9yZSBkYXkgb2YgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCiAgICApCiAgICAgIGFuZCBCbGFkZGVyQ2FuY2VyLmlzVmVyaWZpZWQgKCApCgpkZWZpbmUgIkJDRyBOb3QgQXZhaWxhYmxlIFdpdGhpbiA2IE1vbnRocyBBZnRlciBCbGFkZGVyIENhbmNlciBTdGFnaW5nIjoKICBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIkJhY2lsbHVzIENhbG1ldHRlIEd1ZXJpbiBmb3IgVXJvbG9neSBDYXJlIl0gQkNHTm90R2l2ZW4KICAgIHdpdGggIkZpcnN0IEJsYWRkZXIgQ2FuY2VyIFN0YWdpbmcgUHJvY2VkdXJlIiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nCiAgICAgIHN1Y2ggdGhhdCBCQ0dOb3RHaXZlbi5lZmZlY3RpdmUgNiBtb250aHMgb3IgbGVzcyBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgRmlyc3RCbGFkZGVyQ2FuY2VyU3RhZ2luZy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgIHdoZXJlIEJDR05vdEdpdmVuLnN0YXR1c1JlYXNvbiBpbiAiVW5hdmFpbGFiaWxpdHkgb2YgQmFjaWxsdXMgQ2FsbWV0dGUgR3VlcmluIGZvciBVcm9sb2d5IENhcmUiCgpkZWZpbmUgIkZpcnN0IEJsYWRkZXIgQ2FuY2VyIFN0YWdpbmcgUHJvY2VkdXJlIGR1cmluZyA2IE1vbnRocyBQcmlvciB0byBNZWFzdXJlbWVudCBQZXJpb2QgdGhyb3VnaCB0aGUgRmlyc3QgNiBNb250aHMgb2YgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAiRmlyc3QgQmxhZGRlciBDYW5jZXIgU3RhZ2luZyBQcm9jZWR1cmUiIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcKICAgIHdoZXJlIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmcucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbIkp1bHkgMSBvZiBZZWFyIFByaW9yIHRvIHRoZSBNZWFzdXJlbWVudCBQZXJpb2QiLCAiSnVuZSAzMCBvZiB0aGUgTWVhc3VyZW1lbnQgUGVyaW9kIl0KCmRlZmluZSAiRmlyc3QgQkNHIEFkbWluaXN0ZXJlZCI6CiAgRmlyc3QoW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbjogIkJhY2lsbHVzIENhbG1ldHRlIEd1ZXJpbiBmb3IgVXJvbG9neSBDYXJlIl0gQkNHCiAgICAgIHdpdGggIkZpcnN0IEJsYWRkZXIgQ2FuY2VyIFN0YWdpbmcgUHJvY2VkdXJlIiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nCiAgICAgICAgc3VjaCB0aGF0IEJDRy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyA2IG1vbnRocyBvciBsZXNzIGFmdGVyIGRheSBvZiBzdGFydCBvZiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nLnBlcmZvcm1lZC50b0ludGVydmFsKCkKICAgICAgICAgIGFuZCBCQ0cuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICB3aGVyZSBCQ0cuc3RhdHVzIGluIHsgJ2luLXByb2dyZXNzJywgJ2NvbXBsZXRlZCcgfQogICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICApCgovKlRhIEhpZ2ggR3JhZGUgb25seSB0byBiZSBpbmNsdWRlZC4gIFRhIGxvdyBncmFkZSBpcyB0byBiZSBleGNsdWRlZCBmcm9tIHRoaXMgbWVhc3VyZS4qLwoKCmRlZmluZSAiSGFzIE1vc3QgUmVjZW50IEJsYWRkZXIgQ2FuY2VyIFR1bW9yIFN0YWdpbmcgaXMgVDEsIFRpcywgVGEgSEciOgogIGV4aXN0cyAoIFtMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb25dIFN0YWdpbmdPYnNlcnZhdGlvbgogICAgICB3aGVyZSBTdGFnaW5nT2JzZXJ2YXRpb24uZ2V0U3RhZ2luZ1Byb2NlZHVyZSAoICkgaXMgbm90IG51bGwKICAgICAgICBhbmQgKCBTdGFnaW5nT2JzZXJ2YXRpb24udmFsdWUgYXMgQ29kZWFibGVDb25jZXB0IH4gIkFtZXJpY2FuIEpvaW50IENvbW1pdHRlZSBvbiBDYW5jZXIgY1QxIChxdWFsaWZpZXIgdmFsdWUpIgogICAgICAgICAgICBvciBTdGFnaW5nT2JzZXJ2YXRpb24udmFsdWUgYXMgQ29kZWFibGVDb25jZXB0IH4gIkFtZXJpY2FuIEpvaW50IENvbW1pdHRlZSBvbiBDYW5jZXIgY1RpcyAocXVhbGlmaWVyIHZhbHVlKSIKICAgICAgICAgICAgb3IgU3RhZ2luZ09ic2VydmF0aW9uLnZhbHVlIGFzIENvZGVhYmxlQ29uY2VwdCB+ICJBbWVyaWNhbiBKb2ludCBDb21taXR0ZWUgb24gQ2FuY2VyIGNUYSAocXVhbGlmaWVyIHZhbHVlKSIKICAgICAgICAgICAgb3IgU3RhZ2luZ09ic2VydmF0aW9uLnZhbHVlIGFzIENvZGVhYmxlQ29uY2VwdCB+ICJDYXJjaW5vbWEgaW4gc2l0dSBvZiBibGFkZGVyIgogICAgICAgICkKICAgICAgICBhbmQgU3RhZ2luZ09ic2VydmF0aW9uLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICkKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZ2V0U3RhZ2luZ1Byb2NlZHVyZShTdGFnaW5nT2JzZXJ2YXRpb24gTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uKToKICBTdGFnaW5nT2JzZXJ2YXRpb24ucGFydE9mIFN0YWdpbmdSZWZlcmVuY2UKICAgIHJldHVybiAiRmlyc3QgQmxhZGRlciBDYW5jZXIgU3RhZ2luZyBQcm9jZWR1cmUgZHVyaW5nIDYgTW9udGhzIFByaW9yIHRvIE1lYXN1cmVtZW50IFBlcmlvZCB0aHJvdWdoIHRoZSBGaXJzdCA2IE1vbnRocyBvZiBNZWFzdXJlbWVudCBQZXJpb2QiIEZpcnN0QmxhZGRlckNhbmNlclN0YWdpbmdNUAogICAgICB3aGVyZSBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nTVAuaWQgPSBTdGFnaW5nUmVmZXJlbmNlLnJlZmVyZW5jZS5nZXRJZCAoICkKCmRlZmluZSAiSW1tdW5vc3VwcHJlc3NpdmUgRHJ1Z3MiOgogIFtNZWRpY2F0aW9uUmVxdWVzdDogIkltbXVub3N1cHByZXNzaXZlIERydWdzIGZvciBVcm9sb2d5IENhcmUiXSBJbW11bm9zdXBwcmVzc2l2ZURydWdzCiAgICBsZXQgZmlyc3RNZWRpY2F0aW9uUGVyaW9kOiBGaXJzdCgoY29sbGFwc2UoSW1tdW5vc3VwcHJlc3NpdmVEcnVncy5kb3NhZ2VJbnN0cnVjdGlvbi50aW1pbmcucmVwZWF0LmJvdW5kcyBEb3NlVGltZQogICAgICAgICAgcmV0dXJuIERvc2VUaW1lLnRvSW50ZXJ2YWwoKQogICAgICApKSBEcnVnUGVyaW9kcwogICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgJHRoaXMKICAgICksCiAgICAvL2dldCB0aGUgdmVyeSBmaXJzdCBldmVudAogICAgCiAgICBmaXJzdE1lZGljYXRpb25FdmVudDogRmlyc3QoKEltbXVub3N1cHByZXNzaXZlRHJ1Z3MuZG9zYWdlSW5zdHJ1Y3Rpb24udGltaW5nIGRvc2FnZVRpbWluZwogICAgICAgIC8vcmV0dXJuIGZpcnN0IGV2ZW50IGZvciB0aGUgc3BlY2lmaWMgZG9zYWdlVGltaW5nCiAgICAgICAgCiAgICAgICAgcmV0dXJuIEZpcnN0KGRvc2FnZVRpbWluZy5ldmVudCBkb3NhZ2VUaW1pbmdFdmVudHMKICAgICAgICAgICAgc29ydCBhc2NlbmRpbmcKICAgICAgICApKSBmaXJzdEV2ZW50cwogICAgICAgIHNvcnQgYXNjZW5kaW5nCiAgICApLAogICAgbWVkaWNhdGlvblBlcmlvZDogQ29hbGVzY2UoZmlyc3RNZWRpY2F0aW9uRXZlbnQudG9JbnRlcnZhbCgpLCBmaXJzdE1lZGljYXRpb25QZXJpb2QpCiAgICB3aXRoICJGaXJzdCBCbGFkZGVyIENhbmNlciBTdGFnaW5nIFByb2NlZHVyZSIgRmlyc3RCbGFkZGVyQ2FuY2VyU3RhZ2luZwogICAgICBzdWNoIHRoYXQgbWVkaWNhdGlvblBlcmlvZCBzdGFydHMgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBGaXJzdEJsYWRkZXJDYW5jZXJTdGFnaW5nLnBlcmZvcm1lZC50b0ludGVydmFsICggKQogICAgd2hlcmUgSW1tdW5vc3VwcHJlc3NpdmVEcnVncy5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICBhbmQgSW1tdW5vc3VwcHJlc3NpdmVEcnVncy5pbnRlbnQgPSAnb3JkZXInCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzVmVyaWZpZWQoY29uZGl0aW9uIENob2ljZTxDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXMsIENvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM+KToKICBjb25kaXRpb24udmVyaWZpY2F0aW9uU3RhdHVzIGlzIG5vdCBudWxsIGltcGxpZXMgKCBjb25kaXRpb24udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJjb25maXJtZWQiCiAgICAgIG9yIGNvbmRpdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgfiBTdGF0dXMuInVuY29uZmlybWVkIgogICAgICBvciBjb25kaXRpb24udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJwcm92aXNpb25hbCIKICAgICAgb3IgY29uZGl0aW9uLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4iZGlmZmVyZW50aWFsIgogICk=",
      "url" : "https://madie.cms.gov/Library-CMS646FHIRIntravesicalBCGTherapy.cql"
    }
  ]
}