@airtable/blocks 1.9.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 (291) hide show
  1. package/CHANGELOG.md +10 -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 +4 -2
  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 +5 -14
  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 +2 -1
  19. package/dist/cjs/models/mutations.js +20 -163
  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 +10 -8
  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 +42 -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 +57 -11
  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 +2 -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 +2 -1
  220. package/dist/cjs/viewport.js +2 -1
  221. package/dist/cjs/warning.js +2 -1
  222. package/dist/cjs/watchable.js +17 -2
  223. package/dist/types/src/models/base.d.ts +2 -1
  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 +3 -13
  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/mutations.d.ts.map +1 -1
  233. package/dist/types/src/models/query_manager.d.ts +2 -0
  234. package/dist/types/src/models/query_manager.d.ts.map +1 -0
  235. package/dist/types/src/models/record.d.ts +12 -3
  236. package/dist/types/src/models/record.d.ts.map +1 -1
  237. package/dist/types/src/models/record_query_result.d.ts +3 -2
  238. package/dist/types/src/models/record_query_result.d.ts.map +1 -1
  239. package/dist/types/src/models/record_store.d.ts.map +1 -1
  240. package/dist/types/src/models/table.d.ts +2 -1
  241. package/dist/types/src/models/table.d.ts.map +1 -1
  242. package/dist/types/src/models/table_or_view_query_result.d.ts +3 -5
  243. package/dist/types/src/models/table_or_view_query_result.d.ts.map +1 -1
  244. package/dist/types/src/models/view_data_store.d.ts +0 -1
  245. package/dist/types/src/models/view_data_store.d.ts.map +1 -1
  246. package/dist/types/src/models/view_metadata_query_result.d.ts +1 -1
  247. package/dist/types/src/models/view_metadata_query_result.d.ts.map +1 -1
  248. package/dist/types/src/private_utils.d.ts +24 -1
  249. package/dist/types/src/private_utils.d.ts.map +1 -1
  250. package/dist/types/src/sdk.d.ts.map +1 -1
  251. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts +11 -11
  252. package/dist/types/src/testing/abstract_mock_airtable_interface.d.ts.map +1 -1
  253. package/dist/types/src/types/airtable_interface.d.ts +48 -20
  254. package/dist/types/src/types/airtable_interface.d.ts.map +1 -1
  255. package/dist/types/src/types/block_query_spec.d.ts +139 -0
  256. package/dist/types/src/types/block_query_spec.d.ts.map +1 -0
  257. package/dist/types/src/types/field.d.ts +7 -1
  258. package/dist/types/src/types/field.d.ts.map +1 -1
  259. package/dist/types/src/types/table.d.ts +0 -2
  260. package/dist/types/src/types/table.d.ts.map +1 -1
  261. package/dist/types/src/types/view.d.ts +3 -8
  262. package/dist/types/src/types/view.d.ts.map +1 -1
  263. package/dist/types/src/ui/cell_renderer.d.ts +1 -1
  264. package/dist/types/src/ui/color_palette.d.ts +1 -1
  265. package/dist/types/src/ui/control_sizes.d.ts +1 -1
  266. package/dist/types/src/ui/field_icon.d.ts +1 -1
  267. package/dist/types/src/ui/heading.d.ts +1 -1
  268. package/dist/types/src/ui/icon.d.ts +1 -1
  269. package/dist/types/src/ui/icon_config.d.ts +33 -31
  270. package/dist/types/src/ui/icon_config.d.ts.map +1 -1
  271. package/dist/types/src/ui/input.d.ts +10 -10
  272. package/dist/types/src/ui/link.d.ts +1 -1
  273. package/dist/types/src/ui/link.d.ts.map +1 -1
  274. package/dist/types/src/ui/record_card.d.ts +1 -1
  275. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts +1 -1
  276. package/dist/types/src/ui/system/utils/create_style_prop_types.d.ts.map +1 -1
  277. package/dist/types/src/ui/text.d.ts +1 -1
  278. package/dist/types/src/ui/theme/default_theme/index.d.ts +1 -1
  279. package/dist/types/src/ui/theme/theme_context.d.ts +1 -1
  280. package/dist/types/src/ui/theme/use_theme.d.ts +1 -1
  281. package/dist/types/src/ui/use_global_config.d.ts +1 -1
  282. package/dist/types/src/watchable.d.ts.map +1 -1
  283. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts +7 -5
  284. package/dist/types/test/airtable_interface_mocks/fixture_data.d.ts.map +1 -1
  285. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts +18 -11
  286. package/dist/types/test/airtable_interface_mocks/mock_airtable_interface.d.ts.map +1 -1
  287. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts +51 -0
  288. package/dist/types/test/airtable_interface_mocks/mock_base_data_stores.d.ts.map +1 -0
  289. package/dist/types/test/test_helpers.d.ts +2 -0
  290. package/dist/types/test/test_helpers.d.ts.map +1 -1
  291. package/package.json +2 -1
@@ -6,18 +6,12 @@ require("core-js/modules/es.symbol");
6
6
 
7
7
  require("core-js/modules/es.symbol.description");
8
8
 
9
- require("core-js/modules/es.array.filter");
10
-
11
- require("core-js/modules/es.array.flat-map");
12
-
13
9
  require("core-js/modules/es.array.includes");
14
10
 
15
11
  require("core-js/modules/es.array.iterator");
16
12
 
17
13
  require("core-js/modules/es.array.map");
18
14
 
19
- require("core-js/modules/es.array.unscopables.flat-map");
20
-
21
15
  require("core-js/modules/es.object.to-string");
22
16
 
23
17
  require("core-js/modules/es.promise");
@@ -28,15 +22,11 @@ require("core-js/modules/es.string.includes");
28
22
 
29
23
  require("core-js/modules/web.dom-collections.iterator");
30
24
 
31
- require("core-js/modules/web.url.to-json");
32
-
33
25
  Object.defineProperty(exports, "__esModule", {
34
26
  value: true
35
27
  });
36
28
  exports.default = void 0;
37
29
 
38
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
39
-
40
30
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
41
31
 
42
32
  require("regenerator-runtime/runtime");
@@ -51,8 +41,6 @@ var _airtable_interface = require("../types/airtable_interface");
51
41
 
52
42
  var _mutations = require("../types/mutations");
53
43
 
54
- var _private_utils = require("../private_utils");
55
-
56
44
  var _error_utils = require("../error_utils");
57
45
 
58
46
  var _mutation_constants = require("./mutation_constants");
