@envive-ai/react-hooks 0.2.7-arthur-1 → 0.2.7-arthur-2

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 (176) hide show
  1. package/dist/{NewOrgConfig-yptI2imS.js → NewOrgConfig-BVByiYPp.js} +2 -2
  2. package/dist/{NewOrgConfig-Bo1seKr6.cjs → NewOrgConfig-CInGtTV6.cjs} +2 -2
  3. package/dist/{SystemSettingsContext-EDpRMMt2.cjs → SystemSettingsContext-150LTxIk.cjs} +2 -2
  4. package/dist/{SystemSettingsContext-BY1BFgAQ.js → SystemSettingsContext-ei5B0dxO.js} +2 -2
  5. package/dist/{TrackComponentVisibleEvent-CgxCqrIt.cjs → TrackComponentVisibleEvent-C7-nnBks.cjs} +2 -2
  6. package/dist/{TrackComponentVisibleEvent-CXhKOwKQ.js → TrackComponentVisibleEvent-CuwSLbug.js} +2 -2
  7. package/dist/amplitudeContext-BBQ1ATA3.js +265 -0
  8. package/dist/amplitudeContext-C-0-DDk3.cjs +287 -0
  9. package/dist/{app-CflxT_xI.js → app-C_Y-57U5.js} +3 -4
  10. package/dist/{app-BbPSHefQ.cjs → app-XEFPotoH.cjs} +3 -4
  11. package/dist/application/utils/index.cjs +8 -8
  12. package/dist/application/utils/index.d.cts +2 -2
  13. package/dist/application/utils/index.d.ts +2 -2
  14. package/dist/application/utils/index.js +8 -8
  15. package/dist/{atomStore-CmZbgQHc.cjs → atomStore-8ppNkJ_n.cjs} +1 -1
  16. package/dist/{atomStore-DEcDhiLp.js → atomStore-BLYJ2ZoQ.js} +1 -1
  17. package/dist/atoms/app/index.cjs +4 -4
  18. package/dist/atoms/app/index.d.cts +7 -7
  19. package/dist/atoms/app/index.d.ts +7 -7
  20. package/dist/atoms/app/index.js +4 -4
  21. package/dist/atoms/atomStore/index.cjs +1 -1
  22. package/dist/atoms/atomStore/index.js +1 -1
  23. package/dist/atoms/chat/index.cjs +9 -9
  24. package/dist/atoms/chat/index.d.cts +26 -26
  25. package/dist/atoms/chat/index.d.ts +27 -27
  26. package/dist/atoms/chat/index.js +9 -9
  27. package/dist/atoms/globalSearch/index.d.cts +5 -5
  28. package/dist/atoms/globalSearch/index.d.ts +6 -6
  29. package/dist/atoms/org/index.cjs +1 -1
  30. package/dist/atoms/org/index.d.cts +16 -16
  31. package/dist/atoms/org/index.d.ts +16 -16
  32. package/dist/atoms/org/index.js +1 -1
  33. package/dist/atoms/search/index.cjs +11 -11
  34. package/dist/atoms/search/index.d.cts +1 -1
  35. package/dist/atoms/search/index.d.ts +1 -1
  36. package/dist/atoms/search/index.js +11 -11
  37. package/dist/atoms/search/utils.d.ts +1 -1
  38. package/dist/{cdnContext-CaDyQ_5p.cjs → cdnContext-Bzqk0s2M.cjs} +2 -2
  39. package/dist/{cdnContext-CtrIlAqX.js → cdnContext-CTC-zBtx.js} +2 -2
  40. package/dist/{chat-BjhQCyW_.js → chat-Bzay7QnI.js} +6 -6
  41. package/dist/{chat-BkPax29G.cjs → chat-Ckd1b_z_.cjs} +6 -6
  42. package/dist/{chatSearch-C3N3iIxu.cjs → chatSearch-Bev4ZI8Z.cjs} +3 -3
  43. package/dist/{chatSearch-BsYlFvpv.js → chatSearch-DNaGtQyx.js} +3 -3
  44. package/dist/{chatState-CXA1vF16.js → chatState-CcCvgmSM.js} +2 -2
  45. package/dist/{chatState-CJ52Ag_7.cjs → chatState-OkYPVghN.cjs} +2 -2
  46. package/dist/{commerce-api-rgj30eEp.js → commerce-api-ml5fkEuk.js} +6 -6
  47. package/dist/{commerce-api-DA1QGGMK.cjs → commerce-api-sQtLuwTh.cjs} +6 -6
  48. package/dist/contexts/amplitudeContext/index.cjs +7 -7
  49. package/dist/contexts/amplitudeContext/index.js +7 -7
  50. package/dist/contexts/cdnContext/index.cjs +3 -3
  51. package/dist/contexts/cdnContext/index.js +3 -3
  52. package/dist/contexts/chatContext/index.cjs +16 -16
  53. package/dist/contexts/chatContext/index.d.cts +2 -2
  54. package/dist/contexts/chatContext/index.d.ts +4 -4
  55. package/dist/contexts/chatContext/index.js +16 -16
  56. package/dist/contexts/enviveConfigContext/index.cjs +3 -3
  57. package/dist/contexts/enviveConfigContext/index.js +3 -3
  58. package/dist/contexts/enviveCssContext/index.cjs +6 -6
  59. package/dist/contexts/enviveCssContext/index.js +6 -6
  60. package/dist/contexts/featureFlagContext/index.cjs +4 -4
  61. package/dist/contexts/featureFlagContext/index.js +4 -4
  62. package/dist/contexts/graphqlContext/index.cjs +3 -3
  63. package/dist/contexts/graphqlContext/index.d.ts +1 -1
  64. package/dist/contexts/graphqlContext/index.js +3 -3
  65. package/dist/contexts/localStorageContext/index.cjs +1 -1
  66. package/dist/contexts/localStorageContext/index.js +1 -1
  67. package/dist/contexts/newOrgConfigContext/index.cjs +5 -5
  68. package/dist/contexts/newOrgConfigContext/index.d.ts +2 -2
  69. package/dist/contexts/newOrgConfigContext/index.js +5 -5
  70. package/dist/contexts/searchContext/index.cjs +10 -10
  71. package/dist/contexts/searchContext/index.js +10 -10
  72. package/dist/contexts/sessionStorageContext/index.cjs +1 -1
  73. package/dist/contexts/sessionStorageContext/index.js +1 -1
  74. package/dist/contexts/shopifyUrlContext/index.cjs +1 -1
  75. package/dist/contexts/shopifyUrlContext/index.js +1 -1
  76. package/dist/contexts/systemSettingsContext/index.cjs +3 -3
  77. package/dist/contexts/systemSettingsContext/index.d.cts +2 -2
  78. package/dist/contexts/systemSettingsContext/index.d.ts +2 -2
  79. package/dist/contexts/systemSettingsContext/index.js +3 -3
  80. package/dist/contexts/userIdentityContext/index.cjs +11 -11
  81. package/dist/contexts/userIdentityContext/index.js +11 -11
  82. package/dist/{enviveConfig-DZBohDpc.js → enviveConfig-DV8F12B9.js} +2 -2
  83. package/dist/{enviveConfig-Dv9-esGV.cjs → enviveConfig-DZHdtLsQ.cjs} +2 -2
  84. package/dist/{enviveConfigContext-DrDjCems.js → enviveConfigContext-BS7aNop5.js} +2 -2
  85. package/dist/{enviveConfigContext-D2OELZDR.cjs → enviveConfigContext-CTcHUIFP.cjs} +2 -2
  86. package/dist/frontendConfig-Cawh5iqv.d.ts +1 -1
  87. package/dist/frontendConfig-iZipB5FG.d.cts +1 -1
  88. package/dist/{graphqlContext-DP8T3-Kd.cjs → graphqlContext-CVbYIftg.cjs} +2 -2
  89. package/dist/{graphqlContext-CXQl0hq2.d.ts → graphqlContext-DgkS-UX1.d.ts} +3 -3
  90. package/dist/{graphqlContext-czH0kIZg.js → graphqlContext-DouNZbYo.js} +2 -2
  91. package/dist/hooks/AmplitudeOperations/index.cjs +9 -9
  92. package/dist/hooks/AmplitudeOperations/index.js +9 -9
  93. package/dist/hooks/AppDetails/index.cjs +7 -7
  94. package/dist/hooks/AppDetails/index.js +7 -7
  95. package/dist/hooks/CdnOperations/index.cjs +3 -3
  96. package/dist/hooks/CdnOperations/index.js +3 -3
  97. package/dist/hooks/ChatToggle/index.cjs +9 -9
  98. package/dist/hooks/ChatToggle/index.js +9 -9
  99. package/dist/hooks/ChatToggleAnalytics/index.cjs +10 -10
  100. package/dist/hooks/ChatToggleAnalytics/index.js +10 -10
  101. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  102. package/dist/hooks/GrabAndScroll/index.d.ts +2 -2
  103. package/dist/hooks/GraphQLConfig/index.cjs +4 -4
  104. package/dist/hooks/GraphQLConfig/index.d.ts +1 -1
  105. package/dist/hooks/GraphQLConfig/index.js +4 -4
  106. package/dist/hooks/IdentifyUser/index.cjs +11 -11
  107. package/dist/hooks/IdentifyUser/index.js +11 -11
  108. package/dist/hooks/ImageResolver/index.cjs +2 -2
  109. package/dist/hooks/ImageResolver/index.js +2 -2
  110. package/dist/hooks/LocalStorageOperations/index.cjs +1 -1
  111. package/dist/hooks/LocalStorageOperations/index.js +1 -1
  112. package/dist/hooks/NewOrgConfig/index.cjs +6 -6
  113. package/dist/hooks/NewOrgConfig/index.d.ts +2 -2
  114. package/dist/hooks/NewOrgConfig/index.js +6 -6
  115. package/dist/hooks/Search/index.cjs +28 -1166
  116. package/dist/hooks/Search/index.d.cts +1 -1
  117. package/dist/hooks/Search/index.d.ts +1 -1
  118. package/dist/hooks/Search/index.js +26 -1165
  119. package/dist/hooks/SearchOperations/index.cjs +10 -10
  120. package/dist/hooks/SearchOperations/index.js +10 -10
  121. package/dist/hooks/SessionStorageOperations/index.cjs +1 -1
  122. package/dist/hooks/SessionStorageOperations/index.js +1 -1
  123. package/dist/hooks/ShopifyUrlOperations/index.cjs +1 -1
  124. package/dist/hooks/ShopifyUrlOperations/index.js +1 -1
  125. package/dist/hooks/SystemSettingsContext/index.cjs +4 -4
  126. package/dist/hooks/SystemSettingsContext/index.d.cts +2 -2
  127. package/dist/hooks/SystemSettingsContext/index.d.ts +2 -2
  128. package/dist/hooks/SystemSettingsContext/index.js +4 -4
  129. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +8 -8
  130. package/dist/hooks/TrackComponentVisibleEvent/index.js +8 -8
  131. package/dist/hooks/UpdateAnalyticsProps/index.cjs +7 -7
  132. package/dist/hooks/UpdateAnalyticsProps/index.js +7 -7
  133. package/dist/{index-CUO68KG3.d.ts → index-CMJM-3zV.d.ts} +30 -30
  134. package/dist/{index-BSd8767K.d.cts → index-DpJzjjpi.d.cts} +30 -30
  135. package/dist/{localStorageContext-BPZ82q-G.js → localStorageContext-CqcSvg2H.js} +1 -1
  136. package/dist/{localStorageContext-NRP-CdmF.cjs → localStorageContext-DiLfSsqL.cjs} +1 -1
  137. package/dist/{newOrgConfigContext-Bet9CgKP.cjs → newOrgConfigContext-BIDz4ZuO.cjs} +3 -3
  138. package/dist/{newOrgConfigContext-I2qceBB4.d.ts → newOrgConfigContext-CKn7B2rj.d.ts} +2 -2
  139. package/dist/{newOrgConfigContext-Bi_dBNe5.js → newOrgConfigContext-u_9UPNcX.js} +3 -3
  140. package/dist/{orgAnalyticsConfig-Bm23fw4s.cjs → orgAnalyticsConfig-CGEQtAFs.cjs} +1 -1
  141. package/dist/{orgAnalyticsConfig-CpBmga08.js → orgAnalyticsConfig-i4jozLBB.js} +1 -1
  142. package/dist/{search-Csh2n66W.cjs → search-CTVX9gC6.cjs} +2 -2
  143. package/dist/{search-DkiqkogN.js → search-NgNrXNS9.js} +2 -2
  144. package/dist/{searchContext-DksJfC1s.cjs → searchContext-CnDXkawZ.cjs} +5 -5
  145. package/dist/{searchContext-BmgoAFMF.js → searchContext-DtRmshTA.js} +5 -5
  146. package/dist/{sessionStorageContext-B6FsNKjj.cjs → sessionStorageContext-1Ks_d4Z0.cjs} +1 -1
  147. package/dist/{sessionStorageContext-CLYCm83p.js → sessionStorageContext-CDcl7NVl.js} +1 -1
  148. package/dist/{shopifyUrlContext-ZOcARiMR.cjs → shopifyUrlContext-CxjV3qvH.cjs} +1 -1
  149. package/dist/{shopifyUrlContext-C-PkSgNC.js → shopifyUrlContext-D2btP_lY.js} +1 -1
  150. package/dist/{systemSettingsContext-dmE1v6w8.cjs → systemSettingsContext-BejoGzzB.cjs} +2 -2
  151. package/dist/{systemSettingsContext-DF0jSq9m.js → systemSettingsContext-C4dtZ0uZ.js} +2 -2
  152. package/dist/types-BegmH0S1.d.ts +1 -1
  153. package/dist/{unsupportedProductExceptions-DGENUnEA.cjs → unsupportedProductExceptions-B0yx2bHK.cjs} +1 -1
  154. package/dist/{unsupportedProductExceptions-uQuuelOs.js → unsupportedProductExceptions-Cs66ngs3.js} +1 -1
  155. package/dist/{useAmplitudeOperations-Bo6YNbTV.cjs → useAmplitudeOperations-BJXD9v2u.cjs} +2 -2
  156. package/dist/{useAmplitudeOperations-zIRSqmMW.js → useAmplitudeOperations-Dym0Ker8.js} +2 -2
  157. package/dist/{useAppDetails-B584gkCs.js → useAppDetails-Dmh16bWE.js} +4 -4
  158. package/dist/{useAppDetails-DczgqeLG.cjs → useAppDetails-DsAZ1xQn.cjs} +4 -4
  159. package/dist/{useGraphQLConfig-D_rF2Sun.cjs → useGraphQLConfig-B3DlwmGg.cjs} +2 -2
  160. package/dist/{useGraphQLConfig-7UxACM4n.js → useGraphQLConfig-DSRaDTdT.js} +2 -2
  161. package/dist/userIdentityContext-DF3atBFE.js +119 -0
  162. package/dist/userIdentityContext-DpQTduhF.cjs +136 -0
  163. package/dist/{utils-C1ErYSoW.js → utils-B7KTAEmV.js} +2 -2
  164. package/dist/utils-CBD4g2Nc.d.cts +1 -1
  165. package/dist/{utils-mqfncrhI.cjs → utils-CcC2jZRi.cjs} +2 -2
  166. package/package.json +3 -2
  167. package/src/atoms/app/index.ts +1 -1
  168. package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +525 -0
  169. package/src/contexts/amplitudeContext/amplitudeContext.tsx +5 -2
  170. package/src/contexts/userIdentityContext/userIdentityContext.tsx +7 -5
  171. package/dist/amplitudeContext-C8tT74Mi.cjs +0 -286
  172. package/dist/amplitudeContext-DCk6Va-j.js +0 -264
  173. package/dist/userIdentityContext-BqbNu7xu.cjs +0 -132
  174. package/dist/userIdentityContext-BxFH9FNQ.js +0 -115
  175. /package/dist/{AmplitudeOperations-ChZWcSsc.js → AmplitudeOperations-C-ieCm9m.js} +0 -0
  176. /package/dist/{AmplitudeOperations-JggIc1zD.cjs → AmplitudeOperations-p7APchq9.cjs} +0 -0
