semantifold 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +1 -0
  2. package/build/src/backends/effects.js +3 -1
  3. package/build/src/backends/php.d.ts.map +1 -1
  4. package/build/src/backends/php.js +56 -3
  5. package/build/src/backends/scalars.js +2 -2
  6. package/build/src/backends/shared.d.ts +2 -1
  7. package/build/src/backends/shared.d.ts.map +1 -1
  8. package/build/src/backends/shared.js +209 -7
  9. package/build/src/backends/writer.d.ts +18 -4
  10. package/build/src/backends/writer.d.ts.map +1 -1
  11. package/build/src/backends/writer.js +40 -4
  12. package/build/src/frontends/java.d.ts +1 -1
  13. package/build/src/frontends/java.d.ts.map +1 -1
  14. package/build/src/frontends/java.js +14 -11
  15. package/build/src/frontends/javascript-typescript.d.ts +1 -1
  16. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  17. package/build/src/frontends/javascript-typescript.js +17 -17
  18. package/build/src/frontends/php.d.ts +5 -1
  19. package/build/src/frontends/php.d.ts.map +1 -1
  20. package/build/src/frontends/php.js +159 -31
  21. package/build/src/frontends/ruby.d.ts +1 -1
  22. package/build/src/frontends/ruby.d.ts.map +1 -1
  23. package/build/src/frontends/ruby.js +12 -9
  24. package/build/src/frontends/types.d.ts +9 -2
  25. package/build/src/frontends/types.d.ts.map +1 -1
  26. package/build/src/frontends/types.js +26 -9
  27. package/build/src/language-registry.d.ts.map +1 -1
  28. package/build/src/language-registry.js +14 -6
  29. package/build/src/mapping.d.ts.map +1 -1
  30. package/build/src/mapping.js +4 -2
  31. package/build/src/semantic/effects.d.ts.map +1 -1
  32. package/build/src/semantic/effects.js +3 -1
  33. package/build/src/semantic/provenance.d.ts.map +1 -1
  34. package/build/src/semantic/provenance.js +37 -4
  35. package/build/src/semantic/types.d.ts +140 -9
  36. package/build/src/semantic/types.d.ts.map +1 -1
  37. package/build/src/semantic/types.js +37 -6
  38. package/build/src/semantic/validate.d.ts +31 -2
  39. package/build/src/semantic/validate.d.ts.map +1 -1
  40. package/build/src/semantic/validate.js +346 -27
  41. package/docs/adr-bounded-subtyping.md +180 -0
  42. package/docs/language-support.md +1 -1
  43. package/package.json +1 -1
  44. package/src/backends/effects.js +1 -0
  45. package/src/backends/php.js +56 -2
  46. package/src/backends/scalars.js +1 -1
  47. package/src/backends/shared.js +210 -6
  48. package/src/backends/writer.js +41 -3
  49. package/src/frontends/java.js +13 -10
  50. package/src/frontends/javascript-typescript.js +16 -16
  51. package/src/frontends/php.js +175 -31
  52. package/src/frontends/ruby.js +11 -8
  53. package/src/frontends/types.js +26 -8
  54. package/src/language-registry.js +13 -5
  55. package/src/mapping.js +3 -1
  56. package/src/semantic/effects.js +1 -0
  57. package/src/semantic/provenance.js +34 -3
  58. package/src/semantic/types.js +39 -5
  59. package/src/semantic/validate.js +377 -26