@@ -81,22 +69,18 @@ function () {
81
69
 
82
70
  /** @internal */
83
71
 
84
- /** @internal */
85
-
86
72
  /** @hidden */
87
- function Mutations(sdk, session, base, applyModelChanges, applyGlobalConfigUpdates) {
73
+ function Mutations(sdk, session, base, applyGlobalConfigUpdates) {
88
74
  (0, _classCallCheck2.default)(this, Mutations);
89
75
  (0, _defineProperty2.default)(this, "_airtableInterface", void 0);
90
76
  (0, _defineProperty2.default)(this, "_session", void 0);
91
77
  (0, _defineProperty2.default)(this, "_sdk", void 0);
92
78
  (0, _defineProperty2.default)(this, "_base", void 0);
93
- (0, _defineProperty2.default)(this, "_applyModelChanges", void 0);
94
79
  (0, _defineProperty2.default)(this, "_applyGlobalConfigUpdates", void 0);
95
80
  this._airtableInterface = sdk.__airtableInterface;
96
81
  this._session = session;
97
82
  this._sdk = sdk;
98
83
  this._base = base;
99
- this._applyModelChanges = applyModelChanges;
100
84
  this._applyGlobalConfigUpdates = applyGlobalConfigUpdates;
101
85
  }
102
86
  /** @hidden */
@@ -270,9 +254,12 @@ function () {
270
254
  try {
271
255
  for (var _iterator = records[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
272
256
  var record = _step.value;
273
- var existingRecord = null;
257
+ var existingRecord = null; // Note - if isSubscribedToAllRecordsInTable is true then we know the record
258
+ // doesn't exist (or is deleted) but otherwise we can issue a mutation to a record
259
+ // that does not exist, having to deal with the error thrown by PublicAirtableInterfaceFrontend
260
+ // TODO: (#proj-blocks-sdk-record-limits) Write tests around this behavior
274
261
 
275
- if (recordStore.isRecordMetadataLoaded) {
262
+ if (recordStore.isSubscribedToAllRecordsInTable || recordStore.isRecordLoaded(record.id)) {
276
263
  existingRecord = recordStore.getRecordByIdIfExists(record.id);
277
264
 
278
265
  if (!existingRecord) {
@@ -294,7 +281,7 @@ function () {
294
281
  checkedFieldIds.add(fieldId);
295
282
  }
296
283
 
297
- if (existingRecord && recordStore.areCellValuesLoadedForFieldId(fieldId)) {
284
+ if (existingRecord && recordStore.isRecordCellValueLoadedForFieldId(record.id, fieldId)) {
298
285
  var validationResult = this._airtableInterface.fieldTypeProvider.validateCellValueForUpdate(appInterface, record.cellValuesByFieldId[fieldId], existingRecord._getRawCellValue(field), field._data);
299
286
 
300
287
  if (!validationResult.isValid) {
@@ -332,9 +319,15 @@ function () {
332
319
  throw (0, _error_utils.spawnError)("Can't delete records: No table with id %s exists", _tableId);
333
320
  }
334
321
 
335
- var _recordStore = this._base.__getRecordStore(_tableId);
322
+ var _recordStore = this._base.__getRecordStore(_tableId); // TODO: (#proj-blocks-sdk-record-limits) We substantially weaken our check here
323
+ // because we can only be sure if the record exists inside the SDK if we've loaded
324
+ // all records. It is possible to change this logic to ensure we don't double-delete
325
+ // records by caching previously deleted records (if the delete is undone, but
326
+ // we're not watching the record be re-created from the undo we would have to fail
327
+ // the delete if we detect double deletion). TODO to add tests around this behavior.
328
+
336
329
 
337
- if (_recordStore.isRecordMetadataLoaded) {
330
+ if (_recordStore.isSubscribedToAllRecordsInTable) {
338
331
  var _iteratorNormalCompletion2 = true;
339
332
  var _didIteratorError2 = false;
340
333
  var _iteratorError2 = undefined;
@@ -672,153 +665,17 @@ function () {
672
665
  this._applyGlobalConfigUpdates(mutation.updates);
673
666
 
674
667
  return true;
675
- }
676
-
677
- var modelChanges = this._getOptimisticModelChangesForMutation(mutation);
668
+ } // https://airtable.com/appahuJQw7qfQTBBU/tblSbpimM8Spp9txp/viweAFIus3MhU9Gxa/recHOckY4V9QmM6JV?blocks=hide
669
+ // TODO: (#proj-blocks-sdk-record-limits) Fix this in a future stacked diff where optimistic
670
+ // updates are re-enabled https://docs.google.com/document/d/1CVZ4ZoPWEtpzKq_9cRLASGwgY71WI4nl6RVvs8S7Ubw/edit#
678
671
 
679
- if (modelChanges.length > 0) {
680
- this._applyModelChanges(modelChanges);
681
-
682
- return true;
683
- }
684
672
 
685
673
  return false;
686
674
  }
687
- /** @internal */
688
-
689
- }, {
690
- key: "_getOptimisticModelChangesForMutation",
691
- value: function _getOptimisticModelChangesForMutation(mutation) {
692
- switch (mutation.type) {
693
- case _mutations.MutationTypes.SET_MULTIPLE_RECORDS_CELL_VALUES:
694
- {
695
- var tableId = mutation.tableId,
696
- records = mutation.records;
697
-
698
- var recordStore = this._base.__getRecordStore(tableId);
699
-
700
- return records.flatMap(record => Object.keys(record.cellValuesByFieldId).filter(fieldId => recordStore.areCellValuesLoadedForFieldId(fieldId)).map(fieldId => ({
701
- path: ['tablesById', tableId, 'recordsById', record.id, 'cellValuesByFieldId', fieldId],
702
- value: record.cellValuesByFieldId[fieldId]
703
- })));
704
- }
705
-
706
- case _mutations.MutationTypes.DELETE_MULTIPLE_RECORDS:
707
- {
708
- var _tableId7 = mutation.tableId,
709
- recordIds = mutation.recordIds;
710
-
711
- var _recordStore2 = this._base.__getRecordStore(_tableId7);
712
-
713
- if (!_recordStore2.isRecordMetadataLoaded) {
714
- return [];
715
- }
716
-
717
- return [...recordIds.map(recordId => ({
718
- path: ['tablesById', _tableId7, 'recordsById', recordId],
719
- value: undefined
720
- })), ...this._base.getTableById(_tableId7).views.flatMap(view => {
721
- var viewDataStore = _recordStore2.getViewDataStore(view.id);
722
-
723
- if (!viewDataStore.isDataLoaded) {
724
- return [];
725
- }
726
-
727
- return viewDataStore.__generateChangesForParentTableDeleteMultipleRecords(recordIds);
728
- })];
729
- }
730
-
731
- case _mutations.MutationTypes.CREATE_MULTIPLE_RECORDS:
732
- {
733
- var _tableId8 = mutation.tableId,
734
- _records2 = mutation.records;
735
-
736
- var _recordStore3 = this._base.__getRecordStore(_tableId8);
737
-
738
- if (!_recordStore3.isRecordMetadataLoaded) {
739
- return [];
740
- }
741
-
742
- return [..._records2.map(record => {
743
- // Only apply optimistic changes for fields that are loaded
744
- var filteredCellValuesByFieldId = {};
745
- var _iteratorNormalCompletion5 = true;
746
- var _didIteratorError5 = false;
747
- var _iteratorError5 = undefined;
748
-
749
- try {
750
- for (var _iterator5 = (0, _private_utils.entries)(record.cellValuesByFieldId)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
751
- var _step5$value = (0, _slicedToArray2.default)(_step5.value, 2),
752
- fieldId = _step5$value[0],
753
- cellValue = _step5$value[1];
754
-
755
- if (_recordStore3.areCellValuesLoadedForFieldId(fieldId)) {
756
- filteredCellValuesByFieldId[fieldId] = cellValue;
757
- }
758
- }
759
- } catch (err) {
760
- _didIteratorError5 = true;
761
- _iteratorError5 = err;
762
- } finally {
763
- try {
764
- if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
765
- _iterator5.return();
766
- }
767
- } finally {
768
- if (_didIteratorError5) {
769
- throw _iteratorError5;
770
- }
771
- }
772
- }
773
-
774
- return {
775
- path: ['tablesById', _tableId8, 'recordsById', record.id],
776
- value: {
777
- id: record.id,
778
- cellValuesByFieldId: filteredCellValuesByFieldId,
779
- commentCount: 0,
780
- createdTime: new Date().toJSON()
781
- }
782
- };
783
- }), ...this._base.getTableById(_tableId8).views.flatMap(view => {
784
- var viewDataStore = _recordStore3.getViewDataStore(view.id);
785
-
786
- if (!viewDataStore.isDataLoaded) {
787
- return [];
788
- }
789
-
790
- return viewDataStore.__generateChangesForParentTableAddMultipleRecords(_records2.map(record => record.id));
791
- })];
792
- }
793
- // The following branch is unreachable because this method's only
794
- // call site is preceded by an explicit guard for this condition.
795
- // istanbul ignore next
796
-
797
- case _mutations.MutationTypes.SET_MULTIPLE_GLOBAL_CONFIG_PATHS:
798
- {
799
- throw (0, _error_utils.spawnError)('attempting to generate model updates for SET_MULTIPLE_GLOBAL_CONFIG_PATH');
800
- }
801
-
802
- case _mutations.MutationTypes.CREATE_SINGLE_FIELD:
803
- case _mutations.MutationTypes.UPDATE_SINGLE_FIELD_CONFIG:
804
- case _mutations.MutationTypes.UPDATE_SINGLE_FIELD_DESCRIPTION:
805
- case _mutations.MutationTypes.UPDATE_VIEW_METADATA:
806
- case _mutations.MutationTypes.CREATE_SINGLE_TABLE:
807
- {
808
- // No optimistic updates for field, view metadata, or table mutations.
809
- return [];
810
- }
811
- // The following branch is unreachable because this method's only
812
- // call site is preceded by an explicit guard for this condition.
813
- // istanbul ignore next
814
-
815
- default:
816
- throw (0, _error_utils.spawnUnknownSwitchCaseError)('mutation type', mutation, 'type');
817
- }
818
- }
819
675
  }]);
820
676
  return Mutations;
821
677
  }();
822
678
 
823
679
  var _default = Mutations;
824
- exports.default = _default;
680
+ exports.default = _default;
681
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvbXV0YXRpb25zLnRzIl0sIm5hbWVzIjpbIk1VVEFUSU9OU19NQVhfQkFUQ0hfU0laRSIsIk1VVEFUSU9OU19NQVhfQk9EWV9TSVpFIiwiTVVUQVRJT05fSE9MRF9GT1JfTVMiLCJNdXRhdGlvbnMiLCJzZGsiLCJzZXNzaW9uIiwiYmFzZSIsImFwcGx5R2xvYmFsQ29uZmlnVXBkYXRlcyIsIl9haXJ0YWJsZUludGVyZmFjZSIsIl9fYWlydGFibGVJbnRlcmZhY2UiLCJfc2Vzc2lvbiIsIl9zZGsiLCJfYmFzZSIsIl9hcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXMiLCJtdXRhdGlvbiIsIl9hc3NlcnRNdXRhdGlvbklzVmFsaWQiLCJfYXNzZXJ0TXV0YXRpb25VbmRlckxpbWl0cyIsInBlcm1pc3Npb25DaGVjayIsImNoZWNrUGVybWlzc2lvbnNGb3JNdXRhdGlvbiIsImhhc1Blcm1pc3Npb24iLCJ0eXBlIiwicmVhc29uRGlzcGxheVN0cmluZyIsImRpZEFwcGx5T3B0aW1pc3RpY1VwZGF0ZXMiLCJfYXBwbHlPcHRpbWlzdGljVXBkYXRlc0Zvck11dGF0aW9uIiwiYXBwbHlNdXRhdGlvbkFzeW5jIiwiaG9sZEZvck1zIiwic2V0VGltZW91dCIsIlByb21pc2UiLCJfX2dldEJhc2VEYXRhIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImxlbmd0aCIsIl9kb2VzTXV0YXRpb25FeGNlZWRCYXRjaFNpemVMaW1pdCIsIk11dGF0aW9uVHlwZXMiLCJTRVRfTVVMVElQTEVfUkVDT1JEU19DRUxMX1ZBTFVFUyIsIkNSRUFURV9NVUxUSVBMRV9SRUNPUkRTIiwicmVjb3JkcyIsIkRFTEVURV9NVUxUSVBMRV9SRUNPUkRTIiwicmVjb3JkSWRzIiwiU0VUX01VTFRJUExFX0dMT0JBTF9DT05GSUdfUEFUSFMiLCJ1cGRhdGVzIiwiZmllbGQiLCJpc0NvbXB1dGVkIiwibmFtZSIsImFwcEludGVyZmFjZSIsIl9fYXBwSW50ZXJmYWNlIiwiYmlsbGluZ1BsYW5Hcm91cGluZyIsIl9fYmlsbGluZ1BsYW5Hcm91cGluZyIsInRhYmxlSWQiLCJ0YWJsZSIsImdldFRhYmxlQnlJZElmRXhpc3RzIiwicmVjb3JkU3RvcmUiLCJfX2dldFJlY29yZFN0b3JlIiwiY2hlY2tlZEZpZWxkSWRzIiwiU2V0IiwicmVjb3JkIiwiZXhpc3RpbmdSZWNvcmQiLCJpc1N1YnNjcmliZWRUb0FsbFJlY29yZHNJblRhYmxlIiwiaXNSZWNvcmRMb2FkZWQiLCJpZCIsImdldFJlY29yZEJ5SWRJZkV4aXN0cyIsIk9iamVjdCIsImtleXMiLCJjZWxsVmFsdWVzQnlGaWVsZElkIiwiZmllbGRJZCIsImdldEZpZWxkQnlJZElmRXhpc3RzIiwiaGFzIiwiX2Fzc2VydEZpZWxkSXNWYWxpZEZvck11dGF0aW9uIiwiYWRkIiwiaXNSZWNvcmRDZWxsVmFsdWVMb2FkZWRGb3JGaWVsZElkIiwidmFsaWRhdGlvblJlc3VsdCIsImZpZWxkVHlwZVByb3ZpZGVyIiwidmFsaWRhdGVDZWxsVmFsdWVGb3JVcGRhdGUiLCJfZ2V0UmF3Q2VsbFZhbHVlIiwiX2RhdGEiLCJpc1ZhbGlkIiwicmVhc29uIiwicmVjb3JkSWQiLCJDUkVBVEVfU0lOR0xFX0ZJRUxEIiwiY29uZmlnIiwiZGVzY3JpcHRpb24iLCJmaWVsZHMiLCJNQVhfTlVNX0ZJRUxEU19QRVJfVEFCTEUiLCJNQVhfRklFTERfTkFNRV9MRU5HVEgiLCJleGlzdGluZ0xvd2VyY2FzZUZpZWxkTmFtZXMiLCJtYXAiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwidmFsaWRhdGVDb25maWdGb3JVcGRhdGUiLCJNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RIIiwiVVBEQVRFX1NJTkdMRV9GSUVMRF9DT05GSUciLCJvcHRzIiwiY3VycmVudENvbmZpZyIsImdldENvbmZpZyIsInBhcmVudFRhYmxlIiwiX19nZXRGaWVsZE5hbWVzQnlJZCIsIlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT04iLCJDUkVBVEVfU0lOR0xFX1RBQkxFIiwiTUFYX1RBQkxFX05BTUVfTEVOR1RIIiwiZXhpc3RpbmdMb3dlcmNhc2VUYWJsZU5hbWVzIiwidGFibGVzIiwibG93ZXJjYXNlRmllbGROYW1lcyIsImxvd2VyY2FzZUZpZWxkTmFtZSIsInByaW1hcnlGaWVsZCIsImNhbkJlUHJpbWFyeSIsIlVQREFURV9WSUVXX01FVEFEQVRBIiwidmlld0lkIiwicnVuQ29udGV4dCIsInNka0luaXREYXRhIiwiQmxvY2tSdW5Db250ZXh0VHlwZSIsIlZJRVciLCJ2aWV3IiwiZ2V0Vmlld0J5SWRJZkV4aXN0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQSx3QkFBd0IsR0FBRyxFQUFqQyxDLENBRUE7QUFDQTs7QUFDQSxJQUFNQyx1QkFBdUIsR0FBRyxNQUFNLElBQU4sR0FBYSxJQUE3QztBQUVBLElBQU1DLG9CQUFvQixHQUFHLEdBQTdCO0FBRUE7O0lBQ01DLFM7OztBQUNGOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUdBO0FBQ0EscUJBQ0lDLEdBREosRUFFSUMsT0FGSixFQUdJQyxJQUhKLEVBSUlDLHdCQUpKLEVBS0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDRSxTQUFLQyxrQkFBTCxHQUEwQkosR0FBRyxDQUFDSyxtQkFBOUI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCTCxPQUFoQjtBQUNBLFNBQUtNLElBQUwsR0FBWVAsR0FBWjtBQUNBLFNBQUtRLEtBQUwsR0FBYU4sSUFBYjtBQUNBLFNBQUtPLHlCQUFMLEdBQWlDTix3QkFBakM7QUFDSDtBQUVEOzs7Ozt1Q0FDeUJPLFE7Ozs7OztBQUNyQixtQkFBS0Msc0JBQUwsQ0FBNEJELFFBQTVCLEUsQ0FDQTtBQUNBO0FBQ0E7OztBQUNBLG1CQUFLRSwwQkFBTCxDQUFnQ0YsUUFBaEM7O0FBRU1HLGNBQUFB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Q0FBQ00sSUFBVCxLQUFrQmMseUJBQWNNLGdDQUFwQyxFQUFzRTtBQUNsRSxhQUFLM0IseUJBQUwsQ0FBK0JDLFFBQVEsQ0FBQzJCLE9BQXhDOztBQUNBLGVBQU8sSUFBUDtBQUNILE9BUDJELENBUzVEO0FBQ0E7QUFDQTs7O0FBQ0EsYUFBTyxLQUFQO0FBQ0g7Ozs7O2VBR1V0QyxTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBaXJ0YWJsZUludGVyZmFjZSwgQmxvY2tSdW5Db250ZXh0VHlwZX0gZnJvbSAnLi4vdHlwZXMvYWlydGFibGVfaW50ZXJmYWNlJztcbmltcG9ydCB7TXV0YXRpb24sIFBhcnRpYWxNdXRhdGlvbiwgUGVybWlzc2lvbkNoZWNrUmVzdWx0LCBNdXRhdGlvblR5cGVzfSBmcm9tICcuLi90eXBlcy9tdXRhdGlvbnMnO1xuaW1wb3J0IHtzcGF3bkVycm9yLCBzcGF3blVua25vd25Td2l0Y2hDYXNlRXJyb3J9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7R2xvYmFsQ29uZmlnVXBkYXRlfSBmcm9tICcuLi90eXBlcy9nbG9iYWxfY29uZmlnJztcbmltcG9ydCBTZGsgZnJvbSAnLi4vc2RrJztcbmltcG9ydCBTZXNzaW9uIGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IEZpZWxkIGZyb20gJy4vZmllbGQnO1xuaW1wb3J0IHtcbiAgICBNQVhfRklFTERfTkFNRV9MRU5HVEgsXG4gICAgTUFYX0ZJRUxEX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICBNQVhfVEFCTEVfTkFNRV9MRU5HVEgsXG4gICAgTUFYX05VTV9GSUVMRFNfUEVSX1RBQkxFLFxufSBmcm9tICcuL211dGF0aW9uX2NvbnN0YW50cyc7XG5cbi8vIExpbWl0IGZvciBob3cgbWFueSBpdGVtcyBjYW4gYmUgdXBkYXRlZCBmcm9tIGEgc2luZ2xlIGJhdGNoIG11dGF0aW9uLlxuLy8gVGhpcyBpcyBudW1iZXIgb2YgcmVjb3JkcyBmb3IgTVVMVElQTEVfUkVDT1JEUyB0eXBlIG11dGF0aW9ucywgYW5kIG51bWJlciBvZiBnbG9iYWwgY29uZmlnIHBhdGhzXG4vLyBmb3IgU0VUX01VTFRJUExFX0dMT0JBTF9DT05GSUdfUEFUSFMuXG4vLyBTYW1lIGxpbWl0IGlzIGVuZm9yY2VkIGxpdmVhcHAtc2lkZVxuY29uc3QgTVVUQVRJT05TX01BWF9CQVRDSF9TSVpFID0gNTA7XG5cbi8vIExpdmVhcHAgcmVxdWVzdHMgbXVzdCBiZSB1bmRlciAybWIgaW4gc2l6ZTogd2UgZW5mb3JjZSBhIDEuOW1iIGxpbWl0IGhlcmUgdG8gYWxsb3cgc3BhY2UgZm9yXG4vLyB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIHJlcXVlc3RcbmNvbnN0IE1VVEFUSU9OU19NQVhfQk9EWV9TSVpFID0gMS45ICogMTAyNCAqIDEwMjQ7XG5cbmNvbnN0IE1VVEFUSU9OX0hPTERfRk9SX01TID0gMTAwO1xuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBNdXRhdGlvbnMge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYWlydGFibGVJbnRlcmZhY2U6IEFpcnRhYmxlSW50ZXJmYWNlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfc2Vzc2lvbjogU2Vzc2lvbjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3NkazogU2RrO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYmFzZTogQmFzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2FwcGx5R2xvYmFsQ29uZmlnVXBkYXRlczogKGFyZzE6IFJlYWRvbmx5QXJyYXk8R2xvYmFsQ29uZmlnVXBkYXRlPikgPT4gdm9pZDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNkazogU2RrLFxuICAgICAgICBzZXNzaW9uOiBTZXNzaW9uLFxuICAgICAgICBiYXNlOiBCYXNlLFxuICAgICAgICBhcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXM6IChhcmcxOiBSZWFkb25seUFycmF5PEdsb2JhbENvbmZpZ1VwZGF0ZT4pID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2FpcnRhYmxlSW50ZXJmYWNlID0gc2RrLl9fYWlydGFibGVJbnRlcmZhY2U7XG4gICAgICAgIHRoaXMuX3Nlc3Npb24gPSBzZXNzaW9uO1xuICAgICAgICB0aGlzLl9zZGsgPSBzZGs7XG4gICAgICAgIHRoaXMuX2Jhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLl9hcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXMgPSBhcHBseUdsb2JhbENvbmZpZ1VwZGF0ZXM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBhc3luYyBhcHBseU11dGF0aW9uQXN5bmMobXV0YXRpb246IE11dGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX2Fzc2VydE11dGF0aW9uSXNWYWxpZChtdXRhdGlvbik7XG4gICAgICAgIC8vIExpbWl0IGNoZWNrIGlzIGFmdGVyIHZhbGlkaXR5IGNoZWNrIHNvIHRoYXQgd2UgZGlzcGxheSBlcnJvcnMgZm9yIHdoZW4gdXNlcnMgcGFzcyBpblxuICAgICAgICAvLyBvYmplY3RzIGNvcnJlY3RseSAoZWcgdXBkYXRpbmcgbGlua2VkIHJlY29yZHMgY2VsbCB2YWx1ZSB0byBiZSBhIHJlY29yZCBvYmplY3QpIC1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBsaW1pdCBjaGVjayB3aWxsIGZhaWwgZHVlIHRvIGNpcmN1bGFyIG9iamVjdHMgYmVpbmcgY29udmVydGVkIHRvIEpTT04gZmlyc3RcbiAgICAgICAgdGhpcy5fYXNzZXJ0TXV0YXRpb25VbmRlckxpbWl0cyhtdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgcGVybWlzc2lvbkNoZWNrID0gdGhpcy5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24obXV0YXRpb24pO1xuICAgICAgICBpZiAoIXBlcm1pc3Npb25DaGVjay5oYXNQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgYXBwbHkgJXMgbXV0YXRpb246ICVzJyxcbiAgICAgICAgICAgICAgICBtdXRhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25DaGVjay5yZWFzb25EaXNwbGF5U3RyaW5nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpZEFwcGx5T3B0aW1pc3RpY1VwZGF0ZXMgPSB0aGlzLl9hcHBseU9wdGltaXN0aWNVcGRhdGVzRm9yTXV0YXRpb24obXV0YXRpb24pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5hcHBseU11dGF0aW9uQXN5bmMobXV0YXRpb24sIHtcbiAgICAgICAgICAgICAgICBob2xkRm9yTXM6IE1VVEFUSU9OX0hPTERfRk9SX01TLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGRpZEFwcGx5T3B0aW1pc3RpY1VwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcHBsaWVkIG9wdGltaXN0aWMgdXBkYXRlcywgd2UgY2FuJ3QgZ3JhY2VmdWxseSBoYW5kbGUgYSBwcm9taXNlIHJlamVjdGlvblxuICAgICAgICAgICAgICAgIC8vIGhlcmUgLSB3ZSBjYW4ndCB1bi1hcHBseSBvcHRpbWlzdGljIHVwZGF0ZXMsIHNvIHRoZSBTREsncyBpbnRlcm5hbCBkYXRhIG1vZGVsIGlzXG4gICAgICAgICAgICAgICAgLy8gaW4gYW4gdW5leHBlY3RlZCBzdGF0ZS4gSW5zdGVhZCBvZiBsZXR0aW5nIHRoaXMgcHJvbWlzZSBnZXQgcmVqZWN0ZWQsIHRocm93IGFuXG4gICAgICAgICAgICAgICAgLy8gZXJyb3IgYWZ0ZXIgYW4gYXN5bmMgZ2FwIHRvIGNyYXNoIHRoZSBibG9jaywgYW5kIG1ha2UgdGhpcyBwcm9taXNlIGF3YWl0XG4gICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIHRoYXQgd2lsbCBuZXZlciByZXNvbHZlIHNvIHdlIGRvbid0IHJ1biBhbnkgb2YgdGhlIGRldmVsb3BlcnMgZXJyb3ItXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxpbmcgY29kZS5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHt9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24obXV0YXRpb246IFBhcnRpYWxNdXRhdGlvbik6IFBlcm1pc3Npb25DaGVja1Jlc3VsdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5jaGVja1Blcm1pc3Npb25zRm9yTXV0YXRpb24oXG4gICAgICAgICAgICBtdXRhdGlvbixcbiAgICAgICAgICAgIHRoaXMuX2Jhc2UuX19nZXRCYXNlRGF0YSgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXNzZXJ0TXV0YXRpb25VbmRlckxpbWl0cyhtdXRhdGlvbjogTXV0YXRpb24pIHtcbiAgICAgICAgLy8gVHdvIGxpbWl0cyB0byBjaGVjayBoZXJlOlxuICAgICAgICAvLyAtIGZvciByZWNvcmQtcmVsYXRlZCBtdXRhdGlvbnMsIGl0IGlzbid0IGFib3ZlIE1VVEFUSU9OU19NQVhfQkFUQ0hfU0laRVxuICAgICAgICAvLyAtIG11dGF0aW9uIHBheWxvYWQgc2l6ZSB3b24ndCBleGNlZWQgbGl2ZWFwcCByZXF1ZXN0IHBheWxvYWQgc2l6ZSBsaW1pdFxuICAgICAgICAvLyBSZXF1ZXN0cyBhcmUgc2VudCBhcyBmb3JtLWVuY29kZWQgdXRmLTggKDEgYnl0ZSBjaGFyYWN0ZXJzKVxuICAgICAgICBpZiAoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG11dGF0aW9uKSkubGVuZ3RoID4gTVVUQVRJT05TX01BWF9CT0RZX1NJWkUpIHtcbiAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1JlcXVlc3QgZXhjZWVkcyBtYXhpbXVtIHNpemUgbGltaXQgb2YgJXMgYnl0ZXMnLFxuICAgICAgICAgICAgICAgIE1VVEFUSU9OU19NQVhfQk9EWV9TSVpFLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9kb2VzTXV0YXRpb25FeGNlZWRCYXRjaFNpemVMaW1pdChtdXRhdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1JlcXVlc3QgZXhjZWVkcyBtYXhpbXVtIGJhdGNoIHNpemUgbGltaXQgb2YgJXMgaXRlbXMnLFxuICAgICAgICAgICAgICAgIE1VVEFUSU9OU19NQVhfQkFUQ0hfU0laRSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2RvZXNNdXRhdGlvbkV4Y2VlZEJhdGNoU2l6ZUxpbWl0KG11dGF0aW9uOiBNdXRhdGlvbikge1xuICAgICAgICBzd2l0Y2ggKG11dGF0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5TRVRfTVVMVElQTEVfUkVDT1JEU19DRUxMX1ZBTFVFUzpcbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5DUkVBVEVfTVVMVElQTEVfUkVDT1JEUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbXV0YXRpb24ucmVjb3Jkcy5sZW5ndGggPiBNVVRBVElPTlNfTUFYX0JBVENIX1NJWkU7XG4gICAgICAgICAgICBjYXNlIE11dGF0aW9uVHlwZXMuREVMRVRFX01VTFRJUExFX1JFQ09SRFM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGF0aW9uLnJlY29yZElkcy5sZW5ndGggPiBNVVRBVElPTlNfTUFYX0JBVENIX1NJWkU7XG4gICAgICAgICAgICBjYXNlIE11dGF0aW9uVHlwZXMuU0VUX01VTFRJUExFX0dMT0JBTF9DT05GSUdfUEFUSFM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGF0aW9uLnVwZGF0ZXMubGVuZ3RoID4gTVVUQVRJT05TX01BWF9CQVRDSF9TSVpFO1xuICAgICAgICAgICAgLy8gVGhlIFwiZGVmYXVsdFwiIGNhc2UgY2Fubm90IGJlIHJlYWNoZWQgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBvbmx5XG4gICAgICAgICAgICAvLyBpbnZva2VkIGFmdGVyIHRoZSBtdXRhdGlvbiB0eXBlIGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXNzZXJ0RmllbGRJc1ZhbGlkRm9yTXV0YXRpb24oZmllbGQ6IEZpZWxkKSB7XG4gICAgICAgIGlmIChmaWVsZC5pc0NvbXB1dGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2FuJ3Qgc2V0IGNlbGwgdmFsdWVzOiBGaWVsZCAnJXMnIGlzIGNvbXB1dGVkIGFuZCBjYW5ub3QgYmUgc2V0XCIsXG4gICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2Fzc2VydE11dGF0aW9uSXNWYWxpZChtdXRhdGlvbjogTXV0YXRpb24pIHtcbiAgICAgICAgLy8gV2UgY2FsbCB2YWxpZGF0ZSB0aGUgZGF0YSAoaW5jbHVkaW5nIGFueSBjZWxsIHZhbHVlcykgYmVjYXVzZSBpZiB0aGUgZGF0YSByZXF1aXJlZCBmb3JcbiAgICAgICAgLy8gdXMgdG8gZG8gdGhhdCBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgYmxvY2ssIHdlIGNhbiBlcnJvciBvdXQgYmVmb3JlIGFwcGx5aW5nXG4gICAgICAgIC8vIG9wdGltaXN0aWMgdXBkYXRlcyBvciBzZW5kaW5nIHRoZSB1cGRhdGUgdG8gbGl2ZWFwcC4gVGhhdCBtZWFucyB0aGF0IHRoZSBlcnJvciBpc1xuICAgICAgICAvLyByZWNvdmVyYWJsZS4gT25jZSB3ZSBhcHBseSBvcHRpbWlzdGljIHVwZGF0ZXMsIGlmIGxpdmVhcHAgcmVqZWN0cyB0aGUgdXBkYXRlIHRoZW4gd2VcbiAgICAgICAgLy8gY2FuJ3QgcmVjb3ZlciBmcm9tIHRoYXQgLSB3ZSBoYXZlIHRvIGNyYXNoIHRoZSBibG9jay4gV2UgX2NvdWxkXyBza2lwIG92ZXIgdGhlc2VcbiAgICAgICAgLy8gdmFsaWRhdGlvbnMgLSBpdCB3b3VsZG4ndCBjYXVzZSBpc3N1ZXMgb3V0c2lkZSBvZiB0aGUgYmxvY2sgZnJhbWUuIEJ1dCBydW5uaW5nIHRoZW1cbiAgICAgICAgLy8gZ2l2ZXMgdXMgc2xpZ2h0bHkgbW9yZSBjb25maWRlbmNlIHRoYXQgd2UgY2FuIGRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGNvbXBsZXRlbHkgY3Jhc2hcbiAgICAgICAgLy8gdGhlIGJsb2NrIGluIHRoZSBldmVudCBvZiBhbiBpbnZhbGlkIG11dGF0aW9uLlxuXG4gICAgICAgIGNvbnN0IGFwcEludGVyZmFjZSA9IHRoaXMuX3Nkay5fX2FwcEludGVyZmFjZTtcbiAgICAgICAgY29uc3QgYmlsbGluZ1BsYW5Hcm91cGluZyA9IHRoaXMuX2Jhc2UuX19iaWxsaW5nUGxhbkdyb3VwaW5nO1xuXG4gICAgICAgIHN3aXRjaCAobXV0YXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlNFVF9NVUxUSVBMRV9SRUNPUkRTX0NFTExfVkFMVUVTOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3RhYmxlSWQsIHJlY29yZHN9ID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl9iYXNlLmdldFRhYmxlQnlJZElmRXhpc3RzKHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IHNldCBjZWxsIHZhbHVlczogTm8gdGFibGUgd2l0aCBpZCAlcyBleGlzdHNcIiwgdGFibGVJZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5IG11dGF0aW9uLCB3ZSBjaGVjayB0aGF0IHdlJ3JlIG5vdCB0cnlpbmcgdG8gc2V0IGZpZWxkcyB0aGF0IHdlIGRvbid0IHN1cHBvcnRcbiAgICAgICAgICAgICAgICAvLyBtdXRhdGlvbnMgZm9yIHlldC4gV2hlbiByZWNvcmQgZGF0YSBpcyBsb2FkZWQsIHdlIGFsc28gY2hlY2sgdGhhdCB0aGUgcmVjb3JkIHdlJ3JlXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRpbmcgYWN0dWFsbHkgZXhpc3RzIGFuZCB0aGF0IHRoZSBjZWxsIHZhbHVlcyBhcmUgdmFsaWQuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkU3RvcmUgPSB0aGlzLl9iYXNlLl9fZ2V0UmVjb3JkU3RvcmUodGFibGVJZCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkRmllbGRJZHMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ1JlY29yZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgLSBpZiBpc1N1YnNjcmliZWRUb0FsbFJlY29yZHNJblRhYmxlIGlzIHRydWUgdGhlbiB3ZSBrbm93IHRoZSByZWNvcmRcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBleGlzdCAob3IgaXMgZGVsZXRlZCkgYnV0IG90aGVyd2lzZSB3ZSBjYW4gaXNzdWUgYSBtdXRhdGlvbiB0byBhIHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0LCBoYXZpbmcgdG8gZGVhbCB3aXRoIHRoZSBlcnJvciB0aHJvd24gYnkgUHVibGljQWlydGFibGVJbnRlcmZhY2VGcm9udGVuZFxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBXcml0ZSB0ZXN0cyBhcm91bmQgdGhpcyBiZWhhdmlvclxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTdG9yZS5pc1N1YnNjcmliZWRUb0FsbFJlY29yZHNJblRhYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTdG9yZS5pc1JlY29yZExvYWRlZChyZWNvcmQuaWQpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWNvcmQgPSByZWNvcmRTdG9yZS5nZXRSZWNvcmRCeUlkSWZFeGlzdHMocmVjb3JkLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IHNldCBjZWxsIHZhbHVlczogTm8gcmVjb3JkIHdpdGggaWQgJXMgZXhpc3RzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIE9iamVjdC5rZXlzKHJlY29yZC5jZWxsVmFsdWVzQnlGaWVsZElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IHNldCBjZWxsIHZhbHVlczogTm8gZmllbGQgd2l0aCBpZCAlcyBleGlzdHMgaW4gdGFibGUgJyVzJ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZEZpZWxkSWRzLmhhcyhmaWVsZElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Fzc2VydEZpZWxkSXNWYWxpZEZvck11dGF0aW9uKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkRmllbGRJZHMuYWRkKGZpZWxkSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdSZWNvcmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTdG9yZS5pc1JlY29yZENlbGxWYWx1ZUxvYWRlZEZvckZpZWxkSWQocmVjb3JkLmlkLCBmaWVsZElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMuX2FpcnRhYmxlSW50ZXJmYWNlLmZpZWxkVHlwZVByb3ZpZGVyLnZhbGlkYXRlQ2VsbFZhbHVlRm9yVXBkYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5jZWxsVmFsdWVzQnlGaWVsZElkW2ZpZWxkSWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1JlY29yZC5fZ2V0UmF3Q2VsbFZhbHVlKGZpZWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuX2RhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBzZXQgY2VsbCB2YWx1ZXM6IGludmFsaWQgY2VsbCB2YWx1ZSBmb3IgZmllbGQgJyVzJy5cXG4lc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5ERUxFVEVfTVVMVElQTEVfUkVDT1JEUzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHt0YWJsZUlkLCByZWNvcmRJZHN9ID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl9iYXNlLmdldFRhYmxlQnlJZElmRXhpc3RzKHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IGRlbGV0ZSByZWNvcmRzOiBObyB0YWJsZSB3aXRoIGlkICVzIGV4aXN0c1wiLCB0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRTdG9yZSA9IHRoaXMuX2Jhc2UuX19nZXRSZWNvcmRTdG9yZSh0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBXZSBzdWJzdGFudGlhbGx5IHdlYWtlbiBvdXIgY2hlY2sgaGVyZVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuIG9ubHkgYmUgc3VyZSBpZiB0aGUgcmVjb3JkIGV4aXN0cyBpbnNpZGUgdGhlIFNESyBpZiB3ZSd2ZSBsb2FkZWRcbiAgICAgICAgICAgICAgICAvLyBhbGwgcmVjb3Jkcy4gSXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoaXMgbG9naWMgdG8gZW5zdXJlIHdlIGRvbid0IGRvdWJsZS1kZWxldGVcbiAgICAgICAgICAgICAgICAvLyByZWNvcmRzIGJ5IGNhY2hpbmcgcHJldmlvdXNseSBkZWxldGVkIHJlY29yZHMgKGlmIHRoZSBkZWxldGUgaXMgdW5kb25lLCBidXRcbiAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3Qgd2F0Y2hpbmcgdGhlIHJlY29yZCBiZSByZS1jcmVhdGVkIGZyb20gdGhlIHVuZG8gd2Ugd291bGQgaGF2ZSB0byBmYWlsXG4gICAgICAgICAgICAgICAgLy8gdGhlIGRlbGV0ZSBpZiB3ZSBkZXRlY3QgZG91YmxlIGRlbGV0aW9uKS4gVE9ETyB0byBhZGQgdGVzdHMgYXJvdW5kIHRoaXMgYmVoYXZpb3IuXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZFN0b3JlLmlzU3Vic2NyaWJlZFRvQWxsUmVjb3Jkc0luVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmRJZCBvZiByZWNvcmRJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZFN0b3JlLmdldFJlY29yZEJ5SWRJZkV4aXN0cyhyZWNvcmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgZGVsZXRlIHJlY29yZHM6IE5vIHJlY29yZCB3aXRoIGlkICVzIGV4aXN0cyBpbiB0YWJsZSAnJXMnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIE11dGF0aW9uVHlwZXMuQ1JFQVRFX01VTFRJUExFX1JFQ09SRFM6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dGFibGVJZCwgcmVjb3Jkc30gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkRmllbGRJZHMgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX2Jhc2UuZ2V0VGFibGVCeUlkSWZFeGlzdHModGFibGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIHJlY29yZHM6IE5vIHRhYmxlIHdpdGggaWQgJXMgZXhpc3RzXCIsIHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZElkIG9mIE9iamVjdC5rZXlzKHJlY29yZC5jZWxsVmFsdWVzQnlGaWVsZElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0YWJsZS5nZXRGaWVsZEJ5SWRJZkV4aXN0cyhmaWVsZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSByZWNvcmRzOiBObyBmaWVsZCB3aXRoIGlkICVzIGV4aXN0cyBpbiB0YWJsZSAnJXMnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkRmllbGRJZHMuaGFzKGZpZWxkSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXNzZXJ0RmllbGRJc1ZhbGlkRm9yTXV0YXRpb24oZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRGaWVsZElkcy5hZGQoZmllbGRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2VsbCB2YWx1ZSBpcyBudWxsIHNpbmNlIHRoZSByZWNvcmQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci52YWxpZGF0ZUNlbGxWYWx1ZUZvclVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmNlbGxWYWx1ZXNCeUZpZWxkSWRbZmllbGRJZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIHJlY29yZHM6IGludmFsaWQgY2VsbCB2YWx1ZSBmb3IgZmllbGQgJyVzJy5cXG4lc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlNFVF9NVUxUSVBMRV9HTE9CQUxfQ09ORklHX1BBVEhTOiB7XG4gICAgICAgICAgICAgICAgLy8gZ2xvYmFsQ29uZmlnIHVwZGF0ZSBpcyBhIHNwZWNpYWwgY2FzZTogZ2xvYmFsQ29uZmlnIGhhbmRsZXMgdmFsaWRhdGlvbiBiZWZvcmVcbiAgICAgICAgICAgICAgICAvLyBpbnZva2luZyB0aGlzIG11dGF0aW9uLCBzaW5jZSBpdCByZWxpZXMgb24gaW50ZXJuYWwgc3RhdGUgdG8gdmFsaWRhdGUgdGhlXG4gICAgICAgICAgICAgICAgLy8gcGF0aHMgYmVpbmcgc2V0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLkNSRUFURV9TSU5HTEVfRklFTEQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dGFibGVJZCwgbmFtZSwgY29uZmlnLCBkZXNjcmlwdGlvbn0gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX2Jhc2UuZ2V0VGFibGVCeUlkSWZFeGlzdHModGFibGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIGZpZWxkOiBObyB0YWJsZSB3aXRoIGlkICVzIGV4aXN0c1wiLCB0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFibGUuZmllbGRzLmxlbmd0aCA+PSBNQVhfTlVNX0ZJRUxEU19QRVJfVEFCTEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIGZpZWxkOiB0YWJsZSBhbHJlYWR5IGhhcyB0aGUgbWF4aW11bSBvZiAlcyBmaWVsZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fRklFTERTX1BFUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IGNyZWF0ZSBmaWVsZDogbXVzdCBwcm92aWRlIG5vbi1lbXB0eSBuYW1lXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IE1BWF9GSUVMRF9OQU1FX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgZmllbGQ6IG5hbWUgJyVzJyBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICVzIGNoYXJhY3RlcnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRklFTERfTkFNRV9MRU5HVEgsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdMb3dlcmNhc2VGaWVsZE5hbWVzID0gdGFibGUuZmllbGRzLm1hcChmaWVsZCA9PlxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0xvd2VyY2FzZUZpZWxkTmFtZXMuaW5jbHVkZXMobmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgZmllbGQ6IGZpZWxkIHdpdGggbmFtZSAnJXMnIGFscmVhZHkgZXhpc3RzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY29uZmlnIC8gZmllbGQgZGF0YSBpcyBudWxsIHNpbmNlIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5maWVsZFR5cGVQcm92aWRlci52YWxpZGF0ZUNvbmZpZ0ZvclVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGJpbGxpbmdQbGFuR3JvdXBpbmcsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSBmaWVsZDogaW52YWxpZCBmaWVsZCBjb25maWcuXFxuJXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucmVhc29uLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi5sZW5ndGggPiBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSBmaWVsZDogZGVzY3JpcHRpb24gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAlcyBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5VUERBVEVfU0lOR0xFX0ZJRUxEX0NPTkZJRzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHt0YWJsZUlkLCBpZCwgY29uZmlnLCBvcHRzfSA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fYmFzZS5nZXRUYWJsZUJ5SWRJZkV4aXN0cyh0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXCJDYW4ndCB1cGRhdGUgZmllbGQ6IE5vIHRhYmxlIHdpdGggaWQgJXMgZXhpc3RzXCIsIHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGFibGUuZ2V0RmllbGRCeUlkSWZFeGlzdHMoaWQpO1xuICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IHVwZGF0ZSBmaWVsZDogTm8gZmllbGQgd2l0aCBpZCAlcyBleGlzdHNcIiwgaWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHdlIGdldCB0aGUgY29uZmlnIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgZmllbGQudHlwZS9maWVsZC5vcHRpb25zIHRvIGdldCBpdFxuICAgICAgICAgICAgICAgIC8vIGluIG9uZSBjYWxsIGFuZCBiZWNhdXNlIGZpZWxkLm9wdGlvbnMgcmV0dXJucyBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkIHdoZW5cbiAgICAgICAgICAgICAgICAvLyBhIGZpZWxkIGRvZXMgbm90IGhhdmUgb3B0aW9ucywgd2hpbHN0IHdlIG5lZWQgdG8gcGFzcyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuZ2V0Q29uZmlnKFxuICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9kYXRhLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5wYXJlbnRUYWJsZS5fX2dldEZpZWxkTmFtZXNCeUlkKCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIudmFsaWRhdGVDb25maWdGb3JVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgIGFwcEludGVyZmFjZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1BsYW5Hcm91cGluZyxcbiAgICAgICAgICAgICAgICAgICAgb3B0cyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgdXBkYXRlIGZpZWxkOiBpbnZhbGlkIGZpZWxkIGNvbmZpZy5cXG4lc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlVQREFURV9TSU5HTEVfRklFTERfREVTQ1JJUFRJT046IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dGFibGVJZCwgaWQsIGRlc2NyaXB0aW9ufSA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fYmFzZS5nZXRUYWJsZUJ5SWRJZkV4aXN0cyh0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXCJDYW4ndCB1cGRhdGUgZmllbGQ6IE5vIHRhYmxlIHdpdGggaWQgJXMgZXhpc3RzXCIsIHRhYmxlSWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGFibGUuZ2V0RmllbGRCeUlkSWZFeGlzdHMoaWQpO1xuICAgICAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcIkNhbid0IHVwZGF0ZSBmaWVsZDogTm8gZmllbGQgd2l0aCBpZCAlcyBleGlzdHNcIiwgaWQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi5sZW5ndGggPiBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IHVwZGF0ZSBmaWVsZDogZGVzY3JpcHRpb24gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAlcyBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVhfRklFTERfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgTXV0YXRpb25UeXBlcy5DUkVBVEVfU0lOR0xFX1RBQkxFOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge25hbWUsIGZpZWxkc30gPSBtdXRhdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiBtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IG5hbWVcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gTUFYX1RBQkxFX05BTUVfTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogbmFtZSAnJXMnIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJXMgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9UQUJMRV9OQU1FX0xFTkdUSCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0xvd2VyY2FzZVRhYmxlTmFtZXMgPSB0aGlzLl9iYXNlLnRhYmxlcy5tYXAodGFibGUgPT5cbiAgICAgICAgICAgICAgICAgICAgdGFibGUubmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdMb3dlcmNhc2VUYWJsZU5hbWVzLmluY2x1ZGVzKG5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiB0YWJsZSB3aXRoIG5hbWUgJyVzJyBhbHJlYWR5IGV4aXN0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGZpZWxkXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gTUFYX05VTV9GSUVMRFNfUEVSX1RBQkxFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogbnVtYmVyIG9mIGZpZWxkcyBleGNlZWRzIG1heGltdW0gb2YgJXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fRklFTERTX1BFUl9UQUJMRSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsb3dlcmNhc2VGaWVsZE5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogbXVzdCBwcm92aWRlIG5vbi1lbXB0eSBuYW1lIGZvciBldmVyeSBmaWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lLmxlbmd0aCA+IE1BWF9GSUVMRF9OQU1FX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkNhbid0IGNyZWF0ZSB0YWJsZTogZmllbGQgbmFtZSAnJXMnIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJXMgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0ZJRUxEX05BTUVfTEVOR1RILFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyY2FzZUZpZWxkTmFtZSA9IGZpZWxkLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZUZpZWxkTmFtZXMuaGFzKGxvd2VyY2FzZUZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgdGFibGU6IGR1cGxpY2F0ZSBmaWVsZCBuYW1lICclcydcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2VGaWVsZE5hbWVzLmFkZChsb3dlcmNhc2VGaWVsZE5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY29uZmlnIC8gZmllbGQgZGF0YSBpcyBudWxsIHNpbmNlIHRoZSBmaWVsZCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIudmFsaWRhdGVDb25maWdGb3JVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5jb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbGxpbmdQbGFuR3JvdXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgdGFibGU6IGludmFsaWQgZmllbGQgY29uZmlnIGZvciBmaWVsZCAnJXMnLlxcbiVzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZGVzY3JpcHRpb24ubGVuZ3RoID4gTUFYX0ZJRUxEX0RFU0NSSVBUSU9OX0xFTkdUSFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwYXduRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBjcmVhdGUgdGFibGU6IGRlc2NyaXB0aW9uIGZvciBmaWVsZCAnJXMnIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJXMgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0ZJRUxEX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5RmllbGQgPSBmaWVsZHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5fYWlydGFibGVJbnRlcmZhY2UuZmllbGRUeXBlUHJvdmlkZXIuY2FuQmVQcmltYXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUZpZWxkLmNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbGxpbmdQbGFuR3JvdXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2FuJ3QgY3JlYXRlIHRhYmxlOiBmaXJzdCBmaWVsZCAnJXMnIGhhcyB0eXBlICclcycgd2hpY2ggY2Fubm90IGJlIGEgcHJpbWFyeSBmaWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUZpZWxkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5RmllbGQuY29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBNdXRhdGlvblR5cGVzLlVQREFURV9WSUVXX01FVEFEQVRBOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3RhYmxlSWQsIHZpZXdJZH0gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCB7cnVuQ29udGV4dH0gPSB0aGlzLl9haXJ0YWJsZUludGVyZmFjZS5zZGtJbml0RGF0YTtcblxuICAgICAgICAgICAgICAgIGlmIChydW5Db250ZXh0LnR5cGUgIT09IEJsb2NrUnVuQ29udGV4dFR5cGUuVklFVykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKCdTZXR0aW5nIHZpZXcgbWV0YWRhdGEgaXMgb25seSB2YWxpZCBmb3Igdmlld3MnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocnVuQ29udGV4dC52aWV3SWQgIT09IHZpZXdJZCB8fCBydW5Db250ZXh0LnRhYmxlSWQgIT09IHRhYmxlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3Bhd25FcnJvcignQ3VzdG9tIHZpZXdzIGNhbiBvbmx5IHNldCB2aWV3IG1ldGFkYXRhIG9uIHRoZW1zZWx2ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX2Jhc2UuZ2V0VGFibGVCeUlkSWZFeGlzdHModGFibGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgdXBkYXRlIG1ldGFkYXRhOiBObyB0YWJsZSB3aXRoIGlkICVzIGV4aXN0c1wiLCB0YWJsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGFibGUuZ2V0Vmlld0J5SWRJZkV4aXN0cyh2aWV3SWQpO1xuICAgICAgICAgICAgICAgIGlmICghdmlldykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzcGF3bkVycm9yKFwiQ2FuJ3QgdXBkYXRlIG1ldGFkYXRhOiBObyB2aWV3IHdpdGggaWQgJXMgZXhpc3RzXCIsIHZpZXdJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBzcGF3blVua25vd25Td2l0Y2hDYXNlRXJyb3IoJ211dGF0aW9uIHR5cGUnLCBtdXRhdGlvbiwgJ3R5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXBwbHlPcHRpbWlzdGljVXBkYXRlc0Zvck11dGF0aW9uKG11dGF0aW9uOiBNdXRhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBHbG9iYWxDb25maWcgdXBkYXRlcyBhcmUgZGlmZmVyZW50IHRvIG90aGVyIG11dGF0aW9ucyAob24gbW9kZWxzKTogZm9yIG1vZGVscywgd2VcbiAgICAgICAgLy8gb25seSBhcHBseSBvcHRpbWlzdGljIHVwZGF0ZXMgaWYgdGhlIHJlbGV2YW50IG1vZGVscyBhcmUgbG9hZGVkLCB3aGVyZWFzIGZvclxuICAgICAgICAvLyBTRVRfTVVMVElQTEVfR0xPQkFMX0NPTkZJR19QQVRIUyB3ZSBhbHdheXMgYXBwbHkgb3B0aW1pc3RpYyB1cGRhdGVzLlxuICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gTXV0YXRpb25UeXBlcy5TRVRfTVVMVElQTEVfR0xPQkFMX0NPTkZJR19QQVRIUykge1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlHbG9iYWxDb25maWdVcGRhdGVzKG11dGF0aW9uLnVwZGF0ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBodHRwczovL2FpcnRhYmxlLmNvbS9hcHBhaHVKUXc3cWZRVEJCVS90YmxTYnBpbU04U3BwOXR4cC92aXdlQUZJdXMzTWhVOUd4YS9yZWNIT2NrWTRWOVFtTTZKVj9ibG9ja3M9aGlkZVxuICAgICAgICAvLyBUT0RPOiAoI3Byb2otYmxvY2tzLXNkay1yZWNvcmQtbGltaXRzKSBGaXggdGhpcyBpbiBhIGZ1dHVyZSBzdGFja2VkIGRpZmYgd2hlcmUgb3B0aW1pc3RpY1xuICAgICAgICAvLyB1cGRhdGVzIGFyZSByZS1lbmFibGVkIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMUNWWjRab1BXRXRwektxXzljUkxBU0d3Z1k3MVdJNG5sNlJWdnM4UzdVYncvZWRpdCNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTXV0YXRpb25zO1xuIl19
@@ -238,4 +238,5 @@ function () {
238
238
  }();
239
239
 
240
240
  var _default = ObjectPool;
241
- exports.default = _default;
241
+ exports.default = _default;
242
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbHMvb2JqZWN0X3Bvb2wudHMiXSwibmFtZXMiOlsiV0VBS19SRVRBSU5fVElNRV9NUyIsIk9iamVjdFBvb2wiLCJjdG9yIiwiX0N0b3IiLCJvYmplY3QiLCJfdW5yZWdpc3Rlck9iamVjdEZvclJldXNlV2Vha0lmRXhpc3RzIiwib2JqZWN0S2V5IiwiX19wb29sS2V5IiwicG9vbGVkT2JqZWN0cyIsIl9vYmplY3RzQnlLZXkiLCJwdXNoIiwiaW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiX3dlYWtPYmplY3RzQnlLZXkiLCJ0b1N0b3JlIiwidGltZW91dElkIiwic2V0VGltZW91dCIsImZpbmRJbmRleCIsInN0b3JlZCIsImNsZWFyVGltZW91dCIsImtleSIsImZpbmQiLCJhcmdzIiwibmV3T2JqZWN0IiwiZXhpc3RpbmdPYmplY3QiLCJfZ2V0T2JqZWN0Rm9yUmV1c2VTdHJvbmciLCJfZ2V0T2JqZWN0Rm9yUmV1c2VXZWFrIiwiX3JlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VXZWFrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFEQTs7QUFBZTtBQUlmLElBQU1BLG1CQUFtQixHQUFHLEtBQTVCOztJQU1NQyxVOzs7QUFDRjs7QUFFQTs7QUFFQTs7QUFHQTtBQUNBLHNCQUFZQyxJQUFaLEVBQXdCO0FBQUE7QUFBQSx5REFQMEIsRUFPMUI7QUFBQSw2REFMOEQsRUFLOUQ7QUFBQTtBQUNwQixTQUFLQyxLQUFMLEdBQWFELElBQWI7QUFDSCxHLENBRUQ7QUFDQTs7QUFDQTs7Ozs7aURBQzZCRSxNLEVBQVc7QUFDcEMsV0FBS0MscUNBQUwsQ0FBMkNELE1BQTNDOztBQUNBLFVBQU1FLFNBQVMsR0FBR0YsTUFBTSxDQUFDRyxTQUF6QjtBQUNBLFVBQU1DLGFBQWEsR0FBRyxLQUFLQyxhQUFMLENBQW1CSCxTQUFuQixDQUF0Qjs7QUFDQSxVQUFJ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SSxjQUFKLEVBQW9CO0FBQ2hCLGVBQU9BLGNBQVA7QUFDSDs7QUFFRCxXQUFLRywyQkFBTCxDQUFpQ0osU0FBakM7O0FBRUEsYUFBT0EsU0FBUDtBQUNIOzs7OztlQUdVekIsVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAaGlkZGVuICovIC8qKiAqL1xuaW1wb3J0IHtpbnZhcmlhbnR9IGZyb20gJy4uL2Vycm9yX3V0aWxzJztcbmltcG9ydCB7VGltZW91dElkfSBmcm9tICcuLi9wcml2YXRlX3V0aWxzJztcblxuY29uc3QgV0VBS19SRVRBSU5fVElNRV9NUyA9IDEwMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xhYmxlIHtcbiAgICBfX3Bvb2xLZXk6IHN0cmluZztcbn1cblxuY2xhc3MgT2JqZWN0UG9vbDxUIGV4dGVuZHMgUG9vbGFibGUsIEN0b3IgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUPiB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vYmplY3RzQnlLZXk6IHtba2V5OiBzdHJpbmddOiBBcnJheTxUPiB8IHZvaWR9ID0ge307XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF93ZWFrT2JqZWN0c0J5S2V5OiB7W2tleTogc3RyaW5nXTogQXJyYXk8e29iamVjdDogVDsgdGltZW91dElkOiBUaW1lb3V0SWR9PiB8IHZvaWR9ID0ge307XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9DdG9yOiBDdG9yO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihjdG9yOiBDdG9yKSB7XG4gICAgICAgIHRoaXMuX0N0b3IgPSBjdG9yO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgdHdvIGRpZmZlcmVudCB3YXlzIHdlIGNhbiByZWdpc3RlciBhbiBvYmplY3QgZm9yIHJldXNlIC0gd2VhayBhbmQgc3Ryb25nLiBUaGlzIG9uZSxcbiAgICAvLyBzdHJvbmcsIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIG9iamVjdCBpcyBrZXB0IGluIHRoZSBwb29sIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgcmVtb3ZlZC5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VTdHJvbmcob2JqZWN0OiBUKSB7XG4gICAgICAgIHRoaXMuX3VucmVnaXN0ZXJPYmplY3RGb3JSZXVzZVdlYWtJZkV4aXN0cyhvYmplY3QpO1xuICAgICAgICBjb25zdCBvYmplY3RLZXkgPSBvYmplY3QuX19wb29sS2V5O1xuICAgICAgICBjb25zdCBwb29sZWRPYmplY3RzID0gdGhpcy5fb2JqZWN0c0J5S2V5W29iamVjdEtleV07XG4gICAgICAgIGlmIChwb29sZWRPYmplY3RzKSB7XG4gICAgICAgICAgICBwb29sZWRPYmplY3RzLnB1c2gob2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX29iamVjdHNCeUtleVtvYmplY3RLZXldID0gW29iamVjdF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB1bnJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VTdHJvbmcob2JqZWN0OiBUKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdEtleSA9IG9iamVjdC5fX3Bvb2xLZXk7XG4gICAgICAgIGNvbnN0IHBvb2xlZE9iamVjdHMgPSB0aGlzLl9vYmplY3RzQnlLZXlbb2JqZWN0S2V5XTtcbiAgICAgICAgaW52YXJpYW50KHBvb2xlZE9iamVjdHMsICdwb29sZWRPYmplY3RzJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcG9vbGVkT2JqZWN0cy5pbmRleE9mKG9iamVjdCk7XG4gICAgICAgIGludmFyaWFudChpbmRleCAhPT0gLTEsICdvYmplY3Qgbm90IHJlZ2lzdGVyZWQnKTtcbiAgICAgICAgcG9vbGVkT2JqZWN0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAocG9vbGVkT2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGBkZWxldGVgIGNhdXNlcyBkZS1vcHRzLCB3aGljaCBzbG93cyBkb3duIHN1YnNlcXVlbnQgcmVhZHMsXG4gICAgICAgICAgICAvLyBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWQgKHVudmVyaWZpZWQgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGZhc3RlcikuXG4gICAgICAgICAgICB0aGlzLl9vYmplY3RzQnlLZXlbb2JqZWN0S2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgdHdvIGRpZmZlcmVudCB3YXlzIHdlIGNhbiByZWdpc3RlciBhbiBvYmplY3QgZm9yIHJldXNlIC0gd2VhayBhbmQgc3Ryb25nLiBUaGlzIG9uZSxcbiAgICAvLyB3ZWFrLCB3aWxsIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciB0aGUgb2JqZWN0IGFmdGVyIGEgZmV3IHNlY29uZHMgZ28gYnkgd2l0aG91dCBpdCBiZWluZ1xuICAgIC8vIHVzZWQuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVnaXN0ZXJPYmplY3RGb3JSZXVzZVdlYWsob2JqZWN0OiBUKSB7XG4gICAgICAgIGNvbnN0IG9iamVjdEtleSA9IG9iamVjdC5fX3Bvb2xLZXk7XG4gICAgICAgIGNvbnN0IHBvb2xlZE9iamVjdHMgPSB0aGlzLl93ZWFrT2JqZWN0c0J5S2V5W29iamVjdEtleV07XG5cbiAgICAgICAgY29uc3QgdG9TdG9yZSA9IHtcbiAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgIHRpbWVvdXRJZDogc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl91bnJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VXZWFrSWZFeGlzdHMob2JqZWN0KSxcbiAgICAgICAgICAgICAgICBXRUFLX1JFVEFJTl9USU1FX01TLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocG9vbGVkT2JqZWN0cykge1xuICAgICAgICAgICAgcG9vbGVkT2JqZWN0cy5wdXNoKHRvU3RvcmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd2Vha09iamVjdHNCeUtleVtvYmplY3RLZXldID0gW3RvU3RvcmVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdW5yZWdpc3Rlck9iamVjdEZvclJldXNlV2Vha0lmRXhpc3RzKG9iamVjdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBvYmplY3RLZXkgPSBvYmplY3QuX19wb29sS2V5O1xuICAgICAgICBjb25zdCBwb29sZWRPYmplY3RzID0gdGhpcy5fd2Vha09iamVjdHNCeUtleVtvYmplY3RLZXldO1xuICAgICAgICBpZiAoIXBvb2xlZE9iamVjdHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHBvb2xlZE9iamVjdHMuZmluZEluZGV4KHN0b3JlZCA9PiBzdG9yZWQub2JqZWN0ID09PSBvYmplY3QpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWQgPSBwb29sZWRPYmplY3RzW2luZGV4XTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHN0b3JlZC50aW1lb3V0SWQpO1xuXG4gICAgICAgIHBvb2xlZE9iamVjdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKHBvb2xlZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBgZGVsZXRlYCBjYXVzZXMgZGUtb3B0cywgd2hpY2ggc2xvd3MgZG93biBzdWJzZXF1ZW50IHJlYWRzLFxuICAgICAgICAgICAgLy8gc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkICh1bnZlcmlmaWVkIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBmYXN0ZXIpLlxuICAgICAgICAgICAgdGhpcy5fd2Vha09iamVjdHNCeUtleVtvYmplY3RLZXldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRPYmplY3RGb3JSZXVzZVN0cm9uZyhrZXk6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcG9vbGVkT2JqZWN0cyA9IHRoaXMuX29iamVjdHNCeUtleVtrZXldO1xuICAgICAgICBpZiAocG9vbGVkT2JqZWN0cykge1xuICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHRoYXQgdGhlcmUgd29uJ3QgYmUgdG9vIG1hbnkgUXVlcnlSZXN1bHRzIGZvciBhIGdpdmVuXG4gICAgICAgICAgICAvLyBtb2RlbCwgc28gaXRlcmF0aW5nIG92ZXIgdGhlbSBzaG91bGQgYmUgb2theS4gSWYgdGhpcyBhc3N1bXB0aW9uXG4gICAgICAgICAgICAvLyBlbmRzIHVwIGJlaW5nIHdyb25nLCB3ZSBjYW4gaGFzaCB0aGUgb3B0cyBvciBzb21ldGhpbmcuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBwb29sZWRPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5fX3Bvb2xLZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRPYmplY3RGb3JSZXVzZVdlYWsoa2V5OiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBvb2xlZE9iamVjdHMgPSB0aGlzLl93ZWFrT2JqZWN0c0J5S2V5W2tleV07XG4gICAgICAgIGlmICghcG9vbGVkT2JqZWN0cykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZWQgPSBwb29sZWRPYmplY3RzLmZpbmQoKHtvYmplY3R9KSA9PiBvYmplY3QuX19wb29sS2V5ID09PSBrZXkpO1xuICAgICAgICBpZiAoIXN0b3JlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7b2JqZWN0LCB0aW1lb3V0SWR9ID0gc3RvcmVkO1xuXG4gICAgICAgIC8vIHJlc2V0IHRoZSB0aW1lciBvbiB0aGlzIG9iamVjdCBpZiBpdCdzIHJldXNlZFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgc3RvcmVkLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLl91bnJlZ2lzdGVyT2JqZWN0Rm9yUmV1c2VXZWFrSWZFeGlzdHMob2JqZWN0KSxcbiAgICAgICAgICAgIFdFQUtfUkVUQUlOX1RJTUVfTVMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRPYmplY3RGb3JSZXVzZSguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Q3Rvcj4pOiBUIHtcbiAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3IHRoaXMuX0N0b3IoLi4uYXJncyk7XG4gICAgICAgIGNvbnN0IGtleSA9IG5ld09iamVjdC5fX3Bvb2xLZXk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nT2JqZWN0ID1cbiAgICAgICAgICAgIHRoaXMuX2dldE9iamVjdEZvclJldXNlU3Ryb25nKGtleSkgfHwgdGhpcy5fZ2V0T2JqZWN0Rm9yUmV1c2VXZWFrKGtleSk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdPYmplY3Q7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWdpc3Rlck9iamVjdEZvclJldXNlV2VhayhuZXdPYmplY3QpO1xuXG4gICAgICAgIHJldHVybiBuZXdPYmplY3Q7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQb29sO1xuIl19