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

: CMS2FHIRPCSDepScreenAndFollowUp - JSON Representation

Active as of 2025-08-22

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS2FHIRPCSDepScreenAndFollowUp",
  "meta" : {
    "profile" : [
      🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"
    ]
  },
  "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\">Metadata</th>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Title</th>\n\n\n\n<td class=\"content-container\">CMS2FHIRPCSDepScreenAndFollowUp</td>\n\n\n</tr>\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\">Topic</th>\n\n\n\n<td class=\"content-container\">FHIR\n</td>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">CQL\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Steward (Publisher)</th>\n\n\n\n<td class=\"content-container\">Centers for Medicare &amp; Medicaid Services (CMS)</td>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Description</th>\n\n\n\n<td class=\"content-container\"><div><p>CMS2FHIRPCSDepScreenAndFollowUp</p>\n</div></td>\n\n\n</tr>\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    logic-library from <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a> \n\n\n</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\"><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  <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 CMS2FHIRPCSDepScreenAndFollowUp 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.CumulativeMedicationDuration version '2.0.0-ballot' called CMD\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\n\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\n\nvalueset &quot;Adolescent Depression Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1567'\nvalueset &quot;Adult Depression Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1566'\nvalueset &quot;Bipolar Disorder&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.128'\nvalueset &quot;Encounter to Screen for Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.600.1916'\nvalueset &quot;Follow Up for Adolescent Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1569'\nvalueset &quot;Follow Up for Adult Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1568'\nvalueset &quot;Medical Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007'\nvalueset &quot;Physical Therapy Evaluation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1022'\nvalueset &quot;Referral for Adolescent Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1570'\nvalueset &quot;Referral for Adult Depression&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1571'\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;Adolescent depression screening assessment&quot;: '73831-0' from &quot;LOINC&quot; display 'Adolescent depression screening assessment'\ncode &quot;Adult depression screening assessment&quot;: '73832-8' from &quot;LOINC&quot; display 'Adult depression screening assessment'\ncode &quot;Depression screening declined (situation)&quot;: '720834000' from &quot;SNOMEDCT&quot; display 'Depression screening declined (situation)'\ncode &quot;Depression screening negative (finding)&quot;: '428171000124102' from &quot;SNOMEDCT&quot; display 'Depression screening negative (finding)'\ncode &quot;Depression screening positive (finding)&quot;: '428181000124104' from &quot;SNOMEDCT&quot; display 'Depression screening positive (finding)'\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;Patient Age 12 Years or Older at Start of Measurement Period&quot;\n    and exists ( &quot;Qualifying Encounter During Measurement Period&quot; )\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  exists &quot;History of Bipolar Diagnosis Before Qualifying Encounter&quot;\n\ndefine &quot;Numerator&quot;:\n  ( &quot;Patient Age 12 to 16 Years at Start of Measurement Period&quot;\n      and ( &quot;Has Most Recent Adolescent Screening Negative&quot;\n          or exists &quot;Most Recent Adolescent Depression Screening Positive and Follow Up Provided&quot;\n      )\n  )\n    or ( &quot;Patient Age 17 Years at Start of Measurement Period&quot;\n        and ( &quot;Has Most Recent Adolescent Screening Negative&quot;\n            or exists &quot;Most Recent Adolescent Depression Screening Positive and Follow Up Provided&quot;\n            or &quot;Has Most Recent Adult Screening Negative&quot;\n            or exists &quot;Most Recent Adult Depression Screening Positive and Follow Up Provided&quot;\n        )\n    )\n    or ( &quot;Patient Age 18 Years or Older at Start of Measurement Period&quot;\n        and ( &quot;Has Most Recent Adult Screening Negative&quot;\n            or exists &quot;Most Recent Adult Depression Screening Positive and Follow Up Provided&quot;\n        )\n    )\n\ndefine &quot;Denominator Exceptions&quot;:\n  false\n/*\nTODO: Need to reassess how we are representing given no ObservationCancelled profile\n  ( exists &quot;Medical or Patient Reason for Not Screening Adolescent for Depression&quot;\n      and not &quot;Has Adolescent Depression Screening&quot;\n  )\n    or ( exists &quot;Medical or Patient Reason for Not Screening Adult for Depression&quot;\n        and not &quot;Has Adult Depression Screening&quot;\n    )\n*/\n\ndefine &quot;Follow Up Intervention for Positive Adolescent Depression Screening&quot;:\n  ( ( [USQualityCore.MedicationRequest: &quot;Adolescent Depression Medications&quot;] AdolescentMed\n        with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n          such that &quot;Most Recent Adolescent Depression Screening&quot;.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n            and AdolescentMed.medicationRequestPeriod ( ) overlaps after day of QualifyingEncounter.period\n            and &quot;Most Recent Adolescent Depression Screening&quot;.value ~ &quot;Depression screening positive (finding)&quot;\n            and AdolescentMed.status in { 'active', 'completed' }\n            and AdolescentMed.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n    )\n      union ( [USQualityCore.ServiceRequest: &quot;Referral for Adolescent Depression&quot;] AdolescentReferral\n          where AdolescentReferral.status in { 'active', 'completed' }\n      )\n      union ( [USQualityCore.Procedure: &quot;Follow Up for Adolescent Depression&quot;] AdolescentFollowUp\n          where AdolescentFollowUp.status = 'completed'\n      )\n  )\n\ndefine &quot;Follow Up Intervention for Positive Adult Depression Screening&quot;:\n  ( ( [USQualityCore.MedicationRequest: &quot;Adult Depression Medications&quot;] AdultMed\n        with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n          such that &quot;Most Recent Adult Depression Screening&quot;.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n            and AdultMed.medicationRequestPeriod ( ) overlaps after day of QualifyingEncounter.period\n            and &quot;Most Recent Adult Depression Screening&quot;.value ~ &quot;Depression screening positive (finding)&quot;\n            and AdultMed.status in { 'active', 'completed' }\n            and AdultMed.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n    )\n      union ( [USQualityCore.ServiceRequest: &quot;Referral for Adult Depression&quot;] AdultReferral\n          where AdultReferral.status in { 'active', 'completed' }\n      )\n      union ( [USQualityCore.Procedure: &quot;Follow Up for Adult Depression&quot;] AdultFollowUp\n          where AdultFollowUp.status = 'completed'\n      )\n  )\n\ndefine &quot;Has Adolescent Depression Screening&quot;:\n  exists ( [USQualityCore.ObservationScreeningAssessment: &quot;Adolescent depression screening assessment&quot;] AdolescentScreening\n      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n        such that AdolescentScreening.effective.toInterval ( ) 14 days or less on or before day of start of QualifyingEncounter.period\n          and AdolescentScreening.value is not null\n          and AdolescentScreening.status in { 'final', 'amended', 'corrected' }\n  )\n\ndefine &quot;Has Adult Depression Screening&quot;:\n  exists ( [USQualityCore.ObservationScreeningAssessment: &quot;Adult depression screening assessment&quot;] AdultScreening\n      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n        such that AdultScreening.effective.toInterval ( ) 14 days or less on or before day of start of QualifyingEncounter.period\n          and AdultScreening.value is not null\n          and AdultScreening.status in { 'final', 'amended', 'corrected' }\n  )\n\ndefine &quot;Has Most Recent Adolescent Screening Negative&quot;:\n  ( &quot;Most Recent Adolescent Depression Screening&quot; AdolescentScreen\n      where AdolescentScreen.value ~ &quot;Depression screening negative (finding)&quot;\n  ) is not null\n\ndefine &quot;Has Most Recent Adult Screening Negative&quot;:\n  ( &quot;Most Recent Adult Depression Screening&quot; AdultScreen\n      where AdultScreen.value ~ &quot;Depression screening negative (finding)&quot;\n  ) is not null\n\ndefine &quot;History of Bipolar Diagnosis Before Qualifying Encounter&quot;:\n  [USQualityCore.ConditionProblemsHealthConcerns: &quot;Bipolar Disorder&quot;] BipolarDiagnosis\n    with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n      such that BipolarDiagnosis.prevalenceInterval ( ) starts before day of start of QualifyingEncounter.period\n\n/*\nTODO: Needs to be reassessed given the pattern change for ObservationCancelled, this should really be a ServiceRequest with a TaskRejected, yes?\ndefine &quot;Medical or Patient Reason for Not Screening Adolescent for Depression&quot;:\n  [USQualityCore.ObservationCancelled: code ~ &quot;Adolescent depression screening assessment&quot;] NoAdolescentScreen\n    with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n      such that NoAdolescentScreen.issued during day of QualifyingEncounter.period\n    where ( NoAdolescentScreen.notDoneReason ~ &quot;Depression screening declined (situation)&quot;\n        or NoAdolescentScreen.notDoneReason in &quot;Medical Reason&quot;\n    )\n\ndefine &quot;Medical or Patient Reason for Not Screening Adult for Depression&quot;:\n  [USQualityCore.ObservationCancelled: code ~ &quot;Adult depression screening assessment&quot;] NoAdultScreen\n    with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n      such that NoAdultScreen.issued during day of QualifyingEncounter.period\n    where ( NoAdultScreen.notDoneReason ~ &quot;Depression screening declined (situation)&quot;\n        or NoAdultScreen.notDoneReason in &quot;Medical Reason&quot;\n    )\n*/\n\ndefine &quot;Most Recent Adolescent Depression Screening&quot;:\n  Last([USQualityCore.ObservationScreeningAssessment: &quot;Adolescent depression screening assessment&quot;] AdolescentDepressionScreening\n      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n        such that AdolescentDepressionScreening.effective.toInterval() 14 days or less on or before day of start of QualifyingEncounter.period\n          and AdolescentDepressionScreening.value is not null\n          and AdolescentDepressionScreening.status in { 'final', 'amended', 'corrected' }\n      sort by start of effective.toInterval()\n  )\n\ndefine &quot;Most Recent Adolescent Depression Screening Positive and Follow Up Provided&quot;:\n  from\n    &quot;Most Recent Adolescent Depression Screening&quot; LastAdolescentScreen,\n    &quot;Follow Up Intervention for Positive Adolescent Depression Screening&quot; FollowUpPositiveAdolescentScreen,\n    &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n    where LastAdolescentScreen.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n      and LastAdolescentScreen.value ~ &quot;Depression screening positive (finding)&quot;\n      and ( start of FollowUpPositiveAdolescentScreen.performed.toInterval ( ) during QualifyingEncounter.period\n          or FollowUpPositiveAdolescentScreen.authoredOn 2 days or less on or after day of end of QualifyingEncounter.period\n      )\n      and ( Coalesce(start of FollowUpPositiveAdolescentScreen.performed.toInterval(), FollowUpPositiveAdolescentScreen.authoredOn) during day of &quot;Measurement Period&quot; )\n\ndefine &quot;Most Recent Adult Depression Screening&quot;:\n  Last([USQualityCore.ObservationScreeningAssessment: &quot;Adult depression screening assessment&quot;] AdultDepressionScreening\n      with &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n        such that AdultDepressionScreening.effective.toInterval() 14 days or less on or before day of start of QualifyingEncounter.period\n          and AdultDepressionScreening.value is not null\n          and AdultDepressionScreening.status in { 'final', 'amended', 'corrected' }\n      sort by start of effective.toInterval()\n  )\n\ndefine &quot;Most Recent Adult Depression Screening Positive and Follow Up Provided&quot;:\n  from\n    &quot;Most Recent Adult Depression Screening&quot; LastAdultScreen,\n    &quot;Follow Up Intervention for Positive Adult Depression Screening&quot; FollowUpPositiveAdultScreen,\n    &quot;Qualifying Encounter During Measurement Period&quot; QualifyingEncounter\n    where LastAdultScreen.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n      and LastAdultScreen.value ~ &quot;Depression screening positive (finding)&quot;\n      and ( start of FollowUpPositiveAdultScreen.performed.toInterval ( ) during QualifyingEncounter.period\n          or FollowUpPositiveAdultScreen.authoredOn 2 days or less on or after day of end of QualifyingEncounter.period\n      )\n      and ( Coalesce(start of FollowUpPositiveAdultScreen.performed.toInterval(), FollowUpPositiveAdultScreen.authoredOn) during day of &quot;Measurement Period&quot; )\n\ndefine &quot;Patient Age 12 to 16 Years at Start of Measurement Period&quot;:\n  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) in Interval[12, 16]\n\ndefine &quot;Patient Age 12 Years or Older at Start of Measurement Period&quot;:\n  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 12\n\ndefine &quot;Patient Age 17 Years at Start of Measurement Period&quot;:\n  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) = 17\n\ndefine &quot;Patient Age 18 Years or Older at Start of Measurement Period&quot;:\n  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 18\n\ndefine &quot;Qualifying Encounter During Measurement Period&quot;:\n  ( [USQualityCore.Encounter: &quot;Encounter to Screen for Depression&quot;]\n    union [USQualityCore.Encounter: &quot;Physical Therapy Evaluation&quot;]\n    union [USQualityCore.Encounter: &quot;Telephone Visits&quot;] ) QualifyingEncounter\n    where QualifyingEncounter.period during day of &quot;Measurement Period&quot;\n      and QualifyingEncounter.status = 'finished'\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;</code></pre>\n      </td>\n    </tr>\n    \n  \n\n<tr>\n  <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.4 of the sample-content-ig Liquid templates</th>\n</tr>\n\n    </tbody>\n  </table>\n</div>"
  },
  "url" : "https://madie.cms.gov/Library/CMS2FHIRPCSDepScreenAndFollowUp",
  "version" : "1.1.000",
  "name" : "CMS2FHIRPCSDepScreenAndFollowUp",
  "title" : "CMS2FHIRPCSDepScreenAndFollowUp",
  "status" : "active",
  "experimental" : false,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2025-08-22T19:33:33+00:00",
  "publisher" : "Centers for Medicare & Medicaid Services (CMS)",
  "description" : "CMS2FHIRPCSDepScreenAndFollowUp",
  "topic" : [
    {
      "text" : "FHIR"
    },
    {
      "text" : "CQL"
    }
  ],
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMyRkhJUlBDU0RlcFNjcmVlbkFuZEZvbGxvd1VwIHZlcnNpb24gJzEuMS4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5DdW11bGF0aXZlTWVkaWNhdGlvbkR1cmF0aW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIENNRAppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKCnZhbHVlc2V0ICJBZG9sZXNjZW50IERlcHJlc3Npb24gTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2NycKdmFsdWVzZXQgIkFkdWx0IERlcHJlc3Npb24gTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2NicKdmFsdWVzZXQgIkJpcG9sYXIgRGlzb3JkZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjcuMS4xMDEuMS4xMjgnCnZhbHVlc2V0ICJFbmNvdW50ZXIgdG8gU2NyZWVuIGZvciBEZXByZXNzaW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjYwMC4xOTE2Jwp2YWx1ZXNldCAiRm9sbG93IFVwIGZvciBBZG9sZXNjZW50IERlcHJlc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2OScKdmFsdWVzZXQgIkZvbGxvdyBVcCBmb3IgQWR1bHQgRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xNTY4Jwp2YWx1ZXNldCAiTWVkaWNhbCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwNycKdmFsdWVzZXQgIlBoeXNpY2FsIFRoZXJhcHkgRXZhbHVhdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDIyJwp2YWx1ZXNldCAiUmVmZXJyYWwgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xNTcwJwp2YWx1ZXNldCAiUmVmZXJyYWwgZm9yIEFkdWx0IERlcHJlc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU3MScKdmFsdWVzZXQgIlRlbGVwaG9uZSBWaXNpdHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwODAnCgpjb2RlICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiOiAnNzM4MzEtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0Fkb2xlc2NlbnQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCcKY29kZSAiQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCI6ICc3MzgzMi04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCcKY29kZSAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiOiAnNzIwODM0MDAwJyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbiknCmNvZGUgIkRlcHJlc3Npb24gc2NyZWVuaW5nIG5lZ2F0aXZlIChmaW5kaW5nKSI6ICc0MjgxNzEwMDAxMjQxMDInIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdEZXByZXNzaW9uIHNjcmVlbmluZyBuZWdhdGl2ZSAoZmluZGluZyknCmNvZGUgIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSI6ICc0MjgxODEwMDAxMjQxMDQnIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdEZXByZXNzaW9uIHNjcmVlbmluZyBwb3NpdGl2ZSAoZmluZGluZyknCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIlBhdGllbnQgQWdlIDEyIFllYXJzIG9yIE9sZGVyIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCIKICAgIGFuZCBleGlzdHMgKCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgKQoKZGVmaW5lICJEZW5vbWluYXRvciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyI6CiAgZXhpc3RzICJIaXN0b3J5IG9mIEJpcG9sYXIgRGlhZ25vc2lzIEJlZm9yZSBRdWFsaWZ5aW5nIEVuY291bnRlciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAoICJQYXRpZW50IEFnZSAxMiB0byAxNiBZZWFycyBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgIGFuZCAoICJIYXMgTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICBvciBleGlzdHMgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgKQogICkKICAgIG9yICggIlBhdGllbnQgQWdlIDE3IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgICBhbmQgKCAiSGFzIE1vc3QgUmVjZW50IEFkb2xlc2NlbnQgU2NyZWVuaW5nIE5lZ2F0aXZlIgogICAgICAgICAgICBvciBleGlzdHMgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICAgICAgb3IgIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICAgIG9yIGV4aXN0cyAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICApCiAgICApCiAgICBvciAoICJQYXRpZW50IEFnZSAxOCBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgYW5kICggIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICAgIG9yIGV4aXN0cyAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICApCiAgICApCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2VwdGlvbnMiOgogIGZhbHNlCi8qClRPRE86IE5lZWQgdG8gcmVhc3Nlc3MgaG93IHdlIGFyZSByZXByZXNlbnRpbmcgZ2l2ZW4gbm8gT2JzZXJ2YXRpb25DYW5jZWxsZWQgcHJvZmlsZQogICggZXhpc3RzICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkb2xlc2NlbnQgZm9yIERlcHJlc3Npb24iCiAgICAgIGFuZCBub3QgIkhhcyBBZG9sZXNjZW50IERlcHJlc3Npb24gU2NyZWVuaW5nIgogICkKICAgIG9yICggZXhpc3RzICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkdWx0IGZvciBEZXByZXNzaW9uIgogICAgICAgIGFuZCBub3QgIkhhcyBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyIKICAgICkKKi8KCmRlZmluZSAiRm9sbG93IFVwIEludGVydmVudGlvbiBmb3IgUG9zaXRpdmUgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgKCAoIFtVU1F1YWxpdHlDb3JlLk1lZGljYXRpb25SZXF1ZXN0OiAiQWRvbGVzY2VudCBEZXByZXNzaW9uIE1lZGljYXRpb25zIl0gQWRvbGVzY2VudE1lZAogICAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICAgIHN1Y2ggdGhhdCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIudmFsdWUgfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgcG9zaXRpdmUgKGZpbmRpbmcpIgogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgKQogICAgICB1bmlvbiAoIFtVU1F1YWxpdHlDb3JlLlNlcnZpY2VSZXF1ZXN0OiAiUmVmZXJyYWwgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiJdIEFkb2xlc2NlbnRSZWZlcnJhbAogICAgICAgICAgd2hlcmUgQWRvbGVzY2VudFJlZmVycmFsLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICkKICAgICAgdW5pb24gKCBbVVNRdWFsaXR5Q29yZS5Qcm9jZWR1cmU6ICJGb2xsb3cgVXAgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiJdIEFkb2xlc2NlbnRGb2xsb3dVcAogICAgICAgICAgd2hlcmUgQWRvbGVzY2VudEZvbGxvd1VwLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICkKICApCgpkZWZpbmUgIkZvbGxvdyBVcCBJbnRlcnZlbnRpb24gZm9yIFBvc2l0aXZlIEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICAoICggW1VTUXVhbGl0eUNvcmUuTWVkaWNhdGlvblJlcXVlc3Q6ICJBZHVsdCBEZXByZXNzaW9uIE1lZGljYXRpb25zIl0gQWR1bHRNZWQKICAgICAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgICAgICBzdWNoIHRoYXQgIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCBBZHVsdE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmciLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSIKICAgICAgICAgICAgYW5kIEFkdWx0TWVkLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgICAgIGFuZCBBZHVsdE1lZC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgKQogICAgICB1bmlvbiAoIFtVU1F1YWxpdHlDb3JlLlNlcnZpY2VSZXF1ZXN0OiAiUmVmZXJyYWwgZm9yIEFkdWx0IERlcHJlc3Npb24iXSBBZHVsdFJlZmVycmFsCiAgICAgICAgICB3aGVyZSBBZHVsdFJlZmVycmFsLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICkKICAgICAgdW5pb24gKCBbVVNRdWFsaXR5Q29yZS5Qcm9jZWR1cmU6ICJGb2xsb3cgVXAgZm9yIEFkdWx0IERlcHJlc3Npb24iXSBBZHVsdEZvbGxvd1VwCiAgICAgICAgICB3aGVyZSBBZHVsdEZvbGxvd1VwLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICkKICApCgpkZWZpbmUgIkhhcyBBZG9sZXNjZW50IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICBleGlzdHMgKCBbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZG9sZXNjZW50U2NyZWVuaW5nCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgQWRvbGVzY2VudFNjcmVlbmluZy5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBBZG9sZXNjZW50U2NyZWVuaW5nLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgICAgICBhbmQgQWRvbGVzY2VudFNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCgpkZWZpbmUgIkhhcyBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgZXhpc3RzICggW1VTUXVhbGl0eUNvcmUuT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCJdIEFkdWx0U2NyZWVuaW5nCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgQWR1bHRTY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICBhbmQgQWR1bHRTY3JlZW5pbmcudmFsdWUgaXMgbm90IG51bGwKICAgICAgICAgIGFuZCBBZHVsdFNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCgpkZWZpbmUgIkhhcyBNb3N0IFJlY2VudCBBZG9sZXNjZW50IFNjcmVlbmluZyBOZWdhdGl2ZSI6CiAgKCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIgQWRvbGVzY2VudFNjcmVlbgogICAgICB3aGVyZSBBZG9sZXNjZW50U2NyZWVuLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIG5lZ2F0aXZlIChmaW5kaW5nKSIKICApIGlzIG5vdCBudWxsCgpkZWZpbmUgIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiOgogICggIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIiBBZHVsdFNjcmVlbgogICAgICB3aGVyZSBBZHVsdFNjcmVlbi52YWx1ZSB+ICJEZXByZXNzaW9uIHNjcmVlbmluZyBuZWdhdGl2ZSAoZmluZGluZykiCiAgKSBpcyBub3QgbnVsbAoKZGVmaW5lICJIaXN0b3J5IG9mIEJpcG9sYXIgRGlhZ25vc2lzIEJlZm9yZSBRdWFsaWZ5aW5nIEVuY291bnRlciI6CiAgW1VTUXVhbGl0eUNvcmUuQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkJpcG9sYXIgRGlzb3JkZXIiXSBCaXBvbGFyRGlhZ25vc2lzCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBCaXBvbGFyRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKCi8qClRPRE86IE5lZWRzIHRvIGJlIHJlYXNzZXNzZWQgZ2l2ZW4gdGhlIHBhdHRlcm4gY2hhbmdlIGZvciBPYnNlcnZhdGlvbkNhbmNlbGxlZCwgdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgU2VydmljZVJlcXVlc3Qgd2l0aCBhIFRhc2tSZWplY3RlZCwgeWVzPwpkZWZpbmUgIk1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBTY3JlZW5pbmcgQWRvbGVzY2VudCBmb3IgRGVwcmVzc2lvbiI6CiAgW1VTUXVhbGl0eUNvcmUuT2JzZXJ2YXRpb25DYW5jZWxsZWQ6IGNvZGUgfiAiQWRvbGVzY2VudCBkZXByZXNzaW9uIHNjcmVlbmluZyBhc3Nlc3NtZW50Il0gTm9BZG9sZXNjZW50U2NyZWVuCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBOb0Fkb2xlc2NlbnRTY3JlZW4uaXNzdWVkIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgIHdoZXJlICggTm9BZG9sZXNjZW50U2NyZWVuLm5vdERvbmVSZWFzb24gfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiCiAgICAgICAgb3IgTm9BZG9sZXNjZW50U2NyZWVuLm5vdERvbmVSZWFzb24gaW4gIk1lZGljYWwgUmVhc29uIgogICAgKQoKZGVmaW5lICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkdWx0IGZvciBEZXByZXNzaW9uIjoKICBbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvbkNhbmNlbGxlZDogY29kZSB+ICJBZHVsdCBkZXByZXNzaW9uIHNjcmVlbmluZyBhc3Nlc3NtZW50Il0gTm9BZHVsdFNjcmVlbgogICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICBzdWNoIHRoYXQgTm9BZHVsdFNjcmVlbi5pc3N1ZWQgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgd2hlcmUgKCBOb0FkdWx0U2NyZWVuLm5vdERvbmVSZWFzb24gfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiCiAgICAgICAgb3IgTm9BZHVsdFNjcmVlbi5ub3REb25lUmVhc29uIGluICJNZWRpY2FsIFJlYXNvbiIKICAgICkKKi8KCmRlZmluZSAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgTGFzdChbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZG9sZXNjZW50RGVwcmVzc2lvblNjcmVlbmluZwogICAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgICAgc3VjaCB0aGF0IEFkb2xlc2NlbnREZXByZXNzaW9uU2NyZWVuaW5nLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBBZG9sZXNjZW50RGVwcmVzc2lvblNjcmVlbmluZy52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgYW5kIEFkb2xlc2NlbnREZXByZXNzaW9uU2NyZWVuaW5nLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICApCgpkZWZpbmUgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCI6CiAgZnJvbQogICAgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIExhc3RBZG9sZXNjZW50U2NyZWVuLAogICAgIkZvbGxvdyBVcCBJbnRlcnZlbnRpb24gZm9yIFBvc2l0aXZlIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIEZvbGxvd1VwUG9zaXRpdmVBZG9sZXNjZW50U2NyZWVuLAogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIExhc3RBZG9sZXNjZW50U2NyZWVuLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIExhc3RBZG9sZXNjZW50U2NyZWVuLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSIKICAgICAgYW5kICggc3RhcnQgb2YgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgb3IgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4uYXV0aG9yZWRPbiAyIGRheXMgb3IgbGVzcyBvbiBvciBhZnRlciBkYXkgb2YgZW5kIG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICkKICAgICAgYW5kICggQ29hbGVzY2Uoc3RhcnQgb2YgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSwgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4uYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICBMYXN0KFtVU1F1YWxpdHlDb3JlLk9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIkFkdWx0IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZHVsdERlcHJlc3Npb25TY3JlZW5pbmcKICAgICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHN1Y2ggdGhhdCBBZHVsdERlcHJlc3Npb25TY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgYW5kIEFkdWx0RGVwcmVzc2lvblNjcmVlbmluZy52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgYW5kIEFkdWx0RGVwcmVzc2lvblNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgc29ydCBieSBzdGFydCBvZiBlZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgKQoKZGVmaW5lICJNb3N0IFJlY2VudCBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyBQb3NpdGl2ZSBhbmQgRm9sbG93IFVwIFByb3ZpZGVkIjoKICBmcm9tCiAgICAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIExhc3RBZHVsdFNjcmVlbiwKICAgICJGb2xsb3cgVXAgSW50ZXJ2ZW50aW9uIGZvciBQb3NpdGl2ZSBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyIgRm9sbG93VXBQb3NpdGl2ZUFkdWx0U2NyZWVuLAogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIExhc3RBZHVsdFNjcmVlbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBMYXN0QWR1bHRTY3JlZW4udmFsdWUgfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgcG9zaXRpdmUgKGZpbmRpbmcpIgogICAgICBhbmQgKCBzdGFydCBvZiBGb2xsb3dVcFBvc2l0aXZlQWR1bHRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgb3IgRm9sbG93VXBQb3NpdGl2ZUFkdWx0U2NyZWVuLmF1dGhvcmVkT24gMiBkYXlzIG9yIGxlc3Mgb24gb3IgYWZ0ZXIgZGF5IG9mIGVuZCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICApCiAgICAgIGFuZCAoIENvYWxlc2NlKHN0YXJ0IG9mIEZvbGxvd1VwUG9zaXRpdmVBZHVsdFNjcmVlbi5wZXJmb3JtZWQudG9JbnRlcnZhbCgpLCBGb2xsb3dVcFBvc2l0aXZlQWR1bHRTY3JlZW4uYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIlBhdGllbnQgQWdlIDEyIHRvIDE2IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgaW4gSW50ZXJ2YWxbMTIsIDE2XQoKZGVmaW5lICJQYXRpZW50IEFnZSAxMiBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDEyCgpkZWZpbmUgIlBhdGllbnQgQWdlIDE3IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPSAxNwoKZGVmaW5lICJQYXRpZW50IEFnZSAxOCBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDE4CgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICggW1VTUXVhbGl0eUNvcmUuRW5jb3VudGVyOiAiRW5jb3VudGVyIHRvIFNjcmVlbiBmb3IgRGVwcmVzc2lvbiJdCiAgICB1bmlvbiBbVVNRdWFsaXR5Q29yZS5FbmNvdW50ZXI6ICJQaHlzaWNhbCBUaGVyYXB5IEV2YWx1YXRpb24iXQogICAgdW5pb24gW1VTUXVhbGl0eUNvcmUuRW5jb3VudGVyOiAiVGVsZXBob25lIFZpc2l0cyJdICkgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgUXVhbGlmeWluZ0VuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCI="
    }
  ]
}