flexdataset 0.16.0 → 0.18.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.
@@ -141,6 +141,22 @@ function normalizeCheckConstraints(value) {
141
141
  };
142
142
  });
143
143
  }
144
+ function normalizeExclusionConstraints(value) {
145
+ return asArray(value).map((raw) => {
146
+ const record = asRecord(raw);
147
+ return {
148
+ name: asString(record.name),
149
+ using: asString(record.using),
150
+ elements: asArray(record.elements).map((rawElement) => {
151
+ const elementRecord = asRecord(rawElement);
152
+ return {
153
+ column: asString(elementRecord.column),
154
+ operator: asString(elementRecord.operator),
155
+ };
156
+ }),
157
+ };
158
+ });
159
+ }
144
160
  function normalizeBucketing(value) {
145
161
  if (value === null || typeof value !== 'object') {
146
162
  return undefined;
@@ -191,9 +207,11 @@ function normalizeTableDefinition(raw) {
191
207
  primaryKey: asStringArray(record.primaryKey),
192
208
  partitions: normalizePartitions(record.partitions),
193
209
  sortOrder: normalizeSortOrder(record.sortOrder),
210
+ identifierFields: asStringArray(record.identifierFields),
194
211
  indexes: normalizeIndexes(record.indexes),
195
212
  uniqueConstraints: normalizeUniqueConstraints(record.uniqueConstraints),
196
213
  checkConstraints: normalizeCheckConstraints(record.checkConstraints),
214
+ exclusionConstraints: normalizeExclusionConstraints(record.exclusionConstraints),
197
215
  bucketing: normalizeBucketing(record.bucketing),
198
216
  tableProperties: normalizeStringMap(record.tableProperties),
199
217
  dependsOn: asStringArray(record.dependsOn),
@@ -339,4 +357,4 @@ function loadRoot(rootDir) {
339
357
  violations,
340
358
  };
341
359
  }
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvUEgsNEJBd0lDO0FBMVhELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFlN0IsNkNBRXNCO0FBSXRCLHFEQUVnQztBQWVoQyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQWdDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYztJQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBYztJQUM3QixPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUNyQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBYztJQUNwQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxT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QUksQ0FBQztnQkFDWixLQUFLLEVBQUUsT0FBTztnQkFDZCxJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQztnQkFDdEMsT0FBTyxFQUFFLFdBQVcsVUFBVSxzQ0FBc0MsWUFBWSxHQUFHO2FBQ3RGLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPO1lBQ1AsV0FBVztZQUNYLE1BQU0sRUFBRSxZQUFZO1NBQ3ZCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPO1FBQ0gsS0FBSyxFQUFFO1lBQ0gsT0FBTyxFQUFFLFlBQVk7WUFDckIsT0FBTztZQUNQLE1BQU07U0FDVDtRQUNELFVBQVU7S0FDYixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlsZXN5c3RlbSBsb2FkZXIuIFdhbGtzIGEgZGF0YXNldCByb290LCBwYXJzZXMgZWFjaCBKU09OIGZpbGUsIHJ1bnMgTGF5ZXIgMVxuICogc3RydWN0dXJhbCB2YWxpZGF0aW9uLCBhbmQgbm9ybWFsaXplcyBldmVyeXRoaW5nIGludG8gYSBgV29ybGRgIG9mXG4gKiBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgaW5zdGFuY2VzIHRoYXQgdGhlIHNlbWFudGljIHJ1bGVzIG9wZXJhdGUgb24uXG4gKlxuICogUGFyc2UgZXJyb3JzLCBzdHJ1Y3R1cmFsIGVycm9ycywgYW5kIGEgbWlzc2luZyBzY2hlbWEtZGVzY3JpcHRpb24gZmlsZSBhcmVcbiAqIHJlcG9ydGVkIGhlcmU7IGFsbCBjcm9zcy1maWVsZCAvIGNyb3NzLWZpbGUgbG9naWMgbGl2ZXMgaW4gdGhlIHRhYmxlLXR5cGVcbiAqIGNsYXNzZXMgKGAuL3RhYmxlLXR5cGUudHNgLCBgLi90YWJsZS10eXBlcy8qYCkuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtcbiAgICBCdWNrZXRpbmcsXG4gICAgQ2hlY2tDb25zdHJhaW50LFxuICAgIENvbHVtbixcbiAgICBGb3JlaWduS2V5LFxuICAgIEluZGV4LFxuICAgIFBhcnRpdGlvbixcbiAgICBTY2hlbWFEZXNjcmlwdGlvbixcbiAgICBTb3J0RmllbGQsXG4gICAgVGFibGVEZWZpbml0aW9uLFxuICAgIFVuaXF1ZUNvbnN0cmFpbnQsXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUsXG59IGZyb20gJy4vc3RydWN0dXJhbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4vdGFibGUtdHlwZSc7XG5pbXBvcnQge1xuICAgIGNyZWF0ZVRhYmxlVHlwZSxcbn0gZnJvbSAnLi90YWJsZS10eXBlcy9yZWdpc3RyeSc7XG5pbXBvcnQge1xuICAgIExvYWRlZFNjaGVtYSxcbiAgICBXb3JsZCxcbn0gZnJvbSAnLi93b3JsZCc7XG5cbi8qKiBSZXN1bHQgb2YgbG9hZGluZyBhIHJvb3Q6IHRoZSBtb2RlbCBwbHVzIGFueSBsb2FkLXRpbWUgdmlvbGF0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZE91dGNvbWUge1xuICAgIC8qKiBUaGUgbG9hZGVkIG1vZGVsLiAqL1xuICAgIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAgIC8qKiBQYXJzZSwgc3RydWN0dXJhbCwgYW5kIG1pc3NpbmctZGVzY3JpcHRpb24gdmlvbGF0aW9ucy4gKi9cbiAgICByZWFkb25seSB2aW9sYXRpb25zOiBWaW9sYXRpb25bXTtcbn1cblxuZnVuY3Rpb24gYXNSZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9O1xufVxuXG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlOiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICcnO1xufVxuXG5mdW5jdGlvbiBhc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgPyB2YWx1ZSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb2x1bW5zKHZhbHVlOiB1bmtub3duKTogQ29sdW1uW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogYXNTdHJpbmcocmVjb3JkLnR5cGUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgICAgICBudWxsYWJsZTogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLm51bGxhYmxlKSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuZ2VuZXJhdGVkKSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmV4cHJlc3Npb24pLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkNvbHVtbnM6ICdleHByZXNzaW9uQ29sdW1ucycgaW4gcmVjb3JkID8gYXNTdHJpbmdBcnJheShyZWNvcmQuZXhwcmVzc2lvbkNvbHVtbnMpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaWRlbnRpdHk6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmlkZW50aXR5KSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmRlZmF1bHQpLFxuICAgICAgICAgICAgY29sbGF0aW9uOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5jb2xsYXRpb24pLFxuICAgICAgICAgICAgY29tcHJlc3Npb246IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmNvbXByZXNzaW9uKSxcbiAgICAgICAgICAgIHN0b3JhZ2U6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLnN0b3JhZ2UpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXJ0aXRpb25zKHZhbHVlOiB1bmtub3duKTogUGFydGl0aW9uW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogYXNTdHJpbmcocmVjb3JkLnR5cGUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNvcnRPcmRlcih2YWx1ZTogdW5rbm93bik6IFNvcnRGaWVsZFtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbjogYXNTdHJpbmcocmVjb3JkLmNvbHVtbiksXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLnRyYW5zZm9ybSksXG4gICAgICAgICAgICBkaXJlY3Rpb246IGFzU3RyaW5nKHJlY29yZC5kaXJlY3Rpb24pLFxuICAgICAgICAgICAgbnVsbE9yZGVyOiBhc1N0cmluZyhyZWNvcmQubnVsbE9yZGVyKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSW5kZXhlcyh2YWx1ZTogdW5rbm93bik6IEluZGV4W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgbWV0aG9kOiBhc1N0cmluZyhyZWNvcmQubWV0aG9kKSxcbiAgICAgICAgICAgIHVuaXF1ZTogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLnVuaXF1ZSksXG4gICAgICAgICAgICBjb2x1bW5zOiBhc0FycmF5KHJlY29yZC5jb2x1bW5zKS5tYXAoKHJhd0NvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblJlY29yZCA9IGFzUmVjb3JkKHJhd0NvbHVtbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcoY29sdW1uUmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBzb3J0OiBhc09wdGlvbmFsU3RyaW5nKGNvbHVtblJlY29yZC5zb3J0KSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbHM6IGFzT3B0aW9uYWxTdHJpbmcoY29sdW1uUmVjb3JkLm51bGxzKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBpbmNsdWRlOiBhc1N0cmluZ0FycmF5KHJlY29yZC5pbmNsdWRlKSxcbiAgICAgICAgICAgIHdoZXJlOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC53aGVyZSksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXF1ZUNvbnN0cmFpbnRzKHZhbHVlOiB1bmtub3duKTogVW5pcXVlQ29uc3RyYWludFtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGFzU3RyaW5nQXJyYXkocmVjb3JkLmNvbHVtbnMpLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLm51bGxzTm90RGlzdGluY3QpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDaGVja0NvbnN0cmFpbnRzKHZhbHVlOiB1bmtub3duKTogQ2hlY2tDb25zdHJhaW50W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogYXNTdHJpbmcocmVjb3JkLmV4cHJlc3Npb24pLFxuICAgICAgICAgICAgY29sdW1uczogYXNTdHJpbmdBcnJheShyZWNvcmQuY29sdW1ucyksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJ1Y2tldGluZyh2YWx1ZTogdW5rbm93bik6IEJ1Y2tldGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQodmFsdWUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IGFzU3RyaW5nQXJyYXkocmVjb3JkLmNvbHVtbnMpLFxuICAgICAgICBidWNrZXRDb3VudDogdHlwZW9mIHJlY29yZC5idWNrZXRDb3VudCA9PT0gJ251bWJlcicgPyByZWNvcmQuYnVja2V0Q291bnQgOiAwLFxuICAgICAgICBzb3J0ZWRCeTogYXNBcnJheShyZWNvcmQuc29ydGVkQnkpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0UmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBhc1N0cmluZyhzb3J0UmVjb3JkLmNvbHVtbiksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBhc1N0cmluZyhzb3J0UmVjb3JkLmRpcmVjdGlvbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdNYXAodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZCh2YWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBbXG4gICAgICAgIGtleSxcbiAgICAgICAgcmF3LFxuICAgIF0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcmF3O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZvcmVpZ25LZXlzKHZhbHVlOiB1bmtub3duKTogRm9yZWlnbktleVtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVRhYmxlOiBhc1N0cmluZyhyZWNvcmQuc291cmNlVGFibGUpLFxuICAgICAgICAgICAgc291cmNlQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQuc291cmNlQ29sdW1uKSxcbiAgICAgICAgICAgIGxvY2FsQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQubG9jYWxDb2x1bW4pLFxuICAgICAgICAgICAgYWxsb3dOdWxsczogYXNCb29sZWFuKHJlY29yZC5hbGxvd051bGxzKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVGFibGVEZWZpbml0aW9uKHJhdzogdW5rbm93bik6IFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIHRhYmxlVHlwZTogYXNTdHJpbmcocmVjb3JkLnRhYmxlVHlwZSksXG4gICAgICAgIGlzUmF3RGF0YTogYXNCb29sZWFuKHJlY29yZC5pc1Jhd0RhdGEpLFxuICAgICAgICBmb3JtYXRWZXJzaW9uOiBhc09wdGlvbmFsTnVtYmVyKHJlY29yZC5mb3JtYXRWZXJzaW9uKSxcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplQ29sdW1ucyhyZWNvcmQuY29sdW1ucyksXG4gICAgICAgIHByaW1hcnlLZXk6IGFzU3RyaW5nQXJyYXkocmVjb3JkLnByaW1hcnlLZXkpLFxuICAgICAgICBwYXJ0aXRpb25zOiBub3JtYWxpemVQYXJ0aXRpb25zKHJlY29yZC5wYXJ0aXRpb25zKSxcbiAgICAgICAgc29ydE9yZGVyOiBub3JtYWxpemVTb3J0T3JkZXIocmVjb3JkLnNvcnRPcmRlciksXG4gICAgICAgIGluZGV4ZXM6IG5vcm1hbGl6ZUluZGV4ZXMocmVjb3JkLmluZGV4ZXMpLFxuICAgICAgICB1bmlxdWVDb25zdHJhaW50czogbm9ybWFsaXplVW5pcXVlQ29uc3RyYWludHMocmVjb3JkLnVuaXF1ZUNvbnN0cmFpbnRzKSxcbiAgICAgICAgY2hlY2tDb25zdHJhaW50czogbm9ybWFsaXplQ2hlY2tDb25zdHJhaW50cyhyZWNvcmQuY2hlY2tDb25zdHJhaW50cyksXG4gICAgICAgIGJ1Y2tldGluZzogbm9ybWFsaXplQnVja2V0aW5nKHJlY29yZC5idWNrZXRpbmcpLFxuICAgICAgICB0YWJsZVByb3BlcnRpZXM6IG5vcm1hbGl6ZVN0cmluZ01hcChyZWNvcmQudGFibGVQcm9wZXJ0aWVzKSxcbiAgICAgICAgZGVwZW5kc09uOiBhc1N0cmluZ0FycmF5KHJlY29yZC5kZXBlbmRzT24pLFxuICAgICAgICBmb3JlaWduS2V5czogbm9ybWFsaXplRm9yZWlnbktleXMocmVjb3JkLmZvcmVpZ25LZXlzKSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY2hlbWFEZXNjcmlwdGlvbihyYXc6IHVua25vd24pOiBTY2hlbWFEZXNjcmlwdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgfTtcbn1cblxuLy8vIFNjaGVtYSBhbmQgdGFibGUgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugc25ha2VfY2FzZSBzbyB0aGV5IGNhbiBiZSByZWZlcmVuY2VkXG4vLy8gZnJvbSBgZGVwZW5kc09uYCBhbmQgZm9yZWlnbiBrZXlzLCB3aG9zZSBwYXR0ZXJucyByZXF1aXJlIHRoZSBzYW1lIHNoYXBlLlxuY29uc3QgTkFNRV9SRSA9IC9eW2EtejAtOV9dKyQvO1xuXG4vKipcbiAqIExvYWQgYSBkYXRhc2V0IHJvb3QgaW50byBhIGBXb3JsZGAuXG4gKlxuICogQHBhcmFtIHJvb3REaXIgQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGF0YXNldCByb290LlxuICogQHJldHVybnMgVGhlIGxvYWRlZCB3b3JsZCBwbHVzIGxvYWQtdGltZSB2aW9sYXRpb25zLlxuICogQHRocm93cyBFcnJvciBXaGVuIGByb290RGlyYCBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJvb3Qocm9vdERpcjogc3RyaW5nKTogTG9hZE91dGNvbWUge1xuICAgIGNvbnN0IGFic29sdXRlUm9vdCA9IHBhdGgucmVzb2x2ZShyb290RGlyKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzb2x1dGVSb290KSB8fCAhZnMuc3RhdFN5bmMoYWJzb2x1dGVSb290KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YXNldCByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHthYnNvbHV0ZVJvb3R9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIExvYWRlZFNjaGVtYT4oKTtcbiAgICBjb25zdCB0YWJsZXMgPSBuZXcgTWFwPHN0cmluZywgVGFibGVUeXBlQmFzZT4oKTtcblxuICAgIGNvbnN0IHNjaGVtYURpcnMgPSBmcy5yZWFkZGlyU3luYyhhYnNvbHV0ZVJvb3QsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpICYmICFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWFEaXIgb2Ygc2NoZW1hRGlycykge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gc2NoZW1hRGlyLm5hbWU7XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4oYWJzb2x1dGVSb290LCBzY2hlbWFOYW1lKTtcblxuICAgICAgICBpZiAoIU5BTUVfUkUudGVzdChzY2hlbWFOYW1lKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBkaXJQYXRoLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzY2hlbWEgbmFtZSBcIiR7c2NoZW1hTmFtZX1cIiBtdXN0IGJlIGxvd2VyY2FzZSBzbmFrZV9jYXNlIChtYXRjaGluZyAke05BTUVfUkV9KWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NGaWxlTmFtZSA9IGAke3NjaGVtYU5hbWV9Lmpzb25gO1xuICAgICAgICBjb25zdCBqc29uRmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLmpzb24nKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogU2NoZW1hRGVzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgbG9hZGVkVGFibGVzOiBUYWJsZVR5cGVCYXNlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YganNvbkZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAgICAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0ZJTEVfUEFSU0VfRVJST1InLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW52YWxpZCBKU09OOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlsZSA9PT0gZGVzY0ZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCdzY2hlbWEnLCBwYXJzZWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RydWN0dXJhbEVycm9yIG9mIHN0cnVjdHVyYWwuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfVkFMSURBVElPTicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogc3RydWN0dXJhbEVycm9yLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbm9ybWFsaXplU2NoZW1hRGVzY3JpcHRpb24ocGFyc2VkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmlsZS5zbGljZSgwLCAtJy5qc29uJy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgcXVhbGlmaWVkTmFtZSA9IGAke3NjaGVtYU5hbWV9LiR7dGFibGVOYW1lfWA7XG5cbiAgICAgICAgICAgIGlmICghTkFNRV9SRS50ZXN0KHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1RBQkxFX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgbmFtZSBcIiR7dGFibGVOYW1lfVwiIG11c3QgYmUgbG93ZXJjYXNlIHNuYWtlX2Nhc2UgKG1hdGNoaW5nICR7TkFNRV9SRX0pYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCd0YWJsZScsIHBhcnNlZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0cnVjdHVyYWxFcnJvciBvZiBzdHJ1Y3R1cmFsLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX1ZBTElEQVRJT04nLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzdHJ1Y3R1cmFsRXJyb3IuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkVGFibGUgPSBjcmVhdGVUYWJsZVR5cGUoe1xuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsbHlWYWxpZDogc3RydWN0dXJhbC52YWxpZCxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiBub3JtYWxpemVUYWJsZURlZmluaXRpb24ocGFyc2VkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZGVkVGFibGVzLnB1c2gobG9hZGVkVGFibGUpO1xuICAgICAgICAgICAgdGFibGVzLnNldChxdWFsaWZpZWROYW1lLCBsb2FkZWRUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9ERVNDX1BSRVNFTlQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4oZGlyUGF0aCwgZGVzY0ZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc2NoZW1hIFwiJHtzY2hlbWFOYW1lfVwiIGlzIG1pc3NpbmcgaXRzIGRlc2NyaXB0aW9uIGZpbGUgXCIke2Rlc2NGaWxlTmFtZX1cImAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVtYXMuc2V0KHNjaGVtYU5hbWUsIHtcbiAgICAgICAgICAgIG5hbWU6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0YWJsZXM6IGxvYWRlZFRhYmxlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgIHJvb3REaXI6IGFic29sdXRlUm9vdCxcbiAgICAgICAgICAgIHNjaGVtYXMsXG4gICAgICAgICAgICB0YWJsZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHZpb2xhdGlvbnMsXG4gICAgfTtcbn1cbiJdfQ==
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3UUgsNEJBd0lDO0FBOVlELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFnQjdCLDZDQUVzQjtBQUl0QixxREFFZ0M7QUFlaEMsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFnQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDL0YsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEtBQWM7SUFDM0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM1QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDN0IsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDckMsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDcEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMs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O1lBQ2hCLE9BQU87WUFDUCxXQUFXO1lBQ1gsTUFBTSxFQUFFLFlBQVk7U0FDdkIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU87UUFDSCxLQUFLLEVBQUU7WUFDSCxPQUFPLEVBQUUsWUFBWTtZQUNyQixPQUFPO1lBQ1AsTUFBTTtTQUNUO1FBQ0QsVUFBVTtLQUNiLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaWxlc3lzdGVtIGxvYWRlci4gV2Fsa3MgYSBkYXRhc2V0IHJvb3QsIHBhcnNlcyBlYWNoIEpTT04gZmlsZSwgcnVucyBMYXllciAxXG4gKiBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24sIGFuZCBub3JtYWxpemVzIGV2ZXJ5dGhpbmcgaW50byBhIGBXb3JsZGAgb2ZcbiAqIGNvbmNyZXRlIGBUYWJsZVR5cGVCYXNlYCBpbnN0YW5jZXMgdGhhdCB0aGUgc2VtYW50aWMgcnVsZXMgb3BlcmF0ZSBvbi5cbiAqXG4gKiBQYXJzZSBlcnJvcnMsIHN0cnVjdHVyYWwgZXJyb3JzLCBhbmQgYSBtaXNzaW5nIHNjaGVtYS1kZXNjcmlwdGlvbiBmaWxlIGFyZVxuICogcmVwb3J0ZWQgaGVyZTsgYWxsIGNyb3NzLWZpZWxkIC8gY3Jvc3MtZmlsZSBsb2dpYyBsaXZlcyBpbiB0aGUgdGFibGUtdHlwZVxuICogY2xhc3NlcyAoYC4vdGFibGUtdHlwZS50c2AsIGAuL3RhYmxlLXR5cGVzLypgKS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge1xuICAgIEJ1Y2tldGluZyxcbiAgICBDaGVja0NvbnN0cmFpbnQsXG4gICAgQ29sdW1uLFxuICAgIEV4Y2x1c2lvbkNvbnN0cmFpbnQsXG4gICAgRm9yZWlnbktleSxcbiAgICBJbmRleCxcbiAgICBQYXJ0aXRpb24sXG4gICAgU2NoZW1hRGVzY3JpcHRpb24sXG4gICAgU29ydEZpZWxkLFxuICAgIFRhYmxlRGVmaW5pdGlvbixcbiAgICBVbmlxdWVDb25zdHJhaW50LFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIHZhbGlkYXRlU3RydWN0dXJlLFxufSBmcm9tICcuL3N0cnVjdHVyYWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxufSBmcm9tICcuL3RhYmxlLXR5cGUnO1xuaW1wb3J0IHtcbiAgICBjcmVhdGVUYWJsZVR5cGUsXG59IGZyb20gJy4vdGFibGUtdHlwZXMvcmVnaXN0cnknO1xuaW1wb3J0IHtcbiAgICBMb2FkZWRTY2hlbWEsXG4gICAgV29ybGQsXG59IGZyb20gJy4vd29ybGQnO1xuXG4vKiogUmVzdWx0IG9mIGxvYWRpbmcgYSByb290OiB0aGUgbW9kZWwgcGx1cyBhbnkgbG9hZC10aW1lIHZpb2xhdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRPdXRjb21lIHtcbiAgICAvKiogVGhlIGxvYWRlZCBtb2RlbC4gKi9cbiAgICByZWFkb25seSB3b3JsZDogV29ybGQ7XG5cbiAgICAvKiogUGFyc2UsIHN0cnVjdHVyYWwsIGFuZCBtaXNzaW5nLWRlc2NyaXB0aW9uIHZpb2xhdGlvbnMuICovXG4gICAgcmVhZG9ubHkgdmlvbGF0aW9uczogVmlvbGF0aW9uW107XG59XG5cbmZ1bmN0aW9uIGFzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiB7fTtcbn1cblxuZnVuY3Rpb24gYXNBcnJheSh2YWx1ZTogdW5rbm93bik6IHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcbn1cblxuZnVuY3Rpb24gYXNCb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gdmFsdWUgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXNPcHRpb25hbEJvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNPcHRpb25hbE51bWJlcih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNPcHRpb25hbFN0cmluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29sdW1ucyh2YWx1ZTogdW5rbm93bik6IENvbHVtbltdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IGFzU3RyaW5nKHJlY29yZC50eXBlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhc1N0cmluZyhyZWNvcmQuZGVzY3JpcHRpb24pLFxuICAgICAgICAgICAgbnVsbGFibGU6IGFzT3B0aW9uYWxCb29sZWFuKHJlY29yZC5udWxsYWJsZSksXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmdlbmVyYXRlZCksXG4gICAgICAgICAgICBleHByZXNzaW9uOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5leHByZXNzaW9uKSxcbiAgICAgICAgICAgIGV4cHJlc3Npb25Db2x1bW5zOiAnZXhwcmVzc2lvbkNvbHVtbnMnIGluIHJlY29yZCA/IGFzU3RyaW5nQXJyYXkocmVjb3JkLmV4cHJlc3Npb25Db2x1bW5zKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGlkZW50aXR5OiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5pZGVudGl0eSksXG4gICAgICAgICAgICBkZWZhdWx0OiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5kZWZhdWx0KSxcbiAgICAgICAgICAgIGNvbGxhdGlvbjogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuY29sbGF0aW9uKSxcbiAgICAgICAgICAgIGNvbXByZXNzaW9uOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5jb21wcmVzc2lvbiksXG4gICAgICAgICAgICBzdG9yYWdlOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5zdG9yYWdlKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFydGl0aW9ucyh2YWx1ZTogdW5rbm93bik6IFBhcnRpdGlvbltdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IGFzU3RyaW5nKHJlY29yZC50eXBlKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhc1N0cmluZyhyZWNvcmQuZGVzY3JpcHRpb24pLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTb3J0T3JkZXIodmFsdWU6IHVua25vd24pOiBTb3J0RmllbGRbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2x1bW46IGFzU3RyaW5nKHJlY29yZC5jb2x1bW4pLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC50cmFuc2Zvcm0pLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiBhc1N0cmluZyhyZWNvcmQuZGlyZWN0aW9uKSxcbiAgICAgICAgICAgIG51bGxPcmRlcjogYXNTdHJpbmcocmVjb3JkLm51bGxPcmRlciksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluZGV4ZXModmFsdWU6IHVua25vd24pOiBJbmRleFtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIG1ldGhvZDogYXNTdHJpbmcocmVjb3JkLm1ldGhvZCksXG4gICAgICAgICAgICB1bmlxdWU6IGFzT3B0aW9uYWxCb29sZWFuKHJlY29yZC51bmlxdWUpLFxuICAgICAgICAgICAgY29sdW1uczogYXNBcnJheShyZWNvcmQuY29sdW1ucykubWFwKChyYXdDb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5SZWNvcmQgPSBhc1JlY29yZChyYXdDb2x1bW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKGNvbHVtblJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydDogYXNPcHRpb25hbFN0cmluZyhjb2x1bW5SZWNvcmQuc29ydCksXG4gICAgICAgICAgICAgICAgICAgIG51bGxzOiBhc09wdGlvbmFsU3RyaW5nKGNvbHVtblJlY29yZC5udWxscyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgaW5jbHVkZTogYXNTdHJpbmdBcnJheShyZWNvcmQuaW5jbHVkZSksXG4gICAgICAgICAgICB3aGVyZTogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQud2hlcmUpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVVbmlxdWVDb25zdHJhaW50cyh2YWx1ZTogdW5rbm93bik6IFVuaXF1ZUNvbnN0cmFpbnRbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICBjb2x1bW5zOiBhc1N0cmluZ0FycmF5KHJlY29yZC5jb2x1bW5zKSxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3Q6IGFzT3B0aW9uYWxCb29sZWFuKHJlY29yZC5udWxsc05vdERpc3RpbmN0KSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ2hlY2tDb25zdHJhaW50cyh2YWx1ZTogdW5rbm93bik6IENoZWNrQ29uc3RyYWludFtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGFzU3RyaW5nKHJlY29yZC5leHByZXNzaW9uKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGFzU3RyaW5nQXJyYXkocmVjb3JkLmNvbHVtbnMpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeGNsdXNpb25Db25zdHJhaW50cyh2YWx1ZTogdW5rbm93bik6IEV4Y2x1c2lvbkNvbnN0cmFpbnRbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICB1c2luZzogYXNTdHJpbmcocmVjb3JkLnVzaW5nKSxcbiAgICAgICAgICAgIGVsZW1lbnRzOiBhc0FycmF5KHJlY29yZC5lbGVtZW50cykubWFwKChyYXdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudFJlY29yZCA9IGFzUmVjb3JkKHJhd0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYXNTdHJpbmcoZWxlbWVudFJlY29yZC5jb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogYXNTdHJpbmcoZWxlbWVudFJlY29yZC5vcGVyYXRvciksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVCdWNrZXRpbmcodmFsdWU6IHVua25vd24pOiBCdWNrZXRpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHZhbHVlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBhc1N0cmluZ0FycmF5KHJlY29yZC5jb2x1bW5zKSxcbiAgICAgICAgYnVja2V0Q291bnQ6IHR5cGVvZiByZWNvcmQuYnVja2V0Q291bnQgPT09ICdudW1iZXInID8gcmVjb3JkLmJ1Y2tldENvdW50IDogMCxcbiAgICAgICAgc29ydGVkQnk6IGFzQXJyYXkocmVjb3JkLnNvcnRlZEJ5KS5tYXAoKHJhdykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydFJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbjogYXNTdHJpbmcoc29ydFJlY29yZC5jb2x1bW4pLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogYXNTdHJpbmcoc29ydFJlY29yZC5kaXJlY3Rpb24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nTWFwKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQodmFsdWUpO1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW1xuICAgICAgICBrZXksXG4gICAgICAgIHJhdyxcbiAgICBdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByYXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHJhdztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGb3JlaWduS2V5cyh2YWx1ZTogdW5rbm93bik6IEZvcmVpZ25LZXlbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2VUYWJsZTogYXNTdHJpbmcocmVjb3JkLnNvdXJjZVRhYmxlKSxcbiAgICAgICAgICAgIHNvdXJjZUNvbHVtbjogYXNTdHJpbmcocmVjb3JkLnNvdXJjZUNvbHVtbiksXG4gICAgICAgICAgICBsb2NhbENvbHVtbjogYXNTdHJpbmcocmVjb3JkLmxvY2FsQ29sdW1uKSxcbiAgICAgICAgICAgIGFsbG93TnVsbHM6IGFzQm9vbGVhbihyZWNvcmQuYWxsb3dOdWxscyksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRhYmxlRGVmaW5pdGlvbihyYXc6IHVua25vd24pOiBUYWJsZURlZmluaXRpb24ge1xuICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3BlY1ZlcnNpb246IGFzU3RyaW5nKHJlY29yZC5zcGVjVmVyc2lvbiksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBhc1N0cmluZyhyZWNvcmQuZGVzY3JpcHRpb24pLFxuICAgICAgICB0YWJsZVR5cGU6IGFzU3RyaW5nKHJlY29yZC50YWJsZVR5cGUpLFxuICAgICAgICBpc1Jhd0RhdGE6IGFzQm9vbGVhbihyZWNvcmQuaXNSYXdEYXRhKSxcbiAgICAgICAgZm9ybWF0VmVyc2lvbjogYXNPcHRpb25hbE51bWJlcihyZWNvcmQuZm9ybWF0VmVyc2lvbiksXG4gICAgICAgIGNvbHVtbnM6IG5vcm1hbGl6ZUNvbHVtbnMocmVjb3JkLmNvbHVtbnMpLFxuICAgICAgICBwcmltYXJ5S2V5OiBhc1N0cmluZ0FycmF5KHJlY29yZC5wcmltYXJ5S2V5KSxcbiAgICAgICAgcGFydGl0aW9uczogbm9ybWFsaXplUGFydGl0aW9ucyhyZWNvcmQucGFydGl0aW9ucyksXG4gICAgICAgIHNvcnRPcmRlcjogbm9ybWFsaXplU29ydE9yZGVyKHJlY29yZC5zb3J0T3JkZXIpLFxuICAgICAgICBpZGVudGlmaWVyRmllbGRzOiBhc1N0cmluZ0FycmF5KHJlY29yZC5pZGVudGlmaWVyRmllbGRzKSxcbiAgICAgICAgaW5kZXhlczogbm9ybWFsaXplSW5kZXhlcyhyZWNvcmQuaW5kZXhlcyksXG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzOiBub3JtYWxpemVVbmlxdWVDb25zdHJhaW50cyhyZWNvcmQudW5pcXVlQ29uc3RyYWludHMpLFxuICAgICAgICBjaGVja0NvbnN0cmFpbnRzOiBub3JtYWxpemVDaGVja0NvbnN0cmFpbnRzKHJlY29yZC5jaGVja0NvbnN0cmFpbnRzKSxcbiAgICAgICAgZXhjbHVzaW9uQ29uc3RyYWludHM6IG5vcm1hbGl6ZUV4Y2x1c2lvbkNvbnN0cmFpbnRzKHJlY29yZC5leGNsdXNpb25Db25zdHJhaW50cyksXG4gICAgICAgIGJ1Y2tldGluZzogbm9ybWFsaXplQnVja2V0aW5nKHJlY29yZC5idWNrZXRpbmcpLFxuICAgICAgICB0YWJsZVByb3BlcnRpZXM6IG5vcm1hbGl6ZVN0cmluZ01hcChyZWNvcmQudGFibGVQcm9wZXJ0aWVzKSxcbiAgICAgICAgZGVwZW5kc09uOiBhc1N0cmluZ0FycmF5KHJlY29yZC5kZXBlbmRzT24pLFxuICAgICAgICBmb3JlaWduS2V5czogbm9ybWFsaXplRm9yZWlnbktleXMocmVjb3JkLmZvcmVpZ25LZXlzKSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY2hlbWFEZXNjcmlwdGlvbihyYXc6IHVua25vd24pOiBTY2hlbWFEZXNjcmlwdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgfTtcbn1cblxuLy8vIFNjaGVtYSBhbmQgdGFibGUgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugc25ha2VfY2FzZSBzbyB0aGV5IGNhbiBiZSByZWZlcmVuY2VkXG4vLy8gZnJvbSBgZGVwZW5kc09uYCBhbmQgZm9yZWlnbiBrZXlzLCB3aG9zZSBwYXR0ZXJucyByZXF1aXJlIHRoZSBzYW1lIHNoYXBlLlxuY29uc3QgTkFNRV9SRSA9IC9eW2EtejAtOV9dKyQvO1xuXG4vKipcbiAqIExvYWQgYSBkYXRhc2V0IHJvb3QgaW50byBhIGBXb3JsZGAuXG4gKlxuICogQHBhcmFtIHJvb3REaXIgQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGF0YXNldCByb290LlxuICogQHJldHVybnMgVGhlIGxvYWRlZCB3b3JsZCBwbHVzIGxvYWQtdGltZSB2aW9sYXRpb25zLlxuICogQHRocm93cyBFcnJvciBXaGVuIGByb290RGlyYCBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJvb3Qocm9vdERpcjogc3RyaW5nKTogTG9hZE91dGNvbWUge1xuICAgIGNvbnN0IGFic29sdXRlUm9vdCA9IHBhdGgucmVzb2x2ZShyb290RGlyKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzb2x1dGVSb290KSB8fCAhZnMuc3RhdFN5bmMoYWJzb2x1dGVSb290KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YXNldCByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHthYnNvbHV0ZVJvb3R9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIExvYWRlZFNjaGVtYT4oKTtcbiAgICBjb25zdCB0YWJsZXMgPSBuZXcgTWFwPHN0cmluZywgVGFibGVUeXBlQmFzZT4oKTtcblxuICAgIGNvbnN0IHNjaGVtYURpcnMgPSBmcy5yZWFkZGlyU3luYyhhYnNvbHV0ZVJvb3QsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpICYmICFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWFEaXIgb2Ygc2NoZW1hRGlycykge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gc2NoZW1hRGlyLm5hbWU7XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4oYWJzb2x1dGVSb290LCBzY2hlbWFOYW1lKTtcblxuICAgICAgICBpZiAoIU5BTUVfUkUudGVzdChzY2hlbWFOYW1lKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBkaXJQYXRoLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzY2hlbWEgbmFtZSBcIiR7c2NoZW1hTmFtZX1cIiBtdXN0IGJlIGxvd2VyY2FzZSBzbmFrZV9jYXNlIChtYXRjaGluZyAke05BTUVfUkV9KWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NGaWxlTmFtZSA9IGAke3NjaGVtYU5hbWV9Lmpzb25gO1xuICAgICAgICBjb25zdCBqc29uRmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLmpzb24nKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogU2NoZW1hRGVzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgbG9hZGVkVGFibGVzOiBUYWJsZVR5cGVCYXNlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YganNvbkZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAgICAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0ZJTEVfUEFSU0VfRVJST1InLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW52YWxpZCBKU09OOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlsZSA9PT0gZGVzY0ZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCdzY2hlbWEnLCBwYXJzZWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RydWN0dXJhbEVycm9yIG9mIHN0cnVjdHVyYWwuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfVkFMSURBVElPTicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogc3RydWN0dXJhbEVycm9yLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbm9ybWFsaXplU2NoZW1hRGVzY3JpcHRpb24ocGFyc2VkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmlsZS5zbGljZSgwLCAtJy5qc29uJy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgcXVhbGlmaWVkTmFtZSA9IGAke3NjaGVtYU5hbWV9LiR7dGFibGVOYW1lfWA7XG5cbiAgICAgICAgICAgIGlmICghTkFNRV9SRS50ZXN0KHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1RBQkxFX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgbmFtZSBcIiR7dGFibGVOYW1lfVwiIG11c3QgYmUgbG93ZXJjYXNlIHNuYWtlX2Nhc2UgKG1hdGNoaW5nICR7TkFNRV9SRX0pYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCd0YWJsZScsIHBhcnNlZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0cnVjdHVyYWxFcnJvciBvZiBzdHJ1Y3R1cmFsLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX1ZBTElEQVRJT04nLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzdHJ1Y3R1cmFsRXJyb3IuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkVGFibGUgPSBjcmVhdGVUYWJsZVR5cGUoe1xuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsbHlWYWxpZDogc3RydWN0dXJhbC52YWxpZCxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiBub3JtYWxpemVUYWJsZURlZmluaXRpb24ocGFyc2VkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZGVkVGFibGVzLnB1c2gobG9hZGVkVGFibGUpO1xuICAgICAgICAgICAgdGFibGVzLnNldChxdWFsaWZpZWROYW1lLCBsb2FkZWRUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9ERVNDX1BSRVNFTlQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4oZGlyUGF0aCwgZGVzY0ZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc2NoZW1hIFwiJHtzY2hlbWFOYW1lfVwiIGlzIG1pc3NpbmcgaXRzIGRlc2NyaXB0aW9uIGZpbGUgXCIke2Rlc2NGaWxlTmFtZX1cImAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVtYXMuc2V0KHNjaGVtYU5hbWUsIHtcbiAgICAgICAgICAgIG5hbWU6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0YWJsZXM6IGxvYWRlZFRhYmxlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgIHJvb3REaXI6IGFic29sdXRlUm9vdCxcbiAgICAgICAgICAgIHNjaGVtYXMsXG4gICAgICAgICAgICB0YWJsZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHZpb2xhdGlvbnMsXG4gICAgfTtcbn1cbiJdfQ==
@@ -150,6 +150,25 @@ export interface Bucketing {
150
150
  /** Optional intra-bucket sort columns. */
151
151
  readonly sortedBy: BucketSort[];
152
152
  }
153
+ /** One element of an exclusion constraint: a column and its operator. */
154
+ export interface ExclusionElement {
155
+ /** Column the element applies to. */
156
+ readonly column: string;
157
+ /** Opaque operator (e.g. `&&`, `=`). */
158
+ readonly operator: string;
159
+ }
160
+ /**
161
+ * An exclusion constraint (Postgres): no two rows may have all listed
162
+ * column/operator pairs evaluate true together (generalized uniqueness).
163
+ */
164
+ export interface ExclusionConstraint {
165
+ /** Constraint name (unique within the table). */
166
+ readonly name: string;
167
+ /** Index access method (`gist` or `spgist`). */
168
+ readonly using: string;
169
+ /** Column/operator elements. */
170
+ readonly elements: ExclusionElement[];
171
+ }
153
172
  /** A foreign-key reference to a column in another table. */
154
173
  export interface ForeignKey {
155
174
  /** Referenced table in `schema.table` format. */
@@ -184,12 +203,16 @@ export interface TableDefinition {
184
203
  readonly partitions: Partition[];
185
204
  /** Iceberg sort order (ordered sort fields). Optional; other engines ignore it. */
186
205
  readonly sortOrder: SortField[];
206
+ /** Iceberg identifier fields (the row-identity / equality-delete key). Optional. */
207
+ readonly identifierFields: string[];
187
208
  /** Secondary indexes (Postgres). Optional; other engines ignore them. */
188
209
  readonly indexes: Index[];
189
210
  /** UNIQUE constraints (Postgres). Optional; other engines ignore them. */
190
211
  readonly uniqueConstraints: UniqueConstraint[];
191
212
  /** CHECK constraints (Postgres). Optional; other engines ignore them. */
192
213
  readonly checkConstraints: CheckConstraint[];
214
+ /** Exclusion constraints (Postgres). Optional; other engines ignore them. */
215
+ readonly exclusionConstraints: ExclusionConstraint[];
193
216
  /** Hive bucketing spec. Optional; other engines ignore it. */
194
217
  readonly bucketing?: Bucketing;
195
218
  /**
package/dist/src/model.js CHANGED
@@ -23,4 +23,4 @@ exports.TABLE_TYPES = [
23
23
  TableType.ICEBERG_PARQUET,
24
24
  TableType.POSTGRES_18,
25
25
  ];
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gbWF5IGhvbGQgbnVsbC4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbnVsbGFiaWxpdHkgaXNcbiAgICAgKiB1bnNwZWNpZmllZCBhbmQgdGhlIG51bGxhYmlsaXR5IGNyb3NzLWNoZWNrcyBkbyBub3QgZmlyZS4gYGZhbHNlYCBtYXJrcyBhXG4gICAgICogTk9UIE5VTEwgY29sdW1uIChJY2ViZXJnIGByZXF1aXJlZGApOyBgdHJ1ZWAgbWFya3MgYW4gZXhwbGljaXRseSBudWxsYWJsZVxuICAgICAqIGNvbHVtbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBudWxsYWJsZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQtY29sdW1uIGtpbmQgKFBvc3RncmVzKTogYHN0b3JlZGAgb3IgYHZpcnR1YWxgLiBPcHRpb25hbDsgd2hlblxuICAgICAqIHNldCwgdGhlIGNvbHVtbiBpcyBjb21wdXRlZCBmcm9tIGBleHByZXNzaW9uQ29sdW1uc2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZ2VuZXJhdGVkPzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBnZW5lcmF0aW9uIGV4cHJlc3Npb24gKFBvc3RncmVzIGdlbmVyYXRlZCBjb2x1bW4pLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb24/OiBzdHJpbmc7XG5cbiAgICAvKiogQ29sdW1ucyB0aGUgZ2VuZXJhdGlvbiBgZXhwcmVzc2lvbmAgcmVmZXJlbmNlcyAoUG9zdGdyZXMpLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb25Db2x1bW5zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGl0eS1jb2x1bW4ga2luZCAoUG9zdGdyZXMpOiBgYWx3YXlzYCBvciBgYnlEZWZhdWx0YC4gT3B0aW9uYWw7IHdoZW5cbiAgICAgKiBzZXQsIHRoZSBjb2x1bW4gaXMgYEdFTkVSQVRFRCDigKYgQVMgSURFTlRJVFlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBjb2x1bW4gZGVmYXVsdCBleHByZXNzaW9uIChQb3N0Z3JlcykuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdD86IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW4gY29sbGF0aW9uIG5hbWUgKFBvc3RncmVzKS4gT3BhcXVlOyBsZWdhbCBvbmx5IG9uIHRleHQgdHlwZXMuICovXG4gICAgcmVhZG9ubHkgY29sbGF0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqIFBlci1jb2x1bW4gVE9BU1QgY29tcHJlc3Npb24gKFBvc3RncmVzKTogYHBnbHpgIG9yIGBsejRgLiAqL1xuICAgIHJlYWRvbmx5IGNvbXByZXNzaW9uPzogc3RyaW5nO1xuXG4gICAgLyoqIFBlci1jb2x1bW4gc3RvcmFnZSBzdHJhdGVneSAoUG9zdGdyZXMpOiBgcGxhaW5gL2BleHRlcm5hbGAvYGV4dGVuZGVkYC9gbWFpbmAvYGRlZmF1bHRgLiAqL1xuICAgIHJlYWRvbmx5IHN0b3JhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwYXJ0aXRpb24gZW50cnkuIFRoZSBtZWFuaW5nIG9mIGBuYW1lYCBhbmQgYHR5cGVgIGlzIGVuZ2luZS1zcGVjaWZpYzogZm9yXG4gKiBIaXZlLCBgbmFtZWAgaXMgYSBuZXcgcGFydGl0aW9uIGNvbHVtbiBhbmQgYHR5cGVgIGlzIGEgbm9ybWFsIHR5cGU7IGZvclxuICogSWNlYmVyZywgYG5hbWVgIGlzIGEgc291cmNlIGRhdGEgY29sdW1uIGFuZCBgdHlwZWAgaXMgYSB0cmFuc2Zvcm07IGZvclxuICogUG9zdGdyZXMsIGBuYW1lYCBpcyBhbiBleGlzdGluZyBrZXkgY29sdW1uIGFuZCBgdHlwZWAgaXMgdGhlIHN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpdGlvbiB7XG4gICAgLyoqIEhpdmU6IG5ldyBwYXJ0aXRpb24gY29sdW1uIG5hbWUuIEljZWJlcmcgLyBQb3N0Z3JlczogZXhpc3RpbmcgZGF0YS9rZXkgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEhpdmU6IGEgbm9ybWFsIHR5cGUuIEljZWJlcmc6IGEgdHJhbnNmb3JtIChlLmcuIGBkYXlgLCBgYnVja2V0WzE2XWApLiBQb3N0Z3JlczogYSBzdHJhdGVneSAoYHJhbmdlYCAvIGBsaXN0YCAvIGBoYXNoYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgc29ydCBmaWVsZCBpbiBhbiBJY2ViZXJnIHRhYmxlJ3Mgc29ydCBvcmRlci4gYGNvbHVtbmAgaXMgYSBkYXRhXG4gKiBjb2x1bW47IGB0cmFuc2Zvcm1gIGlzIGFuIG9wdGlvbmFsIEljZWJlcmcgdHJhbnNmb3JtIGFwcGxpZWQgYmVmb3JlIHNvcnRpbmdcbiAqIChkZWZhdWx0cyB0byBpZGVudGl0eSk7IGBkaXJlY3Rpb25gIGFuZCBgbnVsbE9yZGVyYCBzZXQgdGhlIG9yZGVyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRGaWVsZCB7XG4gICAgLyoqIFNvdXJjZSBkYXRhIGNvbHVtbiB0byBzb3J0IGJ5LiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIE9wdGlvbmFsIEljZWJlcmcgdHJhbnNmb3JtIGFwcGxpZWQgYmVmb3JlIHNvcnRpbmcgKGUuZy4gYGRheWAsIGBidWNrZXRbMTZdYCkuICovXG4gICAgcmVhZG9ubHkgdHJhbnNmb3JtPzogc3RyaW5nO1xuXG4gICAgLyoqIFNvcnQgZGlyZWN0aW9uIChgYXNjYCBvciBgZGVzY2ApLiAqL1xuICAgIHJlYWRvbmx5IGRpcmVjdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqIE51bGwgb3JkZXJpbmcgKGBudWxscy1maXJzdGAgb3IgYG51bGxzLWxhc3RgKS4gKi9cbiAgICByZWFkb25seSBudWxsT3JkZXI6IHN0cmluZztcbn1cblxuLyoqIEEgc2luZ2xlIGtleSBjb2x1bW4gd2l0aGluIGFuIGluZGV4LCB3aXRoIG9wdGlvbmFsIG9yZGVyaW5nIG1vZGlmaWVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhDb2x1bW4ge1xuICAgIC8qKiBJbmRleGVkIGNvbHVtbiBuYW1lLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBPcHRpb25hbCBzb3J0IG9yZGVyIChgYXNjYCBvciBgZGVzY2ApLiAqL1xuICAgIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG5cbiAgICAvKiogT3B0aW9uYWwgbnVsbCBvcmRlcmluZyAoYGZpcnN0YCBvciBgbGFzdGApLiAqL1xuICAgIHJlYWRvbmx5IG51bGxzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2Vjb25kYXJ5IGluZGV4IChlLmcuIFBvc3RncmVzKS4gYGNvbHVtbnNgIGFyZSB0aGUga2V5IGNvbHVtbnM7IGBpbmNsdWRlYFxuICogYXJlIG5vbi1rZXkgY292ZXJpbmcgY29sdW1uczsgYHdoZXJlYCBpcyBhbiBvcGFxdWUgcGFydGlhbC1pbmRleCBwcmVkaWNhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXgge1xuICAgIC8qKiBJbmRleCBuYW1lICh1bmlxdWUgd2l0aGluIHRoZSB0YWJsZSkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEFjY2VzcyBtZXRob2QgKGUuZy4gYGJ0cmVlYCwgYGhhc2hgLCBgZ2luYCkuICovXG4gICAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgaW5kZXggZW5mb3JjZXMgdW5pcXVlbmVzcy4gKi9cbiAgICByZWFkb25seSB1bmlxdWU/OiBib29sZWFuO1xuXG4gICAgLyoqIEtleSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IEluZGV4Q29sdW1uW107XG5cbiAgICAvKiogTm9uLWtleSBjb3ZlcmluZyBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGluY2x1ZGU6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE9wdGlvbmFsIHBhcnRpYWwtaW5kZXggcHJlZGljYXRlIChvcGFxdWUpLiAqL1xuICAgIHJlYWRvbmx5IHdoZXJlPzogc3RyaW5nO1xufVxuXG4vKiogQSB0YWJsZS1sZXZlbCBVTklRVUUgY29uc3RyYWludCBvdmVyIG9uZSBvciBtb3JlIGNvbHVtbnMgKFBvc3RncmVzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7XG4gICAgLyoqIENvbnN0cmFpbnQgbmFtZSAodW5pcXVlIHdpdGhpbiB0aGUgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW5zIHRoZSBjb25zdHJhaW50IHNwYW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIFdoZXRoZXIgbnVsbHMgYXJlIHRyZWF0ZWQgYXMgbm90IGRpc3RpbmN0IChgTlVMTFMgTk9UIERJU1RJTkNUYCkuICovXG4gICAgcmVhZG9ubHkgbnVsbHNOb3REaXN0aW5jdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBDSEVDSyBjb25zdHJhaW50IChQb3N0Z3JlcykuIGBleHByZXNzaW9uYCBpcyBhbiBvcGFxdWUgcHJlZGljYXRlOyBgY29sdW1uc2BcbiAqIGlzIHRoZSBleHBsaWNpdCBsaXN0IG9mIGNvbHVtbnMgaXQgcmVmZXJlbmNlcywgd2hpY2ggaXMgd2hhdCBnZXRzIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0NvbnN0cmFpbnQge1xuICAgIC8qKiBDb25zdHJhaW50IG5hbWUgKHVuaXF1ZSB3aXRoaW4gdGhlIHRhYmxlKS4gKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogT3BhcXVlIGJvb2xlYW4gcHJlZGljYXRlLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb246IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW5zIHRoZSBwcmVkaWNhdGUgcmVmZXJlbmNlcy4gKi9cbiAgICByZWFkb25seSBjb2x1bW5zOiBzdHJpbmdbXTtcbn1cblxuLyoqIEEgc29ydCBjb2x1bW4gd2l0aGluIGEgSGl2ZSBidWNrZXRpbmcgc3BlYy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U29ydCB7XG4gICAgLyoqIENvbHVtbiB0byBzb3J0IGVhY2ggYnVja2V0IGJ5LiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIFNvcnQgZGlyZWN0aW9uIChgYXNjYCBvciBgZGVzY2AsIGNhc2UtaW5zZW5zaXRpdmUpLiAqL1xuICAgIHJlYWRvbmx5IGRpcmVjdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhpdmUgYnVja2V0aW5nIChgQ0xVU1RFUkVEIEJZIOKApiBJTlRPIE4gQlVDS0VUUyBbU09SVEVEIEJZIOKApl1gKS4gYGNvbHVtbnNgIGFyZVxuICogdGhlIGJ1Y2tldC1rZXkgY29sdW1ucywgYGJ1Y2tldENvdW50YCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIGFuZCBgc29ydGVkQnlgXG4gKiB0aGUgb3B0aW9uYWwgaW50cmEtYnVja2V0IHNvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0aW5nIHtcbiAgICAvKiogQnVja2V0LWtleSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE51bWJlciBvZiBidWNrZXRzLiAqL1xuICAgIHJlYWRvbmx5IGJ1Y2tldENvdW50OiBudW1iZXI7XG5cbiAgICAvKiogT3B0aW9uYWwgaW50cmEtYnVja2V0IHNvcnQgY29sdW1ucy4gKi9cbiAgICByZWFkb25seSBzb3J0ZWRCeTogQnVja2V0U29ydFtdO1xufVxuXG4vKiogQSBmb3JlaWduLWtleSByZWZlcmVuY2UgdG8gYSBjb2x1bW4gaW4gYW5vdGhlciB0YWJsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWlnbktleSB7XG4gICAgLyoqIFJlZmVyZW5jZWQgdGFibGUgaW4gYHNjaGVtYS50YWJsZWAgZm9ybWF0LiAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZVRhYmxlOiBzdHJpbmc7XG5cbiAgICAvKiogUmVmZXJlbmNlZCBjb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZS4gKi9cbiAgICByZWFkb25seSBzb3VyY2VDb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBMb2NhbCBjb2x1bW4gdGhhdCBob2xkcyB0aGUgcmVmZXJlbmNlLiAqL1xuICAgIHJlYWRvbmx5IGxvY2FsQ29sdW1uOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbG9jYWwgY29sdW1uIG1heSBiZSBudWxsLiAqL1xuICAgIHJlYWRvbmx5IGFsbG93TnVsbHM6IGJvb2xlYW47XG59XG5cbi8qKiBOb3JtYWxpemVkIHRhYmxlIGRlZmluaXRpb24gKG9wdGlvbmFsIGFycmF5cyBkZWZhdWx0ZWQgdG8gZW1wdHkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZURlZmluaXRpb24ge1xuICAgIC8qKiBTcGVjIHZlcnNpb24gb2YgdGhlIGZpbGUuICovXG4gICAgcmVhZG9ubHkgc3BlY1ZlcnNpb246IHN0cmluZztcblxuICAgIC8qKiBIdW1hbiBkZXNjcmlwdGlvbi4gKi9cbiAgICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqIEVuZ2luZS4gTWF5IGJlIGFuIHVua25vd24gc3RyaW5nIGlmIHRoZSBmaWxlIGZhaWxlZCBzdHJ1Y3R1cmFsIGNoZWNrcy4gKi9cbiAgICByZWFkb25seSB0YWJsZVR5cGU6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoaXMgdGFibGUgaXMgdGhlIHRvcCBvZiB0aGUgcGlwZWxpbmUuICovXG4gICAgcmVhZG9ubHkgaXNSYXdEYXRhOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSWNlYmVyZyB0YWJsZSBmb3JtYXQgdmVyc2lvbiAoMSwgMiwgb3IgMykuIE9wdGlvbmFsIGFuZCBlbmdpbmUtc3BlY2lmaWM6XG4gICAgICogb25seSB0aGUgSWNlYmVyZyBlbmdpbmUgdmFsaWRhdGVzIGl0LiBPdGhlciBlbmdpbmVzIGlnbm9yZSBpdC5cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3JtYXRWZXJzaW9uPzogbnVtYmVyO1xuXG4gICAgLyoqIERhdGEgY29sdW1ucy4gKi9cbiAgICByZWFkb25seSBjb2x1bW5zOiBDb2x1bW5bXTtcblxuICAgIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4gbmFtZXMuICovXG4gICAgcmVhZG9ubHkgcHJpbWFyeUtleTogc3RyaW5nW107XG5cbiAgICAvKiogUGFydGl0aW9uIGVudHJpZXMgKGVuZ2luZS1zcGVjaWZpYyBzZW1hbnRpY3MpLiAqL1xuICAgIHJlYWRvbmx5IHBhcnRpdGlvbnM6IFBhcnRpdGlvbltdO1xuXG4gICAgLyoqIEljZWJlcmcgc29ydCBvcmRlciAob3JkZXJlZCBzb3J0IGZpZWxkcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSBpdC4gKi9cbiAgICByZWFkb25seSBzb3J0T3JkZXI6IFNvcnRGaWVsZFtdO1xuXG4gICAgLyoqIFNlY29uZGFyeSBpbmRleGVzIChQb3N0Z3JlcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSB0aGVtLiAqL1xuICAgIHJlYWRvbmx5IGluZGV4ZXM6IEluZGV4W107XG5cbiAgICAvKiogVU5JUVVFIGNvbnN0cmFpbnRzIChQb3N0Z3JlcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSB0aGVtLiAqL1xuICAgIHJlYWRvbmx5IHVuaXF1ZUNvbnN0cmFpbnRzOiBVbmlxdWVDb25zdHJhaW50W107XG5cbiAgICAvKiogQ0hFQ0sgY29uc3RyYWludHMgKFBvc3RncmVzKS4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIHRoZW0uICovXG4gICAgcmVhZG9ubHkgY2hlY2tDb25zdHJhaW50czogQ2hlY2tDb25zdHJhaW50W107XG5cbiAgICAvKiogSGl2ZSBidWNrZXRpbmcgc3BlYy4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIGl0LiAqL1xuICAgIHJlYWRvbmx5IGJ1Y2tldGluZz86IEJ1Y2tldGluZztcblxuICAgIC8qKlxuICAgICAqIEVuZ2luZSB0YWJsZSBwcm9wZXJ0aWVzIGFzIGEgc3RyaW5n4oaSc3RyaW5nIG1hcCAoZS5nLiBJY2ViZXJnXG4gICAgICogYHdyaXRlLnRhcmdldC1maWxlLXNpemUtYnl0ZXNgLCBIaXZlIGBwYXJxdWV0LmNvbXByZXNzaW9uYCkuIE9wdGlvbmFsLlxuICAgICAqIE9ubHkga2V5cyB3aXRoIGEga25vd24sIGNsb3NlZCBsZWdhbCBkb21haW4gYXJlIHZhbGlkYXRlZCBwZXIgZW5naW5lO1xuICAgICAqIHVua25vd24ga2V5cyBwYXNzIHRocm91Z2ggdW52YWxpZGF0ZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdGFibGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgLyoqIFVwc3RyZWFtIHRhYmxlcyBpbiBgc2NoZW1hLnRhYmxlYCBmb3JtYXQuICovXG4gICAgcmVhZG9ubHkgZGVwZW5kc09uOiBzdHJpbmdbXTtcblxuICAgIC8qKiBGb3JlaWduIGtleXMuICovXG4gICAgcmVhZG9ubHkgZm9yZWlnbktleXM6IEZvcmVpZ25LZXlbXTtcbn1cblxuLyoqIEEgc2NoZW1hLWRlc2NyaXB0aW9uIGZpbGUncyBub3JtYWxpemVkIGNvbnRlbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYURlc2NyaXB0aW9uIHtcbiAgICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSBmaWxlLiAqL1xuICAgIHJlYWRvbmx5IHNwZWNWZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4gZGVzY3JpcHRpb24uICovXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLyoqIFNldmVyaXR5IG9mIGEgdmlvbGF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgVmlvbGF0aW9uTGV2ZWwgPSAnZXJyb3InIHwgJ3dhcm5pbmcnO1xuXG4vKiogQSBzaW5nbGUgdmFsaWRhdGlvbiBmaW5kaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW9sYXRpb24ge1xuICAgIC8qKiBTZXZlcml0eS4gYGVycm9yYCBmYWlscyB2YWxpZGF0aW9uOyBgd2FybmluZ2AgZG9lcyBub3QuICovXG4gICAgcmVhZG9ubHkgbGV2ZWw6IFZpb2xhdGlvbkxldmVsO1xuXG4gICAgLyoqIFN0YWJsZSBtYWNoaW5lLXJlYWRhYmxlIHJ1bGUgY29kZSAoZS5nLiBgUEtfQ09MVU1OU19FWElTVGApLiAqL1xuICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblxuICAgIC8qKiBPd25pbmcgc2NoZW1hLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHNjaGVtYT86IHN0cmluZztcblxuICAgIC8qKiBPd25pbmcgdGFibGUsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgdGFibGU/OiBzdHJpbmc7XG5cbiAgICAvKiogRmllbGQgcGF0aCB3aXRoaW4gdGhlIGZpbGUsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgZmllbGQ/OiBzdHJpbmc7XG5cbiAgICAvKiogU291cmNlIGZpbGUgcGF0aCwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuICovXG4gICAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKiogVGhlIGFnZ3JlZ2F0ZSByZXN1bHQgb2YgdmFsaWRhdGluZyBhIHJvb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICAgIC8qKiBUcnVlIHdoZW4gdGhlcmUgYXJlIG5vIGBlcnJvcmAtbGV2ZWwgdmlvbGF0aW9ucy4gKi9cbiAgICByZWFkb25seSBvazogYm9vbGVhbjtcblxuICAgIC8qKiBBbGwgZmluZGluZ3MsIGVycm9ycyBhbmQgd2FybmluZ3MuICovXG4gICAgcmVhZG9ubHkgdmlvbGF0aW9uczogVmlvbGF0aW9uW107XG59XG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gbWF5IGhvbGQgbnVsbC4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbnVsbGFiaWxpdHkgaXNcbiAgICAgKiB1bnNwZWNpZmllZCBhbmQgdGhlIG51bGxhYmlsaXR5IGNyb3NzLWNoZWNrcyBkbyBub3QgZmlyZS4gYGZhbHNlYCBtYXJrcyBhXG4gICAgICogTk9UIE5VTEwgY29sdW1uIChJY2ViZXJnIGByZXF1aXJlZGApOyBgdHJ1ZWAgbWFya3MgYW4gZXhwbGljaXRseSBudWxsYWJsZVxuICAgICAqIGNvbHVtbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBudWxsYWJsZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQtY29sdW1uIGtpbmQgKFBvc3RncmVzKTogYHN0b3JlZGAgb3IgYHZpcnR1YWxgLiBPcHRpb25hbDsgd2hlblxuICAgICAqIHNldCwgdGhlIGNvbHVtbiBpcyBjb21wdXRlZCBmcm9tIGBleHByZXNzaW9uQ29sdW1uc2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZ2VuZXJhdGVkPzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBnZW5lcmF0aW9uIGV4cHJlc3Npb24gKFBvc3RncmVzIGdlbmVyYXRlZCBjb2x1bW4pLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb24/OiBzdHJpbmc7XG5cbiAgICAvKiogQ29sdW1ucyB0aGUgZ2VuZXJhdGlvbiBgZXhwcmVzc2lvbmAgcmVmZXJlbmNlcyAoUG9zdGdyZXMpLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb25Db2x1bW5zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGl0eS1jb2x1bW4ga2luZCAoUG9zdGdyZXMpOiBgYWx3YXlzYCBvciBgYnlEZWZhdWx0YC4gT3B0aW9uYWw7IHdoZW5cbiAgICAgKiBzZXQsIHRoZSBjb2x1bW4gaXMgYEdFTkVSQVRFRCDigKYgQVMgSURFTlRJVFlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBjb2x1bW4gZGVmYXVsdCBleHByZXNzaW9uIChQb3N0Z3JlcykuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdD86IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW4gY29sbGF0aW9uIG5hbWUgKFBvc3RncmVzKS4gT3BhcXVlOyBsZWdhbCBvbmx5IG9uIHRleHQgdHlwZXMuICovXG4gICAgcmVhZG9ubHkgY29sbGF0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqIFBlci1jb2x1bW4gVE9BU1QgY29tcHJlc3Npb24gKFBvc3RncmVzKTogYHBnbHpgIG9yIGBsejRgLiAqL1xuICAgIHJlYWRvbmx5IGNvbXByZXNzaW9uPzogc3RyaW5nO1xuXG4gICAgLyoqIFBlci1jb2x1bW4gc3RvcmFnZSBzdHJhdGVneSAoUG9zdGdyZXMpOiBgcGxhaW5gL2BleHRlcm5hbGAvYGV4dGVuZGVkYC9gbWFpbmAvYGRlZmF1bHRgLiAqL1xuICAgIHJlYWRvbmx5IHN0b3JhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwYXJ0aXRpb24gZW50cnkuIFRoZSBtZWFuaW5nIG9mIGBuYW1lYCBhbmQgYHR5cGVgIGlzIGVuZ2luZS1zcGVjaWZpYzogZm9yXG4gKiBIaXZlLCBgbmFtZWAgaXMgYSBuZXcgcGFydGl0aW9uIGNvbHVtbiBhbmQgYHR5cGVgIGlzIGEgbm9ybWFsIHR5cGU7IGZvclxuICogSWNlYmVyZywgYG5hbWVgIGlzIGEgc291cmNlIGRhdGEgY29sdW1uIGFuZCBgdHlwZWAgaXMgYSB0cmFuc2Zvcm07IGZvclxuICogUG9zdGdyZXMsIGBuYW1lYCBpcyBhbiBleGlzdGluZyBrZXkgY29sdW1uIGFuZCBgdHlwZWAgaXMgdGhlIHN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpdGlvbiB7XG4gICAgLyoqIEhpdmU6IG5ldyBwYXJ0aXRpb24gY29sdW1uIG5hbWUuIEljZWJlcmcgLyBQb3N0Z3JlczogZXhpc3RpbmcgZGF0YS9rZXkgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEhpdmU6IGEgbm9ybWFsIHR5cGUuIEljZWJlcmc6IGEgdHJhbnNmb3JtIChlLmcuIGBkYXlgLCBgYnVja2V0WzE2XWApLiBQb3N0Z3JlczogYSBzdHJhdGVneSAoYHJhbmdlYCAvIGBsaXN0YCAvIGBoYXNoYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgc29ydCBmaWVsZCBpbiBhbiBJY2ViZXJnIHRhYmxlJ3Mgc29ydCBvcmRlci4gYGNvbHVtbmAgaXMgYSBkYXRhXG4gKiBjb2x1bW47IGB0cmFuc2Zvcm1gIGlzIGFuIG9wdGlvbmFsIEljZWJlcmcgdHJhbnNmb3JtIGFwcGxpZWQgYmVmb3JlIHNvcnRpbmdcbiAqIChkZWZhdWx0cyB0byBpZGVudGl0eSk7IGBkaXJlY3Rpb25gIGFuZCBgbnVsbE9yZGVyYCBzZXQgdGhlIG9yZGVyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRGaWVsZCB7XG4gICAgLyoqIFNvdXJjZSBkYXRhIGNvbHVtbiB0byBzb3J0IGJ5LiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIE9wdGlvbmFsIEljZWJlcmcgdHJhbnNmb3JtIGFwcGxpZWQgYmVmb3JlIHNvcnRpbmcgKGUuZy4gYGRheWAsIGBidWNrZXRbMTZdYCkuICovXG4gICAgcmVhZG9ubHkgdHJhbnNmb3JtPzogc3RyaW5nO1xuXG4gICAgLyoqIFNvcnQgZGlyZWN0aW9uIChgYXNjYCBvciBgZGVzY2ApLiAqL1xuICAgIHJlYWRvbmx5IGRpcmVjdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqIE51bGwgb3JkZXJpbmcgKGBudWxscy1maXJzdGAgb3IgYG51bGxzLWxhc3RgKS4gKi9cbiAgICByZWFkb25seSBudWxsT3JkZXI6IHN0cmluZztcbn1cblxuLyoqIEEgc2luZ2xlIGtleSBjb2x1bW4gd2l0aGluIGFuIGluZGV4LCB3aXRoIG9wdGlvbmFsIG9yZGVyaW5nIG1vZGlmaWVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhDb2x1bW4ge1xuICAgIC8qKiBJbmRleGVkIGNvbHVtbiBuYW1lLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBPcHRpb25hbCBzb3J0IG9yZGVyIChgYXNjYCBvciBgZGVzY2ApLiAqL1xuICAgIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG5cbiAgICAvKiogT3B0aW9uYWwgbnVsbCBvcmRlcmluZyAoYGZpcnN0YCBvciBgbGFzdGApLiAqL1xuICAgIHJlYWRvbmx5IG51bGxzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2Vjb25kYXJ5IGluZGV4IChlLmcuIFBvc3RncmVzKS4gYGNvbHVtbnNgIGFyZSB0aGUga2V5IGNvbHVtbnM7IGBpbmNsdWRlYFxuICogYXJlIG5vbi1rZXkgY292ZXJpbmcgY29sdW1uczsgYHdoZXJlYCBpcyBhbiBvcGFxdWUgcGFydGlhbC1pbmRleCBwcmVkaWNhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXgge1xuICAgIC8qKiBJbmRleCBuYW1lICh1bmlxdWUgd2l0aGluIHRoZSB0YWJsZSkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEFjY2VzcyBtZXRob2QgKGUuZy4gYGJ0cmVlYCwgYGhhc2hgLCBgZ2luYCkuICovXG4gICAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgaW5kZXggZW5mb3JjZXMgdW5pcXVlbmVzcy4gKi9cbiAgICByZWFkb25seSB1bmlxdWU/OiBib29sZWFuO1xuXG4gICAgLyoqIEtleSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IEluZGV4Q29sdW1uW107XG5cbiAgICAvKiogTm9uLWtleSBjb3ZlcmluZyBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGluY2x1ZGU6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE9wdGlvbmFsIHBhcnRpYWwtaW5kZXggcHJlZGljYXRlIChvcGFxdWUpLiAqL1xuICAgIHJlYWRvbmx5IHdoZXJlPzogc3RyaW5nO1xufVxuXG4vKiogQSB0YWJsZS1sZXZlbCBVTklRVUUgY29uc3RyYWludCBvdmVyIG9uZSBvciBtb3JlIGNvbHVtbnMgKFBvc3RncmVzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7XG4gICAgLyoqIENvbnN0cmFpbnQgbmFtZSAodW5pcXVlIHdpdGhpbiB0aGUgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW5zIHRoZSBjb25zdHJhaW50IHNwYW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIFdoZXRoZXIgbnVsbHMgYXJlIHRyZWF0ZWQgYXMgbm90IGRpc3RpbmN0IChgTlVMTFMgTk9UIERJU1RJTkNUYCkuICovXG4gICAgcmVhZG9ubHkgbnVsbHNOb3REaXN0aW5jdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBDSEVDSyBjb25zdHJhaW50IChQb3N0Z3JlcykuIGBleHByZXNzaW9uYCBpcyBhbiBvcGFxdWUgcHJlZGljYXRlOyBgY29sdW1uc2BcbiAqIGlzIHRoZSBleHBsaWNpdCBsaXN0IG9mIGNvbHVtbnMgaXQgcmVmZXJlbmNlcywgd2hpY2ggaXMgd2hhdCBnZXRzIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0NvbnN0cmFpbnQge1xuICAgIC8qKiBDb25zdHJhaW50IG5hbWUgKHVuaXF1ZSB3aXRoaW4gdGhlIHRhYmxlKS4gKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogT3BhcXVlIGJvb2xlYW4gcHJlZGljYXRlLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb246IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW5zIHRoZSBwcmVkaWNhdGUgcmVmZXJlbmNlcy4gKi9cbiAgICByZWFkb25seSBjb2x1bW5zOiBzdHJpbmdbXTtcbn1cblxuLyoqIEEgc29ydCBjb2x1bW4gd2l0aGluIGEgSGl2ZSBidWNrZXRpbmcgc3BlYy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U29ydCB7XG4gICAgLyoqIENvbHVtbiB0byBzb3J0IGVhY2ggYnVja2V0IGJ5LiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIFNvcnQgZGlyZWN0aW9uIChgYXNjYCBvciBgZGVzY2AsIGNhc2UtaW5zZW5zaXRpdmUpLiAqL1xuICAgIHJlYWRvbmx5IGRpcmVjdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhpdmUgYnVja2V0aW5nIChgQ0xVU1RFUkVEIEJZIOKApiBJTlRPIE4gQlVDS0VUUyBbU09SVEVEIEJZIOKApl1gKS4gYGNvbHVtbnNgIGFyZVxuICogdGhlIGJ1Y2tldC1rZXkgY29sdW1ucywgYGJ1Y2tldENvdW50YCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIGFuZCBgc29ydGVkQnlgXG4gKiB0aGUgb3B0aW9uYWwgaW50cmEtYnVja2V0IHNvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0aW5nIHtcbiAgICAvKiogQnVja2V0LWtleSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE51bWJlciBvZiBidWNrZXRzLiAqL1xuICAgIHJlYWRvbmx5IGJ1Y2tldENvdW50OiBudW1iZXI7XG5cbiAgICAvKiogT3B0aW9uYWwgaW50cmEtYnVja2V0IHNvcnQgY29sdW1ucy4gKi9cbiAgICByZWFkb25seSBzb3J0ZWRCeTogQnVja2V0U29ydFtdO1xufVxuXG4vKiogT25lIGVsZW1lbnQgb2YgYW4gZXhjbHVzaW9uIGNvbnN0cmFpbnQ6IGEgY29sdW1uIGFuZCBpdHMgb3BlcmF0b3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2x1c2lvbkVsZW1lbnQge1xuICAgIC8qKiBDb2x1bW4gdGhlIGVsZW1lbnQgYXBwbGllcyB0by4gKi9cbiAgICByZWFkb25seSBjb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBPcGFxdWUgb3BlcmF0b3IgKGUuZy4gYCYmYCwgYD1gKS4gKi9cbiAgICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIGV4Y2x1c2lvbiBjb25zdHJhaW50IChQb3N0Z3Jlcyk6IG5vIHR3byByb3dzIG1heSBoYXZlIGFsbCBsaXN0ZWRcbiAqIGNvbHVtbi9vcGVyYXRvciBwYWlycyBldmFsdWF0ZSB0cnVlIHRvZ2V0aGVyIChnZW5lcmFsaXplZCB1bmlxdWVuZXNzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGNsdXNpb25Db25zdHJhaW50IHtcbiAgICAvKiogQ29uc3RyYWludCBuYW1lICh1bmlxdWUgd2l0aGluIHRoZSB0YWJsZSkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEluZGV4IGFjY2VzcyBtZXRob2QgKGBnaXN0YCBvciBgc3BnaXN0YCkuICovXG4gICAgcmVhZG9ubHkgdXNpbmc6IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW4vb3BlcmF0b3IgZWxlbWVudHMuICovXG4gICAgcmVhZG9ubHkgZWxlbWVudHM6IEV4Y2x1c2lvbkVsZW1lbnRbXTtcbn1cblxuLyoqIEEgZm9yZWlnbi1rZXkgcmVmZXJlbmNlIHRvIGEgY29sdW1uIGluIGFub3RoZXIgdGFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcmVpZ25LZXkge1xuICAgIC8qKiBSZWZlcmVuY2VkIHRhYmxlIGluIGBzY2hlbWEudGFibGVgIGZvcm1hdC4gKi9cbiAgICByZWFkb25seSBzb3VyY2VUYWJsZTogc3RyaW5nO1xuXG4gICAgLyoqIFJlZmVyZW5jZWQgY29sdW1uIGluIHRoZSBzb3VyY2UgdGFibGUuICovXG4gICAgcmVhZG9ubHkgc291cmNlQ29sdW1uOiBzdHJpbmc7XG5cbiAgICAvKiogTG9jYWwgY29sdW1uIHRoYXQgaG9sZHMgdGhlIHJlZmVyZW5jZS4gKi9cbiAgICByZWFkb25seSBsb2NhbENvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGxvY2FsIGNvbHVtbiBtYXkgYmUgbnVsbC4gKi9cbiAgICByZWFkb25seSBhbGxvd051bGxzOiBib29sZWFuO1xufVxuXG4vKiogTm9ybWFsaXplZCB0YWJsZSBkZWZpbml0aW9uIChvcHRpb25hbCBhcnJheXMgZGVmYXVsdGVkIHRvIGVtcHR5KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVEZWZpbml0aW9uIHtcbiAgICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSBmaWxlLiAqL1xuICAgIHJlYWRvbmx5IHNwZWNWZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4gZGVzY3JpcHRpb24uICovXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUuIE1heSBiZSBhbiB1bmtub3duIHN0cmluZyBpZiB0aGUgZmlsZSBmYWlsZWQgc3RydWN0dXJhbCBjaGVja3MuICovXG4gICAgcmVhZG9ubHkgdGFibGVUeXBlOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGlzIHRhYmxlIGlzIHRoZSB0b3Agb2YgdGhlIHBpcGVsaW5lLiAqL1xuICAgIHJlYWRvbmx5IGlzUmF3RGF0YTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgdGFibGUgZm9ybWF0IHZlcnNpb24gKDEsIDIsIG9yIDMpLiBPcHRpb25hbCBhbmQgZW5naW5lLXNwZWNpZmljOlxuICAgICAqIG9ubHkgdGhlIEljZWJlcmcgZW5naW5lIHZhbGlkYXRlcyBpdC4gT3RoZXIgZW5naW5lcyBpZ25vcmUgaXQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9ybWF0VmVyc2lvbj86IG51bWJlcjtcblxuICAgIC8qKiBEYXRhIGNvbHVtbnMuICovXG4gICAgcmVhZG9ubHkgY29sdW1uczogQ29sdW1uW107XG5cbiAgICAvKiogUHJpbWFyeS1rZXkgY29sdW1uIG5hbWVzLiAqL1xuICAgIHJlYWRvbmx5IHByaW1hcnlLZXk6IHN0cmluZ1tdO1xuXG4gICAgLyoqIFBhcnRpdGlvbiBlbnRyaWVzIChlbmdpbmUtc3BlY2lmaWMgc2VtYW50aWNzKS4gKi9cbiAgICByZWFkb25seSBwYXJ0aXRpb25zOiBQYXJ0aXRpb25bXTtcblxuICAgIC8qKiBJY2ViZXJnIHNvcnQgb3JkZXIgKG9yZGVyZWQgc29ydCBmaWVsZHMpLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgaXQuICovXG4gICAgcmVhZG9ubHkgc29ydE9yZGVyOiBTb3J0RmllbGRbXTtcblxuICAgIC8qKiBJY2ViZXJnIGlkZW50aWZpZXIgZmllbGRzICh0aGUgcm93LWlkZW50aXR5IC8gZXF1YWxpdHktZGVsZXRlIGtleSkuIE9wdGlvbmFsLiAqL1xuICAgIHJlYWRvbmx5IGlkZW50aWZpZXJGaWVsZHM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIFNlY29uZGFyeSBpbmRleGVzIChQb3N0Z3JlcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSB0aGVtLiAqL1xuICAgIHJlYWRvbmx5IGluZGV4ZXM6IEluZGV4W107XG5cbiAgICAvKiogVU5JUVVFIGNvbnN0cmFpbnRzIChQb3N0Z3JlcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSB0aGVtLiAqL1xuICAgIHJlYWRvbmx5IHVuaXF1ZUNvbnN0cmFpbnRzOiBVbmlxdWVDb25zdHJhaW50W107XG5cbiAgICAvKiogQ0hFQ0sgY29uc3RyYWludHMgKFBvc3RncmVzKS4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIHRoZW0uICovXG4gICAgcmVhZG9ubHkgY2hlY2tDb25zdHJhaW50czogQ2hlY2tDb25zdHJhaW50W107XG5cbiAgICAvKiogRXhjbHVzaW9uIGNvbnN0cmFpbnRzIChQb3N0Z3JlcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSB0aGVtLiAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1c2lvbkNvbnN0cmFpbnRzOiBFeGNsdXNpb25Db25zdHJhaW50W107XG5cbiAgICAvKiogSGl2ZSBidWNrZXRpbmcgc3BlYy4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIGl0LiAqL1xuICAgIHJlYWRvbmx5IGJ1Y2tldGluZz86IEJ1Y2tldGluZztcblxuICAgIC8qKlxuICAgICAqIEVuZ2luZSB0YWJsZSBwcm9wZXJ0aWVzIGFzIGEgc3RyaW5n4oaSc3RyaW5nIG1hcCAoZS5nLiBJY2ViZXJnXG4gICAgICogYHdyaXRlLnRhcmdldC1maWxlLXNpemUtYnl0ZXNgLCBIaXZlIGBwYXJxdWV0LmNvbXByZXNzaW9uYCkuIE9wdGlvbmFsLlxuICAgICAqIE9ubHkga2V5cyB3aXRoIGEga25vd24sIGNsb3NlZCBsZWdhbCBkb21haW4gYXJlIHZhbGlkYXRlZCBwZXIgZW5naW5lO1xuICAgICAqIHVua25vd24ga2V5cyBwYXNzIHRocm91Z2ggdW52YWxpZGF0ZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdGFibGVQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgLyoqIFVwc3RyZWFtIHRhYmxlcyBpbiBgc2NoZW1hLnRhYmxlYCBmb3JtYXQuICovXG4gICAgcmVhZG9ubHkgZGVwZW5kc09uOiBzdHJpbmdbXTtcblxuICAgIC8qKiBGb3JlaWduIGtleXMuICovXG4gICAgcmVhZG9ubHkgZm9yZWlnbktleXM6IEZvcmVpZ25LZXlbXTtcbn1cblxuLyoqIEEgc2NoZW1hLWRlc2NyaXB0aW9uIGZpbGUncyBub3JtYWxpemVkIGNvbnRlbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYURlc2NyaXB0aW9uIHtcbiAgICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSBmaWxlLiAqL1xuICAgIHJlYWRvbmx5IHNwZWNWZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4gZGVzY3JpcHRpb24uICovXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLyoqIFNldmVyaXR5IG9mIGEgdmlvbGF0aW9uLiAqL1xuZXhwb3J0IHR5cGUgVmlvbGF0aW9uTGV2ZWwgPSAnZXJyb3InIHwgJ3dhcm5pbmcnO1xuXG4vKiogQSBzaW5nbGUgdmFsaWRhdGlvbiBmaW5kaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW9sYXRpb24ge1xuICAgIC8qKiBTZXZlcml0eS4gYGVycm9yYCBmYWlscyB2YWxpZGF0aW9uOyBgd2FybmluZ2AgZG9lcyBub3QuICovXG4gICAgcmVhZG9ubHkgbGV2ZWw6IFZpb2xhdGlvbkxldmVsO1xuXG4gICAgLyoqIFN0YWJsZSBtYWNoaW5lLXJlYWRhYmxlIHJ1bGUgY29kZSAoZS5nLiBgUEtfQ09MVU1OU19FWElTVGApLiAqL1xuICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblxuICAgIC8qKiBPd25pbmcgc2NoZW1hLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHNjaGVtYT86IHN0cmluZztcblxuICAgIC8qKiBPd25pbmcgdGFibGUsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgdGFibGU/OiBzdHJpbmc7XG5cbiAgICAvKiogRmllbGQgcGF0aCB3aXRoaW4gdGhlIGZpbGUsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgZmllbGQ/OiBzdHJpbmc7XG5cbiAgICAvKiogU291cmNlIGZpbGUgcGF0aCwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UuICovXG4gICAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKiogVGhlIGFnZ3JlZ2F0ZSByZXN1bHQgb2YgdmFsaWRhdGluZyBhIHJvb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICAgIC8qKiBUcnVlIHdoZW4gdGhlcmUgYXJlIG5vIGBlcnJvcmAtbGV2ZWwgdmlvbGF0aW9ucy4gKi9cbiAgICByZWFkb25seSBvazogYm9vbGVhbjtcblxuICAgIC8qKiBBbGwgZmluZGluZ3MsIGVycm9ycyBhbmQgd2FybmluZ3MuICovXG4gICAgcmVhZG9ubHkgdmlvbGF0aW9uczogVmlvbGF0aW9uW107XG59XG4iXX0=
@@ -68,6 +68,13 @@
68
68
  "$ref": "#/definitions/sortField"
69
69
  }
70
70
  },
71
+ "identifierFields": {
72
+ "type": "array",
73
+ "items": {
74
+ "type": "string",
75
+ "minLength": 1
76
+ }
77
+ },
71
78
  "indexes": {
72
79
  "type": "array",
73
80
  "items": {
@@ -86,6 +93,12 @@
86
93
  "$ref": "#/definitions/checkConstraint"
87
94
  }
88
95
  },
96
+ "exclusionConstraints": {
97
+ "type": "array",
98
+ "items": {
99
+ "$ref": "#/definitions/exclusionConstraint"
100
+ }
101
+ },
89
102
  "bucketing": {
90
103
  "$ref": "#/definitions/bucketing"
91
104
  },
@@ -211,6 +224,50 @@
211
224
  }
212
225
  }
213
226
  },
227
+ "exclusionConstraint": {
228
+ "type": "object",
229
+ "required": [
230
+ "name",
231
+ "using",
232
+ "elements"
233
+ ],
234
+ "additionalProperties": false,
235
+ "properties": {
236
+ "name": {
237
+ "type": "string",
238
+ "minLength": 1
239
+ },
240
+ "using": {
241
+ "type": "string",
242
+ "minLength": 1
243
+ },
244
+ "elements": {
245
+ "type": "array",
246
+ "minItems": 1,
247
+ "items": {
248
+ "$ref": "#/definitions/exclusionElement"
249
+ }
250
+ }
251
+ }
252
+ },
253
+ "exclusionElement": {
254
+ "type": "object",
255
+ "required": [
256
+ "column",
257
+ "operator"
258
+ ],
259
+ "additionalProperties": false,
260
+ "properties": {
261
+ "column": {
262
+ "type": "string",
263
+ "minLength": 1
264
+ },
265
+ "operator": {
266
+ "type": "string",
267
+ "minLength": 1
268
+ }
269
+ }
270
+ },
214
271
  "bucketing": {
215
272
  "type": "object",
216
273
  "required": [
@@ -31,6 +31,7 @@ export declare class IcebergParquetTable extends TableTypeBase {
31
31
  private static readonly FORMAT_VERSIONS;
32
32
  private static readonly ENUM_PROPERTIES;
33
33
  private static readonly POSITIVE_INT_PROPERTIES;
34
+ private static readonly NON_NEGATIVE_INT_PROPERTIES;
34
35
  private static readonly INT_RANGE_PROPERTIES;
35
36
  private static readonly SORT_DIRECTIONS;
36
37
  private static readonly SORT_NULL_ORDERS;
@@ -65,12 +66,25 @@ export declare class IcebergParquetTable extends TableTypeBase {
65
66
  * Validate the closed-domain Iceberg table properties. Keys outside the
66
67
  * known set pass through unvalidated.
67
68
  *
68
- * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`, and
69
- * `ICEBERG_PROPERTY_INT_RANGE`.
69
+ * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`,
70
+ * `ICEBERG_PROPERTY_NON_NEGATIVE_INT`, `ICEBERG_PROPERTY_INT_RANGE`, and
71
+ * `ICEBERG_COMMIT_RETRY_ORDERING`.
70
72
  *
71
73
  * @returns Every table-property violation.
72
74
  */
73
75
  private tablePropertyViolations;
76
+ private commitRetryOrderingViolations;
77
+ /**
78
+ * Validate Iceberg identifier fields (the row-identity / equality-delete
79
+ * key). Equality deletes are a format-version 2+ feature, and identifier
80
+ * fields must be required primitive columns that are not float/double.
81
+ *
82
+ * Emits `ICEBERG_IDENTIFIER_NEEDS_FORMAT_V2`, `ICEBERG_IDENTIFIER_COLUMN_EXISTS`,
83
+ * `ICEBERG_IDENTIFIER_REQUIRED`, and `ICEBERG_IDENTIFIER_TYPE_PRIMITIVE`.
84
+ *
85
+ * @returns Every identifier-field violation.
86
+ */
87
+ private identifierFieldViolations;
74
88
  /**
75
89
  * Normalize a partition into its identity key. When the transform parses,
76
90
  * collapse on `${kind}:${param}` so `day` and `DAY`, `bucket[16]` and
@@ -20,6 +20,15 @@ const iceberg_1 = require("../iceberg");
20
20
  function isPositiveInteger(value) {
21
21
  return /^\d+$/.test(value) && Number(value) > 0;
22
22
  }
23
+ /**
24
+ * Whether a string is a non-negative integer (digits only, value >= 0).
25
+ *
26
+ * @param value Property value string.
27
+ * @returns True when `value` is a non-negative integer.
28
+ */
29
+ function isNonNegativeInteger(value) {
30
+ return /^\d+$/.test(value);
31
+ }
23
32
  /**
24
33
  * Whether a string is an integer within an inclusive range.
25
34
  *
@@ -158,6 +167,13 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
158
167
  'history.expire.min-snapshots-to-keep',
159
168
  'history.expire.max-ref-age-ms',
160
169
  'write.metadata.previous-versions-max',
170
+ 'commit.retry.min-wait-ms',
171
+ 'commit.retry.max-wait-ms',
172
+ 'commit.retry.total-timeout-ms',
173
+ ];
174
+ /// Table-property keys whose value must be a non-negative integer.
175
+ static NON_NEGATIVE_INT_PROPERTIES = [
176
+ 'commit.retry.num-retries',
161
177
  ];
162
178
  /// Table-property keys whose value must be an integer within an inclusive range.
163
179
  static INT_RANGE_PROPERTIES = {
@@ -186,6 +202,7 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
186
202
  ...this.formatVersionViolations(),
187
203
  ...this.tablePropertyViolations(),
188
204
  ...this.sortOrderViolations(),
205
+ ...this.identifierFieldViolations(),
189
206
  ];
190
207
  }
191
208
  /**
@@ -304,14 +321,16 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
304
321
  * Validate the closed-domain Iceberg table properties. Keys outside the
305
322
  * known set pass through unvalidated.
306
323
  *
307
- * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`, and
308
- * `ICEBERG_PROPERTY_INT_RANGE`.
324
+ * Emits `ICEBERG_PROPERTY_ENUM_VALID`, `ICEBERG_PROPERTY_POSITIVE_INT`,
325
+ * `ICEBERG_PROPERTY_NON_NEGATIVE_INT`, `ICEBERG_PROPERTY_INT_RANGE`, and
326
+ * `ICEBERG_COMMIT_RETRY_ORDERING`.
309
327
  *
310
328
  * @returns Every table-property violation.
311
329
  */
312
330
  tablePropertyViolations() {
313
331
  const violations = [];
314
- for (const [key, value,] of Object.entries(this.definition.tableProperties)) {
332
+ const properties = this.definition.tableProperties;
333
+ for (const [key, value,] of Object.entries(properties)) {
315
334
  const allowed = IcebergParquetTable.ENUM_PROPERTIES[key];
316
335
  if (allowed !== undefined && !allowed.includes(value)) {
317
336
  violations.push(this.violation({
@@ -329,6 +348,14 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
329
348
  message: `table property "${key}" value "${value}" must be a positive integer`,
330
349
  }));
331
350
  }
351
+ if (IcebergParquetTable.NON_NEGATIVE_INT_PROPERTIES.includes(key) && !isNonNegativeInteger(value)) {
352
+ violations.push(this.violation({
353
+ level: 'error',
354
+ code: 'ICEBERG_PROPERTY_NON_NEGATIVE_INT',
355
+ field: `tableProperties["${key}"]`,
356
+ message: `table property "${key}" value "${value}" must be a non-negative integer`,
357
+ }));
358
+ }
332
359
  const range = IcebergParquetTable.INT_RANGE_PROPERTIES[key];
333
360
  if (range !== undefined && !isIntegerInRange(value, range.min, range.max)) {
334
361
  violations.push(this.violation({
@@ -340,6 +367,87 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
340
367
  }));
341
368
  }
342
369
  }
370
+ violations.push(...this.commitRetryOrderingViolations(properties));
371
+ return violations;
372
+ }
373
+ /// ICEBERG_COMMIT_RETRY_ORDERING — commit.retry waits obey
374
+ /// min-wait-ms <= max-wait-ms <= total-timeout-ms when all are positive ints.
375
+ commitRetryOrderingViolations(properties) {
376
+ const values = [
377
+ properties['commit.retry.min-wait-ms'],
378
+ properties['commit.retry.max-wait-ms'],
379
+ properties['commit.retry.total-timeout-ms'],
380
+ ];
381
+ if (!values.every((value) => value !== undefined && isPositiveInteger(value))) {
382
+ return [];
383
+ }
384
+ const [min, max, total,] = values.map(Number);
385
+ if (min <= max && max <= total) {
386
+ return [];
387
+ }
388
+ return [
389
+ this.violation({
390
+ level: 'error',
391
+ code: 'ICEBERG_COMMIT_RETRY_ORDERING',
392
+ field: 'tableProperties["commit.retry.min-wait-ms"]',
393
+ message: 'commit.retry waits must satisfy min-wait-ms <= max-wait-ms <= total-timeout-ms',
394
+ }),
395
+ ];
396
+ }
397
+ /**
398
+ * Validate Iceberg identifier fields (the row-identity / equality-delete
399
+ * key). Equality deletes are a format-version 2+ feature, and identifier
400
+ * fields must be required primitive columns that are not float/double.
401
+ *
402
+ * Emits `ICEBERG_IDENTIFIER_NEEDS_FORMAT_V2`, `ICEBERG_IDENTIFIER_COLUMN_EXISTS`,
403
+ * `ICEBERG_IDENTIFIER_REQUIRED`, and `ICEBERG_IDENTIFIER_TYPE_PRIMITIVE`.
404
+ *
405
+ * @returns Every identifier-field violation.
406
+ */
407
+ identifierFieldViolations() {
408
+ const violations = [];
409
+ const { identifierFields, formatVersion, } = this.definition;
410
+ if (identifierFields.length === 0) {
411
+ return [];
412
+ }
413
+ if (formatVersion === 1) {
414
+ violations.push(this.violation({
415
+ level: 'error',
416
+ code: 'ICEBERG_IDENTIFIER_NEEDS_FORMAT_V2',
417
+ field: 'identifierFields',
418
+ message: 'identifier fields require formatVersion 2 or higher (equality deletes are a v2 feature)',
419
+ }));
420
+ }
421
+ identifierFields.forEach((name, index) => {
422
+ const field = `identifierFields[${index}]`;
423
+ const column = this.definition.columns.find((candidate) => candidate.name === name);
424
+ if (column === undefined) {
425
+ violations.push(this.violation({
426
+ level: 'error',
427
+ code: 'ICEBERG_IDENTIFIER_COLUMN_EXISTS',
428
+ field,
429
+ message: `identifier field "${name}" is not defined in columns`,
430
+ }));
431
+ return;
432
+ }
433
+ if (column.nullable === true) {
434
+ violations.push(this.violation({
435
+ level: 'error',
436
+ code: 'ICEBERG_IDENTIFIER_REQUIRED',
437
+ field,
438
+ message: `identifier field "${name}" must be required (nullable: false)`,
439
+ }));
440
+ }
441
+ const type = (0, iceberg_1.parseIcebergType)(column.type);
442
+ if (type === null || type.kind === iceberg_1.IcebergTypeKind.FLOAT || type.kind === iceberg_1.IcebergTypeKind.DOUBLE) {
443
+ violations.push(this.violation({
444
+ level: 'error',
445
+ code: 'ICEBERG_IDENTIFIER_TYPE_PRIMITIVE',
446
+ field,
447
+ message: `identifier field "${name}" must be a primitive type other than float or double`,
448
+ }));
449
+ }
450
+ });
343
451
  return violations;
344
452
  }
345
453
  /**
@@ -360,4 +468,4 @@ class IcebergParquetTable extends table_type_1.TableTypeBase {
360
468
  }
361
469
  }
362
470
  exports.IcebergParquetTable = IcebergParquetTable;
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlYmVyZy1wYXJxdWV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhYmxlLXR5cGVzL2ljZWJlcmctcGFycXVldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFPSCw4Q0FFdUI7QUFDdkIsd0NBS29CO0FBRXBCOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUNwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLEdBQVcsRUFBRSxHQUFXO0lBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQsK0JBQStCO0FBQy9CLE1BQWEsbUJBQW9CLFNBQVEsMEJBQWE7SUFDbEQ7Ozs7O09BS0c7SUFDSSxpQkFBaUIsQ0FBQyxJQUFZO1FBQ2pDLE9BQU8sSUFBQSw0QkFBa0IsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLG1CQUFtQjtRQUN0QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFDRixVQUFVLEdBQ2IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXBCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLEtBQUssRUFBRSxjQUFjLEtBQUssR0FBRztvQkFDN0IsT0FBTyxFQUFFLHlCQUF5QixTQUFTLENBQUMsSUFBSSxxQkFBcUIsU0FBUyxDQUFDLElBQUksR0FBRztpQkFDekYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RixJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsaUNBQWlDO29CQUN2QyxLQUFLLEVBQUUsY0FBYyxLQUFLLFFBQVE7b0JBQ2xDLE9BQU8sRUFBRSxvQ0FBb0MsU0FBUyxDQUFDLElBQUksNkJBQTZCO2lCQUMzRixDQUFDLENBQUMsQ0FBQztnQkFDSixPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSx5QkFBeUI7b0JBQy9CLEtBQUssRUFBRSxjQUFjLEtBQUssUUFBUTtvQkFDbEMsT0FBTyxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksOENBQThDO2lCQUM1RSxDQUFDLENBQUMsQ0FBQztnQkFDSixPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUEsOEJBQW9CLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsS0FBSyxFQUFFLGNBQWMsS0FBSyxRQUFRO29CQUNsQyxPQUFPLEVBQUUsY0FBYyxTQUFTLENBQUMsSUFBSSxvQkFBb0I7MEJBQ25ELFdBQVcsU0FBUyxDQUFDLElBQUksY0FBYyxZQUFZLENBQUMsSUFBSSxHQUFHO2lCQUNwRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRCwyREFBMkQ7SUFDbkQsTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsQ0FBQztRQUNELENBQUM7S0FDSixDQUFDLENBQUM7SUFFSCxnRUFBZ0U7SUFDeEQsTUFBTSxDQUFVLGVBQWUsR0FBc0M7UUFDekUsc0JBQXNCLEVBQUU7WUFDcEIsU0FBUztZQUNULE1BQU07WUFDTixLQUFLO1NBQ1I7UUFDRCxpQ0FBaUMsRUFBRTtZQUMvQixNQUFNO1lBQ04sTUFBTTtZQUNOLFFBQVE7WUFDUixLQUFLO1lBQ0wsTUFBTTtTQUNUO1FBQ0QsOEJBQThCLEVBQUU7WUFDNUIsTUFBTTtZQUNOLE1BQU07WUFDTixRQUFRO1lBQ1IsY0FBYztTQUNqQjtRQUNELDZCQUE2QixFQUFFO1lBQzNCLE1BQU07WUFDTixLQUFLO1lBQ0wsS0FBSztZQUNMLE1BQU07WUFDTixRQUFRO1lBQ1IsTUFBTTtTQUNUO1FBQ0QseUJBQXlCLEVBQUU7WUFDdkIsTUFBTTtZQUNOLE1BQU07WUFDTixPQUFPO1NBQ1Y7UUFDRCxrQ0FBa0MsRUFBRTtZQUNoQyxNQUFNO1lBQ04sTUFBTTtTQUNUO0tBQ0osQ0FBQztJQUVGLCtEQUErRDtJQUN2RCxNQUFNLENBQVUsdUJBQXVCLEdBQXNCO1FBQ2pFLDhCQUE4QjtRQUM5QixvQ0FBb0M7UUFDcEMsc0NBQXNDO1FBQ3RDLCtCQUErQjtRQUMvQixzQ0FBc0M7S0FDekMsQ0FBQztJQUVGLGlGQUFpRjtJQUN6RSxNQUFNLENBQVUsb0JBQW9CLEdBQWlEO1FBQ3pGLGlDQUFpQyxFQUFFO1lBQy9CLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLEVBQUU7U0FDVjtLQUNKLENBQUM7SUFFRiw2Q0FBNkM7SUFDckMsTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUM5QyxLQUFLO1FBQ0wsTUFBTTtLQUNULENBQUMsQ0FBQztJQUVLLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUMvQyxhQUFhO1FBQ2IsWUFBWTtLQUNmLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ0ksd0JBQXdCO1FBQzNCLE9BQU87WUFDSCxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNqQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNqQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtTQUNoQyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLG1CQUFtQjtRQUN2QixNQUFNLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFDRixTQUFTLEdBQ1osR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXBCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSwwQkFBMEI7b0JBQ2hDLEtBQUssRUFBRSxhQUFhLEtBQUssR0FBRztvQkFDNUIsT0FBTyxFQUFFLDBCQUEwQixLQUFLLENBQUMsTUFBTSxHQUFHOzBCQUM1QyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtpQkFDM0UsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLDhCQUE4QjtvQkFDcEMsS0FBSyxFQUFFLGFBQWEsS0FBSyxhQUFhO29CQUN0QyxPQUFPLEVBQUUsbUJBQW1CLEtBQUssQ0FBQyxTQUFTLDJCQUEyQjtpQkFDekUsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsK0JBQStCO29CQUNyQyxLQUFLLEVBQUUsYUFBYSxLQUFLLGFBQWE7b0JBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsS0FBSyxDQUFDLFNBQVMseUNBQXlDO2lCQUN4RixDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVGLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSw0QkFBNEI7b0JBQ2xDLEtBQUssRUFBRSxhQUFhLEtBQUssVUFBVTtvQkFDbkMsT0FBTyxFQUFFLGdCQUFnQixLQUFLLENBQUMsTUFBTSw2QkFBNkI7aUJBQ3JFLENBQUMsQ0FBQyxDQUFDO2dCQUNKLE9BQU87WUFDWCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSw4QkFBOEI7b0JBQ3BDLEtBQUssRUFBRSxhQUFhLEtBQUssYUFBYTtvQkFDdEMsT0FBTyxFQUFFLElBQUksS0FBSyxDQUFDLFNBQVMsb0NBQW9DO2lCQUNuRSxDQUFDLENBQUMsQ0FBQztnQkFDSixPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUEsOEJBQW9CLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLG1DQUFtQztvQkFDekMsS0FBSyxFQUFFLGFBQWEsS0FBSyxhQUFhO29CQUN0QyxPQUFPLEVBQUUsY0FBYyxLQUFLLENBQUMsU0FBUyxvQkFBb0I7MEJBQ3BELFdBQVcsS0FBSyxDQUFDLE1BQU0sY0FBYyxZQUFZLENBQUMsSUFBSSxHQUFHO2lCQUNsRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxZQUFZLENBQUMsS0FBZ0I7UUFDakMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxZQUFZLENBQUM7UUFDdkMsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sbUJBQW1CLEdBQUcsU0FBUztZQUNqQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFO1lBQzlDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELDRFQUE0RTtJQUNwRSx1QkFBdUI7UUFDM0IsTUFBTSxFQUNGLGFBQWEsR0FDaEIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BCLElBQUksYUFBYSxLQUFLLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDeEYsT0FBTyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTztZQUNILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ1gsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsSUFBSSxFQUFFLDhCQUE4QjtnQkFDcEMsS0FBSyxFQUFFLGVBQWU7Z0JBQ3RCLE9BQU8sRUFBRSwwQkFBMEIsYUFBYSxzQkFBc0I7YUFDekUsQ0FBQztTQUNMLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyx1QkFBdUI7UUFDM0IsTUFBTSxVQUFVLEdBQWdCLEVBQUUsQ0FBQztRQUVuQyxLQUFLLE1BQU0sQ0FDUCxHQUFHLEVBQ0gsS0FBSyxFQUNSLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTyxLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsNkJBQTZCO29CQUNuQyxLQUFLLEVBQUUsb0JBQW9CLEdBQUcsSUFBSTtvQkFDbEMsT0FBTyxFQUFFLG1CQUFtQixHQUFHLFlBQVksS0FBSyxxQkFBcUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtpQkFDNUYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBRUQsSUFBSSxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6RixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSwrQkFBK0I7b0JBQ3JDLEtBQUssRUFBRSxvQkFBb0IsR0FBRyxJQUFJO29CQUNsQyxPQUFPLEVBQUUsbUJBQW1CLEdBQUcsWUFBWSxLQUFLLDhCQUE4QjtpQkFDakYsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFLDRCQUE0QjtvQkFDbEMsS0FBSyxFQUFFLG9CQUFvQixHQUFHLElBQUk7b0JBQ2xDLE9BQU8sRUFBRSxtQkFBbUIsR0FBRyxZQUFZLEtBQUssK0JBQStCOzBCQUN6RSxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtpQkFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLFlBQVksQ0FBQyxTQUFvQjtRQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLG1CQUFtQixHQUFHLFNBQVM7WUFDakMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRTtZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3RELENBQUM7O0FBbldMLGtEQW9XQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSWNlYmVyZyAocGFycXVldCkgdGFibGUgdHlwZS5cbiAqXG4gKiBJY2ViZXJnIHBhcnRpdGlvbnMgYXJlIHRyYW5zZm9ybXMgYXBwbGllZCB0byBhIGRhdGEgY29sdW1uLCBzbyBkdXBsaWNhdGVcbiAqIGRldGVjdGlvbiBrZXlzIG9uIHRoZSAoc291cmNlIGNvbHVtbiwgbm9ybWFsaXplZCB0cmFuc2Zvcm0pIHBhaXIg4oCUIGB5ZWFyKHRzKWBcbiAqIGFuZCBgbW9udGgodHMpYCBhcmUgZGlzdGluY3QsIHdoaWxlIGBkYXlgIGFuZCBgREFZYCBjb2xsYXBzZS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIFBhcnRpdGlvbixcbiAgICBTb3J0RmllbGQsXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4uL3RhYmxlLXR5cGUnO1xuaW1wb3J0IHtcbiAgICBpc1ZhbGlkSWNlYmVyZ1R5cGUsXG4gICAgcGFyc2VJY2ViZXJnVHJhbnNmb3JtLFxuICAgIHBhcnNlSWNlYmVyZ1R5cGUsXG4gICAgdHJhbnNmb3JtTGVnYWxPblR5cGUsXG59IGZyb20gJy4uL2ljZWJlcmcnO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBzdHJpbmcgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIChkaWdpdHMgb25seSwgdmFsdWUgPiAwKS4gSWNlYmVyZ1xuICogdGFibGUtcHJvcGVydHkgdmFsdWVzIGFyZSBzdHJpbmdzLCBzbyBudW1lcmljIGNoZWNrcyBwYXJzZSB0aGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYHZhbHVlYCBpcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gKi9cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15cXGQrJC8udGVzdCh2YWx1ZSkgJiYgTnVtYmVyKHZhbHVlKSA+IDA7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHN0cmluZyBpcyBhbiBpbnRlZ2VyIHdpdGhpbiBhbiBpbmNsdXNpdmUgcmFuZ2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIFByb3BlcnR5IHZhbHVlIHN0cmluZy5cbiAqIEBwYXJhbSBtaW4gSW5jbHVzaXZlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIG1heCBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYHZhbHVlYCBpcyBhbiBpbnRlZ2VyIGluIGBbbWluLCBtYXhdYC5cbiAqL1xuZnVuY3Rpb24gaXNJbnRlZ2VySW5SYW5nZSh2YWx1ZTogc3RyaW5nLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgICByZXR1cm4gcGFyc2VkID49IG1pbiAmJiBwYXJzZWQgPD0gbWF4O1xufVxuXG4vKiogSWNlYmVyZyAocGFycXVldCkgdGFibGUuICovXG5leHBvcnQgY2xhc3MgSWNlYmVyZ1BhcnF1ZXRUYWJsZSBleHRlbmRzIFRhYmxlVHlwZUJhc2Uge1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGEgY29sdW1uIHR5cGUgYWdhaW5zdCB0aGUgSWNlYmVyZyB2MCB0eXBlIHJlZ2lzdHJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgVHlwZSBzdHJpbmcgZnJvbSBhIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdHlwZSBpcyBhIHZhbGlkIEljZWJlcmcgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkSWNlYmVyZ1R5cGUodHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWNlYmVyZyBwYXJ0aXRpb24gcnVsZXMuXG4gICAgICpcbiAgICAgKiBFbWl0czogYE5PX0RVUExJQ0FURV9QQVJUSVRJT05TYCAoa2V5ZWQgYnkgYCR7bmFtZX0gJHt0cmFuc2Zvcm1LaW5kfToke3BhcmFtfWAsXG4gICAgICogZmFsbGluZyBiYWNrIHRvIGEgbG93ZXJjYXNlZCB0cmltIG9mIHRoZSByYXcgdHJhbnNmb3JtIHdoZW4gaXQgZG9lc24ndFxuICAgICAqIHBhcnNlLCBzbyB3aGl0ZXNwYWNlIC8gY2FzZSB2YXJpYW50cyBvZiB0aGUgc2FtZSB0cmFuc2Zvcm0gY29sbGFwc2UpLFxuICAgICAqIGBJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfRVhJU1RTYCwgYElDRUJFUkdfVFJBTlNGT1JNX1ZBTElEYCwgYW5kXG4gICAgICogYElDRUJFUkdfVFJBTlNGT1JNX1NPVVJDRV9UWVBFX0xFR0FMYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHBhcnRpdGlvbi1yZWxhdGVkIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydGl0aW9uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhcnRpdGlvbnMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBwYXJ0aXRpb25zLmZvckVhY2goKHBhcnRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMucGFydGl0aW9uS2V5KHBhcnRpdGlvbik7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb246IFwiJHtwYXJ0aXRpb24ubmFtZX1cIiB3aXRoIHRyYW5zZm9ybSBcIiR7cGFydGl0aW9uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhcnRpdGlvbnMuZm9yRWFjaCgocGFydGl0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gcGFydGl0aW9uLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEljZWJlcmcgcGFydGl0aW9uIHNvdXJjZSBjb2x1bW4gXCIke3BhcnRpdGlvbi5uYW1lfVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYXJzZUljZWJlcmdUcmFuc2Zvcm0ocGFydGl0aW9uLnR5cGUpO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkIEljZWJlcmcgcGFydGl0aW9uIHRyYW5zZm9ybWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBwYXJzZUljZWJlcmdUeXBlKHNvdXJjZUNvbHVtbi50eXBlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlICE9PSBudWxsICYmICF0cmFuc2Zvcm1MZWdhbE9uVHlwZSh0cmFuc2Zvcm0sIHNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfVFlQRV9MRUdBTCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0cmFuc2Zvcm0gXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBsZWdhbCBvbiBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBjb2x1bW4gXCIke3BhcnRpdGlvbi5uYW1lfVwiIG9mIHR5cGUgXCIke3NvdXJjZUNvbHVtbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBUaGUgSWNlYmVyZyBmb3JtYXQgdmVyc2lvbnMgdGhpcyB2YWxpZGF0b3IgdW5kZXJzdGFuZHMuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRk9STUFUX1ZFUlNJT05TID0gbmV3IFNldChbXG4gICAgICAgIDEsXG4gICAgICAgIDIsXG4gICAgICAgIDMsXG4gICAgXSk7XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGNvbWUgZnJvbSBhIGNsb3NlZCBzZXQuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU5VTV9QUk9QRVJUSUVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gICAgICAgICd3cml0ZS5mb3JtYXQuZGVmYXVsdCc6IFtcbiAgICAgICAgICAgICdwYXJxdWV0JyxcbiAgICAgICAgICAgICdhdnJvJyxcbiAgICAgICAgICAgICdvcmMnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUucGFycXVldC5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdnemlwJyxcbiAgICAgICAgICAgICdzbmFwcHknLFxuICAgICAgICAgICAgJ2x6NCcsXG4gICAgICAgICAgICAnbm9uZScsXG4gICAgICAgIF0sXG4gICAgICAgICd3cml0ZS5hdnJvLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICAgICAgJ3pzdGQnLFxuICAgICAgICAgICAgJ3NuYXBweScsXG4gICAgICAgICAgICAndW5jb21wcmVzc2VkJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm9yYy5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdsejQnLFxuICAgICAgICAgICAgJ2x6bycsXG4gICAgICAgICAgICAnemxpYicsXG4gICAgICAgICAgICAnc25hcHB5JyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLmRpc3RyaWJ1dGlvbi1tb2RlJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2hhc2gnLFxuICAgICAgICAgICAgJ3JhbmdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICBdLFxuICAgIH07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1NJVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICd3cml0ZS50YXJnZXQtZmlsZS1zaXplLWJ5dGVzJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1zbmFwc2hvdC1hZ2UtbXMnLFxuICAgICAgICAnaGlzdG9yeS5leHBpcmUubWluLXNuYXBzaG90cy10by1rZWVwJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1yZWYtYWdlLW1zJyxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLnByZXZpb3VzLXZlcnNpb25zLW1heCcsXG4gICAgXTtcblxuICAgIC8vLyBUYWJsZS1wcm9wZXJ0eSBrZXlzIHdob3NlIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoaW4gYW4gaW5jbHVzaXZlIHJhbmdlLlxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElOVF9SQU5HRV9QUk9QRVJUSUVTOiBSZWNvcmQ8c3RyaW5nLCB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9PiA9IHtcbiAgICAgICAgJ3dyaXRlLnBhcnF1ZXQuY29tcHJlc3Npb24tbGV2ZWwnOiB7XG4gICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICBtYXg6IDIyLFxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICAvLy8gTGVnYWwgc29ydCBkaXJlY3Rpb25zIGFuZCBudWxsIG9yZGVyaW5ncy5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTT1JUX0RJUkVDVElPTlMgPSBuZXcgU2V0KFtcbiAgICAgICAgJ2FzYycsXG4gICAgICAgICdkZXNjJyxcbiAgICBdKTtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNPUlRfTlVMTF9PUkRFUlMgPSBuZXcgU2V0KFtcbiAgICAgICAgJ251bGxzLWZpcnN0JyxcbiAgICAgICAgJ251bGxzLWxhc3QnLFxuICAgIF0pO1xuXG4gICAgLyoqXG4gICAgICogSWNlYmVyZyBlbmdpbmUtc3BlY2lmaWMgcnVsZXM6IGZvcm1hdCB2ZXJzaW9uLCB0YWJsZSBwcm9wZXJ0aWVzLCBhbmQgc29ydFxuICAgICAqIG9yZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgZW5naW5lLXNwZWNpZmljIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZW5naW5lU3BlY2lmaWNWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLnRoaXMuZm9ybWF0VmVyc2lvblZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMudGFibGVQcm9wZXJ0eVZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuc29ydE9yZGVyVmlvbGF0aW9ucygpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoZSBJY2ViZXJnIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgTk9fRFVQTElDQVRFX1NPUlRfRklFTERTYCAoa2V5ZWQgYnkgc291cmNlIGNvbHVtbiArIG5vcm1hbGl6ZWRcbiAgICAgKiB0cmFuc2Zvcm0pLCBgSUNFQkVSR19TT1JUX0NPTFVNTl9FWElTVFNgLCBgSUNFQkVSR19TT1JUX0RJUkVDVElPTl9WQUxJRGAsXG4gICAgICogYElDRUJFUkdfU09SVF9OVUxMX09SREVSX1ZBTElEYCwgYElDRUJFUkdfU09SVF9UUkFOU0ZPUk1fVkFMSURgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19TT1JUX1RSQU5TRk9STV9UWVBFX0xFR0FMYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHNvcnQtb3JkZXIgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydE9yZGVyVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc29ydEZpZWxkS2V5KGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfU09SVF9GSUVMRFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIHNvcnQgZmllbGQ6IFwiJHtmaWVsZC5jb2x1bW59XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAke2ZpZWxkLnRyYW5zZm9ybSA/IGAgd2l0aCB0cmFuc2Zvcm0gXCIke2ZpZWxkLnRyYW5zZm9ybX1cImAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghSWNlYmVyZ1BhcnF1ZXRUYWJsZS5TT1JUX0RJUkVDVElPTlMuaGFzKGZpZWxkLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9ESVJFQ1RJT05fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0uZGlyZWN0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHNvcnQgZGlyZWN0aW9uIFwiJHtmaWVsZC5kaXJlY3Rpb259XCIgbXVzdCBiZSBcImFzY1wiIG9yIFwiZGVzY1wiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUljZWJlcmdQYXJxdWV0VGFibGUuU09SVF9OVUxMX09SREVSUy5oYXMoZmllbGQubnVsbE9yZGVyKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX05VTExfT1JERVJfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0ubnVsbE9yZGVyYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHNvcnQgbnVsbCBvcmRlciBcIiR7ZmllbGQubnVsbE9yZGVyfVwiIG11c3QgYmUgXCJudWxscy1maXJzdFwiIG9yIFwibnVsbHMtbGFzdFwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IGZpZWxkLmNvbHVtbik7XG4gICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBzb3J0T3JkZXJbJHtpbmRleH1dLmNvbHVtbmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzb3J0IGNvbHVtbiBcIiR7ZmllbGQuY29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC50cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhcnNlSWNlYmVyZ1RyYW5zZm9ybShmaWVsZC50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX1RSQU5TRk9STV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgc29ydE9yZGVyWyR7aW5kZXh9XS50cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke2ZpZWxkLnRyYW5zZm9ybX1cIiBpcyBub3QgYSB2YWxpZCBJY2ViZXJnIHRyYW5zZm9ybWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBwYXJzZUljZWJlcmdUeXBlKHNvdXJjZUNvbHVtbi50eXBlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlICE9PSBudWxsICYmICF0cmFuc2Zvcm1MZWdhbE9uVHlwZSh0cmFuc2Zvcm0sIHNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1NPUlRfVFJBTlNGT1JNX1RZUEVfTEVHQUwnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0udHJhbnNmb3JtYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRyYW5zZm9ybSBcIiR7ZmllbGQudHJhbnNmb3JtfVwiIGlzIG5vdCBsZWdhbCBvbiBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBjb2x1bW4gXCIke2ZpZWxkLmNvbHVtbn1cIiBvZiB0eXBlIFwiJHtzb3VyY2VDb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgYSBzb3J0IGZpZWxkIGludG8gaXRzIGlkZW50aXR5IGtleS4gQW4gb21pdHRlZCB0cmFuc2Zvcm0gYW5kIGFuXG4gICAgICogZXhwbGljaXQgYGlkZW50aXR5YCBjb2xsYXBzZSB0byB0aGUgc2FtZSBrZXkgc28gdGhleSBjb3VudCBhcyBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkIFNvcnQgZmllbGQgdG8ga2V5LlxuICAgICAqIEByZXR1cm5zIFRoZSBpZGVudGl0eSBzdHJpbmcgZm9yIGR1cGxpY2F0ZSBkZXRlY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzb3J0RmllbGRLZXkoZmllbGQ6IFNvcnRGaWVsZCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChmaWVsZC50cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2ZpZWxkLmNvbHVtbn0gaWRlbnRpdHk6YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYXJzZUljZWJlcmdUcmFuc2Zvcm0oZmllbGQudHJhbnNmb3JtKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgPyBgJHt0cmFuc2Zvcm0ua2luZH06JHt0cmFuc2Zvcm0ucGFyYW0gPz8gJyd9YFxuICAgICAgICAgICAgOiBmaWVsZC50cmFuc2Zvcm0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBgJHtmaWVsZC5jb2x1bW59ICR7bm9ybWFsaXplZFRyYW5zZm9ybX1gO1xuICAgIH1cblxuICAgIC8vLyBJQ0VCRVJHX0ZPUk1BVF9WRVJTSU9OX1ZBTElEIOKAlCBgZm9ybWF0VmVyc2lvbmAsIHdoZW4gc2V0LCBpcyAxLCAyLCBvciAzLlxuICAgIHByaXZhdGUgZm9ybWF0VmVyc2lvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmb3JtYXRWZXJzaW9uLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuICAgICAgICBpZiAoZm9ybWF0VmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IEljZWJlcmdQYXJxdWV0VGFibGUuRk9STUFUX1ZFUlNJT05TLmhhcyhmb3JtYXRWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfRk9STUFUX1ZFUlNJT05fVkFMSUQnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZm9ybWF0VmVyc2lvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYEljZWJlcmcgZm9ybWF0VmVyc2lvbiBcIiR7Zm9ybWF0VmVyc2lvbn1cIiBtdXN0IGJlIDEsIDIsIG9yIDNgLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgdGhlIGNsb3NlZC1kb21haW4gSWNlYmVyZyB0YWJsZSBwcm9wZXJ0aWVzLiBLZXlzIG91dHNpZGUgdGhlXG4gICAgICoga25vd24gc2V0IHBhc3MgdGhyb3VnaCB1bnZhbGlkYXRlZC5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBJQ0VCRVJHX1BST1BFUlRZX0VOVU1fVkFMSURgLCBgSUNFQkVSR19QUk9QRVJUWV9QT1NJVElWRV9JTlRgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19QUk9QRVJUWV9JTlRfUkFOR0VgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgdGFibGUtcHJvcGVydHkgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgdGFibGVQcm9wZXJ0eVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5kZWZpbml0aW9uLnRhYmxlUHJvcGVydGllcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSBJY2ViZXJnUGFycXVldFRhYmxlLkVOVU1fUFJPUEVSVElFU1trZXldO1xuICAgICAgICAgICAgaWYgKGFsbG93ZWQgIT09IHVuZGVmaW5lZCAmJiAhYWxsb3dlZC5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfUFJPUEVSVFlfRU5VTV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWQuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEljZWJlcmdQYXJxdWV0VGFibGUuUE9TSVRJVkVfSU5UX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSAmJiAhaXNQb3NpdGl2ZUludGVnZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX1BPU0lUSVZFX0lOVCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gSWNlYmVyZ1BhcnF1ZXRUYWJsZS5JTlRfUkFOR0VfUFJPUEVSVElFU1trZXldO1xuICAgICAgICAgICAgaWYgKHJhbmdlICE9PSB1bmRlZmluZWQgJiYgIWlzSW50ZWdlckluUmFuZ2UodmFsdWUsIHJhbmdlLm1pbiwgcmFuZ2UubWF4KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19QUk9QRVJUWV9JTlRfUkFOR0UnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHRhYmxlUHJvcGVydGllc1tcIiR7a2V5fVwiXWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBwcm9wZXJ0eSBcIiR7a2V5fVwiIHZhbHVlIFwiJHt2YWx1ZX1cIiBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAke3JhbmdlLm1pbn0gYW5kICR7cmFuZ2UubWF4fWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIGEgcGFydGl0aW9uIGludG8gaXRzIGlkZW50aXR5IGtleS4gV2hlbiB0aGUgdHJhbnNmb3JtIHBhcnNlcyxcbiAgICAgKiBjb2xsYXBzZSBvbiBgJHtraW5kfToke3BhcmFtfWAgc28gYGRheWAgYW5kIGBEQVlgLCBgYnVja2V0WzE2XWAgYW5kXG4gICAgICogYGJ1Y2tldFsgMTYgXWAgYXJlIHRoZSBzYW1lLiBXaGVuIHRoZSB0cmFuc2Zvcm0gZG9lc24ndCBwYXJzZSwgdGhlXG4gICAgICogbG93ZXJjYXNlZCB0cmltIG9mIHRoZSByYXcgc3RyaW5nIGlzIHRoZSBiZXN0IGlkZW50aXR5IHdlIGhhdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFydGl0aW9uIFBhcnRpdGlvbiB0byBrZXkuXG4gICAgICogQHJldHVybnMgVGhlIGlkZW50aXR5IHN0cmluZyBmb3IgZHVwbGljYXRlIGRldGVjdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnRpdGlvbktleShwYXJ0aXRpb246IFBhcnRpdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhcnNlSWNlYmVyZ1RyYW5zZm9ybShwYXJ0aXRpb24udHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgID8gYCR7dHJhbnNmb3JtLmtpbmR9OiR7dHJhbnNmb3JtLnBhcmFtID8/ICcnfWBcbiAgICAgICAgICAgIDogcGFydGl0aW9uLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBgJHtwYXJ0aXRpb24ubmFtZX0gJHtub3JtYWxpemVkVHJhbnNmb3JtfWA7XG4gICAgfVxufVxuIl19
471
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNlYmVyZy1wYXJxdWV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhYmxlLXR5cGVzL2ljZWJlcmctcGFycXVldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7QUFPSCw4Q0FFdUI7QUFDdkIsd0NBTW9CO0FBRXBCOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUNwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLEtBQWE7SUFDdkMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRyxDQUFDO0FBQzFDLENBQUM7QUFFRCwrQkFBK0I7QUFDL0IsTUFBYSxtQkFBb0IsU0FBUSwwQkFBYTtJQUNsRDs7Ozs7T0FLRztJQUNJLGlCQUFpQixDQUFDLElBQVk7UUFDakMsT0FBTyxJQUFBLDRCQUFrQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksbUJBQW1CO1FBQ3RCLE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUM7UUFDbkMsTUFBTSxFQUNGLFVBQVUsR0FDYixHQUFHLElB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QkFBcUIsSUFBSSx1REFBdUQ7aUJBQzVGLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssWUFBWSxDQUFDLFNBQW9CO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE1BQU0sbUJBQW1CLEdBQUcsU0FBUztZQUNqQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFO1lBQzlDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDdEQsQ0FBQzs7QUF0ZEwsa0RBdWRDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJY2ViZXJnIChwYXJxdWV0KSB0YWJsZSB0eXBlLlxuICpcbiAqIEljZWJlcmcgcGFydGl0aW9ucyBhcmUgdHJhbnNmb3JtcyBhcHBsaWVkIHRvIGEgZGF0YSBjb2x1bW4sIHNvIGR1cGxpY2F0ZVxuICogZGV0ZWN0aW9uIGtleXMgb24gdGhlIChzb3VyY2UgY29sdW1uLCBub3JtYWxpemVkIHRyYW5zZm9ybSkgcGFpciDigJQgYHllYXIodHMpYFxuICogYW5kIGBtb250aCh0cylgIGFyZSBkaXN0aW5jdCwgd2hpbGUgYGRheWAgYW5kIGBEQVlgIGNvbGxhcHNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgUGFydGl0aW9uLFxuICAgIFNvcnRGaWVsZCxcbiAgICBWaW9sYXRpb24sXG59IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7XG4gICAgVGFibGVUeXBlQmFzZSxcbn0gZnJvbSAnLi4vdGFibGUtdHlwZSc7XG5pbXBvcnQge1xuICAgIEljZWJlcmdUeXBlS2luZCxcbiAgICBpc1ZhbGlkSWNlYmVyZ1R5cGUsXG4gICAgcGFyc2VJY2ViZXJnVHJhbnNmb3JtLFxuICAgIHBhcnNlSWNlYmVyZ1R5cGUsXG4gICAgdHJhbnNmb3JtTGVnYWxPblR5cGUsXG59IGZyb20gJy4uL2ljZWJlcmcnO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBzdHJpbmcgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyIChkaWdpdHMgb25seSwgdmFsdWUgPiAwKS4gSWNlYmVyZ1xuICogdGFibGUtcHJvcGVydHkgdmFsdWVzIGFyZSBzdHJpbmdzLCBzbyBudW1lcmljIGNoZWNrcyBwYXJzZSB0aGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYHZhbHVlYCBpcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gKi9cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15cXGQrJC8udGVzdCh2YWx1ZSkgJiYgTnVtYmVyKHZhbHVlKSA+IDA7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHN0cmluZyBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIChkaWdpdHMgb25seSwgdmFsdWUgPj0gMCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIFByb3BlcnR5IHZhbHVlIHN0cmluZy5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiBgdmFsdWVgIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gKi9cbmZ1bmN0aW9uIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15cXGQrJC8udGVzdCh2YWx1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHN0cmluZyBpcyBhbiBpbnRlZ2VyIHdpdGhpbiBhbiBpbmNsdXNpdmUgcmFuZ2UuXG4gKlxuICogQHBhcmFtIHZhbHVlIFByb3BlcnR5IHZhbHVlIHN0cmluZy5cbiAqIEBwYXJhbSBtaW4gSW5jbHVzaXZlIGxvd2VyIGJvdW5kLlxuICogQHBhcmFtIG1heCBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gYHZhbHVlYCBpcyBhbiBpbnRlZ2VyIGluIGBbbWluLCBtYXhdYC5cbiAqL1xuZnVuY3Rpb24gaXNJbnRlZ2VySW5SYW5nZSh2YWx1ZTogc3RyaW5nLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgICByZXR1cm4gcGFyc2VkID49IG1pbiAmJiBwYXJzZWQgPD0gbWF4O1xufVxuXG4vKiogSWNlYmVyZyAocGFycXVldCkgdGFibGUuICovXG5leHBvcnQgY2xhc3MgSWNlYmVyZ1BhcnF1ZXRUYWJsZSBleHRlbmRzIFRhYmxlVHlwZUJhc2Uge1xuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGEgY29sdW1uIHR5cGUgYWdhaW5zdCB0aGUgSWNlYmVyZyB2MCB0eXBlIHJlZ2lzdHJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgVHlwZSBzdHJpbmcgZnJvbSBhIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdHlwZSBpcyBhIHZhbGlkIEljZWJlcmcgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkSWNlYmVyZ1R5cGUodHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWNlYmVyZyBwYXJ0aXRpb24gcnVsZXMuXG4gICAgICpcbiAgICAgKiBFbWl0czogYE5PX0RVUExJQ0FURV9QQVJUSVRJT05TYCAoa2V5ZWQgYnkgYCR7bmFtZX0gJHt0cmFuc2Zvcm1LaW5kfToke3BhcmFtfWAsXG4gICAgICogZmFsbGluZyBiYWNrIHRvIGEgbG93ZXJjYXNlZCB0cmltIG9mIHRoZSByYXcgdHJhbnNmb3JtIHdoZW4gaXQgZG9lc24ndFxuICAgICAqIHBhcnNlLCBzbyB3aGl0ZXNwYWNlIC8gY2FzZSB2YXJpYW50cyBvZiB0aGUgc2FtZSB0cmFuc2Zvcm0gY29sbGFwc2UpLFxuICAgICAqIGBJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfRVhJU1RTYCwgYElDRUJFUkdfVFJBTlNGT1JNX1ZBTElEYCwgYW5kXG4gICAgICogYElDRUJFUkdfVFJBTlNGT1JNX1NPVVJDRV9UWVBFX0xFR0FMYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHBhcnRpdGlvbi1yZWxhdGVkIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydGl0aW9uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhcnRpdGlvbnMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBwYXJ0aXRpb25zLmZvckVhY2goKHBhcnRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMucGFydGl0aW9uS2V5KHBhcnRpdGlvbik7XG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb246IFwiJHtwYXJ0aXRpb24ubmFtZX1cIiB3aXRoIHRyYW5zZm9ybSBcIiR7cGFydGl0aW9uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhcnRpdGlvbnMuZm9yRWFjaCgocGFydGl0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gcGFydGl0aW9uLm5hbWUpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEljZWJlcmcgcGFydGl0aW9uIHNvdXJjZSBjb2x1bW4gXCIke3BhcnRpdGlvbi5uYW1lfVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYXJzZUljZWJlcmdUcmFuc2Zvcm0ocGFydGl0aW9uLnR5cGUpO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19UUkFOU0ZPUk1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkIEljZWJlcmcgcGFydGl0aW9uIHRyYW5zZm9ybWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBwYXJzZUljZWJlcmdUeXBlKHNvdXJjZUNvbHVtbi50eXBlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlICE9PSBudWxsICYmICF0cmFuc2Zvcm1MZWdhbE9uVHlwZSh0cmFuc2Zvcm0sIHNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1RSQU5TRk9STV9TT1VSQ0VfVFlQRV9MRUdBTCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0cmFuc2Zvcm0gXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBsZWdhbCBvbiBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBjb2x1bW4gXCIke3BhcnRpdGlvbi5uYW1lfVwiIG9mIHR5cGUgXCIke3NvdXJjZUNvbHVtbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBUaGUgSWNlYmVyZyBmb3JtYXQgdmVyc2lvbnMgdGhpcyB2YWxpZGF0b3IgdW5kZXJzdGFuZHMuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRk9STUFUX1ZFUlNJT05TID0gbmV3IFNldChbXG4gICAgICAgIDEsXG4gICAgICAgIDIsXG4gICAgICAgIDMsXG4gICAgXSk7XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGNvbWUgZnJvbSBhIGNsb3NlZCBzZXQuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU5VTV9QUk9QRVJUSUVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gICAgICAgICd3cml0ZS5mb3JtYXQuZGVmYXVsdCc6IFtcbiAgICAgICAgICAgICdwYXJxdWV0JyxcbiAgICAgICAgICAgICdhdnJvJyxcbiAgICAgICAgICAgICdvcmMnLFxuICAgICAgICBdLFxuICAgICAgICAnd3JpdGUucGFycXVldC5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdnemlwJyxcbiAgICAgICAgICAgICdzbmFwcHknLFxuICAgICAgICAgICAgJ2x6NCcsXG4gICAgICAgICAgICAnbm9uZScsXG4gICAgICAgIF0sXG4gICAgICAgICd3cml0ZS5hdnJvLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICAgICAgJ3pzdGQnLFxuICAgICAgICAgICAgJ3NuYXBweScsXG4gICAgICAgICAgICAndW5jb21wcmVzc2VkJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm9yYy5jb21wcmVzc2lvbi1jb2RlYyc6IFtcbiAgICAgICAgICAgICd6c3RkJyxcbiAgICAgICAgICAgICdsejQnLFxuICAgICAgICAgICAgJ2x6bycsXG4gICAgICAgICAgICAnemxpYicsXG4gICAgICAgICAgICAnc25hcHB5JyxcbiAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLmRpc3RyaWJ1dGlvbi1tb2RlJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2hhc2gnLFxuICAgICAgICAgICAgJ3JhbmdlJyxcbiAgICAgICAgXSxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLmNvbXByZXNzaW9uLWNvZGVjJzogW1xuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgJ2d6aXAnLFxuICAgICAgICBdLFxuICAgIH07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQT1NJVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICd3cml0ZS50YXJnZXQtZmlsZS1zaXplLWJ5dGVzJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1zbmFwc2hvdC1hZ2UtbXMnLFxuICAgICAgICAnaGlzdG9yeS5leHBpcmUubWluLXNuYXBzaG90cy10by1rZWVwJyxcbiAgICAgICAgJ2hpc3RvcnkuZXhwaXJlLm1heC1yZWYtYWdlLW1zJyxcbiAgICAgICAgJ3dyaXRlLm1ldGFkYXRhLnByZXZpb3VzLXZlcnNpb25zLW1heCcsXG4gICAgICAgICdjb21taXQucmV0cnkubWluLXdhaXQtbXMnLFxuICAgICAgICAnY29tbWl0LnJldHJ5Lm1heC13YWl0LW1zJyxcbiAgICAgICAgJ2NvbW1pdC5yZXRyeS50b3RhbC10aW1lb3V0LW1zJyxcbiAgICBdO1xuXG4gICAgLy8vIFRhYmxlLXByb3BlcnR5IGtleXMgd2hvc2UgdmFsdWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5PTl9ORUdBVElWRV9JTlRfUFJPUEVSVElFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICAgICAgICdjb21taXQucmV0cnkubnVtLXJldHJpZXMnLFxuICAgIF07XG5cbiAgICAvLy8gVGFibGUtcHJvcGVydHkga2V5cyB3aG9zZSB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgd2l0aGluIGFuIGluY2x1c2l2ZSByYW5nZS5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTlRfUkFOR0VfUFJPUEVSVElFUzogUmVjb3JkPHN0cmluZywgeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfT4gPSB7XG4gICAgICAgICd3cml0ZS5wYXJxdWV0LmNvbXByZXNzaW9uLWxldmVsJzoge1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiAyMixcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8vIExlZ2FsIHNvcnQgZGlyZWN0aW9ucyBhbmQgbnVsbCBvcmRlcmluZ3MuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09SVF9ESVJFQ1RJT05TID0gbmV3IFNldChbXG4gICAgICAgICdhc2MnLFxuICAgICAgICAnZGVzYycsXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTT1JUX05VTExfT1JERVJTID0gbmV3IFNldChbXG4gICAgICAgICdudWxscy1maXJzdCcsXG4gICAgICAgICdudWxscy1sYXN0JyxcbiAgICBdKTtcblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgZW5naW5lLXNwZWNpZmljIHJ1bGVzOiBmb3JtYXQgdmVyc2lvbiwgdGFibGUgcHJvcGVydGllcywgYW5kIHNvcnRcbiAgICAgKiBvcmRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGVuZ2luZS1zcGVjaWZpYyB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGVuZ2luZVNwZWNpZmljVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi50aGlzLmZvcm1hdFZlcnNpb25WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnRhYmxlUHJvcGVydHlWaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLnNvcnRPcmRlclZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuaWRlbnRpZmllckZpZWxkVmlvbGF0aW9ucygpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoZSBJY2ViZXJnIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgTk9fRFVQTElDQVRFX1NPUlRfRklFTERTYCAoa2V5ZWQgYnkgc291cmNlIGNvbHVtbiArIG5vcm1hbGl6ZWRcbiAgICAgKiB0cmFuc2Zvcm0pLCBgSUNFQkVSR19TT1JUX0NPTFVNTl9FWElTVFNgLCBgSUNFQkVSR19TT1JUX0RJUkVDVElPTl9WQUxJRGAsXG4gICAgICogYElDRUJFUkdfU09SVF9OVUxMX09SREVSX1ZBTElEYCwgYElDRUJFUkdfU09SVF9UUkFOU0ZPUk1fVkFMSURgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19TT1JUX1RSQU5TRk9STV9UWVBFX0xFR0FMYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHNvcnQtb3JkZXIgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydE9yZGVyVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc29ydEZpZWxkS2V5KGZpZWxkKTtcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdOT19EVVBMSUNBVEVfU09SVF9GSUVMRFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIHNvcnQgZmllbGQ6IFwiJHtmaWVsZC5jb2x1bW59XCJgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGAke2ZpZWxkLnRyYW5zZm9ybSA/IGAgd2l0aCB0cmFuc2Zvcm0gXCIke2ZpZWxkLnRyYW5zZm9ybX1cImAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvcnRPcmRlci5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghSWNlYmVyZ1BhcnF1ZXRUYWJsZS5TT1JUX0RJUkVDVElPTlMuaGFzKGZpZWxkLmRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9ESVJFQ1RJT05fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0uZGlyZWN0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHNvcnQgZGlyZWN0aW9uIFwiJHtmaWVsZC5kaXJlY3Rpb259XCIgbXVzdCBiZSBcImFzY1wiIG9yIFwiZGVzY1wiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUljZWJlcmdQYXJxdWV0VGFibGUuU09SVF9OVUxMX09SREVSUy5oYXMoZmllbGQubnVsbE9yZGVyKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX05VTExfT1JERVJfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0ubnVsbE9yZGVyYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHNvcnQgbnVsbCBvcmRlciBcIiR7ZmllbGQubnVsbE9yZGVyfVwiIG11c3QgYmUgXCJudWxscy1maXJzdFwiIG9yIFwibnVsbHMtbGFzdFwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IGZpZWxkLmNvbHVtbik7XG4gICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfU09SVF9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBzb3J0T3JkZXJbJHtpbmRleH1dLmNvbHVtbmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzb3J0IGNvbHVtbiBcIiR7ZmllbGQuY29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC50cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhcnNlSWNlYmVyZ1RyYW5zZm9ybShmaWVsZC50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19TT1JUX1RSQU5TRk9STV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgc29ydE9yZGVyWyR7aW5kZXh9XS50cmFuc2Zvcm1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke2ZpZWxkLnRyYW5zZm9ybX1cIiBpcyBub3QgYSB2YWxpZCBJY2ViZXJnIHRyYW5zZm9ybWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBwYXJzZUljZWJlcmdUeXBlKHNvdXJjZUNvbHVtbi50eXBlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlICE9PSBudWxsICYmICF0cmFuc2Zvcm1MZWdhbE9uVHlwZSh0cmFuc2Zvcm0sIHNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1NPUlRfVFJBTlNGT1JNX1RZUEVfTEVHQUwnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHNvcnRPcmRlclske2luZGV4fV0udHJhbnNmb3JtYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRyYW5zZm9ybSBcIiR7ZmllbGQudHJhbnNmb3JtfVwiIGlzIG5vdCBsZWdhbCBvbiBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBjb2x1bW4gXCIke2ZpZWxkLmNvbHVtbn1cIiBvZiB0eXBlIFwiJHtzb3VyY2VDb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgYSBzb3J0IGZpZWxkIGludG8gaXRzIGlkZW50aXR5IGtleS4gQW4gb21pdHRlZCB0cmFuc2Zvcm0gYW5kIGFuXG4gICAgICogZXhwbGljaXQgYGlkZW50aXR5YCBjb2xsYXBzZSB0byB0aGUgc2FtZSBrZXkgc28gdGhleSBjb3VudCBhcyBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpZWxkIFNvcnQgZmllbGQgdG8ga2V5LlxuICAgICAqIEByZXR1cm5zIFRoZSBpZGVudGl0eSBzdHJpbmcgZm9yIGR1cGxpY2F0ZSBkZXRlY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBzb3J0RmllbGRLZXkoZmllbGQ6IFNvcnRGaWVsZCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChmaWVsZC50cmFuc2Zvcm0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2ZpZWxkLmNvbHVtbn0gaWRlbnRpdHk6YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYXJzZUljZWJlcmdUcmFuc2Zvcm0oZmllbGQudHJhbnNmb3JtKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuICAgICAgICAgICAgPyBgJHt0cmFuc2Zvcm0ua2luZH06JHt0cmFuc2Zvcm0ucGFyYW0gPz8gJyd9YFxuICAgICAgICAgICAgOiBmaWVsZC50cmFuc2Zvcm0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBgJHtmaWVsZC5jb2x1bW59ICR7bm9ybWFsaXplZFRyYW5zZm9ybX1gO1xuICAgIH1cblxuICAgIC8vLyBJQ0VCRVJHX0ZPUk1BVF9WRVJTSU9OX1ZBTElEIOKAlCBgZm9ybWF0VmVyc2lvbmAsIHdoZW4gc2V0LCBpcyAxLCAyLCBvciAzLlxuICAgIHByaXZhdGUgZm9ybWF0VmVyc2lvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmb3JtYXRWZXJzaW9uLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuICAgICAgICBpZiAoZm9ybWF0VmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IEljZWJlcmdQYXJxdWV0VGFibGUuRk9STUFUX1ZFUlNJT05TLmhhcyhmb3JtYXRWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfRk9STUFUX1ZFUlNJT05fVkFMSUQnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZm9ybWF0VmVyc2lvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYEljZWJlcmcgZm9ybWF0VmVyc2lvbiBcIiR7Zm9ybWF0VmVyc2lvbn1cIiBtdXN0IGJlIDEsIDIsIG9yIDNgLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgdGhlIGNsb3NlZC1kb21haW4gSWNlYmVyZyB0YWJsZSBwcm9wZXJ0aWVzLiBLZXlzIG91dHNpZGUgdGhlXG4gICAgICoga25vd24gc2V0IHBhc3MgdGhyb3VnaCB1bnZhbGlkYXRlZC5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBJQ0VCRVJHX1BST1BFUlRZX0VOVU1fVkFMSURgLCBgSUNFQkVSR19QUk9QRVJUWV9QT1NJVElWRV9JTlRgLFxuICAgICAqIGBJQ0VCRVJHX1BST1BFUlRZX05PTl9ORUdBVElWRV9JTlRgLCBgSUNFQkVSR19QUk9QRVJUWV9JTlRfUkFOR0VgLCBhbmRcbiAgICAgKiBgSUNFQkVSR19DT01NSVRfUkVUUllfT1JERVJJTkdgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgdGFibGUtcHJvcGVydHkgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgdGFibGVQcm9wZXJ0eVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5kZWZpbml0aW9uLnRhYmxlUHJvcGVydGllcztcblxuICAgICAgICBmb3IgKGNvbnN0IFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICBdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkID0gSWNlYmVyZ1BhcnF1ZXRUYWJsZS5FTlVNX1BST1BFUlRJRVNba2V5XTtcbiAgICAgICAgICAgIGlmIChhbGxvd2VkICE9PSB1bmRlZmluZWQgJiYgIWFsbG93ZWQuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0VOVU1fVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHRhYmxlUHJvcGVydGllc1tcIiR7a2V5fVwiXWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBwcm9wZXJ0eSBcIiR7a2V5fVwiIHZhbHVlIFwiJHt2YWx1ZX1cIiBtdXN0IGJlIG9uZSBvZjogJHthbGxvd2VkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChJY2ViZXJnUGFycXVldFRhYmxlLlBPU0lUSVZFX0lOVF9QUk9QRVJUSUVTLmluY2x1ZGVzKGtleSkgJiYgIWlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19QUk9QRVJUWV9QT1NJVElWRV9JTlQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHRhYmxlUHJvcGVydGllc1tcIiR7a2V5fVwiXWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBwcm9wZXJ0eSBcIiR7a2V5fVwiIHZhbHVlIFwiJHt2YWx1ZX1cIiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcmAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoSWNlYmVyZ1BhcnF1ZXRUYWJsZS5OT05fTkVHQVRJVkVfSU5UX1BST1BFUlRJRVMuaW5jbHVkZXMoa2V5KSAmJiAhaXNOb25OZWdhdGl2ZUludGVnZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX05PTl9ORUdBVElWRV9JTlQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHRhYmxlUHJvcGVydGllc1tcIiR7a2V5fVwiXWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0YWJsZSBwcm9wZXJ0eSBcIiR7a2V5fVwiIHZhbHVlIFwiJHt2YWx1ZX1cIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBJY2ViZXJnUGFycXVldFRhYmxlLklOVF9SQU5HRV9QUk9QRVJUSUVTW2tleV07XG4gICAgICAgICAgICBpZiAocmFuZ2UgIT09IHVuZGVmaW5lZCAmJiAhaXNJbnRlZ2VySW5SYW5nZSh2YWx1ZSwgcmFuZ2UubWluLCByYW5nZS5tYXgpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdJQ0VCRVJHX1BST1BFUlRZX0lOVF9SQU5HRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgdGFibGVQcm9wZXJ0aWVzW1wiJHtrZXl9XCJdYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHRhYmxlIHByb3BlcnR5IFwiJHtrZXl9XCIgdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICsgYCR7cmFuZ2UubWlufSBhbmQgJHtyYW5nZS5tYXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4udGhpcy5jb21taXRSZXRyeU9yZGVyaW5nVmlvbGF0aW9ucyhwcm9wZXJ0aWVzKSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIElDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HIOKAlCBjb21taXQucmV0cnkgd2FpdHMgb2JleVxuICAgIC8vLyBtaW4td2FpdC1tcyA8PSBtYXgtd2FpdC1tcyA8PSB0b3RhbC10aW1lb3V0LW1zIHdoZW4gYWxsIGFyZSBwb3NpdGl2ZSBpbnRzLlxuICAgIHByaXZhdGUgY29tbWl0UmV0cnlPcmRlcmluZ1Zpb2xhdGlvbnMocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgICAgICAgcHJvcGVydGllc1snY29tbWl0LnJldHJ5Lm1pbi13YWl0LW1zJ10sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzWydjb21taXQucmV0cnkubWF4LXdhaXQtbXMnXSxcbiAgICAgICAgICAgIHByb3BlcnRpZXNbJ2NvbW1pdC5yZXRyeS50b3RhbC10aW1lb3V0LW1zJ10sXG4gICAgICAgIF07XG4gICAgICAgIGlmICghdmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpc1Bvc2l0aXZlSW50ZWdlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgIF0gPSB2YWx1ZXMubWFwKE51bWJlcik7XG4gICAgICAgIGlmIChtaW4gPD0gbWF4ICYmIG1heCA8PSB0b3RhbCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfQ09NTUlUX1JFVFJZX09SREVSSU5HJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3RhYmxlUHJvcGVydGllc1tcImNvbW1pdC5yZXRyeS5taW4td2FpdC1tc1wiXScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2NvbW1pdC5yZXRyeSB3YWl0cyBtdXN0IHNhdGlzZnkgbWluLXdhaXQtbXMgPD0gbWF4LXdhaXQtbXMgPD0gdG90YWwtdGltZW91dC1tcycsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBJY2ViZXJnIGlkZW50aWZpZXIgZmllbGRzICh0aGUgcm93LWlkZW50aXR5IC8gZXF1YWxpdHktZGVsZXRlXG4gICAgICoga2V5KS4gRXF1YWxpdHkgZGVsZXRlcyBhcmUgYSBmb3JtYXQtdmVyc2lvbiAyKyBmZWF0dXJlLCBhbmQgaWRlbnRpZmllclxuICAgICAqIGZpZWxkcyBtdXN0IGJlIHJlcXVpcmVkIHByaW1pdGl2ZSBjb2x1bW5zIHRoYXQgYXJlIG5vdCBmbG9hdC9kb3VibGUuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgSUNFQkVSR19JREVOVElGSUVSX05FRURTX0ZPUk1BVF9WMmAsIGBJQ0VCRVJHX0lERU5USUZJRVJfQ09MVU1OX0VYSVNUU2AsXG4gICAgICogYElDRUJFUkdfSURFTlRJRklFUl9SRVFVSVJFRGAsIGFuZCBgSUNFQkVSR19JREVOVElGSUVSX1RZUEVfUFJJTUlUSVZFYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGlkZW50aWZpZXItZmllbGQgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaWRlbnRpZmllckZpZWxkVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXJGaWVsZHMsXG4gICAgICAgICAgICBmb3JtYXRWZXJzaW9uLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGlmIChpZGVudGlmaWVyRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdFZlcnNpb24gPT09IDEpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfSURFTlRJRklFUl9ORUVEU19GT1JNQVRfVjInLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnaWRlbnRpZmllckZpZWxkcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lkZW50aWZpZXIgZmllbGRzIHJlcXVpcmUgZm9ybWF0VmVyc2lvbiAyIG9yIGhpZ2hlciAoZXF1YWxpdHkgZGVsZXRlcyBhcmUgYSB2MiBmZWF0dXJlKScsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZGVudGlmaWVyRmllbGRzLmZvckVhY2goKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGBpZGVudGlmaWVyRmllbGRzWyR7aW5kZXh9XWA7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnSUNFQkVSR19JREVOVElGSUVSX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlkZW50aWZpZXIgZmllbGQgXCIke25hbWV9XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2x1bW4ubnVsbGFibGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfSURFTlRJRklFUl9SRVFVSVJFRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpZmllciBmaWVsZCBcIiR7bmFtZX1cIiBtdXN0IGJlIHJlcXVpcmVkIChudWxsYWJsZTogZmFsc2UpYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VJY2ViZXJnVHlwZShjb2x1bW4udHlwZSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlLmtpbmQgPT09IEljZWJlcmdUeXBlS2luZC5GTE9BVCB8fCB0eXBlLmtpbmQgPT09IEljZWJlcmdUeXBlS2luZC5ET1VCTEUpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0lDRUJFUkdfSURFTlRJRklFUl9UWVBFX1BSSU1JVElWRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpZmllciBmaWVsZCBcIiR7bmFtZX1cIiBtdXN0IGJlIGEgcHJpbWl0aXZlIHR5cGUgb3RoZXIgdGhhbiBmbG9hdCBvciBkb3VibGVgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIGEgcGFydGl0aW9uIGludG8gaXRzIGlkZW50aXR5IGtleS4gV2hlbiB0aGUgdHJhbnNmb3JtIHBhcnNlcyxcbiAgICAgKiBjb2xsYXBzZSBvbiBgJHtraW5kfToke3BhcmFtfWAgc28gYGRheWAgYW5kIGBEQVlgLCBgYnVja2V0WzE2XWAgYW5kXG4gICAgICogYGJ1Y2tldFsgMTYgXWAgYXJlIHRoZSBzYW1lLiBXaGVuIHRoZSB0cmFuc2Zvcm0gZG9lc24ndCBwYXJzZSwgdGhlXG4gICAgICogbG93ZXJjYXNlZCB0cmltIG9mIHRoZSByYXcgc3RyaW5nIGlzIHRoZSBiZXN0IGlkZW50aXR5IHdlIGhhdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFydGl0aW9uIFBhcnRpdGlvbiB0byBrZXkuXG4gICAgICogQHJldHVybnMgVGhlIGlkZW50aXR5IHN0cmluZyBmb3IgZHVwbGljYXRlIGRldGVjdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnRpdGlvbktleShwYXJ0aXRpb246IFBhcnRpdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhcnNlSWNlYmVyZ1RyYW5zZm9ybShwYXJ0aXRpb24udHlwZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbiAgICAgICAgICAgID8gYCR7dHJhbnNmb3JtLmtpbmR9OiR7dHJhbnNmb3JtLnBhcmFtID8/ICcnfWBcbiAgICAgICAgICAgIDogcGFydGl0aW9uLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBgJHtwYXJ0aXRpb24ubmFtZX0gJHtub3JtYWxpemVkVHJhbnNmb3JtfWA7XG4gICAgfVxufVxuIl19
@@ -36,6 +36,16 @@ export declare class Postgres18Table extends TableTypeBase {
36
36
  * @returns Every engine-specific violation.
37
37
  */
38
38
  engineSpecificViolations(): Violation[];
39
+ /**
40
+ * Validate exclusion constraints.
41
+ *
42
+ * Emits `POSTGRES_EXCLUSION_NAME_UNIQUE`, `POSTGRES_EXCLUSION_METHOD_VALID`,
43
+ * `POSTGRES_EXCLUSION_COLUMN_EXISTS`, `POSTGRES_EXCLUSION_NO_DUPLICATE_COLUMNS`,
44
+ * and `POSTGRES_EXCLUSION_INCLUDES_PARTITION_KEYS`.
45
+ *
46
+ * @returns Every exclusion-constraint violation.
47
+ */
48
+ private exclusionConstraintViolations;
39
49
  /**
40
50
  * Validate Postgres column attributes: identity columns, the mutual
41
51
  * exclusivity between being generated / an identity / having a default, and
@@ -50,6 +50,10 @@ const INTEGER_TYPES = new Set([
50
50
  'bigint',
51
51
  'int8',
52
52
  ]);
53
+ const EXCLUSION_METHODS = new Set([
54
+ 'gist',
55
+ 'spgist',
56
+ ]);
53
57
  const COMPRESSION_METHODS = new Set([
54
58
  'pglz',
55
59
  'lz4',
@@ -150,10 +154,76 @@ class Postgres18Table extends table_type_1.TableTypeBase {
150
154
  ...this.indexViolations(),
151
155
  ...this.uniqueConstraintViolations(),
152
156
  ...this.checkConstraintViolations(),
157
+ ...this.exclusionConstraintViolations(),
153
158
  ...this.generatedColumnViolations(),
154
159
  ...this.columnAttributeViolations(),
155
160
  ];
156
161
  }
162
+ /**
163
+ * Validate exclusion constraints.
164
+ *
165
+ * Emits `POSTGRES_EXCLUSION_NAME_UNIQUE`, `POSTGRES_EXCLUSION_METHOD_VALID`,
166
+ * `POSTGRES_EXCLUSION_COLUMN_EXISTS`, `POSTGRES_EXCLUSION_NO_DUPLICATE_COLUMNS`,
167
+ * and `POSTGRES_EXCLUSION_INCLUDES_PARTITION_KEYS`.
168
+ *
169
+ * @returns Every exclusion-constraint violation.
170
+ */
171
+ exclusionConstraintViolations() {
172
+ const violations = [];
173
+ const { exclusionConstraints, } = this.definition;
174
+ for (const duplicate of this.findDuplicates(exclusionConstraints.map((constraint) => constraint.name))) {
175
+ violations.push(this.violation({
176
+ level: 'error',
177
+ code: 'POSTGRES_EXCLUSION_NAME_UNIQUE',
178
+ field: 'exclusionConstraints',
179
+ message: `duplicate exclusion-constraint name "${duplicate}"`,
180
+ }));
181
+ }
182
+ const partitionKeys = this.definition.partitions
183
+ .map((partition) => partition.name)
184
+ .filter((name) => this.hasColumn(name));
185
+ exclusionConstraints.forEach((constraint, position) => {
186
+ const field = `exclusionConstraints[${position}]`;
187
+ const columns = constraint.elements.map((element) => element.column);
188
+ if (!EXCLUSION_METHODS.has(constraint.using.trim().toLowerCase())) {
189
+ violations.push(this.violation({
190
+ level: 'error',
191
+ code: 'POSTGRES_EXCLUSION_METHOD_VALID',
192
+ field: `${field}.using`,
193
+ message: `exclusion method "${constraint.using}" must be "gist" or "spgist"`,
194
+ }));
195
+ }
196
+ for (const duplicate of this.findDuplicates(columns)) {
197
+ violations.push(this.violation({
198
+ level: 'error',
199
+ code: 'POSTGRES_EXCLUSION_NO_DUPLICATE_COLUMNS',
200
+ field: `${field}.elements`,
201
+ message: `exclusion constraint "${constraint.name}" lists column "${duplicate}" more than once`,
202
+ }));
203
+ }
204
+ constraint.elements.forEach((element, elementIndex) => {
205
+ if (!this.hasColumn(element.column)) {
206
+ violations.push(this.violation({
207
+ level: 'error',
208
+ code: 'POSTGRES_EXCLUSION_COLUMN_EXISTS',
209
+ field: `${field}.elements[${elementIndex}].column`,
210
+ message: `exclusion-constraint column "${element.column}" is not defined in columns`,
211
+ }));
212
+ }
213
+ });
214
+ const missing = partitionKeys.filter((name) => !columns.includes(name));
215
+ if (missing.length > 0) {
216
+ violations.push(this.violation({
217
+ level: 'error',
218
+ code: 'POSTGRES_EXCLUSION_INCLUDES_PARTITION_KEYS',
219
+ field: `${field}.elements`,
220
+ message: `exclusion constraint "${constraint.name}" on a partitioned table must include `
221
+ + `every partition key column; missing: ${missing.join(', ')}`,
222
+ }));
223
+ }
224
+ });
225
+ return violations;
226
+ }
157
227
  /**
158
228
  * Validate Postgres column attributes: identity columns, the mutual
159
229
  * exclusivity between being generated / an identity / having a default, and
@@ -531,4 +601,4 @@ class Postgres18Table extends table_type_1.TableTypeBase {
531
601
  }
532
602
  }
533
603
  exports.Postgres18Table = Postgres18Table;
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtMTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcG9zdGdyZXMtMTgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7OztBQVNILDhDQUV1QjtBQUN2QixvQ0FHa0I7QUFFbEIsTUFBTSxVQUFVLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtDQUNULENBQUMsQ0FBQztBQUVILE1BQU0sYUFBYSxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUMvQyxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsT0FBTztJQUNQLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLGVBQWUsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDakQsUUFBUTtJQUNSLFNBQVM7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDaEQsUUFBUTtJQUNSLFdBQVc7Q0FDZCxDQUFDLENBQUM7QUFFSCxrREFBa0Q7QUFDbEQsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQy9DLFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLG1CQUFtQixHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNyRCxNQUFNO0lBQ04sS0FBSztDQUNSLENBQUMsQ0FBQztBQUVILE1BQU0sa0JBQWtCLEdBQXdCLElBQUksR0FBRyxD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QUUsR0FBRyxLQUFLLFlBQVksV0FBVyxTQUFTO29CQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLE1BQU0sQ0FBQyxLQUFLLDZCQUE2QjtpQkFDckUsQ0FBQyxDQUFDLENBQUM7WUFDUixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzNCLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSw4QkFBOEI7b0JBQ3BDLEtBQUssRUFBRSxHQUFHLEtBQUssWUFBWSxZQUFZLEdBQUc7b0JBQzFDLE9BQU8sRUFBRSx5QkFBeUIsUUFBUSw2QkFBNkI7aUJBQzFFLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztDQUNKO0FBMWdCRCwwQ0EwZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3N0Z3JlcyAxOCB0YWJsZSB0eXBlLlxuICpcbiAqIFBvc3RncmVzIHVzZXMgZGVjbGFyYXRpdmUgcGFydGl0aW9uaW5nOiBhIHRhYmxlIGlzIHBhcnRpdGlvbmVkIGJ5IG9uZSBzdHJhdGVneVxuICogKGByYW5nZWAsIGBsaXN0YCwgb3IgYGhhc2hgKSBvdmVyIG9uZSBvciBtb3JlIGV4aXN0aW5nIGtleSBjb2x1bW5zLiBFYWNoXG4gKiBwYXJ0aXRpb24gZW50cnkgbmFtZXMgYSBrZXkgY29sdW1uIChgbmFtZWApIGFuZCB0aGUgc3RyYXRlZ3kgKGB0eXBlYCk7IGFsbFxuICogZW50cmllcyBvbiBhIHRhYmxlIG11c3Qgc2hhcmUgb25lIHN0cmF0ZWd5LlxuICovXG5cbmltcG9ydCB7XG4gICAgQ2hlY2tDb25zdHJhaW50LFxuICAgIEluZGV4LFxuICAgIFBhcnRpdGlvbixcbiAgICBVbmlxdWVDb25zdHJhaW50LFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgaXNQb3N0Z3Jlc0NvbGxhdGFibGVUeXBlLFxuICAgIGlzVmFsaWRQb3N0Z3Jlc1R5cGUsXG59IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgU1RSQVRFR0lFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdyYW5nZScsXG4gICAgJ2xpc3QnLFxuICAgICdoYXNoJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9NRVRIT0RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ2J0cmVlJyxcbiAgICAnaGFzaCcsXG4gICAgJ2dpc3QnLFxuICAgICdzcGdpc3QnLFxuICAgICdnaW4nLFxuICAgICdicmluJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9TT1JUUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdhc2MnLFxuICAgICdkZXNjJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9OVUxMUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdmaXJzdCcsXG4gICAgJ2xhc3QnLFxuXSk7XG5cbmNvbnN0IEdFTkVSQVRFRF9LSU5EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdzdG9yZWQnLFxuICAgICd2aXJ0dWFsJyxcbl0pO1xuXG5jb25zdCBJREVOVElUWV9LSU5EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdhbHdheXMnLFxuICAgICdieURlZmF1bHQnLFxuXSk7XG5cbi8vLyBJbnRlZ2VyIGJhc2UgdHlwZXMgYW4gaWRlbnRpdHkgY29sdW1uIG1heSB1c2UuXG5jb25zdCBJTlRFR0VSX1RZUEVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ3NtYWxsaW50JyxcbiAgICAnaW50MicsXG4gICAgJ2ludGVnZXInLFxuICAgICdpbnQnLFxuICAgICdpbnQ0JyxcbiAgICAnYmlnaW50JyxcbiAgICAnaW50OCcsXG5dKTtcblxuY29uc3QgQ09NUFJFU1NJT05fTUVUSE9EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdwZ2x6JyxcbiAgICAnbHo0Jyxcbl0pO1xuXG5jb25zdCBTVE9SQUdFX1NUUkFURUdJRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAncGxhaW4nLFxuICAgICdleHRlcm5hbCcsXG4gICAgJ2V4dGVuZGVkJyxcbiAgICAnbWFpbicsXG4gICAgJ2RlZmF1bHQnLFxuXSk7XG5cbi8qKiBQb3N0Z3JlcyAxOCB0YWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3JlczE4VGFibGUgZXh0ZW5kcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIFBvc3RncmVzIHR5cGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIHN0cmluZyBmcm9tIGEgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB0eXBlIGlzIGEgdmFsaWQgUG9zdGdyZXMgMTggdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkUG9zdGdyZXNUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc3RncmVzIHBhcnRpdGlvbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzOiBgTk9fRFVQTElDQVRFX1BBUlRJVElPTlNgIChhIGtleSBjb2x1bW4gbGlzdGVkIHR3aWNlKSxcbiAgICAgKiBgUE9TVEdSRVNfUEFSVElUSU9OX0NPTFVNTl9FWElTVFNgICh0aGUga2V5IGNvbHVtbiBtdXN0IGJlIGEgZGF0YSBjb2x1bW4pLFxuICAgICAqIGBQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSURgICh0aGUgc3RyYXRlZ3kgbXVzdCBiZSByYW5nZSAvIGxpc3QgL1xuICAgICAqIGhhc2gpLCBhbmQgYFBPU1RHUkVTX1BBUlRJVElPTl9TSU5HTEVfU1RSQVRFR1lgIChhIHRhYmxlIHBhcnRpdGlvbnMgYnkgb25lXG4gICAgICogc3RyYXRlZ3kgb25seSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMocGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAncGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb246IFBhcnRpdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHBhcnRpdGlvbiBrZXkgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLy8gUG9zdGdyZXMgcmVxdWlyZXMgdGhlIHByaW1hcnkga2V5IHRvIGluY2x1ZGUgZXZlcnkgcGFydGl0aW9uLWtleVxuICAgICAgICAgICAgICAgIC8vLyBjb2x1bW4sIHNvIGEgcGFydGl0aW9uIGNvbHVtbiBvdXRzaWRlIHRoZSBwcmltYXJ5IGtleSBpcyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfUEFSVElUSU9OX0tFWV9JTl9QSycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgbXVzdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdHJhdGVneSA9IHBhcnRpdGlvbi50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFNUUkFURUdJRVMuaGFzKHN0cmF0ZWd5KSkge1xuICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuYWRkKHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkIFBvc3RncmVzIHBhcnRpdGlvbiBzdHJhdGVneSAocmFuZ2UsIGxpc3QsIGhhc2gpYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdHJhdGVnaWVzLnNpemUgPiAxKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU0lOR0xFX1NUUkFURUdZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3BhcnRpdGlvbnMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBhIHBhcnRpdGlvbmVkIHRhYmxlIHVzZXMgb25lIHN0cmF0ZWd5OyBmb3VuZCAke1tcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RyYXRlZ2llcyxcbiAgICAgICAgICAgICAgICBdLnNvcnQoKS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQb3N0Z3JlcyBlbmdpbmUtc3BlY2lmaWMgcnVsZXM6IGluZGV4ZXMsIHVuaXF1ZSBjb25zdHJhaW50cywgYW5kIGNoZWNrXG4gICAgICogY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBlbmdpbmUtc3BlY2lmaWMgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbmdpbmVTcGVjaWZpY1Zpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5pbmRleFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMudW5pcXVlQ29uc3RyYWludFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY2hlY2tDb25zdHJhaW50VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5nZW5lcmF0ZWRDb2x1bW5WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLmNvbHVtbkF0dHJpYnV0ZVZpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBQb3N0Z3JlcyBjb2x1bW4gYXR0cmlidXRlczogaWRlbnRpdHkgY29sdW1ucywgdGhlIG11dHVhbFxuICAgICAqIGV4Y2x1c2l2aXR5IGJldHdlZW4gYmVpbmcgZ2VuZXJhdGVkIC8gYW4gaWRlbnRpdHkgLyBoYXZpbmcgYSBkZWZhdWx0LCBhbmRcbiAgICAgKiBwZXItY29sdW1uIGNvbGxhdGlvbiwgY29tcHJlc3Npb24sIGFuZCBzdG9yYWdlLlxuICAgICAqXG4gICAgICogRW1pdHMgYFBPU1RHUkVTX0lERU5USVRZX1ZBTElEYCwgYFBPU1RHUkVTX0lERU5USVRZX1RZUEVfSU5URUdFUmAsXG4gICAgICogYFBPU1RHUkVTX0NPTFVNTl9HRU5FUkFUSU9OX0VYQ0xVU0lWRWAsIGBQT1NUR1JFU19DT0xMQVRJT05fT05fVEVYVF9UWVBFYCxcbiAgICAgKiBgUE9TVEdSRVNfQ09NUFJFU1NJT05fVkFMSURgLCBhbmQgYFBPU1RHUkVTX1NUT1JBR0VfVkFMSURgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgY29sdW1uLWF0dHJpYnV0ZSB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb2x1bW5BdHRyaWJ1dGVWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcblxuICAgICAgICB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGBjb2x1bW5zWyR7aW5kZXh9XWA7XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uaWRlbnRpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICghSURFTlRJVFlfS0lORFMuaGFzKGNvbHVtbi5pZGVudGl0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lERU5USVRZX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uaWRlbnRpdHlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlkZW50aXR5IFwiJHtjb2x1bW4uaWRlbnRpdHl9XCIgbXVzdCBiZSBcImFsd2F5c1wiIG9yIFwiYnlEZWZhdWx0XCJgLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSU5URUdFUl9UWVBFUy5oYXMoY29sdW1uLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JREVOVElUWV9UWVBFX0lOVEVHRVInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5pZGVudGl0eWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpdHkgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBtdXN0IGJlIGFuIGludGVnZXIgdHlwZSwgbm90IFwiJHtjb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXG4gICAgICAgICAgICAgICAgY29sdW1uLmdlbmVyYXRlZCxcbiAgICAgICAgICAgICAgICBjb2x1bW4uaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHQsXG4gICAgICAgICAgICBdLmZpbHRlcigoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19DT0xVTU5fR0VORVJBVElPTl9FWENMVVNJVkUnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgbWF5IGhhdmUgb25seSBvbmUgb2YgZ2VuZXJhdGVkLCBpZGVudGl0eSwgb3IgZGVmYXVsdGAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sdW1uLmNvbGxhdGlvbiAhPT0gdW5kZWZpbmVkICYmICFpc1Bvc3RncmVzQ29sbGF0YWJsZVR5cGUoY29sdW1uLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19DT0xMQVRJT05fT05fVEVYVF9UWVBFJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2xsYXRpb25gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgY29sbGF0aW9uIGlzIG9ubHkgbGVnYWwgb24gYSB0ZXh0IHR5cGUsIG5vdCBcIiR7Y29sdW1uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5jb21wcmVzc2lvbiAhPT0gdW5kZWZpbmVkICYmICFDT01QUkVTU0lPTl9NRVRIT0RTLmhhcyhjb2x1bW4uY29tcHJlc3Npb24udHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19DT01QUkVTU0lPTl9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29tcHJlc3Npb25gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgY29tcHJlc3Npb24gXCIke2NvbHVtbi5jb21wcmVzc2lvbn1cIiBtdXN0IGJlIFwicGdselwiIG9yIFwibHo0XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5zdG9yYWdlICE9PSB1bmRlZmluZWQgJiYgIVNUT1JBR0VfU1RSQVRFR0lFUy5oYXMoY29sdW1uLnN0b3JhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19TVE9SQUdFX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5zdG9yYWdlYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHN0b3JhZ2UgXCIke2NvbHVtbi5zdG9yYWdlfVwiIG11c3QgYmUgb25lIG9mOiAke1tcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLlNUT1JBR0VfU1RSQVRFR0lFUyxcbiAgICAgICAgICAgICAgICAgICAgXS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBnZW5lcmF0ZWQgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19HRU5FUkFURURfS0lORF9WQUxJRGAsXG4gICAgICogYFBPU1RHUkVTX0dFTkVSQVRFRF9FWFBSRVNTSU9OX0NPTFVNTl9FWElTVFNgLFxuICAgICAqIGBQT1NUR1JFU19HRU5FUkFURURfTk9fU0VMRl9SRUZFUkVOQ0VgLFxuICAgICAqIGBQT1NUR1JFU19HRU5FUkFURURfTk9fR0VORVJBVEVEX1JFRkVSRU5DRWAsXG4gICAgICogYFBPU1RHUkVTX0dFTkVSQVRFRF9OT1RfSU5fUEFSVElUSU9OX0tFWWAsIGFuZFxuICAgICAqIGBQT1NUR1JFU19WSVJUVUFMX0dFTkVSQVRFRF9OT1RfSU5fUEtgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgZ2VuZXJhdGVkLWNvbHVtbiB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZWRDb2x1bW5WaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcblxuICAgICAgICBjb25zdCBnZW5lcmF0ZWROYW1lcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICB0aGlzLmRlZmluaXRpb24uY29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwYXJ0aXRpb25OYW1lcyA9IG5ldyBTZXQodGhpcy5kZWZpbml0aW9uLnBhcnRpdGlvbnMubWFwKChwYXJ0aXRpb24pID0+IHBhcnRpdGlvbi5uYW1lKSk7XG5cbiAgICAgICAgdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGNvbHVtbnNbJHtpbmRleH1dYDtcblxuICAgICAgICAgICAgaWYgKCFHRU5FUkFURURfS0lORFMuaGFzKGNvbHVtbi5nZW5lcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19HRU5FUkFURURfS0lORF9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZ2VuZXJhdGVkYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBraW5kIFwiJHtjb2x1bW4uZ2VuZXJhdGVkfVwiIG11c3QgYmUgXCJzdG9yZWRcIiBvciBcInZpcnR1YWxcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAoY29sdW1uLmV4cHJlc3Npb25Db2x1bW5zID8/IFtdKS5mb3JFYWNoKChyZWZlcmVuY2UsIHJlZmVyZW5jZUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlRmllbGQgPSBgJHtmaWVsZH0uZXhwcmVzc2lvbkNvbHVtbnNbJHtyZWZlcmVuY2VJbmRleH1dYDtcbiAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlID09PSBjb2x1bW4ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfR0VORVJBVEVEX05PX1NFTEZfUkVGRVJFTkNFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWZlcmVuY2VGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBnZW5lcmF0ZWQgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBjYW5ub3QgcmVmZXJlbmNlIGl0c2VsZmAsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmhhc0NvbHVtbihyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19HRU5FUkFURURfRVhQUkVTU0lPTl9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWZlcmVuY2VGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBnZW5lcmF0ZWQgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiByZWZlcmVuY2VzIFwiJHtyZWZlcmVuY2V9XCIsIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICd3aGljaCBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zJyxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGVkTmFtZXMuaGFzKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9OT19HRU5FUkFURURfUkVGRVJFTkNFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiByZWZlcmVuY2VGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBnZW5lcmF0ZWQgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBjYW5ub3QgcmVmZXJlbmNlIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGBnZW5lcmF0ZWQgY29sdW1uIFwiJHtyZWZlcmVuY2V9XCJgLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChwYXJ0aXRpb25OYW1lcy5oYXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19HRU5FUkFURURfTk9UX0lOX1BBUlRJVElPTl9LRVknLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmdlbmVyYXRlZGAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBnZW5lcmF0ZWQgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBjYW5ub3QgYmUgYSBwYXJ0aXRpb24ga2V5YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkID09PSAndmlydHVhbCcgJiYgdGhpcy5kZWZpbml0aW9uLnByaW1hcnlLZXkuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19WSVJUVUFMX0dFTkVSQVRFRF9OT1RfSU5fUEsnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmdlbmVyYXRlZGAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB2aXJ0dWFsIGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBVTklRVUUgY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfVU5JUVVFX05BTUVfVU5JUVVFYCwgYFBPU1RHUkVTX1VOSVFVRV9DT0xVTU5fRVhJU1RTYCwgYW5kXG4gICAgICogYFBPU1RHUkVTX1VOSVFVRV9OT19EVVBMSUNBVEVfQ09MVU1OU2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSB1bmlxdWUtY29uc3RyYWludCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSB1bmlxdWVDb25zdHJhaW50VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXModW5pcXVlQ29uc3RyYWludHMubWFwKChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX05BTUVfVU5JUVVFJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3VuaXF1ZUNvbnN0cmFpbnRzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIHVuaXF1ZS1jb25zdHJhaW50IG5hbWUgXCIke2R1cGxpY2F0ZX1cImAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBVbmlxdWVDb25zdHJhaW50LCBwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGB1bmlxdWVDb25zdHJhaW50c1ske3Bvc2l0aW9ufV1gO1xuICAgICAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhjb25zdHJhaW50LmNvbHVtbnMpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19VTklRVUVfTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdW5pcXVlIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnQubmFtZX1cIiBsaXN0cyBjb2x1bW4gXCIke2R1cGxpY2F0ZX1cIiBtb3JlIHRoYW4gb25jZWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RyYWludC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1VOSVFVRV9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc1ske2NvbHVtbkluZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHVuaXF1ZS1jb25zdHJhaW50IGNvbHVtbiBcIiR7Y29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCguLi50aGlzLnVuaXF1ZUNvbnN0cmFpbnRLZXlWaW9sYXRpb25zKGNvbnN0cmFpbnQsIGZpZWxkKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBSZWxhdGlvbnNoaXAgcnVsZXMgYmV0d2VlbiBhIHVuaXF1ZSBjb25zdHJhaW50IGFuZCB0aGUgcHJpbWFyeSBrZXkgL1xuICAgIC8vLyBwYXJ0aXRpb24ga2V5OiByZWR1bmRhbmN5IHdpdGggdGhlIFBLLCBhbmQgdGhlIFBvc3RncmVzIHJ1bGUgdGhhdCBhXG4gICAgLy8vIHVuaXF1ZSBjb25zdHJhaW50IG9uIGEgcGFydGl0aW9uZWQgdGFibGUgbXVzdCBpbmNsdWRlIGV2ZXJ5IHBhcnRpdGlvbiBrZXkuXG4gICAgcHJpdmF0ZSB1bmlxdWVDb25zdHJhaW50S2V5VmlvbGF0aW9ucyhjb25zdHJhaW50OiBVbmlxdWVDb25zdHJhaW50LCBmaWVsZDogc3RyaW5nKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleTtcbiAgICAgICAgY29uc3QgY29sdW1uU2V0ID0gbmV3IFNldChjb25zdHJhaW50LmNvbHVtbnMpO1xuICAgICAgICBpZiAocHJpbWFyeUtleS5sZW5ndGggPiAwICYmIHByaW1hcnlLZXkubGVuZ3RoID09PSBjb2x1bW5TZXQuc2l6ZVxuICAgICAgICAgICAgJiYgcHJpbWFyeUtleS5ldmVyeSgoY29sdW1uKSA9PiBjb2x1bW5TZXQuaGFzKGNvbHVtbikpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1VOSVFVRV9SRURVTkRBTlRfV0lUSF9QSycsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdW5pcXVlIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnQubmFtZX1cIiBkdXBsaWNhdGVzIHRoZSBwcmltYXJ5IGtleWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0aXRpb25LZXlzID0gdGhpcy5kZWZpbml0aW9uLnBhcnRpdGlvbnNcbiAgICAgICAgICAgIC5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpXG4gICAgICAgICAgICAuZmlsdGVyKChuYW1lKSA9PiB0aGlzLmhhc0NvbHVtbihuYW1lKSk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBwYXJ0aXRpb25LZXlzLmZpbHRlcigobmFtZSkgPT4gIWNvbnN0cmFpbnQuY29sdW1ucy5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1VOSVFVRV9JTkNMVURFU19QQVJUSVRJT05fS0VZUycsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdW5pcXVlIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnQubmFtZX1cIiBvbiBhIHBhcnRpdGlvbmVkIHRhYmxlIG11c3QgaW5jbHVkZSBgXG4gICAgICAgICAgICAgICAgICAgICsgYGV2ZXJ5IHBhcnRpdGlvbiBrZXkgY29sdW1uOyBtaXNzaW5nOiAke21pc3Npbmcuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgQ0hFQ0sgY29uc3RyYWludHMuIE9ubHkgdGhlIGV4cGxpY2l0IHJlZmVyZW5jZWQtY29sdW1uIGxpc3QgaXNcbiAgICAgKiBjaGVja2VkOyB0aGUgcHJlZGljYXRlIGl0c2VsZiBzdGF5cyBvcGFxdWUuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfQ0hFQ0tfTkFNRV9VTklRVUVgIGFuZCBgUE9TVEdSRVNfQ0hFQ0tfQ09MVU1OX0VYSVNUU2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBjaGVjay1jb25zdHJhaW50IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNoZWNrQ29uc3RyYWludFZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjaGVja0NvbnN0cmFpbnRzLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoY2hlY2tDb25zdHJhaW50cy5tYXAoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQubmFtZSkpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19DSEVDS19OQU1FX1VOSVFVRScsXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjaGVja0NvbnN0cmFpbnRzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIGNoZWNrLWNvbnN0cmFpbnQgbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrQ29uc3RyYWludHMuZm9yRWFjaCgoY29uc3RyYWludDogQ2hlY2tDb25zdHJhaW50LCBwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGBjaGVja0NvbnN0cmFpbnRzWyR7cG9zaXRpb259XWA7XG4gICAgICAgICAgICBjb25zdHJhaW50LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfQ0hFQ0tfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNbJHtjb2x1bW5JbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBjaGVjay1jb25zdHJhaW50IGNvbHVtbiBcIiR7Y29sdW1ufVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHNlY29uZGFyeSBpbmRleGVzLlxuICAgICAqXG4gICAgICogRW1pdHMgYFBPU1RHUkVTX0lOREVYX05BTUVfVU5JUVVFYCwgYFBPU1RHUkVTX0lOREVYX01FVEhPRF9WQUxJRGAsXG4gICAgICogYFBPU1RHUkVTX0lOREVYX0NPTFVNTl9FWElTVFNgLCBgUE9TVEdSRVNfSU5ERVhfTk9fRFVQTElDQVRFX0NPTFVNTlNgLFxuICAgICAqIGBQT1NUR1JFU19JTkRFWF9VTklRVUVfQlRSRUVfT05MWWAsIGBQT1NUR1JFU19JTkRFWF9TT1JUX1ZBTElEYCwgYW5kXG4gICAgICogYFBPU1RHUkVTX0lOREVYX05VTExTX1ZBTElEYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGluZGV4LXJlbGF0ZWQgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5kZXhWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaW5kZXhlcyxcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGluZGV4ZXMubWFwKChpbmRleCkgPT4gaW5kZXgubmFtZSkpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9OQU1FX1VOSVFVRScsXG4gICAgICAgICAgICAgICAgZmllbGQ6ICdpbmRleGVzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZHVwbGljYXRlIGluZGV4IG5hbWUgXCIke2R1cGxpY2F0ZX1cImAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleGVzLmZvckVhY2goKGluZGV4LCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKC4uLnRoaXMuc2luZ2xlSW5kZXhWaW9sYXRpb25zKGluZGV4LCBwb3NpdGlvbikpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gQ2hlY2tzIGZvciBvbmUgaW5kZXggZW50cnkuXG4gICAgcHJpdmF0ZSBzaW5nbGVJbmRleFZpb2xhdGlvbnMoaW5kZXg6IEluZGV4LCBwb3NpdGlvbjogbnVtYmVyKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGBpbmRleGVzWyR7cG9zaXRpb259XWA7XG5cbiAgICAgICAgaWYgKCFJTkRFWF9NRVRIT0RTLmhhcyhpbmRleC5tZXRob2QpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9NRVRIT0RfVkFMSUQnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0ubWV0aG9kYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggbWV0aG9kIFwiJHtpbmRleC5tZXRob2R9XCIgbXVzdCBiZSBvbmUgb2Y6ICR7W1xuICAgICAgICAgICAgICAgICAgICAuLi5JTkRFWF9NRVRIT0RTLFxuICAgICAgICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4LnVuaXF1ZSA9PT0gdHJ1ZSAmJiBpbmRleC5tZXRob2QgIT09ICdidHJlZScpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX1VOSVFVRV9CVFJFRV9PTkxZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnVuaXF1ZWAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGEgdW5pcXVlIGluZGV4IG11c3QgdXNlIHRoZSBidHJlZSBtZXRob2QsIG5vdCBcIiR7aW5kZXgubWV0aG9kfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtleU5hbWVzID0gaW5kZXguY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGtleU5hbWVzKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IFwiJHtpbmRleC5uYW1lfVwiIGxpc3RzIGtleSBjb2x1bW4gXCIke2R1cGxpY2F0ZX1cIiBtb3JlIHRoYW4gb25jZWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGluZGV4LmluY2x1ZGUpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9OT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5pbmNsdWRlYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggXCIke2luZGV4Lm5hbWV9XCIgbGlzdHMgaW5jbHVkZSBjb2x1bW4gXCIke2R1cGxpY2F0ZX1cIiBtb3JlIHRoYW4gb25jZWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGluY2x1ZGVkIG9mIGluZGV4LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGlmIChrZXlOYW1lcy5pbmNsdWRlcyhpbmNsdWRlZCkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5pbmNsdWRlYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IFwiJHtpbmRleC5uYW1lfVwiIGluY2x1ZGUgY29sdW1uIFwiJHtpbmNsdWRlZH1cIiBpcyBhbHNvIGEga2V5IGNvbHVtbmAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXguY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc1ske2NvbHVtbkluZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBrZXkgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sdW1uLnNvcnQgIT09IHVuZGVmaW5lZCAmJiAhSU5ERVhfU09SVFMuaGFzKGNvbHVtbi5zb3J0KSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfU09SVF9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc1ske2NvbHVtbkluZGV4fV0uc29ydGAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBzb3J0IFwiJHtjb2x1bW4uc29ydH1cIiBtdXN0IGJlIFwiYXNjXCIgb3IgXCJkZXNjXCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2x1bW4ubnVsbHMgIT09IHVuZGVmaW5lZCAmJiAhSU5ERVhfTlVMTFMuaGFzKGNvbHVtbi5udWxscykpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05VTExTX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XS5udWxsc2AsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBudWxscyBcIiR7Y29sdW1uLm51bGxzfVwiIG11c3QgYmUgXCJmaXJzdFwiIG9yIFwibGFzdFwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGluZGV4LmluY2x1ZGUuZm9yRWFjaCgoaW5jbHVkZWQsIGluY2x1ZGVJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihpbmNsdWRlZCkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmluY2x1ZGVbJHtpbmNsdWRlSW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBpbmNsdWRlIGNvbHVtbiBcIiR7aW5jbHVkZWR9XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG59XG4iXX0=
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtMTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcG9zdGdyZXMtMTgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7OztBQVVILDhDQUV1QjtBQUN2QixvQ0FHa0I7QUFFbEIsTUFBTSxVQUFVLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtDQUNULENBQUMsQ0FBQztBQUVILE1BQU0sYUFBYSxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUMvQyxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsT0FBTztJQUNQLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLGVBQWUsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDakQsUUFBUTtJQUNSLFNBQVM7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDaEQsUUFBUTtJQUNSLFdBQVc7Q0FDZCxDQUFDLENBQUM7QUFFSCxrREFBa0Q7QUFDbEQsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQy9DLFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNuRCxNQUFNO0lBQ04sUUFBUTtDQUNYLENBQUMsQ0FBQztBQUVILE1BQU0sbUJBQW1CLEdBQXdCLElBQUksR0FBRyxD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QUFHO29CQUMxQyxPQUFPLEVBQUUseUJBQXlCLFFBQVEsNkJBQTZCO2lCQUMxRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSjtBQXZsQkQsMENBdWxCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9zdGdyZXMgMTggdGFibGUgdHlwZS5cbiAqXG4gKiBQb3N0Z3JlcyB1c2VzIGRlY2xhcmF0aXZlIHBhcnRpdGlvbmluZzogYSB0YWJsZSBpcyBwYXJ0aXRpb25lZCBieSBvbmUgc3RyYXRlZ3lcbiAqIChgcmFuZ2VgLCBgbGlzdGAsIG9yIGBoYXNoYCkgb3ZlciBvbmUgb3IgbW9yZSBleGlzdGluZyBrZXkgY29sdW1ucy4gRWFjaFxuICogcGFydGl0aW9uIGVudHJ5IG5hbWVzIGEga2V5IGNvbHVtbiAoYG5hbWVgKSBhbmQgdGhlIHN0cmF0ZWd5IChgdHlwZWApOyBhbGxcbiAqIGVudHJpZXMgb24gYSB0YWJsZSBtdXN0IHNoYXJlIG9uZSBzdHJhdGVneS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIENoZWNrQ29uc3RyYWludCxcbiAgICBFeGNsdXNpb25Db25zdHJhaW50LFxuICAgIEluZGV4LFxuICAgIFBhcnRpdGlvbixcbiAgICBVbmlxdWVDb25zdHJhaW50LFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgaXNQb3N0Z3Jlc0NvbGxhdGFibGVUeXBlLFxuICAgIGlzVmFsaWRQb3N0Z3Jlc1R5cGUsXG59IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgU1RSQVRFR0lFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdyYW5nZScsXG4gICAgJ2xpc3QnLFxuICAgICdoYXNoJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9NRVRIT0RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ2J0cmVlJyxcbiAgICAnaGFzaCcsXG4gICAgJ2dpc3QnLFxuICAgICdzcGdpc3QnLFxuICAgICdnaW4nLFxuICAgICdicmluJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9TT1JUUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdhc2MnLFxuICAgICdkZXNjJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9OVUxMUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdmaXJzdCcsXG4gICAgJ2xhc3QnLFxuXSk7XG5cbmNvbnN0IEdFTkVSQVRFRF9LSU5EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdzdG9yZWQnLFxuICAgICd2aXJ0dWFsJyxcbl0pO1xuXG5jb25zdCBJREVOVElUWV9LSU5EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdhbHdheXMnLFxuICAgICdieURlZmF1bHQnLFxuXSk7XG5cbi8vLyBJbnRlZ2VyIGJhc2UgdHlwZXMgYW4gaWRlbnRpdHkgY29sdW1uIG1heSB1c2UuXG5jb25zdCBJTlRFR0VSX1RZUEVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ3NtYWxsaW50JyxcbiAgICAnaW50MicsXG4gICAgJ2ludGVnZXInLFxuICAgICdpbnQnLFxuICAgICdpbnQ0JyxcbiAgICAnYmlnaW50JyxcbiAgICAnaW50OCcsXG5dKTtcblxuY29uc3QgRVhDTFVTSU9OX01FVEhPRFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnZ2lzdCcsXG4gICAgJ3NwZ2lzdCcsXG5dKTtcblxuY29uc3QgQ09NUFJFU1NJT05fTUVUSE9EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdwZ2x6JyxcbiAgICAnbHo0Jyxcbl0pO1xuXG5jb25zdCBTVE9SQUdFX1NUUkFURUdJRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAncGxhaW4nLFxuICAgICdleHRlcm5hbCcsXG4gICAgJ2V4dGVuZGVkJyxcbiAgICAnbWFpbicsXG4gICAgJ2RlZmF1bHQnLFxuXSk7XG5cbi8qKiBQb3N0Z3JlcyAxOCB0YWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3JlczE4VGFibGUgZXh0ZW5kcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIFBvc3RncmVzIHR5cGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIHN0cmluZyBmcm9tIGEgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB0eXBlIGlzIGEgdmFsaWQgUG9zdGdyZXMgMTggdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkUG9zdGdyZXNUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc3RncmVzIHBhcnRpdGlvbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzOiBgTk9fRFVQTElDQVRFX1BBUlRJVElPTlNgIChhIGtleSBjb2x1bW4gbGlzdGVkIHR3aWNlKSxcbiAgICAgKiBgUE9TVEdSRVNfUEFSVElUSU9OX0NPTFVNTl9FWElTVFNgICh0aGUga2V5IGNvbHVtbiBtdXN0IGJlIGEgZGF0YSBjb2x1bW4pLFxuICAgICAqIGBQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSURgICh0aGUgc3RyYXRlZ3kgbXVzdCBiZSByYW5nZSAvIGxpc3QgL1xuICAgICAqIGhhc2gpLCBhbmQgYFBPU1RHUkVTX1BBUlRJVElPTl9TSU5HTEVfU1RSQVRFR1lgIChhIHRhYmxlIHBhcnRpdGlvbnMgYnkgb25lXG4gICAgICogc3RyYXRlZ3kgb25seSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMocGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAncGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb246IFBhcnRpdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHBhcnRpdGlvbiBrZXkgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLy8gUG9zdGdyZXMgcmVxdWlyZXMgdGhlIHByaW1hcnkga2V5IHRvIGluY2x1ZGUgZXZlcnkgcGFydGl0aW9uLWtleVxuICAgICAgICAgICAgICAgIC8vLyBjb2x1bW4sIHNvIGEgcGFydGl0aW9uIGNvbHVtbiBvdXRzaWRlIHRoZSBwcmltYXJ5IGtleSBpcyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfUEFSVElUSU9OX0tFWV9JTl9QSycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgbXVzdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdHJhdGVneSA9IHBhcnRpdGlvbi50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFNUUkFURUdJRVMuaGFzKHN0cmF0ZWd5KSkge1xuICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuYWRkKHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkIFBvc3RncmVzIHBhcnRpdGlvbiBzdHJhdGVneSAocmFuZ2UsIGxpc3QsIGhhc2gpYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdHJhdGVnaWVzLnNpemUgPiAxKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU0lOR0xFX1NUUkFURUdZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3BhcnRpdGlvbnMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBhIHBhcnRpdGlvbmVkIHRhYmxlIHVzZXMgb25lIHN0cmF0ZWd5OyBmb3VuZCAke1tcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RyYXRlZ2llcyxcbiAgICAgICAgICAgICAgICBdLnNvcnQoKS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQb3N0Z3JlcyBlbmdpbmUtc3BlY2lmaWMgcnVsZXM6IGluZGV4ZXMsIHVuaXF1ZSBjb25zdHJhaW50cywgYW5kIGNoZWNrXG4gICAgICogY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBlbmdpbmUtc3BlY2lmaWMgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbmdpbmVTcGVjaWZpY1Zpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5pbmRleFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMudW5pcXVlQ29uc3RyYWludFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY2hlY2tDb25zdHJhaW50VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5leGNsdXNpb25Db25zdHJhaW50VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5nZW5lcmF0ZWRDb2x1bW5WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLmNvbHVtbkF0dHJpYnV0ZVZpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBleGNsdXNpb24gY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfRVhDTFVTSU9OX05BTUVfVU5JUVVFYCwgYFBPU1RHUkVTX0VYQ0xVU0lPTl9NRVRIT0RfVkFMSURgLFxuICAgICAqIGBQT1NUR1JFU19FWENMVVNJT05fQ09MVU1OX0VYSVNUU2AsIGBQT1NUR1JFU19FWENMVVNJT05fTk9fRFVQTElDQVRFX0NPTFVNTlNgLFxuICAgICAqIGFuZCBgUE9TVEdSRVNfRVhDTFVTSU9OX0lOQ0xVREVTX1BBUlRJVElPTl9LRVlTYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGV4Y2x1c2lvbi1jb25zdHJhaW50IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4Y2x1c2lvbkNvbnN0cmFpbnRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZXhjbHVzaW9uQ29uc3RyYWludHMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhleGNsdXNpb25Db25zdHJhaW50cy5tYXAoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQubmFtZSkpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19FWENMVVNJT05fTkFNRV9VTklRVUUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZXhjbHVzaW9uQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgZXhjbHVzaW9uLWNvbnN0cmFpbnQgbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbktleXMgPSB0aGlzLmRlZmluaXRpb24ucGFydGl0aW9uc1xuICAgICAgICAgICAgLm1hcCgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb24ubmFtZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IHRoaXMuaGFzQ29sdW1uKG5hbWUpKTtcblxuICAgICAgICBleGNsdXNpb25Db25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBFeGNsdXNpb25Db25zdHJhaW50LCBwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGBleGNsdXNpb25Db25zdHJhaW50c1ske3Bvc2l0aW9ufV1gO1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IGNvbnN0cmFpbnQuZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmNvbHVtbik7XG5cbiAgICAgICAgICAgIGlmICghRVhDTFVTSU9OX01FVEhPRFMuaGFzKGNvbnN0cmFpbnQudXNpbmcudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19FWENMVVNJT05fTUVUSE9EX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS51c2luZ2AsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBleGNsdXNpb24gbWV0aG9kIFwiJHtjb25zdHJhaW50LnVzaW5nfVwiIG11c3QgYmUgXCJnaXN0XCIgb3IgXCJzcGdpc3RcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGNvbHVtbnMpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19FWENMVVNJT05fTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmVsZW1lbnRzYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGV4Y2x1c2lvbiBjb25zdHJhaW50IFwiJHtjb25zdHJhaW50Lm5hbWV9XCIgbGlzdHMgY29sdW1uIFwiJHtkdXBsaWNhdGV9XCIgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3RyYWludC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBlbGVtZW50SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGVsZW1lbnQuY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfRVhDTFVTSU9OX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5lbGVtZW50c1ske2VsZW1lbnRJbmRleH1dLmNvbHVtbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZXhjbHVzaW9uLWNvbnN0cmFpbnQgY29sdW1uIFwiJHtlbGVtZW50LmNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBtaXNzaW5nID0gcGFydGl0aW9uS2V5cy5maWx0ZXIoKG5hbWUpID0+ICFjb2x1bW5zLmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0VYQ0xVU0lPTl9JTkNMVURFU19QQVJUSVRJT05fS0VZUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZWxlbWVudHNgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZXhjbHVzaW9uIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnQubmFtZX1cIiBvbiBhIHBhcnRpdGlvbmVkIHRhYmxlIG11c3QgaW5jbHVkZSBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBldmVyeSBwYXJ0aXRpb24ga2V5IGNvbHVtbjsgbWlzc2luZzogJHttaXNzaW5nLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIFBvc3RncmVzIGNvbHVtbiBhdHRyaWJ1dGVzOiBpZGVudGl0eSBjb2x1bW5zLCB0aGUgbXV0dWFsXG4gICAgICogZXhjbHVzaXZpdHkgYmV0d2VlbiBiZWluZyBnZW5lcmF0ZWQgLyBhbiBpZGVudGl0eSAvIGhhdmluZyBhIGRlZmF1bHQsIGFuZFxuICAgICAqIHBlci1jb2x1bW4gY29sbGF0aW9uLCBjb21wcmVzc2lvbiwgYW5kIHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfSURFTlRJVFlfVkFMSURgLCBgUE9TVEdSRVNfSURFTlRJVFlfVFlQRV9JTlRFR0VSYCxcbiAgICAgKiBgUE9TVEdSRVNfQ09MVU1OX0dFTkVSQVRJT05fRVhDTFVTSVZFYCwgYFBPU1RHUkVTX0NPTExBVElPTl9PTl9URVhUX1RZUEVgLFxuICAgICAqIGBQT1NUR1JFU19DT01QUkVTU0lPTl9WQUxJRGAsIGFuZCBgUE9TVEdSRVNfU1RPUkFHRV9WQUxJRGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBjb2x1bW4tYXR0cmlidXRlIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbHVtbkF0dHJpYnV0ZVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGNvbHVtbnNbJHtpbmRleH1dYDtcblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5pZGVudGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJREVOVElUWV9LSU5EUy5oYXMoY29sdW1uLmlkZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSURFTlRJVFlfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5pZGVudGl0eWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpdHkgXCIke2NvbHVtbi5pZGVudGl0eX1cIiBtdXN0IGJlIFwiYWx3YXlzXCIgb3IgXCJieURlZmF1bHRcImAsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFJTlRFR0VSX1RZUEVTLmhhcyhjb2x1bW4udHlwZS50cmltKCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lERU5USVRZX1RZUEVfSU5URUdFUicsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmlkZW50aXR5YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGl0eSBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIG11c3QgYmUgYW4gaW50ZWdlciB0eXBlLCBub3QgXCIke2NvbHVtbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZ2VuZXJhdGVkLFxuICAgICAgICAgICAgICAgIGNvbHVtbi5pZGVudGl0eSxcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdCxcbiAgICAgICAgICAgIF0uZmlsdGVyKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NPTFVNTl9HRU5FUkFUSU9OX0VYQ0xVU0lWRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBtYXkgaGF2ZSBvbmx5IG9uZSBvZiBnZW5lcmF0ZWQsIGlkZW50aXR5LCBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uY29sbGF0aW9uICE9PSB1bmRlZmluZWQgJiYgIWlzUG9zdGdyZXNDb2xsYXRhYmxlVHlwZShjb2x1bW4udHlwZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NPTExBVElPTl9PTl9URVhUX1RZUEUnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbGxhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBjb2xsYXRpb24gaXMgb25seSBsZWdhbCBvbiBhIHRleHQgdHlwZSwgbm90IFwiJHtjb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sdW1uLmNvbXByZXNzaW9uICE9PSB1bmRlZmluZWQgJiYgIUNPTVBSRVNTSU9OX01FVEhPRFMuaGFzKGNvbHVtbi5jb21wcmVzc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NPTVBSRVNTSU9OX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb21wcmVzc2lvbmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBjb21wcmVzc2lvbiBcIiR7Y29sdW1uLmNvbXByZXNzaW9ufVwiIG11c3QgYmUgXCJwZ2x6XCIgb3IgXCJsejRcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sdW1uLnN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiAhU1RPUkFHRV9TVFJBVEVHSUVTLmhhcyhjb2x1bW4uc3RvcmFnZS50cmltKCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1NUT1JBR0VfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnN0b3JhZ2VgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc3RvcmFnZSBcIiR7Y29sdW1uLnN0b3JhZ2V9XCIgbXVzdCBiZSBvbmUgb2Y6ICR7W1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uU1RPUkFHRV9TVFJBVEVHSUVTLFxuICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGdlbmVyYXRlZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogRW1pdHMgYFBPU1RHUkVTX0dFTkVSQVRFRF9LSU5EX1ZBTElEYCxcbiAgICAgKiBgUE9TVEdSRVNfR0VORVJBVEVEX0VYUFJFU1NJT05fQ09MVU1OX0VYSVNUU2AsXG4gICAgICogYFBPU1RHUkVTX0dFTkVSQVRFRF9OT19TRUxGX1JFRkVSRU5DRWAsXG4gICAgICogYFBPU1RHUkVTX0dFTkVSQVRFRF9OT19HRU5FUkFURURfUkVGRVJFTkNFYCxcbiAgICAgKiBgUE9TVEdSRVNfR0VORVJBVEVEX05PVF9JTl9QQVJUSVRJT05fS0VZYCwgYW5kXG4gICAgICogYFBPU1RHUkVTX1ZJUlRVQUxfR0VORVJBVEVEX05PVF9JTl9QS2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBnZW5lcmF0ZWQtY29sdW1uIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlZENvbHVtblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZE5hbWVzID0gbmV3IFNldChcbiAgICAgICAgICAgIHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbk5hbWVzID0gbmV3IFNldCh0aGlzLmRlZmluaXRpb24ucGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKTtcblxuICAgICAgICB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmdlbmVyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBgY29sdW1uc1ske2luZGV4fV1gO1xuXG4gICAgICAgICAgICBpZiAoIUdFTkVSQVRFRF9LSU5EUy5oYXMoY29sdW1uLmdlbmVyYXRlZCkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9LSU5EX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5nZW5lcmF0ZWRgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGVkIGtpbmQgXCIke2NvbHVtbi5nZW5lcmF0ZWR9XCIgbXVzdCBiZSBcInN0b3JlZFwiIG9yIFwidmlydHVhbFwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIChjb2x1bW4uZXhwcmVzc2lvbkNvbHVtbnMgPz8gW10pLmZvckVhY2goKHJlZmVyZW5jZSwgcmVmZXJlbmNlSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VGaWVsZCA9IGAke2ZpZWxkfS5leHByZXNzaW9uQ29sdW1uc1ske3JlZmVyZW5jZUluZGV4fV1gO1xuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgPT09IGNvbHVtbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19HRU5FUkFURURfTk9fU0VMRl9SRUZFUkVOQ0UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlZmVyZW5jZUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCByZWZlcmVuY2UgaXRzZWxmYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzQ29sdW1uKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9FWFBSRVNTSU9OX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlZmVyZW5jZUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIHJlZmVyZW5jZXMgXCIke3JlZmVyZW5jZX1cIiwgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ3doaWNoIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnMnLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWROYW1lcy5oYXMocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfR0VORVJBVEVEX05PX0dFTkVSQVRFRF9SRUZFUkVOQ0UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlZmVyZW5jZUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCByZWZlcmVuY2UgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYGdlbmVyYXRlZCBjb2x1bW4gXCIke3JlZmVyZW5jZX1cImAsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbk5hbWVzLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9OT1RfSU5fUEFSVElUSU9OX0tFWScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZ2VuZXJhdGVkYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCBiZSBhIHBhcnRpdGlvbiBrZXlgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQgPT09ICd2aXJ0dWFsJyAmJiB0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1ZJUlRVQUxfR0VORVJBVEVEX05PVF9JTl9QSycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZ2VuZXJhdGVkYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIFVOSVFVRSBjb25zdHJhaW50cy5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19VTklRVUVfTkFNRV9VTklRVUVgLCBgUE9TVEdSRVNfVU5JUVVFX0NPTFVNTl9FWElTVFNgLCBhbmRcbiAgICAgKiBgUE9TVEdSRVNfVU5JUVVFX05PX0RVUExJQ0FURV9DT0xVTU5TYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHVuaXF1ZS1jb25zdHJhaW50IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVuaXF1ZUNvbnN0cmFpbnRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludHMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyh1bmlxdWVDb25zdHJhaW50cy5tYXAoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQubmFtZSkpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19VTklRVUVfTkFNRV9VTklRVUUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAndW5pcXVlQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgdW5pcXVlLWNvbnN0cmFpbnQgbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLmZvckVhY2goKGNvbnN0cmFpbnQ6IFVuaXF1ZUNvbnN0cmFpbnQsIHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYHVuaXF1ZUNvbnN0cmFpbnRzWyR7cG9zaXRpb259XWA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGNvbnN0cmFpbnQuY29sdW1ucykpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1VOSVFVRV9OT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludC5uYW1lfVwiIGxpc3RzIGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdHJhaW50LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdW5pcXVlLWNvbnN0cmFpbnQgY29sdW1uIFwiJHtjb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKC4uLnRoaXMudW5pcXVlQ29uc3RyYWludEtleVZpb2xhdGlvbnMoY29uc3RyYWludCwgZmllbGQpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIFJlbGF0aW9uc2hpcCBydWxlcyBiZXR3ZWVuIGEgdW5pcXVlIGNvbnN0cmFpbnQgYW5kIHRoZSBwcmltYXJ5IGtleSAvXG4gICAgLy8vIHBhcnRpdGlvbiBrZXk6IHJlZHVuZGFuY3kgd2l0aCB0aGUgUEssIGFuZCB0aGUgUG9zdGdyZXMgcnVsZSB0aGF0IGFcbiAgICAvLy8gdW5pcXVlIGNvbnN0cmFpbnQgb24gYSBwYXJ0aXRpb25lZCB0YWJsZSBtdXN0IGluY2x1ZGUgZXZlcnkgcGFydGl0aW9uIGtleS5cbiAgICBwcml2YXRlIHVuaXF1ZUNvbnN0cmFpbnRLZXlWaW9sYXRpb25zKGNvbnN0cmFpbnQ6IFVuaXF1ZUNvbnN0cmFpbnQsIGZpZWxkOiBzdHJpbmcpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuZGVmaW5pdGlvbi5wcmltYXJ5S2V5O1xuICAgICAgICBjb25zdCBjb2x1bW5TZXQgPSBuZXcgU2V0KGNvbnN0cmFpbnQuY29sdW1ucyk7XG4gICAgICAgIGlmIChwcmltYXJ5S2V5Lmxlbmd0aCA+IDAgJiYgcHJpbWFyeUtleS5sZW5ndGggPT09IGNvbHVtblNldC5zaXplXG4gICAgICAgICAgICAmJiBwcmltYXJ5S2V5LmV2ZXJ5KChjb2x1bW4pID0+IGNvbHVtblNldC5oYXMoY29sdW1uKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX1JFRFVOREFOVF9XSVRIX1BLJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludC5uYW1lfVwiIGR1cGxpY2F0ZXMgdGhlIHByaW1hcnkga2V5YCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbktleXMgPSB0aGlzLmRlZmluaXRpb24ucGFydGl0aW9uc1xuICAgICAgICAgICAgLm1hcCgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb24ubmFtZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IHRoaXMuaGFzQ29sdW1uKG5hbWUpKTtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHBhcnRpdGlvbktleXMuZmlsdGVyKChuYW1lKSA9PiAhY29uc3RyYWludC5jb2x1bW5zLmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX0lOQ0xVREVTX1BBUlRJVElPTl9LRVlTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludC5uYW1lfVwiIG9uIGEgcGFydGl0aW9uZWQgdGFibGUgbXVzdCBpbmNsdWRlIGBcbiAgICAgICAgICAgICAgICAgICAgKyBgZXZlcnkgcGFydGl0aW9uIGtleSBjb2x1bW47IG1pc3Npbmc6ICR7bWlzc2luZy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBDSEVDSyBjb25zdHJhaW50cy4gT25seSB0aGUgZXhwbGljaXQgcmVmZXJlbmNlZC1jb2x1bW4gbGlzdCBpc1xuICAgICAqIGNoZWNrZWQ7IHRoZSBwcmVkaWNhdGUgaXRzZWxmIHN0YXlzIG9wYXF1ZS5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19DSEVDS19OQU1FX1VOSVFVRWAgYW5kIGBQT1NUR1JFU19DSEVDS19DT0xVTU5fRVhJU1RTYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGNoZWNrLWNvbnN0cmFpbnQgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY2hlY2tDb25zdHJhaW50VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNoZWNrQ29uc3RyYWludHMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhjaGVja0NvbnN0cmFpbnRzLm1hcCgoY29uc3RyYWludCkgPT4gY29uc3RyYWludC5uYW1lKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NIRUNLX05BTUVfVU5JUVVFJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2NoZWNrQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgY2hlY2stY29uc3RyYWludCBuYW1lIFwiJHtkdXBsaWNhdGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tDb25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBDaGVja0NvbnN0cmFpbnQsIHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGNoZWNrQ29uc3RyYWludHNbJHtwb3NpdGlvbn1dYDtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19DSEVDS19DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc1ske2NvbHVtbkluZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGNoZWNrLWNvbnN0cmFpbnQgY29sdW1uIFwiJHtjb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgc2Vjb25kYXJ5IGluZGV4ZXMuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfSU5ERVhfTkFNRV9VTklRVUVgLCBgUE9TVEdSRVNfSU5ERVhfTUVUSE9EX1ZBTElEYCxcbiAgICAgKiBgUE9TVEdSRVNfSU5ERVhfQ09MVU1OX0VYSVNUU2AsIGBQT1NUR1JFU19JTkRFWF9OT19EVVBMSUNBVEVfQ09MVU1OU2AsXG4gICAgICogYFBPU1RHUkVTX0lOREVYX1VOSVFVRV9CVFJFRV9PTkxZYCwgYFBPU1RHUkVTX0lOREVYX1NPUlRfVkFMSURgLCBhbmRcbiAgICAgKiBgUE9TVEdSRVNfSU5ERVhfTlVMTFNfVkFMSURgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgaW5kZXgtcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbmRleFZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbmRleGVzLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoaW5kZXhlcy5tYXAoKGluZGV4KSA9PiBpbmRleC5uYW1lKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05BTUVfVU5JUVVFJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2luZGV4ZXMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgaW5kZXggbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4udGhpcy5zaW5nbGVJbmRleFZpb2xhdGlvbnMoaW5kZXgsIHBvc2l0aW9uKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBDaGVja3MgZm9yIG9uZSBpbmRleCBlbnRyeS5cbiAgICBwcml2YXRlIHNpbmdsZUluZGV4VmlvbGF0aW9ucyhpbmRleDogSW5kZXgsIHBvc2l0aW9uOiBudW1iZXIpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IGZpZWxkID0gYGluZGV4ZXNbJHtwb3NpdGlvbn1dYDtcblxuICAgICAgICBpZiAoIUlOREVYX01FVEhPRFMuaGFzKGluZGV4Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX01FVEhPRF9WQUxJRCcsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5tZXRob2RgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBtZXRob2QgXCIke2luZGV4Lm1ldGhvZH1cIiBtdXN0IGJlIG9uZSBvZjogJHtbXG4gICAgICAgICAgICAgICAgICAgIC4uLklOREVYX01FVEhPRFMsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXgudW5pcXVlID09PSB0cnVlICYmIGluZGV4Lm1ldGhvZCAhPT0gJ2J0cmVlJykge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfVU5JUVVFX0JUUkVFX09OTFknLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0udW5pcXVlYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgYSB1bmlxdWUgaW5kZXggbXVzdCB1c2UgdGhlIGJ0cmVlIG1ldGhvZCwgbm90IFwiJHtpbmRleC5tZXRob2R9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZXMgPSBpbmRleC5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoa2V5TmFtZXMpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9OT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggXCIke2luZGV4Lm5hbWV9XCIgbGlzdHMga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoaW5kZXguaW5jbHVkZSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmluY2x1ZGVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBcIiR7aW5kZXgubmFtZX1cIiBsaXN0cyBpbmNsdWRlIGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaW5jbHVkZWQgb2YgaW5kZXguaW5jbHVkZSkge1xuICAgICAgICAgICAgaWYgKGtleU5hbWVzLmluY2x1ZGVzKGluY2x1ZGVkKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmluY2x1ZGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggXCIke2luZGV4Lm5hbWV9XCIgaW5jbHVkZSBjb2x1bW4gXCIke2luY2x1ZGVkfVwiIGlzIGFsc28gYSBrZXkgY29sdW1uYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4oY29sdW1uLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IGtleSBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2x1bW4uc29ydCAhPT0gdW5kZWZpbmVkICYmICFJTkRFWF9TT1JUUy5oYXMoY29sdW1uLnNvcnQpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9TT1JUX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XS5zb3J0YCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IHNvcnQgXCIke2NvbHVtbi5zb3J0fVwiIG11c3QgYmUgXCJhc2NcIiBvciBcImRlc2NcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbi5udWxscyAhPT0gdW5kZWZpbmVkICYmICFJTkRFWF9OVUxMUy5oYXMoY29sdW1uLm51bGxzKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTlVMTFNfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNbJHtjb2x1bW5JbmRleH1dLm51bGxzYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IG51bGxzIFwiJHtjb2x1bW4ubnVsbHN9XCIgbXVzdCBiZSBcImZpcnN0XCIgb3IgXCJsYXN0XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5kZXguaW5jbHVkZS5mb3JFYWNoKChpbmNsdWRlZCwgaW5jbHVkZUluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGluY2x1ZGVkKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uaW5jbHVkZVske2luY2x1ZGVJbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IGluY2x1ZGUgY29sdW1uIFwiJHtpbmNsdWRlZH1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flexdataset",
3
- "version": "0.16.0",
3
+ "version": "0.18.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Flexible Dataset Definition (FDD) — validator and tooling for the FDD dataset standard.",
6
6
  "author": "Rodrigo Carvajal",