@airtable/blocks 1.8.0 → 1.10.0-experimental-48096ae-20211116

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 (304) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/cjs/color_utils.js +2 -1
  3. package/dist/cjs/colors.js +2 -1
  4. package/dist/cjs/error_utils.js +19 -1
  5. package/dist/cjs/event_tracker.js +2 -1
  6. package/dist/cjs/global_config.js +2 -1
  7. package/dist/cjs/index.js +2 -1
  8. package/dist/cjs/injected/airtable_interface.js +2 -1
  9. package/dist/cjs/models/abstract_model.js +2 -1
  10. package/dist/cjs/models/abstract_model_with_async_data.js +2 -1
  11. package/dist/cjs/models/base.js +18 -6
  12. package/dist/cjs/models/create_aggregators.js +2 -1
  13. package/dist/cjs/models/cursor.js +4 -1
  14. package/dist/cjs/models/field.js +148 -28
  15. package/dist/cjs/models/grouped_record_query_result.js +7 -15
  16. package/dist/cjs/models/linked_records_query_result.js +77 -28
  17. package/dist/cjs/models/models.js +2 -1
  18. package/dist/cjs/models/mutation_constants.js +5 -2
  19. package/dist/cjs/models/mutations.js +69 -177
  20. package/dist/cjs/models/object_pool.js +2 -1
  21. package/dist/cjs/models/query_manager.js +328 -0
  22. package/dist/cjs/models/record.js +310 -56
  23. package/dist/cjs/models/record_coloring.js +2 -1
  24. package/dist/cjs/models/record_query_result.js +6 -2
  25. package/dist/cjs/models/record_store.js +556 -766
  26. package/dist/cjs/models/session.js +2 -1
  27. package/dist/cjs/models/table.js +24 -14
  28. package/dist/cjs/models/table_or_view_query_result.js +482 -415
  29. package/dist/cjs/models/view.js +2 -1
  30. package/dist/cjs/models/view_data_store.js +245 -296
  31. package/dist/cjs/models/view_metadata_query_result.js +2 -1
  32. package/dist/cjs/perform_record_action.js +2 -1
  33. package/dist/cjs/private_utils.js +52 -1
  34. package/dist/cjs/sdk.js +13 -2
  35. package/dist/cjs/settings_button.js +2 -1
  36. package/dist/cjs/stats/block_stats.js +2 -1
  37. package/dist/cjs/testing/abstract_mock_airtable_interface.js +367 -0
  38. package/dist/cjs/types/aggregators.js +2 -1
  39. package/dist/cjs/types/airtable_interface.js +2 -1
  40. package/dist/cjs/types/attachment.js +2 -1
  41. package/dist/cjs/types/backend_fetch_types.js +2 -1
  42. package/dist/cjs/types/base.js +2 -1
  43. package/dist/cjs/types/block.js +2 -1
  44. package/dist/cjs/types/block_query_spec.js +86 -0
  45. package/dist/cjs/types/collaborator.js +2 -1
  46. package/dist/cjs/types/cursor.js +2 -1
  47. package/dist/cjs/types/field.js +2 -1
  48. package/dist/cjs/types/global_config.js +2 -1
  49. package/dist/cjs/types/mutations.js +3 -1
  50. package/dist/cjs/types/permission_levels.js +2 -1
  51. package/dist/cjs/types/record.js +2 -1
  52. package/dist/cjs/types/record_action_data.js +2 -1
  53. package/dist/cjs/types/stat.js +2 -1
  54. package/dist/cjs/types/table.js +2 -1
  55. package/dist/cjs/types/undo_redo.js +2 -1
  56. package/dist/cjs/types/view.js +2 -1
  57. package/dist/cjs/types/viewport.js +2 -1
  58. package/dist/cjs/ui/base_provider.js +2 -1
  59. package/dist/cjs/ui/baymax_utils.js +2 -1
  60. package/dist/cjs/ui/block_wrapper.js +2 -1
  61. package/dist/cjs/ui/box.js +2 -1
  62. package/dist/cjs/ui/button.js +2 -1
  63. package/dist/cjs/ui/cell_renderer.js +2 -1
  64. package/dist/cjs/ui/choice_token.js +2 -1
  65. package/dist/cjs/ui/collaborator_token.js +2 -1
  66. package/dist/cjs/ui/color_palette.js +2 -1
  67. package/dist/cjs/ui/color_palette_synced.js +2 -1
  68. package/dist/cjs/ui/confirmation_dialog.js +2 -1
  69. package/dist/cjs/ui/control_sizes.js +2 -1
  70. package/dist/cjs/ui/create_detect_element_resize.js +2 -1
  71. package/dist/cjs/ui/css_helpers.js +2 -1
  72. package/dist/cjs/ui/dialog.js +2 -1
  73. package/dist/cjs/ui/dialog_close_button.js +2 -1
  74. package/dist/cjs/ui/expand_record.js +2 -1
  75. package/dist/cjs/ui/expand_record_list.js +2 -1
  76. package/dist/cjs/ui/expand_record_picker_async.js +2 -1
  77. package/dist/cjs/ui/field_icon.js +2 -1
  78. package/dist/cjs/ui/field_picker.js +2 -1
  79. package/dist/cjs/ui/field_picker_synced.js +2 -1
  80. package/dist/cjs/ui/form_field.js +2 -1
  81. package/dist/cjs/ui/geometry/geometry.js +2 -1
  82. package/dist/cjs/ui/geometry/point.js +2 -1
  83. package/dist/cjs/ui/geometry/rect.js +2 -1
  84. package/dist/cjs/ui/geometry/size.js +2 -1
  85. package/dist/cjs/ui/global_alert.js +2 -1
  86. package/dist/cjs/ui/global_config_synced_component_helpers.js +2 -1
  87. package/dist/cjs/ui/heading.js +2 -1
  88. package/dist/cjs/ui/icon.js +2 -1
  89. package/dist/cjs/ui/icon_config.js +6 -3
  90. package/dist/cjs/ui/initialize_block.js +2 -1
  91. package/dist/cjs/ui/input.js +2 -1
  92. package/dist/cjs/ui/input_synced.js +2 -1
  93. package/dist/cjs/ui/key_codes.js +2 -1
  94. package/dist/cjs/ui/label.js +2 -1
  95. package/dist/cjs/ui/link.js +2 -1
  96. package/dist/cjs/ui/loader.js +2 -1
  97. package/dist/cjs/ui/modal.js +2 -1
  98. package/dist/cjs/ui/model_picker_select.js +2 -1
  99. package/dist/cjs/ui/popover.js +2 -1
  100. package/dist/cjs/ui/progress_bar.js +2 -1
  101. package/dist/cjs/ui/record_card.js +2 -1
  102. package/dist/cjs/ui/record_card_list.js +2 -1
  103. package/dist/cjs/ui/remote_utils.js +2 -1
  104. package/dist/cjs/ui/sdk_context.js +2 -1
  105. package/dist/cjs/ui/select.js +2 -1
  106. package/dist/cjs/ui/select_and_select_buttons_helpers.js +2 -1
  107. package/dist/cjs/ui/select_buttons.js +2 -1
  108. package/dist/cjs/ui/select_buttons_synced.js +2 -1
  109. package/dist/cjs/ui/select_synced.js +2 -1
  110. package/dist/cjs/ui/switch.js +2 -1
  111. package/dist/cjs/ui/switch_synced.js +2 -1
  112. package/dist/cjs/ui/synced.js +2 -1
  113. package/dist/cjs/ui/system/all_styles_set.js +2 -1
  114. package/dist/cjs/ui/system/appearance/appearance_set.js +2 -1
  115. package/dist/cjs/ui/system/appearance/background_color.js +2 -1
  116. package/dist/cjs/ui/system/appearance/border.js +2 -1
  117. package/dist/cjs/ui/system/appearance/border_radius.js +2 -1
  118. package/dist/cjs/ui/system/appearance/box_shadow.js +2 -1
  119. package/dist/cjs/ui/system/appearance/opacity.js +2 -1
  120. package/dist/cjs/ui/system/dimensions/dimensions_set.js +2 -1
  121. package/dist/cjs/ui/system/dimensions/height.js +2 -1
  122. package/dist/cjs/ui/system/dimensions/max_height.js +2 -1
  123. package/dist/cjs/ui/system/dimensions/max_width.js +2 -1
  124. package/dist/cjs/ui/system/dimensions/min_height.js +2 -1
  125. package/dist/cjs/ui/system/dimensions/min_width.js +2 -1
  126. package/dist/cjs/ui/system/dimensions/width.js +2 -1
  127. package/dist/cjs/ui/system/display.js +2 -1
  128. package/dist/cjs/ui/system/flex_container/align_content.js +2 -1
  129. package/dist/cjs/ui/system/flex_container/align_items.js +2 -1
  130. package/dist/cjs/ui/system/flex_container/flex_container_set.js +2 -1
  131. package/dist/cjs/ui/system/flex_container/flex_direction.js +2 -1
  132. package/dist/cjs/ui/system/flex_container/flex_wrap.js +2 -1
  133. package/dist/cjs/ui/system/flex_container/justify_content.js +2 -1
  134. package/dist/cjs/ui/system/flex_container/justify_items.js +2 -1
  135. package/dist/cjs/ui/system/flex_item/align_self.js +2 -1
  136. package/dist/cjs/ui/system/flex_item/flex.js +2 -1
  137. package/dist/cjs/ui/system/flex_item/flex_basis.js +2 -1
  138. package/dist/cjs/ui/system/flex_item/flex_grow.js +2 -1
  139. package/dist/cjs/ui/system/flex_item/flex_item_set.js +2 -1
  140. package/dist/cjs/ui/system/flex_item/flex_shrink.js +2 -1
  141. package/dist/cjs/ui/system/flex_item/justify_self.js +2 -1
  142. package/dist/cjs/ui/system/flex_item/order.js +2 -1
  143. package/dist/cjs/ui/system/index.js +2 -1
  144. package/dist/cjs/ui/system/overflow.js +2 -1
  145. package/dist/cjs/ui/system/position/bottom.js +2 -1
  146. package/dist/cjs/ui/system/position/left.js +2 -1
  147. package/dist/cjs/ui/system/position/position.js +2 -1
  148. package/dist/cjs/ui/system/position/position_set.js +2 -1
  149. package/dist/cjs/ui/system/position/right.js +2 -1
  150. package/dist/cjs/ui/system/position/top.js +2 -1
  151. package/dist/cjs/ui/system/position/z_index.js +2 -1
  152. package/dist/cjs/ui/system/spacing/margin.js +2 -1
  153. package/dist/cjs/ui/system/spacing/padding.js +2 -1
  154. package/dist/cjs/ui/system/spacing/spacing_set.js +2 -1
  155. package/dist/cjs/ui/system/typography/font_family.js +2 -1
  156. package/dist/cjs/ui/system/typography/font_size.js +2 -1
  157. package/dist/cjs/ui/system/typography/font_style.js +2 -1
  158. package/dist/cjs/ui/system/typography/font_weight.js +2 -1
  159. package/dist/cjs/ui/system/typography/letter_spacing.js +2 -1
  160. package/dist/cjs/ui/system/typography/line_height.js +2 -1
  161. package/dist/cjs/ui/system/typography/text_align.js +2 -1
  162. package/dist/cjs/ui/system/typography/text_color.js +2 -1
  163. package/dist/cjs/ui/system/typography/text_decoration.js +2 -1
  164. package/dist/cjs/ui/system/typography/text_transform.js +2 -1
  165. package/dist/cjs/ui/system/typography/typography_set.js +2 -1
  166. package/dist/cjs/ui/system/utils/create_responsive_prop_type.js +2 -1
  167. package/dist/cjs/ui/system/utils/create_style_prop_types.js +2 -1
  168. package/dist/cjs/ui/system/utils/csstype.js +2 -1
  169. package/dist/cjs/ui/system/utils/ensure_numbers_are_within_scale.js +2 -1
  170. package/dist/cjs/ui/system/utils/get_style_props_for_responsive_prop.js +2 -1
  171. package/dist/cjs/ui/system/utils/types.js +2 -1
  172. package/dist/cjs/ui/table_picker.js +2 -1
  173. package/dist/cjs/ui/table_picker_synced.js +2 -1
  174. package/dist/cjs/ui/text.js +2 -1
  175. package/dist/cjs/ui/text_button.js +2 -1
  176. package/dist/cjs/ui/theme/default_theme/button_variants.js +2 -1
  177. package/dist/cjs/ui/theme/default_theme/control_sizes.js +2 -1
  178. package/dist/cjs/ui/theme/default_theme/heading_styles.js +2 -1
  179. package/dist/cjs/ui/theme/default_theme/index.js +2 -1
  180. package/dist/cjs/ui/theme/default_theme/input_variants.js +2 -1
  181. package/dist/cjs/ui/theme/default_theme/link_variants.js +2 -1
  182. package/dist/cjs/ui/theme/default_theme/select_buttons_variants.js +2 -1
  183. package/dist/cjs/ui/theme/default_theme/select_variants.js +2 -1
  184. package/dist/cjs/ui/theme/default_theme/switch_variants.js +2 -1
  185. package/dist/cjs/ui/theme/default_theme/text_button_variants.js +2 -1
  186. package/dist/cjs/ui/theme/default_theme/text_styles.js +2 -1
  187. package/dist/cjs/ui/theme/default_theme/tokens.js +2 -1
  188. package/dist/cjs/ui/theme/theme_context.js +2 -1
  189. package/dist/cjs/ui/theme/use_theme.js +2 -1
  190. package/dist/cjs/ui/tooltip.js +2 -1
  191. package/dist/cjs/ui/types/aria_props.js +2 -1
  192. package/dist/cjs/ui/types/data_attributes_prop.js +2 -1
  193. package/dist/cjs/ui/types/tooltip_anchor_props.js +2 -1
  194. package/dist/cjs/ui/ui.js +2 -1
  195. package/dist/cjs/ui/unstable_standalone_ui.js +2 -1
  196. package/dist/cjs/ui/use_array_identity.js +2 -1
  197. package/dist/cjs/ui/use_base.js +2 -1
  198. package/dist/cjs/ui/use_cursor.js +2 -1
  199. package/dist/cjs/ui/use_form_field.js +2 -1
  200. package/dist/cjs/ui/use_global_config.js +3 -2
  201. package/dist/cjs/ui/use_loadable.js +2 -1
  202. package/dist/cjs/ui/use_record_action_data.js +2 -1
  203. package/dist/cjs/ui/use_records.js +7 -2
  204. package/dist/cjs/ui/use_session.js +2 -1
  205. package/dist/cjs/ui/use_settings_button.js +2 -1
  206. package/dist/cjs/ui/use_styled_system.js +2 -1
  207. package/dist/cjs/ui/use_synced.js +2 -1
  208. package/dist/cjs/ui/use_text_color_for_background_color.js +2 -1
  209. package/dist/cjs/ui/use_view_metadata.js +2 -1
  210. package/dist/cjs/ui/use_viewport.js +2 -1
  211. package/dist/cjs/ui/use_watchable.js +2 -1
  212. package/dist/cjs/ui/view_picker.js +2 -1
  213. package/dist/cjs/ui/view_picker_synced.js +2 -1
  214. package/dist/cjs/ui/viewport_constraint.js +2 -1
  215. package/dist/cjs/ui/with_hooks.js +2 -1
  216. package/dist/cjs/ui/with_styled_system.js +2 -1
  217. package/dist/cjs/undo_redo.js +2 -1
  218. package/dist/cjs/unstable_private_utils.js +2 -1
  219. package/dist/cjs/unstable_testing_utils.js +3 -2
  220. package/dist/cjs/viewport.js +2 -1
  221. package/dist/cjs/warning.js +2 -1
  222. package/dist/cjs/watchable.js +125 -72
  223. package/dist/types/src/models/base.d.ts +10 -3
  224. package/dist/types/src/models/base.d.ts.map +1 -1
  225. package/dist/types/src/models/cursor.d.ts +2 -0
  226. package/dist/types/src/models/cursor.d.ts.map +1 -1
  227. package/dist/types/src/models/field.d.ts +65 -1
  228. package/dist/types/src/models/field.d.ts.map +1 -1
  229. package/dist/types/src/models/grouped_record_query_result.d.ts +3 -3
  230. package/dist/types/src/models/grouped_record_query_result.d.ts.map +1 -1
  231. package/dist/types/src/models/linked_records_query_result.d.ts.map +1 -1
  232. package/dist/types/src/models/mutation_constants.d.ts +1 -0
  233. package/dist/types/src/models/mutation_constants.d.ts.map +1 -1
  234. package/dist/types/src/models/mutations.d.ts.map +1 -1
  235. package/dist/types/src/models/query_manager.d.ts +2 -0
  236. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  237. package/dist/types/src/models/record.d.ts +12 -3
  238. package/dist/types/src/models/record.d.ts.map +1 -1
  239. package/dist/types/src/models/record_query_result.d.ts +3 -2
  240. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  241. package/dist/types/src/models/record_store.d.ts.map +1 -1
  242. package/dist/types/src/models/table.d.ts +8 -4
  243. package/dist/types/src/models/table.d.ts.map +1 -1
  244. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  245. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  246. package/dist/types/src/models/view_data_store.d.ts +0 -1
  247. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  248. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  249. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  250. package/dist/types/src/private_utils.d.ts +30 -1
  251. package/dist/types/src/private_utils.d.ts.map +1 -1
  252. package/dist/types/src/sdk.d.ts.map +1 -1
  253. package/dist/types/src/testing/{mock_airtable_interface.d.ts → abstract_mock_airtable_interface.d.ts} +20 -15
  254. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -0
  255. package/dist/types/src/types/airtable_interface.d.ts +48 -20
  256. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  257. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  258. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  259. package/dist/types/src/types/field.d.ts +80 -44
  260. package/dist/types/src/types/field.d.ts.map +1 -1
  261. package/dist/types/src/types/mutations.d.ts +31 -3
  262. package/dist/types/src/types/mutations.d.ts.map +1 -1
  263. package/dist/types/src/types/table.d.ts +0 -2
  264. package/dist/types/src/types/table.d.ts.map +1 -1
  265. package/dist/types/src/types/view.d.ts +3 -8
  266. package/dist/types/src/types/view.d.ts.map +1 -1
  267. package/dist/types/src/ui/cell_renderer.d.ts +1 -1
  268. package/dist/types/src/ui/color_palette.d.ts +1 -1
  269. package/dist/types/src/ui/control_sizes.d.ts +1 -1
  270. package/dist/types/src/ui/field_icon.d.ts +1 -1
  271. package/dist/types/src/ui/heading.d.ts +1 -1
  272. package/dist/types/src/ui/icon.d.ts +1 -1
  273. package/dist/types/src/ui/icon_config.d.ts +33 -31
  274. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  275. package/dist/types/src/ui/input.d.ts +10 -10
  276. package/dist/types/src/ui/link.d.ts +1 -1
  277. package/dist/types/src/ui/link.d.ts.map +1 -1
  278. package/dist/types/src/ui/record_card.d.ts +1 -1
  279. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
  280. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
  281. package/dist/types/src/ui/text.d.ts +1 -1
  282. package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
  283. package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
  284. package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
  285. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  286. package/dist/types/src/unstable_testing_utils.d.ts +1 -1
  287. package/dist/types/src/unstable_testing_utils.d.ts.map +1 -1
  288. package/dist/types/src/watchable.d.ts.map +1 -1
  289. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +121 -0
  290. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -0
  291. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts +2 -2
  292. package/dist/types/test/airtable_interface_mocks/linked_records.d.ts.map +1 -1
  293. package/dist/types/test/airtable_interface_mocks/{mock_airtable_interface_internal.d.ts → mock_airtable_interface.d.ts} +26 -18
  294. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -0
  295. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  296. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  297. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts +2 -2
  298. package/dist/types/test/airtable_interface_mocks/project_tracker.d.ts.map +1 -1
  299. package/dist/types/test/test_helpers.d.ts +2 -0
  300. package/dist/types/test/test_helpers.d.ts.map +1 -1
  301. package/package.json +2 -1
  302. package/dist/cjs/testing/mock_airtable_interface.js +0 -317
  303. package/dist/types/src/testing/mock_airtable_interface.d.ts.map +0 -1
  304. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface_internal.d.ts.map +0 -1
