@microsoft/terraform-cdk-constructs 1.8.0 → 1.9.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.
Files changed (97) hide show
  1. package/.jsii +21007 -16056
  2. package/API.md +37023 -29701
  3. package/lib/azure-actiongroup/lib/action-group.js +1 -1
  4. package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
  5. package/lib/azure-aks/lib/aks-cluster.js +1 -1
  6. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
  7. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
  8. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
  9. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
  10. package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
  11. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
  12. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
  13. package/lib/azure-dnszone/lib/dns-zone.js +1 -1
  14. package/lib/azure-dnszone/lib/records/dns-records.js +10 -10
  15. package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
  16. package/lib/azure-loganalyticsworkspace/index.js +23 -0
  17. package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
  18. package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
  19. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
  20. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
  21. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
  22. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
  23. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
  24. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
  25. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
  26. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
  27. package/lib/azure-metricalert/lib/metric-alert.js +1 -1
  28. package/lib/azure-networkinterface/lib/network-interface.js +1 -1
  29. package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
  30. package/lib/azure-networkwatcher/index.d.ts +14 -0
  31. package/lib/azure-networkwatcher/index.js +31 -0
  32. package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
  33. package/lib/azure-networkwatcher/lib/index.js +22 -0
  34. package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
  35. package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
  36. package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
  37. package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
  38. package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
  39. package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
  40. package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
  41. package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
  42. package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
  43. package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
  44. package/lib/azure-policysetdefinition/index.d.ts +10 -0
  45. package/lib/azure-policysetdefinition/index.js +27 -0
  46. package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
  47. package/lib/azure-policysetdefinition/lib/index.js +22 -0
  48. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
  49. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
  50. package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
  51. package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
  52. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
  53. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
  54. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
  55. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
  56. package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
  57. package/lib/azure-privatednszone/lib/records/private-dns-records.js +8 -8
  58. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  59. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  60. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  61. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  62. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  63. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  64. package/lib/azure-subnet/lib/subnet.js +1 -1
  65. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  66. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  67. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +2 -2
  68. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
  69. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
  70. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
  71. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
  72. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  73. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
  74. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
  75. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  76. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  77. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  78. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  79. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  80. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
  81. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  82. package/lib/core-azure/lib/azapi/azapi-resource.js +2 -2
  83. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  84. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  85. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  86. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  87. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  88. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  89. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  90. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  91. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  92. package/lib/index.d.ts +9 -0
  93. package/lib/index.js +11 -2
  94. package/lib/testing/index.js +2 -2
  95. package/lib/testing/lib/cleanup.js +1 -1
  96. package/lib/testing/lib/metadata.js +1 -1
  97. package/package.json +1 -1
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PolicySetDefinition = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ /**
7
+ * Unified Azure Policy Set Definition (Initiative) implementation using AzapiResource framework
8
+ *
9
+ * This class provides a version-aware implementation for Azure Policy Set Definitions
10
+ * that automatically handles version management, schema validation, and property
11
+ * transformation across all supported API versions.
12
+ *
13
+ * Policy Set Definitions (also known as Initiatives in Azure Portal) allow you to
14
+ * group multiple policy definitions together and assign them as a single unit.
15
+ *
16
+ * Supported API Versions:
17
+ * - 2023-04-01 (Active, Latest)
18
+ * - 2021-06-01 (Active, Backward Compatibility)
19
+ *
20
+ * Features:
21
+ * - Automatic latest version resolution when no version is specified
22
+ * - Explicit version pinning for stability requirements
23
+ * - Schema-driven validation and transformation
24
+ * - Full JSII compliance for multi-language support
25
+ * - Support for policy definition references with parameters
26
+ * - Policy definition groups for organization
27
+ * - Initiative-level parameter definitions
28
+ */
29
+ const crypto_1 = require("crypto");
30
+ const cdktf = require("cdktf");
31
+ const policy_set_definition_schemas_1 = require("./policy-set-definition-schemas");
32
+ const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
33
+ /**
34
+ * Unified Azure Policy Set Definition (Initiative) implementation
35
+ *
36
+ * This class provides a single, version-aware implementation for managing Azure
37
+ * Policy Set Definitions. It automatically handles version resolution, schema validation,
38
+ * and property transformation.
39
+ *
40
+ * Policy Set Definitions allow you to group multiple policy definitions together
41
+ * and assign them as a single unit (also known as "Initiatives" in Azure Portal).
42
+ *
43
+ * Note: Policy set definitions are created at subscription or management group scope.
44
+ * They do not have a location property as they are not region-specific.
45
+ *
46
+ * @example
47
+ * const initiative = new PolicySetDefinition(this, "security-initiative", {
48
+ * displayName: "Security Baseline",
49
+ * scope: "/subscriptions/00000000-0000-0000-0000-000000000000",
50
+ * policyDefinitions: [
51
+ * {
52
+ * policyDefinitionId: "/providers/Microsoft.Authorization/policyDefinitions/abc123",
53
+ * policyDefinitionReferenceId: "auditVMsWithoutExtensions",
54
+ * },
55
+ * ],
56
+ * });
57
+ *
58
+ * @stability stable
59
+ */
60
+ class PolicySetDefinition extends azapi_resource_1.AzapiResource {
61
+ /**
62
+ * Creates a new Azure Policy Set Definition using the AzapiResource framework
63
+ *
64
+ * The constructor automatically handles version resolution, schema registration,
65
+ * validation, and resource creation.
66
+ *
67
+ * @param scope - The scope in which to define this construct
68
+ * @param id - The unique identifier for this instance
69
+ * @param props - Configuration properties for the Policy Set Definition
70
+ */
71
+ constructor(scope, id, props) {
72
+ // Validate required properties
73
+ if (!props.displayName || props.displayName.trim() === "") {
74
+ throw new Error("displayName is required for policy set definitions");
75
+ }
76
+ if (!props.policyDefinitions || props.policyDefinitions.length === 0) {
77
+ throw new Error("At least one policy definition reference is required in policyDefinitions");
78
+ }
79
+ // Validate policy definition references
80
+ props.policyDefinitions.forEach((policyDef, index) => {
81
+ if (!policyDef.policyDefinitionId) {
82
+ throw new Error(`policyDefinitionId is required for policy definition at index ${index}`);
83
+ }
84
+ });
85
+ // Validate policy definition groups if provided
86
+ if (props.policyDefinitionGroups) {
87
+ const groupNames = new Set();
88
+ props.policyDefinitionGroups.forEach((group, index) => {
89
+ if (!group.name) {
90
+ throw new Error(`name is required for policy definition group at index ${index}`);
91
+ }
92
+ if (groupNames.has(group.name)) {
93
+ throw new Error(`Duplicate group name '${group.name}' in policyDefinitionGroups`);
94
+ }
95
+ groupNames.add(group.name);
96
+ });
97
+ // Validate that policy definitions reference valid groups
98
+ const validGroupNames = Array.from(groupNames);
99
+ props.policyDefinitions.forEach((policyDef, index) => {
100
+ if (policyDef.groupNames) {
101
+ policyDef.groupNames.forEach((groupName) => {
102
+ if (!validGroupNames.includes(groupName)) {
103
+ throw new Error(`Policy definition at index ${index} references unknown group '${groupName}'. Valid groups are: ${validGroupNames.join(", ")}`);
104
+ }
105
+ });
106
+ }
107
+ });
108
+ }
109
+ super(scope, id, props);
110
+ this.props = props;
111
+ // Create Terraform outputs for easy access and referencing from other resources
112
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
113
+ value: this.id,
114
+ description: "The ID of the Policy Set Definition",
115
+ });
116
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
117
+ value: `\${${this.terraformResource.fqn}.name}`,
118
+ description: "The name of the Policy Set Definition",
119
+ });
120
+ this.policySetDefinitionIdOutput = new cdktf.TerraformOutput(this, "policy_set_definition_id", {
121
+ value: this.id,
122
+ description: "The Policy Set Definition ID (same as id, for use in policy assignments)",
123
+ });
124
+ // Override logical IDs to match original naming convention
125
+ this.idOutput.overrideLogicalId("id");
126
+ this.nameOutput.overrideLogicalId("name");
127
+ this.policySetDefinitionIdOutput.overrideLogicalId("policy_set_definition_id");
128
+ }
129
+ // =============================================================================
130
+ // REQUIRED ABSTRACT METHODS FROM AzapiResource
131
+ // =============================================================================
132
+ /**
133
+ * Gets the default API version to use when no explicit version is specified
134
+ * Returns the most recent stable version as the default
135
+ */
136
+ defaultVersion() {
137
+ return "2023-04-01";
138
+ }
139
+ /**
140
+ * Gets the Azure resource type for Policy Set Definitions
141
+ */
142
+ resourceType() {
143
+ return policy_set_definition_schemas_1.POLICY_SET_DEFINITION_TYPE;
144
+ }
145
+ /**
146
+ * Gets the API schema for the resolved version
147
+ * Uses the framework's schema resolution to get the appropriate schema
148
+ */
149
+ apiSchema() {
150
+ return this.resolveSchema();
151
+ }
152
+ /**
153
+ * Overrides the name resolution to generate deterministic GUIDs for policy set definitions
154
+ *
155
+ * Policy set definitions can use custom names or auto-generated GUIDs.
156
+ * This implementation generates a deterministic UUID based on the policy set definition's
157
+ * key properties if no name is provided.
158
+ */
159
+ resolveName(props) {
160
+ const typedProps = props;
161
+ // If name is provided, use it
162
+ if (typedProps.name) {
163
+ return typedProps.name;
164
+ }
165
+ // Generate a deterministic GUID based on display name and scope
166
+ const hashInput = [typedProps.displayName, typedProps.scope].join("|");
167
+ const hash = (0, crypto_1.createHash)("sha256").update(hashInput).digest("hex");
168
+ // Convert hash to UUID format (8-4-4-4-12)
169
+ return [
170
+ hash.substring(0, 8),
171
+ hash.substring(8, 12),
172
+ hash.substring(12, 16),
173
+ hash.substring(16, 20),
174
+ hash.substring(20, 32),
175
+ ].join("-");
176
+ }
177
+ /**
178
+ * Creates the resource body for the Azure API call
179
+ * Transforms the input properties into the JSON format expected by Azure REST API
180
+ *
181
+ * Note: Policy set definitions do not have a location property as they are
182
+ * scope-specific resources deployed at subscription or management group level.
183
+ */
184
+ createResourceBody(props) {
185
+ const typedProps = props;
186
+ const body = {
187
+ properties: {
188
+ displayName: typedProps.displayName,
189
+ policyType: typedProps.policyType || "Custom",
190
+ policyDefinitions: typedProps.policyDefinitions,
191
+ },
192
+ };
193
+ // Add optional properties only if specified
194
+ if (typedProps.description) {
195
+ body.properties.description = typedProps.description;
196
+ }
197
+ if (typedProps.metadata) {
198
+ body.properties.metadata = typedProps.metadata;
199
+ }
200
+ if (typedProps.parameters) {
201
+ body.properties.parameters = typedProps.parameters;
202
+ }
203
+ if (typedProps.policyDefinitionGroups &&
204
+ typedProps.policyDefinitionGroups.length > 0) {
205
+ body.properties.policyDefinitionGroups =
206
+ typedProps.policyDefinitionGroups;
207
+ }
208
+ return body;
209
+ }
210
+ /**
211
+ * Resolves the parent resource ID for Policy Set Definition
212
+ * Policy Set Definitions are created at subscription or management group scope
213
+ *
214
+ * @param props - The resource properties
215
+ * @returns The parent resource ID (the scope)
216
+ */
217
+ resolveParentId(props) {
218
+ return props.scope;
219
+ }
220
+ // =============================================================================
221
+ // PUBLIC METHODS FOR POLICY SET DEFINITION OPERATIONS
222
+ // =============================================================================
223
+ /**
224
+ * Get the full resource identifier for use in policy assignments
225
+ * Alias for the id property
226
+ */
227
+ get policySetDefinitionId() {
228
+ return this.id;
229
+ }
230
+ /**
231
+ * Get the display name of the policy set definition
232
+ */
233
+ get displayName() {
234
+ return this.props.displayName;
235
+ }
236
+ /**
237
+ * Get the policy type
238
+ */
239
+ get policyType() {
240
+ return this.props.policyType || "Custom";
241
+ }
242
+ /**
243
+ * Get the number of policy definitions in this set
244
+ */
245
+ get policyDefinitionCount() {
246
+ return this.props.policyDefinitions.length;
247
+ }
248
+ }
249
+ exports.PolicySetDefinition = PolicySetDefinition;
250
+ _a = JSII_RTTI_SYMBOL_1;
251
+ PolicySetDefinition[_a] = { fqn: "@microsoft/terraform-cdk-constructs.PolicySetDefinition", version: "1.9.0" };
252
+ (() => {
253
+ azapi_resource_1.AzapiResource.registerSchemas(policy_set_definition_schemas_1.POLICY_SET_DEFINITION_TYPE, policy_set_definition_schemas_1.ALL_POLICY_SET_DEFINITION_VERSIONS);
254
+ })();
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LXNldC1kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXBvbGljeXNldGRlZmluaXRpb24vbGliL3BvbGljeS1zZXQtZGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsbUNBQW9DO0FBQ3BDLCtCQUErQjtBQUUvQixtRkFHeUM7QUFDekMsOEVBR21EO0FBb1ZuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLDhCQUFhO0lBa0JwRDs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLCtCQUErQjtRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLENBQzVFLENBQUM7UUFDSixDQUFDO1FBRUQsd0NBQXdDO1FBQ3hDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxLQUFLLEVBQUUsQ0FDekUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGdEQUFnRDtRQUNoRCxJQUFJ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QUksUUFBUSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7SUFDN0MsQ0FBQzs7QUEvUEgsa0RBZ1FDOzs7QUEvUEM7SUFDRSw4QkFBYSxDQUFDLGVBQWUsQ0FDM0IsMERBQTBCLEVBQzFCLGtFQUFrQyxDQUNuQyxDQUFDO0FBQ0osQ0FBQyxHQUFBLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaWZpZWQgQXp1cmUgUG9saWN5IFNldCBEZWZpbml0aW9uIChJbml0aWF0aXZlKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBBemFwaVJlc291cmNlIGZyYW1ld29ya1xuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB2ZXJzaW9uLWF3YXJlIGltcGxlbWVudGF0aW9uIGZvciBBenVyZSBQb2xpY3kgU2V0IERlZmluaXRpb25zXG4gKiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYSB2YWxpZGF0aW9uLCBhbmQgcHJvcGVydHlcbiAqIHRyYW5zZm9ybWF0aW9uIGFjcm9zcyBhbGwgc3VwcG9ydGVkIEFQSSB2ZXJzaW9ucy5cbiAqXG4gKiBQb2xpY3kgU2V0IERlZmluaXRpb25zIChhbHNvIGtub3duIGFzIEluaXRpYXRpdmVzIGluIEF6dXJlIFBvcnRhbCkgYWxsb3cgeW91IHRvXG4gKiBncm91cCBtdWx0aXBsZSBwb2xpY3kgZGVmaW5pdGlvbnMgdG9nZXRoZXIgYW5kIGFzc2lnbiB0aGVtIGFzIGEgc2luZ2xlIHVuaXQuXG4gKlxuICogU3VwcG9ydGVkIEFQSSBWZXJzaW9uczpcbiAqIC0gMjAyMy0wNC0wMSAoQWN0aXZlLCBMYXRlc3QpXG4gKiAtIDIwMjEtMDYtMDEgKEFjdGl2ZSwgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSlcbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb24gd2hlbiBubyB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICogLSBFeHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcgZm9yIHN0YWJpbGl0eSByZXF1aXJlbWVudHNcbiAqIC0gU2NoZW1hLWRyaXZlbiB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvblxuICogLSBGdWxsIEpTSUkgY29tcGxpYW5jZSBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydFxuICogLSBTdXBwb3J0IGZvciBwb2xpY3kgZGVmaW5pdGlvbiByZWZlcmVuY2VzIHdpdGggcGFyYW1ldGVyc1xuICogLSBQb2xpY3kgZGVmaW5pdGlvbiBncm91cHMgZm9yIG9yZ2FuaXphdGlvblxuICogLSBJbml0aWF0aXZlLWxldmVsIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBBTExfUE9MSUNZX1NFVF9ERUZJTklUSU9OX1ZFUlNJT05TLFxuICBQT0xJQ1lfU0VUX0RFRklOSVRJT05fVFlQRSxcbn0gZnJvbSBcIi4vcG9saWN5LXNldC1kZWZpbml0aW9uLXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSBwb2xpY3kgZGVmaW5pdGlvbiB3aXRoaW4gYSBwb2xpY3kgc2V0XG4gKlxuICogVGhpcyBkZWZpbmVzIHdoaWNoIHBvbGljeSBkZWZpbml0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGluaXRpYXRpdmVcbiAqIGFuZCBob3cgdGhleSBhcmUgY29uZmlndXJlZCB3aXRoIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5RGVmaW5pdGlvblJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHBvbGljeSBkZWZpbml0aW9uIHRvIGluY2x1ZGUgaW4gdGhlIHNldFxuICAgKlxuICAgKiBUaGlzIGNhbiBiZTpcbiAgICogLSBBIGJ1aWx0LWluIHBvbGljeTogL3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9wb2xpY3lEZWZpbml0aW9ucy97cG9saWN5RGVmaW5pdGlvbklkfVxuICAgKiAtIEEgY3VzdG9tIHBvbGljeSBhdCBzdWJzY3JpcHRpb24gbGV2ZWw6IC9zdWJzY3JpcHRpb25zL3tzdWJzY3JpcHRpb25JZH0vcHJvdmlkZXJzL01pY3Jvc29mdC5BdXRob3JpemF0aW9uL3BvbGljeURlZmluaXRpb25zL3twb2xpY3lEZWZpbml0aW9uSWR9XG4gICAqIC0gQSBjdXN0b20gcG9saWN5IGF0IG1hbmFnZW1lbnQgZ3JvdXAgbGV2ZWw6IC9wcm92aWRlcnMvTWljcm9zb2Z0Lk1hbmFnZW1lbnQvbWFuYWdlbWVudEdyb3Vwcy97bWFuYWdlbWVudEdyb3VwSWR9L3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9wb2xpY3lEZWZpbml0aW9ucy97cG9saWN5RGVmaW5pdGlvbklkfVxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi9wcm92aWRlcnMvTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcG9saWN5RGVmaW5pdGlvbnMvMDZhNzhlMjAtOTM1OC00MWM5LTkyM2MtZmI3MzZkMzgyYTRkXCJcbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeURlZmluaXRpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBkZWZpbml0aW9uIHJlZmVyZW5jZSB3aXRoaW4gdGhlIHNldFxuICAgKlxuICAgKiBUaGlzIElEIGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgc3BlY2lmaWMgcG9saWN5IGluIHRoZSBpbml0aWF0aXZlXG4gICAqIGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHBvbGljeSBzZXQgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGUgXCJhdWRpdFZNc1dpdGhvdXRUYWdzXCJcbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeURlZmluaXRpb25SZWZlcmVuY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhpcyBwb2xpY3kgZGVmaW5pdGlvblxuICAgKlxuICAgKiBUaGVzZSB2YWx1ZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcG9saWN5IGRlZmluaXRpb24uXG4gICAqIFBhcmFtZXRlcnMgY2FuIHJlZmVyZW5jZSBpbml0aWF0aXZlLWxldmVsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIGZvcm1hdDpcbiAgICogeyBcInZhbHVlXCI6IFwiW3BhcmFtZXRlcnMoJ2luaXRpYXRpdmVQYXJhbWV0ZXJOYW1lJyldXCIgfVxuICAgKlxuICAgKiBAZXhhbXBsZSB7IFwidGFnTmFtZVwiOiB7IFwidmFsdWVcIjogXCJlbnZpcm9ubWVudFwiIH0sIFwidGFnVmFsdWVcIjogeyBcInZhbHVlXCI6IFwiW3BhcmFtZXRlcnMoJ3JlcXVpcmVkVGFnVmFsdWUnKV1cIiB9IH1cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IFBvbGljeVBhcmFtZXRlclZhbHVlIH07XG5cbiAgLyoqXG4gICAqIEdyb3VwIG5hbWVzIHRoYXQgdGhpcyBwb2xpY3kgZGVmaW5pdGlvbiBiZWxvbmdzIHRvXG4gICAqXG4gICAqIEdyb3VwcyBoZWxwIG9yZ2FuaXplIHBvbGljaWVzIHdpdGhpbiBhbiBpbml0aWF0aXZlIGFuZCBjYW4gYmUgdXNlZFxuICAgKiBmb3IgY29tcGxpYW5jZSByZXBvcnRpbmcgYW5kIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFtcIlNlY3VyaXR5XCIsIFwiQ29tcGxpYW5jZVwiXVxuICAgKi9cbiAgcmVhZG9ubHkgZ3JvdXBOYW1lcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZ3JvdXAgZm9yIG9yZ2FuaXppbmcgcG9saWN5IGRlZmluaXRpb25zIHdpdGhpbiBhIHBvbGljeSBzZXRcbiAqXG4gKiBHcm91cHMgcHJvdmlkZSBhIHdheSB0byBjYXRlZ29yaXplIGFuZCBvcmdhbml6ZSBwb2xpY2llcyB3aXRoaW4gYW4gaW5pdGlhdGl2ZVxuICogZm9yIGJldHRlciBtYW5hZ2VtZW50IGFuZCBjb21wbGlhbmNlIHJlcG9ydGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lEZWZpbml0aW9uR3JvdXAge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdyb3VwIChtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHBvbGljeSBzZXQpXG4gICAqXG4gICAqIFRoaXMgbmFtZSBpcyByZWZlcmVuY2VkIGJ5IHBvbGljeSBkZWZpbml0aW9ucyB0byBpbmRpY2F0ZSBtZW1iZXJzaGlwLlxuICAgKlxuICAgKiBAZXhhbXBsZSBcIlNlY3VyaXR5XCJcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgZ3JvdXAgc2hvd24gaW4gQXp1cmUgUG9ydGFsXG4gICAqXG4gICAqIEBleGFtcGxlIFwiU2VjdXJpdHkgUG9saWNpZXNcIlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjYXRlZ29yeSB0aGlzIGdyb3VwIGJlbG9uZ3MgdG9cbiAgICpcbiAgICogQ2F0ZWdvcmllcyBoZWxwIG9yZ2FuaXplIGdyb3VwcyBhbmQgYXJlIGRpc3BsYXllZCBpbiB0aGUgQXp1cmUgUG9ydGFsLlxuICAgKlxuICAgKiBAZXhhbXBsZSBcIlNlY3VyaXR5IENlbnRlclwiXG4gICAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAncyBwdXJwb3NlXG4gICAqXG4gICAqIEBleGFtcGxlIFwiUG9saWNpZXMgcmVsYXRlZCB0byBzZWN1cml0eSBjb25maWd1cmF0aW9uIGFuZCBjb21wbGlhbmNlXCJcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG1ldGFkYXRhIGZvciB0aGUgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxNZXRhZGF0YUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGZvciB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gKlxuICogTWV0YWRhdGEgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9saWN5IHNldFxuICogd2l0aG91dCBhZmZlY3RpbmcgaXRzIGV2YWx1YXRpb24gbG9naWMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5U2V0TWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIGNhdGVnb3J5IG9mIHRoZSBwb2xpY3kgc2V0IGZvciBBenVyZSBQb3J0YWwgb3JnYW5pemF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlIFwiU2VjdXJpdHkgQ2VudGVyXCJcbiAgICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlIFwiMS4wLjBcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHBvbGljeSBzZXQgaXMgaW4gcHJldmlld1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJldmlldz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBwb2xpY3kgc2V0IGlzIGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlcHJlY2F0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGZvciBhIHBvbGljeSBzZXQgcGFyYW1ldGVyXG4gKlxuICogUHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgQXp1cmUgUG9ydGFsIGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGljeVNldFBhcmFtZXRlck1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFN0cm9uZyB0eXBlIGZvciBBenVyZSBQb3J0YWwgcmVzb3VyY2UgcGlja2VyIGludGVncmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzdHJvbmdUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG5hbWUgaW4gQXp1cmUgUG9ydGFsXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gaW4gQXp1cmUgUG9ydGFsXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgdGhlIHBvbGljeSBzZXRcbiAqXG4gKiBUaGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSByZWZlcmVuY2VkIGJ5IHBvbGljeSBkZWZpbml0aW9ucyB3aXRoaW4gdGhlIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lTZXRQYXJhbWV0ZXJEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlclxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTpcbiAgICB8IFwiU3RyaW5nXCJcbiAgICB8IFwiQXJyYXlcIlxuICAgIHwgXCJPYmplY3RcIlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiRGF0ZVRpbWVcIjtcblxuICAvKipcbiAgICogRGlzcGxheSBuYW1lIGZvciB0aGUgcGFyYW1ldGVyIGluIEF6dXJlIFBvcnRhbFxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0VmFsdWU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEFsbG93ZWQgdmFsdWVzIGZvciB0aGUgcGFyYW1ldGVyXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkVmFsdWVzPzogYW55W107XG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGZvciB0aGUgcGFyYW1ldGVyIChlLmcuLCBzdHJvbmdUeXBlIGZvciBBenVyZSBQb3J0YWwgaW50ZWdyYXRpb24pXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IFBvbGljeVNldFBhcmFtZXRlck1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEEgcGFyYW1ldGVyIHZhbHVlLCBlaXRoZXIgYSBkaXJlY3QgdmFsdWUgb3IgYSByZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lQYXJhbWV0ZXJWYWx1ZSB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuICAgKlxuICAgKiBDYW4gYmUgYSBkaXJlY3QgdmFsdWUgb3IgYSByZWZlcmVuY2UgdG8gYW4gaW5pdGlhdGl2ZSBwYXJhbWV0ZXJcbiAgICogdXNpbmcgdGhlIGZvcm1hdDogXCJbcGFyYW1ldGVycygncGFyYW1ldGVyTmFtZScpXVwiXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogYW55O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSB1bmlmaWVkIEF6dXJlIFBvbGljeSBTZXQgRGVmaW5pdGlvblxuICpcbiAqIEV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHdpdGggUG9saWN5IFNldCBEZWZpbml0aW9uIHNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lTZXREZWZpbml0aW9uUHJvcHMgZXh0ZW5kcyBBemFwaVJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIHNjb3BlIGF0IHdoaWNoIHRvIGNyZWF0ZSB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlOlxuICAgKiAtIEEgc3Vic2NyaXB0aW9uOiAvc3Vic2NyaXB0aW9ucy97c3Vic2NyaXB0aW9uSWR9XG4gICAqIC0gQSBtYW5hZ2VtZW50IGdyb3VwOiAvcHJvdmlkZXJzL01pY3Jvc29mdC5NYW5hZ2VtZW50L21hbmFnZW1lbnRHcm91cHMve21hbmFnZW1lbnRHcm91cElkfVxuICAgKlxuICAgKiBAZXhhbXBsZSBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiXG4gICAqIEBleGFtcGxlIFwiL3Byb3ZpZGVycy9NaWNyb3NvZnQuTWFuYWdlbWVudC9tYW5hZ2VtZW50R3JvdXBzL215LW1hbmFnZW1lbnQtZ3JvdXBcIlxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIG5hbWUgc2hvd24gaW4gdGhlIEF6dXJlIFBvcnRhbC5cbiAgICogUmVxdWlyZWQgcHJvcGVydHkuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiU2VjdXJpdHkgQmFzZWxpbmUgSW5pdGlhdGl2ZVwiXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlIFwiVGhpcyBpbml0aWF0aXZlIGFwcGxpZXMgYSBzZXQgb2Ygc2VjdXJpdHkgcG9saWNpZXMgdG8gZW5zdXJlIGJhc2VsaW5lIGNvbXBsaWFuY2UuXCJcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwb2xpY3kgc2V0IGRlZmluaXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgXCJDdXN0b21cIlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5VHlwZT86IFwiQnVpbHRJblwiIHwgXCJDdXN0b21cIiB8IFwiU3RhdGljXCI7XG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGZvciB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqXG4gICAqIEluY2x1ZGVzIGNhdGVnb3J5LCB2ZXJzaW9uLCBwcmV2aWV3LCBhbmQgZGVwcmVjYXRlZCBmbGFncy5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogUG9saWN5U2V0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFBhcmFtZXRlciBkZWZpbml0aW9ucyBmb3IgdGhlIHBvbGljeSBzZXRcbiAgICpcbiAgICogVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgcmVmZXJlbmNlZCBieSBwb2xpY3kgZGVmaW5pdGlvbnMgaW4gdGhlIHNldFxuICAgKiB1c2luZyB0aGUgZm9ybWF0OiBcIltwYXJhbWV0ZXJzKCdwYXJhbWV0ZXJOYW1lJyldXCJcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IFBvbGljeVNldFBhcmFtZXRlckRlZmluaXRpb24gfTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgcG9saWN5IGRlZmluaXRpb24gcmVmZXJlbmNlc1xuICAgKlxuICAgKiBFYWNoIHJlZmVyZW5jZSBzcGVjaWZpZXMgYSBwb2xpY3kgZGVmaW5pdGlvbiB0byBpbmNsdWRlIGluIHRoZSBzZXRcbiAgICogYWxvbmcgd2l0aCBpdHMgcGFyYW1ldGVyIHZhbHVlcyBhbmQgZ3JvdXAgbWVtYmVyc2hpcHMuXG4gICAqIFJlcXVpcmVkIHByb3BlcnR5LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVmaW5pdGlvbnM6IFBvbGljeURlZmluaXRpb25SZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogR3JvdXBzIGZvciBvcmdhbml6aW5nIHBvbGljeSBkZWZpbml0aW9ucyBpbiB0aGUgc2V0XG4gICAqXG4gICAqIEdyb3VwcyBoZWxwIGNhdGVnb3JpemUgcG9saWNpZXMgZm9yIG1hbmFnZW1lbnQgYW5kIGNvbXBsaWFuY2UgcmVwb3J0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVmaW5pdGlvbkdyb3Vwcz86IFBvbGljeURlZmluaXRpb25Hcm91cFtdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgaW50ZXJmYWNlIGZvciBBenVyZSBQb2xpY3kgU2V0IERlZmluaXRpb25cbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIEpTSUkgY29tcGxpYW5jZSB0byBzdXBwb3J0IG11bHRpLWxhbmd1YWdlIGNvZGUgZ2VuZXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGljeVNldERlZmluaXRpb25Qcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHBvbGljeSBzZXQgZGVmaW5pdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIHBvbGljeSBzZXQgZGVmaW5pdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHBvbGljeSBzZXQgZGVmaW5pdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5VHlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWV0YWRhdGEgZm9yIHRoZSBwb2xpY3kgc2V0IGRlZmluaXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogUG9saWN5U2V0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFBhcmFtZXRlciBkZWZpbml0aW9ucyBmb3IgdGhlIHBvbGljeSBzZXRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IFBvbGljeVNldFBhcmFtZXRlckRlZmluaXRpb24gfTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgcG9saWN5IGRlZmluaXRpb24gcmVmZXJlbmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVmaW5pdGlvbnM6IFBvbGljeURlZmluaXRpb25SZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogR3JvdXBzIGZvciBvcmdhbml6aW5nIHBvbGljeSBkZWZpbml0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5RGVmaW5pdGlvbkdyb3Vwcz86IFBvbGljeURlZmluaXRpb25Hcm91cFtdO1xufVxuXG4vKipcbiAqIFRoZSByZXNvdXJjZSBib2R5IGludGVyZmFjZSBmb3IgQXp1cmUgUG9saWN5IFNldCBEZWZpbml0aW9uIEFQSSBjYWxsc1xuICogVGhpcyBtYXRjaGVzIHRoZSBBenVyZSBSRVNUIEFQSSBzY2hlbWEgZm9yIHBvbGljeSBzZXQgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lTZXREZWZpbml0aW9uQm9keSB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBQb2xpY3lTZXREZWZpbml0aW9uUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBVbmlmaWVkIEF6dXJlIFBvbGljeSBTZXQgRGVmaW5pdGlvbiAoSW5pdGlhdGl2ZSkgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2luZ2xlLCB2ZXJzaW9uLWF3YXJlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBBenVyZVxuICogUG9saWN5IFNldCBEZWZpbml0aW9ucy4gSXQgYXV0b21hdGljYWxseSBoYW5kbGVzIHZlcnNpb24gcmVzb2x1dGlvbiwgc2NoZW1hIHZhbGlkYXRpb24sXG4gKiBhbmQgcHJvcGVydHkgdHJhbnNmb3JtYXRpb24uXG4gKlxuICogUG9saWN5IFNldCBEZWZpbml0aW9ucyBhbGxvdyB5b3UgdG8gZ3JvdXAgbXVsdGlwbGUgcG9saWN5IGRlZmluaXRpb25zIHRvZ2V0aGVyXG4gKiBhbmQgYXNzaWduIHRoZW0gYXMgYSBzaW5nbGUgdW5pdCAoYWxzbyBrbm93biBhcyBcIkluaXRpYXRpdmVzXCIgaW4gQXp1cmUgUG9ydGFsKS5cbiAqXG4gKiBOb3RlOiBQb2xpY3kgc2V0IGRlZmluaXRpb25zIGFyZSBjcmVhdGVkIGF0IHN1YnNjcmlwdGlvbiBvciBtYW5hZ2VtZW50IGdyb3VwIHNjb3BlLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIGxvY2F0aW9uIHByb3BlcnR5IGFzIHRoZXkgYXJlIG5vdCByZWdpb24tc3BlY2lmaWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGluaXRpYXRpdmUgPSBuZXcgUG9saWN5U2V0RGVmaW5pdGlvbih0aGlzLCBcInNlY3VyaXR5LWluaXRpYXRpdmVcIiwge1xuICogICBkaXNwbGF5TmFtZTogXCJTZWN1cml0eSBCYXNlbGluZVwiLFxuICogICBzY29wZTogXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAqICAgcG9saWN5RGVmaW5pdGlvbnM6IFtcbiAqICAgICB7XG4gKiAgICAgICBwb2xpY3lEZWZpbml0aW9uSWQ6IFwiL3Byb3ZpZGVycy9NaWNyb3NvZnQuQXV0aG9yaXphdGlvbi9wb2xpY3lEZWZpbml0aW9ucy9hYmMxMjNcIixcbiAqICAgICAgIHBvbGljeURlZmluaXRpb25SZWZlcmVuY2VJZDogXCJhdWRpdFZNc1dpdGhvdXRFeHRlbnNpb25zXCIsXG4gKiAgICAgfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xpY3lTZXREZWZpbml0aW9uIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoXG4gICAgICBQT0xJQ1lfU0VUX0RFRklOSVRJT05fVFlQRSxcbiAgICAgIEFMTF9QT0xJQ1lfU0VUX0RFRklOSVRJT05fVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcHJvcGVydGllcyBmb3IgdGhpcyBQb2xpY3kgU2V0IERlZmluaXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogUG9saWN5U2V0RGVmaW5pdGlvblByb3BzO1xuXG4gIC8vIE91dHB1dCBwcm9wZXJ0aWVzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmdcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lTZXREZWZpbml0aW9uSWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBenVyZSBQb2xpY3kgU2V0IERlZmluaXRpb24gdXNpbmcgdGhlIEF6YXBpUmVzb3VyY2UgZnJhbWV3b3JrXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdmVyc2lvbiByZXNvbHV0aW9uLCBzY2hlbWEgcmVnaXN0cmF0aW9uLFxuICAgKiB2YWxpZGF0aW9uLCBhbmQgcmVzb3VyY2UgY3JlYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIFBvbGljeSBTZXQgRGVmaW5pdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFBvbGljeVNldERlZmluaXRpb25Qcm9wcykge1xuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAgICBpZiAoIXByb3BzLmRpc3BsYXlOYW1lIHx8IHByb3BzLmRpc3BsYXlOYW1lLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlzcGxheU5hbWUgaXMgcmVxdWlyZWQgZm9yIHBvbGljeSBzZXQgZGVmaW5pdGlvbnNcIik7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wcy5wb2xpY3lEZWZpbml0aW9ucyB8fCBwcm9wcy5wb2xpY3lEZWZpbml0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBdCBsZWFzdCBvbmUgcG9saWN5IGRlZmluaXRpb24gcmVmZXJlbmNlIGlzIHJlcXVpcmVkIGluIHBvbGljeURlZmluaXRpb25zXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBvbGljeSBkZWZpbml0aW9uIHJlZmVyZW5jZXNcbiAgICBwcm9wcy5wb2xpY3lEZWZpbml0aW9ucy5mb3JFYWNoKChwb2xpY3lEZWYsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIXBvbGljeURlZi5wb2xpY3lEZWZpbml0aW9uSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBwb2xpY3lEZWZpbml0aW9uSWQgaXMgcmVxdWlyZWQgZm9yIHBvbGljeSBkZWZpbml0aW9uIGF0IGluZGV4ICR7aW5kZXh9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIHBvbGljeSBkZWZpbml0aW9uIGdyb3VwcyBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5wb2xpY3lEZWZpbml0aW9uR3JvdXBzKSB7XG4gICAgICBjb25zdCBncm91cE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBwcm9wcy5wb2xpY3lEZWZpbml0aW9uR3JvdXBzLmZvckVhY2goKGdyb3VwLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIWdyb3VwLm5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgbmFtZSBpcyByZXF1aXJlZCBmb3IgcG9saWN5IGRlZmluaXRpb24gZ3JvdXAgYXQgaW5kZXggJHtpbmRleH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyb3VwTmFtZXMuaGFzKGdyb3VwLm5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYER1cGxpY2F0ZSBncm91cCBuYW1lICcke2dyb3VwLm5hbWV9JyBpbiBwb2xpY3lEZWZpbml0aW9uR3JvdXBzYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwTmFtZXMuYWRkKGdyb3VwLm5hbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgcG9saWN5IGRlZmluaXRpb25zIHJlZmVyZW5jZSB2YWxpZCBncm91cHNcbiAgICAgIGNvbnN0IHZhbGlkR3JvdXBOYW1lcyA9IEFycmF5LmZyb20oZ3JvdXBOYW1lcyk7XG4gICAgICBwcm9wcy5wb2xpY3lEZWZpbml0aW9ucy5mb3JFYWNoKChwb2xpY3lEZWYsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChwb2xpY3lEZWYuZ3JvdXBOYW1lcykge1xuICAgICAgICAgIHBvbGljeURlZi5ncm91cE5hbWVzLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF2YWxpZEdyb3VwTmFtZXMuaW5jbHVkZXMoZ3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFBvbGljeSBkZWZpbml0aW9uIGF0IGluZGV4ICR7aW5kZXh9IHJlZmVyZW5jZXMgdW5rbm93biBncm91cCAnJHtncm91cE5hbWV9Jy4gVmFsaWQgZ3JvdXBzIGFyZTogJHt2YWxpZEdyb3VwTmFtZXMuam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgLy8gQ3JlYXRlIFRlcnJhZm9ybSBvdXRwdXRzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmcgZnJvbSBvdGhlciByZXNvdXJjZXNcbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBQb2xpY3kgU2V0IERlZmluaXRpb25cIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBQb2xpY3kgU2V0IERlZmluaXRpb25cIixcbiAgICB9KTtcblxuICAgIHRoaXMucG9saWN5U2V0RGVmaW5pdGlvbklkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dChcbiAgICAgIHRoaXMsXG4gICAgICBcInBvbGljeV9zZXRfZGVmaW5pdGlvbl9pZFwiLFxuICAgICAge1xuICAgICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJUaGUgUG9saWN5IFNldCBEZWZpbml0aW9uIElEIChzYW1lIGFzIGlkLCBmb3IgdXNlIGluIHBvbGljeSBhc3NpZ25tZW50cylcIixcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIE92ZXJyaWRlIGxvZ2ljYWwgSURzIHRvIG1hdGNoIG9yaWdpbmFsIG5hbWluZyBjb252ZW50aW9uXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5wb2xpY3lTZXREZWZpbml0aW9uSWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXG4gICAgICBcInBvbGljeV9zZXRfZGVmaW5pdGlvbl9pZFwiLFxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVFVSVJFRCBBQlNUUkFDVCBNRVRIT0RTIEZST00gQXphcGlSZXNvdXJjZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkZWZhdWx0IEFQSSB2ZXJzaW9uIHRvIHVzZSB3aGVuIG5vIGV4cGxpY2l0IHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gICAqIFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIGFzIHRoZSBkZWZhdWx0XG4gICAqL1xuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDIzLTA0LTAxXCI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQXp1cmUgcmVzb3VyY2UgdHlwZSBmb3IgUG9saWN5IFNldCBEZWZpbml0aW9uc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBQT0xJQ1lfU0VUX0RFRklOSVRJT05fVFlQRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKiBVc2VzIHRoZSBmcmFtZXdvcmsncyBzY2hlbWEgcmVzb2x1dGlvbiB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIHNjaGVtYVxuICAgKi9cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIG5hbWUgcmVzb2x1dGlvbiB0byBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIEdVSURzIGZvciBwb2xpY3kgc2V0IGRlZmluaXRpb25zXG4gICAqXG4gICAqIFBvbGljeSBzZXQgZGVmaW5pdGlvbnMgY2FuIHVzZSBjdXN0b20gbmFtZXMgb3IgYXV0by1nZW5lcmF0ZWQgR1VJRHMuXG4gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVzIGEgZGV0ZXJtaW5pc3RpYyBVVUlEIGJhc2VkIG9uIHRoZSBwb2xpY3kgc2V0IGRlZmluaXRpb24nc1xuICAgKiBrZXkgcHJvcGVydGllcyBpZiBubyBuYW1lIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVOYW1lKHByb3BzOiBBemFwaVJlc291cmNlUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBQb2xpY3lTZXREZWZpbml0aW9uUHJvcHM7XG5cbiAgICAvLyBJZiBuYW1lIGlzIHByb3ZpZGVkLCB1c2UgaXRcbiAgICBpZiAodHlwZWRQcm9wcy5uYW1lKSB7XG4gICAgICByZXR1cm4gdHlwZWRQcm9wcy5uYW1lO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGEgZGV0ZXJtaW5pc3RpYyBHVUlEIGJhc2VkIG9uIGRpc3BsYXkgbmFtZSBhbmQgc2NvcGVcbiAgICBjb25zdCBoYXNoSW5wdXQgPSBbdHlwZWRQcm9wcy5kaXNwbGF5TmFtZSwgdHlwZWRQcm9wcy5zY29wZV0uam9pbihcInxcIik7XG5cbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoaGFzaElucHV0KS5kaWdlc3QoXCJoZXhcIik7XG5cbiAgICAvLyBDb252ZXJ0IGhhc2ggdG8gVVVJRCBmb3JtYXQgKDgtNC00LTQtMTIpXG4gICAgcmV0dXJuIFtcbiAgICAgIGhhc2guc3Vic3RyaW5nKDAsIDgpLFxuICAgICAgaGFzaC5zdWJzdHJpbmcoOCwgMTIpLFxuICAgICAgaGFzaC5zdWJzdHJpbmcoMTIsIDE2KSxcbiAgICAgIGhhc2guc3Vic3RyaW5nKDE2LCAyMCksXG4gICAgICBoYXNoLnN1YnN0cmluZygyMCwgMzIpLFxuICAgIF0uam9pbihcIi1cIik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcmVzb3VyY2UgYm9keSBmb3IgdGhlIEF6dXJlIEFQSSBjYWxsXG4gICAqIFRyYW5zZm9ybXMgdGhlIGlucHV0IHByb3BlcnRpZXMgaW50byB0aGUgSlNPTiBmb3JtYXQgZXhwZWN0ZWQgYnkgQXp1cmUgUkVTVCBBUElcbiAgICpcbiAgICogTm90ZTogUG9saWN5IHNldCBkZWZpbml0aW9ucyBkbyBub3QgaGF2ZSBhIGxvY2F0aW9uIHByb3BlcnR5IGFzIHRoZXkgYXJlXG4gICAqIHNjb3BlLXNwZWNpZmljIHJlc291cmNlcyBkZXBsb3llZCBhdCBzdWJzY3JpcHRpb24gb3IgbWFuYWdlbWVudCBncm91cCBsZXZlbC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIFBvbGljeVNldERlZmluaXRpb25Qcm9wcztcblxuICAgIGNvbnN0IGJvZHk6IGFueSA9IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgZGlzcGxheU5hbWU6IHR5cGVkUHJvcHMuZGlzcGxheU5hbWUsXG4gICAgICAgIHBvbGljeVR5cGU6IHR5cGVkUHJvcHMucG9saWN5VHlwZSB8fCBcIkN1c3RvbVwiLFxuICAgICAgICBwb2xpY3lEZWZpbml0aW9uczogdHlwZWRQcm9wcy5wb2xpY3lEZWZpbml0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIEFkZCBvcHRpb25hbCBwcm9wZXJ0aWVzIG9ubHkgaWYgc3BlY2lmaWVkXG4gICAgaWYgKHR5cGVkUHJvcHMuZGVzY3JpcHRpb24pIHtcbiAgICAgIGJvZHkucHJvcGVydGllcy5kZXNjcmlwdGlvbiA9IHR5cGVkUHJvcHMuZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaWYgKHR5cGVkUHJvcHMubWV0YWRhdGEpIHtcbiAgICAgIGJvZHkucHJvcGVydGllcy5tZXRhZGF0YSA9IHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVkUHJvcHMucGFyYW1ldGVycykge1xuICAgICAgYm9keS5wcm9wZXJ0aWVzLnBhcmFtZXRlcnMgPSB0eXBlZFByb3BzLnBhcmFtZXRlcnM7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZWRQcm9wcy5wb2xpY3lEZWZpbml0aW9uR3JvdXBzICYmXG4gICAgICB0eXBlZFByb3BzLnBvbGljeURlZmluaXRpb25Hcm91cHMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgYm9keS5wcm9wZXJ0aWVzLnBvbGljeURlZmluaXRpb25Hcm91cHMgPVxuICAgICAgICB0eXBlZFByb3BzLnBvbGljeURlZmluaXRpb25Hcm91cHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHBhcmVudCByZXNvdXJjZSBJRCBmb3IgUG9saWN5IFNldCBEZWZpbml0aW9uXG4gICAqIFBvbGljeSBTZXQgRGVmaW5pdGlvbnMgYXJlIGNyZWF0ZWQgYXQgc3Vic2NyaXB0aW9uIG9yIG1hbmFnZW1lbnQgZ3JvdXAgc2NvcGVcbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIHJlc291cmNlIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgVGhlIHBhcmVudCByZXNvdXJjZSBJRCAodGhlIHNjb3BlKVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHByb3BzIGFzIFBvbGljeVNldERlZmluaXRpb25Qcm9wcykuc2NvcGU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyBGT1IgUE9MSUNZIFNFVCBERUZJTklUSU9OIE9QRVJBVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdWxsIHJlc291cmNlIGlkZW50aWZpZXIgZm9yIHVzZSBpbiBwb2xpY3kgYXNzaWdubWVudHNcbiAgICogQWxpYXMgZm9yIHRoZSBpZCBwcm9wZXJ0eVxuICAgKi9cbiAgcHVibGljIGdldCBwb2xpY3lTZXREZWZpbml0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcG9saWN5IHNldCBkZWZpbml0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZGlzcGxheU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwb2xpY3kgdHlwZVxuICAgKi9cbiAgcHVibGljIGdldCBwb2xpY3lUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucG9saWN5VHlwZSB8fCBcIkN1c3RvbVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIHBvbGljeSBkZWZpbml0aW9ucyBpbiB0aGlzIHNldFxuICAgKi9cbiAgcHVibGljIGdldCBwb2xpY3lEZWZpbml0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5wb2xpY3lEZWZpbml0aW9ucy5sZW5ndGg7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Integration test for Azure Policy Set Definition (Initiative)
3
+ *
4
+ * This test demonstrates basic usage of the PolicySetDefinition construct
5
+ * and validates deployment, idempotency, and cleanup.
6
+ *
7
+ * Run with: npm run integration:nostream
8
+ */
9
+ import "cdktf/lib/testing/adapters/jest";
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ /**
3
+ * Integration test for Azure Policy Set Definition (Initiative)
4
+ *
5
+ * This test demonstrates basic usage of the PolicySetDefinition construct
6
+ * and validates deployment, idempotency, and cleanup.
7
+ *
8
+ * Run with: npm run integration:nostream
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const cdktf_1 = require("cdktf");
12
+ require("cdktf/lib/testing/adapters/jest");
13
+ const data_azapi_client_config_1 = require("../../core-azure/lib/azapi/providers-azapi/data-azapi-client-config");
14
+ const provider_1 = require("../../core-azure/lib/azapi/providers-azapi/provider");
15
+ const testing_1 = require("../../testing");
16
+ const policy_set_definition_1 = require("../lib/policy-set-definition");
17
+ /**
18
+ * Example stack demonstrating Policy Set Definition usage
19
+ */
20
+ class PolicySetDefinitionExampleStack extends cdktf_1.TerraformStack {
21
+ constructor(scope, id) {
22
+ super(scope, id);
23
+ // Configure AZAPI provider
24
+ new provider_1.AzapiProvider(this, "azapi", {});
25
+ // Create a client config to get the current subscription ID
26
+ const clientConfig = new data_azapi_client_config_1.DataAzapiClientConfig(this, "client_config", {});
27
+ // Use the current subscription for policy definitions
28
+ const subscriptionId = `/subscriptions/\${${clientConfig.fqn}.subscription_id}`;
29
+ // Basic Policy Set Definition with built-in policies
30
+ new policy_set_definition_1.PolicySetDefinition(this, "basic-initiative", {
31
+ displayName: "Basic Security Initiative",
32
+ description: "A simple initiative to demonstrate Policy Set Definition construct",
33
+ scope: subscriptionId,
34
+ policyDefinitions: [
35
+ {
36
+ // Audit VMs that do not use managed disks
37
+ policyDefinitionId: "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
38
+ policyDefinitionReferenceId: "auditManagedDisks",
39
+ },
40
+ ],
41
+ });
42
+ }
43
+ }
44
+ describe("Policy Set Definition Integration Test", () => {
45
+ it("should deploy, validate idempotency, and cleanup Policy Set Definition resources", () => {
46
+ const app = cdktf_1.Testing.app();
47
+ const stack = new PolicySetDefinitionExampleStack(app, "test-policy-set-definition");
48
+ const synthesized = cdktf_1.Testing.fullSynth(stack);
49
+ // This will:
50
+ // 1. Run terraform apply to deploy resources
51
+ // 2. Run terraform plan to check idempotency (no changes expected)
52
+ // 3. Run terraform destroy to cleanup resources
53
+ (0, testing_1.TerraformApplyCheckAndDestroy)(synthesized);
54
+ }, 600000); // 10 minute timeout for deployment and cleanup
55
+ });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LXNldC1kZWZpbml0aW9uLmludGVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXBvbGljeXNldGRlZmluaXRpb24vdGVzdC9wb2xpY3ktc2V0LWRlZmluaXRpb24uaW50ZWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7O0FBRUgsaUNBQWdEO0FBRWhELDJDQUF5QztBQUN6QyxrSEFBNEc7QUFDNUcsa0ZBQW9GO0FBQ3BGLDJDQUE4RDtBQUM5RCx3RUFBbUU7QUFFbkU7O0dBRUc7QUFDSCxNQUFNLCtCQUFnQyxTQUFRLHNCQUFjO0lBQzFELFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsMkJBQTJCO1FBQzNCLElBQUksd0JBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLDREQUE0RDtRQUM1RCxNQUFNLFlBQVksR0FBRyxJQUFJLGdEQUFxQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFMUUsc0RBQXNEO1FBQ3RELE1BQU0sY0FBYyxHQUFHLHFCQUFxQixZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztRQUVoRixxREFBcUQ7UUFDckQsSUFBSSwyQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDaEQsV0FBVyxFQUFFLDJCQUEyQjtZQUN4QyxXQUFXLEVBQ1Qsb0VBQW9FO1lBQ3RFLEtBQUssRUFBRSxjQUFjO1lBQ3JCLGlCQUFpQixFQUFFO2dCQUNqQjtvQkFDRSwwQ0FBMEM7b0JBQzFDLGtCQUFrQixFQUNoQiwyRkFBMkY7b0JBQzdGLDJCQUEyQixFQUFFLG1CQUFtQjtpQkFDakQ7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELFFBQVEsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7SUFDdEQsRUFBRSxDQUFDLGtGQUFrRixFQUFFLEdBQUcsRUFBRTtRQUMxRixNQUFNLEdBQUcsR0FBRyxlQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSwrQkFBK0IsQ0FDL0MsR0FBRyxFQUNILDRCQUE0QixDQUM3QixDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsZUFBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QyxhQUFhO1FBQ2IsNkNBQTZDO1FBQzdDLG1FQUFtRTtRQUNuRSxnREFBZ0Q7UUFDaEQsSUFBQSx1Q0FBNkIsRUFBQyxXQUFXLENBQUMsQ0FBQztJQUM3QyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywrQ0FBK0M7QUFDN0QsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVncmF0aW9uIHRlc3QgZm9yIEF6dXJlIFBvbGljeSBTZXQgRGVmaW5pdGlvbiAoSW5pdGlhdGl2ZSlcbiAqXG4gKiBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIGJhc2ljIHVzYWdlIG9mIHRoZSBQb2xpY3lTZXREZWZpbml0aW9uIGNvbnN0cnVjdFxuICogYW5kIHZhbGlkYXRlcyBkZXBsb3ltZW50LCBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXAuXG4gKlxuICogUnVuIHdpdGg6IG5wbSBydW4gaW50ZWdyYXRpb246bm9zdHJlYW1cbiAqL1xuXG5pbXBvcnQgeyBUZXN0aW5nLCBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCBcImNka3RmL2xpYi90ZXN0aW5nL2FkYXB0ZXJzL2plc3RcIjtcbmltcG9ydCB7IERhdGFBemFwaUNsaWVudENvbmZpZyB9IGZyb20gXCIuLi8uLi9jb3JlLWF6dXJlL2xpYi9hemFwaS9wcm92aWRlcnMtYXphcGkvZGF0YS1hemFwaS1jbGllbnQtY29uZmlnXCI7XG5pbXBvcnQgeyBBemFwaVByb3ZpZGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL3Byb3ZpZGVycy1hemFwaS9wcm92aWRlclwiO1xuaW1wb3J0IHsgVGVycmFmb3JtQXBwbHlDaGVja0FuZERlc3Ryb3kgfSBmcm9tIFwiLi4vLi4vdGVzdGluZ1wiO1xuaW1wb3J0IHsgUG9saWN5U2V0RGVmaW5pdGlvbiB9IGZyb20gXCIuLi9saWIvcG9saWN5LXNldC1kZWZpbml0aW9uXCI7XG5cbi8qKlxuICogRXhhbXBsZSBzdGFjayBkZW1vbnN0cmF0aW5nIFBvbGljeSBTZXQgRGVmaW5pdGlvbiB1c2FnZVxuICovXG5jbGFzcyBQb2xpY3lTZXREZWZpbml0aW9uRXhhbXBsZVN0YWNrIGV4dGVuZHMgVGVycmFmb3JtU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENvbmZpZ3VyZSBBWkFQSSBwcm92aWRlclxuICAgIG5ldyBBemFwaVByb3ZpZGVyKHRoaXMsIFwiYXphcGlcIiwge30pO1xuXG4gICAgLy8gQ3JlYXRlIGEgY2xpZW50IGNvbmZpZyB0byBnZXQgdGhlIGN1cnJlbnQgc3Vic2NyaXB0aW9uIElEXG4gICAgY29uc3QgY2xpZW50Q29uZmlnID0gbmV3IERhdGFBemFwaUNsaWVudENvbmZpZyh0aGlzLCBcImNsaWVudF9jb25maWdcIiwge30pO1xuXG4gICAgLy8gVXNlIHRoZSBjdXJyZW50IHN1YnNjcmlwdGlvbiBmb3IgcG9saWN5IGRlZmluaXRpb25zXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSWQgPSBgL3N1YnNjcmlwdGlvbnMvXFwkeyR7Y2xpZW50Q29uZmlnLmZxbn0uc3Vic2NyaXB0aW9uX2lkfWA7XG5cbiAgICAvLyBCYXNpYyBQb2xpY3kgU2V0IERlZmluaXRpb24gd2l0aCBidWlsdC1pbiBwb2xpY2llc1xuICAgIG5ldyBQb2xpY3lTZXREZWZpbml0aW9uKHRoaXMsIFwiYmFzaWMtaW5pdGlhdGl2ZVwiLCB7XG4gICAgICBkaXNwbGF5TmFtZTogXCJCYXNpYyBTZWN1cml0eSBJbml0aWF0aXZlXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBIHNpbXBsZSBpbml0aWF0aXZlIHRvIGRlbW9uc3RyYXRlIFBvbGljeSBTZXQgRGVmaW5pdGlvbiBjb25zdHJ1Y3RcIixcbiAgICAgIHNjb3BlOiBzdWJzY3JpcHRpb25JZCxcbiAgICAgIHBvbGljeURlZmluaXRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBdWRpdCBWTXMgdGhhdCBkbyBub3QgdXNlIG1hbmFnZWQgZGlza3NcbiAgICAgICAgICBwb2xpY3lEZWZpbml0aW9uSWQ6XG4gICAgICAgICAgICBcIi9wcm92aWRlcnMvTWljcm9zb2Z0LkF1dGhvcml6YXRpb24vcG9saWN5RGVmaW5pdGlvbnMvMDZhNzhlMjAtOTM1OC00MWM5LTkyM2MtZmI3MzZkMzgyYTRkXCIsXG4gICAgICAgICAgcG9saWN5RGVmaW5pdGlvblJlZmVyZW5jZUlkOiBcImF1ZGl0TWFuYWdlZERpc2tzXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG5cbmRlc2NyaWJlKFwiUG9saWN5IFNldCBEZWZpbml0aW9uIEludGVncmF0aW9uIFRlc3RcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBkZXBsb3ksIHZhbGlkYXRlIGlkZW1wb3RlbmN5LCBhbmQgY2xlYW51cCBQb2xpY3kgU2V0IERlZmluaXRpb24gcmVzb3VyY2VzXCIsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFBvbGljeVNldERlZmluaXRpb25FeGFtcGxlU3RhY2soXG4gICAgICBhcHAsXG4gICAgICBcInRlc3QtcG9saWN5LXNldC1kZWZpbml0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3RpbmcuZnVsbFN5bnRoKHN0YWNrKTtcblxuICAgIC8vIFRoaXMgd2lsbDpcbiAgICAvLyAxLiBSdW4gdGVycmFmb3JtIGFwcGx5IHRvIGRlcGxveSByZXNvdXJjZXNcbiAgICAvLyAyLiBSdW4gdGVycmFmb3JtIHBsYW4gdG8gY2hlY2sgaWRlbXBvdGVuY3kgKG5vIGNoYW5nZXMgZXhwZWN0ZWQpXG4gICAgLy8gMy4gUnVuIHRlcnJhZm9ybSBkZXN0cm95IHRvIGNsZWFudXAgcmVzb3VyY2VzXG4gICAgVGVycmFmb3JtQXBwbHlDaGVja0FuZERlc3Ryb3koc3ludGhlc2l6ZWQpO1xuICB9LCA2MDAwMDApOyAvLyAxMCBtaW51dGUgdGltZW91dCBmb3IgZGVwbG95bWVudCBhbmQgY2xlYW51cFxufSk7XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Comprehensive tests for the PolicySetDefinition implementation
3
+ *
4
+ * This test suite validates the PolicySetDefinition class using the AzapiResource framework.
5
+ * Tests cover automatic version resolution, explicit version pinning, schema validation,
6
+ * property configurations, and resource creation.
7
+ */
8
+ export {};