cdk8s-plus-34 0.0.1 → 2.0.0
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 +101649 -0
- package/CODE_OF_CONDUCT.md +3 -0
- package/CONTRIBUTING.md +185 -0
- package/DCO +34 -0
- package/LICENSE +202 -0
- package/NOTICE +1 -0
- package/OWNERS.md +5 -0
- package/README.md +21 -33
- package/SECURITY.md +5 -0
- package/cdk8s.yaml +11 -0
- package/docs/java.md +150009 -0
- package/docs/plus/config-map.md +98 -0
- package/docs/plus/container.md +133 -0
- package/docs/plus/cronjob.md +67 -0
- package/docs/plus/deployment.md +232 -0
- package/docs/plus/horizontal-pod-autoscaler.md +226 -0
- package/docs/plus/ingress.md +68 -0
- package/docs/plus/job.md +48 -0
- package/docs/plus/namespace.md +58 -0
- package/docs/plus/network-policy.md +341 -0
- package/docs/plus/pod.md +455 -0
- package/docs/plus/pv.md +82 -0
- package/docs/plus/pvc.md +77 -0
- package/docs/plus/rbac.md +104 -0
- package/docs/plus/secret.md +32 -0
- package/docs/plus/service-account.md +35 -0
- package/docs/plus/service.md +41 -0
- package/docs/plus/volume.md +84 -0
- package/docs/python.md +161196 -0
- package/docs/typescript.md +139649 -0
- package/git-hooks/README.md +9 -0
- package/git-hooks/prepare-commit-msg +18 -0
- package/git-hooks/setup.sh +10 -0
- package/lib/_action.d.ts +26 -0
- package/lib/_action.js +39 -0
- package/lib/api-resource.d.ts +298 -0
- package/lib/api-resource.js +430 -0
- package/lib/base.d.ts +79 -0
- package/lib/base.js +92 -0
- package/lib/config-map.d.ts +126 -0
- package/lib/config-map.js +159 -0
- package/lib/container.d.ts +1057 -0
- package/lib/container.js +845 -0
- package/lib/cron-job.d.ts +138 -0
- package/lib/cron-job.js +103 -0
- package/lib/daemon-set.d.ts +45 -0
- package/lib/daemon-set.js +55 -0
- package/lib/deployment.d.ts +235 -0
- package/lib/deployment.js +216 -0
- package/lib/handler.d.ts +62 -0
- package/lib/handler.js +54 -0
- package/lib/horizontal-pod-autoscaler.d.ts +500 -0
- package/lib/horizontal-pod-autoscaler.js +569 -0
- package/lib/imports/k8s.d.ts +25809 -0
- package/lib/imports/k8s.js +19238 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +44 -0
- package/lib/ingress.d.ts +230 -0
- package/lib/ingress.js +246 -0
- package/lib/job.d.ts +64 -0
- package/lib/job.js +54 -0
- package/lib/namespace.d.ts +128 -0
- package/lib/namespace.js +109 -0
- package/lib/network-policy.d.ts +311 -0
- package/lib/network-policy.js +344 -0
- package/lib/pod.d.ts +1097 -0
- package/lib/pod.js +1147 -0
- package/lib/probe.d.ts +181 -0
- package/lib/probe.js +88 -0
- package/lib/pv.d.ts +375 -0
- package/lib/pv.js +273 -0
- package/lib/pvc.d.ts +163 -0
- package/lib/pvc.js +154 -0
- package/lib/role-binding.d.ts +138 -0
- package/lib/role-binding.js +165 -0
- package/lib/role.d.ts +268 -0
- package/lib/role.js +401 -0
- package/lib/secret.d.ts +195 -0
- package/lib/secret.js +185 -0
- package/lib/service-account.d.ts +83 -0
- package/lib/service-account.js +105 -0
- package/lib/service.d.ts +289 -0
- package/lib/service.js +182 -0
- package/lib/stateful-set.d.ts +206 -0
- package/lib/stateful-set.js +244 -0
- package/lib/utils.d.ts +4 -0
- package/lib/utils.js +33 -0
- package/lib/volume.d.ts +577 -0
- package/lib/volume.js +377 -0
- package/lib/workload.d.ts +121 -0
- package/lib/workload.js +122 -0
- package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
- package/node_modules/balanced-match/LICENSE.md +21 -0
- package/node_modules/balanced-match/README.md +97 -0
- package/node_modules/balanced-match/index.js +62 -0
- package/node_modules/balanced-match/package.json +48 -0
- package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
- package/node_modules/brace-expansion/LICENSE +21 -0
- package/node_modules/brace-expansion/README.md +135 -0
- package/node_modules/brace-expansion/index.js +202 -0
- package/node_modules/brace-expansion/package.json +49 -0
- package/node_modules/minimatch/LICENSE +15 -0
- package/node_modules/minimatch/README.md +491 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
- package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/ast.js +747 -0
- package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
- package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
- package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts +98 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/index.js +1023 -0
- package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/package.json +3 -0
- package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
- package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
- package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
- package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
- package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/ast.js +743 -0
- package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
- package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
- package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/escape.js +18 -0
- package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
- package/node_modules/minimatch/dist/esm/index.d.ts +98 -0
- package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/index.js +1007 -0
- package/node_modules/minimatch/dist/esm/index.js.map +1 -0
- package/node_modules/minimatch/dist/esm/package.json +3 -0
- package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
- package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/unescape.js +20 -0
- package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
- package/node_modules/minimatch/package.json +82 -0
- package/package.json +176 -6
- package/rotate.md +85 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NetworkPolicy = exports.NetworkPolicyTrafficDefault = exports.NetworkProtocol = exports.NetworkPolicyIpBlock = exports.NetworkPolicyPort = void 0;
|
|
5
|
+
exports.validatePeerConfig = validatePeerConfig;
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const cdk8s_1 = require("cdk8s");
|
|
8
|
+
const constructs_1 = require("constructs");
|
|
9
|
+
const base = require("./base");
|
|
10
|
+
const k8s = require("./imports/k8s");
|
|
11
|
+
const namespace = require("./namespace");
|
|
12
|
+
const pod = require("./pod");
|
|
13
|
+
const utils_1 = require("./utils");
|
|
14
|
+
/**
|
|
15
|
+
* Describes a port to allow traffic on.
|
|
16
|
+
*/
|
|
17
|
+
class NetworkPolicyPort {
|
|
18
|
+
/**
|
|
19
|
+
* Distinct TCP ports
|
|
20
|
+
*/
|
|
21
|
+
static tcp(port) {
|
|
22
|
+
return new NetworkPolicyPort(k8s.IntOrString.fromNumber(port), undefined, NetworkProtocol.TCP);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A TCP port range
|
|
26
|
+
*/
|
|
27
|
+
static tcpRange(startPort, endPort) {
|
|
28
|
+
return new NetworkPolicyPort(k8s.IntOrString.fromNumber(startPort), endPort, NetworkProtocol.TCP);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Any TCP traffic
|
|
32
|
+
*/
|
|
33
|
+
static allTcp() {
|
|
34
|
+
return new NetworkPolicyPort(k8s.IntOrString.fromNumber(0), 65535, NetworkProtocol.TCP);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Distinct UDP ports
|
|
38
|
+
*/
|
|
39
|
+
static udp(port) {
|
|
40
|
+
return new NetworkPolicyPort(k8s.IntOrString.fromNumber(port), undefined, NetworkProtocol.UDP);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A UDP port range
|
|
44
|
+
*/
|
|
45
|
+
static udpRange(startPort, endPort) {
|
|
46
|
+
return new NetworkPolicyPort(k8s.IntOrString.fromNumber(startPort), endPort, NetworkProtocol.UDP);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Any UDP traffic
|
|
50
|
+
*/
|
|
51
|
+
static allUdp() {
|
|
52
|
+
return new NetworkPolicyPort(k8s.IntOrString.fromNumber(0), 65535, NetworkProtocol.UDP);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Custom port configuration.
|
|
56
|
+
*/
|
|
57
|
+
static of(props) {
|
|
58
|
+
return new NetworkPolicyPort(props.port ? k8s.IntOrString.fromNumber(props.port) : undefined, props.endPort, props.protocol);
|
|
59
|
+
}
|
|
60
|
+
constructor(port, endPort, protocol) {
|
|
61
|
+
this.port = port;
|
|
62
|
+
this.endPort = endPort;
|
|
63
|
+
this.protocol = protocol;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
_toKube() {
|
|
69
|
+
return { port: this.port, endPort: this.endPort, protocol: this.protocol };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.NetworkPolicyPort = NetworkPolicyPort;
|
|
73
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
74
|
+
NetworkPolicyPort[_a] = { fqn: "cdk8s-plus-34.NetworkPolicyPort", version: "2.0.0" };
|
|
75
|
+
/**
|
|
76
|
+
* Describes a particular CIDR (Ex. "192.168.1.1/24","2001:db9::/64") that is
|
|
77
|
+
* allowed to the pods matched by a network policy selector.
|
|
78
|
+
* The except entry describes CIDRs that should not be included within this rule.
|
|
79
|
+
*/
|
|
80
|
+
class NetworkPolicyIpBlock extends constructs_1.Construct {
|
|
81
|
+
/**
|
|
82
|
+
* Create an IPv4 peer from a CIDR
|
|
83
|
+
*/
|
|
84
|
+
static ipv4(scope, id, cidrIp, except) {
|
|
85
|
+
const cidrMatch = cidrIp.match(/^(\d{1,3}\.){3}\d{1,3}(\/\d+)?$/);
|
|
86
|
+
if (!cidrMatch) {
|
|
87
|
+
throw new Error(`Invalid IPv4 CIDR: "${cidrIp}"`);
|
|
88
|
+
}
|
|
89
|
+
if (!cidrMatch[2]) {
|
|
90
|
+
throw new Error(`CIDR mask is missing in IPv4: "${cidrIp}". Did you mean "${cidrIp}/32"?`);
|
|
91
|
+
}
|
|
92
|
+
return new NetworkPolicyIpBlock(scope, id, cidrIp, except);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Any IPv4 address
|
|
96
|
+
*/
|
|
97
|
+
static anyIpv4(scope, id) {
|
|
98
|
+
return new NetworkPolicyIpBlock(scope, id, '0.0.0.0/0');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create an IPv6 peer from a CIDR
|
|
102
|
+
*/
|
|
103
|
+
static ipv6(scope, id, cidrIp, except) {
|
|
104
|
+
const cidrMatch = cidrIp.match(/^([\da-f]{0,4}:){2,7}([\da-f]{0,4})?(\/\d+)?$/);
|
|
105
|
+
if (!cidrMatch) {
|
|
106
|
+
throw new Error(`Invalid IPv6 CIDR: "${cidrIp}"`);
|
|
107
|
+
}
|
|
108
|
+
if (!cidrMatch[3]) {
|
|
109
|
+
throw new Error(`CIDR mask is missing in IPv6: "${cidrIp}". Did you mean "${cidrIp}/128"?`);
|
|
110
|
+
}
|
|
111
|
+
return new NetworkPolicyIpBlock(scope, id, cidrIp, except);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Any IPv6 address
|
|
115
|
+
*/
|
|
116
|
+
static anyIpv6(scope, id) {
|
|
117
|
+
return new NetworkPolicyIpBlock(scope, id, '::/0');
|
|
118
|
+
}
|
|
119
|
+
constructor(scope, id,
|
|
120
|
+
/**
|
|
121
|
+
* A string representing the IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64".
|
|
122
|
+
*/
|
|
123
|
+
cidr,
|
|
124
|
+
/**
|
|
125
|
+
* A slice of CIDRs that should not be included within an IP Block Valid examples are "192.168.1.1/24" or "2001:db9::/64".
|
|
126
|
+
* Except values will be rejected if they are outside the CIDR range.
|
|
127
|
+
*/
|
|
128
|
+
except) {
|
|
129
|
+
super(scope, id);
|
|
130
|
+
this.cidr = cidr;
|
|
131
|
+
this.except = except;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @see INetworkPolicyPeer.toNetworkPolicyPeerConfig()
|
|
135
|
+
*/
|
|
136
|
+
toNetworkPolicyPeerConfig() {
|
|
137
|
+
return { ipBlock: this };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* @see INetworkPolicyPeer.toPodSelector()
|
|
141
|
+
*/
|
|
142
|
+
toPodSelector() {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* @internal
|
|
147
|
+
*/
|
|
148
|
+
_toKube() {
|
|
149
|
+
return { cidr: this.cidr, except: this.except };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.NetworkPolicyIpBlock = NetworkPolicyIpBlock;
|
|
153
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
154
|
+
NetworkPolicyIpBlock[_b] = { fqn: "cdk8s-plus-34.NetworkPolicyIpBlock", version: "2.0.0" };
|
|
155
|
+
/**
|
|
156
|
+
* Network protocols.
|
|
157
|
+
*/
|
|
158
|
+
var NetworkProtocol;
|
|
159
|
+
(function (NetworkProtocol) {
|
|
160
|
+
/**
|
|
161
|
+
* TCP.
|
|
162
|
+
*/
|
|
163
|
+
NetworkProtocol["TCP"] = "TCP";
|
|
164
|
+
/**
|
|
165
|
+
* UDP.
|
|
166
|
+
*/
|
|
167
|
+
NetworkProtocol["UDP"] = "UDP";
|
|
168
|
+
/**
|
|
169
|
+
* SCTP.
|
|
170
|
+
*/
|
|
171
|
+
NetworkProtocol["SCTP"] = "SCTP";
|
|
172
|
+
})(NetworkProtocol || (exports.NetworkProtocol = NetworkProtocol = {}));
|
|
173
|
+
/**
|
|
174
|
+
* Default behaviors of network traffic in policies.
|
|
175
|
+
*/
|
|
176
|
+
var NetworkPolicyTrafficDefault;
|
|
177
|
+
(function (NetworkPolicyTrafficDefault) {
|
|
178
|
+
/**
|
|
179
|
+
* The policy denies all traffic.
|
|
180
|
+
* Since rules are additive, additional rules or policies can allow
|
|
181
|
+
* specific traffic.
|
|
182
|
+
*/
|
|
183
|
+
NetworkPolicyTrafficDefault["DENY"] = "DENY";
|
|
184
|
+
/**
|
|
185
|
+
* The policy allows all traffic (either ingress or egress).
|
|
186
|
+
* Since rules are additive, no additional rule or policies can
|
|
187
|
+
* subsequently deny the traffic.
|
|
188
|
+
*/
|
|
189
|
+
NetworkPolicyTrafficDefault["ALLOW"] = "ALLOW";
|
|
190
|
+
})(NetworkPolicyTrafficDefault || (exports.NetworkPolicyTrafficDefault = NetworkPolicyTrafficDefault = {}));
|
|
191
|
+
/**
|
|
192
|
+
* Control traffic flow at the IP address or port level (OSI layer 3 or 4),
|
|
193
|
+
* network policies are an application-centric construct which allow you
|
|
194
|
+
* to specify how a pod is allowed to communicate with various network peers.
|
|
195
|
+
*
|
|
196
|
+
* - Outgoing traffic is allowed if there are no network policies selecting
|
|
197
|
+
* the pod (and cluster policy otherwise allows the traffic),
|
|
198
|
+
* OR if the traffic matches at least one egress rule across all of the
|
|
199
|
+
* network policies that select the pod.
|
|
200
|
+
*
|
|
201
|
+
* - Incoming traffic is allowed to a pod if there are no network policies
|
|
202
|
+
* selecting the pod (and cluster policy otherwise allows the traffic),
|
|
203
|
+
* OR if the traffic source is the pod's local node,
|
|
204
|
+
* OR if the traffic matches at least one ingress rule across all of
|
|
205
|
+
* the network policies that select the pod.
|
|
206
|
+
*
|
|
207
|
+
* Network policies do not conflict; they are additive.
|
|
208
|
+
* If any policy or policies apply to a given pod for a given
|
|
209
|
+
* direction, the connections allowed in that direction from
|
|
210
|
+
* that pod is the union of what the applicable policies allow.
|
|
211
|
+
* Thus, order of evaluation does not affect the policy result.
|
|
212
|
+
*
|
|
213
|
+
* For a connection from a source pod to a destination pod to be allowed,
|
|
214
|
+
* both the egress policy on the source pod and the ingress policy on the
|
|
215
|
+
* destination pod need to allow the connection.
|
|
216
|
+
* If either side does not allow the connection, it will not happen.
|
|
217
|
+
*
|
|
218
|
+
* @see https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource
|
|
219
|
+
*/
|
|
220
|
+
class NetworkPolicy extends base.Resource {
|
|
221
|
+
constructor(scope, id, props = {}) {
|
|
222
|
+
super(scope, id);
|
|
223
|
+
this.resourceType = 'networkpolicies';
|
|
224
|
+
this._egressRules = [];
|
|
225
|
+
this._ingressRules = [];
|
|
226
|
+
this._policyTypes = new Set();
|
|
227
|
+
const podSelector = props.selector ?? pod.Pods.all(this, 'AllPods');
|
|
228
|
+
this._podSelectorConfig = podSelector.toPodSelectorConfig();
|
|
229
|
+
let ns;
|
|
230
|
+
if (!props.metadata?.namespace) {
|
|
231
|
+
if (this._podSelectorConfig.namespaces?.labelSelector && !this._podSelectorConfig.namespaces?.labelSelector.isEmpty()) {
|
|
232
|
+
throw new Error(`Unable to create a network policy for a selector (${podSelector.node.path}) that selects pods in namespaces based on labels`);
|
|
233
|
+
}
|
|
234
|
+
if (this._podSelectorConfig.namespaces?.names && this._podSelectorConfig.namespaces.names.length > 1) {
|
|
235
|
+
throw new Error(`Unable to create a network policy for a selector (${podSelector.node.path}) that selects pods in multiple namespaces`);
|
|
236
|
+
}
|
|
237
|
+
ns = this._podSelectorConfig.namespaces?.names ? this._podSelectorConfig.namespaces?.names[0] : undefined;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
ns = props.metadata.namespace;
|
|
241
|
+
}
|
|
242
|
+
this.apiObject = new k8s.KubeNetworkPolicy(this, 'Resource', {
|
|
243
|
+
metadata: { ...props.metadata, namespace: ns },
|
|
244
|
+
spec: cdk8s_1.Lazy.any({ produce: () => this._toKube() }),
|
|
245
|
+
});
|
|
246
|
+
this.configureDefaultBehavior('Egress', props.egress?.default);
|
|
247
|
+
this.configureDefaultBehavior('Ingress', props.ingress?.default);
|
|
248
|
+
for (const rule of props.egress?.rules ?? []) {
|
|
249
|
+
this.addEgressRule(rule.peer, rule.ports);
|
|
250
|
+
}
|
|
251
|
+
for (const rule of props.ingress?.rules ?? []) {
|
|
252
|
+
this.addIngressRule(rule.peer, rule.ports);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Allow outgoing traffic to the peer.
|
|
257
|
+
*
|
|
258
|
+
* If ports are not passed, traffic will be allowed on all ports.
|
|
259
|
+
*/
|
|
260
|
+
addEgressRule(peer, ports) {
|
|
261
|
+
this._policyTypes.add('Egress');
|
|
262
|
+
this._egressRules.push({ ports: (ports ?? []).map(p => p._toKube()), to: this.createNetworkPolicyPeers(peer) });
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Allow incoming traffic from the peer.
|
|
266
|
+
*
|
|
267
|
+
* If ports are not passed, traffic will be allowed on all ports.
|
|
268
|
+
*/
|
|
269
|
+
addIngressRule(peer, ports) {
|
|
270
|
+
this._policyTypes.add('Ingress');
|
|
271
|
+
this._ingressRules.push({ ports: (ports ?? []).map(p => p._toKube()), from: this.createNetworkPolicyPeers(peer) });
|
|
272
|
+
}
|
|
273
|
+
createNetworkPolicyPeers(peer) {
|
|
274
|
+
const config = peer.toNetworkPolicyPeerConfig();
|
|
275
|
+
validatePeerConfig(config);
|
|
276
|
+
if (config.ipBlock) {
|
|
277
|
+
// ip block is a single peer.
|
|
278
|
+
return [{ ipBlock: config.ipBlock._toKube() }];
|
|
279
|
+
}
|
|
280
|
+
if (!config.podSelector.namespaces?.names) {
|
|
281
|
+
// when no explicit namespaces are defined we can just use
|
|
282
|
+
// the selector as is
|
|
283
|
+
return [{
|
|
284
|
+
namespaceSelector: config.podSelector.namespaces?.labelSelector?._toKube(),
|
|
285
|
+
podSelector: config.podSelector.labelSelector._toKube(),
|
|
286
|
+
}];
|
|
287
|
+
}
|
|
288
|
+
// when explicit namespaces are defined, we need to create a separate
|
|
289
|
+
// peer for each, since a label selector cannot have multiple name labels. (they will conflict)
|
|
290
|
+
const namespaceSelector = config.podSelector?.namespaces?.labelSelector?._toKube() ?? {};
|
|
291
|
+
return config.podSelector.namespaces.names.map(n => ({
|
|
292
|
+
podSelector: config.podSelector.labelSelector._toKube(),
|
|
293
|
+
namespaceSelector: {
|
|
294
|
+
matchExpressions: namespaceSelector.matchExpressions,
|
|
295
|
+
matchLabels: {
|
|
296
|
+
...namespaceSelector.matchLabels,
|
|
297
|
+
[namespace.Namespace.NAME_LABEL]: n,
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
configureDefaultBehavior(direction, _default) {
|
|
303
|
+
if (!_default) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (_default === NetworkPolicyTrafficDefault.DENY) {
|
|
307
|
+
// https://kubernetes.io/docs/concepts/services-networking/network-policies/#default-deny-all-egress-traffic
|
|
308
|
+
this._policyTypes.add(direction);
|
|
309
|
+
}
|
|
310
|
+
if (_default === NetworkPolicyTrafficDefault.ALLOW) {
|
|
311
|
+
// https://kubernetes.io/docs/concepts/services-networking/network-policies/#allow-all-egress-traffic
|
|
312
|
+
this._policyTypes.add(direction);
|
|
313
|
+
if (direction === 'Egress') {
|
|
314
|
+
this._egressRules.push({});
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this._ingressRules.push({});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* @internal
|
|
323
|
+
*/
|
|
324
|
+
_toKube() {
|
|
325
|
+
return {
|
|
326
|
+
podSelector: this._podSelectorConfig.labelSelector._toKube(),
|
|
327
|
+
egress: (0, utils_1.undefinedIfEmpty)(this._egressRules),
|
|
328
|
+
ingress: (0, utils_1.undefinedIfEmpty)(this._ingressRules),
|
|
329
|
+
policyTypes: (0, utils_1.undefinedIfEmpty)(Array.from(this._policyTypes)),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
exports.NetworkPolicy = NetworkPolicy;
|
|
334
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
335
|
+
NetworkPolicy[_c] = { fqn: "cdk8s-plus-34.NetworkPolicy", version: "2.0.0" };
|
|
336
|
+
function validatePeerConfig(peerConfig) {
|
|
337
|
+
if (!peerConfig.ipBlock && !peerConfig.podSelector) {
|
|
338
|
+
throw new Error('Inavlid peer: either \'ipBlock\' or \'podSelector\' must be defined');
|
|
339
|
+
}
|
|
340
|
+
if (peerConfig.ipBlock && peerConfig.podSelector) {
|
|
341
|
+
throw new Error('Inavlid peer: only one of \'ipBlock\' and \'podSelector\' must be defined');
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQWdoQkEsZ0RBT0M7O0FBdmhCRCxpQ0FBd0M7QUFDeEMsMkNBQW1EO0FBQ25ELCtCQUErQjtBQUMvQixxQ0FBcUM7QUFDckMseUNBQXlDO0FBQ3pDLDZCQUE2QjtBQUM3QixtQ0FBMkM7QUE4QjNDOztHQUVHO0FBQ0gsTUFBYSxpQkFBaUI7SUFFNUI7O09BRUc7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDdkQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE1BQU07UUFDbEIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFZO1FBQzVCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7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SUFDL0YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlPYmplY3QsIExhenkgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIGs4cyBmcm9tICcuL2ltcG9ydHMvazhzJztcbmltcG9ydCAqIGFzIG5hbWVzcGFjZSBmcm9tICcuL25hbWVzcGFjZSc7XG5pbXBvcnQgKiBhcyBwb2QgZnJvbSAnLi9wb2QnO1xuaW1wb3J0IHsgdW5kZWZpbmVkSWZFbXB0eSB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGBOZXR3b3JrUG9saWN5UG9ydGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1BvbGljeVBvcnRQcm9wcyB7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIHBvcnQgbnVtYmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwb3J0cyBhcmUgYWxsb3dlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVuZCBwb3J0IChyZWxhdGl2ZSB0byBgcG9ydGApLiBPbmx5IGFwcGxpZXMgaWYgYHBvcnRgIGlzIGRlZmluZWQuXG4gICAqIFVzZSB0aGlzIHRvIHNwZWNpZnkgYSBwb3J0IHJhbmdlLCByYXRoZXIgdGhhdCBhIHNwZWNpZmljIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub3QgYSBwb3J0IHJhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogUHJvdG9jb2wuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5ldHdvcmtQcm90b2NvbC5UQ1BcbiAgICovXG4gIHJlYWRvbmx5IHByb3RvY29sPzogTmV0d29ya1Byb3RvY29sO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHBvcnQgdG8gYWxsb3cgdHJhZmZpYyBvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtQb2xpY3lQb3J0IHtcblxuICAvKipcbiAgICogRGlzdGluY3QgVENQIHBvcnRzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRjcChwb3J0OiBudW1iZXIpOiBOZXR3b3JrUG9saWN5UG9ydCB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5UG9ydChrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcihwb3J0KSwgdW5kZWZpbmVkLCBOZXR3b3JrUHJvdG9jb2wuVENQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIFRDUCBwb3J0IHJhbmdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRjcFJhbmdlKHN0YXJ0UG9ydDogbnVtYmVyLCBlbmRQb3J0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lQb3J0KGs4cy5JbnRPclN0cmluZy5mcm9tTnVtYmVyKHN0YXJ0UG9ydCksIGVuZFBvcnQsIE5ldHdvcmtQcm90b2NvbC5UQ1ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFueSBUQ1AgdHJhZmZpY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbGxUY3AoKSB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5UG9ydChrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcigwKSwgNjU1MzUsIE5ldHdvcmtQcm90b2NvbC5UQ1ApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3RpbmN0IFVEUCBwb3J0c1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1ZHAocG9ydDogbnVtYmVyKTogTmV0d29ya1BvbGljeVBvcnQge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeVBvcnQoazhzLkludE9yU3RyaW5nLmZyb21OdW1iZXIocG9ydCksIHVuZGVmaW5lZCwgTmV0d29ya1Byb3RvY29sLlVEUCk7XG4gIH1cblxuICAvKipcbiAgICogQSBVRFAgcG9ydCByYW5nZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1ZHBSYW5nZShzdGFydFBvcnQ6IG51bWJlciwgZW5kUG9ydDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5UG9ydChrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcihzdGFydFBvcnQpLCBlbmRQb3J0LCBOZXR3b3JrUHJvdG9jb2wuVURQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbnkgVURQIHRyYWZmaWNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsVWRwKCkge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeVBvcnQoazhzLkludE9yU3RyaW5nLmZyb21OdW1iZXIoMCksIDY1NTM1LCBOZXR3b3JrUHJvdG9jb2wuVURQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gcG9ydCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihwcm9wczogTmV0d29ya1BvbGljeVBvcnRQcm9wcyk6IE5ldHdvcmtQb2xpY3lQb3J0IHtcbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lQb3J0KHByb3BzLnBvcnQgPyBrOHMuSW50T3JTdHJpbmcuZnJvbU51bWJlcihwcm9wcy5wb3J0KSA6IHVuZGVmaW5lZCwgcHJvcHMuZW5kUG9ydCwgcHJvcHMucHJvdG9jb2wpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcnQ/OiBrOHMuSW50T3JTdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbmRQb3J0PzogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvdG9jb2w/OiBOZXR3b3JrUHJvdG9jb2wpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF90b0t1YmUoKTogazhzLk5ldHdvcmtQb2xpY3lQb3J0IHtcbiAgICByZXR1cm4geyBwb3J0OiB0aGlzLnBvcnQsIGVuZFBvcnQ6IHRoaXMuZW5kUG9ydCwgcHJvdG9jb2w6IHRoaXMucHJvdG9jb2wgfTtcbiAgfVxuXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgbmV0d29yayBwZWVycy5cbiAqIEEgcGVlciBjYW4gZWl0aGVyIGJ5IGFuIGlwIGJsb2NrLCBvciBhIHNlbGVjdGlvbiBvZiBwb2RzLCBub3QgYm90aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrUG9saWN5UGVlckNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIFRoZSBpcCBibG9jayB0aGlzIHBlZXIgcmVwcmVzZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGlwQmxvY2s/OiBOZXR3b3JrUG9saWN5SXBCbG9jaztcblxuICAvKipcbiAgICogVGhlIHBvZCBzZWxlY3RvciB0aGlzIHBlZXIgcmVwcmVzZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHBvZFNlbGVjdG9yPzogcG9kLlBvZFNlbGVjdG9yQ29uZmlnO1xuXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgcGVlciB0byBhbGxvdyB0cmFmZmljIHRvL2Zyb20uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSU5ldHdvcmtQb2xpY3lQZWVyIGV4dGVuZHMgSUNvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBwZWVyLlxuICAgKi9cbiAgdG9OZXR3b3JrUG9saWN5UGVlckNvbmZpZygpOiBOZXR3b3JrUG9saWN5UGVlckNvbmZpZztcblxuICAvKipcbiAgICogQ29udmVydCB0aGUgcGVlciBpbnRvIGEgcG9kIHNlbGVjdG9yLCBpZiBwb3NzaWJsZS5cbiAgICovXG4gIHRvUG9kU2VsZWN0b3IoKTogcG9kLklQb2RTZWxlY3RvciB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgYSBydWxlIGFsbG93aW5nIHRyYWZmaWMgZnJvbSAvIHRvIHBvZHMgbWF0Y2hlZCBieSBhIG5ldHdvcmsgcG9saWN5IHNlbGVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtQb2xpY3lSdWxlIHtcblxuICAvKipcbiAgICogVGhlIHBvcnRzIG9mIHRoZSBydWxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRyYWZmaWMgaXMgYWxsb3dlZCBvbiBhbGwgcG9ydHMuXG4gICAqL1xuICByZWFkb25seSBwb3J0cz86IE5ldHdvcmtQb2xpY3lQb3J0W107XG5cbiAgLyoqXG4gICAqIFBlZXIgdGhpcyBydWxlIGludGVyYWN0cyB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVlcjogSU5ldHdvcmtQb2xpY3lQZWVyO1xuXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGEgcGFydGljdWxhciBDSURSIChFeC4gXCIxOTIuMTY4LjEuMS8yNFwiLFwiMjAwMTpkYjk6Oi82NFwiKSB0aGF0IGlzXG4gKiBhbGxvd2VkIHRvIHRoZSBwb2RzIG1hdGNoZWQgYnkgYSBuZXR3b3JrIHBvbGljeSBzZWxlY3Rvci5cbiAqIFRoZSBleGNlcHQgZW50cnkgZGVzY3JpYmVzIENJRFJzIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCB3aXRoaW4gdGhpcyBydWxlLlxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya1BvbGljeUlwQmxvY2sgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJTmV0d29ya1BvbGljeVBlZXIge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSVB2NCBwZWVyIGZyb20gYSBDSURSXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwdjQoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2lkcklwOiBzdHJpbmcsIGV4Y2VwdD86IHN0cmluZ1tdKTogTmV0d29ya1BvbGljeUlwQmxvY2sge1xuICAgIGNvbnN0IGNpZHJNYXRjaCA9IGNpZHJJcC5tYXRjaCgvXihcXGR7MSwzfVxcLil7M31cXGR7MSwzfShcXC9cXGQrKT8kLyk7XG5cbiAgICBpZiAoIWNpZHJNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIElQdjQgQ0lEUjogXCIke2NpZHJJcH1cImApO1xuICAgIH1cblxuICAgIGlmICghY2lkck1hdGNoWzJdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENJRFIgbWFzayBpcyBtaXNzaW5nIGluIElQdjQ6IFwiJHtjaWRySXB9XCIuIERpZCB5b3UgbWVhbiBcIiR7Y2lkcklwfS8zMlwiP2ApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeUlwQmxvY2soc2NvcGUsIGlkLCBjaWRySXAsIGV4Y2VwdCk7XG4gIH1cblxuICAvKipcbiAgICogQW55IElQdjQgYWRkcmVzc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbnlJcHY0KHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpOiBOZXR3b3JrUG9saWN5SXBCbG9jayB7XG4gICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5SXBCbG9jayhzY29wZSwgaWQsICcwLjAuMC4wLzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSVB2NiBwZWVyIGZyb20gYSBDSURSXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwdjYoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2lkcklwOiBzdHJpbmcsIGV4Y2VwdD86IHN0cmluZ1tdKTogTmV0d29ya1BvbGljeUlwQmxvY2sge1xuXG4gICAgY29uc3QgY2lkck1hdGNoID0gY2lkcklwLm1hdGNoKC9eKFtcXGRhLWZdezAsNH06KXsyLDd9KFtcXGRhLWZdezAsNH0pPyhcXC9cXGQrKT8kLyk7XG5cbiAgICBpZiAoIWNpZHJNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIElQdjYgQ0lEUjogXCIke2NpZHJJcH1cImApO1xuICAgIH1cblxuICAgIGlmICghY2lkck1hdGNoWzNdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENJRFIgbWFzayBpcyBtaXNzaW5nIGluIElQdjY6IFwiJHtjaWRySXB9XCIuIERpZCB5b3UgbWVhbiBcIiR7Y2lkcklwfS8xMjhcIj9gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lJcEJsb2NrKHNjb3BlLCBpZCwgY2lkcklwLCBleGNlcHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFueSBJUHY2IGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYW55SXB2NihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogTmV0d29ya1BvbGljeUlwQmxvY2sge1xuICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeUlwQmxvY2soc2NvcGUsIGlkLCAnOjovMCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSVAgQmxvY2sgVmFsaWQgZXhhbXBsZXMgYXJlIFwiMTkyLjE2OC4xLjEvMjRcIiBvciBcIjIwMDE6ZGI5OjovNjRcIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIEEgc2xpY2Ugb2YgQ0lEUnMgdGhhdCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIHdpdGhpbiBhbiBJUCBCbG9jayBWYWxpZCBleGFtcGxlcyBhcmUgXCIxOTIuMTY4LjEuMS8yNFwiIG9yIFwiMjAwMTpkYjk6Oi82NFwiLlxuICAgICAqIEV4Y2VwdCB2YWx1ZXMgd2lsbCBiZSByZWplY3RlZCBpZiB0aGV5IGFyZSBvdXRzaWRlIHRoZSBDSURSIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBleGNlcHQ/OiBzdHJpbmdbXSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBJTmV0d29ya1BvbGljeVBlZXIudG9OZXR3b3JrUG9saWN5UGVlckNvbmZpZygpXG4gICAqL1xuICBwdWJsaWMgdG9OZXR3b3JrUG9saWN5UGVlckNvbmZpZygpOiBOZXR3b3JrUG9saWN5UGVlckNvbmZpZyB7XG4gICAgcmV0dXJuIHsgaXBCbG9jazogdGhpcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgSU5ldHdvcmtQb2xpY3lQZWVyLnRvUG9kU2VsZWN0b3IoKVxuICAgKi9cbiAgcHVibGljIHRvUG9kU2VsZWN0b3IoKTogcG9kLklQb2RTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9LdWJlKCk6IGs4cy5JcEJsb2NrIHtcbiAgICByZXR1cm4geyBjaWRyOiB0aGlzLmNpZHIsIGV4Y2VwdDogdGhpcy5leGNlcHQgfTtcbiAgfVxuXG59XG5cbi8qKlxuICogTmV0d29yayBwcm90b2NvbHMuXG4gKi9cbmV4cG9ydCBlbnVtIE5ldHdvcmtQcm90b2NvbCB7XG4gIC8qKlxuICAgKiBUQ1AuXG4gICAqL1xuICBUQ1AgPSAnVENQJyxcbiAgLyoqXG4gICAqIFVEUC5cbiAgICovXG4gIFVEUCA9ICdVRFAnLFxuICAvKipcbiAgICogU0NUUC5cbiAgICovXG4gIFNDVFAgPSAnU0NUUCcsXG59XG5cbi8qKlxuICogRGVmYXVsdCBiZWhhdmlvcnMgb2YgbmV0d29yayB0cmFmZmljIGluIHBvbGljaWVzLlxuICovXG5leHBvcnQgZW51bSBOZXR3b3JrUG9saWN5VHJhZmZpY0RlZmF1bHQge1xuICAvKipcbiAgICogVGhlIHBvbGljeSBkZW5pZXMgYWxsIHRyYWZmaWMuXG4gICAqIFNpbmNlIHJ1bGVzIGFyZSBhZGRpdGl2ZSwgYWRkaXRpb25hbCBydWxlcyBvciBwb2xpY2llcyBjYW4gYWxsb3dcbiAgICogc3BlY2lmaWMgdHJhZmZpYy5cbiAgICovXG4gIERFTlkgPSAnREVOWScsXG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IGFsbG93cyBhbGwgdHJhZmZpYyAoZWl0aGVyIGluZ3Jlc3Mgb3IgZWdyZXNzKS5cbiAgICogU2luY2UgcnVsZXMgYXJlIGFkZGl0aXZlLCBubyBhZGRpdGlvbmFsIHJ1bGUgb3IgcG9saWNpZXMgY2FuXG4gICAqIHN1YnNlcXVlbnRseSBkZW55IHRoZSB0cmFmZmljLlxuICAgKi9cbiAgQUxMT1cgPSAnQUxMT1cnLFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBob3cgdGhlIG5ldHdvcmsgcG9saWN5IHNob3VsZCBjb25maWd1cmUgZWdyZXNzIC8gaW5ncmVzcyB0cmFmZmljLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtQb2xpY3lUcmFmZmljIHtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBwb2xpY3kgd2hlblxuICAgKiBubyBydWxlcyBhcmUgZGVmaW5lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bnNldCwgdGhlIHBvbGljeSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdD86IE5ldHdvcmtQb2xpY3lUcmFmZmljRGVmYXVsdDtcblxuICAvKipcbiAgICogTGlzdCBvZiBydWxlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBzZWxlY3RlZCBwb2RzLlxuICAgKiBJZiBlbXB0eSwgdGhlIGJlaGF2aW9yIG9mIHRoZSBwb2xpY3kgaXMgZGljdGF0ZWQgYnkgdGhlIGBkZWZhdWx0YCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcnVsZXM/OiBOZXR3b3JrUG9saWN5UnVsZVtdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBOZXR3b3JrUG9saWN5LmFkZEVncmVzc1J1bGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtQb2xpY3lBZGRFZ3Jlc3NSdWxlT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIFBvcnRzIHRoZSBydWxlIHNob3VsZCBhbGxvdyBvdXRnb2luZyB0cmFmZmljIHRvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIHRoZSBwZWVyIGlzIGEgbWFuYWdlZCBwb2QsIHRha2UgaXRzIHBvcnRzLiBPdGhlcndpc2UsIGFsbCBwb3J0cyBhcmUgYWxsb3dlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnRzPzogTmV0d29ya1BvbGljeVBvcnRbXTtcblxufVxuXG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYE5ldHdvcmtQb2xpY3lgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtQb2xpY3lQcm9wcyBleHRlbmRzIGJhc2UuUmVzb3VyY2VQcm9wcyB7XG5cbiAgLyoqXG4gICAqIFdoaWNoIHBvZHMgZG9lcyB0aGlzIHBvbGljeSBvYmplY3QgYXBwbGllcyB0by5cbiAgICpcbiAgICogVGhpcyBjYW4gZWl0aGVyIGJlIGEgc2luZ2xlIHBvZCAvIHdvcmtsb2FkLCBvciBhIGdyb3VwaW5nIG9mIHBvZHMgc2VsZWN0ZWRcbiAgICogdmlhIHRoZSBgUG9kcy5zZWxlY3RgIGZ1bmN0aW9uLiBSdWxlcyBpcyBhcHBsaWVkIHRvIGFueSBwb2RzIHNlbGVjdGVkIGJ5IHRoaXMgcHJvcGVydHkuXG4gICAqIE11bHRpcGxlIG5ldHdvcmsgcG9saWNpZXMgY2FuIHNlbGVjdCB0aGUgc2FtZSBzZXQgb2YgcG9kcy5cbiAgICogSW4gdGhpcyBjYXNlLCB0aGUgcnVsZXMgZm9yIGVhY2ggYXJlIGNvbWJpbmVkIGFkZGl0aXZlbHkuXG4gICAqXG4gICAqIE5vdGUgdGhhdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHdpbGwgc2VsZWN0IGFsbCBwb2RzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdG9yPzogcG9kLklQb2RTZWxlY3RvcjtcblxuICAvKipcbiAgICogRWdyZXNzIHRyYWZmaWMgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcG9saWN5IGRvZXNuJ3QgY2hhbmdlIGVncmVzcyBiZWhhdmlvciBvZiB0aGUgcG9kcyBpdCBzZWxlY3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWdyZXNzPzogTmV0d29ya1BvbGljeVRyYWZmaWM7XG5cbiAgLyoqXG4gICAqIEluZ3Jlc3MgdHJhZmZpYyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBwb2xpY3kgZG9lc24ndCBjaGFuZ2UgaW5ncmVzcyBiZWhhdmlvciBvZiB0aGUgcG9kcyBpdCBzZWxlY3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5ncmVzcz86IE5ldHdvcmtQb2xpY3lUcmFmZmljO1xufVxuXG4vKipcbiAqIENvbnRyb2wgdHJhZmZpYyBmbG93IGF0IHRoZSBJUCBhZGRyZXNzIG9yIHBvcnQgbGV2ZWwgKE9TSSBsYXllciAzIG9yIDQpLFxuICogbmV0d29yayBwb2xpY2llcyBhcmUgYW4gYXBwbGljYXRpb24tY2VudHJpYyBjb25zdHJ1Y3Qgd2hpY2ggYWxsb3cgeW91XG4gKiB0byBzcGVjaWZ5IGhvdyBhIHBvZCBpcyBhbGxvd2VkIHRvIGNvbW11bmljYXRlIHdpdGggdmFyaW91cyBuZXR3b3JrIHBlZXJzLlxuICpcbiAqIC0gT3V0Z29pbmcgdHJhZmZpYyBpcyBhbGxvd2VkIGlmIHRoZXJlIGFyZSBubyBuZXR3b3JrIHBvbGljaWVzIHNlbGVjdGluZ1xuICogICB0aGUgcG9kIChhbmQgY2x1c3RlciBwb2xpY3kgb3RoZXJ3aXNlIGFsbG93cyB0aGUgdHJhZmZpYyksXG4gKiAgIE9SIGlmIHRoZSB0cmFmZmljIG1hdGNoZXMgYXQgbGVhc3Qgb25lIGVncmVzcyBydWxlIGFjcm9zcyBhbGwgb2YgdGhlXG4gKiAgIG5ldHdvcmsgcG9saWNpZXMgdGhhdCBzZWxlY3QgdGhlIHBvZC5cbiAqXG4gKiAtIEluY29taW5nIHRyYWZmaWMgaXMgYWxsb3dlZCB0byBhIHBvZCBpZiB0aGVyZSBhcmUgbm8gbmV0d29yayBwb2xpY2llc1xuICogICBzZWxlY3RpbmcgdGhlIHBvZCAoYW5kIGNsdXN0ZXIgcG9saWN5IG90aGVyd2lzZSBhbGxvd3MgdGhlIHRyYWZmaWMpLFxuICogICBPUiBpZiB0aGUgdHJhZmZpYyBzb3VyY2UgaXMgdGhlIHBvZCdzIGxvY2FsIG5vZGUsXG4gKiAgIE9SIGlmIHRoZSB0cmFmZmljIG1hdGNoZXMgYXQgbGVhc3Qgb25lIGluZ3Jlc3MgcnVsZSBhY3Jvc3MgYWxsIG9mXG4gKiAgIHRoZSBuZXR3b3JrIHBvbGljaWVzIHRoYXQgc2VsZWN0IHRoZSBwb2QuXG4gKlxuICogTmV0d29yayBwb2xpY2llcyBkbyBub3QgY29uZmxpY3Q7IHRoZXkgYXJlIGFkZGl0aXZlLlxuICogSWYgYW55IHBvbGljeSBvciBwb2xpY2llcyBhcHBseSB0byBhIGdpdmVuIHBvZCBmb3IgYSBnaXZlblxuICogZGlyZWN0aW9uLCB0aGUgY29ubmVjdGlvbnMgYWxsb3dlZCBpbiB0aGF0IGRpcmVjdGlvbiBmcm9tXG4gKiB0aGF0IHBvZCBpcyB0aGUgdW5pb24gb2Ygd2hhdCB0aGUgYXBwbGljYWJsZSBwb2xpY2llcyBhbGxvdy5cbiAqIFRodXMsIG9yZGVyIG9mIGV2YWx1YXRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwb2xpY3kgcmVzdWx0LlxuICpcbiAqIEZvciBhIGNvbm5lY3Rpb24gZnJvbSBhIHNvdXJjZSBwb2QgdG8gYSBkZXN0aW5hdGlvbiBwb2QgdG8gYmUgYWxsb3dlZCxcbiAqIGJvdGggdGhlIGVncmVzcyBwb2xpY3kgb24gdGhlIHNvdXJjZSBwb2QgYW5kIHRoZSBpbmdyZXNzIHBvbGljeSBvbiB0aGVcbiAqIGRlc3RpbmF0aW9uIHBvZCBuZWVkIHRvIGFsbG93IHRoZSBjb25uZWN0aW9uLlxuICogSWYgZWl0aGVyIHNpZGUgZG9lcyBub3QgYWxsb3cgdGhlIGNvbm5lY3Rpb24sIGl0IHdpbGwgbm90IGhhcHBlbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL3NlcnZpY2VzLW5ldHdvcmtpbmcvbmV0d29yay1wb2xpY2llcy8jbmV0d29ya3BvbGljeS1yZXNvdXJjZVxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya1BvbGljeSBleHRlbmRzIGJhc2UuUmVzb3VyY2Uge1xuXG4gIC8qKlxuICAgKiBAc2VlIGJhc2UuUmVzb3VyY2UuYXBpT2JqZWN0XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpT2JqZWN0OiBBcGlPYmplY3Q7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlVHlwZTogc3RyaW5nID0gJ25ldHdvcmtwb2xpY2llcyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcG9kU2VsZWN0b3JDb25maWc6IHBvZC5Qb2RTZWxlY3RvckNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZWdyZXNzUnVsZXM6IGs4cy5OZXR3b3JrUG9saWN5RWdyZXNzUnVsZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luZ3Jlc3NSdWxlczogazhzLk5ldHdvcmtQb2xpY3lJbmdyZXNzUnVsZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BvbGljeVR5cGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5ldHdvcmtQb2xpY3lQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHBvZFNlbGVjdG9yID0gcHJvcHMuc2VsZWN0b3IgPz8gcG9kLlBvZHMuYWxsKHRoaXMsICdBbGxQb2RzJyk7XG4gICAgdGhpcy5fcG9kU2VsZWN0b3JDb25maWcgPSBwb2RTZWxlY3Rvci50b1BvZFNlbGVjdG9yQ29uZmlnKCk7XG5cbiAgICBsZXQgbnM7XG5cbiAgICBpZiAoIXByb3BzLm1ldGFkYXRhPy5uYW1lc3BhY2UpIHtcblxuICAgICAgaWYgKHRoaXMuX3BvZFNlbGVjdG9yQ29uZmlnLm5hbWVzcGFjZXM/LmxhYmVsU2VsZWN0b3IgJiYgIXRoaXMuX3BvZFNlbGVjdG9yQ29uZmlnLm5hbWVzcGFjZXM/LmxhYmVsU2VsZWN0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSBhIG5ldHdvcmsgcG9saWN5IGZvciBhIHNlbGVjdG9yICgke3BvZFNlbGVjdG9yLm5vZGUucGF0aH0pIHRoYXQgc2VsZWN0cyBwb2RzIGluIG5hbWVzcGFjZXMgYmFzZWQgb24gbGFiZWxzYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9wb2RTZWxlY3RvckNvbmZpZy5uYW1lc3BhY2VzPy5uYW1lcyAmJiB0aGlzLl9wb2RTZWxlY3RvckNvbmZpZy5uYW1lc3BhY2VzLm5hbWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY3JlYXRlIGEgbmV0d29yayBwb2xpY3kgZm9yIGEgc2VsZWN0b3IgKCR7cG9kU2VsZWN0b3Iubm9kZS5wYXRofSkgdGhhdCBzZWxlY3RzIHBvZHMgaW4gbXVsdGlwbGUgbmFtZXNwYWNlc2ApO1xuICAgICAgfVxuXG4gICAgICBucyA9IHRoaXMuX3BvZFNlbGVjdG9yQ29uZmlnLm5hbWVzcGFjZXM/Lm5hbWVzID8gdGhpcy5fcG9kU2VsZWN0b3JDb25maWcubmFtZXNwYWNlcz8ubmFtZXNbMF0gOiB1bmRlZmluZWQ7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbnMgPSBwcm9wcy5tZXRhZGF0YS5uYW1lc3BhY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlPYmplY3QgPSBuZXcgazhzLkt1YmVOZXR3b3JrUG9saWN5KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG1ldGFkYXRhOiB7IC4uLnByb3BzLm1ldGFkYXRhLCBuYW1lc3BhY2U6IG5zIH0sXG4gICAgICBzcGVjOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuX3RvS3ViZSgpIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWd1cmVEZWZhdWx0QmVoYXZpb3IoJ0VncmVzcycsIHByb3BzLmVncmVzcz8uZGVmYXVsdCk7XG4gICAgdGhpcy5jb25maWd1cmVEZWZhdWx0QmVoYXZpb3IoJ0luZ3Jlc3MnLCBwcm9wcy5pbmdyZXNzPy5kZWZhdWx0KTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBwcm9wcy5lZ3Jlc3M/LnJ1bGVzID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZEVncmVzc1J1bGUocnVsZS5wZWVyLCBydWxlLnBvcnRzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcHJvcHMuaW5ncmVzcz8ucnVsZXMgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkSW5ncmVzc1J1bGUocnVsZS5wZWVyLCBydWxlLnBvcnRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgb3V0Z29pbmcgdHJhZmZpYyB0byB0aGUgcGVlci5cbiAgICpcbiAgICogSWYgcG9ydHMgYXJlIG5vdCBwYXNzZWQsIHRyYWZmaWMgd2lsbCBiZSBhbGxvd2VkIG9uIGFsbCBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBhZGRFZ3Jlc3NSdWxlKHBlZXI6IElOZXR3b3JrUG9saWN5UGVlciwgcG9ydHM/OiBOZXR3b3JrUG9saWN5UG9ydFtdKSB7XG4gICAgdGhpcy5fcG9saWN5VHlwZXMuYWRkKCdFZ3Jlc3MnKTtcbiAgICB0aGlzLl9lZ3Jlc3NSdWxlcy5wdXNoKHsgcG9ydHM6IChwb3J0cyA/PyBbXSkubWFwKHAgPT4gcC5fdG9LdWJlKCkpLCB0bzogdGhpcy5jcmVhdGVOZXR3b3JrUG9saWN5UGVlcnMocGVlcikgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgaW5jb21pbmcgdHJhZmZpYyBmcm9tIHRoZSBwZWVyLlxuICAgKlxuICAgKiBJZiBwb3J0cyBhcmUgbm90IHBhc3NlZCwgdHJhZmZpYyB3aWxsIGJlIGFsbG93ZWQgb24gYWxsIHBvcnRzLlxuICAgKi9cbiAgcHVibGljIGFkZEluZ3Jlc3NSdWxlKHBlZXI6IElOZXR3b3JrUG9saWN5UGVlciwgcG9ydHM/OiBOZXR3b3JrUG9saWN5UG9ydFtdKSB7XG4gICAgdGhpcy5fcG9saWN5VHlwZXMuYWRkKCdJbmdyZXNzJyk7XG4gICAgdGhpcy5faW5ncmVzc1J1bGVzLnB1c2goeyBwb3J0czogKHBvcnRzID8/IFtdKS5tYXAocCA9PiBwLl90b0t1YmUoKSksIGZyb206IHRoaXMuY3JlYXRlTmV0d29ya1BvbGljeVBlZXJzKHBlZXIpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXR3b3JrUG9saWN5UGVlcnMocGVlcjogSU5ldHdvcmtQb2xpY3lQZWVyKTogazhzLk5ldHdvcmtQb2xpY3lQZWVyW10ge1xuXG4gICAgY29uc3QgY29uZmlnID0gcGVlci50b05ldHdvcmtQb2xpY3lQZWVyQ29uZmlnKCk7XG5cbiAgICB2YWxpZGF0ZVBlZXJDb25maWcoY29uZmlnKTtcblxuICAgIGlmIChjb25maWcuaXBCbG9jaykge1xuICAgICAgLy8gaXAgYmxvY2sgaXMgYSBzaW5nbGUgcGVlci5cbiAgICAgIHJldHVybiBbeyBpcEJsb2NrOiBjb25maWcuaXBCbG9jay5fdG9LdWJlKCkgfV07XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcucG9kU2VsZWN0b3IhLm5hbWVzcGFjZXM/Lm5hbWVzKSB7XG4gICAgICAvLyB3aGVuIG5vIGV4cGxpY2l0IG5hbWVzcGFjZXMgYXJlIGRlZmluZWQgd2UgY2FuIGp1c3QgdXNlXG4gICAgICAvLyB0aGUgc2VsZWN0b3IgYXMgaXNcbiAgICAgIHJldHVybiBbe1xuICAgICAgICBuYW1lc3BhY2VTZWxlY3RvcjogY29uZmlnLnBvZFNlbGVjdG9yIS5uYW1lc3BhY2VzPy5sYWJlbFNlbGVjdG9yPy5fdG9LdWJlKCksXG4gICAgICAgIHBvZFNlbGVjdG9yOiBjb25maWcucG9kU2VsZWN0b3IhLmxhYmVsU2VsZWN0b3IuX3RvS3ViZSgpLFxuICAgICAgfV07XG4gICAgfVxuXG4gICAgLy8gd2hlbiBleHBsaWNpdCBuYW1lc3BhY2VzIGFyZSBkZWZpbmVkLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlXG4gICAgLy8gcGVlciBmb3IgZWFjaCwgc2luY2UgYSBsYWJlbCBzZWxlY3RvciBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBuYW1lIGxhYmVscy4gKHRoZXkgd2lsbCBjb25mbGljdClcbiAgICBjb25zdCBuYW1lc3BhY2VTZWxlY3RvciA9IGNvbmZpZy5wb2RTZWxlY3Rvcj8ubmFtZXNwYWNlcz8ubGFiZWxTZWxlY3Rvcj8uX3RvS3ViZSgpID8/IHt9O1xuICAgIHJldHVybiBjb25maWcucG9kU2VsZWN0b3IhLm5hbWVzcGFjZXMubmFtZXMhLm1hcChuID0+ICh7XG4gICAgICBwb2RTZWxlY3RvcjogY29uZmlnLnBvZFNlbGVjdG9yIS5sYWJlbFNlbGVjdG9yLl90b0t1YmUoKSxcbiAgICAgIG5hbWVzcGFjZVNlbGVjdG9yOiB7XG4gICAgICAgIG1hdGNoRXhwcmVzc2lvbnM6IG5hbWVzcGFjZVNlbGVjdG9yLm1hdGNoRXhwcmVzc2lvbnMsXG4gICAgICAgIG1hdGNoTGFiZWxzOiB7XG4gICAgICAgICAgLi4ubmFtZXNwYWNlU2VsZWN0b3IubWF0Y2hMYWJlbHMsXG4gICAgICAgICAgW25hbWVzcGFjZS5OYW1lc3BhY2UuTkFNRV9MQUJFTF06IG4sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRGVmYXVsdEJlaGF2aW9yKGRpcmVjdGlvbjogJ0luZ3Jlc3MnIHwgJ0VncmVzcycsIF9kZWZhdWx0PzogTmV0d29ya1BvbGljeVRyYWZmaWNEZWZhdWx0KSB7XG5cbiAgICBpZiAoIV9kZWZhdWx0KSB7IHJldHVybjt9XG5cbiAgICBpZiAoX2RlZmF1bHQgPT09IE5ldHdvcmtQb2xpY3lUcmFmZmljRGVmYXVsdC5ERU5ZKSB7XG4gICAgICAvLyBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zZXJ2aWNlcy1uZXR3b3JraW5nL25ldHdvcmstcG9saWNpZXMvI2RlZmF1bHQtZGVueS1hbGwtZWdyZXNzLXRyYWZmaWNcbiAgICAgIHRoaXMuX3BvbGljeVR5cGVzLmFkZChkaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIGlmIChfZGVmYXVsdCA9PT0gTmV0d29ya1BvbGljeVRyYWZmaWNEZWZhdWx0LkFMTE9XKSB7XG4gICAgICAvLyBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9zZXJ2aWNlcy1uZXR3b3JraW5nL25ldHdvcmstcG9saWNpZXMvI2FsbG93LWFsbC1lZ3Jlc3MtdHJhZmZpY1xuICAgICAgdGhpcy5fcG9saWN5VHlwZXMuYWRkKGRpcmVjdGlvbik7XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAnRWdyZXNzJykge1xuICAgICAgICB0aGlzLl9lZ3Jlc3NSdWxlcy5wdXNoKHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luZ3Jlc3NSdWxlcy5wdXNoKHt9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3RvS3ViZSgpOiBrOHMuTmV0d29ya1BvbGljeVNwZWMge1xuICAgIHJldHVybiB7XG4gICAgICBwb2RTZWxlY3RvcjogdGhpcy5fcG9kU2VsZWN0b3JDb25maWcubGFiZWxTZWxlY3Rvci5fdG9LdWJlKCksXG4gICAgICBlZ3Jlc3M6IHVuZGVmaW5lZElmRW1wdHkodGhpcy5fZWdyZXNzUnVsZXMpLFxuICAgICAgaW5ncmVzczogdW5kZWZpbmVkSWZFbXB0eSh0aGlzLl9pbmdyZXNzUnVsZXMpLFxuICAgICAgcG9saWN5VHlwZXM6IHVuZGVmaW5lZElmRW1wdHkoQXJyYXkuZnJvbSh0aGlzLl9wb2xpY3lUeXBlcykpLFxuICAgIH07XG4gIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQZWVyQ29uZmlnKHBlZXJDb25maWc6IE5ldHdvcmtQb2xpY3lQZWVyQ29uZmlnKSB7XG4gIGlmICghcGVlckNvbmZpZy5pcEJsb2NrICYmICFwZWVyQ29uZmlnLnBvZFNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbmF2bGlkIHBlZXI6IGVpdGhlciBcXCdpcEJsb2NrXFwnIG9yIFxcJ3BvZFNlbGVjdG9yXFwnIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIGlmIChwZWVyQ29uZmlnLmlwQmxvY2sgJiYgcGVlckNvbmZpZy5wb2RTZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5hdmxpZCBwZWVyOiBvbmx5IG9uZSBvZiBcXCdpcEJsb2NrXFwnIGFuZCBcXCdwb2RTZWxlY3RvclxcJyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgfVxufVxuIl19
|