@ukhomeoffice/cop-react-form-renderer 7.3.2-alpha.5 → 8.0.0-alpha
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/README.md +106 -32
- package/dist/components/CheckYourAnswers/Answer.d.ts +10 -0
- package/dist/components/CheckYourAnswers/CheckYourAnswers.d.ts +35 -0
- package/dist/components/CheckYourAnswers/index.d.ts +2 -0
- package/dist/components/CollectionPage/CollectionPage.d.ts +24 -0
- package/dist/components/CollectionPage/index.d.ts +1 -0
- package/dist/components/CollectionSummary/BannerStrip.d.ts +9 -0
- package/dist/components/CollectionSummary/CollectionSummary.d.ts +53 -0
- package/dist/components/CollectionSummary/Confirmation.d.ts +15 -0
- package/dist/components/CollectionSummary/RenderListView.d.ts +42 -0
- package/dist/components/CollectionSummary/SummaryCard.d.ts +62 -0
- package/dist/components/CollectionSummary/SummaryCardButtons.d.ts +21 -0
- package/dist/components/CollectionSummary/SummaryCardDetails.d.ts +14 -0
- package/dist/components/CollectionSummary/SummaryCardValidationContext.d.ts +9 -0
- package/dist/components/CollectionSummary/index.d.ts +2 -0
- package/dist/components/FormComponent/Collection.d.ts +39 -0
- package/dist/components/FormComponent/Container.d.ts +26 -0
- package/dist/components/FormComponent/FormComponent.d.ts +39 -0
- package/dist/components/FormComponent/helpers/addLabel.d.ts +7 -0
- package/dist/components/FormComponent/helpers/getComponentDisabled.d.ts +2 -0
- package/dist/components/FormComponent/helpers/getComponentError.d.ts +4 -0
- package/dist/components/FormComponent/helpers/getComponentFieldSet.d.ts +2 -0
- package/dist/components/FormComponent/helpers/index.d.ts +5 -0
- package/dist/components/FormComponent/index.d.ts +2 -0
- package/dist/components/FormPage/FormPage.d.ts +36 -0
- package/dist/components/FormPage/index.d.ts +2 -0
- package/dist/components/FormRenderer/FormRenderer.d.ts +39 -0
- package/dist/components/FormRenderer/handlers/cyaAction.d.ts +9 -0
- package/dist/components/FormRenderer/handlers/getPageId.d.ts +8 -0
- package/dist/components/FormRenderer/handlers/index.d.ts +6 -0
- package/dist/components/FormRenderer/handlers/navigate.d.ts +10 -0
- package/dist/components/FormRenderer/handlers/submissionError.d.ts +7 -0
- package/dist/components/FormRenderer/helpers/canActionProceed.d.ts +12 -0
- package/dist/components/FormRenderer/helpers/canCYASubmit.d.ts +10 -0
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.d.ts +51 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.d.ts +179 -0
- package/dist/components/FormRenderer/helpers/getCYA.d.ts +20 -0
- package/dist/components/FormRenderer/helpers/getFormState.d.ts +25 -0
- package/dist/components/FormRenderer/helpers/getNextPageId.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getPage.d.ts +9 -0
- package/dist/components/FormRenderer/helpers/getRelevantPages.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.d.ts +10 -0
- package/dist/components/FormRenderer/helpers/index.d.ts +29 -0
- package/dist/components/FormRenderer/index.d.ts +2 -0
- package/dist/components/FormRenderer/onCYAAction.d.ts +6 -0
- package/dist/components/FormRenderer/onPageAction.d.ts +2 -0
- package/dist/components/FormRenderer/onTaskAction.d.ts +2 -0
- package/dist/components/PageActions/ActionButton.d.ts +7 -0
- package/dist/components/PageActions/PageActions.d.ts +7 -0
- package/dist/components/PageActions/index.d.ts +2 -0
- package/dist/components/SummaryList/GroupAction.d.ts +12 -0
- package/dist/components/SummaryList/RowAction.d.ts +12 -0
- package/dist/components/SummaryList/SummaryList.d.ts +28 -0
- package/dist/components/SummaryList/SummaryList.stories.d.ts +10 -0
- package/dist/components/SummaryList/SummaryListHeadingRow.d.ts +7 -0
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.d.ts +16 -0
- package/dist/components/SummaryList/SummaryListRow.d.ts +19 -0
- package/dist/components/SummaryList/SummaryListTitleRow.d.ts +7 -0
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.d.ts +17 -0
- package/dist/components/SummaryList/helpers/getRowActionAttributes.d.ts +17 -0
- package/dist/components/SummaryList/helpers/index.d.ts +2 -0
- package/dist/components/SummaryList/index.d.ts +2 -0
- package/dist/components/TaskList/Task.d.ts +12 -0
- package/dist/components/TaskList/TaskList.d.ts +40 -0
- package/dist/components/TaskList/TaskState.d.ts +6 -0
- package/dist/components/TaskList/index.d.ts +2 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/context/HooksContext/HooksContext.d.ts +23 -0
- package/dist/context/HooksContext/index.d.ts +3 -0
- package/dist/context/ValidationContext/ValidationContext.d.ts +7 -0
- package/dist/context/ValidationContext/index.d.ts +3 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/useAxios.d.ts +2 -0
- package/dist/hooks/useGetRequest.d.ts +12 -0
- package/dist/hooks/useHooks.d.ts +2 -0
- package/dist/hooks/useRefData.d.ts +7 -0
- package/dist/hooks/useValidation.d.ts +2 -0
- package/dist/index.cjs +5 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6124 -81
- package/dist/models/CollectionLabels.d.ts +7 -0
- package/dist/models/ComponentTypes.d.ts +27 -0
- package/dist/models/EventTypes.d.ts +6 -0
- package/dist/models/FormPages.d.ts +6 -0
- package/dist/models/FormTypes.d.ts +10 -0
- package/dist/models/HubFormats.d.ts +5 -0
- package/dist/models/PageAction.d.ts +89 -0
- package/dist/models/TaskStates.d.ts +39 -0
- package/dist/models/index.d.ts +143 -0
- package/dist/setupTests.d.ts +14 -0
- package/dist/utils/CheckYourAnswers/getCYAAction.d.ts +20 -0
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.d.ts +22 -0
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.d.ts +22 -0
- package/dist/utils/CheckYourAnswers/getCYARow.d.ts +26 -0
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.d.ts +17 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.d.ts +2 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.d.ts +23 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.d.ts +2 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.d.ts +11 -0
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.d.ts +3 -0
- package/dist/utils/CheckYourAnswers/index.d.ts +5 -0
- package/dist/utils/CheckYourAnswers/showComponentCYA.d.ts +11 -0
- package/dist/utils/CollectionPage/addCollectionPageEntry.d.ts +12 -0
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.d.ts +13 -0
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.d.ts +13 -0
- package/dist/utils/CollectionPage/getCollectionPageActiveId.d.ts +14 -0
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.d.ts +15 -0
- package/dist/utils/CollectionPage/getCollectionPageData.d.ts +15 -0
- package/dist/utils/CollectionPage/getErrorsForCollection.d.ts +2 -0
- package/dist/utils/CollectionPage/getQuickEditPage.d.ts +40 -0
- package/dist/utils/CollectionPage/index.d.ts +13 -0
- package/dist/utils/CollectionPage/mergeCollectionPages.d.ts +13 -0
- package/dist/utils/CollectionPage/removeCollectionPageEntry.d.ts +11 -0
- package/dist/utils/CollectionPage/setCollectionPageData.d.ts +16 -0
- package/dist/utils/Component/addShowWhen.d.ts +13 -0
- package/dist/utils/Component/applyToComponentTree.d.ts +15 -0
- package/dist/utils/Component/cleanAttributes.d.ts +14 -0
- package/dist/utils/Component/elevateNestedComponents.d.ts +28 -0
- package/dist/utils/Component/getDefaultValue.d.ts +2 -0
- package/dist/utils/Component/getDefaultValueFromConfig.d.ts +2 -0
- package/dist/utils/Component/index.d.ts +12 -0
- package/dist/utils/Component/isEditable.d.ts +3 -0
- package/dist/utils/Component/optionIsSelected.d.ts +10 -0
- package/dist/utils/Component/setupContainerComponentsPath.d.ts +2 -0
- package/dist/utils/Component/showComponent.d.ts +2 -0
- package/dist/utils/Condition/index.d.ts +6 -0
- package/dist/utils/Condition/meetsAllConditions.d.ts +8 -0
- package/dist/utils/Condition/meetsCondition.d.ts +14 -0
- package/dist/utils/Condition/meetsOneCondition.d.ts +8 -0
- package/dist/utils/Condition/setupConditions.d.ts +2 -0
- package/dist/utils/Container/getEditableComponents.d.ts +7 -0
- package/dist/utils/Container/index.d.ts +6 -0
- package/dist/utils/Container/setupNesting.d.ts +2 -0
- package/dist/utils/Container/showContainer.d.ts +8 -0
- package/dist/utils/Data/applyFormula.d.ts +2 -0
- package/dist/utils/Data/deleteValues.d.ts +8 -0
- package/dist/utils/Data/getAutocompleteSource.d.ts +2 -0
- package/dist/utils/Data/getDataPath.d.ts +21 -0
- package/dist/utils/Data/getOptions.d.ts +2 -0
- package/dist/utils/Data/getSourceData.d.ts +17 -0
- package/dist/utils/Data/index.d.ts +15 -0
- package/dist/utils/Data/nestInRefdataOptions.d.ts +10 -0
- package/dist/utils/Data/refDataToOptions.d.ts +8 -0
- package/dist/utils/Data/setDataItem.d.ts +2 -0
- package/dist/utils/Data/setupFormData.d.ts +15 -0
- package/dist/utils/Data/setupRefDataUrlForComponent.d.ts +2 -0
- package/dist/utils/FormPage/applyConditionalProperties.d.ts +8 -0
- package/dist/utils/FormPage/getConditionalText.d.ts +23 -0
- package/dist/utils/FormPage/getFormPage.d.ts +9 -0
- package/dist/utils/FormPage/getFormPages.d.ts +9 -0
- package/dist/utils/FormPage/getPageActions.d.ts +13 -0
- package/dist/utils/FormPage/getParagraphFromText.d.ts +11 -0
- package/dist/utils/FormPage/index.d.ts +10 -0
- package/dist/utils/FormPage/showFormPage.d.ts +8 -0
- package/dist/utils/FormPage/showFormPageCYA.d.ts +8 -0
- package/dist/utils/FormPage/useComponent.d.ts +9 -0
- package/dist/utils/Format/formatData.d.ts +8 -0
- package/dist/utils/Format/formatDataForComponent.d.ts +15 -0
- package/dist/utils/Format/formatDataForForm.d.ts +8 -0
- package/dist/utils/Format/formatDataForPage.d.ts +15 -0
- package/dist/utils/Format/index.d.ts +7 -0
- package/dist/utils/Hub/getFormHub.d.ts +15 -0
- package/dist/utils/Hub/index.d.ts +4 -0
- package/dist/utils/Meta/constants.d.ts +2 -0
- package/dist/utils/Meta/documents/getDocuments.d.ts +2 -0
- package/dist/utils/Meta/documents/index.d.ts +6 -0
- package/dist/utils/Meta/documents/setDocumentsForField.d.ts +2 -0
- package/dist/utils/Meta/index.d.ts +9 -0
- package/dist/utils/Operate/checkValueIsTruthy.d.ts +9 -0
- package/dist/utils/Operate/deleteValueInFormData.d.ts +8 -0
- package/dist/utils/Operate/doesContainValue.d.ts +11 -0
- package/dist/utils/Operate/getFirstOf.d.ts +2 -0
- package/dist/utils/Operate/getIndexOfMatchingValueIn.d.ts +11 -0
- package/dist/utils/Operate/getLength.d.ts +11 -0
- package/dist/utils/Operate/index.d.ts +4 -0
- package/dist/utils/Operate/persistValueInFormData.d.ts +9 -0
- package/dist/utils/Operate/runPageOperations.d.ts +19 -0
- package/dist/utils/Operate/setValueInFormData.d.ts +2 -0
- package/dist/utils/Operate/shouldRun.d.ts +9 -0
- package/dist/utils/Validate/additional/conditionallyPermittedChange.d.ts +14 -0
- package/dist/utils/Validate/additional/conditionallyRequired.d.ts +11 -0
- package/dist/utils/Validate/additional/index.d.ts +2 -0
- package/dist/utils/Validate/additional/mustBeAfter.d.ts +14 -0
- package/dist/utils/Validate/additional/mustBeBefore.d.ts +14 -0
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.d.ts +15 -0
- package/dist/utils/Validate/additional/mustBeGreaterThan.d.ts +7 -0
- package/dist/utils/Validate/additional/mustBeInTheFuture.d.ts +8 -0
- package/dist/utils/Validate/additional/mustBeInThePast.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeLessThan.d.ts +7 -0
- package/dist/utils/Validate/additional/mustBeLongerThan.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeNumbersOnly.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeOneOf.d.ts +8 -0
- package/dist/utils/Validate/additional/mustBeShorterThan.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.d.ts +10 -0
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.d.ts +9 -0
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.d.ts +7 -0
- package/dist/utils/Validate/additional/mustNotContainSql.d.ts +2 -0
- package/dist/utils/Validate/additional/mustSelectOnlyOne.d.ts +8 -0
- package/dist/utils/Validate/additional/utils.d.ts +4 -0
- package/dist/utils/Validate/index.d.ts +42 -0
- package/dist/utils/Validate/validateCollection.d.ts +9 -0
- package/dist/utils/Validate/validateComponent.d.ts +16 -0
- package/dist/utils/Validate/validateContainer.d.ts +12 -0
- package/dist/utils/Validate/validateDate.d.ts +29 -0
- package/dist/utils/Validate/validateEmail.d.ts +13 -0
- package/dist/utils/Validate/validateMultifile.d.ts +3 -0
- package/dist/utils/Validate/validateOnPageLoad.d.ts +1 -0
- package/dist/utils/Validate/validatePage.d.ts +8 -0
- package/dist/utils/Validate/validateRegex.d.ts +13 -0
- package/dist/utils/Validate/validateRequired.d.ts +9 -0
- package/dist/utils/Validate/validateTextArea.d.ts +13 -0
- package/dist/utils/Validate/validateTime.d.ts +20 -0
- package/dist/utils/canOverrideFieldRequired.d.ts +9 -0
- package/dist/utils/index.d.ts +140 -0
- package/package.json +81 -170
- package/LICENCE.md +0 -21
- package/dist/components/CheckYourAnswers/Answer.js +0 -59
- package/dist/components/CheckYourAnswers/Answer.test.js +0 -142
- package/dist/components/CheckYourAnswers/CheckYourAnswers.js +0 -252
- package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -43
- package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +0 -409
- package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +0 -603
- package/dist/components/CheckYourAnswers/index.js +0 -10
- package/dist/components/CollectionPage/CollectionPage.js +0 -178
- package/dist/components/CollectionPage/CollectionPage.test.js +0 -507
- package/dist/components/CollectionPage/index.js +0 -10
- package/dist/components/CollectionSummary/BannerStrip.js +0 -65
- package/dist/components/CollectionSummary/BannerStrip.scss +0 -60
- package/dist/components/CollectionSummary/BannerStrip.test.js +0 -167
- package/dist/components/CollectionSummary/CollectionSummary.js +0 -362
- package/dist/components/CollectionSummary/CollectionSummary.scss +0 -26
- package/dist/components/CollectionSummary/CollectionSummary.test.js +0 -368
- package/dist/components/CollectionSummary/Confirmation.js +0 -65
- package/dist/components/CollectionSummary/Confirmation.scss +0 -26
- package/dist/components/CollectionSummary/Confirmation.test.js +0 -109
- package/dist/components/CollectionSummary/RenderListView.js +0 -162
- package/dist/components/CollectionSummary/RenderListView.scss +0 -295
- package/dist/components/CollectionSummary/RenderListView.test.js +0 -303
- package/dist/components/CollectionSummary/SummaryCard.js +0 -277
- package/dist/components/CollectionSummary/SummaryCard.scss +0 -114
- package/dist/components/CollectionSummary/SummaryCard.test.js +0 -1442
- package/dist/components/CollectionSummary/SummaryCardButtons.js +0 -76
- package/dist/components/CollectionSummary/SummaryCardButtons.test.js +0 -87
- package/dist/components/CollectionSummary/SummaryCardDetails.js +0 -206
- package/dist/components/CollectionSummary/SummaryCardDetails.scss +0 -216
- package/dist/components/CollectionSummary/SummaryCardDetails.test.js +0 -654
- package/dist/components/CollectionSummary/SummaryCardValidationContext.js +0 -79
- package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +0 -104
- package/dist/components/CollectionSummary/index.js +0 -10
- package/dist/components/FormComponent/Collection.js +0 -234
- package/dist/components/FormComponent/Collection.scss +0 -24
- package/dist/components/FormComponent/Collection.test.js +0 -934
- package/dist/components/FormComponent/Container.js +0 -130
- package/dist/components/FormComponent/Container.scss +0 -15
- package/dist/components/FormComponent/Container.test.js +0 -456
- package/dist/components/FormComponent/FormComponent.js +0 -238
- package/dist/components/FormComponent/FormComponent.stories.mdx +0 -186
- package/dist/components/FormComponent/FormComponent.test.js +0 -436
- package/dist/components/FormComponent/helpers/addLabel.js +0 -25
- package/dist/components/FormComponent/helpers/getComponentDisabled.js +0 -15
- package/dist/components/FormComponent/helpers/getComponentDisabled.test.js +0 -27
- package/dist/components/FormComponent/helpers/getComponentError.js +0 -23
- package/dist/components/FormComponent/helpers/getComponentError.test.js +0 -51
- package/dist/components/FormComponent/helpers/getComponentFieldSet.js +0 -11
- package/dist/components/FormComponent/helpers/getComponentFieldSet.test.js +0 -30
- package/dist/components/FormComponent/helpers/index.js +0 -35
- package/dist/components/FormComponent/index.js +0 -10
- package/dist/components/FormPage/FormPage.js +0 -212
- package/dist/components/FormPage/FormPage.scss +0 -7
- package/dist/components/FormPage/FormPage.stories.mdx +0 -157
- package/dist/components/FormPage/FormPage.test.js +0 -454
- package/dist/components/FormPage/index.js +0 -10
- package/dist/components/FormRenderer/FormRenderer.js +0 -426
- package/dist/components/FormRenderer/FormRenderer.scss +0 -5
- package/dist/components/FormRenderer/FormRenderer.stories.mdx +0 -178
- package/dist/components/FormRenderer/FormRenderer.test.js +0 -799
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/cop-reassign-task-to-rcc.json +0 -446
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-containerised.json +0 -120
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested-block.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-refdata.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-target-component-nested.json +0 -99
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-show-whens-page-hidden.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-airpax.json +0 -26408
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-mandec.json +0 -9405
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component-dependent-on-external-data.json +0 -158
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component.json +0 -86
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-collection.json +0 -173
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-hidden-collection.json +0 -202
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-show-when-in-component-and-page.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions-visible-elsewhere.json +0 -118
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions.json +0 -112
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component.json +0 -58
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-containerised-component.json +0 -97
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-collection-component.json +0 -83
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-component.json +0 -55
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-entire-collection.json +0 -114
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component-leaf-hidden.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-options.json +0 -99
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-collection.json +0 -128
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-component-used-elsewhere.json +0 -109
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-same-component-reused.json +0 -62
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page.json +0 -96
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option-visible-elsewhere.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option.json +0 -112
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-component.json +0 -26003
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-radio-component.json +0 -201
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-same-component-reused-one-shown.json +0 -75
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-variance-breach.json +0 -4272
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-carrier.json +0 -407
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-change-what-happened-before.json +0 -300
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-remove-photos-before.json +0 -384
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-business-interests-before.json +0 -140
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-criminality-before.json +0 -186
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-unspent-convictions-before.json +0 -143
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-variance-breach-with-upload-files.json +0 -1264
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-containerised.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested-block.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-refdata.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-target-component-nested.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-show-whens-page-hidden.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component-dependent-on-external-data.json +0 -26
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-collection.json +0 -25
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-hidden-collection.json +0 -26
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-show-when-in-component-and-page.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions-visible-elsewhere.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-containerised-component.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-collection-component.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-component.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-entire-collection.json +0 -20
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component-leaf-hidden.json +0 -14
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component.json +0 -14
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-options.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-collection.json +0 -18
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-component-used-elsewhere.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-same-component-reused.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option-visible-elsewhere.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-component.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-radio-component.json +0 -45
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-same-component-reused-one-shown.json +0 -8
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/reassign-to-rcc.json +0 -72
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-change-what-happened-after.json +0 -280
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-remove-photos-after.json +0 -355
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-base-file.json +0 -80
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-business-interests-after.json +0 -122
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-criminality-after.json +0 -86
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-unspent-convictions-after.json +0 -127
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-containerised-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-block-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-refdata-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-target-component-nested-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-show-whens-page-hidden-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-dependent-on-external-data-removed.json +0 -23
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-collection-removed.json +0 -21
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-hidden-collection-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-show-when-in-component-and-page-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-visible-elsewhere-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-containerised-component-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-collection-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-entire-collection-removed.json +0 -3
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-leaf-hidden-removed.json +0 -13
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-options-removed.json +0 -8
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-collection-removed.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-component-used-elsewhere-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-same-component-reused-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-visible-elsewhere-removed.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-component.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-radio-component-removed.json +0 -45
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-same-component-reused-one-shown-removed.json +0 -7
- package/dist/components/FormRenderer/handlers/cyaAction.js +0 -23
- package/dist/components/FormRenderer/handlers/getPageId.js +0 -15
- package/dist/components/FormRenderer/handlers/getPageId.test.js +0 -35
- package/dist/components/FormRenderer/handlers/handlers.test.js +0 -81
- package/dist/components/FormRenderer/handlers/index.js +0 -17
- package/dist/components/FormRenderer/handlers/navigate.js +0 -25
- package/dist/components/FormRenderer/handlers/submissionError.js +0 -18
- package/dist/components/FormRenderer/helpers/canActionProceed.js +0 -27
- package/dist/components/FormRenderer/helpers/canActionProceed.test.js +0 -84
- package/dist/components/FormRenderer/helpers/canCYASubmit.js +0 -17
- package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +0 -75
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.js +0 -63
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.test.js +0 -191
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +0 -338
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +0 -434
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.js +0 -399
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.test.js +0 -559
- package/dist/components/FormRenderer/helpers/getCYA.js +0 -42
- package/dist/components/FormRenderer/helpers/getCYA.test.js +0 -46
- package/dist/components/FormRenderer/helpers/getFormState.js +0 -25
- package/dist/components/FormRenderer/helpers/getFormState.test.js +0 -60
- package/dist/components/FormRenderer/helpers/getNextPageId.js +0 -76
- package/dist/components/FormRenderer/helpers/getNextPageId.test.js +0 -292
- package/dist/components/FormRenderer/helpers/getPage.js +0 -27
- package/dist/components/FormRenderer/helpers/getPage.test.js +0 -45
- package/dist/components/FormRenderer/helpers/getRelevantPages.js +0 -27
- package/dist/components/FormRenderer/helpers/getRelevantPages.test.js +0 -70
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +0 -65
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +0 -309
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +0 -201
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +0 -473
- package/dist/components/FormRenderer/helpers/index.js +0 -33
- package/dist/components/FormRenderer/index.js +0 -10
- package/dist/components/FormRenderer/onCYAAction.js +0 -150
- package/dist/components/FormRenderer/onCYAAction.test.js +0 -741
- package/dist/components/FormRenderer/onPageAction.js +0 -227
- package/dist/components/FormRenderer/onPageAction.test.js +0 -960
- package/dist/components/FormRenderer/onTaskAction.js +0 -47
- package/dist/components/FormRenderer/onTaskAction.test.js +0 -247
- package/dist/components/PageActions/ActionButton.js +0 -48
- package/dist/components/PageActions/ActionButton.test.js +0 -73
- package/dist/components/PageActions/PageActions.js +0 -37
- package/dist/components/PageActions/PageActions.stories.mdx +0 -74
- package/dist/components/PageActions/PageActions.test.js +0 -106
- package/dist/components/PageActions/index.js +0 -10
- package/dist/components/SummaryList/GroupAction.js +0 -50
- package/dist/components/SummaryList/GroupAction.test.js +0 -86
- package/dist/components/SummaryList/RowAction.js +0 -48
- package/dist/components/SummaryList/RowAction.test.js +0 -86
- package/dist/components/SummaryList/SummaryList.js +0 -128
- package/dist/components/SummaryList/SummaryList.scss +0 -79
- package/dist/components/SummaryList/SummaryList.stories.mdx +0 -84
- package/dist/components/SummaryList/SummaryList.test.js +0 -504
- package/dist/components/SummaryList/SummaryListHeadingRow.js +0 -39
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.js +0 -65
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.scss +0 -38
- package/dist/components/SummaryList/SummaryListRow.js +0 -58
- package/dist/components/SummaryList/SummaryListTitleRow.js +0 -32
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.js +0 -29
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.test.js +0 -72
- package/dist/components/SummaryList/helpers/getRowActionAttributes.js +0 -29
- package/dist/components/SummaryList/helpers/getRowActionAttributes.test.js +0 -72
- package/dist/components/SummaryList/helpers/index.js +0 -14
- package/dist/components/SummaryList/index.js +0 -10
- package/dist/components/TaskList/Task.js +0 -62
- package/dist/components/TaskList/Task.test.js +0 -176
- package/dist/components/TaskList/TaskList.js +0 -175
- package/dist/components/TaskList/TaskList.scss +0 -123
- package/dist/components/TaskList/TaskList.stories.mdx +0 -164
- package/dist/components/TaskList/TaskList.test.js +0 -535
- package/dist/components/TaskList/TaskState.js +0 -37
- package/dist/components/TaskList/TaskState.test.js +0 -95
- package/dist/components/TaskList/index.js +0 -10
- package/dist/components/index.js +0 -56
- package/dist/context/HooksContext/HooksContext.js +0 -122
- package/dist/context/HooksContext/HooksContext.test.js +0 -45
- package/dist/context/HooksContext/index.js +0 -16
- package/dist/context/ValidationContext/ValidationContext.js +0 -98
- package/dist/context/ValidationContext/ValidationContext.test.js +0 -107
- package/dist/context/ValidationContext/index.js +0 -16
- package/dist/context/index.js +0 -21
- package/dist/hooks/index.js +0 -55
- package/dist/hooks/useAxios.js +0 -36
- package/dist/hooks/useGetRequest.js +0 -89
- package/dist/hooks/useHooks.js +0 -15
- package/dist/hooks/useRefData.js +0 -62
- package/dist/hooks/useValidation.js +0 -15
- package/dist/json/actions.json +0 -17
- package/dist/json/actionsNoSave.json +0 -17
- package/dist/json/addressDetails.json +0 -149
- package/dist/json/areYouACivilServant.json +0 -7
- package/dist/json/firstForm.json +0 -94
- package/dist/json/grade.json +0 -108
- package/dist/json/group.data.json +0 -21
- package/dist/json/group.json +0 -402
- package/dist/json/groupOfRow.json +0 -137
- package/dist/json/groupOfRowData.json +0 -15
- package/dist/json/port.json +0 -346
- package/dist/json/saveAndContinue.json +0 -98
- package/dist/json/sublocation.json +0 -859
- package/dist/json/taskList.json +0 -265
- package/dist/json/team.json +0 -17351
- package/dist/json/terminal.json +0 -81
- package/dist/json/userProfile.data.json +0 -21
- package/dist/json/userProfile.json +0 -276
- package/dist/models/CollectionLabels.js +0 -15
- package/dist/models/ComponentTypes.js +0 -58
- package/dist/models/EventTypes.js +0 -16
- package/dist/models/FormPages.js +0 -16
- package/dist/models/FormTypes.js +0 -24
- package/dist/models/HubFormats.js +0 -14
- package/dist/models/PageAction.js +0 -65
- package/dist/models/TaskStates.js +0 -46
- package/dist/models/index.js +0 -77
- package/dist/setupTests.js +0 -54
- package/dist/utils/CheckYourAnswers/getCYAAction.js +0 -44
- package/dist/utils/CheckYourAnswers/getCYAAction.test.js +0 -120
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.js +0 -57
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.test.js +0 -162
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.js +0 -66
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.test.js +0 -198
- package/dist/utils/CheckYourAnswers/getCYARow.js +0 -58
- package/dist/utils/CheckYourAnswers/getCYARow.test.js +0 -373
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +0 -69
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +0 -70
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +0 -71
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +0 -285
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +0 -237
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +0 -844
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +0 -45
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +0 -535
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +0 -72
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +0 -343
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.js +0 -42
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.test.js +0 -56
- package/dist/utils/CheckYourAnswers/index.js +0 -15
- package/dist/utils/CheckYourAnswers/showComponentCYA.js +0 -53
- package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +0 -149
- package/dist/utils/CollectionPage/addCollectionPageEntry.js +0 -23
- package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +0 -17
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +0 -26
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +0 -70
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +0 -51
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +0 -125
- package/dist/utils/CollectionPage/getCollectionPageActiveId.js +0 -24
- package/dist/utils/CollectionPage/getCollectionPageActiveId.test.js +0 -26
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +0 -44
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +0 -88
- package/dist/utils/CollectionPage/getCollectionPageData.js +0 -53
- package/dist/utils/CollectionPage/getCollectionPageData.test.js +0 -103
- package/dist/utils/CollectionPage/getErrorsForCollection.js +0 -55
- package/dist/utils/CollectionPage/getErrorsForCollection.test.js +0 -154
- package/dist/utils/CollectionPage/getQuickEditPage.js +0 -122
- package/dist/utils/CollectionPage/getQuickEditPage.test.js +0 -143
- package/dist/utils/CollectionPage/index.js +0 -33
- package/dist/utils/CollectionPage/mergeCollectionPages.js +0 -128
- package/dist/utils/CollectionPage/mergeCollectionPages.test.js +0 -198
- package/dist/utils/CollectionPage/removeCollectionPageEntry.js +0 -36
- package/dist/utils/CollectionPage/removeCollectionPageEntry.test.js +0 -62
- package/dist/utils/CollectionPage/setCollectionPageData.js +0 -60
- package/dist/utils/CollectionPage/setCollectionPageData.test.js +0 -182
- package/dist/utils/Component/addShowWhen.js +0 -43
- package/dist/utils/Component/addShowWhen.test.js +0 -217
- package/dist/utils/Component/applyToComponentTree.js +0 -68
- package/dist/utils/Component/applyToComponentTree.test.js +0 -125
- package/dist/utils/Component/cleanAttributes.js +0 -42
- package/dist/utils/Component/cleanAttributes.test.js +0 -67
- package/dist/utils/Component/elevateNestedComponents.js +0 -58
- package/dist/utils/Component/elevateNestedComponents.test.js +0 -305
- package/dist/utils/Component/getComponent.js +0 -305
- package/dist/utils/Component/getComponentTests/getComponent.autocomplete.test.js +0 -73
- package/dist/utils/Component/getComponentTests/getComponent.calculation.test.js +0 -251
- package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +0 -156
- package/dist/utils/Component/getComponentTests/getComponent.date.test.js +0 -104
- package/dist/utils/Component/getComponentTests/getComponent.details.test.js +0 -56
- package/dist/utils/Component/getComponentTests/getComponent.email.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.file.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.heading.test.js +0 -31
- package/dist/utils/Component/getComponentTests/getComponent.html.test.js +0 -42
- package/dist/utils/Component/getComponentTests/getComponent.insetText.test.js +0 -29
- package/dist/utils/Component/getComponentTests/getComponent.list.test.js +0 -47
- package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +0 -66
- package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +0 -211
- package/dist/utils/Component/getComponentTests/getComponent.paragraph.test.js +0 -46
- package/dist/utils/Component/getComponentTests/getComponent.phoneNumber.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.radios.test.js +0 -221
- package/dist/utils/Component/getComponentTests/getComponent.select.test.js +0 -62
- package/dist/utils/Component/getComponentTests/getComponent.text.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.textArea.test.js +0 -104
- package/dist/utils/Component/getComponentTests/getComponent.time.test.js +0 -80
- package/dist/utils/Component/getComponentTests/getComponent.unknown.test.js +0 -14
- package/dist/utils/Component/getComponentTests/getComponent.warningText.test.js +0 -29
- package/dist/utils/Component/getDefaultValue.js +0 -22
- package/dist/utils/Component/getDefaultValue.test.js +0 -62
- package/dist/utils/Component/getDefaultValueFromConfig.js +0 -106
- package/dist/utils/Component/getDefaultValueFromConfig.test.js +0 -141
- package/dist/utils/Component/index.js +0 -29
- package/dist/utils/Component/isEditable.js +0 -13
- package/dist/utils/Component/isEditable.test.js +0 -42
- package/dist/utils/Component/optionIsSelected.js +0 -25
- package/dist/utils/Component/optionIsSelected.test.js +0 -69
- package/dist/utils/Component/setupContainerComponentsPath.js +0 -35
- package/dist/utils/Component/setupContainerComponentsPath.test.js +0 -79
- package/dist/utils/Component/showComponent.js +0 -25
- package/dist/utils/Component/showComponent.test.js +0 -157
- package/dist/utils/Component/wrapInFormGroup.js +0 -26
- package/dist/utils/Condition/index.js +0 -17
- package/dist/utils/Condition/meetsAllConditions.js +0 -44
- package/dist/utils/Condition/meetsAllConditions.test.js +0 -109
- package/dist/utils/Condition/meetsCondition.js +0 -165
- package/dist/utils/Condition/meetsCondition.test.js +0 -899
- package/dist/utils/Condition/meetsOneCondition.js +0 -32
- package/dist/utils/Condition/meetsOneCondition.test.js +0 -101
- package/dist/utils/Condition/setupConditions.js +0 -36
- package/dist/utils/Condition/setupConditions.test.js +0 -34
- package/dist/utils/Container/getEditableComponents.js +0 -29
- package/dist/utils/Container/getEditableComponents.test.js +0 -134
- package/dist/utils/Container/index.js +0 -17
- package/dist/utils/Container/setupNesting.js +0 -53
- package/dist/utils/Container/setupNesting.test.js +0 -143
- package/dist/utils/Container/showContainer.js +0 -52
- package/dist/utils/Container/showContainer.test.js +0 -179
- package/dist/utils/Data/applyFormula.js +0 -90
- package/dist/utils/Data/applyFormula.test.js +0 -264
- package/dist/utils/Data/deleteValues.js +0 -19
- package/dist/utils/Data/deleteValues.test.js +0 -58
- package/dist/utils/Data/getAutocompleteSource.js +0 -87
- package/dist/utils/Data/getAutocompleteSource.test.js +0 -335
- package/dist/utils/Data/getDataPath.js +0 -66
- package/dist/utils/Data/getDataPath.test.js +0 -49
- package/dist/utils/Data/getOptions.js +0 -86
- package/dist/utils/Data/getOptions.test.js +0 -279
- package/dist/utils/Data/getSourceData.js +0 -44
- package/dist/utils/Data/getSourceData.test.js +0 -158
- package/dist/utils/Data/index.js +0 -35
- package/dist/utils/Data/nestInRefdataOptions.js +0 -47
- package/dist/utils/Data/nestInRefdataOptions.test.js +0 -237
- package/dist/utils/Data/refDataToOptions.js +0 -44
- package/dist/utils/Data/refDataToOptions.test.js +0 -197
- package/dist/utils/Data/setDataItem.js +0 -26
- package/dist/utils/Data/setDataItem.test.js +0 -136
- package/dist/utils/Data/setupFormData.js +0 -49
- package/dist/utils/Data/setupFormData.test.js +0 -215
- package/dist/utils/Data/setupRefDataUrlForComponent.js +0 -44
- package/dist/utils/Data/setupRefDataUrlForComponent.test.js +0 -150
- package/dist/utils/FormPage/applyConditionalProperties.js +0 -34
- package/dist/utils/FormPage/applyConditionalProperties.test.js +0 -61
- package/dist/utils/FormPage/getConditionalText.js +0 -55
- package/dist/utils/FormPage/getConditionalText.test.js +0 -163
- package/dist/utils/FormPage/getFormPage.js +0 -54
- package/dist/utils/FormPage/getFormPage.test.js +0 -206
- package/dist/utils/FormPage/getFormPages.js +0 -30
- package/dist/utils/FormPage/getFormPages.test.js +0 -97
- package/dist/utils/FormPage/getPageActions.js +0 -58
- package/dist/utils/FormPage/getPageActions.test.js +0 -115
- package/dist/utils/FormPage/getParagraphFromText.js +0 -21
- package/dist/utils/FormPage/getParagraphFromText.test.js +0 -28
- package/dist/utils/FormPage/index.js +0 -24
- package/dist/utils/FormPage/showFormPage.js +0 -52
- package/dist/utils/FormPage/showFormPage.test.js +0 -181
- package/dist/utils/FormPage/showFormPageCYA.js +0 -23
- package/dist/utils/FormPage/showFormPageCYA.test.js +0 -29
- package/dist/utils/FormPage/useComponent.js +0 -83
- package/dist/utils/FormPage/useComponent.test.js +0 -216
- package/dist/utils/Format/formatData.js +0 -27
- package/dist/utils/Format/formatData.test.js +0 -46
- package/dist/utils/Format/formatDataForComponent.js +0 -35
- package/dist/utils/Format/formatDataForComponent.test.js +0 -114
- package/dist/utils/Format/formatDataForForm.js +0 -27
- package/dist/utils/Format/formatDataForForm.test.js +0 -79
- package/dist/utils/Format/formatDataForPage.js +0 -31
- package/dist/utils/Format/formatDataForPage.test.js +0 -94
- package/dist/utils/Format/index.js +0 -21
- package/dist/utils/Hub/getFormHub.js +0 -40
- package/dist/utils/Hub/getFormHub.test.js +0 -105
- package/dist/utils/Hub/index.js +0 -15
- package/dist/utils/Meta/constants.js +0 -9
- package/dist/utils/Meta/documents/getDocuments.js +0 -15
- package/dist/utils/Meta/documents/getDocuments.test.js +0 -46
- package/dist/utils/Meta/documents/index.js +0 -19
- package/dist/utils/Meta/documents/setDocumentsForField.js +0 -30
- package/dist/utils/Meta/documents/setDocumentsForField.test.js +0 -97
- package/dist/utils/Meta/index.js +0 -17
- package/dist/utils/Operate/checkValueIsTruthy.js +0 -29
- package/dist/utils/Operate/checkValueIsTruthy.test.js +0 -43
- package/dist/utils/Operate/deleteValueInFormData.js +0 -27
- package/dist/utils/Operate/deleteValueInFormData.test.js +0 -61
- package/dist/utils/Operate/doesContainValue.js +0 -35
- package/dist/utils/Operate/doesContainValue.test.js +0 -76
- package/dist/utils/Operate/getFirstOf.js +0 -31
- package/dist/utils/Operate/getFirstOf.test.js +0 -87
- package/dist/utils/Operate/getIndexOfMatchingValueIn.js +0 -68
- package/dist/utils/Operate/getIndexOfMatchingValueIn.test.js +0 -158
- package/dist/utils/Operate/getLength.js +0 -51
- package/dist/utils/Operate/getLength.test.js +0 -90
- package/dist/utils/Operate/index.js +0 -13
- package/dist/utils/Operate/persistValueInFormData.js +0 -40
- package/dist/utils/Operate/persistValueInFormData.test.js +0 -118
- package/dist/utils/Operate/runPageOperations.js +0 -75
- package/dist/utils/Operate/runPageOperations.test.js +0 -105
- package/dist/utils/Operate/setValueInFormData.js +0 -22
- package/dist/utils/Operate/setValueInFormData.test.js +0 -45
- package/dist/utils/Operate/shouldRun.js +0 -57
- package/dist/utils/Operate/shouldRun.test.js +0 -65
- package/dist/utils/Validate/additional/conditionallyPermittedChange.js +0 -26
- package/dist/utils/Validate/additional/conditionallyPermittedChange.test.js +0 -34
- package/dist/utils/Validate/additional/conditionallyRequired.js +0 -24
- package/dist/utils/Validate/additional/conditionallyRequired.test.js +0 -74
- package/dist/utils/Validate/additional/index.js +0 -74
- package/dist/utils/Validate/additional/index.test.js +0 -130
- package/dist/utils/Validate/additional/mustBeAfter.js +0 -34
- package/dist/utils/Validate/additional/mustBeAfter.test.js +0 -109
- package/dist/utils/Validate/additional/mustBeBefore.js +0 -34
- package/dist/utils/Validate/additional/mustBeBefore.test.js +0 -77
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.js +0 -57
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.test.js +0 -128
- package/dist/utils/Validate/additional/mustBeGreaterThan.js +0 -22
- package/dist/utils/Validate/additional/mustBeGreaterThan.test.js +0 -57
- package/dist/utils/Validate/additional/mustBeInTheFuture.js +0 -33
- package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +0 -32
- package/dist/utils/Validate/additional/mustBeInThePast.js +0 -36
- package/dist/utils/Validate/additional/mustBeInThePast.test.js +0 -32
- package/dist/utils/Validate/additional/mustBeLessThan.js +0 -22
- package/dist/utils/Validate/additional/mustBeLessThan.test.js +0 -53
- package/dist/utils/Validate/additional/mustBeLongerThan.js +0 -23
- package/dist/utils/Validate/additional/mustBeLongerThan.test.js +0 -49
- package/dist/utils/Validate/additional/mustBeNumbersOnly.js +0 -24
- package/dist/utils/Validate/additional/mustBeNumbersOnly.test.js +0 -45
- package/dist/utils/Validate/additional/mustBeOneOf.js +0 -22
- package/dist/utils/Validate/additional/mustBeOneOf.test.js +0 -37
- package/dist/utils/Validate/additional/mustBeShorterThan.js +0 -23
- package/dist/utils/Validate/additional/mustBeShorterThan.test.js +0 -49
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.js +0 -40
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.test.js +0 -163
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.js +0 -26
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.test.js +0 -37
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.js +0 -19
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.test.js +0 -37
- package/dist/utils/Validate/additional/mustNotContainSql.js +0 -19
- package/dist/utils/Validate/additional/mustNotContainSql.test.js +0 -33
- package/dist/utils/Validate/additional/mustSelectOnlyOne.js +0 -29
- package/dist/utils/Validate/additional/mustSelectOnlyOne.test.js +0 -55
- package/dist/utils/Validate/additional/utils.js +0 -35
- package/dist/utils/Validate/index.js +0 -33
- package/dist/utils/Validate/validateCollection.js +0 -50
- package/dist/utils/Validate/validateCollection.test.js +0 -134
- package/dist/utils/Validate/validateComponent.js +0 -126
- package/dist/utils/Validate/validateComponent.test.js +0 -435
- package/dist/utils/Validate/validateContainer.js +0 -52
- package/dist/utils/Validate/validateContainer.test.js +0 -115
- package/dist/utils/Validate/validateDate.js +0 -112
- package/dist/utils/Validate/validateDate.test.js +0 -133
- package/dist/utils/Validate/validateEmail.js +0 -45
- package/dist/utils/Validate/validateEmail.test.js +0 -78
- package/dist/utils/Validate/validateMultifile.js +0 -29
- package/dist/utils/Validate/validateMultifile.test.js +0 -46
- package/dist/utils/Validate/validateOnPageLoad.js +0 -24
- package/dist/utils/Validate/validateOnPageLoad.test.js +0 -89
- package/dist/utils/Validate/validatePage.js +0 -56
- package/dist/utils/Validate/validatePage.test.js +0 -795
- package/dist/utils/Validate/validateRegex.js +0 -41
- package/dist/utils/Validate/validateRegex.test.js +0 -43
- package/dist/utils/Validate/validateRequired.js +0 -37
- package/dist/utils/Validate/validateRequired.test.js +0 -64
- package/dist/utils/Validate/validateTextArea.js +0 -36
- package/dist/utils/Validate/validateTextArea.test.js +0 -71
- package/dist/utils/Validate/validateTime.js +0 -76
- package/dist/utils/Validate/validateTime.test.js +0 -116
- package/dist/utils/canOverrideFieldRequired.js +0 -23
- package/dist/utils/index.js +0 -42
|
@@ -1,960 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _models = require("../../models");
|
|
4
|
-
var _utils = _interopRequireDefault(require("../../utils"));
|
|
5
|
-
var _handlers = _interopRequireDefault(require("./handlers"));
|
|
6
|
-
var _helpers = _interopRequireDefault(require("./helpers"));
|
|
7
|
-
var _onPageAction = _interopRequireDefault(require("./onPageAction"));
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
10
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
12
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
13
|
-
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
14
|
-
jest.mock('./handlers', () => ({
|
|
15
|
-
navigateCalls: 0,
|
|
16
|
-
navigate() {
|
|
17
|
-
this.navigateCalls += 1;
|
|
18
|
-
},
|
|
19
|
-
submissionErrorCalls: 0,
|
|
20
|
-
submissionErrorArgs: [],
|
|
21
|
-
submissionError(errors, addErrors) {
|
|
22
|
-
this.submissionErrorCalls += 1;
|
|
23
|
-
this.submissionErrorArgs.push(errors);
|
|
24
|
-
if (typeof addErrors === 'function') {
|
|
25
|
-
addErrors(errors);
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
reset() {
|
|
29
|
-
this.navigateCalls = 0;
|
|
30
|
-
this.submissionErrorCalls = 0;
|
|
31
|
-
this.submissionErrorArgs = [];
|
|
32
|
-
}
|
|
33
|
-
}));
|
|
34
|
-
jest.mock('./helpers', () => ({
|
|
35
|
-
canActionProceedCalls: 0,
|
|
36
|
-
canActionProceedResult: true,
|
|
37
|
-
canActionProceed(action, page, validator) {
|
|
38
|
-
this.canActionProceedCalls += 1;
|
|
39
|
-
if (typeof validator === 'function') {
|
|
40
|
-
validator();
|
|
41
|
-
}
|
|
42
|
-
return this.canActionProceedResult;
|
|
43
|
-
},
|
|
44
|
-
cleanHiddenNestedDataCalls: 0,
|
|
45
|
-
cleanHiddenNestedData(patch) {
|
|
46
|
-
this.cleanHiddenNestedDataCalls += 1;
|
|
47
|
-
return patch;
|
|
48
|
-
},
|
|
49
|
-
clearOutUncompletedRoutesCalls: 0,
|
|
50
|
-
clearOutUncompletedRoutes(cleanseHiddenData, formPagesAndComponents, formData) {
|
|
51
|
-
this.clearOutUncompletedRoutesCalls += 1;
|
|
52
|
-
return formData;
|
|
53
|
-
},
|
|
54
|
-
getNextPageIdCalls: 0,
|
|
55
|
-
getNextPageId() {
|
|
56
|
-
this.getNextPageIdCalls += 1;
|
|
57
|
-
return 'page2';
|
|
58
|
-
},
|
|
59
|
-
getSubmissionStatusCalls: 0,
|
|
60
|
-
getSubmissionStatus() {
|
|
61
|
-
this.getSubmissionStatusCalls += 1;
|
|
62
|
-
return 'Good to go!';
|
|
63
|
-
},
|
|
64
|
-
reset() {
|
|
65
|
-
this.canActionProceedCalls = 0;
|
|
66
|
-
this.canActionProceedResult = true;
|
|
67
|
-
this.canCYASubmitResult = true;
|
|
68
|
-
this.cleanHiddenNestedDataCalls = 0;
|
|
69
|
-
this.getFormStateCalls = 0;
|
|
70
|
-
this.getSubmissionStatusCalls = 0;
|
|
71
|
-
}
|
|
72
|
-
}));
|
|
73
|
-
jest.mock('../../utils', () => {
|
|
74
|
-
const originalModule = jest.requireActual('../../utils');
|
|
75
|
-
return _objectSpread(_objectSpread({}, originalModule.default), {}, {
|
|
76
|
-
Format: {
|
|
77
|
-
formCalls: 0,
|
|
78
|
-
form(form, data) {
|
|
79
|
-
this.formCalls += 1;
|
|
80
|
-
return data;
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
CollectionPage: _objectSpread(_objectSpread({}, originalModule.default.CollectionPage), {}, {
|
|
84
|
-
duplicateActiveEntryCalls: 0,
|
|
85
|
-
duplicateActiveEntryResult: true,
|
|
86
|
-
duplicateActiveEntry() {
|
|
87
|
-
this.duplicateActiveEntryCalls += 1;
|
|
88
|
-
return this.duplicateActiveEntryResult;
|
|
89
|
-
},
|
|
90
|
-
addEntryCalls: 0,
|
|
91
|
-
addEntryResult: true,
|
|
92
|
-
addEntry(collectionName, formData) {
|
|
93
|
-
originalModule.default.CollectionPage.addEntry(collectionName, formData);
|
|
94
|
-
this.addEntryCalls += 1;
|
|
95
|
-
return this.addEntryResult;
|
|
96
|
-
}
|
|
97
|
-
}),
|
|
98
|
-
reset() {
|
|
99
|
-
this.Format.formCalls = 0;
|
|
100
|
-
this.CollectionPage.duplicateActiveEntryCalls = 0;
|
|
101
|
-
this.duplicateActiveEntryResult = true;
|
|
102
|
-
this.CollectionPage.addEntryCalls = 0;
|
|
103
|
-
this.addEntryResult = true;
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
describe('components.FormRenderer.onPageAction', () => {
|
|
108
|
-
const MOCK_HOOKS = {
|
|
109
|
-
onSubmitCalls: 0,
|
|
110
|
-
onSubmitArgs: [],
|
|
111
|
-
onSubmit(type, payload, onSuccess, onError, changedFieldName, changedFieldValue) {
|
|
112
|
-
this.onSubmitCalls += 1;
|
|
113
|
-
this.onSubmitArgs.push({
|
|
114
|
-
type,
|
|
115
|
-
payload,
|
|
116
|
-
changedFieldName,
|
|
117
|
-
changedFieldValue
|
|
118
|
-
});
|
|
119
|
-
if (typeof onSuccess === 'function') {
|
|
120
|
-
onSuccess();
|
|
121
|
-
}
|
|
122
|
-
// onError would not normally be called alongside
|
|
123
|
-
// onSuccess, we're just doing it here to make sure
|
|
124
|
-
// the expected function chain is called.
|
|
125
|
-
if (typeof onError === 'function') {
|
|
126
|
-
onError(['an example error']);
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
onFormCompleteCalls: 0,
|
|
130
|
-
onFormComplete() {
|
|
131
|
-
this.onFormCompleteCalls += 1;
|
|
132
|
-
},
|
|
133
|
-
onCancelArgs: [],
|
|
134
|
-
onCancel(data) {
|
|
135
|
-
this.onCancelArgs.push(data);
|
|
136
|
-
},
|
|
137
|
-
reset() {
|
|
138
|
-
this.onSubmitCalls = 0;
|
|
139
|
-
this.onSubmitArgs = [];
|
|
140
|
-
this.onFormCompleteCalls = 0;
|
|
141
|
-
this.onCancelArgs = [];
|
|
142
|
-
this.onActionCalls = 0;
|
|
143
|
-
},
|
|
144
|
-
onActionCalls: 0,
|
|
145
|
-
onAction(formData, patch) {
|
|
146
|
-
this.onActionCalls += 1;
|
|
147
|
-
return {
|
|
148
|
-
formData,
|
|
149
|
-
patch
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
const MOCK_VALIDATE = {
|
|
154
|
-
pageCalls: 0,
|
|
155
|
-
page() {
|
|
156
|
-
MOCK_VALIDATE.pageCalls += 1;
|
|
157
|
-
},
|
|
158
|
-
reset() {
|
|
159
|
-
this.pageCalls = 0;
|
|
160
|
-
}
|
|
161
|
-
};
|
|
162
|
-
let setPagePointCalls = 0;
|
|
163
|
-
let setPagePointArgs = [];
|
|
164
|
-
const mockSetPagePoint = point => {
|
|
165
|
-
setPagePointCalls += 1;
|
|
166
|
-
setPagePointArgs.push(point);
|
|
167
|
-
};
|
|
168
|
-
let setDataCalls = 0;
|
|
169
|
-
let setDataArgs = [];
|
|
170
|
-
const mockSetData = data => {
|
|
171
|
-
setDataCalls += 1;
|
|
172
|
-
setDataArgs.push(data);
|
|
173
|
-
};
|
|
174
|
-
let onPageChangeCalls = 0;
|
|
175
|
-
let onPageChangeArgs = [];
|
|
176
|
-
const mockOnPageChange = pageId => {
|
|
177
|
-
onPageChangeCalls += 1;
|
|
178
|
-
onPageChangeArgs.push(pageId);
|
|
179
|
-
};
|
|
180
|
-
let addErrorsArgs = [];
|
|
181
|
-
const mockAddErrors = errors => {
|
|
182
|
-
addErrorsArgs.push(errors);
|
|
183
|
-
};
|
|
184
|
-
let setSubmittedArgs = [];
|
|
185
|
-
const mockSetSubmitted = newSubmitted => {
|
|
186
|
-
setSubmittedArgs.push(newSubmitted);
|
|
187
|
-
};
|
|
188
|
-
let mockSubmitting = false;
|
|
189
|
-
const mockSetSubmitting = submitting => {
|
|
190
|
-
mockSubmitting = submitting;
|
|
191
|
-
};
|
|
192
|
-
const COMPONENTS = [{
|
|
193
|
-
id: 'alpha',
|
|
194
|
-
fieldId: 'alpha'
|
|
195
|
-
}, {
|
|
196
|
-
id: 'bravo',
|
|
197
|
-
fieldId: 'bravo'
|
|
198
|
-
}, {
|
|
199
|
-
id: 'charlie',
|
|
200
|
-
fieldId: 'charlie'
|
|
201
|
-
}, {
|
|
202
|
-
id: 'delta',
|
|
203
|
-
fieldId: 'delta'
|
|
204
|
-
}];
|
|
205
|
-
const PAGES = [{
|
|
206
|
-
id: 'page1',
|
|
207
|
-
components: [_objectSpread({}, COMPONENTS[0]), _objectSpread({}, COMPONENTS[1])]
|
|
208
|
-
}, {
|
|
209
|
-
id: 'page2',
|
|
210
|
-
components: [_objectSpread({}, COMPONENTS[2]), _objectSpread({}, COMPONENTS[3])]
|
|
211
|
-
}];
|
|
212
|
-
const CURRENT_TASK = {
|
|
213
|
-
name: 'testTask',
|
|
214
|
-
fullPages: PAGES
|
|
215
|
-
};
|
|
216
|
-
const ARGS = {
|
|
217
|
-
action: {
|
|
218
|
-
type: _models.PageAction.TYPES.NAVIGATE
|
|
219
|
-
},
|
|
220
|
-
patch: null,
|
|
221
|
-
patchLabel: {},
|
|
222
|
-
hooks: MOCK_HOOKS,
|
|
223
|
-
data: {},
|
|
224
|
-
formState: {
|
|
225
|
-
page: {
|
|
226
|
-
formData: {}
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
validate: MOCK_VALIDATE,
|
|
230
|
-
onPageChange: mockOnPageChange,
|
|
231
|
-
type: _models.FormTypes.FORM_WITH_TASK,
|
|
232
|
-
cleanseHiddenData: true,
|
|
233
|
-
pages: PAGES,
|
|
234
|
-
components: COMPONENTS,
|
|
235
|
-
pageId: 'alpha',
|
|
236
|
-
setPagePoint: mockSetPagePoint,
|
|
237
|
-
currentTask: CURRENT_TASK,
|
|
238
|
-
setData: mockSetData,
|
|
239
|
-
hubDetails: {},
|
|
240
|
-
setSubmitted: mockSetSubmitted,
|
|
241
|
-
addErrors: mockAddErrors,
|
|
242
|
-
submitting: mockSubmitting,
|
|
243
|
-
setSubmitting: mockSetSubmitting
|
|
244
|
-
};
|
|
245
|
-
beforeEach(() => {
|
|
246
|
-
_handlers.default.reset();
|
|
247
|
-
_helpers.default.reset();
|
|
248
|
-
_utils.default.reset();
|
|
249
|
-
MOCK_HOOKS.reset();
|
|
250
|
-
MOCK_VALIDATE.reset();
|
|
251
|
-
setPagePointCalls = 0;
|
|
252
|
-
setPagePointArgs = [];
|
|
253
|
-
setDataCalls = 0;
|
|
254
|
-
setDataArgs = [];
|
|
255
|
-
onPageChangeCalls = 0;
|
|
256
|
-
onPageChangeArgs = [];
|
|
257
|
-
addErrorsArgs = [];
|
|
258
|
-
setSubmittedArgs = [];
|
|
259
|
-
mockSetSubmitting(false);
|
|
260
|
-
});
|
|
261
|
-
const preActionChecks = () => {
|
|
262
|
-
expect(_helpers.default.canActionProceedCalls).toEqual(1);
|
|
263
|
-
expect(MOCK_VALIDATE.pageCalls).toEqual(1);
|
|
264
|
-
expect(_helpers.default.cleanHiddenNestedDataCalls).toEqual(1);
|
|
265
|
-
};
|
|
266
|
-
const postActionChecks = argsUsed => {
|
|
267
|
-
expect(_utils.default.Format.formCalls).toEqual(1);
|
|
268
|
-
expect(_helpers.default.getSubmissionStatusCalls).toEqual(1);
|
|
269
|
-
// setData is always called once in the error callback
|
|
270
|
-
// for the onSubmit hook. It's called an extra time prior
|
|
271
|
-
// to this if patch is valid.
|
|
272
|
-
if (argsUsed.patch) {
|
|
273
|
-
expect(setDataCalls).toEqual(2);
|
|
274
|
-
const dataUsed = _objectSpread(_objectSpread(_objectSpread({}, argsUsed.data), argsUsed.patch), argsUsed.formState.page.formData);
|
|
275
|
-
const submissionData = _utils.default.Format.form(null, dataUsed, null);
|
|
276
|
-
submissionData.formStatus = _helpers.default.getSubmissionStatus();
|
|
277
|
-
expect(setDataArgs[0]).toEqual(submissionData);
|
|
278
|
-
} else {
|
|
279
|
-
expect(setDataCalls).toEqual(1);
|
|
280
|
-
}
|
|
281
|
-
expect(MOCK_HOOKS.onSubmitCalls).toEqual(1);
|
|
282
|
-
if (argsUsed.type === _models.FormTypes.HUB && Object.keys(argsUsed.patchLabel).length > 0) {
|
|
283
|
-
const firstKey = Object.keys(argsUsed.patchLabel)[0];
|
|
284
|
-
expect(MOCK_HOOKS.onSubmitArgs[0]).toMatchObject({
|
|
285
|
-
changedFieldName: firstKey,
|
|
286
|
-
changedFieldValue: argsUsed.patchLabel[firstKey]
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
expect(MOCK_HOOKS.onActionCalls).toEqual(1);
|
|
290
|
-
|
|
291
|
-
// Both the success and error paths of the onSubmit hook are tested
|
|
292
|
-
// together to make sure the correct function chains are called for
|
|
293
|
-
// each.
|
|
294
|
-
|
|
295
|
-
// The success path is tested per-action as it can differ slightly.
|
|
296
|
-
|
|
297
|
-
// Testing the error path.
|
|
298
|
-
expect(_handlers.default.submissionErrorCalls).toEqual(1);
|
|
299
|
-
expect(setDataArgs[setDataCalls - 1]).toEqual(argsUsed.data); // Data is reset in the case of an error.
|
|
300
|
-
};
|
|
301
|
-
it("should handle the ".concat(_models.PageAction.TYPES.CANCEL, " Page Action type"), () => {
|
|
302
|
-
const ACTION = {
|
|
303
|
-
type: _models.PageAction.TYPES.CANCEL
|
|
304
|
-
};
|
|
305
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
306
|
-
action: ACTION
|
|
307
|
-
});
|
|
308
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
309
|
-
expect(MOCK_HOOKS.onCancelArgs.length).toEqual(1);
|
|
310
|
-
expect(MOCK_HOOKS.onCancelArgs[0]).toMatchObject({});
|
|
311
|
-
// Shouldn't get to the point of validation if
|
|
312
|
-
// action is a cancel action.
|
|
313
|
-
expect(_helpers.default.canActionProceedCalls).toEqual(0);
|
|
314
|
-
expect(MOCK_VALIDATE.pageCalls).toEqual(0);
|
|
315
|
-
});
|
|
316
|
-
it("should handle the ".concat(_models.PageAction.TYPES.NAVIGATE, " Page Action type"), () => {
|
|
317
|
-
const ACTION = {
|
|
318
|
-
type: _models.PageAction.TYPES.NAVIGATE
|
|
319
|
-
};
|
|
320
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
321
|
-
action: ACTION
|
|
322
|
-
});
|
|
323
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
324
|
-
preActionChecks();
|
|
325
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
326
|
-
expect(MOCK_HOOKS.onSubmitCalls).toEqual(0);
|
|
327
|
-
// Not doing the usual post-action checks here
|
|
328
|
-
// as a navigate action should stop at calling
|
|
329
|
-
// hooks.navigate.
|
|
330
|
-
});
|
|
331
|
-
it("should handle the ".concat(_models.PageAction.TYPES.SUBMIT, " Page Action type"), () => {
|
|
332
|
-
const ACTION = {
|
|
333
|
-
type: _models.PageAction.TYPES.SUBMIT
|
|
334
|
-
};
|
|
335
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
336
|
-
action: ACTION
|
|
337
|
-
});
|
|
338
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
339
|
-
preActionChecks();
|
|
340
|
-
expect(setPagePointCalls).toEqual(1);
|
|
341
|
-
expect(setPagePointArgs[0]).toEqual('submit');
|
|
342
|
-
postActionChecks(CUSTOM_ARGS);
|
|
343
|
-
});
|
|
344
|
-
it("should handle the ".concat(_models.PageAction.TYPES.SAVE_AND_NAVIGATE, " Page Action type"), () => {
|
|
345
|
-
const ACTION = {
|
|
346
|
-
type: _models.PageAction.TYPES.SAVE_AND_NAVIGATE
|
|
347
|
-
};
|
|
348
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
349
|
-
action: ACTION
|
|
350
|
-
});
|
|
351
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
352
|
-
preActionChecks();
|
|
353
|
-
// All the actions does in this case is set a function
|
|
354
|
-
// to be called in the onSuccess callback for the onSubmit hook.
|
|
355
|
-
postActionChecks(CUSTOM_ARGS);
|
|
356
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
357
|
-
});
|
|
358
|
-
it("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_ADD, " Page Action type"), () => {
|
|
359
|
-
const FORM_STATE = {
|
|
360
|
-
page: {
|
|
361
|
-
formData: {
|
|
362
|
-
'testCollection': []
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
const ACTION = {
|
|
367
|
-
type: _models.PageAction.TYPES.COLLECTION_ADD,
|
|
368
|
-
collection: 'testCollection'
|
|
369
|
-
};
|
|
370
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
371
|
-
action: ACTION,
|
|
372
|
-
formState: FORM_STATE
|
|
373
|
-
});
|
|
374
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
375
|
-
preActionChecks();
|
|
376
|
-
expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toBeDefined();
|
|
377
|
-
postActionChecks(CUSTOM_ARGS);
|
|
378
|
-
|
|
379
|
-
// This action type also sets up a call to handlers.navigate
|
|
380
|
-
// that's called as part of the onSubmit hook's onSuccess callback.
|
|
381
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
382
|
-
});
|
|
383
|
-
it("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_ADD, " Page Action type where active ID is not the last entry in collection"), () => {
|
|
384
|
-
// If the active ID is not the last entry in the collection
|
|
385
|
-
// then a new entry is not added
|
|
386
|
-
// and the active ID moves to the next entry ID.
|
|
387
|
-
const FORM_STATE = {
|
|
388
|
-
page: {
|
|
389
|
-
formData: {
|
|
390
|
-
'testCollection': [{
|
|
391
|
-
id: '1'
|
|
392
|
-
}, {
|
|
393
|
-
id: '2'
|
|
394
|
-
}],
|
|
395
|
-
testCollectionActiveId: '1'
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
};
|
|
399
|
-
const ACTION = {
|
|
400
|
-
type: _models.PageAction.TYPES.COLLECTION_ADD,
|
|
401
|
-
collection: 'testCollection'
|
|
402
|
-
};
|
|
403
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
404
|
-
action: ACTION,
|
|
405
|
-
formState: FORM_STATE
|
|
406
|
-
});
|
|
407
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
408
|
-
preActionChecks();
|
|
409
|
-
expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual('2');
|
|
410
|
-
expect(FORM_STATE.page.formData[ACTION.collection].length).toEqual(2);
|
|
411
|
-
postActionChecks(CUSTOM_ARGS);
|
|
412
|
-
|
|
413
|
-
// This action type also sets up a call to handlers.navigate
|
|
414
|
-
// that's called as part of the onSubmit hook's onSuccess callback.
|
|
415
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
416
|
-
});
|
|
417
|
-
it("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_ADD, " Page Action type where active ID is the last entry in collection"), () => {
|
|
418
|
-
// If the active ID is the last entry in the collection
|
|
419
|
-
// then a new entry is added (although not picked up in this test)
|
|
420
|
-
// and the active ID becomes null.
|
|
421
|
-
const FORM_STATE = {
|
|
422
|
-
page: {
|
|
423
|
-
formData: {
|
|
424
|
-
'testCollection': [{
|
|
425
|
-
id: '1'
|
|
426
|
-
}, {
|
|
427
|
-
id: '2'
|
|
428
|
-
}],
|
|
429
|
-
testCollectionActiveId: '2'
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
};
|
|
433
|
-
const ACTION = {
|
|
434
|
-
type: _models.PageAction.TYPES.COLLECTION_ADD,
|
|
435
|
-
collection: 'testCollection'
|
|
436
|
-
};
|
|
437
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
438
|
-
action: ACTION,
|
|
439
|
-
formState: FORM_STATE
|
|
440
|
-
});
|
|
441
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
442
|
-
preActionChecks();
|
|
443
|
-
expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual(null);
|
|
444
|
-
expect(FORM_STATE.page.formData[ACTION.collection].length).toEqual(2);
|
|
445
|
-
postActionChecks(CUSTOM_ARGS);
|
|
446
|
-
|
|
447
|
-
// This action type also sets up a call to handlers.navigate
|
|
448
|
-
// that's called as part of the onSubmit hook's onSuccess callback.
|
|
449
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
450
|
-
});
|
|
451
|
-
it("should clean previous collection entry fields at top level of formData", () => {
|
|
452
|
-
const FORM_STATE = {
|
|
453
|
-
page: {
|
|
454
|
-
formData: {
|
|
455
|
-
'testCollection': [{
|
|
456
|
-
'flightNumber': '1'
|
|
457
|
-
}],
|
|
458
|
-
'flightNumber': '1'
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
};
|
|
462
|
-
const ACTION = {
|
|
463
|
-
type: _models.PageAction.TYPES.COLLECTION_ADD,
|
|
464
|
-
collection: 'testCollection'
|
|
465
|
-
};
|
|
466
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
467
|
-
action: ACTION,
|
|
468
|
-
formState: FORM_STATE
|
|
469
|
-
});
|
|
470
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
471
|
-
preActionChecks();
|
|
472
|
-
expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toBeDefined();
|
|
473
|
-
expect(FORM_STATE.page.formData.flightNumber).toBeUndefined();
|
|
474
|
-
postActionChecks(CUSTOM_ARGS);
|
|
475
|
-
|
|
476
|
-
// This action type also sets up a call to handlers.navigate
|
|
477
|
-
// that's called as part of the onSubmit hook's onSuccess callback.
|
|
478
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
479
|
-
});
|
|
480
|
-
describe("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_DUPLICATE, " Page Action type"), () => {
|
|
481
|
-
it("calling handlers.navigate if the duplication was successful", () => {
|
|
482
|
-
const FORM_STATE = {
|
|
483
|
-
page: {
|
|
484
|
-
formData: {
|
|
485
|
-
'testCollection': []
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
};
|
|
489
|
-
const ACTION = {
|
|
490
|
-
type: _models.PageAction.TYPES.COLLECTION_DUPLICATE,
|
|
491
|
-
collection: 'testCollection'
|
|
492
|
-
};
|
|
493
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
494
|
-
action: ACTION,
|
|
495
|
-
formState: FORM_STATE
|
|
496
|
-
});
|
|
497
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
498
|
-
preActionChecks();
|
|
499
|
-
expect(_utils.default.CollectionPage.duplicateActiveEntryCalls).toEqual(1);
|
|
500
|
-
postActionChecks(CUSTOM_ARGS);
|
|
501
|
-
|
|
502
|
-
// This action type also sets up a call to handlers.navigate
|
|
503
|
-
// that's called as part of the onSubmit hook's onSuccess callback.
|
|
504
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
505
|
-
});
|
|
506
|
-
it("calling onPageChange if the duplication was unsuccessful", () => {
|
|
507
|
-
const FORM_STATE = {
|
|
508
|
-
page: {
|
|
509
|
-
formData: {
|
|
510
|
-
'testCollection': []
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
};
|
|
514
|
-
const ACTION = {
|
|
515
|
-
type: _models.PageAction.TYPES.COLLECTION_DUPLICATE,
|
|
516
|
-
collection: 'testCollection'
|
|
517
|
-
};
|
|
518
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
519
|
-
action: ACTION,
|
|
520
|
-
formState: FORM_STATE
|
|
521
|
-
});
|
|
522
|
-
_utils.default.CollectionPage.duplicateActiveEntryResult = false;
|
|
523
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
524
|
-
preActionChecks();
|
|
525
|
-
expect(_utils.default.CollectionPage.duplicateActiveEntryCalls).toEqual(1);
|
|
526
|
-
postActionChecks(CUSTOM_ARGS);
|
|
527
|
-
|
|
528
|
-
// The handlers.navigate callback shouldn't be set when
|
|
529
|
-
// duplication fails.
|
|
530
|
-
expect(_handlers.default.navigateCalls).toEqual(0);
|
|
531
|
-
// Instead we should be using the default onPageChange setup.
|
|
532
|
-
expect(onPageChangeCalls).toEqual(1);
|
|
533
|
-
});
|
|
534
|
-
});
|
|
535
|
-
describe("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_REMOVE, " Page Action type"), () => {
|
|
536
|
-
it("should store a reference to the removed item if action.recordRemoval is true", () => {
|
|
537
|
-
const FORM_STATE = {
|
|
538
|
-
page: {
|
|
539
|
-
formData: {
|
|
540
|
-
testCollectionActiveId: 'removeMe',
|
|
541
|
-
testCollection: [{
|
|
542
|
-
id: 'removeMe'
|
|
543
|
-
}, {
|
|
544
|
-
id: 'leaveMeAlone'
|
|
545
|
-
}]
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
};
|
|
549
|
-
const ACTION = {
|
|
550
|
-
type: _models.PageAction.TYPES.COLLECTION_REMOVE,
|
|
551
|
-
collection: 'testCollection',
|
|
552
|
-
recordRemoval: true
|
|
553
|
-
};
|
|
554
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
555
|
-
action: ACTION,
|
|
556
|
-
formState: FORM_STATE
|
|
557
|
-
});
|
|
558
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
559
|
-
preActionChecks();
|
|
560
|
-
expect(FORM_STATE.page.formData.testCollection).toEqual([{
|
|
561
|
-
id: 'leaveMeAlone'
|
|
562
|
-
}]);
|
|
563
|
-
expect(FORM_STATE.page.formData.testCollectionLastRemoved).toEqual({
|
|
564
|
-
id: 'removeMe'
|
|
565
|
-
});
|
|
566
|
-
postActionChecks(CUSTOM_ARGS);
|
|
567
|
-
|
|
568
|
-
// This action type uses handlers navigate callback
|
|
569
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
570
|
-
});
|
|
571
|
-
it("should not store a reference to the removed item if action.recordRemoval is false", () => {
|
|
572
|
-
const FORM_STATE = {
|
|
573
|
-
page: {
|
|
574
|
-
formData: {
|
|
575
|
-
testCollectionActiveId: 'removeMe',
|
|
576
|
-
testCollection: [{
|
|
577
|
-
id: 'removeMe'
|
|
578
|
-
}, {
|
|
579
|
-
id: 'leaveMeAlone'
|
|
580
|
-
}]
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
};
|
|
584
|
-
const ACTION = {
|
|
585
|
-
type: _models.PageAction.TYPES.COLLECTION_REMOVE,
|
|
586
|
-
collection: 'testCollection',
|
|
587
|
-
recordRemoval: false
|
|
588
|
-
};
|
|
589
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
590
|
-
action: ACTION,
|
|
591
|
-
formState: FORM_STATE
|
|
592
|
-
});
|
|
593
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
594
|
-
preActionChecks();
|
|
595
|
-
expect(FORM_STATE.page.formData.testCollection).toEqual([{
|
|
596
|
-
id: 'leaveMeAlone'
|
|
597
|
-
}]);
|
|
598
|
-
expect(FORM_STATE.page.formData.testCollectionLastRemoved).toBeUndefined();
|
|
599
|
-
postActionChecks(CUSTOM_ARGS);
|
|
600
|
-
|
|
601
|
-
// This action type uses handlers navigate callback
|
|
602
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
603
|
-
});
|
|
604
|
-
it("should not store a reference to the removed item if action.recordRemoval is not defined", () => {
|
|
605
|
-
const FORM_STATE = {
|
|
606
|
-
page: {
|
|
607
|
-
formData: {
|
|
608
|
-
testCollectionActiveId: 'removeMe',
|
|
609
|
-
testCollection: [{
|
|
610
|
-
id: 'removeMe'
|
|
611
|
-
}, {
|
|
612
|
-
id: 'leaveMeAlone'
|
|
613
|
-
}]
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
};
|
|
617
|
-
const ACTION = {
|
|
618
|
-
type: _models.PageAction.TYPES.COLLECTION_REMOVE,
|
|
619
|
-
collection: 'testCollection'
|
|
620
|
-
};
|
|
621
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
622
|
-
action: ACTION,
|
|
623
|
-
formState: FORM_STATE
|
|
624
|
-
});
|
|
625
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
626
|
-
preActionChecks();
|
|
627
|
-
expect(FORM_STATE.page.formData.testCollection).toEqual([{
|
|
628
|
-
id: 'leaveMeAlone'
|
|
629
|
-
}]);
|
|
630
|
-
expect(FORM_STATE.page.formData.testCollectionLastRemoved).toBeUndefined();
|
|
631
|
-
postActionChecks(CUSTOM_ARGS);
|
|
632
|
-
|
|
633
|
-
// This action type uses handlers navigate callback
|
|
634
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
635
|
-
});
|
|
636
|
-
it("should clean collection fields at top level of formData when entries remain", () => {
|
|
637
|
-
// After removing the active entry, the collection data is assigned to the
|
|
638
|
-
// top level of formData and the activeId is reset.
|
|
639
|
-
const FORM_STATE = {
|
|
640
|
-
page: {
|
|
641
|
-
formData: {
|
|
642
|
-
testCollectionActiveId: 'removeMe',
|
|
643
|
-
testCollection: [{
|
|
644
|
-
id: 'leaveMeAlone',
|
|
645
|
-
flightNumber: '1'
|
|
646
|
-
}, {
|
|
647
|
-
id: 'removeMe',
|
|
648
|
-
flightNumber: '2'
|
|
649
|
-
}],
|
|
650
|
-
flightNumber: '2',
|
|
651
|
-
testCollectionLastRemoved: 'previousOne'
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
};
|
|
655
|
-
const ACTION = {
|
|
656
|
-
type: _models.PageAction.TYPES.COLLECTION_REMOVE,
|
|
657
|
-
collection: 'testCollection',
|
|
658
|
-
recordRemoval: true
|
|
659
|
-
};
|
|
660
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
661
|
-
action: ACTION,
|
|
662
|
-
formState: FORM_STATE
|
|
663
|
-
});
|
|
664
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
665
|
-
preActionChecks();
|
|
666
|
-
expect(FORM_STATE.page.formData.testCollection).toEqual([{
|
|
667
|
-
id: 'leaveMeAlone',
|
|
668
|
-
flightNumber: '1'
|
|
669
|
-
}]);
|
|
670
|
-
expect(FORM_STATE.page.formData.testCollectionLastRemoved).toEqual({
|
|
671
|
-
id: 'removeMe',
|
|
672
|
-
flightNumber: '2'
|
|
673
|
-
});
|
|
674
|
-
expect(FORM_STATE.page.formData.flightNumber).toEqual('1');
|
|
675
|
-
expect(FORM_STATE.page.formData.testCollectionActiveId).toEqual('leaveMeAlone');
|
|
676
|
-
postActionChecks(CUSTOM_ARGS);
|
|
677
|
-
|
|
678
|
-
// This action type uses handlers navigate callback
|
|
679
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
680
|
-
});
|
|
681
|
-
it("should clean collection fields at top level of formData after last entry removed", () => {
|
|
682
|
-
// After removing the last active entry, the collection array and activeID are deleted,
|
|
683
|
-
// and the collection data is removed from top level of formData.
|
|
684
|
-
const FORM_STATE = {
|
|
685
|
-
page: {
|
|
686
|
-
formData: {
|
|
687
|
-
testCollectionActiveId: 'removeMe',
|
|
688
|
-
testCollection: [{
|
|
689
|
-
id: 'removeMe',
|
|
690
|
-
flightNumber: '1'
|
|
691
|
-
}],
|
|
692
|
-
flightNumber: '1',
|
|
693
|
-
testCollectionLastRemoved: 'previousOne'
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
};
|
|
697
|
-
const ACTION = {
|
|
698
|
-
type: _models.PageAction.TYPES.COLLECTION_REMOVE,
|
|
699
|
-
collection: 'testCollection',
|
|
700
|
-
recordRemoval: true
|
|
701
|
-
};
|
|
702
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
703
|
-
action: ACTION,
|
|
704
|
-
formState: FORM_STATE
|
|
705
|
-
});
|
|
706
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
707
|
-
preActionChecks();
|
|
708
|
-
expect(FORM_STATE.page.formData.testCollection).toBeUndefined();
|
|
709
|
-
expect(FORM_STATE.page.formData.testCollectionLastRemoved).toEqual({
|
|
710
|
-
id: 'removeMe',
|
|
711
|
-
flightNumber: '1'
|
|
712
|
-
});
|
|
713
|
-
expect(FORM_STATE.page.formData.flightNumber).toBeUndefined();
|
|
714
|
-
expect(FORM_STATE.page.formData.testCollectionActiveId).toBeUndefined();
|
|
715
|
-
postActionChecks(CUSTOM_ARGS);
|
|
716
|
-
|
|
717
|
-
// This action type uses handlers navigate callback
|
|
718
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
719
|
-
});
|
|
720
|
-
});
|
|
721
|
-
describe('if validation fails', () => {
|
|
722
|
-
const VALID_ACTIONS = Object.values(_models.PageAction.TYPES).filter(a => a !== _models.PageAction.TYPES.CANCEL);
|
|
723
|
-
VALID_ACTIONS.forEach(actionType => {
|
|
724
|
-
it("should not continue for the ".concat(actionType, " action type"), () => {
|
|
725
|
-
const ACTION = {
|
|
726
|
-
type: actionType
|
|
727
|
-
};
|
|
728
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
729
|
-
action: ACTION
|
|
730
|
-
});
|
|
731
|
-
_helpers.default.canActionProceedResult = false;
|
|
732
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
733
|
-
expect(_helpers.default.canActionProceedCalls).toEqual(1);
|
|
734
|
-
expect(MOCK_VALIDATE.pageCalls).toEqual(1);
|
|
735
|
-
// Validation fails so we expect to never reach
|
|
736
|
-
// the point of submission.
|
|
737
|
-
expect(MOCK_HOOKS.onSubmitCalls).toEqual(0);
|
|
738
|
-
});
|
|
739
|
-
});
|
|
740
|
-
});
|
|
741
|
-
describe('adding a field to formData if specified on the action', () => {
|
|
742
|
-
const VALID_ACTIONS = Object.values(_models.PageAction.TYPES).filter(a => a !== _models.PageAction.TYPES.CANCEL && a !== _models.PageAction.TYPES.NAVIGATE);
|
|
743
|
-
VALID_ACTIONS.forEach(actionType => {
|
|
744
|
-
it("should work for the ".concat(actionType, " action type"), () => {
|
|
745
|
-
const FORM_STATE = {
|
|
746
|
-
page: {
|
|
747
|
-
formData: {
|
|
748
|
-
testCollection: []
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
const ACTION = {
|
|
753
|
-
type: actionType,
|
|
754
|
-
collection: 'testCollection',
|
|
755
|
-
addToFormData: [{
|
|
756
|
-
field: 'alpha',
|
|
757
|
-
value: '123'
|
|
758
|
-
}, {
|
|
759
|
-
field: 'parent.child',
|
|
760
|
-
value: [{
|
|
761
|
-
id: '12345'
|
|
762
|
-
}],
|
|
763
|
-
isCollection: true
|
|
764
|
-
}]
|
|
765
|
-
};
|
|
766
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
767
|
-
formState: FORM_STATE,
|
|
768
|
-
action: ACTION
|
|
769
|
-
});
|
|
770
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
771
|
-
preActionChecks();
|
|
772
|
-
postActionChecks(CUSTOM_ARGS);
|
|
773
|
-
expect(FORM_STATE.page.formData).toMatchObject({
|
|
774
|
-
alpha: '123'
|
|
775
|
-
});
|
|
776
|
-
expect(FORM_STATE.page.formData.parent[0].child[0].id).toEqual('12345');
|
|
777
|
-
});
|
|
778
|
-
});
|
|
779
|
-
it("should work for the ".concat(_models.PageAction.TYPES.SAVE_AND_NAVIGATE, " action type to reset the active ID"), () => {
|
|
780
|
-
// In this test the action includes the resetActiveId field
|
|
781
|
-
// requiring that the active ID is pointed to the first entry in the collection
|
|
782
|
-
// so that user can cycle through the full collection again.
|
|
783
|
-
const FORM_STATE = {
|
|
784
|
-
page: {
|
|
785
|
-
formData: {
|
|
786
|
-
testCollection: [{
|
|
787
|
-
id: '1'
|
|
788
|
-
}, {
|
|
789
|
-
id: '2'
|
|
790
|
-
}, {
|
|
791
|
-
id: '3'
|
|
792
|
-
}],
|
|
793
|
-
testCollectionActiveId: '3'
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
};
|
|
797
|
-
const ACTION = {
|
|
798
|
-
type: _models.PageAction.TYPES.SAVE_AND_NAVIGATE,
|
|
799
|
-
collection: 'testCollection',
|
|
800
|
-
resetActiveId: true
|
|
801
|
-
};
|
|
802
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
803
|
-
formState: FORM_STATE,
|
|
804
|
-
action: ACTION
|
|
805
|
-
});
|
|
806
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
807
|
-
preActionChecks();
|
|
808
|
-
// All the actions does in this case is set a function
|
|
809
|
-
// to be called in the onSuccess callback for the onSubmit hook.
|
|
810
|
-
postActionChecks(CUSTOM_ARGS);
|
|
811
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
812
|
-
expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual('1');
|
|
813
|
-
});
|
|
814
|
-
it("should work for the ".concat(_models.PageAction.TYPES.SAVE_AND_NAVIGATE, " action type to set addAnother to yes"), () => {
|
|
815
|
-
// If the user is midway through the collection
|
|
816
|
-
// then the addAnother field is set to yes
|
|
817
|
-
// to allow the navigation to move to next entry.
|
|
818
|
-
const FORM_STATE = {
|
|
819
|
-
page: {
|
|
820
|
-
formData: {
|
|
821
|
-
tests: [{
|
|
822
|
-
id: '1'
|
|
823
|
-
}, {
|
|
824
|
-
id: '2'
|
|
825
|
-
}, {
|
|
826
|
-
id: '3'
|
|
827
|
-
}],
|
|
828
|
-
testsActiveId: '2',
|
|
829
|
-
addAnotherTest: 'No'
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
};
|
|
833
|
-
const ACTION = {
|
|
834
|
-
type: _models.PageAction.TYPES.SAVE_AND_NAVIGATE,
|
|
835
|
-
collection: 'tests'
|
|
836
|
-
};
|
|
837
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
838
|
-
formState: FORM_STATE,
|
|
839
|
-
action: ACTION
|
|
840
|
-
});
|
|
841
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
842
|
-
preActionChecks();
|
|
843
|
-
// All the actions does in this case is set a function
|
|
844
|
-
// to be called in the onSuccess callback for the onSubmit hook.
|
|
845
|
-
postActionChecks(CUSTOM_ARGS);
|
|
846
|
-
expect(_handlers.default.navigateCalls).toEqual(1);
|
|
847
|
-
expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual('2');
|
|
848
|
-
expect(FORM_STATE.page.formData[ACTION.collection].length).toEqual(3);
|
|
849
|
-
expect(FORM_STATE.page.formData.addAnotherTest).toEqual('Yes');
|
|
850
|
-
});
|
|
851
|
-
it("should work for the ".concat(_models.PageAction.TYPES.NAVIGATE, " action type"), () => {
|
|
852
|
-
const FORM_STATE = {
|
|
853
|
-
page: {
|
|
854
|
-
formData: {
|
|
855
|
-
testCollection: []
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
};
|
|
859
|
-
const ACTION = {
|
|
860
|
-
type: _models.PageAction.TYPES.NAVIGATE,
|
|
861
|
-
collection: 'testCollection',
|
|
862
|
-
addToFormData: [{
|
|
863
|
-
field: 'alpha',
|
|
864
|
-
value: '123'
|
|
865
|
-
}, {
|
|
866
|
-
field: 'parent.child',
|
|
867
|
-
value: [{
|
|
868
|
-
id: '12345'
|
|
869
|
-
}],
|
|
870
|
-
isCollection: true
|
|
871
|
-
}]
|
|
872
|
-
};
|
|
873
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
874
|
-
formState: FORM_STATE,
|
|
875
|
-
action: ACTION
|
|
876
|
-
});
|
|
877
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
878
|
-
preActionChecks();
|
|
879
|
-
// Not doing the usual post-action checks here
|
|
880
|
-
// as a navigate action should stop at calling
|
|
881
|
-
// hooks.navigate.
|
|
882
|
-
expect(FORM_STATE.page.formData).toMatchObject({
|
|
883
|
-
alpha: '123'
|
|
884
|
-
});
|
|
885
|
-
expect(FORM_STATE.page.formData.parent[0].child[0].id).toEqual('12345');
|
|
886
|
-
});
|
|
887
|
-
it('should work for an array of formData', () => {
|
|
888
|
-
const FORM_STATE = {
|
|
889
|
-
page: {
|
|
890
|
-
formData: {
|
|
891
|
-
testCollection: []
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
};
|
|
895
|
-
const ACTION = {
|
|
896
|
-
type: _models.PageAction.TYPES.NAVIGATE,
|
|
897
|
-
collection: 'testCollection',
|
|
898
|
-
addToFormData: [{
|
|
899
|
-
field: 'alpha',
|
|
900
|
-
value: '123'
|
|
901
|
-
}, {
|
|
902
|
-
field: 'beta.gamma',
|
|
903
|
-
value: '456'
|
|
904
|
-
}]
|
|
905
|
-
};
|
|
906
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
907
|
-
formState: FORM_STATE,
|
|
908
|
-
action: ACTION
|
|
909
|
-
});
|
|
910
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
911
|
-
preActionChecks();
|
|
912
|
-
// Not doing the usual post-action checks here
|
|
913
|
-
// as a navigate action should stop at calling
|
|
914
|
-
// hooks.navigate.
|
|
915
|
-
expect(FORM_STATE.page.formData).toMatchObject({
|
|
916
|
-
alpha: '123',
|
|
917
|
-
beta: {
|
|
918
|
-
gamma: '456'
|
|
919
|
-
}
|
|
920
|
-
});
|
|
921
|
-
});
|
|
922
|
-
});
|
|
923
|
-
describe('recording patchLabel fields correctly when it is defined', () => {
|
|
924
|
-
const VALID_ACTIONS = Object.values(_models.PageAction.TYPES).filter(a => a !== _models.PageAction.TYPES.CANCEL && a !== _models.PageAction.TYPES.NAVIGATE);
|
|
925
|
-
VALID_ACTIONS.forEach(actionType => {
|
|
926
|
-
it("should work for the ".concat(actionType, " action type"), () => {
|
|
927
|
-
const FORM_STATE = {
|
|
928
|
-
page: {
|
|
929
|
-
formData: {
|
|
930
|
-
testCollection: []
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
};
|
|
934
|
-
const KEY = 'testField';
|
|
935
|
-
const VALUE = 'testValue';
|
|
936
|
-
const PATCH_LABEL = {
|
|
937
|
-
[KEY]: VALUE
|
|
938
|
-
};
|
|
939
|
-
const PATCH = {
|
|
940
|
-
[KEY]: VALUE
|
|
941
|
-
};
|
|
942
|
-
const ACTION = {
|
|
943
|
-
type: actionType,
|
|
944
|
-
collection: 'testCollection'
|
|
945
|
-
};
|
|
946
|
-
const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
|
|
947
|
-
action: ACTION,
|
|
948
|
-
formState: FORM_STATE,
|
|
949
|
-
patch: PATCH,
|
|
950
|
-
patchLabel: PATCH_LABEL,
|
|
951
|
-
type: _models.FormTypes.HUB
|
|
952
|
-
});
|
|
953
|
-
_onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
|
|
954
|
-
preActionChecks();
|
|
955
|
-
postActionChecks(CUSTOM_ARGS); // Specific check for patchLabel done in here.
|
|
956
|
-
});
|
|
957
|
-
});
|
|
958
|
-
});
|
|
959
|
-
});
|
|
960
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9kZWxzIiwicmVxdWlyZSIsIl91dGlscyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaGFuZGxlcnMiLCJfaGVscGVycyIsIl9vblBhZ2VBY3Rpb24iLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJvd25LZXlzIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiamVzdCIsIm1vY2siLCJuYXZpZ2F0ZUNhbGxzIiwibmF2aWdhdGUiLCJzdWJtaXNzaW9uRXJyb3JDYWxscyIsInN1Ym1pc3Npb25FcnJvckFyZ3MiLCJzdWJtaXNzaW9uRXJyb3IiLCJlcnJvcnMiLCJhZGRFcnJvcnMiLCJyZXNldCIsImNhbkFjdGlvblByb2NlZWRDYWxscyIsImNhbkFjdGlvblByb2NlZWRSZXN1bHQiLCJjYW5BY3Rpb25Qcm9jZWVkIiwiYWN0aW9uIiwicGFnZSIsInZhbGlkYXRvciIsImNsZWFuSGlkZGVuTmVzdGVkRGF0YUNhbGxzIiwiY2xlYW5IaWRkZW5OZXN0ZWREYXRhIiwicGF0Y2giLCJjbGVhck91dFVuY29tcGxldGVkUm91dGVzQ2FsbHMiLCJjbGVhck91dFVuY29tcGxldGVkUm91dGVzIiwiY2xlYW5zZUhpZGRlbkRhdGEiLCJmb3JtUGFnZXNBbmRDb21wb25lbnRzIiwiZm9ybURhdGEiLCJnZXROZXh0UGFnZUlkQ2FsbHMiLCJnZXROZXh0UGFnZUlkIiwiZ2V0U3VibWlzc2lvblN0YXR1c0NhbGxzIiwiZ2V0U3VibWlzc2lvblN0YXR1cyIsImNhbkNZQVN1Ym1pdFJlc3VsdCIsImdldEZvcm1TdGF0ZUNhbGxzIiwib3JpZ2luYWxNb2R1bGUiLCJyZXF1aXJlQWN0dWFsIiwiRm9ybWF0IiwiZm9ybUNhbGxzIiwiZm9ybSIsImRhdGEiLCJDb2xsZWN0aW9uUGFnZSIsImR1cGxpY2F0ZUFjdGl2ZUVudHJ5Q2FsbHMiLCJkdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdCIsImR1cGxpY2F0ZUFjdGl2ZUVudHJ5IiwiYWRkRW50cnlDYWxscyIsImFkZEVudHJ5UmVzdWx0IiwiYWRkRW50cnkiLCJjb2xsZWN0aW9uTmFtZSIsImRlc2NyaWJlIiwiTU9DS19IT09LUyIsIm9uU3VibWl0Q2FsbHMiLCJvblN1Ym1pdEFyZ3MiLCJvblN1Ym1pdCIsInR5cGUiLCJwYXlsb2FkIiwib25TdWNjZXNzIiwib25FcnJvciIsImNoYW5nZWRGaWVsZE5hbWUiLCJjaGFuZ2VkRmllbGRWYWx1ZSIsIm9uRm9ybUNvbXBsZXRlQ2FsbHMiLCJvbkZvcm1Db21wbGV0ZSIsIm9uQ2FuY2VsQXJncyIsIm9uQ2FuY2VsIiwib25BY3Rpb25DYWxscyIsIm9uQWN0aW9uIiwiTU9DS19WQUxJREFURSIsInBhZ2VDYWxscyIsInNldFBhZ2VQb2ludENhbGxzIiwic2V0UGFnZVBvaW50QXJncyIsIm1vY2tTZXRQYWdlUG9pbnQiLCJwb2ludCIsInNldERhdGFDYWxscyIsInNldERhdGFBcmdzIiwibW9ja1NldERhdGEiLCJvblBhZ2VDaGFuZ2VDYWxscyIsIm9uUGFnZUNoYW5nZUFyZ3MiLCJtb2NrT25QYWdlQ2hhbmdlIiwicGFnZUlkIiwiYWRkRXJyb3JzQXJncyIsIm1vY2tBZGRFcnJvcnMiLCJzZXRTdWJtaXR0ZWRBcmdzIiwibW9ja1NldFN1Ym1pdHRlZCIsIm5ld1N1Ym1pdHRlZCIsIm1vY2tTdWJtaXR0aW5nIiwibW9ja1NldFN1Ym1pdHRpbmciLCJzdWJtaXR0aW5nIiwiQ09NUE9ORU5UUyIsImlkIiwiZmllbGRJZCIsIlBBR0VTIiwiY29tcG9uZW50cyIsIkNVUlJFTlRfVEFTSyIsIm5hbWUiLCJmdWxsUGFnZXMiLCJBUkdTIiwiUGFnZUFjdGlvbiIsIlRZUEVTIiwiTkFWSUdBVEUiLCJwYXRjaExhYmVsIiwiaG9va3MiLCJmb3JtU3RhdGUiLCJ2YWxpZGF0ZSIsIm9uUGFnZUNoYW5nZSIsIkZvcm1UeXBlcyIsIkZPUk1fV0lUSF9UQVNLIiwicGFnZXMiLCJzZXRQYWdlUG9pbnQiLCJjdXJyZW50VGFzayIsInNldERhdGEiLCJodWJEZXRhaWxzIiwic2V0U3VibWl0dGVkIiwic2V0U3VibWl0dGluZyIsImJlZm9yZUVhY2giLCJoYW5kbGVycyIsImhlbHBlcnMiLCJVdGlscyIsInByZUFjdGlvbkNoZWNrcyIsImV4cGVjdCIsInRvRXF1YWwiLCJwb3N0QWN0aW9uQ2hlY2tzIiwiYXJnc1VzZWQiLCJkYXRhVXNlZCIsInN1Ym1pc3Npb25EYXRhIiwiZm9ybVN0YXR1cyIsIkhVQiIsImZpcnN0S2V5IiwidG9NYXRjaE9iamVjdCIsIml0IiwiY29uY2F0IiwiQ0FOQ0VMIiwiQUNUSU9OIiwiQ1VTVE9NX0FSR1MiLCJvblBhZ2VBY3Rpb24iLCJ2YWx1ZXMiLCJTVUJNSVQiLCJTQVZFX0FORF9OQVZJR0FURSIsIkNPTExFQ1RJT05fQUREIiwiRk9STV9TVEFURSIsImNvbGxlY3Rpb24iLCJ0b0JlRGVmaW5lZCIsInRlc3RDb2xsZWN0aW9uQWN0aXZlSWQiLCJmbGlnaHROdW1iZXIiLCJ0b0JlVW5kZWZpbmVkIiwiQ09MTEVDVElPTl9EVVBMSUNBVEUiLCJDT0xMRUNUSU9OX1JFTU9WRSIsInRlc3RDb2xsZWN0aW9uIiwicmVjb3JkUmVtb3ZhbCIsInRlc3RDb2xsZWN0aW9uTGFzdFJlbW92ZWQiLCJWQUxJRF9BQ1RJT05TIiwiYSIsImFjdGlvblR5cGUiLCJhZGRUb0Zvcm1EYXRhIiwiZmllbGQiLCJpc0NvbGxlY3Rpb24iLCJhbHBoYSIsInBhcmVudCIsImNoaWxkIiwicmVzZXRBY3RpdmVJZCIsInRlc3RzIiwidGVzdHNBY3RpdmVJZCIsImFkZEFub3RoZXJUZXN0IiwiYmV0YSIsImdhbW1hIiwiS0VZIiwiVkFMVUUiLCJQQVRDSF9MQUJFTCIsIlBBVENIIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRm9ybVJlbmRlcmVyL29uUGFnZUFjdGlvbi50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1UeXBlcywgUGFnZUFjdGlvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCBoYW5kbGVycyBmcm9tIFwiLi9oYW5kbGVyc1wiO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IG9uUGFnZUFjdGlvbiBmcm9tIFwiLi9vblBhZ2VBY3Rpb25cIlxuXG5qZXN0Lm1vY2soJy4vaGFuZGxlcnMnLCAoKSA9PiAoXG4gIHtcbiAgICBuYXZpZ2F0ZUNhbGxzOiAwLFxuICAgIG5hdmlnYXRlKCkge1xuICAgICAgdGhpcy5uYXZpZ2F0ZUNhbGxzICs9IDE7XG4gICAgfSxcbiAgICBzdWJtaXNzaW9uRXJyb3JDYWxsczogMCxcbiAgICBzdWJtaXNzaW9uRXJyb3JBcmdzOiBbXSxcbiAgICBzdWJtaXNzaW9uRXJyb3IoZXJyb3JzLCBhZGRFcnJvcnMpIHtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkVycm9yQ2FsbHMgKz0gMTtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkVycm9yQXJncy5wdXNoKGVycm9ycyk7XG4gICAgICBpZiAodHlwZW9mIGFkZEVycm9ycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhZGRFcnJvcnMoZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5uYXZpZ2F0ZUNhbGxzID0gMDtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkVycm9yQ2FsbHMgPSAwO1xuICAgICAgdGhpcy5zdWJtaXNzaW9uRXJyb3JBcmdzID0gW107XG4gICAgfVxuICB9XG4pKTtcblxuamVzdC5tb2NrKCcuL2hlbHBlcnMnLCAoKSA9PiAoIFxuICB7XG4gICAgY2FuQWN0aW9uUHJvY2VlZENhbGxzOiAwLFxuICAgIGNhbkFjdGlvblByb2NlZWRSZXN1bHQ6IHRydWUsXG4gICAgY2FuQWN0aW9uUHJvY2VlZChhY3Rpb24sIHBhZ2UsIHZhbGlkYXRvcikge1xuICAgICAgdGhpcy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMgKz0gMTtcbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbGlkYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2FuQWN0aW9uUHJvY2VlZFJlc3VsdDtcbiAgICB9LFxuICAgIGNsZWFuSGlkZGVuTmVzdGVkRGF0YUNhbGxzOiAwLFxuICAgIGNsZWFuSGlkZGVuTmVzdGVkRGF0YShwYXRjaCkge1xuICAgICAgdGhpcy5jbGVhbkhpZGRlbk5lc3RlZERhdGFDYWxscyArPSAxO1xuICAgICAgcmV0dXJuIHBhdGNoO1xuICAgIH0sXG4gICAgY2xlYXJPdXRVbmNvbXBsZXRlZFJvdXRlc0NhbGxzOiAwLFxuICAgIGNsZWFyT3V0VW5jb21wbGV0ZWRSb3V0ZXMoY2xlYW5zZUhpZGRlbkRhdGEsIGZvcm1QYWdlc0FuZENvbXBvbmVudHMsIGZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmNsZWFyT3V0VW5jb21wbGV0ZWRSb3V0ZXNDYWxscyArPSAxO1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH0sXG4gICAgZ2V0TmV4dFBhZ2VJZENhbGxzOiAwLFxuICAgIGdldE5leHRQYWdlSWQoKSB7XG4gICAgICB0aGlzLmdldE5leHRQYWdlSWRDYWxscyArPSAxO1xuICAgICAgcmV0dXJuICdwYWdlMic7XG4gICAgfSxcbiAgICBnZXRTdWJtaXNzaW9uU3RhdHVzQ2FsbHM6IDAsXG4gICAgZ2V0U3VibWlzc2lvblN0YXR1cygpIHtcbiAgICAgIHRoaXMuZ2V0U3VibWlzc2lvblN0YXR1c0NhbGxzICs9IDE7XG4gICAgICByZXR1cm4gJ0dvb2QgdG8gZ28hJztcbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMgPSAwO1xuICAgICAgdGhpcy5jYW5BY3Rpb25Qcm9jZWVkUmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FuQ1lBU3VibWl0UmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xlYW5IaWRkZW5OZXN0ZWREYXRhQ2FsbHMgPSAwO1xuICAgICAgdGhpcy5nZXRGb3JtU3RhdGVDYWxscyA9IDA7XG4gICAgICB0aGlzLmdldFN1Ym1pc3Npb25TdGF0dXNDYWxscyA9IDA7XG4gICAgfVxuICB9XG4pKTtcblxuamVzdC5tb2NrKCcuLi8uLi91dGlscycsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxNb2R1bGUgPSBqZXN0LnJlcXVpcmVBY3R1YWwoJy4uLy4uL3V0aWxzJyk7XG4gIHJldHVybiB7XG4gICAgLi4ub3JpZ2luYWxNb2R1bGUuZGVmYXVsdCxcbiAgICBGb3JtYXQ6IHtcbiAgICAgIGZvcm1DYWxsczogMCxcbiAgICAgIGZvcm0oZm9ybSwgZGF0YSkge1xuICAgICAgICB0aGlzLmZvcm1DYWxscyArPSAxO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICB9LFxuICAgIENvbGxlY3Rpb25QYWdlOiB7XG4gICAgICAuLi5vcmlnaW5hbE1vZHVsZS5kZWZhdWx0LkNvbGxlY3Rpb25QYWdlLFxuICAgICAgZHVwbGljYXRlQWN0aXZlRW50cnlDYWxsczogMCxcbiAgICAgIGR1cGxpY2F0ZUFjdGl2ZUVudHJ5UmVzdWx0OiB0cnVlLFxuICAgICAgZHVwbGljYXRlQWN0aXZlRW50cnkoKSB7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlQWN0aXZlRW50cnlDYWxscyArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5kdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBhZGRFbnRyeUNhbGxzOiAwLFxuICAgICAgYWRkRW50cnlSZXN1bHQ6IHRydWUsXG4gICAgICBhZGRFbnRyeShjb2xsZWN0aW9uTmFtZSwgZm9ybURhdGEpIHtcbiAgICAgICAgb3JpZ2luYWxNb2R1bGUuZGVmYXVsdC5Db2xsZWN0aW9uUGFnZS5hZGRFbnRyeShjb2xsZWN0aW9uTmFtZSwgZm9ybURhdGEpO1xuICAgICAgICB0aGlzLmFkZEVudHJ5Q2FsbHMgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRW50cnlSZXN1bHQ7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldCgpIHtcbiAgICAgIHRoaXMuRm9ybWF0LmZvcm1DYWxscyA9IDA7XG4gICAgICB0aGlzLkNvbGxlY3Rpb25QYWdlLmR1cGxpY2F0ZUFjdGl2ZUVudHJ5Q2FsbHMgPSAwO1xuICAgICAgdGhpcy5kdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdCA9IHRydWU7XG4gICAgICB0aGlzLkNvbGxlY3Rpb25QYWdlLmFkZEVudHJ5Q2FsbHMgPSAwO1xuICAgICAgdGhpcy5hZGRFbnRyeVJlc3VsdCA9IHRydWU7XG4gICAgfVxuICB9XG59KTtcblxuZGVzY3JpYmUoJ2NvbXBvbmVudHMuRm9ybVJlbmRlcmVyLm9uUGFnZUFjdGlvbicsICgpID0+IHsgXG5cbiAgY29uc3QgTU9DS19IT09LUyA9IHtcbiAgICBvblN1Ym1pdENhbGxzOiAwLFxuICAgIG9uU3VibWl0QXJnczogW10sXG4gICAgb25TdWJtaXQodHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yLCBjaGFuZ2VkRmllbGROYW1lLCBjaGFuZ2VkRmllbGRWYWx1ZSkge1xuICAgICAgdGhpcy5vblN1Ym1pdENhbGxzICs9IDE7XG4gICAgICB0aGlzLm9uU3VibWl0QXJncy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgY2hhbmdlZEZpZWxkTmFtZSwgY2hhbmdlZEZpZWxkVmFsdWUgfSk7XG4gICAgICBpZiAodHlwZW9mIG9uU3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH1cbiAgICAgIC8vIG9uRXJyb3Igd291bGQgbm90IG5vcm1hbGx5IGJlIGNhbGxlZCBhbG9uZ3NpZGVcbiAgICAgIC8vIG9uU3VjY2Vzcywgd2UncmUganVzdCBkb2luZyBpdCBoZXJlIHRvIG1ha2Ugc3VyZVxuICAgICAgLy8gdGhlIGV4cGVjdGVkIGZ1bmN0aW9uIGNoYWluIGlzIGNhbGxlZC5cbiAgICAgIGlmICh0eXBlb2Ygb25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkVycm9yKFsgJ2FuIGV4YW1wbGUgZXJyb3InIF0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Gb3JtQ29tcGxldGVDYWxsczogMCxcbiAgICBvbkZvcm1Db21wbGV0ZSgpIHtcbiAgICAgIHRoaXMub25Gb3JtQ29tcGxldGVDYWxscyArPSAxO1xuICAgIH0sXG4gICAgb25DYW5jZWxBcmdzOiBbXSxcbiAgICBvbkNhbmNlbChkYXRhKSB7XG4gICAgICB0aGlzLm9uQ2FuY2VsQXJncy5wdXNoKGRhdGEpO1xuICAgIH0sXG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLm9uU3VibWl0Q2FsbHMgPSAwO1xuICAgICAgdGhpcy5vblN1Ym1pdEFyZ3MgPSBbXTtcbiAgICAgIHRoaXMub25Gb3JtQ29tcGxldGVDYWxscyA9IDA7XG4gICAgICB0aGlzLm9uQ2FuY2VsQXJncyA9IFtdO1xuICAgICAgdGhpcy5vbkFjdGlvbkNhbGxzID0gMDtcbiAgICB9LFxuICAgIG9uQWN0aW9uQ2FsbHM6IDAsXG4gICAgb25BY3Rpb24oZm9ybURhdGEsIHBhdGNoKSB7XG4gICAgICB0aGlzLm9uQWN0aW9uQ2FsbHMgKz0gMTtcbiAgICAgIHJldHVybiB7IGZvcm1EYXRhLCBwYXRjaCB9O1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBNT0NLX1ZBTElEQVRFID0ge1xuICAgIHBhZ2VDYWxsczogMCxcbiAgICBwYWdlKCkge1xuICAgICAgTU9DS19WQUxJREFURS5wYWdlQ2FsbHMgKz0gMTtcbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5wYWdlQ2FsbHMgPSAwO1xuICAgIH1cbiAgfTtcblxuICBsZXQgc2V0UGFnZVBvaW50Q2FsbHMgPSAwO1xuICBsZXQgc2V0UGFnZVBvaW50QXJncyA9IFtdO1xuICBjb25zdCBtb2NrU2V0UGFnZVBvaW50ID0gKHBvaW50KSA9PiB7XG4gICAgc2V0UGFnZVBvaW50Q2FsbHMgKz0gMTtcbiAgICBzZXRQYWdlUG9pbnRBcmdzLnB1c2gocG9pbnQpO1xuICB9O1xuXG4gIGxldCBzZXREYXRhQ2FsbHMgPSAwO1xuICBsZXQgc2V0RGF0YUFyZ3MgPSBbXTtcbiAgY29uc3QgbW9ja1NldERhdGEgPSAoZGF0YSkgPT4ge1xuICAgIHNldERhdGFDYWxscyArPSAxO1xuICAgIHNldERhdGFBcmdzLnB1c2goZGF0YSk7XG4gIH07XG5cbiAgbGV0IG9uUGFnZUNoYW5nZUNhbGxzID0gMDtcbiAgbGV0IG9uUGFnZUNoYW5nZUFyZ3MgPSBbXTtcbiAgY29uc3QgbW9ja09uUGFnZUNoYW5nZSA9IChwYWdlSWQpID0+IHtcbiAgICBvblBhZ2VDaGFuZ2VDYWxscyArPSAxO1xuICAgIG9uUGFnZUNoYW5nZUFyZ3MucHVzaChwYWdlSWQpO1xuICB9O1xuXG4gIGxldCBhZGRFcnJvcnNBcmdzID0gW107XG4gIGNvbnN0IG1vY2tBZGRFcnJvcnMgPSAoZXJyb3JzKSA9PiB7XG4gICAgYWRkRXJyb3JzQXJncy5wdXNoKGVycm9ycyk7XG4gIH07XG5cbiAgbGV0IHNldFN1Ym1pdHRlZEFyZ3MgPSBbXTtcbiAgY29uc3QgbW9ja1NldFN1Ym1pdHRlZCA9IChuZXdTdWJtaXR0ZWQpID0+IHtcbiAgICBzZXRTdWJtaXR0ZWRBcmdzLnB1c2gobmV3U3VibWl0dGVkKTtcbiAgfTtcblxuICBsZXQgbW9ja1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgY29uc3QgbW9ja1NldFN1Ym1pdHRpbmcgPSAoc3VibWl0dGluZykgPT4ge1xuICAgIG1vY2tTdWJtaXR0aW5nID0gc3VibWl0dGluZztcbiAgfTtcbiAgXG4gIGNvbnN0IENPTVBPTkVOVFMgPSBbXG4gICAgeyBpZDogJ2FscGhhJywgZmllbGRJZDogJ2FscGhhJyB9LFxuICAgIHsgaWQ6ICdicmF2bycsIGZpZWxkSWQ6ICdicmF2bycgfSxcbiAgICB7IGlkOiAnY2hhcmxpZScsIGZpZWxkSWQ6ICdjaGFybGllJyB9LFxuICAgIHsgaWQ6ICdkZWx0YScsIGZpZWxkSWQ6ICdkZWx0YScgfVxuICBdO1xuXG4gIGNvbnN0IFBBR0VTID0gW1xuICAgIHsgXG4gICAgICBpZDogJ3BhZ2UxJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgeyAuLi5DT01QT05FTlRTWzBdIH0sXG4gICAgICAgIHsgLi4uQ09NUE9ORU5UU1sxXSB9XG4gICAgICBdIFxuICAgIH0sXG4gICAgeyBcbiAgICAgIGlkOiAncGFnZTInLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7IC4uLkNPTVBPTkVOVFNbMl0gfSxcbiAgICAgICAgeyAuLi5DT01QT05FTlRTWzNdIH1cbiAgICAgIF0gXG4gICAgfVxuICBdO1xuXG4gIGNvbnN0IENVUlJFTlRfVEFTSyA9IHtcbiAgICBuYW1lOiAndGVzdFRhc2snLFxuICAgIGZ1bGxQYWdlczogUEFHRVMsXG4gIH07XG5cbiAgY29uc3QgQVJHUyA9IHtcbiAgICBhY3Rpb246IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSB9LFxuICAgIHBhdGNoOiBudWxsLCBcbiAgICBwYXRjaExhYmVsOiB7fSxcbiAgICBob29rczogTU9DS19IT09LUywgXG4gICAgZGF0YToge30sXG4gICAgZm9ybVN0YXRlOiB7XG4gICAgICBwYWdlOiB7XG4gICAgICAgIGZvcm1EYXRhOiB7fVxuICAgICAgfVxuICAgIH0sXG4gICAgdmFsaWRhdGU6IE1PQ0tfVkFMSURBVEUsIFxuICAgIG9uUGFnZUNoYW5nZTogbW9ja09uUGFnZUNoYW5nZSwgXG4gICAgdHlwZTogRm9ybVR5cGVzLkZPUk1fV0lUSF9UQVNLLCBcbiAgICBjbGVhbnNlSGlkZGVuRGF0YTogdHJ1ZSxcbiAgICBwYWdlczogUEFHRVMsIFxuICAgIGNvbXBvbmVudHM6IENPTVBPTkVOVFMsIFxuICAgIHBhZ2VJZDogJ2FscGhhJywgXG4gICAgc2V0UGFnZVBvaW50OiBtb2NrU2V0UGFnZVBvaW50LFxuICAgIGN1cnJlbnRUYXNrOiBDVVJSRU5UX1RBU0ssIFxuICAgIHNldERhdGE6IG1vY2tTZXREYXRhLCBcbiAgICBodWJEZXRhaWxzOiB7fSxcbiAgICBzZXRTdWJtaXR0ZWQ6IG1vY2tTZXRTdWJtaXR0ZWQsXG4gICAgYWRkRXJyb3JzOiBtb2NrQWRkRXJyb3JzLFxuICAgIHN1Ym1pdHRpbmc6IG1vY2tTdWJtaXR0aW5nLFxuICAgIHNldFN1Ym1pdHRpbmc6IG1vY2tTZXRTdWJtaXR0aW5nXG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgaGFuZGxlcnMucmVzZXQoKTtcbiAgICBoZWxwZXJzLnJlc2V0KCk7XG4gICAgVXRpbHMucmVzZXQoKTtcbiAgICBNT0NLX0hPT0tTLnJlc2V0KCk7XG4gICAgTU9DS19WQUxJREFURS5yZXNldCgpO1xuICAgIHNldFBhZ2VQb2ludENhbGxzID0gMDtcbiAgICBzZXRQYWdlUG9pbnRBcmdzID0gW107XG4gICAgc2V0RGF0YUNhbGxzID0gMDtcbiAgICBzZXREYXRhQXJncyA9IFtdO1xuICAgIG9uUGFnZUNoYW5nZUNhbGxzID0gMDtcbiAgICBvblBhZ2VDaGFuZ2VBcmdzID0gW107XG4gICAgYWRkRXJyb3JzQXJncyA9IFtdO1xuICAgIHNldFN1Ym1pdHRlZEFyZ3MgPSBbXTtcbiAgICBtb2NrU2V0U3VibWl0dGluZyhmYWxzZSk7XG4gIH0pO1xuXG4gIGNvbnN0IHByZUFjdGlvbkNoZWNrcyA9ICgpID0+IHtcbiAgICBleHBlY3QoaGVscGVycy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KE1PQ0tfVkFMSURBVEUucGFnZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChoZWxwZXJzLmNsZWFuSGlkZGVuTmVzdGVkRGF0YUNhbGxzKS50b0VxdWFsKDEpO1xuICB9O1xuXG4gIGNvbnN0IHBvc3RBY3Rpb25DaGVja3MgPSAoYXJnc1VzZWQpID0+IHtcbiAgICBleHBlY3QoVXRpbHMuRm9ybWF0LmZvcm1DYWxscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoaGVscGVycy5nZXRTdWJtaXNzaW9uU3RhdHVzQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgLy8gc2V0RGF0YSBpcyBhbHdheXMgY2FsbGVkIG9uY2UgaW4gdGhlIGVycm9yIGNhbGxiYWNrIFxuICAgIC8vIGZvciB0aGUgb25TdWJtaXQgaG9vay4gSXQncyBjYWxsZWQgYW4gZXh0cmEgdGltZSBwcmlvclxuICAgIC8vIHRvIHRoaXMgaWYgcGF0Y2ggaXMgdmFsaWQuXG4gICAgaWYgKGFyZ3NVc2VkLnBhdGNoKSB7XG4gICAgICBleHBlY3Qoc2V0RGF0YUNhbGxzKS50b0VxdWFsKDIpO1xuICAgICAgY29uc3QgZGF0YVVzZWQgPSB7IFxuICAgICAgICAuLi5hcmdzVXNlZC5kYXRhLCBcbiAgICAgICAgLi4uYXJnc1VzZWQucGF0Y2gsIFxuICAgICAgICAuLi5hcmdzVXNlZC5mb3JtU3RhdGUucGFnZS5mb3JtRGF0YVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN1Ym1pc3Npb25EYXRhID0gVXRpbHMuRm9ybWF0LmZvcm0obnVsbCwgZGF0YVVzZWQsIG51bGwpXG4gICAgICBzdWJtaXNzaW9uRGF0YS5mb3JtU3RhdHVzID0gaGVscGVycy5nZXRTdWJtaXNzaW9uU3RhdHVzKCk7XG4gICAgICBleHBlY3Qoc2V0RGF0YUFyZ3NbMF0pLnRvRXF1YWwoc3VibWlzc2lvbkRhdGEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4cGVjdChzZXREYXRhQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfVxuICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uU3VibWl0Q2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgaWYgKGFyZ3NVc2VkLnR5cGUgPT09IEZvcm1UeXBlcy5IVUIgJiYgT2JqZWN0LmtleXMoYXJnc1VzZWQucGF0Y2hMYWJlbCkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhhcmdzVXNlZC5wYXRjaExhYmVsKVswXTtcbiAgICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uU3VibWl0QXJnc1swXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGNoYW5nZWRGaWVsZE5hbWU6IGZpcnN0S2V5LFxuICAgICAgICBjaGFuZ2VkRmllbGRWYWx1ZTogYXJnc1VzZWQucGF0Y2hMYWJlbFtmaXJzdEtleV1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBleHBlY3QoTU9DS19IT09LUy5vbkFjdGlvbkNhbGxzKS50b0VxdWFsKDEpO1xuXG4gICAgLy8gQm90aCB0aGUgc3VjY2VzcyBhbmQgZXJyb3IgcGF0aHMgb2YgdGhlIG9uU3VibWl0IGhvb2sgYXJlIHRlc3RlZFxuICAgIC8vIHRvZ2V0aGVyIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmdW5jdGlvbiBjaGFpbnMgYXJlIGNhbGxlZCBmb3JcbiAgICAvLyBlYWNoLlxuXG4gICAgLy8gVGhlIHN1Y2Nlc3MgcGF0aCBpcyB0ZXN0ZWQgcGVyLWFjdGlvbiBhcyBpdCBjYW4gZGlmZmVyIHNsaWdodGx5LlxuXG4gICAgLy8gVGVzdGluZyB0aGUgZXJyb3IgcGF0aC5cbiAgICBleHBlY3QoaGFuZGxlcnMuc3VibWlzc2lvbkVycm9yQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KHNldERhdGFBcmdzW3NldERhdGFDYWxscyAtIDFdKS50b0VxdWFsKGFyZ3NVc2VkLmRhdGEpOyAvLyBEYXRhIGlzIHJlc2V0IGluIHRoZSBjYXNlIG9mIGFuIGVycm9yLlxuICB9O1xuXG4gIGl0KGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuQ0FOQ0VMfSBQYWdlIEFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgIGNvbnN0IEFDVElPTiA9IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DQU5DRUwgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uQ2FuY2VsQXJncy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KE1PQ0tfSE9PS1Mub25DYW5jZWxBcmdzWzBdKS50b01hdGNoT2JqZWN0KHt9KTtcbiAgICAvLyBTaG91bGRuJ3QgZ2V0IHRvIHRoZSBwb2ludCBvZiB2YWxpZGF0aW9uIGlmXG4gICAgLy8gYWN0aW9uIGlzIGEgY2FuY2VsIGFjdGlvbi5cbiAgICBleHBlY3QoaGVscGVycy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KE1PQ0tfVkFMSURBVEUucGFnZUNhbGxzKS50b0VxdWFsKDApO1xuICB9KTtcblxuICBpdChgc2hvdWxkIGhhbmRsZSB0aGUgJHtQYWdlQWN0aW9uLlRZUEVTLk5BVklHQVRFfSBQYWdlIEFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgIGNvbnN0IEFDVElPTiA9IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSB9O1xuICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiB9O1xuICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoTU9DS19IT09LUy5vblN1Ym1pdENhbGxzKS50b0VxdWFsKDApO1xuICAgIC8vIE5vdCBkb2luZyB0aGUgdXN1YWwgcG9zdC1hY3Rpb24gY2hlY2tzIGhlcmVcbiAgICAvLyBhcyBhIG5hdmlnYXRlIGFjdGlvbiBzaG91bGQgc3RvcCBhdCBjYWxsaW5nXG4gICAgLy8gaG9va3MubmF2aWdhdGUuXG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuU1VCTUlUfSBQYWdlIEFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgIGNvbnN0IEFDVElPTiA9IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5TVUJNSVQgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgZXhwZWN0KHNldFBhZ2VQb2ludENhbGxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChzZXRQYWdlUG9pbnRBcmdzWzBdKS50b0VxdWFsKCdzdWJtaXQnKTtcbiAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgfSk7XG5cbiAgaXQoYHNob3VsZCBoYW5kbGUgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9OQVZJR0FURX0gUGFnZSBBY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICBjb25zdCBBQ1RJT04gPSB7IHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuU0FWRV9BTkRfTkFWSUdBVEUgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgLy8gQWxsIHRoZSBhY3Rpb25zIGRvZXMgaW4gdGhpcyBjYXNlIGlzIHNldCBhIGZ1bmN0aW9uXG4gICAgLy8gdG8gYmUgY2FsbGVkIGluIHRoZSBvblN1Y2Nlc3MgY2FsbGJhY2sgZm9yIHRoZSBvblN1Ym1pdCBob29rLlxuICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9BRER9IFBhZ2UgQWN0aW9uIHR5cGVgLCAoKSA9PiB7XG4gICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgIHBhZ2U6e1xuICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFtdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fQURELFxuICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgIH07XG4gICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtgJHtBQ1RJT04uY29sbGVjdGlvbn1BY3RpdmVJZGBdKS50b0JlRGVmaW5lZCgpO1xuICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgLy8gVGhpcyBhY3Rpb24gdHlwZSBhbHNvIHNldHMgdXAgYSBjYWxsIHRvIGhhbmRsZXJzLm5hdmlnYXRlXG4gICAgLy8gdGhhdCdzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvblN1Ym1pdCBob29rJ3Mgb25TdWNjZXNzIGNhbGxiYWNrLlxuICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdChgc2hvdWxkIGhhbmRsZSB0aGUgJHtQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fQUREfSBQYWdlIEFjdGlvbiB0eXBlIHdoZXJlIGFjdGl2ZSBJRCBpcyBub3QgdGhlIGxhc3QgZW50cnkgaW4gY29sbGVjdGlvbmAsICgpID0+IHtcbiAgICAvLyBJZiB0aGUgYWN0aXZlIElEIGlzIG5vdCB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgY29sbGVjdGlvblxuICAgIC8vIHRoZW4gYSBuZXcgZW50cnkgaXMgbm90IGFkZGVkXG4gICAgLy8gYW5kIHRoZSBhY3RpdmUgSUQgbW92ZXMgdG8gdGhlIG5leHQgZW50cnkgSUQuXG4gICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgIHBhZ2U6e1xuICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFt7aWQ6ICcxJ30sIHtpZDogJzInfV0sIHRlc3RDb2xsZWN0aW9uQWN0aXZlSWQ6ICcxJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBBQ1RJT04gPSB7IFxuICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0FERCxcbiAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbidcbiAgICB9O1xuICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcblxuICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGFbYCR7QUNUSU9OLmNvbGxlY3Rpb259QWN0aXZlSWRgXSkudG9FcXVhbCgnMicpO1xuICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGFbQUNUSU9OLmNvbGxlY3Rpb25dLmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcblxuICAgIC8vIFRoaXMgYWN0aW9uIHR5cGUgYWxzbyBzZXRzIHVwIGEgY2FsbCB0byBoYW5kbGVycy5uYXZpZ2F0ZVxuICAgIC8vIHRoYXQncyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgb25TdWJtaXQgaG9vaydzIG9uU3VjY2VzcyBjYWxsYmFjay5cbiAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoYHNob3VsZCBoYW5kbGUgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0FERH0gUGFnZSBBY3Rpb24gdHlwZSB3aGVyZSBhY3RpdmUgSUQgaXMgdGhlIGxhc3QgZW50cnkgaW4gY29sbGVjdGlvbmAsICgpID0+IHtcbiAgICAvLyBJZiB0aGUgYWN0aXZlIElEIGlzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBjb2xsZWN0aW9uXG4gICAgLy8gdGhlbiBhIG5ldyBlbnRyeSBpcyBhZGRlZCAoYWx0aG91Z2ggbm90IHBpY2tlZCB1cCBpbiB0aGlzIHRlc3QpXG4gICAgLy8gYW5kIHRoZSBhY3RpdmUgSUQgYmVjb21lcyBudWxsLlxuICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICBwYWdlOntcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAndGVzdENvbGxlY3Rpb24nOiBbe2lkOiAnMSd9LCB7aWQ6ICcyJ31dLCB0ZXN0Q29sbGVjdGlvbkFjdGl2ZUlkOiAnMidcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgQUNUSU9OID0geyBcbiAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9BREQsXG4gICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nXG4gICAgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04sIGZvcm1TdGF0ZTogRk9STV9TVEFURSB9O1xuICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhW2Ake0FDVElPTi5jb2xsZWN0aW9ufUFjdGl2ZUlkYF0pLnRvRXF1YWwobnVsbCk7XG4gICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtBQ1RJT04uY29sbGVjdGlvbl0ubGVuZ3RoKS50b0VxdWFsKDIpO1xuICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgLy8gVGhpcyBhY3Rpb24gdHlwZSBhbHNvIHNldHMgdXAgYSBjYWxsIHRvIGhhbmRsZXJzLm5hdmlnYXRlXG4gICAgLy8gdGhhdCdzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvblN1Ym1pdCBob29rJ3Mgb25TdWNjZXNzIGNhbGxiYWNrLlxuICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdChgc2hvdWxkIGNsZWFuIHByZXZpb3VzIGNvbGxlY3Rpb24gZW50cnkgZmllbGRzIGF0IHRvcCBsZXZlbCBvZiBmb3JtRGF0YWAsICgpID0+IHtcbiAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgcGFnZToge1xuICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFt7ICdmbGlnaHROdW1iZXInOiAnMScgfV0sXG4gICAgICAgICAgJ2ZsaWdodE51bWJlcic6ICcxJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBBQ1RJT04gPSB7XG4gICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fQURELFxuICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgIH07XG4gICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtgJHtBQ1RJT04uY29sbGVjdGlvbn1BY3RpdmVJZGBdKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEuZmxpZ2h0TnVtYmVyKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG5cbiAgICAvLyBUaGlzIGFjdGlvbiB0eXBlIGFsc28gc2V0cyB1cCBhIGNhbGwgdG8gaGFuZGxlcnMubmF2aWdhdGVcbiAgICAvLyB0aGF0J3MgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIG9uU3VibWl0IGhvb2sncyBvblN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9EVVBMSUNBVEV9IFBhZ2UgQWN0aW9uIHR5cGVgLCAoKSA9PiB7XG4gICAgaXQoYGNhbGxpbmcgaGFuZGxlcnMubmF2aWdhdGUgaWYgdGhlIGR1cGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsYCwgKCkgPT4ge1xuICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgcGFnZTp7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgQUNUSU9OID0geyBcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0RVUExJQ0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICBcbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgZXhwZWN0KFV0aWxzLkNvbGxlY3Rpb25QYWdlLmR1cGxpY2F0ZUFjdGl2ZUVudHJ5Q2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgXG4gICAgICAvLyBUaGlzIGFjdGlvbiB0eXBlIGFsc28gc2V0cyB1cCBhIGNhbGwgdG8gaGFuZGxlcnMubmF2aWdhdGVcbiAgICAgIC8vIHRoYXQncyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgb25TdWJtaXQgaG9vaydzIG9uU3VjY2VzcyBjYWxsYmFjay5cbiAgICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoYGNhbGxpbmcgb25QYWdlQ2hhbmdlIGlmIHRoZSBkdXBsaWNhdGlvbiB3YXMgdW5zdWNjZXNzZnVsYCwgKCkgPT4ge1xuICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgcGFnZTp7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgQUNUSU9OID0geyBcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0RVUExJQ0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgICBVdGlscy5Db2xsZWN0aW9uUGFnZS5kdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdCA9IGZhbHNlO1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcbiAgXG4gICAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICAgIGV4cGVjdChVdGlscy5Db2xsZWN0aW9uUGFnZS5kdXBsaWNhdGVBY3RpdmVFbnRyeUNhbGxzKS50b0VxdWFsKDEpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhlIGhhbmRsZXJzLm5hdmlnYXRlIGNhbGxiYWNrIHNob3VsZG4ndCBiZSBzZXQgd2hlblxuICAgICAgLy8gZHVwbGljYXRpb24gZmFpbHMuXG4gICAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgwKTtcbiAgICAgIC8vIEluc3RlYWQgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBkZWZhdWx0IG9uUGFnZUNoYW5nZSBzZXR1cC5cbiAgICAgIGV4cGVjdChvblBhZ2VDaGFuZ2VDYWxscykudG9FcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoYHNob3VsZCBoYW5kbGUgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX1JFTU9WRX0gUGFnZSBBY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICBpdChgc2hvdWxkIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGl0ZW0gaWYgYWN0aW9uLnJlY29yZFJlbW92YWwgaXMgdHJ1ZWAsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6e1xuICAgICAgICAgIGZvcm1EYXRhOiB7XG4gICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbkFjdGl2ZUlkOiAncmVtb3ZlTWUnLFxuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAncmVtb3ZlTWUnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ2xlYXZlTWVBbG9uZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9SRU1PVkUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbicsXG4gICAgICAgIHJlY29yZFJlbW92YWw6IHRydWVcbiAgICAgIH07XG4gICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04sIGZvcm1TdGF0ZTogRk9STV9TVEFURSB9O1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcbiAgXG4gICAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb24pLnRvRXF1YWwoWyB7IGlkOiAnbGVhdmVNZUFsb25lJyB9IF0pO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS50ZXN0Q29sbGVjdGlvbkxhc3RSZW1vdmVkKS50b0VxdWFsKHtpZDogJ3JlbW92ZU1lJyB9KTtcbiAgICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuICBcbiAgICAgIC8vIFRoaXMgYWN0aW9uIHR5cGUgdXNlcyBoYW5kbGVycyBuYXZpZ2F0ZSBjYWxsYmFjayBcbiAgICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoYHNob3VsZCBub3Qgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgaXRlbSBpZiBhY3Rpb24ucmVjb3JkUmVtb3ZhbCBpcyBmYWxzZWAsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6e1xuICAgICAgICAgIGZvcm1EYXRhOiB7XG4gICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbkFjdGl2ZUlkOiAncmVtb3ZlTWUnLFxuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAncmVtb3ZlTWUnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ2xlYXZlTWVBbG9uZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9SRU1PVkUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbicsXG4gICAgICAgIHJlY29yZFJlbW92YWw6IGZhbHNlXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG4gIFxuICAgICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uKS50b0VxdWFsKFsgeyBpZDogJ2xlYXZlTWVBbG9uZScgfV0pO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS50ZXN0Q29sbGVjdGlvbkxhc3RSZW1vdmVkKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgXG4gICAgICAvLyBUaGlzIGFjdGlvbiB0eXBlIHVzZXMgaGFuZGxlcnMgbmF2aWdhdGUgY2FsbGJhY2sgXG4gICAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KGBzaG91bGQgbm90IHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGl0ZW0gaWYgYWN0aW9uLnJlY29yZFJlbW92YWwgaXMgbm90IGRlZmluZWRgLCAoKSA9PiB7XG4gICAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgICBwYWdlOntcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb25BY3RpdmVJZDogJ3JlbW92ZU1lJyxcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlbW92ZU1lJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdsZWF2ZU1lQWxvbmUnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBBQ1RJT04gPSB7IFxuICAgICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fUkVNT1ZFLFxuICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICBcbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS50ZXN0Q29sbGVjdGlvbikudG9FcXVhbChbIHsgaWQ6ICdsZWF2ZU1lQWxvbmUnIH1dKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb25MYXN0UmVtb3ZlZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhpcyBhY3Rpb24gdHlwZSB1c2VzIGhhbmRsZXJzIG5hdmlnYXRlIGNhbGxiYWNrIFxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdChgc2hvdWxkIGNsZWFuIGNvbGxlY3Rpb24gZmllbGRzIGF0IHRvcCBsZXZlbCBvZiBmb3JtRGF0YSB3aGVuIGVudHJpZXMgcmVtYWluYCwgKCkgPT4ge1xuICAgICAgLy8gQWZ0ZXIgcmVtb3ZpbmcgdGhlIGFjdGl2ZSBlbnRyeSwgdGhlIGNvbGxlY3Rpb24gZGF0YSBpcyBhc3NpZ25lZCB0byB0aGVcbiAgICAgIC8vIHRvcCBsZXZlbCBvZiBmb3JtRGF0YSBhbmQgdGhlIGFjdGl2ZUlkIGlzIHJlc2V0LlxuICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgcGFnZTp7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uQWN0aXZlSWQ6ICdyZW1vdmVNZScsXG4gICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdsZWF2ZU1lQWxvbmUnLCBmbGlnaHROdW1iZXI6ICcxJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdyZW1vdmVNZScsIGZsaWdodE51bWJlcjogJzInXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBmbGlnaHROdW1iZXI6ICcyJyxcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uTGFzdFJlbW92ZWQ6ICdwcmV2aW91c09uZSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBBQ1RJT04gPSB7IFxuICAgICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fUkVNT1ZFLFxuICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgICByZWNvcmRSZW1vdmFsOiB0cnVlXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG4gIFxuICAgICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uKS50b0VxdWFsKFsgeyBpZDogJ2xlYXZlTWVBbG9uZScsIGZsaWdodE51bWJlcjogJzEnIH0gXSk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uTGFzdFJlbW92ZWQpLnRvRXF1YWwoe2lkOiAncmVtb3ZlTWUnLCBmbGlnaHROdW1iZXI6ICcyJyB9KTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEuZmxpZ2h0TnVtYmVyKS50b0VxdWFsKCcxJyk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uQWN0aXZlSWQpLnRvRXF1YWwoJ2xlYXZlTWVBbG9uZScpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhpcyBhY3Rpb24gdHlwZSB1c2VzIGhhbmRsZXJzIG5hdmlnYXRlIGNhbGxiYWNrIFxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIFxuICAgIGl0KGBzaG91bGQgY2xlYW4gY29sbGVjdGlvbiBmaWVsZHMgYXQgdG9wIGxldmVsIG9mIGZvcm1EYXRhIGFmdGVyIGxhc3QgZW50cnkgcmVtb3ZlZGAsICgpID0+IHtcbiAgICAgIC8vIEFmdGVyIHJlbW92aW5nIHRoZSBsYXN0IGFjdGl2ZSBlbnRyeSwgdGhlIGNvbGxlY3Rpb24gYXJyYXkgYW5kIGFjdGl2ZUlEIGFyZSBkZWxldGVkLCBcbiAgICAgIC8vIGFuZCB0aGUgY29sbGVjdGlvbiBkYXRhIGlzIHJlbW92ZWQgZnJvbSB0b3AgbGV2ZWwgb2YgZm9ybURhdGEuXG4gICAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgICBwYWdlOntcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb25BY3RpdmVJZDogJ3JlbW92ZU1lJyxcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlbW92ZU1lJywgZmxpZ2h0TnVtYmVyOiAnMSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGZsaWdodE51bWJlcjogJzEnLFxuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb25MYXN0UmVtb3ZlZDogJ3ByZXZpb3VzT25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9SRU1PVkUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbicsXG4gICAgICAgIHJlY29yZFJlbW92YWw6IHRydWVcbiAgICAgIH07XG4gICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04sIGZvcm1TdGF0ZTogRk9STV9TVEFURSB9O1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcbiAgXG4gICAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb24pLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb25MYXN0UmVtb3ZlZCkudG9FcXVhbCh7aWQ6ICdyZW1vdmVNZScsIGZsaWdodE51bWJlcjogJzEnIH0pO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS5mbGlnaHROdW1iZXIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb25BY3RpdmVJZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhpcyBhY3Rpb24gdHlwZSB1c2VzIGhhbmRsZXJzIG5hdmlnYXRlIGNhbGxiYWNrIFxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIFxufSk7XG5cbiAgZGVzY3JpYmUoJ2lmIHZhbGlkYXRpb24gZmFpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgVkFMSURfQUNUSU9OUyA9IE9iamVjdC52YWx1ZXMoUGFnZUFjdGlvbi5UWVBFUykuZmlsdGVyKGEgPT4gYSAhPT0gUGFnZUFjdGlvbi5UWVBFUy5DQU5DRUwpO1xuICAgIFZBTElEX0FDVElPTlMuZm9yRWFjaCgoYWN0aW9uVHlwZSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBub3QgY29udGludWUgZm9yIHRoZSAke2FjdGlvblR5cGV9IGFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBBQ1RJT04gPSB7IHR5cGU6IGFjdGlvblR5cGUgfTtcbiAgICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OIH07XG4gICAgICAgIGhlbHBlcnMuY2FuQWN0aW9uUHJvY2VlZFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICAgICAgICBleHBlY3QoaGVscGVycy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgICAgIGV4cGVjdChNT0NLX1ZBTElEQVRFLnBhZ2VDYWxscykudG9FcXVhbCgxKTtcbiAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlscyBzbyB3ZSBleHBlY3QgdG8gbmV2ZXIgcmVhY2hcbiAgICAgICAgLy8gdGhlIHBvaW50IG9mIHN1Ym1pc3Npb24uXG4gICAgICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uU3VibWl0Q2FsbHMpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIFxuICBkZXNjcmliZSgnYWRkaW5nIGEgZmllbGQgdG8gZm9ybURhdGEgaWYgc3BlY2lmaWVkIG9uIHRoZSBhY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgVkFMSURfQUNUSU9OUyA9IE9iamVjdC52YWx1ZXMoUGFnZUFjdGlvbi5UWVBFUykuZmlsdGVyKGEgPT4gKFxuICAgICAgYSAhPT0gUGFnZUFjdGlvbi5UWVBFUy5DQU5DRUwgJiYgYSAhPT0gUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURVxuICAgICkpO1xuICAgIFZBTElEX0FDVElPTlMuZm9yRWFjaCgoYWN0aW9uVHlwZSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCB3b3JrIGZvciB0aGUgJHthY3Rpb25UeXBlfSBhY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbjogW10sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBBQ1RJT04gPSB7XG4gICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcbiAgICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgICAgIGFkZFRvRm9ybURhdGE6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdhbHBoYScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMTIzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdwYXJlbnQuY2hpbGQnLFxuICAgICAgICAgICAgICB2YWx1ZTogW3tcbiAgICAgICAgICAgICAgICBpZDogJzEyMzQ1J1xuICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgaXNDb2xsZWN0aW9uOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgZm9ybVN0YXRlOiBGT1JNX1NUQVRFLCBhY3Rpb246IEFDVElPTiB9O1xuICAgICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgYWxwaGE6ICcxMjMnXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnBhcmVudFswXS5jaGlsZFswXS5pZCkudG9FcXVhbCgnMTIzNDUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGl0KGBzaG91bGQgd29yayBmb3IgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9OQVZJR0FURX0gYWN0aW9uIHR5cGUgdG8gcmVzZXQgdGhlIGFjdGl2ZSBJRGAsICgpID0+IHtcbiAgICAgIC8vIEluIHRoaXMgdGVzdCB0aGUgYWN0aW9uIGluY2x1ZGVzIHRoZSByZXNldEFjdGl2ZUlkIGZpZWxkXG4gICAgICAvLyByZXF1aXJpbmcgdGhhdCB0aGUgYWN0aXZlIElEIGlzIHBvaW50ZWQgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBjb2xsZWN0aW9uXG4gICAgICAvLyBzbyB0aGF0IHVzZXIgY2FuIGN5Y2xlIHRocm91Z2ggdGhlIGZ1bGwgY29sbGVjdGlvbiBhZ2Fpbi5cbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFt7IGlkOiAnMScgfSwgeyBpZDogJzInIH0sIHsgaWQ6ICczJyB9XSwgdGVzdENvbGxlY3Rpb25BY3RpdmVJZDogJzMnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgQUNUSU9OID0ge1xuICAgICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLlNBVkVfQU5EX05BVklHQVRFLFxuICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgICByZXNldEFjdGl2ZUlkOiB0cnVlXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGZvcm1TdGF0ZTogRk9STV9TVEFURSwgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgLy8gQWxsIHRoZSBhY3Rpb25zIGRvZXMgaW4gdGhpcyBjYXNlIGlzIHNldCBhIGZ1bmN0aW9uXG4gICAgICAvLyB0byBiZSBjYWxsZWQgaW4gdGhlIG9uU3VjY2VzcyBjYWxsYmFjayBmb3IgdGhlIG9uU3VibWl0IGhvb2suXG4gICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcblxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG5cbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGFbYCR7QUNUSU9OLmNvbGxlY3Rpb259QWN0aXZlSWRgXSkudG9FcXVhbCgnMScpO1xuXG4gICAgfSk7XG5cbiAgICBpdChgc2hvdWxkIHdvcmsgZm9yIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuU0FWRV9BTkRfTkFWSUdBVEV9IGFjdGlvbiB0eXBlIHRvIHNldCBhZGRBbm90aGVyIHRvIHllc2AsICgpID0+IHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIGlzIG1pZHdheSB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uXG4gICAgICAvLyB0aGVuIHRoZSBhZGRBbm90aGVyIGZpZWxkIGlzIHNldCB0byB5ZXMgXG4gICAgICAvLyB0byBhbGxvdyB0aGUgbmF2aWdhdGlvbiB0byBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgIHRlc3RzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnMycgfV0sIHRlc3RzQWN0aXZlSWQ6ICcyJywgYWRkQW5vdGhlclRlc3Q6ICdObydcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBBQ1RJT04gPSB7XG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuU0FWRV9BTkRfTkFWSUdBVEUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0cydcbiAgICAgIH07XG4gICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgZm9ybVN0YXRlOiBGT1JNX1NUQVRFLCBhY3Rpb246IEFDVElPTiB9O1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcblxuICAgICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgICAvLyBBbGwgdGhlIGFjdGlvbnMgZG9lcyBpbiB0aGlzIGNhc2UgaXMgc2V0IGEgZnVuY3Rpb25cbiAgICAgIC8vIHRvIGJlIGNhbGxlZCBpbiB0aGUgb25TdWNjZXNzIGNhbGxiYWNrIGZvciB0aGUgb25TdWJtaXQgaG9vay5cbiAgICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcblxuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtgJHtBQ1RJT04uY29sbGVjdGlvbn1BY3RpdmVJZGBdKS50b0VxdWFsKCcyJyk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhW0FDVElPTi5jb2xsZWN0aW9uXS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLmFkZEFub3RoZXJUZXN0KS50b0VxdWFsKCdZZXMnKTtcblxuICAgIH0pO1xuXG4gICAgaXQoYHNob3VsZCB3b3JrIGZvciB0aGUgJHtQYWdlQWN0aW9uLlRZUEVTLk5BVklHQVRFfSBhY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHtcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJyxcbiAgICAgICAgYWRkVG9Gb3JtRGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnYWxwaGEnLFxuICAgICAgICAgICAgdmFsdWU6ICcxMjMnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ3BhcmVudC5jaGlsZCcsXG4gICAgICAgICAgICB2YWx1ZTogW3tcbiAgICAgICAgICAgICAgaWQ6ICcxMjM0NSdcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgaXNDb2xsZWN0aW9uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGZvcm1TdGF0ZTogRk9STV9TVEFURSwgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgLy8gTm90IGRvaW5nIHRoZSB1c3VhbCBwb3N0LWFjdGlvbiBjaGVja3MgaGVyZVxuICAgICAgLy8gYXMgYSBuYXZpZ2F0ZSBhY3Rpb24gc2hvdWxkIHN0b3AgYXQgY2FsbGluZ1xuICAgICAgLy8gaG9va3MubmF2aWdhdGUuXG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWxwaGE6ICcxMjMnXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEucGFyZW50WzBdLmNoaWxkWzBdLmlkKS50b0VxdWFsKCcxMjM0NScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIGZvciBhbiBhcnJheSBvZiBmb3JtRGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHtcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJyxcbiAgICAgICAgYWRkVG9Gb3JtRGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnYWxwaGEnLFxuICAgICAgICAgICAgdmFsdWU6ICcxMjMnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ2JldGEuZ2FtbWEnLFxuICAgICAgICAgICAgdmFsdWU6ICc0NTYnXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGZvcm1TdGF0ZTogRk9STV9TVEFURSwgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgLy8gTm90IGRvaW5nIHRoZSB1c3VhbCBwb3N0LWFjdGlvbiBjaGVja3MgaGVyZVxuICAgICAgLy8gYXMgYSBuYXZpZ2F0ZSBhY3Rpb24gc2hvdWxkIHN0b3AgYXQgY2FsbGluZ1xuICAgICAgLy8gaG9va3MubmF2aWdhdGUuXG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWxwaGE6ICcxMjMnLFxuICAgICAgICBiZXRhOiB7IGdhbW1hOiAnNDU2JyB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlY29yZGluZyBwYXRjaExhYmVsIGZpZWxkcyBjb3JyZWN0bHkgd2hlbiBpdCBpcyBkZWZpbmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IFZBTElEX0FDVElPTlMgPSBPYmplY3QudmFsdWVzKFBhZ2VBY3Rpb24uVFlQRVMpLmZpbHRlcihhID0+IChcbiAgICAgIGEgIT09IFBhZ2VBY3Rpb24uVFlQRVMuQ0FOQ0VMICYmIGEgIT09IFBhZ2VBY3Rpb24uVFlQRVMuTkFWSUdBVEVcbiAgICApKTtcbiAgICBWQUxJRF9BQ1RJT05TLmZvckVhY2goKGFjdGlvblR5cGUpID0+IHtcbiAgICAgIGl0KGBzaG91bGQgd29yayBmb3IgdGhlICR7YWN0aW9uVHlwZX0gYWN0aW9uIHR5cGVgLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgICAgcGFnZTp7XG4gICAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbjogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IEtFWSA9ICd0ZXN0RmllbGQnO1xuICAgICAgICBjb25zdCBWQUxVRSA9ICd0ZXN0VmFsdWUnO1xuICAgICAgICBjb25zdCBQQVRDSF9MQUJFTCA9IHtcbiAgICAgICAgICBbS0VZXTogVkFMVUVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgUEFUQ0ggPSB7XG4gICAgICAgICAgW0tFWV06IFZBTFVFXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcbiAgICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyBcbiAgICAgICAgICAuLi5BUkdTLCBcbiAgICAgICAgICBhY3Rpb246IEFDVElPTixcbiAgICAgICAgICBmb3JtU3RhdGU6IEZPUk1fU1RBVEUsIFxuICAgICAgICAgIHBhdGNoOiBQQVRDSCxcbiAgICAgICAgICBwYXRjaExhYmVsOiBQQVRDSF9MQUJFTCwgXG4gICAgICAgICAgdHlwZTogRm9ybVR5cGVzLkhVQiB9O1xuICAgICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTsgLy8gU3BlY2lmaWMgY2hlY2sgZm9yIHBhdGNoTGFiZWwgZG9uZSBpbiBoZXJlLlxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFBeUMsU0FBQUUsdUJBQUFJLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxRQUFBSCxDQUFBLEVBQUFJLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQVAsQ0FBQSxPQUFBTSxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBUixDQUFBLEdBQUFJLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFYLENBQUEsRUFBQUksQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FB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
|