@sochdb/sochdb 0.4.2 → 0.4.4

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.
Files changed (57) hide show
  1. package/README.md +356 -14
  2. package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
  3. package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
  4. package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
  5. package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
  6. package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
  7. package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
  8. package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
  9. package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
  10. package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
  11. package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
  12. package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
  13. package/dist/cjs/embedded/database.js +98 -4
  14. package/dist/cjs/embedded/ffi/bindings.js +46 -8
  15. package/dist/cjs/index.js +28 -6
  16. package/dist/cjs/mcp/client.js +115 -0
  17. package/dist/cjs/mcp/index.js +28 -0
  18. package/dist/cjs/mcp/server.js +242 -0
  19. package/dist/cjs/mcp/types.js +32 -0
  20. package/dist/cjs/namespace.js +147 -19
  21. package/dist/cjs/policy/index.js +26 -0
  22. package/dist/cjs/policy/service.js +394 -0
  23. package/dist/cjs/policy/types.js +8 -0
  24. package/dist/esm/embedded/database.js +98 -4
  25. package/dist/esm/embedded/ffi/bindings.js +48 -8
  26. package/dist/esm/index.js +28 -6
  27. package/dist/esm/mcp/client.js +116 -0
  28. package/dist/esm/mcp/index.js +28 -0
  29. package/dist/esm/mcp/server.js +244 -0
  30. package/dist/esm/mcp/types.js +34 -0
  31. package/dist/esm/namespace.js +150 -19
  32. package/dist/esm/policy/index.js +26 -0
  33. package/dist/esm/policy/service.js +396 -0
  34. package/dist/esm/policy/types.js +8 -0
  35. package/dist/types/embedded/database.d.ts +66 -1
  36. package/dist/types/embedded/database.d.ts.map +1 -1
  37. package/dist/types/embedded/ffi/bindings.d.ts +7 -0
  38. package/dist/types/embedded/ffi/bindings.d.ts.map +1 -1
  39. package/dist/types/index.d.ts +23 -5
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/types/mcp/client.d.ts +69 -0
  42. package/dist/types/mcp/client.d.ts.map +1 -0
  43. package/dist/types/mcp/index.d.ts +9 -0
  44. package/dist/types/mcp/index.d.ts.map +1 -0
  45. package/dist/types/mcp/server.d.ts +87 -0
  46. package/dist/types/mcp/server.d.ts.map +1 -0
  47. package/dist/types/mcp/types.d.ts +124 -0
  48. package/dist/types/mcp/types.d.ts.map +1 -0
  49. package/dist/types/namespace.d.ts +13 -0
  50. package/dist/types/namespace.d.ts.map +1 -1
  51. package/dist/types/policy/index.d.ts +8 -0
  52. package/dist/types/policy/index.d.ts.map +1 -0
  53. package/dist/types/policy/service.d.ts +115 -0
  54. package/dist/types/policy/service.d.ts.map +1 -0
  55. package/dist/types/policy/types.d.ts +102 -0
  56. package/dist/types/policy/types.d.ts.map +1 -0
  57. package/package.json +2 -2
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Policy Service Module
4
+ *
5
+ * Policy-based access control and namespace governance for SochDB.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.PolicyService = void 0;
23
+ __exportStar(require("./types"), exports);
24
+ var service_1 = require("./service");
25
+ Object.defineProperty(exports, "PolicyService", { enumerable: true, get: function () { return service_1.PolicyService; } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9saWN5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBDQUF3QjtBQUN4QixxQ0FBMEM7QUFBakMsd0dBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBNb2R1bGVcbiAqIFxuICogUG9saWN5LWJhc2VkIGFjY2VzcyBjb250cm9sIGFuZCBuYW1lc3BhY2UgZ292ZXJuYW5jZSBmb3IgU29jaERCLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJy4vc2VydmljZSc7XG4iXX0=
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ /**
3
+ * Policy Service Implementation
4
+ *
5
+ * Policy-based access control and namespace governance for SochDB.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.PolicyService = void 0;
9
+ /**
10
+ * Policy Service for access control and governance
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { EmbeddedDatabase, PolicyService } from '@sochdb/sochdb';
15
+ *
16
+ * const db = EmbeddedDatabase.open('./mydb');
17
+ * const policy = new PolicyService(db);
18
+ *
19
+ * // Create a namespace policy
20
+ * await policy.createNamespacePolicy({
21
+ * namespace: 'tenant_123',
22
+ * rules: [{
23
+ * id: 'read_only',
24
+ * name: 'Read Only Access',
25
+ * effect: 'allow',
26
+ * principals: ['user:*'],
27
+ * resources: ['collection:*'],
28
+ * actions: ['read', 'search']
29
+ * }],
30
+ * defaultEffect: 'deny'
31
+ * });
32
+ *
33
+ * // Evaluate access
34
+ * const result = await policy.evaluate({
35
+ * principal: 'user:alice',
36
+ * action: 'read',
37
+ * resource: 'collection:documents'
38
+ * });
39
+ * ```
40
+ */
41
+ class PolicyService {
42
+ constructor(db, options) {
43
+ this.cache = new Map();
44
+ this.auditEnabled = true;
45
+ this.db = db;
46
+ this.prefix = Buffer.from('_policy:');
47
+ this.auditEnabled = options?.enableAudit ?? true;
48
+ }
49
+ /**
50
+ * Create a namespace policy
51
+ */
52
+ async createNamespacePolicy(policy) {
53
+ const key = this.policyKey(policy.namespace);
54
+ const data = {
55
+ ...policy,
56
+ createdAt: Date.now(),
57
+ updatedAt: Date.now(),
58
+ };
59
+ await this.db.put(key, Buffer.from(JSON.stringify(data)));
60
+ this.cache.set(policy.namespace, policy);
61
+ }
62
+ /**
63
+ * Get a namespace policy
64
+ */
65
+ async getNamespacePolicy(namespace) {
66
+ // Check cache first
67
+ if (this.cache.has(namespace)) {
68
+ return this.cache.get(namespace);
69
+ }
70
+ const key = this.policyKey(namespace);
71
+ const value = await this.db.get(key);
72
+ if (!value) {
73
+ return null;
74
+ }
75
+ const policy = JSON.parse(value.toString());
76
+ this.cache.set(namespace, policy);
77
+ return policy;
78
+ }
79
+ /**
80
+ * Update a namespace policy
81
+ */
82
+ async updateNamespacePolicy(namespace, updates) {
83
+ const existing = await this.getNamespacePolicy(namespace);
84
+ if (!existing) {
85
+ throw new Error(`Policy not found for namespace: ${namespace}`);
86
+ }
87
+ const updated = {
88
+ ...existing,
89
+ ...updates,
90
+ namespace, // Ensure namespace doesn't change
91
+ updatedAt: Date.now(),
92
+ };
93
+ const key = this.policyKey(namespace);
94
+ await this.db.put(key, Buffer.from(JSON.stringify(updated)));
95
+ this.cache.set(namespace, updated);
96
+ }
97
+ /**
98
+ * Delete a namespace policy
99
+ */
100
+ async deleteNamespacePolicy(namespace) {
101
+ const key = this.policyKey(namespace);
102
+ await this.db.delete(key);
103
+ this.cache.delete(namespace);
104
+ return true;
105
+ }
106
+ /**
107
+ * Add a rule to a namespace policy
108
+ */
109
+ async addRule(namespace, rule) {
110
+ const policy = await this.getNamespacePolicy(namespace);
111
+ if (!policy) {
112
+ throw new Error(`Policy not found for namespace: ${namespace}`);
113
+ }
114
+ // Check for duplicate rule ID
115
+ if (policy.rules.some(r => r.id === rule.id)) {
116
+ throw new Error(`Rule with id '${rule.id}' already exists`);
117
+ }
118
+ policy.rules.push(rule);
119
+ await this.updateNamespacePolicy(namespace, { rules: policy.rules });
120
+ }
121
+ /**
122
+ * Remove a rule from a namespace policy
123
+ */
124
+ async removeRule(namespace, ruleId) {
125
+ const policy = await this.getNamespacePolicy(namespace);
126
+ if (!policy) {
127
+ return false;
128
+ }
129
+ const index = policy.rules.findIndex(r => r.id === ruleId);
130
+ if (index === -1) {
131
+ return false;
132
+ }
133
+ policy.rules.splice(index, 1);
134
+ await this.updateNamespacePolicy(namespace, { rules: policy.rules });
135
+ return true;
136
+ }
137
+ /**
138
+ * Evaluate a policy request
139
+ */
140
+ async evaluate(request) {
141
+ const startTime = Date.now();
142
+ // Extract namespace from resource
143
+ const namespace = this.extractNamespace(request.resource);
144
+ const policy = namespace ? await this.getNamespacePolicy(namespace) : null;
145
+ let result;
146
+ if (!policy) {
147
+ // No policy = allow by default
148
+ result = {
149
+ allowed: true,
150
+ reason: 'No policy defined',
151
+ evaluationTime: Date.now() - startTime,
152
+ };
153
+ }
154
+ else {
155
+ // Evaluate rules in priority order
156
+ const sortedRules = [...policy.rules].sort((a, b) => (a.priority || 0) - (b.priority || 0));
157
+ let matchedRule;
158
+ for (const rule of sortedRules) {
159
+ if (this.matchesRule(request, rule)) {
160
+ matchedRule = rule;
161
+ break;
162
+ }
163
+ }
164
+ if (matchedRule) {
165
+ result = {
166
+ allowed: matchedRule.effect === 'allow',
167
+ matchedRule,
168
+ reason: `Matched rule: ${matchedRule.name}`,
169
+ evaluationTime: Date.now() - startTime,
170
+ };
171
+ }
172
+ else {
173
+ result = {
174
+ allowed: policy.defaultEffect === 'allow',
175
+ reason: `Default effect: ${policy.defaultEffect}`,
176
+ evaluationTime: Date.now() - startTime,
177
+ };
178
+ }
179
+ }
180
+ // Log audit entry
181
+ if (this.auditEnabled) {
182
+ await this.logAudit(request, result);
183
+ }
184
+ return result;
185
+ }
186
+ /**
187
+ * Grant namespace access to a principal
188
+ */
189
+ async grantAccess(grant) {
190
+ const key = this.grantKey(grant.namespace, grant.principal);
191
+ const data = {
192
+ ...grant,
193
+ grantedAt: Date.now(),
194
+ };
195
+ await this.db.put(key, Buffer.from(JSON.stringify(data)));
196
+ }
197
+ /**
198
+ * Revoke namespace access from a principal
199
+ */
200
+ async revokeAccess(namespace, principal) {
201
+ const key = this.grantKey(namespace, principal);
202
+ await this.db.delete(key);
203
+ return true;
204
+ }
205
+ /**
206
+ * Check if principal has permission
207
+ */
208
+ async hasPermission(namespace, principal, permission) {
209
+ const key = this.grantKey(namespace, principal);
210
+ const value = await this.db.get(key);
211
+ if (!value) {
212
+ return false;
213
+ }
214
+ const grant = JSON.parse(value.toString());
215
+ // Check expiration
216
+ if (grant.expiresAt && Date.now() > grant.expiresAt) {
217
+ return false;
218
+ }
219
+ // Admin has all permissions
220
+ if (grant.permissions.includes('admin')) {
221
+ return true;
222
+ }
223
+ return grant.permissions.includes(permission);
224
+ }
225
+ /**
226
+ * List all grants for a namespace
227
+ */
228
+ async listGrants(namespace) {
229
+ const grants = [];
230
+ const prefix = Buffer.from(`_grant:${namespace}:`);
231
+ try {
232
+ for await (const [_, valueBuffer] of this.db.scanPrefix(prefix)) {
233
+ const grant = JSON.parse(valueBuffer.toString());
234
+ grants.push(grant);
235
+ }
236
+ }
237
+ catch (error) {
238
+ // Ignore scan errors
239
+ }
240
+ return grants;
241
+ }
242
+ /**
243
+ * Get audit log entries
244
+ */
245
+ async getAuditLog(options) {
246
+ const entries = [];
247
+ const prefix = Buffer.from('_audit:');
248
+ const limit = options?.limit || 100;
249
+ try {
250
+ for await (const [_, valueBuffer] of this.db.scanPrefix(prefix)) {
251
+ const entry = JSON.parse(valueBuffer.toString());
252
+ // Apply filters
253
+ if (options?.namespace && !entry.resource.includes(options.namespace)) {
254
+ continue;
255
+ }
256
+ if (options?.principal && entry.principal !== options.principal) {
257
+ continue;
258
+ }
259
+ if (options?.action && entry.action !== options.action) {
260
+ continue;
261
+ }
262
+ if (options?.since && entry.timestamp < options.since) {
263
+ continue;
264
+ }
265
+ entries.push(entry);
266
+ if (entries.length >= limit) {
267
+ break;
268
+ }
269
+ }
270
+ }
271
+ catch (error) {
272
+ // Ignore scan errors
273
+ }
274
+ // Sort by timestamp descending
275
+ return entries.sort((a, b) => b.timestamp - a.timestamp);
276
+ }
277
+ /**
278
+ * Clear policy cache
279
+ */
280
+ clearCache() {
281
+ this.cache.clear();
282
+ }
283
+ // Private methods
284
+ policyKey(namespace) {
285
+ return Buffer.concat([this.prefix, Buffer.from(`namespace:${namespace}`)]);
286
+ }
287
+ grantKey(namespace, principal) {
288
+ return Buffer.from(`_grant:${namespace}:${principal}`);
289
+ }
290
+ extractNamespace(resource) {
291
+ // Extract namespace from resource like "namespace:tenant_123:collection:docs"
292
+ const parts = resource.split(':');
293
+ if (parts.length >= 2 && parts[0] === 'namespace') {
294
+ return parts[1];
295
+ }
296
+ // Try to extract from collection format "collection:tenant_123:docs"
297
+ if (parts.length >= 2 && parts[0] === 'collection') {
298
+ return parts[1];
299
+ }
300
+ return null;
301
+ }
302
+ matchesRule(request, rule) {
303
+ // Check principals
304
+ if (!this.matchesPatterns(request.principal, rule.principals)) {
305
+ return false;
306
+ }
307
+ // Check resources
308
+ if (!this.matchesPatterns(request.resource, rule.resources)) {
309
+ return false;
310
+ }
311
+ // Check actions
312
+ if (!this.matchesPatterns(request.action, rule.actions)) {
313
+ return false;
314
+ }
315
+ // Check conditions
316
+ if (rule.conditions && rule.conditions.length > 0) {
317
+ for (const condition of rule.conditions) {
318
+ if (!this.evaluateCondition(condition, request.context)) {
319
+ return false;
320
+ }
321
+ }
322
+ }
323
+ return true;
324
+ }
325
+ matchesPatterns(value, patterns) {
326
+ for (const pattern of patterns) {
327
+ if (this.matchesPattern(value, pattern)) {
328
+ return true;
329
+ }
330
+ }
331
+ return false;
332
+ }
333
+ matchesPattern(value, pattern) {
334
+ if (pattern === '*') {
335
+ return true;
336
+ }
337
+ if (pattern.endsWith('*')) {
338
+ return value.startsWith(pattern.slice(0, -1));
339
+ }
340
+ if (pattern.startsWith('*')) {
341
+ return value.endsWith(pattern.slice(1));
342
+ }
343
+ return value === pattern;
344
+ }
345
+ evaluateCondition(condition, context) {
346
+ if (!context) {
347
+ return false;
348
+ }
349
+ const value = context[condition.key];
350
+ if (value === undefined) {
351
+ return false;
352
+ }
353
+ switch (condition.operator) {
354
+ case 'equals':
355
+ return value === condition.value;
356
+ case 'not_equals':
357
+ return value !== condition.value;
358
+ case 'contains':
359
+ return String(value).includes(String(condition.value));
360
+ case 'starts_with':
361
+ return String(value).startsWith(String(condition.value));
362
+ case 'ends_with':
363
+ return String(value).endsWith(String(condition.value));
364
+ case 'in':
365
+ return Array.isArray(condition.value) && condition.value.includes(value);
366
+ case 'not_in':
367
+ return Array.isArray(condition.value) && !condition.value.includes(value);
368
+ case 'between':
369
+ if (Array.isArray(condition.value) && condition.value.length === 2) {
370
+ return value >= condition.value[0] && value <= condition.value[1];
371
+ }
372
+ return false;
373
+ default:
374
+ return false;
375
+ }
376
+ }
377
+ async logAudit(request, result) {
378
+ const entry = {
379
+ id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
380
+ timestamp: Date.now(),
381
+ principal: request.principal,
382
+ action: request.action,
383
+ resource: request.resource,
384
+ decision: result.allowed ? 'allow' : 'deny',
385
+ matchedRule: result.matchedRule?.id,
386
+ reason: result.reason,
387
+ context: request.context,
388
+ };
389
+ const key = Buffer.from(`_audit:${entry.timestamp}:${entry.id}`);
390
+ await this.db.put(key, Buffer.from(JSON.stringify(entry)));
391
+ }
392
+ }
393
+ exports.PolicyService = PolicyService;
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb2xpY3kvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBZUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFhLGFBQWE7SUFNeEIsWUFBWSxFQUFvQixFQUFFLE9BQW1DO1FBSDdELFVBQUssR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUcxQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUF1QjtRQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsTUFBTTtZQUNULFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3RCLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGtCQUFr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QUNyRSxNQUFNLEtBQUssR0FBcUI7WUFDOUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM5RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzNDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUF6YUQsc0NBeWFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBJbXBsZW1lbnRhdGlvblxuICogXG4gKiBQb2xpY3ktYmFzZWQgYWNjZXNzIGNvbnRyb2wgYW5kIG5hbWVzcGFjZSBnb3Zlcm5hbmNlIGZvciBTb2NoREIuXG4gKi9cblxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJy4uL2VtYmVkZGVkJztcbmltcG9ydCB7XG4gIFBvbGljeVJ1bGUsXG4gIFBvbGljeUNvbmRpdGlvbixcbiAgUG9saWN5RXZhbHVhdGlvbixcbiAgTmFtZXNwYWNlUG9saWN5LFxuICBOYW1lc3BhY2VHcmFudCxcbiAgTmFtZXNwYWNlUGVybWlzc2lvbixcbiAgUG9saWN5UmVxdWVzdCxcbiAgUG9saWN5U2V0LFxuICBQb2xpY3lBdWRpdEVudHJ5LFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBQb2xpY3kgU2VydmljZSBmb3IgYWNjZXNzIGNvbnRyb2wgYW5kIGdvdmVybmFuY2VcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIFBvbGljeVNlcnZpY2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIGNvbnN0IGRiID0gRW1iZWRkZWREYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGNvbnN0IHBvbGljeSA9IG5ldyBQb2xpY3lTZXJ2aWNlKGRiKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgbmFtZXNwYWNlIHBvbGljeVxuICogYXdhaXQgcG9saWN5LmNyZWF0ZU5hbWVzcGFjZVBvbGljeSh7XG4gKiAgIG5hbWVzcGFjZTogJ3RlbmFudF8xMjMnLFxuICogICBydWxlczogW3tcbiAqICAgICBpZDogJ3JlYWRfb25seScsXG4gKiAgICAgbmFtZTogJ1JlYWQgT25seSBBY2Nlc3MnLFxuICogICAgIGVmZmVjdDogJ2FsbG93JyxcbiAqICAgICBwcmluY2lwYWxzOiBbJ3VzZXI6KiddLFxuICogICAgIHJlc291cmNlczogWydjb2xsZWN0aW9uOionXSxcbiAqICAgICBhY3Rpb25zOiBbJ3JlYWQnLCAnc2VhcmNoJ11cbiAqICAgfV0sXG4gKiAgIGRlZmF1bHRFZmZlY3Q6ICdkZW55J1xuICogfSk7XG4gKiBcbiAqIC8vIEV2YWx1YXRlIGFjY2Vzc1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9saWN5LmV2YWx1YXRlKHtcbiAqICAgcHJpbmNpcGFsOiAndXNlcjphbGljZScsXG4gKiAgIGFjdGlvbjogJ3JlYWQnLFxuICogICByZXNvdXJjZTogJ2NvbGxlY3Rpb246ZG9jdW1lbnRzJ1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGljeVNlcnZpY2Uge1xuICBwcml2YXRlIGRiOiBFbWJlZGRlZERhdGFiYXNlO1xuICBwcml2YXRlIHByZWZpeDogQnVmZmVyO1xuICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCBOYW1lc3BhY2VQb2xpY3k+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGF1ZGl0RW5hYmxlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoZGI6IEVtYmVkZGVkRGF0YWJhc2UsIG9wdGlvbnM/OiB7IGVuYWJsZUF1ZGl0PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5kYiA9IGRiO1xuICAgIHRoaXMucHJlZml4ID0gQnVmZmVyLmZyb20oJ19wb2xpY3k6Jyk7XG4gICAgdGhpcy5hdWRpdEVuYWJsZWQgPSBvcHRpb25zPy5lbmFibGVBdWRpdCA/PyB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5hbWVzcGFjZSBwb2xpY3lcbiAgICovXG4gIGFzeW5jIGNyZWF0ZU5hbWVzcGFjZVBvbGljeShwb2xpY3k6IE5hbWVzcGFjZVBvbGljeSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucG9saWN5S2V5KHBvbGljeS5uYW1lc3BhY2UpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAuLi5wb2xpY3ksXG4gICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgfTtcbiAgICBcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XG4gICAgdGhpcy5jYWNoZS5zZXQocG9saWN5Lm5hbWVzcGFjZSwgcG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuYW1lc3BhY2UgcG9saWN5XG4gICAqL1xuICBhc3luYyBnZXROYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVzcGFjZVBvbGljeSB8IG51bGw+IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQobmFtZXNwYWNlKSE7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5wb2xpY3lLZXkobmFtZXNwYWNlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZGIuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcG9saWN5ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKSBhcyBOYW1lc3BhY2VQb2xpY3k7XG4gICAgdGhpcy5jYWNoZS5zZXQobmFtZXNwYWNlLCBwb2xpY3kpO1xuICAgIHJldHVybiBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZTogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPE5hbWVzcGFjZVBvbGljeT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0TmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZSk7XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb2xpY3kgbm90IGZvdW5kIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWQgPSB7XG4gICAgICAuLi5leGlzdGluZyxcbiAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICBuYW1lc3BhY2UsIC8vIEVuc3VyZSBuYW1lc3BhY2UgZG9lc24ndCBjaGFuZ2VcbiAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5wb2xpY3lLZXkobmFtZXNwYWNlKTtcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKSk7XG4gICAgdGhpcy5jYWNoZS5zZXQobmFtZXNwYWNlLCB1cGRhdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBuYW1lc3BhY2UgcG9saWN5XG4gICAqL1xuICBhc3luYyBkZWxldGVOYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnBvbGljeUtleShuYW1lc3BhY2UpO1xuICAgIGF3YWl0IHRoaXMuZGIuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZS5kZWxldGUobmFtZXNwYWNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBydWxlIHRvIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgYWRkUnVsZShuYW1lc3BhY2U6IHN0cmluZywgcnVsZTogUG9saWN5UnVsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvbGljeSA9IGF3YWl0IHRoaXMuZ2V0TmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZSk7XG4gICAgaWYgKCFwb2xpY3kpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9saWN5IG5vdCBmb3VuZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIHJ1bGUgSURcbiAgICBpZiAocG9saWN5LnJ1bGVzLnNvbWUociA9PiByLmlkID09PSBydWxlLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSdWxlIHdpdGggaWQgJyR7cnVsZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgcG9saWN5LnJ1bGVzLnB1c2gocnVsZSk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVOYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlLCB7IHJ1bGVzOiBwb2xpY3kucnVsZXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgcnVsZSBmcm9tIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUnVsZShuYW1lc3BhY2U6IHN0cmluZywgcnVsZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwb2xpY3kgPSBhd2FpdCB0aGlzLmdldE5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2UpO1xuICAgIGlmICghcG9saWN5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBwb2xpY3kucnVsZXMuZmluZEluZGV4KHIgPT4gci5pZCA9PT0gcnVsZUlkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcG9saWN5LnJ1bGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVOYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlLCB7IHJ1bGVzOiBwb2xpY3kucnVsZXMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgYSBwb2xpY3kgcmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGUocmVxdWVzdDogUG9saWN5UmVxdWVzdCk6IFByb21pc2U8UG9saWN5RXZhbHVhdGlvbj4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgXG4gICAgLy8gRXh0cmFjdCBuYW1lc3BhY2UgZnJvbSByZXNvdXJjZVxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMuZXh0cmFjdE5hbWVzcGFjZShyZXF1ZXN0LnJlc291cmNlKTtcbiAgICBjb25zdCBwb2xpY3kgPSBuYW1lc3BhY2UgPyBhd2FpdCB0aGlzLmdldE5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2UpIDogbnVsbDtcblxuICAgIGxldCByZXN1bHQ6IFBvbGljeUV2YWx1YXRpb247XG5cbiAgICBpZiAoIXBvbGljeSkge1xuICAgICAgLy8gTm8gcG9saWN5ID0gYWxsb3cgYnkgZGVmYXVsdFxuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBhbGxvd2VkOiB0cnVlLFxuICAgICAgICByZWFzb246ICdObyBwb2xpY3kgZGVmaW5lZCcsXG4gICAgICAgIGV2YWx1YXRpb25UaW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZhbHVhdGUgcnVsZXMgaW4gcHJpb3JpdHkgb3JkZXJcbiAgICAgIGNvbnN0IHNvcnRlZFJ1bGVzID0gWy4uLnBvbGljeS5ydWxlc10uc29ydCgoYSwgYikgPT4gXG4gICAgICAgIChhLnByaW9yaXR5IHx8IDApIC0gKGIucHJpb3JpdHkgfHwgMClcbiAgICAgICk7XG5cbiAgICAgIGxldCBtYXRjaGVkUnVsZTogUG9saWN5UnVsZSB8IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBydWxlIG9mIHNvcnRlZFJ1bGVzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoZXNSdWxlKHJlcXVlc3QsIHJ1bGUpKSB7XG4gICAgICAgICAgbWF0Y2hlZFJ1bGUgPSBydWxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaGVkUnVsZSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgYWxsb3dlZDogbWF0Y2hlZFJ1bGUuZWZmZWN0ID09PSAnYWxsb3cnLFxuICAgICAgICAgIG1hdGNoZWRSdWxlLFxuICAgICAgICAgIHJlYXNvbjogYE1hdGNoZWQgcnVsZTogJHttYXRjaGVkUnVsZS5uYW1lfWAsXG4gICAgICAgICAgZXZhbHVhdGlvblRpbWU6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgYWxsb3dlZDogcG9saWN5LmRlZmF1bHRFZmZlY3QgPT09ICdhbGxvdycsXG4gICAgICAgICAgcmVhc29uOiBgRGVmYXVsdCBlZmZlY3Q6ICR7cG9saWN5LmRlZmF1bHRFZmZlY3R9YCxcbiAgICAgICAgICBldmFsdWF0aW9uVGltZTogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2cgYXVkaXQgZW50cnlcbiAgICBpZiAodGhpcy5hdWRpdEVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9nQXVkaXQocmVxdWVzdCwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IG5hbWVzcGFjZSBhY2Nlc3MgdG8gYSBwcmluY2lwYWxcbiAgICovXG4gIGFzeW5jIGdyYW50QWNjZXNzKGdyYW50OiBOYW1lc3BhY2VHcmFudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ3JhbnRLZXkoZ3JhbnQubmFtZXNwYWNlLCBncmFudC5wcmluY2lwYWwpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAuLi5ncmFudCxcbiAgICAgIGdyYW50ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIFxuICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZGF0YSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2UgbmFtZXNwYWNlIGFjY2VzcyBmcm9tIGEgcHJpbmNpcGFsXG4gICAqL1xuICBhc3luYyByZXZva2VBY2Nlc3MobmFtZXNwYWNlOiBzdHJpbmcsIHByaW5jaXBhbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ncmFudEtleShuYW1lc3BhY2UsIHByaW5jaXBhbCk7XG4gICAgYXdhaXQgdGhpcy5kYi5kZWxldGUoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwcmluY2lwYWwgaGFzIHBlcm1pc3Npb25cbiAgICovXG4gIGFzeW5jIGhhc1Blcm1pc3Npb24oXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbjogTmFtZXNwYWNlUGVybWlzc2lvblxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdyYW50S2V5KG5hbWVzcGFjZSwgcHJpbmNpcGFsKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZGIuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYW50ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKSBhcyBOYW1lc3BhY2VHcmFudDtcblxuICAgIC8vIENoZWNrIGV4cGlyYXRpb25cbiAgICBpZiAoZ3JhbnQuZXhwaXJlc0F0ICYmIERhdGUubm93KCkgPiBncmFudC5leHBpcmVzQXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBZG1pbiBoYXMgYWxsIHBlcm1pc3Npb25zXG4gICAgaWYgKGdyYW50LnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhbnQucGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgZ3JhbnRzIGZvciBhIG5hbWVzcGFjZVxuICAgKi9cbiAgYXN5bmMgbGlzdEdyYW50cyhuYW1lc3BhY2U6IHN0cmluZyk6IFByb21pc2U8TmFtZXNwYWNlR3JhbnRbXT4ge1xuICAgIGNvbnN0IGdyYW50czogTmFtZXNwYWNlR3JhbnRbXSA9IFtdO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKGBfZ3JhbnQ6JHtuYW1lc3BhY2V9OmApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlQnVmZmVyXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBncmFudCA9IEpTT04ucGFyc2UodmFsdWVCdWZmZXIudG9TdHJpbmcoKSkgYXMgTmFtZXNwYWNlR3JhbnQ7XG4gICAgICAgIGdyYW50cy5wdXNoKGdyYW50KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JlIHNjYW4gZXJyb3JzXG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXVkaXQgbG9nIGVudHJpZXNcbiAgICovXG4gIGFzeW5jIGdldEF1ZGl0TG9nKG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHByaW5jaXBhbD86IHN0cmluZztcbiAgICBhY3Rpb24/OiBzdHJpbmc7XG4gICAgc2luY2U/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPFBvbGljeUF1ZGl0RW50cnlbXT4ge1xuICAgIGNvbnN0IGVudHJpZXM6IFBvbGljeUF1ZGl0RW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKCdfYXVkaXQ6Jyk7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCB8fCAxMDA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBbXywgdmFsdWVCdWZmZXJdIG9mIHRoaXMuZGIuc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gSlNPTi5wYXJzZSh2YWx1ZUJ1ZmZlci50b1N0cmluZygpKSBhcyBQb2xpY3lBdWRpdEVudHJ5O1xuICAgICAgICBcbiAgICAgICAgLy8gQXBwbHkgZmlsdGVyc1xuICAgICAgICBpZiAob3B0aW9ucz8ubmFtZXNwYWNlICYmICFlbnRyeS5yZXNvdXJjZS5pbmNsdWRlcyhvcHRpb25zLm5hbWVzcGFjZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbmNpcGFsICYmIGVudHJ5LnByaW5jaXBhbCAhPT0gb3B0aW9ucy5wcmluY2lwYWwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uYWN0aW9uICYmIGVudHJ5LmFjdGlvbiAhPT0gb3B0aW9ucy5hY3Rpb24pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uc2luY2UgJiYgZW50cnkudGltZXN0YW1wIDwgb3B0aW9ucy5zaW5jZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+PSBsaW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBzY2FuIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgdGltZXN0YW1wIGRlc2NlbmRpbmdcbiAgICByZXR1cm4gZW50cmllcy5zb3J0KChhLCBiKSA9PiBiLnRpbWVzdGFtcCAtIGEudGltZXN0YW1wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBwb2xpY3kgY2FjaGVcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBtZXRob2RzXG5cbiAgcHJpdmF0ZSBwb2xpY3lLZXkobmFtZXNwYWNlOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0aGlzLnByZWZpeCwgQnVmZmVyLmZyb20oYG5hbWVzcGFjZToke25hbWVzcGFjZX1gKV0pO1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudEtleShuYW1lc3BhY2U6IHN0cmluZywgcHJpbmNpcGFsOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShgX2dyYW50OiR7bmFtZXNwYWNlfToke3ByaW5jaXBhbH1gKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE5hbWVzcGFjZShyZXNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gRXh0cmFjdCBuYW1lc3BhY2UgZnJvbSByZXNvdXJjZSBsaWtlIFwibmFtZXNwYWNlOnRlbmFudF8xMjM6Y29sbGVjdGlvbjpkb2NzXCJcbiAgICBjb25zdCBwYXJ0cyA9IHJlc291cmNlLnNwbGl0KCc6Jyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyICYmIHBhcnRzWzBdID09PSAnbmFtZXNwYWNlJykge1xuICAgICAgcmV0dXJuIHBhcnRzWzFdO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBmcm9tIGNvbGxlY3Rpb24gZm9ybWF0IFwiY29sbGVjdGlvbjp0ZW5hbnRfMTIzOmRvY3NcIlxuICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMiAmJiBwYXJ0c1swXSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcGFydHNbMV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaGVzUnVsZShyZXF1ZXN0OiBQb2xpY3lSZXF1ZXN0LCBydWxlOiBQb2xpY3lSdWxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgcHJpbmNpcGFsc1xuICAgIGlmICghdGhpcy5tYXRjaGVzUGF0dGVybnMocmVxdWVzdC5wcmluY2lwYWwsIHJ1bGUucHJpbmNpcGFscykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayByZXNvdXJjZXNcbiAgICBpZiAoIXRoaXMubWF0Y2hlc1BhdHRlcm5zKHJlcXVlc3QucmVzb3VyY2UsIHJ1bGUucmVzb3VyY2VzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFjdGlvbnNcbiAgICBpZiAoIXRoaXMubWF0Y2hlc1BhdHRlcm5zKHJlcXVlc3QuYWN0aW9uLCBydWxlLmFjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY29uZGl0aW9uc1xuICAgIGlmIChydWxlLmNvbmRpdGlvbnMgJiYgcnVsZS5jb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIHJ1bGUuY29uZGl0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuZXZhbHVhdGVDb25kaXRpb24oY29uZGl0aW9uLCByZXF1ZXN0LmNvbnRleHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoZXNQYXR0ZXJucyh2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoZXNQYXR0ZXJuKHZhbHVlLCBwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaGVzUGF0dGVybih2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAocGF0dGVybiA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoJyonKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnN0YXJ0c1dpdGgocGF0dGVybi5zbGljZSgwLCAtMSkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAocGF0dGVybi5zdGFydHNXaXRoKCcqJykpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5lbmRzV2l0aChwYXR0ZXJuLnNsaWNlKDEpKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHZhbHVlID09PSBwYXR0ZXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvbmRpdGlvbihjb25kaXRpb246IFBvbGljeUNvbmRpdGlvbiwgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRleHRbY29uZGl0aW9uLmtleV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbmRpdGlvbi5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnZXF1YWxzJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBjb25kaXRpb24udmFsdWU7XG4gICAgICBjYXNlICdub3RfZXF1YWxzJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBjb25kaXRpb24udmFsdWU7XG4gICAgICBjYXNlICdjb250YWlucyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLmluY2x1ZGVzKFN0cmluZyhjb25kaXRpb24udmFsdWUpKTtcbiAgICAgIGNhc2UgJ3N0YXJ0c193aXRoJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkuc3RhcnRzV2l0aChTdHJpbmcoY29uZGl0aW9uLnZhbHVlKSk7XG4gICAgICBjYXNlICdlbmRzX3dpdGgnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5lbmRzV2l0aChTdHJpbmcoY29uZGl0aW9uLnZhbHVlKSk7XG4gICAgICBjYXNlICdpbic6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi52YWx1ZSkgJiYgY29uZGl0aW9uLnZhbHVlLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgIGNhc2UgJ25vdF9pbic6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi52YWx1ZSkgJiYgIWNvbmRpdGlvbi52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLnZhbHVlKSAmJiBjb25kaXRpb24udmFsdWUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IGNvbmRpdGlvbi52YWx1ZVswXSAmJiB2YWx1ZSA8PSBjb25kaXRpb24udmFsdWVbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9nQXVkaXQocmVxdWVzdDogUG9saWN5UmVxdWVzdCwgcmVzdWx0OiBQb2xpY3lFdmFsdWF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50cnk6IFBvbGljeUF1ZGl0RW50cnkgPSB7XG4gICAgICBpZDogYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHByaW5jaXBhbDogcmVxdWVzdC5wcmluY2lwYWwsXG4gICAgICBhY3Rpb246IHJlcXVlc3QuYWN0aW9uLFxuICAgICAgcmVzb3VyY2U6IHJlcXVlc3QucmVzb3VyY2UsXG4gICAgICBkZWNpc2lvbjogcmVzdWx0LmFsbG93ZWQgPyAnYWxsb3cnIDogJ2RlbnknLFxuICAgICAgbWF0Y2hlZFJ1bGU6IHJlc3VsdC5tYXRjaGVkUnVsZT8uaWQsXG4gICAgICByZWFzb246IHJlc3VsdC5yZWFzb24sXG4gICAgICBjb250ZXh0OiByZXF1ZXN0LmNvbnRleHQsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5mcm9tKGBfYXVkaXQ6JHtlbnRyeS50aW1lc3RhbXB9OiR7ZW50cnkuaWR9YCk7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShlbnRyeSkpKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Policy Service Types
4
+ *
5
+ * Type definitions for policy-based access control and namespace governance.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9saWN5L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBUeXBlc1xuICogXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciBwb2xpY3ktYmFzZWQgYWNjZXNzIGNvbnRyb2wgYW5kIG5hbWVzcGFjZSBnb3Zlcm5hbmNlLlxuICovXG5cbi8qKlxuICogUG9saWN5IHJ1bGUgZm9yIGFjY2VzcyBjb250cm9sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5UnVsZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGVmZmVjdDogJ2FsbG93JyB8ICdkZW55JztcbiAgcHJpbmNpcGFsczogc3RyaW5nW107XG4gIHJlc291cmNlczogc3RyaW5nW107XG4gIGFjdGlvbnM6IHN0cmluZ1tdO1xuICBjb25kaXRpb25zPzogUG9saWN5Q29uZGl0aW9uW107XG4gIHByaW9yaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBvbGljeSBjb25kaXRpb24gZm9yIGNvbnRleHR1YWwgYWNjZXNzIGNvbnRyb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lDb25kaXRpb24ge1xuICB0eXBlOiAndGltZScgfCAnaXAnIHwgJ21ldGFkYXRhJyB8ICdjdXN0b20nO1xuICBvcGVyYXRvcjogJ2VxdWFscycgfCAnbm90X2VxdWFscycgfCAnY29udGFpbnMnIHwgJ3N0YXJ0c193aXRoJyB8ICdlbmRzX3dpdGgnIHwgJ2luJyB8ICdub3RfaW4nIHwgJ2JldHdlZW4nO1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZXZhbHVhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lFdmFsdWF0aW9uIHtcbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgbWF0Y2hlZFJ1bGU/OiBQb2xpY3lSdWxlO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGV2YWx1YXRpb25UaW1lOiBudW1iZXI7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIHBvbGljeSBmb3IgbXVsdGktdGVuYW50IGlzb2xhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVzcGFjZVBvbGljeSB7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBydWxlczogUG9saWN5UnVsZVtdO1xuICBkZWZhdWx0RWZmZWN0OiAnYWxsb3cnIHwgJ2RlbnknO1xuICBpbmhlcml0RnJvbT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEFjY2VzcyBncmFudCBmb3IgbmFtZXNwYWNlLWxldmVsIHBlcm1pc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZXNwYWNlR3JhbnQge1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBOYW1lc3BhY2VQZXJtaXNzaW9uW107XG4gIGV4cGlyZXNBdD86IG51bWJlcjtcbiAgZ3JhbnRlZEJ5Pzogc3RyaW5nO1xuICBncmFudGVkQXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIHBlcm1pc3Npb24gbGV2ZWxzXG4gKi9cbmV4cG9ydCB0eXBlIE5hbWVzcGFjZVBlcm1pc3Npb24gPSBcbiAgfCAncmVhZCdcbiAgfCAnd3JpdGUnXG4gIHwgJ2RlbGV0ZSdcbiAgfCAnYWRtaW4nXG4gIHwgJ2NyZWF0ZV9jb2xsZWN0aW9uJ1xuICB8ICdkZWxldGVfY29sbGVjdGlvbidcbiAgfCAnc2VhcmNoJ1xuICB8ICdtYW5hZ2VfcG9saWN5JztcblxuLyoqXG4gKiBQb2xpY3kgYWN0aW9uIHR5cGVzXG4gKi9cbmV4cG9ydCB0eXBlIFBvbGljeUFjdGlvbiA9XG4gIHwgJ2RiOnJlYWQnXG4gIHwgJ2RiOndyaXRlJ1xuICB8ICdkYjpkZWxldGUnXG4gIHwgJ2RiOnNjYW4nXG4gIHwgJ25hbWVzcGFjZTpjcmVhdGUnXG4gIHwgJ25hbWVzcGFjZTpkZWxldGUnXG4gIHwgJ25hbWVzcGFjZTpsaXN0J1xuICB8ICdjb2xsZWN0aW9uOmNyZWF0ZSdcbiAgfCAnY29sbGVjdGlvbjpkZWxldGUnXG4gIHwgJ2NvbGxlY3Rpb246aW5zZXJ0J1xuICB8ICdjb2xsZWN0aW9uOnNlYXJjaCdcbiAgfCAnY29sbGVjdGlvbjp1cGRhdGUnXG4gIHwgJ3BvbGljeTpyZWFkJ1xuICB8ICdwb2xpY3k6d3JpdGUnXG4gIHwgJ2FkbWluOionO1xuXG4vKipcbiAqIFBvbGljeSByZXF1ZXN0IGZvciBldmFsdWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5UmVxdWVzdCB7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUG9saWN5IHNldCBjb250YWluaW5nIG11bHRpcGxlIHBvbGljaWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5U2V0IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcG9saWNpZXM6IE5hbWVzcGFjZVBvbGljeVtdO1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICB1cGRhdGVkQXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBdWRpdCBsb2cgZW50cnkgZm9yIHBvbGljeSBkZWNpc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lBdWRpdEVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgZGVjaXNpb246ICdhbGxvdycgfCAnZGVueSc7XG4gIG1hdGNoZWRSdWxlPzogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuIl19