@nlabs/metropolisjs 1.0.1 → 1.0.6
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.
- package/CHANGELOG.md +6 -109
- package/README.md +32 -22
- package/examples/content-actions-usage.ts +1 -2
- package/examples/factory-pattern-usage.ts +0 -18
- package/lib/actions/appActions/appActions.d.ts +0 -1
- package/lib/actions/awsRumActions/awsRumActions.d.ts +1 -2
- package/lib/actions/awsRumActions/awsRumActions.js +43 -22
- package/lib/actions/connectionActions/connectionActions.d.ts +0 -1
- package/lib/actions/contentActions/contentActions.d.ts +0 -1
- package/lib/actions/conversationActions/conversationActions.d.ts +0 -1
- package/lib/actions/crmActions/crmActions.d.ts +0 -1
- package/lib/actions/eventActions/eventActions.d.ts +0 -1
- package/lib/actions/groupActions/groupActions.d.ts +0 -1
- package/lib/actions/imageActions/imageActions.d.ts +0 -1
- package/lib/actions/imageActions/imageActions.js +5 -4
- package/lib/actions/index.d.ts +0 -1
- package/lib/actions/locationActions/locationActions.d.ts +0 -1
- package/lib/actions/messageActions/messageActions.d.ts +0 -1
- package/lib/actions/permissionActions/permissionActions.d.ts +0 -1
- package/lib/actions/personaActions/personaActions.d.ts +0 -1
- package/lib/actions/postActions/postActions.d.ts +0 -1
- package/lib/actions/reactionActions/reactionActions.d.ts +0 -1
- package/lib/actions/restActions/restActions.d.ts +0 -1
- package/lib/actions/sseActions/sseActions.d.ts +0 -1
- package/lib/actions/sseActions/sseActions.js +1 -1
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts +0 -1
- package/lib/actions/tagActions/tagActions.d.ts +0 -1
- package/lib/actions/tagActions/tagActions.js +1 -1
- package/lib/actions/translationActions/translationActions.d.ts +0 -1
- package/lib/actions/userActions/userActions.d.ts +0 -3
- package/lib/actions/userActions/userActions.js +2 -7
- package/lib/actions/videoActions/videoActions.d.ts +0 -1
- package/lib/actions/websocketActions/websocketActions.d.ts +0 -1
- package/lib/adapters/appAdapter/appAdapter.d.ts +2 -3
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +2 -3
- package/lib/adapters/contentAdapter/contentAdapter.d.ts +2 -3
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +2 -3
- package/lib/adapters/eventAdapter/eventAdapter.d.ts +2 -3
- package/lib/adapters/fileAdapter/fileAdapter.d.ts +2 -3
- package/lib/adapters/groupAdapter/groupAdapter.d.ts +2 -3
- package/lib/adapters/imageAdapter/imageAdapter.d.ts +2 -3
- package/lib/adapters/index.d.ts +0 -1
- package/lib/adapters/locationAdapter/locationAdapter.d.ts +2 -3
- package/lib/adapters/messageAdapter/messageAdapter.d.ts +2 -3
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +2 -3
- package/lib/adapters/personaAdapter/personaAdapter.d.ts +2 -3
- package/lib/adapters/postAdapter/postAdapter.d.ts +2 -3
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +2 -3
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +2 -3
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +2 -3
- package/lib/adapters/tagAdapter/tagAdapter.d.ts +2 -4
- package/lib/adapters/tagAdapter/tagAdapter.js +1 -2
- package/lib/adapters/translationAdapter/translationAdapter.d.ts +2 -3
- package/lib/adapters/userAdapter/userAdapter.d.ts +2 -4
- package/lib/adapters/userAdapter/userAdapter.js +1 -2
- package/lib/adapters/videoAdapter/videoAdapter.d.ts +2 -3
- package/lib/config/index.d.ts +3 -3
- package/lib/config/index.js +7 -3
- package/lib/constants/Collections.d.ts +0 -1
- package/lib/constants/MetropolisConstants.d.ts +0 -1
- package/lib/graphql/message.d.ts +0 -1
- package/lib/graphql/notification.d.ts +0 -1
- package/lib/graphql/session.d.ts +0 -1
- package/lib/index.d.ts +4 -5
- package/lib/index.js +6 -5
- package/lib/stores/appStore.d.ts +0 -1
- package/lib/stores/contentStore.d.ts +0 -1
- package/lib/stores/conversationStore.d.ts +0 -1
- package/lib/stores/eventStore.d.ts +0 -1
- package/lib/stores/groupStore.d.ts +0 -1
- package/lib/stores/imageStore.d.ts +0 -1
- package/lib/stores/index.d.ts +0 -1
- package/lib/stores/locationStore.d.ts +0 -1
- package/lib/stores/messageStore.d.ts +0 -1
- package/lib/stores/notificationStore.d.ts +0 -1
- package/lib/stores/permissionStore.d.ts +0 -1
- package/lib/stores/personaStore.d.ts +0 -1
- package/lib/stores/postStore.d.ts +0 -1
- package/lib/stores/reactionStore.d.ts +0 -1
- package/lib/stores/subscriptionStore.d.ts +0 -1
- package/lib/stores/tagStore.d.ts +0 -1
- package/lib/stores/translationStore.d.ts +0 -1
- package/lib/stores/userStore.d.ts +2 -3
- package/lib/stores/userStore.js +7 -1
- package/lib/stores/videoStore.d.ts +0 -1
- package/lib/stores/websocketStore.d.ts +0 -1
- package/lib/types/apps.types.d.ts +0 -1
- package/lib/types/common.types.d.ts +0 -1
- package/lib/types/conversations.types.d.ts +0 -1
- package/lib/types/crm.types.d.ts +0 -1
- package/lib/types/edges.types.d.ts +0 -1
- package/lib/types/groups.types.d.ts +0 -1
- package/lib/types/index.d.ts +0 -1
- package/lib/types/subscriptions.types.d.ts +0 -1
- package/lib/types/videos.types.d.ts +0 -1
- package/lib/utils/{MetropolisProvider.d.ts → MetropolisContext.d.ts} +3 -15
- package/lib/utils/MetropolisContext.js +7 -0
- package/lib/utils/actionFactory.d.ts +2 -3
- package/lib/utils/actionFactory.js +2 -2
- package/lib/utils/api.d.ts +2 -2
- package/lib/utils/api.js +42 -18
- package/lib/utils/app.d.ts +0 -1
- package/lib/utils/baseActionFactory.d.ts +2 -3
- package/lib/utils/configUtils.d.ts +0 -1
- package/lib/utils/dateUtils.d.ts +0 -1
- package/lib/utils/file.d.ts +0 -1
- package/lib/utils/i18n.d.ts +0 -1
- package/lib/utils/index.d.ts +2 -3
- package/lib/utils/index.js +3 -3
- package/lib/utils/location.d.ts +1 -2
- package/lib/utils/permissionUtils.d.ts +0 -1
- package/lib/utils/requestCache.d.ts +1 -2
- package/lib/utils/session.d.ts +0 -1
- package/lib/utils/useConversationTyping.d.ts +0 -1
- package/lib/utils/useMetropolis.d.ts +2 -7
- package/lib/utils/useMetropolis.js +16 -30
- package/lib/utils/useTranslations.d.ts +0 -1
- package/lib/utils/useTranslations.js +4 -2
- package/lib/utils/validatorFactory.d.ts +1 -2
- package/package.json +7 -4
- package/tsconfig.test.json +4 -0
- package/lib/actions/appActions/appActions.d.ts.map +0 -1
- package/lib/actions/awsRumActions/awsRumActions.d.ts.map +0 -1
- package/lib/actions/connectionActions/connectionActions.d.ts.map +0 -1
- package/lib/actions/contentActions/contentActions.d.ts.map +0 -1
- package/lib/actions/conversationActions/conversationActions.d.ts.map +0 -1
- package/lib/actions/crmActions/crmActions.d.ts.map +0 -1
- package/lib/actions/eventActions/eventActions.d.ts.map +0 -1
- package/lib/actions/groupActions/groupActions.d.ts.map +0 -1
- package/lib/actions/imageActions/imageActions.d.ts.map +0 -1
- package/lib/actions/index.d.ts.map +0 -1
- package/lib/actions/locationActions/locationActions.d.ts.map +0 -1
- package/lib/actions/messageActions/messageActions.d.ts.map +0 -1
- package/lib/actions/permissionActions/permissionActions.d.ts.map +0 -1
- package/lib/actions/personaActions/personaActions.d.ts.map +0 -1
- package/lib/actions/postActions/postActions.d.ts.map +0 -1
- package/lib/actions/reactionActions/reactionActions.d.ts.map +0 -1
- package/lib/actions/restActions/restActions.d.ts.map +0 -1
- package/lib/actions/sseActions/sseActions.d.ts.map +0 -1
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +0 -1
- package/lib/actions/tagActions/tagActions.d.ts.map +0 -1
- package/lib/actions/translationActions/translationActions.d.ts.map +0 -1
- package/lib/actions/userActions/userActions.d.ts.map +0 -1
- package/lib/actions/videoActions/videoActions.d.ts.map +0 -1
- package/lib/actions/websocketActions/websocketActions.d.ts.map +0 -1
- package/lib/adapters/appAdapter/appAdapter.d.ts.map +0 -1
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +0 -1
- package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +0 -1
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +0 -1
- package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +0 -1
- package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +0 -1
- package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +0 -1
- package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +0 -1
- package/lib/adapters/index.d.ts.map +0 -1
- package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +0 -1
- package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +0 -1
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +0 -1
- package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +0 -1
- package/lib/adapters/postAdapter/postAdapter.d.ts.map +0 -1
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +0 -1
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +0 -1
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +0 -1
- package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +0 -1
- package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +0 -1
- package/lib/adapters/userAdapter/userAdapter.d.ts.map +0 -1
- package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +0 -1
- package/lib/config/index.d.ts.map +0 -1
- package/lib/constants/Collections.d.ts.map +0 -1
- package/lib/constants/MetropolisConstants.d.ts.map +0 -1
- package/lib/graphql/message.d.ts.map +0 -1
- package/lib/graphql/notification.d.ts.map +0 -1
- package/lib/graphql/session.d.ts.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/stores/appStore.d.ts.map +0 -1
- package/lib/stores/contentStore.d.ts.map +0 -1
- package/lib/stores/conversationStore.d.ts.map +0 -1
- package/lib/stores/eventStore.d.ts.map +0 -1
- package/lib/stores/groupStore.d.ts.map +0 -1
- package/lib/stores/imageStore.d.ts.map +0 -1
- package/lib/stores/index.d.ts.map +0 -1
- package/lib/stores/locationStore.d.ts.map +0 -1
- package/lib/stores/messageStore.d.ts.map +0 -1
- package/lib/stores/notificationStore.d.ts.map +0 -1
- package/lib/stores/permissionStore.d.ts.map +0 -1
- package/lib/stores/personaStore.d.ts.map +0 -1
- package/lib/stores/postStore.d.ts.map +0 -1
- package/lib/stores/reactionStore.d.ts.map +0 -1
- package/lib/stores/subscriptionStore.d.ts.map +0 -1
- package/lib/stores/tagStore.d.ts.map +0 -1
- package/lib/stores/translationStore.d.ts.map +0 -1
- package/lib/stores/userStore.d.ts.map +0 -1
- package/lib/stores/videoStore.d.ts.map +0 -1
- package/lib/stores/websocketStore.d.ts.map +0 -1
- package/lib/tests/actionTestScenarios.d.ts +0 -20
- package/lib/tests/actionTestScenarios.d.ts.map +0 -1
- package/lib/tests/actionTestScenarios.js +0 -851
- package/lib/tests/testGraphQLServer.d.ts +0 -22
- package/lib/tests/testGraphQLServer.d.ts.map +0 -1
- package/lib/tests/testGraphQLServer.js +0 -197
- package/lib/tests/testGraphQLServerSimple.d.ts +0 -3
- package/lib/tests/testGraphQLServerSimple.d.ts.map +0 -1
- package/lib/tests/testGraphQLServerSimple.js +0 -52
- package/lib/types/apps.types.d.ts.map +0 -1
- package/lib/types/common.types.d.ts.map +0 -1
- package/lib/types/conversations.types.d.ts.map +0 -1
- package/lib/types/crm.types.d.ts.map +0 -1
- package/lib/types/edges.types.d.ts.map +0 -1
- package/lib/types/groups.types.d.ts.map +0 -1
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/subscriptions.types.d.ts.map +0 -1
- package/lib/types/videos.types.d.ts.map +0 -1
- package/lib/utils/MetropolisProvider.d.ts.map +0 -1
- package/lib/utils/MetropolisProvider.js +0 -31
- package/lib/utils/actionFactory.d.ts.map +0 -1
- package/lib/utils/api.d.ts.map +0 -1
- package/lib/utils/app.d.ts.map +0 -1
- package/lib/utils/baseActionFactory.d.ts.map +0 -1
- package/lib/utils/configUtils.d.ts.map +0 -1
- package/lib/utils/dateUtils.d.ts.map +0 -1
- package/lib/utils/file.d.ts.map +0 -1
- package/lib/utils/i18n.d.ts.map +0 -1
- package/lib/utils/index.d.ts.map +0 -1
- package/lib/utils/location.d.ts.map +0 -1
- package/lib/utils/permissionUtils.d.ts.map +0 -1
- package/lib/utils/requestCache.d.ts.map +0 -1
- package/lib/utils/session.d.ts.map +0 -1
- package/lib/utils/useConversationTyping.d.ts.map +0 -1
- package/lib/utils/useMetropolis.d.ts.map +0 -1
- package/lib/utils/useTranslations.d.ts.map +0 -1
- package/lib/utils/validatorFactory.d.ts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,112 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 1.0.3
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- Added `resolveEnvironmentConfig()` utility for environment-specific config resolution
|
|
12
|
-
- Enhanced `MetropolisContext` with `config` and `flux` properties
|
|
13
|
-
- Created `useMetropolisConfig()` and `useMetropolisFlux()` hooks
|
|
14
|
-
- Configuration now available through React Context
|
|
15
|
-
- Global `Config` class still works for backward compatibility
|
|
16
|
-
|
|
17
|
-
**New Features:**
|
|
18
|
-
- `useMetropolisConfig()` - Access config from React context
|
|
19
|
-
- `useMetropolisFlux()` - Access flux instance from context
|
|
20
|
-
- `resolveEnvironmentConfig()` - Resolve environment-specific configuration
|
|
21
|
-
|
|
22
|
-
### Phase 2: Selective Action Creation & Specialized Hooks ✅
|
|
23
|
-
|
|
24
|
-
**Status:** Complete (Backward Compatible)
|
|
25
|
-
|
|
26
|
-
- Added selective action creation: `useMetropolis(['user', 'post'])`
|
|
27
|
-
- Created 12 specialized hooks for individual action types
|
|
28
|
-
- Improved type safety by removing `as any` casts
|
|
29
|
-
- Better performance through selective action creation
|
|
30
|
-
|
|
31
|
-
**New Features:**
|
|
32
|
-
- `useUserActions()` - User management actions only
|
|
33
|
-
- `usePostActions()` - Post management actions only
|
|
34
|
-
- `useMessageActions()` - Messaging actions only
|
|
35
|
-
- `useEventActions()` - Event management actions only
|
|
36
|
-
- `useImageActions()` - Image handling actions only
|
|
37
|
-
- `useLocationActions()` - Location services actions only
|
|
38
|
-
- `useReactionActions()` - Reaction actions only
|
|
39
|
-
- `useTagActions()` - Tag management actions only
|
|
40
|
-
- `useContentActions()` - Content management actions only
|
|
41
|
-
- `usePersonaActions()` - Persona management actions only
|
|
42
|
-
- `useTranslationActions()` - Translation actions only
|
|
43
|
-
- `useWebsocketActions()` - WebSocket actions only
|
|
44
|
-
- Selective creation: `useMetropolis(['user', 'post'])`
|
|
45
|
-
|
|
46
|
-
**Performance Improvements:**
|
|
47
|
-
- Only creates actions you need
|
|
48
|
-
- Better tree-shaking opportunities
|
|
49
|
-
- More efficient memoization
|
|
50
|
-
|
|
51
|
-
### Phase 3: Remove Global Config Singleton ✅
|
|
52
|
-
|
|
53
|
-
**Status:** Complete (Breaking Changes)
|
|
54
|
-
|
|
55
|
-
- Removed global `Config.set()` from Metropolis component
|
|
56
|
-
- Config now stored in flux state (`app.config`)
|
|
57
|
-
- Created `getConfigFromFlux()` utility for non-React code
|
|
58
|
-
- Deprecated `Config.get()` and `Config.set()` with warnings
|
|
59
|
-
- `useMetropolisConfig()` now requires Metropolis context
|
|
60
|
-
|
|
61
|
-
**Breaking Changes:**
|
|
62
|
-
- `useMetropolisConfig()` throws error if used outside Metropolis component
|
|
63
|
-
- `Config.get()` and `Config.set()` are deprecated (show warnings)
|
|
64
|
-
- Configuration must be passed to `<Metropolis>` component
|
|
65
|
-
|
|
66
|
-
**Migration Required:**
|
|
67
|
-
- React components: Use `useMetropolisConfig()` instead of `Config.get()`
|
|
68
|
-
- Non-React code: Use `getConfigFromFlux(flux)` instead of `Config.get()`
|
|
69
|
-
- Ensure components are wrapped with `<Metropolis>` provider
|
|
70
|
-
|
|
71
|
-
## Summary of Changes
|
|
72
|
-
|
|
73
|
-
### New Hooks
|
|
74
|
-
|
|
75
|
-
1. **Configuration Hooks:**
|
|
76
|
-
- `useMetropolisConfig()` - Get configuration from context
|
|
77
|
-
- `useMetropolisFlux()` - Get flux instance from context
|
|
78
|
-
|
|
79
|
-
2. **Specialized Action Hooks:**
|
|
80
|
-
- `useUserActions()`
|
|
81
|
-
- `usePostActions()`
|
|
82
|
-
- `useMessageActions()`
|
|
83
|
-
- `useEventActions()`
|
|
84
|
-
- `useImageActions()`
|
|
85
|
-
- `useLocationActions()`
|
|
86
|
-
- `useReactionActions()`
|
|
87
|
-
- `useTagActions()`
|
|
88
|
-
- `useContentActions()`
|
|
89
|
-
- `usePersonaActions()`
|
|
90
|
-
- `useTranslationActions()`
|
|
91
|
-
- `useWebsocketActions()`
|
|
92
|
-
|
|
93
|
-
### Enhanced Features
|
|
94
|
-
|
|
95
|
-
- **Selective Action Creation:** `useMetropolis(['user', 'post'])`
|
|
96
|
-
- **Context-Based Configuration:** No global state
|
|
97
|
-
- **Type Safety:** Removed `as any` casts
|
|
98
|
-
- **Better Performance:** Only create needed actions
|
|
99
|
-
|
|
100
|
-
### Deprecated APIs
|
|
101
|
-
|
|
102
|
-
- `Config.get()` - Use `useMetropolisConfig()` or `getConfigFromFlux(flux)`
|
|
103
|
-
- `Config.set()` - Pass config to `<Metropolis>` component
|
|
104
|
-
|
|
105
|
-
### New Utilities
|
|
106
|
-
|
|
107
|
-
- `getConfigFromFlux(flux)` - Get config from flux state (for non-React code)
|
|
108
|
-
- `resolveEnvironmentConfig(config)` - Resolve environment-specific config
|
|
109
|
-
|
|
110
|
-
## Migration Guide
|
|
111
|
-
|
|
112
|
-
See the [README.md](./README.md) for detailed migration examples and usage patterns.
|
|
5
|
+
- Send the public RUM `analyticsId` to Reaktor in the JSON mutation payload.
|
|
6
|
+
- Use `app.rum.analyticsId` as the RUM configuration field.
|
|
7
|
+
- Require explicit action selection when using `useMetropolis(actionTypes)`.
|
|
8
|
+
- Require hooks to run within the `<Metropolis>` context.
|
|
9
|
+
- Remove obsolete parser aliases, action aliases, and response handling.
|
package/README.md
CHANGED
|
@@ -101,8 +101,8 @@ const restActions = useRestActions();
|
|
|
101
101
|
// Option 2: Selective creation
|
|
102
102
|
const {userActions, postActions, restActions} = useMetropolis(['user', 'post', 'rest']);
|
|
103
103
|
|
|
104
|
-
// Option 3:
|
|
105
|
-
const {
|
|
104
|
+
// Option 3: Create an explicit action group
|
|
105
|
+
const {messageActions} = useMetropolis(['message']);
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
### External REST Endpoints
|
|
@@ -153,6 +153,29 @@ const profile = await restActions.request(
|
|
|
153
153
|
|
|
154
154
|
The `Metropolis` component accepts three main props: `config`, `adapters`, and `translations`. Here's how to configure each:
|
|
155
155
|
|
|
156
|
+
### RUM analytics
|
|
157
|
+
|
|
158
|
+
Configure the public analytics identifier returned by Reaktor under `app.rum.analyticsId`. MetropolisJS sends it in the JSON `RumBatchInput.analyticsId` field; it is not placed in a URL or request header.
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
<Metropolis
|
|
162
|
+
config={{
|
|
163
|
+
production: {
|
|
164
|
+
app: {
|
|
165
|
+
name: 'My App',
|
|
166
|
+
rum: {
|
|
167
|
+
analyticsId: '00000000-0000-4000-8000-000000000000',
|
|
168
|
+
enabled: true
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}}>
|
|
173
|
+
<YourApp />
|
|
174
|
+
</Metropolis>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
`app.rum.analyticsId` is the identifier sent with each analytics batch.
|
|
178
|
+
|
|
156
179
|
### Configuration Object
|
|
157
180
|
|
|
158
181
|
The `config` prop accepts a `MetropolisConfiguration` object that supports environment-specific settings:
|
|
@@ -487,7 +510,7 @@ MetropolisJS follows React best practices:
|
|
|
487
510
|
|
|
488
511
|
## Available Actions
|
|
489
512
|
|
|
490
|
-
MetropolisJS provides comprehensive actions for all your needs. Access them using specialized hooks or
|
|
513
|
+
MetropolisJS provides comprehensive actions for all your needs. Access them using specialized hooks or `useMetropolis(actionTypes)`:
|
|
491
514
|
|
|
492
515
|
### Specialized Hooks (Recommended)
|
|
493
516
|
|
|
@@ -516,13 +539,13 @@ const permissionActions = usePermissionActions();
|
|
|
516
539
|
// Alternative: Selective creation
|
|
517
540
|
const {userActions, postActions, permissionActions} = useMetropolis(['user', 'post', 'permission']);
|
|
518
541
|
|
|
519
|
-
//
|
|
520
|
-
const {
|
|
542
|
+
// Create every action you use explicitly
|
|
543
|
+
const {messageActions, permissionActions} = useMetropolis(['message', 'permission']);
|
|
521
544
|
```
|
|
522
545
|
|
|
523
546
|
## Factory Pattern Guide
|
|
524
547
|
|
|
525
|
-
MetropolisJS
|
|
548
|
+
MetropolisJS uses a **factory function pattern** for actions. This provides functional composition, straightforward testing, and dependency injection.
|
|
526
549
|
|
|
527
550
|
### Key Benefits
|
|
528
551
|
|
|
@@ -530,21 +553,8 @@ MetropolisJS has been refactored to use a **factory function pattern** for actio
|
|
|
530
553
|
2. **Better Testability**: Easier to mock and test individual functions
|
|
531
554
|
3. **Composability**: Actions can be easily combined and extended
|
|
532
555
|
4. **Dependency Injection**: Custom adapters can be injected and merged with defaults
|
|
533
|
-
5. **Backward Compatibility**: Legacy class wrappers maintain existing API compatibility
|
|
534
|
-
|
|
535
556
|
### Basic Usage
|
|
536
557
|
|
|
537
|
-
#### Before (Class-based)
|
|
538
|
-
|
|
539
|
-
```typescript
|
|
540
|
-
import {userActions} from '../actions/userActions';
|
|
541
|
-
|
|
542
|
-
const userActions = new userActions(flux);
|
|
543
|
-
const user = await userActions.add(userData);
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
#### After (Factory Pattern)
|
|
547
|
-
|
|
548
558
|
```typescript
|
|
549
559
|
import {createUserActions} from '../actions/userActions';
|
|
550
560
|
|
|
@@ -775,7 +785,7 @@ describe('useUserActions', () => {
|
|
|
775
785
|
|
|
776
786
|
### Best Practices
|
|
777
787
|
|
|
778
|
-
1. **Use Specialized Hooks**: Prefer `useUserActions()` over `useMetropolis()` when you only need one action type
|
|
788
|
+
1. **Use Specialized Hooks**: Prefer `useUserActions()` over `useMetropolis(['user'])` when you only need one action type
|
|
779
789
|
2. **Selective Creation**: Use `useMetropolis(['user', 'post'])` when you need multiple specific actions
|
|
780
790
|
3. **Context-Based Config**: Use `useMetropolisConfig()` for accessing configuration
|
|
781
791
|
4. **Leverage Adapter Injection**: Pass custom adapters through the `Metropolis` component
|
|
@@ -1077,9 +1087,9 @@ const ResourceProtectedComponent = () => {
|
|
|
1077
1087
|
};
|
|
1078
1088
|
```
|
|
1079
1089
|
|
|
1080
|
-
###
|
|
1090
|
+
### Permission Levels
|
|
1081
1091
|
|
|
1082
|
-
The
|
|
1092
|
+
The `userAccess` field uses the numeric `PermissionLevel` values from 0 through 4.
|
|
1083
1093
|
|
|
1084
1094
|
### Available Permission Actions
|
|
1085
1095
|
|
|
@@ -102,7 +102,7 @@ import React, { useEffect, useState } from 'react';
|
|
|
102
102
|
import { useMetropolis } from '@nlabs/metropolisjs';
|
|
103
103
|
|
|
104
104
|
const WelcomeComponent = () => {
|
|
105
|
-
const { contentActions } = useMetropolis();
|
|
105
|
+
const { contentActions } = useMetropolis(['content']);
|
|
106
106
|
const [welcomeMessage, setWelcomeMessage] = useState('Loading...');
|
|
107
107
|
const [isLoading, setIsLoading] = useState(true);
|
|
108
108
|
const [error, setError] = useState(null);
|
|
@@ -141,4 +141,3 @@ export {
|
|
|
141
141
|
addContentExample, deleteContentExample, getContentByCategoryExample, getContentByKeyExample,
|
|
142
142
|
updateContentExample
|
|
143
143
|
};
|
|
144
|
-
|
|
@@ -268,21 +268,3 @@ export const allActionsExample = (flux: FluxFramework) => {
|
|
|
268
268
|
|
|
269
269
|
return { allActions, comprehensiveWorkflow };
|
|
270
270
|
};
|
|
271
|
-
|
|
272
|
-
// Example 9: Migration from Old Pattern
|
|
273
|
-
export const migrationExample = (flux: FluxFramework) => {
|
|
274
|
-
// New way (recommended)
|
|
275
|
-
const userActions = createAction('user', flux) as any;
|
|
276
|
-
const postActions = createAction('post', flux) as any;
|
|
277
|
-
const eventActions = createAction('event', flux) as any;
|
|
278
|
-
|
|
279
|
-
const createUser = async (userData: any) => {
|
|
280
|
-
return await userActions.add(userData);
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
const createPost = async (postData: any) => {
|
|
284
|
-
return await postActions.add(postData);
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
return { createUser, createPost };
|
|
288
|
-
};
|
|
@@ -19,7 +19,7 @@ export interface AwsRumEvent extends AwsRumTrackInput {
|
|
|
19
19
|
readonly timestamp: number;
|
|
20
20
|
}
|
|
21
21
|
export interface AwsRumActionsOptions {
|
|
22
|
-
readonly
|
|
22
|
+
readonly analyticsId?: string;
|
|
23
23
|
readonly debounceMs?: number;
|
|
24
24
|
readonly dedupeMs?: number;
|
|
25
25
|
readonly enabled?: boolean;
|
|
@@ -32,4 +32,3 @@ export interface AwsRumActions {
|
|
|
32
32
|
readonly track: (event: AwsRumTrackInput) => void;
|
|
33
33
|
}
|
|
34
34
|
export declare const createAwsRumActions: (flux: FluxFramework, options?: AwsRumActionsOptions) => AwsRumActions;
|
|
35
|
-
//# sourceMappingURL=awsRumActions.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2026-Present, Nitrogen Labs, Inc.
|
|
3
3
|
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
-
*/ import {
|
|
4
|
+
*/ import { rumRequest } from '../../utils/api.js';
|
|
5
5
|
export const AWS_RUM_CONSTANTS = {
|
|
6
6
|
TRACK_ERROR: 'AWS_RUM_TRACK_ERROR',
|
|
7
7
|
TRACK_QUEUED: 'AWS_RUM_TRACK_QUEUED',
|
|
@@ -13,6 +13,26 @@ const DEFAULT_THROTTLE_MS = 1000;
|
|
|
13
13
|
const MAX_BATCH_SIZE = 50;
|
|
14
14
|
const MAX_PROPERTIES = 20;
|
|
15
15
|
const MAX_SEEN_EVENTS = 500;
|
|
16
|
+
const BLOCKED_PROPERTY_KEYS = new Set([
|
|
17
|
+
'accountid',
|
|
18
|
+
'address',
|
|
19
|
+
'email',
|
|
20
|
+
'firstname',
|
|
21
|
+
'fullname',
|
|
22
|
+
'geolocation',
|
|
23
|
+
'ip',
|
|
24
|
+
'ipaddress',
|
|
25
|
+
'lastname',
|
|
26
|
+
'latitude',
|
|
27
|
+
'longitude',
|
|
28
|
+
'name',
|
|
29
|
+
'phone',
|
|
30
|
+
'referrer',
|
|
31
|
+
'token',
|
|
32
|
+
'useragent',
|
|
33
|
+
'userid'
|
|
34
|
+
]);
|
|
35
|
+
const EMAIL_PATTERN = /\b[^\s@]+@[^\s@]+\.[^\s@]+\b/i;
|
|
16
36
|
const createId = ()=>{
|
|
17
37
|
if (typeof globalThis.crypto?.randomUUID === 'function') {
|
|
18
38
|
return globalThis.crypto.randomUUID();
|
|
@@ -20,16 +40,25 @@ const createId = ()=>{
|
|
|
20
40
|
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
21
41
|
};
|
|
22
42
|
const normalizeText = (value, maxLength)=>String(value || '').trim().slice(0, maxLength);
|
|
43
|
+
const normalizePropertyKey = (value)=>value.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
23
44
|
const sanitizeProperties = (properties = {})=>Object.entries(properties).slice(0, MAX_PROPERTIES).reduce((result, [key, value])=>{
|
|
24
45
|
const propertyKey = normalizeText(key, 64);
|
|
25
|
-
|
|
46
|
+
const normalizedPropertyKey = normalizePropertyKey(propertyKey);
|
|
47
|
+
if (!propertyKey || BLOCKED_PROPERTY_KEYS.has(normalizedPropertyKey) || ![
|
|
26
48
|
'boolean',
|
|
27
49
|
'number',
|
|
28
50
|
'string'
|
|
29
51
|
].includes(typeof value)) {
|
|
30
52
|
return result;
|
|
31
53
|
}
|
|
32
|
-
|
|
54
|
+
if (typeof value === 'string') {
|
|
55
|
+
const textValue = normalizeText(value, 256);
|
|
56
|
+
if (textValue && !EMAIL_PATTERN.test(textValue)) {
|
|
57
|
+
result[propertyKey] = textValue;
|
|
58
|
+
}
|
|
59
|
+
} else if (typeof value === 'boolean' || Number.isFinite(value)) {
|
|
60
|
+
result[propertyKey] = value;
|
|
61
|
+
}
|
|
33
62
|
return result;
|
|
34
63
|
}, {});
|
|
35
64
|
const sanitizeEvent = (event)=>{
|
|
@@ -58,7 +87,7 @@ const eventFingerprint = (event)=>{
|
|
|
58
87
|
]);
|
|
59
88
|
};
|
|
60
89
|
export const createAwsRumActions = (flux, options = {})=>{
|
|
61
|
-
const
|
|
90
|
+
const analyticsId = normalizeText(options.analyticsId, 128);
|
|
62
91
|
const debounceMs = Math.max(0, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
|
|
63
92
|
const dedupeMs = Math.max(0, options.dedupeMs ?? DEFAULT_DEDUPE_MS);
|
|
64
93
|
const enabled = options.enabled !== false;
|
|
@@ -100,7 +129,7 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
100
129
|
if (flushPromise) {
|
|
101
130
|
return flushPromise;
|
|
102
131
|
}
|
|
103
|
-
if (!enabled || !
|
|
132
|
+
if (!enabled || !analyticsId || hasPrivacySignal() || pendingEvents.size === 0) {
|
|
104
133
|
return;
|
|
105
134
|
}
|
|
106
135
|
if (timer) {
|
|
@@ -116,27 +145,19 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
116
145
|
for(let index = 0; index < events.length; index += MAX_BATCH_SIZE){
|
|
117
146
|
const batchEvents = events.slice(index, index + MAX_BATCH_SIZE);
|
|
118
147
|
try {
|
|
119
|
-
await
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
appId,
|
|
124
|
-
events: batchEvents
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}, [
|
|
128
|
-
'accepted',
|
|
129
|
-
'appId'
|
|
130
|
-
]);
|
|
148
|
+
await rumRequest(flux, {
|
|
149
|
+
analyticsId,
|
|
150
|
+
events: batchEvents
|
|
151
|
+
});
|
|
131
152
|
await flux.dispatch({
|
|
132
|
-
|
|
153
|
+
analyticsId,
|
|
133
154
|
events: batchEvents,
|
|
134
155
|
type: AWS_RUM_CONSTANTS.TRACK_SUCCESS
|
|
135
156
|
});
|
|
136
157
|
} catch (error) {
|
|
137
158
|
events.slice(index).forEach((event)=>pendingEvents.set(eventFingerprint(event), event));
|
|
138
159
|
await flux.dispatch({
|
|
139
|
-
|
|
160
|
+
analyticsId,
|
|
140
161
|
error,
|
|
141
162
|
events: batchEvents,
|
|
142
163
|
type: AWS_RUM_CONSTANTS.TRACK_ERROR
|
|
@@ -157,7 +178,7 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
157
178
|
timer = setTimeout(()=>void flush(), Math.max(debounceMs, throttleRemaining));
|
|
158
179
|
};
|
|
159
180
|
const track = (input)=>{
|
|
160
|
-
if (!enabled || !
|
|
181
|
+
if (!enabled || !analyticsId || hasPrivacySignal()) {
|
|
161
182
|
return;
|
|
162
183
|
}
|
|
163
184
|
const event = sanitizeEvent(input);
|
|
@@ -182,7 +203,7 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
182
203
|
};
|
|
183
204
|
pendingEvents.set(fingerprint, queuedEvent);
|
|
184
205
|
void flux.dispatch({
|
|
185
|
-
|
|
206
|
+
analyticsId,
|
|
186
207
|
event: queuedEvent,
|
|
187
208
|
type: AWS_RUM_CONSTANTS.TRACK_QUEUED
|
|
188
209
|
});
|
|
@@ -203,4 +224,4 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
203
224
|
};
|
|
204
225
|
};
|
|
205
226
|
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hd3NSdW1BY3Rpb25zL2F3c1J1bUFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cnVtTXV0YXRpb259IGZyb20gJy4uLy4uL3V0aWxzL2FwaS5qcyc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuXG5leHBvcnQgY29uc3QgQVdTX1JVTV9DT05TVEFOVFMgPSB7XG4gIFRSQUNLX0VSUk9SOiAnQVdTX1JVTV9UUkFDS19FUlJPUicsXG4gIFRSQUNLX1FVRVVFRDogJ0FXU19SVU1fVFJBQ0tfUVVFVUVEJyxcbiAgVFJBQ0tfU1VDQ0VTUzogJ0FXU19SVU1fVFJBQ0tfU1VDQ0VTUydcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEF3c1J1bUV2ZW50VHlwZSA9ICdjbGljaycgfCAncGFnZV92aWV3JyB8IChzdHJpbmcgJiB7fSk7XG5leHBvcnQgdHlwZSBBd3NSdW1Qcm9wZXJ0eSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtVHJhY2tJbnB1dCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIEF3c1J1bVByb3BlcnR5PjtcbiAgcmVhZG9ubHkgdHlwZTogQXdzUnVtRXZlbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUV2ZW50IGV4dGVuZHMgQXdzUnVtVHJhY2tJbnB1dCB7XG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgam91cm5leUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUFjdGlvbnNPcHRpb25zIHtcbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYm91bmNlTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGRlZHVwZU1zPzogbnVtYmVyO1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVzcGVjdFByaXZhY3lTaWduYWxzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGhyb3R0bGVNcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBd3NSdW1BY3Rpb25zIHtcbiAgcmVhZG9ubHkgZGVzdHJveTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVhZG9ubHkgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHJlYWRvbmx5IHRyYWNrOiAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpID0+IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfREVCT1VOQ0VfTVMgPSAyNTA7XG5jb25zdCBERUZBVUxUX0RFRFVQRV9NUyA9IDEwMDA7XG5jb25zdCBERUZBVUxUX1RIUk9UVExFX01TID0gMTAwMDtcbmNvbnN0IE1BWF9CQVRDSF9TSVpFID0gNTA7XG5jb25zdCBNQVhfUFJPUEVSVElFUyA9IDIwO1xuY29uc3QgTUFYX1NFRU5fRVZFTlRTID0gNTAwO1xuXG5pbnRlcmZhY2UgUHJpdmFjeU5hdmlnYXRvciBleHRlbmRzIE5hdmlnYXRvciB7XG4gIHJlYWRvbmx5IGdsb2JhbFByaXZhY3lDb250cm9sPzogYm9vbGVhbjtcbn1cblxuY29uc3QgY3JlYXRlSWQgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvPy5yYW5kb21VVUlEID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIHJldHVybiBgJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gO1xufTtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9ICh2YWx1ZTogdW5rbm93biwgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcgPT5cbiAgU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCkuc2xpY2UoMCwgbWF4TGVuZ3RoKTtcblxuY29uc3Qgc2FuaXRpemVQcm9wZXJ0aWVzID0gKFxuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4gPSB7fVxuKTogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+ID0+IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpXG4gIC5zbGljZSgwLCBNQVhfUFJPUEVSVElFUylcbiAgLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4+KChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnR5S2V5ID0gbm9ybWFsaXplVGV4dChrZXksIDY0KTtcblxuICAgIGlmKCFwcm9wZXJ0eUtleSB8fCAhWydib29sZWFuJywgJ251bWJlcicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdFtwcm9wZXJ0eUtleV0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbm9ybWFsaXplVGV4dCh2YWx1ZSwgMjU2KSA6IHZhbHVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcblxuY29uc3Qgc2FuaXRpemVFdmVudCA9IChldmVudDogQXdzUnVtVHJhY2tJbnB1dCk6IEF3c1J1bVRyYWNrSW5wdXQgfCBudWxsID0+IHtcbiAgY29uc3QgbmFtZSA9IG5vcm1hbGl6ZVRleHQoZXZlbnQubmFtZSwgMTI4KTtcbiAgY29uc3QgdHlwZSA9IG5vcm1hbGl6ZVRleHQoZXZlbnQudHlwZSwgNjQpO1xuXG4gIGlmKCFuYW1lIHx8ICF0eXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXRoID0gbm9ybWFsaXplVGV4dChldmVudC5wYXRoLCAyNTYpLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgLi4uKHBhdGggPyB7cGF0aH0gOiB7fSksXG4gICAgcHJvcGVydGllczogc2FuaXRpemVQcm9wZXJ0aWVzKGV2ZW50LnByb3BlcnRpZXMpLFxuICAgIHR5cGVcbiAgfTtcbn07XG5cbmNvbnN0IGV2ZW50RmluZ2VycHJpbnQgPSAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoZXZlbnQucHJvcGVydGllcyB8fCB7fSkuc29ydCgoW2xlZnRdLCBbcmlnaHRdKSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtldmVudC50eXBlLCBldmVudC5uYW1lLCBldmVudC5wYXRoIHx8ICcnLCBwcm9wZXJ0aWVzXSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQXdzUnVtQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9uczogQXdzUnVtQWN0aW9uc09wdGlvbnMgPSB7fVxuKTogQXdzUnVtQWN0aW9ucyA9PiB7XG4gIGNvbnN0IGFwcElkID0gbm9ybWFsaXplVGV4dChvcHRpb25zLmFwcElkLCAxMjgpO1xuICBjb25zdCBkZWJvdW5jZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5kZWJvdW5jZU1zID8/IERFRkFVTFRfREVCT1VOQ0VfTVMpO1xuICBjb25zdCBkZWR1cGVNcyA9IE1hdGgubWF4KDAsIG9wdGlvbnMuZGVkdXBlTXMgPz8gREVGQVVMVF9ERURVUEVfTVMpO1xuICBjb25zdCBlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZTtcbiAgY29uc3QgcmVzcGVjdFByaXZhY3lTaWduYWxzID0gb3B0aW9ucy5yZXNwZWN0UHJpdmFjeVNpZ25hbHMgIT09IGZhbHNlO1xuICBjb25zdCB0aHJvdHRsZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy50aHJvdHRsZU1zID8/IERFRkFVTFRfVEhST1RUTEVfTVMpO1xuICBjb25zdCBqb3VybmV5SWQgPSBjcmVhdGVJZCgpO1xuICBjb25zdCBwZW5kaW5nRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIEF3c1J1bUV2ZW50PigpO1xuICBjb25zdCBzZWVuRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgbGV0IGZsdXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RGbHVzaEF0ID0gMDtcbiAgbGV0IHNlcXVlbmNlID0gMDtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBoYXNQcml2YWN5U2lnbmFsID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmKCFyZXNwZWN0UHJpdmFjeVNpZ25hbHMgfHwgdHlwZW9mIGdsb2JhbFRoaXMubmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlnYXRvclN0YXRlID0gZ2xvYmFsVGhpcy5uYXZpZ2F0b3IgYXMgUHJpdmFjeU5hdmlnYXRvcjtcblxuICAgIHJldHVybiBuYXZpZ2F0b3JTdGF0ZS5kb05vdFRyYWNrID09PSAnMScgfHwgbmF2aWdhdG9yU3RhdGUuZ2xvYmFsUHJpdmFjeUNvbnRyb2wgPT09IHRydWU7XG4gIH07XG5cbiAgY29uc3QgcHJ1bmVTZWVuRXZlbnRzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmKHNlZW5FdmVudHMuc2l6ZSA8PSBNQVhfU0VFTl9FVkVOVFMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gZGVkdXBlTXM7XG4gICAgc2VlbkV2ZW50cy5mb3JFYWNoKCh0aW1lc3RhbXAsIGZpbmdlcnByaW50KSA9PiB7XG4gICAgICBpZih0aW1lc3RhbXAgPCBjdXRvZmYpIHtcbiAgICAgICAgc2VlbkV2ZW50cy5kZWxldGUoZmluZ2VycHJpbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd2hpbGUoc2VlbkV2ZW50cy5zaXplID4gTUFYX1NFRU5fRVZFTlRTKSB7XG4gICAgICBjb25zdCBvbGRlc3RGaW5nZXJwcmludCA9IHNlZW5FdmVudHMua2V5cygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYoIW9sZGVzdEZpbmdlcnByaW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzZWVuRXZlbnRzLmRlbGV0ZShvbGRlc3RGaW5nZXJwcmludCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmKGZsdXNoUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGZsdXNoUHJvbWlzZTtcbiAgICB9XG5cbiAgICBpZighZW5hYmxlZCB8fCAhYXBwSWQgfHwgaGFzUHJpdmFjeVNpZ25hbCgpIHx8IHBlbmRpbmdFdmVudHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRzID0gWy4uLnBlbmRpbmdFdmVudHMudmFsdWVzKCldO1xuICAgIHBlbmRpbmdFdmVudHMuY2xlYXIoKTtcbiAgICBsYXN0Rmx1c2hBdCA9IERhdGUubm93KCk7XG5cbiAgICBmbHVzaFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXZlbnRzLmxlbmd0aDsgaW5kZXggKz0gTUFYX0JBVENIX1NJWkUpIHtcbiAgICAgICAgY29uc3QgYmF0Y2hFdmVudHMgPSBldmVudHMuc2xpY2UoaW5kZXgsIGluZGV4ICsgTUFYX0JBVENIX1NJWkUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnVtTXV0YXRpb24oZmx1eCwgJ3RyYWNrJywgJ3J1bScsIHtcbiAgICAgICAgICAgIGJhdGNoOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdSdW1CYXRjaElucHV0IScsXG4gICAgICAgICAgICAgIHZhbHVlOiB7YXBwSWQsIGV2ZW50czogYmF0Y2hFdmVudHN9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgWydhY2NlcHRlZCcsICdhcHBJZCddKTtcbiAgICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHthcHBJZCwgZXZlbnRzOiBiYXRjaEV2ZW50cywgdHlwZTogQVdTX1JVTV9DT05TVEFOVFMuVFJBQ0tfU1VDQ0VTU30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgZXZlbnRzLnNsaWNlKGluZGV4KS5mb3JFYWNoKChldmVudCkgPT4gcGVuZGluZ0V2ZW50cy5zZXQoZXZlbnRGaW5nZXJwcmludChldmVudCksIGV2ZW50KSk7XG4gICAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7YXBwSWQsIGVycm9yLCBldmVudHM6IGJhdGNoRXZlbnRzLCB0eXBlOiBBV1NfUlVNX0NPTlNUQU5UUy5UUkFDS19FUlJPUn0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKClcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgZmx1c2hQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gZmx1c2hQcm9taXNlO1xuICB9O1xuXG4gIGNvbnN0IHNjaGVkdWxlRmx1c2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3R0bGVSZW1haW5pbmcgPSBNYXRoLm1heCgwLCB0aHJvdHRsZU1zIC0gKERhdGUubm93KCkgLSBsYXN0Rmx1c2hBdCkpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIGZsdXNoKCksIE1hdGgubWF4KGRlYm91bmNlTXMsIHRocm90dGxlUmVtYWluaW5nKSk7XG4gIH07XG5cbiAgY29uc3QgdHJhY2sgPSAoaW5wdXQ6IEF3c1J1bVRyYWNrSW5wdXQpOiB2b2lkID0+IHtcbiAgICBpZighZW5hYmxlZCB8fCAhYXBwSWQgfHwgaGFzUHJpdmFjeVNpZ25hbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSBzYW5pdGl6ZUV2ZW50KGlucHV0KTtcblxuICAgIGlmKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmdlcnByaW50ID0gZXZlbnRGaW5nZXJwcmludChldmVudCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VlbkF0ID0gc2VlbkV2ZW50cy5nZXQoZmluZ2VycHJpbnQpIHx8IDA7XG5cbiAgICBpZihzZWVuRXZlbnRzLmhhcyhmaW5nZXJwcmludCkgJiYgbm93IC0gbGFzdFNlZW5BdCA8IGRlZHVwZU1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VlbkV2ZW50cy5zZXQoZmluZ2VycHJpbnQsIG5vdyk7XG4gICAgcHJ1bmVTZWVuRXZlbnRzKCk7XG4gICAgc2VxdWVuY2UgKz0gMTtcblxuICAgIGNvbnN0IHF1ZXVlZEV2ZW50OiBBd3NSdW1FdmVudCA9IHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgZXZlbnRJZDogY3JlYXRlSWQoKSxcbiAgICAgIGpvdXJuZXlJZCxcbiAgICAgIHNlcXVlbmNlLFxuICAgICAgdGltZXN0YW1wOiBub3dcbiAgICB9O1xuXG4gICAgcGVuZGluZ0V2ZW50cy5zZXQoZmluZ2VycHJpbnQsIHF1ZXVlZEV2ZW50KTtcbiAgICB2b2lkIGZsdXguZGlzcGF0Y2goe2FwcElkLCBldmVudDogcXVldWVkRXZlbnQsIHR5cGU6IEFXU19SVU1fQ09OU1RBTlRTLlRSQUNLX1FVRVVFRH0pO1xuICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgfTtcblxuICBjb25zdCBkZXN0cm95ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYXdhaXQgZmx1c2goKTtcbiAgICBzZWVuRXZlbnRzLmNsZWFyKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtkZXN0cm95LCBmbHVzaCwgdHJhY2t9O1xufTtcbiJdLCJuYW1lcyI6WyJydW1NdXRhdGlvbiIsIkFXU19SVU1fQ09OU1RBTlRTIiwiVFJBQ0tfRVJST1IiLCJUUkFDS19RVUVVRUQiLCJUUkFDS19TVUNDRVNTIiwiREVGQVVMVF9ERUJPVU5DRV9NUyIsIkRFRkFVTFRfREVEVVBFX01TIiwiREVGQVVMVF9USFJPVFRMRV9NUyIsIk1BWF9CQVRDSF9TSVpFIiwiTUFYX1BST1BFUlRJRVMiLCJNQVhfU0VFTl9FVkVOVFMiLCJjcmVhdGVJZCIsImdsb2JhbFRoaXMiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiTWF0aCIsInJhbmRvbSIsInNsaWNlIiwibm9ybWFsaXplVGV4dCIsInZhbHVlIiwibWF4TGVuZ3RoIiwiU3RyaW5nIiwidHJpbSIsInNhbml0aXplUHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwicmVzdWx0Iiwia2V5IiwicHJvcGVydHlLZXkiLCJpbmNsdWRlcyIsInNhbml0aXplRXZlbnQiLCJldmVudCIsIm5hbWUiLCJ0eXBlIiwicGF0aCIsInNwbGl0IiwiZXZlbnRGaW5nZXJwcmludCIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJsb2NhbGVDb21wYXJlIiwiSlNPTiIsInN0cmluZ2lmeSIsImNyZWF0ZUF3c1J1bUFjdGlvbnMiLCJmbHV4Iiwib3B0aW9ucyIsImFwcElkIiwiZGVib3VuY2VNcyIsIm1heCIsImRlZHVwZU1zIiwiZW5hYmxlZCIsInJlc3BlY3RQcml2YWN5U2lnbmFscyIsInRocm90dGxlTXMiLCJqb3VybmV5SWQiLCJwZW5kaW5nRXZlbnRzIiwiTWFwIiwic2VlbkV2ZW50cyIsImZsdXNoUHJvbWlzZSIsImxhc3RGbHVzaEF0Iiwic2VxdWVuY2UiLCJ0aW1lciIsImhhc1ByaXZhY3lTaWduYWwiLCJuYXZpZ2F0b3IiLCJuYXZpZ2F0b3JTdGF0ZSIsImRvTm90VHJhY2siLCJnbG9iYWxQcml2YWN5Q29udHJvbCIsInBydW5lU2VlbkV2ZW50cyIsInNpemUiLCJjdXRvZmYiLCJmb3JFYWNoIiwidGltZXN0YW1wIiwiZmluZ2VycHJpbnQiLCJkZWxldGUiLCJvbGRlc3RGaW5nZXJwcmludCIsImtleXMiLCJuZXh0IiwiZmx1c2giLCJjbGVhclRpbWVvdXQiLCJ1bmRlZmluZWQiLCJldmVudHMiLCJ2YWx1ZXMiLCJjbGVhciIsImluZGV4IiwibGVuZ3RoIiwiYmF0Y2hFdmVudHMiLCJiYXRjaCIsImRpc3BhdGNoIiwiZXJyb3IiLCJzZXQiLCJmaW5hbGx5Iiwic2NoZWR1bGVGbHVzaCIsInRocm90dGxlUmVtYWluaW5nIiwic2V0VGltZW91dCIsInRyYWNrIiwiaW5wdXQiLCJsYXN0U2VlbkF0IiwiZ2V0IiwiaGFzIiwicXVldWVkRXZlbnQiLCJldmVudElkIiwiZGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsV0FBVyxRQUFPLHFCQUFxQjtBQUkvQyxPQUFPLE1BQU1DLG9CQUFvQjtJQUMvQkMsYUFBYTtJQUNiQyxjQUFjO0lBQ2RDLGVBQWU7QUFDakIsRUFBVztBQWtDWCxNQUFNQyxzQkFBc0I7QUFDNUIsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsaUJBQWlCO0FBQ3ZCLE1BQU1DLGtCQUFrQjtBQU14QixNQUFNQyxXQUFXO0lBQ2YsSUFBRyxPQUFPQyxXQUFXQyxNQUFNLEVBQUVDLGVBQWUsWUFBWTtRQUN0RCxPQUFPRixXQUFXQyxNQUFNLENBQUNDLFVBQVU7SUFDckM7SUFFQSxPQUFPLEdBQUdDLEtBQUtDLEdBQUcsR0FBR0MsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFQyxLQUFLQyxNQUFNLEdBQUdGLFFBQVEsQ0FBQyxJQUFJRyxLQUFLLENBQUMsSUFBSTtBQUM1RTtBQUVBLE1BQU1DLGdCQUFnQixDQUFDQyxPQUFnQkMsWUFDckNDLE9BQU9GLFNBQVMsSUFBSUcsSUFBSSxHQUFHTCxLQUFLLENBQUMsR0FBR0c7QUFFdEMsTUFBTUcscUJBQXFCLENBQ3pCQyxhQUE2QyxDQUFDLENBQUMsR0FDWkMsT0FBT0MsT0FBTyxDQUFDRixZQUNqRFAsS0FBSyxDQUFDLEdBQUdYLGdCQUNUcUIsTUFBTSxDQUFpQyxDQUFDQyxRQUFRLENBQUNDLEtBQUtWLE1BQU07UUFDM0QsTUFBTVcsY0FBY1osY0FBY1csS0FBSztRQUV2QyxJQUFHLENBQUNDLGVBQWUsQ0FBQztZQUFDO1lBQVc7WUFBVTtTQUFTLENBQUNDLFFBQVEsQ0FBQyxPQUFPWixRQUFRO1lBQzFFLE9BQU9TO1FBQ1Q7UUFFQUEsTUFBTSxDQUFDRSxZQUFZLEdBQUcsT0FBT1gsVUFBVSxXQUFXRCxjQUFjQyxPQUFPLE9BQU9BO1FBQzlFLE9BQU9TO0lBQ1QsR0FBRyxDQUFDO0FBRU4sTUFBTUksZ0JBQWdCLENBQUNDO0lBQ3JCLE1BQU1DLE9BQU9oQixjQUFjZSxNQUFNQyxJQUFJLEVBQUU7SUFDdkMsTUFBTUMsT0FBT2pCLGNBQWNlLE1BQU1FLElBQUksRUFBRTtJQUV2QyxJQUFHLENBQUNELFFBQVEsQ0FBQ0MsTUFBTTtRQUNqQixPQUFPO0lBQ1Q7SUFFQSxNQUFNQyxPQUFPbEIsY0FBY2UsTUFBTUcsSUFBSSxFQUFFLEtBQUtDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDQSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFFdkUsT0FBTztRQUNMSDtRQUNBLEdBQUlFLE9BQU87WUFBQ0E7UUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0QlosWUFBWUQsbUJBQW1CVSxNQUFNVCxVQUFVO1FBQy9DVztJQUNGO0FBQ0Y7QUFFQSxNQUFNRyxtQkFBbUIsQ0FBQ0w7SUFDeEIsTUFBTVQsYUFBYUMsT0FBT0MsT0FBTyxDQUFDTyxNQUFNVCxVQUFVLElBQUksQ0FBQyxHQUFHZSxJQUFJLENBQUMsQ0FBQyxDQUFDQyxLQUFLLEVBQUUsQ0FBQ0MsTUFBTSxHQUFLRCxLQUFLRSxhQUFhLENBQUNEO0lBQ3ZHLE9BQU9FLEtBQUtDLFNBQVMsQ0FBQztRQUFDWCxNQUFNRSxJQUFJO1FBQUVGLE1BQU1DLElBQUk7UUFBRUQsTUFBTUcsSUFBSSxJQUFJO1FBQUlaO0tBQVc7QUFDOUU7QUFFQSxPQUFPLE1BQU1xQixzQkFBc0IsQ0FDakNDLE1BQ0FDLFVBQWdDLENBQUMsQ0FBQztJQUVsQyxNQUFNQyxRQUFROUIsY0FBYzZCLFFBQVFDLEtBQUssRUFBRTtJQUMzQyxNQUFNQyxhQUFhbEMsS0FBS21DLEdBQUcsQ0FBQyxHQUFHSCxRQUFRRSxVQUFVLElBQUkvQztJQUNyRCxNQUFNaUQsV0FBV3BDLEtBQUttQyxHQUFHLENBQUMsR0FBR0gsUUFBUUksUUFBUSxJQUFJaEQ7SUFDakQsTUFBTWlELFVBQVVMLFFBQVFLLE9BQU8sS0FBSztJQUNwQyxNQUFNQyx3QkFBd0JOLFFBQVFNLHFCQUFxQixLQUFLO0lBQ2hFLE1BQU1DLGFBQWF2QyxLQUFLbUMsR0FBRyxDQUFDLEdBQUdILFFBQVFPLFVBQVUsSUFBSWxEO0lBQ3JELE1BQU1tRCxZQUFZL0M7SUFDbEIsTUFBTWdELGdCQUFnQixJQUFJQztJQUMxQixNQUFNQyxhQUFhLElBQUlEO0lBQ3ZCLElBQUlFO0lBQ0osSUFBSUMsY0FBYztJQUNsQixJQUFJQyxXQUFXO0lBQ2YsSUFBSUM7SUFFSixNQUFNQyxtQkFBbUI7UUFDdkIsSUFBRyxDQUFDVix5QkFBeUIsT0FBTzVDLFdBQVd1RCxTQUFTLEtBQUssYUFBYTtZQUN4RSxPQUFPO1FBQ1Q7UUFFQSxNQUFNQyxpQkFBaUJ4RCxXQUFXdUQsU0FBUztRQUUzQyxPQUFPQyxlQUFlQyxVQUFVLEtBQUssT0FBT0QsZUFBZUUsb0JBQW9CLEtBQUs7SUFDdEY7SUFFQSxNQUFNQyxrQkFBa0I7UUFDdEIsSUFBR1YsV0FBV1csSUFBSSxJQUFJOUQsaUJBQWlCO1lBQ3JDO1FBQ0Y7UUFFQSxNQUFNK0QsU0FBUzFELEtBQUtDLEdBQUcsS0FBS3NDO1FBQzVCTyxXQUFXYSxPQUFPLENBQUMsQ0FBQ0MsV0FBV0M7WUFDN0IsSUFBR0QsWUFBWUYsUUFBUTtnQkFDckJaLFdBQVdnQixNQUFNLENBQUNEO1lBQ3BCO1FBQ0Y7UUFFQSxNQUFNZixXQUFXVyxJQUFJLEdBQUc5RCxnQkFBaUI7WUFDdkMsTUFBTW9FLG9CQUFvQmpCLFdBQVdrQixJQUFJLEdBQUdDLElBQUksR0FBRzFELEtBQUs7WUFFeEQsSUFBRyxDQUFDd0QsbUJBQW1CO2dCQUNyQjtZQUNGO1lBRUFqQixXQUFXZ0IsTUFBTSxDQUFDQztRQUNwQjtJQUNGO0lBRUEsTUFBTUcsUUFBUTtRQUNaLElBQUduQixjQUFjO1lBQ2YsT0FBT0E7UUFDVDtRQUVBLElBQUcsQ0FBQ1AsV0FBVyxDQUFDSixTQUFTZSxzQkFBc0JQLGNBQWNhLElBQUksS0FBSyxHQUFHO1lBQ3ZFO1FBQ0Y7UUFFQSxJQUFHUCxPQUFPO1lBQ1JpQixhQUFhakI7WUFDYkEsUUFBUWtCO1FBQ1Y7UUFFQSxNQUFNQyxTQUFTO2VBQUl6QixjQUFjMEIsTUFBTTtTQUFHO1FBQzFDMUIsY0FBYzJCLEtBQUs7UUFDbkJ2QixjQUFjaEQsS0FBS0MsR0FBRztRQUV0QjhDLGVBQWUsQUFBQyxDQUFBO1lBQ2QsSUFBSSxJQUFJeUIsUUFBUSxHQUFHQSxRQUFRSCxPQUFPSSxNQUFNLEVBQUVELFNBQVMvRSxlQUFnQjtnQkFDakUsTUFBTWlGLGNBQWNMLE9BQU9oRSxLQUFLLENBQUNtRSxPQUFPQSxRQUFRL0U7Z0JBRWhELElBQUk7b0JBQ0YsTUFBTVIsWUFBWWlELE1BQU0sU0FBUyxPQUFPO3dCQUN0Q3lDLE9BQU87NEJBQ0xwRCxNQUFNOzRCQUNOaEIsT0FBTztnQ0FBQzZCO2dDQUFPaUMsUUFBUUs7NEJBQVc7d0JBQ3BDO29CQUNGLEdBQUc7d0JBQUM7d0JBQVk7cUJBQVE7b0JBQ3hCLE1BQU14QyxLQUFLMEMsUUFBUSxDQUFDO3dCQUFDeEM7d0JBQU9pQyxRQUFRSzt3QkFBYW5ELE1BQU1yQyxrQkFBa0JHLGFBQWE7b0JBQUE7Z0JBQ3hGLEVBQUUsT0FBTXdGLE9BQU87b0JBQ2JSLE9BQU9oRSxLQUFLLENBQUNtRSxPQUFPYixPQUFPLENBQUMsQ0FBQ3RDLFFBQVV1QixjQUFja0MsR0FBRyxDQUFDcEQsaUJBQWlCTCxRQUFRQTtvQkFDbEYsTUFBTWEsS0FBSzBDLFFBQVEsQ0FBQzt3QkFBQ3hDO3dCQUFPeUM7d0JBQU9SLFFBQVFLO3dCQUFhbkQsTUFBTXJDLGtCQUFrQkMsV0FBVztvQkFBQTtvQkFDM0Y7Z0JBQ0Y7WUFDRjtRQUNGLENBQUEsSUFDRzRGLE9BQU8sQ0FBQztZQUNQaEMsZUFBZXFCO1FBQ2pCO1FBRUYsT0FBT3JCO0lBQ1Q7SUFFQSxNQUFNaUMsZ0JBQWdCO1FBQ3BCLElBQUc5QixPQUFPO1lBQ1JpQixhQUFhakI7UUFDZjtRQUVBLE1BQU0rQixvQkFBb0I5RSxLQUFLbUMsR0FBRyxDQUFDLEdBQUdJLGFBQWMxQyxDQUFBQSxLQUFLQyxHQUFHLEtBQUsrQyxXQUFVO1FBQzNFRSxRQUFRZ0MsV0FBVyxJQUFNLEtBQUtoQixTQUFTL0QsS0FBS21DLEdBQUcsQ0FBQ0QsWUFBWTRDO0lBQzlEO0lBRUEsTUFBTUUsUUFBUSxDQUFDQztRQUNiLElBQUcsQ0FBQzVDLFdBQVcsQ0FBQ0osU0FBU2Usb0JBQW9CO1lBQzNDO1FBQ0Y7UUFFQSxNQUFNOUIsUUFBUUQsY0FBY2dFO1FBRTVCLElBQUcsQ0FBQy9ELE9BQU87WUFDVDtRQUNGO1FBRUEsTUFBTXdDLGNBQWNuQyxpQkFBaUJMO1FBQ3JDLE1BQU1wQixNQUFNRCxLQUFLQyxHQUFHO1FBQ3BCLE1BQU1vRixhQUFhdkMsV0FBV3dDLEdBQUcsQ0FBQ3pCLGdCQUFnQjtRQUVsRCxJQUFHZixXQUFXeUMsR0FBRyxDQUFDMUIsZ0JBQWdCNUQsTUFBTW9GLGFBQWE5QyxVQUFVO1lBQzdEO1FBQ0Y7UUFFQU8sV0FBV2dDLEdBQUcsQ0FBQ2pCLGFBQWE1RDtRQUM1QnVEO1FBQ0FQLFlBQVk7UUFFWixNQUFNdUMsY0FBMkI7WUFDL0IsR0FBR25FLEtBQUs7WUFDUm9FLFNBQVM3RjtZQUNUK0M7WUFDQU07WUFDQVcsV0FBVzNEO1FBQ2I7UUFFQTJDLGNBQWNrQyxHQUFHLENBQUNqQixhQUFhMkI7UUFDL0IsS0FBS3RELEtBQUswQyxRQUFRLENBQUM7WUFBQ3hDO1lBQU9mLE9BQU9tRTtZQUFhakUsTUFBTXJDLGtCQUFrQkUsWUFBWTtRQUFBO1FBQ25GNEY7SUFDRjtJQUVBLE1BQU1VLFVBQVU7UUFDZCxJQUFHeEMsT0FBTztZQUNSaUIsYUFBYWpCO1lBQ2JBLFFBQVFrQjtRQUNWO1FBRUEsTUFBTUY7UUFDTnBCLFdBQVd5QixLQUFLO0lBQ2xCO0lBRUEsT0FBTztRQUFDbUI7UUFBU3hCO1FBQU9pQjtJQUFLO0FBQy9CLEVBQUUifQ==
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hd3NSdW1BY3Rpb25zL2F3c1J1bUFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cnVtUmVxdWVzdH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5cbmV4cG9ydCBjb25zdCBBV1NfUlVNX0NPTlNUQU5UUyA9IHtcbiAgVFJBQ0tfRVJST1I6ICdBV1NfUlVNX1RSQUNLX0VSUk9SJyxcbiAgVFJBQ0tfUVVFVUVEOiAnQVdTX1JVTV9UUkFDS19RVUVVRUQnLFxuICBUUkFDS19TVUNDRVNTOiAnQVdTX1JVTV9UUkFDS19TVUNDRVNTJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQXdzUnVtRXZlbnRUeXBlID0gJ2NsaWNrJyB8ICdwYWdlX3ZpZXcnIHwgKHN0cmluZyAmIHt9KTtcbmV4cG9ydCB0eXBlIEF3c1J1bVByb3BlcnR5ID0gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBBd3NSdW1UcmFja0lucHV0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+O1xuICByZWFkb25seSB0eXBlOiBBd3NSdW1FdmVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtRXZlbnQgZXh0ZW5kcyBBd3NSdW1UcmFja0lucHV0IHtcbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICByZWFkb25seSBqb3VybmV5SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VxdWVuY2U6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSBhbmFseXRpY3NJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVib3VuY2VNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZGVkdXBlTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICByZWFkb25seSByZXNwZWN0UHJpdmFjeVNpZ25hbHM/OiBib29sZWFuO1xuICByZWFkb25seSB0aHJvdHRsZU1zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUFjdGlvbnMge1xuICByZWFkb25seSBkZXN0cm95OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBmbHVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVhZG9ubHkgdHJhY2s6IChldmVudDogQXdzUnVtVHJhY2tJbnB1dCkgPT4gdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9ERUJPVU5DRV9NUyA9IDI1MDtcbmNvbnN0IERFRkFVTFRfREVEVVBFX01TID0gMTAwMDtcbmNvbnN0IERFRkFVTFRfVEhST1RUTEVfTVMgPSAxMDAwO1xuY29uc3QgTUFYX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IE1BWF9QUk9QRVJUSUVTID0gMjA7XG5jb25zdCBNQVhfU0VFTl9FVkVOVFMgPSA1MDA7XG5jb25zdCBCTE9DS0VEX1BST1BFUlRZX0tFWVMgPSBuZXcgU2V0KFtcbiAgJ2FjY291bnRpZCcsXG4gICdhZGRyZXNzJyxcbiAgJ2VtYWlsJyxcbiAgJ2ZpcnN0bmFtZScsXG4gICdmdWxsbmFtZScsXG4gICdnZW9sb2NhdGlvbicsXG4gICdpcCcsXG4gICdpcGFkZHJlc3MnLFxuICAnbGFzdG5hbWUnLFxuICAnbGF0aXR1ZGUnLFxuICAnbG9uZ2l0dWRlJyxcbiAgJ25hbWUnLFxuICAncGhvbmUnLFxuICAncmVmZXJyZXInLFxuICAndG9rZW4nLFxuICAndXNlcmFnZW50JyxcbiAgJ3VzZXJpZCdcbl0pO1xuY29uc3QgRU1BSUxfUEFUVEVSTiA9IC9cXGJbXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rXFxiL2k7XG5cbmludGVyZmFjZSBQcml2YWN5TmF2aWdhdG9yIGV4dGVuZHMgTmF2aWdhdG9yIHtcbiAgcmVhZG9ubHkgZ2xvYmFsUHJpdmFjeUNvbnRyb2w/OiBib29sZWFuO1xufVxuXG5jb25zdCBjcmVhdGVJZCA9ICgpOiBzdHJpbmcgPT4ge1xuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgcmV0dXJuIGAke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG59O1xuXG5jb25zdCBub3JtYWxpemVUZXh0ID0gKHZhbHVlOiB1bmtub3duLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyA9PlxuICBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKS5zbGljZSgwLCBtYXhMZW5ndGgpO1xuXG5jb25zdCBub3JtYWxpemVQcm9wZXJ0eUtleSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldL2csICcnKTtcblxuY29uc3Qgc2FuaXRpemVQcm9wZXJ0aWVzID0gKFxuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4gPSB7fVxuKTogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+ID0+IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpXG4gIC5zbGljZSgwLCBNQVhfUFJPUEVSVElFUylcbiAgLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4+KChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnR5S2V5ID0gbm9ybWFsaXplVGV4dChrZXksIDY0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcGVydHlLZXkgPSBub3JtYWxpemVQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG5cbiAgICBpZihcbiAgICAgICFwcm9wZXJ0eUtleSB8fFxuICAgICAgQkxPQ0tFRF9QUk9QRVJUWV9LRVlTLmhhcyhub3JtYWxpemVkUHJvcGVydHlLZXkpIHx8XG4gICAgICAhWydib29sZWFuJywgJ251bWJlcicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRleHRWYWx1ZSA9IG5vcm1hbGl6ZVRleHQodmFsdWUsIDI1Nik7XG5cbiAgICAgIGlmKHRleHRWYWx1ZSAmJiAhRU1BSUxfUEFUVEVSTi50ZXN0KHRleHRWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5S2V5XSA9IHRleHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgcmVzdWx0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcblxuY29uc3Qgc2FuaXRpemVFdmVudCA9IChldmVudDogQXdzUnVtVHJhY2tJbnB1dCk6IEF3c1J1bVRyYWNrSW5wdXQgfCBudWxsID0+IHtcbiAgY29uc3QgbmFtZSA9IG5vcm1hbGl6ZVRleHQoZXZlbnQubmFtZSwgMTI4KTtcbiAgY29uc3QgdHlwZSA9IG5vcm1hbGl6ZVRleHQoZXZlbnQudHlwZSwgNjQpO1xuXG4gIGlmKCFuYW1lIHx8ICF0eXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXRoID0gbm9ybWFsaXplVGV4dChldmVudC5wYXRoLCAyNTYpLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgLi4uKHBhdGggPyB7cGF0aH0gOiB7fSksXG4gICAgcHJvcGVydGllczogc2FuaXRpemVQcm9wZXJ0aWVzKGV2ZW50LnByb3BlcnRpZXMpLFxuICAgIHR5cGVcbiAgfTtcbn07XG5cbmNvbnN0IGV2ZW50RmluZ2VycHJpbnQgPSAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoZXZlbnQucHJvcGVydGllcyB8fCB7fSkuc29ydCgoW2xlZnRdLCBbcmlnaHRdKSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtldmVudC50eXBlLCBldmVudC5uYW1lLCBldmVudC5wYXRoIHx8ICcnLCBwcm9wZXJ0aWVzXSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQXdzUnVtQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9uczogQXdzUnVtQWN0aW9uc09wdGlvbnMgPSB7fVxuKTogQXdzUnVtQWN0aW9ucyA9PiB7XG4gIGNvbnN0IGFuYWx5dGljc0lkID0gbm9ybWFsaXplVGV4dChvcHRpb25zLmFuYWx5dGljc0lkLCAxMjgpO1xuICBjb25zdCBkZWJvdW5jZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5kZWJvdW5jZU1zID8/IERFRkFVTFRfREVCT1VOQ0VfTVMpO1xuICBjb25zdCBkZWR1cGVNcyA9IE1hdGgubWF4KDAsIG9wdGlvbnMuZGVkdXBlTXMgPz8gREVGQVVMVF9ERURVUEVfTVMpO1xuICBjb25zdCBlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZTtcbiAgY29uc3QgcmVzcGVjdFByaXZhY3lTaWduYWxzID0gb3B0aW9ucy5yZXNwZWN0UHJpdmFjeVNpZ25hbHMgIT09IGZhbHNlO1xuICBjb25zdCB0aHJvdHRsZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy50aHJvdHRsZU1zID8/IERFRkFVTFRfVEhST1RUTEVfTVMpO1xuICBjb25zdCBqb3VybmV5SWQgPSBjcmVhdGVJZCgpO1xuICBjb25zdCBwZW5kaW5nRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIEF3c1J1bUV2ZW50PigpO1xuICBjb25zdCBzZWVuRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgbGV0IGZsdXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RGbHVzaEF0ID0gMDtcbiAgbGV0IHNlcXVlbmNlID0gMDtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBoYXNQcml2YWN5U2lnbmFsID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmKCFyZXNwZWN0UHJpdmFjeVNpZ25hbHMgfHwgdHlwZW9mIGdsb2JhbFRoaXMubmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlnYXRvclN0YXRlID0gZ2xvYmFsVGhpcy5uYXZpZ2F0b3IgYXMgUHJpdmFjeU5hdmlnYXRvcjtcblxuICAgIHJldHVybiBuYXZpZ2F0b3JTdGF0ZS5kb05vdFRyYWNrID09PSAnMScgfHwgbmF2aWdhdG9yU3RhdGUuZ2xvYmFsUHJpdmFjeUNvbnRyb2wgPT09IHRydWU7XG4gIH07XG5cbiAgY29uc3QgcHJ1bmVTZWVuRXZlbnRzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmKHNlZW5FdmVudHMuc2l6ZSA8PSBNQVhfU0VFTl9FVkVOVFMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gZGVkdXBlTXM7XG4gICAgc2VlbkV2ZW50cy5mb3JFYWNoKCh0aW1lc3RhbXAsIGZpbmdlcnByaW50KSA9PiB7XG4gICAgICBpZih0aW1lc3RhbXAgPCBjdXRvZmYpIHtcbiAgICAgICAgc2VlbkV2ZW50cy5kZWxldGUoZmluZ2VycHJpbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd2hpbGUoc2VlbkV2ZW50cy5zaXplID4gTUFYX1NFRU5fRVZFTlRTKSB7XG4gICAgICBjb25zdCBvbGRlc3RGaW5nZXJwcmludCA9IHNlZW5FdmVudHMua2V5cygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYoIW9sZGVzdEZpbmdlcnByaW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzZWVuRXZlbnRzLmRlbGV0ZShvbGRlc3RGaW5nZXJwcmludCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmKGZsdXNoUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGZsdXNoUHJvbWlzZTtcbiAgICB9XG5cbiAgICBpZighZW5hYmxlZCB8fCAhYW5hbHl0aWNzSWQgfHwgaGFzUHJpdmFjeVNpZ25hbCgpIHx8IHBlbmRpbmdFdmVudHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRzID0gWy4uLnBlbmRpbmdFdmVudHMudmFsdWVzKCldO1xuICAgIHBlbmRpbmdFdmVudHMuY2xlYXIoKTtcbiAgICBsYXN0Rmx1c2hBdCA9IERhdGUubm93KCk7XG5cbiAgICBmbHVzaFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXZlbnRzLmxlbmd0aDsgaW5kZXggKz0gTUFYX0JBVENIX1NJWkUpIHtcbiAgICAgICAgY29uc3QgYmF0Y2hFdmVudHMgPSBldmVudHMuc2xpY2UoaW5kZXgsIGluZGV4ICsgTUFYX0JBVENIX1NJWkUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnVtUmVxdWVzdChmbHV4LCB7YW5hbHl0aWNzSWQsIGV2ZW50czogYmF0Y2hFdmVudHN9KTtcbiAgICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHthbmFseXRpY3NJZCwgZXZlbnRzOiBiYXRjaEV2ZW50cywgdHlwZTogQVdTX1JVTV9DT05TVEFOVFMuVFJBQ0tfU1VDQ0VTU30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgZXZlbnRzLnNsaWNlKGluZGV4KS5mb3JFYWNoKChldmVudCkgPT4gcGVuZGluZ0V2ZW50cy5zZXQoZXZlbnRGaW5nZXJwcmludChldmVudCksIGV2ZW50KSk7XG4gICAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7YW5hbHl0aWNzSWQsIGVycm9yLCBldmVudHM6IGJhdGNoRXZlbnRzLCB0eXBlOiBBV1NfUlVNX0NPTlNUQU5UUy5UUkFDS19FUlJPUn0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKClcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgZmx1c2hQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gZmx1c2hQcm9taXNlO1xuICB9O1xuXG4gIGNvbnN0IHNjaGVkdWxlRmx1c2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3R0bGVSZW1haW5pbmcgPSBNYXRoLm1heCgwLCB0aHJvdHRsZU1zIC0gKERhdGUubm93KCkgLSBsYXN0Rmx1c2hBdCkpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIGZsdXNoKCksIE1hdGgubWF4KGRlYm91bmNlTXMsIHRocm90dGxlUmVtYWluaW5nKSk7XG4gIH07XG5cbiAgY29uc3QgdHJhY2sgPSAoaW5wdXQ6IEF3c1J1bVRyYWNrSW5wdXQpOiB2b2lkID0+IHtcbiAgICBpZighZW5hYmxlZCB8fCAhYW5hbHl0aWNzSWQgfHwgaGFzUHJpdmFjeVNpZ25hbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSBzYW5pdGl6ZUV2ZW50KGlucHV0KTtcblxuICAgIGlmKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmdlcnByaW50ID0gZXZlbnRGaW5nZXJwcmludChldmVudCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VlbkF0ID0gc2VlbkV2ZW50cy5nZXQoZmluZ2VycHJpbnQpIHx8IDA7XG5cbiAgICBpZihzZWVuRXZlbnRzLmhhcyhmaW5nZXJwcmludCkgJiYgbm93IC0gbGFzdFNlZW5BdCA8IGRlZHVwZU1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VlbkV2ZW50cy5zZXQoZmluZ2VycHJpbnQsIG5vdyk7XG4gICAgcHJ1bmVTZWVuRXZlbnRzKCk7XG4gICAgc2VxdWVuY2UgKz0gMTtcblxuICAgIGNvbnN0IHF1ZXVlZEV2ZW50OiBBd3NSdW1FdmVudCA9IHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgZXZlbnRJZDogY3JlYXRlSWQoKSxcbiAgICAgIGpvdXJuZXlJZCxcbiAgICAgIHNlcXVlbmNlLFxuICAgICAgdGltZXN0YW1wOiBub3dcbiAgICB9O1xuXG4gICAgcGVuZGluZ0V2ZW50cy5zZXQoZmluZ2VycHJpbnQsIHF1ZXVlZEV2ZW50KTtcbiAgICB2b2lkIGZsdXguZGlzcGF0Y2goe2FuYWx5dGljc0lkLCBldmVudDogcXVldWVkRXZlbnQsIHR5cGU6IEFXU19SVU1fQ09OU1RBTlRTLlRSQUNLX1FVRVVFRH0pO1xuICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgfTtcblxuICBjb25zdCBkZXN0cm95ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYXdhaXQgZmx1c2goKTtcbiAgICBzZWVuRXZlbnRzLmNsZWFyKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtkZXN0cm95LCBmbHVzaCwgdHJhY2t9O1xufTtcbiJdLCJuYW1lcyI6WyJydW1SZXF1ZXN0IiwiQVdTX1JVTV9DT05TVEFOVFMiLCJUUkFDS19FUlJPUiIsIlRSQUNLX1FVRVVFRCIsIlRSQUNLX1NVQ0NFU1MiLCJERUZBVUxUX0RFQk9VTkNFX01TIiwiREVGQVVMVF9ERURVUEVfTVMiLCJERUZBVUxUX1RIUk9UVExFX01TIiwiTUFYX0JBVENIX1NJWkUiLCJNQVhfUFJPUEVSVElFUyIsIk1BWF9TRUVOX0VWRU5UUyIsIkJMT0NLRURfUFJPUEVSVFlfS0VZUyIsIlNldCIsIkVNQUlMX1BBVFRFUk4iLCJjcmVhdGVJZCIsImdsb2JhbFRoaXMiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiTWF0aCIsInJhbmRvbSIsInNsaWNlIiwibm9ybWFsaXplVGV4dCIsInZhbHVlIiwibWF4TGVuZ3RoIiwiU3RyaW5nIiwidHJpbSIsIm5vcm1hbGl6ZVByb3BlcnR5S2V5IiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwic2FuaXRpemVQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJrZXkiLCJwcm9wZXJ0eUtleSIsIm5vcm1hbGl6ZWRQcm9wZXJ0eUtleSIsImhhcyIsImluY2x1ZGVzIiwidGV4dFZhbHVlIiwidGVzdCIsIk51bWJlciIsImlzRmluaXRlIiwic2FuaXRpemVFdmVudCIsImV2ZW50IiwibmFtZSIsInR5cGUiLCJwYXRoIiwic3BsaXQiLCJldmVudEZpbmdlcnByaW50Iiwic29ydCIsImxlZnQiLCJyaWdodCIsImxvY2FsZUNvbXBhcmUiLCJKU09OIiwic3RyaW5naWZ5IiwiY3JlYXRlQXdzUnVtQWN0aW9ucyIsImZsdXgiLCJvcHRpb25zIiwiYW5hbHl0aWNzSWQiLCJkZWJvdW5jZU1zIiwibWF4IiwiZGVkdXBlTXMiLCJlbmFibGVkIiwicmVzcGVjdFByaXZhY3lTaWduYWxzIiwidGhyb3R0bGVNcyIsImpvdXJuZXlJZCIsInBlbmRpbmdFdmVudHMiLCJNYXAiLCJzZWVuRXZlbnRzIiwiZmx1c2hQcm9taXNlIiwibGFzdEZsdXNoQXQiLCJzZXF1ZW5jZSIsInRpbWVyIiwiaGFzUHJpdmFjeVNpZ25hbCIsIm5hdmlnYXRvciIsIm5hdmlnYXRvclN0YXRlIiwiZG9Ob3RUcmFjayIsImdsb2JhbFByaXZhY3lDb250cm9sIiwicHJ1bmVTZWVuRXZlbnRzIiwic2l6ZSIsImN1dG9mZiIsImZvckVhY2giLCJ0aW1lc3RhbXAiLCJmaW5nZXJwcmludCIsImRlbGV0ZSIsIm9sZGVzdEZpbmdlcnByaW50Iiwia2V5cyIsIm5leHQiLCJmbHVzaCIsImNsZWFyVGltZW91dCIsInVuZGVmaW5lZCIsImV2ZW50cyIsInZhbHVlcyIsImNsZWFyIiwiaW5kZXgiLCJsZW5ndGgiLCJiYXRjaEV2ZW50cyIsImRpc3BhdGNoIiwiZXJyb3IiLCJzZXQiLCJmaW5hbGx5Iiwic2NoZWR1bGVGbHVzaCIsInRocm90dGxlUmVtYWluaW5nIiwic2V0VGltZW91dCIsInRyYWNrIiwiaW5wdXQiLCJsYXN0U2VlbkF0IiwiZ2V0IiwicXVldWVkRXZlbnQiLCJldmVudElkIiwiZGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxRQUFPLHFCQUFxQjtBQUk5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
|
|
@@ -31,4 +31,3 @@ export interface ContentActions {
|
|
|
31
31
|
updateContentAdapterOptions: (options: ContentAdapterOptions) => void;
|
|
32
32
|
}
|
|
33
33
|
export declare const createContentActions: (flux: FluxFramework, options?: ContentActionsOptions) => ContentActions;
|
|
34
|
-
//# sourceMappingURL=contentActions.d.ts.map
|
|
@@ -27,4 +27,3 @@ export interface ConversationActions {
|
|
|
27
27
|
updateConversationAdapterOptions: (options: ConversationAdapterOptions) => void;
|
|
28
28
|
}
|
|
29
29
|
export declare const createConversationActions: (flux: FluxFramework, options?: ConversationActionsOptions) => ConversationActions;
|
|
30
|
-
//# sourceMappingURL=conversationActions.d.ts.map
|
|
@@ -84,4 +84,3 @@ export interface CrmActions {
|
|
|
84
84
|
readonly usersByPurchasedProduct: (productId: string, userProps?: string[], requestOptions?: ApiOptions) => Promise<User[]>;
|
|
85
85
|
}
|
|
86
86
|
export declare const createCrmActions: (flux: FluxFramework, _options?: CrmActionsOptions) => CrmActions;
|
|
87
|
-
//# sourceMappingURL=crmActions.d.ts.map
|