@cdktn/provider-azuread 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/.jsii +112042 -0
  2. package/LICENSE +355 -0
  3. package/README.md +94 -0
  4. package/lib/access-package/index.d.ts +151 -0
  5. package/lib/access-package/index.js +354 -0
  6. package/lib/access-package-assignment-policy/index.d.ts +1098 -0
  7. package/lib/access-package-assignment-policy/index.js +2711 -0
  8. package/lib/access-package-catalog/index.d.ts +152 -0
  9. package/lib/access-package-catalog/index.js +357 -0
  10. package/lib/access-package-catalog-role-assignment/index.d.ts +140 -0
  11. package/lib/access-package-catalog-role-assignment/index.js +333 -0
  12. package/lib/access-package-resource-catalog-association/index.d.ts +131 -0
  13. package/lib/access-package-resource-catalog-association/index.js +307 -0
  14. package/lib/access-package-resource-package-association/index.d.ts +132 -0
  15. package/lib/access-package-resource-package-association/index.js +310 -0
  16. package/lib/administrative-unit/index.d.ts +165 -0
  17. package/lib/administrative-unit/index.js +385 -0
  18. package/lib/administrative-unit-member/index.d.ts +123 -0
  19. package/lib/administrative-unit-member/index.js +295 -0
  20. package/lib/administrative-unit-role-member/index.d.ts +131 -0
  21. package/lib/administrative-unit-role-member/index.js +307 -0
  22. package/lib/app-role-assignment/index.d.ts +134 -0
  23. package/lib/app-role-assignment/index.js +319 -0
  24. package/lib/application/index.d.ts +1352 -0
  25. package/lib/application/index.js +3262 -0
  26. package/lib/application-api-access/index.d.ts +152 -0
  27. package/lib/application-api-access/index.js +357 -0
  28. package/lib/application-app-role/index.d.ts +171 -0
  29. package/lib/application-app-role/index.js +390 -0
  30. package/lib/application-certificate/index.d.ts +196 -0
  31. package/lib/application-certificate/index.js +441 -0
  32. package/lib/application-fallback-public-client/index.d.ts +122 -0
  33. package/lib/application-fallback-public-client/index.js +292 -0
  34. package/lib/application-federated-identity-credential/index.d.ts +172 -0
  35. package/lib/application-federated-identity-credential/index.js +394 -0
  36. package/lib/application-flexible-federated-identity-credential/index.d.ts +172 -0
  37. package/lib/application-flexible-federated-identity-credential/index.js +394 -0
  38. package/lib/application-from-template/index.d.ts +134 -0
  39. package/lib/application-from-template/index.js +334 -0
  40. package/lib/application-identifier-uri/index.d.ts +121 -0
  41. package/lib/application-identifier-uri/index.js +289 -0
  42. package/lib/application-known-clients/index.d.ts +130 -0
  43. package/lib/application-known-clients/index.js +315 -0
  44. package/lib/application-optional-claims/index.d.ts +381 -0
  45. package/lib/application-optional-claims/index.js +918 -0
  46. package/lib/application-owner/index.d.ts +121 -0
  47. package/lib/application-owner/index.js +289 -0
  48. package/lib/application-password/index.d.ts +185 -0
  49. package/lib/application-password/index.js +410 -0
  50. package/lib/application-permission-scope/index.d.ts +193 -0
  51. package/lib/application-permission-scope/index.js +432 -0
  52. package/lib/application-pre-authorized/index.d.ts +140 -0
  53. package/lib/application-pre-authorized/index.js +333 -0
  54. package/lib/application-redirect-uris/index.d.ts +140 -0
  55. package/lib/application-redirect-uris/index.js +333 -0
  56. package/lib/application-registration/index.d.ts +278 -0
  57. package/lib/application-registration/index.js +610 -0
  58. package/lib/authentication-strength-policy/index.d.ts +141 -0
  59. package/lib/authentication-strength-policy/index.js +336 -0
  60. package/lib/claims-mapping-policy/index.d.ts +130 -0
  61. package/lib/claims-mapping-policy/index.js +315 -0
  62. package/lib/conditional-access-policy/index.d.ts +959 -0
  63. package/lib/conditional-access-policy/index.js +2705 -0
  64. package/lib/custom-directory-role/index.d.ts +216 -0
  65. package/lib/custom-directory-role/index.js +505 -0
  66. package/lib/data-azuread-access-package/index.d.ts +118 -0
  67. package/lib/data-azuread-access-package/index.js +272 -0
  68. package/lib/data-azuread-access-package-catalog/index.d.ts +108 -0
  69. package/lib/data-azuread-access-package-catalog/index.js +258 -0
  70. package/lib/data-azuread-access-package-catalog-role/index.d.ts +107 -0
  71. package/lib/data-azuread-access-package-catalog-role/index.js +254 -0
  72. package/lib/data-azuread-administrative-unit/index.d.ts +135 -0
  73. package/lib/data-azuread-administrative-unit/index.js +336 -0
  74. package/lib/data-azuread-application/index.d.ts +654 -0
  75. package/lib/data-azuread-application/index.js +1606 -0
  76. package/lib/data-azuread-application-published-app-ids/index.d.ts +85 -0
  77. package/lib/data-azuread-application-published-app-ids/index.js +206 -0
  78. package/lib/data-azuread-application-template/index.d.ts +111 -0
  79. package/lib/data-azuread-application-template/index.js +270 -0
  80. package/lib/data-azuread-client-config/index.d.ts +86 -0
  81. package/lib/data-azuread-client-config/index.js +216 -0
  82. package/lib/data-azuread-directory-object/index.d.ts +94 -0
  83. package/lib/data-azuread-directory-object/index.js +223 -0
  84. package/lib/data-azuread-directory-role-templates/index.d.ts +120 -0
  85. package/lib/data-azuread-directory-role-templates/index.js +293 -0
  86. package/lib/data-azuread-directory-roles/index.d.ts +122 -0
  87. package/lib/data-azuread-directory-roles/index.js +301 -0
  88. package/lib/data-azuread-domains/index.d.ts +190 -0
  89. package/lib/data-azuread-domains/index.js +435 -0
  90. package/lib/data-azuread-group/index.d.ts +207 -0
  91. package/lib/data-azuread-group/index.js +506 -0
  92. package/lib/data-azuread-group-role-management-policy/index.d.ts +105 -0
  93. package/lib/data-azuread-group-role-management-policy/index.js +248 -0
  94. package/lib/data-azuread-groups/index.d.ts +160 -0
  95. package/lib/data-azuread-groups/index.js +348 -0
  96. package/lib/data-azuread-named-location/index.d.ts +163 -0
  97. package/lib/data-azuread-named-location/index.js +398 -0
  98. package/lib/data-azuread-service-principal/index.d.ts +325 -0
  99. package/lib/data-azuread-service-principal/index.js +817 -0
  100. package/lib/data-azuread-service-principals/index.d.ts +183 -0
  101. package/lib/data-azuread-service-principals/index.js +430 -0
  102. package/lib/data-azuread-user/index.d.ts +177 -0
  103. package/lib/data-azuread-user/index.js +465 -0
  104. package/lib/data-azuread-users/index.d.ts +204 -0
  105. package/lib/data-azuread-users/index.js +468 -0
  106. package/lib/directory-role/index.d.ts +125 -0
  107. package/lib/directory-role/index.js +306 -0
  108. package/lib/directory-role-assignment/index.d.ts +143 -0
  109. package/lib/directory-role-assignment/index.js +331 -0
  110. package/lib/directory-role-eligibility-schedule-request/index.d.ts +141 -0
  111. package/lib/directory-role-eligibility-schedule-request/index.js +325 -0
  112. package/lib/directory-role-member/index.d.ts +123 -0
  113. package/lib/directory-role-member/index.js +295 -0
  114. package/lib/group/index.d.ts +392 -0
  115. package/lib/group/index.js +872 -0
  116. package/lib/group-member/index.d.ts +121 -0
  117. package/lib/group-member/index.js +289 -0
  118. package/lib/group-role-management-policy/index.d.ts +1043 -0
  119. package/lib/group-role-management-policy/index.js +2775 -0
  120. package/lib/group-without-members/index.d.ts +381 -0
  121. package/lib/group-without-members/index.js +851 -0
  122. package/lib/index.d.ts +79 -0
  123. package/lib/index.js +85 -0
  124. package/lib/invitation/index.d.ts +203 -0
  125. package/lib/invitation/index.js +490 -0
  126. package/lib/lazy-index.d.ts +4 -0
  127. package/lib/lazy-index.js +82 -0
  128. package/lib/named-location/index.d.ts +212 -0
  129. package/lib/named-location/index.js +571 -0
  130. package/lib/privileged-access-group-assignment-schedule/index.d.ts +218 -0
  131. package/lib/privileged-access-group-assignment-schedule/index.js +484 -0
  132. package/lib/privileged-access-group-eligibility-schedule/index.d.ts +218 -0
  133. package/lib/privileged-access-group-eligibility-schedule/index.js +484 -0
  134. package/lib/provider/index.d.ts +289 -0
  135. package/lib/provider/index.js +549 -0
  136. package/lib/service-principal/index.d.ts +547 -0
  137. package/lib/service-principal/index.js +1305 -0
  138. package/lib/service-principal-certificate/index.d.ts +187 -0
  139. package/lib/service-principal-certificate/index.js +415 -0
  140. package/lib/service-principal-claims-mapping-policy-assignment/index.d.ts +121 -0
  141. package/lib/service-principal-claims-mapping-policy-assignment/index.js +289 -0
  142. package/lib/service-principal-delegated-permission-grant/index.d.ts +151 -0
  143. package/lib/service-principal-delegated-permission-grant/index.js +354 -0
  144. package/lib/service-principal-password/index.d.ts +176 -0
  145. package/lib/service-principal-password/index.js +384 -0
  146. package/lib/service-principal-token-signing-certificate/index.d.ts +137 -0
  147. package/lib/service-principal-token-signing-certificate/index.js +329 -0
  148. package/lib/synchronization-job/index.d.ts +177 -0
  149. package/lib/synchronization-job/index.js +424 -0
  150. package/lib/synchronization-job-provision-on-demand/index.d.ts +254 -0
  151. package/lib/synchronization-job-provision-on-demand/index.js +590 -0
  152. package/lib/synchronization-secret/index.d.ts +184 -0
  153. package/lib/synchronization-secret/index.js +449 -0
  154. package/lib/user/index.d.ts +517 -0
  155. package/lib/user/index.js +1084 -0
  156. package/lib/user-flow-attribute/index.d.ts +141 -0
  157. package/lib/user-flow-attribute/index.js +340 -0
  158. package/package.json +155 -0
