@envive-ai/react-hooks 0.1.8 → 0.2.1

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 (441) hide show
  1. package/package.json +1 -1
  2. package/src/contexts/newOrgConfigContext/newOrgConfigContext.tsx +6 -13
  3. package/src/hooks/GraphQLConfig/useGraphQLConfig.ts +5 -5
  4. package/src/hooks/NewOrgConfig/useNewOrgConfig.ts +2 -2
  5. package/dist/AmplitudeOperations-CNyxbBY6.cjs +0 -0
  6. package/dist/AmplitudeOperations-Oa2efWtF.js +0 -1
  7. package/dist/NewOrgConfig-BU6uJT74.js +0 -15
  8. package/dist/NewOrgConfig-DmidHiyj.cjs +0 -20
  9. package/dist/SystemSettingsContext-BbobkM82.cjs +0 -20
  10. package/dist/SystemSettingsContext-gtrccL_q.js +0 -13
  11. package/dist/TrackComponentVisibleEvent-CqjMiZCS.cjs +0 -59
  12. package/dist/TrackComponentVisibleEvent-D9kpqKM4.js +0 -52
  13. package/dist/amplitudeContext-B73xamNe.d.cts +0 -52
  14. package/dist/amplitudeContext-BhhYPJSL.d.ts +0 -52
  15. package/dist/amplitudeContext-Dr1jHI13.cjs +0 -309
  16. package/dist/amplitudeContext-YRS1QOO3.js +0 -287
  17. package/dist/api-DYjHj_hR.cjs +0 -239
  18. package/dist/api-d5uWvb3-.js +0 -166
  19. package/dist/app-B9r0MF9n.js +0 -132
  20. package/dist/app-Bgr-mAvr.cjs +0 -178
  21. package/dist/application/models/graphql/index.cjs +0 -5
  22. package/dist/application/models/graphql/index.d.cts +0 -2
  23. package/dist/application/models/graphql/index.d.ts +0 -2
  24. package/dist/application/models/graphql/index.js +0 -4
  25. package/dist/application/models/guards/api/index.cjs +0 -16
  26. package/dist/application/models/guards/api/index.d.cts +0 -3
  27. package/dist/application/models/guards/api/index.d.ts +0 -3
  28. package/dist/application/models/guards/api/index.js +0 -5
  29. package/dist/application/models/guards/utils.cjs +0 -3
  30. package/dist/application/models/guards/utils.d.cts +0 -2
  31. package/dist/application/models/guards/utils.d.ts +0 -2
  32. package/dist/application/models/guards/utils.js +0 -3
  33. package/dist/application/models/index.cjs +0 -69
  34. package/dist/application/models/index.d.cts +0 -12
  35. package/dist/application/models/index.d.ts +0 -12
  36. package/dist/application/models/index.js +0 -12
  37. package/dist/application/models/utilityTypes/index.cjs +0 -1
  38. package/dist/application/models/utilityTypes/index.d.cts +0 -2
  39. package/dist/application/models/utilityTypes/index.d.ts +0 -2
  40. package/dist/application/models/utilityTypes/index.js +0 -3
  41. package/dist/application/models/variantInfo/index.cjs +0 -1
  42. package/dist/application/models/variantInfo/index.d.cts +0 -2
  43. package/dist/application/models/variantInfo/index.d.ts +0 -2
  44. package/dist/application/models/variantInfo/index.js +0 -3
  45. package/dist/application/utils/index.cjs +0 -48
  46. package/dist/application/utils/index.d.cts +0 -263
  47. package/dist/application/utils/index.d.ts +0 -263
  48. package/dist/application/utils/index.js +0 -22
  49. package/dist/atomStore-BS6qtYZF.js +0 -1
  50. package/dist/atomStore-BjRyLFEx.cjs +0 -0
  51. package/dist/atomStore-BuopbV9k.js +0 -32
  52. package/dist/atomStore-CZKe3itM.cjs +0 -58
  53. package/dist/atoms/app/index.cjs +0 -20
  54. package/dist/atoms/app/index.d.cts +0 -39
  55. package/dist/atoms/app/index.d.ts +0 -39
  56. package/dist/atoms/app/index.js +0 -16
  57. package/dist/atoms/atomStore/index.cjs +0 -7
  58. package/dist/atoms/atomStore/index.d.cts +0 -24
  59. package/dist/atoms/atomStore/index.d.ts +0 -24
  60. package/dist/atoms/atomStore/index.js +0 -4
  61. package/dist/atoms/chat/index.cjs +0 -52
  62. package/dist/atoms/chat/index.d.cts +0 -163
  63. package/dist/atoms/chat/index.d.ts +0 -163
  64. package/dist/atoms/chat/index.js +0 -23
  65. package/dist/atoms/globalSearch/index.cjs +0 -6
  66. package/dist/atoms/globalSearch/index.d.cts +0 -24
  67. package/dist/atoms/globalSearch/index.d.ts +0 -24
  68. package/dist/atoms/globalSearch/index.js +0 -3
  69. package/dist/atoms/org/index.cjs +0 -19
  70. package/dist/atoms/org/index.d.cts +0 -58
  71. package/dist/atoms/org/index.d.ts +0 -58
  72. package/dist/atoms/org/index.js +0 -6
  73. package/dist/atoms/search/index.cjs +0 -60
  74. package/dist/atoms/search/index.d.cts +0 -14
  75. package/dist/atoms/search/index.d.ts +0 -14
  76. package/dist/atoms/search/index.js +0 -30
  77. package/dist/atoms/search/types.cjs +0 -5
  78. package/dist/atoms/search/types.d.cts +0 -2
  79. package/dist/atoms/search/types.d.ts +0 -2
  80. package/dist/atoms/search/types.js +0 -3
  81. package/dist/atoms/search/utils.cjs +0 -3
  82. package/dist/atoms/search/utils.d.cts +0 -5
  83. package/dist/atoms/search/utils.d.ts +0 -5
  84. package/dist/atoms/search/utils.js +0 -3
  85. package/dist/cdnContext-CVgXkdV2.cjs +0 -53
  86. package/dist/cdnContext-DdE6VPIF.js +0 -38
  87. package/dist/chat-BNDYKsqF.js +0 -258
  88. package/dist/chat-BkjIKhc5.cjs +0 -152
  89. package/dist/chat-Br5FhtRs.cjs +0 -394
  90. package/dist/chat-CgLypC3w.js +0 -26
  91. package/dist/chatElementDisplayLocation-BwiXrkN7.d.ts +0 -25
  92. package/dist/chatElementDisplayLocation-DWmfNX_u.d.cts +0 -25
  93. package/dist/chatSearch-BiF2__V0.js +0 -295
  94. package/dist/chatSearch-BrzfJOto.cjs +0 -418
  95. package/dist/chatState-BDsqKE-B.cjs +0 -120
  96. package/dist/chatState-ie771Hwy.js +0 -34
  97. package/dist/chunk-CUT6urMc.cjs +0 -30
  98. package/dist/commerce-api-Dz1jxPOJ.js +0 -311
  99. package/dist/commerce-api-KoiUki51.cjs +0 -318
  100. package/dist/components-Cby-Cma3.cjs +0 -29
  101. package/dist/components-D1mg1-Br.js +0 -11
  102. package/dist/config/locators/components/chat/index.cjs +0 -23
  103. package/dist/config/locators/components/chat/index.d.cts +0 -2
  104. package/dist/config/locators/components/chat/index.d.ts +0 -2
  105. package/dist/config/locators/components/chat/index.js +0 -3
  106. package/dist/config/locators/components/chat/variants/index.cjs +0 -29
  107. package/dist/config/locators/components/chat/variants/index.d.cts +0 -16
  108. package/dist/config/locators/components/chat/variants/index.d.ts +0 -16
  109. package/dist/config/locators/components/chat/variants/index.js +0 -17
  110. package/dist/config/locators/components/index.cjs +0 -5
  111. package/dist/config/locators/components/index.d.cts +0 -2
  112. package/dist/config/locators/components/index.d.ts +0 -2
  113. package/dist/config/locators/components/index.js +0 -3
  114. package/dist/config/locators/components/search/index.cjs +0 -13
  115. package/dist/config/locators/components/search/index.d.cts +0 -8
  116. package/dist/config/locators/components/search/index.d.ts +0 -8
  117. package/dist/config/locators/components/search/index.js +0 -9
  118. package/dist/config/locators/index.cjs +0 -67
  119. package/dist/config/locators/index.d.cts +0 -25
  120. package/dist/config/locators/index.d.ts +0 -25
  121. package/dist/config/locators/index.js +0 -26
  122. package/dist/contexts/amplitudeContext/index.cjs +0 -22
  123. package/dist/contexts/amplitudeContext/index.d.cts +0 -2
  124. package/dist/contexts/amplitudeContext/index.d.ts +0 -2
  125. package/dist/contexts/amplitudeContext/index.js +0 -20
  126. package/dist/contexts/cdnContext/index.cjs +0 -7
  127. package/dist/contexts/cdnContext/index.d.cts +0 -15
  128. package/dist/contexts/cdnContext/index.d.ts +0 -15
  129. package/dist/contexts/cdnContext/index.js +0 -6
  130. package/dist/contexts/chatContext/index.cjs +0 -331
  131. package/dist/contexts/chatContext/index.d.cts +0 -15
  132. package/dist/contexts/chatContext/index.d.ts +0 -15
  133. package/dist/contexts/chatContext/index.js +0 -324
  134. package/dist/contexts/enviveConfigContext/index.cjs +0 -7
  135. package/dist/contexts/enviveConfigContext/index.d.cts +0 -30
  136. package/dist/contexts/enviveConfigContext/index.d.ts +0 -30
  137. package/dist/contexts/enviveConfigContext/index.js +0 -6
  138. package/dist/contexts/enviveCssContext/index.cjs +0 -66
  139. package/dist/contexts/enviveCssContext/index.d.cts +0 -10
  140. package/dist/contexts/enviveCssContext/index.d.ts +0 -10
  141. package/dist/contexts/enviveCssContext/index.js +0 -63
  142. package/dist/contexts/featureFlagContext/index.cjs +0 -107
  143. package/dist/contexts/featureFlagContext/index.d.cts +0 -20
  144. package/dist/contexts/featureFlagContext/index.d.ts +0 -20
  145. package/dist/contexts/featureFlagContext/index.js +0 -103
  146. package/dist/contexts/featureFlagServiceContext/index.cjs +0 -6
  147. package/dist/contexts/featureFlagServiceContext/index.d.cts +0 -5
  148. package/dist/contexts/featureFlagServiceContext/index.d.ts +0 -5
  149. package/dist/contexts/featureFlagServiceContext/index.js +0 -5
  150. package/dist/contexts/graphqlContext/index.cjs +0 -16
  151. package/dist/contexts/graphqlContext/index.d.cts +0 -13
  152. package/dist/contexts/graphqlContext/index.d.ts +0 -13
  153. package/dist/contexts/graphqlContext/index.js +0 -15
  154. package/dist/contexts/localStorageContext/index.cjs +0 -6
  155. package/dist/contexts/localStorageContext/index.d.cts +0 -30
  156. package/dist/contexts/localStorageContext/index.d.ts +0 -30
  157. package/dist/contexts/localStorageContext/index.js +0 -4
  158. package/dist/contexts/newOrgConfigContext/index.cjs +0 -20
  159. package/dist/contexts/newOrgConfigContext/index.d.cts +0 -31
  160. package/dist/contexts/newOrgConfigContext/index.d.ts +0 -31
  161. package/dist/contexts/newOrgConfigContext/index.js +0 -19
  162. package/dist/contexts/searchContext/index.cjs +0 -24
  163. package/dist/contexts/searchContext/index.d.cts +0 -16
  164. package/dist/contexts/searchContext/index.d.ts +0 -16
  165. package/dist/contexts/searchContext/index.js +0 -23
  166. package/dist/contexts/sessionStorageContext/index.cjs +0 -5
  167. package/dist/contexts/sessionStorageContext/index.d.cts +0 -15
  168. package/dist/contexts/sessionStorageContext/index.d.ts +0 -15
  169. package/dist/contexts/sessionStorageContext/index.js +0 -4
  170. package/dist/contexts/shopifyUrlContext/index.cjs +0 -5
  171. package/dist/contexts/shopifyUrlContext/index.d.cts +0 -20
  172. package/dist/contexts/shopifyUrlContext/index.d.ts +0 -20
  173. package/dist/contexts/shopifyUrlContext/index.js +0 -4
  174. package/dist/contexts/systemSettingsContext/index.cjs +0 -8
  175. package/dist/contexts/systemSettingsContext/index.d.cts +0 -37
  176. package/dist/contexts/systemSettingsContext/index.d.ts +0 -37
  177. package/dist/contexts/systemSettingsContext/index.js +0 -6
  178. package/dist/contexts/types.cjs +0 -7
  179. package/dist/contexts/types.d.cts +0 -4
  180. package/dist/contexts/types.d.ts +0 -4
  181. package/dist/contexts/types.js +0 -3
  182. package/dist/contexts/userIdentityContext/index.cjs +0 -27
  183. package/dist/contexts/userIdentityContext/index.d.cts +0 -2
  184. package/dist/contexts/userIdentityContext/index.d.ts +0 -2
  185. package/dist/contexts/userIdentityContext/index.js +0 -26
  186. package/dist/domObserver-B19-69gW.js +0 -285
  187. package/dist/domObserver-CwieVNgj.cjs +0 -304
  188. package/dist/enviveConfig-BQB14yuH.js +0 -62
  189. package/dist/enviveConfig-DAA9sozZ.cjs +0 -130
  190. package/dist/enviveConfigContext-BCpBKqsz.js +0 -45
  191. package/dist/enviveConfigContext-Btg5JUMG.cjs +0 -60
  192. package/dist/events/index.cjs +0 -4
  193. package/dist/events/index.d.cts +0 -46
  194. package/dist/events/index.d.ts +0 -46
  195. package/dist/events/index.js +0 -3
  196. package/dist/events-BHJJjPDN.js +0 -78
  197. package/dist/events-B_fJZf9E.cjs +0 -90
  198. package/dist/featureFlagServiceContext-Bcx5yh4S.cjs +0 -56
  199. package/dist/featureFlagServiceContext-Cpw8omUr.d.ts +0 -23
  200. package/dist/featureFlagServiceContext-Cvn6fcdB.d.cts +0 -23
  201. package/dist/featureFlagServiceContext-_tXX5iro.js +0 -42
  202. package/dist/featureGates-2Zea2D2S.js +0 -27
  203. package/dist/featureGates-BY2Zy7x_.cjs +0 -33
  204. package/dist/frontendConfig-DnMZfvcA.d.cts +0 -857
  205. package/dist/frontendConfig-Dqxbqo8G.d.ts +0 -857
  206. package/dist/globalSearch-C94-vEVh.cjs +0 -39
  207. package/dist/globalSearch-Dlbnfasm.js +0 -14
  208. package/dist/graphql-DRLWdYEk.js +0 -36
  209. package/dist/graphql-xPDT7ZkK.cjs +0 -53
  210. package/dist/graphqlConfig-B4ddz1vH.cjs +0 -39
  211. package/dist/graphqlConfig-BnjOdeX7.js +0 -14
  212. package/dist/graphqlContext-B-9g2vOb.js +0 -96
  213. package/dist/graphqlContext-B7PEKDJs.cjs +0 -111
  214. package/dist/hooks/AmplitudeOperations/index.cjs +0 -22
  215. package/dist/hooks/AmplitudeOperations/index.d.cts +0 -12
  216. package/dist/hooks/AmplitudeOperations/index.d.ts +0 -12
  217. package/dist/hooks/AmplitudeOperations/index.js +0 -22
  218. package/dist/hooks/AppDetails/index.cjs +0 -19
  219. package/dist/hooks/AppDetails/index.d.cts +0 -27
  220. package/dist/hooks/AppDetails/index.d.ts +0 -27
  221. package/dist/hooks/AppDetails/index.js +0 -19
  222. package/dist/hooks/BlockBackButton/index.cjs +0 -29
  223. package/dist/hooks/BlockBackButton/index.d.cts +0 -5
  224. package/dist/hooks/BlockBackButton/index.d.ts +0 -5
  225. package/dist/hooks/BlockBackButton/index.js +0 -27
  226. package/dist/hooks/CdnOperations/index.cjs +0 -24
  227. package/dist/hooks/CdnOperations/index.d.cts +0 -7
  228. package/dist/hooks/CdnOperations/index.d.ts +0 -7
  229. package/dist/hooks/CdnOperations/index.js +0 -22
  230. package/dist/hooks/ChatToggle/index.cjs +0 -64
  231. package/dist/hooks/ChatToggle/index.d.cts +0 -12
  232. package/dist/hooks/ChatToggle/index.d.ts +0 -12
  233. package/dist/hooks/ChatToggle/index.js +0 -62
  234. package/dist/hooks/ChatToggleAnalytics/index.cjs +0 -38
  235. package/dist/hooks/ChatToggleAnalytics/index.d.cts +0 -9
  236. package/dist/hooks/ChatToggleAnalytics/index.d.ts +0 -9
  237. package/dist/hooks/ChatToggleAnalytics/index.js +0 -36
  238. package/dist/hooks/CustomerSupportHandoff/index.cjs +0 -36
  239. package/dist/hooks/CustomerSupportHandoff/index.d.cts +0 -16
  240. package/dist/hooks/CustomerSupportHandoff/index.d.ts +0 -16
  241. package/dist/hooks/CustomerSupportHandoff/index.js +0 -34
  242. package/dist/hooks/Debounce/index.cjs +0 -3
  243. package/dist/hooks/Debounce/index.d.cts +0 -5
  244. package/dist/hooks/Debounce/index.d.ts +0 -5
  245. package/dist/hooks/Debounce/index.js +0 -3
  246. package/dist/hooks/ElementObserver/index.cjs +0 -179
  247. package/dist/hooks/ElementObserver/index.d.cts +0 -29
  248. package/dist/hooks/ElementObserver/index.d.ts +0 -29
  249. package/dist/hooks/ElementObserver/index.js +0 -177
  250. package/dist/hooks/GrabAndScroll/index.cjs +0 -99
  251. package/dist/hooks/GrabAndScroll/index.d.cts +0 -14
  252. package/dist/hooks/GrabAndScroll/index.d.ts +0 -14
  253. package/dist/hooks/GrabAndScroll/index.js +0 -97
  254. package/dist/hooks/GraphQLConfig/index.cjs +0 -17
  255. package/dist/hooks/GraphQLConfig/index.d.cts +0 -15
  256. package/dist/hooks/GraphQLConfig/index.d.ts +0 -15
  257. package/dist/hooks/GraphQLConfig/index.js +0 -16
  258. package/dist/hooks/IdentifyUser/index.cjs +0 -60
  259. package/dist/hooks/IdentifyUser/index.d.cts +0 -10
  260. package/dist/hooks/IdentifyUser/index.d.ts +0 -10
  261. package/dist/hooks/IdentifyUser/index.js +0 -58
  262. package/dist/hooks/ImageResolver/index.cjs +0 -55
  263. package/dist/hooks/ImageResolver/index.d.cts +0 -7
  264. package/dist/hooks/ImageResolver/index.d.ts +0 -7
  265. package/dist/hooks/ImageResolver/index.js +0 -53
  266. package/dist/hooks/Intersection/index.cjs +0 -3
  267. package/dist/hooks/Intersection/index.d.cts +0 -7
  268. package/dist/hooks/Intersection/index.d.ts +0 -7
  269. package/dist/hooks/Intersection/index.js +0 -3
  270. package/dist/hooks/IsSmallScreen/index.cjs +0 -22
  271. package/dist/hooks/IsSmallScreen/index.d.cts +0 -5
  272. package/dist/hooks/IsSmallScreen/index.d.ts +0 -5
  273. package/dist/hooks/IsSmallScreen/index.js +0 -20
  274. package/dist/hooks/LocalStorageOperations/index.cjs +0 -79
  275. package/dist/hooks/LocalStorageOperations/index.d.cts +0 -17
  276. package/dist/hooks/LocalStorageOperations/index.d.ts +0 -17
  277. package/dist/hooks/LocalStorageOperations/index.js +0 -74
  278. package/dist/hooks/MessageFilter/index.cjs +0 -54
  279. package/dist/hooks/MessageFilter/index.d.cts +0 -30
  280. package/dist/hooks/MessageFilter/index.d.ts +0 -30
  281. package/dist/hooks/MessageFilter/index.js +0 -54
  282. package/dist/hooks/MessageScrollObserver/index.cjs +0 -36
  283. package/dist/hooks/MessageScrollObserver/index.d.cts +0 -5
  284. package/dist/hooks/MessageScrollObserver/index.d.ts +0 -5
  285. package/dist/hooks/MessageScrollObserver/index.js +0 -34
  286. package/dist/hooks/NewOrgConfig/index.cjs +0 -20
  287. package/dist/hooks/NewOrgConfig/index.d.cts +0 -23
  288. package/dist/hooks/NewOrgConfig/index.d.ts +0 -23
  289. package/dist/hooks/NewOrgConfig/index.js +0 -20
  290. package/dist/hooks/Search/index.cjs +0 -326
  291. package/dist/hooks/Search/index.d.cts +0 -61
  292. package/dist/hooks/Search/index.d.ts +0 -61
  293. package/dist/hooks/Search/index.js +0 -323
  294. package/dist/hooks/SearchOperations/index.cjs +0 -102
  295. package/dist/hooks/SearchOperations/index.d.cts +0 -22
  296. package/dist/hooks/SearchOperations/index.d.ts +0 -22
  297. package/dist/hooks/SearchOperations/index.js +0 -99
  298. package/dist/hooks/SessionStorageOperations/index.cjs +0 -30
  299. package/dist/hooks/SessionStorageOperations/index.d.cts +0 -8
  300. package/dist/hooks/SessionStorageOperations/index.d.ts +0 -8
  301. package/dist/hooks/SessionStorageOperations/index.js +0 -28
  302. package/dist/hooks/ShopifyUrlOperations/index.cjs +0 -53
  303. package/dist/hooks/ShopifyUrlOperations/index.d.cts +0 -23
  304. package/dist/hooks/ShopifyUrlOperations/index.d.ts +0 -23
  305. package/dist/hooks/ShopifyUrlOperations/index.js +0 -49
  306. package/dist/hooks/SnapCalculator/index.cjs +0 -29
  307. package/dist/hooks/SnapCalculator/index.d.cts +0 -12
  308. package/dist/hooks/SnapCalculator/index.d.ts +0 -12
  309. package/dist/hooks/SnapCalculator/index.js +0 -27
  310. package/dist/hooks/SystemSettingsContext/index.cjs +0 -7
  311. package/dist/hooks/SystemSettingsContext/index.d.cts +0 -23
  312. package/dist/hooks/SystemSettingsContext/index.d.ts +0 -23
  313. package/dist/hooks/SystemSettingsContext/index.js +0 -7
  314. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +0 -22
  315. package/dist/hooks/TrackComponentVisibleEvent/index.d.cts +0 -18
  316. package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +0 -18
  317. package/dist/hooks/TrackComponentVisibleEvent/index.js +0 -22
  318. package/dist/hooks/UpdateAnalyticsProps/index.cjs +0 -62
  319. package/dist/hooks/UpdateAnalyticsProps/index.d.cts +0 -9
  320. package/dist/hooks/UpdateAnalyticsProps/index.d.ts +0 -9
  321. package/dist/hooks/UpdateAnalyticsProps/index.js +0 -59
  322. package/dist/hooks/utils.cjs +0 -8
  323. package/dist/hooks/utils.d.cts +0 -13
  324. package/dist/hooks/utils.d.ts +0 -13
  325. package/dist/hooks/utils.js +0 -3
  326. package/dist/index-B9HUPS_i.d.cts +0 -186
  327. package/dist/index-BN-3ctk_.d.ts +0 -184
  328. package/dist/index-BNiYL8h0.d.cts +0 -28
  329. package/dist/index-BW6pHibZ.d.cts +0 -9
  330. package/dist/index-BirtCYN3.d.ts +0 -186
  331. package/dist/index-Bmub8e38.d.cts +0 -98
  332. package/dist/index-BoYC9XLW.d.ts +0 -39
  333. package/dist/index-C9zXP5bg.d.ts +0 -28
  334. package/dist/index-CESxqFso.d.cts +0 -228
  335. package/dist/index-CK_J3QMY.d.ts +0 -676
  336. package/dist/index-C_MIfxF0.d.cts +0 -676
  337. package/dist/index-CiWEYzXl.d.cts +0 -184
  338. package/dist/index-Da0UzyI9.d.ts +0 -25
  339. package/dist/index-Dr_c2DDq.d.ts +0 -98
  340. package/dist/index-DsiilEj-.d.ts +0 -228
  341. package/dist/index-MOOZ2oxZ.d.cts +0 -25
  342. package/dist/index-ghzD_356.d.ts +0 -9
  343. package/dist/index-hdbCEjYy.d.cts +0 -39
  344. package/dist/interceptors/index.cjs +0 -4
  345. package/dist/interceptors/index.d.cts +0 -20
  346. package/dist/interceptors/index.d.ts +0 -20
  347. package/dist/interceptors/index.js +0 -4
  348. package/dist/interceptors/types.cjs +0 -1
  349. package/dist/interceptors/types.d.cts +0 -13
  350. package/dist/interceptors/types.d.ts +0 -13
  351. package/dist/interceptors/types.js +0 -3
  352. package/dist/localStorageContext-DiTziaPa.js +0 -95
  353. package/dist/localStorageContext-S38L0OSP.cjs +0 -115
  354. package/dist/logger-CkhQayOW.js +0 -20
  355. package/dist/logger-DQ0WfCcD.cjs +0 -26
  356. package/dist/models-C48U9q70.js +0 -1296
  357. package/dist/models-Ctn-pmug.cjs +0 -1537
  358. package/dist/newOrgConfigAtom-D6R-7HCk.cjs +0 -15
  359. package/dist/newOrgConfigAtom-bn1lnljf.js +0 -8
  360. package/dist/newOrgConfigContext-D3WoaBVU.cjs +0 -68
  361. package/dist/newOrgConfigContext-rWOYz0E8.js +0 -53
  362. package/dist/nodeSelector-B3bPtEjX.d.cts +0 -31
  363. package/dist/nodeSelector-D5gjDWZ3.d.ts +0 -31
  364. package/dist/org-CIhjzxWr.cjs +0 -43
  365. package/dist/org-CeWXnpwF.js +0 -12
  366. package/dist/orgAnalyticsConfig-BC4_sEmn.js +0 -14
  367. package/dist/orgAnalyticsConfig-DsGbyFhO.cjs +0 -39
  368. package/dist/search--NZPZkK3.cjs +0 -205
  369. package/dist/search-BLShhjvR.d.ts +0 -20
  370. package/dist/search-CxZl7iQF.js +0 -126
  371. package/dist/search-filter-types-DPgeG8FS.d.ts +0 -102
  372. package/dist/search-filter-types-_mprCnBi.d.cts +0 -102
  373. package/dist/search-y-ioX5Mz.d.cts +0 -20
  374. package/dist/searchContext-C4Glr8Nv.cjs +0 -145
  375. package/dist/searchContext-VnjhV7Lk.js +0 -129
  376. package/dist/searchServiceAdapter-DEv1tTn0.cjs +0 -34
  377. package/dist/searchServiceAdapter-WyCU55NV.js +0 -16
  378. package/dist/sessionStorageContext-BJ05_j7l.cjs +0 -66
  379. package/dist/sessionStorageContext-Dp_bhXQP.js +0 -52
  380. package/dist/shopifyUrlContext-CGqpJl1o.js +0 -61
  381. package/dist/shopifyUrlContext-Cob4L7Dt.cjs +0 -75
  382. package/dist/spiffyWidgets-BuS00VaQ.d.cts +0 -20
  383. package/dist/spiffyWidgets-GILaqHv6.d.ts +0 -20
  384. package/dist/systemSettingsContext-BDKWrrco.cjs +0 -60
  385. package/dist/systemSettingsContext-Dqng3YSZ.js +0 -39
  386. package/dist/test-types-EzMFw_U3.d.ts +0 -40
  387. package/dist/test-types-ThQiO_cc.d.cts +0 -40
  388. package/dist/types/index.cjs +0 -34
  389. package/dist/types/index.d.cts +0 -3
  390. package/dist/types/index.d.ts +0 -3
  391. package/dist/types/index.js +0 -31
  392. package/dist/types-BUeRbZUk.d.cts +0 -10
  393. package/dist/types-BwNrLPSZ.cjs +0 -106
  394. package/dist/types-CMuTSKrW.d.ts +0 -10
  395. package/dist/types-CS0Hrzja.js +0 -30
  396. package/dist/types-CxObxLKs.cjs +0 -48
  397. package/dist/types-D3uOF0Oy.js +0 -76
  398. package/dist/types-DtTnp0o0.js +0 -1
  399. package/dist/types-a8gm_IaQ.cjs +0 -0
  400. package/dist/types-fsXBIQwO.d.ts +0 -51
  401. package/dist/types-zuWLkBJ3.d.cts +0 -51
  402. package/dist/types.cjs +0 -0
  403. package/dist/types.d.cts +0 -15
  404. package/dist/types.d.ts +0 -15
  405. package/dist/types.js +0 -1
  406. package/dist/unsupportedProductExceptions-CKiri_vO.cjs +0 -32
  407. package/dist/unsupportedProductExceptions-ClxlJ6cU.js +0 -20
  408. package/dist/urlsParser-D1nsJgQG.cjs +0 -78
  409. package/dist/urlsParser-DzEetiey.js +0 -42
  410. package/dist/useAmplitudeOperations-BSsyvkQ2.cjs +0 -41
  411. package/dist/useAmplitudeOperations-BottjwT9.js +0 -34
  412. package/dist/useAppDetails-BpiBxS_5.cjs +0 -38
  413. package/dist/useAppDetails-DDNIsM46.js +0 -30
  414. package/dist/useDebounce-BaIp-A1W.cjs +0 -26
  415. package/dist/useDebounce-CxPj9WmE.js +0 -19
  416. package/dist/useGraphQLConfig-DZ0ZannB.js +0 -63
  417. package/dist/useGraphQLConfig-Dw8dDh3T.cjs +0 -76
  418. package/dist/useIntersection-B4J9UhaG.js +0 -21
  419. package/dist/useIntersection-DKWc5MY6.cjs +0 -28
  420. package/dist/useMessageInterceptor-CstX10ih.cjs +0 -33
  421. package/dist/useMessageInterceptor-D5oAekXn.js +0 -25
  422. package/dist/userIdentityContext-D2oFVFzo.d.cts +0 -20
  423. package/dist/userIdentityContext-DPFkCSCu.cjs +0 -125
  424. package/dist/userIdentityContext-Z65zM-Ae.js +0 -109
  425. package/dist/userIdentityContext-wYRpgkaJ.d.ts +0 -20
  426. package/dist/utilityTypes-DynzxjK3.js +0 -1
  427. package/dist/utilityTypes-xb8SjKSV.cjs +0 -0
  428. package/dist/utils-2SWrJ12w.cjs +0 -29
  429. package/dist/utils-B1xLx9S8.d.ts +0 -15
  430. package/dist/utils-B3x_9JTY.d.cts +0 -15
  431. package/dist/utils-BZtSmwgh.d.cts +0 -22
  432. package/dist/utils-Bcz5kAgP.js +0 -92
  433. package/dist/utils-CEKzBcN2.js +0 -27
  434. package/dist/utils-CMqFfqZx.cjs +0 -130
  435. package/dist/utils-CVovRwlw.js +0 -606
  436. package/dist/utils-CqBxIpEV.js +0 -23
  437. package/dist/utils-CsMbZmRw.cjs +0 -33
  438. package/dist/utils-DzPSXtmD.cjs +0 -715
  439. package/dist/utils-bxOCg2i9.d.ts +0 -22
  440. package/dist/variantInfo-B7IwRpCg.cjs +0 -0
  441. package/dist/variantInfo-BtOYUGWa.js +0 -1
