@hmcts/ccd-case-ui-toolkit 7.0.2 → 7.0.3-case-flags-v2-1-release
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/esm2020/lib/shared/components/case-editor/case-edit/case-edit.component.mjs +3 -3
- package/esm2020/lib/shared/components/case-editor/case-edit-confirm/case-edit-confirm.component.mjs +2 -2
- package/esm2020/lib/shared/components/case-editor/case-edit-generic-errors/case-edit-generic-errors.component.mjs +2 -2
- package/esm2020/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.mjs +2 -11
- package/esm2020/lib/shared/components/case-editor/case-edit-submit/case-edit-submit-titles.enum.mjs +7 -0
- package/esm2020/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.mjs +164 -124
- package/esm2020/lib/shared/components/case-editor/case-editor.module.mjs +17 -22
- package/esm2020/lib/shared/components/case-editor/case-event-completion/case-event-completion.component.mjs +2 -3
- package/esm2020/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-cancelled/case-event-completion-task-cancelled.component.mjs +2 -2
- package/esm2020/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.mjs +2 -2
- package/esm2020/lib/shared/components/case-editor/services/case-flag-state.service.mjs +19 -0
- package/esm2020/lib/shared/components/case-editor/services/cases.service.mjs +6 -1
- package/esm2020/lib/shared/components/case-editor/services/wizard-page-field-to-case-field.mapper.mjs +4 -3
- package/esm2020/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.mjs +4 -17
- package/esm2020/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.mjs +40 -15
- package/esm2020/lib/shared/components/case-viewer/case-viewer.module.mjs +8 -5
- package/esm2020/lib/shared/components/palette/base-field/field-read.component.mjs +1 -1
- package/esm2020/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.mjs +70 -31
- package/esm2020/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.mjs +249 -46
- package/esm2020/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.mjs +140 -71
- package/esm2020/lib/shared/components/palette/case-flag/components/confirm-flag-status/confirm-flag-status.component.mjs +165 -0
- package/esm2020/lib/shared/components/palette/case-flag/components/index.mjs +4 -1
- package/esm2020/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.mjs +73 -78
- package/esm2020/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter-control-names.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.mjs +133 -99
- package/esm2020/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.mjs +22 -9
- package/esm2020/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.mjs +211 -107
- package/esm2020/lib/shared/components/palette/case-flag/components/update-flag/update-flag-add-translation-form/update-flag-add-translation-form.component.mjs +267 -0
- package/esm2020/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.mjs +439 -104
- package/esm2020/lib/shared/components/palette/case-flag/domain/case-flag-state.model.mjs +1 -1
- package/esm2020/lib/shared/components/palette/case-flag/domain/case-flag.model.mjs +1 -1
- package/esm2020/lib/shared/components/palette/case-flag/domain/language.model.mjs +1 -1
- package/esm2020/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.mjs +2 -1
- package/esm2020/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.mjs +3 -1
- package/esm2020/lib/shared/components/palette/case-flag/enums/case-flag-check-your-answers-step.enum.mjs +12 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/case-flag-display-context-parameter.enum.mjs +15 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/case-flag-form-fields.enum.mjs +13 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.mjs +3 -2
- package/esm2020/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.mjs +11 -3
- package/esm2020/lib/shared/components/palette/case-flag/enums/confirm-status-error-message.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/confirm-status-step.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/index.mjs +9 -2
- package/esm2020/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.mjs +3 -2
- package/esm2020/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.mjs +4 -1
- package/esm2020/lib/shared/components/palette/case-flag/enums/update-flag-add-translation-error-message.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/update-flag-add-translation-step.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.mjs +5 -1
- package/esm2020/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.mjs +7 -2
- package/esm2020/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.mjs +10 -7
- package/esm2020/lib/shared/components/palette/case-flag/index.mjs +2 -1
- package/esm2020/lib/shared/components/palette/case-flag/pipes/flag-field-display.pipe.mjs +41 -0
- package/esm2020/lib/shared/components/palette/case-flag/pipes/index.mjs +5 -0
- package/esm2020/lib/shared/components/palette/case-flag/pipes/language-interpreter-display.pipe.mjs +41 -0
- package/esm2020/lib/shared/components/palette/case-flag/pipes/manage-case-flags-label-display.pipe.mjs +109 -0
- package/esm2020/lib/shared/components/palette/case-flag/pipes/update-flag-title-display.pipe.mjs +77 -0
- package/esm2020/lib/shared/components/palette/case-flag/read-case-flag-field.component.mjs +156 -57
- package/esm2020/lib/shared/components/palette/case-flag/write-case-flag-field.component.mjs +385 -172
- package/esm2020/lib/shared/components/palette/case-link/write-case-link-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/collection/write-collection-field.component.mjs +29 -33
- package/esm2020/lib/shared/components/palette/complex/read-complex-field.component.mjs +12 -14
- package/esm2020/lib/shared/components/palette/complex/sort-order.mjs +7 -0
- package/esm2020/lib/shared/components/palette/date/write-date-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/datetime-picker/datetime-picker.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/dynamic-list/write-dynamic-list-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/dynamic-radio-list/write-dynamic-radio-list-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/email/write-email-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/fixed-list/write-fixed-list-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/fixed-radio-list/write-fixed-radio-list-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/index.mjs +3 -1
- package/esm2020/lib/shared/components/palette/markdown/index.mjs +2 -1
- package/esm2020/lib/shared/components/palette/markdown/markdown-component.module.mjs +40 -0
- package/esm2020/lib/shared/components/palette/markdown/markdown.component.mjs +4 -4
- package/esm2020/lib/shared/components/palette/money-gbp/write-money-gbp-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/multi-select-list/write-multi-select-list-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/number/write-number-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/palette.module.mjs +148 -49
- package/esm2020/lib/shared/components/palette/palette.service.mjs +4 -2
- package/esm2020/lib/shared/components/palette/phone-uk/write-phone-uk-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/query-management/__mocks__/index.mjs +210 -0
- package/esm2020/lib/shared/components/palette/query-management/components/index.mjs +13 -0
- package/esm2020/lib/shared/components/palette/query-management/components/qualifying-questions/qualifying-question-detail/qualifying-question-detail.component.mjs +42 -0
- package/esm2020/lib/shared/components/palette/query-management/components/qualifying-questions/qualifying-question-options/qualifying-question-options.component.mjs +144 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-attachments-read/query-attachments-read.component.mjs +64 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-case-details-header/query-case-details-header.component.mjs +60 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-check-your-answers/query-check-your-answers.component.mjs +281 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-details/query-details.component.mjs +327 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-event-completion/query-event-completion.component.mjs +22 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-list/query-list.component.mjs +164 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-write/query-write-add-documents/query-write-add-documents.component.mjs +74 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-write/query-write-date-input/query-write-date-input.component.mjs +107 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.mjs +201 -0
- package/esm2020/lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.mjs +101 -0
- package/esm2020/lib/shared/components/palette/query-management/enums/index.mjs +6 -0
- package/esm2020/lib/shared/components/palette/query-management/enums/qualifying-questions-error-message.enum.mjs +5 -0
- package/esm2020/lib/shared/components/palette/query-management/enums/query-item-response-status.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/query-management/enums/raise-query-error-message.enum.mjs +10 -0
- package/esm2020/lib/shared/components/palette/query-management/enums/respond-to-query-error-messages.enum.mjs +6 -0
- package/esm2020/lib/shared/components/palette/query-management/index.mjs +7 -0
- package/esm2020/lib/shared/components/palette/query-management/models/case-queries-collection.model.mjs +2 -0
- package/esm2020/lib/shared/components/palette/query-management/models/index.mjs +8 -0
- package/esm2020/lib/shared/components/palette/query-management/models/qualifying-questions/casetype-qualifying-questions.model.mjs +2 -0
- package/esm2020/lib/shared/components/palette/query-management/models/qualifying-questions/qualifying-question.model.mjs +2 -0
- package/esm2020/lib/shared/components/palette/query-management/models/query-create-context.enum.mjs +9 -0
- package/esm2020/lib/shared/components/palette/query-management/models/query-list/query-list-column/query-list-column.model.mjs +2 -0
- package/esm2020/lib/shared/components/palette/query-management/models/query-list/query-list-data/query-list-data.model.mjs +21 -0
- package/esm2020/lib/shared/components/palette/query-management/models/query-list/query-list-item/query-list-item.model.mjs +38 -0
- package/esm2020/lib/shared/components/palette/query-management/read-query-management-field.component.mjs +121 -0
- package/esm2020/lib/shared/components/palette/query-management/utils/query-management.utils.mjs +22 -0
- package/esm2020/lib/shared/components/palette/text/write-text-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/text-area/write-text-area-field.component.mjs +5 -6
- package/esm2020/lib/shared/components/palette/utils/first-error.pipe.mjs +16 -9
- package/esm2020/lib/shared/components/palette/yes-no/read-yes-no-field.component.mjs +10 -5
- package/esm2020/lib/shared/components/palette/yes-no/write-yes-no-field.component.mjs +9 -9
- package/esm2020/lib/shared/domain/case-flag/flag-type.model.mjs +16 -2
- package/esm2020/lib/shared/domain/case-view/case-view-event-ids.enum.mjs +6 -0
- package/esm2020/lib/shared/domain/case-view/case-view-trigger.model.mjs +1 -2
- package/esm2020/lib/shared/domain/definition/display-context-enum.model.mjs +3 -1
- package/esm2020/lib/shared/fixture/shared.test.fixture.mjs +2 -1
- package/esm2020/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.mjs +4 -2
- package/esm2020/lib/shared/pipes/complex/fields-filter.pipe.mjs +4 -2
- package/esm2020/lib/shared/pipes/generic/enum-display-description/enum-display-description.pipe.mjs +16 -0
- package/esm2020/lib/shared/pipes/generic/index.mjs +2 -0
- package/esm2020/lib/shared/pipes/index.mjs +3 -2
- package/esm2020/lib/shared/pipes/pipes.module.mjs +9 -5
- package/esm2020/lib/shared/services/case-flag/case-flag-refdata.service.mjs +9 -3
- package/esm2020/lib/shared/services/fields/fields.utils.mjs +27 -4
- package/esm2020/lib/shared/services/form/form-value.service.mjs +15 -12
- package/esm2020/lib/shared/services/jurisdiction/jurisdiction.service.mjs +2 -1
- package/esm2020/lib/shared/services/request/request.options.builder.mjs +7 -1
- package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +8644 -4125
- package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
- package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +9989 -5888
- package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
- package/lib/shared/components/case-editor/case-edit/case-edit.component.d.ts.map +1 -1
- package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
- package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit-titles.enum.d.ts +6 -0
- package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit-titles.enum.d.ts.map +1 -0
- package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts +1 -1
- package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts.map +1 -1
- package/lib/shared/components/case-editor/case-editor.module.d.ts +17 -20
- package/lib/shared/components/case-editor/case-editor.module.d.ts.map +1 -1
- package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-cancelled/case-event-completion-task-cancelled.component.d.ts.map +1 -1
- package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts.map +1 -1
- package/lib/shared/components/case-editor/services/case-flag-state.service.d.ts +11 -0
- package/lib/shared/components/case-editor/services/case-flag-state.service.d.ts.map +1 -0
- package/lib/shared/components/case-editor/services/cases.service.d.ts +1 -0
- package/lib/shared/components/case-editor/services/cases.service.d.ts.map +1 -1
- package/lib/shared/components/case-editor/services/wizard-page-field-to-case-field.mapper.d.ts.map +1 -1
- package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts.map +1 -1
- package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts +6 -2
- package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts.map +1 -1
- package/lib/shared/components/case-viewer/case-viewer.module.d.ts +4 -4
- package/lib/shared/components/case-viewer/case-viewer.module.d.ts.map +1 -1
- package/lib/shared/components/palette/base-field/field-read.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts +6 -2
- package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.d.ts +25 -8
- package/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.d.ts +2 -1
- package/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/confirm-flag-status/confirm-flag-status.component.d.ts +28 -0
- package/lib/shared/components/palette/case-flag/components/confirm-flag-status/confirm-flag-status.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/index.d.ts +3 -0
- package/lib/shared/components/palette/case-flag/components/index.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts +4 -8
- package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter-control-names.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter-control-names.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts +10 -8
- package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts +2 -1
- package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts +16 -9
- package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/components/update-flag/update-flag-add-translation-form/update-flag-add-translation-form.component.d.ts +27 -0
- package/lib/shared/components/palette/case-flag/components/update-flag/update-flag-add-translation-form/update-flag-add-translation-form.component.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts +26 -11
- package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/domain/case-flag-state.model.d.ts +1 -10
- package/lib/shared/components/palette/case-flag/domain/case-flag-state.model.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts +12 -1
- package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/domain/language.model.d.ts +1 -0
- package/lib/shared/components/palette/case-flag/domain/language.model.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.d.ts +1 -0
- package/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.d.ts +3 -1
- package/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/case-flag-check-your-answers-step.enum.d.ts +11 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-check-your-answers-step.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-display-context-parameter.enum.d.ts +14 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-display-context-parameter.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-form-fields.enum.d.ts +12 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-form-fields.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.d.ts +2 -1
- package/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.d.ts +11 -3
- package/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/confirm-status-error-message.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/confirm-status-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/confirm-status-step.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/confirm-status-step.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/index.d.ts +8 -1
- package/lib/shared/components/palette/case-flag/enums/index.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.d.ts +2 -1
- package/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.d.ts +3 -0
- package/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/update-flag-add-translation-error-message.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-add-translation-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-add-translation-step.enum.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-add-translation-step.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.d.ts +5 -1
- package/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.d.ts +7 -2
- package/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.d.ts +7 -4
- package/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/index.d.ts +1 -0
- package/lib/shared/components/palette/case-flag/index.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/pipes/flag-field-display.pipe.d.ts +19 -0
- package/lib/shared/components/palette/case-flag/pipes/flag-field-display.pipe.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/pipes/index.d.ts +5 -0
- package/lib/shared/components/palette/case-flag/pipes/index.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/pipes/language-interpreter-display.pipe.d.ts +18 -0
- package/lib/shared/components/palette/case-flag/pipes/language-interpreter-display.pipe.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/pipes/manage-case-flags-label-display.pipe.d.ts +25 -0
- package/lib/shared/components/palette/case-flag/pipes/manage-case-flags-label-display.pipe.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/pipes/update-flag-title-display.pipe.d.ts +21 -0
- package/lib/shared/components/palette/case-flag/pipes/update-flag-title-display.pipe.d.ts.map +1 -0
- package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts +12 -8
- package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts.map +1 -1
- package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts +52 -27
- package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts.map +1 -1
- package/lib/shared/components/palette/collection/write-collection-field.component.d.ts +3 -2
- package/lib/shared/components/palette/collection/write-collection-field.component.d.ts.map +1 -1
- package/lib/shared/components/palette/complex/read-complex-field.component.d.ts.map +1 -1
- package/lib/shared/components/palette/complex/sort-order.d.ts +6 -0
- package/lib/shared/components/palette/complex/sort-order.d.ts.map +1 -0
- package/lib/shared/components/palette/index.d.ts +2 -0
- package/lib/shared/components/palette/index.d.ts.map +1 -1
- package/lib/shared/components/palette/markdown/index.d.ts +1 -0
- package/lib/shared/components/palette/markdown/index.d.ts.map +1 -1
- package/lib/shared/components/palette/markdown/markdown-component.module.d.ts +13 -0
- package/lib/shared/components/palette/markdown/markdown-component.module.d.ts.map +1 -0
- package/lib/shared/components/palette/palette.module.d.ts +140 -118
- package/lib/shared/components/palette/palette.module.d.ts.map +1 -1
- package/lib/shared/components/palette/palette.service.d.ts.map +1 -1
- package/lib/shared/components/palette/query-management/__mocks__/index.d.ts +11 -0
- package/lib/shared/components/palette/query-management/__mocks__/index.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/index.d.ts +13 -0
- package/lib/shared/components/palette/query-management/components/index.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/qualifying-questions/qualifying-question-detail/qualifying-question-detail.component.d.ts +8 -0
- package/lib/shared/components/palette/query-management/components/qualifying-questions/qualifying-question-detail/qualifying-question-detail.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/qualifying-questions/qualifying-question-options/qualifying-question-options.component.d.ts +22 -0
- package/lib/shared/components/palette/query-management/components/qualifying-questions/qualifying-question-options/qualifying-question-options.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-attachments-read/query-attachments-read.component.d.ts +11 -0
- package/lib/shared/components/palette/query-management/components/query-attachments-read/query-attachments-read.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-case-details-header/query-case-details-header.component.d.ts +10 -0
- package/lib/shared/components/palette/query-management/components/query-case-details-header/query-case-details-header.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-check-your-answers/query-check-your-answers.component.d.ts +30 -0
- package/lib/shared/components/palette/query-management/components/query-check-your-answers/query-check-your-answers.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-details/query-details.component.d.ts +16 -0
- package/lib/shared/components/palette/query-management/components/query-details/query-details.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-event-completion/query-event-completion.component.d.ts +9 -0
- package/lib/shared/components/palette/query-management/components/query-event-completion/query-event-completion.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-list/query-list.component.d.ts +18 -0
- package/lib/shared/components/palette/query-management/components/query-list/query-list.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-add-documents/query-write-add-documents.component.d.ts +20 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-add-documents/query-write-add-documents.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-date-input/query-write-date-input.component.d.ts +20 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-date-input/query-write-date-input.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.d.ts +11 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.d.ts +21 -0
- package/lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/enums/index.d.ts +6 -0
- package/lib/shared/components/palette/query-management/enums/index.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/enums/qualifying-questions-error-message.enum.d.ts +4 -0
- package/lib/shared/components/palette/query-management/enums/qualifying-questions-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/enums/query-item-response-status.enum.d.ts +5 -0
- package/lib/shared/components/palette/query-management/enums/query-item-response-status.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/enums/raise-query-error-message.enum.d.ts +9 -0
- package/lib/shared/components/palette/query-management/enums/raise-query-error-message.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/enums/respond-to-query-error-messages.enum.d.ts +5 -0
- package/lib/shared/components/palette/query-management/enums/respond-to-query-error-messages.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/index.d.ts +7 -0
- package/lib/shared/components/palette/query-management/index.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/case-queries-collection.model.d.ts +27 -0
- package/lib/shared/components/palette/query-management/models/case-queries-collection.model.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/index.d.ts +8 -0
- package/lib/shared/components/palette/query-management/models/index.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/qualifying-questions/casetype-qualifying-questions.model.d.ts +5 -0
- package/lib/shared/components/palette/query-management/models/qualifying-questions/casetype-qualifying-questions.model.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/qualifying-questions/qualifying-question.model.d.ts +6 -0
- package/lib/shared/components/palette/query-management/models/qualifying-questions/qualifying-question.model.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/query-create-context.enum.d.ts +8 -0
- package/lib/shared/components/palette/query-management/models/query-create-context.enum.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/query-list/query-list-column/query-list-column.model.d.ts +7 -0
- package/lib/shared/components/palette/query-management/models/query-list/query-list-column/query-list-column.model.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/query-list/query-list-data/query-list-data.model.d.ts +10 -0
- package/lib/shared/components/palette/query-management/models/query-list/query-list-data/query-list-data.model.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/models/query-list/query-list-item/query-list-item.model.d.ts +22 -0
- package/lib/shared/components/palette/query-management/models/query-list/query-list-item/query-list-item.model.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/read-query-management-field.component.d.ts +18 -0
- package/lib/shared/components/palette/query-management/read-query-management-field.component.d.ts.map +1 -0
- package/lib/shared/components/palette/query-management/utils/query-management.utils.d.ts +12 -0
- package/lib/shared/components/palette/query-management/utils/query-management.utils.d.ts.map +1 -0
- package/lib/shared/components/palette/utils/first-error.pipe.d.ts +8 -5
- package/lib/shared/components/palette/utils/first-error.pipe.d.ts.map +1 -1
- package/lib/shared/components/palette/yes-no/read-yes-no-field.component.d.ts.map +1 -1
- package/lib/shared/domain/case-flag/flag-type.model.d.ts +6 -1
- package/lib/shared/domain/case-flag/flag-type.model.d.ts.map +1 -1
- package/lib/shared/domain/case-view/case-view-event-ids.enum.d.ts +5 -0
- package/lib/shared/domain/case-view/case-view-event-ids.enum.d.ts.map +1 -0
- package/lib/shared/domain/case-view/case-view-trigger.model.d.ts +0 -1
- package/lib/shared/domain/case-view/case-view-trigger.model.d.ts.map +1 -1
- package/lib/shared/domain/definition/display-context-enum.model.d.ts +3 -1
- package/lib/shared/domain/definition/display-context-enum.model.d.ts.map +1 -1
- package/lib/shared/fixture/shared.test.fixture.d.ts.map +1 -1
- package/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.d.ts.map +1 -1
- package/lib/shared/pipes/complex/fields-filter.pipe.d.ts.map +1 -1
- package/lib/shared/pipes/generic/enum-display-description/enum-display-description.pipe.d.ts +8 -0
- package/lib/shared/pipes/generic/enum-display-description/enum-display-description.pipe.d.ts.map +1 -0
- package/lib/shared/pipes/generic/index.d.ts +2 -0
- package/lib/shared/pipes/generic/index.d.ts.map +1 -0
- package/lib/shared/pipes/index.d.ts +2 -1
- package/lib/shared/pipes/index.d.ts.map +1 -1
- package/lib/shared/pipes/pipes.module.d.ts +3 -2
- package/lib/shared/pipes/pipes.module.d.ts.map +1 -1
- package/lib/shared/services/case-flag/case-flag-refdata.service.d.ts +3 -2
- package/lib/shared/services/case-flag/case-flag-refdata.service.d.ts.map +1 -1
- package/lib/shared/services/fields/fields.utils.d.ts +2 -0
- package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
- package/lib/shared/services/form/form-value.service.d.ts.map +1 -1
- package/lib/shared/services/jurisdiction/jurisdiction.service.d.ts.map +1 -1
- package/lib/shared/services/request/request.options.builder.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,13 +2,18 @@ import { CurrencyPipe } from '@angular/common';
|
|
|
2
2
|
import { Injectable } from '@angular/core';
|
|
3
3
|
import { FormArray, FormControl, FormGroup } from '@angular/forms';
|
|
4
4
|
import { plainToClassFromExist } from 'class-transformer';
|
|
5
|
-
import { CaseFlagStatus } from '../../components/palette/case-flag/enums
|
|
5
|
+
import { CaseFlagDisplayContextParameter, CaseFlagStatus } from '../../components/palette/case-flag/enums';
|
|
6
6
|
import { DatePipe } from '../../components/palette/utils';
|
|
7
7
|
import { CaseField } from '../../domain';
|
|
8
8
|
import { FormatTranslatorService } from '../case-fields/format-translator.service';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
// @dynamic
|
|
11
11
|
export class FieldsUtils {
|
|
12
|
+
static isValidDisplayContext(ctx) {
|
|
13
|
+
return (ctx === 'MANDATORY' || ctx === 'READONLY'
|
|
14
|
+
|| ctx === 'OPTIONAL' || ctx === 'HIDDEN'
|
|
15
|
+
|| ctx === 'COMPLEX');
|
|
16
|
+
}
|
|
12
17
|
static convertToCaseField(obj) {
|
|
13
18
|
if (!(obj instanceof CaseField)) {
|
|
14
19
|
return plainToClassFromExist(new CaseField(), obj);
|
|
@@ -364,7 +369,7 @@ export class FieldsUtils {
|
|
|
364
369
|
roleOnCase: value ? value['roleOnCase'] : null,
|
|
365
370
|
details: value && value['details'] && value['details'].length > 0
|
|
366
371
|
? value['details'].map(detail => {
|
|
367
|
-
return Object.assign({}, ...Object.keys(detail.value).map(k => {
|
|
372
|
+
return Object.assign({}, ...Object.keys(detail.value).map((k) => {
|
|
368
373
|
// The id property set below will be null for a new case flag, and a unique id returned from CCD when
|
|
369
374
|
// updating an existing flag
|
|
370
375
|
switch (k) {
|
|
@@ -380,7 +385,9 @@ export class FieldsUtils {
|
|
|
380
385
|
}
|
|
381
386
|
}));
|
|
382
387
|
})
|
|
383
|
-
: null
|
|
388
|
+
: null,
|
|
389
|
+
visibility: value ? value['visibility'] : null,
|
|
390
|
+
groupId: value ? value['groupId'] : null
|
|
384
391
|
},
|
|
385
392
|
pathToFlagsFormGroup,
|
|
386
393
|
caseField
|
|
@@ -453,6 +460,22 @@ export class FieldsUtils {
|
|
|
453
460
|
}
|
|
454
461
|
return activeCount;
|
|
455
462
|
}
|
|
463
|
+
static getValidationErrorMessageForFlagLauncherCaseField(caseField) {
|
|
464
|
+
switch (caseField.display_context_parameter) {
|
|
465
|
+
case CaseFlagDisplayContextParameter.CREATE:
|
|
466
|
+
case CaseFlagDisplayContextParameter.CREATE_2_POINT_1:
|
|
467
|
+
return 'Please select Next to complete the creation of the case flag';
|
|
468
|
+
case CaseFlagDisplayContextParameter.CREATE_EXTERNAL:
|
|
469
|
+
return 'Please select Next to complete the creation of the support request';
|
|
470
|
+
case CaseFlagDisplayContextParameter.UPDATE:
|
|
471
|
+
case CaseFlagDisplayContextParameter.UPDATE_2_POINT_1:
|
|
472
|
+
return 'Please select Next to complete the update of the selected case flag';
|
|
473
|
+
case CaseFlagDisplayContextParameter.UPDATE_EXTERNAL:
|
|
474
|
+
return 'Please select Next to complete the update of the selected support request';
|
|
475
|
+
default:
|
|
476
|
+
return '';
|
|
477
|
+
}
|
|
478
|
+
}
|
|
456
479
|
buildCanShowPredicate(eventTrigger, form) {
|
|
457
480
|
const currentState = this.getCurrentEventState(eventTrigger, form);
|
|
458
481
|
return (page) => {
|
|
@@ -589,4 +612,4 @@ FieldsUtils.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: FieldsUtils,
|
|
|
589
612
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldsUtils, [{
|
|
590
613
|
type: Injectable
|
|
591
614
|
}], null, null); })();
|
|
592
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBV2YsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDdkMsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLE9BQU8scUJBQXFCLENBQUMsSUFBSSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBdUI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FB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LFFBQVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUU7d0JBQ25ELEtBQUssVUFBVSxDQUFDLENBQUM7NEJBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDakQsTUFBTTt5QkFDUDt3QkFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDOzRCQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzdDLE1BQU07eUJBQ1A7d0JBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQzs0QkFDZCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFO2dDQUN6RCxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFZLEVBQUUsRUFBRTtvQ0FDN0UsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3Q0FDaEYsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUNBQ2pEO2dDQUNILENBQUMsQ0FBQyxDQUFDOzZCQUNKOzRCQUNELE1BQU07eUJBQ1A7cUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUNELE1BQU07U0FDUDtLQUNGO0FBQ0gsQ0FBQyxDQUFDO3NFQW5PUyxXQUFXO2lFQUFYLFdBQVcsV0FBWCxXQUFXO3VGQUFYLFdBQVc7Y0FEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHBsYWluVG9DbGFzc0Zyb21FeGlzdCB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbic7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9iYXNlLWZpZWxkL2Fic3RyYWN0LWZvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEZsYWdEZXRhaWwsIEZsYWdzV2l0aEZvcm1Hcm91cFBhdGggfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL2RvbWFpbi9jYXNlLWZsYWcubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZsYWdTdGF0dXMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL2VudW1zL2Nhc2UtZmxhZy1zdGF0dXMuZW51bSc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS91dGlscyc7XG5pbXBvcnQgeyBDYXNlRXZlbnRUcmlnZ2VyLCBDYXNlRmllbGQsIENhc2VUYWIsIENhc2VWaWV3LCBGaWVsZFR5cGUsIEZpZWxkVHlwZUVudW0sIEZpeGVkTGlzdEl0ZW0sIFByZWRpY2F0ZSB9IGZyb20gJy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGb3JtYXRUcmFuc2xhdG9yU2VydmljZSB9IGZyb20gJy4uL2Nhc2UtZmllbGRzL2Zvcm1hdC10cmFuc2xhdG9yLnNlcnZpY2UnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkc1V0aWxzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2FzZUxldmVsQ2FzZUZsYWdzRmllbGRJZCA9ICdjYXNlRmxhZ3MnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSA9IG5ldyBDdXJyZW5jeVBpcGUoJ2VuLUdCJyk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGRhdGVQaXBlOiBEYXRlUGlwZSA9IG5ldyBEYXRlUGlwZShuZXcgRm9ybWF0VHJhbnNsYXRvclNlcnZpY2UoKSk7XG4gIC8vIEVVSS00MjQ0LiAzIGRhc2hlcyBpbnN0ZWFkIG9mIDEgdG8gbWFrZSB0aGlzIGxlc3MgbGlrZWx5IHRvIGNsYXNoIHdpdGggYSByZWFsIGZpZWxkLlxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExBQkVMX1NVRkZJWCA9ICctLS1MQUJFTCc7XG4gIC8vIEhhbmRsaW5nIG9mIER5bmFtaWMgTGlzdHMgaW4gQ29tcGxleCBUeXBlc1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTExFQ1RJT04gPSAnQ29sbGVjdGlvbic7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09NUExFWCA9ICdDb21wbGV4JztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9EWU5BTUlDX0xJU1RfVFlQRTogRmllbGRUeXBlRW51bVtdID0gWydEeW5hbWljTGlzdCcsICdEeW5hbWljUmFkaW9MaXN0J107XG5cbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VG9DYXNlRmllbGQob2JqOiBhbnkpOiBDYXNlRmllbGQge1xuICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENhc2VGaWVsZCkpIHtcbiAgICAgIHJldHVybiBwbGFpblRvQ2xhc3NGcm9tRXhpc3QobmV3IENhc2VGaWVsZCgpLCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1ZhbHVlc01hcChjYXNlRmllbGRzOiBDYXNlRmllbGRbXSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWVNYXAgPSB7fTtcbiAgICBjYXNlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgdmFsdWVNYXBbZmllbGQuaWRdID0gRmllbGRzVXRpbHMucHJlcGFyZVZhbHVlKGZpZWxkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVNYXA7XG4gIH1cblxuICAvLyBwdWJsaWMgc3RhdGljIGdldFR5cGUoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgLy8gICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW0pLnNsaWNlKDgsIC0xKTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbGVtID09PSAnb2JqZWN0JyAmJiBlbGVtICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc05vbkVtcHR5T2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0KGVsZW0pICYmIE9iamVjdC5rZXlzKGVsZW0pLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheShlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlbGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXJlQ29sbGVjdGlvblZhbHVlc1NpbXBsZUZpZWxkcyhmaWVsZFZhbHVlOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc09iamVjdChmaWVsZFZhbHVlWzBdWyd2YWx1ZSddKSAmJiAhQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlWzBdWyd2YWx1ZSddKSAmJiBmaWVsZFZhbHVlWzBdWyd2YWx1ZSddICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbk9mU2ltcGxlVHlwZXMoZmllbGRWYWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb2xsZWN0aW9uKGZpZWxkVmFsdWUpICYmIHRoaXMuYXJlQ29sbGVjdGlvblZhbHVlc1NpbXBsZUZpZWxkcyhmaWVsZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNNdWx0aVNlbGVjdFZhbHVlKGZvcm06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTm9uRW1wdHlBcnJheShmb3JtKSAmJiAhdGhpcy5pc0NvbGxlY3Rpb25XaXRoVmFsdWUoZm9ybSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTm9uRW1wdHlBcnJheShwYWdlRm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFnZUZvcm1GaWVsZHMpICYmIHBhZ2VGb3JtRmllbGRzWzBdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbihwYWdlRm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNOb25FbXB0eUFycmF5KHBhZ2VGb3JtRmllbGRzKSAmJiB0aGlzLmlzQ29sbGVjdGlvbldpdGhWYWx1ZShwYWdlRm9ybUZpZWxkcyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQ29sbGVjdGlvbldpdGhWYWx1ZShwYWdlRm9ybUZpZWxkczogYW55W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGFnZUZvcm1GaWVsZHNbMF1bJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2xvbmVPYmplY3Qob2JqOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuICB9XG5cbiAgLy8gdGVtcG9yYXJ5IGZ1bmN0aW9uIHVudGlsIHRoaXMgY2FuIGJlIG1vdmVkIHRvIENhc2VWaWV3IGNsYXNzIChSRE0tMjY4MSlcbiAgcHVibGljIHN0YXRpYyBnZXRDYXNlRmllbGRzKGNhc2VWaWV3OiBDYXNlVmlldyk6IENhc2VGaWVsZFtdIHtcbiAgICBjb25zdCBjYXNlRGF0YUZpZWxkczogQ2FzZUZpZWxkW10gPSBjYXNlVmlldy50YWJzLnJlZHVjZSgoYWNjOiBDYXNlRmllbGRbXSwgdGFiOiBDYXNlVGFiKSA9PiB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdCh0YWIuZmllbGRzKTtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YUZpZWxkczogQ2FzZUZpZWxkW10gPSBjYXNlVmlldy5tZXRhZGF0YUZpZWxkcztcbiAgICByZXR1cm4gbWV0YWRhdGFGaWVsZHMuY29uY2F0KGNhc2VEYXRhRmllbGRzLmZpbHRlcigoY2FzZUZpZWxkOiBDYXNlRmllbGQpID0+IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YUZpZWxkcy5maW5kSW5kZXgobWV0YWRhdGFGaWVsZCA9PiBtZXRhZGF0YUZpZWxkLmlkID09PSBjYXNlRmllbGQuaWQpIDwgMDtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFkZENhc2VGaWVsZEFuZENvbXBvbmVudFJlZmVyZW5jZXMoYzogQWJzdHJhY3RDb250cm9sLCBjZjogQ2FzZUZpZWxkLCBjb21wOiBBYnN0cmFjdEZvcm1GaWVsZENvbXBvbmVudCk6IHZvaWQge1xuICAgIGNbJ2Nhc2VGaWVsZCddID0gY2Y7XG4gICAgY1snY29tcG9uZW50J10gPSBjb21wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBjaGVjayBvZiBhbiBhcnJheSBvciBvYmplY3QgYW5kIGl0cyBkZXNjZW5kYW50cyBmb3IgdGhlIHByZXNlbmNlIG9mIGFueSBub24tZW1wdHkgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBhcnJheSBvciBvYmplY3QgdG8gY2hlY2tcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheSBvciBvYmplY3QgKG9yIGEgZGVzY2VuZGFudCkgY29udGFpbnMgYXQgbGVhc3Qgb25lIG5vbi1lbXB0eSB2YWx1ZTsgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29udGFpbnNOb25FbXB0eVZhbHVlcyhvYmplY3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGtleSA9PiBvYmplY3Rba2V5XSk7XG4gICAgY29uc3Qgb2JqZWN0UmVmcyA9IFtdO1xuICAgIC8vIEFsc28gdGVzdCBmb3IgbnVtZXJpYyB2YWx1ZXMsIGFuZCBsZW5ndGggPiAwIGZvciBub24tbnVtZXJpYyB2YWx1ZXMgYmVjYXVzZSB0aGlzIGNvdmVycyBib3RoIHN0cmluZ3MgYW5kIGFycmF5cy5cbiAgICAvLyBOb3RlOiBEZWxpYmVyYXRlIHVzZSBvZiBub24tZXF1YWxpdHkgKCE9KSBvcGVyYXRvciBmb3IgbnVsbCBjaGVjaywgdG8gaGFuZGxlIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHRyaXBsZS1lcXVhbHNcbiAgICBjb25zdCBoYXNOb25OdWxsUHJpbWl0aXZlID0gdmFsdWVzLnNvbWUoeCA9PiAoeCAhPSBudWxsICYmXG4gICAgICAoKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHx8IEFycmF5LmlzQXJyYXkoeClcbiAgICAgICAgPyAhb2JqZWN0UmVmcy5wdXNoKHgpXG4gICAgICAgIDogdHlwZW9mIHggPT09ICdudW1iZXInIHx8IHgubGVuZ3RoID4gMClcbiAgICApKTtcbiAgICByZXR1cm4gIWhhc05vbk51bGxQcmltaXRpdmUgPyBvYmplY3RSZWZzLnNvbWUoeSA9PiB0aGlzLmNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMoeSkpIDogaGFzTm9uTnVsbFByaW1pdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBoYW5kbGVOZXN0ZWREeW5hbWljTGlzdHMoKVxuICAgKiBSZWFzc2lnbnMgbGlzdF9pdGVtIGFuZCB2YWx1ZSBkYXRhIHRvIER5bmFtaWNMaXN0IGNoaWxkcmVuXG4gICAqIGRvd24gdGhlIHRyZWUuIFNlcnZlciByZXNwb25zZSByZXR1cm5zIGRhdGEgb25seSBpblxuICAgKiB0aGUgYHZhbHVlYCBvYmplY3Qgb2YgcGFyZW50IGNvbXBsZXggdHlwZVxuICAgKlxuICAgKiBFVUktMjUzMCBEeW5hbWljIExpc3RzIGZvciBFbGVtZW50cyBpbiBhIENvbXBsZXggVHlwZVxuICAgKlxuICAgKiBAcGFyYW0ganNvbkJvZHkgLSB7IGNhc2VfZmllbGRzOiBbIENhc2VGaWVsZCwgQ2FzZUZpZWxkIF0gfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBoYW5kbGVOZXN0ZWREeW5hbWljTGlzdHMoanNvbkJvZHk6IHsgY2FzZV9maWVsZHM6IENhc2VGaWVsZFtdIH0pOiBhbnkge1xuICAgIGlmIChqc29uQm9keS5jYXNlX2ZpZWxkcykge1xuICAgICAganNvbkJvZHkuY2FzZV9maWVsZHMuZm9yRWFjaChjYXNlRmllbGQgPT4ge1xuICAgICAgICBpZiAoY2FzZUZpZWxkLmZpZWxkX3R5cGUpIHtcbiAgICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQsIGNhc2VGaWVsZC5maWVsZF90eXBlLCBjYXNlRmllbGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbkJvZHk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwcmVwYXJlVmFsdWUoZmllbGQ6IENhc2VGaWVsZCk6IGFueSB7XG4gICAgaWYgKGZpZWxkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmllbGQudmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc0NvbXBsZXgoKSkge1xuICAgICAgY29uc3QgdmFsdWVNYXAgPSB7fTtcbiAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChjb21wbGV4RmllbGQgPT4ge1xuICAgICAgICB2YWx1ZU1hcFtjb21wbGV4RmllbGQuaWRdID0gRmllbGRzVXRpbHMucHJlcGFyZVZhbHVlKGNvbXBsZXhGaWVsZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZU1hcDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01FUkdFX0ZVTkNUSU9OID0gZnVuY3Rpb24gbWVyZ2VGdW5jdGlvbihmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KGZpZWxkLmlkKSkge1xuICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IGZpZWxkLnZhbHVlO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMQUJFTF9NRVJHRV9GVU5DVElPTiA9IGZ1bmN0aW9uIG1lcmdlRnVuY3Rpb24oZmllbGQ6IENhc2VGaWVsZCwgcmVzdWx0OiBvYmplY3QpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0ge307XG4gICAgfVxuICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KGZpZWxkLmlkKSkge1xuICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IGZpZWxkLnZhbHVlO1xuICAgIH1cblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogc3dpdGNoLWRlZmF1bHRcbiAgICBzd2l0Y2ggKGZpZWxkLmZpZWxkX3R5cGUudHlwZSkge1xuICAgICAgY2FzZSAnRml4ZWRMaXN0JzpcbiAgICAgIGNhc2UgJ0ZpeGVkUmFkaW9MaXN0Jzoge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkLCByZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdNdWx0aVNlbGVjdExpc3QnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSByZXN1bHRbZmllbGQuaWRdIHx8IFtdO1xuICAgICAgICByZXN1bHRbZmllbGQuaWQgKyBGaWVsZHNVdGlscy5MQUJFTF9TVUZGSVhdID0gW107XG4gICAgICAgIGZpZWxkVmFsdWUuZm9yRWFjaCgoY29kZTogYW55LCBpZHg6IGFueSkgPT4ge1xuICAgICAgICAgIHJlc3VsdFtmaWVsZC5pZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF1baWR4XSA9IEZpZWxkc1V0aWxzLmdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZCwgY29kZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0xhYmVsJzoge1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0TGFiZWwoZmllbGQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01vbmV5R0JQJzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0TW9uZXlHQlAoZmllbGRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRGF0ZSc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IChyZXN1bHRbZmllbGQuaWRdIHx8IGZpZWxkLnZhbHVlKTtcbiAgICAgICAgcmVzdWx0W2ZpZWxkLmlkXSA9IEZpZWxkc1V0aWxzLmdldERhdGUoZmllbGRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29tcGxleCc6IHtcbiAgICAgICAgaWYgKHJlc3VsdFtmaWVsZC5pZF0gJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaCgoZjogQ2FzZUZpZWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoWydDb2xsZWN0aW9uJywgJ0NvbXBsZXgnLCAnTXVsdGlTZWxlY3RMaXN0J10uaW5kZXhPZihmLmZpZWxkX3R5cGUudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTihmLCByZXN1bHRbZmllbGQuaWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzd2l0Y2gtZGVmYXVsdFxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ01vbmV5R0JQJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICAgICAgICAgIGVsZW0udmFsdWUgPSBGaWVsZHNVdGlscy5nZXREYXRlKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0NvbXBsZXgnOiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFsnQ29sbGVjdGlvbicsICdDb21wbGV4JywgJ011bHRpU2VsZWN0TGlzdCddLmluZGV4T2YoZi5maWVsZF90eXBlLnR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBGaWVsZHNVdGlscy5MQUJFTF9NRVJHRV9GVU5DVElPTihmLCBlbGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgYE1vbmV5R0JQYCB2YWx1ZSB0byBpbmNsdWRlIGN1cnJlbmN5IHVuaXRzLlxuICAgKiBAcGFyYW0gZmllbGRWYWx1ZSBUaGUgQ3VycmVuY3lQaXBlIGV4cGVjdHMgYW4gYGFueWAgcGFyYW1ldGVyIHNvIHRoaXMgbXVzdCBhbHNvIGJlIGBhbnlgLFxuICAgKiBidXQgaXQgc2hvdWxkIGJlIFwibnVtYmVyLWxpa2VcIiAoZS5nLiwgJzEyMzQnKVxuICAgKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBzdHJpbmcgKGUuZy4sIMKjMTIuMzQpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRNb25leUdCUChmaWVsZFZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWVsZFZhbHVlID8gRmllbGRzVXRpbHMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlIC8gMTAwLCAnR0JQJywgJ3N5bWJvbCcpIDogZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExhYmVsKGZpZWxkVmFsdWU6IENhc2VGaWVsZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBmaWVsZFZhbHVlLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREYXRlKGZpZWxkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZvcm1hdCBzcGVjaWZpZWQgaGVyZSB3YXNuJ3QgcHJldmlvdXNseSB3b3JraW5nIGFuZCBsb3RzIG9mIHRlc3RzIGRlcGVuZCBvbiBpdCBub3Qgd29ya2luZ1xuICAgICAgLy8gTm93IHRoYXQgZm9ybWF0cyB3b3JrIGNvcnJlY3RseSBtYW55IHRlc3Qgd291bGQgYnJlYWsgLSBhbmQgdGhpcyBjb3VsZCBhZmZlY3Qgc2VydmljZXMgd2hpY2ggbWF5IGRlcGVuZCBvblxuICAgICAgLy8gdGhlIG9yZ2luYWwgYmVoYXZpb3VyIG9mIHJldHVybmluZyBkYXRlcyBpbiBcImQgTU1NIHl5eXlcIlxuICAgICAgLy8gTm90ZSAtIHJlcGxhY2VkICdkJyB3aXRoICdEJyBhcyBkYXRlcGlwZSB1c2luZyBtb21lbnQgdG8gYXZvaWQgdGltZXpvbmUgZGlzY3JlcGFuY2llc1xuICAgICAgcmV0dXJuIEZpZWxkc1V0aWxzLmRhdGVQaXBlLnRyYW5zZm9ybShmaWVsZFZhbHVlLCBudWxsLCAnRCBNTU0geXl5eScpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHRGb3JJbnZhbGlkRmllbGQoJ0RhdGUnLCBmaWVsZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQ6IENhc2VGaWVsZCwgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWxldmFudEl0ZW06IEZpeGVkTGlzdEl0ZW0gPSBjb2RlID8gZmllbGQuZmllbGRfdHlwZS5maXhlZF9saXN0X2l0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLmNvZGUgPT09IGNvZGUpIDogbnVsbDtcbiAgICByZXR1cm4gcmVsZXZhbnRJdGVtID8gcmVsZXZhbnRJdGVtLmxhYmVsIDogJyc7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB0ZXh0Rm9ySW52YWxpZEZpZWxkKHR5cGU6IHN0cmluZywgaW52YWxpZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgeyBJbnZhbGlkICR7dHlwZX06ICR7aW52YWxpZFZhbHVlfSB9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQ6IENhc2VGaWVsZCwgY2FzZUZpZWxkVHlwZTogRmllbGRUeXBlLCByb290Q2FzZUZpZWxkOiBDYXNlRmllbGQpIHtcbiAgICBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYKSB7XG5cbiAgICAgIGNhc2VGaWVsZFR5cGUuY29tcGxleF9maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaXNEeW5hbWljRmllbGQgPSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9EWU5BTUlDX0xJU1RfVFlQRS5pbmRleE9mKGZpZWxkLmZpZWxkX3R5cGUudHlwZSkgIT09IC0xO1xuXG4gICAgICAgICAgaWYgKGlzRHluYW1pY0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljTGlzdFZhbHVlID0gdGhpcy5nZXREeW5hbWljTGlzdFZhbHVlKHJvb3RDYXNlRmllbGQudmFsdWUsIGZpZWxkLmlkKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljTGlzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxpc3RfaXRlbXMgPSBkeW5hbWljTGlzdFZhbHVlWzBdLmxpc3RfaXRlbXM7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXhWYWx1ZSA9IGR5bmFtaWNMaXN0VmFsdWUubWFwKGRhdGEgPT4gZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGxpc3RfaXRlbXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbXBsZXhWYWx1ZS5sZW5ndGggPiAwID8gY29tcGxleFZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLnZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLnZhbHVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGZpZWxkLmZvcm1hdHRlZF92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZC5mb3JtYXR0ZWRfdmFsdWUsXG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oZmllbGQsIGZpZWxkLmZpZWxkX3R5cGUsIHJvb3RDYXNlRmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FzZUZpZWxkVHlwZS50eXBlID09PSBGaWVsZHNVdGlscy5TRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT0xMRUNUSU9OKSB7XG4gICAgICBpZiAoY2FzZUZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUpIHtcbiAgICAgICAgdGhpcy5zZXREeW5hbWljTGlzdERlZmluaXRpb24oY2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RHluYW1pY0xpc3RWYWx1ZShqc29uQmxvY2s6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0ganNvbkJsb2NrID8gdGhpcy5nZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uQmxvY2ssIGtleSwgW10pIDogW107XG5cbiAgICByZXR1cm4gZGF0YS5sZW5ndGggPiAwID8gZGF0YSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXROZXN0ZWRGaWVsZFZhbHVlcyhqc29uRGF0YTogYW55LCBrZXk6IHN0cmluZywgb3V0cHV0OiBhbnlbXSA9IFtdKSB7XG4gICAgaWYgKGpzb25EYXRhICYmIGpzb25EYXRhW2tleV0pIHtcbiAgICAgIG91dHB1dC5wdXNoKGpzb25EYXRhW2tleV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRLZXkgaW4ganNvbkRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uRGF0YSA9PT0gJ29iamVjdCcgJiYganNvbkRhdGEuaGFzT3duUHJvcGVydHkoZWxlbWVudEtleSkpIHtcbiAgICAgICAgICB0aGlzLmdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25EYXRhW2VsZW1lbnRLZXldLCBrZXksIG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnc0Nhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaXNGbGFnc0ZpZWxkVHlwZShjYXNlRmllbGQuZmllbGRfdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBpc0Nhc2VGaWVsZE9mVHlwZX0gaW5zdGVhZCwgcGFzc2luZyAnRmxhZ0xhdW5jaGVyJyBhcyB0aGUgc2luZ2xlIHR5cGUgaW4gdGhlIGB0eXBlc2AgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNGbGFnTGF1bmNoZXJDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnRmxhZ0xhdW5jaGVyJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGlzQ2FzZUZpZWxkT2ZUeXBlfSBpbnN0ZWFkLCBwYXNzaW5nICdDb21wb25lbnRMYXVuY2hlcicgYXMgdGhlIHNpbmdsZSB0eXBlIGluIHRoZSBgdHlwZXNgXG4gICAqIGFycmF5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ29tcG9uZW50TGF1bmNoZXJDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoIWNhc2VGaWVsZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcG9uZW50TGF1bmNoZXInO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHtAbGluayBDYXNlRmllbGR9IGlzIG9mIG9uZSBvZiB0aGUgZ2l2ZW4gZmllbGQgdHlwZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYXNlRmllbGQgVGhlIGBDYXNlRmllbGRgIHRvIGNoZWNrXG4gICAqIEBwYXJhbSB0eXBlcyBBbiBhcnJheSBvZiBvbmUgb3IgbW9yZSBmaWVsZCB0eXBlc1xuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBDYXNlRmllbGRgIHR5cGUgaXMgb25lIG9mIHRob3NlIGluIHRoZSBhcnJheSBvZiB0eXBlcyB0byBjaGVjayBhZ2FpbnN0OyBgZmFsc2VgXG4gICAqIG90aGVyd2lzZSBvciBpZiBgY2FzZUZpZWxkYCBvciBgdHlwZXNgIGFyZSBmYWxzeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0Nhc2VGaWVsZE9mVHlwZShjYXNlRmllbGQ6IENhc2VGaWVsZCwgdHlwZXM6IEZpZWxkVHlwZUVudW1bXSk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkIHx8ICF0eXBlcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlcy5zb21lKHR5cGUgPT4gdHlwZSA9PT0gY2FzZUZpZWxkLmZpZWxkX3R5cGUudHlwZSB8fCB0eXBlID09PSBjYXNlRmllbGQuZmllbGRfdHlwZS5pZCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTGlua2VkQ2FzZXNDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRmllbGRzVXRpbHMuaXNDb21wb25lbnRMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQpICYmXG4gICAgICBjYXNlRmllbGQuaWQgPT09ICdMaW5rZWRDYXNlc0NvbXBvbmVudExhdW5jaGVyJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY29udGFpbnNMaW5rZWRDYXNlc0Nhc2VGaWVsZChjYXNlRmllbGRzOiBDYXNlRmllbGRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjYXNlRmllbGRzPy5zb21lKGNhc2VGaWVsZCA9PiBGaWVsZHNVdGlscy5pc0xpbmtlZENhc2VzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdzRmllbGRUeXBlKGZpZWxkVHlwZTogRmllbGRUeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBkdW1teSBmaWVsZCB0eXBlIElEIG9mIFwiQ2FzZUZsYWdcIiBmb3IgdGVzdGluZyBhbmQgdGhlIHJlYWwgZmllbGQgdHlwZVxuICAgIC8vIElEIG9mIFwiRmxhZ3NcIlxuICAgIHJldHVybiAoZmllbGRUeXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiAoZmllbGRUeXBlLmlkID09PSAnQ2FzZUZsYWcnIHx8IGZpZWxkVHlwZS5pZCA9PT0gJ0ZsYWdzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZmxhZ3MgZGF0YSBmcm9tIGEgYENhc2VGaWVsZGAgaW5zdGFuY2UsIHJlY3Vyc2luZyBhbmQgaXRlcmF0aW5nIHRocm91Z2ggc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggZmllbGQgb3JcbiAgICogZWFjaCBmaWVsZCBpbiBhIENvbGxlY3Rpb24gZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBmbGFncyBBbiBhcnJheSBmb3IgYWNjdW11bGF0aW5nIGV4dHJhY3RlZCBmbGFncyBkYXRhIGFuZCBkZXJpdmVkIGBGb3JtR3JvdXBgIHBhdGhzXG4gICAqIEBwYXJhbSBjYXNlRmllbGQgQSBgQ2FzZUZpZWxkYCBpbnN0YW5jZSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIGZsYWdzIGRhdGFcbiAgICogQHBhcmFtIHBhdGhUb0ZsYWdzRm9ybUdyb3VwIEEgKGRvdC1kZWxpbWl0ZWQpIHN0cmluZyBmb3IgY29uY2F0ZW5hdGluZyB0aGUgbmFtZSBvZiBlYWNoIGNvbnRyb2wgdGhhdCBmb3JtcyB0aGUgcGF0aFxuICAgKiB0byB0aGUgYEZvcm1Hcm91cGAgZm9yIHRoZSBgRmxhZ3NgIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0b3BMZXZlbENhc2VGaWVsZCBUaGUgdG9wLWxldmVsIGBDYXNlRmllbGRgIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIHByb3BlcnR5LiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgX29ubHlcbiAgICogdG9wLWxldmVsXyBgQ2FzZUZpZWxkYHMgY29udGFpbiBhY3R1YWwgdmFsdWVzIGFuZCBhIHJlZmVyZW5jZSBuZWVkcyB0byBiZSBtYWludGFpbmVkIHRvIHN1Y2ggYSBmaWVsZFxuICAgKiBAcGFyYW0gY3VycmVudFZhbHVlIFRoZSBjdXJyZW50IHZhbHVlIG9iamVjdCBvZiBhIGBDYXNlRmllbGRgIHRoYXQgaXMgYSBzdWItZmllbGQgb2YgYSBub24gcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkLlxuICAgKiBSZXF1aXJlZCBmb3IgbWFwcGluZyB0aGUgYENhc2VGaWVsZGAgdmFsdWUgdG8gYSBgRmxhZ3NgIG9iamVjdCBpZiBpdCBpcyBhIFwiRmxhZ3NcIiBgQ2FzZUZpZWxkYC4gKEZvciBDb21wbGV4IHR5cGVzLFxuICAgKiBvbmx5IHRoZSBfcm9vdC1sZXZlbF8gYENhc2VGaWVsZGAgY29udGFpbnMgYSB2YWx1ZSBwcm9wZXJ0eSAtIGFsbCBzdWItZmllbGRzLCBpbmNsdWRpbmcgYW55IG5lc3RlZCBDb21wbGV4IGZpZWxkcyxcbiAgICogZG8gKm5vdCogY29udGFpbiBhbnkgdmFsdWVzIHRoZW1zZWx2ZXMuKVxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBgRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aGAsIGVhY2ggaW5zdGFuY2UgY29tcHJpc2luZyBhIGBGbGFnc2Agb2JqZWN0IGRlcml2ZWQgZnJvbSBhIGBDYXNlRmllbGRgXG4gICAqIG9mIHR5cGUgXCJGbGFnc1wiLCBhbmQgdGhlIGRvdC1kZWxpbWl0ZWQgcGF0aCBzdHJpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYEZvcm1Hcm91cGBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdEZsYWdzRGF0YUZyb21DYXNlRmllbGQoZmxhZ3M6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGhbXSwgY2FzZUZpZWxkOiBDYXNlRmllbGQsXG4gICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXA6IHN0cmluZywgdG9wTGV2ZWxDYXNlRmllbGQ6IENhc2VGaWVsZCwgY3VycmVudFZhbHVlPzogb2JqZWN0KTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aFtdIHtcbiAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICBzd2l0Y2ggKGZpZWxkVHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgRmxhZ3MgQ2FzZUZpZWxkICh0aGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgQ29tcGxleCB0eXBlcyksIGl0IGNhbiBiZSBtYXBwZWQgdG8gYSBGbGFnc1xuICAgICAgICAvLyBvYmplY3QgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgIC8vIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhbm90aGVyIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlIChpZiBhbnkpXG4gICAgICAgICAgLy8gaW5zdGVhZC4gVGhlIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHRoZSBcImNhc2VGbGFnc1wiIEZsYWdzIENhc2VGaWVsZCwgd2hpY2ggd2lsbCBoYXZlIGFuIGVtcHR5IG9iamVjdCB2YWx1ZVxuICAgICAgICAgIC8vIGluaXRpYWxseSwgYmVjYXVzZSBubyBwYXJ0eSBuYW1lIGlzIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KGNhc2VGaWVsZC52YWx1ZSkgfHxcbiAgICAgICAgICAgIGNhc2VGaWVsZC5pZCA9PT0gdGhpcy5jYXNlTGV2ZWxDYXNlRmxhZ3NGaWVsZElkKSB7XG4gICAgICAgICAgICBmbGFncy5wdXNoKHRoaXMubWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXApKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9IGAuJHtjYXNlRmllbGQuaWR9YDtcbiAgICAgICAgICAgIGZsYWdzLnB1c2godGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChcbiAgICAgICAgICAgICAgY2FzZUZpZWxkLmlkLCBjdXJyZW50VmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCB0b3BMZXZlbENhc2VGaWVsZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgRmllbGRzVXRpbHMuaXNOb25FbXB0eU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdEZsYWdzRGF0YUZyb21DYXNlRmllbGQoXG4gICAgICAgICAgICAgICAgZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCB0b3BMZXZlbENhc2VGaWVsZCwgdmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBGb3IgYSBDb2xsZWN0aW9uIGZpZWxkLCB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgZGlyZWN0bHkgYXMga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBDYXNlRmllbGQncyB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXMgYW4gYXJyYXksIHVubGVzcyB0aGUgY29sbGVjdGlvbiBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSAtIHN1Yi1maWVsZHMgbmV2ZXIgY29udGFpbiB2YWx1ZXNcbiAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY29sbGVjdGlvbiBvZiBGbGFncyBDYXNlRmllbGRzLCB0aGVzZSBjYW4gYmUgbWFwcGVkIHRvIEZsYWdzIG9iamVjdHMgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgIC8vIGl0IGlzIGEgQ29sbGVjdGlvbiBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYSBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZVxuICAgICAgICAgIC8vIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnQgPSBwYXRoVG9GbGFnc0Zvcm1Hcm91cCArPSAnLmluZGV4LnZhbHVlJztcbiAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwID0gcGF0aEZyYWdtZW50LnJlcGxhY2UoJ2luZGV4JywgaW5kZXgudG9TdHJpbmcoMTApKTtcbiAgICAgICAgICAgICAgZmxhZ3MucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGl0ZW0uaWQsIGl0ZW0udmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCBjYXNlRmllbGQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFtdKS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaXRlbS5pZCwgaXRlbS52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFBlcmZvcm0gYSByZWR1Y3Rpb24gb3ZlciBlYWNoIENvbXBsZXggZmllbGQncyBzdWItZmllbGRzIChzaW1pbGFyIHRvIHdoYXQgaXMgZG9uZSBhYm92ZSBmb3Igbm9uLUZsYWdzXG4gICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgIC8vIChDYW5ub3QganVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gcmVjdXJzaXZlbHkgZm9yIGVhY2ggQ29tcGxleCBmaWVsZCBpbiB0aGUgY29sbGVjdGlvbiBiZWNhdXNlIHRoZSBDYXNlRmllbGRcbiAgICAgICAgICAgIC8vIGZvciBlYWNoIG9uZSBpcyBub3QgcGFydCBvZiB0aGUgY29sbGVjdGlvbilcbiAgICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudCA9IHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9ICcuaW5kZXgudmFsdWUnO1xuICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAvLyBBdCBlYWNoIGl0ZXJhdGlvbiwgcmVwbGFjZSB0aGUgXCJpbmRleFwiIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBpbmRleFxuICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgIGZsYWdzID0gZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5yZWR1Y2UoKGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdEZsYWdzRGF0YUZyb21DYXNlRmllbGQoXG4gICAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCBpdGVtLnZhbHVlW3N1YkZpZWxkLmlkXSk7XG4gICAgICAgICAgICAgIH0sIGZsYWdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGZpZWxkIHR5cGVzXG4gICAgfVxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hcENhc2VGaWVsZFRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChjYXNlRmllbGQ6IENhc2VGaWVsZCxcbiAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cDogc3RyaW5nKTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB7XG4gICAgcmV0dXJuIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoY2FzZUZpZWxkLmlkLCBjYXNlRmllbGQudmFsdWUsIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLCBjYXNlRmllbGQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaWQ6IHN0cmluZywgdmFsdWU6IG9iamVjdCxcbiAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cDogc3RyaW5nLCBjYXNlRmllbGQ6IENhc2VGaWVsZCk6IEZsYWdzV2l0aEZvcm1Hcm91cFBhdGgge1xuICAgIHJldHVybiB7XG4gICAgICBmbGFnczoge1xuICAgICAgICBmbGFnc0Nhc2VGaWVsZElkOiBpZCxcbiAgICAgICAgcGFydHlOYW1lOiB2YWx1ZSA/IHZhbHVlWydwYXJ0eU5hbWUnXSA6IG51bGwsXG4gICAgICAgIHJvbGVPbkNhc2U6IHZhbHVlID8gdmFsdWVbJ3JvbGVPbkNhc2UnXSA6IG51bGwsXG4gICAgICAgIGRldGFpbHM6IHZhbHVlICYmIHZhbHVlWydkZXRhaWxzJ10gJiYgdmFsdWVbJ2RldGFpbHMnXS5sZW5ndGggPiAwXG4gICAgICAgICAgPyAodmFsdWVbJ2RldGFpbHMnXSBhcyBhbnlbXSkubWFwKGRldGFpbCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgLi4uT2JqZWN0LmtleXMoZGV0YWlsLnZhbHVlKS5tYXAoayA9PiB7XG4gICAgICAgICAgICAgIC8vIFRoZSBpZCBwcm9wZXJ0eSBzZXQgYmVsb3cgd2lsbCBiZSBudWxsIGZvciBhIG5ldyBjYXNlIGZsYWcsIGFuZCBhIHVuaXF1ZSBpZCByZXR1cm5lZCBmcm9tIENDRCB3aGVuXG4gICAgICAgICAgICAgIC8vIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZsYWdcbiAgICAgICAgICAgICAgc3dpdGNoIChrKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlc2UgdHdvIGZpZWxkcyBhcmUgZGF0ZS10aW1lIGZpZWxkc1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lTW9kaWZpZWQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lQ3JlYXRlZCc6XG4gICAgICAgICAgICAgICAgICByZXR1cm4geyBba106IGRldGFpbC52YWx1ZVtrXSA/IG5ldyBEYXRlKGRldGFpbC52YWx1ZVtrXSkgOiBudWxsLCBpZDogZGV0YWlsLmlkIH07XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBhIFwieWVzL25vXCIgZmllbGRcbiAgICAgICAgICAgICAgICBjYXNlICdoZWFyaW5nUmVsZXZhbnQnOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGFpbC52YWx1ZVtrXS50b1VwcGVyQ2FzZSgpID09PSAnWUVTJyA/IHsgW2tdOiB0cnVlLCBpZDogZGV0YWlsLmlkIH0gOiB7IFtrXTogZmFsc2UsIGlkOiBkZXRhaWwuaWQgfTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgW2tdOiBkZXRhaWwudmFsdWVba10sIGlkOiBkZXRhaWwuaWQgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0pIGFzIEZsYWdEZXRhaWxbXVxuICAgICAgICAgIDogbnVsbFxuICAgICAgfSxcbiAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwLFxuICAgICAgY2FzZUZpZWxkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBhY3RpdmUgZmxhZ3MgaW4gYSBgQ2FzZUZpZWxkYCBpbnN0YW5jZSwgcmVjdXJzaW5nIGFuZCBpdGVyYXRpbmcgdGhyb3VnaCBzdWItZmllbGRzIG9mIGEgQ29tcGxleCBmaWVsZCBvciBlYWNoXG4gICAqIGZpZWxkIGluIGEgQ29sbGVjdGlvbiBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGFjdGl2ZUNvdW50IEFuIGFjY3VtdWxhdGlvbiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBmbGFnc1xuICAgKiBAcGFyYW0gY2FzZUZpZWxkIEEgYENhc2VGaWVsZGAgaW5zdGFuY2UgZm9yIHdoaWNoIHRvIGNvdW50IHRoZSBhY3RpdmUgZmxhZ3NcbiAgICogQHBhcmFtIGN1cnJlbnRWYWx1ZSBUaGUgY3VycmVudCB2YWx1ZSBvYmplY3Qgb2YgYSBgQ2FzZUZpZWxkYCB0aGF0IGlzIGEgc3ViLWZpZWxkIG9mIGEgbm9uIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZC5cbiAgICogKEZvciBDb21wbGV4IHR5cGVzLCBvbmx5IHRoZSBfcm9vdC1sZXZlbF8gYENhc2VGaWVsZGAgY29udGFpbnMgYSB2YWx1ZSBwcm9wZXJ0eSAtIGFsbCBzdWItZmllbGRzLCBpbmNsdWRpbmcgYW55XG4gICAqIG5lc3RlZCBDb21wbGV4IGZpZWxkcywgZG8gKm5vdCogY29udGFpbiBhbnkgdmFsdWVzIHRoZW1zZWx2ZXMuKVxuICAgKiBAcmV0dXJucyBUaGUgY291bnQgb2YgYWN0aXZlIGZsYWdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChhY3RpdmVDb3VudDogbnVtYmVyLCBjYXNlRmllbGQ6IENhc2VGaWVsZCwgY3VycmVudFZhbHVlPzogb2JqZWN0KTogbnVtYmVyIHtcbiAgICBjb25zdCBmaWVsZFR5cGUgPSBjYXNlRmllbGQuZmllbGRfdHlwZTtcbiAgICBzd2l0Y2ggKGZpZWxkVHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NDYXNlRmllbGQoY2FzZUZpZWxkKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBGbGFncyBDYXNlRmllbGQgaGFzIGEgdmFsdWUsIGl0IGlzIGEgcm9vdC1sZXZlbCBDb21wbGV4IGZpZWxkOyBpZiBpdCBkb2VzIG5vdCwgaXQgaXMgYSBGbGFnc1xuICAgICAgICAgIC8vIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhbm90aGVyIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgRmllbGRzVXRpbHMuaXNOb25FbXB0eU9iamVjdCh2YWx1ZSkgJiYgdmFsdWUuZGV0YWlscykge1xuICAgICAgICAgICAgYWN0aXZlQ291bnQgPSB2YWx1ZS5kZXRhaWxzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjYXNlRmllbGQudmFsdWUgPyBjYXNlRmllbGQudmFsdWUgOiBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5yZWR1Y2UoKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKFxuICAgICAgICAgICAgICAgIGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCxcbiAgICAgICAgICAgICAgICBzdWJGaWVsZCxcbiAgICAgICAgICAgICAgICB2YWx1ZVtzdWJGaWVsZC5pZF1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sIGFjdGl2ZUNvdW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBGb3IgYSBDb2xsZWN0aW9uIGZpZWxkLCB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgZGlyZWN0bHkgYXMga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBDYXNlRmllbGQncyB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgLy8gYXMgYW4gYXJyYXksIHVubGVzcyB0aGUgY29sbGVjdGlvbiBpcyBhIHN1Yi1maWVsZCBvZiBhIENvbXBsZXggdHlwZSAtIHN1Yi1maWVsZHMgbmV2ZXIgY29udGFpbiB2YWx1ZXNcbiAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICBpZiAoRmllbGRzVXRpbHMuaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBDb2xsZWN0aW9uIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSAoYW4gYXJyYXkpLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29sbGVjdGlvbiBmaWVsZDsgaWYgaXQgZG9lcyBub3QsXG4gICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgLy8gKGlmIGFueSkgaW5zdGVhZFxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlWydkZXRhaWxzJ10pIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGl0ZW0udmFsdWVbJ2RldGFpbHMnXS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAoY291bnQsIGRldGFpbCkgPT4gZGV0YWlsLnZhbHVlLnN0YXR1cyA9PT0gQ2FzZUZsYWdTdGF0dXMuQUNUSVZFID8gY291bnQgKyAxIDogY291bnQsXG4gICAgICAgICAgICAgICAgICBhY3RpdmVDb3VudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJlZHVjdGlvbiBvdmVyIGVhY2ggQ29tcGxleCBmaWVsZCdzIHN1Yi1maWVsZHMgKHNpbWlsYXIgdG8gd2hhdCBpcyBkb25lIGFib3ZlIGZvciBub24tRmxhZ3NcbiAgICAgICAgICAgIC8vIENvbXBsZXggZmllbGRzKVxuICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgLy8gZm9yIGVhY2ggb25lIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb2xsZWN0aW9uKVxuICAgICAgICAgICAgY2FzZUZpZWxkLnZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSkgPT4ge1xuICAgICAgICAgICAgICBhY3RpdmVDb3VudCA9IGZpZWxkVHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKFxuICAgICAgICAgICAgICAgIChhY3RpdmVGbGFnc0NvdW50T2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoYWN0aXZlRmxhZ3NDb3VudE9mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgaXRlbS52YWx1ZVtzdWJGaWVsZC5pZF0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aXZlQ291bnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIGZpZWxkIHR5cGVzXG4gICAgfVxuICAgIHJldHVybiBhY3RpdmVDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZENhblNob3dQcmVkaWNhdGUoZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyLCBmb3JtOiBhbnkpOiBQcmVkaWNhdGU8V2l6YXJkUGFnZT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudEV2ZW50U3RhdGUoZXZlbnRUcmlnZ2VyLCBmb3JtKTtcbiAgICByZXR1cm4gKHBhZ2U6IFdpemFyZFBhZ2UpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBwYWdlLnBhcnNlZFNob3dDb25kaXRpb24ubWF0Y2goY3VycmVudFN0YXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlcjogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSwgZm9ybTogRm9ybUdyb3VwKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcywgZm9ybS5jb250cm9sc1snZGF0YSddLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZUNhc2VGaWVsZChvYmo6IGFueSk6IENhc2VGaWVsZCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IENhc2VGaWVsZCgpLCBvYmopO1xuICB9XG5cbiAgcHVibGljIG1lcmdlQ2FzZUZpZWxkc0FuZEZvcm1GaWVsZHMoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIGZvcm1GaWVsZHM6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VGaWVsZHMoY2FzZUZpZWxkcywgZm9ybUZpZWxkcywgRmllbGRzVXRpbHMuREVGQVVMVF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2VMYWJlbENhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBjb250cm9sSXRlcmF0b3IoXG4gICAgYUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgICBmb3JtQXJyYXlGbjogKGFycmF5OiBGb3JtQXJyYXkpID0+IHZvaWQsXG4gICAgZm9ybUdyb3VwRm46IChncm91cDogRm9ybUdyb3VwKSA9PiB2b2lkLFxuICAgIGNvbnRyb2xGbjogKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkgeyAvLyBXZSdyZSBpbiBhIGNvbGxlY3Rpb25cbiAgICAgIGZvcm1BcnJheUZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7IC8vIFdlJ3JlIGluIGEgY29tcGxleCB0eXBlLlxuICAgICAgZm9ybUdyb3VwRm4oYUNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkgeyAvLyBGb3JtQ29udHJvbFxuICAgICAgY29udHJvbEZuKGFDb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QsIG1lcmdlRnVuY3Rpb246IChmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCkgPT4gdm9pZCk6IG9iamVjdCB7XG4gICAgY29uc3QgcmVzdWx0OiBvYmplY3QgPSBGaWVsZHNVdGlscy5jbG9uZU9iamVjdChmb3JtRmllbGRzKTtcbiAgICBjYXNlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgbWVyZ2VGdW5jdGlvbihmaWVsZCwgcmVzdWx0KTtcbiAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMgJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSB0aGlzLm1lcmdlRmllbGRzKGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIHJlc3VsdFtmaWVsZC5pZF0sIG1lcmdlRnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|
|
615
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9maWVsZHMvZmllbGRzLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0csT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBb0IsU0FBUyxFQUF5RSxNQUFNLGNBQWMsQ0FBQztBQUNsSSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFFbkYsV0FBVztBQUVYLE1BQU0sT0FBTyxXQUFXO0lBV2YsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQVc7UUFDN0MsT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLElBQUksR0FBRyxLQUFLLFVBQVU7ZUFDNUMsR0FBRyxLQUFLLFVBQVUsSUFBSSxHQUFHLEtBQUssUUFBUTtlQUN0QyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFRO1FBQ3ZDLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxTQUFTLENBQUMsRUFBRTtZQUMvQixPQUFPLHFCQUFxQixDQUFDLElBQUksU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7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QU0sQ0FBQyxDQUFDOzRCQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzdDLE1BQU07eUJBQ1A7d0JBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQzs0QkFDZCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFO2dDQUN6RCxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFZLEVBQUUsRUFBRTtvQ0FDN0UsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3Q0FDaEYsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUNBQ2pEO2dDQUNILENBQUMsQ0FBQyxDQUFDOzZCQUNKOzRCQUNELE1BQU07eUJBQ1A7cUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUNELE1BQU07U0FDUDtLQUNGO0FBQ0gsQ0FBQyxDQUFDO3NFQXpPUyxXQUFXO2lFQUFYLFdBQVcsV0FBWCxXQUFXO3VGQUFYLFdBQVc7Y0FEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHBsYWluVG9DbGFzc0Zyb21FeGlzdCB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbic7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcGFsZXR0ZS9iYXNlLWZpZWxkL2Fic3RyYWN0LWZvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEZsYWdEZXRhaWwsIEZsYWdzV2l0aEZvcm1Hcm91cFBhdGggfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL2RvbWFpbi9jYXNlLWZsYWcubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlciwgQ2FzZUZsYWdTdGF0dXMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BhbGV0dGUvY2FzZS1mbGFnL2VudW1zJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9wYWxldHRlL3V0aWxzJztcbmltcG9ydCB7IENhc2VFdmVudFRyaWdnZXIsIENhc2VGaWVsZCwgQ2FzZVRhYiwgQ2FzZVZpZXcsIEZpZWxkVHlwZSwgRmllbGRUeXBlRW51bSwgRml4ZWRMaXN0SXRlbSwgUHJlZGljYXRlIH0gZnJvbSAnLi4vLi4vZG9tYWluJztcbmltcG9ydCB7IEZvcm1hdFRyYW5zbGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vY2FzZS1maWVsZHMvZm9ybWF0LXRyYW5zbGF0b3Iuc2VydmljZSc7XG5cbi8vIEBkeW5hbWljXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmllbGRzVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjYXNlTGV2ZWxDYXNlRmxhZ3NGaWVsZElkID0gJ2Nhc2VGbGFncyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGN1cnJlbmN5UGlwZTogQ3VycmVuY3lQaXBlID0gbmV3IEN1cnJlbmN5UGlwZSgnZW4tR0InKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZGF0ZVBpcGU6IERhdGVQaXBlID0gbmV3IERhdGVQaXBlKG5ldyBGb3JtYXRUcmFuc2xhdG9yU2VydmljZSgpKTtcbiAgLy8gRVVJLTQyNDQuIDMgZGFzaGVzIGluc3RlYWQgb2YgMSB0byBtYWtlIHRoaXMgbGVzcyBsaWtlbHkgdG8gY2xhc2ggd2l0aCBhIHJlYWwgZmllbGQuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEFCRUxfU1VGRklYID0gJy0tLUxBQkVMJztcbiAgLy8gSGFuZGxpbmcgb2YgRHluYW1pYyBMaXN0cyBpbiBDb21wbGV4IFR5cGVzXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVkVSX1JFU1BPTlNFX0ZJRUxEX1RZUEVfQ09MTEVDVElPTiA9ICdDb2xsZWN0aW9uJztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRVJWRVJfUkVTUE9OU0VfRklFTERfVFlQRV9DT01QTEVYID0gJ0NvbXBsZXgnO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0RZTkFNSUNfTElTVF9UWVBFOiBGaWVsZFR5cGVFbnVtW10gPSBbJ0R5bmFtaWNMaXN0JywgJ0R5bmFtaWNSYWRpb0xpc3QnXTtcblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWREaXNwbGF5Q29udGV4dChjdHg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY3R4ID09PSAnTUFOREFUT1JZJyB8fCBjdHggPT09ICdSRUFET05MWSdcbiAgICAgIHx8IGN0eCA9PT0gJ09QVElPTkFMJyB8fCBjdHggPT09ICdISURERU4nXG4gICAgICB8fCBjdHggPT09ICdDT01QTEVYJyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRUb0Nhc2VGaWVsZChvYmo6IGFueSk6IENhc2VGaWVsZCB7XG4gICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ2FzZUZpZWxkKSkge1xuICAgICAgcmV0dXJuIHBsYWluVG9DbGFzc0Zyb21FeGlzdChuZXcgQ2FzZUZpZWxkKCksIG9iaik7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvVmFsdWVzTWFwKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZU1hcCA9IHt9O1xuICAgIGNhc2VGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICB2YWx1ZU1hcFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5wcmVwYXJlVmFsdWUoZmllbGQpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZU1hcDtcbiAgfVxuXG4gIC8vIHB1YmxpYyBzdGF0aWMgZ2V0VHlwZShlbGVtOiBhbnkpOiBzdHJpbmcge1xuICAvLyAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbSkuc2xpY2UoOCwgLTEpO1xuICAvLyB9XG5cbiAgcHVibGljIHN0YXRpYyBpc09iamVjdChlbGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGVsZW0gPT09ICdvYmplY3QnICYmIGVsZW0gIT09IG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTm9uRW1wdHlPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNPYmplY3QoZWxlbSkgJiYgT2JqZWN0LmtleXMoZWxlbSkubGVuZ3RoICE9PSAwO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGVsZW0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhcmVDb2xsZWN0aW9uVmFsdWVzU2ltcGxlRmllbGRzKGZpZWxkVmFsdWU6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT2JqZWN0KGZpZWxkVmFsdWVbMF1bJ3ZhbHVlJ10pICYmICFBcnJheS5pc0FycmF5KGZpZWxkVmFsdWVbMF1bJ3ZhbHVlJ10pICYmIGZpZWxkVmFsdWVbMF1bJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNDb2xsZWN0aW9uT2ZTaW1wbGVUeXBlcyhmaWVsZFZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbGxlY3Rpb24oZmllbGRWYWx1ZSkgJiYgdGhpcy5hcmVDb2xsZWN0aW9uVmFsdWVzU2ltcGxlRmllbGRzKGZpZWxkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc011bHRpU2VsZWN0VmFsdWUoZm9ybTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNOb25FbXB0eUFycmF5KGZvcm0pICYmICF0aGlzLmlzQ29sbGVjdGlvbldpdGhWYWx1ZShmb3JtKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOb25FbXB0eUFycmF5KHBhZ2VGb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYWdlRm9ybUZpZWxkcykgJiYgcGFnZUZvcm1GaWVsZHNbMF0gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNDb2xsZWN0aW9uKHBhZ2VGb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc05vbkVtcHR5QXJyYXkocGFnZUZvcm1GaWVsZHMpICYmIHRoaXMuaXNDb2xsZWN0aW9uV2l0aFZhbHVlKHBhZ2VGb3JtRmllbGRzKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNDb2xsZWN0aW9uV2l0aFZhbHVlKHBhZ2VGb3JtRmllbGRzOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYWdlRm9ybUZpZWxkc1swXVsndmFsdWUnXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjbG9uZU9iamVjdChvYmo6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gIH1cblxuICAvLyB0ZW1wb3JhcnkgZnVuY3Rpb24gdW50aWwgdGhpcyBjYW4gYmUgbW92ZWQgdG8gQ2FzZVZpZXcgY2xhc3MgKFJETS0yNjgxKVxuICBwdWJsaWMgc3RhdGljIGdldENhc2VGaWVsZHMoY2FzZVZpZXc6IENhc2VWaWV3KTogQ2FzZUZpZWxkW10ge1xuICAgIGNvbnN0IGNhc2VEYXRhRmllbGRzOiBDYXNlRmllbGRbXSA9IGNhc2VWaWV3LnRhYnMucmVkdWNlKChhY2M6IENhc2VGaWVsZFtdLCB0YWI6IENhc2VUYWIpID0+IHtcbiAgICAgIHJldHVybiBhY2MuY29uY2F0KHRhYi5maWVsZHMpO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhRmllbGRzOiBDYXNlRmllbGRbXSA9IGNhc2VWaWV3Lm1ldGFkYXRhRmllbGRzO1xuICAgIHJldHVybiBtZXRhZGF0YUZpZWxkcy5jb25jYXQoY2FzZURhdGFGaWVsZHMuZmlsdGVyKChjYXNlRmllbGQ6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhRmllbGRzLmZpbmRJbmRleChtZXRhZGF0YUZpZWxkID0+IG1ldGFkYXRhRmllbGQuaWQgPT09IGNhc2VGaWVsZC5pZCkgPCAwO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ2FzZUZpZWxkQW5kQ29tcG9uZW50UmVmZXJlbmNlcyhjOiBBYnN0cmFjdENvbnRyb2wsIGNmOiBDYXNlRmllbGQsIGNvbXA6IEFic3RyYWN0Rm9ybUZpZWxkQ29tcG9uZW50KTogdm9pZCB7XG4gICAgY1snY2FzZUZpZWxkJ10gPSBjZjtcbiAgICBjWydjb21wb25lbnQnXSA9IGNvbXA7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlIGNoZWNrIG9mIGFuIGFycmF5IG9yIG9iamVjdCBhbmQgaXRzIGRlc2NlbmRhbnRzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYW55IG5vbi1lbXB0eSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBvYmplY3QgVGhlIGFycmF5IG9yIG9iamVjdCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5IG9yIG9iamVjdCAob3IgYSBkZXNjZW5kYW50KSBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLWVtcHR5IHZhbHVlOyBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb250YWluc05vbkVtcHR5VmFsdWVzKG9iamVjdDogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMob2JqZWN0KS5tYXAoa2V5ID0+IG9iamVjdFtrZXldKTtcbiAgICBjb25zdCBvYmplY3RSZWZzID0gW107XG4gICAgLy8gQWxzbyB0ZXN0IGZvciBudW1lcmljIHZhbHVlcywgYW5kIGxlbmd0aCA+IDAgZm9yIG5vbi1udW1lcmljIHZhbHVlcyBiZWNhdXNlIHRoaXMgY292ZXJzIGJvdGggc3RyaW5ncyBhbmQgYXJyYXlzLlxuICAgIC8vIE5vdGU6IERlbGliZXJhdGUgdXNlIG9mIG5vbi1lcXVhbGl0eSAoIT0pIG9wZXJhdG9yIGZvciBudWxsIGNoZWNrLCB0byBoYW5kbGUgYm90aCBudWxsIGFuZCB1bmRlZmluZWQgdmFsdWVzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgIGNvbnN0IGhhc05vbk51bGxQcmltaXRpdmUgPSB2YWx1ZXMuc29tZSh4ID0+ICh4ICE9IG51bGwgJiZcbiAgICAgICgodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHguY29uc3RydWN0b3IgPT09IE9iamVjdCkgfHwgQXJyYXkuaXNBcnJheSh4KVxuICAgICAgICA/ICFvYmplY3RSZWZzLnB1c2goeClcbiAgICAgICAgOiB0eXBlb2YgeCA9PT0gJ251bWJlcicgfHwgeC5sZW5ndGggPiAwKVxuICAgICkpO1xuICAgIHJldHVybiAhaGFzTm9uTnVsbFByaW1pdGl2ZSA/IG9iamVjdFJlZnMuc29tZSh5ID0+IHRoaXMuY29udGFpbnNOb25FbXB0eVZhbHVlcyh5KSkgOiBoYXNOb25OdWxsUHJpbWl0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cygpXG4gICAqIFJlYXNzaWducyBsaXN0X2l0ZW0gYW5kIHZhbHVlIGRhdGEgdG8gRHluYW1pY0xpc3QgY2hpbGRyZW5cbiAgICogZG93biB0aGUgdHJlZS4gU2VydmVyIHJlc3BvbnNlIHJldHVybnMgZGF0YSBvbmx5IGluXG4gICAqIHRoZSBgdmFsdWVgIG9iamVjdCBvZiBwYXJlbnQgY29tcGxleCB0eXBlXG4gICAqXG4gICAqIEVVSS0yNTMwIER5bmFtaWMgTGlzdHMgZm9yIEVsZW1lbnRzIGluIGEgQ29tcGxleCBUeXBlXG4gICAqXG4gICAqIEBwYXJhbSBqc29uQm9keSAtIHsgY2FzZV9maWVsZHM6IFsgQ2FzZUZpZWxkLCBDYXNlRmllbGQgXSB9XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhbmRsZU5lc3RlZER5bmFtaWNMaXN0cyhqc29uQm9keTogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSk6IGFueSB7XG4gICAgaWYgKGpzb25Cb2R5LmNhc2VfZmllbGRzKSB7XG4gICAgICBqc29uQm9keS5jYXNlX2ZpZWxkcy5mb3JFYWNoKGNhc2VGaWVsZCA9PiB7XG4gICAgICAgIGlmIChjYXNlRmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHRoaXMuc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZCwgY2FzZUZpZWxkLmZpZWxkX3R5cGUsIGNhc2VGaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uQm9keTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHByZXBhcmVWYWx1ZShmaWVsZDogQ2FzZUZpZWxkKTogYW55IHtcbiAgICBpZiAoZmllbGQudmFsdWUpIHtcbiAgICAgIHJldHVybiBmaWVsZC52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLmlzQ29tcGxleCgpKSB7XG4gICAgICBjb25zdCB2YWx1ZU1hcCA9IHt9O1xuICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKGNvbXBsZXhGaWVsZCA9PiB7XG4gICAgICAgIHZhbHVlTWFwW2NvbXBsZXhGaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5wcmVwYXJlVmFsdWUoY29tcGxleEZpZWxkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlTWFwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUVSR0VfRlVOQ1RJT04gPSBmdW5jdGlvbiBtZXJnZUZ1bmN0aW9uKGZpZWxkOiBDYXNlRmllbGQsIHJlc3VsdDogb2JqZWN0KTogdm9pZCB7XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IExBQkVMX01FUkdFX0ZVTkNUSU9OID0gZnVuY3Rpb24gbWVyZ2VGdW5jdGlvbihmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCk6IHZvaWQge1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXN1bHQgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQuaGFzT3duUHJvcGVydHkoZmllbGQuaWQpKSB7XG4gICAgICByZXN1bHRbZmllbGQuaWRdID0gZmllbGQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBzd2l0Y2gtZGVmYXVsdFxuICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICBjYXNlICdGaXhlZExpc3QnOlxuICAgICAgY2FzZSAnRml4ZWRSYWRpb0xpc3QnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRGaXhlZExpc3RMYWJlbEJ5Q29kZU9yRW1wdHkoZmllbGQsIHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ011bHRpU2VsZWN0TGlzdCc6IHtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJlc3VsdFtmaWVsZC5pZF0gfHwgW107XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF0gPSBbXTtcbiAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKChjb2RlOiBhbnksIGlkeDogYW55KSA9PiB7XG4gICAgICAgICAgcmVzdWx0W2ZpZWxkLmlkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXVtpZHhdID0gRmllbGRzVXRpbHMuZ2V0Rml4ZWRMaXN0TGFiZWxCeUNvZGVPckVtcHR5KGZpZWxkLCBjb2RlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTGFiZWwnOiB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRMYWJlbChmaWVsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSBGaWVsZHNVdGlscy5nZXRNb25leUdCUChmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdEYXRlJzoge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gKHJlc3VsdFtmaWVsZC5pZF0gfHwgZmllbGQudmFsdWUpO1xuICAgICAgICByZXN1bHRbZmllbGQuaWRdID0gRmllbGRzVXRpbHMuZ2V0RGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDb21wbGV4Jzoge1xuICAgICAgICBpZiAocmVzdWx0W2ZpZWxkLmlkXSAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKChmOiBDYXNlRmllbGQpID0+IHtcbiAgICAgICAgICAgIGlmIChbJ0NvbGxlY3Rpb24nLCAnQ29tcGxleCcsICdNdWx0aVNlbGVjdExpc3QnXS5pbmRleE9mKGYuZmllbGRfdHlwZS50eXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIHJlc3VsdFtmaWVsZC5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ29sbGVjdGlvbic6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAocmVzdWx0W2ZpZWxkLmlkXSB8fCBmaWVsZC52YWx1ZSk7XG4gICAgICAgIGlmIChlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnTW9uZXlHQlAnOiB7XG4gICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IEZpZWxkc1V0aWxzLmdldE1vbmV5R0JQKGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0RhdGUnOiB7XG4gICAgICAgICAgICAgICAgZWxlbS52YWx1ZSA9IEZpZWxkc1V0aWxzLmdldERhdGUoZWxlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQ29tcGxleCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmZvckVhY2goKGY6IENhc2VGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWydDb2xsZWN0aW9uJywgJ0NvbXBsZXgnLCAnTXVsdGlTZWxlY3RMaXN0J10uaW5kZXhPZihmLmZpZWxkX3R5cGUudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKGYsIGVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBgTW9uZXlHQlBgIHZhbHVlIHRvIGluY2x1ZGUgY3VycmVuY3kgdW5pdHMuXG4gICAqIEBwYXJhbSBmaWVsZFZhbHVlIFRoZSBDdXJyZW5jeVBpcGUgZXhwZWN0cyBhbiBgYW55YCBwYXJhbWV0ZXIgc28gdGhpcyBtdXN0IGFsc28gYmUgYGFueWAsXG4gICAqIGJ1dCBpdCBzaG91bGQgYmUgXCJudW1iZXItbGlrZVwiIChlLmcuLCAnMTIzNCcpXG4gICAqIEByZXR1cm5zIEEgZm9ybWF0dGVkIHN0cmluZyAoZS5nLiwgwqMxMi4zNClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE1vbmV5R0JQKGZpZWxkVmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWUgPyBGaWVsZHNVdGlscy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKGZpZWxkVmFsdWUgLyAxMDAsICdHQlAnLCAnc3ltYm9sJykgOiBmaWVsZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TGFiZWwoZmllbGRWYWx1ZTogQ2FzZUZpZWxkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGRWYWx1ZSA/IGZpZWxkVmFsdWUubGFiZWwgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldERhdGUoZmllbGRWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9ybWF0IHNwZWNpZmllZCBoZXJlIHdhc24ndCBwcmV2aW91c2x5IHdvcmtpbmcgYW5kIGxvdHMgb2YgdGVzdHMgZGVwZW5kIG9uIGl0IG5vdCB3b3JraW5nXG4gICAgICAvLyBOb3cgdGhhdCBmb3JtYXRzIHdvcmsgY29ycmVjdGx5IG1hbnkgdGVzdCB3b3VsZCBicmVhayAtIGFuZCB0aGlzIGNvdWxkIGFmZmVjdCBzZXJ2aWNlcyB3aGljaCBtYXkgZGVwZW5kIG9uXG4gICAgICAvLyB0aGUgb3JnaW5hbCBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIGRhdGVzIGluIFwiZCBNTU0geXl5eVwiXG4gICAgICAvLyBOb3RlIC0gcmVwbGFjZWQgJ2QnIHdpdGggJ0QnIGFzIGRhdGVwaXBlIHVzaW5nIG1vbWVudCB0byBhdm9pZCB0aW1lem9uZSBkaXNjcmVwYW5jaWVzXG4gICAgICByZXR1cm4gRmllbGRzVXRpbHMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpZWxkVmFsdWUsIG51bGwsICdEIE1NTSB5eXl5Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dEZvckludmFsaWRGaWVsZCgnRGF0ZScsIGZpZWxkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEZpeGVkTGlzdExhYmVsQnlDb2RlT3JFbXB0eShmaWVsZDogQ2FzZUZpZWxkLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlbGV2YW50SXRlbTogRml4ZWRMaXN0SXRlbSA9IGNvZGUgPyBmaWVsZC5maWVsZF90eXBlLmZpeGVkX2xpc3RfaXRlbXMuZmluZChpdGVtID0+IGl0ZW0uY29kZSA9PT0gY29kZSkgOiBudWxsO1xuICAgIHJldHVybiByZWxldmFudEl0ZW0gPyByZWxldmFudEl0ZW0ubGFiZWwgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHRleHRGb3JJbnZhbGlkRmllbGQodHlwZTogc3RyaW5nLCBpbnZhbGlkVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB7IEludmFsaWQgJHt0eXBlfTogJHtpbnZhbGlkVmFsdWV9IH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2V0RHluYW1pY0xpc3REZWZpbml0aW9uKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCBjYXNlRmllbGRUeXBlOiBGaWVsZFR5cGUsIHJvb3RDYXNlRmllbGQ6IENhc2VGaWVsZCkge1xuICAgIGlmIChjYXNlRmllbGRUeXBlLnR5cGUgPT09IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTVBMRVgpIHtcblxuICAgICAgY2FzZUZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBpc0R5bmFtaWNGaWVsZCA9IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0RZTkFNSUNfTElTVF9UWVBFLmluZGV4T2YoZmllbGQuZmllbGRfdHlwZS50eXBlKSAhPT0gLTE7XG5cbiAgICAgICAgICBpZiAoaXNEeW5hbWljRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNMaXN0VmFsdWUgPSB0aGlzLmdldER5bmFtaWNMaXN0VmFsdWUocm9vdENhc2VGaWVsZC52YWx1ZSwgZmllbGQuaWQpO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWNMaXN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGlzdF9pdGVtcyA9IGR5bmFtaWNMaXN0VmFsdWVbMF0ubGlzdF9pdGVtcztcbiAgICAgICAgICAgICAgY29uc3QgY29tcGxleFZhbHVlID0gZHluYW1pY0xpc3RWYWx1ZS5tYXAoZGF0YSA9PiBkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgbGlzdF9pdGVtcyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29tcGxleFZhbHVlLmxlbmd0aCA+IDAgPyBjb21wbGV4VmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZmllbGQuZm9ybWF0dGVkX3ZhbHVlID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpZWxkLmZvcm1hdHRlZF92YWx1ZSxcbiAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihmaWVsZCwgZmllbGQuZmllbGRfdHlwZSwgcm9vdENhc2VGaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjYXNlRmllbGRUeXBlLnR5cGUgPT09IEZpZWxkc1V0aWxzLlNFUlZFUl9SRVNQT05TRV9GSUVMRF9UWVBFX0NPTExFQ1RJT04pIHtcbiAgICAgIGlmIChjYXNlRmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkge1xuICAgICAgICB0aGlzLnNldER5bmFtaWNMaXN0RGVmaW5pdGlvbihjYXNlRmllbGQsIGNhc2VGaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLCByb290Q2FzZUZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXREeW5hbWljTGlzdFZhbHVlKGpzb25CbG9jazogYW55LCBrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSBqc29uQmxvY2sgPyB0aGlzLmdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25CbG9jaywga2V5LCBbXSkgOiBbXTtcblxuICAgIHJldHVybiBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE5lc3RlZEZpZWxkVmFsdWVzKGpzb25EYXRhOiBhbnksIGtleTogc3RyaW5nLCBvdXRwdXQ6IGFueVtdID0gW10pIHtcbiAgICBpZiAoanNvbkRhdGEgJiYganNvbkRhdGFba2V5XSkge1xuICAgICAgb3V0cHV0LnB1c2goanNvbkRhdGFba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEtleSBpbiBqc29uRGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIGpzb25EYXRhID09PSAnb2JqZWN0JyAmJiBqc29uRGF0YS5oYXNPd25Qcm9wZXJ0eShlbGVtZW50S2V5KSkge1xuICAgICAgICAgIHRoaXMuZ2V0TmVzdGVkRmllbGRWYWx1ZXMoanNvbkRhdGFbZWxlbWVudEtleV0sIGtleSwgb3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc0ZsYWdzRmllbGRUeXBlKGNhc2VGaWVsZC5maWVsZF90eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGlzQ2FzZUZpZWxkT2ZUeXBlfSBpbnN0ZWFkLCBwYXNzaW5nICdGbGFnTGF1bmNoZXInIGFzIHRoZSBzaW5nbGUgdHlwZSBpbiB0aGUgYHR5cGVzYCBhcnJheVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0ZsYWdMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdGbGFnTGF1bmNoZXInO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgaXNDYXNlRmllbGRPZlR5cGV9IGluc3RlYWQsIHBhc3NpbmcgJ0NvbXBvbmVudExhdW5jaGVyJyBhcyB0aGUgc2luZ2xlIHR5cGUgaW4gdGhlIGB0eXBlc2BcbiAgICogYXJyYXlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb21wb25lbnRMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FzZUZpZWxkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdDb21wb25lbnRMYXVuY2hlcic7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEge0BsaW5rIENhc2VGaWVsZH0gaXMgb2Ygb25lIG9mIHRoZSBnaXZlbiBmaWVsZCB0eXBlcy5cbiAgICpcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBUaGUgYENhc2VGaWVsZGAgdG8gY2hlY2tcbiAgICogQHBhcmFtIHR5cGVzIEFuIGFycmF5IG9mIG9uZSBvciBtb3JlIGZpZWxkIHR5cGVzXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYENhc2VGaWVsZGAgdHlwZSBpcyBvbmUgb2YgdGhvc2UgaW4gdGhlIGFycmF5IG9mIHR5cGVzIHRvIGNoZWNrIGFnYWluc3Q7IGBmYWxzZWBcbiAgICogb3RoZXJ3aXNlIG9yIGlmIGBjYXNlRmllbGRgIG9yIGB0eXBlc2AgYXJlIGZhbHN5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ2FzZUZpZWxkT2ZUeXBlKGNhc2VGaWVsZDogQ2FzZUZpZWxkLCB0eXBlczogRmllbGRUeXBlRW51bVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjYXNlRmllbGQgfHwgIXR5cGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzLnNvbWUodHlwZSA9PiB0eXBlID09PSBjYXNlRmllbGQuZmllbGRfdHlwZS50eXBlIHx8IHR5cGUgPT09IGNhc2VGaWVsZC5maWVsZF90eXBlLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNMaW5rZWRDYXNlc0Nhc2VGaWVsZChjYXNlRmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBGaWVsZHNVdGlscy5pc0NvbXBvbmVudExhdW5jaGVyQ2FzZUZpZWxkKGNhc2VGaWVsZCkgJiZcbiAgICAgIGNhc2VGaWVsZC5pZCA9PT0gJ0xpbmtlZENhc2VzQ29tcG9uZW50TGF1bmNoZXInO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjb250YWluc0xpbmtlZENhc2VzQ2FzZUZpZWxkKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhc2VGaWVsZHM/LnNvbWUoY2FzZUZpZWxkID0+IEZpZWxkc1V0aWxzLmlzTGlua2VkQ2FzZXNDYXNlRmllbGQoY2FzZUZpZWxkKSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlOiBGaWVsZFR5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpZWxkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGR1bW15IGZpZWxkIHR5cGUgSUQgb2YgXCJDYXNlRmxhZ1wiIGZvciB0ZXN0aW5nIGFuZCB0aGUgcmVhbCBmaWVsZCB0eXBlXG4gICAgLy8gSUQgb2YgXCJGbGFnc1wiXG4gICAgcmV0dXJuIChmaWVsZFR5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIChmaWVsZFR5cGUuaWQgPT09ICdDYXNlRmxhZycgfHwgZmllbGRUeXBlLmlkID09PSAnRmxhZ3MnKSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBmbGFncyBkYXRhIGZyb20gYSBgQ2FzZUZpZWxkYCBpbnN0YW5jZSwgcmVjdXJzaW5nIGFuZCBpdGVyYXRpbmcgdGhyb3VnaCBzdWItZmllbGRzIG9mIGEgQ29tcGxleCBmaWVsZCBvclxuICAgKiBlYWNoIGZpZWxkIGluIGEgQ29sbGVjdGlvbiBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGZsYWdzIEFuIGFycmF5IGZvciBhY2N1bXVsYXRpbmcgZXh0cmFjdGVkIGZsYWdzIGRhdGEgYW5kIGRlcml2ZWQgYEZvcm1Hcm91cGAgcGF0aHNcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgZmxhZ3MgZGF0YVxuICAgKiBAcGFyYW0gcGF0aFRvRmxhZ3NGb3JtR3JvdXAgQSAoZG90LWRlbGltaXRlZCkgc3RyaW5nIGZvciBjb25jYXRlbmF0aW5nIHRoZSBuYW1lIG9mIGVhY2ggY29udHJvbCB0aGF0IGZvcm1zIHRoZSBwYXRoXG4gICAqIHRvIHRoZSBgRm9ybUdyb3VwYCBmb3IgdGhlIGBGbGFnc2AgaW5zdGFuY2VcbiAgICogQHBhcmFtIHRvcExldmVsQ2FzZUZpZWxkIFRoZSB0b3AtbGV2ZWwgYENhc2VGaWVsZGAgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgcHJvcGVydHkuIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBfb25seVxuICAgKiB0b3AtbGV2ZWxfIGBDYXNlRmllbGRgcyBjb250YWluIGFjdHVhbCB2YWx1ZXMgYW5kIGEgcmVmZXJlbmNlIG5lZWRzIHRvIGJlIG1haW50YWluZWQgdG8gc3VjaCBhIGZpZWxkXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIFJlcXVpcmVkIGZvciBtYXBwaW5nIHRoZSBgQ2FzZUZpZWxkYCB2YWx1ZSB0byBhIGBGbGFnc2Agb2JqZWN0IGlmIGl0IGlzIGEgXCJGbGFnc1wiIGBDYXNlRmllbGRgLiAoRm9yIENvbXBsZXggdHlwZXMsXG4gICAqIG9ubHkgdGhlIF9yb290LWxldmVsXyBgQ2FzZUZpZWxkYCBjb250YWlucyBhIHZhbHVlIHByb3BlcnR5IC0gYWxsIHN1Yi1maWVsZHMsIGluY2x1ZGluZyBhbnkgbmVzdGVkIENvbXBsZXggZmllbGRzLFxuICAgKiBkbyAqbm90KiBjb250YWluIGFueSB2YWx1ZXMgdGhlbXNlbHZlcy4pXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoYCwgZWFjaCBpbnN0YW5jZSBjb21wcmlzaW5nIGEgYEZsYWdzYCBvYmplY3QgZGVyaXZlZCBmcm9tIGEgYENhc2VGaWVsZGBcbiAgICogb2YgdHlwZSBcIkZsYWdzXCIsIGFuZCB0aGUgZG90LWRlbGltaXRlZCBwYXRoIHN0cmluZyB0byB0aGUgY29ycmVzcG9uZGluZyBgRm9ybUdyb3VwYFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChmbGFnczogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aFtdLCBjYXNlRmllbGQ6IENhc2VGaWVsZCxcbiAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cDogc3RyaW5nLCB0b3BMZXZlbENhc2VGaWVsZDogQ2FzZUZpZWxkLCBjdXJyZW50VmFsdWU/OiBvYmplY3QpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoW10ge1xuICAgIGNvbnN0IGZpZWxkVHlwZSA9IGNhc2VGaWVsZC5maWVsZF90eXBlO1xuICAgIHN3aXRjaCAoZmllbGRUeXBlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0NvbXBsZXgnOlxuICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgYSBGbGFncyBDYXNlRmllbGQgKHRoZXNlIGFyZSBpbXBsZW1lbnRlZCBhcyBDb21wbGV4IHR5cGVzKSwgaXQgY2FuIGJlIG1hcHBlZCB0byBhIEZsYWdzXG4gICAgICAgIC8vIG9iamVjdCBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoRmllbGRzVXRpbHMuaXNGbGFnc0Nhc2VGaWVsZChjYXNlRmllbGQpKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIEZsYWdzIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSwgaXQgaXMgYSByb290LWxldmVsIENvbXBsZXggZmllbGQ7IGlmIGl0IGRvZXMgbm90LCBpdCBpcyBhIEZsYWdzXG4gICAgICAgICAgLy8gQ2FzZUZpZWxkIHRoYXQgaXMgYSBzdWItZmllbGQgd2l0aGluIGFub3RoZXIgQ29tcGxleCBmaWVsZCwgc28gdXNlIHRoZSBjdXJyZW50VmFsdWUgdmFsdWUgKGlmIGFueSlcbiAgICAgICAgICAvLyBpbnN0ZWFkLiBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXMgdGhlIFwiY2FzZUZsYWdzXCIgRmxhZ3MgQ2FzZUZpZWxkLCB3aGljaCB3aWxsIGhhdmUgYW4gZW1wdHkgb2JqZWN0IHZhbHVlXG4gICAgICAgICAgLy8gaW5pdGlhbGx5LCBiZWNhdXNlIG5vIHBhcnR5IG5hbWUgaXMgcmVxdWlyZWRcbiAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY2FzZUZpZWxkLnZhbHVlKSB8fFxuICAgICAgICAgICAgY2FzZUZpZWxkLmlkID09PSB0aGlzLmNhc2VMZXZlbENhc2VGbGFnc0ZpZWxkSWQpIHtcbiAgICAgICAgICAgIGZsYWdzLnB1c2godGhpcy5tYXBDYXNlRmllbGRUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoY2FzZUZpZWxkLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgKz0gYC4ke2Nhc2VGaWVsZC5pZH1gO1xuICAgICAgICAgICAgZmxhZ3MucHVzaCh0aGlzLm1hcFZhbHVlVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KFxuICAgICAgICAgICAgICBjYXNlRmllbGQuaWQsIGN1cnJlbnRWYWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgZmxhZ3MgPSBmaWVsZFR5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKChmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICBmbGFnc09mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIHRvcExldmVsQ2FzZUZpZWxkLCB2YWx1ZVtzdWJGaWVsZC5pZF0pO1xuICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIEZvciBhIENvbGxlY3Rpb24gZmllbGQsIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBhcyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIENhc2VGaWVsZCdzIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhcyBhbiBhcnJheSwgdW5sZXNzIHRoZSBjb2xsZWN0aW9uIGlzIGEgc3ViLWZpZWxkIG9mIGEgQ29tcGxleCB0eXBlIC0gc3ViLWZpZWxkcyBuZXZlciBjb250YWluIHZhbHVlc1xuICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIEZsYWdzIENhc2VGaWVsZHMsIHRoZXNlIGNhbiBiZSBtYXBwZWQgdG8gRmxhZ3Mgb2JqZWN0cyBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoRmllbGRzVXRpbHMuaXNGbGFnc0ZpZWxkVHlwZShmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBDb2xsZWN0aW9uIENhc2VGaWVsZCBoYXMgYSB2YWx1ZSAoYW4gYXJyYXkpLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29sbGVjdGlvbiBmaWVsZDsgaWYgaXQgZG9lcyBub3QsXG4gICAgICAgICAgLy8gaXQgaXMgYSBDb2xsZWN0aW9uIENhc2VGaWVsZCB0aGF0IGlzIGEgc3ViLWZpZWxkIHdpdGhpbiBhIENvbXBsZXggZmllbGQsIHNvIHVzZSB0aGUgY3VycmVudFZhbHVlIHZhbHVlXG4gICAgICAgICAgLy8gKGlmIGFueSkgaW5zdGVhZFxuICAgICAgICAgIGNvbnN0IHBhdGhGcmFnbWVudCA9IHBhdGhUb0ZsYWdzRm9ybUdyb3VwICs9ICcuaW5kZXgudmFsdWUnO1xuICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgLy8gQXQgZWFjaCBpdGVyYXRpb24sIHJlcGxhY2UgdGhlIFwiaW5kZXhcIiBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgICAgICAgICAgcGF0aFRvRmxhZ3NGb3JtR3JvdXAgPSBwYXRoRnJhZ21lbnQucmVwbGFjZSgnaW5kZXgnLCBpbmRleC50b1N0cmluZygxMCkpO1xuICAgICAgICAgICAgICBmbGFncy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFwVmFsdWVUb0ZsYWdzV2l0aEZvcm1Hcm91cFBhdGhPYmplY3QoaXRlbS5pZCwgaXRlbS52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIGNhc2VGaWVsZCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIChjdXJyZW50VmFsdWUgYXMgW10pLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCA9IHBhdGhGcmFnbWVudC5yZXBsYWNlKCdpbmRleCcsIGluZGV4LnRvU3RyaW5nKDEwKSk7XG4gICAgICAgICAgICAgIGZsYWdzLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChpdGVtLmlkLCBpdGVtLnZhbHVlLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgdG9wTGV2ZWxDYXNlRmllbGQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgaWYgKGNhc2VGaWVsZC52YWx1ZSkge1xuICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJlZHVjdGlvbiBvdmVyIGVhY2ggQ29tcGxleCBmaWVsZCdzIHN1Yi1maWVsZHMgKHNpbWlsYXIgdG8gd2hhdCBpcyBkb25lIGFib3ZlIGZvciBub24tRmxhZ3NcbiAgICAgICAgICAgIC8vIENvbXBsZXggZmllbGRzKVxuICAgICAgICAgICAgLy8gKENhbm5vdCBqdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBmb3IgZWFjaCBDb21wbGV4IGZpZWxkIGluIHRoZSBjb2xsZWN0aW9uIGJlY2F1c2UgdGhlIENhc2VGaWVsZFxuICAgICAgICAgICAgLy8gZm9yIGVhY2ggb25lIGlzIG5vdCBwYXJ0IG9mIHRoZSBjb2xsZWN0aW9uKVxuICAgICAgICAgICAgY29uc3QgcGF0aEZyYWdtZW50ID0gcGF0aFRvRmxhZ3NGb3JtR3JvdXAgKz0gJy5pbmRleC52YWx1ZSc7XG4gICAgICAgICAgICBjYXNlRmllbGQudmFsdWUuZm9yRWFjaCgoaXRlbTogeyBpZDogc3RyaW5nOyB2YWx1ZTogb2JqZWN0OyB9LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEF0IGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBcImluZGV4XCIgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGluZGV4XG4gICAgICAgICAgICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwID0gcGF0aEZyYWdtZW50LnJlcGxhY2UoJ2luZGV4JywgaW5kZXgudG9TdHJpbmcoMTApKTtcbiAgICAgICAgICAgICAgZmxhZ3MgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZSgoZmxhZ3NPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RmxhZ3NEYXRhRnJvbUNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICAgIGZsYWdzT2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkLCBwYXRoVG9GbGFnc0Zvcm1Hcm91cCwgdG9wTGV2ZWxDYXNlRmllbGQsIGl0ZW0udmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgICAgfSwgZmxhZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIElnbm9yZSBhbGwgb3RoZXIgZmllbGQgdHlwZXNcbiAgICB9XG4gICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwQ2FzZUZpZWxkVG9GbGFnc1dpdGhGb3JtR3JvdXBQYXRoT2JqZWN0KGNhc2VGaWVsZDogQ2FzZUZpZWxkLFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcpOiBGbGFnc1dpdGhGb3JtR3JvdXBQYXRoIHtcbiAgICByZXR1cm4gdGhpcy5tYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChjYXNlRmllbGQuaWQsIGNhc2VGaWVsZC52YWx1ZSwgcGF0aFRvRmxhZ3NGb3JtR3JvdXAsIGNhc2VGaWVsZCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXBWYWx1ZVRvRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aE9iamVjdChpZDogc3RyaW5nLCB2YWx1ZTogb2JqZWN0LFxuICAgIHBhdGhUb0ZsYWdzRm9ybUdyb3VwOiBzdHJpbmcsIGNhc2VGaWVsZDogQ2FzZUZpZWxkKTogRmxhZ3NXaXRoRm9ybUdyb3VwUGF0aCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsYWdzOiB7XG4gICAgICAgIGZsYWdzQ2FzZUZpZWxkSWQ6IGlkLFxuICAgICAgICBwYXJ0eU5hbWU6IHZhbHVlID8gdmFsdWVbJ3BhcnR5TmFtZSddIDogbnVsbCxcbiAgICAgICAgcm9sZU9uQ2FzZTogdmFsdWUgPyB2YWx1ZVsncm9sZU9uQ2FzZSddIDogbnVsbCxcbiAgICAgICAgZGV0YWlsczogdmFsdWUgJiYgdmFsdWVbJ2RldGFpbHMnXSAmJiB2YWx1ZVsnZGV0YWlscyddLmxlbmd0aCA+IDBcbiAgICAgICAgICA/ICh2YWx1ZVsnZGV0YWlscyddIGFzIGFueVtdKS5tYXAoZGV0YWlsID0+IHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5PYmplY3Qua2V5cyhkZXRhaWwudmFsdWUpLm1hcCgoaykgPT4ge1xuICAgICAgICAgICAgICAvLyBUaGUgaWQgcHJvcGVydHkgc2V0IGJlbG93IHdpbGwgYmUgbnVsbCBmb3IgYSBuZXcgY2FzZSBmbGFnLCBhbmQgYSB1bmlxdWUgaWQgcmV0dXJuZWQgZnJvbSBDQ0Qgd2hlblxuICAgICAgICAgICAgICAvLyB1cGRhdGluZyBhbiBleGlzdGluZyBmbGFnXG4gICAgICAgICAgICAgIHN3aXRjaCAoaykge1xuICAgICAgICAgICAgICAgIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIGRhdGUtdGltZSBmaWVsZHNcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRlVGltZU1vZGlmaWVkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRlVGltZUNyZWF0ZWQnOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgW2tdOiBkZXRhaWwudmFsdWVba10gPyBuZXcgRGF0ZShkZXRhaWwudmFsdWVba10pIDogbnVsbCwgaWQ6IGRldGFpbC5pZCB9O1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgYSBcInllcy9ub1wiIGZpZWxkXG4gICAgICAgICAgICAgICAgY2FzZSAnaGVhcmluZ1JlbGV2YW50JzpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRhaWwudmFsdWVba10udG9VcHBlckNhc2UoKSA9PT0gJ1lFUycgPyB7IFtrXTogdHJ1ZSwgaWQ6IGRldGFpbC5pZCB9IDogeyBba106IGZhbHNlLCBpZDogZGV0YWlsLmlkIH07XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IFtrXTogZGV0YWlsLnZhbHVlW2tdLCBpZDogZGV0YWlsLmlkIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9KSBhcyBGbGFnRGV0YWlsW11cbiAgICAgICAgICA6IG51bGwsXG4gICAgICAgIHZpc2liaWxpdHk6IHZhbHVlID8gdmFsdWVbJ3Zpc2liaWxpdHknXSA6IG51bGwsXG4gICAgICAgIGdyb3VwSWQ6IHZhbHVlID8gdmFsdWVbJ2dyb3VwSWQnXSA6IG51bGxcbiAgICAgIH0sXG4gICAgICBwYXRoVG9GbGFnc0Zvcm1Hcm91cCxcbiAgICAgIGNhc2VGaWVsZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgYWN0aXZlIGZsYWdzIGluIGEgYENhc2VGaWVsZGAgaW5zdGFuY2UsIHJlY3Vyc2luZyBhbmQgaXRlcmF0aW5nIHRocm91Z2ggc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggZmllbGQgb3IgZWFjaFxuICAgKiBmaWVsZCBpbiBhIENvbGxlY3Rpb24gZmllbGQuXG4gICAqXG4gICAqIEBwYXJhbSBhY3RpdmVDb3VudCBBbiBhY2N1bXVsYXRpb24gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmxhZ3NcbiAgICogQHBhcmFtIGNhc2VGaWVsZCBBIGBDYXNlRmllbGRgIGluc3RhbmNlIGZvciB3aGljaCB0byBjb3VudCB0aGUgYWN0aXZlIGZsYWdzXG4gICAqIEBwYXJhbSBjdXJyZW50VmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2JqZWN0IG9mIGEgYENhc2VGaWVsZGAgdGhhdCBpcyBhIHN1Yi1maWVsZCBvZiBhIG5vbiByb290LWxldmVsIENvbXBsZXggZmllbGQuXG4gICAqIChGb3IgQ29tcGxleCB0eXBlcywgb25seSB0aGUgX3Jvb3QtbGV2ZWxfIGBDYXNlRmllbGRgIGNvbnRhaW5zIGEgdmFsdWUgcHJvcGVydHkgLSBhbGwgc3ViLWZpZWxkcywgaW5jbHVkaW5nIGFueVxuICAgKiBuZXN0ZWQgQ29tcGxleCBmaWVsZHMsIGRvICpub3QqIGNvbnRhaW4gYW55IHZhbHVlcyB0aGVtc2VsdmVzLilcbiAgICogQHJldHVybnMgVGhlIGNvdW50IG9mIGFjdGl2ZSBmbGFnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb3VudEFjdGl2ZUZsYWdzSW5DYXNlRmllbGQoYWN0aXZlQ291bnQ6IG51bWJlciwgY2FzZUZpZWxkOiBDYXNlRmllbGQsIGN1cnJlbnRWYWx1ZT86IG9iamVjdCk6IG51bWJlciB7XG4gICAgY29uc3QgZmllbGRUeXBlID0gY2FzZUZpZWxkLmZpZWxkX3R5cGU7XG4gICAgc3dpdGNoIChmaWVsZFR5cGUudHlwZSkge1xuICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgIGlmIChGaWVsZHNVdGlscy5pc0ZsYWdzQ2FzZUZpZWxkKGNhc2VGaWVsZCkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgRmxhZ3MgQ2FzZUZpZWxkIGhhcyBhIHZhbHVlLCBpdCBpcyBhIHJvb3QtbGV2ZWwgQ29tcGxleCBmaWVsZDsgaWYgaXQgZG9lcyBub3QsIGl0IGlzIGEgRmxhZ3NcbiAgICAgICAgICAvLyBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYW5vdGhlciBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZSAoaWYgYW55KSBpbnN0ZWFkXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjYXNlRmllbGQudmFsdWUgPyBjYXNlRmllbGQudmFsdWUgOiBjdXJyZW50VmFsdWU7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QodmFsdWUpICYmIHZhbHVlLmRldGFpbHMpIHtcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50ID0gdmFsdWUuZGV0YWlscy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChjb3VudCwgZGV0YWlsKSA9PiBkZXRhaWwudmFsdWUuc3RhdHVzID09PSBDYXNlRmxhZ1N0YXR1cy5BQ1RJVkUgPyBjb3VudCArIDEgOiBjb3VudCxcbiAgICAgICAgICAgICAgYWN0aXZlQ291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FzZUZpZWxkLnZhbHVlID8gY2FzZUZpZWxkLnZhbHVlIDogY3VycmVudFZhbHVlO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiBGaWVsZHNVdGlscy5pc05vbkVtcHR5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgYWN0aXZlQ291bnQgPSBmaWVsZFR5cGUuY29tcGxleF9maWVsZHMucmVkdWNlKChhY3RpdmVGbGFnc0NvdW50T2ZDb21wbGV4RmllbGQsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50QWN0aXZlRmxhZ3NJbkNhc2VGaWVsZChcbiAgICAgICAgICAgICAgICBhY3RpdmVGbGFnc0NvdW50T2ZDb21wbGV4RmllbGQsXG4gICAgICAgICAgICAgICAgc3ViRmllbGQsXG4gICAgICAgICAgICAgICAgdmFsdWVbc3ViRmllbGQuaWRdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LCBhY3RpdmVDb3VudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gRm9yIGEgQ29sbGVjdGlvbiBmaWVsZCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGRpcmVjdGx5IGFzIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgQ2FzZUZpZWxkJ3MgdmFsdWUgcHJvcGVydHlcbiAgICAgIC8vIGFzIGFuIGFycmF5LCB1bmxlc3MgdGhlIGNvbGxlY3Rpb24gaXMgYSBzdWItZmllbGQgb2YgYSBDb21wbGV4IHR5cGUgLSBzdWItZmllbGRzIG5ldmVyIGNvbnRhaW4gdmFsdWVzXG4gICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgaWYgKEZpZWxkc1V0aWxzLmlzRmxhZ3NGaWVsZFR5cGUoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZSkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgQ29sbGVjdGlvbiBDYXNlRmllbGQgaGFzIGEgdmFsdWUgKGFuIGFycmF5KSwgaXQgaXMgYSByb290LWxldmVsIENvbGxlY3Rpb24gZmllbGQ7IGlmIGl0IGRvZXMgbm90LFxuICAgICAgICAgIC8vIGl0IGlzIGEgQ29sbGVjdGlvbiBDYXNlRmllbGQgdGhhdCBpcyBhIHN1Yi1maWVsZCB3aXRoaW4gYSBDb21wbGV4IGZpZWxkLCBzbyB1c2UgdGhlIGN1cnJlbnRWYWx1ZSB2YWx1ZVxuICAgICAgICAgIC8vIChpZiBhbnkpIGluc3RlYWRcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhc2VGaWVsZC52YWx1ZSA/IGNhc2VGaWVsZC52YWx1ZSA6IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW06IHsgaWQ6IHN0cmluZzsgdmFsdWU6IG9iamVjdDsgfSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZVsnZGV0YWlscyddKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlQ291bnQgPSBpdGVtLnZhbHVlWydkZXRhaWxzJ10ucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgKGNvdW50LCBkZXRhaWwpID0+IGRldGFpbC52YWx1ZS5zdGF0dXMgPT09IENhc2VGbGFnU3RhdHVzLkFDVElWRSA/IGNvdW50ICsgMSA6IGNvdW50LFxuICAgICAgICAgICAgICAgICAgYWN0aXZlQ291bnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgZmllbGRUeXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGlmIChjYXNlRmllbGQudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFBlcmZvcm0gYSByZWR1Y3Rpb24gb3ZlciBlYWNoIENvbXBsZXggZmllbGQncyBzdWItZmllbGRzIChzaW1pbGFyIHRvIHdoYXQgaXMgZG9uZSBhYm92ZSBmb3Igbm9uLUZsYWdzXG4gICAgICAgICAgICAvLyBDb21wbGV4IGZpZWxkcylcbiAgICAgICAgICAgIC8vIChDYW5ub3QganVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gcmVjdXJzaXZlbHkgZm9yIGVhY2ggQ29tcGxleCBmaWVsZCBpbiB0aGUgY29sbGVjdGlvbiBiZWNhdXNlIHRoZSBDYXNlRmllbGRcbiAgICAgICAgICAgIC8vIGZvciBlYWNoIG9uZSBpcyBub3QgcGFydCBvZiB0aGUgY29sbGVjdGlvbilcbiAgICAgICAgICAgIGNhc2VGaWVsZC52YWx1ZS5mb3JFYWNoKChpdGVtOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBvYmplY3Q7IH0pID0+IHtcbiAgICAgICAgICAgICAgYWN0aXZlQ291bnQgPSBmaWVsZFR5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoYWN0aXZlRmxhZ3NDb3VudE9mQ29tcGxleEZpZWxkLCBzdWJGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRBY3RpdmVGbGFnc0luQ2FzZUZpZWxkKGFjdGl2ZUZsYWdzQ291bnRPZkNvbXBsZXhGaWVsZCwgc3ViRmllbGQsIGl0ZW0udmFsdWVbc3ViRmllbGQuaWRdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNvdW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBmaWVsZCB0eXBlc1xuICAgIH1cbiAgICByZXR1cm4gYWN0aXZlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VGb3JGbGFnTGF1bmNoZXJDYXNlRmllbGQoY2FzZUZpZWxkOiBDYXNlRmllbGQpOiBzdHJpbmcge1xuICAgIHN3aXRjaChjYXNlRmllbGQuZGlzcGxheV9jb250ZXh0X3BhcmFtZXRlcikge1xuICAgICAgY2FzZSBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLkNSRUFURTpcbiAgICAgIGNhc2UgQ2FzZUZsYWdEaXNwbGF5Q29udGV4dFBhcmFtZXRlci5DUkVBVEVfMl9QT0lOVF8xOlxuICAgICAgICByZXR1cm4gJ1BsZWFzZSBzZWxlY3QgTmV4dCB0byBjb21wbGV0ZSB0aGUgY3JlYXRpb24gb2YgdGhlIGNhc2UgZmxhZyc7XG4gICAgICBjYXNlIENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuQ1JFQVRFX0VYVEVSTkFMOlxuICAgICAgICByZXR1cm4gJ1BsZWFzZSBzZWxlY3QgTmV4dCB0byBjb21wbGV0ZSB0aGUgY3JlYXRpb24gb2YgdGhlIHN1cHBvcnQgcmVxdWVzdCc7XG4gICAgICBjYXNlIENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuVVBEQVRFOlxuICAgICAgY2FzZSBDYXNlRmxhZ0Rpc3BsYXlDb250ZXh0UGFyYW1ldGVyLlVQREFURV8yX1BPSU5UXzE6XG4gICAgICAgIHJldHVybiAnUGxlYXNlIHNlbGVjdCBOZXh0IHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgb2YgdGhlIHNlbGVjdGVkIGNhc2UgZmxhZyc7XG4gICAgICBjYXNlIENhc2VGbGFnRGlzcGxheUNvbnRleHRQYXJhbWV0ZXIuVVBEQVRFX0VYVEVSTkFMOlxuICAgICAgICByZXR1cm4gJ1BsZWFzZSBzZWxlY3QgTmV4dCB0byBjb21wbGV0ZSB0aGUgdXBkYXRlIG9mIHRoZSBzZWxlY3RlZCBzdXBwb3J0IHJlcXVlc3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidWlsZENhblNob3dQcmVkaWNhdGUoZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyLCBmb3JtOiBhbnkpOiBQcmVkaWNhdGU8V2l6YXJkUGFnZT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudEV2ZW50U3RhdGUoZXZlbnRUcmlnZ2VyLCBmb3JtKTtcbiAgICByZXR1cm4gKHBhZ2U6IFdpemFyZFBhZ2UpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBwYWdlLnBhcnNlZFNob3dDb25kaXRpb24ubWF0Y2goY3VycmVudFN0YXRlKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlcjogeyBjYXNlX2ZpZWxkczogQ2FzZUZpZWxkW10gfSwgZm9ybTogRm9ybUdyb3VwKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZUNhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGV2ZW50VHJpZ2dlci5jYXNlX2ZpZWxkcywgZm9ybS5jb250cm9sc1snZGF0YSddLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZUNhc2VGaWVsZChvYmo6IGFueSk6IENhc2VGaWVsZCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IENhc2VGaWVsZCgpLCBvYmopO1xuICB9XG5cbiAgcHVibGljIG1lcmdlQ2FzZUZpZWxkc0FuZEZvcm1GaWVsZHMoY2FzZUZpZWxkczogQ2FzZUZpZWxkW10sIGZvcm1GaWVsZHM6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VGaWVsZHMoY2FzZUZpZWxkcywgZm9ybUZpZWxkcywgRmllbGRzVXRpbHMuREVGQVVMVF9NRVJHRV9GVU5DVElPTik7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2VMYWJlbENhc2VGaWVsZHNBbmRGb3JtRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLm1lcmdlRmllbGRzKGNhc2VGaWVsZHMsIGZvcm1GaWVsZHMsIEZpZWxkc1V0aWxzLkxBQkVMX01FUkdFX0ZVTkNUSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBjb250cm9sSXRlcmF0b3IoXG4gICAgYUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgICBmb3JtQXJyYXlGbjogKGFycmF5OiBGb3JtQXJyYXkpID0+IHZvaWQsXG4gICAgZm9ybUdyb3VwRm46IChncm91cDogRm9ybUdyb3VwKSA9PiB2b2lkLFxuICAgIGNvbnRyb2xGbjogKGNvbnRyb2w6IEZvcm1Db250cm9sKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmIChhQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkgeyAvLyBXZSdyZSBpbiBhIGNvbGxlY3Rpb25cbiAgICAgIGZvcm1BcnJheUZuKGFDb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGFDb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7IC8vIFdlJ3JlIGluIGEgY29tcGxleCB0eXBlLlxuICAgICAgZm9ybUdyb3VwRm4oYUNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoYUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkgeyAvLyBGb3JtQ29udHJvbFxuICAgICAgY29udHJvbEZuKGFDb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBmb3JtRmllbGRzOiBvYmplY3QsIG1lcmdlRnVuY3Rpb246IChmaWVsZDogQ2FzZUZpZWxkLCByZXN1bHQ6IG9iamVjdCkgPT4gdm9pZCk6IG9iamVjdCB7XG4gICAgY29uc3QgcmVzdWx0OiBvYmplY3QgPSBGaWVsZHNVdGlscy5jbG9uZU9iamVjdChmb3JtRmllbGRzKTtcbiAgICBjYXNlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgbWVyZ2VGdW5jdGlvbihmaWVsZCwgcmVzdWx0KTtcbiAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMgJiYgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdFtmaWVsZC5pZF0gPSB0aGlzLm1lcmdlRmllbGRzKGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIHJlc3VsdFtmaWVsZC5pZF0sIG1lcmdlRnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|