studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/ActionList.js +164 -37
- package/lib/components/AlertDialog.js +128 -12
- package/lib/components/AlertWithIcon.js +88 -29
- package/lib/components/ConnectedModal.js +35 -12
- package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
- package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
- package/lib/components/Dropdowns/UserDropdown.js +105 -24
- package/lib/components/Dropdowns/index.js +4 -10
- package/lib/components/EntityOwnerList.js +47 -21
- package/lib/components/Error.js +101 -12
- package/lib/components/ErrorBoundary.js +127 -38
- package/lib/components/ErrorMessage.js +39 -12
- package/lib/components/Forms/DateField.js +56 -45
- package/lib/components/Forms/TimeField.js +76 -45
- package/lib/components/Forms/index.js +3 -5
- package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
- package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
- package/lib/components/Groups/ExternalGroups/Table.js +176 -48
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
- package/lib/components/Groups/RosterSyncInfo.js +142 -23
- package/lib/components/HOC/AccessibleAppComponent.js +88 -72
- package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
- package/lib/components/HOC/AsyncComponent.js +49 -41
- package/lib/components/HOC/AuthenticatedComponent.js +55 -44
- package/lib/components/HOC/CollectionComponent.js +154 -104
- package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
- package/lib/components/HOC/CollectionItemComponent.js +152 -100
- package/lib/components/HOC/ConnectedModalComponent.js +87 -69
- package/lib/components/HOC/DataDependentComponent.js +26 -27
- package/lib/components/HOC/EntityComponent.js +57 -53
- package/lib/components/HOC/FullscreenModalComponent.js +139 -108
- package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
- package/lib/components/HOC/GuidComponent.js +20 -20
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
- package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
- package/lib/components/HOC/SearchPersistorComponent.js +237 -173
- package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
- package/lib/components/HOC/UserComponent.js +6 -8
- package/lib/components/Icons/IconAlphaList.js +28 -8
- package/lib/components/Icons/IconExternalUser.js +28 -8
- package/lib/components/Icons/IconImpersonation.js +28 -8
- package/lib/components/Icons/IconStopImpersonating.js +28 -8
- package/lib/components/Icons/IconTable.js +29 -9
- package/lib/components/Icons/IconTableDeleteCol.js +28 -8
- package/lib/components/Icons/IconTableDeleteRow.js +28 -8
- package/lib/components/Icons/IconTableInsertCol.js +28 -8
- package/lib/components/Icons/IconTableInsertRow.js +28 -8
- package/lib/components/Impersonation/Button.js +71 -16
- package/lib/components/Impersonation/Link.js +72 -16
- package/lib/components/Impersonation/UserDetail.js +60 -11
- package/lib/components/Loading.js +23 -8
- package/lib/components/LockDownBrowser/Check.js +188 -51
- package/lib/components/LockDownBrowser/ExitButton.js +22 -13
- package/lib/components/LockDownBrowser/Launch.js +64 -64
- package/lib/components/Lti/Confirm.js +147 -14
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
- package/lib/components/Lti/Launch.js +99 -25
- package/lib/components/Lti/LaunchGroup.js +81 -16
- package/lib/components/ManageTable.js +304 -90
- package/lib/components/ManageTableNoDataComponent.js +38 -7
- package/lib/components/NewVersionAlert.js +76 -49
- package/lib/components/NotFound.js +81 -11
- package/lib/components/Notifications.js +179 -129
- package/lib/components/PaginationNextButton.js +28 -9
- package/lib/components/PaginationPreviousButton.js +28 -9
- package/lib/components/Quill/CustomToolbar.js +427 -222
- package/lib/components/Quill/Formats/Image.js +67 -67
- package/lib/components/Quill/Formats/List.js +38 -47
- package/lib/components/Quill/Formats/Video.js +23 -26
- package/lib/components/Quill/ImageDropModule.js +136 -114
- package/lib/components/Quill/ImageWarning.js +41 -12
- package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
- package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
- package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
- package/lib/components/Quill/TableModule/constants.js +40 -42
- package/lib/components/Quill/TableModule/index.js +357 -305
- package/lib/components/Quill/TableModule/utils.js +39 -48
- package/lib/components/Quill/accessibilityFix.js +219 -223
- package/lib/components/Quill/index.js +30 -33
- package/lib/components/RefreshIndicator/Bordered.js +44 -10
- package/lib/components/RefreshIndicator/Inline.js +43 -12
- package/lib/components/RefreshIndicator/index.js +257 -62
- package/lib/components/SearchControls.js +211 -14
- package/lib/components/SentryRoute.js +5 -7
- package/lib/components/Tables/RoleFilter.js +66 -38
- package/lib/components/Tables/TextFilter.js +58 -18
- package/lib/components/UserRoles/Add.js +193 -99
- package/lib/components/UserRoles/Context.js +3 -6
- package/lib/components/UserRoles/RoleCell.js +176 -75
- package/lib/components/UserRoles/Select.js +151 -20
- package/lib/components/UserRoles/Table.js +215 -82
- package/lib/components/UserRoles/index.js +526 -386
- package/lib/config/eslint/index.js +26 -29
- package/lib/config/eslint/lib/order.js +21 -28
- package/lib/config/eslint/lib/prettier.js +15 -19
- package/lib/config/eslint/lib/typescript.js +87 -113
- package/lib/config/eslint/react.js +18 -15
- package/lib/constants/baseActivity.js +26 -28
- package/lib/constants/baseRole.js +10 -12
- package/lib/constants/configuration.js +43 -55
- package/lib/constants/externalProviderType.js +6 -8
- package/lib/constants/fetchErrorData.js +10 -12
- package/lib/constants/index.js +13 -15
- package/lib/constants/lockDownBrowser.js +23 -25
- package/lib/constants/mockData.js +370 -300
- package/lib/constants/modelStatus.js +11 -13
- package/lib/constants/notificationType.js +8 -10
- package/lib/constants/operatingSystem.js +8 -10
- package/lib/constants/shard.js +7 -9
- package/lib/constants/table.js +18 -22
- package/lib/constants/tier.js +8 -10
- package/lib/constants/userRole.js +11 -8
- package/lib/endpointMappings.js +191 -182
- package/lib/hooks/useCollection.js +79 -65
- package/lib/hooks/useCollectionConfiguration.js +220 -80
- package/lib/hooks/useCollectionItem.js +151 -57
- package/lib/hooks/useGuid.js +16 -9
- package/lib/hooks/usePrevious.js +14 -13
- package/lib/index.js +11 -26
- package/lib/redux/actionCreator.js +44 -35
- package/lib/redux/actions/AuthAction.js +45 -32
- package/lib/redux/actions/ModalAction.js +6 -8
- package/lib/redux/actions/ModelAction.js +95 -43
- package/lib/redux/actions/NotificationAction.js +6 -8
- package/lib/redux/actions/SearchAction.js +5 -7
- package/lib/redux/actions/index.js +6 -8
- package/lib/redux/configureReducers.js +48 -46
- package/lib/redux/configureStore.js +77 -91
- package/lib/redux/helpers.js +2 -5
- package/lib/redux/reducers/authReducer.js +44 -43
- package/lib/redux/reducers/index.js +7 -14
- package/lib/redux/reducers/modalsReducer.js +43 -31
- package/lib/redux/reducers/modelsReducer.js +131 -137
- package/lib/redux/reducers/notificationsReducer.js +20 -20
- package/lib/redux/reducers/searchReducer.js +13 -13
- package/lib/redux/sagas/appInsightsSaga.js +19 -21
- package/lib/redux/sagas/authSaga.js +248 -234
- package/lib/redux/sagas/caliperSaga.js +142 -131
- package/lib/redux/sagas/clockOffsetSaga.js +29 -32
- package/lib/redux/sagas/configurationSaga.js +8 -10
- package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
- package/lib/redux/sagas/errorSaga.js +23 -24
- package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
- package/lib/redux/sagas/identityProviderSaga.js +19 -21
- package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
- package/lib/redux/sagas/modelFetchSaga.js +302 -286
- package/lib/redux/sagas/noStoreSaga.js +60 -61
- package/lib/redux/sagas/postLoginDataSaga.js +37 -32
- package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
- package/lib/redux/sagas/rootSaga.js +77 -60
- package/lib/redux/sagas/sentrySaga.js +25 -28
- package/lib/redux/sagas/userIdSaga.js +13 -15
- package/lib/services/codeProviderService.js +21 -21
- package/lib/services/dateService.js +6 -8
- package/lib/services/documentService.js +10 -11
- package/lib/services/fetchService.js +103 -95
- package/lib/services/persistenceService.js +27 -30
- package/lib/services/ticketProviderService.js +25 -25
- package/lib/services/tokenPersistenceService.js +8 -10
- package/lib/services/windowService.js +14 -16
- package/lib/startup.js +110 -101
- package/lib/types/AppConfiguration.js +2 -2
- package/lib/types/Artifact.js +7 -9
- package/lib/types/BaseReduxState.js +2 -2
- package/lib/types/Client.js +2 -2
- package/lib/types/Collection.js +2 -2
- package/lib/types/Configuration.js +2 -2
- package/lib/types/DeepLinkingResponseRequest.js +2 -2
- package/lib/types/DeletableModel.js +2 -2
- package/lib/types/Event.js +2 -2
- package/lib/types/ExternalGroup.js +2 -2
- package/lib/types/ExternalProvider.js +2 -2
- package/lib/types/ExternalTerm.js +2 -2
- package/lib/types/Group.js +2 -2
- package/lib/types/IdentityProvider.js +2 -2
- package/lib/types/LtiLaunch.js +2 -2
- package/lib/types/NameOnlyEntity.js +2 -2
- package/lib/types/Notification.js +2 -2
- package/lib/types/OptionalRecord.js +2 -2
- package/lib/types/OwnerSchedule.js +2 -2
- package/lib/types/PropertyOfType.js +2 -2
- package/lib/types/Quill.js +2 -2
- package/lib/types/RoleDescription.js +2 -2
- package/lib/types/Search.js +2 -2
- package/lib/types/SimpleLocation.js +2 -2
- package/lib/types/UniTime.js +2 -2
- package/lib/types/User.js +2 -2
- package/lib/types/UserRole.js +2 -2
- package/lib/types/auth/AuthState.js +2 -2
- package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
- package/lib/types/auth/ClientCredentials.js +2 -2
- package/lib/types/auth/CodeProviderService.js +2 -2
- package/lib/types/auth/LocalLoginRequestBody.js +2 -2
- package/lib/types/auth/TicketProviderService.js +2 -2
- package/lib/types/auth/TokenPersistenceService.js +2 -2
- package/lib/types/auth/index.js +8 -10
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +29 -31
- package/lib/types/net/EndpointConfig.js +2 -2
- package/lib/types/net/EndpointMapping.js +2 -2
- package/lib/types/net/EndpointMappings.js +2 -2
- package/lib/types/net/ErrorHandler.js +2 -2
- package/lib/types/net/FetchConfig.js +2 -2
- package/lib/types/net/FetchErrorData.js +6 -8
- package/lib/types/net/FetchResult.js +2 -2
- package/lib/types/net/HTTPMethod.js +2 -2
- package/lib/types/net/HTTPStatusCode.js +12 -14
- package/lib/types/net/Metadata.js +2 -2
- package/lib/types/net/Model.js +2 -2
- package/lib/types/net/ModelCollection.js +2 -2
- package/lib/types/net/ModelsState.js +2 -2
- package/lib/types/net/OAuthToken.js +2 -2
- package/lib/types/net/OAuthTokenOrNull.js +2 -2
- package/lib/types/net/TokenAccessFunction.js +2 -2
- package/lib/types/net/index.js +17 -19
- package/lib/utils/baseActivity.js +83 -85
- package/lib/utils/baseRole.js +32 -36
- package/lib/utils/collection.js +403 -297
- package/lib/utils/cookies.js +19 -23
- package/lib/utils/date.js +188 -205
- package/lib/utils/dom.js +130 -131
- package/lib/utils/domainIdentifier.js +4 -8
- package/lib/utils/entityUserRole.js +2 -5
- package/lib/utils/error.js +14 -19
- package/lib/utils/events.js +32 -31
- package/lib/utils/externalGroup.js +20 -25
- package/lib/utils/externalProviders.js +4 -7
- package/lib/utils/externalTerms.js +6 -6
- package/lib/utils/fetch.js +168 -176
- package/lib/utils/group.js +14 -11
- package/lib/utils/groupDates.js +38 -46
- package/lib/utils/groupRoles.js +23 -32
- package/lib/utils/lockDownBrowser.js +12 -15
- package/lib/utils/logger.js +23 -28
- package/lib/utils/lti.js +4 -7
- package/lib/utils/model.js +28 -43
- package/lib/utils/number.js +9 -13
- package/lib/utils/promise.js +23 -26
- package/lib/utils/quill.js +55 -60
- package/lib/utils/route.js +52 -60
- package/lib/utils/search.js +72 -87
- package/lib/utils/shard.js +33 -42
- package/lib/utils/sort.js +47 -50
- package/lib/utils/string.js +10 -12
- package/lib/utils/table.js +29 -33
- package/lib/utils/timezone.js +7 -12
- package/lib/utils/url.js +130 -144
- package/lib/utils/user.js +54 -64
- package/lib/utils/userAgent.js +7 -14
- package/lib/utils/userRole.js +36 -39
- package/package.json +17 -3
|
@@ -1,351 +1,421 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.mockSyncedGroups = mockSyncedGroups;
|
|
8
|
-
exports.mockLtiGroups = mockLtiGroups;
|
|
9
|
-
exports.mockTermGroups = mockTermGroups;
|
|
10
|
-
exports.mockTermAndUniTimeGroups = mockTermAndUniTimeGroups;
|
|
11
|
-
exports.mockPastGroups = mockPastGroups;
|
|
12
|
-
exports.mockPastAndCurrentGroups = mockPastAndCurrentGroups;
|
|
13
|
-
const lodash_1 = require("lodash");
|
|
14
|
-
const externalProviderType_1 = require("../constants/externalProviderType");
|
|
15
|
-
const types_1 = require("../types");
|
|
16
|
-
const baseRole_1 = require("./baseRole");
|
|
17
|
-
const tier_1 = require("./tier");
|
|
1
|
+
import { merge } from 'lodash';
|
|
2
|
+
import { EXTERNAL_PROVIDER_TYPE } from '../constants/externalProviderType';
|
|
3
|
+
import { HTTP_STATUS_CODE } from '../types';
|
|
4
|
+
import { BASE_ROLE } from './baseRole';
|
|
5
|
+
import { TIER } from './tier';
|
|
6
|
+
|
|
18
7
|
//#region General
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
8
|
+
|
|
9
|
+
export const defaultAppConfiguration = {
|
|
10
|
+
NODE_ENV: 'test',
|
|
11
|
+
APP_NAME: 'StudioKit',
|
|
12
|
+
TIER: TIER.LOCAL,
|
|
13
|
+
API_BASE_URL: '',
|
|
14
|
+
ROOT_DOMAIN: 'studiokit.org',
|
|
15
|
+
CLIENT_ID: 'web',
|
|
16
|
+
CLIENT_SECRET: '****',
|
|
17
|
+
IS_DOWNTIME: false,
|
|
18
|
+
LMS_NAME: 'Brightspace',
|
|
19
|
+
GRADABLE_DESCRIPTOR: 'assessment'
|
|
30
20
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
21
|
+
export const defaultLocation = {
|
|
22
|
+
hash: '',
|
|
23
|
+
host: 'purdue.dev.studiokit.org',
|
|
24
|
+
hostname: 'purdue.dev.studiokit.org',
|
|
25
|
+
href: 'https://purdue.dev.studiokit.org/',
|
|
26
|
+
pathname: '/',
|
|
27
|
+
port: '',
|
|
28
|
+
protocol: 'https:',
|
|
29
|
+
search: ''
|
|
40
30
|
};
|
|
41
|
-
function mockHistory() {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
31
|
+
export function mockHistory() {
|
|
32
|
+
return {
|
|
33
|
+
length: 0,
|
|
34
|
+
scrollRestoration: 'auto',
|
|
35
|
+
state: {},
|
|
36
|
+
back: jest.fn(),
|
|
37
|
+
forward: jest.fn(),
|
|
38
|
+
go: jest.fn(),
|
|
39
|
+
pushState: jest.fn(),
|
|
40
|
+
replaceState: jest.fn()
|
|
41
|
+
};
|
|
52
42
|
}
|
|
43
|
+
|
|
53
44
|
//#endregion General
|
|
45
|
+
|
|
54
46
|
//#region Dates
|
|
47
|
+
|
|
55
48
|
/** 5/15/18 - 8/14/18 */
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
export const pastDates = {
|
|
50
|
+
startDate: '2018-05-15T04:00:00.000Z',
|
|
51
|
+
endDate: '2018-08-15T03:59:59.999Z'
|
|
59
52
|
};
|
|
53
|
+
|
|
60
54
|
/** 8/15/18 - 12/31/18: */
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
export const currentDates = {
|
|
56
|
+
startDate: '2018-08-15T04:00:00.000Z',
|
|
57
|
+
endDate: '2019-01-01T04:59:59.999Z'
|
|
64
58
|
};
|
|
59
|
+
|
|
65
60
|
/**
|
|
66
61
|
* The default date and time for all tests. Used by the 'mockdate' package. One month into `currentDates`.
|
|
67
62
|
*/
|
|
68
|
-
|
|
63
|
+
export const defaultDate = '2018-09-15T04:00:00.000Z';
|
|
64
|
+
|
|
69
65
|
//#endregion Dates
|
|
66
|
+
|
|
70
67
|
//#region Users
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
68
|
+
|
|
69
|
+
export const defaultUser = {
|
|
70
|
+
userInfo: {
|
|
71
|
+
id: '1',
|
|
72
|
+
firstName: null,
|
|
73
|
+
lastName: null,
|
|
74
|
+
email: null,
|
|
75
|
+
uid: null,
|
|
76
|
+
activities: [],
|
|
77
|
+
roles: [],
|
|
78
|
+
dateDemoGenerationSucceeded: null,
|
|
79
|
+
dateStored: defaultDate,
|
|
80
|
+
dateLastUpdated: defaultDate,
|
|
81
|
+
isImpersonated: false,
|
|
82
|
+
careerAccountAlias: null,
|
|
83
|
+
employeeNumber: null,
|
|
84
|
+
userName: 'test',
|
|
85
|
+
puid: null,
|
|
86
|
+
lockDownBrowserTestLaunchUrl: null
|
|
87
|
+
}
|
|
90
88
|
};
|
|
91
|
-
|
|
89
|
+
export const defaultNamelessUserInfo = {
|
|
90
|
+
...defaultUser.userInfo,
|
|
91
|
+
...{
|
|
92
92
|
email: 'nicki@minaj.superbass',
|
|
93
93
|
uid: 'nm-nameless'
|
|
94
|
-
}
|
|
95
|
-
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
export const defaultNamedUserInfo = {
|
|
97
|
+
...defaultUser.userInfo,
|
|
98
|
+
...{
|
|
96
99
|
firstName: 'Nicki',
|
|
97
100
|
lastName: 'Minaj',
|
|
98
101
|
uid: 'nm-named'
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
export function mockUser() {
|
|
105
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
106
|
+
return merge({
|
|
107
|
+
userInfo: {
|
|
108
|
+
activities
|
|
109
|
+
}
|
|
110
|
+
}, defaultUser);
|
|
102
111
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
email: 'jane@gmail.com',
|
|
110
|
-
uid: 'jane',
|
|
111
|
-
entityId: 1,
|
|
112
|
-
role: baseRole_1.BASE_ROLE.GROUP_OWNER,
|
|
113
|
-
isExternal: false
|
|
112
|
+
export const defaultGroupOwnerUserInfo = {
|
|
113
|
+
...defaultUser.userInfo,
|
|
114
|
+
id: '2',
|
|
115
|
+
firstName: 'Jane',
|
|
116
|
+
lastName: 'Doe',
|
|
117
|
+
email: 'jane@gmail.com'
|
|
114
118
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
119
|
+
export const defaultGroupOwner = {
|
|
120
|
+
id: '1',
|
|
121
|
+
userId: '2',
|
|
122
|
+
firstName: 'Jane',
|
|
123
|
+
lastName: 'Doe',
|
|
124
|
+
email: 'jane@gmail.com',
|
|
125
|
+
uid: 'jane',
|
|
126
|
+
entityId: 1,
|
|
127
|
+
role: BASE_ROLE.GROUP_OWNER,
|
|
128
|
+
isExternal: false
|
|
125
129
|
};
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
130
|
+
export const defaultNamelessGroupLearner = {
|
|
131
|
+
id: '2',
|
|
132
|
+
userId: '3',
|
|
133
|
+
firstName: null,
|
|
134
|
+
lastName: null,
|
|
135
|
+
email: 'nicki@minaj.superbass',
|
|
136
|
+
uid: 'nm-nameless',
|
|
137
|
+
entityId: 1,
|
|
138
|
+
role: BASE_ROLE.GROUP_LEARNER,
|
|
139
|
+
isExternal: false
|
|
136
140
|
};
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
141
|
+
export const defaultNamedGroupLearner = {
|
|
142
|
+
id: '3',
|
|
143
|
+
userId: '4',
|
|
144
|
+
firstName: 'Nicki',
|
|
145
|
+
lastName: 'Minaj',
|
|
146
|
+
email: null,
|
|
147
|
+
uid: 'nm-named',
|
|
148
|
+
entityId: 1,
|
|
149
|
+
role: BASE_ROLE.GROUP_LEARNER,
|
|
150
|
+
isExternal: false
|
|
147
151
|
};
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
152
|
+
export const defaultGroupLearner = {
|
|
153
|
+
id: '4',
|
|
154
|
+
userId: '5',
|
|
155
|
+
firstName: 'Joe',
|
|
156
|
+
lastName: 'Schmoe',
|
|
157
|
+
email: 'nope@gmail.com',
|
|
158
|
+
uid: 'nope',
|
|
159
|
+
entityId: 1,
|
|
160
|
+
role: BASE_ROLE.GROUP_LEARNER,
|
|
161
|
+
isExternal: false
|
|
158
162
|
};
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
163
|
+
export const defaultExternalGroupLearner = {
|
|
164
|
+
id: '5',
|
|
165
|
+
userId: '6',
|
|
166
|
+
firstName: 'Bob',
|
|
167
|
+
lastName: 'Loblaw',
|
|
168
|
+
email: 'bobloblaw@lawblog.com',
|
|
169
|
+
uid: 'bobloblaw',
|
|
170
|
+
entityId: 1,
|
|
171
|
+
role: BASE_ROLE.GROUP_LEARNER,
|
|
172
|
+
isExternal: true
|
|
169
173
|
};
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
174
|
+
export const defaultGroupGrader = {
|
|
175
|
+
id: '6',
|
|
176
|
+
userId: '7',
|
|
177
|
+
firstName: 'Grader',
|
|
178
|
+
lastName: 'McGradeface',
|
|
179
|
+
email: 'grader@gmail.com',
|
|
180
|
+
uid: 'grader',
|
|
181
|
+
entityId: 1,
|
|
182
|
+
role: BASE_ROLE.GROUP_GRADER,
|
|
183
|
+
isExternal: false
|
|
184
|
+
};
|
|
185
|
+
export const defaultGroupUserRoles = [defaultGroupOwner, defaultGroupLearner, defaultExternalGroupLearner];
|
|
186
|
+
export const defaultAdminUserRoles = [{
|
|
187
|
+
id: '1',
|
|
188
|
+
firstName: 'Joe',
|
|
189
|
+
lastName: 'Schmo',
|
|
190
|
+
email: null,
|
|
191
|
+
uid: null,
|
|
192
|
+
role: BASE_ROLE.ADMIN
|
|
193
|
+
}, {
|
|
194
|
+
id: '2',
|
|
195
|
+
firstName: null,
|
|
196
|
+
lastName: null,
|
|
197
|
+
email: 'carlysimon@clouds.in.coffee',
|
|
198
|
+
uid: 'carlysimon',
|
|
199
|
+
role: BASE_ROLE.ADMIN
|
|
200
|
+
}];
|
|
201
|
+
|
|
189
202
|
//#endregion Users
|
|
203
|
+
|
|
190
204
|
//#region Groups
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
externalGroups: []
|
|
205
|
+
|
|
206
|
+
export const defaultGroup = {
|
|
207
|
+
roles: [],
|
|
208
|
+
activities: [],
|
|
209
|
+
owners: [{
|
|
210
|
+
id: '1',
|
|
211
|
+
entityId: 1,
|
|
212
|
+
firstName: 'Instructor',
|
|
213
|
+
lastName: 'McInstructor',
|
|
214
|
+
email: null,
|
|
215
|
+
uid: null
|
|
216
|
+
}],
|
|
217
|
+
graders: [],
|
|
218
|
+
id: 1,
|
|
219
|
+
name: 'McGroup',
|
|
220
|
+
externalTermId: null,
|
|
221
|
+
startDate: currentDates.startDate,
|
|
222
|
+
endDate: currentDates.endDate,
|
|
223
|
+
isDeleted: false,
|
|
224
|
+
isRosterSyncEnabled: false,
|
|
225
|
+
externalGroups: []
|
|
213
226
|
};
|
|
214
|
-
function mockGroups(
|
|
215
|
-
|
|
227
|
+
export function mockGroups() {
|
|
228
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
229
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
230
|
+
return {
|
|
231
|
+
'1': merge({
|
|
232
|
+
activities,
|
|
233
|
+
roles
|
|
234
|
+
}, defaultGroup)
|
|
235
|
+
};
|
|
216
236
|
}
|
|
217
|
-
function mockSyncedGroups(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
237
|
+
export function mockSyncedGroups() {
|
|
238
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
239
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
240
|
+
const rosterSyncEnabledGroup = merge({
|
|
241
|
+
activities,
|
|
242
|
+
roles
|
|
243
|
+
}, defaultGroup);
|
|
244
|
+
rosterSyncEnabledGroup.isRosterSyncEnabled = true;
|
|
245
|
+
return {
|
|
246
|
+
'1': rosterSyncEnabledGroup
|
|
247
|
+
};
|
|
221
248
|
}
|
|
222
|
-
function mockLtiGroups(
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
249
|
+
export function mockLtiGroups() {
|
|
250
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
251
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
252
|
+
const ltiGroup = merge({
|
|
253
|
+
activities,
|
|
254
|
+
roles
|
|
255
|
+
}, defaultGroup);
|
|
256
|
+
ltiGroup.isRosterSyncEnabled = true;
|
|
257
|
+
ltiGroup.externalGroups = [{
|
|
258
|
+
id: 1,
|
|
259
|
+
externalProviderId: 2,
|
|
260
|
+
groupId: 1,
|
|
261
|
+
userId: '1',
|
|
262
|
+
name: 'LTI ExternalGroup',
|
|
263
|
+
description: 'LTI 101',
|
|
264
|
+
gradesUrl: 'www.lti.org',
|
|
265
|
+
rosterUrl: null,
|
|
266
|
+
isAutoGradePushEnabled: false,
|
|
267
|
+
externalId: '1',
|
|
268
|
+
typename: 'ExternalGroup'
|
|
269
|
+
}];
|
|
270
|
+
return {
|
|
271
|
+
'1': ltiGroup
|
|
272
|
+
};
|
|
241
273
|
}
|
|
242
|
-
function mockTermGroups(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
274
|
+
export function mockTermGroups() {
|
|
275
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
276
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
277
|
+
const group = merge({
|
|
278
|
+
activities,
|
|
279
|
+
roles
|
|
280
|
+
}, defaultGroup);
|
|
281
|
+
group.startDate = null;
|
|
282
|
+
group.endDate = null;
|
|
283
|
+
group.externalTermId = 1;
|
|
284
|
+
return {
|
|
285
|
+
'1': group
|
|
286
|
+
};
|
|
248
287
|
}
|
|
249
|
-
function mockTermAndUniTimeGroups(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
288
|
+
export function mockTermAndUniTimeGroups() {
|
|
289
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
290
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
291
|
+
const group = merge({
|
|
292
|
+
activities,
|
|
293
|
+
roles
|
|
294
|
+
}, defaultGroup);
|
|
295
|
+
group.startDate = null;
|
|
296
|
+
group.endDate = null;
|
|
297
|
+
group.externalTermId = 1;
|
|
298
|
+
group.externalGroups = [{
|
|
299
|
+
id: 1,
|
|
300
|
+
externalProviderId: 1,
|
|
301
|
+
groupId: 1,
|
|
302
|
+
userId: '1',
|
|
303
|
+
name: 'UniTime ExternalGroup',
|
|
304
|
+
description: 'UniTime 101',
|
|
305
|
+
gradesUrl: null,
|
|
306
|
+
rosterUrl: null,
|
|
307
|
+
isAutoGradePushEnabled: false,
|
|
308
|
+
externalId: '1',
|
|
309
|
+
typename: 'ExternalGroup'
|
|
310
|
+
}];
|
|
311
|
+
return {
|
|
312
|
+
'1': group
|
|
313
|
+
};
|
|
270
314
|
}
|
|
271
|
-
function mockPastGroups(
|
|
272
|
-
|
|
273
|
-
|
|
315
|
+
export function mockPastGroups() {
|
|
316
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
317
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
318
|
+
const pastGroup = merge({
|
|
319
|
+
activities,
|
|
320
|
+
roles
|
|
321
|
+
}, defaultGroup, pastDates);
|
|
322
|
+
return {
|
|
323
|
+
'1': pastGroup
|
|
324
|
+
};
|
|
274
325
|
}
|
|
275
|
-
function mockPastAndCurrentGroups(
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
326
|
+
export function mockPastAndCurrentGroups() {
|
|
327
|
+
let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
328
|
+
let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
329
|
+
const pastGroup = merge({
|
|
330
|
+
activities,
|
|
331
|
+
roles
|
|
332
|
+
}, defaultGroup, pastDates);
|
|
333
|
+
const currentGroup = merge({
|
|
334
|
+
activities,
|
|
335
|
+
roles
|
|
336
|
+
}, defaultGroup, {
|
|
337
|
+
id: '2'
|
|
338
|
+
}, currentDates);
|
|
339
|
+
return {
|
|
340
|
+
'1': pastGroup,
|
|
341
|
+
'2': currentGroup
|
|
342
|
+
};
|
|
281
343
|
}
|
|
344
|
+
|
|
282
345
|
//#endregion Groups
|
|
346
|
+
|
|
283
347
|
//#region ExternalTerms + ExternalProviders
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
348
|
+
|
|
349
|
+
export const defaultExternalProviders = {
|
|
350
|
+
'1': {
|
|
351
|
+
id: 1,
|
|
352
|
+
typename: EXTERNAL_PROVIDER_TYPE.UNITIME,
|
|
353
|
+
termSyncEnabled: true,
|
|
354
|
+
rosterSyncEnabled: true,
|
|
355
|
+
gradePushEnabled: false,
|
|
356
|
+
shouldDisplayCreateNonLtiGroupAlert: false
|
|
357
|
+
},
|
|
358
|
+
'2': {
|
|
359
|
+
id: 2,
|
|
360
|
+
typename: EXTERNAL_PROVIDER_TYPE.LTI,
|
|
361
|
+
termSyncEnabled: false,
|
|
362
|
+
rosterSyncEnabled: false,
|
|
363
|
+
gradePushEnabled: true,
|
|
364
|
+
shouldDisplayCreateNonLtiGroupAlert: true
|
|
365
|
+
}
|
|
301
366
|
};
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
367
|
+
export const defaultExternalTerms = {
|
|
368
|
+
'1': {
|
|
369
|
+
id: 1,
|
|
370
|
+
externalProviderId: 1,
|
|
371
|
+
externalId: 'foo',
|
|
372
|
+
name: 'UniTime Fall Term',
|
|
373
|
+
startDate: currentDates.startDate,
|
|
374
|
+
endDate: currentDates.endDate
|
|
375
|
+
}
|
|
311
376
|
};
|
|
377
|
+
|
|
312
378
|
//#endregion ExternalTerms + ExternalProviders
|
|
379
|
+
|
|
313
380
|
//#region FetchErrorData
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
381
|
+
|
|
382
|
+
export const internalServerErrorData = {
|
|
383
|
+
status: HTTP_STATUS_CODE.INTERNAL_SERVER_ERROR,
|
|
384
|
+
title: 'Error',
|
|
385
|
+
detail: 'An error has occurred.'
|
|
318
386
|
};
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
387
|
+
export const requestTimedOutErrorData = {
|
|
388
|
+
status: HTTP_STATUS_CODE.REQUEST_TIMEOUT,
|
|
389
|
+
title: 'Request Timeout',
|
|
390
|
+
detail: null
|
|
323
391
|
};
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
392
|
+
export const forbiddenErrorData = {
|
|
393
|
+
status: HTTP_STATUS_CODE.FORBIDDEN,
|
|
394
|
+
title: 'Forbidden',
|
|
395
|
+
detail: 'Your request has been denied. You do not have access.'
|
|
328
396
|
};
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
397
|
+
export const unauthorizedErrorData = {
|
|
398
|
+
status: HTTP_STATUS_CODE.UNAUTHORIZED,
|
|
399
|
+
title: 'Unauthorized',
|
|
400
|
+
detail: 'Your request is unauthorized. You must authenticate.'
|
|
333
401
|
};
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
402
|
+
export const badRequestErrorData = {
|
|
403
|
+
status: HTTP_STATUS_CODE.BAD_REQUEST,
|
|
404
|
+
title: 'Bad Request',
|
|
405
|
+
detail: 'Reasons'
|
|
338
406
|
};
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
407
|
+
export const badRequestFullErrorData = {
|
|
408
|
+
status: HTTP_STATUS_CODE.BAD_REQUEST,
|
|
409
|
+
title: 'Bad Request',
|
|
410
|
+
detail: 'Reasons',
|
|
411
|
+
// include all optional properties
|
|
412
|
+
type: 'https://tools.ietf.org/html/rfc7231#section-6.5.1',
|
|
413
|
+
instance: 'instance',
|
|
414
|
+
traceId: '00-3914b43b452b94e3ff4c327922880a03-4cfed6fe42afdd8f-00',
|
|
415
|
+
errors: {
|
|
416
|
+
password: ['The Password must be at least 6 characters long.']
|
|
417
|
+
}
|
|
350
418
|
};
|
|
419
|
+
|
|
351
420
|
//#endregion FetchErrorData
|
|
421
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtZXJnZSIsIkVYVEVSTkFMX1BST1ZJREVSX1RZUEUiLCJIVFRQX1NUQVRVU19DT0RFIiwiQkFTRV9ST0xFIiwiVElFUiIsImRlZmF1bHRBcHBDb25maWd1cmF0aW9uIiwiTk9ERV9FTlYiLCJBUFBfTkFNRSIsIkxPQ0FMIiwiQVBJX0JBU0VfVVJMIiwiUk9PVF9ET01BSU4iLCJDTElFTlRfSUQiLCJDTElFTlRfU0VDUkVUIiwiSVNfRE9XTlRJTUUiLCJMTVNfTkFNRSIsIkdSQURBQkxFX0RFU0NSSVBUT1IiLCJkZWZhdWx0TG9jYXRpb24iLCJoYXNoIiwiaG9zdCIsImhvc3RuYW1lIiwiaHJlZiIsInBhdGhuYW1lIiwicG9ydCIsInByb3RvY29sIiwic2VhcmNoIiwibW9ja0hpc3RvcnkiLCJsZW5ndGgiLCJzY3JvbGxSZXN0b3JhdGlvbiIsInN0YXRlIiwiYmFjayIsImplc3QiLCJmbiIsImZvcndhcmQiLCJnbyIsInB1c2hTdGF0ZSIsInJlcGxhY2VTdGF0ZSIsInBhc3REYXRlcyIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJjdXJyZW50RGF0ZXMiLCJkZWZhdWx0RGF0ZSIsImRlZmF1bHRVc2VyIiwidXNlckluZm8iLCJpZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJ1aWQiLCJhY3Rpdml0aWVzIiwicm9sZXMiLCJkYXRlRGVtb0dlbmVyYXRpb25TdWNjZWVkZWQiLCJkYXRlU3RvcmVkIiwiZGF0ZUxhc3RVcGRhdGVkIiwiaXNJbXBlcnNvbmF0ZWQiLCJjYXJlZXJBY2NvdW50QWxpYXMiLCJlbXBsb3llZU51bWJlciIsInVzZXJOYW1lIiwicHVpZCIsImxvY2tEb3duQnJvd3NlclRlc3RMYXVuY2hVcmwiLCJkZWZhdWx0TmFtZWxlc3NVc2VySW5mbyIsImRlZmF1bHROYW1lZFVzZXJJbmZvIiwibW9ja1VzZXIiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJkZWZhdWx0R3JvdXBPd25lclVzZXJJbmZvIiwiZGVmYXVsdEdyb3VwT3duZXIiLCJ1c2VySWQiLCJlbnRpdHlJZCIsInJvbGUiLCJHUk9VUF9PV05FUiIsImlzRXh0ZXJuYWwiLCJkZWZhdWx0TmFtZWxlc3NHcm91cExlYXJuZXIiLCJHUk9VUF9MRUFSTkVSIiwiZGVmYXVsdE5hbWVkR3JvdXBMZWFybmVyIiwiZGVmYXVsdEdyb3VwTGVhcm5lciIsImRlZmF1bHRFeHRlcm5hbEdyb3VwTGVhcm5lciIsImRlZmF1bHRHcm91cEdyYWRlciIsIkdST1VQX0dSQURFUiIsImRlZmF1bHRHcm91cFVzZXJSb2xlcyIsImRlZmF1bHRBZG1pblVzZXJSb2xlcyIsIkFETUlOIiwiZGVmYXVsdEdyb3VwIiwib3duZXJzIiwiZ3JhZGVycyIsIm5hbWUiLCJleHRlcm5hbFRlcm1JZCIsImlzRGVsZXRlZCIsImlzUm9zdGVyU3luY0VuYWJsZWQiLCJleHRlcm5hbEdyb3VwcyIsIm1vY2tHcm91cHMiLCJtb2NrU3luY2VkR3JvdXBzIiwicm9zdGVyU3luY0VuYWJsZWRHcm91cCIsIm1vY2tMdGlHcm91cHMiLCJsdGlHcm91cCIsImV4dGVybmFsUHJvdmlkZXJJZCIsImdyb3VwSWQiLCJkZXNjcmlwdGlvbiIsImdyYWRlc1VybCIsInJvc3RlclVybCIsImlzQXV0b0dyYWRlUHVzaEVuYWJsZWQiLCJleHRlcm5hbElkIiwidHlwZW5hbWUiLCJtb2NrVGVybUdyb3VwcyIsImdyb3VwIiwibW9ja1Rlcm1BbmRVbmlUaW1lR3JvdXBzIiwibW9ja1Bhc3RHcm91cHMiLCJwYXN0R3JvdXAiLCJtb2NrUGFzdEFuZEN1cnJlbnRHcm91cHMiLCJjdXJyZW50R3JvdXAiLCJkZWZhdWx0RXh0ZXJuYWxQcm92aWRlcnMiLCJVTklUSU1FIiwidGVybVN5bmNFbmFibGVkIiwicm9zdGVyU3luY0VuYWJsZWQiLCJncmFkZVB1c2hFbmFibGVkIiwic2hvdWxkRGlzcGxheUNyZWF0ZU5vbkx0aUdyb3VwQWxlcnQiLCJMVEkiLCJkZWZhdWx0RXh0ZXJuYWxUZXJtcyIsImludGVybmFsU2VydmVyRXJyb3JEYXRhIiwic3RhdHVzIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwidGl0bGUiLCJkZXRhaWwiLCJyZXF1ZXN0VGltZWRPdXRFcnJvckRhdGEiLCJSRVFVRVNUX1RJTUVPVVQiLCJmb3JiaWRkZW5FcnJvckRhdGEiLCJGT1JCSURERU4iLCJ1bmF1dGhvcml6ZWRFcnJvckRhdGEiLCJVTkFVVEhPUklaRUQiLCJiYWRSZXF1ZXN0RXJyb3JEYXRhIiwiQkFEX1JFUVVFU1QiLCJiYWRSZXF1ZXN0RnVsbEVycm9yRGF0YSIsInR5cGUiLCJpbnN0YW5jZSIsInRyYWNlSWQiLCJlcnJvcnMiLCJwYXNzd29yZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvbW9ja0RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBFWFRFUk5BTF9QUk9WSURFUl9UWVBFIH0gZnJvbSAnLi4vY29uc3RhbnRzL2V4dGVybmFsUHJvdmlkZXJUeXBlJ1xuaW1wb3J0IHtcblx0QXBwQ29uZmlndXJhdGlvbixcblx0RXh0ZXJuYWxQcm92aWRlcixcblx0RXh0ZXJuYWxUZXJtLFxuXHRGZXRjaEVycm9yRGF0YSxcblx0R3JvdXAsXG5cdEdyb3VwVXNlclJvbGUsXG5cdEhUVFBfU1RBVFVTX0NPREUsXG5cdE1vZGVsQ29sbGVjdGlvbixcblx0U2ltcGxlTG9jYXRpb24sXG5cdFVzZXJJbmZvLFxuXHRVc2VyUm9sZVxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IEJBU0VfUk9MRSB9IGZyb20gJy4vYmFzZVJvbGUnXG5pbXBvcnQgeyBUSUVSIH0gZnJvbSAnLi90aWVyJ1xuXG4vLyNyZWdpb24gR2VuZXJhbFxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFwcENvbmZpZ3VyYXRpb246IEFwcENvbmZpZ3VyYXRpb24gPSB7XG5cdE5PREVfRU5WOiAndGVzdCcsXG5cdEFQUF9OQU1FOiAnU3R1ZGlvS2l0Jyxcblx0VElFUjogVElFUi5MT0NBTCxcblx0QVBJX0JBU0VfVVJMOiAnJyxcblx0Uk9PVF9ET01BSU46ICdzdHVkaW9raXQub3JnJyxcblx0Q0xJRU5UX0lEOiAnd2ViJyxcblx0Q0xJRU5UX1NFQ1JFVDogJyoqKionLFxuXHRJU19ET1dOVElNRTogZmFsc2UsXG5cdExNU19OQU1FOiAnQnJpZ2h0c3BhY2UnLFxuXHRHUkFEQUJMRV9ERVNDUklQVE9SOiAnYXNzZXNzbWVudCdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2NhdGlvbjogU2ltcGxlTG9jYXRpb24gPSB7XG5cdGhhc2g6ICcnLFxuXHRob3N0OiAncHVyZHVlLmRldi5zdHVkaW9raXQub3JnJyxcblx0aG9zdG5hbWU6ICdwdXJkdWUuZGV2LnN0dWRpb2tpdC5vcmcnLFxuXHRocmVmOiAnaHR0cHM6Ly9wdXJkdWUuZGV2LnN0dWRpb2tpdC5vcmcvJyxcblx0cGF0aG5hbWU6ICcvJyxcblx0cG9ydDogJycsXG5cdHByb3RvY29sOiAnaHR0cHM6Jyxcblx0c2VhcmNoOiAnJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja0hpc3RvcnkoKTogSGlzdG9yeSB7XG5cdHJldHVybiB7XG5cdFx0bGVuZ3RoOiAwLFxuXHRcdHNjcm9sbFJlc3RvcmF0aW9uOiAnYXV0bycsXG5cdFx0c3RhdGU6IHt9LFxuXHRcdGJhY2s6IGplc3QuZm4oKSxcblx0XHRmb3J3YXJkOiBqZXN0LmZuKCksXG5cdFx0Z286IGplc3QuZm4oKSxcblx0XHRwdXNoU3RhdGU6IGplc3QuZm4oKSxcblx0XHRyZXBsYWNlU3RhdGU6IGplc3QuZm4oKVxuXHR9XG59XG5cbi8vI2VuZHJlZ2lvbiBHZW5lcmFsXG5cbi8vI3JlZ2lvbiBEYXRlc1xuXG4vKiogNS8xNS8xOCAtIDgvMTQvMTggKi9cbmV4cG9ydCBjb25zdCBwYXN0RGF0ZXMgPSB7XG5cdHN0YXJ0RGF0ZTogJzIwMTgtMDUtMTVUMDQ6MDA6MDAuMDAwWicsXG5cdGVuZERhdGU6ICcyMDE4LTA4LTE1VDAzOjU5OjU5Ljk5OVonXG59XG5cbi8qKiA4LzE1LzE4IC0gMTIvMzEvMTg6ICovXG5leHBvcnQgY29uc3QgY3VycmVudERhdGVzID0ge1xuXHRzdGFydERhdGU6ICcyMDE4LTA4LTE1VDA0OjAwOjAwLjAwMFonLFxuXHRlbmREYXRlOiAnMjAxOS0wMS0wMVQwNDo1OTo1OS45OTlaJ1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGRhdGUgYW5kIHRpbWUgZm9yIGFsbCB0ZXN0cy4gVXNlZCBieSB0aGUgJ21vY2tkYXRlJyBwYWNrYWdlLiBPbmUgbW9udGggaW50byBgY3VycmVudERhdGVzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHREYXRlID0gJzIwMTgtMDktMTVUMDQ6MDA6MDAuMDAwWidcblxuLy8jZW5kcmVnaW9uIERhdGVzXG5cbi8vI3JlZ2lvbiBVc2Vyc1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFVzZXIgPSB7XG5cdHVzZXJJbmZvOiB7XG5cdFx0aWQ6ICcxJyxcblx0XHRmaXJzdE5hbWU6IG51bGwsXG5cdFx0bGFzdE5hbWU6IG51bGwsXG5cdFx0ZW1haWw6IG51bGwsXG5cdFx0dWlkOiBudWxsLFxuXHRcdGFjdGl2aXRpZXM6IFtdLFxuXHRcdHJvbGVzOiBbXSxcblx0XHRkYXRlRGVtb0dlbmVyYXRpb25TdWNjZWVkZWQ6IG51bGwsXG5cdFx0ZGF0ZVN0b3JlZDogZGVmYXVsdERhdGUsXG5cdFx0ZGF0ZUxhc3RVcGRhdGVkOiBkZWZhdWx0RGF0ZSxcblx0XHRpc0ltcGVyc29uYXRlZDogZmFsc2UsXG5cdFx0Y2FyZWVyQWNjb3VudEFsaWFzOiBudWxsLFxuXHRcdGVtcGxveWVlTnVtYmVyOiBudWxsLFxuXHRcdHVzZXJOYW1lOiAndGVzdCcsXG5cdFx0cHVpZDogbnVsbCxcblx0XHRsb2NrRG93bkJyb3dzZXJUZXN0TGF1bmNoVXJsOiBudWxsXG5cdH0gYXMgVXNlckluZm9cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHROYW1lbGVzc1VzZXJJbmZvID0ge1xuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcblx0Li4ue1xuXHRcdGVtYWlsOiAnbmlja2lAbWluYWouc3VwZXJiYXNzJyxcblx0XHR1aWQ6ICdubS1uYW1lbGVzcydcblx0fVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE5hbWVkVXNlckluZm8gPSB7XG5cdC4uLmRlZmF1bHRVc2VyLnVzZXJJbmZvLFxuXHQuLi57XG5cdFx0Zmlyc3ROYW1lOiAnTmlja2knLFxuXHRcdGxhc3ROYW1lOiAnTWluYWonLFxuXHRcdHVpZDogJ25tLW5hbWVkJ1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVXNlcihhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdKTogeyB1c2VySW5mbzogVXNlckluZm8gfSB7XG5cdHJldHVybiBtZXJnZSh7IHVzZXJJbmZvOiB7IGFjdGl2aXRpZXMgfSB9LCBkZWZhdWx0VXNlcilcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cE93bmVyVXNlckluZm86IFVzZXJJbmZvID0ge1xuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcblx0aWQ6ICcyJyxcblx0Zmlyc3ROYW1lOiAnSmFuZScsXG5cdGxhc3ROYW1lOiAnRG9lJyxcblx0ZW1haWw6ICdqYW5lQGdtYWlsLmNvbSdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cE93bmVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzEnLFxuXHR1c2VySWQ6ICcyJyxcblx0Zmlyc3ROYW1lOiAnSmFuZScsXG5cdGxhc3ROYW1lOiAnRG9lJyxcblx0ZW1haWw6ICdqYW5lQGdtYWlsLmNvbScsXG5cdHVpZDogJ2phbmUnLFxuXHRlbnRpdHlJZDogMSxcblx0cm9sZTogQkFTRV9ST0xFLkdST1VQX09XTkVSLFxuXHRpc0V4dGVybmFsOiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE5hbWVsZXNzR3JvdXBMZWFybmVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzInLFxuXHR1c2VySWQ6ICczJyxcblx0Zmlyc3ROYW1lOiBudWxsLFxuXHRsYXN0TmFtZTogbnVsbCxcblx0ZW1haWw6ICduaWNraUBtaW5hai5zdXBlcmJhc3MnLFxuXHR1aWQ6ICdubS1uYW1lbGVzcycsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcblx0aXNFeHRlcm5hbDogZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHROYW1lZEdyb3VwTGVhcm5lcjogR3JvdXBVc2VyUm9sZSA9IHtcblx0aWQ6ICczJyxcblx0dXNlcklkOiAnNCcsXG5cdGZpcnN0TmFtZTogJ05pY2tpJyxcblx0bGFzdE5hbWU6ICdNaW5haicsXG5cdGVtYWlsOiBudWxsLFxuXHR1aWQ6ICdubS1uYW1lZCcsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcblx0aXNFeHRlcm5hbDogZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cExlYXJuZXI6IEdyb3VwVXNlclJvbGUgPSB7XG5cdGlkOiAnNCcsXG5cdHVzZXJJZDogJzUnLFxuXHRmaXJzdE5hbWU6ICdKb2UnLFxuXHRsYXN0TmFtZTogJ1NjaG1vZScsXG5cdGVtYWlsOiAnbm9wZUBnbWFpbC5jb20nLFxuXHR1aWQ6ICdub3BlJyxcblx0ZW50aXR5SWQ6IDEsXG5cdHJvbGU6IEJBU0VfUk9MRS5HUk9VUF9MRUFSTkVSLFxuXHRpc0V4dGVybmFsOiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4dGVybmFsR3JvdXBMZWFybmVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzUnLFxuXHR1c2VySWQ6ICc2Jyxcblx0Zmlyc3ROYW1lOiAnQm9iJyxcblx0bGFzdE5hbWU6ICdMb2JsYXcnLFxuXHRlbWFpbDogJ2JvYmxvYmxhd0BsYXdibG9nLmNvbScsXG5cdHVpZDogJ2JvYmxvYmxhdycsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcblx0aXNFeHRlcm5hbDogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwR3JhZGVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzYnLFxuXHR1c2VySWQ6ICc3Jyxcblx0Zmlyc3ROYW1lOiAnR3JhZGVyJyxcblx0bGFzdE5hbWU6ICdNY0dyYWRlZmFjZScsXG5cdGVtYWlsOiAnZ3JhZGVyQGdtYWlsLmNvbScsXG5cdHVpZDogJ2dyYWRlcicsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfR1JBREVSLFxuXHRpc0V4dGVybmFsOiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwVXNlclJvbGVzID0gW2RlZmF1bHRHcm91cE93bmVyLCBkZWZhdWx0R3JvdXBMZWFybmVyLCBkZWZhdWx0RXh0ZXJuYWxHcm91cExlYXJuZXJdXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QWRtaW5Vc2VyUm9sZXM6IFVzZXJSb2xlW10gPSBbXG5cdHtcblx0XHRpZDogJzEnLFxuXHRcdGZpcnN0TmFtZTogJ0pvZScsXG5cdFx0bGFzdE5hbWU6ICdTY2htbycsXG5cdFx0ZW1haWw6IG51bGwsXG5cdFx0dWlkOiBudWxsLFxuXHRcdHJvbGU6IEJBU0VfUk9MRS5BRE1JTlxuXHR9LFxuXHR7XG5cdFx0aWQ6ICcyJyxcblx0XHRmaXJzdE5hbWU6IG51bGwsXG5cdFx0bGFzdE5hbWU6IG51bGwsXG5cdFx0ZW1haWw6ICdjYXJseXNpbW9uQGNsb3Vkcy5pbi5jb2ZmZWUnLFxuXHRcdHVpZDogJ2Nhcmx5c2ltb24nLFxuXHRcdHJvbGU6IEJBU0VfUk9MRS5BRE1JTlxuXHR9XG5dXG5cbi8vI2VuZHJlZ2lvbiBVc2Vyc1xuXG4vLyNyZWdpb24gR3JvdXBzXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0R3JvdXA6IEdyb3VwID0ge1xuXHRyb2xlczogW10sXG5cdGFjdGl2aXRpZXM6IFtdLFxuXHRvd25lcnM6IFtcblx0XHR7XG5cdFx0XHRpZDogJzEnLFxuXHRcdFx0ZW50aXR5SWQ6IDEsXG5cdFx0XHRmaXJzdE5hbWU6ICdJbnN0cnVjdG9yJyxcblx0XHRcdGxhc3ROYW1lOiAnTWNJbnN0cnVjdG9yJyxcblx0XHRcdGVtYWlsOiBudWxsLFxuXHRcdFx0dWlkOiBudWxsXG5cdFx0fVxuXHRdLFxuXHRncmFkZXJzOiBbXSxcblx0aWQ6IDEsXG5cdG5hbWU6ICdNY0dyb3VwJyxcblx0ZXh0ZXJuYWxUZXJtSWQ6IG51bGwsXG5cdHN0YXJ0RGF0ZTogY3VycmVudERhdGVzLnN0YXJ0RGF0ZSxcblx0ZW5kRGF0ZTogY3VycmVudERhdGVzLmVuZERhdGUsXG5cdGlzRGVsZXRlZDogZmFsc2UsXG5cdGlzUm9zdGVyU3luY0VuYWJsZWQ6IGZhbHNlLFxuXHRleHRlcm5hbEdyb3VwczogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tHcm91cHMoYWN0aXZpdGllczogc3RyaW5nW10gPSBbXSwgcm9sZXM6IHN0cmluZ1tdID0gW10pOiBNb2RlbENvbGxlY3Rpb248R3JvdXA+IHtcblx0cmV0dXJuIHsgJzEnOiBtZXJnZSh7IGFjdGl2aXRpZXMsIHJvbGVzIH0sIGRlZmF1bHRHcm91cCkgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1N5bmNlZEdyb3VwcyhhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdLCByb2xlczogc3RyaW5nW10gPSBbXSk6IE1vZGVsQ29sbGVjdGlvbjxHcm91cD4ge1xuXHRjb25zdCByb3N0ZXJTeW5jRW5hYmxlZEdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxuXHRyb3N0ZXJTeW5jRW5hYmxlZEdyb3VwLmlzUm9zdGVyU3luY0VuYWJsZWQgPSB0cnVlXG5cdHJldHVybiB7ICcxJzogcm9zdGVyU3luY0VuYWJsZWRHcm91cCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrTHRpR3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XG5cdGNvbnN0IGx0aUdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxuXHRsdGlHcm91cC5pc1Jvc3RlclN5bmNFbmFibGVkID0gdHJ1ZVxuXHRsdGlHcm91cC5leHRlcm5hbEdyb3VwcyA9IFtcblx0XHR7XG5cdFx0XHRpZDogMSxcblx0XHRcdGV4dGVybmFsUHJvdmlkZXJJZDogMixcblx0XHRcdGdyb3VwSWQ6IDEsXG5cdFx0XHR1c2VySWQ6ICcxJyxcblx0XHRcdG5hbWU6ICdMVEkgRXh0ZXJuYWxHcm91cCcsXG5cdFx0XHRkZXNjcmlwdGlvbjogJ0xUSSAxMDEnLFxuXHRcdFx0Z3JhZGVzVXJsOiAnd3d3Lmx0aS5vcmcnLFxuXHRcdFx0cm9zdGVyVXJsOiBudWxsLFxuXHRcdFx0aXNBdXRvR3JhZGVQdXNoRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRleHRlcm5hbElkOiAnMScsXG5cdFx0XHR0eXBlbmFtZTogJ0V4dGVybmFsR3JvdXAnXG5cdFx0fVxuXHRdXG5cdHJldHVybiB7ICcxJzogbHRpR3JvdXAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Rlcm1Hcm91cHMoYWN0aXZpdGllczogc3RyaW5nW10gPSBbXSwgcm9sZXM6IHN0cmluZ1tdID0gW10pOiBNb2RlbENvbGxlY3Rpb248R3JvdXA+IHtcblx0Y29uc3QgZ3JvdXA6IEdyb3VwID0gbWVyZ2UoeyBhY3Rpdml0aWVzLCByb2xlcyB9LCBkZWZhdWx0R3JvdXApXG5cdGdyb3VwLnN0YXJ0RGF0ZSA9IG51bGxcblx0Z3JvdXAuZW5kRGF0ZSA9IG51bGxcblx0Z3JvdXAuZXh0ZXJuYWxUZXJtSWQgPSAxXG5cdHJldHVybiB7ICcxJzogZ3JvdXAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Rlcm1BbmRVbmlUaW1lR3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XG5cdGNvbnN0IGdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxuXHRncm91cC5zdGFydERhdGUgPSBudWxsXG5cdGdyb3VwLmVuZERhdGUgPSBudWxsXG5cdGdyb3VwLmV4dGVybmFsVGVybUlkID0gMVxuXHRncm91cC5leHRlcm5hbEdyb3VwcyA9IFtcblx0XHR7XG5cdFx0XHRpZDogMSxcblx0XHRcdGV4dGVybmFsUHJvdmlkZXJJZDogMSxcblx0XHRcdGdyb3VwSWQ6IDEsXG5cdFx0XHR1c2VySWQ6ICcxJyxcblx0XHRcdG5hbWU6ICdVbmlUaW1lIEV4dGVybmFsR3JvdXAnLFxuXHRcdFx0ZGVzY3JpcHRpb246ICdVbmlUaW1lIDEwMScsXG5cdFx0XHRncmFkZXNVcmw6IG51bGwsXG5cdFx0XHRyb3N0ZXJVcmw6IG51bGwsXG5cdFx0XHRpc0F1dG9HcmFkZVB1c2hFbmFibGVkOiBmYWxzZSxcblx0XHRcdGV4dGVybmFsSWQ6ICcxJyxcblx0XHRcdHR5cGVuYW1lOiAnRXh0ZXJuYWxHcm91cCdcblx0XHR9XG5cdF1cblx0cmV0dXJuIHsgJzEnOiBncm91cCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrUGFzdEdyb3VwcyhhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdLCByb2xlczogc3RyaW5nW10gPSBbXSk6IE1vZGVsQ29sbGVjdGlvbjxHcm91cD4ge1xuXHRjb25zdCBwYXN0R3JvdXA6IEdyb3VwID0gbWVyZ2UoeyBhY3Rpdml0aWVzLCByb2xlcyB9LCBkZWZhdWx0R3JvdXAsIHBhc3REYXRlcylcblx0cmV0dXJuIHsgJzEnOiBwYXN0R3JvdXAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Bhc3RBbmRDdXJyZW50R3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XG5cdGNvbnN0IHBhc3RHcm91cDogR3JvdXAgPSBtZXJnZSh7IGFjdGl2aXRpZXMsIHJvbGVzIH0sIGRlZmF1bHRHcm91cCwgcGFzdERhdGVzKVxuXHRjb25zdCBjdXJyZW50R3JvdXA6IEdyb3VwID0gbWVyZ2UoXG5cdFx0eyBhY3Rpdml0aWVzLCByb2xlcyB9LFxuXHRcdGRlZmF1bHRHcm91cCxcblx0XHR7XG5cdFx0XHRpZDogJzInXG5cdFx0fSxcblx0XHRjdXJyZW50RGF0ZXNcblx0KVxuXHRyZXR1cm4geyAnMSc6IHBhc3RHcm91cCwgJzInOiBjdXJyZW50R3JvdXAgfVxufVxuXG4vLyNlbmRyZWdpb24gR3JvdXBzXG5cbi8vI3JlZ2lvbiBFeHRlcm5hbFRlcm1zICsgRXh0ZXJuYWxQcm92aWRlcnNcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFeHRlcm5hbFByb3ZpZGVyczogTW9kZWxDb2xsZWN0aW9uPEV4dGVybmFsUHJvdmlkZXI+ID0ge1xuXHQnMSc6IHtcblx0XHRpZDogMSxcblx0XHR0eXBlbmFtZTogRVhURVJOQUxfUFJPVklERVJfVFlQRS5VTklUSU1FLFxuXHRcdHRlcm1TeW5jRW5hYmxlZDogdHJ1ZSxcblx0XHRyb3N0ZXJTeW5jRW5hYmxlZDogdHJ1ZSxcblx0XHRncmFkZVB1c2hFbmFibGVkOiBmYWxzZSxcblx0XHRzaG91bGREaXNwbGF5Q3JlYXRlTm9uTHRpR3JvdXBBbGVydDogZmFsc2Vcblx0fSxcblx0JzInOiB7XG5cdFx0aWQ6IDIsXG5cdFx0dHlwZW5hbWU6IEVYVEVSTkFMX1BST1ZJREVSX1RZUEUuTFRJLFxuXHRcdHRlcm1TeW5jRW5hYmxlZDogZmFsc2UsXG5cdFx0cm9zdGVyU3luY0VuYWJsZWQ6IGZhbHNlLFxuXHRcdGdyYWRlUHVzaEVuYWJsZWQ6IHRydWUsXG5cdFx0c2hvdWxkRGlzcGxheUNyZWF0ZU5vbkx0aUdyb3VwQWxlcnQ6IHRydWVcblx0fVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4dGVybmFsVGVybXM6IE1vZGVsQ29sbGVjdGlvbjxFeHRlcm5hbFRlcm0+ID0ge1xuXHQnMSc6IHtcblx0XHRpZDogMSxcblx0XHRleHRlcm5hbFByb3ZpZGVySWQ6IDEsXG5cdFx0ZXh0ZXJuYWxJZDogJ2ZvbycsXG5cdFx0bmFtZTogJ1VuaVRpbWUgRmFsbCBUZXJtJyxcblx0XHRzdGFydERhdGU6IGN1cnJlbnREYXRlcy5zdGFydERhdGUsXG5cdFx0ZW5kRGF0ZTogY3VycmVudERhdGVzLmVuZERhdGVcblx0fVxufVxuXG4vLyNlbmRyZWdpb24gRXh0ZXJuYWxUZXJtcyArIEV4dGVybmFsUHJvdmlkZXJzXG5cbi8vI3JlZ2lvbiBGZXRjaEVycm9yRGF0YVxuXG5leHBvcnQgY29uc3QgaW50ZXJuYWxTZXJ2ZXJFcnJvckRhdGE6IEZldGNoRXJyb3JEYXRhID0ge1xuXHRzdGF0dXM6IEhUVFBfU1RBVFVTX0NPREUuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuXHR0aXRsZTogJ0Vycm9yJyxcblx0ZGV0YWlsOiAnQW4gZXJyb3IgaGFzIG9jY3VycmVkLidcbn1cblxuZXhwb3J0IGNvbnN0IHJlcXVlc3RUaW1lZE91dEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5SRVFVRVNUX1RJTUVPVVQsXG5cdHRpdGxlOiAnUmVxdWVzdCBUaW1lb3V0Jyxcblx0ZGV0YWlsOiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBmb3JiaWRkZW5FcnJvckRhdGE6IEZldGNoRXJyb3JEYXRhID0ge1xuXHRzdGF0dXM6IEhUVFBfU1RBVFVTX0NPREUuRk9SQklEREVOLFxuXHR0aXRsZTogJ0ZvcmJpZGRlbicsXG5cdGRldGFpbDogJ1lvdXIgcmVxdWVzdCBoYXMgYmVlbiBkZW5pZWQuIFlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MuJ1xufVxuXG5leHBvcnQgY29uc3QgdW5hdXRob3JpemVkRXJyb3JEYXRhOiBGZXRjaEVycm9yRGF0YSA9IHtcblx0c3RhdHVzOiBIVFRQX1NUQVRVU19DT0RFLlVOQVVUSE9SSVpFRCxcblx0dGl0bGU6ICdVbmF1dGhvcml6ZWQnLFxuXHRkZXRhaWw6ICdZb3VyIHJlcXVlc3QgaXMgdW5hdXRob3JpemVkLiBZb3UgbXVzdCBhdXRoZW50aWNhdGUuJ1xufVxuXG5leHBvcnQgY29uc3QgYmFkUmVxdWVzdEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5CQURfUkVRVUVTVCxcblx0dGl0bGU6ICdCYWQgUmVxdWVzdCcsXG5cdGRldGFpbDogJ1JlYXNvbnMnXG59XG5cbmV4cG9ydCBjb25zdCBiYWRSZXF1ZXN0RnVsbEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5CQURfUkVRVUVTVCxcblx0dGl0bGU6ICdCYWQgUmVxdWVzdCcsXG5cdGRldGFpbDogJ1JlYXNvbnMnLFxuXHQvLyBpbmNsdWRlIGFsbCBvcHRpb25hbCBwcm9wZXJ0aWVzXG5cdHR5cGU6ICdodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xJyxcblx0aW5zdGFuY2U6ICdpbnN0YW5jZScsXG5cdHRyYWNlSWQ6ICcwMC0zOTE0YjQzYjQ1MmI5NGUzZmY0YzMyNzkyMjg4MGEwMy00Y2ZlZDZmZTQyYWZkZDhmLTAwJyxcblx0ZXJyb3JzOiB7XG5cdFx0cGFzc3dvcmQ6IFsnVGhlIFBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIGxvbmcuJ11cblx0fVxufVxuXG4vLyNlbmRyZWdpb24gRmV0Y2hFcnJvckRhdGFcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBSyxRQUFRLFFBQVE7QUFDOUIsU0FBU0Msc0JBQXNCLFFBQVEsbUNBQW1DO0FBQzFFLFNBT0NDLGdCQUFnQixRQUtWLFVBQVU7QUFDakIsU0FBU0MsU0FBUyxRQUFRLFlBQVk7QUFDdEMsU0FBU0MsSUFBSSxRQUFRLFFBQVE7O0FBRTdCOztBQUVBLE9BQU8sTUFBTUMsdUJBQXlDLEdBQUc7RUFDeERDLFFBQVEsRUFBRSxNQUFNO0VBQ2hCQyxRQUFRLEVBQUUsV0FBVztFQUNyQkgsSUFBSSxFQUFFQSxJQUFJLENBQUNJLEtBQUs7RUFDaEJDLFlBQVksRUFBRSxFQUFFO0VB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
|