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
|
@@ -0,0 +1,793 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ContentChildren, HostBinding } from "@angular/core";
|
|
2
|
+
import { SlickGridService } from "./slick-grid.service";
|
|
3
|
+
import { SlickGridColumnFilterTypes, SlickGridColumnSortDirection } from "./slick-grid-column.model";
|
|
4
|
+
import { SlickGridRequestModel } from "./slick-grid-request.model";
|
|
5
|
+
import { SlickSleepService } from "../utils/slick-sleep.service";
|
|
6
|
+
import { SlickUtilsService } from "../utils/slick-utils.service";
|
|
7
|
+
import { SlickGridColumnTemplateDirective } from "./slick-grid-column-template.directive";
|
|
8
|
+
import { SlickConfirmDialogResults } from '../slick-confirm-dialog/slick-confirm-dialog.module';
|
|
9
|
+
import { SlickGridFavoriteModel } from './slick-grid-favorite.model';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "./slick-grid.service";
|
|
12
|
+
import * as i2 from "../utils/slick-function-lock.service";
|
|
13
|
+
import * as i3 from "../slick-drop-down/slick-drop-down.component";
|
|
14
|
+
import * as i4 from "../slick-popover/slick-popover.component";
|
|
15
|
+
import * as i5 from "../slick-paging/slick-paging.component";
|
|
16
|
+
import * as i6 from "../slick-dialog/slick-dialog.component";
|
|
17
|
+
import * as i7 from "../slick-dialog/slick-dialog-footer.component";
|
|
18
|
+
import * as i8 from "../slick-confirm-dialog/slick-confirm-dialog.component";
|
|
19
|
+
import * as i9 from "@angular/common";
|
|
20
|
+
import * as i10 from "@angular/forms";
|
|
21
|
+
import * as i11 from "../slick-drop-list/slick-drop-list.directive";
|
|
22
|
+
import * as i12 from "../slick-drop-list/slick-drop-list-item.directive";
|
|
23
|
+
import * as i13 from "../slick-drop-list/slick-drop-list-grab.directive";
|
|
24
|
+
import * as i14 from "./slick-grid-sanitize.pipe";
|
|
25
|
+
class DropDownModel {
|
|
26
|
+
constructor(text) {
|
|
27
|
+
this.id = text;
|
|
28
|
+
this.text = text;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class SlickGridComponent {
|
|
32
|
+
constructor(gridService, functionLockService, changeDetector) {
|
|
33
|
+
this.gridService = gridService;
|
|
34
|
+
this.functionLockService = functionLockService;
|
|
35
|
+
this.changeDetector = changeDetector;
|
|
36
|
+
this.flexColumn = 'slick-flex-column';
|
|
37
|
+
this.bordered = true;
|
|
38
|
+
this.striped = true;
|
|
39
|
+
this.hover = true;
|
|
40
|
+
this.showingAllRecords = false;
|
|
41
|
+
this.onRowSelected = new EventEmitter();
|
|
42
|
+
this.onRowDoubleClick = new EventEmitter();
|
|
43
|
+
this.onRowContextMenu = new EventEmitter();
|
|
44
|
+
this.onFavoritesModified = new EventEmitter();
|
|
45
|
+
this.fnOnMouseUp = (e) => this.onMouseUp(e);
|
|
46
|
+
this.selectedIndex = null;
|
|
47
|
+
this.gridOpacity = 0;
|
|
48
|
+
this.loaded = false;
|
|
49
|
+
this.isDoubleClick = false;
|
|
50
|
+
this.currentPage = 1;
|
|
51
|
+
this.showTestRow = false;
|
|
52
|
+
this.showSearchRow = false;
|
|
53
|
+
this.isResizing = false;
|
|
54
|
+
this.visibleData = [];
|
|
55
|
+
this.recordsPerPageValue = "Auto";
|
|
56
|
+
this.resizeTimeout = null;
|
|
57
|
+
this.uuid = SlickUtilsService.newGuid();
|
|
58
|
+
this.requestModel = new SlickGridRequestModel();
|
|
59
|
+
}
|
|
60
|
+
async onResize(event, targetElement) {
|
|
61
|
+
// This is here because firefox shows/hides the menu if you press alt. Don't redraw the grid if we're
|
|
62
|
+
// just showing the menu
|
|
63
|
+
if (Math.abs(this.slickGridHeight - this.slickGridRef.nativeElement.offsetHeight) < 50)
|
|
64
|
+
return;
|
|
65
|
+
if (this.slickGridHeight !== this.slickGridRef.nativeElement.offsetHeight) {
|
|
66
|
+
clearTimeout(this.resizeTimeout);
|
|
67
|
+
this.resizeTimeout = setTimeout(async () => {
|
|
68
|
+
this.currentPage = 1;
|
|
69
|
+
this.requestModel.page = 1;
|
|
70
|
+
await this.resizeGrid();
|
|
71
|
+
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
72
|
+
this.reload(this.requestModel);
|
|
73
|
+
}, 500);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async ngOnInit() {
|
|
77
|
+
this.setGridOptions(this.gridOptions);
|
|
78
|
+
}
|
|
79
|
+
async ngAfterViewInit() {
|
|
80
|
+
// Copy the templates to a variable that the html can access. It can't access a QueryList
|
|
81
|
+
this.templateRefs = {};
|
|
82
|
+
this.slickGridColumnTemplates.forEach(t => {
|
|
83
|
+
this.templateRefs[t.columnKey] = t.template;
|
|
84
|
+
});
|
|
85
|
+
if (this.tableRef)
|
|
86
|
+
this.tableRef.nativeElement.focus();
|
|
87
|
+
}
|
|
88
|
+
async tableKeydown(e) {
|
|
89
|
+
// Key up
|
|
90
|
+
if (e.which === 38 && !(this.selectedIndex === 0 && this.currentPage === 1)) {
|
|
91
|
+
clearTimeout(this.keypressTimeout);
|
|
92
|
+
this.selectedIndex--;
|
|
93
|
+
if (this.selectedIndex < 0) {
|
|
94
|
+
if (this.currentPage > 1) {
|
|
95
|
+
this.currentPage--;
|
|
96
|
+
this.selectedIndex = 0;
|
|
97
|
+
await this.onPageChange(this.currentPage, false);
|
|
98
|
+
this.selectedIndex = this.recordsPerPage - 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this.keypressTimeout = setTimeout(() => {
|
|
102
|
+
const rowData = this.visibleData[this.selectedIndex];
|
|
103
|
+
this.onRowClicked(rowData, this.selectedIndex);
|
|
104
|
+
}, 500);
|
|
105
|
+
}
|
|
106
|
+
// Key down
|
|
107
|
+
if (e.which === 40) {
|
|
108
|
+
if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex >= this.totalRecords)
|
|
109
|
+
return;
|
|
110
|
+
clearTimeout(this.keypressTimeout);
|
|
111
|
+
this.selectedIndex++;
|
|
112
|
+
if (this.selectedIndex >= this.recordsPerPage) {
|
|
113
|
+
if (((this.currentPage - 1) * this.recordsPerPage) + this.selectedIndex < this.totalRecords) {
|
|
114
|
+
this.currentPage++;
|
|
115
|
+
this.selectedIndex = 0;
|
|
116
|
+
await this.onPageChange(this.currentPage, false);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
this.keypressTimeout = setTimeout(() => {
|
|
120
|
+
const rowData = this.visibleData[this.selectedIndex];
|
|
121
|
+
this.onRowClicked(rowData, this.selectedIndex);
|
|
122
|
+
}, 500);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async ngOnChanges(changes) {
|
|
126
|
+
if (changes.bordered) {
|
|
127
|
+
if (this.gridOptions.bordered === null)
|
|
128
|
+
this.bordered = (this.bordered.toString().toLowerCase() !== 'false') ? true : false;
|
|
129
|
+
}
|
|
130
|
+
if (changes.striped) {
|
|
131
|
+
// The grid options override the tag options
|
|
132
|
+
if (this.gridOptions.striped === null)
|
|
133
|
+
this.striped = (this.striped.toString().toLowerCase() !== 'false') ? true : false;
|
|
134
|
+
}
|
|
135
|
+
if (changes.hover) {
|
|
136
|
+
// The grid options override the tag options
|
|
137
|
+
if (this.gridOptions.hover === null)
|
|
138
|
+
this.hover = (this.hover.toString().toLowerCase() !== 'false') ? true : false;
|
|
139
|
+
}
|
|
140
|
+
if (changes.gridOptions) {
|
|
141
|
+
if (this.gridOptions.bordered !== null)
|
|
142
|
+
this.bordered = this.gridOptions.bordered;
|
|
143
|
+
if (this.gridOptions.striped !== null)
|
|
144
|
+
this.striped = this.gridOptions.striped;
|
|
145
|
+
if (this.gridOptions.hover !== null)
|
|
146
|
+
this.hover = this.gridOptions.hover;
|
|
147
|
+
this.setGridOptions(this.gridOptions);
|
|
148
|
+
}
|
|
149
|
+
if (changes.data) {
|
|
150
|
+
// If we don't do this lock, the first change will have null data and crash. The second request will have the actual data
|
|
151
|
+
await this.functionLockService.lock("GRID_" + this.uuid + "_DATA_CHANGES");
|
|
152
|
+
// Only resize the grid on the first change, otherwise we get a flicker
|
|
153
|
+
if (changes.data.firstChange === true)
|
|
154
|
+
await this.resizeGrid();
|
|
155
|
+
// We need to wait for the resize in the OnInit to finish before we continue
|
|
156
|
+
this.loaded = true;
|
|
157
|
+
this.currentPage = 1;
|
|
158
|
+
this.requestModel.page = 1;
|
|
159
|
+
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
160
|
+
await this.reload(this.requestModel);
|
|
161
|
+
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
162
|
+
this.selectRow(0);
|
|
163
|
+
this.functionLockService.release("GRID_" + this.uuid + "_DATA_CHANGES");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
ngOnDestroy() {
|
|
167
|
+
document.removeEventListener('mouseup', this.fnOnMouseUp);
|
|
168
|
+
}
|
|
169
|
+
async onRecordsPerPageSelected(recordsPerPage) {
|
|
170
|
+
if (!recordsPerPage)
|
|
171
|
+
return;
|
|
172
|
+
this.recordsPerPageValue = recordsPerPage;
|
|
173
|
+
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE", recordsPerPage);
|
|
174
|
+
this.visibleData = [];
|
|
175
|
+
this.gridOpacity = 0;
|
|
176
|
+
await SlickSleepService.sleep();
|
|
177
|
+
await this.resizeGrid(true);
|
|
178
|
+
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
179
|
+
this.currentPage = 1;
|
|
180
|
+
await this.onPageChange(this.currentPage, true);
|
|
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
|
+
async onPageChange(pageNumber, selectRow = true) {
|
|
251
|
+
this.currentPage = pageNumber;
|
|
252
|
+
this.requestModel.page = pageNumber;
|
|
253
|
+
await this.reload(this.requestModel);
|
|
254
|
+
this.selectedIndex = (this.gridOptions.autoSelectFirstRow === true) ? 0 : null;
|
|
255
|
+
if (selectRow === true && this.gridOptions.autoSelectFirstRow === true) {
|
|
256
|
+
const rowData = this.visibleData[this.selectedIndex];
|
|
257
|
+
this.onRowClicked(rowData, this.selectedIndex);
|
|
258
|
+
}
|
|
259
|
+
this.tableRef.nativeElement.focus();
|
|
260
|
+
}
|
|
261
|
+
async reloadGrid(additionalParams) {
|
|
262
|
+
try {
|
|
263
|
+
await this.resizeGrid();
|
|
264
|
+
await this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRID");
|
|
265
|
+
this.requestModel.url = this.gridOptions.getUrl;
|
|
266
|
+
this.requestModel.httpHeaders = this.gridOptions.httpHeaders;
|
|
267
|
+
this.requestModel.additionalParams = additionalParams;
|
|
268
|
+
this.requestModel.page = this.currentPage;
|
|
269
|
+
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
270
|
+
let responseModel = await this.reload(this.requestModel);
|
|
271
|
+
this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRID");
|
|
272
|
+
return Promise.resolve(responseModel);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
console.error(error);
|
|
276
|
+
return Promise.reject(error);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
async reloadGridWithRequestModel(requestModel) {
|
|
280
|
+
try {
|
|
281
|
+
await this.resizeGrid();
|
|
282
|
+
await this.functionLockService.lock("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
|
|
283
|
+
this.requestModel = requestModel;
|
|
284
|
+
this.currentPage = 1;
|
|
285
|
+
this.requestModel.page = 1;
|
|
286
|
+
let responseModel = await this.reload(this.requestModel);
|
|
287
|
+
this.functionLockService.release("GRID_" + this.uuid + "_RELOADGRIDWITHREQUESTMODEL");
|
|
288
|
+
return Promise.resolve(responseModel);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
console.error(error);
|
|
292
|
+
return Promise.reject(error);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async reload(requestModel) {
|
|
296
|
+
try {
|
|
297
|
+
await this.functionLockService.lock("GRID_" + this.uuid + "_RELOAD");
|
|
298
|
+
requestModel = this.getRequestModel(this.requestModel);
|
|
299
|
+
let responseModel = null;
|
|
300
|
+
if (requestModel.url)
|
|
301
|
+
responseModel = await this.gridService.getDataFromServer(requestModel);
|
|
302
|
+
else
|
|
303
|
+
responseModel = await this.gridService.getDataFromDataObj(requestModel, this.data);
|
|
304
|
+
this.loaded = true;
|
|
305
|
+
this.totalRecords = responseModel.totalRecords;
|
|
306
|
+
this.visibleData = responseModel.data;
|
|
307
|
+
this.functionLockService.release("GRID_" + this.uuid + "_RELOAD");
|
|
308
|
+
Promise.resolve(responseModel);
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
console.error(error);
|
|
312
|
+
return Promise.reject(error);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
unselectRow() {
|
|
316
|
+
this.selectedIndex = null;
|
|
317
|
+
}
|
|
318
|
+
selectRow(rowNumber) {
|
|
319
|
+
let rowData = this.visibleData[rowNumber];
|
|
320
|
+
this.onRowClicked(rowData, rowNumber);
|
|
321
|
+
}
|
|
322
|
+
getColumnHTML(rowData, dataFieldName) {
|
|
323
|
+
const columnHTML = SlickUtilsService.getDeepObject(rowData, dataFieldName);
|
|
324
|
+
if (columnHTML === null || columnHTML === undefined)
|
|
325
|
+
return '';
|
|
326
|
+
return columnHTML.toString();
|
|
327
|
+
}
|
|
328
|
+
async sortBy(sortColumn) {
|
|
329
|
+
this.gridOptions.columns.forEach(c => {
|
|
330
|
+
if (sortColumn && c.columnKey !== sortColumn.columnKey) {
|
|
331
|
+
c.sortDirection = SlickGridColumnSortDirection.none;
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
if (sortColumn) {
|
|
335
|
+
if (sortColumn.sortDirection === SlickGridColumnSortDirection.none) {
|
|
336
|
+
this.visibleColumns.forEach(c => c.sortDirection = SlickGridColumnSortDirection.none);
|
|
337
|
+
sortColumn.sortDirection = SlickGridColumnSortDirection.asc;
|
|
338
|
+
}
|
|
339
|
+
else if (sortColumn.sortDirection === SlickGridColumnSortDirection.asc)
|
|
340
|
+
sortColumn.sortDirection = SlickGridColumnSortDirection.desc;
|
|
341
|
+
else {
|
|
342
|
+
sortColumn.sortDirection = SlickGridColumnSortDirection.none;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
this.saveColumnsToLocalStorage();
|
|
346
|
+
this.currentPage = 1;
|
|
347
|
+
this.requestModel.page = 1;
|
|
348
|
+
await this.reload(this.requestModel);
|
|
349
|
+
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
350
|
+
this.selectRow(0);
|
|
351
|
+
}
|
|
352
|
+
async onSearchSelect(ddValue, column) {
|
|
353
|
+
if (!this.requestModel.columnSearchValues)
|
|
354
|
+
this.requestModel.columnSearchValues = [];
|
|
355
|
+
let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
|
|
356
|
+
if (columnSearchValueIdx >= 0)
|
|
357
|
+
this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
|
|
358
|
+
column.isFiltering = false;
|
|
359
|
+
if (ddValue) {
|
|
360
|
+
this.requestModel.columnSearchValues.push({
|
|
361
|
+
columnName: column.dataFieldName,
|
|
362
|
+
searchValueId: ddValue.id,
|
|
363
|
+
searchValueText: ddValue.text
|
|
364
|
+
});
|
|
365
|
+
column.isFiltering = true;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
column.isLocked = false;
|
|
369
|
+
}
|
|
370
|
+
this.currentPage = 1;
|
|
371
|
+
this.requestModel.page = 1;
|
|
372
|
+
await this.reload(this.requestModel);
|
|
373
|
+
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
374
|
+
this.selectRow(0);
|
|
375
|
+
}
|
|
376
|
+
async onSearch(column) {
|
|
377
|
+
await SlickSleepService.sleep();
|
|
378
|
+
if (!this.requestModel.columnSearchValues)
|
|
379
|
+
this.requestModel.columnSearchValues = [];
|
|
380
|
+
if (column.filterText === column.lastSearchText)
|
|
381
|
+
return;
|
|
382
|
+
column.lastSearchText = column.filterText;
|
|
383
|
+
column.isFiltering = !!column.filterText;
|
|
384
|
+
if (!column.isFiltering)
|
|
385
|
+
column.isLocked = false;
|
|
386
|
+
clearTimeout(this.searchTimeout);
|
|
387
|
+
this.searchTimeout = setTimeout(async () => {
|
|
388
|
+
this.saveColumnsToLocalStorage();
|
|
389
|
+
let columnSearchValueIdx = this.requestModel.columnSearchValues.findIndex(x => x.columnName === column.dataFieldName);
|
|
390
|
+
if (columnSearchValueIdx >= 0)
|
|
391
|
+
this.requestModel.columnSearchValues.splice(columnSearchValueIdx, 1);
|
|
392
|
+
if (column.filterText) {
|
|
393
|
+
this.requestModel.columnSearchValues.push({
|
|
394
|
+
columnName: column.dataFieldName,
|
|
395
|
+
searchValueText: column.filterText
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
this.currentPage = 1;
|
|
399
|
+
this.requestModel.page = 1;
|
|
400
|
+
await this.reload(this.requestModel);
|
|
401
|
+
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
402
|
+
this.selectRow(0);
|
|
403
|
+
}, 250);
|
|
404
|
+
}
|
|
405
|
+
toggleLock(column) {
|
|
406
|
+
column.isLocked = !column.isLocked;
|
|
407
|
+
this.saveColumnsToLocalStorage();
|
|
408
|
+
}
|
|
409
|
+
async resetFilter(column) {
|
|
410
|
+
column.isFiltering = false;
|
|
411
|
+
column.isLocked = false;
|
|
412
|
+
column.filterText = null;
|
|
413
|
+
column.lastSearchText = null;
|
|
414
|
+
column.filterDropdownValue = null;
|
|
415
|
+
this.requestModel.columnSearchValues = this.requestModel.columnSearchValues.filter(x => x.columnName !== column.dataFieldName);
|
|
416
|
+
this.saveColumnsToLocalStorage();
|
|
417
|
+
this.currentPage = 1;
|
|
418
|
+
this.requestModel.page = 1;
|
|
419
|
+
await this.reload(this.requestModel);
|
|
420
|
+
if (this.visibleData && this.visibleData.length > 0 && this.gridOptions.autoSelectFirstRow === true)
|
|
421
|
+
this.selectRow(0);
|
|
422
|
+
}
|
|
423
|
+
openColumnSelectDialog() {
|
|
424
|
+
this.columnSelectDialogColumns = [...this.gridOptions.columns];
|
|
425
|
+
this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
426
|
+
this.columnSelectDialogRef.showDialog();
|
|
427
|
+
}
|
|
428
|
+
onColumnDrop(e) {
|
|
429
|
+
console.log(e);
|
|
430
|
+
}
|
|
431
|
+
async onColumnReorder(e) {
|
|
432
|
+
const oldOrder = e[0];
|
|
433
|
+
const newOrder = e[1];
|
|
434
|
+
if (oldOrder === newOrder)
|
|
435
|
+
return;
|
|
436
|
+
const selectedCol = this.columnSelectDialogColumns.splice(oldOrder, 1)[0];
|
|
437
|
+
selectedCol.displayOrder = newOrder;
|
|
438
|
+
let currentOrder = 0;
|
|
439
|
+
// Everything up to the new order reordered from 0
|
|
440
|
+
for (let i = 0; i < this.columnSelectDialogColumns.length; i++) {
|
|
441
|
+
// If we're at newOrder, leave a spot
|
|
442
|
+
if (i === newOrder)
|
|
443
|
+
currentOrder++;
|
|
444
|
+
this.columnSelectDialogColumns[i].displayOrder = currentOrder++;
|
|
445
|
+
}
|
|
446
|
+
this.columnSelectDialogColumns = [...this.columnSelectDialogColumns, selectedCol];
|
|
447
|
+
this.columnSelectDialogColumns = this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
448
|
+
}
|
|
449
|
+
async addNewFavorite() {
|
|
450
|
+
this.newFavoriteText = '';
|
|
451
|
+
const confirmResult = await this.addNewFavoriteDialogRef.confirm();
|
|
452
|
+
if (confirmResult === SlickConfirmDialogResults.Ok && this.newFavoriteText) {
|
|
453
|
+
// Save the previous selection to localstorage
|
|
454
|
+
this.saveDialogColumnsToLocalStorage();
|
|
455
|
+
this.favorites.push(new DropDownModel(this.newFavoriteText));
|
|
456
|
+
this.selectedFavorite = this.newFavoriteText;
|
|
457
|
+
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
|
|
458
|
+
const favoritesJson = JSON.stringify(this.favorites.map(x => x.text));
|
|
459
|
+
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES", favoritesJson);
|
|
460
|
+
// Save the new one to localstorage
|
|
461
|
+
this.saveDialogColumnsToLocalStorage();
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
loadFavorite(favorite) {
|
|
465
|
+
this.saveDialogColumnsToLocalStorage();
|
|
466
|
+
this.selectedFavorite = favorite.text;
|
|
467
|
+
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
|
|
468
|
+
if (gridColumnsJson) {
|
|
469
|
+
this.columnSelectDialogColumns = JSON.parse(gridColumnsJson);
|
|
470
|
+
this.columnSelectDialogColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
async setFavorite(favorite) {
|
|
474
|
+
this.selectedFavorite = favorite;
|
|
475
|
+
localStorage.setItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE", this.selectedFavorite);
|
|
476
|
+
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${this.selectedFavorite === 'Default' ? '' : '_' + this.selectedFavorite}`);
|
|
477
|
+
this.gridOptions.columns = JSON.parse(gridColumnsJson);
|
|
478
|
+
this.gridOptions.columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
479
|
+
this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
|
|
480
|
+
this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
481
|
+
this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
|
|
482
|
+
this.currentPage = 1;
|
|
483
|
+
this.requestModel.page = 1;
|
|
484
|
+
this.requestModel.recordsPerPage = this.recordsPerPage;
|
|
485
|
+
await this.reload(this.requestModel);
|
|
486
|
+
}
|
|
487
|
+
onSaveColumns() {
|
|
488
|
+
this.saveDialogColumnsToLocalStorage();
|
|
489
|
+
this.gridOptions.columns = [...this.columnSelectDialogColumns];
|
|
490
|
+
// Make sure if they've hidden a column that we aren't trying to sort or filter by this column
|
|
491
|
+
this.gridOptions.columns.forEach(x => {
|
|
492
|
+
if (x.visible === false) {
|
|
493
|
+
x.filterDropdownValue = null;
|
|
494
|
+
x.filterText = null;
|
|
495
|
+
x.isFiltering = false;
|
|
496
|
+
x.isLocked = false;
|
|
497
|
+
x.lastSearchText = null;
|
|
498
|
+
x.sortDirection = null;
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
|
|
502
|
+
this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
503
|
+
this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
|
|
504
|
+
this.columnSelectDialogRef.hideDialog();
|
|
505
|
+
this.resizeGrid();
|
|
506
|
+
if (this.onFavoritesModified) {
|
|
507
|
+
const gridFavorites = this.favorites.map(favorite => {
|
|
508
|
+
const gridFavorite = new SlickGridFavoriteModel();
|
|
509
|
+
gridFavorite.favoriteName = favorite.text;
|
|
510
|
+
const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
|
|
511
|
+
const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
512
|
+
gridFavorite.columns = JSON.parse(dialogColumnsJSON);
|
|
513
|
+
return gridFavorite;
|
|
514
|
+
});
|
|
515
|
+
this.onFavoritesModified.emit(gridFavorites);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
onCancelColumns() {
|
|
519
|
+
this.columnSelectDialogRef.hideDialog();
|
|
520
|
+
}
|
|
521
|
+
saveDialogColumnsToLocalStorage() {
|
|
522
|
+
let dialogColumnsJSON = JSON.stringify(this.columnSelectDialogColumns);
|
|
523
|
+
if (this.gridOptions.gridKey) {
|
|
524
|
+
const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
|
|
525
|
+
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, dialogColumnsJSON);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
saveColumnsToLocalStorage() {
|
|
529
|
+
let gridColumnsJSON = JSON.stringify(this.gridOptions.columns);
|
|
530
|
+
if (this.gridOptions.gridKey) {
|
|
531
|
+
const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
|
|
532
|
+
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
533
|
+
if (gridColumnsJson) {
|
|
534
|
+
let columns = JSON.parse(gridColumnsJson);
|
|
535
|
+
let displayOrder = 0;
|
|
536
|
+
columns.forEach(c => {
|
|
537
|
+
let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
|
|
538
|
+
if (column) {
|
|
539
|
+
c.displayOrder = displayOrder;
|
|
540
|
+
c.titleOrientation = column.titleOrientation;
|
|
541
|
+
c.titleHeight = column.titleHeight;
|
|
542
|
+
c.width = column.width;
|
|
543
|
+
c.filterDropdownValue = column.filterDropdownValue;
|
|
544
|
+
c.filterText = column.filterText;
|
|
545
|
+
c.isLocked = column.isLocked;
|
|
546
|
+
c.isFiltering = column.isFiltering;
|
|
547
|
+
c.sortDirection = column.sortDirection;
|
|
548
|
+
}
|
|
549
|
+
displayOrder++;
|
|
550
|
+
});
|
|
551
|
+
columns = columns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
552
|
+
gridColumnsJSON = JSON.stringify(columns);
|
|
553
|
+
}
|
|
554
|
+
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
|
|
555
|
+
}
|
|
556
|
+
if (this.onFavoritesModified) {
|
|
557
|
+
const gridFavorites = this.favorites.map(favorite => {
|
|
558
|
+
const gridFavorite = new SlickGridFavoriteModel();
|
|
559
|
+
gridFavorite.favoriteName = favorite.text;
|
|
560
|
+
const suffix = gridFavorite.favoriteName === 'Default' ? '' : ('_' + gridFavorite.favoriteName);
|
|
561
|
+
const dialogColumnsJSON = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
562
|
+
gridFavorite.columns = JSON.parse(dialogColumnsJSON);
|
|
563
|
+
return gridFavorite;
|
|
564
|
+
});
|
|
565
|
+
this.onFavoritesModified.emit(gridFavorites);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
async resizeGrid(forceRefresh = false) {
|
|
569
|
+
return new Promise(async (resolve) => {
|
|
570
|
+
if (!forceRefresh && this.slickGridRef.nativeElement.offsetHeight === this.slickGridHeight) {
|
|
571
|
+
resolve();
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
if (this.recordsPerPageValue === 'Auto') {
|
|
575
|
+
await this.functionLockService.lock("GRID_" + this.uuid + "_RESIZEGRID");
|
|
576
|
+
this.slickGridHeight = this.tableContainerRef.nativeElement.offsetHeight;
|
|
577
|
+
const testRow = this.tableRef.nativeElement.insertRow(0);
|
|
578
|
+
const testCell = testRow.insertCell(0);
|
|
579
|
+
testCell.style.visibility = "hidden";
|
|
580
|
+
testCell.innerHTML = "&NBSP";
|
|
581
|
+
const rowHeight = testCell.offsetHeight;
|
|
582
|
+
this.tableRef.nativeElement.deleteRow(0);
|
|
583
|
+
let headerHeight = this.tableHeaderRowRef.nativeElement.offsetHeight + 2;
|
|
584
|
+
if (this.tableHeaderSearchRowRef)
|
|
585
|
+
headerHeight += this.tableHeaderSearchRowRef.nativeElement.offsetHeight + 2;
|
|
586
|
+
const clientHeight = this.tableContainerRef.nativeElement.offsetHeight - headerHeight;
|
|
587
|
+
this.recordsPerPage = parseInt(((clientHeight / rowHeight) - 1).toFixed(0));
|
|
588
|
+
let actualRowHeight = parseInt((clientHeight / this.recordsPerPage).toFixed(0)) - 1;
|
|
589
|
+
if (actualRowHeight < rowHeight)
|
|
590
|
+
actualRowHeight = rowHeight;
|
|
591
|
+
const allRows = this.slickGridRef.nativeElement.querySelectorAll(".table tbody tr");
|
|
592
|
+
allRows.forEach(row => {
|
|
593
|
+
row.style.height = (actualRowHeight) + "px";
|
|
594
|
+
});
|
|
595
|
+
this.functionLockService.release("GRID_" + this.uuid + "_RESIZEGRID");
|
|
596
|
+
this.gridOpacity = 1;
|
|
597
|
+
this.showTestRow = false;
|
|
598
|
+
resolve();
|
|
599
|
+
}
|
|
600
|
+
else {
|
|
601
|
+
await SlickSleepService.sleep();
|
|
602
|
+
this.recordsPerPage = parseInt(this.recordsPerPageValue);
|
|
603
|
+
this.gridOpacity = 1;
|
|
604
|
+
resolve();
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
addColumn(column, idx = null) {
|
|
609
|
+
if (idx === null)
|
|
610
|
+
this.gridOptions.columns.push(column);
|
|
611
|
+
else
|
|
612
|
+
this.gridOptions.columns.splice(idx, 0, column);
|
|
613
|
+
this.setGridOptions(this.gridOptions);
|
|
614
|
+
}
|
|
615
|
+
getRequestModel(requestModel = null) {
|
|
616
|
+
if (!requestModel)
|
|
617
|
+
requestModel = this.requestModel;
|
|
618
|
+
requestModel.columnSearchValues = [];
|
|
619
|
+
this.gridOptions.columns.forEach(c => {
|
|
620
|
+
if (c.visible) {
|
|
621
|
+
if (c.filterType === SlickGridColumnFilterTypes.text && c.filterText) {
|
|
622
|
+
c.filterText = c.filterText;
|
|
623
|
+
requestModel.columnSearchValues.push({
|
|
624
|
+
columnName: c.dataFieldName,
|
|
625
|
+
searchValueId: null,
|
|
626
|
+
searchValueText: c.filterText
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
else if (c.filterType === SlickGridColumnFilterTypes.dropdown && c.filterDropdownValue) {
|
|
630
|
+
c.filterDropdownValue = c.filterDropdownValue;
|
|
631
|
+
requestModel.columnSearchValues.push({
|
|
632
|
+
columnName: c.dataFieldName,
|
|
633
|
+
searchValueId: c.filterDropdownValue,
|
|
634
|
+
searchValueText: null
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
requestModel.sortColumn = null;
|
|
640
|
+
const sortColumn = this.gridOptions.columns.find(x => x.sortDirection === SlickGridColumnSortDirection.asc || x.sortDirection === SlickGridColumnSortDirection.desc);
|
|
641
|
+
if (sortColumn) {
|
|
642
|
+
requestModel.sortColumn = (sortColumn.sortDirection === 0) ? null : sortColumn.dataFieldName;
|
|
643
|
+
requestModel.sortDirection = sortColumn.sortDirection;
|
|
644
|
+
}
|
|
645
|
+
if (requestModel.recordsPerPage <= 0)
|
|
646
|
+
requestModel.recordsPerPage = 20;
|
|
647
|
+
return this.requestModel;
|
|
648
|
+
}
|
|
649
|
+
setGridOptions(gridOptions) {
|
|
650
|
+
this.gridOptions = gridOptions;
|
|
651
|
+
if (this.gridOptions.gridKey) {
|
|
652
|
+
if (this.gridOptions.favorites) {
|
|
653
|
+
const favoriteNames = this.gridOptions.favorites.map(f => f.favoriteName);
|
|
654
|
+
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_FAVORITES`, JSON.stringify(favoriteNames));
|
|
655
|
+
this.gridOptions.favorites.forEach(favorite => {
|
|
656
|
+
// Make sure we haven't added a new column that needs to be saved
|
|
657
|
+
this.gridOptions.columns.forEach(c => {
|
|
658
|
+
const columnExists = favorite.columns.findIndex(x => x.dataFieldName === c.dataFieldName);
|
|
659
|
+
if (columnExists < 0)
|
|
660
|
+
favorite.columns.push(c);
|
|
661
|
+
});
|
|
662
|
+
let gridColumnsJSON = JSON.stringify(favorite.columns);
|
|
663
|
+
if (this.gridOptions.gridKey) {
|
|
664
|
+
const suffix = favorite.favoriteName === 'Default' ? '' : ('_' + favorite.favoriteName);
|
|
665
|
+
localStorage.setItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`, gridColumnsJSON);
|
|
666
|
+
}
|
|
667
|
+
});
|
|
668
|
+
if (favoriteNames.indexOf(this.selectedFavorite) < 0)
|
|
669
|
+
this.selectedFavorite = "Default";
|
|
670
|
+
}
|
|
671
|
+
this.selectedFavorite = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_SELECTED_FAVORITE") || 'Default';
|
|
672
|
+
// Check to make sure we don't have any duplicate column names
|
|
673
|
+
this.gridOptions.columns.forEach(c1 => {
|
|
674
|
+
const dataFieldCount = (this.gridOptions.columns.filter(x => x.dataFieldName === c1.dataFieldName) || []).length;
|
|
675
|
+
if (dataFieldCount > 1)
|
|
676
|
+
console.error(`Grid ${this.gridOptions.gridKey} column ${c1.dataFieldName} is defined ${dataFieldCount} times`);
|
|
677
|
+
});
|
|
678
|
+
const suffix = this.selectedFavorite === 'Default' ? '' : ('_' + this.selectedFavorite);
|
|
679
|
+
let gridColumnsJson = localStorage.getItem(`GRID_${this.gridOptions.gridKey}_COLUMNS${suffix}`);
|
|
680
|
+
if (gridColumnsJson) {
|
|
681
|
+
let columns = JSON.parse(gridColumnsJson);
|
|
682
|
+
let displayOrder = 0;
|
|
683
|
+
columns.forEach(c => {
|
|
684
|
+
let column = this.gridOptions.columns.find(gridColumn => gridColumn.dataFieldName === c.dataFieldName);
|
|
685
|
+
if (column) {
|
|
686
|
+
column.visible = c.visible;
|
|
687
|
+
column.displayOrder = displayOrder;
|
|
688
|
+
column.titleOrientation = c.titleOrientation;
|
|
689
|
+
column.titleHeight = c.titleHeight;
|
|
690
|
+
column.width = c.width;
|
|
691
|
+
column.flexible = c.flexible;
|
|
692
|
+
column.sortDirection = c.sortDirection;
|
|
693
|
+
column.isLocked = c.isLocked;
|
|
694
|
+
//column.filterType = c.filterType;
|
|
695
|
+
if (column.isLocked && column.filterType !== SlickGridColumnFilterTypes.none) {
|
|
696
|
+
column.isFiltering = true;
|
|
697
|
+
if (column.filterType === SlickGridColumnFilterTypes.text)
|
|
698
|
+
column.filterText = c.filterText;
|
|
699
|
+
else if (column.filterType === SlickGridColumnFilterTypes.dropdown)
|
|
700
|
+
column.filterDropdownValue = c.filterDropdownValue;
|
|
701
|
+
if (!column.filterText && !column.filterDropdownValue) {
|
|
702
|
+
column.isFiltering = false;
|
|
703
|
+
column.isLocked = false;
|
|
704
|
+
column.filterText = null;
|
|
705
|
+
column.filterDropdownValue = null;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
displayOrder++;
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
if (this.gridOptions.defaultRecordsPerPage && !localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE"))
|
|
713
|
+
this.recordsPerPageValue = this.gridOptions.defaultRecordsPerPage.toString();
|
|
714
|
+
else
|
|
715
|
+
this.recordsPerPageValue = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_RECORDS_PER_PAGE") || "Auto";
|
|
716
|
+
const favoritesJson = localStorage.getItem("GRID_" + this.gridOptions.gridKey + "_FAVORITES") || `["Default"]`;
|
|
717
|
+
this.favorites = JSON.parse(favoritesJson).map(favorite => {
|
|
718
|
+
return new DropDownModel(favorite);
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
this.visibleColumns = this.gridOptions.columns.filter(c => c.visible === true);
|
|
722
|
+
this.visibleColumns = this.visibleColumns.sort((a, b) => (a.displayOrder > b.displayOrder) ? 1 : (a.displayOrder < b.displayOrder) ? -1 : 0);
|
|
723
|
+
this.showSearchRow = this.visibleColumns.filter(c => c.filterType !== SlickGridColumnFilterTypes.none).length > 0;
|
|
724
|
+
let sortColumn = this.visibleColumns.find(c => c.sortable === true && c.sortDirection > 0);
|
|
725
|
+
if (this.visibleColumns.length > 0 && sortColumn) {
|
|
726
|
+
this.requestModel.sortColumn = sortColumn.dataFieldName;
|
|
727
|
+
this.requestModel.sortDirection = sortColumn.sortDirection;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
/** @nocollapse */ SlickGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickGridComponent, deps: [{ token: i1.SlickGridService }, { token: i2.SlickFunctionLockService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
732
|
+
/** @nocollapse */ SlickGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: SlickGridComponent, selector: "slick-grid", inputs: { gridOptions: "gridOptions", bordered: "bordered", striped: "striped", hover: "hover", showingAllRecords: "showingAllRecords", data: "data" }, outputs: { onRowSelected: "onRowSelected", onRowDoubleClick: "onRowDoubleClick", onRowContextMenu: "onRowContextMenu", onFavoritesModified: "onFavoritesModified" }, host: { listeners: { "window:resize": "onResize($event,$event.target)" }, properties: { "class": "this.flexColumn" } }, providers: [SlickGridService], queries: [{ propertyName: "slickGridColumnTemplates", predicate: SlickGridColumnTemplateDirective }], viewQueries: [{ propertyName: "slickGridRef", first: true, predicate: ["slickGrid"], descendants: true, static: true }, { propertyName: "tableContainerRef", first: true, predicate: ["tableContainer"], descendants: true }, { propertyName: "tableRef", first: true, predicate: ["tableRef"], descendants: true }, { propertyName: "tableHeaderRowRef", first: true, predicate: ["tableHeaderRow"], descendants: true }, { propertyName: "tableHeaderSearchRowRef", first: true, predicate: ["tableHeaderSearchRow"], descendants: true }, { propertyName: "testRowRef", first: true, predicate: ["testRow"], descendants: true }, { propertyName: "tableBodyRowsRef", first: true, predicate: ["tableBodyRows"], descendants: true }, { propertyName: "columnSelectDialogRef", first: true, predicate: ["columnSelectDialogRef"], descendants: true }, { propertyName: "addNewFavoriteDialogRef", first: true, predicate: ["addNewFavoriteDialogRef"], descendants: true }], usesOnChanges: true, ngImport: i0, 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>", components: [{ type: i3.SlickDropDownComponent, selector: "slick-drop-down", inputs: ["placeholder", "items", "idFieldName", "textFieldName", "compact", "disabled", "allowEmpty", "getUrl", "width", "listWidth", "height", "showLoadingMessage", "showDebug", "tabindex", "validationIndicator", "validationIndicatorType", "attachTo", "searchType", "appendButtons", "prependButtons", "isMobile", "cssClass"], outputs: ["onExpand", "onSelect", "onChange"] }, { type: i4.SlickPopoverComponent, selector: "slick-popover", inputs: ["element", "position", "hoverDelay", "outDelay", "alignment", "topOffsetPx", "leftOffsetPx", "whiteBackground", "showByClick", "showArrow"] }, { type: i5.SlickPagingComponent, selector: "slick-paging", inputs: ["pageNumber", "totalRecords", "recordsPerPage"], outputs: ["pageNumberChange", "onPageChange"] }, { type: i6.SlickDialogComponent, selector: "slick-dialog", inputs: ["draggable", "resizable", "minimizable", "header", "showHeader", "noPadding", "top", "width", "height", "maxHeight", "cssClass", "key", "showOverlay", "disableScrollbar"], outputs: ["onClose"] }, { type: i7.SlickDialogFooterComponent, selector: "slick-dialog-footer" }, { type: i8.SlickConfirmDialogComponent, selector: "slick-confirm-dialog", inputs: ["width", "okButtonText", "cancelButtonText", "showOkButton", "showCancelButton"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i11.SlickDropListDirective, selector: "[slick-drop-list]", outputs: ["onSlickDropListReorder", "onSlickDropListEnter", "onSlickDropListLeave"] }, { type: i12.SlickDropListItemDirective, selector: "[slick-drop-list-item]" }, { type: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i13.SlickDropListGrabDirective, selector: "[slick-drop-list-grab]" }], pipes: { "slickGridSanitizeHtml": i14.SlickGridSanitizeHtmlPipe } });
|
|
733
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: SlickGridComponent, decorators: [{
|
|
734
|
+
type: Component,
|
|
735
|
+
args: [{ selector: 'slick-grid', providers: [SlickGridService], 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>" }]
|
|
736
|
+
}], ctorParameters: function () { return [{ type: i1.SlickGridService }, { type: i2.SlickFunctionLockService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { flexColumn: [{
|
|
737
|
+
type: HostBinding,
|
|
738
|
+
args: ['class']
|
|
739
|
+
}], gridOptions: [{
|
|
740
|
+
type: Input
|
|
741
|
+
}], bordered: [{
|
|
742
|
+
type: Input
|
|
743
|
+
}], striped: [{
|
|
744
|
+
type: Input
|
|
745
|
+
}], hover: [{
|
|
746
|
+
type: Input
|
|
747
|
+
}], showingAllRecords: [{
|
|
748
|
+
type: Input
|
|
749
|
+
}], data: [{
|
|
750
|
+
type: Input
|
|
751
|
+
}], onRowSelected: [{
|
|
752
|
+
type: Output
|
|
753
|
+
}], onRowDoubleClick: [{
|
|
754
|
+
type: Output
|
|
755
|
+
}], onRowContextMenu: [{
|
|
756
|
+
type: Output
|
|
757
|
+
}], onFavoritesModified: [{
|
|
758
|
+
type: Output
|
|
759
|
+
}], slickGridRef: [{
|
|
760
|
+
type: ViewChild,
|
|
761
|
+
args: ["slickGrid", { static: true }]
|
|
762
|
+
}], tableContainerRef: [{
|
|
763
|
+
type: ViewChild,
|
|
764
|
+
args: ["tableContainer"]
|
|
765
|
+
}], tableRef: [{
|
|
766
|
+
type: ViewChild,
|
|
767
|
+
args: ["tableRef"]
|
|
768
|
+
}], tableHeaderRowRef: [{
|
|
769
|
+
type: ViewChild,
|
|
770
|
+
args: ["tableHeaderRow"]
|
|
771
|
+
}], tableHeaderSearchRowRef: [{
|
|
772
|
+
type: ViewChild,
|
|
773
|
+
args: ["tableHeaderSearchRow"]
|
|
774
|
+
}], testRowRef: [{
|
|
775
|
+
type: ViewChild,
|
|
776
|
+
args: ["testRow"]
|
|
777
|
+
}], tableBodyRowsRef: [{
|
|
778
|
+
type: ViewChild,
|
|
779
|
+
args: ["tableBodyRows"]
|
|
780
|
+
}], columnSelectDialogRef: [{
|
|
781
|
+
type: ViewChild,
|
|
782
|
+
args: ["columnSelectDialogRef"]
|
|
783
|
+
}], addNewFavoriteDialogRef: [{
|
|
784
|
+
type: ViewChild,
|
|
785
|
+
args: ["addNewFavoriteDialogRef"]
|
|
786
|
+
}], slickGridColumnTemplates: [{
|
|
787
|
+
type: ContentChildren,
|
|
788
|
+
args: [SlickGridColumnTemplateDirective]
|
|
789
|
+
}], onResize: [{
|
|
790
|
+
type: HostListener,
|
|
791
|
+
args: ['window:resize', ['$event', '$event.target']]
|
|
792
|
+
}] } });
|
|
793
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9zbGljay1ncmlkL3NsaWNrLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvc2xpY2stZ3JpZC9zbGljay1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBMEUsZUFBZSxFQUFhLFdBQVcsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcE8sT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUF5QiwwQkFBMEIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVILE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSw0QkFBNEIsQ0FBQztBQUdqRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQStCLHlCQUF5QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0gsT0FBTyxFQUEyQixzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBRTlGLE1BQU0sYUFBYTtJQUNsQixZQUFZLElBQVk7UUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0NBSUQ7QUFPRCxNQUFNLE9BQU8sa0JBQWtCO0lBOEU5QixZQUFv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QUEvQixTQUFTO3VCQUFDLFNBQVM7Z0JBQ1EsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1UscUJBQXFCO3NCQUF4RCxTQUFTO3VCQUFDLHVCQUF1QjtnQkFDSSx1QkFBdUI7c0JBQTVELFNBQVM7dUJBQUMseUJBQXlCO2dCQUVlLHdCQUF3QjtzQkFBMUUsZUFBZTt1QkFBQyxnQ0FBZ0M7Z0JBbUMzQyxRQUFRO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEhvc3RCaW5kaW5nLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWNrR3JpZFNlcnZpY2UgfSBmcm9tIFwiLi9zbGljay1ncmlkLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVNsaWNrR3JpZENvbHVtbk1vZGVsLCBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcywgU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbiB9IGZyb20gXCIuL3NsaWNrLWdyaWQtY29sdW1uLm1vZGVsXCI7XHJcbmltcG9ydCB7IElTbGlja0dyaWRPcHRpb25zIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC5vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCwgSVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbCB9IGZyb20gXCIuL3NsaWNrLWdyaWQtcmVxdWVzdC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRSZXNwb25zZU1vZGVsIH0gZnJvbSBcIi4vc2xpY2stZ3JpZC1yZXNwb25zZS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9zbGljay1kaWFsb2cvc2xpY2stZGlhbG9nLm1vZHVsZVwiO1xyXG5pbXBvcnQgeyBTbGlja1NsZWVwU2VydmljZSB9IGZyb20gXCIuLi91dGlscy9zbGljay1zbGVlcC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNsaWNrVXRpbHNTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLXV0aWxzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2xpY2tGdW5jdGlvbkxvY2tTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzL3NsaWNrLWZ1bmN0aW9uLWxvY2suc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlja0dyaWRDb2x1bW5UZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL3NsaWNrLWdyaWQtY29sdW1uLXRlbXBsYXRlLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBTbGlja0NvbmZpcm1EaWFsb2dDb21wb25lbnQsIFNsaWNrQ29uZmlybURpYWxvZ1Jlc3VsdHMgfSBmcm9tICcuLi9zbGljay1jb25maXJtLWRpYWxvZy9zbGljay1jb25maXJtLWRpYWxvZy5tb2R1bGUnO1xyXG5pbXBvcnQgeyBJU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCwgU2xpY2tHcmlkRmF2b3JpdGVNb2RlbCB9IGZyb20gJy4vc2xpY2stZ3JpZC1mYXZvcml0ZS5tb2RlbCc7XHJcblxyXG5jbGFzcyBEcm9wRG93bk1vZGVsIHtcclxuXHRjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuaWQgPSB0ZXh0O1xyXG5cdFx0dGhpcy50ZXh0ID0gdGV4dDtcclxuXHR9XHJcblxyXG5cdGlkOiBzdHJpbmc7XHJcblx0dGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ3NsaWNrLWdyaWQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnc2xpY2stZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcblx0cHJvdmlkZXJzOiBbU2xpY2tHcmlkU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsaWNrR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MnKSBmbGV4Q29sdW1uID0gJ3NsaWNrLWZsZXgtY29sdW1uJztcclxuXHQvL0BIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzcyA9ICdkLWZsZXggZmxleC1jb2x1bW4gZmxleC1maWxsJztcclxuXHJcblx0QElucHV0KCkgZ3JpZE9wdGlvbnM6IElTbGlja0dyaWRPcHRpb25zO1xyXG5cdEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHRASW5wdXQoKSBzdHJpcGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHRASW5wdXQoKSBob3ZlcjogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgc2hvd2luZ0FsbFJlY29yZHMgPSBmYWxzZTtcclxuXHRASW5wdXQoKSBkYXRhOiBhbnlbXTtcclxuXHRAT3V0cHV0KCkgb25Sb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25Sb3dEb3VibGVDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25Sb3dDb250ZXh0TWVudTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHRAT3V0cHV0KCkgb25GYXZvcml0ZXNNb2RpZmllZDogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcblx0QFZpZXdDaGlsZChcInNsaWNrR3JpZFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlja0dyaWRSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlQ29udGFpbmVyXCIpIHRhYmxlQ29udGFpbmVyUmVmOiBFbGVtZW50UmVmO1xyXG5cdEBWaWV3Q2hpbGQoXCJ0YWJsZVJlZlwiKSB0YWJsZVJlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwidGFibGVIZWFkZXJSb3dcIikgdGFibGVIZWFkZXJSb3dSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlSGVhZGVyU2VhcmNoUm93XCIpIHRhYmxlSGVhZGVyU2VhcmNoUm93UmVmOiBFbGVtZW50UmVmO1xyXG5cdC8vIFRoaXMgaXMgdG8gdGVzdCBob3cgaGlnaCBhIHN0YW5kYXJkIHJvdyBpc1xyXG5cdEBWaWV3Q2hpbGQoXCJ0ZXN0Um93XCIpIHRlc3RSb3dSZWY6IEVsZW1lbnRSZWY7XHJcblx0QFZpZXdDaGlsZChcInRhYmxlQm9keVJvd3NcIikgdGFibGVCb2R5Um93c1JlZjogRWxlbWVudFJlZjtcclxuXHRAVmlld0NoaWxkKFwiY29sdW1uU2VsZWN0RGlhbG9nUmVmXCIpIGNvbHVtblNlbGVjdERpYWxvZ1JlZjogU2xpY2tEaWFsb2dDb21wb25lbnQ7XHJcblx0QFZpZXdDaGlsZChcImFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmXCIpIGFkZE5ld0Zhdm9yaXRlRGlhbG9nUmVmOiBTbGlja0NvbmZpcm1EaWFsb2dDb21wb25lbnQ7XHJcblxyXG5cdEBDb250ZW50Q2hpbGRyZW4oU2xpY2tHcmlkQ29sdW1uVGVtcGxhdGVEaXJlY3RpdmUpIHNsaWNrR3JpZENvbHVtblRlbXBsYXRlczogUXVlcnlMaXN0PFNsaWNrR3JpZENvbHVtblRlbXBsYXRlRGlyZWN0aXZlPjtcclxuXHR0ZW1wbGF0ZVJlZnM6IGFueTtcclxuXHJcblx0cHJpdmF0ZSBmbk9uTW91c2VVcCA9IChlKSA9PiB0aGlzLm9uTW91c2VVcChlKTtcclxuXHJcblx0dXVpZDogc3RyaW5nO1xyXG5cdHNlbGVjdGVkSW5kZXg6IG51bWJlciA9IG51bGw7XHJcblx0Z3JpZE9wYWNpdHkgPSAwO1xyXG5cdHZpc2libGVDb2x1bW5zOiBJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXTtcclxuXHRmYXZvcml0ZXM6IERyb3BEb3duTW9kZWxbXTtcclxuXHRzZWxlY3RlZEZhdm9yaXRlOiBzdHJpbmc7XHJcblx0bmV3RmF2b3JpdGVUZXh0OiBzdHJpbmc7XHJcblx0Y29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uczogSVNsaWNrR3JpZENvbHVtbk1vZGVsW107XHJcblx0bG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblx0aXNEb3VibGVDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdGRvdWJsZUNsaWNrV2FpdFRpbWVvdXQ6IE5vZGVKUy5UaW1lcjtcclxuXHRjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcclxuXHRzZWFyY2hUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0a2V5cHJlc3NUaW1lb3V0OiBOb2RlSlMuVGltZXI7XHJcblx0c2hvd1Rlc3RSb3cgPSBmYWxzZTtcclxuXHRzaG93U2VhcmNoUm93ID0gZmFsc2U7XHJcblx0aXNSZXNpemluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHZpc2libGVEYXRhOiBhbnlbXSA9IFtdO1xyXG5cdHJlY29yZHNQZXJQYWdlOiBudW1iZXI7XHJcblx0dG90YWxSZWNvcmRzOiBudW1iZXI7XHJcblx0cmVjb3Jkc1BlclBhZ2VWYWx1ZTogc3RyaW5nID0gXCJBdXRvXCI7XHJcblxyXG5cdHByaXZhdGUgc2xpY2tHcmlkSGVpZ2h0OiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVUaW1lb3V0OiBOb2RlSlMuVGltZXIgPSBudWxsO1xyXG5cdHByaXZhdGUgcmVxdWVzdE1vZGVsOiBTbGlja0dyaWRSZXF1ZXN0TW9kZWw7XHJcblx0cHJpdmF0ZSByZXNpemVJbml0aWFsUG9zOiBudW1iZXI7XHJcblx0cHJpdmF0ZSByZXNpemVJbml0aWFsV2lkdGg6IG51bWJlcjtcclxuXHRwcml2YXRlIHJlc2l6ZUNvbElkeDogbnVtYmVyO1xyXG5cclxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnLCAnJGV2ZW50LnRhcmdldCddKVxyXG5cdGFzeW5jIG9uUmVzaXplKGV2ZW50OiBVSUV2ZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG5cdFx0Ly8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgZmlyZWZveCBzaG93cy9oaWRlcyB0aGUgbWVudSBpZiB5b3UgcHJlc3MgYWx0LiBEb24ndCByZWRyYXcgdGhlIGdyaWQgaWYgd2UncmVcclxuXHRcdC8vIGp1c3Qgc2hvd2luZyB0aGUgbWVudVxyXG5cdFx0aWYgKE1hdGguYWJzKHRoaXMuc2xpY2tHcmlkSGVpZ2h0IC0gdGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpIDwgNTApXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRpZiAodGhpcy5zbGlja0dyaWRIZWlnaHQgIT09IHRoaXMuc2xpY2tHcmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpO1xyXG5cdFx0XHR0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblx0XHRcdFx0dGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBncmlkU2VydmljZTogU2xpY2tHcmlkU2VydmljZSxcclxuXHRcdHByaXZhdGUgZnVuY3Rpb25Mb2NrU2VydmljZTogU2xpY2tGdW5jdGlvbkxvY2tTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuXHRcdHRoaXMudXVpZCA9IFNsaWNrVXRpbHNTZXJ2aWNlLm5ld0d1aWQoKTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsID0gbmV3IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cdFx0Ly8gQ29weSB0aGUgdGVtcGxhdGVzIHRvIGEgdmFyaWFibGUgdGhhdCB0aGUgaHRtbCBjYW4gYWNjZXNzLiAgSXQgY2FuJ3QgYWNjZXNzIGEgUXVlcnlMaXN0XHJcblx0XHR0aGlzLnRlbXBsYXRlUmVmcyA9IHt9O1xyXG5cdFx0dGhpcy5zbGlja0dyaWRDb2x1bW5UZW1wbGF0ZXMuZm9yRWFjaCh0ID0+IHtcclxuXHRcdFx0dGhpcy50ZW1wbGF0ZVJlZnNbdC5jb2x1bW5LZXldID0gdC50ZW1wbGF0ZTtcclxuXHRcdH0pO1xyXG5cdFx0aWYgKHRoaXMudGFibGVSZWYpXHJcblx0XHRcdCg8SFRNTFRhYmxlRWxlbWVudD50aGlzLnRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQpLmZvY3VzKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyB0YWJsZUtleWRvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG5cdFx0Ly8gS2V5IHVwXHJcblx0XHRpZiAoZS53aGljaCA9PT0gMzggJiYgISh0aGlzLnNlbGVjdGVkSW5kZXggPT09IDAgJiYgdGhpcy5jdXJyZW50UGFnZSA9PT0gMSkpIHtcclxuXHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMua2V5cHJlc3NUaW1lb3V0KTtcclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleC0tO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4IDwgMCkge1xyXG5cdFx0XHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlID4gMSkge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZS0tO1xyXG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIGZhbHNlKTtcclxuXHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMucmVjb3Jkc1BlclBhZ2UgLSAxO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5rZXlwcmVzc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHRcdH0sIDUwMCk7XHJcblx0XHR9XHJcblx0XHQvLyBLZXkgZG93blxyXG5cdFx0aWYgKGUud2hpY2ggPT09IDQwKSB7XHJcblx0XHRcdGlmICgoKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucmVjb3Jkc1BlclBhZ2UpICsgdGhpcy5zZWxlY3RlZEluZGV4ID49IHRoaXMudG90YWxSZWNvcmRzKVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdGNsZWFyVGltZW91dCh0aGlzLmtleXByZXNzVGltZW91dCk7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4ID49IHRoaXMucmVjb3Jkc1BlclBhZ2UpIHtcclxuXHRcdFx0XHRpZiAoKCh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJlY29yZHNQZXJQYWdlKSArIHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMudG90YWxSZWNvcmRzKSB7XHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlKys7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5vblBhZ2VDaGFuZ2UodGhpcy5jdXJyZW50UGFnZSwgZmFsc2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5rZXlwcmVzc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCByb3dEYXRhID0gdGhpcy52aXNpYmxlRGF0YVt0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG5cdFx0XHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHRcdH0sIDUwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcblx0XHRpZiAoY2hhbmdlcy5ib3JkZXJlZCkge1xyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ib3JkZXJlZCA9PT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmJvcmRlcmVkID0gKHRoaXMuYm9yZGVyZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnKSA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoY2hhbmdlcy5zdHJpcGVkKSB7XHJcblx0XHRcdC8vIFRoZSBncmlkIG9wdGlvbnMgb3ZlcnJpZGUgdGhlIHRhZyBvcHRpb25zXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQgPT09IG51bGwpXHJcblx0XHRcdFx0dGhpcy5zdHJpcGVkID0gKHRoaXMuc3RyaXBlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09ICdmYWxzZScpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmhvdmVyKSB7XHJcblx0XHRcdC8vIFRoZSBncmlkIG9wdGlvbnMgb3ZlcnJpZGUgdGhlIHRhZyBvcHRpb25zXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmhvdmVyID09PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuaG92ZXIgPSAodGhpcy5ob3Zlci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgIT09ICdmYWxzZScpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChjaGFuZ2VzLmdyaWRPcHRpb25zKSB7XHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmJvcmRlcmVkICE9PSBudWxsKVxyXG5cdFx0XHRcdHRoaXMuYm9yZGVyZWQgPSB0aGlzLmdyaWRPcHRpb25zLmJvcmRlcmVkO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JpZE9wdGlvbnMuc3RyaXBlZCAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLnN0cmlwZWQgPSB0aGlzLmdyaWRPcHRpb25zLnN0cmlwZWQ7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ob3ZlciAhPT0gbnVsbClcclxuXHRcdFx0XHR0aGlzLmhvdmVyID0gdGhpcy5ncmlkT3B0aW9ucy5ob3ZlcjtcclxuXHJcblx0XHRcdHRoaXMuc2V0R3JpZE9wdGlvbnModGhpcy5ncmlkT3B0aW9ucyk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGNoYW5nZXMuZGF0YSkge1xyXG5cdFx0XHQvLyBJZiB3ZSBkb24ndCBkbyB0aGlzIGxvY2ssIHRoZSBmaXJzdCBjaGFuZ2Ugd2lsbCBoYXZlIG51bGwgZGF0YSBhbmQgY3Jhc2guICBUaGUgc2Vjb25kIHJlcXVlc3Qgd2lsbCBoYXZlIHRoZSBhY3R1YWwgZGF0YVxyXG5cdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9EQVRBX0NIQU5HRVNcIik7XHJcblx0XHRcdC8vIE9ubHkgcmVzaXplIHRoZSBncmlkIG9uIHRoZSBmaXJzdCBjaGFuZ2UsIG90aGVyd2lzZSB3ZSBnZXQgYSBmbGlja2VyXHJcblx0XHRcdGlmIChjaGFuZ2VzLmRhdGEuZmlyc3RDaGFuZ2UgPT09IHRydWUpXHJcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJlc2l6ZSBpbiB0aGUgT25Jbml0IHRvIGZpbmlzaCBiZWZvcmUgd2UgY29udGludWVcclxuXHRcdFx0dGhpcy5sb2FkZWQgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwucGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRpZiAodGhpcy52aXNpYmxlRGF0YSAmJiB0aGlzLnZpc2libGVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkT3B0aW9ucy5hdXRvU2VsZWN0Rmlyc3RSb3cgPT09IHRydWUpXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RSb3coMCk7XHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX0RBVEFfQ0hBTkdFU1wiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25SZWNvcmRzUGVyUGFnZVNlbGVjdGVkKHJlY29yZHNQZXJQYWdlOiBzdHJpbmcpIHtcclxuXHRcdGlmICghcmVjb3Jkc1BlclBhZ2UpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUgPSByZWNvcmRzUGVyUGFnZTtcclxuXHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiR1JJRF9cIiArIHRoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleSArIFwiX1JFQ09SRFNfUEVSX1BBR0VcIiwgcmVjb3Jkc1BlclBhZ2UpO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZURhdGEgPSBbXTtcclxuXHRcdHRoaXMuZ3JpZE9wYWNpdHkgPSAwO1xyXG5cdFx0YXdhaXQgU2xpY2tTbGVlcFNlcnZpY2Uuc2xlZXAoKTtcclxuXHRcdGF3YWl0IHRoaXMucmVzaXplR3JpZCh0cnVlKTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdGF3YWl0IHRoaXMub25QYWdlQ2hhbmdlKHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVNb3VzZWRvd24oZTogTW91c2VFdmVudCwgY29sdW1uSWR4OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuaXNSZXNpemluZyA9IHRydWU7XHJcblx0XHR0aGlzLnJlc2l6ZUluaXRpYWxQb3MgPSBlLnBhZ2VYO1xyXG5cdFx0dGhpcy5yZXNpemVDb2xJZHggPSBjb2x1bW5JZHg7XHJcblx0XHRsZXQgY29sID0gKDxIVE1MVGFibGVSb3dFbGVtZW50PnRoaXMudGFibGVIZWFkZXJSb3dSZWYubmF0aXZlRWxlbWVudCkucXVlcnlTZWxlY3RvckFsbChcInRkXCIpLml0ZW0oY29sdW1uSWR4KTtcclxuXHRcdHRoaXMucmVzaXplSW5pdGlhbFdpZHRoID0gY29sLm9mZnNldFdpZHRoIC0gOTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zW2NvbHVtbklkeF0uZmxleGlibGUgPSBmYWxzZTtcclxuXHJcblx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5mbk9uTW91c2VVcCk7XHJcblx0fVxyXG5cclxuXHRvbkNvbFJlc2l6ZURvdWJsZWNsaWNrKGU6IE1vdXNlRXZlbnQsIGNvbHVtbklkeDogbnVtYmVyKSB7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zW2NvbHVtbklkeF0uZmxleGlibGUgPSB0cnVlO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1tjb2x1bW5JZHhdLndpZHRoID0gbnVsbDtcclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0b25Db2xSZXNpemVNb3VzZW1vdmUoZTogTW91c2VFdmVudCkge1xyXG5cdFx0aWYgKCF0aGlzLmlzUmVzaXppbmcpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRsZXQgbmV3Q3Vyc29yUG9zID0gZS5wYWdlWDtcclxuXHRcdGxldCBkaWZmID0gbmV3Q3Vyc29yUG9zIC0gdGhpcy5yZXNpemVJbml0aWFsUG9zO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0ud2lkdGggPSAodGhpcy5yZXNpemVJbml0aWFsV2lkdGggKyBkaWZmKSArIFwicHhcIjtcclxuXHRcdGlmICgodGhpcy5yZXNpemVJbml0aWFsV2lkdGggKyBkaWZmKSA8IDEwKVxyXG5cdFx0XHR0aGlzLnZpc2libGVDb2x1bW5zW3RoaXMucmVzaXplQ29sSWR4XS53aWR0aCA9IFwiMTBweFwiO1xyXG5cdFx0dGhpcy52aXNpYmxlQ29sdW1uc1t0aGlzLnJlc2l6ZUNvbElkeF0uZmxleGlibGUgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb25Nb3VzZVVwKGUpIHtcclxuXHRcdHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xyXG5cdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZm5Pbk1vdXNlVXApO1xyXG5cdFx0dGhpcy5zYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0fVxyXG5cclxuXHRnZXRWaXNpYmxlUmVjb3JkcygpIHtcclxuXHRcdHJldHVybiB0aGlzLnZpc2libGVEYXRhO1xyXG5cdH1cclxuXHJcblx0YWRkTmV3UmVjb3JkKG5ld1JlY29yZDogYW55LCBzZWxlY3ROZXdSZWNvcmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cdFx0dGhpcy52aXNpYmxlRGF0YS51bnNoaWZ0KG5ld1JlY29yZCk7XHJcblxyXG5cdFx0aWYgKHNlbGVjdE5ld1JlY29yZCA9PT0gdHJ1ZSkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4KVxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlUmVjb3JkKHJvd051bTogbnVtYmVyLCByZWNvcmQ6IGFueSkge1xyXG5cdFx0dGhpcy52aXNpYmxlRGF0YVtyb3dOdW1dID0gcmVjb3JkO1xyXG5cdH1cclxuXHJcblx0b25Sb3dDbGlja2VkKHJvd0RhdGE6IGFueSwgaWR4OiBudW1iZXIpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IGlkeDtcclxuXHRcdGNsZWFyVGltZW91dCh0aGlzLmRvdWJsZUNsaWNrV2FpdFRpbWVvdXQpO1xyXG5cdFx0dGhpcy5kb3VibGVDbGlja1dhaXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHJvd0RhdGEpO1xyXG5cdFx0fSwgMjUwKTtcclxuXHR9XHJcblxyXG5cdG9uUm93RG91YmxlQ2xpY2tlZChyb3dEYXRhOiBhbnksIGlkeCkge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gaWR4O1xyXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuZG91YmxlQ2xpY2tXYWl0VGltZW91dCk7XHJcblx0XHR0aGlzLm9uUm93RG91YmxlQ2xpY2suZW1pdChyb3dEYXRhKTtcclxuXHR9XHJcblxyXG5cdG9uUm93Q29udGV4dE1lbnVDbGlja2VkKGU6IE1vdXNlRXZlbnQsIHJvd0RhdGEsIGlkeCkge1xyXG5cdFx0aWYgKHRoaXMub25Sb3dDb250ZXh0TWVudSkge1xyXG5cdFx0XHRsZXQgcm93Q29udGV4dE1lbnVNb2RlbCA9IHtcclxuXHRcdFx0XHRtb3VzZUV2ZW50OiBlLFxyXG5cdFx0XHRcdGRhdGE6IHJvd0RhdGEsXHJcblx0XHRcdFx0cm93SWR4OiBpZHhcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5vblJvd0NvbnRleHRNZW51LmVtaXQocm93Q29udGV4dE1lbnVNb2RlbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBvblBhZ2VDaGFuZ2UocGFnZU51bWJlciwgc2VsZWN0Um93OiBib29sZWFuID0gdHJ1ZSkge1xyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VOdW1iZXI7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gcGFnZU51bWJlcjtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9ICh0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSkgPyAwIDogbnVsbDtcclxuXHJcblx0XHRpZiAoc2VsZWN0Um93ID09PSB0cnVlICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKSB7XHJcblx0XHRcdGNvbnN0IHJvd0RhdGEgPSB0aGlzLnZpc2libGVEYXRhW3RoaXMuc2VsZWN0ZWRJbmRleF07XHJcblx0XHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHR9XHJcblxyXG5cdFx0KDxIVE1MVGFibGVFbGVtZW50PnRoaXMudGFibGVSZWYubmF0aXZlRWxlbWVudCkuZm9jdXMoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlbG9hZEdyaWQoYWRkaXRpb25hbFBhcmFtczogYW55KTogUHJvbWlzZTxTbGlja0dyaWRSZXNwb25zZU1vZGVsPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLnJlc2l6ZUdyaWQoKTtcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FER1JJRFwiKTtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwudXJsID0gdGhpcy5ncmlkT3B0aW9ucy5nZXRVcmw7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmh0dHBIZWFkZXJzID0gdGhpcy5ncmlkT3B0aW9ucy5odHRwSGVhZGVycztcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuYWRkaXRpb25hbFBhcmFtcyA9IGFkZGl0aW9uYWxQYXJhbXM7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IHRoaXMucmVjb3Jkc1BlclBhZ2U7XHJcblxyXG5cdFx0XHRsZXQgcmVzcG9uc2VNb2RlbDogU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FER1JJRFwiKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZU1vZGVsKTtcclxuXHRcdH1cclxuXHRcdGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyByZWxvYWRHcmlkV2l0aFJlcXVlc3RNb2RlbChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXNpemVHcmlkKCk7XHJcblx0XHRcdGF3YWl0IHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5sb2NrKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BREdSSURXSVRIUkVRVUVTVE1PREVMXCIpO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbCA9IHJlcXVlc3RNb2RlbDtcclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHRsZXQgcmVzcG9uc2VNb2RlbDogU2xpY2tHcmlkUmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHRcdFx0dGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLnJlbGVhc2UoXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FER1JJRFdJVEhSRVFVRVNUTU9ERUxcIik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2VNb2RlbCk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XHJcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIHJlbG9hZChyZXF1ZXN0TW9kZWw6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCk6IFByb21pc2U8U2xpY2tHcmlkUmVzcG9uc2VNb2RlbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5mdW5jdGlvbkxvY2tTZXJ2aWNlLmxvY2soXCJHUklEX1wiICsgdGhpcy51dWlkICsgXCJfUkVMT0FEXCIpO1xyXG5cclxuXHRcdFx0cmVxdWVzdE1vZGVsID0gdGhpcy5nZXRSZXF1ZXN0TW9kZWwodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cclxuXHRcdFx0bGV0IHJlc3BvbnNlTW9kZWw6IFNsaWNrR3JpZFJlc3BvbnNlTW9kZWwgPSBudWxsO1xyXG5cdFx0XHRpZiAocmVxdWVzdE1vZGVsLnVybClcclxuXHRcdFx0XHRyZXNwb25zZU1vZGVsID0gYXdhaXQgdGhpcy5ncmlkU2VydmljZS5nZXREYXRhRnJvbVNlcnZlcihyZXF1ZXN0TW9kZWwpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0cmVzcG9uc2VNb2RlbCA9IGF3YWl0IHRoaXMuZ3JpZFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhT2JqKHJlcXVlc3RNb2RlbCwgdGhpcy5kYXRhKTtcclxuXHJcblx0XHRcdHRoaXMubG9hZGVkID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy50b3RhbFJlY29yZHMgPSByZXNwb25zZU1vZGVsLnRvdGFsUmVjb3JkcztcclxuXHRcdFx0dGhpcy52aXNpYmxlRGF0YSA9IHJlc3BvbnNlTW9kZWwuZGF0YTtcclxuXHJcblx0XHRcdHRoaXMuZnVuY3Rpb25Mb2NrU2VydmljZS5yZWxlYXNlKFwiR1JJRF9cIiArIHRoaXMudXVpZCArIFwiX1JFTE9BRFwiKTtcclxuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTW9kZWwpO1xyXG5cdFx0fVxyXG5cdFx0Y2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dW5zZWxlY3RSb3coKSB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSBudWxsO1xyXG5cdH1cclxuXHJcblx0c2VsZWN0Um93KHJvd051bWJlcjogbnVtYmVyKSB7XHJcblx0XHRsZXQgcm93RGF0YSA9IHRoaXMudmlzaWJsZURhdGFbcm93TnVtYmVyXTtcclxuXHRcdHRoaXMub25Sb3dDbGlja2VkKHJvd0RhdGEsIHJvd051bWJlcik7XHJcblx0fVxyXG5cclxuXHRnZXRDb2x1bW5IVE1MKHJvd0RhdGEsIGRhdGFGaWVsZE5hbWUpIHtcclxuXHRcdGNvbnN0IGNvbHVtbkhUTUwgPSBTbGlja1V0aWxzU2VydmljZS5nZXREZWVwT2JqZWN0KHJvd0RhdGEsIGRhdGFGaWVsZE5hbWUpO1xyXG5cclxuXHRcdGlmIChjb2x1bW5IVE1MID09PSBudWxsIHx8IGNvbHVtbkhUTUwgPT09IHVuZGVmaW5lZClcclxuXHRcdFx0cmV0dXJuICcnO1xyXG5cclxuXHRcdHJldHVybiBjb2x1bW5IVE1MLnRvU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzb3J0Qnkoc29ydENvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuXHRcdFx0aWYgKHNvcnRDb2x1bW4gJiYgYy5jb2x1bW5LZXkgIT09IHNvcnRDb2x1bW4uY29sdW1uS2V5KSB7XHJcblxyXG5cdFx0XHRcdGMuc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24ubm9uZTtcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHJcblx0XHRpZiAoc29ydENvbHVtbikge1xyXG5cdFx0XHRpZiAoc29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID09PSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmUpIHtcclxuXHRcdFx0XHR0aGlzLnZpc2libGVDb2x1bW5zLmZvckVhY2goYyA9PiBjLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmUpO1xyXG5cdFx0XHRcdHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYgKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5hc2MpXHJcblx0XHRcdFx0c29ydENvbHVtbi5zb3J0RGlyZWN0aW9uID0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5kZXNjO1xyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRzb3J0Q29sdW1uLnNvcnREaXJlY3Rpb24gPSBTbGlja0dyaWRDb2x1bW5Tb3J0RGlyZWN0aW9uLm5vbmU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uU2VhcmNoU2VsZWN0KGRkVmFsdWUsIGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRpZiAoIXRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcylcclxuXHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzID0gW107XHJcblxyXG5cdFx0bGV0IGNvbHVtblNlYXJjaFZhbHVlSWR4ID0gdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLmZpbmRJbmRleCh4ID0+IHguY29sdW1uTmFtZSA9PT0gY29sdW1uLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0aWYgKGNvbHVtblNlYXJjaFZhbHVlSWR4ID49IDApXHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5zcGxpY2UoY29sdW1uU2VhcmNoVmFsdWVJZHgsIDEpO1xyXG5cclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cclxuXHRcdGlmIChkZFZhbHVlKSB7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5wdXNoKDxJU2xpY2tHcmlkUmVxdWVzdFNlYXJjaE1vZGVsPntcclxuXHRcdFx0XHRjb2x1bW5OYW1lOiBjb2x1bW4uZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRzZWFyY2hWYWx1ZUlkOiBkZFZhbHVlLmlkLFxyXG5cdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogZGRWYWx1ZS50ZXh0XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uU2VhcmNoKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdGlmICghdGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzKVxyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMgPSBbXTtcclxuXHJcblx0XHRpZiAoY29sdW1uLmZpbHRlclRleHQgPT09IGNvbHVtbi5sYXN0U2VhcmNoVGV4dClcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdGNvbHVtbi5sYXN0U2VhcmNoVGV4dCA9IGNvbHVtbi5maWx0ZXJUZXh0O1xyXG5cdFx0Y29sdW1uLmlzRmlsdGVyaW5nID0gISFjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdGlmICghY29sdW1uLmlzRmlsdGVyaW5nKVxyXG5cdFx0XHRjb2x1bW4uaXNMb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcclxuXHRcdHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHRcdGxldCBjb2x1bW5TZWFyY2hWYWx1ZUlkeCA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maW5kSW5kZXgoeCA9PiB4LmNvbHVtbk5hbWUgPT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHRcdFx0aWYgKGNvbHVtblNlYXJjaFZhbHVlSWR4ID49IDApXHJcblx0XHRcdFx0dGhpcy5yZXF1ZXN0TW9kZWwuY29sdW1uU2VhcmNoVmFsdWVzLnNwbGljZShjb2x1bW5TZWFyY2hWYWx1ZUlkeCwgMSk7XHJcblxyXG5cdFx0XHRpZiAoY29sdW1uLmZpbHRlclRleHQpIHtcclxuXHRcdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRjb2x1bW5OYW1lOiBjb2x1bW4uZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogY29sdW1uLmZpbHRlclRleHRcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0XHRhd2FpdCB0aGlzLnJlbG9hZCh0aGlzLnJlcXVlc3RNb2RlbCk7XHJcblx0XHRcdGlmICh0aGlzLnZpc2libGVEYXRhICYmIHRoaXMudmlzaWJsZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmdyaWRPcHRpb25zLmF1dG9TZWxlY3RGaXJzdFJvdyA9PT0gdHJ1ZSlcclxuXHRcdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHRcdH0sIDI1MCk7XHJcblx0fVxyXG5cclxuXHR0b2dnbGVMb2NrKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsKSB7XHJcblx0XHRjb2x1bW4uaXNMb2NrZWQgPSAhY29sdW1uLmlzTG9ja2VkO1xyXG5cclxuXHRcdHRoaXMuc2F2ZUNvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVzZXRGaWx0ZXIoY29sdW1uOiBJU2xpY2tHcmlkQ29sdW1uTW9kZWwpIHtcclxuXHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29sdW1uLmZpbHRlclRleHQgPSBudWxsO1xyXG5cdFx0Y29sdW1uLmxhc3RTZWFyY2hUZXh0ID0gbnVsbDtcclxuXHRcdGNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IHRoaXMucmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5maWx0ZXIoeCA9PiB4LmNvbHVtbk5hbWUgIT09IGNvbHVtbi5kYXRhRmllbGROYW1lKTtcclxuXHJcblx0XHR0aGlzLnNhdmVDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnBhZ2UgPSAxO1xyXG5cdFx0YXdhaXQgdGhpcy5yZWxvYWQodGhpcy5yZXF1ZXN0TW9kZWwpO1xyXG5cdFx0aWYgKHRoaXMudmlzaWJsZURhdGEgJiYgdGhpcy52aXNpYmxlRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXV0b1NlbGVjdEZpcnN0Um93ID09PSB0cnVlKVxyXG5cdFx0XHR0aGlzLnNlbGVjdFJvdygwKTtcclxuXHR9XHJcblxyXG5cdG9wZW5Db2x1bW5TZWxlY3REaWFsb2coKSB7XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSBbLi4udGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zXTtcclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ1JlZi5zaG93RGlhbG9nKCk7XHJcblx0fVxyXG5cclxuXHRvbkNvbHVtbkRyb3AoZTogYW55KSB7XHJcblx0XHRjb25zb2xlLmxvZyhlKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uQ29sdW1uUmVvcmRlcihlOiBudW1iZXJbXSkge1xyXG5cdFx0Y29uc3Qgb2xkT3JkZXIgPSBlWzBdO1xyXG5cdFx0Y29uc3QgbmV3T3JkZXIgPSBlWzFdO1xyXG5cclxuXHRcdGlmIChvbGRPcmRlciA9PT0gbmV3T3JkZXIpXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb25zdCBzZWxlY3RlZENvbCA9IHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zcGxpY2Uob2xkT3JkZXIsIDEpWzBdO1xyXG5cdFx0c2VsZWN0ZWRDb2wuZGlzcGxheU9yZGVyID0gbmV3T3JkZXI7XHJcblxyXG5cdFx0bGV0IGN1cnJlbnRPcmRlciA9IDA7XHJcblx0XHQvLyBFdmVyeXRoaW5nIHVwIHRvIHRoZSBuZXcgb3JkZXIgcmVvcmRlcmVkIGZyb20gMFxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Ly8gSWYgd2UncmUgYXQgbmV3T3JkZXIsIGxlYXZlIGEgc3BvdFxyXG5cdFx0XHRpZiAoaSA9PT0gbmV3T3JkZXIpXHJcblx0XHRcdFx0Y3VycmVudE9yZGVyKys7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc1tpXS5kaXNwbGF5T3JkZXIgPSBjdXJyZW50T3JkZXIrKztcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zLCBzZWxlY3RlZENvbF07XHJcblx0XHR0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMgPSB0aGlzLmNvbHVtblNlbGVjdERpYWxvZ0NvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBhZGROZXdGYXZvcml0ZSgpIHtcclxuXHRcdHRoaXMubmV3RmF2b3JpdGVUZXh0ID0gJyc7XHJcblxyXG5cdFx0Y29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkTmV3RmF2b3JpdGVEaWFsb2dSZWYuY29uZmlybSgpO1xyXG5cclxuXHRcdGlmIChjb25maXJtUmVzdWx0ID09PSBTbGlja0NvbmZpcm1EaWFsb2dSZXN1bHRzLk9rICYmIHRoaXMubmV3RmF2b3JpdGVUZXh0KSB7XHJcblx0XHRcdC8vIFNhdmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvbiB0byBsb2NhbHN0b3JhZ2VcclxuXHRcdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmZhdm9yaXRlcy5wdXNoKG5ldyBEcm9wRG93bk1vZGVsKHRoaXMubmV3RmF2b3JpdGVUZXh0KSk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSB0aGlzLm5ld0Zhdm9yaXRlVGV4dDtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIiwgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRcdGNvbnN0IGZhdm9yaXRlc0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmZhdm9yaXRlcy5tYXAoeCA9PiB4LnRleHQpKTtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfRkFWT1JJVEVTXCIsIGZhdm9yaXRlc0pzb24pO1xyXG5cclxuXHRcdFx0Ly8gU2F2ZSB0aGUgbmV3IG9uZSB0byBsb2NhbHN0b3JhZ2VcclxuXHRcdFx0dGhpcy5zYXZlRGlhbG9nQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRsb2FkRmF2b3JpdGUoZmF2b3JpdGU6IERyb3BEb3duTW9kZWwpIHtcclxuXHRcdHRoaXMuc2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpO1xyXG5cclxuXHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3RoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGV9YCk7XHJcblx0XHRpZiAoZ3JpZENvbHVtbnNKc29uKSB7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucyA9IDxJU2xpY2tHcmlkQ29sdW1uTW9kZWxbXT5KU09OLnBhcnNlKGdyaWRDb2x1bW5zSnNvbik7XHJcblx0XHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHNldEZhdm9yaXRlKGZhdm9yaXRlOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9IGZhdm9yaXRlO1xyXG5cdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIiwgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRsZXQgZ3JpZENvbHVtbnNKc29uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3RoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAnXycgKyB0aGlzLnNlbGVjdGVkRmF2b3JpdGV9YCk7XHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlID09PSB0cnVlKTtcclxuXHRcdHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLmRpc3BsYXlPcmRlciA+IGIuZGlzcGxheU9yZGVyKSA/IDEgOiAoYS5kaXNwbGF5T3JkZXIgPCBiLmRpc3BsYXlPcmRlcikgPyAtMSA6IDApO1xyXG5cdFx0dGhpcy5zaG93U2VhcmNoUm93ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpLmxlbmd0aCA+IDA7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlcXVlc3RNb2RlbC5wYWdlID0gMTtcclxuXHRcdHRoaXMucmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlID0gdGhpcy5yZWNvcmRzUGVyUGFnZTtcclxuXHRcdGF3YWl0IHRoaXMucmVsb2FkKHRoaXMucmVxdWVzdE1vZGVsKTtcclxuXHR9XHJcblxyXG5cdG9uU2F2ZUNvbHVtbnMoKSB7XHJcblx0XHR0aGlzLnNhdmVEaWFsb2dDb2x1bW5zVG9Mb2NhbFN0b3JhZ2UoKTtcclxuXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5TZWxlY3REaWFsb2dDb2x1bW5zXTtcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgaWYgdGhleSd2ZSBoaWRkZW4gYSBjb2x1bW4gdGhhdCB3ZSBhcmVuJ3QgdHJ5aW5nIHRvIHNvcnQgb3IgZmlsdGVyIGJ5IHRoaXMgY29sdW1uXHJcblx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuZm9yRWFjaCh4ID0+IHtcclxuXHRcdFx0aWYgKHgudmlzaWJsZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHR4LmZpbHRlckRyb3Bkb3duVmFsdWUgPSBudWxsO1xyXG5cdFx0XHRcdHguZmlsdGVyVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0eC5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdHguaXNMb2NrZWQgPSBmYWxzZTtcclxuXHRcdFx0XHR4Lmxhc3RTZWFyY2hUZXh0ID0gbnVsbDtcclxuXHRcdFx0XHR4LnNvcnREaXJlY3Rpb24gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHRcdHRoaXMuc2hvd1NlYXJjaFJvdyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWx0ZXJUeXBlICE9PSBTbGlja0dyaWRDb2x1bW5GaWx0ZXJUeXBlcy5ub25lKS5sZW5ndGggPiAwO1xyXG5cclxuXHRcdHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nUmVmLmhpZGVEaWFsb2coKTtcclxuXHRcdHRoaXMucmVzaXplR3JpZCgpO1xyXG5cclxuXHRcdGlmICh0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQpIHtcclxuXHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlczogSVNsaWNrR3JpZEZhdm9yaXRlTW9kZWxbXSA9IHRoaXMuZmF2b3JpdGVzLm1hcChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZ3JpZEZhdm9yaXRlID0gbmV3IFNsaWNrR3JpZEZhdm9yaXRlTW9kZWwoKTtcclxuXHRcdFx0XHRncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID0gZmF2b3JpdGUudGV4dDtcclxuXHRcdFx0XHRjb25zdCBzdWZmaXggPSBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBncmlkRmF2b3JpdGUuZmF2b3JpdGVOYW1lKTtcclxuXHRcdFx0XHRjb25zdCBkaWFsb2dDb2x1bW5zSlNPTiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmNvbHVtbnMgPSBKU09OLnBhcnNlKGRpYWxvZ0NvbHVtbnNKU09OKTtcclxuXHRcdFx0XHRyZXR1cm4gZ3JpZEZhdm9yaXRlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHRoaXMub25GYXZvcml0ZXNNb2RpZmllZC5lbWl0KGdyaWRGYXZvcml0ZXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0b25DYW5jZWxDb2x1bW5zKCkge1xyXG5cdFx0dGhpcy5jb2x1bW5TZWxlY3REaWFsb2dSZWYuaGlkZURpYWxvZygpO1xyXG5cdH1cclxuXHJcblx0c2F2ZURpYWxvZ0NvbHVtbnNUb0xvY2FsU3RvcmFnZSgpIHtcclxuXHRcdGxldCBkaWFsb2dDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1ucyk7XHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0NPTFVNTlMke3N1ZmZpeH1gLCBkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzYXZlQ29sdW1uc1RvTG9jYWxTdG9yYWdlKCkge1xyXG5cdFx0bGV0IGdyaWRDb2x1bW5zSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucyk7XHJcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5KSB7XHJcblx0XHRcdGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgdGhpcy5zZWxlY3RlZEZhdm9yaXRlKTtcclxuXHJcblx0XHRcdGxldCBncmlkQ29sdW1uc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcclxuXHRcdFx0aWYgKGdyaWRDb2x1bW5zSnNvbikge1xyXG5cdFx0XHRcdGxldCBjb2x1bW5zID0gPElTbGlja0dyaWRDb2x1bW5Nb2RlbFtdPkpTT04ucGFyc2UoZ3JpZENvbHVtbnNKc29uKTtcclxuXHJcblx0XHRcdFx0bGV0IGRpc3BsYXlPcmRlciA9IDA7XHJcblx0XHRcdFx0Y29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGNvbHVtbiA9IHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maW5kKGdyaWRDb2x1bW4gPT4gZ3JpZENvbHVtbi5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKGNvbHVtbikge1xyXG5cdFx0XHRcdFx0XHRjLmRpc3BsYXlPcmRlciA9IGRpc3BsYXlPcmRlcjtcclxuXHRcdFx0XHRcdFx0Yy50aXRsZU9yaWVudGF0aW9uID0gY29sdW1uLnRpdGxlT3JpZW50YXRpb247XHJcblx0XHRcdFx0XHRcdGMudGl0bGVIZWlnaHQgPSBjb2x1bW4udGl0bGVIZWlnaHQ7XHJcblx0XHRcdFx0XHRcdGMud2lkdGggPSBjb2x1bW4ud2lkdGg7XHJcblx0XHRcdFx0XHRcdGMuZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGNvbHVtbi5maWx0ZXJEcm9wZG93blZhbHVlO1xyXG5cdFx0XHRcdFx0XHRjLmZpbHRlclRleHQgPSBjb2x1bW4uZmlsdGVyVGV4dDtcclxuXHRcdFx0XHRcdFx0Yy5pc0xvY2tlZCA9IGNvbHVtbi5pc0xvY2tlZDtcclxuXHRcdFx0XHRcdFx0Yy5pc0ZpbHRlcmluZyA9IGNvbHVtbi5pc0ZpbHRlcmluZztcclxuXHRcdFx0XHRcdFx0Yy5zb3J0RGlyZWN0aW9uID0gY29sdW1uLnNvcnREaXJlY3Rpb247XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZGlzcGxheU9yZGVyKys7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0Y29sdW1ucyA9IGNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEuZGlzcGxheU9yZGVyID4gYi5kaXNwbGF5T3JkZXIpID8gMSA6IChhLmRpc3BsYXlPcmRlciA8IGIuZGlzcGxheU9yZGVyKSA/IC0xIDogMCk7XHJcblx0XHRcdFx0Z3JpZENvbHVtbnNKU09OID0gSlNPTi5zdHJpbmdpZnkoY29sdW1ucyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBHUklEXyR7dGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5fV9DT0xVTU5TJHtzdWZmaXh9YCwgZ3JpZENvbHVtbnNKU09OKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5vbkZhdm9yaXRlc01vZGlmaWVkKSB7XHJcblx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZXM6IElTbGlja0dyaWRGYXZvcml0ZU1vZGVsW10gPSB0aGlzLmZhdm9yaXRlcy5tYXAoZmF2b3JpdGUgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGdyaWRGYXZvcml0ZSA9IG5ldyBTbGlja0dyaWRGYXZvcml0ZU1vZGVsKCk7XHJcblx0XHRcdFx0Z3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9IGZhdm9yaXRlLnRleHQ7XHJcblx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSA9PT0gJ0RlZmF1bHQnID8gJycgOiAoJ18nICsgZ3JpZEZhdm9yaXRlLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0Y29uc3QgZGlhbG9nQ29sdW1uc0pTT04gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRcdGdyaWRGYXZvcml0ZS5jb2x1bW5zID0gSlNPTi5wYXJzZShkaWFsb2dDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0cmV0dXJuIGdyaWRGYXZvcml0ZTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLm9uRmF2b3JpdGVzTW9kaWZpZWQuZW1pdChncmlkRmF2b3JpdGVzKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHRwcml2YXRlIGFzeW5jIHJlc2l6ZUdyaWQoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG5cdFx0XHRpZiAoIWZvcmNlUmVmcmVzaCAmJiB0aGlzLnNsaWNrR3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA9PT0gdGhpcy5zbGlja0dyaWRIZWlnaHQpIHtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID09PSAnQXV0bycpIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UubG9jayhcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRVNJWkVHUklEXCIpO1xyXG5cclxuXHRcdFx0XHR0aGlzLnNsaWNrR3JpZEhlaWdodCA9IHRoaXMudGFibGVDb250YWluZXJSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRlc3RSb3cgPSAoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5pbnNlcnRSb3coMCk7XHJcblx0XHRcdFx0Y29uc3QgdGVzdENlbGwgPSB0ZXN0Um93Lmluc2VydENlbGwoMCk7XHJcblx0XHRcdFx0dGVzdENlbGwuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblx0XHRcdFx0dGVzdENlbGwuaW5uZXJIVE1MID0gXCImTkJTUFwiO1xyXG5cdFx0XHRcdGNvbnN0IHJvd0hlaWdodCA9IHRlc3RDZWxsLm9mZnNldEhlaWdodDtcclxuXHRcdFx0XHQoPEhUTUxUYWJsZUVsZW1lbnQ+dGhpcy50YWJsZVJlZi5uYXRpdmVFbGVtZW50KS5kZWxldGVSb3coMCk7XHJcblxyXG5cdFx0XHRcdGxldCBoZWFkZXJIZWlnaHQgPSB0aGlzLnRhYmxlSGVhZGVyUm93UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgMjtcclxuXHRcdFx0XHRpZiAodGhpcy50YWJsZUhlYWRlclNlYXJjaFJvd1JlZilcclxuXHRcdFx0XHRcdGhlYWRlckhlaWdodCArPSB0aGlzLnRhYmxlSGVhZGVyU2VhcmNoUm93UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgMjtcclxuXHRcdFx0XHRjb25zdCBjbGllbnRIZWlnaHQgPSB0aGlzLnRhYmxlQ29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gaGVhZGVySGVpZ2h0O1xyXG5cdFx0XHRcdHRoaXMucmVjb3Jkc1BlclBhZ2UgPSBwYXJzZUludCgoKGNsaWVudEhlaWdodCAvIHJvd0hlaWdodCkgLSAxKS50b0ZpeGVkKDApKTtcclxuXHRcdFx0XHRsZXQgYWN0dWFsUm93SGVpZ2h0ID0gcGFyc2VJbnQoKGNsaWVudEhlaWdodCAvIHRoaXMucmVjb3Jkc1BlclBhZ2UpLnRvRml4ZWQoMCkpIC0gMTtcclxuXHRcdFx0XHRpZiAoYWN0dWFsUm93SGVpZ2h0IDwgcm93SGVpZ2h0KVxyXG5cdFx0XHRcdFx0YWN0dWFsUm93SGVpZ2h0ID0gcm93SGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRjb25zdCBhbGxSb3dzID0gPEhUTUxFbGVtZW50W10+dGhpcy5zbGlja0dyaWRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYmxlIHRib2R5IHRyXCIpO1xyXG5cdFx0XHRcdGFsbFJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG5cdFx0XHRcdFx0cm93LnN0eWxlLmhlaWdodCA9IChhY3R1YWxSb3dIZWlnaHQpICsgXCJweFwiO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHR0aGlzLmZ1bmN0aW9uTG9ja1NlcnZpY2UucmVsZWFzZShcIkdSSURfXCIgKyB0aGlzLnV1aWQgKyBcIl9SRVNJWkVHUklEXCIpO1xyXG5cclxuXHRcdFx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMTtcclxuXHRcdFx0XHR0aGlzLnNob3dUZXN0Um93ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRhd2FpdCBTbGlja1NsZWVwU2VydmljZS5zbGVlcCgpO1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlID0gcGFyc2VJbnQodGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlKTtcclxuXHRcdFx0XHR0aGlzLmdyaWRPcGFjaXR5ID0gMTtcclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YWRkQ29sdW1uKGNvbHVtbjogSVNsaWNrR3JpZENvbHVtbk1vZGVsLCBpZHg6IG51bWJlciA9IG51bGwpIHtcclxuXHJcblx0XHRpZiAoaWR4ID09PSBudWxsKVxyXG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMucHVzaChjb2x1bW4pO1xyXG5cdFx0ZWxzZVxyXG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLmNvbHVtbnMuc3BsaWNlKGlkeCwgMCwgY29sdW1uKTtcclxuXHJcblx0XHR0aGlzLnNldEdyaWRPcHRpb25zKHRoaXMuZ3JpZE9wdGlvbnMpO1xyXG5cdH1cclxuXHJcblx0Z2V0UmVxdWVzdE1vZGVsKHJlcXVlc3RNb2RlbDogU2xpY2tHcmlkUmVxdWVzdE1vZGVsID0gbnVsbCk6IFNsaWNrR3JpZFJlcXVlc3RNb2RlbCB7XHJcblx0XHRpZiAoIXJlcXVlc3RNb2RlbClcclxuXHRcdFx0cmVxdWVzdE1vZGVsID0gdGhpcy5yZXF1ZXN0TW9kZWw7XHJcblxyXG5cdFx0cmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG5cdFx0XHRpZiAoYy52aXNpYmxlKSB7XHJcblx0XHRcdFx0aWYgKGMuZmlsdGVyVHlwZSA9PT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMudGV4dCAmJiBjLmZpbHRlclRleHQpIHtcclxuXHRcdFx0XHRcdGMuZmlsdGVyVGV4dCA9IGMuZmlsdGVyVGV4dDtcclxuXHRcdFx0XHRcdHJlcXVlc3RNb2RlbC5jb2x1bW5TZWFyY2hWYWx1ZXMucHVzaCg8SVNsaWNrR3JpZFJlcXVlc3RTZWFyY2hNb2RlbD57XHJcblx0XHRcdFx0XHRcdGNvbHVtbk5hbWU6IGMuZGF0YUZpZWxkTmFtZSxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVJZDogbnVsbCxcclxuXHRcdFx0XHRcdFx0c2VhcmNoVmFsdWVUZXh0OiBjLmZpbHRlclRleHRcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRlbHNlIGlmIChjLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLmRyb3Bkb3duICYmIGMuZmlsdGVyRHJvcGRvd25WYWx1ZSkge1xyXG5cdFx0XHRcdFx0Yy5maWx0ZXJEcm9wZG93blZhbHVlID0gYy5maWx0ZXJEcm9wZG93blZhbHVlO1xyXG5cdFx0XHRcdFx0cmVxdWVzdE1vZGVsLmNvbHVtblNlYXJjaFZhbHVlcy5wdXNoKDxJU2xpY2tHcmlkUmVxdWVzdFNlYXJjaE1vZGVsPntcclxuXHRcdFx0XHRcdFx0Y29sdW1uTmFtZTogYy5kYXRhRmllbGROYW1lLFxyXG5cdFx0XHRcdFx0XHRzZWFyY2hWYWx1ZUlkOiBjLmZpbHRlckRyb3Bkb3duVmFsdWUsXHJcblx0XHRcdFx0XHRcdHNlYXJjaFZhbHVlVGV4dDogbnVsbFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXF1ZXN0TW9kZWwuc29ydENvbHVtbiA9IG51bGw7XHJcblx0XHRjb25zdCBzb3J0Q29sdW1uID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbmQoeCA9PiB4LnNvcnREaXJlY3Rpb24gPT09IFNsaWNrR3JpZENvbHVtblNvcnREaXJlY3Rpb24uYXNjIHx8IHguc29ydERpcmVjdGlvbiA9PT0gU2xpY2tHcmlkQ29sdW1uU29ydERpcmVjdGlvbi5kZXNjKTtcclxuXHRcdGlmIChzb3J0Q29sdW1uKSB7XHJcblx0XHRcdHJlcXVlc3RNb2RlbC5zb3J0Q29sdW1uID0gKHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gMCkgPyBudWxsIDogc29ydENvbHVtbi5kYXRhRmllbGROYW1lO1xyXG5cdFx0XHRyZXF1ZXN0TW9kZWwuc29ydERpcmVjdGlvbiA9IHNvcnRDb2x1bW4uc29ydERpcmVjdGlvbjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAocmVxdWVzdE1vZGVsLnJlY29yZHNQZXJQYWdlIDw9IDApXHJcblx0XHRcdHJlcXVlc3RNb2RlbC5yZWNvcmRzUGVyUGFnZSA9IDIwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RNb2RlbDtcclxuXHR9XHJcblxyXG5cdHNldEdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBJU2xpY2tHcmlkT3B0aW9ucykge1xyXG5cdFx0dGhpcy5ncmlkT3B0aW9ucyA9IGdyaWRPcHRpb25zO1xyXG5cclxuXHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkpIHtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmZhdm9yaXRlcykge1xyXG5cdFx0XHRcdGNvbnN0IGZhdm9yaXRlTmFtZXMgPSB0aGlzLmdyaWRPcHRpb25zLmZhdm9yaXRlcy5tYXAoZiA9PiBmLmZhdm9yaXRlTmFtZSk7XHJcblx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oYEdSSURfJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9X0ZBVk9SSVRFU2AsIEpTT04uc3RyaW5naWZ5KGZhdm9yaXRlTmFtZXMpKTtcclxuXHJcblx0XHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5mYXZvcml0ZXMuZm9yRWFjaChmYXZvcml0ZSA9PiB7XHJcblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgaGF2ZW4ndCBhZGRlZCBhIG5ldyBjb2x1bW4gdGhhdCBuZWVkcyB0byBiZSBzYXZlZFxyXG5cdFx0XHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4aXN0cyA9IGZhdm9yaXRlLmNvbHVtbnMuZmluZEluZGV4KHggPT4geC5kYXRhRmllbGROYW1lID09PSBjLmRhdGFGaWVsZE5hbWUpO1xyXG5cdFx0XHRcdFx0XHRpZiAoY29sdW1uRXhpc3RzIDwgMClcclxuXHRcdFx0XHRcdFx0XHRmYXZvcml0ZS5jb2x1bW5zLnB1c2goYyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdGxldCBncmlkQ29sdW1uc0pTT04gPSBKU09OLnN0cmluZ2lmeShmYXZvcml0ZS5jb2x1bW5zKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3VmZml4ID0gZmF2b3JpdGUuZmF2b3JpdGVOYW1lID09PSAnRGVmYXVsdCcgPyAnJyA6ICgnXycgKyBmYXZvcml0ZS5mYXZvcml0ZU5hbWUpO1xyXG5cdFx0XHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWAsIGdyaWRDb2x1bW5zSlNPTik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGlmIChmYXZvcml0ZU5hbWVzLmluZGV4T2YodGhpcy5zZWxlY3RlZEZhdm9yaXRlKSA8IDApXHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPSBcIkRlZmF1bHRcIjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEZhdm9yaXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfU0VMRUNURURfRkFWT1JJVEVcIikgfHwgJ0RlZmF1bHQnO1xyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYW55IGR1cGxpY2F0ZSBjb2x1bW4gbmFtZXNcclxuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYzEgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IGRhdGFGaWVsZENvdW50ID0gKHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1ucy5maWx0ZXIoeCA9PiB4LmRhdGFGaWVsZE5hbWUgPT09IGMxLmRhdGFGaWVsZE5hbWUpIHx8IFtdKS5sZW5ndGg7XHJcblx0XHRcdFx0aWYgKGRhdGFGaWVsZENvdW50ID4gMSlcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYEdyaWQgJHt0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXl9IGNvbHVtbiAke2MxLmRhdGFGaWVsZE5hbWV9IGlzIGRlZmluZWQgJHtkYXRhRmllbGRDb3VudH0gdGltZXNgKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRjb25zdCBzdWZmaXggPSB0aGlzLnNlbGVjdGVkRmF2b3JpdGUgPT09ICdEZWZhdWx0JyA/ICcnIDogKCdfJyArIHRoaXMuc2VsZWN0ZWRGYXZvcml0ZSk7XHJcblx0XHRcdGxldCBncmlkQ29sdW1uc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgR1JJRF8ke3RoaXMuZ3JpZE9wdGlvbnMuZ3JpZEtleX1fQ09MVU1OUyR7c3VmZml4fWApO1xyXG5cdFx0XHRpZiAoZ3JpZENvbHVtbnNKc29uKSB7XHJcblx0XHRcdFx0bGV0IGNvbHVtbnMgPSA8SVNsaWNrR3JpZENvbHVtbk1vZGVsW10+SlNPTi5wYXJzZShncmlkQ29sdW1uc0pzb24pO1xyXG5cclxuXHRcdFx0XHRsZXQgZGlzcGxheU9yZGVyID0gMDtcclxuXHRcdFx0XHRjb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcblx0XHRcdFx0XHRsZXQgY29sdW1uID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbmQoZ3JpZENvbHVtbiA9PiBncmlkQ29sdW1uLmRhdGFGaWVsZE5hbWUgPT09IGMuZGF0YUZpZWxkTmFtZSk7XHJcblx0XHRcdFx0XHRpZiAoY29sdW1uKSB7XHJcblx0XHRcdFx0XHRcdGNvbHVtbi52aXNpYmxlID0gYy52aXNpYmxlO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4uZGlzcGxheU9yZGVyID0gZGlzcGxheU9yZGVyO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW4udGl0bGVPcmllbnRhdGlvbiA9IGMudGl0bGVPcmllbnRhdGlvbjtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnRpdGxlSGVpZ2h0ID0gYy50aXRsZUhlaWdodDtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLndpZHRoID0gYy53aWR0aDtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLmZsZXhpYmxlID0gYy5mbGV4aWJsZTtcclxuXHRcdFx0XHRcdFx0Y29sdW1uLnNvcnREaXJlY3Rpb24gPSBjLnNvcnREaXJlY3Rpb247XHJcblx0XHRcdFx0XHRcdGNvbHVtbi5pc0xvY2tlZCA9IGMuaXNMb2NrZWQ7XHJcblx0XHRcdFx0XHRcdC8vY29sdW1uLmZpbHRlclR5cGUgPSBjLmZpbHRlclR5cGU7XHJcblx0XHRcdFx0XHRcdGlmIChjb2x1bW4uaXNMb2NrZWQgJiYgY29sdW1uLmZpbHRlclR5cGUgIT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLm5vbmUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb2x1bW4uaXNGaWx0ZXJpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoY29sdW1uLmZpbHRlclR5cGUgPT09IFNsaWNrR3JpZENvbHVtbkZpbHRlclR5cGVzLnRleHQpXHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyVGV4dCA9IGMuZmlsdGVyVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRlbHNlIGlmIChjb2x1bW4uZmlsdGVyVHlwZSA9PT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMuZHJvcGRvd24pXHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IGMuZmlsdGVyRHJvcGRvd25WYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCFjb2x1bW4uZmlsdGVyVGV4dCAmJiAhY29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi5pc0ZpbHRlcmluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLmlzTG9ja2VkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyVGV4dCA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZGlzcGxheU9yZGVyKys7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRSZWNvcmRzUGVyUGFnZSAmJiAhbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfUkVDT1JEU19QRVJfUEFHRVwiKSlcclxuXHRcdFx0XHR0aGlzLnJlY29yZHNQZXJQYWdlVmFsdWUgPSB0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRSZWNvcmRzUGVyUGFnZS50b1N0cmluZygpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0dGhpcy5yZWNvcmRzUGVyUGFnZVZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJHUklEX1wiICsgdGhpcy5ncmlkT3B0aW9ucy5ncmlkS2V5ICsgXCJfUkVDT1JEU19QRVJfUEFHRVwiKSB8fCBcIkF1dG9cIjtcclxuXHJcblx0XHRcdGNvbnN0IGZhdm9yaXRlc0pzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkdSSURfXCIgKyB0aGlzLmdyaWRPcHRpb25zLmdyaWRLZXkgKyBcIl9GQVZPUklURVNcIikgfHwgYFtcIkRlZmF1bHRcIl1gO1xyXG5cdFx0XHR0aGlzLmZhdm9yaXRlcyA9ICg8c3RyaW5nW10+SlNPTi5wYXJzZShmYXZvcml0ZXNKc29uKSkubWFwKGZhdm9yaXRlID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gbmV3IERyb3BEb3duTW9kZWwoZmF2b3JpdGUpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSA9PT0gdHJ1ZSk7XHJcblx0XHR0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5kaXNwbGF5T3JkZXIgPiBiLmRpc3BsYXlPcmRlcikgPyAxIDogKGEuZGlzcGxheU9yZGVyIDwgYi5kaXNwbGF5T3JkZXIpID8gLTEgOiAwKTtcclxuXHJcblx0XHR0aGlzLnNob3dTZWFyY2hSb3cgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuZmlsdGVyVHlwZSAhPT0gU2xpY2tHcmlkQ29sdW1uRmlsdGVyVHlwZXMubm9uZSkubGVuZ3RoID4gMDtcclxuXHRcdGxldCBzb3J0Q29sdW1uID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKGMgPT4gYy5zb3J0YWJsZSA9PT0gdHJ1ZSAmJiBjLnNvcnREaXJlY3Rpb24gPiAwKTtcclxuXHRcdGlmICh0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aCA+IDAgJiYgc29ydENvbHVtbikge1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5zb3J0Q29sdW1uID0gc29ydENvbHVtbi5kYXRhRmllbGROYW1lO1xyXG5cdFx0XHR0aGlzLnJlcXVlc3RNb2RlbC5zb3J0RGlyZWN0aW9uID0gc29ydENvbHVtbi5zb3J0RGlyZWN0aW9uO1xyXG5cdFx0fVxyXG5cdH1cclxufSIsIjxkaXYgaWQ9XCJzbGljay1ncmlkX3t7dXVpZH19XCIgY2xhc3M9XCJzbGljay1ncmlkIGQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWZpbGxcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOyByaWdodDogMDsgYm90dG9tOiAwO1wiICNzbGlja0dyaWQ+XHJcblx0PGRpdiAjdGFibGVDb250YWluZXIgY2xhc3M9XCJkLWZsZXggZmxleC1maWxsXCIgc3R5bGU9XCJvdmVyZmxvdzogYXV0b1wiPlxyXG5cclxuXHRcdDxkaXY+XHJcblx0XHRcdDx0YWJsZSAjdGFibGVSZWYgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zbVwiIFtjbGFzcy50YWJsZS1ib3JkZXJlZF09XCJib3JkZXJlZFwiIFtjbGFzcy50YWJsZS1ib3JkZXJsZXNzXT1cIiFib3JkZXJlZFwiIFtjbGFzcy50YWJsZS1zdHJpcGVkXT1cInN0cmlwZWRcIiBbY2xhc3MudGFibGUtaG92ZXJdPVwiaG92ZXJcIiBbc3R5bGUub3BhY2l0eV09XCJncmlkT3BhY2l0eVwiIHN0eWxlPVwibWFyZ2luOiAwOyBwYWRkaW5nOiAwO1wiIChrZXlkb3duKT1cInRhYmxlS2V5ZG93bigkZXZlbnQpXCIgdGFiaW5kZXg9XCIwXCI+XHJcblx0XHRcdFx0PHRoZWFkPlxyXG5cdFx0XHRcdFx0PHRyICN0YWJsZUhlYWRlclJvdyAobW91c2Vtb3ZlKT1cIm9uQ29sUmVzaXplTW91c2Vtb3ZlKCRldmVudClcIiBbbmdDbGFzc109XCJ7ICdyZXNpemluZyc6IGlzUmVzaXppbmcgPT09IHRydWUgfVwiPlxyXG5cdFx0XHRcdFx0XHQ8dGQgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB2aXNpYmxlQ29sdW1uczsgbGV0IGlkeCA9IGluZGV4XCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFwiIFtzdHlsZS5tYXhXaWR0aF09XCJjb2x1bW4ud2lkdGhcIiBbc3R5bGUuaGVpZ2h0XT1cImNvbHVtbi50aXRsZUhlaWdodFwiPlxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgW25nQ2xhc3NdPVwieyAnc2xpY2stZ3JpZF90aXRsZS12ZXJ0aWNhbCcgOiBjb2x1bW4udGl0bGVPcmllbnRhdGlvbiA9PT0gMSB9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiaWR4ID4gMCAmJiBpZHggPCB2aXNpYmxlQ29sdW1ucy5sZW5ndGhcIiBjbGFzcz1cInJlc2l6ZV9jb2x1bW5fbGVmdFwiIFtjbGFzcy50YWJsZS1ib3JkZXJlZF09XCJib3JkZXJlZFwiIChtb3VzZWRvd24pPVwib25Db2xSZXNpemVNb3VzZWRvd24oJGV2ZW50LCBpZHggLSAxKVwiIChkYmxjbGljayk9XCJvbkNvbFJlc2l6ZURvdWJsZWNsaWNrKCRldmVudCwgaWR4IC0gMSlcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic29ydEljb25cIiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSA9PT0gdHJ1ZSAmJiBjb2x1bW4uc29ydERpcmVjdGlvbiA+IDBcIj48aSBjbGFzcz1cImZhclwiIFtuZ0NsYXNzXT1cInsnZmEtY2FyZXQtdXAnOiBjb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gMSwgJ2ZhLWNhcmV0LWRvd24nOiBjb2x1bW4uc29ydERpcmVjdGlvbiA9PT0gMn1cIj48L2k+Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlID09PSB0cnVlXCIgKGNsaWNrKT1cInNvcnRCeShjb2x1bW4pXCIgZHJhZ2dhYmxlPVwiZmFsc2VcIiB0aXRsZT1cInt7Y29sdW1uLnRpdGxlfX1cIj57e2NvbHVtbi50aXRsZX19PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSA9PT0gZmFsc2VcIiB0aXRsZT1cInt7Y29sdW1uLnRpdGxlfX1cIj57e2NvbHVtbi50aXRsZX19PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmVzaXplX2NvbHVtbl9yaWdodFwiIChtb3VzZWRvd24pPVwib25Db2xSZXNpemVNb3VzZWRvd24oJGV2ZW50LCBpZHgpXCIgKGRibGNsaWNrKT1cIm9uQ29sUmVzaXplRG91YmxlY2xpY2soJGV2ZW50LCBpZHgpXCI+PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0PHRyICN0YWJsZUhlYWRlclNlYXJjaFJvdyAqbmdJZj1cInNob3dTZWFyY2hSb3cgPT09IHRydWVcIj5cclxuXHRcdFx0XHRcdFx0PHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2xpY2stZ3JpZF9zZWFyY2gtY29sdW1uXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8aSAqbmdJZj1cImNvbHVtbi5pc0ZpbHRlcmluZ1wiIGNsYXNzPVwiZmFzIGZhLXRpbWVzLWNpcmNsZSBiZy13aGl0ZSB0ZXh0LWRhbmdlciBtci0xXCIgKGNsaWNrKT1cInJlc2V0RmlsdGVyKGNvbHVtbilcIj48L2k+XHJcblx0XHRcdFx0XHRcdFx0XHQ8aSAqbmdJZj1cImNvbHVtbi5pc0ZpbHRlcmluZyAmJiBjb2x1bW4uaXNMb2NrZWRcIiBjbGFzcz1cImZhciBmYS1sb2NrIG1yLTFcIiAoY2xpY2spPVwidG9nZ2xlTG9jayhjb2x1bW4pXCI+PC9pPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGkgKm5nSWY9XCJjb2x1bW4uaXNGaWx0ZXJpbmcgJiYgIWNvbHVtbi5pc0xvY2tlZFwiIGNsYXNzPVwiZmFyIGZhLWxvY2stb3BlbiBtci0xXCIgKGNsaWNrKT1cInRvZ2dsZUxvY2soY29sdW1uKVwiPjwvaT5cclxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJjb2x1bW4uZmlsdGVyVHlwZSA9PT0gMVwiIGNsYXNzPVwic2xpY2stZ3JpZF90ZXh0LXNlYXJjaFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgYXV0b2NvbXBsZXRlPVwibm9wZVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi5maWx0ZXJUZXh0XCIgbmFtZT1cInNlYXJjaFRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIChrZXlkb3duKT1cIm9uU2VhcmNoKGNvbHVtbilcIiAvPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiAqbmdJZj1cImNvbHVtbi5maWx0ZXJUeXBlID09PSAyXCIgY2xhc3M9XCJpbnB1dC1ncm91cCBzbGljay1ncmlkX2Ryb3AtZG93bi1zZWFyY2hcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNsaWNrLWRyb3AtZG93biBbaXRlbXNdPVwiY29sdW1uLmZpbHRlckRyb3Bkb3duVmFsdWVzXCIgWyhuZ01vZGVsKV09XCJjb2x1bW4uZmlsdGVyRHJvcGRvd25WYWx1ZVwiIGxpc3RXaWR0aD1cImF1dG9cIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIChvblNlbGVjdCk9XCJvblNlYXJjaFNlbGVjdCgkZXZlbnQsIGNvbHVtbilcIj48L3NsaWNrLWRyb3AtZG93bj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHQ8L3RoZWFkPlxyXG5cclxuXHRcdFx0XHQ8dGJvZHk+XHJcblx0XHRcdFx0XHQ8dHIgKm5nSWY9XCJsb2FkZWQgJiYgdmlzaWJsZURhdGEubGVuZ3RoID09PSAwXCI+PHRkIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5zLmxlbmd0aFwiPk5vIERhdGE8L3RkPjwvdHI+XHJcblx0XHRcdFx0XHQ8dHIgKm5nRm9yPVwibGV0IHJvd0RhdGEgb2YgdmlzaWJsZURhdGE7IGxldCBpZHggPSBpbmRleFwiICN0YWJsZUJvZHlSb3dzIChjbGljayk9XCJvblJvd0NsaWNrZWQocm93RGF0YSwgaWR4KVwiIChkYmxjbGljayk9XCJvblJvd0RvdWJsZUNsaWNrZWQocm93RGF0YSwgaWR4KVwiIChjb250ZXh0bWVudSk9XCJvblJvd0NvbnRleHRNZW51Q2xpY2tlZCgkZXZlbnQsIHJvd0RhdGEsIGlkeClcIiBbY2xhc3MudGFibGUtc3VjY2Vzc109XCJzZWxlY3RlZEluZGV4ID09PSBpZHhcIj5cclxuXHRcdFx0XHRcdFx0PHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5jb2x1bW5LZXlcIiBjbGFzcz1cInNsaWNrLWdyaWRfY29sdW1uLWNvbnRlbnRcIiBbc3R5bGUud2lkdGhdPVwiY29sdW1uLndpZHRoXCIgW3N0eWxlLm1heFdpZHRoXT1cImNvbHVtbi53aWR0aFwiIFtpbm5lckhUTUxdPVwiZ2V0Q29sdW1uSFRNTChyb3dEYXRhLCBjb2x1bW4uZGF0YUZpZWxkTmFtZSkgfCBzbGlja0dyaWRTYW5pdGl6ZUh0bWxcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiY29sdW1uLmNvbHVtbktleVwiIGNsYXNzPVwic2xpY2stZ3JpZF9jb2x1bW4tY29udGVudFwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhcIiBbc3R5bGUubWF4V2lkdGhdPVwiY29sdW1uLndpZHRoXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSZWZzW2NvbHVtbi5jb2x1bW5LZXldLCBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93RGF0YSB9XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDwvdHI+XHJcblx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0PC90YWJsZT5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cclxuXHJcblx0PGRpdiBjbGFzcz1cInNsaWNrLWdyaWQtZm9vdGVyIG10LTIgZC1mbGV4XCI+XHJcblx0XHQ8ZGl2PlxyXG5cdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib3BlbkNvbHVtblNlbGVjdERpYWxvZygpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeVwiPjxpIGNsYXNzPVwiZmFyIGZhLWNvbHVtbnNcIj48L2k+PC9idXR0b24+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgKm5nSWY9XCJmYXZvcml0ZXM/Lmxlbmd0aCA+IDFcIj5cclxuXHRcdFx0PGJ1dHRvbiAjZmF2b3JpdGVTZWxlY3RSZWYgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWwtMVwiPjxpIGNsYXNzPVwiZmFyIGZhLXN0YXJcIj48L2k+IHt7dGhpcy5zZWxlY3RlZEZhdm9yaXRlfX08L2J1dHRvbj5cclxuXHRcdFx0PHNsaWNrLXBvcG92ZXIgW2VsZW1lbnRdPVwiZmF2b3JpdGVTZWxlY3RSZWZcIiBwb3NpdGlvbj1cInRvcFwiIHNob3dBcnJvdz1cImZhbHNlXCIgW3RvcE9mZnNldFB4XT1cIjBcIiBbbGVmdE9mZnNldFB4XT1cIjBcIiBbc2hvd0J5Q2xpY2tdPVwidHJ1ZVwiPlxyXG5cdFx0XHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmxlc3MgdGFibGUtc20gdGFibGUtaG92ZXJcIiBzdHlsZT1cIm1pbi13aWR0aDogMjUwcHg7IGN1cnNvcjogZGVmYXVsdFwiPlxyXG5cdFx0XHRcdFx0PHRib2R5PlxyXG5cdFx0XHRcdFx0XHQ8dHIgKm5nRm9yPVwibGV0IGZhdm9yaXRlIG9mIGZhdm9yaXRlc1wiIChjbGljayk9XCJzZXRGYXZvcml0ZShmYXZvcml0ZS50ZXh0KVwiPlxyXG5cdFx0XHRcdFx0XHRcdDx0ZD48aSAqbmdJZj1cImZhdm9yaXRlLnRleHQgPT09IHNlbGVjdGVkRmF2b3JpdGVcIiBjbGFzcz1cImZhciBmYS1zdGFyIG1yLTFcIj48L2k+e3tmYXZvcml0ZS50ZXh0fX08L3RkPlxyXG5cdFx0XHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdFx0PC90Ym9keT5cclxuXHRcdFx0XHQ8L3RhYmxlPlxyXG5cdFx0XHQ8L3NsaWNrLXBvcG92ZXI+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgKm5nSWY9XCJzaG93aW5nQWxsUmVjb3JkcyA9PSBmYWxzZVwiPlxyXG5cdFx0XHQ8c2xpY2stcGFnaW5nIFsocGFnZU51bWJlcildPVwiY3VycmVudFBhZ2VcIiBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiIFtyZWNvcmRzUGVyUGFnZV09XCJyZWNvcmRzUGVyUGFnZVwiIChvblBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIj48L3NsaWNrLXBhZ2luZz5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiAqbmdJZj1cInNob3dpbmdBbGxSZWNvcmRzID09IGZhbHNlXCIgY2xhc3M9XCJtbC0xXCI+XHJcblx0XHRcdDxidXR0b24gI3JlY29yZHNQZXJQYWdlUmVmIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCI+e3tyZWNvcmRzUGVyUGFnZVZhbHVlfX0mbmJzcDsmbmJzcDs8aSBzdHlsZT1cImZvbnQtc2l6ZTogMTJweFwiIGNsYXNzPVwiZmFyIGZhLWNoZXZyb24tZG93blwiPjwvaT48L2J1dHRvbj5cclxuXHJcblx0XHRcdDxzbGljay1wb3BvdmVyIFtlbGVtZW50XT1cInJlY29yZHNQZXJQYWdlUmVmXCIgcG9zaXRpb249XCJ0b3BcIiBzaG93QXJyb3c9XCJmYWxzZVwiIFt0b3BPZmZzZXRQeF09XCIwXCIgW2xlZnRPZmZzZXRQeF09XCIwXCIgW3Nob3dCeUNsaWNrXT1cInRydWVcIj5cclxuXHRcdFx0XHQ8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJsZXNzIHRhYmxlLXNtIHRhYmxlLWhvdmVyXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE1MHB4O1wiPlxyXG5cdFx0XHRcdFx0PHRib2R5PlxyXG5cdFx0XHRcdFx0XHQ8dHIgKGNsaWNrKT1cIm9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZCgnQXV0bycpXCI+PHRkPkF1dG88L3RkPjwvdHI+XHJcblx0XHRcdFx0XHRcdDx0ciAoY2xpY2spPVwib25SZWNvcmRzUGVyUGFnZVNlbGVjdGVkKCcyNScpXCI+PHRkPjI1PC90ZD48L3RyPlxyXG5cdFx0XHRcdFx0XHQ8dHIgKGNsaWNrKT1cIm9uUmVjb3Jkc1BlclBhZ2VTZWxlY3RlZCgnNTAnKVwiPjx0ZD41MDwvdGQ+PC90cj5cclxuXHRcdFx0XHRcdFx0PHRyIChjbGljayk9XCJvblJlY29yZHNQZXJQYWdlU2VsZWN0ZWQoJzEwMCcpXCI+PHRkPjEwMDwvdGQ+PC90cj5cclxuXHRcdFx0XHRcdDwvdGJvZHk+XHJcblx0XHRcdFx0PC90YWJsZT5cclxuXHRcdFx0PC9zbGljay1wb3BvdmVyPlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHNsaWNrLWRpYWxvZyAjY29sdW1uU2VsZWN0RGlhbG9nUmVmIGhlYWRlcj1cIlNlbGVjdCBDb2x1bW5zXCI+XHJcblx0PGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDQ3NXB4O1wiIGNsYXNzPVwibXgtNVwiPlxyXG5cdFx0PGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZmxleC1maWxsXCI+XHJcblx0XHRcdFx0PHNsaWNrLWRyb3AtZG93biBbaXRlbXNdPVwiZmF2b3JpdGVzXCJcclxuXHRcdFx0XHRcdFx0XHRcdCBbbmdNb2RlbF09XCJzZWxlY3RlZEZhdm9yaXRlXCJcclxuXHRcdFx0XHRcdFx0XHRcdCAob25TZWxlY3QpPVwibG9hZEZhdm9yaXRlKCRldmVudClcIj48L3NsaWNrLWRyb3AtZG93bj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHRcdDxkaXY+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1sLTFcIiAoY2xpY2spPVwiYWRkTmV3RmF2b3JpdGUoKVwiPjxpIGNsYXNzPVwiZmFyIGZhLXBsdXNcIj48L2k+PC9idXR0b24+PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbXQtMVwiIHNsaWNrLWRyb3AtbGlzdCAob25TbGlja0Ryb3BMaXN0UmVvcmRlcik9XCJvbkNvbHVtblJlb3JkZXIoJGV2ZW50KVwiPlxyXG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uU2VsZWN0RGlhbG9nQ29sdW1uc1wiIGNsYXNzPVwiZC1mbGV4XCIgc2xpY2stZHJvcC1saXN0LWl0ZW0+XHJcblx0XHRcdFx0PGRpdiBzdHlsZT1cIndpZHRoOiAyMHB4XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDJweDtcIiBbKG5nTW9kZWwpXT1cImNvbHVtbi52aXNpYmxlXCIgLz48L2Rpdj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHktMCBmbGV4LWZpbGxcIiBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IGN1cnNvcjogbnMtcmVzaXplXCIgc2xpY2stZHJvcC1saXN0LWdyYWI+e3tjb2x1bW4udGl0bGV9fTwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cdDxzbGljay1kaWFsb2ctZm9vdGVyPlxyXG5cdFx0PGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgY2xhc3M9XCJjb2wtMTIgdGV4dC1jZW50ZXIgbWItMiBtdC0xXCI+XHJcblx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvblNhdmVDb2x1bW5zKClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTFcIj48aSBjbGFzcz1cImZhciBmYS1zYXZlXCI+PC9pPiZuYnNwO1NhdmU8L2J1dHRvbj4mbmJzcDtcclxuXHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKGNsaWNrKT1cIm9uQ2FuY2VsQ29sdW1ucygpXCI+Q2FuY2VsPC9idXR0b24+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L3NsaWNrLWRpYWxvZy1mb290ZXI+XHJcbjwvc2xpY2stZGlhbG9nPlxyXG5cclxuXHJcbjxzbGljay1jb25maXJtLWRpYWxvZyAjYWRkTmV3RmF2b3JpdGVEaWFsb2dSZWYgd2lkdGg9XCIzMDBcIj5cclxuXHQ8bGFiZWw+RW50ZXIgbmV3IGZhdm9yaXRlIG5hbWU8L2xhYmVsPlxyXG5cdDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG14LTNcIiBzdHlsZT1cIndpZHRoOiAyNTBweFwiIFsobmdNb2RlbCldPVwibmV3RmF2b3JpdGVUZXh0XCIgLz5cclxuPC9zbGljay1jb25maXJtLWRpYWxvZz4iXX0=
|