@trautonen/cdk-dns-validated-certificate 0.1.21 → 0.1.23
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.
package/.jsii
CHANGED
|
@@ -3465,7 +3465,7 @@
|
|
|
3465
3465
|
"stability": "stable"
|
|
3466
3466
|
},
|
|
3467
3467
|
"homepage": "https://github.com/trautonen/cdk-dns-validated-certificate.git",
|
|
3468
|
-
"jsiiVersion": "5.8.
|
|
3468
|
+
"jsiiVersion": "5.8.16 (build 1632665)",
|
|
3469
3469
|
"keywords": [
|
|
3470
3470
|
"aws",
|
|
3471
3471
|
"cdk",
|
|
@@ -3906,6 +3906,6 @@
|
|
|
3906
3906
|
"symbolId": "src/dns-validated-certificate:ValidationHostedZone"
|
|
3907
3907
|
}
|
|
3908
3908
|
},
|
|
3909
|
-
"version": "0.1.
|
|
3910
|
-
"fingerprint": "
|
|
3909
|
+
"version": "0.1.23",
|
|
3910
|
+
"fingerprint": "puH1OAqgbH1tiW9nIHIsSPXhxEbTnRFknpVRtp0A+WI="
|
|
3911
3911
|
}
|
|
@@ -151,7 +151,7 @@ var getRecordsForZoneNames = (records, zoneNames, result) => {
|
|
|
151
151
|
const unmatchingRecords = [];
|
|
152
152
|
for (const record of records) {
|
|
153
153
|
const normalizedRecordName = cleanDomainName(record.Name);
|
|
154
|
-
if (normalizedRecordName.endsWith(zoneName)) {
|
|
154
|
+
if (normalizedRecordName === zoneName || normalizedRecordName.endsWith("." + zoneName)) {
|
|
155
155
|
matchingRecords.push(record);
|
|
156
156
|
} else {
|
|
157
157
|
unmatchingRecords.push(record);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/certificate-requestor.lambda.ts", "../../src/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import * as crypto from 'crypto'\nimport {\n ACMClient,\n AddTagsToCertificateCommand,\n AddTagsToCertificateCommandInput,\n CertificateDetail,\n DeleteCertificateCommand,\n DeleteCertificateCommandInput,\n DescribeCertificateCommand,\n DescribeCertificateCommandInput,\n RequestCertificateCommand,\n RequestCertificateCommandInput,\n waitUntilCertificateValidated,\n} from '@aws-sdk/client-acm'\nimport {\n ChangeAction,\n ChangeResourceRecordSetsCommand,\n ChangeResourceRecordSetsCommandInput,\n InvalidChangeBatch,\n ResourceRecordSet,\n Route53Client,\n waitUntilResourceRecordSetsChanged,\n} from '@aws-sdk/client-route-53'\nimport { AssumeRoleCommand, AssumeRoleCommandInput, STSClient } from '@aws-sdk/client-sts'\nimport type { AwsCredentialIdentity, Provider } from '@aws-sdk/types'\nimport type { CloudFormationCustomResourceEvent } from 'aws-lambda'\nimport {\n cleanChangeId,\n cleanDomainName,\n containsSame,\n objectToString,\n orderBySignificance,\n stringToBoolean,\n tryFor,\n} from './utils'\n\nexport type ValidationHostedZoneProperties = {\n DomainName: string\n HostedZoneId: string\n ValidationRoleArn?: string\n ValidationExternalId?: string\n}\n\nexport type Properties = {\n DomainName: string\n AlternativeDomainNames?: string[]\n ValidationHostedZones: Record<string, ValidationHostedZoneProperties>\n CertificateRegion: string\n CleanupValidationRecords: string\n TransparencyLoggingEnabled: string\n Tags?: Record<string, string>\n RemovalPolicy: string\n}\n\ntype Route53Factory = (roleArn: string | undefined, externalId: string | undefined) => Route53Client\n\nconst parseProperties = (properties: Record<string, any>): Properties => {\n // maybe should actually parse and not just assume\n return properties as unknown as Properties\n}\n\nconst parseDomainValidationRecords = (certificate: CertificateDetail): ResourceRecordSet[] | null => {\n const options = certificate.DomainValidationOptions ?? []\n if (options.length > 0 && options.every((opt) => opt.ResourceRecord?.Name)) {\n const uniqueRecords = [...new Map(options.map((opt) => [opt.ResourceRecord?.Name!, opt.ResourceRecord!])).values()]\n return uniqueRecords.map((record) => {\n return {\n Name: record.Name,\n Type: record.Type,\n TTL: 30,\n ResourceRecords: [\n {\n Value: record.Value,\n },\n ],\n }\n })\n }\n return null\n}\n\nconst changeRecordSets = async (\n route53: Route53Client,\n action: ChangeAction,\n records: ResourceRecordSet[],\n hostedZoneId: string\n): Promise<void> => {\n const changeRecordSetsInput: ChangeResourceRecordSetsCommandInput = {\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n Changes: records.map((record) => ({\n Action: action,\n ResourceRecordSet: record,\n })),\n },\n }\n try {\n const { ChangeInfo } = await route53.send(new ChangeResourceRecordSetsCommand(changeRecordSetsInput))\n const changeId = ChangeInfo?.Id!\n const result = await waitUntilResourceRecordSetsChanged({ client: route53, maxWaitTime: 180 }, { Id: changeId })\n if (result.state !== 'SUCCESS') {\n throw new Error(\n `Validation records never changed for hosted zone ${hostedZoneId}: [${result.state}] ${result.reason ?? ''}`\n )\n }\n const operation = action === 'CREATE' || action === 'UPSERT' ? 'changed' : 'deleted'\n const change = cleanChangeId(changeId)\n console.log(`Validation records succesfully ${operation} for hosted zone ${hostedZoneId} with change id ${change}`)\n } catch (error: unknown) {\n if (action === 'DELETE' && error instanceof InvalidChangeBatch && error.message.includes('not found')) {\n // there's a deletion race condition where some other certificate has already deleted the records\n console.log(`All validation records have already been removed by some other certificate`)\n } else {\n throw error\n }\n }\n}\n\nconst getRecordsForZoneNames = (\n records: ResourceRecordSet[],\n zoneNames: string[],\n result?: Record<string, ResourceRecordSet[]>\n): Record<string, ResourceRecordSet[]> => {\n const [zoneName, ...restZoneNames] = zoneNames\n if (!zoneName) {\n return result ?? {}\n }\n const matchingRecords: ResourceRecordSet[] = []\n const unmatchingRecords: ResourceRecordSet[] = []\n for (const record of records) {\n const normalizedRecordName = cleanDomainName(record.Name!)\n if (normalizedRecordName.endsWith(zoneName)) {\n matchingRecords.push(record)\n } else {\n unmatchingRecords.push(record)\n }\n }\n return getRecordsForZoneNames(unmatchingRecords, restZoneNames, {\n ...(result ?? {}),\n [zoneName]: matchingRecords,\n })\n}\n\nconst requestCertificate = async (\n acm: ACMClient,\n route53: Route53Factory,\n requestId: string,\n properties: Properties\n): Promise<string> => {\n const { DomainName, AlternativeDomainNames, TransparencyLoggingEnabled } = properties\n\n console.log(`Requesting certificate for ${DomainName}`)\n\n const requestCertificateInput: RequestCertificateCommandInput = {\n DomainName,\n SubjectAlternativeNames: AlternativeDomainNames,\n IdempotencyToken: crypto.createHash('sha256').update(requestId).digest('hex').slice(0, 32),\n ValidationMethod: 'DNS',\n Options: {\n CertificateTransparencyLoggingPreference: TransparencyLoggingEnabled ? 'ENABLED' : 'DISABLED',\n },\n }\n const { CertificateArn } = await acm.send(new RequestCertificateCommand(requestCertificateInput))\n\n console.log(`Certificate ${CertificateArn} requested`)\n\n const validationMaxSeconds = 180\n const validationTimeoutError = `Domain validation options were not found in ${validationMaxSeconds} seconds`\n const validationRecords = await tryFor(validationMaxSeconds, validationTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n return parseDomainValidationRecords(Certificate!)\n })\n\n const hostedZones = Object.values(properties.ValidationHostedZones)\n const hostedZoneIds = hostedZones.map((zone) => zone.HostedZoneId)\n\n console.log(\n `Upserting ${validationRecords.length} validation record(s) into hosted zone(s) ${hostedZoneIds.join(', ')}:`\n )\n validationRecords.forEach((record) =>\n console.log(`${record.Name} ${record.Type} ${record.ResourceRecords?.map((rr) => rr.Value).join(',')}`)\n )\n\n const recordsForZoneNames = getRecordsForZoneNames(\n validationRecords,\n orderBySignificance(Object.keys(properties.ValidationHostedZones))\n )\n for (const hostedZone of hostedZones) {\n const records = recordsForZoneNames[hostedZone.DomainName]\n if (records.length > 0) {\n await changeRecordSets(\n route53(hostedZone.ValidationRoleArn, hostedZone.ValidationExternalId),\n 'UPSERT',\n records,\n hostedZone.HostedZoneId\n )\n }\n }\n\n console.log(`Waiting for certificate ${CertificateArn} to validate`)\n const result = await waitUntilCertificateValidated({ client: acm, maxWaitTime: 300 }, { CertificateArn })\n if (result.state !== 'SUCCESS') {\n throw new Error(`Certificate failed ${CertificateArn} to validate: [${result.state}] ${result.reason ?? ''}`)\n }\n console.log(`Certificate ${CertificateArn} successfully validated`)\n return CertificateArn!\n}\n\nconst deleteCertificate = async (\n acm: ACMClient,\n route53: Route53Factory,\n certificateArn: string,\n properties: Properties\n): Promise<void> => {\n console.log(`Waiting for certificate ${certificateArn} usage to drain before deletion`)\n\n const waitUsageMaxSeconds = 600\n const waitUsageTimeoutError = `Certificate was still in use after ${waitUsageMaxSeconds} seconds`\n const certificate = await tryFor(waitUsageMaxSeconds, waitUsageTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n const inUseBy = Certificate?.InUseBy ?? []\n if (inUseBy.length > 0) {\n return null\n }\n return Certificate!\n })\n console.log('Certificate is unused and will be deleted')\n\n const validationRecords = parseDomainValidationRecords(certificate)\n if (validationRecords && stringToBoolean(properties.CleanupValidationRecords)) {\n const hostedZones = Object.values(properties.ValidationHostedZones)\n const hostedZoneIds = hostedZones.map((zone) => zone.HostedZoneId)\n\n console.log(\n `Deleting ${validationRecords.length} validation record(s) from hosted zone(s) ${hostedZoneIds.join(', ')}`\n )\n\n const recordsForZoneNames = getRecordsForZoneNames(\n validationRecords,\n orderBySignificance(Object.keys(properties.ValidationHostedZones))\n )\n for (const hostedZone of hostedZones) {\n const records = recordsForZoneNames[hostedZone.DomainName]\n if (records.length > 0) {\n await changeRecordSets(\n route53(hostedZone.ValidationRoleArn, hostedZone.ValidationExternalId),\n 'DELETE',\n records,\n hostedZone.HostedZoneId\n )\n }\n }\n }\n\n console.log(`Deleting certificate ${certificateArn} from ACM`)\n const deleteCertificateInput: DeleteCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n await acm.send(new DeleteCertificateCommand(deleteCertificateInput))\n console.log(`Certificate ${certificateArn} successfully deleted`)\n}\n\nconst addTags = async (acm: ACMClient, certificateArn: string, tags: Record<string, string>) => {\n const tagList = Array.from(Object.entries(tags).map(([Key, Value]) => ({ Key, Value })))\n const addTagsInput: AddTagsToCertificateCommandInput = {\n CertificateArn: certificateArn,\n Tags: tagList,\n }\n\n console.log(`Adding ${tagList.length} tags to certificate ${certificateArn}`)\n await acm.send(new AddTagsToCertificateCommand(addTagsInput))\n console.log(`All tags successfully added to certificate ${certificateArn}`)\n}\n\nconst shouldRequestNew = (oldProperties: Properties, newProperties: Properties): boolean => {\n const oldHostedZoneIds = Object.values(oldProperties.ValidationHostedZones ?? {}).map((zone) => zone.HostedZoneId)\n const newHostedZoneIds = Object.values(newProperties.ValidationHostedZones ?? {}).map((zone) => zone.HostedZoneId)\n if (!containsSame(oldHostedZoneIds, newHostedZoneIds)) return true\n if (oldProperties.DomainName !== newProperties.DomainName) return true\n if (!containsSame(oldProperties.AlternativeDomainNames ?? [], newProperties.AlternativeDomainNames ?? [])) return true\n if (oldProperties.CertificateRegion !== newProperties.CertificateRegion) return true\n if (oldProperties.CleanupValidationRecords !== newProperties.CleanupValidationRecords) return true\n if (oldProperties.TransparencyLoggingEnabled !== newProperties.TransparencyLoggingEnabled) return true\n if (oldProperties.RemovalPolicy !== newProperties.RemovalPolicy) return true\n return false\n}\n\nconst assumeRole = (\n roleArn: string | undefined,\n externalId: string | undefined\n): Provider<AwsCredentialIdentity> | undefined => {\n if (!roleArn) {\n return undefined\n }\n return async () => {\n const sts = new STSClient({ retryMode: 'adaptive' })\n const assumeRoleInput: AssumeRoleCommandInput = {\n RoleArn: roleArn,\n RoleSessionName: 'CertificateRequestor',\n ExternalId: externalId,\n }\n const { Credentials } = await sts.send(new AssumeRoleCommand(assumeRoleInput))\n return {\n accessKeyId: Credentials?.AccessKeyId!,\n secretAccessKey: Credentials?.SecretAccessKey!,\n sessionToken: Credentials?.SessionToken!,\n expiration: Credentials?.Expiration,\n }\n }\n}\n\nexport const handler = async (event: CloudFormationCustomResourceEvent) => {\n const properties = parseProperties(event.ResourceProperties)\n\n const acm = new ACMClient({ region: properties.CertificateRegion, retryMode: 'adaptive' })\n const route53 = (roleArn: string | undefined, externalId: string | undefined): Route53Client => {\n return new Route53Client({\n retryMode: 'adaptive',\n credentials: assumeRole(roleArn, externalId),\n })\n }\n\n switch (event.RequestType) {\n case 'Create': {\n console.log(`Requesting new certificate:\\n${objectToString(properties)}`)\n const certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Update': {\n let certificateArn = event.PhysicalResourceId\n if (shouldRequestNew(parseProperties(event.OldResourceProperties), properties)) {\n console.log(`Requesting new certificate due to change of properties:\\n${objectToString(properties)}`)\n certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n }\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Delete': {\n const certificateArn = event.PhysicalResourceId\n if (properties.RemovalPolicy === 'destroy') {\n console.log(`Deleting old certificate as per removal policy:\\n${objectToString(properties)}`)\n await deleteCertificate(acm, route53, certificateArn, properties)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n }\n throw new Error(`Invalid request type`)\n}\n", "export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const booleanToString = (value: boolean): string => {\n return value ? 'true' : 'false'\n}\n\nexport const stringToBoolean = (value: string): boolean => {\n return value === 'true' ? true : false\n}\n\nexport const objectToString = (value: object): string => {\n return JSON.stringify(value, undefined, 2)\n}\n\nexport const containsSame = <T>(array1: T[], array2: T[]): boolean => {\n if (array1.length !== array2.length) return false\n return array1.every((v1) => array2.includes(v1))\n}\n\nexport const orderBySignificance = (domains: string[]): string[] => {\n const copy = [...domains]\n copy.sort((a, b) => {\n const ac = cleanDomainName(a).split('.').length\n const bc = cleanDomainName(b).split('.').length\n if (ac > bc) {\n return -1\n }\n if (ac < bc) {\n return 1\n }\n return 0\n })\n return copy\n}\n\nexport const cleanDomainName = (domainName: string): string => {\n if (domainName.endsWith('.')) {\n return domainName.slice(0, -1)\n }\n return domainName\n}\n\nexport const cleanHostedZoneId = (hostedZoneId: string): string => {\n return hostedZoneId.replace(/^\\/hostedzone\\//, '')\n}\n\nexport const cleanChangeId = (changeId: string): string => {\n return changeId.replace('/change/', '')\n}\n\nexport const matchNamesToZones = <T>(\n zoneNames: string[],\n records: T[],\n name: (record: T) => string\n): Record<string, T[]> => {\n const orderedZoneNames = orderBySignificance(zoneNames)\n const matcher = (zones: string[], items: T[], result: Record<string, T[]>): Record<string, T[]> => {\n const [firstZone, ...restZones] = zones\n if (!firstZone) {\n return result\n }\n const matchingItems: T[] = []\n const unmatchingItems: T[] = []\n for (const item of items) {\n const normalizedRecordName = cleanDomainName(name(item))\n if (normalizedRecordName.endsWith(cleanDomainName(firstZone))) {\n matchingItems.push(item)\n } else {\n unmatchingItems.push(item)\n }\n }\n return matcher(restZones, unmatchingItems, {\n ...result,\n [firstZone]: matchingItems,\n })\n }\n return matcher(orderedZoneNames, records, {})\n}\n\nexport const tryFor = async <T>(maxSeconds: number, timeoutError: string, fn: () => Promise<T | null>): Promise<T> => {\n const startTime = Date.now()\n // eslint-disable-next-line no-constant-condition\n for (let i = 0; true; i++) {\n if (Date.now() > startTime + maxSeconds * 1000) {\n throw new Error(timeoutError)\n }\n const result = await fn()\n if (result !== null) {\n return result\n }\n const base = Math.pow(2, i)\n await sleep(Math.random() * base * 50 + base * 150)\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import * as crypto from 'crypto'\nimport {\n ACMClient,\n AddTagsToCertificateCommand,\n AddTagsToCertificateCommandInput,\n CertificateDetail,\n DeleteCertificateCommand,\n DeleteCertificateCommandInput,\n DescribeCertificateCommand,\n DescribeCertificateCommandInput,\n RequestCertificateCommand,\n RequestCertificateCommandInput,\n waitUntilCertificateValidated,\n} from '@aws-sdk/client-acm'\nimport {\n ChangeAction,\n ChangeResourceRecordSetsCommand,\n ChangeResourceRecordSetsCommandInput,\n InvalidChangeBatch,\n ResourceRecordSet,\n Route53Client,\n waitUntilResourceRecordSetsChanged,\n} from '@aws-sdk/client-route-53'\nimport { AssumeRoleCommand, AssumeRoleCommandInput, STSClient } from '@aws-sdk/client-sts'\nimport type { AwsCredentialIdentity, Provider } from '@aws-sdk/types'\nimport type { CloudFormationCustomResourceEvent } from 'aws-lambda'\nimport {\n cleanChangeId,\n cleanDomainName,\n containsSame,\n objectToString,\n orderBySignificance,\n stringToBoolean,\n tryFor,\n} from './utils'\n\nexport type ValidationHostedZoneProperties = {\n DomainName: string\n HostedZoneId: string\n ValidationRoleArn?: string\n ValidationExternalId?: string\n}\n\nexport type Properties = {\n DomainName: string\n AlternativeDomainNames?: string[]\n ValidationHostedZones: Record<string, ValidationHostedZoneProperties>\n CertificateRegion: string\n CleanupValidationRecords: string\n TransparencyLoggingEnabled: string\n Tags?: Record<string, string>\n RemovalPolicy: string\n}\n\ntype Route53Factory = (roleArn: string | undefined, externalId: string | undefined) => Route53Client\n\nconst parseProperties = (properties: Record<string, any>): Properties => {\n // maybe should actually parse and not just assume\n return properties as unknown as Properties\n}\n\nconst parseDomainValidationRecords = (certificate: CertificateDetail): ResourceRecordSet[] | null => {\n const options = certificate.DomainValidationOptions ?? []\n if (options.length > 0 && options.every((opt) => opt.ResourceRecord?.Name)) {\n const uniqueRecords = [...new Map(options.map((opt) => [opt.ResourceRecord?.Name!, opt.ResourceRecord!])).values()]\n return uniqueRecords.map((record) => {\n return {\n Name: record.Name,\n Type: record.Type,\n TTL: 30,\n ResourceRecords: [\n {\n Value: record.Value,\n },\n ],\n }\n })\n }\n return null\n}\n\nconst changeRecordSets = async (\n route53: Route53Client,\n action: ChangeAction,\n records: ResourceRecordSet[],\n hostedZoneId: string\n): Promise<void> => {\n const changeRecordSetsInput: ChangeResourceRecordSetsCommandInput = {\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n Changes: records.map((record) => ({\n Action: action,\n ResourceRecordSet: record,\n })),\n },\n }\n try {\n const { ChangeInfo } = await route53.send(new ChangeResourceRecordSetsCommand(changeRecordSetsInput))\n const changeId = ChangeInfo?.Id!\n const result = await waitUntilResourceRecordSetsChanged({ client: route53, maxWaitTime: 180 }, { Id: changeId })\n if (result.state !== 'SUCCESS') {\n throw new Error(\n `Validation records never changed for hosted zone ${hostedZoneId}: [${result.state}] ${result.reason ?? ''}`\n )\n }\n const operation = action === 'CREATE' || action === 'UPSERT' ? 'changed' : 'deleted'\n const change = cleanChangeId(changeId)\n console.log(`Validation records succesfully ${operation} for hosted zone ${hostedZoneId} with change id ${change}`)\n } catch (error: unknown) {\n if (action === 'DELETE' && error instanceof InvalidChangeBatch && error.message.includes('not found')) {\n // there's a deletion race condition where some other certificate has already deleted the records\n console.log(`All validation records have already been removed by some other certificate`)\n } else {\n throw error\n }\n }\n}\n\nconst getRecordsForZoneNames = (\n records: ResourceRecordSet[],\n zoneNames: string[],\n result?: Record<string, ResourceRecordSet[]>\n): Record<string, ResourceRecordSet[]> => {\n const [zoneName, ...restZoneNames] = zoneNames\n if (!zoneName) {\n return result ?? {}\n }\n const matchingRecords: ResourceRecordSet[] = []\n const unmatchingRecords: ResourceRecordSet[] = []\n for (const record of records) {\n const normalizedRecordName = cleanDomainName(record.Name!)\n if (normalizedRecordName === zoneName || normalizedRecordName.endsWith('.' + zoneName)) {\n matchingRecords.push(record)\n } else {\n unmatchingRecords.push(record)\n }\n }\n return getRecordsForZoneNames(unmatchingRecords, restZoneNames, {\n ...(result ?? {}),\n [zoneName]: matchingRecords,\n })\n}\n\nconst requestCertificate = async (\n acm: ACMClient,\n route53: Route53Factory,\n requestId: string,\n properties: Properties\n): Promise<string> => {\n const { DomainName, AlternativeDomainNames, TransparencyLoggingEnabled } = properties\n\n console.log(`Requesting certificate for ${DomainName}`)\n\n const requestCertificateInput: RequestCertificateCommandInput = {\n DomainName,\n SubjectAlternativeNames: AlternativeDomainNames,\n IdempotencyToken: crypto.createHash('sha256').update(requestId).digest('hex').slice(0, 32),\n ValidationMethod: 'DNS',\n Options: {\n CertificateTransparencyLoggingPreference: TransparencyLoggingEnabled ? 'ENABLED' : 'DISABLED',\n },\n }\n const { CertificateArn } = await acm.send(new RequestCertificateCommand(requestCertificateInput))\n\n console.log(`Certificate ${CertificateArn} requested`)\n\n const validationMaxSeconds = 180\n const validationTimeoutError = `Domain validation options were not found in ${validationMaxSeconds} seconds`\n const validationRecords = await tryFor(validationMaxSeconds, validationTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n return parseDomainValidationRecords(Certificate!)\n })\n\n const hostedZones = Object.values(properties.ValidationHostedZones)\n const hostedZoneIds = hostedZones.map((zone) => zone.HostedZoneId)\n\n console.log(\n `Upserting ${validationRecords.length} validation record(s) into hosted zone(s) ${hostedZoneIds.join(', ')}:`\n )\n validationRecords.forEach((record) =>\n console.log(`${record.Name} ${record.Type} ${record.ResourceRecords?.map((rr) => rr.Value).join(',')}`)\n )\n\n const recordsForZoneNames = getRecordsForZoneNames(\n validationRecords,\n orderBySignificance(Object.keys(properties.ValidationHostedZones))\n )\n for (const hostedZone of hostedZones) {\n const records = recordsForZoneNames[hostedZone.DomainName]\n if (records.length > 0) {\n await changeRecordSets(\n route53(hostedZone.ValidationRoleArn, hostedZone.ValidationExternalId),\n 'UPSERT',\n records,\n hostedZone.HostedZoneId\n )\n }\n }\n\n console.log(`Waiting for certificate ${CertificateArn} to validate`)\n const result = await waitUntilCertificateValidated({ client: acm, maxWaitTime: 300 }, { CertificateArn })\n if (result.state !== 'SUCCESS') {\n throw new Error(`Certificate failed ${CertificateArn} to validate: [${result.state}] ${result.reason ?? ''}`)\n }\n console.log(`Certificate ${CertificateArn} successfully validated`)\n return CertificateArn!\n}\n\nconst deleteCertificate = async (\n acm: ACMClient,\n route53: Route53Factory,\n certificateArn: string,\n properties: Properties\n): Promise<void> => {\n console.log(`Waiting for certificate ${certificateArn} usage to drain before deletion`)\n\n const waitUsageMaxSeconds = 600\n const waitUsageTimeoutError = `Certificate was still in use after ${waitUsageMaxSeconds} seconds`\n const certificate = await tryFor(waitUsageMaxSeconds, waitUsageTimeoutError, async () => {\n const describeCertificateInput: DescribeCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n const { Certificate } = await acm.send(new DescribeCertificateCommand(describeCertificateInput))\n const inUseBy = Certificate?.InUseBy ?? []\n if (inUseBy.length > 0) {\n return null\n }\n return Certificate!\n })\n console.log('Certificate is unused and will be deleted')\n\n const validationRecords = parseDomainValidationRecords(certificate)\n if (validationRecords && stringToBoolean(properties.CleanupValidationRecords)) {\n const hostedZones = Object.values(properties.ValidationHostedZones)\n const hostedZoneIds = hostedZones.map((zone) => zone.HostedZoneId)\n\n console.log(\n `Deleting ${validationRecords.length} validation record(s) from hosted zone(s) ${hostedZoneIds.join(', ')}`\n )\n\n const recordsForZoneNames = getRecordsForZoneNames(\n validationRecords,\n orderBySignificance(Object.keys(properties.ValidationHostedZones))\n )\n for (const hostedZone of hostedZones) {\n const records = recordsForZoneNames[hostedZone.DomainName]\n if (records.length > 0) {\n await changeRecordSets(\n route53(hostedZone.ValidationRoleArn, hostedZone.ValidationExternalId),\n 'DELETE',\n records,\n hostedZone.HostedZoneId\n )\n }\n }\n }\n\n console.log(`Deleting certificate ${certificateArn} from ACM`)\n const deleteCertificateInput: DeleteCertificateCommandInput = {\n CertificateArn: certificateArn,\n }\n await acm.send(new DeleteCertificateCommand(deleteCertificateInput))\n console.log(`Certificate ${certificateArn} successfully deleted`)\n}\n\nconst addTags = async (acm: ACMClient, certificateArn: string, tags: Record<string, string>) => {\n const tagList = Array.from(Object.entries(tags).map(([Key, Value]) => ({ Key, Value })))\n const addTagsInput: AddTagsToCertificateCommandInput = {\n CertificateArn: certificateArn,\n Tags: tagList,\n }\n\n console.log(`Adding ${tagList.length} tags to certificate ${certificateArn}`)\n await acm.send(new AddTagsToCertificateCommand(addTagsInput))\n console.log(`All tags successfully added to certificate ${certificateArn}`)\n}\n\nconst shouldRequestNew = (oldProperties: Properties, newProperties: Properties): boolean => {\n const oldHostedZoneIds = Object.values(oldProperties.ValidationHostedZones ?? {}).map((zone) => zone.HostedZoneId)\n const newHostedZoneIds = Object.values(newProperties.ValidationHostedZones ?? {}).map((zone) => zone.HostedZoneId)\n if (!containsSame(oldHostedZoneIds, newHostedZoneIds)) return true\n if (oldProperties.DomainName !== newProperties.DomainName) return true\n if (!containsSame(oldProperties.AlternativeDomainNames ?? [], newProperties.AlternativeDomainNames ?? [])) return true\n if (oldProperties.CertificateRegion !== newProperties.CertificateRegion) return true\n if (oldProperties.CleanupValidationRecords !== newProperties.CleanupValidationRecords) return true\n if (oldProperties.TransparencyLoggingEnabled !== newProperties.TransparencyLoggingEnabled) return true\n if (oldProperties.RemovalPolicy !== newProperties.RemovalPolicy) return true\n return false\n}\n\nconst assumeRole = (\n roleArn: string | undefined,\n externalId: string | undefined\n): Provider<AwsCredentialIdentity> | undefined => {\n if (!roleArn) {\n return undefined\n }\n return async () => {\n const sts = new STSClient({ retryMode: 'adaptive' })\n const assumeRoleInput: AssumeRoleCommandInput = {\n RoleArn: roleArn,\n RoleSessionName: 'CertificateRequestor',\n ExternalId: externalId,\n }\n const { Credentials } = await sts.send(new AssumeRoleCommand(assumeRoleInput))\n return {\n accessKeyId: Credentials?.AccessKeyId!,\n secretAccessKey: Credentials?.SecretAccessKey!,\n sessionToken: Credentials?.SessionToken!,\n expiration: Credentials?.Expiration,\n }\n }\n}\n\nexport const handler = async (event: CloudFormationCustomResourceEvent) => {\n const properties = parseProperties(event.ResourceProperties)\n\n const acm = new ACMClient({ region: properties.CertificateRegion, retryMode: 'adaptive' })\n const route53 = (roleArn: string | undefined, externalId: string | undefined): Route53Client => {\n return new Route53Client({\n retryMode: 'adaptive',\n credentials: assumeRole(roleArn, externalId),\n })\n }\n\n switch (event.RequestType) {\n case 'Create': {\n console.log(`Requesting new certificate:\\n${objectToString(properties)}`)\n const certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Update': {\n let certificateArn = event.PhysicalResourceId\n if (shouldRequestNew(parseProperties(event.OldResourceProperties), properties)) {\n console.log(`Requesting new certificate due to change of properties:\\n${objectToString(properties)}`)\n certificateArn = await requestCertificate(acm, route53, event.RequestId, properties)\n }\n if (properties.Tags && Object.entries(properties.Tags).length > 0) {\n await addTags(acm, certificateArn, properties.Tags)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n case 'Delete': {\n const certificateArn = event.PhysicalResourceId\n if (properties.RemovalPolicy === 'destroy') {\n console.log(`Deleting old certificate as per removal policy:\\n${objectToString(properties)}`)\n await deleteCertificate(acm, route53, certificateArn, properties)\n }\n return {\n PhysicalResourceId: certificateArn,\n Data: {\n Arn: certificateArn,\n },\n }\n }\n }\n throw new Error(`Invalid request type`)\n}\n", "export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const booleanToString = (value: boolean): string => {\n return value ? 'true' : 'false'\n}\n\nexport const stringToBoolean = (value: string): boolean => {\n return value === 'true' ? true : false\n}\n\nexport const objectToString = (value: object): string => {\n return JSON.stringify(value, undefined, 2)\n}\n\nexport const containsSame = <T>(array1: T[], array2: T[]): boolean => {\n if (array1.length !== array2.length) return false\n return array1.every((v1) => array2.includes(v1))\n}\n\nexport const orderBySignificance = (domains: string[]): string[] => {\n const copy = [...domains]\n copy.sort((a, b) => {\n const ac = cleanDomainName(a).split('.').length\n const bc = cleanDomainName(b).split('.').length\n if (ac > bc) {\n return -1\n }\n if (ac < bc) {\n return 1\n }\n return 0\n })\n return copy\n}\n\nexport const cleanDomainName = (domainName: string): string => {\n if (domainName.endsWith('.')) {\n return domainName.slice(0, -1)\n }\n return domainName\n}\n\nexport const cleanHostedZoneId = (hostedZoneId: string): string => {\n return hostedZoneId.replace(/^\\/hostedzone\\//, '')\n}\n\nexport const cleanChangeId = (changeId: string): string => {\n return changeId.replace('/change/', '')\n}\n\nexport const matchNamesToZones = <T>(\n zoneNames: string[],\n records: T[],\n name: (record: T) => string\n): Record<string, T[]> => {\n const orderedZoneNames = orderBySignificance(zoneNames)\n const matcher = (zones: string[], items: T[], result: Record<string, T[]>): Record<string, T[]> => {\n const [firstZone, ...restZones] = zones\n if (!firstZone) {\n return result\n }\n const matchingItems: T[] = []\n const unmatchingItems: T[] = []\n for (const item of items) {\n const normalizedRecordName = cleanDomainName(name(item))\n if (normalizedRecordName.endsWith(cleanDomainName(firstZone))) {\n matchingItems.push(item)\n } else {\n unmatchingItems.push(item)\n }\n }\n return matcher(restZones, unmatchingItems, {\n ...result,\n [firstZone]: matchingItems,\n })\n }\n return matcher(orderedZoneNames, records, {})\n}\n\nexport const tryFor = async <T>(maxSeconds: number, timeoutError: string, fn: () => Promise<T | null>): Promise<T> => {\n const startTime = Date.now()\n // eslint-disable-next-line no-constant-condition\n for (let i = 0; true; i++) {\n if (Date.now() > startTime + maxSeconds * 1000) {\n throw new Error(timeoutError)\n }\n const result = await fn()\n if (result !== null) {\n return result\n }\n const base = Math.pow(2, i)\n await sleep(Math.random() * base * 50 + base * 150)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -69,7 +69,7 @@ const getRecordsForZoneNames = (records, zoneNames, result) => {
|
|
|
69
69
|
const unmatchingRecords = [];
|
|
70
70
|
for (const record of records) {
|
|
71
71
|
const normalizedRecordName = (0, utils_1.cleanDomainName)(record.Name);
|
|
72
|
-
if (normalizedRecordName.endsWith(zoneName)) {
|
|
72
|
+
if (normalizedRecordName === zoneName || normalizedRecordName.endsWith('.' + zoneName)) {
|
|
73
73
|
matchingRecords.push(record);
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
@@ -264,4 +264,4 @@ const handler = async (event) => {
|
|
|
264
264
|
throw new Error(`Invalid request type`);
|
|
265
265
|
};
|
|
266
266
|
exports.handler = handler;
|
|
267
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtcmVxdWVzdG9yLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jZXJ0aWZpY2F0ZS1yZXF1ZXN0b3IubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFnQztBQUNoQyxvREFZNEI7QUFDNUIsOERBUWlDO0FBQ2pDLG9EQUEwRjtBQUcxRixtQ0FRZ0I7QUFzQmhCLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBK0IsRUFBYyxFQUFFO0lBQ3RFLGtEQUFrRDtJQUNsRCxPQUFPLFVBQW1DLENBQUE7QUFDNUMsQ0FBQyxDQUFBO0FBRUQsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFdBQThCLEVBQThCLEVBQUU7SUFDbEcsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQTtJQUN6RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUssRUFBRSxHQUFHLENBQUMsY0FBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDbkgsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsR0FBRyxFQUFFLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFO29CQUNmO3dCQUNFLEtBQUssRUFBRSxNQUFN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bEMsSUFBSSxFQUFFO29CQUNKLEdBQUcsRUFBRSxjQUFjO2lCQUNwQjthQUNGLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtBQUN6QyxDQUFDLENBQUE7QUF4RFksUUFBQSxPQUFPLFdBd0RuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nXG5pbXBvcnQge1xuICBBQ01DbGllbnQsXG4gIEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZCxcbiAgQWRkVGFnc1RvQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIENlcnRpZmljYXRlRGV0YWlsLFxuICBEZWxldGVDZXJ0aWZpY2F0ZUNvbW1hbmQsXG4gIERlbGV0ZUNlcnRpZmljYXRlQ29tbWFuZElucHV0LFxuICBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZCxcbiAgRGVzY3JpYmVDZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCxcbiAgUmVxdWVzdENlcnRpZmljYXRlQ29tbWFuZCxcbiAgUmVxdWVzdENlcnRpZmljYXRlQ29tbWFuZElucHV0LFxuICB3YWl0VW50aWxDZXJ0aWZpY2F0ZVZhbGlkYXRlZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWFjbSdcbmltcG9ydCB7XG4gIENoYW5nZUFjdGlvbixcbiAgQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzQ29tbWFuZCxcbiAgQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzQ29tbWFuZElucHV0LFxuICBJbnZhbGlkQ2hhbmdlQmF0Y2gsXG4gIFJlc291cmNlUmVjb3JkU2V0LFxuICBSb3V0ZTUzQ2xpZW50LFxuICB3YWl0VW50aWxSZXNvdXJjZVJlY29yZFNldHNDaGFuZ2VkLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtcm91dGUtNTMnXG5pbXBvcnQgeyBBc3N1bWVSb2xlQ29tbWFuZCwgQXNzdW1lUm9sZUNvbW1hbmRJbnB1dCwgU1RTQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXN0cydcbmltcG9ydCB0eXBlIHsgQXdzQ3JlZGVudGlhbElkZW50aXR5LCBQcm92aWRlciB9IGZyb20gJ0Bhd3Mtc2RrL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQgfSBmcm9tICdhd3MtbGFtYmRhJ1xuaW1wb3J0IHtcbiAgY2xlYW5DaGFuZ2VJZCxcbiAgY2xlYW5Eb21haW5OYW1lLFxuICBjb250YWluc1NhbWUsXG4gIG9iamVjdFRvU3RyaW5nLFxuICBvcmRlckJ5U2lnbmlmaWNhbmNlLFxuICBzdHJpbmdUb0Jvb2xlYW4sXG4gIHRyeUZvcixcbn0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IHR5cGUgVmFsaWRhdGlvbkhvc3RlZFpvbmVQcm9wZXJ0aWVzID0ge1xuICBEb21haW5OYW1lOiBzdHJpbmdcbiAgSG9zdGVkWm9uZUlkOiBzdHJpbmdcbiAgVmFsaWRhdGlvblJvbGVBcm4/OiBzdHJpbmdcbiAgVmFsaWRhdGlvbkV4dGVybmFsSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUHJvcGVydGllcyA9IHtcbiAgRG9tYWluTmFtZTogc3RyaW5nXG4gIEFsdGVybmF0aXZlRG9tYWluTmFtZXM/OiBzdHJpbmdbXVxuICBWYWxpZGF0aW9uSG9zdGVkWm9uZXM6IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRpb25Ib3N0ZWRab25lUHJvcGVydGllcz5cbiAgQ2VydGlmaWNhdGVSZWdpb246IHN0cmluZ1xuICBDbGVhbnVwVmFsaWRhdGlvblJlY29yZHM6IHN0cmluZ1xuICBUcmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZDogc3RyaW5nXG4gIFRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIFJlbW92YWxQb2xpY3k6IHN0cmluZ1xufVxuXG50eXBlIFJvdXRlNTNGYWN0b3J5ID0gKHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCwgZXh0ZXJuYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiBSb3V0ZTUzQ2xpZW50XG5cbmNvbnN0IHBhcnNlUHJvcGVydGllcyA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvcGVydGllcyA9PiB7XG4gIC8vIG1heWJlIHNob3VsZCBhY3R1YWxseSBwYXJzZSBhbmQgbm90IGp1c3QgYXNzdW1lXG4gIHJldHVybiBwcm9wZXJ0aWVzIGFzIHVua25vd24gYXMgUHJvcGVydGllc1xufVxuXG5jb25zdCBwYXJzZURvbWFpblZhbGlkYXRpb25SZWNvcmRzID0gKGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZURldGFpbCk6IFJlc291cmNlUmVjb3JkU2V0W10gfCBudWxsID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNlcnRpZmljYXRlLkRvbWFpblZhbGlkYXRpb25PcHRpb25zID8/IFtdXG4gIGlmIChvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0KSA9PiBvcHQuUmVzb3VyY2VSZWNvcmQ/Lk5hbWUpKSB7XG4gICAgY29uc3QgdW5pcXVlUmVjb3JkcyA9IFsuLi5uZXcgTWFwKG9wdGlvbnMubWFwKChvcHQpID0+IFtvcHQuUmVzb3VyY2VSZWNvcmQ/Lk5hbWUhLCBvcHQuUmVzb3VyY2VSZWNvcmQhXSkpLnZhbHVlcygpXVxuICAgIHJldHVybiB1bmlxdWVSZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBOYW1lOiByZWNvcmQuTmFtZSxcbiAgICAgICAgVHlwZTogcmVjb3JkLlR5cGUsXG4gICAgICAgIFRUTDogMzAsXG4gICAgICAgIFJlc291cmNlUmVjb3JkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFZhbHVlOiByZWNvcmQuVmFsdWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGNoYW5nZVJlY29yZFNldHMgPSBhc3luYyAoXG4gIHJvdXRlNTM6IFJvdXRlNTNDbGllbnQsXG4gIGFjdGlvbjogQ2hhbmdlQWN0aW9uLFxuICByZWNvcmRzOiBSZXNvdXJjZVJlY29yZFNldFtdLFxuICBob3N0ZWRab25lSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGNoYW5nZVJlY29yZFNldHNJbnB1dDogQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzQ29tbWFuZElucHV0ID0ge1xuICAgIEhvc3RlZFpvbmVJZDogaG9zdGVkWm9uZUlkLFxuICAgIENoYW5nZUJhdGNoOiB7XG4gICAgICBDaGFuZ2VzOiByZWNvcmRzLm1hcCgocmVjb3JkKSA9PiAoe1xuICAgICAgICBBY3Rpb246IGFjdGlvbixcbiAgICAgICAgUmVzb3VyY2VSZWNvcmRTZXQ6IHJlY29yZCxcbiAgICAgIH0pKSxcbiAgICB9LFxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBDaGFuZ2VJbmZvIH0gPSBhd2FpdCByb3V0ZTUzLnNlbmQobmV3IENoYW5nZVJlc291cmNlUmVjb3JkU2V0c0NvbW1hbmQoY2hhbmdlUmVjb3JkU2V0c0lucHV0KSlcbiAgICBjb25zdCBjaGFuZ2VJZCA9IENoYW5nZUluZm8/LklkIVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhaXRVbnRpbFJlc291cmNlUmVjb3JkU2V0c0NoYW5nZWQoeyBjbGllbnQ6IHJvdXRlNTMsIG1heFdhaXRUaW1lOiAxODAgfSwgeyBJZDogY2hhbmdlSWQgfSlcbiAgICBpZiAocmVzdWx0LnN0YXRlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhbGlkYXRpb24gcmVjb3JkcyBuZXZlciBjaGFuZ2VkIGZvciBob3N0ZWQgem9uZSAke2hvc3RlZFpvbmVJZH06IFske3Jlc3VsdC5zdGF0ZX1dICR7cmVzdWx0LnJlYXNvbiA/PyAnJ31gXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGFjdGlvbiA9PT0gJ0NSRUFURScgfHwgYWN0aW9uID09PSAnVVBTRVJUJyA/ICdjaGFuZ2VkJyA6ICdkZWxldGVkJ1xuICAgIGNvbnN0IGNoYW5nZSA9IGNsZWFuQ2hhbmdlSWQoY2hhbmdlSWQpXG4gICAgY29uc29sZS5sb2coYFZhbGlkYXRpb24gcmVjb3JkcyBzdWNjZXNmdWxseSAke29wZXJhdGlvbn0gZm9yIGhvc3RlZCB6b25lICR7aG9zdGVkWm9uZUlkfSB3aXRoIGNoYW5nZSBpZCAke2NoYW5nZX1gKVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChhY3Rpb24gPT09ICdERUxFVEUnICYmIGVycm9yIGluc3RhbmNlb2YgSW52YWxpZENoYW5nZUJhdGNoICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBmb3VuZCcpKSB7XG4gICAgICAvLyB0aGVyZSdzIGEgZGVsZXRpb24gcmFjZSBjb25kaXRpb24gd2hlcmUgc29tZSBvdGhlciBjZXJ0aWZpY2F0ZSBoYXMgYWxyZWFkeSBkZWxldGVkIHRoZSByZWNvcmRzXG4gICAgICBjb25zb2xlLmxvZyhgQWxsIHZhbGlkYXRpb24gcmVjb3JkcyBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGJ5IHNvbWUgb3RoZXIgY2VydGlmaWNhdGVgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBnZXRSZWNvcmRzRm9yWm9uZU5hbWVzID0gKFxuICByZWNvcmRzOiBSZXNvdXJjZVJlY29yZFNldFtdLFxuICB6b25lTmFtZXM6IHN0cmluZ1tdLFxuICByZXN1bHQ/OiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZVJlY29yZFNldFtdPlxuKTogUmVjb3JkPHN0cmluZywgUmVzb3VyY2VSZWNvcmRTZXRbXT4gPT4ge1xuICBjb25zdCBbem9uZU5hbWUsIC4uLnJlc3Rab25lTmFtZXNdID0gem9uZU5hbWVzXG4gIGlmICghem9uZU5hbWUpIHtcbiAgICByZXR1cm4gcmVzdWx0ID8/IHt9XG4gIH1cbiAgY29uc3QgbWF0Y2hpbmdSZWNvcmRzOiBSZXNvdXJjZVJlY29yZFNldFtdID0gW11cbiAgY29uc3QgdW5tYXRjaGluZ1JlY29yZHM6IFJlc291cmNlUmVjb3JkU2V0W10gPSBbXVxuICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJlY29yZE5hbWUgPSBjbGVhbkRvbWFpbk5hbWUocmVjb3JkLk5hbWUhKVxuICAgIGlmIChub3JtYWxpemVkUmVjb3JkTmFtZS5lbmRzV2l0aCh6b25lTmFtZSkpIHtcbiAgICAgIG1hdGNoaW5nUmVjb3Jkcy5wdXNoKHJlY29yZClcbiAgICB9IGVsc2Uge1xuICAgICAgdW5tYXRjaGluZ1JlY29yZHMucHVzaChyZWNvcmQpXG4gICAgfVxuICB9XG4gIHJldHVybiBnZXRSZWNvcmRzRm9yWm9uZU5hbWVzKHVubWF0Y2hpbmdSZWNvcmRzLCByZXN0Wm9uZU5hbWVzLCB7XG4gICAgLi4uKHJlc3VsdCA/PyB7fSksXG4gICAgW3pvbmVOYW1lXTogbWF0Y2hpbmdSZWNvcmRzLFxuICB9KVxufVxuXG5jb25zdCByZXF1ZXN0Q2VydGlmaWNhdGUgPSBhc3luYyAoXG4gIGFjbTogQUNNQ2xpZW50LFxuICByb3V0ZTUzOiBSb3V0ZTUzRmFjdG9yeSxcbiAgcmVxdWVzdElkOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFByb3BlcnRpZXNcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHsgRG9tYWluTmFtZSwgQWx0ZXJuYXRpdmVEb21haW5OYW1lcywgVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgfSA9IHByb3BlcnRpZXNcblxuICBjb25zb2xlLmxvZyhgUmVxdWVzdGluZyBjZXJ0aWZpY2F0ZSBmb3IgJHtEb21haW5OYW1lfWApXG5cbiAgY29uc3QgcmVxdWVzdENlcnRpZmljYXRlSW5wdXQ6IFJlcXVlc3RDZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCA9IHtcbiAgICBEb21haW5OYW1lLFxuICAgIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzOiBBbHRlcm5hdGl2ZURvbWFpbk5hbWVzLFxuICAgIElkZW1wb3RlbmN5VG9rZW46IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocmVxdWVzdElkKS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIDMyKSxcbiAgICBWYWxpZGF0aW9uTWV0aG9kOiAnRE5TJyxcbiAgICBPcHRpb25zOiB7XG4gICAgICBDZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUxvZ2dpbmdQcmVmZXJlbmNlOiBUcmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZCA/ICdFTkFCTEVEJyA6ICdESVNBQkxFRCcsXG4gICAgfSxcbiAgfVxuICBjb25zdCB7IENlcnRpZmljYXRlQXJuIH0gPSBhd2FpdCBhY20uc2VuZChuZXcgUmVxdWVzdENlcnRpZmljYXRlQ29tbWFuZChyZXF1ZXN0Q2VydGlmaWNhdGVJbnB1dCkpXG5cbiAgY29uc29sZS5sb2coYENlcnRpZmljYXRlICR7Q2VydGlmaWNhdGVBcm59IHJlcXVlc3RlZGApXG5cbiAgY29uc3QgdmFsaWRhdGlvbk1heFNlY29uZHMgPSAxODBcbiAgY29uc3QgdmFsaWRhdGlvblRpbWVvdXRFcnJvciA9IGBEb21haW4gdmFsaWRhdGlvbiBvcHRpb25zIHdlcmUgbm90IGZvdW5kIGluICR7dmFsaWRhdGlvbk1heFNlY29uZHN9IHNlY29uZHNgXG4gIGNvbnN0IHZhbGlkYXRpb25SZWNvcmRzID0gYXdhaXQgdHJ5Rm9yKHZhbGlkYXRpb25NYXhTZWNvbmRzLCB2YWxpZGF0aW9uVGltZW91dEVycm9yLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0OiBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgICAgQ2VydGlmaWNhdGVBcm4sXG4gICAgfVxuICAgIGNvbnN0IHsgQ2VydGlmaWNhdGUgfSA9IGF3YWl0IGFjbS5zZW5kKG5ldyBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZChkZXNjcmliZUNlcnRpZmljYXRlSW5wdXQpKVxuICAgIHJldHVybiBwYXJzZURvbWFpblZhbGlkYXRpb25SZWNvcmRzKENlcnRpZmljYXRlISlcbiAgfSlcblxuICBjb25zdCBob3N0ZWRab25lcyA9IE9iamVjdC52YWx1ZXMocHJvcGVydGllcy5WYWxpZGF0aW9uSG9zdGVkWm9uZXMpXG4gIGNvbnN0IGhvc3RlZFpvbmVJZHMgPSBob3N0ZWRab25lcy5tYXAoKHpvbmUpID0+IHpvbmUuSG9zdGVkWm9uZUlkKVxuXG4gIGNvbnNvbGUubG9nKFxuICAgIGBVcHNlcnRpbmcgJHt2YWxpZGF0aW9uUmVjb3Jkcy5sZW5ndGh9IHZhbGlkYXRpb24gcmVjb3JkKHMpIGludG8gaG9zdGVkIHpvbmUocykgJHtob3N0ZWRab25lSWRzLmpvaW4oJywgJyl9OmBcbiAgKVxuICB2YWxpZGF0aW9uUmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+XG4gICAgY29uc29sZS5sb2coYCR7cmVjb3JkLk5hbWV9ICR7cmVjb3JkLlR5cGV9ICR7cmVjb3JkLlJlc291cmNlUmVjb3Jkcz8ubWFwKChycikgPT4gcnIuVmFsdWUpLmpvaW4oJywnKX1gKVxuICApXG5cbiAgY29uc3QgcmVjb3Jkc0ZvclpvbmVOYW1lcyA9IGdldFJlY29yZHNGb3Jab25lTmFtZXMoXG4gICAgdmFsaWRhdGlvblJlY29yZHMsXG4gICAgb3JkZXJCeVNpZ25pZmljYW5jZShPYmplY3Qua2V5cyhwcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcykpXG4gIClcbiAgZm9yIChjb25zdCBob3N0ZWRab25lIG9mIGhvc3RlZFpvbmVzKSB7XG4gICAgY29uc3QgcmVjb3JkcyA9IHJlY29yZHNGb3Jab25lTmFtZXNbaG9zdGVkWm9uZS5Eb21haW5OYW1lXVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IGNoYW5nZVJlY29yZFNldHMoXG4gICAgICAgIHJvdXRlNTMoaG9zdGVkWm9uZS5WYWxpZGF0aW9uUm9sZUFybiwgaG9zdGVkWm9uZS5WYWxpZGF0aW9uRXh0ZXJuYWxJZCksXG4gICAgICAgICdVUFNFUlQnLFxuICAgICAgICByZWNvcmRzLFxuICAgICAgICBob3N0ZWRab25lLkhvc3RlZFpvbmVJZFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBXYWl0aW5nIGZvciBjZXJ0aWZpY2F0ZSAke0NlcnRpZmljYXRlQXJufSB0byB2YWxpZGF0ZWApXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhaXRVbnRpbENlcnRpZmljYXRlVmFsaWRhdGVkKHsgY2xpZW50OiBhY20sIG1heFdhaXRUaW1lOiAzMDAgfSwgeyBDZXJ0aWZpY2F0ZUFybiB9KVxuICBpZiAocmVzdWx0LnN0YXRlICE9PSAnU1VDQ0VTUycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGZhaWxlZCAke0NlcnRpZmljYXRlQXJufSB0byB2YWxpZGF0ZTogWyR7cmVzdWx0LnN0YXRlfV0gJHtyZXN1bHQucmVhc29uID8/ICcnfWApXG4gIH1cbiAgY29uc29sZS5sb2coYENlcnRpZmljYXRlICR7Q2VydGlmaWNhdGVBcm59IHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWRgKVxuICByZXR1cm4gQ2VydGlmaWNhdGVBcm4hXG59XG5cbmNvbnN0IGRlbGV0ZUNlcnRpZmljYXRlID0gYXN5bmMgKFxuICBhY206IEFDTUNsaWVudCxcbiAgcm91dGU1MzogUm91dGU1M0ZhY3RvcnksXG4gIGNlcnRpZmljYXRlQXJuOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFByb3BlcnRpZXNcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zb2xlLmxvZyhgV2FpdGluZyBmb3IgY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZUFybn0gdXNhZ2UgdG8gZHJhaW4gYmVmb3JlIGRlbGV0aW9uYClcblxuICBjb25zdCB3YWl0VXNhZ2VNYXhTZWNvbmRzID0gNjAwXG4gIGNvbnN0IHdhaXRVc2FnZVRpbWVvdXRFcnJvciA9IGBDZXJ0aWZpY2F0ZSB3YXMgc3RpbGwgaW4gdXNlIGFmdGVyICR7d2FpdFVzYWdlTWF4U2Vjb25kc30gc2Vjb25kc2BcbiAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCB0cnlGb3Iod2FpdFVzYWdlTWF4U2Vjb25kcywgd2FpdFVzYWdlVGltZW91dEVycm9yLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0OiBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgICAgQ2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuLFxuICAgIH1cbiAgICBjb25zdCB7IENlcnRpZmljYXRlIH0gPSBhd2FpdCBhY20uc2VuZChuZXcgRGVzY3JpYmVDZXJ0aWZpY2F0ZUNvbW1hbmQoZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0KSlcbiAgICBjb25zdCBpblVzZUJ5ID0gQ2VydGlmaWNhdGU/LkluVXNlQnkgPz8gW11cbiAgICBpZiAoaW5Vc2VCeS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gQ2VydGlmaWNhdGUhXG4gIH0pXG4gIGNvbnNvbGUubG9nKCdDZXJ0aWZpY2F0ZSBpcyB1bnVzZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCcpXG5cbiAgY29uc3QgdmFsaWRhdGlvblJlY29yZHMgPSBwYXJzZURvbWFpblZhbGlkYXRpb25SZWNvcmRzKGNlcnRpZmljYXRlKVxuICBpZiAodmFsaWRhdGlvblJlY29yZHMgJiYgc3RyaW5nVG9Cb29sZWFuKHByb3BlcnRpZXMuQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzKSkge1xuICAgIGNvbnN0IGhvc3RlZFpvbmVzID0gT2JqZWN0LnZhbHVlcyhwcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcylcbiAgICBjb25zdCBob3N0ZWRab25lSWRzID0gaG9zdGVkWm9uZXMubWFwKCh6b25lKSA9PiB6b25lLkhvc3RlZFpvbmVJZClcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYERlbGV0aW5nICR7dmFsaWRhdGlvblJlY29yZHMubGVuZ3RofSB2YWxpZGF0aW9uIHJlY29yZChzKSBmcm9tIGhvc3RlZCB6b25lKHMpICR7aG9zdGVkWm9uZUlkcy5qb2luKCcsICcpfWBcbiAgICApXG5cbiAgICBjb25zdCByZWNvcmRzRm9yWm9uZU5hbWVzID0gZ2V0UmVjb3Jkc0ZvclpvbmVOYW1lcyhcbiAgICAgIHZhbGlkYXRpb25SZWNvcmRzLFxuICAgICAgb3JkZXJCeVNpZ25pZmljYW5jZShPYmplY3Qua2V5cyhwcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcykpXG4gICAgKVxuICAgIGZvciAoY29uc3QgaG9zdGVkWm9uZSBvZiBob3N0ZWRab25lcykge1xuICAgICAgY29uc3QgcmVjb3JkcyA9IHJlY29yZHNGb3Jab25lTmFtZXNbaG9zdGVkWm9uZS5Eb21haW5OYW1lXVxuICAgICAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBjaGFuZ2VSZWNvcmRTZXRzKFxuICAgICAgICAgIHJvdXRlNTMoaG9zdGVkWm9uZS5WYWxpZGF0aW9uUm9sZUFybiwgaG9zdGVkWm9uZS5WYWxpZGF0aW9uRXh0ZXJuYWxJZCksXG4gICAgICAgICAgJ0RFTEVURScsXG4gICAgICAgICAgcmVjb3JkcyxcbiAgICAgICAgICBob3N0ZWRab25lLkhvc3RlZFpvbmVJZFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coYERlbGV0aW5nIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59IGZyb20gQUNNYClcbiAgY29uc3QgZGVsZXRlQ2VydGlmaWNhdGVJbnB1dDogRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQgPSB7XG4gICAgQ2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuLFxuICB9XG4gIGF3YWl0IGFjbS5zZW5kKG5ldyBEZWxldGVDZXJ0aWZpY2F0ZUNvbW1hbmQoZGVsZXRlQ2VydGlmaWNhdGVJbnB1dCkpXG4gIGNvbnNvbGUubG9nKGBDZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufSBzdWNjZXNzZnVsbHkgZGVsZXRlZGApXG59XG5cbmNvbnN0IGFkZFRhZ3MgPSBhc3luYyAoYWNtOiBBQ01DbGllbnQsIGNlcnRpZmljYXRlQXJuOiBzdHJpbmcsIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHtcbiAgY29uc3QgdGFnTGlzdCA9IEFycmF5LmZyb20oT2JqZWN0LmVudHJpZXModGFncykubWFwKChbS2V5LCBWYWx1ZV0pID0+ICh7IEtleSwgVmFsdWUgfSkpKVxuICBjb25zdCBhZGRUYWdzSW5wdXQ6IEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgIENlcnRpZmljYXRlQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICBUYWdzOiB0YWdMaXN0LFxuICB9XG5cbiAgY29uc29sZS5sb2coYEFkZGluZyAke3RhZ0xpc3QubGVuZ3RofSB0YWdzIHRvIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59YClcbiAgYXdhaXQgYWNtLnNlbmQobmV3IEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZChhZGRUYWdzSW5wdXQpKVxuICBjb25zb2xlLmxvZyhgQWxsIHRhZ3Mgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59YClcbn1cblxuY29uc3Qgc2hvdWxkUmVxdWVzdE5ldyA9IChvbGRQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG9sZEhvc3RlZFpvbmVJZHMgPSBPYmplY3QudmFsdWVzKG9sZFByb3BlcnRpZXMuVmFsaWRhdGlvbkhvc3RlZFpvbmVzID8/IHt9KS5tYXAoKHpvbmUpID0+IHpvbmUuSG9zdGVkWm9uZUlkKVxuICBjb25zdCBuZXdIb3N0ZWRab25lSWRzID0gT2JqZWN0LnZhbHVlcyhuZXdQcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcyA/PyB7fSkubWFwKCh6b25lKSA9PiB6b25lLkhvc3RlZFpvbmVJZClcbiAgaWYgKCFjb250YWluc1NhbWUob2xkSG9zdGVkWm9uZUlkcywgbmV3SG9zdGVkWm9uZUlkcykpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLkRvbWFpbk5hbWUgIT09IG5ld1Byb3BlcnRpZXMuRG9tYWluTmFtZSkgcmV0dXJuIHRydWVcbiAgaWYgKCFjb250YWluc1NhbWUob2xkUHJvcGVydGllcy5BbHRlcm5hdGl2ZURvbWFpbk5hbWVzID8/IFtdLCBuZXdQcm9wZXJ0aWVzLkFsdGVybmF0aXZlRG9tYWluTmFtZXMgPz8gW10pKSByZXR1cm4gdHJ1ZVxuICBpZiAob2xkUHJvcGVydGllcy5DZXJ0aWZpY2F0ZVJlZ2lvbiAhPT0gbmV3UHJvcGVydGllcy5DZXJ0aWZpY2F0ZVJlZ2lvbikgcmV0dXJuIHRydWVcbiAgaWYgKG9sZFByb3BlcnRpZXMuQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzICE9PSBuZXdQcm9wZXJ0aWVzLkNsZWFudXBWYWxpZGF0aW9uUmVjb3JkcykgcmV0dXJuIHRydWVcbiAgaWYgKG9sZFByb3BlcnRpZXMuVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgIT09IG5ld1Byb3BlcnRpZXMuVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLlJlbW92YWxQb2xpY3kgIT09IG5ld1Byb3BlcnRpZXMuUmVtb3ZhbFBvbGljeSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGFzc3VtZVJvbGUgPSAoXG4gIHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZXh0ZXJuYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm92aWRlcjxBd3NDcmVkZW50aWFsSWRlbnRpdHk+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFyb2xlQXJuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RzID0gbmV3IFNUU0NsaWVudCh7IHJldHJ5TW9kZTogJ2FkYXB0aXZlJyB9KVxuICAgIGNvbnN0IGFzc3VtZVJvbGVJbnB1dDogQXNzdW1lUm9sZUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgIFJvbGVBcm46IHJvbGVBcm4sXG4gICAgICBSb2xlU2Vzc2lvbk5hbWU6ICdDZXJ0aWZpY2F0ZVJlcXVlc3RvcicsXG4gICAgICBFeHRlcm5hbElkOiBleHRlcm5hbElkLFxuICAgIH1cbiAgICBjb25zdCB7IENyZWRlbnRpYWxzIH0gPSBhd2FpdCBzdHMuc2VuZChuZXcgQXNzdW1lUm9sZUNvbW1hbmQoYXNzdW1lUm9sZUlucHV0KSlcbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzS2V5SWQ6IENyZWRlbnRpYWxzPy5BY2Nlc3NLZXlJZCEsXG4gICAgICBzZWNyZXRBY2Nlc3NLZXk6IENyZWRlbnRpYWxzPy5TZWNyZXRBY2Nlc3NLZXkhLFxuICAgICAgc2Vzc2lvblRva2VuOiBDcmVkZW50aWFscz8uU2Vzc2lvblRva2VuISxcbiAgICAgIGV4cGlyYXRpb246IENyZWRlbnRpYWxzPy5FeHBpcmF0aW9uLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50KSA9PiB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBwYXJzZVByb3BlcnRpZXMoZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzKVxuXG4gIGNvbnN0IGFjbSA9IG5ldyBBQ01DbGllbnQoeyByZWdpb246IHByb3BlcnRpZXMuQ2VydGlmaWNhdGVSZWdpb24sIHJldHJ5TW9kZTogJ2FkYXB0aXZlJyB9KVxuICBjb25zdCByb3V0ZTUzID0gKHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCwgZXh0ZXJuYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUm91dGU1M0NsaWVudCA9PiB7XG4gICAgcmV0dXJuIG5ldyBSb3V0ZTUzQ2xpZW50KHtcbiAgICAgIHJldHJ5TW9kZTogJ2FkYXB0aXZlJyxcbiAgICAgIGNyZWRlbnRpYWxzOiBhc3N1bWVSb2xlKHJvbGVBcm4sIGV4dGVybmFsSWQpLFxuICAgIH0pXG4gIH1cblxuICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgY2FzZSAnQ3JlYXRlJzoge1xuICAgICAgY29uc29sZS5sb2coYFJlcXVlc3RpbmcgbmV3IGNlcnRpZmljYXRlOlxcbiR7b2JqZWN0VG9TdHJpbmcocHJvcGVydGllcyl9YClcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlQXJuID0gYXdhaXQgcmVxdWVzdENlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgZXZlbnQuUmVxdWVzdElkLCBwcm9wZXJ0aWVzKVxuICAgICAgaWYgKHByb3BlcnRpZXMuVGFncyAmJiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLlRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgYWRkVGFncyhhY20sIGNlcnRpZmljYXRlQXJuLCBwcm9wZXJ0aWVzLlRhZ3MpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnVXBkYXRlJzoge1xuICAgICAgbGV0IGNlcnRpZmljYXRlQXJuID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkXG4gICAgICBpZiAoc2hvdWxkUmVxdWVzdE5ldyhwYXJzZVByb3BlcnRpZXMoZXZlbnQuT2xkUmVzb3VyY2VQcm9wZXJ0aWVzKSwgcHJvcGVydGllcykpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlcXVlc3RpbmcgbmV3IGNlcnRpZmljYXRlIGR1ZSB0byBjaGFuZ2Ugb2YgcHJvcGVydGllczpcXG4ke29iamVjdFRvU3RyaW5nKHByb3BlcnRpZXMpfWApXG4gICAgICAgIGNlcnRpZmljYXRlQXJuID0gYXdhaXQgcmVxdWVzdENlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgZXZlbnQuUmVxdWVzdElkLCBwcm9wZXJ0aWVzKVxuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnRpZXMuVGFncyAmJiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLlRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgYWRkVGFncyhhY20sIGNlcnRpZmljYXRlQXJuLCBwcm9wZXJ0aWVzLlRhZ3MpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgY29uc3QgY2VydGlmaWNhdGVBcm4gPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWRcbiAgICAgIGlmIChwcm9wZXJ0aWVzLlJlbW92YWxQb2xpY3kgPT09ICdkZXN0cm95Jykge1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgb2xkIGNlcnRpZmljYXRlIGFzIHBlciByZW1vdmFsIHBvbGljeTpcXG4ke29iamVjdFRvU3RyaW5nKHByb3BlcnRpZXMpfWApXG4gICAgICAgIGF3YWl0IGRlbGV0ZUNlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgY2VydGlmaWNhdGVBcm4sIHByb3BlcnRpZXMpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgdHlwZWApXG59XG4iXX0=
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGUtcmVxdWVzdG9yLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jZXJ0aWZpY2F0ZS1yZXF1ZXN0b3IubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFnQztBQUNoQyxvREFZNEI7QUFDNUIsOERBUWlDO0FBQ2pDLG9EQUEwRjtBQUcxRixtQ0FRZ0I7QUFzQmhCLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBK0IsRUFBYyxFQUFFO0lBQ3RFLGtEQUFrRDtJQUNsRCxPQUFPLFVBQW1DLENBQUE7QUFDNUMsQ0FBQyxDQUFBO0FBRUQsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFdBQThCLEVBQThCLEVBQUU7SUFDbEcsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQTtJQUN6RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUssRUFBRSxHQUFHLENBQUMsY0FBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDbkgsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsR0FBRyxFQUFFLEVBQUU7Z0JBQ1AsZUFBZSxFQUFFO29CQUNmO3dCQUNFLEtBQUssRUFBRSxNQUFN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T0FBTztnQkFDTCxrQkFBa0IsRUFBRSxjQUFjO2dCQUNsQyxJQUFJLEVBQUU7b0JBQ0osR0FBRyxFQUFFLGNBQWM7aUJBQ3BCO2FBQ0YsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQXhEWSxRQUFBLE9BQU8sV0F3RG5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0bydcbmltcG9ydCB7XG4gIEFDTUNsaWVudCxcbiAgQWRkVGFnc1RvQ2VydGlmaWNhdGVDb21tYW5kLFxuICBBZGRUYWdzVG9DZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCxcbiAgQ2VydGlmaWNhdGVEZXRhaWwsXG4gIERlbGV0ZUNlcnRpZmljYXRlQ29tbWFuZCxcbiAgRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIERlc2NyaWJlQ2VydGlmaWNhdGVDb21tYW5kLFxuICBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0LFxuICBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kLFxuICBSZXF1ZXN0Q2VydGlmaWNhdGVDb21tYW5kSW5wdXQsXG4gIHdhaXRVbnRpbENlcnRpZmljYXRlVmFsaWRhdGVkLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtYWNtJ1xuaW1wb3J0IHtcbiAgQ2hhbmdlQWN0aW9uLFxuICBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kLFxuICBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kSW5wdXQsXG4gIEludmFsaWRDaGFuZ2VCYXRjaCxcbiAgUmVzb3VyY2VSZWNvcmRTZXQsXG4gIFJvdXRlNTNDbGllbnQsXG4gIHdhaXRVbnRpbFJlc291cmNlUmVjb3JkU2V0c0NoYW5nZWQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1yb3V0ZS01MydcbmltcG9ydCB7IEFzc3VtZVJvbGVDb21tYW5kLCBBc3N1bWVSb2xlQ29tbWFuZElucHV0LCBTVFNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3RzJ1xuaW1wb3J0IHR5cGUgeyBBd3NDcmVkZW50aWFsSWRlbnRpdHksIFByb3ZpZGVyIH0gZnJvbSAnQGF3cy1zZGsvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnXG5pbXBvcnQge1xuICBjbGVhbkNoYW5nZUlkLFxuICBjbGVhbkRvbWFpbk5hbWUsXG4gIGNvbnRhaW5zU2FtZSxcbiAgb2JqZWN0VG9TdHJpbmcsXG4gIG9yZGVyQnlTaWduaWZpY2FuY2UsXG4gIHN0cmluZ1RvQm9vbGVhbixcbiAgdHJ5Rm9yLFxufSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uSG9zdGVkWm9uZVByb3BlcnRpZXMgPSB7XG4gIERvbWFpbk5hbWU6IHN0cmluZ1xuICBIb3N0ZWRab25lSWQ6IHN0cmluZ1xuICBWYWxpZGF0aW9uUm9sZUFybj86IHN0cmluZ1xuICBWYWxpZGF0aW9uRXh0ZXJuYWxJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzID0ge1xuICBEb21haW5OYW1lOiBzdHJpbmdcbiAgQWx0ZXJuYXRpdmVEb21haW5OYW1lcz86IHN0cmluZ1tdXG4gIFZhbGlkYXRpb25Ib3N0ZWRab25lczogUmVjb3JkPHN0cmluZywgVmFsaWRhdGlvbkhvc3RlZFpvbmVQcm9wZXJ0aWVzPlxuICBDZXJ0aWZpY2F0ZVJlZ2lvbjogc3RyaW5nXG4gIENsZWFudXBWYWxpZGF0aW9uUmVjb3Jkczogc3RyaW5nXG4gIFRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkOiBzdHJpbmdcbiAgVGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgUmVtb3ZhbFBvbGljeTogc3RyaW5nXG59XG5cbnR5cGUgUm91dGU1M0ZhY3RvcnkgPSAocm9sZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkLCBleHRlcm5hbElkOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IFJvdXRlNTNDbGllbnRcblxuY29uc3QgcGFyc2VQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9wZXJ0aWVzID0+IHtcbiAgLy8gbWF5YmUgc2hvdWxkIGFjdHVhbGx5IHBhcnNlIGFuZCBub3QganVzdCBhc3N1bWVcbiAgcmV0dXJuIHByb3BlcnRpZXMgYXMgdW5rbm93biBhcyBQcm9wZXJ0aWVzXG59XG5cbmNvbnN0IHBhcnNlRG9tYWluVmFsaWRhdGlvblJlY29yZHMgPSAoY2VydGlmaWNhdGU6IENlcnRpZmljYXRlRGV0YWlsKTogUmVzb3VyY2VSZWNvcmRTZXRbXSB8IG51bGwgPT4ge1xuICBjb25zdCBvcHRpb25zID0gY2VydGlmaWNhdGUuRG9tYWluVmFsaWRhdGlvbk9wdGlvbnMgPz8gW11cbiAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHQpID0+IG9wdC5SZXNvdXJjZVJlY29yZD8uTmFtZSkpIHtcbiAgICBjb25zdCB1bmlxdWVSZWNvcmRzID0gWy4uLm5ldyBNYXAob3B0aW9ucy5tYXAoKG9wdCkgPT4gW29wdC5SZXNvdXJjZVJlY29yZD8uTmFtZSEsIG9wdC5SZXNvdXJjZVJlY29yZCFdKSkudmFsdWVzKCldXG4gICAgcmV0dXJuIHVuaXF1ZVJlY29yZHMubWFwKChyZWNvcmQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIE5hbWU6IHJlY29yZC5OYW1lLFxuICAgICAgICBUeXBlOiByZWNvcmQuVHlwZSxcbiAgICAgICAgVFRMOiAzMCxcbiAgICAgICAgUmVzb3VyY2VSZWNvcmRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgVmFsdWU6IHJlY29yZC5WYWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgY2hhbmdlUmVjb3JkU2V0cyA9IGFzeW5jIChcbiAgcm91dGU1MzogUm91dGU1M0NsaWVudCxcbiAgYWN0aW9uOiBDaGFuZ2VBY3Rpb24sXG4gIHJlY29yZHM6IFJlc291cmNlUmVjb3JkU2V0W10sXG4gIGhvc3RlZFpvbmVJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY2hhbmdlUmVjb3JkU2V0c0lucHV0OiBDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHNDb21tYW5kSW5wdXQgPSB7XG4gICAgSG9zdGVkWm9uZUlkOiBob3N0ZWRab25lSWQsXG4gICAgQ2hhbmdlQmF0Y2g6IHtcbiAgICAgIENoYW5nZXM6IHJlY29yZHMubWFwKChyZWNvcmQpID0+ICh7XG4gICAgICAgIEFjdGlvbjogYWN0aW9uLFxuICAgICAgICBSZXNvdXJjZVJlY29yZFNldDogcmVjb3JkLFxuICAgICAgfSkpLFxuICAgIH0sXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB7IENoYW5nZUluZm8gfSA9IGF3YWl0IHJvdXRlNTMuc2VuZChuZXcgQ2hhbmdlUmVzb3VyY2VSZWNvcmRTZXRzQ29tbWFuZChjaGFuZ2VSZWNvcmRTZXRzSW5wdXQpKVxuICAgIGNvbnN0IGNoYW5nZUlkID0gQ2hhbmdlSW5mbz8uSWQhXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FpdFVudGlsUmVzb3VyY2VSZWNvcmRTZXRzQ2hhbmdlZCh7IGNsaWVudDogcm91dGU1MywgbWF4V2FpdFRpbWU6IDE4MCB9LCB7IElkOiBjaGFuZ2VJZCB9KVxuICAgIGlmIChyZXN1bHQuc3RhdGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmFsaWRhdGlvbiByZWNvcmRzIG5ldmVyIGNoYW5nZWQgZm9yIGhvc3RlZCB6b25lICR7aG9zdGVkWm9uZUlkfTogWyR7cmVzdWx0LnN0YXRlfV0gJHtyZXN1bHQucmVhc29uID8/ICcnfWBcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gYWN0aW9uID09PSAnQ1JFQVRFJyB8fCBhY3Rpb24gPT09ICdVUFNFUlQnID8gJ2NoYW5nZWQnIDogJ2RlbGV0ZWQnXG4gICAgY29uc3QgY2hhbmdlID0gY2xlYW5DaGFuZ2VJZChjaGFuZ2VJZClcbiAgICBjb25zb2xlLmxvZyhgVmFsaWRhdGlvbiByZWNvcmRzIHN1Y2Nlc2Z1bGx5ICR7b3BlcmF0aW9ufSBmb3IgaG9zdGVkIHpvbmUgJHtob3N0ZWRab25lSWR9IHdpdGggY2hhbmdlIGlkICR7Y2hhbmdlfWApXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ0RFTEVURScgJiYgZXJyb3IgaW5zdGFuY2VvZiBJbnZhbGlkQ2hhbmdlQmF0Y2ggJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgIC8vIHRoZXJlJ3MgYSBkZWxldGlvbiByYWNlIGNvbmRpdGlvbiB3aGVyZSBzb21lIG90aGVyIGNlcnRpZmljYXRlIGhhcyBhbHJlYWR5IGRlbGV0ZWQgdGhlIHJlY29yZHNcbiAgICAgIGNvbnNvbGUubG9nKGBBbGwgdmFsaWRhdGlvbiByZWNvcmRzIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgYnkgc29tZSBvdGhlciBjZXJ0aWZpY2F0ZWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGdldFJlY29yZHNGb3Jab25lTmFtZXMgPSAoXG4gIHJlY29yZHM6IFJlc291cmNlUmVjb3JkU2V0W10sXG4gIHpvbmVOYW1lczogc3RyaW5nW10sXG4gIHJlc3VsdD86IFJlY29yZDxzdHJpbmcsIFJlc291cmNlUmVjb3JkU2V0W10+XG4pOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZVJlY29yZFNldFtdPiA9PiB7XG4gIGNvbnN0IFt6b25lTmFtZSwgLi4ucmVzdFpvbmVOYW1lc10gPSB6b25lTmFtZXNcbiAgaWYgKCF6b25lTmFtZSkge1xuICAgIHJldHVybiByZXN1bHQgPz8ge31cbiAgfVxuICBjb25zdCBtYXRjaGluZ1JlY29yZHM6IFJlc291cmNlUmVjb3JkU2V0W10gPSBbXVxuICBjb25zdCB1bm1hdGNoaW5nUmVjb3JkczogUmVzb3VyY2VSZWNvcmRTZXRbXSA9IFtdXG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICBjb25zdCBub3JtYWxpemVkUmVjb3JkTmFtZSA9IGNsZWFuRG9tYWluTmFtZShyZWNvcmQuTmFtZSEpXG4gICAgaWYgKG5vcm1hbGl6ZWRSZWNvcmROYW1lID09PSB6b25lTmFtZSB8fCBub3JtYWxpemVkUmVjb3JkTmFtZS5lbmRzV2l0aCgnLicgKyB6b25lTmFtZSkpIHtcbiAgICAgIG1hdGNoaW5nUmVjb3Jkcy5wdXNoKHJlY29yZClcbiAgICB9IGVsc2Uge1xuICAgICAgdW5tYXRjaGluZ1JlY29yZHMucHVzaChyZWNvcmQpXG4gICAgfVxuICB9XG4gIHJldHVybiBnZXRSZWNvcmRzRm9yWm9uZU5hbWVzKHVubWF0Y2hpbmdSZWNvcmRzLCByZXN0Wm9uZU5hbWVzLCB7XG4gICAgLi4uKHJlc3VsdCA/PyB7fSksXG4gICAgW3pvbmVOYW1lXTogbWF0Y2hpbmdSZWNvcmRzLFxuICB9KVxufVxuXG5jb25zdCByZXF1ZXN0Q2VydGlmaWNhdGUgPSBhc3luYyAoXG4gIGFjbTogQUNNQ2xpZW50LFxuICByb3V0ZTUzOiBSb3V0ZTUzRmFjdG9yeSxcbiAgcmVxdWVzdElkOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFByb3BlcnRpZXNcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHsgRG9tYWluTmFtZSwgQWx0ZXJuYXRpdmVEb21haW5OYW1lcywgVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgfSA9IHByb3BlcnRpZXNcblxuICBjb25zb2xlLmxvZyhgUmVxdWVzdGluZyBjZXJ0aWZpY2F0ZSBmb3IgJHtEb21haW5OYW1lfWApXG5cbiAgY29uc3QgcmVxdWVzdENlcnRpZmljYXRlSW5wdXQ6IFJlcXVlc3RDZXJ0aWZpY2F0ZUNvbW1hbmRJbnB1dCA9IHtcbiAgICBEb21haW5OYW1lLFxuICAgIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzOiBBbHRlcm5hdGl2ZURvbWFpbk5hbWVzLFxuICAgIElkZW1wb3RlbmN5VG9rZW46IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocmVxdWVzdElkKS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIDMyKSxcbiAgICBWYWxpZGF0aW9uTWV0aG9kOiAnRE5TJyxcbiAgICBPcHRpb25zOiB7XG4gICAgICBDZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUxvZ2dpbmdQcmVmZXJlbmNlOiBUcmFuc3BhcmVuY3lMb2dnaW5nRW5hYmxlZCA/ICdFTkFCTEVEJyA6ICdESVNBQkxFRCcsXG4gICAgfSxcbiAgfVxuICBjb25zdCB7IENlcnRpZmljYXRlQXJuIH0gPSBhd2FpdCBhY20uc2VuZChuZXcgUmVxdWVzdENlcnRpZmljYXRlQ29tbWFuZChyZXF1ZXN0Q2VydGlmaWNhdGVJbnB1dCkpXG5cbiAgY29uc29sZS5sb2coYENlcnRpZmljYXRlICR7Q2VydGlmaWNhdGVBcm59IHJlcXVlc3RlZGApXG5cbiAgY29uc3QgdmFsaWRhdGlvbk1heFNlY29uZHMgPSAxODBcbiAgY29uc3QgdmFsaWRhdGlvblRpbWVvdXRFcnJvciA9IGBEb21haW4gdmFsaWRhdGlvbiBvcHRpb25zIHdlcmUgbm90IGZvdW5kIGluICR7dmFsaWRhdGlvbk1heFNlY29uZHN9IHNlY29uZHNgXG4gIGNvbnN0IHZhbGlkYXRpb25SZWNvcmRzID0gYXdhaXQgdHJ5Rm9yKHZhbGlkYXRpb25NYXhTZWNvbmRzLCB2YWxpZGF0aW9uVGltZW91dEVycm9yLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0OiBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgICAgQ2VydGlmaWNhdGVBcm4sXG4gICAgfVxuICAgIGNvbnN0IHsgQ2VydGlmaWNhdGUgfSA9IGF3YWl0IGFjbS5zZW5kKG5ldyBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZChkZXNjcmliZUNlcnRpZmljYXRlSW5wdXQpKVxuICAgIHJldHVybiBwYXJzZURvbWFpblZhbGlkYXRpb25SZWNvcmRzKENlcnRpZmljYXRlISlcbiAgfSlcblxuICBjb25zdCBob3N0ZWRab25lcyA9IE9iamVjdC52YWx1ZXMocHJvcGVydGllcy5WYWxpZGF0aW9uSG9zdGVkWm9uZXMpXG4gIGNvbnN0IGhvc3RlZFpvbmVJZHMgPSBob3N0ZWRab25lcy5tYXAoKHpvbmUpID0+IHpvbmUuSG9zdGVkWm9uZUlkKVxuXG4gIGNvbnNvbGUubG9nKFxuICAgIGBVcHNlcnRpbmcgJHt2YWxpZGF0aW9uUmVjb3Jkcy5sZW5ndGh9IHZhbGlkYXRpb24gcmVjb3JkKHMpIGludG8gaG9zdGVkIHpvbmUocykgJHtob3N0ZWRab25lSWRzLmpvaW4oJywgJyl9OmBcbiAgKVxuICB2YWxpZGF0aW9uUmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+XG4gICAgY29uc29sZS5sb2coYCR7cmVjb3JkLk5hbWV9ICR7cmVjb3JkLlR5cGV9ICR7cmVjb3JkLlJlc291cmNlUmVjb3Jkcz8ubWFwKChycikgPT4gcnIuVmFsdWUpLmpvaW4oJywnKX1gKVxuICApXG5cbiAgY29uc3QgcmVjb3Jkc0ZvclpvbmVOYW1lcyA9IGdldFJlY29yZHNGb3Jab25lTmFtZXMoXG4gICAgdmFsaWRhdGlvblJlY29yZHMsXG4gICAgb3JkZXJCeVNpZ25pZmljYW5jZShPYmplY3Qua2V5cyhwcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcykpXG4gIClcbiAgZm9yIChjb25zdCBob3N0ZWRab25lIG9mIGhvc3RlZFpvbmVzKSB7XG4gICAgY29uc3QgcmVjb3JkcyA9IHJlY29yZHNGb3Jab25lTmFtZXNbaG9zdGVkWm9uZS5Eb21haW5OYW1lXVxuICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IGNoYW5nZVJlY29yZFNldHMoXG4gICAgICAgIHJvdXRlNTMoaG9zdGVkWm9uZS5WYWxpZGF0aW9uUm9sZUFybiwgaG9zdGVkWm9uZS5WYWxpZGF0aW9uRXh0ZXJuYWxJZCksXG4gICAgICAgICdVUFNFUlQnLFxuICAgICAgICByZWNvcmRzLFxuICAgICAgICBob3N0ZWRab25lLkhvc3RlZFpvbmVJZFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBXYWl0aW5nIGZvciBjZXJ0aWZpY2F0ZSAke0NlcnRpZmljYXRlQXJufSB0byB2YWxpZGF0ZWApXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhaXRVbnRpbENlcnRpZmljYXRlVmFsaWRhdGVkKHsgY2xpZW50OiBhY20sIG1heFdhaXRUaW1lOiAzMDAgfSwgeyBDZXJ0aWZpY2F0ZUFybiB9KVxuICBpZiAocmVzdWx0LnN0YXRlICE9PSAnU1VDQ0VTUycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENlcnRpZmljYXRlIGZhaWxlZCAke0NlcnRpZmljYXRlQXJufSB0byB2YWxpZGF0ZTogWyR7cmVzdWx0LnN0YXRlfV0gJHtyZXN1bHQucmVhc29uID8/ICcnfWApXG4gIH1cbiAgY29uc29sZS5sb2coYENlcnRpZmljYXRlICR7Q2VydGlmaWNhdGVBcm59IHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWRgKVxuICByZXR1cm4gQ2VydGlmaWNhdGVBcm4hXG59XG5cbmNvbnN0IGRlbGV0ZUNlcnRpZmljYXRlID0gYXN5bmMgKFxuICBhY206IEFDTUNsaWVudCxcbiAgcm91dGU1MzogUm91dGU1M0ZhY3RvcnksXG4gIGNlcnRpZmljYXRlQXJuOiBzdHJpbmcsXG4gIHByb3BlcnRpZXM6IFByb3BlcnRpZXNcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zb2xlLmxvZyhgV2FpdGluZyBmb3IgY2VydGlmaWNhdGUgJHtjZXJ0aWZpY2F0ZUFybn0gdXNhZ2UgdG8gZHJhaW4gYmVmb3JlIGRlbGV0aW9uYClcblxuICBjb25zdCB3YWl0VXNhZ2VNYXhTZWNvbmRzID0gNjAwXG4gIGNvbnN0IHdhaXRVc2FnZVRpbWVvdXRFcnJvciA9IGBDZXJ0aWZpY2F0ZSB3YXMgc3RpbGwgaW4gdXNlIGFmdGVyICR7d2FpdFVzYWdlTWF4U2Vjb25kc30gc2Vjb25kc2BcbiAgY29uc3QgY2VydGlmaWNhdGUgPSBhd2FpdCB0cnlGb3Iod2FpdFVzYWdlTWF4U2Vjb25kcywgd2FpdFVzYWdlVGltZW91dEVycm9yLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0OiBEZXNjcmliZUNlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgICAgQ2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuLFxuICAgIH1cbiAgICBjb25zdCB7IENlcnRpZmljYXRlIH0gPSBhd2FpdCBhY20uc2VuZChuZXcgRGVzY3JpYmVDZXJ0aWZpY2F0ZUNvbW1hbmQoZGVzY3JpYmVDZXJ0aWZpY2F0ZUlucHV0KSlcbiAgICBjb25zdCBpblVzZUJ5ID0gQ2VydGlmaWNhdGU/LkluVXNlQnkgPz8gW11cbiAgICBpZiAoaW5Vc2VCeS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gQ2VydGlmaWNhdGUhXG4gIH0pXG4gIGNvbnNvbGUubG9nKCdDZXJ0aWZpY2F0ZSBpcyB1bnVzZWQgYW5kIHdpbGwgYmUgZGVsZXRlZCcpXG5cbiAgY29uc3QgdmFsaWRhdGlvblJlY29yZHMgPSBwYXJzZURvbWFpblZhbGlkYXRpb25SZWNvcmRzKGNlcnRpZmljYXRlKVxuICBpZiAodmFsaWRhdGlvblJlY29yZHMgJiYgc3RyaW5nVG9Cb29sZWFuKHByb3BlcnRpZXMuQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzKSkge1xuICAgIGNvbnN0IGhvc3RlZFpvbmVzID0gT2JqZWN0LnZhbHVlcyhwcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcylcbiAgICBjb25zdCBob3N0ZWRab25lSWRzID0gaG9zdGVkWm9uZXMubWFwKCh6b25lKSA9PiB6b25lLkhvc3RlZFpvbmVJZClcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYERlbGV0aW5nICR7dmFsaWRhdGlvblJlY29yZHMubGVuZ3RofSB2YWxpZGF0aW9uIHJlY29yZChzKSBmcm9tIGhvc3RlZCB6b25lKHMpICR7aG9zdGVkWm9uZUlkcy5qb2luKCcsICcpfWBcbiAgICApXG5cbiAgICBjb25zdCByZWNvcmRzRm9yWm9uZU5hbWVzID0gZ2V0UmVjb3Jkc0ZvclpvbmVOYW1lcyhcbiAgICAgIHZhbGlkYXRpb25SZWNvcmRzLFxuICAgICAgb3JkZXJCeVNpZ25pZmljYW5jZShPYmplY3Qua2V5cyhwcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcykpXG4gICAgKVxuICAgIGZvciAoY29uc3QgaG9zdGVkWm9uZSBvZiBob3N0ZWRab25lcykge1xuICAgICAgY29uc3QgcmVjb3JkcyA9IHJlY29yZHNGb3Jab25lTmFtZXNbaG9zdGVkWm9uZS5Eb21haW5OYW1lXVxuICAgICAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBjaGFuZ2VSZWNvcmRTZXRzKFxuICAgICAgICAgIHJvdXRlNTMoaG9zdGVkWm9uZS5WYWxpZGF0aW9uUm9sZUFybiwgaG9zdGVkWm9uZS5WYWxpZGF0aW9uRXh0ZXJuYWxJZCksXG4gICAgICAgICAgJ0RFTEVURScsXG4gICAgICAgICAgcmVjb3JkcyxcbiAgICAgICAgICBob3N0ZWRab25lLkhvc3RlZFpvbmVJZFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coYERlbGV0aW5nIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59IGZyb20gQUNNYClcbiAgY29uc3QgZGVsZXRlQ2VydGlmaWNhdGVJbnB1dDogRGVsZXRlQ2VydGlmaWNhdGVDb21tYW5kSW5wdXQgPSB7XG4gICAgQ2VydGlmaWNhdGVBcm46IGNlcnRpZmljYXRlQXJuLFxuICB9XG4gIGF3YWl0IGFjbS5zZW5kKG5ldyBEZWxldGVDZXJ0aWZpY2F0ZUNvbW1hbmQoZGVsZXRlQ2VydGlmaWNhdGVJbnB1dCkpXG4gIGNvbnNvbGUubG9nKGBDZXJ0aWZpY2F0ZSAke2NlcnRpZmljYXRlQXJufSBzdWNjZXNzZnVsbHkgZGVsZXRlZGApXG59XG5cbmNvbnN0IGFkZFRhZ3MgPSBhc3luYyAoYWNtOiBBQ01DbGllbnQsIGNlcnRpZmljYXRlQXJuOiBzdHJpbmcsIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHtcbiAgY29uc3QgdGFnTGlzdCA9IEFycmF5LmZyb20oT2JqZWN0LmVudHJpZXModGFncykubWFwKChbS2V5LCBWYWx1ZV0pID0+ICh7IEtleSwgVmFsdWUgfSkpKVxuICBjb25zdCBhZGRUYWdzSW5wdXQ6IEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZElucHV0ID0ge1xuICAgIENlcnRpZmljYXRlQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICBUYWdzOiB0YWdMaXN0LFxuICB9XG5cbiAgY29uc29sZS5sb2coYEFkZGluZyAke3RhZ0xpc3QubGVuZ3RofSB0YWdzIHRvIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59YClcbiAgYXdhaXQgYWNtLnNlbmQobmV3IEFkZFRhZ3NUb0NlcnRpZmljYXRlQ29tbWFuZChhZGRUYWdzSW5wdXQpKVxuICBjb25zb2xlLmxvZyhgQWxsIHRhZ3Mgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIGNlcnRpZmljYXRlICR7Y2VydGlmaWNhdGVBcm59YClcbn1cblxuY29uc3Qgc2hvdWxkUmVxdWVzdE5ldyA9IChvbGRQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG9sZEhvc3RlZFpvbmVJZHMgPSBPYmplY3QudmFsdWVzKG9sZFByb3BlcnRpZXMuVmFsaWRhdGlvbkhvc3RlZFpvbmVzID8/IHt9KS5tYXAoKHpvbmUpID0+IHpvbmUuSG9zdGVkWm9uZUlkKVxuICBjb25zdCBuZXdIb3N0ZWRab25lSWRzID0gT2JqZWN0LnZhbHVlcyhuZXdQcm9wZXJ0aWVzLlZhbGlkYXRpb25Ib3N0ZWRab25lcyA/PyB7fSkubWFwKCh6b25lKSA9PiB6b25lLkhvc3RlZFpvbmVJZClcbiAgaWYgKCFjb250YWluc1NhbWUob2xkSG9zdGVkWm9uZUlkcywgbmV3SG9zdGVkWm9uZUlkcykpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLkRvbWFpbk5hbWUgIT09IG5ld1Byb3BlcnRpZXMuRG9tYWluTmFtZSkgcmV0dXJuIHRydWVcbiAgaWYgKCFjb250YWluc1NhbWUob2xkUHJvcGVydGllcy5BbHRlcm5hdGl2ZURvbWFpbk5hbWVzID8/IFtdLCBuZXdQcm9wZXJ0aWVzLkFsdGVybmF0aXZlRG9tYWluTmFtZXMgPz8gW10pKSByZXR1cm4gdHJ1ZVxuICBpZiAob2xkUHJvcGVydGllcy5DZXJ0aWZpY2F0ZVJlZ2lvbiAhPT0gbmV3UHJvcGVydGllcy5DZXJ0aWZpY2F0ZVJlZ2lvbikgcmV0dXJuIHRydWVcbiAgaWYgKG9sZFByb3BlcnRpZXMuQ2xlYW51cFZhbGlkYXRpb25SZWNvcmRzICE9PSBuZXdQcm9wZXJ0aWVzLkNsZWFudXBWYWxpZGF0aW9uUmVjb3JkcykgcmV0dXJuIHRydWVcbiAgaWYgKG9sZFByb3BlcnRpZXMuVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgIT09IG5ld1Byb3BlcnRpZXMuVHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQpIHJldHVybiB0cnVlXG4gIGlmIChvbGRQcm9wZXJ0aWVzLlJlbW92YWxQb2xpY3kgIT09IG5ld1Byb3BlcnRpZXMuUmVtb3ZhbFBvbGljeSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IGFzc3VtZVJvbGUgPSAoXG4gIHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZXh0ZXJuYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm92aWRlcjxBd3NDcmVkZW50aWFsSWRlbnRpdHk+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFyb2xlQXJuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RzID0gbmV3IFNUU0NsaWVudCh7IHJldHJ5TW9kZTogJ2FkYXB0aXZlJyB9KVxuICAgIGNvbnN0IGFzc3VtZVJvbGVJbnB1dDogQXNzdW1lUm9sZUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgIFJvbGVBcm46IHJvbGVBcm4sXG4gICAgICBSb2xlU2Vzc2lvbk5hbWU6ICdDZXJ0aWZpY2F0ZVJlcXVlc3RvcicsXG4gICAgICBFeHRlcm5hbElkOiBleHRlcm5hbElkLFxuICAgIH1cbiAgICBjb25zdCB7IENyZWRlbnRpYWxzIH0gPSBhd2FpdCBzdHMuc2VuZChuZXcgQXNzdW1lUm9sZUNvbW1hbmQoYXNzdW1lUm9sZUlucHV0KSlcbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzS2V5SWQ6IENyZWRlbnRpYWxzPy5BY2Nlc3NLZXlJZCEsXG4gICAgICBzZWNyZXRBY2Nlc3NLZXk6IENyZWRlbnRpYWxzPy5TZWNyZXRBY2Nlc3NLZXkhLFxuICAgICAgc2Vzc2lvblRva2VuOiBDcmVkZW50aWFscz8uU2Vzc2lvblRva2VuISxcbiAgICAgIGV4cGlyYXRpb246IENyZWRlbnRpYWxzPy5FeHBpcmF0aW9uLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50KSA9PiB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBwYXJzZVByb3BlcnRpZXMoZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzKVxuXG4gIGNvbnN0IGFjbSA9IG5ldyBBQ01DbGllbnQoeyByZWdpb246IHByb3BlcnRpZXMuQ2VydGlmaWNhdGVSZWdpb24sIHJldHJ5TW9kZTogJ2FkYXB0aXZlJyB9KVxuICBjb25zdCByb3V0ZTUzID0gKHJvbGVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCwgZXh0ZXJuYWxJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUm91dGU1M0NsaWVudCA9PiB7XG4gICAgcmV0dXJuIG5ldyBSb3V0ZTUzQ2xpZW50KHtcbiAgICAgIHJldHJ5TW9kZTogJ2FkYXB0aXZlJyxcbiAgICAgIGNyZWRlbnRpYWxzOiBhc3N1bWVSb2xlKHJvbGVBcm4sIGV4dGVybmFsSWQpLFxuICAgIH0pXG4gIH1cblxuICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgY2FzZSAnQ3JlYXRlJzoge1xuICAgICAgY29uc29sZS5sb2coYFJlcXVlc3RpbmcgbmV3IGNlcnRpZmljYXRlOlxcbiR7b2JqZWN0VG9TdHJpbmcocHJvcGVydGllcyl9YClcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlQXJuID0gYXdhaXQgcmVxdWVzdENlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgZXZlbnQuUmVxdWVzdElkLCBwcm9wZXJ0aWVzKVxuICAgICAgaWYgKHByb3BlcnRpZXMuVGFncyAmJiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLlRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgYWRkVGFncyhhY20sIGNlcnRpZmljYXRlQXJuLCBwcm9wZXJ0aWVzLlRhZ3MpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnVXBkYXRlJzoge1xuICAgICAgbGV0IGNlcnRpZmljYXRlQXJuID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkXG4gICAgICBpZiAoc2hvdWxkUmVxdWVzdE5ldyhwYXJzZVByb3BlcnRpZXMoZXZlbnQuT2xkUmVzb3VyY2VQcm9wZXJ0aWVzKSwgcHJvcGVydGllcykpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlcXVlc3RpbmcgbmV3IGNlcnRpZmljYXRlIGR1ZSB0byBjaGFuZ2Ugb2YgcHJvcGVydGllczpcXG4ke29iamVjdFRvU3RyaW5nKHByb3BlcnRpZXMpfWApXG4gICAgICAgIGNlcnRpZmljYXRlQXJuID0gYXdhaXQgcmVxdWVzdENlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgZXZlbnQuUmVxdWVzdElkLCBwcm9wZXJ0aWVzKVxuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnRpZXMuVGFncyAmJiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzLlRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgYWRkVGFncyhhY20sIGNlcnRpZmljYXRlQXJuLCBwcm9wZXJ0aWVzLlRhZ3MpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgY29uc3QgY2VydGlmaWNhdGVBcm4gPSBldmVudC5QaHlzaWNhbFJlc291cmNlSWRcbiAgICAgIGlmIChwcm9wZXJ0aWVzLlJlbW92YWxQb2xpY3kgPT09ICdkZXN0cm95Jykge1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgb2xkIGNlcnRpZmljYXRlIGFzIHBlciByZW1vdmFsIHBvbGljeTpcXG4ke29iamVjdFRvU3RyaW5nKHByb3BlcnRpZXMpfWApXG4gICAgICAgIGF3YWl0IGRlbGV0ZUNlcnRpZmljYXRlKGFjbSwgcm91dGU1MywgY2VydGlmaWNhdGVBcm4sIHByb3BlcnRpZXMpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGNlcnRpZmljYXRlQXJuLFxuICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgQXJuOiBjZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgdHlwZWApXG59XG4iXX0=
|
|
@@ -223,5 +223,5 @@ class DnsValidatedCertificate extends cdk.Resource {
|
|
|
223
223
|
}
|
|
224
224
|
exports.DnsValidatedCertificate = DnsValidatedCertificate;
|
|
225
225
|
_a = JSII_RTTI_SYMBOL_1;
|
|
226
|
-
DnsValidatedCertificate[_a] = { fqn: "@trautonen/cdk-dns-validated-certificate.DnsValidatedCertificate", version: "0.1.
|
|
226
|
+
DnsValidatedCertificate[_a] = { fqn: "@trautonen/cdk-dns-validated-certificate.DnsValidatedCertificate", version: "0.1.23" };
|
|
227
227
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXZhbGlkYXRlZC1jZXJ0aWZpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kbnMtdmFsaWRhdGVkLWNlcnRpZmljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHlEQUF3RDtBQUN4RCwyQ0FBMEM7QUFDMUMsaURBQWdEO0FBRWhELGlFQUFnRTtBQUVoRSxxRkFBK0U7QUFFL0UsbUNBQWdHO0FBaUhoRyxNQUFNLDhCQUE4QixHQUFHLGlDQUFpQyxDQUFBO0FBQ3hFLE1BQU0sMEJBQTBCLEdBQUcsc0NBQXNDLENBQUE7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUVHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxHQUFHLENBQUMsUUFBUTtJQWF2RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM3RCxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQ3pGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUNoRCxDQUFBO1FBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFbEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQTtRQUNyRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FB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QU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUN2RCxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztTQUMvQyxDQUFDLENBQUE7UUFDRixPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUMzRixDQUFDO0lBRU8sNEJBQTRCLENBQUMsV0FBcUIsRUFBRSxTQUFtQjtRQUM3RSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUE7UUFDM0IsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDM0YsSUFBSSxvQkFBb0IsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoSCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsVUFBVSxpREFBaUQsQ0FBQyxDQUFBO1lBQ3BGLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDOztBQTlMSCwwREErTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInXG5pbXBvcnQgKiBhcyBjZXJ0aWZpY2F0ZW1hbmFnZXIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcidcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSdcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJ1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1MydcbmltcG9ydCAqIGFzIGN1c3RvbV9yZXNvdXJjZXMgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcydcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnXG5pbXBvcnQgeyBDZXJ0aWZpY2F0ZVJlcXVlc3RvckZ1bmN0aW9uIH0gZnJvbSAnLi9jZXJ0aWZpY2F0ZS1yZXF1ZXN0b3ItZnVuY3Rpb24nXG5pbXBvcnQgeyBQcm9wZXJ0aWVzLCBWYWxpZGF0aW9uSG9zdGVkWm9uZVByb3BlcnRpZXMgfSBmcm9tICcuL2NlcnRpZmljYXRlLXJlcXVlc3Rvci5sYW1iZGEnXG5pbXBvcnQgeyBib29sZWFuVG9TdHJpbmcsIGNsZWFuRG9tYWluTmFtZSwgY2xlYW5Ib3N0ZWRab25lSWQsIG1hdGNoTmFtZXNUb1pvbmVzIH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uSG9zdGVkWm9uZSB7XG4gIC8qKlxuICAgKiBIb3N0ZWQgem9uZSB0byB1c2UgZm9yIEROUyB2YWxpZGF0aW9uLiBUaGUgem9uZSBuYW1lIGlzIG1hdGNoZWQgdG8gZG9tYWluIG5hbWUgdG8gdXNlIHRoZSByaWdodFxuICAgKiBob3N0ZWQgem9uZSBmb3IgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogSWYgdGhlIGhvc3RlZCB6b25lIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBDREsgYXBwbGljYXRpb24sIGl0IG5lZWRzIHRvIGJlIHByb3ZpZGVkIHZpYVxuICAgKiBgYEhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKClgYC5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmU6IHJvdXRlNTMuSUhvc3RlZFpvbmVcblxuICAvKipcbiAgICogVGhlIHJvbGUgdGhhdCBpcyBhc3N1bWVkIGZvciBETlMgcmVjb3JkIGNoYW5nZXMgZm9yIGNlcnRpZmljYXRlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFRoaXMgcm9sZSBzaG91bGQgZXhpc3QgaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgaG9zdGVkIHpvbmUgYW5kIGluY2x1ZGUgcGVybWlzc2lvbnMgdG8gY2hhbmdlIHRoZSBETlMgcmVjb3Jkc1xuICAgKiBmb3IgdGhlIGdpdmVuIGBgaG9zdGVkWm9uZWBgLiBUaGUgYGBjdXN0b21SZXNvdXJjZVJvbGVgYCBvciB0aGUgZGVmYXVsdCBleGVjdXRpb24gcm9sZSBpcyBnaXZlbiBwZXJtaXNzaW9uIHRvXG4gICAqIGFzc3VtZSB0aGlzIHJvbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc2VwYXJhdGUgcm9sZSBmb3IgRE5TIHJlY29yZCBjaGFuZ2VzLiBUaGUgZ2l2ZW4gY3VzdG9tUmVzb3VyY2VSb2xlIG9yIHRoZSBkZWZhdWx0IHJvbGUgaXMgdXNlZFxuICAgKiBmb3IgRE5TIHJlY29yZCBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvblJvbGU/OiBpYW0uSVJvbGVcblxuICAvKipcbiAgICogRXh0ZXJuYWwgaWQgZm9yIGBgdmFsaWRhdGlvblJvbGVgYCByb2xlIGFzc3VtZSB2ZXJpZmljYXRpb24uXG4gICAqXG4gICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIGBgdmFsaWRhdGlvblJvbGVgYCBpcyBnaXZlbiBhbmQgdGhlIHJvbGUgZXhwZWN0cyBhbiBleHRlcm5hbCBpZCBwcm92aWRlZCBvbiBhc3N1bWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXh0ZXJuYWwgaWQgcHJvdmlkZWQgZHVyaW5nIGFzc3VtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRpb25FeHRlcm5hbElkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGVQcm9wcyB7XG4gIC8qKlxuICAgKiBGdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgdG8gcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZvci5cbiAgICpcbiAgICogTWF5IGNvbnRhaW4gd2lsZGNhcmRzLCBzdWNoIGFzIGBgKi5kb21haW4uY29tYGAuXG4gICAqL1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogRnVsbHktcXVhbGlmaWVkIGFsdGVybmF0aXZlIGRvbWFpbiBuYW1lcyB0byByZXF1ZXN0IGEgY2VydGlmaWNhdGUgZm9yLlxuICAgKlxuICAgKiBNYXkgY29udGFpbiB3aWxkY2FyZHMsIHN1Y2ggYXMgYGAqLm90aGVyZG9tYWluLmNvbWBgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWx0ZXJuYXRpdmVEb21haW5OYW1lcz86IHN0cmluZ1tdXG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgaG9zdGVkIHpvbmVzIHRvIHVzZSBmb3IgdmFsaWRhdGlvbi4gSG9zdGVkIHpvbmVzIGFyZSBtYXBwZWQgdG8gZG9tYWluIG5hbWVzIGJ5IHRoZSB6b25lIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0aW9uSG9zdGVkWm9uZXM6IFZhbGlkYXRpb25Ib3N0ZWRab25lW11cblxuICAvKipcbiAgICogQVdTIHJlZ2lvbiB3aGVyZSB0aGUgY2VydGlmaWNhdGUgaXMgZGVwbG95ZWQuXG4gICAqXG4gICAqIFlvdSBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGBgQ2VydGlmaWNhdGVgYCBjb25zdHJ1Y3QgaW5zdGVhZCBpZiB0aGUgcmVnaW9uIGlzIHNhbWUgYXMgdGhlIHN0YWNrJ3MgYW5kIHRoZSBob3N0ZWRcbiAgICogem9uZSBpcyBpbiB0aGUgc2FtZSBhY2NvdW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNhbWUgcmVnaW9uIGFzIHRoZSBzdGFjay5cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlUmVnaW9uPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGN1c3RvbSByZXNvdXJjZSBMYW1iZGEgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBUaGUgcm9sZSBpcyBnaXZlbiBwZXJtaXNzaW9ucyB0byByZXF1ZXN0IGNlcnRpZmljYXRlcyBmcm9tIEFDTS4gSWYgdGhlcmUgYXJlIGFueSBgYHZhbGlkYXRpb25Sb2xlYGBzIHByb3ZpZGVkLFxuICAgKiB0aGlzIHJvbGUgaXMgYWxzbyBnaXZlbiBwZXJtaXNzaW9uIHRvIGFzc3VtZSB0aGUgYGB2YWxpZGF0aW9uUm9sZWBgLiBPdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBob3N0ZWQgem9uZVxuICAgKiBpcyBpbiBzYW1lIGFjY291bnQgYW5kIHRoZSBleGVjdXRpb24gcm9sZSBpcyBnaXZlbiBwZXJtaXNzaW9ucyB0byBjaGFuZ2UgRE5TIHJlY29yZHMgZm9yIHRoZSBnaXZlbiBgYGRvbWFpbk5hbWVgYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBMYW1iZGEgY3JlYXRlcyBhIGRlZmF1bHQgZXhlY3V0aW9uIHJvbGUuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21SZXNvdXJjZVJvbGU/OiBpYW0uSVJvbGVcblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgY2xlYW5pbmcgb2YgdmFsaWRhdGlvbiBETlMgcmVjb3JkcyBmcm9tIHRoZSBob3N0ZWQgem9uZS5cbiAgICpcbiAgICogSWYgdGhlcmUncyBtdWx0aXBsZSBjZXJ0aWZpY2F0ZXMgY3JlYXRlZCBmb3Igc2FtZSBkb21haW4sIGl0IGlzIHBvc3NpYmxlIHRvIGVuY291dGVyIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgc29tZVxuICAgKiBjZXJ0aWZpY2F0ZSBpcyByZW1vdmVkIGFuZCBhbm90aGVyIGNlcnRpZmljYXRlIHdvdWxkIG5lZWQgdGhlIHNhbWUgdmFsaWRhdGlvbiByZWNvcmQuIFByZWZlciBzaW5nbGUgY2VydGlmaWNhdGVcbiAgICogZm9yIGEgZG9tYWluIG9yIHNldCB0aGlzIHRvIGZhbHNlIGFuZCBjbGVhbnVwIHJlY29yZHMgbWFudWFsbHkgd2hlbiBub3QgbmVlZGVkIGFueW1vcmUuIElmIHlvdSBjaGFuZ2UgdGhpc1xuICAgKiBwcm9wZXJ0eSBhZnRlciBjcmVhdGlvbiwgYSBuZXcgY2VydGlmaWNhdGUgd2lsbCBiZSByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXBWYWxpZGF0aW9uUmVjb3Jkcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogRW5hYmxlIG9yIGRpc2FibGUgdHJhbnNwYXJlbmN5IGxvZ2dpbmcgZm9yIHRoaXMgY2VydGlmaWNhdGUuXG4gICAqXG4gICAqIE9uY2UgYSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiBsb2dnZWQsIGl0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGxvZy4gT3B0aW5nIG91dCBhdCB0aGF0IHBvaW50IHdpbGwgaGF2ZSBub1xuICAgKiBlZmZlY3QuIElmIHlvdSBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSBhZnRlciBjcmVhdGlvbiwgYSBuZXcgY2VydGlmaWNhdGUgd2lsbCBiZSByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FjbS9sYXRlc3QvdXNlcmd1aWRlL2FjbS1iZXN0cHJhY3RpY2VzLmh0bWwjYmVzdC1wcmFjdGljZXMtdHJhbnNwYXJlbmN5XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgZ2l2ZW4gcmVtb3ZhbCBwb2xpY3kgdG8gdGhpcyByZXNvdXJjZS5cbiAgICpcbiAgICogVGhlIHJlbW92YWwgcG9saWN5IGNvbnRyb2xzIHdoYXQgaGFwcGVucyB0byB0aGlzIHJlc291cmNlIHdoZW4gaXQgc3RvcHMgYmVpbmcgbWFuYWdlZCBieSBDbG91ZEZvcm1hdGlvbiwgZWl0aGVyXG4gICAqIGJlY2F1c2UgeW91J3ZlIHJlbW92ZWQgaXQgZnJvbSB0aGUgQ0RLIGFwcGxpY2F0aW9uIG9yIGJlY2F1c2UgeW91J3ZlIG1hZGUgYSBjaGFuZ2UgdGhhdCByZXF1aXJlcyB0aGUgcmVzb3VyY2UgdG9cbiAgICogYmUgcmVwbGFjZWQuIFRoZSByZXNvdXJjZSBjYW4gYmUgZGVsZXRlZCAoYGBSZW1vdmFsUG9saWN5LkRFU1RST1lgYCksIG9yIGxlZnQgaW4geW91ciBBV1MgYWNjb3VudCBmb3IgZGF0YVxuICAgKiByZWNvdmVyeSBhbmQgY2xlYW51cCBsYXRlciAoYGBSZW1vdmFsUG9saWN5LlJFVEFJTmBgKS4gSWYgeW91IGNoYW5nZSB0aGlzIHByb3BlcnR5IGFmdGVyIGNyZWF0aW9uLCBhIG5ld1xuICAgKiBjZXJ0aWZpY2F0ZSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5ERVNUUk9ZXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3lcbn1cblxuY29uc3QgRE5TX1ZBTElEQVRFRF9DRVJUSUZJQ0FURV9UWVBFID0gJ0N1c3RvbTo6RG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUnXG5jb25zdCBDRVJUVElGSUNBVEVfUkVTT1VSQ0VfVFlQRSA9ICdBV1M6OkNlcnRpZmljYXRlTWFuYWdlcjo6Q2VydGlmaWNhdGUnXG5cbi8qKlxuICogQSBjZXJ0aWZpY2F0ZSBtYW5hZ2VkIGJ5IEFXUyBDZXJ0aWZpY2F0ZSBNYW5hZ2VyLiBXaWxsIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHVzaW5nIEROUyB2YWxpZGF0aW9uIGFnYWluc3QgdGhlXG4gKiBzcGVjaWZpZWQgUm91dGUgNTMgaG9zdGVkIHpvbmUuIFRoaXMgY29uc3RydWN0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGNyb3NzLXJlZ2lvbiBvciBjcm9zcy1hY2NvdW50IGNlcnRpZmljYXRlXG4gKiB2YWxpZGF0aW9ucy4gVGhlIGRlZmF1bHQgYGBDZXJ0aWZpY2F0ZWBgIGNvbnN0cnVjdCBpcyBiZXR0ZXIgaW4gY2FzZXMgd2hlcmUgZXZlcnl0aGluZyBpcyBtYW5hZ2VkIGJ5IHRoZSBDREtcbiAqIGFwcGxpY2F0aW9uLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3QgZG9lcyBub3Qgc3VwcG9ydCBhbHRlcm5hdGl2ZSBuYW1lcyB5ZXQgYXMgaXQgd291bGQgcmVxdWlyZSBkb21haW4gdG8gcm9sZSBtYXBwaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyAjIyMgQ3Jvc3MtcmVnaW9uIGNlcnRpZmljYXRlIHZhbGlkYXRpb25cbiAqIC8vIGhvc3RlZCB6b25lIG1hbmFnZWQgYnkgdGhlIENESyBhcHBsaWNhdGlvblxuICogY29uc3QgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZSA9IC4uLlxuICogLy8gbm8gc2VwYXJhdGUgdmFsaWRhdGlvbiByb2xlIGlzIG5lZWRlZFxuICogY29uc3QgY2VydGlmaWNhdGUgPSBuZXcgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUodGhpcywgJ0Nyb3NzUmVnaW9uQ2VydGlmaWNhdGUnLCB7XG4gKiAgIGRvbWFpbk5hbWU6ICdleGFtcGxlLmNvbScsICAgICAvLyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgaG9zdGVkIHpvbmVcbiAqICAgdmFsaWRhdGlvbkhvc3RlZFpvbmVzOiBbeyAgICAgIC8vIGhvc3RlZCB6b25lIHVzZWQgd2l0aCB0aGUgZXhlY3V0aW9uIHJvbGUncyBwZXJtaXNzaW9uc1xuICogICAgIGhvc3RlZFpvbmU6IGhvc3RlZFpvbmVcbiAqICAgfV0sXG4gKiAgIGNlcnRpZmljYXRlUmVnaW9uOiAndXMtZWFzdC0xJyAvLyB1c2VkIGJ5IGZvciBleGFtcGxlIENsb3VkRnJvbnRcbiAqIH0pXG4gKiAvLyAjIyMgQ3Jvc3MtYWNjb3VudCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uXG4gKiAvLyBleHRlcm5hbCBob3N0ZWQgem9uZVxuICogY29uc3QgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZSA9XG4gKiAgIHJvdXRlNTMuSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgJ0hvc3RlZFpvbmUnLCB7XG4gKiAgICAgaG9zdGVkWm9uZUlkOiAnWjUzMkRHREVERlMxMjM0NTY3ODknLFxuICogICAgIHpvbmVOYW1lOiAnZXhhbXBsZS5jb20nXG4gKiAgIH0pXG4gKiAvLyB2YWxpZGF0aW9uIHJvbGUgaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgaG9zdGVkIHpvbmVcbiAqIGNvbnN0IHJvbGVBcm4gPSAnYXJuOmF3czppYW06OjEyMzQ1Njc4OTpyb2xlL0NoYW5nZURuc1JlY29yZHNSb2xlJ1xuICogY29uc3QgZXh0ZXJuYWxJZCA9ICdkb21haW4tYXNzdW1lJ1xuICogY29uc3QgdmFsaWRhdGlvblJvbGU6IGlhbS5JUm9sZSA9XG4gKiAgIGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHRoaXMsICdWYWxpZGF0aW9uUm9sZScsIHJvbGVBcm4pXG4gKiBjb25zdCBjZXJ0aWZpY2F0ZSA9IG5ldyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSh0aGlzLCAnQ3Jvc3NBY2NvdW50Q2VydGlmaWNhdGUnLCB7XG4gKiAgIGRvbWFpbk5hbWU6ICdleGFtcGxlLmNvbScsXG4gKiAgIHZhbGlkYXRpb25Ib3N0ZWRab25lczogW3tcbiAqICAgICBob3N0ZWRab25lOiBob3N0ZWRab25lLFxuICogICAgIHZhbGlkYXRpb25Sb2xlOiB2YWxpZGF0aW9uUm9sZSxcbiAqICAgICB2YWxpZGF0aW9uRXh0ZXJuYWxJZDogZXh0ZXJuYWxJZFxuICogICB9XVxuICogfSlcbiAqIC8vICMjIyBDcm9zcy1hY2NvdW50IGFsdGVybmF0aXZlIG5hbWUgdmFsaWRhdGlvblxuICogLy8gZXhhbXBsZS5jb20gaXMgdmFsaWRhdGVkIG9uIHNhbWUgYWNjb3VudCBhZ2FpbnN0IG1hbmFnZWQgaG9zdGVkIHpvbmVcbiAqIC8vIGFuZCBzZWNvbmRhcnkuY29tIGlzIHZhbGlkYXRlZCBhZ2FpbnN0IGV4dGVybmFsIGhvc3RlZCB6b25lIG9uIG90aGVyIGFjY291bnRcbiAqIGNvbnN0IGhvc3RlZFpvbmVGb3JNYWluOiByb3V0ZTUzLklIb3N0ZWRab25lID0gLi4uXG4gKiBjb25zdCBob3N0ZWRab25lRm9yQWx0ZXJuYXRpdmU6IHJvdXRlNTMuSUhvc3RlZFpvbmUgPVxuICogICByb3V0ZTUzLkhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsICdTZWNvbmRhcnlIb3N0ZWRab25lJywge1xuICogICAgIGhvc3RlZFpvbmVJZDogJ1o1MzJER0RFREZTMTIzNDU2Nzg5JyxcbiAqICAgICB6b25lTmFtZTogJ3NlY29uZGFyeS5jb20nXG4gKiAgIH0pXG4gKiBjb25zdCBjZXJ0aWZpY2F0ZSA9IG5ldyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSh0aGlzLCAnQ3Jvc3NBY2NvdW50Q2VydGlmaWNhdGUnLCB7XG4gKiAgIGRvbWFpbk5hbWU6ICdleGFtcGxlLmNvbScsXG4gKiAgIGFsdGVybmF0aXZlRG9tYWluTmFtZXM6IFsnc2Vjb25kYXJ5LmNvbSddLFxuICogICB2YWxpZGF0aW9uSG9zdGVkWm9uZXM6IFt7XG4gKiAgICAgaG9zdGVkWm9uZTogaG9zdGVkWm9uZUZvck1haW5cbiAqICAgfSx7XG4gKiAgICAgaG9zdGVkWm9uZTogaG9zdGVkWm9uZUZvckFsdGVybmF0aXZlLFxuICogICAgIHZhbGlkYXRpb25Sb2xlOiBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAqICAgICAgIHRoaXMsICdTZWNvbmRhcnlWYWxpZGF0aW9uUm9sZScsICdhcm46YXdzOmlhbTo6MTIzNDU2Nzg5OnJvbGUvQ2hhbmdlRG5zUmVjb3Jkc1JvbGUnXG4gKiAgICAgKSxcbiAqICAgICB2YWxpZGF0aW9uRXh0ZXJuYWxJZDogJ2RvbWFpbi1hc3N1bWUnXG4gKiAgIH1dXG4gKiB9KVxuICpcbiAqIEByZXNvdXJjZSBDdXN0b206OkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlXG4gKiBAcmVzb3VyY2UgQVdTOjpDZXJ0aWZpY2F0ZU1hbmFnZXI6OkNlcnRpZmljYXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIGNlcnRpZmljYXRlbWFuYWdlci5JQ2VydGlmaWNhdGUsIGNkay5JVGFnZ2FibGUge1xuICAvKiogVGhlIGNlcnRpZmljYXRlJ3MgQVJOICovXG4gIHB1YmxpYyByZWFkb25seSBjZXJ0aWZpY2F0ZUFybjogc3RyaW5nXG5cbiAgLyoqIFRoZSByZWdpb24gd2hlcmUgdGhlIGNlcnRpZmljYXRlIGlzIGRlcGxveWVkIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBjZXJ0aWZpY2F0ZVJlZ2lvbjogc3RyaW5nXG5cbiAgLyoqIFRoZSB0YWcgbWFuYWdlciB0byBzZXQsIHJlbW92ZSBhbmQgZm9ybWF0IHRhZ3MgZm9yIHRoZSBjZXJ0aWZpY2F0ZSAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3M6IGNkay5UYWdNYW5hZ2VyXG5cbiAgLyoqIFRoZSByZW1vdmFsIHBvbGljeSBmb3IgdGhlIGNlcnRpZmljYXRlICovXG4gIHByaXZhdGUgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3lcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBjb25zdHJ1Y3QgaG9zdGluZyB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0J3MgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyBmb3IgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBkb21haW5OYW1lID0gdGhpcy5ub3JtYWxpemVEb21haW5OYW1lKHByb3BzLmRvbWFpbk5hbWUpXG4gICAgY29uc3QgYWx0ZXJuYXRpdmVEb21haW5OYW1lcyA9IHByb3BzLmFsdGVybmF0aXZlRG9tYWluTmFtZXM/Lm1hcCgoYWx0ZXJuYXRpdmVEb21haW5OYW1lKSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVEb21haW5OYW1lKGFsdGVybmF0aXZlRG9tYWluTmFtZSlcbiAgICApXG4gICAgY29uc3QgYWxsRG9tYWlucyA9IFtkb21haW5OYW1lLCAuLi4oYWx0ZXJuYXRpdmVEb21haW5OYW1lcyA/PyBbXSldXG5cbiAgICB0aGlzLmNlcnRpZmljYXRlUmVnaW9uID0gcHJvcHMuY2VydGlmaWNhdGVSZWdpb24gPz8gdGhpcy5zdGFjay5yZWdpb25cbiAgICB0aGlzLnRhZ3MgPSBuZXcgY2RrLlRhZ01hbmFnZXIoY2RrLlRhZ1R5cGUuTUFQLCBDRVJUVElGSUNBVEVfUkVTT1VSQ0VfVFlQRSlcbiAgICB0aGlzLnJlbW92YWxQb2xpY3kgPSBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1lcblxuICAgIGNvbnN0IHJlcXVlc3RvckZ1bmN0aW9uID0gbmV3IENlcnRpZmljYXRlUmVxdWVzdG9yRnVuY3Rpb24odGhpcywgJ1JlcXVlc3RvckZ1bmN0aW9uJywge1xuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDE0KSxcbiAgICAgIHJvbGU6IHByb3BzLmN1c3RvbVJlc291cmNlUm9sZSxcbiAgICB9KVxuXG4gICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnYWNtOlJlcXVlc3RDZXJ0aWZpY2F0ZScsXG4gICAgICAgICAgJ2FjbTpEZXNjcmliZUNlcnRpZmljYXRlJyxcbiAgICAgICAgICAnYWNtOkRlbGV0ZUNlcnRpZmljYXRlJyxcbiAgICAgICAgICAnYWNtOkFkZFRhZ3NUb0NlcnRpZmljYXRlJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgY29uc3QgZG9tYWluc1RvWm9uZXMgPSBtYXRjaE5hbWVzVG9ab25lcyhcbiAgICAgIHByb3BzLnZhbGlkYXRpb25Ib3N0ZWRab25lcy5tYXAoKHpvbmUpID0+IHpvbmUuaG9zdGVkWm9uZS56b25lTmFtZSksXG4gICAgICBhbGxEb21haW5zLFxuICAgICAgKGRvbWFpbikgPT4gZG9tYWluXG4gICAgKVxuICAgIGNvbnN0IGhvc3RlZFpvbmVzV2l0aFJvbGUgPSBwcm9wcy52YWxpZGF0aW9uSG9zdGVkWm9uZXMuZmlsdGVyKCh6b25lKSA9PiB6b25lLnZhbGlkYXRpb25Sb2xlICE9PSB1bmRlZmluZWQpXG4gICAgY29uc3QgaG9zdGVkWm9uZXNXaXRob3V0Um9sZSA9IHByb3BzLnZhbGlkYXRpb25Ib3N0ZWRab25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUudmFsaWRhdGlvblJvbGUgPT09IHVuZGVmaW5lZClcblxuICAgIGhvc3RlZFpvbmVzV2l0aFJvbGUuZm9yRWFjaCgoem9uZSkgPT4ge1xuICAgICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnc3RzOkFzc3VtZVJvbGUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFt6b25lLnZhbGlkYXRpb25Sb2xlIS5yb2xlQXJuXSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuXG4gICAgaG9zdGVkWm9uZXNXaXRob3V0Um9sZS5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICByZXF1ZXN0b3JGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ3JvdXRlNTM6R2V0Q2hhbmdlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIGNvbnN0IGRvbWFpbk5hbWVzID0gZG9tYWluc1RvWm9uZXNbem9uZS5ob3N0ZWRab25lLnpvbmVOYW1lXVxuICAgICAgaWYgKGRvbWFpbk5hbWVzICYmIGRvbWFpbk5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVxdWVzdG9yRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFsncm91dGU1MzpDaGFuZ2VSZXNvdXJjZVJlY29yZFNldHMnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnJvdXRlNTM6Ojpob3N0ZWR6b25lLyR7dGhpcy5ub3JtYWxpemVIb3N0ZWRab25lSWQoem9uZS5ob3N0ZWRab25lLmhvc3RlZFpvbmVJZCl9YF0sXG4gICAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICdGb3JBbGxWYWx1ZXM6U3RyaW5nRXF1YWxzJzoge1xuICAgICAgICAgICAgICAgICdyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0c1JlY29yZFR5cGVzJzogWydDTkFNRSddLFxuICAgICAgICAgICAgICAgICdyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0c0FjdGlvbnMnOiBbJ1VQU0VSVCcsICdERUxFVEUnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ0ZvckFsbFZhbHVlczpTdHJpbmdMaWtlJzoge1xuICAgICAgICAgICAgICAgICdyb3V0ZTUzOkNoYW5nZVJlc291cmNlUmVjb3JkU2V0c05vcm1hbGl6ZWRSZWNvcmROYW1lcyc6IGRvbWFpbk5hbWVzLm1hcCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndpbGRjYXJkRG9tYWluTmFtZShgRG9tYWluV2lsZGNhcmQke3pvbmUuaG9zdGVkWm9uZS5ub2RlLmlkfSR7aW5kZXh9YCwgbmFtZSlcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCByZXF1ZXN0b3JQcm92aWRlciA9IG5ldyBjdXN0b21fcmVzb3VyY2VzLlByb3ZpZGVyKHRoaXMsICdSZXF1ZXN0b3JQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiByZXF1ZXN0b3JGdW5jdGlvbixcbiAgICB9KVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkhvc3RlZFpvbmVzID0gcHJvcHMudmFsaWRhdGlvbkhvc3RlZFpvbmVzLm1hcDxbc3RyaW5nLCBWYWxpZGF0aW9uSG9zdGVkWm9uZVByb3BlcnRpZXNdPigoem9uZSkgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydGllczogVmFsaWRhdGlvbkhvc3RlZFpvbmVQcm9wZXJ0aWVzID0ge1xuICAgICAgICBEb21haW5OYW1lOiB0aGlzLm5vcm1hbGl6ZURvbWFpbk5hbWUoem9uZS5ob3N0ZWRab25lLnpvbmVOYW1lKSxcbiAgICAgICAgSG9zdGVkWm9uZUlkOiB0aGlzLm5vcm1hbGl6ZUhvc3RlZFpvbmVJZCh6b25lLmhvc3RlZFpvbmUuaG9zdGVkWm9uZUlkKSxcbiAgICAgICAgVmFsaWRhdGlvblJvbGVBcm46IHpvbmUudmFsaWRhdGlvblJvbGU/LnJvbGVBcm4sXG4gICAgICAgIFZhbGlkYXRpb25FeHRlcm5hbElkOiB6b25lLnZhbGlkYXRpb25FeHRlcm5hbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIFtwcm9wZXJ0aWVzLkRvbWFpbk5hbWUsIHByb3BlcnRpZXNdXG4gICAgfSlcblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IFByb3BlcnRpZXMgPSB7XG4gICAgICBEb21haW5OYW1lOiBkb21haW5OYW1lLFxuICAgICAgQWx0ZXJuYXRpdmVEb21haW5OYW1lczogYWx0ZXJuYXRpdmVEb21haW5OYW1lcyxcbiAgICAgIFZhbGlkYXRpb25Ib3N0ZWRab25lczogT2JqZWN0LmZyb21FbnRyaWVzKHZhbGlkYXRpb25Ib3N0ZWRab25lcyksXG4gICAgICBDZXJ0aWZpY2F0ZVJlZ2lvbjogdGhpcy5jZXJ0aWZpY2F0ZVJlZ2lvbixcbiAgICAgIENsZWFudXBWYWxpZGF0aW9uUmVjb3JkczogYm9vbGVhblRvU3RyaW5nKHByb3BzLmNsZWFudXBWYWxpZGF0aW9uUmVjb3JkcyA/PyB0cnVlKSxcbiAgICAgIFRyYW5zcGFyZW5jeUxvZ2dpbmdFbmFibGVkOiBib29sZWFuVG9TdHJpbmcocHJvcHMudHJhbnNwYXJlbmN5TG9nZ2luZ0VuYWJsZWQgPz8gdHJ1ZSksXG4gICAgICBUYWdzOiBjZGsuTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLnRhZ3MucmVuZGVyVGFncygpIH0pIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICAgIFJlbW92YWxQb2xpY3k6IGNkay5MYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IHRoaXMucmVtb3ZhbFBvbGljeSB9KSxcbiAgICB9XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UodGhpcywgJ1JlcXVlc3RvclJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiByZXF1ZXN0b3JQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICByZXNvdXJjZVR5cGU6IEROU19WQUxJREFURURfQ0VSVElGSUNBVEVfVFlQRSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgfSlcblxuICAgIHRoaXMuY2VydGlmaWNhdGVBcm4gPSBjZXJ0aWZpY2F0ZS5nZXRBdHRTdHJpbmcoJ0FybicpXG5cbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7XG4gICAgICB2YWxpZGF0ZTogKCkgPT5cbiAgICAgICAgdGhpcy52YWxpZGF0ZURvbWFpbnNUb0hvc3RlZFpvbmVzKFxuICAgICAgICAgIGFsbERvbWFpbnMsXG4gICAgICAgICAgdmFsaWRhdGlvbkhvc3RlZFpvbmVzLm1hcCgoW3pvbmVOYW1lLCBfXSkgPT4gem9uZU5hbWUpXG4gICAgICAgICksXG4gICAgfSlcbiAgfVxuXG4gIG1ldHJpY0RheXNUb0V4cGlyeShwcm9wcz86IGNkay5hd3NfY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zIHwgdW5kZWZpbmVkKTogY2RrLmF3c19jbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBwZXJpb2Q6IGNkay5EdXJhdGlvbi5kYXlzKDEpLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7IENlcnRpZmljYXRlQXJuOiB0aGlzLmNlcnRpZmljYXRlQXJuIH0sXG4gICAgICBtZXRyaWNOYW1lOiAnRGF5c1RvRXhwaXJ5JyxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9DZXJ0aWZpY2F0ZU1hbmFnZXInLFxuICAgICAgcmVnaW9uOiB0aGlzLmNlcnRpZmljYXRlUmVnaW9uLFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLk1JTklNVU0sXG4gICAgfSlcbiAgfVxuXG4gIGFwcGx5UmVtb3ZhbFBvbGljeShwb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmFsUG9saWN5ID0gcG9saWN5XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZURvbWFpbk5hbWUoZG9tYWluTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoY2RrLlRva2VuLmlzVW5yZXNvbHZlZChkb21haW5OYW1lKSkge1xuICAgICAgcmV0dXJuIGRvbWFpbk5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGNsZWFuRG9tYWluTmFtZShkb21haW5OYW1lKVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVIb3N0ZWRab25lSWQoaG9zdGVkWm9uZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGhvc3RlZFpvbmVJZCkpIHtcbiAgICAgIHJldHVybiBob3N0ZWRab25lSWRcbiAgICB9XG4gICAgcmV0dXJuIGNsZWFuSG9zdGVkWm9uZUlkKGhvc3RlZFpvbmVJZClcbiAgfVxuXG4gIHByaXZhdGUgd2lsZGNhcmREb21haW5OYW1lKGlkOiBzdHJpbmcsIGRvbWFpbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBjZGsuRm4uc3BsaXQoJy4nLCBkb21haW5OYW1lKVxuICAgIGNvbnN0IGZpcnN0ID0gY2RrLkZuLnNlbGVjdCgwLCBwYXJ0cylcbiAgICBjb25zdCBpc1dpbGRjYXJkID0gbmV3IGNkay5DZm5Db25kaXRpb24odGhpcywgYElzJHtpZH1gLCB7XG4gICAgICBleHByZXNzaW9uOiBjZGsuRm4uY29uZGl0aW9uRXF1YWxzKGZpcnN0LCAnKicpLFxuICAgIH0pXG4gICAgcmV0dXJuIGNkay5Gbi5jb25kaXRpb25JZihpc1dpbGRjYXJkLmxvZ2ljYWxJZCwgZG9tYWluTmFtZSwgYCouJHtkb21haW5OYW1lfWApLnRvU3RyaW5nKClcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVEb21haW5zVG9Ib3N0ZWRab25lcyhkb21haW5OYW1lczogc3RyaW5nW10sIHpvbmVOYW1lczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdXG4gICAgZm9yIChjb25zdCBkb21haW5OYW1lIG9mIGRvbWFpbk5hbWVzKSB7XG4gICAgICBjb25zdCByZXNvbHZhYmxlRG9tYWluTmFtZSA9ICFjZGsuVG9rZW4uaXNVbnJlc29sdmVkKGRvbWFpbk5hbWUpXG4gICAgICBjb25zdCByZXNvbHZhYmxlWm9uZU5hbWVzID0gIXpvbmVOYW1lcy5zb21lKCh6b25lTmFtZSkgPT4gY2RrLlRva2VuLmlzVW5yZXNvbHZlZCh6b25lTmFtZSkpXG4gICAgICBpZiAocmVzb2x2YWJsZURvbWFpbk5hbWUgJiYgcmVzb2x2YWJsZVpvbmVOYW1lcyAmJiAhem9uZU5hbWVzLnNvbWUoKHpvbmVOYW1lKSA9PiBkb21haW5OYW1lLmVuZHNXaXRoKHpvbmVOYW1lKSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYERvbWFpbiAke2RvbWFpbk5hbWV9IGlzIG5vdCBwcm92aWRlZCB3aXRoIGF1dGhvcml0YXRpdmUgaG9zdGVkIHpvbmVgKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzXG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"jsii-pacmak": "^1.112.0",
|
|
66
66
|
"jsii-rosetta": "~5.8.0",
|
|
67
67
|
"prettier": "^2.8.8",
|
|
68
|
-
"projen": "^0.
|
|
68
|
+
"projen": "^0.95.0",
|
|
69
69
|
"ts-jest": "^29.4.0",
|
|
70
70
|
"ts-node": "^10.9.2",
|
|
71
71
|
"typescript": "^5.8.3"
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"publishConfig": {
|
|
88
88
|
"access": "public"
|
|
89
89
|
},
|
|
90
|
-
"version": "0.1.
|
|
90
|
+
"version": "0.1.23",
|
|
91
91
|
"jest": {
|
|
92
92
|
"coverageProvider": "v8",
|
|
93
93
|
"testMatch": [
|