cdk8s-plus-29
Version:
cdk8s+ is a software development framework that provides high level abstractions for authoring Kubernetes applications. cdk8s-plus-29 synthesizes Kubernetes manifests for Kubernetes 1.29.0
845 lines • 103 kB
JavaScript
"use strict";
var _a, _b, _c, _d, _e, _f;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Env = exports.EnvFrom = exports.Cpu = exports.MountPropagation = exports.Container = exports.ContainerRestartPolicy = exports.ImagePullPolicy = exports.EnvValue = exports.ResourceFieldPaths = exports.EnvFieldPaths = exports.ContainerSecurityContext = exports.Protocol = exports.SeccompProfileType = exports.Capability = void 0;
exports.extractContainerPorts = extractContainerPorts;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cdk8s_1 = require("cdk8s");
const k8s = require("./imports/k8s");
const probe = require("./probe");
const utils_1 = require("./utils");
/**
* Capability - complete list of POSIX capabilities
*/
var Capability;
(function (Capability) {
/**
* ALL
*/
Capability["ALL"] = "ALL";
/**
* CAP_AUDIT_CONTROL
*/
Capability["AUDIT_CONTROL"] = "AUDIT_CONTROL";
/**
* CAP_AUDIT_READ
*/
Capability["AUDIT_READ"] = "AUDIT_READ";
/**
* CAP_AUDIT_WRITE
*/
Capability["AUDIT_WRITE"] = "AUDIT_WRITE";
/**
* CAP_BLOCK_SUSPEND
*/
Capability["BLOCK_SUSPEND"] = "BLOCK_SUSPEND";
/**
* CAP_BPF
*/
Capability["BPF"] = "BPF";
/**
* CAP_CHECKPOINT_RESTORE
*/
Capability["CHECKPOINT_RESTORE"] = "CHECKPOINT_RESTORE";
/**
* CAP_CHOWN
*/
Capability["CHOWN"] = "CHOWN";
/**
* CAP_DAC_OVERRIDE
*/
Capability["DAC_OVERRIDE"] = "DAC_OVERRIDE";
/**
* CAP_DAC_READ_SEARCH
*/
Capability["DAC_READ_SEARCH"] = "DAC_READ_SEARCH";
/**
* CAP_FOWNER
*/
Capability["FOWNER"] = "FOWNER";
/**
* CAP_FSETID
*/
Capability["FSETID"] = "FSETID";
/**
* CAP_IPC_LOCK
*/
Capability["IPC_LOCK"] = "IPC_LOCK";
/**
* CAP_IPC_OWNER
*/
Capability["IPC_OWNER"] = "IPC_OWNER";
/**
* CAP_KILL
*/
Capability["KILL"] = "KILL";
/**
* CAP_LEASE
*/
Capability["LEASE"] = "LEASE";
/**
* CAP_LINUX_IMMUTABLE
*/
Capability["LINUX_IMMUTABLE"] = "LINUX_IMMUTABLE";
/**
* CAP_MAC_ADMIN
*/
Capability["MAC_ADMIN"] = "MAC_ADMIN";
/**
* CAP_MAC_OVERRIDE
*/
Capability["MAC_OVERRIDE"] = "MAC_OVERRIDE";
/**
* CAP_MKNOD
*/
Capability["MKNOD"] = "MKNOD";
/**
* CAP_NET_ADMIN
*/
Capability["NET_ADMIN"] = "NET_ADMIN";
/**
* CAP_NET_BIND_SERVICE
*/
Capability["NET_BIND_SERVICE"] = "NET_BIND_SERVICE";
/**
* CAP_NET_BROADCAST
*/
Capability["NET_BROADCAST"] = "NET_BROADCAST";
/**
* CAP_NET_RAW
*/
Capability["NET_RAW"] = "NET_RAW";
/**
* CAP_PERFMON
*/
Capability["PERFMON"] = "PERFMON";
/**
* CAP_SETGID
*/
Capability["SETGID"] = "SETGID";
/**
* CAP_SETFCAP
*/
Capability["SETFCAP"] = "SETFCAP";
/**
* CAP_SETPCAP
*/
Capability["SETPCAP"] = "SETPCAP";
/**
* CAP_SETUID
*/
Capability["SETUID"] = "SETUID";
/**
* CAP_SYS_ADMIN
*/
Capability["SYS_ADMIN"] = "SYS_ADMIN";
/**
* CAP_SYS_BOOT
*/
Capability["SYS_BOOT"] = "SYS_BOOT";
/**
* CAP_SYS_CHROOT
*/
Capability["SYS_CHROOT"] = "SYS_CHROOT";
/**
* CAP_SYS_MODULE
*/
Capability["SYS_MODULE"] = "SYS_MODULE";
/**
* CAP_SYS_NICE
*/
Capability["SYS_NICE"] = "SYS_NICE";
/**
* CAP_SYS_PACCT
*/
Capability["SYS_PACCT"] = "SYS_PACCT";
/**
* CAP_SYS_PTRACE
*/
Capability["SYS_PTRACE"] = "SYS_PTRACE";
/**
* CAP_SYS_RAWIO
*/
Capability["SYS_RAWIO"] = "SYS_RAWIO";
/**
* CAP_SYS_RESOURCE
*/
Capability["SYS_RESOURCE"] = "SYS_RESOURCE";
/**
* CAP_SYS_TIME
*/
Capability["SYS_TIME"] = "SYS_TIME";
/**
* CAP_SYS_TTY_CONFIG
*/
Capability["SYS_TTY_CONFIG"] = "SYS_TTY_CONFIG";
/**
* CAP_SYSLOG
*/
Capability["SYSLOG"] = "SYSLOG";
/**
* CAP_WAKE_ALARM
*/
Capability["WAKE_ALARM"] = "WAKE_ALARM";
})(Capability || (exports.Capability = Capability = {}));
var SeccompProfileType;
(function (SeccompProfileType) {
/**
* A profile defined in a file on the node should be used
*/
SeccompProfileType["LOCALHOST"] = "Localhost";
/**
* The container runtime default profile should be used
*/
SeccompProfileType["RUNTIME_DEFAULT"] = "RuntimeDefault";
/**
* No profile should be applied
*/
SeccompProfileType["UNCONFINED"] = "Unconfined";
})(SeccompProfileType || (exports.SeccompProfileType = SeccompProfileType = {}));
/**
* Network protocols.
*/
var Protocol;
(function (Protocol) {
/**
* TCP.
*/
Protocol["TCP"] = "TCP";
/**
* UDP.
*/
Protocol["UDP"] = "UDP";
/**
* SCTP.
*/
Protocol["SCTP"] = "SCTP";
})(Protocol || (exports.Protocol = Protocol = {}));
/**
* Container security attributes and settings.
*/
class ContainerSecurityContext {
constructor(props = {}) {
if (props.seccompProfile?.localhostProfile && props.seccompProfile.type != SeccompProfileType.LOCALHOST) {
throw new Error('localhostProfile must only be set if type is "Localhost"');
}
this.ensureNonRoot = props.ensureNonRoot ?? true;
this.privileged = props.privileged ?? false;
this.readOnlyRootFilesystem = props.readOnlyRootFilesystem ?? true;
this.user = props.user;
this.group = props.group;
this.allowPrivilegeEscalation = props.allowPrivilegeEscalation ?? false;
this.capabilities = props.capabilities;
this.seccompProfile = props.seccompProfile;
}
/**
* @internal
*/
_toKube() {
return {
runAsGroup: this.group,
runAsUser: this.user,
runAsNonRoot: this.ensureNonRoot,
privileged: this.privileged,
readOnlyRootFilesystem: this.readOnlyRootFilesystem,
allowPrivilegeEscalation: this.allowPrivilegeEscalation,
capabilities: this.capabilities,
seccompProfile: this.seccompProfile,
};
}
}
exports.ContainerSecurityContext = ContainerSecurityContext;
_a = JSII_RTTI_SYMBOL_1;
ContainerSecurityContext[_a] = { fqn: "cdk8s-plus-29.ContainerSecurityContext", version: "2.6.0" };
var EnvFieldPaths;
(function (EnvFieldPaths) {
/**
* The name of the pod.
*/
EnvFieldPaths["POD_NAME"] = "metadata.name";
/**
* The namespace of the pod.
*/
EnvFieldPaths["POD_NAMESPACE"] = "metadata.namespace";
/**
* The uid of the pod.
*/
EnvFieldPaths["POD_UID"] = "metadata.uid";
/**
* The labels of the pod.
*/
EnvFieldPaths["POD_LABEL"] = "metadata.labels";
/**
* The annotations of the pod.
*/
EnvFieldPaths["POD_ANNOTATION"] = "metadata.annotations";
/**
* The ipAddress of the pod.
*/
EnvFieldPaths["POD_IP"] = "status.podIP";
/**
* The service account name of the pod.
*/
EnvFieldPaths["SERVICE_ACCOUNT_NAME"] = "spec.serviceAccountName";
/**
* The name of the node.
*/
EnvFieldPaths["NODE_NAME"] = "spec.nodeName";
/**
* The ipAddress of the node.
*/
EnvFieldPaths["NODE_IP"] = "status.hostIP";
/**
* The ipAddresess of the pod.
*/
EnvFieldPaths["POD_IPS"] = "status.podIPs";
})(EnvFieldPaths || (exports.EnvFieldPaths = EnvFieldPaths = {}));
var ResourceFieldPaths;
(function (ResourceFieldPaths) {
/**
* CPU limit of the container.
*/
ResourceFieldPaths["CPU_LIMIT"] = "limits.cpu";
/**
* Memory limit of the container.
*/
ResourceFieldPaths["MEMORY_LIMIT"] = "limits.memory";
/**
* CPU request of the container.
*/
ResourceFieldPaths["CPU_REQUEST"] = "requests.cpu";
/**
* Memory request of the container.
*/
ResourceFieldPaths["MEMORY_REQUEST"] = "requests.memory";
/**
* Ephemeral storage limit of the container.
*/
ResourceFieldPaths["STORAGE_LIMIT"] = "limits.ephemeral-storage";
/**
* Ephemeral storage request of the container.
*/
ResourceFieldPaths["STORAGE_REQUEST"] = "requests.ephemeral-storage";
})(ResourceFieldPaths || (exports.ResourceFieldPaths = ResourceFieldPaths = {}));
/**
* Utility class for creating reading env values from various sources.
*/
class EnvValue {
/**
* Create a value by reading a specific key inside a config map.
*
* @param configMap - The config map.
* @param key - The key to extract the value from.
* @param options - Additional options.
*/
static fromConfigMap(configMap, key, options = {}) {
const source = {
configMapKeyRef: {
name: configMap.name,
key,
optional: options.optional,
},
};
return new EnvValue(undefined, source);
}
/**
* Defines an environment value from a secret JSON value.
*
* @param secretValue The secret value (secrent + key)
* @param options Additional options
*/
static fromSecretValue(secretValue, options = {}) {
const source = {
secretKeyRef: {
name: secretValue.secret.name,
key: secretValue.key,
optional: options.optional,
},
};
return new EnvValue(undefined, source);
}
/**
* Create a value from the given argument.
*
* @param value - The value.
*/
static fromValue(value) {
return new EnvValue(value);
}
/**
*
* Create a value from a field reference.
*
* @param fieldPath: The field reference.
* @param options: Additional options.
*/
static fromFieldRef(fieldPath, options = {}) {
let needsKey = false;
if (fieldPath === EnvFieldPaths.POD_LABEL || fieldPath === EnvFieldPaths.POD_ANNOTATION) {
needsKey = true;
}
if (needsKey && options.key === undefined) {
throw new Error(`${fieldPath} requires a key`);
}
const source = {
fieldRef: {
fieldPath: (`${fieldPath}` + (needsKey ? `['${options.key}']` : '')),
...(options.apiVersion ? { apiVersion: options.apiVersion } : {}),
},
};
return new EnvValue(undefined, source);
}
/**
* Create a value from a resource.
*
* @param resource: Resource to select the value from.
* @param options: Additional options.
*/
static fromResource(resource, options = {}) {
const source = {
resourceFieldRef: {
resource: `${resource}`,
...(options.divisor ? { divisor: k8s.IntOrString.fromString(options.divisor) } : {}),
...(options.container ? { containerName: options.container.name } : {}),
},
};
return new EnvValue(undefined, source);
}
/**
* Create a value from a key in the current process environment.
*
* @param key - The key to read.
* @param options - Additional options.
*/
static fromProcess(key, options = {}) {
const value = process.env[key];
if (options.required && !value) {
throw new Error(`Missing ${key} env variable`);
}
return EnvValue.fromValue(value);
}
constructor(value, valueFrom) {
this.value = value;
this.valueFrom = valueFrom;
}
}
exports.EnvValue = EnvValue;
_b = JSII_RTTI_SYMBOL_1;
EnvValue[_b] = { fqn: "cdk8s-plus-29.EnvValue", version: "2.6.0" };
var ImagePullPolicy;
(function (ImagePullPolicy) {
/**
* Every time the kubelet launches a container, the kubelet queries the container image registry
* to resolve the name to an image digest. If the kubelet has a container image with that exact
* digest cached locally, the kubelet uses its cached image; otherwise, the kubelet downloads
* (pulls) the image with the resolved digest, and uses that image to launch the container.
*
* Default is Always if ImagePullPolicy is omitted and either the image tag is :latest or
* the image tag is omitted.
*/
ImagePullPolicy["ALWAYS"] = "Always";
/**
* The image is pulled only if it is not already present locally.
*
* Default is IfNotPresent if ImagePullPolicy is omitted and the image tag is present but
* not :latest
*/
ImagePullPolicy["IF_NOT_PRESENT"] = "IfNotPresent";
/**
* The image is assumed to exist locally. No attempt is made to pull the image.
*/
ImagePullPolicy["NEVER"] = "Never";
})(ImagePullPolicy || (exports.ImagePullPolicy = ImagePullPolicy = {}));
/**
* RestartPolicy defines the restart behavior of individual containers in a pod.
* This field may only be set for init containers, and the only allowed value is "Always".
* For non-init containers or when this field is not specified,
* the restart behavior is defined by the Pod's restart policy and the container type.
* Setting the RestartPolicy as "Always" for the init container will have the following effect:
* this init container will be continually restarted on exit until all regular containers have terminated.
* Once all regular containers have completed, all init containers with restartPolicy "Always" will be shut down.
* This lifecycle differs from normal init containers and is often referred to as a "sidecar" container.
*
* @see https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/
*/
var ContainerRestartPolicy;
(function (ContainerRestartPolicy) {
/**
* If an init container is created with its restartPolicy set to Always,
* it will start and remain running during the entire life of the Pod.
* For regular containers, this is ignored by Kubernetes.
*/
ContainerRestartPolicy["ALWAYS"] = "Always";
})(ContainerRestartPolicy || (exports.ContainerRestartPolicy = ContainerRestartPolicy = {}));
/**
* A single application container that you want to run within a pod.
*/
class Container {
constructor(props) {
this._ports = [];
if (props instanceof Container) {
throw new Error('Attempted to construct a container from a Container object.');
}
const defaultResourceSpec = {
cpu: {
request: Cpu.millis(1000),
limit: Cpu.millis(1500),
},
memory: {
request: cdk8s_1.Size.mebibytes(512),
limit: cdk8s_1.Size.mebibytes(2048),
},
};
if (props.port && props.portNumber) {
throw new Error('Either \'port\' or \'portNumber\' is allowed. Use \'portNumber\' since \'port\' is deprecated');
}
const portNumber = props.portNumber ?? props.port;
const defaultProbeConfiguration = probe.Probe.fromTcpSocket({ port: portNumber });
this.name = props.name ?? 'main';
this.image = props.image;
this.portNumber = portNumber;
this._command = props.command;
this._args = props.args;
this._readiness = props.readiness;
this._liveness = props.liveness;
this._startup = props.startup ?? (this.portNumber ? defaultProbeConfiguration : undefined);
this._lifecycle = props.lifecycle;
this.resources = props.resources ?? defaultResourceSpec;
this.workingDir = props.workingDir;
this.mounts = props.volumeMounts ?? [];
this.imagePullPolicy = props.imagePullPolicy ?? ImagePullPolicy.ALWAYS;
this.securityContext = new ContainerSecurityContext(props.securityContext);
this.env = new Env(props.envFrom ?? [], props.envVariables ?? {});
this.restartPolicy = props.restartPolicy;
if (this.portNumber) {
this.addPort({
number: this.portNumber,
});
}
for (const port of props.ports ?? []) {
this.addPort(port);
}
}
/**
* @deprecated - use `portNumber`.
*/
get port() {
return this.portNumber;
}
/**
* Ports exposed by this containers.
* Returns a copy, use `addPort` to modify.
*/
get ports() {
return [...this._ports];
}
/**
* Entrypoint array (the command to execute when the container starts).
* @returns a copy of the entrypoint array, cannot be modified
*/
get command() {
return this._command ? [...this._command] : undefined;
}
/**
* Arguments to the entrypoint.
*
* @returns a copy of the arguments array, cannot be modified.
*/
get args() {
return this._args ? [...this._args] : undefined;
}
/**
* Mount a volume to a specific path so that it is accessible by the container.
* Every pod that is configured to use this container will autmoatically have access to the volume.
*
* @param path - The desired path in the container.
* @param storage - The storage to mount.
*/
mount(path, storage, options = {}) {
this.mounts.push({ path, volume: storage.asVolume(), ...options });
}
/**
* Add a port to expose from this container.
*/
addPort(port) {
const names = this._ports.map(p => p.name).filter(x => x);
const numberProtocols = this._ports.map(p => `${p.number}/${p.protocol || Protocol.TCP}`);
if (port.name && names.includes(port.name)) {
throw new Error(`Port with name ${port.name} already exists`);
}
const protocol = `${port.number}/${port.protocol || Protocol.TCP}`;
if (numberProtocols.includes(protocol)) {
throw new Error(`Port with number ${port.number} and protocol ${port.protocol || Protocol.TCP} already exists`);
}
this._ports.push(port);
}
/**
* @internal
*/
_toKube() {
const volumeMounts = [];
for (const mount of this.mounts) {
volumeMounts.push({
name: mount.volume.name,
mountPath: mount.path,
readOnly: mount.readOnly,
mountPropagation: mount.propagation,
subPath: mount.subPath,
subPathExpr: mount.subPathExpr,
});
}
const ports = new Array();
for (const port of this.ports) {
ports.push({
containerPort: port.number,
protocol: port.protocol?.toString(),
name: port.name,
hostPort: port.hostPort,
hostIp: port.hostIp,
});
}
// Resource requests and limits
const cpuLimit = this.resources?.cpu?.limit?.amount;
const cpuRequest = this.resources?.cpu?.request?.amount;
const memoryLimit = this.resources?.memory?.limit;
const memoryRequest = this.resources?.memory?.request;
const ephemeralStorageLimit = this.resources?.ephemeralStorage?.limit;
const ephemeralStorageRequest = this.resources?.ephemeralStorage?.request;
const limits = {};
const requests = {};
if (cpuLimit) {
limits.cpu = k8s.Quantity.fromString(cpuLimit);
}
if (memoryLimit) {
limits.memory = k8s.Quantity.fromString(memoryLimit.toMebibytes().toString() + 'Mi');
}
if (ephemeralStorageLimit) {
limits['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageLimit.toGibibytes().toString() + 'Gi');
}
if (cpuRequest) {
requests.cpu = k8s.Quantity.fromString(cpuRequest);
}
if (memoryRequest) {
requests.memory = k8s.Quantity.fromString(memoryRequest.toMebibytes().toString() + 'Mi');
}
if (ephemeralStorageRequest) {
requests['ephemeral-storage'] = k8s.Quantity.fromString(ephemeralStorageRequest.toGibibytes().toString() + 'Gi');
}
let resourceRequirements = undefined;
if (Object.keys(limits).length > 0 || Object.keys(requests).length > 0) {
resourceRequirements = {
limits: (0, utils_1.undefinedIfEmpty)(limits),
requests: (0, utils_1.undefinedIfEmpty)(requests),
};
}
const env = this.env._toKube();
return {
name: this.name,
image: this.image,
imagePullPolicy: this.imagePullPolicy,
ports: (0, utils_1.undefinedIfEmpty)(ports),
volumeMounts: (0, utils_1.undefinedIfEmpty)(volumeMounts),
command: this.command,
args: this.args,
workingDir: this.workingDir,
env: env.variables,
envFrom: env.from,
readinessProbe: this._readiness?._toKube(this),
livenessProbe: this._liveness?._toKube(this),
startupProbe: this._startup?._toKube(this),
lifecycle: this._lifecycle ? {
postStart: this._lifecycle.postStart?._toKube(this),
preStop: this._lifecycle.preStop?._toKube(this),
} : undefined,
resources: resourceRequirements,
restartPolicy: this.restartPolicy,
securityContext: this.securityContext._toKube(),
};
}
}
exports.Container = Container;
_c = JSII_RTTI_SYMBOL_1;
Container[_c] = { fqn: "cdk8s-plus-29.Container", version: "2.6.0" };
var MountPropagation;
(function (MountPropagation) {
/**
* This volume mount will not receive any subsequent mounts that are mounted
* to this volume or any of its subdirectories by the host. In similar
* fashion, no mounts created by the Container will be visible on the host.
*
* This is the default mode.
*
* This mode is equal to `private` mount propagation as described in the Linux
* kernel documentation
*/
MountPropagation["NONE"] = "None";
/**
* This volume mount will receive all subsequent mounts that are mounted to
* this volume or any of its subdirectories.
*
* In other words, if the host mounts anything inside the volume mount, the
* Container will see it mounted there.
*
* Similarly, if any Pod with Bidirectional mount propagation to the same
* volume mounts anything there, the Container with HostToContainer mount
* propagation will see it.
*
* This mode is equal to `rslave` mount propagation as described in the Linux
* kernel documentation
*/
MountPropagation["HOST_TO_CONTAINER"] = "HostToContainer";
/**
* This volume mount behaves the same the HostToContainer mount. In addition,
* all volume mounts created by the Container will be propagated back to the
* host and to all Containers of all Pods that use the same volume
*
* A typical use case for this mode is a Pod with a FlexVolume or CSI driver
* or a Pod that needs to mount something on the host using a hostPath volume.
*
* This mode is equal to `rshared` mount propagation as described in the Linux
* kernel documentation
*
* Caution: Bidirectional mount propagation can be dangerous. It can damage
* the host operating system and therefore it is allowed only in privileged
* Containers. Familiarity with Linux kernel behavior is strongly recommended.
* In addition, any volume mounts created by Containers in Pods must be
* destroyed (unmounted) by the Containers on termination.
*
*/
MountPropagation["BIDIRECTIONAL"] = "Bidirectional";
})(MountPropagation || (exports.MountPropagation = MountPropagation = {}));
/**
* Represents the amount of CPU.
* The amount can be passed as millis or units.
*/
class Cpu {
static millis(amount) {
return new Cpu(amount + 'm');
}
static units(amount) {
return new Cpu(amount.toString());
}
constructor(amount) {
this.amount = amount;
}
}
exports.Cpu = Cpu;
_d = JSII_RTTI_SYMBOL_1;
Cpu[_d] = { fqn: "cdk8s-plus-29.Cpu", version: "2.6.0" };
/**
* A collection of env variables defined in other resources.
*/
class EnvFrom {
constructor(configMap, prefix, sec) {
this.configMap = configMap;
this.prefix = prefix;
this.sec = sec;
}
;
/**
* @internal
*/
_toKube() {
return {
configMapRef: this.configMap ? {
name: this.configMap.name,
} : undefined,
secretRef: this.sec ? {
name: this.sec.name,
} : undefined,
prefix: this.prefix,
};
}
}
exports.EnvFrom = EnvFrom;
_e = JSII_RTTI_SYMBOL_1;
EnvFrom[_e] = { fqn: "cdk8s-plus-29.EnvFrom", version: "2.6.0" };
function extractContainerPorts(selector) {
if (!selector) {
return [];
}
// we don't use instanceof intentionally since it can create
// cyclic import problems.
const containers = selector.containers ?? [];
return containers.flatMap(c => c.ports);
}
/**
* Container environment variables.
*/
class Env {
/**
* Selects a ConfigMap to populate the environment variables with.
* The contents of the target ConfigMap's Data field will represent
* the key-value pairs as environment variables.
*/
static fromConfigMap(configMap, prefix) {
return new EnvFrom(configMap, prefix, undefined);
}
/**
* Selects a Secret to populate the environment variables with.
* The contents of the target Secret's Data field will represent
* the key-value pairs as environment variables.
*/
static fromSecret(secr) {
return new EnvFrom(undefined, undefined, secr);
}
constructor(sources, variables) {
this._sources = sources;
this._variables = variables;
}
/**
* Add a single variable by name and value.
* The variable value can come from various dynamic sources such a secrets of config maps.
* Use `EnvValue.fromXXX` to select sources.
*/
addVariable(name, value) {
this._variables[name] = value;
}
/**
* The environment variables for this container.
* Returns a copy. To add environment variables use `container.env.addVariable()`.
*/
get variables() {
return { ...this._variables };
}
/**
* Add a collection of variables by copying from another source.
* Use `Env.fromXXX` functions to select sources.
*/
copyFrom(from) {
this._sources.push(from);
}
/**
* The list of sources used to populate the container environment,
* in addition to the `variables`.
*
* Returns a copy. To add a source use `container.env.copyFrom()`.
*/
get sources() {
return [...this._sources];
}
renderEnv(env) {
const result = new Array();
for (const [name, v] of Object.entries(env)) {
result.push({
name,
value: v.value,
valueFrom: v.valueFrom,
});
}
return result;
}
/**
* @internal
*/
_toKube() {
return {
from: (0, utils_1.undefinedIfEmpty)(this._sources.map(s => s._toKube())),
variables: (0, utils_1.undefinedIfEmpty)(this.renderEnv(this._variables)),
};
}
}
exports.Env = Env;
_f = JSII_RTTI_SYMBOL_1;
Env[_f] = { fqn: "cdk8s-plus-29.Env", version: "2.6.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBZzNDQSxzREFTQzs7QUF6M0NELGlDQUE2QjtBQUc3QixxQ0FBcUM7QUFDckMsaUNBQWlDO0FBRWpDLG1DQUEyQztBQUczQzs7R0FFRztBQUNILElBQVksVUF5S1g7QUF6S0QsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gseUJBQVcsQ0FBQTtJQUNYOztPQUVHO0lBQ0gsNkNBQStCLENBQUE7SUFDL0I7O09BRUc7SUFDSCx1Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILHlDQUEyQixDQUFBO0lBQzNCOztPQUVHO0lBQ0gsNkNBQStCLENBQUE7SUFDL0I7O09BRUc7SUFDSCx5QkFBVyxDQUFBO0lBQ1g7O09BRUc7SUFDSCx1REFBeUMsQ0FBQTtJQUN6Qzs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILDJDQUE2QixDQUFBO0lBQzdCOztPQUVHO0lBQ0gsaURBQW1DLENBQUE7SUFDbkM7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILCtCQUFpQixDQUFBO0lBQ2pCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7SUFDckI7O09BRUc7SUFDSCxxQ0FBdUIsQ0FBQTtJQUN2Qjs7T0FFRztJQUNILDJCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILGlEQUFtQyxDQUFBO0lBQ25DOztPQUVHO0lBQ0gscUNBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCwyQ0FBNkIsQ0FBQTtJQUM3Qjs7T0FFRztJQUNILDZCQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILHFDQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsbURBQXFDLENBQUE7SUFDckM7O09BRUc7SUFDSCw2Q0FBK0IsQ0FBQTtJQUMvQjs7T0FFRztJQUNILGlDQUFtQixDQUFBO0lBQ25COztPQUVHO0lBQ0gsaUNBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILGlDQUFtQixDQUFBO0lBQ25COztPQUVHO0lBQ0gsaUNBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILHFDQUF1QixDQUFBO0lBQ3ZCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7SUFDckI7O09BRUc7SUFDSCx1Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILHVDQUF5QixDQUFBO0lBQ3pCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7SUFDckI7O09BRUc7SUFDSCxxQ0FBdUIsQ0FBQTtJQUN2Qjs7T0FFRztJQUNILHVDQUF5QixDQUFBO0lBQ3pCOztPQUVHO0lBQ0gscUNBQXVCLENBQUE7SUFDdkI7O09BRUc7SUFDSCwyQ0FBNkIsQ0FBQTtJQUM3Qjs7T0FFRztJQUNILG1DQUFxQixDQUFBO0lBQ3JCOztPQUVHO0lBQ0gsK0NBQWlDLENBQUE7SUFDakM7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtJQUNqQjs7T0FFRztJQUNILHVDQUF5QixDQUFBO0FBQzNCLENBQUMsRUF6S1csVUFBVSwwQkFBVixVQUFVLFFBeUtyQjtBQUVELElBQVksa0JBYVg7QUFiRCxXQUFZLGtCQUFrQjtJQUM1Qjs7TUFFRTtJQUNGLDZDQUF1QixDQUFBO0lBQ3ZCOztNQUVFO0lBQ0Ysd0RBQWtDLENBQUE7SUFDbEM7O01BRUU7SUFDRiwrQ0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBYlcsa0JBQWtCLGtDQUFsQixrQkFBa0IsUUFhN0I7QUE2SUQ7O0dBRUc7QUFDSCxJQUFZLFFBZ0JYO0FBaEJELFdBQVksUUFBUTtJQUVsQjs7T0FFRztJQUNILHVCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILHVCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILHlCQUFhLENBQUE7QUFDZixDQUFDLEVBaEJXLFFBQVEsd0JBQVIsUUFBUSxRQWdCbkI7QUFHRDs7R0FFRztBQUNILE1BQWEsd0JBQXdCO0lBV25DLFlBQVksUUFBdUMsRUFBRTtRQUNuRCxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEcsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDLHdCQUF3QixJQUFJLEtBQUssQ0FBQztRQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDaEMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLHNCQUFzQixFQUFFLElBQUksQ0FBQyxzQkFBc0I7WUFDbkQsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLHdCQUF3QjtZQUN2RCxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQ3BDLENBQUM7SUFDSixDQUFDOztBQXZDSCw0REF5Q0M7OztBQUVELElBQVksYUFrRFg7QUFsREQsV0FBWSxhQUFhO0lBQ3ZCOztPQUVHO0lBQ0gsMkNBQTBCLENBQUE7SUFFMUI7O09BRUc7SUFDSCxxREFBb0MsQ0FBQTtJQUVwQzs7T0FFRztJQUNILHlDQUF3QixDQUFBO0lBRXhCOztPQUVHO0lBQ0gsOENBQTZCLENBQUE7SUFFN0I7O09BRUc7SUFDSCx3REFBdUMsQ0FBQTtJQUV2Qzs7T0FFRztJQUNILHdDQUF1QixDQUFBO0lBRXZCOztPQUVHO0lBQ0gsaUVBQWdELENBQUE7SUFFaEQ7O09BRUc7SUFDSCw0Q0FBMkIsQ0FBQTtJQUUzQjs7T0FFRztJQUNILDBDQUF5QixDQUFBO0lBRXpCOztPQUVHO0lBQ0gsMENBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQWxEVyxhQUFhLDZCQUFiLGFBQWEsUUFrRHhCO0FBRUQsSUFBWSxrQkE4Qlg7QUE5QkQsV0FBWSxrQkFBa0I7SUFDNUI7O09BRUc7SUFDSCw4Q0FBd0IsQ0FBQTtJQUV4Qjs7T0FFRztJQUNILG9EQUE4QixDQUFBO0lBRTlCOztPQUVHO0lBQ0gsa0RBQTRCLENBQUE7SUFFNUI7O09BRUc7SUFDSCx3REFBa0MsQ0FBQTtJQUVsQzs7T0FFRztJQUNILGdFQUEwQyxDQUFBO0lBRTFDOztPQUVHO0lBQ0gsb0VBQThDLENBQUE7QUFDaEQsQ0FBQyxFQTlCVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQThCN0I7QUF5RUQ7O0dBRUc7QUFDSCxNQUFhLFFBQVE7SUFFbkI7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUErQixFQUFFLEdBQVcsRUFBRSxVQUF3QyxFQUFFO1FBRWxILE1BQU0sTUFBTSxHQUFxQjtZQUMvQixlQUFlLEVBQUU7Z0JBQ2YsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO2dCQUNwQixHQUFHO2dCQUNILFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTthQUMzQjtTQUNGLENBQUM7UUFDRixPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLFdBQStCLEVBQUUsVUFBcUMsRUFBRTtRQUNwRyxNQUFNLE1BQU0sR0FBcUI7WUFDL0IsWUFBWSxFQUFFO2dCQUNaLElBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUk7Z0JBQzdCLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztnQkFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2FBQzNCO1NBQ0YsQ0FBQztRQUVGLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFhO1FBQ25DLE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBd0IsRUFBRSxVQUF1QyxFQUFFO1FBQzVGLElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztRQUU5QixJQUFJLFNBQVMsS0FBSyxhQUFhLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEYsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO1FBRUQsSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBcUI7WUFDL0IsUUFBUSxFQUFFO2dCQUNSLFNBQVMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2xFO1NBQ0YsQ0FBQztRQUVGLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBNEIsRUFBRSxVQUF1QyxFQUFFO1FBQ2hHLE1BQU0sTUFBTSxHQUFxQjtZQUMvQixnQkFBZ0IsRUFBRTtnQkFDaEIsUUFBUSxFQUFFLEdBQUcsUUFBUSxFQUFFO2dCQUN2QixHQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckYsR0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN6RTtTQUNGLENBQUM7UUFFRixPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQVcsRUFBRSxVQUFzQyxFQUFFO1FBRTdFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFL0IsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBb0MsS0FBVyxFQUFrQixTQUFlO1FBQTVDLFVBQUssR0FBTCxLQUFLLENBQU07UUFBa0IsY0FBUyxHQUFULFNBQVMsQ0FBTTtJQUFJLENBQUM7O0FBL0d2Riw0QkFnSEM7OztBQUVELElBQVksZUF3Qlg7QUF4QkQsV0FBWSxlQUFlO0lBQ3pCOzs7Ozs7OztPQVFHO0lBQ0gsb0NBQWlCLENBQUE7SUFFakI7Ozs7O09BS0c7SUFDSCxrREFBK0IsQ0FBQTtJQUUvQjs7T0FFRztJQUNILGtDQUFlLENBQUE7QUFDakIsQ0FBQyxFQXhCVyxlQUFlLCtCQUFmLGVBQWUsUUF3QjFCO0FBZ0NEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsSUFBWSxzQkFRWDtBQVJELFdBQVksc0JBQXNCO0lBRWhDOzs7O09BSUc7SUFDSCwyQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBUlcsc0JBQXNCLHNDQUF0QixzQkFBc0IsUUFRakM7QUFtTEQ7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUErRHBCLFlBQVksS0FBcUI7UUFOaEIsV0FBTSxHQUFvQixFQUFFLENBQUM7UUFPNUMsSUFBSSxLQUFLLFlBQVksU0FBUyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUF1QjtZQUM5QyxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUN6QixLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDeEI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sT0FBTyxFQUFFLFlBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUM1QixLQUFLLEVBQUUsWUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7YUFDNUI7U0FDRixDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLCtGQUErRixDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQztRQUNsRCxNQUFNLHlCQUF5QixHQUFnQixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRS9GLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQztRQUN4RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUN2RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksd0JBQXdCLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFFekMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDWCxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsS0FBSztRQUNkLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxJQUFZLEVBQUUsT0FBd0IsRUFBRSxVQUF3QixFQUFFO1FBQzdFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxJQUFtQjtRQUVoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRTFGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLGlCQUFpQixDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuRSxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsTUFBTSxpQkFBaUIsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xILENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osTUFBTSxZQUFZLEdBQXNCLEVBQUUsQ0FBQztRQUUzQyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJO2dCQUN2QixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ3JCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDeEIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQ25DLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2FBQy9CLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBcUIsQ0FBQztRQUU3QyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNULGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELCtCQUErQjtRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztRQUN0RCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO1FBQ3RFLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7UUFFMUUsTUFBTSxNQUFNLEdBQW9DLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBb0MsRUFBRSxDQUFDO1FBRXJELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFDRCxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDL0csQ0FBQztRQUNELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDNUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELElBQUksb0JBQW9CLEdBQXlDLFNBQVMsQ0FBQztRQUMzRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RSxvQkFBb0IsR0FBRztnQkFDckIsTUFBTSxFQUFFLElBQUEsd0JBQWdCLEVBQUMsTUFBTSxDQUFDO2dCQUNoQyxRQUFRLEVBQUUsSUFBQSx3QkFBZ0IsRUFBQyxRQUFRLENBQUM7YUFDckMsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9CLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLEtBQUssRUFBRSxJQUFBLHdCQUFnQixFQUFDLEtBQUssQ0FBQztZQUM5QixZQUFZLEVBQUUsSUFBQSx3QkFBZ0IsRUFBQyxZQUFZLENBQUM7WUFDNUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixHQUFHLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDbEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJO1lBQ2pCLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztZQUM1QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ25ELE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2hELENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDYixTQUFTLEVBQUUsb0JBQW9CO1lBQy9CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUU7U0FDaEQsQ0FBQztJQUNKLENBQUM7O0FBNVFILDhCQTZRQzs7O0FBNkRELElBQVksZ0JBZ0RYO0FBaERELFdBQVksZ0JBQWdCO0lBQzFCOzs7Ozs7Ozs7T0FTRztJQUNILGlDQUFhLENBQUE7SUFFYjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gseURBQXFDLENBQUE7SUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7O09BaUJHO0lBQ0gsbURBQStCLENBQUE7QUFDakMsQ0FBQyxFQWhEVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQWdEM0I7QUFtQkQ7OztHQUdHO0FBQ0gsTUFBYSxHQUFHO0lBQ2QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFjO1FBQzFCLE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQWM7UUFDekIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBb0IsTUFBYztRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDOztBQVZILGtCQVdDOzs7QUFrQkQ7O0dBRUc7QUFDSCxNQUFhLE9BQU87SUFFbEIsWUFDbUIsU0FBZ0MsRUFDaEMsTUFBZSxFQUNmLEdBQW9CO1FBRnBCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQVM7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFpQjtJQUFJLENBQUM7SUFBQSxDQUFDO0lBRTdDOztPQUVHO0lBQ0ksT0FBTztRQUNaLE9BQU87WUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7YUFDMUIsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTthQUNwQixDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCLENBQUM7SUFDSixDQUFDOztBQXBCSCwwQkFzQkM7OztBQUVELFNBQWdCLHFCQUFxQixDQUFDLFFBQWM7SUFFbEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQUMsT0FBTyxFQUFFLENBQUM7SUFBQyxDQUFDO0lBRTdCLDREQUE0RDtJQUM1RCwwQkFBMEI7SUFDMUIsTUFBTSxVQUFVLEdBQWlCLFFBQWdCLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztJQUVuRSxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxHQUFHO0lBRWQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBK0IsRUFBRSxNQUFlO1FBQzFFLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBb0I7UUFDM0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFLRCxZQUFtQixPQUFrQixFQUFFLFNBQXVDO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLElBQVksRUFBRSxLQUFlO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRLENBQUMsSUFBYTtRQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxTQUFTLENBQUMsR0FBaUM7UUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQztRQUN2QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsSUFBSTtnQkFDSixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osT0FBTztZQUNMLElBQUksRUFBRSxJQUFBLHdCQUFnQixFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0QsU0FBUyxFQUFFLElBQUEsd0JBQWdCLEVBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0QsQ0FBQztJQUNKLENBQUM7O0FBbkZILGtCQW9GQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpemUgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgKiBhcyBjb25maWdtYXAgZnJvbSAnLi9jb25maWctbWFwJztcbmltcG9ydCAqIGFzIGhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyJztcbmltcG9ydCAqIGFzIGs4cyBmcm9tICcuL2ltcG9ydHMvazhzJztcbmltcG9ydCAqIGFzIHByb2JlIGZyb20gJy4vcHJvYmUnO1xuaW1wb3J0ICogYXMgc2VjcmV0IGZyb20gJy4vc2VjcmV0JztcbmltcG9ydCB7IHVuZGVmaW5lZElmRW1wdHkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCAqIGFzIHZvbHVtZSBmcm9tICcuL3ZvbHVtZSc7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSAtIGNvbXBsZXRlIGxpc3Qgb2YgUE9TSVggY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBlbnVtIENhcGFiaWxpdHkge1xuICAvKipcbiAgICogQUxMXG4gICAqL1xuICBBTEwgPSAnQUxMJyxcbiAgLyoqXG4gICAqIENBUF9BVURJVF9DT05UUk9MXG4gICAqL1xuICBBVURJVF9DT05UUk9MID0gJ0FVRElUX0NPTlRST0wnLFxuICAvKipcbiAgICogQ0FQX0FVRElUX1JFQURcbiAgICovXG4gIEFVRElUX1JFQUQgPSAnQVVESVRfUkVBRCcsXG4gIC8qKlxuICAgKiBDQVBfQVVESVRfV1JJVEVcbiAgICovXG4gIEFVRElUX1dSSVRFID0gJ0FVRElUX1dSSVRFJyxcbiAgLyoqXG4gICAqIENBUF9CTE9DS19TVVNQRU5EXG4gICAqL1xuICBCTE9DS19TVVNQRU5EID0gJ0JMT0NLX1NVU1BFTkQnLFxuICAvKipcbiAgICogQ0FQX0JQRlxuICAgKi9cbiAgQlBGID0gJ0JQRicsXG4gIC8qKlxuICAgKiBDQVBfQ0hFQ0tQT0lOVF9SRVNUT1JFXG4gICAqL1xuICBDSEVDS1BPSU5UX1JFU1RPUkUgPSAnQ0hFQ0tQT0lOVF9SRVNUT1JFJyxcbiAgLyoqXG4gICAqIENBUF9DSE9XTlxuICAgKi9cbiAgQ0hPV04gPSAnQ0hPV04nLFxuICAvKipcbiAgICogQ0FQX0RBQ19PVkVSUklERVxuICAgKi9cbiAgREFDX09WRVJSSURFID0gJ0RBQ19PVkVSUklERScsXG4gIC8qKlxuICAgKiBDQVBfREFDX1JFQURfU0VBUkNIXG4gICAqL1xuICBEQUNfUkVBRF9TRUFSQ0ggPSAnREFDX1JFQURfU0VBUkNIJyxcbiAgLyoqXG4gICAqIENBUF9GT1dORVJcbiAgICovXG4gIEZPV05FUiA9ICdGT1dORVInLFxuICAvKipcbiAgICogQ0FQX0ZTRVRJRFxuICAgKi9cbiAgRlNFVElEID0gJ0ZTRVRJRCcsXG4gIC8qKlxuICAgKiBDQVBfSVBDX0xPQ0tcbiAgICovXG4gIElQQ19MT0NLID0gJ0lQQ19MT0NLJyxcbiAgLyoqXG4gICAqIENBUF9JUENfT1dORVJcbiAgICovXG4gIElQQ19PV05FUiA9ICdJUENfT1dORVInLFxuICAvKipcbiAgICogQ0FQX0tJTExcbiAgICovXG4gIEtJTEwgPSAnS0lMTCcsXG4gIC8qKlxuICAgKiBDQVBfTEVBU0VcbiAgICovXG4gIExFQVNFID0gJ0xFQVNFJyxcbiAgLyoqXG4gICAqIENBUF9MSU5VWF9JTU1VVEFCTEVcbiAgICovXG4gIExJTlVYX0lNTVVUQUJMRSA9ICdMSU5VWF9JTU1VVEFCTEUnLFxuICAvKipcbiAgICogQ0FQX01BQ19BRE1JTlxuICAgKi9cbiAgTUFDX0FETUlOID0gJ01BQ19BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfTUFDX09WRVJSSURFXG4gICAqL1xuICBNQUNfT1ZFUlJJREUgPSAnTUFDX09WRVJSSURFJyxcbiAgLyoqXG4gICAqIENBUF9NS05PRFxuICAgKi9cbiAgTUtOT0QgPSAnTUtOT0QnLFxuICAvKipcbiAgICogQ0FQX05FVF9BRE1JTlxuICAgKi9cbiAgTkVUX0FETUlOID0gJ05FVF9BRE1JTicsXG4gIC8qKlxuICAgKiBDQVBfTkVUX0JJTkRfU0VSVklDRVxuICAgKi9cbiAgTkVUX0JJTkRfU0VSVklDRSA9ICdORVRfQklORF9TRVJWSUNFJyxcbiAgLyoqXG4gICAqIENBUF9ORVRfQlJPQURDQVNUXG4gICAqL1xuICBORVRfQlJPQURDQVNUID0gJ05FVF9CUk9BRENBU1QnLFxuICAvKipcbiAgICogQ0FQX05FVF9SQVdcbiAgICovXG4gIE5FVF9SQVcgPSAnTkVUX1JBVycsXG4gIC8qKlxuICAgKiBDQVBfU