eCQM QICore Content Implementation Guide
2025.0.0 - CI Build

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

: HospitalHarm - XML Representation

Active as of 2025-05-27

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="HospitalHarm"/>
  <meta>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"/>
  </meta>
  <language value="en"/>
  <text>
    <status value="extensions"/>
    <div xmlns="http://www.w3.org/1999/xhtml"> 
         <table class="grid dict"> 
            <tr> 
               <th scope="row"> 
                  <b>Title: </b> 
               </th> 
               <td style="padding-left: 4px;">HospitalHarm</td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Id: </b> 
               </th> 
               <td style="padding-left: 4px;">HospitalHarm</td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Version: </b> 
               </th> 
               <td style="padding-left: 4px;">2.5.000</td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Url: </b> 
               </th> 
               <td style="padding-left: 4px;">https://madie.cms.gov/Library/HospitalHarm</td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b> official </b> 
               </th> 
               <td style="padding-left: 4px;"> 
                  <p style="margin-bottom: 5px;"> 
                     <span>681cece3b9fd191e0a14d723</span> 
                  </p> 
               </td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Type: </b> 
               </th> 
               <td style="padding-left: 4px;"> 
                  <p style="margin-bottom: 5px;"> 
                     <b>system: </b> 
                     <span>http://terminology.hl7.org/CodeSystem/library-type</span> 
                  </p> 
                  <p style="margin-bottom: 5px;"> 
                     <b>code: </b> 
                     <span>logic-library</span> 
                  </p> 
               </td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Date: </b> 
               </th> 
               <td style="padding-left: 4px;">2025-05-27T15:45:22+00:00</td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Publisher: </b> 
               </th> 
               <td style="padding-left: 4px;">ICF</td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Description: </b> 
               </th> 
               <td style="padding-left: 4px;">Utility functions designed for use specifically, but not exclusively, in Hospital Harm, Patient Safety measures.
Using QI-Core 6.0.0+, this library uses the Claim resource to fetch Present On Admission and Principal Diagnosis </td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Related Artifacts: </b> 
               </th> 
               <td style="padding-left: 4px;"> 
                  <p> 
                     <b>Dependencies</b> 
                  </p> 
                  <ul> 
                     <li>https://madie.cms.gov/Library/QICoreCommon|3.0.000</li> 
                     <li>https://madie.cms.gov/Library/FHIRHelpers|4.4.000</li> 
                     <li>https://madie.cms.gov/Library/CQMCommon|3.0.000</li> 
                     <li>http://terminology.hl7.org/CodeSystem/ex-diagnosistype</li> 
                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.198</li> 
                     <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197</li> 
                  </ul> 
               </td> 
            </tr> 
            <tr> 
               <th scope="row"> 
                  <b>Data Requirements:</b> 
               </th> 
               <td style="padding-left: 4px;"> 
                  <table class="grid-dict"> 
                     <tr> 
                        <th> 
                           <b>Type</b> 
                        </th> 
                        <th> 
                           <b>Profile</b> 
                        </th> 
                        <th> 
                           <b>MS</b> 
                        </th> 
                        <th> 
                           <b>Code Filter</b> 
                        </th> 
                     </tr> 
                     <tr> 
                        <th>Claim</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-claim</th> 
                        <th>;;;;;;</th> 
                        <th> </th> 
                     </tr> 
                     <tr> 
                        <th>Condition</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-condition-encounter-diagnosis</th> 
                        <th>;;</th> 
                        <th> </th> 
                     </tr> 
                     <tr> 
                        <th>Condition</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-condition-problems-health-concerns</th> 
                        <th>;;</th> 
                        <th> </th> 
                     </tr> 
                     <tr> 
                        <th>Procedure</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-procedure</th> 
                        <th>;;;;</th> 
                        <th> </th> 
                     </tr> 
                     <tr> 
                        <th>Observation</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-observation-lab</th> 
                        <th>;;;;</th> 
                        <th> </th> 
                     </tr> 
                     <tr> 
                        <th>Encounter</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter</th> 
                        <th>;;;;;</th> 
                        <th> </th> 
                     </tr> 
                     <tr> 
                        <th>Location</th> 
                        <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-location</th> 
                        <th>;;</th> 
                        <th> </th> 
                     </tr> 
                  </table> 
               </td> 
            </tr> 
            <tr> 
               <td colspan="2"> 
                  <table> 
                     <tr> 
                        <th> 
                           <a id="cql-content"> 
                              <b>Content: </b> 
                           </a> text/cql 
                        </th> 
                     </tr> 
                     <tr> 
                        <td> 
                           <pre><code class="language-cql">library HospitalHarm version '2.5.000'

using QICore version '6.0.0'

include FHIRHelpers version '4.4.000' called FHIRHelpers
include QICoreCommon version '3.0.000' called QICoreCommon
include CQMCommon version '3.0.000' called CQMCommon



valueset &quot;Present on Admission or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'
valueset &quot;Not Present On Admission or Documentation Insufficient to Determine&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.198'

codesystem &quot;Diagnosis Type&quot;: 'http://terminology.hl7.org/CodeSystem/ex-diagnosistype'
codesystem &quot;Procedure Type&quot;: 'http://terminology.hl7.org/CodeSystem/ex-procedure-type'
code &quot;Principal Diagnosis&quot;: 'principal' from &quot;Diagnosis Type&quot;
code &quot;Primary Procedure&quot;: 'primary' from &quot;Procedure Type&quot; 

context Patient

// In QICore 6.0.0, when inquiring about Principal Diagnosis and/or Present On Admission status, use the Claim resource(s) associated
// with the Encounter. Within each Claim resource, reference its included diagnoses elements)
// When inquiring about an Encounter's diagnoses in general, use the Encounter's included diagnoses elements).

// --------------------------- Claim-based Principal Diagnosis and Present On Admission functions ----------------------------
/* 
 @description Given a Claim, this function returns the On Admission code of a given Claim's first diagnosis, if present. Returns null otherwiese. 
 @example aClaim.diagnosisOnAdmission()
 */
 define fluent function diagnosisOnAdmission(claim Claim):
  (singleton from (
    claim.diagnosis.onAdmission 
  )) as Concept
  
// Note: previous versions of QICore (e.g. 4.1.1) determined On Admission via an encounter's diagnosis extension as such: 
// enc.diagnosis.extension E where E.url = 'http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter-diagnosisPresentOnAdmission'
// QI Core 6.0.0 and later uses Claim for this purpose. 

/*
@description Returns a list of an encounter's claims diagnoses where each claim has a status of 'active' and a use of 'claim'
@example  anEncounter.claimDiagnoses()
*/
define fluent function claimDiagnoses(encounter Encounter):
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence

/*
@description Returns a list of an encounter's claim diagnoses where each claim has a status of 'active' and a use of 'claim' and the diagnosis.onAdmission value is present
@exammple  anEncounter.claimDiagnosesWithPOA()
*/
define fluent function claimDiagnosesWithPOA(encounter Encounter):
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence and D.onAdmission is not null
   
/*
@description Returns a list of an encounter's claims procedures where each claim has a status of 'active' and a use of 'claim'
@example  anEncounter.claimProcedures()
*/
define fluent function claimProcedures(encounter Encounter):
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.procedure P where P.sequence in claimItem.procedureSequence

