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
| Draft as of 2026-09-19 |
{
"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 "SNOMEDCT": 'http://snomed.info/sct'\ncodesystem "ICD10CM": 'http://hl7.org/fhir/sid/icd-10-cm'\ncodesystem "ActCode": 'http://terminology.hl7.org/CodeSystem/v3-ActCode'\n\nvalueset "Bacillus Calmette Guerin for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.353'\nvalueset "Bladder Cancer for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.354'\nvalueset "Chemotherapy Agents for Advanced Cancer": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.355'\nvalueset "Cystectomy for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.358'\nvalueset "HIV": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.120.12.1003'\nvalueset "Immunocompromised Conditions": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.363'\nvalueset "Immunosuppressive Drugs for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.364'\nvalueset "Mixed Histology Urothelial Cell Carcinoma for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.365'\nvalueset "Office Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'\nvalueset "Tuberculosis for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.351'\nvalueset "Unavailability of Bacillus Calmette Guerin for Urology Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.369'\n\ncode "American Joint Committee on Cancer cT1 (qualifier value)": '1228889001' from "SNOMEDCT" display 'American Joint Committee on Cancer cT1 (qualifier value)'\ncode "American Joint Committee on Cancer cTa (qualifier value)": '1228883000' from "SNOMEDCT" display 'American Joint Committee on Cancer cTa (qualifier value)'\ncode "American Joint Committee on Cancer cTis (qualifier value)": '1228884006' from "SNOMEDCT" display 'American Joint Committee on Cancer cTis (qualifier value)'\ncode "Carcinoma in situ of bladder": 'D09.0' from "ICD10CM" display 'Carcinoma in situ of bladder'\ncode "Combined radiotherapy (procedure)": '169331000' from "SNOMEDCT" display 'Combined radiotherapy (procedure)'\ncode "Tumor staging (tumor staging)": '254292007' from "SNOMEDCT" display 'Tumor staging (tumor staging)'\ncode "virtual": 'VR' from "ActCode" display 'virtual'\n\nparameter "Measurement Period" Interval<DateTime>\n default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine "Initial Population":\n "Has Most Recent Bladder Cancer Tumor Staging is T1, Tis, Ta HG"\n and "Has Qualifying Encounter"\n\ndefine "Denominator":\n "Initial Population"\n\ndefine "Denominator Exclusion":\n exists "Acute Tuberculosis Diagnosis"\n or exists "Immunosuppressive Drugs"\n or exists "Cystectomy Done"\n or "Has Excluding HIV, Immunocompromised Conditions or Mixed Histology Before Staging"\n or "Has Excluding Chemotherapy or Radiotherapy Procedure Before Staging"\n\ndefine "Denominator Exception":\n exists "BCG Not Available Within 6 Months After Bladder Cancer Staging"\n\ndefine "Numerator":\n "First BCG Administered" is not null\n\ndefine "SDE Ethnicity":\n SDE."SDE Ethnicity"\n\ndefine "SDE Payer":\n SDE."SDE Payer"\n\ndefine "SDE Race":\n SDE."SDE Race"\n\ndefine "SDE Sex":\n SDE."SDE Sex"\n\ndefine "July 1 of Year Prior to the Measurement Period":\n Date((year from start of "Measurement Period" - 1), 7, 1)\n\ndefine "June 30 of the Measurement Period":\n Date((year from start of "Measurement Period"), 6, 30)\n\ndefine "Acute Tuberculosis Diagnosis":\n // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n // Original:\n // ( [ConditionProblemsHealthConcerns: "Tuberculosis for Urology Care"]\n // union [ConditionEncounterDiagnosis: "Tuberculosis for Urology Care"] )\n ( [FHIR.Condition: "Tuberculosis for Urology Care"] ) ActiveTuberculosis\n with "First Bladder Cancer Staging Procedure" 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 "Cystectomy Done":\n [Procedure: "Cystectomy for Urology Care"] Cystectomy\n with "First Bladder Cancer Staging Procedure" 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 "Has Excluding HIV, Immunocompromised Conditions or Mixed Histology Before Staging":\n // [E-13] base FHIR.Condition retrieves (defect-tracking/engine-issues.md E-13)\n // Original:\n // exists ( ( ( [ConditionProblemsHealthConcerns: "HIV"]\n // union [ConditionEncounterDiagnosis: "HIV"]\n // )\n // union ( [ConditionProblemsHealthConcerns: "Immunocompromised Conditions"]\n // union [ConditionEncounterDiagnosis: "Immunocompromised Conditions"]\n // )\n // union ( [ConditionProblemsHealthConcerns: "Mixed Histology Urothelial Cell Carcinoma for Urology Care"]\n // union [ConditionEncounterDiagnosis: "Mixed Histology Urothelial Cell Carcinoma for Urology Care"]\n // ) ) ExclusionDiagnosis\n exists ( ( ( [FHIR.Condition: "HIV"]\n )\n union ( [FHIR.Condition: "Immunocompromised Conditions"]\n )\n union ( [FHIR.Condition: "Mixed Histology Urothelial Cell Carcinoma for Urology Care"]\n ) ) ExclusionDiagnosis\n with "First Bladder Cancer Staging Procedure" 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 "Has Excluding Chemotherapy or Radiotherapy Procedure Before Staging":\n exists ( ( [MedicationRequest: "Chemotherapy Agents for Advanced Cancer"] 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 "First Bladder Cancer Staging Procedure" 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: "Combined radiotherapy (procedure)"] ExclusionProcedure\n with "First Bladder Cancer Staging Procedure" 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 "First Bladder Cancer Staging Procedure":\n First([Procedure: "Tumor staging (tumor staging)"] BladderCancerStaging\n with "Bladder Cancer Diagnosis" 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 "Has Qualifying Encounter":\n exists ( [Encounter: "Office Visit"] ValidEncounter\n where ValidEncounter.period during day of "Measurement Period"\n and ValidEncounter.class !~ "virtual"\n and ValidEncounter.status = 'finished'\n )\n\ndefine "Bladder Cancer Diagnosis":\n // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n // Original:\n // ( [ConditionProblemsHealthConcerns: "Bladder Cancer for Urology Care"]\n // union [ConditionEncounterDiagnosis: "Bladder Cancer for Urology Care"] )\n ( [FHIR.Condition: "Bladder Cancer for Urology Care"] ) BladderCancer\n where ( BladderCancer.prevalenceInterval ( ) starts before day of end of "Measurement Period"\n or BladderCancer.prevalenceInterval ( ) before day of end of "Measurement Period"\n )\n and BladderCancer.isVerified ( )\n\ndefine "BCG Not Available Within 6 Months After Bladder Cancer Staging":\n [MedicationAdministrationNotDone: "Bacillus Calmette Guerin for Urology Care"] BCGNotGiven\n with "First Bladder Cancer Staging Procedure" FirstBladderCancerStaging\n such that BCGNotGiven.effective 6 months or less after day of start of FirstBladderCancerStaging.performed.toInterval ( )\n where BCGNotGiven.statusReason in "Unavailability of Bacillus Calmette Guerin for Urology Care"\n\ndefine "First Bladder Cancer Staging Procedure during 6 Months Prior to Measurement Period through the First 6 Months of Measurement Period":\n "First Bladder Cancer Staging Procedure" FirstBladderCancerStaging\n where FirstBladderCancerStaging.performed.toInterval ( ) during day of Interval["July 1 of Year Prior to the Measurement Period", "June 30 of the Measurement Period"]\n\ndefine "First BCG Administered":\n First([MedicationAdministration: "Bacillus Calmette Guerin for Urology Care"] BCG\n with "First Bladder Cancer Staging Procedure" 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 "Measurement Period"\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 "Has Most Recent Bladder Cancer Tumor Staging is T1, Tis, Ta HG":\n exists ( [LaboratoryResultObservation] StagingObservation\n where StagingObservation.getStagingProcedure ( ) is not null\n and ( StagingObservation.value as CodeableConcept ~ "American Joint Committee on Cancer cT1 (qualifier value)"\n or StagingObservation.value as CodeableConcept ~ "American Joint Committee on Cancer cTis (qualifier value)"\n or StagingObservation.value as CodeableConcept ~ "American Joint Committee on Cancer cTa (qualifier value)"\n or StagingObservation.value as CodeableConcept ~ "Carcinoma in situ of bladder"\n )\n and StagingObservation.status in { 'final', 'amended', 'corrected' }\n )\n\ndefine fluent function getStagingProcedure(StagingObservation LaboratoryResultObservation):\n StagingObservation.partOf StagingReference\n return "First Bladder Cancer Staging Procedure during 6 Months Prior to Measurement Period through the First 6 Months of Measurement Period" FirstBladderCancerStagingMP\n where FirstBladderCancerStagingMP.id = StagingReference.reference.getId ( )\n\ndefine "Immunosuppressive Drugs":\n [MedicationRequest: "Immunosuppressive Drugs for Urology Care"] 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 "First Bladder Cancer Staging Procedure" 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<ConditionEncounterDiagnosis, ConditionProblemsHealthConcerns>):\n condition.verificationStatus is not null implies ( condition.verificationStatus ~ Status."confirmed"\n or condition.verificationStatus ~ Status."unconfirmed"\n or condition.verificationStatus ~ Status."provisional"\n or condition.verificationStatus ~ Status."differential"\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"
}
]
}