@@ -0,0 +1,2705 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ConditionalAccessPolicy = exports.ConditionalAccessPolicyTimeoutsOutputReference = exports.ConditionalAccessPolicySessionControlsOutputReference = exports.ConditionalAccessPolicyGrantControlsOutputReference = exports.ConditionalAccessPolicyConditionsOutputReference = exports.ConditionalAccessPolicyConditionsUsersOutputReference = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList = exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList = exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference = exports.ConditionalAccessPolicyConditionsPlatformsOutputReference = exports.ConditionalAccessPolicyConditionsLocationsOutputReference = exports.ConditionalAccessPolicyConditionsDevicesOutputReference = exports.ConditionalAccessPolicyConditionsDevicesFilterOutputReference = exports.ConditionalAccessPolicyConditionsClientApplicationsOutputReference = exports.ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference = exports.ConditionalAccessPolicyConditionsApplicationsOutputReference = void 0;
5
+ exports.conditionalAccessPolicyConditionsApplicationsToTerraform = conditionalAccessPolicyConditionsApplicationsToTerraform;
6
+ exports.conditionalAccessPolicyConditionsApplicationsToHclTerraform = conditionalAccessPolicyConditionsApplicationsToHclTerraform;
7
+ exports.conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform = conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform;
8
+ exports.conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform = conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform;
9
+ exports.conditionalAccessPolicyConditionsClientApplicationsToTerraform = conditionalAccessPolicyConditionsClientApplicationsToTerraform;
10
+ exports.conditionalAccessPolicyConditionsClientApplicationsToHclTerraform = conditionalAccessPolicyConditionsClientApplicationsToHclTerraform;
11
+ exports.conditionalAccessPolicyConditionsDevicesFilterToTerraform = conditionalAccessPolicyConditionsDevicesFilterToTerraform;
12
+ exports.conditionalAccessPolicyConditionsDevicesFilterToHclTerraform = conditionalAccessPolicyConditionsDevicesFilterToHclTerraform;
13
+ exports.conditionalAccessPolicyConditionsDevicesToTerraform = conditionalAccessPolicyConditionsDevicesToTerraform;
14
+ exports.conditionalAccessPolicyConditionsDevicesToHclTerraform = conditionalAccessPolicyConditionsDevicesToHclTerraform;
15
+ exports.conditionalAccessPolicyConditionsLocationsToTerraform = conditionalAccessPolicyConditionsLocationsToTerraform;
16
+ exports.conditionalAccessPolicyConditionsLocationsToHclTerraform = conditionalAccessPolicyConditionsLocationsToHclTerraform;
17
+ exports.conditionalAccessPolicyConditionsPlatformsToTerraform = conditionalAccessPolicyConditionsPlatformsToTerraform;
18
+ exports.conditionalAccessPolicyConditionsPlatformsToHclTerraform = conditionalAccessPolicyConditionsPlatformsToHclTerraform;
19
+ exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform;
20
+ exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform;
21
+ exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform;
22
+ exports.conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform = conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform;
23
+ exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform;
24
+ exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform;
25
+ exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform;
26
+ exports.conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform = conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform;
27
+ exports.conditionalAccessPolicyConditionsUsersToTerraform = conditionalAccessPolicyConditionsUsersToTerraform;
28
+ exports.conditionalAccessPolicyConditionsUsersToHclTerraform = conditionalAccessPolicyConditionsUsersToHclTerraform;
29
+ exports.conditionalAccessPolicyConditionsToTerraform = conditionalAccessPolicyConditionsToTerraform;
30
+ exports.conditionalAccessPolicyConditionsToHclTerraform = conditionalAccessPolicyConditionsToHclTerraform;
31
+ exports.conditionalAccessPolicyGrantControlsToTerraform = conditionalAccessPolicyGrantControlsToTerraform;
32
+ exports.conditionalAccessPolicyGrantControlsToHclTerraform = conditionalAccessPolicyGrantControlsToHclTerraform;
33
+ exports.conditionalAccessPolicySessionControlsToTerraform = conditionalAccessPolicySessionControlsToTerraform;
34
+ exports.conditionalAccessPolicySessionControlsToHclTerraform = conditionalAccessPolicySessionControlsToHclTerraform;
35
+ exports.conditionalAccessPolicyTimeoutsToTerraform = conditionalAccessPolicyTimeoutsToTerraform;
36
+ exports.conditionalAccessPolicyTimeoutsToHclTerraform = conditionalAccessPolicyTimeoutsToHclTerraform;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ const cdktn = require("cdktn");
39
+ function conditionalAccessPolicyConditionsApplicationsToTerraform(struct) {
40
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
41
+ return struct;
42
+ }
43
+ if (cdktn.isComplexElement(struct)) {
44
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
45
+ }
46
+ return {
47
+ excluded_applications: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedApplications),
48
+ included_applications: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedApplications),
49
+ included_user_actions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedUserActions),
50
+ };
51
+ }
52
+ function conditionalAccessPolicyConditionsApplicationsToHclTerraform(struct) {
53
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
54
+ return struct;
55
+ }
56
+ if (cdktn.isComplexElement(struct)) {
57
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
58
+ }
59
+ const attrs = {
60
+ excluded_applications: {
61
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedApplications),
62
+ isBlock: false,
63
+ type: "list",
64
+ storageClassType: "stringList",
65
+ },
66
+ included_applications: {
67
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedApplications),
68
+ isBlock: false,
69
+ type: "list",
70
+ storageClassType: "stringList",
71
+ },
72
+ included_user_actions: {
73
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedUserActions),
74
+ isBlock: false,
75
+ type: "list",
76
+ storageClassType: "stringList",
77
+ },
78
+ };
79
+ // remove undefined attributes
80
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
81
+ }
82
+ class ConditionalAccessPolicyConditionsApplicationsOutputReference extends cdktn.ComplexObject {
83
+ /**
84
+ * @param terraformResource The parent resource
85
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
86
+ */
87
+ constructor(terraformResource, terraformAttribute) {
88
+ super(terraformResource, terraformAttribute, false, 0);
89
+ this.isEmptyObject = false;
90
+ }
91
+ get internalValue() {
92
+ let hasAnyValues = this.isEmptyObject;
93
+ const internalValueResult = {};
94
+ if (this._excludedApplications !== undefined) {
95
+ hasAnyValues = true;
96
+ internalValueResult.excludedApplications = this._excludedApplications;
97
+ }
98
+ if (this._includedApplications !== undefined) {
99
+ hasAnyValues = true;
100
+ internalValueResult.includedApplications = this._includedApplications;
101
+ }
102
+ if (this._includedUserActions !== undefined) {
103
+ hasAnyValues = true;
104
+ internalValueResult.includedUserActions = this._includedUserActions;
105
+ }
106
+ return hasAnyValues ? internalValueResult : undefined;
107
+ }
108
+ set internalValue(value) {
109
+ if (value === undefined) {
110
+ this.isEmptyObject = false;
111
+ this._excludedApplications = undefined;
112
+ this._includedApplications = undefined;
113
+ this._includedUserActions = undefined;
114
+ }
115
+ else {
116
+ this.isEmptyObject = Object.keys(value).length === 0;
117
+ this._excludedApplications = value.excludedApplications;
118
+ this._includedApplications = value.includedApplications;
119
+ this._includedUserActions = value.includedUserActions;
120
+ }
121
+ }
122
+ get excludedApplications() {
123
+ return this.getListAttribute('excluded_applications');
124
+ }
125
+ set excludedApplications(value) {
126
+ this._excludedApplications = value;
127
+ }
128
+ resetExcludedApplications() {
129
+ this._excludedApplications = undefined;
130
+ }
131
+ // Temporarily expose input value. Use with caution.
132
+ get excludedApplicationsInput() {
133
+ return this._excludedApplications;
134
+ }
135
+ get includedApplications() {
136
+ return this.getListAttribute('included_applications');
137
+ }
138
+ set includedApplications(value) {
139
+ this._includedApplications = value;
140
+ }
141
+ resetIncludedApplications() {
142
+ this._includedApplications = undefined;
143
+ }
144
+ // Temporarily expose input value. Use with caution.
145
+ get includedApplicationsInput() {
146
+ return this._includedApplications;
147
+ }
148
+ get includedUserActions() {
149
+ return this.getListAttribute('included_user_actions');
150
+ }
151
+ set includedUserActions(value) {
152
+ this._includedUserActions = value;
153
+ }
154
+ resetIncludedUserActions() {
155
+ this._includedUserActions = undefined;
156
+ }
157
+ // Temporarily expose input value. Use with caution.
158
+ get includedUserActionsInput() {
159
+ return this._includedUserActions;
160
+ }
161
+ }
162
+ exports.ConditionalAccessPolicyConditionsApplicationsOutputReference = ConditionalAccessPolicyConditionsApplicationsOutputReference;
163
+ _a = JSII_RTTI_SYMBOL_1;
164
+ ConditionalAccessPolicyConditionsApplicationsOutputReference[_a] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsApplicationsOutputReference", version: "15.0.0" };
165
+ function conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform(struct) {
166
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
167
+ return struct;
168
+ }
169
+ if (cdktn.isComplexElement(struct)) {
170
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
171
+ }
172
+ return {
173
+ mode: cdktn.stringToTerraform(struct.mode),
174
+ rule: cdktn.stringToTerraform(struct.rule),
175
+ };
176
+ }
177
+ function conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform(struct) {
178
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
179
+ return struct;
180
+ }
181
+ if (cdktn.isComplexElement(struct)) {
182
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
183
+ }
184
+ const attrs = {
185
+ mode: {
186
+ value: cdktn.stringToHclTerraform(struct.mode),
187
+ isBlock: false,
188
+ type: "simple",
189
+ storageClassType: "string",
190
+ },
191
+ rule: {
192
+ value: cdktn.stringToHclTerraform(struct.rule),
193
+ isBlock: false,
194
+ type: "simple",
195
+ storageClassType: "string",
196
+ },
197
+ };
198
+ // remove undefined attributes
199
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
200
+ }
201
+ class ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference extends cdktn.ComplexObject {
202
+ /**
203
+ * @param terraformResource The parent resource
204
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
205
+ */
206
+ constructor(terraformResource, terraformAttribute) {
207
+ super(terraformResource, terraformAttribute, false, 0);
208
+ this.isEmptyObject = false;
209
+ }
210
+ get internalValue() {
211
+ let hasAnyValues = this.isEmptyObject;
212
+ const internalValueResult = {};
213
+ if (this._mode !== undefined) {
214
+ hasAnyValues = true;
215
+ internalValueResult.mode = this._mode;
216
+ }
217
+ if (this._rule !== undefined) {
218
+ hasAnyValues = true;
219
+ internalValueResult.rule = this._rule;
220
+ }
221
+ return hasAnyValues ? internalValueResult : undefined;
222
+ }
223
+ set internalValue(value) {
224
+ if (value === undefined) {
225
+ this.isEmptyObject = false;
226
+ this._mode = undefined;
227
+ this._rule = undefined;
228
+ }
229
+ else {
230
+ this.isEmptyObject = Object.keys(value).length === 0;
231
+ this._mode = value.mode;
232
+ this._rule = value.rule;
233
+ }
234
+ }
235
+ get mode() {
236
+ return this.getStringAttribute('mode');
237
+ }
238
+ set mode(value) {
239
+ this._mode = value;
240
+ }
241
+ // Temporarily expose input value. Use with caution.
242
+ get modeInput() {
243
+ return this._mode;
244
+ }
245
+ get rule() {
246
+ return this.getStringAttribute('rule');
247
+ }
248
+ set rule(value) {
249
+ this._rule = value;
250
+ }
251
+ // Temporarily expose input value. Use with caution.
252
+ get ruleInput() {
253
+ return this._rule;
254
+ }
255
+ }
256
+ exports.ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference = ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference;
257
+ _b = JSII_RTTI_SYMBOL_1;
258
+ ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference[_b] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference", version: "15.0.0" };
259
+ function conditionalAccessPolicyConditionsClientApplicationsToTerraform(struct) {
260
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
261
+ return struct;
262
+ }
263
+ if (cdktn.isComplexElement(struct)) {
264
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
265
+ }
266
+ return {
267
+ excluded_service_principals: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedServicePrincipals),
268
+ included_service_principals: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedServicePrincipals),
269
+ filter: conditionalAccessPolicyConditionsClientApplicationsFilterToTerraform(struct.filter),
270
+ };
271
+ }
272
+ function conditionalAccessPolicyConditionsClientApplicationsToHclTerraform(struct) {
273
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
274
+ return struct;
275
+ }
276
+ if (cdktn.isComplexElement(struct)) {
277
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
278
+ }
279
+ const attrs = {
280
+ excluded_service_principals: {
281
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedServicePrincipals),
282
+ isBlock: false,
283
+ type: "list",
284
+ storageClassType: "stringList",
285
+ },
286
+ included_service_principals: {
287
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedServicePrincipals),
288
+ isBlock: false,
289
+ type: "list",
290
+ storageClassType: "stringList",
291
+ },
292
+ filter: {
293
+ value: conditionalAccessPolicyConditionsClientApplicationsFilterToHclTerraform(struct.filter),
294
+ isBlock: true,
295
+ type: "list",
296
+ storageClassType: "ConditionalAccessPolicyConditionsClientApplicationsFilterList",
297
+ },
298
+ };
299
+ // remove undefined attributes
300
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
301
+ }
302
+ class ConditionalAccessPolicyConditionsClientApplicationsOutputReference extends cdktn.ComplexObject {
303
+ /**
304
+ * @param terraformResource The parent resource
305
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
306
+ */
307
+ constructor(terraformResource, terraformAttribute) {
308
+ super(terraformResource, terraformAttribute, false, 0);
309
+ this.isEmptyObject = false;
310
+ // filter - computed: false, optional: true, required: false
311
+ this._filter = new ConditionalAccessPolicyConditionsClientApplicationsFilterOutputReference(this, "filter");
312
+ }
313
+ get internalValue() {
314
+ let hasAnyValues = this.isEmptyObject;
315
+ const internalValueResult = {};
316
+ if (this._excludedServicePrincipals !== undefined) {
317
+ hasAnyValues = true;
318
+ internalValueResult.excludedServicePrincipals = this._excludedServicePrincipals;
319
+ }
320
+ if (this._includedServicePrincipals !== undefined) {
321
+ hasAnyValues = true;
322
+ internalValueResult.includedServicePrincipals = this._includedServicePrincipals;
323
+ }
324
+ if (this._filter?.internalValue !== undefined) {
325
+ hasAnyValues = true;
326
+ internalValueResult.filter = this._filter?.internalValue;
327
+ }
328
+ return hasAnyValues ? internalValueResult : undefined;
329
+ }
330
+ set internalValue(value) {
331
+ if (value === undefined) {
332
+ this.isEmptyObject = false;
333
+ this._excludedServicePrincipals = undefined;
334
+ this._includedServicePrincipals = undefined;
335
+ this._filter.internalValue = undefined;
336
+ }
337
+ else {
338
+ this.isEmptyObject = Object.keys(value).length === 0;
339
+ this._excludedServicePrincipals = value.excludedServicePrincipals;
340
+ this._includedServicePrincipals = value.includedServicePrincipals;
341
+ this._filter.internalValue = value.filter;
342
+ }
343
+ }
344
+ get excludedServicePrincipals() {
345
+ return this.getListAttribute('excluded_service_principals');
346
+ }
347
+ set excludedServicePrincipals(value) {
348
+ this._excludedServicePrincipals = value;
349
+ }
350
+ resetExcludedServicePrincipals() {
351
+ this._excludedServicePrincipals = undefined;
352
+ }
353
+ // Temporarily expose input value. Use with caution.
354
+ get excludedServicePrincipalsInput() {
355
+ return this._excludedServicePrincipals;
356
+ }
357
+ get includedServicePrincipals() {
358
+ return this.getListAttribute('included_service_principals');
359
+ }
360
+ set includedServicePrincipals(value) {
361
+ this._includedServicePrincipals = value;
362
+ }
363
+ resetIncludedServicePrincipals() {
364
+ this._includedServicePrincipals = undefined;
365
+ }
366
+ // Temporarily expose input value. Use with caution.
367
+ get includedServicePrincipalsInput() {
368
+ return this._includedServicePrincipals;
369
+ }
370
+ get filter() {
371
+ return this._filter;
372
+ }
373
+ putFilter(value) {
374
+ this._filter.internalValue = value;
375
+ }
376
+ resetFilter() {
377
+ this._filter.internalValue = undefined;
378
+ }
379
+ // Temporarily expose input value. Use with caution.
380
+ get filterInput() {
381
+ return this._filter.internalValue;
382
+ }
383
+ }
384
+ exports.ConditionalAccessPolicyConditionsClientApplicationsOutputReference = ConditionalAccessPolicyConditionsClientApplicationsOutputReference;
385
+ _c = JSII_RTTI_SYMBOL_1;
386
+ ConditionalAccessPolicyConditionsClientApplicationsOutputReference[_c] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsClientApplicationsOutputReference", version: "15.0.0" };
387
+ function conditionalAccessPolicyConditionsDevicesFilterToTerraform(struct) {
388
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
389
+ return struct;
390
+ }
391
+ if (cdktn.isComplexElement(struct)) {
392
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
393
+ }
394
+ return {
395
+ mode: cdktn.stringToTerraform(struct.mode),
396
+ rule: cdktn.stringToTerraform(struct.rule),
397
+ };
398
+ }
399
+ function conditionalAccessPolicyConditionsDevicesFilterToHclTerraform(struct) {
400
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
401
+ return struct;
402
+ }
403
+ if (cdktn.isComplexElement(struct)) {
404
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
405
+ }
406
+ const attrs = {
407
+ mode: {
408
+ value: cdktn.stringToHclTerraform(struct.mode),
409
+ isBlock: false,
410
+ type: "simple",
411
+ storageClassType: "string",
412
+ },
413
+ rule: {
414
+ value: cdktn.stringToHclTerraform(struct.rule),
415
+ isBlock: false,
416
+ type: "simple",
417
+ storageClassType: "string",
418
+ },
419
+ };
420
+ // remove undefined attributes
421
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
422
+ }
423
+ class ConditionalAccessPolicyConditionsDevicesFilterOutputReference extends cdktn.ComplexObject {
424
+ /**
425
+ * @param terraformResource The parent resource
426
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
427
+ */
428
+ constructor(terraformResource, terraformAttribute) {
429
+ super(terraformResource, terraformAttribute, false, 0);
430
+ this.isEmptyObject = false;
431
+ }
432
+ get internalValue() {
433
+ let hasAnyValues = this.isEmptyObject;
434
+ const internalValueResult = {};
435
+ if (this._mode !== undefined) {
436
+ hasAnyValues = true;
437
+ internalValueResult.mode = this._mode;
438
+ }
439
+ if (this._rule !== undefined) {
440
+ hasAnyValues = true;
441
+ internalValueResult.rule = this._rule;
442
+ }
443
+ return hasAnyValues ? internalValueResult : undefined;
444
+ }
445
+ set internalValue(value) {
446
+ if (value === undefined) {
447
+ this.isEmptyObject = false;
448
+ this._mode = undefined;
449
+ this._rule = undefined;
450
+ }
451
+ else {
452
+ this.isEmptyObject = Object.keys(value).length === 0;
453
+ this._mode = value.mode;
454
+ this._rule = value.rule;
455
+ }
456
+ }
457
+ get mode() {
458
+ return this.getStringAttribute('mode');
459
+ }
460
+ set mode(value) {
461
+ this._mode = value;
462
+ }
463
+ // Temporarily expose input value. Use with caution.
464
+ get modeInput() {
465
+ return this._mode;
466
+ }
467
+ get rule() {
468
+ return this.getStringAttribute('rule');
469
+ }
470
+ set rule(value) {
471
+ this._rule = value;
472
+ }
473
+ // Temporarily expose input value. Use with caution.
474
+ get ruleInput() {
475
+ return this._rule;
476
+ }
477
+ }
478
+ exports.ConditionalAccessPolicyConditionsDevicesFilterOutputReference = ConditionalAccessPolicyConditionsDevicesFilterOutputReference;
479
+ _d = JSII_RTTI_SYMBOL_1;
480
+ ConditionalAccessPolicyConditionsDevicesFilterOutputReference[_d] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsDevicesFilterOutputReference", version: "15.0.0" };
481
+ function conditionalAccessPolicyConditionsDevicesToTerraform(struct) {
482
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
483
+ return struct;
484
+ }
485
+ if (cdktn.isComplexElement(struct)) {
486
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
487
+ }
488
+ return {
489
+ filter: conditionalAccessPolicyConditionsDevicesFilterToTerraform(struct.filter),
490
+ };
491
+ }
492
+ function conditionalAccessPolicyConditionsDevicesToHclTerraform(struct) {
493
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
494
+ return struct;
495
+ }
496
+ if (cdktn.isComplexElement(struct)) {
497
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
498
+ }
499
+ const attrs = {
500
+ filter: {
501
+ value: conditionalAccessPolicyConditionsDevicesFilterToHclTerraform(struct.filter),
502
+ isBlock: true,
503
+ type: "list",
504
+ storageClassType: "ConditionalAccessPolicyConditionsDevicesFilterList",
505
+ },
506
+ };
507
+ // remove undefined attributes
508
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
509
+ }
510
+ class ConditionalAccessPolicyConditionsDevicesOutputReference extends cdktn.ComplexObject {
511
+ /**
512
+ * @param terraformResource The parent resource
513
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
514
+ */
515
+ constructor(terraformResource, terraformAttribute) {
516
+ super(terraformResource, terraformAttribute, false, 0);
517
+ this.isEmptyObject = false;
518
+ // filter - computed: false, optional: true, required: false
519
+ this._filter = new ConditionalAccessPolicyConditionsDevicesFilterOutputReference(this, "filter");
520
+ }
521
+ get internalValue() {
522
+ let hasAnyValues = this.isEmptyObject;
523
+ const internalValueResult = {};
524
+ if (this._filter?.internalValue !== undefined) {
525
+ hasAnyValues = true;
526
+ internalValueResult.filter = this._filter?.internalValue;
527
+ }
528
+ return hasAnyValues ? internalValueResult : undefined;
529
+ }
530
+ set internalValue(value) {
531
+ if (value === undefined) {
532
+ this.isEmptyObject = false;
533
+ this._filter.internalValue = undefined;
534
+ }
535
+ else {
536
+ this.isEmptyObject = Object.keys(value).length === 0;
537
+ this._filter.internalValue = value.filter;
538
+ }
539
+ }
540
+ get filter() {
541
+ return this._filter;
542
+ }
543
+ putFilter(value) {
544
+ this._filter.internalValue = value;
545
+ }
546
+ resetFilter() {
547
+ this._filter.internalValue = undefined;
548
+ }
549
+ // Temporarily expose input value. Use with caution.
550
+ get filterInput() {
551
+ return this._filter.internalValue;
552
+ }
553
+ }
554
+ exports.ConditionalAccessPolicyConditionsDevicesOutputReference = ConditionalAccessPolicyConditionsDevicesOutputReference;
555
+ _e = JSII_RTTI_SYMBOL_1;
556
+ ConditionalAccessPolicyConditionsDevicesOutputReference[_e] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsDevicesOutputReference", version: "15.0.0" };
557
+ function conditionalAccessPolicyConditionsLocationsToTerraform(struct) {
558
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
559
+ return struct;
560
+ }
561
+ if (cdktn.isComplexElement(struct)) {
562
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
563
+ }
564
+ return {
565
+ excluded_locations: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedLocations),
566
+ included_locations: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedLocations),
567
+ };
568
+ }
569
+ function conditionalAccessPolicyConditionsLocationsToHclTerraform(struct) {
570
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
571
+ return struct;
572
+ }
573
+ if (cdktn.isComplexElement(struct)) {
574
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
575
+ }
576
+ const attrs = {
577
+ excluded_locations: {
578
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedLocations),
579
+ isBlock: false,
580
+ type: "list",
581
+ storageClassType: "stringList",
582
+ },
583
+ included_locations: {
584
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedLocations),
585
+ isBlock: false,
586
+ type: "list",
587
+ storageClassType: "stringList",
588
+ },
589
+ };
590
+ // remove undefined attributes
591
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
592
+ }
593
+ class ConditionalAccessPolicyConditionsLocationsOutputReference extends cdktn.ComplexObject {
594
+ /**
595
+ * @param terraformResource The parent resource
596
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
597
+ */
598
+ constructor(terraformResource, terraformAttribute) {
599
+ super(terraformResource, terraformAttribute, false, 0);
600
+ this.isEmptyObject = false;
601
+ }
602
+ get internalValue() {
603
+ let hasAnyValues = this.isEmptyObject;
604
+ const internalValueResult = {};
605
+ if (this._excludedLocations !== undefined) {
606
+ hasAnyValues = true;
607
+ internalValueResult.excludedLocations = this._excludedLocations;
608
+ }
609
+ if (this._includedLocations !== undefined) {
610
+ hasAnyValues = true;
611
+ internalValueResult.includedLocations = this._includedLocations;
612
+ }
613
+ return hasAnyValues ? internalValueResult : undefined;
614
+ }
615
+ set internalValue(value) {
616
+ if (value === undefined) {
617
+ this.isEmptyObject = false;
618
+ this._excludedLocations = undefined;
619
+ this._includedLocations = undefined;
620
+ }
621
+ else {
622
+ this.isEmptyObject = Object.keys(value).length === 0;
623
+ this._excludedLocations = value.excludedLocations;
624
+ this._includedLocations = value.includedLocations;
625
+ }
626
+ }
627
+ get excludedLocations() {
628
+ return this.getListAttribute('excluded_locations');
629
+ }
630
+ set excludedLocations(value) {
631
+ this._excludedLocations = value;
632
+ }
633
+ resetExcludedLocations() {
634
+ this._excludedLocations = undefined;
635
+ }
636
+ // Temporarily expose input value. Use with caution.
637
+ get excludedLocationsInput() {
638
+ return this._excludedLocations;
639
+ }
640
+ get includedLocations() {
641
+ return this.getListAttribute('included_locations');
642
+ }
643
+ set includedLocations(value) {
644
+ this._includedLocations = value;
645
+ }
646
+ // Temporarily expose input value. Use with caution.
647
+ get includedLocationsInput() {
648
+ return this._includedLocations;
649
+ }
650
+ }
651
+ exports.ConditionalAccessPolicyConditionsLocationsOutputReference = ConditionalAccessPolicyConditionsLocationsOutputReference;
652
+ _f = JSII_RTTI_SYMBOL_1;
653
+ ConditionalAccessPolicyConditionsLocationsOutputReference[_f] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsLocationsOutputReference", version: "15.0.0" };
654
+ function conditionalAccessPolicyConditionsPlatformsToTerraform(struct) {
655
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
656
+ return struct;
657
+ }
658
+ if (cdktn.isComplexElement(struct)) {
659
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
660
+ }
661
+ return {
662
+ excluded_platforms: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedPlatforms),
663
+ included_platforms: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedPlatforms),
664
+ };
665
+ }
666
+ function conditionalAccessPolicyConditionsPlatformsToHclTerraform(struct) {
667
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
668
+ return struct;
669
+ }
670
+ if (cdktn.isComplexElement(struct)) {
671
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
672
+ }
673
+ const attrs = {
674
+ excluded_platforms: {
675
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedPlatforms),
676
+ isBlock: false,
677
+ type: "list",
678
+ storageClassType: "stringList",
679
+ },
680
+ included_platforms: {
681
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedPlatforms),
682
+ isBlock: false,
683
+ type: "list",
684
+ storageClassType: "stringList",
685
+ },
686
+ };
687
+ // remove undefined attributes
688
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
689
+ }
690
+ class ConditionalAccessPolicyConditionsPlatformsOutputReference extends cdktn.ComplexObject {
691
+ /**
692
+ * @param terraformResource The parent resource
693
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
694
+ */
695
+ constructor(terraformResource, terraformAttribute) {
696
+ super(terraformResource, terraformAttribute, false, 0);
697
+ this.isEmptyObject = false;
698
+ }
699
+ get internalValue() {
700
+ let hasAnyValues = this.isEmptyObject;
701
+ const internalValueResult = {};
702
+ if (this._excludedPlatforms !== undefined) {
703
+ hasAnyValues = true;
704
+ internalValueResult.excludedPlatforms = this._excludedPlatforms;
705
+ }
706
+ if (this._includedPlatforms !== undefined) {
707
+ hasAnyValues = true;
708
+ internalValueResult.includedPlatforms = this._includedPlatforms;
709
+ }
710
+ return hasAnyValues ? internalValueResult : undefined;
711
+ }
712
+ set internalValue(value) {
713
+ if (value === undefined) {
714
+ this.isEmptyObject = false;
715
+ this._excludedPlatforms = undefined;
716
+ this._includedPlatforms = undefined;
717
+ }
718
+ else {
719
+ this.isEmptyObject = Object.keys(value).length === 0;
720
+ this._excludedPlatforms = value.excludedPlatforms;
721
+ this._includedPlatforms = value.includedPlatforms;
722
+ }
723
+ }
724
+ get excludedPlatforms() {
725
+ return this.getListAttribute('excluded_platforms');
726
+ }
727
+ set excludedPlatforms(value) {
728
+ this._excludedPlatforms = value;
729
+ }
730
+ resetExcludedPlatforms() {
731
+ this._excludedPlatforms = undefined;
732
+ }
733
+ // Temporarily expose input value. Use with caution.
734
+ get excludedPlatformsInput() {
735
+ return this._excludedPlatforms;
736
+ }
737
+ get includedPlatforms() {
738
+ return this.getListAttribute('included_platforms');
739
+ }
740
+ set includedPlatforms(value) {
741
+ this._includedPlatforms = value;
742
+ }
743
+ // Temporarily expose input value. Use with caution.
744
+ get includedPlatformsInput() {
745
+ return this._includedPlatforms;
746
+ }
747
+ }
748
+ exports.ConditionalAccessPolicyConditionsPlatformsOutputReference = ConditionalAccessPolicyConditionsPlatformsOutputReference;
749
+ _g = JSII_RTTI_SYMBOL_1;
750
+ ConditionalAccessPolicyConditionsPlatformsOutputReference[_g] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsPlatformsOutputReference", version: "15.0.0" };
751
+ function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform(struct) {
752
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
753
+ return struct;
754
+ }
755
+ if (cdktn.isComplexElement(struct)) {
756
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
757
+ }
758
+ return {
759
+ members: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.members),
760
+ membership_kind: cdktn.stringToTerraform(struct.membershipKind),
761
+ };
762
+ }
763
+ function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform(struct) {
764
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
765
+ return struct;
766
+ }
767
+ if (cdktn.isComplexElement(struct)) {
768
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
769
+ }
770
+ const attrs = {
771
+ members: {
772
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.members),
773
+ isBlock: false,
774
+ type: "list",
775
+ storageClassType: "stringList",
776
+ },
777
+ membership_kind: {
778
+ value: cdktn.stringToHclTerraform(struct.membershipKind),
779
+ isBlock: false,
780
+ type: "simple",
781
+ storageClassType: "string",
782
+ },
783
+ };
784
+ // remove undefined attributes
785
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
786
+ }
787
+ class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference extends cdktn.ComplexObject {
788
+ /**
789
+ * @param terraformResource The parent resource
790
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
791
+ * @param complexObjectIndex the index of this item in the list
792
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
793
+ */
794
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
795
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
796
+ this.isEmptyObject = false;
797
+ }
798
+ get internalValue() {
799
+ if (this.resolvableValue) {
800
+ return this.resolvableValue;
801
+ }
802
+ let hasAnyValues = this.isEmptyObject;
803
+ const internalValueResult = {};
804
+ if (this._members !== undefined) {
805
+ hasAnyValues = true;
806
+ internalValueResult.members = this._members;
807
+ }
808
+ if (this._membershipKind !== undefined) {
809
+ hasAnyValues = true;
810
+ internalValueResult.membershipKind = this._membershipKind;
811
+ }
812
+ return hasAnyValues ? internalValueResult : undefined;
813
+ }
814
+ set internalValue(value) {
815
+ if (value === undefined) {
816
+ this.isEmptyObject = false;
817
+ this.resolvableValue = undefined;
818
+ this._members = undefined;
819
+ this._membershipKind = undefined;
820
+ }
821
+ else if (cdktn.Tokenization.isResolvable(value)) {
822
+ this.isEmptyObject = false;
823
+ this.resolvableValue = value;
824
+ }
825
+ else {
826
+ this.isEmptyObject = Object.keys(value).length === 0;
827
+ this.resolvableValue = undefined;
828
+ this._members = value.members;
829
+ this._membershipKind = value.membershipKind;
830
+ }
831
+ }
832
+ get members() {
833
+ return this.getListAttribute('members');
834
+ }
835
+ set members(value) {
836
+ this._members = value;
837
+ }
838
+ resetMembers() {
839
+ this._members = undefined;
840
+ }
841
+ // Temporarily expose input value. Use with caution.
842
+ get membersInput() {
843
+ return this._members;
844
+ }
845
+ get membershipKind() {
846
+ return this.getStringAttribute('membership_kind');
847
+ }
848
+ set membershipKind(value) {
849
+ this._membershipKind = value;
850
+ }
851
+ // Temporarily expose input value. Use with caution.
852
+ get membershipKindInput() {
853
+ return this._membershipKind;
854
+ }
855
+ }
856
+ exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference;
857
+ _h = JSII_RTTI_SYMBOL_1;
858
+ ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference[_h] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference", version: "15.0.0" };
859
+ class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList extends cdktn.ComplexList {
860
+ /**
861
+ * @param terraformResource The parent resource
862
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
863
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
864
+ */
865
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
866
+ super(terraformResource, terraformAttribute, wrapsSet);
867
+ this.terraformResource = terraformResource;
868
+ this.terraformAttribute = terraformAttribute;
869
+ this.wrapsSet = wrapsSet;
870
+ }
871
+ /**
872
+ * @param index the index of the item to return
873
+ */
874
+ get(index) {
875
+ return new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
876
+ }
877
+ }
878
+ exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList;
879
+ _j = JSII_RTTI_SYMBOL_1;
880
+ ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList[_j] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList", version: "15.0.0" };
881
+ function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform(struct) {
882
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
883
+ return struct;
884
+ }
885
+ if (cdktn.isComplexElement(struct)) {
886
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
887
+ }
888
+ return {
889
+ guest_or_external_user_types: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.guestOrExternalUserTypes),
890
+ external_tenants: cdktn.listMapper(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToTerraform, true)(struct.externalTenants),
891
+ };
892
+ }
893
+ function conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform(struct) {
894
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
895
+ return struct;
896
+ }
897
+ if (cdktn.isComplexElement(struct)) {
898
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
899
+ }
900
+ const attrs = {
901
+ guest_or_external_user_types: {
902
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.guestOrExternalUserTypes),
903
+ isBlock: false,
904
+ type: "list",
905
+ storageClassType: "stringList",
906
+ },
907
+ external_tenants: {
908
+ value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsToHclTerraform, true)(struct.externalTenants),
909
+ isBlock: true,
910
+ type: "list",
911
+ storageClassType: "ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList",
912
+ },
913
+ };
914
+ // remove undefined attributes
915
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
916
+ }
917
+ class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference extends cdktn.ComplexObject {
918
+ /**
919
+ * @param terraformResource The parent resource
920
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
921
+ * @param complexObjectIndex the index of this item in the list
922
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
923
+ */
924
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
925
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
926
+ this.isEmptyObject = false;
927
+ // external_tenants - computed: false, optional: true, required: false
928
+ this._externalTenants = new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersExternalTenantsList(this, "external_tenants", false);
929
+ }
930
+ get internalValue() {
931
+ if (this.resolvableValue) {
932
+ return this.resolvableValue;
933
+ }
934
+ let hasAnyValues = this.isEmptyObject;
935
+ const internalValueResult = {};
936
+ if (this._guestOrExternalUserTypes !== undefined) {
937
+ hasAnyValues = true;
938
+ internalValueResult.guestOrExternalUserTypes = this._guestOrExternalUserTypes;
939
+ }
940
+ if (this._externalTenants?.internalValue !== undefined) {
941
+ hasAnyValues = true;
942
+ internalValueResult.externalTenants = this._externalTenants?.internalValue;
943
+ }
944
+ return hasAnyValues ? internalValueResult : undefined;
945
+ }
946
+ set internalValue(value) {
947
+ if (value === undefined) {
948
+ this.isEmptyObject = false;
949
+ this.resolvableValue = undefined;
950
+ this._guestOrExternalUserTypes = undefined;
951
+ this._externalTenants.internalValue = undefined;
952
+ }
953
+ else if (cdktn.Tokenization.isResolvable(value)) {
954
+ this.isEmptyObject = false;
955
+ this.resolvableValue = value;
956
+ }
957
+ else {
958
+ this.isEmptyObject = Object.keys(value).length === 0;
959
+ this.resolvableValue = undefined;
960
+ this._guestOrExternalUserTypes = value.guestOrExternalUserTypes;
961
+ this._externalTenants.internalValue = value.externalTenants;
962
+ }
963
+ }
964
+ get guestOrExternalUserTypes() {
965
+ return this.getListAttribute('guest_or_external_user_types');
966
+ }
967
+ set guestOrExternalUserTypes(value) {
968
+ this._guestOrExternalUserTypes = value;
969
+ }
970
+ // Temporarily expose input value. Use with caution.
971
+ get guestOrExternalUserTypesInput() {
972
+ return this._guestOrExternalUserTypes;
973
+ }
974
+ get externalTenants() {
975
+ return this._externalTenants;
976
+ }
977
+ putExternalTenants(value) {
978
+ this._externalTenants.internalValue = value;
979
+ }
980
+ resetExternalTenants() {
981
+ this._externalTenants.internalValue = undefined;
982
+ }
983
+ // Temporarily expose input value. Use with caution.
984
+ get externalTenantsInput() {
985
+ return this._externalTenants.internalValue;
986
+ }
987
+ }
988
+ exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference;
989
+ _k = JSII_RTTI_SYMBOL_1;
990
+ ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference[_k] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference", version: "15.0.0" };
991
+ class ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList extends cdktn.ComplexList {
992
+ /**
993
+ * @param terraformResource The parent resource
994
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
995
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
996
+ */
997
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
998
+ super(terraformResource, terraformAttribute, wrapsSet);
999
+ this.terraformResource = terraformResource;
1000
+ this.terraformAttribute = terraformAttribute;
1001
+ this.wrapsSet = wrapsSet;
1002
+ }
1003
+ /**
1004
+ * @param index the index of the item to return
1005
+ */
1006
+ get(index) {
1007
+ return new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1008
+ }
1009
+ }
1010
+ exports.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList = ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList;
1011
+ _l = JSII_RTTI_SYMBOL_1;
1012
+ ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList[_l] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList", version: "15.0.0" };
1013
+ function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform(struct) {
1014
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1015
+ return struct;
1016
+ }
1017
+ if (cdktn.isComplexElement(struct)) {
1018
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1019
+ }
1020
+ return {
1021
+ members: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.members),
1022
+ membership_kind: cdktn.stringToTerraform(struct.membershipKind),
1023
+ };
1024
+ }
1025
+ function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform(struct) {
1026
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1027
+ return struct;
1028
+ }
1029
+ if (cdktn.isComplexElement(struct)) {
1030
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1031
+ }
1032
+ const attrs = {
1033
+ members: {
1034
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.members),
1035
+ isBlock: false,
1036
+ type: "list",
1037
+ storageClassType: "stringList",
1038
+ },
1039
+ membership_kind: {
1040
+ value: cdktn.stringToHclTerraform(struct.membershipKind),
1041
+ isBlock: false,
1042
+ type: "simple",
1043
+ storageClassType: "string",
1044
+ },
1045
+ };
1046
+ // remove undefined attributes
1047
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1048
+ }
1049
+ class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference extends cdktn.ComplexObject {
1050
+ /**
1051
+ * @param terraformResource The parent resource
1052
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1053
+ * @param complexObjectIndex the index of this item in the list
1054
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1055
+ */
1056
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
1057
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
1058
+ this.isEmptyObject = false;
1059
+ }
1060
+ get internalValue() {
1061
+ if (this.resolvableValue) {
1062
+ return this.resolvableValue;
1063
+ }
1064
+ let hasAnyValues = this.isEmptyObject;
1065
+ const internalValueResult = {};
1066
+ if (this._members !== undefined) {
1067
+ hasAnyValues = true;
1068
+ internalValueResult.members = this._members;
1069
+ }
1070
+ if (this._membershipKind !== undefined) {
1071
+ hasAnyValues = true;
1072
+ internalValueResult.membershipKind = this._membershipKind;
1073
+ }
1074
+ return hasAnyValues ? internalValueResult : undefined;
1075
+ }
1076
+ set internalValue(value) {
1077
+ if (value === undefined) {
1078
+ this.isEmptyObject = false;
1079
+ this.resolvableValue = undefined;
1080
+ this._members = undefined;
1081
+ this._membershipKind = undefined;
1082
+ }
1083
+ else if (cdktn.Tokenization.isResolvable(value)) {
1084
+ this.isEmptyObject = false;
1085
+ this.resolvableValue = value;
1086
+ }
1087
+ else {
1088
+ this.isEmptyObject = Object.keys(value).length === 0;
1089
+ this.resolvableValue = undefined;
1090
+ this._members = value.members;
1091
+ this._membershipKind = value.membershipKind;
1092
+ }
1093
+ }
1094
+ get members() {
1095
+ return this.getListAttribute('members');
1096
+ }
1097
+ set members(value) {
1098
+ this._members = value;
1099
+ }
1100
+ resetMembers() {
1101
+ this._members = undefined;
1102
+ }
1103
+ // Temporarily expose input value. Use with caution.
1104
+ get membersInput() {
1105
+ return this._members;
1106
+ }
1107
+ get membershipKind() {
1108
+ return this.getStringAttribute('membership_kind');
1109
+ }
1110
+ set membershipKind(value) {
1111
+ this._membershipKind = value;
1112
+ }
1113
+ // Temporarily expose input value. Use with caution.
1114
+ get membershipKindInput() {
1115
+ return this._membershipKind;
1116
+ }
1117
+ }
1118
+ exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference;
1119
+ _m = JSII_RTTI_SYMBOL_1;
1120
+ ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference[_m] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference", version: "15.0.0" };
1121
+ class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList extends cdktn.ComplexList {
1122
+ /**
1123
+ * @param terraformResource The parent resource
1124
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1125
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1126
+ */
1127
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
1128
+ super(terraformResource, terraformAttribute, wrapsSet);
1129
+ this.terraformResource = terraformResource;
1130
+ this.terraformAttribute = terraformAttribute;
1131
+ this.wrapsSet = wrapsSet;
1132
+ }
1133
+ /**
1134
+ * @param index the index of the item to return
1135
+ */
1136
+ get(index) {
1137
+ return new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1138
+ }
1139
+ }
1140
+ exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList;
1141
+ _o = JSII_RTTI_SYMBOL_1;
1142
+ ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList[_o] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList", version: "15.0.0" };
1143
+ function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform(struct) {
1144
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1145
+ return struct;
1146
+ }
1147
+ if (cdktn.isComplexElement(struct)) {
1148
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1149
+ }
1150
+ return {
1151
+ guest_or_external_user_types: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.guestOrExternalUserTypes),
1152
+ external_tenants: cdktn.listMapper(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToTerraform, true)(struct.externalTenants),
1153
+ };
1154
+ }
1155
+ function conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform(struct) {
1156
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1157
+ return struct;
1158
+ }
1159
+ if (cdktn.isComplexElement(struct)) {
1160
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1161
+ }
1162
+ const attrs = {
1163
+ guest_or_external_user_types: {
1164
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.guestOrExternalUserTypes),
1165
+ isBlock: false,
1166
+ type: "list",
1167
+ storageClassType: "stringList",
1168
+ },
1169
+ external_tenants: {
1170
+ value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsToHclTerraform, true)(struct.externalTenants),
1171
+ isBlock: true,
1172
+ type: "list",
1173
+ storageClassType: "ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList",
1174
+ },
1175
+ };
1176
+ // remove undefined attributes
1177
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1178
+ }
1179
+ class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference extends cdktn.ComplexObject {
1180
+ /**
1181
+ * @param terraformResource The parent resource
1182
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1183
+ * @param complexObjectIndex the index of this item in the list
1184
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1185
+ */
1186
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
1187
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
1188
+ this.isEmptyObject = false;
1189
+ // external_tenants - computed: false, optional: true, required: false
1190
+ this._externalTenants = new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersExternalTenantsList(this, "external_tenants", false);
1191
+ }
1192
+ get internalValue() {
1193
+ if (this.resolvableValue) {
1194
+ return this.resolvableValue;
1195
+ }
1196
+ let hasAnyValues = this.isEmptyObject;
1197
+ const internalValueResult = {};
1198
+ if (this._guestOrExternalUserTypes !== undefined) {
1199
+ hasAnyValues = true;
1200
+ internalValueResult.guestOrExternalUserTypes = this._guestOrExternalUserTypes;
1201
+ }
1202
+ if (this._externalTenants?.internalValue !== undefined) {
1203
+ hasAnyValues = true;
1204
+ internalValueResult.externalTenants = this._externalTenants?.internalValue;
1205
+ }
1206
+ return hasAnyValues ? internalValueResult : undefined;
1207
+ }
1208
+ set internalValue(value) {
1209
+ if (value === undefined) {
1210
+ this.isEmptyObject = false;
1211
+ this.resolvableValue = undefined;
1212
+ this._guestOrExternalUserTypes = undefined;
1213
+ this._externalTenants.internalValue = undefined;
1214
+ }
1215
+ else if (cdktn.Tokenization.isResolvable(value)) {
1216
+ this.isEmptyObject = false;
1217
+ this.resolvableValue = value;
1218
+ }
1219
+ else {
1220
+ this.isEmptyObject = Object.keys(value).length === 0;
1221
+ this.resolvableValue = undefined;
1222
+ this._guestOrExternalUserTypes = value.guestOrExternalUserTypes;
1223
+ this._externalTenants.internalValue = value.externalTenants;
1224
+ }
1225
+ }
1226
+ get guestOrExternalUserTypes() {
1227
+ return this.getListAttribute('guest_or_external_user_types');
1228
+ }
1229
+ set guestOrExternalUserTypes(value) {
1230
+ this._guestOrExternalUserTypes = value;
1231
+ }
1232
+ // Temporarily expose input value. Use with caution.
1233
+ get guestOrExternalUserTypesInput() {
1234
+ return this._guestOrExternalUserTypes;
1235
+ }
1236
+ get externalTenants() {
1237
+ return this._externalTenants;
1238
+ }
1239
+ putExternalTenants(value) {
1240
+ this._externalTenants.internalValue = value;
1241
+ }
1242
+ resetExternalTenants() {
1243
+ this._externalTenants.internalValue = undefined;
1244
+ }
1245
+ // Temporarily expose input value. Use with caution.
1246
+ get externalTenantsInput() {
1247
+ return this._externalTenants.internalValue;
1248
+ }
1249
+ }
1250
+ exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference;
1251
+ _p = JSII_RTTI_SYMBOL_1;
1252
+ ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference[_p] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference", version: "15.0.0" };
1253
+ class ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList extends cdktn.ComplexList {
1254
+ /**
1255
+ * @param terraformResource The parent resource
1256
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1257
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1258
+ */
1259
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
1260
+ super(terraformResource, terraformAttribute, wrapsSet);
1261
+ this.terraformResource = terraformResource;
1262
+ this.terraformAttribute = terraformAttribute;
1263
+ this.wrapsSet = wrapsSet;
1264
+ }
1265
+ /**
1266
+ * @param index the index of the item to return
1267
+ */
1268
+ get(index) {
1269
+ return new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1270
+ }
1271
+ }
1272
+ exports.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList = ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList;
1273
+ _q = JSII_RTTI_SYMBOL_1;
1274
+ ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList[_q] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList", version: "15.0.0" };
1275
+ function conditionalAccessPolicyConditionsUsersToTerraform(struct) {
1276
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1277
+ return struct;
1278
+ }
1279
+ if (cdktn.isComplexElement(struct)) {
1280
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1281
+ }
1282
+ return {
1283
+ excluded_groups: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedGroups),
1284
+ excluded_roles: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedRoles),
1285
+ excluded_users: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.excludedUsers),
1286
+ included_groups: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedGroups),
1287
+ included_roles: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedRoles),
1288
+ included_users: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.includedUsers),
1289
+ excluded_guests_or_external_users: cdktn.listMapper(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToTerraform, true)(struct.excludedGuestsOrExternalUsers),
1290
+ included_guests_or_external_users: cdktn.listMapper(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToTerraform, true)(struct.includedGuestsOrExternalUsers),
1291
+ };
1292
+ }
1293
+ function conditionalAccessPolicyConditionsUsersToHclTerraform(struct) {
1294
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1295
+ return struct;
1296
+ }
1297
+ if (cdktn.isComplexElement(struct)) {
1298
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1299
+ }
1300
+ const attrs = {
1301
+ excluded_groups: {
1302
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedGroups),
1303
+ isBlock: false,
1304
+ type: "list",
1305
+ storageClassType: "stringList",
1306
+ },
1307
+ excluded_roles: {
1308
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedRoles),
1309
+ isBlock: false,
1310
+ type: "list",
1311
+ storageClassType: "stringList",
1312
+ },
1313
+ excluded_users: {
1314
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.excludedUsers),
1315
+ isBlock: false,
1316
+ type: "list",
1317
+ storageClassType: "stringList",
1318
+ },
1319
+ included_groups: {
1320
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedGroups),
1321
+ isBlock: false,
1322
+ type: "list",
1323
+ storageClassType: "stringList",
1324
+ },
1325
+ included_roles: {
1326
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedRoles),
1327
+ isBlock: false,
1328
+ type: "list",
1329
+ storageClassType: "stringList",
1330
+ },
1331
+ included_users: {
1332
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.includedUsers),
1333
+ isBlock: false,
1334
+ type: "list",
1335
+ storageClassType: "stringList",
1336
+ },
1337
+ excluded_guests_or_external_users: {
1338
+ value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersToHclTerraform, true)(struct.excludedGuestsOrExternalUsers),
1339
+ isBlock: true,
1340
+ type: "list",
1341
+ storageClassType: "ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList",
1342
+ },
1343
+ included_guests_or_external_users: {
1344
+ value: cdktn.listMapperHcl(conditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersToHclTerraform, true)(struct.includedGuestsOrExternalUsers),
1345
+ isBlock: true,
1346
+ type: "list",
1347
+ storageClassType: "ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList",
1348
+ },
1349
+ };
1350
+ // remove undefined attributes
1351
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1352
+ }
1353
+ class ConditionalAccessPolicyConditionsUsersOutputReference extends cdktn.ComplexObject {
1354
+ /**
1355
+ * @param terraformResource The parent resource
1356
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1357
+ */
1358
+ constructor(terraformResource, terraformAttribute) {
1359
+ super(terraformResource, terraformAttribute, false, 0);
1360
+ this.isEmptyObject = false;
1361
+ // excluded_guests_or_external_users - computed: false, optional: true, required: false
1362
+ this._excludedGuestsOrExternalUsers = new ConditionalAccessPolicyConditionsUsersExcludedGuestsOrExternalUsersList(this, "excluded_guests_or_external_users", false);
1363
+ // included_guests_or_external_users - computed: false, optional: true, required: false
1364
+ this._includedGuestsOrExternalUsers = new ConditionalAccessPolicyConditionsUsersIncludedGuestsOrExternalUsersList(this, "included_guests_or_external_users", false);
1365
+ }
1366
+ get internalValue() {
1367
+ let hasAnyValues = this.isEmptyObject;
1368
+ const internalValueResult = {};
1369
+ if (this._excludedGroups !== undefined) {
1370
+ hasAnyValues = true;
1371
+ internalValueResult.excludedGroups = this._excludedGroups;
1372
+ }
1373
+ if (this._excludedRoles !== undefined) {
1374
+ hasAnyValues = true;
1375
+ internalValueResult.excludedRoles = this._excludedRoles;
1376
+ }
1377
+ if (this._excludedUsers !== undefined) {
1378
+ hasAnyValues = true;
1379
+ internalValueResult.excludedUsers = this._excludedUsers;
1380
+ }
1381
+ if (this._includedGroups !== undefined) {
1382
+ hasAnyValues = true;
1383
+ internalValueResult.includedGroups = this._includedGroups;
1384
+ }
1385
+ if (this._includedRoles !== undefined) {
1386
+ hasAnyValues = true;
1387
+ internalValueResult.includedRoles = this._includedRoles;
1388
+ }
1389
+ if (this._includedUsers !== undefined) {
1390
+ hasAnyValues = true;
1391
+ internalValueResult.includedUsers = this._includedUsers;
1392
+ }
1393
+ if (this._excludedGuestsOrExternalUsers?.internalValue !== undefined) {
1394
+ hasAnyValues = true;
1395
+ internalValueResult.excludedGuestsOrExternalUsers = this._excludedGuestsOrExternalUsers?.internalValue;
1396
+ }
1397
+ if (this._includedGuestsOrExternalUsers?.internalValue !== undefined) {
1398
+ hasAnyValues = true;
1399
+ internalValueResult.includedGuestsOrExternalUsers = this._includedGuestsOrExternalUsers?.internalValue;
1400
+ }
1401
+ return hasAnyValues ? internalValueResult : undefined;
1402
+ }
1403
+ set internalValue(value) {
1404
+ if (value === undefined) {
1405
+ this.isEmptyObject = false;
1406
+ this._excludedGroups = undefined;
1407
+ this._excludedRoles = undefined;
1408
+ this._excludedUsers = undefined;
1409
+ this._includedGroups = undefined;
1410
+ this._includedRoles = undefined;
1411
+ this._includedUsers = undefined;
1412
+ this._excludedGuestsOrExternalUsers.internalValue = undefined;
1413
+ this._includedGuestsOrExternalUsers.internalValue = undefined;
1414
+ }
1415
+ else {
1416
+ this.isEmptyObject = Object.keys(value).length === 0;
1417
+ this._excludedGroups = value.excludedGroups;
1418
+ this._excludedRoles = value.excludedRoles;
1419
+ this._excludedUsers = value.excludedUsers;
1420
+ this._includedGroups = value.includedGroups;
1421
+ this._includedRoles = value.includedRoles;
1422
+ this._includedUsers = value.includedUsers;
1423
+ this._excludedGuestsOrExternalUsers.internalValue = value.excludedGuestsOrExternalUsers;
1424
+ this._includedGuestsOrExternalUsers.internalValue = value.includedGuestsOrExternalUsers;
1425
+ }
1426
+ }
1427
+ get excludedGroups() {
1428
+ return this.getListAttribute('excluded_groups');
1429
+ }
1430
+ set excludedGroups(value) {
1431
+ this._excludedGroups = value;
1432
+ }
1433
+ resetExcludedGroups() {
1434
+ this._excludedGroups = undefined;
1435
+ }
1436
+ // Temporarily expose input value. Use with caution.
1437
+ get excludedGroupsInput() {
1438
+ return this._excludedGroups;
1439
+ }
1440
+ get excludedRoles() {
1441
+ return this.getListAttribute('excluded_roles');
1442
+ }
1443
+ set excludedRoles(value) {
1444
+ this._excludedRoles = value;
1445
+ }
1446
+ resetExcludedRoles() {
1447
+ this._excludedRoles = undefined;
1448
+ }
1449
+ // Temporarily expose input value. Use with caution.
1450
+ get excludedRolesInput() {
1451
+ return this._excludedRoles;
1452
+ }
1453
+ get excludedUsers() {
1454
+ return this.getListAttribute('excluded_users');
1455
+ }
1456
+ set excludedUsers(value) {
1457
+ this._excludedUsers = value;
1458
+ }
1459
+ resetExcludedUsers() {
1460
+ this._excludedUsers = undefined;
1461
+ }
1462
+ // Temporarily expose input value. Use with caution.
1463
+ get excludedUsersInput() {
1464
+ return this._excludedUsers;
1465
+ }
1466
+ get includedGroups() {
1467
+ return this.getListAttribute('included_groups');
1468
+ }
1469
+ set includedGroups(value) {
1470
+ this._includedGroups = value;
1471
+ }
1472
+ resetIncludedGroups() {
1473
+ this._includedGroups = undefined;
1474
+ }
1475
+ // Temporarily expose input value. Use with caution.
1476
+ get includedGroupsInput() {
1477
+ return this._includedGroups;
1478
+ }
1479
+ get includedRoles() {
1480
+ return this.getListAttribute('included_roles');
1481
+ }
1482
+ set includedRoles(value) {
1483
+ this._includedRoles = value;
1484
+ }
1485
+ resetIncludedRoles() {
1486
+ this._includedRoles = undefined;
1487
+ }
1488
+ // Temporarily expose input value. Use with caution.
1489
+ get includedRolesInput() {
1490
+ return this._includedRoles;
1491
+ }
1492
+ get includedUsers() {
1493
+ return this.getListAttribute('included_users');
1494
+ }
1495
+ set includedUsers(value) {
1496
+ this._includedUsers = value;
1497
+ }
1498
+ resetIncludedUsers() {
1499
+ this._includedUsers = undefined;
1500
+ }
1501
+ // Temporarily expose input value. Use with caution.
1502
+ get includedUsersInput() {
1503
+ return this._includedUsers;
1504
+ }
1505
+ get excludedGuestsOrExternalUsers() {
1506
+ return this._excludedGuestsOrExternalUsers;
1507
+ }
1508
+ putExcludedGuestsOrExternalUsers(value) {
1509
+ this._excludedGuestsOrExternalUsers.internalValue = value;
1510
+ }
1511
+ resetExcludedGuestsOrExternalUsers() {
1512
+ this._excludedGuestsOrExternalUsers.internalValue = undefined;
1513
+ }
1514
+ // Temporarily expose input value. Use with caution.
1515
+ get excludedGuestsOrExternalUsersInput() {
1516
+ return this._excludedGuestsOrExternalUsers.internalValue;
1517
+ }
1518
+ get includedGuestsOrExternalUsers() {
1519
+ return this._includedGuestsOrExternalUsers;
1520
+ }
1521
+ putIncludedGuestsOrExternalUsers(value) {
1522
+ this._includedGuestsOrExternalUsers.internalValue = value;
1523
+ }
1524
+ resetIncludedGuestsOrExternalUsers() {
1525
+ this._includedGuestsOrExternalUsers.internalValue = undefined;
1526
+ }
1527
+ // Temporarily expose input value. Use with caution.
1528
+ get includedGuestsOrExternalUsersInput() {
1529
+ return this._includedGuestsOrExternalUsers.internalValue;
1530
+ }
1531
+ }
1532
+ exports.ConditionalAccessPolicyConditionsUsersOutputReference = ConditionalAccessPolicyConditionsUsersOutputReference;
1533
+ _r = JSII_RTTI_SYMBOL_1;
1534
+ ConditionalAccessPolicyConditionsUsersOutputReference[_r] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsUsersOutputReference", version: "15.0.0" };
1535
+ function conditionalAccessPolicyConditionsToTerraform(struct) {
1536
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1537
+ return struct;
1538
+ }
1539
+ if (cdktn.isComplexElement(struct)) {
1540
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1541
+ }
1542
+ return {
1543
+ authentication_flow_transfer_methods: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.authenticationFlowTransferMethods),
1544
+ client_app_types: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.clientAppTypes),
1545
+ insider_risk_levels: cdktn.stringToTerraform(struct.insiderRiskLevels),
1546
+ service_principal_risk_levels: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.servicePrincipalRiskLevels),
1547
+ sign_in_risk_levels: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.signInRiskLevels),
1548
+ user_risk_levels: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.userRiskLevels),
1549
+ applications: conditionalAccessPolicyConditionsApplicationsToTerraform(struct.applications),
1550
+ client_applications: conditionalAccessPolicyConditionsClientApplicationsToTerraform(struct.clientApplications),
1551
+ devices: conditionalAccessPolicyConditionsDevicesToTerraform(struct.devices),
1552
+ locations: conditionalAccessPolicyConditionsLocationsToTerraform(struct.locations),
1553
+ platforms: conditionalAccessPolicyConditionsPlatformsToTerraform(struct.platforms),
1554
+ users: conditionalAccessPolicyConditionsUsersToTerraform(struct.users),
1555
+ };
1556
+ }
1557
+ function conditionalAccessPolicyConditionsToHclTerraform(struct) {
1558
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1559
+ return struct;
1560
+ }
1561
+ if (cdktn.isComplexElement(struct)) {
1562
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1563
+ }
1564
+ const attrs = {
1565
+ authentication_flow_transfer_methods: {
1566
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.authenticationFlowTransferMethods),
1567
+ isBlock: false,
1568
+ type: "set",
1569
+ storageClassType: "stringList",
1570
+ },
1571
+ client_app_types: {
1572
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.clientAppTypes),
1573
+ isBlock: false,
1574
+ type: "list",
1575
+ storageClassType: "stringList",
1576
+ },
1577
+ insider_risk_levels: {
1578
+ value: cdktn.stringToHclTerraform(struct.insiderRiskLevels),
1579
+ isBlock: false,
1580
+ type: "simple",
1581
+ storageClassType: "string",
1582
+ },
1583
+ service_principal_risk_levels: {
1584
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.servicePrincipalRiskLevels),
1585
+ isBlock: false,
1586
+ type: "list",
1587
+ storageClassType: "stringList",
1588
+ },
1589
+ sign_in_risk_levels: {
1590
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.signInRiskLevels),
1591
+ isBlock: false,
1592
+ type: "list",
1593
+ storageClassType: "stringList",
1594
+ },
1595
+ user_risk_levels: {
1596
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.userRiskLevels),
1597
+ isBlock: false,
1598
+ type: "list",
1599
+ storageClassType: "stringList",
1600
+ },
1601
+ applications: {
1602
+ value: conditionalAccessPolicyConditionsApplicationsToHclTerraform(struct.applications),
1603
+ isBlock: true,
1604
+ type: "list",
1605
+ storageClassType: "ConditionalAccessPolicyConditionsApplicationsList",
1606
+ },
1607
+ client_applications: {
1608
+ value: conditionalAccessPolicyConditionsClientApplicationsToHclTerraform(struct.clientApplications),
1609
+ isBlock: true,
1610
+ type: "list",
1611
+ storageClassType: "ConditionalAccessPolicyConditionsClientApplicationsList",
1612
+ },
1613
+ devices: {
1614
+ value: conditionalAccessPolicyConditionsDevicesToHclTerraform(struct.devices),
1615
+ isBlock: true,
1616
+ type: "list",
1617
+ storageClassType: "ConditionalAccessPolicyConditionsDevicesList",
1618
+ },
1619
+ locations: {
1620
+ value: conditionalAccessPolicyConditionsLocationsToHclTerraform(struct.locations),
1621
+ isBlock: true,
1622
+ type: "list",
1623
+ storageClassType: "ConditionalAccessPolicyConditionsLocationsList",
1624
+ },
1625
+ platforms: {
1626
+ value: conditionalAccessPolicyConditionsPlatformsToHclTerraform(struct.platforms),
1627
+ isBlock: true,
1628
+ type: "list",
1629
+ storageClassType: "ConditionalAccessPolicyConditionsPlatformsList",
1630
+ },
1631
+ users: {
1632
+ value: conditionalAccessPolicyConditionsUsersToHclTerraform(struct.users),
1633
+ isBlock: true,
1634
+ type: "list",
1635
+ storageClassType: "ConditionalAccessPolicyConditionsUsersList",
1636
+ },
1637
+ };
1638
+ // remove undefined attributes
1639
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1640
+ }
1641
+ class ConditionalAccessPolicyConditionsOutputReference extends cdktn.ComplexObject {
1642
+ /**
1643
+ * @param terraformResource The parent resource
1644
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1645
+ */
1646
+ constructor(terraformResource, terraformAttribute) {
1647
+ super(terraformResource, terraformAttribute, false, 0);
1648
+ this.isEmptyObject = false;
1649
+ // applications - computed: false, optional: false, required: true
1650
+ this._applications = new ConditionalAccessPolicyConditionsApplicationsOutputReference(this, "applications");
1651
+ // client_applications - computed: false, optional: true, required: false
1652
+ this._clientApplications = new ConditionalAccessPolicyConditionsClientApplicationsOutputReference(this, "client_applications");
1653
+ // devices - computed: false, optional: true, required: false
1654
+ this._devices = new ConditionalAccessPolicyConditionsDevicesOutputReference(this, "devices");
1655
+ // locations - computed: false, optional: true, required: false
1656
+ this._locations = new ConditionalAccessPolicyConditionsLocationsOutputReference(this, "locations");
1657
+ // platforms - computed: false, optional: true, required: false
1658
+ this._platforms = new ConditionalAccessPolicyConditionsPlatformsOutputReference(this, "platforms");
1659
+ // users - computed: false, optional: false, required: true
1660
+ this._users = new ConditionalAccessPolicyConditionsUsersOutputReference(this, "users");
1661
+ }
1662
+ get internalValue() {
1663
+ let hasAnyValues = this.isEmptyObject;
1664
+ const internalValueResult = {};
1665
+ if (this._authenticationFlowTransferMethods !== undefined) {
1666
+ hasAnyValues = true;
1667
+ internalValueResult.authenticationFlowTransferMethods = this._authenticationFlowTransferMethods;
1668
+ }
1669
+ if (this._clientAppTypes !== undefined) {
1670
+ hasAnyValues = true;
1671
+ internalValueResult.clientAppTypes = this._clientAppTypes;
1672
+ }
1673
+ if (this._insiderRiskLevels !== undefined) {
1674
+ hasAnyValues = true;
1675
+ internalValueResult.insiderRiskLevels = this._insiderRiskLevels;
1676
+ }
1677
+ if (this._servicePrincipalRiskLevels !== undefined) {
1678
+ hasAnyValues = true;
1679
+ internalValueResult.servicePrincipalRiskLevels = this._servicePrincipalRiskLevels;
1680
+ }
1681
+ if (this._signInRiskLevels !== undefined) {
1682
+ hasAnyValues = true;
1683
+ internalValueResult.signInRiskLevels = this._signInRiskLevels;
1684
+ }
1685
+ if (this._userRiskLevels !== undefined) {
1686
+ hasAnyValues = true;
1687
+ internalValueResult.userRiskLevels = this._userRiskLevels;
1688
+ }
1689
+ if (this._applications?.internalValue !== undefined) {
1690
+ hasAnyValues = true;
1691
+ internalValueResult.applications = this._applications?.internalValue;
1692
+ }
1693
+ if (this._clientApplications?.internalValue !== undefined) {
1694
+ hasAnyValues = true;
1695
+ internalValueResult.clientApplications = this._clientApplications?.internalValue;
1696
+ }
1697
+ if (this._devices?.internalValue !== undefined) {
1698
+ hasAnyValues = true;
1699
+ internalValueResult.devices = this._devices?.internalValue;
1700
+ }
1701
+ if (this._locations?.internalValue !== undefined) {
1702
+ hasAnyValues = true;
1703
+ internalValueResult.locations = this._locations?.internalValue;
1704
+ }
1705
+ if (this._platforms?.internalValue !== undefined) {
1706
+ hasAnyValues = true;
1707
+ internalValueResult.platforms = this._platforms?.internalValue;
1708
+ }
1709
+ if (this._users?.internalValue !== undefined) {
1710
+ hasAnyValues = true;
1711
+ internalValueResult.users = this._users?.internalValue;
1712
+ }
1713
+ return hasAnyValues ? internalValueResult : undefined;
1714
+ }
1715
+ set internalValue(value) {
1716
+ if (value === undefined) {
1717
+ this.isEmptyObject = false;
1718
+ this._authenticationFlowTransferMethods = undefined;
1719
+ this._clientAppTypes = undefined;
1720
+ this._insiderRiskLevels = undefined;
1721
+ this._servicePrincipalRiskLevels = undefined;
1722
+ this._signInRiskLevels = undefined;
1723
+ this._userRiskLevels = undefined;
1724
+ this._applications.internalValue = undefined;
1725
+ this._clientApplications.internalValue = undefined;
1726
+ this._devices.internalValue = undefined;
1727
+ this._locations.internalValue = undefined;
1728
+ this._platforms.internalValue = undefined;
1729
+ this._users.internalValue = undefined;
1730
+ }
1731
+ else {
1732
+ this.isEmptyObject = Object.keys(value).length === 0;
1733
+ this._authenticationFlowTransferMethods = value.authenticationFlowTransferMethods;
1734
+ this._clientAppTypes = value.clientAppTypes;
1735
+ this._insiderRiskLevels = value.insiderRiskLevels;
1736
+ this._servicePrincipalRiskLevels = value.servicePrincipalRiskLevels;
1737
+ this._signInRiskLevels = value.signInRiskLevels;
1738
+ this._userRiskLevels = value.userRiskLevels;
1739
+ this._applications.internalValue = value.applications;
1740
+ this._clientApplications.internalValue = value.clientApplications;
1741
+ this._devices.internalValue = value.devices;
1742
+ this._locations.internalValue = value.locations;
1743
+ this._platforms.internalValue = value.platforms;
1744
+ this._users.internalValue = value.users;
1745
+ }
1746
+ }
1747
+ get authenticationFlowTransferMethods() {
1748
+ return cdktn.Fn.tolist(this.getListAttribute('authentication_flow_transfer_methods'));
1749
+ }
1750
+ set authenticationFlowTransferMethods(value) {
1751
+ this._authenticationFlowTransferMethods = value;
1752
+ }
1753
+ resetAuthenticationFlowTransferMethods() {
1754
+ this._authenticationFlowTransferMethods = undefined;
1755
+ }
1756
+ // Temporarily expose input value. Use with caution.
1757
+ get authenticationFlowTransferMethodsInput() {
1758
+ return this._authenticationFlowTransferMethods;
1759
+ }
1760
+ get clientAppTypes() {
1761
+ return this.getListAttribute('client_app_types');
1762
+ }
1763
+ set clientAppTypes(value) {
1764
+ this._clientAppTypes = value;
1765
+ }
1766
+ // Temporarily expose input value. Use with caution.
1767
+ get clientAppTypesInput() {
1768
+ return this._clientAppTypes;
1769
+ }
1770
+ get insiderRiskLevels() {
1771
+ return this.getStringAttribute('insider_risk_levels');
1772
+ }
1773
+ set insiderRiskLevels(value) {
1774
+ this._insiderRiskLevels = value;
1775
+ }
1776
+ resetInsiderRiskLevels() {
1777
+ this._insiderRiskLevels = undefined;
1778
+ }
1779
+ // Temporarily expose input value. Use with caution.
1780
+ get insiderRiskLevelsInput() {
1781
+ return this._insiderRiskLevels;
1782
+ }
1783
+ get servicePrincipalRiskLevels() {
1784
+ return this.getListAttribute('service_principal_risk_levels');
1785
+ }
1786
+ set servicePrincipalRiskLevels(value) {
1787
+ this._servicePrincipalRiskLevels = value;
1788
+ }
1789
+ resetServicePrincipalRiskLevels() {
1790
+ this._servicePrincipalRiskLevels = undefined;
1791
+ }
1792
+ // Temporarily expose input value. Use with caution.
1793
+ get servicePrincipalRiskLevelsInput() {
1794
+ return this._servicePrincipalRiskLevels;
1795
+ }
1796
+ get signInRiskLevels() {
1797
+ return this.getListAttribute('sign_in_risk_levels');
1798
+ }
1799
+ set signInRiskLevels(value) {
1800
+ this._signInRiskLevels = value;
1801
+ }
1802
+ resetSignInRiskLevels() {
1803
+ this._signInRiskLevels = undefined;
1804
+ }
1805
+ // Temporarily expose input value. Use with caution.
1806
+ get signInRiskLevelsInput() {
1807
+ return this._signInRiskLevels;
1808
+ }
1809
+ get userRiskLevels() {
1810
+ return this.getListAttribute('user_risk_levels');
1811
+ }
1812
+ set userRiskLevels(value) {
1813
+ this._userRiskLevels = value;
1814
+ }
1815
+ resetUserRiskLevels() {
1816
+ this._userRiskLevels = undefined;
1817
+ }
1818
+ // Temporarily expose input value. Use with caution.
1819
+ get userRiskLevelsInput() {
1820
+ return this._userRiskLevels;
1821
+ }
1822
+ get applications() {
1823
+ return this._applications;
1824
+ }
1825
+ putApplications(value) {
1826
+ this._applications.internalValue = value;
1827
+ }
1828
+ // Temporarily expose input value. Use with caution.
1829
+ get applicationsInput() {
1830
+ return this._applications.internalValue;
1831
+ }
1832
+ get clientApplications() {
1833
+ return this._clientApplications;
1834
+ }
1835
+ putClientApplications(value) {
1836
+ this._clientApplications.internalValue = value;
1837
+ }
1838
+ resetClientApplications() {
1839
+ this._clientApplications.internalValue = undefined;
1840
+ }
1841
+ // Temporarily expose input value. Use with caution.
1842
+ get clientApplicationsInput() {
1843
+ return this._clientApplications.internalValue;
1844
+ }
1845
+ get devices() {
1846
+ return this._devices;
1847
+ }
1848
+ putDevices(value) {
1849
+ this._devices.internalValue = value;
1850
+ }
1851
+ resetDevices() {
1852
+ this._devices.internalValue = undefined;
1853
+ }
1854
+ // Temporarily expose input value. Use with caution.
1855
+ get devicesInput() {
1856
+ return this._devices.internalValue;
1857
+ }
1858
+ get locations() {
1859
+ return this._locations;
1860
+ }
1861
+ putLocations(value) {
1862
+ this._locations.internalValue = value;
1863
+ }
1864
+ resetLocations() {
1865
+ this._locations.internalValue = undefined;
1866
+ }
1867
+ // Temporarily expose input value. Use with caution.
1868
+ get locationsInput() {
1869
+ return this._locations.internalValue;
1870
+ }
1871
+ get platforms() {
1872
+ return this._platforms;
1873
+ }
1874
+ putPlatforms(value) {
1875
+ this._platforms.internalValue = value;
1876
+ }
1877
+ resetPlatforms() {
1878
+ this._platforms.internalValue = undefined;
1879
+ }
1880
+ // Temporarily expose input value. Use with caution.
1881
+ get platformsInput() {
1882
+ return this._platforms.internalValue;
1883
+ }
1884
+ get users() {
1885
+ return this._users;
1886
+ }
1887
+ putUsers(value) {
1888
+ this._users.internalValue = value;
1889
+ }
1890
+ // Temporarily expose input value. Use with caution.
1891
+ get usersInput() {
1892
+ return this._users.internalValue;
1893
+ }
1894
+ }
1895
+ exports.ConditionalAccessPolicyConditionsOutputReference = ConditionalAccessPolicyConditionsOutputReference;
1896
+ _s = JSII_RTTI_SYMBOL_1;
1897
+ ConditionalAccessPolicyConditionsOutputReference[_s] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyConditionsOutputReference", version: "15.0.0" };
1898
+ function conditionalAccessPolicyGrantControlsToTerraform(struct) {
1899
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1900
+ return struct;
1901
+ }
1902
+ if (cdktn.isComplexElement(struct)) {
1903
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1904
+ }
1905
+ return {
1906
+ authentication_strength_policy_id: cdktn.stringToTerraform(struct.authenticationStrengthPolicyId),
1907
+ built_in_controls: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.builtInControls),
1908
+ custom_authentication_factors: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.customAuthenticationFactors),
1909
+ operator: cdktn.stringToTerraform(struct.operator),
1910
+ terms_of_use: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.termsOfUse),
1911
+ };
1912
+ }
1913
+ function conditionalAccessPolicyGrantControlsToHclTerraform(struct) {
1914
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1915
+ return struct;
1916
+ }
1917
+ if (cdktn.isComplexElement(struct)) {
1918
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1919
+ }
1920
+ const attrs = {
1921
+ authentication_strength_policy_id: {
1922
+ value: cdktn.stringToHclTerraform(struct.authenticationStrengthPolicyId),
1923
+ isBlock: false,
1924
+ type: "simple",
1925
+ storageClassType: "string",
1926
+ },
1927
+ built_in_controls: {
1928
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.builtInControls),
1929
+ isBlock: false,
1930
+ type: "list",
1931
+ storageClassType: "stringList",
1932
+ },
1933
+ custom_authentication_factors: {
1934
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.customAuthenticationFactors),
1935
+ isBlock: false,
1936
+ type: "list",
1937
+ storageClassType: "stringList",
1938
+ },
1939
+ operator: {
1940
+ value: cdktn.stringToHclTerraform(struct.operator),
1941
+ isBlock: false,
1942
+ type: "simple",
1943
+ storageClassType: "string",
1944
+ },
1945
+ terms_of_use: {
1946
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.termsOfUse),
1947
+ isBlock: false,
1948
+ type: "list",
1949
+ storageClassType: "stringList",
1950
+ },
1951
+ };
1952
+ // remove undefined attributes
1953
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1954
+ }
1955
+ class ConditionalAccessPolicyGrantControlsOutputReference extends cdktn.ComplexObject {
1956
+ /**
1957
+ * @param terraformResource The parent resource
1958
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1959
+ */
1960
+ constructor(terraformResource, terraformAttribute) {
1961
+ super(terraformResource, terraformAttribute, false, 0);
1962
+ this.isEmptyObject = false;
1963
+ }
1964
+ get internalValue() {
1965
+ let hasAnyValues = this.isEmptyObject;
1966
+ const internalValueResult = {};
1967
+ if (this._authenticationStrengthPolicyId !== undefined) {
1968
+ hasAnyValues = true;
1969
+ internalValueResult.authenticationStrengthPolicyId = this._authenticationStrengthPolicyId;
1970
+ }
1971
+ if (this._builtInControls !== undefined) {
1972
+ hasAnyValues = true;
1973
+ internalValueResult.builtInControls = this._builtInControls;
1974
+ }
1975
+ if (this._customAuthenticationFactors !== undefined) {
1976
+ hasAnyValues = true;
1977
+ internalValueResult.customAuthenticationFactors = this._customAuthenticationFactors;
1978
+ }
1979
+ if (this._operator !== undefined) {
1980
+ hasAnyValues = true;
1981
+ internalValueResult.operator = this._operator;
1982
+ }
1983
+ if (this._termsOfUse !== undefined) {
1984
+ hasAnyValues = true;
1985
+ internalValueResult.termsOfUse = this._termsOfUse;
1986
+ }
1987
+ return hasAnyValues ? internalValueResult : undefined;
1988
+ }
1989
+ set internalValue(value) {
1990
+ if (value === undefined) {
1991
+ this.isEmptyObject = false;
1992
+ this._authenticationStrengthPolicyId = undefined;
1993
+ this._builtInControls = undefined;
1994
+ this._customAuthenticationFactors = undefined;
1995
+ this._operator = undefined;
1996
+ this._termsOfUse = undefined;
1997
+ }
1998
+ else {
1999
+ this.isEmptyObject = Object.keys(value).length === 0;
2000
+ this._authenticationStrengthPolicyId = value.authenticationStrengthPolicyId;
2001
+ this._builtInControls = value.builtInControls;
2002
+ this._customAuthenticationFactors = value.customAuthenticationFactors;
2003
+ this._operator = value.operator;
2004
+ this._termsOfUse = value.termsOfUse;
2005
+ }
2006
+ }
2007
+ get authenticationStrengthPolicyId() {
2008
+ return this.getStringAttribute('authentication_strength_policy_id');
2009
+ }
2010
+ set authenticationStrengthPolicyId(value) {
2011
+ this._authenticationStrengthPolicyId = value;
2012
+ }
2013
+ resetAuthenticationStrengthPolicyId() {
2014
+ this._authenticationStrengthPolicyId = undefined;
2015
+ }
2016
+ // Temporarily expose input value. Use with caution.
2017
+ get authenticationStrengthPolicyIdInput() {
2018
+ return this._authenticationStrengthPolicyId;
2019
+ }
2020
+ get builtInControls() {
2021
+ return this.getListAttribute('built_in_controls');
2022
+ }
2023
+ set builtInControls(value) {
2024
+ this._builtInControls = value;
2025
+ }
2026
+ resetBuiltInControls() {
2027
+ this._builtInControls = undefined;
2028
+ }
2029
+ // Temporarily expose input value. Use with caution.
2030
+ get builtInControlsInput() {
2031
+ return this._builtInControls;
2032
+ }
2033
+ get customAuthenticationFactors() {
2034
+ return this.getListAttribute('custom_authentication_factors');
2035
+ }
2036
+ set customAuthenticationFactors(value) {
2037
+ this._customAuthenticationFactors = value;
2038
+ }
2039
+ resetCustomAuthenticationFactors() {
2040
+ this._customAuthenticationFactors = undefined;
2041
+ }
2042
+ // Temporarily expose input value. Use with caution.
2043
+ get customAuthenticationFactorsInput() {
2044
+ return this._customAuthenticationFactors;
2045
+ }
2046
+ get operator() {
2047
+ return this.getStringAttribute('operator');
2048
+ }
2049
+ set operator(value) {
2050
+ this._operator = value;
2051
+ }
2052
+ // Temporarily expose input value. Use with caution.
2053
+ get operatorInput() {
2054
+ return this._operator;
2055
+ }
2056
+ get termsOfUse() {
2057
+ return this.getListAttribute('terms_of_use');
2058
+ }
2059
+ set termsOfUse(value) {
2060
+ this._termsOfUse = value;
2061
+ }
2062
+ resetTermsOfUse() {
2063
+ this._termsOfUse = undefined;
2064
+ }
2065
+ // Temporarily expose input value. Use with caution.
2066
+ get termsOfUseInput() {
2067
+ return this._termsOfUse;
2068
+ }
2069
+ }
2070
+ exports.ConditionalAccessPolicyGrantControlsOutputReference = ConditionalAccessPolicyGrantControlsOutputReference;
2071
+ _t = JSII_RTTI_SYMBOL_1;
2072
+ ConditionalAccessPolicyGrantControlsOutputReference[_t] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyGrantControlsOutputReference", version: "15.0.0" };
2073
+ function conditionalAccessPolicySessionControlsToTerraform(struct) {
2074
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2075
+ return struct;
2076
+ }
2077
+ if (cdktn.isComplexElement(struct)) {
2078
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2079
+ }
2080
+ return {
2081
+ application_enforced_restrictions_enabled: cdktn.booleanToTerraform(struct.applicationEnforcedRestrictionsEnabled),
2082
+ cloud_app_security_policy: cdktn.stringToTerraform(struct.cloudAppSecurityPolicy),
2083
+ disable_resilience_defaults: cdktn.booleanToTerraform(struct.disableResilienceDefaults),
2084
+ persistent_browser_mode: cdktn.stringToTerraform(struct.persistentBrowserMode),
2085
+ sign_in_frequency: cdktn.numberToTerraform(struct.signInFrequency),
2086
+ sign_in_frequency_authentication_type: cdktn.stringToTerraform(struct.signInFrequencyAuthenticationType),
2087
+ sign_in_frequency_interval: cdktn.stringToTerraform(struct.signInFrequencyInterval),
2088
+ sign_in_frequency_period: cdktn.stringToTerraform(struct.signInFrequencyPeriod),
2089
+ };
2090
+ }
2091
+ function conditionalAccessPolicySessionControlsToHclTerraform(struct) {
2092
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2093
+ return struct;
2094
+ }
2095
+ if (cdktn.isComplexElement(struct)) {
2096
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2097
+ }
2098
+ const attrs = {
2099
+ application_enforced_restrictions_enabled: {
2100
+ value: cdktn.booleanToHclTerraform(struct.applicationEnforcedRestrictionsEnabled),
2101
+ isBlock: false,
2102
+ type: "simple",
2103
+ storageClassType: "boolean",
2104
+ },
2105
+ cloud_app_security_policy: {
2106
+ value: cdktn.stringToHclTerraform(struct.cloudAppSecurityPolicy),
2107
+ isBlock: false,
2108
+ type: "simple",
2109
+ storageClassType: "string",
2110
+ },
2111
+ disable_resilience_defaults: {
2112
+ value: cdktn.booleanToHclTerraform(struct.disableResilienceDefaults),
2113
+ isBlock: false,
2114
+ type: "simple",
2115
+ storageClassType: "boolean",
2116
+ },
2117
+ persistent_browser_mode: {
2118
+ value: cdktn.stringToHclTerraform(struct.persistentBrowserMode),
2119
+ isBlock: false,
2120
+ type: "simple",
2121
+ storageClassType: "string",
2122
+ },
2123
+ sign_in_frequency: {
2124
+ value: cdktn.numberToHclTerraform(struct.signInFrequency),
2125
+ isBlock: false,
2126
+ type: "simple",
2127
+ storageClassType: "number",
2128
+ },
2129
+ sign_in_frequency_authentication_type: {
2130
+ value: cdktn.stringToHclTerraform(struct.signInFrequencyAuthenticationType),
2131
+ isBlock: false,
2132
+ type: "simple",
2133
+ storageClassType: "string",
2134
+ },
2135
+ sign_in_frequency_interval: {
2136
+ value: cdktn.stringToHclTerraform(struct.signInFrequencyInterval),
2137
+ isBlock: false,
2138
+ type: "simple",
2139
+ storageClassType: "string",
2140
+ },
2141
+ sign_in_frequency_period: {
2142
+ value: cdktn.stringToHclTerraform(struct.signInFrequencyPeriod),
2143
+ isBlock: false,
2144
+ type: "simple",
2145
+ storageClassType: "string",
2146
+ },
2147
+ };
2148
+ // remove undefined attributes
2149
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2150
+ }
2151
+ class ConditionalAccessPolicySessionControlsOutputReference extends cdktn.ComplexObject {
2152
+ /**
2153
+ * @param terraformResource The parent resource
2154
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2155
+ */
2156
+ constructor(terraformResource, terraformAttribute) {
2157
+ super(terraformResource, terraformAttribute, false, 0);
2158
+ this.isEmptyObject = false;
2159
+ }
2160
+ get internalValue() {
2161
+ let hasAnyValues = this.isEmptyObject;
2162
+ const internalValueResult = {};
2163
+ if (this._applicationEnforcedRestrictionsEnabled !== undefined) {
2164
+ hasAnyValues = true;
2165
+ internalValueResult.applicationEnforcedRestrictionsEnabled = this._applicationEnforcedRestrictionsEnabled;
2166
+ }
2167
+ if (this._cloudAppSecurityPolicy !== undefined) {
2168
+ hasAnyValues = true;
2169
+ internalValueResult.cloudAppSecurityPolicy = this._cloudAppSecurityPolicy;
2170
+ }
2171
+ if (this._disableResilienceDefaults !== undefined) {
2172
+ hasAnyValues = true;
2173
+ internalValueResult.disableResilienceDefaults = this._disableResilienceDefaults;
2174
+ }
2175
+ if (this._persistentBrowserMode !== undefined) {
2176
+ hasAnyValues = true;
2177
+ internalValueResult.persistentBrowserMode = this._persistentBrowserMode;
2178
+ }
2179
+ if (this._signInFrequency !== undefined) {
2180
+ hasAnyValues = true;
2181
+ internalValueResult.signInFrequency = this._signInFrequency;
2182
+ }
2183
+ if (this._signInFrequencyAuthenticationType !== undefined) {
2184
+ hasAnyValues = true;
2185
+ internalValueResult.signInFrequencyAuthenticationType = this._signInFrequencyAuthenticationType;
2186
+ }
2187
+ if (this._signInFrequencyInterval !== undefined) {
2188
+ hasAnyValues = true;
2189
+ internalValueResult.signInFrequencyInterval = this._signInFrequencyInterval;
2190
+ }
2191
+ if (this._signInFrequencyPeriod !== undefined) {
2192
+ hasAnyValues = true;
2193
+ internalValueResult.signInFrequencyPeriod = this._signInFrequencyPeriod;
2194
+ }
2195
+ return hasAnyValues ? internalValueResult : undefined;
2196
+ }
2197
+ set internalValue(value) {
2198
+ if (value === undefined) {
2199
+ this.isEmptyObject = false;
2200
+ this._applicationEnforcedRestrictionsEnabled = undefined;
2201
+ this._cloudAppSecurityPolicy = undefined;
2202
+ this._disableResilienceDefaults = undefined;
2203
+ this._persistentBrowserMode = undefined;
2204
+ this._signInFrequency = undefined;
2205
+ this._signInFrequencyAuthenticationType = undefined;
2206
+ this._signInFrequencyInterval = undefined;
2207
+ this._signInFrequencyPeriod = undefined;
2208
+ }
2209
+ else {
2210
+ this.isEmptyObject = Object.keys(value).length === 0;
2211
+ this._applicationEnforcedRestrictionsEnabled = value.applicationEnforcedRestrictionsEnabled;
2212
+ this._cloudAppSecurityPolicy = value.cloudAppSecurityPolicy;
2213
+ this._disableResilienceDefaults = value.disableResilienceDefaults;
2214
+ this._persistentBrowserMode = value.persistentBrowserMode;
2215
+ this._signInFrequency = value.signInFrequency;
2216
+ this._signInFrequencyAuthenticationType = value.signInFrequencyAuthenticationType;
2217
+ this._signInFrequencyInterval = value.signInFrequencyInterval;
2218
+ this._signInFrequencyPeriod = value.signInFrequencyPeriod;
2219
+ }
2220
+ }
2221
+ get applicationEnforcedRestrictionsEnabled() {
2222
+ return this.getBooleanAttribute('application_enforced_restrictions_enabled');
2223
+ }
2224
+ set applicationEnforcedRestrictionsEnabled(value) {
2225
+ this._applicationEnforcedRestrictionsEnabled = value;
2226
+ }
2227
+ resetApplicationEnforcedRestrictionsEnabled() {
2228
+ this._applicationEnforcedRestrictionsEnabled = undefined;
2229
+ }
2230
+ // Temporarily expose input value. Use with caution.
2231
+ get applicationEnforcedRestrictionsEnabledInput() {
2232
+ return this._applicationEnforcedRestrictionsEnabled;
2233
+ }
2234
+ get cloudAppSecurityPolicy() {
2235
+ return this.getStringAttribute('cloud_app_security_policy');
2236
+ }
2237
+ set cloudAppSecurityPolicy(value) {
2238
+ this._cloudAppSecurityPolicy = value;
2239
+ }
2240
+ resetCloudAppSecurityPolicy() {
2241
+ this._cloudAppSecurityPolicy = undefined;
2242
+ }
2243
+ // Temporarily expose input value. Use with caution.
2244
+ get cloudAppSecurityPolicyInput() {
2245
+ return this._cloudAppSecurityPolicy;
2246
+ }
2247
+ get disableResilienceDefaults() {
2248
+ return this.getBooleanAttribute('disable_resilience_defaults');
2249
+ }
2250
+ set disableResilienceDefaults(value) {
2251
+ this._disableResilienceDefaults = value;
2252
+ }
2253
+ resetDisableResilienceDefaults() {
2254
+ this._disableResilienceDefaults = undefined;
2255
+ }
2256
+ // Temporarily expose input value. Use with caution.
2257
+ get disableResilienceDefaultsInput() {
2258
+ return this._disableResilienceDefaults;
2259
+ }
2260
+ get persistentBrowserMode() {
2261
+ return this.getStringAttribute('persistent_browser_mode');
2262
+ }
2263
+ set persistentBrowserMode(value) {
2264
+ this._persistentBrowserMode = value;
2265
+ }
2266
+ resetPersistentBrowserMode() {
2267
+ this._persistentBrowserMode = undefined;
2268
+ }
2269
+ // Temporarily expose input value. Use with caution.
2270
+ get persistentBrowserModeInput() {
2271
+ return this._persistentBrowserMode;
2272
+ }
2273
+ get signInFrequency() {
2274
+ return this.getNumberAttribute('sign_in_frequency');
2275
+ }
2276
+ set signInFrequency(value) {
2277
+ this._signInFrequency = value;
2278
+ }
2279
+ resetSignInFrequency() {
2280
+ this._signInFrequency = undefined;
2281
+ }
2282
+ // Temporarily expose input value. Use with caution.
2283
+ get signInFrequencyInput() {
2284
+ return this._signInFrequency;
2285
+ }
2286
+ get signInFrequencyAuthenticationType() {
2287
+ return this.getStringAttribute('sign_in_frequency_authentication_type');
2288
+ }
2289
+ set signInFrequencyAuthenticationType(value) {
2290
+ this._signInFrequencyAuthenticationType = value;
2291
+ }
2292
+ resetSignInFrequencyAuthenticationType() {
2293
+ this._signInFrequencyAuthenticationType = undefined;
2294
+ }
2295
+ // Temporarily expose input value. Use with caution.
2296
+ get signInFrequencyAuthenticationTypeInput() {
2297
+ return this._signInFrequencyAuthenticationType;
2298
+ }
2299
+ get signInFrequencyInterval() {
2300
+ return this.getStringAttribute('sign_in_frequency_interval');
2301
+ }
2302
+ set signInFrequencyInterval(value) {
2303
+ this._signInFrequencyInterval = value;
2304
+ }
2305
+ resetSignInFrequencyInterval() {
2306
+ this._signInFrequencyInterval = undefined;
2307
+ }
2308
+ // Temporarily expose input value. Use with caution.
2309
+ get signInFrequencyIntervalInput() {
2310
+ return this._signInFrequencyInterval;
2311
+ }
2312
+ get signInFrequencyPeriod() {
2313
+ return this.getStringAttribute('sign_in_frequency_period');
2314
+ }
2315
+ set signInFrequencyPeriod(value) {
2316
+ this._signInFrequencyPeriod = value;
2317
+ }
2318
+ resetSignInFrequencyPeriod() {
2319
+ this._signInFrequencyPeriod = undefined;
2320
+ }
2321
+ // Temporarily expose input value. Use with caution.
2322
+ get signInFrequencyPeriodInput() {
2323
+ return this._signInFrequencyPeriod;
2324
+ }
2325
+ }
2326
+ exports.ConditionalAccessPolicySessionControlsOutputReference = ConditionalAccessPolicySessionControlsOutputReference;
2327
+ _u = JSII_RTTI_SYMBOL_1;
2328
+ ConditionalAccessPolicySessionControlsOutputReference[_u] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicySessionControlsOutputReference", version: "15.0.0" };
2329
+ function conditionalAccessPolicyTimeoutsToTerraform(struct) {
2330
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2331
+ return struct;
2332
+ }
2333
+ if (cdktn.isComplexElement(struct)) {
2334
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2335
+ }
2336
+ return {
2337
+ create: cdktn.stringToTerraform(struct.create),
2338
+ delete: cdktn.stringToTerraform(struct.delete),
2339
+ read: cdktn.stringToTerraform(struct.read),
2340
+ update: cdktn.stringToTerraform(struct.update),
2341
+ };
2342
+ }
2343
+ function conditionalAccessPolicyTimeoutsToHclTerraform(struct) {
2344
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2345
+ return struct;
2346
+ }
2347
+ if (cdktn.isComplexElement(struct)) {
2348
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2349
+ }
2350
+ const attrs = {
2351
+ create: {
2352
+ value: cdktn.stringToHclTerraform(struct.create),
2353
+ isBlock: false,
2354
+ type: "simple",
2355
+ storageClassType: "string",
2356
+ },
2357
+ delete: {
2358
+ value: cdktn.stringToHclTerraform(struct.delete),
2359
+ isBlock: false,
2360
+ type: "simple",
2361
+ storageClassType: "string",
2362
+ },
2363
+ read: {
2364
+ value: cdktn.stringToHclTerraform(struct.read),
2365
+ isBlock: false,
2366
+ type: "simple",
2367
+ storageClassType: "string",
2368
+ },
2369
+ update: {
2370
+ value: cdktn.stringToHclTerraform(struct.update),
2371
+ isBlock: false,
2372
+ type: "simple",
2373
+ storageClassType: "string",
2374
+ },
2375
+ };
2376
+ // remove undefined attributes
2377
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2378
+ }
2379
+ class ConditionalAccessPolicyTimeoutsOutputReference extends cdktn.ComplexObject {
2380
+ /**
2381
+ * @param terraformResource The parent resource
2382
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2383
+ */
2384
+ constructor(terraformResource, terraformAttribute) {
2385
+ super(terraformResource, terraformAttribute, false);
2386
+ this.isEmptyObject = false;
2387
+ }
2388
+ get internalValue() {
2389
+ if (this.resolvableValue) {
2390
+ return this.resolvableValue;
2391
+ }
2392
+ let hasAnyValues = this.isEmptyObject;
2393
+ const internalValueResult = {};
2394
+ if (this._create !== undefined) {
2395
+ hasAnyValues = true;
2396
+ internalValueResult.create = this._create;
2397
+ }
2398
+ if (this._delete !== undefined) {
2399
+ hasAnyValues = true;
2400
+ internalValueResult.delete = this._delete;
2401
+ }
2402
+ if (this._read !== undefined) {
2403
+ hasAnyValues = true;
2404
+ internalValueResult.read = this._read;
2405
+ }
2406
+ if (this._update !== undefined) {
2407
+ hasAnyValues = true;
2408
+ internalValueResult.update = this._update;
2409
+ }
2410
+ return hasAnyValues ? internalValueResult : undefined;
2411
+ }
2412
+ set internalValue(value) {
2413
+ if (value === undefined) {
2414
+ this.isEmptyObject = false;
2415
+ this.resolvableValue = undefined;
2416
+ this._create = undefined;
2417
+ this._delete = undefined;
2418
+ this._read = undefined;
2419
+ this._update = undefined;
2420
+ }
2421
+ else if (cdktn.Tokenization.isResolvable(value)) {
2422
+ this.isEmptyObject = false;
2423
+ this.resolvableValue = value;
2424
+ }
2425
+ else {
2426
+ this.isEmptyObject = Object.keys(value).length === 0;
2427
+ this.resolvableValue = undefined;
2428
+ this._create = value.create;
2429
+ this._delete = value.delete;
2430
+ this._read = value.read;
2431
+ this._update = value.update;
2432
+ }
2433
+ }
2434
+ get create() {
2435
+ return this.getStringAttribute('create');
2436
+ }
2437
+ set create(value) {
2438
+ this._create = value;
2439
+ }
2440
+ resetCreate() {
2441
+ this._create = undefined;
2442
+ }
2443
+ // Temporarily expose input value. Use with caution.
2444
+ get createInput() {
2445
+ return this._create;
2446
+ }
2447
+ get delete() {
2448
+ return this.getStringAttribute('delete');
2449
+ }
2450
+ set delete(value) {
2451
+ this._delete = value;
2452
+ }
2453
+ resetDelete() {
2454
+ this._delete = undefined;
2455
+ }
2456
+ // Temporarily expose input value. Use with caution.
2457
+ get deleteInput() {
2458
+ return this._delete;
2459
+ }
2460
+ get read() {
2461
+ return this.getStringAttribute('read');
2462
+ }
2463
+ set read(value) {
2464
+ this._read = value;
2465
+ }
2466
+ resetRead() {
2467
+ this._read = undefined;
2468
+ }
2469
+ // Temporarily expose input value. Use with caution.
2470
+ get readInput() {
2471
+ return this._read;
2472
+ }
2473
+ get update() {
2474
+ return this.getStringAttribute('update');
2475
+ }
2476
+ set update(value) {
2477
+ this._update = value;
2478
+ }
2479
+ resetUpdate() {
2480
+ this._update = undefined;
2481
+ }
2482
+ // Temporarily expose input value. Use with caution.
2483
+ get updateInput() {
2484
+ return this._update;
2485
+ }
2486
+ }
2487
+ exports.ConditionalAccessPolicyTimeoutsOutputReference = ConditionalAccessPolicyTimeoutsOutputReference;
2488
+ _v = JSII_RTTI_SYMBOL_1;
2489
+ ConditionalAccessPolicyTimeoutsOutputReference[_v] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicyTimeoutsOutputReference", version: "15.0.0" };
2490
+ /**
2491
+ * Represents a {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/conditional_access_policy azuread_conditional_access_policy}
2492
+ */
2493
+ class ConditionalAccessPolicy extends cdktn.TerraformResource {
2494
+ // ==============
2495
+ // STATIC Methods
2496
+ // ==============
2497
+ /**
2498
+ * Generates CDKTN code for importing a ConditionalAccessPolicy resource upon running "cdktn plan <stack-name>"
2499
+ * @param scope The scope in which to define this construct
2500
+ * @param importToId The construct id used in the generated config for the ConditionalAccessPolicy to import
2501
+ * @param importFromId The id of the existing ConditionalAccessPolicy that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/conditional_access_policy#import import section} in the documentation of this resource for the id to use
2502
+ * @param provider? Optional instance of the provider where the ConditionalAccessPolicy to import is found
2503
+ */
2504
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
2505
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "azuread_conditional_access_policy", importId: importFromId, provider });
2506
+ }
2507
+ // ===========
2508
+ // INITIALIZER
2509
+ // ===========
2510
+ /**
2511
+ * Create a new {@link https://registry.terraform.io/providers/hashicorp/azuread/3.7.0/docs/resources/conditional_access_policy azuread_conditional_access_policy} Resource
2512
+ *
2513
+ * @param scope The scope in which to define this construct
2514
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
2515
+ * @param options ConditionalAccessPolicyConfig
2516
+ */
2517
+ constructor(scope, id, config) {
2518
+ super(scope, id, {
2519
+ terraformResourceType: 'azuread_conditional_access_policy',
2520
+ terraformGeneratorMetadata: {
2521
+ providerName: 'azuread',
2522
+ providerVersion: '3.7.0',
2523
+ providerVersionConstraint: '~> 3.0'
2524
+ },
2525
+ provider: config.provider,
2526
+ dependsOn: config.dependsOn,
2527
+ count: config.count,
2528
+ lifecycle: config.lifecycle,
2529
+ provisioners: config.provisioners,
2530
+ connection: config.connection,
2531
+ forEach: config.forEach
2532
+ });
2533
+ // conditions - computed: false, optional: false, required: true
2534
+ this._conditions = new ConditionalAccessPolicyConditionsOutputReference(this, "conditions");
2535
+ // grant_controls - computed: false, optional: true, required: false
2536
+ this._grantControls = new ConditionalAccessPolicyGrantControlsOutputReference(this, "grant_controls");
2537
+ // session_controls - computed: false, optional: true, required: false
2538
+ this._sessionControls = new ConditionalAccessPolicySessionControlsOutputReference(this, "session_controls");
2539
+ // timeouts - computed: false, optional: true, required: false
2540
+ this._timeouts = new ConditionalAccessPolicyTimeoutsOutputReference(this, "timeouts");
2541
+ this._displayName = config.displayName;
2542
+ this._id = config.id;
2543
+ this._state = config.state;
2544
+ this._conditions.internalValue = config.conditions;
2545
+ this._grantControls.internalValue = config.grantControls;
2546
+ this._sessionControls.internalValue = config.sessionControls;
2547
+ this._timeouts.internalValue = config.timeouts;
2548
+ }
2549
+ get displayName() {
2550
+ return this.getStringAttribute('display_name');
2551
+ }
2552
+ set displayName(value) {
2553
+ this._displayName = value;
2554
+ }
2555
+ // Temporarily expose input value. Use with caution.
2556
+ get displayNameInput() {
2557
+ return this._displayName;
2558
+ }
2559
+ get id() {
2560
+ return this.getStringAttribute('id');
2561
+ }
2562
+ set id(value) {
2563
+ this._id = value;
2564
+ }
2565
+ resetId() {
2566
+ this._id = undefined;
2567
+ }
2568
+ // Temporarily expose input value. Use with caution.
2569
+ get idInput() {
2570
+ return this._id;
2571
+ }
2572
+ // object_id - computed: true, optional: false, required: false
2573
+ get objectId() {
2574
+ return this.getStringAttribute('object_id');
2575
+ }
2576
+ get state() {
2577
+ return this.getStringAttribute('state');
2578
+ }
2579
+ set state(value) {
2580
+ this._state = value;
2581
+ }
2582
+ // Temporarily expose input value. Use with caution.
2583
+ get stateInput() {
2584
+ return this._state;
2585
+ }
2586
+ get conditions() {
2587
+ return this._conditions;
2588
+ }
2589
+ putConditions(value) {
2590
+ this._conditions.internalValue = value;
2591
+ }
2592
+ // Temporarily expose input value. Use with caution.
2593
+ get conditionsInput() {
2594
+ return this._conditions.internalValue;
2595
+ }
2596
+ get grantControls() {
2597
+ return this._grantControls;
2598
+ }
2599
+ putGrantControls(value) {
2600
+ this._grantControls.internalValue = value;
2601
+ }
2602
+ resetGrantControls() {
2603
+ this._grantControls.internalValue = undefined;
2604
+ }
2605
+ // Temporarily expose input value. Use with caution.
2606
+ get grantControlsInput() {
2607
+ return this._grantControls.internalValue;
2608
+ }
2609
+ get sessionControls() {
2610
+ return this._sessionControls;
2611
+ }
2612
+ putSessionControls(value) {
2613
+ this._sessionControls.internalValue = value;
2614
+ }
2615
+ resetSessionControls() {
2616
+ this._sessionControls.internalValue = undefined;
2617
+ }
2618
+ // Temporarily expose input value. Use with caution.
2619
+ get sessionControlsInput() {
2620
+ return this._sessionControls.internalValue;
2621
+ }
2622
+ get timeouts() {
2623
+ return this._timeouts;
2624
+ }
2625
+ putTimeouts(value) {
2626
+ this._timeouts.internalValue = value;
2627
+ }
2628
+ resetTimeouts() {
2629
+ this._timeouts.internalValue = undefined;
2630
+ }
2631
+ // Temporarily expose input value. Use with caution.
2632
+ get timeoutsInput() {
2633
+ return this._timeouts.internalValue;
2634
+ }
2635
+ // =========
2636
+ // SYNTHESIS
2637
+ // =========
2638
+ synthesizeAttributes() {
2639
+ return {
2640
+ display_name: cdktn.stringToTerraform(this._displayName),
2641
+ id: cdktn.stringToTerraform(this._id),
2642
+ state: cdktn.stringToTerraform(this._state),
2643
+ conditions: conditionalAccessPolicyConditionsToTerraform(this._conditions.internalValue),
2644
+ grant_controls: conditionalAccessPolicyGrantControlsToTerraform(this._grantControls.internalValue),
2645
+ session_controls: conditionalAccessPolicySessionControlsToTerraform(this._sessionControls.internalValue),
2646
+ timeouts: conditionalAccessPolicyTimeoutsToTerraform(this._timeouts.internalValue),
2647
+ };
2648
+ }
2649
+ synthesizeHclAttributes() {
2650
+ const attrs = {
2651
+ display_name: {
2652
+ value: cdktn.stringToHclTerraform(this._displayName),
2653
+ isBlock: false,
2654
+ type: "simple",
2655
+ storageClassType: "string",
2656
+ },
2657
+ id: {
2658
+ value: cdktn.stringToHclTerraform(this._id),
2659
+ isBlock: false,
2660
+ type: "simple",
2661
+ storageClassType: "string",
2662
+ },
2663
+ state: {
2664
+ value: cdktn.stringToHclTerraform(this._state),
2665
+ isBlock: false,
2666
+ type: "simple",
2667
+ storageClassType: "string",
2668
+ },
2669
+ conditions: {
2670
+ value: conditionalAccessPolicyConditionsToHclTerraform(this._conditions.internalValue),
2671
+ isBlock: true,
2672
+ type: "list",
2673
+ storageClassType: "ConditionalAccessPolicyConditionsList",
2674
+ },
2675
+ grant_controls: {
2676
+ value: conditionalAccessPolicyGrantControlsToHclTerraform(this._grantControls.internalValue),
2677
+ isBlock: true,
2678
+ type: "list",
2679
+ storageClassType: "ConditionalAccessPolicyGrantControlsList",
2680
+ },
2681
+ session_controls: {
2682
+ value: conditionalAccessPolicySessionControlsToHclTerraform(this._sessionControls.internalValue),
2683
+ isBlock: true,
2684
+ type: "list",
2685
+ storageClassType: "ConditionalAccessPolicySessionControlsList",
2686
+ },
2687
+ timeouts: {
2688
+ value: conditionalAccessPolicyTimeoutsToHclTerraform(this._timeouts.internalValue),
2689
+ isBlock: true,
2690
+ type: "struct",
2691
+ storageClassType: "ConditionalAccessPolicyTimeouts",
2692
+ },
2693
+ };
2694
+ // remove undefined attributes
2695
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2696
+ }
2697
+ }
2698
+ exports.ConditionalAccessPolicy = ConditionalAccessPolicy;
2699
+ _w = JSII_RTTI_SYMBOL_1;
2700
+ ConditionalAccessPolicy[_w] = { fqn: "@cdktn/provider-azuread.conditionalAccessPolicy.ConditionalAccessPolicy", version: "15.0.0" };
2701
+ // =================
2702
+ // STATIC PROPERTIES
2703
+ // =================
2704
+ ConditionalAccessPolicy.tfResourceType = "azuread_conditional_access_policy";
2705
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZGl0aW9uYWwtYWNjZXNzLXBvbGljeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBcUVBLDRIQVVDO0FBR0Qsa0lBNEJDO0FBeUdELG9KQVNDO0FBR0QsMEpBc0JDO0FBbUZELHdJQVVDO0FBR0QsOElBNEJDO0FBeUdELDhIQVNDO0FBR0Qsb0lBc0JDO0FBMkVELGtIQVFDO0FBR0Qsd0hBZ0JDO0FBNkRELHNIQVNDO0FBR0QsNEhBc0JDO0FBZ0ZELHNIQVNDO0FBR0QsNEhBc0JDO0FBZ0ZELHNNQVNDO0FBR0QsNE1Bc0JDO0FBa0hELHdLQVNDO0FBR0QsOEtBc0JDO0FBZ0hELHNNQVNDO0FBR0QsNE1Bc0JDO0FBa0hELHdLQVNDO0FBR0QsOEtBc0JDO0FBNElELDhHQWVDO0FBR0Qsb0hBMERDO0FBMlFELG9HQW1CQztBQUdELDBHQWtGQztBQWtURCwwR0FZQztBQUdELGdIQXdDQztBQTBLRCw4R0FlQztBQUdELG9IQTBEQztBQStORCxnR0FXQztBQUdELHNHQWtDQzs7QUFueEZELCtCQUErQjtBQTREL0IsU0FBZ0Isd0RBQXdELENBQUMsTUFBcUg7SUFDNUwsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxvQkFB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LFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQXpPSCwwREEwT0M7OztBQXhPQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLHNDQUFjLEdBQUcsbUNBQW1DLEFBQXRDLENBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMjEsIDIwMjZcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3lcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmZpZyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2Rpc3BsYXlfbmFtZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNkaXNwbGF5X25hbWV9XG4gICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaWQgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjc3RhdGUgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc3RhdGV9XG4gICovXG4gIHJlYWRvbmx5IHN0YXRlOiBzdHJpbmc7XG4gIC8qKlxuICAqIGNvbmRpdGlvbnMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjY29uZGl0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNjb25kaXRpb25zfVxuICAqL1xuICByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnM7XG4gIC8qKlxuICAqIGdyYW50X2NvbnRyb2xzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2dyYW50X2NvbnRyb2xzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2dyYW50X2NvbnRyb2xzfVxuICAqL1xuICByZWFkb25seSBncmFudENvbnRyb2xzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzO1xuICAvKipcbiAgKiBzZXNzaW9uX2NvbnRyb2xzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3Nlc3Npb25fY29udHJvbHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc2Vzc2lvbl9jb250cm9sc31cbiAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbnRyb2xzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHM7XG4gIC8qKlxuICAqIHRpbWVvdXRzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3RpbWVvdXRzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3RpbWVvdXRzfVxuICAqL1xuICByZWFkb25seSB0aW1lb3V0cz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHM7XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfYXBwbGljYXRpb25zIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX2FwcGxpY2F0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRBcHBsaWNhdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9hcHBsaWNhdGlvbnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfYXBwbGljYXRpb25zfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZEFwcGxpY2F0aW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2luY2x1ZGVkX3VzZXJfYWN0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNpbmNsdWRlZF91c2VyX2FjdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVkVXNlckFjdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBleGNsdWRlZF9hcHBsaWNhdGlvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkQXBwbGljYXRpb25zKSxcbiAgICBpbmNsdWRlZF9hcHBsaWNhdGlvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkQXBwbGljYXRpb25zKSxcbiAgICBpbmNsdWRlZF91c2VyX2FjdGlvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkVXNlckFjdGlvbnMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZXhjbHVkZWRfYXBwbGljYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRBcHBsaWNhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfYXBwbGljYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRBcHBsaWNhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfdXNlcl9hY3Rpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRVc2VyQWN0aW9ucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5leGNsdWRlZEFwcGxpY2F0aW9ucyA9IHRoaXMuX2V4Y2x1ZGVkQXBwbGljYXRpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRBcHBsaWNhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRBcHBsaWNhdGlvbnMgPSB0aGlzLl9pbmNsdWRlZEFwcGxpY2F0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkVXNlckFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRVc2VyQWN0aW9ucyA9IHRoaXMuX2luY2x1ZGVkVXNlckFjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNBcHBsaWNhdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZWRVc2VyQWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZXhjbHVkZWRBcHBsaWNhdGlvbnMgPSB2YWx1ZS5leGNsdWRlZEFwcGxpY2F0aW9ucztcbiAgICAgIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zID0gdmFsdWUuaW5jbHVkZWRBcHBsaWNhdGlvbnM7XG4gICAgICB0aGlzLl9pbmNsdWRlZFVzZXJBY3Rpb25zID0gdmFsdWUuaW5jbHVkZWRVc2VyQWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBleGNsdWRlZF9hcHBsaWNhdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRBcHBsaWNhdGlvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZXhjbHVkZWRfYXBwbGljYXRpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBleGNsdWRlZEFwcGxpY2F0aW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkQXBwbGljYXRpb25zKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkQXBwbGljYXRpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBleGNsdWRlZEFwcGxpY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZEFwcGxpY2F0aW9ucztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX2FwcGxpY2F0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pbmNsdWRlZEFwcGxpY2F0aW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZEFwcGxpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9hcHBsaWNhdGlvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkQXBwbGljYXRpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRBcHBsaWNhdGlvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkQXBwbGljYXRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkQXBwbGljYXRpb25zO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfdXNlcl9hY3Rpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVkVXNlckFjdGlvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRVc2VyQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF91c2VyX2FjdGlvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkVXNlckFjdGlvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZWRVc2VyQWN0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVkVXNlckFjdGlvbnMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRVc2VyQWN0aW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRVc2VyQWN0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZFVzZXJBY3Rpb25zO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlciB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjbW9kZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNtb2RlfVxuICAqL1xuICByZWFkb25seSBtb2RlOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjcnVsZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNydWxlfVxuICAqL1xuICByZWFkb25seSBydWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXIpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbW9kZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5tb2RlKSxcbiAgICBydWxlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJ1bGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlclRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlck91dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlcik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgbW9kZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubW9kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcnVsZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucnVsZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tb2RlID0gdGhpcy5fbW9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3J1bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucnVsZSA9IHRoaXMuX3J1bGU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcnVsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fbW9kZSA9IHZhbHVlLm1vZGU7XG4gICAgICB0aGlzLl9ydWxlID0gdmFsdWUucnVsZTtcbiAgICB9XG4gIH1cblxuICAvLyBtb2RlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX21vZGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdtb2RlJyk7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tb2RlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1vZGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8vIHJ1bGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcnVsZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3J1bGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJ1bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3J1bGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcnVsZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ydWxlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9ucyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfc2VydmljZV9wcmluY2lwYWxzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFsc31cbiAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2luY2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFscyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNpbmNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVkU2VydmljZVByaW5jaXBhbHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogZmlsdGVyIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2ZpbHRlciBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNmaWx0ZXJ9XG4gICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc0ZpbHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBleGNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHMpLFxuICAgIGluY2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFsczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyksXG4gICAgZmlsdGVyOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmZpbHRlciksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBleGNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGluY2x1ZGVkX3NlcnZpY2VfcHJpbmNpcGFsczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkU2VydmljZVByaW5jaXBhbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmlsdGVyOiB7XG4gICAgICB2YWx1ZTogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zRmlsdGVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5maWx0ZXIpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHMgPSB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pbmNsdWRlZFNlcnZpY2VQcmluY2lwYWxzID0gdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZpbHRlcj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5maWx0ZXIgPSB0aGlzLl9maWx0ZXI/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZpbHRlci5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzID0gdmFsdWUuZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscztcbiAgICAgIHRoaXMuX2luY2x1ZGVkU2VydmljZVByaW5jaXBhbHMgPSB2YWx1ZS5pbmNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICAgICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB2YWx1ZS5maWx0ZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gZXhjbHVkZWRfc2VydmljZV9wcmluY2lwYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2V4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdleGNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkU2VydmljZVByaW5jaXBhbHMoKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRTZXJ2aWNlUHJpbmNpcGFsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfc2VydmljZV9wcmluY2lwYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVkU2VydmljZVByaW5jaXBhbHM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9zZXJ2aWNlX3ByaW5jaXBhbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkU2VydmljZVByaW5jaXBhbHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVkU2VydmljZVByaW5jaXBhbHMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFscyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRTZXJ2aWNlUHJpbmNpcGFsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZFNlcnZpY2VQcmluY2lwYWxzO1xuICB9XG5cbiAgLy8gZmlsdGVyIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZpbHRlciA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJmaWx0ZXJcIik7XG4gIHB1YmxpYyBnZXQgZmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gIH1cbiAgcHVibGljIHB1dEZpbHRlcih2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zRmlsdGVyKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZpbHRlcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNtb2RlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I21vZGV9XG4gICovXG4gIHJlYWRvbmx5IG1vZGU6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNydWxlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3J1bGV9XG4gICovXG4gIHJlYWRvbmx5IHJ1bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlcik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtb2RlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm1vZGUpLFxuICAgIHJ1bGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucnVsZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlclRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtb2RlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tb2RlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBydWxlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5ydWxlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX21vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubW9kZSA9IHRoaXMuX21vZGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ydWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJ1bGUgPSB0aGlzLl9ydWxlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21vZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ydWxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9tb2RlID0gdmFsdWUubW9kZTtcbiAgICAgIHRoaXMuX3J1bGUgPSB2YWx1ZS5ydWxlO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1vZGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbW9kZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21vZGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vZGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbW9kZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgLy8gcnVsZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ydWxlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBydWxlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncnVsZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcnVsZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBydWxlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bGU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlcyB7XG4gIC8qKlxuICAqIGZpbHRlciBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNmaWx0ZXIgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZmlsdGVyfVxuICAqL1xuICByZWFkb25seSBmaWx0ZXI/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbHRlcjogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlclRvVGVycmFmb3JtKHN0cnVjdCEuZmlsdGVyKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGZpbHRlcjoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZpbHRlciksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNGaWx0ZXJMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2ZpbHRlcj8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5maWx0ZXIgPSB0aGlzLl9maWx0ZXI/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2ZpbHRlci5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZmlsdGVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbHRlciAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9maWx0ZXIgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc0ZpbHRlck91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImZpbHRlclwiKTtcbiAgcHVibGljIGdldCBmaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcjtcbiAgfVxuICBwdWJsaWMgcHV0RmlsdGVyKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzRmlsdGVyKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5fZmlsdGVyLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZpbHRlcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXIuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4Y2x1ZGVkX2xvY2F0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNleGNsdWRlZF9sb2NhdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTG9jYXRpb25zPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaW5jbHVkZWRfbG9jYXRpb25zIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2luY2x1ZGVkX2xvY2F0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZWRMb2NhdGlvbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGV4Y2x1ZGVkX2xvY2F0aW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRMb2NhdGlvbnMpLFxuICAgIGluY2x1ZGVkX2xvY2F0aW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRMb2NhdGlvbnMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZXhjbHVkZWRfbG9jYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRMb2NhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfbG9jYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRMb2NhdGlvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0xvY2F0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZXhjbHVkZWRMb2NhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRMb2NhdGlvbnMgPSB0aGlzLl9leGNsdWRlZExvY2F0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVkTG9jYXRpb25zID0gdGhpcy5faW5jbHVkZWRMb2NhdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leGNsdWRlZExvY2F0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9leGNsdWRlZExvY2F0aW9ucyA9IHZhbHVlLmV4Y2x1ZGVkTG9jYXRpb25zO1xuICAgICAgdGhpcy5faW5jbHVkZWRMb2NhdGlvbnMgPSB2YWx1ZS5pbmNsdWRlZExvY2F0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBleGNsdWRlZF9sb2NhdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRMb2NhdGlvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRMb2NhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZXhjbHVkZWRfbG9jYXRpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBleGNsdWRlZExvY2F0aW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9leGNsdWRlZExvY2F0aW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkTG9jYXRpb25zKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkTG9jYXRpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBleGNsdWRlZExvY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZExvY2F0aW9ucztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX2xvY2F0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9pbmNsdWRlZExvY2F0aW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZExvY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9sb2NhdGlvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkTG9jYXRpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkTG9jYXRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkTG9jYXRpb25zO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3JtcyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfcGxhdGZvcm1zIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX3BsYXRmb3Jtc31cbiAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRQbGF0Zm9ybXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9wbGF0Zm9ybXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfcGxhdGZvcm1zfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZFBsYXRmb3Jtczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZXhjbHVkZWRfcGxhdGZvcm1zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFBsYXRmb3JtcyksXG4gICAgaW5jbHVkZWRfcGxhdGZvcm1zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFBsYXRmb3JtcyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBleGNsdWRlZF9wbGF0Zm9ybXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFBsYXRmb3JtcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBpbmNsdWRlZF9wbGF0Zm9ybXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFBsYXRmb3JtcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3Jtc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leGNsdWRlZFBsYXRmb3JtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5leGNsdWRlZFBsYXRmb3JtcyA9IHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRQbGF0Zm9ybXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRQbGF0Zm9ybXMgPSB0aGlzLl9pbmNsdWRlZFBsYXRmb3JtcztcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3JtcyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW5jbHVkZWRQbGF0Zm9ybXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zID0gdmFsdWUuZXhjbHVkZWRQbGF0Zm9ybXM7XG4gICAgICB0aGlzLl9pbmNsdWRlZFBsYXRmb3JtcyA9IHZhbHVlLmluY2x1ZGVkUGxhdGZvcm1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4Y2x1ZGVkX3BsYXRmb3JtcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leGNsdWRlZFBsYXRmb3Jtcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBleGNsdWRlZFBsYXRmb3JtcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdleGNsdWRlZF9wbGF0Zm9ybXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVkUGxhdGZvcm1zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXhjbHVkZWRQbGF0Zm9ybXMoKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRQbGF0Zm9ybXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkUGxhdGZvcm1zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVkUGxhdGZvcm1zO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfcGxhdGZvcm1zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2luY2x1ZGVkUGxhdGZvcm1zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkUGxhdGZvcm1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2luY2x1ZGVkX3BsYXRmb3JtcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5jbHVkZWRQbGF0Zm9ybXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faW5jbHVkZWRQbGF0Zm9ybXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRQbGF0Zm9ybXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWRQbGF0Zm9ybXM7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50cyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjbWVtYmVycyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNtZW1iZXJzfVxuICAqL1xuICByZWFkb25seSBtZW1iZXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjbWVtYmVyc2hpcF9raW5kIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I21lbWJlcnNoaXBfa2luZH1cbiAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyc2hpcEtpbmQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWVtYmVyczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEubWVtYmVycyksXG4gICAgbWVtYmVyc2hpcF9raW5kOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm1lbWJlcnNoaXBLaW5kKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50cyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtZW1iZXJzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEubWVtYmVycyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBtZW1iZXJzaGlwX2tpbmQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1lbWJlcnNoaXBLaW5kKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdG4uSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbWVtYmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZW1iZXJzID0gdGhpcy5fbWVtYmVycztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21lbWJlcnNoaXBLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1lbWJlcnNoaXBLaW5kID0gdGhpcy5fbWVtYmVyc2hpcEtpbmQ7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21lbWJlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZW1iZXJzaGlwS2luZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZW1iZXJzID0gdmFsdWUubWVtYmVycztcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBLaW5kID0gdmFsdWUubWVtYmVyc2hpcEtpbmQ7XG4gICAgfVxuICB9XG5cbiAgLy8gbWVtYmVycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZW1iZXJzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IG1lbWJlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnbWVtYmVycycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWVtYmVycyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9tZW1iZXJzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWVtYmVycygpIHtcbiAgICB0aGlzLl9tZW1iZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZW1iZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbWJlcnM7XG4gIH1cblxuICAvLyBtZW1iZXJzaGlwX2tpbmQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWVtYmVyc2hpcEtpbmQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG1lbWJlcnNoaXBLaW5kKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbWVtYmVyc2hpcF9raW5kJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZW1iZXJzaGlwS2luZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWVtYmVyc2hpcEtpbmQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWVtYmVyc2hpcEtpbmRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVtYmVyc2hpcEtpbmQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2d1ZXN0X29yX2V4dGVybmFsX3VzZXJfdHlwZXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlc31cbiAgKi9cbiAgcmVhZG9ubHkgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICogZXh0ZXJuYWxfdGVuYW50cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNleHRlcm5hbF90ZW5hbnRzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4dGVybmFsX3RlbmFudHN9XG4gICovXG4gIHJlYWRvbmx5IGV4dGVybmFsVGVuYW50cz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMpLFxuICAgIGV4dGVybmFsX3RlbmFudHM6IGNka3RuLmxpc3RNYXBwZXIoY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmV4dGVybmFsVGVuYW50cyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmd1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBleHRlcm5hbF90ZW5hbnRzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuZXh0ZXJuYWxUZW5hbnRzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzID0gdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxUZW5hbnRzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4dGVybmFsVGVuYW50cyA9IHRoaXMuX2V4dGVybmFsVGVuYW50cz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXh0ZXJuYWxUZW5hbnRzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzID0gdmFsdWUuZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzO1xuICAgICAgdGhpcy5fZXh0ZXJuYWxUZW5hbnRzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5leHRlcm5hbFRlbmFudHM7XG4gICAgfVxuICB9XG5cbiAgLy8gZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2d1ZXN0X29yX2V4dGVybmFsX3VzZXJfdHlwZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGd1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcztcbiAgfVxuXG4gIC8vIGV4dGVybmFsX3RlbmFudHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXh0ZXJuYWxUZW5hbnRzID0gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNMaXN0KHRoaXMsIFwiZXh0ZXJuYWxfdGVuYW50c1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgZXh0ZXJuYWxUZW5hbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9leHRlcm5hbFRlbmFudHM7XG4gIH1cbiAgcHVibGljIHB1dEV4dGVybmFsVGVuYW50cyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1tdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4dGVybmFsVGVuYW50cygpIHtcbiAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXh0ZXJuYWxUZW5hbnRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsVGVuYW50cy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1tdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNtZW1iZXJzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I21lbWJlcnN9XG4gICovXG4gIHJlYWRvbmx5IG1lbWJlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNtZW1iZXJzaGlwX2tpbmQgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjbWVtYmVyc2hpcF9raW5kfVxuICAqL1xuICByZWFkb25seSBtZW1iZXJzaGlwS2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1RvVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZW1iZXJzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5tZW1iZXJzKSxcbiAgICBtZW1iZXJzaGlwX2tpbmQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubWVtYmVyc2hpcEtpbmQpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1lbWJlcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5tZW1iZXJzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIG1lbWJlcnNoaXBfa2luZDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubWVtYmVyc2hpcEtpbmQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tZW1iZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1lbWJlcnMgPSB0aGlzLl9tZW1iZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWVtYmVyc2hpcEtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWVtYmVyc2hpcEtpbmQgPSB0aGlzLl9tZW1iZXJzaGlwS2luZDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWVtYmVycyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBLaW5kID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21lbWJlcnMgPSB2YWx1ZS5tZW1iZXJzO1xuICAgICAgdGhpcy5fbWVtYmVyc2hpcEtpbmQgPSB2YWx1ZS5tZW1iZXJzaGlwS2luZDtcbiAgICB9XG4gIH1cblxuICAvLyBtZW1iZXJzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21lbWJlcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgbWVtYmVycygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdtZW1iZXJzJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZW1iZXJzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX21lbWJlcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNZW1iZXJzKCkge1xuICAgIHRoaXMuX21lbWJlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1lbWJlcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVtYmVycztcbiAgfVxuXG4gIC8vIG1lbWJlcnNoaXBfa2luZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9tZW1iZXJzaGlwS2luZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbWVtYmVyc2hpcEtpbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdtZW1iZXJzaGlwX2tpbmQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1lbWJlcnNoaXBLaW5kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tZW1iZXJzaGlwS2luZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZW1iZXJzaGlwS2luZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZW1iZXJzaGlwS2luZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c0xpc3QgZXh0ZW5kcyBjZGt0bi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNbXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzfVxuICAqL1xuICByZWFkb25seSBndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM6IHN0cmluZ1tdO1xuICAvKipcbiAgKiBleHRlcm5hbF90ZW5hbnRzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4dGVybmFsX3RlbmFudHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZXh0ZXJuYWxfdGVuYW50c31cbiAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxUZW5hbnRzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGd1ZXN0X29yX2V4dGVybmFsX3VzZXJfdHlwZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmd1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyksXG4gICAgZXh0ZXJuYWxfdGVuYW50czogY2RrdG4ubGlzdE1hcHBlcihjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzVG9UZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuZXh0ZXJuYWxUZW5hbnRzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGV4dGVybmFsX3RlbmFudHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNFeHRlcm5hbFRlbmFudHNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5leHRlcm5hbFRlbmFudHMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2YWJsZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZhYmxlVmFsdWU7XG4gICAgfVxuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leHRlcm5hbFRlbmFudHM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXh0ZXJuYWxUZW5hbnRzID0gdGhpcy5fZXh0ZXJuYWxUZW5hbnRzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMgPSB2YWx1ZS5ndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXM7XG4gICAgICB0aGlzLl9leHRlcm5hbFRlbmFudHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLmV4dGVybmFsVGVuYW50cztcbiAgICB9XG4gIH1cblxuICAvLyBndWVzdF9vcl9leHRlcm5hbF91c2VyX3R5cGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZ3Vlc3Rfb3JfZXh0ZXJuYWxfdXNlcl90eXBlcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2d1ZXN0T3JFeHRlcm5hbFVzZXJUeXBlcyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBndWVzdE9yRXh0ZXJuYWxVc2VyVHlwZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ3Vlc3RPckV4dGVybmFsVXNlclR5cGVzO1xuICB9XG5cbiAgLy8gZXh0ZXJuYWxfdGVuYW50cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leHRlcm5hbFRlbmFudHMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0V4dGVybmFsVGVuYW50c0xpc3QodGhpcywgXCJleHRlcm5hbF90ZW5hbnRzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBleHRlcm5hbFRlbmFudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dGVybmFsVGVuYW50cztcbiAgfVxuICBwdWJsaWMgcHV0RXh0ZXJuYWxUZW5hbnRzKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzRXh0ZXJuYWxUZW5hbnRzW10gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2V4dGVybmFsVGVuYW50cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXh0ZXJuYWxUZW5hbnRzKCkge1xuICAgIHRoaXMuX2V4dGVybmFsVGVuYW50cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBleHRlcm5hbFRlbmFudHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXh0ZXJuYWxUZW5hbnRzLmludGVybmFsVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc0luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNleGNsdWRlZF9ncm91cHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZXhjbHVkZWRfZ3JvdXBzfVxuICAqL1xuICByZWFkb25seSBleGNsdWRlZEdyb3Vwcz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4Y2x1ZGVkX3JvbGVzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2V4Y2x1ZGVkX3JvbGVzfVxuICAqL1xuICByZWFkb25seSBleGNsdWRlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZXhjbHVkZWRfdXNlcnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZXhjbHVkZWRfdXNlcnN9XG4gICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkVXNlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9ncm91cHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfZ3JvdXBzfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZEdyb3Vwcz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2luY2x1ZGVkX3JvbGVzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2luY2x1ZGVkX3JvbGVzfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZFJvbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaW5jbHVkZWRfdXNlcnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfdXNlcnN9XG4gICovXG4gIHJlYWRvbmx5IGluY2x1ZGVkVXNlcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogZXhjbHVkZWRfZ3Vlc3RzX29yX2V4dGVybmFsX3VzZXJzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2V4Y2x1ZGVkX2d1ZXN0c19vcl9leHRlcm5hbF91c2VycyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnN9XG4gICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGluY2x1ZGVkX2d1ZXN0c19vcl9leHRlcm5hbF91c2VycyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjaW5jbHVkZWRfZ3Vlc3RzX29yX2V4dGVybmFsX3VzZXJzfVxuICAqL1xuICByZWFkb25seSBpbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGV4Y2x1ZGVkX2dyb3VwczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRHcm91cHMpLFxuICAgIGV4Y2x1ZGVkX3JvbGVzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5leGNsdWRlZFJvbGVzKSxcbiAgICBleGNsdWRlZF91c2VyczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRVc2VycyksXG4gICAgaW5jbHVkZWRfZ3JvdXBzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZEdyb3VwcyksXG4gICAgaW5jbHVkZWRfcm9sZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmluY2x1ZGVkUm9sZXMpLFxuICAgIGluY2x1ZGVkX3VzZXJzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFVzZXJzKSxcbiAgICBleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IGNka3RuLmxpc3RNYXBwZXIoY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKSxcbiAgICBpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IGNka3RuLmxpc3RNYXBwZXIoY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGV4Y2x1ZGVkX2dyb3Vwczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkR3JvdXBzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGV4Y2x1ZGVkX3JvbGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuZXhjbHVkZWRSb2xlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBleGNsdWRlZF91c2Vyczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmV4Y2x1ZGVkVXNlcnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfZ3JvdXBzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRHcm91cHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5jbHVkZWRfcm9sZXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5pbmNsdWRlZFJvbGVzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGluY2x1ZGVkX3VzZXJzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuaW5jbHVkZWRVc2VycyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNMaXN0XCIsXG4gICAgfSxcbiAgICBpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5pbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2VycyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZXhjbHVkZWRHcm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRHcm91cHMgPSB0aGlzLl9leGNsdWRlZEdyb3VwcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V4Y2x1ZGVkUm9sZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRSb2xlcyA9IHRoaXMuX2V4Y2x1ZGVkUm9sZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leGNsdWRlZFVzZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4Y2x1ZGVkVXNlcnMgPSB0aGlzLl9leGNsdWRlZFVzZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZWRHcm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRHcm91cHMgPSB0aGlzLl9pbmNsdWRlZEdyb3VwcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkUm9sZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaW5jbHVkZWRSb2xlcyA9IHRoaXMuX2luY2x1ZGVkUm9sZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlZFVzZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVkVXNlcnMgPSB0aGlzLl9pbmNsdWRlZFVzZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgPSB0aGlzLl9leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzID0gdGhpcy5faW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2VycyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkR3JvdXBzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXhjbHVkZWRSb2xlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbmNsdWRlZEdyb3VwcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbmNsdWRlZFVzZXJzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkR3JvdXBzID0gdmFsdWUuZXhjbHVkZWRHcm91cHM7XG4gICAgICB0aGlzLl9leGNsdWRlZFJvbGVzID0gdmFsdWUuZXhjbHVkZWRSb2xlcztcbiAgICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB2YWx1ZS5leGNsdWRlZFVzZXJzO1xuICAgICAgdGhpcy5faW5jbHVkZWRHcm91cHMgPSB2YWx1ZS5pbmNsdWRlZEdyb3VwcztcbiAgICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB2YWx1ZS5pbmNsdWRlZFJvbGVzO1xuICAgICAgdGhpcy5faW5jbHVkZWRVc2VycyA9IHZhbHVlLmluY2x1ZGVkVXNlcnM7XG4gICAgICB0aGlzLl9leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM7XG4gICAgICB0aGlzLl9pbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vycy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuaW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnM7XG4gICAgfVxuICB9XG5cbiAgLy8gZXhjbHVkZWRfZ3JvdXBzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2V4Y2x1ZGVkR3JvdXBzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2V4Y2x1ZGVkX2dyb3VwcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhjbHVkZWRHcm91cHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRHcm91cHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFeGNsdWRlZEdyb3VwcygpIHtcbiAgICB0aGlzLl9leGNsdWRlZEdyb3VwcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRHcm91cHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZWRHcm91cHM7XG4gIH1cblxuICAvLyBleGNsdWRlZF9yb2xlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leGNsdWRlZFJvbGVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkUm9sZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnZXhjbHVkZWRfcm9sZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4Y2x1ZGVkUm9sZXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRSb2xlcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkUm9sZXMoKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRSb2xlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhjbHVkZWRSb2xlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZFJvbGVzO1xuICB9XG5cbiAgLy8gZXhjbHVkZWRfdXNlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRVc2Vycz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBleGNsdWRlZFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2V4Y2x1ZGVkX3VzZXJzJyk7XG4gIH1cbiAgcHVibGljIHNldCBleGNsdWRlZFVzZXJzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFeGNsdWRlZFVzZXJzKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkVXNlcnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkVXNlcnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZWRVc2VycztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX2dyb3VwcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pbmNsdWRlZEdyb3Vwcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZEdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF9ncm91cHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVkR3JvdXBzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkR3JvdXBzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZWRHcm91cHMoKSB7XG4gICAgdGhpcy5faW5jbHVkZWRHcm91cHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkR3JvdXBzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkR3JvdXBzO1xuICB9XG5cbiAgLy8gaW5jbHVkZWRfcm9sZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW5jbHVkZWRSb2xlcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBpbmNsdWRlZFJvbGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2luY2x1ZGVkX3JvbGVzJyk7XG4gIH1cbiAgcHVibGljIHNldCBpbmNsdWRlZFJvbGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJbmNsdWRlZFJvbGVzKCkge1xuICAgIHRoaXMuX2luY2x1ZGVkUm9sZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkUm9sZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5jbHVkZWRSb2xlcztcbiAgfVxuXG4gIC8vIGluY2x1ZGVkX3VzZXJzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luY2x1ZGVkVXNlcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgaW5jbHVkZWRVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdpbmNsdWRlZF91c2VycycpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5jbHVkZWRVc2Vycyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9pbmNsdWRlZFVzZXJzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5jbHVkZWRVc2VycygpIHtcbiAgICB0aGlzLl9pbmNsdWRlZFVzZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbmNsdWRlZFVzZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkVXNlcnM7XG4gIH1cblxuICAvLyBleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNFeGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0xpc3QodGhpcywgXCJleGNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9leGNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycztcbiAgfVxuICBwdWJsaWMgcHV0RXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzRXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZXhjbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHRoaXMuX2V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNJbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2Vyc0xpc3QodGhpcywgXCJpbmNsdWRlZF9ndWVzdHNfb3JfZXh0ZXJuYWxfdXNlcnNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlZEd1ZXN0c09yRXh0ZXJuYWxVc2VycztcbiAgfVxuICBwdWJsaWMgcHV0SW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzSW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnNbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faW5jbHVkZWRHdWVzdHNPckV4dGVybmFsVXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzKCkge1xuICAgIHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGluY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVkR3Vlc3RzT3JFeHRlcm5hbFVzZXJzLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNhdXRoZW50aWNhdGlvbl9mbG93X3RyYW5zZmVyX21ldGhvZHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjYXV0aGVudGljYXRpb25fZmxvd190cmFuc2Zlcl9tZXRob2RzfVxuICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjbGllbnRfYXBwX3R5cGVzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2NsaWVudF9hcHBfdHlwZXN9XG4gICovXG4gIHJlYWRvbmx5IGNsaWVudEFwcFR5cGVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNpbnNpZGVyX3Jpc2tfbGV2ZWxzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2luc2lkZXJfcmlza19sZXZlbHN9XG4gICovXG4gIHJlYWRvbmx5IGluc2lkZXJSaXNrTGV2ZWxzPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3NlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzfVxuICAqL1xuICByZWFkb25seSBzZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NpZ25faW5fcmlza19sZXZlbHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc2lnbl9pbl9yaXNrX2xldmVsc31cbiAgKi9cbiAgcmVhZG9ubHkgc2lnbkluUmlza0xldmVscz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3VzZXJfcmlza19sZXZlbHMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjdXNlcl9yaXNrX2xldmVsc31cbiAgKi9cbiAgcmVhZG9ubHkgdXNlclJpc2tMZXZlbHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogYXBwbGljYXRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2FwcGxpY2F0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNhcHBsaWNhdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGFwcGxpY2F0aW9uczogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zO1xuICAvKipcbiAgKiBjbGllbnRfYXBwbGljYXRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2NsaWVudF9hcHBsaWNhdGlvbnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjY2xpZW50X2FwcGxpY2F0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgY2xpZW50QXBwbGljYXRpb25zPzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zO1xuICAvKipcbiAgKiBkZXZpY2VzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2RldmljZXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjZGV2aWNlc31cbiAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlcz86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXM7XG4gIC8qKlxuICAqIGxvY2F0aW9ucyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNsb2NhdGlvbnMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjbG9jYXRpb25zfVxuICAqL1xuICByZWFkb25seSBsb2NhdGlvbnM/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnM7XG4gIC8qKlxuICAqIHBsYXRmb3JtcyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNwbGF0Zm9ybXMgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjcGxhdGZvcm1zfVxuICAqL1xuICByZWFkb25seSBwbGF0Zm9ybXM/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXM7XG4gIC8qKlxuICAqIHVzZXJzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3VzZXJzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3VzZXJzfVxuICAqL1xuICByZWFkb25seSB1c2VyczogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXV0aGVudGljYXRpb25fZmxvd190cmFuc2Zlcl9tZXRob2RzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMpLFxuICAgIGNsaWVudF9hcHBfdHlwZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmNsaWVudEFwcFR5cGVzKSxcbiAgICBpbnNpZGVyX3Jpc2tfbGV2ZWxzOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmluc2lkZXJSaXNrTGV2ZWxzKSxcbiAgICBzZXJ2aWNlX3ByaW5jaXBhbF9yaXNrX2xldmVsczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMpLFxuICAgIHNpZ25faW5fcmlza19sZXZlbHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnNpZ25JblJpc2tMZXZlbHMpLFxuICAgIHVzZXJfcmlza19sZXZlbHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnVzZXJSaXNrTGV2ZWxzKSxcbiAgICBhcHBsaWNhdGlvbnM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25zKSxcbiAgICBjbGllbnRfYXBwbGljYXRpb25zOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNDbGllbnRBcHBsaWNhdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLmNsaWVudEFwcGxpY2F0aW9ucyksXG4gICAgZGV2aWNlczogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zRGV2aWNlc1RvVGVycmFmb3JtKHN0cnVjdCEuZGV2aWNlcyksXG4gICAgbG9jYXRpb25zOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLmxvY2F0aW9ucyksXG4gICAgcGxhdGZvcm1zOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNUb1RlcnJhZm9ybShzdHJ1Y3QhLnBsYXRmb3JtcyksXG4gICAgdXNlcnM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzVG9UZXJyYWZvcm0oc3RydWN0IS51c2VycyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhdXRoZW50aWNhdGlvbl9mbG93X3RyYW5zZmVyX21ldGhvZHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBjbGllbnRfYXBwX3R5cGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuY2xpZW50QXBwVHlwZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgaW5zaWRlcl9yaXNrX2xldmVsczoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuaW5zaWRlclJpc2tMZXZlbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgc2lnbl9pbl9yaXNrX2xldmVsczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnNpZ25JblJpc2tMZXZlbHMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgdXNlcl9yaXNrX2xldmVsczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnVzZXJSaXNrTGV2ZWxzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGFwcGxpY2F0aW9uczoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zTGlzdFwiLFxuICAgIH0sXG4gICAgY2xpZW50X2FwcGxpY2F0aW9uczoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY2xpZW50QXBwbGljYXRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zTGlzdFwiLFxuICAgIH0sXG4gICAgZGV2aWNlczoge1xuICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0RldmljZXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRldmljZXMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzTGlzdFwiLFxuICAgIH0sXG4gICAgbG9jYXRpb25zOiB7XG4gICAgICB2YWx1ZTogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5sb2NhdGlvbnMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNMaXN0XCIsXG4gICAgfSxcbiAgICBwbGF0Zm9ybXM6IHtcbiAgICAgIHZhbHVlOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNQbGF0Zm9ybXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnBsYXRmb3JtcyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3Jtc0xpc3RcIixcbiAgICB9LFxuICAgIHVzZXJzOiB7XG4gICAgICB2YWx1ZTogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVzZXJzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zVXNlcnNMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzID0gdGhpcy5fYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2xpZW50QXBwVHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2xpZW50QXBwVHlwZXMgPSB0aGlzLl9jbGllbnRBcHBUeXBlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luc2lkZXJSaXNrTGV2ZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmluc2lkZXJSaXNrTGV2ZWxzID0gdGhpcy5faW5zaWRlclJpc2tMZXZlbHM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyA9IHRoaXMuX3NlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2lnbkluUmlza0xldmVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduSW5SaXNrTGV2ZWxzID0gdGhpcy5fc2lnbkluUmlza0xldmVscztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VzZXJSaXNrTGV2ZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVzZXJSaXNrTGV2ZWxzID0gdGhpcy5fdXNlclJpc2tMZXZlbHM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9hcHBsaWNhdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXBwbGljYXRpb25zID0gdGhpcy5fYXBwbGljYXRpb25zPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2xpZW50QXBwbGljYXRpb25zPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNsaWVudEFwcGxpY2F0aW9ucyA9IHRoaXMuX2NsaWVudEFwcGxpY2F0aW9ucz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RldmljZXM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGV2aWNlcyA9IHRoaXMuX2RldmljZXM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9sb2NhdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubG9jYXRpb25zID0gdGhpcy5fbG9jYXRpb25zPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGxhdGZvcm1zPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBsYXRmb3JtcyA9IHRoaXMuX3BsYXRmb3Jtcz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VzZXJzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVzZXJzID0gdGhpcy5fdXNlcnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jbGllbnRBcHBUeXBlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2luc2lkZXJSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5SaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXNlclJpc2tMZXZlbHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hcHBsaWNhdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NsaWVudEFwcGxpY2F0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGV2aWNlcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wbGF0Zm9ybXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VzZXJzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcyA9IHZhbHVlLmF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcztcbiAgICAgIHRoaXMuX2NsaWVudEFwcFR5cGVzID0gdmFsdWUuY2xpZW50QXBwVHlwZXM7XG4gICAgICB0aGlzLl9pbnNpZGVyUmlza0xldmVscyA9IHZhbHVlLmluc2lkZXJSaXNrTGV2ZWxzO1xuICAgICAgdGhpcy5fc2VydmljZVByaW5jaXBhbFJpc2tMZXZlbHMgPSB2YWx1ZS5zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscztcbiAgICAgIHRoaXMuX3NpZ25JblJpc2tMZXZlbHMgPSB2YWx1ZS5zaWduSW5SaXNrTGV2ZWxzO1xuICAgICAgdGhpcy5fdXNlclJpc2tMZXZlbHMgPSB2YWx1ZS51c2VyUmlza0xldmVscztcbiAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuYXBwbGljYXRpb25zO1xuICAgICAgdGhpcy5fY2xpZW50QXBwbGljYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5jbGllbnRBcHBsaWNhdGlvbnM7XG4gICAgICB0aGlzLl9kZXZpY2VzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5kZXZpY2VzO1xuICAgICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5sb2NhdGlvbnM7XG4gICAgICB0aGlzLl9wbGF0Zm9ybXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnBsYXRmb3JtcztcbiAgICAgIHRoaXMuX3VzZXJzLmludGVybmFsVmFsdWUgPSB2YWx1ZS51c2VycztcbiAgICB9XG4gIH1cblxuICAvLyBhdXRoZW50aWNhdGlvbl9mbG93X3RyYW5zZmVyX21ldGhvZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcygpIHtcbiAgICByZXR1cm4gY2RrdG4uRm4udG9saXN0KHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXV0aGVudGljYXRpb25fZmxvd190cmFuc2Zlcl9tZXRob2RzJykpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRpb25GbG93VHJhbnNmZXJNZXRob2RzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kcygpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0aW9uRmxvd1RyYW5zZmVyTWV0aG9kc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkZsb3dUcmFuc2Zlck1ldGhvZHM7XG4gIH1cblxuICAvLyBjbGllbnRfYXBwX3R5cGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2NsaWVudEFwcFR5cGVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGNsaWVudEFwcFR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2NsaWVudF9hcHBfdHlwZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsaWVudEFwcFR5cGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NsaWVudEFwcFR5cGVzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNsaWVudEFwcFR5cGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudEFwcFR5cGVzO1xuICB9XG5cbiAgLy8gaW5zaWRlcl9yaXNrX2xldmVscyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luc2lkZXJSaXNrTGV2ZWxzPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBpbnNpZGVyUmlza0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2luc2lkZXJfcmlza19sZXZlbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluc2lkZXJSaXNrTGV2ZWxzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pbnNpZGVyUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEluc2lkZXJSaXNrTGV2ZWxzKCkge1xuICAgIHRoaXMuX2luc2lkZXJSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpbnNpZGVyUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbnNpZGVyUmlza0xldmVscztcbiAgfVxuXG4gIC8vIHNlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IHNlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3NlcnZpY2VfcHJpbmNpcGFsX3Jpc2tfbGV2ZWxzJyk7XG4gIH1cbiAgcHVibGljIHNldCBzZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzKCkge1xuICAgIHRoaXMuX3NlcnZpY2VQcmluY2lwYWxSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsUmlza0xldmVscztcbiAgfVxuXG4gIC8vIHNpZ25faW5fcmlza19sZXZlbHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2lnbkluUmlza0xldmVscz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBzaWduSW5SaXNrTGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3NpZ25faW5fcmlza19sZXZlbHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpZ25JblJpc2tMZXZlbHModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc2lnbkluUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25JblJpc2tMZXZlbHMoKSB7XG4gICAgdGhpcy5fc2lnbkluUmlza0xldmVscyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2lnbkluUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduSW5SaXNrTGV2ZWxzO1xuICB9XG5cbiAgLy8gdXNlcl9yaXNrX2xldmVscyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF91c2VyUmlza0xldmVscz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCB1c2VyUmlza0xldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCd1c2VyX3Jpc2tfbGV2ZWxzJyk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VyUmlza0xldmVscyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl91c2VyUmlza0xldmVscyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFVzZXJSaXNrTGV2ZWxzKCkge1xuICAgIHRoaXMuX3VzZXJSaXNrTGV2ZWxzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1c2VyUmlza0xldmVsc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91c2VyUmlza0xldmVscztcbiAgfVxuXG4gIC8vIGFwcGxpY2F0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9hcHBsaWNhdGlvbnMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQXBwbGljYXRpb25zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiYXBwbGljYXRpb25zXCIpO1xuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zO1xuICB9XG4gIHB1YmxpYyBwdXRBcHBsaWNhdGlvbnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0FwcGxpY2F0aW9ucykge1xuICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGNsaWVudF9hcHBsaWNhdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2xpZW50QXBwbGljYXRpb25zID0gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc0NsaWVudEFwcGxpY2F0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNsaWVudF9hcHBsaWNhdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgY2xpZW50QXBwbGljYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRBcHBsaWNhdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dENsaWVudEFwcGxpY2F0aW9ucyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zQ2xpZW50QXBwbGljYXRpb25zKSB7XG4gICAgdGhpcy5fY2xpZW50QXBwbGljYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDbGllbnRBcHBsaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5fY2xpZW50QXBwbGljYXRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNsaWVudEFwcGxpY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnRBcHBsaWNhdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGRldmljZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGV2aWNlcyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiZGV2aWNlc1wiKTtcbiAgcHVibGljIGdldCBkZXZpY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZXZpY2VzO1xuICB9XG4gIHB1YmxpYyBwdXREZXZpY2VzKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNEZXZpY2VzKSB7XG4gICAgdGhpcy5fZGV2aWNlcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGV2aWNlcygpIHtcbiAgICB0aGlzLl9kZXZpY2VzLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRldmljZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2aWNlcy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gbG9jYXRpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2xvY2F0aW9ucyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMb2NhdGlvbnNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJsb2NhdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgbG9jYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dExvY2F0aW9ucyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zTG9jYXRpb25zKSB7XG4gICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMb2NhdGlvbnMoKSB7XG4gICAgdGhpcy5fbG9jYXRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGxvY2F0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHBsYXRmb3JtcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wbGF0Zm9ybXMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zUGxhdGZvcm1zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicGxhdGZvcm1zXCIpO1xuICBwdWJsaWMgZ2V0IHBsYXRmb3JtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhdGZvcm1zO1xuICB9XG4gIHB1YmxpYyBwdXRQbGF0Zm9ybXModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1BsYXRmb3Jtcykge1xuICAgIHRoaXMuX3BsYXRmb3Jtcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UGxhdGZvcm1zKCkge1xuICAgIHRoaXMuX3BsYXRmb3Jtcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwbGF0Zm9ybXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhdGZvcm1zLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB1c2VycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF91c2VycyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNVc2Vyc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInVzZXJzXCIpO1xuICBwdWJsaWMgZ2V0IHVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl91c2VycztcbiAgfVxuICBwdWJsaWMgcHV0VXNlcnModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1VzZXJzKSB7XG4gICAgdGhpcy5fdXNlcnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1c2Vyc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91c2Vycy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9scyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjYXV0aGVudGljYXRpb25fc3RyZW5ndGhfcG9saWN5X2lkIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2F1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2J1aWx0X2luX2NvbnRyb2xzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2J1aWx0X2luX2NvbnRyb2xzfVxuICAqL1xuICByZWFkb25seSBidWlsdEluQ29udHJvbHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjdXN0b21fYXV0aGVudGljYXRpb25fZmFjdG9ycyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNjdXN0b21fYXV0aGVudGljYXRpb25fZmFjdG9yc31cbiAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjb3BlcmF0b3IgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjb3BlcmF0b3J9XG4gICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjdGVybXNfb2ZfdXNlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3Rlcm1zX29mX3VzZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGVybXNPZlVzZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQpLFxuICAgIGJ1aWx0X2luX2NvbnRyb2xzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5idWlsdEluQ29udHJvbHMpLFxuICAgIGN1c3RvbV9hdXRoZW50aWNhdGlvbl9mYWN0b3JzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnMpLFxuICAgIG9wZXJhdG9yOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICB0ZXJtc19vZl91c2U6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnRlcm1zT2ZVc2UpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc091dHB1dFJlZmVyZW5jZSB8IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9scyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXV0aGVudGljYXRpb25fc3RyZW5ndGhfcG9saWN5X2lkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGJ1aWx0X2luX2NvbnRyb2xzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYnVpbHRJbkNvbnRyb2xzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGN1c3RvbV9hdXRoZW50aWNhdGlvbl9mYWN0b3JzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIG9wZXJhdG9yOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5vcGVyYXRvciksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGVybXNfb2ZfdXNlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEudGVybXNPZlVzZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkID0gdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYnVpbHRJbkNvbnRyb2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmJ1aWx0SW5Db250cm9scyA9IHRoaXMuX2J1aWx0SW5Db250cm9scztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnMgPSB0aGlzLl9jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGVybXNPZlVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50ZXJtc09mVXNlID0gdGhpcy5fdGVybXNPZlVzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9scyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW9uU3RyZW5ndGhQb2xpY3lJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2J1aWx0SW5Db250cm9scyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGVybXNPZlVzZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkID0gdmFsdWUuYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkO1xuICAgICAgdGhpcy5fYnVpbHRJbkNvbnRyb2xzID0gdmFsdWUuYnVpbHRJbkNvbnRyb2xzO1xuICAgICAgdGhpcy5fY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzID0gdmFsdWUuY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzO1xuICAgICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZS5vcGVyYXRvcjtcbiAgICAgIHRoaXMuX3Rlcm1zT2ZVc2UgPSB2YWx1ZS50ZXJtc09mVXNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF1dGhlbnRpY2F0aW9uU3RyZW5ndGhQb2xpY3lJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2F1dGhlbnRpY2F0aW9uX3N0cmVuZ3RoX3BvbGljeV9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWQoKSB7XG4gICAgdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdXRoZW50aWNhdGlvblN0cmVuZ3RoUG9saWN5SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25TdHJlbmd0aFBvbGljeUlkO1xuICB9XG5cbiAgLy8gYnVpbHRfaW5fY29udHJvbHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYnVpbHRJbkNvbnRyb2xzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGJ1aWx0SW5Db250cm9scygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdidWlsdF9pbl9jb250cm9scycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYnVpbHRJbkNvbnRyb2xzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2J1aWx0SW5Db250cm9scyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEJ1aWx0SW5Db250cm9scygpIHtcbiAgICB0aGlzLl9idWlsdEluQ29udHJvbHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGJ1aWx0SW5Db250cm9sc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9idWlsdEluQ29udHJvbHM7XG4gIH1cblxuICAvLyBjdXN0b21fYXV0aGVudGljYXRpb25fZmFjdG9ycyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2N1c3RvbV9hdXRoZW50aWNhdGlvbl9mYWN0b3JzJyk7XG4gIH1cbiAgcHVibGljIHNldCBjdXN0b21BdXRoZW50aWNhdGlvbkZhY3RvcnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzKCkge1xuICAgIHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3VzdG9tQXV0aGVudGljYXRpb25GYWN0b3JzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbUF1dGhlbnRpY2F0aW9uRmFjdG9ycztcbiAgfVxuXG4gIC8vIG9wZXJhdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX29wZXJhdG9yPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvcGVyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdG9yJyk7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3I7XG4gIH1cblxuICAvLyB0ZXJtc19vZl91c2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGVybXNPZlVzZT86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCB0ZXJtc09mVXNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3Rlcm1zX29mX3VzZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVybXNPZlVzZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl90ZXJtc09mVXNlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGVybXNPZlVzZSgpIHtcbiAgICB0aGlzLl90ZXJtc09mVXNlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0ZXJtc09mVXNlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlcm1zT2ZVc2U7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I2FwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2FwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkfVxuICAqL1xuICByZWFkb25seSBhcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjbG91ZF9hcHBfc2VjdXJpdHlfcG9saWN5IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2Nsb3VkX2FwcF9zZWN1cml0eV9wb2xpY3l9XG4gICovXG4gIHJlYWRvbmx5IGNsb3VkQXBwU2VjdXJpdHlQb2xpY3k/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2Rpc2FibGVfcmVzaWxpZW5jZV9kZWZhdWx0c31cbiAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZVJlc2lsaWVuY2VEZWZhdWx0cz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZX1cbiAgKi9cbiAgcmVhZG9ubHkgcGVyc2lzdGVudEJyb3dzZXJNb2RlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NpZ25faW5fZnJlcXVlbmN5IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I3NpZ25faW5fZnJlcXVlbmN5fVxuICAqL1xuICByZWFkb25seSBzaWduSW5GcmVxdWVuY3k/OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjc2lnbl9pbl9mcmVxdWVuY3lfYXV0aGVudGljYXRpb25fdHlwZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNzaWduX2luX2ZyZXF1ZW5jeV9hdXRoZW50aWNhdGlvbl90eXBlfVxuICAqL1xuICByZWFkb25seSBzaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjc2lnbl9pbl9mcmVxdWVuY3lfaW50ZXJ2YWwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjc2lnbl9pbl9mcmVxdWVuY3lfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IHNpZ25JbkZyZXF1ZW5jeUludGVydmFsPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3NpZ25faW5fZnJlcXVlbmN5X3BlcmlvZCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSNzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2R9XG4gICovXG4gIHJlYWRvbmx5IHNpZ25JbkZyZXF1ZW5jeVBlcmlvZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHNPdXRwdXRSZWZlcmVuY2UgfCBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9scyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhcHBsaWNhdGlvbl9lbmZvcmNlZF9yZXN0cmljdGlvbnNfZW5hYmxlZDogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQpLFxuICAgIGNsb3VkX2FwcF9zZWN1cml0eV9wb2xpY3k6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY2xvdWRBcHBTZWN1cml0eVBvbGljeSksXG4gICAgZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzKSxcbiAgICBwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5wZXJzaXN0ZW50QnJvd3Nlck1vZGUpLFxuICAgIHNpZ25faW5fZnJlcXVlbmN5OiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnNpZ25JbkZyZXF1ZW5jeSksXG4gICAgc2lnbl9pbl9mcmVxdWVuY3lfYXV0aGVudGljYXRpb25fdHlwZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUpLFxuICAgIHNpZ25faW5fZnJlcXVlbmN5X2ludGVydmFsOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnNpZ25JbkZyZXF1ZW5jeUludGVydmFsKSxcbiAgICBzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2Q6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5UGVyaW9kKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9sc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzT3V0cHV0UmVmZXJlbmNlIHwgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGFwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBjbG91ZF9hcHBfc2VjdXJpdHlfcG9saWN5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jbG91ZEFwcFNlY3VyaXR5UG9saWN5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkaXNhYmxlX3Jlc2lsaWVuY2VfZGVmYXVsdHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgcGVyc2lzdGVudF9icm93c2VyX21vZGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnBlcnNpc3RlbnRCcm93c2VyTW9kZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2lnbl9pbl9mcmVxdWVuY3k6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNpZ25JbkZyZXF1ZW5jeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc2lnbl9pbl9mcmVxdWVuY3lfYXV0aGVudGljYXRpb25fdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBzaWduX2luX2ZyZXF1ZW5jeV9pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNpZ25faW5fZnJlcXVlbmN5X3BlcmlvZDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2lnbkluRnJlcXVlbmN5UGVyaW9kKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9scyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgPSB0aGlzLl9hcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Nsb3VkQXBwU2VjdXJpdHlQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHRoaXMuX2Nsb3VkQXBwU2VjdXJpdHlQb2xpY3k7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRpc2FibGVSZXNpbGllbmNlRGVmYXVsdHMgPSB0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGVyc2lzdGVudEJyb3dzZXJNb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnBlcnNpc3RlbnRCcm93c2VyTW9kZSA9IHRoaXMuX3BlcnNpc3RlbnRCcm93c2VyTW9kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25JbkZyZXF1ZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduSW5GcmVxdWVuY3kgPSB0aGlzLl9zaWduSW5GcmVxdWVuY3k7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlID0gdGhpcy5fc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwgPSB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduSW5GcmVxdWVuY3lQZXJpb2QgPSB0aGlzLl9zaWduSW5GcmVxdWVuY3lQZXJpb2Q7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9scyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rpc2FibGVSZXNpbGllbmNlRGVmYXVsdHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3kgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgPSB2YWx1ZS5hcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZDtcbiAgICAgIHRoaXMuX2Nsb3VkQXBwU2VjdXJpdHlQb2xpY3kgPSB2YWx1ZS5jbG91ZEFwcFNlY3VyaXR5UG9saWN5O1xuICAgICAgdGhpcy5fZGlzYWJsZVJlc2lsaWVuY2VEZWZhdWx0cyA9IHZhbHVlLmRpc2FibGVSZXNpbGllbmNlRGVmYXVsdHM7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGUgPSB2YWx1ZS5wZXJzaXN0ZW50QnJvd3Nlck1vZGU7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3kgPSB2YWx1ZS5zaWduSW5GcmVxdWVuY3k7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgPSB2YWx1ZS5zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGU7XG4gICAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbCA9IHZhbHVlLnNpZ25JbkZyZXF1ZW5jeUludGVydmFsO1xuICAgICAgdGhpcy5fc2lnbkluRnJlcXVlbmN5UGVyaW9kID0gdmFsdWUuc2lnbkluRnJlcXVlbmN5UGVyaW9kO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFwcGxpY2F0aW9uX2VuZm9yY2VkX3Jlc3RyaWN0aW9uc19lbmFibGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBhcHBsaWNhdGlvbkVuZm9yY2VkUmVzdHJpY3Rpb25zRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdhcHBsaWNhdGlvbl9lbmZvcmNlZF9yZXN0cmljdGlvbnNfZW5hYmxlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQoKSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25FbmZvcmNlZFJlc3RyaWN0aW9uc0VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9uRW5mb3JjZWRSZXN0cmljdGlvbnNFbmFibGVkO1xuICB9XG5cbiAgLy8gY2xvdWRfYXBwX3NlY3VyaXR5X3BvbGljeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jbG91ZEFwcFNlY3VyaXR5UG9saWN5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjbG91ZEFwcFNlY3VyaXR5UG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY2xvdWRfYXBwX3NlY3VyaXR5X3BvbGljeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xvdWRBcHBTZWN1cml0eVBvbGljeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENsb3VkQXBwU2VjdXJpdHlQb2xpY3koKSB7XG4gICAgdGhpcy5fY2xvdWRBcHBTZWN1cml0eVBvbGljeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2xvdWRBcHBTZWN1cml0eVBvbGljeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbG91ZEFwcFNlY3VyaXR5UG9saWN5O1xuICB9XG5cbiAgLy8gZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVSZXNpbGllbmNlRGVmYXVsdHM/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVSZXNpbGllbmNlRGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGlzYWJsZV9yZXNpbGllbmNlX2RlZmF1bHRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGlzYWJsZVJlc2lsaWVuY2VEZWZhdWx0cygpIHtcbiAgICB0aGlzLl9kaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkaXNhYmxlUmVzaWxpZW5jZURlZmF1bHRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVSZXNpbGllbmNlRGVmYXVsdHM7XG4gIH1cblxuICAvLyBwZXJzaXN0ZW50X2Jyb3dzZXJfbW9kZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wZXJzaXN0ZW50QnJvd3Nlck1vZGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHBlcnNpc3RlbnRCcm93c2VyTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3BlcnNpc3RlbnRfYnJvd3Nlcl9tb2RlJyk7XG4gIH1cbiAgcHVibGljIHNldCBwZXJzaXN0ZW50QnJvd3Nlck1vZGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BlcnNpc3RlbnRCcm93c2VyTW9kZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBlcnNpc3RlbnRCcm93c2VyTW9kZSgpIHtcbiAgICB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHBlcnNpc3RlbnRCcm93c2VyTW9kZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW50QnJvd3Nlck1vZGU7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zaWduSW5GcmVxdWVuY3k/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHNpZ25JbkZyZXF1ZW5jeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3NpZ25faW5fZnJlcXVlbmN5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzaWduSW5GcmVxdWVuY3kodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25JbkZyZXF1ZW5jeSgpIHtcbiAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3kgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpZ25JbkZyZXF1ZW5jeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduSW5GcmVxdWVuY3k7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeV9hdXRoZW50aWNhdGlvbl90eXBlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2lnbkluRnJlcXVlbmN5QXV0aGVudGljYXRpb25UeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzaWduX2luX2ZyZXF1ZW5jeV9hdXRoZW50aWNhdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBzaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeUF1dGhlbnRpY2F0aW9uVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25JbkZyZXF1ZW5jeUF1dGhlbnRpY2F0aW9uVHlwZSgpIHtcbiAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpZ25JbkZyZXF1ZW5jeUF1dGhlbnRpY2F0aW9uVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduSW5GcmVxdWVuY3lBdXRoZW50aWNhdGlvblR5cGU7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeV9pbnRlcnZhbCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NpZ25JbkZyZXF1ZW5jeUludGVydmFsPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduSW5GcmVxdWVuY3lJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NpZ25faW5fZnJlcXVlbmN5X2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBzaWduSW5GcmVxdWVuY3lJbnRlcnZhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWwgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTaWduSW5GcmVxdWVuY3lJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9zaWduSW5GcmVxdWVuY3lJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbkluRnJlcXVlbmN5SW50ZXJ2YWw7XG4gIH1cblxuICAvLyBzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2lnbkluRnJlcXVlbmN5UGVyaW9kPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduSW5GcmVxdWVuY3lQZXJpb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzaWduX2luX2ZyZXF1ZW5jeV9wZXJpb2QnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpZ25JbkZyZXF1ZW5jeVBlcmlvZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbkluRnJlcXVlbmN5UGVyaW9kID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2lnbkluRnJlcXVlbmN5UGVyaW9kKCkge1xuICAgIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2lnbkluRnJlcXVlbmN5UGVyaW9kSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25JbkZyZXF1ZW5jeVBlcmlvZDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSNjcmVhdGUgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjY3JlYXRlfVxuICAqL1xuICByZWFkb25seSBjcmVhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjZGVsZXRlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5I2RlbGV0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXp1cmVhZC8zLjcuMC9kb2NzL3Jlc291cmNlcy9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5I3JlYWQgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjcmVhZH1cbiAgKi9cbiAgcmVhZG9ubHkgcmVhZD86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSN1cGRhdGUgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kjdXBkYXRlfVxuICAqL1xuICByZWFkb25seSB1cGRhdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgIGRlbGV0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgIHJlYWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucmVhZCksXG4gICAgdXBkYXRlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3JlYXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRlbGV0ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVsZXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICByZWFkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5yZWFkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB1cGRhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnVwZGF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jcmVhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY3JlYXRlID0gdGhpcy5fY3JlYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRlbGV0ZSA9IHRoaXMuX2RlbGV0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucmVhZCA9IHRoaXMuX3JlYWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudXBkYXRlID0gdGhpcy5fdXBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZWFkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlLmNyZWF0ZTtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlLmRlbGV0ZTtcbiAgICAgIHRoaXMuX3JlYWQgPSB2YWx1ZS5yZWFkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdmFsdWUudXBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jcmVhdGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNyZWF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NyZWF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3JlYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDcmVhdGUoKSB7XG4gICAgdGhpcy5fY3JlYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjcmVhdGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlO1xuICB9XG5cbiAgLy8gZGVsZXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2RlbGV0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVsZXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZWxldGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlbGV0ZSgpIHtcbiAgICB0aGlzLl9kZWxldGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlbGV0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxldGU7XG4gIH1cblxuICAvLyByZWFkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlYWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJlYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWFkJyk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZWFkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVhZCgpIHtcbiAgICB0aGlzLl9yZWFkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZWFkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWQ7XG4gIH1cblxuICAvLyB1cGRhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdXBkYXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd1cGRhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVwZGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXBkYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VXBkYXRlKCkge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdXBkYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F6dXJlYWQvMy43LjAvZG9jcy9yZXNvdXJjZXMvY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeSBhenVyZWFkX2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3l9XG4qL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5IGV4dGVuZHMgY2RrdG4uVGVycmFmb3JtUmVzb3VyY2Uge1xuXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcImF6dXJlYWRfY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeVwiO1xuXG4gIC8vID09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09XG4gIC8qKlxuICAqIEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSByZXNvdXJjZSB1cG9uIHJ1bm5pbmcgXCJjZGt0biBwbGFuIDxzdGFjay1uYW1lPlwiXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSBDb25kaXRpb25hbEFjY2Vzc1BvbGljeSB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3kgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kjaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIENvbmRpdGlvbmFsQWNjZXNzUG9saWN5IHRvIGltcG9ydCBpcyBmb3VuZFxuICAqL1xuICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ29uZmlnRm9ySW1wb3J0KHNjb3BlOiBDb25zdHJ1Y3QsIGltcG9ydFRvSWQ6IHN0cmluZywgaW1wb3J0RnJvbUlkOiBzdHJpbmcsIHByb3ZpZGVyPzogY2RrdG4uVGVycmFmb3JtUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjZGt0bi5JbXBvcnRhYmxlUmVzb3VyY2Uoc2NvcGUsIGltcG9ydFRvSWQsIHsgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBcImF6dXJlYWRfY29uZGl0aW9uYWxfYWNjZXNzX3BvbGljeVwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9henVyZWFkLzMuNy4wL2RvY3MvcmVzb3VyY2VzL2NvbmRpdGlvbmFsX2FjY2Vzc19wb2xpY3kgYXp1cmVhZF9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5fSBSZXNvdXJjZVxuICAqXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaWQgVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuIE11c3QgYmUgdW5pcXVlIGFtb25nc3Qgc2libGluZ3MgaW4gdGhlIHNhbWUgc2NvcGVcbiAgKiBAcGFyYW0gb3B0aW9ucyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmZpZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29uZmlnOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnYXp1cmVhZF9jb25kaXRpb25hbF9hY2Nlc3NfcG9saWN5JyxcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogJ2F6dXJlYWQnLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICczLjcuMCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiAzLjAnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fZGlzcGxheU5hbWUgPSBjb25maWcuZGlzcGxheU5hbWU7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5fc3RhdGUgPSBjb25maWcuc3RhdGU7XG4gICAgdGhpcy5fY29uZGl0aW9ucy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmNvbmRpdGlvbnM7XG4gICAgdGhpcy5fZ3JhbnRDb250cm9scy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmdyYW50Q29udHJvbHM7XG4gICAgdGhpcy5fc2Vzc2lvbkNvbnRyb2xzLmludGVybmFsVmFsdWUgPSBjb25maWcuc2Vzc2lvbkNvbnRyb2xzO1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSBjb25maWcudGltZW91dHM7XG4gIH1cblxuICAvLyA9PT09PT09PT09XG4gIC8vIEFUVFJJQlVURVNcbiAgLy8gPT09PT09PT09PVxuXG4gIC8vIGRpc3BsYXlfbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kaXNwbGF5TmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkaXNwbGF5X25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRpc3BsYXlOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kaXNwbGF5TmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkaXNwbGF5TmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5TmFtZTtcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIG9iamVjdF9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG9iamVjdElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb2JqZWN0X2lkJyk7XG4gIH1cblxuICAvLyBzdGF0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zdGF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzdGF0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3N0YXRlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN0YXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLy8gY29uZGl0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9jb25kaXRpb25zID0gbmV3IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImNvbmRpdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgY29uZGl0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZGl0aW9ucztcbiAgfVxuICBwdWJsaWMgcHV0Q29uZGl0aW9ucyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lDb25kaXRpb25zKSB7XG4gICAgdGhpcy5fY29uZGl0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZGl0aW9ucy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gZ3JhbnRfY29udHJvbHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZ3JhbnRDb250cm9scyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUdyYW50Q29udHJvbHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJncmFudF9jb250cm9sc1wiKTtcbiAgcHVibGljIGdldCBncmFudENvbnRyb2xzKCkge1xuICAgIHJldHVybiB0aGlzLl9ncmFudENvbnRyb2xzO1xuICB9XG4gIHB1YmxpYyBwdXRHcmFudENvbnRyb2xzKHZhbHVlOiBDb25kaXRpb25hbEFjY2Vzc1BvbGljeUdyYW50Q29udHJvbHMpIHtcbiAgICB0aGlzLl9ncmFudENvbnRyb2xzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRHcmFudENvbnRyb2xzKCkge1xuICAgIHRoaXMuX2dyYW50Q29udHJvbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZ3JhbnRDb250cm9sc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ncmFudENvbnRyb2xzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzZXNzaW9uX2NvbnRyb2xzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Nlc3Npb25Db250cm9scyA9IG5ldyBDb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9sc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInNlc3Npb25fY29udHJvbHNcIik7XG4gIHB1YmxpYyBnZXQgc2Vzc2lvbkNvbnRyb2xzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ29udHJvbHM7XG4gIH1cbiAgcHVibGljIHB1dFNlc3Npb25Db250cm9scyh2YWx1ZTogQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHMpIHtcbiAgICB0aGlzLl9zZXNzaW9uQ29udHJvbHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNlc3Npb25Db250cm9scygpIHtcbiAgICB0aGlzLl9zZXNzaW9uQ29udHJvbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2Vzc2lvbkNvbnRyb2xzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25Db250cm9scy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZW91dHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZW91dHMgPSBuZXcgQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lUaW1lb3V0c091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRpbWVvdXRzXCIpO1xuICBwdWJsaWMgZ2V0IHRpbWVvdXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cztcbiAgfVxuICBwdWJsaWMgcHV0VGltZW91dHModmFsdWU6IENvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHMpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGltZW91dHMoKSB7XG4gICAgdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZW91dHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PVxuICAvLyBTWU5USEVTSVNcbiAgLy8gPT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheV9uYW1lOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9kaXNwbGF5TmFtZSksXG4gICAgICBpZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgc3RhdGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3N0YXRlKSxcbiAgICAgIGNvbmRpdGlvbnM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5Q29uZGl0aW9uc1RvVGVycmFmb3JtKHRoaXMuX2NvbmRpdGlvbnMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBncmFudF9jb250cm9sczogY29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lHcmFudENvbnRyb2xzVG9UZXJyYWZvcm0odGhpcy5fZ3JhbnRDb250cm9scy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHNlc3Npb25fY29udHJvbHM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5U2Vzc2lvbkNvbnRyb2xzVG9UZXJyYWZvcm0odGhpcy5fc2Vzc2lvbkNvbnRyb2xzLmludGVybmFsVmFsdWUpLFxuICAgICAgdGltZW91dHM6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHNUb1RlcnJhZm9ybSh0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIGRpc3BsYXlfbmFtZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fZGlzcGxheU5hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fc3RhdGUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIHZhbHVlOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNUb0hjbFRlcnJhZm9ybSh0aGlzLl9jb25kaXRpb25zLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeUNvbmRpdGlvbnNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgZ3JhbnRfY29udHJvbHM6IHtcbiAgICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc1RvSGNsVGVycmFmb3JtKHRoaXMuX2dyYW50Q29udHJvbHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvbmRpdGlvbmFsQWNjZXNzUG9saWN5R3JhbnRDb250cm9sc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBzZXNzaW9uX2NvbnRyb2xzOiB7XG4gICAgICAgIHZhbHVlOiBjb25kaXRpb25hbEFjY2Vzc1BvbGljeVNlc3Npb25Db250cm9sc1RvSGNsVGVycmFmb3JtKHRoaXMuX3Nlc3Npb25Db250cm9scy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29uZGl0aW9uYWxBY2Nlc3NQb2xpY3lTZXNzaW9uQ29udHJvbHNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgdGltZW91dHM6IHtcbiAgICAgICAgdmFsdWU6IGNvbmRpdGlvbmFsQWNjZXNzUG9saWN5VGltZW91dHNUb0hjbFRlcnJhZm9ybSh0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJzdHJ1Y3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb25kaXRpb25hbEFjY2Vzc1BvbGljeVRpbWVvdXRzXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=