/*
@description Returns true if an Encounter has a claim with a principal diagnosis, false otherwise
@comment This only considers Claims whose status is 'active' and use is 'claim', and whose type includes code &quot;Principal Diagnosis&quot;
@example  anEncounter.hasPrincipalDiagnosis()
*/
define fluent function hasPrincipalDiagnosis(encounter Encounter):
exists (
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence and D.type.includesCode(&quot;Principal Diagnosis&quot;) 
) 

/*
@description Returns true if an Encounter has a claim whose principal diagnosis is in the given ValueSet, false otherwise
@comment This only considers Claims whose status is 'active' and use is 'claim', and whose type includes code &quot;Principal Diagnosis&quot;
@example  anEncounter.hasPrincipalDiagnosisIn(&quot;Acute Respiratory Failure&quot;)
*/
define fluent function hasPrincipalDiagnosisIn(encounter Encounter, diagnosisValueSet ValueSet):
exists (
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence and D.type.includesCode(&quot;Principal Diagnosis&quot;) and D.diagnosis as Concept in diagnosisValueSet
) 

/*
@description Returns true if an Encounter has a claim whose diagnosis is in  the given Valueset, and has an onAdmission value within the &quot;Present on Admission or Clinically Undetermined&quot; ValueSet, false otherwise
@comment This only considers Claims whose status is 'active' and use is 'claim'
@example  anEncounter.hasDiagnosisPresentOnAdmission(&quot;Acute Respiratory Failure&quot;)
*/
define fluent function hasDiagnosisPresentOnAdmission(encounter Encounter, diagnosisValueSet ValueSet):
exists (
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence and D.onAdmission in &quot;Present on Admission or Clinically Undetermined&quot; and D.diagnosis in diagnosisValueSet
)

/*
@description Returns true if an Encounter has a claim whose diagnosis is in  the given Valueset, and has an onAdmission value within the &quot;Not Present On Admission or Documentation Insufficient to Determine&quot; ValueSet, false otherwise
@comment This only considers Claims whose status is 'active' and use is 'claim'
@example  anEncounter.hasDiagnosisPresentOnAdmission(&quot;Acute Respiratory Failure&quot;)
*/
define fluent function hasDiagnosisNotPresentOnAdmission(encounter Encounter, diagnosisValueSet ValueSet):
exists (
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence and D.onAdmission in &quot;Not Present On Admission or Documentation Insufficient to Determine&quot; and D.diagnosis in diagnosisValueSet
)


/*
@description Returns true if an Encounter has any claim whose diagnosis has an onAdmission value within the &quot;Not Present On Admission or Documentation Insufficient to Determine&quot; ValueSet, false otherwise
@comment This only considers Claims whose status is 'active' and use is 'claim'
@example  anEncounter.hasDiagnosisPresentOnAdmission()
*/
define fluent function hasDiagnosisNotPresentOnAdmission(encounter Encounter):
exists (
  encounter E
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),
      claimItem: (claim.item I where I.encounter.references(E))
    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence and D.onAdmission in &quot;Not Present On Admission or Documentation Insufficient to Determine&quot; 
)

/*
@description Given a Claim, return true if the claim has a diagnosis that is in the given ValueSet, false otherwise
@example  aClaim.diagnosisIn(&quot;Obstetrics and VTE Obstetrics&quot;)
 */
define fluent function hasDiagnosisIn(claim Claim, vset ValueSet) :
    exists (claim.diagnosis.diagnosis D 
            where D  in vset)

// ----------------------------------- end Claim-based diagnosis functions ------------------------------------------

/*
@description Returns the Condition or Procedure referenced by the target reference
@comment the calling reference should be the reference in an Encounter resource diagnosis condition.
@example   enc.getDiagnosis().condition.getDiagnosisCondition()
*/
define fluent function getDiagnosisCondition(reference Reference):
  ([ConditionEncounterDiagnosis] C where reference.references(C.id)) 
                  union
  ([ConditionProblemsHealthConcerns] D where reference.references(D.id))
                  union
  ([Procedure] P where reference.references(P.id))

/*
@description returns a singleton QICore.Encounter.Diagnosis from the calling Encounter
@example enc.getDiagnosis()
*/
define fluent function getDiagnosis(enc Encounter) :
      singleton from (enc.diagnosis diag where  diag.condition.getDiagnosisCondition() is not null)

/*
@description returns a singleton System.Concept of the singleton Diagnosis Condtion from the calling Encounter
@example enc.getDiagnosisCode()
*/
define fluent function getDiagnosisCode(enc Encounter) :
     singleton from (enc.getDiagnosis().condition.getDiagnosisCondition().code)

/*
@description Returns true if the Encounter has a diagnosis whose code is in  the given ValueSet, false otherwise
@example   anEncounter.hasDiagnosisIn(&quot;Value set name&quot;)
*/
define fluent function hasDiagnosisIn(enc Encounter, vset ValueSet) :
      enc.getDiagnosisCode() in vset

/*
@description Returns true if the Procedure's code is in  the given ValueSet, false otherwise
@example   aProcedure.isIn(&quot;Value set name&quot;)
*/
define fluent function isIn(proc Procedure, vset ValueSet) :
      proc.code is not null and proc.code as Concept in  vset


/*
@description Returns true if the Encounter has a type code that  is in  the given ValueSet, false otherwise
@example   anEncounter.isIn(&quot;Value set name&quot;)
*/
define fluent function isIn(enc Encounter, vset ValueSet) :
      exists (enc.type aType where aType as Concept in  vset)

/*
@description Returns true if the Lab result observation's code is in  the given ValueSet, false otherwise
@example   aLaboratoryResultObservatione.isIn(&quot;Value set name&quot;)
*/
define fluent function isIn(obs LaboratoryResultObservation, vset ValueSet) :
      obs.value is not null and obs.value as Concept in  vset

/*
@description Returns true if the Location has a type code that is  in  the given ValueSet, false otherwise
@example   aLocation.isIn(&quot;Value set name&quot;)
*/
define fluent function isIn(loc Location, vset ValueSet) :
      exists (loc.type aType where aType is not null and aType as Concept in  vset)

 
/*
@description For  a number of resource types, returns true if the resource has a code or type that is in the given ValueSet
@comment The resource types available are: Procedure, LaboratoryResultObservation, Encounter, Location
@example  anEncounter.isIn(&quot;aValusetName&quot;)
*/
define fluent function isIn(choice Choice&lt;Procedure, LaboratoryResultObservation, Encounter, Location&gt;, vset ValueSet) :
case
      when choice is Procedure then Tuple { ID: (choice as Procedure).id, isInValueSet: (choice as Procedure).isIn(vset)}
      when choice is LaboratoryResultObservation then Tuple { ID: (choice as LaboratoryResultObservation).id,  isInValueSet: (choice as LaboratoryResultObservation).isIn(vset)}
      when choice is Encounter then Tuple { ID: (choice as Encounter).id,  isInValueSet: (choice as Encounter).isIn(vset)}
      when choice is Location then Tuple { ID: (choice as Location).id,  isInValueSet: (choice as Location).isIn(vset)}

else false
end

/*
@description returns a 'rank' integer value for the procedure, given the procedure's presumed parent encounter. Examines each of the procedures within the encounter's claims and returns the sequence of the procedure if the procedure's id is the same as  the given procedure.
@example  aProcedure.rank(anEncounter)
*/
define fluent function rank(targetProcedure Procedure, parentEncounter Encounter):
  singleton from ( targetProcedure P
    let 
      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(parentEncounter))),
      claimProc: (claim.procedure proc where proc.procedure.references(P))
    return claimProc.sequence R 
  )

