@aws-amplify/graphql-api-construct 1.16.1-ai-next.0 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. package/.jsii +160 -87
  2. package/API.md +11 -1
  3. package/CHANGELOG.md +6 -2
  4. package/lib/amplify-dynamodb-table-wrapper.js +1 -1
  5. package/lib/amplify-graphql-api.js +14 -2
  6. package/lib/amplify-graphql-definition.js +1 -1
  7. package/lib/model-datasource-strategy-types.d.ts +21 -1
  8. package/lib/model-datasource-strategy-types.js +1 -1
  9. package/lib/sql-model-datasource-strategy.js +1 -1
  10. package/lib/types.d.ts +1 -1
  11. package/lib/types.js +1 -1
  12. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/bedrock_converse_adapter.d.ts +3 -4
  13. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/bedrock_converse_adapter.js +174 -212
  14. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_message_history_retriever.d.ts +10 -0
  15. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_message_history_retriever.js +65 -2
  16. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_executor.d.ts +4 -2
  17. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_executor.js +29 -7
  18. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_response_sender.d.ts +11 -8
  19. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_response_sender.js +33 -25
  20. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/errors.d.ts +10 -0
  21. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/errors.js +17 -0
  22. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/lazy.d.ts +16 -0
  23. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/lazy.js +37 -0
  24. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/types.d.ts +0 -19
  25. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/types.js +1 -1
  26. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/README.md +9 -0
  27. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/amplify_function.d.ts +4 -0
  28. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/amplify_function.js +3 -0
  29. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/auth_resources.d.ts +66 -0
  30. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/auth_resources.js +3 -0
  31. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/aws_client_provider.d.ts +5 -0
  32. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/aws_client_provider.js +3 -0
  33. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_identifier.d.ts +56 -0
  34. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_identifier.js +3 -0
  35. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_output.d.ts +6 -0
  36. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_output.js +3 -0
  37. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_secret_resolver.d.ts +22 -0
  38. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_secret_resolver.js +3 -0
  39. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_stack_creator.d.ts +8 -0
  40. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_stack_creator.js +3 -0
  41. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_stack_resolver.d.ts +7 -0
  42. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/backend_stack_resolver.js +3 -0
  43. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/construct_container.d.ts +35 -0
  44. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/construct_container.js +3 -0
  45. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/construct_factory.d.ts +24 -0
  46. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/construct_factory.js +3 -0
  47. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/deep_partial.d.ts +17 -0
  48. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/deep_partial.js +3 -0
  49. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/deployment_type.d.ts +8 -0
  50. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/deployment_type.js +3 -0
  51. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/function_resources.d.ts +8 -0
  52. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/function_resources.js +3 -0
  53. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/import_path_verifier.d.ts +14 -0
  54. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/import_path_verifier.js +3 -0
  55. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/index.d.ts +24 -0
  56. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/index.js +40 -0
  57. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/output_retrieval_strategy.d.ts +11 -0
  58. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/output_retrieval_strategy.js +3 -0
  59. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/output_storage_strategy.d.ts +10 -0
  60. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/output_storage_strategy.js +3 -0
  61. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/package_manager_controller.d.ts +16 -0
  62. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/package_manager_controller.js +3 -0
  63. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/resource_access_acceptor.d.ts +27 -0
  64. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/resource_access_acceptor.js +3 -0
  65. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/resource_name_validator.d.ts +10 -0
  66. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/resource_name_validator.js +3 -0
  67. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/resource_provider.d.ts +10 -0
  68. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/resource_provider.js +3 -0
  69. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/ssm_environment_entries_generator.d.ts +5 -0
  70. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/ssm_environment_entries_generator.js +3 -0
  71. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/stable_backend_identifiers.d.ts +4 -0
  72. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/stable_backend_identifiers.js +3 -0
  73. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/stack_provider.d.ts +5 -0
  74. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/lib/stack_provider.js +3 -0
  75. package/node_modules/@aws-amplify/ai-constructs/node_modules/@aws-amplify/plugin-types/package.json +24 -0
  76. package/node_modules/@aws-amplify/ai-constructs/package.json +4 -4
  77. package/node_modules/@aws-amplify/graphql-auth-transformer/CHANGELOG.md +1 -1
  78. package/node_modules/@aws-amplify/graphql-auth-transformer/package.json +13 -13
  79. package/node_modules/@aws-amplify/graphql-conversation-transformer/CHANGELOG.md +6 -2
  80. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/graphql-types/message-model.js +1 -1
  81. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/graphql-types/message-model.js.map +1 -1
  82. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/templates/assistant-streaming-mutation-resolver-fn.template.js +0 -2
  83. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-field-handler.d.ts.map +1 -1
  84. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-field-handler.js.map +1 -1
  85. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.d.ts +1 -1
  86. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.d.ts.map +1 -1
  87. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.js +10 -10
  88. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/transformer-steps/conversation-resolver-generator.js.map +1 -1
  89. package/node_modules/@aws-amplify/graphql-conversation-transformer/package.json +11 -11
  90. package/node_modules/@aws-amplify/graphql-default-value-transformer/CHANGELOG.md +1 -1
  91. package/node_modules/@aws-amplify/graphql-default-value-transformer/package.json +8 -8
  92. package/node_modules/@aws-amplify/graphql-directives/CHANGELOG.md +6 -0
  93. package/node_modules/@aws-amplify/graphql-directives/LICENSE +201 -0
  94. package/node_modules/@aws-amplify/graphql-directives/lib/directives/belongs-to.d.ts.map +1 -1
  95. package/node_modules/@aws-amplify/graphql-directives/lib/directives/belongs-to.js +1 -1
  96. package/node_modules/@aws-amplify/graphql-directives/lib/directives/belongs-to.js.map +1 -1
  97. package/node_modules/@aws-amplify/graphql-directives/package.json +3 -2
  98. package/node_modules/@aws-amplify/graphql-function-transformer/CHANGELOG.md +1 -1
  99. package/node_modules/@aws-amplify/graphql-function-transformer/package.json +7 -7
  100. package/node_modules/@aws-amplify/graphql-generation-transformer/CHANGELOG.md +1 -1
  101. package/node_modules/@aws-amplify/graphql-generation-transformer/package.json +7 -7
  102. package/node_modules/@aws-amplify/graphql-http-transformer/CHANGELOG.md +1 -1
  103. package/node_modules/@aws-amplify/graphql-http-transformer/package.json +7 -7
  104. package/node_modules/@aws-amplify/graphql-index-transformer/CHANGELOG.md +1 -1
  105. package/node_modules/@aws-amplify/graphql-index-transformer/package.json +8 -8
  106. package/node_modules/@aws-amplify/graphql-maps-to-transformer/CHANGELOG.md +1 -1
  107. package/node_modules/@aws-amplify/graphql-maps-to-transformer/lib/assets/mapping-lambda.zip +0 -0
  108. package/node_modules/@aws-amplify/graphql-maps-to-transformer/package.json +11 -11
  109. package/node_modules/@aws-amplify/graphql-model-transformer/CHANGELOG.md +4 -2
  110. package/node_modules/@aws-amplify/graphql-model-transformer/lib/graphql-model-transformer.d.ts.map +1 -1
  111. package/node_modules/@aws-amplify/graphql-model-transformer/lib/graphql-model-transformer.js +7 -2
  112. package/node_modules/@aws-amplify/graphql-model-transformer/lib/graphql-model-transformer.js.map +1 -1
  113. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-lambda.zip +0 -0
  114. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-notification-lambda.zip +0 -0
  115. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-patching-lambda.zip +0 -0
  116. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamo-model-resource-generator.d.ts.map +1 -1
  117. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamo-model-resource-generator.js +12 -3
  118. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamo-model-resource-generator.js.map +1 -1
  119. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamodb-table-construct/index.d.ts +2 -0
  120. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamodb-table-construct/index.d.ts.map +1 -1
  121. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamodb-table-construct/index.js +4 -2
  122. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-dynamodb-table-construct/index.js.map +1 -1
  123. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/amplify-table-manager-handler.d.ts.map +1 -1
  124. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/amplify-table-manager-handler.js +6 -1
  125. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/amplify-table-manager-handler.js.map +1 -1
  126. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/import-table.d.ts +7 -0
  127. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/import-table.d.ts.map +1 -0
  128. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/import-table.js +205 -0
  129. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/import-table.js.map +1 -0
  130. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/node_modules/.package-lock.json +13 -0
  131. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/node_modules/lodash.isequal/LICENSE +47 -0
  132. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/node_modules/lodash.isequal/README.md +18 -0
  133. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/node_modules/lodash.isequal/index.js +1848 -0
  134. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/node_modules/lodash.isequal/package.json +16 -0
  135. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/package-lock.json +21 -0
  136. package/node_modules/@aws-amplify/graphql-model-transformer/lib/resources/amplify-dynamodb-table/amplify-table-manager-lambda/package.json +11 -0
  137. package/node_modules/@aws-amplify/graphql-model-transformer/package.json +12 -9
  138. package/node_modules/@aws-amplify/graphql-predictions-transformer/CHANGELOG.md +1 -1
  139. package/node_modules/@aws-amplify/graphql-predictions-transformer/lib/predictionsLambdaFunction.zip +0 -0
  140. package/node_modules/@aws-amplify/graphql-predictions-transformer/package.json +7 -7
  141. package/node_modules/@aws-amplify/graphql-relational-transformer/CHANGELOG.md +4 -2
  142. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/graphql-belongs-to-transformer.d.ts.map +1 -1
  143. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/graphql-belongs-to-transformer.js +6 -0
  144. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/graphql-belongs-to-transformer.js.map +1 -1
  145. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/has-many/has-many-directive-ddb-references-transformer.d.ts.map +1 -1
  146. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/has-many/has-many-directive-ddb-references-transformer.js +7 -1
  147. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/has-many/has-many-directive-ddb-references-transformer.js.map +1 -1
  148. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/has-one/has-one-directive-ddb-references-transformer.d.ts.map +1 -1
  149. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/has-one/has-one-directive-ddb-references-transformer.js +7 -1
  150. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/has-one/has-one-directive-ddb-references-transformer.js.map +1 -1
  151. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/types.d.ts +1 -0
  152. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/types.d.ts.map +1 -1
  153. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/utils.d.ts +1 -0
  154. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/utils.d.ts.map +1 -1
  155. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/utils.js +9 -1
  156. package/node_modules/@aws-amplify/graphql-relational-transformer/lib/utils.js.map +1 -1
  157. package/node_modules/@aws-amplify/graphql-relational-transformer/package.json +9 -9
  158. package/node_modules/@aws-amplify/graphql-searchable-transformer/CHANGELOG.md +1 -1
  159. package/node_modules/@aws-amplify/graphql-searchable-transformer/lib/streaming-lambda.zip +0 -0
  160. package/node_modules/@aws-amplify/graphql-searchable-transformer/package.json +8 -8
  161. package/node_modules/@aws-amplify/graphql-sql-transformer/CHANGELOG.md +1 -1
  162. package/node_modules/@aws-amplify/graphql-sql-transformer/package.json +8 -8
  163. package/node_modules/@aws-amplify/graphql-transformer/CHANGELOG.md +1 -1
  164. package/node_modules/@aws-amplify/graphql-transformer/package.json +18 -18
  165. package/node_modules/@aws-amplify/graphql-transformer-core/API.md +4 -0
  166. package/node_modules/@aws-amplify/graphql-transformer-core/CHANGELOG.md +4 -2
  167. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.d.ts +1 -1
  168. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.d.ts.map +1 -1
  169. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.js +3 -2
  170. package/node_modules/@aws-amplify/graphql-transformer-core/lib/index.js.map +1 -1
  171. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/model-datasource-strategy-utils.d.ts +2 -1
  172. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/model-datasource-strategy-utils.d.ts.map +1 -1
  173. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/model-datasource-strategy-utils.js +9 -1
  174. package/node_modules/@aws-amplify/graphql-transformer-core/lib/utils/model-datasource-strategy-utils.js.map +1 -1
  175. package/node_modules/@aws-amplify/graphql-transformer-core/package.json +5 -5
  176. package/node_modules/@aws-amplify/graphql-transformer-interfaces/API.md +11 -1
  177. package/node_modules/@aws-amplify/graphql-transformer-interfaces/CHANGELOG.md +6 -0
  178. package/node_modules/@aws-amplify/graphql-transformer-interfaces/LICENSE +201 -0
  179. package/node_modules/@aws-amplify/graphql-transformer-interfaces/lib/model-datasource/types.d.ts +6 -1
  180. package/node_modules/@aws-amplify/graphql-transformer-interfaces/lib/model-datasource/types.d.ts.map +1 -1
  181. package/node_modules/@aws-amplify/graphql-transformer-interfaces/lib/model-datasource/types.js.map +1 -1
  182. package/node_modules/@aws-amplify/graphql-transformer-interfaces/package.json +3 -2
  183. package/node_modules/@aws-amplify/graphql-transformer-interfaces/src/model-datasource/types.ts +15 -0
  184. package/node_modules/@aws-amplify/graphql-transformer-interfaces/tsconfig.tsbuildinfo +1 -1
  185. package/node_modules/graphql-transformer-common/CHANGELOG.md +1 -1
  186. package/node_modules/graphql-transformer-common/package.json +2 -2
  187. package/package.json +22 -22
  188. package/src/amplify-graphql-api.ts +16 -1
  189. package/src/model-datasource-strategy-types.ts +25 -0
  190. package/src/types.ts +1 -1