@@ -29,6 +29,7 @@ export declare class SourceWriter {
29
29
  stdlibProviderShims: string[] | undefined;
30
30
  records: Map<string | undefined, import("../semantic/types.js").RecordDeclaration>;
31
31
  classes: Map<string | undefined, import("../semantic/types.js").ClassDeclaration>;
32
+ interfaces: Map<string | undefined, import("../semantic/types.js").InterfaceDeclaration>;
32
33
  errors: Map<string | undefined, import("../semantic/types.js").EffectFailureDeclaration | import("../semantic/types.js").ErrorDeclaration>;
33
34
  resources: Map<string, import("../semantic/types.js").EffectResourceDeclaration>;
34
35
  effectOperations: Map<string, import("../semantic/types.js").EffectOperationDeclaration>;
@@ -36,7 +37,8 @@ export declare class SourceWriter {
36
37
  fields: Map<string | undefined, import("../semantic/types.js").RecordField>;
37
38
  fieldRecords: Map<string | undefined, import("../semantic/types.js").RecordDeclaration>;
38
39
  privateFields: Map<string | undefined, import("../semantic/types.js").PrivateField>;
39
- methods: Map<string | undefined, import("../semantic/types.js").MethodDeclaration>;
40
+ /** @type {Map<string, import("../semantic/types.js").InterfaceMethodDeclaration | import("../semantic/types.js").MethodDeclaration>} */
41
+ methods: Map<string, import("../semantic/types.js").InterfaceMethodDeclaration | import("../semantic/types.js").MethodDeclaration>;
40
42
  typeParameters: Map<string | undefined, import("../semantic/types.js").TypeParameter>;
41
43
  referenceClassEmissionDepth: number;
42
44
  /** @type {Map<string, import("../semantic/types.js").SemanticProgramModule>} */
@@ -156,6 +158,18 @@ export declare class SourceWriter {
156
158
  * @returns {string} Target spelling.
157
159
  */
158
160
  classNameForId(declarationId: string): string;
161
+ /**
162
+ * Resolves one validated interface declaration.
163
+ * @param {string} declarationId - Stable interface identity.
164
+ * @returns {import("../semantic/types.js").InterfaceDeclaration} Interface declaration.
165
+ */
166
+ interfaceForId(declarationId: string): import("../semantic/types.js").InterfaceDeclaration;
167
+ /**
168
+ * Returns the target spelling of one interface.
169
+ * @param {string} declarationId - Stable interface declaration identity.
170
+ * @returns {string} Target spelling.
171
+ */
172
+ interfaceNameForId(declarationId: string): string;
159
173
  /**
160
174
  * Resolves one validated owned-resource declaration.
161
175
  * @param {string} resourceId - Stable resource identity.
@@ -175,11 +189,11 @@ export declare class SourceWriter {
175
189
  */
176
190
  privateFieldForId(fieldId: string): import("../semantic/types.js").PrivateField;
177
191
  /**
178
- * Resolves one validated receiver method.
192
+ * Resolves one validated receiver method, class-owned or interface-declared.
179
193
  * @param {string} methodId - Stable method identity.
180
- * @returns {import("../semantic/types.js").MethodDeclaration} Method declaration.
194
+ * @returns {import("../semantic/types.js").MethodDeclaration | import("../semantic/types.js").InterfaceMethodDeclaration} Method declaration.
181
195
  */
182
- methodForId(methodId: string): import("../semantic/types.js").MethodDeclaration;
196
+ methodForId(methodId: string): import("../semantic/types.js").MethodDeclaration | import("../semantic/types.js").InterfaceMethodDeclaration;
183
197
  /**
184
198
  * Resolves one validated declaration-scoped type parameter.
185
199
  * @param {string} parameterId - Stable type-parameter identity.
@@ -1 +1 @@
1
- {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/backends/writer.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/backends/writer.js"],"names":[],"mappings":"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"}
@@ -97,6 +97,7 @@ export class SourceWriter {
97
97
  this.stdlibProviderShims = stdlibProviderShims;
98
98
  const programRecords = program?.modules.flatMap((programModule) => programModule.records ?? []) ?? module.records ?? [];
99
99
  const programClasses = program?.modules.flatMap((programModule) => programModule.classes ?? []) ?? module.classes ?? [];
100
+ const programInterfaces = program?.modules.flatMap((programModule) => programModule.interfaces ?? []) ?? module.interfaces ?? [];
100
101
  const capabilityFailures = module.capabilities?.flatMap(({ failures }) => failures) ?? [];
101
102
  const programErrors = program?.modules.flatMap((programModule) => [
102
103
  ...(programModule.errors ?? []),
@@ -105,6 +106,7 @@ export class SourceWriter {
105
106
  const programFunctions = program?.modules.flatMap((programModule) => programModule.functions) ?? module.functions;
106
107
  this.records = new Map(programRecords.map((record) => [record.id, record]));
107
108
  this.classes = new Map(programClasses.map((declaration) => [declaration.id, declaration]));
109
+ this.interfaces = new Map(programInterfaces.map((declaration) => [declaration.id, declaration]));
108
110
  this.errors = new Map(programErrors.map((error) => [error.id, error]));
109
111
  this.resources = new Map((module.capabilities?.flatMap(({ resources }) => resources) ?? []).map((resource) => [resource.id, resource]));
110
112
  this.effectOperations = new Map((module.capabilities?.flatMap(({ operations }) => operations) ?? []).map((operation) => [operation.id, operation]));
@@ -112,13 +114,23 @@ export class SourceWriter {
112
114
  this.fields = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, field])));
113
115
  this.fieldRecords = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, record])));
114
116
  this.privateFields = new Map(programClasses.flatMap((declaration) => declaration.fields.map((field) => [field.id, field])));
115
- this.methods = new Map(programClasses.flatMap((declaration) => declaration.methods.map((method) => [method.id, method])));
117
+ /** @type {Map<string, import("../semantic/types.js").InterfaceMethodDeclaration | import("../semantic/types.js").MethodDeclaration>} */
118
+ this.methods = new Map();
119
+ for (const declaration of programClasses) {
120
+ for (const method of declaration.methods)
121
+ this.methods.set(/** @type {string} */ (method.id), method);
122
+ }
123
+ for (const declaration of programInterfaces) {
124
+ for (const method of declaration.methods)
125
+ this.methods.set(/** @type {string} */ (method.id), method);
126
+ }
116
127
  this.typeParameters = new Map([...programRecords, ...programFunctions].flatMap((declaration) => (declaration.typeParameters ?? []).map((parameter) => [parameter.id, parameter])));
117
128
  this.referenceClassEmissionDepth = 0;
118
129
  /** @type {Map<string, import("../semantic/types.js").SemanticProgramModule>} */
119
130
  this.declarationModules = new Map(program?.modules.flatMap((programModule) => [
120
131
  ...(programModule.records ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
121
132
  ...(programModule.classes ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
133
+ ...(programModule.interfaces ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
122
134
  ...(programModule.errors ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
123
135
  ...programModule.functions.map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule]))
124
136
  ]) ?? []);
@@ -255,6 +267,30 @@ export class SourceWriter {
255
267
  }
256
268
  return declaration.name;
257
269
  }
270
+ /**
271
+ * Resolves one validated interface declaration.
272
+ * @param {string} declarationId - Stable interface identity.
273
+ * @returns {import("../semantic/types.js").InterfaceDeclaration} Interface declaration.
274
+ */
275
+ interfaceForId(declarationId) {
276
+ const declaration = this.interfaces.get(declarationId);
277
+ if (!declaration)
278
+ throw new RangeError(`Unknown validated interface identity '${declarationId}'.`);
279
+ return declaration;
280
+ }
281
+ /**
282
+ * Returns the target spelling of one interface.
283
+ * @param {string} declarationId - Stable interface declaration identity.
284
+ * @returns {string} Target spelling.
285
+ */
286
+ interfaceNameForId(declarationId) {
287
+ const declaration = this.interfaceForId(declarationId);
288
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
289
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
290
+ return this.importNameFor(imported);
291
+ }
292
+ return declaration.name;
293
+ }
258
294
  /**
259
295
  * Resolves one validated owned-resource declaration.
260
296
  * @param {string} resourceId - Stable resource identity.
@@ -289,9 +325,9 @@ export class SourceWriter {
289
325
  return field;
290
326
  }
291
327
  /**
292
- * Resolves one validated receiver method.
328
+ * Resolves one validated receiver method, class-owned or interface-declared.
293
329
  * @param {string} methodId - Stable method identity.
294
- * @returns {import("../semantic/types.js").MethodDeclaration} Method declaration.
330
+ * @returns {import("../semantic/types.js").MethodDeclaration | import("../semantic/types.js").InterfaceMethodDeclaration} Method declaration.
295
331
  */
296
332
  methodForId(methodId) {
297
333
  const method = this.methods.get(methodId);
@@ -692,4 +728,4 @@ function relatedOriginKey(origin) {
692
728
  origin.role ?? null
693
729
  ]);
694
730
  }
695
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBSTtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUTtRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2pILEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFL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QyxDQUFDLFFBQVEsQ0FBQTtJQUM1RSxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0lBQy9CLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRO1FBQUUsT0FBTyxDQUFDLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQzVGLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFBO0lBRW5ELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsTUFBTTtJQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsTUFBTSxDQUFDLFFBQVE7UUFDZixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1FBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSTtRQUNyQixNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDdkIsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJO0tBQ3BCLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVHZW5lcmF0aW9uSW5kZXh9IGZyb20gXCIuLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBjYWxsZXItY29udHJvbGxlZCBiaW5kaW5nIHNwZWxsaW5nIGJlZm9yZSBzeW50aGV0aWMgbmFtZXMgYXJlIGNob3Nlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcm9vdCAtIFNlbWFudGljIGdyYXBoLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBVc2VkIHNvdXJjZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyhyb290KSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpXG4gIGNvbnN0IHBlbmRpbmcgPSBbcm9vdF1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpID09IFwic3RyaW5nXCIpIG5hbWVzLmFkZChSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpKVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eSB0byBpdHMgY2Fub25pY2FsIHRhcmdldCB0eXBlIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFBvcnRhYmxlIHRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbW9kdWxlQ2xhc3NOYW1lKGlkKSB7XG4gIHJldHVybiBpZC5zcGxpdCgvWy5fLV0rL3UpLm1hcCgocGFydCkgPT4gYCR7cGFydFswXS50b1VwcGVyQ2FzZSgpfSR7cGFydC5zbGljZSgxKX1gKS5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogTG9va3MgdXAgb25lIGRlY2xhcmF0aW9uIG5hbWUgaW4gaXRzIG93bmluZyBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSBtb2R1bGUgLSBPd25pbmcgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWNsYXJhdGlvbiBuYW1lLlxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvbk5hbWUobW9kdWxlLCBkZWNsYXJhdGlvbklkKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gWy4uLm1vZHVsZS5mdW5jdGlvbnMgPz8gW10sIC4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXV1cbiAgICAuZmluZCgoe2lkfSkgPT4gaWQgPT0gZGVjbGFyYXRpb25JZClcblxuICBpZiAoIWRlY2xhcmF0aW9uKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uSWR9Jy5gKVxuXG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lXG59XG5cbi8qKlxuICogQ2hvb3NlcyBhbiB1bnF1YWxpZmllZCB0YXJnZXQgYmluZGluZyB3aXRob3V0IHRyZWF0aW5nIGEgc291cmNlLXByb2ZpbGUgcXVhbGlmaWVyIGFzIHNlbWFudGljIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBPd25pbmcgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBJbXBvcnRpbmcgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0ltcG9ydH0gaW1wb3J0ZWQgLSBSZXNvbHZlZCBpbXBvcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQtbG9jYWwgYmluZGluZyBzcGVsbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2dyYW1JbXBvcnROYW1lKHByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpIHtcbiAgY29uc3Qgc291cmNlID0gcHJvZ3JhbS5zb3VyY2VzLmZpbmQoKHtmaWxlbmFtZX0pID0+IGZpbGVuYW1lID09IG1vZHVsZS5zb3VyY2VGaWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFByb2dyYW0gbW9kdWxlICcke21vZHVsZS5pZH0nIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZS5gKVxuXG4gIHJldHVybiBzb3VyY2UubGFuZ3VhZ2UgPT0gXCJydWJ5XCIgfHwgc291cmNlLmxhbmd1YWdlID09IFwiamF2YVwiID8gaW1wb3J0ZWQuaW1wb3J0ZWROYW1lIDogaW1wb3J0ZWQubG9jYWxOYW1lXG59XG5cbi8qKiBTb3VyY2UtYXdhcmUgZGV0ZXJtaW5pc3RpYyBnZW5lcmF0ZWQtb3V0cHV0IGJ1aWxkZXIuICovXG5leHBvcnQgY2xhc3MgU291cmNlV3JpdGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzb3VyY2UtYXdhcmUgd3JpdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFdyaXRlciBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5maWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IG9wdGlvbnMubGFuZ3VhZ2UgLSBPdXRwdXQgdGV4dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBbb3B0aW9ucy5wcm9ncmFtXSAtIE93bmluZyBtdWx0aS1maWxlIHByb2dyYW0uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gW29wdGlvbnMucHJvZ3JhbVBhdGhzXSAtIFBsYW5uZWQgYXJ0aWZhY3QgcGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLnN0ZGxpYlByb3ZpZGVyRW50cmllc10gLSBVc2VkIG9wZXJhdGlvbiB0byBwcm90ZWN0ZWQgbmF0aXZlIGVudHJ5IGZvciBhIGxpbmtlZCBzdGRsaWIgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlclBhdGhdIC0gUGxhbm5lZCBzdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJQYXRoc10gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCBwYXRocy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJJbXBvcnRzXSAtIE9yZGVyZWQgcHJvdmlkZXIgbmFtZXMgdGhpcyBtb2R1bGUgbXVzdCBpbXBvcnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlck93bmVyTW9kdWxlXSAtIEphdmEgb3duZXIgbW9kdWxlIGlkZW50aXR5IGhvc3RpbmcgdGhlIHNoYXJlZCBzdXBwb3J0IGJsb2NrIGFuZCBzaGltcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJTaGltc10gLSBKYXZhIG93bmVyIHByb2dyYW0td2lkZSB1c2VkIG9wZXJhdGlvbnMgZXhwb3NlZCBhcyBwdWJsaWMgc3RhdGljIHNoaW1zLlxuICAgKiBAcGFyYW0geyhleHByZXNzaW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbikgPT4gc3RyaW5nfSBbb3B0aW9ucy5jYWxsTmFtZVJlc29sdmVyXSAtIFRhcmdldC1jb250YWluZXIgY2FsbCBzcGVsbGluZyBvdmVycmlkZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbGxBcmd1bWVudFN1ZmZpeF0gLSBTeW50aGV0aWMgdHJhaWxpbmcgYXJndW1lbnQgZm9yIGV2ZXJ5IHNlbWFudGljIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubWV0aG9kU3RyaW5nRXF1YWxpdHldIC0gRW1pdCBzdHJpbmcgZXF1YWxpdHkgdGhyb3VnaCB0aGUgcGxhdGZvcm0gU3RyaW5nIG1ldGhvZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjYWxsQXJndW1lbnRTdWZmaXgsIGNhbGxOYW1lUmVzb2x2ZXIsIGZpbGVuYW1lLCBsYW5ndWFnZSwgbWV0aG9kU3RyaW5nRXF1YWxpdHksIG1vZHVsZSwgcHJvZ3JhbSwgcHJvZ3JhbVBhdGhzLCBzb3VyY2VzLFxuICAgIHN0ZGxpYlByb3ZpZGVyRW50cmllcywgc3RkbGliUHJvdmlkZXJQYXRoLCBzdGRsaWJQcm92aWRlclBhdGhzLCBzdGRsaWJQcm92aWRlckltcG9ydHMsIHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGUsXG4gICAgc3RkbGliUHJvdmlkZXJTaGltc30pIHtcbiAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUsIHNvdXJjZXMpXG5cbiAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2VcbiAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZVxuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW1cbiAgICB0aGlzLnByb2dyYW1QYXRocyA9IHByb2dyYW1QYXRoc1xuICAgIHRoaXMuY2FsbEFyZ3VtZW50U3VmZml4ID0gY2FsbEFyZ3VtZW50U3VmZml4XG4gICAgdGhpcy5jYWxsTmFtZVJlc29sdmVyID0gY2FsbE5hbWVSZXNvbHZlclxuICAgIHRoaXMubWV0aG9kU3RyaW5nRXF1YWxpdHkgPSBtZXRob2RTdHJpbmdFcXVhbGl0eSA/PyBmYWxzZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJFbnRyaWVzID0gc3RkbGliUHJvdmlkZXJFbnRyaWVzXG4gICAgdGhpcy5zdGRsaWJQcm92aWRlclBhdGggPSBzdGRsaWJQcm92aWRlclBhdGhcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyUGF0aHMgPSBzdGRsaWJQcm92aWRlclBhdGhzID8/IChzdGRsaWJQcm92aWRlclBhdGggPyBbc3RkbGliUHJvdmlkZXJQYXRoXSA6IHVuZGVmaW5lZClcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVySW1wb3J0cyA9IHN0ZGxpYlByb3ZpZGVySW1wb3J0c1xuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSA9IHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGVcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyU2hpbXMgPSBzdGRsaWJQcm92aWRlclNoaW1zXG4gICAgY29uc3QgcHJvZ3JhbVJlY29yZHMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkgPz8gbW9kdWxlLnJlY29yZHMgPz8gW11cbiAgICBjb25zdCBwcm9ncmFtQ2xhc3NlcyA9IHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gcHJvZ3JhbU1vZHVsZS5jbGFzc2VzID8/IFtdKSA/PyBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICAgIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlcyA9IG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXVxuICAgIGNvbnN0IHByb2dyYW1FcnJvcnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IFtcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmVycm9ycyA/PyBbXSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXSlcbiAgICBdKSA/PyBbLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4uY2FwYWJpbGl0eUZhaWx1cmVzXVxuICAgIGNvbnN0IHByb2dyYW1GdW5jdGlvbnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUuZnVuY3Rpb25zKSA/PyBtb2R1bGUuZnVuY3Rpb25zXG5cbiAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbcmVjb3JkLmlkLCByZWNvcmRdKSlcbiAgICB0aGlzLmNsYXNzZXMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb25dKSlcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBNYXAocHJvZ3JhbUVycm9ycy5tYXAoKGVycm9yKSA9PiBbZXJyb3IuaWQsIGVycm9yXSkpXG4gICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKSA/PyBbXSkubWFwKChyZXNvdXJjZSkgPT4gW3Jlc291cmNlLmlkLCByZXNvdXJjZV0pKVxuICAgIHRoaXMuZWZmZWN0T3BlcmF0aW9ucyA9IG5ldyBNYXAoKG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT4gb3BlcmF0aW9ucykgPz8gW10pLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBvcGVyYXRpb25dKSlcbiAgICB0aGlzLmVmZmVjdE9wZXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKChjYXBhYmlsaXR5KSA9PlxuICAgICAgY2FwYWJpbGl0eS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBjYXBhYmlsaXR5LmF1dGhvcml0eUlkXSkpID8/IFtdKSlcbiAgICB0aGlzLmZpZWxkcyA9IG5ldyBNYXAocHJvZ3JhbVJlY29yZHMuZmxhdE1hcCgocmVjb3JkKSA9PiByZWNvcmQuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5pZCwgZmllbGRdKSkpXG4gICAgdGhpcy5maWVsZFJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbZmllbGQuaWQsIHJlY29yZF0pKSlcbiAgICB0aGlzLnByaXZhdGVGaWVsZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmlkLCBmaWVsZF0pKSlcbiAgICB0aGlzLm1ldGhvZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5tZXRob2RzLm1hcCgobWV0aG9kKSA9PiBbbWV0aG9kLmlkLCBtZXRob2RdKSkpXG4gICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoWy4uLnByb2dyYW1SZWNvcmRzLCAuLi5wcm9ncmFtRnVuY3Rpb25zXS5mbGF0TWFwKChkZWNsYXJhdGlvbikgPT5cbiAgICAgIChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIuaWQsIHBhcmFtZXRlcl0pKSlcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCA9IDBcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZT59ICovXG4gICAgdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gW1xuICAgICAgLi4uKHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgcHJvZ3JhbU1vZHVsZV0pKSxcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmNsYXNzZXMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5lcnJvcnMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi5wcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiAvKiogQHR5cGUge2NvbnN0fSAqLyAoWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBwcm9ncmFtTW9kdWxlXSkpXG4gICAgXSkgPz8gW10pXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLnBhcnRzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgICB0aGlzLnNwYW5zID0gW11cbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICB0aGlzLmxpbmUgPSAxXG4gICAgdGhpcy5jb2x1bW4gPSAxXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFJlcGxhY2VtZW50TmFtZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy51c2VkQmluZGluZ05hbWVzID0gY29sbGVjdEJpbmRpbmdOYW1lcyhtb2R1bGUpXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGVmZmVjdCBleHByZXNzaW9ucyBsb3dlcmVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3VycmVudCBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBleHByZXNzaW9ucyAtIE9yZGVyZWQgZXhwcmVzc2lvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcGxhbkVmZmVjdFJlcGxhY2VtZW50cyhleHByZXNzaW9ucykge1xuICAgIHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcyA9IG5ldyBNYXAoZXhwcmVzc2lvbnMubWFwKChleHByZXNzaW9uKSA9PiBbZXhwcmVzc2lvbiwgdGhpcy5lZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pXSkpXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIGEgY29sbGlzaW9uLXNhZmUgbmFtZSBmb3Igb25lIGRldGVybWluaXN0aWMgZWZmZWN0IHNpdGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEVmZmVjdGZ1bCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgdGVtcG9yYXJ5IG5hbWUuXG4gICAqL1xuICBlZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMuZWZmZWN0VGVtcG9yYXJ5TmFtZXMuZ2V0KGV4cHJlc3Npb24pXG4gICAgaWYgKGtub3duKSByZXR1cm4ga25vd25cbiAgICBjb25zdCBzaXRlID0gdHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCJcbiAgICAgID8gUmVmbGVjdC5nZXQoZXhwcmVzc2lvbiwgXCJlZmZlY3RTaXRlSWRcIikuc2xpY2UoXCJlZmZlY3Q6XCIubGVuZ3RoKSA6IFN0cmluZyh0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNpemUpXG4gICAgbGV0IG5hbWUgPSBgX19zZW1hbnRpZm9sZF9lZmZlY3RfJHtzaXRlfWBcblxuICAgIHdoaWxlICh0aGlzLnVzZWRCaW5kaW5nTmFtZXMuaGFzKG5hbWUpKSBuYW1lID0gYCR7bmFtZX1fYFxuICAgIHRoaXMudXNlZEJpbmRpbmdOYW1lcy5hZGQobmFtZSlcbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNldChleHByZXNzaW9uLCBuYW1lKVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGxhbm5lZCB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgb3V0c2lkZSBpdHMgb3duIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUZW1wb3JhcnkgbmFtZS5cbiAgICovXG4gIGVmZmVjdFJlcGxhY2VtZW50TmFtZShleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0RGVmaW5pdGlvbiA9PT0gZXhwcmVzc2lvbiA/IHVuZGVmaW5lZCA6IHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcy5nZXQoZXhwcmVzc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgZWZmZWN0IGRlZmluaXRpb24gd2l0aG91dCByZWN1cnNpdmVseSByZXBsYWNpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBEZWZpbmVkIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZW1pdCAtIFRhcmdldCBleHByZXNzaW9uIGVtaXR0ZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdEVmZmVjdERlZmluaXRpb24oZXhwcmVzc2lvbiwgZW1pdCkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lZmZlY3REZWZpbml0aW9uXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gZXhwcmVzc2lvblxuICAgIHRyeSB7XG4gICAgICBlbWl0KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gcHJldmlvdXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZW5lcmF0ZWQgY29udGVudCBzbyBmYXIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBjb250ZW50LlxuICAgKi9cbiAgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuam9pbihcIlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgSlNPTiBQb2ludGVyIGZvciBvbmUgdW5hbWJpZ3VvdXMgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgb2NjdXJyZW5jZSBwYXRoLlxuICAgKi9cbiAgb2NjdXJyZW5jZVBhdGgobm9kZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlKS5wYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSB2YWxpZGF0ZWQgbm9taW5hbCBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFNlbWFudGljIHJlY29yZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBSZWNvcmQgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWNvcmQgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgcmVjb3JkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlUG9zaXRpb25dIC0gV2hldGhlciB0aGUgYmluZGluZyBtdXN0IGV4aXN0IGF0IHJ1bnRpbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCByZWNvcmQgc3BlbGxpbmcuXG4gICAqL1xuICByZWNvcmROYW1lRm9ySWQoZGVjbGFyYXRpb25JZCwgdmFsdWVQb3NpdGlvbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IG93bmVyID0gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3QgaW1wb3J0ZWQgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmICghdmFsdWVQb3NpdGlvbiB8fCAhaXRlbS50eXBlT25seSkpXG5cbiAgICBpZiAodGhpcy5wcm9ncmFtICYmIG93bmVyICYmIG93bmVyLmlkICE9IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfTo6JHtyZWNvcmQubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZC5uYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGNsYXNzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBjbGFzc0ZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3Nlcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlbGxpbmcgb2Ygb25lIHJlZmVyZW5jZSBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgY2xhc3MgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBzcGVsbGluZy5cbiAgICovXG4gIGNsYXNzTmFtZUZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3NGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKGltcG9ydGVkICYmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInBocFwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcbiAgICB9XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIG93bmVkLXJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAtIFN0YWJsZSByZXNvdXJjZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb259IFJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcmVzb3VyY2VGb3JJZChyZXNvdXJjZUlkKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlcy5nZXQocmVzb3VyY2VJZClcbiAgICBpZiAoIXJlc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgcmVzb3VyY2UgaWRlbnRpdHkgJyR7cmVzb3VyY2VJZH0nLmApXG4gICAgcmV0dXJuIHJlc291cmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBjYXBhYmlsaXR5IG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbklkIC0gU3RhYmxlIG9wZXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9ufSBPcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqL1xuICBlZmZlY3RPcGVyYXRpb25Gb3JJZChvcGVyYXRpb25JZCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZWZmZWN0T3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uSWQpXG4gICAgaWYgKCFvcGVyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aXR5ICcke29wZXJhdGlvbklkfScuYClcbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFN0YWJsZSBwcml2YXRlLWZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkfSBGaWVsZCBkZWNsYXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGVGaWVsZEZvcklkKGZpZWxkSWQpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMucHJpdmF0ZUZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIGZpZWxkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWNlaXZlciBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RJZCAtIFN0YWJsZSBtZXRob2QgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NZXRob2REZWNsYXJhdGlvbn0gTWV0aG9kIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgbWV0aG9kRm9ySWQobWV0aG9kSWQpIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZHMuZ2V0KG1ldGhvZElkKVxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBtZXRob2QgaWRlbnRpdHkgJyR7bWV0aG9kSWR9Jy5gKVxuXG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyfSBUeXBlIHBhcmFtZXRlci5cbiAgICovXG4gIHR5cGVQYXJhbWV0ZXJGb3JJZChwYXJhbWV0ZXJJZCkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMudHlwZVBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlcklkKVxuXG4gICAgaWYgKCFwYXJhbWV0ZXIpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCB0eXBlIHBhcmFtZXRlciBpZGVudGl0eSAnJHtwYXJhbWV0ZXJJZH0nLmApXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGVkIG5vbWluYWwgZXJyb3IgZGVjbGFyYXRpb24gZm9yIGFuIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RGYWlsdXJlRGVjbGFyYXRpb259IEVycm9yIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgZXJyb3JGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9ycy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZXJyb3IpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlcnJvciBpZGVudGl0eSAnJHtkZWNsYXJhdGlvbklkfScuYClcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC12aXNpYmxlIHNwZWxsaW5nIGZvciBvbmUgbm9taW5hbCBlcnJvciBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldC12aXNpYmxlIG5hbWUuXG4gICAqL1xuICBlcnJvck5hbWVGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yRm9ySWQoZGVjbGFyYXRpb25JZClcbiAgICBjb25zdCBvd25lciA9IHRoaXMuZGVjbGFyYXRpb25Nb2R1bGVzLmdldChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKHRoaXMucHJvZ3JhbSAmJiBvd25lciAmJiBvd25lci5pZCAhPSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSAmJiB0aGlzLmxhbmd1YWdlID09IFwicnVieVwiKSB7XG4gICAgICByZXR1cm4gYCR7bW9kdWxlQ2xhc3NOYW1lKG93bmVyLmlkKX06OiR7ZXJyb3IubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG93bmVyID8gZXJyb3IubmFtZSA6IHRoaXMuY2FwYWJpbGl0eU5vbWluYWxOYW1lKGVycm9yLm5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgbmFtZSBvd25lZCBieSBhIGNvbXBpbGVyLWF1dGhvcml6ZWQgY2FwYWJpbGl0eS5cbiAgICogUEhQIHByb2dyYW0gZW50cmllcyBsaXZlIGluIGEgZ2VuZXJhdGVkIG5hbWVzcGFjZSB3aGlsZSBzdGRsaWIgcHJvdmlkZXIgY2xhc3NlcyByZW1haW5cbiAgICogZ2xvYmFsLCBzbyBQSFAgcHJvZ3JhbSBtb2RlIGZ1bGx5IHF1YWxpZmllcyBjYXBhYmlsaXR5IG5hbWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIG5vbWluYWwgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IHNwZWxsaW5nLlxuICAgKi9cbiAgY2FwYWJpbGl0eU5vbWluYWxOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IGBcXFxcJHtuYW1lfWAgOiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIHJlc29sdmVkIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBSZXNvbHZlZCBjYWxsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQgY2FsbCBuYW1lLlxuICAgKi9cbiAgY2FsbE5hbWVGb3IoZXhwcmVzc2lvbikge1xuICAgIGlmICh0aGlzLmNhbGxOYW1lUmVzb2x2ZXIpIHJldHVybiB0aGlzLmNhbGxOYW1lUmVzb2x2ZXIoZXhwcmVzc2lvbilcbiAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5kZWNsYXJhdGlvbklkXG4gICAgY29uc3Qgb3duZXIgPSBkZWNsYXJhdGlvbklkID8gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgaW1wb3J0ZWQgPSBkZWNsYXJhdGlvbklkID8gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIgJiYgIXRoaXMucHJvZ3JhbSAmJiB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCA+IDApIHJldHVybiBgTWFpbi4ke2V4cHJlc3Npb24uY2FsbGVlfWBcbiAgICBpZiAoIWRlY2xhcmF0aW9uSWQgfHwgIXRoaXMucHJvZ3JhbSB8fCAhb3duZXIgfHwgb3duZXIuaWQgPT0gUmVmbGVjdC5nZXQodGhpcy5tb2R1bGUsIFwiaWRcIikpIHJldHVybiBleHByZXNzaW9uLmNhbGxlZVxuICAgIGlmICh0aGlzLmxhbmd1YWdlID09IFwicnVieVwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfS4ke2RlY2xhcmF0aW9uTmFtZShvd25lciwgZGVjbGFyYXRpb25JZCl9YFxuICAgIGlmIChpbXBvcnRlZCkgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcblxuICAgIHJldHVybiBkZWNsYXJhdGlvbk5hbWUob3duZXIsIGRlY2xhcmF0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHRhcmdldC1jb250YWluZXIgdHJhaWxpbmcgYXJndW1lbnQgZm9yIGEgc2VtYW50aWMgY2FsbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbn0gX2V4cHJlc3Npb24gLSBSZXNvbHZlZCBzZW1hbnRpYyBjYWxsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTeW50aGV0aWMgYXJndW1lbnQgc3BlbGxpbmcsIHdoZW4gY29uZmlndXJlZC5cbiAgICovXG4gIGNhbGxBcmd1bWVudFN1ZmZpeEZvcihfZXhwcmVzc2lvbikge1xuICAgIHJldHVybiB0aGlzLmNhbGxBcmd1bWVudFN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBzdHJpbmcgZXF1YWxpdHkgbXVzdCBhdm9pZCBhIHRhcmdldCBydW50aW1lIGhlbHBlci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdG8gZW1pdCB0aGUgcGxhdGZvcm0gU3RyaW5nIG1ldGhvZC5cbiAgICovXG4gIHVzZXNNZXRob2RTdHJpbmdFcXVhbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RTdHJpbmdFcXVhbGl0eVxuICB9XG5cbiAgLyoqIE1hcmtzIGVtaXNzaW9uIGFzIG9jY3VycmluZyBpbnNpZGUgb25lIHRvcC1sZXZlbCByZWZlcmVuY2UgY2xhc3MuICovXG4gIGJlZ2luUmVmZXJlbmNlQ2xhc3NFbWlzc2lvbigpIHtcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCArPSAxXG4gIH1cblxuICAvKiogRW5kcyBvbmUgYmFsYW5jZWQgdG9wLWxldmVsIHJlZmVyZW5jZS1jbGFzcyBlbWlzc2lvbiBzY29wZS4gKi9cbiAgZW5kUmVmZXJlbmNlQ2xhc3NFbWlzc2lvbigpIHtcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJSZWZlcmVuY2UtY2xhc3MgZW1pc3Npb24gc2NvcGUgaXMgbm90IGFjdGl2ZS5cIilcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCAtPSAxXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0LWxvY2FsIGJpbmRpbmcgZm9yIG9uZSByZXNvbHZlZCBpbXBvcnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNJbXBvcnR9IGltcG9ydGVkIC0gUmVzb2x2ZWQgaW1wb3J0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBFbWl0dGVkIGltcG9ydCBuYW1lLlxuICAgKi9cbiAgaW1wb3J0TmFtZUZvcihpbXBvcnRlZCkge1xuICAgIGNvbnN0IG1vZHVsZSA9IHRoaXMuI3Byb2dyYW1Nb2R1bGUoKVxuXG4gICAgaWYgKCF0aGlzLnByb2dyYW0gfHwgIW1vZHVsZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbXBvcnQgbmFtZXMgcmVxdWlyZSBhIHZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlwiKVxuXG4gICAgcmV0dXJuIHByb2dyYW1JbXBvcnROYW1lKHRoaXMucHJvZ3JhbSwgbW9kdWxlLCBpbXBvcnRlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGxvY2FsIGRlY2xhcmF0aW9uIGlzIGV4cG9ydGVkIGJ5IHRoZSBjdXJyZW50IHByb2dyYW0gbW9kdWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZGVjbGFyYXRpb25JZCAtIERlY2xhcmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpdCBoYXMgYSBzYW1lLW5hbWUgcHJvZ3JhbSBleHBvcnQuXG4gICAqL1xuICBpc0RpcmVjdGx5RXhwb3J0ZWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IG1vZHVsZSA9IC8qKiBAdHlwZSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSAqLyAodGhpcy5tb2R1bGUpXG5cbiAgICByZXR1cm4gdHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1vZHVsZS5leHBvcnRzPy5zb21lKChpdGVtKSA9PlxuICAgICAgaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQgJiYgaXRlbS5leHBvcnRlZE5hbWUgPT0gZGVjbGFyYXRpb25OYW1lKG1vZHVsZSwgZGVjbGFyYXRpb25JZCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBvbmUgZXhwb3J0IGVkZ2UgdXNlcyBpdHMgZGVjbGFyYXRpb24ncyBlbWl0dGVkIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNFeHBvcnR9IGV4cG9ydGVkIC0gQ3VycmVudCBleHBvcnQgZWRnZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBlZGdlIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBkZWNsYXJhdGlvbiBwcmVmaXguXG4gICAqL1xuICBpc0RpcmVjdEV4cG9ydChleHBvcnRlZCkge1xuICAgIHJldHVybiBleHBvcnRlZC5leHBvcnRlZE5hbWUgPT0gZGVjbGFyYXRpb25OYW1lKHRoaXMubW9kdWxlLCBleHBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBvbmUgbG9jYWwgZGVjbGFyYXRpb24gaGFzIGFueSBwdWJsaWMgcHJvZ3JhbSBleHBvcnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBkZWNsYXJhdGlvbklkIC0gRGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvcnRlZC5cbiAgICovXG4gIGlzRXhwb3J0ZWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IG1vZHVsZSA9IC8qKiBAdHlwZSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSAqLyAodGhpcy5tb2R1bGUpXG5cbiAgICByZXR1cm4gdHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1vZHVsZS5leHBvcnRzPy5zb21lKChpdGVtKSA9PiBpdGVtLmRlY2xhcmF0aW9uSWQgPT0gZGVjbGFyYXRpb25JZCkpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgdGhlIHNlbGVjdGVkIHByb2dyYW0gZW50cnkgbW9kdWxlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHdyaXRlciBvd25zIHRoZSBzZWxlY3RlZCBlbnRyeS5cbiAgICovXG4gIGlzUHJvZ3JhbUVudHJ5KCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyYW0/LmVudHJ5TW9kdWxlID09IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGNsYXNzL21vZHVsZSBzZWdtZW50IGZvciBhIGxvZ2ljYWwgbW9kdWxlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IGNsYXNzL21vZHVsZSBuYW1lLlxuICAgKi9cbiAgcHJvZ3JhbU1vZHVsZU5hbWUobW9kdWxlSWQpIHtcbiAgICBpZiAoIXRoaXMucHJvZ3JhbT8ubW9kdWxlcy5zb21lKCh7aWR9KSA9PiBpZCA9PSBtb2R1bGVJZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHByb2dyYW0gbW9kdWxlICcke21vZHVsZUlkfScuYClcblxuICAgIHJldHVybiBtb2R1bGVDbGFzc05hbWUobW9kdWxlSWQpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGN1cnJlbnQgbW9kdWxlIGluIHRoZSBjb21wbGV0ZSBwcm9ncmFtLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlIHwgdW5kZWZpbmVkfSBDdXJyZW50IHByb2dyYW0gbW9kdWxlLlxuICAgKi9cbiAgI3Byb2dyYW1Nb2R1bGUoKSB7XG4gICAgaWYgKCF0aGlzLnByb2dyYW0pIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiB0aGlzLnByb2dyYW0ubW9kdWxlcy5maW5kKCh7aWR9KSA9PiBpZCA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVsYXRpdmUgRVNNL3JlcXVpcmUgc3BlY2lmaWVyIGZvciBhIHBsYW5uZWQgZGVwZW5kZW5jeSBhcnRpZmFjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIC0gRGVwZW5kZW5jeSBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0ZW5zaW9uXSAtIE9wdGlvbmFsIHJlcGxhY2VtZW50IGV4dGVuc2lvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVsYXRpdmUgUE9TSVggc3BlY2lmaWVyLlxuICAgKi9cbiAgcmVsYXRpdmVNb2R1bGVTcGVjaWZpZXIobW9kdWxlSWQsIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSB0aGlzLnByb2dyYW1QYXRocz8uZ2V0KG1vZHVsZUlkKVxuXG4gICAgaWYgKCF0YXJnZXRQYXRoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwbGFubmVkIG1vZHVsZSBwYXRoICcke21vZHVsZUlkfScuYClcbiAgICBjb25zdCBhZGp1c3RlZFRhcmdldCA9IGV4dGVuc2lvbiA/IHRhcmdldFBhdGgucmVwbGFjZSgvXFwuW14uL10rJC91LCBleHRlbnNpb24pIDogdGFyZ2V0UGF0aFxuICAgIGNvbnN0IGZyb20gPSB0aGlzLmZpbGVuYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSlcbiAgICBjb25zdCB0byA9IGFkanVzdGVkVGFyZ2V0LnNwbGl0KFwiL1wiKVxuICAgIGxldCBjb21tb24gPSAwXG5cbiAgICB3aGlsZSAoY29tbW9uIDwgZnJvbS5sZW5ndGggJiYgY29tbW9uIDwgdG8ubGVuZ3RoICYmIGZyb21bY29tbW9uXSA9PSB0b1tjb21tb25dKSBjb21tb24rK1xuICAgIGNvbnN0IHJlbGF0aXZlID0gWy4uLmZyb20uc2xpY2UoY29tbW9uKS5tYXAoKCkgPT4gXCIuLlwiKSwgLi4udG8uc2xpY2UoY29tbW9uKV0uam9pbihcIi9cIilcblxuICAgIHJldHVybiByZWxhdGl2ZS5zdGFydHNXaXRoKFwiLlwiKSA/IHJlbGF0aXZlIDogYC4vJHtyZWxhdGl2ZX1gXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvdGVjdGVkIG5hdGl2ZSBlbnRyeSBmb3Igb25lIHVzZWQgc3RkbGliIHByb3ZpZGVyIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2Fub25pY2FsIG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gTGlua2VkIHByb3RlY3RlZCBlbnRyeSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIG9wZXJhdGlvbiBzdGF5cyBpbmxpbmVkLlxuICAgKi9cbiAgc3RkbGliUHJvdmlkZXJFbnRyeUZvcihvcGVyYXRpb24pIHtcbiAgICBjb25zdCBtb2R1bGUgPSB0aGlzLmVmZmVjdE9wZXJhdGlvbk1vZHVsZXMuZ2V0KG9wZXJhdGlvbi5pZClcblxuICAgIHJldHVybiBtb2R1bGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuc3RkbGliUHJvdmlkZXJFbnRyaWVzPy5bYCR7bW9kdWxlfVxcdTAwMDAke29wZXJhdGlvbi5uYW1lfWBdXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlbGF0aXZlIHNwZWNpZmllciBmb3IgdGhlIHBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGFydGlmYWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dGVuc2lvbl0gLSBPcHRpb25hbCByZXBsYWNlbWVudCBleHRlbnNpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvdmlkZXJQYXRoXSAtIE9uZSBzZWxlY3RlZCBwcm92aWRlciBhcnRpZmFjdCBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZWxhdGl2ZSBQT1NJWCBzcGVjaWZpZXIuXG4gICAqL1xuICBzdGRsaWJQcm92aWRlclNwZWNpZmllcihleHRlbnNpb24sIHByb3ZpZGVyUGF0aCkge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwcm92aWRlclBhdGggPz8gdGhpcy5zdGRsaWJQcm92aWRlclBhdGggPz8gdGhpcy5zdGRsaWJQcm92aWRlclBhdGhzPy5bMF1cblxuICAgIGlmICghdGFyZ2V0UGF0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIHN0ZGxpYiBwcm92aWRlciBzcGVjaWZpZXIgcmVxdWlyZXMgYSBwbGFubmVkIHByb3ZpZGVyIHBhdGguXCIpXG4gICAgY29uc3QgYWRqdXN0ZWRUYXJnZXQgPSBleHRlbnNpb24gPyB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcLlteLi9dKyQvdSwgZXh0ZW5zaW9uKSA6IHRhcmdldFBhdGhcbiAgICBjb25zdCBmcm9tID0gdGhpcy5maWxlbmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpXG4gICAgY29uc3QgdG8gPSBhZGp1c3RlZFRhcmdldC5zcGxpdChcIi9cIilcbiAgICBsZXQgY29tbW9uID0gMFxuXG4gICAgd2hpbGUgKGNvbW1vbiA8IGZyb20ubGVuZ3RoICYmIGNvbW1vbiA8IHRvLmxlbmd0aCAmJiBmcm9tW2NvbW1vbl0gPT0gdG9bY29tbW9uXSkgY29tbW9uKytcbiAgICBjb25zdCByZWxhdGl2ZSA9IFsuLi5mcm9tLnNsaWNlKGNvbW1vbikubWFwKCgpID0+IFwiLi5cIiksIC4uLnRvLnNsaWNlKGNvbW1vbildLmpvaW4oXCIvXCIpXG5cbiAgICByZXR1cm4gcmVsYXRpdmUuc3RhcnRzV2l0aChcIi5cIikgPyByZWxhdGl2ZSA6IGAuLyR7cmVsYXRpdmV9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5IGZvciB0YXJnZXQgZW1pc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZElkIC0gU2VtYW50aWMgZmllbGQgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmRGaWVsZH0gUmVjb3JkIGZpZWxkLlxuICAgKi9cbiAgZmllbGRGb3JJZChmaWVsZElkKSB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eSAnJHtmaWVsZElkfScuYClcblxuICAgIHJldHVybiBmaWVsZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByZWNvcmQgZGVjbGFyYXRpb24gdGhhdCBvd25zIGEgdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFNlbWFudGljIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IE93bmluZyByZWNvcmQuXG4gICAqL1xuICByZWNvcmRGb3JGaWVsZElkKGZpZWxkSWQpIHtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmZpZWxkUmVjb3Jkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgZmllbGQgaWRlbnRpdHkgJyR7ZmllbGRJZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIGFuIGV4YWN0IHBhcnNlci1vd25lZCByb2xlIHJhbmdlIGlzIGF2YWlsYWJsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gSlNPTiBQb2ludGVyIGZvciBhIHNoYXJlZCBub2RlIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJvbGUgaGFzIGFuIGV4YWN0IHNvdXJjZSByYW5nZS5cbiAgICovXG4gIGhhc1JhbmdlKG5vZGUsIHBhdGgsIHJvbGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSwgcGF0aCkucmFuZ2VzW3JvbGVdICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGV4dCBtYXBwZWQgdG8gYSBzZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYW5ub3RhdGlvbiAtIE1hcHBpbmcgYW5ub3RhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IGFubm90YXRpb24ubm9kZSAtIFNlbWFudGljIG5vZGUuXG4gICAqIEBwYXJhbSB7XCJleGFjdFwiIHwgXCJhbmNob3JcIn0gYW5ub3RhdGlvbi5tYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucm9sZV0gLSBTZW1hbnRpYyB0b2tlbiByb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ubmFtZV0gLSBTb3VyY2UgTWFwIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYW5ub3RhdGlvbi5wYXRoXSAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG1hcHBlZCh0ZXh0LCB7bWFwcGluZ0tpbmQsIG5hbWUsIG5vZGUsIHBhdGgsIHJvbGV9KSB7XG4gICAgaWYgKHRleHQubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSwgcGF0aClcbiAgICBjb25zdCByb2xlTG9jYXRpb24gPSByb2xlID8gcmVjb3JkLnJhbmdlc1tyb2xlXSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG9yaWdpbiA9IHJvbGVMb2NhdGlvbiA/IHRoaXMuI3NvdXJjZU9yaWdpbihyb2xlTG9jYXRpb24sIHJlY29yZC5vcmlnaW4pIDogcmVjb3JkLm9yaWdpblxuICAgIGNvbnN0IHByZWNpc2lvbiA9IG1hcHBpbmdLaW5kID09IFwiZXhhY3RcIiAmJiByb2xlICYmICFyb2xlTG9jYXRpb24gPyBcImFuY2hvclwiIDogbWFwcGluZ0tpbmRcbiAgICBjb25zdCBzeW1ib2wgPSByZWNvcmQuc3ltYm9sSWRcbiAgICAgID8gdGhpcy5pbmRleC5wcm92ZW5hbmNlLnN5bWJvbHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gcmVjb3JkLnN5bWJvbElkKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7XG4gICAgICBtYXBwaW5nS2luZDogcHJlY2lzaW9uLFxuICAgICAgbmFtZTogbmFtZSA/PyBzeW1ib2w/Lm5hbWUsXG4gICAgICBub2RlSWQ6IHJlY29yZC5pZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHJvbGUsXG4gICAgICBzeW1ib2xJZDogcmVjb3JkLnN5bWJvbElkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgc291cmNlLWZyZWUgc2NhZmZvbGRpbmcgd2l0aCBvcHRpb25hbCBzZW1hbnRpYyBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gU3RhYmxlIHJlYXNvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVbXX0gW3JlbGF0ZWROb2Rlc10gLSBSZWxhdGVkIG5vZGVzLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpW119IFtyZWxhdGVkUGF0aHNdIC0gT2NjdXJyZW5jZSBwYXRocyBmb3Igc2hhcmVkIHJlbGF0ZWQgbm9kZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3ludGhldGljKHRleHQsIHJlYXNvbiwgcmVsYXRlZE5vZGVzID0gW10sIHJlbGF0ZWRQYXRocyA9IFtdKSB7XG4gICAgaWYgKHRleHQubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gICAgY29uc3QgcmVsYXRlZE9yaWdpbnMgPSByZWxhdGVkTm9kZXMuZmxhdE1hcCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHJlbGF0ZWRQYXRoc1tpbmRleF0pXG5cbiAgICAgIHJldHVybiByZWxhdGVkT3JpZ2luc0ZvcihyZWNvcmQub3JpZ2luKS5mbGF0TWFwKChyZWxhdGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWwgPSB7XG4gICAgICAgICAgLi4ucmVsYXRlZCxcbiAgICAgICAgICBub2RlSWQ6IHJlbGF0ZWQubm9kZUlkID8/IHJlY29yZC5pZCxcbiAgICAgICAgICByb2xlOiByZWxhdGVkLnJvbGUgPz8gXCJjb250ZXh0XCJcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSByZWxhdGVkT3JpZ2luS2V5KGNvbnRleHR1YWwpXG5cbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybiBbXVxuICAgICAgICBzZWVuLmFkZChrZXkpXG5cbiAgICAgICAgcmV0dXJuIFtjb250ZXh0dWFsXVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy4jYXBwZW5kKHRleHQsIHttYXBwaW5nS2luZDogXCJzeW50aGV0aWNcIiwgb3JpZ2luOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uLCByZWxhdGVkT3JpZ2luc319KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dGhvcml0YXRpdmUgcmljaCBtYXAgZm9yIHRoZSBjdXJyZW50IGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IE1hcHBpbmcuXG4gICAqL1xuICBmaW5pc2goKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICAgIGdlbmVyYXRlZDoge2NvbnRlbnQ6IHRoaXMuY29kZSwgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlfSxcbiAgICAgIG5vZGVzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLm5vZGVzXSxcbiAgICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZE1hcHBpbmdcIixcbiAgICAgIHNvdXJjZXM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlc10sXG4gICAgICBzcGFuczogWy4uLnRoaXMuc3BhbnNdLFxuICAgICAgc3ltYm9sczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzXSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBvbmUgbWFwcGVkIHNwYW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gR2VuZXJhdGVkIHRleHQuXG4gICAqIEBwYXJhbSB7T21pdDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBcImdlbmVyYXRlZFwiPn0gYW5ub3RhdGlvbiAtIFNwYW4gYW5ub3RhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAjYXBwZW5kKHRleHQsIGFubm90YXRpb24pIHtcbiAgICBpZiAodGV4dC5pbmNsdWRlcyhcIlxcclwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRlZCBvdXRwdXQgbXVzdCB1c2UgZGV0ZXJtaW5pc3RpYyBMRiBsaW5lIGVuZGluZ3MuXCIpXG5cbiAgICBjb25zdCBzdGFydCA9IHtjb2x1bW46IHRoaXMuY29sdW1uLCBsaW5lOiB0aGlzLmxpbmUsIG9mZnNldDogdGhpcy5vZmZzZXR9XG5cbiAgICB0aGlzLnBhcnRzLnB1c2godGV4dClcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGV4dC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHRoaXMub2Zmc2V0KytcbiAgICAgIGlmICh0ZXh0W2luZGV4XSA9PSBcIlxcblwiKSB7XG4gICAgICAgIHRoaXMubGluZSsrXG4gICAgICAgIHRoaXMuY29sdW1uID0gMVxuICAgICAgfSBlbHNlIHRoaXMuY29sdW1uKytcbiAgICB9XG4gICAgY29uc3QgY29tcGFjdCA9IC8qKiBAdHlwZSB7T21pdDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBcImdlbmVyYXRlZFwiPn0gKi8gKFxuICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGFubm90YXRpb24pLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSlcbiAgICApXG5cbiAgICB0aGlzLnNwYW5zLnB1c2goe1xuICAgICAgLi4uY29tcGFjdCxcbiAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICBlbmQ6IHtjb2x1bW46IHRoaXMuY29sdW1uLCBsaW5lOiB0aGlzLmxpbmUsIG9mZnNldDogdGhpcy5vZmZzZXR9LFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgc3RhcnRcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXJlY3Qgcm9sZSBvcmlnaW4gdXNpbmcgY2Fub25pY2FsIHNvdXJjZSBpZGVudGl0aWVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHJvbGUgcmFuZ2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IGZhbGxiYWNrIC0gT3duaW5nIG9yaWdpbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBSb2xlIG9yaWdpbi5cbiAgICovXG4gICNzb3VyY2VPcmlnaW4obG9jYXRpb24sIGZhbGxiYWNrKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZhbGxiYWNrU291cmNlSWRcblxuICAgIGlmIChmYWxsYmFjay5raW5kID09IFwic291cmNlXCIgJiYgZmFsbGJhY2subG9jYXRpb24uZmlsZW5hbWUgPT0gbG9jYXRpb24uZmlsZW5hbWUpIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5zb3VyY2VJZFxuICAgIGVsc2UgaWYgKGZhbGxiYWNrLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5vcmlnaW5zLmZpbmQoKG9yaWdpbikgPT4gb3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKT8uc291cmNlSWRcbiAgICB9IGVsc2UgaWYgKGZhbGxiYWNrLmtpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgICAgZmFsbGJhY2tTb3VyY2VJZCA9IGZhbGxiYWNrLnJlbGF0ZWRPcmlnaW5zLmZpbmQoKG9yaWdpbikgPT4gb3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKT8uc291cmNlSWRcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gZmFsbGJhY2tTb3VyY2VJZCkgPz9cbiAgICAgIHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKVxuXG4gICAgcmV0dXJuIHNvdXJjZSA/IHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbiwgc291cmNlSWQ6IHNvdXJjZS5pZH0gOiBmYWxsYmFja1xuICB9XG59XG5cbi8qKlxuICogRXhwYW5kcyBldmVyeSBjbG9zZWQgcHJvdmVuYW5jZSByYW5nZSBpbiBzZW1hbnRpYyBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBwcm92ZW5hbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gUmVsYXRlZCByYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5zRm9yKG9yaWdpbikge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikgcmV0dXJuIFt7bG9jYXRpb246IG9yaWdpbi5sb2NhdGlvbiwgc291cmNlSWQ6IG9yaWdpbi5zb3VyY2VJZH1dXG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikgcmV0dXJuIG9yaWdpbi5vcmlnaW5zXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGVybWluaXN0aWMgaWRlbnRpdHkgZm9yIG9uZSBjb250ZXh0dWFsIHJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBvcmlnaW4gLSBSZWxhdGVkIG9yaWdpbi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRlZE9yaWdpbktleShvcmlnaW4pIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICBvcmlnaW4uc291cmNlSWQsXG4gICAgb3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5zdGFydC5vZmZzZXQsXG4gICAgb3JpZ2luLmxvY2F0aW9uLmVuZC5vZmZzZXQsXG4gICAgb3JpZ2luLm5vZGVJZCA/PyBudWxsLFxuICAgIG9yaWdpbi5zeW1ib2xJZCA/PyBudWxsLFxuICAgIG9yaWdpbi5yb2xlID8/IG51bGxcbiAgXSlcbn1cbiJdfQ==
731
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBSTtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUTtRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2pILEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFL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QyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDckksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFDLFVBQVUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDakosSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUNqRixVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUMzRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFF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O1FBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDMUIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3JCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN2QixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRpb25JbmRleH0gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKipcbiAqIENvbGxlY3RzIGV2ZXJ5IGNhbGxlci1jb250cm9sbGVkIGJpbmRpbmcgc3BlbGxpbmcgYmVmb3JlIHN5bnRoZXRpYyBuYW1lcyBhcmUgY2hvc2VuLlxuICogQHBhcmFtIHt1bmtub3dufSByb290IC0gU2VtYW50aWMgZ3JhcGguXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IFVzZWQgc291cmNlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0QmluZGluZ05hbWVzKHJvb3QpIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcbiAgY29uc3QgcGVuZGluZyA9IFtyb290XVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGVuZGluZy5wb3AoKVxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCBcIm5hbWVcIikgPT0gXCJzdHJpbmdcIikgbmFtZXMuYWRkKFJlZmxlY3QuZ2V0KHZhbHVlLCBcIm5hbWVcIikpXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT0gXCJvYmplY3RcIikgcGVuZGluZy5wdXNoKGNoaWxkKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXNcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxvZ2ljYWwgbW9kdWxlIGlkZW50aXR5IHRvIGl0cyBjYW5vbmljYWwgdGFyZ2V0IHR5cGUgc2VnbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIExvZ2ljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHJldHVybnMge3N0cmluZ30gUG9ydGFibGUgdGFyZ2V0IGNsYXNzL21vZHVsZSBuYW1lLlxuICovXG5mdW5jdGlvbiBtb2R1bGVDbGFzc05hbWUoaWQpIHtcbiAgcmV0dXJuIGlkLnNwbGl0KC9bLl8tXSsvdSkubWFwKChwYXJ0KSA9PiBgJHtwYXJ0WzBdLnRvVXBwZXJDYXNlKCl9JHtwYXJ0LnNsaWNlKDEpfWApLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBMb29rcyB1cCBvbmUgZGVjbGFyYXRpb24gbmFtZSBpbiBpdHMgb3duaW5nIHByb2dyYW0gbW9kdWxlLlxuICogQHBhcmFtIHtQYXJ0aWFsPGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZT59IG1vZHVsZSAtIE93bmluZyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IERlY2xhcmF0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uTmFtZShtb2R1bGUsIGRlY2xhcmF0aW9uSWQpIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBbLi4ubW9kdWxlLmZ1bmN0aW9ucyA/PyBbXSwgLi4ubW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLm1vZHVsZS5jbGFzc2VzID8/IFtdLCAuLi5tb2R1bGUuZXJyb3JzID8/IFtdXVxuICAgIC5maW5kKCh7aWR9KSA9PiBpZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHByb2dyYW0gZGVjbGFyYXRpb24gJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbn1cblxuLyoqXG4gKiBDaG9vc2VzIGFuIHVucXVhbGlmaWVkIHRhcmdldCBiaW5kaW5nIHdpdGhvdXQgdHJlYXRpbmcgYSBzb3VyY2UtcHJvZmlsZSBxdWFsaWZpZXIgYXMgc2VtYW50aWMgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbX0gcHJvZ3JhbSAtIE93bmluZyBwcm9ncmFtLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9IG1vZHVsZSAtIEltcG9ydGluZyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljSW1wb3J0fSBpbXBvcnRlZCAtIFJlc29sdmVkIGltcG9ydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldC1sb2NhbCBiaW5kaW5nIHNwZWxsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvZ3JhbUltcG9ydE5hbWUocHJvZ3JhbSwgbW9kdWxlLCBpbXBvcnRlZCkge1xuICBjb25zdCBzb3VyY2UgPSBwcm9ncmFtLnNvdXJjZXMuZmluZCgoe2ZpbGVuYW1lfSkgPT4gZmlsZW5hbWUgPT0gbW9kdWxlLnNvdXJjZUZpbGVuYW1lKVxuXG4gIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUHJvZ3JhbSBtb2R1bGUgJyR7bW9kdWxlLmlkfScgaGFzIG5vIHJlZ2lzdGVyZWQgc291cmNlLmApXG5cbiAgcmV0dXJuIHNvdXJjZS5sYW5ndWFnZSA9PSBcInJ1YnlcIiB8fCBzb3VyY2UubGFuZ3VhZ2UgPT0gXCJqYXZhXCIgPyBpbXBvcnRlZC5pbXBvcnRlZE5hbWUgOiBpbXBvcnRlZC5sb2NhbE5hbWVcbn1cblxuLyoqIFNvdXJjZS1hd2FyZSBkZXRlcm1pbmlzdGljIGdlbmVyYXRlZC1vdXRwdXQgYnVpbGRlci4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VXcml0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHNvdXJjZS1hd2FyZSB3cml0ZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gV3JpdGVyIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmZpbGVuYW1lIC0gT3V0cHV0IGZpbGVuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFRleHRMYW5ndWFnZX0gb3B0aW9ucy5sYW5ndWFnZSAtIE91dHB1dCB0ZXh0IGxhbmd1YWdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBvcHRpb25zLm1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IFtvcHRpb25zLnByb2dyYW1dIC0gT3duaW5nIG11bHRpLWZpbGUgcHJvZ3JhbS5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBbb3B0aW9ucy5wcm9ncmFtUGF0aHNdIC0gUGxhbm5lZCBhcnRpZmFjdCBwYXRoIGJ5IG1vZHVsZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119IFtvcHRpb25zLnNvdXJjZXNdIC0gQ2FsbGVyLXByb3ZpZGVkIHNvdXJjZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJFbnRyaWVzXSAtIFVzZWQgb3BlcmF0aW9uIHRvIHByb3RlY3RlZCBuYXRpdmUgZW50cnkgZm9yIGEgbGlua2VkIHN0ZGxpYiBwcm92aWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0ZGxpYlByb3ZpZGVyUGF0aF0gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlclBhdGhzXSAtIFBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGFydGlmYWN0IHBhdGhzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlckltcG9ydHNdIC0gT3JkZXJlZCBwcm92aWRlciBuYW1lcyB0aGlzIG1vZHVsZSBtdXN0IGltcG9ydC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGVdIC0gSmF2YSBvd25lciBtb2R1bGUgaWRlbnRpdHkgaG9zdGluZyB0aGUgc2hhcmVkIHN1cHBvcnQgYmxvY2sgYW5kIHNoaW1zLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlclNoaW1zXSAtIEphdmEgb3duZXIgcHJvZ3JhbS13aWRlIHVzZWQgb3BlcmF0aW9ucyBleHBvc2VkIGFzIHB1YmxpYyBzdGF0aWMgc2hpbXMuXG4gICAqIEBwYXJhbSB7KGV4cHJlc3Npb246IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNhbGxFeHByZXNzaW9uKSA9PiBzdHJpbmd9IFtvcHRpb25zLmNhbGxOYW1lUmVzb2x2ZXJdIC0gVGFyZ2V0LWNvbnRhaW5lciBjYWxsIHNwZWxsaW5nIG92ZXJyaWRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FsbEFyZ3VtZW50U3VmZml4XSAtIFN5bnRoZXRpYyB0cmFpbGluZyBhcmd1bWVudCBmb3IgZXZlcnkgc2VtYW50aWMgZnVuY3Rpb24gY2FsbC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5tZXRob2RTdHJpbmdFcXVhbGl0eV0gLSBFbWl0IHN0cmluZyBlcXVhbGl0eSB0aHJvdWdoIHRoZSBwbGF0Zm9ybSBTdHJpbmcgbWV0aG9kLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NhbGxBcmd1bWVudFN1ZmZpeCwgY2FsbE5hbWVSZXNvbHZlciwgZmlsZW5hbWUsIGxhbmd1YWdlLCBtZXRob2RTdHJpbmdFcXVhbGl0eSwgbW9kdWxlLCBwcm9ncmFtLCBwcm9ncmFtUGF0aHMsIHNvdXJjZXMsXG4gICAgc3RkbGliUHJvdmlkZXJFbnRyaWVzLCBzdGRsaWJQcm92aWRlclBhdGgsIHN0ZGxpYlByb3ZpZGVyUGF0aHMsIHN0ZGxpYlByb3ZpZGVySW1wb3J0cywgc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSxcbiAgICBzdGRsaWJQcm92aWRlclNoaW1zfSkge1xuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgc291cmNlcylcblxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMubW9kdWxlID0gbW9kdWxlXG4gICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbVxuICAgIHRoaXMucHJvZ3JhbVBhdGhzID0gcHJvZ3JhbVBhdGhzXG4gICAgdGhpcy5jYWxsQXJndW1lbnRTdWZmaXggPSBjYWxsQXJndW1lbnRTdWZmaXhcbiAgICB0aGlzLmNhbGxOYW1lUmVzb2x2ZXIgPSBjYWxsTmFtZVJlc29sdmVyXG4gICAgdGhpcy5tZXRob2RTdHJpbmdFcXVhbGl0eSA9IG1ldGhvZFN0cmluZ0VxdWFsaXR5ID8/IGZhbHNlXG4gICAgdGhpcy5pbmRleCA9IGluZGV4XG4gICAgdGhpcy5zdGRsaWJQcm92aWRlckVudHJpZXMgPSBzdGRsaWJQcm92aWRlckVudHJpZXNcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyUGF0aCA9IHN0ZGxpYlByb3ZpZGVyUGF0aFxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJQYXRocyA9IHN0ZGxpYlByb3ZpZGVyUGF0aHMgPz8gKHN0ZGxpYlByb3ZpZGVyUGF0aCA/IFtzdGRsaWJQcm92aWRlclBhdGhdIDogdW5kZWZpbmVkKVxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJJbXBvcnRzID0gc3RkbGliUHJvdmlkZXJJbXBvcnRzXG4gICAgdGhpcy5zdGRsaWJQcm92aWRlck93bmVyTW9kdWxlID0gc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZVxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJTaGltcyA9IHN0ZGxpYlByb3ZpZGVyU2hpbXNcbiAgICBjb25zdCBwcm9ncmFtUmVjb3JkcyA9IHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gcHJvZ3JhbU1vZHVsZS5yZWNvcmRzID8/IFtdKSA/PyBtb2R1bGUucmVjb3JkcyA/PyBbXVxuICAgIGNvbnN0IHByb2dyYW1DbGFzc2VzID0gcHJvZ3JhbT8ubW9kdWxlcy5mbGF0TWFwKChwcm9ncmFtTW9kdWxlKSA9PiBwcm9ncmFtTW9kdWxlLmNsYXNzZXMgPz8gW10pID8/IG1vZHVsZS5jbGFzc2VzID8/IFtdXG4gICAgY29uc3QgcHJvZ3JhbUludGVyZmFjZXMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUuaW50ZXJmYWNlcyA/PyBbXSkgPz8gbW9kdWxlLmludGVyZmFjZXMgPz8gW11cbiAgICBjb25zdCBjYXBhYmlsaXR5RmFpbHVyZXMgPSBtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcykgPz8gW11cbiAgICBjb25zdCBwcm9ncmFtRXJyb3JzID0gcHJvZ3JhbT8ubW9kdWxlcy5mbGF0TWFwKChwcm9ncmFtTW9kdWxlKSA9PiBbXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5lcnJvcnMgPz8gW10pLFxuICAgICAgLi4uKHByb2dyYW1Nb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcykgPz8gW10pXG4gICAgXSkgPz8gWy4uLm1vZHVsZS5lcnJvcnMgPz8gW10sIC4uLmNhcGFiaWxpdHlGYWlsdXJlc11cbiAgICBjb25zdCBwcm9ncmFtRnVuY3Rpb25zID0gcHJvZ3JhbT8ubW9kdWxlcy5mbGF0TWFwKChwcm9ncmFtTW9kdWxlKSA9PiBwcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucykgPz8gbW9kdWxlLmZ1bmN0aW9uc1xuXG4gICAgdGhpcy5yZWNvcmRzID0gbmV3IE1hcChwcm9ncmFtUmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gW3JlY29yZC5pZCwgcmVjb3JkXSkpXG4gICAgdGhpcy5jbGFzc2VzID0gbmV3IE1hcChwcm9ncmFtQ2xhc3Nlcy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24uaWQsIGRlY2xhcmF0aW9uXSkpXG4gICAgdGhpcy5pbnRlcmZhY2VzID0gbmV3IE1hcChwcm9ncmFtSW50ZXJmYWNlcy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24uaWQsIGRlY2xhcmF0aW9uXSkpXG4gICAgdGhpcy5lcnJvcnMgPSBuZXcgTWFwKHByb2dyYW1FcnJvcnMubWFwKChlcnJvcikgPT4gW2Vycm9yLmlkLCBlcnJvcl0pKVxuICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IE1hcCgobW9kdWxlLmNhcGFiaWxpdGllcz8uZmxhdE1hcCgoe3Jlc291cmNlc30pID0+IHJlc291cmNlcykgPz8gW10pLm1hcCgocmVzb3VyY2UpID0+IFtyZXNvdXJjZS5pZCwgcmVzb3VyY2VdKSlcbiAgICB0aGlzLmVmZmVjdE9wZXJhdGlvbnMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7b3BlcmF0aW9uc30pID0+IG9wZXJhdGlvbnMpID8/IFtdKS5tYXAoKG9wZXJhdGlvbikgPT4gW29wZXJhdGlvbi5pZCwgb3BlcmF0aW9uXSkpXG4gICAgdGhpcy5lZmZlY3RPcGVyYXRpb25Nb2R1bGVzID0gbmV3IE1hcCgobW9kdWxlLmNhcGFiaWxpdGllcz8uZmxhdE1hcCgoY2FwYWJpbGl0eSkgPT5cbiAgICAgIGNhcGFiaWxpdHkub3BlcmF0aW9ucy5tYXAoKG9wZXJhdGlvbikgPT4gW29wZXJhdGlvbi5pZCwgY2FwYWJpbGl0eS5hdXRob3JpdHlJZF0pKSA/PyBbXSkpXG4gICAgdGhpcy5maWVsZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbZmllbGQuaWQsIGZpZWxkXSkpKVxuICAgIHRoaXMuZmllbGRSZWNvcmRzID0gbmV3IE1hcChwcm9ncmFtUmVjb3Jkcy5mbGF0TWFwKChyZWNvcmQpID0+IHJlY29yZC5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmlkLCByZWNvcmRdKSkpXG4gICAgdGhpcy5wcml2YXRlRmllbGRzID0gbmV3IE1hcChwcm9ncmFtQ2xhc3Nlcy5mbGF0TWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24uZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5pZCwgZmllbGRdKSkpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5JbnRlcmZhY2VNZXRob2REZWNsYXJhdGlvbiB8IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk1ldGhvZERlY2xhcmF0aW9uPn0gKi9cbiAgICB0aGlzLm1ldGhvZHMgPSBuZXcgTWFwKClcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHByb2dyYW1DbGFzc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSB0aGlzLm1ldGhvZHMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSwgbWV0aG9kKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHByb2dyYW1JbnRlcmZhY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSB0aGlzLm1ldGhvZHMuc2V0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSwgbWV0aG9kKVxuICAgIH1cbiAgICB0aGlzLnR5cGVQYXJhbWV0ZXJzID0gbmV3IE1hcChbLi4ucHJvZ3JhbVJlY29yZHMsIC4uLnByb2dyYW1GdW5jdGlvbnNdLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PlxuICAgICAgKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5pZCwgcGFyYW1ldGVyXSkpKVxuICAgIHRoaXMucmVmZXJlbmNlQ2xhc3NFbWlzc2lvbkRlcHRoID0gMFxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi9cbiAgICB0aGlzLmRlY2xhcmF0aW9uTW9kdWxlcyA9IG5ldyBNYXAocHJvZ3JhbT8ubW9kdWxlcy5mbGF0TWFwKChwcm9ncmFtTW9kdWxlKSA9PiBbXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5yZWNvcmRzID8/IFtdKS5tYXAoKGRlY2xhcmF0aW9uKSA9PiAvKiogQHR5cGUge2NvbnN0fSAqLyAoWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBwcm9ncmFtTW9kdWxlXSkpLFxuICAgICAgLi4uKHByb2dyYW1Nb2R1bGUuY2xhc3NlcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgcHJvZ3JhbU1vZHVsZV0pKSxcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmludGVyZmFjZXMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5lcnJvcnMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi5wcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiAvKiogQHR5cGUge2NvbnN0fSAqLyAoWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBwcm9ncmFtTW9kdWxlXSkpXG4gICAgXSkgPz8gW10pXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLnBhcnRzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgICB0aGlzLnNwYW5zID0gW11cbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICB0aGlzLmxpbmUgPSAxXG4gICAgdGhpcy5jb2x1bW4gPSAxXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFJlcGxhY2VtZW50TmFtZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy51c2VkQmluZGluZ05hbWVzID0gY29sbGVjdEJpbmRpbmdOYW1lcyhtb2R1bGUpXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGVmZmVjdCBleHByZXNzaW9ucyBsb3dlcmVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3VycmVudCBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBleHByZXNzaW9ucyAtIE9yZGVyZWQgZXhwcmVzc2lvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcGxhbkVmZmVjdFJlcGxhY2VtZW50cyhleHByZXNzaW9ucykge1xuICAgIHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcyA9IG5ldyBNYXAoZXhwcmVzc2lvbnMubWFwKChleHByZXNzaW9uKSA9PiBbZXhwcmVzc2lvbiwgdGhpcy5lZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pXSkpXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIGEgY29sbGlzaW9uLXNhZmUgbmFtZSBmb3Igb25lIGRldGVybWluaXN0aWMgZWZmZWN0IHNpdGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEVmZmVjdGZ1bCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgdGVtcG9yYXJ5IG5hbWUuXG4gICAqL1xuICBlZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMuZWZmZWN0VGVtcG9yYXJ5TmFtZXMuZ2V0KGV4cHJlc3Npb24pXG4gICAgaWYgKGtub3duKSByZXR1cm4ga25vd25cbiAgICBjb25zdCBzaXRlID0gdHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCJcbiAgICAgID8gUmVmbGVjdC5nZXQoZXhwcmVzc2lvbiwgXCJlZmZlY3RTaXRlSWRcIikuc2xpY2UoXCJlZmZlY3Q6XCIubGVuZ3RoKSA6IFN0cmluZyh0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNpemUpXG4gICAgbGV0IG5hbWUgPSBgX19zZW1hbnRpZm9sZF9lZmZlY3RfJHtzaXRlfWBcblxuICAgIHdoaWxlICh0aGlzLnVzZWRCaW5kaW5nTmFtZXMuaGFzKG5hbWUpKSBuYW1lID0gYCR7bmFtZX1fYFxuICAgIHRoaXMudXNlZEJpbmRpbmdOYW1lcy5hZGQobmFtZSlcbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNldChleHByZXNzaW9uLCBuYW1lKVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGxhbm5lZCB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgb3V0c2lkZSBpdHMgb3duIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUZW1wb3JhcnkgbmFtZS5cbiAgICovXG4gIGVmZmVjdFJlcGxhY2VtZW50TmFtZShleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0RGVmaW5pdGlvbiA9PT0gZXhwcmVzc2lvbiA/IHVuZGVmaW5lZCA6IHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcy5nZXQoZXhwcmVzc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgZWZmZWN0IGRlZmluaXRpb24gd2l0aG91dCByZWN1cnNpdmVseSByZXBsYWNpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBEZWZpbmVkIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZW1pdCAtIFRhcmdldCBleHByZXNzaW9uIGVtaXR0ZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdEVmZmVjdERlZmluaXRpb24oZXhwcmVzc2lvbiwgZW1pdCkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lZmZlY3REZWZpbml0aW9uXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gZXhwcmVzc2lvblxuICAgIHRyeSB7XG4gICAgICBlbWl0KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gcHJldmlvdXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZW5lcmF0ZWQgY29udGVudCBzbyBmYXIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBjb250ZW50LlxuICAgKi9cbiAgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuam9pbihcIlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgSlNPTiBQb2ludGVyIGZvciBvbmUgdW5hbWJpZ3VvdXMgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgb2NjdXJyZW5jZSBwYXRoLlxuICAgKi9cbiAgb2NjdXJyZW5jZVBhdGgobm9kZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlKS5wYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSB2YWxpZGF0ZWQgbm9taW5hbCBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFNlbWFudGljIHJlY29yZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBSZWNvcmQgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWNvcmQgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgcmVjb3JkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlUG9zaXRpb25dIC0gV2hldGhlciB0aGUgYmluZGluZyBtdXN0IGV4aXN0IGF0IHJ1bnRpbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCByZWNvcmQgc3BlbGxpbmcuXG4gICAqL1xuICByZWNvcmROYW1lRm9ySWQoZGVjbGFyYXRpb25JZCwgdmFsdWVQb3NpdGlvbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IG93bmVyID0gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3QgaW1wb3J0ZWQgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmICghdmFsdWVQb3NpdGlvbiB8fCAhaXRlbS50eXBlT25seSkpXG5cbiAgICBpZiAodGhpcy5wcm9ncmFtICYmIG93bmVyICYmIG93bmVyLmlkICE9IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfTo6JHtyZWNvcmQubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZC5uYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGNsYXNzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBjbGFzc0ZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3Nlcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlbGxpbmcgb2Ygb25lIHJlZmVyZW5jZSBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgY2xhc3MgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBzcGVsbGluZy5cbiAgICovXG4gIGNsYXNzTmFtZUZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3NGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKGltcG9ydGVkICYmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInBocFwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcbiAgICB9XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIGludGVyZmFjZSBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgaW50ZXJmYWNlIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlRGVjbGFyYXRpb259IEludGVyZmFjZSBkZWNsYXJhdGlvbi5cbiAgICovXG4gIGludGVyZmFjZUZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuaW50ZXJmYWNlcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBpbnRlcmZhY2UgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlbGxpbmcgb2Ygb25lIGludGVyZmFjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQgc3BlbGxpbmcuXG4gICAqL1xuICBpbnRlcmZhY2VOYW1lRm9ySWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gdGhpcy5pbnRlcmZhY2VGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKGltcG9ydGVkICYmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInBocFwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcbiAgICB9XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIG93bmVkLXJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAtIFN0YWJsZSByZXNvdXJjZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb259IFJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcmVzb3VyY2VGb3JJZChyZXNvdXJjZUlkKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlcy5nZXQocmVzb3VyY2VJZClcbiAgICBpZiAoIXJlc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgcmVzb3VyY2UgaWRlbnRpdHkgJyR7cmVzb3VyY2VJZH0nLmApXG4gICAgcmV0dXJuIHJlc291cmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBjYXBhYmlsaXR5IG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbklkIC0gU3RhYmxlIG9wZXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9ufSBPcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqL1xuICBlZmZlY3RPcGVyYXRpb25Gb3JJZChvcGVyYXRpb25JZCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZWZmZWN0T3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uSWQpXG4gICAgaWYgKCFvcGVyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aXR5ICcke29wZXJhdGlvbklkfScuYClcbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFN0YWJsZSBwcml2YXRlLWZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkfSBGaWVsZCBkZWNsYXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGVGaWVsZEZvcklkKGZpZWxkSWQpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMucHJpdmF0ZUZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIGZpZWxkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWNlaXZlciBtZXRob2QsIGNsYXNzLW93bmVkIG9yIGludGVyZmFjZS1kZWNsYXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZElkIC0gU3RhYmxlIG1ldGhvZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLk1ldGhvZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRpb259IE1ldGhvZCBkZWNsYXJhdGlvbi5cbiAgICovXG4gIG1ldGhvZEZvcklkKG1ldGhvZElkKSB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5tZXRob2RzLmdldChtZXRob2RJZClcblxuICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgbWV0aG9kIGlkZW50aXR5ICcke21ldGhvZElkfScuYClcblxuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIGRlY2xhcmF0aW9uLXNjb3BlZCB0eXBlIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gU3RhYmxlIHR5cGUtcGFyYW1ldGVyIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuVHlwZVBhcmFtZXRlcn0gVHlwZSBwYXJhbWV0ZXIuXG4gICAqL1xuICB0eXBlUGFyYW1ldGVyRm9ySWQocGFyYW1ldGVySWQpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJJZClcblxuICAgIGlmICghcGFyYW1ldGVyKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgdHlwZSBwYXJhbWV0ZXIgaWRlbnRpdHkgJyR7cGFyYW1ldGVySWR9Jy5gKVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbGlkYXRlZCBub21pbmFsIGVycm9yIGRlY2xhcmF0aW9uIGZvciBhbiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9ufSBFcnJvciBkZWNsYXJhdGlvbi5cbiAgICovXG4gIGVycm9yRm9ySWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IGVycm9yID0gdGhpcy5lcnJvcnMuZ2V0KGRlY2xhcmF0aW9uSWQpXG5cbiAgICBpZiAoIWVycm9yKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgZXJyb3IgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQtdmlzaWJsZSBzcGVsbGluZyBmb3Igb25lIG5vbWluYWwgZXJyb3IgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGVycm9yIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQtdmlzaWJsZSBuYW1lLlxuICAgKi9cbiAgZXJyb3JOYW1lRm9ySWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IGVycm9yID0gdGhpcy5lcnJvckZvcklkKGRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3Qgb3duZXIgPSB0aGlzLmRlY2xhcmF0aW9uTW9kdWxlcy5nZXQoZGVjbGFyYXRpb25JZClcbiAgICBjb25zdCBpbXBvcnRlZCA9IHRoaXMuI3Byb2dyYW1Nb2R1bGUoKT8uaW1wb3J0cy5maW5kKChpdGVtKSA9PiBpdGVtLmRlY2xhcmF0aW9uSWQgPT0gZGVjbGFyYXRpb25JZClcblxuICAgIGlmICh0aGlzLnByb2dyYW0gJiYgb3duZXIgJiYgb3duZXIuaWQgIT0gUmVmbGVjdC5nZXQodGhpcy5tb2R1bGUsIFwiaWRcIikgJiYgdGhpcy5sYW5ndWFnZSA9PSBcInJ1YnlcIikge1xuICAgICAgcmV0dXJuIGAke21vZHVsZUNsYXNzTmFtZShvd25lci5pZCl9Ojoke2Vycm9yLm5hbWV9YFxuICAgIH1cbiAgICBpZiAoaW1wb3J0ZWQgJiYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInR5cGVzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwicGhwXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbXBvcnROYW1lRm9yKGltcG9ydGVkKVxuICAgIH1cblxuICAgIHJldHVybiBvd25lciA/IGVycm9yLm5hbWUgOiB0aGlzLmNhcGFiaWxpdHlOb21pbmFsTmFtZShlcnJvci5uYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldCBzcGVsbGluZyBmb3IgYSBub21pbmFsIG5hbWUgb3duZWQgYnkgYSBjb21waWxlci1hdXRob3JpemVkIGNhcGFiaWxpdHkuXG4gICAqIFBIUCBwcm9ncmFtIGVudHJpZXMgbGl2ZSBpbiBhIGdlbmVyYXRlZCBuYW1lc3BhY2Ugd2hpbGUgc3RkbGliIHByb3ZpZGVyIGNsYXNzZXMgcmVtYWluXG4gICAqIGdsb2JhbCwgc28gUEhQIHByb2dyYW0gbW9kZSBmdWxseSBxdWFsaWZpZXMgY2FwYWJpbGl0eSBuYW1lcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBEZWNsYXJlZCBub21pbmFsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBzcGVsbGluZy5cbiAgICovXG4gIGNhcGFiaWxpdHlOb21pbmFsTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3JhbSAmJiB0aGlzLmxhbmd1YWdlID09IFwicGhwXCIgPyBgXFxcXCR7bmFtZX1gIDogbmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldCBzcGVsbGluZyBmb3IgYSByZXNvbHZlZCBmdW5jdGlvbiBjYWxsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkNhbGxFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUmVzb2x2ZWQgY2FsbC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IGNhbGwgbmFtZS5cbiAgICovXG4gIGNhbGxOYW1lRm9yKGV4cHJlc3Npb24pIHtcbiAgICBpZiAodGhpcy5jYWxsTmFtZVJlc29sdmVyKSByZXR1cm4gdGhpcy5jYWxsTmFtZVJlc29sdmVyKGV4cHJlc3Npb24pXG4gICAgY29uc3QgZGVjbGFyYXRpb25JZCA9IGV4cHJlc3Npb24ucmVzb2x1dGlvbj8uZGVjbGFyYXRpb25JZFxuICAgIGNvbnN0IG93bmVyID0gZGVjbGFyYXRpb25JZCA/IHRoaXMuZGVjbGFyYXRpb25Nb2R1bGVzLmdldChkZWNsYXJhdGlvbklkKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGltcG9ydGVkID0gZGVjbGFyYXRpb25JZCA/IHRoaXMuI3Byb2dyYW1Nb2R1bGUoKT8uaW1wb3J0cy5maW5kKChpdGVtKSA9PiBpdGVtLmRlY2xhcmF0aW9uSWQgPT0gZGVjbGFyYXRpb25JZCkgOiB1bmRlZmluZWRcblxuICAgIGlmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YVwiICYmICF0aGlzLnByb2dyYW0gJiYgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggPiAwKSByZXR1cm4gYE1haW4uJHtleHByZXNzaW9uLmNhbGxlZX1gXG4gICAgaWYgKCFkZWNsYXJhdGlvbklkIHx8ICF0aGlzLnByb2dyYW0gfHwgIW93bmVyIHx8IG93bmVyLmlkID09IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpKSByZXR1cm4gZXhwcmVzc2lvbi5jYWxsZWVcbiAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcInJ1YnlcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwiamF2YVwiKSByZXR1cm4gYCR7bW9kdWxlQ2xhc3NOYW1lKG93bmVyLmlkKX0uJHtkZWNsYXJhdGlvbk5hbWUob3duZXIsIGRlY2xhcmF0aW9uSWQpfWBcbiAgICBpZiAoaW1wb3J0ZWQpIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25OYW1lKG93bmVyLCBkZWNsYXJhdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB0YXJnZXQtY29udGFpbmVyIHRyYWlsaW5nIGFyZ3VtZW50IGZvciBhIHNlbWFudGljIGNhbGwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb259IF9leHByZXNzaW9uIC0gUmVzb2x2ZWQgc2VtYW50aWMgY2FsbC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gU3ludGhldGljIGFyZ3VtZW50IHNwZWxsaW5nLCB3aGVuIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBjYWxsQXJndW1lbnRTdWZmaXhGb3IoX2V4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsQXJndW1lbnRTdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgc3RyaW5nIGVxdWFsaXR5IG11c3QgYXZvaWQgYSB0YXJnZXQgcnVudGltZSBoZWxwZXIuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRvIGVtaXQgdGhlIHBsYXRmb3JtIFN0cmluZyBtZXRob2QuXG4gICAqL1xuICB1c2VzTWV0aG9kU3RyaW5nRXF1YWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kU3RyaW5nRXF1YWxpdHlcbiAgfVxuXG4gIC8qKiBNYXJrcyBlbWlzc2lvbiBhcyBvY2N1cnJpbmcgaW5zaWRlIG9uZSB0b3AtbGV2ZWwgcmVmZXJlbmNlIGNsYXNzLiAqL1xuICBiZWdpblJlZmVyZW5jZUNsYXNzRW1pc3Npb24oKSB7XG4gICAgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggKz0gMVxuICB9XG5cbiAgLyoqIEVuZHMgb25lIGJhbGFuY2VkIHRvcC1sZXZlbCByZWZlcmVuY2UtY2xhc3MgZW1pc3Npb24gc2NvcGUuICovXG4gIGVuZFJlZmVyZW5jZUNsYXNzRW1pc3Npb24oKSB7XG4gICAgaWYgKHRoaXMucmVmZXJlbmNlQ2xhc3NFbWlzc2lvbkRlcHRoID09IDApIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVmZXJlbmNlLWNsYXNzIGVtaXNzaW9uIHNjb3BlIGlzIG5vdCBhY3RpdmUuXCIpXG4gICAgdGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggLT0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC1sb2NhbCBiaW5kaW5nIGZvciBvbmUgcmVzb2x2ZWQgaW1wb3J0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljSW1wb3J0fSBpbXBvcnRlZCAtIFJlc29sdmVkIGltcG9ydC5cbiAgICogQHJldHVybnMge3N0cmluZ30gRW1pdHRlZCBpbXBvcnQgbmFtZS5cbiAgICovXG4gIGltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKClcblxuICAgIGlmICghdGhpcy5wcm9ncmFtIHx8ICFtb2R1bGUpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW1wb3J0IG5hbWVzIHJlcXVpcmUgYSB2YWxpZGF0ZWQgc2VtYW50aWMgcHJvZ3JhbS5cIilcblxuICAgIHJldHVybiBwcm9ncmFtSW1wb3J0TmFtZSh0aGlzLnByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIG9uZSBsb2NhbCBkZWNsYXJhdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgY3VycmVudCBwcm9ncmFtIG1vZHVsZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGRlY2xhcmF0aW9uSWQgLSBEZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaXQgaGFzIGEgc2FtZS1uYW1lIHByb2dyYW0gZXhwb3J0LlxuICAgKi9cbiAgaXNEaXJlY3RseUV4cG9ydGVkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSAvKiogQHR5cGUge1BhcnRpYWw8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi8gKHRoaXMubW9kdWxlKVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtb2R1bGUuZXhwb3J0cz8uc29tZSgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmIGl0ZW0uZXhwb3J0ZWROYW1lID09IGRlY2xhcmF0aW9uTmFtZShtb2R1bGUsIGRlY2xhcmF0aW9uSWQpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGV4cG9ydCBlZGdlIHVzZXMgaXRzIGRlY2xhcmF0aW9uJ3MgZW1pdHRlZCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljRXhwb3J0fSBleHBvcnRlZCAtIEN1cnJlbnQgZXhwb3J0IGVkZ2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgZWRnZSBpcyByZXByZXNlbnRlZCBieSB0aGUgZGVjbGFyYXRpb24gcHJlZml4LlxuICAgKi9cbiAgaXNEaXJlY3RFeHBvcnQoZXhwb3J0ZWQpIHtcbiAgICByZXR1cm4gZXhwb3J0ZWQuZXhwb3J0ZWROYW1lID09IGRlY2xhcmF0aW9uTmFtZSh0aGlzLm1vZHVsZSwgZXhwb3J0ZWQuZGVjbGFyYXRpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGxvY2FsIGRlY2xhcmF0aW9uIGhhcyBhbnkgcHVibGljIHByb2dyYW0gZXhwb3J0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZGVjbGFyYXRpb25JZCAtIERlY2xhcmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3J0ZWQuXG4gICAqL1xuICBpc0V4cG9ydGVkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBtb2R1bGUgPSAvKiogQHR5cGUge1BhcnRpYWw8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlPn0gKi8gKHRoaXMubW9kdWxlKVxuXG4gICAgcmV0dXJuIHR5cGVvZiBkZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiYgQm9vbGVhbihtb2R1bGUuZXhwb3J0cz8uc29tZSgoaXRlbSkgPT4gaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIHRoZSBzZWxlY3RlZCBwcm9ncmFtIGVudHJ5IG1vZHVsZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB3cml0ZXIgb3ducyB0aGUgc2VsZWN0ZWQgZW50cnkuXG4gICAqL1xuICBpc1Byb2dyYW1FbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtPy5lbnRyeU1vZHVsZSA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBjbGFzcy9tb2R1bGUgc2VnbWVudCBmb3IgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIC0gTG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAgICovXG4gIHByb2dyYW1Nb2R1bGVOYW1lKG1vZHVsZUlkKSB7XG4gICAgaWYgKCF0aGlzLnByb2dyYW0/Lm1vZHVsZXMuc29tZSgoe2lkfSkgPT4gaWQgPT0gbW9kdWxlSWQpKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIG1vZHVsZSAnJHttb2R1bGVJZH0nLmApXG5cbiAgICByZXR1cm4gbW9kdWxlQ2xhc3NOYW1lKG1vZHVsZUlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjdXJyZW50IG1vZHVsZSBpbiB0aGUgY29tcGxldGUgcHJvZ3JhbS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IHVuZGVmaW5lZH0gQ3VycmVudCBwcm9ncmFtIG1vZHVsZS5cbiAgICovXG4gICNwcm9ncmFtTW9kdWxlKCkge1xuICAgIGlmICghdGhpcy5wcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtLm1vZHVsZXMuZmluZCgoe2lkfSkgPT4gaWQgPT0gUmVmbGVjdC5nZXQodGhpcy5tb2R1bGUsIFwiaWRcIikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlbGF0aXZlIEVTTS9yZXF1aXJlIHNwZWNpZmllciBmb3IgYSBwbGFubmVkIGRlcGVuZGVuY3kgYXJ0aWZhY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCAtIERlcGVuZGVuY3kgbW9kdWxlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dGVuc2lvbl0gLSBPcHRpb25hbCByZXBsYWNlbWVudCBleHRlbnNpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlbGF0aXZlIFBPU0lYIHNwZWNpZmllci5cbiAgICovXG4gIHJlbGF0aXZlTW9kdWxlU3BlY2lmaWVyKG1vZHVsZUlkLCBleHRlbnNpb24pIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gdGhpcy5wcm9ncmFtUGF0aHM/LmdldChtb2R1bGVJZClcblxuICAgIGlmICghdGFyZ2V0UGF0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gcGxhbm5lZCBtb2R1bGUgcGF0aCAnJHttb2R1bGVJZH0nLmApXG4gICAgY29uc3QgYWRqdXN0ZWRUYXJnZXQgPSBleHRlbnNpb24gPyB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcLlteLi9dKyQvdSwgZXh0ZW5zaW9uKSA6IHRhcmdldFBhdGhcbiAgICBjb25zdCBmcm9tID0gdGhpcy5maWxlbmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpXG4gICAgY29uc3QgdG8gPSBhZGp1c3RlZFRhcmdldC5zcGxpdChcIi9cIilcbiAgICBsZXQgY29tbW9uID0gMFxuXG4gICAgd2hpbGUgKGNvbW1vbiA8IGZyb20ubGVuZ3RoICYmIGNvbW1vbiA8IHRvLmxlbmd0aCAmJiBmcm9tW2NvbW1vbl0gPT0gdG9bY29tbW9uXSkgY29tbW9uKytcbiAgICBjb25zdCByZWxhdGl2ZSA9IFsuLi5mcm9tLnNsaWNlKGNvbW1vbikubWFwKCgpID0+IFwiLi5cIiksIC4uLnRvLnNsaWNlKGNvbW1vbildLmpvaW4oXCIvXCIpXG5cbiAgICByZXR1cm4gcmVsYXRpdmUuc3RhcnRzV2l0aChcIi5cIikgPyByZWxhdGl2ZSA6IGAuLyR7cmVsYXRpdmV9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3RlY3RlZCBuYXRpdmUgZW50cnkgZm9yIG9uZSB1c2VkIHN0ZGxpYiBwcm92aWRlciBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb259IG9wZXJhdGlvbiAtIENhbm9uaWNhbCBvcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IExpbmtlZCBwcm90ZWN0ZWQgZW50cnksIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBvcGVyYXRpb24gc3RheXMgaW5saW5lZC5cbiAgICovXG4gIHN0ZGxpYlByb3ZpZGVyRW50cnlGb3Iob3BlcmF0aW9uKSB7XG4gICAgY29uc3QgbW9kdWxlID0gdGhpcy5lZmZlY3RPcGVyYXRpb25Nb2R1bGVzLmdldChvcGVyYXRpb24uaWQpXG5cbiAgICByZXR1cm4gbW9kdWxlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnN0ZGxpYlByb3ZpZGVyRW50cmllcz8uW2Ake21vZHVsZX1cXHUwMDAwJHtvcGVyYXRpb24ubmFtZX1gXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSByZWxhdGl2ZSBzcGVjaWZpZXIgZm9yIHRoZSBwbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHRlbnNpb25dIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVyUGF0aF0gLSBPbmUgc2VsZWN0ZWQgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVsYXRpdmUgUE9TSVggc3BlY2lmaWVyLlxuICAgKi9cbiAgc3RkbGliUHJvdmlkZXJTcGVjaWZpZXIoZXh0ZW5zaW9uLCBwcm92aWRlclBhdGgpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcHJvdmlkZXJQYXRoID8/IHRoaXMuc3RkbGliUHJvdmlkZXJQYXRoID8/IHRoaXMuc3RkbGliUHJvdmlkZXJQYXRocz8uWzBdXG5cbiAgICBpZiAoIXRhcmdldFBhdGgpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBzdGRsaWIgcHJvdmlkZXIgc3BlY2lmaWVyIHJlcXVpcmVzIGEgcGxhbm5lZCBwcm92aWRlciBwYXRoLlwiKVxuICAgIGNvbnN0IGFkanVzdGVkVGFyZ2V0ID0gZXh0ZW5zaW9uID8gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXC5bXi4vXSskL3UsIGV4dGVuc2lvbikgOiB0YXJnZXRQYXRoXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuZmlsZW5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKVxuICAgIGNvbnN0IHRvID0gYWRqdXN0ZWRUYXJnZXQuc3BsaXQoXCIvXCIpXG4gICAgbGV0IGNvbW1vbiA9IDBcblxuICAgIHdoaWxlIChjb21tb24gPCBmcm9tLmxlbmd0aCAmJiBjb21tb24gPCB0by5sZW5ndGggJiYgZnJvbVtjb21tb25dID09IHRvW2NvbW1vbl0pIGNvbW1vbisrXG4gICAgY29uc3QgcmVsYXRpdmUgPSBbLi4uZnJvbS5zbGljZShjb21tb24pLm1hcCgoKSA9PiBcIi4uXCIpLCAuLi50by5zbGljZShjb21tb24pXS5qb2luKFwiL1wiKVxuXG4gICAgcmV0dXJuIHJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuXCIpID8gcmVsYXRpdmUgOiBgLi8ke3JlbGF0aXZlfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFNlbWFudGljIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRmllbGR9IFJlY29yZCBmaWVsZC5cbiAgICovXG4gIGZpZWxkRm9ySWQoZmllbGRJZCkge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZ2V0KGZpZWxkSWQpXG5cbiAgICBpZiAoIWZpZWxkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgZmllbGQgaWRlbnRpdHkgJyR7ZmllbGRJZH0nLmApXG5cbiAgICByZXR1cm4gZmllbGRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcmVjb3JkIGRlY2xhcmF0aW9uIHRoYXQgb3ducyBhIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkSWQgLSBTZW1hbnRpYyBmaWVsZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBPd25pbmcgcmVjb3JkLlxuICAgKi9cbiAgcmVjb3JkRm9yRmllbGRJZChmaWVsZElkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5maWVsZFJlY29yZHMuZ2V0KGZpZWxkSWQpXG5cbiAgICBpZiAoIXJlY29yZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIHJlY29yZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
@@ -38,7 +38,7 @@ export type JavaConversionContext = {
38
38
  /**
39
39
  * - Nominal declarations by source name.
40
40
  */
41
- recordNames: Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration>;
41
+ recordNames: Map<string, import("../semantic/types.js").RecordDeclaration | import("../semantic/types.js").ClassDeclaration | import("../semantic/types.js").EffectResourceDeclaration | import("../semantic/types.js").InterfaceDeclaration>;
42
42
  /**
43
43
  * - Records by identity.
44
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../../src/frontends/java.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../../src/frontends/java.js"],"names":[],"mappings":"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"}