/*
@description Given an encounter, returns true if the calling observation effective time or procedure performed starts during that encounter. 
@comment The interval of the encounter is determined by calling the CQCommon function 'HospitalizationWithObservationAndOutpatientSurgeryService'wth the encounter as the argument.
@example theObservation.startsDuringHospitalization(anEncounter)
*/

define fluent function startsDuringHospitalization(choice Choice&lt;Procedure,LaboratoryResultObservation&gt;, enc Encounter):
   case
      when choice is Procedure then QICoreCommon.ToInterval ( (choice as Procedure).performed ) starts during CQMCommon.&quot;HospitalizationWithObservationAndOutpatientSurgeryService&quot; ( enc )
      when choice is LaboratoryResultObservation then QICoreCommon.ToInterval ( (choice as LaboratoryResultObservation).effective ) starts during CQMCommon.&quot;HospitalizationWithObservationAndOutpatientSurgeryService&quot; ( enc )
else false
    end


/*
@description Given an encounter, returns true if the calling observation effective time or procedure performed occurs during that encounter. 
@comment The interval of the encounter is determined by calling the CQCommon function 'HospitalizationWithObservationAndOutpatientSurgeryService'wth the encounter as the argument.
@example   theProcedure.isDuringHospitalization(anEncounter)
*/

define fluent function isDuringHospitalization(choice Choice&lt;Procedure,LaboratoryResultObservation&gt;, enc Encounter):
   case
      when choice is Procedure then  
        QICoreCommon.ToInterval ( (choice as Procedure).performed )  during CQMCommon.&quot;HospitalizationWithObservationAndOutpatientSurgeryService&quot; ( enc )
      when choice is LaboratoryResultObservation then  
         QICoreCommon.ToInterval ((choice as LaboratoryResultObservation).effective ) during CQMCommon.&quot;HospitalizationWithObservationAndOutpatientSurgeryService&quot; ( enc )
    else false
    end

/*
@description Given an encounter, procedure or observation resource, returns a normalized Interval object, calculated using QICoreCommon.ToInterval for the given type of resource. 
@example   theEncounter.interval()
*/