@@ -1,30 +0,0 @@
1
- //#region rolldown:runtime
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
- key = keys[i];
11
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
- get: ((k) => from[k]).bind(null, key),
13
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
- });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
- value: mod,
20
- enumerable: true
21
- }) : target, mod));
22
-
23
- //#endregion
24
-
25
- Object.defineProperty(exports, '__toESM', {
26
- enumerable: true,
27
- get: function () {
28
- return __toESM;
29
- }
30
- });
@@ -1,311 +0,0 @@
1
- import { logger_default } from "./logger-CkhQayOW.js";
2
- import { ProductExperiment, validateOrgConfigResults, validateResponse, validateSuggestion, validateUserEvent } from "./models-C48U9q70.js";
3
- import { baseUrlAtom, contextSourceAtom, envAtom, orgShortNameAtom, reactAppNameAtom } from "./enviveConfig-BQB14yuH.js";
4
- import { getAtomStore } from "./atomStore-BuopbV9k.js";
5
- import { chatIdAtom, userIdAtom } from "./app-B9r0MF9n.js";
6
- import { coreSupportedEventRequestToApiRequest, messageFromFormSubmittedEvent, messageFromQueryEvent, messageFromResponse, messageFromSuggestionEvent, messageRequestToCommerceMessageRequest } from "./utils-CVovRwlw.js";
7
- import { featureFlagServiceAtom, orgIdAtom } from "./graphqlConfig-BnjOdeX7.js";
8
- import { SessionRestartRequired, UnsupportedProductException } from "./unsupportedProductExceptions-ClxlJ6cU.js";
9
- import { Configuration, ContextEnvEnum, ContextSourceEnum, CustomerServiceApi, DefaultApi, FormType, InferenceApi, ResponseCategory, ResponseError, UserEventCategory, V1OrgConfigGetSourceEnum } from "@spiffy-ai/commerce-api-client";
10
-
11
- //#region src/application/commerce-api.ts
12
- async function errorResponseBody(error) {
13
- try {
14
- return await error.response.json();
15
- } catch {
16
- return {};
17
- }
18
- }
19
- async function throwSessionRestartRequiredIf(errorMsg, error) {
20
- if (!(error instanceof ResponseError)) {
21
- logger_default.logInfo(errorMsg, error);
22
- throw error;
23
- }
24
- const errorResponse = await errorResponseBody(error);
25
- if (errorResponse?.message?.toLowerCase() === "unsupported product" || errorResponse?.app_code?.toUpperCase() === "PRODUCT_NOT_FOUND") throw new UnsupportedProductException();
26
- else if (errorResponse?.app_code?.toUpperCase() === "RESTART_SESSION" || errorResponse?.sub_code?.toUpperCase() === "NOT_FOUND") {
27
- logger_default.logInfo("Session does not exist. Re-start session", error, error.response, errorResponse);
28
- throw new SessionRestartRequired();
29
- }
30
- logger_default.logInfo(errorMsg, error);
31
- throw error;
32
- }
33
- var CommerceApiClient = class CommerceApiClient {
34
- static {
35
- this.getInstance = () => {
36
- if (!CommerceApiClient.instance) CommerceApiClient.instance = new CommerceApiClient();
37
- return CommerceApiClient.instance;
38
- };
39
- }
40
- constructor(basePath) {
41
- this.suggestionsAbortController = new AbortController();
42
- this.responsesAbortController = new AbortController();
43
- const baseUrl = getAtomStore().get(baseUrlAtom);
44
- const config = new Configuration({
45
- basePath: basePath || baseUrl,
46
- headers: {
47
- "Content-Type": "application/json",
48
- Accept: "application/json"
49
- }
50
- });
51
- this.defaultApi = new DefaultApi(config);
52
- this.inferenceApi = new InferenceApi(config);
53
- this.customerServiceApi = new CustomerServiceApi(config);
54
- }
55
- static {
56
- this.resolveUrl = async (url) => {
57
- const atomStore = getAtomStore();
58
- const orgShortName = atomStore.get(orgShortNameAtom);
59
- const orgId = atomStore.get(orgIdAtom);
60
- const userId = atomStore.get(userIdAtom);
61
- const chatId = atomStore.get(chatIdAtom);
62
- const source = atomStore.get(contextSourceAtom);
63
- const env = atomStore.get(envAtom);
64
- const featureFlagService = atomStore.get(featureFlagServiceAtom);
65
- const context = {
66
- user_id: userId ?? "",
67
- org_id: orgId ?? "",
68
- org_short_name: orgShortName ?? "",
69
- chat_id: chatId ?? "",
70
- source: source ?? ContextSourceEnum.App,
71
- env: env ?? ContextEnvEnum.Dev
72
- };
73
- const featureGates = featureFlagService?.featureFlagService?.getFeatureFlags() || {};
74
- const urlResolvingRequest = {
75
- url,
76
- context,
77
- feature_gates: featureGates
78
- };
79
- return await (await CommerceApiClient.getInstance().inferenceApi.v1UrlResolvingPostRaw({ UrlResolvingRequest: urlResolvingRequest })).raw.json();
80
- };
81
- }
82
- static {
83
- this.reportSession = async (reportRequest) => {
84
- await CommerceApiClient.getInstance().defaultApi.v1ChatsReportSessionIdPost({ ReportSessionRequest: reportRequest });
85
- };
86
- }
87
- static {
88
- this.getNextResponses = async (payload) => {
89
- try {
90
- return (await CommerceApiClient.getInstance().inferenceApi.v1NextResponsesPost({ NextMessageRequest: messageRequestToCommerceMessageRequest(payload) })).map((resp) => validateResponse(resp)).map((resp) => messageFromResponse(resp)).filter((m) => m != null);
91
- } catch (err) {
92
- logger_default.logInfo("Failed to get next responses", err, {
93
- payloadContext: payload?.context,
94
- userEvents: payload?.userEvents
95
- });
96
- await throwSessionRestartRequiredIf("Failed to get next responses", err);
97
- return [];
98
- }
99
- };
100
- }
101
- static {
102
- this.getNextResponseStreaming = (payload) => {
103
- async function* generate(inferenceApi, abortController) {
104
- try {
105
- const response = await inferenceApi.v1NextResponsesPostRaw({ NextMessageRequest: messageRequestToCommerceMessageRequest(payload) }, { signal: abortController.signal });
106
- if (!response.raw.body) {
107
- logger_default.logError("[spiffy-ai] No body in the streamed response", void 0, { response: response.raw });
108
- return;
109
- }
110
- const reader = response.raw.body.getReader();
111
- const decoder = new TextDecoder("utf-8");
112
- let partial = "";
113
- const safeParse = (line) => {
114
- try {
115
- return JSON.parse(line);
116
- } catch (err) {
117
- logger_default.logError("[spiffy-ai] Error parsing streamed line", err, {
118
- line,
119
- partial
120
- });
121
- partial = line;
122
- return partial;
123
- }
124
- };
125
- const processChunk = (chunk) => {
126
- return `${partial}${chunk}`.split("\n").map((line) => line.replace(/^data: /, "").trim()).filter((line) => line !== "" && line !== "[DONE]").map(safeParse).filter((v) => v);
127
- };
128
- while (true) {
129
- const { done, value } = await reader.read();
130
- if (done) break;
131
- const chunk = decoder.decode(value);
132
- const parsedLines = processChunk(chunk);
133
- for (const parsedLine of parsedLines) {
134
- const validatedResponse = validateResponse(parsedLine);
135
- if (validatedResponse) yield validatedResponse;
136
- }
137
- }
138
- } catch (error) {
139
- logger_default.logError("[spiffy-ai] Failed to get next streaming responses", error, {
140
- payloadContext: payload?.context,
141
- userEvents: payload?.userEvents
142
- });
143
- await throwSessionRestartRequiredIf("Failed to get next streaming responses", error);
144
- }
145
- }
146
- CommerceApiClient.getInstance().responsesAbortController.abort();
147
- CommerceApiClient.getInstance().responsesAbortController = new AbortController();
148
- return generate(CommerceApiClient.getInstance().inferenceApi, CommerceApiClient.getInstance().responsesAbortController);
149
- };
150
- }
151
- static {
152
- this.getNextSuggestions = async (payload) => {
153
- try {
154
- CommerceApiClient.getInstance().suggestionsAbortController.abort();
155
- CommerceApiClient.getInstance().suggestionsAbortController = new AbortController();
156
- return (await CommerceApiClient.getInstance().inferenceApi.v1NextSuggestionsPost({ NextMessageRequest: messageRequestToCommerceMessageRequest(payload) }, { signal: CommerceApiClient.getInstance().suggestionsAbortController.signal })).map((resp) => validateSuggestion(resp)).filter((suggestion) => suggestion != null);
157
- } catch (error) {
158
- logger_default.logInfo("Failed to get suggestions", error, {
159
- payloadContext: payload?.context,
160
- userEvents: payload?.userEvents
161
- });
162
- await throwSessionRestartRequiredIf("Failed to get suggestions", error);
163
- return [];
164
- }
165
- };
166
- }
167
- static {
168
- this.getResponses = async (orgId, chatId, userId) => {
169
- let data = {
170
- responses: [],
171
- suggestions: [],
172
- user_events: []
173
- };
174
- const request = {
175
- org_id: orgId,
176
- chat_id: chatId,
177
- user_id: userId
178
- };
179
- try {
180
- data = await CommerceApiClient.getInstance().defaultApi.v1GetSessionMessages(request);
181
- } catch (error) {
182
- await throwSessionRestartRequiredIf("Failed to get chat responses", error);
183
- }
184
- const responses = data?.responses?.map((turn) => turn.map((response) => validateResponse(response)).filter((response) => response != null));
185
- const suggestions = data?.suggestions.map((suggestion) => validateSuggestion(suggestion)).filter((suggestion) => suggestion != null);
186
- const userEvents = data?.user_events.map((event) => validateUserEvent(event)).filter((event) => event != null);
187
- const formSubmittedUserEventsFormIds = userEvents.filter((event) => event.category === UserEventCategory.FormSubmitted).map((event) => event.attributes.formResponseId);
188
- const assistantMessages = responses.map((turn) => turn.filter((response) => !(response.category === ResponseCategory.Form && formSubmittedUserEventsFormIds.includes(response.id))).map((response) => messageFromResponse(response)).filter((message) => message != null)).filter((turn) => turn.length > 0);
189
- const userMessages = userEvents.map((event) => {
190
- if ([UserEventCategory.QueryTyped, UserEventCategory.Search].includes(event.category)) return [messageFromQueryEvent(event)];
191
- if (event.category === UserEventCategory.SuggestionClicked) return [messageFromSuggestionEvent(event, suggestions)];
192
- if (event.category === UserEventCategory.FormSubmitted) {
193
- const formResponse = responses.flat().find((response) => response.id === event.attributes.formResponseId && event.attributes.formType !== FormType.Escalation);
194
- if (formResponse && formResponse.category === ResponseCategory.Form) return [messageFromFormSubmittedEvent(event, formResponse.attributes)];
195
- }
196
- return [];
197
- }).filter((message) => message.length > 0);
198
- const sortedMessages = [...assistantMessages, ...userMessages].sort((a, b) => new Date(a[0].createdAt).getTime() - new Date(b[0].createdAt).getTime());
199
- return {
200
- responses,
201
- userEvents,
202
- suggestions,
203
- messages: sortedMessages
204
- };
205
- };
206
- }
207
- static {
208
- this.isSupportedEvent = async (payload) => {
209
- try {
210
- const httpResponseText = await (await CommerceApiClient.getInstance().inferenceApi.v1SupportedEventPostRaw({ SupportedEventRequest: coreSupportedEventRequestToApiRequest(payload) })).raw.text();
211
- const httpResponseJson = JSON.parse(httpResponseText);
212
- return {
213
- ...httpResponseJson,
214
- numberOfReviews: httpResponseJson.num_of_reviews,
215
- merchant_tags: httpResponseJson.merchant_tags || []
216
- };
217
- } catch (err) {
218
- logger_default.logError("Failed to get response for v1SupportedEventPost", { err });
219
- return {
220
- supported: false,
221
- ready: false,
222
- category: void 0,
223
- collections: [],
224
- numberOfReviews: void 0,
225
- top_category: void 0,
226
- merchant_tags: []
227
- };
228
- }
229
- };
230
- }
231
- static {
232
- this.identifyUser = async (spiffyUserId, merchantUserId, uaDetails) => {
233
- try {
234
- await CommerceApiClient.getInstance().defaultApi.v1AnalyticsIdentifyPost({ AnalyticsIdentifyRequest: {
235
- user_id: spiffyUserId,
236
- os_name: uaDetails.os,
237
- os_version: uaDetails.osVersion,
238
- platform: uaDetails.os,
239
- device_id: uaDetails.deviceModel,
240
- device_brand: uaDetails.deviceBrand,
241
- device_manufacturer: uaDetails.deviceManufacturer,
242
- device_model: uaDetails.deviceModel,
243
- user_properties: {
244
- cdp_user_id: merchantUserId,
245
- browser: uaDetails.browser,
246
- browser_version: uaDetails.browserVersion,
247
- user_agent: uaDetails.userAgent
248
- }
249
- } });
250
- } catch (err) {
251
- logger_default.logError("Failed to identify user", err);
252
- }
253
- };
254
- }
255
- static {
256
- this.mapContextSourceToV1OrgConfigGetSource = (source) => {
257
- if (source === void 0) return void 0;
258
- switch (source) {
259
- case ContextSourceEnum.Fork: return V1OrgConfigGetSourceEnum.Fork;
260
- case ContextSourceEnum.Playground: return V1OrgConfigGetSourceEnum.Playground;
261
- case ContextSourceEnum.App: return V1OrgConfigGetSourceEnum.App;
262
- case ContextSourceEnum.Test: return V1OrgConfigGetSourceEnum.Test;
263
- default: return source;
264
- }
265
- };
266
- }
267
- static {
268
- this.getOrgConfig = async (user_id) => {
269
- try {
270
- const atomStore = getAtomStore();
271
- const reactAppName = atomStore.get(reactAppNameAtom);
272
- const contextSource = atomStore.get(contextSourceAtom);
273
- const featureFlagService = atomStore.get(featureFlagServiceAtom);
274
- const request = {
275
- namespace: reactAppName,
276
- user_id,
277
- source: this.mapContextSourceToV1OrgConfigGetSource(contextSource),
278
- include_experiments: Object.values(ProductExperiment),
279
- include_feature_gates: Object.entries(featureFlagService?.featureFlagService?.getFeatureFlags() || {}).filter(([, isEnabled]) => isEnabled).map(([featureGateName]) => featureGateName)
280
- };
281
- const response = await CommerceApiClient.getInstance().defaultApi.v1OrgConfigGet(request);
282
- return validateOrgConfigResults(response);
283
- } catch (err) {
284
- logger_default.logError(`Failed to get org config`, err, { err });
285
- return;
286
- }
287
- };
288
- }
289
- static {
290
- this.addNoteToLatestConversation = async (spiffyUserId, email, customerServiceProvider) => {
291
- logger_default.logInfo(`addNoteToLatestConversation - user_id=${spiffyUserId} email=${email} customer_service_provider=${customerServiceProvider}`);
292
- try {
293
- await CommerceApiClient.getInstance().customerServiceApi.v1CustserviceAddNoteToLatestConversationPost({ AddNoteToLatestConversationRequest: {
294
- spiffy_user_id: spiffyUserId,
295
- email,
296
- customer_service_provider: customerServiceProvider
297
- } });
298
- } catch (err) {
299
- logger_default.logError("Failed to add note to latest conversation", { err });
300
- }
301
- };
302
- }
303
- static {
304
- this.getCustomerServiceApi = () => CommerceApiClient.getInstance().customerServiceApi;
305
- }
306
- };
307
- var commerce_api_default = CommerceApiClient;
308
-
309
- //#endregion
310
- export { commerce_api_default };
311
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2UtYXBpLUR6MWp4UE9KLmpzIiwibmFtZXMiOlsiY29uZmlnOiBDb25maWd1cmF0aW9uIiwiY29udGV4dDogQ29udGV4dCIsImVycjogdW5rbm93biIsImVycm9yOiB1bmtub3duIiwiZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSIsInJlc3BvbnNlczogUmVzcG9uc2VbXVtdIiwic3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSIsInVzZXJFdmVudHM6IFVzZXJFdmVudFtdIiwiYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdIiwidXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsInJlcXVlc3Q6IFYxT3JnQ29uZmlnR2V0UmVxdWVzdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBsaWNhdGlvbi9jb21tZXJjZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIERlZmF1bHRBcGksXG4gIEluZmVyZW5jZUFwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0sXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBSZXNwb25zZUNhdGVnb3J5LFxuICBGb3JtVHlwZSxcbn0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHsgdmFsaWRhdGVTdWdnZXN0aW9uIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVN1Z2dlc3Rpb25cIjtcbmltcG9ydCB7IHZhbGlkYXRlVXNlckV2ZW50IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudFwiO1xuaW1wb3J0IHtcbiAgbWVzc2FnZUZyb21RdWVyeUV2ZW50LFxuICBtZXNzYWdlRnJvbVJlc3BvbnNlLFxuICBtZXNzYWdlRnJvbVN1Z2dlc3Rpb25FdmVudCxcbn0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICBSZXNwb25zZSxcbiAgU3VnZ2VzdGlvbixcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBVc2VyRXZlbnQsXG59IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzXCI7XG5pbXBvcnQgeyBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0XCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlc3BvbnNlIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVJlc3BvbnNlXCI7XG5pbXBvcnQgeyBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi91dGlscy9zdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3RcIjtcbmltcG9ydCB7IFNlc3Npb25SZXN0YXJ0UmVxdWlyZWQgfSBmcm9tIFwic3JjL3R5cGVzL2V4Y2VwdGlvbnMvc2Vzc2lvbkV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkUHJvZHVjdEV4Y2VwdGlvbiB9IGZyb20gXCJzcmMvdHlwZXMvZXhjZXB0aW9ucy91bnN1cHBvcnRlZFByb2R1Y3RFeGNlcHRpb25zXCI7XG5pbXBvcnQgeyBDbGllbnREZXRhaWxzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2xpZW50RGV0YWlsc1wiO1xuaW1wb3J0IHsgZ2V0QXRvbVN0b3JlIH0gZnJvbSBcInNyYy9hdG9tcy9hdG9tU3RvcmUvYXRvbVN0b3JlXCI7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpbWVudCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3Byb2R1Y3RFeHBlcmltZW50XCI7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9mZWF0dXJlR2F0ZXNcIjtcbmltcG9ydCB7IHZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzXCI7XG5pbXBvcnQgeyBPcmdDb25maWcgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnQ29uZmlnUmVzdWx0c1wiO1xuaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnQgfSBmcm9tIFwic3JjL2F0b21zL2FwcC92YXJpYW50XCI7XG5pbXBvcnQgeyBtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQvZGlzdC9tb2RlbHMvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29udGV4dEVudkVudW0gfSBmcm9tIFwiQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50XCI7IC8vIEltcG9ydCBDb250ZXh0RW52RW51bVxuaW1wb3J0IHtcbiAgYmFzZVVybEF0b20sXG4gIHJlYWN0QXBwTmFtZUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBvcmdTaG9ydE5hbWVBdG9tLFxuICBlbnZBdG9tLCAvLyBJbXBvcnQgZW52QXRvbVxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20sIGNoYXRJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiOyAvLyBJbXBvcnQgdXNlcklkQXRvbSBhbmQgY2hhdElkQXRvbVxuaW1wb3J0IHsgb3JnSWRBdG9tLCBmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvZ3JhcGhxbENvbmZpZ1wiOyAvLyBJbXBvcnQgbmV3IG9yZ0lkQXRvbSBhbmQgZmVhdHVyZUZsYWdTZXJ2aWNlQXRvbVxuXG5hc3luYyBmdW5jdGlvbiBlcnJvclJlc3BvbnNlQm9keShlcnJvcjogUmVzcG9uc2VFcnJvcikge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlcnJvci5yZXNwb25zZS5qc29uKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZihlcnJvck1zZzogc3RyaW5nLCBlcnJvcjogdW5rbm93bikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IpKSB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBhd2FpdCBlcnJvclJlc3BvbnNlQm9keShlcnJvcik7XG4gIGlmIChcbiAgICBlcnJvclJlc3BvbnNlPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpID09PSBcInVuc3VwcG9ydGVkIHByb2R1Y3RcIiB8fCAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIEFQSSByZXR1cm4gc3ViX2NvZGUgaW5zdGVhZCBvZiBtZXNzYWdlXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUFJPRFVDVF9OT1RfRk9VTkRcIlxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUkVTVEFSVF9TRVNTSU9OXCIgfHxcbiAgICBlcnJvclJlc3BvbnNlPy5zdWJfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gXCJOT1RfRk9VTkRcIiAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3IEFQSSByZXNwb25zZXMgd2lsbCBjb250YWluIFwiYXBwX2NvZGVcIlxuICApIHtcbiAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgIFwiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdC4gUmUtc3RhcnQgc2Vzc2lvblwiLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXNzaW9uUmVzdGFydFJlcXVpcmVkKCk7XG4gIH1cblxuICBMb2dnZXIubG9nSW5mbyhlcnJvck1zZywgZXJyb3IpO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuY2xhc3MgQ29tbWVyY2VBcGlDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcGk6IERlZmF1bHRBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21lclNlcnZpY2VBcGk6IEN1c3RvbWVyU2VydmljZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpO1xuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tZXJjZUFwaUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgcmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgc3RhdGljIGdldEluc3RhbmNlID0gKCk6IENvbW1lcmNlQXBpQ2xpZW50ID0+IHtcbiAgICBpZiAoIUNvbW1lcmNlQXBpQ2xpZW50Lmluc3RhbmNlKSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSA9IG5ldyBDb21tZXJjZUFwaUNsaWVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZTtcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhc2VQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYXRvbVN0b3JlID0gZ2V0QXRvbVN0b3JlKCk7XG4gICAgY29uc3QgYmFzZVVybCA9IGF0b21TdG9yZS5nZXQoYmFzZVVybEF0b20pO1xuICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aCB8fCBiYXNlVXJsO1xuICAgIC8vIEFQSSBLZXkgaXMgbm93IGhhbmRsZWQgYXQgdGhlIEVudml2ZUNvbmZpZ1Byb3ZpZGVyIGxldmVsXG4gICAgY29uc3QgY29uZmlnOiBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oe1xuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIHJlc29sdmVVcmwgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IHVzZXJJZCA9IGF0b21TdG9yZS5nZXQodXNlcklkQXRvbSk7XG4gICAgY29uc3QgY2hhdElkID0gYXRvbVN0b3JlLmdldChjaGF0SWRBdG9tKTtcbiAgICBjb25zdCBzb3VyY2UgPSBhdG9tU3RvcmUuZ2V0KGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgICBjb25zdCBlbnYgPSBhdG9tU3RvcmUuZ2V0KGVudkF0b20pO1xuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICB1c2VyX2lkOiB1c2VySWQgPz8gXCJcIixcbiAgICAgIG9yZ19pZDogb3JnSWQgPz8gXCJcIixcbiAgICAgIG9yZ19zaG9ydF9uYW1lOiBvcmdTaG9ydE5hbWUgPz8gXCJcIixcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCA/PyBcIlwiLFxuICAgICAgc291cmNlOiBzb3VyY2UgPz8gQ29udGV4dFNvdXJjZUVudW0uQXBwLFxuICAgICAgZW52OiAoZW52IGFzIENvbnRleHRFbnZFbnVtKSA/PyBDb250ZXh0RW52RW51bS5EZXYsIC8vIENhc3QgZW52IHRvIENvbnRleHRFbnZFbnVtXG4gICAgfTtcblxuICAgIGNvbnN0IGZlYXR1cmVHYXRlcyA9XG4gICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge307XG4gICAgY29uc3QgdXJsUmVzb2x2aW5nUmVxdWVzdCA9IHtcbiAgICAgIHVybCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBmZWF0dXJlX2dhdGVzOiBmZWF0dXJlR2F0ZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJhd1Jlc3BvbnNlID1cbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxVXJsUmVzb2x2aW5nUG9zdFJhdyh7XG4gICAgICAgIFVybFJlc29sdmluZ1JlcXVlc3Q6IHVybFJlc29sdmluZ1JlcXVlc3QsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJhd1Jlc3BvbnNlLnJhdy5qc29uKCk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xuICB9O1xuXG4gIHN0YXRpYyByZXBvcnRTZXNzaW9uID0gYXN5bmMgKFxuICAgIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFNlc3Npb25SZXF1ZXN0XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUNoYXRzUmVwb3J0U2Vzc2lvbklkUG9zdChcbiAgICAgIHtcbiAgICAgICAgUmVwb3J0U2Vzc2lvblJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlcyA9IGFzeW5jIChcbiAgICBwYXlsb2FkOiBOZXh0TWVzc2FnZVJlcXVlc3RcbiAgKTogUHJvbWlzZTxNZXNzYWdlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0KHtcbiAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwKSlcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwKSk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5maWx0ZXIoKG0pOiBtIGlzIE1lc3NhZ2UgPT4gbSAhPSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgIExvZ2dlci5sb2dJbmZvKFwiRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlc1wiLCBlcnIsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKFwiRmFpbGVkIHRvIGdldCBuZXh0IHJlc3BvbnNlc1wiLCBlcnIpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nID0gKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBBc3luY0dlbmVyYXRvcjxSZXNwb25zZSwgdm9pZCwgdW5rbm93bj4gPT4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uKiBnZW5lcmF0ZShcbiAgICAgIGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpLFxuICAgICAgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgICApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBzdHJlYW1pbmcgaXMgZW5hYmxlZFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpbmZlcmVuY2VBcGkudjFOZXh0UmVzcG9uc2VzUG9zdFJhdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGFzIGEgc3RyZWFtIG9mIGRhdGFcbiAgICAgICAgaWYgKCFyZXNwb25zZS5yYXcuYm9keSkge1xuICAgICAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgICAgIFwiW3NwaWZmeS1haV0gTm8gYm9keSBpbiB0aGUgc3RyZWFtZWQgcmVzcG9uc2VcIixcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLnJhdyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLnJhdy5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7XG5cbiAgICAgICAgbGV0IHBhcnRpYWwgPSBcIlwiO1xuICAgICAgICAvLyBUT0RPIHRoaXMgZnVuY3Rpb24gaXMgcmVjcmVhdGVkIGV2ZXJ5IHRpbWUgbmV3IGRhdGEgY29tZXMgZnJvbSB0aGUgc3RyZWFtIC0gZGVmaW5lIGl0IG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvclxuICAgICAgICBjb25zdCBzYWZlUGFyc2UgPSAobGluZTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxpbmUpOyAvLyBQYXJzZSB0aGUgSlNPTiBzdHJpbmdcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIExvZ2dlci5sb2dFcnJvcihcIltzcGlmZnktYWldIEVycm9yIHBhcnNpbmcgc3RyZWFtZWQgbGluZVwiLCBlcnIsIHtcbiAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgcGFydGlhbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gc3dhbGxvdyB0aGUgZXJyb3IgYW5kIHNldCB0aGUgcGFydGlhbCB0byBvdXIgY3VycmVudCBjaHVua1xuICAgICAgICAgICAgcGFydGlhbCA9IGxpbmU7XG4gICAgICAgICAgICByZXR1cm4gcGFydGlhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETyB0aGlzIGZ1bmN0aW9uIGlzIHJlY3JlYXRlZCBldmVyeSB0aW1lIG5ldyBkYXRhIGNvbWVzIGZyb20gdGhlIHN0cmVhbSAtIGRlZmluZSBpdCBvdXRzaWRlIG9mIHRoZSBnZW5lcmF0b3JcbiAgICAgICAgY29uc3QgcHJvY2Vzc0NodW5rID0gKGNodW5rOiBzdHJpbmcpOiB1bmtub3duW10gPT4ge1xuICAgICAgICAgIC8vIG1lcmdlIHRoZSBwYXJ0aWFsIHdpdGggdGhlIGluY29taW5nIGNodW5rXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBgJHtwYXJ0aWFsfSR7Y2h1bmt9YC5zcGxpdChcIlxcblwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcnNlZExpbmVzID0gbGluZXNcbiAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUucmVwbGFjZSgvXmRhdGE6IC8sIFwiXCIpLnRyaW0oKSkgLy8gUmVtb3ZlIHRoZSBcImRhdGE6IFwiIHByZWZpeFxuICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gXCJcIiAmJiBsaW5lICE9PSBcIltET05FXVwiKSAvLyBSZW1vdmUgZW1wdHkgbGluZXMgYW5kIFwiW0RPTkVdXCJcbiAgICAgICAgICAgIC5tYXAoc2FmZVBhcnNlKVxuICAgICAgICAgICAgLmZpbHRlcigodikgPT4gdik7IC8vIGFuZCBmaWx0ZXIgb3V0IHRoZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgICAgICAgcmV0dXJuIHBhcnNlZExpbmVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuXG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1hc3NhZ2UgYW5kIHBhcnNlIHRoZSBjaHVuayBvZiBkYXRhXG4gICAgICAgICAgY29uc3QgY2h1bmsgPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgY29uc3QgcGFyc2VkTGluZXMgPSBwcm9jZXNzQ2h1bmsoY2h1bmspO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXJzZWRMaW5lIG9mIHBhcnNlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRSZXNwb25zZSA9IHZhbGlkYXRlUmVzcG9uc2UocGFyc2VkTGluZSk7XG5cbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB5aWVsZCB2YWxpZGF0ZWRSZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgICBcIltzcGlmZnktYWldIEZhaWxlZCB0byBnZXQgbmV4dCBzdHJlYW1pbmcgcmVzcG9uc2VzXCIsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgICAgICB1c2VyRXZlbnRzOiBwYXlsb2FkPy51c2VyRXZlbnRzLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gZ2V0IG5leHQgc3RyZWFtaW5nIHJlc3BvbnNlc1wiLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5yZXNwb25zZXNBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlciA9XG4gICAgICBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdGUoXG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaSxcbiAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyXG4gICAgKTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0TmV4dFN1Z2dlc3Rpb25zID0gYXN5bmMgKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBQcm9taXNlPFN1Z2dlc3Rpb25bXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID1cbiAgICAgICAgbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxTmV4dFN1Z2dlc3Rpb25zUG9zdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBOZXh0TWVzc2FnZVJlcXVlc3Q6IG1lc3NhZ2VSZXF1ZXN0VG9Db21tZXJjZU1lc3NhZ2VSZXF1ZXN0KHBheWxvYWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2lnbmFsOlxuICAgICAgICAgICAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVzcCkgPT4gdmFsaWRhdGVTdWdnZXN0aW9uKHJlc3ApKVxuICAgICAgICAuZmlsdGVyKChzdWdnZXN0aW9uKTogc3VnZ2VzdGlvbiBpcyBTdWdnZXN0aW9uID0+IHN1Z2dlc3Rpb24gIT0gbnVsbCk7XG5cbiAgICAgIHJldHVybiBzdWdnZXN0aW9ucztcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXCJGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zXCIsIGVycm9yLCB7XG4gICAgICAgIHBheWxvYWRDb250ZXh0OiBwYXlsb2FkPy5jb250ZXh0LFxuICAgICAgICB1c2VyRXZlbnRzOiBwYXlsb2FkPy51c2VyRXZlbnRzLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRocm93U2Vzc2lvblJlc3RhcnRSZXF1aXJlZElmKFwiRmFpbGVkIHRvIGdldCBzdWdnZXN0aW9uc1wiLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBleGlzdGluZyBjaGF0IGRhdGEgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgdHJhbnNmb3JtcyB0aGVtIHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCBUaGUgb3JnYW5pemF0aW9uIElkXG4gICAqIEBwYXJhbSBjaGF0SWQgVGhlIGV4aXN0aW5nIGNoYXQgSWRcbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdXNlciBJZFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCB3ZXJlIGV4Y2hhbmdlZCBpbiB0aGUgY2hhdCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjaGF0IHNlc3Npb24gaGFzIGV4cGlyZWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgY2hhdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7XG4gICAgcmVzcG9uc2VzOiBSZXNwb25zZVtdW107XG4gICAgdXNlckV2ZW50czogVXNlckV2ZW50W107XG4gICAgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXTtcbiAgICBtZXNzYWdlczogTWVzc2FnZVtdW107XG4gIH0+ID0+IHtcbiAgICBsZXQgZGF0YTogVjFHZXRTZXNzaW9uTWVzc2FnZXMyMDBSZXNwb25zZSA9IHtcbiAgICAgIHJlc3BvbnNlczogW10sXG4gICAgICBzdWdnZXN0aW9uczogW10sXG4gICAgICB1c2VyX2V2ZW50czogW10sXG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgb3JnX2lkOiBvcmdJZCxcbiAgICAgIGNoYXRfaWQ6IGNoYXRJZCxcbiAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBkYXRhID1cbiAgICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5kZWZhdWx0QXBpLnYxR2V0U2Vzc2lvbk1lc3NhZ2VzKFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXG4gICAgICAgIFwiRmFpbGVkIHRvIGdldCBjaGF0IHJlc3BvbnNlc1wiLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZXM6IFJlc3BvbnNlW11bXSA9IGRhdGE/LnJlc3BvbnNlcz8ubWFwKCh0dXJuKSA9PlxuICAgICAgdHVyblxuICAgICAgICAubWFwKChyZXNwb25zZSkgPT4gdmFsaWRhdGVSZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgIC5maWx0ZXIoKHJlc3BvbnNlKTogcmVzcG9uc2UgaXMgUmVzcG9uc2UgPT4gcmVzcG9uc2UgIT0gbnVsbClcbiAgICApO1xuXG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25bXSA9IGRhdGE/LnN1Z2dlc3Rpb25zXG4gICAgICAubWFwKChzdWdnZXN0aW9uKSA9PiB2YWxpZGF0ZVN1Z2dlc3Rpb24oc3VnZ2VzdGlvbikpXG4gICAgICAuZmlsdGVyKChzdWdnZXN0aW9uKTogc3VnZ2VzdGlvbiBpcyBTdWdnZXN0aW9uID0+IHN1Z2dlc3Rpb24gIT0gbnVsbCk7XG5cbiAgICBjb25zdCB1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXSA9IGRhdGE/LnVzZXJfZXZlbnRzXG4gICAgICAubWFwKChldmVudCkgPT4gdmFsaWRhdGVVc2VyRXZlbnQoZXZlbnQpKVxuICAgICAgLmZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBVc2VyRXZlbnQgPT4gZXZlbnQgIT0gbnVsbCk7XG5cbiAgICAvLyBpZiBhIGZvcm0gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQsIGRvbid0IHNob3cgaXQgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcyA9IHVzZXJFdmVudHNcbiAgICAgIC5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZClcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiBldmVudC5hdHRyaWJ1dGVzLmZvcm1SZXNwb25zZUlkKTtcblxuICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2VzOiBNZXNzYWdlW11bXSA9IHJlc3BvbnNlc1xuICAgICAgLm1hcCgodHVybikgPT5cbiAgICAgICAgdHVyblxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuRm9ybSAmJlxuICAgICAgICAgICAgICAgIGZvcm1TdWJtaXR0ZWRVc2VyRXZlbnRzRm9ybUlkcy5pbmNsdWRlcyhyZXNwb25zZS5pZClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAubWFwKChyZXNwb25zZSkgPT4gbWVzc2FnZUZyb21SZXNwb25zZShyZXNwb25zZSkpXG4gICAgICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZSA9PiBtZXNzYWdlICE9IG51bGwpXG4gICAgICApXG4gICAgICAuZmlsdGVyKCh0dXJuKSA9PiB0dXJuLmxlbmd0aCA+IDApO1xuXG4gICAgY29uc3QgdXNlck1lc3NhZ2VzOiBNZXNzYWdlW11bXSA9IHVzZXJFdmVudHNcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBbVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCwgVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIGV2ZW50LmNhdGVnb3J5XG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gW21lc3NhZ2VGcm9tUXVlcnlFdmVudChldmVudCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQoZXZlbnQsIHN1Z2dlc3Rpb25zKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZXNcbiAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAocmVzcG9uc2UpID0+XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPT09IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5hdHRyaWJ1dGVzLmZvcm1UeXBlICE9PSBGb3JtVHlwZS5Fc2NhbGF0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGZvcm1SZXNwb25zZSAmJiBmb3JtUmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuRm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQoZXZlbnQsIGZvcm1SZXNwb25zZS5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG1lc3NhZ2UpOiBtZXNzYWdlIGlzIE1lc3NhZ2VbXSA9PiBtZXNzYWdlLmxlbmd0aCA+IDApO1xuXG4gICAgLy8gU29ydCB0aGUgbWVzc2FnZXMgY2hyb25vbG9naWNhbGx5IHRvIHJlY29uc3RydWN0IHRoZSBjaGF0IGhpc3RvcnlcbiAgICBjb25zdCBzb3J0ZWRNZXNzYWdlcyA9IFsuLi5hc3Npc3RhbnRNZXNzYWdlcywgLi4udXNlck1lc3NhZ2VzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+XG4gICAgICAgIG5ldyBEYXRlKGFbMF0uY3JlYXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiWzBdLmNyZWF0ZWRBdCkuZ2V0VGltZSgpXG4gICAgKTtcblxuICAgIHJldHVybiB7IHJlc3BvbnNlcywgdXNlckV2ZW50cywgc3VnZ2VzdGlvbnMsIG1lc3NhZ2VzOiBzb3J0ZWRNZXNzYWdlcyB9O1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGlzU3VwcG9ydGVkRXZlbnQgPSBhc3luYyAoXG4gICAgcGF5bG9hZDogU3VwcG9ydGVkRXZlbnRSZXF1ZXN0XG4gICk6IFByb21pc2U8U3VwcG9ydGVkRXZlbnQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmluZmVyZW5jZUFwaS52MVN1cHBvcnRlZEV2ZW50UG9zdFJhdyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBTdXBwb3J0ZWRFdmVudFJlcXVlc3Q6XG4gICAgICAgICAgICAgIGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBIVFRQIHJlc3BvbnNlIEpTT05cbiAgICAgIGNvbnN0IGh0dHBSZXNwb25zZVRleHQgPSBhd2FpdCByYXdSZXNwb25zZS5yYXcudGV4dCgpO1xuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlSnNvbiA9IEpTT04ucGFyc2UoaHR0cFJlc3BvbnNlVGV4dCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmh0dHBSZXNwb25zZUpzb24sXG4gICAgICAgIG51bWJlck9mUmV2aWV3czogaHR0cFJlc3BvbnNlSnNvbi5udW1fb2ZfcmV2aWV3cyxcbiAgICAgICAgbWVyY2hhbnRfdGFnczogaHR0cFJlc3BvbnNlSnNvbi5tZXJjaGFudF90YWdzIHx8IFtdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcIkZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZm9yIHYxU3VwcG9ydGVkRXZlbnRQb3N0XCIsIHtcbiAgICAgICAgZXJyLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgIGNhdGVnb3J5OiB1bmRlZmluZWQsXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbXSxcbiAgICAgICAgbnVtYmVyT2ZSZXZpZXdzOiB1bmRlZmluZWQsXG4gICAgICAgIHRvcF9jYXRlZ29yeTogdW5kZWZpbmVkLFxuICAgICAgICBtZXJjaGFudF90YWdzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBpZGVudGlmeVVzZXIgPSBhc3luYyAoXG4gICAgc3BpZmZ5VXNlcklkOiBzdHJpbmcsXG4gICAgbWVyY2hhbnRVc2VySWQ6IHN0cmluZyxcbiAgICB1YURldGFpbHM6IENsaWVudERldGFpbHNcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuZGVmYXVsdEFwaS52MUFuYWx5dGljc0lkZW50aWZ5UG9zdCh7XG4gICAgICAgIEFuYWx5dGljc0lkZW50aWZ5UmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJfaWQ6IHNwaWZmeVVzZXJJZCxcbiAgICAgICAgICBvc19uYW1lOiB1YURldGFpbHMub3MsXG4gICAgICAgICAgb3NfdmVyc2lvbjogdWFEZXRhaWxzLm9zVmVyc2lvbixcbiAgICAgICAgICBwbGF0Zm9ybTogdWFEZXRhaWxzLm9zLFxuICAgICAgICAgIGRldmljZV9pZDogdWFEZXRhaWxzLmRldmljZU1vZGVsLFxuICAgICAgICAgIGRldmljZV9icmFuZDogdWFEZXRhaWxzLmRldmljZUJyYW5kLFxuICAgICAgICAgIGRldmljZV9tYW51ZmFjdHVyZXI6IHVhRGV0YWlscy5kZXZpY2VNYW51ZmFjdHVyZXIsXG4gICAgICAgICAgZGV2aWNlX21vZGVsOiB1YURldGFpbHMuZGV2aWNlTW9kZWwsXG4gICAgICAgICAgdXNlcl9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjZHBfdXNlcl9pZDogbWVyY2hhbnRVc2VySWQsXG4gICAgICAgICAgICBicm93c2VyOiB1YURldGFpbHMuYnJvd3NlcixcbiAgICAgICAgICAgIGJyb3dzZXJfdmVyc2lvbjogdWFEZXRhaWxzLmJyb3dzZXJWZXJzaW9uLFxuICAgICAgICAgICAgdXNlcl9hZ2VudDogdWFEZXRhaWxzLnVzZXJBZ2VudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJGYWlsZWQgdG8gaWRlbnRpZnkgdXNlclwiLCBlcnIpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBtYXBDb250ZXh0U291cmNlVG9WMU9yZ0NvbmZpZ0dldFNvdXJjZSA9IChcbiAgICBzb3VyY2U6IENvbnRleHRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkXG4gICk6IFYxT3JnQ29uZmlnR2V0U291cmNlRW51bSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLkZvcms6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uRm9yaztcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uUGxheWdyb3VuZDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5QbGF5Z3JvdW5kO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5BcHA6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uQXBwO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5UZXN0OlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlRlc3Q7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGlmIG5ldyB2YWx1ZXMgYXJlIGFkZGVkIHRvIENvbnRleHRTb3VyY2VFbnVtLCB3ZSBjYXRjaCBpdFxuICAgICAgICBjb25zdCBleGhhdXN0aXZlQ2hlY2s6IG5ldmVyID0gc291cmNlO1xuICAgICAgICByZXR1cm4gZXhoYXVzdGl2ZUNoZWNrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZ2V0T3JnQ29uZmlnID0gYXN5bmMgKFxuICAgIHVzZXJfaWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPE9yZ0NvbmZpZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICAgIGNvbnN0IHJlYWN0QXBwTmFtZSA9IGF0b21TdG9yZS5nZXQocmVhY3RBcHBOYW1lQXRvbSk7XG4gICAgICBjb25zdCBjb250ZXh0U291cmNlID0gYXRvbVN0b3JlLmdldChjb250ZXh0U291cmNlQXRvbSk7XG4gICAgICBjb25zdCBmZWF0dXJlRmxhZ1NlcnZpY2UgPSBhdG9tU3RvcmUuZ2V0KGZlYXR1cmVGbGFnU2VydmljZUF0b20pOyAvLyBHZXQgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICBjb25zdCByZXF1ZXN0OiBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QgPSB7XG4gICAgICAgIG5hbWVzcGFjZTogcmVhY3RBcHBOYW1lLFxuICAgICAgICB1c2VyX2lkLFxuICAgICAgICBzb3VyY2U6IHRoaXMubWFwQ29udGV4dFNvdXJjZVRvVjFPcmdDb25maWdHZXRTb3VyY2UoY29udGV4dFNvdXJjZSksXG4gICAgICAgIGluY2x1ZGVfZXhwZXJpbWVudHM6IE9iamVjdC52YWx1ZXMoUHJvZHVjdEV4cGVyaW1lbnQpLFxuICAgICAgICBpbmNsdWRlX2ZlYXR1cmVfZ2F0ZXM6IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgIGZlYXR1cmVGbGFnU2VydmljZT8uZmVhdHVyZUZsYWdTZXJ2aWNlPy5nZXRGZWF0dXJlRmxhZ3MoKSB8fCB7fVxuICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcigoWywgaXNFbmFibGVkXSkgPT4gaXNFbmFibGVkKVxuICAgICAgICAgIC5tYXAoKFtmZWF0dXJlR2F0ZU5hbWVdKSA9PiBmZWF0dXJlR2F0ZU5hbWUpLCAvLyBVc2UgZmVhdHVyZUZsYWdTZXJ2aWNlXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFPcmdDb25maWdHZXQoXG4gICAgICAgICAgcmVxdWVzdFxuICAgICAgICApO1xuXG4gICAgICByZXR1cm4gdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzKHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihgRmFpbGVkIHRvIGdldCBvcmcgY29uZmlnYCwgZXJyLCB7IGVyciB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBhZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb24gPSBhc3luYyAoXG4gICAgc3BpZmZ5VXNlcklkOiBzdHJpbmcsXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBjdXN0b21lclNlcnZpY2VQcm92aWRlcjogQ3VzdG9tZXJTZXJ2aWNlUHJvdmlkZXJcbiAgKSA9PiB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oXG4gICAgICBgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uIC0gdXNlcl9pZD0ke3NwaWZmeVVzZXJJZH0gZW1haWw9JHtlbWFpbH0gY3VzdG9tZXJfc2VydmljZV9wcm92aWRlcj0ke2N1c3RvbWVyU2VydmljZVByb3ZpZGVyfWBcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmN1c3RvbWVyU2VydmljZUFwaS52MUN1c3RzZXJ2aWNlQWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uUG9zdChcbiAgICAgICAge1xuICAgICAgICAgIEFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHNwaWZmeV91c2VyX2lkOiBzcGlmZnlVc2VySWQsXG4gICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgIGN1c3RvbWVyX3NlcnZpY2VfcHJvdmlkZXI6IGN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXCJGYWlsZWQgdG8gYWRkIG5vdGUgdG8gbGF0ZXN0IGNvbnZlcnNhdGlvblwiLCB7IGVyciB9KTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldEN1c3RvbWVyU2VydmljZUFwaSA9ICgpID0+XG4gICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1lcmNlQXBpQ2xpZW50O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXlEQSxlQUFlLGtCQUFrQixPQUFzQjtBQUNyRCxLQUFJO0FBQ0YsU0FBTyxNQUFNLE1BQU0sU0FBUyxNQUFNO1NBQzVCO0FBQ04sU0FBTyxFQUFFOzs7QUFJYixlQUFlLDhCQUE4QixVQUFrQixPQUFnQjtBQUM3RSxLQUFJLEVBQUUsaUJBQWlCLGdCQUFnQjtBQUNyQyxpQkFBTyxRQUFRLFVBQVUsTUFBTTtBQUMvQixRQUFNOztDQUdSLE1BQU0sZ0JBQWdCLE1BQU0sa0JB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