@angular/material 19.0.0-next.1 → 19.0.0-next.3
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/_index.scss +3 -4
- package/button/_button-base.scss +2 -2
- package/button/index.d.ts +2 -10
- package/checkbox/_checkbox-common.scss +4 -4
- package/checkbox/index.d.ts +0 -7
- package/chips/index.d.ts +1 -10
- package/core/_core.scss +1 -7
- package/core/focus-indicators/_private.scss +21 -82
- package/core/index.d.ts +10 -167
- package/core/ripple/_ripple.scss +1 -1
- package/core/style/_elevation.scss +1 -1
- package/core/style/_menu-common.scss +1 -1
- package/core/style/_sass-utils.scss +4 -0
- package/core/theming/_palettes.scss +132 -45
- package/core/tokens/_m3-system.scss +93 -20
- package/core/tokens/m3/definitions/_md-sys-color.scss +6 -6
- package/core/tokens/m3/mat/_sidenav.scss +0 -1
- package/fesm2022/autocomplete.mjs +14 -14
- package/fesm2022/autocomplete.mjs.map +1 -1
- package/fesm2022/badge.mjs +11 -11
- package/fesm2022/badge.mjs.map +1 -1
- package/fesm2022/bottom-sheet.mjs +11 -11
- package/fesm2022/bottom-sheet.mjs.map +1 -1
- package/fesm2022/button-toggle.mjs +11 -11
- package/fesm2022/button-toggle.mjs.map +1 -1
- package/fesm2022/button.mjs +42 -53
- package/fesm2022/button.mjs.map +1 -1
- package/fesm2022/card.mjs +46 -46
- package/fesm2022/checkbox.mjs +16 -19
- package/fesm2022/checkbox.mjs.map +1 -1
- package/fesm2022/chips.mjs +46 -57
- package/fesm2022/chips.mjs.map +1 -1
- package/fesm2022/core.mjs +122 -256
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/datepicker.mjs +87 -87
- package/fesm2022/datepicker.mjs.map +1 -1
- package/fesm2022/dialog.mjs +26 -26
- package/fesm2022/dialog.mjs.map +1 -1
- package/fesm2022/divider.mjs +7 -7
- package/fesm2022/expansion.mjs +28 -28
- package/fesm2022/expansion.mjs.map +1 -1
- package/fesm2022/form-field.mjs +36 -36
- package/fesm2022/form-field.mjs.map +1 -1
- package/fesm2022/grid-list.mjs +22 -22
- package/fesm2022/icon/testing.mjs +7 -7
- package/fesm2022/icon.mjs +10 -10
- package/fesm2022/input.mjs +7 -7
- package/fesm2022/list.mjs +59 -59
- package/fesm2022/list.mjs.map +1 -1
- package/fesm2022/menu.mjs +18 -18
- package/fesm2022/menu.mjs.map +1 -1
- package/fesm2022/paginator.mjs +11 -11
- package/fesm2022/paginator.mjs.map +1 -1
- package/fesm2022/progress-bar.mjs +8 -8
- package/fesm2022/progress-bar.mjs.map +1 -1
- package/fesm2022/progress-spinner.mjs +8 -8
- package/fesm2022/progress-spinner.mjs.map +1 -1
- package/fesm2022/radio.mjs +11 -11
- package/fesm2022/radio.mjs.map +1 -1
- package/fesm2022/select.mjs +12 -12
- package/fesm2022/select.mjs.map +1 -1
- package/fesm2022/sidenav.mjs +26 -26
- package/fesm2022/sidenav.mjs.map +1 -1
- package/fesm2022/slide-toggle.mjs +16 -16
- package/fesm2022/slide-toggle.mjs.map +1 -1
- package/fesm2022/slider.mjs +18 -18
- package/fesm2022/slider.mjs.map +1 -1
- package/fesm2022/snack-bar.mjs +23 -23
- package/fesm2022/snack-bar.mjs.map +1 -1
- package/fesm2022/sort.mjs +14 -14
- package/fesm2022/sort.mjs.map +1 -1
- package/fesm2022/stepper.mjs +33 -33
- package/fesm2022/stepper.mjs.map +1 -1
- package/fesm2022/table.mjs +57 -57
- package/fesm2022/table.mjs.map +1 -1
- package/fesm2022/tabs.mjs +48 -48
- package/fesm2022/tabs.mjs.map +1 -1
- package/fesm2022/toolbar.mjs +11 -11
- package/fesm2022/toolbar.mjs.map +1 -1
- package/fesm2022/tooltip.mjs +26 -17
- package/fesm2022/tooltip.mjs.map +1 -1
- package/fesm2022/tree.mjs +25 -25
- package/form-field/_form-field-high-contrast.scss +4 -4
- package/form-field/_mdc-text-field-structure.scss +2 -2
- package/list/_list-inherited-structure.scss +1 -1
- package/list/_list-item-hcm-indicator.scss +1 -1
- package/package.json +2 -146
- package/prebuilt-themes/azure-blue.css +1 -1
- package/prebuilt-themes/cyan-orange.css +1 -1
- package/prebuilt-themes/deeppurple-amber.css +1 -1
- package/prebuilt-themes/indigo-pink.css +1 -1
- package/prebuilt-themes/magenta-violet.css +1 -1
- package/prebuilt-themes/pink-bluegrey.css +1 -1
- package/prebuilt-themes/purple-green.css +1 -1
- package/prebuilt-themes/rose-red.css +1 -1
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-add/index.mjs +1 -1
- package/schematics/ng-generate/m3-theme/index_bundled.js +2 -2
- package/schematics/ng-update/index_bundled.js +27 -27
- package/tabs/_tabs-common.scss +2 -2
- package/tree/index.d.ts +2 -2
- package/core/focus-indicators/_focus-indicators-theme.scss +0 -11
- package/core/focus-indicators/_focus-indicators.scss +0 -6
- package/esm2022/autocomplete/animations.mjs +0 -24
- package/esm2022/autocomplete/autocomplete-origin.mjs +0 -31
- package/esm2022/autocomplete/autocomplete-trigger.mjs +0 -902
- package/esm2022/autocomplete/autocomplete.mjs +0 -238
- package/esm2022/autocomplete/autocomplete_public_index.mjs +0 -5
- package/esm2022/autocomplete/index.mjs +0 -9
- package/esm2022/autocomplete/module.mjs +0 -61
- package/esm2022/autocomplete/public-api.mjs +0 -14
- package/esm2022/autocomplete/testing/autocomplete-harness-filters.mjs +0 -9
- package/esm2022/autocomplete/testing/autocomplete-harness.mjs +0 -105
- package/esm2022/autocomplete/testing/index.mjs +0 -9
- package/esm2022/autocomplete/testing/public-api.mjs +0 -10
- package/esm2022/badge/badge-module.mjs +0 -27
- package/esm2022/badge/badge.mjs +0 -288
- package/esm2022/badge/badge_public_index.mjs +0 -5
- package/esm2022/badge/index.mjs +0 -9
- package/esm2022/badge/public-api.mjs +0 -10
- package/esm2022/badge/testing/badge-harness-filters.mjs +0 -9
- package/esm2022/badge/testing/badge-harness.mjs +0 -71
- package/esm2022/badge/testing/index.mjs +0 -9
- package/esm2022/badge/testing/public-api.mjs +0 -10
- package/esm2022/bottom-sheet/bottom-sheet-animations.mjs +0 -26
- package/esm2022/bottom-sheet/bottom-sheet-config.mjs +0 -48
- package/esm2022/bottom-sheet/bottom-sheet-container.mjs +0 -85
- package/esm2022/bottom-sheet/bottom-sheet-module.mjs +0 -28
- package/esm2022/bottom-sheet/bottom-sheet-ref.mjs +0 -104
- package/esm2022/bottom-sheet/bottom-sheet.mjs +0 -115
- package/esm2022/bottom-sheet/bottom-sheet_public_index.mjs +0 -5
- package/esm2022/bottom-sheet/index.mjs +0 -9
- package/esm2022/bottom-sheet/public-api.mjs +0 -14
- package/esm2022/bottom-sheet/testing/bottom-sheet-harness-filters.mjs +0 -9
- package/esm2022/bottom-sheet/testing/bottom-sheet-harness.mjs +0 -35
- package/esm2022/bottom-sheet/testing/index.mjs +0 -9
- package/esm2022/bottom-sheet/testing/public-api.mjs +0 -10
- package/esm2022/button/button-base.mjs +0 -230
- package/esm2022/button/button.mjs +0 -67
- package/esm2022/button/button_public_index.mjs +0 -5
- package/esm2022/button/fab.mjs +0 -166
- package/esm2022/button/icon-button.mjs +0 -56
- package/esm2022/button/index.mjs +0 -9
- package/esm2022/button/module.mjs +0 -65
- package/esm2022/button/public-api.mjs +0 -13
- package/esm2022/button/testing/button-harness-filters.mjs +0 -9
- package/esm2022/button/testing/button-harness.mjs +0 -80
- package/esm2022/button/testing/index.mjs +0 -9
- package/esm2022/button/testing/public-api.mjs +0 -10
- package/esm2022/button-toggle/button-toggle-module.mjs +0 -24
- package/esm2022/button-toggle/button-toggle.mjs +0 -651
- package/esm2022/button-toggle/button-toggle_public_index.mjs +0 -5
- package/esm2022/button-toggle/index.mjs +0 -9
- package/esm2022/button-toggle/public-api.mjs +0 -10
- package/esm2022/button-toggle/testing/button-toggle-group-harness-filters.mjs +0 -9
- package/esm2022/button-toggle/testing/button-toggle-group-harness.mjs +0 -47
- package/esm2022/button-toggle/testing/button-toggle-harness-filters.mjs +0 -9
- package/esm2022/button-toggle/testing/button-toggle-harness.mjs +0 -105
- package/esm2022/button-toggle/testing/index.mjs +0 -9
- package/esm2022/button-toggle/testing/public-api.mjs +0 -12
- package/esm2022/card/card.mjs +0 -273
- package/esm2022/card/card_public_index.mjs +0 -5
- package/esm2022/card/index.mjs +0 -9
- package/esm2022/card/module.mjs +0 -67
- package/esm2022/card/public-api.mjs +0 -10
- package/esm2022/card/testing/card-harness-filters.mjs +0 -9
- package/esm2022/card/testing/card-harness.mjs +0 -50
- package/esm2022/card/testing/index.mjs +0 -9
- package/esm2022/card/testing/public-api.mjs +0 -10
- package/esm2022/checkbox/checkbox-config.mjs +0 -22
- package/esm2022/checkbox/checkbox-required-validator.mjs +0 -41
- package/esm2022/checkbox/checkbox.mjs +0 -443
- package/esm2022/checkbox/checkbox_public_index.mjs +0 -5
- package/esm2022/checkbox/index.mjs +0 -9
- package/esm2022/checkbox/module.mjs +0 -41
- package/esm2022/checkbox/public-api.mjs +0 -12
- package/esm2022/checkbox/testing/checkbox-harness-filters.mjs +0 -9
- package/esm2022/checkbox/testing/checkbox-harness.mjs +0 -138
- package/esm2022/checkbox/testing/index.mjs +0 -9
- package/esm2022/checkbox/testing/public-api.mjs +0 -9
- package/esm2022/chips/chip-action.mjs +0 -113
- package/esm2022/chips/chip-edit-input.mjs +0 -61
- package/esm2022/chips/chip-grid.mjs +0 -420
- package/esm2022/chips/chip-icons.mjs +0 -107
- package/esm2022/chips/chip-input.mjs +0 -192
- package/esm2022/chips/chip-listbox.mjs +0 -369
- package/esm2022/chips/chip-option.mjs +0 -190
- package/esm2022/chips/chip-row.mjs +0 -173
- package/esm2022/chips/chip-set.mjs +0 -283
- package/esm2022/chips/chip-text-control.mjs +0 -9
- package/esm2022/chips/chip.mjs +0 -322
- package/esm2022/chips/chips_public_index.mjs +0 -5
- package/esm2022/chips/index.mjs +0 -9
- package/esm2022/chips/module.mjs +0 -85
- package/esm2022/chips/public-api.mjs +0 -20
- package/esm2022/chips/testing/chip-avatar-harness.mjs +0 -22
- package/esm2022/chips/testing/chip-edit-input-harness.mjs +0 -33
- package/esm2022/chips/testing/chip-grid-harness.mjs +0 -45
- package/esm2022/chips/testing/chip-harness-filters.mjs +0 -9
- package/esm2022/chips/testing/chip-harness.mjs +0 -62
- package/esm2022/chips/testing/chip-input-harness.mjs +0 -85
- package/esm2022/chips/testing/chip-listbox-harness.mjs +0 -61
- package/esm2022/chips/testing/chip-option-harness.mjs +0 -45
- package/esm2022/chips/testing/chip-remove-harness.mjs +0 -26
- package/esm2022/chips/testing/chip-row-harness.mjs +0 -40
- package/esm2022/chips/testing/chip-set-harness.mjs +0 -26
- package/esm2022/chips/testing/index.mjs +0 -9
- package/esm2022/chips/testing/public-api.mjs +0 -19
- package/esm2022/chips/tokens.mjs +0 -39
- package/esm2022/core/animation/animation.mjs +0 -21
- package/esm2022/core/common-behaviors/color.mjs +0 -33
- package/esm2022/core/common-behaviors/common-module.mjs +0 -127
- package/esm2022/core/common-behaviors/constructor.mjs +0 -9
- package/esm2022/core/common-behaviors/disable-ripple.mjs +0 -24
- package/esm2022/core/common-behaviors/disabled.mjs +0 -23
- package/esm2022/core/common-behaviors/error-state.mjs +0 -66
- package/esm2022/core/common-behaviors/index.mjs +0 -15
- package/esm2022/core/common-behaviors/initialized.mjs +0 -62
- package/esm2022/core/common-behaviors/tabindex.mjs +0 -25
- package/esm2022/core/core_public_index.mjs +0 -5
- package/esm2022/core/datetime/date-adapter.mjs +0 -109
- package/esm2022/core/datetime/date-formats.mjs +0 -10
- package/esm2022/core/datetime/index.mjs +0 -46
- package/esm2022/core/datetime/native-date-adapter.mjs +0 -221
- package/esm2022/core/datetime/native-date-formats.mjs +0 -19
- package/esm2022/core/error/error-options.mjs +0 -33
- package/esm2022/core/index.mjs +0 -9
- package/esm2022/core/internal-form-field/internal-form-field.mjs +0 -29
- package/esm2022/core/line/line.mjs +0 -64
- package/esm2022/core/option/index.mjs +0 -30
- package/esm2022/core/option/optgroup.mjs +0 -71
- package/esm2022/core/option/option-parent.mjs +0 -13
- package/esm2022/core/option/option.mjs +0 -283
- package/esm2022/core/private/index.mjs +0 -9
- package/esm2022/core/private/ripple-loader.mjs +0 -160
- package/esm2022/core/public-api.mjs +0 -19
- package/esm2022/core/ripple/index.mjs +0 -27
- package/esm2022/core/ripple/ripple-event-manager.mjs +0 -69
- package/esm2022/core/ripple/ripple-ref.mjs +0 -39
- package/esm2022/core/ripple/ripple-renderer.mjs +0 -354
- package/esm2022/core/ripple/ripple.mjs +0 -156
- package/esm2022/core/selection/index.mjs +0 -10
- package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox-module.mjs +0 -24
- package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +0 -62
- package/esm2022/core/testing/index.mjs +0 -9
- package/esm2022/core/testing/optgroup-harness-filters.mjs +0 -9
- package/esm2022/core/testing/optgroup-harness.mjs +0 -43
- package/esm2022/core/testing/option-harness-filters.mjs +0 -9
- package/esm2022/core/testing/option-harness.mjs +0 -53
- package/esm2022/core/testing/public-api.mjs +0 -12
- package/esm2022/core/version.mjs +0 -11
- package/esm2022/datepicker/aria-accessible-name.mjs +0 -159
- package/esm2022/datepicker/calendar-body.mjs +0 -509
- package/esm2022/datepicker/calendar.mjs +0 -426
- package/esm2022/datepicker/date-range-input-parts.mjs +0 -372
- package/esm2022/datepicker/date-range-input.mjs +0 -369
- package/esm2022/datepicker/date-range-picker.mjs +0 -51
- package/esm2022/datepicker/date-range-selection-strategy.mjs +0 -97
- package/esm2022/datepicker/date-selection-model.mjs +0 -188
- package/esm2022/datepicker/datepicker-actions.mjs +0 -91
- package/esm2022/datepicker/datepicker-animations.mjs +0 -35
- package/esm2022/datepicker/datepicker-base.mjs +0 -609
- package/esm2022/datepicker/datepicker-errors.mjs +0 -14
- package/esm2022/datepicker/datepicker-input-base.mjs +0 -311
- package/esm2022/datepicker/datepicker-input.mjs +0 -200
- package/esm2022/datepicker/datepicker-intl.mjs +0 -69
- package/esm2022/datepicker/datepicker-module.mjs +0 -138
- package/esm2022/datepicker/datepicker-toggle.mjs +0 -113
- package/esm2022/datepicker/datepicker.mjs +0 -38
- package/esm2022/datepicker/datepicker_public_index.mjs +0 -5
- package/esm2022/datepicker/index.mjs +0 -9
- package/esm2022/datepicker/month-view.mjs +0 -460
- package/esm2022/datepicker/multi-year-view.mjs +0 -330
- package/esm2022/datepicker/public-api.mjs +0 -27
- package/esm2022/datepicker/testing/calendar-cell-harness.mjs +0 -138
- package/esm2022/datepicker/testing/calendar-harness.mjs +0 -83
- package/esm2022/datepicker/testing/date-range-input-harness.mjs +0 -98
- package/esm2022/datepicker/testing/datepicker-harness-filters.mjs +0 -9
- package/esm2022/datepicker/testing/datepicker-input-harness-base.mjs +0 -81
- package/esm2022/datepicker/testing/datepicker-input-harness.mjs +0 -58
- package/esm2022/datepicker/testing/datepicker-toggle-harness.mjs +0 -41
- package/esm2022/datepicker/testing/datepicker-trigger-harness-base.mjs +0 -65
- package/esm2022/datepicker/testing/index.mjs +0 -9
- package/esm2022/datepicker/testing/public-api.mjs +0 -14
- package/esm2022/datepicker/year-view.mjs +0 -324
- package/esm2022/dialog/dialog-animations.mjs +0 -38
- package/esm2022/dialog/dialog-config.mjs +0 -59
- package/esm2022/dialog/dialog-container.mjs +0 -253
- package/esm2022/dialog/dialog-content-directives.mjs +0 -212
- package/esm2022/dialog/dialog-ref.mjs +0 -177
- package/esm2022/dialog/dialog.mjs +0 -212
- package/esm2022/dialog/dialog_public_index.mjs +0 -5
- package/esm2022/dialog/index.mjs +0 -9
- package/esm2022/dialog/module.mjs +0 -45
- package/esm2022/dialog/public-api.mjs +0 -15
- package/esm2022/dialog/testing/dialog-harness-filters.mjs +0 -9
- package/esm2022/dialog/testing/dialog-harness.mjs +0 -84
- package/esm2022/dialog/testing/dialog-opener.mjs +0 -58
- package/esm2022/dialog/testing/index.mjs +0 -10
- package/esm2022/dialog/testing/public-api.mjs +0 -10
- package/esm2022/divider/divider-module.mjs +0 -24
- package/esm2022/divider/divider.mjs +0 -48
- package/esm2022/divider/divider_public_index.mjs +0 -5
- package/esm2022/divider/index.mjs +0 -9
- package/esm2022/divider/public-api.mjs +0 -10
- package/esm2022/divider/testing/divider-harness-filters.mjs +0 -9
- package/esm2022/divider/testing/divider-harness.mjs +0 -22
- package/esm2022/divider/testing/index.mjs +0 -9
- package/esm2022/divider/testing/public-api.mjs +0 -10
- package/esm2022/expansion/accordion-base.mjs +0 -14
- package/esm2022/expansion/accordion.mjs +0 -96
- package/esm2022/expansion/expansion-animations.mjs +0 -51
- package/esm2022/expansion/expansion-module.mjs +0 -65
- package/esm2022/expansion/expansion-panel-base.mjs +0 -14
- package/esm2022/expansion/expansion-panel-content.mjs +0 -35
- package/esm2022/expansion/expansion-panel-header.mjs +0 -218
- package/esm2022/expansion/expansion-panel.mjs +0 -211
- package/esm2022/expansion/expansion_public_index.mjs +0 -5
- package/esm2022/expansion/index.mjs +0 -9
- package/esm2022/expansion/public-api.mjs +0 -16
- package/esm2022/expansion/testing/accordion-harness.mjs +0 -31
- package/esm2022/expansion/testing/expansion-harness-filters.mjs +0 -9
- package/esm2022/expansion/testing/expansion-harness.mjs +0 -128
- package/esm2022/expansion/testing/index.mjs +0 -9
- package/esm2022/expansion/testing/public-api.mjs +0 -11
- package/esm2022/form-field/directives/error.mjs +0 -48
- package/esm2022/form-field/directives/floating-label.mjs +0 -135
- package/esm2022/form-field/directives/hint.mjs +0 -40
- package/esm2022/form-field/directives/label.mjs +0 -22
- package/esm2022/form-field/directives/line-ripple.mjs +0 -60
- package/esm2022/form-field/directives/notched-outline.mjs +0 -66
- package/esm2022/form-field/directives/prefix.mjs +0 -38
- package/esm2022/form-field/directives/suffix.mjs +0 -38
- package/esm2022/form-field/form-field-animations.mjs +0 -24
- package/esm2022/form-field/form-field-control.mjs +0 -11
- package/esm2022/form-field/form-field-errors.mjs +0 -20
- package/esm2022/form-field/form-field.mjs +0 -620
- package/esm2022/form-field/form-field_public_index.mjs +0 -5
- package/esm2022/form-field/index.mjs +0 -9
- package/esm2022/form-field/module.mjs +0 -51
- package/esm2022/form-field/public-api.mjs +0 -18
- package/esm2022/form-field/testing/control/form-field-control-harness.mjs +0 -15
- package/esm2022/form-field/testing/control/index.mjs +0 -9
- package/esm2022/form-field/testing/error-harness.mjs +0 -29
- package/esm2022/form-field/testing/form-field-harness-filters.mjs +0 -9
- package/esm2022/form-field/testing/form-field-harness.mjs +0 -179
- package/esm2022/form-field/testing/index.mjs +0 -9
- package/esm2022/form-field/testing/public-api.mjs +0 -15
- package/esm2022/grid-list/grid-list-base.mjs +0 -14
- package/esm2022/grid-list/grid-list-module.mjs +0 -59
- package/esm2022/grid-list/grid-list.mjs +0 -146
- package/esm2022/grid-list/grid-list_public_index.mjs +0 -5
- package/esm2022/grid-list/grid-tile.mjs +0 -128
- package/esm2022/grid-list/index.mjs +0 -9
- package/esm2022/grid-list/public-api.mjs +0 -14
- package/esm2022/grid-list/testing/grid-list-harness-filters.mjs +0 -9
- package/esm2022/grid-list/testing/grid-list-harness.mjs +0 -76
- package/esm2022/grid-list/testing/grid-tile-harness.mjs +0 -71
- package/esm2022/grid-list/testing/index.mjs +0 -9
- package/esm2022/grid-list/testing/public-api.mjs +0 -11
- package/esm2022/grid-list/tile-coordinator.mjs +0 -145
- package/esm2022/grid-list/tile-styler.mjs +0 -231
- package/esm2022/icon/fake-svgs.mjs +0 -62
- package/esm2022/icon/icon-module.mjs +0 -24
- package/esm2022/icon/icon-registry.mjs +0 -592
- package/esm2022/icon/icon.mjs +0 -379
- package/esm2022/icon/icon_public_index.mjs +0 -5
- package/esm2022/icon/index.mjs +0 -9
- package/esm2022/icon/public-api.mjs +0 -11
- package/esm2022/icon/testing/fake-icon-registry.mjs +0 -92
- package/esm2022/icon/testing/icon-harness-filters.mjs +0 -14
- package/esm2022/icon/testing/icon-harness.mjs +0 -60
- package/esm2022/icon/testing/index.mjs +0 -9
- package/esm2022/icon/testing/public-api.mjs +0 -11
- package/esm2022/icon/testing/testing_public_index.mjs +0 -5
- package/esm2022/icon/trusted-types.mjs +0 -43
- package/esm2022/index.mjs +0 -14
- package/esm2022/input/index.mjs +0 -9
- package/esm2022/input/input-errors.mjs +0 -12
- package/esm2022/input/input-value-accessor.mjs +0 -16
- package/esm2022/input/input.mjs +0 -524
- package/esm2022/input/input_public_index.mjs +0 -5
- package/esm2022/input/module.mjs +0 -26
- package/esm2022/input/public-api.mjs +0 -14
- package/esm2022/input/testing/index.mjs +0 -9
- package/esm2022/input/testing/input-harness-filters.mjs +0 -9
- package/esm2022/input/testing/input-harness.mjs +0 -119
- package/esm2022/input/testing/native-option-harness.mjs +0 -42
- package/esm2022/input/testing/native-select-harness-filters.mjs +0 -9
- package/esm2022/input/testing/native-select-harness.mjs +0 -79
- package/esm2022/input/testing/public-api.mjs +0 -13
- package/esm2022/list/action-list.mjs +0 -31
- package/esm2022/list/index.mjs +0 -9
- package/esm2022/list/list-base.mjs +0 -284
- package/esm2022/list/list-item-sections.mjs +0 -144
- package/esm2022/list/list-module.mjs +0 -97
- package/esm2022/list/list-option-types.mjs +0 -16
- package/esm2022/list/list-option.mjs +0 -295
- package/esm2022/list/list.mjs +0 -103
- package/esm2022/list/list_public_index.mjs +0 -5
- package/esm2022/list/nav-list.mjs +0 -37
- package/esm2022/list/public-api.mjs +0 -18
- package/esm2022/list/selection-list.mjs +0 -391
- package/esm2022/list/subheader.mjs +0 -28
- package/esm2022/list/testing/action-list-harness.mjs +0 -59
- package/esm2022/list/testing/index.mjs +0 -9
- package/esm2022/list/testing/list-harness-base.mjs +0 -95
- package/esm2022/list/testing/list-harness-filters.mjs +0 -9
- package/esm2022/list/testing/list-harness.mjs +0 -41
- package/esm2022/list/testing/list-item-harness-base.mjs +0 -162
- package/esm2022/list/testing/nav-list-harness.mjs +0 -69
- package/esm2022/list/testing/public-api.mjs +0 -14
- package/esm2022/list/testing/selection-list-harness.mjs +0 -122
- package/esm2022/list/tokens.mjs +0 -11
- package/esm2022/menu/index.mjs +0 -9
- package/esm2022/menu/menu-animations.mjs +0 -61
- package/esm2022/menu/menu-content.mjs +0 -87
- package/esm2022/menu/menu-errors.mjs +0 -35
- package/esm2022/menu/menu-item.mjs +0 -148
- package/esm2022/menu/menu-panel.mjs +0 -14
- package/esm2022/menu/menu-positions.mjs +0 -9
- package/esm2022/menu/menu-trigger.mjs +0 -542
- package/esm2022/menu/menu.mjs +0 -405
- package/esm2022/menu/menu_public_index.mjs +0 -5
- package/esm2022/menu/module.mjs +0 -63
- package/esm2022/menu/public-api.mjs +0 -16
- package/esm2022/menu/testing/index.mjs +0 -9
- package/esm2022/menu/testing/menu-harness-filters.mjs +0 -9
- package/esm2022/menu/testing/menu-harness.mjs +0 -166
- package/esm2022/menu/testing/public-api.mjs +0 -10
- package/esm2022/paginator/index.mjs +0 -9
- package/esm2022/paginator/module.mjs +0 -28
- package/esm2022/paginator/paginator-intl.mjs +0 -62
- package/esm2022/paginator/paginator.mjs +0 -266
- package/esm2022/paginator/paginator_public_index.mjs +0 -5
- package/esm2022/paginator/public-api.mjs +0 -11
- package/esm2022/paginator/testing/index.mjs +0 -9
- package/esm2022/paginator/testing/paginator-harness-filters.mjs +0 -9
- package/esm2022/paginator/testing/paginator-harness.mjs +0 -98
- package/esm2022/paginator/testing/public-api.mjs +0 -10
- package/esm2022/progress-bar/index.mjs +0 -9
- package/esm2022/progress-bar/module.mjs +0 -24
- package/esm2022/progress-bar/progress-bar.mjs +0 -181
- package/esm2022/progress-bar/progress-bar_public_index.mjs +0 -5
- package/esm2022/progress-bar/public-api.mjs +0 -10
- package/esm2022/progress-bar/testing/index.mjs +0 -9
- package/esm2022/progress-bar/testing/progress-bar-harness-filters.mjs +0 -9
- package/esm2022/progress-bar/testing/progress-bar-harness.mjs +0 -33
- package/esm2022/progress-bar/testing/public-api.mjs +0 -10
- package/esm2022/progress-bar/testing/testing_public_index.mjs +0 -5
- package/esm2022/progress-spinner/index.mjs +0 -9
- package/esm2022/progress-spinner/module.mjs +0 -25
- package/esm2022/progress-spinner/progress-spinner.mjs +0 -166
- package/esm2022/progress-spinner/progress-spinner_public_index.mjs +0 -5
- package/esm2022/progress-spinner/public-api.mjs +0 -10
- package/esm2022/progress-spinner/testing/index.mjs +0 -9
- package/esm2022/progress-spinner/testing/progress-spinner-harness-filters.mjs +0 -9
- package/esm2022/progress-spinner/testing/progress-spinner-harness.mjs +0 -35
- package/esm2022/progress-spinner/testing/public-api.mjs +0 -10
- package/esm2022/progress-spinner/testing/testing_public_index.mjs +0 -5
- package/esm2022/radio/index.mjs +0 -9
- package/esm2022/radio/module.mjs +0 -25
- package/esm2022/radio/public-api.mjs +0 -10
- package/esm2022/radio/radio.mjs +0 -680
- package/esm2022/radio/radio_public_index.mjs +0 -5
- package/esm2022/radio/testing/index.mjs +0 -9
- package/esm2022/radio/testing/public-api.mjs +0 -10
- package/esm2022/radio/testing/radio-harness-filters.mjs +0 -9
- package/esm2022/radio/testing/radio-harness.mjs +0 -228
- package/esm2022/select/index.mjs +0 -9
- package/esm2022/select/module.mjs +0 -59
- package/esm2022/select/public-api.mjs +0 -15
- package/esm2022/select/select-animations.mjs +0 -38
- package/esm2022/select/select-errors.mjs +0 -35
- package/esm2022/select/select.mjs +0 -1160
- package/esm2022/select/select_public_index.mjs +0 -5
- package/esm2022/select/testing/index.mjs +0 -9
- package/esm2022/select/testing/public-api.mjs +0 -10
- package/esm2022/select/testing/select-harness-filters.mjs +0 -9
- package/esm2022/select/testing/select-harness.mjs +0 -129
- package/esm2022/sidenav/drawer-animations.mjs +0 -33
- package/esm2022/sidenav/drawer.mjs +0 -863
- package/esm2022/sidenav/index.mjs +0 -9
- package/esm2022/sidenav/public-api.mjs +0 -12
- package/esm2022/sidenav/sidenav-module.mjs +0 -60
- package/esm2022/sidenav/sidenav.mjs +0 -148
- package/esm2022/sidenav/sidenav_public_index.mjs +0 -5
- package/esm2022/sidenav/testing/drawer-container-harness.mjs +0 -36
- package/esm2022/sidenav/testing/drawer-content-harness.mjs +0 -23
- package/esm2022/sidenav/testing/drawer-harness-filters.mjs +0 -9
- package/esm2022/sidenav/testing/drawer-harness.mjs +0 -49
- package/esm2022/sidenav/testing/index.mjs +0 -9
- package/esm2022/sidenav/testing/public-api.mjs +0 -15
- package/esm2022/sidenav/testing/sidenav-container-harness.mjs +0 -36
- package/esm2022/sidenav/testing/sidenav-content-harness.mjs +0 -23
- package/esm2022/sidenav/testing/sidenav-harness.mjs +0 -28
- package/esm2022/slide-toggle/index.mjs +0 -9
- package/esm2022/slide-toggle/module.mjs +0 -41
- package/esm2022/slide-toggle/public-api.mjs +0 -12
- package/esm2022/slide-toggle/slide-toggle-config.mjs +0 -14
- package/esm2022/slide-toggle/slide-toggle-required-validator.mjs +0 -44
- package/esm2022/slide-toggle/slide-toggle.mjs +0 -273
- package/esm2022/slide-toggle/slide-toggle_public_index.mjs +0 -5
- package/esm2022/slide-toggle/testing/index.mjs +0 -9
- package/esm2022/slide-toggle/testing/public-api.mjs +0 -10
- package/esm2022/slide-toggle/testing/slide-toggle-harness-filters.mjs +0 -9
- package/esm2022/slide-toggle/testing/slide-toggle-harness.mjs +0 -110
- package/esm2022/slider/index.mjs +0 -9
- package/esm2022/slider/module.mjs +0 -39
- package/esm2022/slider/public-api.mjs +0 -13
- package/esm2022/slider/slider-input.mjs +0 -701
- package/esm2022/slider/slider-interface.mjs +0 -56
- package/esm2022/slider/slider-thumb.mjs +0 -231
- package/esm2022/slider/slider.mjs +0 -746
- package/esm2022/slider/slider_public_index.mjs +0 -5
- package/esm2022/slider/testing/index.mjs +0 -9
- package/esm2022/slider/testing/public-api.mjs +0 -11
- package/esm2022/slider/testing/slider-harness-filters.mjs +0 -7
- package/esm2022/slider/testing/slider-harness.mjs +0 -67
- package/esm2022/slider/testing/slider-thumb-harness.mjs +0 -95
- package/esm2022/snack-bar/index.mjs +0 -9
- package/esm2022/snack-bar/module.mjs +0 -47
- package/esm2022/snack-bar/public-api.mjs +0 -16
- package/esm2022/snack-bar/simple-snack-bar.mjs +0 -40
- package/esm2022/snack-bar/snack-bar-animations.mjs +0 -30
- package/esm2022/snack-bar/snack-bar-config.mjs +0 -33
- package/esm2022/snack-bar/snack-bar-container.mjs +0 -277
- package/esm2022/snack-bar/snack-bar-content.mjs +0 -55
- package/esm2022/snack-bar/snack-bar-ref.mjs +0 -89
- package/esm2022/snack-bar/snack-bar.mjs +0 -267
- package/esm2022/snack-bar/snack-bar_public_index.mjs +0 -5
- package/esm2022/snack-bar/testing/index.mjs +0 -9
- package/esm2022/snack-bar/testing/public-api.mjs +0 -10
- package/esm2022/snack-bar/testing/snack-bar-harness-filters.mjs +0 -9
- package/esm2022/snack-bar/testing/snack-bar-harness.mjs +0 -101
- package/esm2022/sort/index.mjs +0 -9
- package/esm2022/sort/public-api.mjs +0 -14
- package/esm2022/sort/sort-animations.mjs +0 -69
- package/esm2022/sort/sort-direction.mjs +0 -9
- package/esm2022/sort/sort-errors.mjs +0 -24
- package/esm2022/sort/sort-header-intl.mjs +0 -41
- package/esm2022/sort/sort-header.mjs +0 -317
- package/esm2022/sort/sort-module.mjs +0 -27
- package/esm2022/sort/sort.mjs +0 -155
- package/esm2022/sort/sort_public_index.mjs +0 -5
- package/esm2022/sort/testing/index.mjs +0 -9
- package/esm2022/sort/testing/public-api.mjs +0 -11
- package/esm2022/sort/testing/sort-harness-filters.mjs +0 -2
- package/esm2022/sort/testing/sort-harness.mjs +0 -36
- package/esm2022/sort/testing/sort-header-harness.mjs +0 -56
- package/esm2022/stepper/index.mjs +0 -9
- package/esm2022/stepper/public-api.mjs +0 -17
- package/esm2022/stepper/step-content.mjs +0 -27
- package/esm2022/stepper/step-header.mjs +0 -105
- package/esm2022/stepper/step-label.mjs +0 -22
- package/esm2022/stepper/stepper-animations.mjs +0 -47
- package/esm2022/stepper/stepper-button.mjs +0 -43
- package/esm2022/stepper/stepper-icon.mjs +0 -30
- package/esm2022/stepper/stepper-intl.mjs +0 -43
- package/esm2022/stepper/stepper-module.mjs +0 -88
- package/esm2022/stepper/stepper.mjs +0 -205
- package/esm2022/stepper/stepper_public_index.mjs +0 -5
- package/esm2022/stepper/testing/index.mjs +0 -9
- package/esm2022/stepper/testing/public-api.mjs +0 -12
- package/esm2022/stepper/testing/step-harness-filters.mjs +0 -7
- package/esm2022/stepper/testing/step-harness.mjs +0 -90
- package/esm2022/stepper/testing/stepper-button-harnesses.mjs +0 -48
- package/esm2022/stepper/testing/stepper-harness.mjs +0 -51
- package/esm2022/table/cell.mjs +0 -147
- package/esm2022/table/index.mjs +0 -9
- package/esm2022/table/module.mjs +0 -93
- package/esm2022/table/public-api.mjs +0 -14
- package/esm2022/table/row.mjs +0 -163
- package/esm2022/table/table-data-source.mjs +0 -317
- package/esm2022/table/table.mjs +0 -122
- package/esm2022/table/table_public_index.mjs +0 -5
- package/esm2022/table/testing/cell-harness.mjs +0 -77
- package/esm2022/table/testing/index.mjs +0 -9
- package/esm2022/table/testing/public-api.mjs +0 -12
- package/esm2022/table/testing/row-harness.mjs +0 -84
- package/esm2022/table/testing/table-harness-filters.mjs +0 -2
- package/esm2022/table/testing/table-harness.mjs +0 -86
- package/esm2022/table/text-column.mjs +0 -60
- package/esm2022/tabs/index.mjs +0 -9
- package/esm2022/tabs/ink-bar.mjs +0 -149
- package/esm2022/tabs/module.mjs +0 -60
- package/esm2022/tabs/paginated-tab-header.mjs +0 -539
- package/esm2022/tabs/public-api.mjs +0 -21
- package/esm2022/tabs/tab-body.mjs +0 -199
- package/esm2022/tabs/tab-config.mjs +0 -11
- package/esm2022/tabs/tab-content.mjs +0 -32
- package/esm2022/tabs/tab-group.mjs +0 -469
- package/esm2022/tabs/tab-header.mjs +0 -86
- package/esm2022/tabs/tab-label-wrapper.mjs +0 -49
- package/esm2022/tabs/tab-label.mjs +0 -44
- package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +0 -388
- package/esm2022/tabs/tab.mjs +0 -128
- package/esm2022/tabs/tabs-animations.mjs +0 -45
- package/esm2022/tabs/tabs_public_index.mjs +0 -5
- package/esm2022/tabs/testing/index.mjs +0 -9
- package/esm2022/tabs/testing/public-api.mjs +0 -13
- package/esm2022/tabs/testing/tab-group-harness.mjs +0 -56
- package/esm2022/tabs/testing/tab-harness-filters.mjs +0 -2
- package/esm2022/tabs/testing/tab-harness.mjs +0 -66
- package/esm2022/tabs/testing/tab-link-harness.mjs +0 -40
- package/esm2022/tabs/testing/tab-nav-bar-harness.mjs +0 -66
- package/esm2022/tabs/testing/tab-nav-panel-harness.mjs +0 -27
- package/esm2022/toolbar/index.mjs +0 -9
- package/esm2022/toolbar/public-api.mjs +0 -10
- package/esm2022/toolbar/testing/index.mjs +0 -9
- package/esm2022/toolbar/testing/public-api.mjs +0 -10
- package/esm2022/toolbar/testing/toolbar-harness-filters.mjs +0 -9
- package/esm2022/toolbar/testing/toolbar-harness.mjs +0 -44
- package/esm2022/toolbar/toolbar-module.mjs +0 -24
- package/esm2022/toolbar/toolbar.mjs +0 -84
- package/esm2022/toolbar/toolbar_public_index.mjs +0 -5
- package/esm2022/tooltip/index.mjs +0 -9
- package/esm2022/tooltip/module.mjs +0 -29
- package/esm2022/tooltip/public-api.mjs +0 -11
- package/esm2022/tooltip/testing/index.mjs +0 -9
- package/esm2022/tooltip/testing/public-api.mjs +0 -10
- package/esm2022/tooltip/testing/tooltip-harness-filters.mjs +0 -9
- package/esm2022/tooltip/testing/tooltip-harness.mjs +0 -66
- package/esm2022/tooltip/tooltip-animations.mjs +0 -24
- package/esm2022/tooltip/tooltip.mjs +0 -920
- package/esm2022/tooltip/tooltip_public_index.mjs +0 -5
- package/esm2022/tree/data-source/flat-data-source.mjs +0 -156
- package/esm2022/tree/data-source/nested-data-source.mjs +0 -38
- package/esm2022/tree/index.mjs +0 -9
- package/esm2022/tree/node.mjs +0 -220
- package/esm2022/tree/outlet.mjs +0 -46
- package/esm2022/tree/padding.mjs +0 -46
- package/esm2022/tree/public-api.mjs +0 -16
- package/esm2022/tree/testing/index.mjs +0 -9
- package/esm2022/tree/testing/node-harness.mjs +0 -73
- package/esm2022/tree/testing/public-api.mjs +0 -11
- package/esm2022/tree/testing/tree-harness-filters.mjs +0 -9
- package/esm2022/tree/testing/tree-harness.mjs +0 -123
- package/esm2022/tree/toggle.mjs +0 -27
- package/esm2022/tree/tree-module.mjs +0 -50
- package/esm2022/tree/tree.mjs +0 -34
- package/esm2022/tree/tree_public_index.mjs +0 -5
|
@@ -1,863 +0,0 @@
|
|
|
1
|
-
import { FocusMonitor, FocusTrapFactory, InteractivityChecker, } from '@angular/cdk/a11y';
|
|
2
|
-
import { Directionality } from '@angular/cdk/bidi';
|
|
3
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
4
|
-
import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
|
|
5
|
-
import { Platform } from '@angular/cdk/platform';
|
|
6
|
-
import { CdkScrollable, ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';
|
|
7
|
-
import { DOCUMENT } from '@angular/common';
|
|
8
|
-
import { afterNextRender, AfterRenderPhase, ANIMATION_MODULE_TYPE, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, forwardRef, inject, Inject, InjectionToken, Injector, Input, NgZone, Optional, Output, QueryList, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
9
|
-
import { fromEvent, merge, Observable, Subject } from 'rxjs';
|
|
10
|
-
import { debounceTime, distinctUntilChanged, filter, map, mapTo, startWith, take, takeUntil, } from 'rxjs/operators';
|
|
11
|
-
import { matDrawerAnimations } from './drawer-animations';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/cdk/scrolling";
|
|
14
|
-
import * as i2 from "@angular/cdk/a11y";
|
|
15
|
-
import * as i3 from "@angular/cdk/platform";
|
|
16
|
-
import * as i4 from "@angular/cdk/bidi";
|
|
17
|
-
/**
|
|
18
|
-
* Throws an exception when two MatDrawer are matching the same position.
|
|
19
|
-
* @docs-private
|
|
20
|
-
*/
|
|
21
|
-
export function throwMatDuplicatedDrawerError(position) {
|
|
22
|
-
throw Error(`A drawer was already declared for 'position="${position}"'`);
|
|
23
|
-
}
|
|
24
|
-
/** Configures whether drawers should use auto sizing by default. */
|
|
25
|
-
export const MAT_DRAWER_DEFAULT_AUTOSIZE = new InjectionToken('MAT_DRAWER_DEFAULT_AUTOSIZE', {
|
|
26
|
-
providedIn: 'root',
|
|
27
|
-
factory: MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY,
|
|
28
|
-
});
|
|
29
|
-
/**
|
|
30
|
-
* Used to provide a drawer container to a drawer while avoiding circular references.
|
|
31
|
-
* @docs-private
|
|
32
|
-
*/
|
|
33
|
-
export const MAT_DRAWER_CONTAINER = new InjectionToken('MAT_DRAWER_CONTAINER');
|
|
34
|
-
/** @docs-private */
|
|
35
|
-
export function MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY() {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
export class MatDrawerContent extends CdkScrollable {
|
|
39
|
-
constructor(_changeDetectorRef, _container, elementRef, scrollDispatcher, ngZone) {
|
|
40
|
-
super(elementRef, scrollDispatcher, ngZone);
|
|
41
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
42
|
-
this._container = _container;
|
|
43
|
-
}
|
|
44
|
-
ngAfterContentInit() {
|
|
45
|
-
this._container._contentMarginChanges.subscribe(() => {
|
|
46
|
-
this._changeDetectorRef.markForCheck();
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDrawerContent, deps: [{ token: i0.ChangeDetectorRef }, { token: forwardRef(() => MatDrawerContainer) }, { token: i0.ElementRef }, { token: i1.ScrollDispatcher }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
50
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0-next.2", type: MatDrawerContent, isStandalone: true, selector: "mat-drawer-content", host: { properties: { "style.margin-left.px": "_container._contentMargins.left", "style.margin-right.px": "_container._contentMargins.right" }, classAttribute: "mat-drawer-content" }, providers: [
|
|
51
|
-
{
|
|
52
|
-
provide: CdkScrollable,
|
|
53
|
-
useExisting: MatDrawerContent,
|
|
54
|
-
},
|
|
55
|
-
], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
56
|
-
}
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDrawerContent, decorators: [{
|
|
58
|
-
type: Component,
|
|
59
|
-
args: [{
|
|
60
|
-
selector: 'mat-drawer-content',
|
|
61
|
-
template: '<ng-content></ng-content>',
|
|
62
|
-
host: {
|
|
63
|
-
'class': 'mat-drawer-content',
|
|
64
|
-
'[style.margin-left.px]': '_container._contentMargins.left',
|
|
65
|
-
'[style.margin-right.px]': '_container._contentMargins.right',
|
|
66
|
-
},
|
|
67
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
68
|
-
encapsulation: ViewEncapsulation.None,
|
|
69
|
-
providers: [
|
|
70
|
-
{
|
|
71
|
-
provide: CdkScrollable,
|
|
72
|
-
useExisting: MatDrawerContent,
|
|
73
|
-
},
|
|
74
|
-
],
|
|
75
|
-
standalone: true,
|
|
76
|
-
}]
|
|
77
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: MatDrawerContainer, decorators: [{
|
|
78
|
-
type: Inject,
|
|
79
|
-
args: [forwardRef(() => MatDrawerContainer)]
|
|
80
|
-
}] }, { type: i0.ElementRef }, { type: i1.ScrollDispatcher }, { type: i0.NgZone }] });
|
|
81
|
-
/**
|
|
82
|
-
* This component corresponds to a drawer that can be opened on the drawer container.
|
|
83
|
-
*/
|
|
84
|
-
export class MatDrawer {
|
|
85
|
-
/** The side that the drawer is attached to. */
|
|
86
|
-
get position() {
|
|
87
|
-
return this._position;
|
|
88
|
-
}
|
|
89
|
-
set position(value) {
|
|
90
|
-
// Make sure we have a valid value.
|
|
91
|
-
value = value === 'end' ? 'end' : 'start';
|
|
92
|
-
if (value !== this._position) {
|
|
93
|
-
// Static inputs in Ivy are set before the element is in the DOM.
|
|
94
|
-
if (this._isAttached) {
|
|
95
|
-
this._updatePositionInParent(value);
|
|
96
|
-
}
|
|
97
|
-
this._position = value;
|
|
98
|
-
this.onPositionChanged.emit();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/** Mode of the drawer; one of 'over', 'push' or 'side'. */
|
|
102
|
-
get mode() {
|
|
103
|
-
return this._mode;
|
|
104
|
-
}
|
|
105
|
-
set mode(value) {
|
|
106
|
-
this._mode = value;
|
|
107
|
-
this._updateFocusTrapState();
|
|
108
|
-
this._modeChanged.next();
|
|
109
|
-
}
|
|
110
|
-
/** Whether the drawer can be closed with the escape key or by clicking on the backdrop. */
|
|
111
|
-
get disableClose() {
|
|
112
|
-
return this._disableClose;
|
|
113
|
-
}
|
|
114
|
-
set disableClose(value) {
|
|
115
|
-
this._disableClose = coerceBooleanProperty(value);
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Whether the drawer should focus the first focusable element automatically when opened.
|
|
119
|
-
* Defaults to false in when `mode` is set to `side`, otherwise defaults to `true`. If explicitly
|
|
120
|
-
* enabled, focus will be moved into the sidenav in `side` mode as well.
|
|
121
|
-
* @breaking-change 14.0.0 Remove boolean option from autoFocus. Use string or AutoFocusTarget
|
|
122
|
-
* instead.
|
|
123
|
-
*/
|
|
124
|
-
get autoFocus() {
|
|
125
|
-
const value = this._autoFocus;
|
|
126
|
-
// Note that usually we don't allow autoFocus to be set to `first-tabbable` in `side` mode,
|
|
127
|
-
// because we don't know how the sidenav is being used, but in some cases it still makes
|
|
128
|
-
// sense to do it. The consumer can explicitly set `autoFocus`.
|
|
129
|
-
if (value == null) {
|
|
130
|
-
if (this.mode === 'side') {
|
|
131
|
-
return 'dialog';
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
return 'first-tabbable';
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return value;
|
|
138
|
-
}
|
|
139
|
-
set autoFocus(value) {
|
|
140
|
-
if (value === 'true' || value === 'false' || value == null) {
|
|
141
|
-
value = coerceBooleanProperty(value);
|
|
142
|
-
}
|
|
143
|
-
this._autoFocus = value;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Whether the drawer is opened. We overload this because we trigger an event when it
|
|
147
|
-
* starts or end.
|
|
148
|
-
*/
|
|
149
|
-
get opened() {
|
|
150
|
-
return this._opened;
|
|
151
|
-
}
|
|
152
|
-
set opened(value) {
|
|
153
|
-
this.toggle(coerceBooleanProperty(value));
|
|
154
|
-
}
|
|
155
|
-
constructor(_elementRef, _focusTrapFactory, _focusMonitor, _platform, _ngZone, _interactivityChecker, _doc, _container) {
|
|
156
|
-
this._elementRef = _elementRef;
|
|
157
|
-
this._focusTrapFactory = _focusTrapFactory;
|
|
158
|
-
this._focusMonitor = _focusMonitor;
|
|
159
|
-
this._platform = _platform;
|
|
160
|
-
this._ngZone = _ngZone;
|
|
161
|
-
this._interactivityChecker = _interactivityChecker;
|
|
162
|
-
this._doc = _doc;
|
|
163
|
-
this._container = _container;
|
|
164
|
-
this._focusTrap = null;
|
|
165
|
-
this._elementFocusedBeforeDrawerWasOpened = null;
|
|
166
|
-
/** Whether the drawer is initialized. Used for disabling the initial animation. */
|
|
167
|
-
this._enableAnimations = false;
|
|
168
|
-
this._position = 'start';
|
|
169
|
-
this._mode = 'over';
|
|
170
|
-
this._disableClose = false;
|
|
171
|
-
this._opened = false;
|
|
172
|
-
/** Emits whenever the drawer has started animating. */
|
|
173
|
-
this._animationStarted = new Subject();
|
|
174
|
-
/** Emits whenever the drawer is done animating. */
|
|
175
|
-
this._animationEnd = new Subject();
|
|
176
|
-
/** Current state of the sidenav animation. */
|
|
177
|
-
this._animationState = 'void';
|
|
178
|
-
/** Event emitted when the drawer open state is changed. */
|
|
179
|
-
this.openedChange =
|
|
180
|
-
// Note this has to be async in order to avoid some issues with two-bindings (see #8872).
|
|
181
|
-
new EventEmitter(/* isAsync */ true);
|
|
182
|
-
/** Event emitted when the drawer has been opened. */
|
|
183
|
-
this._openedStream = this.openedChange.pipe(filter(o => o), map(() => { }));
|
|
184
|
-
/** Event emitted when the drawer has started opening. */
|
|
185
|
-
this.openedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState.indexOf('open') === 0), mapTo(undefined));
|
|
186
|
-
/** Event emitted when the drawer has been closed. */
|
|
187
|
-
this._closedStream = this.openedChange.pipe(filter(o => !o), map(() => { }));
|
|
188
|
-
/** Event emitted when the drawer has started closing. */
|
|
189
|
-
this.closedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState === 'void'), mapTo(undefined));
|
|
190
|
-
/** Emits when the component is destroyed. */
|
|
191
|
-
this._destroyed = new Subject();
|
|
192
|
-
/** Event emitted when the drawer's position changes. */
|
|
193
|
-
// tslint:disable-next-line:no-output-on-prefix
|
|
194
|
-
this.onPositionChanged = new EventEmitter();
|
|
195
|
-
/**
|
|
196
|
-
* An observable that emits when the drawer mode changes. This is used by the drawer container to
|
|
197
|
-
* to know when to when the mode changes so it can adapt the margins on the content.
|
|
198
|
-
*/
|
|
199
|
-
this._modeChanged = new Subject();
|
|
200
|
-
this._injector = inject(Injector);
|
|
201
|
-
this._changeDetectorRef = inject(ChangeDetectorRef);
|
|
202
|
-
this.openedChange.pipe(takeUntil(this._destroyed)).subscribe((opened) => {
|
|
203
|
-
if (opened) {
|
|
204
|
-
if (this._doc) {
|
|
205
|
-
this._elementFocusedBeforeDrawerWasOpened = this._doc.activeElement;
|
|
206
|
-
}
|
|
207
|
-
this._takeFocus();
|
|
208
|
-
}
|
|
209
|
-
else if (this._isFocusWithinDrawer()) {
|
|
210
|
-
this._restoreFocus(this._openedVia || 'program');
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
/**
|
|
214
|
-
* Listen to `keydown` events outside the zone so that change detection is not run every
|
|
215
|
-
* time a key is pressed. Instead we re-enter the zone only if the `ESC` key is pressed
|
|
216
|
-
* and we don't have close disabled.
|
|
217
|
-
*/
|
|
218
|
-
this._ngZone.runOutsideAngular(() => {
|
|
219
|
-
fromEvent(this._elementRef.nativeElement, 'keydown')
|
|
220
|
-
.pipe(filter(event => {
|
|
221
|
-
return event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event);
|
|
222
|
-
}), takeUntil(this._destroyed))
|
|
223
|
-
.subscribe(event => this._ngZone.run(() => {
|
|
224
|
-
this.close();
|
|
225
|
-
event.stopPropagation();
|
|
226
|
-
event.preventDefault();
|
|
227
|
-
}));
|
|
228
|
-
});
|
|
229
|
-
// We need a Subject with distinctUntilChanged, because the `done` event
|
|
230
|
-
// fires twice on some browsers. See https://github.com/angular/angular/issues/24084
|
|
231
|
-
this._animationEnd
|
|
232
|
-
.pipe(distinctUntilChanged((x, y) => {
|
|
233
|
-
return x.fromState === y.fromState && x.toState === y.toState;
|
|
234
|
-
}))
|
|
235
|
-
.subscribe((event) => {
|
|
236
|
-
const { fromState, toState } = event;
|
|
237
|
-
if ((toState.indexOf('open') === 0 && fromState === 'void') ||
|
|
238
|
-
(toState === 'void' && fromState.indexOf('open') === 0)) {
|
|
239
|
-
this.openedChange.emit(this._opened);
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Focuses the provided element. If the element is not focusable, it will add a tabIndex
|
|
245
|
-
* attribute to forcefully focus it. The attribute is removed after focus is moved.
|
|
246
|
-
* @param element The element to focus.
|
|
247
|
-
*/
|
|
248
|
-
_forceFocus(element, options) {
|
|
249
|
-
if (!this._interactivityChecker.isFocusable(element)) {
|
|
250
|
-
element.tabIndex = -1;
|
|
251
|
-
// The tabindex attribute should be removed to avoid navigating to that element again
|
|
252
|
-
this._ngZone.runOutsideAngular(() => {
|
|
253
|
-
const callback = () => {
|
|
254
|
-
element.removeEventListener('blur', callback);
|
|
255
|
-
element.removeEventListener('mousedown', callback);
|
|
256
|
-
element.removeAttribute('tabindex');
|
|
257
|
-
};
|
|
258
|
-
element.addEventListener('blur', callback);
|
|
259
|
-
element.addEventListener('mousedown', callback);
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
element.focus(options);
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Focuses the first element that matches the given selector within the focus trap.
|
|
266
|
-
* @param selector The CSS selector for the element to set focus to.
|
|
267
|
-
*/
|
|
268
|
-
_focusByCssSelector(selector, options) {
|
|
269
|
-
let elementToFocus = this._elementRef.nativeElement.querySelector(selector);
|
|
270
|
-
if (elementToFocus) {
|
|
271
|
-
this._forceFocus(elementToFocus, options);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Moves focus into the drawer. Note that this works even if
|
|
276
|
-
* the focus trap is disabled in `side` mode.
|
|
277
|
-
*/
|
|
278
|
-
_takeFocus() {
|
|
279
|
-
if (!this._focusTrap) {
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
const element = this._elementRef.nativeElement;
|
|
283
|
-
// When autoFocus is not on the sidenav, if the element cannot be focused or does
|
|
284
|
-
// not exist, focus the sidenav itself so the keyboard navigation still works.
|
|
285
|
-
// We need to check that `focus` is a function due to Universal.
|
|
286
|
-
switch (this.autoFocus) {
|
|
287
|
-
case false:
|
|
288
|
-
case 'dialog':
|
|
289
|
-
return;
|
|
290
|
-
case true:
|
|
291
|
-
case 'first-tabbable':
|
|
292
|
-
afterNextRender(() => {
|
|
293
|
-
const hasMovedFocus = this._focusTrap.focusInitialElement();
|
|
294
|
-
if (!hasMovedFocus && typeof element.focus === 'function') {
|
|
295
|
-
element.focus();
|
|
296
|
-
}
|
|
297
|
-
}, { injector: this._injector });
|
|
298
|
-
break;
|
|
299
|
-
case 'first-heading':
|
|
300
|
-
this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');
|
|
301
|
-
break;
|
|
302
|
-
default:
|
|
303
|
-
this._focusByCssSelector(this.autoFocus);
|
|
304
|
-
break;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Restores focus to the element that was originally focused when the drawer opened.
|
|
309
|
-
* If no element was focused at that time, the focus will be restored to the drawer.
|
|
310
|
-
*/
|
|
311
|
-
_restoreFocus(focusOrigin) {
|
|
312
|
-
if (this.autoFocus === 'dialog') {
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
if (this._elementFocusedBeforeDrawerWasOpened) {
|
|
316
|
-
this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened, focusOrigin);
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
this._elementRef.nativeElement.blur();
|
|
320
|
-
}
|
|
321
|
-
this._elementFocusedBeforeDrawerWasOpened = null;
|
|
322
|
-
}
|
|
323
|
-
/** Whether focus is currently within the drawer. */
|
|
324
|
-
_isFocusWithinDrawer() {
|
|
325
|
-
const activeEl = this._doc.activeElement;
|
|
326
|
-
return !!activeEl && this._elementRef.nativeElement.contains(activeEl);
|
|
327
|
-
}
|
|
328
|
-
ngAfterViewInit() {
|
|
329
|
-
this._isAttached = true;
|
|
330
|
-
// Only update the DOM position when the sidenav is positioned at
|
|
331
|
-
// the end since we project the sidenav before the content by default.
|
|
332
|
-
if (this._position === 'end') {
|
|
333
|
-
this._updatePositionInParent('end');
|
|
334
|
-
}
|
|
335
|
-
// Needs to happen after the position is updated
|
|
336
|
-
// so the focus trap anchors are in the right place.
|
|
337
|
-
if (this._platform.isBrowser) {
|
|
338
|
-
this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);
|
|
339
|
-
this._updateFocusTrapState();
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
ngAfterContentChecked() {
|
|
343
|
-
// Enable the animations after the lifecycle hooks have run, in order to avoid animating
|
|
344
|
-
// drawers that are open by default. When we're on the server, we shouldn't enable the
|
|
345
|
-
// animations, because we don't want the drawer to animate the first time the user sees
|
|
346
|
-
// the page.
|
|
347
|
-
if (this._platform.isBrowser) {
|
|
348
|
-
this._enableAnimations = true;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
ngOnDestroy() {
|
|
352
|
-
this._focusTrap?.destroy();
|
|
353
|
-
this._anchor?.remove();
|
|
354
|
-
this._anchor = null;
|
|
355
|
-
this._animationStarted.complete();
|
|
356
|
-
this._animationEnd.complete();
|
|
357
|
-
this._modeChanged.complete();
|
|
358
|
-
this._destroyed.next();
|
|
359
|
-
this._destroyed.complete();
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Open the drawer.
|
|
363
|
-
* @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.
|
|
364
|
-
* Used for focus management after the sidenav is closed.
|
|
365
|
-
*/
|
|
366
|
-
open(openedVia) {
|
|
367
|
-
return this.toggle(true, openedVia);
|
|
368
|
-
}
|
|
369
|
-
/** Close the drawer. */
|
|
370
|
-
close() {
|
|
371
|
-
return this.toggle(false);
|
|
372
|
-
}
|
|
373
|
-
/** Closes the drawer with context that the backdrop was clicked. */
|
|
374
|
-
_closeViaBackdropClick() {
|
|
375
|
-
// If the drawer is closed upon a backdrop click, we always want to restore focus. We
|
|
376
|
-
// don't need to check whether focus is currently in the drawer, as clicking on the
|
|
377
|
-
// backdrop causes blurs the active element.
|
|
378
|
-
return this._setOpen(/* isOpen */ false, /* restoreFocus */ true, 'mouse');
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* Toggle this drawer.
|
|
382
|
-
* @param isOpen Whether the drawer should be open.
|
|
383
|
-
* @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.
|
|
384
|
-
* Used for focus management after the sidenav is closed.
|
|
385
|
-
*/
|
|
386
|
-
toggle(isOpen = !this.opened, openedVia) {
|
|
387
|
-
// If the focus is currently inside the drawer content and we are closing the drawer,
|
|
388
|
-
// restore the focus to the initially focused element (when the drawer opened).
|
|
389
|
-
if (isOpen && openedVia) {
|
|
390
|
-
this._openedVia = openedVia;
|
|
391
|
-
}
|
|
392
|
-
const result = this._setOpen(isOpen,
|
|
393
|
-
/* restoreFocus */ !isOpen && this._isFocusWithinDrawer(), this._openedVia || 'program');
|
|
394
|
-
if (!isOpen) {
|
|
395
|
-
this._openedVia = null;
|
|
396
|
-
}
|
|
397
|
-
return result;
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Toggles the opened state of the drawer.
|
|
401
|
-
* @param isOpen Whether the drawer should open or close.
|
|
402
|
-
* @param restoreFocus Whether focus should be restored on close.
|
|
403
|
-
* @param focusOrigin Origin to use when restoring focus.
|
|
404
|
-
*/
|
|
405
|
-
_setOpen(isOpen, restoreFocus, focusOrigin) {
|
|
406
|
-
this._opened = isOpen;
|
|
407
|
-
if (isOpen) {
|
|
408
|
-
this._animationState = this._enableAnimations ? 'open' : 'open-instant';
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
this._animationState = 'void';
|
|
412
|
-
if (restoreFocus) {
|
|
413
|
-
this._restoreFocus(focusOrigin);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
// Needed to ensure that the closing sequence fires off correctly.
|
|
417
|
-
this._changeDetectorRef.markForCheck();
|
|
418
|
-
this._updateFocusTrapState();
|
|
419
|
-
return new Promise(resolve => {
|
|
420
|
-
this.openedChange.pipe(take(1)).subscribe(open => resolve(open ? 'open' : 'close'));
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
_getWidth() {
|
|
424
|
-
return this._elementRef.nativeElement ? this._elementRef.nativeElement.offsetWidth || 0 : 0;
|
|
425
|
-
}
|
|
426
|
-
/** Updates the enabled state of the focus trap. */
|
|
427
|
-
_updateFocusTrapState() {
|
|
428
|
-
if (this._focusTrap) {
|
|
429
|
-
// Trap focus only if the backdrop is enabled. Otherwise, allow end user to interact with the
|
|
430
|
-
// sidenav content.
|
|
431
|
-
this._focusTrap.enabled = !!this._container?.hasBackdrop && this.opened;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Updates the position of the drawer in the DOM. We need to move the element around ourselves
|
|
436
|
-
* when it's in the `end` position so that it comes after the content and the visual order
|
|
437
|
-
* matches the tab order. We also need to be able to move it back to `start` if the sidenav
|
|
438
|
-
* started off as `end` and was changed to `start`.
|
|
439
|
-
*/
|
|
440
|
-
_updatePositionInParent(newPosition) {
|
|
441
|
-
// Don't move the DOM node around on the server, because it can throw off hydration.
|
|
442
|
-
if (!this._platform.isBrowser) {
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
const element = this._elementRef.nativeElement;
|
|
446
|
-
const parent = element.parentNode;
|
|
447
|
-
if (newPosition === 'end') {
|
|
448
|
-
if (!this._anchor) {
|
|
449
|
-
this._anchor = this._doc.createComment('mat-drawer-anchor');
|
|
450
|
-
parent.insertBefore(this._anchor, element);
|
|
451
|
-
}
|
|
452
|
-
parent.appendChild(element);
|
|
453
|
-
}
|
|
454
|
-
else if (this._anchor) {
|
|
455
|
-
this._anchor.parentNode.insertBefore(element, this._anchor);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDrawer, deps: [{ token: i0.ElementRef }, { token: i2.FocusTrapFactory }, { token: i2.FocusMonitor }, { token: i3.Platform }, { token: i0.NgZone }, { token: i2.InteractivityChecker }, { token: DOCUMENT, optional: true }, { token: MAT_DRAWER_CONTAINER, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
459
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0-next.2", type: MatDrawer, isStandalone: true, selector: "mat-drawer", inputs: { position: "position", mode: "mode", disableClose: "disableClose", autoFocus: "autoFocus", opened: "opened" }, outputs: { openedChange: "openedChange", _openedStream: "opened", openedStart: "openedStart", _closedStream: "closed", closedStart: "closedStart", onPositionChanged: "positionChanged" }, host: { attributes: { "tabIndex": "-1" }, listeners: { "@transform.start": "_animationStarted.next($event)", "@transform.done": "_animationEnd.next($event)" }, properties: { "attr.align": "null", "class.mat-drawer-end": "position === \"end\"", "class.mat-drawer-over": "mode === \"over\"", "class.mat-drawer-push": "mode === \"push\"", "class.mat-drawer-side": "mode === \"side\"", "class.mat-drawer-opened": "opened", "@transform": "_animationState" }, classAttribute: "mat-drawer" }, viewQueries: [{ propertyName: "_content", first: true, predicate: ["content"], descendants: true }], exportAs: ["matDrawer"], ngImport: i0, template: "<div class=\"mat-drawer-inner-container\" cdkScrollable #content>\r\n <ng-content></ng-content>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }], animations: [matDrawerAnimations.transformDrawer], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
460
|
-
}
|
|
461
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDrawer, decorators: [{
|
|
462
|
-
type: Component,
|
|
463
|
-
args: [{ selector: 'mat-drawer', exportAs: 'matDrawer', animations: [matDrawerAnimations.transformDrawer], host: {
|
|
464
|
-
'class': 'mat-drawer',
|
|
465
|
-
// must prevent the browser from aligning text based on value
|
|
466
|
-
'[attr.align]': 'null',
|
|
467
|
-
'[class.mat-drawer-end]': 'position === "end"',
|
|
468
|
-
'[class.mat-drawer-over]': 'mode === "over"',
|
|
469
|
-
'[class.mat-drawer-push]': 'mode === "push"',
|
|
470
|
-
'[class.mat-drawer-side]': 'mode === "side"',
|
|
471
|
-
'[class.mat-drawer-opened]': 'opened',
|
|
472
|
-
'tabIndex': '-1',
|
|
473
|
-
'[@transform]': '_animationState',
|
|
474
|
-
'(@transform.start)': '_animationStarted.next($event)',
|
|
475
|
-
'(@transform.done)': '_animationEnd.next($event)',
|
|
476
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [CdkScrollable], template: "<div class=\"mat-drawer-inner-container\" cdkScrollable #content>\r\n <ng-content></ng-content>\r\n</div>\r\n" }]
|
|
477
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i2.FocusTrapFactory }, { type: i2.FocusMonitor }, { type: i3.Platform }, { type: i0.NgZone }, { type: i2.InteractivityChecker }, { type: undefined, decorators: [{
|
|
478
|
-
type: Optional
|
|
479
|
-
}, {
|
|
480
|
-
type: Inject,
|
|
481
|
-
args: [DOCUMENT]
|
|
482
|
-
}] }, { type: MatDrawerContainer, decorators: [{
|
|
483
|
-
type: Optional
|
|
484
|
-
}, {
|
|
485
|
-
type: Inject,
|
|
486
|
-
args: [MAT_DRAWER_CONTAINER]
|
|
487
|
-
}] }], propDecorators: { position: [{
|
|
488
|
-
type: Input
|
|
489
|
-
}], mode: [{
|
|
490
|
-
type: Input
|
|
491
|
-
}], disableClose: [{
|
|
492
|
-
type: Input
|
|
493
|
-
}], autoFocus: [{
|
|
494
|
-
type: Input
|
|
495
|
-
}], opened: [{
|
|
496
|
-
type: Input
|
|
497
|
-
}], openedChange: [{
|
|
498
|
-
type: Output
|
|
499
|
-
}], _openedStream: [{
|
|
500
|
-
type: Output,
|
|
501
|
-
args: ['opened']
|
|
502
|
-
}], openedStart: [{
|
|
503
|
-
type: Output
|
|
504
|
-
}], _closedStream: [{
|
|
505
|
-
type: Output,
|
|
506
|
-
args: ['closed']
|
|
507
|
-
}], closedStart: [{
|
|
508
|
-
type: Output
|
|
509
|
-
}], onPositionChanged: [{
|
|
510
|
-
type: Output,
|
|
511
|
-
args: ['positionChanged']
|
|
512
|
-
}], _content: [{
|
|
513
|
-
type: ViewChild,
|
|
514
|
-
args: ['content']
|
|
515
|
-
}] } });
|
|
516
|
-
/**
|
|
517
|
-
* `<mat-drawer-container>` component.
|
|
518
|
-
*
|
|
519
|
-
* This is the parent component to one or two `<mat-drawer>`s that validates the state internally
|
|
520
|
-
* and coordinates the backdrop and content styling.
|
|
521
|
-
*/
|
|
522
|
-
export class MatDrawerContainer {
|
|
523
|
-
/** The drawer child with the `start` position. */
|
|
524
|
-
get start() {
|
|
525
|
-
return this._start;
|
|
526
|
-
}
|
|
527
|
-
/** The drawer child with the `end` position. */
|
|
528
|
-
get end() {
|
|
529
|
-
return this._end;
|
|
530
|
-
}
|
|
531
|
-
/**
|
|
532
|
-
* Whether to automatically resize the container whenever
|
|
533
|
-
* the size of any of its drawers changes.
|
|
534
|
-
*
|
|
535
|
-
* **Use at your own risk!** Enabling this option can cause layout thrashing by measuring
|
|
536
|
-
* the drawers on every change detection cycle. Can be configured globally via the
|
|
537
|
-
* `MAT_DRAWER_DEFAULT_AUTOSIZE` token.
|
|
538
|
-
*/
|
|
539
|
-
get autosize() {
|
|
540
|
-
return this._autosize;
|
|
541
|
-
}
|
|
542
|
-
set autosize(value) {
|
|
543
|
-
this._autosize = coerceBooleanProperty(value);
|
|
544
|
-
}
|
|
545
|
-
/**
|
|
546
|
-
* Whether the drawer container should have a backdrop while one of the sidenavs is open.
|
|
547
|
-
* If explicitly set to `true`, the backdrop will be enabled for drawers in the `side`
|
|
548
|
-
* mode as well.
|
|
549
|
-
*/
|
|
550
|
-
get hasBackdrop() {
|
|
551
|
-
return this._drawerHasBackdrop(this._start) || this._drawerHasBackdrop(this._end);
|
|
552
|
-
}
|
|
553
|
-
set hasBackdrop(value) {
|
|
554
|
-
this._backdropOverride = value == null ? null : coerceBooleanProperty(value);
|
|
555
|
-
}
|
|
556
|
-
/** Reference to the CdkScrollable instance that wraps the scrollable content. */
|
|
557
|
-
get scrollable() {
|
|
558
|
-
return this._userContent || this._content;
|
|
559
|
-
}
|
|
560
|
-
constructor(_dir, _element, _ngZone, _changeDetectorRef, viewportRuler, defaultAutosize = false, _animationMode) {
|
|
561
|
-
this._dir = _dir;
|
|
562
|
-
this._element = _element;
|
|
563
|
-
this._ngZone = _ngZone;
|
|
564
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
565
|
-
this._animationMode = _animationMode;
|
|
566
|
-
/** Drawers that belong to this container. */
|
|
567
|
-
this._drawers = new QueryList();
|
|
568
|
-
/** Event emitted when the drawer backdrop is clicked. */
|
|
569
|
-
this.backdropClick = new EventEmitter();
|
|
570
|
-
/** Emits when the component is destroyed. */
|
|
571
|
-
this._destroyed = new Subject();
|
|
572
|
-
/** Emits on every ngDoCheck. Used for debouncing reflows. */
|
|
573
|
-
this._doCheckSubject = new Subject();
|
|
574
|
-
/**
|
|
575
|
-
* Margins to be applied to the content. These are used to push / shrink the drawer content when a
|
|
576
|
-
* drawer is open. We use margin rather than transform even for push mode because transform breaks
|
|
577
|
-
* fixed position elements inside of the transformed element.
|
|
578
|
-
*/
|
|
579
|
-
this._contentMargins = { left: null, right: null };
|
|
580
|
-
this._contentMarginChanges = new Subject();
|
|
581
|
-
this._injector = inject(Injector);
|
|
582
|
-
// If a `Dir` directive exists up the tree, listen direction changes
|
|
583
|
-
// and update the left/right properties to point to the proper start/end.
|
|
584
|
-
if (_dir) {
|
|
585
|
-
_dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {
|
|
586
|
-
this._validateDrawers();
|
|
587
|
-
this.updateContentMargins();
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
// Since the minimum width of the sidenav depends on the viewport width,
|
|
591
|
-
// we need to recompute the margins if the viewport changes.
|
|
592
|
-
viewportRuler
|
|
593
|
-
.change()
|
|
594
|
-
.pipe(takeUntil(this._destroyed))
|
|
595
|
-
.subscribe(() => this.updateContentMargins());
|
|
596
|
-
this._autosize = defaultAutosize;
|
|
597
|
-
}
|
|
598
|
-
ngAfterContentInit() {
|
|
599
|
-
this._allDrawers.changes
|
|
600
|
-
.pipe(startWith(this._allDrawers), takeUntil(this._destroyed))
|
|
601
|
-
.subscribe((drawer) => {
|
|
602
|
-
this._drawers.reset(drawer.filter(item => !item._container || item._container === this));
|
|
603
|
-
this._drawers.notifyOnChanges();
|
|
604
|
-
});
|
|
605
|
-
this._drawers.changes.pipe(startWith(null)).subscribe(() => {
|
|
606
|
-
this._validateDrawers();
|
|
607
|
-
this._drawers.forEach((drawer) => {
|
|
608
|
-
this._watchDrawerToggle(drawer);
|
|
609
|
-
this._watchDrawerPosition(drawer);
|
|
610
|
-
this._watchDrawerMode(drawer);
|
|
611
|
-
});
|
|
612
|
-
if (!this._drawers.length ||
|
|
613
|
-
this._isDrawerOpen(this._start) ||
|
|
614
|
-
this._isDrawerOpen(this._end)) {
|
|
615
|
-
this.updateContentMargins();
|
|
616
|
-
}
|
|
617
|
-
this._changeDetectorRef.markForCheck();
|
|
618
|
-
});
|
|
619
|
-
// Avoid hitting the NgZone through the debounce timeout.
|
|
620
|
-
this._ngZone.runOutsideAngular(() => {
|
|
621
|
-
this._doCheckSubject
|
|
622
|
-
.pipe(debounceTime(10), // Arbitrary debounce time, less than a frame at 60fps
|
|
623
|
-
takeUntil(this._destroyed))
|
|
624
|
-
.subscribe(() => this.updateContentMargins());
|
|
625
|
-
});
|
|
626
|
-
}
|
|
627
|
-
ngOnDestroy() {
|
|
628
|
-
this._contentMarginChanges.complete();
|
|
629
|
-
this._doCheckSubject.complete();
|
|
630
|
-
this._drawers.destroy();
|
|
631
|
-
this._destroyed.next();
|
|
632
|
-
this._destroyed.complete();
|
|
633
|
-
}
|
|
634
|
-
/** Calls `open` of both start and end drawers */
|
|
635
|
-
open() {
|
|
636
|
-
this._drawers.forEach(drawer => drawer.open());
|
|
637
|
-
}
|
|
638
|
-
/** Calls `close` of both start and end drawers */
|
|
639
|
-
close() {
|
|
640
|
-
this._drawers.forEach(drawer => drawer.close());
|
|
641
|
-
}
|
|
642
|
-
/**
|
|
643
|
-
* Recalculates and updates the inline styles for the content. Note that this should be used
|
|
644
|
-
* sparingly, because it causes a reflow.
|
|
645
|
-
*/
|
|
646
|
-
updateContentMargins() {
|
|
647
|
-
// 1. For drawers in `over` mode, they don't affect the content.
|
|
648
|
-
// 2. For drawers in `side` mode they should shrink the content. We do this by adding to the
|
|
649
|
-
// left margin (for left drawer) or right margin (for right the drawer).
|
|
650
|
-
// 3. For drawers in `push` mode the should shift the content without resizing it. We do this by
|
|
651
|
-
// adding to the left or right margin and simultaneously subtracting the same amount of
|
|
652
|
-
// margin from the other side.
|
|
653
|
-
let left = 0;
|
|
654
|
-
let right = 0;
|
|
655
|
-
if (this._left && this._left.opened) {
|
|
656
|
-
if (this._left.mode == 'side') {
|
|
657
|
-
left += this._left._getWidth();
|
|
658
|
-
}
|
|
659
|
-
else if (this._left.mode == 'push') {
|
|
660
|
-
const width = this._left._getWidth();
|
|
661
|
-
left += width;
|
|
662
|
-
right -= width;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
if (this._right && this._right.opened) {
|
|
666
|
-
if (this._right.mode == 'side') {
|
|
667
|
-
right += this._right._getWidth();
|
|
668
|
-
}
|
|
669
|
-
else if (this._right.mode == 'push') {
|
|
670
|
-
const width = this._right._getWidth();
|
|
671
|
-
right += width;
|
|
672
|
-
left -= width;
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
// If either `right` or `left` is zero, don't set a style to the element. This
|
|
676
|
-
// allows users to specify a custom size via CSS class in SSR scenarios where the
|
|
677
|
-
// measured widths will always be zero. Note that we reset to `null` here, rather
|
|
678
|
-
// than below, in order to ensure that the types in the `if` below are consistent.
|
|
679
|
-
left = left || null;
|
|
680
|
-
right = right || null;
|
|
681
|
-
if (left !== this._contentMargins.left || right !== this._contentMargins.right) {
|
|
682
|
-
this._contentMargins = { left, right };
|
|
683
|
-
// Pull back into the NgZone since in some cases we could be outside. We need to be careful
|
|
684
|
-
// to do it only when something changed, otherwise we can end up hitting the zone too often.
|
|
685
|
-
this._ngZone.run(() => this._contentMarginChanges.next(this._contentMargins));
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
ngDoCheck() {
|
|
689
|
-
// If users opted into autosizing, do a check every change detection cycle.
|
|
690
|
-
if (this._autosize && this._isPushed()) {
|
|
691
|
-
// Run outside the NgZone, otherwise the debouncer will throw us into an infinite loop.
|
|
692
|
-
this._ngZone.runOutsideAngular(() => this._doCheckSubject.next());
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
/**
|
|
696
|
-
* Subscribes to drawer events in order to set a class on the main container element when the
|
|
697
|
-
* drawer is open and the backdrop is visible. This ensures any overflow on the container element
|
|
698
|
-
* is properly hidden.
|
|
699
|
-
*/
|
|
700
|
-
_watchDrawerToggle(drawer) {
|
|
701
|
-
drawer._animationStarted
|
|
702
|
-
.pipe(filter((event) => event.fromState !== event.toState), takeUntil(this._drawers.changes))
|
|
703
|
-
.subscribe((event) => {
|
|
704
|
-
// Set the transition class on the container so that the animations occur. This should not
|
|
705
|
-
// be set initially because animations should only be triggered via a change in state.
|
|
706
|
-
if (event.toState !== 'open-instant' && this._animationMode !== 'NoopAnimations') {
|
|
707
|
-
this._element.nativeElement.classList.add('mat-drawer-transition');
|
|
708
|
-
}
|
|
709
|
-
this.updateContentMargins();
|
|
710
|
-
this._changeDetectorRef.markForCheck();
|
|
711
|
-
});
|
|
712
|
-
if (drawer.mode !== 'side') {
|
|
713
|
-
drawer.openedChange
|
|
714
|
-
.pipe(takeUntil(this._drawers.changes))
|
|
715
|
-
.subscribe(() => this._setContainerClass(drawer.opened));
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
/**
|
|
719
|
-
* Subscribes to drawer onPositionChanged event in order to
|
|
720
|
-
* re-validate drawers when the position changes.
|
|
721
|
-
*/
|
|
722
|
-
_watchDrawerPosition(drawer) {
|
|
723
|
-
if (!drawer) {
|
|
724
|
-
return;
|
|
725
|
-
}
|
|
726
|
-
// NOTE: We need to wait for the microtask queue to be empty before validating,
|
|
727
|
-
// since both drawers may be swapping positions at the same time.
|
|
728
|
-
drawer.onPositionChanged.pipe(takeUntil(this._drawers.changes)).subscribe(() => {
|
|
729
|
-
afterNextRender(() => {
|
|
730
|
-
this._validateDrawers();
|
|
731
|
-
}, { injector: this._injector, phase: AfterRenderPhase.Read });
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
/** Subscribes to changes in drawer mode so we can run change detection. */
|
|
735
|
-
_watchDrawerMode(drawer) {
|
|
736
|
-
if (drawer) {
|
|
737
|
-
drawer._modeChanged
|
|
738
|
-
.pipe(takeUntil(merge(this._drawers.changes, this._destroyed)))
|
|
739
|
-
.subscribe(() => {
|
|
740
|
-
this.updateContentMargins();
|
|
741
|
-
this._changeDetectorRef.markForCheck();
|
|
742
|
-
});
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
/** Toggles the 'mat-drawer-opened' class on the main 'mat-drawer-container' element. */
|
|
746
|
-
_setContainerClass(isAdd) {
|
|
747
|
-
const classList = this._element.nativeElement.classList;
|
|
748
|
-
const className = 'mat-drawer-container-has-open';
|
|
749
|
-
if (isAdd) {
|
|
750
|
-
classList.add(className);
|
|
751
|
-
}
|
|
752
|
-
else {
|
|
753
|
-
classList.remove(className);
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
/** Validate the state of the drawer children components. */
|
|
757
|
-
_validateDrawers() {
|
|
758
|
-
this._start = this._end = null;
|
|
759
|
-
// Ensure that we have at most one start and one end drawer.
|
|
760
|
-
this._drawers.forEach(drawer => {
|
|
761
|
-
if (drawer.position == 'end') {
|
|
762
|
-
if (this._end != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
763
|
-
throwMatDuplicatedDrawerError('end');
|
|
764
|
-
}
|
|
765
|
-
this._end = drawer;
|
|
766
|
-
}
|
|
767
|
-
else {
|
|
768
|
-
if (this._start != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
769
|
-
throwMatDuplicatedDrawerError('start');
|
|
770
|
-
}
|
|
771
|
-
this._start = drawer;
|
|
772
|
-
}
|
|
773
|
-
});
|
|
774
|
-
this._right = this._left = null;
|
|
775
|
-
// Detect if we're LTR or RTL.
|
|
776
|
-
if (this._dir && this._dir.value === 'rtl') {
|
|
777
|
-
this._left = this._end;
|
|
778
|
-
this._right = this._start;
|
|
779
|
-
}
|
|
780
|
-
else {
|
|
781
|
-
this._left = this._start;
|
|
782
|
-
this._right = this._end;
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
/** Whether the container is being pushed to the side by one of the drawers. */
|
|
786
|
-
_isPushed() {
|
|
787
|
-
return ((this._isDrawerOpen(this._start) && this._start.mode != 'over') ||
|
|
788
|
-
(this._isDrawerOpen(this._end) && this._end.mode != 'over'));
|
|
789
|
-
}
|
|
790
|
-
_onBackdropClicked() {
|
|
791
|
-
this.backdropClick.emit();
|
|
792
|
-
this._closeModalDrawersViaBackdrop();
|
|
793
|
-
}
|
|
794
|
-
_closeModalDrawersViaBackdrop() {
|
|
795
|
-
// Close all open drawers where closing is not disabled and the mode is not `side`.
|
|
796
|
-
[this._start, this._end]
|
|
797
|
-
.filter(drawer => drawer && !drawer.disableClose && this._drawerHasBackdrop(drawer))
|
|
798
|
-
.forEach(drawer => drawer._closeViaBackdropClick());
|
|
799
|
-
}
|
|
800
|
-
_isShowingBackdrop() {
|
|
801
|
-
return ((this._isDrawerOpen(this._start) && this._drawerHasBackdrop(this._start)) ||
|
|
802
|
-
(this._isDrawerOpen(this._end) && this._drawerHasBackdrop(this._end)));
|
|
803
|
-
}
|
|
804
|
-
_isDrawerOpen(drawer) {
|
|
805
|
-
return drawer != null && drawer.opened;
|
|
806
|
-
}
|
|
807
|
-
// Whether argument drawer should have a backdrop when it opens
|
|
808
|
-
_drawerHasBackdrop(drawer) {
|
|
809
|
-
if (this._backdropOverride == null) {
|
|
810
|
-
return !!drawer && drawer.mode !== 'side';
|
|
811
|
-
}
|
|
812
|
-
return this._backdropOverride;
|
|
813
|
-
}
|
|
814
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDrawerContainer, deps: [{ token: i4.Directionality, optional: true }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1.ViewportRuler }, { token: MAT_DRAWER_DEFAULT_AUTOSIZE }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
815
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0-next.2", type: MatDrawerContainer, isStandalone: true, selector: "mat-drawer-container", inputs: { autosize: "autosize", hasBackdrop: "hasBackdrop" }, outputs: { backdropClick: "backdropClick" }, host: { properties: { "class.mat-drawer-container-explicit-backdrop": "_backdropOverride" }, classAttribute: "mat-drawer-container" }, providers: [
|
|
816
|
-
{
|
|
817
|
-
provide: MAT_DRAWER_CONTAINER,
|
|
818
|
-
useExisting: MatDrawerContainer,
|
|
819
|
-
},
|
|
820
|
-
], queries: [{ propertyName: "_content", first: true, predicate: MatDrawerContent, descendants: true }, { propertyName: "_allDrawers", predicate: MatDrawer, descendants: true }], viewQueries: [{ propertyName: "_userContent", first: true, predicate: MatDrawerContent, descendants: true }], exportAs: ["matDrawerContainer"], ngImport: i0, template: "@if (hasBackdrop) {\n <div class=\"mat-drawer-backdrop\" (click)=\"_onBackdropClicked()\"\n [class.mat-drawer-shown]=\"_isShowingBackdrop()\"></div>\n}\n\n<ng-content select=\"mat-drawer\"></ng-content>\n\n<ng-content select=\"mat-drawer-content\">\n</ng-content>\n\n@if (!_content) {\n <mat-drawer-content>\n <ng-content></ng-content>\n </mat-drawer-content>\n}\n", styles: [".mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-app-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-app-background));box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color)}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-app-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-app-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer[style*=\"visibility: hidden\"]{display:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}"], dependencies: [{ kind: "component", type: MatDrawerContent, selector: "mat-drawer-content" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
821
|
-
}
|
|
822
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDrawerContainer, decorators: [{
|
|
823
|
-
type: Component,
|
|
824
|
-
args: [{ selector: 'mat-drawer-container', exportAs: 'matDrawerContainer', host: {
|
|
825
|
-
'class': 'mat-drawer-container',
|
|
826
|
-
'[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride',
|
|
827
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
828
|
-
{
|
|
829
|
-
provide: MAT_DRAWER_CONTAINER,
|
|
830
|
-
useExisting: MatDrawerContainer,
|
|
831
|
-
},
|
|
832
|
-
], standalone: true, imports: [MatDrawerContent], template: "@if (hasBackdrop) {\n <div class=\"mat-drawer-backdrop\" (click)=\"_onBackdropClicked()\"\n [class.mat-drawer-shown]=\"_isShowingBackdrop()\"></div>\n}\n\n<ng-content select=\"mat-drawer\"></ng-content>\n\n<ng-content select=\"mat-drawer-content\">\n</ng-content>\n\n@if (!_content) {\n <mat-drawer-content>\n <ng-content></ng-content>\n </mat-drawer-content>\n}\n", styles: [".mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-app-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-app-background));box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color)}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-app-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-app-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-app-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer[style*=\"visibility: hidden\"]{display:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}"] }]
|
|
833
|
-
}], ctorParameters: () => [{ type: i4.Directionality, decorators: [{
|
|
834
|
-
type: Optional
|
|
835
|
-
}] }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1.ViewportRuler }, { type: undefined, decorators: [{
|
|
836
|
-
type: Inject,
|
|
837
|
-
args: [MAT_DRAWER_DEFAULT_AUTOSIZE]
|
|
838
|
-
}] }, { type: undefined, decorators: [{
|
|
839
|
-
type: Optional
|
|
840
|
-
}, {
|
|
841
|
-
type: Inject,
|
|
842
|
-
args: [ANIMATION_MODULE_TYPE]
|
|
843
|
-
}] }], propDecorators: { _allDrawers: [{
|
|
844
|
-
type: ContentChildren,
|
|
845
|
-
args: [MatDrawer, {
|
|
846
|
-
// We need to use `descendants: true`, because Ivy will no longer match
|
|
847
|
-
// indirect descendants if it's left as false.
|
|
848
|
-
descendants: true,
|
|
849
|
-
}]
|
|
850
|
-
}], _content: [{
|
|
851
|
-
type: ContentChild,
|
|
852
|
-
args: [MatDrawerContent]
|
|
853
|
-
}], _userContent: [{
|
|
854
|
-
type: ViewChild,
|
|
855
|
-
args: [MatDrawerContent]
|
|
856
|
-
}], autosize: [{
|
|
857
|
-
type: Input
|
|
858
|
-
}], hasBackdrop: [{
|
|
859
|
-
type: Input
|
|
860
|
-
}], backdropClick: [{
|
|
861
|
-
type: Output
|
|
862
|
-
}] } });
|
|
863
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3NpZGVuYXYvZHJhd2VyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3NpZGVuYXYvZHJhd2VyLmh0bWwiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc2lkZW5hdi9kcmF3ZXItY29udGFpbmVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUNMLFlBQVksRUFHWixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBZSxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFHTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUVmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUVOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFB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LGtCQUFrQjthQUNoQztTQUNGLGdFQWdCYSxnQkFBZ0IsaUVBVmIsU0FBUyw4RkFXZixnQkFBZ0Isa0ZFN3FCN0IsMFhBZUEsZ3ZJRnVHYSxnQkFBZ0I7O2tHQTBpQmhCLGtCQUFrQjtrQkFwQjlCLFNBQVM7K0JBQ0Usc0JBQXNCLFlBQ3RCLG9CQUFvQixRQUd4Qjt3QkFDSixPQUFPLEVBQUUsc0JBQXNCO3dCQUMvQixnREFBZ0QsRUFBRSxtQkFBbUI7cUJBQ3RFLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxvQkFBb0I7NEJBQzdCLFdBQVcsb0JBQW9CO3lCQUNoQztxQkFDRixjQUNXLElBQUksV0FDUCxDQUFDLGdCQUFnQixDQUFDOzswQkFpR3hCLFFBQVE7OzBCQUtSLE1BQU07MkJBQUMsMkJBQTJCOzswQkFDbEMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQkFBcUI7eUNBOUYzQyxXQUFXO3NCQUxWLGVBQWU7dUJBQUMsU0FBUyxFQUFFO3dCQUMxQix1RUFBdUU7d0JBQ3ZFLDhDQUE4Qzt3QkFDOUMsV0FBVyxFQUFFLElBQUk7cUJBQ2xCO2dCQU0rQixRQUFRO3NCQUF2QyxZQUFZO3VCQUFDLGdCQUFnQjtnQkFDRCxZQUFZO3NCQUF4QyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFxQnZCLFFBQVE7c0JBRFgsS0FBSztnQkFlRixXQUFXO3NCQURkLEtBQUs7Z0JBVWEsYUFBYTtzQkFBL0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuaW1wb3J0IHtBbmltYXRpb25FdmVudH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBGb2N1c01vbml0b3IsXG4gIEZvY3VzT3JpZ2luLFxuICBGb2N1c1RyYXAsXG4gIEZvY3VzVHJhcEZhY3RvcnksXG4gIEludGVyYWN0aXZpdHlDaGVja2VyLFxufSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge0Jvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtFU0NBUEUsIGhhc01vZGlmaWVyS2V5fSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7Q2RrU2Nyb2xsYWJsZSwgU2Nyb2xsRGlzcGF0Y2hlciwgVmlld3BvcnRSdWxlcn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBBZnRlclJlbmRlclBoYXNlLFxuICBBZnRlclZpZXdJbml0LFxuICBBTklNQVRJT05fTU9EVUxFX1RZUEUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2Zyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIG1hcFRvLFxuICBzdGFydFdpdGgsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHttYXREcmF3ZXJBbmltYXRpb25zfSBmcm9tICcuL2RyYXdlci1hbmltYXRpb25zJztcblxuLyoqXG4gKiBUaHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdHdvIE1hdERyYXdlciBhcmUgbWF0Y2hpbmcgdGhlIHNhbWUgcG9zaXRpb24uXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd01hdER1cGxpY2F0ZWREcmF3ZXJFcnJvcihwb3NpdGlvbjogc3RyaW5nKSB7XG4gIHRocm93IEVycm9yKGBBIGRyYXdlciB3YXMgYWxyZWFkeSBkZWNsYXJlZCBmb3IgJ3Bvc2l0aW9uPVwiJHtwb3NpdGlvbn1cIidgKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHdoZXJlIHRvIHNldCBmb2N1cyB0byBhdXRvbWF0aWNhbGx5IG9uIGRpYWxvZyBvcGVuICovXG5leHBvcnQgdHlwZSBBdXRvRm9jdXNUYXJnZXQgPSAnZGlhbG9nJyB8ICdmaXJzdC10YWJiYWJsZScgfCAnZmlyc3QtaGVhZGluZyc7XG5cbi8qKiBSZXN1bHQgb2YgdGhlIHRvZ2dsZSBwcm9taXNlIHRoYXQgaW5kaWNhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgZHJhd2VyLiAqL1xuZXhwb3J0IHR5cGUgTWF0RHJhd2VyVG9nZ2xlUmVzdWx0ID0gJ29wZW4nIHwgJ2Nsb3NlJztcblxuLyoqIERyYXdlciBhbmQgU2lkZU5hdiBkaXNwbGF5IG1vZGVzLiAqL1xuZXhwb3J0IHR5cGUgTWF0RHJhd2VyTW9kZSA9ICdvdmVyJyB8ICdwdXNoJyB8ICdzaWRlJztcblxuLyoqIENvbmZpZ3VyZXMgd2hldGhlciBkcmF3ZXJzIHNob3VsZCB1c2UgYXV0byBzaXppbmcgYnkgZGVmYXVsdC4gKi9cbmV4cG9ydCBjb25zdCBNQVRfRFJBV0VSX0RFRkFVTFRfQVVUT1NJWkUgPSBuZXcgSW5qZWN0aW9uVG9rZW48Ym9vbGVhbj4oXG4gICdNQVRfRFJBV0VSX0RFRkFVTFRfQVVUT1NJWkUnLFxuICB7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAgIGZhY3Rvcnk6IE1BVF9EUkFXRVJfREVGQVVMVF9BVVRPU0laRV9GQUNUT1JZLFxuICB9LFxuKTtcblxuLyoqXG4gKiBVc2VkIHRvIHByb3ZpZGUgYSBkcmF3ZXIgY29udGFpbmVyIHRvIGEgZHJhd2VyIHdoaWxlIGF2b2lkaW5nIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gKiBAZG9jcy1wcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBNQVRfRFJBV0VSX0NPTlRBSU5FUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX0RSQVdFUl9DT05UQUlORVInKTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBNQVRfRFJBV0VSX0RFRkFVTFRfQVVUT1NJWkVfRkFDVE9SWSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZHJhd2VyLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1kcmF3ZXItY29udGVudCcsXG4gICAgJ1tzdHlsZS5tYXJnaW4tbGVmdC5weF0nOiAnX2NvbnRhaW5lci5fY29udGVudE1hcmdpbnMubGVmdCcsXG4gICAgJ1tzdHlsZS5tYXJnaW4tcmlnaHQucHhdJzogJ19jb250YWluZXIuX2NvbnRlbnRNYXJnaW5zLnJpZ2h0JyxcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENka1Njcm9sbGFibGUsXG4gICAgICB1c2VFeGlzdGluZzogTWF0RHJhd2VyQ29udGVudCxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBNYXREcmF3ZXJDb250ZW50IGV4dGVuZHMgQ2RrU2Nyb2xsYWJsZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE1hdERyYXdlckNvbnRhaW5lcikpIHB1YmxpYyBfY29udGFpbmVyOiBNYXREcmF3ZXJDb250YWluZXIsXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgc2Nyb2xsRGlzcGF0Y2hlcjogU2Nyb2xsRGlzcGF0Y2hlcixcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwgc2Nyb2xsRGlzcGF0Y2hlciwgbmdab25lKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9jb250YWluZXIuX2NvbnRlbnRNYXJnaW5DaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgY29tcG9uZW50IGNvcnJlc3BvbmRzIHRvIGEgZHJhd2VyIHRoYXQgY2FuIGJlIG9wZW5lZCBvbiB0aGUgZHJhd2VyIGNvbnRhaW5lci5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWRyYXdlcicsXG4gIGV4cG9ydEFzOiAnbWF0RHJhd2VyJyxcbiAgdGVtcGxhdGVVcmw6ICdkcmF3ZXIuaHRtbCcsXG4gIGFuaW1hdGlvbnM6IFttYXREcmF3ZXJBbmltYXRpb25zLnRyYW5zZm9ybURyYXdlcl0sXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAnbWF0LWRyYXdlcicsXG4gICAgLy8gbXVzdCBwcmV2ZW50IHRoZSBicm93c2VyIGZyb20gYWxpZ25pbmcgdGV4dCBiYXNlZCBvbiB2YWx1ZVxuICAgICdbYXR0ci5hbGlnbl0nOiAnbnVsbCcsXG4gICAgJ1tjbGFzcy5tYXQtZHJhd2VyLWVuZF0nOiAncG9zaXRpb24gPT09IFwiZW5kXCInLFxuICAgICdbY2xhc3MubWF0LWRyYXdlci1vdmVyXSc6ICdtb2RlID09PSBcIm92ZXJcIicsXG4gICAgJ1tjbGFzcy5tYXQtZHJhd2VyLXB1c2hdJzogJ21vZGUgPT09IFwicHVzaFwiJyxcbiAgICAnW2NsYXNzLm1hdC1kcmF3ZXItc2lkZV0nOiAnbW9kZSA9PT0gXCJzaWRlXCInLFxuICAgICdbY2xhc3MubWF0LWRyYXdlci1vcGVuZWRdJzogJ29wZW5lZCcsXG4gICAgJ3RhYkluZGV4JzogJy0xJyxcbiAgICAnW0B0cmFuc2Zvcm1dJzogJ19hbmltYXRpb25TdGF0ZScsXG4gICAgJyhAdHJhbnNmb3JtLnN0YXJ0KSc6ICdfYW5pbWF0aW9uU3RhcnRlZC5uZXh0KCRldmVudCknLFxuICAgICcoQHRyYW5zZm9ybS5kb25lKSc6ICdfYW5pbWF0aW9uRW5kLm5leHQoJGV2ZW50KScsXG4gIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ2RrU2Nyb2xsYWJsZV0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdERyYXdlciBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2ZvY3VzVHJhcDogRm9jdXNUcmFwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBkcmF3ZXIgaXMgaW5pdGlhbGl6ZWQuIFVzZWQgZm9yIGRpc2FibGluZyB0aGUgaW5pdGlhbCBhbmltYXRpb24uICovXG4gIHByaXZhdGUgX2VuYWJsZUFuaW1hdGlvbnMgPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0aGUgdmlldyBvZiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGF0dGFjaGVkLiAqL1xuICBwcml2YXRlIF9pc0F0dGFjaGVkOiBib29sZWFuO1xuXG4gIC8qKiBBbmNob3Igbm9kZSB1c2VkIHRvIHJlc3RvcmUgdGhlIGRyYXdlciB0byBpdHMgaW5pdGlhbCBwb3NpdGlvbi4gKi9cbiAgcHJpdmF0ZSBfYW5jaG9yOiBDb21tZW50IHwgbnVsbDtcblxuICAvKiogVGhlIHNpZGUgdGhhdCB0aGUgZHJhd2VyIGlzIGF0dGFjaGVkIHRvLiAqL1xuICBASW5wdXQoKVxuICBnZXQgcG9zaXRpb24oKTogJ3N0YXJ0JyB8ICdlbmQnIHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cbiAgc2V0IHBvc2l0aW9uKHZhbHVlOiAnc3RhcnQnIHwgJ2VuZCcpIHtcbiAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHZhbHVlLlxuICAgIHZhbHVlID0gdmFsdWUgPT09ICdlbmQnID8gJ2VuZCcgOiAnc3RhcnQnO1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fcG9zaXRpb24pIHtcbiAgICAgIC8vIFN0YXRpYyBpbnB1dHMgaW4gSXZ5IGFyZSBzZXQgYmVmb3JlIHRoZSBlbGVtZW50IGlzIGluIHRoZSBET00uXG4gICAgICBpZiAodGhpcy5faXNBdHRhY2hlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbkluUGFyZW50KHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcG9zaXRpb24gPSB2YWx1ZTtcbiAgICAgIHRoaXMub25Qb3NpdGlvbkNoYW5nZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9wb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnID0gJ3N0YXJ0JztcblxuICAvKiogTW9kZSBvZiB0aGUgZHJhd2VyOyBvbmUgb2YgJ292ZXInLCAncHVzaCcgb3IgJ3NpZGUnLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbW9kZSgpOiBNYXREcmF3ZXJNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuICBzZXQgbW9kZSh2YWx1ZTogTWF0RHJhd2VyTW9kZSkge1xuICAgIHRoaXMuX21vZGUgPSB2YWx1ZTtcbiAgICB0aGlzLl91cGRhdGVGb2N1c1RyYXBTdGF0ZSgpO1xuICAgIHRoaXMuX21vZGVDaGFuZ2VkLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9tb2RlOiBNYXREcmF3ZXJNb2RlID0gJ292ZXInO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBkcmF3ZXIgY2FuIGJlIGNsb3NlZCB3aXRoIHRoZSBlc2NhcGUga2V5IG9yIGJ5IGNsaWNraW5nIG9uIHRoZSBiYWNrZHJvcC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVDbG9zZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZUNsb3NlO1xuICB9XG4gIHNldCBkaXNhYmxlQ2xvc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVDbG9zZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZUNsb3NlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRyYXdlciBzaG91bGQgZm9jdXMgdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IGF1dG9tYXRpY2FsbHkgd2hlbiBvcGVuZWQuXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlIGluIHdoZW4gYG1vZGVgIGlzIHNldCB0byBgc2lkZWAsIG90aGVyd2lzZSBkZWZhdWx0cyB0byBgdHJ1ZWAuIElmIGV4cGxpY2l0bHlcbiAgICogZW5hYmxlZCwgZm9jdXMgd2lsbCBiZSBtb3ZlZCBpbnRvIHRoZSBzaWRlbmF2IGluIGBzaWRlYCBtb2RlIGFzIHdlbGwuXG4gICAqIEBicmVha2luZy1jaGFuZ2UgMTQuMC4wIFJlbW92ZSBib29sZWFuIG9wdGlvbiBmcm9tIGF1dG9Gb2N1cy4gVXNlIHN0cmluZyBvciBBdXRvRm9jdXNUYXJnZXRcbiAgICogaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBhdXRvRm9jdXMoKTogQXV0b0ZvY3VzVGFyZ2V0IHwgc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9hdXRvRm9jdXM7XG5cbiAgICAvLyBOb3RlIHRoYXQgdXN1YWxseSB3ZSBkb24ndCBhbGxvdyBhdXRvRm9jdXMgdG8gYmUgc2V0IHRvIGBmaXJzdC10YWJiYWJsZWAgaW4gYHNpZGVgIG1vZGUsXG4gICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyB0aGUgc2lkZW5hdiBpcyBiZWluZyB1c2VkLCBidXQgaW4gc29tZSBjYXNlcyBpdCBzdGlsbCBtYWtlc1xuICAgIC8vIHNlbnNlIHRvIGRvIGl0LiBUaGUgY29uc3VtZXIgY2FuIGV4cGxpY2l0bHkgc2V0IGBhdXRvRm9jdXNgLlxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSAnc2lkZScpIHtcbiAgICAgICAgcmV0dXJuICdkaWFsb2cnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdmaXJzdC10YWJiYWJsZSc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZXQgYXV0b0ZvY3VzKHZhbHVlOiBBdXRvRm9jdXNUYXJnZXQgfCBzdHJpbmcgfCBCb29sZWFuSW5wdXQpIHtcbiAgICBpZiAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2F1dG9Gb2N1cyA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2F1dG9Gb2N1czogQXV0b0ZvY3VzVGFyZ2V0IHwgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZHJhd2VyIGlzIG9wZW5lZC4gV2Ugb3ZlcmxvYWQgdGhpcyBiZWNhdXNlIHdlIHRyaWdnZXIgYW4gZXZlbnQgd2hlbiBpdFxuICAgKiBzdGFydHMgb3IgZW5kLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbmVkO1xuICB9XG4gIHNldCBvcGVuZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMudG9nZ2xlKGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSkpO1xuICB9XG4gIHByaXZhdGUgX29wZW5lZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBIb3cgdGhlIHNpZGVuYXYgd2FzIG9wZW5lZCAoa2V5cHJlc3MsIG1vdXNlIGNsaWNrIGV0Yy4pICovXG4gIHByaXZhdGUgX29wZW5lZFZpYTogRm9jdXNPcmlnaW4gfCBudWxsO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgZHJhd2VyIGhhcyBzdGFydGVkIGFuaW1hdGluZy4gKi9cbiAgcmVhZG9ubHkgX2FuaW1hdGlvblN0YXJ0ZWQgPSBuZXcgU3ViamVjdDxBbmltYXRpb25FdmVudD4oKTtcblxuICAvKiogRW1pdHMgd2hlbmV2ZXIgdGhlIGRyYXdlciBpcyBkb25lIGFuaW1hdGluZy4gKi9cbiAgcmVhZG9ubHkgX2FuaW1hdGlvbkVuZCA9IG5ldyBTdWJqZWN0PEFuaW1hdGlvbkV2ZW50PigpO1xuXG4gIC8qKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBzaWRlbmF2IGFuaW1hdGlvbi4gKi9cbiAgX2FuaW1hdGlvblN0YXRlOiAnb3Blbi1pbnN0YW50JyB8ICdvcGVuJyB8ICd2b2lkJyA9ICd2b2lkJztcblxuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBkcmF3ZXIgb3BlbiBzdGF0ZSBpcyBjaGFuZ2VkLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgb3BlbmVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPVxuICAgIC8vIE5vdGUgdGhpcyBoYXMgdG8gYmUgYXN5bmMgaW4gb3JkZXIgdG8gYXZvaWQgc29tZSBpc3N1ZXMgd2l0aCB0d28tYmluZGluZ3MgKHNlZSAjODg3MikuXG4gICAgbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigvKiBpc0FzeW5jICovIHRydWUpO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGRyYXdlciBoYXMgYmVlbiBvcGVuZWQuICovXG4gIEBPdXRwdXQoJ29wZW5lZCcpXG4gIHJlYWRvbmx5IF9vcGVuZWRTdHJlYW0gPSB0aGlzLm9wZW5lZENoYW5nZS5waXBlKFxuICAgIGZpbHRlcihvID0+IG8pLFxuICAgIG1hcCgoKSA9PiB7fSksXG4gICk7XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZHJhd2VyIGhhcyBzdGFydGVkIG9wZW5pbmcuICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBvcGVuZWRTdGFydDogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMuX2FuaW1hdGlvblN0YXJ0ZWQucGlwZShcbiAgICBmaWx0ZXIoZSA9PiBlLmZyb21TdGF0ZSAhPT0gZS50b1N0YXRlICYmIGUudG9TdGF0ZS5pbmRleE9mKCdvcGVuJykgPT09IDApLFxuICAgIG1hcFRvKHVuZGVmaW5lZCksXG4gICk7XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZHJhd2VyIGhhcyBiZWVuIGNsb3NlZC4gKi9cbiAgQE91dHB1dCgnY2xvc2VkJylcbiAgcmVhZG9ubHkgX2Nsb3NlZFN0cmVhbSA9IHRoaXMub3BlbmVkQ2hhbmdlLnBpcGUoXG4gICAgZmlsdGVyKG8gPT4gIW8pLFxuICAgIG1hcCgoKSA9PiB7fSksXG4gICk7XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZHJhd2VyIGhhcyBzdGFydGVkIGNsb3NpbmcuICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBjbG9zZWRTdGFydDogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMuX2FuaW1hdGlvblN0YXJ0ZWQucGlwZShcbiAgICBmaWx0ZXIoZSA9PiBlLmZyb21TdGF0ZSAhPT0gZS50b1N0YXRlICYmIGUudG9TdGF0ZSA9PT0gJ3ZvaWQnKSxcbiAgICBtYXBUbyh1bmRlZmluZWQpLFxuICApO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGRyYXdlcidzIHBvc2l0aW9uIGNoYW5nZXMuICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XG4gIEBPdXRwdXQoJ3Bvc2l0aW9uQ2hhbmdlZCcpIHJlYWRvbmx5IG9uUG9zaXRpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGlubmVyIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgdGhlIGNvbnRlbnQuICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKSBfY29udGVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIHRoZSBkcmF3ZXIgbW9kZSBjaGFuZ2VzLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGRyYXdlciBjb250YWluZXIgdG9cbiAgICogdG8ga25vdyB3aGVuIHRvIHdoZW4gdGhlIG1vZGUgY2hhbmdlcyBzbyBpdCBjYW4gYWRhcHQgdGhlIG1hcmdpbnMgb24gdGhlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBfbW9kZUNoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgX2ZvY3VzVHJhcEZhY3Rvcnk6IEZvY3VzVHJhcEZhY3RvcnksXG4gICAgcHJpdmF0ZSBfZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ludGVyYWN0aXZpdHlDaGVja2VyOiBJbnRlcmFjdGl2aXR5Q2hlY2tlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2M6IGFueSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EUkFXRVJfQ09OVEFJTkVSKSBwdWJsaWMgX2NvbnRhaW5lcj86IE1hdERyYXdlckNvbnRhaW5lcixcbiAgKSB7XG4gICAgdGhpcy5vcGVuZWRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKChvcGVuZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvYykge1xuICAgICAgICAgIHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkID0gdGhpcy5fZG9jLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFrZUZvY3VzKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzRm9jdXNXaXRoaW5EcmF3ZXIoKSkge1xuICAgICAgICB0aGlzLl9yZXN0b3JlRm9jdXModGhpcy5fb3BlbmVkVmlhIHx8ICdwcm9ncmFtJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gdG8gYGtleWRvd25gIGV2ZW50cyBvdXRzaWRlIHRoZSB6b25lIHNvIHRoYXQgY2hhbmdlIGRldGVjdGlvbiBpcyBub3QgcnVuIGV2ZXJ5XG4gICAgICogdGltZSBhIGtleSBpcyBwcmVzc2VkLiBJbnN0ZWFkIHdlIHJlLWVudGVyIHRoZSB6b25lIG9ubHkgaWYgdGhlIGBFU0NgIGtleSBpcyBwcmVzc2VkXG4gICAgICogYW5kIHdlIGRvbid0IGhhdmUgY2xvc2UgZGlzYWJsZWQuXG4gICAgICovXG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIChmcm9tRXZlbnQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAna2V5ZG93bicpIGFzIE9ic2VydmFibGU8S2V5Ym9hcmRFdmVudD4pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFICYmICF0aGlzLmRpc2FibGVDbG9zZSAmJiAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT5cbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgYSBTdWJqZWN0IHdpdGggZGlzdGluY3RVbnRpbENoYW5nZWQsIGJlY2F1c2UgdGhlIGBkb25lYCBldmVudFxuICAgIC8vIGZpcmVzIHR3aWNlIG9uIHNvbWUgYnJvd3NlcnMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yNDA4NFxuICAgIHRoaXMuX2FuaW1hdGlvbkVuZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh4LCB5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHguZnJvbVN0YXRlID09PSB5LmZyb21TdGF0ZSAmJiB4LnRvU3RhdGUgPT09IHkudG9TdGF0ZTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogQW5pbWF0aW9uRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qge2Zyb21TdGF0ZSwgdG9TdGF0ZX0gPSBldmVudDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRvU3RhdGUuaW5kZXhPZignb3BlbicpID09PSAwICYmIGZyb21TdGF0ZSA9PT0gJ3ZvaWQnKSB8fFxuICAgICAgICAgICh0b1N0YXRlID09PSAndm9pZCcgJiYgZnJvbVN0YXRlLmluZGV4T2YoJ29wZW4nKSA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5vcGVuZWRDaGFuZ2UuZW1pdCh0aGlzLl9vcGVuZWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBwcm92aWRlZCBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcyBub3QgZm9jdXNhYmxlLCBpdCB3aWxsIGFkZCBhIHRhYkluZGV4XG4gICAqIGF0dHJpYnV0ZSB0byBmb3JjZWZ1bGx5IGZvY3VzIGl0LiBUaGUgYXR0cmlidXRlIGlzIHJlbW92ZWQgYWZ0ZXIgZm9jdXMgaXMgbW92ZWQuXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGZvY3VzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZm9yY2VGb2N1cyhlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IEZvY3VzT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5faW50ZXJhY3Rpdml0eUNoZWNrZXIuaXNGb2N1c2FibGUoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQudGFiSW5kZXggPSAtMTtcbiAgICAgIC8vIFRoZSB0YWJpbmRleCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlbW92ZWQgdG8gYXZvaWQgbmF2aWdhdGluZyB0byB0aGF0IGVsZW1lbnQgYWdhaW5cbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGNhbGxiYWNrKTtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNhbGxiYWNrKTtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBjYWxsYmFjayk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsZW1lbnQuZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yIHdpdGhpbiB0aGUgZm9jdXMgdHJhcC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50IHRvIHNldCBmb2N1cyB0by5cbiAgICovXG4gIHByaXZhdGUgX2ZvY3VzQnlDc3NTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nLCBvcHRpb25zPzogRm9jdXNPcHRpb25zKSB7XG4gICAgbGV0IGVsZW1lbnRUb0ZvY3VzID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBzZWxlY3RvcixcbiAgICApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoZWxlbWVudFRvRm9jdXMpIHtcbiAgICAgIHRoaXMuX2ZvcmNlRm9jdXMoZWxlbWVudFRvRm9jdXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBmb2N1cyBpbnRvIHRoZSBkcmF3ZXIuIE5vdGUgdGhhdCB0aGlzIHdvcmtzIGV2ZW4gaWZcbiAgICogdGhlIGZvY3VzIHRyYXAgaXMgZGlzYWJsZWQgaW4gYHNpZGVgIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIF90YWtlRm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c1RyYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gV2hlbiBhdXRvRm9jdXMgaXMgbm90IG9uIHRoZSBzaWRlbmF2LCBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgZm9jdXNlZCBvciBkb2VzXG4gICAgLy8gbm90IGV4aXN0LCBmb2N1cyB0aGUgc2lkZW5hdiBpdHNlbGYgc28gdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gc3RpbGwgd29ya3MuXG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayB0aGF0IGBmb2N1c2AgaXMgYSBmdW5jdGlvbiBkdWUgdG8gVW5pdmVyc2FsLlxuICAgIHN3aXRjaCAodGhpcy5hdXRvRm9jdXMpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIHRydWU6XG4gICAgICBjYXNlICdmaXJzdC10YWJiYWJsZSc6XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYXNNb3ZlZEZvY3VzID0gdGhpcy5fZm9jdXNUcmFwIS5mb2N1c0luaXRpYWxFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAoIWhhc01vdmVkRm9jdXMgJiYgdHlwZW9mIGVsZW1lbnQuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge2luamVjdG9yOiB0aGlzLl9pbmplY3Rvcn0sXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmlyc3QtaGVhZGluZyc6XG4gICAgICAgIHRoaXMuX2ZvY3VzQnlDc3NTZWxlY3RvcignaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgW3JvbGU9XCJoZWFkaW5nXCJdJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fZm9jdXNCeUNzc1NlbGVjdG9yKHRoaXMuYXV0b0ZvY3VzISk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBmb2N1cyB0byB0aGUgZWxlbWVudCB0aGF0IHdhcyBvcmlnaW5hbGx5IGZvY3VzZWQgd2hlbiB0aGUgZHJhd2VyIG9wZW5lZC5cbiAgICogSWYgbm8gZWxlbWVudCB3YXMgZm9jdXNlZCBhdCB0aGF0IHRpbWUsIHRoZSBmb2N1cyB3aWxsIGJlIHJlc3RvcmVkIHRvIHRoZSBkcmF3ZXIuXG4gICAqL1xuICBwcml2YXRlIF9yZXN0b3JlRm9jdXMoZm9jdXNPcmlnaW46IEV4Y2x1ZGU8Rm9jdXNPcmlnaW4sIG51bGw+KSB7XG4gICAgaWYgKHRoaXMuYXV0b0ZvY3VzID09PSAnZGlhbG9nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURyYXdlcldhc09wZW5lZCkge1xuICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkLCBmb2N1c09yaWdpbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVEcmF3ZXJXYXNPcGVuZWQgPSBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgZm9jdXMgaXMgY3VycmVudGx5IHdpdGhpbiB0aGUgZHJhd2VyLiAqL1xuICBwcml2YXRlIF9pc0ZvY3VzV2l0aGluRHJhd2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gdGhpcy5fZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuICEhYWN0aXZlRWwgJiYgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9pc0F0dGFjaGVkID0gdHJ1ZTtcblxuICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBET00gcG9zaXRpb24gd2hlbiB0aGUgc2lkZW5hdiBpcyBwb3NpdGlvbmVkIGF0XG4gICAgLy8gdGhlIGVuZCBzaW5jZSB3ZSBwcm9qZWN0IHRoZSBzaWRlbmF2IGJlZm9yZSB0aGUgY29udGVudCBieSBkZWZhdWx0LlxuICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uSW5QYXJlbnQoJ2VuZCcpO1xuICAgIH1cblxuICAgIC8vIE5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgcG9zaXRpb24gaXMgdXBkYXRlZFxuICAgIC8vIHNvIHRoZSBmb2N1cyB0cmFwIGFuY2hvcnMgYXJlIGluIHRoZSByaWdodCBwbGFjZS5cbiAgICBpZiAodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICB0aGlzLl9mb2N1c1RyYXAgPSB0aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy5fdXBkYXRlRm9jdXNUcmFwU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgLy8gRW5hYmxlIHRoZSBhbmltYXRpb25zIGFmdGVyIHRoZSBsaWZlY3ljbGUgaG9va3MgaGF2ZSBydW4sIGluIG9yZGVyIHRvIGF2b2lkIGFuaW1hdGluZ1xuICAgIC8vIGRyYXdlcnMgdGhhdCBhcmUgb3BlbiBieSBkZWZhdWx0LiBXaGVuIHdlJ3JlIG9uIHRoZSBzZXJ2ZXIsIHdlIHNob3VsZG4ndCBlbmFibGUgdGhlXG4gICAgLy8gYW5pbWF0aW9ucywgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBkcmF3ZXIgdG8gYW5pbWF0ZSB0aGUgZmlyc3QgdGltZSB0aGUgdXNlciBzZWVzXG4gICAgLy8gdGhlIHBhZ2UuXG4gICAgaWYgKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgdGhpcy5fZW5hYmxlQW5pbWF0aW9ucyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZm9jdXNUcmFwPy5kZXN0cm95KCk7XG4gICAgdGhpcy5fYW5jaG9yPy5yZW1vdmUoKTtcbiAgICB0aGlzLl9hbmNob3IgPSBudWxsO1xuICAgIHRoaXMuX2FuaW1hdGlvblN0YXJ0ZWQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9hbmltYXRpb25FbmQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9tb2RlQ2hhbmdlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgZHJhd2VyLlxuICAgKiBAcGFyYW0gb3BlbmVkVmlhIFdoZXRoZXIgdGhlIGRyYXdlciB3YXMgb3BlbmVkIGJ5IGEga2V5IHByZXNzLCBtb3VzZSBjbGljayBvciBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBVc2VkIGZvciBmb2N1cyBtYW5hZ2VtZW50IGFmdGVyIHRoZSBzaWRlbmF2IGlzIGNsb3NlZC5cbiAgICovXG4gIG9wZW4ob3BlbmVkVmlhPzogRm9jdXNPcmlnaW4pOiBQcm9taXNlPE1hdERyYXdlclRvZ2dsZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZSh0cnVlLCBvcGVuZWRWaWEpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBkcmF3ZXIuICovXG4gIGNsb3NlKCk6IFByb21pc2U8TWF0RHJhd2VyVG9nZ2xlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlKGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBDbG9zZXMgdGhlIGRyYXdlciB3aXRoIGNvbnRleHQgdGhhdCB0aGUgYmFja2Ryb3Agd2FzIGNsaWNrZWQuICovXG4gIF9jbG9zZVZpYUJhY2tkcm9wQ2xpY2soKTogUHJvbWlzZTxNYXREcmF3ZXJUb2dnbGVSZXN1bHQ+IHtcbiAgICAvLyBJZiB0aGUgZHJhd2VyIGlzIGNsb3NlZCB1cG9uIGEgYmFja2Ryb3AgY2xpY2ssIHdlIGFsd2F5cyB3YW50IHRvIHJlc3RvcmUgZm9jdXMuIFdlXG4gICAgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayB3aGV0aGVyIGZvY3VzIGlzIGN1cnJlbnRseSBpbiB0aGUgZHJhd2VyLCBhcyBjbGlja2luZyBvbiB0aGVcbiAgICAvLyBiYWNrZHJvcCBjYXVzZXMgYmx1cnMgdGhlIGFjdGl2ZSBlbGVtZW50LlxuICAgIHJldHVybiB0aGlzLl9zZXRPcGVuKC8qIGlzT3BlbiAqLyBmYWxzZSwgLyogcmVzdG9yZUZvY3VzICovIHRydWUsICdtb3VzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGlzIGRyYXdlci5cbiAgICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBkcmF3ZXIgc2hvdWxkIGJlIG9wZW4uXG4gICAqIEBwYXJhbSBvcGVuZWRWaWEgV2hldGhlciB0aGUgZHJhd2VyIHdhcyBvcGVuZWQgYnkgYSBrZXkgcHJlc3MsIG1vdXNlIGNsaWNrIG9yIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqIFVzZWQgZm9yIGZvY3VzIG1hbmFnZW1lbnQgYWZ0ZXIgdGhlIHNpZGVuYXYgaXMgY2xvc2VkLlxuICAgKi9cbiAgdG9nZ2xlKGlzT3BlbjogYm9vbGVhbiA9ICF0aGlzLm9wZW5lZCwgb3BlbmVkVmlhPzogRm9jdXNPcmlnaW4pOiBQcm9taXNlPE1hdERyYXdlclRvZ2dsZVJlc3VsdD4ge1xuICAgIC8vIElmIHRoZSBmb2N1cyBpcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBkcmF3ZXIgY29udGVudCBhbmQgd2UgYXJlIGNsb3NpbmcgdGhlIGRyYXdlcixcbiAgICAvLyByZXN0b3JlIHRoZSBmb2N1cyB0byB0aGUgaW5pdGlhbGx5IGZvY3VzZWQgZWxlbWVudCAod2hlbiB0aGUgZHJhd2VyIG9wZW5lZCkuXG4gICAgaWYgKGlzT3BlbiAmJiBvcGVuZWRWaWEpIHtcbiAgICAgIHRoaXMuX29wZW5lZFZpYSA9IG9wZW5lZFZpYTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zZXRPcGVuKFxuICAgICAgaXNPcGVuLFxuICAgICAgLyogcmVzdG9yZUZvY3VzICovICFpc09wZW4gJiYgdGhpcy5faXNGb2N1c1dpdGhpbkRyYXdlcigpLFxuICAgICAgdGhpcy5fb3BlbmVkVmlhIHx8ICdwcm9ncmFtJyxcbiAgICApO1xuXG4gICAgaWYgKCFpc09wZW4pIHtcbiAgICAgIHRoaXMuX29wZW5lZFZpYSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBvcGVuZWQgc3RhdGUgb2YgdGhlIGRyYXdlci5cbiAgICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBkcmF3ZXIgc2hvdWxkIG9wZW4gb3IgY2xvc2UuXG4gICAqIEBwYXJhbSByZXN0b3JlRm9jdXMgV2hldGhlciBmb2N1cyBzaG91bGQgYmUgcmVzdG9yZWQgb24gY2xvc2UuXG4gICAqIEBwYXJhbSBmb2N1c09yaWdpbiBPcmlnaW4gdG8gdXNlIHdoZW4gcmVzdG9yaW5nIGZvY3VzLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0T3BlbihcbiAgICBpc09wZW46IGJvb2xlYW4sXG4gICAgcmVzdG9yZUZvY3VzOiBib29sZWFuLFxuICAgIGZvY3VzT3JpZ2luOiBFeGNsdWRlPEZvY3VzT3JpZ2luLCBudWxsPixcbiAgKTogUHJvbWlzZTxNYXREcmF3ZXJUb2dnbGVSZXN1bHQ+IHtcbiAgICB0aGlzLl9vcGVuZWQgPSBpc09wZW47XG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZSA9IHRoaXMuX2VuYWJsZUFuaW1hdGlvbnMgPyAnb3BlbicgOiAnb3Blbi1pbnN0YW50JztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uU3RhdGUgPSAndm9pZCc7XG4gICAgICBpZiAocmVzdG9yZUZvY3VzKSB7XG4gICAgICAgIHRoaXMuX3Jlc3RvcmVGb2N1cyhmb2N1c09yaWdpbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjbG9zaW5nIHNlcXVlbmNlIGZpcmVzIG9mZiBjb3JyZWN0bHkuXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5fdXBkYXRlRm9jdXNUcmFwU3RhdGUoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxNYXREcmF3ZXJUb2dnbGVSZXN1bHQ+KHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5vcGVuZWRDaGFuZ2UucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUob3BlbiA9PiByZXNvbHZlKG9wZW4gPyAnb3BlbicgOiAnY2xvc2UnKSk7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50ID8gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDAgOiAwO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGZvY3VzIHRyYXAuICovXG4gIHByaXZhdGUgX3VwZGF0ZUZvY3VzVHJhcFN0YXRlKCkge1xuICAgIGlmICh0aGlzLl9mb2N1c1RyYXApIHtcbiAgICAgIC8vIFRyYXAgZm9jdXMgb25seSBpZiB0aGUgYmFja2Ryb3AgaXMgZW5hYmxlZC4gT3RoZXJ3aXNlLCBhbGxvdyBlbmQgdXNlciB0byBpbnRlcmFjdCB3aXRoIHRoZVxuICAgICAgLy8gc2lkZW5hdiBjb250ZW50LlxuICAgICAgdGhpcy5fZm9jdXNUcmFwLmVuYWJsZWQgPSAhIXRoaXMuX2NvbnRhaW5lcj8uaGFzQmFja2Ryb3AgJiYgdGhpcy5vcGVuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmF3ZXIgaW4gdGhlIERPTS4gV2UgbmVlZCB0byBtb3ZlIHRoZSBlbGVtZW50IGFyb3VuZCBvdXJzZWx2ZXNcbiAgICogd2hlbiBpdCdzIGluIHRoZSBgZW5kYCBwb3NpdGlvbiBzbyB0aGF0IGl0IGNvbWVzIGFmdGVyIHRoZSBjb250ZW50IGFuZCB0aGUgdmlzdWFsIG9yZGVyXG4gICAqIG1hdGNoZXMgdGhlIHRhYiBvcmRlci4gV2UgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8gbW92ZSBpdCBiYWNrIHRvIGBzdGFydGAgaWYgdGhlIHNpZGVuYXZcbiAgICogc3RhcnRlZCBvZmYgYXMgYGVuZGAgYW5kIHdhcyBjaGFuZ2VkIHRvIGBzdGFydGAuXG4gICAqL1xuICBwcml2YXRlIF91cGRhdGVQb3NpdGlvbkluUGFyZW50KG5ld1Bvc2l0aW9uOiAnc3RhcnQnIHwgJ2VuZCcpOiB2b2lkIHtcbiAgICAvLyBEb24ndCBtb3ZlIHRoZSBET00gbm9kZSBhcm91bmQgb24gdGhlIHNlcnZlciwgYmVjYXVzZSBpdCBjYW4gdGhyb3cgb2ZmIGh5ZHJhdGlvbi5cbiAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlITtcblxuICAgIGlmIChuZXdQb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICAgIGlmICghdGhpcy5fYW5jaG9yKSB7XG4gICAgICAgIHRoaXMuX2FuY2hvciA9IHRoaXMuX2RvYy5jcmVhdGVDb21tZW50KCdtYXQtZHJhd2VyLWFuY2hvcicpITtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLl9hbmNob3IhLCBlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fYW5jaG9yKSB7XG4gICAgICB0aGlzLl9hbmNob3IucGFyZW50Tm9kZSEuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHRoaXMuX2FuY2hvcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYDxtYXQtZHJhd2VyLWNvbnRhaW5lcj5gIGNvbXBvbmVudC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwYXJlbnQgY29tcG9uZW50IHRvIG9uZSBvciB0d28gYDxtYXQtZHJhd2VyPmBzIHRoYXQgdmFsaWRhdGVzIHRoZSBzdGF0ZSBpbnRlcm5hbGx5XG4gKiBhbmQgY29vcmRpbmF0ZXMgdGhlIGJhY2tkcm9wIGFuZCBjb250ZW50IHN0eWxpbmcuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kcmF3ZXItY29udGFpbmVyJyxcbiAgZXhwb3J0QXM6ICdtYXREcmF3ZXJDb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJ2RyYXdlci1jb250YWluZXIuaHRtbCcsXG4gIHN0eWxlVXJsOiAnZHJhd2VyLmNzcycsXG4gIGhvc3Q6IHtcbiAgICAnY2xhc3MnOiAnbWF0LWRyYXdlci1jb250YWluZXInLFxuICAgICdbY2xhc3MubWF0LWRyYXdlci1jb250YWluZXItZXhwbGljaXQtYmFja2Ryb3BdJzogJ19iYWNrZHJvcE92ZXJyaWRlJyxcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1BVF9EUkFXRVJfQ09OVEFJTkVSLFxuICAgICAgdXNlRXhpc3Rpbmc6IE1hdERyYXdlckNvbnRhaW5lcixcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTWF0RHJhd2VyQ29udGVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdERyYXdlckNvbnRhaW5lciBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIERvQ2hlY2ssIE9uRGVzdHJveSB7XG4gIC8qKiBBbGwgZHJhd2VycyBpbiB0aGUgY29udGFpbmVyLiBJbmNsdWRlcyBkcmF3ZXJzIGZyb20gaW5zaWRlIG5lc3RlZCBjb250YWluZXJzLiAqL1xuICBAQ29udGVudENoaWxkcmVuKE1hdERyYXdlciwge1xuICAgIC8vIFdlIG5lZWQgdG8gdXNlIGBkZXNjZW5kYW50czogdHJ1ZWAsIGJlY2F1c2UgSXZ5IHdpbGwgbm8gbG9uZ2VyIG1hdGNoXG4gICAgLy8gaW5kaXJlY3QgZGVzY2VuZGFudHMgaWYgaXQncyBsZWZ0IGFzIGZhbHNlLlxuICAgIGRlc2NlbmRhbnRzOiB0cnVlLFxuICB9KVxuICBfYWxsRHJhd2VyczogUXVlcnlMaXN0PE1hdERyYXdlcj47XG5cbiAgLyoqIERyYXdlcnMgdGhhdCBiZWxvbmcgdG8gdGhpcyBjb250YWluZXIuICovXG4gIF9kcmF3ZXJzID0gbmV3IFF1ZXJ5TGlzdDxNYXREcmF3ZXI+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChNYXREcmF3ZXJDb250ZW50KSBfY29udGVudDogTWF0RHJhd2VyQ29udGVudDtcbiAgQFZpZXdDaGlsZChNYXREcmF3ZXJDb250ZW50KSBfdXNlckNvbnRlbnQ6IE1hdERyYXdlckNvbnRlbnQ7XG5cbiAgLyoqIFRoZSBkcmF3ZXIgY2hpbGQgd2l0aCB0aGUgYHN0YXJ0YCBwb3NpdGlvbi4gKi9cbiAgZ2V0IHN0YXJ0KCk6IE1hdERyYXdlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zdGFydDtcbiAgfVxuXG4gIC8qKiBUaGUgZHJhd2VyIGNoaWxkIHdpdGggdGhlIGBlbmRgIHBvc2l0aW9uLiAqL1xuICBnZXQgZW5kKCk6IE1hdERyYXdlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9lbmQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IHJlc2l6ZSB0aGUgY29udGFpbmVyIHdoZW5ldmVyXG4gICAqIHRoZSBzaXplIG9mIGFueSBvZiBpdHMgZHJhd2VycyBjaGFuZ2VzLlxuICAgKlxuICAgKiAqKlVzZSBhdCB5b3VyIG93biByaXNrISoqIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGNhbiBjYXVzZSBsYXlvdXQgdGhyYXNoaW5nIGJ5IG1lYXN1cmluZ1xuICAgKiB0aGUgZHJhd2VycyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLiBDYW4gYmUgY29uZmlndXJlZCBnbG9iYWxseSB2aWEgdGhlXG4gICAqIGBNQVRfRFJBV0VSX0RFRkFVTFRfQVVUT1NJWkVgIHRva2VuLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGF1dG9zaXplKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hdXRvc2l6ZTtcbiAgfVxuICBzZXQgYXV0b3NpemUodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2F1dG9zaXplID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9hdXRvc2l6ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZHJhd2VyIGNvbnRhaW5lciBzaG91bGQgaGF2ZSBhIGJhY2tkcm9wIHdoaWxlIG9uZSBvZiB0aGUgc2lkZW5hdnMgaXMgb3Blbi5cbiAgICogSWYgZXhwbGljaXRseSBzZXQgdG8gYHRydWVgLCB0aGUgYmFja2Ryb3Agd2lsbCBiZSBlbmFibGVkIGZvciBkcmF3ZXJzIGluIHRoZSBgc2lkZWBcbiAgICogbW9kZSBhcyB3ZWxsLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGhhc0JhY2tkcm9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kcmF3ZXJIYXNCYWNrZHJvcCh0aGlzLl9zdGFydCkgfHwgdGhpcy5fZHJhd2VySGFzQmFja2Ryb3AodGhpcy5fZW5kKTtcbiAgfVxuICBzZXQgaGFzQmFja2Ryb3AodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2JhY2tkcm9wT3ZlcnJpZGUgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2JhY2tkcm9wT3ZlcnJpZGU6IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGRyYXdlciBiYWNrZHJvcCBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgYmFja2Ryb3BDbGljazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBUaGUgZHJhd2VyIGF0IHRoZSBzdGFydC9lbmQgcG9zaXRpb24sIGluZGVwZW5kZW50IG9mIGRpcmVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfc3RhcnQ6IE1hdERyYXdlciB8IG51bGw7XG4gIHByaXZhdGUgX2VuZDogTWF0RHJhd2VyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGRyYXdlciBhdCB0aGUgbGVmdC9yaWdodC4gV2hlbiBkaXJlY3Rpb24gY2hhbmdlcywgdGhlc2Ugd2lsbCBjaGFuZ2UgYXMgd2VsbC5cbiAgICogVGhleSdyZSB1c2VkIGFzIGFsaWFzZXMgZm9yIHRoZSBhYm92ZSB0byBzZXQgdGhlIGxlZnQvcmlnaHQgc3R5bGUgcHJvcGVybHkuXG4gICAqIEluIExUUiwgX2xlZnQgPT0gX3N0YXJ0IGFuZCBfcmlnaHQgPT0gX2VuZC5cbiAgICogSW4gUlRMLCBfbGVmdCA9PSBfZW5kIGFuZCBfcmlnaHQgPT0gX3N0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbGVmdDogTWF0RHJhd2VyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfcmlnaHQ6IE1hdERyYXdlciB8IG51bGw7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXRzIG9uIGV2ZXJ5IG5nRG9DaGVjay4gVXNlZCBmb3IgZGVib3VuY2luZyByZWZsb3dzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb0NoZWNrU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIE1hcmdpbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgY29udGVudC4gVGhlc2UgYXJlIHVzZWQgdG8gcHVzaCAvIHNocmluayB0aGUgZHJhd2VyIGNvbnRlbnQgd2hlbiBhXG4gICAqIGRyYXdlciBpcyBvcGVuLiBXZSB1c2UgbWFyZ2luIHJhdGhlciB0aGFuIHRyYW5zZm9ybSBldmVuIGZvciBwdXNoIG1vZGUgYmVjYXVzZSB0cmFuc2Zvcm0gYnJlYWtzXG4gICAqIGZpeGVkIHBvc2l0aW9uIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgdHJhbnNmb3JtZWQgZWxlbWVudC5cbiAgICovXG4gIF9jb250ZW50TWFyZ2luczoge2xlZnQ6IG51bWJlciB8IG51bGw7IHJpZ2h0OiBudW1iZXIgfCBudWxsfSA9IHtsZWZ0OiBudWxsLCByaWdodDogbnVsbH07XG5cbiAgcmVhZG9ubHkgX2NvbnRlbnRNYXJnaW5DaGFuZ2VzID0gbmV3IFN1YmplY3Q8e2xlZnQ6IG51bWJlciB8IG51bGw7IHJpZ2h0OiBudW1iZXIgfCBudWxsfT4oKTtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBDZGtTY3JvbGxhYmxlIGluc3RhbmNlIHRoYXQgd3JhcHMgdGhlIHNjcm9sbGFibGUgY29udGVudC4gKi9cbiAgZ2V0IHNjcm9sbGFibGUoKTogQ2RrU2Nyb2xsYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJDb250ZW50IHx8IHRoaXMuX2NvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGlyOiBEaXJlY3Rpb25hbGl0eSxcbiAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICBASW5qZWN0KE1BVF9EUkFXRVJfREVGQVVMVF9BVVRPU0laRSkgZGVmYXVsdEF1dG9zaXplID0gZmFsc2UsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIHByaXZhdGUgX2FuaW1hdGlvbk1vZGU/OiBzdHJpbmcsXG4gICkge1xuICAgIC8vIElmIGEgYERpcmAgZGlyZWN0aXZlIGV4aXN0cyB1cCB0aGUgdHJlZSwgbGlzdGVuIGRpcmVjdGlvbiBjaGFuZ2VzXG4gICAgLy8gYW5kIHVwZGF0ZSB0aGUgbGVmdC9yaWdodCBwcm9wZXJ0aWVzIHRvIHBvaW50IHRvIHRoZSBwcm9wZXIgc3RhcnQvZW5kLlxuICAgIGlmIChfZGlyKSB7XG4gICAgICBfZGlyLmNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZURyYXdlcnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVDb250ZW50TWFyZ2lucygpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2luY2UgdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIHNpZGVuYXYgZGVwZW5kcyBvbiB0aGUgdmlld3BvcnQgd2lkdGgsXG4gICAgLy8gd2UgbmVlZCB0byByZWNvbXB1dGUgdGhlIG1hcmdpbnMgaWYgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgdmlld3BvcnRSdWxlclxuICAgICAgLmNoYW5nZSgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVDb250ZW50TWFyZ2lucygpKTtcblxuICAgIHRoaXMuX2F1dG9zaXplID0gZGVmYXVsdEF1dG9zaXplO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuX2FsbERyYXdlcnMuY2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuX2FsbERyYXdlcnMpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGRyYXdlcjogUXVlcnlMaXN0PE1hdERyYXdlcj4pID0+IHtcbiAgICAgICAgdGhpcy5fZHJhd2Vycy5yZXNldChkcmF3ZXIuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uX2NvbnRhaW5lciB8fCBpdGVtLl9jb250YWluZXIgPT09IHRoaXMpKTtcbiAgICAgICAgdGhpcy5fZHJhd2Vycy5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fZHJhd2Vycy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fdmFsaWRhdGVEcmF3ZXJzKCk7XG5cbiAgICAgIHRoaXMuX2RyYXdlcnMuZm9yRWFjaCgoZHJhd2VyOiBNYXREcmF3ZXIpID0+IHtcbiAgICAgICAgdGhpcy5fd2F0Y2hEcmF3ZXJUb2dnbGUoZHJhd2VyKTtcbiAgICAgICAgdGhpcy5fd2F0Y2hEcmF3ZXJQb3NpdGlvbihkcmF3ZXIpO1xuICAgICAgICB0aGlzLl93YXRjaERyYXdlck1vZGUoZHJhd2VyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLl9kcmF3ZXJzLmxlbmd0aCB8fFxuICAgICAgICB0aGlzLl9pc0RyYXdlck9wZW4odGhpcy5fc3RhcnQpIHx8XG4gICAgICAgIHRoaXMuX2lzRHJhd2VyT3Blbih0aGlzLl9lbmQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb250ZW50TWFyZ2lucygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIC8vIEF2b2lkIGhpdHRpbmcgdGhlIE5nWm9uZSB0aHJvdWdoIHRoZSBkZWJvdW5jZSB0aW1lb3V0LlxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLl9kb0NoZWNrU3ViamVjdFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTApLCAvLyBBcmJpdHJhcnkgZGVib3VuY2UgdGltZSwgbGVzcyB0aGFuIGEgZnJhbWUgYXQgNjBmcHNcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlQ29udGVudE1hcmdpbnMoKSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9jb250ZW50TWFyZ2luQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2RvQ2hlY2tTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZHJhd2Vycy5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBDYWxscyBgb3BlbmAgb2YgYm90aCBzdGFydCBhbmQgZW5kIGRyYXdlcnMgKi9cbiAgb3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLl9kcmF3ZXJzLmZvckVhY2goZHJhd2VyID0+IGRyYXdlci5vcGVuKCkpO1xuICB9XG5cbiAgLyoqIENhbGxzIGBjbG9zZWAgb2YgYm90aCBzdGFydCBhbmQgZW5kIGRyYXdlcnMgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fZHJhd2Vycy5mb3JFYWNoKGRyYXdlciA9PiBkcmF3ZXIuY2xvc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGVzIGFuZCB1cGRhdGVzIHRoZSBpbmxpbmUgc3R5bGVzIGZvciB0aGUgY29udGVudC4gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlIHVzZWRcbiAgICogc3BhcmluZ2x5LCBiZWNhdXNlIGl0IGNhdXNlcyBhIHJlZmxvdy5cbiAgICovXG4gIHVwZGF0ZUNvbnRlbnRNYXJnaW5zKCkge1xuICAgIC8vIDEuIEZvciBkcmF3ZXJzIGluIGBvdmVyYCBtb2RlLCB0aGV5IGRvbid0IGFmZmVjdCB0aGUgY29udGVudC5cbiAgICAvLyAyLiBGb3IgZHJhd2VycyBpbiBgc2lkZWAgbW9kZSB0aGV5IHNob3VsZCBzaHJpbmsgdGhlIGNvbnRlbnQuIFdlIGRvIHRoaXMgYnkgYWRkaW5nIHRvIHRoZVxuICAgIC8vICAgIGxlZnQgbWFyZ2luIChmb3IgbGVmdCBkcmF3ZXIpIG9yIHJpZ2h0IG1hcmdpbiAoZm9yIHJpZ2h0IHRoZSBkcmF3ZXIpLlxuICAgIC8vIDMuIEZvciBkcmF3ZXJzIGluIGBwdXNoYCBtb2RlIHRoZSBzaG91bGQgc2hpZnQgdGhlIGNvbnRlbnQgd2l0aG91dCByZXNpemluZyBpdC4gV2UgZG8gdGhpcyBieVxuICAgIC8vICAgIGFkZGluZyB0byB0aGUgbGVmdCBvciByaWdodCBtYXJnaW4gYW5kIHNpbXVsdGFuZW91c2x5IHN1YnRyYWN0aW5nIHRoZSBzYW1lIGFtb3VudCBvZlxuICAgIC8vICAgIG1hcmdpbiBmcm9tIHRoZSBvdGhlciBzaWRlLlxuICAgIGxldCBsZWZ0ID0gMDtcbiAgICBsZXQgcmlnaHQgPSAwO1xuXG4gICAgaWYgKHRoaXMuX2xlZnQgJiYgdGhpcy5fbGVmdC5vcGVuZWQpIHtcbiAgICAgIGlmICh0aGlzLl9sZWZ0Lm1vZGUgPT0gJ3NpZGUnKSB7XG4gICAgICAgIGxlZnQgKz0gdGhpcy5fbGVmdC5fZ2V0V2lkdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGVmdC5tb2RlID09ICdwdXNoJykge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2xlZnQuX2dldFdpZHRoKCk7XG4gICAgICAgIGxlZnQgKz0gd2lkdGg7XG4gICAgICAgIHJpZ2h0IC09IHdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yaWdodCAmJiB0aGlzLl9yaWdodC5vcGVuZWQpIHtcbiAgICAgIGlmICh0aGlzLl9yaWdodC5tb2RlID09ICdzaWRlJykge1xuICAgICAgICByaWdodCArPSB0aGlzLl9yaWdodC5fZ2V0V2lkdGgoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fcmlnaHQubW9kZSA9PSAncHVzaCcpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9yaWdodC5fZ2V0V2lkdGgoKTtcbiAgICAgICAgcmlnaHQgKz0gd2lkdGg7XG4gICAgICAgIGxlZnQgLT0gd2lkdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgZWl0aGVyIGByaWdodGAgb3IgYGxlZnRgIGlzIHplcm8sIGRvbid0IHNldCBhIHN0eWxlIHRvIHRoZSBlbGVtZW50LiBUaGlzXG4gICAgLy8gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgYSBjdXN0b20gc2l6ZSB2aWEgQ1NTIGNsYXNzIGluIFNTUiBzY2VuYXJpb3Mgd2hlcmUgdGhlXG4gICAgLy8gbWVhc3VyZWQgd2lkdGhzIHdpbGwgYWx3YXlzIGJlIHplcm8uIE5vdGUgdGhhdCB3ZSByZXNldCB0byBgbnVsbGAgaGVyZSwgcmF0aGVyXG4gICAgLy8gdGhhbiBiZWxvdywgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHR5cGVzIGluIHRoZSBgaWZgIGJlbG93IGFyZSBjb25zaXN0ZW50LlxuICAgIGxlZnQgPSBsZWZ0IHx8IG51bGwhO1xuICAgIHJpZ2h0ID0gcmlnaHQgfHwgbnVsbCE7XG5cbiAgICBpZiAobGVmdCAhPT0gdGhpcy5fY29udGVudE1hcmdpbnMubGVmdCB8fCByaWdodCAhPT0gdGhpcy5fY29udGVudE1hcmdpbnMucmlnaHQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnRNYXJnaW5zID0ge2xlZnQsIHJpZ2h0fTtcblxuICAgICAgLy8gUHVsbCBiYWNrIGludG8gdGhlIE5nWm9uZSBzaW5jZSBpbiBzb21lIGNhc2VzIHdlIGNvdWxkIGJlIG91dHNpZGUuIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gZG8gaXQgb25seSB3aGVuIHNvbWV0aGluZyBjaGFuZ2VkLCBvdGhlcndpc2Ugd2UgY2FuIGVuZCB1cCBoaXR0aW5nIHRoZSB6b25lIHRvbyBvZnRlbi5cbiAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5fY29udGVudE1hcmdpbkNoYW5nZXMubmV4dCh0aGlzLl9jb250ZW50TWFyZ2lucykpO1xuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICAvLyBJZiB1c2VycyBvcHRlZCBpbnRvIGF1dG9zaXppbmcsIGRvIGEgY2hlY2sgZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS5cbiAgICBpZiAodGhpcy5fYXV0b3NpemUgJiYgdGhpcy5faXNQdXNoZWQoKSkge1xuICAgICAgLy8gUnVuIG91dHNpZGUgdGhlIE5nWm9uZSwgb3RoZXJ3aXNlIHRoZSBkZWJvdW5jZXIgd2lsbCB0aHJvdyB1cyBpbnRvIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5fZG9DaGVja1N1YmplY3QubmV4dCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBkcmF3ZXIgZXZlbnRzIGluIG9yZGVyIHRvIHNldCBhIGNsYXNzIG9uIHRoZSBtYWluIGNvbnRhaW5lciBlbGVtZW50IHdoZW4gdGhlXG4gICAqIGRyYXdlciBpcyBvcGVuIGFuZCB0aGUgYmFja2Ryb3AgaXMgdmlzaWJsZS4gVGhpcyBlbnN1cmVzIGFueSBvdmVyZmxvdyBvbiB0aGUgY29udGFpbmVyIGVsZW1lbnRcbiAgICogaXMgcHJvcGVybHkgaGlkZGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfd2F0Y2hEcmF3ZXJUb2dnbGUoZHJhd2VyOiBNYXREcmF3ZXIpOiB2b2lkIHtcbiAgICBkcmF3ZXIuX2FuaW1hdGlvblN0YXJ0ZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50OiBBbmltYXRpb25FdmVudCkgPT4gZXZlbnQuZnJvbVN0YXRlICE9PSBldmVudC50b1N0YXRlKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2RyYXdlcnMuY2hhbmdlcyksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogQW5pbWF0aW9uRXZlbnQpID0+IHtcbiAgICAgICAgLy8gU2V0IHRoZSB0cmFuc2l0aW9uIGNsYXNzIG9uIHRoZSBjb250YWluZXIgc28gdGhhdCB0aGUgYW5pbWF0aW9ucyBvY2N1ci4gVGhpcyBzaG91bGQgbm90XG4gICAgICAgIC8vIGJlIHNldCBpbml0aWFsbHkgYmVjYXVzZSBhbmltYXRpb25zIHNob3VsZCBvbmx5IGJlIHRyaWdnZXJlZCB2aWEgYSBjaGFuZ2UgaW4gc3RhdGUuXG4gICAgICAgIGlmIChldmVudC50b1N0YXRlICE9PSAnb3Blbi1pbnN0YW50JyAmJiB0aGlzLl9hbmltYXRpb25Nb2RlICE9PSAnTm9vcEFuaW1hdGlvbnMnKSB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21hdC1kcmF3ZXItdHJhbnNpdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb250ZW50TWFyZ2lucygpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGRyYXdlci5tb2RlICE9PSAnc2lkZScpIHtcbiAgICAgIGRyYXdlci5vcGVuZWRDaGFuZ2VcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2RyYXdlcnMuY2hhbmdlcykpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fc2V0Q29udGFpbmVyQ2xhc3MoZHJhd2VyLm9wZW5lZCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIGRyYXdlciBvblBvc2l0aW9uQ2hhbmdlZCBldmVudCBpbiBvcmRlciB0b1xuICAgKiByZS12YWxpZGF0ZSBkcmF3ZXJzIHdoZW4gdGhlIHBvc2l0aW9uIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIF93YXRjaERyYXdlclBvc2l0aW9uKGRyYXdlcjogTWF0RHJhd2VyKTogdm9pZCB7XG4gICAgaWYgKCFkcmF3ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTk9URTogV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbWljcm90YXNrIHF1ZXVlIHRvIGJlIGVtcHR5IGJlZm9yZSB2YWxpZGF0aW5nLFxuICAgIC8vIHNpbmNlIGJvdGggZHJhd2VycyBtYXkgYmUgc3dhcHBpbmcgcG9zaXRpb25zIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgZHJhd2VyLm9uUG9zaXRpb25DaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuX2RyYXdlcnMuY2hhbmdlcykpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0ZURyYXdlcnMoKTtcbiAgICAgICAgfSxcbiAgICAgICAge2luamVjdG9yOiB0aGlzLl9pbmplY3RvciwgcGhhc2U6IEFmdGVyUmVuZGVyUGhhc2UuUmVhZH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN1YnNjcmliZXMgdG8gY2hhbmdlcyBpbiBkcmF3ZXIgbW9kZSBzbyB3ZSBjYW4gcnVuIGNoYW5nZSBkZXRlY3Rpb24uICovXG4gIHByaXZhdGUgX3dhdGNoRHJhd2VyTW9kZShkcmF3ZXI6IE1hdERyYXdlcik6IHZvaWQge1xuICAgIGlmIChkcmF3ZXIpIHtcbiAgICAgIGRyYXdlci5fbW9kZUNoYW5nZWRcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKG1lcmdlKHRoaXMuX2RyYXdlcnMuY2hhbmdlcywgdGhpcy5fZGVzdHJveWVkKSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudE1hcmdpbnMoKTtcbiAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRvZ2dsZXMgdGhlICdtYXQtZHJhd2VyLW9wZW5lZCcgY2xhc3Mgb24gdGhlIG1haW4gJ21hdC1kcmF3ZXItY29udGFpbmVyJyBlbGVtZW50LiAqL1xuICBwcml2YXRlIF9zZXRDb250YWluZXJDbGFzcyhpc0FkZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gJ21hdC1kcmF3ZXItY29udGFpbmVyLWhhcy1vcGVuJztcblxuICAgIGlmIChpc0FkZCkge1xuICAgICAgY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFZhbGlkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgZHJhd2VyIGNoaWxkcmVuIGNvbXBvbmVudHMuICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlRHJhd2VycygpIHtcbiAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCA9IG51bGw7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGF0IG1vc3Qgb25lIHN0YXJ0IGFuZCBvbmUgZW5kIGRyYXdlci5cbiAgICB0aGlzLl9kcmF3ZXJzLmZvckVhY2goZHJhd2VyID0+IHtcbiAgICAgIGlmIChkcmF3ZXIucG9zaXRpb24gPT0gJ2VuZCcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VuZCAhPSBudWxsICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICAgICAgdGhyb3dNYXREdXBsaWNhdGVkRHJhd2VyRXJyb3IoJ2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VuZCA9IGRyYXdlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGFydCAhPSBudWxsICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICAgICAgdGhyb3dNYXREdXBsaWNhdGVkRHJhd2VyRXJyb3IoJ3N0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhcnQgPSBkcmF3ZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9yaWdodCA9IHRoaXMuX2xlZnQgPSBudWxsO1xuXG4gICAgLy8gRGV0ZWN0IGlmIHdlJ3JlIExUUiBvciBSVEwuXG4gICAgaWYgKHRoaXMuX2RpciAmJiB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnKSB7XG4gICAgICB0aGlzLl9sZWZ0ID0gdGhpcy5fZW5kO1xuICAgICAgdGhpcy5fcmlnaHQgPSB0aGlzLl9zdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGVmdCA9IHRoaXMuX3N0YXJ0O1xuICAgICAgdGhpcy5fcmlnaHQgPSB0aGlzLl9lbmQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNvbnRhaW5lciBpcyBiZWluZyBwdXNoZWQgdG8gdGhlIHNpZGUgYnkgb25lIG9mIHRoZSBkcmF3ZXJzLiAqL1xuICBwcml2YXRlIF9pc1B1c2hlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuX2lzRHJhd2VyT3Blbih0aGlzLl9zdGFydCkgJiYgdGhpcy5fc3RhcnQubW9kZSAhPSAnb3ZlcicpIHx8XG4gICAgICAodGhpcy5faXNEcmF3ZXJPcGVuKHRoaXMuX2VuZCkgJiYgdGhpcy5fZW5kLm1vZGUgIT0gJ292ZXInKVxuICAgICk7XG4gIH1cblxuICBfb25CYWNrZHJvcENsaWNrZWQoKSB7XG4gICAgdGhpcy5iYWNrZHJvcENsaWNrLmVtaXQoKTtcbiAgICB0aGlzLl9jbG9zZU1vZGFsRHJhd2Vyc1ZpYUJhY2tkcm9wKCk7XG4gIH1cblxuICBfY2xvc2VNb2RhbERyYXdlcnNWaWFCYWNrZHJvcCgpIHtcbiAgICAvLyBDbG9zZSBhbGwgb3BlbiBkcmF3ZXJzIHdoZXJlIGNsb3NpbmcgaXMgbm90IGRpc2FibGVkIGFuZCB0aGUgbW9kZSBpcyBub3QgYHNpZGVgLlxuICAgIFt0aGlzLl9zdGFydCwgdGhpcy5fZW5kXVxuICAgICAgLmZpbHRlcihkcmF3ZXIgPT4gZHJhd2VyICYmICFkcmF3ZXIuZGlzYWJsZUNsb3NlICYmIHRoaXMuX2RyYXdlckhhc0JhY2tkcm9wKGRyYXdlcikpXG4gICAgICAuZm9yRWFjaChkcmF3ZXIgPT4gZHJhd2VyIS5fY2xvc2VWaWFCYWNrZHJvcENsaWNrKCkpO1xuICB9XG5cbiAgX2lzU2hvd2luZ0JhY2tkcm9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5faXNEcmF3ZXJPcGVuKHRoaXMuX3N0YXJ0KSAmJiB0aGlzLl9kcmF3ZXJIYXNCYWNrZHJvcCh0aGlzLl9zdGFydCkpIHx8XG4gICAgICAodGhpcy5faXNEcmF3ZXJPcGVuKHRoaXMuX2VuZCkgJiYgdGhpcy5fZHJhd2VySGFzQmFja2Ryb3AodGhpcy5fZW5kKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEcmF3ZXJPcGVuKGRyYXdlcjogTWF0RHJhd2VyIHwgbnVsbCk6IGRyYXdlciBpcyBNYXREcmF3ZXIge1xuICAgIHJldHVybiBkcmF3ZXIgIT0gbnVsbCAmJiBkcmF3ZXIub3BlbmVkO1xuICB9XG5cbiAgLy8gV2hldGhlciBhcmd1bWVudCBkcmF3ZXIgc2hvdWxkIGhhdmUgYSBiYWNrZHJvcCB3aGVuIGl0IG9wZW5zXG4gIHByaXZhdGUgX2RyYXdlckhhc0JhY2tkcm9wKGRyYXdlcjogTWF0RHJhd2VyIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLl9iYWNrZHJvcE92ZXJyaWRlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAhIWRyYXdlciAmJiBkcmF3ZXIubW9kZSAhPT0gJ3NpZGUnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9iYWNrZHJvcE92ZXJyaWRlO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibWF0LWRyYXdlci1pbm5lci1jb250YWluZXJcIiBjZGtTY3JvbGxhYmxlICNjb250ZW50PlxyXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuPC9kaXY+XHJcbiIsIkBpZiAoaGFzQmFja2Ryb3ApIHtcbiAgPGRpdiBjbGFzcz1cIm1hdC1kcmF3ZXItYmFja2Ryb3BcIiAoY2xpY2spPVwiX29uQmFja2Ryb3BDbGlja2VkKClcIlxuICAgICAgIFtjbGFzcy5tYXQtZHJhd2VyLXNob3duXT1cIl9pc1Nob3dpbmdCYWNrZHJvcCgpXCI+PC9kaXY+XG59XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1kcmF3ZXJcIj48L25nLWNvbnRlbnQ+XG5cbjxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1kcmF3ZXItY29udGVudFwiPlxuPC9uZy1jb250ZW50PlxuXG5AaWYgKCFfY29udGVudCkge1xuICA8bWF0LWRyYXdlci1jb250ZW50PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9tYXQtZHJhd2VyLWNvbnRlbnQ+XG59XG4iXX0=
|