define fluent function interval(choice Choice&lt;Procedure,LaboratoryResultObservation,Encounter&gt;):
   case
      when choice is Procedure   then QICoreCommon.ToInterval ( (choice as Procedure).performed ) 
      when choice is LaboratoryResultObservation then QICoreCommon.ToInterval ( (choice as LaboratoryResultObservation).effective ) 
      when choice is Encounter   then QICoreCommon.ToInterval ( (choice as Encounter).period ) 
  else null as Interval&lt;DateTime&gt;
    end</code></pre> 
                        </td> 
                     </tr> 
                  </table> 
               </td> 
            </tr> 
         </table> 
      </div>
  </text>
  <contained>
    <Parameters>
      <id value="options"/>
      <parameter>
        <name value="translatorVersion"/>
        <valueString value="3.25.0"/>
      </parameter>
      <parameter>
        <name value="option"/>
        <valueString value="EnableAnnotations"/>
      </parameter>
      <parameter>
        <name value="option"/>
        <valueString value="EnableLocators"/>
      </parameter>
      <parameter>
        <name value="option"/>
        <valueString value="DisableListDemotion"/>
      </parameter>
      <parameter>
        <name value="option"/>
        <valueString value="DisableListPromotion"/>
      </parameter>
      <parameter>
        <name value="format"/>
        <valueString value="JSON"/>
      </parameter>
      <parameter>
        <name value="format"/>
        <valueString value="XML"/>
      </parameter>
      <parameter>
        <name value="analyzeDataRequirements"/>
        <valueBoolean value="false"/>
      </parameter>
      <parameter>
        <name value="collapseDataRequirements"/>
        <valueBoolean value="false"/>
      </parameter>
      <parameter>
        <name value="compatibilityLevel"/>
        <valueString value="1.5"/>
      </parameter>
      <parameter>
        <name value="enableCqlOnly"/>
        <valueBoolean value="false"/>
      </parameter>
      <parameter>
        <name value="errorLevel"/>
        <valueString value="Info"/>
      </parameter>
      <parameter>
        <name value="signatureLevel"/>
        <valueString value="Overloads"/>
      </parameter>
      <parameter>
        <name value="validateUnits"/>
        <valueBoolean value="true"/>
      </parameter>
      <parameter>
        <name value="verifyOnly"/>
        <valueBoolean value="false"/>
      </parameter>
    </Parameters>
  </contained>
  <extension
             url="http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode">
    <valueCoding>
      <system value="http://terminology.hl7.org/CodeSystem/ex-diagnosistype"/>
      <code value="principal"/>
      <display value="Principal Diagnosis"/>
    </valueCoding>
  </extension>
  <extension
             url="http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode">
    <valueCoding>
      <system
              value="http://terminology.hl7.org/CodeSystem/ex-procedure-type"/>
      <code value="primary"/>
      <display value="Primary Procedure"/>
    </valueCoding>
  </extension>
  <extension url="http://hl7.org/fhir/StructureDefinition/cqf-cqlOptions">
    <valueReference>
      <reference value="#options"/>
    </valueReference>
  </extension>
  <url value="https://madie.cms.gov/Library/HospitalHarm"/>
  <identifier>
    <use value="official"/>
    <system value="https://madie.cms.gov/login"/>
    <value value="681cece3b9fd191e0a14d723"/>
  </identifier>
  <version value="2.5.000"/>
  <name value="HospitalHarm"/>
  <title value="HospitalHarm"/>
  <status value="active"/>
  <experimental value="false"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2025-05-27T15:45:22+00:00"/>
  <publisher value="ICF"/>
  <description
               value="Utility functions designed for use specifically, but not exclusively, in Hospital Harm, Patient Safety measures. Using QI-Core 6.0.0+, this library uses the Claim resource to fetch Present On Admission and Principal Diagnosis  "/>
  <content>
    <contentType value="text/cql"/>
    <data
          value="bGlicmFyeSBIb3NwaXRhbEhhcm0gdmVyc2lvbiAnMi41LjAwMCcNCg0KdXNpbmcgUUlDb3JlIHZlcnNpb24gJzYuMC4wJw0KDQppbmNsdWRlIEZISVJIZWxwZXJzIHZlcnNpb24gJzQuNC4wMDAnIGNhbGxlZCBGSElSSGVscGVycw0KaW5jbHVkZSBRSUNvcmVDb21tb24gdmVyc2lvbiAnMy4wLjAwMCcgY2FsbGVkIFFJQ29yZUNvbW1vbg0KaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnMy4wLjAwMCcgY2FsbGVkIENRTUNvbW1vbg0KDQoNCg0KdmFsdWVzZXQgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xOTcnDQp2YWx1ZXNldCAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk4Jw0KDQpjb2Rlc3lzdGVtICJEaWFnbm9zaXMgVHlwZSI6ICdodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL2V4LWRpYWdub3Npc3R5cGUnDQpjb2Rlc3lzdGVtICJQcm9jZWR1cmUgVHlwZSI6ICdodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL2V4LXByb2NlZHVyZS10eXBlJw0KY29kZSAiUHJpbmNpcGFsIERpYWdub3NpcyI6ICdwcmluY2lwYWwnIGZyb20gIkRpYWdub3NpcyBUeXBlIg0KY29kZSAiUHJpbWFyeSBQcm9jZWR1cmUiOiAncHJpbWFyeScgZnJvbSAiUHJvY2VkdXJlIFR5cGUiIA0KDQpjb250ZXh0IFBhdGllbnQNCg0KLy8gSW4gUUlDb3JlIDYuMC4wLCB3aGVuIGlucXVpcmluZyBhYm91dCBQcmluY2lwYWwgRGlhZ25vc2lzIGFuZC9vciBQcmVzZW50IE9uIEFkbWlzc2lvbiBzdGF0dXMsIHVzZSB0aGUgQ2xhaW0gcmVzb3VyY2UocykgYXNzb2NpYXRlZA0KLy8gd2l0aCB0aGUgRW5jb3VudGVyLiBXaXRoaW4gZWFjaCBDbGFpbSByZXNvdXJjZSwgcmVmZXJlbmNlIGl0cyBpbmNsdWRlZCBkaWFnbm9zZXMgZWxlbWVudHMpDQovLyBXaGVuIGlucXVpcmluZyBhYm91dCBhbiBFbmNvdW50ZXIncyBkaWFnbm9zZXMgaW4gZ2VuZXJhbCwgdXNlIHRoZSBFbmNvdW50ZXIncyBpbmNsdWRlZCBkaWFnbm9zZXMgZWxlbWVudHMpLg0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhaW0tYmFzZWQgUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgUHJlc2VudCBPbiBBZG1pc3Npb24gZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8qIA0KIEBkZXNjcmlwdGlvbiBHaXZlbiBhIENsYWltLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIE9uIEFkbWlzc2lvbiBjb2RlIG9mIGEgZ2l2ZW4gQ2xhaW0ncyBmaXJzdCBkaWFnbm9zaXMsIGlmIHByZXNlbnQuIFJldHVybnMgbnVsbCBvdGhlcndpZXNlLiANCiBAZXhhbXBsZSBhQ2xhaW0uZGlhZ25vc2lzT25BZG1pc3Npb24oKQ0KICovDQogZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBkaWFnbm9zaXNPbkFkbWlzc2lvbihjbGFpbSBDbGFpbSk6DQogIChzaW5nbGV0b24gZnJvbSAoDQogICAgY2xhaW0uZGlhZ25vc2lzLm9uQWRtaXNzaW9uIA0KICApKSBhcyBDb25jZXB0DQogIA0KLy8gTm90ZTogcHJldmlvdXMgdmVyc2lvbnMgb2YgUUlDb3JlIChlLmcuIDQuMS4xKSBkZXRlcm1pbmVkIE9uIEFkbWlzc2lvbiB2aWEgYW4gZW5jb3VudGVyJ3MgZGlhZ25vc2lzIGV4dGVuc2lvbiBhcyBzdWNoOiANCi8vIGVuYy5kaWFnbm9zaXMuZXh0ZW5zaW9uIEUgd2hlcmUgRS51cmwgPSAnaHR0cDovL2hsNy5vcmcvZmhpci91cy9xaWNvcmUvU3RydWN0dXJlRGVmaW5pdGlvbi9xaWNvcmUtZW5jb3VudGVyLWRpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbicNCi8vIFFJIENvcmUgNi4wLjAgYW5kIGxhdGVyIHVzZXMgQ2xhaW0gZm9yIHRoaXMgcHVycG9zZS4gDQoNCi8qDQpAZGVzY3JpcHRpb24gUmV0dXJucyBhIGxpc3Qgb2YgYW4gZW5jb3VudGVyJ3MgY2xhaW1zIGRpYWdub3NlcyB3aGVyZSBlYWNoIGNsYWltIGhhcyBhIHN0YXR1cyBvZiAnYWN0aXZlJyBhbmQgYSB1c2Ugb2YgJ2NsYWltJw0KQGV4YW1wbGUgIGFuRW5jb3VudGVyLmNsYWltRGlhZ25vc2VzKCkNCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGNsYWltRGlhZ25vc2VzKGVuY291bnRlciBFbmNvdW50ZXIpOg0KICBlbmNvdW50ZXIgRQ0KICAgIGxldCANCiAgICAgIGNsYWltOiAoW0NsYWltXSBDIHdoZXJlIEMuc3RhdHVzID0gJ2FjdGl2ZScgYW5kIEMudXNlID0gJ2NsYWltJyBhbmQgZXhpc3RzIChDLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKSksDQogICAgICBjbGFpbUl0ZW06IChjbGFpbS5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkNCiAgICByZXR1cm4gY2xhaW0uZGlhZ25vc2lzIEQgd2hlcmUgRC5zZXF1ZW5jZSBpbiBjbGFpbUl0ZW0uZGlhZ25vc2lzU2VxdWVuY2UNCg0KLyoNCkBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgbGlzdCBvZiBhbiBlbmNvdW50ZXIncyBjbGFpbSBkaWFnbm9zZXMgd2hlcmUgZWFjaCBjbGFpbSBoYXMgYSBzdGF0dXMgb2YgJ2FjdGl2ZScgYW5kIGEgdXNlIG9mICdjbGFpbScgYW5kIHRoZSBkaWFnbm9zaXMub25BZG1pc3Npb24gdmFsdWUgaXMgcHJlc2VudA0KQGV4YW1tcGxlICBhbkVuY291bnRlci5jbGFpbURpYWdub3Nlc1dpdGhQT0EoKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gY2xhaW1EaWFnbm9zZXNXaXRoUE9BKGVuY291bnRlciBFbmNvdW50ZXIpOg0KICBlbmNvdW50ZXIgRQ0KICAgIGxldCANCiAgICAgIGNsYWltOiAoW0NsYWltXSBDIHdoZXJlIEMuc3RhdHVzID0gJ2FjdGl2ZScgYW5kIEMudXNlID0gJ2NsYWltJyBhbmQgZXhpc3RzIChDLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKSksDQogICAgICBjbGFpbUl0ZW06IChjbGFpbS5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkNCiAgICByZXR1cm4gY2xhaW0uZGlhZ25vc2lzIEQgd2hlcmUgRC5zZXF1ZW5jZSBpbiBjbGFpbUl0ZW0uZGlhZ25vc2lzU2VxdWVuY2UgYW5kIEQub25BZG1pc3Npb24gaXMgbm90IG51bGwNCiAgIA0KLyoNCkBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgbGlzdCBvZiBhbiBlbmNvdW50ZXIncyBjbGFpbXMgcHJvY2VkdXJlcyB3aGVyZSBlYWNoIGNsYWltIGhhcyBhIHN0YXR1cyBvZiAnYWN0aXZlJyBhbmQgYSB1c2Ugb2YgJ2NsYWltJw0KQGV4YW1wbGUgIGFuRW5jb3VudGVyLmNsYWltUHJvY2VkdXJlcygpDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBjbGFpbVByb2NlZHVyZXMoZW5jb3VudGVyIEVuY291bnRlcik6DQogIGVuY291bnRlciBFDQogICAgbGV0IA0KICAgICAgY2xhaW06IChbQ2xhaW1dIEMgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJyBhbmQgQy51c2UgPSAnY2xhaW0nIGFuZCBleGlzdHMgKEMuaXRlbSBJIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMoRSkpKSwNCiAgICAgIGNsYWltSXRlbTogKGNsYWltLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKQ0KICAgIHJldHVybiBjbGFpbS5wcm9jZWR1cmUgUCB3aGVyZSBQLnNlcXVlbmNlIGluIGNsYWltSXRlbS5wcm9jZWR1cmVTZXF1ZW5jZQ0KDQovKg0KQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhbiBFbmNvdW50ZXIgaGFzIGEgY2xhaW0gd2l0aCBhIHByaW5jaXBhbCBkaWFnbm9zaXMsIGZhbHNlIG90aGVyd2lzZQ0KQGNvbW1lbnQgVGhpcyBvbmx5IGNvbnNpZGVycyBDbGFpbXMgd2hvc2Ugc3RhdHVzIGlzICdhY3RpdmUnIGFuZCB1c2UgaXMgJ2NsYWltJywgYW5kIHdob3NlIHR5cGUgaW5jbHVkZXMgY29kZSAiUHJpbmNpcGFsIERpYWdub3NpcyINCkBleGFtcGxlICBhbkVuY291bnRlci5oYXNQcmluY2lwYWxEaWFnbm9zaXMoKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaGFzUHJpbmNpcGFsRGlhZ25vc2lzKGVuY291bnRlciBFbmNvdW50ZXIpOg0KZXhpc3RzICgNCiAgZW5jb3VudGVyIEUNCiAgICBsZXQgDQogICAgICBjbGFpbTogKFtDbGFpbV0gQyB3aGVyZSBDLnN0YXR1cyA9ICdhY3RpdmUnIGFuZCBDLnVzZSA9ICdjbGFpbScgYW5kIGV4aXN0cyAoQy5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkpLA0KICAgICAgY2xhaW1JdGVtOiAoY2xhaW0uaXRlbSBJIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMoRSkpDQogICAgcmV0dXJuIGNsYWltLmRpYWdub3NpcyBEIHdoZXJlIEQuc2VxdWVuY2UgaW4gY2xhaW1JdGVtLmRpYWdub3Npc1NlcXVlbmNlIGFuZCBELnR5cGUuaW5jbHVkZXNDb2RlKCJQcmluY2lwYWwgRGlhZ25vc2lzIikgDQopIA0KDQovKg0KQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiBhbiBFbmNvdW50ZXIgaGFzIGEgY2xhaW0gd2hvc2UgcHJpbmNpcGFsIGRpYWdub3NpcyBpcyBpbiB0aGUgZ2l2ZW4gVmFsdWVTZXQsIGZhbHNlIG90aGVyd2lzZQ0KQGNvbW1lbnQgVGhpcyBvbmx5IGNvbnNpZGVycyBDbGFpbXMgd2hvc2Ugc3RhdHVzIGlzICdhY3RpdmUnIGFuZCB1c2UgaXMgJ2NsYWltJywgYW5kIHdob3NlIHR5cGUgaW5jbHVkZXMgY29kZSAiUHJpbmNpcGFsIERpYWdub3NpcyINCkBleGFtcGxlICBhbkVuY291bnRlci5oYXNQcmluY2lwYWxEaWFnbm9zaXNJbigiQWN1dGUgUmVzcGlyYXRvcnkgRmFpbHVyZSIpDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBoYXNQcmluY2lwYWxEaWFnbm9zaXNJbihlbmNvdW50ZXIgRW5jb3VudGVyLCBkaWFnbm9zaXNWYWx1ZVNldCBWYWx1ZVNldCk6DQpleGlzdHMgKA0KICBlbmNvdW50ZXIgRQ0KICAgIGxldCANCiAgICAgIGNsYWltOiAoW0NsYWltXSBDIHdoZXJlIEMuc3RhdHVzID0gJ2FjdGl2ZScgYW5kIEMudXNlID0gJ2NsYWltJyBhbmQgZXhpc3RzIChDLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKSksDQogICAgICBjbGFpbUl0ZW06IChjbGFpbS5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkNCiAgICByZXR1cm4gY2xhaW0uZGlhZ25vc2lzIEQgd2hlcmUgRC5zZXF1ZW5jZSBpbiBjbGFpbUl0ZW0uZGlhZ25vc2lzU2VxdWVuY2UgYW5kIEQudHlwZS5pbmNsdWRlc0NvZGUoIlByaW5jaXBhbCBEaWFnbm9zaXMiKSBhbmQgRC5kaWFnbm9zaXMgYXMgQ29uY2VwdCBpbiBkaWFnbm9zaXNWYWx1ZVNldA0KKSANCg0KLyoNCkBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYW4gRW5jb3VudGVyIGhhcyBhIGNsYWltIHdob3NlIGRpYWdub3NpcyBpcyBpbiAgdGhlIGdpdmVuIFZhbHVlc2V0LCBhbmQgaGFzIGFuIG9uQWRtaXNzaW9uIHZhbHVlIHdpdGhpbiB0aGUgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiBWYWx1ZVNldCwgZmFsc2Ugb3RoZXJ3aXNlDQpAY29tbWVudCBUaGlzIG9ubHkgY29uc2lkZXJzIENsYWltcyB3aG9zZSBzdGF0dXMgaXMgJ2FjdGl2ZScgYW5kIHVzZSBpcyAnY2xhaW0nDQpAZXhhbXBsZSAgYW5FbmNvdW50ZXIuaGFzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uKCJBY3V0ZSBSZXNwaXJhdG9yeSBGYWlsdXJlIikNCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhhc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbihlbmNvdW50ZXIgRW5jb3VudGVyLCBkaWFnbm9zaXNWYWx1ZVNldCBWYWx1ZVNldCk6DQpleGlzdHMgKA0KICBlbmNvdW50ZXIgRQ0KICAgIGxldCANCiAgICAgIGNsYWltOiAoW0NsYWltXSBDIHdoZXJlIEMuc3RhdHVzID0gJ2FjdGl2ZScgYW5kIEMudXNlID0gJ2NsYWltJyBhbmQgZXhpc3RzIChDLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKSksDQogICAgICBjbGFpbUl0ZW06IChjbGFpbS5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkNCiAgICByZXR1cm4gY2xhaW0uZGlhZ25vc2lzIEQgd2hlcmUgRC5zZXF1ZW5jZSBpbiBjbGFpbUl0ZW0uZGlhZ25vc2lzU2VxdWVuY2UgYW5kIEQub25BZG1pc3Npb24gaW4gIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiBhbmQgRC5kaWFnbm9zaXMgaW4gZGlhZ25vc2lzVmFsdWVTZXQNCikNCg0KLyoNCkBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYW4gRW5jb3VudGVyIGhhcyBhIGNsYWltIHdob3NlIGRpYWdub3NpcyBpcyBpbiAgdGhlIGdpdmVuIFZhbHVlc2V0LCBhbmQgaGFzIGFuIG9uQWRtaXNzaW9uIHZhbHVlIHdpdGhpbiB0aGUgIk5vdCBQcmVzZW50IE9uIEFkbWlzc2lvbiBvciBEb2N1bWVudGF0aW9uIEluc3VmZmljaWVudCB0byBEZXRlcm1pbmUiIFZhbHVlU2V0LCBmYWxzZSBvdGhlcndpc2UNCkBjb21tZW50IFRoaXMgb25seSBjb25zaWRlcnMgQ2xhaW1zIHdob3NlIHN0YXR1cyBpcyAnYWN0aXZlJyBhbmQgdXNlIGlzICdjbGFpbScNCkBleGFtcGxlICBhbkVuY291bnRlci5oYXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24oIkFjdXRlIFJlc3BpcmF0b3J5IEZhaWx1cmUiKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaGFzRGlhZ25vc2lzTm90UHJlc2VudE9uQWRtaXNzaW9uKGVuY291bnRlciBFbmNvdW50ZXIsIGRpYWdub3Npc1ZhbHVlU2V0IFZhbHVlU2V0KToNCmV4aXN0cyAoDQogIGVuY291bnRlciBFDQogICAgbGV0IA0KICAgICAgY2xhaW06IChbQ2xhaW1dIEMgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJyBhbmQgQy51c2UgPSAnY2xhaW0nIGFuZCBleGlzdHMgKEMuaXRlbSBJIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMoRSkpKSwNCiAgICAgIGNsYWltSXRlbTogKGNsYWltLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKQ0KICAgIHJldHVybiBjbGFpbS5kaWFnbm9zaXMgRCB3aGVyZSBELnNlcXVlbmNlIGluIGNsYWltSXRlbS5kaWFnbm9zaXNTZXF1ZW5jZSBhbmQgRC5vbkFkbWlzc2lvbiBpbiAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSIgYW5kIEQuZGlhZ25vc2lzIGluIGRpYWdub3Npc1ZhbHVlU2V0DQopDQoNCg0KLyoNCkBkZXNjcmlwdGlvbiBSZXR1cm5zIHRydWUgaWYgYW4gRW5jb3VudGVyIGhhcyBhbnkgY2xhaW0gd2hvc2UgZGlhZ25vc2lzIGhhcyBhbiBvbkFkbWlzc2lvbiB2YWx1ZSB3aXRoaW4gdGhlICJOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24gb3IgRG9jdW1lbnRhdGlvbiBJbnN1ZmZpY2llbnQgdG8gRGV0ZXJtaW5lIiBWYWx1ZVNldCwgZmFsc2Ugb3RoZXJ3aXNlDQpAY29tbWVudCBUaGlzIG9ubHkgY29uc2lkZXJzIENsYWltcyB3aG9zZSBzdGF0dXMgaXMgJ2FjdGl2ZScgYW5kIHVzZSBpcyAnY2xhaW0nDQpAZXhhbXBsZSAgYW5FbmNvdW50ZXIuaGFzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uKCkNCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhhc0RpYWdub3Npc05vdFByZXNlbnRPbkFkbWlzc2lvbihlbmNvdW50ZXIgRW5jb3VudGVyKToNCmV4aXN0cyAoDQogIGVuY291bnRlciBFDQogICAgbGV0IA0KICAgICAgY2xhaW06IChbQ2xhaW1dIEMgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJyBhbmQgQy51c2UgPSAnY2xhaW0nIGFuZCBleGlzdHMgKEMuaXRlbSBJIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMoRSkpKSwNCiAgICAgIGNsYWltSXRlbTogKGNsYWltLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKEUpKQ0KICAgIHJldHVybiBjbGFpbS5kaWFnbm9zaXMgRCB3aGVyZSBELnNlcXVlbmNlIGluIGNsYWltSXRlbS5kaWFnbm9zaXNTZXF1ZW5jZSBhbmQgRC5vbkFkbWlzc2lvbiBpbiAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSIgDQopDQoNCi8qDQpAZGVzY3JpcHRpb24gR2l2ZW4gYSBDbGFpbSwgcmV0dXJuIHRydWUgaWYgdGhlIGNsYWltIGhhcyBhIGRpYWdub3NpcyB0aGF0IGlzIGluIHRoZSBnaXZlbiBWYWx1ZVNldCwgZmFsc2Ugb3RoZXJ3aXNlDQpAZXhhbXBsZSAgYUNsYWltLmRpYWdub3Npc0luKCJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyIpDQogKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaGFzRGlhZ25vc2lzSW4oY2xhaW0gQ2xhaW0sIHZzZXQgVmFsdWVTZXQpIDoNCiAgICBleGlzdHMgKGNsYWltLmRpYWdub3Npcy5kaWFnbm9zaXMgRCANCiAgICAgICAgICAgIHdoZXJlIEQgIGluIHZzZXQpDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDbGFpbS1iYXNlZCBkaWFnbm9zaXMgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovKg0KQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIENvbmRpdGlvbiBvciBQcm9jZWR1cmUgcmVmZXJlbmNlZCBieSB0aGUgdGFyZ2V0IHJlZmVyZW5jZQ0KQGNvbW1lbnQgdGhlIGNhbGxpbmcgcmVmZXJlbmNlIHNob3VsZCBiZSB0aGUgcmVmZXJlbmNlIGluIGFuIEVuY291bnRlciByZXNvdXJjZSBkaWFnbm9zaXMgY29uZGl0aW9uLg0KQGV4YW1wbGUgICBlbmMuZ2V0RGlhZ25vc2lzKCkuY29uZGl0aW9uLmdldERpYWdub3Npc0NvbmRpdGlvbigpDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBnZXREaWFnbm9zaXNDb25kaXRpb24ocmVmZXJlbmNlIFJlZmVyZW5jZSk6DQogIChbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzXSBDIHdoZXJlIHJlZmVyZW5jZS5yZWZlcmVuY2VzKEMuaWQpKSANCiAgICAgICAgICAgICAgICAgIHVuaW9uDQogIChbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuc10gRCB3aGVyZSByZWZlcmVuY2UucmVmZXJlbmNlcyhELmlkKSkNCiAgICAgICAgICAgICAgICAgIHVuaW9uDQogIChbUHJvY2VkdXJlXSBQIHdoZXJlIHJlZmVyZW5jZS5yZWZlcmVuY2VzKFAuaWQpKQ0KDQovKg0KQGRlc2NyaXB0aW9uIHJldHVybnMgYSBzaW5nbGV0b24gUUlDb3JlLkVuY291bnRlci5EaWFnbm9zaXMgZnJvbSB0aGUgY2FsbGluZyBFbmNvdW50ZXINCkBleGFtcGxlIGVuYy5nZXREaWFnbm9zaXMoKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZ2V0RGlhZ25vc2lzKGVuYyBFbmNvdW50ZXIpIDoNCiAgICAgIHNpbmdsZXRvbiBmcm9tIChlbmMuZGlhZ25vc2lzIGRpYWcgd2hlcmUgIGRpYWcuY29uZGl0aW9uLmdldERpYWdub3Npc0NvbmRpdGlvbigpIGlzIG5vdCBudWxsKQ0KDQovKg0KQGRlc2NyaXB0aW9uIHJldHVybnMgYSBzaW5nbGV0b24gU3lzdGVtLkNvbmNlcHQgb2YgdGhlIHNpbmdsZXRvbiBEaWFnbm9zaXMgQ29uZHRpb24gZnJvbSB0aGUgY2FsbGluZyBFbmNvdW50ZXINCkBleGFtcGxlIGVuYy5nZXREaWFnbm9zaXNDb2RlKCkNCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGdldERpYWdub3Npc0NvZGUoZW5jIEVuY291bnRlcikgOg0KICAgICBzaW5nbGV0b24gZnJvbSAoZW5jLmdldERpYWdub3NpcygpLmNvbmRpdGlvbi5nZXREaWFnbm9zaXNDb25kaXRpb24oKS5jb2RlKQ0KDQovKg0KQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiB0aGUgRW5jb3VudGVyIGhhcyBhIGRpYWdub3NpcyB3aG9zZSBjb2RlIGlzIGluICB0aGUgZ2l2ZW4gVmFsdWVTZXQsIGZhbHNlIG90aGVyd2lzZQ0KQGV4YW1wbGUgICBhbkVuY291bnRlci5oYXNEaWFnbm9zaXNJbigiVmFsdWUgc2V0IG5hbWUiKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaGFzRGlhZ25vc2lzSW4oZW5jIEVuY291bnRlciwgdnNldCBWYWx1ZVNldCkgOg0KICAgICAgZW5jLmdldERpYWdub3Npc0NvZGUoKSBpbiB2c2V0DQoNCi8qDQpAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIHRoZSBQcm9jZWR1cmUncyBjb2RlIGlzIGluICB0aGUgZ2l2ZW4gVmFsdWVTZXQsIGZhbHNlIG90aGVyd2lzZQ0KQGV4YW1wbGUgICBhUHJvY2VkdXJlLmlzSW4oIlZhbHVlIHNldCBuYW1lIikNCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzSW4ocHJvYyBQcm9jZWR1cmUsIHZzZXQgVmFsdWVTZXQpIDoNCiAgICAgIHByb2MuY29kZSBpcyBub3QgbnVsbCBhbmQgcHJvYy5jb2RlIGFzIENvbmNlcHQgaW4gIHZzZXQNCg0KDQovKg0KQGRlc2NyaXB0aW9uIFJldHVybnMgdHJ1ZSBpZiB0aGUgRW5jb3VudGVyIGhhcyBhIHR5cGUgY29kZSB0aGF0ICBpcyBpbiAgdGhlIGdpdmVuIFZhbHVlU2V0LCBmYWxzZSBvdGhlcndpc2UNCkBleGFtcGxlICAgYW5FbmNvdW50ZXIuaXNJbigiVmFsdWUgc2V0IG5hbWUiKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaXNJbihlbmMgRW5jb3VudGVyLCB2c2V0IFZhbHVlU2V0KSA6DQogICAgICBleGlzdHMgKGVuYy50eXBlIGFUeXBlIHdoZXJlIGFUeXBlIGFzIENvbmNlcHQgaW4gIHZzZXQpDQoNCi8qDQpAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIHRoZSBMYWIgcmVzdWx0IG9ic2VydmF0aW9uJ3MgY29kZSBpcyBpbiAgdGhlIGdpdmVuIFZhbHVlU2V0LCBmYWxzZSBvdGhlcndpc2UNCkBleGFtcGxlICAgYUxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbmUuaXNJbigiVmFsdWUgc2V0IG5hbWUiKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaXNJbihvYnMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uLCB2c2V0IFZhbHVlU2V0KSA6DQogICAgICBvYnMudmFsdWUgaXMgbm90IG51bGwgYW5kIG9icy52YWx1ZSBhcyBDb25jZXB0IGluICB2c2V0DQoNCi8qDQpAZGVzY3JpcHRpb24gUmV0dXJucyB0cnVlIGlmIHRoZSBMb2NhdGlvbiBoYXMgYSB0eXBlIGNvZGUgdGhhdCBpcyAgaW4gIHRoZSBnaXZlbiBWYWx1ZVNldCwgZmFsc2Ugb3RoZXJ3aXNlDQpAZXhhbXBsZSAgIGFMb2NhdGlvbi5pc0luKCJWYWx1ZSBzZXQgbmFtZSIpDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBpc0luKGxvYyBMb2NhdGlvbiwgdnNldCBWYWx1ZVNldCkgOg0KICAgICAgZXhpc3RzIChsb2MudHlwZSBhVHlwZSB3aGVyZSBhVHlwZSBpcyBub3QgbnVsbCBhbmQgYVR5cGUgYXMgQ29uY2VwdCBpbiAgdnNldCkNCg0KIA0KLyoNCkBkZXNjcmlwdGlvbiBGb3IgIGEgbnVtYmVyIG9mIHJlc291cmNlIHR5cGVzLCByZXR1cm5zIHRydWUgaWYgdGhlIHJlc291cmNlIGhhcyBhIGNvZGUgb3IgdHlwZSB0aGF0IGlzIGluIHRoZSBnaXZlbiBWYWx1ZVNldA0KQGNvbW1lbnQgVGhlIHJlc291cmNlIHR5cGVzIGF2YWlsYWJsZSBhcmU6IFByb2NlZHVyZSwgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uLCBFbmNvdW50ZXIsIExvY2F0aW9uDQpAZXhhbXBsZSAgYW5FbmNvdW50ZXIuaXNJbigiYVZhbHVzZXROYW1lIikNCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzSW4oY2hvaWNlIENob2ljZTxQcm9jZWR1cmUsIExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiwgRW5jb3VudGVyLCBMb2NhdGlvbj4sIHZzZXQgVmFsdWVTZXQpIDoNCmNhc2UNCiAgICAgIHdoZW4gY2hvaWNlIGlzIFByb2NlZHVyZSB0aGVuIFR1cGxlIHsgSUQ6IChjaG9pY2UgYXMgUHJvY2VkdXJlKS5pZCwgaXNJblZhbHVlU2V0OiAoY2hvaWNlIGFzIFByb2NlZHVyZSkuaXNJbih2c2V0KX0NCiAgICAgIHdoZW4gY2hvaWNlIGlzIExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiB0aGVuIFR1cGxlIHsgSUQ6IChjaG9pY2UgYXMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uKS5pZCwgIGlzSW5WYWx1ZVNldDogKGNob2ljZSBhcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24pLmlzSW4odnNldCl9DQogICAgICB3aGVuIGNob2ljZSBpcyBFbmNvdW50ZXIgdGhlbiBUdXBsZSB7IElEOiAoY2hvaWNlIGFzIEVuY291bnRlcikuaWQsICBpc0luVmFsdWVTZXQ6IChjaG9pY2UgYXMgRW5jb3VudGVyKS5pc0luKHZzZXQpfQ0KICAgICAgd2hlbiBjaG9pY2UgaXMgTG9jYXRpb24gdGhlbiBUdXBsZSB7IElEOiAoY2hvaWNlIGFzIExvY2F0aW9uKS5pZCwgIGlzSW5WYWx1ZVNldDogKGNob2ljZSBhcyBMb2NhdGlvbikuaXNJbih2c2V0KX0NCg0KZWxzZSBmYWxzZQ0KZW5kDQoNCi8qDQpAZGVzY3JpcHRpb24gcmV0dXJucyBhICdyYW5rJyBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgcHJvY2VkdXJlLCBnaXZlbiB0aGUgcHJvY2VkdXJlJ3MgcHJlc3VtZWQgcGFyZW50IGVuY291bnRlci4gRXhhbWluZXMgZWFjaCBvZiB0aGUgcHJvY2VkdXJlcyB3aXRoaW4gdGhlIGVuY291bnRlcidzIGNsYWltcyBhbmQgcmV0dXJucyB0aGUgc2VxdWVuY2Ugb2YgdGhlIHByb2NlZHVyZSBpZiB0aGUgcHJvY2VkdXJlJ3MgaWQgaXMgdGhlIHNhbWUgYXMgIHRoZSBnaXZlbiBwcm9jZWR1cmUuDQpAZXhhbXBsZSAgYVByb2NlZHVyZS5yYW5rKGFuRW5jb3VudGVyKQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gcmFuayh0YXJnZXRQcm9jZWR1cmUgUHJvY2VkdXJlLCBwYXJlbnRFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgc2luZ2xldG9uIGZyb20gKCB0YXJnZXRQcm9jZWR1cmUgUA0KICAgIGxldCANCiAgICAgIGNsYWltOiAoW0NsYWltXSBDIHdoZXJlIEMuc3RhdHVzID0gJ2FjdGl2ZScgYW5kIEMudXNlID0gJ2NsYWltJyBhbmQgZXhpc3RzIChDLml0ZW0gSSB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzKHBhcmVudEVuY291bnRlcikpKSwNCiAgICAgIGNsYWltUHJvYzogKGNsYWltLnByb2NlZHVyZSBwcm9jIHdoZXJlIHByb2MucHJvY2VkdXJlLnJlZmVyZW5jZXMoUCkpDQogICAgcmV0dXJuIGNsYWltUHJvYy5zZXF1ZW5jZSBSIA0KICApDQoNCi8qDQpAZGVzY3JpcHRpb24gR2l2ZW4gYW4gZW5jb3VudGVyLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGxpbmcgb2JzZXJ2YXRpb24gZWZmZWN0aXZlIHRpbWUgb3IgcHJvY2VkdXJlIHBlcmZvcm1lZCBzdGFydHMgZHVyaW5nIHRoYXQgZW5jb3VudGVyLiANCkBjb21tZW50IFRoZSBpbnRlcnZhbCBvZiB0aGUgZW5jb3VudGVyIGlzIGRldGVybWluZWQgYnkgY2FsbGluZyB0aGUgQ1FDb21tb24gZnVuY3Rpb24gJ0hvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSd3dGggdGhlIGVuY291bnRlciBhcyB0aGUgYXJndW1lbnQuDQpAZXhhbXBsZSB0aGVPYnNlcnZhdGlvbi5zdGFydHNEdXJpbmdIb3NwaXRhbGl6YXRpb24oYW5FbmNvdW50ZXIpDQoqLw0KDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIHN0YXJ0c0R1cmluZ0hvc3BpdGFsaXphdGlvbihjaG9pY2UgQ2hvaWNlPFByb2NlZHVyZSxMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24+LCBlbmMgRW5jb3VudGVyKToNCiAgIGNhc2UNCiAgICAgIHdoZW4gY2hvaWNlIGlzIFByb2NlZHVyZSB0aGVuIFFJQ29yZUNvbW1vbi5Ub0ludGVydmFsICggKGNob2ljZSBhcyBQcm9jZWR1cmUpLnBlcmZvcm1lZCApIHN0YXJ0cyBkdXJpbmcgQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb25BbmRPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2UiICggZW5jICkNCiAgICAgIHdoZW4gY2hvaWNlIGlzIExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiB0aGVuIFFJQ29yZUNvbW1vbi5Ub0ludGVydmFsICggKGNob2ljZSBhcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24pLmVmZmVjdGl2ZSApIHN0YXJ0cyBkdXJpbmcgQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb25BbmRPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2UiICggZW5jICkNCmVsc2UgZmFsc2UNCiAgICBlbmQNCg0KDQovKg0KQGRlc2NyaXB0aW9uIEdpdmVuIGFuIGVuY291bnRlciwgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsaW5nIG9ic2VydmF0aW9uIGVmZmVjdGl2ZSB0aW1lIG9yIHByb2NlZHVyZSBwZXJmb3JtZWQgb2NjdXJzIGR1cmluZyB0aGF0IGVuY291bnRlci4gDQpAY29tbWVudCBUaGUgaW50ZXJ2YWwgb2YgdGhlIGVuY291bnRlciBpcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgdGhlIENRQ29tbW9uIGZ1bmN0aW9uICdIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb25BbmRPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2Und3RoIHRoZSBlbmNvdW50ZXIgYXMgdGhlIGFyZ3VtZW50Lg0KQGV4YW1wbGUgICB0aGVQcm9jZWR1cmUuaXNEdXJpbmdIb3NwaXRhbGl6YXRpb24oYW5FbmNvdW50ZXIpDQoqLw0KDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzRHVyaW5nSG9zcGl0YWxpemF0aW9uKGNob2ljZSBDaG9pY2U8UHJvY2VkdXJlLExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbj4sIGVuYyBFbmNvdW50ZXIpOg0KICAgY2FzZQ0KICAgICAgd2hlbiBjaG9pY2UgaXMgUHJvY2VkdXJlIHRoZW4gIA0KICAgICAgICBRSUNvcmVDb21tb24uVG9JbnRlcnZhbCAoIChjaG9pY2UgYXMgUHJvY2VkdXJlKS5wZXJmb3JtZWQgKSAgZHVyaW5nIENRTUNvbW1vbi4iSG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlIiAoIGVuYyApDQogICAgICB3aGVuIGNob2ljZSBpcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24gdGhlbiAgDQogICAgICAgICBRSUNvcmVDb21tb24uVG9JbnRlcnZhbCAoKGNob2ljZSBhcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24pLmVmZmVjdGl2ZSApIGR1cmluZyBDUU1Db21tb24uIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSIgKCBlbmMgKQ0KICAgIGVsc2UgZmFsc2UNCiAgICBlbmQNCg0KLyoNCkBkZXNjcmlwdGlvbiBHaXZlbiBhbiBlbmNvdW50ZXIsIHByb2NlZHVyZSBvciBvYnNlcnZhdGlvbiByZXNvdXJjZSwgcmV0dXJucyBhIG5vcm1hbGl6ZWQgSW50ZXJ2YWwgb2JqZWN0LCBjYWxjdWxhdGVkIHVzaW5nIFFJQ29yZUNvbW1vbi5Ub0ludGVydmFsIGZvciB0aGUgZ2l2ZW4gdHlwZSBvZiByZXNvdXJjZS4gDQpAZXhhbXBsZSAgIHRoZUVuY291bnRlci5pbnRlcnZhbCgpDQoqLw0KDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGludGVydmFsKGNob2ljZSBDaG9pY2U8UHJvY2VkdXJlLExhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbixFbmNvdW50ZXI+KToNCiAgIGNhc2UNCiAgICAgIHdoZW4gY2hvaWNlIGlzIFByb2NlZHVyZSAgIHRoZW4gUUlDb3JlQ29tbW9uLlRvSW50ZXJ2YWwgKCAoY2hvaWNlIGFzIFByb2NlZHVyZSkucGVyZm9ybWVkICkgDQogICAgICB3aGVuIGNob2ljZSBpcyBMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24gdGhlbiBRSUNvcmVDb21tb24uVG9JbnRlcnZhbCAoIChjaG9pY2UgYXMgTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uKS5lZmZlY3RpdmUgKSANCiAgICAgIHdoZW4gY2hvaWNlIGlzIEVuY291bnRlciAgIHRoZW4gUUlDb3JlQ29tbW9uLlRvSW50ZXJ2YWwgKCAoY2hvaWNlIGFzIEVuY291bnRlcikucGVyaW9kICkgDQogIGVsc2UgbnVsbCBhcyBJbnRlcnZhbDxEYXRlVGltZT4NCiAgICBlbmQ="/>
  </content>
</Library>