@nlabs/metropolisjs 0.1.2 → 0.3.0
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/.github/copilot-instructions.md +167 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +112 -0
- package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
- package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
- package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
- package/README.md +1123 -112
- package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
- package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
- package/docs/ACTIONS.md +63 -0
- package/docs/COLLECTIONS.md +1038 -0
- package/docs/CONNECTIONS.md +1367 -0
- package/docs/CRUD_INTEGRATION.md +702 -0
- package/examples/connections-usage.tsx +909 -0
- package/examples/content-actions-usage.ts +144 -0
- package/examples/crud-usage.tsx +847 -0
- package/examples/extensibility-usage.tsx +889 -0
- package/examples/i18n-import-examples.ts +86 -0
- package/examples/i18n-namespace-usage.ts +118 -0
- package/examples/i18next-singleton-demo.ts +187 -0
- package/examples/permission-system-usage.tsx +415 -0
- package/examples/project-details.tsx +397 -0
- package/examples/shared-i18n-usage.tsx +203 -0
- package/examples/signup-error-handling.ts +100 -0
- package/examples/translation-types.ts +86 -0
- package/examples/translation-usage.tsx +336 -0
- package/index.js +1 -0
- package/jest.config.mjs +28 -0
- package/lex.config.mjs +11 -2
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
- package/lib/actions/appActions/appActions.d.ts +29 -0
- package/lib/actions/appActions/appActions.d.ts.map +1 -0
- package/lib/actions/appActions/appActions.js +159 -0
- package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
- package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
- package/lib/actions/connectionActions/connectionActions.js +131 -0
- package/lib/actions/contentActions/contentActions.d.ts +34 -0
- package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
- package/lib/actions/contentActions/contentActions.js +314 -0
- package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
- package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
- package/lib/actions/conversationActions/conversationActions.js +225 -0
- package/lib/actions/eventActions/eventActions.d.ts +27 -7
- package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
- package/lib/actions/eventActions/eventActions.js +436 -2
- package/lib/actions/groupActions/groupActions.d.ts +30 -0
- package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
- package/lib/actions/groupActions/groupActions.js +229 -0
- package/lib/actions/imageActions/imageActions.d.ts +16 -10
- package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
- package/lib/actions/imageActions/imageActions.js +593 -2
- package/lib/actions/index.d.ts +21 -9
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +22 -2
- package/lib/actions/locationActions/locationActions.d.ts +11 -9
- package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
- package/lib/actions/locationActions/locationActions.js +388 -2
- package/lib/actions/messageActions/messageActions.d.ts +16 -32
- package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
- package/lib/actions/messageActions/messageActions.js +235 -2
- package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
- package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
- package/lib/actions/permissionActions/permissionActions.js +330 -0
- package/lib/actions/personaActions/personaActions.d.ts +65 -0
- package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
- package/lib/actions/personaActions/personaActions.js +572 -0
- package/lib/actions/postActions/postActions.d.ts +12 -32
- package/lib/actions/postActions/postActions.d.ts.map +1 -0
- package/lib/actions/postActions/postActions.js +447 -2
- package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
- package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
- package/lib/actions/reactionActions/reactionActions.js +413 -2
- package/lib/actions/sseActions/sseActions.d.ts +1 -0
- package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
- package/lib/actions/sseActions/sseActions.js +148 -2
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
- package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
- package/lib/actions/tagActions/tagActions.d.ts +13 -31
- package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
- package/lib/actions/tagActions/tagActions.js +347 -2
- package/lib/actions/translationActions/translationActions.d.ts +38 -0
- package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
- package/lib/actions/translationActions/translationActions.js +189 -0
- package/lib/actions/userActions/userActions.d.ts +44 -95
- package/lib/actions/userActions/userActions.d.ts.map +1 -0
- package/lib/actions/userActions/userActions.js +870 -2
- package/lib/actions/videoActions/videoActions.d.ts +41 -0
- package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
- package/lib/actions/videoActions/videoActions.js +532 -0
- package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
- package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
- package/lib/actions/websocketActions/websocketActions.js +377 -2
- package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
- package/lib/adapters/appAdapter/appAdapter.js +90 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
- package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
- package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
- package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
- package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
- package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
- package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
- package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
- package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
- package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
- package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
- package/lib/adapters/index.d.ts +34 -16
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +19 -2
- package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
- package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
- package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
- package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
- package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
- package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
- package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
- package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
- package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter/postAdapter.js +115 -2
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
- package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
- package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
- package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
- package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
- package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter/userAdapter.js +302 -2
- package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
- package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
- package/lib/config/index.d.ts +19 -6
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +97 -2
- package/lib/constants/Collections.d.ts +44 -0
- package/lib/constants/Collections.d.ts.map +1 -0
- package/lib/constants/Collections.js +40 -0
- package/lib/constants/MetropolisConstants.d.ts +1 -0
- package/lib/constants/MetropolisConstants.d.ts.map +1 -0
- package/lib/constants/MetropolisConstants.js +15 -2
- package/lib/graphql/message.d.ts +1 -0
- package/lib/graphql/message.d.ts.map +1 -0
- package/lib/graphql/message.js +6 -4
- package/lib/graphql/notification.d.ts +1 -0
- package/lib/graphql/notification.d.ts.map +1 -0
- package/lib/graphql/notification.js +6 -4
- package/lib/graphql/session.d.ts +1 -0
- package/lib/graphql/session.d.ts.map +1 -0
- package/lib/graphql/session.js +4 -3
- package/lib/index.d.ts +45 -22
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +248 -2
- package/lib/stores/appStore.d.ts +1 -0
- package/lib/stores/appStore.d.ts.map +1 -0
- package/lib/stores/appStore.js +23 -2
- package/lib/stores/contentStore.d.ts +36 -0
- package/lib/stores/contentStore.d.ts.map +1 -0
- package/lib/stores/contentStore.js +139 -0
- package/lib/stores/conversationStore.d.ts +38 -0
- package/lib/stores/conversationStore.d.ts.map +1 -0
- package/lib/stores/conversationStore.js +117 -0
- package/lib/stores/eventStore.d.ts +4 -1
- package/lib/stores/eventStore.d.ts.map +1 -0
- package/lib/stores/eventStore.js +47 -2
- package/lib/stores/groupStore.d.ts +37 -0
- package/lib/stores/groupStore.d.ts.map +1 -0
- package/lib/stores/groupStore.js +68 -0
- package/lib/stores/imageStore.d.ts +6 -1
- package/lib/stores/imageStore.d.ts.map +1 -0
- package/lib/stores/imageStore.js +53 -2
- package/lib/stores/index.d.ts +20 -11
- package/lib/stores/index.d.ts.map +1 -0
- package/lib/stores/index.js +24 -2
- package/lib/stores/locationStore.d.ts +2 -1
- package/lib/stores/locationStore.d.ts.map +1 -0
- package/lib/stores/locationStore.js +42 -2
- package/lib/stores/messageStore.d.ts +19 -4
- package/lib/stores/messageStore.d.ts.map +1 -0
- package/lib/stores/messageStore.js +137 -2
- package/lib/stores/notificationStore.d.ts +33 -0
- package/lib/stores/notificationStore.d.ts.map +1 -0
- package/lib/stores/notificationStore.js +55 -0
- package/lib/stores/permissionStore.d.ts +37 -0
- package/lib/stores/permissionStore.d.ts.map +1 -0
- package/lib/stores/permissionStore.js +117 -0
- package/lib/stores/personaStore.d.ts +26 -0
- package/lib/stores/personaStore.d.ts.map +1 -0
- package/lib/stores/personaStore.js +118 -0
- package/lib/stores/postStore.d.ts +2 -1
- package/lib/stores/postStore.d.ts.map +1 -0
- package/lib/stores/postStore.js +53 -2
- package/lib/stores/reactionStore.d.ts +1 -0
- package/lib/stores/reactionStore.d.ts.map +1 -0
- package/lib/stores/reactionStore.js +28 -2
- package/lib/stores/subscriptionStore.d.ts +41 -0
- package/lib/stores/subscriptionStore.d.ts.map +1 -0
- package/lib/stores/subscriptionStore.js +85 -0
- package/lib/stores/tagStore.d.ts +8 -5
- package/lib/stores/tagStore.d.ts.map +1 -0
- package/lib/stores/tagStore.js +87 -2
- package/lib/stores/translationStore.d.ts +42 -0
- package/lib/stores/translationStore.d.ts.map +1 -0
- package/lib/stores/translationStore.js +122 -0
- package/lib/stores/userStore.d.ts +5 -4
- package/lib/stores/userStore.d.ts.map +1 -0
- package/lib/stores/userStore.js +319 -2
- package/lib/stores/videoStore.d.ts +39 -0
- package/lib/stores/videoStore.d.ts.map +1 -0
- package/lib/stores/videoStore.js +132 -0
- package/lib/stores/websocketStore.d.ts +1 -0
- package/lib/stores/websocketStore.d.ts.map +1 -0
- package/lib/stores/websocketStore.js +51 -2
- package/lib/types/apps.types.d.ts +17 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +6 -0
- package/lib/types/common.types.d.ts +31 -0
- package/lib/types/common.types.d.ts.map +1 -0
- package/lib/types/common.types.js +6 -0
- package/lib/types/conversations.types.d.ts +17 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/edges.types.d.ts +38 -0
- package/lib/types/edges.types.d.ts.map +1 -0
- package/lib/types/edges.types.js +6 -0
- package/lib/types/groups.types.d.ts +19 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +12 -0
- package/lib/types/subscriptions.types.d.ts +32 -0
- package/lib/types/subscriptions.types.d.ts.map +1 -0
- package/lib/types/subscriptions.types.js +6 -0
- package/lib/types/videos.types.d.ts +61 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/utils/MetropolisProvider.d.ts +39 -15
- package/lib/utils/MetropolisProvider.d.ts.map +1 -0
- package/lib/utils/MetropolisProvider.js +31 -2
- package/lib/utils/actionFactory.d.ts +21 -19
- package/lib/utils/actionFactory.d.ts.map +1 -0
- package/lib/utils/actionFactory.js +95 -2
- package/lib/utils/api.d.ts +5 -4
- package/lib/utils/api.d.ts.map +1 -0
- package/lib/utils/api.js +252 -6
- package/lib/utils/app.d.ts +1 -0
- package/lib/utils/app.d.ts.map +1 -0
- package/lib/utils/app.js +15 -2
- package/lib/utils/baseActionFactory.d.ts +5 -23
- package/lib/utils/baseActionFactory.d.ts.map +1 -0
- package/lib/utils/baseActionFactory.js +72 -2
- package/lib/utils/configUtils.d.ts +11 -0
- package/lib/utils/configUtils.d.ts.map +1 -0
- package/lib/utils/configUtils.js +20 -0
- package/lib/utils/dateUtils.d.ts +1 -0
- package/lib/utils/dateUtils.d.ts.map +1 -0
- package/lib/utils/dateUtils.js +11 -2
- package/lib/utils/file.d.ts +3 -1
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js +156 -2
- package/lib/utils/i18n.d.ts +7 -0
- package/lib/utils/i18n.d.ts.map +1 -0
- package/lib/utils/i18n.js +96 -0
- package/lib/utils/index.d.ts +20 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/location.d.ts +4 -3
- package/lib/utils/location.d.ts.map +1 -0
- package/lib/utils/location.js +82 -2
- package/lib/utils/permissionUtils.d.ts +22 -0
- package/lib/utils/permissionUtils.d.ts.map +1 -0
- package/lib/utils/permissionUtils.js +72 -0
- package/lib/utils/requestCache.d.ts +8 -0
- package/lib/utils/requestCache.d.ts.map +1 -0
- package/lib/utils/requestCache.js +53 -0
- package/lib/utils/session.d.ts +14 -0
- package/lib/utils/session.d.ts.map +1 -0
- package/lib/utils/session.js +107 -0
- package/lib/utils/useConversationTyping.d.ts +26 -0
- package/lib/utils/useConversationTyping.d.ts.map +1 -0
- package/lib/utils/useConversationTyping.js +117 -0
- package/lib/utils/useMetropolis.d.ts +67 -12
- package/lib/utils/useMetropolis.d.ts.map +1 -0
- package/lib/utils/useMetropolis.js +311 -2
- package/lib/utils/useTranslations.d.ts +16 -0
- package/lib/utils/useTranslations.d.ts.map +1 -0
- package/lib/utils/useTranslations.js +105 -0
- package/lib/utils/validatorFactory.d.ts +3 -2
- package/lib/utils/validatorFactory.d.ts.map +1 -0
- package/lib/utils/validatorFactory.js +95 -2
- package/package.json +58 -17
- package/temp_signin.ts +73 -0
- package/lib/actions/profileActions/profileActions.d.ts +0 -50
- package/lib/actions/profileActions/profileActions.js +0 -2
- package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
- package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
- package/lib/stores/profileStore.d.ts +0 -24
- package/lib/stores/profileStore.js +0 -2
- /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
|
@@ -1,2 +1,593 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FjdGlvbnMvaW1hZ2VBY3Rpb25zL2ltYWdlQWN0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscyc7XG5cbmltcG9ydCB7dmFsaWRhdGVJbWFnZUlucHV0fSBmcm9tICcuLi8uLi9hZGFwdGVycy9pbWFnZUFkYXB0ZXIvaW1hZ2VBZGFwdGVyJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHtJTUFHRV9DT05TVEFOVFN9IGZyb20gJy4uLy4uL3N0b3Jlcy9pbWFnZVN0b3JlJztcbmltcG9ydCB7YXBwTXV0YXRpb24sIGFwcFF1ZXJ5LCB1cGxvYWRJbWFnZX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpJztcbmltcG9ydCB7Y29udmVydEZpbGVUb0Jhc2U2NH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZSc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlVHlwZX0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvaW1hZ2VBZGFwdGVyL2ltYWdlQWRhcHRlcic7XG5pbXBvcnQgdHlwZSB7QXBpUmVzdWx0c1R5cGUsIFJlYWt0b3JEYkNvbGxlY3Rpb259IGZyb20gJy4uLy4uL3V0aWxzL2FwaSc7XG5cbmNvbnN0IERBVEFfVFlQRTogUmVha3RvckRiQ29sbGVjdGlvbiA9ICdpbWFnZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQWRhcHRlck9wdGlvbnMge1xuICBzdHJpY3Q/OiBib29sZWFuO1xuICBhbGxvd1BhcnRpYWw/OiBib29sZWFuO1xuICBlbnZpcm9ubWVudD86ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbicgfCAndGVzdCc7XG4gIGN1c3RvbVZhbGlkYXRpb24/OiAoaW5wdXQ6IHVua25vd24pID0+IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VBY3Rpb25zT3B0aW9ucyB7XG4gIGltYWdlQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgaW1hZ2VBZGFwdGVyT3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCB0eXBlIEltYWdlQXBpUmVzdWx0c1R5cGUgPSB7XG4gIGFkZEltYWdlOiBJbWFnZVR5cGU7XG4gIGRlbGV0ZUltYWdlOiBJbWFnZVR5cGU7XG4gIGltYWdlOiBJbWFnZVR5cGU7XG4gIHVwZGF0ZUltYWdlOiBJbWFnZVR5cGU7XG4gIHVwbG9hZEZpbGVJbWFnZXM6IEltYWdlVHlwZVtdO1xuICBnZXRJbWFnZUNvdW50OiBudW1iZXI7XG4gIGdldEltYWdlc0J5SXRlbTogSW1hZ2VUeXBlW107XG4gIGdldEltYWdlc0J5UmVhY3Rpb25zOiBJbWFnZVR5cGVbXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VBY3Rpb25zIHtcbiAgYWRkOiAoaW1hZ2U6IFBhcnRpYWw8SW1hZ2VUeXBlPiwgdHlwZT86IHN0cmluZykgPT4gUHJvbWlzZTxJbWFnZVR5cGU+O1xuICBkZWxldGU6IChpbWFnZUlkOiBzdHJpbmcsIGltYWdlUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxJbWFnZVR5cGU+O1xuICB1cGRhdGU6IChpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LCB0eXBlPzogc3RyaW5nKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIHVwbG9hZDogKGltYWdlRmlsZXM6IEZpbGVbXSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlPzogc3RyaW5nKSA9PiBQcm9taXNlPEltYWdlVHlwZVtdPjtcbiAgY291bnRCeUl0ZW06IChpdGVtSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXI+O1xuICBsaXN0QnlJdGVtOiAoaXRlbUlkOiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBpbWFnZVByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBsaXN0QnlSZWFjdGlvbnM6IChyZWFjdGlvbnM6IHN0cmluZ1tdLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgaW1hZ2VQcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPEltYWdlVHlwZVtdPjtcbiAgdXBkYXRlSW1hZ2VBZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVJbWFnZUFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5jb25zdCBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zKSA9PiB2YWxpZGF0ZUltYWdlSW5wdXQoaW5wdXQpO1xuXG4vLyBFbmhhbmNlZCB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIGN1c3RvbSBsb2dpYyB3aXRoIGRlZmF1bHRzXG5jb25zdCBjcmVhdGVJbWFnZVZhbGlkYXRvciA9IChcbiAgY3VzdG9tQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSxcbiAgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnNcbikgPT4gKGlucHV0OiB1bmtub3duLCB2YWxpZGF0b3JPcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gey4uLm9wdGlvbnMsIC4uLnZhbGlkYXRvck9wdGlvbnN9O1xuXG4gIC8vIFN0YXJ0IHdpdGggZGVmYXVsdCB2YWxpZGF0aW9uXG4gIGxldCB2YWxpZGF0ZWQgPSBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IoaW5wdXQsIG1lcmdlZE9wdGlvbnMpO1xuXG4gIC8vIEFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIGlmIHByb3ZpZGVkXG4gIGlmKGN1c3RvbUFkYXB0ZXIpIHtcbiAgICB2YWxpZGF0ZWQgPSBjdXN0b21BZGFwdGVyKHZhbGlkYXRlZCwgbWVyZ2VkT3B0aW9ucyk7XG4gIH1cblxuICAvLyBBcHBseSBjdXN0b20gdmFsaWRhdGlvbiBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWRcbiAgaWYobWVyZ2VkT3B0aW9ucz8uY3VzdG9tVmFsaWRhdGlvbikge1xuICAgIHZhbGlkYXRlZCA9IG1lcmdlZE9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbih2YWxpZGF0ZWQpIGFzIEltYWdlVHlwZTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59O1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIEltYWdlQWN0aW9ucyB3aXRoIGVuaGFuY2VkIGFkYXB0ZXIgaW5qZWN0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEN1c3RvbSBhZGFwdGVycyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBiZWhhdmlvciwgYWxsb3dpbmcgcGFydGlhbCBvdmVycmlkZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCBhZGFwdGVyc1xuICogY29uc3QgaW1hZ2VBY3Rpb25zID0gY3JlYXRlSW1hZ2VBY3Rpb25zKGZsdXgpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gYWRhcHRlciB0aGF0IGV4dGVuZHMgZGVmYXVsdCBiZWhhdmlvclxuICogY29uc3QgY3VzdG9tSW1hZ2VBZGFwdGVyID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICogICAvLyBpbnB1dCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSBkZWZhdWx0IGFkYXB0ZXJcbiAqICAgaWYgKGlucHV0LmZpbGVTaXplICYmIGlucHV0LmZpbGVTaXplID4gNTAwMDAwMCkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZmlsZSB0b28gbGFyZ2UnKTtcbiAqICAgfVxuICogICByZXR1cm4gaW5wdXQ7XG4gKiB9O1xuICpcbiAqIGNvbnN0IGltYWdlQWN0aW9ucyA9IGNyZWF0ZUltYWdlQWN0aW9ucyhmbHV4LCB7XG4gKiAgIGltYWdlQWRhcHRlcjogY3VzdG9tSW1hZ2VBZGFwdGVyXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUltYWdlQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IEltYWdlQWN0aW9uc09wdGlvbnNcbik6IEltYWdlQWN0aW9ucyA9PiB7XG4gIC8vIEluaXRpYWxpemUgYWRhcHRlciBzdGF0ZVxuICBsZXQgaW1hZ2VBZGFwdGVyT3B0aW9uczogSW1hZ2VBZGFwdGVyT3B0aW9ucyA9IG9wdGlvbnM/LmltYWdlQWRhcHRlck9wdGlvbnMgfHwge307XG4gIGxldCBjdXN0b21JbWFnZUFkYXB0ZXIgPSBvcHRpb25zPy5pbWFnZUFkYXB0ZXI7XG5cbiAgLy8gQ3JlYXRlIHZhbGlkYXRvcnMgdGhhdCBtZXJnZSBjdXN0b20gYWRhcHRlcnMgd2l0aCBkZWZhdWx0c1xuICBsZXQgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG5cbiAgLy8gVXBkYXRlIGZ1bmN0aW9ucyB0aGF0IHJlY3JlYXRlIHZhbGlkYXRvcnNcbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyID0gKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSk6IHZvaWQgPT4ge1xuICAgIGN1c3RvbUltYWdlQWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZUFkYXB0ZXJPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgaW1hZ2VBZGFwdGVyT3B0aW9ucyA9IHsuLi5pbWFnZUFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICB2YWxpZGF0ZUltYWdlID0gY3JlYXRlSW1hZ2VWYWxpZGF0b3IoY3VzdG9tSW1hZ2VBZGFwdGVyLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgfTtcblxuICAvLyBBY3Rpb24gaW1wbGVtZW50YXRpb25zXG4gIGNvbnN0IGFkZCA9IGFzeW5jIChcbiAgICBpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LFxuICAgIHR5cGU6IHN0cmluZyA9ICdpbWFnZSdcbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkSW1hZ2UgPSB2YWxpZGF0ZUltYWdlKGltYWdlLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IHtiYXNlNjQsIGRlc2NyaXB0aW9uLCBpdGVtSWR9ID0gdmFsaWRhdGVkSW1hZ2U7XG4gICAgICBjb25zdCBmb3JtYXRJbWFnZSA9IHtcbiAgICAgICAgYmFzZTY0LFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gPyBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgICAgaXRlbUlkLFxuICAgICAgICBpdGVtVHlwZTogdHlwZVxuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlOiBuZXdJbWFnZX0gPSBhd2FpdCB1cGxvYWRJbWFnZShmbHV4LCBmb3JtYXRJbWFnZSk7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtpbWFnZTogbmV3SW1hZ2UsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTfSk7XG4gICAgICByZXR1cm4gbmV3SW1hZ2UgYXMgSW1hZ2VUeXBlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuQUREX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkZWxldGVJbWFnZSA9IGFzeW5jIChcbiAgICBpbWFnZUlkOiBzdHJpbmcsXG4gICAgaW1hZ2VQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgaW1hZ2VJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBpbWFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtkZWxldGVJbWFnZSA9IHt9fSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtpbWFnZTogZGVsZXRlSW1hZ2UsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9TVUNDRVNTfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7ZGVsZXRlSW1hZ2V9ID0gYXdhaXQgYXBwTXV0YXRpb24oZmx1eCwgJ2RlbGV0ZUltYWdlJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgWydpZCcsIC4uLmltYWdlUHJvcHNdLCB7b25TdWNjZXNzfSk7XG4gICAgICByZXR1cm4gZGVsZXRlSW1hZ2UgYXMgSW1hZ2VUeXBlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuUkVNT1ZFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGUgPSBhc3luYyAoXG4gICAgaW1hZ2U6IFBhcnRpYWw8SW1hZ2VUeXBlPixcbiAgICB0eXBlOiBzdHJpbmcgPSAnaW1hZ2UnXG4gICk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEltYWdlID0gdmFsaWRhdGVJbWFnZShpbWFnZSwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG4gICAgICBjb25zdCB7YmFzZTY0LCBkZXNjcmlwdGlvbiwgaXRlbUlkfSA9IHZhbGlkYXRlZEltYWdlO1xuICAgICAgY29uc3QgZm9ybWF0SW1hZ2UgPSB7XG4gICAgICAgIGJhc2U2NCxcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uID8gcGFyc2VTdHJpbmcoZGVzY3JpcHRpb24sIDUwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIGZpbGVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICAgIGl0ZW1JZCxcbiAgICAgICAgaXRlbVR5cGU6IHR5cGVcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHtpbWFnZTogbmV3SW1hZ2V9ID0gYXdhaXQgdXBsb2FkSW1hZ2UoZmx1eCwgZm9ybWF0SW1hZ2UpO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7aW1hZ2U6IG5ld0ltYWdlLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTU30pO1xuICAgICAgcmV0dXJuIG5ld0ltYWdlIGFzIEltYWdlVHlwZTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkFERF9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBsb2FkID0gYXN5bmMgKFxuICAgIGltYWdlRmlsZXM6IEZpbGVbXSxcbiAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICBpdGVtVHlwZTogc3RyaW5nID0gJ3VzZXJzJ1xuICApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhdmVkSW1hZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGltYWdlRmlsZXMubWFwKGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmFzZTY0OiBzdHJpbmcgPSBhd2FpdCBjb252ZXJ0RmlsZVRvQmFzZTY0KGZpbGUsIENvbmZpZy5nZXQoJ2FwcC5pbWFnZXMubWF4SW1hZ2VTaXplJykpO1xuICAgICAgICAgIGNvbnN0IHt0eXBlOiBmaWxlVHlwZX0gPSBmaWxlO1xuICAgICAgICAgIHJldHVybiBhZGQoe2Jhc2U2NCwgZmlsZVR5cGUsIGl0ZW1JZH0sIGl0ZW1UeXBlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlczogc2F2ZWRJbWFnZXMsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9TVUNDRVNTfSk7XG4gICAgICByZXR1cm4gc2F2ZWRJbWFnZXM7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvdW50QnlJdGVtID0gYXN5bmMgKGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGl0ZW1JZDoge1xuICAgICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgICB2YWx1ZTogaXRlbUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtpbWFnZUNvdW50OiBjb3VudCA9IDB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2l0ZW1JZCwgY291bnQsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfQ09VTlRfU1VDQ0VTU30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlQ291bnR9ID0gYXdhaXQgYXBwUXVlcnkoZmx1eCwgJ2ltYWdlQ291bnQnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbJ2NvdW50J10sIHtvblN1Y2Nlc3N9KTtcbiAgICAgIHJldHVybiBpbWFnZUNvdW50IGFzIG51bWJlcjtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9DT1VOVF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgaW1hZ2VQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IGZyb21cbiAgICAgICAgfSxcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IGl0ZW1JZFxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiB0b1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7aW1hZ2VzQnlJdGVtID0gW119ID0gZGF0YSBhcyB7aW1hZ2VzQnlJdGVtOiBJbWFnZVR5cGVbXX07XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgbGlzdDogaW1hZ2VzQnlJdGVtLFxuICAgICAgICAgIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlc0J5SXRlbX0gPSBhd2FpdCBhcHBRdWVyeShcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2ltYWdlc0J5SXRlbScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnY29sb3InLFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ2ltYWdlSWQnLFxuICAgICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICAgJ2xpa2VDb3VudCcsXG4gICAgICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLmltYWdlUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgICByZXR1cm4gaW1hZ2VzQnlJdGVtIGFzIEltYWdlVHlwZVtdO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgcmVhY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICBpbWFnZVByb3BzOiBzdHJpbmdbXSA9IFtdXG4gICk6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgICB9LFxuICAgICAgICByZWFjdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnUmVhY3Rpb25JbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiByZWFjdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogdG9cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3Qge2ltYWdlc0J5UmVhY3Rpb25zID0gW119ID0gZGF0YSBhcyB7aW1hZ2VzQnlSZWFjdGlvbnM6IEltYWdlVHlwZVtdfTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGxpc3Q6IGltYWdlc0J5UmVhY3Rpb25zLFxuICAgICAgICAgIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlc0J5UmVhY3Rpb25zfSA9IGF3YWl0IGFwcFF1ZXJ5KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2VzQnlSZWFjdGlvbnMnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICdpbWFnZUlkJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdsaWtlQ291bnQnLFxuICAgICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAuLi5pbWFnZVByb3BzXG4gICAgICAgIF0sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGltYWdlc0J5UmVhY3Rpb25zIGFzIEltYWdlVHlwZVtdO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIGFjdGlvbnMgb2JqZWN0XG4gIHJldHVybiB7XG4gICAgYWRkLFxuICAgIGRlbGV0ZTogZGVsZXRlSW1hZ2UsXG4gICAgdXBkYXRlLFxuICAgIHVwbG9hZCxcbiAgICBjb3VudEJ5SXRlbSxcbiAgICBsaXN0QnlJdGVtLFxuICAgIGxpc3RCeVJlYWN0aW9ucyxcbiAgICB1cGRhdGVJbWFnZUFkYXB0ZXIsXG4gICAgdXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9uc1xuICB9O1xufTtcblxuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBUSxlQUFBQSxNQUFrQixlQUUxQixPQUFRLHNCQUFBQyxNQUF5QiwyQ0FDakMsT0FBUSxVQUFBQyxNQUFhLGVBQ3JCLE9BQVEsbUJBQUFDLE1BQXNCLDBCQUM5QixPQUFRLGVBQUFDLEVBQWEsWUFBQUMsRUFBVSxl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LEdBQ2JiLEVBQXVCLENBQUMsSUFDQyxDQUN6QixHQUFJLENBQ0YsTUFBTUMsRUFBaUIsQ0FDckIsS0FBTSxDQUNKLEtBQU0sTUFDTixNQUFPVyxDQUNULEVBQ0EsVUFBVyxDQUNULEtBQU0saUJBQ04sTUFBT0csQ0FDVCxFQUNBLEdBQUksQ0FDRixLQUFNLE1BQ04sTUFBT0YsQ0FDVCxDQUNGLEVBRU1YLEVBQVksQ0FBQ0MsRUFBdUIsQ0FBQyxJQUFNLENBQy9DLEtBQU0sQ0FBQyxrQkFBQWEsRUFBb0IsQ0FBQyxDQUFDLEVBQUliLEVBQ2pDLE9BQU9yQixFQUFLLFNBQVMsQ0FDbkIsS0FBTWtDLEVBQ04sS0FBTWpELEVBQWdCLGdCQUN4QixDQUFDLENBQ0gsRUFFTSxDQUFDLGtCQUFBaUQsQ0FBaUIsRUFBSSxNQUFNL0MsRUFDaENhLEVBQ0Esb0JBQ0FWLEVBQ0E2QixFQUNBLENBQ0UsUUFDQSxjQUNBLFNBQ0EsVUFDQSxXQUNBLFlBQ0EsV0FDQSxRQUNBLEdBQUdELENBQ0wsRUFDQSxDQUFDLFVBQUFFLENBQVMsQ0FDWixFQUNBLE9BQU9jLENBQ1QsT0FBUWxCLEVBQU8sQ0FDYixNQUFBaEIsRUFBSyxTQUFTLENBQUMsTUFBQWdCLEVBQU8sS0FBTS9CLEVBQWdCLGNBQWMsQ0FBQyxFQUNyRCtCLENBQ1IsQ0FDRixFQVdFLG1CQUFBWixFQUNBLDBCQUFBRSxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsicGFyc2VTdHJpbmciLCAidmFsaWRhdGVJbWFnZUlucHV0IiwgIkNvbmZpZyIsICJJTUFHRV9DT05TVEFOVFMiLCAiYXBwTXV0YXRpb24iLCAiYXBwUXVlcnkiLCAidXBsb2FkSW1hZ2UiLCAiY29udmVydEZpbGVUb0Jhc2U2NCIsICJEQVRBX1RZUEUiLCAiZGVmYXVsdEltYWdlVmFsaWRhdG9yIiwgImlucHV0IiwgIm9wdGlvbnMiLCAiY3JlYXRlSW1hZ2VWYWxpZGF0b3IiLCAiY3VzdG9tQWRhcHRlciIsICJ2YWxpZGF0b3JPcHRpb25zIiwgIm1lcmdlZE9wdGlvbnMiLCAidmFsaWRhdGVkIiwgImNyZWF0ZUltYWdlQWN0aW9ucyIsICJmbHV4IiwgImltYWdlQWRhcHRlck9wdGlvbnMiLCAiY3VzdG9tSW1hZ2VBZGFwdGVyIiwgInZhbGlkYXRlSW1hZ2UiLCAidXBkYXRlSW1hZ2VBZGFwdGVyIiwgImFkYXB0ZXIiLCAidXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9ucyIsICJhZGQiLCAiaW1hZ2UiLCAidHlwZSIsICJ2YWxpZGF0ZWRJbWFnZSIsICJiYXNlNjQiLCAiZGVzY3JpcHRpb24iLCAiaXRlbUlkIiwgImZvcm1hdEltYWdlIiwgIm5ld0ltYWdlIiwgImVycm9yIiwgImltYWdlSWQiLCAiaW1hZ2VQcm9wcyIsICJxdWVyeVZhcmlhYmxlcyIsICJvblN1Y2Nlc3MiLCAiZGF0YSIsICJkZWxldGVJbWFnZSIsICJpbWFnZUZpbGVzIiwgIml0ZW1UeXBlIiwgInNhdmVkSW1hZ2VzIiwgImZpbGUiLCAiZmlsZVR5cGUiLCAiY291bnQiLCAiaW1hZ2VDb3VudCIsICJmcm9tIiwgInRvIiwgImltYWdlc0J5SXRlbSIsICJyZWFjdGlvbnMiLCAiaW1hZ2VzQnlSZWFjdGlvbnMiXQp9Cg==
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { parseString } from '@nlabs/utils';
|
|
5
|
+
import { validateImageInput } from '../../adapters/imageAdapter/imageAdapter.js';
|
|
6
|
+
import { getConfigFromFlux } from '../../utils/configUtils.js';
|
|
7
|
+
import { IMAGE_CONSTANTS } from '../../stores/imageStore.js';
|
|
8
|
+
import { appMutation, appQuery, uploadImage } from '../../utils/api.js';
|
|
9
|
+
import { convertFileToUploadFile } from '../../utils/file.js';
|
|
10
|
+
import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
|
|
11
|
+
const DATA_TYPE = 'images';
|
|
12
|
+
const getImageUploadConfig = (flux)=>{
|
|
13
|
+
const config = getConfigFromFlux(flux);
|
|
14
|
+
const configuredMaxImageSize = Number(config?.app?.images?.maxImageSize || config?.maxImageSize || 1200);
|
|
15
|
+
const configuredMaxImageUploadBytes = Number(config?.app?.images?.maxImageUploadBytes || config?.maxImageUploadBytes || 900 * 1024);
|
|
16
|
+
return {
|
|
17
|
+
maxImageSize: Number.isFinite(configuredMaxImageSize) && configuredMaxImageSize > 0 ? configuredMaxImageSize : 1200,
|
|
18
|
+
maxImageUploadBytes: Number.isFinite(configuredMaxImageUploadBytes) && configuredMaxImageUploadBytes > 0 ? configuredMaxImageUploadBytes : 900 * 1024
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
// Default validation function
|
|
22
|
+
const defaultImageValidator = (input, options)=>validateImageInput(input);
|
|
23
|
+
// Enhanced validation function that merges custom logic with defaults
|
|
24
|
+
const createImageValidator = (customAdapter, options)=>(input, validatorOptions)=>{
|
|
25
|
+
const mergedOptions = {
|
|
26
|
+
...options,
|
|
27
|
+
...validatorOptions
|
|
28
|
+
};
|
|
29
|
+
// Start with default validation
|
|
30
|
+
let validated = defaultImageValidator(input, mergedOptions);
|
|
31
|
+
// Apply custom validation if provided
|
|
32
|
+
if (customAdapter) {
|
|
33
|
+
validated = customAdapter(validated, mergedOptions);
|
|
34
|
+
}
|
|
35
|
+
// Apply custom validation from options if provided
|
|
36
|
+
if (mergedOptions?.customValidation) {
|
|
37
|
+
validated = mergedOptions.customValidation(validated);
|
|
38
|
+
}
|
|
39
|
+
return validated;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Factory function to create ImageActions with enhanced adapter injection capabilities.
|
|
43
|
+
* Custom adapters are merged with default behavior, allowing partial overrides.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* // Basic usage with default adapters
|
|
47
|
+
* const imageActions = createImageActions(flux);
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Custom adapter that extends default behavior
|
|
51
|
+
* const customImageAdapter = (input: unknown, options?: ImageAdapterOptions) => {
|
|
52
|
+
* // input is already validated by default adapter
|
|
53
|
+
* if (input.fileSize && input.fileSize > 5000000) {
|
|
54
|
+
* throw new Error('Image file too large');
|
|
55
|
+
* }
|
|
56
|
+
* return input;
|
|
57
|
+
* };
|
|
58
|
+
*
|
|
59
|
+
* const imageActions = createImageActions(flux, {
|
|
60
|
+
* imageAdapter: customImageAdapter
|
|
61
|
+
* });
|
|
62
|
+
*/ export const createImageActions = (flux, options)=>{
|
|
63
|
+
// Initialize adapter state
|
|
64
|
+
let imageAdapterOptions = options?.imageAdapterOptions || {};
|
|
65
|
+
let customImageAdapter = options?.imageAdapter;
|
|
66
|
+
// Create validators that merge custom adapters with defaults
|
|
67
|
+
let validateImage = createImageValidator(customImageAdapter, imageAdapterOptions);
|
|
68
|
+
// Update functions that recreate validators
|
|
69
|
+
const updateImageAdapter = (adapter)=>{
|
|
70
|
+
customImageAdapter = adapter;
|
|
71
|
+
validateImage = createImageValidator(customImageAdapter, imageAdapterOptions);
|
|
72
|
+
};
|
|
73
|
+
const updateImageAdapterOptions = (options)=>{
|
|
74
|
+
imageAdapterOptions = {
|
|
75
|
+
...imageAdapterOptions,
|
|
76
|
+
...options
|
|
77
|
+
};
|
|
78
|
+
validateImage = createImageValidator(customImageAdapter, imageAdapterOptions);
|
|
79
|
+
};
|
|
80
|
+
// Action implementations
|
|
81
|
+
const add = async (image, type = 'image', requestOptions = {})=>{
|
|
82
|
+
try {
|
|
83
|
+
const validatedImage = validateImage(image, imageAdapterOptions);
|
|
84
|
+
const { base64, description, file, fileType, itemId, name, privacy } = validatedImage;
|
|
85
|
+
const parsedDescription = description ? parseString(description, 500) : undefined;
|
|
86
|
+
const parsedItemId = String(itemId || '');
|
|
87
|
+
let uploadPayload;
|
|
88
|
+
if (typeof FormData !== 'undefined' && file instanceof File) {
|
|
89
|
+
const { maxImageSize, maxImageUploadBytes } = getImageUploadConfig(flux);
|
|
90
|
+
const uploadFile = await convertFileToUploadFile(file, maxImageSize, maxImageUploadBytes);
|
|
91
|
+
uploadPayload = new FormData();
|
|
92
|
+
uploadPayload.set('file', uploadFile);
|
|
93
|
+
uploadPayload.set('itemType', type);
|
|
94
|
+
if (parsedDescription) {
|
|
95
|
+
uploadPayload.set('description', parsedDescription);
|
|
96
|
+
}
|
|
97
|
+
if (parsedItemId) {
|
|
98
|
+
uploadPayload.set('itemId', parsedItemId);
|
|
99
|
+
}
|
|
100
|
+
if (uploadFile.type || fileType) {
|
|
101
|
+
uploadPayload.set('fileType', uploadFile.type || fileType);
|
|
102
|
+
}
|
|
103
|
+
if (name) {
|
|
104
|
+
uploadPayload.set('name', name);
|
|
105
|
+
}
|
|
106
|
+
if (privacy) {
|
|
107
|
+
uploadPayload.set('privacy', privacy);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
uploadPayload = {
|
|
111
|
+
base64,
|
|
112
|
+
description: parsedDescription,
|
|
113
|
+
fileType: fileType || 'image/jpeg',
|
|
114
|
+
itemId,
|
|
115
|
+
itemType: type,
|
|
116
|
+
...name ? {
|
|
117
|
+
name
|
|
118
|
+
} : {},
|
|
119
|
+
...privacy ? {
|
|
120
|
+
privacy
|
|
121
|
+
} : {}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const { image: newImage } = await uploadImage(flux, uploadPayload);
|
|
125
|
+
await flux.dispatch({
|
|
126
|
+
image: newImage,
|
|
127
|
+
type: IMAGE_CONSTANTS.ADD_ITEM_SUCCESS
|
|
128
|
+
});
|
|
129
|
+
return newImage;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
flux.dispatch({
|
|
132
|
+
error,
|
|
133
|
+
type: IMAGE_CONSTANTS.ADD_ITEM_ERROR
|
|
134
|
+
});
|
|
135
|
+
throw error;
|
|
136
|
+
} finally{
|
|
137
|
+
await clearCachedRequest(flux, `image.countByItem:${String(image?.itemId || '')}`);
|
|
138
|
+
await clearCachedRequest(flux, `image.listByItem:${String(image?.itemId || '')}`);
|
|
139
|
+
await clearCachedRequest(flux, 'image.listByPersonaReactions');
|
|
140
|
+
await clearCachedRequest(flux, 'image.listByReactions');
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const deleteImage = async (imageId, imageProps = [], requestOptions = {})=>{
|
|
144
|
+
try {
|
|
145
|
+
const queryVariables = {
|
|
146
|
+
imageId: {
|
|
147
|
+
type: 'ID!',
|
|
148
|
+
value: imageId
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const onSuccess = async (data = {})=>{
|
|
152
|
+
const deleteImage = data?.images?.deleteImage || {};
|
|
153
|
+
await flux.dispatch({
|
|
154
|
+
image: deleteImage,
|
|
155
|
+
type: IMAGE_CONSTANTS.REMOVE_ITEM_SUCCESS
|
|
156
|
+
});
|
|
157
|
+
return deleteImage;
|
|
158
|
+
};
|
|
159
|
+
return await appMutation(flux, 'deleteImage', DATA_TYPE, queryVariables, [
|
|
160
|
+
'id',
|
|
161
|
+
...imageProps
|
|
162
|
+
], {
|
|
163
|
+
onSuccess
|
|
164
|
+
});
|
|
165
|
+
} catch (error) {
|
|
166
|
+
flux.dispatch({
|
|
167
|
+
error,
|
|
168
|
+
type: IMAGE_CONSTANTS.REMOVE_ITEM_ERROR
|
|
169
|
+
});
|
|
170
|
+
throw error;
|
|
171
|
+
} finally{
|
|
172
|
+
await clearCachedRequest(flux, `image.getImageById:${imageId}`);
|
|
173
|
+
await clearCachedRequest(flux, 'image.listByPersonaReactions');
|
|
174
|
+
await clearCachedRequest(flux, 'image.listByReactions');
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const update = async (image, type = 'image', requestOptions = {})=>{
|
|
178
|
+
try {
|
|
179
|
+
const validatedImage = validateImage(image, imageAdapterOptions);
|
|
180
|
+
const { base64, description, imageId, itemId, privacy, url } = validatedImage;
|
|
181
|
+
if (imageId && !base64 && !url) {
|
|
182
|
+
const queryVariables = {
|
|
183
|
+
image: {
|
|
184
|
+
type: 'ImagesInput!',
|
|
185
|
+
value: {
|
|
186
|
+
imageId,
|
|
187
|
+
...description ? {
|
|
188
|
+
description: parseString(description, 500)
|
|
189
|
+
} : {},
|
|
190
|
+
...privacy ? {
|
|
191
|
+
privacy
|
|
192
|
+
} : {}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
const onSuccess = async (data = {})=>{
|
|
197
|
+
const updateImage = data?.images?.updateImage || {};
|
|
198
|
+
await flux.dispatch({
|
|
199
|
+
image: updateImage,
|
|
200
|
+
type: IMAGE_CONSTANTS.UPDATE_ITEM_SUCCESS
|
|
201
|
+
});
|
|
202
|
+
return updateImage;
|
|
203
|
+
};
|
|
204
|
+
return await appMutation(flux, 'updateImage', DATA_TYPE, queryVariables, [
|
|
205
|
+
'imageId',
|
|
206
|
+
'privacy',
|
|
207
|
+
'description',
|
|
208
|
+
'thumbUrl',
|
|
209
|
+
'imageUrl'
|
|
210
|
+
], {
|
|
211
|
+
onSuccess
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
const formatImage = {
|
|
215
|
+
base64,
|
|
216
|
+
description: description ? parseString(description, 500) : undefined,
|
|
217
|
+
fileType: 'image/jpeg',
|
|
218
|
+
itemId,
|
|
219
|
+
itemType: type,
|
|
220
|
+
...imageId ? {
|
|
221
|
+
imageId
|
|
222
|
+
} : {},
|
|
223
|
+
...privacy ? {
|
|
224
|
+
privacy
|
|
225
|
+
} : {}
|
|
226
|
+
};
|
|
227
|
+
const { image: newImage } = await uploadImage(flux, formatImage);
|
|
228
|
+
await flux.dispatch({
|
|
229
|
+
image: newImage,
|
|
230
|
+
type: IMAGE_CONSTANTS.ADD_ITEM_SUCCESS
|
|
231
|
+
});
|
|
232
|
+
return newImage;
|
|
233
|
+
} catch (error) {
|
|
234
|
+
flux.dispatch({
|
|
235
|
+
error,
|
|
236
|
+
type: IMAGE_CONSTANTS.ADD_ITEM_ERROR
|
|
237
|
+
});
|
|
238
|
+
throw error;
|
|
239
|
+
} finally{
|
|
240
|
+
await clearCachedRequest(flux, `image.getImageById:${String(image?.imageId || '')}`);
|
|
241
|
+
await clearCachedRequest(flux, `image.countByItem:${String(image?.itemId || '')}`);
|
|
242
|
+
await clearCachedRequest(flux, `image.listByItem:${String(image?.itemId || '')}`);
|
|
243
|
+
await clearCachedRequest(flux, 'image.listByPersonaReactions');
|
|
244
|
+
await clearCachedRequest(flux, 'image.listByReactions');
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
const upload = async (imageFiles, itemId, itemType = 'users', requestOptions = {})=>{
|
|
248
|
+
try {
|
|
249
|
+
const savedImages = await Promise.all(imageFiles.map(async (file)=>{
|
|
250
|
+
const { type: fileType } = file;
|
|
251
|
+
return add({
|
|
252
|
+
file,
|
|
253
|
+
fileType,
|
|
254
|
+
itemId,
|
|
255
|
+
name: file.name
|
|
256
|
+
}, itemType, requestOptions);
|
|
257
|
+
}));
|
|
258
|
+
await flux.dispatch({
|
|
259
|
+
images: savedImages,
|
|
260
|
+
type: IMAGE_CONSTANTS.UPLOAD_ITEM_SUCCESS
|
|
261
|
+
});
|
|
262
|
+
return savedImages;
|
|
263
|
+
} catch (error) {
|
|
264
|
+
flux.dispatch({
|
|
265
|
+
error,
|
|
266
|
+
type: IMAGE_CONSTANTS.UPLOAD_ITEM_ERROR
|
|
267
|
+
});
|
|
268
|
+
throw error;
|
|
269
|
+
} finally{
|
|
270
|
+
await clearCachedRequest(flux, `image.countByItem:${itemId}`);
|
|
271
|
+
await clearCachedRequest(flux, `image.listByItem:${itemId}`);
|
|
272
|
+
await clearCachedRequest(flux, 'image.listByPersonaReactions');
|
|
273
|
+
await clearCachedRequest(flux, 'image.listByReactions');
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
const countByItem = async (itemId, requestOptions = {})=>{
|
|
277
|
+
try {
|
|
278
|
+
const cachedResult = getCachedRequest(flux, `image.countByItem:${itemId}`, {
|
|
279
|
+
itemId
|
|
280
|
+
}, requestOptions);
|
|
281
|
+
if (cachedResult !== undefined) {
|
|
282
|
+
return cachedResult;
|
|
283
|
+
}
|
|
284
|
+
const queryVariables = {
|
|
285
|
+
itemId: {
|
|
286
|
+
type: 'ID!',
|
|
287
|
+
value: itemId
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
const onSuccess = (data = {})=>{
|
|
291
|
+
const count = data?.imageCount ?? 0;
|
|
292
|
+
return flux.dispatch({
|
|
293
|
+
itemId,
|
|
294
|
+
count,
|
|
295
|
+
type: IMAGE_CONSTANTS.GET_COUNT_SUCCESS
|
|
296
|
+
});
|
|
297
|
+
};
|
|
298
|
+
const result = await appQuery(flux, 'imageCount', DATA_TYPE, queryVariables, [
|
|
299
|
+
'count'
|
|
300
|
+
], {
|
|
301
|
+
onSuccess
|
|
302
|
+
});
|
|
303
|
+
return await setCachedRequest(flux, `image.countByItem:${itemId}`, {
|
|
304
|
+
itemId
|
|
305
|
+
}, result, requestOptions);
|
|
306
|
+
} catch (error) {
|
|
307
|
+
flux.dispatch({
|
|
308
|
+
error,
|
|
309
|
+
type: IMAGE_CONSTANTS.GET_COUNT_ERROR
|
|
310
|
+
});
|
|
311
|
+
throw error;
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
const getImageById = async (imageId, imageProps = [], requestOptions = {})=>{
|
|
315
|
+
try {
|
|
316
|
+
const cachedResult = getCachedRequest(flux, `image.getImageById:${imageId}`, {
|
|
317
|
+
imageId,
|
|
318
|
+
imageProps
|
|
319
|
+
}, requestOptions);
|
|
320
|
+
if (cachedResult !== undefined) {
|
|
321
|
+
return cachedResult;
|
|
322
|
+
}
|
|
323
|
+
const queryVariables = {
|
|
324
|
+
imageId: {
|
|
325
|
+
type: 'ID!',
|
|
326
|
+
value: imageId
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const onSuccess = async (data = {})=>{
|
|
330
|
+
const imagesData = data?.images || {};
|
|
331
|
+
const image = imagesData?.getImageById || {};
|
|
332
|
+
await flux.dispatch({
|
|
333
|
+
image,
|
|
334
|
+
type: IMAGE_CONSTANTS.GET_ITEM_SUCCESS
|
|
335
|
+
});
|
|
336
|
+
return image;
|
|
337
|
+
};
|
|
338
|
+
const result = await appQuery(flux, 'getImageById', DATA_TYPE, queryVariables, [
|
|
339
|
+
'color',
|
|
340
|
+
'description',
|
|
341
|
+
'height',
|
|
342
|
+
'imageId',
|
|
343
|
+
'imageUrl',
|
|
344
|
+
'itemId',
|
|
345
|
+
'likeCount',
|
|
346
|
+
'privacy',
|
|
347
|
+
'thumbUrl',
|
|
348
|
+
'width',
|
|
349
|
+
...imageProps
|
|
350
|
+
], {
|
|
351
|
+
onSuccess
|
|
352
|
+
});
|
|
353
|
+
return await setCachedRequest(flux, `image.getImageById:${imageId}`, {
|
|
354
|
+
imageId,
|
|
355
|
+
imageProps
|
|
356
|
+
}, result, requestOptions);
|
|
357
|
+
} catch (error) {
|
|
358
|
+
flux.dispatch({
|
|
359
|
+
error,
|
|
360
|
+
type: IMAGE_CONSTANTS.GET_ITEM_ERROR
|
|
361
|
+
});
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
const listByItem = async (itemId, itemType = 'users', from = 0, to = 10, imageProps = [], requestOptions = {})=>{
|
|
366
|
+
try {
|
|
367
|
+
const cachedResult = getCachedRequest(flux, `image.listByItem:${itemId}`, {
|
|
368
|
+
from,
|
|
369
|
+
imageProps,
|
|
370
|
+
itemId,
|
|
371
|
+
itemType,
|
|
372
|
+
to
|
|
373
|
+
}, requestOptions);
|
|
374
|
+
if (cachedResult) {
|
|
375
|
+
return cachedResult;
|
|
376
|
+
}
|
|
377
|
+
const queryVariables = {
|
|
378
|
+
from: {
|
|
379
|
+
type: 'Int',
|
|
380
|
+
value: from
|
|
381
|
+
},
|
|
382
|
+
itemId: {
|
|
383
|
+
type: 'ID!',
|
|
384
|
+
value: itemId
|
|
385
|
+
},
|
|
386
|
+
itemType: {
|
|
387
|
+
type: 'String',
|
|
388
|
+
value: itemType
|
|
389
|
+
},
|
|
390
|
+
to: {
|
|
391
|
+
type: 'Int',
|
|
392
|
+
value: to
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
const onSuccess = async (data = {})=>{
|
|
396
|
+
const imagesData = data?.images || {};
|
|
397
|
+
const imagesByItem = Array.isArray(imagesData?.getImageListByItem) ? imagesData.getImageListByItem || [] : [];
|
|
398
|
+
await flux.dispatch({
|
|
399
|
+
itemId,
|
|
400
|
+
list: imagesByItem,
|
|
401
|
+
type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
|
|
402
|
+
});
|
|
403
|
+
return imagesByItem;
|
|
404
|
+
};
|
|
405
|
+
const result = await appQuery(flux, 'getImageListByItem', DATA_TYPE, queryVariables, [
|
|
406
|
+
'color',
|
|
407
|
+
'description',
|
|
408
|
+
'height',
|
|
409
|
+
'imageId',
|
|
410
|
+
'imageUrl',
|
|
411
|
+
'likeCount',
|
|
412
|
+
'privacy',
|
|
413
|
+
'thumbUrl',
|
|
414
|
+
'width',
|
|
415
|
+
...imageProps
|
|
416
|
+
], {
|
|
417
|
+
onSuccess
|
|
418
|
+
});
|
|
419
|
+
return await setCachedRequest(flux, `image.listByItem:${itemId}`, {
|
|
420
|
+
from,
|
|
421
|
+
imageProps,
|
|
422
|
+
itemId,
|
|
423
|
+
itemType,
|
|
424
|
+
to
|
|
425
|
+
}, result, requestOptions);
|
|
426
|
+
} catch (error) {
|
|
427
|
+
flux.dispatch({
|
|
428
|
+
error,
|
|
429
|
+
type: IMAGE_CONSTANTS.GET_LIST_ERROR
|
|
430
|
+
});
|
|
431
|
+
throw error;
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
const listByReactions = async (reactions, from = 0, to = 10, imageProps = [], requestOptions = {})=>{
|
|
435
|
+
try {
|
|
436
|
+
const cachedResult = getCachedRequest(flux, 'image.listByReactions', {
|
|
437
|
+
from,
|
|
438
|
+
imageProps,
|
|
439
|
+
reactions,
|
|
440
|
+
to
|
|
441
|
+
}, requestOptions);
|
|
442
|
+
if (cachedResult) {
|
|
443
|
+
return cachedResult;
|
|
444
|
+
}
|
|
445
|
+
const queryVariables = {
|
|
446
|
+
from: {
|
|
447
|
+
type: 'Int',
|
|
448
|
+
value: from
|
|
449
|
+
},
|
|
450
|
+
reactions: {
|
|
451
|
+
type: '[String!]',
|
|
452
|
+
value: reactions
|
|
453
|
+
},
|
|
454
|
+
to: {
|
|
455
|
+
type: 'Int',
|
|
456
|
+
value: to
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
const onSuccess = (data = {})=>{
|
|
460
|
+
const imagesData = data?.images || {};
|
|
461
|
+
const imagesByReactions = Array.isArray(imagesData?.imagesByReactions) ? imagesData.imagesByReactions || [] : [];
|
|
462
|
+
return flux.dispatch({
|
|
463
|
+
list: imagesByReactions,
|
|
464
|
+
type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
|
|
465
|
+
});
|
|
466
|
+
};
|
|
467
|
+
const result = await appQuery(flux, 'imagesByReactions', DATA_TYPE, queryVariables, [
|
|
468
|
+
'color',
|
|
469
|
+
'description',
|
|
470
|
+
'height',
|
|
471
|
+
'imageId',
|
|
472
|
+
'imageUrl',
|
|
473
|
+
'likeCount',
|
|
474
|
+
'privacy',
|
|
475
|
+
'thumbUrl',
|
|
476
|
+
'width',
|
|
477
|
+
...imageProps
|
|
478
|
+
], {
|
|
479
|
+
onSuccess
|
|
480
|
+
});
|
|
481
|
+
return await setCachedRequest(flux, 'image.listByReactions', {
|
|
482
|
+
from,
|
|
483
|
+
imageProps,
|
|
484
|
+
reactions,
|
|
485
|
+
to
|
|
486
|
+
}, result, requestOptions);
|
|
487
|
+
} catch (error) {
|
|
488
|
+
flux.dispatch({
|
|
489
|
+
error,
|
|
490
|
+
type: IMAGE_CONSTANTS.GET_LIST_ERROR
|
|
491
|
+
});
|
|
492
|
+
throw error;
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
const listByPersonaReactions = async (personaId, reactions, from = 0, to = 30, imageProps = [], listKey = `persona:${personaId}:savedPhotos`, requestOptions = {})=>{
|
|
496
|
+
try {
|
|
497
|
+
const cachedResult = getCachedRequest(flux, 'image.listByPersonaReactions', {
|
|
498
|
+
from,
|
|
499
|
+
imageProps,
|
|
500
|
+
listKey,
|
|
501
|
+
personaId,
|
|
502
|
+
reactions,
|
|
503
|
+
to
|
|
504
|
+
}, requestOptions);
|
|
505
|
+
if (cachedResult !== undefined) {
|
|
506
|
+
await flux.dispatch({
|
|
507
|
+
itemId: listKey,
|
|
508
|
+
list: cachedResult,
|
|
509
|
+
personaId,
|
|
510
|
+
reactions,
|
|
511
|
+
type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
|
|
512
|
+
});
|
|
513
|
+
return cachedResult;
|
|
514
|
+
}
|
|
515
|
+
const queryVariables = {
|
|
516
|
+
from: {
|
|
517
|
+
type: 'Int',
|
|
518
|
+
value: from
|
|
519
|
+
},
|
|
520
|
+
personaId: {
|
|
521
|
+
type: 'ID',
|
|
522
|
+
value: personaId
|
|
523
|
+
},
|
|
524
|
+
reactions: {
|
|
525
|
+
type: '[String!]',
|
|
526
|
+
value: reactions
|
|
527
|
+
},
|
|
528
|
+
to: {
|
|
529
|
+
type: 'Int',
|
|
530
|
+
value: to
|
|
531
|
+
}
|
|
532
|
+
};
|
|
533
|
+
const onSuccess = async (data = {})=>{
|
|
534
|
+
const imagesData = data?.images || {};
|
|
535
|
+
const imagesByPersonaReactions = Array.isArray(imagesData?.imagesByPersonaReactions) ? imagesData.imagesByPersonaReactions || [] : [];
|
|
536
|
+
await flux.dispatch({
|
|
537
|
+
itemId: listKey,
|
|
538
|
+
list: imagesByPersonaReactions,
|
|
539
|
+
personaId,
|
|
540
|
+
reactions,
|
|
541
|
+
type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
|
|
542
|
+
});
|
|
543
|
+
return imagesByPersonaReactions;
|
|
544
|
+
};
|
|
545
|
+
const result = await appQuery(flux, 'imagesByPersonaReactions', DATA_TYPE, queryVariables, [
|
|
546
|
+
'color',
|
|
547
|
+
'description',
|
|
548
|
+
'height',
|
|
549
|
+
'imageId',
|
|
550
|
+
'imageUrl',
|
|
551
|
+
'likeCount',
|
|
552
|
+
'privacy',
|
|
553
|
+
'thumbUrl',
|
|
554
|
+
'width',
|
|
555
|
+
...imageProps
|
|
556
|
+
], {
|
|
557
|
+
onSuccess
|
|
558
|
+
});
|
|
559
|
+
return await setCachedRequest(flux, 'image.listByPersonaReactions', {
|
|
560
|
+
from,
|
|
561
|
+
imageProps,
|
|
562
|
+
listKey,
|
|
563
|
+
personaId,
|
|
564
|
+
reactions,
|
|
565
|
+
to
|
|
566
|
+
}, result, requestOptions);
|
|
567
|
+
} catch (error) {
|
|
568
|
+
flux.dispatch({
|
|
569
|
+
error,
|
|
570
|
+
itemId: listKey,
|
|
571
|
+
personaId,
|
|
572
|
+
reactions,
|
|
573
|
+
type: IMAGE_CONSTANTS.GET_LIST_ERROR
|
|
574
|
+
});
|
|
575
|
+
throw error;
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
return {
|
|
579
|
+
add,
|
|
580
|
+
delete: deleteImage,
|
|
581
|
+
getImageById,
|
|
582
|
+
update,
|
|
583
|
+
upload,
|
|
584
|
+
countByItem,
|
|
585
|
+
listByItem,
|
|
586
|
+
listByPersonaReactions,
|
|
587
|
+
listByReactions,
|
|
588
|
+
updateImageAdapter,
|
|
589
|
+
updateImageAdapterOptions
|
|
590
|
+
};
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9pbWFnZUFjdGlvbnMvaW1hZ2VBY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyBwYXJzZVN0cmluZyB9IGZyb20gJ0BubGFicy91dGlscyc7XG5cbmltcG9ydCB7IHZhbGlkYXRlSW1hZ2VJbnB1dCB9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL2ltYWdlQWRhcHRlci9pbWFnZUFkYXB0ZXIuanMnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnRnJvbUZsdXggfSBmcm9tICcuLi8uLi91dGlscy9jb25maWdVdGlscy5qcyc7XG5pbXBvcnQgeyBJTUFHRV9DT05TVEFOVFMgfSBmcm9tICcuLi8uLi9zdG9yZXMvaW1hZ2VTdG9yZS5qcyc7XG5pbXBvcnQgeyBhcHBNdXRhdGlvbiwgYXBwUXVlcnksIHVwbG9hZEltYWdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7IGNvbnZlcnRGaWxlVG9VcGxvYWRGaWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQgeyBjbGVhckNhY2hlZFJlcXVlc3QsIGdldENhY2hlZFJlcXVlc3QsIHNldENhY2hlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEZsdXhBY3Rpb24sIEZsdXhGcmFtZXdvcmsgfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZVR5cGUgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9pbWFnZUFkYXB0ZXIvaW1hZ2VBZGFwdGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQXBpUmVzdWx0c1R5cGUgfSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3Rpb25SZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICdpbWFnZXMnO1xuXG5jb25zdCBnZXRJbWFnZVVwbG9hZENvbmZpZyA9IChmbHV4OiBGbHV4RnJhbWV3b3JrKToge21heEltYWdlU2l6ZTogbnVtYmVyOyBtYXhJbWFnZVVwbG9hZEJ5dGVzOiBudW1iZXJ9ID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbUZsdXgoZmx1eCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRNYXhJbWFnZVNpemUgPSBOdW1iZXIoXG4gICAgKGNvbmZpZyBhcyBhbnkpPy5hcHA/LmltYWdlcz8ubWF4SW1hZ2VTaXplXG4gICAgfHwgKGNvbmZpZyBhcyBhbnkpPy5tYXhJbWFnZVNpemVcbiAgICB8fCAxMjAwXG4gICk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRNYXhJbWFnZVVwbG9hZEJ5dGVzID0gTnVtYmVyKFxuICAgIChjb25maWcgYXMgYW55KT8uYXBwPy5pbWFnZXM/Lm1heEltYWdlVXBsb2FkQnl0ZXNcbiAgICB8fCAoY29uZmlnIGFzIGFueSk/Lm1heEltYWdlVXBsb2FkQnl0ZXNcbiAgICB8fCA5MDAgKiAxMDI0XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXhJbWFnZVNpemU6IE51bWJlci5pc0Zpbml0ZShjb25maWd1cmVkTWF4SW1hZ2VTaXplKSAmJiBjb25maWd1cmVkTWF4SW1hZ2VTaXplID4gMFxuICAgICAgPyBjb25maWd1cmVkTWF4SW1hZ2VTaXplXG4gICAgICA6IDEyMDAsXG4gICAgbWF4SW1hZ2VVcGxvYWRCeXRlczogTnVtYmVyLmlzRmluaXRlKGNvbmZpZ3VyZWRNYXhJbWFnZVVwbG9hZEJ5dGVzKSAmJiBjb25maWd1cmVkTWF4SW1hZ2VVcGxvYWRCeXRlcyA+IDBcbiAgICAgID8gY29uZmlndXJlZE1heEltYWdlVXBsb2FkQnl0ZXNcbiAgICAgIDogOTAwICogMTAyNFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUFkYXB0ZXJPcHRpb25zIHtcbiAgc3RyaWN0PzogYm9vbGVhbjtcbiAgYWxsb3dQYXJ0aWFsPzogYm9vbGVhbjtcbiAgZW52aXJvbm1lbnQ/OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nIHwgJ3Rlc3QnO1xuICBjdXN0b21WYWxpZGF0aW9uPzogKGlucHV0OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQWN0aW9uc09wdGlvbnMge1xuICBpbWFnZUFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zKSA9PiBhbnk7XG4gIGltYWdlQWRhcHRlck9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgdHlwZSBJbWFnZUFwaVJlc3VsdHNUeXBlID0ge1xuICBhZGRJbWFnZTogSW1hZ2VUeXBlO1xuICBkZWxldGVJbWFnZTogSW1hZ2VUeXBlO1xuICBpbWFnZTogSW1hZ2VUeXBlO1xuICBnZXRJbWFnZUJ5SWQ6IEltYWdlVHlwZTtcbiAgZ2V0SW1hZ2VMaXN0QnlJdGVtOiBJbWFnZVR5cGVbXTtcbiAgaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zOiBJbWFnZVR5cGVbXTtcbiAgZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnM6IEltYWdlVHlwZVtdO1xuICB1cGRhdGVJbWFnZTogSW1hZ2VUeXBlO1xuICB1cGxvYWRGaWxlSW1hZ2VzOiBJbWFnZVR5cGVbXTtcbiAgZ2V0SW1hZ2VDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUFjdGlvbnMge1xuICBhZGQ6IChpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LCB0eXBlPzogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIGRlbGV0ZTogKGltYWdlSWQ6IHN0cmluZywgaW1hZ2VQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIGdldEltYWdlQnlJZDogKGltYWdlSWQ6IHN0cmluZywgaW1hZ2VQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIHVwZGF0ZTogKGltYWdlOiBQYXJ0aWFsPEltYWdlVHlwZT4sIHR5cGU/OiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlPjtcbiAgdXBsb2FkOiAoaW1hZ2VGaWxlczogRmlsZVtdLCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU/OiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBjb3VudEJ5SXRlbTogKGl0ZW1JZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPG51bWJlcj47XG4gIGxpc3RCeUl0ZW06IChpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU/OiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBpbWFnZVByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBsaXN0QnlQZXJzb25hUmVhY3Rpb25zOiAocGVyc29uYUlkOiBzdHJpbmcsIHJlYWN0aW9uczogc3RyaW5nW10sIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBpbWFnZVByb3BzPzogc3RyaW5nW10sIGxpc3RLZXk/OiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBsaXN0QnlSZWFjdGlvbnM6IChyZWFjdGlvbnM6IHN0cmluZ1tdLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgaW1hZ2VQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZVtdPjtcbiAgdXBkYXRlSW1hZ2VBZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVJbWFnZUFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5jb25zdCBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zKSA9PiB2YWxpZGF0ZUltYWdlSW5wdXQoaW5wdXQpO1xuXG4vLyBFbmhhbmNlZCB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIGN1c3RvbSBsb2dpYyB3aXRoIGRlZmF1bHRzXG5jb25zdCBjcmVhdGVJbWFnZVZhbGlkYXRvciA9IChcbiAgY3VzdG9tQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSxcbiAgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnNcbikgPT4gKGlucHV0OiB1bmtub3duLCB2YWxpZGF0b3JPcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gey4uLm9wdGlvbnMsIC4uLnZhbGlkYXRvck9wdGlvbnN9O1xuXG4gIC8vIFN0YXJ0IHdpdGggZGVmYXVsdCB2YWxpZGF0aW9uXG4gIGxldCB2YWxpZGF0ZWQgPSBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IoaW5wdXQsIG1lcmdlZE9wdGlvbnMpO1xuXG4gIC8vIEFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIGlmIHByb3ZpZGVkXG4gIGlmKGN1c3RvbUFkYXB0ZXIpIHtcbiAgICB2YWxpZGF0ZWQgPSBjdXN0b21BZGFwdGVyKHZhbGlkYXRlZCwgbWVyZ2VkT3B0aW9ucyk7XG4gIH1cblxuICAvLyBBcHBseSBjdXN0b20gdmFsaWRhdGlvbiBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWRcbiAgaWYobWVyZ2VkT3B0aW9ucz8uY3VzdG9tVmFsaWRhdGlvbikge1xuICAgIHZhbGlkYXRlZCA9IG1lcmdlZE9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbih2YWxpZGF0ZWQpIGFzIEltYWdlVHlwZTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59O1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIEltYWdlQWN0aW9ucyB3aXRoIGVuaGFuY2VkIGFkYXB0ZXIgaW5qZWN0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEN1c3RvbSBhZGFwdGVycyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBiZWhhdmlvciwgYWxsb3dpbmcgcGFydGlhbCBvdmVycmlkZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCBhZGFwdGVyc1xuICogY29uc3QgaW1hZ2VBY3Rpb25zID0gY3JlYXRlSW1hZ2VBY3Rpb25zKGZsdXgpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gYWRhcHRlciB0aGF0IGV4dGVuZHMgZGVmYXVsdCBiZWhhdmlvclxuICogY29uc3QgY3VzdG9tSW1hZ2VBZGFwdGVyID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICogICAvLyBpbnB1dCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSBkZWZhdWx0IGFkYXB0ZXJcbiAqICAgaWYgKGlucHV0LmZpbGVTaXplICYmIGlucHV0LmZpbGVTaXplID4gNTAwMDAwMCkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZmlsZSB0b28gbGFyZ2UnKTtcbiAqICAgfVxuICogICByZXR1cm4gaW5wdXQ7XG4gKiB9O1xuICpcbiAqIGNvbnN0IGltYWdlQWN0aW9ucyA9IGNyZWF0ZUltYWdlQWN0aW9ucyhmbHV4LCB7XG4gKiAgIGltYWdlQWRhcHRlcjogY3VzdG9tSW1hZ2VBZGFwdGVyXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUltYWdlQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IEltYWdlQWN0aW9uc09wdGlvbnNcbik6IEltYWdlQWN0aW9ucyA9PiB7XG4gIC8vIEluaXRpYWxpemUgYWRhcHRlciBzdGF0ZVxuICBsZXQgaW1hZ2VBZGFwdGVyT3B0aW9ucyA9IG9wdGlvbnM/LmltYWdlQWRhcHRlck9wdGlvbnMgfHwge307XG4gIGxldCBjdXN0b21JbWFnZUFkYXB0ZXIgPSBvcHRpb25zPy5pbWFnZUFkYXB0ZXI7XG5cbiAgLy8gQ3JlYXRlIHZhbGlkYXRvcnMgdGhhdCBtZXJnZSBjdXN0b20gYWRhcHRlcnMgd2l0aCBkZWZhdWx0c1xuICBsZXQgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG5cbiAgLy8gVXBkYXRlIGZ1bmN0aW9ucyB0aGF0IHJlY3JlYXRlIHZhbGlkYXRvcnNcbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyID0gKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSk6IHZvaWQgPT4ge1xuICAgIGN1c3RvbUltYWdlQWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZUFkYXB0ZXJPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgaW1hZ2VBZGFwdGVyT3B0aW9ucyA9IHsuLi5pbWFnZUFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICB2YWxpZGF0ZUltYWdlID0gY3JlYXRlSW1hZ2VWYWxpZGF0b3IoY3VzdG9tSW1hZ2VBZGFwdGVyLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgfTtcblxuICAvLyBBY3Rpb24gaW1wbGVtZW50YXRpb25zXG4gIGNvbnN0IGFkZCA9IGFzeW5jIChcbiAgICBpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LFxuICAgIHR5cGU6IHN0cmluZyA9ICdpbWFnZScsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkSW1hZ2UgPSB2YWxpZGF0ZUltYWdlKGltYWdlLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IHtiYXNlNjQsIGRlc2NyaXB0aW9uLCBmaWxlLCBmaWxlVHlwZSwgaXRlbUlkLCBuYW1lLCBwcml2YWN5fSA9IHZhbGlkYXRlZEltYWdlO1xuICAgICAgY29uc3QgcGFyc2VkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/IHBhcnNlU3RyaW5nKGRlc2NyaXB0aW9uLCA1MDApIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcGFyc2VkSXRlbUlkID0gU3RyaW5nKGl0ZW1JZCB8fCAnJyk7XG4gICAgICBsZXQgdXBsb2FkUGF5bG9hZDogRm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgaWYodHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyAmJiBmaWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBjb25zdCB7bWF4SW1hZ2VTaXplLCBtYXhJbWFnZVVwbG9hZEJ5dGVzfSA9IGdldEltYWdlVXBsb2FkQ29uZmlnKGZsdXgpO1xuICAgICAgICBjb25zdCB1cGxvYWRGaWxlID0gYXdhaXQgY29udmVydEZpbGVUb1VwbG9hZEZpbGUoZmlsZSwgbWF4SW1hZ2VTaXplLCBtYXhJbWFnZVVwbG9hZEJ5dGVzKTtcbiAgICAgICAgdXBsb2FkUGF5bG9hZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB1cGxvYWRQYXlsb2FkLnNldCgnZmlsZScsIHVwbG9hZEZpbGUpO1xuICAgICAgICB1cGxvYWRQYXlsb2FkLnNldCgnaXRlbVR5cGUnLCB0eXBlKTtcblxuICAgICAgICBpZihwYXJzZWREZXNjcmlwdGlvbikge1xuICAgICAgICAgIHVwbG9hZFBheWxvYWQuc2V0KCdkZXNjcmlwdGlvbicsIHBhcnNlZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHBhcnNlZEl0ZW1JZCkge1xuICAgICAgICAgIHVwbG9hZFBheWxvYWQuc2V0KCdpdGVtSWQnLCBwYXJzZWRJdGVtSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodXBsb2FkRmlsZS50eXBlIHx8IGZpbGVUeXBlKSB7XG4gICAgICAgICAgdXBsb2FkUGF5bG9hZC5zZXQoJ2ZpbGVUeXBlJywgdXBsb2FkRmlsZS50eXBlIHx8IGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUpIHtcbiAgICAgICAgICB1cGxvYWRQYXlsb2FkLnNldCgnbmFtZScsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocHJpdmFjeSkge1xuICAgICAgICAgIHVwbG9hZFBheWxvYWQuc2V0KCdwcml2YWN5JywgcHJpdmFjeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwbG9hZFBheWxvYWQgPSB7XG4gICAgICAgICAgYmFzZTY0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwYXJzZWREZXNjcmlwdGlvbixcbiAgICAgICAgICBmaWxlVHlwZTogZmlsZVR5cGUgfHwgJ2ltYWdlL2pwZWcnLFxuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBpdGVtVHlwZTogdHlwZSxcbiAgICAgICAgICAuLi4obmFtZSA/IHtuYW1lfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocHJpdmFjeSA/IHtwcml2YWN5fSA6IHt9KVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7aW1hZ2U6IG5ld0ltYWdlfSA9IGF3YWl0IHVwbG9hZEltYWdlKGZsdXgsIHVwbG9hZFBheWxvYWQpO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7aW1hZ2U6IG5ld0ltYWdlLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTU30pO1xuICAgICAgcmV0dXJuIG5ld0ltYWdlIGFzIEltYWdlVHlwZTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkFERF9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGBpbWFnZS5jb3VudEJ5SXRlbToke1N0cmluZyhpbWFnZT8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UubGlzdEJ5SXRlbToke1N0cmluZyhpbWFnZT8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UGVyc29uYVJlYWN0aW9ucycpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICdpbWFnZS5saXN0QnlSZWFjdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlSW1hZ2UgPSBhc3luYyAoXG4gICAgaW1hZ2VJZDogc3RyaW5nLFxuICAgIGltYWdlUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGltYWdlSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogaW1hZ2VJZFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGVJbWFnZSA9IChkYXRhIGFzIHtpbWFnZXM/OiB7ZGVsZXRlSW1hZ2U/OiBJbWFnZVR5cGV9fSk/LmltYWdlcz8uZGVsZXRlSW1hZ2UgfHwge307XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlOiBkZWxldGVJbWFnZSwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLlJFTU9WRV9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUltYWdlIGFzIHVua25vd24gYXMgRmx1eEFjdGlvbjtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxJbWFnZVR5cGU+KGZsdXgsICdkZWxldGVJbWFnZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFsnaWQnLCAuLi5pbWFnZVByb3BzXSwge29uU3VjY2Vzc30pO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuUkVNT1ZFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmdldEltYWdlQnlJZDoke2ltYWdlSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZSA9IGFzeW5jIChcbiAgICBpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LFxuICAgIHR5cGU6IHN0cmluZyA9ICdpbWFnZScsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkSW1hZ2UgPSB2YWxpZGF0ZUltYWdlKGltYWdlLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IHtiYXNlNjQsIGRlc2NyaXB0aW9uLCBpbWFnZUlkLCBpdGVtSWQsIHByaXZhY3ksIHVybH0gPSB2YWxpZGF0ZWRJbWFnZTtcblxuICAgICAgaWYoaW1hZ2VJZCAmJiAhYmFzZTY0ICYmICF1cmwpIHtcbiAgICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICdJbWFnZXNJbnB1dCEnLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8ge2Rlc2NyaXB0aW9uOiBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKX0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcml2YWN5ID8ge3ByaXZhY3l9IDoge30pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlSW1hZ2UgPSAoZGF0YSBhcyB7aW1hZ2VzPzoge3VwZGF0ZUltYWdlPzogSW1hZ2VUeXBlfX0pPy5pbWFnZXM/LnVwZGF0ZUltYWdlIHx8IHt9O1xuICAgICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlOiB1cGRhdGVJbWFnZSwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlSW1hZ2UgYXMgdW5rbm93biBhcyBGbHV4QWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxJbWFnZVR5cGU+KFxuICAgICAgICAgIGZsdXgsXG4gICAgICAgICAgJ3VwZGF0ZUltYWdlJyxcbiAgICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgICAgWydpbWFnZUlkJywgJ3ByaXZhY3knLCAnZGVzY3JpcHRpb24nLCAndGh1bWJVcmwnLCAnaW1hZ2VVcmwnXSxcbiAgICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRJbWFnZSA9IHtcbiAgICAgICAgYmFzZTY0LFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gPyBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgICAgaXRlbUlkLFxuICAgICAgICBpdGVtVHlwZTogdHlwZSxcbiAgICAgICAgLi4uKGltYWdlSWQgPyB7aW1hZ2VJZH0gOiB7fSksXG4gICAgICAgIC4uLihwcml2YWN5ID8ge3ByaXZhY3l9IDoge30pXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7aW1hZ2U6IG5ld0ltYWdlfSA9IGF3YWl0IHVwbG9hZEltYWdlKGZsdXgsIGZvcm1hdEltYWdlKTtcbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlOiBuZXdJbWFnZSwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIHJldHVybiBuZXdJbWFnZSBhcyBJbWFnZVR5cGU7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5BRERfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UuZ2V0SW1hZ2VCeUlkOiR7U3RyaW5nKGltYWdlPy5pbWFnZUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UuY291bnRCeUl0ZW06JHtTdHJpbmcoaW1hZ2U/Lml0ZW1JZCB8fCAnJyl9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmxpc3RCeUl0ZW06JHtTdHJpbmcoaW1hZ2U/Lml0ZW1JZCB8fCAnJyl9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVwbG9hZCA9IGFzeW5jIChcbiAgICBpbWFnZUZpbGVzOiBGaWxlW10sXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgaXRlbVR5cGU6IHN0cmluZyA9ICd1c2VycycsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZEltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBpbWFnZUZpbGVzLm1hcChhc3luYyAoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHt0eXBlOiBmaWxlVHlwZX0gPSBmaWxlO1xuICAgICAgICAgIHJldHVybiBhZGQoe1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lXG4gICAgICAgICAgfSwgaXRlbVR5cGUsIHJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlczogc2F2ZWRJbWFnZXMsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9TVUNDRVNTfSk7XG4gICAgICByZXR1cm4gc2F2ZWRJbWFnZXM7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UuY291bnRCeUl0ZW06JHtpdGVtSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmxpc3RCeUl0ZW06JHtpdGVtSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvdW50QnlJdGVtID0gYXN5bmMgKGl0ZW1JZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8bnVtYmVyPihmbHV4LCBgaW1hZ2UuY291bnRCeUl0ZW06JHtpdGVtSWR9YCwge2l0ZW1JZH0sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGl0ZW1JZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBpdGVtSWRcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSBkYXRhPy5pbWFnZUNvdW50ID8/IDA7XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtpdGVtSWQsIGNvdW50LCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0NPVU5UX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PG51bWJlcj4oZmx1eCwgJ2ltYWdlQ291bnQnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbJ2NvdW50J10sIHtvblN1Y2Nlc3N9KTtcbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KGZsdXgsIGBpbWFnZS5jb3VudEJ5SXRlbToke2l0ZW1JZH1gLCB7aXRlbUlkfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfQ09VTlRfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRJbWFnZUJ5SWQgPSBhc3luYyAoXG4gICAgaW1hZ2VJZDogc3RyaW5nLFxuICAgIGltYWdlUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxJbWFnZVR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICBgaW1hZ2UuZ2V0SW1hZ2VCeUlkOiR7aW1hZ2VJZH1gLFxuICAgICAgICB7aW1hZ2VJZCwgaW1hZ2VQcm9wc30sXG4gICAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgICApO1xuXG4gICAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgaW1hZ2VJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBpbWFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGltYWdlc0RhdGEgPSAoZGF0YSBhcyB7aW1hZ2VzPzoge2dldEltYWdlQnlJZD86IEltYWdlVHlwZX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlc0RhdGE/LmdldEltYWdlQnlJZCB8fCB7fTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9JVEVNX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbWFnZSBhcyB1bmtub3duIGFzIEZsdXhBY3Rpb247XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxJbWFnZVR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZ2V0SW1hZ2VCeUlkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAnaW1hZ2VJZCcsXG4gICAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgICAnaXRlbUlkJyxcbiAgICAgICAgICAnbGlrZUNvdW50JyxcbiAgICAgICAgICAncHJpdmFjeScsXG4gICAgICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLmltYWdlUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KGZsdXgsIGBpbWFnZS5nZXRJbWFnZUJ5SWQ6JHtpbWFnZUlkfWAsIHtpbWFnZUlkLCBpbWFnZVByb3BzfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgaXRlbVR5cGU6IHN0cmluZyA9ICd1c2VycycsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgaW1hZ2VQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8SW1hZ2VUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICBgaW1hZ2UubGlzdEJ5SXRlbToke2l0ZW1JZH1gLFxuICAgICAgICB7ZnJvbSwgaW1hZ2VQcm9wcywgaXRlbUlkLCBpdGVtVHlwZSwgdG99LFxuICAgICAgICByZXF1ZXN0T3B0aW9uc1xuICAgICAgKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IGZyb21cbiAgICAgICAgfSxcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IGl0ZW1JZFxuICAgICAgICB9LFxuICAgICAgICBpdGVtVHlwZToge1xuICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgIHZhbHVlOiBpdGVtVHlwZVxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiB0b1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBpbWFnZXNEYXRhID0gKGRhdGEgYXMge2ltYWdlcz86IHtnZXRJbWFnZUxpc3RCeUl0ZW0/OiBJbWFnZVR5cGVbXX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZXNCeUl0ZW0gPSBBcnJheS5pc0FycmF5KGltYWdlc0RhdGE/LmdldEltYWdlTGlzdEJ5SXRlbSlcbiAgICAgICAgICA/IGltYWdlc0RhdGEuZ2V0SW1hZ2VMaXN0QnlJdGVtIHx8IFtdXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgIGxpc3Q6IGltYWdlc0J5SXRlbSxcbiAgICAgICAgICB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGltYWdlc0J5SXRlbSBhcyB1bmtub3duIGFzIEZsdXhBY3Rpb247XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxJbWFnZVR5cGVbXT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdnZXRJbWFnZUxpc3RCeUl0ZW0nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICdpbWFnZUlkJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdsaWtlQ291bnQnLFxuICAgICAgICAgICdwcml2YWN5JyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgLi4uaW1hZ2VQcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmxpc3RCeUl0ZW06JHtpdGVtSWR9YCwge2Zyb20sIGltYWdlUHJvcHMsIGl0ZW1JZCwgaXRlbVR5cGUsIHRvfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgICByZWFjdGlvbnM6IHN0cmluZ1tdLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIGltYWdlUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PEltYWdlVHlwZVtdPihmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJywge2Zyb20sIGltYWdlUHJvcHMsIHJlYWN0aW9ucywgdG99LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiBmcm9tXG4gICAgICAgIH0sXG4gICAgICAgIHJlYWN0aW9uczoge1xuICAgICAgICAgIHR5cGU6ICdbU3RyaW5nIV0nLFxuICAgICAgICAgIHZhbHVlOiByZWFjdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogdG9cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgaW1hZ2VzRGF0YSA9IChkYXRhIGFzIHtpbWFnZXM/OiB7aW1hZ2VzQnlSZWFjdGlvbnM/OiBJbWFnZVR5cGVbXX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZXNCeVJlYWN0aW9ucyA9IEFycmF5LmlzQXJyYXkoaW1hZ2VzRGF0YT8uaW1hZ2VzQnlSZWFjdGlvbnMpXG4gICAgICAgICAgPyBpbWFnZXNEYXRhLmltYWdlc0J5UmVhY3Rpb25zIHx8IFtdXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGxpc3Q6IGltYWdlc0J5UmVhY3Rpb25zLFxuICAgICAgICAgIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8SW1hZ2VUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2VzQnlSZWFjdGlvbnMnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICdpbWFnZUlkJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdsaWtlQ291bnQnLFxuICAgICAgICAgICdwcml2YWN5JyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgLi4uaW1hZ2VQcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVJlYWN0aW9ucycsIHtmcm9tLCBpbWFnZVByb3BzLCByZWFjdGlvbnMsIHRvfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeVBlcnNvbmFSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgcGVyc29uYUlkOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAzMCxcbiAgICBpbWFnZVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGxpc3RLZXk6IHN0cmluZyA9IGBwZXJzb25hOiR7cGVyc29uYUlkfTpzYXZlZFBob3Rvc2AsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PEltYWdlVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnLFxuICAgICAgICB7ZnJvbSwgaW1hZ2VQcm9wcywgbGlzdEtleSwgcGVyc29uYUlkLCByZWFjdGlvbnMsIHRvfSxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2l0ZW1JZDogbGlzdEtleSwgbGlzdDogY2FjaGVkUmVzdWx0LCBwZXJzb25hSWQsIHJlYWN0aW9ucywgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgICB9LFxuICAgICAgICBwZXJzb25hSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQnLFxuICAgICAgICAgIHZhbHVlOiBwZXJzb25hSWRcbiAgICAgICAgfSxcbiAgICAgICAgcmVhY3Rpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ1tTdHJpbmchXScsXG4gICAgICAgICAgdmFsdWU6IHJlYWN0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiB0b1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBpbWFnZXNEYXRhID0gKGRhdGEgYXMge2ltYWdlcz86IHtpbWFnZXNCeVBlcnNvbmFSZWFjdGlvbnM/OiBJbWFnZVR5cGVbXX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZXNCeVBlcnNvbmFSZWFjdGlvbnMgPSBBcnJheS5pc0FycmF5KGltYWdlc0RhdGE/LmltYWdlc0J5UGVyc29uYVJlYWN0aW9ucylcbiAgICAgICAgICA/IGltYWdlc0RhdGEuaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zIHx8IFtdXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBpdGVtSWQ6IGxpc3RLZXksXG4gICAgICAgICAgbGlzdDogaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zLFxuICAgICAgICAgIHBlcnNvbmFJZCxcbiAgICAgICAgICByZWFjdGlvbnMsXG4gICAgICAgICAgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbWFnZXNCeVBlcnNvbmFSZWFjdGlvbnMgYXMgdW5rbm93biBhcyBGbHV4QWN0aW9uO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8SW1hZ2VUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAnaW1hZ2VJZCcsXG4gICAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgICAnbGlrZUNvdW50JyxcbiAgICAgICAgICAncHJpdmFjeScsXG4gICAgICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLmltYWdlUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2UubGlzdEJ5UGVyc29uYVJlYWN0aW9ucycsXG4gICAgICAgIHtmcm9tLCBpbWFnZVByb3BzLCBsaXN0S2V5LCBwZXJzb25hSWQsIHJlYWN0aW9ucywgdG99LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCBpdGVtSWQ6IGxpc3RLZXksIHBlcnNvbmFJZCwgcmVhY3Rpb25zLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBkZWxldGU6IGRlbGV0ZUltYWdlLFxuICAgIGdldEltYWdlQnlJZCxcbiAgICB1cGRhdGUsXG4gICAgdXBsb2FkLFxuICAgIGNvdW50QnlJdGVtLFxuICAgIGxpc3RCeUl0ZW0sXG4gICAgbGlzdEJ5UGVyc29uYVJlYWN0aW9ucyxcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgdXBkYXRlSW1hZ2VBZGFwdGVyLFxuICAgIHVwZGF0ZUltYWdlQWRhcHRlck9wdGlvbnNcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsicGFyc2VTdHJpbmciLCJ2YWxpZGF0ZUltYWdlSW5wdXQiLCJnZXRDb25maWdGcm9tRmx1eCIsIklNQUdFX0NPTlNUQU5UUyIsImFwcE11dGF0aW9uIiwiYXBwUXVlcnkiLCJ1cGxvYWRJbWFnZSIsImNvbnZlcnRGaWxlVG9VcGxvYWRGaWxlIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJEQVRBX1RZUEUiLCJnZXRJbWFnZVVwbG9hZENvbmZpZyIsImZsdXgiLCJjb25maWciLCJjb25maWd1cmVkTWF4SW1hZ2VTaXplIiwiTnVtYmVyIiwiYXBwIiwiaW1hZ2VzIiwibWF4SW1hZ2VTaXplIiwiY29uZmlndXJlZE1heEltYWdlVXBsb2FkQnl0ZXMiLCJtYXhJbWFnZVVwbG9hZEJ5dGVzIiwiaXNGaW5pdGUiLCJkZWZhdWx0SW1hZ2VWYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJjcmVhdGVJbWFnZVZhbGlkYXRvciIsImN1c3RvbUFkYXB0ZXIiLCJ2YWxpZGF0b3JPcHRpb25zIiwibWVyZ2VkT3B0aW9ucyIsInZhbGlkYXRlZCIsImN1c3RvbVZhbGlkYXRpb24iLCJjcmVhdGVJbWFnZUFjdGlvbnMiLCJpbWFnZUFkYXB0ZXJPcHRpb25zIiwiY3VzdG9tSW1hZ2VBZGFwdGVyIiwiaW1hZ2VBZGFwdGVyIiwidmFsaWRhdGVJbWFnZSIsInVwZGF0ZUltYWdlQWRhcHRlciIsImFkYXB0ZXIiLCJ1cGRhdGVJbWFnZUFkYXB0ZXJPcHRpb25zIiwiYWRkIiwiaW1hZ2UiLCJ0eXBlIiwicmVxdWVzdE9wdGlvbnMiLCJ2YWxpZGF0ZWRJbWFnZSIsImJhc2U2NCIsImRlc2NyaXB0aW9uIiwiZmlsZSIsImZpbGVUeXBlIiwiaXRlbUlkIiwibmFtZSIsInByaXZhY3kiLCJwYXJzZWREZXNjcmlwdGlvbiIsInVuZGVmaW5lZCIsInBhcnNlZEl0ZW1JZCIsIlN0cmluZyIsInVwbG9hZFBheWxvYWQiLCJGb3JtRGF0YSIsIkZpbGUiLCJ1cGxvYWRGaWxlIiwic2V0IiwiaXRlbVR5cGUiLCJuZXdJbWFnZSIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsImVycm9yIiwiQUREX0lURU1fRVJST1IiLCJkZWxldGVJbWFnZSIsImltYWdlSWQiLCJpbWFnZVByb3BzIiwicXVlcnlWYXJpYWJsZXMiLCJ2YWx1ZSIsIm9uU3VjY2VzcyIsImRhdGEiLCJSRU1PVkVfSVRFTV9TVUNDRVNTIiwiUkVNT1ZFX0lURU1fRVJST1IiLCJ1cGRhdGUiLCJ1cmwiLCJ1cGRhdGVJbWFnZSIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJmb3JtYXRJbWFnZSIsInVwbG9hZCIsImltYWdlRmlsZXMiLCJzYXZlZEltYWdlcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJVUExPQURfSVRFTV9TVUNDRVNTIiwiVVBMT0FEX0lURU1fRVJST1IiLCJjb3VudEJ5SXRlbSIsImNhY2hlZFJlc3VsdCIsImNvdW50IiwiaW1hZ2VDb3VudCIsIkdFVF9DT1VOVF9TVUNDRVNTIiwicmVzdWx0IiwiR0VUX0NPVU5UX0VSUk9SIiwiZ2V0SW1hZ2VCeUlkIiwiaW1hZ2VzRGF0YSIsIkdFVF9JVEVNX1NVQ0NFU1MiLCJHRVRfSVRFTV9FUlJPUiIsImxpc3RCeUl0ZW0iLCJmcm9tIiwidG8iLCJpbWFnZXNCeUl0ZW0iLCJBcnJheSIsImlzQXJyYXkiLCJnZXRJbWFnZUxpc3RCeUl0ZW0iLCJsaXN0IiwiR0VUX0xJU1RfU1VDQ0VTUyIsIkdFVF9MSVNUX0VSUk9SIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25zIiwiaW1hZ2VzQnlSZWFjdGlvbnMiLCJsaXN0QnlQZXJzb25hUmVhY3Rpb25zIiwicGVyc29uYUlkIiwibGlzdEtleSIsImltYWdlc0J5UGVyc29uYVJlYWN0aW9ucyIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBU0EsV0FBVyxRQUFRLGVBQWU7QUFFM0MsU0FBU0Msa0JBQWtCLFFBQVEsOENBQThDO0FBQ2pGLFNBQVNDLGlCQUFpQixRQUFRLDZCQUE2QjtBQUMvRCxTQUFTQyxlQUFlLFFBQVEsNkJBQTZCO0FBQzdELFNBQVNDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxXQUFXLFFBQVEscUJBQXFCO0FBQ3hFLFNBQVNDLHVCQUF1QixRQUFRLHNCQUFzQjtBQUM5RCxTQUFTQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFRLDhCQUE4QjtBQU9yRyxNQUFNQyxZQUFZO0FBRWxCLE1BQU1DLHVCQUF1QixDQUFDQztJQUM1QixNQUFNQyxTQUFTWixrQkFBa0JXO0lBQ2pDLE1BQU1FLHlCQUF5QkMsT0FDN0IsQUFBQ0YsUUFBZ0JHLEtBQUtDLFFBQVFDLGdCQUMxQkwsUUFBZ0JLLGdCQUNqQjtJQUVMLE1BQU1DLGdDQUFnQ0osT0FDcEMsQUFBQ0YsUUFBZ0JHLEtBQUtDLFFBQVFHLHVCQUMxQlAsUUFBZ0JPLHVCQUNqQixNQUFNO0lBR1gsT0FBTztRQUNMRixjQUFjSCxPQUFPTSxRQUFRLENBQUNQLDJCQUEyQkEseUJBQXlCLElBQzlFQSx5QkFDQTtRQUNKTSxxQkFBcUJMLE9BQU9NLFFBQVEsQ0FBQ0Ysa0NBQWtDQSxnQ0FBZ0MsSUFDbkdBLGdDQUNBLE1BQU07SUFDWjtBQUNGO0FBeUNB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
|