@po-ui/ng-templates 18.23.0 → 19.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/po-ui-ng-templates.mjs +139 -122
- package/fesm2022/po-ui-ng-templates.mjs.map +1 -1
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.d.ts +1 -1
- package/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.d.ts +1 -1
- package/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.d.ts +1 -1
- package/lib/components/po-page-blocked-user/po-page-blocked-user.component.d.ts +1 -1
- package/lib/components/po-page-change-password/po-page-change-password-base.component.d.ts +1 -1
- package/lib/components/po-page-change-password/po-page-change-password.service.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.d.ts +1 -1
- package/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.d.ts +2 -2
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.d.ts +1 -1
- package/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.d.ts +1 -1
- package/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.d.ts +2 -2
- package/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.d.ts +2 -2
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.d.ts +1 -1
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.d.ts +2 -2
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.d.ts +1 -1
- package/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.d.ts +1 -1
- package/lib/components/po-page-login/po-page-login-base.component.d.ts +1 -1
- package/lib/components/po-page-login/po-page-login.service.d.ts +1 -1
- package/package.json +13 -15
- package/po-ui-ng-templates-19.0.0-next.0.tgz +0 -0
- package/schematics/ng-add/index.js +2 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-blocked-user/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-blocked-user/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-blocked-user/index.js +1 -1
- package/schematics/ng-generate/po-page-blocked-user/index.js.map +1 -1
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-change-password/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-change-password/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-change-password/index.js +1 -1
- package/schematics/ng-generate/po-page-change-password/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-detail/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-detail/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-detail/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-edit/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-edit/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-edit/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-search/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-search/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-search/index.js.map +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-dynamic-table/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-dynamic-table/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.js +1 -1
- package/schematics/ng-generate/po-page-dynamic-table/index.js.map +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-job-scheduler/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-job-scheduler/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.js +1 -1
- package/schematics/ng-generate/po-page-job-scheduler/index.js.map +1 -1
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -2
- package/schematics/ng-generate/po-page-login/files/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +2 -1
- package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.spec.ts.template +4 -3
- package/schematics/ng-generate/po-page-login/files-standalone/__path__/__name@dasherize__/__name@dasherize__.component.ts.template +0 -1
- package/schematics/ng-generate/po-page-login/index.js +1 -1
- package/schematics/ng-generate/po-page-login/index.js.map +1 -1
- package/esm2022/lib/components/components.module.mjs +0 -84
- package/esm2022/lib/components/index.mjs +0 -12
- package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-modal-content.enum.mjs +0 -17
- package/esm2022/lib/components/po-modal-password-recovery/enums/po-modal-password-recovery-type.enum.mjs +0 -17
- package/esm2022/lib/components/po-modal-password-recovery/index.mjs +0 -8
- package/esm2022/lib/components/po-modal-password-recovery/interfaces/po-modal-password-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-modal-password-recovery/literals/i18n/po-modal-password-recovery-literals.mjs +0 -119
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-base.component.mjs +0 -293
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery-error-message/po-modal-password-recovery-error-message.component.mjs +0 -34
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.component.mjs +0 -451
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.module.mjs +0 -29
- package/esm2022/lib/components/po-modal-password-recovery/po-modal-password-recovery.service.mjs +0 -18
- package/esm2022/lib/components/po-page-background/index.mjs +0 -3
- package/esm2022/lib/components/po-page-background/po-page-background.component.mjs +0 -191
- package/esm2022/lib/components/po-page-background/po-page-background.module.mjs +0 -27
- package/esm2022/lib/components/po-page-blocked-user/enums/po-page-blocked-user-reason.enum.mjs +0 -17
- package/esm2022/lib/components/po-page-blocked-user/index.mjs +0 -8
- package/esm2022/lib/components/po-page-blocked-user/interfaces/po-page-blocked-user-reason-params.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-blocked-user/literals/i18n/po-page-blocked-user-literals.mjs +0 -78
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-base.component.mjs +0 -197
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-contacts/po-page-blocked-user-contacts.component.mjs +0 -105
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user-reason/po-page-blocked-user-reason.component.mjs +0 -107
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.component.mjs +0 -108
- package/esm2022/lib/components/po-page-blocked-user/po-page-blocked-user.module.mjs +0 -29
- package/esm2022/lib/components/po-page-change-password/index.mjs +0 -7
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password-requirement.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/interfaces/po-page-change-password.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-change-password/literals/i18n/po-page-change-password-literals.mjs +0 -79
- package/esm2022/lib/components/po-page-change-password/po-page-change-password-base.component.mjs +0 -300
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.component.mjs +0 -401
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.module.mjs +0 -30
- package/esm2022/lib/components/po-page-change-password/po-page-change-password.service.mjs +0 -18
- package/esm2022/lib/components/po-page-dynamic-detail/index.mjs +0 -10
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-back.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-edit.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-before-remove.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/interfaces/po-page-dynamic-detail-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail-actions.service.mjs +0 -44
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.component.mjs +0 -546
- package/esm2022/lib/components/po-page-dynamic-detail/po-page-dynamic-detail.module.mjs +0 -54
- package/esm2022/lib/components/po-page-dynamic-edit/index.mjs +0 -11
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-cancel.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save-new.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-before-save.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/interfaces/po-page-dynamic-edit-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit-actions.service.mjs +0 -44
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.mjs +0 -889
- package/esm2022/lib/components/po-page-dynamic-edit/po-page-dynamic-edit.module.mjs +0 -60
- package/esm2022/lib/components/po-page-dynamic-search/index.mjs +0 -7
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-base.component.mjs +0 -133
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-advanced-filter/po-advanced-filter.component.mjs +0 -76
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-base.component.mjs +0 -365
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-filters.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.component.mjs +0 -349
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-search/po-page-dynamic-search.module.mjs +0 -52
- package/esm2022/lib/components/po-page-dynamic-table/index.mjs +0 -16
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-actions.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-detail.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-duplicate.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-edit.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-new.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove-all.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-before-remove.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-action.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-custom-table-action.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-filters.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-metadata.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/interfaces/po-page-dynamic-table-options.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-list-base.component.mjs +0 -271
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-actions.service.mjs +0 -59
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table-literals.mjs +0 -63
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.component.mjs +0 -1257
- package/esm2022/lib/components/po-page-dynamic-table/po-page-dynamic-table.module.mjs +0 -50
- package/esm2022/lib/components/po-page-job-scheduler/index.mjs +0 -6
- package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler-internal.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/interfaces/po-job-scheduler.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-base.component.mjs +0 -302
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-execution/po-page-job-scheduler-execution.component.mjs +0 -393
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-internal.mjs +0 -13
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-literals.mjs +0 -195
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-lookup.service.mjs +0 -22
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-job-scheduler-parameters-template/po-job-scheduler-parameters-template.directive.mjs +0 -92
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-parameters/po-page-job-scheduler-parameters.component.mjs +0 -79
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/index.mjs +0 -2
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-job-scheduler-summary-template/po-job-scheduler-summary-template.directive.mjs +0 -44
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler-summary/po-page-job-scheduler-summary.component.mjs +0 -211
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.component.mjs +0 -418
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.module.mjs +0 -85
- package/esm2022/lib/components/po-page-job-scheduler/po-page-job-scheduler.service.mjs +0 -224
- package/esm2022/lib/components/po-page-login/enums/po-page-login-authentication-type.enum.mjs +0 -15
- package/esm2022/lib/components/po-page-login/index.mjs +0 -8
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-custom-field.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-literals.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login-recovery.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/interfaces/po-page-login.interface.mjs +0 -2
- package/esm2022/lib/components/po-page-login/po-page-login-base.component.mjs +0 -1099
- package/esm2022/lib/components/po-page-login/po-page-login-popover/po-page-login-popover.component.mjs +0 -137
- package/esm2022/lib/components/po-page-login/po-page-login.component.mjs +0 -483
- package/esm2022/lib/components/po-page-login/po-page-login.module.mjs +0 -31
- package/esm2022/lib/components/po-page-login/po-page-login.service.mjs +0 -32
- package/esm2022/lib/index.mjs +0 -4
- package/esm2022/lib/po-templates.module.mjs +0 -18
- package/esm2022/lib/services/index.mjs +0 -4
- package/esm2022/lib/services/po-page-customization/index.mjs +0 -4
- package/esm2022/lib/services/po-page-customization/po-page-customization.module.mjs +0 -23
- package/esm2022/lib/services/po-page-customization/po-page-customization.service.mjs +0 -86
- package/esm2022/lib/services/po-page-customization/po-page-dynamic-options.interface.mjs +0 -2
- package/esm2022/lib/services/po-page-dynamic/index.mjs +0 -3
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic-literals.interface.mjs +0 -2
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.module.mjs +0 -23
- package/esm2022/lib/services/po-page-dynamic/po-page-dynamic.service.mjs +0 -106
- package/esm2022/lib/services/services.module.mjs +0 -18
- package/esm2022/lib/utils/util.mjs +0 -428
- package/esm2022/po-ui-ng-templates.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
- package/po-ui-ng-templates-18.23.0.tgz +0 -0
|
@@ -1,889 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import { Observable, concat, of, EMPTY, throwError } from 'rxjs';
|
|
3
|
-
import { tap, catchError, map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { poLocaleDefault } from '@po-ui/ng-components';
|
|
5
|
-
import { convertToBoolean, mapObjectByProperties, valuesFromObject, removeKeysProperties } from './../../utils/util';
|
|
6
|
-
import { PoPageDynamicService } from '../../services/po-page-dynamic/po-page-dynamic.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/router";
|
|
9
|
-
import * as i2 from "@po-ui/ng-components";
|
|
10
|
-
import * as i3 from "../../services/po-page-dynamic/po-page-dynamic.service";
|
|
11
|
-
import * as i4 from "../../services/po-page-customization/po-page-customization.service";
|
|
12
|
-
import * as i5 from "./po-page-dynamic-edit-actions.service";
|
|
13
|
-
import * as i6 from "@angular/common";
|
|
14
|
-
const _c0 = ["dynamicForm"];
|
|
15
|
-
const _c1 = ["gridDetail"];
|
|
16
|
-
function PoPageDynamicEditComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {
|
|
17
|
-
i0.ɵɵelementContainer(0);
|
|
18
|
-
} }
|
|
19
|
-
function PoPageDynamicEditComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
20
|
-
i0.ɵɵelementStart(0, "po-widget");
|
|
21
|
-
i0.ɵɵelement(1, "po-icon", 6);
|
|
22
|
-
i0.ɵɵelementStart(2, "span", 7);
|
|
23
|
-
i0.ɵɵtext(3);
|
|
24
|
-
i0.ɵɵelementEnd()();
|
|
25
|
-
} if (rf & 2) {
|
|
26
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
27
|
-
i0.ɵɵadvance(3);
|
|
28
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.literals.registerNotFound, " ");
|
|
29
|
-
} }
|
|
30
|
-
function PoPageDynamicEditComponent_ng_template_4_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
-
const _r2 = i0.ɵɵgetCurrentView();
|
|
32
|
-
i0.ɵɵelementStart(0, "div", 10);
|
|
33
|
-
i0.ɵɵelement(1, "po-divider", 11);
|
|
34
|
-
i0.ɵɵelementStart(2, "div", 12)(3, "po-button", 13);
|
|
35
|
-
i0.ɵɵlistener("p-click", function PoPageDynamicEditComponent_ng_template_4_div_2_Template_po_button_p_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.detailActionNew()); });
|
|
36
|
-
i0.ɵɵelementEnd()();
|
|
37
|
-
i0.ɵɵelement(4, "po-grid", 14, 3);
|
|
38
|
-
i0.ɵɵelementEnd();
|
|
39
|
-
} if (rf & 2) {
|
|
40
|
-
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
41
|
-
i0.ɵɵadvance();
|
|
42
|
-
i0.ɵɵproperty("p-label", ctx_r0.detailFields[0].divider);
|
|
43
|
-
i0.ɵɵadvance(2);
|
|
44
|
-
i0.ɵɵproperty("p-label", ctx_r0.literals.detailActionNew);
|
|
45
|
-
i0.ɵɵadvance();
|
|
46
|
-
i0.ɵɵproperty("p-row-actions", ctx_r0.detailActions)("p-columns", ctx_r0.detailFields[0].detail.columns)("p-data", ctx_r0.model[ctx_r0.detailFields[0].property]);
|
|
47
|
-
} }
|
|
48
|
-
function PoPageDynamicEditComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
-
i0.ɵɵelement(0, "po-dynamic-form", 8, 2);
|
|
50
|
-
i0.ɵɵtemplate(2, PoPageDynamicEditComponent_ng_template_4_div_2_Template, 6, 5, "div", 9);
|
|
51
|
-
} if (rf & 2) {
|
|
52
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
53
|
-
i0.ɵɵproperty("p-fields", ctx_r0.controlFields)("p-value", ctx_r0.model);
|
|
54
|
-
i0.ɵɵadvance(2);
|
|
55
|
-
i0.ɵɵproperty("ngIf", ctx_r0.detailFields.length > 0);
|
|
56
|
-
} }
|
|
57
|
-
export const poNotificationType = ['error', 'warning'];
|
|
58
|
-
export const poNotificationTypeDefault = 'warning';
|
|
59
|
-
export const poPageDynamicEditLiteralsDefault = {
|
|
60
|
-
en: {
|
|
61
|
-
cancelConfirmMessage: 'Are you sure you want to cancel this operation?',
|
|
62
|
-
detailActionNew: 'New',
|
|
63
|
-
pageActionCancel: 'Cancel',
|
|
64
|
-
pageActionSave: 'Save',
|
|
65
|
-
pageActionSaveNew: 'Save and new',
|
|
66
|
-
registerNotFound: 'Register not found.',
|
|
67
|
-
saveNotificationError: 'Mandatory field(s) not filled.',
|
|
68
|
-
saveNotificationSuccessSave: 'Resource successfully saved.',
|
|
69
|
-
saveNotificationSuccessUpdate: 'Resource successfully updated.',
|
|
70
|
-
saveNotificationWarning: 'Form must be filled out correctly.'
|
|
71
|
-
},
|
|
72
|
-
es: {
|
|
73
|
-
cancelConfirmMessage: 'Está seguro de que desea cancelar esta operación?',
|
|
74
|
-
detailActionNew: 'Nuevo',
|
|
75
|
-
pageActionCancel: 'Cancelar',
|
|
76
|
-
pageActionSave: 'Guardar',
|
|
77
|
-
pageActionSaveNew: 'Guardar y nuevo',
|
|
78
|
-
registerNotFound: 'Registro no encontrado.',
|
|
79
|
-
saveNotificationError: 'Campo(s) obligatorio(s) no completado(s).',
|
|
80
|
-
saveNotificationSuccessSave: 'Recurso salvo con éxito.',
|
|
81
|
-
saveNotificationSuccessUpdate: 'Recurso actualizado con éxito.',
|
|
82
|
-
saveNotificationWarning: 'El formulario debe llenarse correctamente.'
|
|
83
|
-
},
|
|
84
|
-
pt: {
|
|
85
|
-
cancelConfirmMessage: 'Tem certeza que deseja cancelar esta operação?',
|
|
86
|
-
detailActionNew: 'Novo',
|
|
87
|
-
pageActionCancel: 'Cancelar',
|
|
88
|
-
pageActionSave: 'Salvar',
|
|
89
|
-
pageActionSaveNew: 'Salvar e novo',
|
|
90
|
-
registerNotFound: 'Registro não encontrado.',
|
|
91
|
-
saveNotificationError: 'Campo(s) obrigatório(s) sem preenchimento.',
|
|
92
|
-
saveNotificationSuccessSave: 'Recurso salvo com sucesso.',
|
|
93
|
-
saveNotificationSuccessUpdate: 'Recurso atualizado com sucesso.',
|
|
94
|
-
saveNotificationWarning: 'Formulário precisa ser preenchido corretamente.'
|
|
95
|
-
},
|
|
96
|
-
ru: {
|
|
97
|
-
cancelConfirmMessage: 'Вы уверены, что хотите отменить эту операцию?',
|
|
98
|
-
detailActionNew: 'Новый',
|
|
99
|
-
pageActionCancel: 'Отменить',
|
|
100
|
-
pageActionSave: 'Сохранить',
|
|
101
|
-
pageActionSaveNew: 'Сохранить и создать',
|
|
102
|
-
registerNotFound: 'Запись не найдена.',
|
|
103
|
-
saveNotificationError: 'Обязательное поле(я) не заполнено.',
|
|
104
|
-
saveNotificationSuccessSave: 'Ресурс успешно сохранен.',
|
|
105
|
-
saveNotificationSuccessUpdate: 'Ресурс успешно обновлен.',
|
|
106
|
-
saveNotificationWarning: 'Форма должна быть заполнена правильно.'
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* @description
|
|
111
|
-
*
|
|
112
|
-
* O `po-page-dynamic-edit` é uma página que pode servir para editar ou criar novos registros,
|
|
113
|
-
* o mesmo também suporta metadados conforme especificado na documentação.
|
|
114
|
-
*
|
|
115
|
-
* ### Utilização via rota
|
|
116
|
-
*
|
|
117
|
-
* Ao utilizar as rotas para inicializar o template, o `page-dynamic-edit` disponibiliza propriedades que devem ser fornecidas no arquivo de configuração de rotas da aplicação, para
|
|
118
|
-
* poder especificar o endpoint dos dados e dos metadados que serão carregados na inicialização.
|
|
119
|
-
*
|
|
120
|
-
* Exemplo de utilização:
|
|
121
|
-
*
|
|
122
|
-
* Arquivo de configuração de rotas da aplicação: `app-routing.module.ts`
|
|
123
|
-
* ```
|
|
124
|
-
* const routes: Routes = [
|
|
125
|
-
* {
|
|
126
|
-
* path: 'people',
|
|
127
|
-
* component: PoPageDynamicEditComponent,
|
|
128
|
-
* data: {
|
|
129
|
-
* serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
|
|
130
|
-
* serviceMetadataApi: 'http://localhost:3000/v1/metadata', // endpoint dos metadados utilizando o método HTTP Get
|
|
131
|
-
* serviceLoadApi: 'http://localhost:3000/load-metadata' // endpoint de customizações dos metadados utilizando o método HTTP Post
|
|
132
|
-
* }
|
|
133
|
-
* },
|
|
134
|
-
* {
|
|
135
|
-
* path: 'home',
|
|
136
|
-
* component: HomeExampleComponent
|
|
137
|
-
* }
|
|
138
|
-
* ];
|
|
139
|
-
*
|
|
140
|
-
* ```
|
|
141
|
-
* O componente primeiro irá carregar o metadado da rota definida na propriedade serviceMetadataApi
|
|
142
|
-
* e depois irá buscar da rota definida na propriedade serviceLoadApi.
|
|
143
|
-
*
|
|
144
|
-
* A requisição dos metadados é feita na inicialização do template para buscar os metadados da página passando o
|
|
145
|
-
* tipo do metadado esperado e a versão cacheada pelo browser.
|
|
146
|
-
*
|
|
147
|
-
* > Caso o servidor retornar um erro ao recuperar os metadados, serão repassados os metadados salvos em cache,
|
|
148
|
-
* se o cache não existir será disparada uma notificação.
|
|
149
|
-
*
|
|
150
|
-
* Para carregar com um recurso já existente, deve-se ser incluído um parâmetro na rota chamado `id`:
|
|
151
|
-
*
|
|
152
|
-
* ```
|
|
153
|
-
* {
|
|
154
|
-
* path: 'people/:id',
|
|
155
|
-
* component: PoPageDynamicEditComponent,
|
|
156
|
-
* data: {
|
|
157
|
-
* serviceApi: 'http://localhost:3000/v1/people', // endpoint dos dados
|
|
158
|
-
* serviceMetadataApi: 'http://localhost:3000/v1/metadata', // endpoint dos metadados
|
|
159
|
-
* serviceLoadApi: 'http://localhost:3000/load-metadata' // endpoint de customizações dos metadados
|
|
160
|
-
* }
|
|
161
|
-
* }
|
|
162
|
-
* ```
|
|
163
|
-
*
|
|
164
|
-
* A requisição dos metadados é feita na inicialização do template para buscar os metadados da página passando o
|
|
165
|
-
* tipo do metadado esperado e a versão cacheada pelo browser.
|
|
166
|
-
*
|
|
167
|
-
* O formato esperado na resposta da requisição está especificado na interface
|
|
168
|
-
* [PoPageDynamicEditMetadata](/documentation/po-page-dynamic-edit#po-page-dynamic-edit-metadata). Por exemplo:
|
|
169
|
-
*
|
|
170
|
-
* ```
|
|
171
|
-
* {
|
|
172
|
-
* version: 1,
|
|
173
|
-
* title: 'Person edit',
|
|
174
|
-
* fields: [
|
|
175
|
-
* { property: 'id', key: true, disabled: true },
|
|
176
|
-
* { property: 'status' },
|
|
177
|
-
* { property: 'name' },
|
|
178
|
-
* { property: 'nickname' },
|
|
179
|
-
* { property: 'birthdate', label: 'Birth date' },
|
|
180
|
-
* { property: 'genre' },
|
|
181
|
-
* { property: 'city' },
|
|
182
|
-
* { property: 'country' }
|
|
183
|
-
* ]
|
|
184
|
-
* }
|
|
185
|
-
* ```
|
|
186
|
-
*
|
|
187
|
-
* > Caso o endpoint dos metadados não seja especificado, será feito uma requisição utilizando o `serviceApi` da seguinte forma:
|
|
188
|
-
* ```
|
|
189
|
-
* GET {end-point}/metadata?type=edit&version={version}
|
|
190
|
-
* ```
|
|
191
|
-
*
|
|
192
|
-
* @example
|
|
193
|
-
*
|
|
194
|
-
* <example name="po-page-dynamic-edit-basic" title="PO Page Dynamic Edit Basic">
|
|
195
|
-
* <file name="sample-po-page-dynamic-edit-basic/sample-po-page-dynamic-edit-basic.component.html"> </file>
|
|
196
|
-
* <file name="sample-po-page-dynamic-edit-basic/sample-po-page-dynamic-edit-basic.component.ts"> </file>
|
|
197
|
-
* </example>
|
|
198
|
-
*
|
|
199
|
-
* <example name="po-page-dynamic-edit-user" title="PO Page Dynamic Edit - User">
|
|
200
|
-
* <file name="sample-po-page-dynamic-edit-user/sample-po-page-dynamic-edit-user.component.html"> </file>
|
|
201
|
-
* <file name="sample-po-page-dynamic-edit-user/sample-po-page-dynamic-edit-user.component.ts"> </file>
|
|
202
|
-
* </example>
|
|
203
|
-
*/
|
|
204
|
-
export class PoPageDynamicEditComponent {
|
|
205
|
-
router;
|
|
206
|
-
activatedRoute;
|
|
207
|
-
poNotification;
|
|
208
|
-
poDialogService;
|
|
209
|
-
poPageDynamicService;
|
|
210
|
-
poPageCustomizationService;
|
|
211
|
-
poPageDynamicEditActionsService;
|
|
212
|
-
dynamicForm;
|
|
213
|
-
gridDetail;
|
|
214
|
-
/** Objeto com propriedades do breadcrumb. */
|
|
215
|
-
breadcrumb = { items: [] };
|
|
216
|
-
/**
|
|
217
|
-
* @description
|
|
218
|
-
*
|
|
219
|
-
* Endpoint usado pelo template para requisição do recurso que será exibido para edição.
|
|
220
|
-
*
|
|
221
|
-
* Para as ações de `save` e `saveNew`, será feito uma requisição de criação nesse mesmo endpoint passando os valores
|
|
222
|
-
* preenchidos pelo usuário via payload.
|
|
223
|
-
*
|
|
224
|
-
* > `POST {end-point}`
|
|
225
|
-
*
|
|
226
|
-
* ```
|
|
227
|
-
* <po-page-dynamic-edit
|
|
228
|
-
* [p-actions]="{ save: '/', saveNew: 'new' }"
|
|
229
|
-
* [p-fields]="[ { property: 'name' }, { property: 'city' } ]"
|
|
230
|
-
* p-service="/api/po-samples/v1/people"
|
|
231
|
-
* ...>
|
|
232
|
-
* </po-page-dynamic-edit>
|
|
233
|
-
* ```
|
|
234
|
-
*
|
|
235
|
-
* Resquisição disparada, onde a propriedade `name` e `city` foram preenchidas:
|
|
236
|
-
*
|
|
237
|
-
* ```
|
|
238
|
-
* POST /api/po-samples/v1/people HTTP/1.1
|
|
239
|
-
* Host: localhost:4000
|
|
240
|
-
* Connection: keep-alive
|
|
241
|
-
* Accept: application/json, text/plain
|
|
242
|
-
* ...
|
|
243
|
-
* ```
|
|
244
|
-
*
|
|
245
|
-
* Request payload:
|
|
246
|
-
*
|
|
247
|
-
* ```
|
|
248
|
-
* { "name": "Fulano", "city": "Smallville" }
|
|
249
|
-
* ```
|
|
250
|
-
*
|
|
251
|
-
* Caso queira que o template carregue um recurso já existente, deve-se ser incluído um parametro na rota chamado `id`.
|
|
252
|
-
*
|
|
253
|
-
* Exemplo de configuração de rota:
|
|
254
|
-
*
|
|
255
|
-
* ```
|
|
256
|
-
* RouterModule.forRoot([
|
|
257
|
-
* ...
|
|
258
|
-
* { path: 'edit/:id', component: PersonEditComponent },
|
|
259
|
-
* ...
|
|
260
|
-
* ],
|
|
261
|
-
* ```
|
|
262
|
-
*
|
|
263
|
-
* Baseado nisso, na inicialização do template, será disparado uma requisição para buscar o recurso que será editado.
|
|
264
|
-
*
|
|
265
|
-
* > `GET {end-point}/{id}`
|
|
266
|
-
*
|
|
267
|
-
* Nos métodos de `save` e `saveNew`, ao invés de um `POST`, será disparado um `PUT`.
|
|
268
|
-
*
|
|
269
|
-
* Resquisição disparada, onde a propriedade `name` e `city` foram preenchidas / atualizadas, e o `id` da url é 2:
|
|
270
|
-
*
|
|
271
|
-
* ```
|
|
272
|
-
* PUT /api/po-samples/v1/people/2 HTTP/1.1
|
|
273
|
-
* Host: localhost:4000
|
|
274
|
-
* Connection: keep-alive
|
|
275
|
-
* Accept: application/json, text/plain
|
|
276
|
-
* ...
|
|
277
|
-
* ```
|
|
278
|
-
*
|
|
279
|
-
* Request payload:
|
|
280
|
-
*
|
|
281
|
-
* ```
|
|
282
|
-
* { "name": "Fulano", "city": "Metropolis" }
|
|
283
|
-
* ```
|
|
284
|
-
*/
|
|
285
|
-
serviceApi;
|
|
286
|
-
/** Título da página. */
|
|
287
|
-
title;
|
|
288
|
-
/**
|
|
289
|
-
* Função ou serviço que será executado na inicialização do componente.
|
|
290
|
-
*
|
|
291
|
-
* A propriedade aceita os seguintes tipos:
|
|
292
|
-
* - `string`: *Endpoint* usado pelo componente para requisição via `POST`.
|
|
293
|
-
* - `function`: Método que será executado.
|
|
294
|
-
*
|
|
295
|
-
* O retorno desta função deve ser do tipo `PoPageDynamicEditOptions`,
|
|
296
|
-
* onde o usuário poderá customizar novos campos, breadcrumb, title e actions
|
|
297
|
-
*
|
|
298
|
-
* Por exemplo:
|
|
299
|
-
*
|
|
300
|
-
* ```
|
|
301
|
-
* getPageOptions(): PoPageDynamicEditOptions {
|
|
302
|
-
* return {
|
|
303
|
-
* actions:
|
|
304
|
-
* { cancel: false, save: 'save/:id', saveNew: 'saveNew' },
|
|
305
|
-
* fields: [
|
|
306
|
-
* { property: 'idCard', gridColumns: 6 }
|
|
307
|
-
* ]
|
|
308
|
-
* };
|
|
309
|
-
* }
|
|
310
|
-
*
|
|
311
|
-
* ```
|
|
312
|
-
* Para referenciar a sua função utilize a propriedade `bind`, por exemplo:
|
|
313
|
-
* ```
|
|
314
|
-
* [p-load]="onLoadOptions.bind(this)"
|
|
315
|
-
* ```
|
|
316
|
-
*/
|
|
317
|
-
onLoad;
|
|
318
|
-
/**
|
|
319
|
-
* @optional
|
|
320
|
-
*
|
|
321
|
-
* @description
|
|
322
|
-
*
|
|
323
|
-
* Função que será executada após ser realizada a busca dos dados.
|
|
324
|
-
*
|
|
325
|
-
* A propriedade aceita os seguintes tipos:
|
|
326
|
-
* - `function`: Método que será executado.
|
|
327
|
-
*
|
|
328
|
-
* Esta função passa por parâmetro o model e deve recebê-lo de volta com as alterações.
|
|
329
|
-
* Também aceita o retorno de um Observable com o novo model.
|
|
330
|
-
*
|
|
331
|
-
* Por exemplo:
|
|
332
|
-
*
|
|
333
|
-
* ```
|
|
334
|
-
* onLoadCustom(model) {
|
|
335
|
-
* return { ...model, customField: 'newValue' };
|
|
336
|
-
* }
|
|
337
|
-
*
|
|
338
|
-
* ```
|
|
339
|
-
* Para referenciar a sua função utilize a propriedade `bind`, por exemplo:
|
|
340
|
-
* ```
|
|
341
|
-
* [p-load-data]="onLoadCustom.bind(this)"
|
|
342
|
-
* ```
|
|
343
|
-
*/
|
|
344
|
-
onLoadData;
|
|
345
|
-
model = {};
|
|
346
|
-
// beforeSave: return boolean
|
|
347
|
-
// afterSave
|
|
348
|
-
// beforeRemove: return boolean
|
|
349
|
-
// afterRemove
|
|
350
|
-
// beforeInsert: : return boolean
|
|
351
|
-
detailActions = {};
|
|
352
|
-
indexFocus = 0;
|
|
353
|
-
language;
|
|
354
|
-
subscriptions = [];
|
|
355
|
-
_actions = {};
|
|
356
|
-
_literals;
|
|
357
|
-
_autoRouter = false;
|
|
358
|
-
_controlFields = [];
|
|
359
|
-
_detailFields = [];
|
|
360
|
-
_duplicates = [];
|
|
361
|
-
_fields = [];
|
|
362
|
-
_keys = [];
|
|
363
|
-
_pageActions = [];
|
|
364
|
-
_notificationType = poNotificationTypeDefault;
|
|
365
|
-
/**
|
|
366
|
-
* @optional
|
|
367
|
-
*
|
|
368
|
-
* @description
|
|
369
|
-
*
|
|
370
|
-
* Ações da página.
|
|
371
|
-
*/
|
|
372
|
-
set actions(value) {
|
|
373
|
-
this._actions = this.isObject(value) ? value : {};
|
|
374
|
-
this._pageActions = this.getPageActions(this._actions);
|
|
375
|
-
}
|
|
376
|
-
get actions() {
|
|
377
|
-
return { ...this._actions };
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* @optional
|
|
381
|
-
*
|
|
382
|
-
* @description
|
|
383
|
-
*
|
|
384
|
-
* Objeto com as literais usadas no `po-page-dynamic-edit`.
|
|
385
|
-
*
|
|
386
|
-
* É possivel customizar passando um objeto com todas as literais disponíveis
|
|
387
|
-
* ou passando apenas as literais que deseja customizar
|
|
388
|
-
*
|
|
389
|
-
* ```
|
|
390
|
-
* const customLiterals: PoPageDynamicEditLiterals = {
|
|
391
|
-
* detailActionNew: 'Incluir',
|
|
392
|
-
* pageActionCancel: 'Descartar',
|
|
393
|
-
* pageActionSave: 'Gravar',
|
|
394
|
-
* pageActionSaveNew: 'Gravar e incluir',
|
|
395
|
-
* registerNotFound: 'Nenhum registro encontrado.',
|
|
396
|
-
* saveNotificationError: 'Campo(s) obrigatório(s) sem preenchimento.',
|
|
397
|
-
* saveNotificationSuccessSave: 'Item salvo com sucesso.',
|
|
398
|
-
* saveNotificationSuccessUpdate: 'Item atualizado com sucesso.',
|
|
399
|
-
* saveNotificationWarning: 'Necessário preencher o formulário corretamente.'
|
|
400
|
-
* };
|
|
401
|
-
* ```
|
|
402
|
-
*
|
|
403
|
-
* E para carregar as literais customizadas, basta apenas passar o objeto para o componente.
|
|
404
|
-
*
|
|
405
|
-
* ```
|
|
406
|
-
* <po-page-dynamic-edit
|
|
407
|
-
* [p-literals]="customLiterals">
|
|
408
|
-
* </po-page-dynamic-edit>
|
|
409
|
-
* ```
|
|
410
|
-
*
|
|
411
|
-
* > O valor padrão será traduzido de acordo com o idioma configurado no [`PoI18nService`](/documentation/po-i18n) ou *browser*.
|
|
412
|
-
*/
|
|
413
|
-
set literals(value) {
|
|
414
|
-
if (value instanceof Object && !(value instanceof Array)) {
|
|
415
|
-
this._literals = {
|
|
416
|
-
...poPageDynamicEditLiteralsDefault[poLocaleDefault],
|
|
417
|
-
...poPageDynamicEditLiteralsDefault[this.language],
|
|
418
|
-
...value
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
this._literals = poPageDynamicEditLiteralsDefault[this.language];
|
|
423
|
-
}
|
|
424
|
-
this._pageActions = this.getPageActions(this._actions);
|
|
425
|
-
}
|
|
426
|
-
get literals() {
|
|
427
|
-
return this._literals || poPageDynamicEditLiteralsDefault[this.language];
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* @optional
|
|
431
|
-
*
|
|
432
|
-
* @description
|
|
433
|
-
*
|
|
434
|
-
* Tipo da notificação.
|
|
435
|
-
*
|
|
436
|
-
* É possivel definir o tipo de notificação que será exibido quando houver algum campo inválido no formulário.
|
|
437
|
-
*
|
|
438
|
-
* ```
|
|
439
|
-
* <po-page-dynamic-edit
|
|
440
|
-
* p-notification-type="warning">
|
|
441
|
-
* </po-page-dynamic-edit>
|
|
442
|
-
* ```
|
|
443
|
-
*
|
|
444
|
-
* > Os valores aceitos são 'warning' e 'error'.
|
|
445
|
-
* @default warning
|
|
446
|
-
*/
|
|
447
|
-
set notificationType(value) {
|
|
448
|
-
this._notificationType = poNotificationType.includes(value) ? value : poNotificationTypeDefault;
|
|
449
|
-
}
|
|
450
|
-
get notificationType() {
|
|
451
|
-
return this._notificationType;
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* @todo Validar rotas na mão pois se existir uma rota '**' o catch do navigation não funciona.
|
|
455
|
-
*
|
|
456
|
-
* @optional
|
|
457
|
-
*
|
|
458
|
-
* @description
|
|
459
|
-
*
|
|
460
|
-
* Cria automaticamente as rotas de edição (novo/duplicate) e detalhes caso as ações
|
|
461
|
-
* estejam definidas nas ações.
|
|
462
|
-
*
|
|
463
|
-
* > Para o correto funcionamento não pode haver nenhum rota coringa (`**`) especificada.
|
|
464
|
-
*
|
|
465
|
-
* @default false
|
|
466
|
-
*/
|
|
467
|
-
set autoRouter(value) {
|
|
468
|
-
this._autoRouter = convertToBoolean(value);
|
|
469
|
-
}
|
|
470
|
-
get autoRouter() {
|
|
471
|
-
return this._autoRouter;
|
|
472
|
-
}
|
|
473
|
-
/** Lista dos campos usados na tabela e busca avançada. */
|
|
474
|
-
set fields(value) {
|
|
475
|
-
this._fields = Array.isArray(value) ? [...value] : [];
|
|
476
|
-
this._keys = this.getKeysByFields(this._fields);
|
|
477
|
-
this._duplicates = this.getDuplicatesByFields(this._fields);
|
|
478
|
-
this._controlFields = this.getControlFields(this._fields);
|
|
479
|
-
this._detailFields = this.getDetailFields(this._fields);
|
|
480
|
-
}
|
|
481
|
-
get fields() {
|
|
482
|
-
return this._fields;
|
|
483
|
-
}
|
|
484
|
-
constructor(router, activatedRoute, poNotification, poDialogService, poPageDynamicService, poPageCustomizationService, poPageDynamicEditActionsService, languageService) {
|
|
485
|
-
this.router = router;
|
|
486
|
-
this.activatedRoute = activatedRoute;
|
|
487
|
-
this.poNotification = poNotification;
|
|
488
|
-
this.poDialogService = poDialogService;
|
|
489
|
-
this.poPageDynamicService = poPageDynamicService;
|
|
490
|
-
this.poPageCustomizationService = poPageCustomizationService;
|
|
491
|
-
this.poPageDynamicEditActionsService = poPageDynamicEditActionsService;
|
|
492
|
-
this.language = languageService.getShortLanguage();
|
|
493
|
-
}
|
|
494
|
-
ngOnInit() {
|
|
495
|
-
this.loadDataFromAPI();
|
|
496
|
-
}
|
|
497
|
-
ngOnDestroy() {
|
|
498
|
-
if (this.subscriptions) {
|
|
499
|
-
this.subscriptions.forEach(subscription => {
|
|
500
|
-
subscription.unsubscribe();
|
|
501
|
-
});
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
detailActionNew() {
|
|
505
|
-
this.gridDetail.insertRow();
|
|
506
|
-
}
|
|
507
|
-
get duplicates() {
|
|
508
|
-
return [...this._duplicates];
|
|
509
|
-
}
|
|
510
|
-
get keys() {
|
|
511
|
-
return [...this._keys];
|
|
512
|
-
}
|
|
513
|
-
get pageActions() {
|
|
514
|
-
return [...this._pageActions];
|
|
515
|
-
}
|
|
516
|
-
get controlFields() {
|
|
517
|
-
return this._controlFields;
|
|
518
|
-
}
|
|
519
|
-
get detailFields() {
|
|
520
|
-
return this._detailFields;
|
|
521
|
-
}
|
|
522
|
-
loadDataFromAPI() {
|
|
523
|
-
const { serviceApi: serviceApiFromRoute, serviceMetadataApi, serviceLoadApi } = this.activatedRoute.snapshot.data;
|
|
524
|
-
const { id } = this.activatedRoute.snapshot.params;
|
|
525
|
-
const { duplicate } = this.activatedRoute.snapshot.queryParams;
|
|
526
|
-
const onLoad = serviceLoadApi || this.onLoad;
|
|
527
|
-
this.serviceApi = serviceApiFromRoute || this.serviceApi;
|
|
528
|
-
this.poPageDynamicService.configServiceApi({ endpoint: this.serviceApi, metadata: serviceMetadataApi });
|
|
529
|
-
const metadata$ = this.getMetadata(serviceApiFromRoute, id, onLoad);
|
|
530
|
-
const data$ = this.loadData(id, duplicate);
|
|
531
|
-
this.subscriptions.push(concat(metadata$, data$).subscribe());
|
|
532
|
-
}
|
|
533
|
-
cancel(actionCancel, actionBeforeCancel) {
|
|
534
|
-
if (this.dynamicForm && this.dynamicForm.form.dirty) {
|
|
535
|
-
this.poDialogService.confirm({
|
|
536
|
-
message: this.literals.cancelConfirmMessage,
|
|
537
|
-
title: this.literals.pageActionCancel,
|
|
538
|
-
confirm: this.goBack.bind(this, actionCancel, actionBeforeCancel)
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
this.goBack(actionCancel, actionBeforeCancel);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
formatUniqueKey(item) {
|
|
546
|
-
const keys = mapObjectByProperties(item, this.keys);
|
|
547
|
-
return valuesFromObject(keys).join('|');
|
|
548
|
-
}
|
|
549
|
-
goBack(actionCancel, actionBeforeCancel) {
|
|
550
|
-
this.subscriptions.push(this.poPageDynamicEditActionsService
|
|
551
|
-
.beforeCancel(actionBeforeCancel)
|
|
552
|
-
.subscribe((beforeCancelResult) => {
|
|
553
|
-
this.executeBackAction(actionCancel, beforeCancelResult?.allowAction, beforeCancelResult?.newUrl);
|
|
554
|
-
}));
|
|
555
|
-
}
|
|
556
|
-
executeBackAction(actionCancel, allowAction, newUrl) {
|
|
557
|
-
const isAllowedAction = typeof allowAction === 'boolean' ? allowAction : true;
|
|
558
|
-
if (isAllowedAction) {
|
|
559
|
-
if (actionCancel === undefined || typeof actionCancel === 'boolean') {
|
|
560
|
-
return window.history.back();
|
|
561
|
-
}
|
|
562
|
-
if (typeof actionCancel === 'string' || newUrl) {
|
|
563
|
-
return this.router.navigate([newUrl || actionCancel]);
|
|
564
|
-
}
|
|
565
|
-
return actionCancel();
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
loadData(id, duplicate) {
|
|
569
|
-
if (!id) {
|
|
570
|
-
try {
|
|
571
|
-
this.model = duplicate ? JSON.parse(duplicate) : {};
|
|
572
|
-
}
|
|
573
|
-
catch {
|
|
574
|
-
this.model = {};
|
|
575
|
-
}
|
|
576
|
-
return EMPTY;
|
|
577
|
-
}
|
|
578
|
-
return this.poPageDynamicService.getResource(id).pipe(tap(response => {
|
|
579
|
-
this.beforeSetModel(response);
|
|
580
|
-
}), catchError(error => {
|
|
581
|
-
this.model = undefined;
|
|
582
|
-
this.actions = undefined;
|
|
583
|
-
this._pageActions = [];
|
|
584
|
-
return throwError(error);
|
|
585
|
-
}));
|
|
586
|
-
}
|
|
587
|
-
beforeSetModel(response) {
|
|
588
|
-
if (!this.onLoadData) {
|
|
589
|
-
this.model = response;
|
|
590
|
-
return;
|
|
591
|
-
}
|
|
592
|
-
const onLoadDataExecution = this.onLoadData(response);
|
|
593
|
-
const onLoadData$ = onLoadDataExecution instanceof Observable ? onLoadDataExecution : of(onLoadDataExecution);
|
|
594
|
-
onLoadData$.subscribe({
|
|
595
|
-
next: customModel => {
|
|
596
|
-
this.model = customModel;
|
|
597
|
-
},
|
|
598
|
-
error: () => {
|
|
599
|
-
this.model = response;
|
|
600
|
-
}
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
loadOptionsOnInitialize(onLoad) {
|
|
604
|
-
if (onLoad) {
|
|
605
|
-
return this.getPoDynamicPageOptions(onLoad).pipe(tap(responsePoOption => this.poPageCustomizationService.changeOriginalOptionsToNewOptions(this, responsePoOption)));
|
|
606
|
-
}
|
|
607
|
-
return EMPTY;
|
|
608
|
-
}
|
|
609
|
-
focusCheckboxInput(control) {
|
|
610
|
-
const checkboxGroup = document.querySelector(`po-checkbox-group[ng-reflect-name=${control}]`);
|
|
611
|
-
if (checkboxGroup) {
|
|
612
|
-
const checkBoxComponent = checkboxGroup.querySelector('po-checkbox[ng-reflect-disabled=false]');
|
|
613
|
-
const labelInput = checkBoxComponent?.querySelector('.po-checkbox-outline');
|
|
614
|
-
if (labelInput) {
|
|
615
|
-
labelInput.focus();
|
|
616
|
-
}
|
|
617
|
-
else {
|
|
618
|
-
this.indexFocus--;
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
focusControl(control) {
|
|
623
|
-
const inputElement = document.querySelector(`[name=${control}]`);
|
|
624
|
-
if (inputElement) {
|
|
625
|
-
if (inputElement.tagName === 'INPUT') {
|
|
626
|
-
inputElement.focus();
|
|
627
|
-
}
|
|
628
|
-
else {
|
|
629
|
-
this.focusRadioInput(inputElement, control);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
else {
|
|
633
|
-
this.focusCheckboxInput(control);
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
focusRadioInput(inputElement, control) {
|
|
637
|
-
const radioComponent = inputElement.querySelector(`po-radio[ng-reflect-name=${control}][ng-reflect-disabled=false]`);
|
|
638
|
-
if (radioComponent) {
|
|
639
|
-
const radioInput = radioComponent.querySelector('input');
|
|
640
|
-
radioInput.focus();
|
|
641
|
-
radioInput.parentElement.parentElement.classList.add('po-radio-focus');
|
|
642
|
-
}
|
|
643
|
-
else {
|
|
644
|
-
this.indexFocus--;
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
getPoDynamicPageOptions(onLoad) {
|
|
648
|
-
const originalOption = {
|
|
649
|
-
fields: this.fields,
|
|
650
|
-
actions: this.actions,
|
|
651
|
-
breadcrumb: this.breadcrumb,
|
|
652
|
-
title: this.title
|
|
653
|
-
};
|
|
654
|
-
const pageOptionSchema = {
|
|
655
|
-
schema: [
|
|
656
|
-
{
|
|
657
|
-
nameProp: 'fields',
|
|
658
|
-
merge: true,
|
|
659
|
-
keyForMerge: 'property'
|
|
660
|
-
},
|
|
661
|
-
{
|
|
662
|
-
nameProp: 'actions',
|
|
663
|
-
merge: true
|
|
664
|
-
},
|
|
665
|
-
{
|
|
666
|
-
nameProp: 'breadcrumb'
|
|
667
|
-
},
|
|
668
|
-
{
|
|
669
|
-
nameProp: 'title'
|
|
670
|
-
}
|
|
671
|
-
]
|
|
672
|
-
};
|
|
673
|
-
return this.poPageCustomizationService.getCustomOptions(onLoad, originalOption, pageOptionSchema);
|
|
674
|
-
}
|
|
675
|
-
getMetadata(serviceApiFromRoute, paramId, onLoad) {
|
|
676
|
-
const typeMetadata = paramId ? 'edit' : 'create';
|
|
677
|
-
if (serviceApiFromRoute) {
|
|
678
|
-
return this.poPageDynamicService.getMetadata(typeMetadata).pipe(tap(response => {
|
|
679
|
-
this.autoRouter = response.autoRouter || this.autoRouter;
|
|
680
|
-
this.actions = response.actions || this.actions;
|
|
681
|
-
this.breadcrumb = response.breadcrumb || this.breadcrumb;
|
|
682
|
-
this.fields = response.fields || this.fields;
|
|
683
|
-
this.title = response.title || this.title;
|
|
684
|
-
}), switchMap(() => this.loadOptionsOnInitialize(onLoad)));
|
|
685
|
-
}
|
|
686
|
-
return this.loadOptionsOnInitialize(onLoad);
|
|
687
|
-
}
|
|
688
|
-
markControlsAsDirtyAndFocusFirstInvalid() {
|
|
689
|
-
this.indexFocus = 0;
|
|
690
|
-
const controls = Object.keys(this.dynamicForm.form.controls);
|
|
691
|
-
controls.forEach(control => {
|
|
692
|
-
this.dynamicForm.form.controls[control].markAsDirty();
|
|
693
|
-
if (this.dynamicForm.form.controls[control].hasError('required') && this.indexFocus === 0) {
|
|
694
|
-
this.focusControl(control);
|
|
695
|
-
this.indexFocus++;
|
|
696
|
-
}
|
|
697
|
-
});
|
|
698
|
-
}
|
|
699
|
-
navigateTo(path) {
|
|
700
|
-
if (path) {
|
|
701
|
-
const url = this.resolveUrl(this.model, path);
|
|
702
|
-
this.router.navigate([url]);
|
|
703
|
-
}
|
|
704
|
-
else {
|
|
705
|
-
window.history.back();
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
resolveUniqueKey(item) {
|
|
709
|
-
return this.activatedRoute.snapshot.params['id'] ? this.formatUniqueKey(item) : undefined;
|
|
710
|
-
}
|
|
711
|
-
resolveUrl(item, path) {
|
|
712
|
-
const uniqueKey = this.formatUniqueKey(item);
|
|
713
|
-
return path.replace(/:id/g, uniqueKey);
|
|
714
|
-
}
|
|
715
|
-
executeSave(saveRedirectPath) {
|
|
716
|
-
const saveOperation$ = this.saveOperation();
|
|
717
|
-
return saveOperation$.pipe(tap(message => {
|
|
718
|
-
this.poNotification.success(message);
|
|
719
|
-
this.navigateTo(saveRedirectPath);
|
|
720
|
-
}));
|
|
721
|
-
}
|
|
722
|
-
updateModel(newResource = {}) {
|
|
723
|
-
if (typeof newResource !== 'undefined' && Object.keys(newResource).length !== 0) {
|
|
724
|
-
const dynamicNgForm = this.dynamicForm.form;
|
|
725
|
-
removeKeysProperties(this.keys, newResource);
|
|
726
|
-
this.model = { ...this.model, ...newResource };
|
|
727
|
-
dynamicNgForm.form.patchValue(this.model);
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
showNotification(type) {
|
|
731
|
-
switch (type) {
|
|
732
|
-
case 'warning':
|
|
733
|
-
this.poNotification.warning(this.literals.saveNotificationWarning);
|
|
734
|
-
break;
|
|
735
|
-
case 'error':
|
|
736
|
-
this.poNotification.error(this.literals.saveNotificationError);
|
|
737
|
-
break;
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
saveOperation() {
|
|
741
|
-
if (this.dynamicForm.form.invalid) {
|
|
742
|
-
this.markControlsAsDirtyAndFocusFirstInvalid();
|
|
743
|
-
this.showNotification(this._notificationType);
|
|
744
|
-
return EMPTY;
|
|
745
|
-
}
|
|
746
|
-
const paramId = this.activatedRoute.snapshot.params['id'];
|
|
747
|
-
const successMsg = paramId
|
|
748
|
-
? this.literals.saveNotificationSuccessUpdate
|
|
749
|
-
: this.literals.saveNotificationSuccessSave;
|
|
750
|
-
const saveOperation$ = paramId
|
|
751
|
-
? this.poPageDynamicService.updateResource(paramId, this.model)
|
|
752
|
-
: this.poPageDynamicService.createResource(this.model);
|
|
753
|
-
return saveOperation$.pipe(map(() => successMsg));
|
|
754
|
-
}
|
|
755
|
-
save(action, before = 'beforeSave') {
|
|
756
|
-
const executeOperation = {
|
|
757
|
-
beforeSave: this.executeSave.bind(this),
|
|
758
|
-
beforeSaveNew: this.executeSaveNew.bind(this)
|
|
759
|
-
};
|
|
760
|
-
const uniqueKey = this.resolveUniqueKey(this.model);
|
|
761
|
-
this.subscriptions.push(this.poPageDynamicEditActionsService[before](this.actions[before], uniqueKey, { ...this.model })
|
|
762
|
-
.pipe(switchMap(returnBefore => {
|
|
763
|
-
const newAction = returnBefore?.newUrl ?? action;
|
|
764
|
-
const allowAction = returnBefore?.allowAction ?? true;
|
|
765
|
-
this.updateModel(returnBefore?.resource);
|
|
766
|
-
if (!allowAction) {
|
|
767
|
-
return of({});
|
|
768
|
-
}
|
|
769
|
-
if (typeof newAction === 'string') {
|
|
770
|
-
return executeOperation[before](newAction);
|
|
771
|
-
}
|
|
772
|
-
else {
|
|
773
|
-
newAction({ ...this.model }, uniqueKey);
|
|
774
|
-
return EMPTY;
|
|
775
|
-
}
|
|
776
|
-
}))
|
|
777
|
-
.subscribe());
|
|
778
|
-
}
|
|
779
|
-
executeSaveNew(path) {
|
|
780
|
-
const paramId = this.activatedRoute.snapshot.params['id'];
|
|
781
|
-
const saveOperation$ = this.saveOperation();
|
|
782
|
-
return saveOperation$.pipe(tap(message => {
|
|
783
|
-
if (paramId) {
|
|
784
|
-
this.poNotification.success(message);
|
|
785
|
-
this.navigateTo(path);
|
|
786
|
-
}
|
|
787
|
-
else {
|
|
788
|
-
this.poNotification.success(message);
|
|
789
|
-
this.model = {};
|
|
790
|
-
this.dynamicForm.form.reset();
|
|
791
|
-
}
|
|
792
|
-
}));
|
|
793
|
-
}
|
|
794
|
-
getKeysByFields(fields = []) {
|
|
795
|
-
return fields.filter(field => field.key === true).map(field => field.property);
|
|
796
|
-
}
|
|
797
|
-
getControlFields(fields = []) {
|
|
798
|
-
return fields.filter(field => field.type !== 'detail');
|
|
799
|
-
}
|
|
800
|
-
getDetailFields(fields = []) {
|
|
801
|
-
return fields.filter(field => field.type === 'detail');
|
|
802
|
-
}
|
|
803
|
-
getDuplicatesByFields(fields = []) {
|
|
804
|
-
return fields.filter(field => field.duplicate === true).map(field => field.property);
|
|
805
|
-
}
|
|
806
|
-
getPageActions(actions = {}) {
|
|
807
|
-
const pageActions = [
|
|
808
|
-
{ label: this.literals.pageActionSave, action: this.save.bind(this, actions.save) }
|
|
809
|
-
];
|
|
810
|
-
if (actions.saveNew) {
|
|
811
|
-
pageActions.push({
|
|
812
|
-
label: this.literals.pageActionSaveNew,
|
|
813
|
-
action: this.save.bind(this, actions.saveNew, 'beforeSaveNew')
|
|
814
|
-
});
|
|
815
|
-
}
|
|
816
|
-
if (actions.cancel === undefined || actions.cancel) {
|
|
817
|
-
pageActions.push({
|
|
818
|
-
label: this.literals.pageActionCancel,
|
|
819
|
-
action: this.cancel.bind(this, actions.cancel, this.actions.beforeCancel)
|
|
820
|
-
});
|
|
821
|
-
}
|
|
822
|
-
return pageActions;
|
|
823
|
-
}
|
|
824
|
-
isObject(value) {
|
|
825
|
-
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
826
|
-
}
|
|
827
|
-
static ɵfac = function PoPageDynamicEditComponent_Factory(t) { return new (t || PoPageDynamicEditComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.PoNotificationService), i0.ɵɵdirectiveInject(i2.PoDialogService), i0.ɵɵdirectiveInject(i3.PoPageDynamicService), i0.ɵɵdirectiveInject(i4.PoPageCustomizationService), i0.ɵɵdirectiveInject(i5.PoPageDynamicEditActionsService), i0.ɵɵdirectiveInject(i2.PoLanguageService)); };
|
|
828
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PoPageDynamicEditComponent, selectors: [["po-page-dynamic-edit"]], viewQuery: function PoPageDynamicEditComponent_Query(rf, ctx) { if (rf & 1) {
|
|
829
|
-
i0.ɵɵviewQuery(_c0, 5);
|
|
830
|
-
i0.ɵɵviewQuery(_c1, 5);
|
|
831
|
-
} if (rf & 2) {
|
|
832
|
-
let _t;
|
|
833
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dynamicForm = _t.first);
|
|
834
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.gridDetail = _t.first);
|
|
835
|
-
} }, inputs: { breadcrumb: [0, "p-breadcrumb", "breadcrumb"], serviceApi: [0, "p-service-api", "serviceApi"], title: [0, "p-title", "title"], onLoad: [0, "p-load", "onLoad"], onLoadData: [0, "p-load-data", "onLoadData"], actions: [0, "p-actions", "actions"], literals: [0, "p-literals", "literals"], notificationType: [0, "p-notification-type", "notificationType"], autoRouter: [0, "p-auto-router", "autoRouter"], fields: [0, "p-fields", "fields"] }, features: [i0.ɵɵProvidersFeature([PoPageDynamicService])], decls: 6, vars: 6, consts: [["registerNotFoundTemplate", ""], ["formFieldsTemplate", ""], ["dynamicForm", ""], ["gridDetail", ""], [3, "p-actions", "p-breadcrumb", "p-title"], [4, "ngIf", "ngIfThen", "ngIfElse"], ["p-icon", "ICON_INFO"], [1, "po-font-text-large"], [3, "p-fields", "p-value"], ["class", "po-sm-12", 4, "ngIf"], [1, "po-sm-12"], [3, "p-label"], [1, "po-row", "po-mb-2"], [3, "p-click", "p-label"], [3, "p-row-actions", "p-columns", "p-data"]], template: function PoPageDynamicEditComponent_Template(rf, ctx) { if (rf & 1) {
|
|
836
|
-
i0.ɵɵelementStart(0, "po-page-default", 4);
|
|
837
|
-
i0.ɵɵtemplate(1, PoPageDynamicEditComponent_ng_container_1_Template, 1, 0, "ng-container", 5);
|
|
838
|
-
i0.ɵɵelementEnd();
|
|
839
|
-
i0.ɵɵtemplate(2, PoPageDynamicEditComponent_ng_template_2_Template, 4, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(4, PoPageDynamicEditComponent_ng_template_4_Template, 3, 3, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
840
|
-
} if (rf & 2) {
|
|
841
|
-
const registerNotFoundTemplate_r3 = i0.ɵɵreference(3);
|
|
842
|
-
const formFieldsTemplate_r4 = i0.ɵɵreference(5);
|
|
843
|
-
i0.ɵɵproperty("p-actions", ctx.pageActions)("p-breadcrumb", ctx.breadcrumb)("p-title", ctx.title);
|
|
844
|
-
i0.ɵɵadvance();
|
|
845
|
-
i0.ɵɵproperty("ngIf", ctx.model)("ngIfThen", formFieldsTemplate_r4)("ngIfElse", registerNotFoundTemplate_r3);
|
|
846
|
-
} }, dependencies: [i6.NgIf, i2.PoButtonComponent, i2.PoDividerComponent, i2.PoDynamicFormComponent, i2.PoGridComponent, i2.PoIconComponent, i2.PoPageDefaultComponent, i2.PoWidgetComponent], encapsulation: 2 });
|
|
847
|
-
}
|
|
848
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PoPageDynamicEditComponent, [{
|
|
849
|
-
type: Component,
|
|
850
|
-
args: [{ selector: 'po-page-dynamic-edit', providers: [PoPageDynamicService], template: "<po-page-default [p-actions]=\"pageActions\" [p-breadcrumb]=\"breadcrumb\" [p-title]=\"title\">\n <ng-container *ngIf=\"model; then formFieldsTemplate; else registerNotFoundTemplate\"> </ng-container>\n</po-page-default>\n\n<ng-template #registerNotFoundTemplate>\n <po-widget>\n <po-icon p-icon=\"ICON_INFO\"></po-icon>\n <span class=\"po-font-text-large\">\n {{ literals.registerNotFound }}\n </span>\n </po-widget>\n</ng-template>\n\n<ng-template #formFieldsTemplate>\n <po-dynamic-form #dynamicForm [p-fields]=\"controlFields\" [p-value]=\"model\"> </po-dynamic-form>\n\n <div *ngIf=\"detailFields.length > 0\" class=\"po-sm-12\">\n <po-divider [p-label]=\"detailFields[0].divider\"></po-divider>\n\n <div class=\"po-row po-mb-2\">\n <po-button [p-label]=\"literals.detailActionNew\" (p-click)=\"detailActionNew()\"></po-button>\n </div>\n\n <po-grid\n #gridDetail\n [p-row-actions]=\"detailActions\"\n [p-columns]=\"detailFields[0].detail.columns\"\n [p-data]=\"model[detailFields[0].property]\"\n >\n </po-grid>\n </div>\n</ng-template>\n" }]
|
|
851
|
-
}], () => [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.PoNotificationService }, { type: i2.PoDialogService }, { type: i3.PoPageDynamicService }, { type: i4.PoPageCustomizationService }, { type: i5.PoPageDynamicEditActionsService }, { type: i2.PoLanguageService }], { dynamicForm: [{
|
|
852
|
-
type: ViewChild,
|
|
853
|
-
args: ['dynamicForm']
|
|
854
|
-
}], gridDetail: [{
|
|
855
|
-
type: ViewChild,
|
|
856
|
-
args: ['gridDetail']
|
|
857
|
-
}], breadcrumb: [{
|
|
858
|
-
type: Input,
|
|
859
|
-
args: ['p-breadcrumb']
|
|
860
|
-
}], serviceApi: [{
|
|
861
|
-
type: Input,
|
|
862
|
-
args: ['p-service-api']
|
|
863
|
-
}], title: [{
|
|
864
|
-
type: Input,
|
|
865
|
-
args: ['p-title']
|
|
866
|
-
}], onLoad: [{
|
|
867
|
-
type: Input,
|
|
868
|
-
args: ['p-load']
|
|
869
|
-
}], onLoadData: [{
|
|
870
|
-
type: Input,
|
|
871
|
-
args: ['p-load-data']
|
|
872
|
-
}], actions: [{
|
|
873
|
-
type: Input,
|
|
874
|
-
args: ['p-actions']
|
|
875
|
-
}], literals: [{
|
|
876
|
-
type: Input,
|
|
877
|
-
args: ['p-literals']
|
|
878
|
-
}], notificationType: [{
|
|
879
|
-
type: Input,
|
|
880
|
-
args: ['p-notification-type']
|
|
881
|
-
}], autoRouter: [{
|
|
882
|
-
type: Input,
|
|
883
|
-
args: ['p-auto-router']
|
|
884
|
-
}], fields: [{
|
|
885
|
-
type: Input,
|
|
886
|
-
args: ['p-fields']
|
|
887
|
-
}] }); })();
|
|
888
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PoPageDynamicEditComponent, { className: "PoPageDynamicEditComponent", filePath: "lib/components/po-page-dynamic-edit/po-page-dynamic-edit.component.ts", lineNumber: 189 }); })();
|
|
889
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tcGFnZS1keW5hbWljLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVtcGxhdGVzL3NyYy9saWIvY29tcG9uZW50cy9wby1wYWdlLWR5bmFtaWMtZWRpdC9wby1wYWdlLWR5bmFtaWMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW1wbGF0ZXMvc3JjL2xpYi9jb21wb25lbnRzL3BvLXBhZ2UtZHluYW1pYy1lZGl0L3BvLXBhZ2UtZHluYW1pYy1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUcvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQWdCLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFTTCxlQUFlLEVBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJckgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7Ozs7O0lDckI1Rix3QkFBb0c7OztJQUlwRyxpQ0FBVztJQUNULDZCQUFzQztJQUN0QywrQkFBaUM7SUFDL0IsWUFDRjtJQUNGLEFBREUsaUJBQU8sRUFDRzs7O0lBRlIsZUFDRjtJQURFLGlFQUNGOzs7O0lBT0YsK0JBQXNEO0lBQ3BELGlDQUE2RDtJQUczRCxBQURGLCtCQUE0QixvQkFDb0Q7SUFBOUIsNE1B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cG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb25jYXQsIG9mLCBTdWJzY3JpcHRpb24sIEVNUFRZLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBQb0JyZWFkY3J1bWIsXG4gIFBvRGlhbG9nU2VydmljZSxcbiAgUG9EeW5hbWljRm9ybUNvbXBvbmVudCxcbiAgUG9HcmlkQ29tcG9uZW50LFxuICBQb0dyaWRSb3dBY3Rpb25zLFxuICBQb0xhbmd1YWdlU2VydmljZSxcbiAgUG9Ob3RpZmljYXRpb25TZXJ2aWNlLFxuICBQb1BhZ2VBY3Rpb24sXG4gIHBvTG9jYWxlRGVmYXVsdFxufSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XG5cbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xlYW4sIG1hcE9iamVjdEJ5UHJvcGVydGllcywgdmFsdWVzRnJvbU9iamVjdCwgcmVtb3ZlS2V5c1Byb3BlcnRpZXMgfSBmcm9tICcuLy4uLy4uL3V0aWxzL3V0aWwnO1xuXG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLWVkaXQtYWN0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRGaWVsZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtZWRpdC1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wby1wYWdlLWR5bmFtaWMvcG8tcGFnZS1keW5hbWljLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BvLXBhZ2UtZHluYW1pYy1lZGl0LW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUN1c3RvbWl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tcGFnZS1jdXN0b21pemF0aW9uL3BvLXBhZ2UtY3VzdG9taXphdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNFZGl0TWV0YWRhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLWVkaXQtbWV0YWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcG8tcGFnZS1jdXN0b21pemF0aW9uL3BvLXBhZ2UtZHluYW1pYy1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9wby1wYWdlLWR5bmFtaWMtZWRpdC1hY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRCZWZvcmVDYW5jZWwgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tcGFnZS1keW5hbWljLWVkaXQtYmVmb3JlLWNhbmNlbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9QYWdlRHluYW1pY0VkaXRMaXRlcmFscyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby1wYWdlLWR5bmFtaWMtZWRpdC1saXRlcmFscy5pbnRlcmZhY2UnO1xuXG50eXBlIFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24gPSBzdHJpbmcgfCAoKCkgPT4gUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zKTtcbnR5cGUgU2F2ZUFjdGlvbiA9IFBvUGFnZUR5bmFtaWNFZGl0QWN0aW9uc1snc2F2ZSddIHwgUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zWydzYXZlTmV3J107XG5cbmV4cG9ydCBjb25zdCBwb05vdGlmaWNhdGlvblR5cGUgPSBbJ2Vycm9yJywgJ3dhcm5pbmcnXTtcbmV4cG9ydCBjb25zdCBwb05vdGlmaWNhdGlvblR5cGVEZWZhdWx0ID0gJ3dhcm5pbmcnO1xuXG5leHBvcnQgY29uc3QgcG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHQgPSB7XG4gIGVuOiA8UG9QYWdlRHluYW1pY0VkaXRMaXRlcmFscz57XG4gICAgY2FuY2VsQ29uZmlybU1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsIHRoaXMgb3BlcmF0aW9uPycsXG4gICAgZGV0YWlsQWN0aW9uTmV3OiAnTmV3JyxcbiAgICBwYWdlQWN0aW9uQ2FuY2VsOiAnQ2FuY2VsJyxcbiAgICBwYWdlQWN0aW9uU2F2ZTogJ1NhdmUnLFxuICAgIHBhZ2VBY3Rpb25TYXZlTmV3OiAnU2F2ZSBhbmQgbmV3JyxcbiAgICByZWdpc3Rlck5vdEZvdW5kOiAnUmVnaXN0ZXIgbm90IGZvdW5kLicsXG4gICAgc2F2ZU5vdGlmaWNhdGlvbkVycm9yOiAnTWFuZGF0b3J5IGZpZWxkKHMpIG5vdCBmaWxsZWQuJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdSZXNvdXJjZSBzdWNjZXNzZnVsbHkgc2F2ZWQuJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1VwZGF0ZTogJ1Jlc291cmNlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLicsXG4gICAgc2F2ZU5vdGlmaWNhdGlvbldhcm5pbmc6ICdGb3JtIG11c3QgYmUgZmlsbGVkIG91dCBjb3JyZWN0bHkuJ1xuICB9LFxuICBlczogPFBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHM+e1xuICAgIGNhbmNlbENvbmZpcm1NZXNzYWdlOiAnRXN0w6Egc2VndXJvIGRlIHF1ZSBkZXNlYSBjYW5jZWxhciBlc3RhIG9wZXJhY2nDs24/JyxcbiAgICBkZXRhaWxBY3Rpb25OZXc6ICdOdWV2bycsXG4gICAgcGFnZUFjdGlvbkNhbmNlbDogJ0NhbmNlbGFyJyxcbiAgICBwYWdlQWN0aW9uU2F2ZTogJ0d1YXJkYXInLFxuICAgIHBhZ2VBY3Rpb25TYXZlTmV3OiAnR3VhcmRhciB5IG51ZXZvJyxcbiAgICByZWdpc3Rlck5vdEZvdW5kOiAnUmVnaXN0cm8gbm8gZW5jb250cmFkby4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25FcnJvcjogJ0NhbXBvKHMpIG9ibGlnYXRvcmlvKHMpIG5vIGNvbXBsZXRhZG8ocykuJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdSZWN1cnNvIHNhbHZvIGNvbiDDqXhpdG8uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1VwZGF0ZTogJ1JlY3Vyc28gYWN0dWFsaXphZG8gY29uIMOpeGl0by4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25XYXJuaW5nOiAnRWwgZm9ybXVsYXJpbyBkZWJlIGxsZW5hcnNlIGNvcnJlY3RhbWVudGUuJ1xuICB9LFxuICBwdDogPFBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHM+e1xuICAgIGNhbmNlbENvbmZpcm1NZXNzYWdlOiAnVGVtIGNlcnRlemEgcXVlIGRlc2VqYSBjYW5jZWxhciBlc3RhIG9wZXJhw6fDo28/JyxcbiAgICBkZXRhaWxBY3Rpb25OZXc6ICdOb3ZvJyxcbiAgICBwYWdlQWN0aW9uQ2FuY2VsOiAnQ2FuY2VsYXInLFxuICAgIHBhZ2VBY3Rpb25TYXZlOiAnU2FsdmFyJyxcbiAgICBwYWdlQWN0aW9uU2F2ZU5ldzogJ1NhbHZhciBlIG5vdm8nLFxuICAgIHJlZ2lzdGVyTm90Rm91bmQ6ICdSZWdpc3RybyBuw6NvIGVuY29udHJhZG8uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uRXJyb3I6ICdDYW1wbyhzKSBvYnJpZ2F0w7NyaW8ocykgc2VtIHByZWVuY2hpbWVudG8uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdSZWN1cnNvIHNhbHZvIGNvbSBzdWNlc3NvLicsXG4gICAgc2F2ZU5vdGlmaWNhdGlvblN1Y2Nlc3NVcGRhdGU6ICdSZWN1cnNvIGF0dWFsaXphZG8gY29tIHN1Y2Vzc28uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uV2FybmluZzogJ0Zvcm11bMOhcmlvIHByZWNpc2Egc2VyIHByZWVuY2hpZG8gY29ycmV0YW1lbnRlLidcbiAgfSxcbiAgcnU6IDxQb1BhZ2VEeW5hbWljRWRpdExpdGVyYWxzPntcbiAgICBjYW5jZWxDb25maXJtTWVzc2FnZTogJ9CS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0L7RgtC80LXQvdC40YLRjCDRjdGC0YMg0L7Qv9C10YDQsNGG0LjRjj8nLFxuICAgIGRldGFpbEFjdGlvbk5ldzogJ9Cd0L7QstGL0LknLFxuICAgIHBhZ2VBY3Rpb25DYW5jZWw6ICfQntGC0LzQtdC90LjRgtGMJyxcbiAgICBwYWdlQWN0aW9uU2F2ZTogJ9Ch0L7RhdGA0LDQvdC40YLRjCcsXG4gICAgcGFnZUFjdGlvblNhdmVOZXc6ICfQodC+0YXRgNCw0L3QuNGC0Ywg0Lgg0YHQvtC30LTQsNGC0YwnLFxuICAgIHJlZ2lzdGVyTm90Rm91bmQ6ICfQl9Cw0L/QuNGB0Ywg0L3QtSDQvdCw0LnQtNC10L3QsC4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25FcnJvcjogJ9Ce0LHRj9C30LDRgtC10LvRjNC90L7QtSDQv9C+0LvQtSjRjykg0L3QtSDQt9Cw0L/QvtC70L3QtdC90L4uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICfQoNC10YHRg9GA0YEg0YPRgdC/0LXRiNC90L4g0YHQvtGF0YDQsNC90LXQvS4nLFxuICAgIHNhdmVOb3RpZmljYXRpb25TdWNjZXNzVXBkYXRlOiAn0KDQtdGB0YPRgNGBINGD0YHQv9C10YjQvdC+INC+0LHQvdC+0LLQu9C10L0uJyxcbiAgICBzYXZlTm90aWZpY2F0aW9uV2FybmluZzogJ9Ck0L7RgNC80LAg0LTQvtC70LbQvdCwINCx0YvRgtGMINC30LDQv9C+0LvQvdC10L3QsCDQv9GA0LDQstC40LvRjNC90L4uJ1xuICB9XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gYHBvLXBhZ2UtZHluYW1pYy1lZGl0YCDDqSB1bWEgcMOhZ2luYSBxdWUgcG9kZSBzZXJ2aXIgcGFyYSBlZGl0YXIgb3UgY3JpYXIgbm92b3MgcmVnaXN0cm9zLFxuICogbyBtZXNtbyB0YW1iw6ltIHN1cG9ydGEgbWV0YWRhZG9zIGNvbmZvcm1lIGVzcGVjaWZpY2FkbyBuYSBkb2N1bWVudGHDp8Ojby5cbiAqXG4gKiAjIyMgVXRpbGl6YcOnw6NvIHZpYSByb3RhXG4gKlxuICogQW8gdXRpbGl6YXIgYXMgcm90YXMgcGFyYSBpbmljaWFsaXphciBvIHRlbXBsYXRlLCBvIGBwYWdlLWR5bmFtaWMtZWRpdGAgZGlzcG9uaWJpbGl6YSBwcm9wcmllZGFkZXMgcXVlIGRldmVtIHNlciBmb3JuZWNpZGFzIG5vIGFycXVpdm8gZGUgY29uZmlndXJhw6fDo28gZGUgcm90YXMgZGEgYXBsaWNhw6fDo28sIHBhcmFcbiAqIHBvZGVyIGVzcGVjaWZpY2FyIG8gZW5kcG9pbnQgZG9zIGRhZG9zIGUgZG9zIG1ldGFkYWRvcyBxdWUgc2Vyw6NvIGNhcnJlZ2Fkb3MgbmEgaW5pY2lhbGl6YcOnw6NvLlxuICpcbiAqIEV4ZW1wbG8gZGUgdXRpbGl6YcOnw6NvOlxuICpcbiAqIEFycXVpdm8gZGUgY29uZmlndXJhw6fDo28gZGUgcm90YXMgZGEgYXBsaWNhw6fDo286IGBhcHAtcm91dGluZy5tb2R1bGUudHNgXG4gKiBgYGBcbiAqIGNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICoge1xuICogICBwYXRoOiAncGVvcGxlJyxcbiAqICAgY29tcG9uZW50OiBQb1BhZ2VEeW5hbWljRWRpdENvbXBvbmVudCxcbiAqICAgZGF0YToge1xuICogICAgIHNlcnZpY2VBcGk6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvdjEvcGVvcGxlJywgLy8gZW5kcG9pbnQgZG9zIGRhZG9zXG4gKiAgICAgc2VydmljZU1ldGFkYXRhQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL3YxL21ldGFkYXRhJywgLy8gZW5kcG9pbnQgZG9zIG1ldGFkYWRvcyB1dGlsaXphbmRvIG8gbcOpdG9kbyBIVFRQIEdldFxuICogICAgIHNlcnZpY2VMb2FkQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2xvYWQtbWV0YWRhdGEnIC8vIGVuZHBvaW50IGRlIGN1c3RvbWl6YcOnw7VlcyBkb3MgbWV0YWRhZG9zIHV0aWxpemFuZG8gbyBtw6l0b2RvIEhUVFAgUG9zdFxuICogICB9XG4gKiAgfSxcbiAqICB7XG4gKiAgIHBhdGg6ICdob21lJyxcbiAqICAgY29tcG9uZW50OiBIb21lRXhhbXBsZUNvbXBvbmVudFxuICogIH1cbiAqIF07XG4gKlxuICogYGBgXG4gKiBPIGNvbXBvbmVudGUgcHJpbWVpcm8gaXLDoSBjYXJyZWdhciBvIG1ldGFkYWRvIGRhIHJvdGEgZGVmaW5pZGEgbmEgcHJvcHJpZWRhZGUgc2VydmljZU1ldGFkYXRhQXBpXG4gKiBlIGRlcG9pcyBpcsOhIGJ1c2NhciBkYSByb3RhIGRlZmluaWRhIG5hIHByb3ByaWVkYWRlIHNlcnZpY2VMb2FkQXBpLlxuICpcbiAqIEEgcmVxdWlzacOnw6NvIGRvcyBtZXRhZGFkb3Mgw6kgZmVpdGEgbmEgaW5pY2lhbGl6YcOnw6NvIGRvIHRlbXBsYXRlIHBhcmEgYnVzY2FyIG9zIG1ldGFkYWRvcyBkYSBww6FnaW5hIHBhc3NhbmRvIG9cbiAqIHRpcG8gZG8gbWV0YWRhZG8gZXNwZXJhZG8gZSBhIHZlcnPDo28gY2FjaGVhZGEgcGVsbyBicm93c2VyLlxuICpcbiAqID4gQ2FzbyBvIHNlcnZpZG9yIHJldG9ybmFyIHVtIGVycm8gYW8gcmVjdXBlcmFyIG9zIG1ldGFkYWRvcywgc2Vyw6NvIHJlcGFzc2Fkb3Mgb3MgbWV0YWRhZG9zIHNhbHZvcyBlbSBjYWNoZSxcbiAqIHNlIG8gY2FjaGUgbsOjbyBleGlzdGlyIHNlcsOhIGRpc3BhcmFkYSB1bWEgbm90aWZpY2HDp8Ojby5cbiAqXG4gKiBQYXJhIGNhcnJlZ2FyIGNvbSB1bSByZWN1cnNvIGrDoSBleGlzdGVudGUsIGRldmUtc2Ugc2VyIGluY2x1w61kbyB1bSBwYXLDom1ldHJvIG5hIHJvdGEgY2hhbWFkbyBgaWRgOlxuICpcbiAqIGBgYFxuICoge1xuICogICBwYXRoOiAncGVvcGxlLzppZCcsXG4gKiAgIGNvbXBvbmVudDogUG9QYWdlRHluYW1pY0VkaXRDb21wb25lbnQsXG4gKiAgIGRhdGE6IHtcbiAqICAgICBzZXJ2aWNlQXBpOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL3YxL3Blb3BsZScsIC8vIGVuZHBvaW50IGRvcyBkYWRvc1xuICogICAgIHNlcnZpY2VNZXRhZGF0YUFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC92MS9tZXRhZGF0YScsIC8vIGVuZHBvaW50IGRvcyBtZXRhZGFkb3NcbiAqICAgICBzZXJ2aWNlTG9hZEFwaTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9sb2FkLW1ldGFkYXRhJyAvLyBlbmRwb2ludCBkZSBjdXN0b21pemHDp8O1ZXMgZG9zIG1ldGFkYWRvc1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIHJlcXVpc2nDp8OjbyBkb3MgbWV0YWRhZG9zIMOpIGZlaXRhIG5hIGluaWNpYWxpemHDp8OjbyBkbyB0ZW1wbGF0ZSBwYXJhIGJ1c2NhciBvcyBtZXRhZGFkb3MgZGEgcMOhZ2luYSBwYXNzYW5kbyBvXG4gKiB0aXBvIGRvIG1ldGFkYWRvIGVzcGVyYWRvIGUgYSB2ZXJzw6NvIGNhY2hlYWRhIHBlbG8gYnJvd3Nlci5cbiAqXG4gKiBPIGZvcm1hdG8gZXNwZXJhZG8gbmEgcmVzcG9zdGEgZGEgcmVxdWlzacOnw6NvIGVzdMOhIGVzcGVjaWZpY2FkbyBuYSBpbnRlcmZhY2VcbiAqIFtQb1BhZ2VEeW5hbWljRWRpdE1ldGFkYXRhXSgvZG9jdW1lbnRhdGlvbi9wby1wYWdlLWR5bmFtaWMtZWRpdCNwby1wYWdlLWR5bmFtaWMtZWRpdC1tZXRhZGF0YSkuIFBvciBleGVtcGxvOlxuICpcbiAqIGBgYFxuICogIHtcbiAqICAgdmVyc2lvbjogMSxcbiAqICAgdGl0bGU6ICdQZXJzb24gZWRpdCcsXG4gKiAgIGZpZWxkczogW1xuICogICAgIHsgcHJvcGVydHk6ICdpZCcsIGtleTogdHJ1ZSwgZGlzYWJsZWQ6IHRydWUgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnc3RhdHVzJyB9LFxuICogICAgIHsgcHJvcGVydHk6ICduYW1lJyB9LFxuICogICAgIHsgcHJvcGVydHk6ICduaWNrbmFtZScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnYmlydGhkYXRlJywgbGFiZWw6ICdCaXJ0aCBkYXRlJyB9LFxuICogICAgIHsgcHJvcGVydHk6ICdnZW5yZScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnY2l0eScgfSxcbiAqICAgICB7IHByb3BlcnR5OiAnY291bnRyeScgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiA+IENhc28gbyBlbmRwb2ludCBkb3MgbWV0YWRhZG9zIG7Do28gc2VqYSBlc3BlY2lmaWNhZG8sIHNlcsOhIGZlaXRvIHVtYSByZXF1aXNpw6fDo28gdXRpbGl6YW5kbyBvIGBzZXJ2aWNlQXBpYCBkYSBzZWd1aW50ZSBmb3JtYTpcbiAqIGBgYFxuICogR0VUIHtlbmQtcG9pbnR9L21ldGFkYXRhP3R5cGU9ZWRpdCZ2ZXJzaW9uPXt2ZXJzaW9ufVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwicG8tcGFnZS1keW5hbWljLWVkaXQtYmFzaWNcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBFZGl0IEJhc2ljXCI+XG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtZWRpdC1iYXNpYy9zYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtYmFzaWMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtYmFzaWMvc2FtcGxlLXBvLXBhZ2UtZHluYW1pYy1lZGl0LWJhc2ljLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLXBhZ2UtZHluYW1pYy1lZGl0LXVzZXJcIiB0aXRsZT1cIlBPIFBhZ2UgRHluYW1pYyBFZGl0IC0gVXNlclwiPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtdXNlci9zYW1wbGUtcG8tcGFnZS1keW5hbWljLWVkaXQtdXNlci5jb21wb25lbnQuaHRtbFwiPiA8L2ZpbGU+XG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby1wYWdlLWR5bmFtaWMtZWRpdC11c2VyL3NhbXBsZS1wby1wYWdlLWR5bmFtaWMtZWRpdC11c2VyLmNvbXBvbmVudC50c1wiPiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BvLXBhZ2UtZHluYW1pYy1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BvLXBhZ2UtZHluYW1pYy1lZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbUG9QYWdlRHluYW1pY1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFBvUGFnZUR5bmFtaWNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdkeW5hbWljRm9ybScpIGR5bmFtaWNGb3JtOiBQb0R5bmFtaWNGb3JtQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdncmlkRGV0YWlsJykgZ3JpZERldGFpbDogUG9HcmlkQ29tcG9uZW50O1xuXG4gIC8qKiBPYmpldG8gY29tIHByb3ByaWVkYWRlcyBkbyBicmVhZGNydW1iLiAqL1xuICBASW5wdXQoJ3AtYnJlYWRjcnVtYicpIGJyZWFkY3J1bWI/OiBQb0JyZWFkY3J1bWIgPSB7IGl0ZW1zOiBbXSB9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRW5kcG9pbnQgdXNhZG8gcGVsbyB0ZW1wbGF0ZSBwYXJhIHJlcXVpc2nDp8OjbyBkbyByZWN1cnNvIHF1ZSBzZXLDoSBleGliaWRvIHBhcmEgZWRpw6fDo28uXG4gICAqXG4gICAqIFBhcmEgYXMgYcOnw7VlcyBkZSBgc2F2ZWAgZSBgc2F2ZU5ld2AsIHNlcsOhIGZlaXRvIHVtYSByZXF1aXNpw6fDo28gZGUgY3JpYcOnw6NvIG5lc3NlIG1lc21vIGVuZHBvaW50IHBhc3NhbmRvIG9zIHZhbG9yZXNcbiAgICogcHJlZW5jaGlkb3MgcGVsbyB1c3XDoXJpbyB2aWEgcGF5bG9hZC5cbiAgICpcbiAgICogPiBgUE9TVCB7ZW5kLXBvaW50fWBcbiAgICpcbiAgICogYGBgXG4gICAqICA8cG8tcGFnZS1keW5hbWljLWVkaXRcbiAgICogICAgW3AtYWN0aW9uc109XCJ7IHNhdmU6ICcvJywgc2F2ZU5ldzogJ25ldycgfVwiXG4gICAqICAgIFtwLWZpZWxkc109XCJbIHsgcHJvcGVydHk6ICduYW1lJyB9LCB7IHByb3BlcnR5OiAnY2l0eScgfSBdXCJcbiAgICogICAgcC1zZXJ2aWNlPVwiL2FwaS9wby1zYW1wbGVzL3YxL3Blb3BsZVwiXG4gICAqICAgIC4uLj5cbiAgICogIDwvcG8tcGFnZS1keW5hbWljLWVkaXQ+XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXNxdWlzacOnw6NvIGRpc3BhcmFkYSwgb25kZSBhIHByb3ByaWVkYWRlIGBuYW1lYCBlIGBjaXR5YCBmb3JhbSBwcmVlbmNoaWRhczpcbiAgICpcbiAgICogYGBgXG4gICAqICBQT1NUIC9hcGkvcG8tc2FtcGxlcy92MS9wZW9wbGUgSFRUUC8xLjFcbiAgICogIEhvc3Q6IGxvY2FsaG9zdDo0MDAwXG4gICAqICBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gICAqICBBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW5cbiAgICogIC4uLlxuICAgKiBgYGBcbiAgICpcbiAgICogUmVxdWVzdCBwYXlsb2FkOlxuICAgKlxuICAgKiBgYGBcbiAgICogeyBcIm5hbWVcIjogXCJGdWxhbm9cIiwgXCJjaXR5XCI6IFwiU21hbGx2aWxsZVwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIENhc28gcXVlaXJhIHF1ZSBvIHRlbXBsYXRlIGNhcnJlZ3VlIHVtIHJlY3Vyc28gasOhIGV4aXN0ZW50ZSwgZGV2ZS1zZSBzZXIgaW5jbHXDrWRvIHVtIHBhcmFtZXRybyBuYSByb3RhIGNoYW1hZG8gYGlkYC5cbiAgICpcbiAgICogRXhlbXBsbyBkZSBjb25maWd1cmHDp8OjbyBkZSByb3RhOlxuICAgKlxuICAgKiBgYGBcbiAgICogIFJvdXRlck1vZHVsZS5mb3JSb290KFtcbiAgICogICAgLi4uXG4gICAqICAgIHsgcGF0aDogJ2VkaXQvOmlkJywgY29tcG9uZW50OiBQZXJzb25FZGl0Q29tcG9uZW50IH0sXG4gICAqICAgIC4uLlxuICAgKiAgXSxcbiAgICogYGBgXG4gICAqXG4gICAqIEJhc2VhZG8gbmlzc28sIG5hIGluaWNpYWxpemHDp8OjbyBkbyB0ZW1wbGF0ZSwgc2Vyw6EgZGlzcGFyYWRvIHVtYSByZXF1aXNpw6fDo28gcGFyYSBidXNjYXIgbyByZWN1cnNvIHF1ZSBzZXLDoSBlZGl0YWRvLlxuICAgKlxuICAgKiA+IGBHRVQge2VuZC1wb2ludH0ve2lkfWBcbiAgICpcbiAgICogTm9zIG3DqXRvZG9zIGRlIGBzYXZlYCBlIGBzYXZlTmV3YCwgYW8gaW52w6lzIGRlIHVtIGBQT1NUYCwgc2Vyw6EgZGlzcGFyYWRvIHVtIGBQVVRgLlxuICAgKlxuICAgKiBSZXNxdWlzacOnw6NvIGRpc3BhcmFkYSwgb25kZSBhIHByb3ByaWVkYWRlIGBuYW1lYCBlIGBjaXR5YCBmb3JhbSBwcmVlbmNoaWRhcyAvIGF0dWFsaXphZGFzLCBlIG8gYGlkYCBkYSB1cmwgw6kgMjpcbiAgICpcbiAgICogYGBgXG4gICAqICBQVVQgL2FwaS9wby1zYW1wbGVzL3YxL3Blb3BsZS8yIEhUVFAvMS4xXG4gICAqICBIb3N0OiBsb2NhbGhvc3Q6NDAwMFxuICAgKiAgQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICAgKiAgQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluXG4gICAqICAuLi5cbiAgICogYGBgXG4gICAqXG4gICAqIFJlcXVlc3QgcGF5bG9hZDpcbiAgICpcbiAgICogYGBgXG4gICAqIHsgXCJuYW1lXCI6IFwiRnVsYW5vXCIsIFwiY2l0eVwiOiBcIk1ldHJvcG9saXNcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCdwLXNlcnZpY2UtYXBpJykgc2VydmljZUFwaTogc3RyaW5nO1xuXG4gIC8qKiBUw610dWxvIGRhIHDDoWdpbmEuICovXG4gIEBJbnB1dCgncC10aXRsZScpIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZ1bsOnw6NvIG91IHNlcnZpw6dvIHF1ZSBzZXLDoSBleGVjdXRhZG8gbmEgaW5pY2lhbGl6YcOnw6NvIGRvIGNvbXBvbmVudGUuXG4gICAqXG4gICAqIEEgcHJvcHJpZWRhZGUgYWNlaXRhIG9zIHNlZ3VpbnRlcyB0aXBvczpcbiAgICogLSBgc3RyaW5nYDogKkVuZHBvaW50KiB1c2FkbyBwZWxvIGNvbXBvbmVudGUgcGFyYSByZXF1aXNpw6fDo28gdmlhIGBQT1NUYC5cbiAgICogLSBgZnVuY3Rpb25gOiBNw6l0b2RvIHF1ZSBzZXLDoSBleGVjdXRhZG8uXG4gICAqXG4gICAqIE8gcmV0b3JubyBkZXN0YSBmdW7Dp8OjbyBkZXZlIHNlciBkbyB0aXBvIGBQb1BhZ2VEeW5hbWljRWRpdE9wdGlvbnNgLFxuICAgKiBvbmRlIG8gdXN1w6FyaW8gcG9kZXLDoSBjdXN0b21pemFyIG5vdm9zIGNhbXBvcywgYnJlYWRjcnVtYiwgdGl0bGUgZSBhY3Rpb25zXG4gICAqXG4gICAqIFBvciBleGVtcGxvOlxuICAgKlxuICAgKiBgYGBcbiAgICogZ2V0UGFnZU9wdGlvbnMoKTogUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zIHtcbiAgICogcmV0dXJuIHtcbiAgICogICBhY3Rpb25zOlxuICAgKiAgICAgeyBjYW5jZWw6IGZhbHNlLCBzYXZlOiAnc2F2ZS86aWQnLCBzYXZlTmV3OiAnc2F2ZU5ldycgfSxcbiAgICogICBmaWVsZHM6IFtcbiAgICogICAgIHsgcHJvcGVydHk6ICdpZENhcmQnLCBncmlkQ29sdW1uczogNiB9XG4gICAqICAgXVxuICAgKiB9O1xuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKiBQYXJhIHJlZmVyZW5jaWFyIGEgc3VhIGZ1bsOnw6NvIHV0aWxpemUgYSBwcm9wcmllZGFkZSBgYmluZGAsIHBvciBleGVtcGxvOlxuICAgKiBgYGBcbiAgICogIFtwLWxvYWRdPVwib25Mb2FkT3B0aW9ucy5iaW5kKHRoaXMpXCJcbiAgICogYGBgXG4gICAqL1xuICBASW5wdXQoJ3AtbG9hZCcpIG9uTG9hZDogc3RyaW5nIHwgKCgpID0+IFBvUGFnZUR5bmFtaWNFZGl0T3B0aW9ucyk7XG5cbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogRnVuw6fDo28gcXVlIHNlcsOhIGV4ZWN1dGFkYSBhcMOzcyBzZXIgcmVhbGl6YWRhIGEgYnVzY2EgZG9zIGRhZG9zLlxuICAgKlxuICAgKiBBIHByb3ByaWVkYWRlIGFjZWl0YSBvcyBzZWd1aW50ZXMgdGlwb3M6XG4gICAqIC0gYGZ1bmN0aW9uYDogTcOpdG9kbyBxdWUgc2Vyw6EgZXhlY3V0YWRvLlxuICAgKlxuICAgKiBFc3RhIGZ1bsOnw6NvIHBhc3NhIHBvciBwYXLDom1ldHJvIG8gbW9kZWwgZSBkZXZlIHJlY2Viw6otbG8gZGUgdm9sdGEgY29tIGFzIGFsdGVyYcOnw7Vlcy5cbiAgICogVGFtYsOpbSBhY2VpdGEgbyByZXRvcm5vIGRlIHVtIE9ic2VydmFibGUgY29tIG8gbm92byBtb2RlbC5cbiAgICpcbiAgICogUG9yIGV4ZW1wbG86XG4gICAqXG4gICAqIGBgYFxuICAgKiBvbkxvYWRDdXN0b20obW9kZWwpIHtcbiAgICogIHJldHVybiB7IC4uLm1vZGVsLCBjdXN0b21GaWVsZDogJ25ld1ZhbHVlJyB9O1xuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKiBQYXJhIHJlZmVyZW5jaWFyIGEgc3VhIGZ1bsOnw6NvIHV0aWxpemUgYSBwcm9wcmllZGFkZSBgYmluZGAsIHBvciBleGVtcGxvOlxuICAgKiBgYGBcbiAgICogIFtwLWxvYWQtZGF0YV09XCJvbkxvYWRDdXN0b20uYmluZCh0aGlzKVwiXG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCdwLWxvYWQtZGF0YScpIG9uTG9hZERhdGE6ICgobW9kZWw6IGFueSkgPT4gYW55KSB8ICgobW9kZWw6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+KTtcblxuICBtb2RlbDogYW55ID0ge307XG5cbiAgLy8gYmVmb3JlU2F2ZTogcmV0dXJuIGJvb2xlYW5cbiAgLy8gYWZ0ZXJTYXZlXG4gIC8vIGJlZm9yZVJlbW92ZTogcmV0dXJuIGJvb2xlYW5cbiAgLy8gYWZ0ZXJSZW1vdmVcbiAgLy8gYmVmb3JlSW5zZXJ0OiA6IHJldHVybiBib29sZWFuXG4gIHJlYWRvbmx5IGRldGFpbEFjdGlvbnM6IFBvR3JpZFJvd0FjdGlvbnMgPSB7fTtcblxuICBwcml2YXRlIGluZGV4Rm9jdXMgPSAwO1xuICBwcml2YXRlIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuICBwcml2YXRlIF9hY3Rpb25zOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnMgPSB7fTtcbiAgcHJpdmF0ZSBfbGl0ZXJhbHM6IFBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHM7XG4gIHByaXZhdGUgX2F1dG9Sb3V0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29udHJvbEZpZWxkczogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9kZXRhaWxGaWVsZHM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfZHVwbGljYXRlczogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9maWVsZHM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfa2V5czogQXJyYXk8YW55PiA9IFtdO1xuICBwcml2YXRlIF9wYWdlQWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtdO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25UeXBlPzogc3RyaW5nID0gcG9Ob3RpZmljYXRpb25UeXBlRGVmYXVsdDtcbiAgLyoqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQcOnw7VlcyBkYSBww6FnaW5hLlxuICAgKi9cbiAgQElucHV0KCdwLWFjdGlvbnMnKSBzZXQgYWN0aW9ucyh2YWx1ZTogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zKSB7XG4gICAgdGhpcy5fYWN0aW9ucyA9IHRoaXMuaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fTtcblxuICAgIHRoaXMuX3BhZ2VBY3Rpb25zID0gdGhpcy5nZXRQYWdlQWN0aW9ucyh0aGlzLl9hY3Rpb25zKTtcbiAgfVxuXG4gIGdldCBhY3Rpb25zKCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX2FjdGlvbnMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAb3B0aW9uYWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIE9iamV0byBjb20gYXMgbGl0ZXJhaXMgdXNhZGFzIG5vIGBwby1wYWdlLWR5bmFtaWMtZWRpdGAuXG4gICAqXG4gICAqIMOJIHBvc3NpdmVsIGN1c3RvbWl6YXIgcGFzc2FuZG8gdW0gb2JqZXRvIGNvbSB0b2RhcyBhcyBsaXRlcmFpcyBkaXNwb27DrXZlaXNcbiAgICogb3UgcGFzc2FuZG8gYXBlbmFzIGFzIGxpdGVyYWlzIHF1ZSBkZXNlamEgY3VzdG9taXphclxuICAgKlxuICAgKiBgYGBcbiAgICogIGNvbnN0IGN1c3RvbUxpdGVyYWxzOiBQb1BhZ2VEeW5hbWljRWRpdExpdGVyYWxzID0ge1xuICAgKiAgICBkZXRhaWxBY3Rpb25OZXc6ICdJbmNsdWlyJyxcbiAgICogICAgcGFnZUFjdGlvbkNhbmNlbDogJ0Rlc2NhcnRhcicsXG4gICAqICAgIHBhZ2VBY3Rpb25TYXZlOiAnR3JhdmFyJyxcbiAgICogICAgcGFnZUFjdGlvblNhdmVOZXc6ICdHcmF2YXIgZSBpbmNsdWlyJyxcbiAgICogICAgcmVnaXN0ZXJOb3RGb3VuZDogJ05lbmh1bSByZWdpc3RybyBlbmNvbnRyYWRvLicsXG4gICAqICAgIHNhdmVOb3RpZmljYXRpb25FcnJvcjogJ0NhbXBvKHMpIG9icmlnYXTDs3JpbyhzKSBzZW0gcHJlZW5jaGltZW50by4nLFxuICAgKiAgICBzYXZlTm90aWZpY2F0aW9uU3VjY2Vzc1NhdmU6ICdJdGVtIHNhbHZvIGNvbSBzdWNlc3NvLicsXG4gICAqICAgIHNhdmVOb3RpZmljYXRpb25TdWNjZXNzVXBkYXRlOiAnSXRlbSBhdHVhbGl6YWRvIGNvbSBzdWNlc3NvLicsXG4gICAqICAgIHNhdmVOb3RpZmljYXRpb25XYXJuaW5nOiAnTmVjZXNzw6FyaW8gcHJlZW5jaGVyIG8gZm9ybXVsw6FyaW8gY29ycmV0YW1lbnRlLidcbiAgICogIH07XG4gICAqIGBgYFxuICAgKlxuICAgKiBFIHBhcmEgY2FycmVnYXIgYXMgbGl0ZXJhaXMgY3VzdG9taXphZGFzLCBiYXN0YSBhcGVuYXMgcGFzc2FyIG8gb2JqZXRvIHBhcmEgbyBjb21wb25lbnRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHBvLXBhZ2UtZHluYW1pYy1lZGl0XG4gICAqICAgW3AtbGl0ZXJhbHNdPVwiY3VzdG9tTGl0ZXJhbHNcIj5cbiAgICogPC9wby1wYWdlLWR5bmFtaWMtZWRpdD5cbiAgICogYGBgXG4gICAqXG4gICAqID4gTyB2YWxvciBwYWRyw6NvIHNlcsOhIHRyYWR1emlkbyBkZSBhY29yZG8gY29tIG8gaWRpb21hIGNvbmZpZ3VyYWRvIG5vIFtgUG9JMThuU2VydmljZWBdKC9kb2N1bWVudGF0aW9uL3BvLWkxOG4pIG91ICpicm93c2VyKi5cbiAgICovXG4gIEBJbnB1dCgncC1saXRlcmFscycpIHNldCBsaXRlcmFscyh2YWx1ZTogUG9QYWdlRHluYW1pY0VkaXRMaXRlcmFscykge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICB0aGlzLl9saXRlcmFscyA9IHtcbiAgICAgICAgLi4ucG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHRbcG9Mb2NhbGVEZWZhdWx0XSxcbiAgICAgICAgLi4ucG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHRbdGhpcy5sYW5ndWFnZV0sXG4gICAgICAgIC4uLnZhbHVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXRlcmFscyA9IHBvUGFnZUR5bmFtaWNFZGl0TGl0ZXJhbHNEZWZhdWx0W3RoaXMubGFuZ3VhZ2VdO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VBY3Rpb25zID0gdGhpcy5nZXRQYWdlQWN0aW9ucyh0aGlzLl9hY3Rpb25zKTtcbiAgfVxuXG4gIGdldCBsaXRlcmFscygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGl0ZXJhbHMgfHwgcG9QYWdlRHluYW1pY0VkaXRMaXRlcmFsc0RlZmF1bHRbdGhpcy5sYW5ndWFnZV07XG4gIH1cblxuICAvKipcbiAgICogQG9wdGlvbmFsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBUaXBvIGRhIG5vdGlmaWNhw6fDo28uXG4gICAqXG4gICAqIMOJIHBvc3NpdmVsIGRlZmluaXIgbyB0aXBvIGRlIG5vdGlmaWNhw6fDo28gcXVlIHNlcsOhIGV4aWJpZG8gcXVhbmRvIGhvdXZlciBhbGd1bSBjYW1wbyBpbnbDoWxpZG8gbm8gZm9ybXVsw6FyaW8uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8cG8tcGFnZS1keW5hbWljLWVkaXRcbiAgICogICBwLW5vdGlmaWNhdGlvbi10eXBlPVwid2FybmluZ1wiPlxuICAgKiA8L3BvLXBhZ2UtZHluYW1pYy1lZGl0PlxuICAgKiBgYGBcbiAgICpcbiAgICogPiBPcyB2YWxvcmVzIGFjZWl0b3Mgc8OjbyAnd2FybmluZycgZSAnZXJyb3InLlxuICAgKiBAZGVmYXVsdCB3YXJuaW5nXG4gICAqL1xuICBASW5wdXQoJ3Atbm90aWZpY2F0aW9uLXR5cGUnKSBzZXQgbm90aWZpY2F0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uVHlwZSA9IHBvTm90aWZpY2F0aW9uVHlwZS5pbmNsdWRlcyh2YWx1ZSkgPyB2YWx1ZSA6IHBvTm90aWZpY2F0aW9uVHlwZURlZmF1bHQ7XG4gIH1cblxuICBnZXQgbm90aWZpY2F0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbm90aWZpY2F0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyBWYWxpZGFyIHJvdGFzIG5hIG3Do28gcG9pcyBzZSBleGlzdGlyIHVtYSByb3RhICcqKicgbyBjYXRjaCBkbyBuYXZpZ2F0aW9uIG7Do28gZnVuY2lvbmEuXG4gICAqXG4gICAqIEBvcHRpb25hbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQ3JpYSBhdXRvbWF0aWNhbWVudGUgYXMgcm90YXMgZGUgZWRpw6fDo28gKG5vdm8vZHVwbGljYXRlKSBlIGRldGFsaGVzIGNhc28gYXMgYcOnw7Vlc1xuICAgKiBlc3RlamFtIGRlZmluaWRhcyBuYXMgYcOnw7Vlcy5cbiAgICpcbiAgICogPiBQYXJhIG8gY29ycmV0byBmdW5jaW9uYW1lbnRvIG7Do28gcG9kZSBoYXZlciBuZW5odW0gcm90YSBjb3JpbmdhIChgKipgKSBlc3BlY2lmaWNhZGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ3AtYXV0by1yb3V0ZXInKSBzZXQgYXV0b1JvdXRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2F1dG9Sb3V0ZXIgPSBjb252ZXJ0VG9Cb29sZWFuKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhdXRvUm91dGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hdXRvUm91dGVyO1xuICB9XG5cbiAgLyoqIExpc3RhIGRvcyBjYW1wb3MgdXNhZG9zIG5hIHRhYmVsYSBlIGJ1c2NhIGF2YW7Dp2FkYS4gKi9cbiAgQElucHV0KCdwLWZpZWxkcycpIHNldCBmaWVsZHModmFsdWU6IEFycmF5PFBvUGFnZUR5bmFtaWNFZGl0RmllbGQ+KSB7XG4gICAgdGhpcy5fZmllbGRzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW107XG5cbiAgICB0aGlzLl9rZXlzID0gdGhpcy5nZXRLZXlzQnlGaWVsZHModGhpcy5fZmllbGRzKTtcbiAgICB0aGlzLl9kdXBsaWNhdGVzID0gdGhpcy5nZXREdXBsaWNhdGVzQnlGaWVsZHModGhpcy5fZmllbGRzKTtcblxuICAgIHRoaXMuX2NvbnRyb2xGaWVsZHMgPSB0aGlzLmdldENvbnRyb2xGaWVsZHModGhpcy5fZmllbGRzKTtcbiAgICB0aGlzLl9kZXRhaWxGaWVsZHMgPSB0aGlzLmdldERldGFpbEZpZWxkcyh0aGlzLl9maWVsZHMpO1xuICB9XG5cbiAgZ2V0IGZpZWxkcygpOiBBcnJheTxQb1BhZ2VEeW5hbWljRWRpdEZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBwb05vdGlmaWNhdGlvbjogUG9Ob3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcG9EaWFsb2dTZXJ2aWNlOiBQb0RpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VEeW5hbWljU2VydmljZTogUG9QYWdlRHluYW1pY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZTogUG9QYWdlQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNTZXJ2aWNlOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNTZXJ2aWNlLFxuICAgIGxhbmd1YWdlU2VydmljZTogUG9MYW5ndWFnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlU2VydmljZS5nZXRTaG9ydExhbmd1YWdlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREYXRhRnJvbUFQSSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkZXRhaWxBY3Rpb25OZXcoKSB7XG4gICAgdGhpcy5ncmlkRGV0YWlsLmluc2VydFJvdygpO1xuICB9XG5cbiAgZ2V0IGR1cGxpY2F0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9kdXBsaWNhdGVzXTtcbiAgfVxuXG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fa2V5c107XG4gIH1cblxuICBnZXQgcGFnZUFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9wYWdlQWN0aW9uc107XG4gIH1cblxuICBnZXQgY29udHJvbEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbEZpZWxkcztcbiAgfVxuXG4gIGdldCBkZXRhaWxGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RldGFpbEZpZWxkcztcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGFGcm9tQVBJKCkge1xuICAgIGNvbnN0IHsgc2VydmljZUFwaTogc2VydmljZUFwaUZyb21Sb3V0ZSwgc2VydmljZU1ldGFkYXRhQXBpLCBzZXJ2aWNlTG9hZEFwaSB9ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5kYXRhO1xuICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zO1xuICAgIGNvbnN0IHsgZHVwbGljYXRlIH0gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuXG4gICAgY29uc3Qgb25Mb2FkID0gc2VydmljZUxvYWRBcGkgfHwgdGhpcy5vbkxvYWQ7XG4gICAgdGhpcy5zZXJ2aWNlQXBpID0gc2VydmljZUFwaUZyb21Sb3V0ZSB8fCB0aGlzLnNlcnZpY2VBcGk7XG5cbiAgICB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmNvbmZpZ1NlcnZpY2VBcGkoeyBlbmRwb2ludDogdGhpcy5zZXJ2aWNlQXBpLCBtZXRhZGF0YTogc2VydmljZU1ldGFkYXRhQXBpIH0pO1xuXG4gICAgY29uc3QgbWV0YWRhdGEkID0gdGhpcy5nZXRNZXRhZGF0YShzZXJ2aWNlQXBpRnJvbVJvdXRlLCBpZCwgb25Mb2FkKTtcbiAgICBjb25zdCBkYXRhJCA9IHRoaXMubG9hZERhdGEoaWQsIGR1cGxpY2F0ZSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChjb25jYXQobWV0YWRhdGEkLCBkYXRhJCkuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWwoXG4gICAgYWN0aW9uQ2FuY2VsOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNbJ2NhbmNlbCddLFxuICAgIGFjdGlvbkJlZm9yZUNhbmNlbDogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zWydiZWZvcmVDYW5jZWwnXVxuICApIHtcbiAgICBpZiAodGhpcy5keW5hbWljRm9ybSAmJiB0aGlzLmR5bmFtaWNGb3JtLmZvcm0uZGlydHkpIHtcbiAgICAgIHRoaXMucG9EaWFsb2dTZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLmxpdGVyYWxzLmNhbmNlbENvbmZpcm1NZXNzYWdlLFxuICAgICAgICB0aXRsZTogdGhpcy5saXRlcmFscy5wYWdlQWN0aW9uQ2FuY2VsLFxuICAgICAgICBjb25maXJtOiB0aGlzLmdvQmFjay5iaW5kKHRoaXMsIGFjdGlvbkNhbmNlbCwgYWN0aW9uQmVmb3JlQ2FuY2VsKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ29CYWNrKGFjdGlvbkNhbmNlbCwgYWN0aW9uQmVmb3JlQ2FuY2VsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFVuaXF1ZUtleShpdGVtKSB7XG4gICAgY29uc3Qga2V5cyA9IG1hcE9iamVjdEJ5UHJvcGVydGllcyhpdGVtLCB0aGlzLmtleXMpO1xuXG4gICAgcmV0dXJuIHZhbHVlc0Zyb21PYmplY3Qoa2V5cykuam9pbignfCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnb0JhY2soXG4gICAgYWN0aW9uQ2FuY2VsOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNbJ2NhbmNlbCddLFxuICAgIGFjdGlvbkJlZm9yZUNhbmNlbDogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zWydiZWZvcmVDYW5jZWwnXVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMucG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zU2VydmljZVxuICAgICAgICAuYmVmb3JlQ2FuY2VsKGFjdGlvbkJlZm9yZUNhbmNlbClcbiAgICAgICAgLnN1YnNjcmliZSgoYmVmb3JlQ2FuY2VsUmVzdWx0OiBQb1BhZ2VEeW5hbWljRWRpdEJlZm9yZUNhbmNlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZUJhY2tBY3Rpb24oYWN0aW9uQ2FuY2VsLCBiZWZvcmVDYW5jZWxSZXN1bHQ/LmFsbG93QWN0aW9uLCBiZWZvcmVDYW5jZWxSZXN1bHQ/Lm5ld1VybCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZUJhY2tBY3Rpb24oXG4gICAgYWN0aW9uQ2FuY2VsOiBQb1BhZ2VEeW5hbWljRWRpdEFjdGlvbnNbJ2NhbmNlbCddLFxuICAgIGFsbG93QWN0aW9uPzogUG9QYWdlRHluYW1pY0VkaXRCZWZvcmVDYW5jZWxbJ2FsbG93QWN0aW9uJ10sXG4gICAgbmV3VXJsPzogUG9QYWdlRHluYW1pY0VkaXRCZWZvcmVDYW5jZWxbJ25ld1VybCddXG4gICkge1xuICAgIGNvbnN0IGlzQWxsb3dlZEFjdGlvbiA9IHR5cGVvZiBhbGxvd0FjdGlvbiA9PT0gJ2Jvb2xlYW4nID8gYWxsb3dBY3Rpb24gOiB0cnVlO1xuXG4gICAgaWYgKGlzQWxsb3dlZEFjdGlvbikge1xuICAgICAgaWYgKGFjdGlvbkNhbmNlbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBhY3Rpb25DYW5jZWwgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbkNhbmNlbCA9PT0gJ3N0cmluZycgfHwgbmV3VXJsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbbmV3VXJsIHx8IGFjdGlvbkNhbmNlbF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWN0aW9uQ2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShpZCwgZHVwbGljYXRlPykge1xuICAgIGlmICghaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBkdXBsaWNhdGUgPyBKU09OLnBhcnNlKGR1cGxpY2F0ZSkgOiB7fTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLm1vZGVsID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5nZXRSZXNvdXJjZShpZCkucGlwZShcbiAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgIHRoaXMuYmVmb3JlU2V0TW9kZWwocmVzcG9uc2UpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wYWdlQWN0aW9ucyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJlZm9yZVNldE1vZGVsKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMub25Mb2FkRGF0YSkge1xuICAgICAgdGhpcy5tb2RlbCA9IHJlc3BvbnNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9uTG9hZERhdGFFeGVjdXRpb24gPSB0aGlzLm9uTG9hZERhdGEocmVzcG9uc2UpO1xuICAgIGNvbnN0IG9uTG9hZERhdGEkID0gb25Mb2FkRGF0YUV4ZWN1dGlvbiBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyBvbkxvYWREYXRhRXhlY3V0aW9uIDogb2Yob25Mb2FkRGF0YUV4ZWN1dGlvbik7XG5cbiAgICBvbkxvYWREYXRhJC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogY3VzdG9tTW9kZWwgPT4ge1xuICAgICAgICB0aGlzLm1vZGVsID0gY3VzdG9tTW9kZWw7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHJlc3BvbnNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkT3B0aW9uc09uSW5pdGlhbGl6ZShvbkxvYWQ6IFVybE9yUG9DdXN0b21pemF0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAob25Mb2FkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQb0R5bmFtaWNQYWdlT3B0aW9ucyhvbkxvYWQpLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZVBvT3B0aW9uID0+XG4gICAgICAgICAgdGhpcy5wb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZS5jaGFuZ2VPcmlnaW5hbE9wdGlvbnNUb05ld09wdGlvbnModGhpcywgcmVzcG9uc2VQb09wdGlvbilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2hlY2tib3hJbnB1dChjb250cm9sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjaGVja2JveEdyb3VwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgcG8tY2hlY2tib3gtZ3JvdXBbbmctcmVmbGVjdC1uYW1lPSR7Y29udHJvbH1dYCk7XG4gICAgaWYgKGNoZWNrYm94R3JvdXApIHtcbiAgICAgIGNvbnN0IGNoZWNrQm94Q29tcG9uZW50ID0gY2hlY2tib3hHcm91cC5xdWVyeVNlbGVjdG9yKCdwby1jaGVja2JveFtuZy1yZWZsZWN0LWRpc2FibGVkPWZhbHNlXScpO1xuICAgICAgY29uc3QgbGFiZWxJbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGNoZWNrQm94Q29tcG9uZW50Py5xdWVyeVNlbGVjdG9yKCcucG8tY2hlY2tib3gtb3V0bGluZScpO1xuICAgICAgaWYgKGxhYmVsSW5wdXQpIHtcbiAgICAgICAgbGFiZWxJbnB1dC5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmRleEZvY3VzLS07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0NvbnRyb2woY29udHJvbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRFbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW25hbWU9JHtjb250cm9sfV1gKTtcbiAgICBpZiAoaW5wdXRFbGVtZW50KSB7XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcbiAgICAgICAgaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzUmFkaW9JbnB1dChpbnB1dEVsZW1lbnQsIGNvbnRyb2wpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzQ2hlY2tib3hJbnB1dChjb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUmFkaW9JbnB1dChpbnB1dEVsZW1lbnQ6IEVsZW1lbnQsIGNvbnRyb2w6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJhZGlvQ29tcG9uZW50ID0gaW5wdXRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBgcG8tcmFkaW9bbmctcmVmbGVjdC1uYW1lPSR7Y29udHJvbH1dW25nLXJlZmxlY3QtZGlzYWJsZWQ9ZmFsc2VdYFxuICAgICk7XG4gICAgaWYgKHJhZGlvQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCByYWRpb0lucHV0ID0gcmFkaW9Db21wb25lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgIHJhZGlvSW5wdXQuZm9jdXMoKTtcbiAgICAgIHJhZGlvSW5wdXQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BvLXJhZGlvLWZvY3VzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5kZXhGb2N1cy0tO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9EeW5hbWljUGFnZU9wdGlvbnMob25Mb2FkOiBVcmxPclBvQ3VzdG9taXphdGlvbkZ1bmN0aW9uKTogT2JzZXJ2YWJsZTxQb1BhZ2VEeW5hbWljRWRpdE9wdGlvbnM+IHtcbiAgICBjb25zdCBvcmlnaW5hbE9wdGlvbjogUG9QYWdlRHluYW1pY0VkaXRPcHRpb25zID0ge1xuICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcyxcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucyxcbiAgICAgIGJyZWFkY3J1bWI6IHRoaXMuYnJlYWRjcnVtYixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlXG4gICAgfTtcblxuICAgIGNvbnN0IHBhZ2VPcHRpb25TY2hlbWE6IFBvUGFnZUR5bmFtaWNPcHRpb25zU2NoZW1hPFBvUGFnZUR5bmFtaWNFZGl0T3B0aW9ucz4gPSB7XG4gICAgICBzY2hlbWE6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWVQcm9wOiAnZmllbGRzJyxcbiAgICAgICAgICBtZXJnZTogdHJ1ZSxcbiAgICAgICAgICBrZXlGb3JNZXJnZTogJ3Byb3BlcnR5J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdhY3Rpb25zJyxcbiAgICAgICAgICBtZXJnZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICdicmVhZGNydW1iJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZVByb3A6ICd0aXRsZSdcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wb1BhZ2VDdXN0b21pemF0aW9uU2VydmljZS5nZXRDdXN0b21PcHRpb25zKG9uTG9hZCwgb3JpZ2luYWxPcHRpb24sIHBhZ2VPcHRpb25TY2hlbWEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZXRhZGF0YShzZXJ2aWNlQXBpRnJvbVJvdXRlOiBzdHJpbmcsIHBhcmFtSWQ6IHN0cmluZyB8IG51bWJlciwgb25Mb2FkOiBVcmxPclBvQ3VzdG9taXphdGlvbkZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZU1ldGFkYXRhID0gcGFyYW1JZCA/ICdlZGl0JyA6ICdjcmVhdGUnO1xuXG4gICAgaWYgKHNlcnZpY2VBcGlGcm9tUm91dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvUGFnZUR5bmFtaWNTZXJ2aWNlLmdldE1ldGFkYXRhPFBvUGFnZUR5bmFtaWNFZGl0TWV0YWRhdGE+KHR5cGVNZXRhZGF0YSkucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLmF1dG9Sb3V0ZXIgPSByZXNwb25zZS5hdXRvUm91dGVyIHx8IHRoaXMuYXV0b1JvdXRlcjtcbiAgICAgICAgICB0aGlzLmFjdGlvbnMgPSByZXNwb25zZS5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucztcbiAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSByZXNwb25zZS5icmVhZGNydW1iIHx8IHRoaXMuYnJlYWRjcnVtYjtcbiAgICAgICAgICB0aGlzLmZpZWxkcyA9IHJlc3BvbnNlLmZpZWxkcyB8fCB0aGlzLmZpZWxkcztcbiAgICAgICAgICB0aGlzLnRpdGxlID0gcmVzcG9uc2UudGl0bGUgfHwgdGhpcy50aXRsZTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCkpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvYWRPcHRpb25zT25Jbml0aWFsaXplKG9uTG9hZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtDb250cm9sc0FzRGlydHlBbmRGb2N1c0ZpcnN0SW52YWxpZCgpOiB2b2lkIHtcbiAgICB0aGlzLmluZGV4Rm9jdXMgPSAwO1xuICAgIGNvbnN0IGNvbnRyb2xzID0gT2JqZWN0LmtleXModGhpcy5keW5hbWljRm9ybS5mb3JtLmNvbnRyb2xzKTtcblxuICAgIGNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICB0aGlzLmR5bmFtaWNGb3JtLmZvcm0uY29udHJvbHNbY29udHJvbF0ubWFya0FzRGlydHkoKTtcbiAgICAgIGlmICh0aGlzLmR5bmFtaWNGb3JtLmZvcm0uY29udHJvbHNbY29udHJvbF0uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgdGhpcy5pbmRleEZvY3VzID09PSAwKSB7XG4gICAgICAgIHRoaXMuZm9jdXNDb250cm9sKGNvbnRyb2wpO1xuICAgICAgICB0aGlzLmluZGV4Rm9jdXMrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmF2aWdhdGVUbyhwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAocGF0aCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5yZXNvbHZlVXJsKHRoaXMubW9kZWwsIHBhdGgpO1xuXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVVbmlxdWVLZXkoaXRlbTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zWydpZCddID8gdGhpcy5mb3JtYXRVbmlxdWVLZXkoaXRlbSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVVcmwoaXRlbTogYW55LCBwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSB0aGlzLmZvcm1hdFVuaXF1ZUtleShpdGVtKTtcblxuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoLzppZC9nLCB1bmlxdWVLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU2F2ZShzYXZlUmVkaXJlY3RQYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzYXZlT3BlcmF0aW9uJCA9IHRoaXMuc2F2ZU9wZXJhdGlvbigpO1xuXG4gICAgcmV0dXJuIHNhdmVPcGVyYXRpb24kLnBpcGUoXG4gICAgICB0YXAobWVzc2FnZSA9PiB7XG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uc3VjY2VzcyhtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHNhdmVSZWRpcmVjdFBhdGgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb2RlbChuZXdSZXNvdXJjZTogYW55ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIG5ld1Jlc291cmNlICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3Qua2V5cyhuZXdSZXNvdXJjZSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBkeW5hbWljTmdGb3JtID0gdGhpcy5keW5hbWljRm9ybS5mb3JtO1xuXG4gICAgICByZW1vdmVLZXlzUHJvcGVydGllcyh0aGlzLmtleXMsIG5ld1Jlc291cmNlKTtcblxuICAgICAgdGhpcy5tb2RlbCA9IHsgLi4udGhpcy5tb2RlbCwgLi4ubmV3UmVzb3VyY2UgfTtcblxuICAgICAgZHluYW1pY05nRm9ybS5mb3JtLnBhdGNoVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93Tm90aWZpY2F0aW9uKHR5cGU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24ud2FybmluZyh0aGlzLmxpdGVyYWxzLnNhdmVOb3RpZmljYXRpb25XYXJuaW5nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uZXJyb3IodGhpcy5saXRlcmFscy5zYXZlTm90aWZpY2F0aW9uRXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVPcGVyYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuZHluYW1pY0Zvcm0uZm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLm1hcmtDb250cm9sc0FzRGlydHlBbmRGb2N1c0ZpcnN0SW52YWxpZCgpO1xuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKHRoaXMuX25vdGlmaWNhdGlvblR5cGUpO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXTtcbiAgICBjb25zdCBzdWNjZXNzTXNnID0gcGFyYW1JZFxuICAgICAgPyB0aGlzLmxpdGVyYWxzLnNhdmVOb3RpZmljYXRpb25TdWNjZXNzVXBkYXRlXG4gICAgICA6IHRoaXMubGl0ZXJhbHMuc2F2ZU5vdGlmaWNhdGlvblN1Y2Nlc3NTYXZlO1xuXG4gICAgY29uc3Qgc2F2ZU9wZXJhdGlvbiQgPSBwYXJhbUlkXG4gICAgICA/IHRoaXMucG9QYWdlRHluYW1pY1NlcnZpY2UudXBkYXRlUmVzb3VyY2UocGFyYW1JZCwgdGhpcy5tb2RlbClcbiAgICAgIDogdGhpcy5wb1BhZ2VEeW5hbWljU2VydmljZS5jcmVhdGVSZXNvdXJjZSh0aGlzLm1vZGVsKTtcblxuICAgIHJldHVybiBzYXZlT3BlcmF0aW9uJC5waXBlKG1hcCgoKSA9PiBzdWNjZXNzTXNnKSk7XG4gIH1cblxuICBwcml2YXRlIHNhdmUoYWN0aW9uOiBTYXZlQWN0aW9uLCBiZWZvcmU6ICdiZWZvcmVTYXZlJyB8ICdiZWZvcmVTYXZlTmV3JyA9ICdiZWZvcmVTYXZlJykge1xuICAgIGNvbnN0IGV4ZWN1dGVPcGVyYXRpb24gPSB7XG4gICAgICBiZWZvcmVTYXZlOiB0aGlzLmV4ZWN1dGVTYXZlLmJpbmQodGhpcyksXG4gICAgICBiZWZvcmVTYXZlTmV3OiB0aGlzLmV4ZWN1dGVTYXZlTmV3LmJpbmQodGhpcylcbiAgICB9O1xuXG4gICAgY29uc3QgdW5pcXVlS2V5ID0gdGhpcy5yZXNvbHZlVW5pcXVlS2V5KHRoaXMubW9kZWwpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnBvUGFnZUR5bmFtaWNFZGl0QWN0aW9uc1NlcnZpY2VbYmVmb3JlXSh0aGlzLmFjdGlvbnNbYmVmb3JlXSwgdW5pcXVlS2V5LCB7IC4uLnRoaXMubW9kZWwgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKHJldHVybkJlZm9yZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdBY3Rpb24gPSByZXR1cm5CZWZvcmU/Lm5ld1VybCA/PyBhY3Rpb247XG4gICAgICAgICAgICBjb25zdCBhbGxvd0FjdGlvbiA9IHJldHVybkJlZm9yZT8uYWxsb3dBY3Rpb24gPz8gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlbChyZXR1cm5CZWZvcmU/LnJlc291cmNlKTtcblxuICAgICAgICAgICAgaWYgKCFhbGxvd0FjdGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5ld0FjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVPcGVyYXRpb25bYmVmb3JlXShuZXdBY3Rpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3QWN0aW9uKHsgLi4udGhpcy5tb2RlbCB9LCB1bmlxdWVLZXkpO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlU2F2ZU5ldyhwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJhbUlkID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2lkJ107XG4gICAgY29uc3Qgc2F2ZU9wZXJhdGlvbiQgPSB0aGlzLnNhdmVPcGVyYXRpb24oKTtcblxuICAgIHJldHVybiBzYXZlT3BlcmF0aW9uJC5waXBlKFxuICAgICAgdGFwKG1lc3NhZ2UgPT4ge1xuICAgICAgICBpZiAocGFyYW1JZCkge1xuICAgICAgICAgIHRoaXMucG9Ob3RpZmljYXRpb24uc3VjY2VzcyhtZXNzYWdlKTtcblxuICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyhwYXRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBvTm90aWZpY2F0aW9uLnN1Y2Nlc3MobWVzc2FnZSk7XG5cbiAgICAgICAgICB0aGlzLm1vZGVsID0ge307XG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybS5mb3JtLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0S2V5c0J5RmllbGRzKGZpZWxkczogQXJyYXk8YW55PiA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQua2V5ID09PSB0cnVlKS5tYXAoZmllbGQgPT4gZmllbGQucHJvcGVydHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250cm9sRmllbGRzKGZpZWxkczogQXJyYXk8YW55PiA9IFtdKSB7XG4gICAgcmV0dXJuIGZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGQudHlwZSAhPT0gJ2RldGFpbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXRhaWxGaWVsZHMoZmllbGRzOiBBcnJheTxhbnk+ID0gW10pIHtcbiAgICByZXR1cm4gZmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC50eXBlID09PSAnZGV0YWlsJyk7XG4gIH1cblxuICBwcml2YXRlIGdldER1cGxpY2F0ZXNCeUZpZWxkcyhmaWVsZHM6IEFycmF5PGFueT4gPSBbXSkge1xuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmR1cGxpY2F0ZSA9PT0gdHJ1ZSkubWFwKGZpZWxkID0+IGZpZWxkLnByb3BlcnR5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFnZUFjdGlvbnMoYWN0aW9uczogUG9QYWdlRHluYW1pY0VkaXRBY3Rpb25zID0ge30pOiBBcnJheTxQb1BhZ2VBY3Rpb24+IHtcbiAgICBjb25zdCBwYWdlQWN0aW9uczogQXJyYXk8UG9QYWdlQWN0aW9uPiA9IFtcbiAgICAgIHsgbGFiZWw6IHRoaXMubGl0ZXJhbHMucGFnZUFjdGlvblNhdmUsIGFjdGlvbjogdGhpcy5zYXZlLmJpbmQodGhpcywgYWN0aW9ucy5zYXZlKSB9XG4gICAgXTtcblxuICAgIGlmIChhY3Rpb25zLnNhdmVOZXcpIHtcbiAgICAgIHBhZ2VBY3Rpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogdGhpcy5saXRlcmFscy5wYWdlQWN0aW9uU2F2ZU5ldyxcbiAgICAgICAgYWN0aW9uOiB0aGlzLnNhdmUuYmluZCh0aGlzLCBhY3Rpb25zLnNhdmVOZXcsICdiZWZvcmVTYXZlTmV3JylcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb25zLmNhbmNlbCA9PT0gdW5kZWZpbmVkIHx8IGFjdGlvbnMuY2FuY2VsKSB7XG4gICAgICBwYWdlQWN0aW9ucy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHRoaXMubGl0ZXJhbHMucGFnZUFjdGlvbkNhbmNlbCxcbiAgICAgICAgYWN0aW9uOiB0aGlzLmNhbmNlbC5iaW5kKHRoaXMsIGFjdGlvbnMuY2FuY2VsLCB0aGlzLmFjdGlvbnMuYmVmb3JlQ2FuY2VsKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2VBY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH1cbn1cbiIsIjxwby1wYWdlLWRlZmF1bHQgW3AtYWN0aW9uc109XCJwYWdlQWN0aW9uc1wiIFtwLWJyZWFkY3J1bWJdPVwiYnJlYWRjcnVtYlwiIFtwLXRpdGxlXT1cInRpdGxlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlbDsgdGhlbiBmb3JtRmllbGRzVGVtcGxhdGU7IGVsc2UgcmVnaXN0ZXJOb3RGb3VuZFRlbXBsYXRlXCI+IDwvbmctY29udGFpbmVyPlxuPC9wby1wYWdlLWRlZmF1bHQ+XG5cbjxuZy10ZW1wbGF0ZSAjcmVnaXN0ZXJOb3RGb3VuZFRlbXBsYXRlPlxuICA8cG8td2lkZ2V0PlxuICAgIDxwby1pY29uIHAtaWNvbj1cIklDT05fSU5GT1wiPjwvcG8taWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cInBvLWZvbnQtdGV4dC1sYXJnZVwiPlxuICAgICAge3sgbGl0ZXJhbHMucmVnaXN0ZXJOb3RGb3VuZCB9fVxuICAgIDwvc3Bhbj5cbiAgPC9wby13aWRnZXQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Zvcm1GaWVsZHNUZW1wbGF0ZT5cbiAgPHBvLWR5bmFtaWMtZm9ybSAjZHluYW1pY0Zvcm0gW3AtZmllbGRzXT1cImNvbnRyb2xGaWVsZHNcIiBbcC12YWx1ZV09XCJtb2RlbFwiPiA8L3BvLWR5bmFtaWMtZm9ybT5cblxuICA8ZGl2ICpuZ0lmPVwiZGV0YWlsRmllbGRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInBvLXNtLTEyXCI+XG4gICAgPHBvLWRpdmlkZXIgW3AtbGFiZWxdPVwiZGV0YWlsRmllbGRzWzBdLmRpdmlkZXJcIj48L3BvLWRpdmlkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwicG8tcm93IHBvLW1iLTJcIj5cbiAgICAgIDxwby1idXR0b24gW3AtbGFiZWxdPVwibGl0ZXJhbHMuZGV0YWlsQWN0aW9uTmV3XCIgKHAtY2xpY2spPVwiZGV0YWlsQWN0aW9uTmV3KClcIj48L3BvLWJ1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxwby1ncmlkXG4gICAgICAjZ3JpZERldGFpbFxuICAgICAgW3Atcm93LWFjdGlvbnNdPVwiZGV0YWlsQWN0aW9uc1wiXG4gICAgICBbcC1jb2x1bW5zXT1cImRldGFpbEZpZWxkc1swXS5kZXRhaWwuY29sdW1uc1wiXG4gICAgICBbcC1kYXRhXT1cIm1vZGVsW2RldGFpbEZpZWxkc1swXS5wcm9wZXJ0eV1cIlxuICAgID5cbiAgICA8L3BvLWdyaWQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|