@@ -4,6 +4,7 @@ exports.BedrockConverseAdapter = void 0;
4
4
  const client_bedrock_runtime_1 = require("@aws-sdk/client-bedrock-runtime");
5
5
  const event_tools_provider_1 = require("./event-tools-provider");
6
6
  const conversation_message_history_retriever_1 = require("./conversation_message_history_retriever");
7
+ const errors_1 = require("./errors");
7
8
  /**
8
9
  * This class is responsible for interacting with Bedrock Converse API
9
10
  * in order to produce final response that can be sent back to caller.
@@ -22,61 +23,52 @@ class BedrockConverseAdapter {
22
23
  this.clientToolByName = new Map();
23
24
  this.askBedrock = async () => {
24
25
  var _a, _b, _c, _d, _e, _f, _g, _h;
25
- try {
26
- const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
27
- const messages = await this.getEventMessagesAsBedrockMessages();
28
- let bedrockResponse;
29
- do {
30
- const toolConfig = this.createToolConfiguration();
31
- const converseCommandInput = {
32
- modelId,
33
- messages: [...messages],
34
- system: [{ text: systemPrompt }],
35
- inferenceConfig: inferenceConfiguration,
36
- toolConfig,
37
- };
38
- this.logger.info('Sending Bedrock Converse request');
39
- this.logger.debug('Bedrock Converse request:', converseCommandInput);
40
- bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseCommand(converseCommandInput));
41
- this.logger.info(`Received Bedrock Converse response, requestId=${bedrockResponse.$metadata.requestId}`, bedrockResponse.usage);
42
- this.logger.debug('Bedrock Converse response:', bedrockResponse);
43
- if ((_a = bedrockResponse.output) === null || _a === void 0 ? void 0 : _a.message) {
44
- messages.push((_b = bedrockResponse.output) === null || _b === void 0 ? void 0 : _b.message);
26
+ const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
27
+ const messages = await this.getEventMessagesAsBedrockMessages();
28
+ let bedrockResponse;
29
+ do {
30
+ const toolConfig = this.createToolConfiguration();
31
+ const converseCommandInput = {
32
+ modelId,
33
+ messages: [...messages],
34
+ system: [{ text: systemPrompt }],
35
+ inferenceConfig: inferenceConfiguration,
36
+ toolConfig,
37
+ };
38
+ this.logger.info('Sending Bedrock Converse request');
39
+ this.logger.debug('Bedrock Converse request:', converseCommandInput);
40
+ bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseCommand(converseCommandInput));
41
+ this.logger.info(`Received Bedrock Converse response, requestId=${bedrockResponse.$metadata.requestId}`, bedrockResponse.usage);
42
+ this.logger.debug('Bedrock Converse response:', bedrockResponse);
43
+ if ((_a = bedrockResponse.output) === null || _a === void 0 ? void 0 : _a.message) {
44
+ messages.push((_b = bedrockResponse.output) === null || _b === void 0 ? void 0 : _b.message);
45
+ }
46
+ if (bedrockResponse.stopReason === 'tool_use') {
47
+ const responseContentBlocks = (_e = (_d = (_c = bedrockResponse.output) === null || _c === void 0 ? void 0 : _c.message) === null || _d === void 0 ? void 0 : _d.content) !== null && _e !== void 0 ? _e : [];
48
+ const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
49
+ const clientToolUseBlocks = responseContentBlocks.filter((block) => {
50
+ var _a, _b;
51
+ return ((_a = block.toolUse) === null || _a === void 0 ? void 0 : _a.name) &&
52
+ this.clientToolByName.has((_b = block.toolUse) === null || _b === void 0 ? void 0 : _b.name);
53
+ });
54
+ if (clientToolUseBlocks.length > 0) {
55
+ // For now if any of client tools is used we ignore executable tools
56
+ // and propagate result back to client.
57
+ return clientToolUseBlocks;
45
58
  }
46
- if (bedrockResponse.stopReason === 'tool_use') {
47
- const responseContentBlocks = (_e = (_d = (_c = bedrockResponse.output) === null || _c === void 0 ? void 0 : _c.message) === null || _d === void 0 ? void 0 : _d.content) !== null && _e !== void 0 ? _e : [];
48
- const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
49
- const clientToolUseBlocks = responseContentBlocks.filter((block) => {
50
- var _a, _b;
51
- return ((_a = block.toolUse) === null || _a === void 0 ? void 0 : _a.name) &&
52
- this.clientToolByName.has((_b = block.toolUse) === null || _b === void 0 ? void 0 : _b.name);
53
- });
54
- if (clientToolUseBlocks.length > 0) {
55
- // For now if any of client tools is used we ignore executable tools
56
- // and propagate result back to client.
57
- return { content: clientToolUseBlocks };
58
- }
59
- const toolResponseContentBlocks = [];
60
- for (const responseContentBlock of toolUseBlocks) {
61
- const toolUseBlock = responseContentBlock;
62
- const toolResultContentBlock = await this.executeTool(toolUseBlock);
63
- toolResponseContentBlocks.push(toolResultContentBlock);
64
- }
65
- messages.push({
66
- role: 'user',
67
- content: toolResponseContentBlocks,
68
- });
59
+ const toolResponseContentBlocks = [];
60
+ for (const responseContentBlock of toolUseBlocks) {
61
+ const toolUseBlock = responseContentBlock;
62
+ const toolResultContentBlock = await this.executeTool(toolUseBlock);
63
+ toolResponseContentBlocks.push(toolResultContentBlock);
69
64
  }
70
- } while (bedrockResponse.stopReason === 'tool_use');
71
- return { content: (_h = (_g = (_f = bedrockResponse.output) === null || _f === void 0 ? void 0 : _f.message) === null || _g === void 0 ? void 0 : _g.content) !== null && _h !== void 0 ? _h : [] };
72
- }
73
- catch (error) {
74
- console.error('Conversation with Bedrock failed', error);
75
- const conversationTurnError = this.convertErrorToConversationTurnError(error);
76
- return {
77
- errors: [conversationTurnError],
78
- };
79
- }
65
+ messages.push({
66
+ role: 'user',
67
+ content: toolResponseContentBlocks,
68
+ });
69
+ }
70
+ } while (bedrockResponse.stopReason === 'tool_use');
71
+ return (_h = (_g = (_f = bedrockResponse.output) === null || _f === void 0 ? void 0 : _f.message) === null || _g === void 0 ? void 0 : _g.content) !== null && _h !== void 0 ? _h : [];
80
72
  };
81
73
  /**
82
74
  * Maps event messages to Bedrock types.
@@ -171,23 +163,6 @@ class BedrockConverseAdapter {
171
163
  };
172
164
  }
173
165
  };
174
- this.convertErrorToConversationTurnError = (error) => {
175
- let errorType = 'UnknownError';
176
- let message;
177
- if (error instanceof Error) {
178
- message = error.message;
179
- if (error.name) {
180
- errorType = error.name;
181
- }
182
- }
183
- else {
184
- message = JSON.stringify(error);
185
- }
186
- return {
187
- errorType,
188
- message,
189
- };
190
- };
191
166
  if (event.request.headers['x-amz-user-agent']) {
192
167
  this.bedrockClient.middlewareStack.add((next) => (args) => {
193
168
  // @ts-expect-error Request is typed as unknown.
@@ -223,7 +198,7 @@ class BedrockConverseAdapter {
223
198
  this.clientToolByName.set(t.name, t);
224
199
  });
225
200
  if (duplicateTools.size > 0) {
226
- throw new Error(`Tools must have unique names. Duplicate tools: ${[
201
+ throw new errors_1.ValidationError(`Tools must have unique names. Duplicate tools: ${[
227
202
  ...duplicateTools,
228
203
  ].join(', ')}.`);
229
204
  }
@@ -233,6 +208,9 @@ class BedrockConverseAdapter {
233
208
  */
234
209
  async *askBedrockStreaming() {
235
210
  var _a, _b, _c, _d, _e, _f, _g, _h;
211
+ const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
212
+ const messages = await this.getEventMessagesAsBedrockMessages();
213
+ let bedrockResponse;
236
214
  // keep our own indexing for blocks instead of using Bedrock's indexes
237
215
  // since we stream subset of these upstream.
238
216
  let blockIndex = 0;
@@ -241,166 +219,150 @@ class BedrockConverseAdapter {
241
219
  // Accumulates client facing content per turn.
242
220
  // So that upstream can persist full message at the end of the streaming.
243
221
  const accumulatedTurnContent = [];
244
- try {
245
- const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
246
- const messages = await this.getEventMessagesAsBedrockMessages();
247
- let bedrockResponse;
248
- do {
249
- const toolConfig = this.createToolConfiguration();
250
- const converseCommandInput = {
251
- modelId,
252
- messages: [...messages],
253
- system: [{ text: systemPrompt }],
254
- inferenceConfig: inferenceConfiguration,
255
- toolConfig,
256
- };
257
- this.logger.info('Sending Bedrock Converse Stream request');
258
- this.logger.debug('Bedrock Converse Stream request:', converseCommandInput);
259
- bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseStreamCommand(converseCommandInput));
260
- this.logger.info(`Received Bedrock Converse Stream response, requestId=${bedrockResponse.$metadata.requestId}`);
261
- if (!bedrockResponse.stream) {
262
- throw new Error('Bedrock response is missing stream');
222
+ do {
223
+ const toolConfig = this.createToolConfiguration();
224
+ const converseCommandInput = {
225
+ modelId,
226
+ messages: [...messages],
227
+ system: [{ text: systemPrompt }],
228
+ inferenceConfig: inferenceConfiguration,
229
+ toolConfig,
230
+ };
231
+ this.logger.info('Sending Bedrock Converse Stream request');
232
+ this.logger.debug('Bedrock Converse Stream request:', converseCommandInput);
233
+ bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseStreamCommand(converseCommandInput));
234
+ this.logger.info(`Received Bedrock Converse Stream response, requestId=${bedrockResponse.$metadata.requestId}`);
235
+ if (!bedrockResponse.stream) {
236
+ throw new Error('Bedrock response is missing stream');
237
+ }
238
+ let toolUseBlock;
239
+ let clientToolsRequested = false;
240
+ let text = '';
241
+ let toolUseInput = '';
242
+ let blockDeltaIndex = 0;
243
+ let lastBlockDeltaIndex = 0;
244
+ // Accumulate current message for the tool use loop purpose.
245
+ const accumulatedAssistantMessage = {
246
+ role: undefined,
247
+ content: [],
248
+ };
249
+ for await (const chunk of bedrockResponse.stream) {
250
+ this.logger.debug('Bedrock Converse Stream response chunk:', chunk);
251
+ if (chunk.messageStart) {
252
+ accumulatedAssistantMessage.role = chunk.messageStart.role;
263
253
  }
264
- let toolUseBlock;
265
- let clientToolsRequested = false;
266
- let text = '';
267
- let toolUseInput = '';
268
- let blockDeltaIndex = 0;
269
- let lastBlockDeltaIndex = 0;
270
- // Accumulate current message for the tool use loop purpose.
271
- const accumulatedAssistantMessage = {
272
- role: undefined,
273
- content: [],
274
- };
275
- for await (const chunk of bedrockResponse.stream) {
276
- this.logger.debug('Bedrock Converse Stream response chunk:', chunk);
277
- if (chunk.messageStart) {
278
- accumulatedAssistantMessage.role = chunk.messageStart.role;
254
+ else if (chunk.contentBlockStart) {
255
+ blockDeltaIndex = 0;
256
+ lastBlockDeltaIndex = 0;
257
+ if ((_a = chunk.contentBlockStart.start) === null || _a === void 0 ? void 0 : _a.toolUse) {
258
+ toolUseBlock = {
259
+ toolUse: {
260
+ ...(_b = chunk.contentBlockStart.start) === null || _b === void 0 ? void 0 : _b.toolUse,
261
+ input: undefined,
262
+ },
263
+ };
279
264
  }
280
- else if (chunk.contentBlockStart) {
281
- blockDeltaIndex = 0;
282
- lastBlockDeltaIndex = 0;
283
- if ((_a = chunk.contentBlockStart.start) === null || _a === void 0 ? void 0 : _a.toolUse) {
284
- toolUseBlock = {
285
- toolUse: {
286
- ...(_b = chunk.contentBlockStart.start) === null || _b === void 0 ? void 0 : _b.toolUse,
287
- input: undefined,
288
- },
289
- };
265
+ }
266
+ else if (chunk.contentBlockDelta) {
267
+ if ((_c = chunk.contentBlockDelta.delta) === null || _c === void 0 ? void 0 : _c.toolUse) {
268
+ if (!chunk.contentBlockDelta.delta.toolUse.input) {
269
+ toolUseInput = '';
290
270
  }
271
+ toolUseInput += chunk.contentBlockDelta.delta.toolUse.input;
291
272
  }
292
- else if (chunk.contentBlockDelta) {
293
- if ((_c = chunk.contentBlockDelta.delta) === null || _c === void 0 ? void 0 : _c.toolUse) {
294
- if (!chunk.contentBlockDelta.delta.toolUse.input) {
295
- toolUseInput = '';
296
- }
297
- toolUseInput += chunk.contentBlockDelta.delta.toolUse.input;
298
- }
299
- else if ((_d = chunk.contentBlockDelta.delta) === null || _d === void 0 ? void 0 : _d.text) {
300
- text += chunk.contentBlockDelta.delta.text;
301
- yield {
302
- accumulatedTurnContent: [...accumulatedTurnContent, { text }],
303
- conversationId: this.event.conversationId,
304
- associatedUserMessageId: this.event.currentMessageId,
305
- contentBlockText: chunk.contentBlockDelta.delta.text,
306
- contentBlockIndex: blockIndex,
307
- contentBlockDeltaIndex: blockDeltaIndex,
308
- };
309
- lastBlockDeltaIndex = blockDeltaIndex;
310
- blockDeltaIndex++;
311
- }
273
+ else if ((_d = chunk.contentBlockDelta.delta) === null || _d === void 0 ? void 0 : _d.text) {
274
+ text += chunk.contentBlockDelta.delta.text;
275
+ yield {
276
+ accumulatedTurnContent: [...accumulatedTurnContent, { text }],
277
+ conversationId: this.event.conversationId,
278
+ associatedUserMessageId: this.event.currentMessageId,
279
+ contentBlockText: chunk.contentBlockDelta.delta.text,
280
+ contentBlockIndex: blockIndex,
281
+ contentBlockDeltaIndex: blockDeltaIndex,
282
+ };
283
+ lastBlockDeltaIndex = blockDeltaIndex;
284
+ blockDeltaIndex++;
312
285
  }
313
- else if (chunk.contentBlockStop) {
314
- if (toolUseBlock) {
315
- toolUseBlock.toolUse.input = JSON.parse(toolUseInput);
316
- (_e = accumulatedAssistantMessage.content) === null || _e === void 0 ? void 0 : _e.push(toolUseBlock);
317
- if (toolUseBlock.toolUse.name &&
318
- this.clientToolByName.has(toolUseBlock.toolUse.name)) {
319
- clientToolsRequested = true;
320
- accumulatedTurnContent.push(toolUseBlock);
321
- yield {
322
- accumulatedTurnContent: [...accumulatedTurnContent],
323
- conversationId: this.event.conversationId,
324
- associatedUserMessageId: this.event.currentMessageId,
325
- contentBlockIndex: blockIndex,
326
- contentBlockToolUse: JSON.stringify(toolUseBlock),
327
- };
328
- lastBlockIndex = blockIndex;
329
- blockIndex++;
330
- }
331
- toolUseBlock = undefined;
332
- toolUseInput = '';
333
- }
334
- else {
335
- (_f = accumulatedAssistantMessage.content) === null || _f === void 0 ? void 0 : _f.push({
336
- text,
337
- });
338
- accumulatedTurnContent.push({ text });
286
+ }
287
+ else if (chunk.contentBlockStop) {
288
+ if (toolUseBlock) {
289
+ toolUseBlock.toolUse.input = JSON.parse(toolUseInput);
290
+ (_e = accumulatedAssistantMessage.content) === null || _e === void 0 ? void 0 : _e.push(toolUseBlock);
291
+ if (toolUseBlock.toolUse.name &&
292
+ this.clientToolByName.has(toolUseBlock.toolUse.name)) {
293
+ clientToolsRequested = true;
294
+ accumulatedTurnContent.push(toolUseBlock);
339
295
  yield {
340
296
  accumulatedTurnContent: [...accumulatedTurnContent],
341
297
  conversationId: this.event.conversationId,
342
298
  associatedUserMessageId: this.event.currentMessageId,
343
299
  contentBlockIndex: blockIndex,
344
- contentBlockDoneAtIndex: lastBlockDeltaIndex,
300
+ contentBlockToolUse: JSON.stringify(toolUseBlock),
345
301
  };
346
- text = '';
347
302
  lastBlockIndex = blockIndex;
348
303
  blockIndex++;
349
304
  }
305
+ toolUseBlock = undefined;
306
+ toolUseInput = '';
350
307
  }
351
- else if (chunk.messageStop) {
352
- stopReason = (_g = chunk.messageStop.stopReason) !== null && _g !== void 0 ? _g : '';
308
+ else {
309
+ (_f = accumulatedAssistantMessage.content) === null || _f === void 0 ? void 0 : _f.push({
310
+ text,
311
+ });
312
+ accumulatedTurnContent.push({ text });
313
+ yield {
314
+ accumulatedTurnContent: [...accumulatedTurnContent],
315
+ conversationId: this.event.conversationId,
316
+ associatedUserMessageId: this.event.currentMessageId,
317
+ contentBlockIndex: blockIndex,
318
+ contentBlockDoneAtIndex: lastBlockDeltaIndex,
319
+ };
320
+ text = '';
321
+ lastBlockIndex = blockIndex;
322
+ blockIndex++;
353
323
  }
354
324
  }
355
- this.logger.debug('Accumulated Bedrock Converse Stream response:', accumulatedAssistantMessage);
356
- if (clientToolsRequested) {
357
- // For now if any of client tools is used we ignore executable tools
358
- // and propagate result back to client.
359
- yield {
360
- accumulatedTurnContent: [...accumulatedTurnContent],
361
- conversationId: this.event.conversationId,
362
- associatedUserMessageId: this.event.currentMessageId,
363
- contentBlockIndex: lastBlockIndex,
364
- stopReason: stopReason,
365
- };
366
- return;
325
+ else if (chunk.messageStop) {
326
+ stopReason = (_g = chunk.messageStop.stopReason) !== null && _g !== void 0 ? _g : '';
367
327
  }
368
- messages.push(accumulatedAssistantMessage);
369
- if (stopReason === 'tool_use') {
370
- const responseContentBlocks = (_h = accumulatedAssistantMessage.content) !== null && _h !== void 0 ? _h : [];
371
- const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
372
- const toolResponseContentBlocks = [];
373
- for (const responseContentBlock of toolUseBlocks) {
374
- const toolUseBlock = responseContentBlock;
375
- const toolResultContentBlock = await this.executeTool(toolUseBlock);
376
- toolResponseContentBlocks.push(toolResultContentBlock);
377
- }
378
- messages.push({
379
- role: 'user',
380
- content: toolResponseContentBlocks,
381
- });
328
+ }
329
+ this.logger.debug('Accumulated Bedrock Converse Stream response:', accumulatedAssistantMessage);
330
+ if (clientToolsRequested) {
331
+ // For now if any of client tools is used we ignore executable tools
332
+ // and propagate result back to client.
333
+ yield {
334
+ accumulatedTurnContent: [...accumulatedTurnContent],
335
+ conversationId: this.event.conversationId,
336
+ associatedUserMessageId: this.event.currentMessageId,
337
+ contentBlockIndex: lastBlockIndex,
338
+ stopReason: stopReason,
339
+ };
340
+ return;
341
+ }
342
+ messages.push(accumulatedAssistantMessage);
343
+ if (stopReason === 'tool_use') {
344
+ const responseContentBlocks = (_h = accumulatedAssistantMessage.content) !== null && _h !== void 0 ? _h : [];
345
+ const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
346
+ const toolResponseContentBlocks = [];
347
+ for (const responseContentBlock of toolUseBlocks) {
348
+ const toolUseBlock = responseContentBlock;
349
+ const toolResultContentBlock = await this.executeTool(toolUseBlock);
350
+ toolResponseContentBlocks.push(toolResultContentBlock);
382
351
  }
383
- } while (stopReason === 'tool_use');
384
- yield {
385
- accumulatedTurnContent: [...accumulatedTurnContent],
386
- conversationId: this.event.conversationId,
387
- associatedUserMessageId: this.event.currentMessageId,
388
- contentBlockIndex: lastBlockIndex,
389
- stopReason: stopReason,
390
- };
391
- }
392
- catch (error) {
393
- console.error('Streaming conversation with Bedrock failed', error);
394
- const conversationTurnError = this.convertErrorToConversationTurnError(error);
395
- yield {
396
- accumulatedTurnContent: [...accumulatedTurnContent],
397
- conversationId: this.event.conversationId,
398
- associatedUserMessageId: this.event.currentMessageId,
399
- contentBlockIndex: blockIndex,
400
- errors: [conversationTurnError],
401
- };
402
- }
352
+ messages.push({
353
+ role: 'user',
354
+ content: toolResponseContentBlocks,
355
+ });
356
+ }
357
+ } while (stopReason === 'tool_use');
358
+ yield {
359
+ accumulatedTurnContent: [...accumulatedTurnContent],
360
+ conversationId: this.event.conversationId,
361
+ associatedUserMessageId: this.event.currentMessageId,
362
+ contentBlockIndex: lastBlockIndex,
363
+ stopReason: stopReason,
364
+ };
403
365
  }
404
366
  }
405
367
  exports.BedrockConverseAdapter = BedrockConverseAdapter;
406
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9ja19jb252ZXJzZV9hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9ydW50aW1lL2JlZHJvY2tfY29udmVyc2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFheUM7QUFTekMsaUVBQTRFO0FBQzVFLHFHQUErRjtBQUcvRjs7O0dBR0c7QUFDSCxNQUFhLHNCQUFzQjtJQVFqQzs7T0FFRztJQUNILFlBQ21CLEtBQTRCLEVBQzdDLGVBQXNDLEVBQ3JCLGdCQUFzQyxJQUFJLDZDQUFvQixDQUM3RSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQzVDLEVBQ0Qsa0JBQWtCLEdBQUcsSUFBSSx5REFBa0MsQ0FBQyxLQUFLLENBQUMsRUFDakQsMEJBQTBCLElBQUksNEVBQW1DLENBQ2hGLEtBQUssQ0FDTixFQUNnQixTQUFTLE9BQU87O1FBVGhCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBRTVCLGtCQUFhLEdBQWIsYUFBYSxDQUU3QjtRQUVnQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBRXZDO1FBQ2dCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFqQmxCLHlCQUFvQixHQUNuQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ0sscUJBQWdCLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUM7UUErRDNFLGVBQVUsR0FBRyxLQUFLLElBQXVDLEVBQUU7O1lBQ3pELElBQUk7Z0JBQ0YsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsR0FDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztnQkFFaEMsTUFBTSxRQUFRLEdBQ1osTUFBTSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztnQkFFakQsSUFBSSxlQUFzQyxDQUFDO2dCQUMzQyxHQUFHO29CQUNELE1BQU0sVUFBVSxHQUFHLElBQUks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QkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUNaLElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRSx5QkFBeUI7cUJBQ25DLENBQUMsQ0FBQztpQkFDSjthQUNGLFFBQVEsVUFBVSxLQUFLLFVBQVUsRUFBRTtZQUVwQyxNQUFNO2dCQUNKLHNCQUFzQixFQUFFLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztnQkFDbkQsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztnQkFDekMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ3BELGlCQUFpQixFQUFFLGNBQWM7Z0JBQ2pDLFVBQVUsRUFBRSxVQUFVO2FBQ3ZCLENBQUM7U0FDSDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuRSxNQUFNLHFCQUFxQixHQUN6QixJQUFJLENBQUMsbUNBQW1DLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsTUFBTTtnQkFDSixzQkFBc0IsRUFBRSxDQUFDLEdBQUcsc0JBQXNCLENBQUM7Z0JBQ25ELGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7Z0JBQ3pDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO2dCQUNwRCxpQkFBaUIsRUFBRSxVQUFVO2dCQUM3QixNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQzthQUNoQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBeUhGO0FBbGNELHdEQWtjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlZHJvY2tSdW50aW1lQ2xpZW50LFxuICBDb250ZW50QmxvY2ssXG4gIENvbnZlcnNlQ29tbWFuZCxcbiAgQ29udmVyc2VDb21tYW5kSW5wdXQsXG4gIENvbnZlcnNlQ29tbWFuZE91dHB1dCxcbiAgQ29udmVyc2VTdHJlYW1Db21tYW5kLFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmRJbnB1dCxcbiAgQ29udmVyc2VTdHJlYW1Db21tYW5kT3V0cHV0LFxuICBNZXNzYWdlLFxuICBUb29sLFxuICBUb29sQ29uZmlndXJhdGlvbixcbiAgVG9vbElucHV0U2NoZW1hLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtYmVkcm9jay1ydW50aW1lJztcbmltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR1cm5FcnJvcixcbiAgQ29udmVyc2F0aW9uVHVybkV2ZW50LFxuICBDb252ZXJzYXRpb25UdXJuUmVzcG9uc2UsXG4gIEV4ZWN1dGFibGVUb29sLFxuICBTdHJlYW1pbmdSZXNwb25zZUNodW5rLFxuICBUb29sRGVmaW5pdGlvbixcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBDb252ZXJzYXRpb25UdXJuRXZlbnRUb29sc1Byb3ZpZGVyIH0gZnJvbSAnLi9ldmVudC10b29scy1wcm92aWRlcic7XG5pbXBvcnQgeyBDb252ZXJzYXRpb25NZXNzYWdlSGlzdG9yeVJldHJpZXZlciB9IGZyb20gJy4vY29udmVyc2F0aW9uX21lc3NhZ2VfaGlzdG9yeV9yZXRyaWV2ZXInO1xuaW1wb3J0ICogYXMgYmVkcm9jayBmcm9tICdAYXdzLXNkay9jbGllbnQtYmVkcm9jay1ydW50aW1lJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmFjdGluZyB3aXRoIEJlZHJvY2sgQ29udmVyc2UgQVBJXG4gKiBpbiBvcmRlciB0byBwcm9kdWNlIGZpbmFsIHJlc3BvbnNlIHRoYXQgY2FuIGJlIHNlbnQgYmFjayB0byBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBCZWRyb2NrQ29udmVyc2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxUb29sczogQXJyYXk8VG9vbERlZmluaXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGFibGVUb29sczogQXJyYXk8RXhlY3V0YWJsZVRvb2w+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xzOiBBcnJheTxUb29sRGVmaW5pdGlvbj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0YWJsZVRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIEV4ZWN1dGFibGVUb29sPiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIFRvb2xEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBCZWRyb2NrIENvbnZlcnNlIEFkYXB0ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50OiBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gICAgYWRkaXRpb25hbFRvb2xzOiBBcnJheTxFeGVjdXRhYmxlVG9vbD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBiZWRyb2NrQ2xpZW50OiBCZWRyb2NrUnVudGltZUNsaWVudCA9IG5ldyBCZWRyb2NrUnVudGltZUNsaWVudChcbiAgICAgIHsgcmVnaW9uOiBldmVudC5tb2RlbENvbmZpZ3VyYXRpb24ucmVnaW9uIH1cbiAgICApLFxuICAgIGV2ZW50VG9vbHNQcm92aWRlciA9IG5ldyBDb252ZXJzYXRpb25UdXJuRXZlbnRUb29sc1Byb3ZpZGVyKGV2ZW50KSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyID0gbmV3IENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyKFxuICAgICAgZXZlbnRcbiAgICApLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gY29uc29sZVxuICApIHtcbiAgICBpZiAoZXZlbnQucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J10pIHtcbiAgICAgIHRoaXMuYmVkcm9ja0NsaWVudC5taWRkbGV3YXJlU3RhY2suYWRkKFxuICAgICAgICAobmV4dCkgPT4gKGFyZ3MpID0+IHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFJlcXVlc3QgaXMgdHlwZWQgYXMgdW5rbm93bi5cbiAgICAgICAgICAvLyBCdXQgdGhpcyBpcyByZWNvbW1lbmRlZCB3YXkgdG8gYWx0ZXIgaGVhZGVycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzL2Jsb2IvbWFpbi9SRUFETUUubWQuXG4gICAgICAgICAgYXJncy5yZXF1ZXN0LmhlYWRlcnNbJ3gtYW16LXVzZXItYWdlbnQnXSA9XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0LmhlYWRlcnNbJ3gtYW16LXVzZXItYWdlbnQnXTtcbiAgICAgICAgICByZXR1cm4gbmV4dChhcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0ZXA6ICdidWlsZCcsXG4gICAgICAgICAgbmFtZTogJ2FtcGxpZnktdXNlci1hZ2VudC1pbmplY3RvcicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xzID0gW1xuICAgICAgLi4uZXZlbnRUb29sc1Byb3ZpZGVyLmdldEV2ZW50VG9vbHMoKSxcbiAgICAgIC4uLmFkZGl0aW9uYWxUb29scyxcbiAgICBdO1xuICAgIHRoaXMuY2xpZW50VG9vbHMgPSB0aGlzLmV2ZW50LnRvb2xzQ29uZmlndXJhdGlvbj8uY2xpZW50VG9vbHMgPz8gW107XG4gICAgdGhpcy5hbGxUb29scyA9IFsuLi50aGlzLmV4ZWN1dGFibGVUb29scywgLi4udGhpcy5jbGllbnRUb29sc107XG4gICAgY29uc3QgZHVwbGljYXRlVG9vbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmV4ZWN1dGFibGVUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbGllbnRUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsaWVudFRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsaWVudFRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgaWYgKGR1cGxpY2F0ZVRvb2xzLnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUb29scyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzLiBEdXBsaWNhdGUgdG9vbHM6ICR7W1xuICAgICAgICAgIC4uLmR1cGxpY2F0ZVRvb2xzLFxuICAgICAgICBdLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNrQmVkcm9jayA9IGFzeW5jICgpOiBQcm9taXNlPENvbnZlcnNhdGlvblR1cm5SZXNwb25zZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG1vZGVsSWQsIHN5c3RlbVByb21wdCwgaW5mZXJlbmNlQ29uZmlndXJhdGlvbiB9ID1cbiAgICAgICAgdGhpcy5ldmVudC5tb2RlbENvbmZpZ3VyYXRpb247XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VzOiBBcnJheTxNZXNzYWdlPiA9XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RXZlbnRNZXNzYWdlc0FzQmVkcm9ja01lc3NhZ2VzKCk7XG5cbiAgICAgIGxldCBiZWRyb2NrUmVzcG9uc2U6IENvbnZlcnNlQ29tbWFuZE91dHB1dDtcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgdG9vbENvbmZpZyA9IHRoaXMuY3JlYXRlVG9vbENvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgY29uc3QgY29udmVyc2VDb21tYW5kSW5wdXQ6IENvbnZlcnNlQ29tbWFuZElucHV0ID0ge1xuICAgICAgICAgIG1vZGVsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IFsuLi5tZXNzYWdlc10sXG4gICAgICAgICAgc3lzdGVtOiBbeyB0ZXh0OiBzeXN0ZW1Qcm9tcHQgfV0sXG4gICAgICAgICAgaW5mZXJlbmNlQ29uZmlnOiBpbmZlcmVuY2VDb25maWd1cmF0aW9uLFxuICAgICAgICAgIHRvb2xDb25maWcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1NlbmRpbmcgQmVkcm9jayBDb252ZXJzZSByZXF1ZXN0Jyk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdCZWRyb2NrIENvbnZlcnNlIHJlcXVlc3Q6JywgY29udmVyc2VDb21tYW5kSW5wdXQpO1xuICAgICAgICBiZWRyb2NrUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJlZHJvY2tDbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgQ29udmVyc2VDb21tYW5kKGNvbnZlcnNlQ29tbWFuZElucHV0KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBSZWNlaXZlZCBCZWRyb2NrIENvbnZlcnNlIHJlc3BvbnNlLCByZXF1ZXN0SWQ9JHtiZWRyb2NrUmVzcG9uc2UuJG1ldGFkYXRhLnJlcXVlc3RJZH1gLFxuICAgICAgICAgIGJlZHJvY2tSZXNwb25zZS51c2FnZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQmVkcm9jayBDb252ZXJzZSByZXNwb25zZTonLCBiZWRyb2NrUmVzcG9uc2UpO1xuICAgICAgICBpZiAoYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZSkge1xuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZHJvY2tSZXNwb25zZS5zdG9wUmVhc29uID09PSAndG9vbF91c2UnKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2tzID1cbiAgICAgICAgICAgIGJlZHJvY2tSZXNwb25zZS5vdXRwdXQ/Lm1lc3NhZ2U/LmNvbnRlbnQgPz8gW107XG4gICAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrcyA9IHJlc3BvbnNlQ29udGVudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgICAoYmxvY2spID0+ICd0b29sVXNlJyBpbiBibG9ja1xuICAgICAgICAgICkgYXMgQXJyYXk8Q29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI+O1xuICAgICAgICAgIGNvbnN0IGNsaWVudFRvb2xVc2VCbG9ja3MgPSByZXNwb25zZUNvbnRlbnRCbG9ja3MuZmlsdGVyKFxuICAgICAgICAgICAgKGJsb2NrKSA9PlxuICAgICAgICAgICAgICBibG9jay50b29sVXNlPy5uYW1lICYmXG4gICAgICAgICAgICAgIHRoaXMuY2xpZW50VG9vbEJ5TmFtZS5oYXMoYmxvY2sudG9vbFVzZT8ubmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjbGllbnRUb29sVXNlQmxvY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEZvciBub3cgaWYgYW55IG9mIGNsaWVudCB0b29scyBpcyB1c2VkIHdlIGlnbm9yZSBleGVjdXRhYmxlIHRvb2xzXG4gICAgICAgICAgICAvLyBhbmQgcHJvcGFnYXRlIHJlc3VsdCBiYWNrIHRvIGNsaWVudC5cbiAgICAgICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGNsaWVudFRvb2xVc2VCbG9ja3MgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrczogQXJyYXk8Q29udGVudEJsb2NrPiA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2sgb2YgdG9vbFVzZUJsb2Nrcykge1xuICAgICAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrID1cbiAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50QmxvY2sgYXMgQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI7XG4gICAgICAgICAgICBjb25zdCB0b29sUmVzdWx0Q29udGVudEJsb2NrID0gYXdhaXQgdGhpcy5leGVjdXRlVG9vbCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgICAgdG9vbFJlc3BvbnNlQ29udGVudEJsb2Nrcy5wdXNoKHRvb2xSZXN1bHRDb250ZW50QmxvY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKGJlZHJvY2tSZXNwb25zZS5zdG9wUmVhc29uID09PSAndG9vbF91c2UnKTtcblxuICAgICAgcmV0dXJuIHsgY29udGVudDogYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZT8uY29udGVudCA/PyBbXSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDb252ZXJzYXRpb24gd2l0aCBCZWRyb2NrIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvblR1cm5FcnJvciA9XG4gICAgICAgIHRoaXMuY29udmVydEVycm9yVG9Db252ZXJzYXRpb25UdXJuRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JzOiBbY29udmVyc2F0aW9uVHVybkVycm9yXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBc2tzIEJlZHJvY2sgZm9yIHJlc3BvbnNlIHVzaW5nIHN0cmVhbWluZyB2ZXJzaW9uIG9mIENvbnZlcnNlIEFQSS5cbiAgICovXG4gIGFzeW5jICphc2tCZWRyb2NrU3RyZWFtaW5nKCk6IEFzeW5jR2VuZXJhdG9yPFN0cmVhbWluZ1Jlc3BvbnNlQ2h1bms+IHtcbiAgICAvLyBrZWVwIG91ciBvd24gaW5kZXhpbmcgZm9yIGJsb2NrcyBpbnN0ZWFkIG9mIHVzaW5nIEJlZHJvY2sncyBpbmRleGVzXG4gICAgLy8gc2luY2Ugd2Ugc3RyZWFtIHN1YnNldCBvZiB0aGVzZSB1cHN0cmVhbS5cbiAgICBsZXQgYmxvY2tJbmRleCA9IDA7XG4gICAgbGV0IGxhc3RCbG9ja0luZGV4ID0gMDtcbiAgICBsZXQgc3RvcFJlYXNvbiA9ICcnO1xuICAgIC8vIEFjY3VtdWxhdGVzIGNsaWVudCBmYWNpbmcgY29udGVudCBwZXIgdHVybi5cbiAgICAvLyBTbyB0aGF0IHVwc3RyZWFtIGNhbiBwZXJzaXN0IGZ1bGwgbWVzc2FnZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW1pbmcuXG4gICAgY29uc3QgYWNjdW11bGF0ZWRUdXJuQ29udGVudDogQXJyYXk8YmVkcm9jay5Db250ZW50QmxvY2s+ID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBtb2RlbElkLCBzeXN0ZW1Qcm9tcHQsIGluZmVyZW5jZUNvbmZpZ3VyYXRpb24gfSA9XG4gICAgICAgIHRoaXMuZXZlbnQubW9kZWxDb25maWd1cmF0aW9uO1xuXG4gICAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPVxuICAgICAgICBhd2FpdCB0aGlzLmdldEV2ZW50TWVzc2FnZXNBc0JlZHJvY2tNZXNzYWdlcygpO1xuXG4gICAgICBsZXQgYmVkcm9ja1Jlc3BvbnNlOiBDb252ZXJzZVN0cmVhbUNvbW1hbmRPdXRwdXQ7XG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IHRvb2xDb25maWcgPSB0aGlzLmNyZWF0ZVRvb2xDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNlQ29tbWFuZElucHV0OiBDb252ZXJzZVN0cmVhbUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgICAgICBtb2RlbElkLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbLi4ubWVzc2FnZXNdLFxuICAgICAgICAgIHN5c3RlbTogW3sgdGV4dDogc3lzdGVtUHJvbXB0IH1dLFxuICAgICAgICAgIGluZmVyZW5jZUNvbmZpZzogaW5mZXJlbmNlQ29uZmlndXJhdGlvbixcbiAgICAgICAgICB0b29sQ29uZmlnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdTZW5kaW5nIEJlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlcXVlc3QnKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgJ0JlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlcXVlc3Q6JyxcbiAgICAgICAgICBjb252ZXJzZUNvbW1hbmRJbnB1dFxuICAgICAgICApO1xuICAgICAgICBiZWRyb2NrUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJlZHJvY2tDbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgQ29udmVyc2VTdHJlYW1Db21tYW5kKGNvbnZlcnNlQ29tbWFuZElucHV0KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBSZWNlaXZlZCBCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXNwb25zZSwgcmVxdWVzdElkPSR7YmVkcm9ja1Jlc3BvbnNlLiRtZXRhZGF0YS5yZXF1ZXN0SWR9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWJlZHJvY2tSZXNwb25zZS5zdHJlYW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JlZHJvY2sgcmVzcG9uc2UgaXMgbWlzc2luZyBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9vbFVzZUJsb2NrOiBDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNsaWVudFRvb2xzUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSAnJztcbiAgICAgICAgbGV0IHRvb2xVc2VJbnB1dDogc3RyaW5nID0gJyc7XG4gICAgICAgIGxldCBibG9ja0RlbHRhSW5kZXggPSAwO1xuICAgICAgICBsZXQgbGFzdEJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICAgIC8vIEFjY3VtdWxhdGUgY3VycmVudCBtZXNzYWdlIGZvciB0aGUgdG9vbCB1c2UgbG9vcCBwdXJwb3NlLlxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2U6IE1lc3NhZ2UgPSB7XG4gICAgICAgICAgcm9sZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbnRlbnQ6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYmVkcm9ja1Jlc3BvbnNlLnN0cmVhbSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXNwb25zZSBjaHVuazonLCBjaHVuayk7XG4gICAgICAgICAgaWYgKGNodW5rLm1lc3NhZ2VTdGFydCkge1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLnJvbGUgPSBjaHVuay5tZXNzYWdlU3RhcnQucm9sZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0YXJ0KSB7XG4gICAgICAgICAgICBibG9ja0RlbHRhSW5kZXggPSAwO1xuICAgICAgICAgICAgbGFzdEJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICAgICAgICBpZiAoY2h1bmsuY29udGVudEJsb2NrU3RhcnQuc3RhcnQ/LnRvb2xVc2UpIHtcbiAgICAgICAgICAgICAgdG9vbFVzZUJsb2NrID0ge1xuICAgICAgICAgICAgICAgIHRvb2xVc2U6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmNodW5rLmNvbnRlbnRCbG9ja1N0YXJ0LnN0YXJ0Py50b29sVXNlLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmsuY29udGVudEJsb2NrRGVsdGEpIHtcbiAgICAgICAgICAgIGlmIChjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YT8udG9vbFVzZSkge1xuICAgICAgICAgICAgICBpZiAoIWNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRvb2xVc2UuaW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0b29sVXNlSW5wdXQgPSAnJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0b29sVXNlSW5wdXQgKz0gY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudG9vbFVzZS5pbnB1dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGE/LnRleHQpIHtcbiAgICAgICAgICAgICAgdGV4dCArPSBjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YS50ZXh0O1xuICAgICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUdXJuQ29udGVudDogWy4uLmFjY3VtdWxhdGVkVHVybkNvbnRlbnQsIHsgdGV4dCB9XSxcbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRCbG9ja1RleHQ6IGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRleHQsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrRGVsdGFJbmRleDogYmxvY2tEZWx0YUluZGV4LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBsYXN0QmxvY2tEZWx0YUluZGV4ID0gYmxvY2tEZWx0YUluZGV4O1xuICAgICAgICAgICAgICBibG9ja0RlbHRhSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0b3ApIHtcbiAgICAgICAgICAgIGlmICh0b29sVXNlQmxvY2spIHtcbiAgICAgICAgICAgICAgdG9vbFVzZUJsb2NrLnRvb2xVc2UuaW5wdXQgPSBKU09OLnBhcnNlKHRvb2xVc2VJbnB1dCk7XG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZS5jb250ZW50Py5wdXNoKHRvb2xVc2VCbG9jayk7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyh0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbGllbnRUb29sc1JlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUdXJuQ29udGVudC5wdXNoKHRvb2xVc2VCbG9jayk7XG4gICAgICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUdXJuQ29udGVudDogWy4uLmFjY3VtdWxhdGVkVHVybkNvbnRlbnRdLFxuICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgICAgICBjb250ZW50QmxvY2tUb29sVXNlOiBKU09OLnN0cmluZ2lmeSh0b29sVXNlQmxvY2spLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGFzdEJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgICAgICAgICAgICAgIGJsb2NrSW5kZXgrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0b29sVXNlQmxvY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRvb2xVc2VJbnB1dCA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQ/LnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBhY2N1bXVsYXRlZFR1cm5Db250ZW50LnB1c2goeyB0ZXh0IH0pO1xuICAgICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUdXJuQ29udGVudDogWy4uLmFjY3VtdWxhdGVkVHVybkNvbnRlbnRdLFxuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrRG9uZUF0SW5kZXg6IGxhc3RCbG9ja0RlbHRhSW5kZXgsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRleHQgPSAnJztcbiAgICAgICAgICAgICAgbGFzdEJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgICAgICAgICAgICBibG9ja0luZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHVuay5tZXNzYWdlU3RvcCkge1xuICAgICAgICAgICAgc3RvcFJlYXNvbiA9IGNodW5rLm1lc3NhZ2VTdG9wLnN0b3BSZWFzb24gPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICdBY2N1bXVsYXRlZCBCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXNwb25zZTonLFxuICAgICAgICAgIGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZVxuICAgICAgICApO1xuICAgICAgICBpZiAoY2xpZW50VG9vbHNSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAvLyBGb3Igbm93IGlmIGFueSBvZiBjbGllbnQgdG9vbHMgaXMgdXNlZCB3ZSBpZ25vcmUgZXhlY3V0YWJsZSB0b29sc1xuICAgICAgICAgIC8vIGFuZCBwcm9wYWdhdGUgcmVzdWx0IGJhY2sgdG8gY2xpZW50LlxuICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIGFjY3VtdWxhdGVkVHVybkNvbnRlbnQ6IFsuLi5hY2N1bXVsYXRlZFR1cm5Db250ZW50XSxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBsYXN0QmxvY2tJbmRleCxcbiAgICAgICAgICAgIHN0b3BSZWFzb246IHN0b3BSZWFzb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZXMucHVzaChhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2UpO1xuICAgICAgICBpZiAoc3RvcFJlYXNvbiA9PT0gJ3Rvb2xfdXNlJykge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrcyA9XG4gICAgICAgICAgICBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2UuY29udGVudCA/PyBbXTtcbiAgICAgICAgICBjb25zdCB0b29sVXNlQmxvY2tzID0gcmVzcG9uc2VDb250ZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAgIChibG9jaykgPT4gJ3Rvb2xVc2UnIGluIGJsb2NrXG4gICAgICAgICAgKSBhcyBBcnJheTxDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlcj47XG4gICAgICAgICAgY29uc3QgdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrczogQXJyYXk8Q29udGVudEJsb2NrPiA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2sgb2YgdG9vbFVzZUJsb2Nrcykge1xuICAgICAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrID1cbiAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50QmxvY2sgYXMgQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI7XG4gICAgICAgICAgICBjb25zdCB0b29sUmVzdWx0Q29udGVudEJsb2NrID0gYXdhaXQgdGhpcy5leGVjdXRlVG9vbCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgICAgdG9vbFJlc3BvbnNlQ29udGVudEJsb2Nrcy5wdXNoKHRvb2xSZXN1bHRDb250ZW50QmxvY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKHN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpO1xuXG4gICAgICB5aWVsZCB7XG4gICAgICAgIGFjY3VtdWxhdGVkVHVybkNvbnRlbnQ6IFsuLi5hY2N1bXVsYXRlZFR1cm5Db250ZW50XSxcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBsYXN0QmxvY2tJbmRleCxcbiAgICAgICAgc3RvcFJlYXNvbjogc3RvcFJlYXNvbixcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0cmVhbWluZyBjb252ZXJzYXRpb24gd2l0aCBCZWRyb2NrIGZhaWxlZCcsIGVycm9yKTtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvblR1cm5FcnJvciA9XG4gICAgICAgIHRoaXMuY29udmVydEVycm9yVG9Db252ZXJzYXRpb25UdXJuRXJyb3IoZXJyb3IpO1xuICAgICAgeWllbGQge1xuICAgICAgICBhY2N1bXVsYXRlZFR1cm5Db250ZW50OiBbLi4uYWNjdW11bGF0ZWRUdXJuQ29udGVudF0sXG4gICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICBjb250ZW50QmxvY2tJbmRleDogYmxvY2tJbmRleCxcbiAgICAgICAgZXJyb3JzOiBbY29udmVyc2F0aW9uVHVybkVycm9yXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgZXZlbnQgbWVzc2FnZXMgdG8gQmVkcm9jayB0eXBlcy5cbiAgICogMS4gTWFrZXMgYSBjb3B5IHNvIHRoYXQgd2UgZG9uJ3QgbXV0YXRlIGV2ZW50LlxuICAgKiAyLiBEZWNvZGVzIEJhc2U2NCBlbmNvZGVkIGltYWdlcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0RXZlbnRNZXNzYWdlc0FzQmVkcm9ja01lc3NhZ2VzID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgQXJyYXk8TWVzc2FnZT5cbiAgPiA9PiB7XG4gICAgY29uc3QgbWVzc2FnZXM6IEFycmF5PE1lc3NhZ2U+ID0gW107XG4gICAgY29uc3QgZXZlbnRNZXNzYWdlcyA9XG4gICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyLmdldE1lc3NhZ2VIaXN0b3J5KCk7XG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGV2ZW50TWVzc2FnZXMpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50OiBBcnJheTxDb250ZW50QmxvY2s+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNvbnRlbnRFbGVtZW50IG9mIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnRFbGVtZW50LmltYWdlPy5zb3VyY2U/LmJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnB1c2goe1xuICAgICAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgICAgZm9ybWF0OiBjb250ZW50RWxlbWVudC5pbWFnZS5mb3JtYXQsXG4gICAgICAgICAgICAgIHNvdXJjZToge1xuICAgICAgICAgICAgICAgIGJ5dGVzOiBCdWZmZXIuZnJvbShjb250ZW50RWxlbWVudC5pbWFnZS5zb3VyY2UuYnl0ZXMsICdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHR5cGUgY29uZm9ybXMgdG8gQmVkcm9jaydzIHR5cGUgYW5kIGl0J3Mgc2FmZSB0byBjYXN0LlxuICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnB1c2goY29udGVudEVsZW1lbnQgYXMgQ29udGVudEJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgIHJvbGU6IG1lc3NhZ2Uucm9sZSxcbiAgICAgICAgY29udGVudDogbWVzc2FnZUNvbnRlbnQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VzO1xuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlVG9vbENvbmZpZ3VyYXRpb24gPSAoKTogVG9vbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0aGlzLmFsbFRvb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9vbHM6IHRoaXMuYWxsVG9vbHMubWFwKCh0KTogVG9vbCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9vbFNwZWM6IHtcbiAgICAgICAgICAgIG5hbWU6IHQubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBjYXN0IHRvIGJlZHJvY2sgdHlwZSBhcyB3ZSdyZSB1c2luZyBkaWZmZXJlbnQgdHlwZXMgdG8gZGVzY3JpYmUgSlNPTiBzY2hlbWEgaW4gb3VyIEFQSS5cbiAgICAgICAgICAgIC8vIFRoZXNlIHR5cGVzIGFyZSBydW50aW1lIGNvbXBhdGlibGUuXG4gICAgICAgICAgICBpbnB1dFNjaGVtYTogdC5pbnB1dFNjaGVtYSBhcyBUb29sSW5wdXRTY2hlbWEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG4gIH07XG5cbiAgcHJpdmF0ZSBleGVjdXRlVG9vbCA9IGFzeW5jIChcbiAgICB0b29sVXNlQmxvY2s6IENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyXG4gICk6IFByb21pc2U8Q29udGVudEJsb2NrPiA9PiB7XG4gICAgaWYgKCF0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKSB7XG4gICAgICB0aHJvdyBFcnJvcignQmVkcm9jayB0b29sIHVzZSByZXNwb25zZSBpcyBtaXNzaW5nIGEgdG9vbCBuYW1lJyk7XG4gICAgfVxuICAgIGNvbnN0IHRvb2wgPSB0aGlzLmV4ZWN1dGFibGVUb29sQnlOYW1lLmdldCh0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lKTtcbiAgICBpZiAoIXRvb2wpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQmVkcm9jayB0b29sIHVzZSByZXNwb25zZSBjb250YWlucyB1bmtub3duIHRvb2wgJyR7dG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZX0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEludm9raW5nIHRvb2wgJHt0b29sLm5hbWV9YCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnVG9vbCBpbnB1dDonLCB0b29sVXNlQmxvY2sudG9vbFVzZS5pbnB1dCk7XG4gICAgICBjb25zdCB0b29sUmVzcG9uc2UgPSBhd2FpdCB0b29sLmV4ZWN1dGUodG9vbFVzZUJsb2NrLnRvb2xVc2UuaW5wdXQpO1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgUmVjZWl2ZWQgcmVzcG9uc2UgZnJvbSAke3Rvb2wubmFtZX0gdG9vbGApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcodG9vbFJlc3BvbnNlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VCbG9jay50b29sVXNlLnRvb2xVc2VJZCxcbiAgICAgICAgICBjb250ZW50OiBbdG9vbFJlc3BvbnNlXSxcbiAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICAgIHRvb2xVc2VJZDogdG9vbFVzZUJsb2NrLnRvb2xVc2UudG9vbFVzZUlkLFxuICAgICAgICAgICAgY29udGVudDogW3sgdGV4dDogZS50b1N0cmluZygpIH1dLFxuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b29sUmVzdWx0OiB7XG4gICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgY29udGVudDogW3sgdGV4dDogJ3Vua25vd24gZXJyb3Igb2NjdXJyZWQnIH1dLFxuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgY29udmVydEVycm9yVG9Db252ZXJzYXRpb25UdXJuRXJyb3IgPSAoXG4gICAgZXJyb3I6IHVua25vd25cbiAgKTogQ29udmVyc2F0aW9uVHVybkVycm9yID0+IHtcbiAgICBsZXQgZXJyb3JUeXBlID0gJ1Vua25vd25FcnJvcic7XG4gICAgbGV0IG1lc3NhZ2U6IHN0cmluZztcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICBpZiAoZXJyb3IubmFtZSkge1xuICAgICAgICBlcnJvclR5cGUgPSBlcnJvci5uYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JUeXBlLFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuICB9O1xufVxuIl19
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9ja19jb252ZXJzZV9hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9ydW50aW1lL2JlZHJvY2tfY29udmVyc2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFheUM7QUFPekMsaUVBQTRFO0FBQzVFLHFHQUErRjtBQUUvRixxQ0FBMkM7QUFFM0M7OztHQUdHO0FBQ0gsTUFBYSxzQkFBc0I7SUFRakM7O09BRUc7SUFDSCxZQUNtQixLQUE0QixFQUM3QyxlQUFzQyxFQUNyQixnQkFBc0MsSUFBSSw2Q0FBb0IsQ0FDN0UsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUM1QyxFQUNELGtCQUFrQixHQUFHLElBQUkseURBQWtDLENBQUMsS0FBSyxDQUFDLEVBQ2pELDBCQUEwQixJQUFJLDRFQUFtQyxDQUNoRixLQUFLLENBQ04sRUFDZ0IsU0FBUyxPQUFPOztRQVRoQixVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUU1QixrQkFBYSxHQUFiLGFBQWEsQ0FFN0I7UUFFZ0IsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUV2QztRQUNnQixXQUFNLEdBQU4sTUFBTSxDQUFVO1FBakJsQix5QkFBb0IsR0FDbkMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNLLHFCQUFnQixHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBK0QzRSxlQUFVLEdBQUcsS0FBSyxJQUE2QixFQUFFOztZQUMvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxHQUNyRCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1lBRWhDLE1BQU0sUUFBUSxHQUNaLE1BQU0sSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7WUFFakQsSUFBSSxlQUFzQyxDQUFDO1lBQzNDLEdBQUc7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxD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LEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUNPLENBQUM7Z0JBQ3ZDLE1BQU0seUJBQXlCLEdBQXdCLEVBQUUsQ0FBQztnQkFDMUQsS0FBSyxNQUFNLG9CQUFvQixJQUFJLGFBQWEsRUFBRTtvQkFDaEQsTUFBTSxZQUFZLEdBQ2hCLG9CQUFrRCxDQUFDO29CQUNyRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDcEUseUJBQXlCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7aUJBQ3hEO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osSUFBSSxFQUFFLE1BQU07b0JBQ1osT0FBTyxFQUFFLHlCQUF5QjtpQkFDbkMsQ0FBQyxDQUFDO2FBQ0o7U0FDRixRQUFRLFVBQVUsS0FBSyxVQUFVLEVBQUU7UUFFcEMsTUFBTTtZQUNKLHNCQUFzQixFQUFFLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztZQUNuRCxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjO1lBQ3pDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1lBQ3BELGlCQUFpQixFQUFFLGNBQWM7WUFDakMsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztJQUNKLENBQUM7Q0FzR0Y7QUF2WkQsd0RBdVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmVkcm9ja1J1bnRpbWVDbGllbnQsXG4gIENvbnRlbnRCbG9jayxcbiAgQ29udmVyc2VDb21tYW5kLFxuICBDb252ZXJzZUNvbW1hbmRJbnB1dCxcbiAgQ29udmVyc2VDb21tYW5kT3V0cHV0LFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmQsXG4gIENvbnZlcnNlU3RyZWFtQ29tbWFuZElucHV0LFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmRPdXRwdXQsXG4gIE1lc3NhZ2UsXG4gIFRvb2wsXG4gIFRvb2xDb25maWd1cmF0aW9uLFxuICBUb29sSW5wdXRTY2hlbWEsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1iZWRyb2NrLXJ1bnRpbWUnO1xuaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHVybkV2ZW50LFxuICBFeGVjdXRhYmxlVG9vbCxcbiAgU3RyZWFtaW5nUmVzcG9uc2VDaHVuayxcbiAgVG9vbERlZmluaXRpb24sXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uVHVybkV2ZW50VG9vbHNQcm92aWRlciB9IGZyb20gJy4vZXZlbnQtdG9vbHMtcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uTWVzc2FnZUhpc3RvcnlSZXRyaWV2ZXIgfSBmcm9tICcuL2NvbnZlcnNhdGlvbl9tZXNzYWdlX2hpc3RvcnlfcmV0cmlldmVyJztcbmltcG9ydCAqIGFzIGJlZHJvY2sgZnJvbSAnQGF3cy1zZGsvY2xpZW50LWJlZHJvY2stcnVudGltZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBCZWRyb2NrIENvbnZlcnNlIEFQSVxuICogaW4gb3JkZXIgdG8gcHJvZHVjZSBmaW5hbCByZXNwb25zZSB0aGF0IGNhbiBiZSBzZW50IGJhY2sgdG8gY2FsbGVyLlxuICovXG5leHBvcnQgY2xhc3MgQmVkcm9ja0NvbnZlcnNlQWRhcHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsVG9vbHM6IEFycmF5PFRvb2xEZWZpbml0aW9uPjtcbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRhYmxlVG9vbHM6IEFycmF5PEV4ZWN1dGFibGVUb29sPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRUb29sczogQXJyYXk8VG9vbERlZmluaXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGFibGVUb29sQnlOYW1lOiBNYXA8c3RyaW5nLCBFeGVjdXRhYmxlVG9vbD4gPVxuICAgIG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnRUb29sQnlOYW1lOiBNYXA8c3RyaW5nLCBUb29sRGVmaW5pdGlvbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgQmVkcm9jayBDb252ZXJzZSBBZGFwdGVyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudDogQ29udmVyc2F0aW9uVHVybkV2ZW50LFxuICAgIGFkZGl0aW9uYWxUb29sczogQXJyYXk8RXhlY3V0YWJsZVRvb2w+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYmVkcm9ja0NsaWVudDogQmVkcm9ja1J1bnRpbWVDbGllbnQgPSBuZXcgQmVkcm9ja1J1bnRpbWVDbGllbnQoXG4gICAgICB7IHJlZ2lvbjogZXZlbnQubW9kZWxDb25maWd1cmF0aW9uLnJlZ2lvbiB9XG4gICAgKSxcbiAgICBldmVudFRvb2xzUHJvdmlkZXIgPSBuZXcgQ29udmVyc2F0aW9uVHVybkV2ZW50VG9vbHNQcm92aWRlcihldmVudCksXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlSGlzdG9yeVJldHJpZXZlciA9IG5ldyBDb252ZXJzYXRpb25NZXNzYWdlSGlzdG9yeVJldHJpZXZlcihcbiAgICAgIGV2ZW50XG4gICAgKSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGNvbnNvbGVcbiAgKSB7XG4gICAgaWYgKGV2ZW50LnJlcXVlc3QuaGVhZGVyc1sneC1hbXotdXNlci1hZ2VudCddKSB7XG4gICAgICB0aGlzLmJlZHJvY2tDbGllbnQubWlkZGxld2FyZVN0YWNrLmFkZChcbiAgICAgICAgKG5leHQpID0+IChhcmdzKSA9PiB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBSZXF1ZXN0IGlzIHR5cGVkIGFzIHVua25vd24uXG4gICAgICAgICAgLy8gQnV0IHRoaXMgaXMgcmVjb21tZW5kZWQgd2F5IHRvIGFsdGVyIGhlYWRlcnMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLXNkay1qcy12My9ibG9iL21haW4vUkVBRE1FLm1kLlxuICAgICAgICAgIGFyZ3MucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J10gPVxuICAgICAgICAgICAgZXZlbnQucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J107XG4gICAgICAgICAgcmV0dXJuIG5leHQoYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGVwOiAnYnVpbGQnLFxuICAgICAgICAgIG5hbWU6ICdhbXBsaWZ5LXVzZXItYWdlbnQtaW5qZWN0b3InLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmV4ZWN1dGFibGVUb29scyA9IFtcbiAgICAgIC4uLmV2ZW50VG9vbHNQcm92aWRlci5nZXRFdmVudFRvb2xzKCksXG4gICAgICAuLi5hZGRpdGlvbmFsVG9vbHMsXG4gICAgXTtcbiAgICB0aGlzLmNsaWVudFRvb2xzID0gdGhpcy5ldmVudC50b29sc0NvbmZpZ3VyYXRpb24/LmNsaWVudFRvb2xzID8/IFtdO1xuICAgIHRoaXMuYWxsVG9vbHMgPSBbLi4udGhpcy5leGVjdXRhYmxlVG9vbHMsIC4uLnRoaXMuY2xpZW50VG9vbHNdO1xuICAgIGNvbnN0IGR1cGxpY2F0ZVRvb2xzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5leGVjdXRhYmxlVG9vbHMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGFibGVUb29sQnlOYW1lLnNldCh0Lm5hbWUsIHQpO1xuICAgIH0pO1xuICAgIHRoaXMuY2xpZW50VG9vbHMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyh0Lm5hbWUpKSB7XG4gICAgICAgIGR1cGxpY2F0ZVRvb2xzLmFkZCh0Lm5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLnNldCh0Lm5hbWUsIHQpO1xuICAgIH0pO1xuICAgIGlmIChkdXBsaWNhdGVUb29scy5zaXplID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYFRvb2xzIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMuIER1cGxpY2F0ZSB0b29sczogJHtbXG4gICAgICAgICAgLi4uZHVwbGljYXRlVG9vbHMsXG4gICAgICAgIF0uam9pbignLCAnKX0uYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc2tCZWRyb2NrID0gYXN5bmMgKCk6IFByb21pc2U8Q29udGVudEJsb2NrW10+ID0+IHtcbiAgICBjb25zdCB7IG1vZGVsSWQsIHN5c3RlbVByb21wdCwgaW5mZXJlbmNlQ29uZmlndXJhdGlvbiB9ID1cbiAgICAgIHRoaXMuZXZlbnQubW9kZWxDb25maWd1cmF0aW9uO1xuXG4gICAgY29uc3QgbWVzc2FnZXM6IEFycmF5PE1lc3NhZ2U+ID1cbiAgICAgIGF3YWl0IHRoaXMuZ2V0RXZlbnRNZXNzYWdlc0FzQmVkcm9ja01lc3NhZ2VzKCk7XG5cbiAgICBsZXQgYmVkcm9ja1Jlc3BvbnNlOiBDb252ZXJzZUNvbW1hbmRPdXRwdXQ7XG4gICAgZG8ge1xuICAgICAgY29uc3QgdG9vbENvbmZpZyA9IHRoaXMuY3JlYXRlVG9vbENvbmZpZ3VyYXRpb24oKTtcbiAgICAgIGNvbnN0IGNvbnZlcnNlQ29tbWFuZElucHV0OiBDb252ZXJzZUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgICAgbW9kZWxJZCxcbiAgICAgICAgbWVzc2FnZXM6IFsuLi5tZXNzYWdlc10sXG4gICAgICAgIHN5c3RlbTogW3sgdGV4dDogc3lzdGVtUHJvbXB0IH1dLFxuICAgICAgICBpbmZlcmVuY2VDb25maWc6IGluZmVyZW5jZUNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHRvb2xDb25maWcsXG4gICAgICB9O1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnU2VuZGluZyBCZWRyb2NrIENvbnZlcnNlIHJlcXVlc3QnKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdCZWRyb2NrIENvbnZlcnNlIHJlcXVlc3Q6JywgY29udmVyc2VDb21tYW5kSW5wdXQpO1xuICAgICAgYmVkcm9ja1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iZWRyb2NrQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBDb252ZXJzZUNvbW1hbmQoY29udmVyc2VDb21tYW5kSW5wdXQpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFJlY2VpdmVkIEJlZHJvY2sgQ29udmVyc2UgcmVzcG9uc2UsIHJlcXVlc3RJZD0ke2JlZHJvY2tSZXNwb25zZS4kbWV0YWRhdGEucmVxdWVzdElkfWAsXG4gICAgICAgIGJlZHJvY2tSZXNwb25zZS51c2FnZVxuICAgICAgKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdCZWRyb2NrIENvbnZlcnNlIHJlc3BvbnNlOicsIGJlZHJvY2tSZXNwb25zZSk7XG4gICAgICBpZiAoYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlcy5wdXNoKGJlZHJvY2tSZXNwb25zZS5vdXRwdXQ/Lm1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKGJlZHJvY2tSZXNwb25zZS5zdG9wUmVhc29uID09PSAndG9vbF91c2UnKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrcyA9XG4gICAgICAgICAgYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZT8uY29udGVudCA/PyBbXTtcbiAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrcyA9IHJlc3BvbnNlQ29udGVudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PiAndG9vbFVzZScgaW4gYmxvY2tcbiAgICAgICAgKSBhcyBBcnJheTxDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlcj47XG4gICAgICAgIGNvbnN0IGNsaWVudFRvb2xVc2VCbG9ja3MgPSByZXNwb25zZUNvbnRlbnRCbG9ja3MuZmlsdGVyKFxuICAgICAgICAgIChibG9jaykgPT5cbiAgICAgICAgICAgIGJsb2NrLnRvb2xVc2U/Lm5hbWUgJiZcbiAgICAgICAgICAgIHRoaXMuY2xpZW50VG9vbEJ5TmFtZS5oYXMoYmxvY2sudG9vbFVzZT8ubmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNsaWVudFRvb2xVc2VCbG9ja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIEZvciBub3cgaWYgYW55IG9mIGNsaWVudCB0b29scyBpcyB1c2VkIHdlIGlnbm9yZSBleGVjdXRhYmxlIHRvb2xzXG4gICAgICAgICAgLy8gYW5kIHByb3BhZ2F0ZSByZXN1bHQgYmFjayB0byBjbGllbnQuXG4gICAgICAgICAgcmV0dXJuIGNsaWVudFRvb2xVc2VCbG9ja3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrczogQXJyYXk8Q29udGVudEJsb2NrPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrIG9mIHRvb2xVc2VCbG9ja3MpIHtcbiAgICAgICAgICBjb25zdCB0b29sVXNlQmxvY2sgPVxuICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50QmxvY2sgYXMgQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI7XG4gICAgICAgICAgY29uc3QgdG9vbFJlc3VsdENvbnRlbnRCbG9jayA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRvb2wodG9vbFVzZUJsb2NrKTtcbiAgICAgICAgICB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzLnB1c2godG9vbFJlc3VsdENvbnRlbnRCbG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgcm9sZTogJ3VzZXInLFxuICAgICAgICAgIGNvbnRlbnQ6IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGJlZHJvY2tSZXNwb25zZS5zdG9wUmVhc29uID09PSAndG9vbF91c2UnKTtcblxuICAgIHJldHVybiBiZWRyb2NrUmVzcG9uc2Uub3V0cHV0Py5tZXNzYWdlPy5jb250ZW50ID8/IFtdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBc2tzIEJlZHJvY2sgZm9yIHJlc3BvbnNlIHVzaW5nIHN0cmVhbWluZyB2ZXJzaW9uIG9mIENvbnZlcnNlIEFQSS5cbiAgICovXG4gIGFzeW5jICphc2tCZWRyb2NrU3RyZWFtaW5nKCk6IEFzeW5jR2VuZXJhdG9yPFN0cmVhbWluZ1Jlc3BvbnNlQ2h1bms+IHtcbiAgICBjb25zdCB7IG1vZGVsSWQsIHN5c3RlbVByb21wdCwgaW5mZXJlbmNlQ29uZmlndXJhdGlvbiB9ID1cbiAgICAgIHRoaXMuZXZlbnQubW9kZWxDb25maWd1cmF0aW9uO1xuXG4gICAgY29uc3QgbWVzc2FnZXM6IEFycmF5PE1lc3NhZ2U+ID1cbiAgICAgIGF3YWl0IHRoaXMuZ2V0RXZlbnRNZXNzYWdlc0FzQmVkcm9ja01lc3NhZ2VzKCk7XG5cbiAgICBsZXQgYmVkcm9ja1Jlc3BvbnNlOiBDb252ZXJzZVN0cmVhbUNvbW1hbmRPdXRwdXQ7XG4gICAgLy8ga2VlcCBvdXIgb3duIGluZGV4aW5nIGZvciBibG9ja3MgaW5zdGVhZCBvZiB1c2luZyBCZWRyb2NrJ3MgaW5kZXhlc1xuICAgIC8vIHNpbmNlIHdlIHN0cmVhbSBzdWJzZXQgb2YgdGhlc2UgdXBzdHJlYW0uXG4gICAgbGV0IGJsb2NrSW5kZXggPSAwO1xuICAgIGxldCBsYXN0QmxvY2tJbmRleCA9IDA7XG4gICAgbGV0IHN0b3BSZWFzb24gPSAnJztcbiAgICAvLyBBY2N1bXVsYXRlcyBjbGllbnQgZmFjaW5nIGNvbnRlbnQgcGVyIHR1cm4uXG4gICAgLy8gU28gdGhhdCB1cHN0cmVhbSBjYW4gcGVyc2lzdCBmdWxsIG1lc3NhZ2UgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtaW5nLlxuICAgIGNvbnN0IGFjY3VtdWxhdGVkVHVybkNvbnRlbnQ6IEFycmF5PGJlZHJvY2suQ29udGVudEJsb2NrPiA9IFtdO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHRvb2xDb25maWcgPSB0aGlzLmNyZWF0ZVRvb2xDb25maWd1cmF0aW9uKCk7XG4gICAgICBjb25zdCBjb252ZXJzZUNvbW1hbmRJbnB1dDogQ29udmVyc2VTdHJlYW1Db21tYW5kSW5wdXQgPSB7XG4gICAgICAgIG1vZGVsSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBbLi4ubWVzc2FnZXNdLFxuICAgICAgICBzeXN0ZW06IFt7IHRleHQ6IHN5c3RlbVByb21wdCB9XSxcbiAgICAgICAgaW5mZXJlbmNlQ29uZmlnOiBpbmZlcmVuY2VDb25maWd1cmF0aW9uLFxuICAgICAgICB0b29sQ29uZmlnLFxuICAgICAgfTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1NlbmRpbmcgQmVkcm9jayBDb252ZXJzZSBTdHJlYW0gcmVxdWVzdCcpO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICdCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXF1ZXN0OicsXG4gICAgICAgIGNvbnZlcnNlQ29tbWFuZElucHV0XG4gICAgICApO1xuICAgICAgYmVkcm9ja1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iZWRyb2NrQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBDb252ZXJzZVN0cmVhbUNvbW1hbmQoY29udmVyc2VDb21tYW5kSW5wdXQpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFJlY2VpdmVkIEJlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlc3BvbnNlLCByZXF1ZXN0SWQ9JHtiZWRyb2NrUmVzcG9uc2UuJG1ldGFkYXRhLnJlcXVlc3RJZH1gXG4gICAgICApO1xuICAgICAgaWYgKCFiZWRyb2NrUmVzcG9uc2Uuc3RyZWFtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQmVkcm9jayByZXNwb25zZSBpcyBtaXNzaW5nIHN0cmVhbScpO1xuICAgICAgfVxuICAgICAgbGV0IHRvb2xVc2VCbG9jazogQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2xpZW50VG9vbHNSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSAnJztcbiAgICAgIGxldCB0b29sVXNlSW5wdXQ6IHN0cmluZyA9ICcnO1xuICAgICAgbGV0IGJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICBsZXQgbGFzdEJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICAvLyBBY2N1bXVsYXRlIGN1cnJlbnQgbWVzc2FnZSBmb3IgdGhlIHRvb2wgdXNlIGxvb3AgcHVycG9zZS5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZTogTWVzc2FnZSA9IHtcbiAgICAgICAgcm9sZTogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZW50OiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgYmVkcm9ja1Jlc3BvbnNlLnN0cmVhbSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQmVkcm9jayBDb252ZXJzZSBTdHJlYW0gcmVzcG9uc2UgY2h1bms6JywgY2h1bmspO1xuICAgICAgICBpZiAoY2h1bmsubWVzc2FnZVN0YXJ0KSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLnJvbGUgPSBjaHVuay5tZXNzYWdlU3RhcnQucm9sZTtcbiAgICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tTdGFydCkge1xuICAgICAgICAgIGJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICAgICAgbGFzdEJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgICAgICAgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0YXJ0LnN0YXJ0Py50b29sVXNlKSB7XG4gICAgICAgICAgICB0b29sVXNlQmxvY2sgPSB7XG4gICAgICAgICAgICAgIHRvb2xVc2U6IHtcbiAgICAgICAgICAgICAgICAuLi5jaHVuay5jb250ZW50QmxvY2tTdGFydC5zdGFydD8udG9vbFVzZSxcbiAgICAgICAgICAgICAgICBpbnB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY2h1bmsuY29udGVudEJsb2NrRGVsdGEpIHtcbiAgICAgICAgICBpZiAoY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGE/LnRvb2xVc2UpIHtcbiAgICAgICAgICAgIGlmICghY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudG9vbFVzZS5pbnB1dCkge1xuICAgICAgICAgICAgICB0b29sVXNlSW5wdXQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvb2xVc2VJbnB1dCArPSBjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YS50b29sVXNlLmlucHV0O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGE/LnRleHQpIHtcbiAgICAgICAgICAgIHRleHQgKz0gY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudGV4dDtcbiAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUdXJuQ29udGVudDogWy4uLmFjY3VtdWxhdGVkVHVybkNvbnRlbnQsIHsgdGV4dCB9XSxcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgIGNvbnRlbnRCbG9ja1RleHQ6IGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRleHQsXG4gICAgICAgICAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBibG9ja0luZGV4LFxuICAgICAgICAgICAgICBjb250ZW50QmxvY2tEZWx0YUluZGV4OiBibG9ja0RlbHRhSW5kZXgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGFzdEJsb2NrRGVsdGFJbmRleCA9IGJsb2NrRGVsdGFJbmRleDtcbiAgICAgICAgICAgIGJsb2NrRGVsdGFJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tTdG9wKSB7XG4gICAgICAgICAgaWYgKHRvb2xVc2VCbG9jaykge1xuICAgICAgICAgICAgdG9vbFVzZUJsb2NrLnRvb2xVc2UuaW5wdXQgPSBKU09OLnBhcnNlKHRvb2xVc2VJbnB1dCk7XG4gICAgICAgICAgICBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2UuY29udGVudD8ucHVzaCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lICYmXG4gICAgICAgICAgICAgIHRoaXMuY2xpZW50VG9vbEJ5TmFtZS5oYXModG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjbGllbnRUb29sc1JlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkVHVybkNvbnRlbnQucHVzaCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRUdXJuQ29udGVudDogWy4uLmFjY3VtdWxhdGVkVHVybkNvbnRlbnRdLFxuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrVG9vbFVzZTogSlNPTi5zdHJpbmdpZnkodG9vbFVzZUJsb2NrKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGFzdEJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgICAgICAgICAgICBibG9ja0luZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b29sVXNlQmxvY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0b29sVXNlSW5wdXQgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQ/LnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhY2N1bXVsYXRlZFR1cm5Db250ZW50LnB1c2goeyB0ZXh0IH0pO1xuICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICBhY2N1bXVsYXRlZFR1cm5Db250ZW50OiBbLi4uYWNjdW11bGF0ZWRUdXJuQ29udGVudF0sXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICBjb250ZW50QmxvY2tJbmRleDogYmxvY2tJbmRleCxcbiAgICAgICAgICAgICAgY29udGVudEJsb2NrRG9uZUF0SW5kZXg6IGxhc3RCbG9ja0RlbHRhSW5kZXgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGV4dCA9ICcnO1xuICAgICAgICAgICAgbGFzdEJsb2NrSW5kZXggPSBibG9ja0luZGV4O1xuICAgICAgICAgICAgYmxvY2tJbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaHVuay5tZXNzYWdlU3RvcCkge1xuICAgICAgICAgIHN0b3BSZWFzb24gPSBjaHVuay5tZXNzYWdlU3RvcC5zdG9wUmVhc29uID8/ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ0FjY3VtdWxhdGVkIEJlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlc3BvbnNlOicsXG4gICAgICAgIGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZVxuICAgICAgKTtcbiAgICAgIGlmIChjbGllbnRUb29sc1JlcXVlc3RlZCkge1xuICAgICAgICAvLyBGb3Igbm93IGlmIGFueSBvZiBjbGllbnQgdG9vbHMgaXMgdXNlZCB3ZSBpZ25vcmUgZXhlY3V0YWJsZSB0b29sc1xuICAgICAgICAvLyBhbmQgcHJvcGFnYXRlIHJlc3VsdCBiYWNrIHRvIGNsaWVudC5cbiAgICAgICAgeWllbGQge1xuICAgICAgICAgIGFjY3VtdWxhdGVkVHVybkNvbnRlbnQ6IFsuLi5hY2N1bXVsYXRlZFR1cm5Db250ZW50XSxcbiAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBsYXN0QmxvY2tJbmRleCxcbiAgICAgICAgICBzdG9wUmVhc29uOiBzdG9wUmVhc29uLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBtZXNzYWdlcy5wdXNoKGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZSk7XG4gICAgICBpZiAoc3RvcFJlYXNvbiA9PT0gJ3Rvb2xfdXNlJykge1xuICAgICAgICBjb25zdCByZXNwb25zZUNvbnRlbnRCbG9ja3MgPSBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2UuY29udGVudCA/PyBbXTtcbiAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrcyA9IHJlc3BvbnNlQ29udGVudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PiAndG9vbFVzZScgaW4gYmxvY2tcbiAgICAgICAgKSBhcyBBcnJheTxDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlcj47XG4gICAgICAgIGNvbnN0IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3M6IEFycmF5PENvbnRlbnRCbG9jaz4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZUNvbnRlbnRCbG9jayBvZiB0b29sVXNlQmxvY2tzKSB7XG4gICAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrID1cbiAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudEJsb2NrIGFzIENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyO1xuICAgICAgICAgIGNvbnN0IHRvb2xSZXN1bHRDb250ZW50QmxvY2sgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUb29sKHRvb2xVc2VCbG9jayk7XG4gICAgICAgICAgdG9vbFJlc3BvbnNlQ29udGVudEJsb2Nrcy5wdXNoKHRvb2xSZXN1bHRDb250ZW50QmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgICBjb250ZW50OiB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChzdG9wUmVhc29uID09PSAndG9vbF91c2UnKTtcblxuICAgIHlpZWxkIHtcbiAgICAgIGFjY3VtdWxhdGVkVHVybkNvbnRlbnQ6IFsuLi5hY2N1bXVsYXRlZFR1cm5Db250ZW50XSxcbiAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBsYXN0QmxvY2tJbmRleCxcbiAgICAgIHN0b3BSZWFzb246IHN0b3BSZWFzb24sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGV2ZW50IG1lc3NhZ2VzIHRvIEJlZHJvY2sgdHlwZXMuXG4gICAqIDEuIE1ha2VzIGEgY29weSBzbyB0aGF0IHdlIGRvbid0IG11dGF0ZSBldmVudC5cbiAgICogMi4gRGVjb2RlcyBCYXNlNjQgZW5jb2RlZCBpbWFnZXMuXG4gICAqL1xuICBwcml2YXRlIGdldEV2ZW50TWVzc2FnZXNBc0JlZHJvY2tNZXNzYWdlcyA9IGFzeW5jICgpOiBQcm9taXNlPFxuICAgIEFycmF5PE1lc3NhZ2U+XG4gID4gPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBBcnJheTxNZXNzYWdlPiA9IFtdO1xuICAgIGNvbnN0IGV2ZW50TWVzc2FnZXMgPVxuICAgICAgYXdhaXQgdGhpcy5tZXNzYWdlSGlzdG9yeVJldHJpZXZlci5nZXRNZXNzYWdlSGlzdG9yeSgpO1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBldmVudE1lc3NhZ2VzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlQ29udGVudDogQXJyYXk8Q29udGVudEJsb2NrPiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjb250ZW50RWxlbWVudCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50RWxlbWVudC5pbWFnZT8uc291cmNlPy5ieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBtZXNzYWdlQ29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICAgIGZvcm1hdDogY29udGVudEVsZW1lbnQuaW1hZ2UuZm9ybWF0LFxuICAgICAgICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBieXRlczogQnVmZmVyLmZyb20oY29udGVudEVsZW1lbnQuaW1hZ2Uuc291cmNlLmJ5dGVzLCAnYmFzZTY0JyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSB0eXBlIGNvbmZvcm1zIHRvIEJlZHJvY2sncyB0eXBlIGFuZCBpdCdzIHNhZmUgdG8gY2FzdC5cbiAgICAgICAgICBtZXNzYWdlQ29udGVudC5wdXNoKGNvbnRlbnRFbGVtZW50IGFzIENvbnRlbnRCbG9jayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICByb2xlOiBtZXNzYWdlLnJvbGUsXG4gICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2VDb250ZW50LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlcztcbiAgfTtcblxuICBwcml2YXRlIGNyZWF0ZVRvb2xDb25maWd1cmF0aW9uID0gKCk6IFRvb2xDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodGhpcy5hbGxUb29scy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvb2xzOiB0aGlzLmFsbFRvb2xzLm1hcCgodCk6IFRvb2wgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRvb2xTcGVjOiB7XG4gICAgICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2FzdCB0byBiZWRyb2NrIHR5cGUgYXMgd2UncmUgdXNpbmcgZGlmZmVyZW50IHR5cGVzIHRvIGRlc2NyaWJlIEpTT04gc2NoZW1hIGluIG91ciBBUEkuXG4gICAgICAgICAgICAvLyBUaGVzZSB0eXBlcyBhcmUgcnVudGltZSBjb21wYXRpYmxlLlxuICAgICAgICAgICAgaW5wdXRTY2hlbWE6IHQuaW5wdXRTY2hlbWEgYXMgVG9vbElucHV0U2NoZW1hLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9O1xuICB9O1xuXG4gIHByaXZhdGUgZXhlY3V0ZVRvb2wgPSBhc3luYyAoXG4gICAgdG9vbFVzZUJsb2NrOiBDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlclxuICApOiBQcm9taXNlPENvbnRlbnRCbG9jaz4gPT4ge1xuICAgIGlmICghdG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0JlZHJvY2sgdG9vbCB1c2UgcmVzcG9uc2UgaXMgbWlzc2luZyBhIHRvb2wgbmFtZScpO1xuICAgIH1cbiAgICBjb25zdCB0b29sID0gdGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5nZXQodG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZSk7XG4gICAgaWYgKCF0b29sKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEJlZHJvY2sgdG9vbCB1c2UgcmVzcG9uc2UgY29udGFpbnMgdW5rbm93biB0b29sICcke3Rvb2xVc2VCbG9jay50b29sVXNlLm5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKGBJbnZva2luZyB0b29sICR7dG9vbC5uYW1lfWApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1Rvb2wgaW5wdXQ6JywgdG9vbFVzZUJsb2NrLnRvb2xVc2UuaW5wdXQpO1xuICAgICAgY29uc3QgdG9vbFJlc3BvbnNlID0gYXdhaXQgdG9vbC5leGVjdXRlKHRvb2xVc2VCbG9jay50b29sVXNlLmlucHV0KTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFJlY2VpdmVkIHJlc3BvbnNlIGZyb20gJHt0b29sLm5hbWV9IHRvb2xgKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKHRvb2xSZXNwb25zZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b29sUmVzdWx0OiB7XG4gICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgY29udGVudDogW3Rvb2xSZXNwb25zZV0sXG4gICAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b29sUmVzdWx0OiB7XG4gICAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VCbG9jay50b29sVXNlLnRvb2xVc2VJZCxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7IHRleHQ6IGUudG9TdHJpbmcoKSB9XSxcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbFJlc3VsdDoge1xuICAgICAgICAgIHRvb2xVc2VJZDogdG9vbFVzZUJsb2NrLnRvb2xVc2UudG9vbFVzZUlkLFxuICAgICAgICAgIGNvbnRlbnQ6IFt7IHRleHQ6ICd1bmtub3duIGVycm9yIG9jY3VycmVkJyB9XSxcbiAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==