@medplum/cdk 5.0.13 → 5.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";var it=Object.create;var V=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var ct=(e,t,r)=>t in e?V(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var lt=(e,t)=>{for(var r in t)V(e,r,{get:t[r],enumerable:!0})},Ee=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of st(t))!at.call(e,n)&&n!==r&&V(e,n,{get:()=>t[n],enumerable:!(i=nt(t,n))||i.enumerable});return e};var ut=(e,t,r)=>(r=e!=null?it(ot(e)):{},Ee(t||!e||!e.__esModule?V(r,"default",{value:e,enumerable:!0}):r,e)),dt=e=>Ee(V({},"__esModule",{value:!0}),e);var c=(e,t,r)=>ct(e,typeof t!="symbol"?t+"":t,r);var Cr={};lt(Cr,{BackEnd:()=>J,CloudTrailAlarms:()=>j,FrontEnd:()=>W,MedplumGlobalStack:()=>le,MedplumPrimaryStack:()=>ce,MedplumStack:()=>K,Storage:()=>q,buildWaf:()=>U,main:()=>Ye});module.exports=dt(Cr);var ze=require("aws-cdk-lib"),Je=require("node:fs"),Ke=require("node:path");var ne=require("@aws-sdk/client-ssm");var ht=Object.defineProperty,pt=(e,t,r)=>t in e?ht(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,v=(e,t,r)=>pt(e,typeof t!="symbol"?t+"":t,r),mt=class{constructor(e,t){v(this,"operator"),v(this,"child"),this.operator=e,this.child=t}toString(){return`${this.operator}(${this.child.toString()})`}},z=class{constructor(e,t,r){v(this,"operator"),v(this,"left"),v(this,"right"),this.operator=e,this.left=t,this.right=r}toString(){return`(${this.left.toString()} ${this.operator} ${this.right.toString()})`}},ft=class{constructor(){v(this,"prefixParselets",{}),v(this,"infixParselets",{})}registerInfix(e,t){return this.infixParselets[e]=t,this}registerPrefix(e,t){return this.prefixParselets[e]=t,this}prefix(e,t,r){return this.registerPrefix(e,{parse(i,n){let s=i.consumeAndParse(t);return r(n,s)}})}infixLeft(e,t,r){return this.registerInfix(e,{parse(i,n,s){let a=i.consumeAndParse(t);return r(n,s,a)},precedence:t})}construct(e){return new yt(e,this.prefixParselets,this.infixParselets)}},yt=class{constructor(e,t,r){v(this,"tokens"),v(this,"prefixParselets"),v(this,"infixParselets"),this.tokens=e,this.prefixParselets=t,this.infixParselets=r}hasMore(){return this.tokens.length>0}match(e){return this.peek()?.id!==e?!1:(this.consume(),!0)}consumeAndParse(e=1/0){let t=this.consume(),r=this.prefixParselets[t.id];if(!r)throw new Error(`Parse error at "${t.value}" (line ${t.line}, column ${t.column}). No matching prefix parselet.`);let i=r.parse(this,t);for(;e>this.getPrecedence();){let n=this.consume();i=this.getInfixParselet(n).parse(this,i,n)}return i}getPrecedence(){let e=this.peek();if(!e)return 1/0;let t=this.getInfixParselet(e);return t?t.precedence:1/0}consume(e,t){if(!this.tokens.length)throw new Error("Cant consume unknown more tokens.");if(e&&this.peek()?.id!==e){let r=this.peek();throw new Error(`Expected ${e} but got "${r.id}" (${r.value}) at line ${r.line} column ${r.column}.`)}if(t&&this.peek()?.value!==t){let r=this.peek();throw new Error(`Expected "${t}" but got "${r.value}" at line ${r.line} column ${r.column}.`)}return this.tokens.shift()}peek(){return this.tokens.length>0?this.tokens[0]:void 0}removeComments(){this.tokens=this.tokens.filter(e=>e.id!=="Comment")}getInfixParselet(e){return this.infixParselets[e.id==="Symbol"?e.value:e.id]}},gt=class{constructor(e=10){v(this,"max"),v(this,"cache"),this.max=e,this.cache=new Map}clear(){this.cache.clear()}get(e){let t=this.cache.get(e);return t&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size>=this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}delete(e){this.cache.delete(e)}keys(){return this.cache.keys()}first(){return this.cache.keys().next().value}};var vt="unauthorized";var ee={resourceType:"OperationOutcome",id:vt,issue:[{severity:"error",code:"login",details:{text:"Unauthorized"}}]},Rr={...ee,issue:[...ee.issue,{severity:"error",code:"expired",details:{text:"Token expired"}}]},kr={...ee,issue:[...ee.issue,{severity:"error",code:"invalid",details:{text:"Token not issued for this audience"}}]};function me(e,t){return{resourceType:"OperationOutcome",issue:[{severity:"error",code:"invalid",details:{text:e},...t?{expression:[t]}:void 0}]}}function _(e){return{resourceType:"OperationOutcome",issue:[{severity:"error",code:"structure",details:{text:e}}]}}var I=class extends Error{constructor(e,t){super(St(e),t),v(this,"outcome"),this.name="OperationOutcomeError",this.outcome=e}};function St(e){let t=e.issue?.map(bt)??[];return t.length>0?t.join("; "):"Unknown error"}function bt(e){let t;return e.details?.text?e.diagnostics?t=`${e.details.text} (${e.diagnostics})`:t=e.details.text:e.diagnostics?t=e.diagnostics:t="Unknown error",e.expression?.length&&(t+=` (${e.expression.join(", ")})`),t}function wt(e,t){let r=t.max&&t.max===Number.MAX_SAFE_INTEGER?Number.POSITIVE_INFINITY:t.max;return{path:e,description:"",type:t.type??[],min:t.min??0,max:r??1,isArray:!!r&&r>1,constraints:[]}}function xt(e){let t=Object.create(null);for(let[r,i]of Object.entries(e))t[r]={name:r,type:r,path:r,elements:Object.fromEntries(Object.entries(i.elements).map(([n,s])=>[n,wt(n,s)])),constraints:[],innerTypes:[]};return t}var Et={Element:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]}}},BackboneElement:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]}}},Address:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},use:{type:[{code:"code"}]},type:{type:[{code:"code"}]},text:{type:[{code:"string"}]},line:{max:9007199254740991,type:[{code:"string"}]},city:{type:[{code:"string"}]},district:{type:[{code:"string"}]},state:{type:[{code:"string"}]},postalCode:{type:[{code:"string"}]},country:{type:[{code:"string"}]},period:{type:[{code:"Period"}]}}},Age:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},Annotation:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},"author[x]":{type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Practitioner","http://hl7.org/fhir/StructureDefinition/Patient","http://hl7.org/fhir/StructureDefinition/RelatedPerson","http://hl7.org/fhir/StructureDefinition/Organization"]},{code:"string"}]},time:{type:[{code:"dateTime"}]},text:{min:1,type:[{code:"markdown"}]}}},Attachment:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},contentType:{type:[{code:"code"}]},language:{type:[{code:"code"}]},data:{type:[{code:"base64Binary"}]},url:{type:[{code:"url"}]},size:{type:[{code:"unsignedInt"}]},hash:{type:[{code:"base64Binary"}]},title:{type:[{code:"string"}]},creation:{type:[{code:"dateTime"}]}}},CodeableConcept:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},coding:{max:9007199254740991,type:[{code:"Coding"}]},text:{type:[{code:"string"}]}}},Coding:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},system:{type:[{code:"uri"}]},version:{type:[{code:"string"}]},code:{type:[{code:"code"}]},display:{type:[{code:"string"}]},userSelected:{type:[{code:"boolean"}]}}},ContactDetail:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},name:{type:[{code:"string"}]},telecom:{max:9007199254740991,type:[{code:"ContactPoint"}]}}},ContactPoint:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},system:{type:[{code:"code"}]},value:{type:[{code:"string"}]},use:{type:[{code:"code"}]},rank:{type:[{code:"positiveInt"}]},period:{type:[{code:"Period"}]}}},Contributor:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},name:{min:1,type:[{code:"string"}]},contact:{max:9007199254740991,type:[{code:"ContactDetail"}]}}},Count:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},DataRequirement:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},profile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]},"subject[x]":{type:[{code:"CodeableConcept"},{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Group"]}]},mustSupport:{max:9007199254740991,type:[{code:"string"}]},codeFilter:{max:9007199254740991,type:[{code:"DataRequirementCodeFilter"}]},dateFilter:{max:9007199254740991,type:[{code:"DataRequirementDateFilter"}]},limit:{type:[{code:"positiveInt"}]},sort:{max:9007199254740991,type:[{code:"DataRequirementSort"}]}}},DataRequirementCodeFilter:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{type:[{code:"string"}]},searchParam:{type:[{code:"string"}]},valueSet:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/ValueSet"]}]},code:{max:9007199254740991,type:[{code:"Coding"}]}}},DataRequirementDateFilter:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{type:[{code:"string"}]},searchParam:{type:[{code:"string"}]},"value[x]":{type:[{code:"dateTime"},{code:"Period"},{code:"Duration"}]}}},DataRequirementSort:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{min:1,type:[{code:"string"}]},direction:{min:1,type:[{code:"code"}]}}},Distance:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},Dosage:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},sequence:{type:[{code:"integer"}]},text:{type:[{code:"string"}]},additionalInstruction:{max:9007199254740991,type:[{code:"CodeableConcept"}]},patientInstruction:{type:[{code:"string"}]},timing:{type:[{code:"Timing"}]},"asNeeded[x]":{type:[{code:"boolean"},{code:"CodeableConcept"}]},site:{type:[{code:"CodeableConcept"}]},route:{type:[{code:"CodeableConcept"}]},method:{type:[{code:"CodeableConcept"}]},doseAndRate:{max:9007199254740991,type:[{code:"DosageDoseAndRate"}]},maxDosePerPeriod:{type:[{code:"Ratio"}]},maxDosePerAdministration:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},maxDosePerLifetime:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]}}},DosageDoseAndRate:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{type:[{code:"CodeableConcept"}]},"dose[x]":{type:[{code:"Range"},{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},"rate[x]":{type:[{code:"Ratio"},{code:"Range"},{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]}}},Duration:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},ElementDefinition:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},path:{min:1,type:[{code:"string"}]},representation:{max:9007199254740991,type:[{code:"code"}]},sliceName:{type:[{code:"string"}]},sliceIsConstraining:{type:[{code:"boolean"}]},label:{type:[{code:"string"}]},code:{max:9007199254740991,type:[{code:"Coding"}]},slicing:{type:[{code:"ElementDefinitionSlicing"}]},short:{type:[{code:"string"}]},definition:{type:[{code:"markdown"}]},comment:{type:[{code:"markdown"}]},requirements:{type:[{code:"markdown"}]},alias:{max:9007199254740991,type:[{code:"string"}]},min:{type:[{code:"unsignedInt"}]},max:{type:[{code:"string"}]},base:{type:[{code:"ElementDefinitionBase"}]},contentReference:{type:[{code:"uri"}]},type:{max:9007199254740991,type:[{code:"ElementDefinitionType"}]},"defaultValue[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]},meaningWhenMissing:{type:[{code:"markdown"}]},orderMeaning:{type:[{code:"string"}]},"fixed[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]},"pattern[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]},example:{max:9007199254740991,type:[{code:"ElementDefinitionExample"}]},"minValue[x]":{type:[{code:"date"},{code:"dateTime"},{code:"instant"},{code:"time"},{code:"decimal"},{code:"integer"},{code:"positiveInt"},{code:"unsignedInt"},{code:"Quantity"}]},"maxValue[x]":{type:[{code:"date"},{code:"dateTime"},{code:"instant"},{code:"time"},{code:"decimal"},{code:"integer"},{code:"positiveInt"},{code:"unsignedInt"},{code:"Quantity"}]},maxLength:{type:[{code:"integer"}]},condition:{max:9007199254740991,type:[{code:"id"}]},constraint:{max:9007199254740991,type:[{code:"ElementDefinitionConstraint"}]},mustSupport:{type:[{code:"boolean"}]},isModifier:{type:[{code:"boolean"}]},isModifierReason:{type:[{code:"string"}]},isSummary:{type:[{code:"boolean"}]},binding:{type:[{code:"ElementDefinitionBinding"}]},mapping:{max:9007199254740991,type:[{code:"ElementDefinitionMapping"}]}}},ElementDefinitionSlicingDiscriminator:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},path:{min:1,type:[{code:"string"}]}}},ElementDefinitionSlicing:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},discriminator:{max:9007199254740991,type:[{code:"ElementDefinitionSlicingDiscriminator"}]},description:{type:[{code:"string"}]},ordered:{type:[{code:"boolean"}]},rules:{min:1,type:[{code:"code"}]}}},ElementDefinitionBase:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{min:1,type:[{code:"string"}]},min:{min:1,type:[{code:"unsignedInt"}]},max:{min:1,type:[{code:"string"}]}}},ElementDefinitionType:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},code:{min:1,type:[{code:"uri"}]},profile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition","http://hl7.org/fhir/StructureDefinition/ImplementationGuide"]}]},targetProfile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition","http://hl7.org/fhir/StructureDefinition/ImplementationGuide"]}]},aggregation:{max:9007199254740991,type:[{code:"code"}]},versioning:{type:[{code:"code"}]}}},ElementDefinitionExample:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},label:{min:1,type:[{code:"string"}]},"value[x]":{min:1,type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]}}},ElementDefinitionConstraint:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},key:{min:1,type:[{code:"id"}]},requirements:{type:[{code:"string"}]},severity:{min:1,type:[{code:"code"}]},human:{min:1,type:[{code:"string"}]},expression:{type:[{code:"string"}]},xpath:{type:[{code:"string"}]},source:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]}}},ElementDefinitionBinding:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},strength:{min:1,type:[{code:"code"}]},description:{type:[{code:"string"}]},valueSet:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/ValueSet"]}]}}},ElementDefinitionMapping:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},identity:{min:1,type:[{code:"id"}]},language:{type:[{code:"code"}]},map:{min:1,type:[{code:"string"}]},comment:{type:[{code:"string"}]}}},Expression:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},description:{type:[{code:"string"}]},name:{type:[{code:"id"}]},language:{min:1,type:[{code:"code"}]},expression:{type:[{code:"string"}]},reference:{type:[{code:"uri"}]}}},Extension:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},url:{min:1,type:[{code:"uri"}]},"value[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]}}},HumanName:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},use:{type:[{code:"code"}]},text:{type:[{code:"string"}]},family:{type:[{code:"string"}]},given:{max:9007199254740991,type:[{code:"string"}]},prefix:{max:9007199254740991,type:[{code:"string"}]},suffix:{max:9007199254740991,type:[{code:"string"}]},period:{type:[{code:"Period"}]}}},Identifier:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},use:{type:[{code:"code"}]},type:{type:[{code:"CodeableConcept"}]},system:{type:[{code:"uri"}]},value:{type:[{code:"string"}]},period:{type:[{code:"Period"}]},assigner:{type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Organization"]}]}}},MarketingStatus:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},country:{min:1,type:[{code:"CodeableConcept"}]},jurisdiction:{type:[{code:"CodeableConcept"}]},status:{min:1,type:[{code:"CodeableConcept"}]},dateRange:{min:1,type:[{code:"Period"}]},restoreDate:{type:[{code:"dateTime"}]}}},Meta:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},versionId:{type:[{code:"id"}]},lastUpdated:{type:[{code:"instant"}]},source:{type:[{code:"uri"}]},profile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]},security:{max:9007199254740991,type:[{code:"Coding"}]},tag:{max:9007199254740991,type:[{code:"Coding"}]},project:{type:[{code:"uri"}]},author:{type:[{code:"Reference"}]},onBehalfOf:{type:[{code:"Reference"}]},account:{type:[{code:"Reference"}]},accounts:{max:9007199254740991,type:[{code:"Reference"}]},compartment:{max:9007199254740991,type:[{code:"Reference"}]}}},Money:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},currency:{type:[{code:"code"}]}}},Narrative:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},status:{min:1,type:[{code:"code"}]},div:{min:1,type:[{code:"xhtml"}]}}},ParameterDefinition:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},name:{type:[{code:"code"}]},use:{min:1,type:[{code:"code"}]},min:{type:[{code:"integer"}]},max:{type:[{code:"string"}]},documentation:{type:[{code:"string"}]},type:{min:1,type:[{code:"code"}]},profile:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]}}},Period:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},start:{type:[{code:"dateTime"}]},end:{type:[{code:"dateTime"}]}}},Population:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},"age[x]":{type:[{code:"Range"},{code:"CodeableConcept"}]},gender:{type:[{code:"CodeableConcept"}]},race:{type:[{code:"CodeableConcept"}]},physiologicalCondition:{type:[{code:"CodeableConcept"}]}}},ProdCharacteristic:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},height:{type:[{code:"Quantity"}]},width:{type:[{code:"Quantity"}]},depth:{type:[{code:"Quantity"}]},weight:{type:[{code:"Quantity"}]},nominalVolume:{type:[{code:"Quantity"}]},externalDiameter:{type:[{code:"Quantity"}]},shape:{type:[{code:"string"}]},color:{max:9007199254740991,type:[{code:"string"}]},imprint:{max:9007199254740991,type:[{code:"string"}]},image:{max:9007199254740991,type:[{code:"Attachment"}]},scoring:{type:[{code:"CodeableConcept"}]}}},ProductShelfLife:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},identifier:{type:[{code:"Identifier"}]},type:{min:1,type:[{code:"CodeableConcept"}]},period:{min:1,type:[{code:"Quantity"}]},specialPrecautionsForStorage:{max:9007199254740991,type:[{code:"CodeableConcept"}]}}},Quantity:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},Range:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},low:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},high:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]}}},Ratio:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},numerator:{type:[{code:"Quantity"}]},denominator:{type:[{code:"Quantity"}]}}},Reference:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},reference:{type:[{code:"string"}]},type:{type:[{code:"uri"}]},identifier:{type:[{code:"Identifier"}]},display:{type:[{code:"string"}]}}},RelatedArtifact:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},label:{type:[{code:"string"}]},display:{type:[{code:"string"}]},citation:{type:[{code:"markdown"}]},url:{type:[{code:"url"}]},document:{type:[{code:"Attachment"}]},resource:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/Resource"]}]}}},SampledData:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},origin:{min:1,type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},period:{min:1,type:[{code:"decimal"}]},factor:{type:[{code:"decimal"}]},lowerLimit:{type:[{code:"decimal"}]},upperLimit:{type:[{code:"decimal"}]},dimensions:{min:1,type:[{code:"positiveInt"}]},data:{type:[{code:"string"}]}}},Signature:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,max:9007199254740991,type:[{code:"Coding"}]},when:{min:1,type:[{code:"instant"}]},who:{min:1,type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Practitioner","http://hl7.org/fhir/StructureDefinition/PractitionerRole","http://hl7.org/fhir/StructureDefinition/RelatedPerson","http://hl7.org/fhir/StructureDefinition/Patient","http://hl7.org/fhir/StructureDefinition/Device","http://hl7.org/fhir/StructureDefinition/Organization"]}]},onBehalfOf:{type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Practitioner","http://hl7.org/fhir/StructureDefinition/PractitionerRole","http://hl7.org/fhir/StructureDefinition/RelatedPerson","http://hl7.org/fhir/StructureDefinition/Patient","http://hl7.org/fhir/StructureDefinition/Device","http://hl7.org/fhir/StructureDefinition/Organization"]}]},targetFormat:{type:[{code:"code"}]},sigFormat:{type:[{code:"code"}]},data:{type:[{code:"base64Binary"}]}}},SubstanceAmount:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},"amount[x]":{type:[{code:"Quantity"},{code:"Range"},{code:"string"}]},amountType:{type:[{code:"CodeableConcept"}]},amountText:{type:[{code:"string"}]},referenceRange:{type:[{code:"SubstanceAmountReferenceRange"}]}}},SubstanceAmountReferenceRange:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},lowLimit:{type:[{code:"Quantity"}]},highLimit:{type:[{code:"Quantity"}]}}},Timing:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},event:{max:9007199254740991,type:[{code:"dateTime"}]},repeat:{type:[{code:"TimingRepeat"}]},code:{type:[{code:"CodeableConcept"}]}}},TimingRepeat:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},"bounds[x]":{type:[{code:"Duration"},{code:"Range"},{code:"Period"}]},count:{type:[{code:"positiveInt"}]},countMax:{type:[{code:"positiveInt"}]},duration:{type:[{code:"decimal"}]},durationMax:{type:[{code:"decimal"}]},durationUnit:{type:[{code:"code"}]},frequency:{type:[{code:"positiveInt"}]},frequencyMax:{type:[{code:"positiveInt"}]},period:{type:[{code:"decimal"}]},periodMax:{type:[{code:"decimal"}]},periodUnit:{type:[{code:"code"}]},dayOfWeek:{max:9007199254740991,type:[{code:"code"}]},timeOfDay:{max:9007199254740991,type:[{code:"time"}]},when:{max:9007199254740991,type:[{code:"code"}]},offset:{type:[{code:"unsignedInt"}]}}},TriggerDefinition:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},name:{type:[{code:"string"}]},"timing[x]":{type:[{code:"Timing"},{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Schedule"]},{code:"date"},{code:"dateTime"}]},data:{max:9007199254740991,type:[{code:"DataRequirement"}]},condition:{type:[{code:"Expression"}]}}},UsageContext:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},code:{min:1,type:[{code:"Coding"}]},"value[x]":{min:1,type:[{code:"CodeableConcept"},{code:"Quantity"},{code:"Range"},{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/PlanDefinition","http://hl7.org/fhir/StructureDefinition/ResearchStudy","http://hl7.org/fhir/StructureDefinition/InsurancePlan","http://hl7.org/fhir/StructureDefinition/HealthcareService","http://hl7.org/fhir/StructureDefinition/Group","http://hl7.org/fhir/StructureDefinition/Location","http://hl7.org/fhir/StructureDefinition/Organization"]}]}}},MoneyQuantity:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},SimpleQuantity:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{max:0,type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},IdentityProvider:{elements:{authorizeUrl:{min:1,type:[{code:"string"}]},tokenUrl:{min:1,type:[{code:"string"}]},tokenAuthMethod:{type:[{code:"code"}]},userInfoUrl:{min:1,type:[{code:"string"}]},clientId:{min:1,type:[{code:"string"}]},clientSecret:{min:1,type:[{code:"string"}]},usePkce:{type:[{code:"boolean"}]},useSubject:{type:[{code:"boolean"}]}}}};var Tt=xt(Et);var Te=Object.create(null);function Ct(e){let t;return t=Te[e],t||(t=Te[e]=Object.create(null)),t}function At(e,t){if(t){let r=Ct(t)[e];if(r)return r}return Tt[e]}function Pt(e,t,r){let i=e.path;return Rt(kt(e,t,r),i,t)}function Rt(e,t,r){let i=t?t+".":"";return e===void 0?{type:"undefined",value:void 0,path:`${i}${r}`}:Array.isArray(e)?e.map((n,s)=>({...n,path:`${i}${r}[${s}]`})):{...e,path:`${i}${r}`}}var Ir=new gt(1e3);var Re={base64Binary:/^([A-Za-z\d+/]{4})*([A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?$/,canonical:/^\S*$/,code:/^[^\s]+( [^\s]+)*$/,date:/^(\d(\d(\d[1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2]\d|3[0-1]))?)?$/,dateTime:/^(\d(\d(\d[1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2]\d|3[0-1])(T([01]\d|2[0-3])(:[0-5]\d:([0-5]\d|60)(\.\d{1,9})?)?)?)?(Z|[+-]((0\d|1[0-3]):[0-5]\d|14:00)?)?)?$/,id:/^[A-Za-z0-9\-.]{1,64}$/,instant:/^(\d(\d(\d[1-9]|[1-9]0)|[1-9]00)|[1-9]000)-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\d|3[0-1])T([01]\d|2[0-3]):[0-5]\d:([0-5]\d|60)(\.\d{1,9})?(Z|[+-]((0\d|1[0-3]):[0-5]\d|14:00))$/,markdown:/^[\r\n\t\u0020-\uFFFF]+$/,oid:/^urn:oid:[0-2](\.(0|[1-9]\d*))+$/,string:/^[\r\n\t\u0020-\uFFFF]+$/,time:/^([01]\d|2[0-3]):[0-5]\d:([0-5]\d|60)(\.\d{1,9})?$/,uri:/^\S*$/,url:/^\S*$/,uuid:/^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,xhtml:/.*/};function u(e){return[{type:d.boolean,value:e}]}function $(e){return e==null?{type:"undefined",value:void 0}:Number.isSafeInteger(e)?{type:d.integer,value:e}:typeof e=="number"?{type:d.decimal,value:e}:typeof e=="boolean"?{type:d.boolean,value:e}:typeof e=="string"?{type:d.string,value:e}:T(e)?{type:d.Quantity,value:e}:ie(e)?{type:e.resourceType,value:e}:Wt(e)?{type:d.CodeableConcept,value:e}:_e(e)?{type:d.Coding,value:e}:{type:d.BackboneElement,value:e}}function N(e){return e.length===0?!1:!!e[0].value}function O(e,t){if(e.length!==0){if(e.length===1&&(!t||e[0].type===t))return e[0];throw new Error(`Expected singleton of type ${t}, but found ${JSON.stringify(e)}`)}}function kt(e,t,r){if(!e.value)return;let i=Ht(e.type,t,r?.profileUrl);return i?It(e,t,i):Dt(e,t)}function It(e,t,r){let i=e.value,n=r.type;if(!n||n.length===0)return;let s,a="undefined",l,f=r.path.lastIndexOf("."),x=r.path.substring(f+1);for(let h of n){let b=x.replace("[x]",Le(h.code));if(s=i[b],l=i["_"+b],s!==void 0||l!==void 0){a=h.code;break}}if(l)if(Array.isArray(s)){s=s.slice();for(let h=0;h<Math.max(s.length,l.length);h++)s[h]=he(s[h],l[h])}else if(!s&&Array.isArray(l)){s=l.slice();for(let h=0;h<l.length;h++)s[h]=he(void 0,l[h])}else s=he(s,l);if(!Q(s))return(a==="Element"||a==="BackboneElement")&&(a=r.type[0].code),Array.isArray(s)?s.map(h=>Ce(h,a)):Ce(s,a)}function Ce(e,t){return t==="Resource"&&ie(e)&&(t=e.resourceType),{type:t,value:e}}function Dt(e,t){let r=e.value;if(!r||typeof r!="object")return;let i;if(t in r){let n=r[t];Array.isArray(n)?i=n.map($):i=$(n)}else{let n=t.endsWith("[x]")?t.substring(0,t.length-3):t;for(let s of Object.values(d)){let a=n+Le(s);if(a in r){let l=r[a];Array.isArray(l)?i=l.map(f=>({type:s,value:f})):i={type:s,value:l};break}}}if(Array.isArray(i)){if(i.length===0||Q(i[0]))return}else if(Q(i))return;return i}function ke(e){let t=[];for(let r of e){let i=!1;for(let n of t)if(N(re(r,n))){i=!0;break}i||t.push(r)}return t}function Nt(e){return u(!N(e))}function Ot(e,t){return e.length===0||t.length===0?[]:e.length!==t.length?u(!1):u(e.every((r,i)=>N(re(r,t[i]))))}function _t(e,t){return e.length===0||t.length===0?[]:e.length!==t.length?u(!0):u(e.some((r,i)=>!N(re(r,t[i]))))}function re(e,t){let r=e.value?.valueOf(),i=t.value?.valueOf();return typeof r=="number"&&typeof i=="number"?u(Math.abs(r-i)<1e-8):T(r)&&T(i)?u(Ne(r,i)):u(typeof r=="object"&&typeof i=="object"?fe(e,t):r===i)}function Ie(e,t){return e.length===0&&t.length===0?u(!0):e.length!==t.length?u(!1):(e.sort(Ae),t.sort(Ae),u(e.every((r,i)=>N(Lt(r,t[i])))))}function Lt(e,t){let{type:r,value:i}=e,{type:n,value:s}=t,a=i?.valueOf(),l=s?.valueOf();return typeof a=="number"&&typeof l=="number"?u(Math.abs(a-l)<.01):T(a)&&T(l)?u(Ne(a,l)):u(r==="Coding"&&n==="Coding"?typeof a!="object"||typeof l!="object"?!1:a.code===l.code&&a.system===l.system:typeof a=="object"&&typeof l=="object"?fe({...a,id:void 0},{...l,id:void 0}):typeof a=="string"&&typeof l=="string"?a.toLowerCase()===l.toLowerCase():a===l)}function Ae(e,t){let r=e.value?.valueOf(),i=t.value?.valueOf();return typeof r=="number"&&typeof i=="number"?r-i:typeof r=="string"&&typeof i=="string"?r.localeCompare(i):0}function De(e,t){let{value:r}=e;if(r==null)return!1;let i=t;switch(i.startsWith("System.")&&(i=i.substring(7)),i.startsWith("FHIR.")&&(i=i.substring(5)),i){case"Boolean":return typeof r=="boolean";case"Decimal":case"Integer":return typeof r=="number";case"Date":return Mt(r);case"DateTime":return pe(r);case"Time":return typeof r=="string"&&!!/^T\d/.exec(r);case"Period":return $t(r);case"Quantity":return T(r);default:return e.type===i||typeof r=="object"&&r?.resourceType===i}}function Mt(e){return typeof e=="string"&&!!Re.date.exec(e)}function pe(e){return typeof e=="string"&&!!Re.dateTime.exec(e)}function $t(e){return!!(e&&typeof e=="object"&&("start"in e&&pe(e.start)||"end"in e&&pe(e.end)))}function T(e){return!!(e&&typeof e=="object"&&"value"in e&&typeof e.value=="number")}function Ne(e,t){return Math.abs(e.value-t.value)<.01&&(e.unit===t.unit||e.code===t.code||e.unit===t.code||e.code===t.unit)}function fe(e,t){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let n of r){let s=e[n],a=t[n];if(Pe(s)&&Pe(a)){if(!fe(s,a))return!1}else if(s!==a)return!1}return!0}function Pe(e){return e!==null&&typeof e=="object"}function he(e,t){if(t){if(typeof t!="object")throw new Error("Primitive extension must be an object");return Ut(e??{},t)}return e}function Ut(e,t){return delete t.__proto__,delete t.constructor,Object.assign(e,t)}function Bt(e){if(e)return Qt(e)?e.reference.split("/")[1]:e.id}function Gt(e,t){let r=new Date(e);r.setUTCHours(0,0,0,0);let i=t?new Date(t):new Date;i.setUTCHours(0,0,0,0);let n=r.getUTCFullYear(),s=r.getUTCMonth(),a=r.getUTCDate(),l=i.getUTCFullYear(),f=i.getUTCMonth(),x=i.getUTCDate(),h=l-n;(f<s||f===s&&x<a)&&h--;let b=l*12+f-(n*12+s);x<a&&b--;let Y=Math.floor((i.getTime()-r.getTime())/(1e3*60*60*24));return{years:h,months:b,days:Y}}function Ft(e,...t){let r=e;for(let i=0;i<t.length&&r;i++)r=r?.extension?.find(n=>n.url===t[i]);return r}function Q(e){if(e==null)return!0;let t=typeof e;return t==="string"||t==="object"?!jt(e):!1}function jt(e){if(e==null)return!1;let t=typeof e;return t==="string"&&e!==""||t==="object"&&("length"in e&&e.length>0||Object.keys(e).length>0)}function Oe(e){return e!==null&&typeof e=="object"}function _e(e){return Oe(e)&&"code"in e&&typeof e.code=="string"}function Wt(e){return Oe(e)&&"coding"in e&&Array.isArray(e.coding)&&e.coding.every(_e)}var qt=[];for(let e=0;e<256;e++)qt.push(e.toString(16).padStart(2,"0"));function Le(e){return e?e.charAt(0).toUpperCase()+e.substring(1):""}var Me=Object.freeze([]);var d={Address:"Address",Age:"Age",Annotation:"Annotation",Attachment:"Attachment",BackboneElement:"BackboneElement",CodeableConcept:"CodeableConcept",Coding:"Coding",ContactDetail:"ContactDetail",ContactPoint:"ContactPoint",Contributor:"Contributor",Count:"Count",DataRequirement:"DataRequirement",Distance:"Distance",Dosage:"Dosage",Duration:"Duration",Element:"Element",ElementDefinition:"ElementDefinition",Expression:"Expression",Extension:"Extension",HumanName:"HumanName",Identifier:"Identifier",MarketingStatus:"MarketingStatus",Meta:"Meta",Money:"Money",MoneyQuantity:"MoneyQuantity",Narrative:"Narrative",ParameterDefinition:"ParameterDefinition",Period:"Period",Population:"Population",ProdCharacteristic:"ProdCharacteristic",ProductShelfLife:"ProductShelfLife",Quantity:"Quantity",Range:"Range",Ratio:"Ratio",Reference:"Reference",RelatedArtifact:"RelatedArtifact",SampledData:"SampledData",Signature:"Signature",SimpleQuantity:"SimpleQuantity",SubstanceAmount:"SubstanceAmount",SystemString:"http://hl7.org/fhirpath/System.String",Timing:"Timing",TriggerDefinition:"TriggerDefinition",UsageContext:"UsageContext",base64Binary:"base64Binary",boolean:"boolean",canonical:"canonical",code:"code",date:"date",dateTime:"dateTime",decimal:"decimal",id:"id",instant:"instant",integer:"integer",markdown:"markdown",oid:"oid",positiveInt:"positiveInt",string:"string",time:"time",unsignedInt:"unsignedInt",uri:"uri",url:"url",uuid:"uuid",xhtml:"xhtml"};function Ht(e,t,r){let i=At(e,r);if(i)return Vt(i.elements,t)}function Vt(e,t){let r=e[t]??e[t+"[x]"];if(r)return r;for(let i=0;i<t.length;i++){let n=t[i];if(n>="A"&&n<="Z"){let s=t.slice(0,i)+"[x]",a=e[s];if(a)return a}}}function ie(e,t){return!(!e||typeof e!="object"||!("resourceType"in e)||t&&e.resourceType!==t)}function Qt(e,t){return e&&typeof e=="object"&&"reference"in e&&typeof e.reference=="string"?t?e.reference.match(new RegExp(`^${t}(/|\\?)`))!==null:!0:!1}function X(e){if(e.startsWith("T"))return e+"T00:00:00.000Z".substring(e.length);if(e.length<=10)return e;try{return new Date(e).toISOString()}catch{return e}}var D=()=>[],w={empty:(e,t)=>u(t.every(r=>Q(r.value))),hasValue:(e,t)=>u(t.length!==0),exists:(e,t,r)=>u(r?t.some(i=>N(r.eval(e,[i]))):t.length>0&&t.every(i=>!Q(i.value))),all:(e,t,r)=>u(t.every(i=>N(r.eval(e,[i])))),allTrue:(e,t)=>{for(let r of t)if(!r.value)return u(!1);return u(!0)},anyTrue:(e,t)=>{for(let r of t)if(r.value)return u(!0);return u(!1)},allFalse:(e,t)=>{for(let r of t)if(r.value)return u(!1);return u(!0)},anyFalse:(e,t)=>{for(let r of t)if(!r.value)return u(!0);return u(!1)},subsetOf:(e,t,r)=>{if(t.length===0)return u(!0);let i=r.eval(e,M(e));return i.length===0?u(!1):u(t.every(n=>i.some(s=>s.value===n.value)))},supersetOf:(e,t,r)=>{let i=r.eval(e,M(e));return i.length===0?u(!0):t.length===0?u(!1):u(i.every(n=>t.some(s=>s.value===n.value)))},count:(e,t)=>[{type:d.integer,value:t.length}],distinct:(e,t)=>{let r=[];for(let i of t)r.some(n=>n.value===i.value)||r.push(i);return r},isDistinct:(e,t)=>u(t.length===w.distinct(e,t).length),where:(e,t,r)=>t.filter(i=>N(r.eval(e,[i]))),select:(e,t,r)=>t.flatMap(i=>r.eval({parent:e,variables:{$this:i}},[i])),repeat:D,ofType:(e,t,r)=>t.filter(i=>i.type===r.name),single:(e,t)=>{if(t.length>1)throw new Error("Expected input length one for single()");return t.length===0?[]:t.slice(0,1)},first:(e,t)=>t.length===0?[]:t.slice(0,1),last:(e,t)=>t.length===0?[]:t.slice(-1,t.length),tail:(e,t)=>t.length===0?[]:t.slice(1,t.length),skip:(e,t,r)=>{let i=r.eval(e,t)[0]?.value;if(typeof i!="number")throw new TypeError("Expected a number for skip(num)");return i>=t.length?[]:i<=0?t:t.slice(i,t.length)},take:(e,t,r)=>{let i=r.eval(e,t)[0]?.value;if(typeof i!="number")throw new TypeError("Expected a number for take(num)");return i>=t.length?t:i<=0?[]:t.slice(0,i)},intersect:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e)),n=[];for(let s of t)!n.some(a=>a.value===s.value)&&i.some(a=>a.value===s.value)&&n.push(s);return n},exclude:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e)),n=[];for(let s of t)i.some(a=>a.value===s.value)||n.push(s);return n},union:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e));return ke([...t,...i])},combine:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e));return[...t,...i]},htmlChecks:(e,t,r)=>[$(!0)],iif:(e,t,r,i,n)=>{let s=r.eval(e,t);if(s.length>1||s.length===1&&typeof s[0].value!="boolean")throw new Error("Expected criterion to evaluate to a Boolean");return N(s)?i.eval(e,t):n?n.eval(e,t):[]},toBoolean:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);if(typeof r=="boolean")return[{type:d.boolean,value:r}];if(typeof r=="number"&&(r===0||r===1))return u(!!r);if(typeof r=="string"){let i=r.toLowerCase();if(["true","t","yes","y","1","1.0"].includes(i))return u(!0);if(["false","f","no","n","0","0.0"].includes(i))return u(!1)}return[]},convertsToBoolean:(e,t)=>t.length===0?[]:u(w.toBoolean(e,t).length===1),toInteger:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="number"?[{type:d.integer,value:r}]:typeof r=="string"&&/^[+-]?\d+$/.exec(r)?[{type:d.integer,value:Number.parseInt(r,10)}]:typeof r=="boolean"?[{type:d.integer,value:r?1:0}]:[]},convertsToInteger:(e,t)=>t.length===0?[]:u(w.toInteger(e,t).length===1),toDate:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="string"&&/^\d{4}(-\d{2}(-\d{2})?)?/.exec(r)?[{type:d.date,value:X(r)}]:[]},convertsToDate:(e,t)=>t.length===0?[]:u(w.toDate(e,t).length===1),toDateTime:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="string"&&/^\d{4}(-\d{2}(-\d{2})?)?/.exec(r)?[{type:d.dateTime,value:X(r)}]:[]},convertsToDateTime:(e,t)=>t.length===0?[]:u(w.toDateTime(e,t).length===1),toDecimal:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="number"?[{type:d.decimal,value:r}]:typeof r=="string"&&/^-?\d{1,9}(\.\d{1,9})?$/.exec(r)?[{type:d.decimal,value:Number.parseFloat(r)}]:typeof r=="boolean"?[{type:d.decimal,value:r?1:0}]:[]},convertsToDecimal:(e,t)=>t.length===0?[]:u(w.toDecimal(e,t).length===1),toQuantity:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return T(r)?[{type:d.Quantity,value:r}]:typeof r=="number"?[{type:d.Quantity,value:{value:r,unit:"1"}}]:typeof r=="string"&&/^-?\d{1,9}(\.\d{1,9})?/.exec(r)?[{type:d.Quantity,value:{value:Number.parseFloat(r),unit:"1"}}]:typeof r=="boolean"?[{type:d.Quantity,value:{value:r?1:0,unit:"1"}}]:[]},convertsToQuantity:(e,t)=>t.length===0?[]:u(w.toQuantity(e,t).length===1),toString:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return r==null?[]:T(r)?[{type:d.string,value:`${r.value} '${r.unit}'`}]:[{type:d.string,value:r.toString()}]},convertsToString:(e,t)=>t.length===0?[]:u(w.toString(e,t).length===1),toTime:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);if(typeof r=="string"){let i=/^T?(\d{2}(:\d{2}(:\d{2})?)?)/.exec(r);if(i)return[{type:d.time,value:X("T"+i[1])}]}return[]},convertsToTime:(e,t)=>t.length===0?[]:u(w.toTime(e,t).length===1),indexOf:(e,t,r)=>E((i,n)=>i.indexOf(n),e,t,r),substring:(e,t,r,i)=>E((n,s,a)=>{let l=s,f=a?l+a:n.length;return l<0||l>=n.length?void 0:n.substring(l,f)},e,t,r,i),startsWith:(e,t,r)=>E((i,n)=>i.startsWith(n),e,t,r),endsWith:(e,t,r)=>E((i,n)=>i.endsWith(n),e,t,r),contains:(e,t,r)=>E((i,n)=>i.includes(n),e,t,r),upper:(e,t)=>E(r=>r.toUpperCase(),e,t),lower:(e,t)=>E(r=>r.toLowerCase(),e,t),replace:(e,t,r,i)=>E((n,s,a)=>n.replaceAll(s,a),e,t,r,i),matches:(e,t,r)=>E((i,n)=>!!new RegExp(n).exec(i),e,t,r),replaceMatches:(e,t,r,i)=>E((n,s,a)=>n.replaceAll(new RegExp(s,"g"),a.replaceAll(/\$\{(\w+)\}/g,"$<$1>")),e,t,r,i),length:(e,t)=>E(r=>r.length,e,t),toChars:(e,t)=>E(r=>r?r.split(""):void 0,e,t),encode:D,decode:D,escape:D,unescape:D,trim:D,split:D,join:(e,t,r)=>{let i=r?.eval(e,M(e))[0]?.value??"";if(typeof i!="string")throw new TypeError("Separator must be a string.");return[{type:d.string,value:t.map(n=>n.value?.toString()??"").join(i)}]},abs:(e,t)=>R(Math.abs,e,t),ceiling:(e,t)=>R(Math.ceil,e,t),exp:(e,t)=>R(Math.exp,e,t),floor:(e,t)=>R(Math.floor,e,t),ln:(e,t)=>R(Math.log,e,t),log:(e,t,r)=>R((i,n)=>Math.log(i)/Math.log(n),e,t,r),power:(e,t,r)=>R(Math.pow,e,t,r),round:(e,t,...r)=>R((i,n=0)=>{if(typeof n!="number"||n<0)throw new Error("Invalid precision provided to round()");let s=Math.pow(10,n);return Math.round(i*s)/s},e,t,...r),sqrt:(e,t)=>R(Math.sqrt,e,t),truncate:(e,t)=>R(r=>Math.trunc(r),e,t),children:D,descendants:D,trace:(e,t,r)=>t,now:()=>[{type:d.dateTime,value:new Date().toISOString()}],timeOfDay:()=>[{type:d.time,value:new Date().toISOString().substring(11)}],today:()=>[{type:d.date,value:new Date().toISOString().substring(0,10)}],between:(e,t,r,i,n)=>{let s=w.toDateTime(e,r.eval(e,t));if(s.length===0)throw new Error("Invalid start date");let a=w.toDateTime(e,i.eval(e,t));if(a.length===0)throw new Error("Invalid end date");let l=n.eval(e,t)[0]?.value;if(l!=="years"&&l!=="months"&&l!=="days")throw new Error("Invalid units");let f=Gt(s[0].value,a[0].value);return[{type:d.Quantity,value:{value:f[l],unit:l}}]},is:(e,t,r)=>{let i="";return r instanceof te?i=r.name:r instanceof $e&&(i=r.left.name+"."+r.right.name),i?t.map(n=>({type:d.boolean,value:De(n,i)})):[]},not:(e,t)=>w.toBoolean(e,t).map(r=>({type:d.boolean,value:!r.value})),resolve:(e,t)=>t.map(r=>{let i=r.value,n;if(typeof i=="string")n=i;else if(typeof i=="object"){let s=i;if(s.resource)return $(s.resource);s.reference?n=s.reference:s.type&&s.identifier&&(n=`${s.type}?identifier=${s.identifier.system}|${s.identifier.value}`)}if(n?.includes("?")){let[s]=n.split("?");return{type:s,value:{resourceType:s}}}if(n?.includes("/")){let[s,a]=n.split("/");return{type:s,value:{resourceType:s,id:a}}}return{type:d.BackboneElement,value:void 0}}).filter(r=>!!r.value),as:(e,t)=>t,type:(e,t)=>t.map(({value:r})=>typeof r=="boolean"?{type:d.BackboneElement,value:{namespace:"System",name:"Boolean"}}:typeof r=="number"?{type:d.BackboneElement,value:{namespace:"System",name:"Integer"}}:ie(r)?{type:d.BackboneElement,value:{namespace:"FHIR",name:r.resourceType}}:{type:d.BackboneElement,value:null}),conformsTo:(e,t,r)=>{let i=r.eval(e,t)[0].value;if(!i.startsWith("http://hl7.org/fhir/StructureDefinition/"))throw new Error("Expected a StructureDefinition URL");let n=i.replace("http://hl7.org/fhir/StructureDefinition/","");return t.map(s=>({type:d.boolean,value:s.value?.resourceType===n}))},getResourceKey:(e,t)=>{let r=t[0].value;return r?.id?[{type:d.id,value:r.id}]:[]},getReferenceKey:(e,t,r)=>{let i=t[0].value;if(!i?.reference)return[];let n="";return r instanceof te&&(n=r.name),n&&!i.reference.startsWith(n+"/")?[]:[{type:d.id,value:Bt(i)}]},extension:(e,t,r)=>{let i=r.eval(e,t)[0].value,n=t?.[0]?.value;if(n){let s=Ft(n,i);if(s)return[{type:d.Extension,value:s}]}return[]}};function E(e,t,r,...i){if(r.length===0)return[];let[{value:n}]=k(r,1);if(typeof n!="string")throw new TypeError("String function cannot be called with non-string");let s=i.map(l=>l?.eval(t,r)[0]?.value),a=e(n,...s);return a===void 0?[]:Array.isArray(a)?a.map($):[$(a)]}function R(e,t,r,...i){if(r.length===0)return[];let[{value:n}]=k(r,1),s=T(n),a=s?n.value:n;if(typeof a!="number")throw new TypeError("Math function cannot be called with non-number");let l=e(a,...i.map(h=>h.eval(t,r)[0]?.value)),f=s?d.Quantity:r[0].type,x=s?{...n,value:l}:l;return[{type:f,value:x}]}function k(e,t){if(e.length!==t)throw new Error(`Expected ${t} arguments`);for(let r of e)if(r==null)throw new Error("Expected non-null argument");return e}function M(e){let t=e;for(;t.parent?.variables.$this;)t=t.parent;return[t.variables.$this]}var G=class{constructor(e){v(this,"value"),this.value=e}eval(){return[this.value]}toString(){let e=this.value.value;return typeof e=="string"?`'${e}'`:e.toString()}},te=class{constructor(e){v(this,"name"),this.name=e}eval(e,t){if(this.name==="$this")return t;let r=this.getVariable(e);if(r)return[r];if(this.name.startsWith("%"))throw new Error(`Undefined variable ${this.name}`);return t.flatMap(i=>this.evalValue(i)).filter(i=>i?.value!==void 0)}getVariable(e){let t=e.variables[this.name];if(t!==void 0)return t;if(e.parent)return this.getVariable(e.parent)}evalValue(e){let t=e.value;if(!(!t||typeof t!="object"))return ie(t,this.name)?e:Pt(e,this.name)}toString(){return this.name}},zt=class{eval(){return[]}toString(){return"{}"}},Jt=class extends mt{constructor(e,t,r){super(e,t),v(this,"impl"),this.impl=r}eval(e,t){return this.impl(this.child.eval(e,t))}toString(){return this.operator+this.child.toString()}},Kt=class extends z{constructor(e,t){super("as",e,t)}eval(e,t){return w.ofType(e,this.left.eval(e,t),this.right)}},C=class extends z{},A=class extends C{constructor(e,t,r,i){super(e,t,r),v(this,"impl"),this.impl=i}eval(e,t){let r=this.left.eval(e,t);if(r.length!==1)return[];let i=this.right.eval(e,t);if(i.length!==1)return[];let n=r[0].value,s=i[0].value,a=T(n)?n.value:n,l=T(s)?s.value:s,f=this.impl(a,l);return typeof f=="boolean"?u(f):T(n)?[{type:d.Quantity,value:{...n,value:f}}]:[$(f)]}},Yt=class extends z{constructor(e,t){super("&",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t),n=[...r,...i];return n.length>0&&n.every(s=>typeof s.value=="string")?[{type:d.string,value:n.map(s=>s.value).join("")}]:n}},Zt=class extends C{constructor(e,t){super("contains",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return u(r.some(n=>n.value===i[0].value))}},Xt=class extends C{constructor(e,t){super("in",e,t)}eval(e,t){let r=O(this.left.eval(e,t)),i=this.right.eval(e,t);return r?u(i.some(n=>re(r,n)[0].value)):[]}},$e=class extends z{constructor(e,t){super(".",e,t)}eval(e,t){return this.right.eval(e,this.left.eval(e,t))}toString(){return`${this.left.toString()}.${this.right.toString()}`}},er=class extends z{constructor(e,t){super("|",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return ke([...r,...i])}},tr=class extends C{constructor(e,t){super("=",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return Ot(r,i)}},rr=class extends C{constructor(e,t){super("!=",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return _t(r,i)}},ir=class extends C{constructor(e,t){super("~",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return Ie(r,i)}},nr=class extends C{constructor(e,t){super("!~",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return Nt(Ie(r,i))}},sr=class extends C{constructor(e,t){super("is",e,t)}eval(e,t){let r=this.left.eval(e,t);if(r.length!==1)return[];let i=this.right.name;return u(De(r[0],i))}},or=class extends C{constructor(e,t){super("and",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return r?.value===!0&&i?.value===!0?u(!0):r?.value===!1||i?.value===!1?u(!1):[]}},ar=class extends C{constructor(e,t){super("or",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return r?.value===!1&&i?.value===!1?u(!1):r?.value||i?.value?u(!0):[]}},cr=class extends C{constructor(e,t){super("xor",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return!r||!i?[]:u(r.value!==i.value)}},lr=class extends C{constructor(e,t){super("implies",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return i?.value===!0||r?.value===!1?u(!0):!r||!i?[]:u(!1)}},ur=class{constructor(e,t){v(this,"name"),v(this,"args"),this.name=e,this.args=t}eval(e,t){let r=w[this.name];if(!r)throw new Error("Unrecognized function: "+this.name);return r(e,t,...this.args)}toString(){return`${this.name}(${this.args.map(e=>e.toString()).join(", ")})`}},dr=class{constructor(e,t){v(this,"left"),v(this,"expr"),this.left=e,this.expr=t}eval(e,t){let r=this.expr.eval(e,t);if(r.length!==1)return[];let i=r[0].value;if(typeof i!="number")throw new Error("Invalid indexer expression: should return integer}");let n=this.left.eval(e,t);return i in n?[n[i]]:[]}toString(){return`${this.left.toString()}[${this.expr.toString()}]`}};var Ue=["!=","!~","<=",">=","{}","->"];var y={FunctionCall:0,Dot:1,Indexer:2,UnaryAdd:3,UnarySubtract:3,Multiply:4,Divide:4,IntegerDivide:4,Modulo:4,Add:5,Subtract:5,Ampersand:5,Is:6,As:6,Union:7,GreaterThan:8,GreaterThanOrEquals:8,LessThan:8,LessThanOrEquals:8,Equals:9,Equivalent:9,NotEquals:9,NotEquivalent:9,In:10,Contains:10,And:11,Xor:12,Or:12,Implies:13,Arrow:100,Semicolon:200},hr={parse(e){let t=e.consumeAndParse();if(!e.match(")"))throw new Error("Parse error: expected `)` got `"+e.peek()?.value+"`");return t}},pr={parse(e,t){let r=e.consumeAndParse();if(!e.match("]"))throw new Error("Parse error: expected `]`");return new dr(t,r)},precedence:y.Indexer},mr={parse(e,t){if(!(t instanceof te))throw new Error("Unexpected parentheses");let r=[];for(;!e.match(")");)r.push(e.consumeAndParse()),e.match(",");return new ur(t.name,r)},precedence:y.FunctionCall};function fr(e){let t=e.split(" "),r=Number.parseFloat(t[0]),i=t[1];return i?.startsWith("'")&&i.endsWith("'")?i=i.substring(1,i.length-1):i="{"+i+"}",{value:r,unit:i}}function ye(){return new ft().registerPrefix("String",{parse:(e,t)=>new G({type:d.string,value:t.value})}).registerPrefix("DateTime",{parse:(e,t)=>new G({type:d.dateTime,value:X(t.value)})}).registerPrefix("Quantity",{parse:(e,t)=>new G({type:d.Quantity,value:fr(t.value)})}).registerPrefix("Number",{parse:(e,t)=>new G({type:t.value.includes(".")?d.decimal:d.integer,value:Number.parseFloat(t.value)})}).registerPrefix("true",{parse:()=>new G({type:d.boolean,value:!0})}).registerPrefix("false",{parse:()=>new G({type:d.boolean,value:!1})}).registerPrefix("Symbol",{parse:(e,t)=>new te(t.value)}).registerPrefix("{}",{parse:()=>new zt}).registerPrefix("(",hr).registerInfix("[",pr).registerInfix("(",mr).prefix("+",y.UnaryAdd,(e,t)=>new Jt("+",t,r=>r)).prefix("-",y.UnarySubtract,(e,t)=>new A("-",t,t,(r,i)=>-i)).infixLeft(".",y.Dot,(e,t,r)=>new $e(e,r)).infixLeft("/",y.Divide,(e,t,r)=>new A("/",e,r,(i,n)=>i/n)).infixLeft("*",y.Multiply,(e,t,r)=>new A("*",e,r,(i,n)=>i*n)).infixLeft("+",y.Add,(e,t,r)=>new A("+",e,r,(i,n)=>i+n)).infixLeft("-",y.Subtract,(e,t,r)=>new A("-",e,r,(i,n)=>i-n)).infixLeft("|",y.Union,(e,t,r)=>new er(e,r)).infixLeft("=",y.Equals,(e,t,r)=>new tr(e,r)).infixLeft("!=",y.NotEquals,(e,t,r)=>new rr(e,r)).infixLeft("~",y.Equivalent,(e,t,r)=>new ir(e,r)).infixLeft("!~",y.NotEquivalent,(e,t,r)=>new nr(e,r)).infixLeft("<",y.LessThan,(e,t,r)=>new A("<",e,r,(i,n)=>i<n)).infixLeft("<=",y.LessThanOrEquals,(e,t,r)=>new A("<=",e,r,(i,n)=>i<=n)).infixLeft(">",y.GreaterThan,(e,t,r)=>new A(">",e,r,(i,n)=>i>n)).infixLeft(">=",y.GreaterThanOrEquals,(e,t,r)=>new A(">=",e,r,(i,n)=>i>=n)).infixLeft("&",y.Ampersand,(e,t,r)=>new Yt(e,r)).infixLeft("and",y.And,(e,t,r)=>new or(e,r)).infixLeft("as",y.As,(e,t,r)=>new Kt(e,r)).infixLeft("contains",y.Contains,(e,t,r)=>new Zt(e,r)).infixLeft("div",y.Divide,(e,t,r)=>new A("div",e,r,(i,n)=>Math.trunc(i/n))).infixLeft("in",y.In,(e,t,r)=>new Xt(e,r)).infixLeft("is",y.Is,(e,t,r)=>new sr(e,r)).infixLeft("mod",y.Modulo,(e,t,r)=>new A("mod",e,r,(i,n)=>i%n)).infixLeft("or",y.Or,(e,t,r)=>new ar(e,r)).infixLeft("xor",y.Xor,(e,t,r)=>new cr(e,r)).infixLeft("implies",y.Implies,(e,t,r)=>new lr(e,r))}var Dr=ye();var p={EQUALS:"eq",NOT_EQUALS:"ne",GREATER_THAN:"gt",LESS_THAN:"lt",GREATER_THAN_OR_EQUALS:"ge",LESS_THAN_OR_EQUALS:"le",STARTS_AFTER:"sa",ENDS_BEFORE:"eb",APPROXIMATELY:"ap",CONTAINS:"contains",STARTS_WITH:"sw",EXACT:"exact",TEXT:"text",NOT:"not",ABOVE:"above",BELOW:"below",IN:"in",NOT_IN:"not-in",OF_TYPE:"of-type",MISSING:"missing",PRESENT:"present",IDENTIFIER:"identifier",ITERATE:"iterate"},Nr={contains:p.CONTAINS,exact:p.EXACT,above:p.ABOVE,below:p.BELOW,text:p.TEXT,not:p.NOT,in:p.IN,"not-in":p.NOT_IN,"of-type":p.OF_TYPE,missing:p.MISSING,identifier:p.IDENTIFIER,iterate:p.ITERATE},Or={eq:p.EQUALS,ne:p.NOT_EQUALS,lt:p.LESS_THAN,le:p.LESS_THAN_OR_EQUALS,gt:p.GREATER_THAN,ge:p.GREATER_THAN_OR_EQUALS,sa:p.STARTS_AFTER,eb:p.ENDS_BEFORE,ap:p.APPROXIMATELY,sw:p.STARTS_WITH};var _r=[p.MISSING,p.PRESENT];var Z={READ:"read",VREAD:"vread",UPDATE:"update",DELETE:"delete",HISTORY:"history",CREATE:"create",SEARCH:"search"},Lr=[Z.READ,Z.VREAD,Z.HISTORY,Z.SEARCH];var yr={CSS:"text/css",DICOM:"application/dicom",FAVICON:"image/vnd.microsoft.icon",FHIR_JSON:"application/fhir+json",FORM_URL_ENCODED:"application/x-www-form-urlencoded",HL7_V2:"x-application/hl7-v2+er7",HTML:"text/html",JAVASCRIPT:"text/javascript",JSON:"application/json",JSON_PATCH:"application/json-patch+json",JWT:"application/jwt",MULTIPART_FORM_DATA:"multipart/form-data",PNG:"image/png",SCIM_JSON:"application/scim+json",SVG:"image/svg+xml",TEXT:"text/plain",TYPESCRIPT:"text/typescript",PING:"x-application/ping",XML:"text/xml",CDA_XML:"application/cda+xml",OCTET_STREAM:"application/octet-stream"};var gr;gr=Symbol.toStringTag;var Mr={Event:typeof globalThis.Event<"u"?globalThis.Event:void 0,ErrorEvent:void 0,CloseEvent:void 0};var $r={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+Math.random()*4e3,minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1};var Ur=yr.FHIR_JSON+", */*; q=0.1";var Br=[...Ue,"->","<<",">>","=="];var Gr=ye().registerInfix("->",{precedence:y.Arrow}).registerInfix(";",{precedence:y.Semicolon});var Fr=" ".repeat(2);var jr=[...Ue,"eq","ne","co"];var Wr={eq:p.EXACT,ne:p.NOT_EQUALS,co:p.CONTAINS,sw:p.STARTS_WITH,ew:void 0,gt:p.GREATER_THAN,lt:p.LESS_THAN,ge:p.GREATER_THAN_OR_EQUALS,le:p.LESS_THAN_OR_EQUALS,ap:p.APPROXIMATELY,sa:p.STARTS_AFTER,eb:p.ENDS_BEFORE,pr:p.PRESENT,po:void 0,ss:void 0,sb:void 0,in:p.IN,ni:p.NOT_IN,re:p.EQUALS,identifier:p.IDENTIFIER};var qr=ye();var ve=["string","boolean","number"],ge={},Se=class{constructor(t){c(this,"config");c(this,"clients");let{region:r}=t;if(!r)throw new I(_("'region' must be defined as a string literal in config."));ge[r]||(ge[r]=new ne.SSMClient({region:r})),this.config=t,this.clients={ssm:ge[r]}}async fetchParameterStoreSecret(t){let i=(await this.clients.ssm.send(new ne.GetParameterCommand({Name:t,WithDecryption:!0}))).Parameter;if(!i)throw new I(me(`Key '${t}' not found. Make sure your key is correct and that it is defined in your Parameter Store.`));let n=i.Value;if(!n)throw new I(me(`Key '${t}' found but has no value. Make sure your key is correct and that it is defined in your Parameter Store.`));return n}async fetchExternalSecret(t){br(t);let{system:r,key:i,type:n}=t,s;if(r==="aws_ssm_parameter_store")s=await this.fetchParameterStoreSecret(i);else throw new I(_(`Unknown system '${r}' for ExternalSecret. Unable to fetch the secret for key '${i}'.`));return vr(i,s,n)}async normalizeInfraConfigArray(t){let r=t[0],i;if(typeof r!="object"&&r!==null||Be(r)){i=new Array(t.length);for(let n=0;n<t.length;n++){let s=t[n];if(typeof s!="object"){i[n]=s;continue}let a=await this.fetchExternalSecret(s);i[n]=a}}else{i=new Array(t.length);for(let n=0;n<t.length;n++)i[n]=await this.normalizeObjectInInfraConfig(t[n])}return i}async normalizeValueForKey(t,r){let i=t[r];typeof i!="object"?t[r]=i:Be(i)?t[r]=await this.fetchExternalSecret(i):Array.isArray(i)&&i.length?t[r]=await this.normalizeInfraConfigArray(i):typeof i=="object"&&(t[r]=await this.normalizeObjectInInfraConfig(i))}async normalizeObjectInInfraConfig(t){let r={...t};for(let i of Object.keys(r))await this.normalizeValueForKey(r,i);return r}async normalizeConfig(){return this.normalizeObjectInInfraConfig(this.config)}};function vr(e,t,r){let i=typeof t;if(!ve.includes(i))throw new I(_(`Invalid value found for type; expected either ${ve.join(", or")} but got ${i}`));if(i===r)return t;if(i==="string"&&r==="boolean"){let n=t.toLowerCase();if(n!=="true"&&n!=="false")throw new I(_(`Invalid value found for key '${e}'; expected boolean value but got '${t}'`));return n==="true"}else if(i==="string"&&r==="number"){let n=Number.parseInt(t,10);if(Number.isNaN(n))throw new I(_(`Invalid value found for key '${e}'; expected integer value but got '${t}'`));return n}else throw new I(_(`Invalid value found for type; expected ${r} value but got value of type ${i}`))}function Be(e){return typeof e=="object"&&typeof e.system=="string"&&typeof e.key=="string"&&typeof e.type=="string"}function Sr(e){return typeof e=="object"&&typeof e.system=="string"&&typeof e.key=="string"&&ve.includes(e.type)}function br(e){if(!Sr(e))throw new I(_("obj is not a valid `ExternalSecret`, must contain a valid `system`, `key`, and `type` prop."))}async function Ge(e){return new Se(e).normalizeConfig()}var H=require("aws-cdk-lib");var o=require("aws-cdk-lib"),Fe=require("aws-cdk-lib/aws-ecr"),P=require("aws-cdk-lib/aws-rds"),oe=require("aws-cdk-lib/aws-secretsmanager"),je=require("constructs"),se=ut(require("node:assert"),1);var F=require("aws-cdk-lib"),wr=[{name:"AWS-AWSManagedRulesCommonRuleSet",priority:10,statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesCommonRuleSet",excludedRules:[{name:"NoUserAgent_HEADER"},{name:"UserAgent_BadBots_HEADER"},{name:"SizeRestrictions_QUERYSTRING"},{name:"SizeRestrictions_Cookie_HEADER"},{name:"SizeRestrictions_BODY"},{name:"SizeRestrictions_URIPATH"},{name:"EC2MetaDataSSRF_BODY"},{name:"EC2MetaDataSSRF_COOKIE"},{name:"EC2MetaDataSSRF_URIPATH"},{name:"EC2MetaDataSSRF_QUERYARGUMENTS"},{name:"GenericLFI_QUERYARGUMENTS"},{name:"GenericLFI_URIPATH"},{name:"GenericLFI_BODY"},{name:"RestrictedExtensions_URIPATH"},{name:"RestrictedExtensions_QUERYARGUMENTS"},{name:"GenericRFI_QUERYARGUMENTS"},{name:"GenericRFI_BODY"},{name:"GenericRFI_URIPATH"},{name:"CrossSiteScripting_COOKIE"},{name:"CrossSiteScripting_QUERYARGUMENTS"},{name:"CrossSiteScripting_BODY"},{name:"CrossSiteScripting_URIPATH"}]}},overrideAction:{count:{}},visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWS-AWSManagedRulesCommonRuleSet"}},{name:"AWS-AWSManagedRulesAmazonIpReputationList",priority:20,statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesAmazonIpReputationList",excludedRules:[{name:"AWSManagedIPReputationList"},{name:"AWSManagedReconnaissanceList"}]}},overrideAction:{count:{}},visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWSManagedRulesAmazonIpReputationList"}},{name:"AWSManagedRulesSQLiRuleSet",priority:30,visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWSManagedRulesSQLiRuleSet"},overrideAction:{count:{}},statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesSQLiRuleSet",excludedRules:[{name:"SQLi_QUERYARGUMENTS"},{name:"SQLiExtendedPatterns_QUERYARGUMENTS"},{name:"SQLi_BODY"},{name:"SQLiExtendedPatterns_BODY"},{name:"SQLi_COOKIE"},{name:"SQLi_URIPATH"}]}}},{name:"AWSManagedRuleLinux",priority:40,visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWSManagedRuleLinux"},overrideAction:{count:{}},statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesLinuxRuleSet",excludedRules:[{name:"LFI_URIPATH"},{name:"LFI_QUERYSTRING"},{name:"LFI_COOKIE"}]}}}];function xr(e){let t=[...wr];if(e){let r={name:"IPAllowListRule",priority:50,action:{allow:{}},statement:{ipSetReferenceStatement:{arn:e}},visibilityConfig:{cloudWatchMetricsEnabled:!0,metricName:"IPAllowListRule",sampledRequestsEnabled:!0}};t.push(r)}return t}function U(e,t,r,i,n,s,a){let l=new F.aws_wafv2.CfnWebACL(e,t,{name:r,scope:i,defaultAction:n?{block:{}}:{allow:{}},rules:xr(n),visibilityConfig:{metricName:`${r}-Metric`,cloudWatchMetricsEnabled:!0,sampledRequestsEnabled:!1}});if(s){let f;a?f=new F.aws_logs.LogGroup(e,"WAFLogs",{logGroupName:s}):f=F.aws_logs.LogGroup.fromLogGroupName(e,"WAFLogs",s),new F.aws_wafv2.CfnLoggingConfiguration(e,"WAFLoggingConfiguration",{resourceArn:l.attrArn,logDestinationConfigs:[f.logGroupArn]}).addDependency(l)}return l}var J=class extends je.Construct{constructor(r,i){super(r,"BackEnd");c(this,"vpc");c(this,"botLambdaRole");c(this,"rdsSecretsArn");c(this,"rdsCluster");c(this,"rdsProxy");c(this,"redisSubnetGroup");c(this,"redisSecurityGroup");c(this,"redisPassword");c(this,"redisCluster");c(this,"redisSecrets");c(this,"ecsCluster");c(this,"taskRolePolicies");c(this,"taskRole");c(this,"taskDefinition");c(this,"logGroup");c(this,"logDriver");c(this,"serviceContainer");c(this,"fargateSecurityGroup");c(this,"fargateService");c(this,"targetGroup");c(this,"loadBalancer");c(this,"waf");c(this,"wafAssociation");c(this,"dnsRecord");c(this,"regionParameter");c(this,"databaseSecretsParameter");c(this,"databaseProxyEndpointParameter");c(this,"redisSecretsParameter");c(this,"botLambdaRoleParameter");c(this,"rdsClusterParameterGroup");c(this,"rdsWriterParameterGroup");c(this,"rdsReaderParameterGroup");let n=i.name,s=i.accountNumber,a=i.region;if(i.vpcId)this.vpc=o.aws_ec2.Vpc.fromLookup(this,"VPC",{vpcId:i.vpcId});else{let h=new o.aws_logs.LogGroup(this,"VpcFlowLogs",{logGroupName:"/medplum/flowlogs/"+n,removalPolicy:o.RemovalPolicy.DESTROY});this.vpc=new o.aws_ec2.Vpc(this,"VPC",{maxAzs:i.maxAzs,flowLogs:{cloudwatch:{destination:o.aws_ec2.FlowLogDestination.toCloudWatchLogs(h),trafficType:o.aws_ec2.FlowLogTrafficType.ALL}}})}if(this.botLambdaRole=new o.aws_iam.Role(this,"BotLambdaRole",{assumedBy:new o.aws_iam.ServicePrincipal("lambda.amazonaws.com")}),this.rdsSecretsArn=i.rdsSecretsArn,!this.rdsSecretsArn){let{engine:h,majorVersion:b}=Er(i.rdsInstanceVersion,o.aws_rds.AuroraPostgresEngineVersion.VER_16_9),Y={statement_timeout:"60000",default_transaction_isolation:"REPEATABLE READ",...i.rdsClusterParameters};if(i.rdsPersistentParameterGroups){let L=`MedplumPG${b}`;this.rdsClusterParameterGroup=new P.ParameterGroup(this,`${L}ClusterParameterGroup`,{engine:h,parameters:Y,removalPolicy:o.RemovalPolicy.RETAIN}),this.rdsClusterParameterGroup.bindToCluster({}),this.rdsWriterParameterGroup=new P.ParameterGroup(this,`${L}WriterInstanceParameterGroup`,{engine:h,removalPolicy:o.RemovalPolicy.RETAIN}),this.rdsWriterParameterGroup.bindToInstance({}),this.rdsReaderParameterGroup=new P.ParameterGroup(this,`${L}ReaderInstanceParameterGroup`,{engine:h,removalPolicy:o.RemovalPolicy.RETAIN}),this.rdsReaderParameterGroup.bindToInstance({})}if(i.rdsIdsMajorVersionSuffix){if(!i.rdsPersistentParameterGroups||!this.rdsClusterParameterGroup||!this.rdsWriterParameterGroup||!this.rdsReaderParameterGroup)throw new Error("rdsPersistentParameterGroups must be true when rdsIdsMajorVersionSuffix is true");this.rdsClusterParameterGroup,this.rdsWriterParameterGroup,this.rdsReaderParameterGroup}let be={enablePerformanceInsights:!0,isFromLegacyInstanceProps:!0,caCertificate:o.aws_rds.CaCertificate.RDS_CA_RSA2048_G1},Ze=new P.ParameterGroup(this,"MedplumDatabaseClusterParams",{engine:h,parameters:Y}),we=i.rdsReaderInstanceType??i.rdsInstanceType,Xe={...be,instanceType:we?new o.aws_ec2.InstanceType(we):void 0,parameterGroup:i.rdsIdsMajorVersionSuffix?this.rdsReaderParameterGroup:void 0},ue=i.rdsInstanceType,et={...be,instanceType:ue?new o.aws_ec2.InstanceType(ue):void 0,parameterGroup:i.rdsIdsMajorVersionSuffix?this.rdsWriterParameterGroup:void 0},de;if(i.rdsInstances>1){de=[];for(let L=1;L<i.rdsInstances;L++)de.push(P.ClusterInstance.provisioned("Instance"+(L+1),Xe))}let tt={credentials:o.aws_rds.Credentials.fromGeneratedSecret("clusteradmin"),defaultDatabaseName:"medplum",storageEncrypted:!0,storageType:ue?.match(/^\w+d\w*\./i)?P.DBClusterStorageType.AURORA_IOPT1:P.DBClusterStorageType.AURORA,vpc:this.vpc,vpcSubnets:{subnetType:o.aws_ec2.SubnetType.PRIVATE_WITH_EGRESS},backup:{retention:o.Duration.days(7)},cloudwatchLogsExports:["postgresql"],instanceUpdateBehaviour:o.aws_rds.InstanceUpdateBehaviour.ROLLING,removalPolicy:o.RemovalPolicy.RETAIN,autoMinorVersionUpgrade:i.rdsAutoMinorVersionUpgrade},rt=Tr(i.rdsIdsMajorVersionSuffix?b:void 0);this.rdsCluster=new o.aws_rds.DatabaseCluster(this,rt,{...tt,engine:h,writer:P.ClusterInstance.provisioned("Instance1",et),readers:de,parameterGroup:this.rdsClusterParameterGroup??Ze});let B=this.rdsCluster.secret;(0,se.default)(B!==void 0,"rdsCluster.secret is undefined"),B.applyRemovalPolicy(o.RemovalPolicy.RETAIN),(0,se.default)(B instanceof oe.SecretTargetAttachment,"rdsCluster.secret is not a SecretTargetAttachment");let xe=B.node.scope;(0,se.default)(xe instanceof oe.Secret,"rdsCluster.secretAttachment.node.scope is not a Secret"),xe.applyRemovalPolicy(o.RemovalPolicy.RETAIN),this.rdsSecretsArn=B.secretArn,i.rdsProxyEnabled&&(this.rdsProxy=new o.aws_rds.DatabaseProxy(this,"DatabaseProxy",{proxyTarget:o.aws_rds.ProxyTarget.fromCluster(this.rdsCluster),secrets:[B],vpc:this.vpc}))}this.redisSubnetGroup=new o.aws_elasticache.CfnSubnetGroup(this,"RedisSubnetGroup",{description:"Redis Subnet Group",subnetIds:this.vpc.privateSubnets.map(h=>h.subnetId)}),i.cacheSecurityGroupId?this.redisSecurityGroup=o.aws_ec2.SecurityGroup.fromSecurityGroupId(this,"RedisSecurityGroup",i.cacheSecurityGroupId):this.redisSecurityGroup=new o.aws_ec2.SecurityGroup(this,"RedisSecurityGroup",{vpc:this.vpc,description:"Redis Security Group",allowAllOutbound:!1}),this.redisPassword=new o.aws_secretsmanager.Secret(this,"RedisPassword",{generateSecretString:{secretStringTemplate:"{}",generateStringKey:"password",excludeCharacters:"@%*()_+=`~{}|[]\\:\";'?,./"}}),this.redisCluster=new o.aws_elasticache.CfnReplicationGroup(this,"RedisCluster",{engine:"Redis",engineVersion:"6.x",cacheNodeType:i.cacheNodeType??"cache.t2.medium",replicationGroupDescription:"RedisReplicationGroup",authToken:this.redisPassword.secretValueFromJson("password").toString(),transitEncryptionEnabled:!0,atRestEncryptionEnabled:!0,multiAzEnabled:!0,cacheSubnetGroupName:this.redisSubnetGroup.ref,numNodeGroups:1,replicasPerNodeGroup:1,securityGroupIds:[this.redisSecurityGroup.securityGroupId]}),this.redisCluster.node.addDependency(this.redisPassword),this.redisSecrets=new o.aws_secretsmanager.Secret(this,"RedisSecrets",{generateSecretString:{secretStringTemplate:JSON.stringify({host:this.redisCluster.attrPrimaryEndPointAddress,port:this.redisCluster.attrPrimaryEndPointPort,password:this.redisPassword.secretValueFromJson("password").toString(),tls:{}}),generateStringKey:"unused"}}),this.redisSecrets.node.addDependency(this.redisPassword),this.redisSecrets.node.addDependency(this.redisCluster);let l={vpc:this.vpc};i.containerInsightsV2&&(l={...l,containerInsightsV2:i.containerInsightsV2}),this.ecsCluster=new o.aws_ecs.Cluster(this,"Cluster",l),this.taskRolePolicies=new o.aws_iam.PolicyDocument({statements:[new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["logs:PutLogEvents","logs:CreateLogGroup","logs:CreateLogStream","logs:DescribeLogStreams","logs:DescribeLogGroups","logs:PutRetentionPolicy"],resources:[`arn:aws:logs:${a}:${s}:log-group:*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["secretsmanager:GetResourcePolicy","secretsmanager:GetSecretValue","secretsmanager:DescribeSecret","secretsmanager:ListSecrets","secretsmanager:ListSecretVersionIds"],resources:[`arn:aws:secretsmanager:${a}:${s}:secret:*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["ssm:GetParametersByPath","ssm:GetParameters","ssm:GetParameter","ssm:DescribeParameters"],resources:[`arn:aws:ssm:${a}:${s}:parameter/medplum/${n}/*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["ses:SendEmail","ses:SendRawEmail"],resources:[`arn:aws:ses:${a}:${s}:identity/*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["s3:ListBucket"],resources:[`arn:aws:s3:::${i.storageBucketName}`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["s3:GetObject","s3:PutObject","s3:DeleteObject"],resources:[`arn:aws:s3:::${i.storageBucketName}/*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["iam:ListRoles","iam:GetRole","iam:PassRole"],resources:[this.botLambdaRole.roleArn]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["lambda:CreateFunction","lambda:GetFunction","lambda:GetFunctionConfiguration","lambda:UpdateFunctionCode","lambda:UpdateFunctionConfiguration","lambda:InvokeFunction"],resources:[`arn:aws:lambda:${a}:${s}:function:medplum-bot-lambda-*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["lambda:ListLayerVersions"],resources:[`arn:aws:lambda:${a}:${s}:layer:medplum-bot-layer`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["lambda:GetLayerVersion"],resources:[`arn:aws:lambda:${a}:${s}:layer:medplum-bot-layer:*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["xray:PutTraceSegments","xray:PutTelemetryRecords","xray:GetSamplingRules","xray:GetSamplingTargets","xray:GetSamplingStatisticSummaries"],resources:["*"]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["comprehend:DetectEntities","comprehend:DetectKeyPhrases","comprehend:DetectDominantLanguage","comprehend:DetectSentiment","comprehend:DetectTargetedSentiment","comprehend:DetectSyntax","comprehendmedical:DetectEntitiesV2","textract:DetectDocumentText","textract:AnalyzeDocument","textract:StartDocumentTextDetection","textract:GetDocumentTextDetection"],resources:["*"]})]}),this.taskRole=new o.aws_iam.Role(this,"TaskExecutionRole",{assumedBy:new o.aws_iam.ServicePrincipal("ecs-tasks.amazonaws.com"),description:"Medplum Server Task Execution Role",inlinePolicies:{TaskExecutionPolicies:this.taskRolePolicies}}),this.taskDefinition=new o.aws_ecs.FargateTaskDefinition(this,"TaskDefinition",{memoryLimitMiB:i.serverMemory,cpu:i.serverCpu,taskRole:this.taskRole}),i.fireLens?.enabled?this.logDriver=new o.aws_ecs.FireLensLogDriver({options:{...i.fireLens.logDriverConfig?.options}}):(this.logGroup=new o.aws_logs.LogGroup(this,"LogGroup",{logGroupName:"/ecs/medplum/"+n,removalPolicy:o.RemovalPolicy.DESTROY}),this.logDriver=new o.aws_ecs.AwsLogDriver({logGroup:this.logGroup,streamPrefix:"Medplum"}));let f;i.containerRegistryCredentialsSecretArn&&(f=o.aws_secretsmanager.Secret.fromSecretCompleteArn(this,"RegistryCredentialsSecret",i.containerRegistryCredentialsSecretArn)),this.serviceContainer=this.taskDefinition.addContainer("MedplumTaskDefinition",{image:this.getContainerImage(i,i.serverImage,f),command:[a==="us-east-1"?`aws:/medplum/${n}/`:`aws:${a}:/medplum/${n}/`],logging:this.logDriver,environment:i.environment}),this.serviceContainer.addPortMappings({containerPort:i.apiPort,hostPort:i.apiPort});for(let h of i.additionalContainers??Me)this.taskDefinition.addContainer("AdditionalContainer-"+h.name,{containerName:h.name,image:this.getContainerImage(i,h.image,f),command:h.command,environment:h.environment,logging:this.logDriver,essential:h.essential??!1});i.fireLens?.enabled&&this.taskDefinition.addFirelensLogRouter("FireLensRouter",{image:o.aws_ecs.ContainerImage.fromRegistry("public.ecr.aws/aws-observability/aws-for-fluent-bit:stable"),essential:!0,firelensConfig:i.fireLens.logRouterConfig,environment:i.fireLens.environment}),this.fargateSecurityGroup=new o.aws_ec2.SecurityGroup(this,"ServiceSecurityGroup",{allowAllOutbound:!0,securityGroupName:"MedplumSecurityGroup",vpc:this.vpc}),this.fargateService=new o.aws_ecs.FargateService(this,"FargateService",{cluster:this.ecsCluster,taskDefinition:this.taskDefinition,assignPublicIp:!1,vpcSubnets:{subnetType:o.aws_ec2.SubnetType.PRIVATE_WITH_EGRESS},desiredCount:i.desiredServerCount,securityGroups:[this.fargateSecurityGroup],healthCheckGracePeriod:o.Duration.minutes(5),minHealthyPercent:50}),i.fargateAutoScaling&&this.fargateService.autoScaleTaskCount({minCapacity:i.fargateAutoScaling.minCapacity,maxCapacity:i.fargateAutoScaling.maxCapacity}).scaleOnCpuUtilization("CpuScaling",{targetUtilizationPercent:i.fargateAutoScaling.targetUtilizationPercent,scaleInCooldown:o.Duration.seconds(i.fargateAutoScaling.scaleInCooldown),scaleOutCooldown:o.Duration.seconds(i.fargateAutoScaling.scaleOutCooldown)}),this.rdsCluster&&this.fargateService.node.addDependency(this.rdsCluster),this.rdsProxy&&this.fargateService.node.addDependency(this.rdsProxy),this.fargateService.node.addDependency(this.redisCluster),this.targetGroup=new o.aws_elasticloadbalancingv2.ApplicationTargetGroup(this,"TargetGroup",{vpc:this.vpc,port:i.apiPort,protocol:o.aws_elasticloadbalancingv2.ApplicationProtocol.HTTP,healthCheck:{path:"/healthcheck",interval:o.Duration.seconds(30),timeout:o.Duration.seconds(3),healthyThresholdCount:2,unhealthyThresholdCount:5},targets:[this.fargateService]});let x;if(i.loadBalancerSecurityGroupId&&(x=o.aws_ec2.SecurityGroup.fromSecurityGroupId(this,"LoadBalancerSecurityGroup",i.loadBalancerSecurityGroupId)),this.loadBalancer=new o.aws_elasticloadbalancingv2.ApplicationLoadBalancer(this,"LoadBalancer",{vpc:this.vpc,internetFacing:i.apiInternetFacing!==!1,http2Enabled:!0,securityGroup:x}),i.loadBalancerLoggingBucket&&this.loadBalancer.logAccessLogs(o.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.loadBalancerLoggingBucket),i.loadBalancerLoggingPrefix),this.loadBalancer.addListener("HttpsListener",{port:443,certificates:[{certificateArn:i.apiSslCertArn}],sslPolicy:o.aws_elasticloadbalancingv2.SslPolicy.RECOMMENDED_TLS,defaultAction:o.aws_elasticloadbalancingv2.ListenerAction.forward([this.targetGroup])}),this.waf=U(this,"BackEndWAF",`${i.stackName}-BackEndWAF`,"REGIONAL",i.apiWafIpSetArn,i.wafLogGroupName,i.wafLogGroupCreate),this.wafAssociation=new o.aws_wafv2.CfnWebACLAssociation(this,"LoadBalancerAssociation",{resourceArn:this.loadBalancer.loadBalancerArn,webAclArn:this.waf.attrArn}),this.rdsCluster&&(this.rdsCluster.connections.allowDefaultPortFrom(this.fargateSecurityGroup),this.rdsCluster.connections.securityGroups.forEach(h=>{h.applyRemovalPolicy(o.RemovalPolicy.RETAIN),h.node.children.forEach(b=>{(b instanceof o.aws_ec2.CfnSecurityGroupIngress||b instanceof o.aws_ec2.CfnSecurityGroupEgress)&&b.applyRemovalPolicy(o.RemovalPolicy.RETAIN)})})),this.rdsProxy&&this.rdsProxy.connections.allowFrom(this.fargateSecurityGroup,o.aws_ec2.Port.tcp(5432)),this.redisSecurityGroup.addIngressRule(this.fargateSecurityGroup,o.aws_ec2.Port.tcp(6379)),!i.skipDns){let h=i.hostedZoneName??i.domainName.split(".").slice(-2).join("."),b=o.aws_route53.HostedZone.fromLookup(this,"Zone",{domainName:h});this.dnsRecord=new o.aws_route53.ARecord(this,"LoadBalancerAliasRecord",{recordName:i.apiDomainName,target:o.aws_route53.RecordTarget.fromAlias(new o.aws_route53_targets.LoadBalancerTarget(this.loadBalancer)),zone:b})}this.regionParameter=new o.aws_ssm.StringParameter(this,"RegionParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/awsRegion`,description:"AWS region",stringValue:i.region}),this.databaseSecretsParameter=new o.aws_ssm.StringParameter(this,"DatabaseSecretsParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/DatabaseSecrets`,description:"Database secrets ARN",stringValue:this.rdsSecretsArn}),this.rdsProxy&&(this.databaseProxyEndpointParameter=new o.aws_ssm.StringParameter(this,"DatabaseProxyEndpointParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/databaseProxyEndpoint`,description:"Database proxy endpoint",stringValue:this.rdsProxy?.endpoint})),this.redisSecretsParameter=new o.aws_ssm.StringParameter(this,"RedisSecretsParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/RedisSecrets`,description:"Redis secrets ARN",stringValue:this.redisSecrets.secretArn}),this.botLambdaRoleParameter=new o.aws_ssm.StringParameter(this,"BotLambdaRoleParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/botLambdaRoleArn`,description:"Bot lambda execution role ARN",stringValue:this.botLambdaRole.roleArn})}getContainerImage(r,i,n){let a=new RegExp(`^${r.accountNumber}\\.dkr\\.ecr\\.${r.region}\\.amazonaws\\.com/(.*)[:@](.*)$`).exec(i),l=a?.[1],f=a?.[2];if(l&&f){let x=Fe.Repository.fromRepositoryArn(this,"ServerImageRepo",`arn:aws:ecr:${r.region}:${r.accountNumber}:repository/${l}`);return o.aws_ecs.ContainerImage.fromEcrRepository(x,f)}return o.aws_ecs.ContainerImage.fromRegistry(i,{credentials:n})}};function Er(e,t){if(!e){if(t)return{engine:o.aws_rds.DatabaseClusterEngine.auroraPostgres({version:t}),majorVersion:t.auroraPostgresMajorVersion};throw new Error("Missing or empty RDS version: "+e)}let r=e.slice(0,e.indexOf("."));return{engine:o.aws_rds.DatabaseClusterEngine.auroraPostgres({version:o.aws_rds.AuroraPostgresEngineVersion.of(e,r,{s3Import:!0,s3Export:!0})}),majorVersion:r}}function Tr(e){return e?`DatabaseClusterPG${e}`:"DatabaseCluster"}var S=require("aws-cdk-lib"),We=require("constructs");var j=class extends We.Construct{constructor(r,i){super(r,"CloudTrailAlarms");c(this,"config");c(this,"logGroup");c(this,"cloudTrail");c(this,"alarmTopic");if(this.config=i,!i.cloudTrailAlarms)return;i.cloudTrailAlarms.logGroupCreate?(this.logGroup=new S.aws_logs.LogGroup(this,"CloudTrailLogGroup",{logGroupName:i.cloudTrailAlarms.logGroupName,retention:S.aws_logs.RetentionDays.ONE_YEAR}),this.cloudTrail=new S.aws_cloudtrail.Trail(this,"CloudTrail",{sendToCloudWatchLogs:!0,cloudWatchLogGroup:this.logGroup,includeGlobalServiceEvents:!0})):this.logGroup=S.aws_logs.LogGroup.fromLogGroupName(this,"CloudTrailLogGroup",i.cloudTrailAlarms.logGroupName),i.cloudTrailAlarms.snsTopicArn?this.alarmTopic=S.aws_sns.Topic.fromTopicArn(this,"AlarmTopic",i.cloudTrailAlarms.snsTopicArn):this.alarmTopic=new S.aws_sns.Topic(this,"AlarmTopic",{topicName:i.cloudTrailAlarms.snsTopicName});let n=[["UnauthorizedApiCalls","{ ($.errorCode = *UnauthorizedOperation) || ($.errorCode = AccessDenied*) }"],["SignInWithoutMfa","{ ($.eventName = ConsoleLogin) && ($.additionalEventData.MFAUsed != Yes) }"],["RootAccountUsage","{ $.userIdentity.type = Root && $.userIdentity.invokedBy NOT EXISTS && $.eventType != AwsServiceEvent }"],["IamPolicyChanges","{($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventName=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolicy)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=DeletePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersion)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.eventName=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGroupPolicy)||($.eventName=DetachGroupPolicy)}"],["CloudTrailConfigurationChanges","{ ($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }"],["SignInFailures",'{ ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }'],["DisabledCmks","{($.eventSource = kms.amazonaws.com) && (($.eventName=DisableKey)||($.eventName=ScheduleKeyDeletion)) }"],["S3PolicyChanges","{ ($.eventSource = s3.amazonaws.com) && (($.eventName = PutBucketAcl) || ($.eventName = PutBucketPolicy) || ($.eventName = PutBucketCors) || ($.eventName = PutBucketLifecycle) || ($.eventName = PutBucketReplication) || ($.eventName = DeleteBucketPolicy) || ($.eventName = DeleteBucketCors) || ($.eventName = DeleteBucketLifecycle) || ($.eventName = DeleteBucketReplication)) }"],["ConfigServiceChanges","{($.eventSource = config.amazonaws.com) && (($.eventName=StopConfigurationRecorder)||($.eventName=DeleteDeliveryChannel)||($.eventName=PutDeliveryChannel)||($.eventName=PutConfigurationRecorder))}"],["SecurityGroupChanges","{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup)}"],["NetworkAclChanges","{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }"],["NetworkGatewayChanges","{ ($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }"],["RouteTableChanges","{ ($.eventName = CreateRoute) || ($.eventName = CreateRouteTable) || ($.eventName = ReplaceRoute) || ($.eventName = ReplaceRouteTableAssociation) || ($.eventName = DeleteRouteTable) || ($.eventName = DeleteRoute) || ($.eventName = DisassociateRouteTable) }"],["VpcChanges","{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }"],["OrganizationsChanges","{ ($.eventSource = organizations.amazonaws.com) && (($.eventName = AcceptHandshake) || ($.eventName = AttachPolicy) || ($.eventName = CreateAccount) || ($.eventName = CreateOrganizationalUnit) || ($.eventName = CreatePolicy) || ($.eventName = DeclineHandshake) || ($.eventName = DeleteOrganization) || ($.eventName = DeleteOrganizationalUnit) || ($.eventName = DeletePolicy) || ($.eventName = DetachPolicy) || ($.eventName = DisablePolicyType) || ($.eventName = EnablePolicyType) || ($.eventName = InviteAccountToOrganization) || ($.eventName = LeaveOrganization) || ($.eventName = MoveAccount) || ($.eventName = RemoveAccountFromOrganization) || ($.eventName = UpdatePolicy) || ($.eventName = UpdateOrganizationalUnit)) }"]];for(let[s,a]of n)this.createMetricAlarm(s,a)}createMetricAlarm(r,i){let n=`${this.config.stackName}${r}MetricFilter`,s=`${this.config.stackName}${r}Metric`,a=`${this.config.stackName}Metrics`,l=`${this.config.stackName}${r}Alarm`,f=new S.aws_logs.MetricFilter(this,n,{logGroup:this.logGroup,filterPattern:{logPatternString:i},metricNamespace:a,metricName:s});new S.aws_cloudwatch.Alarm(this,l,{metric:f.metric({}),threshold:1,evaluationPeriods:1,alarmName:l,actionsEnabled:!0,treatMissingData:S.aws_cloudwatch.TreatMissingData.NOT_BREACHING,comparisonOperator:S.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,datapointsToAlarm:1}).addAlarmAction(new S.aws_cloudwatch_actions.SnsAction(this.alarmTopic))}};var m=require("aws-cdk-lib"),He=require("constructs");var qe=require("aws-cdk-lib");function ae(e,t){let r=new qe.aws_iam.PolicyStatement;return r.addActions("s3:GetObject*"),r.addActions("s3:GetBucket*"),r.addActions("s3:List*"),r.addResources(e.bucketArn),r.addResources(`${e.bucketArn}/*`),r.addCanonicalUserPrincipal(t.cloudFrontOriginAccessIdentityS3CanonicalUserId),e.addToResourcePolicy(r),r}var W=class extends He.Construct{constructor(r,i,n){super(r,"FrontEnd");c(this,"appBucket");c(this,"responseHeadersPolicy");c(this,"waf");c(this,"apiOriginCachePolicy");c(this,"originAccessIdentity");c(this,"originAccessPolicyStatement");c(this,"distribution");c(this,"dnsRecord");if(n===i.region?this.appBucket=new m.aws_s3.Bucket(this,"AppBucket",{bucketName:i.appDomainName,publicReadAccess:!1,blockPublicAccess:m.aws_s3.BlockPublicAccess.BLOCK_ALL,removalPolicy:m.RemovalPolicy.DESTROY,encryption:m.aws_s3.BucketEncryption.S3_MANAGED,enforceSSL:!0,versioned:!0}):this.appBucket=m.aws_s3.Bucket.fromBucketAttributes(this,"AppBucket",{bucketName:i.appDomainName,region:i.region}),n==="us-east-1"&&(this.responseHeadersPolicy=new m.aws_cloudfront.ResponseHeadersPolicy(this,"ResponseHeadersPolicy",{customHeadersBehavior:{customHeaders:[{header:"Permissions-Policy",value:"accelerometer=(), camera=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=(), interest-cohort=()",override:!0}]},securityHeadersBehavior:{contentSecurityPolicy:{contentSecurityPolicy:["default-src 'none'","base-uri 'self'","child-src 'self'",`connect-src 'self' ${i.apiDomainName} *.medplum.com *.google.com`,"font-src 'self' fonts.gstatic.com","form-action 'self' *.gstatic.com *.google.com","frame-ancestors 'none'",`frame-src 'self' ${i.storageDomainName} *.medplum.com *.gstatic.com *.google.com`,`img-src 'self' data: ${i.storageDomainName} *.gstatic.com *.google.com *.googleapis.com`,"manifest-src 'self'",`media-src 'self' ${i.storageDomainName}`,"script-src 'self' *.medplum.com *.gstatic.com *.google.com","style-src 'self' 'unsafe-inline' *.medplum.com *.gstatic.com *.google.com","worker-src 'self' blob: *.gstatic.com *.google.com","upgrade-insecure-requests"].join("; "),override:!0},contentTypeOptions:{override:!0},frameOptions:{frameOption:m.aws_cloudfront.HeadersFrameOption.DENY,override:!0},referrerPolicy:{referrerPolicy:m.aws_cloudfront.HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN,override:!0},strictTransportSecurity:{accessControlMaxAge:m.Duration.seconds(63072e3),includeSubdomains:!0,preload:!0,override:!0},xssProtection:{protection:!0,modeBlock:!0,override:!0}}}),this.waf=U(this,"FrontEndWAF",`${i.stackName}-FrontEndWAF`,"CLOUDFRONT",i.appWafIpSetArn,i.wafLogGroupName,i.wafLogGroupCreate),this.apiOriginCachePolicy=new m.aws_cloudfront.CachePolicy(this,"ApiOriginCachePolicy",{cachePolicyName:`${i.stackName}-ApiOriginCachePolicy`,cookieBehavior:m.aws_cloudfront.CacheCookieBehavior.all(),headerBehavior:m.aws_cloudfront.CacheHeaderBehavior.allowList("Authorization","Content-Encoding","Content-Type","If-None-Match","Origin","Referer","User-Agent","X-Medplum"),queryStringBehavior:m.aws_cloudfront.CacheQueryStringBehavior.all()}),this.originAccessIdentity=new m.aws_cloudfront.OriginAccessIdentity(this,"OriginAccessIdentity",{}),this.originAccessPolicyStatement=ae(this.appBucket,this.originAccessIdentity),this.distribution=new m.aws_cloudfront.Distribution(this,"AppDistribution",{defaultRootObject:"index.html",defaultBehavior:{origin:m.aws_cloudfront_origins.S3BucketOrigin.withOriginAccessIdentity(this.appBucket,{originAccessIdentity:this.originAccessIdentity}),responseHeadersPolicy:this.responseHeadersPolicy,viewerProtocolPolicy:m.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS},additionalBehaviors:i.appApiProxy?{"/api/*":{origin:new m.aws_cloudfront_origins.HttpOrigin(i.apiDomainName),allowedMethods:m.aws_cloudfront.AllowedMethods.ALLOW_ALL,cachePolicy:this.apiOriginCachePolicy,viewerProtocolPolicy:m.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS}}:void 0,certificate:m.aws_certificatemanager.Certificate.fromCertificateArn(this,"AppCertificate",i.appSslCertArn),domainNames:[i.appDomainName],errorResponses:[{httpStatus:403,responseHttpStatus:200,responsePagePath:"/index.html"},{httpStatus:404,responseHttpStatus:200,responsePagePath:"/index.html"}],webAclId:this.waf.attrArn,logBucket:i.appLoggingBucket?m.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.appLoggingBucket):void 0,logFilePrefix:i.appLoggingPrefix}),!i.skipDns)){let s=i.hostedZoneName??i.domainName.split(".").slice(-2).join("."),a=m.aws_route53.HostedZone.fromLookup(this,"Zone",{domainName:s});this.dnsRecord=new m.aws_route53.ARecord(this,"AppAliasRecord",{recordName:i.appDomainName,target:m.aws_route53.RecordTarget.fromAlias(new m.aws_route53_targets.CloudFrontTarget(this.distribution)),zone:a})}}};var g=require("aws-cdk-lib"),Ve=require("cdk-serverless-clamscan"),Qe=require("constructs");var q=class extends Qe.Construct{constructor(r,i,n){super(r,"Storage");c(this,"storageBucket");c(this,"keyGroup");c(this,"responseHeadersPolicy");c(this,"waf");c(this,"originAccessIdentity");c(this,"originAccessPolicyStatement");c(this,"distribution");c(this,"dnsRecord");if(n===i.region?(this.storageBucket=new g.aws_s3.Bucket(this,"StorageBucket",{bucketName:i.storageBucketName,publicReadAccess:!1,blockPublicAccess:g.aws_s3.BlockPublicAccess.BLOCK_ALL,encryption:g.aws_s3.BucketEncryption.S3_MANAGED,enforceSSL:!0,versioned:!0}),i.clamscanEnabled&&new Ve.ServerlessClamscan(this,"ServerlessClamscan",{defsBucketAccessLogsConfig:{logsBucket:g.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.clamscanLoggingBucket),logsPrefix:i.clamscanLoggingPrefix}}).addSourceBucket(this.storageBucket)):this.storageBucket=g.aws_s3.Bucket.fromBucketAttributes(this,"StorageBucket",{bucketName:i.storageBucketName,region:i.region}),n==="us-east-1"){let s;if(i.signingKeyId?s=g.aws_cloudfront.PublicKey.fromPublicKeyId(this,"StoragePublicKey",i.signingKeyId):s=new g.aws_cloudfront.PublicKey(this,"StoragePublicKey",{encodedKey:i.storagePublicKey}),this.keyGroup=new g.aws_cloudfront.KeyGroup(this,"StorageKeyGroup",{items:[s]}),this.responseHeadersPolicy=new g.aws_cloudfront.ResponseHeadersPolicy(this,"ResponseHeadersPolicy",{customHeadersBehavior:{customHeaders:[{header:"Permissions-Policy",value:"accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=(), interest-cohort=()",override:!0}]},corsBehavior:{accessControlAllowCredentials:!1,accessControlAllowOrigins:[i.appDomainName,"https://ccda.medplum.com"],accessControlAllowHeaders:["*"],accessControlAllowMethods:["GET","HEAD","OPTIONS"],accessControlMaxAge:g.Duration.seconds(600),originOverride:!1},securityHeadersBehavior:{contentSecurityPolicy:{contentSecurityPolicy:"default-src 'none'; connect-src https://ccda.medplum.com; base-uri 'none'; form-action 'none'; frame-ancestors *;",override:!0},contentTypeOptions:{override:!0},frameOptions:{frameOption:g.aws_cloudfront.HeadersFrameOption.DENY,override:!0},referrerPolicy:{referrerPolicy:g.aws_cloudfront.HeadersReferrerPolicy.NO_REFERRER,override:!0},strictTransportSecurity:{accessControlMaxAge:g.Duration.seconds(63072e3),includeSubdomains:!0,preload:!0,override:!0},xssProtection:{protection:!0,modeBlock:!0,override:!0}}}),this.waf=U(this,"StorageWAF",`${i.stackName}-StorageWAF`,"CLOUDFRONT",i.storageWafIpSetArn,i.wafLogGroupName,i.wafLogGroupCreate),this.originAccessIdentity=new g.aws_cloudfront.OriginAccessIdentity(this,"OriginAccessIdentity",{}),this.originAccessPolicyStatement=ae(this.storageBucket,this.originAccessIdentity),this.distribution=new g.aws_cloudfront.Distribution(this,"StorageDistribution",{defaultBehavior:{origin:g.aws_cloudfront_origins.S3BucketOrigin.withOriginAccessIdentity(this.storageBucket,{originAccessIdentity:this.originAccessIdentity}),responseHeadersPolicy:this.responseHeadersPolicy,viewerProtocolPolicy:g.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,trustedKeyGroups:[this.keyGroup]},certificate:g.aws_certificatemanager.Certificate.fromCertificateArn(this,"StorageCertificate",i.storageSslCertArn),domainNames:[i.storageDomainName],webAclId:this.waf.attrArn,logBucket:i.storageLoggingBucket?g.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.storageLoggingBucket):void 0,logFilePrefix:i.storageLoggingPrefix}),!i.skipDns){let a=i.hostedZoneName??i.domainName.split(".").slice(-2).join("."),l=g.aws_route53.HostedZone.fromLookup(this,"Zone",{domainName:a});this.dnsRecord=new g.aws_route53.ARecord(this,"StorageAliasRecord",{recordName:i.storageDomainName,target:g.aws_route53.RecordTarget.fromAlias(new g.aws_route53_targets.CloudFrontTarget(this.distribution)),zone:l})}}}};var K=class{constructor(t,r){c(this,"primaryStack");c(this,"globalStack");this.primaryStack=new ce(t,r),r.region!=="us-east-1"&&(this.globalStack=new le(t,r),this.globalStack.addDependency(this.primaryStack))}},ce=class extends H.Stack{constructor(r,i){super(r,i.stackName,{env:{region:i.region,account:i.accountNumber}});c(this,"backEnd");c(this,"frontEnd");c(this,"storage");c(this,"cloudTrail");H.Tags.of(this).add("medplum:environment",i.name),this.backEnd=new J(this,i),this.frontEnd=new W(this,i,i.region),this.storage=new q(this,i,i.region),this.cloudTrail=new j(this,i)}},le=class extends H.Stack{constructor(r,i){super(r,i.stackName+"-us-east-1",{env:{region:"us-east-1",account:i.accountNumber}});c(this,"frontEnd");c(this,"storage");c(this,"cloudTrail");H.Tags.of(this).add("medplum:environment",i.name),this.frontEnd=new W(this,i,"us-east-1"),this.storage=new q(this,i,"us-east-1"),this.cloudTrail=new j(this,i)}};async function Ye(e){let t=new ze.App({context:e}),r=t.node.tryGetContext("config");if(!r){console.log('Missing "config" context variable'),console.log("Usage: cdk deploy -c config=my-config.json");return}let i=JSON.parse((0,Je.readFileSync)((0,Ke.resolve)(r),"utf-8")),n=await Ge(i),s=new K(t,n);console.log("Stack",s.primaryStack.stackId),t.synth()}Ye().catch(e=>{console.error(e),process.exit(1)});0&&(module.exports={BackEnd,CloudTrailAlarms,FrontEnd,MedplumGlobalStack,MedplumPrimaryStack,MedplumStack,Storage,buildWaf,main});
1
+ "use strict";var it=Object.create;var V=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,at=Object.prototype.hasOwnProperty;var ct=(e,t,r)=>t in e?V(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var lt=(e,t)=>{for(var r in t)V(e,r,{get:t[r],enumerable:!0})},Ee=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of st(t))!at.call(e,n)&&n!==r&&V(e,n,{get:()=>t[n],enumerable:!(i=nt(t,n))||i.enumerable});return e};var ut=(e,t,r)=>(r=e!=null?it(ot(e)):{},Ee(t||!e||!e.__esModule?V(r,"default",{value:e,enumerable:!0}):r,e)),dt=e=>Ee(V({},"__esModule",{value:!0}),e);var c=(e,t,r)=>ct(e,typeof t!="symbol"?t+"":t,r);var Cr={};lt(Cr,{BackEnd:()=>J,CloudTrailAlarms:()=>j,FrontEnd:()=>W,MedplumGlobalStack:()=>le,MedplumPrimaryStack:()=>ce,MedplumStack:()=>K,Storage:()=>q,buildWaf:()=>U,main:()=>Ye});module.exports=dt(Cr);var ze=require("aws-cdk-lib"),Je=require("node:fs"),Ke=require("node:path");var ne=require("@aws-sdk/client-ssm");var ht=Object.defineProperty,pt=(e,t,r)=>t in e?ht(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,v=(e,t,r)=>pt(e,typeof t!="symbol"?t+"":t,r),mt=class{constructor(e,t){v(this,"operator"),v(this,"child"),this.operator=e,this.child=t}toString(){return`${this.operator}(${this.child.toString()})`}},z=class{constructor(e,t,r){v(this,"operator"),v(this,"left"),v(this,"right"),this.operator=e,this.left=t,this.right=r}toString(){return`(${this.left.toString()} ${this.operator} ${this.right.toString()})`}},ft=class{constructor(){v(this,"prefixParselets",{}),v(this,"infixParselets",{})}registerInfix(e,t){return this.infixParselets[e]=t,this}registerPrefix(e,t){return this.prefixParselets[e]=t,this}prefix(e,t,r){return this.registerPrefix(e,{parse(i,n){let s=i.consumeAndParse(t);return r(n,s)}})}infixLeft(e,t,r){return this.registerInfix(e,{parse(i,n,s){let a=i.consumeAndParse(t);return r(n,s,a)},precedence:t})}construct(e){return new yt(e,this.prefixParselets,this.infixParselets)}},yt=class{constructor(e,t,r){v(this,"tokens"),v(this,"prefixParselets"),v(this,"infixParselets"),this.tokens=e,this.prefixParselets=t,this.infixParselets=r}hasMore(){return this.tokens.length>0}match(e){return this.peek()?.id!==e?!1:(this.consume(),!0)}consumeAndParse(e=1/0){let t=this.consume(),r=this.prefixParselets[t.id];if(!r)throw new Error(`Parse error at "${t.value}" (line ${t.line}, column ${t.column}). No matching prefix parselet.`);let i=r.parse(this,t);for(;e>this.getPrecedence();){let n=this.consume();i=this.getInfixParselet(n).parse(this,i,n)}return i}getPrecedence(){let e=this.peek();if(!e)return 1/0;let t=this.getInfixParselet(e);return t?t.precedence:1/0}consume(e,t){if(!this.tokens.length)throw new Error("Cant consume unknown more tokens.");if(e&&this.peek()?.id!==e){let r=this.peek();throw new Error(`Expected ${e} but got "${r.id}" (${r.value}) at line ${r.line} column ${r.column}.`)}if(t&&this.peek()?.value!==t){let r=this.peek();throw new Error(`Expected "${t}" but got "${r.value}" at line ${r.line} column ${r.column}.`)}return this.tokens.shift()}peek(){return this.tokens.length>0?this.tokens[0]:void 0}removeComments(){this.tokens=this.tokens.filter(e=>e.id!=="Comment")}getInfixParselet(e){return this.infixParselets[e.id==="Symbol"?e.value:e.id]}},gt=class{constructor(e=10){v(this,"max"),v(this,"cache"),this.max=e,this.cache=new Map}clear(){this.cache.clear()}get(e){let t=this.cache.get(e);return t&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size>=this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}delete(e){this.cache.delete(e)}keys(){return this.cache.keys()}first(){return this.cache.keys().next().value}};var vt="unauthorized";var ee={resourceType:"OperationOutcome",id:vt,issue:[{severity:"error",code:"login",details:{text:"Unauthorized"}}]},Rr={...ee,issue:[...ee.issue,{severity:"error",code:"expired",details:{text:"Token expired"}}]},kr={...ee,issue:[...ee.issue,{severity:"error",code:"invalid",details:{text:"Token not issued for this audience"}}]};function me(e,t){return{resourceType:"OperationOutcome",issue:[{severity:"error",code:"invalid",details:{text:e},...t?{expression:[t]}:void 0}]}}function _(e){return{resourceType:"OperationOutcome",issue:[{severity:"error",code:"structure",details:{text:e}}]}}var I=class extends Error{constructor(e,t){super(St(e),t),v(this,"outcome"),this.name="OperationOutcomeError",this.outcome=e}};function St(e){let t=e.issue?.map(bt)??[];return t.length>0?t.join("; "):"Unknown error"}function bt(e){let t;return e.details?.text?e.diagnostics?t=`${e.details.text} (${e.diagnostics})`:t=e.details.text:e.diagnostics?t=e.diagnostics:t="Unknown error",e.expression?.length&&(t+=` (${e.expression.join(", ")})`),t}function wt(e,t){let r=t.max&&t.max===Number.MAX_SAFE_INTEGER?Number.POSITIVE_INFINITY:t.max;return{path:e,description:"",type:t.type??[],min:t.min??0,max:r??1,isArray:!!r&&r>1,constraints:[]}}function xt(e){let t=Object.create(null);for(let[r,i]of Object.entries(e))t[r]={name:r,type:r,path:r,elements:Object.fromEntries(Object.entries(i.elements).map(([n,s])=>[n,wt(n,s)])),constraints:[],innerTypes:[]};return t}var Et={Element:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]}}},BackboneElement:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]}}},Address:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},use:{type:[{code:"code"}]},type:{type:[{code:"code"}]},text:{type:[{code:"string"}]},line:{max:9007199254740991,type:[{code:"string"}]},city:{type:[{code:"string"}]},district:{type:[{code:"string"}]},state:{type:[{code:"string"}]},postalCode:{type:[{code:"string"}]},country:{type:[{code:"string"}]},period:{type:[{code:"Period"}]}}},Age:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},Annotation:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},"author[x]":{type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Practitioner","http://hl7.org/fhir/StructureDefinition/Patient","http://hl7.org/fhir/StructureDefinition/RelatedPerson","http://hl7.org/fhir/StructureDefinition/Organization"]},{code:"string"}]},time:{type:[{code:"dateTime"}]},text:{min:1,type:[{code:"markdown"}]}}},Attachment:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},contentType:{type:[{code:"code"}]},language:{type:[{code:"code"}]},data:{type:[{code:"base64Binary"}]},url:{type:[{code:"url"}]},size:{type:[{code:"unsignedInt"}]},hash:{type:[{code:"base64Binary"}]},title:{type:[{code:"string"}]},creation:{type:[{code:"dateTime"}]}}},CodeableConcept:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},coding:{max:9007199254740991,type:[{code:"Coding"}]},text:{type:[{code:"string"}]}}},Coding:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},system:{type:[{code:"uri"}]},version:{type:[{code:"string"}]},code:{type:[{code:"code"}]},display:{type:[{code:"string"}]},userSelected:{type:[{code:"boolean"}]}}},ContactDetail:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},name:{type:[{code:"string"}]},telecom:{max:9007199254740991,type:[{code:"ContactPoint"}]}}},ContactPoint:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},system:{type:[{code:"code"}]},value:{type:[{code:"string"}]},use:{type:[{code:"code"}]},rank:{type:[{code:"positiveInt"}]},period:{type:[{code:"Period"}]}}},Contributor:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},name:{min:1,type:[{code:"string"}]},contact:{max:9007199254740991,type:[{code:"ContactDetail"}]}}},Count:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},DataRequirement:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},profile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]},"subject[x]":{type:[{code:"CodeableConcept"},{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Group"]}]},mustSupport:{max:9007199254740991,type:[{code:"string"}]},codeFilter:{max:9007199254740991,type:[{code:"DataRequirementCodeFilter"}]},dateFilter:{max:9007199254740991,type:[{code:"DataRequirementDateFilter"}]},limit:{type:[{code:"positiveInt"}]},sort:{max:9007199254740991,type:[{code:"DataRequirementSort"}]}}},DataRequirementCodeFilter:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{type:[{code:"string"}]},searchParam:{type:[{code:"string"}]},valueSet:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/ValueSet"]}]},code:{max:9007199254740991,type:[{code:"Coding"}]}}},DataRequirementDateFilter:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{type:[{code:"string"}]},searchParam:{type:[{code:"string"}]},"value[x]":{type:[{code:"dateTime"},{code:"Period"},{code:"Duration"}]}}},DataRequirementSort:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{min:1,type:[{code:"string"}]},direction:{min:1,type:[{code:"code"}]}}},Distance:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},Dosage:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},sequence:{type:[{code:"integer"}]},text:{type:[{code:"string"}]},additionalInstruction:{max:9007199254740991,type:[{code:"CodeableConcept"}]},patientInstruction:{type:[{code:"string"}]},timing:{type:[{code:"Timing"}]},"asNeeded[x]":{type:[{code:"boolean"},{code:"CodeableConcept"}]},site:{type:[{code:"CodeableConcept"}]},route:{type:[{code:"CodeableConcept"}]},method:{type:[{code:"CodeableConcept"}]},doseAndRate:{max:9007199254740991,type:[{code:"DosageDoseAndRate"}]},maxDosePerPeriod:{type:[{code:"Ratio"}]},maxDosePerAdministration:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},maxDosePerLifetime:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]}}},DosageDoseAndRate:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{type:[{code:"CodeableConcept"}]},"dose[x]":{type:[{code:"Range"},{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},"rate[x]":{type:[{code:"Ratio"},{code:"Range"},{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]}}},Duration:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},ElementDefinition:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},path:{min:1,type:[{code:"string"}]},representation:{max:9007199254740991,type:[{code:"code"}]},sliceName:{type:[{code:"string"}]},sliceIsConstraining:{type:[{code:"boolean"}]},label:{type:[{code:"string"}]},code:{max:9007199254740991,type:[{code:"Coding"}]},slicing:{type:[{code:"ElementDefinitionSlicing"}]},short:{type:[{code:"string"}]},definition:{type:[{code:"markdown"}]},comment:{type:[{code:"markdown"}]},requirements:{type:[{code:"markdown"}]},alias:{max:9007199254740991,type:[{code:"string"}]},min:{type:[{code:"unsignedInt"}]},max:{type:[{code:"string"}]},base:{type:[{code:"ElementDefinitionBase"}]},contentReference:{type:[{code:"uri"}]},type:{max:9007199254740991,type:[{code:"ElementDefinitionType"}]},"defaultValue[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]},meaningWhenMissing:{type:[{code:"markdown"}]},orderMeaning:{type:[{code:"string"}]},"fixed[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]},"pattern[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]},example:{max:9007199254740991,type:[{code:"ElementDefinitionExample"}]},"minValue[x]":{type:[{code:"date"},{code:"dateTime"},{code:"instant"},{code:"time"},{code:"decimal"},{code:"integer"},{code:"positiveInt"},{code:"unsignedInt"},{code:"Quantity"}]},"maxValue[x]":{type:[{code:"date"},{code:"dateTime"},{code:"instant"},{code:"time"},{code:"decimal"},{code:"integer"},{code:"positiveInt"},{code:"unsignedInt"},{code:"Quantity"}]},maxLength:{type:[{code:"integer"}]},condition:{max:9007199254740991,type:[{code:"id"}]},constraint:{max:9007199254740991,type:[{code:"ElementDefinitionConstraint"}]},mustSupport:{type:[{code:"boolean"}]},isModifier:{type:[{code:"boolean"}]},isModifierReason:{type:[{code:"string"}]},isSummary:{type:[{code:"boolean"}]},binding:{type:[{code:"ElementDefinitionBinding"}]},mapping:{max:9007199254740991,type:[{code:"ElementDefinitionMapping"}]}}},ElementDefinitionSlicingDiscriminator:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},path:{min:1,type:[{code:"string"}]}}},ElementDefinitionSlicing:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},discriminator:{max:9007199254740991,type:[{code:"ElementDefinitionSlicingDiscriminator"}]},description:{type:[{code:"string"}]},ordered:{type:[{code:"boolean"}]},rules:{min:1,type:[{code:"code"}]}}},ElementDefinitionBase:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},path:{min:1,type:[{code:"string"}]},min:{min:1,type:[{code:"unsignedInt"}]},max:{min:1,type:[{code:"string"}]}}},ElementDefinitionType:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},code:{min:1,type:[{code:"uri"}]},profile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition","http://hl7.org/fhir/StructureDefinition/ImplementationGuide"]}]},targetProfile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition","http://hl7.org/fhir/StructureDefinition/ImplementationGuide"]}]},aggregation:{max:9007199254740991,type:[{code:"code"}]},versioning:{type:[{code:"code"}]}}},ElementDefinitionExample:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},label:{min:1,type:[{code:"string"}]},"value[x]":{min:1,type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]}}},ElementDefinitionConstraint:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},key:{min:1,type:[{code:"id"}]},requirements:{type:[{code:"string"}]},severity:{min:1,type:[{code:"code"}]},human:{min:1,type:[{code:"string"}]},expression:{type:[{code:"string"}]},xpath:{type:[{code:"string"}]},source:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]}}},ElementDefinitionBinding:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},strength:{min:1,type:[{code:"code"}]},description:{type:[{code:"string"}]},valueSet:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/ValueSet"]}]}}},ElementDefinitionMapping:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},identity:{min:1,type:[{code:"id"}]},language:{type:[{code:"code"}]},map:{min:1,type:[{code:"string"}]},comment:{type:[{code:"string"}]}}},Expression:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},description:{type:[{code:"string"}]},name:{type:[{code:"id"}]},language:{min:1,type:[{code:"code"}]},expression:{type:[{code:"string"}]},reference:{type:[{code:"uri"}]}}},Extension:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},url:{min:1,type:[{code:"uri"}]},"value[x]":{type:[{code:"base64Binary"},{code:"boolean"},{code:"canonical"},{code:"code"},{code:"date"},{code:"dateTime"},{code:"decimal"},{code:"id"},{code:"instant"},{code:"integer"},{code:"markdown"},{code:"oid"},{code:"positiveInt"},{code:"string"},{code:"time"},{code:"unsignedInt"},{code:"uri"},{code:"url"},{code:"uuid"},{code:"Address"},{code:"Age"},{code:"Annotation"},{code:"Attachment"},{code:"CodeableConcept"},{code:"Coding"},{code:"ContactPoint"},{code:"Count"},{code:"Distance"},{code:"Duration"},{code:"HumanName"},{code:"Identifier"},{code:"Money"},{code:"Period"},{code:"Quantity"},{code:"Range"},{code:"Ratio"},{code:"Reference"},{code:"SampledData"},{code:"Signature"},{code:"Timing"},{code:"ContactDetail"},{code:"Contributor"},{code:"DataRequirement"},{code:"Expression"},{code:"ParameterDefinition"},{code:"RelatedArtifact"},{code:"TriggerDefinition"},{code:"UsageContext"},{code:"Dosage"},{code:"Meta"}]}}},HumanName:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},use:{type:[{code:"code"}]},text:{type:[{code:"string"}]},family:{type:[{code:"string"}]},given:{max:9007199254740991,type:[{code:"string"}]},prefix:{max:9007199254740991,type:[{code:"string"}]},suffix:{max:9007199254740991,type:[{code:"string"}]},period:{type:[{code:"Period"}]}}},Identifier:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},use:{type:[{code:"code"}]},type:{type:[{code:"CodeableConcept"}]},system:{type:[{code:"uri"}]},value:{type:[{code:"string"}]},period:{type:[{code:"Period"}]},assigner:{type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Organization"]}]}}},MarketingStatus:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},country:{min:1,type:[{code:"CodeableConcept"}]},jurisdiction:{type:[{code:"CodeableConcept"}]},status:{min:1,type:[{code:"CodeableConcept"}]},dateRange:{min:1,type:[{code:"Period"}]},restoreDate:{type:[{code:"dateTime"}]}}},Meta:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},versionId:{type:[{code:"id"}]},lastUpdated:{type:[{code:"instant"}]},source:{type:[{code:"uri"}]},profile:{max:9007199254740991,type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]},security:{max:9007199254740991,type:[{code:"Coding"}]},tag:{max:9007199254740991,type:[{code:"Coding"}]},project:{type:[{code:"uri"}]},author:{type:[{code:"Reference"}]},onBehalfOf:{type:[{code:"Reference"}]},account:{type:[{code:"Reference"}]},accounts:{max:9007199254740991,type:[{code:"Reference"}]},compartment:{max:9007199254740991,type:[{code:"Reference"}]}}},Money:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},currency:{type:[{code:"code"}]}}},Narrative:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},status:{min:1,type:[{code:"code"}]},div:{min:1,type:[{code:"xhtml"}]}}},ParameterDefinition:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},name:{type:[{code:"code"}]},use:{min:1,type:[{code:"code"}]},min:{type:[{code:"integer"}]},max:{type:[{code:"string"}]},documentation:{type:[{code:"string"}]},type:{min:1,type:[{code:"code"}]},profile:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/StructureDefinition"]}]}}},Period:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},start:{type:[{code:"dateTime"}]},end:{type:[{code:"dateTime"}]}}},Population:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},"age[x]":{type:[{code:"Range"},{code:"CodeableConcept"}]},gender:{type:[{code:"CodeableConcept"}]},race:{type:[{code:"CodeableConcept"}]},physiologicalCondition:{type:[{code:"CodeableConcept"}]}}},ProdCharacteristic:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},height:{type:[{code:"Quantity"}]},width:{type:[{code:"Quantity"}]},depth:{type:[{code:"Quantity"}]},weight:{type:[{code:"Quantity"}]},nominalVolume:{type:[{code:"Quantity"}]},externalDiameter:{type:[{code:"Quantity"}]},shape:{type:[{code:"string"}]},color:{max:9007199254740991,type:[{code:"string"}]},imprint:{max:9007199254740991,type:[{code:"string"}]},image:{max:9007199254740991,type:[{code:"Attachment"}]},scoring:{type:[{code:"CodeableConcept"}]}}},ProductShelfLife:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},identifier:{type:[{code:"Identifier"}]},type:{min:1,type:[{code:"CodeableConcept"}]},period:{min:1,type:[{code:"Quantity"}]},specialPrecautionsForStorage:{max:9007199254740991,type:[{code:"CodeableConcept"}]}}},Quantity:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},Range:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},low:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},high:{type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]}}},Ratio:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},numerator:{type:[{code:"Quantity"}]},denominator:{type:[{code:"Quantity"}]}}},Reference:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},reference:{type:[{code:"string"}]},type:{type:[{code:"uri"}]},identifier:{type:[{code:"Identifier"}]},display:{type:[{code:"string"}]}}},RelatedArtifact:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},label:{type:[{code:"string"}]},display:{type:[{code:"string"}]},citation:{type:[{code:"markdown"}]},url:{type:[{code:"url"}]},document:{type:[{code:"Attachment"}]},resource:{type:[{code:"canonical",targetProfile:["http://hl7.org/fhir/StructureDefinition/Resource"]}]}}},SampledData:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},origin:{min:1,type:[{code:"Quantity",profile:["http://hl7.org/fhir/StructureDefinition/SimpleQuantity"]}]},period:{min:1,type:[{code:"decimal"}]},factor:{type:[{code:"decimal"}]},lowerLimit:{type:[{code:"decimal"}]},upperLimit:{type:[{code:"decimal"}]},dimensions:{min:1,type:[{code:"positiveInt"}]},data:{type:[{code:"string"}]}}},Signature:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,max:9007199254740991,type:[{code:"Coding"}]},when:{min:1,type:[{code:"instant"}]},who:{min:1,type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Practitioner","http://hl7.org/fhir/StructureDefinition/PractitionerRole","http://hl7.org/fhir/StructureDefinition/RelatedPerson","http://hl7.org/fhir/StructureDefinition/Patient","http://hl7.org/fhir/StructureDefinition/Device","http://hl7.org/fhir/StructureDefinition/Organization"]}]},onBehalfOf:{type:[{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Practitioner","http://hl7.org/fhir/StructureDefinition/PractitionerRole","http://hl7.org/fhir/StructureDefinition/RelatedPerson","http://hl7.org/fhir/StructureDefinition/Patient","http://hl7.org/fhir/StructureDefinition/Device","http://hl7.org/fhir/StructureDefinition/Organization"]}]},targetFormat:{type:[{code:"code"}]},sigFormat:{type:[{code:"code"}]},data:{type:[{code:"base64Binary"}]}}},SubstanceAmount:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},"amount[x]":{type:[{code:"Quantity"},{code:"Range"},{code:"string"}]},amountType:{type:[{code:"CodeableConcept"}]},amountText:{type:[{code:"string"}]},referenceRange:{type:[{code:"SubstanceAmountReferenceRange"}]}}},SubstanceAmountReferenceRange:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},lowLimit:{type:[{code:"Quantity"}]},highLimit:{type:[{code:"Quantity"}]}}},Timing:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},modifierExtension:{max:9007199254740991,type:[{code:"Extension"}]},event:{max:9007199254740991,type:[{code:"dateTime"}]},repeat:{type:[{code:"TimingRepeat"}]},code:{type:[{code:"CodeableConcept"}]}}},TimingRepeat:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},"bounds[x]":{type:[{code:"Duration"},{code:"Range"},{code:"Period"}]},count:{type:[{code:"positiveInt"}]},countMax:{type:[{code:"positiveInt"}]},duration:{type:[{code:"decimal"}]},durationMax:{type:[{code:"decimal"}]},durationUnit:{type:[{code:"code"}]},frequency:{type:[{code:"positiveInt"}]},frequencyMax:{type:[{code:"positiveInt"}]},period:{type:[{code:"decimal"}]},periodMax:{type:[{code:"decimal"}]},periodUnit:{type:[{code:"code"}]},dayOfWeek:{max:9007199254740991,type:[{code:"code"}]},timeOfDay:{max:9007199254740991,type:[{code:"time"}]},when:{max:9007199254740991,type:[{code:"code"}]},offset:{type:[{code:"unsignedInt"}]}}},TriggerDefinition:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},type:{min:1,type:[{code:"code"}]},name:{type:[{code:"string"}]},"timing[x]":{type:[{code:"Timing"},{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/Schedule"]},{code:"date"},{code:"dateTime"}]},data:{max:9007199254740991,type:[{code:"DataRequirement"}]},condition:{type:[{code:"Expression"}]}}},UsageContext:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},code:{min:1,type:[{code:"Coding"}]},"value[x]":{min:1,type:[{code:"CodeableConcept"},{code:"Quantity"},{code:"Range"},{code:"Reference",targetProfile:["http://hl7.org/fhir/StructureDefinition/PlanDefinition","http://hl7.org/fhir/StructureDefinition/ResearchStudy","http://hl7.org/fhir/StructureDefinition/InsurancePlan","http://hl7.org/fhir/StructureDefinition/HealthcareService","http://hl7.org/fhir/StructureDefinition/Group","http://hl7.org/fhir/StructureDefinition/Location","http://hl7.org/fhir/StructureDefinition/Organization"]}]}}},MoneyQuantity:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},SimpleQuantity:{elements:{id:{type:[{code:"string"}]},extension:{max:9007199254740991,type:[{code:"Extension"}]},value:{type:[{code:"decimal"}]},comparator:{max:0,type:[{code:"code"}]},unit:{type:[{code:"string"}]},system:{type:[{code:"uri"}]},code:{type:[{code:"code"}]}}},IdentityProvider:{elements:{authorizeUrl:{min:1,type:[{code:"string"}]},tokenUrl:{min:1,type:[{code:"string"}]},tokenAuthMethod:{type:[{code:"code"}]},userInfoUrl:{min:1,type:[{code:"string"}]},clientId:{min:1,type:[{code:"string"}]},clientSecret:{min:1,type:[{code:"string"}]},usePkce:{type:[{code:"boolean"}]},useSubject:{type:[{code:"boolean"}]}}}};var Tt=xt(Et);var Te=Object.create(null);function Ct(e){let t;return t=Te[e],t||(t=Te[e]=Object.create(null)),t}function At(e,t){if(t){let r=Ct(t)[e];if(r)return r}return Tt[e]}function Pt(e,t,r){let i=e.path;return Rt(kt(e,t,r),i,t)}function Rt(e,t,r){let i=t?t+".":"";return e===void 0?{type:"undefined",value:void 0,path:`${i}${r}`}:Array.isArray(e)?e.map((n,s)=>({...n,path:`${i}${r}[${s}]`})):{...e,path:`${i}${r}`}}var Ir=new gt(1e3);var Re={base64Binary:/^([A-Za-z\d+/]{4})*([A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?$/,canonical:/^\S*$/,code:/^[^\s]+( [^\s]+)*$/,date:/^(\d(\d(\d[1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2]\d|3[0-1]))?)?$/,dateTime:/^(\d(\d(\d[1-9]|[1-9]0)|[1-9]00)|[1-9]000)(-(0[1-9]|1[0-2])(-(0[1-9]|[1-2]\d|3[0-1])(T([01]\d|2[0-3])(:[0-5]\d:([0-5]\d|60)(\.\d{1,9})?)?)?)?(Z|[+-]((0\d|1[0-3]):[0-5]\d|14:00)?)?)?$/,id:/^[A-Za-z0-9\-.]{1,64}$/,instant:/^(\d(\d(\d[1-9]|[1-9]0)|[1-9]00)|[1-9]000)-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\d|3[0-1])T([01]\d|2[0-3]):[0-5]\d:([0-5]\d|60)(\.\d{1,9})?(Z|[+-]((0\d|1[0-3]):[0-5]\d|14:00))$/,markdown:/^[\r\n\t\u0020-\uFFFF]+$/,oid:/^urn:oid:[0-2](\.(0|[1-9]\d*))+$/,string:/^[\r\n\t\u0020-\uFFFF]+$/,time:/^([01]\d|2[0-3]):[0-5]\d:([0-5]\d|60)(\.\d{1,9})?$/,uri:/^\S*$/,url:/^\S*$/,uuid:/^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,xhtml:/.*/};function u(e){return[{type:d.boolean,value:e}]}function $(e){return e==null?{type:"undefined",value:void 0}:Number.isSafeInteger(e)?{type:d.integer,value:e}:typeof e=="number"?{type:d.decimal,value:e}:typeof e=="boolean"?{type:d.boolean,value:e}:typeof e=="string"?{type:d.string,value:e}:T(e)?{type:d.Quantity,value:e}:ie(e)?{type:e.resourceType,value:e}:Wt(e)?{type:d.CodeableConcept,value:e}:_e(e)?{type:d.Coding,value:e}:{type:d.BackboneElement,value:e}}function N(e){return e.length===0?!1:!!e[0].value}function O(e,t){if(e.length!==0){if(e.length===1&&(!t||e[0].type===t))return e[0];throw new Error(`Expected singleton of type ${t}, but found ${JSON.stringify(e)}`)}}function kt(e,t,r){if(!e.value)return;let i=Ht(e.type,t,r?.profileUrl);return i?It(e,t,i):Dt(e,t)}function It(e,t,r){let i=e.value,n=r.type;if(!n||n.length===0)return;let s,a="undefined",l,f=r.path.lastIndexOf("."),x=r.path.substring(f+1);for(let h of n){let b=x.replace("[x]",Le(h.code));if(s=i[b],l=i["_"+b],s!==void 0||l!==void 0){a=h.code;break}}if(l)if(Array.isArray(s)){s=s.slice();for(let h=0;h<Math.max(s.length,l.length);h++)s[h]=he(s[h],l[h])}else if(!s&&Array.isArray(l)){s=l.slice();for(let h=0;h<l.length;h++)s[h]=he(void 0,l[h])}else s=he(s,l);if(!Q(s))return(a==="Element"||a==="BackboneElement")&&(a=r.type[0].code),Array.isArray(s)?s.map(h=>Ce(h,a)):Ce(s,a)}function Ce(e,t){return t==="Resource"&&ie(e)&&(t=e.resourceType),{type:t,value:e}}function Dt(e,t){let r=e.value;if(!r||typeof r!="object")return;let i;if(t in r){let n=r[t];Array.isArray(n)?i=n.map($):i=$(n)}else{let n=t.endsWith("[x]")?t.substring(0,t.length-3):t;for(let s of Object.values(d)){let a=n+Le(s);if(a in r){let l=r[a];Array.isArray(l)?i=l.map(f=>({type:s,value:f})):i={type:s,value:l};break}}}if(Array.isArray(i)){if(i.length===0||Q(i[0]))return}else if(Q(i))return;return i}function ke(e){let t=[];for(let r of e){let i=!1;for(let n of t)if(N(re(r,n))){i=!0;break}i||t.push(r)}return t}function Nt(e){return u(!N(e))}function Ot(e,t){return e.length===0||t.length===0?[]:e.length!==t.length?u(!1):u(e.every((r,i)=>N(re(r,t[i]))))}function _t(e,t){return e.length===0||t.length===0?[]:e.length!==t.length?u(!0):u(e.some((r,i)=>!N(re(r,t[i]))))}function re(e,t){let r=e.value?.valueOf(),i=t.value?.valueOf();return typeof r=="number"&&typeof i=="number"?u(Math.abs(r-i)<1e-8):T(r)&&T(i)?u(Ne(r,i)):u(typeof r=="object"&&typeof i=="object"?fe(e,t):r===i)}function Ie(e,t){return e.length===0&&t.length===0?u(!0):e.length!==t.length?u(!1):(e.sort(Ae),t.sort(Ae),u(e.every((r,i)=>N(Lt(r,t[i])))))}function Lt(e,t){let{type:r,value:i}=e,{type:n,value:s}=t,a=i?.valueOf(),l=s?.valueOf();return typeof a=="number"&&typeof l=="number"?u(Math.abs(a-l)<.01):T(a)&&T(l)?u(Ne(a,l)):u(r==="Coding"&&n==="Coding"?typeof a!="object"||typeof l!="object"?!1:a.code===l.code&&a.system===l.system:typeof a=="object"&&typeof l=="object"?fe({...a,id:void 0},{...l,id:void 0}):typeof a=="string"&&typeof l=="string"?a.toLowerCase()===l.toLowerCase():a===l)}function Ae(e,t){let r=e.value?.valueOf(),i=t.value?.valueOf();return typeof r=="number"&&typeof i=="number"?r-i:typeof r=="string"&&typeof i=="string"?r.localeCompare(i):0}function De(e,t){let{value:r}=e;if(r==null)return!1;let i=t;switch(i.startsWith("System.")&&(i=i.substring(7)),i.startsWith("FHIR.")&&(i=i.substring(5)),i){case"Boolean":return typeof r=="boolean";case"Decimal":case"Integer":return typeof r=="number";case"Date":return Mt(r);case"DateTime":return pe(r);case"Time":return typeof r=="string"&&!!/^T\d/.exec(r);case"Period":return $t(r);case"Quantity":return T(r);default:return e.type===i||typeof r=="object"&&r?.resourceType===i}}function Mt(e){return typeof e=="string"&&!!Re.date.exec(e)}function pe(e){return typeof e=="string"&&!!Re.dateTime.exec(e)}function $t(e){return!!(e&&typeof e=="object"&&("start"in e&&pe(e.start)||"end"in e&&pe(e.end)))}function T(e){return!!(e&&typeof e=="object"&&"value"in e&&typeof e.value=="number")}function Ne(e,t){return Math.abs(e.value-t.value)<.01&&(e.unit===t.unit||e.code===t.code||e.unit===t.code||e.code===t.unit)}function fe(e,t){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!1;for(let n of r){let s=e[n],a=t[n];if(Pe(s)&&Pe(a)){if(!fe(s,a))return!1}else if(s!==a)return!1}return!0}function Pe(e){return e!==null&&typeof e=="object"}function he(e,t){if(t){if(typeof t!="object")throw new Error("Primitive extension must be an object");return Ut(e??{},t)}return e}function Ut(e,t){return delete t.__proto__,delete t.constructor,Object.assign(e,t)}function Bt(e){if(e)return Qt(e)?e.reference.split("/")[1]:e.id}function Gt(e,t){let r=new Date(e);r.setUTCHours(0,0,0,0);let i=t?new Date(t):new Date;i.setUTCHours(0,0,0,0);let n=r.getUTCFullYear(),s=r.getUTCMonth(),a=r.getUTCDate(),l=i.getUTCFullYear(),f=i.getUTCMonth(),x=i.getUTCDate(),h=l-n;(f<s||f===s&&x<a)&&h--;let b=l*12+f-(n*12+s);x<a&&b--;let Y=Math.floor((i.getTime()-r.getTime())/(1e3*60*60*24));return{years:h,months:b,days:Y}}function Ft(e,...t){let r=e;for(let i=0;i<t.length&&r;i++)r=r?.extension?.find(n=>n.url===t[i]);return r}function Q(e){if(e==null)return!0;let t=typeof e;return t==="string"||t==="object"?!jt(e):!1}function jt(e){if(e==null)return!1;let t=typeof e;return t==="string"&&e!==""||t==="object"&&("length"in e&&e.length>0||Object.keys(e).length>0)}function Oe(e){return e!==null&&typeof e=="object"}function _e(e){return Oe(e)&&"code"in e&&typeof e.code=="string"}function Wt(e){return Oe(e)&&"coding"in e&&Array.isArray(e.coding)&&e.coding.every(_e)}var qt=[];for(let e=0;e<256;e++)qt.push(e.toString(16).padStart(2,"0"));function Le(e){return e?e.charAt(0).toUpperCase()+e.substring(1):""}var Me=Object.freeze([]);var d={Address:"Address",Age:"Age",Annotation:"Annotation",Attachment:"Attachment",BackboneElement:"BackboneElement",CodeableConcept:"CodeableConcept",Coding:"Coding",ContactDetail:"ContactDetail",ContactPoint:"ContactPoint",Contributor:"Contributor",Count:"Count",DataRequirement:"DataRequirement",Distance:"Distance",Dosage:"Dosage",Duration:"Duration",Element:"Element",ElementDefinition:"ElementDefinition",Expression:"Expression",Extension:"Extension",HumanName:"HumanName",Identifier:"Identifier",MarketingStatus:"MarketingStatus",Meta:"Meta",Money:"Money",MoneyQuantity:"MoneyQuantity",Narrative:"Narrative",ParameterDefinition:"ParameterDefinition",Period:"Period",Population:"Population",ProdCharacteristic:"ProdCharacteristic",ProductShelfLife:"ProductShelfLife",Quantity:"Quantity",Range:"Range",Ratio:"Ratio",Reference:"Reference",RelatedArtifact:"RelatedArtifact",SampledData:"SampledData",Signature:"Signature",SimpleQuantity:"SimpleQuantity",SubstanceAmount:"SubstanceAmount",SystemString:"http://hl7.org/fhirpath/System.String",Timing:"Timing",TriggerDefinition:"TriggerDefinition",UsageContext:"UsageContext",base64Binary:"base64Binary",boolean:"boolean",canonical:"canonical",code:"code",date:"date",dateTime:"dateTime",decimal:"decimal",id:"id",instant:"instant",integer:"integer",markdown:"markdown",oid:"oid",positiveInt:"positiveInt",string:"string",time:"time",unsignedInt:"unsignedInt",uri:"uri",url:"url",uuid:"uuid",xhtml:"xhtml"};function Ht(e,t,r){let i=At(e,r);if(i)return Vt(i.elements,t)}function Vt(e,t){let r=e[t]??e[t+"[x]"];if(r)return r;for(let i=0;i<t.length;i++){let n=t[i];if(n>="A"&&n<="Z"){let s=t.slice(0,i)+"[x]",a=e[s];if(a)return a}}}function ie(e,t){return!(!e||typeof e!="object"||!("resourceType"in e)||t&&e.resourceType!==t)}function Qt(e,t){return e&&typeof e=="object"&&"reference"in e&&typeof e.reference=="string"?t?e.reference.match(new RegExp(`^${t}(/|\\?)`))!==null:!0:!1}function X(e){if(e.startsWith("T"))return e+"T00:00:00.000Z".substring(e.length);if(e.length<=10)return e;try{return new Date(e).toISOString()}catch{return e}}var D=()=>[],w={empty:(e,t)=>u(t.every(r=>Q(r.value))),hasValue:(e,t)=>u(t.length!==0),exists:(e,t,r)=>u(r?t.some(i=>N(r.eval(e,[i]))):t.length>0&&t.every(i=>!Q(i.value))),all:(e,t,r)=>u(t.every(i=>N(r.eval(e,[i])))),allTrue:(e,t)=>{for(let r of t)if(!r.value)return u(!1);return u(!0)},anyTrue:(e,t)=>{for(let r of t)if(r.value)return u(!0);return u(!1)},allFalse:(e,t)=>{for(let r of t)if(r.value)return u(!1);return u(!0)},anyFalse:(e,t)=>{for(let r of t)if(!r.value)return u(!0);return u(!1)},subsetOf:(e,t,r)=>{if(t.length===0)return u(!0);let i=r.eval(e,M(e));return i.length===0?u(!1):u(t.every(n=>i.some(s=>s.value===n.value)))},supersetOf:(e,t,r)=>{let i=r.eval(e,M(e));return i.length===0?u(!0):t.length===0?u(!1):u(i.every(n=>t.some(s=>s.value===n.value)))},count:(e,t)=>[{type:d.integer,value:t.length}],distinct:(e,t)=>{let r=[];for(let i of t)r.some(n=>n.value===i.value)||r.push(i);return r},isDistinct:(e,t)=>u(t.length===w.distinct(e,t).length),where:(e,t,r)=>t.filter(i=>N(r.eval(e,[i]))),select:(e,t,r)=>t.flatMap(i=>r.eval({parent:e,variables:{$this:i}},[i])),repeat:D,ofType:(e,t,r)=>t.filter(i=>i.type===r.name),single:(e,t)=>{if(t.length>1)throw new Error("Expected input length one for single()");return t.length===0?[]:t.slice(0,1)},first:(e,t)=>t.length===0?[]:t.slice(0,1),last:(e,t)=>t.length===0?[]:t.slice(-1,t.length),tail:(e,t)=>t.length===0?[]:t.slice(1,t.length),skip:(e,t,r)=>{let i=r.eval(e,t)[0]?.value;if(typeof i!="number")throw new TypeError("Expected a number for skip(num)");return i>=t.length?[]:i<=0?t:t.slice(i,t.length)},take:(e,t,r)=>{let i=r.eval(e,t)[0]?.value;if(typeof i!="number")throw new TypeError("Expected a number for take(num)");return i>=t.length?t:i<=0?[]:t.slice(0,i)},intersect:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e)),n=[];for(let s of t)!n.some(a=>a.value===s.value)&&i.some(a=>a.value===s.value)&&n.push(s);return n},exclude:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e)),n=[];for(let s of t)i.some(a=>a.value===s.value)||n.push(s);return n},union:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e));return ke([...t,...i])},combine:(e,t,r)=>{if(!r)return t;let i=r.eval(e,M(e));return[...t,...i]},htmlChecks:(e,t,r)=>[$(!0)],iif:(e,t,r,i,n)=>{let s=r.eval(e,t);if(s.length>1||s.length===1&&typeof s[0].value!="boolean")throw new Error("Expected criterion to evaluate to a Boolean");return N(s)?i.eval(e,t):n?n.eval(e,t):[]},toBoolean:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);if(typeof r=="boolean")return[{type:d.boolean,value:r}];if(typeof r=="number"&&(r===0||r===1))return u(!!r);if(typeof r=="string"){let i=r.toLowerCase();if(["true","t","yes","y","1","1.0"].includes(i))return u(!0);if(["false","f","no","n","0","0.0"].includes(i))return u(!1)}return[]},convertsToBoolean:(e,t)=>t.length===0?[]:u(w.toBoolean(e,t).length===1),toInteger:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="number"?[{type:d.integer,value:r}]:typeof r=="string"&&/^[+-]?\d+$/.exec(r)?[{type:d.integer,value:Number.parseInt(r,10)}]:typeof r=="boolean"?[{type:d.integer,value:r?1:0}]:[]},convertsToInteger:(e,t)=>t.length===0?[]:u(w.toInteger(e,t).length===1),toDate:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="string"&&/^\d{4}(-\d{2}(-\d{2})?)?/.exec(r)?[{type:d.date,value:X(r)}]:[]},convertsToDate:(e,t)=>t.length===0?[]:u(w.toDate(e,t).length===1),toDateTime:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="string"&&/^\d{4}(-\d{2}(-\d{2})?)?/.exec(r)?[{type:d.dateTime,value:X(r)}]:[]},convertsToDateTime:(e,t)=>t.length===0?[]:u(w.toDateTime(e,t).length===1),toDecimal:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return typeof r=="number"?[{type:d.decimal,value:r}]:typeof r=="string"&&/^-?\d{1,9}(\.\d{1,9})?$/.exec(r)?[{type:d.decimal,value:Number.parseFloat(r)}]:typeof r=="boolean"?[{type:d.decimal,value:r?1:0}]:[]},convertsToDecimal:(e,t)=>t.length===0?[]:u(w.toDecimal(e,t).length===1),toQuantity:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return T(r)?[{type:d.Quantity,value:r}]:typeof r=="number"?[{type:d.Quantity,value:{value:r,unit:"1"}}]:typeof r=="string"&&/^-?\d{1,9}(\.\d{1,9})?/.exec(r)?[{type:d.Quantity,value:{value:Number.parseFloat(r),unit:"1"}}]:typeof r=="boolean"?[{type:d.Quantity,value:{value:r?1:0,unit:"1"}}]:[]},convertsToQuantity:(e,t)=>t.length===0?[]:u(w.toQuantity(e,t).length===1),toString:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);return r==null?[]:T(r)?[{type:d.string,value:`${r.value} '${r.unit}'`}]:[{type:d.string,value:r.toString()}]},convertsToString:(e,t)=>t.length===0?[]:u(w.toString(e,t).length===1),toTime:(e,t)=>{if(t.length===0)return[];let[{value:r}]=k(t,1);if(typeof r=="string"){let i=/^T?(\d{2}(:\d{2}(:\d{2})?)?)/.exec(r);if(i)return[{type:d.time,value:X("T"+i[1])}]}return[]},convertsToTime:(e,t)=>t.length===0?[]:u(w.toTime(e,t).length===1),indexOf:(e,t,r)=>E((i,n)=>i.indexOf(n),e,t,r),substring:(e,t,r,i)=>E((n,s,a)=>{let l=s,f=a?l+a:n.length;return l<0||l>=n.length?void 0:n.substring(l,f)},e,t,r,i),startsWith:(e,t,r)=>E((i,n)=>i.startsWith(n),e,t,r),endsWith:(e,t,r)=>E((i,n)=>i.endsWith(n),e,t,r),contains:(e,t,r)=>E((i,n)=>i.includes(n),e,t,r),upper:(e,t)=>E(r=>r.toUpperCase(),e,t),lower:(e,t)=>E(r=>r.toLowerCase(),e,t),replace:(e,t,r,i)=>E((n,s,a)=>n.replaceAll(s,a),e,t,r,i),matches:(e,t,r)=>E((i,n)=>!!new RegExp(n).exec(i),e,t,r),replaceMatches:(e,t,r,i)=>E((n,s,a)=>n.replaceAll(new RegExp(s,"g"),a.replaceAll(/\$\{(\w+)\}/g,"$<$1>")),e,t,r,i),length:(e,t)=>E(r=>r.length,e,t),toChars:(e,t)=>E(r=>r?r.split(""):void 0,e,t),encode:D,decode:D,escape:D,unescape:D,trim:D,split:D,join:(e,t,r)=>{let i=r?.eval(e,M(e))[0]?.value??"";if(typeof i!="string")throw new TypeError("Separator must be a string.");return[{type:d.string,value:t.map(n=>n.value?.toString()??"").join(i)}]},abs:(e,t)=>R(Math.abs,e,t),ceiling:(e,t)=>R(Math.ceil,e,t),exp:(e,t)=>R(Math.exp,e,t),floor:(e,t)=>R(Math.floor,e,t),ln:(e,t)=>R(Math.log,e,t),log:(e,t,r)=>R((i,n)=>Math.log(i)/Math.log(n),e,t,r),power:(e,t,r)=>R(Math.pow,e,t,r),round:(e,t,...r)=>R((i,n=0)=>{if(typeof n!="number"||n<0)throw new Error("Invalid precision provided to round()");let s=Math.pow(10,n);return Math.round(i*s)/s},e,t,...r),sqrt:(e,t)=>R(Math.sqrt,e,t),truncate:(e,t)=>R(r=>Math.trunc(r),e,t),children:D,descendants:D,trace:(e,t,r)=>t,now:()=>[{type:d.dateTime,value:new Date().toISOString()}],timeOfDay:()=>[{type:d.time,value:new Date().toISOString().substring(11)}],today:()=>[{type:d.date,value:new Date().toISOString().substring(0,10)}],between:(e,t,r,i,n)=>{let s=w.toDateTime(e,r.eval(e,t));if(s.length===0)throw new Error("Invalid start date");let a=w.toDateTime(e,i.eval(e,t));if(a.length===0)throw new Error("Invalid end date");let l=n.eval(e,t)[0]?.value;if(l!=="years"&&l!=="months"&&l!=="days")throw new Error("Invalid units");let f=Gt(s[0].value,a[0].value);return[{type:d.Quantity,value:{value:f[l],unit:l}}]},is:(e,t,r)=>{let i="";return r instanceof te?i=r.name:r instanceof $e&&(i=r.left.name+"."+r.right.name),i?t.map(n=>({type:d.boolean,value:De(n,i)})):[]},not:(e,t)=>w.toBoolean(e,t).map(r=>({type:d.boolean,value:!r.value})),resolve:(e,t)=>t.map(r=>{let i=r.value,n;if(typeof i=="string")n=i;else if(typeof i=="object"){let s=i;if(s.resource)return $(s.resource);s.reference?n=s.reference:s.type&&s.identifier&&(n=`${s.type}?identifier=${s.identifier.system}|${s.identifier.value}`)}if(n?.includes("?")){let[s]=n.split("?");return{type:s,value:{resourceType:s}}}if(n?.includes("/")){let[s,a]=n.split("/");return{type:s,value:{resourceType:s,id:a}}}return{type:d.BackboneElement,value:void 0}}).filter(r=>!!r.value),as:(e,t)=>t,type:(e,t)=>t.map(({value:r})=>typeof r=="boolean"?{type:d.BackboneElement,value:{namespace:"System",name:"Boolean"}}:typeof r=="number"?{type:d.BackboneElement,value:{namespace:"System",name:"Integer"}}:ie(r)?{type:d.BackboneElement,value:{namespace:"FHIR",name:r.resourceType}}:{type:d.BackboneElement,value:null}),conformsTo:(e,t,r)=>{let i=r.eval(e,t)[0].value;if(!i.startsWith("http://hl7.org/fhir/StructureDefinition/"))throw new Error("Expected a StructureDefinition URL");let n=i.replace("http://hl7.org/fhir/StructureDefinition/","");return t.map(s=>({type:d.boolean,value:s.value?.resourceType===n}))},getResourceKey:(e,t)=>{let r=t[0].value;return r?.id?[{type:d.id,value:r.id}]:[]},getReferenceKey:(e,t,r)=>{let i=t[0].value;if(!i?.reference)return[];let n="";return r instanceof te&&(n=r.name),n&&!i.reference.startsWith(n+"/")?[]:[{type:d.id,value:Bt(i)}]},extension:(e,t,r)=>{let i=r.eval(e,t)[0].value,n=t?.[0]?.value;if(n){let s=Ft(n,i);if(s)return[{type:d.Extension,value:s}]}return[]}};function E(e,t,r,...i){if(r.length===0)return[];let[{value:n}]=k(r,1);if(typeof n!="string")throw new TypeError("String function cannot be called with non-string");let s=i.map(l=>l?.eval(t,r)[0]?.value),a=e(n,...s);return a===void 0?[]:Array.isArray(a)?a.map($):[$(a)]}function R(e,t,r,...i){if(r.length===0)return[];let[{value:n}]=k(r,1),s=T(n),a=s?n.value:n;if(typeof a!="number")throw new TypeError("Math function cannot be called with non-number");let l=e(a,...i.map(h=>h.eval(t,r)[0]?.value)),f=s?d.Quantity:r[0].type,x=s?{...n,value:l}:l;return[{type:f,value:x}]}function k(e,t){if(e.length!==t)throw new Error(`Expected ${t} arguments`);for(let r of e)if(r==null)throw new Error("Expected non-null argument");return e}function M(e){let t=e;for(;t.parent?.variables.$this;)t=t.parent;return[t.variables.$this]}var G=class{constructor(e){v(this,"value"),this.value=e}eval(){return[this.value]}toString(){let e=this.value.value;return typeof e=="string"?`'${e}'`:e.toString()}},te=class{constructor(e){v(this,"name"),this.name=e}eval(e,t){if(this.name==="$this")return t;let r=this.getVariable(e);if(r)return[r];if(this.name.startsWith("%"))throw new Error(`Undefined variable ${this.name}`);return t.flatMap(i=>this.evalValue(i)).filter(i=>i?.value!==void 0)}getVariable(e){let t=e.variables[this.name];if(t!==void 0)return t;if(e.parent)return this.getVariable(e.parent)}evalValue(e){let t=e.value;if(!(!t||typeof t!="object"))return ie(t,this.name)?e:Pt(e,this.name)}toString(){return this.name}},zt=class{eval(){return[]}toString(){return"{}"}},Jt=class extends mt{constructor(e,t,r){super(e,t),v(this,"impl"),this.impl=r}eval(e,t){return this.impl(this.child.eval(e,t))}toString(){return this.operator+this.child.toString()}},Kt=class extends z{constructor(e,t){super("as",e,t)}eval(e,t){return w.ofType(e,this.left.eval(e,t),this.right)}},C=class extends z{},A=class extends C{constructor(e,t,r,i){super(e,t,r),v(this,"impl"),this.impl=i}eval(e,t){let r=this.left.eval(e,t);if(r.length!==1)return[];let i=this.right.eval(e,t);if(i.length!==1)return[];let n=r[0].value,s=i[0].value,a=T(n)?n.value:n,l=T(s)?s.value:s,f=this.impl(a,l);return typeof f=="boolean"?u(f):T(n)?[{type:d.Quantity,value:{...n,value:f}}]:[$(f)]}},Yt=class extends z{constructor(e,t){super("&",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t),n=[...r,...i];return n.length>0&&n.every(s=>typeof s.value=="string")?[{type:d.string,value:n.map(s=>s.value).join("")}]:n}},Zt=class extends C{constructor(e,t){super("contains",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return u(r.some(n=>n.value===i[0].value))}},Xt=class extends C{constructor(e,t){super("in",e,t)}eval(e,t){let r=O(this.left.eval(e,t)),i=this.right.eval(e,t);return r?u(i.some(n=>re(r,n)[0].value)):[]}},$e=class extends z{constructor(e,t){super(".",e,t)}eval(e,t){return this.right.eval(e,this.left.eval(e,t))}toString(){return`${this.left.toString()}.${this.right.toString()}`}},er=class extends z{constructor(e,t){super("|",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return ke([...r,...i])}},tr=class extends C{constructor(e,t){super("=",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return Ot(r,i)}},rr=class extends C{constructor(e,t){super("!=",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return _t(r,i)}},ir=class extends C{constructor(e,t){super("~",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return Ie(r,i)}},nr=class extends C{constructor(e,t){super("!~",e,t)}eval(e,t){let r=this.left.eval(e,t),i=this.right.eval(e,t);return Nt(Ie(r,i))}},sr=class extends C{constructor(e,t){super("is",e,t)}eval(e,t){let r=this.left.eval(e,t);if(r.length!==1)return[];let i=this.right.name;return u(De(r[0],i))}},or=class extends C{constructor(e,t){super("and",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return r?.value===!0&&i?.value===!0?u(!0):r?.value===!1||i?.value===!1?u(!1):[]}},ar=class extends C{constructor(e,t){super("or",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return r?.value===!1&&i?.value===!1?u(!1):r?.value||i?.value?u(!0):[]}},cr=class extends C{constructor(e,t){super("xor",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return!r||!i?[]:u(r.value!==i.value)}},lr=class extends C{constructor(e,t){super("implies",e,t)}eval(e,t){let r=O(this.left.eval(e,t),"boolean"),i=O(this.right.eval(e,t),"boolean");return i?.value===!0||r?.value===!1?u(!0):!r||!i?[]:u(!1)}},ur=class{constructor(e,t){v(this,"name"),v(this,"args"),this.name=e,this.args=t}eval(e,t){let r=w[this.name];if(!r)throw new Error("Unrecognized function: "+this.name);return r(e,t,...this.args)}toString(){return`${this.name}(${this.args.map(e=>e.toString()).join(", ")})`}},dr=class{constructor(e,t){v(this,"left"),v(this,"expr"),this.left=e,this.expr=t}eval(e,t){let r=this.expr.eval(e,t);if(r.length!==1)return[];let i=r[0].value;if(typeof i!="number")throw new Error("Invalid indexer expression: should return integer}");let n=this.left.eval(e,t);return i in n?[n[i]]:[]}toString(){return`${this.left.toString()}[${this.expr.toString()}]`}};var Ue=["!=","!~","<=",">=","{}","->"];var y={FunctionCall:0,Dot:1,Indexer:2,UnaryAdd:3,UnarySubtract:3,Multiply:4,Divide:4,IntegerDivide:4,Modulo:4,Add:5,Subtract:5,Ampersand:5,Is:6,As:6,Union:7,GreaterThan:8,GreaterThanOrEquals:8,LessThan:8,LessThanOrEquals:8,Equals:9,Equivalent:9,NotEquals:9,NotEquivalent:9,In:10,Contains:10,And:11,Xor:12,Or:12,Implies:13,Arrow:100,Semicolon:200},hr={parse(e){let t=e.consumeAndParse();if(!e.match(")"))throw new Error("Parse error: expected `)` got `"+e.peek()?.value+"`");return t}},pr={parse(e,t){let r=e.consumeAndParse();if(!e.match("]"))throw new Error("Parse error: expected `]`");return new dr(t,r)},precedence:y.Indexer},mr={parse(e,t){if(!(t instanceof te))throw new Error("Unexpected parentheses");let r=[];for(;!e.match(")");)r.push(e.consumeAndParse()),e.match(",");return new ur(t.name,r)},precedence:y.FunctionCall};function fr(e){let t=e.split(" "),r=Number.parseFloat(t[0]),i=t[1];return i?.startsWith("'")&&i.endsWith("'")?i=i.substring(1,i.length-1):i="{"+i+"}",{value:r,unit:i}}function ye(){return new ft().registerPrefix("String",{parse:(e,t)=>new G({type:d.string,value:t.value})}).registerPrefix("DateTime",{parse:(e,t)=>new G({type:d.dateTime,value:X(t.value)})}).registerPrefix("Quantity",{parse:(e,t)=>new G({type:d.Quantity,value:fr(t.value)})}).registerPrefix("Number",{parse:(e,t)=>new G({type:t.value.includes(".")?d.decimal:d.integer,value:Number.parseFloat(t.value)})}).registerPrefix("true",{parse:()=>new G({type:d.boolean,value:!0})}).registerPrefix("false",{parse:()=>new G({type:d.boolean,value:!1})}).registerPrefix("Symbol",{parse:(e,t)=>new te(t.value)}).registerPrefix("{}",{parse:()=>new zt}).registerPrefix("(",hr).registerInfix("[",pr).registerInfix("(",mr).prefix("+",y.UnaryAdd,(e,t)=>new Jt("+",t,r=>r)).prefix("-",y.UnarySubtract,(e,t)=>new A("-",t,t,(r,i)=>-i)).infixLeft(".",y.Dot,(e,t,r)=>new $e(e,r)).infixLeft("/",y.Divide,(e,t,r)=>new A("/",e,r,(i,n)=>i/n)).infixLeft("*",y.Multiply,(e,t,r)=>new A("*",e,r,(i,n)=>i*n)).infixLeft("+",y.Add,(e,t,r)=>new A("+",e,r,(i,n)=>i+n)).infixLeft("-",y.Subtract,(e,t,r)=>new A("-",e,r,(i,n)=>i-n)).infixLeft("|",y.Union,(e,t,r)=>new er(e,r)).infixLeft("=",y.Equals,(e,t,r)=>new tr(e,r)).infixLeft("!=",y.NotEquals,(e,t,r)=>new rr(e,r)).infixLeft("~",y.Equivalent,(e,t,r)=>new ir(e,r)).infixLeft("!~",y.NotEquivalent,(e,t,r)=>new nr(e,r)).infixLeft("<",y.LessThan,(e,t,r)=>new A("<",e,r,(i,n)=>i<n)).infixLeft("<=",y.LessThanOrEquals,(e,t,r)=>new A("<=",e,r,(i,n)=>i<=n)).infixLeft(">",y.GreaterThan,(e,t,r)=>new A(">",e,r,(i,n)=>i>n)).infixLeft(">=",y.GreaterThanOrEquals,(e,t,r)=>new A(">=",e,r,(i,n)=>i>=n)).infixLeft("&",y.Ampersand,(e,t,r)=>new Yt(e,r)).infixLeft("and",y.And,(e,t,r)=>new or(e,r)).infixLeft("as",y.As,(e,t,r)=>new Kt(e,r)).infixLeft("contains",y.Contains,(e,t,r)=>new Zt(e,r)).infixLeft("div",y.Divide,(e,t,r)=>new A("div",e,r,(i,n)=>Math.trunc(i/n))).infixLeft("in",y.In,(e,t,r)=>new Xt(e,r)).infixLeft("is",y.Is,(e,t,r)=>new sr(e,r)).infixLeft("mod",y.Modulo,(e,t,r)=>new A("mod",e,r,(i,n)=>i%n)).infixLeft("or",y.Or,(e,t,r)=>new ar(e,r)).infixLeft("xor",y.Xor,(e,t,r)=>new cr(e,r)).infixLeft("implies",y.Implies,(e,t,r)=>new lr(e,r))}var Dr=ye();var p={EQUALS:"eq",NOT_EQUALS:"ne",GREATER_THAN:"gt",LESS_THAN:"lt",GREATER_THAN_OR_EQUALS:"ge",LESS_THAN_OR_EQUALS:"le",STARTS_AFTER:"sa",ENDS_BEFORE:"eb",APPROXIMATELY:"ap",CONTAINS:"contains",STARTS_WITH:"sw",EXACT:"exact",TEXT:"text",NOT:"not",ABOVE:"above",BELOW:"below",IN:"in",NOT_IN:"not-in",OF_TYPE:"of-type",MISSING:"missing",PRESENT:"present",IDENTIFIER:"identifier",ITERATE:"iterate"},Nr={contains:p.CONTAINS,exact:p.EXACT,above:p.ABOVE,below:p.BELOW,text:p.TEXT,not:p.NOT,in:p.IN,"not-in":p.NOT_IN,"of-type":p.OF_TYPE,missing:p.MISSING,identifier:p.IDENTIFIER,iterate:p.ITERATE},Or={eq:p.EQUALS,ne:p.NOT_EQUALS,lt:p.LESS_THAN,le:p.LESS_THAN_OR_EQUALS,gt:p.GREATER_THAN,ge:p.GREATER_THAN_OR_EQUALS,sa:p.STARTS_AFTER,eb:p.ENDS_BEFORE,ap:p.APPROXIMATELY,sw:p.STARTS_WITH};var _r=[p.MISSING,p.PRESENT];var Z={READ:"read",VREAD:"vread",UPDATE:"update",DELETE:"delete",HISTORY:"history",CREATE:"create",SEARCH:"search"},Lr=[Z.READ,Z.VREAD,Z.HISTORY,Z.SEARCH];var yr={CSS:"text/css",DICOM:"application/dicom",FAVICON:"image/vnd.microsoft.icon",FHIR_JSON:"application/fhir+json",FORM_URL_ENCODED:"application/x-www-form-urlencoded",HL7_V2:"x-application/hl7-v2+er7",HTML:"text/html",JAVASCRIPT:"text/javascript",JSON:"application/json",JSON_PATCH:"application/json-patch+json",JWT:"application/jwt",MULTIPART_FORM_DATA:"multipart/form-data",PNG:"image/png",SCIM_JSON:"application/scim+json",SVG:"image/svg+xml",TEXT:"text/plain",TYPESCRIPT:"text/typescript",PING:"x-application/ping",XML:"text/xml",CDA_XML:"application/cda+xml",OCTET_STREAM:"application/octet-stream"};var gr;gr=Symbol.toStringTag;var Mr={Event:typeof globalThis.Event<"u"?globalThis.Event:void 0,ErrorEvent:void 0,CloseEvent:void 0};var $r={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+Math.random()*4e3,minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1};var Ur=[WebSocket.CLOSING,WebSocket.CLOSED];var Br=yr.FHIR_JSON+", */*; q=0.1";var Gr=[...Ue,"->","<<",">>","=="];var Fr=ye().registerInfix("->",{precedence:y.Arrow}).registerInfix(";",{precedence:y.Semicolon});var jr=" ".repeat(2);var Wr=[...Ue,"eq","ne","co"];var qr={eq:p.EXACT,ne:p.NOT_EQUALS,co:p.CONTAINS,sw:p.STARTS_WITH,ew:void 0,gt:p.GREATER_THAN,lt:p.LESS_THAN,ge:p.GREATER_THAN_OR_EQUALS,le:p.LESS_THAN_OR_EQUALS,ap:p.APPROXIMATELY,sa:p.STARTS_AFTER,eb:p.ENDS_BEFORE,pr:p.PRESENT,po:void 0,ss:void 0,sb:void 0,in:p.IN,ni:p.NOT_IN,re:p.EQUALS,identifier:p.IDENTIFIER};var Hr=ye();var ve=["string","boolean","number"],ge={},Se=class{constructor(t){c(this,"config");c(this,"clients");let{region:r}=t;if(!r)throw new I(_("'region' must be defined as a string literal in config."));ge[r]||(ge[r]=new ne.SSMClient({region:r})),this.config=t,this.clients={ssm:ge[r]}}async fetchParameterStoreSecret(t){let i=(await this.clients.ssm.send(new ne.GetParameterCommand({Name:t,WithDecryption:!0}))).Parameter;if(!i)throw new I(me(`Key '${t}' not found. Make sure your key is correct and that it is defined in your Parameter Store.`));let n=i.Value;if(!n)throw new I(me(`Key '${t}' found but has no value. Make sure your key is correct and that it is defined in your Parameter Store.`));return n}async fetchExternalSecret(t){br(t);let{system:r,key:i,type:n}=t,s;if(r==="aws_ssm_parameter_store")s=await this.fetchParameterStoreSecret(i);else throw new I(_(`Unknown system '${r}' for ExternalSecret. Unable to fetch the secret for key '${i}'.`));return vr(i,s,n)}async normalizeInfraConfigArray(t){let r=t[0],i;if(typeof r!="object"&&r!==null||Be(r)){i=new Array(t.length);for(let n=0;n<t.length;n++){let s=t[n];if(typeof s!="object"){i[n]=s;continue}let a=await this.fetchExternalSecret(s);i[n]=a}}else{i=new Array(t.length);for(let n=0;n<t.length;n++)i[n]=await this.normalizeObjectInInfraConfig(t[n])}return i}async normalizeValueForKey(t,r){let i=t[r];typeof i!="object"?t[r]=i:Be(i)?t[r]=await this.fetchExternalSecret(i):Array.isArray(i)&&i.length?t[r]=await this.normalizeInfraConfigArray(i):typeof i=="object"&&(t[r]=await this.normalizeObjectInInfraConfig(i))}async normalizeObjectInInfraConfig(t){let r={...t};for(let i of Object.keys(r))await this.normalizeValueForKey(r,i);return r}async normalizeConfig(){return this.normalizeObjectInInfraConfig(this.config)}};function vr(e,t,r){let i=typeof t;if(!ve.includes(i))throw new I(_(`Invalid value found for type; expected either ${ve.join(", or")} but got ${i}`));if(i===r)return t;if(i==="string"&&r==="boolean"){let n=t.toLowerCase();if(n!=="true"&&n!=="false")throw new I(_(`Invalid value found for key '${e}'; expected boolean value but got '${t}'`));return n==="true"}else if(i==="string"&&r==="number"){let n=Number.parseInt(t,10);if(Number.isNaN(n))throw new I(_(`Invalid value found for key '${e}'; expected integer value but got '${t}'`));return n}else throw new I(_(`Invalid value found for type; expected ${r} value but got value of type ${i}`))}function Be(e){return typeof e=="object"&&typeof e.system=="string"&&typeof e.key=="string"&&typeof e.type=="string"}function Sr(e){return typeof e=="object"&&typeof e.system=="string"&&typeof e.key=="string"&&ve.includes(e.type)}function br(e){if(!Sr(e))throw new I(_("obj is not a valid `ExternalSecret`, must contain a valid `system`, `key`, and `type` prop."))}async function Ge(e){return new Se(e).normalizeConfig()}var H=require("aws-cdk-lib");var o=require("aws-cdk-lib"),Fe=require("aws-cdk-lib/aws-ecr"),P=require("aws-cdk-lib/aws-rds"),oe=require("aws-cdk-lib/aws-secretsmanager"),je=require("constructs"),se=ut(require("node:assert"),1);var F=require("aws-cdk-lib"),wr=[{name:"AWS-AWSManagedRulesCommonRuleSet",priority:10,statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesCommonRuleSet",excludedRules:[{name:"NoUserAgent_HEADER"},{name:"UserAgent_BadBots_HEADER"},{name:"SizeRestrictions_QUERYSTRING"},{name:"SizeRestrictions_Cookie_HEADER"},{name:"SizeRestrictions_BODY"},{name:"SizeRestrictions_URIPATH"},{name:"EC2MetaDataSSRF_BODY"},{name:"EC2MetaDataSSRF_COOKIE"},{name:"EC2MetaDataSSRF_URIPATH"},{name:"EC2MetaDataSSRF_QUERYARGUMENTS"},{name:"GenericLFI_QUERYARGUMENTS"},{name:"GenericLFI_URIPATH"},{name:"GenericLFI_BODY"},{name:"RestrictedExtensions_URIPATH"},{name:"RestrictedExtensions_QUERYARGUMENTS"},{name:"GenericRFI_QUERYARGUMENTS"},{name:"GenericRFI_BODY"},{name:"GenericRFI_URIPATH"},{name:"CrossSiteScripting_COOKIE"},{name:"CrossSiteScripting_QUERYARGUMENTS"},{name:"CrossSiteScripting_BODY"},{name:"CrossSiteScripting_URIPATH"}]}},overrideAction:{count:{}},visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWS-AWSManagedRulesCommonRuleSet"}},{name:"AWS-AWSManagedRulesAmazonIpReputationList",priority:20,statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesAmazonIpReputationList",excludedRules:[{name:"AWSManagedIPReputationList"},{name:"AWSManagedReconnaissanceList"}]}},overrideAction:{count:{}},visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWSManagedRulesAmazonIpReputationList"}},{name:"AWSManagedRulesSQLiRuleSet",priority:30,visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWSManagedRulesSQLiRuleSet"},overrideAction:{count:{}},statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesSQLiRuleSet",excludedRules:[{name:"SQLi_QUERYARGUMENTS"},{name:"SQLiExtendedPatterns_QUERYARGUMENTS"},{name:"SQLi_BODY"},{name:"SQLiExtendedPatterns_BODY"},{name:"SQLi_COOKIE"},{name:"SQLi_URIPATH"}]}}},{name:"AWSManagedRuleLinux",priority:40,visibilityConfig:{sampledRequestsEnabled:!0,cloudWatchMetricsEnabled:!0,metricName:"AWSManagedRuleLinux"},overrideAction:{count:{}},statement:{managedRuleGroupStatement:{vendorName:"AWS",name:"AWSManagedRulesLinuxRuleSet",excludedRules:[{name:"LFI_URIPATH"},{name:"LFI_QUERYSTRING"},{name:"LFI_COOKIE"}]}}}];function xr(e){let t=[...wr];if(e){let r={name:"IPAllowListRule",priority:50,action:{allow:{}},statement:{ipSetReferenceStatement:{arn:e}},visibilityConfig:{cloudWatchMetricsEnabled:!0,metricName:"IPAllowListRule",sampledRequestsEnabled:!0}};t.push(r)}return t}function U(e,t,r,i,n,s,a){let l=new F.aws_wafv2.CfnWebACL(e,t,{name:r,scope:i,defaultAction:n?{block:{}}:{allow:{}},rules:xr(n),visibilityConfig:{metricName:`${r}-Metric`,cloudWatchMetricsEnabled:!0,sampledRequestsEnabled:!1}});if(s){let f;a?f=new F.aws_logs.LogGroup(e,"WAFLogs",{logGroupName:s}):f=F.aws_logs.LogGroup.fromLogGroupName(e,"WAFLogs",s),new F.aws_wafv2.CfnLoggingConfiguration(e,"WAFLoggingConfiguration",{resourceArn:l.attrArn,logDestinationConfigs:[f.logGroupArn]}).addDependency(l)}return l}var J=class extends je.Construct{constructor(r,i){super(r,"BackEnd");c(this,"vpc");c(this,"botLambdaRole");c(this,"rdsSecretsArn");c(this,"rdsCluster");c(this,"rdsProxy");c(this,"redisSubnetGroup");c(this,"redisSecurityGroup");c(this,"redisPassword");c(this,"redisCluster");c(this,"redisSecrets");c(this,"ecsCluster");c(this,"taskRolePolicies");c(this,"taskRole");c(this,"taskDefinition");c(this,"logGroup");c(this,"logDriver");c(this,"serviceContainer");c(this,"fargateSecurityGroup");c(this,"fargateService");c(this,"targetGroup");c(this,"loadBalancer");c(this,"waf");c(this,"wafAssociation");c(this,"dnsRecord");c(this,"regionParameter");c(this,"databaseSecretsParameter");c(this,"databaseProxyEndpointParameter");c(this,"redisSecretsParameter");c(this,"botLambdaRoleParameter");c(this,"rdsClusterParameterGroup");c(this,"rdsWriterParameterGroup");c(this,"rdsReaderParameterGroup");let n=i.name,s=i.accountNumber,a=i.region;if(i.vpcId)this.vpc=o.aws_ec2.Vpc.fromLookup(this,"VPC",{vpcId:i.vpcId});else{let h=new o.aws_logs.LogGroup(this,"VpcFlowLogs",{logGroupName:"/medplum/flowlogs/"+n,removalPolicy:o.RemovalPolicy.DESTROY});this.vpc=new o.aws_ec2.Vpc(this,"VPC",{maxAzs:i.maxAzs,flowLogs:{cloudwatch:{destination:o.aws_ec2.FlowLogDestination.toCloudWatchLogs(h),trafficType:o.aws_ec2.FlowLogTrafficType.ALL}}})}if(this.botLambdaRole=new o.aws_iam.Role(this,"BotLambdaRole",{assumedBy:new o.aws_iam.ServicePrincipal("lambda.amazonaws.com")}),this.rdsSecretsArn=i.rdsSecretsArn,!this.rdsSecretsArn){let{engine:h,majorVersion:b}=Er(i.rdsInstanceVersion,o.aws_rds.AuroraPostgresEngineVersion.VER_16_9),Y={statement_timeout:"60000",default_transaction_isolation:"REPEATABLE READ",...i.rdsClusterParameters};if(i.rdsPersistentParameterGroups){let L=`MedplumPG${b}`;this.rdsClusterParameterGroup=new P.ParameterGroup(this,`${L}ClusterParameterGroup`,{engine:h,parameters:Y,removalPolicy:o.RemovalPolicy.RETAIN}),this.rdsClusterParameterGroup.bindToCluster({}),this.rdsWriterParameterGroup=new P.ParameterGroup(this,`${L}WriterInstanceParameterGroup`,{engine:h,removalPolicy:o.RemovalPolicy.RETAIN}),this.rdsWriterParameterGroup.bindToInstance({}),this.rdsReaderParameterGroup=new P.ParameterGroup(this,`${L}ReaderInstanceParameterGroup`,{engine:h,removalPolicy:o.RemovalPolicy.RETAIN}),this.rdsReaderParameterGroup.bindToInstance({})}if(i.rdsIdsMajorVersionSuffix){if(!i.rdsPersistentParameterGroups||!this.rdsClusterParameterGroup||!this.rdsWriterParameterGroup||!this.rdsReaderParameterGroup)throw new Error("rdsPersistentParameterGroups must be true when rdsIdsMajorVersionSuffix is true");this.rdsClusterParameterGroup,this.rdsWriterParameterGroup,this.rdsReaderParameterGroup}let be={enablePerformanceInsights:!0,isFromLegacyInstanceProps:!0,caCertificate:o.aws_rds.CaCertificate.RDS_CA_RSA2048_G1},Ze=new P.ParameterGroup(this,"MedplumDatabaseClusterParams",{engine:h,parameters:Y}),we=i.rdsReaderInstanceType??i.rdsInstanceType,Xe={...be,instanceType:we?new o.aws_ec2.InstanceType(we):void 0,parameterGroup:i.rdsIdsMajorVersionSuffix?this.rdsReaderParameterGroup:void 0},ue=i.rdsInstanceType,et={...be,instanceType:ue?new o.aws_ec2.InstanceType(ue):void 0,parameterGroup:i.rdsIdsMajorVersionSuffix?this.rdsWriterParameterGroup:void 0},de;if(i.rdsInstances>1){de=[];for(let L=1;L<i.rdsInstances;L++)de.push(P.ClusterInstance.provisioned("Instance"+(L+1),Xe))}let tt={credentials:o.aws_rds.Credentials.fromGeneratedSecret("clusteradmin"),defaultDatabaseName:"medplum",storageEncrypted:!0,storageType:ue?.match(/^\w+d\w*\./i)?P.DBClusterStorageType.AURORA_IOPT1:P.DBClusterStorageType.AURORA,vpc:this.vpc,vpcSubnets:{subnetType:o.aws_ec2.SubnetType.PRIVATE_WITH_EGRESS},backup:{retention:o.Duration.days(7)},cloudwatchLogsExports:["postgresql"],instanceUpdateBehaviour:o.aws_rds.InstanceUpdateBehaviour.ROLLING,removalPolicy:o.RemovalPolicy.RETAIN,autoMinorVersionUpgrade:i.rdsAutoMinorVersionUpgrade},rt=Tr(i.rdsIdsMajorVersionSuffix?b:void 0);this.rdsCluster=new o.aws_rds.DatabaseCluster(this,rt,{...tt,engine:h,writer:P.ClusterInstance.provisioned("Instance1",et),readers:de,parameterGroup:this.rdsClusterParameterGroup??Ze});let B=this.rdsCluster.secret;(0,se.default)(B!==void 0,"rdsCluster.secret is undefined"),B.applyRemovalPolicy(o.RemovalPolicy.RETAIN),(0,se.default)(B instanceof oe.SecretTargetAttachment,"rdsCluster.secret is not a SecretTargetAttachment");let xe=B.node.scope;(0,se.default)(xe instanceof oe.Secret,"rdsCluster.secretAttachment.node.scope is not a Secret"),xe.applyRemovalPolicy(o.RemovalPolicy.RETAIN),this.rdsSecretsArn=B.secretArn,i.rdsProxyEnabled&&(this.rdsProxy=new o.aws_rds.DatabaseProxy(this,"DatabaseProxy",{proxyTarget:o.aws_rds.ProxyTarget.fromCluster(this.rdsCluster),secrets:[B],vpc:this.vpc}))}this.redisSubnetGroup=new o.aws_elasticache.CfnSubnetGroup(this,"RedisSubnetGroup",{description:"Redis Subnet Group",subnetIds:this.vpc.privateSubnets.map(h=>h.subnetId)}),i.cacheSecurityGroupId?this.redisSecurityGroup=o.aws_ec2.SecurityGroup.fromSecurityGroupId(this,"RedisSecurityGroup",i.cacheSecurityGroupId):this.redisSecurityGroup=new o.aws_ec2.SecurityGroup(this,"RedisSecurityGroup",{vpc:this.vpc,description:"Redis Security Group",allowAllOutbound:!1}),this.redisPassword=new o.aws_secretsmanager.Secret(this,"RedisPassword",{generateSecretString:{secretStringTemplate:"{}",generateStringKey:"password",excludeCharacters:"@%*()_+=`~{}|[]\\:\";'?,./"}}),this.redisCluster=new o.aws_elasticache.CfnReplicationGroup(this,"RedisCluster",{engine:"Redis",engineVersion:"6.x",cacheNodeType:i.cacheNodeType??"cache.t2.medium",replicationGroupDescription:"RedisReplicationGroup",authToken:this.redisPassword.secretValueFromJson("password").toString(),transitEncryptionEnabled:!0,atRestEncryptionEnabled:!0,multiAzEnabled:!0,cacheSubnetGroupName:this.redisSubnetGroup.ref,numNodeGroups:1,replicasPerNodeGroup:1,securityGroupIds:[this.redisSecurityGroup.securityGroupId]}),this.redisCluster.node.addDependency(this.redisPassword),this.redisSecrets=new o.aws_secretsmanager.Secret(this,"RedisSecrets",{generateSecretString:{secretStringTemplate:JSON.stringify({host:this.redisCluster.attrPrimaryEndPointAddress,port:this.redisCluster.attrPrimaryEndPointPort,password:this.redisPassword.secretValueFromJson("password").toString(),tls:{}}),generateStringKey:"unused"}}),this.redisSecrets.node.addDependency(this.redisPassword),this.redisSecrets.node.addDependency(this.redisCluster);let l={vpc:this.vpc};i.containerInsightsV2&&(l={...l,containerInsightsV2:i.containerInsightsV2}),this.ecsCluster=new o.aws_ecs.Cluster(this,"Cluster",l),this.taskRolePolicies=new o.aws_iam.PolicyDocument({statements:[new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["logs:PutLogEvents","logs:CreateLogGroup","logs:CreateLogStream","logs:DescribeLogStreams","logs:DescribeLogGroups","logs:PutRetentionPolicy"],resources:[`arn:aws:logs:${a}:${s}:log-group:*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["secretsmanager:GetResourcePolicy","secretsmanager:GetSecretValue","secretsmanager:DescribeSecret","secretsmanager:ListSecrets","secretsmanager:ListSecretVersionIds"],resources:[`arn:aws:secretsmanager:${a}:${s}:secret:*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["ssm:GetParametersByPath","ssm:GetParameters","ssm:GetParameter","ssm:DescribeParameters"],resources:[`arn:aws:ssm:${a}:${s}:parameter/medplum/${n}/*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["ses:SendEmail","ses:SendRawEmail"],resources:[`arn:aws:ses:${a}:${s}:identity/*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["s3:ListBucket"],resources:[`arn:aws:s3:::${i.storageBucketName}`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["s3:GetObject","s3:PutObject","s3:DeleteObject"],resources:[`arn:aws:s3:::${i.storageBucketName}/*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["iam:ListRoles","iam:GetRole","iam:PassRole"],resources:[this.botLambdaRole.roleArn]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["lambda:CreateFunction","lambda:GetFunction","lambda:GetFunctionConfiguration","lambda:UpdateFunctionCode","lambda:UpdateFunctionConfiguration","lambda:InvokeFunction"],resources:[`arn:aws:lambda:${a}:${s}:function:medplum-bot-lambda-*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["lambda:ListLayerVersions"],resources:[`arn:aws:lambda:${a}:${s}:layer:medplum-bot-layer`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["lambda:GetLayerVersion"],resources:[`arn:aws:lambda:${a}:${s}:layer:medplum-bot-layer:*`]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["xray:PutTraceSegments","xray:PutTelemetryRecords","xray:GetSamplingRules","xray:GetSamplingTargets","xray:GetSamplingStatisticSummaries"],resources:["*"]}),new o.aws_iam.PolicyStatement({effect:o.aws_iam.Effect.ALLOW,actions:["comprehend:DetectEntities","comprehend:DetectKeyPhrases","comprehend:DetectDominantLanguage","comprehend:DetectSentiment","comprehend:DetectTargetedSentiment","comprehend:DetectSyntax","comprehendmedical:DetectEntitiesV2","textract:DetectDocumentText","textract:AnalyzeDocument","textract:StartDocumentTextDetection","textract:GetDocumentTextDetection"],resources:["*"]})]}),this.taskRole=new o.aws_iam.Role(this,"TaskExecutionRole",{assumedBy:new o.aws_iam.ServicePrincipal("ecs-tasks.amazonaws.com"),description:"Medplum Server Task Execution Role",inlinePolicies:{TaskExecutionPolicies:this.taskRolePolicies}}),this.taskDefinition=new o.aws_ecs.FargateTaskDefinition(this,"TaskDefinition",{memoryLimitMiB:i.serverMemory,cpu:i.serverCpu,taskRole:this.taskRole}),i.fireLens?.enabled?this.logDriver=new o.aws_ecs.FireLensLogDriver({options:{...i.fireLens.logDriverConfig?.options}}):(this.logGroup=new o.aws_logs.LogGroup(this,"LogGroup",{logGroupName:"/ecs/medplum/"+n,removalPolicy:o.RemovalPolicy.DESTROY}),this.logDriver=new o.aws_ecs.AwsLogDriver({logGroup:this.logGroup,streamPrefix:"Medplum"}));let f;i.containerRegistryCredentialsSecretArn&&(f=o.aws_secretsmanager.Secret.fromSecretCompleteArn(this,"RegistryCredentialsSecret",i.containerRegistryCredentialsSecretArn)),this.serviceContainer=this.taskDefinition.addContainer("MedplumTaskDefinition",{image:this.getContainerImage(i,i.serverImage,f),command:[a==="us-east-1"?`aws:/medplum/${n}/`:`aws:${a}:/medplum/${n}/`],logging:this.logDriver,environment:i.environment}),this.serviceContainer.addPortMappings({containerPort:i.apiPort,hostPort:i.apiPort});for(let h of i.additionalContainers??Me)this.taskDefinition.addContainer("AdditionalContainer-"+h.name,{containerName:h.name,image:this.getContainerImage(i,h.image,f),command:h.command,environment:h.environment,logging:this.logDriver,essential:h.essential??!1});i.fireLens?.enabled&&this.taskDefinition.addFirelensLogRouter("FireLensRouter",{image:o.aws_ecs.ContainerImage.fromRegistry("public.ecr.aws/aws-observability/aws-for-fluent-bit:stable"),essential:!0,firelensConfig:i.fireLens.logRouterConfig,environment:i.fireLens.environment}),this.fargateSecurityGroup=new o.aws_ec2.SecurityGroup(this,"ServiceSecurityGroup",{allowAllOutbound:!0,securityGroupName:"MedplumSecurityGroup",vpc:this.vpc}),this.fargateService=new o.aws_ecs.FargateService(this,"FargateService",{cluster:this.ecsCluster,taskDefinition:this.taskDefinition,assignPublicIp:!1,vpcSubnets:{subnetType:o.aws_ec2.SubnetType.PRIVATE_WITH_EGRESS},desiredCount:i.desiredServerCount,securityGroups:[this.fargateSecurityGroup],healthCheckGracePeriod:o.Duration.minutes(5),minHealthyPercent:50}),i.fargateAutoScaling&&this.fargateService.autoScaleTaskCount({minCapacity:i.fargateAutoScaling.minCapacity,maxCapacity:i.fargateAutoScaling.maxCapacity}).scaleOnCpuUtilization("CpuScaling",{targetUtilizationPercent:i.fargateAutoScaling.targetUtilizationPercent,scaleInCooldown:o.Duration.seconds(i.fargateAutoScaling.scaleInCooldown),scaleOutCooldown:o.Duration.seconds(i.fargateAutoScaling.scaleOutCooldown)}),this.rdsCluster&&this.fargateService.node.addDependency(this.rdsCluster),this.rdsProxy&&this.fargateService.node.addDependency(this.rdsProxy),this.fargateService.node.addDependency(this.redisCluster),this.targetGroup=new o.aws_elasticloadbalancingv2.ApplicationTargetGroup(this,"TargetGroup",{vpc:this.vpc,port:i.apiPort,protocol:o.aws_elasticloadbalancingv2.ApplicationProtocol.HTTP,healthCheck:{path:"/healthcheck",interval:o.Duration.seconds(30),timeout:o.Duration.seconds(3),healthyThresholdCount:2,unhealthyThresholdCount:5},targets:[this.fargateService]});let x;if(i.loadBalancerSecurityGroupId&&(x=o.aws_ec2.SecurityGroup.fromSecurityGroupId(this,"LoadBalancerSecurityGroup",i.loadBalancerSecurityGroupId)),this.loadBalancer=new o.aws_elasticloadbalancingv2.ApplicationLoadBalancer(this,"LoadBalancer",{vpc:this.vpc,internetFacing:i.apiInternetFacing!==!1,http2Enabled:!0,securityGroup:x}),i.loadBalancerLoggingBucket&&this.loadBalancer.logAccessLogs(o.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.loadBalancerLoggingBucket),i.loadBalancerLoggingPrefix),this.loadBalancer.addListener("HttpsListener",{port:443,certificates:[{certificateArn:i.apiSslCertArn}],sslPolicy:o.aws_elasticloadbalancingv2.SslPolicy.RECOMMENDED_TLS,defaultAction:o.aws_elasticloadbalancingv2.ListenerAction.forward([this.targetGroup])}),this.waf=U(this,"BackEndWAF",`${i.stackName}-BackEndWAF`,"REGIONAL",i.apiWafIpSetArn,i.wafLogGroupName,i.wafLogGroupCreate),this.wafAssociation=new o.aws_wafv2.CfnWebACLAssociation(this,"LoadBalancerAssociation",{resourceArn:this.loadBalancer.loadBalancerArn,webAclArn:this.waf.attrArn}),this.rdsCluster&&(this.rdsCluster.connections.allowDefaultPortFrom(this.fargateSecurityGroup),this.rdsCluster.connections.securityGroups.forEach(h=>{h.applyRemovalPolicy(o.RemovalPolicy.RETAIN),h.node.children.forEach(b=>{(b instanceof o.aws_ec2.CfnSecurityGroupIngress||b instanceof o.aws_ec2.CfnSecurityGroupEgress)&&b.applyRemovalPolicy(o.RemovalPolicy.RETAIN)})})),this.rdsProxy&&this.rdsProxy.connections.allowFrom(this.fargateSecurityGroup,o.aws_ec2.Port.tcp(5432)),this.redisSecurityGroup.addIngressRule(this.fargateSecurityGroup,o.aws_ec2.Port.tcp(6379)),!i.skipDns){let h=i.hostedZoneName??i.domainName.split(".").slice(-2).join("."),b=o.aws_route53.HostedZone.fromLookup(this,"Zone",{domainName:h});this.dnsRecord=new o.aws_route53.ARecord(this,"LoadBalancerAliasRecord",{recordName:i.apiDomainName,target:o.aws_route53.RecordTarget.fromAlias(new o.aws_route53_targets.LoadBalancerTarget(this.loadBalancer)),zone:b})}this.regionParameter=new o.aws_ssm.StringParameter(this,"RegionParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/awsRegion`,description:"AWS region",stringValue:i.region}),this.databaseSecretsParameter=new o.aws_ssm.StringParameter(this,"DatabaseSecretsParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/DatabaseSecrets`,description:"Database secrets ARN",stringValue:this.rdsSecretsArn}),this.rdsProxy&&(this.databaseProxyEndpointParameter=new o.aws_ssm.StringParameter(this,"DatabaseProxyEndpointParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/databaseProxyEndpoint`,description:"Database proxy endpoint",stringValue:this.rdsProxy?.endpoint})),this.redisSecretsParameter=new o.aws_ssm.StringParameter(this,"RedisSecretsParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/RedisSecrets`,description:"Redis secrets ARN",stringValue:this.redisSecrets.secretArn}),this.botLambdaRoleParameter=new o.aws_ssm.StringParameter(this,"BotLambdaRoleParameter",{tier:o.aws_ssm.ParameterTier.STANDARD,parameterName:`/medplum/${n}/botLambdaRoleArn`,description:"Bot lambda execution role ARN",stringValue:this.botLambdaRole.roleArn})}getContainerImage(r,i,n){let a=new RegExp(`^${r.accountNumber}\\.dkr\\.ecr\\.${r.region}\\.amazonaws\\.com/(.*)[:@](.*)$`).exec(i),l=a?.[1],f=a?.[2];if(l&&f){let x=Fe.Repository.fromRepositoryArn(this,"ServerImageRepo",`arn:aws:ecr:${r.region}:${r.accountNumber}:repository/${l}`);return o.aws_ecs.ContainerImage.fromEcrRepository(x,f)}return o.aws_ecs.ContainerImage.fromRegistry(i,{credentials:n})}};function Er(e,t){if(!e){if(t)return{engine:o.aws_rds.DatabaseClusterEngine.auroraPostgres({version:t}),majorVersion:t.auroraPostgresMajorVersion};throw new Error("Missing or empty RDS version: "+e)}let r=e.slice(0,e.indexOf("."));return{engine:o.aws_rds.DatabaseClusterEngine.auroraPostgres({version:o.aws_rds.AuroraPostgresEngineVersion.of(e,r,{s3Import:!0,s3Export:!0})}),majorVersion:r}}function Tr(e){return e?`DatabaseClusterPG${e}`:"DatabaseCluster"}var S=require("aws-cdk-lib"),We=require("constructs");var j=class extends We.Construct{constructor(r,i){super(r,"CloudTrailAlarms");c(this,"config");c(this,"logGroup");c(this,"cloudTrail");c(this,"alarmTopic");if(this.config=i,!i.cloudTrailAlarms)return;i.cloudTrailAlarms.logGroupCreate?(this.logGroup=new S.aws_logs.LogGroup(this,"CloudTrailLogGroup",{logGroupName:i.cloudTrailAlarms.logGroupName,retention:S.aws_logs.RetentionDays.ONE_YEAR}),this.cloudTrail=new S.aws_cloudtrail.Trail(this,"CloudTrail",{sendToCloudWatchLogs:!0,cloudWatchLogGroup:this.logGroup,includeGlobalServiceEvents:!0})):this.logGroup=S.aws_logs.LogGroup.fromLogGroupName(this,"CloudTrailLogGroup",i.cloudTrailAlarms.logGroupName),i.cloudTrailAlarms.snsTopicArn?this.alarmTopic=S.aws_sns.Topic.fromTopicArn(this,"AlarmTopic",i.cloudTrailAlarms.snsTopicArn):this.alarmTopic=new S.aws_sns.Topic(this,"AlarmTopic",{topicName:i.cloudTrailAlarms.snsTopicName});let n=[["UnauthorizedApiCalls","{ ($.errorCode = *UnauthorizedOperation) || ($.errorCode = AccessDenied*) }"],["SignInWithoutMfa","{ ($.eventName = ConsoleLogin) && ($.additionalEventData.MFAUsed != Yes) }"],["RootAccountUsage","{ $.userIdentity.type = Root && $.userIdentity.invokedBy NOT EXISTS && $.eventType != AwsServiceEvent }"],["IamPolicyChanges","{($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventName=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolicy)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=DeletePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersion)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.eventName=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGroupPolicy)||($.eventName=DetachGroupPolicy)}"],["CloudTrailConfigurationChanges","{ ($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }"],["SignInFailures",'{ ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }'],["DisabledCmks","{($.eventSource = kms.amazonaws.com) && (($.eventName=DisableKey)||($.eventName=ScheduleKeyDeletion)) }"],["S3PolicyChanges","{ ($.eventSource = s3.amazonaws.com) && (($.eventName = PutBucketAcl) || ($.eventName = PutBucketPolicy) || ($.eventName = PutBucketCors) || ($.eventName = PutBucketLifecycle) || ($.eventName = PutBucketReplication) || ($.eventName = DeleteBucketPolicy) || ($.eventName = DeleteBucketCors) || ($.eventName = DeleteBucketLifecycle) || ($.eventName = DeleteBucketReplication)) }"],["ConfigServiceChanges","{($.eventSource = config.amazonaws.com) && (($.eventName=StopConfigurationRecorder)||($.eventName=DeleteDeliveryChannel)||($.eventName=PutDeliveryChannel)||($.eventName=PutConfigurationRecorder))}"],["SecurityGroupChanges","{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup)}"],["NetworkAclChanges","{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }"],["NetworkGatewayChanges","{ ($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }"],["RouteTableChanges","{ ($.eventName = CreateRoute) || ($.eventName = CreateRouteTable) || ($.eventName = ReplaceRoute) || ($.eventName = ReplaceRouteTableAssociation) || ($.eventName = DeleteRouteTable) || ($.eventName = DeleteRoute) || ($.eventName = DisassociateRouteTable) }"],["VpcChanges","{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }"],["OrganizationsChanges","{ ($.eventSource = organizations.amazonaws.com) && (($.eventName = AcceptHandshake) || ($.eventName = AttachPolicy) || ($.eventName = CreateAccount) || ($.eventName = CreateOrganizationalUnit) || ($.eventName = CreatePolicy) || ($.eventName = DeclineHandshake) || ($.eventName = DeleteOrganization) || ($.eventName = DeleteOrganizationalUnit) || ($.eventName = DeletePolicy) || ($.eventName = DetachPolicy) || ($.eventName = DisablePolicyType) || ($.eventName = EnablePolicyType) || ($.eventName = InviteAccountToOrganization) || ($.eventName = LeaveOrganization) || ($.eventName = MoveAccount) || ($.eventName = RemoveAccountFromOrganization) || ($.eventName = UpdatePolicy) || ($.eventName = UpdateOrganizationalUnit)) }"]];for(let[s,a]of n)this.createMetricAlarm(s,a)}createMetricAlarm(r,i){let n=`${this.config.stackName}${r}MetricFilter`,s=`${this.config.stackName}${r}Metric`,a=`${this.config.stackName}Metrics`,l=`${this.config.stackName}${r}Alarm`,f=new S.aws_logs.MetricFilter(this,n,{logGroup:this.logGroup,filterPattern:{logPatternString:i},metricNamespace:a,metricName:s});new S.aws_cloudwatch.Alarm(this,l,{metric:f.metric({}),threshold:1,evaluationPeriods:1,alarmName:l,actionsEnabled:!0,treatMissingData:S.aws_cloudwatch.TreatMissingData.NOT_BREACHING,comparisonOperator:S.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,datapointsToAlarm:1}).addAlarmAction(new S.aws_cloudwatch_actions.SnsAction(this.alarmTopic))}};var m=require("aws-cdk-lib"),He=require("constructs");var qe=require("aws-cdk-lib");function ae(e,t){let r=new qe.aws_iam.PolicyStatement;return r.addActions("s3:GetObject*"),r.addActions("s3:GetBucket*"),r.addActions("s3:List*"),r.addResources(e.bucketArn),r.addResources(`${e.bucketArn}/*`),r.addCanonicalUserPrincipal(t.cloudFrontOriginAccessIdentityS3CanonicalUserId),e.addToResourcePolicy(r),r}var W=class extends He.Construct{constructor(r,i,n){super(r,"FrontEnd");c(this,"appBucket");c(this,"responseHeadersPolicy");c(this,"waf");c(this,"apiOriginCachePolicy");c(this,"originAccessIdentity");c(this,"originAccessPolicyStatement");c(this,"distribution");c(this,"dnsRecord");if(n===i.region?this.appBucket=new m.aws_s3.Bucket(this,"AppBucket",{bucketName:i.appDomainName,publicReadAccess:!1,blockPublicAccess:m.aws_s3.BlockPublicAccess.BLOCK_ALL,removalPolicy:m.RemovalPolicy.DESTROY,encryption:m.aws_s3.BucketEncryption.S3_MANAGED,enforceSSL:!0,versioned:!0}):this.appBucket=m.aws_s3.Bucket.fromBucketAttributes(this,"AppBucket",{bucketName:i.appDomainName,region:i.region}),n==="us-east-1"&&(this.responseHeadersPolicy=new m.aws_cloudfront.ResponseHeadersPolicy(this,"ResponseHeadersPolicy",{customHeadersBehavior:{customHeaders:[{header:"Permissions-Policy",value:"accelerometer=(), camera=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=(), interest-cohort=()",override:!0}]},securityHeadersBehavior:{contentSecurityPolicy:{contentSecurityPolicy:["default-src 'none'","base-uri 'self'","child-src 'self'",`connect-src 'self' ${i.apiDomainName} *.medplum.com *.google.com`,"font-src 'self' fonts.gstatic.com","form-action 'self' *.gstatic.com *.google.com","frame-ancestors 'none'",`frame-src 'self' ${i.storageDomainName} *.medplum.com *.gstatic.com *.google.com`,`img-src 'self' data: ${i.storageDomainName} *.gstatic.com *.google.com *.googleapis.com`,"manifest-src 'self'",`media-src 'self' ${i.storageDomainName}`,"script-src 'self' *.medplum.com *.gstatic.com *.google.com","style-src 'self' 'unsafe-inline' *.medplum.com *.gstatic.com *.google.com","worker-src 'self' blob: *.gstatic.com *.google.com","upgrade-insecure-requests"].join("; "),override:!0},contentTypeOptions:{override:!0},frameOptions:{frameOption:m.aws_cloudfront.HeadersFrameOption.DENY,override:!0},referrerPolicy:{referrerPolicy:m.aws_cloudfront.HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN,override:!0},strictTransportSecurity:{accessControlMaxAge:m.Duration.seconds(63072e3),includeSubdomains:!0,preload:!0,override:!0},xssProtection:{protection:!0,modeBlock:!0,override:!0}}}),this.waf=U(this,"FrontEndWAF",`${i.stackName}-FrontEndWAF`,"CLOUDFRONT",i.appWafIpSetArn,i.wafLogGroupName,i.wafLogGroupCreate),this.apiOriginCachePolicy=new m.aws_cloudfront.CachePolicy(this,"ApiOriginCachePolicy",{cachePolicyName:`${i.stackName}-ApiOriginCachePolicy`,cookieBehavior:m.aws_cloudfront.CacheCookieBehavior.all(),headerBehavior:m.aws_cloudfront.CacheHeaderBehavior.allowList("Authorization","Content-Encoding","Content-Type","If-None-Match","Origin","Referer","User-Agent","X-Medplum"),queryStringBehavior:m.aws_cloudfront.CacheQueryStringBehavior.all()}),this.originAccessIdentity=new m.aws_cloudfront.OriginAccessIdentity(this,"OriginAccessIdentity",{}),this.originAccessPolicyStatement=ae(this.appBucket,this.originAccessIdentity),this.distribution=new m.aws_cloudfront.Distribution(this,"AppDistribution",{defaultRootObject:"index.html",defaultBehavior:{origin:m.aws_cloudfront_origins.S3BucketOrigin.withOriginAccessIdentity(this.appBucket,{originAccessIdentity:this.originAccessIdentity}),responseHeadersPolicy:this.responseHeadersPolicy,viewerProtocolPolicy:m.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS},additionalBehaviors:i.appApiProxy?{"/api/*":{origin:new m.aws_cloudfront_origins.HttpOrigin(i.apiDomainName),allowedMethods:m.aws_cloudfront.AllowedMethods.ALLOW_ALL,cachePolicy:this.apiOriginCachePolicy,viewerProtocolPolicy:m.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS}}:void 0,certificate:m.aws_certificatemanager.Certificate.fromCertificateArn(this,"AppCertificate",i.appSslCertArn),domainNames:[i.appDomainName],errorResponses:[{httpStatus:403,responseHttpStatus:200,responsePagePath:"/index.html"},{httpStatus:404,responseHttpStatus:200,responsePagePath:"/index.html"}],webAclId:this.waf.attrArn,logBucket:i.appLoggingBucket?m.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.appLoggingBucket):void 0,logFilePrefix:i.appLoggingPrefix}),!i.skipDns)){let s=i.hostedZoneName??i.domainName.split(".").slice(-2).join("."),a=m.aws_route53.HostedZone.fromLookup(this,"Zone",{domainName:s});this.dnsRecord=new m.aws_route53.ARecord(this,"AppAliasRecord",{recordName:i.appDomainName,target:m.aws_route53.RecordTarget.fromAlias(new m.aws_route53_targets.CloudFrontTarget(this.distribution)),zone:a})}}};var g=require("aws-cdk-lib"),Ve=require("cdk-serverless-clamscan"),Qe=require("constructs");var q=class extends Qe.Construct{constructor(r,i,n){super(r,"Storage");c(this,"storageBucket");c(this,"keyGroup");c(this,"responseHeadersPolicy");c(this,"waf");c(this,"originAccessIdentity");c(this,"originAccessPolicyStatement");c(this,"distribution");c(this,"dnsRecord");if(n===i.region?(this.storageBucket=new g.aws_s3.Bucket(this,"StorageBucket",{bucketName:i.storageBucketName,publicReadAccess:!1,blockPublicAccess:g.aws_s3.BlockPublicAccess.BLOCK_ALL,encryption:g.aws_s3.BucketEncryption.S3_MANAGED,enforceSSL:!0,versioned:!0}),i.clamscanEnabled&&new Ve.ServerlessClamscan(this,"ServerlessClamscan",{defsBucketAccessLogsConfig:{logsBucket:g.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.clamscanLoggingBucket),logsPrefix:i.clamscanLoggingPrefix}}).addSourceBucket(this.storageBucket)):this.storageBucket=g.aws_s3.Bucket.fromBucketAttributes(this,"StorageBucket",{bucketName:i.storageBucketName,region:i.region}),n==="us-east-1"){let s;if(i.signingKeyId?s=g.aws_cloudfront.PublicKey.fromPublicKeyId(this,"StoragePublicKey",i.signingKeyId):s=new g.aws_cloudfront.PublicKey(this,"StoragePublicKey",{encodedKey:i.storagePublicKey}),this.keyGroup=new g.aws_cloudfront.KeyGroup(this,"StorageKeyGroup",{items:[s]}),this.responseHeadersPolicy=new g.aws_cloudfront.ResponseHeadersPolicy(this,"ResponseHeadersPolicy",{customHeadersBehavior:{customHeaders:[{header:"Permissions-Policy",value:"accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=(), interest-cohort=()",override:!0}]},corsBehavior:{accessControlAllowCredentials:!1,accessControlAllowOrigins:[i.appDomainName,"https://ccda.medplum.com"],accessControlAllowHeaders:["*"],accessControlAllowMethods:["GET","HEAD","OPTIONS"],accessControlMaxAge:g.Duration.seconds(600),originOverride:!1},securityHeadersBehavior:{contentSecurityPolicy:{contentSecurityPolicy:"default-src 'none'; connect-src https://ccda.medplum.com; base-uri 'none'; form-action 'none'; frame-ancestors *;",override:!0},contentTypeOptions:{override:!0},frameOptions:{frameOption:g.aws_cloudfront.HeadersFrameOption.DENY,override:!0},referrerPolicy:{referrerPolicy:g.aws_cloudfront.HeadersReferrerPolicy.NO_REFERRER,override:!0},strictTransportSecurity:{accessControlMaxAge:g.Duration.seconds(63072e3),includeSubdomains:!0,preload:!0,override:!0},xssProtection:{protection:!0,modeBlock:!0,override:!0}}}),this.waf=U(this,"StorageWAF",`${i.stackName}-StorageWAF`,"CLOUDFRONT",i.storageWafIpSetArn,i.wafLogGroupName,i.wafLogGroupCreate),this.originAccessIdentity=new g.aws_cloudfront.OriginAccessIdentity(this,"OriginAccessIdentity",{}),this.originAccessPolicyStatement=ae(this.storageBucket,this.originAccessIdentity),this.distribution=new g.aws_cloudfront.Distribution(this,"StorageDistribution",{defaultBehavior:{origin:g.aws_cloudfront_origins.S3BucketOrigin.withOriginAccessIdentity(this.storageBucket,{originAccessIdentity:this.originAccessIdentity}),responseHeadersPolicy:this.responseHeadersPolicy,viewerProtocolPolicy:g.aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,trustedKeyGroups:[this.keyGroup]},certificate:g.aws_certificatemanager.Certificate.fromCertificateArn(this,"StorageCertificate",i.storageSslCertArn),domainNames:[i.storageDomainName],webAclId:this.waf.attrArn,logBucket:i.storageLoggingBucket?g.aws_s3.Bucket.fromBucketName(this,"LoggingBucket",i.storageLoggingBucket):void 0,logFilePrefix:i.storageLoggingPrefix}),!i.skipDns){let a=i.hostedZoneName??i.domainName.split(".").slice(-2).join("."),l=g.aws_route53.HostedZone.fromLookup(this,"Zone",{domainName:a});this.dnsRecord=new g.aws_route53.ARecord(this,"StorageAliasRecord",{recordName:i.storageDomainName,target:g.aws_route53.RecordTarget.fromAlias(new g.aws_route53_targets.CloudFrontTarget(this.distribution)),zone:l})}}}};var K=class{constructor(t,r){c(this,"primaryStack");c(this,"globalStack");this.primaryStack=new ce(t,r),r.region!=="us-east-1"&&(this.globalStack=new le(t,r),this.globalStack.addDependency(this.primaryStack))}},ce=class extends H.Stack{constructor(r,i){super(r,i.stackName,{env:{region:i.region,account:i.accountNumber}});c(this,"backEnd");c(this,"frontEnd");c(this,"storage");c(this,"cloudTrail");H.Tags.of(this).add("medplum:environment",i.name),this.backEnd=new J(this,i),this.frontEnd=new W(this,i,i.region),this.storage=new q(this,i,i.region),this.cloudTrail=new j(this,i)}},le=class extends H.Stack{constructor(r,i){super(r,i.stackName+"-us-east-1",{env:{region:"us-east-1",account:i.accountNumber}});c(this,"frontEnd");c(this,"storage");c(this,"cloudTrail");H.Tags.of(this).add("medplum:environment",i.name),this.frontEnd=new W(this,i,"us-east-1"),this.storage=new q(this,i,"us-east-1"),this.cloudTrail=new j(this,i)}};async function Ye(e){let t=new ze.App({context:e}),r=t.node.tryGetContext("config");if(!r){console.log('Missing "config" context variable'),console.log("Usage: cdk deploy -c config=my-config.json");return}let i=JSON.parse((0,Je.readFileSync)((0,Ke.resolve)(r),"utf-8")),n=await Ge(i),s=new K(t,n);console.log("Stack",s.primaryStack.stackId),t.synth()}Ye().catch(e=>{console.error(e),process.exit(1)});0&&(module.exports={BackEnd,CloudTrailAlarms,FrontEnd,MedplumGlobalStack,MedplumPrimaryStack,MedplumStack,Storage,buildWaf,main});
2
2
  /*!
3
3
  * Reconnecting WebSocket
4
4
  * by Pedro Ladaria <pedro.ladaria@gmail.com>