@@ -1,286 +0,0 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_events = require('./events-DYY4l817.cjs');
3
- const require_models = require('./models-DqdLOi2I.cjs');
4
- const require_featureGates = require('./featureGates-qU_ulhpC.cjs');
5
- const require_logger = require('./logger-TBIl4uIH.cjs');
6
- const require_localStorageContext = require('./localStorageContext-NRP-CdmF.cjs');
7
- const require_enviveConfig = require('./enviveConfig-Dv9-esGV.cjs');
8
- const require_orgAnalyticsConfig = require('./orgAnalyticsConfig-Bm23fw4s.cjs');
9
- const require_app = require('./app-BbPSHefQ.cjs');
10
- const require_enviveConfigContext = require('./enviveConfigContext-D2OELZDR.cjs');
11
- const require_featureFlagServiceContext = require('./featureFlagServiceContext-CJyYItqu.cjs');
12
- let react = require("react");
13
- react = require_chunk.__toESM(react);
14
- let jotai = require("jotai");
15
- jotai = require_chunk.__toESM(jotai);
16
- let __amplitude_analytics_browser = require("@amplitude/analytics-browser");
17
- __amplitude_analytics_browser = require_chunk.__toESM(__amplitude_analytics_browser);
18
- let react_jsx_runtime = require("react/jsx-runtime");
19
- react_jsx_runtime = require_chunk.__toESM(react_jsx_runtime);
20
-
21
- //#region src/contexts/amplitudeContext/amplitudeContext.tsx
22
- let SpiffyMetricsEventName = /* @__PURE__ */ function(SpiffyMetricsEventName$1) {
23
- SpiffyMetricsEventName$1["BundleLoaded"] = "Bundle Loaded";
24
- SpiffyMetricsEventName$1["ChatLiveAgentBtnClick"] = "Chat Live Agent Btn Click";
25
- SpiffyMetricsEventName$1["ChatFloatingButtonVisible"] = "Chat Floating Button Visible";
26
- SpiffyMetricsEventName$1["ChatComponentVisible"] = "Chat Component Visible";
27
- SpiffyMetricsEventName$1["ChatComponentExpanded"] = "Chat Component Expanded";
28
- SpiffyMetricsEventName$1["ChatComponentCollapsed"] = "Chat Component Collapsed";
29
- SpiffyMetricsEventName$1["ChatUserMessageInput"] = "Chat User Message Input";
30
- SpiffyMetricsEventName$1["ChatSuggestionClicked"] = "Chat Suggestion Clicked";
31
- SpiffyMetricsEventName$1["ChatAssistantResponse"] = "Chat Assistant Response";
32
- SpiffyMetricsEventName$1["ProductCardClicked"] = "Product Card Clicked";
33
- SpiffyMetricsEventName$1["ProductReviewCardClicked"] = "Product Review Card Clicked";
34
- SpiffyMetricsEventName$1["AddToCartClicked"] = "Add to Cart Clicked";
35
- SpiffyMetricsEventName$1["PromptCardClicked"] = "Prompt Card Clicked";
36
- SpiffyMetricsEventName$1["SupportedEvent"] = "Supported Event";
37
- SpiffyMetricsEventName$1["SearchBackToResponseClicked"] = "Search Back to Response Clicked";
38
- SpiffyMetricsEventName$1["PerformanceMetrics"] = "Performance Metrics";
39
- SpiffyMetricsEventName$1["SearchBarClicked"] = "Search Bar Clicked";
40
- SpiffyMetricsEventName$1["OrderLookupStarted"] = "Order Lookup Started";
41
- SpiffyMetricsEventName$1["OrderLookupFormSubmitted"] = "Order Lookup Form Submitted";
42
- SpiffyMetricsEventName$1["SearchComponentVisible"] = "Search Component Visible";
43
- SpiffyMetricsEventName$1["SearchZeroStateSuggestionClicked"] = "Search Zero State Suggestion Clicked";
44
- SpiffyMetricsEventName$1["SearchInputStarted"] = "Search Input Started";
45
- SpiffyMetricsEventName$1["SearchQuerySubmitted"] = "Search Query Submitted";
46
- SpiffyMetricsEventName$1["SearchResultsViewed"] = "Search Results Viewed";
47
- SpiffyMetricsEventName$1["SearchTimeToFirstClick"] = "Search Time to First Click";
48
- SpiffyMetricsEventName$1["SearchZeroResultsRate"] = "Search Zero Results Rate";
49
- SpiffyMetricsEventName$1["SearchFilterClicked"] = "Search Filter Clicked";
50
- SpiffyMetricsEventName$1["SearchSortClicked"] = "Search Sort Clicked";
51
- return SpiffyMetricsEventName$1;
52
- }({});
53
- const AmplitudeContext = (0, react.createContext)(null);
54
- const AmplitudeProvider = ({ children }) => {
55
- const userId = (0, jotai.useAtomValue)(require_app.userIdAtom);
56
- const amplitudeApiKey = (0, jotai.useAtomValue)(require_enviveConfig.amplitudeApiKeyAtom);
57
- const dataResidency = (0, jotai.useAtomValue)(require_enviveConfig.dataResidencyAtom);
58
- const orgGaConfig = (0, jotai.useAtomValue)(require_orgAnalyticsConfig.orgAnalyticsGoogleAnalyticsConfigAtom);
59
- const env = (0, jotai.useAtomValue)(require_enviveConfig.envAtom);
60
- const contextSource = (0, jotai.useAtomValue)(require_enviveConfig.contextSourceAtom);
61
- (0, jotai.useAtomValue)(require_enviveConfig.identifyingPrefixAtom);
62
- const { getItem } = require_localStorageContext.useLocalStorage();
63
- const { publicKey, featureOverrides, variantUrlOverride, variantInfoOverride, show, orgShortName, featureGates } = require_enviveConfigContext.useEnviveConfig();
64
- const { featureFlagService } = require_featureFlagServiceContext.useFeatureFlagService();
65
- const [amplitudeClient, setAmplitudeClient] = react.default.useState(void 0);
66
- const [internalEventTrackingEnrichment, setInternalEventTrackingEnrichment] = react.default.useState(void 0);
67
- const [supplementalDefaultProps, setSupplementalDefaultProps] = react.default.useState({});
68
- const isReady = Boolean(userId && featureFlagService && amplitudeApiKey && userId);
69
- const getDefaultTrackingProps = (0, react.useCallback)(() => {
70
- const gatesProps = featureGates ? featureGates.reduce((acc, curr) => {
71
- if (curr.name && curr.value != null) return {
72
- ...acc,
73
- [`feature_gate.${curr.name}`]: curr.value
74
- };
75
- return acc;
76
- }, {}) : {};
77
- const experimentProps = {};
78
- return {
79
- ...gatesProps,
80
- ...experimentProps,
81
- ...supplementalDefaultProps,
82
- app_id: "commerce-chat-react-component",
83
- chat_id: getItem(require_localStorageContext.LocalStorageKeys.ChatId),
84
- env: env || "unknown",
85
- app_source: contextSource,
86
- "org.short_name": orgShortName,
87
- "user.id": userId,
88
- "cdp.user_id": null,
89
- "cdp.provider": null,
90
- "event.source": "web-browser",
91
- "event.type": "user-activity",
92
- "event.id": null,
93
- "event.channel": "web",
94
- "event.timestamp": null
95
- };
96
- }, [
97
- featureGates,
98
- supplementalDefaultProps,
99
- env,
100
- contextSource,
101
- orgShortName,
102
- userId
103
- ]);
104
- const eventPropsToPrefixedEventProps = (0, react.useCallback)((eventName, eventProps) => {
105
- const prefix = eventName.toLowerCase().replace(/\s+/g, "_");
106
- return Object.entries(eventProps).reduce((acc, [key, value$1]) => {
107
- acc[`${prefix}.${key}`] = value$1;
108
- return acc;
109
- }, {});
110
- }, []);
111
- const amplitudeSessionReplayInit = (0, react.useCallback)(() => {
112
- const isEnabled = Boolean(orgShortName === require_models.OrgShortName.UniqueVintage && featureFlagService?.isClientSessionEnabled() && featureFlagService?.isFeatureGateEnabled(require_featureGates.FeatureGates.IsNewFeatureEnabled));
113
- const sampleRate = 1;
114
- try {
115
- require_logger.logger_default.logDebug(`[spiffy-ai] amplitude session-replay initializing isEnabled=${isEnabled} sampleRate=${sampleRate}`);
116
- if (!isEnabled) return isEnabled;
117
- return isEnabled;
118
- } catch (e) {
119
- require_logger.logger_default.logError("[spiffy-ai] Error initializing amplitude session-replay", e);
120
- return false;
121
- }
122
- }, [orgShortName, featureFlagService]);
123
- const getEventTrackingEnrichment = (0, react.useCallback)(() => {
124
- if (internalEventTrackingEnrichment !== void 0) return internalEventTrackingEnrichment;
125
- const enrichment = {
126
- name: "page-view-tracking-enrichment",
127
- type: "enrichment",
128
- setup: async () => void 0,
129
- execute: async (event) => {
130
- let enrichedEvent;
131
- if (["[Amplitude] Page Viewed", `[Spiffy] ${SpiffyMetricsEventName.BundleLoaded}`].includes(event.event_type)) {
132
- const globalProperties = {};
133
- if (publicKey) globalProperties["globalProperties.publicKey"] = publicKey;
134
- if (featureOverrides) Object.entries(featureOverrides).forEach(([key, value$1]) => {
135
- globalProperties[`globalProperties.featureOverrides.${key}`] = String(value$1);
136
- });
137
- if (variantUrlOverride) globalProperties["globalProperties.variantUrlOverride"] = variantUrlOverride;
138
- if (variantInfoOverride) globalProperties["globalProperties.variantInfoOverride"] = JSON.stringify(variantInfoOverride);
139
- if (show != null) globalProperties["globalProperties.show"] = String(show);
140
- const enabledFeatures = featureFlagService.getFeatureFlags();
141
- const enabledFeaturesProperties = Object.entries(enabledFeatures).reduce((acc, [key, value$1]) => ({
142
- ...acc,
143
- [`enabledFeatures.${key}`]: `${value$1}`
144
- }), {});
145
- const timingProperties = { "timing.enriched_at_ms": window.performance?.now() };
146
- enrichedEvent = {
147
- ...event,
148
- event_properties: {
149
- ...event.event_properties,
150
- ...getDefaultTrackingProps(),
151
- ...globalProperties,
152
- ...enabledFeaturesProperties,
153
- ...timingProperties
154
- }
155
- };
156
- } else enrichedEvent = event;
157
- require_events.EventsDispatcher.dispatch(require_events.SpiffyEvent.AMPLITUDE_EVENT, enrichedEvent);
158
- return enrichedEvent;
159
- }
160
- };
161
- setInternalEventTrackingEnrichment(enrichment);
162
- return enrichment;
163
- }, [
164
- internalEventTrackingEnrichment,
165
- getDefaultTrackingProps,
166
- featureFlagService,
167
- publicKey,
168
- featureOverrides,
169
- variantUrlOverride,
170
- variantInfoOverride,
171
- show
172
- ]);
173
- (0, react.useEffect)(() => {
174
- if (isReady && !amplitudeClient) {
175
- const currentAmplitudeInstance = (0, __amplitude_analytics_browser.createInstance)();
176
- const isSessionsEnabled = amplitudeSessionReplayInit();
177
- currentAmplitudeInstance.add(getEventTrackingEnrichment());
178
- currentAmplitudeInstance.init(amplitudeApiKey, userId, {
179
- serverZone: dataResidency,
180
- trackingOptions: { ipAddress: true },
181
- autocapture: {
182
- attribution: true,
183
- pageViews: { trackHistoryChanges: "pathOnly" },
184
- sessions: isSessionsEnabled,
185
- formInteractions: false,
186
- fileDownloads: false
187
- }
188
- });
189
- setAmplitudeClient(currentAmplitudeInstance);
190
- }
191
- }, [
192
- isReady,
193
- amplitudeClient,
194
- amplitudeApiKey,
195
- userId,
196
- dataResidency,
197
- amplitudeSessionReplayInit,
198
- getEventTrackingEnrichment
199
- ]);
200
- const trackEvent = (0, react.useCallback)(async ({ eventName, eventProps, eventGroups, alsoSendToGoogleAnalytics = false }) => {
201
- require_logger.logger_default.logDebug("Submitting event", eventName);
202
- try {
203
- const decoratedEventName = `[Spiffy] ${eventName}`;
204
- if (!amplitudeClient) {
205
- require_logger.logger_default.logWarn("amplitude client undefined", void 0, { event_name: decoratedEventName });
206
- return;
207
- }
208
- const eventData = JSON.stringify({
209
- eventName,
210
- eventProps,
211
- created_at: (/* @__PURE__ */ new Date()).toISOString()
212
- });
213
- const data = new TextEncoder().encode(eventData);
214
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
215
- const currentInsertId = Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
216
- require_logger.logger_default.logDebug(`amplitude tracking ${decoratedEventName}`, null, {
217
- event_name: decoratedEventName,
218
- props: eventProps
219
- });
220
- amplitudeClient.track(decoratedEventName, {
221
- ...getDefaultTrackingProps(),
222
- ...eventProps,
223
- ...eventProps ? eventPropsToPrefixedEventProps(eventName, eventProps) : {}
224
- }, {
225
- ...eventGroups,
226
- insert_id: currentInsertId
227
- });
228
- if (alsoSendToGoogleAnalytics && orgGaConfig) {
229
- require_logger.logger_default.logDebug("[spiffy-ai] GA tracking", decoratedEventName);
230
- if (window.dataLayer) window.dataLayer.push({
231
- event: decoratedEventName,
232
- eventProps
233
- });
234
- }
235
- } catch (err) {
236
- require_logger.logger_default.logError("[spiffy-ai] Error tracking event", err, {
237
- eventName,
238
- eventProps
239
- });
240
- }
241
- }, [
242
- amplitudeClient,
243
- getDefaultTrackingProps,
244
- eventPropsToPrefixedEventProps,
245
- orgGaConfig
246
- ]);
247
- const value = (0, react.useMemo)(() => ({
248
- trackEvent,
249
- isReady,
250
- setSupplementalDefaultProps: (props) => setSupplementalDefaultProps(props)
251
- }), [
252
- trackEvent,
253
- isReady,
254
- setSupplementalDefaultProps
255
- ]);
256
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AmplitudeContext.Provider, {
257
- value,
258
- children
259
- });
260
- };
261
- const useAmplitude = () => {
262
- const context = (0, react.useContext)(AmplitudeContext);
263
- if (!context) throw new Error("useAmplitude must be used within AmplitudeProvider");
264
- return context;
265
- };
266
-
267
- //#endregion
268
- Object.defineProperty(exports, 'AmplitudeProvider', {
269
- enumerable: true,
270
- get: function () {
271
- return AmplitudeProvider;
272
- }
273
- });
274
- Object.defineProperty(exports, 'SpiffyMetricsEventName', {
275
- enumerable: true,
276
- get: function () {
277
- return SpiffyMetricsEventName;
278
- }
279
- });
280
- Object.defineProperty(exports, 'useAmplitude', {
281
- enumerable: true,
282
- get: function () {
283
- return useAmplitude;
284
- }
285
- });
286
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGl0dWRlQ29udGV4dC1DOHRUNzRNaS5janMiLCJuYW1lcyI6WyJBbXBsaXR1ZGVQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+IiwidXNlcklkQXRvbSIsImFtcGxpdHVkZUFwaUtleUF0b20iLCJkYXRhUmVzaWRlbmN5QXRvbSIsIm9yZ0FuYWx5dGljc0dvb2dsZUFuYWx5dGljc0NvbmZpZ0F0b20iLCJlbnZBdG9tIiwiY29udGV4dFNvdXJjZUF0b20iLCJpZGVudGlmeWluZ1ByZWZpeEF0b20iLCJ1c2VMb2NhbFN0b3JhZ2UiLCJ1c2VFbnZpdmVDb25maWciLCJ1c2VGZWF0dXJlRmxhZ1NlcnZpY2UiLCJSZWFjdCIsIkxvY2FsU3RvcmFnZUtleXMiLCJ2YWx1ZSIsIk9yZ1Nob3J0TmFtZSIsIkZlYXR1cmVHYXRlcyIsImVucmljaG1lbnQ6IEVucmljaG1lbnRQbHVnaW4iLCJlbnJpY2hlZEV2ZW50OiBFdmVudCIsImdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJTcGlmZnlFdmVudCIsImN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0L2FtcGxpdHVkZUNvbnRleHQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge1xuICBjcmVhdGVDb250ZXh0LFxuICB1c2VDb250ZXh0LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlTWVtbyxcbiAgdXNlRWZmZWN0LFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUF0b21WYWx1ZSB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHsgY3JlYXRlSW5zdGFuY2UgfSBmcm9tIFwiQGFtcGxpdHVkZS9hbmFseXRpY3MtYnJvd3NlclwiO1xuaW1wb3J0IHsgRmVhdHVyZUdhdGVzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZmVhdHVyZUdhdGVzXCI7XG5pbXBvcnQgeyBPcmdTaG9ydE5hbWUgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgRXZlbnRzRGlzcGF0Y2hlciwgU3BpZmZ5RXZlbnQgfSBmcm9tIFwic3JjL2V2ZW50c1wiO1xuaW1wb3J0IHtcbiAgYW1wbGl0dWRlQXBpS2V5QXRvbSxcbiAgY29udGV4dFNvdXJjZUF0b20sXG4gIGRhdGFSZXNpZGVuY3lBdG9tLFxuICBpZGVudGlmeWluZ1ByZWZpeEF0b20sXG59IGZyb20gXCJzcmMvYXRvbXMvZW52aXZlL2Vudml2ZUNvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgTG9jYWxTdG9yYWdlS2V5cyxcbiAgdXNlTG9jYWxTdG9yYWdlLFxufSBmcm9tIFwic3JjL2NvbnRleHRzL2xvY2FsU3RvcmFnZUNvbnRleHRcIjtcbmltcG9ydCB7IG9yZ0FuYWx5dGljc0dvb2dsZUFuYWx5dGljc0NvbmZpZ0F0b20gfSBmcm9tIFwic3JjL2F0b21zL29yZy9vcmdBbmFseXRpY3NDb25maWdcIjtcbmltcG9ydCB7IHVzZXJJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiO1xuaW1wb3J0IHsgZW52QXRvbSB9IGZyb20gXCJzcmMvYXRvbXMvZW52aXZlL2Vudml2ZUNvbmZpZ1wiO1xuaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJyb3dzZXJDbGllbnQsXG4gIEVucmljaG1lbnRQbHVnaW4sXG4gIEV2ZW50LFxuICBTZXJ2ZXJab25lVHlwZSxcbn0gZnJvbSBcIkBhbXBsaXR1ZGUvYW5hbHl0aWNzLXR5cGVzXCI7XG5pbXBvcnQgeyB1c2VFbnZpdmVDb25maWcgfSBmcm9tIFwic3JjL2NvbnRleHRzL2Vudml2ZUNvbmZpZ0NvbnRleHQvZW52aXZlQ29uZmlnQ29udGV4dFwiO1xuaW1wb3J0IHtcbiAgdXNlRmVhdHVyZUZsYWdTZXJ2aWNlLFxufSBmcm9tIFwic3JjL2NvbnRleHRzL2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHQvZmVhdHVyZUZsYWdTZXJ2aWNlQ29udGV4dFwiO1xuaW1wb3J0IHsgdXNlVXNlcklkZW50aXR5IH0gZnJvbSBcInNyYy9jb250ZXh0cy91c2VySWRlbnRpdHlDb250ZXh0L3VzZXJJZGVudGl0eUNvbnRleHRcIjtcblxuZXhwb3J0IGVudW0gU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSB7XG4gIEJ1bmRsZUxvYWRlZCA9IFwiQnVuZGxlIExvYWRlZFwiLFxuICBDaGF0TGl2ZUFnZW50QnRuQ2xpY2sgPSBcIkNoYXQgTGl2ZSBBZ2VudCBCdG4gQ2xpY2tcIixcbiAgQ2hhdEZsb2F0aW5nQnV0dG9uVmlzaWJsZSA9IFwiQ2hhdCBGbG9hdGluZyBCdXR0b24gVmlzaWJsZVwiLFxuICBDaGF0Q29tcG9uZW50VmlzaWJsZSA9IFwiQ2hhdCBDb21wb25lbnQgVmlzaWJsZVwiLFxuICBDaGF0Q29tcG9uZW50RXhwYW5kZWQgPSBcIkNoYXQgQ29tcG9uZW50IEV4cGFuZGVkXCIsXG4gIENoYXRDb21wb25lbnRDb2xsYXBzZWQgPSBcIkNoYXQgQ29tcG9uZW50IENvbGxhcHNlZFwiLFxuICBDaGF0VXNlck1lc3NhZ2VJbnB1dCA9IFwiQ2hhdCBVc2VyIE1lc3NhZ2UgSW5wdXRcIixcbiAgQ2hhdFN1Z2dlc3Rpb25DbGlja2VkID0gXCJDaGF0IFN1Z2dlc3Rpb24gQ2xpY2tlZFwiLFxuICBDaGF0QXNzaXN0YW50UmVzcG9uc2UgPSBcIkNoYXQgQXNzaXN0YW50IFJlc3BvbnNlXCIsXG4gIFByb2R1Y3RDYXJkQ2xpY2tlZCA9IFwiUHJvZHVjdCBDYXJkIENsaWNrZWRcIixcbiAgUHJvZHVjdFJldmlld0NhcmRDbGlja2VkID0gXCJQcm9kdWN0IFJldmlldyBDYXJkIENsaWNrZWRcIixcbiAgQWRkVG9DYXJ0Q2xpY2tlZCA9IFwiQWRkIHRvIENhcnQgQ2xpY2tlZFwiLFxuICBQcm9tcHRDYXJkQ2xpY2tlZCA9IFwiUHJvbXB0IENhcmQgQ2xpY2tlZFwiLFxuICBTdXBwb3J0ZWRFdmVudCA9IFwiU3VwcG9ydGVkIEV2ZW50XCIsXG4gIFNlYXJjaEJhY2tUb1Jlc3BvbnNlQ2xpY2tlZCA9IFwiU2VhcmNoIEJhY2sgdG8gUmVzcG9uc2UgQ2xpY2tlZFwiLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MgPSBcIlBlcmZvcm1hbmNlIE1ldHJpY3NcIixcbiAgU2VhcmNoQmFyQ2xpY2tlZCA9IFwiU2VhcmNoIEJhciBDbGlja2VkXCIsXG4gIE9yZGVyTG9va3VwU3RhcnRlZCA9IFwiT3JkZXIgTG9va3VwIFN0YXJ0ZWRcIixcbiAgT3JkZXJMb29rdXBGb3JtU3VibWl0dGVkID0gXCJPcmRlciBMb29rdXAgRm9ybSBTdWJtaXR0ZWRcIixcbiAgU2VhcmNoQ29tcG9uZW50VmlzaWJsZSA9IFwiU2VhcmNoIENvbXBvbmVudCBWaXNpYmxlXCIsXG4gIFNlYXJjaFplcm9TdGF0ZVN1Z2dlc3Rpb25DbGlja2VkID0gXCJTZWFyY2ggWmVybyBTdGF0ZSBTdWdnZXN0aW9uIENsaWNrZWRcIiwgLy8gVGhpcyBpcyB0aGUgc2Nyb2xsaW5nIGxpc3Qgb2Ygc3VnZ2VzdGlvbiBidXR0b25zIGluIGdsb2JhbCBzZWFyY2hcbiAgU2VhcmNoSW5wdXRTdGFydGVkID0gXCJTZWFyY2ggSW5wdXQgU3RhcnRlZFwiLFxuICBTZWFyY2hRdWVyeVN1Ym1pdHRlZCA9IFwiU2VhcmNoIFF1ZXJ5IFN1Ym1pdHRlZFwiLFxuICAvLyBTZWFyY2hBdXRvY29tcGxldGVWaWV3ZWQgPSAnU2VhcmNoIEF1dG9jb21wbGV0ZSBWaWV3ZWQnLCAvLyBUT0RPOiBhZGQgdGhpcyB3aGVuIGF1dG9jb21wbGV0ZSBpcyBhZGRlZFxuICAvLyBTZWFyY2hBdXRvY29tcGxldGVDbGlja2VkID0gJ1NlYXJjaCBBdXRvY29tcGxldGUgQ2xpY2tlZCcsIC8vIFRPRE86IGFkZCB0aGlzIHdoZW4gYXV0b2NvbXBsZXRlIGlzIGFkZGVkXG4gIFNlYXJjaFJlc3VsdHNWaWV3ZWQgPSBcIlNlYXJjaCBSZXN1bHRzIFZpZXdlZFwiLFxuICBTZWFyY2hUaW1lVG9GaXJzdENsaWNrID0gXCJTZWFyY2ggVGltZSB0byBGaXJzdCBDbGlja1wiLFxuICBTZWFyY2haZXJvUmVzdWx0c1JhdGUgPSBcIlNlYXJjaCBaZXJvIFJlc3VsdHMgUmF0ZVwiLFxuICBTZWFyY2hGaWx0ZXJDbGlja2VkID0gXCJTZWFyY2ggRmlsdGVyIENsaWNrZWRcIixcbiAgU2VhcmNoU29ydENsaWNrZWQgPSBcIlNlYXJjaCBTb3J0IENsaWNrZWRcIixcbn1cblxuaW50ZXJmYWNlIFRyYWNrRXZlbnRQYXJhbXMge1xuICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWU7XG4gIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXZlbnRHcm91cHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgYWxzb1NlbmRUb0dvb2dsZUFuYWx5dGljcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBbXBsaXR1ZGVDb250ZXh0VHlwZSB7XG4gIHRyYWNrRXZlbnQ6IChwYXJhbXM6IFRyYWNrRXZlbnRQYXJhbXMpID0+IFByb21pc2U8dm9pZD47XG4gIGlzUmVhZHk6IGJvb2xlYW47XG4gIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wczogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbn1cblxuY29uc3QgQW1wbGl0dWRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8QW1wbGl0dWRlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IEFtcGxpdHVkZVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4gPSAoe1xuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgdXNlcklkID0gdXNlQXRvbVZhbHVlKHVzZXJJZEF0b20pO1xuICBjb25zdCBhbXBsaXR1ZGVBcGlLZXkgPSB1c2VBdG9tVmFsdWUoYW1wbGl0dWRlQXBpS2V5QXRvbSk7XG4gIGNvbnN0IGRhdGFSZXNpZGVuY3kgPSB1c2VBdG9tVmFsdWUoZGF0YVJlc2lkZW5jeUF0b20pO1xuICBjb25zdCBvcmdHYUNvbmZpZyA9IHVzZUF0b21WYWx1ZShvcmdBbmFseXRpY3NHb29nbGVBbmFseXRpY3NDb25maWdBdG9tKTtcbiAgY29uc3QgZW52ID0gdXNlQXRvbVZhbHVlKGVudkF0b20pO1xuICBjb25zdCBjb250ZXh0U291cmNlID0gdXNlQXRvbVZhbHVlKGNvbnRleHRTb3VyY2VBdG9tKTtcbiAgY29uc3QgaWRlbnRpZnlpbmdQcmVmaXggPSB1c2VBdG9tVmFsdWUoaWRlbnRpZnlpbmdQcmVmaXhBdG9tKTtcbiAgY29uc3QgeyBnZXRJdGVtIH0gPSB1c2VMb2NhbFN0b3JhZ2UoKTtcbiAgY29uc3Qge1xuICAgIHB1YmxpY0tleSxcbiAgICBmZWF0dXJlT3ZlcnJpZGVzLFxuICAgIHZhcmlhbnRVcmxPdmVycmlkZSxcbiAgICB2YXJpYW50SW5mb092ZXJyaWRlLFxuICAgIHNob3csXG4gICAgb3JnU2hvcnROYW1lLFxuICAgIGZlYXR1cmVHYXRlcyxcbiAgfSA9IHVzZUVudml2ZUNvbmZpZygpO1xuXG4gIGNvbnN0IHsgZmVhdHVyZUZsYWdTZXJ2aWNlIH0gPSB1c2VGZWF0dXJlRmxhZ1NlcnZpY2UoKTtcblxuICBjb25zdCBbYW1wbGl0dWRlQ2xpZW50LCBzZXRBbXBsaXR1ZGVDbGllbnRdID0gUmVhY3QudXNlU3RhdGU8XG4gICAgQnJvd3NlckNsaWVudCB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFtpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50LCBzZXRJbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50XSA9XG4gICAgUmVhY3QudXNlU3RhdGU8RW5yaWNobWVudFBsdWdpbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY29uc3QgW3N1cHBsZW1lbnRhbERlZmF1bHRQcm9wcywgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzXSA9XG4gICAgUmVhY3QudXNlU3RhdGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHt9KTtcblxuICBjb25zdCBpc1JlYWR5ID0gQm9vbGVhbihcbiAgICB1c2VySWQgJiYgZmVhdHVyZUZsYWdTZXJ2aWNlICYmIGFtcGxpdHVkZUFwaUtleSAmJiB1c2VySWRcbiAgKTtcblxuICBjb25zdCBnZXREZWZhdWx0VHJhY2tpbmdQcm9wcyA9IHVzZUNhbGxiYWNrKCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgZ2F0ZXNQcm9wcyA9IGZlYXR1cmVHYXRlc1xuICAgICAgPyBmZWF0dXJlR2F0ZXMucmVkdWNlPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PigoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnIubmFtZSAmJiBjdXJyLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgW2BmZWF0dXJlX2dhdGUuJHtjdXJyLm5hbWV9YF06IGN1cnIudmFsdWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pXG4gICAgICA6IHt9O1xuICAgIGNvbnN0IGV4cGVyaW1lbnRQcm9wcyA9IHt9OyAvLyBObyBkaXJlY3QgZXF1aXZhbGVudCBmb3IgZXhwZXJpbWVudHMgaW4gRW52aXZlQ29uZmlnIHlldFxuXG4gICAgY29uc3Qgb3JnTGV2ZWxBbXBsaXR1ZGVUcmFja2luZ1Byb3BzID0ge1xuICAgICAgLi4uZ2F0ZXNQcm9wcyxcbiAgICAgIC4uLmV4cGVyaW1lbnRQcm9wcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9yZ0xldmVsQW1wbGl0dWRlVHJhY2tpbmdQcm9wcyxcbiAgICAgIC4uLnN1cHBsZW1lbnRhbERlZmF1bHRQcm9wcyxcbiAgICAgIC8vIFRPRE86IG9yZ19pZCBpcyBub3QgZGlyZWN0bHkgYXZhaWxhYmxlIGluIEVudml2ZUNvbmZpZy4gTmVlZCB0byBmaW5kIGEgbmV3IHNvdXJjZSBvciBkZXJpdmUgaXQuXG4gICAgICAvLyBvcmdfaWQ6IG9yZ0NvbmZpZz8ub3JnPy5vcmc/LmlkLFxuICAgICAgYXBwX2lkOiBcImNvbW1lcmNlLWNoYXQtcmVhY3QtY29tcG9uZW50XCIsXG4gICAgICBjaGF0X2lkOiBnZXRJdGVtKExvY2FsU3RvcmFnZUtleXMuQ2hhdElkKSxcbiAgICAgIGVudjogZW52IHx8IFwidW5rbm93blwiLFxuICAgICAgYXBwX3NvdXJjZTogY29udGV4dFNvdXJjZSxcbiAgICAgIFwib3JnLnNob3J0X25hbWVcIjogb3JnU2hvcnROYW1lLFxuICAgICAgXCJ1c2VyLmlkXCI6IHVzZXJJZCxcbiAgICAgIFwiY2RwLnVzZXJfaWRcIjogbnVsbCxcbiAgICAgIFwiY2RwLnByb3ZpZGVyXCI6IG51bGwsXG4gICAgICBcImV2ZW50LnNvdXJjZVwiOiBcIndlYi1icm93c2VyXCIsXG4gICAgICBcImV2ZW50LnR5cGVcIjogXCJ1c2VyLWFjdGl2aXR5XCIsXG4gICAgICBcImV2ZW50LmlkXCI6IG51bGwsXG4gICAgICBcImV2ZW50LmNoYW5uZWxcIjogXCJ3ZWJcIixcbiAgICAgIFwiZXZlbnQudGltZXN0YW1wXCI6IG51bGwsXG4gICAgfTtcbiAgfSwgW1xuICAgIGZlYXR1cmVHYXRlcyxcbiAgICBzdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsXG4gICAgZW52LFxuICAgIGNvbnRleHRTb3VyY2UsXG4gICAgb3JnU2hvcnROYW1lLFxuICAgIHVzZXJJZCxcbiAgXSk7XG5cbiAgY29uc3QgZXZlbnRQcm9wc1RvUHJlZml4ZWRFdmVudFByb3BzID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgICAgZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCBwcmVmaXggPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csIFwiX1wiKTtcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhldmVudFByb3BzKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGFjY1tgJHtwcmVmaXh9LiR7a2V5fWBdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGFtcGxpdHVkZVNlc3Npb25SZXBsYXlJbml0ID0gdXNlQ2FsbGJhY2soKCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGlzRW5hYmxlZCA9IEJvb2xlYW4oXG4gICAgICBvcmdTaG9ydE5hbWUgPT09IE9yZ1Nob3J0TmFtZS5VbmlxdWVWaW50YWdlICYmXG4gICAgICAgIGZlYXR1cmVGbGFnU2VydmljZT8uaXNDbGllbnRTZXNzaW9uRW5hYmxlZCgpICYmXG4gICAgICAgIGZlYXR1cmVGbGFnU2VydmljZT8uaXNGZWF0dXJlR2F0ZUVuYWJsZWQoXG4gICAgICAgICAgRmVhdHVyZUdhdGVzLklzTmV3RmVhdHVyZUVuYWJsZWRcbiAgICAgICAgKVxuICAgICk7XG4gICAgY29uc3Qgc2FtcGxlUmF0ZSA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgW3NwaWZmeS1haV0gYW1wbGl0dWRlIHNlc3Npb24tcmVwbGF5IGluaXRpYWxpemluZyBpc0VuYWJsZWQ9JHtpc0VuYWJsZWR9IHNhbXBsZVJhdGU9JHtzYW1wbGVSYXRlfWBcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBpc0VuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGFtcGxpdHVkZUluc3RhbmNlLmFkZChzZXNzaW9uUmVwbGF5UGx1Z2luKHsgc2FtcGxlUmF0ZSB9KSk7XG5cbiAgICAgIHJldHVybiBpc0VuYWJsZWQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgICBcIltzcGlmZnktYWldIEVycm9yIGluaXRpYWxpemluZyBhbXBsaXR1ZGUgc2Vzc2lvbi1yZXBsYXlcIixcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIFtvcmdTaG9ydE5hbWUsIGZlYXR1cmVGbGFnU2VydmljZV0pO1xuXG4gIGNvbnN0IGdldEV2ZW50VHJhY2tpbmdFbnJpY2htZW50ID0gdXNlQ2FsbGJhY2soKCk6IEVucmljaG1lbnRQbHVnaW4gPT4ge1xuICAgIGlmIChpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGVucmljaG1lbnQ6IEVucmljaG1lbnRQbHVnaW4gPSB7XG4gICAgICBuYW1lOiBcInBhZ2Utdmlldy10cmFja2luZy1lbnJpY2htZW50XCIsXG4gICAgICB0eXBlOiBcImVucmljaG1lbnRcIixcbiAgICAgIHNldHVwOiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgICBleGVjdXRlOiBhc3luYyAoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxFdmVudD4gPT4ge1xuICAgICAgICBsZXQgZW5yaWNoZWRFdmVudDogRXZlbnQ7XG5cbiAgICAgICAgY29uc3QgZXZlbnRzVG9FbnJpY2ggPSBbXG4gICAgICAgICAgXCJbQW1wbGl0dWRlXSBQYWdlIFZpZXdlZFwiLFxuICAgICAgICAgIGBbU3BpZmZ5XSAke1NwaWZmeU1ldHJpY3NFdmVudE5hbWUuQnVuZGxlTG9hZGVkfWAsXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGV2ZW50c1RvRW5yaWNoLmluY2x1ZGVzKGV2ZW50LmV2ZW50X3R5cGUpKSB7XG4gICAgICAgICAgY29uc3QgZ2xvYmFsUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgaWYgKHB1YmxpY0tleSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMucHVibGljS2V5XCJdID0gcHVibGljS2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmVhdHVyZU92ZXJyaWRlcykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmVhdHVyZU92ZXJyaWRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXNbYGdsb2JhbFByb3BlcnRpZXMuZmVhdHVyZU92ZXJyaWRlcy4ke2tleX1gXSA9XG4gICAgICAgICAgICAgICAgU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFudFVybE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW1wiZ2xvYmFsUHJvcGVydGllcy52YXJpYW50VXJsT3ZlcnJpZGVcIl0gPVxuICAgICAgICAgICAgICB2YXJpYW50VXJsT3ZlcnJpZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YXJpYW50SW5mb092ZXJyaWRlKSB7XG4gICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW1wiZ2xvYmFsUHJvcGVydGllcy52YXJpYW50SW5mb092ZXJyaWRlXCJdID1cbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodmFyaWFudEluZm9PdmVycmlkZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXNbXCJnbG9iYWxQcm9wZXJ0aWVzLnNob3dcIl0gPSBTdHJpbmcoc2hvdyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzID0gZmVhdHVyZUZsYWdTZXJ2aWNlIS5nZXRGZWF0dXJlRmxhZ3MoKTtcbiAgICAgICAgICBjb25zdCBlbmFibGVkRmVhdHVyZXNQcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICBlbmFibGVkRmVhdHVyZXNcbiAgICAgICAgICApLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihcbiAgICAgICAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICBbYGVuYWJsZWRGZWF0dXJlcy4ke2tleX1gXTogYCR7dmFsdWV9YCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge31cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgdGltaW5nUHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgIFwidGltaW5nLmVucmljaGVkX2F0X21zXCI6IHdpbmRvdy5wZXJmb3JtYW5jZT8ubm93KCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGVucmljaGVkRXZlbnQgPSB7XG4gICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgLi4uZXZlbnQuZXZlbnRfcHJvcGVydGllcyxcbiAgICAgICAgICAgICAgLi4uZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMoKSxcbiAgICAgICAgICAgICAgLi4uZ2xvYmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgLi4uZW5hYmxlZEZlYXR1cmVzUHJvcGVydGllcyxcbiAgICAgICAgICAgICAgLi4udGltaW5nUHJvcGVydGllcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnJpY2hlZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudHNEaXNwYXRjaGVyLmRpc3BhdGNoKFNwaWZmeUV2ZW50LkFNUExJVFVERV9FVkVOVCwgZW5yaWNoZWRFdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIGVucmljaGVkRXZlbnQ7XG4gICAgICB9LFxuICAgIH07XG4gICAgc2V0SW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudChlbnJpY2htZW50KTtcbiAgICByZXR1cm4gZW5yaWNobWVudDtcbiAgfSwgW1xuICAgIGludGVybmFsRXZlbnRUcmFja2luZ0VucmljaG1lbnQsXG4gICAgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMsXG4gICAgZmVhdHVyZUZsYWdTZXJ2aWNlLFxuICAgIHB1YmxpY0tleSxcbiAgICBmZWF0dXJlT3ZlcnJpZGVzLFxuICAgIHZhcmlhbnRVcmxPdmVycmlkZSxcbiAgICB2YXJpYW50SW5mb092ZXJyaWRlLFxuICAgIHNob3csXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzUmVhZHkgJiYgIWFtcGxpdHVkZUNsaWVudCkge1xuICAgICAgY29uc3QgY3VycmVudEFtcGxpdHVkZUluc3RhbmNlOiBCcm93c2VyQ2xpZW50ID0gY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IGlzU2Vzc2lvbnNFbmFibGVkID0gYW1wbGl0dWRlU2Vzc2lvblJlcGxheUluaXQoKTtcbiAgICAgIGN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZS5hZGQoZ2V0RXZlbnRUcmFja2luZ0VucmljaG1lbnQoKSk7XG4gICAgICBjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UuaW5pdChhbXBsaXR1ZGVBcGlLZXkhLCB1c2VySWQhLCB7XG4gICAgICAgIHNlcnZlclpvbmU6IGRhdGFSZXNpZGVuY3kgYXMgU2VydmVyWm9uZVR5cGUsXG4gICAgICAgIHRyYWNraW5nT3B0aW9uczoge1xuICAgICAgICAgIGlwQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b2NhcHR1cmU6IHtcbiAgICAgICAgICBhdHRyaWJ1dGlvbjogdHJ1ZSxcbiAgICAgICAgICBwYWdlVmlld3M6IHtcbiAgICAgICAgICAgIHRyYWNrSGlzdG9yeUNoYW5nZXM6IFwicGF0aE9ubHlcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlc3Npb25zOiBpc1Nlc3Npb25zRW5hYmxlZCxcbiAgICAgICAgICBmb3JtSW50ZXJhY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgICBmaWxlRG93bmxvYWRzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgc2V0QW1wbGl0dWRlQ2xpZW50KGN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZSk7XG4gICAgfVxuICB9LCBbXG4gICAgaXNSZWFkeSxcbiAgICBhbXBsaXR1ZGVDbGllbnQsXG4gICAgYW1wbGl0dWRlQXBpS2V5LFxuICAgIHVzZXJJZCxcbiAgICBkYXRhUmVzaWRlbmN5LFxuICAgIGFtcGxpdHVkZVNlc3Npb25SZXBsYXlJbml0LFxuICAgIGdldEV2ZW50VHJhY2tpbmdFbnJpY2htZW50LFxuICBdKTtcblxuICBjb25zdCB0cmFja0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHtcbiAgICAgIGV2ZW50TmFtZSxcbiAgICAgIGV2ZW50UHJvcHMsXG4gICAgICBldmVudEdyb3VwcyxcbiAgICAgIGFsc29TZW5kVG9Hb29nbGVBbmFseXRpY3MgPSBmYWxzZSxcbiAgICB9OiBUcmFja0V2ZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBMb2dnZXIubG9nRGVidWcoXCJTdWJtaXR0aW5nIGV2ZW50XCIsIGV2ZW50TmFtZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWRFdmVudE5hbWUgPSBgW1NwaWZmeV0gJHtldmVudE5hbWV9YDtcblxuICAgICAgICBpZiAoIWFtcGxpdHVkZUNsaWVudCkge1xuICAgICAgICAgIExvZ2dlci5sb2dXYXJuKFwiYW1wbGl0dWRlIGNsaWVudCB1bmRlZmluZWRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBldmVudF9uYW1lOiBkZWNvcmF0ZWRFdmVudE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgICBldmVudFByb3BzLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKGV2ZW50RGF0YSk7XG4gICAgICAgICAvLyBjYWxjdWxhdGUgYSBoYXNoIG9mIHRoZSBldmVudCBwcm9wZXJ0aWVzIHRvIHVzZSBhcyB0aGUgaW5zZXJ0X2lkIHNvIHRoYXQgZHVwbGljYXRlIGV2ZW50c1xuICAgICAgICAvLyBhcmUgYXV0b21hdGljYWxseSBkcm9wcGVkIGJ5IEFtcGxpdHVkZVxuICAgICAgICBjb25zdCBoYXNoQnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoXCJTSEEtMjU2XCIsIGRhdGEpO1xuICAgICAgICBjb25zdCBoYXNoQXJyYXkgPSBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluc2VydElkID0gaGFzaEFycmF5XG4gICAgICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIExvZ2dlci5sb2dEZWJ1ZyhgYW1wbGl0dWRlIHRyYWNraW5nICR7ZGVjb3JhdGVkRXZlbnROYW1lfWAsIG51bGwsIHtcbiAgICAgICAgICBldmVudF9uYW1lOiBkZWNvcmF0ZWRFdmVudE5hbWUsXG4gICAgICAgICAgcHJvcHM6IGV2ZW50UHJvcHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFtcGxpdHVkZUNsaWVudC50cmFjayhcbiAgICAgICAgICBkZWNvcmF0ZWRFdmVudE5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMoKSxcbiAgICAgICAgICAgIC4uLmV2ZW50UHJvcHMsXG4gICAgICAgICAgICAuLi4oZXZlbnRQcm9wc1xuICAgICAgICAgICAgICA/IGV2ZW50UHJvcHNUb1ByZWZpeGVkRXZlbnRQcm9wcyhldmVudE5hbWUsIGV2ZW50UHJvcHMpXG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uZXZlbnRHcm91cHMsXG4gICAgICAgICAgICBpbnNlcnRfaWQ6IGN1cnJlbnRJbnNlcnRJZCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFsc29TZW5kVG9Hb29nbGVBbmFseXRpY3MgJiYgb3JnR2FDb25maWcpIHtcbiAgICAgICAgICAvLyBUT0RPOiBBZGQgaW4gd2luZG93RGF0YUxheWVyU2VydmljZSBvciBjb250ZXh0IGFsdGVybmF0aXZlIGFuZCBob29rIGl0IHVwIGhlcmVcbiAgICAgICAgICBMb2dnZXIubG9nRGVidWcoXCJbc3BpZmZ5LWFpXSBHQSB0cmFja2luZ1wiLCBkZWNvcmF0ZWRFdmVudE5hbWUpO1xuICAgICAgICAgIGlmICh3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAod2luZG93LmRhdGFMYXllciBhcyBhbnlbXSkucHVzaCh7XG4gICAgICAgICAgICAgIGV2ZW50OiBkZWNvcmF0ZWRFdmVudE5hbWUsXG4gICAgICAgICAgICAgIGV2ZW50UHJvcHM6IGV2ZW50UHJvcHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBMb2dnZXIubG9nRXJyb3IoXCJbc3BpZmZ5LWFpXSBFcnJvciB0cmFja2luZyBldmVudFwiLCBlcnIsIHtcbiAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgZXZlbnRQcm9wcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhbXBsaXR1ZGVDbGllbnQsXG4gICAgICBnZXREZWZhdWx0VHJhY2tpbmdQcm9wcyxcbiAgICAgIGV2ZW50UHJvcHNUb1ByZWZpeGVkRXZlbnRQcm9wcyxcbiAgICAgIG9yZ0dhQ29uZmlnLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHRyYWNrRXZlbnQsXG4gICAgICBpc1JlYWR5LFxuICAgICAgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzOiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PlxuICAgICAgICBzZXRTdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMocHJvcHMpLFxuICAgIH0pLFxuICAgIFt0cmFja0V2ZW50LCBpc1JlYWR5LCBzZXRTdXBwbGVtZW50YWxEZWZhdWx0UHJvcHNdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QW1wbGl0dWRlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dmFsdWV9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQW1wbGl0dWRlQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VBbXBsaXR1ZGUgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KEFtcGxpdHVkZUNvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VBbXBsaXR1ZGUgbXVzdCBiZSB1c2VkIHdpdGhpbiBBbXBsaXR1ZGVQcm92aWRlclwiKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNDQSxJQUFZLDRFQUFMO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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
@@ -1,264 +0,0 @@
1
- import { EventsDispatcher, SpiffyEvent } from "./events-DyUix-Bn.js";
2
- import { OrgShortName } from "./models-CWOgrLCm.js";
3
- import { FeatureGates } from "./featureGates-KEwAL8p_.js";
4
- import { logger_default } from "./logger-W3lqg-4b.js";
5
- import { LocalStorageKeys, useLocalStorage } from "./localStorageContext-BPZ82q-G.js";
6
- import { amplitudeApiKeyAtom, contextSourceAtom, dataResidencyAtom, envAtom, identifyingPrefixAtom } from "./enviveConfig-DZBohDpc.js";
7
- import { orgAnalyticsGoogleAnalyticsConfigAtom } from "./orgAnalyticsConfig-CpBmga08.js";
8
- import { userIdAtom } from "./app-CflxT_xI.js";
9
- import { useEnviveConfig } from "./enviveConfigContext-DrDjCems.js";
10
- import { useFeatureFlagService } from "./featureFlagServiceContext-FBM6DdMJ.js";
11
- import React, { createContext, useCallback, useContext, useEffect, useMemo } from "react";
12
- import { useAtomValue } from "jotai";
13
- import { createInstance } from "@amplitude/analytics-browser";
14
- import { jsx } from "react/jsx-runtime";
15
-
16
- //#region src/contexts/amplitudeContext/amplitudeContext.tsx
17
- let SpiffyMetricsEventName = /* @__PURE__ */ function(SpiffyMetricsEventName$1) {
18
- SpiffyMetricsEventName$1["BundleLoaded"] = "Bundle Loaded";
19
- SpiffyMetricsEventName$1["ChatLiveAgentBtnClick"] = "Chat Live Agent Btn Click";
20
- SpiffyMetricsEventName$1["ChatFloatingButtonVisible"] = "Chat Floating Button Visible";
21
- SpiffyMetricsEventName$1["ChatComponentVisible"] = "Chat Component Visible";
22
- SpiffyMetricsEventName$1["ChatComponentExpanded"] = "Chat Component Expanded";
23
- SpiffyMetricsEventName$1["ChatComponentCollapsed"] = "Chat Component Collapsed";
24
- SpiffyMetricsEventName$1["ChatUserMessageInput"] = "Chat User Message Input";
25
- SpiffyMetricsEventName$1["ChatSuggestionClicked"] = "Chat Suggestion Clicked";
26
- SpiffyMetricsEventName$1["ChatAssistantResponse"] = "Chat Assistant Response";
27
- SpiffyMetricsEventName$1["ProductCardClicked"] = "Product Card Clicked";
28
- SpiffyMetricsEventName$1["ProductReviewCardClicked"] = "Product Review Card Clicked";
29
- SpiffyMetricsEventName$1["AddToCartClicked"] = "Add to Cart Clicked";
30
- SpiffyMetricsEventName$1["PromptCardClicked"] = "Prompt Card Clicked";
31
- SpiffyMetricsEventName$1["SupportedEvent"] = "Supported Event";
32
- SpiffyMetricsEventName$1["SearchBackToResponseClicked"] = "Search Back to Response Clicked";
33
- SpiffyMetricsEventName$1["PerformanceMetrics"] = "Performance Metrics";
34
- SpiffyMetricsEventName$1["SearchBarClicked"] = "Search Bar Clicked";
35
- SpiffyMetricsEventName$1["OrderLookupStarted"] = "Order Lookup Started";
36
- SpiffyMetricsEventName$1["OrderLookupFormSubmitted"] = "Order Lookup Form Submitted";
37
- SpiffyMetricsEventName$1["SearchComponentVisible"] = "Search Component Visible";
38
- SpiffyMetricsEventName$1["SearchZeroStateSuggestionClicked"] = "Search Zero State Suggestion Clicked";
39
- SpiffyMetricsEventName$1["SearchInputStarted"] = "Search Input Started";
40
- SpiffyMetricsEventName$1["SearchQuerySubmitted"] = "Search Query Submitted";
41
- SpiffyMetricsEventName$1["SearchResultsViewed"] = "Search Results Viewed";
42
- SpiffyMetricsEventName$1["SearchTimeToFirstClick"] = "Search Time to First Click";
43
- SpiffyMetricsEventName$1["SearchZeroResultsRate"] = "Search Zero Results Rate";
44
- SpiffyMetricsEventName$1["SearchFilterClicked"] = "Search Filter Clicked";
45
- SpiffyMetricsEventName$1["SearchSortClicked"] = "Search Sort Clicked";
46
- return SpiffyMetricsEventName$1;
47
- }({});
48
- const AmplitudeContext = createContext(null);
49
- const AmplitudeProvider = ({ children }) => {
50
- const userId = useAtomValue(userIdAtom);
51
- const amplitudeApiKey = useAtomValue(amplitudeApiKeyAtom);
52
- const dataResidency = useAtomValue(dataResidencyAtom);
53
- const orgGaConfig = useAtomValue(orgAnalyticsGoogleAnalyticsConfigAtom);
54
- const env = useAtomValue(envAtom);
55
- const contextSource = useAtomValue(contextSourceAtom);
56
- useAtomValue(identifyingPrefixAtom);
57
- const { getItem } = useLocalStorage();
58
- const { publicKey, featureOverrides, variantUrlOverride, variantInfoOverride, show, orgShortName, featureGates } = useEnviveConfig();
59
- const { featureFlagService } = useFeatureFlagService();
60
- const [amplitudeClient, setAmplitudeClient] = React.useState(void 0);
61
- const [internalEventTrackingEnrichment, setInternalEventTrackingEnrichment] = React.useState(void 0);
62
- const [supplementalDefaultProps, setSupplementalDefaultProps] = React.useState({});
63
- const isReady = Boolean(userId && featureFlagService && amplitudeApiKey && userId);
64
- const getDefaultTrackingProps = useCallback(() => {
65
- const gatesProps = featureGates ? featureGates.reduce((acc, curr) => {
66
- if (curr.name && curr.value != null) return {
67
- ...acc,
68
- [`feature_gate.${curr.name}`]: curr.value
69
- };
70
- return acc;
71
- }, {}) : {};
72
- const experimentProps = {};
73
- return {
74
- ...gatesProps,
75
- ...experimentProps,
76
- ...supplementalDefaultProps,
77
- app_id: "commerce-chat-react-component",
78
- chat_id: getItem(LocalStorageKeys.ChatId),
79
- env: env || "unknown",
80
- app_source: contextSource,
81
- "org.short_name": orgShortName,
82
- "user.id": userId,
83
- "cdp.user_id": null,
84
- "cdp.provider": null,
85
- "event.source": "web-browser",
86
- "event.type": "user-activity",
87
- "event.id": null,
88
- "event.channel": "web",
89
- "event.timestamp": null
90
- };
91
- }, [
92
- featureGates,
93
- supplementalDefaultProps,
94
- env,
95
- contextSource,
96
- orgShortName,
97
- userId
98
- ]);
99
- const eventPropsToPrefixedEventProps = useCallback((eventName, eventProps) => {
100
- const prefix = eventName.toLowerCase().replace(/\s+/g, "_");
101
- return Object.entries(eventProps).reduce((acc, [key, value$1]) => {
102
- acc[`${prefix}.${key}`] = value$1;
103
- return acc;
104
- }, {});
105
- }, []);
106
- const amplitudeSessionReplayInit = useCallback(() => {
107
- const isEnabled = Boolean(orgShortName === OrgShortName.UniqueVintage && featureFlagService?.isClientSessionEnabled() && featureFlagService?.isFeatureGateEnabled(FeatureGates.IsNewFeatureEnabled));
108
- const sampleRate = 1;
109
- try {
110
- logger_default.logDebug(`[spiffy-ai] amplitude session-replay initializing isEnabled=${isEnabled} sampleRate=${sampleRate}`);
111
- if (!isEnabled) return isEnabled;
112
- return isEnabled;
113
- } catch (e) {
114
- logger_default.logError("[spiffy-ai] Error initializing amplitude session-replay", e);
115
- return false;
116
- }
117
- }, [orgShortName, featureFlagService]);
118
- const getEventTrackingEnrichment = useCallback(() => {
119
- if (internalEventTrackingEnrichment !== void 0) return internalEventTrackingEnrichment;
120
- const enrichment = {
121
- name: "page-view-tracking-enrichment",
122
- type: "enrichment",
123
- setup: async () => void 0,
124
- execute: async (event) => {
125
- let enrichedEvent;
126
- if (["[Amplitude] Page Viewed", `[Spiffy] ${SpiffyMetricsEventName.BundleLoaded}`].includes(event.event_type)) {
127
- const globalProperties = {};
128
- if (publicKey) globalProperties["globalProperties.publicKey"] = publicKey;
129
- if (featureOverrides) Object.entries(featureOverrides).forEach(([key, value$1]) => {
130
- globalProperties[`globalProperties.featureOverrides.${key}`] = String(value$1);
131
- });
132
- if (variantUrlOverride) globalProperties["globalProperties.variantUrlOverride"] = variantUrlOverride;
133
- if (variantInfoOverride) globalProperties["globalProperties.variantInfoOverride"] = JSON.stringify(variantInfoOverride);
134
- if (show != null) globalProperties["globalProperties.show"] = String(show);
135
- const enabledFeatures = featureFlagService.getFeatureFlags();
136
- const enabledFeaturesProperties = Object.entries(enabledFeatures).reduce((acc, [key, value$1]) => ({
137
- ...acc,
138
- [`enabledFeatures.${key}`]: `${value$1}`
139
- }), {});
140
- const timingProperties = { "timing.enriched_at_ms": window.performance?.now() };
141
- enrichedEvent = {
142
- ...event,
143
- event_properties: {
144
- ...event.event_properties,
145
- ...getDefaultTrackingProps(),
146
- ...globalProperties,
147
- ...enabledFeaturesProperties,
148
- ...timingProperties
149
- }
150
- };
151
- } else enrichedEvent = event;
152
- EventsDispatcher.dispatch(SpiffyEvent.AMPLITUDE_EVENT, enrichedEvent);
153
- return enrichedEvent;
154
- }
155
- };
156
- setInternalEventTrackingEnrichment(enrichment);
157
- return enrichment;
158
- }, [
159
- internalEventTrackingEnrichment,
160
- getDefaultTrackingProps,
161
- featureFlagService,
162
- publicKey,
163
- featureOverrides,
164
- variantUrlOverride,
165
- variantInfoOverride,
166
- show
167
- ]);
168
- useEffect(() => {
169
- if (isReady && !amplitudeClient) {
170
- const currentAmplitudeInstance = createInstance();
171
- const isSessionsEnabled = amplitudeSessionReplayInit();
172
- currentAmplitudeInstance.add(getEventTrackingEnrichment());
173
- currentAmplitudeInstance.init(amplitudeApiKey, userId, {
174
- serverZone: dataResidency,
175
- trackingOptions: { ipAddress: true },
176
- autocapture: {
177
- attribution: true,
178
- pageViews: { trackHistoryChanges: "pathOnly" },
179
- sessions: isSessionsEnabled,
180
- formInteractions: false,
181
- fileDownloads: false
182
- }
183
- });
184
- setAmplitudeClient(currentAmplitudeInstance);
185
- }
186
- }, [
187
- isReady,
188
- amplitudeClient,
189
- amplitudeApiKey,
190
- userId,
191
- dataResidency,
192
- amplitudeSessionReplayInit,
193
- getEventTrackingEnrichment
194
- ]);
195
- const trackEvent = useCallback(async ({ eventName, eventProps, eventGroups, alsoSendToGoogleAnalytics = false }) => {
196
- logger_default.logDebug("Submitting event", eventName);
197
- try {
198
- const decoratedEventName = `[Spiffy] ${eventName}`;
199
- if (!amplitudeClient) {
200
- logger_default.logWarn("amplitude client undefined", void 0, { event_name: decoratedEventName });
201
- return;
202
- }
203
- const eventData = JSON.stringify({
204
- eventName,
205
- eventProps,
206
- created_at: (/* @__PURE__ */ new Date()).toISOString()
207
- });
208
- const data = new TextEncoder().encode(eventData);
209
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
210
- const currentInsertId = Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
211
- logger_default.logDebug(`amplitude tracking ${decoratedEventName}`, null, {
212
- event_name: decoratedEventName,
213
- props: eventProps
214
- });
215
- amplitudeClient.track(decoratedEventName, {
216
- ...getDefaultTrackingProps(),
217
- ...eventProps,
218
- ...eventProps ? eventPropsToPrefixedEventProps(eventName, eventProps) : {}
219
- }, {
220
- ...eventGroups,
221
- insert_id: currentInsertId
222
- });
223
- if (alsoSendToGoogleAnalytics && orgGaConfig) {
224
- logger_default.logDebug("[spiffy-ai] GA tracking", decoratedEventName);
225
- if (window.dataLayer) window.dataLayer.push({
226
- event: decoratedEventName,
227
- eventProps
228
- });
229
- }
230
- } catch (err) {
231
- logger_default.logError("[spiffy-ai] Error tracking event", err, {
232
- eventName,
233
- eventProps
234
- });
235
- }
236
- }, [
237
- amplitudeClient,
238
- getDefaultTrackingProps,
239
- eventPropsToPrefixedEventProps,
240
- orgGaConfig
241
- ]);
242
- const value = useMemo(() => ({
243
- trackEvent,
244
- isReady,
245
- setSupplementalDefaultProps: (props) => setSupplementalDefaultProps(props)
246
- }), [
247
- trackEvent,
248
- isReady,
249
- setSupplementalDefaultProps
250
- ]);
251
- return /* @__PURE__ */ jsx(AmplitudeContext.Provider, {
252
- value,
253
- children
254
- });
255
- };
256
- const useAmplitude = () => {
257
- const context = useContext(AmplitudeContext);
258
- if (!context) throw new Error("useAmplitude must be used within AmplitudeProvider");
259
- return context;
260
- };
261
-
262
- //#endregion
263
- export { AmplitudeProvider, SpiffyMetricsEventName, useAmplitude };
264
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wbGl0dWRlQ29udGV4dC1EQ2s2VmEtai5qcyIsIm5hbWVzIjpbIkFtcGxpdHVkZVByb3ZpZGVyOiBSZWFjdC5GQzx7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfT4iLCJ2YWx1ZSIsImVucmljaG1lbnQ6IEVucmljaG1lbnRQbHVnaW4iLCJlbnJpY2hlZEV2ZW50OiBFdmVudCIsImdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4iLCJjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2U6IEJyb3dzZXJDbGllbnQiXSwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dC9hbXBsaXR1ZGVDb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VBdG9tVmFsdWUgfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSBcIkBhbXBsaXR1ZGUvYW5hbHl0aWNzLWJyb3dzZXJcIjtcbmltcG9ydCB7IEZlYXR1cmVHYXRlcyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlc1wiO1xuaW1wb3J0IHsgT3JnU2hvcnROYW1lIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHNcIjtcbmltcG9ydCB7IEV2ZW50c0Rpc3BhdGNoZXIsIFNwaWZmeUV2ZW50IH0gZnJvbSBcInNyYy9ldmVudHNcIjtcbmltcG9ydCB7XG4gIGFtcGxpdHVkZUFwaUtleUF0b20sXG4gIGNvbnRleHRTb3VyY2VBdG9tLFxuICBkYXRhUmVzaWRlbmN5QXRvbSxcbiAgaWRlbnRpZnlpbmdQcmVmaXhBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7XG4gIExvY2FsU3RvcmFnZUtleXMsXG4gIHVzZUxvY2FsU3RvcmFnZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9sb2NhbFN0b3JhZ2VDb250ZXh0XCI7XG5pbXBvcnQgeyBvcmdBbmFseXRpY3NHb29nbGVBbmFseXRpY3NDb25maWdBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmcvb3JnQW5hbHl0aWNzQ29uZmlnXCI7XG5pbXBvcnQgeyB1c2VySWRBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9hcHBcIjtcbmltcG9ydCB7IGVudkF0b20gfSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUge1xuICBCcm93c2VyQ2xpZW50LFxuICBFbnJpY2htZW50UGx1Z2luLFxuICBFdmVudCxcbiAgU2VydmVyWm9uZVR5cGUsXG59IGZyb20gXCJAYW1wbGl0dWRlL2FuYWx5dGljcy10eXBlc1wiO1xuaW1wb3J0IHsgdXNlRW52aXZlQ29uZmlnIH0gZnJvbSBcInNyYy9jb250ZXh0cy9lbnZpdmVDb25maWdDb250ZXh0L2Vudml2ZUNvbmZpZ0NvbnRleHRcIjtcbmltcG9ydCB7XG4gIHVzZUZlYXR1cmVGbGFnU2VydmljZSxcbn0gZnJvbSBcInNyYy9jb250ZXh0cy9mZWF0dXJlRmxhZ1NlcnZpY2VDb250ZXh0L2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHRcIjtcbmltcG9ydCB7IHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dC91c2VySWRlbnRpdHlDb250ZXh0XCI7XG5cbmV4cG9ydCBlbnVtIFNwaWZmeU1ldHJpY3NFdmVudE5hbWUge1xuICBCdW5kbGVMb2FkZWQgPSBcIkJ1bmRsZSBMb2FkZWRcIixcbiAgQ2hhdExpdmVBZ2VudEJ0bkNsaWNrID0gXCJDaGF0IExpdmUgQWdlbnQgQnRuIENsaWNrXCIsXG4gIENoYXRGbG9hdGluZ0J1dHRvblZpc2libGUgPSBcIkNoYXQgRmxvYXRpbmcgQnV0dG9uIFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudFZpc2libGUgPSBcIkNoYXQgQ29tcG9uZW50IFZpc2libGVcIixcbiAgQ2hhdENvbXBvbmVudEV4cGFuZGVkID0gXCJDaGF0IENvbXBvbmVudCBFeHBhbmRlZFwiLFxuICBDaGF0Q29tcG9uZW50Q29sbGFwc2VkID0gXCJDaGF0IENvbXBvbmVudCBDb2xsYXBzZWRcIixcbiAgQ2hhdFVzZXJNZXNzYWdlSW5wdXQgPSBcIkNoYXQgVXNlciBNZXNzYWdlIElucHV0XCIsXG4gIENoYXRTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiQ2hhdCBTdWdnZXN0aW9uIENsaWNrZWRcIixcbiAgQ2hhdEFzc2lzdGFudFJlc3BvbnNlID0gXCJDaGF0IEFzc2lzdGFudCBSZXNwb25zZVwiLFxuICBQcm9kdWN0Q2FyZENsaWNrZWQgPSBcIlByb2R1Y3QgQ2FyZCBDbGlja2VkXCIsXG4gIFByb2R1Y3RSZXZpZXdDYXJkQ2xpY2tlZCA9IFwiUHJvZHVjdCBSZXZpZXcgQ2FyZCBDbGlja2VkXCIsXG4gIEFkZFRvQ2FydENsaWNrZWQgPSBcIkFkZCB0byBDYXJ0IENsaWNrZWRcIixcbiAgUHJvbXB0Q2FyZENsaWNrZWQgPSBcIlByb21wdCBDYXJkIENsaWNrZWRcIixcbiAgU3VwcG9ydGVkRXZlbnQgPSBcIlN1cHBvcnRlZCBFdmVudFwiLFxuICBTZWFyY2hCYWNrVG9SZXNwb25zZUNsaWNrZWQgPSBcIlNlYXJjaCBCYWNrIHRvIFJlc3BvbnNlIENsaWNrZWRcIixcbiAgUGVyZm9ybWFuY2VNZXRyaWNzID0gXCJQZXJmb3JtYW5jZSBNZXRyaWNzXCIsXG4gIFNlYXJjaEJhckNsaWNrZWQgPSBcIlNlYXJjaCBCYXIgQ2xpY2tlZFwiLFxuICBPcmRlckxvb2t1cFN0YXJ0ZWQgPSBcIk9yZGVyIExvb2t1cCBTdGFydGVkXCIsXG4gIE9yZGVyTG9va3VwRm9ybVN1Ym1pdHRlZCA9IFwiT3JkZXIgTG9va3VwIEZvcm0gU3VibWl0dGVkXCIsXG4gIFNlYXJjaENvbXBvbmVudFZpc2libGUgPSBcIlNlYXJjaCBDb21wb25lbnQgVmlzaWJsZVwiLFxuICBTZWFyY2haZXJvU3RhdGVTdWdnZXN0aW9uQ2xpY2tlZCA9IFwiU2VhcmNoIFplcm8gU3RhdGUgU3VnZ2VzdGlvbiBDbGlja2VkXCIsIC8vIFRoaXMgaXMgdGhlIHNjcm9sbGluZyBsaXN0IG9mIHN1Z2dlc3Rpb24gYnV0dG9ucyBpbiBnbG9iYWwgc2VhcmNoXG4gIFNlYXJjaElucHV0U3RhcnRlZCA9IFwiU2VhcmNoIElucHV0IFN0YXJ0ZWRcIixcbiAgU2VhcmNoUXVlcnlTdWJtaXR0ZWQgPSBcIlNlYXJjaCBRdWVyeSBTdWJtaXR0ZWRcIixcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlVmlld2VkID0gJ1NlYXJjaCBBdXRvY29tcGxldGUgVmlld2VkJywgLy8gVE9ETzogYWRkIHRoaXMgd2hlbiBhdXRvY29tcGxldGUgaXMgYWRkZWRcbiAgLy8gU2VhcmNoQXV0b2NvbXBsZXRlQ2xpY2tlZCA9ICdTZWFyY2ggQXV0b2NvbXBsZXRlIENsaWNrZWQnLCAvLyBUT0RPOiBhZGQgdGhpcyB3aGVuIGF1dG9jb21wbGV0ZSBpcyBhZGRlZFxuICBTZWFyY2hSZXN1bHRzVmlld2VkID0gXCJTZWFyY2ggUmVzdWx0cyBWaWV3ZWRcIixcbiAgU2VhcmNoVGltZVRvRmlyc3RDbGljayA9IFwiU2VhcmNoIFRpbWUgdG8gRmlyc3QgQ2xpY2tcIixcbiAgU2VhcmNoWmVyb1Jlc3VsdHNSYXRlID0gXCJTZWFyY2ggWmVybyBSZXN1bHRzIFJhdGVcIixcbiAgU2VhcmNoRmlsdGVyQ2xpY2tlZCA9IFwiU2VhcmNoIEZpbHRlciBDbGlja2VkXCIsXG4gIFNlYXJjaFNvcnRDbGlja2VkID0gXCJTZWFyY2ggU29ydCBDbGlja2VkXCIsXG59XG5cbmludGVyZmFjZSBUcmFja0V2ZW50UGFyYW1zIHtcbiAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lO1xuICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV2ZW50R3JvdXBzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFsc29TZW5kVG9Hb29nbGVBbmFseXRpY3M/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQW1wbGl0dWRlQ29udGV4dFR5cGUge1xuICB0cmFja0V2ZW50OiAocGFyYW1zOiBUcmFja0V2ZW50UGFyYW1zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpc1JlYWR5OiBib29sZWFuO1xuICBzZXRTdXBwbGVtZW50YWxEZWZhdWx0UHJvcHM6IChwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEFtcGxpdHVkZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEFtcGxpdHVkZUNvbnRleHRUeXBlIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCBBbXBsaXR1ZGVQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+ID0gKHtcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IHVzZXJJZCA9IHVzZUF0b21WYWx1ZSh1c2VySWRBdG9tKTtcbiAgY29uc3QgYW1wbGl0dWRlQXBpS2V5ID0gdXNlQXRvbVZhbHVlKGFtcGxpdHVkZUFwaUtleUF0b20pO1xuICBjb25zdCBkYXRhUmVzaWRlbmN5ID0gdXNlQXRvbVZhbHVlKGRhdGFSZXNpZGVuY3lBdG9tKTtcbiAgY29uc3Qgb3JnR2FDb25maWcgPSB1c2VBdG9tVmFsdWUob3JnQW5hbHl0aWNzR29vZ2xlQW5hbHl0aWNzQ29uZmlnQXRvbSk7XG4gIGNvbnN0IGVudiA9IHVzZUF0b21WYWx1ZShlbnZBdG9tKTtcbiAgY29uc3QgY29udGV4dFNvdXJjZSA9IHVzZUF0b21WYWx1ZShjb250ZXh0U291cmNlQXRvbSk7XG4gIGNvbnN0IGlkZW50aWZ5aW5nUHJlZml4ID0gdXNlQXRvbVZhbHVlKGlkZW50aWZ5aW5nUHJlZml4QXRvbSk7XG4gIGNvbnN0IHsgZ2V0SXRlbSB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG4gIGNvbnN0IHtcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICBmZWF0dXJlR2F0ZXMsXG4gIH0gPSB1c2VFbnZpdmVDb25maWcoKTtcblxuICBjb25zdCB7IGZlYXR1cmVGbGFnU2VydmljZSB9ID0gdXNlRmVhdHVyZUZsYWdTZXJ2aWNlKCk7XG5cbiAgY29uc3QgW2FtcGxpdHVkZUNsaWVudCwgc2V0QW1wbGl0dWRlQ2xpZW50XSA9IFJlYWN0LnVzZVN0YXRlPFxuICAgIEJyb3dzZXJDbGllbnQgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCwgc2V0SW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudF0gPVxuICAgIFJlYWN0LnVzZVN0YXRlPEVucmljaG1lbnRQbHVnaW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFtzdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wc10gPVxuICAgIFJlYWN0LnVzZVN0YXRlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG5cbiAgY29uc3QgaXNSZWFkeSA9IEJvb2xlYW4oXG4gICAgdXNlcklkICYmIGZlYXR1cmVGbGFnU2VydmljZSAmJiBhbXBsaXR1ZGVBcGlLZXkgJiYgdXNlcklkXG4gICk7XG5cbiAgY29uc3QgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMgPSB1c2VDYWxsYmFjaygoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IGdhdGVzUHJvcHMgPSBmZWF0dXJlR2F0ZXNcbiAgICAgID8gZmVhdHVyZUdhdGVzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgIGlmIChjdXJyLm5hbWUgJiYgY3Vyci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtgZmVhdHVyZV9nYXRlLiR7Y3Vyci5uYW1lfWBdOiBjdXJyLnZhbHVlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiB7fTtcbiAgICBjb25zdCBleHBlcmltZW50UHJvcHMgPSB7fTsgLy8gTm8gZGlyZWN0IGVxdWl2YWxlbnQgZm9yIGV4cGVyaW1lbnRzIGluIEVudml2ZUNvbmZpZyB5ZXRcblxuICAgIGNvbnN0IG9yZ0xldmVsQW1wbGl0dWRlVHJhY2tpbmdQcm9wcyA9IHtcbiAgICAgIC4uLmdhdGVzUHJvcHMsXG4gICAgICAuLi5leHBlcmltZW50UHJvcHMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5vcmdMZXZlbEFtcGxpdHVkZVRyYWNraW5nUHJvcHMsXG4gICAgICAuLi5zdXBwbGVtZW50YWxEZWZhdWx0UHJvcHMsXG4gICAgICAvLyBUT0RPOiBvcmdfaWQgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBpbiBFbnZpdmVDb25maWcuIE5lZWQgdG8gZmluZCBhIG5ldyBzb3VyY2Ugb3IgZGVyaXZlIGl0LlxuICAgICAgLy8gb3JnX2lkOiBvcmdDb25maWc/Lm9yZz8ub3JnPy5pZCxcbiAgICAgIGFwcF9pZDogXCJjb21tZXJjZS1jaGF0LXJlYWN0LWNvbXBvbmVudFwiLFxuICAgICAgY2hhdF9pZDogZ2V0SXRlbShMb2NhbFN0b3JhZ2VLZXlzLkNoYXRJZCksXG4gICAgICBlbnY6IGVudiB8fCBcInVua25vd25cIixcbiAgICAgIGFwcF9zb3VyY2U6IGNvbnRleHRTb3VyY2UsXG4gICAgICBcIm9yZy5zaG9ydF9uYW1lXCI6IG9yZ1Nob3J0TmFtZSxcbiAgICAgIFwidXNlci5pZFwiOiB1c2VySWQsXG4gICAgICBcImNkcC51c2VyX2lkXCI6IG51bGwsXG4gICAgICBcImNkcC5wcm92aWRlclwiOiBudWxsLFxuICAgICAgXCJldmVudC5zb3VyY2VcIjogXCJ3ZWItYnJvd3NlclwiLFxuICAgICAgXCJldmVudC50eXBlXCI6IFwidXNlci1hY3Rpdml0eVwiLFxuICAgICAgXCJldmVudC5pZFwiOiBudWxsLFxuICAgICAgXCJldmVudC5jaGFubmVsXCI6IFwid2ViXCIsXG4gICAgICBcImV2ZW50LnRpbWVzdGFtcFwiOiBudWxsLFxuICAgIH07XG4gIH0sIFtcbiAgICBmZWF0dXJlR2F0ZXMsXG4gICAgc3VwcGxlbWVudGFsRGVmYXVsdFByb3BzLFxuICAgIGVudixcbiAgICBjb250ZXh0U291cmNlLFxuICAgIG9yZ1Nob3J0TmFtZSxcbiAgICB1c2VySWQsXG4gIF0pO1xuXG4gIGNvbnN0IGV2ZW50UHJvcHNUb1ByZWZpeGVkRXZlbnRQcm9wcyA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICAgIGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3QgcHJlZml4ID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXZlbnRQcm9wcykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBhY2NbYCR7cHJlZml4fS4ke2tleX1gXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCA9IHVzZUNhbGxiYWNrKCgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBpc0VuYWJsZWQgPSBCb29sZWFuKFxuICAgICAgb3JnU2hvcnROYW1lID09PSBPcmdTaG9ydE5hbWUuVW5pcXVlVmludGFnZSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzQ2xpZW50U2Vzc2lvbkVuYWJsZWQoKSAmJlxuICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmlzRmVhdHVyZUdhdGVFbmFibGVkKFxuICAgICAgICAgIEZlYXR1cmVHYXRlcy5Jc05ld0ZlYXR1cmVFbmFibGVkXG4gICAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHNhbXBsZVJhdGUgPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICAgYFtzcGlmZnktYWldIGFtcGxpdHVkZSBzZXNzaW9uLXJlcGxheSBpbml0aWFsaXppbmcgaXNFbmFibGVkPSR7aXNFbmFibGVkfSBzYW1wbGVSYXRlPSR7c2FtcGxlUmF0ZX1gXG4gICAgICApO1xuXG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBhbXBsaXR1ZGVJbnN0YW5jZS5hZGQoc2Vzc2lvblJlcGxheVBsdWdpbih7IHNhbXBsZVJhdGUgfSkpO1xuXG4gICAgICByZXR1cm4gaXNFbmFibGVkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgXCJbc3BpZmZ5LWFpXSBFcnJvciBpbml0aWFsaXppbmcgYW1wbGl0dWRlIHNlc3Npb24tcmVwbGF5XCIsXG4gICAgICAgIGVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCBbb3JnU2hvcnROYW1lLCBmZWF0dXJlRmxhZ1NlcnZpY2VdKTtcblxuICBjb25zdCBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCA9IHVzZUNhbGxiYWNrKCgpOiBFbnJpY2htZW50UGx1Z2luID0+IHtcbiAgICBpZiAoaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaW50ZXJuYWxFdmVudFRyYWNraW5nRW5yaWNobWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnJpY2htZW50OiBFbnJpY2htZW50UGx1Z2luID0ge1xuICAgICAgbmFtZTogXCJwYWdlLXZpZXctdHJhY2tpbmctZW5yaWNobWVudFwiLFxuICAgICAgdHlwZTogXCJlbnJpY2htZW50XCIsXG4gICAgICBzZXR1cDogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGV2ZW50OiBFdmVudCk6IFByb21pc2U8RXZlbnQ+ID0+IHtcbiAgICAgICAgbGV0IGVucmljaGVkRXZlbnQ6IEV2ZW50O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50c1RvRW5yaWNoID0gW1xuICAgICAgICAgIFwiW0FtcGxpdHVkZV0gUGFnZSBWaWV3ZWRcIixcbiAgICAgICAgICBgW1NwaWZmeV0gJHtTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkJ1bmRsZUxvYWRlZH1gLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChldmVudHNUb0VucmljaC5pbmNsdWRlcyhldmVudC5ldmVudF90eXBlKSkge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgIGlmIChwdWJsaWNLZXkpIHtcbiAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXNbXCJnbG9iYWxQcm9wZXJ0aWVzLnB1YmxpY0tleVwiXSA9IHB1YmxpY0tleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZlYXR1cmVPdmVycmlkZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVPdmVycmlkZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW2BnbG9iYWxQcm9wZXJ0aWVzLmZlYXR1cmVPdmVycmlkZXMuJHtrZXl9YF0gPVxuICAgICAgICAgICAgICAgIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcmlhbnRVcmxPdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudFVybE92ZXJyaWRlXCJdID1cbiAgICAgICAgICAgICAgdmFyaWFudFVybE92ZXJyaWRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFyaWFudEluZm9PdmVycmlkZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllc1tcImdsb2JhbFByb3BlcnRpZXMudmFyaWFudEluZm9PdmVycmlkZVwiXSA9XG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZhcmlhbnRJbmZvT3ZlcnJpZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzW1wiZ2xvYmFsUHJvcGVydGllcy5zaG93XCJdID0gU3RyaW5nKHNob3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuYWJsZWRGZWF0dXJlcyA9IGZlYXR1cmVGbGFnU2VydmljZSEuZ2V0RmVhdHVyZUZsYWdzKCk7XG4gICAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzUHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgZW5hYmxlZEZlYXR1cmVzXG4gICAgICAgICAgKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gICAgICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgW2BlbmFibGVkRmVhdHVyZXMuJHtrZXl9YF06IGAke3ZhbHVlfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRpbWluZ1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBcInRpbWluZy5lbnJpY2hlZF9hdF9tc1wiOiB3aW5kb3cucGVyZm9ybWFuY2U/Lm5vdygpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBlbnJpY2hlZEV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICBldmVudF9wcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIC4uLmV2ZW50LmV2ZW50X3Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAgIC4uLmdsb2JhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLmVuYWJsZWRGZWF0dXJlc1Byb3BlcnRpZXMsXG4gICAgICAgICAgICAgIC4uLnRpbWluZ1Byb3BlcnRpZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5yaWNoZWRFdmVudCA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgRXZlbnRzRGlzcGF0Y2hlci5kaXNwYXRjaChTcGlmZnlFdmVudC5BTVBMSVRVREVfRVZFTlQsIGVucmljaGVkRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiBlbnJpY2hlZEV2ZW50O1xuICAgICAgfSxcbiAgICB9O1xuICAgIHNldEludGVybmFsRXZlbnRUcmFja2luZ0VucmljaG1lbnQoZW5yaWNobWVudCk7XG4gICAgcmV0dXJuIGVucmljaG1lbnQ7XG4gIH0sIFtcbiAgICBpbnRlcm5hbEV2ZW50VHJhY2tpbmdFbnJpY2htZW50LFxuICAgIGdldERlZmF1bHRUcmFja2luZ1Byb3BzLFxuICAgIGZlYXR1cmVGbGFnU2VydmljZSxcbiAgICBwdWJsaWNLZXksXG4gICAgZmVhdHVyZU92ZXJyaWRlcyxcbiAgICB2YXJpYW50VXJsT3ZlcnJpZGUsXG4gICAgdmFyaWFudEluZm9PdmVycmlkZSxcbiAgICBzaG93LFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc1JlYWR5ICYmICFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbXBsaXR1ZGVJbnN0YW5jZTogQnJvd3NlckNsaWVudCA9IGNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICBjb25zdCBpc1Nlc3Npb25zRW5hYmxlZCA9IGFtcGxpdHVkZVNlc3Npb25SZXBsYXlJbml0KCk7XG4gICAgICBjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UuYWRkKGdldEV2ZW50VHJhY2tpbmdFbnJpY2htZW50KCkpO1xuICAgICAgY3VycmVudEFtcGxpdHVkZUluc3RhbmNlLmluaXQoYW1wbGl0dWRlQXBpS2V5ISwgdXNlcklkISwge1xuICAgICAgICBzZXJ2ZXJab25lOiBkYXRhUmVzaWRlbmN5IGFzIFNlcnZlclpvbmVUeXBlLFxuICAgICAgICB0cmFja2luZ09wdGlvbnM6IHtcbiAgICAgICAgICBpcEFkZHJlc3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9jYXB0dXJlOiB7XG4gICAgICAgICAgYXR0cmlidXRpb246IHRydWUsXG4gICAgICAgICAgcGFnZVZpZXdzOiB7XG4gICAgICAgICAgICB0cmFja0hpc3RvcnlDaGFuZ2VzOiBcInBhdGhPbmx5XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXNzaW9uczogaXNTZXNzaW9uc0VuYWJsZWQsXG4gICAgICAgICAgZm9ybUludGVyYWN0aW9uczogZmFsc2UsXG4gICAgICAgICAgZmlsZURvd25sb2FkczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHNldEFtcGxpdHVkZUNsaWVudChjdXJyZW50QW1wbGl0dWRlSW5zdGFuY2UpO1xuICAgIH1cbiAgfSwgW1xuICAgIGlzUmVhZHksXG4gICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgIGFtcGxpdHVkZUFwaUtleSxcbiAgICB1c2VySWQsXG4gICAgZGF0YVJlc2lkZW5jeSxcbiAgICBhbXBsaXR1ZGVTZXNzaW9uUmVwbGF5SW5pdCxcbiAgICBnZXRFdmVudFRyYWNraW5nRW5yaWNobWVudCxcbiAgXSk7XG5cbiAgY29uc3QgdHJhY2tFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudFByb3BzLFxuICAgICAgZXZlbnRHcm91cHMsXG4gICAgICBhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzID0gZmFsc2UsXG4gICAgfTogVHJhY2tFdmVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiU3VibWl0dGluZyBldmVudFwiLCBldmVudE5hbWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkRXZlbnROYW1lID0gYFtTcGlmZnldICR7ZXZlbnROYW1lfWA7XG5cbiAgICAgICAgaWYgKCFhbXBsaXR1ZGVDbGllbnQpIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybihcImFtcGxpdHVkZSBjbGllbnQgdW5kZWZpbmVkXCIsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudE5hbWUsXG4gICAgICAgICAgZXZlbnRQcm9wcyxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShldmVudERhdGEpO1xuICAgICAgICAgLy8gY2FsY3VsYXRlIGEgaGFzaCBvZiB0aGUgZXZlbnQgcHJvcGVydGllcyB0byB1c2UgYXMgdGhlIGluc2VydF9pZCBzbyB0aGF0IGR1cGxpY2F0ZSBldmVudHNcbiAgICAgICAgLy8gYXJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBieSBBbXBsaXR1ZGVcbiAgICAgICAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgICAgICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShoYXNoQnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbnNlcnRJZCA9IGhhc2hBcnJheVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgICAgICAuam9pbihcIlwiKTtcblxuICAgICAgICBMb2dnZXIubG9nRGVidWcoYGFtcGxpdHVkZSB0cmFja2luZyAke2RlY29yYXRlZEV2ZW50TmFtZX1gLCBudWxsLCB7XG4gICAgICAgICAgZXZlbnRfbmFtZTogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHByb3BzOiBldmVudFByb3BzLFxuICAgICAgICB9KTtcblxuICAgICAgICBhbXBsaXR1ZGVDbGllbnQudHJhY2soXG4gICAgICAgICAgZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmdldERlZmF1bHRUcmFja2luZ1Byb3BzKCksXG4gICAgICAgICAgICAuLi5ldmVudFByb3BzLFxuICAgICAgICAgICAgLi4uKGV2ZW50UHJvcHNcbiAgICAgICAgICAgICAgPyBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMoZXZlbnROYW1lLCBldmVudFByb3BzKVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmV2ZW50R3JvdXBzLFxuICAgICAgICAgICAgaW5zZXJ0X2lkOiBjdXJyZW50SW5zZXJ0SWQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhbHNvU2VuZFRvR29vZ2xlQW5hbHl0aWNzICYmIG9yZ0dhQ29uZmlnKSB7XG4gICAgICAgICAgLy8gVE9ETzogQWRkIGluIHdpbmRvd0RhdGFMYXllclNlcnZpY2Ugb3IgY29udGV4dCBhbHRlcm5hdGl2ZSBhbmQgaG9vayBpdCB1cCBoZXJlXG4gICAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFwiW3NwaWZmeS1haV0gR0EgdHJhY2tpbmdcIiwgZGVjb3JhdGVkRXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAod2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55W10pLnB1c2goe1xuICAgICAgICAgICAgICBldmVudDogZGVjb3JhdGVkRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFByb3BzOiBldmVudFByb3BzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgdHJhY2tpbmcgZXZlbnRcIiwgZXJyLCB7XG4gICAgICAgICAgZXZlbnROYW1lLFxuICAgICAgICAgIGV2ZW50UHJvcHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYW1wbGl0dWRlQ2xpZW50LFxuICAgICAgZ2V0RGVmYXVsdFRyYWNraW5nUHJvcHMsXG4gICAgICBldmVudFByb3BzVG9QcmVmaXhlZEV2ZW50UHJvcHMsXG4gICAgICBvcmdHYUNvbmZpZyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICB0cmFja0V2ZW50LFxuICAgICAgaXNSZWFkeSxcbiAgICAgIHNldFN1cHBsZW1lbnRhbERlZmF1bHRQcm9wczogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT5cbiAgICAgICAgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzKHByb3BzKSxcbiAgICB9KSxcbiAgICBbdHJhY2tFdmVudCwgaXNSZWFkeSwgc2V0U3VwcGxlbWVudGFsRGVmYXVsdFByb3BzXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEFtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0FtcGxpdHVkZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQW1wbGl0dWRlID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBbXBsaXR1ZGVDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlQW1wbGl0dWRlIG11c3QgYmUgdXNlZCB3aXRoaW4gQW1wbGl0dWRlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBc0NBLElBQVksNEVBQUw7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBZ0JGLE1BQU0sbUJBQW1CLGNBQTJDLEtBQUs7QUFFekUsTUFBYUEscUJBQThELEVBQ3pFLGVBQ0k7Q0FDSixNQUFNLFNBQVMsYUFBYSxXQUFXO0NBQ3ZDLE1BQU0sa0JBQWtCLGFBQWEsb0JBQW9CO0NBQ3pELE1BQU0sZ0JBQWdCLGFBQWEsa0JBQWtCO0NBQ3JELE1BQU0sY0FBYyxhQUFhLHNDQUFzQztDQUN2RSxNQUFNLE1BQU0sYUFBYSxR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