@@ -89,6 +89,7 @@ var WatchableCursorKeys = Object.freeze({
89
89
  * return (
90
90
  * <div>
91
91
  * Active table: {cursor.activeTableId}
92
+ * <br />
92
93
  * Active view: {cursor.activeViewId}
93
94
  * </div>
94
95
  * );
@@ -109,6 +110,7 @@ var WatchableCursorKeys = Object.freeze({
109
110
  * return (
110
111
  * <div>
111
112
  * Selected records: {cursor.selectedRecordIds.join(', ')}
113
+ * <br />
112
114
  * Selected fields: {cursor.selectedFieldIds.join(', ')}
113
115
  * </div>
114
116
  * );
@@ -466,4 +468,5 @@ function (_AbstractModelWithAsy) {
466
468
 
467
469
  (0, _defineProperty2.default)(Cursor, "_className", 'Cursor');
468
470
  var _default = Cursor;
469
- exports.default = _default;
471
+ exports.default = _default;
472
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvY3Vyc29yLnRzIl0sIm5hbWVzIjpbIldhdGNoYWJsZUN1cnNvcktleXMiLCJPYmplY3QiLCJmcmVlemUiLCJzZWxlY3RlZFJlY29yZElkcyIsInNlbGVjdGVkRmllbGRJZHMiLCJhY3RpdmVUYWJsZUlkIiwiYWN0aXZlVmlld0lkIiwiaXNEYXRhTG9hZGVkIiwiQ3Vyc29yIiwia2V5Iiwic2RrIiwiYmFzZURhdGEiLCJfX2FpcnRhYmxlSW50ZXJmYWNlIiwic2RrSW5pdERhdGEiLCJzZWxlY3RlZFJlY29yZElkU2V0IiwiY3Vyc29yRGF0YSIsInNlbGVjdGVkRmllbGRJZFNldCIsImFjdGl2ZVRhYmxlIiwidGFibGVzQnlJZCIsIl9jdXJzb3JEYXRhIiwic2VhbCIsIl9vbkNoYW5nZSIsIl9zZGsiLCJmZXRjaEFuZFN1YnNjcmliZVRvQ3Vyc29yRGF0YUFzeW5jIiwidW5zdWJzY3JpYmVGcm9tQ3Vyc29yRGF0YSIsInJlY29yZE9yUmVjb3JkSWQiLCJfZGF0YSIsInJlY29yZElkIiwiUmVjb3JkIiwiaWQiLCJ0YWJsZU9yVGFibGVJZCIsInRhYmxlSWQiLCJUYWJsZSIsInNldEFjdGl2ZVZpZXdPclRhYmxlIiwidmlld09yVmlld0lkIiwidmlld0lkIiwiVmlldyIsImNoYW5nZXMiLCJjaGFuZ2VkS2V5cyIsInBhdGgiLCJ2YWx1ZSIsImxlbmd0aCIsImRpZENoYW5nZSIsImtleXMiLCJBYnN0cmFjdE1vZGVsV2l0aEFzeW5jRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFaQTs7QUFBK0M7QUFjL0MsSUFBTUEsbUJBQW1CLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQ3RDQyxFQUFBQSxpQkFBaUIsRUFBRSxtQkFEbUI7QUFFdENDLEVBQUFBLGdCQUFnQixFQUFFLGtCQUZvQjtBQUd0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Ozs7Ozs7Ozs7O3dCQVVrQztBQUM5QixhQUFPLEtBQUtxQixLQUFMLENBQVdwQixZQUFsQjtBQUNIOzs7RUF4SWdCc0MsdUM7OzhCQUFmcEMsTSxnQkFFa0IsUTtlQTJPVEEsTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbW9kdWxlIEBhaXJ0YWJsZS9ibG9ja3MvbW9kZWxzOiBDdXJzb3IgKi8gLyoqICovXG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge01vZGVsQ2hhbmdlfSBmcm9tICcuLi90eXBlcy9iYXNlJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge1RhYmxlSWR9IGZyb20gJy4uL3R5cGVzL3RhYmxlJztcbmltcG9ydCB7Vmlld0lkfSBmcm9tICcuLi90eXBlcy92aWV3JztcbmltcG9ydCB7RmllbGRJZH0gZnJvbSAnLi4vdHlwZXMvZmllbGQnO1xuaW1wb3J0IHtpc0VudW1WYWx1ZSwgZW50cmllcywgT2JqZWN0VmFsdWVzLCBPYmplY3RNYXB9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCBBYnN0cmFjdE1vZGVsV2l0aEFzeW5jRGF0YSBmcm9tICcuL2Fic3RyYWN0X21vZGVsX3dpdGhfYXN5bmNfZGF0YSc7XG5pbXBvcnQgVGFibGUgZnJvbSAnLi90YWJsZSc7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IFJlY29yZCBmcm9tICcuL3JlY29yZCc7XG5cbmNvbnN0IFdhdGNoYWJsZUN1cnNvcktleXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBzZWxlY3RlZFJlY29yZElkczogJ3NlbGVjdGVkUmVjb3JkSWRzJyBhcyBjb25zdCxcbiAgICBzZWxlY3RlZEZpZWxkSWRzOiAnc2VsZWN0ZWRGaWVsZElkcycgYXMgY29uc3QsXG4gICAgYWN0aXZlVGFibGVJZDogJ2FjdGl2ZVRhYmxlSWQnIGFzIGNvbnN0LFxuICAgIGFjdGl2ZVZpZXdJZDogJ2FjdGl2ZVZpZXdJZCcgYXMgY29uc3QsXG4gICAgaXNEYXRhTG9hZGVkOiAnaXNEYXRhTG9hZGVkJyBhcyBjb25zdCxcbn0pO1xuXG4vKipcbiAqIFdhdGNoYWJsZSBrZXlzIGluIHtAbGluayBDdXJzb3J9LlxuICogLSBgc2VsZWN0ZWRSZWNvcmRJZHNgXG4gKiAtIGBzZWxlY3RlZEZpZWxkSWRzYFxuICogLSBgYWN0aXZlVGFibGVJZGBcbiAqIC0gYGFjdGl2ZVZpZXdJZGBcbiAqIC0gYGlzRGF0YUxvYWRlZGBcbiAqL1xudHlwZSBXYXRjaGFibGVDdXJzb3JLZXkgPSBPYmplY3RWYWx1ZXM8dHlwZW9mIFdhdGNoYWJsZUN1cnNvcktleXM+O1xuXG4vKiogQGhpZGRlbiAqL1xuaW50ZXJmYWNlIEN1cnNvckRhdGEge1xuICAgIHNlbGVjdGVkUmVjb3JkSWRTZXQ6IE9iamVjdE1hcDxSZWNvcmRJZCwgYm9vbGVhbj4gfCBudWxsO1xuICAgIHNlbGVjdGVkRmllbGRJZFNldDogT2JqZWN0TWFwPEZpZWxkSWQsIGJvb2xlYW4+IHwgbnVsbDtcbiAgICBhY3RpdmVUYWJsZUlkOiBUYWJsZUlkIHwgbnVsbDtcbiAgICBhY3RpdmVWaWV3SWQ6IFZpZXdJZCB8IG51bGw7XG59XG5cbi8vIE5PVEU6IGN1cnNvciBpcyBhbiBBYnN0cmFjdE1vZGVsIGJlY2F1c2UgaXQgaW5jbHVkZXMgbG9hZGFibGUgZGF0YS5cbi8qKlxuICogTW9kZWwgY2xhc3MgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHVzZXIncyBjdXJyZW50IGludGVyYWN0aW9ucyBpblxuICogQWlydGFibGUgLSBzcGVjaWZpY2FsbHksIHRoZWlyIGFjdGl2ZSB0YWJsZSwgYWN0aXZlIHZpZXcsIHNlbGVjdGVkIHJlY29yZHMgYW5kIHNlbGVjdGVkIGZpZWxkcy5cbiAqIEFsc28gYWxsb3dzIHlvdSB0byBzZXQgdGhlIGFjdGl2ZSB0YWJsZSBhbmQgYWN0aXZlIHZpZXcuXG4gKlxuICogU2VsZWN0ZWQgcmVjb3JkcyBhbmQgZmllbGRzIGFyZSBub3QgbG9hZGVkIGJ5IGRlZmF1bHQgYW5kIHRoZSBjdXJzb3IgbXVzdCBiZSBsb2FkZWQgd2l0aFxuICoge0BsaW5rIHVzZUxvYWRhYmxlfSB0byBhY2Nlc3MgdGhlbS5cbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHt1c2VDdXJzb3IsIHVzZVdhdGNoYWJsZX0gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy91aSc7XG4gKlxuICogIGZ1bmN0aW9uIEFjdGl2ZVRhYmxlQW5kVmlldygpIHtcbiAqICAgICAgY29uc3QgY3Vyc29yID0gdXNlQ3Vyc29yKCk7XG4gKlxuICogICAgICByZXR1cm4gKFxuICogICAgICAgICAgPGRpdj5cbiAqICAgICAgICAgICAgICBBY3RpdmUgdGFibGU6IHtjdXJzb3IuYWN0aXZlVGFibGVJZH1cbiAqICAgICAgICAgICAgICA8YnIgLz5cbiAqICAgICAgICAgICAgICBBY3RpdmUgdmlldzoge2N1cnNvci5hY3RpdmVWaWV3SWR9XG4gKiAgICAgICAgICA8L2Rpdj5cbiAqICAgICAgKTtcbiAqICB9XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHt1c2VDdXJzb3IsIHVzZUxvYWRhYmxlLCB1c2VXYXRjaGFibGV9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MvdWknO1xuICpcbiAqICBmdW5jdGlvbiBTZWxlY3RlZFJlY29yZEFuZEZpZWxkSWRzKCkge1xuICogICAgICBjb25zdCBjdXJzb3IgPSB1c2VDdXJzb3IoKTtcbiAqICAgICAgLy8gbG9hZCBzZWxlY3RlZCByZWNvcmRzIGFuZCBmaWVsZHNcbiAqICAgICAgdXNlTG9hZGFibGUoY3Vyc29yKTtcbiAqXG4gKiAgICAgIC8vIHJlLXJlbmRlciB3aGVuZXZlciB0aGUgbGlzdCBvZiBzZWxlY3RlZCByZWNvcmRzIG9yIGZpZWxkcyBjaGFuZ2VzXG4gKiAgICAgIHVzZVdhdGNoYWJsZShjdXJzb3IsIFsnc2VsZWN0ZWRSZWNvcmRJZHMnLCAnc2VsZWN0ZWRGaWVsZElkcyddKTtcbiAqXG4gKiAgICAgIHJldHVybiAoXG4gKiAgICAgICAgICA8ZGl2PlxuICogICAgICAgICAgICAgIFNlbGVjdGVkIHJlY29yZHM6IHtjdXJzb3Iuc2VsZWN0ZWRSZWNvcmRJZHMuam9pbignLCAnKX1cbiAqICAgICAgICAgICAgICA8YnIgLz5cbiAqICAgICAgICAgICAgICBTZWxlY3RlZCBmaWVsZHM6IHtjdXJzb3Iuc2VsZWN0ZWRGaWVsZElkcy5qb2luKCcsICcpfVxuICogICAgICAgICAgPC9kaXY+XG4gKiAgICAgICk7XG4gKiAgfVxuICogYGBgXG4gKlxuICogQGRvY3NQYXRoIG1vZGVscy9DdXJzb3JcbiAqL1xuY2xhc3MgQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RNb2RlbFdpdGhBc3luY0RhdGE8Q3Vyc29yRGF0YSwgV2F0Y2hhYmxlQ3Vyc29yS2V5PiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ0N1cnNvcic7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfaXNXYXRjaGFibGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzRW51bVZhbHVlKFdhdGNoYWJsZUN1cnNvcktleXMsIGtleSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX3Nob3VsZExvYWREYXRhRm9yS2V5KGtleTogV2F0Y2hhYmxlQ3Vyc29yS2V5KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2N1cnNvckRhdGE6IEN1cnNvckRhdGE7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgY29uc3RydWN0b3Ioc2RrOiBTZGspIHtcbiAgICAgICAgc3VwZXIoc2RrLCAnY3Vyc29yJyk7XG5cbiAgICAgICAgY29uc3QgYmFzZURhdGEgPSBzZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YS5iYXNlRGF0YTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSZWNvcmRJZFNldCA9IGJhc2VEYXRhLmN1cnNvckRhdGE/LnNlbGVjdGVkUmVjb3JkSWRTZXQgPz8gbnVsbDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWVsZElkU2V0ID0gYmFzZURhdGEuY3Vyc29yRGF0YT8uc2VsZWN0ZWRGaWVsZElkU2V0ID8/IG51bGw7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVRhYmxlSWQgPSBiYXNlRGF0YS5hY3RpdmVUYWJsZUlkO1xuICAgICAgICBjb25zdCBhY3RpdmVUYWJsZSA9IGFjdGl2ZVRhYmxlSWQgPyBiYXNlRGF0YS50YWJsZXNCeUlkW2FjdGl2ZVRhYmxlSWRdIDogbnVsbDtcbiAgICAgICAgY29uc3QgYWN0aXZlVmlld0lkID0gYWN0aXZlVGFibGU/LmFjdGl2ZVZpZXdJZCA/PyBudWxsO1xuXG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEgPSB7XG4gICAgICAgICAgICBzZWxlY3RlZFJlY29yZElkU2V0LFxuICAgICAgICAgICAgc2VsZWN0ZWRGaWVsZElkU2V0LFxuICAgICAgICAgICAgYWN0aXZlVGFibGVJZCxcbiAgICAgICAgICAgIGFjdGl2ZVZpZXdJZCxcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Quc2VhbCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGFPck51bGxJZkRlbGV0ZWQoKTogQ3Vyc29yRGF0YSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJzb3JEYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfb25DaGFuZ2VJc0RhdGFMb2FkZWQoKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUN1cnNvcktleXMuaXNEYXRhTG9hZGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX2xvYWREYXRhQXN5bmMoKTogUHJvbWlzZTxBcnJheTxXYXRjaGFibGVDdXJzb3JLZXk+PiB7XG4gICAgICAgIGNvbnN0IGN1cnNvckRhdGEgPSBhd2FpdCB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5mZXRjaEFuZFN1YnNjcmliZVRvQ3Vyc29yRGF0YUFzeW5jKCk7XG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEuc2VsZWN0ZWRSZWNvcmRJZFNldCA9IGN1cnNvckRhdGEuc2VsZWN0ZWRSZWNvcmRJZFNldDtcbiAgICAgICAgdGhpcy5fY3Vyc29yRGF0YS5zZWxlY3RlZEZpZWxkSWRTZXQgPSBjdXJzb3JEYXRhLnNlbGVjdGVkRmllbGRJZFNldDtcblxuICAgICAgICByZXR1cm4gW1dhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRSZWNvcmRJZHMsIFdhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRGaWVsZElkc107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF91bmxvYWREYXRhKCkge1xuICAgICAgICB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS51bnN1YnNjcmliZUZyb21DdXJzb3JEYXRhKCk7XG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEuc2VsZWN0ZWRSZWNvcmRJZFNldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnNvckRhdGEuc2VsZWN0ZWRGaWVsZElkU2V0ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlY29yZCBJRHMgb2YgYWxsIGN1cnJlbnRseSBzZWxlY3RlZCByZWNvcmRzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyByZWNvcmRzIGFyZSBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE5vdCBsb2FkZWQgYnkgZGVmYXVsdC4gWW91IG11c3QgbG9hZCBjdXJzb3IgZGF0YSB3aXRoIGB1c2VMb2FkYWJsZShjdXJzb3IpYCAocmVjb21tZW5kZWQpIG9yXG4gICAgICogYGN1cnNvci5sb2FkRGF0YUFzeW5jKClgIGJlZm9yZSB1c2UuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZC5cbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0ZWRSZWNvcmRJZHMoKTogQXJyYXk8UmVjb3JkSWQ+IHtcbiAgICAgICAgY29uc3Qge3NlbGVjdGVkUmVjb3JkSWRTZXR9ID0gdGhpcy5fZGF0YTtcbiAgICAgICAgaW52YXJpYW50KHNlbGVjdGVkUmVjb3JkSWRTZXQsICdDdXJzb3IgZGF0YSBpcyBub3QgbG9hZGVkJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkSWRzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRSZWNvcmRJZFNldCk7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJlY29yZElkcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIElEcyBvZiBhbGwgY3VycmVudGx5IHNlbGVjdGVkIGZpZWxkcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZmllbGRzIGFyZSBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIE5vdCBsb2FkZWQgYnkgZGVmYXVsdDogeW91IG11c3QgbG9hZCBjdXJzb3IgZGF0YSB3aXRoIGB1c2VMb2FkYWJsZShjdXJzb3IpYCAocmVjb21tZW5kZWQpIG9yXG4gICAgICogYGN1cnNvci5sb2FkRGF0YUFzeW5jKClgIGJlZm9yZSB1c2UuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZC5cbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0ZWRGaWVsZElkcygpOiBBcnJheTxSZWNvcmRJZD4ge1xuICAgICAgICBjb25zdCB7c2VsZWN0ZWRGaWVsZElkU2V0fSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGludmFyaWFudChzZWxlY3RlZEZpZWxkSWRTZXQsICdDdXJzb3IgZGF0YSBpcyBub3QgbG9hZGVkJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkSWRzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRGaWVsZElkU2V0KTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkUmVjb3JkSWRzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIHJlY29yZCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIFNlbGVjdGVkIHJlY29yZHMgYXJlIG5vdCBsb2FkZWQgYnkgZGVmYXVsdC4gWW91IG11c3QgbG9hZCBjdXJzb3IgZGF0YSB3aXRoXG4gICAgICogYHVzZUxvYWRhYmxlKGN1cnNvcilgIChyZWNvbW1lbmRlZCkgb3IgYGN1cnNvci5sb2FkRGF0YUFzeW5jKClgIGJlZm9yZSB1c2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVjb3JkT3JSZWNvcmRJZCBUaGUgcmVjb3JkIG9yIHJlY29yZCBJRCB0byBjaGVjayBmb3IuXG4gICAgICovXG4gICAgaXNSZWNvcmRTZWxlY3RlZChyZWNvcmRPclJlY29yZElkOiBSZWNvcmQgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qge3NlbGVjdGVkUmVjb3JkSWRTZXR9ID0gdGhpcy5fZGF0YTtcbiAgICAgICAgaW52YXJpYW50KHNlbGVjdGVkUmVjb3JkSWRTZXQsICdDdXJzb3IgZGF0YSBpcyBub3QgbG9hZGVkJyk7XG4gICAgICAgIGxldCByZWNvcmRJZDogc3RyaW5nO1xuICAgICAgICBpZiAocmVjb3JkT3JSZWNvcmRJZCBpbnN0YW5jZW9mIFJlY29yZCkge1xuICAgICAgICAgICAgcmVjb3JkSWQgPSByZWNvcmRPclJlY29yZElkLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjb3JkSWQgPSByZWNvcmRPclJlY29yZElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkUmVjb3JkSWRTZXRbcmVjb3JkSWRdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudGx5IGFjdGl2ZSB0YWJsZSBJRC4gQ2FuIGJlIG51bGwgd2hlbiB0aGUgYWN0aXZlIHRhYmxlIGhhcyBjaGFuZ2VkIGFuZCBpcyBub3QgeWV0XG4gICAgICogbG9hZGVkLCBhbmQgY2FuIGFsc28gcmVmZXIgdG8gYSB0YWJsZSB0aGF0IGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAqXG4gICAgICogV2hlbiBmZXRjaGluZyB0aGUge0BsaW5rIFRhYmxlfSwgdXNlIGBiYXNlLmdldFRhYmxlQnlJZElmRXhpc3RzKGN1cnNvci5hY3RpdmVUYWJsZUlkKWAgYW5kXG4gICAgICogY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgYG51bGxgIHRvIGJlIHJlc2lsaWVudCB0byB0aG9zZSBjYXNlcy5cbiAgICAgKlxuICAgICAqIENhbiBiZSB3YXRjaGVkLlxuICAgICAqL1xuICAgIGdldCBhY3RpdmVUYWJsZUlkKCk6IFRhYmxlSWQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuYWN0aXZlVGFibGVJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnRseSBhY3RpdmUgdmlldyBJRC4gVGhpcyB3aWxsIGFsd2F5cyBiZSBhIHZpZXcgYmVsb25naW5nIHRvIGBhY3RpdmVUYWJsZUlkYC4gQ2FuIGJlXG4gICAgICogbnVsbCB3aGVuIHRoZSBhY3RpdmUgdmlldyBoYXMgY2hhbmdlZCBhbmQgaXMgbm90IHlldCBsb2FkZWQsIGFuZCBjYW4gYWxzbyByZWZlciB0byBhIHZpZXdcbiAgICAgKiB0aGF0IGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAqXG4gICAgICogV2hlbiBmZXRjaGluZyB0aGUge0BsaW5rIFZpZXd9LCB1c2UgYHRhYmxlLmdldFZpZXdCeUlkSWZFeGlzdHMoY3Vyc29yLmFjdGl2ZVZpZXdJZClgIGFuZFxuICAgICAqIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IGBudWxsYCB0byBiZSByZXNpbGllbnQgdG8gdGhvc2UgY2FzZXMuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgd2F0Y2hlZC5cbiAgICAgKi9cbiAgICBnZXQgYWN0aXZlVmlld0lkKCk6IFZpZXdJZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5hY3RpdmVWaWV3SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCB0YWJsZSB0byBhY3RpdmUgaW4gdGhlIEFpcnRhYmxlIFVJLiBJZiB0aGUgYXBwcyBwYW5lIGlzIGZ1bGxzY3JlZW4sIHRoZVxuICAgICAqIHRhYmxlIHdpbGwgc3RpbGwgYmUgc2V0IGFzIGFjdGl2ZSwgYnV0IHRoZSBhcHBzIHBhbmUgd2lsbCBjb250aW51ZSB0byBiZSBkaXNwbGF5ZWRcbiAgICAgKiBmdWxsc2NyZWVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhYmxlT3JUYWJsZUlkIFRoZSB0YXJnZXQgdGFibGUgb3IgdGFibGUgSUQgdG8gc2V0IGFzIGFjdGl2ZSBpbiB0aGUgQWlydGFibGUgbWFpbiBwYWdlLlxuICAgICAqL1xuICAgIHNldEFjdGl2ZVRhYmxlKHRhYmxlT3JUYWJsZUlkOiBUYWJsZSB8IFRhYmxlSWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRhYmxlT3JUYWJsZUlkIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yVGFibGVJZC5pZCA6IHRhYmxlT3JUYWJsZUlkO1xuICAgICAgICB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZXRBY3RpdmVWaWV3T3JUYWJsZSh0YWJsZUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIHZpZXcgKGFuZCBjb3JyZXNwb25kaW5nIHRhYmxlKSB0byBhY3RpdmUgaW4gdGhlIEFpcnRhYmxlIFVJLiBJZiB0aGUgYXBwc1xuICAgICAqIHBhbmUgaXMgZnVsbHNjcmVlbiwgdGhlIHZpZXcgd2lsbCBzdGlsbCBiZSBzZXQgYXMgYWN0aXZlLCBidXQgdGhlIGFwcHMgcGFuZSB3aWxsIGNvbnRpbnVlXG4gICAgICogdG8gYmUgZGlzcGxheWVkIGZ1bGxzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFibGVPclRhYmxlSWQgVGhlIHRhYmxlIG9yIHRhYmxlIElEIHRoYXQgdGhlIHRhcmdldCB2aWV3IGJlbG9uZ3MgdG8uXG4gICAgICogQHBhcmFtIHZpZXdPclZpZXdJZCBUaGUgdGFyZ2V0IHZpZXcgb3IgdmlldyBJRCB0byBzZXQgYXMgYWN0aXZlIGluIHRoZSBBaXJ0YWJsZSBtYWluIHBhZ2UuXG4gICAgICovXG4gICAgc2V0QWN0aXZlVmlldyh0YWJsZU9yVGFibGVJZDogVGFibGUgfCBUYWJsZUlkLCB2aWV3T3JWaWV3SWQ6IFZpZXcgfCBWaWV3SWQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRhYmxlT3JUYWJsZUlkIGluc3RhbmNlb2YgVGFibGUgPyB0YWJsZU9yVGFibGVJZC5pZCA6IHRhYmxlT3JUYWJsZUlkO1xuICAgICAgICBjb25zdCB2aWV3SWQgPSB2aWV3T3JWaWV3SWQgaW5zdGFuY2VvZiBWaWV3ID8gdmlld09yVmlld0lkLmlkIDogdmlld09yVmlld0lkO1xuICAgICAgICB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZS5zZXRBY3RpdmVWaWV3T3JUYWJsZSh0YWJsZUlkLCB2aWV3SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fYXBwbHlDaGFuZ2VzV2l0aG91dFRyaWdnZXJpbmdFdmVudHMoXG4gICAgICAgIGNoYW5nZXM6IFJlYWRvbmx5QXJyYXk8TW9kZWxDaGFuZ2U+LFxuICAgICk6IE9iamVjdE1hcDxXYXRjaGFibGVDdXJzb3JLZXksIGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IGNoYW5nZWRLZXlzID0ge1xuICAgICAgICAgICAgW1dhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRSZWNvcmRJZHNdOiBmYWxzZSxcbiAgICAgICAgICAgIFtXYXRjaGFibGVDdXJzb3JLZXlzLmFjdGl2ZVRhYmxlSWRdOiBmYWxzZSxcbiAgICAgICAgICAgIFtXYXRjaGFibGVDdXJzb3JLZXlzLmFjdGl2ZVZpZXdJZF06IGZhbHNlLFxuICAgICAgICB9IGFzIE9iamVjdE1hcDxXYXRjaGFibGVDdXJzb3JLZXksIGJvb2xlYW4+O1xuICAgICAgICBmb3IgKGNvbnN0IHtwYXRoLCB2YWx1ZX0gb2YgY2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKHBhdGhbMF0gPT09ICdjdXJzb3JEYXRhJykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGF0aFsxXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3RlZFJlY29yZElkU2V0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KHBhdGgubGVuZ3RoID09PSAyLCAnY2Fubm90IHNldCB3aXRoaW4gc2VsZWN0ZWRSZWNvcmRJZFNldCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yRGF0YS5zZWxlY3RlZFJlY29yZElkU2V0ID0gdmFsdWUgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEtleXNbV2F0Y2hhYmxlQ3Vyc29yS2V5cy5zZWxlY3RlZFJlY29yZElkc10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0ZWRGaWVsZElkU2V0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KHBhdGgubGVuZ3RoID09PSAyLCAnY2Fubm90IHNldCB3aXRoaW4gc2VsZWN0ZWRGaWVsZElkU2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3JEYXRhLnNlbGVjdGVkRmllbGRJZFNldCA9IHZhbHVlIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRLZXlzW1dhdGNoYWJsZUN1cnNvcktleXMuc2VsZWN0ZWRGaWVsZElkc10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8tb3AgZm9yIGZ1dHVyZSB1bmtub3duIHBhdGhzLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhdGhbMF0gPT09ICdhY3RpdmVUYWJsZUlkJykge1xuICAgICAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FjdGl2ZVRhYmxlSWQgbXVzdCBiZSBzdHJpbmcgb3IgbnVsbCcsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvckRhdGEuYWN0aXZlVGFibGVJZCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGNoYW5nZWRLZXlzW1dhdGNoYWJsZUN1cnNvcktleXMuYWN0aXZlVGFibGVJZF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvckRhdGEuYWN0aXZlVmlld0lkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZEtleXNbV2F0Y2hhYmxlQ3Vyc29yS2V5cy5hY3RpdmVWaWV3SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXRoWzBdID09PSAndGFibGVzQnlJZCcgJiZcbiAgICAgICAgICAgICAgICBwYXRoWzFdID09PSB0aGlzLmFjdGl2ZVRhYmxlSWQgJiZcbiAgICAgICAgICAgICAgICBwYXRoWzJdID09PSAnYWN0aXZlVmlld0lkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAnYWN0aXZlVGFibGVJZCBtdXN0IGJlIHN0cmluZyBvciBudWxsJyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yRGF0YS5hY3RpdmVWaWV3SWQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkS2V5c1tXYXRjaGFibGVDdXJzb3JLZXlzLmFjdGl2ZVZpZXdJZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWRLZXlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfX3RyaWdnZXJPbkNoYW5nZUZvckNoYW5nZWRLZXlzKGNoYW5nZWRLZXlzOiBPYmplY3RNYXA8V2F0Y2hhYmxlQ3Vyc29yS2V5LCBib29sZWFuPikge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpZENoYW5nZV0gb2YgZW50cmllcyhjaGFuZ2VkS2V5cykpIHtcbiAgICAgICAgICAgIGlmIChkaWRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDdXJzb3I7XG4iXX0=
@@ -109,7 +109,9 @@ function (_AbstractModel) {
109
109
  (0, _classCallCheck2.default)(this, Field);
110
110
  _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Field).call(this, sdk, fieldId));
111
111
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_parentTable", void 0);
112
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_cachedFieldTypeConfigOrNull", void 0);
112
113
  _this._parentTable = parentTable;
114
+ _this._cachedFieldTypeConfigOrNull = null;
113
115
  return _this;
114
116
  }
115
117
  /**
@@ -118,6 +120,42 @@ function (_AbstractModel) {
118
120
 
119
121
 
120
122
  (0, _createClass2.default)(Field, [{
123
+ key: "_getCachedConfigFromFieldTypeProvider",
124
+ // We use a cached response from FieldTypeProvider because getting the config can
125
+ // be an expensive operation. In particular when fieldConfigs are extremely large
126
+ // (eg: Select fields with lots of select options)
127
+ value: function _getCachedConfigFromFieldTypeProvider() {
128
+ if (this._cachedFieldTypeConfigOrNull !== null) {
129
+ return this._cachedFieldTypeConfigOrNull;
130
+ }
131
+
132
+ var airtableInterface = this._sdk.__airtableInterface;
133
+ var appInterface = this._sdk.__appInterface;
134
+ this._cachedFieldTypeConfigOrNull = airtableInterface.fieldTypeProvider.getConfig(appInterface, this._data, this.parentTable.__getFieldNamesById());
135
+ return this._cachedFieldTypeConfigOrNull;
136
+ }
137
+ }, {
138
+ key: "_clearCachedConfig",
139
+ value: function _clearCachedConfig() {
140
+ this._cachedFieldTypeConfigOrNull = null;
141
+ }
142
+ /**
143
+ * The type and options of the field to make type narrowing `FieldOptions` easier.
144
+ *
145
+ * @see {@link FieldConfig}
146
+ * @example
147
+ * const fieldConfig = field.config;
148
+ * if (fieldConfig.type === FieldType.SINGLE_SELECT) {
149
+ * return fieldConfig.options.choices;
150
+ * } else if (fieldConfig.type === FieldType.MULTIPLE_LOOKUP_VALUES && fieldConfig.options.isValid) {
151
+ * if (fieldConfig.options.result.type === FieldType.SINGLE_SELECT) {
152
+ * return fieldConfig.options.result.options.choices;
153
+ * }
154
+ * }
155
+ * return DEFAULT_CHOICES;
156
+ */
157
+
158
+ }, {
121
159
  key: "checkPermissionsForUpdateOptions",
122
160
 
123
161
  /**
@@ -125,7 +163,7 @@ function (_AbstractModel) {
125
163
  *
126
164
  * Accepts partial input, in the same format as {@link updateOptionsAsync}.
127
165
  *
128
- * Returns `{hasPermission: true}` if the current user can update the specified record,
166
+ * Returns `{hasPermission: true}` if the current user can update the specified field,
129
167
  * `{hasPermission: false, reasonDisplayString: string}` otherwise. `reasonDisplayString` may be
130
168
  * used to display an error message to the user.
131
169
  *
@@ -241,6 +279,104 @@ function (_AbstractModel) {
241
279
  }
242
280
  }, null, this);
243
281
  }
282
+ /**
283
+ * Checks whether the current user has permission to perform the given description update.
284
+ *
285
+ * Accepts partial input, in the same format as {@link updateDescriptionAsync}.
286
+ *
287
+ * Returns `{hasPermission: true}` if the current user can update the specified field,
288
+ * `{hasPermission: false, reasonDisplayString: string}` otherwise. `reasonDisplayString` may be
289
+ * used to display an error message to the user.
290
+ *
291
+ * @param description new description for the field
292
+ *
293
+ * @example
294
+ * ```js
295
+ * const updateFieldCheckResult = field.checkPermissionsForUpdateDescription();
296
+ *
297
+ * if (!updateFieldCheckResult.hasPermission) {
298
+ * alert(updateFieldCheckResult.reasonDisplayString);
299
+ * }
300
+ * ```
301
+ */
302
+
303
+ }, {
304
+ key: "checkPermissionsForUpdateDescription",
305
+ value: function checkPermissionsForUpdateDescription(description) {
306
+ return this._sdk.__mutations.checkPermissionsForMutation({
307
+ type: _mutations.MutationTypes.UPDATE_SINGLE_FIELD_DESCRIPTION,
308
+ tableId: this.parentTable.id,
309
+ id: this.id,
310
+ description
311
+ });
312
+ }
313
+ /**
314
+ * An alias for `checkPermissionsForUpdateDescription(options).hasPermission`.
315
+ *
316
+ * Checks whether the current user has permission to perform the description update.
317
+ *
318
+ * Accepts partial input, in the same format as {@link updateDescriptionAsync}.
319
+ *
320
+ * @param description new description for the field
321
+ *
322
+ * @example
323
+ * ```js
324
+ * const canUpdateField = field.hasPermissionToUpdateDescription();
325
+ *
326
+ * if (!canUpdateField) {
327
+ * alert('not allowed!');
328
+ * }
329
+ * ```
330
+ */
331
+
332
+ }, {
333
+ key: "hasPermissionToUpdateDescription",
334
+ value: function hasPermissionToUpdateDescription(description) {
335
+ return this.checkPermissionsForUpdateDescription(description).hasPermission;
336
+ }
337
+ /**
338
+ * Updates the description for this field.
339
+ *
340
+ * To remove an existing description, pass `''` as the new description.
341
+ * `null` is also accepted and will be coerced to `''` for consistency with field creation.
342
+ *
343
+ * Throws an error if the user does not have permission to update the field, or if an invalid
344
+ * description is provided.
345
+ *
346
+ * This action is asynchronous. Unlike updates to cell values, updates to field descriptions are
347
+ * **not** applied optimistically locally. You must `await` the returned promise before
348
+ * relying on the change in your app.
349
+ *
350
+ * @param description new description for the field
351
+ *
352
+ * @example
353
+ * ```js
354
+ * await myTextField.updateDescriptionAsync('This is a text field');
355
+ * ```
356
+ */
357
+
358
+ }, {
359
+ key: "updateDescriptionAsync",
360
+ value: function updateDescriptionAsync(description) {
361
+ return _regenerator.default.async(function updateDescriptionAsync$(_context2) {
362
+ while (1) {
363
+ switch (_context2.prev = _context2.next) {
364
+ case 0:
365
+ _context2.next = 2;
366
+ return _regenerator.default.awrap(this._sdk.__mutations.applyMutationAsync({
367
+ type: _mutations.MutationTypes.UPDATE_SINGLE_FIELD_DESCRIPTION,
368
+ tableId: this.parentTable.id,
369
+ id: this.id,
370
+ description
371
+ }));
372
+
373
+ case 2:
374
+ case "end":
375
+ return _context2.stop();
376
+ }
377
+ }
378
+ }, null, this);
379
+ }
244
380
  /**
245
381
  * `true` if this field is computed, `false` otherwise. A field is
246
382
  * "computed" if it's value is not set by user input (e.g. autoNumber, formula,
@@ -329,6 +465,9 @@ function (_AbstractModel) {
329
465
  }, {
330
466
  key: "__triggerOnChangeForDirtyPaths",
331
467
  value: function __triggerOnChangeForDirtyPaths(dirtyPaths) {
468
+ // Always clear the cached config when anything on the field data model changes
469
+ this._clearCachedConfig();
470
+
332
471
  if (dirtyPaths.name) {
333
472
  this._onChange(WatchableFieldKeys.name);
334
473
  }
@@ -402,11 +541,8 @@ function (_AbstractModel) {
402
541
  }, {
403
542
  key: "type",
404
543
  get: function get() {
405
- var airtableInterface = this._sdk.__airtableInterface;
406
- var appInterface = this._sdk.__appInterface;
407
-
408
- var _airtableInterface$fi = airtableInterface.fieldTypeProvider.getConfig(appInterface, this._data, this.parentTable.__getFieldNamesById()),
409
- type = _airtableInterface$fi.type; // We intend to switch from "lookup" to "multipleLookupValues", but need to support both
544
+ var _this$_getCachedConfi = this._getCachedConfigFromFieldTypeProvider(),
545
+ type = _this$_getCachedConfi.type; // We intend to switch from "lookup" to "multipleLookupValues", but need to support both
410
546
  // until the transition is complete. See <https://airtable.quip.com/VxaMAmAfUscs> for more.
411
547
  // @ts-ignore
412
548
 
@@ -437,31 +573,14 @@ function (_AbstractModel) {
437
573
  }, {
438
574
  key: "options",
439
575
  get: function get() {
440
- var airtableInterface = this._sdk.__airtableInterface;
441
- var appInterface = this._sdk.__appInterface;
442
-
443
- var _airtableInterface$fi2 = airtableInterface.fieldTypeProvider.getConfig(appInterface, this._data, this.parentTable.__getFieldNamesById()),
444
- options = _airtableInterface$fi2.options; // TODO(emma): can we remove this cloneDeep?
576
+ var _this$_getCachedConfi2 = this._getCachedConfigFromFieldTypeProvider(),
577
+ options = _this$_getCachedConfi2.options; // TODO: In the next breaking release freeze (inside of the cache) and replace
578
+ // FieldOptions with readonly<FieldOptions>.
579
+ // Today this is required because we re-use the fieldTypeProvider.getConfig response.
445
580
 
446
581
 
447
582
  return options ? (0, _private_utils.cloneDeep)(options) : null;
448
583
  }
449
- /**
450
- * The type and options of the field to make type narrowing `FieldOptions` easier.
451
- *
452
- * @see {@link FieldConfig}
453
- * @example
454
- * const fieldConfig = field.config;
455
- * if (fieldConfig.type === FieldType.SINGLE_SELECT) {
456
- * return fieldConfig.options.choices;
457
- * } else if (fieldConfig.type === FieldType.MULTIPLE_LOOKUP_VALUES && fieldConfig.options.isValid) {
458
- * if (fieldConfig.options.result.type === FieldType.SINGLE_SELECT) {
459
- * return fieldConfig.options.result.options.choices;
460
- * }
461
- * }
462
- * return DEFAULT_CHOICES;
463
- */
464
-
465
584
  }, {
466
585
  key: "config",
467
586
  get: function get() {
@@ -532,4 +651,5 @@ function (_AbstractModel) {
532
651
 
533
652
  (0, _defineProperty2.default)(Field, "_className", 'Field');
534
653
  var _default = Field;
535
- exports.default = _default;
654
+ exports.default = _default;
655
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZmllbGQudHMiXSwibmFtZXMiOlsiV2F0Y2hhYmxlRmllbGRLZXlzIiwiT2JqZWN0IiwiZnJlZXplIiwibmFtZSIsInR5cGUiLCJvcHRpb25zIiwiaXNDb21wdXRlZCIsImRlc2NyaXB0aW9uIiwiRmllbGQiLCJrZXkiLCJzZGsiLCJwYXJlbnRUYWJsZSIsImZpZWxkSWQiLCJfcGFyZW50VGFibGUiLCJfY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsIiwiYWlydGFibGVJbnRlcmZhY2UiLCJfc2RrIiwiX19haXJ0YWJsZUludGVyZmFjZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiZmllbGRUeXBlUHJvdmlkZXIiLCJnZXRDb25maWciLCJfZGF0YSIsIl9fZ2V0RmllbGROYW1lc0J5SWQiLCJfX211dGF0aW9ucyIsImNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbiIsIk11dGF0aW9uVHlwZXMiLCJVUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRyIsInRhYmxlSWQiLCJpZCIsImNvbmZpZyIsImNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVPcHRpb25zIiwiaGFzUGVybWlzc2lvbiIsIm9wdHMiLCJhcHBseU11dGF0aW9uQXN5bmMiLCJVUERBVEVfU0lOR0xFX0ZJRUxEX0RFU0NSSVBUSU9OIiwiY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uIiwiYWdncmVnYXRvciIsImFnZ3JlZ2F0b3JLZXkiLCJhdmFpbGFibGVBZ2dyZWdhdG9yS2V5cyIsImFnZ3JlZ2F0b3JzIiwiZ2V0QXZhaWxhYmxlQWdncmVnYXRvcktleXNGb3JGaWVsZCIsInNvbWUiLCJzdHJpbmciLCJjZWxsVmFsdWUiLCJjb252ZXJ0U3RyaW5nVG9DZWxsVmFsdWUiLCJ2YWxpZGF0aW9uUmVzdWx0IiwidmFsaWRhdGVDZWxsVmFsdWVGb3JVcGRhdGUiLCJpc1ZhbGlkIiwiZGlydHlQYXRocyIsIl9jbGVhckNhY2hlZENvbmZpZyIsIl9vbkNoYW5nZSIsInR5cGVPcHRpb25zIiwidGFibGVEYXRhIiwiX2Jhc2VEYXRhIiwidGFibGVzQnlJZCIsImZpZWxkc0J5SWQiLCJfaWQiLCJfZ2V0Q2FjaGVkQ29uZmlnRnJvbUZpZWxkVHlwZVByb3ZpZGVyIiwiRmllbGRUeXBlIiwiTVVMVElQTEVfTE9PS1VQX1ZBTFVFUyIsInByaW1hcnlGaWVsZCIsImF2YWlsYWJsZUFnZ3JlZ2F0b3JLZXlzU2V0IiwiU2V0IiwicmVxdWlyZSIsImZpbHRlciIsImhhcyIsIkFic3RyYWN0TW9kZWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFQQTs7QUFBOEM7QUFXOUM7QUFDQTtBQUNBLElBQU1BLGtCQUFrQixHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztBQUNyQ0MsRUFBQUEsSUFBSSxFQUFFLE1BRCtCO0FBRXJDQyxFQUFBQSxJQUFJLEVBQUUsTUFGK0I7QUFHckNDLEVBQUFBLE9BQU8sRUFBRSxTQUg0QjtBQUlyQ0MsRUFBQUEsVUFBVSxFQUFFLFlBSnlCO0FBS3JDQyxFQUFBQSxXQUFXLEVBQUU7QUFMd0IsQ0FBZCxDQUEzQjtBQVFBOzs7Ozs7Ozs7QUFVQTs7Ozs7Ozs7Ozs7OztJQWFNQyxLOzs7Ozs7O0FBQ0Y7O0FBRUE7b0NBQ3VCQyxHLEVBQWE7QUFDaEMsYUFBTyxnQ0FBWVQsa0JBQVosRUFBZ0NTLEdBQWhDLENBQVA7QUFDSDtBQUNEOzs7O0FBSUE7OztBQUdBLGlCQUFZQyxHQUFaLEVBQXNCQyxXQUF0QixFQUEwQ0MsT0FBMUMsRUFBMkQ7QUFBQTs7QUFBQTtBQUN2RCwyR0FBTUYsR0FBTixFQUFXRSxPQUFYO0FBRHVEO0FBQUE7QUFHdkQsVUFBS0MsWUFBTCxHQUFvQkYsV0FBcEI7QUFDQSxVQUFLRyw0QkFBTCxHQUFvQyxJQUFwQztBQUp1RDtBQUsxRDtBQUVEOzs7Ozs7O0FBOEVBO0FBQ0E7QUFDQTs0REFDeUQ7QUFD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V0FObUM7O0FBTzFDLGFBQU8sMkJBQU9BLFdBQVAsRUFBb0J5QixNQUFwQixDQUEyQjVCLFVBQVUsSUFBSTtBQUM1QyxlQUFPeUIsMEJBQTBCLENBQUNJLEdBQTNCLENBQStCN0IsVUFBVSxDQUFDNUIsR0FBMUMsQ0FBUDtBQUNILE9BRk0sQ0FBUDtBQUdIOzs7RUFsWWUwRCx1Qjs7OEJBQWQzRCxLLGdCQUVrQixPO2VBdWVUQSxLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBtb2R1bGUgQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHM6IEZpZWxkICovIC8qKiAqL1xuaW1wb3J0IHtBZ2dyZWdhdG9yS2V5fSBmcm9tICcuLi90eXBlcy9hZ2dyZWdhdG9ycyc7XG5pbXBvcnQgU2RrIGZyb20gJy4uL3Nkayc7XG5pbXBvcnQge011dGF0aW9uVHlwZXMsIFBlcm1pc3Npb25DaGVja1Jlc3VsdCwgVXBkYXRlRmllbGRPcHRpb25zT3B0c30gZnJvbSAnLi4vdHlwZXMvbXV0YXRpb25zJztcbmltcG9ydCB7RmllbGREYXRhLCBGaWVsZFR5cGUsIEZpZWxkT3B0aW9ucywgRmllbGRDb25maWd9IGZyb20gJy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCB7aXNFbnVtVmFsdWUsIGNsb25lRGVlcCwgdmFsdWVzLCBPYmplY3RWYWx1ZXMsIEZsb3dBbnlPYmplY3R9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtGaWVsZFR5cGVDb25maWd9IGZyb20gJy4uL3R5cGVzL2FpcnRhYmxlX2ludGVyZmFjZSc7XG5pbXBvcnQgQWJzdHJhY3RNb2RlbCBmcm9tICcuL2Fic3RyYWN0X21vZGVsJztcbmltcG9ydCB7QWdncmVnYXRvcn0gZnJvbSAnLi9jcmVhdGVfYWdncmVnYXRvcnMnO1xuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuXG4vLyBUaGlzIGRvZXNuJ3QgZm9sbG93IG91ciBlbnVtIG5hbWluZyBjb252ZW50aW9ucyBiZWNhdXNlIHdlIHdhbnQgdGhlIGtleXNcbi8vIHRvIG1pcnJvciB0aGUgbWV0aG9kL2dldHRlciBuYW1lcyBvbiB0aGUgbW9kZWwgY2xhc3MuXG5jb25zdCBXYXRjaGFibGVGaWVsZEtleXMgPSBPYmplY3QuZnJlZXplKHtcbiAgICBuYW1lOiAnbmFtZScgYXMgY29uc3QsXG4gICAgdHlwZTogJ3R5cGUnIGFzIGNvbnN0LFxuICAgIG9wdGlvbnM6ICdvcHRpb25zJyBhcyBjb25zdCxcbiAgICBpc0NvbXB1dGVkOiAnaXNDb21wdXRlZCcgYXMgY29uc3QsXG4gICAgZGVzY3JpcHRpb246ICdkZXNjcmlwdGlvbicgYXMgY29uc3QsXG59KTtcblxuLyoqXG4gKiBBbGwgdGhlIHdhdGNoYWJsZSBrZXlzIGluIGEgZmllbGQuXG4gKiAtIGBuYW1lYFxuICogLSBgdHlwZWBcbiAqIC0gYG9wdGlvbnNgXG4gKiAtIGBpc0NvbXB1dGVkYFxuICogLSBgZGVzY3JpcHRpb25gXG4gKi9cbmV4cG9ydCB0eXBlIFdhdGNoYWJsZUZpZWxkS2V5ID0gT2JqZWN0VmFsdWVzPHR5cGVvZiBXYXRjaGFibGVGaWVsZEtleXM+O1xuXG4vKipcbiAqIE1vZGVsIGNsYXNzIHJlcHJlc2VudGluZyBhIGZpZWxkIGluIGEgdGFibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2Jhc2V9IGZyb20gJ0BhaXJ0YWJsZS9ibG9ja3MnO1xuICpcbiAqIGNvbnN0IHRhYmxlID0gYmFzZS5nZXRUYWJsZUJ5TmFtZSgnVGFibGUgMScpO1xuICogY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5TmFtZSgnTmFtZScpO1xuICogY29uc29sZS5sb2coJ1RoZSB0eXBlIG9mIHRoaXMgZmllbGQgaXMnLCBmaWVsZC50eXBlKTtcbiAqIGBgYFxuICogQGRvY3NQYXRoIG1vZGVscy9GaWVsZFxuICovXG5jbGFzcyBGaWVsZCBleHRlbmRzIEFic3RyYWN0TW9kZWw8RmllbGREYXRhLCBXYXRjaGFibGVGaWVsZEtleT4ge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgX2NsYXNzTmFtZSA9ICdGaWVsZCc7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfaXNXYXRjaGFibGVLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlzRW51bVZhbHVlKFdhdGNoYWJsZUZpZWxkS2V5cywga2V5KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9wYXJlbnRUYWJsZTogVGFibGU7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGw6IEZpZWxkVHlwZUNvbmZpZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2RrOiBTZGssIHBhcmVudFRhYmxlOiBUYWJsZSwgZmllbGRJZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHNkaywgZmllbGRJZCk7XG5cbiAgICAgICAgdGhpcy5fcGFyZW50VGFibGUgPSBwYXJlbnRUYWJsZTtcbiAgICAgICAgdGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGFPck51bGxJZkRlbGV0ZWQoKTogRmllbGREYXRhIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX2Jhc2VEYXRhLnRhYmxlc0J5SWRbdGhpcy5wYXJlbnRUYWJsZS5pZF07XG4gICAgICAgIHJldHVybiB0YWJsZURhdGE/LmZpZWxkc0J5SWRbdGhpcy5faWRdID8/IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSB0aGF0IHRoaXMgZmllbGQgYmVsb25ncyB0by4gU2hvdWxkIG5ldmVyIGNoYW5nZSBiZWNhdXNlIGZpZWxkcyBhcmVuJ3QgbW92ZWQgYmV0d2VlbiB0YWJsZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBteVRhYmxlLmdldEZpZWxkQnlOYW1lKCdOYW1lJyk7XG4gICAgICogY29uc29sZS5sb2coZmllbGQucGFyZW50VGFibGUuaWQgPT09IG15VGFibGUuaWQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgcGFyZW50VGFibGUoKTogVGFibGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50VGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlGaWVsZC5uYW1lKTtcbiAgICAgKiAvLyA9PiAnTmFtZSdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZmllbGQuIENhbiBiZSB3YXRjaGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnNvbGUubG9nKG15RmllbGQudHlwZSk7XG4gICAgICogLy8gPT4gJ3NpbmdsZUxpbmVUZXh0J1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCB0eXBlKCk6IEZpZWxkVHlwZSB7XG4gICAgICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMuX2dldENhY2hlZENvbmZpZ0Zyb21GaWVsZFR5cGVQcm92aWRlcigpO1xuICAgICAgICAvLyBXZSBpbnRlbmQgdG8gc3dpdGNoIGZyb20gXCJsb29rdXBcIiB0byBcIm11bHRpcGxlTG9va3VwVmFsdWVzXCIsIGJ1dCBuZWVkIHRvIHN1cHBvcnQgYm90aFxuICAgICAgICAvLyB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS4gU2VlIDxodHRwczovL2FpcnRhYmxlLnF1aXAuY29tL1Z4YU1BbUFmVXNjcz4gZm9yIG1vcmUuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLk1VTFRJUExFX0xPT0tVUF9WQUxVRVM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIG9mIHRoZSBmaWVsZC4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmllbGQnc1xuICAgICAqIG9wdGlvbnMgZGVwZW5kIG9uIHRoZSBmaWVsZCdzIHR5cGUuIGBudWxsYCBpZiB0aGUgZmllbGQgaGFzIG5vIG9wdGlvbnMuXG4gICAgICogQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBGaWVsZFR5cGV9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7RmllbGRUeXBlfSBmcm9tICdAYWlydGFibGUvYmxvY2tzL21vZGVscyc7XG4gICAgICpcbiAgICAgKiBpZiAobXlGaWVsZC50eXBlID09PSBGaWVsZFR5cGUuQ1VSUkVOQ1kpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cobXlGaWVsZC5vcHRpb25zLnN5bWJvbCk7XG4gICAgICogICAgIC8vID0+ICckJ1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgb3B0aW9ucygpOiBGaWVsZE9wdGlvbnMgfCBudWxsIHtcbiAgICAgICAgY29uc3Qge29wdGlvbnN9ID0gdGhpcy5fZ2V0Q2FjaGVkQ29uZmlnRnJvbUZpZWxkVHlwZVByb3ZpZGVyKCk7XG5cbiAgICAgICAgLy8gVE9ETzogSW4gdGhlIG5leHQgYnJlYWtpbmcgcmVsZWFzZSBmcmVlemUgKGluc2lkZSBvZiB0aGUgY2FjaGUpIGFuZCByZXBsYWNlXG4gICAgICAgIC8vIEZpZWxkT3B0aW9ucyB3aXRoIHJlYWRvbmx5PEZpZWxkT3B0aW9ucz4uXG4gICAgICAgIC8vIFRvZGF5IHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB3ZSByZS11c2UgdGhlIGZpZWxkVHlwZVByb3ZpZGVyLmdldENvbmZpZyByZXNwb25zZS5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMgPyBjbG9uZURlZXAob3B0aW9ucykgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFdlIHVzZSBhIGNhY2hlZCByZXNwb25zZSBmcm9tIEZpZWxkVHlwZVByb3ZpZGVyIGJlY2F1c2UgZ2V0dGluZyB0aGUgY29uZmlnIGNhblxuICAgIC8vIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24uIEluIHBhcnRpY3VsYXIgd2hlbiBmaWVsZENvbmZpZ3MgYXJlIGV4dHJlbWVseSBsYXJnZVxuICAgIC8vIChlZzogU2VsZWN0IGZpZWxkcyB3aXRoIGxvdHMgb2Ygc2VsZWN0IG9wdGlvbnMpXG4gICAgX2dldENhY2hlZENvbmZpZ0Zyb21GaWVsZFR5cGVQcm92aWRlcigpOiBGaWVsZFR5cGVDb25maWcge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkRmllbGRUeXBlQ29uZmlnT3JOdWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFpcnRhYmxlSW50ZXJmYWNlID0gdGhpcy5fc2RrLl9fYWlydGFibGVJbnRlcmZhY2U7XG4gICAgICAgIGNvbnN0IGFwcEludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FwcEludGVyZmFjZTtcblxuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGwgPSBhaXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci5nZXRDb25maWcoXG4gICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRUYWJsZS5fX2dldEZpZWxkTmFtZXNCeUlkKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZEZpZWxkVHlwZUNvbmZpZ09yTnVsbDtcbiAgICB9XG4gICAgX2NsZWFyQ2FjaGVkQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRGaWVsZFR5cGVDb25maWdPck51bGwgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIGFuZCBvcHRpb25zIG9mIHRoZSBmaWVsZCB0byBtYWtlIHR5cGUgbmFycm93aW5nIGBGaWVsZE9wdGlvbnNgIGVhc2llci5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEZpZWxkQ29uZmlnfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgZmllbGRDb25maWcgPSBmaWVsZC5jb25maWc7XG4gICAgICogaWYgKGZpZWxkQ29uZmlnLnR5cGUgPT09IEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUKSB7XG4gICAgICogICAgIHJldHVybiBmaWVsZENvbmZpZy5vcHRpb25zLmNob2ljZXM7XG4gICAgICogfSBlbHNlIGlmIChmaWVsZENvbmZpZy50eXBlID09PSBGaWVsZFR5cGUuTVVMVElQTEVfTE9PS1VQX1ZBTFVFUyAmJiBmaWVsZENvbmZpZy5vcHRpb25zLmlzVmFsaWQpIHtcbiAgICAgKiAgICAgaWYgKGZpZWxkQ29uZmlnLm9wdGlvbnMucmVzdWx0LnR5cGUgPT09IEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUKSB7XG4gICAgICogICAgICAgICByZXR1cm4gZmllbGRDb25maWcub3B0aW9ucy5yZXN1bHQub3B0aW9ucy5jaG9pY2VzO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqIHJldHVybiBERUZBVUxUX0NIT0lDRVM7XG4gICAgICovXG4gICAgZ2V0IGNvbmZpZygpOiBGaWVsZENvbmZpZyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0gYXMgRmllbGRDb25maWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gb3B0aW9ucyB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlT3B0aW9uc0FzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgZmllbGQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBuZXcgb3B0aW9ucyBmb3IgdGhlIGZpZWxkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdXBkYXRlRmllbGRDaGVja1Jlc3VsdCA9IGZpZWxkLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVPcHRpb25zKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIXVwZGF0ZUZpZWxkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVGaWVsZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlT3B0aW9ucyhvcHRpb25zPzogRmllbGRPcHRpb25zKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRyxcbiAgICAgICAgICAgIHRhYmxlSWQ6IHRoaXMucGFyZW50VGFibGUuaWQsXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWxpYXMgZm9yIGBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlT3B0aW9ucyhvcHRpb25zKS5oYXNQZXJtaXNzaW9uYC5cbiAgICAgKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGUgb3B0aW9ucyB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlT3B0aW9uc0FzeW5jfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIG5ldyBvcHRpb25zIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYW5VcGRhdGVGaWVsZCA9IGZpZWxkLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIGlmICghY2FuVXBkYXRlRmllbGQpIHtcbiAgICAgKiAgICAgYWxlcnQoJ25vdCBhbGxvd2VkIScpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBoYXNQZXJtaXNzaW9uVG9VcGRhdGVPcHRpb25zKG9wdGlvbnM/OiBGaWVsZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZU9wdGlvbnMob3B0aW9ucykuaGFzUGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBvcHRpb25zIGZvciB0aGlzIGZpZWxkLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGZpZWxkLCBpZiBpbnZhbGlkXG4gICAgICogb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGlmIHRoaXMgZmllbGQgaGFzIG5vIHdyaXRhYmxlIG9wdGlvbnMsIG9yIGlmIHVwZGF0ZXMgdG8gdGhpcyBmaWVsZFxuICAgICAqIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIFJlZmVyIHRvIHtAbGluayBGaWVsZFR5cGV9IGZvciBzdXBwb3J0ZWQgZmllbGQgdHlwZXMsIHRoZSB3cml0ZSBmb3JtYXQgZm9yIG9wdGlvbnMsIGFuZFxuICAgICAqIG90aGVyIHNwZWNpZmljcyBmb3IgY2VydGFpbiBmaWVsZCB0eXBlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgYWN0aW9uIGlzIGFzeW5jaHJvbm91cy4gVW5saWtlIHVwZGF0ZXMgdG8gY2VsbCB2YWx1ZXMsIHVwZGF0ZXMgdG8gZmllbGQgb3B0aW9ucyBhcmVcbiAgICAgKiAqKm5vdCoqIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseS4gWW91IG11c3QgYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBiZWZvcmVcbiAgICAgKiByZWx5aW5nIG9uIHRoZSBjaGFuZ2UgaW4geW91ciBhcHAuXG4gICAgICpcbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIHBhc3MgYW4gYG9wdHNgIG9iamVjdCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiBTZWUge0BsaW5rIFVwZGF0ZUZpZWxkT3B0aW9uc09wdHN9XG4gICAgICogZm9yIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgbmV3IG9wdGlvbnMgZm9yIHRoZSBmaWVsZFxuICAgICAqIEBwYXJhbSBvcHRzIG9wdGlvbmFsIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgdXBkYXRlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gYWRkQ2hvaWNlVG9TZWxlY3RGaWVsZChzZWxlY3RGaWVsZCwgbmFtZUZvck5ld09wdGlvbikge1xuICAgICAqICAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHtcbiAgICAgKiAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgKiAgICAgICAgICAgICAuLi5zZWxlY3RGaWVsZC5vcHRpb25zLmNob2ljZXMsXG4gICAgICogICAgICAgICAgICAge25hbWU6IG5hbWVGb3JOZXdPcHRpb259LFxuICAgICAqICAgICAgICAgXVxuICAgICAqICAgICB9O1xuICAgICAqXG4gICAgICogICAgIGlmIChzZWxlY3RGaWVsZC5oYXNQZXJtaXNzaW9uVG9VcGRhdGVPcHRpb25zKHVwZGF0ZWRPcHRpb25zKSkge1xuICAgICAqICAgICAgICAgYXdhaXQgc2VsZWN0RmllbGQudXBkYXRlT3B0aW9uc0FzeW5jKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVPcHRpb25zQXN5bmMoXG4gICAgICAgIG9wdGlvbnM6IEZpZWxkT3B0aW9ucyxcbiAgICAgICAgb3B0czogVXBkYXRlRmllbGRPcHRpb25zT3B0cyA9IHt9LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9zZGsuX19tdXRhdGlvbnMuYXBwbHlNdXRhdGlvbkFzeW5jKHtcbiAgICAgICAgICAgIHR5cGU6IE11dGF0aW9uVHlwZXMuVVBEQVRFX1NJTkdMRV9GSUVMRF9DT05GSUcsXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhlIGdpdmVuIGRlc2NyaXB0aW9uIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEFjY2VwdHMgcGFydGlhbCBpbnB1dCwgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHtAbGluayB1cGRhdGVEZXNjcmlwdGlvbkFzeW5jfS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHtoYXNQZXJtaXNzaW9uOiB0cnVlfWAgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gdXBkYXRlIHRoZSBzcGVjaWZpZWQgZmllbGQsXG4gICAgICogYHtoYXNQZXJtaXNzaW9uOiBmYWxzZSwgcmVhc29uRGlzcGxheVN0cmluZzogc3RyaW5nfWAgb3RoZXJ3aXNlLiBgcmVhc29uRGlzcGxheVN0cmluZ2AgbWF5IGJlXG4gICAgICogdXNlZCB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1cGRhdGVGaWVsZENoZWNrUmVzdWx0ID0gZmllbGQuY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIXVwZGF0ZUZpZWxkQ2hlY2tSZXN1bHQuaGFzUGVybWlzc2lvbikge1xuICAgICAqICAgICBhbGVydCh1cGRhdGVGaWVsZENoZWNrUmVzdWx0LnJlYXNvbkRpc3BsYXlTdHJpbmcpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yVXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsKTogUGVybWlzc2lvbkNoZWNrUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nkay5fX211dGF0aW9ucy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0RFU0NSSVBUSU9OLFxuICAgICAgICAgICAgdGFibGVJZDogdGhpcy5wYXJlbnRUYWJsZS5pZCxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFsaWFzIGZvciBgY2hlY2tQZXJtaXNzaW9uc0ZvclVwZGF0ZURlc2NyaXB0aW9uKG9wdGlvbnMpLmhhc1Blcm1pc3Npb25gLlxuICAgICAqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBBY2NlcHRzIHBhcnRpYWwgaW5wdXQsIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB7QGxpbmsgdXBkYXRlRGVzY3JpcHRpb25Bc3luY30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYW5VcGRhdGVGaWVsZCA9IGZpZWxkLmhhc1Blcm1pc3Npb25Ub1VwZGF0ZURlc2NyaXB0aW9uKCk7XG4gICAgICpcbiAgICAgKiBpZiAoIWNhblVwZGF0ZUZpZWxkKSB7XG4gICAgICogICAgIGFsZXJ0KCdub3QgYWxsb3dlZCEnKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgaGFzUGVybWlzc2lvblRvVXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUGVybWlzc2lvbnNGb3JVcGRhdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbikuaGFzUGVybWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIFRvIHJlbW92ZSBhbiBleGlzdGluZyBkZXNjcmlwdGlvbiwgcGFzcyBgJydgIGFzIHRoZSBuZXcgZGVzY3JpcHRpb24uXG4gICAgICogYG51bGxgIGlzIGFsc28gYWNjZXB0ZWQgYW5kIHdpbGwgYmUgY29lcmNlZCB0byBgJydgIGZvciBjb25zaXN0ZW5jeSB3aXRoIGZpZWxkIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGZpZWxkLCBvciBpZiBhbiBpbnZhbGlkXG4gICAgICogZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGFjdGlvbiBpcyBhc3luY2hyb25vdXMuIFVubGlrZSB1cGRhdGVzIHRvIGNlbGwgdmFsdWVzLCB1cGRhdGVzIHRvIGZpZWxkIGRlc2NyaXB0aW9ucyBhcmVcbiAgICAgKiAqKm5vdCoqIGFwcGxpZWQgb3B0aW1pc3RpY2FsbHkgbG9jYWxseS4gWW91IG11c3QgYGF3YWl0YCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBiZWZvcmVcbiAgICAgKiByZWx5aW5nIG9uIHRoZSBjaGFuZ2UgaW4geW91ciBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gbmV3IGRlc2NyaXB0aW9uIGZvciB0aGUgZmllbGRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiBhd2FpdCBteVRleHRGaWVsZC51cGRhdGVEZXNjcmlwdGlvbkFzeW5jKCdUaGlzIGlzIGEgdGV4dCBmaWVsZCcpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZURlc2NyaXB0aW9uQXN5bmMoZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2RrLl9fbXV0YXRpb25zLmFwcGx5TXV0YXRpb25Bc3luYyh7XG4gICAgICAgICAgICB0eXBlOiBNdXRhdGlvblR5cGVzLlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT04sXG4gICAgICAgICAgICB0YWJsZUlkOiB0aGlzLnBhcmVudFRhYmxlLmlkLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgY29tcHV0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBBIGZpZWxkIGlzXG4gICAgICogXCJjb21wdXRlZFwiIGlmIGl0J3MgdmFsdWUgaXMgbm90IHNldCBieSB1c2VyIGlucHV0IChlLmcuIGF1dG9OdW1iZXIsIGZvcm11bGEsXG4gICAgICogZXRjLikuIENhbiBiZSB3YXRjaGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlTaW5nbGVMaW5lVGV4dEZpZWxkLmlzQ29tcHV0ZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2cobXlBdXRvTnVtYmVyRmllbGQuaXNDb21wdXRlZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc0NvbXB1dGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICByZXR1cm4gYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuaXNDb21wdXRlZCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoaXMgZmllbGQgaXMgaXRzIHBhcmVudCB0YWJsZSdzIHByaW1hcnkgZmllbGQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIFNob3VsZCBuZXZlciBjaGFuZ2UgYmVjYXVzZSB0aGUgcHJpbWFyeSBmaWVsZCBvZiBhIHRhYmxlIGNhbm5vdCBjaGFuZ2UuXG4gICAgICovXG4gICAgZ2V0IGlzUHJpbWFyeUZpZWxkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PT0gdGhpcy5wYXJlbnRUYWJsZS5wcmltYXJ5RmllbGQuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgaWYgaXQgaGFzIG9uZS4gQ2FuIGJlIHdhdGNoZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2cobXlGaWVsZC5kZXNjcmlwdGlvbik7XG4gICAgICogLy8gPT4gJ1RoaXMgaXMgbXkgZmllbGQnXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2QgaXMgdW50ZXN0ZWQgYmVjYXVzZSBpdHMgaW1wbGVtZW50YXRpb24gcmVzaXN0c1xuICAgIC8vIHRlc3RpbmcgYW5kIGJlY2F1c2UgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgcmVkZXNpZ25lZC5cbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhdmFpbGFibGUgYWdncmVnYXRvcnMgZ2l2ZW4gdGhpcyBmaWVsZCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGRBZ2dyZWdhdG9ycyA9IG15RmllbGQuYXZhaWxhYmxlQWdncmVnYXRvcnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGF2YWlsYWJsZUFnZ3JlZ2F0b3JzKCk6IEFycmF5PEFnZ3JlZ2F0b3I+IHtcbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRvcktleXNTZXQgPSBuZXcgU2V0KFxuICAgICAgICAgICAgYWlydGFibGVJbnRlcmZhY2UuYWdncmVnYXRvcnMuZ2V0QXZhaWxhYmxlQWdncmVnYXRvcktleXNGb3JGaWVsZCh0aGlzLl9kYXRhKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB7YWdncmVnYXRvcnN9ID0gcmVxdWlyZSgnLi9tb2RlbHMnKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyhhZ2dyZWdhdG9ycykuZmlsdGVyKGFnZ3JlZ2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUFnZ3JlZ2F0b3JLZXlzU2V0LmhhcyhhZ2dyZWdhdG9yLmtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZCBpcyB1bnRlc3RlZCBiZWNhdXNlIGl0cyBpbXBsZW1lbnRhdGlvbiByZXNpc3RzXG4gICAgLy8gdGVzdGluZyBhbmQgYmVjYXVzZSBpdCBpcyBleHBlY3RlZCB0byBiZSByZWRlc2lnbmVkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhZ2dyZWdhdG9yIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZ2dyZWdhdG9yIFRoZSBhZ2dyZWdhdG9yIG9iamVjdCBvciBhZ2dyZWdhdG9yIGtleS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHthZ2dyZWdhdG9yc30gZnJvbSAnQGFpcnRhYmxlL2Jsb2Nrcy9tb2RlbHMnO1xuICAgICAqIGNvbnN0IGFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9ycy50b3RhbEF0dGFjaG1lbnRTaXplO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYW4gYWdncmVnYXRvciBvYmplY3RcbiAgICAgKiBjb25zb2xlLmxvZyhteUF0dGFjaG1lbnRGaWVsZC5pc0FnZ3JlZ2F0b3JBdmFpbGFibGUoYWdncmVnYXRvcikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFuIGFnZ3JlZ2F0b3Iga2V5XG4gICAgICogY29uc29sZS5sb2cobXlUZXh0RmllbGQuaXNBZ2dyZWdhdG9yQXZhaWxhYmxlKCd0b3RhbEF0dGFjaG1lbnRTaXplJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaXNBZ2dyZWdhdG9yQXZhaWxhYmxlKGFnZ3JlZ2F0b3I6IEFnZ3JlZ2F0b3IgfCBBZ2dyZWdhdG9yS2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0b3JLZXkgPSB0eXBlb2YgYWdncmVnYXRvciA9PT0gJ3N0cmluZycgPyBhZ2dyZWdhdG9yIDogYWdncmVnYXRvci5rZXk7XG5cbiAgICAgICAgY29uc3QgYWlydGFibGVJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19haXJ0YWJsZUludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRvcktleXMgPSBhaXJ0YWJsZUludGVyZmFjZS5hZ2dyZWdhdG9ycy5nZXRBdmFpbGFibGVBZ2dyZWdhdG9yS2V5c0ZvckZpZWxkKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYXZhaWxhYmxlQWdncmVnYXRvcktleXMuc29tZShrZXkgPT4ga2V5ID09PSBhZ2dyZWdhdG9yS2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBwYXJzZSBhIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJuIGEgdmFsaWQgY2VsbCB2YWx1ZSBmb3IgdGhlIGZpZWxkJ3MgY3VycmVudCBjb25maWcuXG4gICAgICogUmV0dXJucyBgbnVsbGAgaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gcGFyc2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGlucHV0U3RyaW5nID0gJzQyJztcbiAgICAgKiBjb25zdCBjZWxsVmFsdWUgPSBteU51bWJlckZpZWxkLmNvbnZlcnRTdHJpbmdUb0NlbGxWYWx1ZShpbnB1dFN0cmluZyk7XG4gICAgICogY29uc29sZS5sb2coY2VsbFZhbHVlID09PSA0Mik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnZlcnRTdHJpbmdUb0NlbGxWYWx1ZShzdHJpbmc6IHN0cmluZyk6IHVua25vd24ge1xuICAgICAgICBjb25zdCBhaXJ0YWJsZUludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FpcnRhYmxlSW50ZXJmYWNlO1xuICAgICAgICBjb25zdCBhcHBJbnRlcmZhY2UgPSB0aGlzLl9zZGsuX19hcHBJbnRlcmZhY2U7XG5cbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuY29udmVydFN0cmluZ1RvQ2VsbFZhbHVlKFxuICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUZW1wb3JhcmlseSBiYWlsIG91dCBvZiB2YWxpZGF0aW5nIGNvbXB1dGVkIHZhbHVlcyAoc2luY2UgdmFsaWRhdGlvbiB3aWxsIGNyYXNoKVxuICAgICAgICAvLyB3aGlsZSB3ZSB3b3JrIG91dCBpZiB3ZSBhY3R1YWxseSBoYXZlIHRvIHZhbGlkYXRlIG9yIG5vdC4gSWRlYWxseSB3ZSBqdXN0IGRlbGV0ZSBhbGxcbiAgICAgICAgLy8gdGhlIHZhbGlkYXRpb25cbiAgICAgICAgLy8gVE9ETyhlbW1hKTogZGVsZXRlIG1lIG9yIHRpZHkgbWUgdXBcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wdXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8oZW1tYSk6IGRvIHdlIG5lZWQgdG8gdmFsaWRhdGUgaGVyZT9cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGFpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLnZhbGlkYXRlQ2VsbFZhbHVlRm9yVXBkYXRlKFxuICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgY2VsbFZhbHVlLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRoaXMuX2RhdGEsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9fdHJpZ2dlck9uQ2hhbmdlRm9yRGlydHlQYXRocyhkaXJ0eVBhdGhzOiBGbG93QW55T2JqZWN0KSB7XG4gICAgICAgIC8vIEFsd2F5cyBjbGVhciB0aGUgY2FjaGVkIGNvbmZpZyB3aGVuIGFueXRoaW5nIG9uIHRoZSBmaWVsZCBkYXRhIG1vZGVsIGNoYW5nZXNcbiAgICAgICAgdGhpcy5fY2xlYXJDYWNoZWRDb25maWcoKTtcblxuICAgICAgICBpZiAoZGlydHlQYXRocy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVGaWVsZEtleXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlRmllbGRLZXlzLnR5cGUpO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2Ugb25seSB0cmlnZ2VyIHRoaXMgd2hlblxuICAgICAgICAgICAgLy8gd2Uga25vdyBpc0NvbXB1dGVkIGNoYW5nZWQuXG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShXYXRjaGFibGVGaWVsZEtleXMuaXNDb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcnR5UGF0aHMudHlwZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKFdhdGNoYWJsZUZpZWxkS2V5cy5vcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlydHlQYXRocy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoV2F0Y2hhYmxlRmllbGRLZXlzLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmllbGQ7XG4iXX0=
@@ -245,19 +245,13 @@ function (_RecordQueryResult) {
245
245
  while (1) {
246
246
  switch (_context2.prev = _context2.next) {
247
247
  case 0:
248
- this._parentQueryResult.__groupedRecordQueryResultPool.registerObjectForReuseStrong(this); // Ensure we invalidate our memoized computed recordIds whenever a relevant hook changes
249
- // TODO: (SeanKeenan) At the moment this should never be relevant, because groups are recreated
250
- // anytime the groups change - but this is how it should work once groups persist AND
251
- // watching recordIds only changes if records in this group change.
252
- // In the meantime this does ensure that a deleted GroupedRecordQuery with stale recordIds
253
- // doesn't return the cached array.
248
+ // TODO: This entire class assumes it is torn down and re-created by the parent whenever
249
+ // a change to the group is made.
250
+ this._parentQueryResult.__groupedRecordQueryResultPool.registerObjectForReuseStrong(this);
254
251
 
255
-
256
- this.watch(['recordIds', 'groups', 'groupLevels'], this._invalidateComputedRecordIds, this);
257
- this.watch(['recordIds'], this._invalidateRecordIdsSet, this);
258
252
  return _context2.abrupt("return", this._getChangedKeysOnLoad());
259
253
 
260
- case 4:
254
+ case 2:
261
255
  case "end":
262
256
  return _context2.stop();
263
257
  }
@@ -269,10 +263,7 @@ function (_RecordQueryResult) {
269
263
  }, {
270
264
  key: "_unloadData",
271
265
  value: function _unloadData() {
272
- // Ensure we invalidate our memoized computed recordIds whenever a relevant hook changes
273
- this.unwatch(['recordIds', 'groups', 'groupLevels'], this._invalidateComputedRecordIds, this);
274
- this.unwatch(['recordIds'], this._invalidateRecordIdsSet, this); // Invalidate both of the caches, as this object can no longer be accessed
275
-
266
+ // Invalidate both of the caches, as this object can no longer be accessed
276
267
  this._invalidateComputedRecordIds();
277
268
 
278
269
  this._invalidateRecordIdsSet();
@@ -472,4 +463,5 @@ function (_RecordQueryResult) {
472
463
 
473
464
  (0, _defineProperty2.default)(GroupedRecordQueryResult, "_className", 'GroupedRecordQueryResult');
474
465
  var _default = GroupedRecordQueryResult;
475
- exports.default = _default;
466
+ exports.default = _default;
467
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvZ3JvdXBlZF9yZWNvcmRfcXVlcnlfcmVzdWx0LnRzIl0sIm5hbWVzIjpbIkdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCIsInBhcmVudFF1ZXJ5UmVzdWx0IiwiZ3JvdXBEYXRhIiwiZ3JvdXBMZXZlbCIsIm5vcm1hbGl6ZWRPcHRzIiwic2RrIiwiX19ncm91cGVkUmVjb3JkUXVlcnlSZXN1bHRQb29sIiwiT2JqZWN0UG9vbCIsIl9wYXJlbnRRdWVyeVJlc3VsdCIsIl9ncm91cERhdGEiLCJfZ3JvdXBMZXZlbHMiLCJncm91cExldmVsRGF0YVNsaWNlZEZvckNoaWxkcmVuIiwic2xpY2UiLCJfb3JkZXJlZENoaWxkcmVuR3JvdXBzIiwiZ3JvdXBzIiwibWFwIiwic2luZ2xlR3JvdXBEYXRhIiwiZ3JvdXAiLCJnZXRPYmplY3RGb3JSZXVzZSIsImxvYWREYXRhQXN5bmMiLCJfZGF0YSIsInZpc2libGVSZWNvcmRJZHMiLCJyZWNvcmRJZHMiLCJwdXNoIiwiX29yZGVyZWRSZWNvcmRJZHMiLCJrZXlzIiwiY2FsbGJhY2siLCJjb250ZXh0IiwidmFsaWRLZXlzIiwid2F0Y2giLCJ1bndhdGNoIiwiX2dldENoYW5nZWRLZXlzT25Mb2FkIiwicmVnaXN0ZXJPYmplY3RGb3JSZXVzZVN0cm9uZyIsIl9pbnZhbGlkYXRlQ29tcHV0ZWRSZWNvcmRJZHMiLCJfaW52YWxpZGF0ZVJlY29yZElkc1NldCIsIl91bmxvYWRDaGlsZHJlbkdyb3Vwc0lmTmVlZGVkIiwidW5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nIiwidW5sb2FkRGF0YSIsIl9yZWNvcmRJZHNTZXQiLCJyZWNvcmRJZHNTZXQiLCJyZWNvcmRJZCIsImdyb3VwTGV2ZWxzIiwiZmllbGRJZCIsInBhcmVudFRhYmxlIiwiZ2V0RmllbGRCeUlkIiwiaXNEYXRhTG9hZGVkIiwiX2NvbXB1dGVSZWNvcmRJZHMiLCJmaWVsZHMiLCJfc2VyaWFsaXplZE9wdHMiLCJpZCIsIl9kYXRhT3JOdWxsSWZEZWxldGVkIiwiUmVjb3JkUXVlcnlSZXN1bHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUE7O0FBSUE7O0FBT0E7O0FBZkE7O0FBQTBEOztBQTBCMUQ7Ozs7Ozs7Ozs7SUFVTUEsd0I7Ozs7O0FBQ0Y7O0FBR0E7O0FBR0E7O0FBR0E7Ozs7OztBQVFBOztBQUNBO0FBR0E7O0FBQ0E7QUFHQTs7QUFHQTs7QUFNQTtBQUNBLG9DQUNJQyxpQkFESixFQUVJQyxTQUZKLEVBR0lDLFVBSEosRUFJSUMsY0FKSixFQUtJQyxHQUxKLEVBTUU7QUFBQTs7QUFBQTtBQUNFLDhIQUFNQSxHQUFOLEVBQVdELGNBQVg7QUFERjtBQUFBO0FBQUE7QUFBQTtBQUFBLGdHQWxCbUQsSUFrQm5EO0FBQUEsb0dBZmtELElBZWxEO0FBQUE7QUFHRSxVQUFLRSw4QkFBTCxHQUFzQyxJQUFJQyxvQkFBSixDQUFlUCx3QkFBZixDQUF0QztBQUNBLFVBQUtRLGtCQUFMLEdBQTBCUCxpQkFBMUI7QUFDQSxVQUFLUSxVQUFMLEdBQWtCUCxTQUFsQjtBQUNBLFVBQUtRLFlBQUwsR0FBb0JQLFVBQXBCOztBQUNBLFFBQU1RLCtCQUErQixHQUFHLE1BQUtELFlBQUwsQ0FBa0JFLEtBQWxCLENBQXdCLENBQXhCLENBQXhDOztBQUNBLFVBQUtDLHNCQUFMLEdBQThCWCxTQUFTLENBQUNZLE1BQVYsR0FDeEJaLFNBQVMsQ0FBQ1ksTUFBVixDQUFpQkMsR0FBakIsQ0FBcUJDLGVBQWUsSUFBSTtBQUNwQyxVQUFNQyxLQUFLLEdBQUcsTUFBS1gsOEJBQUwsQ0FBb0NZLGlCQUFwQyw4Q0FFVkYsZUFGVSxFQUdWTCwrQkFIVSxFQUlWUCxjQUpVLEVBS1ZDLEdBTFUsQ0FBZCxDQURvQyxDQVFwQztBQUNBOzs7QUFDQVksTUFBQUEsS0FBSyxDQUFDRSxhQUFOO0FBQ0EsYUFBT0YsS0FBUDtBQUNILEtBWkQsQ0FEd0IsR0FjeEIsSUFkTjtBQVJGO0FBdUJEO0FBRUQ7Ozs7Ozs7O0FBMkNBOzs7Ozt3Q0FLNkM7QUFDekM7QUFDQSxVQUFJLENBQUMsS0FBS0gsTUFBVixFQUFrQjtBQUFBOztBQUNkO0FBQ0E7QUFDQTtBQUNBLHdDQUFPLEtBQUtNLEtBQUwsQ0FBV2xCLFNBQVgsQ0FBcUJtQixnQkFBNUIseUVBQWdELEVBQWhEO0FBQ0gsT0FQd0MsQ0FTekM7OztBQUNBLFVBQUlDLFNBQTBCLEdBQUcsRUFBakM7QUFWeUM7QUFBQTtBQUFBOztBQUFBO0FBV3pDLDZCQUFvQixLQUFLUixNQUF6Qiw4SEFBaUM7QUFBQSxjQUF0QkcsS0FBc0I7QUFDN0JLLFVBQUFBLFNBQVMsQ0FBQ0MsSUFBVixDQUFlLEdBQUdOLEtBQUssQ0FBQ0ssU0FBeEI7QUFDSDtBQWJ3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQWN6QyxhQUFPQSxTQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7O21EQU1xQztBQUNqQyxXQUFLRSxpQkFBTCxHQUF5QixJQUF6QjtBQUNIO0FBRUQ7Ozs7Ozs7OztBQTBCQTswQkFFSUMsSSxFQUNBQyxRLEVBQ0FDLE8sRUFDb0M7QUFDcEM7QUFDQTtBQUNBLFVBQU1DLFNBQVMsR0FBRyxLQUFLcEIsa0JBQUwsQ0FBd0JxQixLQUF4QixDQUE4QkosSUFBOUIsRUFBb0NDLFFBQXBDLEVBQThDQyxPQUE5QyxDQUFsQjs7QUFDQSxhQUFPQyxTQUFQO0FBQ0g7QUFFRDs7Ozs0QkFFSUgsSSxFQUNBQyxRLEVBQ0FDLE8sRUFDb0M7QUFDcEMsYUFBTyxLQUFLbkIsa0JBQUwsQ0FBd0JzQixPQUF4QixDQUFnQ0wsSUFBaEMsRUFBc0NDLFFBQXRDLEVBQWdEQyxPQUFoRCxDQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBOzs7OzRDQUM4RDtBQUMxRCxhQUFPLEtBQUtuQixrQkFBTCxDQUF3QnVCLHFCQUF4QixFQUFQO0FBQ0g7QUFFRDs7Ozs7Ozs7O0FBRUk7QUFDQTtBQUNBLG1CQUFLdkIsa0JBQUwsQ0FBd0JGLDhCQUF4QixDQUF1RDBCLDRCQUF2RCxDQUFvRixJQUFwRjs7Z0RBQ08sS0FBS0QscUJBQUwsRTs7Ozs7Ozs7O0FBR1g7Ozs7a0NBQ2M7QUFDVjtBQUNBLFdBQUtFLDRCQUFMOztBQUNBLFdBQUtDLHVCQUFMOztBQUVBLFdBQUtDLDZCQUFMOztBQUNBLFdBQUszQixrQkFBTCxDQUF3QkYsOEJBQXhCLENBQXVEOEIsOEJBQXZELENBQXNGLElBQXRGO0FBQ0g7QUFFRDs7Ozs7QUFnQ0E7b0RBQ2dDO0FBQzVCLFVBQUksS0FBS3ZCLHNCQUFULEVBQWlDO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQzdCLGdDQUFvQixLQUFLQSxzQkFBekIsbUlBQWlEO0FBQUEsZ0JBQXRDSSxLQUFzQztBQUM3Q0EsWUFBQUEsS0FBSyxDQUFDb0IsVUFBTjtBQUNIO0FBSDRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJaEM7QUFDSjtBQUVEOzs7OzhDQUMwQjtBQUN0QixXQUFLQyxhQUFMLEdBQXFCLElBQXJCO0FBQ0g7QUFFRDs7OztpREFDNkI7QUFDekI7QUFDQSxVQUFJLENBQUMsS0FBS0EsYUFBVixFQUF5QjtBQUNyQixZQUFNQyxZQUF1QyxHQUFHLEVBQWhEO0FBRHFCO0FBQUE7QUFBQTs7QUFBQTtBQUVyQixnQ0FBdUIsS0FBS2pCLFNBQTVCLG1JQUF1QztBQUFBLGdCQUE1QmtCLFFBQTRCO0FBQ25DRCxZQUFBQSxZQUFZLENBQUNDLFFBQUQsQ0FBWixHQUF5QixJQUF6QjtBQUNIO0FBSm9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBS3JCLGFBQUtGLGFBQUwsR0FBcUJDLFlBQXJCO0FBQ0g7O0FBRUQsYUFBTyxLQUFLRCxhQUFaO0FBQ0g7Ozt3QkE3TW9EO0FBQ2pELGFBQU8sS0FBS3pCLHNCQUFaO0FBQ0g7QUFFRDs7Ozt3QkFDdUM7QUFDbkMsYUFBTyxLQUFLTyxLQUFMLENBQVdxQixXQUFYLENBQXVCLENBQXZCLENBQVA7QUFDSDtBQUVEOzs7Ozs7d0JBR3VCO0FBQ25CLGFBQU8sS0FBS3RDLFVBQUwsQ0FBZ0J1QyxPQUF2QjtBQUNIO0FBRUQ7Ozs7Ozt3QkFHbUI7QUFDZixhQUFPLEtBQUtDLFdBQUwsQ0FBaUJDLFlBQWpCLENBQThCLEtBQUtGLE9BQW5DLENBQVA7QUFDSCxLLENBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7d0JBSXlCO0FBQ3JCLGFBQU8sS0FBS2xDLGtCQUFMLENBQXdCbUMsV0FBL0I7QUFDSDs7O3dCQXVDd0M7QUFDckMsa0NBQVUsS0FBS0UsWUFBZixFQUE2Qiw2Q0FBN0I7O0FBRUEsVUFBSSxLQUFLckIsaUJBQUwsS0FBMkIsSUFBL0IsRUFBcUM7QUFDakMsYUFBS0EsaUJBQUwsR0FBeUIsS0FBS3NCLGlCQUFMLEVBQXpCO0FBQ0g7O0FBRUQsYUFBTyxLQUFLdEIsaUJBQVo7QUFDSDtBQUVEOzs7Ozs7Ozs7d0JBTWtDO0FBQzlCLGtDQUFVLEtBQUtxQixZQUFmLEVBQTZCLDZDQUE3QjtBQUNBLGFBQU8sS0FBS3JDLGtCQUFMLENBQXdCdUMsTUFBL0I7QUFDSDs7O3dCQW9EZTtBQUNaO0FBQ0EsdUJBQVUsS0FBS0MsZUFBZixlQUFtQyxLQUFLQyxFQUF4QztBQUNIO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O3dCQVdnRTtBQUM1RCxVQUFJLEtBQUt6QyxrQkFBTCxDQUF3QjBDLG9CQUF4QixLQUFpRCxJQUFyRCxFQUEyRDtBQUN2RCxlQUFPLElBQVA7QUFDSDs7QUFDRCxhQUFPO0FBQ0hoRCxRQUFBQSxTQUFTLEVBQUUsS0FBS08sVUFEYjtBQUVIZ0MsUUFBQUEsV0FBVyxFQUFFLEtBQUsvQjtBQUZmLE9BQVA7QUFJSDtBQUVEOzs7O3dCQUM0QjtBQUN4QixhQUFPLEtBQUtGLGtCQUFMLENBQXdCcUMsWUFBL0I7QUFDSDs7O0VBdlBrQ00sNEI7OzhCQUFqQ25ELHdCLGdCQUVrQiwwQjtlQW9SVEEsd0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAYWlydGFibGUvYmxvY2tzL21vZGVsczogUmVjb3JkUXVlcnlSZXN1bHQgKi8gLyoqICovXG5pbXBvcnQge0ZpZWxkSWR9IGZyb20gJy4uL3R5cGVzL2ZpZWxkJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7Rmxvd0FueUZ1bmN0aW9uLCBGbG93QW55T2JqZWN0LCBPYmplY3RNYXB9IGZyb20gJy4uL3ByaXZhdGVfdXRpbHMnO1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7UmVjb3JkSWR9IGZyb20gJy4uL3R5cGVzL3JlY29yZCc7XG5pbXBvcnQge0dyb3VwRGF0YX0gZnJvbSAnLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQge05vcm1hbGl6ZWRHcm91cExldmVsfSBmcm9tICcuLi90eXBlcy9haXJ0YWJsZV9pbnRlcmZhY2UnO1xuaW1wb3J0IFJlY29yZFF1ZXJ5UmVzdWx0LCB7XG4gICAgV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXksXG4gICAgTm9ybWFsaXplZFJlY29yZFF1ZXJ5UmVzdWx0T3B0cyxcbn0gZnJvbSAnLi9yZWNvcmRfcXVlcnlfcmVzdWx0JztcblxuaW1wb3J0IFRhYmxlIGZyb20gJy4vdGFibGUnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IE9iamVjdFBvb2wgZnJvbSAnLi9vYmplY3RfcG9vbCc7XG5pbXBvcnQgVGFibGVPclZpZXdRdWVyeVJlc3VsdCBmcm9tICcuL3RhYmxlX29yX3ZpZXdfcXVlcnlfcmVzdWx0JztcblxuLyoqIEBoaWRkZW4gKi9cbi8vIEV2ZW4gdGhvdWdoIHdlIGRvbid0IGxvYWQgdGhlIGRhdGEsIHdlIHN0aWxsIGFjY2VzcyBpdCB0aHJvdWdoIGAuX2RhdGFgIHNvIHRoYXRcbi8vIHdlIGNhbiBiZSBlbnN1cmVkIHRoZSBtb2RlbCBoYXNuJ3QgYmVlbiBkZWxldGVkLlxuaW50ZXJmYWNlIEdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdERhdGEge1xuICAgIGdyb3VwRGF0YTogR3JvdXBEYXRhO1xuICAgIGdyb3VwTGV2ZWxzOiBSZWFkb25seUFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsPjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ3JvdXAgb2YgcmVjb3JkcyByZXR1cm5lZCBmcm9tIGEgZ3JvdXAgcXVlcnkuIFNlZSB7QGxpbmsgUmVjb3JkUXVlcnlSZXN1bHR9IGZvciBtYWluXG4gKiBkb2N1bWVudGF0aW9uLlxuICpcbiAqIERvIG5vdCBpbnN0YW50aWF0ZS4gWW91IGNhbiBnZXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYnkgY2FsbGluZ1xuICogYHJlY29yZFF1ZXJ5UmVzdWx0Lmdyb3Vwc2AuXG4gKlxuICogQGRvY3NQYXRoIG1vZGVscy9xdWVyeSByZXN1bHRzL0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFxuICogQGhpZGRlblxuICovXG5jbGFzcyBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQgZXh0ZW5kcyBSZWNvcmRRdWVyeVJlc3VsdDxHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHREYXRhPiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBfY2xhc3NOYW1lID0gJ0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCc7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3BhcmVudFF1ZXJ5UmVzdWx0OiBUYWJsZU9yVmlld1F1ZXJ5UmVzdWx0IHwgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0O1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9ncm91cERhdGE6IEdyb3VwRGF0YTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaW5jbHVkZXMgZ3JvdXBMZXZlbCBmb3IgYWxsIGNoaWxkcmVuICYgcGFyZW50IGdyb3VwZWQgbGF5ZXJzLCB0aGUgZ2V0dGVyXG4gICAgICogcmV0dXJucyBvbmx5IHRoZSBncm91cExldmVscyBmb3IgdGhpcyBsYXllci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9ncm91cExldmVsczogUmVhZG9ubHlBcnJheTxOb3JtYWxpemVkR3JvdXBMZXZlbD47XG5cbiAgICAvLyBUaGlzIGlzIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZ3JvdXBzLlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb3JkZXJlZENoaWxkcmVuR3JvdXBzOiBBcnJheTxHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQ+IHwgbnVsbDtcblxuICAgIC8vIGxhemlseSBnZW5lcmF0ZWQgc2V0IG9mIHJlY29yZCBpZHNcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlY29yZElkc1NldDoge1trZXk6IHN0cmluZ106IHRydWUgfCB2b2lkfSB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gbGF6aWx5IGdlbmVyYXRlZCBvcmRlcmVkIGFycmF5IG9mIHJlY29yZElkc1xuICAgIF9vcmRlcmVkUmVjb3JkSWRzOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbDogT2JqZWN0UG9vbDxcbiAgICAgICAgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0LFxuICAgICAgICB0eXBlb2YgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0XG4gICAgPjtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGFyZW50UXVlcnlSZXN1bHQ6IFRhYmxlT3JWaWV3UXVlcnlSZXN1bHQgfCBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHQsXG4gICAgICAgIGdyb3VwRGF0YTogR3JvdXBEYXRhLFxuICAgICAgICBncm91cExldmVsOiBSZWFkb25seUFycmF5PE5vcm1hbGl6ZWRHcm91cExldmVsPixcbiAgICAgICAgbm9ybWFsaXplZE9wdHM6IE5vcm1hbGl6ZWRSZWNvcmRRdWVyeVJlc3VsdE9wdHMsXG4gICAgICAgIHNkazogU2RrLFxuICAgICkge1xuICAgICAgICBzdXBlcihzZGssIG5vcm1hbGl6ZWRPcHRzKTtcblxuICAgICAgICB0aGlzLl9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbCA9IG5ldyBPYmplY3RQb29sKEdyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCk7XG4gICAgICAgIHRoaXMuX3BhcmVudFF1ZXJ5UmVzdWx0ID0gcGFyZW50UXVlcnlSZXN1bHQ7XG4gICAgICAgIHRoaXMuX2dyb3VwRGF0YSA9IGdyb3VwRGF0YTtcbiAgICAgICAgdGhpcy5fZ3JvdXBMZXZlbHMgPSBncm91cExldmVsO1xuICAgICAgICBjb25zdCBncm91cExldmVsRGF0YVNsaWNlZEZvckNoaWxkcmVuID0gdGhpcy5fZ3JvdXBMZXZlbHMuc2xpY2UoMSk7XG4gICAgICAgIHRoaXMuX29yZGVyZWRDaGlsZHJlbkdyb3VwcyA9IGdyb3VwRGF0YS5ncm91cHNcbiAgICAgICAgICAgID8gZ3JvdXBEYXRhLmdyb3Vwcy5tYXAoc2luZ2xlR3JvdXBEYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fX2dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFBvb2wuZ2V0T2JqZWN0Rm9yUmV1c2UoXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVHcm91cERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMZXZlbERhdGFTbGljZWRGb3JDaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkT3B0cyxcbiAgICAgICAgICAgICAgICAgICAgICBzZGssXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXdhaXQgdGhlIGxvYWRpbmcsIGxldCBvdGhlcnMgY2hlY2sgaXNEYXRhTG9hZGVkLlxuICAgICAgICAgICAgICAgICAgLy8gKGl0IGRvZXNuJ3QgdGFrZSBhbnkgdGltZSBhbnl3YXkpLiBMb2FkaW5nIGFsc28gc3Ryb25nIHJldGFpbnMuXG4gICAgICAgICAgICAgICAgICBncm91cC5sb2FkRGF0YUFzeW5jKCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjaGlsZHJlbiBncm91cHMgb2YgdGhpcyBncm91cCAoaWYgYW55IGV4aXN0KVxuICAgICAqL1xuICAgIGdldCBncm91cHMoKTogQXJyYXk8R3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JkZXJlZENoaWxkcmVuR3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgZ3JvdXBMZXZlbCgpOiBOb3JtYWxpemVkR3JvdXBMZXZlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdyb3VwTGV2ZWxzWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkSWQgdGhhdCB0aGlzIGdyb3VwIGlzIGdyb3VwZWQgYnlcbiAgICAgKi9cbiAgICBnZXQgZmllbGRJZCgpOiBGaWVsZElkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBMZXZlbC5maWVsZElkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZpZWxkIHRoYXQgdGhpcyBncm91cCBpcyBncm91cGVkIGJ5XG4gICAgICovXG4gICAgZ2V0IGZpZWxkKCk6IEZpZWxkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50VGFibGUuZ2V0RmllbGRCeUlkKHRoaXMuZmllbGRJZCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyAoU2VhbktlZW5hbikgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW4ndCBhbHdheXMgaXRlcmF0ZSBkb3duIGFuZCBmaW5kXG4gICAgLy8gYSByZWNvcmQsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBcImVtcHR5IGdyb3Vwc1wiLlxuICAgIC8vIGdldFZhbHVlKCkge1xuICAgIC8vIH1cblxuICAgIC8vIFRPRE8gKFNlYW5LZWVuYW4pXG4gICAgLy8gZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWwgKHNpbmNlIHdlIG1heSBub3QgYmUgYWJsZSB0byByZXR1cm4gcGFyZW50IG1vZGVsIGluc3RhbmNlcyBpbiB0aGUgaW1tdXRhYmxlIG1vZGVscyB3b3JsZClcbiAgICAgKiBUaGUgdGFibGUgdGhhdCByZWNvcmRzIGluIHRoaXMgUmVjb3JkUXVlcnlSZXN1bHQgYXJlIHBhcnQgb2ZcbiAgICAgKi9cbiAgICBnZXQgcGFyZW50VGFibGUoKTogVGFibGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQucGFyZW50VGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZ2V0cyBhbGwgcmVjb3JkSWRzIGluIHRoZSBjaGlsZHJlbiBncm91cHMsIGtlZXBpbmcgcmVjb3JkSWRzIGluIGdyb3VwIG9yZGVyXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY29tcHV0ZVJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBhIGxlYWYgbm9kZSwgcmV0dXJuIHRoZSByYXcgcmVjb3JkSWRzXG4gICAgICAgIGlmICghdGhpcy5ncm91cHMpIHtcbiAgICAgICAgICAgIC8vIFR5cGVzY3JpcHQgY2FuJ3QgaW5mZXIgaWYgZ3JvdXBzIGlzIGVtcHR5IHZpc2libGVSZWNvcmRJZHMgbXVzdCBiZSBwb3B1bGF0ZWRcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgZXh0cmEgc2FmZXR5IGlzbid0IGJhZC4gKGlzdGFuYnVsIGFsc28gY2FuJ3QgaWdub3JlIGp1c3QgdGhlID8/KVxuICAgICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdyb3VwRGF0YS52aXNpYmxlUmVjb3JkSWRzID8/IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGJ1aWxkIHRoZSByZWNvcmRJZCdzIGZyb20gY2hpbGRyZW4gZ3JvdXBzXG4gICAgICAgIGxldCByZWNvcmRJZHM6IEFycmF5PFJlY29yZElkPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgICAgICByZWNvcmRJZHMucHVzaCguLi5ncm91cC5yZWNvcmRJZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmRJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW55dGltZSB0aGUgcmVjb3JkSWRzIHRvIHJldHVybiBjb3VsZCBoYXZlIGNoYW5nZWQsIHdlIGNsZWFyIHRoaXMgc28gdGhhdFxuICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgcmVxdWVzdHMgcmVjb3JkSWRzIGl0IHJlY29tcHV0ZXNcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pbnZhbGlkYXRlQ29tcHV0ZWRSZWNvcmRJZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29yZGVyZWRSZWNvcmRJZHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9yZGVyZWQgYXJyYXkgb2YgYWxsIHRoZSByZWNvcmQgaWRzIGluc2lkZSB0aGlzIGdyb3VwLCBpbiBncm91cCBvcmRlci5cbiAgICAgKiBUaGlzIHJldHVybnMgYWxsIHJlY29yZElkcyBvZiBhbGwgY2hpbGRyZW4gZ3JvdXBzIChpbiBncm91cGVkIG9yZGVyKS5cbiAgICAgKiBXYXRjaGFibGUuXG4gICAgICovXG4gICAgZ2V0IHJlY29yZElkcygpOiBSZWFkb25seUFycmF5PFJlY29yZElkPiB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzRGF0YUxvYWRlZCwgJ0dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdCBkYXRhIGlzIG5vdCBsb2FkZWQnKTtcblxuICAgICAgICBpZiAodGhpcy5fb3JkZXJlZFJlY29yZElkcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fb3JkZXJlZFJlY29yZElkcyA9IHRoaXMuX2NvbXB1dGVSZWNvcmRJZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlcmVkUmVjb3JkSWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZHMgdGhhdCB3ZXJlIHVzZWQgdG8gY3JlYXRlIHRoZSBwYXJlbnQgUmVjb3JkUXVlcnlSZXN1bHQgdGhhdCBjcmVhdGVkIHRoaXMgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0LlxuICAgICAqIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgZmllbGQvZmllbGRJZCBwcm9wZXJ0eSAtIHdoaWNoIGlzIHRoZSBmaWVsZCB0aGlzIGdyb3VwaW5nIGlzIGJhc2VkIHVwb24uXG4gICAgICogTnVsbCBpZiBmaWVsZHMgd2VyZSBub3Qgc3BlY2lmaWVkLCB3aGljaCBtZWFucyB0aGUgUmVjb3JkUXVlcnlSZXN1bHRcbiAgICAgKiB3aWxsIGxvYWQgYWxsIGZpZWxkcyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZD4gfCBudWxsIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEYXRhTG9hZGVkLCAnR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0IGRhdGEgaXMgbm90IGxvYWRlZCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQuZmllbGRzO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIHdhdGNoKFxuICAgICAgICBrZXlzOiBXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleSB8IFJlYWRvbmx5QXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+LFxuICAgICAgICBjYWxsYmFjazogRmxvd0FueUZ1bmN0aW9uLFxuICAgICAgICBjb250ZXh0PzogRmxvd0FueU9iamVjdCB8IG51bGwsXG4gICAgKTogQXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+IHtcbiAgICAgICAgLy8gVE9ETyAoU2VhbktlZW5hbik6IFRoaXMgcHJvdmlkZXMgZXZlbnRzIGV2ZW4gaWYgdGhleSBvY2N1ciBvdXRzaWRlIG9mIHRoaXMgZ3JvdXBcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpc3N1ZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSB0aGlzIEFQSSBpcyBtYWRlIHB1YmxpY1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC53YXRjaChrZXlzLCBjYWxsYmFjaywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB2YWxpZEtleXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXG4gICAgdW53YXRjaChcbiAgICAgICAga2V5czogV2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXkgfCBSZWFkb25seUFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PixcbiAgICAgICAgY2FsbGJhY2s6IEZsb3dBbnlGdW5jdGlvbixcbiAgICAgICAgY29udGV4dD86IEZsb3dBbnlPYmplY3QgfCBudWxsLFxuICAgICk6IEFycmF5PFdhdGNoYWJsZVJlY29yZFF1ZXJ5UmVzdWx0S2V5PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC51bndhdGNoKGtleXMsIGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXRkb2MgKi9cbiAgICBhc3luYyBsb2FkRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBzdXBlci5sb2FkRGF0YUFzeW5jKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRDaGFuZ2VkS2V5c09uTG9hZCgpOiBBcnJheTxXYXRjaGFibGVSZWNvcmRRdWVyeVJlc3VsdEtleT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50UXVlcnlSZXN1bHQuX2dldENoYW5nZWRLZXlzT25Mb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGFzeW5jIF9sb2FkRGF0YUFzeW5jKCk6IFByb21pc2U8QXJyYXk8V2F0Y2hhYmxlUmVjb3JkUXVlcnlSZXN1bHRLZXk+PiB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgZW50aXJlIGNsYXNzIGFzc3VtZXMgaXQgaXMgdG9ybiBkb3duIGFuZCByZS1jcmVhdGVkIGJ5IHRoZSBwYXJlbnQgd2hlbmV2ZXJcbiAgICAgICAgLy8gYSBjaGFuZ2UgdG8gdGhlIGdyb3VwIGlzIG1hZGUuXG4gICAgICAgIHRoaXMuX3BhcmVudFF1ZXJ5UmVzdWx0Ll9fZ3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0UG9vbC5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q2hhbmdlZEtleXNPbkxvYWQoKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3VubG9hZERhdGEoKSB7XG4gICAgICAgIC8vIEludmFsaWRhdGUgYm90aCBvZiB0aGUgY2FjaGVzLCBhcyB0aGlzIG9iamVjdCBjYW4gbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkXG4gICAgICAgIHRoaXMuX2ludmFsaWRhdGVDb21wdXRlZFJlY29yZElkcygpO1xuICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUmVjb3JkSWRzU2V0KCk7XG5cbiAgICAgICAgdGhpcy5fdW5sb2FkQ2hpbGRyZW5Hcm91cHNJZk5lZWRlZCgpO1xuICAgICAgICB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5fX2dyb3VwZWRSZWNvcmRRdWVyeVJlc3VsdFBvb2wudW5yZWdpc3Rlck9iamVjdEZvclJldXNlU3Ryb25nKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX19wb29sS2V5KCkge1xuICAgICAgICAvLyBUT0RPIChTZWFuS2VlbmFuKSBXZSBkb24ndCBoYXZlIGFuIGFjdHVhbCBncm91cElkLCBidXQgd2hpbGUgaWQgaXMgdW5pcXVlOyB0aGlzIHNob3VsZCBoYXZlIGlkIHJlbW92ZWRcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuX3NlcmlhbGl6ZWRPcHRzfTo6JHt0aGlzLmlkfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtb2RlbCBkb2Vzbid0IGFjdHVhbGx5IGxvYWQgZGF0YSwgYnV0IGl0IGRvZXMgdXNlIHRoZSBgX2RhdGFgXG4gICAgICogcHJvcGVydHkgc28gdGhhdCBjaGVja3MgZm9yIG1vZGVsIGRlbGV0aW9uIGJlaGF2ZSBhcHByb3ByaWF0ZWx5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBjb25zaWRlcmVkIGRlbGV0ZWQgaWYgdGhlIHBhcmVudCBxdWVyeSByZXN1bHQgaGFzIGJlZW4gZGVsZXRlZC5cbiAgICAgKlxuICAgICAqIFdlIHJldHVybiBncm91cERhdGEsIGluc3RlYWQgb2YgcHJlY29tcHV0aW5nIGFsbCBjaGlsZHJlbiBncm91cHMgYmVjYXVzZVxuICAgICAqIHdlIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uK2NhY2hpbmcgbGF6aWx5IG9uIHJlcXVlc3RcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBfZGF0YU9yTnVsbElmRGVsZXRlZCgpOiBHcm91cGVkUmVjb3JkUXVlcnlSZXN1bHREYXRhIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5fZGF0YU9yTnVsbElmRGVsZXRlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdyb3VwRGF0YTogdGhpcy5fZ3JvdXBEYXRhLFxuICAgICAgICAgICAgZ3JvdXBMZXZlbHM6IHRoaXMuX2dyb3VwTGV2ZWxzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAgIGdldCBpc0RhdGFMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRRdWVyeVJlc3VsdC5pc0RhdGFMb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF91bmxvYWRDaGlsZHJlbkdyb3Vwc0lmTmVlZGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fb3JkZXJlZENoaWxkcmVuR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX29yZGVyZWRDaGlsZHJlbkdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGdyb3VwLnVubG9hZERhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaW52YWxpZGF0ZVJlY29yZElkc1NldCgpIHtcbiAgICAgICAgdGhpcy5fcmVjb3JkSWRzU2V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dldE9yR2VuZXJhdGVSZWNvcmRJZHNTZXQoKSB7XG4gICAgICAgIC8vIFRPRE8gKFNlYW5LZWVuYW4pOiB0aGlzIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgaW4gdGFibGVPclZpZXdRdWVyeVJlc3VsdFxuICAgICAgICBpZiAoIXRoaXMuX3JlY29yZElkc1NldCkge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkSWRzU2V0OiBPYmplY3RNYXA8UmVjb3JkSWQsIHRydWU+ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlY29yZElkIG9mIHRoaXMucmVjb3JkSWRzKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkSWRzU2V0W3JlY29yZElkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZWNvcmRJZHNTZXQgPSByZWNvcmRJZHNTZXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fcmVjb3JkSWRzU2V0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR3JvdXBlZFJlY29yZFF1ZXJ5UmVzdWx0O1xuIl19