studiokit-scaffolding-js 7.0.12-next.1.4 → 7.0.12-next.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/ActionList.js +170 -34
- package/lib/components/AlertDialog.js +133 -9
- package/lib/components/AlertWithIcon.js +92 -25
- package/lib/components/ConnectedModal.js +43 -13
- package/lib/components/Dropdowns/GroupsDropdown.js +69 -44
- package/lib/components/Dropdowns/ManagedNavDropdown.js +100 -67
- package/lib/components/Dropdowns/UserDropdown.js +111 -21
- package/lib/components/Dropdowns/index.js +27 -9
- package/lib/components/EntityOwnerList.js +52 -18
- package/lib/components/Error.js +106 -11
- package/lib/components/ErrorBoundary.js +134 -35
- package/lib/components/ErrorMessage.js +44 -9
- package/lib/components/Forms/DateField.js +61 -42
- package/lib/components/Forms/TimeField.js +81 -42
- package/lib/components/Forms/index.js +27 -4
- package/lib/components/Groups/CreateEditCopySaveButtons.js +114 -11
- package/lib/components/Groups/ExternalGroups/Attach.js +212 -148
- package/lib/components/Groups/ExternalGroups/Table.js +181 -45
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
- package/lib/components/Groups/RosterSyncInfo.js +147 -20
- package/lib/components/HOC/AccessibleAppComponent.js +98 -73
- package/lib/components/HOC/ActivityRequiredComponent.js +92 -49
- package/lib/components/HOC/AsyncComponent.js +54 -39
- package/lib/components/HOC/AuthenticatedComponent.js +58 -38
- package/lib/components/HOC/CollectionComponent.js +170 -110
- package/lib/components/HOC/CollectionFirstItemComponent.js +51 -38
- package/lib/components/HOC/CollectionItemComponent.js +168 -106
- package/lib/components/HOC/ConnectedModalComponent.js +109 -80
- package/lib/components/HOC/DataDependentComponent.js +29 -21
- package/lib/components/HOC/EntityComponent.js +71 -57
- package/lib/components/HOC/FullscreenModalComponent.js +163 -123
- package/lib/components/HOC/GroupActivityRequiredComponent.js +45 -31
- package/lib/components/HOC/GuidComponent.js +29 -22
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +41 -31
- package/lib/components/HOC/ModelErrorRedirectComponent.js +51 -47
- package/lib/components/HOC/SearchPersistorComponent.js +240 -166
- package/lib/components/HOC/UnauthenticatedComponent.js +37 -25
- package/lib/components/HOC/UserComponent.js +12 -7
- package/lib/components/Icons/IconAlphaList.js +33 -5
- package/lib/components/Icons/IconExternalUser.js +33 -5
- package/lib/components/Icons/IconImpersonation.js +33 -5
- package/lib/components/Icons/IconStopImpersonating.js +33 -5
- package/lib/components/Icons/IconTable.js +35 -7
- package/lib/components/Icons/IconTableDeleteCol.js +33 -5
- package/lib/components/Icons/IconTableDeleteRow.js +33 -5
- package/lib/components/Icons/IconTableInsertCol.js +33 -5
- package/lib/components/Icons/IconTableInsertRow.js +33 -5
- package/lib/components/Impersonation/Button.js +77 -13
- package/lib/components/Impersonation/Link.js +77 -13
- package/lib/components/Impersonation/UserDetail.js +66 -9
- package/lib/components/Loading.js +26 -4
- package/lib/components/LockDownBrowser/Check.js +194 -49
- package/lib/components/LockDownBrowser/ExitButton.js +26 -9
- package/lib/components/LockDownBrowser/Launch.js +70 -62
- package/lib/components/Lti/Confirm.js +152 -11
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -33
- package/lib/components/Lti/Launch.js +105 -24
- package/lib/components/Lti/LaunchGroup.js +85 -13
- package/lib/components/ManageTable.js +309 -87
- package/lib/components/ManageTableNoDataComponent.js +42 -4
- package/lib/components/NewVersionAlert.js +82 -46
- package/lib/components/NotFound.js +86 -10
- package/lib/components/Notifications.js +185 -126
- package/lib/components/PaginationNextButton.js +33 -6
- package/lib/components/PaginationPreviousButton.js +33 -6
- package/lib/components/Quill/CustomToolbar.js +432 -218
- package/lib/components/Quill/Formats/Image.js +73 -63
- package/lib/components/Quill/Formats/List.js +45 -45
- package/lib/components/Quill/Formats/Video.js +28 -24
- package/lib/components/Quill/ImageDropModule.js +147 -117
- package/lib/components/Quill/ImageWarning.js +47 -9
- package/lib/components/Quill/ImageWithAltTextModal.js +425 -86
- package/lib/components/Quill/Specs/CustomImageSpec.js +42 -34
- package/lib/components/Quill/Specs/CustomVideoSpec.js +34 -28
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +98 -98
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +52 -47
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +53 -48
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +224 -221
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +80 -83
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +75 -70
- package/lib/components/Quill/TableModule/constants.js +45 -41
- package/lib/components/Quill/TableModule/index.js +362 -301
- package/lib/components/Quill/TableModule/utils.js +42 -38
- package/lib/components/Quill/accessibilityFix.js +234 -232
- package/lib/components/Quill/index.js +34 -28
- package/lib/components/RefreshIndicator/Bordered.js +47 -6
- package/lib/components/RefreshIndicator/Inline.js +47 -8
- package/lib/components/RefreshIndicator/index.js +263 -59
- package/lib/components/SearchControls.js +216 -11
- package/lib/components/SentryRoute.js +11 -6
- package/lib/components/Tables/RoleFilter.js +69 -32
- package/lib/components/Tables/TextFilter.js +62 -13
- package/lib/components/UserRoles/Add.js +199 -96
- package/lib/components/UserRoles/Context.js +11 -7
- package/lib/components/UserRoles/RoleCell.js +181 -72
- package/lib/components/UserRoles/Select.js +157 -17
- package/lib/components/UserRoles/Table.js +221 -80
- package/lib/components/UserRoles/index.js +534 -384
- package/lib/config/eslint/index.js +32 -28
- package/lib/config/eslint/lib/order.js +26 -27
- package/lib/config/eslint/lib/prettier.js +20 -18
- package/lib/config/eslint/lib/typescript.js +93 -112
- package/lib/config/eslint/react.js +24 -14
- package/lib/constants/baseActivity.js +30 -26
- package/lib/constants/baseRole.js +14 -10
- package/lib/constants/configuration.js +33 -29
- package/lib/constants/externalProviderType.js +10 -6
- package/lib/constants/fetchErrorData.js +15 -11
- package/lib/constants/index.js +137 -14
- package/lib/constants/lockDownBrowser.js +28 -24
- package/lib/constants/mockData.js +382 -297
- package/lib/constants/modelStatus.js +15 -11
- package/lib/constants/notificationType.js +12 -8
- package/lib/constants/operatingSystem.js +12 -8
- package/lib/constants/shard.js +11 -7
- package/lib/constants/table.js +21 -21
- package/lib/constants/tier.js +12 -8
- package/lib/constants/userRole.js +15 -5
- package/lib/endpointMappings.js +197 -181
- package/lib/hooks/useCollection.js +82 -62
- package/lib/hooks/useCollectionConfiguration.js +228 -83
- package/lib/hooks/useCollectionItem.js +154 -54
- package/lib/hooks/useGuid.js +20 -8
- package/lib/hooks/usePrevious.js +19 -13
- package/lib/index.js +157 -25
- package/lib/redux/actionCreator.js +50 -28
- package/lib/redux/actions/AuthAction.js +44 -31
- package/lib/redux/actions/ModalAction.js +10 -6
- package/lib/redux/actions/ModelAction.js +77 -39
- package/lib/redux/actions/NotificationAction.js +10 -6
- package/lib/redux/actions/SearchAction.js +9 -5
- package/lib/redux/actions/index.js +60 -7
- package/lib/redux/configureReducers.js +60 -49
- package/lib/redux/configureStore.js +83 -87
- package/lib/redux/helpers.js +6 -2
- package/lib/redux/reducers/authReducer.js +50 -43
- package/lib/redux/reducers/index.js +41 -13
- package/lib/redux/reducers/modalsReducer.js +47 -29
- package/lib/redux/reducers/modelsReducer.js +178 -173
- package/lib/redux/reducers/notificationsReducer.js +24 -18
- package/lib/redux/reducers/searchReducer.js +25 -19
- package/lib/redux/sagas/appInsightsSaga.js +22 -18
- package/lib/redux/sagas/authSaga.js +253 -218
- package/lib/redux/sagas/caliperSaga.js +159 -143
- package/lib/redux/sagas/clockOffsetSaga.js +34 -31
- package/lib/redux/sagas/configurationSaga.js +11 -7
- package/lib/redux/sagas/downtimeApiErrorSaga.js +20 -17
- package/lib/redux/sagas/errorSaga.js +27 -21
- package/lib/redux/sagas/googleAnalyticsSaga.js +28 -24
- package/lib/redux/sagas/identityProviderSaga.js +22 -18
- package/lib/redux/sagas/initialDataLoadSaga.js +37 -28
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +29 -20
- package/lib/redux/sagas/modelFetchSaga.js +355 -322
- package/lib/redux/sagas/noStoreSaga.js +61 -48
- package/lib/redux/sagas/postLoginDataSaga.js +45 -34
- package/lib/redux/sagas/postLoginRedirectSaga.js +27 -27
- package/lib/redux/sagas/rootSaga.js +82 -57
- package/lib/redux/sagas/sentrySaga.js +29 -25
- package/lib/redux/sagas/userIdSaga.js +16 -12
- package/lib/services/codeProviderService.js +25 -19
- package/lib/services/dateService.js +12 -7
- package/lib/services/documentService.js +17 -12
- package/lib/services/fetchService.js +129 -112
- package/lib/services/persistenceService.js +33 -29
- package/lib/services/ticketProviderService.js +29 -23
- package/lib/services/tokenPersistenceService.js +12 -8
- package/lib/services/windowService.js +18 -14
- package/lib/startup.js +132 -114
- package/lib/types/AppConfiguration.js +5 -1
- package/lib/types/Artifact.js +11 -7
- package/lib/types/BaseReduxState.js +5 -1
- package/lib/types/Client.js +5 -1
- package/lib/types/Collection.js +5 -1
- package/lib/types/Configuration.js +5 -1
- package/lib/types/DeepLinkingResponseRequest.js +5 -1
- package/lib/types/DeletableModel.js +5 -1
- package/lib/types/Event.js +5 -1
- package/lib/types/ExternalGroup.js +5 -1
- package/lib/types/ExternalProvider.js +5 -1
- package/lib/types/ExternalTerm.js +5 -1
- package/lib/types/Group.js +5 -1
- package/lib/types/IdentityProvider.js +5 -1
- package/lib/types/LtiLaunch.js +5 -1
- package/lib/types/NameOnlyEntity.js +5 -1
- package/lib/types/Notification.js +5 -1
- package/lib/types/OptionalRecord.js +5 -1
- package/lib/types/OwnerSchedule.js +5 -1
- package/lib/types/PropertyOfType.js +5 -1
- package/lib/types/Quill.js +5 -1
- package/lib/types/RoleDescription.js +5 -1
- package/lib/types/Search.js +5 -1
- package/lib/types/SimpleLocation.js +5 -1
- package/lib/types/UniTime.js +5 -1
- package/lib/types/User.js +5 -1
- package/lib/types/UserRole.js +5 -1
- package/lib/types/auth/AuthState.js +5 -1
- package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
- package/lib/types/auth/ClientCredentials.js +5 -1
- package/lib/types/auth/CodeProviderService.js +5 -1
- package/lib/types/auth/LocalLoginRequestBody.js +5 -1
- package/lib/types/auth/TicketProviderService.js +5 -1
- package/lib/types/auth/TokenPersistenceService.js +5 -1
- package/lib/types/auth/index.js +82 -9
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +313 -30
- package/lib/types/net/EndpointConfig.js +5 -1
- package/lib/types/net/EndpointMapping.js +5 -1
- package/lib/types/net/EndpointMappings.js +5 -1
- package/lib/types/net/ErrorHandler.js +5 -1
- package/lib/types/net/FetchConfig.js +5 -1
- package/lib/types/net/FetchErrorData.js +10 -6
- package/lib/types/net/FetchResult.js +5 -1
- package/lib/types/net/HTTPMethod.js +5 -1
- package/lib/types/net/HTTPStatusCode.js +16 -12
- package/lib/types/net/Metadata.js +5 -1
- package/lib/types/net/Model.js +5 -1
- package/lib/types/net/ModelCollection.js +5 -1
- package/lib/types/net/ModelsState.js +5 -1
- package/lib/types/net/OAuthToken.js +5 -1
- package/lib/types/net/OAuthTokenOrNull.js +5 -1
- package/lib/types/net/TokenAccessFunction.js +5 -1
- package/lib/types/net/index.js +181 -18
- package/lib/utils/baseActivity.js +133 -123
- package/lib/utils/baseRole.js +37 -33
- package/lib/utils/collection.js +425 -298
- package/lib/utils/cookies.js +22 -19
- package/lib/utils/date.js +303 -279
- package/lib/utils/dom.js +176 -165
- package/lib/utils/domainIdentifier.js +9 -5
- package/lib/utils/entityUserRole.js +6 -2
- package/lib/utils/error.js +17 -15
- package/lib/utils/events.js +40 -31
- package/lib/utils/externalGroup.js +22 -18
- package/lib/utils/externalProviders.js +8 -4
- package/lib/utils/externalTerms.js +10 -3
- package/lib/utils/fetch.js +179 -180
- package/lib/utils/group.js +18 -7
- package/lib/utils/groupDates.js +37 -33
- package/lib/utils/groupRoles.js +25 -21
- package/lib/utils/lockDownBrowser.js +15 -11
- package/lib/utils/logger.js +26 -22
- package/lib/utils/lti.js +9 -4
- package/lib/utils/model.js +36 -41
- package/lib/utils/number.js +21 -18
- package/lib/utils/promise.js +28 -21
- package/lib/utils/quill.js +65 -62
- package/lib/utils/route.js +58 -55
- package/lib/utils/search.js +76 -80
- package/lib/utils/shard.js +37 -37
- package/lib/utils/sort.js +50 -42
- package/lib/utils/string.js +13 -8
- package/lib/utils/table.js +38 -33
- package/lib/utils/timezone.js +10 -6
- package/lib/utils/url.js +142 -142
- package/lib/utils/user.js +58 -55
- package/lib/utils/userAgent.js +10 -10
- package/lib/utils/userRole.js +57 -49
- package/package.json +17 -3
|
@@ -1,158 +1,222 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
3
7
|
exports.ExternalGroupsAttach = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
(0, lodash_1.set)(ownersInitialScheduleData, [owner.userId], ownerData);
|
|
40
|
-
});
|
|
41
|
-
this.setState({
|
|
42
|
-
ownerSchedules: ownersInitialScheduleData,
|
|
43
|
-
isUniTimeScheduleLoadingDone: false
|
|
44
|
-
}, () => (0, lodash_1.forEach)(ownersInitialScheduleData, (ownerSchedule, userId) => {
|
|
45
|
-
this.getOwnerUniTimeGroups(ownerSchedule, userId, externalTermId);
|
|
46
|
-
}));
|
|
47
|
-
};
|
|
48
|
-
this.handleSelectExternalGroups = (event) => {
|
|
49
|
-
const externalId = event.target.value;
|
|
50
|
-
const checked = event.target.checked;
|
|
51
|
-
const { originalConnectedExternalGroups, selectedExternalGroups } = this.props;
|
|
52
|
-
const allOwnerExternalGroups = (0, lodash_1.map)(this.state.ownerSchedules, os => os.externalGroups).reduce((a, b) => (a || []).concat(b || []));
|
|
53
|
-
const selectedExternalGroupsCopy = selectedExternalGroups.slice();
|
|
54
|
-
if (checked) {
|
|
55
|
-
const originalConnectedExternalGroup = originalConnectedExternalGroups.find(oeg => oeg.externalId === externalId);
|
|
56
|
-
const selectedExternalGroup = originalConnectedExternalGroup
|
|
57
|
-
? originalConnectedExternalGroup
|
|
58
|
-
: allOwnerExternalGroups === null || allOwnerExternalGroups === void 0 ? void 0 : allOwnerExternalGroups.find(ao => ao.externalId === externalId);
|
|
59
|
-
if (selectedExternalGroup) {
|
|
60
|
-
selectedExternalGroupsCopy.push(selectedExternalGroup);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
(0, lodash_1.remove)(selectedExternalGroupsCopy, seg => seg.externalId === externalId);
|
|
65
|
-
}
|
|
66
|
-
this.props.handleSelectedExternalGroups(selectedExternalGroupsCopy);
|
|
67
|
-
};
|
|
68
|
-
this.getOwnerUniTimeGroups = (ownerSchedule, userId, externalTermId) => {
|
|
69
|
-
if ((0, shard_1.isPurdueShard)() && ownerSchedule.status === constants_1.MODEL_STATUS.UNINITIALIZED && !ownerSchedule.externalGroups) {
|
|
70
|
-
(0, noStoreSaga_1.registerNoStoreActionHook)(ownerSchedule.hookId, (data) => {
|
|
71
|
-
(0, noStoreSaga_1.unregisterNoStoreActionHook)(ownerSchedule.hookId);
|
|
72
|
-
if (!data || (0, fetch_1.isFetchErrorData)(data)) {
|
|
73
|
-
this.setState({ isShowingErrorAlert: true, isUniTimeScheduleLoadingDone: true });
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this.setUserUniTimeGroups(userId, data.externalGroups);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
(0, actionCreator_1.dispatchModelFetchRequest)({
|
|
80
|
-
modelName: 'uniTimeInstructorSchedule',
|
|
81
|
-
queryParams: {
|
|
82
|
-
externalTermId,
|
|
83
|
-
userId
|
|
84
|
-
},
|
|
85
|
-
noStore: true,
|
|
86
|
-
guid: ownerSchedule.hookId
|
|
87
|
-
});
|
|
88
|
-
}
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _lodash = require("lodash");
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _reactBootstrap = require("react-bootstrap");
|
|
12
|
+
var _uuid = require("uuid");
|
|
13
|
+
var _constants = require("../../../constants");
|
|
14
|
+
var _actionCreator = require("../../../redux/actionCreator");
|
|
15
|
+
var _noStoreSaga = require("../../../redux/sagas/noStoreSaga");
|
|
16
|
+
var _fetch = require("../../../utils/fetch");
|
|
17
|
+
var _model = require("../../../utils/model");
|
|
18
|
+
var _shard = require("../../../utils/shard");
|
|
19
|
+
var _user = require("../../../utils/user");
|
|
20
|
+
var _AlertWithIcon = require("../../AlertWithIcon");
|
|
21
|
+
var _Loading = require("../../Loading");
|
|
22
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
23
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
24
|
+
class ExternalGroupsAttach extends _react.Component {
|
|
25
|
+
constructor(props) {
|
|
26
|
+
super(props);
|
|
27
|
+
(0, _defineProperty2.default)(this, "setOwnerSchedules", (groupUserRoles, externalTermId, selectedExternalGroups) => {
|
|
28
|
+
const {
|
|
29
|
+
canConnectAnyExternalGroups,
|
|
30
|
+
canConnectOwnExternalGroups,
|
|
31
|
+
userInfo
|
|
32
|
+
} = this.props;
|
|
33
|
+
const owners = groupUserRoles.filter(groupUserRole => {
|
|
34
|
+
return groupUserRole.role === _constants.BASE_ROLE.GROUP_OWNER;
|
|
35
|
+
});
|
|
36
|
+
const ownersInitialScheduleData = {};
|
|
37
|
+
owners.forEach(owner => {
|
|
38
|
+
const ownerData = {
|
|
39
|
+
hookId: (0, _uuid.v4)(),
|
|
40
|
+
status: canConnectAnyExternalGroups || userInfo.id === owner.id && canConnectOwnExternalGroups ? _constants.MODEL_STATUS.UNINITIALIZED : _constants.MODEL_STATUS.READY,
|
|
41
|
+
owner,
|
|
42
|
+
externalGroups: !(canConnectAnyExternalGroups || userInfo.id === owner.id && canConnectOwnExternalGroups) ? selectedExternalGroups.filter(seg => seg.userId === owner.id) : undefined
|
|
89
43
|
};
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
44
|
+
(0, _lodash.set)(ownersInitialScheduleData, [owner.userId], ownerData);
|
|
45
|
+
});
|
|
46
|
+
this.setState({
|
|
47
|
+
ownerSchedules: ownersInitialScheduleData,
|
|
48
|
+
isUniTimeScheduleLoadingDone: false
|
|
49
|
+
}, () => (0, _lodash.forEach)(ownersInitialScheduleData, (ownerSchedule, userId) => {
|
|
50
|
+
this.getOwnerUniTimeGroups(ownerSchedule, userId, externalTermId);
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
53
|
+
(0, _defineProperty2.default)(this, "handleSelectExternalGroups", event => {
|
|
54
|
+
const externalId = event.target.value;
|
|
55
|
+
const checked = event.target.checked;
|
|
56
|
+
const {
|
|
57
|
+
originalConnectedExternalGroups,
|
|
58
|
+
selectedExternalGroups
|
|
59
|
+
} = this.props;
|
|
60
|
+
const allOwnerExternalGroups = (0, _lodash.map)(this.state.ownerSchedules, os => os.externalGroups).reduce((a, b) => (a || []).concat(b || []));
|
|
61
|
+
const selectedExternalGroupsCopy = selectedExternalGroups.slice();
|
|
62
|
+
if (checked) {
|
|
63
|
+
const originalConnectedExternalGroup = originalConnectedExternalGroups.find(oeg => oeg.externalId === externalId);
|
|
64
|
+
const selectedExternalGroup = originalConnectedExternalGroup ? originalConnectedExternalGroup : allOwnerExternalGroups?.find(ao => ao.externalId === externalId);
|
|
65
|
+
if (selectedExternalGroup) {
|
|
66
|
+
selectedExternalGroupsCopy.push(selectedExternalGroup);
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
(0, _lodash.remove)(selectedExternalGroupsCopy, seg => seg.externalId === externalId);
|
|
70
|
+
}
|
|
71
|
+
this.props.handleSelectedExternalGroups(selectedExternalGroupsCopy);
|
|
72
|
+
});
|
|
73
|
+
(0, _defineProperty2.default)(this, "getOwnerUniTimeGroups", (ownerSchedule, userId, externalTermId) => {
|
|
74
|
+
if ((0, _shard.isPurdueShard)() && ownerSchedule.status === _constants.MODEL_STATUS.UNINITIALIZED && !ownerSchedule.externalGroups) {
|
|
75
|
+
(0, _noStoreSaga.registerNoStoreActionHook)(ownerSchedule.hookId, data => {
|
|
76
|
+
(0, _noStoreSaga.unregisterNoStoreActionHook)(ownerSchedule.hookId);
|
|
77
|
+
if (!data || (0, _fetch.isFetchErrorData)(data)) {
|
|
96
78
|
this.setState({
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
|
-
this.displayOwnerSchedules = (ownerSchedules) => {
|
|
102
|
-
return (0, lodash_1.map)(ownerSchedules, os => {
|
|
103
|
-
if (!!os.externalGroups && os.externalGroups.length > 0) {
|
|
104
|
-
return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { children: (0, user_1.displayName)(os.owner) }), this.displayUniTimeGroups(os.externalGroups)] }, os.hookId));
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
};
|
|
108
|
-
this.displayUniTimeGroups = (externalGroups) => {
|
|
109
|
-
const { selectedExternalGroups, canConnectAnyExternalGroups, canConnectOwnExternalGroups, userInfo, disabled } = this.props;
|
|
110
|
-
return (0, lodash_1.orderBy)(externalGroups, ['description']).map((eg, index) => {
|
|
111
|
-
const isConnected = selectedExternalGroups.some(seg => seg.externalId === eg.externalId &&
|
|
112
|
-
seg.externalProviderId === eg.externalProviderId &&
|
|
113
|
-
seg.userId === eg.userId);
|
|
114
|
-
if (canConnectAnyExternalGroups ||
|
|
115
|
-
(userInfo.id === eg.userId && canConnectOwnExternalGroups) ||
|
|
116
|
-
isConnected) {
|
|
117
|
-
return ((0, jsx_runtime_1.jsx)(react_bootstrap_1.FormCheck, { id: `external-group-${eg.id}`, type: "checkbox", onChange: this.handleSelectExternalGroups, value: eg.externalId, checked: isConnected, disabled: (userInfo.id !== eg.userId && !canConnectAnyExternalGroups) || disabled, label: `${eg.name} ${eg.description ? `(${eg.description})` : ''}` }, index));
|
|
118
|
-
}
|
|
119
|
-
return null;
|
|
79
|
+
isShowingErrorAlert: true,
|
|
80
|
+
isUniTimeScheduleLoadingDone: true
|
|
120
81
|
});
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
isUniTimeScheduleLoadingDone: false,
|
|
125
|
-
isShowingErrorAlert: false
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
componentDidMount() {
|
|
129
|
-
const { groupUserRoles, externalTermId, selectedExternalGroups } = this.props;
|
|
130
|
-
this.setOwnerSchedules((0, model_1.getModelArray)(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
131
|
-
}
|
|
132
|
-
componentWillUnmount() {
|
|
133
|
-
const { ownerSchedules } = this.state;
|
|
134
|
-
(0, lodash_1.forEach)(ownerSchedules, os => {
|
|
135
|
-
(0, noStoreSaga_1.unregisterNoStoreActionHook)(os.hookId);
|
|
82
|
+
} else {
|
|
83
|
+
this.setUserUniTimeGroups(userId, data.externalGroups);
|
|
84
|
+
}
|
|
136
85
|
});
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
86
|
+
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
87
|
+
modelName: 'uniTimeInstructorSchedule',
|
|
88
|
+
queryParams: {
|
|
89
|
+
externalTermId,
|
|
90
|
+
userId
|
|
91
|
+
},
|
|
92
|
+
noStore: true,
|
|
93
|
+
guid: ownerSchedule.hookId
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
(0, _defineProperty2.default)(this, "setUserUniTimeGroups", (userId, externalGroups) => {
|
|
98
|
+
// Setting the user's course sections load status to be ready
|
|
99
|
+
const ownerSchedules = this.state.ownerSchedules || {};
|
|
100
|
+
ownerSchedules[userId].status = _constants.MODEL_STATUS.READY;
|
|
101
|
+
ownerSchedules[userId].externalGroups = externalGroups;
|
|
102
|
+
const isUniTimeScheduleLoadingDone = (0, _lodash.every)(ownerSchedules, os => os.status === _constants.MODEL_STATUS.READY);
|
|
103
|
+
this.setState({
|
|
104
|
+
ownerSchedules,
|
|
105
|
+
isUniTimeScheduleLoadingDone
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
(0, _defineProperty2.default)(this, "displayOwnerSchedules", ownerSchedules => {
|
|
109
|
+
return (0, _lodash.map)(ownerSchedules, os => {
|
|
110
|
+
if (!!os.externalGroups && os.externalGroups.length > 0) {
|
|
111
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
112
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h4", {
|
|
113
|
+
children: (0, _user.displayName)(os.owner)
|
|
114
|
+
}), this.displayUniTimeGroups(os.externalGroups)]
|
|
115
|
+
}, os.hookId);
|
|
145
116
|
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
(0, _defineProperty2.default)(this, "displayUniTimeGroups", externalGroups => {
|
|
120
|
+
const {
|
|
121
|
+
selectedExternalGroups,
|
|
122
|
+
canConnectAnyExternalGroups,
|
|
123
|
+
canConnectOwnExternalGroups,
|
|
124
|
+
userInfo,
|
|
125
|
+
disabled
|
|
126
|
+
} = this.props;
|
|
127
|
+
return (0, _lodash.orderBy)(externalGroups, ['description']).map((eg, index) => {
|
|
128
|
+
const isConnected = selectedExternalGroups.some(seg => seg.externalId === eg.externalId && seg.externalProviderId === eg.externalProviderId && seg.userId === eg.userId);
|
|
129
|
+
if (canConnectAnyExternalGroups || userInfo.id === eg.userId && canConnectOwnExternalGroups || isConnected) {
|
|
130
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.FormCheck, {
|
|
131
|
+
id: `external-group-${eg.id}`,
|
|
132
|
+
type: "checkbox",
|
|
133
|
+
onChange: this.handleSelectExternalGroups,
|
|
134
|
+
value: eg.externalId,
|
|
135
|
+
checked: isConnected,
|
|
136
|
+
disabled: userInfo.id !== eg.userId && !canConnectAnyExternalGroups || disabled,
|
|
137
|
+
label: `${eg.name} ${eg.description ? `(${eg.description})` : ''}`
|
|
138
|
+
}, index);
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
this.state = {
|
|
144
|
+
ownerSchedules: undefined,
|
|
145
|
+
isUniTimeScheduleLoadingDone: false,
|
|
146
|
+
isShowingErrorAlert: false
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
componentDidMount() {
|
|
150
|
+
const {
|
|
151
|
+
groupUserRoles,
|
|
152
|
+
externalTermId,
|
|
153
|
+
selectedExternalGroups
|
|
154
|
+
} = this.props;
|
|
155
|
+
this.setOwnerSchedules((0, _model.getModelArray)(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
156
|
+
}
|
|
157
|
+
componentWillUnmount() {
|
|
158
|
+
const {
|
|
159
|
+
ownerSchedules
|
|
160
|
+
} = this.state;
|
|
161
|
+
(0, _lodash.forEach)(ownerSchedules, os => {
|
|
162
|
+
(0, _noStoreSaga.unregisterNoStoreActionHook)(os.hookId);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
componentDidUpdate(prevProps) {
|
|
166
|
+
const {
|
|
167
|
+
externalTermId: prevExternalTermId,
|
|
168
|
+
groupUserRoles: prevGroupUserRoles
|
|
169
|
+
} = prevProps;
|
|
170
|
+
const {
|
|
171
|
+
externalTermId,
|
|
172
|
+
groupUserRoles,
|
|
173
|
+
selectedExternalGroups
|
|
174
|
+
} = this.props;
|
|
175
|
+
// Assumes group user roles are changing one at a time. Can be made fancier if the need arises
|
|
176
|
+
if (prevExternalTermId !== externalTermId || Object.keys(prevGroupUserRoles).length !== Object.keys(groupUserRoles).length) {
|
|
177
|
+
this.setOwnerSchedules((0, _model.getModelArray)(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
146
178
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
179
|
+
}
|
|
180
|
+
render() {
|
|
181
|
+
const {
|
|
182
|
+
disabledInfoMessage
|
|
183
|
+
} = this.props;
|
|
184
|
+
const {
|
|
185
|
+
ownerSchedules,
|
|
186
|
+
isUniTimeScheduleLoadingDone,
|
|
187
|
+
isShowingErrorAlert
|
|
188
|
+
} = this.state;
|
|
189
|
+
const hasAnyExternalGroups = (0, _lodash.some)(ownerSchedules, os => !!os.externalGroups && os.externalGroups.length > 0);
|
|
190
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
191
|
+
children: [!isUniTimeScheduleLoadingDone && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Loading.Loading, {}), isUniTimeScheduleLoadingDone && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
192
|
+
children: [!hasAnyExternalGroups && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
|
|
193
|
+
variant: "info",
|
|
194
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
195
|
+
children: "No course sections eligible for roster sync."
|
|
196
|
+
})
|
|
197
|
+
}), !!disabledInfoMessage && hasAnyExternalGroups && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
|
|
198
|
+
variant: "info",
|
|
199
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
200
|
+
children: disabledInfoMessage
|
|
201
|
+
})
|
|
202
|
+
}), isShowingErrorAlert && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
|
|
203
|
+
variant: "warning",
|
|
204
|
+
onClose: () => {
|
|
205
|
+
this.setState({
|
|
206
|
+
isShowingErrorAlert: false
|
|
207
|
+
});
|
|
208
|
+
},
|
|
209
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
210
|
+
className: "ma0",
|
|
211
|
+
children: "Oops! Something went wrong while loading. Please try again."
|
|
212
|
+
})
|
|
213
|
+
}), ' ', hasAnyExternalGroups && !!ownerSchedules && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.FormGroup, {
|
|
214
|
+
className: "ml4 f6",
|
|
215
|
+
children: this.displayOwnerSchedules(ownerSchedules)
|
|
216
|
+
})]
|
|
217
|
+
})]
|
|
218
|
+
});
|
|
219
|
+
}
|
|
157
220
|
}
|
|
158
221
|
exports.ExternalGroupsAttach = ExternalGroupsAttach;
|
|
222
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3JlYWN0Qm9vdHN0cmFwIiwiX3V1aWQiLCJfY29uc3RhbnRzIiwiX2FjdGlvbkNyZWF0b3IiLCJfbm9TdG9yZVNhZ2EiLCJfZmV0Y2giLCJfbW9kZWwiLCJfc2hhcmQiLCJfdXNlciIsIl9BbGVydFdpdGhJY29uIiwiX0xvYWRpbmciLCJfanN4UnVudGltZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIkV4dGVybmFsR3JvdXBzQXR0YWNoIiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJncm91cFVzZXJSb2xlcyIsImV4dGVybmFsVGVybUlkIiwic2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyIsImNhbkNvbm5lY3RBbnlFeHRlcm5hbEdyb3VwcyIsImNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcyIsInVzZXJJbmZvIiwib3duZXJzIiwiZmlsdGVyIiwiZ3JvdXBVc2VyUm9sZSIsInJvbGUiLCJCQVNFX1JPTEUiLCJHUk9VUF9PV05FUiIsIm93bmVyc0luaXRpYWxTY2hlZHVsZURhdGEiLCJmb3JFYWNoIiwib3duZXIiLCJvd25lckRhdGEiLCJob29rSWQiLCJ1dWlkdjQiLCJzdGF0dXMiLCJpZCIsIk1PREVMX1NUQVRVUyIsIlVOSU5JVElBTElaRUQiLCJSRUFEWSIsImV4dGVybmFsR3JvdXBzIiwic2VnIiwidXNlcklkIiwidW5kZWZpbmVkIiwic2V0U3RhdGUiLCJvd25lclNjaGVkdWxlcyIsImlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUiLCJvd25lclNjaGVkdWxlIiwiZ2V0T3duZXJVbmlUaW1lR3JvdXBzIiwiZXZlbnQiLCJleHRlcm5hbElkIiwidGFyZ2V0IiwidmFsdWUiLCJjaGVja2VkIiwib3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwcyIsImFsbE93bmVyRXh0ZXJuYWxHcm91cHMiLCJtYXAiLCJzdGF0ZSIsIm9zIiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSIsInNsaWNlIiwib3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwIiwiZmluZCIsIm9lZyIsInNlbGVjdGVkRXh0ZXJuYWxHcm91cCIsImFvIiwicHVzaCIsInJlbW92ZSIsImhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHMiLCJpc1B1cmR1ZVNoYXJkIiwicmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayIsImRhdGEiLCJ1bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2siLCJpc0ZldGNoRXJyb3JEYXRhIiwiaXNTaG93aW5nRXJyb3JBbGVydCIsInNldFVzZXJVbmlUaW1lR3JvdXBzIiwiZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCIsIm1vZGVsTmFtZSIsInF1ZXJ5UGFyYW1zIiwibm9TdG9yZSIsImd1aWQiLCJldmVyeSIsImxlbmd0aCIsImpzeHMiLCJjaGlsZHJlbiIsImpzeCIsImRpc3BsYXlOYW1lIiwiZGlzcGxheVVuaVRpbWVHcm91cHMiLCJkaXNhYmxlZCIsIm9yZGVyQnkiLCJlZyIsImluZGV4IiwiaXNDb25uZWN0ZWQiLCJzb21lIiwiZXh0ZXJuYWxQcm92aWRlcklkIiwiRm9ybUNoZWNrIiwidHlwZSIsIm9uQ2hhbmdlIiwiaGFuZGxlU2VsZWN0RXh0ZXJuYWxHcm91cHMiLCJsYWJlbCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImNvbXBvbmVudERpZE1vdW50Iiwic2V0T3duZXJTY2hlZHVsZXMiLCJnZXRNb2RlbEFycmF5IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2RXh0ZXJuYWxUZXJtSWQiLCJwcmV2R3JvdXBVc2VyUm9sZXMiLCJrZXlzIiwicmVuZGVyIiwiZGlzYWJsZWRJbmZvTWVzc2FnZSIsImhhc0FueUV4dGVybmFsR3JvdXBzIiwiTG9hZGluZyIsIkFsZXJ0V2l0aEljb24iLCJ2YXJpYW50Iiwib25DbG9zZSIsImNsYXNzTmFtZSIsIkZvcm1Hcm91cCIsImRpc3BsYXlPd25lclNjaGVkdWxlcyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Hcm91cHMvRXh0ZXJuYWxHcm91cHMvQXR0YWNoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWN0aW9uYXJ5LCBldmVyeSwgZm9yRWFjaCwgbWFwLCBvcmRlckJ5LCByZW1vdmUsIHNldCwgc29tZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50LCBDb21wb25lbnQgfSBmcm9tICdyZWFjdCdcclxuaW1wb3J0IHsgRm9ybUNoZWNrLCBGb3JtR3JvdXAgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXHJcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXHJcbmltcG9ydCB7IEJBU0VfUk9MRSwgTU9ERUxfU1RBVFVTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJ1xyXG5pbXBvcnQgeyBkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vcmVkdXgvYWN0aW9uQ3JlYXRvcidcclxuaW1wb3J0IHsgcmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vaywgdW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rIH0gZnJvbSAnLi4vLi4vLi4vcmVkdXgvc2FnYXMvbm9TdG9yZVNhZ2EnXHJcbmltcG9ydCB7XHJcblx0RXh0ZXJuYWxHcm91cCxcclxuXHRGZXRjaEVycm9yRGF0YSxcclxuXHRHcm91cFVzZXJSb2xlLFxyXG5cdEluc3RydWN0b3JTY2hlZHVsZSxcclxuXHRMdGlMYXVuY2gsXHJcblx0TW9kZWxDb2xsZWN0aW9uLFxyXG5cdE93bmVyU2NoZWR1bGUsXHJcblx0VW5pVGltZUdyb3VwLFxyXG5cdFVzZXJJbmZvXHJcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IGlzRmV0Y2hFcnJvckRhdGEgfSBmcm9tICcuLi8uLi8uLi91dGlscy9mZXRjaCdcclxuaW1wb3J0IHsgZ2V0TW9kZWxBcnJheSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL21vZGVsJ1xyXG5pbXBvcnQgeyBpc1B1cmR1ZVNoYXJkIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvc2hhcmQnXHJcbmltcG9ydCB7IGRpc3BsYXlOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdXNlcidcclxuaW1wb3J0IHsgQWxlcnRXaXRoSWNvbiB9IGZyb20gJy4uLy4uL0FsZXJ0V2l0aEljb24nXHJcbmltcG9ydCB7IExvYWRpbmcgfSBmcm9tICcuLi8uLi9Mb2FkaW5nJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbEdyb3Vwc0F0dGFjaFByb3BzIHtcclxuXHR1c2VySW5mbzogVXNlckluZm9cclxuXHRjYW5SZWFkRXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cclxuXHRjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cclxuXHRjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cclxuXHRvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBzOiBBcnJheTxFeHRlcm5hbEdyb3VwIHwgTHRpTGF1bmNoPlxyXG5cdHNlbGVjdGVkRXh0ZXJuYWxHcm91cHM6IEFycmF5PEV4dGVybmFsR3JvdXAgfCBMdGlMYXVuY2ggfCBVbmlUaW1lR3JvdXA+XHJcblx0ZXh0ZXJuYWxUZXJtSWQ6IG51bWJlclxyXG5cdGhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHM6IChleHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD4pID0+IHZvaWRcclxuXHRncm91cFVzZXJSb2xlczogTW9kZWxDb2xsZWN0aW9uPEdyb3VwVXNlclJvbGU+XHJcblx0ZGlzYWJsZWQ/OiBib29sZWFuXHJcblx0ZGlzYWJsZWRJbmZvTWVzc2FnZT86IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50XHJcbn1cclxuXHJcbmludGVyZmFjZSBFeHRlcm5hbEdyb3Vwc0F0dGFjaFN0YXRlIHtcclxuXHRvd25lclNjaGVkdWxlcz86IERpY3Rpb25hcnk8T3duZXJTY2hlZHVsZT5cclxuXHRpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lOiBib29sZWFuXHJcblx0aXNTaG93aW5nRXJyb3JBbGVydDogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxHcm91cHNBdHRhY2ggZXh0ZW5kcyBDb21wb25lbnQ8RXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcywgRXh0ZXJuYWxHcm91cHNBdHRhY2hTdGF0ZT4ge1xyXG5cdGNvbnN0cnVjdG9yKHByb3BzOiBFeHRlcm5hbEdyb3Vwc0F0dGFjaFByb3BzKSB7XHJcblx0XHRzdXBlcihwcm9wcylcclxuXHRcdHRoaXMuc3RhdGUgPSB7XHJcblx0XHRcdG93bmVyU2NoZWR1bGVzOiB1bmRlZmluZWQsXHJcblx0XHRcdGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmU6IGZhbHNlLFxyXG5cdFx0XHRpc1Nob3dpbmdFcnJvckFsZXJ0OiBmYWxzZVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XHJcblx0XHRjb25zdCB7IGdyb3VwVXNlclJvbGVzLCBleHRlcm5hbFRlcm1JZCwgc2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyB9ID0gdGhpcy5wcm9wc1xyXG5cdFx0dGhpcy5zZXRPd25lclNjaGVkdWxlcyhnZXRNb2RlbEFycmF5KGdyb3VwVXNlclJvbGVzKSwgZXh0ZXJuYWxUZXJtSWQsIHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMpXHJcblx0fVxyXG5cclxuXHRjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuXHRcdGNvbnN0IHsgb3duZXJTY2hlZHVsZXMgfSA9IHRoaXMuc3RhdGVcclxuXHRcdGZvckVhY2gob3duZXJTY2hlZHVsZXMsIG9zID0+IHtcclxuXHRcdFx0dW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rKG9zLmhvb2tJZClcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBSZWFkb25seTxFeHRlcm5hbEdyb3Vwc0F0dGFjaFByb3BzPikge1xyXG5cdFx0Y29uc3QgeyBleHRlcm5hbFRlcm1JZDogcHJldkV4dGVybmFsVGVybUlkLCBncm91cFVzZXJSb2xlczogcHJldkdyb3VwVXNlclJvbGVzIH0gPSBwcmV2UHJvcHNcclxuXHRcdGNvbnN0IHsgZXh0ZXJuYWxUZXJtSWQsIGdyb3VwVXNlclJvbGVzLCBzZWxlY3RlZEV4dGVybmFsR3JvdXBzIH0gPSB0aGlzLnByb3BzXHJcblx0XHQvLyBBc3N1bWVzIGdyb3VwIHVzZXIgcm9sZXMgYXJlIGNoYW5naW5nIG9uZSBhdCBhIHRpbWUuIENhbiBiZSBtYWRlIGZhbmNpZXIgaWYgdGhlIG5lZWQgYXJpc2VzXHJcblx0XHRpZiAoXHJcblx0XHRcdHByZXZFeHRlcm5hbFRlcm1JZCAhPT0gZXh0ZXJuYWxUZXJtSWQgfHxcclxuXHRcdFx0T2JqZWN0LmtleXMocHJldkdyb3VwVXNlclJvbGVzKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKGdyb3VwVXNlclJvbGVzKS5sZW5ndGhcclxuXHRcdCkge1xyXG5cdFx0XHR0aGlzLnNldE93bmVyU2NoZWR1bGVzKGdldE1vZGVsQXJyYXkoZ3JvdXBVc2VyUm9sZXMpLCBleHRlcm5hbFRlcm1JZCwgc2VsZWN0ZWRFeHRlcm5hbEdyb3VwcylcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHNldE93bmVyU2NoZWR1bGVzID0gKFxyXG5cdFx0Z3JvdXBVc2VyUm9sZXM6IEdyb3VwVXNlclJvbGVbXSxcclxuXHRcdGV4dGVybmFsVGVybUlkOiBudW1iZXIsXHJcblx0XHRzZWxlY3RlZEV4dGVybmFsR3JvdXBzOiBBcnJheTxFeHRlcm5hbEdyb3VwIHwgTHRpTGF1bmNoIHwgVW5pVGltZUdyb3VwPlxyXG5cdCkgPT4ge1xyXG5cdFx0Y29uc3QgeyBjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMsIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcywgdXNlckluZm8gfSA9IHRoaXMucHJvcHNcclxuXHRcdGNvbnN0IG93bmVycyA9IGdyb3VwVXNlclJvbGVzLmZpbHRlcihncm91cFVzZXJSb2xlID0+IHtcclxuXHRcdFx0cmV0dXJuIGdyb3VwVXNlclJvbGUucm9sZSA9PT0gQkFTRV9ST0xFLkdST1VQX09XTkVSXHJcblx0XHR9KVxyXG5cclxuXHRcdGNvbnN0IG93bmVyc0luaXRpYWxTY2hlZHVsZURhdGE6IERpY3Rpb25hcnk8T3duZXJTY2hlZHVsZT4gPSB7fVxyXG5cdFx0b3duZXJzLmZvckVhY2gob3duZXIgPT4ge1xyXG5cdFx0XHRjb25zdCBvd25lckRhdGE6IE93bmVyU2NoZWR1bGUgPSB7XHJcblx0XHRcdFx0aG9va0lkOiB1dWlkdjQoKSxcclxuXHRcdFx0XHRzdGF0dXM6XHJcblx0XHRcdFx0XHRjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMgfHwgKHVzZXJJbmZvLmlkID09PSBvd25lci5pZCAmJiBjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHMpXHJcblx0XHRcdFx0XHRcdD8gTU9ERUxfU1RBVFVTLlVOSU5JVElBTElaRURcclxuXHRcdFx0XHRcdFx0OiBNT0RFTF9TVEFUVVMuUkVBRFksXHJcblx0XHRcdFx0b3duZXIsXHJcblx0XHRcdFx0ZXh0ZXJuYWxHcm91cHM6ICEoXHJcblx0XHRcdFx0XHRjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMgfHxcclxuXHRcdFx0XHRcdCh1c2VySW5mby5pZCA9PT0gb3duZXIuaWQgJiYgY2FuQ29ubmVjdE93bkV4dGVybmFsR3JvdXBzKVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdD8gc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwcy5maWx0ZXIoc2VnID0+IHNlZy51c2VySWQgPT09IG93bmVyLmlkKVxyXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcclxuXHRcdFx0fVxyXG5cdFx0XHRzZXQob3duZXJzSW5pdGlhbFNjaGVkdWxlRGF0YSwgW293bmVyLnVzZXJJZF0sIG93bmVyRGF0YSlcclxuXHRcdH0pXHJcblx0XHR0aGlzLnNldFN0YXRlKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0b3duZXJTY2hlZHVsZXM6IG93bmVyc0luaXRpYWxTY2hlZHVsZURhdGEsXHJcblx0XHRcdFx0aXNVbmlUaW1lU2NoZWR1bGVMb2FkaW5nRG9uZTogZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdFx0KCkgPT5cclxuXHRcdFx0XHRmb3JFYWNoKG93bmVyc0luaXRpYWxTY2hlZHVsZURhdGEsIChvd25lclNjaGVkdWxlLCB1c2VySWQpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuZ2V0T3duZXJVbmlUaW1lR3JvdXBzKG93bmVyU2NoZWR1bGUsIHVzZXJJZCwgZXh0ZXJuYWxUZXJtSWQpXHJcblx0XHRcdFx0fSlcclxuXHRcdClcclxuXHR9XHJcblxyXG5cdGhhbmRsZVNlbGVjdEV4dGVybmFsR3JvdXBzID0gKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xyXG5cdFx0Y29uc3QgZXh0ZXJuYWxJZCA9IGV2ZW50LnRhcmdldC52YWx1ZVxyXG5cdFx0Y29uc3QgY2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkXHJcblx0XHRjb25zdCB7IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cHMsIHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMgfSA9IHRoaXMucHJvcHNcclxuXHJcblx0XHRjb25zdCBhbGxPd25lckV4dGVybmFsR3JvdXBzID0gbWFwKHRoaXMuc3RhdGUub3duZXJTY2hlZHVsZXMsIG9zID0+IG9zLmV4dGVybmFsR3JvdXBzKS5yZWR1Y2UoKGEsIGIpID0+XHJcblx0XHRcdChhIHx8IFtdKS5jb25jYXQoYiB8fCBbXSlcclxuXHRcdClcclxuXHRcdGNvbnN0IHNlbGVjdGVkRXh0ZXJuYWxHcm91cHNDb3B5ID0gc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwcy5zbGljZSgpXHJcblxyXG5cdFx0aWYgKGNoZWNrZWQpIHtcclxuXHRcdFx0Y29uc3Qgb3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwID0gb3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3Vwcy5maW5kKFxyXG5cdFx0XHRcdG9lZyA9PiBvZWcuZXh0ZXJuYWxJZCA9PT0gZXh0ZXJuYWxJZFxyXG5cdFx0XHQpXHJcblx0XHRcdGNvbnN0IHNlbGVjdGVkRXh0ZXJuYWxHcm91cCA9IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cFxyXG5cdFx0XHRcdD8gb3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwXHJcblx0XHRcdFx0OiBhbGxPd25lckV4dGVybmFsR3JvdXBzPy5maW5kKGFvID0+IGFvLmV4dGVybmFsSWQgPT09IGV4dGVybmFsSWQpXHJcblxyXG5cdFx0XHRpZiAoc2VsZWN0ZWRFeHRlcm5hbEdyb3VwKSB7XHJcblx0XHRcdFx0c2VsZWN0ZWRFeHRlcm5hbEdyb3Vwc0NvcHkucHVzaChzZWxlY3RlZEV4dGVybmFsR3JvdXApXHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJlbW92ZShzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSwgc2VnID0+IHNlZy5leHRlcm5hbElkID09PSBleHRlcm5hbElkKVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucHJvcHMuaGFuZGxlU2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyhzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSlcclxuXHR9XHJcblxyXG5cdGdldE93bmVyVW5pVGltZUdyb3VwcyA9IChvd25lclNjaGVkdWxlOiBPd25lclNjaGVkdWxlLCB1c2VySWQ6IHN0cmluZywgZXh0ZXJuYWxUZXJtSWQ6IG51bWJlcikgPT4ge1xyXG5cdFx0aWYgKGlzUHVyZHVlU2hhcmQoKSAmJiBvd25lclNjaGVkdWxlLnN0YXR1cyA9PT0gTU9ERUxfU1RBVFVTLlVOSU5JVElBTElaRUQgJiYgIW93bmVyU2NoZWR1bGUuZXh0ZXJuYWxHcm91cHMpIHtcclxuXHRcdFx0cmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhvd25lclNjaGVkdWxlLmhvb2tJZCwgKGRhdGE6IEluc3RydWN0b3JTY2hlZHVsZSB8IEZldGNoRXJyb3JEYXRhIHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdHVucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhvd25lclNjaGVkdWxlLmhvb2tJZClcclxuXHRcdFx0XHRpZiAoIWRhdGEgfHwgaXNGZXRjaEVycm9yRGF0YShkYXRhKSkge1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGlzU2hvd2luZ0Vycm9yQWxlcnQ6IHRydWUsIGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmU6IHRydWUgfSlcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRVc2VyVW5pVGltZUdyb3Vwcyh1c2VySWQsIGRhdGEuZXh0ZXJuYWxHcm91cHMpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdFx0XHRtb2RlbE5hbWU6ICd1bmlUaW1lSW5zdHJ1Y3RvclNjaGVkdWxlJyxcclxuXHRcdFx0XHRxdWVyeVBhcmFtczoge1xyXG5cdFx0XHRcdFx0ZXh0ZXJuYWxUZXJtSWQsXHJcblx0XHRcdFx0XHR1c2VySWRcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdG5vU3RvcmU6IHRydWUsXHJcblx0XHRcdFx0Z3VpZDogb3duZXJTY2hlZHVsZS5ob29rSWRcclxuXHRcdFx0fSlcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHNldFVzZXJVbmlUaW1lR3JvdXBzID0gKHVzZXJJZDogc3RyaW5nLCBleHRlcm5hbEdyb3VwczogVW5pVGltZUdyb3VwW10pID0+IHtcclxuXHRcdC8vIFNldHRpbmcgdGhlIHVzZXIncyBjb3Vyc2Ugc2VjdGlvbnMgbG9hZCBzdGF0dXMgdG8gYmUgcmVhZHlcclxuXHRcdGNvbnN0IG93bmVyU2NoZWR1bGVzID0gdGhpcy5zdGF0ZS5vd25lclNjaGVkdWxlcyB8fCB7fVxyXG5cdFx0b3duZXJTY2hlZHVsZXNbdXNlcklkXS5zdGF0dXMgPSBNT0RFTF9TVEFUVVMuUkVBRFlcclxuXHRcdG93bmVyU2NoZWR1bGVzW3VzZXJJZF0uZXh0ZXJuYWxHcm91cHMgPSBleHRlcm5hbEdyb3Vwc1xyXG5cclxuXHRcdGNvbnN0IGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUgPSBldmVyeShvd25lclNjaGVkdWxlcywgb3MgPT4gb3Muc3RhdHVzID09PSBNT0RFTF9TVEFUVVMuUkVBRFkpXHJcblxyXG5cdFx0dGhpcy5zZXRTdGF0ZSh7XHJcblx0XHRcdG93bmVyU2NoZWR1bGVzLFxyXG5cdFx0XHRpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lXHJcblx0XHR9KVxyXG5cdH1cclxuXHJcblx0ZGlzcGxheU93bmVyU2NoZWR1bGVzID0gKG93bmVyU2NoZWR1bGVzOiBEaWN0aW9uYXJ5PE93bmVyU2NoZWR1bGU+KSA9PiB7XHJcblx0XHRyZXR1cm4gbWFwKG93bmVyU2NoZWR1bGVzLCBvcyA9PiB7XHJcblx0XHRcdGlmICghIW9zLmV4dGVybmFsR3JvdXBzICYmIG9zLmV4dGVybmFsR3JvdXBzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFx0PGRpdiBrZXk9e29zLmhvb2tJZH0+XHJcblx0XHRcdFx0XHRcdDxoND57ZGlzcGxheU5hbWUob3Mub3duZXIpfTwvaDQ+XHJcblx0XHRcdFx0XHRcdHt0aGlzLmRpc3BsYXlVbmlUaW1lR3JvdXBzKG9zLmV4dGVybmFsR3JvdXBzKX1cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdClcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdGRpc3BsYXlVbmlUaW1lR3JvdXBzID0gKGV4dGVybmFsR3JvdXBzOiBBcnJheTxFeHRlcm5hbEdyb3VwIHwgTHRpTGF1bmNoIHwgVW5pVGltZUdyb3VwPikgPT4ge1xyXG5cdFx0Y29uc3QgeyBzZWxlY3RlZEV4dGVybmFsR3JvdXBzLCBjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMsIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcywgdXNlckluZm8sIGRpc2FibGVkIH0gPVxyXG5cdFx0XHR0aGlzLnByb3BzXHJcblxyXG5cdFx0cmV0dXJuIG9yZGVyQnkoZXh0ZXJuYWxHcm91cHMsIFsnZGVzY3JpcHRpb24nXSkubWFwKChlZywgaW5kZXgpID0+IHtcclxuXHRcdFx0Y29uc3QgaXNDb25uZWN0ZWQgPSBzZWxlY3RlZEV4dGVybmFsR3JvdXBzLnNvbWUoXHJcblx0XHRcdFx0c2VnID0+XHJcblx0XHRcdFx0XHRzZWcuZXh0ZXJuYWxJZCA9PT0gZWcuZXh0ZXJuYWxJZCAmJlxyXG5cdFx0XHRcdFx0c2VnLmV4dGVybmFsUHJvdmlkZXJJZCA9PT0gZWcuZXh0ZXJuYWxQcm92aWRlcklkICYmXHJcblx0XHRcdFx0XHRzZWcudXNlcklkID09PSBlZy51c2VySWRcclxuXHRcdFx0KVxyXG5cclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGNhbkNvbm5lY3RBbnlFeHRlcm5hbEdyb3VwcyB8fFxyXG5cdFx0XHRcdCh1c2VySW5mby5pZCA9PT0gZWcudXNlcklkICYmIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcykgfHxcclxuXHRcdFx0XHRpc0Nvbm5lY3RlZFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFx0PEZvcm1DaGVja1xyXG5cdFx0XHRcdFx0XHRpZD17YGV4dGVybmFsLWdyb3VwLSR7ZWcuaWR9YH1cclxuXHRcdFx0XHRcdFx0dHlwZT1cImNoZWNrYm94XCJcclxuXHRcdFx0XHRcdFx0a2V5PXtpbmRleH1cclxuXHRcdFx0XHRcdFx0b25DaGFuZ2U9e3RoaXMuaGFuZGxlU2VsZWN0RXh0ZXJuYWxHcm91cHN9XHJcblx0XHRcdFx0XHRcdHZhbHVlPXtlZy5leHRlcm5hbElkfVxyXG5cdFx0XHRcdFx0XHRjaGVja2VkPXtpc0Nvbm5lY3RlZH1cclxuXHRcdFx0XHRcdFx0ZGlzYWJsZWQ9eyh1c2VySW5mby5pZCAhPT0gZWcudXNlcklkICYmICFjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMpIHx8IGRpc2FibGVkfVxyXG5cdFx0XHRcdFx0XHRsYWJlbD17YCR7ZWcubmFtZX0gJHtlZy5kZXNjcmlwdGlvbiA/IGAoJHtlZy5kZXNjcmlwdGlvbn0pYCA6ICcnfWB9XHJcblx0XHRcdFx0XHQvPlxyXG5cdFx0XHRcdClcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gbnVsbFxyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdHJlbmRlcigpIHtcclxuXHRcdGNvbnN0IHsgZGlzYWJsZWRJbmZvTWVzc2FnZSB9ID0gdGhpcy5wcm9wc1xyXG5cdFx0Y29uc3QgeyBvd25lclNjaGVkdWxlcywgaXNVbmlUaW1lU2NoZWR1bGVMb2FkaW5nRG9uZSwgaXNTaG93aW5nRXJyb3JBbGVydCB9ID0gdGhpcy5zdGF0ZVxyXG5cdFx0Y29uc3QgaGFzQW55RXh0ZXJuYWxHcm91cHMgPSBzb21lKG93bmVyU2NoZWR1bGVzLCBvcyA9PiAhIW9zLmV4dGVybmFsR3JvdXBzICYmIG9zLmV4dGVybmFsR3JvdXBzLmxlbmd0aCA+IDApXHJcblxyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0PGRpdj5cclxuXHRcdFx0XHR7IWlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUgJiYgPExvYWRpbmcgLz59XHJcblx0XHRcdFx0e2lzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUgJiYgKFxyXG5cdFx0XHRcdFx0PGRpdj5cclxuXHRcdFx0XHRcdFx0eyFoYXNBbnlFeHRlcm5hbEdyb3VwcyAmJiAoXHJcblx0XHRcdFx0XHRcdFx0PEFsZXJ0V2l0aEljb24gdmFyaWFudD1cImluZm9cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxwPk5vIGNvdXJzZSBzZWN0aW9ucyBlbGlnaWJsZSBmb3Igcm9zdGVyIHN5bmMuPC9wPlxyXG5cdFx0XHRcdFx0XHRcdDwvQWxlcnRXaXRoSWNvbj5cclxuXHRcdFx0XHRcdFx0KX1cclxuXHRcdFx0XHRcdFx0eyEhZGlzYWJsZWRJbmZvTWVzc2FnZSAmJiBoYXNBbnlFeHRlcm5hbEdyb3VwcyAmJiAoXHJcblx0XHRcdFx0XHRcdFx0PEFsZXJ0V2l0aEljb24gdmFyaWFudD1cImluZm9cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxwPntkaXNhYmxlZEluZm9NZXNzYWdlfTwvcD5cclxuXHRcdFx0XHRcdFx0XHQ8L0FsZXJ0V2l0aEljb24+XHJcblx0XHRcdFx0XHRcdCl9XHJcblx0XHRcdFx0XHRcdHtpc1Nob3dpbmdFcnJvckFsZXJ0ICYmIChcclxuXHRcdFx0XHRcdFx0XHQ8QWxlcnRXaXRoSWNvblxyXG5cdFx0XHRcdFx0XHRcdFx0dmFyaWFudD1cIndhcm5pbmdcIlxyXG5cdFx0XHRcdFx0XHRcdFx0b25DbG9zZT17KCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNldFN0YXRlKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpc1Nob3dpbmdFcnJvckFsZXJ0OiBmYWxzZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdFx0XHRcdFx0fX0+XHJcblx0XHRcdFx0XHRcdFx0XHQ8cCBjbGFzc05hbWU9XCJtYTBcIj5Pb3BzISBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBsb2FkaW5nLiBQbGVhc2UgdHJ5IGFnYWluLjwvcD5cclxuXHRcdFx0XHRcdFx0XHQ8L0FsZXJ0V2l0aEljb24+XHJcblx0XHRcdFx0XHRcdCl9eycgJ31cclxuXHRcdFx0XHRcdFx0e2hhc0FueUV4dGVybmFsR3JvdXBzICYmICEhb3duZXJTY2hlZHVsZXMgJiYgKFxyXG5cdFx0XHRcdFx0XHRcdDxGb3JtR3JvdXAgY2xhc3NOYW1lPVwibWw0IGY2XCI+e3RoaXMuZGlzcGxheU93bmVyU2NoZWR1bGVzKG93bmVyU2NoZWR1bGVzKX08L0Zvcm1Hcm91cD5cclxuXHRcdFx0XHRcdFx0KX1cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdCl9XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0KVxyXG5cdH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsZUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sY0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sWUFBQSxHQUFBUCxPQUFBO0FBWUEsSUFBQVEsTUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsTUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsTUFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsS0FBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksY0FBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsUUFBQSxHQUFBYixPQUFBO0FBQXVDLElBQUFjLFdBQUEsR0FBQWQsT0FBQTtBQUFBLFNBQUFFLHdCQUFBYSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBZix1QkFBQSxZQUFBQSxDQUFBYSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFH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
|