slick-components 4.4.13 → 4.4.16
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/css/slick-components.css +598 -365
- package/css/slick-components.min.css +1 -1
- package/esm2020/public-api.mjs +43 -0
- package/esm2020/slick-accordion/slick-accordion-item-header.component.mjs +14 -0
- package/esm2020/slick-accordion/slick-accordion-item.component.mjs +86 -0
- package/esm2020/slick-accordion/slick-accordion.component.mjs +75 -0
- package/esm2020/slick-accordion/slick-accordion.module.mjs +23 -0
- package/esm2020/slick-auto-complete/slick-auto-complete-list-item-template.directive.mjs +22 -0
- package/esm2020/slick-auto-complete/slick-auto-complete.component.mjs +375 -0
- package/esm2020/slick-auto-complete/slick-auto-complete.module.mjs +24 -0
- package/esm2020/slick-button-spinner/slick-button-spinner.component.mjs +175 -0
- package/esm2020/slick-button-spinner/slick-button-spinner.module.mjs +19 -0
- package/esm2020/slick-calendar/slick-calendar.component.mjs +246 -0
- package/esm2020/slick-calendar/slick-calendar.module.mjs +19 -0
- package/esm2020/slick-card/slick-card-header.component.mjs +14 -0
- package/esm2020/slick-card/slick-card.component.mjs +42 -0
- package/esm2020/slick-card/slick-card.module.mjs +20 -0
- package/esm2020/slick-components.mjs +5 -0
- package/esm2020/slick-confirm-dialog/slick-confirm-dialog.component.mjs +65 -0
- package/esm2020/slick-confirm-dialog/slick-confirm-dialog.module.mjs +20 -0
- package/esm2020/slick-container/slick-container-body.component.mjs +24 -0
- package/esm2020/slick-container/slick-container-footer.component.mjs +20 -0
- package/esm2020/slick-container/slick-container-header.component.mjs +20 -0
- package/esm2020/slick-container/slick-container.component.mjs +21 -0
- package/esm2020/slick-container/slick-container.module.mjs +25 -0
- package/esm2020/slick-context-menu/slick-context-menu-item.component.mjs +14 -0
- package/esm2020/slick-context-menu/slick-context-menu.component.mjs +48 -0
- package/esm2020/slick-context-menu/slick-context-menu.module.mjs +20 -0
- package/{esm2015/slick-currency-mask/slick-currency-mask-options.model.js → esm2020/slick-currency-mask/slick-currency-mask-options.model.mjs} +0 -0
- package/esm2020/slick-currency-mask/slick-currency-mask.directive.mjs +233 -0
- package/esm2020/slick-currency-mask/slick-currency-mask.module.mjs +19 -0
- package/esm2020/slick-date-picker/slick-date-picker.component.mjs +278 -0
- package/esm2020/slick-date-picker/slick-date-picker.module.mjs +21 -0
- package/esm2020/slick-dialog/slick-dialog-footer.component.mjs +24 -0
- package/esm2020/slick-dialog/slick-dialog.component.mjs +294 -0
- package/esm2020/slick-dialog/slick-dialog.module.mjs +23 -0
- package/esm2020/slick-dialog/slick-dialog.service.mjs +68 -0
- package/esm2020/slick-drag-drop/slick-drag-drop.directive.mjs +13 -0
- package/esm2020/slick-drag-drop/slick-drag-drop.module.mjs +21 -0
- package/esm2020/slick-drag-drop/slick-draggable.directive.mjs +13 -0
- package/{esm2015/slick-drop-down/slick-drop-down-button.model.js → esm2020/slick-drop-down/slick-drop-down-button.model.mjs} +0 -0
- package/esm2020/slick-drop-down/slick-drop-down.component.mjs +479 -0
- package/esm2020/slick-drop-down/slick-drop-down.module.mjs +24 -0
- package/esm2020/slick-drop-down/slick-drop-down.service.mjs +55 -0
- package/esm2020/slick-drop-list/slick-drop-list-grab.directive.mjs +18 -0
- package/esm2020/slick-drop-list/slick-drop-list-item.directive.mjs +18 -0
- package/esm2020/slick-drop-list/slick-drop-list.directive.mjs +215 -0
- package/esm2020/slick-drop-list/slick-drop-list.module.mjs +23 -0
- package/esm2020/slick-email-viewer/slick-email-viewer-dialog.component.mjs +81 -0
- package/esm2020/slick-email-viewer/slick-email-viewer.component.mjs +42 -0
- package/esm2020/slick-email-viewer/slick-email-viewer.module.mjs +26 -0
- package/{esm2015/slick-emailer/slick-emailer-address.model.js → esm2020/slick-emailer/slick-emailer-address.model.mjs} +0 -0
- package/esm2020/slick-emailer/slick-emailer-dialog.component.mjs +153 -0
- package/esm2020/slick-emailer/slick-emailer.component.mjs +235 -0
- package/{esm2015/slick-emailer/slick-emailer.model.js → esm2020/slick-emailer/slick-emailer.model.mjs} +0 -0
- package/esm2020/slick-emailer/slick-emailer.module.mjs +29 -0
- package/esm2020/slick-file-drop/slick-file-drop.component.mjs +156 -0
- package/esm2020/slick-file-drop/slick-file-drop.module.mjs +20 -0
- package/esm2020/slick-file-list/slick-file-list-item.component.mjs +173 -0
- package/esm2020/slick-file-list/slick-file-list.component.mjs +130 -0
- package/esm2020/slick-file-list/slick-file-list.module.mjs +23 -0
- package/{esm2015/slick-file-model/slick-file.model.js → esm2020/slick-file-model/slick-file.model.mjs} +0 -0
- package/esm2020/slick-google-address-search/slick-google-address-search.directive.mjs +75 -0
- package/esm2020/slick-google-address-search/slick-google-address-search.module.mjs +19 -0
- package/esm2020/slick-google-map/slick-google-map-dialog.component.mjs +50 -0
- package/esm2020/slick-google-map/slick-google-map.component.mjs +48 -0
- package/esm2020/slick-google-map/slick-google-map.module.mjs +22 -0
- package/esm2020/slick-grid/slick-grid-column-template.directive.mjs +19 -0
- package/{esm2015/slick-grid/slick-grid-column.model.js → esm2020/slick-grid/slick-grid-column.model.mjs} +0 -0
- package/{esm2015/slick-grid/slick-grid-favorite.model.js → esm2020/slick-grid/slick-grid-favorite.model.mjs} +0 -0
- package/{esm2015/slick-grid/slick-grid-request.model.js → esm2020/slick-grid/slick-grid-request.model.mjs} +0 -0
- package/{esm2015/slick-grid/slick-grid-response.model.js → esm2020/slick-grid/slick-grid-response.model.mjs} +0 -0
- package/esm2020/slick-grid/slick-grid-sanitize.pipe.mjs +20 -0
- package/esm2020/slick-grid/slick-grid.component.mjs +793 -0
- package/esm2020/slick-grid/slick-grid.module.mjs +43 -0
- package/{esm2015/slick-grid/slick-grid.options.js → esm2020/slick-grid/slick-grid.options.mjs} +0 -0
- package/esm2020/slick-grid/slick-grid.service.mjs +66 -0
- package/esm2020/slick-multi-select/slick-multi-select.component.mjs +362 -0
- package/esm2020/slick-multi-select/slick-multi-select.module.mjs +20 -0
- package/esm2020/slick-multi-select/slick-multi-select.service.mjs +77 -0
- package/esm2020/slick-ordered-list/slick-ordered-list.component.mjs +200 -0
- package/esm2020/slick-ordered-list/slick-ordered-list.module.mjs +20 -0
- package/esm2020/slick-paging/slick-paging.component.mjs +185 -0
- package/esm2020/slick-paging/slick-paging.module.mjs +19 -0
- package/esm2020/slick-photo-gallery/slick-photo-gallery.component.mjs +98 -0
- package/{esm2015/slick-photo-gallery/slick-photo-gallery.model.js → esm2020/slick-photo-gallery/slick-photo-gallery.model.mjs} +0 -0
- package/esm2020/slick-photo-gallery/slick-photo-gallery.module.mjs +21 -0
- package/esm2020/slick-pick-list/slick-pick-list.component.mjs +84 -0
- package/esm2020/slick-pick-list/slick-pick-list.module.mjs +20 -0
- package/esm2020/slick-popover/slick-popover.component.mjs +204 -0
- package/esm2020/slick-popover/slick-popover.module.mjs +19 -0
- package/esm2020/slick-profile-picture/slick-profile-picture.component.mjs +267 -0
- package/esm2020/slick-profile-picture/slick-profile-picture.module.mjs +20 -0
- package/esm2020/slick-progress-bar/slick-progress-bar.module.mjs +18 -0
- package/esm2020/slick-progress-bar/slick-progress-bar.service.mjs +53 -0
- package/esm2020/slick-screen-blocker/slick-screen-blocker.module.mjs +18 -0
- package/esm2020/slick-screen-blocker/slick-screen-blocker.service.mjs +83 -0
- package/{esm2015/slick-slider/slick-slider-tick.model.js → esm2020/slick-slider/slick-slider-tick.model.mjs} +0 -0
- package/esm2020/slick-slider/slick-slider.component.mjs +90 -0
- package/esm2020/slick-slider/slick-slider.module.mjs +20 -0
- package/esm2020/slick-split-screen/slick-screen-split-left-content.component.mjs +15 -0
- package/esm2020/slick-split-screen/slick-screen-split-right-content.component.mjs +15 -0
- package/esm2020/slick-split-screen/slick-split-screen.component.mjs +159 -0
- package/esm2020/slick-split-screen/slick-split-screen.module.mjs +21 -0
- package/esm2020/slick-tabs/slick-tab-header.component.mjs +28 -0
- package/esm2020/slick-tabs/slick-tab.component.mjs +63 -0
- package/{esm2015/slick-tabs/slick-tab.model.js → esm2020/slick-tabs/slick-tab.model.mjs} +0 -0
- package/esm2020/slick-tabs/slick-tabs.component.mjs +107 -0
- package/esm2020/slick-tabs/slick-tabs.module.mjs +23 -0
- package/esm2020/slick-toast/slick-toast.module.mjs +18 -0
- package/esm2020/slick-toast/slick-toast.service.mjs +88 -0
- package/{esm2015/slick-tree-view/slick-tree-node.model.js → esm2020/slick-tree-view/slick-tree-node.model.mjs} +0 -0
- package/esm2020/slick-tree-view/slick-tree-view.component.mjs +293 -0
- package/esm2020/slick-tree-view/slick-tree-view.module.mjs +22 -0
- package/esm2020/slick-type-ahead/slick-type-ahead.directive.mjs +164 -0
- package/esm2020/slick-type-ahead/slick-type-ahead.module.mjs +18 -0
- package/esm2020/slick-validation-indicator/slick-validation-indicator.directive.mjs +63 -0
- package/esm2020/slick-validation-indicator/slick-validation-indicator.module.mjs +19 -0
- package/esm2020/utils/slick-function-lock.service.mjs +55 -0
- package/esm2020/utils/slick-init.service.mjs +49 -0
- package/esm2020/utils/slick-log.service.mjs +23 -0
- package/esm2020/utils/slick-sleep.service.mjs +14 -0
- package/esm2020/utils/slick-utils.service.mjs +247 -0
- package/fesm2015/{slick-components.js → slick-components.mjs} +2779 -2070
- package/fesm2015/slick-components.mjs.map +1 -0
- package/fesm2020/slick-components.mjs +8467 -0
- package/fesm2020/slick-components.mjs.map +1 -0
- package/package.json +20 -8
- package/public-api.d.ts +8 -8
- package/slick-accordion/slick-accordion-item-header.component.d.ts +3 -0
- package/slick-accordion/slick-accordion-item.component.d.ts +3 -0
- package/slick-accordion/slick-accordion.component.d.ts +3 -0
- package/slick-accordion/slick-accordion.module.d.ts +8 -0
- package/slick-auto-complete/slick-auto-complete-list-item-template.directive.d.ts +3 -0
- package/slick-auto-complete/slick-auto-complete.component.d.ts +3 -0
- package/slick-auto-complete/slick-auto-complete.module.d.ts +8 -0
- package/slick-button-spinner/slick-button-spinner.component.d.ts +3 -0
- package/slick-button-spinner/slick-button-spinner.module.d.ts +6 -0
- package/slick-calendar/slick-calendar.component.d.ts +3 -0
- package/slick-calendar/slick-calendar.module.d.ts +6 -0
- package/slick-card/slick-card-header.component.d.ts +3 -0
- package/slick-card/slick-card.component.d.ts +3 -0
- package/slick-card/slick-card.module.d.ts +10 -0
- package/slick-components.d.ts +1 -22
- package/slick-confirm-dialog/slick-confirm-dialog.component.d.ts +3 -0
- package/slick-confirm-dialog/slick-confirm-dialog.module.d.ts +7 -0
- package/slick-container/slick-container-body.component.d.ts +3 -0
- package/slick-container/slick-container-footer.component.d.ts +3 -0
- package/slick-container/slick-container-header.component.d.ts +3 -0
- package/slick-container/slick-container.component.d.ts +3 -0
- package/slick-container/slick-container.module.d.ts +9 -0
- package/slick-context-menu/slick-context-menu-item.component.d.ts +3 -0
- package/slick-context-menu/slick-context-menu.component.d.ts +3 -0
- package/slick-context-menu/slick-context-menu.module.d.ts +7 -0
- package/slick-currency-mask/slick-currency-mask.directive.d.ts +3 -0
- package/slick-currency-mask/slick-currency-mask.module.d.ts +5 -0
- package/slick-date-picker/slick-date-picker.component.d.ts +3 -0
- package/slick-date-picker/slick-date-picker.module.d.ts +8 -0
- package/slick-dialog/slick-dialog-footer.component.d.ts +3 -0
- package/slick-dialog/slick-dialog.component.d.ts +3 -0
- package/slick-dialog/slick-dialog.module.d.ts +10 -1
- package/slick-dialog/slick-dialog.service.d.ts +3 -0
- package/slick-drag-drop/slick-drag-drop.directive.d.ts +3 -0
- package/slick-drag-drop/slick-drag-drop.module.d.ts +11 -0
- package/slick-drag-drop/slick-draggable.directive.d.ts +3 -0
- package/slick-drop-down/slick-drop-down.component.d.ts +3 -0
- package/slick-drop-down/slick-drop-down.module.d.ts +9 -0
- package/slick-drop-down/slick-drop-down.service.d.ts +3 -0
- package/slick-drop-list/slick-drop-list-grab.directive.d.ts +3 -0
- package/slick-drop-list/slick-drop-list-item.directive.d.ts +3 -0
- package/slick-drop-list/slick-drop-list.directive.d.ts +13 -7
- package/slick-drop-list/slick-drop-list.module.d.ts +14 -0
- package/slick-email-viewer/slick-email-viewer-dialog.component.d.ts +3 -0
- package/slick-email-viewer/slick-email-viewer.component.d.ts +3 -0
- package/slick-email-viewer/slick-email-viewer.module.d.ts +10 -0
- package/slick-emailer/slick-emailer-dialog.component.d.ts +3 -0
- package/slick-emailer/slick-emailer.component.d.ts +3 -0
- package/slick-emailer/slick-emailer.module.d.ts +13 -0
- package/slick-file-drop/slick-file-drop.component.d.ts +3 -0
- package/slick-file-drop/slick-file-drop.module.d.ts +7 -0
- package/slick-file-list/slick-file-list-item.component.d.ts +3 -0
- package/slick-file-list/slick-file-list.component.d.ts +3 -0
- package/slick-file-list/slick-file-list.module.d.ts +10 -0
- package/slick-google-address-search/slick-google-address-search.directive.d.ts +3 -0
- package/slick-google-address-search/slick-google-address-search.module.d.ts +6 -0
- package/slick-google-map/slick-google-map-dialog.component.d.ts +3 -0
- package/slick-google-map/slick-google-map.component.d.ts +3 -0
- package/slick-google-map/slick-google-map.module.d.ts +8 -0
- package/slick-grid/slick-grid-column-template.directive.d.ts +3 -0
- package/slick-grid/slick-grid-sanitize.pipe.d.ts +3 -0
- package/slick-grid/slick-grid.component.d.ts +3 -0
- package/slick-grid/slick-grid.module.d.ts +16 -0
- package/slick-grid/slick-grid.service.d.ts +3 -0
- package/slick-multi-select/slick-multi-select.component.d.ts +3 -0
- package/slick-multi-select/slick-multi-select.module.d.ts +7 -0
- package/slick-multi-select/slick-multi-select.service.d.ts +3 -0
- package/slick-ordered-list/slick-ordered-list.component.d.ts +3 -0
- package/slick-ordered-list/slick-ordered-list.module.d.ts +7 -0
- package/slick-paging/slick-paging.component.d.ts +3 -0
- package/slick-paging/slick-paging.module.d.ts +6 -0
- package/slick-photo-gallery/slick-photo-gallery.component.d.ts +3 -0
- package/slick-photo-gallery/slick-photo-gallery.module.d.ts +6 -0
- package/slick-pick-list/slick-pick-list.component.d.ts +3 -0
- package/slick-pick-list/slick-pick-list.module.d.ts +7 -0
- package/slick-popover/slick-popover.component.d.ts +3 -0
- package/slick-popover/slick-popover.module.d.ts +6 -0
- package/slick-profile-picture/slick-profile-picture.component.d.ts +3 -0
- package/slick-profile-picture/slick-profile-picture.module.d.ts +7 -0
- package/slick-progress-bar/slick-progress-bar.module.d.ts +5 -0
- package/slick-progress-bar/slick-progress-bar.service.d.ts +3 -0
- package/slick-screen-blocker/slick-screen-blocker.module.d.ts +5 -0
- package/slick-screen-blocker/slick-screen-blocker.service.d.ts +3 -0
- package/slick-slider/slick-slider.component.d.ts +3 -0
- package/slick-slider/slick-slider.module.d.ts +6 -0
- package/slick-split-screen/slick-screen-split-left-content.component.d.ts +3 -0
- package/slick-split-screen/slick-screen-split-right-content.component.d.ts +3 -0
- package/slick-split-screen/slick-split-screen.component.d.ts +3 -0
- package/slick-split-screen/slick-split-screen.module.d.ts +8 -0
- package/slick-tabs/slick-tab-header.component.d.ts +3 -0
- package/slick-tabs/slick-tab.component.d.ts +3 -0
- package/slick-tabs/slick-tabs.component.d.ts +3 -0
- package/slick-tabs/slick-tabs.module.d.ts +10 -0
- package/slick-toast/slick-toast.module.d.ts +5 -0
- package/slick-toast/slick-toast.service.d.ts +3 -0
- package/slick-tree-view/slick-tree-view.component.d.ts +3 -0
- package/slick-tree-view/slick-tree-view.module.d.ts +8 -0
- package/slick-type-ahead/slick-type-ahead.directive.d.ts +3 -0
- package/slick-type-ahead/slick-type-ahead.module.d.ts +5 -0
- package/slick-validation-indicator/slick-validation-indicator.directive.d.ts +3 -0
- package/slick-validation-indicator/slick-validation-indicator.module.d.ts +6 -0
- package/utils/slick-function-lock.service.d.ts +3 -0
- package/utils/slick-init.service.d.ts +3 -0
- package/utils/slick-log.service.d.ts +3 -0
- package/utils/slick-sleep.service.d.ts +3 -0
- package/utils/slick-utils.service.d.ts +5 -0
- package/bundles/slick-components.umd.js +0 -9777
- package/bundles/slick-components.umd.js.map +0 -1
- package/esm2015/public-api.js +0 -43
- package/esm2015/slick-accordion/slick-accordion-item-header.component.js +0 -10
- package/esm2015/slick-accordion/slick-accordion-item.component.js +0 -80
- package/esm2015/slick-accordion/slick-accordion.component.js +0 -77
- package/esm2015/slick-accordion/slick-accordion.module.js +0 -18
- package/esm2015/slick-auto-complete/slick-auto-complete-list-item-template.directive.js +0 -21
- package/esm2015/slick-auto-complete/slick-auto-complete.component.js +0 -352
- package/esm2015/slick-auto-complete/slick-auto-complete.module.js +0 -19
- package/esm2015/slick-button-spinner/slick-button-spinner.component.js +0 -186
- package/esm2015/slick-button-spinner/slick-button-spinner.module.js +0 -14
- package/esm2015/slick-calendar/slick-calendar.component.js +0 -233
- package/esm2015/slick-calendar/slick-calendar.module.js +0 -14
- package/esm2015/slick-card/slick-card-header.component.js +0 -10
- package/esm2015/slick-card/slick-card.component.js +0 -37
- package/esm2015/slick-card/slick-card.module.js +0 -14
- package/esm2015/slick-components.js +0 -27
- package/esm2015/slick-confirm-dialog/slick-confirm-dialog.component.js +0 -62
- package/esm2015/slick-confirm-dialog/slick-confirm-dialog.module.js +0 -15
- package/esm2015/slick-container/slick-container-body.component.js +0 -18
- package/esm2015/slick-container/slick-container-footer.component.js +0 -16
- package/esm2015/slick-container/slick-container-header.component.js +0 -16
- package/esm2015/slick-container/slick-container.component.js +0 -19
- package/esm2015/slick-container/slick-container.module.js +0 -20
- package/esm2015/slick-context-menu/slick-context-menu-item.component.js +0 -10
- package/esm2015/slick-context-menu/slick-context-menu.component.js +0 -43
- package/esm2015/slick-context-menu/slick-context-menu.module.js +0 -15
- package/esm2015/slick-currency-mask/slick-currency-mask.directive.js +0 -234
- package/esm2015/slick-currency-mask/slick-currency-mask.module.js +0 -14
- package/esm2015/slick-date-picker/slick-date-picker.component.js +0 -267
- package/esm2015/slick-date-picker/slick-date-picker.module.js +0 -16
- package/esm2015/slick-dialog/slick-dialog-footer.component.js +0 -18
- package/esm2015/slick-dialog/slick-dialog.component.js +0 -282
- package/esm2015/slick-dialog/slick-dialog.module.js +0 -18
- package/esm2015/slick-dialog/slick-dialog.service.js +0 -67
- package/esm2015/slick-drag-drop/slick-drag-drop.directive.js +0 -9
- package/esm2015/slick-drag-drop/slick-drag-drop.module.js +0 -14
- package/esm2015/slick-drag-drop/slick-draggable.directive.js +0 -9
- package/esm2015/slick-drop-down/slick-drop-down.component.js +0 -465
- package/esm2015/slick-drop-down/slick-drop-down.module.js +0 -19
- package/esm2015/slick-drop-down/slick-drop-down.service.js +0 -59
- package/esm2015/slick-drop-list/slick-drop-list-grab.directive.js +0 -18
- package/esm2015/slick-drop-list/slick-drop-list-item.directive.js +0 -18
- package/esm2015/slick-drop-list/slick-drop-list.directive.js +0 -162
- package/esm2015/slick-drop-list/slick-drop-list.module.js +0 -15
- package/esm2015/slick-email-viewer/slick-email-viewer-dialog.component.js +0 -61
- package/esm2015/slick-email-viewer/slick-email-viewer.component.js +0 -39
- package/esm2015/slick-email-viewer/slick-email-viewer.module.js +0 -21
- package/esm2015/slick-emailer/slick-emailer-dialog.component.js +0 -122
- package/esm2015/slick-emailer/slick-emailer.component.js +0 -226
- package/esm2015/slick-emailer/slick-emailer.module.js +0 -24
- package/esm2015/slick-file-drop/slick-file-drop.component.js +0 -144
- package/esm2015/slick-file-drop/slick-file-drop.module.js +0 -15
- package/esm2015/slick-file-list/slick-file-list-item.component.js +0 -156
- package/esm2015/slick-file-list/slick-file-list.component.js +0 -114
- package/esm2015/slick-file-list/slick-file-list.module.js +0 -18
- package/esm2015/slick-google-address-search/slick-google-address-search.directive.js +0 -75
- package/esm2015/slick-google-address-search/slick-google-address-search.module.js +0 -14
- package/esm2015/slick-google-map/slick-google-map-dialog.component.js +0 -45
- package/esm2015/slick-google-map/slick-google-map.component.js +0 -45
- package/esm2015/slick-google-map/slick-google-map.module.js +0 -17
- package/esm2015/slick-grid/slick-grid-column-template.directive.js +0 -19
- package/esm2015/slick-grid/slick-grid-sanitize.pipe.js +0 -20
- package/esm2015/slick-grid/slick-grid.component.js +0 -792
- package/esm2015/slick-grid/slick-grid.module.js +0 -38
- package/esm2015/slick-grid/slick-grid.service.js +0 -72
- package/esm2015/slick-multi-select/slick-multi-select.component.js +0 -356
- package/esm2015/slick-multi-select/slick-multi-select.module.js +0 -15
- package/esm2015/slick-multi-select/slick-multi-select.service.js +0 -74
- package/esm2015/slick-ordered-list/slick-ordered-list.component.js +0 -198
- package/esm2015/slick-ordered-list/slick-ordered-list.module.js +0 -15
- package/esm2015/slick-paging/slick-paging.component.js +0 -180
- package/esm2015/slick-paging/slick-paging.module.js +0 -14
- package/esm2015/slick-photo-gallery/slick-photo-gallery.component.js +0 -101
- package/esm2015/slick-photo-gallery/slick-photo-gallery.module.js +0 -16
- package/esm2015/slick-pick-list/slick-pick-list.component.js +0 -78
- package/esm2015/slick-pick-list/slick-pick-list.module.js +0 -15
- package/esm2015/slick-popover/slick-popover.component.js +0 -199
- package/esm2015/slick-popover/slick-popover.module.js +0 -14
- package/esm2015/slick-profile-picture/slick-profile-picture.component.js +0 -242
- package/esm2015/slick-profile-picture/slick-profile-picture.module.js +0 -15
- package/esm2015/slick-progress-bar/slick-progress-bar.module.js +0 -13
- package/esm2015/slick-progress-bar/slick-progress-bar.service.js +0 -50
- package/esm2015/slick-screen-blocker/slick-screen-blocker.module.js +0 -13
- package/esm2015/slick-screen-blocker/slick-screen-blocker.service.js +0 -80
- package/esm2015/slick-slider/slick-slider.component.js +0 -88
- package/esm2015/slick-slider/slick-slider.module.js +0 -15
- package/esm2015/slick-split-screen/slick-screen-split-left-content.component.js +0 -13
- package/esm2015/slick-split-screen/slick-screen-split-right-content.component.js +0 -13
- package/esm2015/slick-split-screen/slick-split-screen.component.js +0 -148
- package/esm2015/slick-split-screen/slick-split-screen.module.js +0 -16
- package/esm2015/slick-tabs/slick-tab-header.component.js +0 -25
- package/esm2015/slick-tabs/slick-tab.component.js +0 -67
- package/esm2015/slick-tabs/slick-tabs.component.js +0 -104
- package/esm2015/slick-tabs/slick-tabs.module.js +0 -17
- package/esm2015/slick-toast/slick-toast.module.js +0 -13
- package/esm2015/slick-toast/slick-toast.service.js +0 -91
- package/esm2015/slick-tree-view/slick-tree-view.component.js +0 -287
- package/esm2015/slick-tree-view/slick-tree-view.module.js +0 -17
- package/esm2015/slick-type-ahead/slick-type-ahead.directive.js +0 -155
- package/esm2015/slick-type-ahead/slick-type-ahead.module.js +0 -13
- package/esm2015/slick-validation-indicator/slick-validation-indicator.directive.js +0 -61
- package/esm2015/slick-validation-indicator/slick-validation-indicator.module.js +0 -14
- package/esm2015/utils/slick-function-lock.service.js +0 -54
- package/esm2015/utils/slick-init.service.js +0 -48
- package/esm2015/utils/slick-log.service.js +0 -27
- package/esm2015/utils/slick-sleep.service.js +0 -14
- package/esm2015/utils/slick-utils.service.js +0 -229
- package/fesm2015/slick-components.js.map +0 -1
- package/slick-components.metadata.json +0 -1
|
@@ -1,792 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ElementRef, ContentChildren, QueryList, HostBinding, ChangeDetectorRef } from "@angular/core";
|
|
3
|
-
import { SlickGridService } from "./slick-grid.service";
|
|
4
|
-
import { SlickGridColumnFilterTypes, SlickGridColumnSortDirection } from "./slick-grid-column.model";
|
|
5
|
-
import { SlickGridRequestModel } from "./slick-grid-request.model";
|
|
6
|
-
import { SlickDialogComponent } from "../slick-dialog/slick-dialog.module";
|
|
7
|
-
import { SlickSleepService } from "../utils/slick-sleep.service";
|
|
8
|
-
import { SlickUtilsService } from "../utils/slick-utils.service";
|
|
9
|
-
import { SlickFunctionLockService } from "../utils/slick-function-lock.service";
|
|
10
|
-
import { SlickGridColumnTemplateDirective } from "./slick-grid-column-template.directive";
|
|
11
|
-
import { SlickConfirmDialogComponent, SlickConfirmDialogResults } from '../slick-confirm-dialog/slick-confirm-dialog.module';
|
|
12
|
-
import { SlickGridFavoriteModel } from './slick-grid-favorite.model';
|
|
13
|
-
class DropDownModel {
|
|
14
|
-
constructor(text) {
|
|
15
|
-
this.id = text;
|
|
16
|
-
this.text = text;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export class SlickGridComponent {
|
|
20
|
-
constructor(gridService, functionLockService, changeDetector) {
|
|
21
|
-
this.gridService = gridService;
|
|
22
|
-
this.functionLockService = functionLockService;
|
|
23
|
-
this.changeDetector = changeDetector;
|
|
24
|
-
this.flexColumn = 'slick-flex-column';
|
|
25
|
-
this.bordered = true;
|
|
26
|
-
this.striped = true;
|
|
27
|
-
this.hover = true;
|
|
28
|
-
this.showingAllRecords = false;
|
|
29
|
-
this.onRowSelected = new EventEmitter();
|
|
30
|
-
this.onRowDoubleClick = new EventEmitter();
|
|
31
|
-
this.onRowContextMenu = new EventEmitter();
|
|
32
|
-
this.onFavoritesModified = new EventEmitter();
|
|
33
|
-
this.fnOnMouseUp = (e) => this.onMouseUp(e);
|
|
34
|
-
this.selectedIndex = null;
|
|
35
|
-
this.gridOpacity = 0;
|
|
36
|
-
this.loaded = false;
|
|
37
|
-
this.isDoubleClick = false;
|
|
38
|
-
this.currentPage = 1;
|
|
39
|
-
this.showTestRow = false;
|
|
40
|
-
this.showSearchRow = false;
|
|
41
|
-
this.isResizing = false;
|
|
42
|
-
this.visibleData = [];
|
|
43
|
-
this.recordsPerPageValue = "Auto";
|
|
44
|
-
this.resizeTimeout = null;
|
|
45
|
-
this.uuid = SlickUtilsService.newGuid();
|
|
46
|
-
this.requestModel = new SlickGridRequestModel();
|
|
47
|
-
}
|
|
48
|
-
onResize(event, targetElement) {
|
|
49
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
// This is here because firefox shows/hides the menu if you press alt. Don't redraw the grid if we're
|
|
51
|
-
// just showing the menu
|
|
52
|
-
if (Math.abs(this.slickGridHeight - this.slickGridRef.nativeElement.offsetHeight) < 50)
|
|
53
|
-
return;
|
|
54
|
-
if (this.slickGridHeight !== this.slickGridRef.nativeElement.offsetHeight) {
|
|
55
|
-
clearTimeout(this.resizeTimeout);
|
|
56
|
-
this.resizeTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
57
|
-
this.currentPage = 1;
|
|
58
|
-
this.requestModel.page = 1;
|
|
59
|
-
yield this.resizeGrid();
|
|
60
|
-
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
61
|
-
this.reload(this.requestModel);
|
|
62
|
-
}), 500);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
ngOnInit() {
|
|
67
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
-
this.setGridOptions(this.gridOptions);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
ngAfterViewInit() {
|
|
72
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
-
// Copy the templates to a variable that the html can access. It can't access a QueryList
|
|
74
|
-
this.templateRefs = {};
|
|
75
|
-
this.slickGridColumnTemplates.forEach(t => {
|
|
76
|
-
this.templateRefs[t.columnKey] = t.template;
|
|
77
|
-
});
|
|
78
|
-
if (this.tableRef)
|
|
79
|
-
this.tableRef.nativeElement.focus();
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
tableKeydown(e) {
|
|
83
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
-
// Key up
|
|
85
|
-
if (e.which === 38 && !(this.selectedIndex === 0 && this.currentPage === 1)) {
|
|
86
|
-
clearTimeout(this.keypressTimeout);
|
|
87
|
-
this.selectedIndex--;
|
|
88
|
-
if (this.selectedIndex < 0) {
|
|
89
|
-
if (this.currentPage > 1) {
|
|
90
|
-
this.currentPage--;
|
|
91
|
-
this.selectedIndex = 0;
|
|
92
|
-
yield this.onPageChange(this.currentPage, false);
|
|
93
|
-
this.selectedIndex = this.recordsPerPage - 1;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
this.keypressTimeout = setTimeout(() => {
|
|
97
|
-
const rowData = this.visibleData[this.selectedIndex];
|
|
98
|
-
this.onRowClicked(rowData, this.selectedIndex);
|
|
99
|
-
}, 500);
|
|
100
|
-
}
|
|
101
|
-
// Key down
|
|
102
|
-
if (e.which === 40) {
|
|
103
|
-
if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex >= this.totalRecords)
|
|
104
|
-
return;
|
|
105
|
-
clearTimeout(this.keypressTimeout);
|
|
106
|
-
this.selectedIndex++;
|
|
107
|
-
if (this.selectedIndex >= this.recordsPerPage) {
|
|
108
|
-
if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex < this.totalRecords) {
|
|
109
|
-
this.currentPage++;
|
|
110
|
-
this.selectedIndex = 0;
|
|
111
|
-
yield this.onPageChange(this.currentPage, false);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
this.keypressTimeout = setTimeout(() => {
|
|
115
|
-
const rowData = this.visibleData[this.selectedIndex];
|
|
116
|
-
this.onRowClicked(rowData, this.selectedIndex);
|
|
117
|
-
}, 500);
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
ngOnChanges(changes) {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
if (changes.bordered) {
|
|
124
|
-
if (this.gridOptions.bordered === null)
|
|
125
|
-
this.bordered = (this.bordered.toString().toLowerCase() !== 'false') ? true : false;
|
|
126
|
-
}
|
|
127
|
-
if (changes.striped) {
|
|
128
|
-
// The grid options override the tag options
|
|
129
|
-
if (this.gridOptions.striped === null)
|
|
130
|
-
this.striped = (this.striped.toString().toLowerCase() !== 'false') ? true : false;
|
|
131
|
-
}
|
|
132
|
-
if (changes.hover) {
|
|
133
|
-
// The grid options override the tag options
|
|
134
|
-
if (this.gridOptions.hover === null)
|
|
135
|
-
this.hover = (this.hover.toString().toLowerCase() !== 'false') ? true : false;
|
|
136
|
-
}
|
|
137
|
-
if (changes.gridOptions) {
|
|
138
|
-
if (this.gridOptions.bordered !== null)
|
|
139
|
-
this.bordered = this.gridOptions.bordered;
|
|
140
|
-
if (this.gridOptions.striped !== null)
|
|
141
|
-
this.striped = this.gridOptions.striped;
|
|
142
|
-
if (this.gridOptions.hover !== null)
|
|
143
|
-
this.hover = this.gridOptions.hover;
|
|
144
|
-
this.setGridOptions(this.gridOptions);
|
|
145
|
-
}
|
|
146
|
-
if (changes.data) {
|
|
147
|
-
// If we don't do this lock, the first change will have null data and crash. The second request will have the actual data
|
|
148
|
-
yield this.functionLockService.lock("GRID_" + this.uuid + "_DATA_CHANGES");
|
|
149
|
-
// Only resize the grid on the first change, otherwise we get a flicker
|
|
150
|
-
if (changes.data.firstChange === true)
|
|
151
|
-
yield this.resizeGrid();
|
|
152
|
-
// We need to wait for the resize in the OnInit to finish before we continue
|
|
153
|
-
this.loaded = true;
|
|
154
|
-
this.currentPage = 1;
|
|
155
|
-
this.requestModel.page = 1;
|
|
156
|
-
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
157
|
-
yield this.reload(this.requestModel);
|
|
158
|
-
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
159
|
-
this.selectRow(0);
|
|
160
|
-
this.functionLockService.release("GRID_" + this.uuid + "_DATA_CHANGES");
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
ngOnDestroy() {
|
|
165
|
-
document.removeEventListener('mouseup', this.fnOnMouseUp);
|
|
166
|
-
}
|
|
167
|
-
onRecordsPerPageSelected(recordsPerPage) {
|
|
168
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
169
|
-
if (!recordsPerPage)
|
|
170
|
-
return;
|
|
171
|
-
this.recordsPerPageValue = recordsPerPage;
|
|
172
|
-
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE", recordsPerPage);
|
|
173
|
-
this.visibleData = [];
|
|
174
|
-
this.gridOpacity = 0;
|
|
175
|
-
yield SlickSleepService.sleep();
|
|
176
|
-
yield this.resizeGrid(true);
|
|
177
|
-
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
178
|
-
this.currentPage = 1;
|
|
179
|
-
yield this.onPageChange(this.currentPage, true);
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
onColResizeMousedown(e, columnIdx) {
|
|
183
|
-
this.isResizing = true;
|
|
184
|
-
this.resizeInitialPos = e.pageX;
|
|
185
|
-
this.resizeColIdx = columnIdx;
|
|
186
|
-
let col = this.tableHeaderRowRef.nativeElement.querySelectorAll("td").item(columnIdx);
|
|
187
|
-
this.resizeInitialWidth = col.offsetWidth - 9;
|
|
188
|
-
this.visibleColumns[columnIdx].flexible = false;
|
|
189
|
-
document.addEventListener('mouseup', this.fnOnMouseUp);
|
|
190
|
-
}
|
|
191
|
-
onColResizeDoubleclick(e, columnIdx) {
|
|
192
|
-
this.visibleColumns[columnIdx].flexible = true;
|
|
193
|
-
this.visibleColumns[columnIdx].width = null;
|
|
194
|
-
this.saveColumnsToLocalStorage();
|
|
195
|
-
}
|
|
196
|
-
onColResizeMousemove(e) {
|
|
197
|
-
if (!this.isResizing)
|
|
198
|
-
return;
|
|
199
|
-
let newCursorPos = e.pageX;
|
|
200
|
-
let diff = newCursorPos - this.resizeInitialPos;
|
|
201
|
-
this.visibleColumns[this.resizeColIdx].width = (this.resizeInitialWidth + diff) + "px";
|
|
202
|
-
if ((this.resizeInitialWidth + diff) < 10)
|
|
203
|
-
this.visibleColumns[this.resizeColIdx].width = "10px";
|
|
204
|
-
this.visibleColumns[this.resizeColIdx].flexible = false;
|
|
205
|
-
}
|
|
206
|
-
onMouseUp(e) {
|
|
207
|
-
this.isResizing = false;
|
|
208
|
-
document.removeEventListener('mouseup', this.fnOnMouseUp);
|
|
209
|
-
this.saveColumnsToLocalStorage();
|
|
210
|
-
}
|
|
211
|
-
getVisibleRecords() {
|
|
212
|
-
return this.visibleData;
|
|
213
|
-
}
|
|
214
|
-
addNewRecord(newRecord, selectNewRecord = false) {
|
|
215
|
-
this.visibleData.unshift(newRecord);
|
|
216
|
-
if (selectNewRecord === true) {
|
|
217
|
-
this.selectedIndex = 0;
|
|
218
|
-
this.selectRow(0);
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
if (this.selectedIndex)
|
|
222
|
-
this.selectedIndex++;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
updateRecord(rowNum, record) {
|
|
226
|
-
this.visibleData[rowNum] = record;
|
|
227
|
-
}
|
|
228
|
-
onRowClicked(rowData, idx) {
|
|
229
|
-
this.selectedIndex = idx;
|
|
230
|
-
clearTimeout(this.doubleClickWaitTimeout);
|
|
231
|
-
this.doubleClickWaitTimeout = setTimeout(() => {
|
|
232
|
-
this.onRowSelected.emit(rowData);
|
|
233
|
-
}, 250);
|
|
234
|
-
}
|
|
235
|
-
onRowDoubleClicked(rowData, idx) {
|
|
236
|
-
this.selectedIndex = idx;
|
|
237
|
-
clearTimeout(this.doubleClickWaitTimeout);
|
|
238
|
-
this.onRowDoubleClick.emit(rowData);
|
|
239
|
-
}
|
|
240
|
-
onRowContextMenuClicked(e, rowData, idx) {
|
|
241
|
-
if (this.onRowContextMenu) {
|
|
242
|
-
let rowContextMenuModel = {
|
|
243
|
-
mouseEvent: e,
|
|
244
|
-
data: rowData,
|
|
245
|
-
rowIdx: idx
|
|
246
|
-
};
|
|
247
|
-
this.onRowContextMenu.emit(rowContextMenuModel);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
onPageChange(pageNumber, selectRow = true) {
|
|
251
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
252
|
-
this.currentPage = pageNumber;
|
|
253
|
-
this.requestModel.page = pageNumber;
|
|
254
|
-
yield this.reload(this.requestModel);
|
|
255
|
-
this.selectedIndex = (this.gridOptions.autoSelectFirstRow === true) ? 0 : null;
|
|
256
|
-
if (selectRow === true && this.gridOptions.autoSelectFirstRow === true) {
|
|
257
|
-
const rowData = this.visibleData[this.selectedIndex];
|
|
258
|
-
this.onRowClicked(rowData, this.selectedIndex);
|
|
259
|
-
}
|
|
260
|
-
this.tableRef.nativeElement.focus();
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
reloadGrid(additionalParams) {
|
|
264
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
265
|
-
try {
|
|
266
|
-
yield this.resizeGrid();
|
|
267
|
-
yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRID");
|
|
268
|
-
this.requestModel.url = this.gridOptions.getUrl;
|
|
269
|
-
this.requestModel.httpHeaders = this.gridOptions.httpHeaders;
|
|
270
|
-
this.requestModel.additionalParams = additionalParams;
|
|
271
|
-
this.requestModel.page = this.currentPage;
|
|
272
|
-
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
273
|
-
let responseModel = yield this.reload(this.requestModel);
|
|
274
|
-
this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRID");
|
|
275
|
-
return Promise.resolve(responseModel);
|
|
276
|
-
}
|
|
277
|
-
catch (error) {
|
|
278
|
-
console.error(error);
|
|
279
|
-
return Promise.reject(error);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
reloadGridWithRequestModel(requestModel) {
|
|
284
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
285
|
-
try {
|
|
286
|
-
yield this.resizeGrid();
|
|
287
|
-
yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
|
|
288
|
-
this.requestModel = requestModel;
|
|
289
|
-
this.currentPage = 1;
|
|
290
|
-
this.requestModel.page = 1;
|
|
291
|
-
let responseModel = yield this.reload(this.requestModel);
|
|
292
|
-
this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
|
|
293
|
-
return Promise.resolve(responseModel);
|
|
294
|
-
}
|
|
295
|
-
catch (error) {
|
|
296
|
-
console.error(error);
|
|
297
|
-
return Promise.reject(error);
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
reload(requestModel) {
|
|
302
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
303
|
-
try {
|
|
304
|
-
yield this.functionLockService.lock("GRID_" + this.uuid + "_RELOAD");
|
|
305
|
-
requestModel = this.getRequestModel(this.requestModel);
|
|
306
|
-
let responseModel = null;
|
|
307
|
-
if (requestModel.url)
|
|
308
|
-
responseModel = yield this.gridService.getDataFromServer(requestModel);
|
|
309
|
-
else
|
|
310
|
-
responseModel = yield this.gridService.getDataFromDataObj(requestModel, this.data);
|
|
311
|
-
this.loaded = true;
|
|
312
|
-
this.totalRecords = responseModel.totalRecords;
|
|
313
|
-
this.visibleData = responseModel.data;
|
|
314
|
-
this.functionLockService.release("GRID_" + this.uuid + "_RELOAD");
|
|
315
|
-
Promise.resolve(responseModel);
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
console.error(error);
|
|
319
|
-
return Promise.reject(error);
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
unselectRow() {
|
|
324
|
-
this.selectedIndex = null;
|
|
325
|
-
}
|
|
326
|
-
selectRow(rowNumber) {
|
|
327
|
-
let rowData = this.visibleData[rowNumber];
|
|
328
|
-
this.onRowClicked(rowData, rowNumber);
|
|
329
|
-
}
|
|
330
|
-
getColumnHTML(rowData, dataFieldName) {
|
|
331
|
-
const columnHTML = SlickUtilsService.getDeepObject(rowData, dataFieldName);
|
|
332
|
-
if (columnHTML === null || columnHTML === undefined)
|
|
333
|
-
return '';
|
|
334
|
-
return columnHTML.toString();
|
|
335
|
-
}
|
|
336
|
-
sortBy(sortColumn) {
|
|
337
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
338
|
-
this.gridOptions.columns.forEach(c => {
|
|
339
|
-
if (sortColumn && c.columnKey !== sortColumn.columnKey) {
|
|
340
|
-
c.sortDirection = SlickGridColumnSortDirection.none;
|
|
341
|
-
}
|
|
342
|
-
});
|
|
343
|
-
if (sortColumn) {
|
|
344
|
-
if (sortColumn.sortDirection === SlickGridColumnSortDirection.none) {
|
|
345
|
-
this.visibleColumns.forEach(c => c.sortDirection = SlickGridColumnSortDirection.none);
|
|
346
|
-
sortColumn.sortDirection = SlickGridColumnSortDirection.asc;
|
|
347
|
-
}
|
|
348
|
-
else if (sortColumn.sortDirection === SlickGridColumnSortDirection.asc)
|
|
349
|
-
sortColumn.sortDirection = SlickGridColumnSortDirection.desc;
|
|
350
|
-
else {
|
|
351
|
-
sortColumn.sortDirection = SlickGridColumnSortDirection.none;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
this.saveColumnsToLocalStorage();
|
|
355
|
-
this.currentPage = 1;
|
|
356
|
-
this.requestModel.page = 1;
|
|
357
|
-
yield this.reload(this.requestModel);
|
|
358
|
-
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
359
|
-
this.selectRow(0);
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
onSearchSelect(ddValue, column) {
|
|
363
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
364
|
-
if (!this.requestModel.columnSearchValues)
|
|
365
|
-
this.requestModel.columnSearchValues = [];
|
|
366
|
-
let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
|
|
367
|
-
if (columnSearchValueIdx >= 0)
|
|
368
|
-
this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
|
|
369
|
-
column.isFiltering = false;
|
|
370
|
-
if (ddValue) {
|
|
371
|
-
this.requestModel.columnSearchValues.push({
|
|
372
|
-
columnName: column.dataFieldName,
|
|
373
|
-
searchValueId: ddValue.id,
|
|
374
|
-
searchValueText: ddValue.text
|
|
375
|
-
});
|
|
376
|
-
column.isFiltering = true;
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
column.isLocked = false;
|
|
380
|
-
}
|
|
381
|
-
this.currentPage = 1;
|
|
382
|
-
this.requestModel.page = 1;
|
|
383
|
-
yield this.reload(this.requestModel);
|
|
384
|
-
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
385
|
-
this.selectRow(0);
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
onSearch(column) {
|
|
389
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
390
|
-
yield SlickSleepService.sleep();
|
|
391
|
-
if (!this.requestModel.columnSearchValues)
|
|
392
|
-
this.requestModel.columnSearchValues = [];
|
|
393
|
-
if (column.filterText === column.lastSearchText)
|
|
394
|
-
return;
|
|
395
|
-
column.lastSearchText = column.filterText;
|
|
396
|
-
column.isFiltering = !!column.filterText;
|
|
397
|
-
if (!column.isFiltering)
|
|
398
|
-
column.isLocked = false;
|
|
399
|
-
clearTimeout(this.searchTimeout);
|
|
400
|
-
this.searchTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
401
|
-
this.saveColumnsToLocalStorage();
|
|
402
|
-
let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
|
|
403
|
-
if (columnSearchValueIdx >= 0)
|
|
404
|
-
this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
|
|
405
|
-
if (column.filterText) {
|
|
406
|
-
this.requestModel.columnSearchValues.push({
|
|
407
|
-
columnName: column.dataFieldName,
|
|
408
|
-
searchValueText: column.filterText
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
this.currentPage = 1;
|
|
412
|
-
this.requestModel.page = 1;
|
|
413
|
-
yield this.reload(this.requestModel);
|
|
414
|
-
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
415
|
-
this.selectRow(0);
|
|
416
|
-
}), 250);
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
toggleLock(column) {
|
|
420
|
-
column.isLocked = !column.isLocked;
|
|
421
|
-
this.saveColumnsToLocalStorage();
|
|
422
|
-
}
|
|
423
|
-
resetFilter(column) {
|
|
424
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
425
|
-
column.isFiltering = false;
|
|
426
|
-
column.isLocked = false;
|
|
427
|
-
column.filterText = null;
|
|
428
|
-
column.lastSearchText = null;
|
|
429
|
-
column.filterDropdownValue = null;
|
|
430
|
-
this.requestModel.columnSearchValues = this.requestModel.columnSearchValues.filter(x => x.columnName !== column.dataFieldName);
|
|
431
|
-
this.saveColumnsToLocalStorage();
|
|
432
|
-
this.currentPage = 1;
|
|
433
|
-
this.requestModel.page = 1;
|
|
434
|
-
yield this.reload(this.requestModel);
|
|
435
|
-
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
436
|
-
this.selectRow(0);
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
openColumnSelectDialog() {
|
|
440
|
-
this.columnSelectDialogColumns = [...this.gridOptions.columns];
|
|
441
|
-
this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
442
|
-
this.columnSelectDialogRef.showDialog();
|
|
443
|
-
}
|
|
444
|
-
onColumnDrop(e) {
|
|
445
|
-
console.log(e);
|
|
446
|
-
}
|
|
447
|
-
onColumnReorder(e) {
|
|
448
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
449
|
-
const oldOrder = e[0];
|
|
450
|
-
const newOrder = e[1];
|
|
451
|
-
if (oldOrder === newOrder)
|
|
452
|
-
return;
|
|
453
|
-
const selectedCol = this.columnSelectDialogColumns.splice(oldOrder, 1)[0];
|
|
454
|
-
selectedCol.displayOrder = newOrder;
|
|
455
|
-
let currentOrder = 0;
|
|
456
|
-
// Everything up to the new order reordered from 0
|
|
457
|
-
for (let i = 0; i < this.columnSelectDialogColumns.length; i++) {
|
|
458
|
-
// If we're at newOrder, leave a spot
|
|
459
|
-
if (i === newOrder)
|
|
460
|
-
currentOrder++;
|
|
461
|
-
this.columnSelectDialogColumns[i].displayOrder = currentOrder++;
|
|
462
|
-
}
|
|
463
|
-
this.columnSelectDialogColumns = [...this.columnSelectDialogColumns, selectedCol];
|
|
464
|
-
this.columnSelectDialogColumns = this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
addNewFavorite() {
|
|
468
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
469
|
-
this.newFavoriteText = '';
|
|
470
|
-
const confirmResult = yield this.addNewFavoriteDialogRef.confirm();
|
|
471
|
-
if (confirmResult === SlickConfirmDialogResults.Ok && this.newFavoriteText) {
|
|
472
|
-
// Save the previous selection to localstorage
|
|
473
|
-
this.saveDialogColumnsToLocalStorage();
|
|
474
|
-
this.favorites.push(new DropDownModel(this.newFavoriteText));
|
|
475
|
-
this.selectedFavorite = this.newFavoriteText;
|
|
476
|
-
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
|
|
477
|
-
const favoritesJson = JSON.stringify(this.favorites.map(x => x.text));
|
|
478
|
-
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES", favoritesJson);
|
|
479
|
-
// Save the new one to localstorage
|
|
480
|
-
this.saveDialogColumnsToLocalStorage();
|
|
481
|
-
}
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
loadFavorite(favorite) {
|
|
485
|
-
this.saveDialogColumnsToLocalStorage();
|
|
486
|
-
this.selectedFavorite = favorite.text;
|
|
487
|
-
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
|
|
488
|
-
if (gridColumnsJson) {
|
|
489
|
-
this.columnSelectDialogColumns = JSON.parse(gridColumnsJson);
|
|
490
|
-
this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
setFavorite(favorite) {
|
|
494
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
495
|
-
this.selectedFavorite = favorite;
|
|
496
|
-
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
|
|
497
|
-
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
|
|
498
|
-
this.gridOptions.columns = JSON.parse(gridColumnsJson);
|
|
499
|
-
this.gridOptions.columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
500
|
-
this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
|
|
501
|
-
this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
502
|
-
this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
|
|
503
|
-
this.currentPage = 1;
|
|
504
|
-
this.requestModel.page = 1;
|
|
505
|
-
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
506
|
-
yield this.reload(this.requestModel);
|
|
507
|
-
});
|
|
508
|
-
}
|
|
509
|
-
onSaveColumns() {
|
|
510
|
-
this.saveDialogColumnsToLocalStorage();
|
|
511
|
-
this.gridOptions.columns = [...this.columnSelectDialogColumns];
|
|
512
|
-
// Make sure if they've hidden a column that we aren't trying to sort or filter by this column
|
|
513
|
-
this.gridOptions.columns.forEach(x => {
|
|
514
|
-
if (x.visible === false) {
|
|
515
|
-
x.filterDropdownValue = null;
|
|
516
|
-
x.filterText = null;
|
|
517
|
-
x.isFiltering = false;
|
|
518
|
-
x.isLocked = false;
|
|
519
|
-
x.lastSearchText = null;
|
|
520
|
-
x.sortDirection = null;
|
|
521
|
-
}
|
|
522
|
-
});
|
|
523
|
-
this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
|
|
524
|
-
this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
525
|
-
this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
|
|
526
|
-
this.columnSelectDialogRef.hideDialog();
|
|
527
|
-
this.resizeGrid();
|
|
528
|
-
if (this.onFavoritesModified) {
|
|
529
|
-
const gridFavorites = this.favorites.map(favorite => {
|
|
530
|
-
const gridFavorite = new SlickGridFavoriteModel();
|
|
531
|
-
gridFavorite.favoriteName = favorite.text;
|
|
532
|
-
const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
|
|
533
|
-
const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
534
|
-
gridFavorite.columns = JSON.parse(dialogColumnsJSON);
|
|
535
|
-
return gridFavorite;
|
|
536
|
-
});
|
|
537
|
-
this.onFavoritesModified.emit(gridFavorites);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
onCancelColumns() {
|
|
541
|
-
this.columnSelectDialogRef.hideDialog();
|
|
542
|
-
}
|
|
543
|
-
saveDialogColumnsToLocalStorage() {
|
|
544
|
-
let dialogColumnsJSON = JSON.stringify(this.columnSelectDialogColumns);
|
|
545
|
-
if (this.gridOptions.gridKey) {
|
|
546
|
-
const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
|
|
547
|
-
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, dialogColumnsJSON);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
saveColumnsToLocalStorage() {
|
|
551
|
-
let gridColumnsJSON = JSON.stringify(this.gridOptions.columns);
|
|
552
|
-
if (this.gridOptions.gridKey) {
|
|
553
|
-
const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
|
|
554
|
-
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
555
|
-
if (gridColumnsJson) {
|
|
556
|
-
let columns = JSON.parse(gridColumnsJson);
|
|
557
|
-
let displayOrder = 0;
|
|
558
|
-
columns.forEach(c => {
|
|
559
|
-
let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
|
|
560
|
-
if (column) {
|
|
561
|
-
c.displayOrder = displayOrder;
|
|
562
|
-
c.titleOrientation = column.titleOrientation;
|
|
563
|
-
c.titleHeight = column.titleHeight;
|
|
564
|
-
c.width = column.width;
|
|
565
|
-
c.filterDropdownValue = column.filterDropdownValue;
|
|
566
|
-
c.filterText = column.filterText;
|
|
567
|
-
c.isLocked = column.isLocked;
|
|
568
|
-
c.isFiltering = column.isFiltering;
|
|
569
|
-
c.sortDirection = column.sortDirection;
|
|
570
|
-
}
|
|
571
|
-
displayOrder++;
|
|
572
|
-
});
|
|
573
|
-
columns = columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
574
|
-
gridColumnsJSON = JSON.stringify(columns);
|
|
575
|
-
}
|
|
576
|
-
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
|
|
577
|
-
}
|
|
578
|
-
if (this.onFavoritesModified) {
|
|
579
|
-
const gridFavorites = this.favorites.map(favorite => {
|
|
580
|
-
const gridFavorite = new SlickGridFavoriteModel();
|
|
581
|
-
gridFavorite.favoriteName = favorite.text;
|
|
582
|
-
const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
|
|
583
|
-
const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
584
|
-
gridFavorite.columns = JSON.parse(dialogColumnsJSON);
|
|
585
|
-
return gridFavorite;
|
|
586
|
-
});
|
|
587
|
-
this.onFavoritesModified.emit(gridFavorites);
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
resizeGrid(forceRefresh = false) {
|
|
591
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
592
|
-
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
593
|
-
if (!forceRefresh && this.slickGridRef.nativeElement.offsetHeight === this.slickGridHeight) {
|
|
594
|
-
resolve();
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
if (this.recordsPerPageValue === 'Auto') {
|
|
598
|
-
yield this.functionLockService.lock("GRID_" + this.uuid + "_RESIZEGRID");
|
|
599
|
-
this.slickGridHeight = this.tableContainerRef.nativeElement.offsetHeight;
|
|
600
|
-
const testRow = this.tableRef.nativeElement.insertRow(0);
|
|
601
|
-
const testCell = testRow.insertCell(0);
|
|
602
|
-
testCell.style.visibility = "hidden";
|
|
603
|
-
testCell.innerHTML = "&NBSP";
|
|
604
|
-
const rowHeight = testCell.offsetHeight;
|
|
605
|
-
this.tableRef.nativeElement.deleteRow(0);
|
|
606
|
-
let headerHeight = this.tableHeaderRowRef.nativeElement.offsetHeight + 2;
|
|
607
|
-
if (this.tableHeaderSearchRowRef)
|
|
608
|
-
headerHeight += this.tableHeaderSearchRowRef.nativeElement.offsetHeight + 2;
|
|
609
|
-
const clientHeight = this.tableContainerRef.nativeElement.offsetHeight - headerHeight;
|
|
610
|
-
this.recordsPerPage = parseInt(((clientHeight / rowHeight) - 1).toFixed(0));
|
|
611
|
-
let actualRowHeight = parseInt((clientHeight / this.recordsPerPage).toFixed(0)) - 1;
|
|
612
|
-
if (actualRowHeight < rowHeight)
|
|
613
|
-
actualRowHeight = rowHeight;
|
|
614
|
-
const allRows = this.slickGridRef.nativeElement.querySelectorAll(".table tbody tr");
|
|
615
|
-
allRows.forEach(row => {
|
|
616
|
-
row.style.height = (actualRowHeight) + "px";
|
|
617
|
-
});
|
|
618
|
-
this.functionLockService.release("GRID_" + this.uuid + "_RESIZEGRID");
|
|
619
|
-
this.gridOpacity = 1;
|
|
620
|
-
this.showTestRow = false;
|
|
621
|
-
resolve();
|
|
622
|
-
}
|
|
623
|
-
else {
|
|
624
|
-
yield SlickSleepService.sleep();
|
|
625
|
-
this.recordsPerPage = parseInt(this.recordsPerPageValue);
|
|
626
|
-
this.gridOpacity = 1;
|
|
627
|
-
resolve();
|
|
628
|
-
}
|
|
629
|
-
}));
|
|
630
|
-
});
|
|
631
|
-
}
|
|
632
|
-
addColumn(column, idx = null) {
|
|
633
|
-
if (idx === null)
|
|
634
|
-
this.gridOptions.columns.push(column);
|
|
635
|
-
else
|
|
636
|
-
this.gridOptions.columns.splice(idx, 0, column);
|
|
637
|
-
this.setGridOptions(this.gridOptions);
|
|
638
|
-
}
|
|
639
|
-
getRequestModel(requestModel = null) {
|
|
640
|
-
if (!requestModel)
|
|
641
|
-
requestModel = this.requestModel;
|
|
642
|
-
requestModel.columnSearchValues = [];
|
|
643
|
-
this.gridOptions.columns.forEach(c => {
|
|
644
|
-
if (c.visible) {
|
|
645
|
-
if (c.filterType === SlickGridColumnFilterTypes.text && c.filterText) {
|
|
646
|
-
c.filterText = c.filterText;
|
|
647
|
-
requestModel.columnSearchValues.push({
|
|
648
|
-
columnName: c.dataFieldName,
|
|
649
|
-
searchValueId: null,
|
|
650
|
-
searchValueText: c.filterText
|
|
651
|
-
});
|
|
652
|
-
}
|
|
653
|
-
else if (c.filterType === SlickGridColumnFilterTypes.dropdown && c.filterDropdownValue) {
|
|
654
|
-
c.filterDropdownValue = c.filterDropdownValue;
|
|
655
|
-
requestModel.columnSearchValues.push({
|
|
656
|
-
columnName: c.dataFieldName,
|
|
657
|
-
searchValueId: c.filterDropdownValue,
|
|
658
|
-
searchValueText: null
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
});
|
|
663
|
-
requestModel.sortColumn = null;
|
|
664
|
-
const sortColumn = this.gridOptions.columns.find(x => x.sortDirection === SlickGridColumnSortDirection.asc || x.sortDirection === SlickGridColumnSortDirection.desc);
|
|
665
|
-
if (sortColumn) {
|
|
666
|
-
requestModel.sortColumn = (sortColumn.sortDirection === 0) ? null : sortColumn.dataFieldName;
|
|
667
|
-
requestModel.sortDirection = sortColumn.sortDirection;
|
|
668
|
-
}
|
|
669
|
-
if (requestModel.recordsPerPage <= 0)
|
|
670
|
-
requestModel.recordsPerPage = 20;
|
|
671
|
-
return this.requestModel;
|
|
672
|
-
}
|
|
673
|
-
setGridOptions(gridOptions) {
|
|
674
|
-
this.gridOptions = gridOptions;
|
|
675
|
-
if (this.gridOptions.gridKey) {
|
|
676
|
-
if (this.gridOptions.favorites) {
|
|
677
|
-
const favoriteNames = this.gridOptions.favorites.map(f => f.favoriteName);
|
|
678
|
-
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_FAVORITES`, JSON.stringify(favoriteNames));
|
|
679
|
-
this.gridOptions.favorites.forEach(favorite => {
|
|
680
|
-
// Make sure we haven't added a new column that needs to be saved
|
|
681
|
-
this.gridOptions.columns.forEach(c => {
|
|
682
|
-
const columnExists = favorite.columns.findIndex(x => x.dataFieldName === c.dataFieldName);
|
|
683
|
-
if (columnExists < 0)
|
|
684
|
-
favorite.columns.push(c);
|
|
685
|
-
});
|
|
686
|
-
let gridColumnsJSON = JSON.stringify(favorite.columns);
|
|
687
|
-
if (this.gridOptions.gridKey) {
|
|
688
|
-
const suffix = favorite.favoriteName === 'Default' ? '' : ('_' + favorite.favoriteName);
|
|
689
|
-
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
|
|
690
|
-
}
|
|
691
|
-
});
|
|
692
|
-
if (favoriteNames.indexOf(this.selectedFavorite) < 0)
|
|
693
|
-
this.selectedFavorite = "Default";
|
|
694
|
-
}
|
|
695
|
-
this.selectedFavorite = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE") || 'Default';
|
|
696
|
-
// Check to make sure we don't have any duplicate column names
|
|
697
|
-
this.gridOptions.columns.forEach(c1 => {
|
|
698
|
-
const dataFieldCount = (this.gridOptions.columns.filter(x => x.dataFieldName === c1.dataFieldName) || []).length;
|
|
699
|
-
if (dataFieldCount > 1)
|
|
700
|
-
console.error(`Grid ${this.gridOptions.gridKey} column ${c1.dataFieldName} is defined ${dataFieldCount} times`);
|
|
701
|
-
});
|
|
702
|
-
const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
|
|
703
|
-
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
704
|
-
if (gridColumnsJson) {
|
|
705
|
-
let columns = JSON.parse(gridColumnsJson);
|
|
706
|
-
let displayOrder = 0;
|
|
707
|
-
columns.forEach(c => {
|
|
708
|
-
let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
|
|
709
|
-
if (column) {
|
|
710
|
-
column.visible = c.visible;
|
|
711
|
-
column.displayOrder = displayOrder;
|
|
712
|
-
column.titleOrientation = c.titleOrientation;
|
|
713
|
-
column.titleHeight = c.titleHeight;
|
|
714
|
-
column.width = c.width;
|
|
715
|
-
column.flexible = c.flexible;
|
|
716
|
-
column.sortDirection = c.sortDirection;
|
|
717
|
-
column.isLocked = c.isLocked;
|
|
718
|
-
//column.filterType = c.filterType;
|
|
719
|
-
if (column.isLocked && column.filterType !== SlickGridColumnFilterTypes.none) {
|
|
720
|
-
column.isFiltering = true;
|
|
721
|
-
if (column.filterType === SlickGridColumnFilterTypes.text)
|
|
722
|
-
column.filterText = c.filterText;
|
|
723
|
-
else if (column.filterType === SlickGridColumnFilterTypes.dropdown)
|
|
724
|
-
column.filterDropdownValue = c.filterDropdownValue;
|
|
725
|
-
if (!column.filterText && !column.filterDropdownValue) {
|
|
726
|
-
column.isFiltering = false;
|
|
727
|
-
column.isLocked = false;
|
|
728
|
-
column.filterText = null;
|
|
729
|
-
column.filterDropdownValue = null;
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
displayOrder++;
|
|
734
|
-
});
|
|
735
|
-
}
|
|
736
|
-
if (this.gridOptions.defaultRecordsPerPage && !localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE"))
|
|
737
|
-
this.recordsPerPageValue = this.gridOptions.defaultRecordsPerPage.toString();
|
|
738
|
-
else
|
|
739
|
-
this.recordsPerPageValue = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE") || "Auto";
|
|
740
|
-
const favoritesJson = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES") || `["Default"]`;
|
|
741
|
-
this.favorites = JSON.parse(favoritesJson).map(favorite => {
|
|
742
|
-
return new DropDownModel(favorite);
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
|
-
this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
|
|
746
|
-
this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
747
|
-
this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
|
|
748
|
-
let sortColumn = this.visibleColumns.find(c => c.sortable === true && c.sortDirection > 0);
|
|
749
|
-
if (this.visibleColumns.length > 0 && sortColumn) {
|
|
750
|
-
this.requestModel.sortColumn = sortColumn.dataFieldName;
|
|
751
|
-
this.requestModel.sortDirection = sortColumn.sortDirection;
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
SlickGridComponent.decorators = [
|
|
756
|
-
{ type: Component, args: [{
|
|
757
|
-
selector: 'slick-grid',
|
|
758
|
-
template: "<div id=\"slick-grid_{{uuid}}\" class=\"slick-grid d-flex flex-column flex-fill\" style=\"position: absolute; left: 0; top: 0; right: 0; bottom: 0;\" #slickGrid>\r\n\t<div #tableContainer class=\"d-flex flex-fill\" style=\"overflow: auto\">\r\n\r\n\t\t<div>\r\n\t\t\t<table #tableRef class=\"table table-sm\" [class.table-bordered]=\"bordered\" [class.table-borderless]=\"!bordered\" [class.table-striped]=\"striped\" [class.table-hover]=\"hover\" [style.opacity]=\"gridOpacity\" style=\"margin: 0; padding: 0;\" (keydown)=\"tableKeydown($event)\" tabindex=\"0\">\r\n\t\t\t\t<thead>\r\n\t\t\t\t\t<tr #tableHeaderRow (mousemove)=\"onColResizeMousemove($event)\" [ngClass]=\"{ 'resizing': isResizing === true }\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns; let idx = index\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [style.height]=\"column.titleHeight\">\r\n\t\t\t\t\t\t\t<div [ngClass]=\"{ 'slick-grid_title-vertical' : column.titleOrientation === 1 }\">\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"idx > 0 && idx < visibleColumns.length\" class=\"resize_column_left\" [class.table-bordered]=\"bordered\" (mousedown)=\"onColResizeMousedown($event, idx - 1)\" (dblclick)=\"onColResizeDoubleclick($event, idx - 1)\"></div>\r\n\t\t\t\t\t\t\t\t<span class=\"sortIcon\" *ngIf=\"column.sortable === true && column.sortDirection > 0\"><i class=\"far\" [ngClass]=\"{'fa-caret-up': column.sortDirection === 1, 'fa-caret-down': column.sortDirection === 2}\"></i> </span>\r\n\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" *ngIf=\"column.sortable === true\" (click)=\"sortBy(column)\" draggable=\"false\" title=\"{{column.title}}\">{{column.title}}</a>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.sortable === false\" title=\"{{column.title}}\">{{column.title}}</div>\r\n\t\t\t\t\t\t\t\t<div class=\"resize_column_right\" (mousedown)=\"onColResizeMousedown($event, idx)\" (dblclick)=\"onColResizeDoubleclick($event, idx)\"></div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t<tr #tableHeaderSearchRow *ngIf=\"showSearchRow === true\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div class=\"slick-grid_search-column\">\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering\" class=\"fas fa-times-circle bg-white text-danger mr-1\" (click)=\"resetFilter(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && column.isLocked\" class=\"far fa-lock mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<i *ngIf=\"column.isFiltering && !column.isLocked\" class=\"far fa-lock-open mr-1\" (click)=\"toggleLock(column)\"></i>\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 1\" class=\"slick-grid_text-search\">\r\n\t\t\t\t\t\t\t\t\t<input autocomplete=\"nope\" type=\"text\" class=\"form-control\" [(ngModel)]=\"column.filterText\" name=\"searchText\" placeholder=\"Search...\" (keydown)=\"onSearch(column)\" />\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div *ngIf=\"column.filterType === 2\" class=\"input-group slick-grid_drop-down-search\">\r\n\t\t\t\t\t\t\t\t\t<slick-drop-down [items]=\"column.filterDropdownValues\" [(ngModel)]=\"column.filterDropdownValue\" listWidth=\"auto\" placeholder=\"Search...\" (onSelect)=\"onSearchSelect($event, column)\"></slick-drop-down>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr *ngIf=\"loaded && visibleData.length === 0\"><td [colSpan]=\"visibleColumns.length\">No Data</td></tr>\r\n\t\t\t\t\t<tr *ngFor=\"let rowData of visibleData; let idx = index\" #tableBodyRows (click)=\"onRowClicked(rowData, idx)\" (dblclick)=\"onRowDoubleClicked(rowData, idx)\" (contextmenu)=\"onRowContextMenuClicked($event, rowData, idx)\" [class.table-success]=\"selectedIndex === idx\">\r\n\t\t\t\t\t\t<td *ngFor=\"let column of visibleColumns\">\r\n\t\t\t\t\t\t\t<div *ngIf=\"!column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\" [innerHTML]=\"getColumnHTML(rowData, column.dataFieldName) | slickGridSanitizeHtml\"></div>\r\n\t\t\t\t\t\t\t<div *ngIf=\"column.columnKey\" class=\"slick-grid_column-content\" [style.width]=\"column.width\" [style.maxWidth]=\"column.width\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRefs[column.columnKey], context: { $implicit: rowData }\">\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"slick-grid-footer mt-2 d-flex\">\r\n\t\t<div>\r\n\t\t\t<button type=\"button\" (click)=\"openColumnSelectDialog()\" class=\"btn btn-outline-primary\"><i class=\"far fa-columns\"></i></button>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"favorites?.length > 1\">\r\n\t\t\t<button #favoriteSelectRef type=\"button\" class=\"btn btn-outline-primary ml-1\"><i class=\"far fa-star\"></i> {{this.selectedFavorite}}</button>\r\n\t\t\t<slick-popover [element]=\"favoriteSelectRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 250px; cursor: default\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr *ngFor=\"let favorite of favorites\" (click)=\"setFavorite(favorite.text)\">\r\n\t\t\t\t\t\t\t<td><i *ngIf=\"favorite.text === selectedFavorite\" class=\"far fa-star mr-1\"></i>{{favorite.text}}</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\">\r\n\t\t\t<slick-paging [(pageNumber)]=\"currentPage\" [totalRecords]=\"totalRecords\" [recordsPerPage]=\"recordsPerPage\" (onPageChange)=\"onPageChange($event)\"></slick-paging>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"showingAllRecords == false\" class=\"ml-1\">\r\n\t\t\t<button #recordsPerPageRef type=\"button\" class=\"btn btn-outline-primary\">{{recordsPerPageValue}} <i style=\"font-size: 12px\" class=\"far fa-chevron-down\"></i></button>\r\n\r\n\t\t\t<slick-popover [element]=\"recordsPerPageRef\" position=\"top\" showArrow=\"false\" [topOffsetPx]=\"0\" [leftOffsetPx]=\"0\" [showByClick]=\"true\">\r\n\t\t\t\t<table class=\"table-borderless table-sm table-hover\" style=\"min-width: 150px;\">\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('Auto')\"><td>Auto</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('25')\"><td>25</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('50')\"><td>50</td></tr>\r\n\t\t\t\t\t\t<tr (click)=\"onRecordsPerPageSelected('100')\"><td>100</td></tr>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</slick-popover>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<slick-dialog #columnSelectDialogRef header=\"Select Columns\">\r\n\t<div style=\"text-align: center; width: 475px;\" class=\"mx-5\">\r\n\t\t<div class=\"d-flex\">\r\n\t\t\t<div class=\"flex-fill\">\r\n\t\t\t\t<slick-drop-down [items]=\"favorites\"\r\n\t\t\t\t\t\t\t\t [ngModel]=\"selectedFavorite\"\r\n\t\t\t\t\t\t\t\t (onSelect)=\"loadFavorite($event)\"></slick-drop-down>\r\n\t\t\t</div>\r\n\t\t\t<div><button class=\"btn btn-outline-primary ml-1\" (click)=\"addNewFavorite()\"><i class=\"far fa-plus\"></i></button></div>\r\n\t\t</div>\r\n\t\t<div class=\"d-flex flex-column mt-1\" slick-drop-list (onSlickDropListReorder)=\"onColumnReorder($event)\">\r\n\t\t\t<div *ngFor=\"let column of columnSelectDialogColumns\" class=\"d-flex\" slick-drop-list-item>\r\n\t\t\t\t<div style=\"width: 20px\"><input type=\"checkbox\" style=\"position: relative; top: 2px;\" [(ngModel)]=\"column.visible\" /></div>\r\n\t\t\t\t<div class=\"py-0 flex-fill\" style=\"text-align: left; cursor: ns-resize\" slick-drop-list-grab>{{column.title}}</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<slick-dialog-footer>\r\n\t\t<div style=\"margin-top: 10px;\" class=\"col-12 text-center mb-2 mt-1\">\r\n\t\t\t<button type=\"button\" (click)=\"onSaveColumns()\" class=\"btn btn-outline-primary mr-1\"><i class=\"far fa-save\"></i> Save</button> \r\n\t\t\t<button type=\"button\" class=\"btn btn-outline-danger\" (click)=\"onCancelColumns()\">Cancel</button>\r\n\t\t</div>\r\n\t</slick-dialog-footer>\r\n</slick-dialog>\r\n\r\n\r\n<slick-confirm-dialog #addNewFavoriteDialogRef width=\"300\">\r\n\t<label>Enter new favorite name</label>\r\n\t<input type=\"text\" class=\"form-control mx-3\" style=\"width: 250px\" [(ngModel)]=\"newFavoriteText\" />\r\n</slick-confirm-dialog>",
|
|
759
|
-
providers: [SlickGridService]
|
|
760
|
-
},] }
|
|
761
|
-
];
|
|
762
|
-
/** @nocollapse */
|
|
763
|
-
SlickGridComponent.ctorParameters = () => [
|
|
764
|
-
{ type: SlickGridService },
|
|
765
|
-
{ type: SlickFunctionLockService },
|
|
766
|
-
{ type: ChangeDetectorRef }
|
|
767
|
-
];
|
|
768
|
-
SlickGridComponent.propDecorators = {
|
|
769
|
-
flexColumn: [{ type: HostBinding, args: ['class',] }],
|
|
770
|
-
gridOptions: [{ type: Input }],
|
|
771
|
-
bordered: [{ type: Input }],
|
|
772
|
-
striped: [{ type: Input }],
|
|
773
|
-
hover: [{ type: Input }],
|
|
774
|
-
showingAllRecords: [{ type: Input }],
|
|
775
|
-
data: [{ type: Input }],
|
|
776
|
-
onRowSelected: [{ type: Output }],
|
|
777
|
-
onRowDoubleClick: [{ type: Output }],
|
|
778
|
-
onRowContextMenu: [{ type: Output }],
|
|
779
|
-
onFavoritesModified: [{ type: Output }],
|
|
780
|
-
slickGridRef: [{ type: ViewChild, args: ["slickGrid", { static: true },] }],
|
|
781
|
-
tableContainerRef: [{ type: ViewChild, args: ["tableContainer",] }],
|
|
782
|
-
tableRef: [{ type: ViewChild, args: ["tableRef",] }],
|
|
783
|
-
tableHeaderRowRef: [{ type: ViewChild, args: ["tableHeaderRow",] }],
|
|
784
|
-
tableHeaderSearchRowRef: [{ type: ViewChild, args: ["tableHeaderSearchRow",] }],
|
|
785
|
-
testRowRef: [{ type: ViewChild, args: ["testRow",] }],
|
|
786
|
-
tableBodyRowsRef: [{ type: ViewChild, args: ["tableBodyRows",] }],
|
|
787
|
-
columnSelectDialogRef: [{ type: ViewChild, args: ["columnSelectDialogRef",] }],
|
|
788
|
-
addNewFavoriteDialogRef: [{ type: ViewChild, args: ["addNewFavoriteDialogRef",] }],
|
|
789
|
-
slickGridColumnTemplates: [{ type: ContentChildren, args: [SlickGridColumnTemplateDirective,] }],
|
|
790
|
-
onResize: [{ type: HostListener, args: ['window:resize', ['$event', '$event.target'],] }]
|
|
791
|
-
};
|
|
792
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9zbGljay1ncmlkL3NsaWNrLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUE4RCxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFNUgsT0FBTyxFQUFFLHFCQUFxQixFQUFnQyxNQUFNLDRCQUE0QixDQUFDO0FBRWpHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzdILE9BQU8sRUFBMkIsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RixNQUFNLGFBQWE7SUFDbEIsWUFBWSxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbEIs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QUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBIb3N0QmluZGluZywgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRTZXJ2aWNlIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTbGlja0dyaWRDb2x1bW5Nb2RlbCwgU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMsIFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24gfSBmcm9tIFwiLi9zbGljay1ncmlkLWNvbHVtbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJU2xpY2tHcmlkT3B0aW9ucyB9IGZyb20gXCIuL3NsaWNrLWdyaWQub3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwsIElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWwgfSBmcm9tIFwiLi9zbGljay1ncmlkLXJlcXVlc3QubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCB9IGZyb20gXCIuL3NsaWNrLWdyaWQtcmVzcG9uc2UubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpY2tEaWFsb2dDb21wb25lbnQgfSBmcm9tIFwiLi4vc2xpY2stZGlhbG9nL3NsaWNrLWRpYWxvZy5tb2R1bGVcIjtcclxuaW1wb3J0IHsgU2xpY2tTbGVlcFNlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvc2xpY2stc2xlZXAuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja1V0aWxzU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay11dGlscy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay1mdW5jdGlvbi1sb2NrLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9zbGljay1ncmlkLWNvbHVtbi10ZW1wbGF0ZS5kaXJlY3RpdmVcIjtcclxuaW1wb3J0IHsgU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50LCBTbGlja0NvbmZpcm1EaWFsb2dSZXN1bHRzIH0gZnJvbSAnLi4vc2xpY2stY29uZmlybS1kaWFsb2cvc2xpY2stY29uZmlybS1kaWFsb2cubW9kdWxlJztcclxuaW1wb3J0IHsgSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWwsIFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwgfSBmcm9tICcuL3NsaWNrLWdyaWQtZmF2b3JpdGUubW9kZWwnO1xyXG5cclxuY2xhc3MgRHJvcERvd25Nb2RlbCB7XHJcblx0Y29uc3RydWN0b3IodGV4dDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmlkID0gdGV4dDtcclxuXHRcdHRoaXMudGV4dCA9IHRleHQ7XHJcblx0fVxyXG5cclxuXHRpZDogc3RyaW5nO1xyXG5cdHRleHQ6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdzbGljay1ncmlkJyxcclxuXHR0ZW1wbGF0ZVVybDogJ3NsaWNrLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHByb3ZpZGVyczogW1NsaWNrR3JpZFNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbGlja0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHRASG9zdEJpbmRpbmcoJ2NsYXNzJykgZmxleENvbHVtbiA9ICdzbGljay1mbGV4LWNvbHVtbic7XHJcblx0Ly9ASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3MgPSAnZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtZmlsbCc7XHJcblxyXG5cdEBJbnB1dCgpIGdyaWRPcHRpb25zOiBJU2xpY2tHcmlkT3B0aW9ucztcclxuXHRASW5wdXQoKSBib3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgc3RyaXBlZDogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgaG92ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdEBJbnB1dCgpIHNob3dpbmdBbGxSZWNvcmRzID0gZmFsc2U7XHJcblx0QElucHV0KCkgZGF0YTogYW55W107XHJcblx0QE91dHB1dCgpIG9uUm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93RG91YmxlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uUm93Q29udGV4dE1lbnU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblx0QE91dHB1dCgpIG9uRmF2b3JpdGVzTW9kaWZpZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cdEBWaWV3Q2hpbGQoXCJzbGlja0dyaWRcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2xpY2tHcmlkUmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUNvbnRhaW5lclwiKSB0YWJsZUNvbnRhaW5lclJlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwidGFibGVSZWZcIikgdGFibGVSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlSGVhZGVyUm93XCIpIHRhYmxlSGVhZGVyUm93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUhlYWRlclNlYXJjaFJvd1wiKSB0YWJsZUhlYWRlclNlYXJjaFJvd1JlZjogRWxlbWVudFJlZjtcclxuXHQvLyBUaGlzIGlzIHRvIHRlc3QgaG93IGhpZ2ggYSBzdGFuZGFyZCByb3cgaXNcclxuXHRAVmlld0NoaWxkKFwidGVzdFJvd1wiKSB0ZXN0Um93UmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZUJvZHlSb3dzXCIpIHRhYmxlQm9keVJvd3NSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcImNvbHVtblNlbGVjdERpYWxvZ1JlZlwiKSBjb2x1bW5TZWxlY3REaWFsb2dSZWY6IFNsaWNrRGlhbG9nQ29tcG9uZW50O1xyXG5cdEBWaWV3Q2hpbGQoXCJhZGROZXdGYXZvcml0ZURpYWxvZ1JlZlwiKSBhZGROZXdGYXZvcml0ZURpYWxvZ1JlZjogU2xpY2tDb25maXJtRGlhbG9nQ29tcG9uZW50O1xyXG5cclxuXHRAQ29udGVudENoaWxkcmVuKFNsaWNrR3JpZENvbHVtblRlbXBsYXRlRGlyZWN0aXZlKSBzbGlja0dyaWRDb2x1bW5UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZT47XHJcblx0dGVtcGxhdGVSZWZzOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZm5Pbk1vdXNlVXAgPSAoZSkgPT4gdGhpcy5vbk1vdXNlVXAoZSk7XHJcblxyXG5cdHV1aWQ6IHN0cmluZztcclxuXHRzZWxlY3RlZEluZGV4OiBudW1iZXIgPSBudWxsO1xyXG5cdGdyaWRPcGFjaXR5ID0gMDtcclxuXHR2aXNpYmxlQ29sdW1uczogSVNsaWNrR3JpZENvbHVtbk1vZGVsW107XHJcblx0ZmF2b3JpdGVzOiBEcm9wRG93bk1vZGVsW107XHJcblx0c2VsZWN0ZWRGYXZvcml0ZTogc3RyaW5nO1xyXG5cdG5ld0Zhdm9yaXRlVGV4dDogc3RyaW5nO1xyXG5cdGNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnM6IElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdO1xyXG5cdGxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGlzRG91YmxlQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRkb3VibGVDbGlja1dhaXRUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0Y3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcblx0c2VhcmNoVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdGtleXByZXNzVGltZW91dDogTm9kZUpTLlRpbWVyO1xyXG5cdHNob3dUZXN0Um93ID0gZmFsc2U7XHJcblx0c2hvd1NlYXJjaFJvdyA9IGZhbHNlO1xyXG5cdGlzUmVzaXppbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHR2aXNpYmxlRGF0YTogYW55W10gPSBbXTtcclxuXHRyZWNvcmRzUGVyUGFnZTogbnVtYmVyO1xyXG5cdHRvdGFsUmVjb3JkczogbnVtYmVyO1xyXG5cdHJlY29yZHNQZXJQYWdlVmFsdWU6IHN0cmluZyA9IFwiQXV0b1wiO1xyXG5cclxuXHRwcml2YXRlIHNsaWNrR3JpZEhlaWdodDogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplVGltZW91dDogTm9kZUpTLlRpbWVyID0gbnVsbDtcclxuXHRwcml2YXRlIHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFBvczogbnVtYmVyO1xyXG5cdHByaXZhdGUgcmVzaXplSW5pdGlhbFdpZHRoOiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVDb2xJZHg6IG51bWJlcjtcclxuXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50JywgJyRldmVudC50YXJnZXQnXSlcclxuXHRhc3luYyBvblJlc2l6ZShldmVudDogVUlFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuXHRcdC8vIFRoaXMgaXMgaGVyZSBiZWNhdXNlIGZpcmVmb3ggc2hvd3MvaGlkZXMgdGhlIG1lbnUgaWYgeW91IHByZXNzIGFsdC4gRG9uJ3QgcmVkcmF3IHRoZSBncmlkIGlmIHdlJ3JlXHJcblx0XHQvLyBqdXN0IHNob3dpbmcgdGhlIG1lbnVcclxuXHRcdGlmIChNYXRoLmFicyh0aGlzLnNsaWNrR3JpZEhlaWdodCAtIHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSA8IDUwKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0aWYgKHRoaXMuc2xpY2tHcmlkSGVpZ2h0ICE9PSB0aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCkge1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcclxuXHRcdFx0dGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cdFx0XHRcdHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0fSwgNTAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZFNlcnZpY2U6IFNsaWNrR3JpZFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGZ1bmN0aW9uTG9ja1NlcnZpY2U6IFNsaWNrRnVuY3Rpb25Mb2NrU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHR0aGlzLnV1aWQgPSBTbGlja1V0aWxzU2VydmljZS5uZXdHdWlkKCk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbCA9IG5ldyBTbGlja0dyaWRSZXF1ZXN0TW9kZWwoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5zZXRHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdC8vIENvcHkgdGhlIHRlbXBsYXRlcyB0byBhIHZhcmlhYmxlIHRoYXQgdGhlIGh0bWwgY2FuIGFjY2Vzcy4gIEl0IGNhbid0IGFjY2VzcyBhIFF1ZXJ5TGlzdFxyXG5cdFx0dGhpcy50ZW1wbGF0ZVJlZnMgPSB7fTtcclxuXHRcdHRoaXMuc2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVzLmZvckVhY2godCA9PiB7XHJcblx0XHRcdHRoaXMudGVtcGxhdGVSZWZzW3QuY29sdW1uS2V5XSA9IHQudGVtcGxhdGU7XHJcblx0XHR9KTtcclxuXHRcdGlmICh0aGlzLnRhYmxlUmVmKVxyXG5cdFx0XHQoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5mb2N1cygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgdGFibGVLZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuXHRcdC8vIEtleSB1cFxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDM4ICYmICEodGhpcy5zZWxlY3RlZEluZGV4ID09PSAwICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IDEpKSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLmtleXByZXNzVGltZW91dCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgtLTtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IDApIHtcclxuXHRcdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudFBhZ2UtLTtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCBmYWxzZSk7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLnJlY29yZHNQZXJQYWdlIC0gMTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdFx0Ly8gS2V5IGRvd25cclxuXHRcdGlmIChlLndoaWNoID09PSA0MCkge1xyXG5cdFx0XHRpZiAoKCh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJlY29yZHNQZXJQYWdlKSArIHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnRvdGFsUmVjb3JkcylcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5rZXlwcmVzc1RpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLnJlY29yZHNQZXJQYWdlKSB7XHJcblx0XHRcdFx0aWYgKCgodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5yZWNvcmRzUGVyUGFnZSkgKyB0aGlzLnNlbGVjdGVkSW5kZXggPCB0aGlzLnRvdGFsUmVjb3Jkcykge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSsrO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMua2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3Qgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuXHRcdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKGNoYW5nZXMuYm9yZGVyZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuYm9yZGVyZWQgPT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ib3JkZXJlZCA9ICh0aGlzLmJvcmRlcmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2ZhbHNlJykgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuc3RyaXBlZCkge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkID09PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuc3RyaXBlZCA9ICh0aGlzLnN0cmlwZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ob3Zlcikge1xyXG5cdFx0XHQvLyBUaGUgZ3JpZCBvcHRpb25zIG92ZXJyaWRlIHRoZSB0YWcgb3B0aW9uc1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ob3ZlciA9PT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmhvdmVyID0gKHRoaXMuaG92ZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5ncmlkT3B0aW9ucykge1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZCAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmJvcmRlcmVkID0gdGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZDtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5zdHJpcGVkID0gdGhpcy5ncmlkT3B0aW9ucy5zdHJpcGVkO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXIgIT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5ob3ZlciA9IHRoaXMuZ3JpZE9wdGlvbnMuaG92ZXI7XHJcblxyXG5cdFx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmRhdGEpIHtcclxuXHRcdFx0Ly8gSWYgd2UgZG9uJ3QgZG8gdGhpcyBsb2NrLCB0aGUgZmlyc3QgY2hhbmdlIHdpbGwgaGF2ZSBudWxsIGRhdGEgYW5kIGNyYXNoLiAgVGhlIHNlY29uZCByZXF1ZXN0IHdpbGwgaGF2ZSB0aGUgYWN0dWFsIGRhdGFcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfREFUQV9DSEFOR0VTXCIpO1xyXG5cdFx0XHQvLyBPbmx5IHJlc2l6ZSB0aGUgZ3JpZCBvbiB0aGUgZmlyc3QgY2hhbmdlLCBvdGhlcndpc2Ugd2UgZ2V0IGEgZmxpY2tlclxyXG5cdFx0XHRpZiAoY2hhbmdlcy5kYXRhLmZpcnN0Q2hhbmdlID09PSB0cnVlKVxyXG5cdFx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHQvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByZXNpemUgaW4gdGhlIE9uSW5pdCB0byBmaW5pc2ggYmVmb3JlIHdlIGNvbnRpbnVlXHJcblx0XHRcdHRoaXMubG9hZGVkID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0Um93KDApO1xyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9EQVRBX0NIQU5HRVNcIik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpIHtcclxuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmZuT25Nb3VzZVVwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZChyZWNvcmRzUGVyUGFnZTogc3RyaW5nKSB7XHJcblx0XHRpZiAoIXJlY29yZHNQZXJQYWdlKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gcmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkdSSURfXCIgKyB0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkgKyBcIl9SRUNPUkRTX1BFUl9QQUdFXCIsIHJlY29yZHNQZXJQYWdlKTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVEYXRhID0gW107XHJcblx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMDtcclxuXHRcdGF3YWl0IFNsaWNrU2xlZXBTZXJ2aWNlLnNsZWVwKCk7XHJcblx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQodHJ1ZSk7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRhd2FpdCB0aGlzLm9uUGFnZUNoYW5nZSh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuXHR9XHJcblxyXG5cdG9uQ29sUmVzaXplTW91c2Vkb3duKGU6IE1vdXNlRXZlbnQsIGNvbHVtbklkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xyXG5cdFx0dGhpcy5yZXNpemVJbml0aWFsUG9zID0gZS5wYWdlWDtcclxuXHRcdHRoaXMucmVzaXplQ29sSWR4ID0gY29sdW1uSWR4O1xyXG5cdFx0bGV0IGNvbCA9ICg8SFRNTFRhYmxlUm93RWxlbWVudD50aGlzLnRhYmxlSGVhZGVyUm93UmVmLm5hdGl2ZUVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZFwiKS5pdGVtKGNvbHVtbklkeCk7XHJcblx0XHR0aGlzLnJlc2l6ZUluaXRpYWxXaWR0aCA9IGNvbC5vZmZzZXRXaWR0aCAtIDk7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLmZsZXhpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVEb3VibGVjbGljayhlOiBNb3VzZUV2ZW50LCBjb2x1bW5JZHg6IG51bWJlcikge1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLmZsZXhpYmxlID0gdHJ1ZTtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbY29sdW1uSWR4XS53aWR0aCA9IG51bGw7XHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHR9XHJcblxyXG5cdG9uQ29sUmVzaXplTW91c2Vtb3ZlKGU6IE1vdXNlRXZlbnQpIHtcclxuXHRcdGlmICghdGhpcy5pc1Jlc2l6aW5nKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0bGV0IG5ld0N1cnNvclBvcyA9IGUucGFnZVg7XHJcblx0XHRsZXQgZGlmZiA9IG5ld0N1cnNvclBvcyAtIHRoaXMucmVzaXplSW5pdGlhbFBvcztcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbdGhpcy5yZXNpemVDb2xJZHhdLndpZHRoID0gKHRoaXMucmVzaXplSW5pdGlhbFdpZHRoICsgZGlmZikgKyBcInB4XCI7XHJcblx0XHRpZiAoKHRoaXMucmVzaXplSW5pdGlhbFdpZHRoICsgZGlmZikgPCAxMClcclxuXHRcdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0ud2lkdGggPSBcIjEwcHhcIjtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnNbdGhpcy5yZXNpemVDb2xJZHhdLmZsZXhpYmxlID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG9uTW91c2VVcChlKSB7XHJcblx0XHR0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcclxuXHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmZuT25Nb3VzZVVwKTtcclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0Z2V0VmlzaWJsZVJlY29yZHMoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy52aXNpYmxlRGF0YTtcclxuXHR9XHJcblxyXG5cdGFkZE5ld1JlY29yZChuZXdSZWNvcmQ6IGFueSwgc2VsZWN0TmV3UmVjb3JkOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHRcdHRoaXMudmlzaWJsZURhdGEudW5zaGlmdChuZXdSZWNvcmQpO1xyXG5cclxuXHRcdGlmIChzZWxlY3ROZXdSZWNvcmQgPT09IHRydWUpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleClcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXgrKztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZVJlY29yZChyb3dOdW06IG51bWJlciwgcmVjb3JkOiBhbnkpIHtcclxuXHRcdHRoaXMudmlzaWJsZURhdGFbcm93TnVtXSA9IHJlY29yZDtcclxuXHR9XHJcblxyXG5cdG9uUm93Q2xpY2tlZChyb3dEYXRhOiBhbnksIGlkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBpZHg7XHJcblx0XHRjbGVhclRpbWVvdXQodGhpcy5kb3VibGVDbGlja1dhaXRUaW1lb3V0KTtcclxuXHRcdHRoaXMuZG91YmxlQ2xpY2tXYWl0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLm9uUm93U2VsZWN0ZWQuZW1pdChyb3dEYXRhKTtcclxuXHRcdH0sIDI1MCk7XHJcblx0fVxyXG5cclxuXHRvblJvd0RvdWJsZUNsaWNrZWQocm93RGF0YTogYW55LCBpZHgpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IGlkeDtcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLmRvdWJsZUNsaWNrV2FpdFRpbWVvdXQpO1xyXG5cdFx0dGhpcy5vblJvd0RvdWJsZUNsaWNrLmVtaXQocm93RGF0YSk7XHJcblx0fVxyXG5cclxuXHRvblJvd0NvbnRleHRNZW51Q2xpY2tlZChlOiBNb3VzZUV2ZW50LCByb3dEYXRhLCBpZHgpIHtcclxuXHRcdGlmICh0aGlzLm9uUm93Q29udGV4dE1lbnUpIHtcclxuXHRcdFx0bGV0IHJvd0NvbnRleHRNZW51TW9kZWwgPSB7XHJcblx0XHRcdFx0bW91c2VFdmVudDogZSxcclxuXHRcdFx0XHRkYXRhOiByb3dEYXRhLFxyXG5cdFx0XHRcdHJvd0lkeDogaWR4XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25Sb3dDb250ZXh0TWVudS5lbWl0KHJvd0NvbnRleHRNZW51TW9kZWwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgb25QYWdlQ2hhbmdlKHBhZ2VOdW1iZXIsIHNlbGVjdFJvdzogYm9vbGVhbiA9IHRydWUpIHtcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IHBhZ2VOdW1iZXI7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAodGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpID8gMCA6IG51bGw7XHJcblxyXG5cdFx0aWYgKHNlbGVjdFJvdyA9PT0gdHJ1ZSAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyByZWxvYWRHcmlkKGFkZGl0aW9uYWxQYXJhbXM6IGFueSk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnVybCA9IHRoaXMuZ3JpZE9wdGlvbnMuZ2V0VXJsO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5odHRwSGVhZGVycyA9IHRoaXMuZ3JpZE9wdGlvbnMuaHR0cEhlYWRlcnM7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmFkZGl0aW9uYWxQYXJhbXMgPSBhZGRpdGlvbmFsUGFyYW1zO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSB0aGlzLnJlY29yZHNQZXJQYWdlO1xyXG5cclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURcIik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2VNb2RlbCk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVsb2FkR3JpZFdpdGhSZXF1ZXN0TW9kZWwocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURHUklEV0lUSFJFUVVFU1RNT0RFTFwiKTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwgPSByZXF1ZXN0TW9kZWw7XHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURXSVRIUkVRVUVTVE1PREVMXCIpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTW9kZWwpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhc3luYyByZWxvYWQocmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwpOiBQcm9taXNlPFNsaWNrR3JpZFJlc3BvbnNlTW9kZWw+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BRFwiKTtcclxuXHJcblx0XHRcdHJlcXVlc3RNb2RlbCA9IHRoaXMuZ2V0UmVxdWVzdE1vZGVsKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHJcblx0XHRcdGxldCByZXNwb25zZU1vZGVsOiBTbGlja0dyaWRSZXNwb25zZU1vZGVsID0gbnVsbDtcclxuXHRcdFx0aWYgKHJlcXVlc3RNb2RlbC51cmwpXHJcblx0XHRcdFx0cmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0RGF0YUZyb21TZXJ2ZXIocmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHJlc3BvbnNlTW9kZWwgPSBhd2FpdCB0aGlzLmdyaWRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YU9iaihyZXF1ZXN0TW9kZWwsIHRoaXMuZGF0YSk7XHJcblxyXG5cdFx0XHR0aGlzLmxvYWRlZCA9IHRydWU7XHJcblx0XHRcdHRoaXMudG90YWxSZWNvcmRzID0gcmVzcG9uc2VNb2RlbC50b3RhbFJlY29yZHM7XHJcblx0XHRcdHRoaXMudmlzaWJsZURhdGEgPSByZXNwb25zZU1vZGVsLmRhdGE7XHJcblxyXG5cdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRUxPQURcIik7XHJcblx0XHRcdFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVuc2VsZWN0Um93KCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHNlbGVjdFJvdyhyb3dOdW1iZXI6IG51bWJlcikge1xyXG5cdFx0bGV0IHJvd0RhdGEgPSB0aGlzLnZpc2libGVEYXRhW3Jvd051bWJlcl07XHJcblx0XHR0aGlzLm9uUm93Q2xpY2tlZChyb3dEYXRhLCByb3dOdW1iZXIpO1xyXG5cdH1cclxuXHJcblx0Z2V0Q29sdW1uSFRNTChyb3dEYXRhLCBkYXRhRmllbGROYW1lKSB7XHJcblx0XHRjb25zdCBjb2x1bW5IVE1MID0gU2xpY2tVdGlsc1NlcnZpY2UuZ2V0RGVlcE9iamVjdChyb3dEYXRhLCBkYXRhRmllbGROYW1lKTtcclxuXHJcblx0XHRpZiAoY29sdW1uSFRNTCA9PT0gbnVsbCB8fCBjb2x1bW5IVE1MID09PSB1bmRlZmluZWQpXHJcblx0XHRcdHJldHVybiAnJztcclxuXHJcblx0XHRyZXR1cm4gY29sdW1uSFRNTC50b1N0cmluZygpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc29ydEJ5KHNvcnRDb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdGlmIChzb3J0Q29sdW1uICYmIGMuY29sdW1uS2V5ICE9PSBzb3J0Q29sdW1uLmNvbHVtbktleSkge1xyXG5cclxuXHRcdFx0XHRjLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmU7XHJcblx0XHRcdH1cclxuXHRcdH0pXHJcblxyXG5cdFx0aWYgKHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0aWYgKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKSB7XHJcblx0XHRcdFx0dGhpcy52aXNpYmxlQ29sdW1ucy5mb3JFYWNoKGMgPT4gYy5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lKTtcclxuXHRcdFx0XHRzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYztcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIGlmIChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjKVxyXG5cdFx0XHRcdHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYztcclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0c29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5ub25lO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblNlYXJjaFNlbGVjdChkZFZhbHVlLCBjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0aWYgKCF0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMpXHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdGxldCBjb2x1bW5TZWFyY2hWYWx1ZUlkeCA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maW5kSW5kZXgoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHRcdGlmIChjb2x1bW5TZWFyY2hWYWx1ZUlkeCA+PSAwKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuc3BsaWNlKGNvbHVtblNlYXJjaFZhbHVlSWR4LCAxKTtcclxuXHJcblx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoZGRWYWx1ZSkge1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0Y29sdW1uTmFtZTogY29sdW1uLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0c2VhcmNoVmFsdWVJZDogZGRWYWx1ZS5pZCxcclxuXHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IGRkVmFsdWUudGV4dFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblNlYXJjaChjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHJcblx0XHRpZiAoIXRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcylcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gW107XHJcblxyXG5cdFx0aWYgKGNvbHVtbi5maWx0ZXJUZXh0ID09PSBjb2x1bW4ubGFzdFNlYXJjaFRleHQpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb2x1bW4ubGFzdFNlYXJjaFRleHQgPSBjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9ICEhY29sdW1uLmZpbHRlclRleHQ7XHJcblx0XHRpZiAoIWNvbHVtbi5pc0ZpbHRlcmluZylcclxuXHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XHJcblx0XHR0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0XHRsZXQgY29sdW1uU2VhcmNoVmFsdWVJZHggPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmluZEluZGV4KHggPT4geC5jb2x1bW5OYW1lID09PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRcdGlmIChjb2x1bW5TZWFyY2hWYWx1ZUlkeCA+PSAwKVxyXG5cdFx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5zcGxpY2UoY29sdW1uU2VhcmNoVmFsdWVJZHgsIDEpO1xyXG5cclxuXHRcdFx0aWYgKGNvbHVtbi5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdFx0Y29sdW1uTmFtZTogY29sdW1uLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IGNvbHVtbi5maWx0ZXJUZXh0XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHR9LCAyNTApO1xyXG5cdH1cclxuXHJcblx0dG9nZ2xlTG9jayhjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCkge1xyXG5cdFx0Y29sdW1uLmlzTG9ja2VkID0gIWNvbHVtbi5pc0xvY2tlZDtcclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlc2V0RmlsdGVyKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbHVtbi5maWx0ZXJUZXh0ID0gbnVsbDtcclxuXHRcdGNvbHVtbi5sYXN0U2VhcmNoVGV4dCA9IG51bGw7XHJcblx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSB0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMuZmlsdGVyKHggPT4geC5jb2x1bW5OYW1lICE9PSBjb2x1bW4uZGF0YUZpZWxkTmFtZSk7XHJcblxyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0fVxyXG5cclxuXHRvcGVuQ29sdW1uU2VsZWN0RGlhbG9nKCkge1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gWy4uLnRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uc107XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblxyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dSZWYuc2hvd0RpYWxvZygpO1xyXG5cdH1cclxuXHJcblx0b25Db2x1bW5Ecm9wKGU6IGFueSkge1xyXG5cdFx0Y29uc29sZS5sb2coZSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbkNvbHVtblJlb3JkZXIoZTogbnVtYmVyW10pIHtcclxuXHRcdGNvbnN0IG9sZE9yZGVyID0gZVswXTtcclxuXHRcdGNvbnN0IG5ld09yZGVyID0gZVsxXTtcclxuXHJcblx0XHRpZiAob2xkT3JkZXIgPT09IG5ld09yZGVyKVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0Y29uc3Qgc2VsZWN0ZWRDb2wgPSB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc3BsaWNlKG9sZE9yZGVyLCAxKVswXTtcclxuXHRcdHNlbGVjdGVkQ29sLmRpc3BsYXlPcmRlciA9IG5ld09yZGVyO1xyXG5cclxuXHRcdGxldCBjdXJyZW50T3JkZXIgPSAwO1xyXG5cdFx0Ly8gRXZlcnl0aGluZyB1cCB0byB0aGUgbmV3IG9yZGVyIHJlb3JkZXJlZCBmcm9tIDBcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdC8vIElmIHdlJ3JlIGF0IG5ld09yZGVyLCBsZWF2ZSBhIHNwb3RcclxuXHRcdFx0aWYgKGkgPT09IG5ld09yZGVyKVxyXG5cdFx0XHRcdGN1cnJlbnRPcmRlcisrO1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnNbaV0uZGlzcGxheU9yZGVyID0gY3VycmVudE9yZGVyKys7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucywgc2VsZWN0ZWRDb2xdO1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zID0gdGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgYWRkTmV3RmF2b3JpdGUoKSB7XHJcblx0XHR0aGlzLm5ld0Zhdm9yaXRlVGV4dCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCB0aGlzLmFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmLmNvbmZpcm0oKTtcclxuXHJcblx0XHRpZiAoY29uZmlybVJlc3VsdCA9PT0gU2xpY2tDb25maXJtRGlhbG9nUmVzdWx0cy5PayAmJiB0aGlzLm5ld0Zhdm9yaXRlVGV4dCkge1xyXG5cdFx0XHQvLyBTYXZlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24gdG8gbG9jYWxzdG9yYWdlXHJcblx0XHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5mYXZvcml0ZXMucHVzaChuZXcgRHJvcERvd25Nb2RlbCh0aGlzLm5ld0Zhdm9yaXRlVGV4dCkpO1xyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gdGhpcy5uZXdGYXZvcml0ZVRleHQ7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIsIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0XHRjb25zdCBmYXZvcml0ZXNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5mYXZvcml0ZXMubWFwKHggPT4geC50ZXh0KSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX0ZBVk9SSVRFU1wiLCBmYXZvcml0ZXNKc29uKTtcclxuXHJcblx0XHRcdC8vIFNhdmUgdGhlIG5ldyBvbmUgdG8gbG9jYWxzdG9yYWdlXHJcblx0XHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bG9hZEZhdm9yaXRlKGZhdm9yaXRlOiBEcm9wRG93bk1vZGVsKSB7XHJcblx0XHR0aGlzLnNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBmYXZvcml0ZS50ZXh0O1xyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSnNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHt0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlfWApO1xyXG5cdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBzZXRGYXZvcml0ZShmYXZvcml0ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBmYXZvcml0ZTtcclxuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIsIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSnNvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHt0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlfWApO1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdHRoaXMuc2hvd1NlYXJjaFJvdyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKS5sZW5ndGggPiAwO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0fVxyXG5cclxuXHRvblNhdmVDb2x1bW5zKCkge1xyXG5cdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc107XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGlmIHRoZXkndmUgaGlkZGVuIGEgY29sdW1uIHRoYXQgd2UgYXJlbid0IHRyeWluZyB0byBzb3J0IG9yIGZpbHRlciBieSB0aGlzIGNvbHVtblxyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goeCA9PiB7XHJcblx0XHRcdGlmICh4LnZpc2libGUgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0eC5maWx0ZXJEcm9wZG93blZhbHVlID0gbnVsbDtcclxuXHRcdFx0XHR4LmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0XHRcdHguaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHR4LmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0eC5sYXN0U2VhcmNoVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0eC5zb3J0RGlyZWN0aW9uID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUgPT09IHRydWUpO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHR0aGlzLnNob3dTZWFyY2hSb3cgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuZmlsdGVyVHlwZSAhPT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMubm9uZSkubGVuZ3RoID4gMDtcclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ1JlZi5oaWRlRGlhbG9nKCk7XHJcblx0XHR0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHJcblx0XHRpZiAodGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkKSB7XHJcblx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZXM6IElTbGlja0dyaWRGYXZvcml0ZU1vZGVsW10gPSB0aGlzLmZhdm9yaXRlcy5tYXAoZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZSA9IG5ldyBTbGlja0dyaWRGYXZvcml0ZU1vZGVsKCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0Y29uc3QgZGlhbG9nQ29sdW1uc0pTT04gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5jb2x1bW5zID0gSlNPTi5wYXJzZShkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0cmV0dXJuIGdyaWRGYXZvcml0ZTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQuZW1pdChncmlkRmF2b3JpdGVzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQ2FuY2VsQ29sdW1ucygpIHtcclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nUmVmLmhpZGVEaWFsb2coKTtcclxuXHR9XHJcblxyXG5cdHNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKSB7XHJcblx0XHRsZXQgZGlhbG9nQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMpO1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCwgZGlhbG9nQ29sdW1uc0pTT04pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpIHtcclxuXHRcdGxldCBncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMpO1xyXG5cdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSkge1xyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblxyXG5cdFx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0XHJcblx0XHRcdGlmIChncmlkQ29sdW1uc0pzb24pIHtcclxuXHRcdFx0XHRsZXQgY29sdW1ucyA9IDxJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXT5KU09OLnBhcnNlKGdyaWRDb2x1bW5zSnNvbik7XHJcblxyXG5cdFx0XHRcdGxldCBkaXNwbGF5T3JkZXIgPSAwO1xyXG5cdFx0XHRcdGNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0XHRcdGxldCBjb2x1bW4gPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmluZChncmlkQ29sdW1uID0+IGdyaWRDb2x1bW4uZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdGlmIChjb2x1bW4pIHtcclxuXHRcdFx0XHRcdFx0Yy5kaXNwbGF5T3JkZXIgPSBkaXNwbGF5T3JkZXI7XHJcblx0XHRcdFx0XHRcdGMudGl0bGVPcmllbnRhdGlvbiA9IGNvbHVtbi50aXRsZU9yaWVudGF0aW9uO1xyXG5cdFx0XHRcdFx0XHRjLnRpdGxlSGVpZ2h0ID0gY29sdW1uLnRpdGxlSGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRjLndpZHRoID0gY29sdW1uLndpZHRoO1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHRcdFx0XHRcdFx0Yy5maWx0ZXJUZXh0ID0gY29sdW1uLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdGMuaXNMb2NrZWQgPSBjb2x1bW4uaXNMb2NrZWQ7XHJcblx0XHRcdFx0XHRcdGMuaXNGaWx0ZXJpbmcgPSBjb2x1bW4uaXNGaWx0ZXJpbmc7XHJcblx0XHRcdFx0XHRcdGMuc29ydERpcmVjdGlvbiA9IGNvbHVtbi5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGRpc3BsYXlPcmRlcisrO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbHVtbnMgPSBjb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdFx0XHRcdGdyaWRDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KGNvbHVtbnMpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWAsIGdyaWRDb2x1bW5zSlNPTik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMub25GYXZvcml0ZXNNb2RpZmllZCkge1xyXG5cdFx0XHRjb25zdCBncmlkRmF2b3JpdGVzOiBJU2xpY2tHcmlkRmF2b3JpdGVNb2RlbFtdID0gdGhpcy5mYXZvcml0ZXMubWFwKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRjb25zdCBncmlkRmF2b3JpdGUgPSBuZXcgU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCgpO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUgPSBmYXZvcml0ZS50ZXh0O1xyXG5cdFx0XHRcdGNvbnN0IHN1ZmZpeCA9IGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIGdyaWRGYXZvcml0ZS5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdGNvbnN0IGRpYWxvZ0NvbHVtbnNKU09OID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuY29sdW1ucyA9IEpTT04ucGFyc2UoZGlhbG9nQ29sdW1uc0pTT04pO1xyXG5cdFx0XHRcdHJldHVybiBncmlkRmF2b3JpdGU7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkLmVtaXQoZ3JpZEZhdm9yaXRlcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0cHJpdmF0ZSBhc3luYyByZXNpemVHcmlkKGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcclxuXHRcdFx0aWYgKCFmb3JjZVJlZnJlc2ggJiYgdGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPT09IHRoaXMuc2xpY2tHcmlkSGVpZ2h0KSB7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSA9PT0gJ0F1dG8nKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVTSVpFR1JJRFwiKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zbGlja0dyaWRIZWlnaHQgPSB0aGlzLnRhYmxlQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXN0Um93ID0gKDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuaW5zZXJ0Um93KDApO1xyXG5cdFx0XHRcdGNvbnN0IHRlc3RDZWxsID0gdGVzdFJvdy5pbnNlcnRDZWxsKDApO1xyXG5cdFx0XHRcdHRlc3RDZWxsLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG5cdFx0XHRcdHRlc3RDZWxsLmlubmVySFRNTCA9IFwiJk5CU1BcIjtcclxuXHRcdFx0XHRjb25zdCByb3dIZWlnaHQgPSB0ZXN0Q2VsbC5vZmZzZXRIZWlnaHQ7XHJcblx0XHRcdFx0KDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuZGVsZXRlUm93KDApO1xyXG5cclxuXHRcdFx0XHRsZXQgaGVhZGVySGVpZ2h0ID0gdGhpcy50YWJsZUhlYWRlclJvd1JlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArIDI7XHJcblx0XHRcdFx0aWYgKHRoaXMudGFibGVIZWFkZXJTZWFyY2hSb3dSZWYpXHJcblx0XHRcdFx0XHRoZWFkZXJIZWlnaHQgKz0gdGhpcy50YWJsZUhlYWRlclNlYXJjaFJvd1JlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArIDI7XHJcblx0XHRcdFx0Y29uc3QgY2xpZW50SGVpZ2h0ID0gdGhpcy50YWJsZUNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAtIGhlYWRlckhlaWdodDtcclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlID0gcGFyc2VJbnQoKChjbGllbnRIZWlnaHQgLyByb3dIZWlnaHQpIC0gMSkudG9GaXhlZCgwKSk7XHJcblx0XHRcdFx0bGV0IGFjdHVhbFJvd0hlaWdodCA9IHBhcnNlSW50KChjbGllbnRIZWlnaHQgLyB0aGlzLnJlY29yZHNQZXJQYWdlKS50b0ZpeGVkKDApKSAtIDE7XHJcblx0XHRcdFx0aWYgKGFjdHVhbFJvd0hlaWdodCA8IHJvd0hlaWdodClcclxuXHRcdFx0XHRcdGFjdHVhbFJvd0hlaWdodCA9IHJvd0hlaWdodDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWxsUm93cyA9IDxIVE1MRWxlbWVudFtdPnRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50YWJsZSB0Ym9keSB0clwiKTtcclxuXHRcdFx0XHRhbGxSb3dzLmZvckVhY2gocm93ID0+IHtcclxuXHRcdFx0XHRcdHJvdy5zdHlsZS5oZWlnaHQgPSAoYWN0dWFsUm93SGVpZ2h0KSArIFwicHhcIjtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVTSVpFR1JJRFwiKTtcclxuXHJcblx0XHRcdFx0dGhpcy5ncmlkT3BhY2l0eSA9IDE7XHJcblx0XHRcdFx0dGhpcy5zaG93VGVzdFJvdyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZSA9IHBhcnNlSW50KHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSk7XHJcblx0XHRcdFx0dGhpcy5ncmlkT3BhY2l0eSA9IDE7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFkZENvbHVtbihjb2x1bW46IElTbGlja0dyaWRDb2x1bW5Nb2RlbCwgaWR4OiBudW1iZXIgPSBudWxsKSB7XHJcblxyXG5cdFx0aWYgKGlkeCA9PT0gbnVsbClcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnB1c2goY29sdW1uKTtcclxuXHRcdGVsc2VcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnNwbGljZShpZHgsIDAsIGNvbHVtbik7XHJcblxyXG5cdFx0dGhpcy5zZXRHcmlkT3B0aW9ucyh0aGlzLmdyaWRPcHRpb25zKTtcclxuXHR9XHJcblxyXG5cdGdldFJlcXVlc3RNb2RlbChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCA9IG51bGwpOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWwge1xyXG5cdFx0aWYgKCFyZXF1ZXN0TW9kZWwpXHJcblx0XHRcdHJlcXVlc3RNb2RlbCA9IHRoaXMucmVxdWVzdE1vZGVsO1xyXG5cclxuXHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0aWYgKGMudmlzaWJsZSkge1xyXG5cdFx0XHRcdGlmIChjLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLnRleHQgJiYgYy5maWx0ZXJUZXh0KSB7XHJcblx0XHRcdFx0XHRjLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRyZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnB1c2goPElTbGlja0dyaWRSZXF1ZXN0U2VhcmNoTW9kZWw+e1xyXG5cdFx0XHRcdFx0XHRjb2x1bW5OYW1lOiBjLmRhdGFGaWVsZE5hbWUsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlSWQ6IG51bGwsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogYy5maWx0ZXJUZXh0XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSBpZiAoYy5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5kcm9wZG93biAmJiBjLmZpbHRlckRyb3Bkb3duVmFsdWUpIHtcclxuXHRcdFx0XHRcdGMuZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGMuZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdGNvbHVtbk5hbWU6IGMuZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVJZDogYy5maWx0ZXJEcm9wZG93blZhbHVlLFxyXG5cdFx0XHRcdFx0XHRzZWFyY2hWYWx1ZVRleHQ6IG51bGxcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmVxdWVzdE1vZGVsLnNvcnRDb2x1bW4gPSBudWxsO1xyXG5cdFx0Y29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKHggPT4geC5zb3J0RGlyZWN0aW9uID09PSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLmFzYyB8fCB4LnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uZGVzYyk7XHJcblx0XHRpZiAoc29ydENvbHVtbikge1xyXG5cdFx0XHRyZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IChzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPT09IDApID8gbnVsbCA6IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0cmVxdWVzdE1vZGVsLnNvcnREaXJlY3Rpb24gPSBzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA8PSAwKVxyXG5cdFx0XHRyZXF1ZXN0TW9kZWwucmVjb3Jkc1BlclBhZ2UgPSAyMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TW9kZWw7XHJcblx0fVxyXG5cclxuXHRzZXRHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogSVNsaWNrR3JpZE9wdGlvbnMpIHtcclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMgPSBncmlkT3B0aW9ucztcclxuXHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMpIHtcclxuXHRcdFx0XHRjb25zdCBmYXZvcml0ZU5hbWVzID0gdGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMubWFwKGYgPT4gZi5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9GQVZPUklURVNgLCBKU09OLnN0cmluZ2lmeShmYXZvcml0ZU5hbWVzKSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuZmF2b3JpdGVzLmZvckVhY2goZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdFx0Ly8gTWFrZSBzdXJlIHdlIGhhdmVuJ3QgYWRkZWQgYSBuZXcgY29sdW1uIHRoYXQgbmVlZHMgdG8gYmUgc2F2ZWRcclxuXHRcdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeGlzdHMgPSBmYXZvcml0ZS5jb2x1bW5zLmZpbmRJbmRleCh4ID0+IHguZGF0YUZpZWxkTmFtZSA9PT0gYy5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbHVtbkV4aXN0cyA8IDApXHJcblx0XHRcdFx0XHRcdFx0ZmF2b3JpdGUuY29sdW1ucy5wdXNoKGMpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRsZXQgZ3JpZENvbHVtbnNKU09OID0gSlNPTi5zdHJpbmdpZnkoZmF2b3JpdGUuY29sdW1ucyk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHN1ZmZpeCA9IGZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBncmlkQ29sdW1uc0pTT04pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRpZiAoZmF2b3JpdGVOYW1lcy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSkgPCAwKVxyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gXCJEZWZhdWx0XCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1NFTEVDVEVEX0ZBVk9SSVRFXCIpIHx8ICdEZWZhdWx0JztcclxuXHJcblx0XHRcdC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBkdXBsaWNhdGUgY29sdW1uIG5hbWVzXHJcblx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMxID0+IHtcclxuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb3VudCA9ICh0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmlsdGVyKHggPT4geC5kYXRhRmllbGROYW1lID09PSBjMS5kYXRhRmllbGROYW1lKSB8fCBbXSkubGVuZ3RoO1xyXG5cdFx0XHRcdGlmIChkYXRhRmllbGRDb3VudCA+IDEpXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBHcmlkICR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fSBjb2x1bW4gJHtjMS5kYXRhRmllbGROYW1lfSBpcyBkZWZpbmVkICR7ZGF0YUZpZWxkQ291bnR9IHRpbWVzYCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Y29uc3Qgc3VmZml4ID0gdGhpcy5zZWxlY3RlZEZhdm9yaXRlID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGUpO1xyXG5cdFx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gKTtcclxuXHRcdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHRcdGxldCBjb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHJcblx0XHRcdFx0bGV0IGRpc3BsYXlPcmRlciA9IDA7XHJcblx0XHRcdFx0Y29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGNvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKGdyaWRDb2x1bW4gPT4gZ3JpZENvbHVtbi5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKGNvbHVtbikge1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4udmlzaWJsZSA9IGMudmlzaWJsZTtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLmRpc3BsYXlPcmRlciA9IGRpc3BsYXlPcmRlcjtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnRpdGxlT3JpZW50YXRpb24gPSBjLnRpdGxlT3JpZW50YXRpb247XHJcblx0XHRcdFx0XHRcdGNvbHVtbi50aXRsZUhlaWdodCA9IGMudGl0bGVIZWlnaHQ7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi53aWR0aCA9IGMud2lkdGg7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5mbGV4aWJsZSA9IGMuZmxleGlibGU7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5zb3J0RGlyZWN0aW9uID0gYy5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBjLmlzTG9ja2VkO1xyXG5cdFx0XHRcdFx0XHQvL2NvbHVtbi5maWx0ZXJUeXBlID0gYy5maWx0ZXJUeXBlO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uLmlzTG9ja2VkICYmIGNvbHVtbi5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGNvbHVtbi5maWx0ZXJUeXBlID09PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy50ZXh0KVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBjLmZpbHRlclRleHQ7XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duKVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBjLmZpbHRlckRyb3Bkb3duVmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICghY29sdW1uLmZpbHRlclRleHQgJiYgIWNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5pc0xvY2tlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGRpc3BsYXlPcmRlcisrO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UgJiYgIWxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIikpXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UudG9TdHJpbmcoKTtcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdHRoaXMucmVjb3Jkc1BlclBhZ2VWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIikgfHwgXCJBdXRvXCI7XHJcblxyXG5cdFx0XHRjb25zdCBmYXZvcml0ZXNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfRkFWT1JJVEVTXCIpIHx8IGBbXCJEZWZhdWx0XCJdYDtcclxuXHRcdFx0dGhpcy5mYXZvcml0ZXMgPSAoPHN0cmluZ1tdPkpTT04ucGFyc2UoZmF2b3JpdGVzSnNvbikpLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIG5ldyBEcm9wRG93bk1vZGVsKGZhdm9yaXRlKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUgPT09IHRydWUpO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblxyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblx0XHRsZXQgc29ydENvbHVtbiA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZChjID0+IGMuc29ydGFibGUgPT09IHRydWUgJiYgYy5zb3J0RGlyZWN0aW9uID4gMCk7XHJcblx0XHRpZiAodGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwICYmIHNvcnRDb2x1bW4pIHtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IHNvcnRDb2x1bW4uZGF0YUZpZWxkTmFtZTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuc29ydERpcmVjdGlvbiA9IHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=
|